diff --git a/.gitattributes b/.gitattributes index dfe07704..086f17af 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,43 @@ # Auto detect text files and perform LF normalization * text=auto + +# Shell scripts keep LF in the working tree as well as in the index. Left to +# `text=auto`, a Windows clone writes them with carriage returns, and the +# documented Linux path then dies inside the container in under a second: the +# shebang reads as the interpreter `bash\r`, which does not exist. Nothing about +# that failure names line endings, and the same clone builds and tests fine +# everywhere else, so it reads as a broken image rather than a broken checkout. +# +# A clone checked out before this rule keeps its carriage returns, because the +# blob is unchanged and git has no reason to rewrite the file. The one-line +# repair is in native/GameCult.Mesh.Quic.Native/README.md, beside the container +# path it unblocks. +*.sh text eol=lf + +# The committed CultMesh QUIC native binaries (cut 6, packaging) ride the +# deploy `git archive` as raw bytes. `* text=auto` already autodetects them as +# binary by content, but that autodetection is a heuristic; say so explicitly +# so no future text-processing rule (a diff driver, an export filter) can +# apply text conversion and poison the committed digests in SHA256SUMS. +packages/cultmesh-ts/native/**/*.dll binary +packages/cultmesh-ts/native/**/*.so binary +packages/cultmesh-ts/native/**/*.so.* binary + +# The digest list and manifest beside them keep LF on every checkout. Left to +# `text=auto`, a Windows clone writes them with carriage returns, and the +# documented `sha256sum -c SHA256SUMS` then fails on every line (each filename +# ends in `\r`) while CI, checking out on Linux, stays green. +packages/cultmesh-ts/native/SHA256SUMS text eol=lf +packages/cultmesh-ts/native/MANIFEST.txt text eol=lf + +# CultMath source keeps CRLF in the working tree on every checkout. The release +# gate compares the CultMath.dll it builds with the one org.gamecult.cultmath +# tracks, byte for byte, and the bytes follow the checkout's line endings: the +# pdb's document checksums feed the DLL's pdb id, timestamp and MVID. The +# tracked DLL was built from CRLF source, so CRLF here keeps it valid, and an +# LF-configured or Linux clone builds the same bytes as a Windows one. The index +# stays LF; only the checkout changes. +packages/cultmath/src/** text eol=crlf + +# Stores the Python typed-leaf tests write for the C# reference to open. +tests/vectors/**/*.cc binary diff --git a/.github/workflows/cultmesh-portability.yml b/.github/workflows/cultmesh-portability.yml index ce361fc8..086e54bd 100644 --- a/.github/workflows/cultmesh-portability.yml +++ b/.github/workflows/cultmesh-portability.yml @@ -95,3 +95,68 @@ jobs: dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj --filter FullyQualifiedName~Document_OneHundredThousandDistinctLeaseCyclesLeaveNoResourcesOrCallbacks --logger "console;verbosity=minimal" + + # The TypeScript side of the CultMesh authority rules. This job is the + # only one that runs on both Windows and Linux for main, codex/** and + # pull requests: cultnet-interop.yml is windows-latest and main-only, so + # until these steps existed the shared verifier's tests never ran on + # Linux at all, and the browser client's never ran in CI on any OS. + # packages/cultnet-ts verifies both vector files (content.test.ts judges both + # C# content files, the Rust one and its own); cultmesh-browser proves + # the browser client reads the shared rules rather than its own. + # No workflow ran cultcache-ts's tests, and its test script listed two files by hand while a third sat compiled + # and unrun. The wiring check fails when any TypeScript test file is run by no script, and the cache's own suite + # runs here beside the packages built on it. + - name: Check that every TypeScript test file is run by its package + run: node scripts/check-typescript-tests-wired.mjs + + - name: Verify the CultCache document owner with the TypeScript cache + run: npm run test --workspace packages/cultcache-ts + + - name: Verify the CultMesh authority rules with the TypeScript verifier + run: npm run test --workspace packages/cultnet-ts + + - name: Verify the browser client against the shared TypeScript verifier + run: npm run test --workspace packages/cultmesh-browser + + # The realtime frame codec and the HTTP content chunk provider (content.test.ts, + # its answers over node:http). The codec's byte parity rests on two vector files, + # contracts/cultmesh/realtime-frame-vectors.json written by the C# + # reference and decoded by this step, and realtime-frame-vectors.ts-written.json + # written by this codec and decoded by the C# step below. Neither half ran + # in CI on any OS until these two steps existed, so a codec that agreed + # only with itself would have gone green. + - name: Verify the realtime frame codec and the content provider with the TypeScript runtime + run: npm run test --workspace packages/cultmesh-ts + + # Both directions of the CultMesh authority vectors: the C#-written + # file (contracts/cultmesh/authority-route-vectors.json) and the + # TypeScript-signed file (authority-route-vectors.ts-signed.json) are + # verified by the C# reference here; the TypeScript side verifies both + # in the step above. CULTMESH_WRITE_VECTORS is never set in CI: the + # committed files are the contract. + - name: Verify the CultMesh authority vectors with the C# reference + run: >- + dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj + --filter FullyQualifiedName~AuthorityProof + --logger "console;verbosity=minimal" + + # The other half of the frame parity: the C# reference decodes and + # re-encodes the vector file the TypeScript codec wrote. A fixture + # authored on one side alone would only agree with itself. + - name: Verify the realtime frame vectors with the C# reference + run: >- + dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj + --filter FullyQualifiedName~RealtimeWireProtocol + --logger "console;verbosity=minimal" + + # The content plane: the reference writes the manifest and record-key + # vectors and judges the manifests the TypeScript packer wrote + # (content-vectors.ts-written.json). This suite also holds the C#/Rust + # content parity, which no CI step ran before this one. CULTNET_WRITE_VECTORS + # is never set in CI: the committed files are the contract. + - name: Verify the content vectors with the C# reference + run: >- + dotnet test tests/GameCult.Mesh.Tests/GameCult.Mesh.Tests.csproj + --filter FullyQualifiedName~CultMeshContentVectorTests + --logger "console;verbosity=minimal" diff --git a/.github/workflows/cultnet-interop.yml b/.github/workflows/cultnet-interop.yml index 6876a76a..9072e0cb 100644 --- a/.github/workflows/cultnet-interop.yml +++ b/.github/workflows/cultnet-interop.yml @@ -12,6 +12,13 @@ jobs: name: C# / TypeScript / Rust / Python / Kotlin runs-on: windows-latest timeout-minutes: 60 + # Windows runners default to pwsh, which does not stop when a native command fails: a + # multi-command step reported only its last command, and a failing cultnet-py suite + # went green that way. Git Bash runs as `bash -e -o pipefail`, so every command counts. + # Steps that name `shell: pwsh` check $LASTEXITCODE themselves. + defaults: + run: + shell: bash env: DOTNET: dotnet @@ -65,6 +72,36 @@ jobs: "KOTLIN_JAVA_HOME=$env:JAVA_HOME" | Out-File -FilePath $env:GITHUB_ENV -Append "$kotlinHome\bin" | Out-File -FilePath $env:GITHUB_PATH -Append + - name: Verify CultNet schema contracts stayed consolidated + shell: pwsh + run: | + $ErrorActionPreference = "Stop" + # packages/cultnet-rs/contracts/cultnet/ holds R-AB's vendored byte copies (the crate must build + # when copied alone). Their drift guard is packages/cultnet-rs/tests/schema_discovery_contracts.rs:74-99. + $tracked = git ls-files '*.schema.json' + if ($LASTEXITCODE -ne 0) { throw "git ls-files failed" } + $stray = $tracked | Where-Object { $_ -notmatch '^(packages/cultnet-rs/)?contracts/cultnet/' } + # -I skips binary files: unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.dll + # still embeds the retired namespace until it is rebuilt (REC-032 D4, deferred). + $oldNamespace = git grep -I -lE 'GameCult/cultnet-ts/(integration/)?contracts' -- ':!.voidbot' + if ($LASTEXITCODE -eq 2) { + throw "git grep failed" + } + if ($stray) { + Write-Host "Schema files found outside contracts/cultnet/:" + $stray | ForEach-Object { Write-Host " $_" } + } + if ($oldNamespace) { + Write-Host "Files still referencing the retired GameCult/cultnet-ts contracts namespace:" + $oldNamespace | ForEach-Object { Write-Host " $_" } + } + if ($stray -or $oldNamespace) { + throw "CultNet schema contracts drifted out of contracts/cultnet/ (REC-032). See CultLib/contracts/cultnet/ and rewrite any `$id back to https://github.com/GameCult/CultLib/contracts/cultnet/." + } + # git grep exits 1 when nothing matches, and the runner's pwsh wrapper + # ends the step with that $LASTEXITCODE; a clean tree must pass. + exit 0 + - name: Install Node dependencies run: npm install --no-package-lock diff --git a/.github/workflows/publish-packages.yml b/.github/workflows/publish-packages.yml index 6061ca7a..eb798bdf 100644 --- a/.github/workflows/publish-packages.yml +++ b/.github/workflows/publish-packages.yml @@ -10,8 +10,8 @@ name: Publish packages # # Tag a release to publish, for example `cultcache-ts-v0.13.6` or # `cultnet-py-v0.1.0`. The tag's version must match the version in the package -# manifest; the workflow refuses the publish otherwise rather than shipping a -# mislabelled artifact. +# manifest; scripts/release-after-suite.mjs refuses the release otherwise rather +# than shipping a mislabelled artifact. on: push: @@ -42,8 +42,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: + # fetch-depth: 0 so the semver check in the release step can see every previously + # published tag, not just the one that triggered this run. - name: Check out CultLib uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Node uses: actions/setup-node@v4 @@ -51,29 +55,30 @@ jobs: node-version: 24.x registry-url: https://registry.npmjs.org + # The release-checks suite, which Publish runs, needs .NET for the API gate. + - name: Set up .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + - name: Install workspace dependencies run: npm ci - - name: Verify the tag matches the manifest version - if: startsWith(github.ref, 'refs/tags/cultcache-ts-v') - run: | - manifest="$(node -p "require('./packages/cultcache-ts/package.json').version")" - tagged="${GITHUB_REF_NAME#cultcache-ts-v}" - if [ "$manifest" != "$tagged" ]; then - echo "tag $GITHUB_REF_NAME does not match manifest version $manifest" >&2 - exit 1 - fi - + # Manual runs publish nothing, so they build and test here. A tag run's + # Publish runs these tests itself. - name: Build and test + if: ${{ !startsWith(github.ref, 'refs/tags/') }} working-directory: packages/cultcache-ts run: npm test - # Scoped packages default to restricted even on public npm, and this is - # MIT like the rest of the repo, so say public explicitly. + # One process checks that the tag is the manifest version, runs the + # release-checks suite, the semver policy check (docs/semver-policy.md) + # and npm test, and only then runs npm publish --access public. Only + # npm publish receives the token. It starts without NODE_OPTIONS, so no + # preloaded module runs inside it. - name: Publish if: startsWith(github.ref, 'refs/tags/cultcache-ts-v') - working-directory: packages/cultcache-ts - run: npm publish --access public + run: env -u NODE_OPTIONS node scripts/release-after-suite.mjs npm-publish packages/cultcache-ts "$GITHUB_REF" env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} @@ -105,9 +110,13 @@ jobs: echo "run=false" >> "$GITHUB_OUTPUT" fi + # fetch-depth: 0 so the semver check in the release step can see every previously + # published tag, not just the one that triggered this run. - name: Check out CultLib if: steps.selected.outputs.run == 'true' uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Python if: steps.selected.outputs.run == 'true' @@ -115,29 +124,33 @@ jobs: with: python-version: "3.12" - - name: Verify the tag matches the manifest version - if: steps.selected.outputs.run == 'true' && startsWith(github.ref, 'refs/tags/') - run: | - manifest="$(python -c "import tomllib,pathlib;print(tomllib.loads(pathlib.Path('packages/${{ matrix.package }}/pyproject.toml').read_text())['project']['version'])")" - tagged="${GITHUB_REF_NAME#${{ matrix.package }}-v}" - if [ "$manifest" != "$tagged" ]; then - echo "tag $GITHUB_REF_NAME does not match manifest version $manifest" >&2 - exit 1 - fi + - name: Set up Node + if: steps.selected.outputs.run == 'true' + uses: actions/setup-node@v4 + with: + node-version: 24.x + + - name: Set up .NET + if: steps.selected.outputs.run == 'true' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x # Lower layers install from source so a release of one package is tested # against the sibling revision it was cut with, not whatever PyPI has. - - name: Install and test + - name: Install if: steps.selected.outputs.run == 'true' - run: | - python -m pip install -e packages/cultcache-py -e packages/cultnet-py -e packages/cultmesh-py - python -m unittest discover -s packages/${{ matrix.package }}/tests + run: python -m pip install --upgrade build -e packages/cultcache-py -e packages/cultnet-py -e packages/cultmesh-py + # One process checks, on a tag, that the tag is the manifest version, runs + # the release-checks suite, on a tag the semver policy check + # (docs/semver-policy.md), and the package's unit tests, and only then + # builds the sdist and wheel. Publish uploads only what this step built, + # so it has nothing to upload unless every check passed. It starts without + # NODE_OPTIONS, so no preloaded module runs inside it. - name: Build sdist and wheel if: steps.selected.outputs.run == 'true' - run: | - python -m pip install --upgrade build - python -m build packages/${{ matrix.package }} + run: env -u NODE_OPTIONS node scripts/release-after-suite.mjs python-build packages/${{ matrix.package }} "$GITHUB_REF" - name: Publish if: steps.selected.outputs.run == 'true' && startsWith(github.ref, 'refs/tags/') diff --git a/.github/workflows/quic-native.yml b/.github/workflows/quic-native.yml new file mode 100644 index 00000000..9b16cbeb --- /dev/null +++ b/.github/workflows/quic-native.yml @@ -0,0 +1,202 @@ +name: CultMesh QUIC native + +# Builds and, on a tag, releases the CultMesh QUIC native binaries that +# packages/cultmesh-ts/native/{win32-x64,linux-x64} commits (cut 6, +# docs/typescript-quic-realtime-cut.md:2108-2159). Under Q8 Option 1 the +# operator downloads a tagged run's Release assets, verifies every digest +# against this workflow's own logs and SHA256SUMS, and commits the bytes; +# nothing here writes to the tree. Under Q6 A, the Linux artifact comes only +# from the pinned debian:13 container below, never from a local or Yggdrasil +# build. + +on: + push: + branches: + - main + tags: + - "cultmesh-quic-native-v*" + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + # Push to main and pull_request run this job only: it proves the tree's + # committed bytes still match the manifest they shipped with. A tag push + # also runs it, alongside the two builds and the release. + verify-committed: + name: Verify committed binaries match SHA256SUMS + if: >- + github.event_name == 'pull_request' || + (github.event_name == 'push' && + (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/cultmesh-quic-native-v'))) + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Check out CultLib + uses: actions/checkout@v4 + + - name: sha256sum -c SHA256SUMS + run: | + set -euo pipefail + if [ ! -f packages/cultmesh-ts/native/SHA256SUMS ]; then + echo "packages/cultmesh-ts/native/SHA256SUMS is missing" >&2 + exit 1 + fi + cd packages/cultmesh-ts/native + sha256sum -c SHA256SUMS + + # workflow_dispatch and a cultmesh-quic-native-v* tag run the two builds. + # A dry (workflow_dispatch) run uploads artifacts and creates no release. + build-win32-x64: + name: Build win32-x64 + if: >- + github.event_name == 'workflow_dispatch' || + (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/cultmesh-quic-native-v')) + runs-on: windows-latest + timeout-minutes: 20 + steps: + - name: Check out CultLib + uses: actions/checkout@v4 + + - name: Build the native QUIC bridge + shell: pwsh + run: .\scripts\build-quic-native.ps1 -OutputDirectory artifacts\quic-native\win32-x64 + + - name: Print toolchain version and digests + shell: pwsh + run: | + $ErrorActionPreference = "Stop" + $compilerCmake = Get-ChildItem -Recurse -LiteralPath "artifacts\quic-native-build\x64\Release" -Filter "CMakeCXXCompiler.cmake" | + Select-Object -First 1 + if ($compilerCmake) { + Select-String -LiteralPath $compilerCmake.FullName -Pattern "CMAKE_CXX_COMPILER_VERSION" | + ForEach-Object { Write-Host $_.Line.Trim() } + } + Get-FileHash -Algorithm SHA256 artifacts\quic-native\win32-x64\gamecult_mesh_quic_native.dll + Get-FileHash -Algorithm SHA256 artifacts\quic-native\win32-x64\msquic.dll + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: quic-native-win32-x64 + path: artifacts/quic-native/win32-x64 + if-no-files-found: error + + build-linux-x64: + name: Build linux-x64 + if: >- + github.event_name == 'workflow_dispatch' || + (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/cultmesh-quic-native-v')) + runs-on: ubuntu-latest + # Q6 A: this pinned Debian 13 container is the only permitted Linux + # release builder. The digest is the pin; the `debian:13` tag is only a + # label. The artifact links against this image's glibc (2.41); a bare + # ubuntu-latest runner carries glibc 2.39, which is not the deploy host's + # OS (docs/typescript-quic-realtime-cut.md:2192-2197). + container: + image: debian:13@sha256:f324c7ff54321e8d9c588493a20244965938ce0aa50bbd1022d38010e9ffc4b1 + timeout-minutes: 20 + steps: + - name: Check out CultLib + uses: actions/checkout@v4 + + - name: Install build tools + run: | + set -euo pipefail + apt-get update + apt-get install -y --no-install-recommends cmake ninja-build g++ curl ca-certificates dpkg + + - name: Build the native QUIC bridge + run: ./scripts/build-quic-native.sh artifacts/quic-native/linux-x64 + + - name: Print toolchain version and digests + run: | + g++ --version + sha256sum artifacts/quic-native/linux-x64/libgamecult_mesh_quic_native.so + sha256sum artifacts/quic-native/linux-x64/libmsquic.so.2 + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: quic-native-linux-x64 + path: artifacts/quic-native/linux-x64 + if-no-files-found: error + + # Only this job has write permission, and only a tag push runs it. It + # attaches a draft MANIFEST.txt: the fields both build jobs cannot know + # (host names, MSVC version, the pinned dependency sources) are left for + # the operator to fill in from this run's own logs before committing the + # binaries, per 11.5's manifest paragraph. + release: + name: Release native binaries + needs: [build-win32-x64, build-linux-x64] + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/cultmesh-quic-native-v') + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + steps: + - name: Check out CultLib + uses: actions/checkout@v4 + + - name: Download win32-x64 artifact + uses: actions/download-artifact@v4 + with: + name: quic-native-win32-x64 + path: release/win32-x64 + + - name: Download linux-x64 artifact + uses: actions/download-artifact@v4 + with: + name: quic-native-linux-x64 + path: release/linux-x64 + + - name: Write SHA256SUMS and a draft MANIFEST.txt + run: | + set -euo pipefail + cd release + # Relative paths matching packages/cultmesh-ts/native/ exactly, so + # this file is the one the operator commits verbatim (11.5, 11.7). + sha256sum \ + win32-x64/gamecult_mesh_quic_native.dll \ + win32-x64/msquic.dll \ + linux-x64/libgamecult_mesh_quic_native.so \ + linux-x64/libmsquic.so.2 \ + > SHA256SUMS + cat > MANIFEST.txt <.v9 and resolves through both runtimes under that one rule. hashAlias is .v1 and is refused as unmatched by both - it is not a wire form either runtime's production call sites ever produce or accept, and it is kept in the fixture specifically to pin that neither runtime resolves it.", + "//references": "R-AF, 2026-09-23: a reference's `references[].targetKey` is the only thing a stored edge actually carries on the wire - GameCult.Caching.MessagePack.CultRecordRefFormatter serializes a CultRecordRef as a bare key string (probed: MessagePackSerializer.Serialize on a real Design field produced the single msgpack string 'a-eq', nothing else). This fixture used to also carry a `targetSchema` per reference; it was never anything but documentation - SelectionParityVectorTests.BuildDocument and cultnet-rs's build_row both read only targetKey to construct the edge - and it is removed rather than kept as a field the wire does not have. Resolving which row an edge names is by targetKey alone, filtered to the declared role's target leaves (D9); see citer_narrow below for the shared-key shape that rule is pinned against.", + "schemas": { + "leaf_a": { + "schemaId": "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff", + "nameAlias": "leaf_a.v9", + "hashAlias": "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff.v1", + "indexes": [ + { "name": "kind", "numeric": false }, + { "name": "mass", "numeric": true } + ] + }, + "leaf_b": { + "schemaId": "sha256:b1f2407d0227a79dcbffdf7ea317f827eec64be38a3f61b7d4e99e81e3b24b42", + "nameAlias": "leaf_b.v9", + "hashAlias": "sha256:b1f2407d0227a79dcbffdf7ea317f827eec64be38a3f61b7d4e99e81e3b24b42.v1", + "indexes": [ + { "name": "kind", "numeric": false }, + { "name": "mass", "numeric": true } + ] + }, + "citer": { + "schemaId": "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc", + "nameAlias": "citer.v9", + "hashAlias": "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc.v1", + "roles": [ + { "name": "Design", "targets": ["leaf_a", "leaf_b"] } + ] + }, + "citer_narrow": { + "//": "R-AF: a citer whose declared reference target is one leaf only (leaf_a), so a record key shared by a leaf_a row and a leaf_b row has exactly one candidate inside the declared target and exactly one outside it - the shape neither runtime's parity vectors covered before this cut (zero duplicate record keys across the original ten rows).", + "schemaId": "sha256:ee192f6526a8f8cdec7044551aa2c8e28c612426766bb270605023bc94e2614d", + "nameAlias": "citer_narrow.v9", + "hashAlias": "sha256:ee192f6526a8f8cdec7044551aa2c8e28c612426766bb270605023bc94e2614d.v1", + "roles": [ + { "name": "narrow_ref", "targets": ["leaf_a"] } + ] + } + }, + "rows": [ + { "schema": "leaf_a", "key": "a-lo", "ordinal": 1, "fields": { "kind": "weapon", "mass": "4" } }, + { "schema": "leaf_a", "key": "a-eq", "ordinal": 2, "fields": { "kind": "weapon", "mass": "5" } }, + { "schema": "leaf_b", "key": "b-hi", "ordinal": 3, "fields": { "kind": "armor", "mass": "6" } }, + { "schema": "leaf_a", "key": "shared-1", "ordinal": 4, "fields": { "kind": "shared", "mass": "1" } }, + { "schema": "leaf_b", "key": "shared-2", "ordinal": 5, "fields": { "kind": "shared", "mass": "1" } }, + { "schema": "leaf_a", "key": "shared-3", "ordinal": 6, "fields": { "kind": "shared", "mass": "1" } }, + { + "schema": "citer", + "key": "citer-1", + "ordinal": 7, + "references": [ { "role": "Design", "targetKey": "a-eq" } ] + }, + { + "//": "R-D: 2233759.25 is exactly representable as an f32 and sits on a round-to-even tie between two shortest-form spellings; its exact canonical decimal is 2233759.25 either way. kind=tie so no weapon/armor/shared case can sweep it up.", + "schema": "leaf_a", "key": "tie-mass", "ordinal": 8, "fields": { "kind": "tie", "mass": "2233759.25" } + }, + { + "//": "R-C: BMP private-use key (U+E000), same ordinal as the astral row below so the tiebreak - not the ordinal - decides order. kind=unicode, mass=0 so no unfiltered or mass>1 case reaches these.", + "schema": "leaf_a", "key": "-row", "ordinal": 9, "fields": { "kind": "unicode", "mass": "0" } + }, + { + "//": "R-C: astral key (U+1F602, encoded as a surrogate pair whose high half 0xD83D is less than 0xE000 - a UTF-16 code-unit compare sorts this first; code-point order sorts it after the BMP row above).", + "schema": "leaf_a", "key": "😂-row", "ordinal": 9, "fields": { "kind": "unicode", "mass": "0" } + }, + { + "//": "R-AF shape 1: the only row at this key is outside citer_narrow's declared target (leaf_a only) - resolving the edge below must refuse reference_outside_target in both runtimes, not silently accept an empty page. kind=narrow-fixture (not \"shared\") so this row never sweeps into shared_index_value_three_rows, which pins an exact count of 3.", + "schema": "leaf_b", "key": "narrow-only", "ordinal": 10, "fields": { "kind": "narrow-fixture", "mass": "1" } + }, + { + "//": "R-AF shape 2: two rows share this key, one inside citer_narrow's declared target and one outside it - resolving the edge below must accept, deterministically picking the leaf_a row, in both runtimes.", + "schema": "leaf_a", "key": "dup-key", "ordinal": 11, "fields": { "kind": "narrow-fixture", "mass": "1" } + }, + { + "schema": "leaf_b", "key": "dup-key", "ordinal": 12, "fields": { "kind": "narrow-fixture", "mass": "1" } + }, + { + "schema": "citer_narrow", + "key": "narrow-citer-refused", + "ordinal": 13, + "references": [ { "role": "narrow_ref", "targetKey": "narrow-only" } ] + }, + { + "schema": "citer_narrow", + "key": "narrow-citer-accepted", + "ordinal": 14, + "references": [ { "role": "narrow_ref", "targetKey": "dup-key" } ] + }, + { + "//": "R-AJ: a tied ordinal across two DIFFERENT schemas (leaf_a and leaf_b), not two rows of the same leaf like the astral/BMP pair above - the shape the row order's schemaId tiebreak needs and the original ten rows never had. Keys are anti-correlated with the real schema ids on purpose: leaf_b's real id sorts before leaf_a's (sha256:b1f2... < sha256:ff35...), so leaf_b gets the alphabetically-*later* key (\"zz-tie-schema\") and leaf_a gets the *earlier* one (\"aa-tie-schema\") - a schemaId-first order and a recordKey-first order disagree here on purpose, so only the correct composition produces leaf_b's row first.", + "schema": "leaf_b", "key": "zz-tie-schema", "ordinal": 15, "fields": { "kind": "tie-schema", "mass": "1" } + }, + { + "schema": "leaf_a", "key": "aa-tie-schema", "ordinal": 15, "fields": { "kind": "tie-schema", "mass": "1" } + }, + { + "//": "R-AO, 2026-09-23: 'dup-key' already carries two rows (leaf_a ordinal 11, leaf_b ordinal 12) - both are in citer's Design role's declared target ([leaf_a, leaf_b], unlike citer_narrow's narrow_ref above, which only ever had one in-target candidate at a shared key). This citer is the first row in this file (hence in both runtimes' row order) to name 'dup-key' through Design, so resolving it must deterministically pick the leaf_a row - the first in-target candidate in the caller's order - never the leaf_b row, in both runtimes.", + "schema": "citer", + "key": "citer-both-in-target", + "ordinal": 16, + "references": [ { "role": "Design", "targetKey": "dup-key" } ] + } + ] +} diff --git a/contracts/cultnet/interop/selection-vectors.rs-written.json b/contracts/cultnet/interop/selection-vectors.rs-written.json new file mode 100644 index 00000000..a9b635c4 --- /dev/null +++ b/contracts/cultnet/interop/selection-vectors.rs-written.json @@ -0,0 +1,282 @@ +{ + "vectors": [ + { + "name": "any_of_plus_ge_conjunction", + "selectionMessagePackBase64": "g6ZmaWVsZHOSg6VpbmRleKRraW5kom9wpmFueV9vZqZ2YWx1ZXORpndlYXBvboOlaW5kZXikbWFzc6JvcKJnZaZudW1iZXKhNapwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nwg==", + "asOf": 1, + "expectedIds": [ + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-eq" + ], + "matched": 1, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "descending_with_limit", + "selectionMessagePackBase64": "g6pwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nw6VsaW1pdAM=", + "asOf": 1, + "expectedIds": [ + "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-both-in-target", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/aa-tie-schema", + "sha256:b1f2407d0227a79dcbffdf7ea317f827eec64be38a3f61b7d4e99e81e3b24b42/zz-tie-schema" + ], + "matched": 18, + "hasNext": true, + "expectedEdges": [] + }, + { + "name": "gt_numeric_boundary", + "selectionMessagePackBase64": "g6ZmaWVsZHORg6VpbmRleKRtYXNzom9womd0pm51bWJlcqExqnByb2plY3Rpb26maGVhZGVyqmRlc2NlbmRpbmfC", + "asOf": 1, + "expectedIds": [ + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-lo", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-eq", + "sha256:b1f2407d0227a79dcbffdf7ea317f827eec64be38a3f61b7d4e99e81e3b24b42/b-hi", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/tie-mass" + ], + "matched": 4, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "incoming_exists_true", + "selectionMessagePackBase64": "hKdzY2hlbWFzkdlHc2hhMjU2OmZmMzVmM2Q5ZDZkZTNmMTA2NmI5MzY5ZTczZmU2Yzc2NDhlODgzNjhkMThlZmMyMjc1Yzk5NDczMGNkODRjZmalY2l0ZWSCpHJvbGWmRGVzaWdupmV4aXN0c8OqcHJvamVjdGlvbqZoZWFkZXKqZGVzY2VuZGluZ8I=", + "asOf": 1, + "expectedIds": [ + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-eq", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/dup-key" + ], + "matched": 2, + "hasNext": false, + "expectedEdges": [ + { + "fromId": "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-1", + "role": "Design", + "toId": "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-eq", + "payloadBase64": null + }, + { + "fromId": "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-both-in-target", + "role": "Design", + "toId": "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/dup-key", + "payloadBase64": null + } + ] + }, + { + "name": "incoming_negation", + "selectionMessagePackBase64": "hKdzY2hlbWFzkdlHc2hhMjU2OmZmMzVmM2Q5ZDZkZTNmMTA2NmI5MzY5ZTczZmU2Yzc2NDhlODgzNjhkMThlZmMyMjc1Yzk5NDczMGNkODRjZmalY2l0ZWSCpHJvbGWmRGVzaWdupmV4aXN0c8KqcHJvamVjdGlvbqZoZWFkZXKqZGVzY2VuZGluZ8I=", + "asOf": 1, + "expectedIds": [ + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-lo", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/shared-1", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/shared-3", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/tie-mass", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/-row", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/😂-row", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/aa-tie-schema" + ], + "matched": 7, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "shared_index_value_three_rows", + "selectionMessagePackBase64": "g6ZmaWVsZHORg6VpbmRleKRraW5kom9wpmFueV9vZqZ2YWx1ZXORpnNoYXJlZKpwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nwg==", + "asOf": 1, + "expectedIds": [ + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/shared-1", + "sha256:b1f2407d0227a79dcbffdf7ea317f827eec64be38a3f61b7d4e99e81e3b24b42/shared-2", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/shared-3" + ], + "matched": 3, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "hop_by_role_cites_exact_id", + "selectionMessagePackBase64": "hKRrZXlzkadjaXRlci0xpWNpdGVzgqZ0YXJnZXSCqHNjaGVtYUlk2UdzaGEyNTY6ZmYzNWYzZDlkNmRlM2YxMDY2YjkzNjllNzNmZTZjNzY0OGU4ODM2OGQxOGVmYzIyNzVjOTk0NzMwY2Q4NGNmZqlyZWNvcmRLZXmkYS1lcaRyb2xlpkRlc2lnbqpwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nwg==", + "asOf": 1, + "expectedIds": [ + "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-1" + ], + "matched": 1, + "hasNext": false, + "expectedEdges": [ + { + "fromId": "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-1", + "role": "Design", + "toId": "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-eq", + "payloadBase64": null + } + ] + }, + { + "name": "hop_by_role_cites_name_alias", + "selectionMessagePackBase64": "hKRrZXlzkadjaXRlci0xpWNpdGVzgqZ0YXJnZXSCqHNjaGVtYUlkqWxlYWZfYS52OalyZWNvcmRLZXmkYS1lcaRyb2xlpkRlc2lnbqpwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nwg==", + "asOf": 1, + "expectedIds": [ + "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-1" + ], + "matched": 1, + "hasNext": false, + "expectedEdges": [ + { + "fromId": "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-1", + "role": "Design", + "toId": "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-eq", + "payloadBase64": null + } + ] + }, + { + "name": "schemas_by_hash_alias", + "selectionMessagePackBase64": "g6dzY2hlbWFzkdlKc2hhMjU2OmZmMzVmM2Q5ZDZkZTNmMTA2NmI5MzY5ZTczZmU2Yzc2NDhlODgzNjhkMThlZmMyMjc1Yzk5NDczMGNkODRjZmYudjGqcHJvamVjdGlvbqZoZWFkZXKqZGVzY2VuZGluZ8I=", + "asOf": 1, + "expectedIds": [], + "matched": 0, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "schemas_by_name_alias", + "selectionMessagePackBase64": "g6dzY2hlbWFzkalsZWFmX2EudjmqcHJvamVjdGlvbqZoZWFkZXKqZGVzY2VuZGluZ8I=", + "asOf": 1, + "expectedIds": [ + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-lo", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/a-eq", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/shared-1", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/shared-3", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/tie-mass", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/-row", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/😂-row", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/dup-key", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/aa-tie-schema" + ], + "matched": 9, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "float_tie_exact_ge", + "selectionMessagePackBase64": "g6ZmaWVsZHORg6VpbmRleKRtYXNzom9womdlpm51bWJlcqoyMjMzNzU5LjI1qnByb2plY3Rpb26maGVhZGVyqmRlc2NlbmRpbmfC", + "asOf": 1, + "expectedIds": [ + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/tie-mass" + ], + "matched": 1, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "astral_key_code_point_order", + "selectionMessagePackBase64": "g6ZmaWVsZHORg6VpbmRleKRraW5kom9wpmFueV9vZqZ2YWx1ZXORp3VuaWNvZGWqcHJvamVjdGlvbqZoZWFkZXKqZGVzY2VuZGluZ8I=", + "asOf": 1, + "expectedIds": [ + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/-row", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/😂-row" + ], + "matched": 2, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "row_tiebreak_schema_id_before_record_key_at_tied_ordinal", + "selectionMessagePackBase64": "g6ZmaWVsZHORg6VpbmRleKRraW5kom9wpmFueV9vZqZ2YWx1ZXORqnRpZS1zY2hlbWGqcHJvamVjdGlvbqZoZWFkZXKqZGVzY2VuZGluZ8I=", + "asOf": 1, + "expectedIds": [ + "sha256:b1f2407d0227a79dcbffdf7ea317f827eec64be38a3f61b7d4e99e81e3b24b42/zz-tie-schema", + "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/aa-tie-schema" + ], + "matched": 2, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "shared_key_narrow_ref_resolves_leaf_within_target", + "selectionMessagePackBase64": "hKRrZXlzkbVuYXJyb3ctY2l0ZXItYWNjZXB0ZWSlY2l0ZXOCpnRhcmdldIKoc2NoZW1hSWTZR3NoYTI1NjpmZjM1ZjNkOWQ2ZGUzZjEwNjZiOTM2OWU3M2ZlNmM3NjQ4ZTg4MzY4ZDE4ZWZjMjI3NWM5OTQ3MzBjZDg0Y2ZmqXJlY29yZEtleadkdXAta2V5pHJvbGWqbmFycm93X3JlZqpwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nwg==", + "asOf": 1, + "expectedIds": [ + "sha256:ee192f6526a8f8cdec7044551aa2c8e28c612426766bb270605023bc94e2614d/narrow-citer-accepted" + ], + "matched": 1, + "hasNext": false, + "expectedEdges": [ + { + "fromId": "sha256:ee192f6526a8f8cdec7044551aa2c8e28c612426766bb270605023bc94e2614d/narrow-citer-accepted", + "role": "narrow_ref", + "toId": "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/dup-key", + "payloadBase64": null + } + ] + }, + { + "name": "shared_key_design_resolves_the_first_in_target_candidate_in_row_order", + "selectionMessagePackBase64": "hKRrZXlzkbRjaXRlci1ib3RoLWluLXRhcmdldKVjaXRlc4KmdGFyZ2V0gqhzY2hlbWFJZNlHc2hhMjU2OmZmMzVmM2Q5ZDZkZTNmMTA2NmI5MzY5ZTczZmU2Yzc2NDhlODgzNjhkMThlZmMyMjc1Yzk5NDczMGNkODRjZmapcmVjb3JkS2V5p2R1cC1rZXmkcm9sZaZEZXNpZ26qcHJvamVjdGlvbqZoZWFkZXKqZGVzY2VuZGluZ8I=", + "asOf": 1, + "expectedIds": [ + "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-both-in-target" + ], + "matched": 1, + "hasNext": false, + "expectedEdges": [ + { + "fromId": "sha256:9d0bc9aebc3619b07aabf564f98667afde41444c1b866661d777687d443608dc/citer-both-in-target", + "role": "Design", + "toId": "sha256:ff35f3d9d6de3f1066b9369e73fe6c7648e88368d18efc2275c994730cd84cff/dup-key", + "payloadBase64": null + } + ] + }, + { + "name": "refuses_empty_schemas_list", + "selectionMessagePackBase64": "g6dzY2hlbWFzkKpwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nwg==", + "asOf": 1, + "expectedRefusalField": "schemas", + "expectedIds": [], + "matched": 0, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "refuses_blank_key_entry", + "selectionMessagePackBase64": "g6RrZXlzkqRhLWVxoyAgIKpwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nwg==", + "asOf": 1, + "expectedRefusalField": "keys", + "expectedIds": [], + "matched": 0, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "refuses_unmatched_cites_target_schema", + "selectionMessagePackBase64": "g6VjaXRlc4KmdGFyZ2V0gqhzY2hlbWFJZLlzaGEyNTY6bm90LWEta25vd24tc2NoZW1hqXJlY29yZEtleaRhLWVxpHJvbGWmRGVzaWduqnByb2plY3Rpb26maGVhZGVyqmRlc2NlbmRpbmfC", + "asOf": 1, + "expectedRefusalField": "cites.target.schemaId", + "expectedIds": [], + "matched": 0, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "refuses_cites_target_by_hash_shaped_alias", + "selectionMessagePackBase64": "g6VjaXRlc4KmdGFyZ2V0gqhzY2hlbWFJZNlKc2hhMjU2OmZmMzVmM2Q5ZDZkZTNmMTA2NmI5MzY5ZTczZmU2Yzc2NDhlODgzNjhkMThlZmMyMjc1Yzk5NDczMGNkODRjZmYudjGpcmVjb3JkS2V5pGEtZXGkcm9sZaZEZXNpZ26qcHJvamVjdGlvbqZoZWFkZXKqZGVzY2VuZGluZ8I=", + "asOf": 1, + "expectedRefusalField": "cites.target.schemaId", + "expectedIds": [], + "matched": 0, + "hasNext": false, + "expectedEdges": [] + }, + { + "name": "shared_key_narrow_ref_refuses_when_only_candidate_is_outside_target", + "selectionMessagePackBase64": "hKRrZXlzkbRuYXJyb3ctY2l0ZXItcmVmdXNlZKVjaXRlc4KmdGFyZ2V0gqhzY2hlbWFJZNlHc2hhMjU2OmZmMzVmM2Q5ZDZkZTNmMTA2NmI5MzY5ZTczZmU2Yzc2NDhlODgzNjhkMThlZmMyMjc1Yzk5NDczMGNkODRjZmapcmVjb3JkS2V5q25hcnJvdy1vbmx5pHJvbGWqbmFycm93X3JlZqpwcm9qZWN0aW9upmhlYWRlcqpkZXNjZW5kaW5nwg==", + "asOf": 1, + "expectedEvaluationRefusal": "reference_outside_target", + "expectedIds": [], + "matched": 0, + "hasNext": false, + "expectedEdges": [] + } + ] +} \ No newline at end of file diff --git a/docs/cultcache-publication-cut.md b/docs/cultcache-publication-cut.md new file mode 100644 index 00000000..8a7cb2fc --- /dev/null +++ b/docs/cultcache-publication-cut.md @@ -0,0 +1,840 @@ +# CultCache publication: the cache owns "published once", and order stays data + +Status, 2026-09-29: Cuts 1-3 landed on `main`. Cut 3 merged at `ae8576d`. Imagination pass 4 re-took Cuts 4-6 +against `3bf1c0c`. Q-P5 is ruled (A). Cut 4 is ready for Hands. +- F4, pinning `Held`'s publish-on-throw guard, is done: Cut 3 pinned it. +- F3 (observer removal on unsubscribe) and F1 (the false "getters run once" claim for conditional commits on variant + stores) were Cut 3 follow-ups; confirm against the Cut 3 merge. + +Recorded: +- F2, the Q-P2 hazard. A rethrown observer exception makes a committed write look cancelled or refused. The + only live typed catch around a cache write is AetheriaEve `Aetheria.State.Daemon/Program.cs:3722`. It needs a + fail-fast handler, and no production code installs one. +- F5: subscribe and unsubscribe cost O(n). +- F6: writes after `Dispose` are dropped silently. + +Map written by Imagination pass 1, 2026-09-29. The ends are the +operator ruling of 2026-09-30: every committed cache change reaches subscribers +exactly once. This document owns the means. + +- **Body.** CultLib `main` `65311c9ad770828adafe40c2c14b2d3da517628e`. Every + `file:line` is against it unless it names the branch. +- **Superseded attempt.** `origin/hands/cultnet-publish-commits`, tip + `28248eb`, base `f9f107a`. Soul pass 3 said do not merge it, and that stands. + - Main has not touched `CultCache.cs`, `CultNetDatabase.cs`, the composition + doc or the networking tests since `f9f107a`: `git diff --stat` is empty. + - `git merge-tree 65311c9 28248eb` is clean. +- **Scope.** The C# cache's publication and CultNetDatabase's use of it. There + is no wire-format change and no other runtime changes (§6). + + +## Rulings (operator, 2026-09-30) + +- **Q-P1 A: order as data.** Each change is published exactly once, on its writer's thread, before the write + returns, and carries its `Sequence`. The shard log is written in cache order by the gate-held journal. Wire + peers drop changes that are stale by `Sequence`. The turnstile (`bcae483`/`4562340`) and the drainer are + both rejected. +- **Q-P2 A:** a throwing observer does not stop the others. Every observer runs, the exception is rethrown to + the writer afterwards, and the observer stays subscribed. The commit stands. +- **Q-P3 A:** a public `CultCache.AddJournal(...)`, with reentry guarded. +- **Q-P4 A:** Cut 6, which drops stale changes per key on the wire, lands in this campaign. +- **Q-P5 A (2026-09-29):** a primary that cannot log a committed change throws a typed `CultNetShardLogException` + naming the shard and the burned sequence, after publication, not derived from `InvalidOperationException`. + +## The finding that shapes this map + +The direction Imagination was handed was: "ordered delivery belongs in the +cache's own publication, on the writer's thread, so a writer delivers its own +changes before returning". That design **has been built before, and it was +deleted**. + +- `bcae483` (2026-09-13 20:09) made the cache a delivery scheduler: tickets, a + delivery gate, turn waits and per-thread queues for reentrant writes. +- `4562340`, 34 minutes later, deleted it: "It deadlocked inside CultLib: a + load's delivery reaching a CultNetDatabaseSubscriptionServer observer that + needs _lifecycleGate, while a subscribe's demand handler holding that gate + writes the cache and waits for the delivery's turn." +- It replaced it with **order as data**: a per-cache `Sequence`, and no + delivery scheduler. +- The regression tests it left, `ObserverWritingTheSameCacheDoesNotWaitOnOtherDeliveries` + (`ConditionalCommitTests.cs:763`) and + `SubscriptionDemandHandlerWritingCacheDuringDeliveryDoesNotDeadlock` + (`NetworkingTests.cs:2244`), are live on main. + +This pass rebuilt that scheduler as a prototype. It is the per-cache turnstile +with same-thread trampolining at `79f4639`, and it reproduces the deletion: + +- Caching tests: 278 of 279 pass, and `ObserverWritingTheSameCacheDoesNotWaitOnOtherDeliveries` + fails. +- The networking suite hangs, and Yggdrasil's idle watchdog killed it at 900 s. + The blame-hang run that names the hung test is recorded below. + +The reason is structural, not an implementation slip. Once a writer waits for +another thread's delivery, any lock that an observer takes and a writer holds +becomes a deadlock: + +- total cross-thread order; +- a writer delivering before it returns; +- no writer waiting on another thread. + +Pick two. The branch's drainer chose order plus no-wait, and lost +before-return (F3 and F4). The turnstile chose order plus before-return, and +lost no-wait (the `bcae483` deadlock). + +**So this map keeps order as data (the `4562340` ruling) and moves the one +order-sensitive consumer, the CultNet mutation log, to the place order is +decided: under the cache gate.** + +- Every writer keeps delivering its own changes, on its own thread, before it + returns, exactly as main does. F3 is satisfied by not regressing it. +- The log becomes a **journal** written in the admitting hold, in Sequence + order. +- The reorder buffer and drainer die, and no scheduler replaces them. This + departs from Soul's stated direction on purpose, and **Q-P1** puts it to the + operator. + +## Probe evidence + +All of this ran on Yggdrasil via `ygg-verify.sh`, from scratch commits in a +throwaway worktree that no branch holds. + +- Probe file: `tests/GameCult.Caching.Tests/PublicationProbeTests.cs` in scratch commit `79f4639`. The worktree has been removed. The commit is unreferenced in the local object store, where gc can collect it; it also survives on the Yggdrasil mirror as `refs/verify/79f4639f8f5b95db7ce16f244a081c1ec101a468`. +- `9c5abf5` is the probes on main. `79f4639` is the same probes plus the + turnstile prototype in `CultCache.cs`. + +| # | Probe | main `65311c9` | Turnstile prototype `79f4639` | +|---|---|---|---| +| Q1 | A batch `{ok, boom}` where boom's `[CultName]` getter throws | `TargetInvocationException`. `_sequence` goes from 0 to 1, because ok was minted. **Both ok and boom are in memory**, and `GetByName("ok")` finds ok. **Nothing is published**, and the next write gets Sequence 2. F1 is worse than stated: memory is corrupt and unpublished. In a store-backed cache, `land` (`:2325`) already ran, so the store holds it too. | No stall, but memory is still corrupt. | +| Q2 | Two `Watch` observers, the first throws | With the default R3 handler, the second observer sees 2 of 2 and the writer sees nothing. **With a rethrowing handler, the second observer sees 0 of 2 and every writer gets the exception.** The comment at `CultCache.cs:2374`, "OnNext does not throw", is false under fail-fast. | With its own observer array and a per-observer catch, the second observer sees 2 of 2 and the writer gets the exception afterwards. | +| Q3 | Writer A's observer blocks on `a`, then B writes `b` | The recorder sees `b(2)` before `a(1)`. There is no cross-thread order, by design since `4562340`. | Sees `a` then `b`, because B waited for A. | +| Q4 | An observer on `x` writes `y` | `y(2)` before `x(1)`: nested, depth-first, and the nested write returns after `y` is published. | `x` then `y`, and the nested write returns before `y` is published. | +| Q5 | `OnUpdate` on Upsert and on Commit | 0 fires, so loads only. `Watch` sees 2. | Unchanged. | +| Q6 | 8 threads × 1000 writes, plus reentrant writes | 67 ms, 2645 of 8800 cross-thread inversions, and 0 writes returned undelivered. | 516 ms, 0 inversions, 0 undelivered. | +| Q7 | Soul's P2 shape: a handler waits 1 s for another thread's write | Observed in time. | Not observed in time. | +| Suites | Caching, Networking and Mesh | (green on main) | Caching fails `ObserverWritingTheSameCacheDoesNotWaitOnOtherDeliveries`, and Networking **hangs** until the 900 s idle kill. Rerun with `--blame-hang-timeout 90s`: 286 passed, then the test host hung and was dumped. The blame sequence file was not extracted, so **the hung test is not named**. It is consistent with, but not proven to be, `SubscriptionDemandHandlerWritingCacheDuringDeliveryDoesNotDeadlock`, whose own comment says "disposal would hang too". | + +## Imagination pass 4: Cut 4 re-taken on the landed journal + +Cut 3 landed at `ae8576d`. Its Soul left two questions that Cut 4 had to settle before relying on the +journal: (a) what a throwing journal means for the log, and (b) whether a journal needs the change's origin. +Both have one coherent answer. The one fork, Q-P5, was about who hears of a log failure; the operator ruled it A (2026-09-29). + +### Probe evidence (pass 4) + +- Probe file: `Pub4ProbeTests.cs` (Networking tests). It was run on Yggdrasil from scratch commits: + - `0d7397d`: main plus the probes; + - `6ec2f73`: the same, merged with the branch `28248eb`; + - `376cd74`: main plus probe C. +- The commits survive on the Yggdrasil mirror. The scratch worktree is gone. +- The probes report facts and assert nothing. `FlakyLogStore` is an in-memory `ICultNetShardMutationLogStore` + that can refuse `Append` or run a hook inside `GetCompactedThrough`. + +| # | Probe | main `3bf1c0c` | branch `28248eb` (queue) | +|---|---|---|---| +| A1 | Primary with a durable log. Put 1, Put 2 (its `Append` throws), Put 3. A replica pulls, then retries. | Writer gets `IOException`. The cache holds 1, 2 and 3, but **2 is never published** (2 of 3). Memory log `[1,2,3]`, durable `[1,3]`. The replica pull throws "log has a gap. Expected 2, received 3", and so does **every retry**: the replica is stuck for good. | **Writer sees nothing**: R3 swallowed the drainer's exception. 2 is not published. The replica is stuck in the same way. | +| A2 | The same failure at the tail, then the primary restarts over the same cache and log store. | The replica applied 1. After restart, note 3 is **minted sequence 2**. The replica takes it, reports applied 2, and holds `1,3` against the primary's `1,2,3`: **silent divergence**, a reused sequence. | Same. | +| A3 | A replica whose log `Append` throws once. | The pull throws and the cursor stays at 0. The retry converges (`1,2`), but the memory log is `[1,1,2]`: a duplicate, because memory is written before disk and kept as a `List`. | The pull "succeeds": the exception was swallowed and the cursor went to 2. The durable log is `[2]`, so **entry 1 is lost**, and a chained replica sees a gap. | +| B1 | Primary with a file store. Another writer puts `pulled` into the file, the primary runs `PullAll`, and a replica pulls the log. | `pulled` is published but **not logged**. The replica gets nothing. | Logged. The replica converges on `pulled`. | +| B2 | A store attached after the database exists. | Nothing is logged. | All three hydrated records are logged. | +| S | `CreateShardSnapshotResponse` with a write landing between its document read and its sequence read (hooked in `GetCompactedThrough`). | The snapshot holds `[1]` at log sequence 2. The replica applies it and pulls, and still lacks 2: **divergence**. | Same. | +| C | Compact through 2, restart, then Put 3. | Note 3 is **minted sequence 1**, and `GetLatestMutationLogSequence` returns 1, below the floor of 2. | (not run; the code is unchanged) | + +What the probes establish: +- A1, A2, S and C are pre-existing defects on main. Cut 4 inherits them and must not build on them: the + resync path it relies on for (a) is itself broken by S and C. +- On a replica, the pull loop already retries. The cursor advances only after an entry applies + (`CultNetDatabase.cs:1038-1083`), so a replica needs no new mechanism. It needs only to keep the exception + reaching that loop, which the branch's queue broke (A3). +- Loads on a primary must be logged, or replicas diverge (B1). + +### (a) A journal that cannot log a committed change: one answer + +The facts: +- The log store is a second durable store written after the cache's store. Without an atomic commit across + the two, the log can lag the store. It must never lead: a replica would then apply a change the primary + refused. +- So lag is unavoidable, and it has to be detectable and repaired. +- The protocol already has a repair, and nothing else needs to be invented. + - "History the primary cannot serve" is `compacted_history`: `CultNetDatabaseServer.cs:189-201` answers + `ResyncRequired`. + - `CultNetShardReplication.cs:199-214` then snapshot-resyncs. + +**Rule: a primary that cannot log a committed change burns that change's sequence and compacts through it.** + +- In the database journal, on a primary, for each change that is not `NoLog`: + 1. Mint `S`. + 2. Build the entry: the wire message from the door, or `ToLogEntryMessage`. + 3. `Append` durably, **then** record it in memory. Disk goes first, so memory never serves what disk lacks. +- If step 2 or 3 throws: + - record nothing; + - raise the database's in-memory floor for the shard to `S`; + - try `store.CompactThrough(shard, S)`; + - still set `_lastWriteSequence` to `S`, because the row was written at `S`; + - carry on with the rest of the admission; + - throw `CultNetShardLogException` once at the end of the journal call (Q-P5 A). +- Every replica behind `S` is then told `compacted_history` and resyncs by snapshot. The sequence gap at `S` + is never served, because the floor covers it. +- This **replaces** the old §4 step 3 claim, "a serialization failure then mints nothing, so the log can never + hold a gap". Minting nothing hides a replication gap behind a dense sequence. That is exactly A2's silent + divergence. +- **Replica:** there is no floor. The journal's exception reaches `ApplyShardLogResponseAsync` and the cursor + does not advance. The next pull re-applies the entry: a fresh instance, so the door matches again, and the + entry is re-recorded under the primary's sequence. The branch's absent-key direct log follows the same + disk-first order. +- **Required fixes** that the rule depends on, all in Cut 4: + - `GetCompactedMutationLogSequence` (`CultNetDatabase.cs:597-602`) returns + `max(store floor, in-memory floor)`. + - `InitializeLogSequencesFromStore` (`:1363-1395`) resumes at + `max(highest retained, store.GetCompactedThrough(shard)) + 1`. This is probe C. + - `GetLatestMutationLogSequence` (`:607-616`) never reports below the floor. + - `CreateShardSnapshotResponse` (`:624-670`) reads `GetLatestMutationLogSequence` **before** `SelectAll`, on + both returns, `:645` and `:668`. The documents then reflect at least that sequence, and replaying later + entries converges: they are whole-document puts and deletes, applied in order. This is probe S. + - `RecordMutationLogEntry` (`:1331-1352`) writes disk first. The in-memory log becomes + `SortedList` per shard, replacing by sequence as the durable store does. This fixes A3's + duplicate. +- **Residual, recorded rather than forked.** Suppose the store refuses both `Append` and `CompactThrough`, and + then the process restarts. + - The durable log does not know about the hole, so A2's tail reuse can recur. + - Fixing that needs a durable write per mint, a sequence reservation, which doubles log I/O under the gate. + - The thrown exception names both failures, so the outage is loud. + - Refusing later writes ("fail closed") is not coherent. The database can refuse only its own doors, while + bare cache writes are journaled regardless: that would be split authority. + +### (b) A pulled or loaded change on a primary: no origin needed + +- On a primary the log is the shard's **state history**, whoever wrote the state. B1 shows that leaving loads + out of the log leaves replicas permanently diverged. +- The only origins that change what is logged are already carried by the door table, keyed by instance + identity and matched by shape. They are: + - `Replica` (log the primary's entry); + - `NoLog` (prediction, snapshot resync); + - `Put`/`Delete` (the wire message); + - `Predicts`/`Authoritative`. +- A load or pull has no door, so on a primary it is logged like any unattributed commit. On a replica it logs + nothing, like any local write. That is what the branch does, and B1 converges under it. +- Cost: + - B2: a store attached **after** the database logs its hydration. + - `CultNetHost` opens the cache before building the database (`CultNetLocal.cs:146-152`), so production + hydration is not journaled. + - A re-pull admits only the records that changed. In B1 the seed was not re-logged. +- `AddJournal` keeps its signature. If a future consumer (audit, say) needs "load or commit", the fact goes on + `CultCacheDocumentChange` as an additive property, as `Sequence` did. The cache already knows it: `Admit`'s + `source != null` at `CultCache.cs:2420`. It never needs a new `AddJournal` shape. +- This is recorded, not forked: no consumer needs it today. + +### The two recorded hazards, settled for Cut 4 + +- **Q-P2 typed-exception hazard.** Cut 4 makes it frequent. Every cache write on a primary with a durable log + now does log I/O inside its admission. + - AetheriaEve opts into durable logs (`Aetheria.State/AetheriaStateNode.cs:144`). + - Its `AetheriaHangarCommandJournal.ValidateAsync` writes an envelope (`Program.cs:6509`) inside the `catch + (InvalidOperationException)` at `Program.cs:3722`. + - A log failure surfacing as `InvalidOperationException` would therefore produce a "denied" receipt for a + committed envelope. + - Q-P5 A (ruled): the writer gets a typed `CultNetShardLogException` that **does not derive from + `InvalidOperationException`**. +- **Journal deadlock (the Cut 3 note).** The database journal waits only on `_logGate` and on the log store's + own lock. + - Lock order: cache gate, then `_logGate`, then the log store's lock. + - Invariant: **no code holding `_logGate` calls the cache, and no log store calls the cache or waits on a + thread that does.** + - Readers that take `_logGate` read only log state: `GetMutationLog`, `LastWriteSequence`, `CurrentAsOf`. + Readers already inside a cache read, such as the selection evaluator's `ordinalOf`, nest `_logGate` under + the cache gate, which is the same order. + - The store rule goes into the `ICultNetShardMutationLogStore` XML doc (`CultNetShardMutationLogStorage.cs:13-34`), + because a user store runs under the cache's gate. + - A log store that writes the cache already throws, through Cut 3's guard. Cut 4 pins it with a test. + +## Authority map + +- **Owner.** `CultCache`. The hold that mints a Sequence range also: + 1. journals the range under the gate, in Sequence order (new); + 2. publishes the range to every observer, isolated, on the minting writer's + thread, after it releases the gate and before it returns (main's model, + now isolated). + + Nothing waits on another call's delivery. +- **Inputs.** + - The changes returned by `Apply` (`CultCache.cs:2707`), the single mutation + site. + - The pre-mint projection of names and indexes (Cut 1). + - The journal list, the observer array and `OnUpdate`. +- **Outputs.** + - Journal calls: one per admission, under the gate, in Sequence order. + - `Watch` / `WatchRecord` notifications that carry `Sequence`. + - `OnUpdate` for loads. + - Observer and journal exceptions, rethrown to the writer. +- **Derived state.** + - `Sequence` is order as data. + - CultNet's primary log sequence is minted in the journal, so log order is + cache order. + - A replica's log sequence is copied from the primary entry. + - The database change kind (`Predicted`, `Reconciled`, `Added`, `Updated`, + `Removed`) is decided in the journal. + - `CultNetDatabaseChange.Sequence` (new) is copied from the cache change. + - Wire projections drop stale by it (Cut 6). +- **Forbidden writers.** + - Nothing re-sequences or schedules cache changes. The branch's `_parked`, + `_ready`, `_nextSequence`, `_draining`, `PendingChange` and the drain body + of `OnCacheChange` die, and so do the turnstile, `bcae483` and the + prototype. + - No R3 `Subject` fans out cache changes (Q2). + - `Apply` and `Index` run no user code. + - Doors never read or write prediction state: the branch's `HasPrediction` + and `_predictionGate` die. + - The database's Watch observer never logs; only the journal logs. + - A journal never enters the cache. +- **Shared paths.** Every path goes `Held` → `Admit` → `Resolve` → **Project** + → `land` → `Apply` → **journal** → leave gate → **publish**: + - loads: `AddBackingStore` `:1909`, `Loaded` `:1940`, `PullAll*` `:1959` and + `:3052`; + - `Commit` / `TryCommit` (`Land`, `:2272`); + - `UpsertAsync`, `UpsertVariantAsync`, `FlattenAsync` and `Remove` + (`:2004-2056`, `Write` `:2252`); + - a variant dependent's re-resolution (`VariantPlan.Dependents`, in the same + `Apply`); + - direct calls on an attached store (`:2924`); + - `Dispose` (`:2142`); + - the database doors, replica apply and snapshot resync, which only write + the cache and hand context to the journal. + + The single exception is the replica's absent-key delete, which has no cache + change. It logs directly (§4). +- **Deletion line.** + - In the cache: `Subject _changes` (`:1809`), the `_changes.OnNext` + call and its false comment (`:2374-2375`), `_changes.Dispose()` + (`:2154`), and the accessor calls in `Index` (`:2798-2804`). + - In the database, on the salvaged branch: the reorder buffer and drainer, + `_predictionGate` and `HasPrediction`, the logging in `Deliver`, and the + `Subject _changes` fan-out. + +## The design, question by question + +### 1. Validation before minting: a refused change mints nothing + +- **Where.** Add **Project** to `Admit` (`:2313`), between `Resolve` (`:2324`) + and `land` (`:2325`). +- **What.** Over `plan.Admitted ∪ plan.Dependents`, it evaluates once per + record: `NameAccessor(document)` and every `IndexAccessors[alias](document)`. + It keeps `(Name, (Alias, Value)[])` per key on the plan. +- **A throwing getter refuses the whole admission.** It raises an + `InvalidOperationException` that names the key, the member and the unwrapped + message; today the caller sees a bare `TargetInvocationException`. The + refusal comes before `land`, so the admission writes no store, touches no + memory and mints nothing. +- **Readers take the projection, not the document.** + - `Index` (`:2793-2806`). + - `RefuseVariantIndexSharing` (`:2659-2660`). + - The variant-name rule in `ResolveOne` (`:2616`). Its ancestor read at + `:2621` reads held documents, pre-land, and may stay. + + `Resolve` currently runs the refusal rules before any projection exists. + Hands makes Project the first pass over the resolved plan and moves both + rules after it, so rules read the projection and only the projection reads + documents. +- **Apply becomes user-code-free.** It then does only dictionary and + `ConditionalWeakTable` work on precomputed data. +- **Loads refuse too.** A store whose record's getter throws fails to open, + loudly. That is the rule "hydration failure on open is loud" (composition doc + `:88-92`). Today it half-indexes silently. + +### 2. Observer isolation + +- **Replace the `Subject` with the cache's own observer array**, + copy-on-write under a small lock. + - `Watch` (`:1887`) becomes `Observable.Create(register)` followed + by the existing `Where` and `Select`. + - `Dispose` calls `OnCompleted` on each observer, which is what + `Subject.Dispose` did. +- **Publish loops change → observer, and wraps each `OnNext` in its own + try/catch.** + - R3's `Observer` already catches handler exceptions (`OnErrorResume`, then + the unhandled handler). So an exception reaches the cache only when fail-fast + was asked for: a rethrowing `ObservableSystem` handler, or a custom observer. + - Escaped exceptions join the `OnUpdate` failures. They are rethrown to the + writer after every observer has received every change of the hold. That is + the existing `OnUpdate` policy (composition doc `:77-82`). + - The observer stays subscribed (**Q-P2**). The commit stands either way. +- **Prototype.** At `79f4639` (Q2) this took about 15 lines. Hands keeps that + part and drops the turnstile around it. + +### 3. Delivery thread, order and reentrancy + +- **Unchanged from main, on purpose.** Each outermost hold publishes exactly its + own changes, on its thread, after it leaves the gate and before it returns + (composition doc `:59-65`, `Held` `:2339`). + - A write from inside a handler is its own outermost hold. It delivers + depth-first before returning, as Q4 shows on main. + - There is no cross-thread order. Every change carries `Sequence`, and + latest-state consumers drop stale changes by it (doc `:68-73`, and the Mesh + mirrors at `CultMesh.cs:1534-1540`). +- **Why this is not a regression of the ruling.** The ruling asks for + exactly-once, not for a total delivery order. + - Exactly-once in the cache comes from the single mint site plus isolation + plus Cut 1 (§1-2). + - Order is needed by exactly one consumer, the shard log. It gets that order + from the journal (§4), not from delivery. +- **The journal is the new mechanism.** + - Signature: `IDisposable CultCache.AddJournal(Action>>)`. + Its name and shape are **Q-P3**. + - It is called in `Admit` right after `Apply` (`:2328-2329`), under the gate, + once per admission, with that admission's changes in Sequence order. + Journals run in registration order. + - A journal that enters the cache, meaning any hold on this cache while a + journal runs, throws `InvalidOperationException`. It is guarded by a flag + checked in `Held`'s `Monitor.IsEntered` branch (`:2341`). This is the + store rule ("a store call must not wait for a write to its own cache"), + enforced. + - Journal exceptions follow the observer policy: the admission stands, it is + still published, and the exception is rethrown to the writer after + publication. + - Adding or removing a journal takes the gate, so registration is atomic with + respect to admissions. +- **Lock order.** Cache gate, then journal-internal leaf locks (the database's + `_logGate`). Observers still run outside the gate, so the `bcae483` cycle + (an observer needing `_lifecycleGate` while a gate holder writes the cache) + cannot form. No journal takes `_lifecycleGate`, and no writer waits on a + delivery. +- **Soul's P2 passes.** A handler waiting on another thread's write sees it, + because nothing orders deliveries (Q7 on main). + +### 4. What CultNetDatabase keeps + +The database is rebuilt on the journal. It has no queue. + +- **Journal (under the cache gate, per admitted change, in Sequence order):** + 1. `TakeDoor(change)`, with the shape rule salvaged from the branch + (`:1219-1234`). A put door matches a change whose new document is its + instance and whose previous document is not. A removal door matches a + change whose previous document is its instance and which has no new one. + - The consumption now happens inside the door's own hold, before any + observer runs. So an observer's later write to the door's key or + instance can never wear the context (the `f3343c8` defect), and + unconditional `Dispose`-removal stays correct. + 2. Predictions. A `Predicts` door adds the prediction. On an `Authoritative` + door (`ApplyPutAsync`, replica put), if a prediction exists for the key, + the kind is `Reconciled` and the prediction is removed. + - The gate serializes this, so `_predictionGate` and `HasPrediction` are + deleted (F5). + - Soul's P6 cannot happen: the prediction is recorded before + `PutPredictedAsync` returns. + 3. Primacy. + - On a shard primary, where the door is not `NoLog`: mint, build, append disk-first and record, with a failed + append burning the sequence and compacting through it. See "(a) A journal that cannot log a committed + change" in Imagination pass 4; the earlier claim that a serialization failure mints nothing is withdrawn. + - On a replica, record the primary's entry from the `Replica` door, + under its own sequence. + - For a local write on a replica, log nothing. + 4. Stash `(cache Sequence → CultNetDatabaseChange)` under `_logGate`, for the + publisher. +- **Watch observer (after the gate, on the writer's thread, before it + returns):** it removes the stash entry for `change.Sequence` and publishes it. + - A change with no stash was admitted before the database existed and is + ignored. + - Register the observer first and the journal second, in the constructor, so + a stash can never be orphaned. +- **Log-before-publish** is structural: the journal runs before the gate opens. +- **The replica's absent-key delete (F6)** logs directly under `_logGate`. It + is in order because every earlier entry of the same pull loop was journaled + inside its own hold, before that `UpsertAsync`/`Remove` returned. This holds + even when a pull runs inside a handler, since nested holds journal + synchronously. +- **The in-memory log is keyed and ordered by sequence.** It becomes a + `SortedList` per shard, to match the durable store + (`CultNetShardMutationLogStorage.cs:55-64, 75-89`: that store replaces by + sequence and orders by sequence). +- **Kept from the branch:** + - the door table keyed by instance identity, and the shape rule; + - "only a primary mints; replicas publish"; + - log-before-publish; + - the snapshot resync "logs nothing" rule. Its removal door (branch `:733`) + must set `Removal = true`, or the shape rule never matches it. +- **Database fan-out isolation.** The database's `Subject _changes` + (main `:487`) has the Q2 defect one layer up: the subscription server's + per-peer handlers sit on it. Replace it with the same isolated + observer-array pattern as §2 (about 20 lines). Its exceptions reach the + writer through the cache's own per-observer catch. +- **`CultNetDatabaseChange` gains `long Sequence`**, the cache change's + Sequence, as an optional constructor argument, exactly as + `CultCacheDocumentChange` did (composition doc `:57-58`). Without it, + in-process latest-state consumers cannot drop stale changes. +- **Gone:** F3 (no deferred delivery), F4 (no drainer), F7 (no queue to + strand) and F8 (no guard). + +### 5. Backpressure and memory bounds + +- **No buffer exists.** A writer delivers its own changes, and they are held + only in its `mine` list for the length of its own call. +- **The journal stash** holds at most the changes of holds between their + journal and their publication. That is one hold per writing thread, and each + entry is removed by the same thread that added it. +- **A slow observer slows only the writer whose change it is handling.** That + is main's behaviour. It does not slow other writers, and it does not grow + memory. This replaces the branch's unbounded drainer backlog (F4, Soul P5). +- **The journal runs under the gate, so a slow journal slows every writer.** + - The database journal does in-memory work plus one durable + `mutationLogStore.Append` per logged change. `Append` rewrites the shard + file (`CultNetShardMutationLogStorage.cs:83-89`). + - That is I/O under the gate, which the locking doctrine already allows for + stores ("A store doing I/O on behalf of its cache ... holds the gate", + composition doc `:98-101`). It is still a new cost, so Cut 4's + verification measures commit latency with a file log store. + - The whole-file rewrite is a pre-existing monolith. It is recorded as a + follow-up, not fixed here. + +### 6. Cross-runtime impact + +The Eyes survey was run at `65311c9`. + +- **`cultcache-rs`, `cultcache-ts` and `cultcache-py` have no publication + surface:** no watch, no listener and no Sequence. + - Rust: `lib.rs:1970-1975, 2213-2420`. + - TypeScript: `cult-cache.ts:164-181`, "Observer delivery is not scheduled + here". + - Python: `cache.py:30-45`, which refuses reentrant mutation. +- **`cultnet-rs`, `cultnet-ts` and `cultnet-py` have no CultNetDatabase + equivalent and no cache watcher.** The only server-side shard log is the + Python interop test peer (`interop_peer.py:565, 583`), which mints + `len(log)+1` under its own lock, inline with the write. That is already the + journal's shape. +- **Wire parity is unaffected.** + - Cache `Sequence` never goes on the wire (composition doc `:47-49`). + - `CultNetShardLogEntryMessage` does not change. + - `CultNetDatabaseChangeRawMessage` (`CultNetSchemaMessages.cs:1016`) carries + no sequence, and this map adds none: stale protection for wire + subscriptions is server-side (Cut 6). + - No vector in `tests/vectors/` encodes publication order. +- **No other runtime must change.** +- **Follow-up.** `cultmesh-py`'s `CultMeshDatabase` watch (`node.py:421-505, + 1059-1065`) has F2 (a throwing callback skips the rest and reaches the + writer), and it has no Sequence. When Python grows cache publication, it + takes this contract. + +## Cuts + +Every cut is on CultLib, branch `hands/cultcache-publication` from `main` +`65311c9`, in a worktree Self creates. Cuts 1-3 touch only the cache and land +first. Cuts 4-6 depend on Cut 3. Heavy verification runs on Yggdrasil. + +**The negative checks that stay green in every cut** are the `4562340` tests: + +- `ObserverWritingTheSameCacheDoesNotWaitOnOtherDeliveries`; +- `SubscriptionDemandHandlerWritingCacheDuringDeliveryDoesNotDeadlock`; +- `SequenceIncreasesInAdmissionOrder`; +- `WatchRecordIgnoresStaleSequence`. + +They are the proof that no scheduler has come back. + +### Cut 1. Project before mint (cache, behaviour) + +- **First.** Commit Q1 as a failing test named for the rule. +- **Deletes first.** + - Accessor calls in `Index` (`:2798-2804`). + - Direct accessor reads in `RefuseVariantIndexSharing` (`:2659-2660`) and + `ResolveOne` (`:2616`). +- **Adds.** + - `Project` in `Admit` (`:2324-2325`). + - A per-key projection on `VariantPlan` (`:2456`). + - The early returns in `Resolve` (`:2477-2478`, `:2530-2534`) still pass + through `Project`, because it is called from `Admit`. +- **Authority.** Project owns "this admission's name and index values", and + the rules and `Index` read them. `Apply` runs no user code. +- **Verification.** + - Tests: + - **A refused getter mints nothing and changes nothing.** `GetWithSequence` + is unchanged, both keys are absent, the name lookup misses, nothing is + published, and the next write is previous+1. + - **Store-backed batch:** the store file is byte-identical, and a reopen + holds neither key. + - **A load whose getter throws** refuses the open and leaves the file + byte-identical. + - **Once per landed record:** a counting getter runs exactly once per + landed record, including a variant dependent re-resolved by a base edit. + - **The refusal names** the key and the member. + - Soul P4. + - Negative grep: `rg -n "NameAccessor\?\.Invoke|IndexAccessors" src/GameCult.Caching/CultCache.cs` + has no hit in `Apply`, `Index` or `Unindex`. `:315` is store-side and + legitimate. + - Stryker.NET on the diff. +- **Ledger.** About −15 and +45. + +### Cut 2. Observer isolation (cache, behaviour) + +- **Deletes first.** + - `Subject _changes` (`:1809`). + - `_changes.OnNext` and the false comment (`:2374-2375`). + - `_changes.Dispose()` (`:2154`). +- **Adds.** + - The observer array and `Observable.Create` in `Watch` (`:1887-1897`). + - The per-observer catch in `Publish` (`:2369`), with escapes joining + `failures`. + - `OnCompleted` on `Dispose`. +- **Docs.** Composition doc `:77-82`: escaped observer exceptions follow the + `OnUpdate` policy. +- **Verification.** + - Tests: + - **Q2 with a rethrowing handler:** the second observer receives every + change. The writer gets the escaped exception after delivery, and the + thrower is still subscribed (per Q-P2). + - **Subscription order:** subscribing and unsubscribing during a delivery + leaves every other observer's stream complete. + - **Dispose** completes observers. + - Soul P3. + - The four `4562340` tests stay green. + - Stryker on the diff, especially removing the catch and breaking out of + the loop on the first failure. +- **Ledger.** About −5 and +30. + +### Cut 3. The journal (cache, behaviour) + +- **Adds.** + - `AddJournal` (Q-P3), with registration under the gate. + - The invocation in `Admit` after `Apply` (`:2328`). + - The no-reentry guard in `Held` (`:2341`). + - Exceptions routed like observer failures. +- **Docs.** A composition-doc paragraph in "Store composition" and in + "Locking": journals run under the gate, in Sequence order, and must not + enter the cache or wait for anything that needs it. +- **Verification.** + - Tests: + - **Order:** 8 threads × 1000 writes. The journal sees contiguous, + strictly increasing Sequences, and each call's changes arrive together. + - **Timing:** the journal runs before any observer of the same change, and + after `Apply` (`Get` inside the journal sees the new document). + - **Reentry:** a journal that writes the cache throws, and the admission + stands. + - **Refusal:** a refused admission journals nothing. + - **Dependents:** a variant dependent is journaled in the same call as its + base edit. + - **Failure:** a throwing journal still lets the change publish, and the + writer gets the exception. + - The `4562340` tests stay green. + - Stryker on the diff. +- **Ledger.** About +50. + +### Cut 4. Salvage the branch and rebuild CultNetDatabase on the journal (networking) + +- **4a (history).** `git merge origin/hands/cultnet-publish-commits` into the cut branch from main + `3bf1c0c`. + - It is clean: the probe merge `6ec2f73` auto-merged `NetworkingTests.cs` and the composition doc, then + built and ran. + - The merge brings the tests. The queue dies in 4b. + - Self may squash-salvage instead, with the same content. +- **4b (subtraction first).** Delete at branch `28248eb` `CultNetDatabase.cs`: + - `_parked`, `_ready`, `_nextSequence` and `_draining` (`:502-505`); + - `_predictionGate` (`:506-507`); + - the Watch subscription and handshake (`:529-531`); + - `OnCacheChange` (`:1080-1135`); + - `PendingChange` (`:1265-1275`); + - `HasPrediction` (`:1209-1213`) and its calls (`:916`, `:1574`); + - the logging and prediction bookkeeping in `Deliver` (`:1137-1201`). + + Main's `PublishCacheUpdate` / `OnUpdate +=` (`:505`, `:1157`, `:1161-1191`) is already gone on the branch. + Hands confirms it is absent after the merge. +- **4c (the journal).** Register the Watch observer first and the journal second (`AddJournal`), in the + constructor. Per admission, under the cache gate, per change in Sequence order: + 1. `TakeDoor(change)`, keeping the branch's shape rule (`:1219-1234`). + 2. Resolve the shard and kind. Predictions: a `Predicts` door adds its key. An `Authoritative` door + (`ApplyPutAsync`, replica put) holding a prediction for the key makes the kind `Reconciled` and removes + the key. + 3. Log, per §(a): + - a replica door records the primary's entry, disk first; + - a primary change that is not `NoLog` mints, builds, appends and records, with failure going to the + floor; + - anything else logs nothing. + 4. Stash `(cache Sequence → CultNetDatabaseChange)` under `_logGate`. + 5. If step 3 failed, throw once at the end of the call, after all changes are handled (Q-P5). +- **4c, publication.** The Watch observer removes the stash entry for `change.Sequence` and publishes it. A + missing stash means the change was admitted before this database existed, so it is ignored. `Dispose` + removes the journal and the observer and clears the stash. +- **4d (the §(a) fixes).** + - The floor: `GetCompactedMutationLogSequence`, `GetLatestMutationLogSequence`, and resume in + `InitializeLogSequencesFromStore`. + - Disk-first `RecordMutationLogEntry`. + - A `SortedList` per shard. + - The snapshot reads its sequence first (`:660` moves below `:668`'s read). + - `_logGate` around `_lastWriteSequence`/`_nextLogSequences` readers (`:1302`, `:1314`, `:1325`). +- **Door changes.** + - Flags: `Predicts` and `Authoritative`. + - The snapshot removal door (branch `:733`) sets `Removal = true`. + - The replica absent-key delete logs directly and publishes nothing (branch `:1612-1621`). + - Doors neither log nor publish. They register context, write the cache, and dispose the registration. +- **Verification.** + - Every salvaged test passes: `CultNetPublishesCommitsTests` (13) and `CultNetPublicationOrderTests` (S1, + S1b, S2, S3, S4, S6, S7, log-before-publish, in-place re-upsert). + - Soul pass 3's P1-P7 are committed and passing. + - The pass 4 probes become tests named for the rule: + - **A1:** a refused primary `Append` publishes the change. The writer gets `CultNetShardLogException`, + which names the shard and `S`. A replica pull answers `compacted_history`, and a snapshot resync + converges. + - **A2:** the same at the tail with a restart: the replica converges after resync, and no sequence is + reused. The store's `CompactThrough` succeeded. + - **A3:** a refused replica `Append` leaves the cursor unchanged. The retry converges, and the memory log + holds `[1,2]`. + - **B1:** a pull on a primary is logged, and the replica converges. + - **S:** a snapshot racing a write converges. + - **C:** after compacting through 2 and restarting, the next mint is 3. + - New tests: + - a reentrant `database.PutAsync` from inside a database handler is logged with its context and published + once; + - a reentrant `ApplyShardLogResponseAsync` from inside a handler keeps the replica log in primary order; + - a log store whose `Append` writes the cache fails with Cut 3's reentry guard, wrapped, and the admission + stands. + - Commit latency with `CultNetFileShardMutationLogStore`, main against Cut 4. Also measure a `CultMesh` node + with `EnableDurableShardLogs`, where every bookkeeping write is now logged. Report it; do not gate on it. + - Negative grep: `rg -n "_parked|_ready|_draining|_nextSequence|_predictionGate|HasPrediction|PublishCacheUpdate" src/GameCult.Networking` + returns nothing. + - Review check: no `_cache.` call inside a `lock (_logGate)` block. + - The `4562340` tests stay green. + - Test runs use `--blame-hang-timeout 2m`. + - Stryker on the diff: dropping the floor raise, memory-before-disk, and the snapshot read order must each + kill a test. +- **Docs.** + - Composition doc `:50-53`: replace the "streams derive from `OnUpdate`" sentence. CultNet derives from + `Watch` plus one journal, and the log is written in cache order. + - A new paragraph: a primary that cannot log a change compacts through it. + - The log-store rule under Locking. +- **Blockers.** None. Q-P5 is ruled A. +- **Ledger.** Against the branch, about −130 and +95. The extra over the old estimate is the floor, the + disk-first order, the `SortedList`, the snapshot order, and the exception type. + +### Cut 5. Database fan-out isolation and Sequence (networking, behaviour) + +- **Deletes first.** The database's `Subject _changes` (main `:485`, branch `:487`) and its + `Dispose` (`:1158`). +- **Adds.** + - The isolated observer array, the same pattern as the cache's `Register`/`Publish` + (`CultCache.cs:1929-1944`, `:2470-2503`), behind `Watch`, `WatchAllChanges` and the rest (`:1089-1145`). + - `CultNetDatabaseChange.Sequence` (`:319-371`), as an optional constructor argument. The journal's stash + sets it from the cache change. A change with no cache change behind it carries 0. +- **Docs.** The binary-signature note, as the composition doc gave for `CultCacheDocumentChange` (`:57-58`). +- **Verification.** + - With a rethrowing handler and one throwing database subscriber, the other subscriber and a live + subscription-server peer receive every change. The writer gets the exception after delivery (Q-P2). + - The disposed-database test. + - `Sequence` equals the cache change's. +- **Blockers.** Cut 4. +- **Ledger.** About −10 and +35. + +### Cut 6. Stale protection on wire projections (networking, behaviour; Q-P4 A) + +- **The rule.** A projection applies a change to a key only if its `Sequence` is above what the projection + last applied for that key. A snapshot or reconcile applies everything at or below the cache sequence it read + **before** reading documents. + - That read is `Cache.GetWithSequence().Sequence`, the branch's idiom (branch `:531`). No new API + is needed. +- **Subscription server** (`CultNetDatabaseSubscriptionServer.cs`): + - `SubscriptionProjectionState` (`:630`) gains `long Floor` and `Dictionary Applied`. + - The single-row fast path in `Watch` (`:296-340`) reads the change's `Sequence` (reflection, like `Key`). + Under `_lifecycleGate` it drops the change if `Sequence <= max(Floor, Applied[key])`. Otherwise it applies + the change and records it. Removals are included. + - `Reconcile` (`:347`) and the subscribe snapshot (`:168-181`) read `seq0` before `CreateProjectedSnapshot` + (`:402`), set `Floor = seq0`, and clear `Applied`. + - This is sound: every change applied earlier was applied under the same gate, after its admission, so + its `Sequence` is at most `seq0`. + - Hop and unauthorized paths already reconcile from current state, and they set the floor too. +- **`CultNetDatabaseServer.CreateSubscription`** (`:501-513`): + - A per-subscription `(Floor, Applied)` under a per-subscription lock, held across check, record and send. + - `HandleSubscribeAsync`'s snapshot (`:362-369`) takes `seq0` first and sets the floor. +- **Verification.** + - Two threads write one key, with a blocking cache observer that forces the inverted delivery (Q3 shape). + On both servers, the peer's last state for the key equals the cache's. + - A removal overtaken by an older upsert leaves the key absent at the peer. + - The negative check: without the drop, both tests fail. +- **Blockers.** Cut 5, which provides `Sequence` on database changes. +- **Ledger.** About +45. + +### Salvage from `hands/cultnet-publish-commits` (revised) + +- **Keep:** + - both test files; + - the `NetworkingTests.cs` edits; + - the door table and the shape rule; + - "replicas never mint"; + - log-before-publish; + - "the snapshot logs nothing"; + - "loads and pulls on a primary are logged" (B1); + - the composition-doc paragraph, rewritten to name the journal. +- **Drop:** + - the reorder buffer and the drainer; + - `_predictionGate`; + - logging from the observer; + - the swallowed exception path (A1 and A3 on the branch). + +## Subtraction ledger (estimate) + +| Cut | Removed | Added | Other | +|---|---|---|---| +| 1 | ~15 | ~45 | none | +| 2 | ~5 | ~30 | the cache no longer uses R3 `Subject` | +| 3 | 0 | ~50 | one public method (Q-P3) | +| 4 | ~130 vs branch | ~95 | the merge brings +1109/-243, of which about 780 are tests; the floor, disk-first order, `SortedList`, snapshot order and `CultNetShardLogException` are the extra over the first estimate | +| 5 | ~10 | ~35 | the database `Subject` goes, and one public property | +| 6 | 0 | ~45 | none | + +- **Source, net against main:** about +245. +- **Source against the branch:** no scheduler anywhere. +- The budget is pressure, not a metric. + +## Operator questions + +- Q-P1..Q-P4 are ruled (see Rulings). Their option analysis is in the map's git history. + +- **Q-P5 A (ruled 2026-09-29): a primary that cannot log a committed change throws a typed + `CultNetShardLogException` naming the shard and the burned sequence, after publication, not derived from + `InvalidOperationException`.** + - The commit stands, the change is published, and replicas behind it snapshot-resync (Imagination pass 4 (a)). + - The writer hears of it. AetheriaEve `Program.cs:3722` cannot mistake it for a denial. + +Recorded, not forked: +- (b): no origin on the journal. Loads and pulls are logged on primaries. +- (a)'s restart residual when the store refuses both writes. +- The replica keeps retry-by-cursor. +- A throwing getter refuses loads too. +- Reentrant writes keep main's depth-first delivery. Order is data. +- Journal I/O under the gate follows the store precedent. + +## Follow-ups outside this campaign + +- **`cultmesh-py` watch.** It has no isolation and no Sequence + (`node.py:1059-1065`). +- **Durable log whole-file rewrite.** `CultNetShardMutationLogStorage.cs:83-89` + rewrites the whole file per `Append`. It is a monolith, and under the gate + its cost is now every writer's. +- **Mesh database-backed handles.** `CultMesh.cs:2362` and `:3396` can drop + stale changes once `CultNetDatabaseChange.Sequence` exists. +- **Skill scar.** The Eureka SKILL.md already says "a ticket system that + serialized delivery was built, deadlocked, and was deleted". The Soul pass 3 + direction re-proposed it anyway. The Soul brief template should tell Soul to + check `git log -S` for a proposed mechanism before recommending it. +- **A chained replica after a snapshot.** A replica that snapshot-resyncs has no log entries below the snapshot + sequence. It should raise its own floor to that sequence, so a replica chained on it resyncs instead of seeing + a gap (`ApplyShardSnapshotResponseAsync` `:675-736`). It predates this campaign. +- **AetheriaEve `Program.cs:3722`.** It reads a committed write's `InvalidOperationException` as a denial. Under + Q-P5 A, Cut 4's log failures cannot reach it. Observer and `OnUpdate` exceptions still can, so the Cuts 1-2 + recording stands.- **Cut 4 Soul, recorded 2026-09-30 (Self), not fixed in Cut 4:** + - **File log store is not crash-safe (hard prerequisite).** `CultNetFileShardMutationLogStore.Append` and + `CompactThrough` use `File.WriteAllBytes` (truncate, rewrite, no temp+rename, no fsync). A failure mid-write + truncates the log; every later append burns a sequence and a restart cannot construct the database. It also + rewrites the whole file per append, which Cut 4 now does under the cache gate (2.2 ms per write at 100 + entries, 33 ms at 950, a 2.49 s stall). An atomic, append-only store must land before any live daemon + enables durable shard logs. Today only AetheriaEve's offline tools do; the live Aetheria daemon passes + `enableDurableShardLogs: false`. + - **A slow log append blocks cache readers** (`CultCache.Get` takes the gate). Accepted with a note in the + store's XML doc. + - **Crash between the store write and the log append** leaves the log lagging the store, and nothing detects + it; a restarted primary reuses that sequence (A2's divergence reached by a plain kill). The spec called this + lag detectable; for a crash it is not. +- **Cut 4 final Soul (4d), recorded 2026-09-30 (Self), not fixed in Cut 4:** + - **F2, read cost.** `CultNetDatabase.Serves` (`:1980-1989`) runs per row in `GetAll`/`GetByName`/`GetByIndex` for every + layout except a single owns-everything shard: a reflection `GetTrackedKey`, a gate lock and a shard re-scan per row. + `database.GetAll` measured 24.8x `cache.GetAll` on 20,000 rows under a key-prefixed shard. Fix: filter by key inside + the cache enumeration (the `rowFilter` path already has keys) and hoist the owns-everything check. + - **F4, dispose drain edges.** An observer that removed its stash entry before the drain can publish after `Dispose` + returns (dropped); a throwing `_cacheJournal.Dispose()` skips the drain. Neither double-publishes or deadlocks. + - **F5, refusal naming.** A write whose schema is owned but whose key is outside the shard's prefix also answers + `unowned_schema` with details `{field:"schemaId"}`; the peer cannot tell a key refusal from a schema refusal. + - **Pre-existing, separate task.** Python emits error code `unsupported_schema_version` + (`cultnet-py/.../interop_peer.py:415`, `cultmesh-py/.../server.py:161`), which is not in the error-code enum; TS and + Rust refuse the whole message. diff --git a/docs/cultcache-union-parity-map.md b/docs/cultcache-union-parity-map.md new file mode 100644 index 00000000..368be16a --- /dev/null +++ b/docs/cultcache-union-parity-map.md @@ -0,0 +1,307 @@ +# CultCache Union Parity: Map + +Campaign `cultlib-gaps`, follow-up `cultlib-gaps:follow_up:union-parity-and-unknown-arms` (from +`thing2:follow_up:cultcache-union-parity`), under operator ruling `thing2:ruling:contract-decode-tolerance` +("CultCache refuses unknown union arms in every runtime, the C# reference included"). This file holds body facts, +the model page and rationale; the cut specs and the question are documents in the mind and cite this file by +section and fact number. + +Pinned base: `origin/main` at `aaf0d7f6` (2026-10-10). Imagination pass `imagination-cl-union-parity`, session +`self-2026-10-10c-eureka`. Probes live under the session scratchpad, `imagination-cl-union-parity/` (`cs` payload +probe, `cs2` store probe, `rs` payload probe, `py` store walkers, `il` decompiled MessagePack-CSharp). None of it is +committed. Earlier evidence is not repeated here: Eve `docs/thing2-map.md` P12-P13 (the cross-runtime probe) and +`docs/research/cultcache-union-decode-tolerance-prior-art.md` (prior art). + +## Cut order + +1. `union-refusal-cs`: the C# reference refuses an unknown union arm on read and a subtype the union does not name + on write. Ruled; nothing blocks it. +2. `union-golden`: the recursive-union golden and the arm refusal goldens in `tests/vectors/union-parity/`, + written by the C# reference and held by its tests. +3. `union-derive-rs` and `union-codec-ts`, in either order or together: cultcache-rs and cultcache-ts gain a + union (and, in TS, a slot record) codec that writes the reference shape and decodes the golden byte-identically. + `union-codec-py` follows the same golden for cultcache-py. +4. `slot-tolerance` (C# reference), then `slot-readonly-parity` (Rust, TypeScript, Python): a record carrying a + slot past its reader's declared slots, at any depth, is read-only (ruling + `cultlib-gaps:ruling:extra-trailing-slots`; the refinement is settled by section S). Both change a slot rule the + cuts in step 3 build, so they wait for 1-3 rather than reopening them. +5. `union-parity-release`: changelogs and tags, Breaking where `docs/semver-policy.md` says so. + +Thing2's `cut-contract-rs` waits on step 3 (Rust) only: its first step pins cultcache-rs at the commit that lands +`union-derive-rs` and re-runs P12 or the `union-golden` vector both ways. + +Why this order: the C# reference is the wire authority, so its refusal and its golden come first and the other +runtimes are held to bytes C# wrote, as `document-variants-c1` was (`docs/runtime-parity-scope.md`). Arms are +ruled and slots are not, so the slot rule is its own cut rather than a blocked step inside every runtime's cut. + +## Model page (step 0b) + +| Kind | What names it | Over time | Who decides | +|---|---|---|---| +| Union arm | An integer key, `[Union(k, typeof(Arm))]` on the abstract base (C#), assigned by the union's author. The wire carries `[k, armSlots]`; the arm's type name never travels. `nil` is a null reference, not an arm. | **Added:** a key never used before. **Retired:** the attribute is removed or commented out and the key is never reused (Aetheria `Behaviors.cs:160,173`; Aetheria-legacy `Behaviors.cs:37-38`). **Renamed type:** free, the key is the identity. **Unknown to a reader** (a newer writer's arm, or a retired arm in an old store): refused, naming the union and the key (ruling). | The union's author assigns keys. The C# reference defines the shape; every runtime keeps parity with it (doctrine, `runtime-parity-scope.md`). | +| Arm subtype on write | The value's runtime type must be one the union names. | A subtype the union does not name is today written as `nil` (U4). After cut 1 it is refused. | The union's author, by naming the arm. | +| Arm slots, record slots | `[Key(n)]` integers, base-class keys included (an arm is a flat array). Gaps are written `nil`. | **Added:** appended at the next free key. **Retired:** kept as a gap, never reused (Aetheria `ItemInstance.cs:35`, `EntitySerializer.cs` key 5). **Missing in an older store:** the reader's default (C# field initializer; Rust and Python need a declared default). **Extra past the reader's last key, at any depth:** the record is read and is read-only; every write or removal of it is refused, and it is persisted from its original bytes (ruling, S). | The type's author. The slot rule is CultCache's (`src/GameCult.Caching/Contracts/cultcache-schema-compatibility.md`). | +| Serde-enum member (Rust) | serde's external tag: the variant **name** (`{"Name": fields}`, a unit variant the bare string). | Persisted already by Rust consumers (section C). They keep their bytes: the union derive is opt-in and serde enums are untouched. | The Rust consumer. Not a cross-runtime shape. | + +## U. Mechanism facts (C# reference, Rust, TS) + +- **U1. The miss branch is `Skip` then `null`, in both union formatters MessagePack-CSharp 3.1.7 can hand out.** + `DynamicUnionResolver.BuildDeserialize` (decompiled from `MessagePack.dll` 3.1.7 net9.0 with ilspycmd): after + `ReadArrayHeader() == 2` (else `InvalidOperationException "Invalid Union data was detected"`) and `ReadInt32`, a + non-zero-start key set is mapped through `keyToJumpMap.TryGetValue`, a miss sets the index to `-1`, the `switch` + default calls `reader.Skip()`, and the result local stays `null`. The source generator's `UnionTemplate` + (`MessagePackAnalyzer` 3.1.7, `MessagePack.SourceGenerator.dll`) emits the same: `default: reader.Skip(); break;` + with `result = null`. Its serializer writes `nil` when `typeToKeyAndJumpMap` has no entry for `value.GetType()`. +- **U2. The C# reference decodes an unknown arm to null and does not re-encode to its bytes.** Probe `cs` + (payload built by hand with `MessagePackWriter`, decoded with `CultDocumentMessagePackSerialization.OptionsFor`): + unknown key 9 in a union field gives `Root=NULL`, in a list `Items=[TextNode,NULL]`; re-encode equal: False in + both. The formatter the reference composite hands out for the union is `MessagePack.Formatters.NodeFormatter1` + (DynamicUnionResolver's emitted type; the probe assembly carries no generated resolver). +- **U3. Missing and extra trailing slots, C# payload level.** Same probe: a payload one slot short decodes with + the field initializer (`Added=42`); a payload one slot long decodes with the extra slot skipped. Neither + re-encodes to its bytes. +- **U4. The reference writes an unnamed subtype as nil.** Same probe: `Root = new RogueNode()` (a subclass the + union does not list) serializes to `94 a2 64 32 c0 90 2a`: the root slot is `nil`, and it reads back `Root=NULL`. + Silent loss on the write side, the mirror of U2. +- **U5. Refusal can live at the CultCache layer; no MessagePack-CSharp fork.** Same probe, `strict` options: a + resolver placed ahead of `StandardResolver` returns, for any abstract or interface type with `[Union]`s, a + formatter that peeks (`CreatePeekReader`) the `[key, ...]` header, throws + `MessagePackSerializationException("union Node has no arm 9")` for a key the union does not list, refuses to + serialize an unnamed subtype, and otherwise delegates to the formatter `StandardResolver` would have handed out. + Baseline round-trips byte-identical; both unknown-arm cases and U4 are refused; slot behaviour is unchanged. + Every C# decode path reaches the composite through `CultDocumentMessagePackSerialization.OptionsFor` + (`CultCacheMessagePack.CreateCodec`, `DirectoryMessagePackBackingStore.cs:345`, `CultMesh.cs:2779,3493,3499`, + `CultMeshPrimitives.cs:1158,1230,2357`), so one resolver covers the cache, the directory store and CultMesh. + Consumer resolvers named by `[CultCacheFormatterResolver]` sit ahead of `CultDocumentResolver` today + (`CultDocumentMessagePackSerialization.cs:58-62`); the guard goes first and delegates to the rest of the + composite, so a consumer formatter still encodes the arm while the key check still runs. +- **U6. A top-level extra slot is dropped on write-back.** Probe `cs2`: a C#-written store, mutated as a newer + writer would (catalog member slot 2 added, payload slot 2 `"newer writer data"`), is pulled, the record edited + and flushed. The read succeeds, and the written payload is `['n1', 'edited by the older build']`: the newer + writer's slot is gone. (The schema id was left unchanged, so the migration report said `Kind=Exact`; with a + changed id the documented drift path reports `IgnoredExtraSlots`, `CultCache.cs:840-924`, but writes back the + same way.) +- **U7. Rust at `aaf0d7f6`, before the union cuts.** Probe `rs` (`cultcache-rs` at `aaf0d7f6`, payloads built with `rmpv`, decoded with + `rmp_serde::from_slice`): a serde enum's unknown variant is refused (`unknown variant 'Exploded'`); the C# arm + shape `[0, [...]]` is refused (`expected variant identifier`); a non-nil value in a gap slot is skipped; a missing + trailing slot is refused (`missing field 'added'`) unless the field is `#[cultcache(default)]`; an extra trailing + slot is skipped (`cultcache-rs-derive/src/lib.rs`, the `IgnoredAny` loop after the slot loop). The derive + accepts named structs only (`lib.rs:51-67`) and writes an empty member list into the catalog + (`src/lib.rs:2706`). +- **U8. TypeScript at `aaf0d7f6`, before the union cuts.** No typed codec: with no `formatter` a document encodes as a MessagePack **map** of the + zod-parsed object and decodes raw (`cult-cache.ts:679-692`; `@msgpack/msgpack` `encode({id:'d',version:7})` is + `82 a2 69 64 ...`, a fixmap, where the reference writes an array); positional slots exist only in hand-written + formatters (`test/cult-cache.test.ts:1263-1310`). P13 measured that a hand codec matches whichever encoding its + author chose. +- **U9. Python at `aaf0d7f6`, before the union cuts.** `define_database_entry_type` (`packages/cultcache-py/src/cultcache_py/documents.py:185-276`) + is a slot codec: gaps written `nil`, extra slots ignored, a missing slot defaulted or refused. No union codec. +- **U10. The written contracts.** `cultcache-schema-compatibility.md:75-91` classifies "persisted slot is missing + locally and can be ignored" as soft-migratable drift, reported as `IgnoredExtraSlots`; + `cultcache-persistence-format.md:215-218` says a store reader "never skips a slot it does not understand" for + record envelope slots, and every runtime refuses `extra-slot-full-payload.msgpack` + (`tests/vectors/document-variants-c0`). `docs/persisted-record-encoding.md` says consumers verify canonicality + by re-encoding and comparing bytes. The two contracts disagree about payload slots; the question below is + about that disagreement. +- **U11. Fixture home.** `tests/vectors//`: committed bytes every runtime's tests read + (`document-variants-c0` by Python `generate.py`, `document-variants-c1` written by C#), consumed by + `tests/GameCult.Caching.Tests/PreCut2StoreFormatTests.cs`, `packages/cultcache-rs/src/lib.rs`, + `packages/cultcache-ts/test/cult-cache.test.ts` and `packages/cultcache-py/tests/test_cultcache.py`. The CultNet + precedent for a reference-written vector is `CULTNET_WRITE_VECTORS=1` (`docs/cultnet-error-contract-cut.md:170`). + +## S. Slot read-only probe (any depth) + +Imagination pass `imagination-cl-slot-readonly` (session `self-2026-10-10c-eureka`), under ruling +`cultlib-gaps:ruling:extra-trailing-slots` ("b, and probe the any-depth refinement"). Probes live under the session +scratchpad, `imagination-cl-slot-readonly/` (`cs` C# synthetic, `aeth` C# on Aetheria's game database, `rs`, `py`, +`ts`, `il` decompiled MessagePack-CSharp 3.1.7). None is committed. The ruling's test: every runtime's decoder +carries a "slot skipped" mark to the record cheaply, on the one decode path, with no second pass and no per-type +consumer code. + +- **S1. Where C# skips, and why a resolver sees it.** + `DynamicObjectTypeBuilder.BuildDeserializeInternalDeserializeLoopIntKey` emits the slot loop's `switch` default as + a direct `MessagePackReader.Skip()` call; the source generator's `FormatterTemplate` writes + `default: reader.Skip(); break;`. `MessagePackReader` is a struct, and neither path raises an event or reads an + option, so the skip itself cannot be observed without a fork. Both fetch every member formatter from + `options.Resolver` (the generated code's `formatterResolver = options.Resolver`), and the union formatters fetch arm + formatters the same way (U1). A resolver ahead of the composite is therefore handed every nested object, list + element and union arm, and can read each one's array header before delegating. +- **S2. The mark arrives in C#.** Probe `cs`: a guard resolver returns, for each concrete int-keyed + `[MessagePackObject]` type, a formatter that reads the array count (from `NextCode` for a fixarray, a peek for + array16 and array32), compares it with the highest `[Key]` plus one (base keys included, MessagePack's member + visibility rule), notes a skip into a `[ThreadStatic]` scope the decode's caller opened, and delegates to the + formatter the rest of the composite hands out. An extra slot at depth 0 (record), depth 1 (nested object), depth 2 + (object in an object), in a union arm and in a list element each arrives as one mark naming the type and both + counts; the clean payload gives none. The guard needs `CompositeResolver.Create` around it so formatters are + cached (uncached, it was 40 times slower). +- **S3. C# cost.** Aetheria `GameData/Aetheria.cc` (12.1 MB; 237 of 238 records decodable with Aetheria.Shared's + types; decoded with `OptionsFor` that assembly; best of 9, three rounds): plain 165-209 ms, a second plain composite + (A/A) 174-193 ms, guarded 179-196 ms. That is 3.7-8.9% over the best plain run, inside the A/A spread. Worst case, + synthetic tiny objects (120,000 records, 23.1 MB, about 24 objects each): plain 618-637 ms with A/A within 4%, + guarded 704-705 ms: 11-19%, about 30 ns per decoded object. +- **S4. A live case in Aetheria.** The same probe, run with the AetherDb release binaries (built 2026-09-30) against + today's `Aetheria.cc`, marks 25 records: `WeaponItemData` whose `BehaviorData` arms (`AutoWeaponData`, + `ChargedWeaponData` and others) carry 34 slots where that build declares 21 or 33. The extra slot is + `WeaponData.Tracking` (key 33, Aetheria `8cd71ed6`, 2026-10-07): inside a union arm, inside a list. Today that tool + reads these records and drops `Tracking` from all 25 at its next landing (S5). Refusing nested extra slots would + stop it opening `Aetheria.cc` at all; read-only lets it open the store and refuses writes to those 25. +- **S5. A C# flush re-encodes every held record, not only the edited one.** `PushAll` and an unconditional + `CommitBatch` write `ToPersistedRecord(entry, SerializePayload)` for every entry (`CultCache.cs:3191-3201`, `3355`, + `3384`), under the local descriptor's schema id and catalog entry. So U6's loss reaches every held record with + unread slots at the next flush of anything. Rust (holds payload bytes and decodes on `get`, `lib.rs:2280-2293`), + Python (holds envelopes and decodes at load, `cache.py:257-285`) and TypeScript (holds payload bytes) carry an + untouched record's bytes. In C#, read-only therefore also means persisted from the original record (bytes, schema + id, catalog entry), never from the decoded document. +- **S6. Rust.** Probe `rs`: the derive's slot loop, with the trailing `IgnoredAny` loop counting into a + `thread_local`, marks depth 1, depth 2 and a list element. Depth 0 is the `DatabaseEntry` derive's own trailing + loop (`cultcache-rs-derive/src/lib.rs:258`), the same edit. A plain serde struct nested in a record already refuses + an extra element (`array had incorrect length, expected 2`), so only derived slot types skip. Cost (120,000 + records, 21.4 MB): inside the A/A spread (A/A from -3% to +9%; marked against plain from -14% to +13% over six + runs). The added code is one branch per object, never taken on a clean payload. Rust decodes on `get`, so whether + a held record is writable is answered by decoding its held bytes through the same derive, on the write path only. +- **S7. Python and TypeScript.** Probes `py` and `ts`: a slot codec tree passing a context argument (the shape + `union-codec-py` and `union-codec-ts` build) marks all five positions. Python (40,000 records, 11.1 MB, msgpack + unpack included): +14% against an A/A spread of 8%. TypeScript (120,000 decoded records, codec walk only; no + msgpack in the scratch copy): +20% against an A/A spread of 18%. The check is one length comparison per object. +- **S8. Kotlin has no library slot codec.** `CultDocumentCodec.decode` is written per type by the consumer + (`packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt:31-36`), and the package's own Eve + decoders skip extras by hand at 8 sites (`repeat((count - N).coerceAtLeast(0)) { reader.skip() }` in + `eve/EveDocuments.kt`). No slot rule, refusal or read-only, can be held by the library there until it owns slot + decoding. That is a follow-up, not a per-runtime rule. +- **S9. CultMesh decode paths** (`CultMesh.cs:2779,3493,3499`, `CultMeshPrimitives.cs:1158,1230,2357`) go through + `OptionsFor`, so through the guard, with no scope open: unchanged. Whether a Mesh replica that re-publishes a + decoded document drops slots is a follow-up. +- **S10. The refinement is in.** Every runtime with a library slot decoder (C#, Rust, Python, and the TypeScript + codec being built) carries the mark to the record on its one decode path, with no second pass and no consumer + code. The cost on Aetheria's real store is inside the A/A noise (S3); the worst synthetic case is 11-19% in C#. + A nested extra slot makes the record read-only; it is not refused. + +## A. Aetheria (C#, the only consumer persisting `[Union]`s) + +Aetheria consumes the reference through Unity packages pinned by tag (`Packages/manifest.json:55-57`: +`caching-unity-v1.4.0`, `cultlib-unity-v1.0.60`), so a CultLib change reaches it only when it bumps the pin. +Its only consumer resolver is `MathResolver` (`AssemblyInfo.cs:4`), which supplies no union formatter. + +- **A1. Unions inside persisted documents** (Aetheria `aac2cf91`, `Assets/Scripts/ServerShared`): + `BehaviorData` (`Behaviors/Behaviors.cs:147-191`, keys 0-11, 15, 16, 18, 20-24, 28, 31-40; 12 and 26 retired, + 14, 17, 19, 25, 27, 29, 30 commented out) in `List Behaviors` of the item data documents + (`ItemData.cs:346,368`); `WeaponData` (`Behaviors/Weapon.cs:15-18`); `EntityPack` (`EntitySerializer.cs:172-173`) + in `aetheria.savedzone` contents and its own `Children`; `ItemInstance` and `CraftedItemInstance` + (`ItemInstance.cs:18-31`, a union whose arms are also a union) in entity cargo and docking bays + (`EntitySerializer.cs:186-187`); `Provenance` (`Provenance.cs:96-98`) in `aetheria.provenanceledger` + (`Provenance.cs:11-15`, `Lot.Origin`); `SavedActionBarBinding` (`SavedGame.cs:221-223`) in `aetheria.savedgame`; + the input layout rows and keys (`InputLayout.cs:29-50`) in `aetheria.inputlayout`. `Brush` + (`Environment.cs:73`) was not traced to a persisted document. +- **A2. `GameData/Aetheria.cc` carries no unknown arm.** Walker `py/store_unions.py` over the git-tracked game + database (12.7 MB, `cultcache.store.v1`, 238 records, 13 catalog entries): `Behaviors` arm keys + {0:3, 1:2, 2:10, 3:5, 4:2, 5:2, 6:3, 8:7, 9:23, 11:2, 16:4, 23:7, 24:5, 31:1, 32:1, 34:1, 35:2, 37:4, 38:10, 39:2, + 40:1}; none retired or commented out; no `nil` element. +- **A3. The run save carries no unknown arm, and does carry missing trailing slots.** Walker `py/run_unions.py` + over `GameData/run.cc` (2026-09-30): `EntityPack` arms 0 and 1 (3 each), `ItemInstance` arm 2 (12), + `Provenance` arm 0 (64), `SavedActionBarBinding` 9 `nil` (empty bar slots). The `EntityPack` arms carry 21 slots + (orbital) and 20 (ship) against today's 22: the `Boss` slot (key 21, added 2026-10-07 in `db4617d8`) is missing, + so today's Aetheria reads this save only because a missing trailing slot defaults. `py/gaps.py`: no non-nil + retired slot (ItemInstance 2, 9, 10; EntityPack 5). `GameData/stale-2026-09-22/run.cc` is the same shape; + `player.cc` holds only `aetheria.playersettings`. `py/slots.py`: every top-level record matches its own store's + catalog exactly. +- **A4. What changes for Aetheria.** After it adopts a CultLib with cut 1, its current stores load unchanged + (A2, A3). A store written later by a build that has added an arm is refused by a build that lacks it, naming the + union and key, where today the arm silently becomes `null` (a gear item quietly loses a behaviour, a lot loses + its provenance) and the next save writes the loss back. Builds already pinned to 1.0.60 keep the null path; a + shipped binary cannot change. Aetheria-legacy does not use CultCache and has no store. +- **A5. Other C# stores.** `%LOCALAPPDATA%Low/GameCult/Aetheria/aetheria-unity.cc` (2026-08-08, 1.2 KB) is a + `cultcache.store.v2.directory-indexed` header from an older layout, not a union carrier. + +## C. Rust, TypeScript and other consumers + +Eyes audit for this pass (session `self-2026-10-10c-eureka`), `git grep` at each repo's `origin/HEAD`, Rust reach +by a lexical script (it can over-count; it does not under-count named fields). Aetheria and CultLib's tests excluded. + +- **C1. Rust: no `DatabaseEntry` record crosses runtimes as a union, and none uses the reference arm shape.** + Records that reach serde enums, each keeping its bytes because the derive is opt-in: + Huginn `epiphany.pipeline.resolution.v2` (`ResolutionOutcome`, external tag, `eureka-pipeline/src/lib.rs:746`, + live on Yggdrasil); Idunn `idunn.deployment_transaction` and `idunn.admitted_generation` (v4 and legacy forms; + internally tagged `#[serde(tag = ..., deny_unknown_fields)]` enums in `control_plane.rs`, `deployment_plan.rs`, + and two `#[serde(untagged)]` enums kept so older transactions decode, `drivers.rs:259,387`; live at + `/var/lib/gamecult/idunn/control.cc`); CodexConnector `gamecult.codex.replay_record.v1` (`CodexReplayState`, + `lib.rs:1017`); Epiphany's Atlas, model-request, persona and receipt records (internal, adjacent, external and + untagged representations; `.cc` files under `F:\Projects\.epiphany-runtime\` and on Yggdrasil). Unit-only serde + enums (a bare string) are widespread in Idunn, Huginn (`Faculty`, the pipeline's unit enums), CodexConnector and + Epiphany. No enum reaches any record in Odin, Muninn, Ghostlight, Huginn `mind-body`, or cultnet-rs and + cultmesh-rs production records. None of these is read by another runtime as a union today, so none is affected + by the arm refusal; the derive changes nothing for them. +- **C2. TypeScript: no consumer encodes a tagged union.** The only hand formatters are StreamPixels + `apps/service/src/realtime/overlay-state-documents.ts:190,232,277` (positional arrays, no union). Bifrost, + Heimdall, Hermodr, Odin scripts, Stonks, Vili, VoidBot (vendored `cultcache-ts`) and weksa have none. +- **C3. C# outside Aetheria: StreamPixels' overlay declares unions; its tracked store holds none of them.** + `apps/overlay-unity/Assets/Scripts/Assembly-CSharp/` (`8d40541`): `ActivationCondition` (10 arms), + `BattleEffect` (2), `StatusEffect` (4), `ItemInstance` (3), `EquippableItemInstance` (2), reachable from + `streampixels.status`, `streampixels.action_item`, `streampixels.skill` and gear documents. Walker + `py/sp_catalog.py` over `apps/overlay-unity/Data/catalog.cc` (`cultcache.store.v1`, 20 records): only + `outfit`, `skin_color`, `hair_style`, `emote` and `hair_color` records, and no `[int, array]` pair at any depth. + Its only consumer resolver is `MathResolver` (`Catalog/CatalogAssembly.cs:6`). CultLib's own + `GameCult.Networking` `Message` union (`Messages.cs:10`) is a CultNet wire message, decoded with + `MessageSerialization.Options` (`MessageSerialization.cs:7`, `DefaultOptions`), outside `OptionsFor`: the arm + guard does not reach it (follow-up). +- **C4. Python and Kotlin: no union-shaped record.** repixelizer uses `define_database_entry_type` with flat + slots; `cultmesh-kotlin` documents are `data class`es with no sealed type. + +So the stores the arm refusal can affect today are Aetheria's (A2-A4, none carrying an unknown arm) and +StreamPixels' overlay catalog (C3, carrying no arm). Every other runtime's persisted enums are serde shapes that +the opt-in derive leaves alone. + +## D. Payload depth bound (body at `c028c511`) + +One bound, 256 nested MessagePack arrays and maps, on read and on write (ruling +`cultlib-gaps:ruling:payload-depth-limit-256`; prior art `docs/research/payload-depth-limit.md`). The C# reference +landed in `ead5260c`, Python in `5618d8dd`, Rust in `c028c511`. TypeScript is not landed (spec +`cultlib-gaps:cut_spec:cut-union-bounds-ts.r2`, blocked on question `cultlib-gaps:question:ts-payload-opaque-type`). + +| Runtime | Owner of the decision (constant and walker) | Doors routed through it | +|---|---|---| +| C# | `CultPayloadDepth.Check` (`src/GameCult.Caching.MessagePack/CultPayloadDepth.cs`), limit `CultMessagePackSecurity.MaximumPayloadDepth`. MessagePack's own graph counter is set to the same value as a backstop only. | Write: `CultDocumentMessagePackSerialization.SerializeUntyped`. Read: `DeserializeUntyped`. The cache store (`SerializePayload`/`DeserializePayload`), the directory store, `CultMesh` and single-file documents all call those two; C# has no separate raw-envelope or prepared-batch door. | +| Rust | `cultcache_rs::check_payload_depth` and `MAX_PAYLOAD_DEPTH` (`packages/cultcache-rs/src/lib.rs`). | Read: `decode_payload` (get, list, `validate_envelope`/`put_envelope`, `finish_prepared_entry`). Write: `put`/`prepare_entry`/`prepare_entry_named` reach it through `finish_prepared_entry`, which decodes what it just encoded. Raw envelope: `put_raw_envelope`, the door CultMesh network puts use (`cultmesh-rs` `lib.rs`, two call sites). Prepared batch: `put_prepared_batch` via `require_payload_depth`. cultnet-rs: every free-form or skippable wire payload decodes through `cultcache_rs::decode_payload` (message decode in `contracts.rs`, `provider_session`, `media_stream_wire`, `replication`, `service_identity`). | +| Python | `_refuse_past_depth_limit` and `MAX_PAYLOAD_DEPTH` (`packages/cultcache-py/src/cultcache_py/documents.py`); a msgpack `StackError` on read maps to the same error. | `DocumentDefinition.encode_payload` (write) and `decode_payload` (read). `CultCache.put`, `put_envelope`, `put_envelopes` and load-time hydration go through them; there is no raw-envelope door. cultmesh-py round trips call the same pair. | + +- **Doors deliberately not routed.** cultnet-rs `idunn_lifecycle_brake`, `provider_health_contracts` and + `runtime_authority_contracts` decode records whose positional array length is checked exactly before decoding. A + fixed shape has no undeclared slot to skip and no free-form content, so the derive's depth is its shape (commit + `84bb1e28`). The five media records have no length check and are held by the test instead. C# `CultCacheMessagePack.CreateCodec` + serialises member values and deserialises member types without the document guard, by design (codec comment); only + the document type goes through the guard. +- **Forbidden writers.** No second walker and no second constant: a runtime's decoders, stores and wire layers call + the owner above, never re-count depth or restate 256. An added payload door routes through the owner or names + itself in the exact-length list. +- **Shared path.** `tests/vectors/union-parity/` (`bounds-outcomes.msgpack`, `depth-*.msgpack`; table in its + `README.md`), written by the C# reference and held by `tests/GameCult.Caching.Tests/UnionParityVectorTests.cs` and + `PayloadDepthTests.cs`, `packages/cultcache-rs/tests/union_parity.rs`, `packages/cultcache-py/tests/test_union_parity.py`. +- **Cut line.** `packages/cultnet-rs/tests/payload_depth.rs` and the `service_identity`/`cultmesh-rs` tests pin the + Rust wire doors. cultnet-py and cultmesh-py message and replication decoders call `msgpack.unpackb` directly and + are outside the Python cut; they hold only msgpack's own stack limit. +- **Verification layer.** Vector held by each runtime's own suite (limit 256 accepted, 257 refused, skipped content + counted, non-recursive walk); Rust wire doors by the cultnet-rs test above. + +## Rationale + +- **Why a guard formatter, not a fork or a re-implementation.** U5 shows a guard that only checks the key and the + subtype and delegates the encoding is enough. It keeps MessagePack-CSharp's union encoding as the one encoder, + costs one small file, and covers every path that already goes through `OptionsFor`. Forking the generated + template or vendoring `DynamicUnionResolver` would put a second encoder in CultLib. +- **Why the Rust derive is opt-in.** Serde enums already persisted by Rust consumers keep their bytes + (`docs/persisted-record-encoding.md`); a changed default would make every such store unreadable or + non-canonical. A new derive with explicit arm keys is how a Rust type says "this crosses runtimes". +- **Why arms use newtype variants over slot structs.** A C# arm is a subclass whose slots include the base class's + keys. A Rust newtype variant over a struct with keyed slots is the same thing, and it needs the slot code the + `DatabaseEntry` derive already has, factored so both derives share one slot generator. +- **Why the slot rule is a separate, asked cut.** The ruling settles arms and asks for extra trailing slots to be + "settled against the same re-encode rule". Two written contracts disagree (U10), and the current behaviour drops + data silently (U6), so the choice is the operator's and it should change every runtime at once. +- **The recommendation on extra slots was refusal; the ruling chose read-only, and S settles its depth.** An extra trailing slot is the slot-level twin of an unknown + arm: data from a newer writer that the reader's types do not describe. The operator ruled refusal for arms + knowing it costs an older reader the newer record; the same reasoning gives refusal for slots, and record + envelope slots are already refused in every runtime (U10). The alternative with precedent is + `variants:ruling:undeclared-read-only` (a record a type can read but does not declare loads read-only): it would + let an older reader see a newer record without overwriting it, but only where a catalog shows the extra slot + (top level), while most evolution here is nested (A3's `Boss` slot sits inside a union arm). +- **Missing trailing slots stay tolerated.** The reader knows a missing slot and its default, so it carries no + bytes it does not understand, and Aetheria's live run save depends on it (A3). A store whose guard compares + re-encoded bytes (Idunn's) refuses such a record by its own stricter rule, which is that guard's purpose. diff --git a/docs/cultlib-gaps-map.md b/docs/cultlib-gaps-map.md new file mode 100644 index 00000000..7227f5e3 --- /dev/null +++ b/docs/cultlib-gaps-map.md @@ -0,0 +1,691 @@ +# CultLib Gaps: Map + +Campaign `cultlib-gaps` (target: `docs/cultlib-gaps-target.md`). This file holds body facts, probes and +rationale for the cuts the mind's `cut_spec`s name; the specs cite it by section and fact number. + +Pinned base: `origin/main` at `6bdc23c9` (2026-10-10). Imagination pass `imagination-cl-gaps-cultmath`, session +`self-2026-10-10-ag`. Probes live under the session scratchpad, `imagination-cl-gaps-cultmath/` (`probe1` traced +copy of the solver and the warm/cold sweep, `suite` a scratch copy of `packages/cultmath` with the candidate fix, +`probe2` the sweep against that copy, `probe3` the overload probe). None of it is committed. + +## Cut order + +1. `bls-release-stop`: BoundedLeastSquares stops on a release only when the release is not real. +2. `bls-input-field`: a validation helper names the invalid input (follow-up `bls-invalid-input-field`). Blocked on + question `cultlib-gaps:question:bls-input-error-shape`. +3. `cultmath-release-0-4-1`: release `org.gamecult.cultmath` with cuts 1 and 2. Version follows question + `cultlib-gaps:question:bls-fix-release-lane`. +4. `cultmath-rotation-algebra`: quaternion algebra, swing-twist and joint clamps (ruling + `aetheria-release:ruling:solver-in-gamecult-animation`). Ships in the CultMath release that the first + GameCult.Animation release pins; that release is mapped with GameCult.Animation. +5. `py-msgpack-default` revision 4 (section P, "Revision 4"): the fix batch (h4) on `hands/py-msgpack-default` + at `a59bbc7d`. `migrate_payloads` is replaced by `convert` (ruling `py-migration-shape-ruled`), and Soul s3's + open codec Lows are fixed. Its merge to main waits on the Brokkr cut (follow-up `brokkr-msgpack-payloads-r4`). +5a. Not mapped: the Python store takes the cross-process sidecar lock the C# and Rust stores take (follow-up + `py-ts-store-cross-process-lock`). It is a store parity cut of its own; `convert` does not need it (P15). +6. Not mapped: the C# leaf-vectors revision (`leaf-vectors-next`) gains the P2 map-key rows, so the Python + key tests read C#-written bytes instead of literals. +7. `decode-stack-safety` (section D): cultcache-rs's one decode door grows its stack at every container level + (ruling `decode-stack-mechanism-ruled`). Independent of 5 and 6; thing2's contract-rs merge waits on it. + +## B. BoundedLeastSquares stopping + +Finding `aetheria-release:finding:cut-thrust-allocator-core.s1.solver-converged-early` (Soul, Medium): a cold start +reports `Converged` at a non-optimal point, so Aetheria's thrust allocator (tolerance 1e-12) answers differently +warm and cold, by up to .078 throttle. + +### Body facts + +- **B1. One runtime ships the solver.** `BoundedLeastSquares` exists only in + `packages/cultmath/src/CultMath/BoundedLeastSquares.cs` (C#, netstandard2.1 and net8.0). The type doc says there is + no HLSL mirror; grep over `packages/*` finds no Rust, TypeScript, Python or Kotlin sibling, and no other CultLib + project calls it. Its consumer outside CultLib is Aetheria's `ThrustAllocator`. +- **B2. The defect reproduces against CultMath at base, outside Aetheria.** `probe1` rebuilds Soul's allocator + matrix (Soul's `ProbeAllocator2`, constants H=100, Wy=1000, W=.3, kappa=10, rho=.1, EMax=2) for hull + `Synthetic(8, 7005)` and the 8th intent of `System.Random(5)`, (-0.8505, 0.6739, 0.5587): 15 rows, 12 columns. + Real `BoundedLeastSquares.Solve` at tolerance 1e-12 from x = 0: `Converged`, 13 iterations, cost 36.0313737, + x7 = 1. Re-solving from that answer: 1 iteration, cost 36.0312608, x7 = 0.9222145, which is also the warm answer. + The same literals (dumped with `"R"` floats, `probe1 dump`) reproduce it at tolerance 1e-9 and 1e-12, and not at + the default 1e-6, where the cold solve stops at iteration 10 inside the tolerance and the re-solve takes 0 + iterations. +- **B2a. The W5 problem as literals** (`probe1 dump`, float `"R"` round trip; m = 15, n = 12, row-major; the + regression fixture for `bls-release-stop`). Nonzero entries of A: + - row 0: a[0,2] = 100f, a[0,8] = -100f, a[0,9] = 100f + - row 1: 13.882518f, 20.86695f, 0, 14.8965845f, 12.38046f, 22.115599f, -13.706654f, 15.85789f, 0, 0, -100f, 100f + - row 2: -187.72859f, 239.31168f, 158.87828f, -270.31165f, 235.38467f, -14.704258f, 121.61232f, 244.81305f, 0, 0, + 0, 0 + - rows 3-6: a[3+k, 8+k] = 0.3f (k = 0..3); rows 7-14: a[7+i, i] = 0.1f (i = 0..7) + - b = {0, 67.385445f, 558.70917f, -3f, -3f, -3f, -3f, 0 x 8}; lo = 0; hi = 1f for columns 0-7, 2f for 8-11. + At base, tolerance 1e-12 from x = 0: `Converged`, 13 iterations, x[7] = 1, cost 36.031373704487095; a re-solve + from that answer: 1 iteration, x[7] = 0.92221445f, cost 36.031260771352414. +- **B3. The stopping rule that fires is the progress rule, after a release** (`BoundedLeastSquares.cs:273-278`). A + traced copy of the solver, bit-equal to the real one on this problem, shows the last two passes: + - iteration 12: full step lands; column 2 sits at its lower bound with gradient -0.00205 (violation 2.05e-3, + tolerance 1.5e-7); the solver releases it and records fMark = f. + - iteration 13: the re-solve moves x2 from 0 to 2.05e-7. The cost falls by about 2.1e-10, and the stall band + `1e-15 * fScale` is 2.11e-10, so `f >= fMark - band` holds and the solver reports `Converged`. Column 7 is then at + its upper bound with gradient +0.00145, ten thousand times the tolerance; releasing it is worth 1.1e-4 of cost. +- **B4. Why the progress rule cannot judge a release.** Near a minimiser, a cost difference resolves only about the + square root of what a gradient comparison resolves: a real step of size dx against gradient g lowers the cost by + about g*dx, while the cost itself is a sum of terms of size fScale. Here g*dx (2e-10) sat exactly at the cost's + rounding band. The gradient comparison is far from its own rounding: for column 7, the bound on the double + gradient's rounding error, `(n+1) * eps * (|A^T b|_7 + sum_k |(A^T A)_7k x_k|)` (Higham's inner-product bound, + gamma_(n+1)), is 9.3e-10, and the violation is 1.56e6 times that. +- **B5. What the progress rule is for** (commit 43035bc8, and the tests at `BoundedLeastSquaresTests.cs:774-942`). + It stops two kinds of pass that can never reach the tolerance: a free-set re-solve whose residual is rounding on a + near-singular free set, and a release whose violation is itself rounding (kktTol at or below the noise, including + kktTol = 0 when the box point nearest the origin is stationary). Deleting it outright breaks both: with a noise + gate on every test and no progress rule, 8 of 66 BLS tests fail (`wide`, `integer-tie`, `collinear`, `cond` spin to + the cap; `NearSingularFreeSetsConfirmOnceAndStop` sees 0 confirmations). Exempting releases from the progress rule + with no noise gate fails one: `StalledPassesConvergeInsteadOfSpinningToTheCap("plain")` seed 141, b = 0, + kktTol = 0, cycles release 3 (violation 1.7e-18) / stationarity miss / block on 3 until the cap. +- **B6. The candidate fix, measured.** In a scratch copy of the package (`suite`, diff `suite/clean.diff`, 44 lines): + (a) a bound column is a release candidate only if its violation exceeds both kktTol and the rounding bound of B4; + (b) the progress rule judges only passes that release nothing; a pass that releases sets fMark to +Inf, so a + release is never measured against a cost recorded before it. Results: + - all 66 tests in `BoundedLeastSquaresTests` pass, including `DefaultSolvesAreBitIdenticalToTheirGoldenBits` and + every stall and noise-floor test; the same holds with the bound's factor at 1, 16 and 256 in place of n+1; + - the W5 problem: cold `Converged` in 14 iterations at the warm answer (x7 = 0.92221, cost 36.03126077); + - 400 synthetic hulls x 60 random intents (24,000 calls, warm and cold) at tolerance 1e-12: every call `Converged`, + max iterations 45, warm and cold agree within 6e-8 on every call (the original: one call off by .078 in the first + 2,400). At the default tolerance warm and cold still differ, by more than .1 in 10,273 of 24,000 calls: that is + the documented resolution of 1e-6 times the gradient scale, pinned by + `AnAllocatorShapedProblemIsStartIndependentAtATightTolerance` (spread >= 0.5), and not this cut's subject. +- **B7. Released columns the factor drops.** With the fix, 266 releases in the suite land on a column that + `SolveFreeSet` marks dependent (p = 0). The next pass is then a stationarity miss with no release, and the + progress rule stops it, as before. No release in the suite or the 24,000 allocator calls produced a step that moves + the released column outward. A Lawson-Hanson style rejection guard (re-bind the column, try the next candidate) + was prototyped and is not needed by any measured case; it is not in the cut. + +### Prior art, and which one the solver follows + +- The solver is a primal active-set method on the normal equations: solve the free set, step to the first bound + crossed, release the most violated bound only after a full step lands. That is the outer/inner loop of + Lawson-Hanson NNLS (1974) generalised to two-sided bounds, which is the shape of Stark-Parker BVLS (1995) and of + scipy's `lsq_linear(method='bvls')`. It differs in factorisation (Cholesky of `A^T A`, not QR of `A`) and in + stopping. +- Lawson-Hanson stop on the dual test only (netlib `NNLS`, label 350: `IF (WMAX .le. ZERO)`), and guard roundoff + per candidate: a column whose new norm is negligible against rounding (`DIFF(UNORM+...)`) or whose new + coefficient is not positive (`ZTEST .gt. ZERO`) is rejected with `W(J)=ZERO` and the next candidate tried. There is + no cost-based stop. +- scipy's BVLS (`scipy/optimize/_lsq/bvls.py`, main) measures KKT exactly as CultMath's status doc states + (`g * on_bound` for bound variables, `|g|` for free ones, max over components) and has two stops: optimality below + `tol` (status 1) and a relative cost change below `tol` (status 2), reported as different statuses. +- CultMath reported its cost stop as `Converged`, which its status doc defines as "the KKT conditions hold". The fix + follows Lawson-Hanson: a release is judged on the gradient against its rounding (the role of their `DIFF` test), + and the cost stop is kept only where no gradient test can decide (a free-set residual at rounding level), which is + where scipy's status 2 also lives. + +### Rejected alternatives + +- Remove the progress rule and stop on the gradient alone: B5, 8 failures. +- Report the cost stop as a new status (scipy's status 2): the W5 answer would still be wrong, just labelled, and a + new enum member is a breaking change for callers that switch on the status. +- Measure progress from the step (the exact model decrease `t(1-t/2)|L^-1 g|^2`) instead of differencing the cost: + exact, but a noise-level gradient still yields a tiny positive decrease, so it needs the same noise threshold, on a + quantity further from the KKT test than the gradient itself. + +## I. Naming the invalid input + +Follow-up `cultlib-gaps:follow_up:bls-invalid-input-field` (from Soul finding +`cut-bls-kkt-tolerance.s1.invalid-input-names-no-field`): every validation failure returns the same `InvalidInput`. + +- **I1.** Validation today is three sites in `Solve`: tolerance (`:147-148`), bounds (`:149-151`), and finiteness of + A and b folded into the `A^T b` build (`:153-161`), which cannot tell A from b. +- **I2.** Precedent: LAPACK reports a bad argument as `INFO = -i`, naming the argument and never its value. .NET + throws `ArgumentException` with a parameter name, which the solver's no-throw, zero-allocation contract rules out. +- Recommended shape (question `bls-input-error-shape`, option `validate-helper`): a public + `BoundedLeastSquares.Validate(m, n, a, b, lo, hi, kktRelativeTolerance)` returning a new enum + `BoundedLeastSquaresInput { Valid, InvalidTolerance, InvalidBounds, NonFiniteMatrix, NonFiniteTarget }`, the first + failure in that order. `Solve` calls it and returns `InvalidInput` for anything but `Valid`, so validation has + one owner and the folded finiteness check in the `A^T b` loop is deleted. Additive: `InvalidInput` and every + existing result stay. + +## R. Release 0.4.1 + +- **R1.** `org.gamecult.cultmath` is at 0.4.0 (`package.json:4`, `CultMath.csproj:13`, tag + `cultmath-unity-v0.4.0`). `scripts/check-changelog-semver.mjs:97-101`: in 0.y.z a minor bump is the breaking lane; + additions and fixes take the patch lane (0.2.4 added `erf` as a patch). +- **R2.** Cut 1 changes results only where the old solver stopped after a release whose violation was above both the + caller's tolerance and the gradient's rounding, that is, where it reported `Converged` in breach of its status doc. + The default path's golden bits are unchanged (B6). The 0.4.0 precedent (ruling `cultmath-0-4-0-breaking-r2`) + declared the snoise tie fix Breaking because two valid functions gave different values; here the old value broke + the documented contract. Question `bls-fix-release-lane` asks which lane; the recommendation is `fixed-patch` + (0.4.1, `### Fixed`). +- The release procedure is the 0.4.0 cut's (`cultlib-gaps:cut_spec:cut-cultmath-release.r1`): Windows-only DLL rebuild + on Starfire, tests on Yggdrasil, public-surface diff, Unity import smoke, Soul before the tag. + +## Q. Rotation algebra + +Ruling `aetheria-release:ruling:solver-in-gamecult-animation`: CultMath gains quaternion algebra, swing-twist and +joint clamps; the aim-chain solve lives in a new package GameCult.Animation. The interface the consumer needs is the +Aetheria map's section "The rig's interface to GameCult.Animation and CultMath" (Aetheria `origin/master` +`30d02719`, `docs/aetheria-release-map.md:7559-7601`). + +### Body facts + +- **Q1. What exists.** `quaternion` (`src/CultMath/quaternion.cs`, 95 lines): public float fields x, y, z, w; + `identity`; `LookRotation(float3 forward, float3 up)`; implicit conversions to and from `float4`; scalar `==`. + `math.normalize(quaternion)` (`math.cs:225-235`) returns identity below length 1e-20. No mul, rotate, conjugate, + inverse, axis-angle, slerp, swing-twist or clamp exists. `math` is a partial class (`math.cs`, + `math.Interval.cs`, `math.Affine.cs`, `math.Phacelle.cs`); `math.rotate(float2, float)` exists (`math.cs:240`). +- **Q2. Serialization.** `GameCult.Caching.MessagePack` serialises `quaternion` as the float array [x, y, z, w] + (`CultMathResolver.cs:170-171`) and as an xyzw object in JSON (`CultMathJson.cs:468`). No other runtime + (`cultcache-rs`, `-ts`, `-py`) has a quaternion type. The cut adds static functions only: no field, layout or + formatter changes, so no wire change and no cross-runtime fixture. +- **Q3. Runtimes.** The algebra is C#-only, like `LookRotation`: shaders carry rotations as `float4` (the type's doc), + the mirror tests map shader functions to C# and never the reverse (`HlslSourceCompatibilityTests.cs:114-117`), and + the native core (`native/cultmath-core`) is a Voronoi tone helper. The Unity bridge already converts `quaternion` + (`UnityConversions.cs:16,23`); it needs no change. +- **Q4. An overload trap, probed.** `quaternion` converts implicitly from `float4`, and CultMath has no + `mul(float4, float4)`. `probe3` declares `mul(quaternion, quaternion)` beside scalar and matrix `mul` overloads and + calls it with two `float4`: it compiles and returns the quaternion product. HLSL's `mul(vector, vector)` is the + inner product, and Unity.Mathematics 1.3.3 (the copy in Aetheria's PackageCache) defines `mul(float4 a, float4 b)` + as such (`matrix.gen.cs:129`), so the same call there is a dot product. The cut therefore adds HLSL's vector + `mul(float2|3|4, float2|3|4)` (dot) beside the quaternion `mul`, so a `float4` pair keeps its shader meaning. +- **Q5. Unity.Mathematics as reference, not template.** Its signatures for `mul`, `rotate`, `conjugate`, `inverse`, + `AxisAngle` and `slerp` (`quaternion.cs:99,493,502,630,651,678`) are the consumer's stated convention ("`mul(a, b)` + applies `b` first"). CultMath's design rule is to state semantics in code and not copy Unity.Mathematics + (`docs/design.md:465-469`), so the formulas are written from the definitions below. + +### Semantics the cut lands + +Quaternions are Hamilton, stored xyzw, unit for rotation; angles are radians, right-handed about the axis. + +- `math.mul(quaternion a, quaternion b)`: the Hamilton product; `rotate(mul(a, b), v) == rotate(a, rotate(b, v))`. +- `math.rotate(quaternion q, float3 v)`: `t = 2 cross(q.xyz, v); v + q.w t + cross(q.xyz, t)`; q assumed unit. +- `math.conjugate(q)`: (-x, -y, -z, w). `math.inverse(q)`: `conjugate(q) / dot(q, q)`, no guard (zero in, non-finite + out, as HLSL division). +- `quaternion.AxisAngle(float3 unitAxis, float radians)`: (axis sin(r/2), cos(r/2)); the axis is not normalised. +- `math.slerp(a, b, t)`: shortest arc (negate b when `dot(a, b) < 0`); normalised lerp when the quaternions are + nearly parallel; t is not clamped. +- `math.swing_twist(q, unitTwistAxis, out swing, out twist)`: twist is q's projection onto the axis, normalised + (identity when that projection vanishes, a half-turn swing); `swing = mul(q, conjugate(twist))`, so + `q == mul(swing, twist)` (twist applied first). +- `math.clamp_twist(twist, unitAxis, min, max)`: angle `2 atan2(dot(twist.xyz, axis), twist.w)` wrapped to (-pi, pi]; + inside [min, max] the input is returned unchanged, otherwise `AxisAngle(axis, clamp(angle, min, max))`. +- `math.clamp_hinge(q, unitAxis, min, max)`: `clamp_twist` of q's twist about the axis; the swing is discarded. +- `math.clamp_cone(swing, unitAxis, maxAngle)`: the angle between `rotate(swing, axis)` and `axis`; inside the cone + the input is returned unchanged, otherwise the rotation by `maxAngle` about `normalize(cross(axis, + rotate(swing, axis)))` (at a half turn, where that cross product vanishes, about the swing's own axis). +- Preconditions (`min <= max`, unit axes) are documented, not checked, as everywhere in `math`. + +### What GameCult.Animation will need from this cut (not mapped here) + +- From cut 4: `mul`, `rotate`, `AxisAngle` for `AimChain.Pose` and `EffectorDirection`; `conjugate` or `inverse` for + frame changes; `swing_twist` and the clamps if its joints ever carry cone or twist limits (the presenter's per-axis + boxes do not). +- From cut 1: start-independent `BoundedLeastSquares` at a tight tolerance. `AimChainSolver.Solve` is warm-started + from `current`; without cut 1 its answer would depend on the previous frame exactly as the allocator's did. +- A CultMath release that carries cut 4, which `org.gamecult.animation`'s `package.json` pins. That release is + mapped with GameCult.Animation, so one Soul-verified release pair ships both. + +## P. cultcache-py payload format (py-msgpack-default, revisions 2 to 4) + +Imagination pass `imagination-py-msgpack-r2`, session `self-2026-10-12-eureka`, against `hands/py-msgpack-default` +at `7f2c7477`. Probes ran from the session scratchpad and were removed afterwards; their results are recorded here (`jobK` ran +the C# reference on Yggdrasil at `7f2c7477`; `p1`-`p3` ran Python 3.13.15 with msgpack 1.2.2 on Starfire). Revision 1's facts +are in `docs/research/py-msgpack-default/README.md`, and Soul's are in verdict `cut-py-msgpack-default.s1`. + +### Body facts + +P1. **What decides a payload's format at 7f2c7477.** A search of every `packb`, `unpackb`, `json.loads` and +`json.dumps` call in cultcache-py, cultnet-py and cultmesh-py found five places: +- (a) `PayloadCodec.encode`/`decode`, through `DocumentDefinition.encode_payload`/`decode_payload`. +- (b) `_check_payload_tree` (documents.py:75), which holds the map-key rule. `MESSAGEPACK_PAYLOAD_CODEC.encode` + does not apply that rule, so a direct call writes `{1: 'a'}` and its own `decode` refuses the bytes. +- (c) `stores.py:217`, `_infer_schema_version_from_payload`. A v1 record whose schema id is missing from the + catalog is read by unpacking its payload as MessagePack to find a schema stamp. +- (d) `replication.py:186`, the same stamp reader copied into cultnet-py behind a lazy `import msgpack`. +- (e) `stores.py:257`. A legacy envelope whose payload is an inline map or array is repacked as MessagePack. + +The other JSON sites are wire messages, schema JSON, CLI output and the cultmesh ready file. None of them is a +document payload. + +P2. **The C# reference's object slot, map keys** (`jobK`, `NumericLeafVectorTests.AnySlot` under +`CultDocumentMessagePackSerialization.OptionsFor`, MessagePack `UntrustedData` security): +- Accepted: str, int at every width (negative fixint, u64 max, i64 min), float32, float64, bool, and timestamp + ext. The reference rewrites each one at its own width, for example `9181ff01` becomes `9181d0ffcc01`. +- Refused: nil (inner `ArgumentNullException`); bin, array and map keys (inner `TypeAccessException`, because + UntrustedData has no collision-resistant comparer for them). +- Refused as duplicates (inner `ArgumentException`): `{1:1,1:2}`, `{"a":1,"a":2}`, and `{01:1, cc01:2}`, which + is the same value written at two widths. +- Accepted as two keys: `{1:1, 1.0:2}` and `{1:1, true:2}`. The CLR types differ, so the keys are distinct. +- An `object` value of u64 max or i64 min is accepted and rewritten byte-identical. + +P3. **msgpack-python with `strict_map_key=False`** (`p2`, `p3`). Every key kind decodes: nil becomes None, bin +becomes bytes, and a timestamp ext becomes `msgpack.Timestamp`. An array or map key raises TypeError +(unhashable) without a hook. Duplicates are silently last-wins: `{1:1,1:2}`, `{"a":1,"a":2}`, `{01, cc01}`, +`{1, 1.0}` and `{1, true}` each decode to a single key. An `object_pairs_hook` sees every key kind, lists and +dicts included. An exception it raises propagates with `__context__` None. On 100k small maps the hook costs +2.2x the decode time (0.087 s becomes 0.200 s). `packb` raises an untyped `OverflowError` for 2**64 and +-(2**63)-1. + +P4. **Hash flooding with non-str keys** (`p1`). This is msgpack-python's reason for `strict_map_key=True`. +Within the 64-bit MessagePack integer range, at most 13 integers share one CPython hash. The full-hash collision +attack on int keys therefore needs unbounded integers, and MessagePack cannot carry them. Keys crafted to share +low hash bits (`k << 43`) took 0.44 s for 200k keys and 1.34 s for 400k. 200k str keys take 0.25 s. The cost is +mildly superlinear, not quadratic. The reference defends itself with UntrustedData's collision-resistant +comparers. Python's dict has no such comparer, and the measured bound makes one unnecessary. + +P5. **Schema-stamp recovery.** The C# store deleted its stamp recovery in `a3cc3942` (2026-09-13), so a persisted +schema id that is absent from the embedded catalog is refused ("Persisted schema ... is not present in the +embedded catalog", `CultCache.cs:504-507`). The C# CultNet registry keeps payload-stamp routing for raw wire +records (`CultNetDocumentRegistry.ResolveDescriptorForRawDocument`, `TryResolveDescriptorByPayloadSchema`). +cultcache-py's store copy (P1c) is therefore a divergence from the reference. cultnet-py's copy (P1d) mirrors +the reference. The TS store (`single-file-messagepack-backing-store.ts:336`) also keeps the store copy. + +P6. **Legacy envelope arrays.** The C# reference does not read them. TS (`normalizePayload`, line 490) and Python +both repack an inline payload with MessagePack `encode`. A legacy inline payload is a subtree of a MessagePack +document, so it is MessagePack by construction. No JSON-payload writer ever produced one: the 0.3 JSON default +wrote bytes, which land as bin. + +P7. **Brokkr** (read-only, `f97d4dc`). The bridge imports cultcache-py from `F:/Projects/CultLib/packages` +(`blender_target.py:19`) and defines 8 types with `define_document_type` (630-637). Merging to that checkout's +main is therefore the switch itself: Soul s1 measured that the next `_open_node` pull refuses the whole Blender +store. The daemon writes JSON into the Blender store and the Unity store with `put_json_document` +(`main.rs:1424`, called at 790-1392 and in tests from 2710). It also has `put_messagepack_document` (1435) and +reads JSON first, then MessagePack (`decode_payload`, 1447). The daemon is Rust and cannot call cultcache-py. + +### Authority, and why + +- **Payload format.** The definition's `PayloadCodec` owns its bytes: the encoding, and which maps and integers + the format can carry. On read, `MESSAGEPACK_PAYLOAD_CODEC` refuses key kinds and duplicates through its + `object_pairs_hook`; that is the only place they are visible, because a dict cannot show a collapsed duplicate + afterwards. On write, its encode walks the tree first, so a direct `codec.encode` call cannot write bytes + its own `decode` refuses (Soul's single path). +- **What the definition owns.** `DocumentDefinition.encode_payload`/`decode_payload` own the cross-codec rules + (depth 256) and the translation of codec faults into the typed refusals, naming the type. `PayloadCodec.map_keys` + is deleted, and `_check_payload_tree` goes back to checking depth only. +- **The key rule is P2's.** It is not `strict_map_key`'s. Duplicates are refused as the reference refuses them. +- **Residual.** Keys Python holds as one but the reference holds as two (`1` and `1.0`, `1` and `true`) are + refused, because a dict cannot hold both. The refusal is typed (`duplicate_map_key`) and pinned so a change is + seen. Matching the reference here would need a decoded map type that is not a dict. No consumer is known to + write such maps. +- **Prior art for refusing duplicates** (from knowledge, not fetched this pass): CBOR's RFC 8949 section 5.6 + expects decoders to reject duplicate keys; I-JSON (RFC 7493) requires the same of JSON; MessagePack-CSharp's + `UntrustedData` refuses duplicates and keys it cannot hash safely (P2). msgpack-python's `strict_map_key` exists + for hash flooding, which P4 bounds. +- **Integer range.** Beyond 64 bits is a format limit, so the MessagePack codec's write walk refuses it with the + code `integer_out_of_range`. The value is never named, and neither is a map key on its path, because in a + free-form tree a key is payload data. Entry slots keep their leaf refusals, which name the slot and the field. + A bigint was never wire-parity data: MessagePack has no integer wider than 64 bits (P3), and the 0.3 JSON + payloads that could hold one were unreadable by the reference (`py-default-payload-json`). +- **The stamp readers.** P1c is deleted and its record is refused as the reference refuses it (P5). P1d stays as + cultnet-py's raw-record router, mirroring C#. It reads a stamp and decides no format: the resolved definition's + codec decodes the payload or refuses it. It loses its lazy import. +- **Legacy envelopes.** P1e is demoted and stays (P6). It extracts the MessagePack bytes the inline subtree + already is. A definition whose codec is not MessagePack refuses the record like any other foreign record. +- **The default codec.** The `DocumentDefinition` field is its only author. `define_document_type`'s parameter + defaults to None and forwards only a codec it was given. +- **Refusal text.** The JSON remedy sentence is dropped from the read refusal: it was false for every entry + definition. Each refusal carries a `code` (`not_one_value`, `map_key_kind`, `duplicate_map_key`, + `integer_out_of_range`) and names the kind or the fault class. It is raised after the `except` block, so + `__context__` holds no decoder exception and no payload. + +### Migration: what CultLib owns + +Revision 1's README procedure (read under JSON, then put each value) was per record and not atomic. Soul s1 +stranded a store with it. Revision 2 replaces the procedure with +`migrate_payloads(store, definitions, *, source_codec=JSON_PAYLOAD_CODEC) -> int` in cultcache-py: + +1. It pulls every envelope from the store. +2. For each record whose type is among `definitions`, it decodes under that definition with `source_codec` and + encodes under the definition itself. That is the whole definition path, validation and every refusal included. +3. Any refusal stops the migration before the store is touched. The error names the type, the record key and + the refusal's code, never the value. +4. Otherwise one `push_all` writes the store whole. `SingleFileMessagePackBackingStore` and + `JsonLinesBackingStore` each do that as a temp file and a rename. +5. Records of other types keep their bytes and `stored_at`. The return value is the count rewritten. + +It never sniffs, and it cannot leave a store half-migrated. Revision 2 also claimed that a second run is refused; +Soul s2 falsified that (P10), and a concurrent writer strands the store (P11). Revision 3 replaced this shape with a +backup-and-swap (P12), which Soul s3 broke three more ways. Revision 4 deletes the in-place migration: CultLib owns +only `convert`, which writes a new file and never writes its source (P14). + +Rejected alternatives: +- A sniffing reader that accepts both formats: P1's one-digit payloads are valid in both formats, and r1's map + forbade readers that try one format and then another. +- A consumer-run loop over `put`: that is the procedure that stranded the store. + +### Brokkr landing contract (follow-up `brokkr-msgpack-payloads-r4`) + +The merge of `hands/py-msgpack-default` to main waits on three things: +1. Soul holds on the fix batch. +2. A Brokkr branch, Soul-held, is ready in its own campaign. On it, the daemon writes MessagePack + (`put_messagepack_document`) into both stores. The JSON-first read becomes a read of exactly one MessagePack + value with a trailing-bytes check, and the bridge's 8 definitions are unchanged. The Blender store is converted + by `cultcache_py.convert` over those 8 definitions into a new file beside it, because those payloads came from + cultcache-py's old default (P14). The daemon-written JSON receipts in the Unity store are the daemon's own, and + it rewrites them, also into a new file. +3. An operator window: close Blender and stop sync, Self merges CultLib and Brokkr together, build the daemon, + run both conversions, open each new file, swap it into place, then restart. The JSON originals are kept under + another name for as long as the operator wants them. + +### Revision 3 + +Imagination pass `imagination-py-msgpack-r3`, session `self-2026-10-12-eureka`, against `hands/py-msgpack-default` +at `57f85acd`. Python probes ran on Starfire (Python 3.13, msgpack 1.2.2) over a `git archive` of the cultcache-py +and cultnet-py sources at that head, and were removed afterwards. The C# facts are Soul s2's (`jobB`, Yggdrasil), +not rerun here. + +P8. **What still decides map keys at 57f85acd.** One search found three MessagePack readers that see document +payload maps. (a) The codec's `_unpack_tree` applies the reference rule through `_checked_map`. (b) The store's +whole-file `msgpack.unpackb(data, raw=False)` (`stores.py:98`) applies msgpack's `strict_map_key=True`. A legacy +envelope file whose inline payload is `{1: 'a'}` is refused with "int is not allowed for map key". Read through +`_unpack_tree` instead, the same file yields the payload `8101a161`, and a v1 snapshot's framing decodes +identically either way. (c) cultnet-py's stamp router (`replication.py:192`) applies `strict_map_key=True`. Read +through the codec, `['x.v1', {1: 'a'}]` and `{'schemaVersion': 'x.v1', 'v': {1: 'a'}}` both route to `x.v1` (C# +routes both, Soul s2 STAMPPROBE). A nil-keyed payload gives `None`, as it does today and in C#. Every other +`unpackb` in cultnet-py and cultmesh-py reads wire messages, cursor files or fixed-slot protocol records, whose +maps are frames rather than payload data. Their bound is follow-up `py-wire-decoders-unbounded`. Unmeasured: C# +reads a map stamp as `IReadOnlyDictionary`, so a top-level non-str key may stop C# routing where +Python routes. The resolved definition decides the record either way. + +P9. **The two depth counters.** `_check_writable` (documents.py:184) counts every node, scalars included, to +`_PACK_DEPTH_LIMIT = 511`. `_check_payload_tree` counts containers to 256. Commit `eef1cb15` moved the codec +from 256 to 511 so that `test_union_parity.py:650` could build its 257-deep read fixture with +`document.payload_codec.encode(past)`. The fixture needs bytes that are 257 deep, not a codec that writes them: +`msgpack.packb(past, use_bin_type=True)` and `json.dumps(past).encode()` build them, and both writers nest to 511 +or further. One container walk, bounded at `MAX_PAYLOAD_DEPTH`, serves both the definition and the codec. It also +ends a cycle, because a cycle reaches 257. + +P10. **Rerun.** No byte in a CultCache store records a payload format, and no wire change is wanted for one. A +migration that rewrites the live store in place therefore cannot tell its own output from its input when a +payload is valid in both formats. `b'5'` is the JSON 5 or the MessagePack 53, and Soul s2 saw 53 become 5. No +check on the payload content can separate the two, so the rerun guard has to come from outside the payload. + +P11. **Concurrency in the store.** cultcache-py's file stores hold a per-object `threading.RLock` only, so every +`push` is a read-modify-write that loses another process's write. The C# store opens a `.lock` sidecar with +`FileShare.None` (`CultCache.cs:3489-3509`), and cultcache-rs takes an `fs2` lock on its sidecar (`lib.rs:853-859`). +cultcache-ts has none (a search of `packages/cultcache-ts/src` finds no lock). The migration race is one case of a +store that lacks the reference's lock. + +P12. **Prior art and the shape chosen** (primary docs fetched 2026-10-12). SQLite `VACUUM INTO`: "the original +database file is unchanged", and the target "must not previously exist, or else it must be an empty file". LMDB +`mdb_env_copy`: the target directory "must already exist and be writable but must otherwise be empty". Realm is +the counter-example to Self's hypothesis. It migrates in place on open, and a rerun is safe because the file +records its schema version, which CultCache's payload format does not (P10). The chosen shape follows `VACUUM +INTO`, with the destination role taken by a mandatory backup: + +`migrate_payloads(store, definitions, *, backup, source_codec=JSON_PAYLOAD_CODEC) -> int` + +1. Copy the live store's bytes to `backup` with exclusive create (`open(backup, "xb")`). If the backup exists, + the call is refused before anything is read. Every rerun is refused this way, whatever the payloads hold. +2. Read the records from the backup, the frozen copy, and rewrite the listed ones. Any refusal of any exception + class raises `CultCacheError` naming the type, the record key and the code or class. +3. Compare the live bytes with the copied bytes. A difference means a writer ran during the migration, and the + call refuses and says to stop every writer. +4. Replace the live file in one `_replace_all` (temp file and rename). +5. On any failure after step 1, the backup is removed and the live store is unchanged. A count of zero also + removes it. + +Probe (`probe2`, this shape over the 57f85acd sources). The first run over `b'53'`, `b'5'` and an unlisted type +gives 53 and 5, keeps the unlisted bytes, and keeps the JSON in the backup. A second identical call raises +`FileExistsError` and leaves the live bytes unchanged. A push between the read and the swap (the s2 interleave) +is refused, with the backup removed and the live store holding the writer's JSON record. A validate that raises +`AssertionError` is named by class and the backup is removed. + +What remains and is stated: the window between the compare and the rename, closed by the lock in `5a`. The +precondition is to stop every writer, as it is for SQLite's offline tools. If someone deletes the backup and then +reruns the migration on its own output, P10 recurs. The README says to delete the backup only after the +migrated store has been opened, and never to rerun after that. + +P13. **Float32 keys.** `Float32(0.1).value` is `0.1`, so a `Float32` key is not rounded until it is packed. +Decoded, it is the float32-rounded value. Writing `{1, F32(1.0)}`, `{True, F32(1.0)}`, `{1.5, F32(1.5)}` or +`{0, F32(-0.0)}` produces bytes that the codec's own decode refuses as `duplicate_map_key`. `{0.1, F32(0.1)}` and +two NaN keys read back as two keys. The rule that matches decode exactly compares each key's decoded image (a +`Float32` key's image is `struct.unpack('>f', struct.pack('>f', v))[0]`) and refuses a collision on write as +`duplicate_map_key`. The reference reads all four collision maps as two keys (Soul s2 KEYPROBE). Python cannot, +for the same reason it cannot read `{1, 1.0}`, which is the residual already recorded. Refusing on write keeps +Python inside what it can read back, and it is the write half of that residual. + +### Revision 4 + +Imagination pass `imagination-py-msgpack-r4`, session `self-2026-10-14-eureka`, against `hands/py-msgpack-default` +at `a59bbc7d`, under ruling `py-migration-shape-ruled` (convert-to-new-file). Source reads only; nothing was run. + +P14. **The shape ruled.** `convert(source, destination, definitions, *, source_codec=JSON_PAYLOAD_CODEC) -> int` +replaces `migrate_payloads`. It creates `destination` with exclusive create (`open(path, "xb")`) before it reads +anything, so an existing file (the source itself, an earlier output, anything) is refused and left alone. It reads +the source once through the source store's `pull_all`, rewrites the listed records in memory, writes the store +bytes into the file it created, and fsyncs it. Any failure after the create removes that file. It never opens the +source for writing. The destination is the same store kind as the source, and its bytes come from the same +per-kind encoder `_replace_all` uses, so the two writers cannot drift. The caller stops writers, converts, opens +the new file and swaps it in. This follows SQLite `VACUUM INTO` and LMDB `mdb_env_copy` (P12) without the backup +role that r3 added to them. + +P15. **What the shape makes impossible, and what stays.** The library no longer writes a live store during a +format change. That leaves no code to fix for s2's `migrate-races-concurrent-writer` or s3's +`inflight-writer-strands-migration`, `rerun-guard-is-per-backup-path` and `stopped-migration-has-no-recovery`, +because the backup, the compare and the swap are deleted. The library does not lose a write made during +`convert`. The write lands in the source, and only the caller's swap can drop it. The README makes stopping +writers the caller's precondition, as SQLite's offline tools do. A killed run leaves the source intact and possibly +a partial destination; recovery is to delete the destination and run again. A partial JSON Lines destination can +parse as a smaller store, so the README says the destination is complete only once `convert` has returned. +Converting a store that is already MessagePack can still produce wrong values in the destination (P10: `b'5'`), +but the source is untouched. The cross-process store lock (follow-up `py-ts-store-cross-process-lock`) is still a +store parity gap, but nothing in this cut waits on it. + +P16. **The codec decodes only what it writes.** At `a59bbc7d`, `MESSAGEPACK_PAYLOAD_CODEC.decode` is `_unpack_tree` +alone. It returns trees 257 or more deep, `ExtType` values, and timestamps outside .NET `DateTime` (Soul s3); the +definition or the reference refuses every one of them. Revision 4 also runs the write check over the decoded tree +(`_check_carried`, renamed from `_check_writable`). That gives one rule in both directions. The depth walk, the +integer range and the key kinds apply as before. No `ExtType` node is carried (code `value_kind`, kind `ext`). +A timestamp's seconds must lie within `-62135596800..253402300799` (code `timestamp_out_of_range`). That interval +is `DateTime.MinValue` to `DateTime.MaxValue`. It is derived from MessagePack-CSharp's timestamp reader, which adds +the seconds to the Unix epoch and then the nanoseconds as ticks. It was not measured at the seam here, and a +C#-written seam row belongs to follow-up `leaf-vectors-next`. The store's whole-file read keeps `_unpack_tree` +alone, because a store frame is not a payload. The `any` leaf keeps its own ext refusal, which is the slot's rule +for a value handed to it directly. + +P17. **NaN keys.** The reference holds a map's keys in a `Dictionary` keyed by CLR type and value, where a NaN +equals a NaN of the same width. It therefore refuses two float64 NaN keys and accepts a float64 NaN beside a +float32 NaN (Soul s3). Python reads both widths as one `float` and cannot tell them apart. Revision 4 gives +`_key_image` one NaN image, used by `_checked_map` on read and by `_check_carried` on write. Any two NaN keys are +refused both ways as `duplicate_map_key`. On the mixed-width pair this refuses something the reference accepts, +the same kind of residual as `1` beside `1.0`. The other choice would read two float64 NaN keys that the +reference refuses. + +Revision 5 records this as a deliberate exception to ruling `leaf-acceptance-follows-reference`, because Python +cannot tell the two widths apart (msgpack-python decodes both to one `float`) and no ruling lets the codec read a +pair the reference refuses. Soul s4 probed the C# behaviour: `Dictionary{float.NaN, double.NaN}` +serialises as `82 ca ffc00000 01 cb fff8000000000000 02`, the reference reads it back as two keys, and cultcache-py +refuses it on read as `duplicate_map_key` (base `a59bbc7d` accepted that read). Every same-width NaN pair, with +equal or different payload bits and with +NaN beside -NaN, is refused by both runtimes. The exception lives where a +consumer reads it: the cultcache-py README's Wire Parity section, pinned by a test vector (the bytes above). + +## D. cultcache-rs decode stack safety (cut `decode-stack-safety`) + +Pinned base: `origin/main` at `ae6ef5a8` (2026-10-14). Imagination pass `imagination-decode-stack`, session +`self-2026-10-14-eureka`. Ruling `decode-stack-mechanism-ruled` (grow-stack); prior art +`docs/research/decode-stack-safety.md`. Probes live under the session scratchpad, `imagination-decode-stack/`: +`probe` decodes through a scratch copy of cultcache-rs at the base whose derive calls a hook per derived level +(off, observe the stack used between levels, or `stacker::maybe_grow`), against Eve's `thing-contract` at +`2467e1b`; `wasmprobe` is the wasm run. Yggdrasil rust image (rustc 1.95.0, rmp-serde 1.3.1, serde_stacker +0.1.14, stacker 0.1.25, psm 0.1.32), jobs `job1` to `job5`. None of it is committed. + +Shapes: `box` is a thing-contract Box chain (3 containers a level, the bound admits 83), `repeat` a Repeat chain +(2 a level, admits 125), `fat` a 32-slot record of `[u64; 32]` with an `Option>` slot (1 a level, +admits 255, so the leaf arrays sit at depth 256), `json` a one-slot record holding a `serde_json::Value` nested +255 arrays, `ignored` a one-slot record whose extra trailing slot nests 255 arrays (skipped as `IgnoredAny`). + +### Body facts + +D1. **Today's abort, reproduced.** `decode_payload` at the bound, first level that aborts (process abort, no +exit code, every time): + +| Profile, thread | box (83) | repeat (125) | fat (255) | json, 64 KiB | ignored, 32 KiB | +|---|---|---|---|---|---| +| release, 1 MiB | 44 | 56 | 13 | 115 | 24 | +| release, 2 MiB | ok | 114 | 25 | | | +| debug, 1 MiB | 11 | 14 | 5 | 15 | 8 | +| debug, 2 MiB | 23 | 30 | 10 | | | + +One level past the bound is refused typed (`PayloadTooDeep { depth: 257, limit: 256 }`) for every shape and +every variant, before any recursion. + +D2. **Recursion points.** Per container level a typed decode passes through: the derive's generated +`Deserialize::deserialize` (`cultcache-rs-derive/src/lib.rs:294-330` for slots, `534-684` for unions), which +calls `deserialize_tuple`; rmp-serde's `Deserializer::any_inner` (`decode.rs:530`), which calls +`visitor.visit_seq`/`visit_map`/`visit_newtype_struct` under `depth_count!` (566, 583, 616); the derive's +`visit_seq`, whose frame holds one `Option` per slot; and `next_element`, which re-enters either a derived +type, serde's own impls (`Vec`, `Option`, `Box`) or another crate's (`serde_json::Value`, `rmpv::Value`). +rmp-serde 1.3.1 has no skip of its own: `IgnoredAny` goes through `any_inner` and a visitor like any value. +`check_payload_depth` is iterative. + +D3. **Where the grow must sit.** A `maybe_grow` in the derive's `deserialize` covers derived levels only: `json` +on a 64 KiB debug thread still aborts at 15 with a 32 KiB red zone, and passes only when the first derived +level happens to hand it a whole new segment. A `serde_stacker::Deserializer` over rmp-serde at the door checks +at every `deserialize_*` call it forwards (`maybe_grow` at `de.rs:476, 489, 502, 511, 520`), so +rmp-serde's recursion, serde's impls, foreign `Value` types and `IgnoredAny` skips all re-enter through a check: +every shape passes in both profiles (D4). Consumers decode non-derived recursive types through the door today: +cultnet-rs `replication.rs:525` (`serde_json::Value`) and `contracts.rs:607` (`rmpv::Value`). + +D4. **The frame between checks, measured.** Stack used from one derived `deserialize` to the next nested one, +at the bound: release box 13,168 B, repeat 12,192 B, fat 84,944 B; debug box 52,064 B, repeat 49,760 B, fat +207,504 B. The door wrapper checks more often, so its gap is smaller: release, every shape passes at a red zone +of 32 KiB on 128 KiB, 1 MiB and 2 MiB threads; debug, box and repeat pass at 32 KiB, fat fails at 128 KiB and +passes at 144 KiB through 256 KiB (1 MiB thread). So the worst gap constructed is between 128 and 144 KiB, +the debug `visit_seq` of the 32-slot record. serde_stacker's defaults (red zone 64 KiB, segment 2 MiB, +`param.rs:10-11`) fail debug fat. The cut sets 256 KiB and 2 MiB: 1.8x the worst measured gap. A type whose +single `visit_seq` frame exceeds the red zone can still overflow; that is documented, not prevented. + +D5. **Same values, same errors.** Through the wrapper, box 83, repeat 125 and a 1,000-node surface decode equal +to the plain decode. The wrapper forwards `is_human_readable` (`de.rs:313`) and returns rmp-serde's own error +type, so `opaque_decode_error` and the derive's refusal texts are unchanged. + +D6. **Cost.** No growth (release, repeat 125 on an 8 MiB thread): 322-339 us through the wrapper against 320 us +plain. A shallow 27 KB, 1,000-node surface on 1 MiB: 1.57 ms plain, 1.61-1.80 ms wrapped (run-to-run noise is +about that wide). When the decode does grow, it pays for faulting in fresh segment pages: repeat 125 on a 1 MiB +thread 1.5-1.7 ms; fat 255 on 1 MiB 25 ms against 9.3 ms on a 64 MiB thread. A 1 MiB and a 2 MiB segment cost +the same. + +D7. **Windows x86_64: source read, not run.** stacker 0.1.25 does not use psm on Windows: `backends/windows.rs` +grows by fibers (`ConvertThreadToFiber`, `CreateFiber`, `SwitchToFiber`, `SetThreadStackGuarantee`), reads the +limit with `VirtualQuery`, and links a C helper built by `cc`. psm's README marks its own Windows stack switching +disabled; that is the other layer, so the research's conflict (C) is two layers, not a contradiction. Yggdrasil +has no Windows: the rust image carries `x86_64-pc-windows-gnu` (cross-compile, no run). Whether it actually grows +on Starfire is question `decode-stack-windows-check`. + +D8. **wasm32: stacker is not a no-op.** psm's `build.rs:53` ships a precompiled `wasm32.o` and sets +`switchable_stack`; stacker then allocates segments from the global allocator with no guard page +(`alloc_stack_restore_guard.rs`). `remaining_stack()` is `None` on wasm, so the first check always grows and +the limit is known from then on. Under wasmtime 48.0.5 (wasm32-wasip1, release), a nested 9-slot record: plain +decodes 48 levels and traps at 64 ("out of bounds memory access" at `0xffffe510`: the stack-first shadow stack +wrapped below zero); wrapped decodes 64, 255, 400 and 600 levels (linear memory 1,088 KiB before, 8,896 KiB +after 255) and traps at 1,000 with "call stack exhausted", the engine's own stack, which stacker cannot grow. +`wasm32-unknown-unknown` builds. This corrects the ruling's premise that wasm keeps the abort: the shadow stack +grows and the engine stack is the host's setting, so the documentation says that instead. + +D9. **Dependency.** `serde_stacker` 0.1.14 (dtolnay), pulling `stacker` 0.1.25 and `psm` 0.1.32 (rust-lang), +all `MIT OR Apache-2.0`; plus `cfg-if`, `libc`, `cc` (build) and `windows-sys` on Windows. psm assembles and +stacker compiles C at build time, so a C toolchain becomes a build requirement (gcc in the rust image, MSVC on +Starfire). cultcache-rs is MIT. Written by hand, the wrapper would be serde_stacker's ~650 lines of forwarding. + +### Body facts, revision 2 (verdict `cut-decode-stack-safety.s1`) + +Imagination pass `imagination-decode-stack-r2`, session `self-2026-10-14-eureka`, on branch +`hands/decode-stack-safety` at `2505c0c4`. Probes live under the session scratchpad, +`imagination-decode-stack-r2/` (`gen.py`, `gen2.py`, `driver*.rs.in`, jobs `jobP1` to `jobP4`), run on Yggdrasil +in the rust image (rustc 1.95.0). None of it is committed. `jobP1` patches a copy of serde_stacker 0.1.14 so +each of its five `maybe_grow` calls (`de.rs:476-520`, the wrapper visitor's container entries) records the +stack pointer, and reads the door's red zone and segment from the environment. Shapes: `wide` is the committed +`Wide32` (32 slots of `[u64; 32]`, 8 KiB inline); `bigN` is 32 slots of an N-array record (32·N KiB inline: +32, 64, 128, 256 KiB), each with an `Option>` slot; `lim` is 31 slots of a 2-array record (15,880 B). +A caller is one `#[inline(never)]` function holding the `Result`. + +D10. **The gap between checks is linear in the record's inline size.** Stack used between two consecutive +checks, the worst over a 6-level decode on a 1 GiB thread (every gap in a shape is the same value): + +| Shape (inline) | wide (8 KiB) | big4 (32) | big8 (64) | big16 (128) | big32 (256) | +|---|---|---|---|---|---| +| debug gap | 115 KiB | 451 | 899 | 1,795 | 3,587 | +| debug frames before the first check | 131 KiB | 515 | 1,027 | 2,051 | 4,099 | +| release gap | 48 KiB | 192 | 384 | 768 | 1,536 | +| release frames before the first check | 48 KiB | 192 | 384 | 768 | 1,536 | + +So the gap is 14·S + 3 KiB in debug and 6·S in release, for S = `size_of` of the record entered: the frames +between a container check and the next one each hold the record being built or a `Result` of it (rmp-serde's +`any_inner`, the wrapper visitor, the derive's `visit_seq` with one `Option` per slot, the seed). D4's 128-144 +KiB debug gap for `fat` is this line at 8 KiB plus a margin. The stack touched below the deepest check is 6 KiB +in debug and 0 in release, so the excursions between checks are the gaps above. + +D11. **Why the thread size decided, in two ways.** (a) Before the first check the decode has already used the +second row of D10: `rmp-serde`'s `deserialize_tuple`, `any_inner` and the wrapper's frames sit between +`decode_payload` and the wrapper's first `maybe_grow`, and each holds `Result`. A thread smaller than that +row aborts whatever the red zone: `wide` aborts on every thread up to 144 KiB in debug. (b) Mid-decode, a check +with between R and the gap remaining lets the next gap overrun; after the first grow the positions in each +segment are fixed, so which check first grows (set by the thread size) decides, which is the non-monotonic +pattern Soul measured. Thread sweeps at the bound (threads from 64 KiB in steps of a 64th of the span, plus +1, 1.5, 2, 3, 4 and 64 MiB): + +| Profile, shape | R = 256 KiB | R = gap - 48 KiB | R = gap rounded up + 64 KiB | +|---|---|---|---| +| debug wide | 6 of 65 sweep threads abort (64-144 KiB); none at 1-64 MiB | all 65; and at 1-4 MiB | 6 (64-144 KiB); none at 1-64 MiB | +| debug big4 | 39 of 65; and at 1.5, 2, 3, 4, 64 MiB | 29; and at 2, 64 MiB | 24, the lowest from 64 KiB; none at 1-64 MiB | +| release wide | none | 14, spread from 112 to 864 KiB; and at 1, 4 MiB | none | +| release big4 | 9 (64-192 KiB) | 18, including 448-480 KiB | 9 (64-192 KiB) | +| release big8 | 40; and at 1.5, 2, 3, 64 MiB | 20; and at 1.5 MiB | 17, the lowest from 64 KiB; none at 1-64 MiB | + +With R at least the gap, the abort counts match the threads smaller than the frames before the first check +(D10's second row plus the harness) in every shape and profile, big16 and big32 included (segments 4·R); with +R below the gap, threads well above those frames abort mid-decode. + +D12. **Checking at the top of the door** (`jobP4`). `decode_payload` patched so its whole body runs inside +`stacker::maybe_grow(R, segment, ..)` before the walk and the wrapper, R = 512 KiB, segment 2 MiB. Every +thread from 24 KiB to 1 MiB in 8 KiB steps, then 1.5, 2, 3, 4, 8 and 64 MiB: + +| Profile | wide (8 KiB), 1 level | wide, 255 levels | lim (15,880 B), 1 level | lim, 254 levels | +|---|---|---|---|---| +| debug: smallest thread that decodes | 40 KiB | 40 KiB | 72 KiB | 72 KiB | +| release: smallest thread that decodes | 24 KiB | 24 KiB | 40 KiB | 40 KiB | + +No thread at or above the smallest one aborts, in any of the four columns, in either profile. lim's gap is +220 KiB in debug and 93 KiB in release (D10's lines give 220 and 93), so R = 512 KiB is 2.3 times the debug +gap of a record at 16 KiB. What a thread needs is now the caller's own frames, which hold the returned value +and do not depend on the payload's depth. + +D13. **No red zone or placement removes the bound.** Every frame that holds a value of type T sits between the +check before T's container and the check inside it, and serde's own impls add frames that hold T before T's +first check: `Box`'s `Deserialize` holds the `Result` it boxes, and the `Option` check before it sized +nothing larger than a pointer. A per-type red zone (a forked wrapper sized by `size_of::()`, or a +grow in the derive sized by `size_of::()`) still leaves that frame of about one to three T outside any +sized check. So the stack a decode needs between checks is bounded only by bounding the inline size of the +records it builds. The derive is the one place that sees every record type it produces: a `const` assertion on +`size_of::()` refuses an oversized record at compile time. A field of a type the derive did not produce +(a fixed array of arrays, a large tuple, a plain serde struct) behind a `Box` or `Vec` is not reached by it. + +D14. **Build closure and wasm, measured by Soul (`soul-decode-stack-s1` jobD, `cargo tree -e normal,build` +at `2505c0c4` against `ae6ef5a8`).** Added on `x86_64-unknown-linux-gnu`: serde_stacker 0.1.14, stacker 0.1.25, +psm 0.1.32, cc 1.8.0, find-msvc-tools 0.1.14, shlex 2.0.1, object 0.39.1 (`Apache-2.0 OR MIT`), all +`MIT OR Apache-2.0` except ar_archive_writer 0.5.3 (`Apache-2.0 WITH LLVM-exception`, build-only, via psm). +On `x86_64-pc-windows-msvc` the same plus libc 0.2.190 and windows-sys 0.61.2 (`MIT OR Apache-2.0`, beside the +crate's own windows-sys 0.59). `fs2 0.4` (8 call sites in `lib.rs`, the store's file locks) has no wasi +backend, so cultcache-rs does not build for `wasm32-wasip1`; D8 measured serde_stacker in a separate crate. + +### Authority, and why + +The door owns stack safety as it owns the bound: `decode_payload` runs the bound walk, then rmp-serde through +`serde_stacker::Deserializer` with two private constants. The ruling's "every container level the derive and the +door descend through" is met there, because every derived level is entered through the wrapper (D3); a +`maybe_grow` in the derive would be a second owner of the same check, needs a red zone of 128 KiB in release +and 256 KiB in debug for fat where the wrapper needs 32 and 144 KiB (D4), and still misses foreign recursive types. The derive is unchanged. + +Revision 2 (D10-D13): the door's first act is a check, so no frame holding T precedes it, and the red zone is +set against the gap of the largest record the derive may produce. That size is a public constant the derive +asserts at compile time, because nothing at decode time can bound a frame that holds a T before T's own check +(D13). The thread's size then decides nothing beyond the caller's own frames, which hold the returned value +whatever the payload's depth (D12). Envelope and store decodes enter through the same grown decoder, without +the payload walk, so what they accept is unchanged. rmp-serde's 1024 counter stays a backstop that never decides. Callers that decode a payload with +`rmp_serde::from_slice` directly bypass the door, the bound and the grow alike; cultnet-rs re-decodes +door-checked `rmpv::Value`s that way (follow-up `rs-redecode-outside-door-r2`). + +Rejected inside the ruling: the derive placement (above), and writing the wrapper by hand (D9: established +tooling, one owner upstream). + +## Observed, not owned by these cuts + +- At the default tolerance the solver's answer on allocator-shaped problems depends on the start by up to the whole + box (B6). That is documented and pinned (`AnAllocatorShapedProblemIsStartIndependentAtATightTolerance`); a + consumer that needs one answer passes a tight tolerance, as Aetheria does. diff --git a/docs/cultlib-gaps-target.md b/docs/cultlib-gaps-target.md new file mode 100644 index 00000000..bace5db8 --- /dev/null +++ b/docs/cultlib-gaps-target.md @@ -0,0 +1,32 @@ +# CultLib Gaps: Target + +Date: 2026-10-09. Campaign `cultlib-gaps` in the Eureka mind. + +## Why + +Consumers of CultLib keep finding capabilities a reasonable consumer of a general +library would expect and that CultLib lacks. Doctrine says a gap is filled in its +owner, never worked around in the consumer. This campaign is the standing home for +those gaps, so each one lands in CultLib as a small cut instead of a local helper in +whichever project hit it. + +Known gaps at opening (each a follow-up in the mind, owned by the consumer campaign +that found it): + +- CultMath `BoundedLeastSquares.Solve` has a fixed KKT tolerance (1e-6); Aetheria's + thrust allocator needs a tighter one (`aetheria-release:follow_up:cultmath-bls-kkt-tolerance`). +- `cultcache-rs` has no decimal type, its snapshot reads follow symlinks, and its + single-file store stages files with the process umask and no mode option + (`eureka-body:follow_up:cultcache-rs-decimal-and-nofollow`). + +## Invariants + +- `owner-fills-gap`: a capability a consumer needs from CultLib is added to CultLib, with the consumer adopting it; no consumer-local copy survives the cut that adds it. +- `defaults-unchanged`: a new option defaults to today's behaviour; existing callers and stored bytes do not change. +- `wire-parity`: a CultCache wire change keeps byte parity across runtimes against the C# reference, with a cross-runtime fixture. +- `semver-measured`: a public API change bumps the package version by measured semver and ships as a tagged release consumers can pin. + +## Not in scope + +- Growing CultCache into a general database (memory `cultcache-scope-restraint`). +- Any consumer's adoption code beyond the pin bump; that stays in the consumer's campaign. diff --git a/docs/cultmath-interval-ground-cut-glsl-lowering.r2.spec.json b/docs/cultmath-interval-ground-cut-glsl-lowering.r2.spec.json new file mode 100644 index 00000000..4416b4c2 --- /dev/null +++ b/docs/cultmath-interval-ground-cut-glsl-lowering.r2.spec.json @@ -0,0 +1,201 @@ +{ + "campaign": "cultmath-tapes", + "cut": "glsl-lowering", + "revision": 2, + "title": "GLSL lowering r2: Phacelle as its own MPL-2.0 file so CultMath.glsl is MIT, notices corrected, iv_exp in the fixture, fixture regenerated, glslang and dxc run", + "repo": "GameCult/CultLib", + "branch": "hands/cultmath-glsl-lowering", + "base": "3ac7250a", + "depends_on": [ + "interval-ops" + ], + "first": [ + "Follow-up on cut report cultmath-tapes:cut_report:cut-glsl-lowering.h1 (range c9bd003b..5ae207e8, no verdict yet; worktree F:\\Projects\\CultLib-glsl). Rulings in force: operator-split-phacelle, operator-compiler-downloads, self-exp-measure-in-site. Map: docs/cultmath-interval-ground-cut.md, 'Pass 3'. First commit: MERGE 3ac7250a (interval-ops r3's head, which Soul s2 found holds for everything this cut lowers) into hands/cultmath-glsl-lowering. Do not rebase: the branch is pushed, and the git rules forbid force-pushing a shared branch. Probed by Imagination in a scratch clone: the merge conflicts only in packages/cultmath/README.md. Resolve it by keeping r3's Intervals bullet (iv_frustum_ball, its rounding bound, the envelope), then r1's GLSL bullet, so the GLSL bullet sits at :48-53. design.md and HlslSourceCompatibilityTests.cs merge clean.", + "Second commit: regeneration alone (CULTMATH_WRITE_GLSL=1). Probed on the merge: CultMath.glsl gains 15 lines (cultmath_iv_frustum_ball with the r3 widening); the fixture does not change until this revision adds its families; GlslMirrorTests 4/4 and HlslSourceCompatibilityTests green (16 tests). Soul's range is 3ac7250a..HEAD, which carries r1's four commits through the merge, so the whole lowering gets its first verdict. Runs in parallel with interval-ops r4: r4 changes no src, HLSL or README, only NoiseBoundTests.cs and design.md's saving section (:475-512 at 3ac7250a, :533-570 after this merge), disjoint from this cut's :136-193. Do not merge r4's head into this branch.", + "The split (operator-split-phacelle). Transformation step 1 becomes: each #include is inlined in place, except an include whose file is under its own licence, which is lowered on its own into its own output file. The list of such includes is one table in GlslLowering, SeparateFiles = { \"CultMath.Phacelle.hlsl\" -> \"CultMath.Phacelle.glsl\" }, with the reason beside the entry (file-level MPL-2.0). That is an enumerated rule of the lowering, documented as step 1 in design.md; it is not a per-function special case, and nothing else is keyed by name. Lower(root) returns the two texts; Lower(string) stays for the inlined body if that is simpler, but there is one resolver (ReadShaderSource, generalised to accept the include predicate), never a second.", + "shaders/CultMath.glsl: the provenance line says it is generated from CultMath.hlsl and CultMath.Interval.hlsl, MIT, and that cultmath_phacelle is in CultMath.Phacelle.glsl, to be concatenated after this file by consumers that call it. The dropped include line leaves nothing behind. shaders/CultMath.Phacelle.glsl: its own provenance line (generated from CultMath.Phacelle.hlsl, MPL-2.0, requires CultMath.glsl before it), the MPL-2.0 header and attribution exactly as the HLSL carries them, the CultPhasor struct and cultmath_phacelle, guard CULTMATH_PHACELLE_GLSL. Both files pinned by CommittedGlslEqualsLowering; CULTMATH_WRITE_GLSL=1 writes both.", + "Pin tests over both files: NoHlslOnlyTokensSurvive runs on each; EveryPublicFunctionIsLowered takes the union of both files' definitions against the HLSL (minus texture samplers) and additionally asserts cultmath_phacelle and CultPhasor appear only in the Phacelle file; a new PhacelleFileCompilesOnlyAfterTheLibrary is not needed, the compile check below proves it.", + "The fixture (self-exp-measure-in-site). The site measures WebGL2 exp against the fixture, so iv_exp joins it; its C# bits come from the platform exp and differ by OS, so its entry carries tolerance \"ulp-bounded, platform exp\" and names the OS that generated it. GoldenFixtureMatchesCSharp parses the committed JSON (System.Text.Json, BCL) and compares family by family: text-equal for every family except those whose tolerance names the platform, which compare case by case within 1 ulp and print the maximum observed. One fixture, one writer, one tolerance field already in the format; no second fixture. The phacelle family stays in the fixture; the site's parity harness concatenates both GLSL files for that run (the site ships only CultMath.glsl), say so in design.md.", + "Notices: packages/cultmath/THIRD-PARTY-NOTICES.md :35-43 lists the MPL-2.0 files as math.Phacelle.cs, CultPhasor.cs, CultMath.Phacelle.hlsl with its Unity copy, and shaders/CultMath.Phacelle.glsl; CultMath.glsl is MIT and says so in its header. The package licence expressions (MIT AND MPL-2.0) do not change: the NuGet still ships the HLSL include. README :36-37 and :48-53 (after the merge) name both GLSL files and when a consumer needs the second. design.md :136-192: step 1 rewritten, the second file, the wrapper runs, the fixture's platform tolerance. Unity ships neither GLSL file.", + "Compile checks on Starfire (operator-compiler-downloads), one job each, detached with a log, polled in the foreground: tools/get-glslang.ps1 (16.6.0, the pinned SHA already in the script; if the published digest differs, stop and report, do not edit the pin to match); tools/compile-glsl.ps1 gains a -Phacelle switch and runs twice: the MIT-only wrapper over CultMath.glsl calling every function in it, and the full wrapper over both files calling every function including cultmath_phacelle. Negative controls, both must fail: -Body 'float x = lerp(0.0, 1.0, 0.5);' and the MIT-only wrapper with -Body calling cultmath_phacelle (proves Phacelle is not in CultMath.glsl). Then tools/get-dxc.ps1 and dxc -T lib_6_3 -HV 2021 on both HLSL copies, exit 0. The browser-pane WebGL2 probe of r1 is repeated on the two-file wrapper.", + "Carried from r1 and still out of scope, name them in the report: the fixture's ulp bounds on WebGL2 are measured by the site cut; Stryker is not re-run unless packages/cultmath/src changes in 3ac7250a..HEAD (it should not; the lowering lives in tests; interval-ops r3's Stryker evidence, Soul s2, stands). Deviations r1 reported that stand: the anchored token regex; the iv_exp absence is now resolved by this revision; the HLSL edits (damp splat, pcg3d order) stay." + ], + "deletes": [ + { + "path": "packages/cultmath/shaders/CultMath.glsl", + "lines": 100, + "note": "the inlined Phacelle block (:510-612 at 5ae207e8: MPL header, CultPhasor, cultmath_phacelle) leaves this file; it is regenerated, not edited." + }, + { + "path": "packages/cultmath/THIRD-PARTY-NOTICES.md", + "lines": 3, + "note": ":39-41 the sentence making CultMath.glsl MPL-2.0 as a whole." + } + ], + "keeps_moves": [ + "Transformation steps 2-9 and their order: unchanged; the cast scanner, saturate lowering, the guard and provenance mechanism stay.", + "Both tracked CultMath.hlsl copies stay one blob; no HLSL edit is expected in this revision (a dialect gap found by the two-file compile is fixed in the HLSL in the common subset, bit-identical, listed in the report).", + "HlslSourceCompatibilityTests' mirror and FindCultMathRoot: the resolver generalises in place; no second include resolver.", + "tests/CultMath.Tests/fixtures/glsl-parity.json: the same file, regenerated; families keep their order so the diff shows only the two additions." + ], + "adds": [ + "packages/cultmath/shaders/CultMath.Phacelle.glsl: generated, MPL-2.0, guard CULTMATH_PHACELLE_GLSL.", + "GlslLowering: the SeparateFiles table and the two-text Lower; GlslMirrorTests: the second file in CommittedGlslEqualsLowering, NoHlslOnlyTokensSurvive and EveryPublicFunctionIsLowered; GoldenFixtureMatchesCSharp's per-family comparison with the platform tolerance.", + "fixture families: cultmath_iv_frustum_ball (exact) and cultmath_iv_exp (ulp-bounded, platform exp).", + "tools/compile-glsl.ps1: -Phacelle switch (appends CultMath.Phacelle.glsl after the library and includes cultmath_phacelle in the calls).", + "design.md and README: the two files, the concatenation order, the fixture tolerance." + ], + "file_changes": [ + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/GlslLowering.cs", + "line": 24 + }, + "change": "Lower takes the root (or the resolver's two texts) and returns both outputs; SeparateFiles table with the MPL reason; ProvenanceLine per file." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs", + "line": 320 + }, + "change": "ReadShaderSource accepts a predicate (or returns the separated include's text beside the inlined body); the C# mirror keeps inlining everything." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.cs", + "line": 30 + }, + "change": "CommittedGlslEqualsLowering over both files; :45 NoHlslOnlyTokensSurvive over both; :54 EveryPublicFunctionIsLowered union plus the phacelle-only-in-its-file assertion; :64 GoldenFixtureMatchesCSharp per family with the platform tolerance." + }, + { + "location": { + "path": "packages/cultmath/tools/compile-glsl.ps1", + "line": 1 + }, + "change": "-Phacelle switch; the library text is CultMath.glsl, plus CultMath.Phacelle.glsl when set; the call list covers whichever functions are present." + }, + { + "location": { + "path": "packages/cultmath/THIRD-PARTY-NOTICES.md", + "line": 35 + }, + "change": "MPL-2.0 file list: the two C# files, the HLSL include and its Unity copy, shaders/CultMath.Phacelle.glsl. CultMath.glsl is MIT." + }, + { + "location": { + "path": "packages/cultmath/README.md", + "line": 48 + }, + "change": "both GLSL files; a consumer concatenates CultMath.Phacelle.glsl after CultMath.glsl only when it calls cultmath_phacelle." + }, + { + "location": { + "path": "packages/cultmath/docs/design.md", + "line": 150 + }, + "change": "step 1 rewritten for the separated include; :182-192 the two wrapper runs and the fixture's platform tolerance; the site's parity run concatenates both files." + } + ], + "authority_map": { + "owner": "GlslLowering owns the HLSL -> GLSL transformation and now emits two derived files, one per licence; both are pinned by GlslMirrorTests and never edited. The fixture stays owned by GoldenFixtureMatchesCSharp with one tolerance field per family. THIRD-PARTY-NOTICES.md states which files are MPL-2.0 and is the one place that does.", + "inputs": [ + "shaders/CultMath.hlsl, CultMath.Interval.hlsl and CultMath.Phacelle.hlsl text at the merged head (3ac7250a merged into the branch)", + "C# math for the fixture values, including the platform exp for iv_exp" + ], + "outputs": [ + "shaders/CultMath.glsl (MIT) and shaders/CultMath.Phacelle.glsl (MPL-2.0)", + "tests/CultMath.Tests/fixtures/glsl-parity.json with cultmath_iv_frustum_ball and cultmath_iv_exp families" + ], + "derived_state": [ + "both GLSL files are derived; a hand edit to either fails CommittedGlslEqualsLowering", + "the fixture is derived from C#; the iv_exp family is derived from the generating platform's exp and compared within 1 ulp, every other family bit for bit" + ], + "forbidden_writers": [ + "no per-function special case in the lowering; the only name-keyed rule is the SeparateFiles table, one entry, licence-justified", + "no second include resolver, no PowerShell or JS copy of the transformation", + "no GLSL in the Unity package; no precision statement in either library file", + "no edit to the pinned glslang or dxc hashes to make a download pass" + ], + "shared_paths": [ + "the same dotnet test run pins the C# mirror, both GLSL files and the fixture", + "compile-glsl.ps1 is the one wrapper writer for the MIT-only run, the two-file run and both negative controls" + ], + "deletion_line": "The Phacelle block leaves CultMath.glsl by regeneration and the MPL sentence leaves the notices before the new file is added. Net: one more generated file and one switch; what it buys is an MIT CultMath.glsl the site can vendor without carrying MPL text, and the compile checks r1 could not run." + }, + "verification": { + "builds": [ + "Yggdrasil: dotnet test packages/cultmath/tests/CultMath.Tests green on the merged branch; paste counts; GlslMirrorTests 4/4 with the per-family fixture line printed", + "Starfire: tools/get-glslang.ps1 installs 16.6.0 with the pinned SHA matching; tools/compile-glsl.ps1 exits 0 on the MIT-only wrapper and on -Phacelle; both negative controls fail with the error quoted", + "Starfire: tools/get-dxc.ps1 then dxc -T lib_6_3 -HV 2021 on both HLSL copies, exit 0; FXC cs_5_0 still green", + "Browser pane WebGL2: the two-file wrapper compiles with an empty log" + ], + "tests": [ + { + "name": "GlslMirrorTests.CommittedGlslEqualsLowering", + "pins": "CultMath.glsl and CultMath.Phacelle.glsl are exactly the lowering of the committed HLSL; the regeneration path is the same code." + }, + { + "name": "GlslMirrorTests.EveryPublicFunctionIsLowered", + "pins": "the union of both files equals the HLSL's cultmath_* set minus texture samplers; cultmath_phacelle and CultPhasor live only in the Phacelle file." + }, + { + "name": "GlslMirrorTests.NoHlslOnlyTokensSurvive", + "pins": "no HLSL-only token in either file." + }, + { + "name": "GlslMirrorTests.GoldenFixtureMatchesCSharp", + "pins": "every family is C#'s current output bit for bit, except iv_exp within 1 ulp of the platform exp; iv_frustum_ball is present and exact." + }, + { + "name": "HlslSourceCompatibilityTests.EveryMirrorFunctionMatchesCSharpMath (existing)", + "pins": "no HLSL edit in this range changed a bit." + } + ], + "negative": [ + { + "pattern": "Mozilla|MPL|Johansen|CultPhasor|cultmath_phacelle\\(", + "scope": "packages/cultmath/shaders/CultMath.glsl: 0 matches; the header's file-name pointer to CultMath.Phacelle.glsl is the only mention of Phacelle." + }, + { + "pattern": "^CultPhasor cultmath_phacelle\\(", + "scope": "packages/cultmath/shaders/CultMath.Phacelle.glsl: exactly 1 match." + }, + { + "pattern": "CultMath\\.glsl|Phacelle\\.glsl", + "scope": "packages/cultmath/unity/**: 0 matches." + }, + { + "pattern": "\\b(float|u?int|bool)[234]\\b|\\blerp\\(|\\bfrac\\(|\\bsaturate\\(|\\brsqrt\\(|\\basuint\\(|\\basfloat\\(|static const|#include|precision (high|medium|low)p", + "scope": "both GLSL files: 0 matches (the anchored regex r1 settled on)." + }, + { + "pattern": "CultMath\\.glsl", + "scope": "packages/cultmath/THIRD-PARTY-NOTICES.md: 0 matches in the MPL-2.0 file list; CultMath.Phacelle.glsl appears there once." + }, + { + "pattern": "git diff 3ac7250a..HEAD -- packages/cultmath/src", + "scope": "empty; the lowering and the fixture live in tests, so interval-ops r3's Stryker evidence (verdict s2) stands for this range." + } + ], + "operator": [] + }, + "estimate": { + "lines_added": 320, + "lines_removed": 130, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": [ + "GLSL ES 3.00 library file (generated, MPL-2.0): shaders/CultMath.Phacelle.glsl" + ], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [ + "cultmath-tapes:ruling:operator-split-phacelle", + "cultmath-tapes:ruling:operator-compiler-downloads", + "cultmath-tapes:ruling:self-exp-measure-in-site", + "cultmath-tapes:ruling:operator-campaign-home" + ], + "questions": [] +} diff --git a/docs/cultmath-interval-ground-cut-glsl-lowering.spec.json b/docs/cultmath-interval-ground-cut-glsl-lowering.spec.json new file mode 100644 index 00000000..1f52e24c --- /dev/null +++ b/docs/cultmath-interval-ground-cut-glsl-lowering.spec.json @@ -0,0 +1,141 @@ +{ + "campaign": "cultmath-tapes", + "cut": "glsl-lowering", + "revision": 1, + "title": "GLSL lowering: shaders/CultMath.glsl is generated from CultMath.hlsl by one enumerated textual transformation, pinned by a test, compiled by glslang, with a committed golden fixture for WebGL2 parity", + "repo": "GameCult/CultLib", + "branch": "hands/cultmath-glsl-lowering", + "base": "c49c76ee", + "depends_on": [], + "first": [ + "Map: docs/cultmath-interval-ground-cut.md, sections 'Where the interval math lives' (route C) and 'The authority map'. Model: the HLSL -> C# mirror in tests/CultMath.Tests/HlslSourceCompatibilityTests.cs (wrapper at :348) and its complete transformation list in packages/cultmath/docs/design.md:92-134. The GLSL lowering follows the same discipline: a complete, enumerated list; anything outside it fails the test rather than being patched around.", + "Read how HlslSourceCompatibilityTests resolves #include \"CultMath.Phacelle.hlsl\" (CultMath.hlsl:506); the GLSL lowering inlines the included file at that line, because GLSL has no #include.", + "Target dialect: GLSL ES 3.00 (#version 300 es), WebGL2. No implicit int/uint -> float conversion; step(vec4, float) and max(vec4, float) differ (max(genType, float) exists, step(genType, float) does not); C-style casts do not exist; lerp/frac/saturate/rsqrt/asuint are mix/fract/clamp(x,0.0,1.0)/inversesqrt/floatBitsToUint; floatN/intN are vecN/ivecN; static const is const. Mixed-signedness shifts are allowed.", + "Where the lowered text does not compile, fix the HLSL into the common subset with a legal, bit-identical HLSL edit (e.g. CultMath.hlsl:114 and :200 step(h, 0.0) -> step(h, float4(0.0, 0.0, 0.0, 0.0)); :471-473 and :502 (float)((uint)hash.x >> 8) before the float multiply). The HLSL -> C# mirror test and the FXC/dxc compiles keep those edits honest. Never special-case the lowering for one function.", + "Casts need a balanced-paren scanner, not a regex: (int)((state >> 28) + 4) at CultMath.hlsl:396 is the case that breaks a regex.", + "Dropped, as the C# mirror drops them: include guards (replaced by CULTMATH_GLSL guards), and the Texture2D/SamplerState functions at CultMath.hlsl:535-573. The GLSL declares no precision; the host shader does (precision highp float; precision highp int; the pcg hashes need 32-bit int).", + "Regeneration: the pin test writes shaders/CultMath.glsl when the environment variable CULTMATH_WRITE_GLSL=1 is set, then asserts equality. No new project, no PowerShell copy of the transformation.", + "Golden fixture: tests export 256 seeded points per function family (snoise float3/float2, snoise_grad, fbm_grad 4 octaves, ridged_grad, cellular, pcg3d/pcg4d, iv_* if present on main by then) with outputs as float32 bit patterns in hex, to tests/CultMath.Tests/fixtures/glsl-parity.json. JSON is tolerated here: the consumer is a browser-pane WebGL2 readback, a xenos boundary. The site cut evaluates it.", + "glslang: tools/get-glslang.ps1 fetches a pinned glslangValidator release the way tools/get-dxc.ps1 does; tools/compile-glsl.ps1 compiles a #version 300 es fragment wrapper that includes shaders/CultMath.glsl and calls every public function once. Run on Starfire, one job, detached with a log, polled in the foreground.", + "Verification on Yggdrasil: dotnet test from packages/cultmath/tests/CultMath.Tests; Stryker --since:c49c76ee from a plain clone (not a linked worktree: Stryker resolves --since paths against the main checkout). Never run verification as a background shell task." + ], + "deletes": [], + "keeps_moves": [ + "Both tracked CultMath.hlsl copies (packages/cultmath/shaders and unity/org.gamecult.cultmath/Shaders) stay one blob; the common-subset edits land in both.", + "The C# mirror test, the FXC probe and dxc -T lib_6_3 -HV 2021 all still pass on the edited HLSL; the Unity package does not ship the GLSL file.", + "design.md's HLSL -> C# transformation list (92-134) is unchanged; the GLSL list is a new sibling section." + ], + "adds": [ + "tests/CultMath.Tests/GlslLowering.cs: the HLSL -> GLSL ES 3.00 transformation, one static function string -> string, with the list as named steps in order: inline includes; drop guards and texture functions; type names; static const; casts via the balanced scanner; intrinsic renames (lerp, frac, saturate, rsqrt, asuint/asfloat); float literal passthrough; guards CULTMATH_GLSL added; a provenance header line naming the source file and that the file is generated.", + "tests/CultMath.Tests/GlslMirrorTests.cs: CommittedGlslEqualsLowering (writes when CULTMATH_WRITE_GLSL=1, prints a unified diff on failure); NoHlslOnlyTokensSurvive (regex over the output for float[234]\\(|int[234]\\(|lerp\\(|frac\\(|saturate\\(|static const|\\((float|int|uint)\\)|Texture2D|SamplerState -> 0 matches); EveryPublicFunctionIsLowered (the set of cultmath_* function names in the HLSL minus the texture ones equals the set in the GLSL); GoldenFixtureMatchesCSharp (regenerates the fixture in memory from C# and asserts equality with the committed file).", + "shaders/CultMath.glsl: the committed generated artifact.", + "tests/CultMath.Tests/fixtures/glsl-parity.json: the golden fixture (seed, points, per-function expected bit patterns, tolerance class per function: exact for integer-hash paths, ulp-bounded for transcendental).", + "tools/get-glslang.ps1 and tools/compile-glsl.ps1, mirroring get-dxc.ps1 / compile-hlsl-spirv.ps1 in shape.", + "packages/cultmath/docs/design.md: a section 'GLSL Target: Source Transformations' after :134 with the complete list, the common-subset rule for HLSL, the regeneration command, and that the GLSL is a derived file never edited by hand.", + "packages/cultmath/README.md: one paragraph that CultMath.glsl exists, what dialect it is, and how a WebGL consumer includes it (string concatenation before its own #version-led source; declare highp)." + ], + "file_changes": [ + { + "location": { "path": "packages/cultmath/shaders/CultMath.hlsl", "line": 114 }, + "change": "step(h, 0.0) -> step(h, float4(0.0, 0.0, 0.0, 0.0)); same at :200. Bit-identical in HLSL and C#." + }, + { + "location": { "path": "packages/cultmath/shaders/CultMath.hlsl", "line": 470 }, + "change": "jitter components and the id at :502: an explicit (float) cast around the shifted uint before the float multiply, so the lowered text has no uint*float." + }, + { + "location": { "path": "packages/cultmath/shaders/CultMath.Phacelle.hlsl", "line": 1 }, + "change": "whatever common-subset edits the glslang compile demands; each one bit-identical, each one listed in the cut report." + }, + { + "location": { "path": "packages/cultmath/docs/design.md", "line": 134 }, + "change": "new section: GLSL Target: Source Transformations." + } + ], + "authority_map": { + "owner": "GlslLowering (tests/CultMath.Tests) owns the HLSL -> GLSL transformation; shaders/CultMath.glsl is its derived output, pinned by GlslMirrorTests. CultMath.hlsl stays the one hand-written shader source.", + "inputs": [ + "shaders/CultMath.hlsl and shaders/CultMath.Phacelle.hlsl text", + "C# math for the golden fixture values" + ], + "outputs": [ + "shaders/CultMath.glsl (GLSL ES 3.00 library, every public cultmath_* function except texture samplers)", + "tests/CultMath.Tests/fixtures/glsl-parity.json" + ], + "derived_state": [ + "CultMath.glsl is derived; a hand edit fails CommittedGlslEqualsLowering", + "the fixture is derived from C#; a stale fixture fails GoldenFixtureMatchesCSharp" + ], + "forbidden_writers": [ + "no per-function special case in the lowering; a dialect gap is fixed in the HLSL in the common subset", + "no second transformation implementation (no PowerShell or JS copy of the rules)", + "no GLSL in the Unity package; no precision statement in the library file" + ], + "shared_paths": [ + "both tracked CultMath.hlsl copies receive the same edits; the existing one-blob rule covers them", + "the same dotnet test run pins the C# mirror, the GLSL pin and the fixture" + ], + "deletion_line": "Nothing is deleted in CultLib. The liability bought is one generated file, one test file, one fixture and two tool scripts; what it retires is every future hand copy of CultMath noise in a GLSL consumer, starting with the site." + }, + "verification": { + "builds": [ + "Yggdrasil: dotnet test packages/cultmath/tests/CultMath.Tests green; paste counts", + "Yggdrasil: dotnet stryker --since:c49c76ee from a plain clone; triage every survivor by name", + "Starfire: tools/compile-glsl.ps1 exits 0 on the wrapper over shaders/CultMath.glsl; a negative-control wrapper with one lerp( call must fail (records that the compile check sees errors)", + "Starfire: FXC cs_5_0 and dxc -T lib_6_3 -HV 2021 still compile both HLSL copies after the common-subset edits" + ], + "tests": [ + { + "name": "GlslMirrorTests.CommittedGlslEqualsLowering", + "pins": "the committed GLSL is exactly the lowering of the committed HLSL; the regeneration path is the same code." + }, + { + "name": "GlslMirrorTests.NoHlslOnlyTokensSurvive", + "pins": "the list is complete: no HLSL-only token survives in the output." + }, + { + "name": "GlslMirrorTests.EveryPublicFunctionIsLowered", + "pins": "no function is silently dropped except the texture samplers." + }, + { + "name": "GlslMirrorTests.GoldenFixtureMatchesCSharp", + "pins": "the fixture the site will read on WebGL2 is C#'s current truth." + }, + { + "name": "HlslSourceCompatibilityTests.EveryMirrorFunctionMatchesCSharpMath (existing)", + "pins": "the common-subset edits changed no bit of any HLSL function." + } + ], + "negative": [ + { + "pattern": "lerp\\(|frac\\(|saturate\\(|float[234]\\(|int[234]\\(|static const|\\((float|int|uint)\\)|Texture2D|SamplerState|#include", + "scope": "packages/cultmath/shaders/CultMath.glsl: 0 matches." + }, + { + "pattern": "precision (high|medium|low)p", + "scope": "packages/cultmath/shaders/CultMath.glsl: 0 matches (the host declares precision)." + }, + { + "pattern": "CultMath\\.glsl", + "scope": "packages/cultmath/unity/**: 0 matches; the Unity package does not ship the GLSL." + }, + { + "pattern": "git diff c49c76ee..HEAD -- packages/cultmath/shaders/CultMath.hlsl | grep '^[-+]' | grep -v '^[-+][-+]'", + "scope": "every changed HLSL line is listed in the cut report with the reason (dialect gap it closes); none changes a value, proven by the mirror test and the existing goldens." + } + ], + "operator": [] + }, + "estimate": { + "lines_added": 1100, + "lines_removed": 8, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": ["GLSL ES 3.00 library file (generated)", "glsl-parity.json fixture"], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [], + "questions": [] +} diff --git a/docs/cultmath-interval-ground-cut-interval-ops.r2.spec.json b/docs/cultmath-interval-ground-cut-interval-ops.r2.spec.json new file mode 100644 index 00000000..7792e114 --- /dev/null +++ b/docs/cultmath-interval-ground-cut-interval-ops.r2.spec.json @@ -0,0 +1,219 @@ +{ + "campaign": "cultmath-tapes", + "cut": "interval-ops", + "revision": 2, + "title": "Interval ops r2: envelope-then-noise fields, scenarios with authored empty space including the void, the tile march on cell ranges, iv_frustum_ball, wasted probes removed, dxc run", + "repo": "GameCult/CultLib", + "branch": "hands/cultmath-interval-ops", + "base": "c9bd003b", + "depends_on": [], + "first": [ + "Follow-up on cut report cultmath-tapes:cut_report:cut-interval-ops.h1 (head c9bd003b, worktree F:\\Projects\\CultLib-iv). Rulings in force: operator-tile-amortized-march (the bound stays; one probe per screen tile), operator-compiler-downloads. The operator's challenge, verbatim in the map's Pass 3 section: r1 measured a uniform noise slab with no empty space to skip, the worst case for intervals, and the density that matters is an analytic envelope (a pre-distortion SDF) modulated by noise, where the envelope's interval is tight and proves whole ray lengths empty in one probe. Map: docs/cultmath-interval-ground-cut.md, 'Pass 3'. r1's ops and bounds stay; this revision touches math.Interval.cs, CultMath.Interval.hlsl (both tracked copies), NoiseBoundTests.cs, design.md and README only.", + "The field, from Aetheria (Volumetric.cginc:165-221 and :91-102; Zone.cs:369-397 GetHeight, :426 PowerPulse; Settings.asset). SDF s(p) = p.y + h(p.xz), h >= 0 the well map: h = PowerPulse(|p.xz| / (2R), 2) * 64 (the zone bowl) + sum over wells of PowerPulse(|p.xz - c_b| / r_b, 16) * d_b, with PowerPulse(x, e) = (1 - 4x^2)^e for x in [0, 1/2] and 0 beyond, r_b = 500 M^0.25, d_b = 30 M^0.175 (Aetheria's GravityRadius/GravityDepth curves). Noise only where s < S: fade(s) = 1 - smoothstep(0.75 S, S, s); displaced height s' = s + A fade(s) n(p) with n the warped two-phase coverage noise plus half the detail octave (r1's field shape); density = max(0, (F - s') / B) (Aetheria's floor: FloorOffset F = -20, FloorBlend B = 10; the patch band and the 1e-9 fill are left out). Above the safety distance density is exactly 0, and so is the noise cost: Aetheria's dense march gates the noise pointwise (`if (dist < _SafetyDistance)`); the test's dense march does the same.", + "The composed bound over a tile's frustum slice [z0, z1], Envelope over the slice's exact box, not the ball: with slopes m in [m_c - s, m_c + s] per axis and z in [z0, z1], y = iv_mul([z0, z1], m_y) and x = iv_mul([z0, z1], m_x) (plus the tile's translation o); h's interval over the xz box is the sum over bowls of [pulse(far), pulse(near)], near and far the least and greatest distance from the box to the bowl's centre (pulse is monotone decreasing in distance, so each term is exact; the only slack is the sum). iv_s = iv_add(y, iv_h); iv_fade = the ordered endpoints of fade over iv_s (monotone); iv_n = iv_snoise_ball(ball.xyz * F0, ball.w * F0) with ball = iv_frustum_ball(..., warp = D); iv_s' = iv_add(iv_s, iv_scale(iv_mul(iv_fade, iv_n), A)); the slice is provably empty iff iv_s'.lo >= F. When iv_fade.hi == 0 the noise term is identically zero and iv_snoise_ball is not evaluated: the envelope alone proves the slice empty at no snoise cost. That short-circuit is what tiles compound.", + "Where the warp lives in the bound. Aetheria warps only the noise argument (triNoise3d(pos + fl * ...)); the surface height is read at the unwarped xz and the displacement is applied to y afterwards. So the envelope is evaluated on the pre-distortion SDF over the unwarped slice (no D), and only the noise ball is enlarged by D (iv_frustum_ball's warp argument). A warp applied to the envelope's argument would be unsound without enlarging the box by D; the field is defined so that it is not. The test EnvelopeBoundEnclosesDensity pins this: 2,000 seeded slices x 64 warped points, the composed bound encloses density(p) with no tolerance (every op is monotone or already widened in r1; if a seeded case fails at an endpoint, widen in the implementation, never the test).", + "iv_frustum_ball(float2 centreSlope, float z0, float z1, float footprintPerDepth, float warp) -> float4(centre, radius), in C# and both HLSL copies, is the one new CultMath function: the noise ball of a tile over a depth segment. Camera: pinhole at the origin looking +z, focal length f pixels; a pixel's ray is p(z') = (m z', z'); a tile's slopes lie in m_c + [-N/(2f), N/(2f)]^2 (full footprint, so sub-pixel jitter is covered), s = N / (sqrt(2) f). Centre c = (m_c z_m, z_m), z_m = (z0 + z1) / 2; radius r = ((z1 - z0) / 2) |(m_c, 1)| + z1 s + warp. Proof: a point of slope m_c + e (|e| <= s) at depth z' is c + (z' - z_m)(m_c, 1) + z'(e, 0), the terms bounded by the two radius terms, and the warp moves it by at most D (WarpedPointsStayEnclosed). The slice is a convex polytope, so every point between rays is enclosed too. The two vectors are never parallel, so the inequality is strict and float32 cannot cross it.", + "(Tile ball, continued.) Test TileBallEnclosesEveryRaySegment: 2,000 seeded tiles (N in {1, 4, 8, 16}, f in [500, 3000], |m_c| <= 1.1, segments across each scenario's z range), 64 points each with sub-pixel offsets, both depth ends and a flow of length <= warp; no tolerance. Hand mutations that must die, listed in the file header: z0 for z1 in the lateral term; |m_c| for |(m_c, 1)|; the warp dropped. A moving camera needs nothing more: every frame's pre-pass evaluates iv_frustum_ball from that frame's camera and never carries a ball, a mask or a probe result across frames; the only cross-frame state is the TAA history, which is colour, not a soundness input. The test says so by drawing each tile's camera independently.", + "Implementation review of r1's march (NoiseBoundTests.cs:344-376), each item fixed here: (1) every probe was charged one snoise per ray; the tile shares it (ruling). (2) Coarse probes were attempted where the ball could never prove emptiness: iv_snoise_ball's hi is n(c) + L r clamped to 1, so a probe with L r F0 >= 1 + cutoff is a guaranteed failure; at r1's StepMax = 2 that is L r F0 = 3.7, so every coarse probe was a wasted evaluation (the 0.74x row). r2 attempts a noise probe only when L * radius * F0 < 1 - (the cutoff the probe needs), otherwise the level is 'maybe' at no cost. (3) Growth was capped at StepMax = 8 Step0, so a ray through clear space paid Depth / StepMax probes; r2 grows to the remaining range (the hierarchy is over cell-index ranges, halving on maybe, doubling on skip, capped only by the grid's end).", + "(Review, continued.) (4) The dense sample evaluated the detail octave even where occupancy was 0; r2's dense sample evaluates coverage first and the detail only when the envelope and coverage leave density > 0, as Aetheria's `if (dist < _SafetyDistance)` does; the dense baseline gets cheaper and the comparison honest. (5) The finest-level probe before integrating a cell stays: amortized over the tile it costs 1/N^2 and can skip 3 snoise per ray. (6) The step never regrew after a dense cell until a skip; with (3) it regrows from the next skip, which is enough.", + "The march, on cell ranges. The dense grid is a scenario-owned list of cell boundaries z_0 < ... < z_J (uniform for the slab scenarios; Aetheria's quadratic spacing z_j = near + (j/J)^2 (far - near), J = 256, for the Aetheria-like ones, from CloudShader.shader:116). MarchTile takes a range [j0, j1): the envelope probe over the slice (z_j0, z_j1); if empty, skip and double the next range; else if the noise probe is affordable (item 2) and proves empty, skip; else if the range is more than one cell, halve; else the cell is dense. It runs to the grid's end once per tile (a pre-pass does not know any ray's transmittance) and yields the dense cells; each of the N^2 rays integrates exactly those cells in order with the dense march's own Integrate and early-out at 0.02. Counted separately: snoise evaluations and envelope evaluations (pointwise in the dense march; interval probes in the tile march), per ray with probes divided by N^2.", + "The cost model, printed and reasoned about in snoise units: a pointwise envelope evaluation or an envelope probe costs e = 0.2 (a handful of pulses or a height-map fetch against ~150 flops of snoise; stated as an estimate, both counts printed so any weight can be applied). Per scenario the test prints: dense snoise and envelope per ray, tile snoise and envelope probes per ray, the combined cost ratio, and the probe-free ceiling (dense cost over the cost of the dense cells alone). The 2x contract is on the combined cost at N = 8 for scenarios (a) and (c); (b) and (d) are printed as the worst cases and not asserted.", + "Scenarios (IV-REPORT lines, each with 64 tiles at N in {1, 4, 8, 16}, warp in {0, D}): (a) height fog: h = 0, camera at y = S + 30, rays with slope m_y in [0, 0.5] (level and up), Aetheria's grid, expected near-total skip (0 snoise either way; the envelope count carries the ratio). (b) inside the fog: h = 0, camera at y = F - 10, rays level, expected near 1x: every ray saturates within a few cells and the pre-pass still probes the whole grid. (c) Aetheria-like: the zone bowl R = 2000 and four wells of mass {100, 1000, 10000, 1000} at seeded positions inside R, camera at a seeded xz in the bowl at y = max(0, S + 10 - h(camera)), rays gazing across with m_y in [-0.25, 0.1], Aetheria's units (noise scale 414 so F0 = 1/414, D = 15 * 8 / 2 = 60, A = 20 with snoise in [-1, 1]), Aetheria's grid. (d) the uniform slab: r1's field and parameters, kept as the reported worst case. The headline is (e) at N = 8, 200 tiles, printed with both its numbers; (a) and (c) are asserted.", + "(e) the void, the shipped scene (rulings operator-ground-void-brush, operator-void-true-cavity; site-ground r3): a cloud volume everywhere, carved by one negative pseudo-Gaussian sphere, parametrised by the hollow radius Rh (density exactly 0 inside) and the ramp width S (density rises to full over [Rh, Rh + S]); the brush (1 - (d / Rc)^2)^e with CARVE gives Rh = Rc sqrt(1 - CARVE^(-1/e)) and S from the exponent, so (Rh, S) are the authored knobs and (Rc, e) derived. Noise displaces the wall only: fade(d) = smoothstep(Rh - S, Rh, d); d' = d + A fade(d) n(warp(p)), A = 20, F0 = 0.01 (wavelengths 100 and 25), D = 10; K = 1/30 (optical depth 1 per 30 units of full density), termination at T < 0.02. Shipped point: Rh = 198, S = 50, the sun on the hollow's bottom, the camera 120 behind it along the orbit tangent and 45 above it (186 from the centre, 'low'). Rays over the whole frustum (vertical FOV 60, f = 935, so theta_px = 1/f). Every ray crosses empty interior and ends in a wall.", + "Footprint LOD (the operator's challenge, map 'Footprint LOD'): theta_px = 2 tan(fov/2) / H; the footprint at distance z is z theta_px. Step: Delta(z) = max(k z theta_px, min(S / 4, lambda_fine(z) / 2)), k = 4: never finer than four footprints, otherwise the finer of the two content limits (four samples across the ramp, two per wavelength of the finest live octave). Octaves: octave i of wavelength lambda_i carries weight w_i(z) = 1 - smoothstep(lambda_i / (2m), lambda_i / m, z theta_px), m = 4: one smooth blend per octave, no popping; TAA hides per-frame sparsity. The weights are part of the field, so the bound encloses the truncated field exactly: the noise interval over a slice is the sum over octaves of iv_mul([w_i(z1), w_i(z0)], iv_snoise_ball(c F_i, r F_i)), w_i monotone in z. At the shipped parameters (wavelengths 100 and 25, z <= 2 Rc) every weight is 1 in the frustum and the content limits set the step; the footprint bites when S < 4 k z theta_px.", + "(e) runs three marches per tile and prints them: the fixed-step reference (Delta_fixed = min(10, S / 4) everywhere, the pointwise envelope gate, the baseline a march that does not know where the wall is must pay); the masked fixed-step march (the same cells, so transmittance agrees exactly: the soundness pin, as (a)-(d)); and the masked LOD march, the shipped one (steps from Delta(z) inside the unmasked range only, octave weights applied), whose transmittance must be within 0.02 of the reference (printed; an approximation by design, not a soundness claim). Printed per configuration: steps per pixel and snoise per pixel for all three, the combined cost ratio reference / LOD, probes per tile. The grid for (e): Rh in {100, 200, 400, 1000} x camera offset in {centred, mid (0.5 Rh), low (0.94 Rh, the shipped)} x S in {10, 50, 150}, 32 tiles each at N = 8; the shipped point with 200 tiles.", + "Predictions to confirm or refute, N = 8, combined cost: (a) above 50x. (b) 0.8-1.0x. (c) 2-4x: clear cells collapse to a few probes per tile, fog cells cost the same on both sides; the noise ball proves nothing at Aetheria's scale (L r F0 >= 1.6), so item 2 keeps it unevaluated and the saving is the envelope's. (d) 1.3-1.5x: the ceiling at L = 10.099261. (e), from Imagination's model (scratchpad cavity_model.py): the LOD march needs about 6 steps and 12 snoise per pixel at every grid point with S <= 50 (the content limits S / 4 and the detail half-wavelength 12.5 set the step, not the footprint); S = 150 needs 14 steps and 36 snoise. Against the fixed-step reference at the shipped point: steps 35 to 6 (5-8x fewer), combined cost 1.7x, snoise alone 1.25x; cost 3.2x at S = 10, 1.4x at S = 150, 2.5x at Rh = 1000; camera offset barely matters. (e)'s contract is steps per pixel (Q8 retired). If (a) or (c) misses 2x, skip naming saving-2x-scenarios. Never tune the fields, the grids or e.", + "Stryker on Yggdrasil from a plain clone: --since:c9bd003b -m math.Interval.cs; report timeouts separately from kills (a timeout is not a demonstrated kill); if the saving test is what times mutants out, exclude it from Stryker's test selection (a measurement, not a pin) rather than raising the timeout. Compile checks on Starfire, one job, detached with a log, polled in the foreground: FXC cs_5_0 over every cultmath_iv_* including the new function, both tracked copies; then tools/get-dxc.ps1 (pinned, ruling operator-compiler-downloads) and dxc -T lib_6_3 -HV 2021 on both copies. Carried from r1 and still out of scope, name them in the report: the Unity CultMath.dll is not rebuilt; the Unity HLSL copies stay one blob with packages/cultmath/shaders; public asfloat(uint) stays. Branch from c9bd003b; if main moved by docs only, say so as r1 did." + ], + "deletes": [ + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 33, + "note": ":344-376 MarchIntervals, the per-ray adaptive march with its StepMax cap and unconditional probes, replaced by MarchTile on cell ranges." + }, + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 10, + "note": ":401-408 the doc comment naming the r1 fork and :424-425 the Assert.Skip naming it; the fork is answered. A skip survives only on a shortfall in (a) or (c), naming saving-2x-scenarios." + }, + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 12, + "note": ":319-330 Density: the unconditional three-snoise sample is replaced by the envelope-gated sample (coverage first, detail only when density can be nonzero)." + }, + { + "path": "packages/cultmath/docs/design.md", + "lines": 15, + "note": ":423-437 the saving paragraph with r1's numbers (0.93x, 1.83x, 0.74x), replaced by the scenario paragraph with r2's printed numbers." + } + ], + "keeps_moves": [ + "Every iv_* op, both ball bounds, SNOISE_LIPSCHITZ and its provenance tests: untouched. The ruling keeps the bound; only the field model, the march and its test change.", + "SavingField's noise shape (F0 0.35 in the slab, the warped two-phase coverage, the detail octave, period 4) and (d)'s parameters: kept, as the worst case; scenario (d) must reproduce r1's dense count where the detail gating does not bite (print it).", + "MarchDense and Integrate: unchanged except that Density is envelope-gated; the dense grid becomes the scenario's boundary list.", + "IntervalTests, WarpedPointsStayEnclosed, TightnessReport, MeasureLipschitz, LipschitzConstantPinsSampledGradients: unchanged.", + "HlslSourceCompatibilityTests: no change expected; the new function must find its C# twin through the existing mirror." + ], + "adds": [ + "packages/cultmath/src/CultMath/math.Interval.cs: iv_frustum_ball after iv_fbm_ball, doc comment carrying the derivation and that the caller scales by F0 and adds its translation.", + "packages/cultmath/shaders/CultMath.Interval.hlsl: cultmath_iv_frustum_ball, same text in both tracked copies.", + "tests/CultMath.Tests/NoiseBoundTests.cs: Scenario (grid, wells, camera, ray slopes, units), SavingField with the envelope (PowerPulse wells, fade, floor), EnvelopeBound (the composed interval, test-side; iv_* ops only), MarchTile, MarchLod (footprint step and octave weights, the shipped march), the per-tile Run; TileBallEnclosesEveryRaySegment; EnvelopeBoundEnclosesDensity; IntervalSkipHalvesEvaluations prints the scenario x N x warp grid and asserts (a) and (c) at N = 8.", + "packages/cultmath/docs/design.md, 'Intervals': the frustum-ball paragraph after :401; the envelope-then-noise paragraph (how a consumer composes the bound, the short-circuit, where the warp lives); the rewritten saving paragraph with the four scenarios and the headline.", + "packages/cultmath/README.md :38-43: iv_frustum_ball named; one sentence that the bounds compose with an analytic envelope." + ], + "file_changes": [ + { + "location": { + "path": "packages/cultmath/src/CultMath/math.Interval.cs", + "line": 152 + }, + "change": "after iv_fbm_ball: public static float4 iv_frustum_ball(float2 centreSlope, float z0, float z1, float footprintPerDepth, float warp)." + }, + { + "location": { + "path": "packages/cultmath/shaders/CultMath.Interval.hlsl", + "line": 91 + }, + "change": "after cultmath_iv_fbm_ball: float4 cultmath_iv_frustum_ball(...); both tracked copies." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 294 + }, + "change": "SavingField becomes envelope-then-noise over a Scenario; Density is envelope-gated; MarchTile replaces MarchIntervals; Run draws tiles and N^2 rays each, counting snoise and envelope evaluations separately." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 409 + }, + "change": "IntervalSkipHalvesEvaluations: scenarios (a)-(e), N in {1, 4, 8, 16}, warp in {0, D}; the (e) grid Rh x offset x S with three marches; assert >= 2x combined cost for (a) and (c) and >= 2x fewer steps per pixel for (e) at the shipped point, else Skip naming saving-2x-scenarios." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 89 + }, + "change": "TileBallEnclosesEveryRaySegment and EnvelopeBoundEnclosesDensity beside WarpedPointsStayEnclosed." + }, + { + "location": { + "path": "packages/cultmath/docs/design.md", + "line": 401 + }, + "change": "the frustum-ball and envelope-composition paragraphs; :423-437 the saving paragraph rewritten with r2's printed numbers only." + }, + { + "location": { + "path": "packages/cultmath/README.md", + "line": 38 + }, + "change": "iv_frustum_ball named; the envelope composition in one sentence." + } + ], + "authority_map": { + "owner": "CultMath owns the interval ops, the noise bounds and now the frustum ball; a consumer (the test's SavingField, the site's pre-pass, Aetheria's march) owns its envelope and composes the bound from iv_* ops. The saving test owns the proving-ground numbers per scenario; the site's browser measurement owns the shipped gain. The bound (SNOISE_LIPSCHITZ, iv_snoise_ball) is unchanged.", + "inputs": [ + "the r1 interval surface, unchanged", + "a tile's geometry (centre slope, depth segment, footprint per depth, warp bound) and a scenario's grid, wells, camera and units; Aetheria's shapes and settings as read from its checkout, cited by file:line in the test" + ], + "outputs": [ + "iv_frustum_ball / cultmath_iv_frustum_ball: a ball enclosing every point of every ray of the tile over the segment, warped", + "printed numbers per scenario: dense and tile snoise and envelope counts per ray, combined cost ratio, probe-free ceiling, at N in {1, 4, 8, 16}" + ], + "derived_state": [ + "the tile ball and the envelope box are derived from the tile's geometry; no radius is read from a texture, a uniform or a tuned constant", + "whether a noise probe is attempted is derived from L, the radius and the cutoff (item 2), never from a mode flag", + "the probe-free ceiling is derived from the same run; it states what no amortization can beat" + ], + "forbidden_writers": [ + "no change to SNOISE_LIPSCHITZ, iv_snoise_ball, the noise shape or e; the scenarios may not be tuned toward 2x", + "no per-ray probe in the tile march; no early-out of the pre-pass on any ray's transmittance", + "no warp on the envelope's argument; the warp enlarges the noise ball only", + "no new CultMath function for the envelope: PowerPulse, the box and the composition are consumer-side, built from iv_* ops", + "no tape, prune, affine or choice token in the interval files; no number in design.md or a comment that the committed test did not print in this run" + ], + "shared_paths": [ + "the dense march and the tile march integrate the same cells of the same grid with the same Integrate; the transmittance check is the proof that nothing provably empty was there", + "the one composed bound (EnvelopeBound) serves the enclosure test and the march; no second composition", + "the existing mirror test covers the new HLSL function; the Unity copy stays one blob" + ], + "deletion_line": "r1's per-ray march, its unconditional probes, its growth cap and the unconditional three-snoise dense sample go first; the tile march on cell ranges and the gated sample are written in their place. Nothing in src is deleted. The liability added is one geometry function and two tests plus the scenario model; it buys the tile-march soundness invariant in three runtimes and a saving number measured where there is empty space to find." + }, + "verification": { + "builds": [ + "Yggdrasil: dotnet test packages/cultmath/tests/CultMath.Tests green (MeasureLipschitz/MeasureMonotonicity excluded by trait); paste counts and every IV-REPORT line", + "Yggdrasil: dotnet stryker --since:c9bd003b -m math.Interval.cs from a plain clone; 0 survivors; timeouts listed separately from kills", + "Starfire: FXC cs_5_0 kernel over every cultmath_iv_* including cultmath_iv_frustum_ball, both HLSL copies", + "Starfire: tools/get-dxc.ps1 then dxc -T lib_6_3 -HV 2021 on both HLSL copies, exit 0" + ], + "tests": [ + { + "name": "NoiseBoundTests.TileBallEnclosesEveryRaySegment", + "pins": "every sample point of every ray of an N x N tile over a depth segment, sub-pixel jitter and warp included, lies inside iv_frustum_ball." + }, + { + "name": "NoiseBoundTests.EnvelopeBoundEnclosesDensity", + "pins": "the composed bound (envelope box, fade, noise ball enlarged by the warp) encloses density at every warped point of 2,000 slices, no tolerance; intervals-enclose holds for the composition the site and Aetheria will use." + }, + { + "name": "NoiseBoundTests.IntervalSkipHalvesEvaluations", + "pins": "scenarios (a) and (c) at N = 8 cost at most half the dense combined cost with transmittance within 1e-3; (e) at the shipped point: the masked LOD march takes at most half the fixed-step reference's steps per pixel, the masked fixed-step march agrees exactly, the LOD march within 0.02; the (e) grid and every scenario, N and warp printed with both counts and the ceiling." + }, + { + "name": "IntervalTests.EveryOpEnclosesItsPoints (existing)", + "pins": "r1's enclosure for every op still holds." + }, + { + "name": "HlslSourceCompatibilityTests.EveryMirrorFunctionMatchesCSharpMath (existing)", + "pins": "cultmath_iv_frustum_ball matches iv_frustum_ball bit for bit." + } + ], + "negative": [ + { + "pattern": "tape|prune|affine|choice", + "scope": "math.Interval.cs and CultMath.Interval.hlsl: 0 matches (case-insensitive)." + }, + { + "pattern": "snoise_grad|fbm_grad", + "scope": "math.Interval.cs and CultMath.Interval.hlsl: 0 matches." + }, + { + "pattern": "PowerPulse|pulse|envelope|Scenario", + "scope": "math.Interval.cs and CultMath.Interval.hlsl: 0 matches; the envelope is consumer-side." + }, + { + "pattern": "Assert\\.Skip", + "scope": "NoiseBoundTests.cs: at most one, in IntervalSkipHalvesEvaluations, naming saving-2x-scenarios; 0 if (a), (c) and (e) meet their contracts." + }, + { + "pattern": "10\\.099261|0\\.35f", + "scope": "git diff c9bd003b..HEAD -- packages/cultmath/src: the constant is not touched; the slab's F0 stays in (d)." + }, + { + "pattern": "git diff --name-only c9bd003b..HEAD", + "scope": "only packages/cultmath/**; both tracked CultMath.Interval.hlsl copies change together." + } + ], + "operator": [] + }, + "estimate": { + "lines_added": 420, + "lines_removed": 80, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": [], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [ + "cultmath-tapes:ruling:operator-tile-amortized-march", + "cultmath-tapes:ruling:operator-ground-void-brush", + "cultmath-tapes:ruling:operator-void-true-cavity", + "cultmath-tapes:ruling:operator-compiler-downloads", + "cultmath-tapes:ruling:operator-campaign-home" + ], + "questions": [] +} diff --git a/docs/cultmath-interval-ground-cut-interval-ops.r3.spec.json b/docs/cultmath-interval-ground-cut-interval-ops.r3.spec.json new file mode 100644 index 00000000..d008f90f --- /dev/null +++ b/docs/cultmath-interval-ground-cut-interval-ops.r3.spec.json @@ -0,0 +1,268 @@ +{ + "campaign": "cultmath-tapes", + "cut": "interval-ops", + "revision": 3, + "title": "Interval ops r3: the frustum ball widened by its derived float32 bound, the analytic constant-density body, one shipped void, (c) held to its ceiling, LOD weights exercised, Stryker kills demonstrated", + "repo": "GameCult/CultLib", + "branch": "hands/cultmath-interval-ops", + "base": "43183276", + "depends_on": [], + "first": [ + "Follow-up on cut report cultmath-tapes:cut_report:cut-interval-ops.h2 (head 43183276, worktree F:\\Projects\\CultLib-iv) and Soul's verdict cultmath-tapes:verdict:cut-interval-ops.s1 with its five findings, each resolved below in order. New rulings in force: operator-wells-contract-vs-ceiling ((c)'s contract is at least 90% of the probe-free ceiling, not 2x) and operator-analytic-wall-body (where the envelope interval proves the density constant, one closed-form Beer-Lambert step). Map: docs/cultmath-interval-ground-cut.md, 'Pass 4'. r2's ops, field models, tile march and scenarios stand; this revision touches math.Interval.cs, both tracked CultMath.Interval.hlsl copies, NoiseBoundTests.cs, SnoiseBall tests in the same file, design.md and README only. Nothing new in src beyond the radius widening.", + "Finding 1, frustum-ball-float-crossing (Medium). The ball is widened, in C# and both HLSL copies: radius += (|c.x| + |c.y| + |c.z| + radius) * 2^-20 (the literal 9.5367431640625e-7, exact in float32), after the r2 radius. Derivation, u = 2^-24: the centre c = (m_c z_m, z_m) carries at most two roundings per component (z_m = fl(z0 + z1) * 0.5, then the product), so |c_float - c_exact| <= 2u |c|_1; the radius carries at most seven first-order roundings (z1 - z0; the axis sqrt at 3u; the product; z1 * footprint; the sum; + warp), so r_exact <= r_float (1 + 7u); the widening's own addition rounds once more. 2^-20 = 16u covers 8u (|c|_1 + r) twice over. fma contraction removes roundings and only tightens, so dxc's HLSL and any driver's GLSL stay covered. The sentence 'the two vectors are never parallel, so the inequality is strict and float32 cannot cross it' leaves math.Interval.cs:179-180, the HLSL and design.md:412; the rule and its derivation take its place.", + "(Finding 1, continued.) TileBallEnclosesEveryRaySegment gains Soul's extreme families beside the r2 domain, 2,000 cases each, 8 footprint corners at both depth ends with the flow pointed outward along the corner's direction from the centre, the distance computed in double from the float ball and the float ray (point (m z, z) formed in double from the float m and z), no tolerance: z0 == z1; thin (z1 - z0 = 1e-6 z1); |m_c| up to 1000; far (z up to 1e7); z0 = 0 with z1 down to 1e-3; f down to 1; warp up to 1e6. The derivation pin becomes two-sided: r_exact <= ball.w <= r_exact + 2^-19 (r_exact + |c|_1), r_exact in double, so a ball that forgets the widening fails and a ball that grows past the rule fails. The hand mutations of r2 stay; a fourth, the widening dropped, must fail the degenerate family alone. WarpedPointsStayEnclosed is unchanged.", + "Finding 2, aetheria-far-plane-miscited (Low). FogField's grid becomes Quadratic(0.3, 2048, 256), cited as the Main Camera (Aetheria d3075eb0 Assets/Scenes/ARPG.unity:31777 m_Name Main Camera, :31830 far clip plane 2048; VolumeCloudRenderer.cs:36 RequireComponent(Camera)); the comment at NoiseBoundTests.cs:594 no longer names the Tint camera's 1000. Soul re-measured (c) at far 2048: 1.39-1.51x at warp D, 2.46-2.74x at warp 0, ceiling within 1-2% of the ratio; the verdict on (c) does not move. Print every (a)-(c) row again at 2048.", + "Finding 3, shipped-void-two-scenes (Medium). ONE shipped void, authored as (Rh, S) per the map's own rule, everything else derived; the map, the site-ground r3 spec and the test agree on it: Rh = 198, S = 50, so Rc = Rh + S = 248 and e = -ln CARVE / ln(1 - (Rh / Rc)^2) = 0.40 (CARVE 1.5); fade band [Rh - S, Rh], A = 20, F0 = 0.01, D = 10, K = 1/30. This is the scene r2 measured (2.21x) and the Footprint-LOD rule's; the map's site section (Rc 640, e 4, a 442-wide ramp) was the other scene and is superseded. The honest choice changes the look (a 50-wide noisy wall with a kinked outer edge, not a soft pseudo-Gaussian wall), so it is Q9 in the map, a fork for the operator with (a) recommended. Hands codes (a); another ruling moves only the shipped constants and the site section. VoidField's doc comment derives (Rc, e) from (Rh, S) and names it the one shipped void.", + "Finding 4, lod-weights-never-exercised (Low). VoidField takes a focal length. One configuration reaches the weights: '(e) LOD far' Rh = 4000, S = 50, camera low, f = 467 (1080 rows at a 98 degree vertical FOV): theta = 1/467, so the fine weight (wavelength 25) is below 1 past z = 1460 and 0 past 2920, the coarse weight (100) below 1 past 5840, and the grid (|camera - c_v| + Rc + 6/K, about 7990) reaches both; 4 z theta exceeds 12.5 past z = 1460, so LodStep is footprint-set there too. It joins EnvelopeBoundEnclosesDensity's field list (the truncated check is no longer vacuous) and the saving test prints it, not asserted. Hand mutation that must fail the truncated check on it: w(z0) for w(z1) in WeightBound.", + "(Finding 4, continued: the deviation.) Recorded in the test's doc and design.md: the bound takes each octave weight over [w(z1), 1], not the spec's [w(z1), w(z0)], because one Bound serves the full field (w = 1) and the truncated one (w in [w(z1), w(z0)], w decreasing in z). [w(z1), 1] contains both, iv_mul is monotone in its interval argument, so the composed interval is a superset of either field's and encloses both. The slack is only in far tiles whose step the footprint already sets.", + "Finding 5, stryker-timeout-survivor (Low). Mutant 2525 (iv_sqr a.x >= 0 to a.x > 0) is equivalent: at a.x == 0 both branches return the same ends ((0, h) either way, (0, 0) when a.y == 0); the report says so by its diff, since numbers are per run. New enclosure cases kill the mirror-only survivors semantically: SnoiseBallEnclosesPoints and FbmBallEnclosesPoints draw radii LogUniform(1e-3, 1e3), so L / r in iv_snoise_ball (too tight once r > 1: at r = 100 the mutant's bound is 0.2 wide while snoise over the ball spans [-1, 1]) dies to an enclosure test, not only to the HLSL mirror. The mutants Soul listed as mirror-only (iv_scale s >= 0 to s > 0; the two iv_abs mutants) are hand-run and each either named equivalent with the one-line argument (signed zero or a boundary both branches map alike) or killed by one added point case in IntervalTests.", + "(Finding 5, continued.) Stryker runs again as r2 did, --since:43183276; every timeout in math.Interval.cs is hand-run (patch from the mutation report, dotnet test minus IntervalSkipHalvesEvaluations) and the report lists killed, survived and equivalent by diff. The report claims only demonstrated kills; a timeout is not a kill.", + "The analytic body (ruling operator-analytic-wall-body), consumer-side in the test and the site, no new CultMath function. When it applies: the Scenario's Bound over the remaining range [z, z_end] of the grid, gated, is a point interval with positive value: the envelope with the free noise interval [-1.5, 1.5] (coverage in [-1, 1] plus half the detail) proves fade = 1 and d_lo + A (fade n)_lo >= Rc, so every point of every ray of the tile over the rest of the grid has density exactly K for any noise value; or, generically, lo == hi > 0 from whichever path the bound took. Only then does the march integrate T *= exp(-K ext (z_end - z) |dir|) in one step and terminate (the grid end is past opacity by construction). For (a)-(d) no Bound is a positive point (the fog's density varies with s'), so the step never applies there, and the test asserts bodyStart = -1 for every (a)-(d) tile.", + "(Analytic body, continued.) MarchTile returns (dense cells, bodyStart, bodyDensity). As r2 on cell ranges; when a single cell is found not provably empty and its own gated bound is a positive point (the cell is provably constant), one more probe over [grid[j], grid[^1]]: if that is a positive point too, bodyStart = j, bodyDensity = its value, and every remaining cell is appended dense without probing (adding cells is always sound; it also drops the body's probes). The mask's meaning is unchanged, so the masked fixed-step march's exact agreement with the reference stands as the soundness pin. MarchLod: inside unmasked runs as r2; on reaching a cell >= bodyStart it takes the one analytic step over [z, grid end], counts one step, and stops.", + "(Analytic body, the grid end.) Every void configuration's grid ends at |camera - c_v| + Rc + 6/K (was 5/K): the body starts at d >= Rc + A 1.5 = Rc + 30 plus box slack, so 6/K leaves at least 4.9 of optical depth, T <= 0.0075 < 0.02, and 'unfinished rays 0' still prints. This is the grid end, not the field; the reference stops by opacity and its count does not move.", + "(Analytic body, the pin.) New test AnalyticBodyMatchesFineMarch over the (e) grid, the shipped void and the LOD-far configuration, 2,000 seeded tiles at N in {1, 4, 8, 16}: (1) wherever MarchTile reports bodyStart b: the Bound over [grid[b], grid end] is a positive point; the full and the truncated Density at 64 random (pixel, sub-pixel, cell >= b, depth in cell) points equal bodyDensity exactly, no tolerance; (2) the analytic factor exp(-bodyDensity ext L) over the body equals the fixed-step product of the body cells' Integrate factors (no early-out, same cells) within 1e-4 relative; (3) for every (a)-(d) tile bodyStart = -1. Hand mutation that must fail (1): in VoidField.Compose, CarveRadius for HollowRadius in the lo test (the body claimed from the ramp). The site's mirror of this (site-ground r3): the pre-pass writes the body-start cell in the texel's fourth word, the main pass takes the same one step; its browser check is the dense-reference agreement already in that spec.", + "Contracts after r3, asserted at N = 8 in IntervalSkipHalvesEvaluations, else one Assert.Skip naming saving-2x-scenarios with every shortfall: (a) at least 2x combined cost (the lower of warp 0 and D), measured 16384x. (c) at least 0.90 of its probe-free ceiling (Ratio / Ceiling, the lower of warp 0 and D), measured 0.99 at warp D and 0.96 at warp 0 in r2; the ruling's reading is that the ceiling is what intervals control and the fog band's cost is the field's. (e) at least 2x fewer LOD steps per pixel than the fixed-step reference at the ONE shipped void (200 tiles), the masked fixed-step march agreeing exactly and the LOD march within 0.02 of the reference. (b), (d) and the (e) grid incl. LOD-far: printed, not asserted. Nothing is tuned toward any contract: the fields, the grids (beyond the stated 6/K end), e = 0.2 and the seeds stay.", + "Predictions to confirm or refute (Imagination's rule from r2's printed rows: the LOD steps that evaluated noise are about snoise / 2.8 plus two pre-band steps; the rest were constant-body steps, which the analytic step makes one). Shipped void: steps per pixel 36.34 (ref) to about 12.5 (was 16.45), 2.6-3.3x fewer; snoise per pixel about 26.6, unchanged; combined cost about 1.38x (was 1.34x); envelope probes per tile about 50 (was 59.1). Grid, low camera, ref/LOD steps: S = 10 about 5-6x at Rh 100-400 and 11x at Rh 1000 (was 2.1-3.4x and 6.8x); S = 50 about 2.5x, 2.8x, 3.5x, 5.2x for Rh 100, 200, 400, 1000 (was 1.8, 2.2, 2.9, 4.5); S = 150 unchanged (rays end inside the 150-wide ramp before the body is proven). Rh 1000 centred S 10: about 30x (was 12.4x). LOD-far: printed, none predicted. If the shipped point lands under 2.6x, say which assumption failed: the pre-band's 0-snoise steps, or a body start later than Rc + 30 by box slack.", + "Compile and mutation checks as r2: Yggdrasil dotnet test (counts and every IV-REPORT line pasted); Stryker --since:43183276 -m math.Interval.cs from a plain clone with every timeout hand-run as in Finding 5; Starfire FXC cs_5_0 over every cultmath_iv_* on both HLSL copies and tools/get-dxc.ps1 then dxc -T lib_6_3 -HV 2021 on both, exit 0 (Soul could not re-run these for r2; they are re-run here because the HLSL changes). Carried and still out of scope, named in the report: the Unity CultMath.dll is not rebuilt; the Unity HLSL copies stay one blob with packages/cultmath/shaders; public asfloat(uint) stays. Main moved by docs only since 43183276's base (Imagination passes 3-3d and 4); say so. glsl-lowering r2 rebases onto this revision's head, not r2's (its fixture family for cultmath_iv_frustum_ball changes with the widening); its spec now says so." + ], + "deletes": [ + { + "path": "packages/cultmath/src/CultMath/math.Interval.cs", + "lines": 2, + "note": ":179-180 the sentence 'The two vectors are never parallel, so the triangle inequality is strict' and its float32 claim; replaced by the widening rule and its derivation." + }, + { + "path": "packages/cultmath/docs/design.md", + "lines": 1, + "note": ":412 'the two vectors are never parallel, so the bound is strict'; replaced by the rule." + }, + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 1, + "note": ":594 the Tint camera citation (ARPG.unity:635-636, far 1000); replaced by the Main Camera's :31830, far 2048." + }, + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 3, + "note": ":1181-1194 the 2x test on ratios[c] and the skip message's wording; replaced by the 0.90-of-ceiling test and a message naming each shortfall." + }, + { + "path": "packages/cultmath/docs/design.md", + "lines": 12, + "note": ":461-497 the r2 numbers (1.41x, 16.45, 2.21x, the (c) shortfall paragraph); replaced by r3's printed numbers and the three contracts." + } + ], + "keeps_moves": [ + "Every iv_* op, iv_snoise_ball, iv_fbm_ball, SNOISE_LIPSCHITZ and its provenance tests: untouched. iv_frustum_ball's centre and the r2 radius terms: untouched; only the widening term is appended.", + "FogField, SlabField, WarpedNoise, Compose, the gated probe (BestBall), MarchTile's range hierarchy, the masked fixed-step march and Run: kept; MarchTile gains the body return and MarchLod the one analytic step.", + "VoidField's field, Density, Bound, Weight, WeightBound and LodStep: kept; the constructor gains the focal length and the grid end moves to 6/K; the shipped point stays Shipped() = (198, 50, shipped camera).", + "TileBallEnclosesEveryRaySegment's r2 domain, EnvelopeBoundEnclosesDensity, IntervalTests, TightnessReport, MeasureLipschitz, LipschitzConstantPinsSampledGradients: kept; the first two gain cases.", + "HlslSourceCompatibilityTests: the mirror count stays 53; cultmath_iv_frustum_ball's new text must match the C# bit for bit." + ], + "adds": [ + "math.Interval.cs and both CultMath.Interval.hlsl: the widening line in iv_frustum_ball / cultmath_iv_frustum_ball, and the rule in the doc comment.", + "NoiseBoundTests.cs: the extreme families and the two-sided derivation pin in TileBallEnclosesEveryRaySegment; VoidField focal parameter and the LOD-far configuration; MarchTile's (bodyStart, bodyDensity); MarchLod's analytic step; AnalyticBodyMatchesFineMarch; the (c) ceiling contract; radii to 1e3 in the two ball tests; the WeightBound deviation in the doc comment; the shipped-void derivation in VoidField's doc comment.", + "IntervalTests.cs: at most three point cases for the mirror-only mutants that are not equivalent (Finding 5).", + "design.md 'Intervals': the widening rule and derivation; the analytic-body paragraph (condition, pre-pass word, one step, the pin); the WeightBound deviation; r3's printed numbers under the three contracts; the one shipped void with (Rc, e) derived.", + "README.md :41: one clause that iv_frustum_ball's radius carries its float32 rounding bound." + ], + "file_changes": [ + { + "location": { + "path": "packages/cultmath/src/CultMath/math.Interval.cs", + "line": 183 + }, + "change": "iv_frustum_ball: after the r2 radius, radius += (abs(cx) + abs(cy) + abs(zm) + radius) * 9.5367431640625e-7f; doc comment :168-182 states the rule and derivation in place of the strictness sentence." + }, + { + "location": { + "path": "packages/cultmath/shaders/CultMath.Interval.hlsl", + "line": 110 + }, + "change": "cultmath_iv_frustum_ball: the same widening line; both tracked copies (packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl identical blob)." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 128 + }, + "change": "TileBallEnclosesEveryRaySegment: the seven extreme families, outward flow at corners, double distance, the two-sided pin; the file header lists the fourth hand mutation (widening dropped) and the WeightBound and Compose mutations." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 58 + }, + "change": "SnoiseBallEnclosesPoints and FbmBallEnclosesPoints: radius LogUniform(1e-3, 1e3)." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 594 + }, + "change": "FogField: Grid = Quadratic(0.3, 2048, 256), Main Camera citation." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 829 + }, + "change": "VoidField: focal parameter (default 935); LodFar() = (4000, 50, low, f 467); grid end reach + Rc + 6/K; doc comment with the (Rh, S) -> (Rc, e) derivation, the one shipped void, the [w(z1), 1] deviation." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1009 + }, + "change": "MarchTile returns (cells, bodyStart, bodyDensity) with the one confirming probe; MarchLod takes the analytic step at bodyStart; Run and RunStats carry it; ReportVoid prints body steps." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1160 + }, + "change": "IntervalSkipHalvesEvaluations: (c) asserted as Ratio >= 0.90 Ceiling; the LOD-far row printed; the (e) grid printed with the analytic body; AnalyticBodyMatchesFineMarch added beside it." + }, + { + "location": { + "path": "packages/cultmath/docs/design.md", + "line": 403 + }, + "change": ":403-430 the frustum-ball paragraph gains the widening rule; :412 strictness sentence deleted; :461-497 the saving section rewritten with r3's printed numbers, the three contracts, the analytic body and the shipped void." + }, + { + "location": { + "path": "packages/cultmath/README.md", + "line": 41 + }, + "change": "iv_frustum_ball: 'its radius carries its own float32 rounding bound'." + } + ], + "authority_map": { + "owner": "CultMath owns the interval ops, the noise bounds and the frustum ball, whose enclosure promise now covers its own float32 rounding (the widening is part of the function, not of any consumer). The consumer (the test's Scenario, the site's pre-pass) owns the envelope, the composed bound, the body proof and the Beer-Lambert step. The saving test owns the proving-ground numbers; the operator owns the shipped void (Q9) and the contracts (the two rulings).", + "inputs": [ + "the r2 surface unchanged; a tile's geometry and warp; a scenario's grid, wells, camera, focal length and units, Aetheria's Main Camera far plane 2048 cited by line", + "the one shipped void as (Rh, S) = (198, 50); every other void constant derived from it" + ], + "outputs": [ + "iv_frustum_ball / cultmath_iv_frustum_ball: a float32 ball that encloses every exact point of every ray of the tile over the segment, warped, under float32 evaluation of the ball itself", + "per tile: the dense cells and, when the envelope proves the rest constant, the body-start cell and its density; printed numbers per scenario including the body steps" + ], + "derived_state": [ + "the widening is derived from the computed centre and radius (2^-20 of |c|_1 + r), never a tuned epsilon; a consumer adds nothing for the ball's own rounding and remains responsible for its world transform", + "(Rc, e) are derived from (Rh, S): Rc = Rh + S, e = -ln CARVE / ln(1 - (Rh/Rc)^2); no void constant is authored twice", + "the body start is derived from the same Bound the mask is derived from, by one more probe; the main pass reads it, never decides it", + "the (c) contract value is derived from the run (0.90 of its own ceiling); no absolute target is written for (c)" + ], + "forbidden_writers": [ + "no change to SNOISE_LIPSCHITZ, iv_snoise_ball, iv_fbm_ball, the noise shape, e = 0.2, the seeds or any field toward a contract; the grid end moves to 6/K for termination only", + "no analytic step from a pointwise density or from the noise ball alone: only a point-interval Bound over the whole remaining range proves the body", + "no early-out of the pre-pass on transmittance; no probe in the main pass (the body-start cell is read, its constant is one pointwise envelope value)", + "no second shipped void anywhere: the map's site section, the site-ground spec and VoidField.Shipped() name (198, 50) and derive the rest; no number in a doc or comment that the committed test did not print in this run", + "no new CultMath function; PowerPulse, the box, the composition and the Beer-Lambert step stay consumer-side; no tape, prune, affine or choice token in the interval files" + ], + "shared_paths": [ + "the masked fixed-step march still integrates exactly the dense march's cells (the soundness pin); only MarchLod takes the analytic step, and AnalyticBodyMatchesFineMarch ties that step to the fixed-step product over the same cells", + "one Bound serves the enclosure tests, the mask, the body proof and the gated probe; no second composition and no second constancy test", + "the widening lives once in C# and is mirrored bit for bit into both HLSL copies by the existing mirror test; GLSL follows by the lowering (glsl-lowering r2 rebases onto this head)" + ], + "deletion_line": "The false strictness claim leaves the C# doc, the HLSL and design.md before the widening is written; the Tint camera citation leaves before the Main Camera's is written; the (c) 2x assertion and the second shipped void leave before the ceiling contract and the one void are written. Net in src: one line and a doc comment. In tests: one new pin test, seven case families, one configuration, the body return; what they buy is intervals-enclose holding for the ball's own float32 evaluation, the analytic body the ruling asked for with its soundness pinned, LOD weights actually exercised, and a mutation report that claims only what it demonstrated." + }, + "verification": { + "builds": [ + "Yggdrasil: dotnet test packages/cultmath/tests/CultMath.Tests green (MeasureLipschitz/MeasureMonotonicity excluded by trait); paste counts and every IV-REPORT line, (a)-(d) at far 2048, the (e) grid with body steps, LOD-far, the shipped headline", + "Yggdrasil: dotnet stryker --since:43183276 -m math.Interval.cs from a plain clone; every timeout hand-run; killed, survived and equivalent listed by diff; 0 undemonstrated", + "Starfire: FXC cs_5_0 kernel over every cultmath_iv_* including cultmath_iv_frustum_ball, both HLSL copies, exit 0", + "Starfire: tools/get-dxc.ps1 (pinned) then dxc -T lib_6_3 -HV 2021 on both HLSL copies, exit 0, no diagnostics" + ], + "tests": [ + { + "name": "NoiseBoundTests.TileBallEnclosesEveryRaySegment", + "pins": "every exact point of every ray of the tile, corners at both depth ends with an outward flow, lies inside the float32 ball, in the r2 domain and in the seven extreme families, distance in double, no tolerance; the radius is the derivation plus at most 2^-19 (r + |c|_1) and at least the derivation." + }, + { + "name": "NoiseBoundTests.EnvelopeBoundEnclosesDensity", + "pins": "the composed bound encloses the full and the footprint-truncated density at every warped point of 2,000 slices, including the LOD-far configuration where octave weights are strictly between 0 and 1 and at 0." + }, + { + "name": "NoiseBoundTests.AnalyticBodyMatchesFineMarch", + "pins": "a body start is reported only where the Bound over the whole remaining range is a positive point and every sampled density there equals it exactly; the analytic factor equals the fixed-step product within 1e-4 relative; no (a)-(d) tile reports a body." + }, + { + "name": "NoiseBoundTests.IntervalSkipHalvesEvaluations", + "pins": "(a) at least 2x combined cost; (c) at least 0.90 of its probe-free ceiling; (e) at the one shipped void at least 2x fewer LOD steps per pixel, the masked fixed-step march exact, the LOD march within 0.02; every row printed including body steps; one Skip naming saving-2x-scenarios on any shortfall." + }, + { + "name": "NoiseBoundTests.SnoiseBallEnclosesPoints and FbmBallEnclosesPoints", + "pins": "the ball bounds enclose their functions for radii up to 1e3, so a bound tightened for r > 1 (L / r) dies to an enclosure test." + }, + { + "name": "IntervalTests.EveryOpEnclosesItsPoints (existing, plus point cases)", + "pins": "r1's enclosure for every op still holds; any non-equivalent mirror-only mutant from Finding 5 has a point case that kills it." + }, + { + "name": "HlslSourceCompatibilityTests.EveryMirrorFunctionMatchesCSharpMath (existing)", + "pins": "the widened cultmath_iv_frustum_ball matches iv_frustum_ball bit for bit; 53 functions compared." + } + ], + "negative": [ + { + "pattern": "never parallel|cannot cross|strict", + "scope": "math.Interval.cs iv_frustum_ball doc comment, CultMath.Interval.hlsl, design.md 'Intervals' frustum-ball paragraph: 0 matches." + }, + { + "pattern": "635-636|far 1000|Tint", + "scope": "NoiseBoundTests.cs: 0 matches; ':31830' and '2048' appear in FogField's citation." + }, + { + "pattern": "Rc = 640|e = 4\\b|Rc ~ 220|e ~ 0\\.6|about 220|about 0\\.6", + "scope": "NoiseBoundTests.cs and design.md: 0 matches; the shipped void is derived from (198, 50) as Rc = 248, e = 0.40." + }, + { + "pattern": "tape|prune|affine|choice|PowerPulse|pulse|envelope|Scenario|body|Beer", + "scope": "math.Interval.cs and CultMath.Interval.hlsl: 0 matches (case-insensitive); the analytic body is consumer-side." + }, + { + "pattern": "Assert\\.Skip", + "scope": "NoiseBoundTests.cs: at most one, in IntervalSkipHalvesEvaluations, naming saving-2x-scenarios; 0 if (a), (c) and (e) meet their contracts." + }, + { + "pattern": "10\\.099261|0\\.35f", + "scope": "git diff 43183276..HEAD -- packages/cultmath/src: the constant is not touched; the slab's F0 stays in (d)." + }, + { + "pattern": "git diff --name-only 43183276..HEAD", + "scope": "only packages/cultmath/**; both tracked CultMath.Interval.hlsl copies change together and stay one blob." + }, + { + "pattern": "git diff 43183276..HEAD -- packages/cultmath/src | grep '^[-+]' | grep -v '^[-+][-+]' | grep -v '///' | wc -l", + "scope": "at most 4 changed code lines in src: the widening line in iv_frustum_ball and nothing else." + } + ], + "operator": [] + }, + "estimate": { + "lines_added": 260, + "lines_removed": 40, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": [], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [ + "cultmath-tapes:ruling:operator-wells-contract-vs-ceiling", + "cultmath-tapes:ruling:operator-analytic-wall-body", + "cultmath-tapes:ruling:operator-tile-amortized-march", + "cultmath-tapes:ruling:operator-measure-with-empty-space", + "cultmath-tapes:ruling:operator-footprint-lod-march", + "cultmath-tapes:ruling:operator-ground-void-brush", + "cultmath-tapes:ruling:operator-void-true-cavity", + "cultmath-tapes:ruling:operator-compiler-downloads", + "cultmath-tapes:ruling:operator-campaign-home" + ], + "questions": [ + "Q9 in the map: the one shipped void. (a, recommended) Rh 198, S 50, derived Rc 248, e 0.40, the scene r2 measured; (b) the site section's Rc 640, e 4; (c) Rh 198, S 100. Hands codes (a)." + ] +} diff --git a/docs/cultmath-interval-ground-cut-interval-ops.r4.spec.json b/docs/cultmath-interval-ground-cut-interval-ops.r4.spec.json new file mode 100644 index 00000000..8ee7fc2b --- /dev/null +++ b/docs/cultmath-interval-ground-cut-interval-ops.r4.spec.json @@ -0,0 +1,292 @@ +{ + "campaign": "cultmath-tapes", + "cut": "interval-ops", + "revision": 4, + "title": "Interval ops r4: LOD agreement against a converged march at the body start, BodyDepth pinned, (c) against an oracle ceiling, WeightBound pinned, design.md from r4's own run", + "repo": "GameCult/CultLib", + "branch": "hands/cultmath-interval-ops", + "base": "3ac7250a", + "depends_on": [], + "first": [ + "Follow-up on verdict cultmath-tapes:verdict:cut-interval-ops.s2 (range 43183276..3ac7250a, worktree F:\\Projects\\CultLib-iv), four findings, one item each below. Touches packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs and packages/cultmath/docs/design.md only: no src, no HLSL, no README. Question cultmath-tapes:question:wells-ceiling-oracle decides only (c)'s assertion lines (item 9). Self dispatches with its ruling in the brief. Line numbers are at 3ac7250a. Every probe number quoted here is from Imagination's scratch probe at 3ac7250a, with the test's own seeds, tiles and N = 8. It is never committed; r4's run reprints its own numbers.", + "Finding lod-agreement-blind-past-body (High), measured. Comparing with the 10-unit fixed-step march cannot pin LodStep. At the shipped void, the LOD march's T at the body start differs from it by up to 0.300 of max(T, 0.02). LodStep doubled differs by 0.309. Both are unconverged midpoint quadratures of a ramp with 25-unit detail. A converged march separates them: h = 0.5, which agrees with h = 1 to 0.0065. Relative optical-depth error per ray, max at the headline: fixed-step 0.061, LOD 0.086, LodStep x2 0.177, LodStep x0.5 0.036. With the pre-body integration dropped, T is wrong by 26.5x max(T, 0.02). So the LOD march is 1.4x less accurate than the dense march before the body. Report it; it is not tuned.", + "The agreement rule. MarchLod gains `float cutoff`; Run's costed march passes 0.02, as now. It returns (Transmittance, AtBody). AtBody is T when z first reaches the body start, before the body step, or the final T when there is no body. New helper ConvergedDepth(field, tile, slope, stop, h, lod) returns the optical depth in double, by midpoint quadrature at step h. It runs over EVERY grid cell before `stop`, never the mask's, so it trusts no pre-pass, using the field's Density.", + "(Agreement, continued.) In Run with lod, per ray, with stop = bodyStart, or the cell count (grid.Length - 1) when there is none:\n- tauConv = ConvergedDepth(..., stop, 0.5, lod: true).\n- tauLod = -ln(max(AtBody, 1e-30)) from a second MarchLod at cutoff 0.\n- tauRef = -ln of the product of Integrate over cells < stop, lod: false, with no early-out.\nRunStats keeps MaxLodDepthError and MaxRefDepthError, each max |tau - tauConv| / max(tauConv, 1e-3). The converged march and the cutoff-0 march count into a throwaway Counts and no steps, so cost rows do not move.", + "The (e) agreement contract replaces 'LOD within 0.02 at the end': at the shipped headline, MaxLodDepthError <= 2 x MaxRefDepthError. The footprint march may be at most twice as wrong as the dense march it is measured against. This mirrors the 2x step contract and is Imagination's default; Self may put it to the operator. Measured 0.086 <= 0.122. LodStep x2 and the dropped pre-body integration fail it. The end-of-ray assertion :1455 is deleted. End-of-ray |dT| stays printed. Every (e) row and LOD-far prints both errors and their ratio, which is printed and not asserted. LOD-far's tauRef carries the deliberate octave truncation, so its ratio is not comparable.", + "BodyFactor becomes BodyDepth (:1198-1201). It returns the optical depth Density x ext x (grid end - z) x |dir| as a float. MarchLod multiplies by exp(-BodyDepth(...)). AnalyticBodyMatchesFineMarch part (2) deletes its own tau and analytic (:1375-1377). It compares BodyDepth(field, tile, ray, grid[b], lod: true, counts) with the double sum over body cells of -ln(Integrate(cell, lod: true)), within 1e-4 relative. Probe: in the T domain the comparison underflows at LOD-far (float exp of about -256 is 0, relative error 1); in the depth domain it does not. With |dir| dropped, the depth error is |dir| - 1, at least 0.00145 at the shipped camera, so the mutant dies on every tile.", + "Finding wells-ceiling-contract-vacuous (Medium), measured at N = 8. Warp 0: ratio 2.744x, mask ceiling 2.855x (0.961), oracle ceiling 7.263x (0.378), oracle-empty cells skipped 0.952, skip-nothing pre-pass 0.136. Warp D: 1.391x, 1.401x (0.993), 7.165x (0.194), 0.842, 0.139. At warp D about 80% of the masked cost lies in cells where every ray's sample is 0, so design.md's 'where the rays need them' is false. The ruling's reason needs a ceiling the pre-pass cannot move. Hence the question.", + "Measurement, whatever the ruling. Run draws a tile's N^2 slopes first, then marches. The random stream reorders, so every IV-REPORT row reprints. The oracle mask is the cells whose Density at mid-depth is > 0 for at least one of those slopes, evaluated into a throwaway Counts. The oracle march runs each ray over the oracle cells only, with the same Integrate and early-out, costed into a new RunStats.Oracle. Assert its T equals the dense march's exactly (probe max |dT| 0). RunStats.Ceiling (:1259-1260) goes. In its place: OracleCeiling = Dense.Cost / Oracle.Cost; Efficiency = Oracle.Cost / (Masked.Cost + Probes.Cost); ProbeOverhead = Masked.Cost / (Masked.Cost + Probes.Cost); CullFraction = oracle-empty cells the mask skips / oracle-empty cells. Report prints all four.", + "(c)'s assertion, at N = 8, the lower of warp 0 and D, per the ruling on wells-ceiling-oracle. :1437 records the chosen value. For the cull floor, Assert.True fails rather than skips.\n- oracle-target-cull-floor (recommended): hard CullFraction >= 0.5, plus Efficiency >= 0.90 in the shortfall list.\n- oracle-target-only: the shortfall alone.\n- cull-fraction: CullFraction >= 0.90 in the shortfall list.\n- overhead-plus-floor: ProbeOverhead >= 0.90 in the shortfall list, plus the hard floor.\nThe contracts line names the measured quantity. Note: under options 1 and 2 the test skips today, naming saving-2x-scenarios with (c)'s shortfall; (a) and (e) are still evaluated and listed.", + "Finding weightbound-mutation-survives (Low). VoidField gains public (float2 Coarse, float2 Fine) WeightBounds(float z0, float z1) beside Weights(z) (:992). WeightBound (:1035) stays private and is what WeightBounds calls. New Fact WeightBoundEnclosesOneSignedNoise on LodFar, 2,000 cases: z0 ~ U(1460, 0.95 x grid end), z1 ~ U(z0, grid end), 16 depths in [z0, z1] including both ends. Each octave weight lies in its bound. For the one-signed noise interval n = [0.25, 1] and n_s in {0.25, U(0.25, 1), 1}, w(z) n_s lies in iv_mul(bound, n). Probe: the spec's mutant [w(z0), 1] misses w(z1) x 0.25 in 2000 of 2000 fine-octave cases on (1460, 2920). The header (:14-20) moves that mutant to this test.", + "Finding design-saving-section-stale (Medium). Rewrite design.md :475-512 from r4's final run, where every figure appears in an IV-REPORT line the report pastes. Delete :422-423's '6e-4 at the shipped scales' sentence, which no test prints. Contents:\n- the tile march and its marches;\n- (a)-(d) at far 2048, with (c)'s oracle ceiling, efficiency, cull fraction and probe overhead;\n- (e) at the shipped void, Rh 198, S 50, Rc = Rh + S, e = -ln 1.5 / ln(1 - (Rh/Rc)^2): steps, snoise, cost, body tiles, the two depth errors;\n- the analytic body (condition, one probe, one step, the pin);\n- the WeightBound [w(z1), 1] deviation and why it encloses;\n- the contracts as asserted, (c) in the ruling's words.\n'The test skips' appears only if this run skips. No r2 or r3 number survives.", + "Site-ground's dense-reference browser check has the same blind spot (its converged mean luminance is compared after the walls' bodies). It is follow-up cultmath-tapes:follow_up:site-ground-dense-check-blind-past-body, owned by the next site-ground spec. Not this cut.", + "Mutation evidence, cheap by design. src is untouched, so Stryker has nothing in scope and is not run; the negative check proves the premise. Run ONE tools/mutation-table.sh job on Yggdrasil against the final head, test filter FullyQualifiedName~NoiseBoundTests, with these rows:\n- MarchLod `transmittance *= Integrate(field, tile, slope, z, next, lod: true, counts);` -> `transmittance *= 1.0f;` must fail IntervalSkipHalvesEvaluations;\n- LodStep's return wrapped in `2.0f * (...)`: same test;\n- BodyDepth without its sqrt factor: AnalyticBodyMatchesFineMarch;\n- WeightBound `).x, 1.0f)` -> `).y, 1.0f)`: WeightBoundEnclosesOneSignedNoise;\n- MarchTile `if (bound.y <= 0.0f)` -> `if (bound.y <= 0.0f && !field.Name.Contains(\"wells\"))`: IntervalSkipHalvesEvaluations, under the floor options; a survivor under oracle-target-only, by that option's design;\n- Compose `CarveRadius` -> `HollowRadius` in the lo test: AnalyticBodyMatchesFineMarch (carried).\nNo per-mutant hand loops, no Starfire jobs.", + "Budget: under 200k Hands tokens. Read NoiseBoundTests.cs :480-1469 and design.md :344-515 once; no other file. Verification is one full CultMath.Tests run on Yggdrasil after the code commits (paste counts and every IV-REPORT line), the mutation-table job, and one fix round. If the headline agreement fails at r4's own numbers, do not move the factor or the step: report the measured errors as a fork." + ], + "deletes": [ + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 1, + "note": ":1455 the end-of-ray assertion 'the footprint-aware march differs from the reference by'; blind past the body (finding lod-agreement-blind-past-body)." + }, + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 4, + "note": ":1198-1201 BodyFactor and its comment; replaced by BodyDepth, the one owner of the body's optical depth." + }, + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 3, + "note": ":1375-1377 the test's own tau, its exp and the T-domain comparison; replaced by BodyDepth against the cells' summed depth." + }, + { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "lines": 2, + "note": ":1259-1260 RunStats.Ceiling and 'What no amortization can beat'; the mask-derived ceiling stops being a contract owner." + }, + { + "path": "packages/cultmath/docs/design.md", + "lines": 38, + "note": ":475-512 the saving section with r2's rows (1.41x, 16.45, 2.21x, 1.34x) and '(c) does not, so the test skips'." + }, + { + "path": "packages/cultmath/docs/design.md", + "lines": 2, + "note": ":422-423 'At the shipped scales (|c|_1 near 600, r near 5) it adds 6e-4.'; printed by no test." + } + ], + "keeps_moves": [ + "packages/cultmath/src, both CultMath.Interval.hlsl copies, README.md and every other test file: untouched.", + "Fields, grids (6/K end), seeds, e = 0.2, LodStep, Density, Bound, Compose, MarchTile, Integrate, the masked fixed-step march's exactness asserts, the (a) and (e) step contracts and the Skip mechanism: unchanged.", + "TileBallEnclosesEveryRaySegment, EnvelopeBoundEnclosesDensity, the Lipschitz tests, TightnessReport, IntervalTests, HlslSourceCompatibilityTests: unchanged.", + "AnalyticBodyMatchesFineMarch parts (1) and (3): unchanged; part (2) changes domain and owner only.", + "design.md :344-474 (Intervals up to the saving section, with the r3 frustum-ball paragraph minus the 6e-4 sentence) and every other section: unchanged." + ], + "adds": [ + "NoiseBoundTests.cs: BodyDepth; MarchLod's cutoff and (Transmittance, AtBody) return; ConvergedDepth; Run's slope-first draw, oracle mask, oracle march and the cutoff-0 agreement march; RunStats Oracle, OracleCeiling, Efficiency, ProbeOverhead, CullFraction, MaxOracleDifference, MaxLodDepthError, MaxRefDepthError; Report and ReportVoid fields; the (e) depth contract; (c)'s assertion per the ruling.", + "NoiseBoundTests.cs: VoidField.WeightBounds(z0, z1); Fact WeightBoundEnclosesOneSignedNoise; the header's mutation list updated.", + "design.md: the saving section rewritten from r4's run." + ], + "file_changes": [ + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 14, + "end_line": 20 + }, + "change": "Header mutation list: w(z0) for w(z1) now fails WeightBoundEnclosesOneSignedNoise. Add: the dropped pre-body integration and LodStep x2 fail IntervalSkipHalvesEvaluations's depth agreement; BodyDepth without |dir| fails AnalyticBodyMatchesFineMarch." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 992 + }, + "change": "Beside Weights(z): public (float2 Coarse, float2 Fine) WeightBounds(float z0, float z1) => (WeightBound(CoarseWavelength, z0, z1), WeightBound(FineWavelength, z0, z1))." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1198, + "end_line": 1201 + }, + "change": "BodyFactor -> BodyDepth(Scenario field, Tile tile, float2 slope, float z, bool lod, Counts counts): the float optical depth Density x Extinction x (Grid[^1] - z) x sqrt(m.x^2 + m.y^2 + 1), with no exp." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1205, + "end_line": 1235 + }, + "change": "MarchLod(..., float cutoff, ref long steps, ref long bodySteps) returns (float Transmittance, float AtBody). Both loop guards use cutoff. At z >= body: AtBody = transmittance, then transmittance *= exp(-BodyDepth(...)), steps++, bodySteps++, return. Without a body, AtBody = final T." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1236 + }, + "change": "New ConvergedDepth(Scenario field, Tile tile, float2 slope, int stop, float h, bool lod): sum over cells c < stop of ceil(len / h) midpoint samples, Density(field, tile, slope, z, lod, throwaway) x Extinction x dz x |dir| in double. Every cell, not the mask's." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1237, + "end_line": 1265 + }, + "change": "RunStats:\n- Counts Oracle; OracleEmpty and OracleEmptySkipped; MaxOracleDifference; MaxLodDepthError; MaxRefDepthError.\n- OracleCeiling, Efficiency, ProbeOverhead and CullFraction as the spec's 'first' defines them.\n- Ceiling deleted.\nRatio and LodRatio are unchanged." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1270, + "end_line": 1305 + }, + "change": "Run, per tile:\n- MarchTile.\n- Draw N^2 slopes.\n- Oracle mask over all cells (mid-depth Density > 0 for any slope; throwaway Counts); count oracle-empty cells and those the mask skips.\n- Per ray: dense, masked and oracle marches (oracle into stats.Oracle; MaxOracleDifference).\n- With lod: the costed MarchLod (cutoff 0.02), then a cutoff-0 MarchLod and ConvergedDepth at h 0.5 into throwaway Counts, and tauRef with no early-out; update both depth errors." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1307, + "end_line": 1318 + }, + "change": "Report prints oracle ceiling, efficiency, cull fraction (with counts), probe overhead and max oracle |dT| in place of 'ceiling'. ReportVoid adds the depth errors of LOD and fixed-step against the converged march and their ratio; the end-of-ray |dT| stays." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1332 + }, + "change": "AnalyticBodyMatchesFineMarch part (2): depth = BodyDepth(field, tile, ray, grid[b], lod: true, counts); sum = the double sum over c in [b, last) of -Math.Log(Integrate(field, tile, ray, grid[c], grid[c + 1], lod: true, counts)); assert |depth - sum| <= 1e-4 x sum, naming field, b and both values. The doc comment says so." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1430, + "end_line": 1440 + }, + "change": "(a)-(d) loop: Assert MaxOracleDifference == 0 beside the existing <= 1e-3. :1437 records the ruling's (c) quantity (Efficiency, CullFraction or ProbeOverhead), the lower of warp 0 and D at N = 8, and the CullFraction floor value when the ruling has one." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1453, + "end_line": 1466 + }, + "change": "Headline:\n- MaxDifference == 0 stays.\n- :1455 is replaced by Assert MaxLodDepthError <= 2 x MaxRefDepthError, with both values in the message.\n- Under a floor option: Assert CullFraction >= 0.5 for (c) at both warps (hard).\n- Shortfalls: (c) per the ruling.\n- The contracts line names the quantity and prints the (e) depth errors." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 1402, + "end_line": 1414 + }, + "change": "IntervalSkipHalvesEvaluations doc comment:\n- the (e) agreement is the converged depth, 2x the fixed-step's;\n- (c) per the ruling, citing it;\n- the oracle is defined;\n- 'within 0.02' leaves." + }, + { + "location": { + "path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs", + "line": 304 + }, + "change": "After EnvelopeBoundEnclosesDensity: Fact WeightBoundEnclosesOneSignedNoise, as item 10 of 'first'. Its message names z0, z1, z, the octave, the weight and the bound." + }, + { + "location": { + "path": "packages/cultmath/docs/design.md", + "line": 475, + "end_line": 512 + }, + "change": "The saving section is rewritten from r4's IV-REPORT lines (contents in item 11 of 'first'). The next paragraph, 'Consumers: ...' at :514, is kept." + }, + { + "location": { + "path": "packages/cultmath/docs/design.md", + "line": 422, + "end_line": 423 + }, + "change": "Delete the sentence 'At the shipped scales (|c|_1 near 600, r near 5) it adds 6e-4.' Leave the rest of the paragraph." + } + ], + "authority_map": { + "owner": "The saving test owns the proving-ground numbers and their oracles. The converged march (h = 0.5) is the accuracy oracle before the body. The oracle mask (cells some ray of the tile samples nonzero) is (c)'s ceiling oracle. BodyDepth is the one owner of the body's optical depth, in the march and in its pin. CultMath src is untouched. The operator owns the contracts: the rulings and the answer to wells-ceiling-oracle.", + "inputs": [ + "the r3 fields, grids, seeds, tiles and marches at 3ac7250a", + "the ruling answering cultmath-tapes:question:wells-ceiling-oracle" + ], + "outputs": [ + "IV-REPORT rows: the LOD and fixed-step depth errors against the converged march; (c)'s oracle ceiling, efficiency, cull fraction and probe overhead", + "design.md's saving section, every figure from those rows" + ], + "derived_state": [ + "(c)'s ceiling is no longer derived from the pre-pass's own mask; it is derived from the oracle mask, which the pre-pass cannot move.", + "Dense/Masked is no longer a contract owner; Masked/(Masked+Probes) is printed as probe overhead (an owner only under overhead-plus-floor).", + "The fixed-step march is no longer the LOD march's accuracy oracle; it is a peer measured against the converged march, and its error sets the LOD's allowance (2x).", + "End-of-ray |dT| is display-only.", + "The body's optical depth is derived once, by BodyDepth; the test no longer re-derives it." + ], + "forbidden_writers": [ + "no assertion compares the LOD march with the fixed-step march directly, or after the body", + "AnalyticBodyMatchesFineMarch does not compute the body's depth itself; it calls BodyDepth", + "neither the oracle mask nor ConvergedDepth reads MarchTile's output", + "no change to src, the HLSL, the fields, grids, LodStep, seeds, the 0.2 weight or the 2x factor toward a contract", + "no figure in design.md that this run's IV-REPORT lines do not print" + ], + "shared_paths": [ + "MarchLod is one function for the costed march (cutoff 0.02) and the agreement march (cutoff 0)", + "one Run computes dense, masked, oracle, LOD and converged for every scenario; the headline and the grid print the same fields", + "the site's mirror of the march inherits the same check through follow-up site-ground-dense-check-blind-past-body" + ], + "deletion_line": "The end-of-ray LOD assertion, BodyFactor, the test's own tau, RunStats.Ceiling, the (c) Ratio/Ceiling special case, design.md's r2 rows and the unprinted 6e-4 sentence all leave before their replacements are written. Net: about +170 / -60 in tests and docs, nothing in src. What that buys: (e) can now fail on a wrong pre-body march, the body depth can fail on a wrong |dir|, (c) can fail on a pre-pass that proves nothing, and the WeightBound mutant dies." + }, + "verification": { + "builds": [ + "Yggdrasil: dotnet test packages/cultmath/tests/CultMath.Tests -c Release green or skipped only by saving-2x-scenarios as the ruling implies (MeasureLipschitz/MeasureMonotonicity excluded by trait); paste counts and every IV-REPORT line", + "Yggdrasil: one tools/mutation-table.sh job at the final head with the six rows in 'first' item 13; the table pasted; every row CAUGHT by the named test except the wells row under oracle-target-only", + "No Stryker run and no Starfire job: no src or HLSL change in 3ac7250a..HEAD (negative check)" + ], + "tests": [ + { + "name": "NoiseBoundTests.IntervalSkipHalvesEvaluations", + "pins": "At the shipped void the footprint march's optical depth at the body start is within 2x the fixed-step march's error of a converged march; the oracle march equals the dense march exactly; (c) is asserted per the ruling against a ceiling the pre-pass cannot move; (a) and (e) step contracts as before." + }, + { + "name": "NoiseBoundTests.AnalyticBodyMatchesFineMarch", + "pins": "BodyDepth, the depth MarchLod uses, equals the summed fixed-step depth of the body cells within 1e-4 relative, in the depth domain (no underflow), so a body depth without |dir| fails on every tile; parts (1) and (3) unchanged." + }, + { + "name": "NoiseBoundTests.WeightBoundEnclosesOneSignedNoise", + "pins": "Each octave weight at every sampled depth in [z0, z1] lies in WeightBounds(z0, z1), and w(z) n lies in iv_mul(bound, n) for a one-signed n, so a lower end above w(z1) fails." + }, + { + "name": "NoiseBoundTests (rest) and CultMath.Tests (rest)", + "pins": "unchanged and green." + } + ], + "negative": [ + { + "pattern": "git diff --name-only 3ac7250a..HEAD", + "scope": "exactly NoiseBoundTests.cs and design.md under packages/cultmath." + }, + { + "pattern": "git diff 3ac7250a..HEAD -- packages/cultmath/src packages/cultmath/shaders packages/cultmath/unity", + "scope": "empty." + }, + { + "pattern": "BodyFactor|Ceiling =>|\\.Ceiling\\b|MaxLodDifference <= ", + "scope": "NoiseBoundTests.cs: 0 matches." + }, + { + "pattern": "Math\\.Exp\\(-\\(double\\)tau\\)|var tau = density", + "scope": "NoiseBoundTests.cs: 0 matches (the test does not re-derive the body)." + }, + { + "pattern": "1\\.41x|16\\.45|2\\.21x|1\\.34x|6e-4|does not, so the test skips|where the rays need them", + "scope": "packages/cultmath/docs/design.md: 0 matches." + }, + { + "pattern": "Assert\\.Skip", + "scope": "NoiseBoundTests.cs: at most one, in IntervalSkipHalvesEvaluations, naming saving-2x-scenarios." + } + ], + "operator": [] + }, + "estimate": { + "lines_added": 170, + "lines_removed": 60, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": [], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [ + "cultmath-tapes:ruling:operator-wells-contract-vs-ceiling", + "cultmath-tapes:ruling:operator-analytic-wall-body", + "cultmath-tapes:ruling:operator-footprint-lod-march", + "cultmath-tapes:ruling:operator-measure-with-empty-space", + "cultmath-tapes:ruling:operator-tile-amortized-march", + "cultmath-tapes:ruling:operator-shipped-void" + ], + "questions": [ + "cultmath-tapes:question:wells-ceiling-oracle" + ] +} diff --git a/docs/cultmath-interval-ground-cut-interval-ops.spec.json b/docs/cultmath-interval-ground-cut-interval-ops.spec.json new file mode 100644 index 00000000..83a82b31 --- /dev/null +++ b/docs/cultmath-interval-ground-cut-interval-ops.spec.json @@ -0,0 +1,146 @@ +{ + "campaign": "cultmath-tapes", + "cut": "interval-ops", + "revision": 1, + "title": "Interval ops: cultmath_iv_* over float2(lo, hi) in C# and HLSL with enclosure tests, a committed Lipschitz constant for snoise, and ball bounds for snoise and fbm", + "repo": "GameCult/CultLib", + "branch": "hands/cultmath-interval-ops", + "base": "c49c76ee", + "depends_on": [], + "first": [ + "Map: docs/cultmath-interval-ground-cut.md, sections 'Ownership', 'Interval culling along the ray' and 'The proving-ground contract'. Parked target: docs/cultmath-tape-target.md, sketch step 1 (:59-64) and 'Open before unparking' (:106-115). This cut is step 1 and nothing after it: no tape, no pruning, no min/max choice tracking, no affine arithmetic (map D1).", + "Common rules from the Asura cut map (Asura docs/cut-map.md, 'Common rules for every addition', :453-489): C# in packages/cultmath/src/CultMath as a partial of math (the Phacelle pattern: math.Phacelle.cs beside math.cs), HLSL in a new shaders/CultMath.Interval.hlsl included from CultMath.hlsl the way CultMath.Phacelle.hlsl is (:506), names prefixed cultmath_, both tracked HLSL copies one blob, bodies inside design.md's transformation list (:92-134), THIRD-PARTY-NOTICES untouched (nothing is ported; Fidget's ideas are used, not its code).", + "Representation: an interval is float2(lo, hi), lo <= hi, both finite. The empty interval does not exist; a caller that needs 'provably empty' tests hi < cutoff. Point intervals are iv_point(x) = float2(x, x).", + "Op set, each with the C# twin the mirror test demands: iv_point, iv_add, iv_sub, iv_neg, iv_mul, iv_scale(iv, float), iv_abs, iv_min, iv_max, iv_sqr, iv_sqrt (lo clamped at 0), iv_exp, iv_clamp(iv, float, float), iv_saturate, iv_smoothstep(float e0, float e1, iv) (monotone: endpoints), iv_lerp(iv, iv, float t). No others until a consumer names one.", + "Noise bounds: CULTMATH_SNOISE_LIPSCHITZ (static const float, provenance in the comment: measured max |snoise_grad| over 1e6 seeded points plus 1e4 gradient-ascent refinements, times 1.10; the test that measures it is committed as a slow, explicitly-run test and the constant is pinned by a fast test). iv_snoise_ball(float3 c, float r) = [snoise(c) - L r, snoise(c) + L r] intersected with [-1, 1]. iv_fbm_ball(c, r, octaves, lacunarity, gain) = the octave sum of iv_snoise_ball(c * f_i, r * f_i) scaled by a_i, octaves clamped to [0, 16] like fbm_grad.", + "Write the enclosure property first, as the shared harness: for each op, 10,000 seeded random intervals (widths from 1e-4 to 10, centres in [-20, 20]) and 16 points inside each; assert f(x) in op(I) with no tolerance (the bound is computed in the same float32 arithmetic; where rounding could exclude an endpoint, widen the op by one ulp in the implementation, not the test, and say so in design.md). For the ball bounds: 2,000 balls, r in [1e-3, 2], 64 points inside each.", + "The saving test: a representative coverage field (one snoise octave at F0 = 0.35, cutoff 0.25) and 1,000 seeded rays through a slab of depth 12; march once at the dense step and once with the adaptive interval march from the map (Δ0, ΔMAX = 8 Δ0, ΔDENSE = Δ0/2, grow on skip, halve on maybe); count snoise evaluations; assert the integrated transmittance agrees within 1e-3 and the evaluation count is at least 2x lower. Print both counts and the ratio; the cut report quotes them.", + "The warp enclosure test (the site's march rests on it): for 2,000 seeded (centre c, radius r, warp bound D) triples and random flow vectors with |flow| <= D, every warped point c' = x + flow (x in the ball of radius r) lies in the ball of radius r + D, and snoise(c') lies in iv_snoise_ball(c, r + D). This is a property of the existing bound, not a new function; it is written as a named test so the domain-warp use is pinned and documented in design.md.", + "The saving test's field is domain-warped: coverage = sum over two phases of snoise(p + flow * (phase_k - 0.5) * PERIOD) with a bounded flow, matching the map's field shape, so the interval radius includes D.", + "Tightness: a committed test prints the mean width ratio (interval width / true range over the 64 points) for iv_snoise_ball at r = 0.05, 0.25, 1.0 and for iv_fbm_ball at 4 octaves. No assertion beyond finiteness; the number is for the report and for a later affine cut to beat.", + "Verification on Yggdrasil: dotnet test from packages/cultmath/tests/CultMath.Tests; Stryker --since:c49c76ee from a plain clone. Starfire: FXC cs_5_0 kernel calling every iv_* function and both ball bounds; dxc -T lib_6_3 -HV 2021. Detached with a log, polled in the foreground; never a background shell task. Numbers in comments or docs come from committed tests only.", + "If glsl-lowering has merged to main before this branch does, rebase and regenerate shaders/CultMath.glsl (CULTMATH_WRITE_GLSL=1) so the pin test is green on the merge; if not, the lowering cut regenerates after this one. Either order works because the GLSL is derived." + ], + "deletes": [], + "keeps_moves": [ + "snoise, snoise_grad, fbm_grad, ridged_grad, cellular, phacelle: untouched. The bounds call snoise (value) only; snoise_grad is used by the Lipschitz measurement test, not by any bound (map D2).", + "design.md's invariant 8 section (136-) is unchanged; intervals are not value-and-gradient primitives and do not claim the float4(grad, value) layout.", + "HlslMirrorTests' ban on erosion kernels stands; nothing named interval touches it." + ], + "adds": [ + "packages/cultmath/src/CultMath/math.Interval.cs: public static partial class math with iv_point, iv_add, iv_sub, iv_neg, iv_mul, iv_scale, iv_abs, iv_min, iv_max, iv_sqr, iv_sqrt, iv_exp, iv_clamp, iv_saturate, iv_smoothstep, iv_lerp, iv_snoise_ball, iv_fbm_ball, and the constant SNOISE_LIPSCHITZ; each with a doc comment stating the enclosure it guarantees and the ulp widening where one is needed.", + "packages/cultmath/shaders/CultMath.Interval.hlsl: the HLSL mirrors with the same names prefixed cultmath_, and CULTMATH_SNOISE_LIPSCHITZ as static const; included from CultMath.hlsl after the Phacelle include (:506). Both tracked HLSL copies.", + "tests/CultMath.Tests/IntervalTests.cs: the enclosure harness over every op; iv_mul sign cases (all four quadrant combinations and a zero-straddling factor); iv_sqrt with lo < 0; iv_abs straddling zero gives [0, max(|lo|,|hi|)]; iv_smoothstep monotonicity; iv_min/iv_max against the pointwise min/max; a mutant that shrinks any bound by one ulp dies (hand-mutation list in the file header for the float arithmetic Stryker cannot reach, as in 2a-ii-a).", + "tests/CultMath.Tests/NoiseBoundTests.cs: iv_snoise_ball and iv_fbm_ball enclosure; LipschitzConstantPinsSampledGradients (fast, 1e5 points); MeasureLipschitz (slow, explicit trait, prints the max and the refined max); TightnessReport; the saving test (InvalSkipHalvesEvaluations) with its printed counts.", + "packages/cultmath/docs/design.md: a section 'Intervals' after the invariant 8 section: representation, the op list, the ulp-widening rule, the Lipschitz provenance and margin, what the ball bounds guarantee and what they do not (nothing about tapes), and that the site's ground shader and Aetheria's nebula raymarch are the consumers.", + "packages/cultmath/README.md: one paragraph under the noise entry naming the interval family and its purpose (empty-space culling with a proof)." + ], + "file_changes": [ + { + "location": { "path": "packages/cultmath/shaders/CultMath.hlsl", "line": 506 }, + "change": "add #include \"CultMath.Interval.hlsl\" after the Phacelle include; both tracked copies." + }, + { + "location": { "path": "packages/cultmath/src/CultMath/math.cs", "line": 602 }, + "change": "no change to snoise; a comment pointer from snoise to SNOISE_LIPSCHITZ in math.Interval.cs so the next kernel change knows the constant must be re-measured." + }, + { + "location": { "path": "packages/cultmath/docs/design.md", "line": 136 }, + "change": "new 'Intervals' section after invariant 8." + }, + { + "location": { "path": "packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs", "line": 348 }, + "change": "none expected; confirm the mirror resolves the second #include and that every cultmath_iv_* finds its C# twin (a mirror without a twin fails Assert.Contains MirrorOnly)." + } + ], + "authority_map": { + "owner": "CultMath owns interval arithmetic and the noise bounds in C# and HLSL (and GLSL by derivation). The Lipschitz constant is owned by the committed measurement test; the kernel of snoise owns its value.", + "inputs": [ + "the existing snoise(float3) value function; snoise_grad for the measurement test only", + "seeded random points and intervals in tests" + ], + "outputs": [ + "cultmath_iv_* and the two ball bounds, each enclosing its function over its input region", + "three printed numbers for the report: the Lipschitz max, the tightness ratios, the evaluation saving" + ], + "derived_state": [ + "CULTMATH_SNOISE_LIPSCHITZ is derived from the snoise kernel; a kernel change must re-run MeasureLipschitz and re-pin", + "shaders/CultMath.glsl (if the lowering has landed) is derived and regenerated, never edited" + ], + "forbidden_writers": [ + "no interval op without the enclosure test and a C# twin", + "no bound that reads snoise_grad; no value-only/gradient twin of any iv_* function", + "no tape, bytecode, pruning, choice flag or affine form in this cut; names containing tape, prune or affine do not appear", + "no number in a comment or design.md that a committed test did not print" + ], + "shared_paths": [ + "the same IntervalTests enclosure harness runs every op; a new op is one entry in its table", + "the existing HLSL mirror test covers every HLSL interval function with no new comparison path" + ], + "deletion_line": "Nothing is deleted. The liability is one C# file, one HLSL file, two test files and a doc section; it buys the invariant intervals-enclose for every GPU consumer, and it is step 1 of the parked tapes campaign landed in advance." + }, + "verification": { + "builds": [ + "Yggdrasil: dotnet test packages/cultmath/tests/CultMath.Tests green (MeasureLipschitz excluded by trait); paste counts", + "Yggdrasil: dotnet stryker --since:c49c76ee from a plain clone; 0 survivors in math.Interval.cs except listed equivalents; hand mutations for float3 arithmetic listed and killed", + "Starfire: FXC cs_5_0 kernel over every new function; dxc -T lib_6_3 -HV 2021 on both HLSL copies" + ], + "tests": [ + { + "name": "IntervalTests.EveryOpEnclosesItsPoints", + "pins": "intervals-enclose for every op, no tolerance." + }, + { + "name": "NoiseBoundTests.SnoiseBallEnclosesPoints / FbmBallEnclosesPoints", + "pins": "the ball bounds enclose snoise and fbm over 2,000 balls x 64 points." + }, + { + "name": "NoiseBoundTests.WarpedPointsStayEnclosed", + "pins": "a domain warp bounded by D is enclosed by enlarging the ball radius by D; the site's interval march is sound." + }, + { + "name": "NoiseBoundTests.LipschitzConstantPinsSampledGradients", + "pins": "no sampled |snoise_grad| exceeds the constant; a constant lowered by 1% fails." + }, + { + "name": "NoiseBoundTests.IntervalSkipHalvesEvaluations", + "pins": "the adaptive march needs <= half the evaluations of the dense march for the same transmittance within 1e-3." + }, + { + "name": "HlslSourceCompatibilityTests.EveryMirrorFunctionMatchesCSharpMath (existing)", + "pins": "every cultmath_iv_* and both bounds match C# bit for bit." + } + ], + "negative": [ + { + "pattern": "tape|prune|affine|choice", + "scope": "packages/cultmath/src/CultMath/math.Interval.cs and shaders/CultMath.Interval.hlsl: 0 matches (case-insensitive)." + }, + { + "pattern": "snoise_grad|fbm_grad", + "scope": "math.Interval.cs and CultMath.Interval.hlsl: 0 matches; the bounds use values only." + }, + { + "pattern": "spherical_erosion|AdvancedErosionFilter", + "scope": "packages/cultmath: 0 matches (HlslMirrorTests' standing rule)." + }, + { + "pattern": "git diff --name-only c49c76ee..HEAD", + "scope": "only packages/cultmath/** (and shaders/CultMath.glsl if regenerated); no other package or src tree." + } + ], + "operator": [] + }, + "estimate": { + "lines_added": 900, + "lines_removed": 0, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": [], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [], + "questions": [] +} diff --git a/docs/cultmath-interval-ground-cut-site-ground.r3.spec.json b/docs/cultmath-interval-ground-cut-site-ground.r3.spec.json new file mode 100644 index 00000000..83558f7b --- /dev/null +++ b/docs/cultmath-interval-ground-cut-site-ground.r3.spec.json @@ -0,0 +1,246 @@ +{ + "campaign": "cultmath-tapes", + "cut": "site-ground", + "revision": 3, + "title": "Site ground r3: A cloud volume carved by one negative pseudo-Gaussian sphere, a sun at the hollow's bottom lights the walls and orbits, the camera follows low inside; pre-pass, camera-aware TAA", + "repo": "GameCult/gamecult-site", + "branch": "main", + "base": "535d170", + "depends_on": [ + "site-masthead:cut_spec:wash-home-only.r1", + "cultmath-tapes:cut_spec:glsl-lowering.r2", + "cultmath-tapes:cut_spec:interval-ops.r3" + ], + "first": [ + "Map: F:/Projects/CultLib/docs/cultmath-interval-ground-cut.md, 'Pass 3' (the void scene, the composed bound, the pre-pass, the budget), then 'The shader design' for what pass 3 does not restate (sampled wash, palette input, pausing, contrast). Rulings in force: cultmath-tapes:ruling:operator-ground-void-brush (the scene), operator-tile-amortized-march (the march), site-masthead:ruling:operator-chromeless-column; wash-home-only's authority map. Re-pin base to main after wash-home-only lands. Stardust and DoF stay the next cut; leave the named composite slot. r2's token, readback, controller, vendoring, parity and fallback items stand unless this revision names them.", + "The original, read once (Aetheria at e6181c11, 2021-03-13, Assets/Scenes/Main Menu.unity; Prefabs/RPG/Planets/Sun.prefab; Materials/Brushes/Gravity Well.mat, Main Menu Sun Fog Tint.mat, Main Menu Ambient Fog Tint.mat, Sector Boundary Fog.mat; Materials/Fog Marching Main Menu.mat; Shaders/Raymarching/VolumeRender.shader at that commit; Shaders/Brushes/PowerBrush.shader). What survives, in the original's units: the brush is PowerBrush (1 - x^2)^16 with depth 40 over radius 256 (half depth at r = 52, pseudo-Gaussian sigma about 45), the sun's own gravity-well child; a wide boundary bowl (depth 75, power 0.25, radius 1500) is flat across the scene and acts as a constant 75; floor offset -16.46, floor blend 39.6, so the fog top is at y = -91 outside the void and dips to -131 at the sun; the sun sphere (radius 12.5) sits at y = -130, the bottom of the void.", + "What survives (continued): the sun is a child of 'Center', which rotates 5 degrees per second about y (72 s period), at orbit radius 175; the camera is a Cinemachine vcam following the sun (framing transposer, distance 150, damping 10, handheld noise amplitude 1 at frequency 0.25) and looking at 'Look Target' (0, -130, 0), the orbit centre at the sun's depth; the saved camera sits at y = -27, 64 above the fog top. The lighting was authored, not marched: the sun's 'Fog Tint' brush (1 - x^2)^3, depth 2, radius 128, colour (1, 0.4, 0.1) orange, painted into the tint map, times a scene-wide ambient tint (0.18, 0.59, 1) blue, depth 0.01. Stardust: 256^2 particles, spacing 2, floor -60, ceiling 0, height exponent 800 / (ceiling + wellDepth) so particles climb higher where the well is deeper (the void fills with stardust). Noise: strength 150, frequency 0.01, safety 50. Not surviving: the 2021 d() details, the tint map's runtime contents, the video.", + "The field (ruling operator-void-true-cavity: a spherical hollow inside a cloud volume that surrounds it on every side, not the 2021 bowl). Units are the original's. Outer volume: an unbounded uniform fill, chosen over a shell because every ray then ends in a wall and the march terminates by opacity, never by a far plane; Z1 = |camera - c_v| + Rc + 6/K (614 at the shipped point) bounds the pre-pass range and is past opacity for every ray, so the analytic body step below always terminates. The carve is the pseudo-Gaussian brush g(d) = (1 - (d / Rc)^2)^e, d = |p - c_v|, density = K max(0, 1 - CARVE g(d')), authored by two knobs: the hollow radius Rh (density exactly 0 inside; Rh = Rc sqrt(1 - CARVE^(-1/e))) and the ramp width S (density full at Rh + S; set by the exponent: e = 4 gives S = 1.3 Rh, e = 0.25 gives S = 0.12 Rh).", + "Shipped (Q9 in the map, option (a) pending the operator): Rh = 198, S = 50, so Rc = Rh + S = 248 and e = -ln CARVE / ln(1 - (Rh / Rc)^2) = 0.40; CARVE = 1.5, K = 1/30: a wall is opaque within about 150 units of full density. The ramp and the noise fade band are both S wide; nothing void-shaped is authored twice (interval-ops r3, finding shipped-void-two-scenes). Noise displaces the wall only: fade(d) = smoothstep(Rh - S, Rh, d), d' = d + A fade(d) n(warp(p)), A = 20, F0 = 0.01.", + "Scene motion. The sun orbits the origin at radius 175 in xz with period 72 s (5 degrees per second, the original's Center pivot). The cavity centre is c_v = sun + (0, Rh - 12.5, 0): the sun sphere (radius 12.5) rests on the hollow's bottom and the hollow moves with it. The camera follows the sun 120 behind it along the orbit's tangent and 45 above it, so it sits 186 from c_v, 12 inside the hollow (the handheld drift is 2 units, two low-frequency snoise on time), low in the cavity, looking at the sun's position plus (0, 60, 0) so the lit lower wall and the dark upper wall share the frame. The 2021 follow distance 150 and height 25 do not fit a hollow a camera can stand in; 120 and 45 are the re-derivation, and the report says so. worldAt(t) in ground.js is the one owner of sun, cavity and camera, uploaded as uniforms; the shaders never integrate motion.", + "The flow field, authored around the void: flow(xz) = SWIRL * tangent(xz - sun.xz) * (1 - (r / Rw)^2)^2 + GLOBAL * (snoise(xz Ff + o1), snoise(xz Ff + o2)) (the swirl is largest mid-slope and zero at the rim and the centre; the global term is r2's). The flow texture is a world-space window of side 4 Rw centred on the sun, quarter of the canvas resolution, re-rendered every frame; warp, hue, motion vectors and (next cut) the stardust read it, so D4 holds with a moving scene. D = FLOW_MAX * PERIOD / 2 as before, with FLOW_MAX the authored maximum of the swirl plus the global amplitude.", + "The march (tile pre-pass, interval-ops r2's design). Pre-pass at W/8 x H/8: per tile, the loop over the slab's cell ranges (uniform cells, StepDense = min(10, S / 4) = 10, 62 cells to Z1 = 614 along +view depth; the mask has 96 bits): the envelope probe first (exact box: y and xz ranges by cultmath_iv_mul of the depth and slope intervals, d's interval is the box's least and greatest distance to c_v, exact; g, fade and the carve are monotone in it), then the noise ball (cultmath_iv_frustum_ball with D, cultmath_iv_snoise_ball) only when fade.hi > 0 and L r F0 leaves room to prove anything; writes the 96-bit mask of cells not proven empty to an RGBA32UI texel's first three words, and in the fourth word the body-start cell: the first cell whose own bound is a positive point and whose slice to Z1 is one too (the envelope with the free noise interval proves density exactly K for the rest of the range), 0xFFFFFFFF when none (interval-ops r3, ruling operator-analytic-wall-body).", + "(March, continued.) Main pass: texelFetch the mask, then march the unmasked range with the footprint step Delta(z) and the octave weights (next item), the per-frame sample count capped by the budget S_budget and the start jittered so TAA completes what one frame does not; masked cells are skipped exactly; at the body-start cell take one analytic Beer-Lambert step, T *= exp(-K (Z1 - z) |dir|) with K the field's pointwise envelope value there (no probe in the main pass), and stop; integrate transmittance and the depth-weighted mean distance, apply the light. Every tile's interior cells retire in a few envelope probes and its wall cells are marked; there are no sky tiles. Behind a fully transmissive pixel the resolve shows --gamecult-nebula-base; by construction only an unfinished ray (budget exhausted before the wall, measured, must be under 1%) reaches it.", + "Footprint LOD (the operator's challenge, map 'Footprint LOD'): theta_px = 2 tan(fov/2) / H; the footprint at distance z is z theta_px. Step: Delta(z) = max(k z theta_px, min(S / 4, lambda_fine(z) / 2)), k = 4: never finer than four footprints, otherwise the finer of the two content limits (four samples across the ramp, two per wavelength of the finest live octave). Octaves: octave i of wavelength lambda_i carries weight w_i(z) = 1 - smoothstep(lambda_i / (2m), lambda_i / m, z theta_px), m = 4: one smooth blend per octave, no popping; TAA hides per-frame sparsity. The weights are part of the field, so the bound encloses the truncated field exactly: the noise interval over a slice is the sum over octaves of iv_mul([w_i(z1), w_i(z0)], iv_snoise_ball(c F_i, r F_i)), w_i monotone in z. At the shipped parameters (wavelengths 100 and 25, z <= 2 Rc) every weight is 1 in the frustum and the content limits set the step; the footprint bites when S < 4 k z theta_px.", + "Where the scene sits and what to turn (Imagination's model, scratchpad cavity_model.py; the test and the browser confirm): interval-ops r2 measured the shipped point at 16.45 LOD steps and 26.6 snoise per pixel against 36.3 fixed steps (2.21x); r3's analytic body is predicted to bring the steps to about 12.5 (2.6-3.3x), snoise unchanged; the wall's step is set by S / 4 and the detail half-wavelength, not by distance; the browser confirms or refutes. Cheaper without losing the mood, in order: (1) a lower per-frame S_budget, which LOD and the mask make nearly lossless (S_budget = 4 converges in about three frames at the walls); (2) a thinner ramp S (S = 10 is 3.2x on cost but reads as a surface; 25-50 keeps the fog); (3) a longer detail wavelength or no detail octave near the far wall (the 12.5-unit half-wavelength is the floor for S >= 50); (4) a larger hollow (Rh = 1000: 2.5x) costs nothing per pixel and changes the composition. Camera offset barely matters at these scales.", + "Lighting, the cheapest version that keeps it moody (the original's own mechanism, made 3D): at each sample, light = SUN_COLOUR * (1 - (d / Rl)^2)^3 for d = |p - sun| < Rl, Rl = Rh = 198 (the original's 128 scaled with the hollow), plus AMBIENT * ambientTint; colour = density * (light + ambient) * hue(flow). No light march: zero extra snoise, one length and one pow per sample. The lower wall within Rl of the sun glows and the upper wall stays dark because the pulse is zero beyond Rl, which is the moody split; the sun inside the hollow is occluded by nothing, so the sun itself is a small additive disc drawn in the resolve at its projected position, occluded by the accumulated transmittance along its ray. Not in this cut, measured before it is ever added: one envelope-only transmittance sample toward the sun per primary sample (self-shadowing by the bowl's geometry), about +25% march cost; it is desktop-only if ever.", + "TAA with a moving camera. ground.js uploads this frame's and the previous frame's view-projection. For each pixel the resolve reconstructs the world point at the march's depth-weighted mean distance (written by the main pass into a second history channel, R16F), moves it back by the field motion (p + flow(p) * dt: the pattern moves at -flow), projects it with the previous VP and fetches history at that uv. The same 3x3 min/max clamp, alpha = max(1/frames, 1/32), out-of-bounds alpha 1; history reset on resize, first frame and budget step. Transmittance, colour and the depth channel are all reprojected by the one motion vector. ?ground=debug-mv shows |mv| with the camera moving and the flow frozen, and with the flow moving and the camera frozen, so both terms are seen separately.", + "Stardust distribution and the sun disc are the next cut (site-stardust), authored to the void: particles spawned in the bowl's volume with the original's height rule (more headroom where the well is deeper), lit by the same pulse, moving with the swirl. This cut leaves the composite slot and the depth history they need.", + "Fit with the tokens. Inputs: --gamecult-nebula-0 (orange 255 138 42) is SUN_COLOUR; --gamecult-nebula-2 (sky 89 183 255) is the ambient tint; --gamecult-nebula-1 (violet 109 96 255) is the cloud hue's second pole; --gamecult-nebula-base the sky. Outputs from the 8x8 readback as r2, with one change: --gamecult-light-0-at is written from the sun's projected screen position (quantised to 1%, at most 2 Hz), so the CSS wash's main light follows the sun while the shader runs; --gamecult-light-0 and -a come from the texel there; lights 1 and 2 keep their seed positions and sample their colours. When the canvas is absent the seeds paint a still of the same composition (the seed light-0-at is the sun's mean screen position).", + "Prove in the browser pane, in addition to r2's list: with ?ground=debug the pre-pass's mean probes per tile and the fraction of cells masked, and the mean snoise per pixel and the fraction of samples placed in the wall ramp against a dense-reference frame (?ground=dense: no pre-pass, S samples over the whole slab; the two converged frames' mean luminance agree within 1/255; the masked frame's per-frame variance at the walls is lower, printed); the camera reprojection test above; the orbit (after 36 s the sun's screen position has moved half an orbit and the TAA shows no smear at the walls); the contrast clamp with the lit cavity (max luminance <= 0.035 still holds; the sun disc is exempt only inside its own radius, which the clamp test masks and reports)." + ], + "deletes": [ + { + "path": "site/quartz/styles/custom.scss", + "lines": 6, + "note": "ritual body block 119-124: its own background goes; its seeds live under :root:has(body[data-slug]) (r2)." + }, + { + "path": "site/quartz/styles/custom.scss", + "lines": 9, + "note": "body 10-27: the literal colours and stops become token references (r2)." + } + ], + "keeps_moves": [ + "r2's tokens, sampled wash, controller, vendoring (now two files: the site vendors CultMath.glsl only, MIT; the parity run concatenates CultMath.Phacelle.glsl for the phacelle family), parity flags, fallbacks and the contrast clamp: unchanged except where this revision names them.", + "--gamecult-wash and the index override from wash-home-only: untouched.", + ".page::before, the tour/Pitch VN ground, the Thing deck's .hero-bg, the masthead, the engine: untouched.", + "The CSS wash stays the ground when the canvas is absent, not yet drawn, or removed by the controller." + ], + "adds": [ + "site/quartz/components/GameCultGround.tsx: as r2.", + "site/quartz/static/ground/ground.js (~500 lines): r2's passes plus worldAt(t) (sun, void, camera), the two view-projections, the pre-pass, the mask texture, the depth history, the sun-disc composite and the light-0-at writer.", + "site/quartz/static/ground/flow.frag.glsl (world-space window, swirl plus global), prepass.frag.glsl (the tile loop, mask and body-start out), cloud.frag.glsl (masked sampling, light, depth out), taa.frag.glsl (camera plus flow reprojection), downsample.frag.glsl.", + "site/quartz/static/ground/CultMath.glsl and glsl-parity.json, vendored from CultLib at interval-ops r3's head or later (cultmath_iv_frustum_ball with its float32 widening present).", + "scripts/ground/check-cultmath-glsl.ps1: the vendoring drift check.", + "custom.scss and docs/brand-design-language.md: as r2, with the void composition named in the brand doc's ground paragraph." + ], + "file_changes": [ + { + "location": { + "path": "site/quartz/styles/custom.scss", + "line": 4, + "end_line": 8 + }, + "change": ":root block: the fifteen ground seeds and --gamecult-ground-mean; light-0-at seeded at the sun's mean screen position." + }, + { + "location": { + "path": "site/quartz/styles/custom.scss", + "line": 10, + "end_line": 31 + }, + "change": "body: four nebula input tokens; radials and the linear gradient reference the ground tokens (r2)." + }, + { + "location": { + "path": "site/quartz/styles/custom.scss", + "line": 103, + "end_line": 124 + }, + "change": "ritual block: background declaration deleted; :root:has(body[data-slug]) carries its seeds and nebula inputs (r2)." + }, + { + "location": { + "path": "site/quartz.layout.ts", + "line": 19 + }, + "change": "header: [GameCultThemeLock(), GameCultGround(), GameCultMasthead()]." + }, + { + "location": { + "path": "docs/brand-design-language.md", + "line": 69, + "end_line": 84 + }, + "change": "wash section rewritten: the void scene, the sampled wash, the seeds, the nebula inputs and what each drives." + } + ], + "authority_map": { + "owner": "The shader owns the ground. ground.js owns worldAt(t) (sun, void, camera), the flow texture, the pre-pass mask, the march, the TAA, the readback and the sampled tokens; custom.scss owns the four nebula inputs, --gamecult-wash and the seeds; CultLib owns every noise and interval function; the composed bound in prepass.frag.glsl is built from cultmath_iv_* only.", + "inputs": [ + "the four nebula tokens and --gamecult-wash (computed on body)", + "prefers-reduced-motion, visibilityState, canvas size, devicePixelRatio, elapsed time", + "measured GPU frame time (timer query, fence, or rAF cadence)", + "the shader's own 8x8 readback and the sun's projected position", + "the vendored CultMath.glsl at its pinned CultLib commit" + ], + "outputs": [ + "one opaque moving canvas under the page, luminance <= 0.035 outside the sun disc", + "the fifteen ground tokens and --gamecult-ground-mean on :root inline, at most 2 Hz; light-0-at follows the sun", + "debug, dense-reference and parity readbacks (console, flag only)" + ], + "derived_state": [ + "sun, void and camera positions are derived from time by worldAt(t); nothing integrates motion frame to frame", + "the tile mask is derived each frame from that frame's camera and the field; it is never carried across frames", + "the flow texture is the one owner of motion: warp, hue, motion vectors and the stardust read it", + "the TAA history (colour, transmittance, depth) is a cache reprojected by camera and flow; reset on resize, first frame and budget step", + "the ground tokens are derived from the readback while the shader runs; the seeds are the fallback; the shader never reads them", + "S and dpr are derived from measurement within the session; the sessionStorage token set is a cache" + ], + "forbidden_writers": [ + "no colour, alpha, position or radius literal in ground.js or any GLSL file; the scene's dimensions (H0, Dw, Rw, F, S, Rl, orbit radius, period, camera offset) are named constants in one place in ground.js, uploaded as uniforms", + "no sample placed in a masked cell; no probe in the main pass; no early-out of the pre-pass on transmittance", + "no light march in this cut; the light is the analytic pulse", + "no read of the ground output tokens by the shader or ground.js except the seed read before the first readback", + "no userAgent, platform or maxTouchPoints; no class or attribute set on body or html; no second wash token; no second flow evaluation; no noise or interval function defined in the site's GLSL", + "no synchronous readPixels to client memory; one requestAnimationFrame scheduler; localStorage never" + ], + "shared_paths": [ + "every page paints one canvas and one token set; the ritual essays differ only in seeds and inputs", + "slow device, hidden tab, reduced motion, missing WebGL2 and missing half-float all pass through the one controller", + "the 8x8 readback and the sun projection are the only paths from the shader to CSS", + "the pre-pass and the main pass read the same uniforms from the same worldAt(t); the dense-reference mode differs only by skipping the mask" + ], + "deletion_line": "As r2: the ritual block's own background and the body literals go in the same commit the tokens are declared. Nothing else in the engine or content changes. Against pass 2's design this revision removes the static camera and the everywhere-clouds field; it adds one pre-pass, one mask texture, one depth history channel and the scene function." + }, + "verification": { + "builds": [ + "Deploy Quartz green on the landing commit: gh run list -R GameCult/gamecult-site -w \"Deploy Quartz\" -L 1", + "scripts/ground/check-cultmath-glsl.ps1 exits 0 against a CultLib checkout at the pinned commit", + "the built stylesheet contains rgb(var(--gamecult-light-0) / calc(var(--gamecult-light-0-a) * var(--gamecult-wash))) verbatim and the ritual :root:has rule" + ], + "tests": [ + { + "name": "browser pane, /?ground=debug: max relative luminance over the canvas outside the sun disc after 32 frames <= 0.035", + "pins": "text contrast with the lit cavity." + }, + { + "name": "browser pane, /?ground=debug vs /?ground=dense: converged mean luminance within 1/255; steps and snoise per pixel printed for both, debug at most half of dense's steps; mask fraction printed", + "pins": "the mask culls only provably empty cells; the shipped march takes at most half the fixed-step steps; the saving on the shipped scene is a number." + }, + { + "name": "browser pane, /?ground=debug-mv: |mv| non-zero with the camera moving and flow frozen, and with flow moving and camera frozen; zero under reduced motion", + "pins": "both reprojection terms are live and separable." + }, + { + "name": "browser pane, / for 40 s: the sun's screen position moves about half an orbit; no history smear at the walls (3x3 clamp); light-0-at on :root follows within 2 s", + "pins": "the moving scene converges and the CSS wash follows the sun." + }, + { + "name": "browser pane, /?ground=parity: every fixture family within its tolerance class on WebGL2, cultmath_iv_frustum_ball exact; numbers and GPU string in the report", + "pins": "GLSL = C# on a device, including the tile ball." + }, + { + "name": "browser pane, /?ground=parity-wash and a ritual essay: canvas vs CSS seed wash within 2/255 at 16 points with density 0 and the sun disc off", + "pins": "the seeds and the shader's base agree." + }, + { + "name": "reduced motion, hidden tab, WebGL2 disabled, sessionStorage cleared: as r2", + "pins": "every fallback goes through the controller." + }, + { + "name": "git diff base..head --stat: custom.scss, quartz.layout.ts, docs/brand-design-language.md, the new component, static/ground/*, scripts/ground/* only", + "pins": "no engine, content or masthead change." + } + ], + "negative": [ + { + "pattern": "#[0-9a-fA-F]{6}\\b|rgba?\\(|\\b(255|138|109|183)\\b", + "scope": "site/quartz/static/ground/*.js and *.glsl: 0 matches." + }, + { + "pattern": "gamecult-ground-|gamecult-light-", + "scope": "site/quartz/static/ground/*.glsl: 0 matches; in ground.js only inside the token writer and the seed read." + }, + { + "pattern": "userAgent|navigator\\.platform|maxTouchPoints|localStorage|setInterval|classList|setAttribute\\(", + "scope": "site/quartz/static/ground/ground.js: 0 matches." + }, + { + "pattern": "cultmath_iv_", + "scope": "cloud.frag.glsl, taa.frag.glsl, flow.frag.glsl: 0 matches; the bound lives only in prepass.frag.glsl." + }, + { + "pattern": "float cultmath_|vec4 cultmath_|float snoise|hash\\(", + "scope": "every site .frag.glsl: 0 matches; cultmath_* is defined only in the vendored CultMath.glsl." + }, + { + "pattern": "Mozilla|MPL|cultmath_phacelle", + "scope": "site/quartz/static/ground/CultMath.glsl: 0 matches; the site vendors the MIT file." + }, + { + "pattern": "radial-gradient\\([^)]*rgba?\\([0-9]", + "scope": "site/quartz/styles/custom.scss, body rule and ritual block: 0 matches." + }, + { + "pattern": "gamecult-titlebar|gamecult-nav-link|sidebar|composite|GameCult-Quartz", + "scope": "git diff base..head changed lines: 0 matches." + } + ], + "operator": [ + "open / on the desktop and on the phone; say whether the hollow, the sun's orbit and the camera's height read as the old main menu's mood (uniforms: A, SWIRL, Rl, CARVE, the camera offset)", + "on the phone with ?ground=debug, read the logged GPU ms per pass and the controller's final S/dpr; say whether it got warm after five minutes", + "say whether the analytic light is moody enough or the self-shadowing sample (desktop only) should be tried", + "navigate / -> /Blog -> back; say whether the ground is continuous (Q5)" + ] + }, + "estimate": { + "lines_added": 1250, + "lines_removed": 15, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": [ + "GLSL ES 3.00 shader files in static/ground", + "vendored glsl-parity.json", + "one sessionStorage key holding the last sampled token set", + "an RGBA32UI tile-mask texture and an R16F depth history (GPU-side only)" + ], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [ + "cultmath-tapes:ruling:operator-ground-void-brush", + "cultmath-tapes:ruling:operator-void-true-cavity", + "cultmath-tapes:ruling:operator-tile-amortized-march", + "cultmath-tapes:ruling:operator-analytic-wall-body", + "cultmath-tapes:ruling:operator-split-phacelle", + "site-masthead:ruling:operator-chromeless-column" + ], + "questions": [ + "Q4 in the map: palette input tokens (a, recommended)", + "Q5 in the map: carry the last sampled wash across page loads (a, recommended)", + "Q9 in the map: the one shipped void (a, recommended: Rh 198, S 50, Rc 248, e 0.40); ruled in interval-ops r3's fork, this spec follows it" + ] +} diff --git a/docs/cultmath-interval-ground-cut-site-ground.spec.json b/docs/cultmath-interval-ground-cut-site-ground.spec.json new file mode 100644 index 00000000..a19f2b3e --- /dev/null +++ b/docs/cultmath-interval-ground-cut-site-ground.spec.json @@ -0,0 +1,206 @@ +{ + "campaign": "cultmath-tapes", + "cut": "site-ground", + "revision": 2, + "title": "Site ground: a per-pixel WebGL2 nebula under every page, flow-warped, interval-culled, TAA-reprojected, budget-controlled by measurement; the CSS wash is sampled from the result, seeds fall back", + "repo": "GameCult/gamecult-site", + "branch": "main", + "base": "535d170", + "depends_on": [ + "site-masthead:cut_spec:wash-home-only.r1", + "cultmath-tapes:cut_spec:glsl-lowering.r1", + "cultmath-tapes:cut_spec:interval-ops.r1" + ], + "first": [ + "Map: F:/Projects/CultLib/docs/cultmath-interval-ground-cut.md, 'The shader design' (field, culling with the warp, TAA motion-aware, sampled wash, palette input), 'Budget', D4-D8, Q4 and Q5. Rulings in force: site-masthead:ruling:operator-chromeless-column; wash-home-only's authority map (no second wash token, no class toggled by script, no page rule setting a radial alpha). Re-pin base to main after wash-home-only lands; line numbers below are from 535d170; re-read by selector. Stardust and DoF are the next cut: leave the resolve pass with a named, empty composite slot for them (a uniform-gated branch is not needed; a comment and a function stub are).", + "Aetheria reference, read once, copy nothing: Volumetric.cginc:165-221 (two-phase flow-map warp, tri2 cross-fade), :130-135 (globalFlow); Raymarching/CloudShader.shader:83-104 (integration) and :261-314 (what not to do: gamma 0.5 clip, fixed 0.05 blend, packed depth, the density2 bug at :311).", + "Engine facts to confirm before writing: how GameCult-Quartz bundles a component's afterDOMLoaded and whether a dynamic import() of /static/ground/ground.js is allowed, else emit a module script tag; site/quartz/static/** served at /static/**; enableSPA false (quartz.config.ts:15). Local build: scripts/quartz/quartz.ps1 dev.", + "Tokens. Inputs (Q4 a), on body in custom.scss beside --gamecult-wash: --gamecult-nebula-0/1/2 (\"255 138 42\", \"109 96 255\", \"89 183 255\") and --gamecult-nebula-base (#07111a). Outputs with seeds, on :root: --gamecult-ground-0/1/2 (#03070d #07111a #09141f), and for N in 0..2 --gamecult-light-N (rgb triple), -a (0.18/0.16/0.14), -at (\"78% 14%\"/\"18% 10%\"/\"52% 0%\"), -r (18%/24%/28%), plus --gamecult-ground-mean (#07111a). The body background becomes radial-gradient(circle at var(--gamecult-light-0-at), rgb(var(--gamecult-light-0) / calc(var(--gamecult-light-0-a) * var(--gamecult-wash))), transparent var(--gamecult-light-0-r)) x3 over linear-gradient(180deg, var(--gamecult-ground-0) 0%, var(--gamecult-ground-1) 44%, var(--gamecult-ground-2) 100%).", + "Ritual essays: their seeds go under :root:has(body[data-slug=\"Blog/...\"]) for the three slugs (yellow 255 178 30 .15 at 78% 8% 24rem; cobalt 49 88 255 .22 at 18% 4% 30rem; violet 91 54 184 .19 at 44% 20% 34rem; stops #030414 0%, #070b24 42%, #040514 100%; nebula inputs likewise overridden to yellow/cobalt/violet and base #050614). The ritual block's own background declaration is deleted; it inherits body's.", + "ground.js owns: WebGL2 context on #gamecult-ground (alpha:false, antialias:false, powerPreference 'low-power'); capability check (WebGL2, EXT_color_buffer_half_float or float); input token read via getComputedStyle(document.body) -> uniforms; the flow texture pass (quarter res, RG16F, two snoise per texel, once per frame); the march pass; the TAA resolve with reprojection; the 8x8 downsample and the async PBO readback; the token writer on document.documentElement.style; the scheduler (30 fps cadence, visibilityState pause, reduced-motion freeze and stop at 32 frames); the budget controller; the debug flag (?ground=debug) and parity flags.", + "Sampled wash: after the resolve, draw the final frame into an 8x8 RGBA8 target; gl.readPixels into a PIXEL_PACK_BUFFER; gl.fenceSync; on later frames poll getSyncParameter(SYNC_STATUS) and only when SIGNALED call getBufferSubData. Never readPixels to client memory directly (that stalls). At most 2 Hz. Compute the token values as the map states (row means for the stops; light colour and excess at the seed light's centre texel; the mean for --gamecult-ground-mean) and write them with setProperty on :root only when a value moved by more than 1/255. Q5 (a): keep the last written set in sessionStorage under one key and apply it on load before the first frame; it is a cache, and a missing or malformed entry means the seeds.", + "Budget controller, one function, one state machine: GPU time per frame by EXT_disjoint_timer_query_webgl2 when present, else a fenceSync after the resolve polled to completion, else rAF cadence. Over a 60-frame window: if the median exceeds the budget (4.0 ms), step down: S 16 -> 8 -> 4, then dpr -> 1 (Q2), then remove the canvas (the seeds paint). Never step up within a session. A median rising 50% over 5 minutes also steps down. No storage of the verdict, no userAgent, no maxTouchPoints.", + "cloud.frag.glsl: #version 300 es; precision highp float; precision highp int; the vendored CultMath.glsl is concatenated by ground.js before this file's body. The field, warp, interval march (ball radius F0 * (Δ/2 + D) with D = FLOW_MAX * PERIOD / 2) and integration exactly as the map's pseudocode; hue from the flow texture's channels mixed over the three nebula inputs; uniforms: resolution, time, dt, frame, jitter, S, intensity, nebula colours, base, Z0/Z1, F0, CUTOFF, K, PERIOD, FLOW_MAX. flow.frag.glsl: the two low-frequency snoise. taa.frag.glsl: motion vector from the flow texture (mv = project(-flow * dt)), history fetched at uv - mv, 3x3 min/max clamp, alpha = max(1/frames, 1/32), out-of-bounds alpha 1; writes new history and the screen (luminance clamp 0.035) via drawBuffers or two draws.", + "Vendoring (D3): site/quartz/static/ground/CultMath.glsl byte-equal to CultLib shaders/CultMath.glsl at the commit named in its first line. scripts/ground/check-cultmath-glsl.ps1 diffs it against git show :packages/cultmath/shaders/CultMath.glsl from a CultLib checkout and exits non-zero on drift.", + "Parity on the device: with ?ground=parity, ground.js evaluates the vendored fixture (CultLib tests/CultMath.Tests/fixtures/glsl-parity.json) one pixel per point, reads back float bit patterns, and reports per function the max ulp distance and the count outside its tolerance class. With ?ground=parity-wash, density and stardust are forced to 0 and the flow frozen; the canvas must equal the CSS seed wash within 2/255 at 16 points on / and on a ritual essay (this pins that the seed values and the shader's base agree at zero density, which is what the fallback promises).", + "Prove in the browser pane: max relative luminance after 32 frames on / at intensity 1 (<= 0.035); the parity-wash probe; the debug readback (mean evals per pixel, unfinished-ray fraction < 1%); the token writer (after 2 s on /, :root's inline style carries all fifteen tokens and --gamecult-ground-mean, each within the expected range, and getComputedStyle(body).backgroundImage resolves to the sampled values); the motion test (with ?ground=debug-mv the resolve writes |mv| into red: non-zero where flow is non-zero, zero under reduced motion); GPU ms per pass with the timer query at the pane's desktop size and at the mobile preset's pixel count. Phone GPU time is operator verification." + ], + "deletes": [ + { + "path": "site/quartz/styles/custom.scss", + "lines": 6, + "note": "ritual body block 119-124: its own background (three radials and the linear gradient) goes; its seeds live under :root:has(body[data-slug]) and it inherits body's ground." + }, + { + "path": "site/quartz/styles/custom.scss", + "lines": 9, + "note": "body 10-27: the six literal colours and three literal stops leave as literals (rewritten as token references in the same lines; counted 9 removed, 9 added)." + } + ], + "keeps_moves": [ + "--gamecult-wash and the index override from wash-home-only: untouched; the shader reads it as intensity and the CSS wash still multiplies by it.", + ".page::before (the grid overlay), the tour/Pitch VN ground, the Thing deck's .hero-bg, the masthead, the engine: untouched.", + "The CSS wash stays the ground when the canvas is absent, not yet drawn, or removed by the controller; it renders the sampled tokens when there are any and the seeds otherwise.", + "docs/brand-design-language.md 'The ground is a wash, not a flat fill' (69-84): rewritten: the ground is the shader; the CSS wash is sampled from it; the seeds are today's literal wash; the four nebula inputs are where the palette is tuned." + ], + "adds": [ + "site/quartz/components/GameCultGround.tsx: renders , mounts /static/ground/ground.js after DOM load; in sharedPageComponents.header after GameCultThemeLock (quartz.layout.ts:19). Its beforeDOMLoaded script applies the sessionStorage token cache to :root if present (Q5 a), so the first paint matches the last sample.", + "site/quartz/static/ground/ground.js (~400 lines, no dependencies, no build step): context, tokens in and out, flow/march/resolve/downsample passes, PBO readback, scheduler, controller, debug and parity modes, a named composite slot for the stardust cut.", + "site/quartz/static/ground/flow.frag.glsl, cloud.frag.glsl, taa.frag.glsl, downsample.frag.glsl; a shared 3-vertex full-screen vertex shader inline in ground.js.", + "site/quartz/static/ground/CultMath.glsl and glsl-parity.json, vendored from CultLib with the pin in the header.", + "scripts/ground/check-cultmath-glsl.ps1: the vendoring drift check.", + "custom.scss: the four nebula input tokens on body; the fifteen ground seeds plus --gamecult-ground-mean on :root with the ritual overrides under :root:has(body[data-slug]); #gamecult-ground { position: fixed; inset: 0; width: 100%; height: 100%; z-index: -1; pointer-events: none; }.", + "docs/brand-design-language.md: the wash section rewritten as above; one paragraph on the ground shader: what it reads (inputs), what it writes (outputs), what it may not hold, and the fallback." + ], + "file_changes": [ + { + "location": { "path": "site/quartz/styles/custom.scss", "line": 4, "end_line": 8 }, + "change": ":root block: the fifteen ground seeds and --gamecult-ground-mean declared beside color-scheme." + }, + { + "location": { "path": "site/quartz/styles/custom.scss", "line": 10, "end_line": 31 }, + "change": "body: four nebula input tokens declared; radials and the linear gradient reference the ground tokens; alphas keep the wash-home-only calc." + }, + { + "location": { "path": "site/quartz/styles/custom.scss", "line": 103, "end_line": 124 }, + "change": "ritual block: background declaration deleted; a :root:has(body[data-slug]) rule carries its seeds and nebula inputs." + }, + { + "location": { "path": "site/quartz.layout.ts", "line": 19 }, + "change": "header: [GameCultThemeLock(), GameCultGround(), GameCultMasthead()]." + }, + { + "location": { "path": "docs/brand-design-language.md", "line": 69, "end_line": 84 }, + "change": "wash section rewritten: shader-owned ground, sampled wash, seeds, nebula inputs." + } + ], + "authority_map": { + "owner": "The shader owns the ground. custom.scss owns the four nebula inputs, --gamecult-wash and the seed values; ground.js owns the flow texture, the march, the TAA, the readback and the sampled ground tokens on :root; CultLib owns every noise and interval function the field calls.", + "inputs": [ + "the four nebula tokens and --gamecult-wash (computed on body)", + "prefers-reduced-motion, visibilityState, canvas size, devicePixelRatio, elapsed time", + "measured GPU frame time (timer query, fence, or rAF cadence)", + "the shader's own 8x8 readback", + "the vendored CultMath.glsl at its pinned CultLib commit" + ], + "outputs": [ + "one opaque moving canvas under the page, luminance <= 0.035", + "the fifteen ground tokens and --gamecult-ground-mean on :root inline, at most 2 Hz", + "debug and parity readbacks (console, flag only)" + ], + "derived_state": [ + "the ground tokens are derived from the shader's result while it runs; the seeds are the fallback; the CSS wash renders whichever is in force; the shader never reads them", + "the flow texture is the one owner of motion: warp, hue, motion vectors (and the stardust, next cut) read it", + "the TAA history is a cache, reprojected by the flow; reset on resize, first frame and budget step", + "S and dpr are derived from measurement within the session; never stored", + "the sessionStorage token set is a cache of the last sample; absent or malformed means seeds", + "CultMath.glsl in the site is derived from CultLib at the pinned commit" + ], + "forbidden_writers": [ + "no colour, alpha, position or radius literal in ground.js or any GLSL file", + "no read of --gamecult-ground-* or --gamecult-light-* by the shader or by ground.js, except the seed read before the first readback", + "no navigator.userAgent, platform, maxTouchPoints, or any device-name branch", + "no class or attribute set on body or html by ground.js; token writes are setProperty on :root only", + "no second wash token; no page rule setting a radial alpha; no second flow evaluation outside flow.frag.glsl", + "no noise or interval function defined in the site's GLSL; only cultmath_* calls", + "no synchronous readPixels to client memory; no setInterval; one requestAnimationFrame scheduler; localStorage never" + ], + "shared_paths": [ + "home, every content page and the ritual essays paint one canvas and one token set, in CSS and in the shader", + "slow device, hidden tab, reduced motion, missing WebGL2 and missing half-float all pass through the one controller", + "the 8x8 readback is the only path from the shader to CSS; the beforeDOMLoaded cache apply and the live writer set the same tokens the same way", + "the same Deploy Quartz workflow; static files ship with the overlay" + ], + "deletion_line": "The ritual block's own background and the nine body literals go in the same commit the tokens are declared. The canvas, four shaders, ground.js and the vendored library are the whole addition; nothing else in the engine or the content changes." + }, + "verification": { + "builds": [ + "Deploy Quartz green on the landing commit: gh run list -R GameCult/gamecult-site -w \"Deploy Quartz\" -L 1", + "scripts/ground/check-cultmath-glsl.ps1 exits 0 against a CultLib checkout at the pinned commit", + "the built stylesheet contains rgb(var(--gamecult-light-0) / calc(var(--gamecult-light-0-a) * var(--gamecult-wash))) verbatim and a :root:has(body[data-slug=\"Blog/small-ritual-of-reach\"]) rule" + ], + "tests": [ + { + "name": "browser pane, /?ground=debug: max relative luminance over the canvas after 32 frames <= 0.035", + "pins": "text contrast: body text keeps >= 7:1 on every ground pixel." + }, + { + "name": "browser pane, /?ground=parity-wash and a ritual essay: canvas vs CSS seed wash within 2/255 at 16 points with density 0 and flow frozen", + "pins": "the seeds and the shader's base agree; the fallback promise holds." + }, + { + "name": "browser pane, / after 2 s: :root inline style carries the sixteen tokens; body's computed backgroundImage resolves to the sampled values; a read 1 s later differs only where the frame changed", + "pins": "the CSS wash is sampled from the shader, at most 2 Hz, without a stall (no readPixels-to-client in the profiler)." + }, + { + "name": "browser pane, /?ground=parity: every fixture function within its tolerance class on WebGL2; numbers and GPU string in the report", + "pins": "GLSL = C# on a device; the proving ground's third runtime." + }, + { + "name": "browser pane, /?ground=debug at desktop and the mobile preset: mean evals per pixel, unfinished rays < 1%, GPU ms per pass; ?ground=debug-mv shows motion where flow is non-zero", + "pins": "the step budget, the interval saving with the warp, and the reprojection on the shipped field." + }, + { + "name": "reduced motion emulated: frames stop at 32, mv is 0, time frozen; hidden tab: no frames; WebGL2 disabled: no canvas in the DOM and the seed wash paints; sessionStorage cleared: seeds paint first", + "pins": "every fallback goes through the controller and lands on the same CSS ground." + }, + { + "name": "git diff base..head --stat: custom.scss, quartz.layout.ts, docs/brand-design-language.md, the new component, static/ground/*, scripts/ground/* only", + "pins": "no engine, content or masthead change." + } + ], + "negative": [ + { + "pattern": "#[0-9a-fA-F]{6}\\b|rgba?\\(|\\b(255|138|109|183)\\b", + "scope": "site/quartz/static/ground/*.js and *.glsl: 0 matches." + }, + { + "pattern": "gamecult-ground-|gamecult-light-", + "scope": "site/quartz/static/ground/*.glsl: 0 matches; in ground.js only inside the token writer and the seed read, never in a uniform upload." + }, + { + "pattern": "userAgent|navigator\\.platform|maxTouchPoints|localStorage|setInterval|classList|setAttribute\\(", + "scope": "site/quartz/static/ground/ground.js: 0 matches." + }, + { + "pattern": "readPixels\\([^)]*(Uint8Array|Float32Array|Uint16Array)", + "scope": "ground.js: 0 matches outside the parity and debug readbacks, which are flag-gated and named." + }, + { + "pattern": "float cultmath_|vec4 cultmath_|float snoise|hash\\(", + "scope": "flow/cloud/taa/downsample.frag.glsl: 0 matches; cultmath_* is defined only in the vendored CultMath.glsl." + }, + { + "pattern": "radial-gradient\\([^)]*rgba?\\([0-9]", + "scope": "site/quartz/styles/custom.scss, body rule and ritual block: 0 matches." + }, + { + "pattern": "gamecult-titlebar|gamecult-nav-link|sidebar|composite|GameCult-Quartz", + "scope": "git diff base..head changed lines: 0 matches." + } + ], + "operator": [ + "open / on the desktop and on the phone; say whether the nebula's motion and intensity are right (uniforms: PERIOD, FLOW_MAX, intensity)", + "on the phone with ?ground=debug, read the logged GPU ms and the controller's final S/dpr; say whether it got warm after five minutes", + "navigate / -> /Blog -> back; say whether the ground is continuous or shows a seed flash (Q5)", + "open a ritual essay and confirm its ground still reads as its own paper" + ] + }, + "estimate": { + "lines_added": 980, + "lines_removed": 15, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": ["GLSL ES 3.00 shader files in static/ground", "vendored glsl-parity.json", "one sessionStorage key holding the last sampled token set"], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [ + "site-masthead:ruling:operator-chromeless-column" + ], + "questions": [ + "Q4 in the map: palette input tokens (a, recommended)", + "Q5 in the map: carry the last sampled wash across page loads (a, recommended)" + ] +} diff --git a/docs/cultmath-interval-ground-cut-site-stardust.spec.json b/docs/cultmath-interval-ground-cut-site-stardust.spec.json new file mode 100644 index 00000000..cc8dc5ff --- /dev/null +++ b/docs/cultmath-interval-ground-cut-site-stardust.spec.json @@ -0,0 +1,141 @@ +{ + "campaign": "cultmath-tapes", + "cut": "site-stardust", + "revision": 1, + "title": "Site stardust: stateless particles advected by the ground's flow texture, rendered to a half-res layer, blurred by the clouds' accumulated opacity (raymarch-driven DoF), composited behind the nebula", + "repo": "GameCult/gamecult-site", + "branch": "main", + "base": "535d170", + "depends_on": [ + "cultmath-tapes:cut_spec:site-ground.r2" + ], + "first": [ + "Map: F:/Projects/CultLib/docs/cultmath-interval-ground-cut.md, 'Stardust', 'Depth of field driven by the raymarch', 'Budget', D4, D9, D10. Re-pin base to main after site-ground lands. The composite slot site-ground left in the resolve is where this cut plugs in; do not restructure the resolve.", + "Aetheria reference, read once, copy nothing: Compute/Stardust/Stardust.compute:118-147 (grid cell -> hashed spawn, lifetime = frac(time/period + hash), position -= flow * lifetime * period, size = parabola(lifetime, 2), colour from a hue ramp x nebula tint); Stardust.shader:49-86 (billboard from quadPoints by SV_VertexID/SV_InstanceID, powerPulse falloff, distance exponents); CustomDoF/DepthOfField.hlsl:29-32 (CoC read from a raymarch output), :150-201 (disk gather weighted by CoC), :217-242 (combine). The web version is far smaller: no distance exponents (the slab is thin), no shadow pass, no near/far split.", + "Particles are stateless: no buffers are updated. One static 6-vertex quad VBO; drawArraysInstanced with count N; the vertex shader derives everything from gl_InstanceID, time and the flow texture (vertex texture fetch is standard in WebGL2): cell = (id mod G, id / G) over the slab mid-plane; hashes via cultmath_pcg3d (the vendored CultMath.glsl is concatenated before the vertex source too) for spawn jitter, lifetime offset, size and brightness; lifetime = fract(t / PERIOD_P + offset); position = spawn - flow(spawn uv) * lifetime * PERIOD_P; size = base * parabola(lifetime, 2); colour = hue at the screen position (from the flow texture's channels, the same mix as the clouds) * brightness. Reduced motion freezes t as site-ground does.", + "Stardust layer: half-resolution RGBA16F target, cleared each frame, additive blend, powerPulse falloff in the fragment shader; N = 16384 desktop, 4096 phone; the controller scales N with S (N halves when S halves) and the layer follows dpr.", + "DoF: in the resolve's composite slot, read opacity = 1 - T from the reprojected, clamped history (not the current frame) and gather the stardust layer with an 8-tap Poisson disk of radius RMAX * opacity in layer texels (RMAX ~ 12 px at dpr 1, scaled by dpr); weight taps by a soft disk; composite out = ground + clouds + stardust_blurred * T, then the luminance clamp. All stardust is behind the whole cloud layer (D9).", + "Debug flags: ?ground=debug-stardust writes the stardust layer alone; ?ground=debug-coc writes opacity into red. Prove in the browser pane: the stardust and the clouds move together (with ?ground=debug-mv from site-ground and the particle velocity written in green under ?ground=debug-stardust-v, the two directions agree within 5 degrees at 64 sampled pixels where |flow| is above a threshold); luminance clamp still holds after the composite; GPU ms per pass (stardust layer, gather) with the timer query at desktop and at the mobile preset's pixel count; the full-stack total against the budget table; the unfinished-ray fraction unchanged by this cut.", + "Budget contract (map, 'Budget'): the stardust layer plus the gather cost no more than a quarter of the march at the same S; if the measurement says otherwise, the gather drops to 4 taps before N drops, and the report says which. Stardust is never cut before the clouds' S on the ladder." + ], + "deletes": [], + "keeps_moves": [ + "site-ground's flow texture, march, TAA, readback and token writer: untouched; the stardust reads the flow texture and the hue mix the same way the clouds do.", + "The sampled wash now includes the stardust in its 8x8 readback by construction (it samples the final frame); nothing changes in the writer.", + "The budget controller gains one scaled quantity (N) and no new state; the ladder order is unchanged." + ], + "adds": [ + "site/quartz/static/ground/stardust.vert.glsl and stardust.frag.glsl: the instanced billboard and the powerPulse sprite.", + "ground.js: the stardust pass (one VBO, one program, drawArraysInstanced), the half-res layer, N in the controller, the gather in the resolve's composite slot, the two debug flags.", + "taa.frag.glsl: the composite slot filled: opacity from history, the 8-tap gather, out = ground + clouds + stardust_blurred * T.", + "docs/brand-design-language.md: two sentences under the ground shader paragraph: the stardust and the DoF, and that they read the same flow and hue as the nebula." + ], + "file_changes": [ + { + "location": { "path": "site/quartz/static/ground/ground.js", "line": 1 }, + "change": "stardust pass, layer, N scaling, gather hookup, debug flags; line numbers are site-ground's and are re-read by function name." + }, + { + "location": { "path": "site/quartz/static/ground/taa.frag.glsl", "line": 1 }, + "change": "the named composite slot becomes the opacity-weighted gather and the final composite." + }, + { + "location": { "path": "docs/brand-design-language.md", "line": 69 }, + "change": "two sentences on stardust and DoF under the ground shader paragraph (post site-ground numbering)." + } + ], + "authority_map": { + "owner": "ground.js owns the stardust pass and the DoF gather; the flow texture (site-ground) owns the particles' motion; the TAA history owns the opacity the DoF reads; the nebula input tokens own the particles' hue through the same mix as the clouds.", + "inputs": [ + "the flow texture and the hue mix (site-ground)", + "the reprojected, clamped history's transmittance", + "time, N and dpr from the controller; gl_InstanceID" + ], + "outputs": [ + "a half-res stardust layer per frame", + "the composite with stardust blurred by cloud opacity behind the nebula, still under the luminance clamp" + ], + "derived_state": [ + "every particle's position, lifetime, size and colour are derived from gl_InstanceID, time and the flow texture each frame; nothing is stored or updated", + "N is derived from S by the controller; the layer size from dpr", + "the blur radius is derived from the accumulated opacity; there is no second CoC source" + ], + "forbidden_writers": [ + "no particle buffer update, transform feedback or CPU-side particle state", + "no second flow function or hue mix; the vertex shader samples the flow texture", + "no colour literal; no per-depth transmittance; no second march", + "no new controller state beyond N; the ladder order is not changed", + "no change to the readback or the token writer" + ], + "shared_paths": [ + "clouds and stardust read one flow texture and one hue mix, so they move and colour as one", + "the one resolve pass composites ground, clouds and stardust and applies the one luminance clamp", + "the one controller scales S, N and dpr together" + ], + "deletion_line": "Nothing is deleted. The addition is two small shaders, one pass and one gather; it buys the stardust and the DoF the operator named, and it must prove it fits the same budget." + }, + "verification": { + "builds": [ + "Deploy Quartz green on the landing commit", + "scripts/ground/check-cultmath-glsl.ps1 still exits 0" + ], + "tests": [ + { + "name": "browser pane, /?ground=debug-stardust-v with ?ground=debug-mv: particle velocity and cloud motion vectors agree within 5 degrees at 64 sampled pixels where |flow| exceeds the threshold", + "pins": "one flow: the stardust and the nebula move as one." + }, + { + "name": "browser pane, /?ground=debug-coc: opacity is 0 where the clouds are empty and rises inside them; the stardust gather radius follows it (a visible blur under a dense cloud, sharp in a gap)", + "pins": "the raymarch drives the DoF, as in Aetheria's hack." + }, + { + "name": "browser pane, /?ground=debug: max relative luminance after 32 frames <= 0.035 with stardust on", + "pins": "the clamp holds after the composite." + }, + { + "name": "browser pane, timer query at desktop and at the mobile preset: stardust layer + gather <= 25% of the march at the same S; full-stack totals quoted against the budget table", + "pins": "the stardust fits the same budget or the report says what gave." + }, + { + "name": "reduced motion: particles frozen, frames stop at 32; hidden tab: no frames", + "pins": "the stardust obeys the one controller." + } + ], + "negative": [ + { + "pattern": "bufferSubData|transformFeedback|TRANSFORM_FEEDBACK|new Float32Array\\((N|count|particles)", + "scope": "ground.js stardust section: 0 matches; particles are stateless." + }, + { + "pattern": "#[0-9a-fA-F]{6}\\b|rgba?\\(", + "scope": "stardust.vert.glsl, stardust.frag.glsl, ground.js: 0 matches." + }, + { + "pattern": "snoise\\(|float cultmath_", + "scope": "stardust.vert.glsl and stardust.frag.glsl: 0 matches; the flow and hue come from the texture, not from a second evaluation." + }, + { + "pattern": "readPixels|setProperty", + "scope": "git diff base..head changed lines in ground.js: 0 matches; the readback and the token writer are not touched." + } + ], + "operator": [ + "open / on the desktop and on the phone; say whether the stardust sells the motion and whether the blur under the clouds reads like the video (RMAX, N, PERIOD_P are the dials)", + "on the phone with ?ground=debug, read the full-stack GPU ms and the final S/N/dpr; say whether it got warm" + ] + }, + "estimate": { + "lines_added": 320, + "lines_removed": 4, + "dependencies_added": [], + "dependencies_removed": [], + "formats_added": [], + "formats_removed": [], + "targets_added": [], + "targets_removed": [] + }, + "rulings": [ + "site-masthead:ruling:operator-chromeless-column" + ], + "questions": [] +} diff --git a/docs/cultmath-interval-ground-cut.md b/docs/cultmath-interval-ground-cut.md new file mode 100644 index 00000000..0eb8a5d2 --- /dev/null +++ b/docs/cultmath-interval-ground-cut.md @@ -0,0 +1,2525 @@ +# CultMath intervals and the gamecult.org ground: cut map + +Status, 2026-10-14: the target is r2 (section "Target r2"); snoise-hessian, expr-ir and +cycles-converters are on main. Earlier status, 2026-10-04: interval-ops, glsl-lowering, snoise-tie (48aadda0) and affine-forms with +affine-shaders (156782da) are on main; the as-built record is the last section. Figures quoted in +Passes 1-5 at SNOISE_LIPSCHITZ 10.099261 predate the tie fix (now 7.9640074) and are conservative; +design.md carries the current measurements. Map history: Imagination pass 4, 2026-10-03. Pass 1's Q1–Q3 are answered (below); +the Self opened the `cultmath-tapes` campaign from pass 2; pass 3 revises the +two CultLib cuts after their first Hands reports and the operator's challenge +to the march, and changes the site field to envelope-then-noise; pass 4 +(section "Pass 4") revises `interval-ops` to r3 after its second Hands report +and Soul's verdict, and names the one shipped void (Q9, ruled `operator-shipped-void`). Pass 5 (section "Pass 5") maps +affine forms against CultLib `main` at `a7966142`. Where a later pass and +an earlier section disagree, the later pass wins. Where this map and the Body +disagree, the Body wins and this map is stale. + +Pinned HEADs (every `file:line` below is against these): + +| Repo | Ref | SHA | +| --- | --- | --- | +| CultLib | `main` | `c49c76ee` (CultMath 0.3.0 merged at `614fd445`) | +| gamecult-site | `main` | `535d170` (before `wash-home-only` lands) | +| Aetheria | local checkout | read only; `Volumetric.cginc`, `Raymarching/CloudShader.shader`, `Compute/Stardust/Stardust.{compute,shader,cs}`, `CustomDoF/DepthOfField.hlsl`, `Zone Display/VolumeCloudRenderer.cs` | + +## The operator's words + +1. "Can we replace the site's background with a fancy yet unobtrusive and + inexpensive shader thing? It's odd that my main site wouldn't have that, + considering my specialization. Would it be too much to have some optimized + subset of Aetheria's volumetric clouds shader in there?" +2. After the Self proposed a quarter-resolution, 8–16 step, static-on-phones + design: "map it as a cut that includes the GPU interval arithmetic we're + borrowing from Fidget for a planned Asura campaign. I'd like this shader to + be the proving ground for that - with the right math we can absolutely run + this fullscreen on mobile, per pixel as long as the sample count is low and + we're accumulating samples with TAA (Aetheria's TAA is honestly + embarrassing and it still handles smooth 1080p clouds on my tired old + 1070)" +3. On pass 1's Q3 (ground tokens as the shader's input): "I like that, but the + background should be nice and dynamic and we should sample the wash from + the result instead. Is there any point sending you video? I don't think + your vision model has anything in it to encode motion. Anyway, this video + really blew people away, with its combination of the clouds, the flowing + stardust and my hacked DoF shader where I replaced the circle of confusion + calculation with an output from the raymarching shader, I think it was + final transmittance? Doesn't matter, looks great to have the clouds blur + what's behind them. This does remind me we're totally gonna need that + stardust too, it really sells the motion of the nebulae" + +Rulings from pass 1: **Q1** new campaign `cultmath-tapes`. **Q2** the slow +ladder is samples, then resolution, then the CSS wash. **Q3** answered outside +the options: the shader owns the ground and it moves; the CSS wash is sampled +from the shader's result; the ground tokens are seed and fallback only, never +the shader's input; stardust and the raymarch-driven DoF are in scope. + +## Ownership + +### Where the interval math lives + +**CultLib, `packages/cultmath`.** This is the parked campaign's own first step +(`docs/cultmath-tape-target.md`, sketch step 1: "CultMath `interval` in C# and +HLSL with parity tests ... It stands alone, and is the first cut to take even +if the rest stays parked"). The "planned Asura campaign" in the operator's +words is that document; its first named consumer is Aetheria's volumetric +raymarching, and Asura itself does not need intervals +(`cultmath-tape-target.md:103`). + +The site speaks WebGL2 GLSL ES 3.00. Three routes were weighed: + +| Route | What | Why not | +| --- | --- | --- | +| A | Hand-port the needed functions to GLSL inside gamecult-site | A second noise authority with no parity test; the exact thing Aetheria's `GPU Noise` copies are (follow-up `aetheria-snoise-pin-bump`). | +| B | `dxc -spirv` then SPIRV-Cross to GLSL ES, using the existing `tools/compile-hlsl-spirv.ps1` chain | SPIRV-Cross emits one whole shader with mangled names; there is no library a site shader can call `cultmath_snoise` from. | +| C | **A textual lowering HLSL → GLSL in CultLib with a complete, enumerated transformation list, the discipline of the HLSL → C# mirror (`packages/cultmath/docs/design.md:92-134`)** | Chosen. | + +Under C, `shaders/CultMath.glsl` is a committed generated artifact, like +`Swizzles.g.cs`. One implementation of the lowering lives in the test project; +a test pins the committed file equal to the lowering of `CultMath.hlsl` and +regenerates it when asked. GLSL's stricter typing is not patched in the +lowering: the HLSL is written in the common subset (legal, bit-identical) and +glslang compiles the lowered text in CultLib's tooling. Parity runs in two +legs, each with one owner: HLSL ⇔ C# by the existing bit-for-bit mirror; +GLSL ⇔ C# by a committed golden fixture evaluated on WebGL2 in the browser +pane and read back. CultLib has no GPU harness (follow-up +`gpu-snoise-parity`); the browser pane is one. The site vendors +`CultMath.glsl` with the CultLib commit in its header. + +### Campaign + +`cultmath-tapes`, repos `GameCult/CultLib` and `GameCult/gamecult-site`, in the +Eureka Self area (ruling `adopted-by-eureka-self-area`). The tape target doc +`docs/cultmath-tape-target.md` has steps 1 (intervals), 2 (graph and C# +evaluator) and 4 (HLSL interpreter) unparked, with affine forms beside step 1 +(rulings `affine-forms-unparked`, `material-ir-cultmath-now`, +`tape-unparked-for-trophic-graphs`). Steps 3 (pruning) and 5 (meshing) stay +parked. The volumetric line (the culled march's proofs, the integration-native +noise domain, the site ground) leads the campaign (ruling +`volumetric-work-prioritized`). Site cuts cite +`site-masthead:ruling:operator-chromeless-column`. + +### Target r2: owners, consumers, invariants + +**Owners.** CultMath owns every function a consumer evaluates and every bound on +it: the snoise kernel and its derivatives, the noise pins, intervals, affine +forms, the warp-chain stage functions and their span bounds, the closed-form span +integral, the Cycles converters, the trophic node primitives, and the expression +graph with its evaluator and interpreter. C# is the reference; the HLSL mirrors it; +the GLSL is generated. `GameCult.Caching.MessagePack` owns the wire shape of CultMath +values and graphs. A consumer owns its composition and nothing below it: the site +owns its field's brush, ramp, chain order and parameters, its motion, TAA, +stardust, DoF, budget controller and sampled tokens; Aetheria owns its species +graphs, their settings and when they are evaluated. `custom.scss` owns the four +nebula input tokens and the seed values of the ground tokens. + +**Consumers.** + +- The gamecult.org ground: the Span Lab framework with the void as its brush + (ruling `site-ground-field-ruled`), in WebGL2 GLSL, vendoring CultMath's + generated GLSL by CultLib commit. +- Aetheria fauna (`aetheria-fauna:target:r4`): trophic species graphs as + `CultMath.Expr` documents, evaluated by the C# evaluator in ServerShared and by + the HLSL interpreter in its presenters, over CultMath's node primitives. +- Aetheria's Cycles-matched bakes (`aetheria-release`): reference bakes compared + with CultMath's Cycles converters within the measured tolerance class. + +**Not consumers.** Asura (its field is noise-dominated and needs no tape). +AetheriaEve and AetheriaThing (archived). The material graph line until it returns +after the demo (`aetheria-release:ruling:demo-material-scope`). The brush-grammar +station, until pruning and meshing unpark. Aetheria's nebula on the +span framework is an option to try (ruling `aetheria-nebula-spans-as-option`), not +yet a consumer; until a cut makes it one, the nebula consumes CultMath noise at its +pin bump and nothing else from this line. + +**Invariants.** + +- **`intervals-enclose`**: every interval function returns a `[lo, hi]`, and every + affine form's range is an interval, containing `f(x)` for every `x` in its input + region, in C#, HLSL and GLSL alike. A domain warp bounded by `D` is enclosed by + enlarging the ball radius by `D`. A consumer that skips a region because + `hi < cutoff` has skipped nothing that was there. +- **`affine-beats-interval-on-wells`**: on the deep-well scenario (wells about an + order of magnitude larger than the fog gradient), the affine bound's combined cost + ratio exceeds the centred interval bound's at warp 0 and at warp `D`, with the + cull floor at 0.5 (rulings `wells-scale-order-of-magnitude`, + `affine-wells-contract-cheaper-than-interval`). +- **`noise-pins-measured`**: there is one snoise kernel, and its value, gradient + and Hessian come from the same tie order. `SNOISE_LIPSCHITZ`, `SNOISE_HESSIAN` + and `SNOISE_THIRD` are each measured on that kernel by a committed test (the + refined maximum times 1.10), and every runtime's copy is pinned equal to the C# + constant by a value test. A kernel change re-measures every pin in the same + merge. Consumers read the pins and the derivative functions from CultMath, + never from page-local copies. +- **`span-bounds-enclose`**: each warp-chain stage (per-component offsets, + anisotropic stretch, plain or ridged `1 − 2|n|`, curl if ruled) is a CultMath + function in C#, HLSL and GLSL returning value, Jacobian and span bounds (speed, + acceleration, curvature, fold deviation) derived only from the noise pins. Each + bound holds at every point of its span. The composition helper composes them by + the chain rule; a consumer writes its chain and never derives a bound (ruling + `span-chain-shape-ruled`). +- **`span-integration-closed-form`**: along a span, optical depth is integrated in + closed form, the clamped linear ramp by `integral_clamp_linear` (split at the + exact clamp crossings, finite for infinite clamp bounds) and a proven + constant-density body by Beer–Lambert in one step (ruling + `operator-analytic-wall-body`). The linearisation error is bounded by the + composed stage bounds, and a span proved empty or saturated by them is so at + every point. +- **`glsl-derived`**: `CultMath.glsl`, `CultMath.Phacelle.glsl`, + `CultMath.Cycles.glsl` and the golden fixture are generated by one enumerated + lowering from the HLSL and C# and pinned by tests; the Unity package's shaders + are byte-identical copies. Nobody edits them by hand, and a dialect gap is fixed + in the HLSL common subset. The site vendors the GLSL by CultLib commit, SHA in + the header, with a drift check. +- **`three-runtimes-agree`**: HLSL is a bit-for-bit mirror of C#, and the GLSL + agrees with C# on the golden fixture within each family's stated tolerance, + evaluated on a WebGL2 device. +- **`cycles-exact-to-unfused`**: CultMath's `cycles_*` functions are Cycles' + formulas with one IEEE single rounding per operation, bit-exact to the Blender + 5.2.2 Linux SSE4.2 oracle fixtures. Every other Cycles build and CultMath's own + shader lowerings are held to a per-function tolerance class measured on that + build and recorded in the oracle README; cancellation-prone functions (floored + modulo, wrap) carry an error bound relative to the operand scale and a divergence + note (ruling `cycles-kernel-reference-ruled`). +- **`one-expression-graph`**: `CultMath.Expr`'s `ExprGraph` is the one IR. One + validator admits a graph whole at build and at decode; one op table, append-only, + names every op; the graph has no loop construct, and stencils are build-time + substitution. Bytecode is derived from the graph, cache-only, and is never stored + as truth. The MessagePack resolver is the wire shape; JSON is never load-bearing. +- **`evaluator-composes-cultmath`**: the C# evaluator's result equals the direct + composition of the same CultMath calls bit for bit, one IEEE single per op; an + op's meaning is its CultMath function's, and a function's value change is a + Breaking release note. +- **`tape-interpreter-compute`**: the HLSL interpreter is one included source, + `CultMath.Tape.hlsl`, never a per-graph generated kernel. Its registers are + linear-scan allocated at lowering and live in groupshared memory, a slice per + thread, the group size shrinking as the register cap grows (64 registers: 128 + threads; 128: 64; 255: 32). It and every presenter that uses it run as compute + passes writing to a texture (ruling `tape-register-model-ruled`). +- **`interpreter-matches-evaluator`**: the HLSL interpreter agrees with the C# + evaluator on a graph corpus and on each consumer's own graph within tolerances + measured per op, compiled by dxc and run on a device. +- **`lattice-node-reads-bodies`**: the weighted lattice cellular node takes the + zone body span and a falloff and weights each candidate cell at its cell centre + inside the node. It states a supported weight-ratio range, its search window + holds every cell that can win within that range, and graph validation refuses + parameters outside it (ruling `lattice-weight-from-bodies-ruled`). +- **`site-field-span-framework`**: the gamecult.org ground's density is a + site-owned composition over CultMath stage functions, integrated span by span: + a ramp, a warp chain, and one authored brush, the void, a true 3D spherical + cavity of hollow radius 198 and ramp 50 inside a full cloud volume, a sun in its + floor and the camera orbiting low (rulings `operator-ground-void-brush`, + `operator-void-true-cavity`, `operator-shipped-void`). The site defines no noise, + derivative or bound. +- **`one-motion-owner`**: the ground has one motion law, owned by the site's field. + What moves the density is what TAA reprojection and the stardust read; nothing + evaluates motion a second way. +- **`shader-owns-ground`**: the ground is the shader's moving render. The CSS wash + tokens are sampled from its output by a non-stalling readback, carried across + page loads in `sessionStorage`, and are seed or fallback only. The shader reads + the four nebula input tokens, never an output token. +- **`dof-from-transmittance`**: the stardust's blur is driven by the cloud layer's + accumulated opacity at that pixel, so the clouds blur what lies behind them. +- **`budget-measured`**: quality steps down by measured GPU or frame time only + (samples, then resolution, then the CSS wash), never by user agent. + +**Not in scope.** + +- Pruning (tape step 3) and meshing (step 5). Interval, affine and gradient + evaluation over `ExprGraph` belong to pruning and stay parked. +- Span evaluation over the graph (`tape-span-eval`): the later generalisation of + the stage functions once the interpreter exists. +- A GLSL or WebGL2 tape interpreter: groupshared memory exists only in compute + shaders, and WebGL2 has none. The site's field is written in GLSL against the + stage functions. +- The material line (cones, frontiers, a per-graph HLSL emitter), until the + material graph returns after the demo. +- Flow laws, envelopes, brushes and chain order in CultMath: the consumer's. A + curl noise primitive waits on the operator's answer to follow-up + `curl-warp-primitives`. +- The kernel cascade, unless the operator's nebula work picks it. +- Per-depth transmittance for the stardust DoF. +- A CultMath release for the site; the site consumes a CultLib commit. + +**Canonical implementations.** Paths are under `packages/cultmath/` unless named. + +- Kernel, pins and span primitives: `src/CultMath/math.cs`, `math.Interval.cs`, + `math.Affine.cs`, `math.Span.cs`; `shaders/CultMath.hlsl`, + `CultMath.Interval.hlsl`, `CultMath.Affine.hlsl`. The stage functions land + beside them. +- Lowering and parity: `tests/CultMath.Tests/GlslLowering.cs`, + `GlslMirrorTests.cs`, `HlslMirrorTests.cs`, `fixtures/glsl-parity.json`; + generated `shaders/*.glsl`; Unity copies under + `unity/org.gamecult.cultmath/Shaders/`. +- Cycles: `src/CultMath/math.Cycles.cs`, `shaders/CultMath.Cycles.hlsl`, + `tools/cycles-oracle/` (oracle and the tolerance-class table), + `tests/CultMath.Tests/fixtures/cycles-oracle/`. +- Graph: `src/CultMath/Expr/`; wire shape + `src/GameCult.Caching.MessagePack/CultMathExprResolver.cs`; interpreter + `shaders/CultMath.Tape.hlsl` (cut `tape-interpreter`). +- Ground: gamecult-site, created by `cut-site-ground.r1` (no ground code on + `origin/main` `af6e206`); palette input the four `--gamecult-nebula-*` tokens in + `custom.scss`. +- Research behind the rulings: `docs/research/integration-native-noise-domain.md`, + `span-chain-and-site-field.md`, `tape-register-model.md`, + `lattice-site-weight.md`. + +## The authority map (all four cuts) + +- Owner: `packages/cultmath` for `iv_*` and the ball bounds; `GlslLowering` + (test project) for `shaders/CultMath.glsl`; `custom.scss` for the four + nebula input tokens, `--gamecult-wash`, and the seed values of the fifteen + ground tokens; `ground.js` for the flow texture, scheduling, budget, TAA, + the stardust and DoF passes, and the sampled ground tokens; the site GLSL + files for the field, the particles and the resolve. +- Inputs: CultMath reads nothing new. The lowering reads the two HLSL files. + `ground.js` reads the nebula tokens, `--gamecult-wash`, + `prefers-reduced-motion`, `visibilityState`, canvas size, device pixel + ratio, the measured GPU frame time and its own 8×8 readback. The field + reads uniforms and the flow texture only. +- Outputs: `CultMath.glsl`; the interval functions; one canvas under the + page; the fifteen ground tokens written on `:root` from the readback; a + debug log behind a flag. +- Derived state: the ground tokens are derived from the shader's result while + it runs and are seed values otherwise; the CSS wash renders them; nothing + reads them back into the shader. The flow texture is the one owner of + motion: the warp, the TAA motion vectors and the stardust all read it. + `CultMath.glsl` is derived from `CultMath.hlsl`. The TAA history is a cache. + `S`, `dpr` and the particle count are derived from measurement within the + session. +- Forbidden writers: no colour literal in `ground.js` or any GLSL; the shader + never reads a ground token; `ground.js` never reads the ground tokens except + to seed before its first readback; no user-agent, platform or touch-point + sniffing; no class on `body` or `html` by script; no second wash token; no + second flow function (particles and clouds read one texture); no GLSL edited + by hand; no `iv_*` without a C# twin; no noise defined in the site. +- Shared paths: every page's ground, the ritual essays included, is one + canvas and one token set, in CSS and in the shader. Every reduced budget + (slow device, hidden tab, reduced motion, missing WebGL2 or half-float) goes + through the one controller. The 8×8 readback is the one path from the + shader to CSS. +- Deletion line: in the site, the six literal radial colours and three + literal stops become token references and the ritual block's own ground + goes, in the same commit the tokens are declared. In CultLib nothing is + deleted. The subtraction this buys is upstream: Aetheria's + `Assets/Plugins/GPU Noise/*.cginc` at its pin bump, and the tapes campaign's + step 1 already landed. + +## The shader design + +### What Aetheria contributes, and what the web version keeps + +| Aetheria | Mechanism | Web subset | +| --- | --- | --- | +| `Volumetric.cginc:165-221` density | fill + coverage, domain-warped by `flow()` in two half-period phases cross-faded with `tri2` (a flow map; the advection never accumulates) | kept, one coverage octave and one detail octave, CultMath noise | +| `Volumetric.cginc:130-135` `globalFlow` | `Tri3D(p/scale − scroll) · amplitude` | replaced by two `snoise` at low frequency, rendered once per frame into a quarter-res flow texture | +| `CloudShader.shader:83-104` | transmittance integration | kept | +| `CloudShader.shader:261-314` TAA | reprojection by `_PrevVP`, γ=0.5 variance clip, fixed 5% blend, packed depth, the `density2` bug at `:311` | not kept; see TAA | +| `Stardust.compute:118-147` | stateless particles: grid cell hashed to a spawn point, `position −= flow · lifetime · period`, size `parabola(lifetime, 2)`, colour from a hue ramp × nebula tint | kept as an instanced vertex shader reading the flow texture; `gl_InstanceID` is the cell | +| `DepthOfField.hlsl:29-32` `FragCoC` | the CoC is read straight from a global `_DoFBlurTex` (its writer is not in this checkout; the operator recalls final transmittance), then the bokeh gather `FragBlur` `:150-201` | a gather on the stardust layer with radius ∝ cloud opacity at that pixel | + +### Density field (site-owned, `cloud.frag.glsl`) + +Pass 3 wraps this field in an envelope (a nebula floor with authored wells and +clear sky above it); `coverage` below becomes the noise that displaces the +floor, as in Aetheria. The flow, the phases and the hue stand. + +```text +camera at the origin, looking +z, static; the slab z in [Z0, Z1] fills the view +flow(uv) = A · (snoise(q·Ff + o1), snoise(q·Ff + o2), 0) q = slab mid-plane point; quarter-res texture, once per frame +phase_k(t) = fract(t / PERIOD + k/2), w_k = tri2(phase_k) k = 0,1 +warp_k(p) = p + flow · (phase_k − 0.5) · PERIOD +coverage(p) = Σ_k w_k · snoise(warp_k(p) · F0) two snoise +occupancy = max(0, coverage − CUTOFF) · K +detail(p) = 1 − |snoise(p · 4F0 + 17)| one snoise; the dune envelope +density = occupancy · mix(0.6, 1.0, detail) +hue(uv) = mix of the three nebula colours by flow.xy / A free: the flow texture's own channels +colour = hue · intensity +``` + +Three `snoise` per dense sample, one per empty probe. The pattern moves at +velocity `−flow` everywhere, because both phases advance at the same rate; +the cross-fade only changes content. That is what makes the motion vectors +below exact. + +### Interval culling along the ray, with the warp + +Pass 3 supersedes this section's march: the probe is per screen tile in a +pre-pass, the field has an analytic envelope the probe tests first, and the +loop below becomes the pre-pass's loop over cell ranges. The ball and the warp +enlargement stand. + +`cultmath_iv_snoise_ball(c, r)` returns `[n(c) − L r, n(c) + L r] ∩ [−1, 1]` +with `L` the committed Lipschitz constant. Over a segment `[t, t+Δ]` the +unwarped ball is centred at `t + Δ/2` with radius `Δ/2`; the warp displaces +any point by at most `D = |flow|max · PERIOD / 2`, so the ball `(c, Δ/2 + D)` +contains both phases' warped points, and one evaluation bounds the whole +coverage term. The march is adaptive subdivision, Fidget's region test on a +1-D region: + +```text +Δ = Δ0; t = Z0/dir.z + jitter · Δ0 +while t < t_exit and evals < S: + iv = iv_snoise_ball(p(t + Δ/2) · F0, F0 · (Δ/2 + D)) 1 eval + if iv.hi < CUTOFF: t += Δ; Δ = min(2Δ, ΔMAX) provably empty: skip, grow + elif Δ > ΔDENSE: Δ = Δ / 2 maybe dense: refine + else: integrate density(p(t + Δ/2)) over Δ; t += Δ 3 evals + if transmittance < 0.02: break +if t < t_exit: integrate one coarse sample over the rest the budget ran out; measured, must be rare +``` + +`iv.hi < CUTOFF` is the interval proof that the `0` branch of +`max(0, coverage − CUTOFF)` wins on the whole segment: Fidget's `min`/`max` +pruning at its smallest, applied by hand to a two-clause expression. Tape and +automatic pruning stay parked; this proves the arithmetic they rest on. + +### Step budget + +`S` counts `snoise` evaluations per pixel per frame. `S = 16` desktop, `8` +phone, `4` floor; the controller sets it from measurement. A debug mode writes +`evals / S` and an unfinished flag into the colour. Contract: under 1% of rays +unfinished at the chosen `S` on the shipped field. + +### TAA, motion-aware + +The camera is static but the field moves, so history is reprojected by the +known motion, which the flow texture owns: + +- Motion vector: `mv = project(−flow(uv) · dt)` in pixels; history is fetched + at `uv − mv`. Exact for the pattern between cross-fades (see above); the + cross-fade and the detail term are handled by rejection. +- Jitter: Halton(2,3) frame offset on the ray start plus interleaved gradient + noise per pixel, rotated per frame. +- Accumulation: `α = max(1/frames, 1/32)` on colour and transmittance. +- Rejection: a 3×3 min/max box of the current frame clamps the reprojected + history (AABB clamp, not variance clipping); out-of-bounds fetches take + `α = 1`. +- Reset on resize, on the first frame and on a budget step. +- Buffers: two RGBA16F history targets at canvas size (8-bit stalls + convergence at `α = 1/32` on a ground this dark); missing half-float falls + back to the CSS wash through the controller. + +### Stardust (cut `site-stardust`) + +Stateless, as Aetheria's: instance `i` is a cell of an `N×N` grid over the +slab's mid-plane, hashed by `cultmath_pcg3d` to a spawn point and a lifetime +offset; `lifetime = fract(t/PERIOD_P + offset)`; position = spawn − flow(uv +of spawn) · lifetime · PERIOD_P, read from the flow texture in the vertex +shader; size = `parabola(lifetime, 2)` × a hashed size; colour = the nebula +hue at its screen position × a hashed brightness. Rendered as instanced +billboards (one 6-vertex quad, `gl_InstanceID`) with additive blending into a +half-resolution RGBA16F stardust layer, with the `powerPulse` falloff of +`Stardust.shader:74-78`. Count: 16,384 desktop, 4,096 phone, controller-scaled +with `S`. The particles and the clouds move as one because they read the same +texture; there is no second flow. + +### Depth of field driven by the raymarch (cut `site-stardust`) + +Aetheria's hack: the CoC is a raymarch output, so clouds blur what is behind +them. Web version: in the resolve pass, the stardust layer is gathered with an +8-tap Poisson disk whose radius is `RMAX · opacity(uv)`, where +`opacity = 1 − T` is the TAA-accumulated cloud transmittance at that pixel +(the stable, converged value, which is why it is read from history and not +from the current frame). Composite: `ground + clouds + stardust_blurred · T`. +All stardust is treated as behind the whole cloud layer; a per-depth +transmittance would cost a second march and is not in scope. + +### Sampled wash: the CSS reads the shader + +After the resolve, a tiny pass downsamples the final frame to 8×8 (RGBA8). +`ground.js` reads it back asynchronously: `readPixels` into a +`PIXEL_PACK_BUFFER`, a `fenceSync`, then `getBufferSubData` on a later frame +once the fence has signalled. Never a synchronous readback. At most twice a +second, and only written when a value moved by more than 1/255: + +- `--gamecult-ground-0/1/2`: the mean of rows 0–1, 3–4 and 6–7. +- `--gamecult-light-N`, `-a`: the colour at the seed light's centre texel, + split into the hue (normalised) and the excess over the ground stop there. +- `--gamecult-light-N-at`, `-r`: the seed values; positions are not fitted. +- `--gamecult-ground-mean`: the 8×8 mean, for any tinted UI. + +These are written to `:root`'s inline style, so they beat the stylesheet's +seed declarations. The seeds live on `:root` in `custom.scss` (today's +literal wash), with the ritual essays' seeds under +`:root:has(body[data-slug="Blog/..."])`. The body background and the ritual +ground read the tokens. When WebGL2 is absent or the controller removes the +canvas, the seeds are what paints. Across page loads the last sample may be +carried as a cache (Q5). + +### Palette input + +The shader reads four input tokens from `custom.scss`, which is where the +brand says colour is defined: `--gamecult-nebula-0/1/2` (today orange +`255 138 42`, violet `109 96 255`, sky `89 183 255`) and +`--gamecult-nebula-base` (`#07111a`), plus `--gamecult-wash` as intensity. +Inputs and outputs are different tokens, so there is no cycle (Q4). + +### Resolution and the slow ladder (Q2) + +Full device pixels. The controller's ladder: `S` 16 → 8 → 4, then `dpr → 1` +(the stardust layer and DoF follow the canvas), then the CSS wash. Never a +step up within a session. + +### Pausing and fallbacks + +- `visibilityState !== "visible"`: no frames; on return, history is kept and + the motion vector uses the real elapsed `dt`, clamped to one frame. +- `prefers-reduced-motion: reduce`: time is frozen (phase, flow and particle + lifetimes fixed), render until 32 accumulated frames, stop; resize + re-renders. The clouds and stardust are there, still. +- No WebGL2, context lost, no half-float: canvas removed; the seeds paint. +- Too slow: measured; see below. +- The canvas is `position: fixed; inset: 0; z-index: -1; pointer-events: + none; aria-hidden`. The root background paints first, so the canvas covers + the CSS wash only once drawn. + +### Text contrast + +The resolve clamps relative luminance at 0.035 (about today's orange hotspot, +`#07111a` + `rgba(255,138,42,.18)` ≈ `(53, 42, 34)`, luminance 0.025), after +stardust and DoF are composited. Body text `#b7c7d9` (0.55) keeps ≥ 7:1 on any +ground pixel. A readback test asserts the max after 32 frames on `/`. + +## Budget and how it is measured + +| Device | Pixels | GPU per frame at 30 fps | Proxy | +| --- | --- | --- | --- | +| Desktop, GTX 1070 class, 2560×1440 | 3.7 M | ≤ 2.0 ms | 6% GPU duty | +| Laptop iGPU, Iris Xe, 1920×1080 at dpr 1.25 | 3.2 M | ≤ 3.5 ms | 10% duty | +| Mid-range phone, Pixel 6a / Galaxy A54 class, 1080×2400 | 2.6 M | ≤ 4.0 ms | ≤ 12% duty; no upward drift of the median over 5 minutes | + +Cost model for the full stack on the phone (one `snoise` ≈ 150 flops, ~1 +TFLOP available; estimates, replaced by measurement): + +| Pass | Work | ms | +| --- | --- | --- | +| Flow texture, quarter res | 160 k texels × 2 snoise | 0.05 | +| Tile pre-pass (pass 3), 1/64 res, `N = 8` | 40 k tiles × ≈ 30 probes in the cavity (interior retired in a few, the wall's ≈ 15 cells at 1.5 probes each), envelope-only because the noise ball cannot prove anything at this scale; ≈ 0.1 snoise-equivalents per pixel; worst case ≤ 192 probes per tile | 0.1 (≤ 0.8) | +| March at `S = 8` | 2.6 M × 8 snoise per frame, every pixel marches a wall; LOD and the mask decide where the frame's samples land, not how many (the controller does) | 3.3 | +| TAA resolve + DoF gather | ~19 texel reads per pixel, plus the depth-history fetch and one matrix multiply for the camera reprojection | 1.1 | +| Sun self-shadowing sample (named, not taken) | one envelope-only transmittance sample per primary sample, ≈ +25% of the march | +0.8, not on the phone | +| Stardust layer, half res, 4,096 particles | fill-bound, small | 0.2 | +| 8×8 downsample + PBO readback at 2 Hz | tiny | 0.05 | +| **Total at `S = 8`, the cavity (pass 3)** | | **≈ 4.8** | +| Total at `S = 6` / `S = 4` | | ≈ 3.9 / 3.1 | + +Said plainly: LOD does not change the per-frame cost, which the controller +fixes by `S`; it changes how much a frame's samples are worth. At `S = 8` the +cavity does not fit the 4 ms phone budget on the estimate (≈ 4.8); `S = 6` +sits at the line and `S = 4` is under it. What gives is `S`, and with the +mask and LOD that is nearly free: a converged wall needs about 12 snoise per +pixel in total, so `S = 4` converges in about three frames through the TAA +instead of thirty, and `S = 8` in two. Then `dpr`, as before. What gives, in order, is the +sample count, then the resolution; the stardust and the DoF are never dropped +before the clouds' samples; the self-shadowing sample is not taken on any +device until measured. On desktop at `S = 16` the stack is ≈ 1.9 ms. + +Measurement, in this order, all in `ground.js` behind a debug flag and used by +the controller: `EXT_disjoint_timer_query_webgl2` where present (Chrome +desktop) per pass; else a `fenceSync` after the resolve, polled (universal on +WebGL2, phones and Safari included; the queue of a background page is +otherwise empty); else `requestAnimationFrame` cadence. Hands proves it in the +browser pane: desktop numbers with the timer query, the phone's pixel count +from the mobile preset, the phone's GPU time from the operator's phone. + +## The proving-ground contract (what the tapes campaign inherits) + +1. **Enclosure tests in C#** (and HLSL by the mirror): every `iv_*` op over + random intervals and points; `iv_snoise_ball`/`iv_fbm_ball` over 2,000 + balls × 64 points. A mutant that shrinks any bound dies. +2. **The warp is enclosed**: for random flows bounded by `D`, every point + `warp_k(p)` over the segment lies in the enlarged ball and `snoise` of it + lies in `iv_snoise_ball(c, r + D)`. This is the test the site's march rests + on. +3. **The Lipschitz constant has provenance**: the max of `|snoise_grad|` over + 10⁶ points refined by gradient ascent, × 1.10, measured by a committed + test and pinned by another. Empirical with a margin, not a proof; the + enclosure tests are the defence. +4. **Tightness is a number**: mean interval width over true range, printed + by a committed test, for a later affine cut to beat. +5. **The saving is a number** (amended in pass 3): a C# test marches tiles of + rays through four scenarios, an envelope-then-noise field with authored + empty space among them, with the dense march and with the tile-amortized + interval march, and asserts ≥ 2× lower combined cost at equal + transmittance on the authored scenarios; the uniform slab is printed as + the worst case. The shipped field's evals per pixel and unfinished + fraction come from the browser. +6. **Three runtimes agree**: the GLSL golden fixture passes on WebGL2, with + tolerance class and device named in the report. + +Not proved here, said plainly: tape evaluation, automatic pruning, `min`/`max` +choice tracking, affine arithmetic. Pruning and choice tracking stay parked; +the graph, its evaluator and interpreter, and affine forms have since unparked +(Target r2). + +## Cut order + +```text +glsl-lowering (CultLib) ─┐ +interval-ops (CultLib) ─┴─> site-ground (clouds, flow, TAA, sampled wash) ─> site-stardust (particles, DoF) + ^ after site-masthead wash-home-only +``` + +Four cuts. The two CultLib cuts are as in pass 1, except `interval-ops` gains +the warp enclosure test. `site-ground` grew (flow texture, reprojection, the +readback and token restructure); `site-stardust` is split out because its +Soul vocabulary is different (particle statistics, blur quality, the composite) +and because the ground must be measured on its own before the stardust is +charged against the same budget. No CultMath release is in the sequence; the +site consumes a commit. + +Specs: `docs/cultmath-interval-ground-cut-glsl-lowering.spec.json`, +`docs/cultmath-interval-ground-cut-interval-ops.spec.json`, +`docs/cultmath-interval-ground-cut-site-ground.spec.json`, +`docs/cultmath-interval-ground-cut-site-stardust.spec.json`. Revision 2 of +the two CultLib cuts (pass 3): +`docs/cultmath-interval-ground-cut-interval-ops.r2.spec.json`, +`docs/cultmath-interval-ground-cut-glsl-lowering.r2.spec.json`. Revision 3 of +`interval-ops` (pass 4): `docs/cultmath-interval-ground-cut-interval-ops.r3.spec.json`; +`glsl-lowering` r2 and `site-ground` r3 now depend on it. + +### The Cycles cuts (ruling `cycles-kernel-reference-ruled`) + +- `cycles-converters` r2 is the fix batch for Soul's s1. Its specs are typed + documents in the mind, not files here. +- `cycles-noise` r1 waits on `cycles-converters` and reuses its oracle tool. + It inherits the ruling: its fixtures are the unfused SSE4.2 kernel's exact + witness, and every other build is held to the tolerance-class table that + `tools/cycles-oracle/README.md` holds. + +Body fact, probed 2026-10-14 on Yggdrasil. The job script, log and model are +`job.sh`, `probe-avx2.log` and `model.py` in +`F:\Projects\eureka-handoff-aux-2026-10-14\imagination-cycles-converters-r2\`. +Blender 5.2.2 Linux was run on its default AVX2 kernel, with the oracle's +kernel check removed, over the committed `math.json` operands at e48f9488. +Results against the SSE4.2 fixture: + +- `cycles_floored_modulo` differs on 151 of 1024 rows and `cycles_wrap` on 30. +- A single-rounding model, `fma(-floor(a / b), b, a)` (wrap: + `fma(-range, floor((value - min) / range), value)`), reproduces every one of + those rows bit for bit. So the contraction never moved the floor. +- The worst `|delta|` is 0.91 x 2^-24 (|a| + |b|) for floored modulo and + 0.77 x 2^-24 (|value| + |min| + |range|) for wrap. Both fall within the + documented bound of 2^-23 times the same sum. + +## Standing design decisions (means; Self may overrule) + +- D1. Intervals are `float2(lo, hi)`. Affine forms sit beside them (ruling + `affine-forms-unparked`); the wells contract says where they pay. +- D2. No `iv_*` function has a value-only or gradient twin; the bounds take + the point value only. +- D3. The site vendors `CultMath.glsl` by CultLib commit, SHA in the header, a + drift check in the site cut. +- D4. The flow texture is the one owner of motion. Warp, motion vectors, hue + and particles read it; nothing evaluates flow a second way. +- D5. Routes are page loads (`enableSPA: false`, `quartz.config.ts:15`); if + SPA is ever enabled, `ground.js` listens for Quartz's `nav` event and + re-reads the input tokens. +- D6. The budget verdict is session-only; a stored verdict would outlive a + driver update. +- D7. Inputs and outputs are different tokens: four nebula inputs, fifteen + ground outputs with seeds. The shader never reads an output; CSS never reads + an input except through the shader's result. +- D8. The ground tokens are written on `:root` inline, so the seed in the + stylesheet loses to the sample without a class or a second rule. +- D9. The DoF blurs all stardust by the final opacity; per-depth transmittance + is out of scope. +- D10. Stardust and DoF land after the ground has been measured alone, so the + report can say what each costs. + +## Pass 3: the envelope, the scenarios, the tile pre-pass, the split Phacelle + +Pinned: CultLib `main` `d0ea37f8`; `hands/cultmath-interval-ops` at +`c9bd003b` (report `cut-interval-ops.h1`); `hands/cultmath-glsl-lowering` at +`5ae207e8` (report `cut-glsl-lowering.h1`, branched from interval-ops). +Rulings: `operator-tile-amortized-march`, `operator-split-phacelle`, +`operator-compiler-downloads`, `self-exp-measure-in-site`, +`operator-ground-void-brush` (answers Q6; the void scene below). + +### The operator's words + +On the march: "I'm skeptical about the interval march, both in implementation +and measurement. Are we testing it in scenarios where we're actually giving +it empty space to skip? Surely if the pre distortion SDF represents a clear +sky with the camera above the fog and aimed up, the interval math can quickly +tell us not to bother marching very far, no? In Aetheria the levels are +authored to place deep gravity wells for the player to gaze across, with +dynamic action spaced around the well, and finding the empty space there is +the whole point of using intervals, no?" + +He is right. r1's saving test marched one `snoise` octave against a cutoff +through a slab with coverage everywhere: the worst case for intervals, and +0.93x said nothing about real scenes. + +### What r1 measured, and what was wrong in the march + +| Finding (`NoiseBoundTests.cs:344-376` at `c9bd003b`) | Effect | r2 | +| --- | --- | --- | +| Every probe charged one `snoise` per ray | a failed probe cost a third of a dense sample | one probe per tile (the ruling) | +| Coarse probes attempted where the ball could never prove emptiness: `hi = n(c) + L r` clamps to 1, so `L r F0 ≥ 1 + cutoff` is a guaranteed failure; at `StepMax = 2`, `L r F0 = 3.7` | every coarse probe wasted; the 0.74x row | a noise probe is attempted only when `L r F0` leaves room to prove `hi < cutoff`; otherwise the level is "maybe" for free | +| Growth capped at `StepMax = 8 Step0` | clear space cost `Depth / StepMax` probes | ranges double to the grid's end | +| The dense sample evaluated the detail octave even at zero occupancy | the baseline was dearer than a sane shader | coverage first, detail only when density can be nonzero (Aetheria's `if (dist < _SafetyDistance)`) | +| The finest-level probe before each dense cell | fine; amortized it is `1/N²` for a chance at 3 snoise | kept | +| No field structure | nothing to skip | envelope-then-noise, below | + +### The field, from Aetheria + +`Volumetric.cginc:165-221` with `:91-102`, `Zone.cs:369-397` +(`GetHeight`), `Zone.cs:426` (`PowerPulse`), `Settings.asset` +(`DefaultEnvironment`, `PlanetSettings`): + +```text +s(p) = p.y + h(p.xz) the pre-distortion SDF; h ≥ 0 the well map +h(xz) = PowerPulse(|xz| / 2R, 2) · 64 + Σ_b PowerPulse(|xz − c_b| / r_b, 16) · d_b +PowerPulse(x, e) = (1 − 4x²)^e on [0, ½], 0 beyond; r_b = 500 M^0.25, d_b = 30 M^0.175 +fade(s) = 1 − smoothstep(0.75 S, S, s) S = SafetyDistance 30: no noise above it +s'(p) = s + A · fade(s) · n(warp(p)) n = the two-phase warped coverage + ½ detail +density = max(0, (F − s') / B) F = FloorOffset −20, B = FloorBlend 10 +``` + +Above the safety distance the density is exactly 0 and the noise is never +evaluated, by the dense march too. The warp applies to the noise argument +only; the height is read at the unwarped `xz` (Aetheria reads +`_NebulaSurfaceHeight` at `pos.xz` and warps inside `triNoise3d`). + +### The composed bound (invariant `intervals-enclose`, kept) + +Over a tile's frustum slice `[z0, z1]`, every step an existing `iv_*` op: + +- Envelope over the slice's exact box, not the ball: `y = iv_mul([z0, z1], + m_y)`, `x = iv_mul([z0, z1], m_x)` with the tile's slope intervals; + `iv_h` = Σ over bowls of `[pulse(far), pulse(near)]`, `near`/`far` the + least and greatest distance from the box to the bowl centre (monotone, so + exact per bowl). `iv_s = iv_add(y, iv_h)`; `iv_fade` its ordered endpoints. +- Noise over the ball: `iv_n = iv_snoise_ball(ball.xyz · F0, ball.w · F0)`, + `ball = iv_frustum_ball(m_c, z0, z1, N / (√2 f), D)`: centre on the tile's + central ray at mid-depth, radius `(Δ/2)·|(m_c, 1)| + z1·N/(√2 f) + D`. + The warp enlarges only this radius; the envelope's box takes none. +- `iv_s' = iv_add(iv_s, iv_scale(iv_mul(iv_fade, iv_n), A))`; the slice is + provably empty iff `iv_s'.lo ≥ F`. When `iv_fade.hi = 0` the noise term is + identically zero and `iv_snoise_ball` is not called: the envelope proves + the slice empty at no `snoise` cost. This is why tiles compound: one + envelope probe per tile can retire a whole ray length. + +Two tests pin it: `TileBallEnclosesEveryRaySegment` (every ray's points, +sub-pixel jitter and warp included, inside the ball) and +`EnvelopeBoundEnclosesDensity` (the composed bound encloses `density` at +warped points of 2,000 slices, no tolerance). + +### Scenarios and predictions (combined cost, `e = 0.2` snoise per envelope evaluation, `N = 8`) + +| Scenario | Setup | Prediction | +| --- | --- | --- | +| (a) height fog | `h = 0`, camera at `y = S + 30`, rays level and up | > 50x: dense pays 256 envelope evaluations per ray; the tile about ten probes shared by 64 rays; 0 snoise either way | +| (b) inside the fog | `h = 0`, camera at `y = F − 10`, rays level | 0.8–1.0x: every ray saturates in a few cells; the pre-pass still probes the whole grid | +| (c) Aetheria-like | zone bowl `R = 2000` + four wells (masses 100, 1000, 10000, 1000), camera above the fog in the bowl, rays gazing across (`m_y ∈ [−0.25, 0.1]`), Aetheria's units and 256-sample quadratic grid | 2–4x: the clear cells before the fog surface collapse to a few probes per tile; the fog cells cost the same on both sides. The noise ball proves nothing at Aetheria's scale (`L r F0 ≥ 1.6` at the finest cell with `D = 60`), so it is not evaluated; the saving is the envelope's | +| (d) uniform slab | r1's field, kept as the worst case | 1.3–1.5x: the ceiling at `L = 10.099261` with the cheaper baseline | +| (e) the void, the shipped scene | the true cavity, hollow radius `Rh = 198`, ramp `S = 50`, camera 186 from the centre, low; every ray crosses interior and ends in a wall; three marches (fixed-step reference, masked fixed-step, masked LOD) | **steps per pixel ≈ 35 → 6 (5–8x fewer), combined cost 1.7x, snoise alone 1.25x**, from the model below. The noise ball proves nothing (`L r F0 ≥ 1.5`); the interior is retired by the envelope, the ramp is sampled at the content limit | + +The 2x contract on combined cost is asserted on (a) and (c) at `N = 8`; (b) +and (d) are printed. (e) is the headline: its contract is steps per pixel +(below), and it prints cost and snoise beside it. + +### Footprint LOD, and the cavity cost as a function + +The operator's words: "Surely this depends on the size of the cavity and the +camera placement, no? The slope of the wall's density gradient offset +determines the region we have to sample in. How much we actually sample that +region depends on how close it is to the camera. A 10-wide gradient 1,000 +units away only needs one raymarching step worth of detail, right?" + +Right. Pass 3b costed every wall at a fixed step. The march is now +footprint-aware, in the site and in the saving test: + +- `θ_px = 2 tan(fov/2) / H`; the footprint at distance `z` is `z θ_px`. +- Step `Δ(z) = max(k z θ_px, min(S/4, λ_fine(z)/2))`, `k = 4`: never finer + than four footprints, otherwise the finer of the two content limits (four + samples across the ramp, two per wavelength of the finest live octave). +- Octave `i` of wavelength `λ_i` carries weight `w_i(z) = 1 − + smoothstep(λ_i/2m, λ_i/m, z θ_px)`, `m = 4`: one smooth blend per octave, + no popping; TAA hides the per-frame sparsity. +- The weights are part of the field, so the bound encloses the truncated + field exactly: the noise interval over a slice is `Σ_i iv_mul([w_i(z1), + w_i(z0)], iv_snoise_ball(c F_i, r F_i))`, `w_i` monotone in `z`. + `intervals-enclose` holds for what the shader evaluates. +- The pre-pass says where each ray's ramp begins; LOD says how finely to + sample it once there. They compound. The reference a march that does not + know where the wall is must pay is the fixed step `min(10, S/4)` everywhere. + +The cavity is parametrised by the hollow radius `Rh` and the ramp width `S`; +the brush `(1 − (d/Rc)²)^e` with `CARVE` gives `Rh = Rc √(1 − CARVE^(−1/e))` +and `S` from the exponent (`e = 4` gives `S ≈ 1.3 Rh`, `e = 0.25` gives +`S ≈ 0.12 Rh`), so `(Rh, S)` are the knobs and `(Rc, e)` derived. Shipped: +`Rh = 198`, `S = 50`, so `Rc = Rh + S = 248` and `e = −ln CARVE / ln(1 − +(Rh/Rc)²) = 0.40`, `K = 1/30` (pass 4 corrects this line's `e ≈ 0.6, Rc ≈ +220`, which did not satisfy the formula; Q9 asked the look question and is ruled `operator-shipped-void`). + +Imagination's model (scratchpad `cavity_model.py`; the test confirms or +refutes), 1080p, `N = 8`, per pixel for a converged frame; "ref" is the +fixed-step reference's steps: + +| `Rh` | camera | `S = 10` steps / snoise / cost ratio | `S = 50` | `S = 150` | +| --- | --- | --- | --- | --- | +| 100 | low | 6 / 12 / 2.6x | 6 / 12 / 1.6x | 14 / 36 / 1.3x | +| 200 | low (**shipped**, ref ≈ 35 steps) | 6 / 12 / 3.2x | **6 / 12 / 1.7x** | 14 / 36 / 1.4x | +| 400 | low | 6 / 12 / 4.0x | 6 / 12 / 1.9x | 14 / 36 / 1.5x | +| 1000 | low | 5 / 9 / 8.2x | 6 / 12 / 2.5x | 14 / 36 / 1.7x | +| 1000 | centred | 4.3 / 7 / 12.9x | 6 / 12 / 2.9x | 14 / 36 / 1.8x | + +Centred and mid offsets differ from low by under 10% at every point. What +the table says: within the frustum the footprint is under 4 units, so the +step is set by the content limits (`S/4`, and the detail octave's 12.5-unit +half-wavelength), not by distance; the "10-wide gradient 1,000 units away" +row is where the footprint finally bites (4.3 steps, 7 snoise). The sample +count is nearly flat in `Rh` and camera offset and rises with `S` only once +the detail wavelength, not the ramp, sets the step. What makes the shipped +scene cheaper without losing the mood, in order: a lower per-frame sample +budget, which LOD and the mask make nearly lossless (`S_budget = 4` converges +in about three frames at the walls); a thinner ramp (`S = 10` is 3.2x on cost +but reads as a surface; 25–50 keeps the fog); a longer detail wavelength or +no detail octave at the far wall; a larger hollow, which changes the +composition and costs nothing per pixel. + +**Q8 retired.** At the shipped point the shipped march takes 5–8x fewer steps +than the fixed-step reference and 1.7x less combined cost; the contract for +(e) is the number that scales with GPU time, steps per pixel: ≥ 2x fewer than +the fixed-step reference at the shipped parameters, with snoise per pixel and +combined cost printed beside it and promised nothing. The test asserts that; +the browser measures it (`?ground=debug` against `?ground=dense`). A shortfall skips the assertion naming `saving-2x-scenarios`; the +fields, grids and `e` are not tuned. The honest summary: at a Lipschitz bound +near 10 the noise ball is weak everywhere; what intervals buy on these fields +is the envelope's empty space, found exactly, and the tiles make finding it +nearly free. + +### The site ground: the void (ruling `operator-ground-void-brush`) + +The operator's words: "There was an old main menu visual with a purely +authored field, first thing I did all the way back when the shader was new. I +believe it was a single negative pseudo gaussian spherical brush creating a +void in the clouds, with a sun gently nestled at the bottom lighting the +cavity and orbiting along a track with the camera following low, very moody, +gives us lots of options for authoring the flow field and stardust +distribution" + +**The original, found.** Aetheria `e6181c11` ("Main Menu", 2021-03-13): +`Assets/Scenes/Main Menu.unity`, the `Sun` prefab instance under a `Center` +pivot, `Materials/Brushes/Gravity Well.mat` and +`Main Menu Sun Fog Tint.mat`, `Fog Marching Main Menu.mat` on +`VolumeRender.shader` of that commit. What survives, in its units: + +| Element | Original value | +| --- | --- | +| The brush | `PowerBrush` `(1 − x²)^16`, depth 40, radius 256 (half depth at r = 52; a Gaussian of σ ≈ 45); the sun's own gravity-well child. A boundary bowl (depth 75, power 0.25, radius 1500) is flat across the scene: a constant 75 | +| The floor | offset −16.46, blend 39.6: the fog top is `y = −91` outside the void, `−131` at the sun | +| The sun | sphere radius 12.5 at `y = −130`: the bottom of the void | +| The orbit | `Center` rotates 5°/s about y (72 s period); the sun at radius 175 | +| The camera | Cinemachine vcam following the sun (framing transposer, distance 150, damping 10, handheld noise amplitude 1 at 0.25 Hz), looking at `Look Target` `(0, −130, 0)`, the orbit centre at the sun's depth; saved at `y = −27` | +| The light | authored, not marched: the sun's tint brush `(1 − x²)^3`, depth 2, radius 128, orange `(1, .4, .1)`, plus a scene-wide blue ambient tint `(0.18, 0.59, 1)` × 0.01 | +| Stardust | 256² particles, spacing 2, floor −60, ceiling 0, height exponent `800 / (ceiling + wellDepth)`: more headroom where the well is deeper, so the void fills with stardust | +| Noise | strength 150, frequency 0.01, safety 50 | + +Not surviving: the 2021 `d()` displacement details (the 2021-05-30 "Volumetric +Redux" rewrote it), the tint map's runtime contents, the video. The 2021 +brush was radial in `xz` and carved a bowl in a cloud floor; the operator +ruled (Q7, `operator-void-true-cavity`) that the site's void is a true 3D +hollow inside a cloud volume that surrounds it on every side, including +above. Everything else recovered carries over. + +**The site scene** (`site-ground` r3; the brush parameters in this paragraph, +`Rc = 640`, `e = 4`, are superseded by pass 4's one shipped void, `Rh = 198`, +`S = 50`, `Rc = 248`, `e = 0.40`, as Q9 ruled): the original's units. Outer volume: an +unbounded uniform fill (chosen over a shell: every ray then ends in a wall +and the march terminates by opacity, never by a far plane; `Z1 = 2 Rc` bounds +the pre-pass range only). The carve: `d = |p − c_v|`, `g(d) = (1 − +(d/Rc)²)^4` for `d < Rc`, `Rc = 640`, `CARVE = 1.5`; `density = K · max(0, +1 − CARVE · g(d'))`, exactly 0 inside the hollow radius `Rh = Rc √(1 − +CARVE^(−1/4)) = 198`, half at `0.49 Rc`, full at `Rc`; `K = 1/30`, so a wall +is opaque within ≈ 150 units of entry. Noise displaces the wall only: +`fade(d) = smoothstep(Rh − S, Rh, d)`, `S = 50`, `d' = d + A · fade · n`, +`A = 20`, `F0 = 0.01`. Its bound over a tile's slice: `d`'s interval is the +box's least and greatest distance to `c_v` (exact); `g`, `fade` and the carve +are monotone in it; the slice is provably empty iff `d_hi + A · fade(d_hi) · +n_hi ≤ Rh`, and deep inside (`fade = 0`) no noise is evaluated. `Rc` grew +from the brush's 256 because a 3D hollow must hold the camera. + +The sun orbits the origin at radius 175, period 72 s; the cavity centre is +`c_v = sun + (0, Rh − 12.5, 0)`, so the sun sphere rests on the hollow's +bottom and the hollow moves with it. The camera follows 120 behind the sun +along the tangent and 45 above it: 186 from `c_v`, 12 inside the hollow, low, +looking at `sun + (0, 60, 0)` so the lit lower wall and the dark upper wall +share the frame. The 2021 follow distance 150 and height 25 do not fit a +hollow a camera can stand in; 120 and 45 are the re-derivation. There is no +sky: behind a fully transmissive pixel the resolve shows the base token, and +only an unfinished ray (budget exhausted before the wall, measured, under 1%) +reaches it. `worldAt(t)` in `ground.js` is the one +owner of sun, cavity and camera; nothing integrates motion. The flow is authored +around the void: a swirl `SWIRL · tangent · (1 − (r/Rw)²)²` (largest +mid-slope, zero at rim and centre) plus the global noise flow, rendered into a +world-space window of side `4 Rw` around the sun, so warp, hue, motion vectors +and the stardust read one texture (D4). The stardust (next cut) spawns in the +bowl with the original's height rule and is lit by the same pulse. + +**Lighting, cheapest moody version:** the original's mechanism made 3D. At a +sample, `light = SUN · (1 − (d/Rl)²)^3` for `d = |p − sun| < Rl = Rh = 198` +(the original's 128 scaled with the hollow), plus the blue ambient; `colour = +density · (light + ambient) · hue(flow)`. Zero extra `snoise`; the lower wall +within `Rl` of the sun glows and the upper wall stays dark because the pulse +is zero beyond `Rl`, which is the moody split; the sun inside the hollow is +occluded by nothing, so it is a small additive disc in the resolve, occluded +only by the accumulated transmittance along its ray. A self-shadowing step (one envelope-only +transmittance sample toward the sun per primary sample, no noise, ≈ +25% on +the march) is named, not taken: desktop-only if measurement ever allows. + +**TAA with a moving camera:** the main pass writes the depth-weighted mean +march distance to an `R16F` history channel; the resolve reconstructs the +world point at that depth, moves it back by the field motion (`p + flow·dt`), +projects it with the previous frame's view-projection and fetches history +there. Same 3×3 clamp, same `α`, same resets. Colour, transmittance and depth +are reprojected by the one motion vector. + +**Fit with the tokens:** `--gamecult-nebula-0` (orange) is the sun's colour, +`--gamecult-nebula-2` (sky) the ambient, `--gamecult-nebula-1` the cloud hue's +second pole, the base the sky. Outputs as pass 2, with one change: +`--gamecult-light-0-at` is written from the sun's projected position, so the +CSS wash's main light follows the sun; its seed is the sun's mean screen +position, so the fallback is a still of the same composition. + +**Soundness with a moving camera:** each frame's pre-pass evaluates +`iv_frustum_ball` from that frame's camera; no ball, mask or probe result is +carried across frames. The only cross-frame state is the TAA history, which +is colour, not a soundness input. The saving test draws each tile's camera +independently and says so. + +The march: a **low-resolution pre-pass** at `W/8 × H/8` runs the tile loop +over the slab's cell ranges (the envelope first, the noise ball only when the +envelope leaves `fade.hi > 0` and `L r F0` leaves room) and writes a per-tile +skip mask of the dense cells not proven empty into an `RGBA32UI` texel (128 +bits; 96 cells at the slab's fine step). The main pass reads one texel +(`texelFetch`) and places its `S` samples in unmasked cells only, stratified +over the unmasked length; masked cells contribute exactly zero, so this is +exact importance sampling, not an approximation. The fragment cannot share a +probe across pixels (derivatives reach a 2×2 quad at best), so the pre-pass +is the cheaper and the only sound option in WebGL2. Cost at `N = 8` is in the +budget table: ≤ 144 probes per tile worst case (nothing skipped, hierarchy +descended everywhere), mostly envelope-only, ≈ 0.4–2 snoise-equivalents per +pixel; `N = 16` quarters it but makes the ball's lateral term equal the fine +half-length at the slab's far plane. **Predicted `N = 8`.** The site's own +ratio is measured in the browser against a dense reference with the same +envelope gate (the proving-ground contract's second half). + +### The split Phacelle and the compile checks (glsl-lowering r2) + +Pass 4: the glsl branch rebases onto interval-ops **r3**'s head, because r3 +changes `cultmath_iv_frustum_ball`'s radius and the fixture family with it. + +- Transformation step 1 gains one licence-keyed entry: an include under its + own licence is lowered into its own file. `CultMath.glsl` (MIT: `CultMath.hlsl` + + `CultMath.Interval.hlsl`) and `CultMath.Phacelle.glsl` (MPL-2.0, + concatenated after it only by consumers that call `cultmath_phacelle`; the + site does not). Both pinned; `THIRD-PARTY-NOTICES.md` lists the MPL files + and no longer calls `CultMath.glsl` MPL. +- `iv_exp` joins the fixture with a platform tolerance (1 ulp, the generating + OS named), because `self-exp-measure-in-site` has the site measure WebGL2 + `exp` against it. The fixture is regenerated for `cultmath_iv_frustum_ball`. +- glslang 16.6.0 and dxc are downloaded pinned and run: the MIT-only wrapper, + the two-file wrapper, a `lerp(` negative control, and a `cultmath_phacelle` + call against the MIT-only wrapper that must fail (proves the split). +- The glsl branch rebases onto interval-ops r2's head; its first commit is the + regeneration alone. + +Carried, still out of scope: the Unity `CultMath.dll` rebuild (no release in +the sequence); the fixture's ulp bounds on WebGL2 (site cut); Stryker's +timeouts are reported as timeouts, not kills. + +## Pass 4: Soul's five findings, the analytic body, the one shipped void + +Pinned: CultLib `main` `780d8cfa` (docs only since `d0ea37f8`); +`hands/cultmath-interval-ops` at `43183276` (report `cut-interval-ops.h2`, +verdict `cut-interval-ops.s1`, worktree `F:\Projects\CultLib-iv`). Rulings new +in this pass: `operator-wells-contract-vs-ceiling` ((c) is held to at least 90% +of its probe-free ceiling, not 2x: the ceiling is what intervals control; the +fog band's cost belongs to the field) and `operator-analytic-wall-body` (where +the envelope interval proves the density constant, one closed-form +Beer-Lambert step instead of sampling at the content limits). Spec: +`docs/cultmath-interval-ground-cut-interval-ops.r3.spec.json`. + +### What r2 measured + +| Scenario | r2 result | Pass 3 prediction | +| --- | --- | --- | +| (a) height fog | 16384x | > 50x | +| (b) inside the fog | 0.99x | 0.8–1.0x | +| (c) Aetheria wells | 1.41x at warp D (3.32x at warp 0); probe-free ceiling 1.42x (3.46x) | 2–4x | +| (d) uniform slab | 1.23x | 1.3–1.5x | +| (e) void, shipped | steps per pixel 36.34 → 16.45 (2.21x fewer), cost 1.34x, snoise 26.6 | 35 → 6 (5–8x), cost 1.7x | + +Two things the pass 3 model got wrong, both now owned by r3: the footprint +step kept its content limits (`S/4`, the detail half-wavelength 12.5) inside +the wall's constant-density body, which the model had costed at two steps; and +the noise band does not end at `Rc`: with `A = 20` and the free noise interval +`[−1.5, 1.5]`, the density is provably `K` only from `d ≥ Rc + 30`. The ruling +answers the first; the second is content and stays. + +### Soul's findings and what r3 does with each + +| Finding | Severity | r3 | +| --- | --- | --- | +| `frustum-ball-float-crossing` | Medium | the radius is widened by a derived float32 bound (below); seven extreme families join the enclosure test; the strictness sentence leaves the C#, the HLSL and `design.md` | +| `aetheria-far-plane-miscited` | Low | `far = 2048`, the Main Camera's (`ARPG.unity:31777`, `:31830`); the Tint camera's 1000 was the wrong camera | +| `shipped-void-two-scenes` | Medium | one shipped void, `(Rh, S) = (198, 50)`, `(Rc, e) = (248, 0.40)` derived; the map, the site-ground spec and the test agree; the look question was Q9, ruled `operator-shipped-void` | +| `lod-weights-never-exercised` | Low | configuration "LOD far" (`Rh = 4000`, `S = 50`, low camera, `f = 467`) reaches weights in `(0, 1)` and at 0; the `[w(z1), 1]` bound is recorded as a deviation with its soundness argument | +| `stryker-timeout-survivor` | Low | 2525 named equivalent; ball radii to `1e3` so `L/r` dies to an enclosure test; every timeout hand-run; the report claims only demonstrated kills | + +### The float widening rule (finding 1) + +`iv_frustum_ball` returns a float32 ball; its promise is that every exact +point `(m z, z)` of every ray of the tile, `m` in the footprint, `z ∈ [z0, +z1]`, moved by at most the warp, lies inside it. Soul showed the r2 ball misses +such points by up to `5.7e-4 r` when `z0 == z1`, `3.3e-4 r` at `z ≈ 1e7` and +19% of `r` at `|m_c| ≈ 1000`: the triangle inequality is an equality on the +degenerate slice and the centre's own rounding crosses it. The rule, in C# and +both HLSL copies, after the r2 radius: + +```text +radius += (|c.x| + |c.y| + |c.z| + radius) · 2^-20 (9.5367431640625e-7, exact) +``` + +Derivation with `u = 2^-24`: the centre `c = (m_c z_m, z_m)` carries at most +two roundings per component (`z_m = fl(z0 + z1) · 0.5`, then the product), so +`|c_float − c_exact| ≤ 2u |c|₁`; the radius carries at most seven first-order +roundings (`z1 − z0`; the axis `sqrt(mx² + my² + 1)` at `3u`; the product; `z1 +· footprint`; the sum; `+ warp`), so `r_exact ≤ r_float (1 + 7u)`; the +widening's own addition rounds once more. `2^-20 = 16u` covers `8u (|c|₁ + r)` +twice over. fma contraction removes roundings and only tightens, so dxc's HLSL +and any driver's GLSL are covered by the same bound. Cost at the shipped +scales: `|c|₁ ≈ 600`, `r ≈ 5` → `6e-4` units, 0.01% of the radius. The +enclosure test computes distances in double from the float ball and the float +ray, no tolerance, over the r2 domain and the extreme families (`z0 == z1`; +`z1 − z0 = 1e-6 z1`; `|m_c| ≤ 1000`; `z ≤ 1e7`; `z0 = 0, z1 ≥ 1e-3`; `f ≥ 1`; +warp to `1e6`), corners at both depth ends with the flow pointed outward. The +derivation pin becomes two-sided (`r_exact ≤ ball.w ≤ r_exact + 2^-19 (r_exact ++ |c|₁)`), so a ball that forgets the widening fails and one that grows past +the rule fails. The caller's world transform and its own point rounding remain +the caller's; the function says so in its doc instead of a false proof. + +### The one shipped void (finding 3) and Q9 + +The map held two voids: the Footprint-LOD section's `(Rh, S) = (198, 50)` +(with an `e ≈ 0.6, Rc ≈ 220` that did not satisfy its own formula) and the site +section's `Rc = 640, e = 4` (a 442-wide ramp with a 50-wide fade band). Hands +implemented the first with the arithmetic corrected (`Rc = Rh + S = 248`, `e = +0.40`) and measured 2.21x; Soul measured the second at 1.93x. Under the +analytic body the second gains nothing: across a 442-wide ramp the optical +depth exceeds 4 before the density is provably constant, so rays end inside the +ramp and the body is never proven. The map's own rule says `(Rh, S)` are the +knobs, so the honest choice is the first; it changes the look relative to the +site section, hence Q9 (below; ruled (a), `operator-shipped-void`). For `CARVE = 1.5` the ramp width is tied to the +exponent (`S/Rh = 1/√(1 − 1.5^(−1/e)) − 1`: `e = 0.4 → 0.25`, `e = 0.7 → +0.5`, `e = 1 → 0.73`, `e = 4 → 2.2`), so "pseudo-Gaussian" and "narrow" cannot +both be had without a third knob, and a narrow wall at `e = 4` needs +`CARVE ≈ 58`, which is a hard wall again. The ramp width is the look-cost knob. + +### The analytic body (ruling `operator-analytic-wall-body`) + +Consumer-side, no new CultMath function; the saving test and the site mirror +each other. + +- **When it applies.** The consumer's `Bound` over the whole remaining range + `[z, z_end]`, gated, is a point interval with positive value: for the void, + the envelope with the free noise interval `[−1.5, 1.5]` proves `fade = 1` + and `d_lo + A · (fade n)_lo ≥ Rc`, so every point of every ray of the tile + over the rest of the grid has density exactly `K` for any noise value. For + (a)–(d) no bound is a positive point (the fog's density varies with `s'`), + so the step never applies there, and the test asserts it. +- **Pre-pass.** `MarchTile` returns `(dense cells, bodyStart, bodyDensity)`: + when a single cell is not provably empty and its own bound is a positive + point, one more probe over `[z_j, z_end]`; if that is a positive point too, + `bodyStart = j` and every remaining cell is appended dense without probing + (always sound; it also drops the body's probes). The site writes the cell in + the mask texel's fourth word, `0xFFFFFFFF` when none. +- **Main pass.** Unmasked cells before `bodyStart` as before; at `bodyStart`, + `T *= exp(−K · (z_end − z) · |dir|)`, one step, stop. The grid end for every + void configuration becomes `|camera − c_v| + Rc + 6/K` (was `5/K`): the + body starts at `d ≥ Rc + 30` plus box slack, so `6/K` leaves at least 4.9 of + optical depth and `T ≤ 0.0075`. No probe in the main pass: the constant is + the field's pointwise envelope value at that cell. +- **Pin.** `AnalyticBodyMatchesFineMarch`: wherever a body is reported, the + bound over the rest of the grid is a positive point and the full and the + truncated density at 64 sampled points of the body equal it exactly; the + analytic factor equals the fixed-step product over the same cells within + `1e-4` relative; no (a)–(d) tile reports a body. The masked fixed-step march + stays the mask's soundness pin (exact agreement with the reference); only + the LOD march takes the step. Hand mutation that must fail: in + `VoidField.Compose`, `CarveRadius → HollowRadius` in the lo test. + +### Footprint LOD, exercised (finding 4) + +At `f = 935` every octave weight is 1 inside every r2 grid (the fine weight +drops below 1 past `z = 2922`; the largest grid ends at 2240). `VoidField` +takes a focal length, and one configuration reaches the weights: `Rh = 4000`, +`S = 50`, low camera, `f = 467` (a 98° vertical FOV at 1080 rows): fine weight +below 1 past 1460 and 0 past 2920, coarse below 1 past 5840, grid to ≈ 7990; +the footprint term `4 z θ` also exceeds 12.5 past 1460, so `LodStep` is +footprint-set there. It joins the enclosure test's field list and is printed by +the saving test, not asserted. Deviation recorded: the bound takes each weight +over `[w(z1), 1]`, not `[w(z1), w(z0)]`, because one `Bound` serves the full +field (`w = 1`) and the truncated one (`w ∈ [w(z1), w(z0)]`); `[w(z1), 1]` +contains both and `iv_mul` is monotone in its interval argument, so the +composed interval encloses both fields; the slack is only in far tiles whose +step the footprint already sets. Hand mutation that must fail the truncated +check there: `w(z0)` for `w(z1)`. + +### Contracts after r3 (asserted at `N = 8`) + +- (a): at least 2x combined cost. Measured 16384x. +- (c): at least 0.90 of its probe-free ceiling (`Ratio / Ceiling`, the lower + of warp 0 and D). Measured 0.99 at warp D, 0.96 at warp 0. +- (e): at least 2x fewer LOD steps per pixel than the fixed-step reference at + the one shipped void; the masked march exact; the LOD march within 0.02. +- (b), (d), the (e) grid and LOD-far: printed only. + +### Predictions (Imagination's rule, not a measurement) + +From r2's printed rows: the LOD steps that evaluated noise are about +`snoise / 2.8` plus two pre-band steps; the rest were constant-body steps, +which the analytic step makes one. Ref/LOD steps: + +| `Rh`, camera | `S = 10` r2 → r3 | `S = 50` r2 → r3 | `S = 150` r2 → r3 | +| --- | --- | --- | --- | +| 100, low | 2.1 → 5.3x | 1.8 → 2.5x | 1.6 → 1.6x | +| 200, low | 2.7 → 5.8x | 2.2 → 2.8x | 1.8 → 1.8x | +| 400, low | 3.4 → 6.2x | 2.9 → 3.5x | 2.2 → 2.2x | +| 1000, low | 6.8 → 10.9x | 4.5 → 5.2x | 3.3 → 3.3x | +| 1000, centred | 12.4 → 30x | | | +| **shipped** (198, low, 50) | | **2.21 → ≈ 2.9x (12.5 steps), cost 1.34 → 1.38x, snoise 26.6 unchanged** | | + +At `S = 150` rays end inside the ramp before the body is proven, so nothing +changes there. If the shipped point lands under 2.6x, the report says which +assumption failed: the pre-band's 0-snoise steps, or a body start later than +`Rc + 30` by box slack. + +### Authority map delta (against pass 3's) + +- `iv_frustum_ball` is now the owner of its own float32 rounding: the + widening is part of the function. Consumers add nothing for it and remain + owners of their world transform. +- The body proof is derived from the same `Bound` the mask is derived from, by + one more probe; the main pass reads it and never decides it. The Beer-Lambert + step is the consumer's integration, not a CultMath function. +- `(Rc, e)` are no longer authored; they are derived from `(Rh, S)`. The site + section's `Rc = 640, e = 4` is no longer an owner of the look (Q9 ruled (a), `operator-shipped-void`). +- (c)'s contract is derived from its own run (0.90 of the ceiling); no absolute + target is written for (c). +- Deletion line: the false strictness sentence, the Tint camera citation, the + (c) 2x assertion and the second shipped void leave before their replacements + are written. Net in `src`: one line and a doc comment. + +### Dependent specs + +`glsl-lowering` r2 now depends on `interval-ops` r3 and rebases onto its head +(the fixture family for `cultmath_iv_frustum_ball` changes with the widening). +`site-ground` r3 now depends on `interval-ops` r3; its field item carries the +one shipped void with `(Rc, e)` derived, its pre-pass writes the body-start +cell in the texel's fourth word, its main pass takes the one analytic step, +and `Z1 = |camera − c_v| + Rc + 6/K` (614 at the shipped point, 62 cells of +10; the mask has 96 bits). Both files are edited in place on `main`; the +mind's copies need re-admission by Self. + +## Questions + +Q4-Q9 are all ruled; the options below are kept as the record of what was +asked. Q9: (a), ruling `operator-shipped-void` (`rh198-s50`). Q4: (a), ruling +`operator-palette-tokens`. Q5: (a), ruling `operator-wash-carry`. + +**Q9. The one shipped void** (pass 4; finding `shipped-void-two-scenes`). +Authored as `(Rh, S)` with `(Rc, e)` derived; `CARVE = 1.5`, `A = 20`, +`F0 = 0.01`, `K = 1/30`, the camera as site-ground r3. +- (a) `Rh = 198`, `S = 50` → `Rc = 248`, `e = 0.40`. The scene r2 measured + (2.21x; predicted ≈ 2.9x with the analytic body). A 50-wide noisy wall whose + outer edge has a kink (`e < 1`), softened by the ±20 noise displacement and + the TAA. **Recommended**: the map's own rule, the measured scene and the + ruling's analytic body all point at it. +- (b) `Rc = 640`, `e = 4` (`Rh = 198`, a 442-wide pseudo-Gaussian ramp, fade + band 50): the site section's soft wall. Measured 1.93x; the body is never + proven, so the analytic step never fires; the (e) contract fails unless it + is dropped to printed or the detail octave is removed where the ramp is + wide, both of which are the operator's to decide. +- (c) `Rh = 198`, `S = 100` → `Rc = 298`, `e = 0.70`: the compromise, a + softer 100-wide wall; predicted ≈ 2.4x; not in the r2 grid, so unmeasured. + +Hands codes (a); another ruling moves only the shipped constants here, in the +r3 spec and in the site-ground spec. + +**Q6. The site ground's envelope look.** Answered outside the options by +`cultmath-tapes:ruling:operator-ground-void-brush`: the old main menu's void +(pass 3, "The site ground: the void"). + +**Q7. What "spherical" means for the brush.** Ruled +`cultmath-tapes:ruling:operator-void-true-cavity`: a true 3D hollow inside a +cloud volume that surrounds it on every side, including above; not the 2021 +bowl. + +**Q8. `cavity-contract`.** Retired in pass 3d (see "Footprint LOD"): the +contract for (e) is steps per pixel against the fixed-step reference at the +shipped parameters, ≥ 2x fewer, predicted 5–8x; cost and snoise are printed +beside it and promised nothing. + +Specs for pass 3: `docs/cultmath-interval-ground-cut-site-ground.r3.spec.json` +beside the two CultLib r2 specs. + +**Q4. Where the shader's palette input comes from.** +- (a) Four new input tokens in `custom.scss` (`--gamecult-nebula-0/1/2`, + `--gamecult-nebula-base`), seeded with today's wash colours. + **Recommended.** The nebula palette can be tuned without moving the UI + accent, and the brand doc's rule (colour is defined in `custom.scss`) holds. +- (b) Reuse `--secondary` and `--tertiary` from `quartz.config.ts` and promote + the violet to a config token. Fewer tokens; ties the nebula to the UI accent + for good. + +**Q5. Carrying the last sampled wash across page loads.** +- (a) `ground.js` keeps the last written token set in `sessionStorage` and + applies it before the first paint on the next page; the seeds apply when + nothing is stored. A cache, never authority. **Recommended.** Without it, + every navigation shows the seed wash for the first frames, then the shader. +- (b) No storage; the seed paints first on every page. Simpler; a visible + shift on every navigation. + +## Unsettled + +- The Lipschitz constant is empirical with a margin; a per-cell polynomial + proof is possible and not in this cut. +- `_DoFBlurTex`'s writer is not in the Aetheria checkout; the web DoF takes the + operator's recollection (final transmittance) as the driver. If stills of + the video arrive, Hands can match the blur radius against them, but the + mechanism does not depend on it. +- The ritual ground's radii are `rem` lengths and its first gradient stop is + unpositioned (`custom.scss:124`); Hands normalises it when tokenising. +- Whether GameCult-Quartz's bundler permits a dynamic `import()` from a + component's `afterDOMLoaded` or needs a script tag; one line either way. +- `:root:has(body[data-slug])` for the ritual seeds: supported in every + current browser; a browser without `:has` gets the default seeds, which is + acceptable for a fallback of a fallback. + +## Pass 5: affine forms (ruling `affine-forms-unparked`) + +Imagination pass 5, 2026-10-03. It maps the affine-arithmetic piece of the +tape target, unparked on its own by ruling +`cultmath-tapes:ruling:affine-forms-unparked`. It answers follow-up +`cultmath-tapes:follow_up:wells-oracle-shortfall-affine-forms`. No tape, +pruning or interpreter is built; tape steps 2-5 stay parked under +`tape-target-unparks-when-asura-stable`. Pinned head: CultLib `main` at +`a7966142`. Every `file:line` in this section is against that commit. + +### What was measured (body facts) + +The probe is a renamed copy of `NoiseBoundTests.cs` with five more bounds for +`FogField`. It lives on the local branch `scratch/imagination-affine-probe` +(`5fa8e9ce`). That branch was never pushed to origin and is not for merging. +It was run on Yggdrasil through the ygg-verify stopgap (`dotnet/sdk:10.0`, +about 3 minutes). It re-runs `Run(FogField.Wells(w), 8, 64, 0x5A7E + 8)`, so +the tiles, rays and seeds are those of the landed (c) row at `N = 8`. V0 +reproduces the landed figures exactly (0.378 and 0.194). + +Constants the probe needed, each sampled over 2e5 seeded points with a 1.25 +margin (probe grade, not provenance): +- the Frobenius norm of the Hessian of `snoise(float3)`, max 55.15, so + `M = 68.94`; +- the gradient length of `snoise(float2)`, max 7.35, so `L2 = 9.19`; +- for comparison, the mean `|snoise_grad|` is 2.59, against `L = 10.10`. + +The bounds: +- **V0**: the landed bound. +- **V1**: V0 with the detail octave's ball no longer enlarged by the warp. The + detail reads the unwarped point (`NoiseBoundTests.cs:860`, `Noise.Detail(p, ...)` of the unwarped `p`), yet `Bound` + hands it `ball.w`, which carries `D` (`:875`, `:890`). +- **V2**: V1 with the warp centred. Each phase's coverage ball is centred at + `c + flow(c) shift_k`, with radius `r + |shift_k| rho`, where + `rho = FlowAmplitude L2 FlowFrequency r sqrt 2` bounds how far the flow moves + over the ball. This is the mean-value form of the warp: interval arithmetic + only, no affine noise. +- **V3**: V2 with the centred form of the noise, + `n(c) +- min(L R, |g(c)| R + M R^2 / 2)` from one `snoise_grad`. +- **V4**: V3 with a reduced affine form. Three shared symbols (depth `t`, + slopes `u` and `v`) carry the envelope's plane term and every noise term's + linear part, and one error symbol takes the rest. It applies where the fade + is the point 1, and is intersected with V3. +- **V5**: V4 with one shared symbol, depth `t`, plus one error symbol: + Gamito's `t0 + t1 e1 + t2 e2`. + +A gradient evaluation is counted as 2 snoise, an estimate. V3 to V5 gate a +probe on the best result any centre value and gradient could give. + +Range ceiling. A cell is range-nonempty if the density is positive at any of +5 x 5 slopes over the tile's slope square (corners included) times 9 depths +over the cell, or if it is in the oracle mask. Its efficiency is the oracle +march's cost over the cost of marching the range mask, with probes free. The +sampling can miss nonzero points, so this figure is an upper estimate. No +sound enclosure can beat it. + +| (c), `N = 8` | efficiency (oracle) | cost ratio | dense cells/ray | probe overhead | cull | +| --- | --- | --- | --- | --- | --- | +| warp 0, V0 landed interval | 0.378 | 2.74x | 12.40 | 0.961 | 0.952 | +| warp 0, V2 centred interval | 0.368 | 2.67x | 12.40 | 0.937 | 0.952 | +| warp 0, V3 centred noise | 0.466 | 3.38x | 8.67 | 0.868 | 0.974 | +| warp 0, V5 affine, one symbol | **0.511** | **3.71x** | 7.81 | 0.859 | 0.979 | +| warp 0, V4 affine, three symbols | 0.534 | 3.88x | 7.37 | 0.853 | 0.981 | +| warp 0, range ceiling | 0.859 | | | | 0.995 | +| warp 60, V0 landed interval | 0.194 | 1.39x | 31.55 | 0.993 | 0.842 | +| warp 60, V1 detail unwarped | 0.205 | 1.47x | 27.74 | 0.963 | 0.864 | +| warp 60, V2 centred interval | 0.347 | 2.49x | 13.71 | 0.938 | 0.945 | +| warp 60, V3 centred noise | 0.441 | 3.16x | 9.52 | 0.870 | 0.969 | +| warp 60, V5 affine, one symbol | **0.477** | **3.42x** | 8.71 | 0.864 | 0.974 | +| warp 60, V4 affine, three symbols | 0.502 | 3.60x | 8.16 | 0.856 | 0.977 | +| warp 60, range ceiling | 0.854 | | | | 0.995 | + +Every variant's transmittance equals the dense march's (max |dT| 0). No +variant's pre-pass proved a cell empty where any of the 225 samples per cell +was nonzero (0 enclosure violations). + +What this establishes: + +1. **The oracle cannot be reached by any sound bound.** The oracle mask + samples one depth per ray. A bound must cover the whole slice of the tile, + so the best any exact enclosure could do is about 0.86 of the oracle. That + matches the 0.57-0.85 that conservative visibility methods reach against + exact sets (`docs/research/culling-efficiency-oracle-prior-art.md`). An + oracle target of 0.90 is unreachable by construction. +2. **The warp diagnosis was half right.** At warp `D` most of the gap is the + warp enlarging the radius by its maximum (V0 to V2: 0.194 to 0.347). That + is fixed by evaluating the flow at the ball's centre and enlarging the + radius only by how far the flow can move across the ball. It takes no + affine noise, and it costs one more snoise per probe, for the second phase + ball. The detail octave's spurious warp (V1) is worth little on its own. +3. **Affine noise buys the rest:** the centred form, then the shared depth + symbol. Against the centred interval, affine with one symbol closes about a fifth + of the oracle gap at warp 0 and at warp `D` (efficiency 0.368 to 0.511 and + 0.347 to 0.477). Its combined cost ratio is 1.39x and 1.37x the centred + interval's, and 1.35x and 2.46x the landed interval's. It reaches 0.59 and + 0.56 of the range ceiling. +4. **Three symbols buy about 5% over one** (0.534 against 0.511, 0.502 + against 0.477). One symbol fits a `float3`. Three need a struct or a + `float4` plus a `float`, and the HLSL mirror's harness compares struct + returns but has no struct parameters (`packages/cultmath/docs/design.md:126-135`). +5. **The probe overhead falls** from 0.96 to 0.86 under every centred or + affine bound. Each probe costs a gradient and proves more, so the total + cost still drops by 1.35x to 2.46x. Today's (c) assertion, overhead at + least 0.90 (`NoiseBoundTests.cs:1558`, `:1588`), would reject the cheaper + march. That is question `affine-wells-contract`. + +### The model + +An affine form is a transient value, not a persistent kind. The persistent +things this pass adds or changes: + +| Thing | Identity | Lifecycle | Authority | +| --- | --- | --- | --- | +| `SNOISE_HESSIAN` (C#), `CULTMATH_SNOISE_HESSIAN` (HLSL, lowered to GLSL) | The constant's name; one value in `math.Affine.cs`, mirrored | Measured once by `NoiseBoundTests.MeasureHessian` (slow, explicit), as `SNOISE_LIPSCHITZ` is. It is re-measured and re-pinned whenever the `snoise` kernel changes. | `MeasureHessian` sets it; `HessianConstantPinsSampledCurvature` pins it; no consumer carries its own | +| `af_*` families in `fixtures/glsl-parity.json` | Family signature string, appended after the last existing family | Regenerated only by `CULTMATH_WRITE_GLSL=1`; earlier cases stay byte-identical | `GlslMirrorTests` generator | +| The (c) contracts | `IntervalSkipHalvesEvaluations` assertions | Changed only by a ruling | Operator (question `affine-wells-contract`) | +| `SNOISE2_LIPSCHITZ` (C#), mirrored in HLSL | The constant's name in `math.Interval.cs`, beside `SNOISE_LIPSCHITZ`, with an `iv_snoise_ball(float2, float)` overload | Measured by `MeasureLipschitz2` (slow, explicit) and pinned, as `L` is | CultMath. The (c) field's flow is `snoise(float2)`, and a bound on a CultMath function belongs to CultMath, not to a test-local helper. A consumer's own flow, such as the site's texture, keeps its own variation bound | + +### Representation + +**A reduced affine form with one shared symbol: `float3(x0, a, e)`, meaning +`x0 + a·ε + e·δ`.** Here `ε ∈ [-1, 1]` is shared by every form over the same +region, and `δ ∈ [-1, 1]` is a private error, with `e ≥ 0`. +- This is Messine's AF1 as Gamito and Maddock use it for gradient noise, + `t0 + t1 e1 + t2 e2`. +- Sharp and Jacobson's measurements show that this fixed-symbol form is the + fast one on GPUs: 1.0x against 8.4x for full affine. +- It fits one `float3` register, as an interval fits a `float2`. It needs no + struct parameter, so the mirror, lowering and fixture machinery take it + unchanged. +- V4 against V5 prices the two extra symbols at about 5% efficiency. + +For a tile probe `ε` is the depth parameter: `z = z_m + h ε` with +`h = (z1 - z0) / 2`. The footprint goes into the error. For a single ray it is +Gamito's form exactly. + +A point in space is not a new type. It is the three arguments +`(centre: float3, axis: float3, radius: float)`, the set +`{centre + axis ε + w : |w| ≤ radius}`. `af_snoise` and `af_fbm` take a point +in that form, and `af_frustum_axis` and `af_frustum_ball` produce one for a +tile slice. + +Ops, named by the (c) consumer, plus `af_mul` because affine arithmetic is +defined by its product, as `iv_mul` is for intervals: +- `af_point`, `af_symbol(x0, a)`, `af_from_iv`, `af_range` (the bridge to + `iv_*`); +- `af_add`, `af_sub`, `af_neg`, `af_scale`, `af_add_iv`, `af_mul`; +- `af_snoise`, `af_fbm`; +- `af_frustum_axis`, `af_frustum_ball`. + +No others until a consumer names one, which is the rule `design.md` already +states for intervals. + +The interval side gains `SNOISE2_LIPSCHITZ` and the overload +`iv_snoise_ball(float2, float)`. The (c) field's flow is `snoise(float2)`, and +centring the warp needs a bound on it, which belongs to its owner. + +`af_snoise(centre, axis, radius)` makes one `snoise_grad` call. With +`R = |axis| + radius`, it returns the narrower of two sound forms: +- the Lipschitz form `(n, 0, L R)`; +- the centred form `(n, g · axis, |g| radius + M R² / 2)`. + +`e` absorbs the op's own float rounding and an allowance for a GPU's gradient +error. The allowance is derived in the doc comment and measured on WebGL2 by +the fixture's enclosure check, as `iv_frustum_ball`'s is. + +The warp stays the consumer's, so CultMath owns no flow. The rule, stated in +`design.md` and tested for the (c) field: a warp whose value at the centre is +known, and whose variation over the ball is at most `ρ`, is enclosed by moving +the centre by `w(c)` and adding `ρ` to the radius. Interval balls benefit from +it too (V2). + +### Authority map + +- **Owner.** `src/CultMath/math.Affine.cs` owns affine-form semantics on the + CPU. `shaders/CultMath.Affine.hlsl` mirrors it bit for bit, and is the shader + semantic authority. `shaders/CultMath.glsl` is derived from the HLSL. +- **Inputs.** + - `snoise_grad`, whose `.w` is bit-equal to `snoise`; + - `SNOISE_LIPSCHITZ`; + - `SNOISE_HESSIAN`; + - the caller's forms and points. +- **Outputs.** `float3` forms, and `float2` intervals through `af_range`. +- **Derived state.** + - The GLSL text is generated by `GlslLowering`, unchanged. + - The fixture families are generated. + - The (c) efficiency rows are printed measurements, not state. +- **Forbidden writers.** + - A consumer linearising noise itself: the probe's V4 and V5 did this by + hand, and Hands must call `af_snoise`. + - A second curvature constant anywhere. + - Hand-edited `CultMath.glsl`. + - An affine or interval evaluator over `CultMath.Expr` (the parked tape's, + see collisions below). + - A flow or envelope function in CultMath. Consumers compose those, as for + intervals. +- **Shared paths.** The test field's `FogField`, the site ground and + Aetheria's nebula all reach affine noise through `af_snoise` or `af_fbm`, + and a tile slice through `af_frustum_*`. +- **Deletion line.** + - In `FogField.Bound` (`NoiseBoundTests.cs:875`), the warp-enlarged ball is + replaced by the centred warp, and the detail ball stops carrying the warp + (`:890`). + - The (c) probe-overhead assertion (`:1558`, `:1588`) is replaced as the + ruling on `affine-wells-contract` says. + - `design.md`'s "What they do not: ... affine forms" (`:584-587`) and "That + gap belongs to the tape target's affine forms" (`:623-624`) are rewritten. + - The tape target's open item on representation is closed. + +### Cut order + +1. **`affine-forms`, the one she can see.** + - It adds C# `math.Affine.cs` and `AffineTests`, plus `SNOISE_HESSIAN`'s + provenance. + - The (c) field gains the centred warp and the affine bound. + - (c) is re-measured with three bound rows on the same tiles: landed + interval, centred interval, affine. The range ceiling is printed beside + the oracle. + - An explicit, env-gated test writes a cull-map PNG of one (c) frame: dense + cells per ray for each bound, and the transmittance. Self publishes it. + - `design.md` is updated. + - It is blocked on `affine-wells-contract` only for the assertion's shape. +2. **`affine-shaders`.** + - It adds `CultMath.Affine.hlsl` and its Unity copy and `.meta`, the + include, and the regenerated `CultMath.glsl`. + - Fixture families are appended, with an enclosure check for `af_snoise` + and `af_frustum_ball`. + - The dxc and glslang compiles and the WebGL2 golden-fixture run happen on + Starfire. + - Both cuts share the branch `hands/cultmath-affine-forms` and merge + together after cut 2's Soul pass. Main never carries a C#-only `af_*`, so + three-runtimes-agree holds at every merged commit. + +Writing the C# before the HLSL inverts the usual order, because HLSL is the +semantic authority. The cost is small: the ops are plain arithmetic in the +common subset. Cut 2 changes the C# if the HLSL dialect forces something, +never the reverse. + +### Verification venue + +Heavy work runs on Yggdrasil through the stopgap: `dotnet test`, Stryker scoped +to `math.Affine.cs`, the (c) re-measure and the cull-map render. Starfire runs +only the Windows and GPU legs, one job at a time: +- `dxc -T lib_6_3 -HV 2021` on `CultMath.hlsl`; +- `glslangValidator` 16.6.0 on the lowered GLSL (ruling + `operator-compiler-downloads`); +- the WebGL2 golden-fixture run on the GTX 1070, under ANGLE D3D11 in a + browser. It is seeded from the glsl-lowering Soul pass's `gpu.js` + (follow-up `glsl-browser-parity-run`). + +### Collisions + +- **`cycles-converters` r1** edits the same seams: + - the include list (`CultMath.hlsl:509-510`); + - `HlslMirrorTests.cs:64-67`; + - `build-unity-package.ps1:82-87`; + - the fixture's family list. + + Whichever merges second rebases, regenerates `CultMath.glsl` and the fixture + (`CULTMATH_WRITE_GLSL=1`), and appends its families after the first's. + Nothing semantic collides. +- **`expr-ir` r1 and question `material-ir-in-cultmath`.** No file collides, + and neither cut waits on the other. + - Under `cultmath-ir-now`, the parked tape's step 2 will add interval and + affine evaluators over `ExprGraph`, and those will call `iv_*` and `af_*` + as op semantics. That is one more reason the affine ops are plain value + functions over `float3`, with no struct state. + - Under `aetheria-local`, nothing here changes. + - The `expr-ir` spec's negative check forbids `Interval(Evaluator)?` under + `Expr`. Self may add `Affine` to it at its next revision. +- **`site-ground` r3** (not dispatched): the void (e) and the site's flow + texture are not measured here. Follow-up `site-ground-affine-and-centred-warp` + carries both. Centring the warp in the site needs a bound on the flow + texture's variation, and the texture stays the one motion owner (it is + sampled at the centre, never re-derived). + +### Pass 5b: the deep well (ruling `wells-scale-order-of-magnitude`) + +The operator's words: "There should be a well pushing down with both a radius +and depth an order of magnitude larger than the span of the bit that's +expensive to sample, the fog gradient, otherwise there's no meaningful skipping +being measured". + +**Her diagnosis holds.** The expensive band is the stretch of the +pre-distortion height `s` where only the noise decides whether there is +density. +- `FogField` has `F = -20` and `A = 20`, and the noise reaches ±1.5. With the + fade at 1, a slice is provably empty only where `s >= F + 1.5 A = 10`. +- It is dense whatever the noise does where `s < F - 1.5 A = -50`. +- So the band is `G = 60` units. + +Today's (c) wells, from `NoiseBoundTests.cs:753-776`: +- **Depths** are `d = 30 M^0.175`: 67, 101, 150 and 101. That is 1.1 to 2.5 + times `G`. +- **Half-depth radii** are about `0.103 x 500 M^0.25` for a `PowerPulse` + exponent of 16: 163, 290, 515 and 290. That is 2.7 to 8.6 times `G`. +- **The zone bowl** is 64 deep, 1.07 times `G`. + +No well is ten times `G` deep. The camera sits just above the band +(`y = max(0, S + 10 - h)`) and grazes it, so most of the measured cost is the +band itself, and little of it is empty space. + +**The probe.** The probe added a field, `(c') deep well`, on the scratch +branch at `bf0148b8`: +- the zone bowl plus one well at its centre, with depth 600 and half-depth + radius 600 (`PowerPulse` exponent 2, scale 2220), so each is `10 G`; +- the camera's xz within 300 of the centre, at `y = F - h / 2`, halfway + between the sunken fog surface and the rim; +- slopes as (c), `m_y` in [-0.25, 0.1]. + +A level ray crosses about 600 units of empty well before the wall, and the +band there is about 73 units along the ray. The run used the same run +parameters, seeds and constants as Pass 5, on Yggdrasil. + +| `N = 8` | efficiency vs oracle | cost ratio | dense cells/ray | probe overhead | cull | +| --- | --- | --- | --- | --- | --- | +| deep well, warp 0, landed interval | 0.591 | 3.10x | 4.14 | 0.943 | 0.986 | +| deep well, warp 0, centred interval | 0.579 | 3.04x | 4.14 | 0.924 | 0.986 | +| deep well, warp 0, affine (one symbol) | **0.662** | **3.47x** | 3.27 | 0.879 | 0.993 | +| deep well, warp 0, range ceiling | 0.859 | (oracle ceiling 5.24x) | | | 0.997 | +| deep well, warp 60, landed interval | 0.462 | 2.45x | 6.58 | 0.970 | 0.967 | +| deep well, warp 60, centred interval | 0.555 | 2.95x | 4.34 | 0.926 | 0.984 | +| deep well, warp 60, affine (one symbol) | **0.644** | **3.42x** | 3.33 | 0.880 | 0.992 | +| deep well, warp 60, range ceiling | 0.848 | (oracle ceiling 5.31x) | | | 0.996 | + +There were no enclosure violations, and transmittance equals the dense march +in every row. + +What changes: +- Where the empty space is real, the interval march already skips most of it. + It reaches 0.59 at warp 0, and 0.46, or 0.56 with the warp centred, at warp + `D`. +- Affine's gain over the centred interval shrinks to 1.14x and 1.16x in + combined cost, against 1.39x and 1.37x on the band-dominated wells. +- Against the landed interval it is 1.12x and 1.40x. +- Affine reaches 0.77 and 0.76 of the range ceiling. What it wins is in the + wall's band, which is where the shallow wells spend everything. +- Probe overhead is 0.88 in both rows, still under the 0.90 rule. + +Decision for the cut (`affine-forms` r2): **(c) becomes the deep well, which +carries the contract.** The four mass-derived wells are kept as a printed row, +`(c-band)`. They are not the skipping measurement the ruling asks for, but they +are Aetheria's own geometry and the band-dominated case, where affine gains +most. Dropping them would hide where affine pays. The cull-map image renders a +deep-well camera at warp `D`. + +The contract question is re-asked against these numbers as +`cultmath-tapes:question:affine-wells-contract-r2`. The first question was +withdrawn in its favour, and `affine-forms` r2 supersedes r1. + +## Pass 6: the snoise diagonal tie (finding `snoise-diagonal-tie-discontinuity`) + +Soul's affine pass found that `snoise(float3)` and `snoise_grad` jump by up to +0.72 where the three components of `x0` compare equal +(`cultmath-tapes:finding:cut-affine-forms.s1.snoise-diagonal-tie-discontinuity`). +The defect predates every cut in this campaign. It came with the Ashima kernel +and survived the 0.3.0 kernel change. The cut is +`cultmath-tapes:cut_spec:cut-snoise-tie.r1`. + +### Mechanism (probed) + +`g = step(x0.yzx, x0.xyz)` makes three pairwise comparisons, all non-strict: x +wins its tie with y, y wins its tie with z, and z wins its tie with x. That is a +cycle, not an order. When all three components are equal, `g = (1,1,1)`, so +`i1 = (0,0,0)` and `i2 = (1,1,1)`, and the four corners are not a simplex. + +- Corner 1 is then the origin vertex again, with the offset `x0 + 1/6`. Near a + lattice vertex that offset is short (`|x1|^2 = 1/12`), so the origin's + gradient is counted a second time. +- The tie set is the union of the lattice diagonals `v + s(1,1,1)`. It has + measure zero in space, but consumers sample it. Every point `(t, t, t)` lies + on it exactly in float32, for every `t`, because the three components are + computed identically. So does the origin: `snoise(0,0,0)` returns -0.4358730, + where the correct value is 0. `HlslSemanticsTests.cs:447` pins the wrong + value as golden. A consumer that samples `snoise(float3(t))` or + `cultmath_snoise(t.xxx)` reads a different function along the whole line. +- With the 0.5 kernel, a lattice vertex outside the four summed corners never + contributes on a face, because its squared distance from the face is at + least 0.5. So any total order of the three comparisons gives the same exact + value on every tie. The fix only has to make the comparisons an order; which + order it picks does not matter. + +### Prior art + +- Gustavson's reference C, `simplexnoise1234.c`, picks the 3D simplex with an + if-chain on `x0>=y0`, `y0>=z0` and `x0>=z0` and their complements. Ties go x + over y, y over z and x over z: a total order. +- Gustavson and McEwan's later `psrdnoise3.glsl` (JCGT 2022) replaces Ashima's + line with `step(f0.xyx, f0.yzz)` and a re-pairing. Its comment says ties + resolve "in priority order": also a total order, z over y over x. +- Upstream `webgl-noise` `noise3D.glsl` still has the cyclic `step`. Soul found + no fix in its issues or its git history (`log -S` on the line). + +**The fix** makes one comparison strict, z against x: +`g = (step(x0.y, x0.x), step(x0.z, x0.y), 1 - step(x0.z, x0.x))`. Ties then go +x over y, y over z and x over z, which is exactly `simplexnoise1234`'s order. +The probe's double-precision reference uses that if-chain verbatim, and the +patched float kernel agrees with it to within float noise. + +Other total orders are equivalent mutants: one strict compare placed on x, or +two strict compares. Only two spellings are degenerate, all-strict and today's +all-non-strict, and the cut's test kills both. + +### What the probes measured + +Both jobs ran on Yggdrasil, on main `a7966142` and on the affine head +`4ae986a5`. Each patched C# and both HLSL copies in the container, and +regenerated GLSL and the fixture. + +| Probe | Old rule | Strict-z rule | +| --- | --- | --- | +| Random points, \|p\| <= 4, 256, 4096 (1e6 each): old and new bit-equal | | 1e6 of 1e6 at every scale | +| Random points, \|p\| <= 65536 (1e6) | | 23 differ, each on an exact z = x tie, at ulp level | +| Lattice-diagonal points and their +-2 ulp neighbourhoods, \|I\| <= 8, 64, 512, 4096 (500k each, about 10.5k exact triple ties each): max \|f32 - ref64\| | 0.772, 0.768, 0.775, 0.774 | 2.9e-6, 2.2e-5, 1.8e-4, 1.6e-3 (float32 at that magnitude) | +| Pairwise faces x0 = (a,a,b) and permutations (108k), \|I\| <= 8 / 512 | 2.5e-6 / 1.3e-4 | the same | +| Jump inside a 1e-4 ball at Soul's five witnesses | 0.21 to 0.72 | 0.0016 to 0.0018 (smooth bound 7.6 x 2 sqrt3 x 1e-4 = 0.0026) | +| Soul's vertex scan, worst jump, \|L\| <= 8, 32, 128 | 0.72, 0.65, 0.65 | 3.7e-4, 1.5e-3, 5.7e-3; 0 of 400 beyond the smooth bound at every scale | +| `af_snoise` around the old Lipschitz spike (2000 forms x 21 points) | 926 misses, worst 38 e | 0 misses, worst -0.72 e | +| `MeasureLipschitz` (seed 0x11B5) | refined 9.181147, L = 10.099261 | refined 7.2400064, x 1.10 = **7.9640074**, witness (229.92526, 73.37927, -66.14595) | +| `MeasureHessian` (affine head) | 50.954895, giving 56.050385 | unchanged, same witness | +| `snoise_grad(p).w == snoise(p)` in a 1e-4 ball about the old witness | | 0 mismatches | + +The full suite passes once four things change together: the tie fix, `L` +re-pinned, the witness moved, and the origin golden set to 0. It passes +288 of 288 on main and 300 of 300 on the affine head. + +With only the tie fix and nothing re-pinned, exactly two tests fail: + +- `LipschitzConstantPinsSampledGradients`, the ratio pin, failing as + designed; +- the origin golden. + +`HlslSourceCompatibilityTests` passes. Its special values include all-equal +triples, so it pins the HLSL tie rule bit for bit against C#. + +Fixture bytes: + +- The tie fix alone changes no fixture case. The 256 random points per family + never land on a tie. +- Re-pinning `L` changes 41 cases, all in `iv_snoise_ball(vec3)` and + `iv_fbm_ball`. These are the cases whose bound is not clamped to `[-1, 1]`. +- Every other family is byte-identical. +- `CultMath.glsl` changes 3 lines: the two tie lines and the constant. + +### What follows + +- **`SNOISE_LIPSCHITZ` narrows by 21%,** from 10.099261 to 7.9640074. Every + Lipschitz-form bound narrows with it: `iv_snoise_ball`, `iv_fbm_ball`, the + Lipschitz form inside `af_snoise`, and the march's skipping. + - The (c) rows in Passes 5 and 5b were measured at the old `L`. They are + conservative, not wrong. The affine branch re-measures them after it + merges main. + - `SNOISE_HESSIAN` does not move. +- **Release.** `math.snoise` returns different values on the tie set, which + includes the origin and every `(t, t, t)`, points ordinary consumers sample. + - The precedent is `asura:ruling:qn1-snoise-upstream`: a public snoise value + change ships as a minor bump while the package is below 1.0, filed under + Breaking. So the next `cultmath-unity` release after this cut is 0.4.0, + not 0.3.x. + - The intervals and `L` were never released (`cultmath-unity-v0.3.0` + predates `math.Interval.cs`), so re-pinning `L` is not a release change. + - The release is not part of this cut. Follow-up + `cultmath-tapes:follow_up:snoise-tie-release` carries it, together with + Aetheria's pin bump to that release. +- **Consumers.** + - gamecult-site vendors no CultMath GLSL yet, because `site-ground` has not + landed. It gets the fixed GLSL when it does. + - Aetheria pins 0.2.4, the old 0.6 kernel, which has the same cyclic `step` + line. Its pin bump (`asura:follow_up:aetheria-snoise-pin-bump`) should + target the release that carries this cut. + - No other runtime under `packages/` (Rust, TS, Python) carries snoise. + +### Merge order + +1. `snoise-tie` branches from main `a7966142` as + `hands/cultmath-snoise-tie`. It gets its own Soul gate and merges to main + first: it is small, independent, and fixes a defect in released code. Its + two fixture families go after `phacelle`. +2. `hands/cultmath-affine-forms` then merges main with a merge commit. It never + rebases, because the branch is shared. The job's edits to + `math.Interval.cs`, `NoiseBoundTests.cs` and `design.md` applied cleanly to + the affine head. The affine fix batch's (c) re-measure and the affine Soul + pass run on the merged tree, so they see the new `L`. +3. `affine-shaders` is revised to r2, which supersedes r1. It depends on + `snoise-tie` and starts from the merged tree, so its `af_*` families are + appended after the tie families, and its device enclosure checks run on the + fixed `cultmath_snoise_grad`. Nothing else in it changes. + +## As built: the affine and tie cuts on main (Modeling, 2026-10-04) + +Body map against CultLib `main` at `14568bf9`, after `48aadda0` (snoise tie) +and `156782da` (affine forms, merged as `hands/cultmath-affine-forms`). It +records what the Body is, not what Passes 5, 5b and 6 intended. Where it +disagrees with those passes, this section wins; where it disagrees with the +Body, the Body wins. Cut reports live in the eureka-state mind under +`cultmath-tapes`: `cut-snoise-tie.h2`, `cut-affine-forms.h1-h3`, +`cut-affine-shaders.h1-h3`. + +### Pieces and owners + +Paths are under `packages/cultmath/`. + +| Piece | Path | Owner | Role | +| --- | --- | --- | --- | +| Snoise kernel | `src/CultMath/math.cs` (`snoise`, `snoise_grad`) | library, C# | Ties in `x0` break in Gustavson order (x over y, y over z, x over z), a total order. Mirrored in `shaders/CultMath.hlsl` and the Unity copy. | +| Lipschitz constant | `math.Interval.cs` `SNOISE_LIPSCHITZ = 7.9640074f`; `CultMath.Interval.hlsl`; generated GLSL | library | Derived from the kernel by `NoiseBoundTests.MeasureLipschitz` (seed 0x11B5): refined 7.2400064 x 1.10. A kernel change re-pins it. | +| Hessian constant | `math.Affine.cs` `SNOISE_HESSIAN = 56.050385f` | library | Unchanged by the tie cut. Provenance in `design.md` "Affine forms". | +| Affine ops | `math.Affine.cs`: `af_point`, `af_symbol`, `af_from_iv`, `af_range`, `af_add`, `af_sub`, `af_neg`, `af_scale`, `af_add_iv`, `af_mul`, `af_snoise`, `af_fbm`, `af_frustum_axis`, `af_frustum_ball`; plus 2D `iv_snoise_ball(float2, float)` in `math.Interval.cs` | library, C# | Plain value functions over `float3` (centre, coefficient of the one shared symbol, radius of the independent remainder). No struct state, no `Expr` coupling. | +| Affine HLSL | `shaders/CultMath.Affine.hlsl`, byte-identical `unity/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl` | library | `cultmath_`-prefixed bit-for-bit mirror of `math.Affine.cs`. | +| GLSL | `shaders/CultMath.glsl` (and `CultMath.Phacelle.glsl`) | derived | Generated by `GlslLowering` (test project) from the HLSL files. | +| Fixture | `tests/CultMath.Tests/fixtures/glsl-parity.json` | derived | Generated by `GlslMirrorTests.GoldenFixtureMatchesCSharp`. Families: the earlier ones, the tie families (after `phacelle`), `iv_snoise_ball` for vec3 and vec2, every `af_*`, and small-reach `af_snoise` and `af_fbm` families that exercise the centred branch. | +| Test harness | `tests/CultMath.Tests/AffineTests.cs`, `NoiseBoundTests.cs`, `GlslMirrorTests.cs`, `HlslMirrorTests.cs`, `NoiseGradTests.cs` | test project | `FogField` (with `DeepWell`, `Wells`, `InsideFog`, `AetheriaWarp`), `NoiseArg`, `AffineSlice`, `BoundMode` and the gates live here, not in the library. They stand in for the site ground and Aetheria. | +| Explicit measurements | `NoiseBoundTests` `[Fact(Explicit = true)]` facts: the (c) rows and `DeepWellCullMap` (PNG into the directory named by `CULTMATH_WRITE_CULLMAP`) | test project | Printed measurements, not state. Their numbers are copied into `design.md` by hand. | + +### Inputs and outputs + +- `af_snoise(centre, axis, radius)` takes the noise argument as a centre, the + direction of the one shared symbol and a ball radius. It reads `snoise_grad` + (`.w` equals `snoise` bitwise), `SNOISE_LIPSCHITZ` and `SNOISE_HESSIAN`, and + returns a `float3` form: the Lipschitz form or the centred Taylor form, + whichever is narrower (`design.md` "Affine forms"). `af_fbm` composes it per + octave. `af_range` turns a form into a `float2` interval and finds a NaN + endpoint by bit pattern, because dxc's fast-math compare folds `x != x`. +- `af_frustum_axis` and `af_frustum_ball` build the symbol and ball for a tile + slice of the view frustum. A consumer rotates and translates the centre into + world space and scales by its frequencies. +- Interval consumers keep `iv_*`; the two representations meet at `af_from_iv` + and `af_range`. + +### Derived state and forbidden writers + +- `CultMath.glsl`, `CultMath.Phacelle.glsl` and `glsl-parity.json` are never + hand-edited. The only writer is `CULTMATH_WRITE_GLSL=1 dotnet test --filter + GlslMirrorTests` from `packages/cultmath/tests/CultMath.Tests`. The tests + compare committed text with the lowering and committed families with C#'s + current output, so a hand edit fails them. +- `unity/.../Shaders/CultMath*.hlsl` is a copy. + `HlslMirrorTests.UnityPackageShaderIsIdenticalToTheCanonicalShader` pins byte + identity per file (`Interval` and `Affine` among them). Edit `shaders/` only. +- `SNOISE_LIPSCHITZ` is written in three places (C#, Interval HLSL, generated + GLSL) and re-pinned only by running `MeasureLipschitz`. `SNOISE_HESSIAN` has + one definition in C# and one in `CultMath.Affine.hlsl`. +- Forbidden: a consumer linearising noise itself, a second curvature constant, + an evaluator over `CultMath.Expr`, a flow or envelope function in CultMath. +- Shared paths a cut touches: the include list in `CultMath.hlsl`, + `HlslMirrorTests` InlineData, `scripts/build-unity-package.ps1`'s file list, + and the fixture's family list. A cut that adds families appends after the + previous cut's and regenerates. + +### The mirror chain + +C# (`math.cs`, `math.Interval.cs`, `math.Affine.cs`) -> HLSL (`shaders/`, Unity +copy byte-identical) -> GLSL ES 3.00 (generated by `GlslLowering`) -> fixture +(generated from C#). A change starts in C#; the HLSL follows bit for bit; the +GLSL and fixture are regenerated. `HlslMirrorTests` sweeps C# against the HLSL +semantics on the CPU, including `af_snoise`'s centred branch on both sides of +the choice. The tie fix landed in C#, `CultMath.hlsl`, the Unity copy and the +regenerated GLSL in one merge. + +### Verification layer + +- Yggdrasil (CPU, through the stopgap): `dotnet test` of `CultMath.Tests` + (mirror, GLSL golden-fixture comparison, `AffineTests`, the `NoiseBoundTests` + gates, `NoiseGradTests.SnoiseIsContinuousOnTheSimplexDiagonal`), Stryker + scoped to `math.Affine.cs`, and the explicit (c) and deep-well re-measures. +- Starfire (Windows and GPU, one job at a time): `tools/compile-glsl.ps1` + (glslangValidator), the dxc `lib_6_3 -HV 2021` compile of the HLSL, and the + WebGL2 golden-fixture run on the GTX 1070 under ANGLE D3D11. The device run + checks `af_snoise`, `af_fbm` and `af_frustum_ball` for enclosure against the + device's own noise (`design.md`, GLSL target). The device runner is not in the + repository. Follow-up `affine-device-runner-seed` carries it; until it lands + the device leg is a Starfire-local procedure, not a repeatable test, and + `glsl-browser-parity-run` stays open. + +### Release state + +- `unity/org.gamecult.cultmath/package.json` is 0.3.0 and `CHANGELOG.md` has no + unreleased section. The snoise value change on the tie set (the origin and + every `(t, t, t)`) is Breaking by the `qn1-snoise-upstream` precedent, so the + next release is 0.4.0. Follow-up `snoise-tie-release` carries the version + bump, the changelog entry (Breaking: snoise; Added: `iv_*`, `af_*`, the two + HLSL files and the GLSL library) and Aetheria's pin bump. +- Aetheria pins 0.2.4 (the 0.6 kernel with the cyclic `step`). gamecult-site + vendors no CultMath GLSL yet. +- `SNOISE_LIPSCHITZ` and the intervals were never released, so re-pinning `L` + is not itself a release event. + +### Stale docs and state found (not edited) + +- This file's header status line says "pass 4" and pins `c49c76ee`; Pass 5's + pin is `a7966142`. Neither is the as-built head. +- The (d) row near line 529 ("ceiling at `L = 10.099261`") and Pass 5's "`L = + 10.10`" (near line 1037) are measurements at the old `L`, now 7.9640074. Pass 6 + says they are conservative; the numbers are not re-printed. +- Pass 5 "Cut order" reads as future work and Pass 6 "Merge order" lists the + merge as pending. Both merged. Pass 5's deletion line cites + `NoiseBoundTests.cs` line numbers that have moved. +- `docs/cultmath-tape-target.md`: the header "Status: **parked**" (line 3) and + "The operator parked (c)" (line 54) say nothing of affine; only the "Open + before unparking" item (lines 109-112) records that affine forms were + unparked, and nothing records them as built. The interval-or-affine + representation question is closed: both exist. Tape steps 2-5 remain parked. +- `docs/cultmath-interval-ground-cut-interval-ops*.spec.json` (r1-r3) pin + `SNOISE_LIPSCHITZ` "untouched" and cite 10.099261 as provenance. They are spec + history, superseded by the constant in `math.Interval.cs`. +- `unity/org.gamecult.cultmath/CHANGELOG.md` has no entry for the tie change, + intervals or affine forms. +- The `0.77` in `packages/cultmath/docs/design.md:376` and `NoiseGradTests.cs:195` + is the upstream tie jump and is accurate; it is a different 0.77 from the + range-ceiling ratio at line 1347 of this file. + +## Pass 7: the tape unparks (ruling `tape-unparked-for-trophic-graphs`) + +Written by Imagination (agent `imagination-tape-unpark`, session +`self-2026-10-14-eureka`) against CultLib `origin/main` `9ec66d77`. The operator, +2026-10-14: "Unpark the tape". Her choice (`aetheria-fauna:ruling:trophic-graph-tape-ruled`) +scopes tape steps 2 and 4 of `docs/cultmath-tape-target.md`: a graph document, a +C# evaluator and an HLSL interpreter. Pruning (step 3) and meshing (step 5) stay +where the target sequences them. The first consumer is Aetheria's trophic +placement graph (`aetheria-fauna:target:r4`; Aetheria map section r4 at +`4354ef2c`, rows B28-B36). `aetheria-fauna:ruling:skein-filament-construction-ruled` +picked `skein-web`, so fauna needs all five CultMath gaps that section names. + +The as-built forbidden writer "an evaluator over `CultMath.Expr`" (Pass 5 and +the as-built section above) is lifted for the point evaluator and the HLSL +interpreter only. Interval and affine evaluation over the graph belong to pruning +and stay parked. + +### Body facts (Pass 7) + +| # | Question | Result | +|---|---|---| +| T1 | Does `CultMath.Expr` exist? | No. `git log --all -S "CultMath.Expr"` in CultLib finds only two map commits (`32ba1bfa`, `4b34b12b`); in Aetheria, nothing. `packages/cultmath/src/CultMath/` has no `Expr` folder. It exists as ruling `material-ir-cultmath-now` and spec `cut-expr-ir.r1` (base `a7966142`), which no report cites. | +| T2 | Is the material consumer that shaped `expr-ir` r1 live? | Not now. `aetheria-release:ruling:demo-material-scope` (2026-10-06): demo hulls ship baked maps, "the material graph comes after the demo". The cones, frontiers and HLSL emitter of r1 served incremental per-ship bakes (`materials-baked-per-ship-incremental`) and generated kernels (`material-mod-graphs-same-lowering`). | +| T3 | Does `expr-ir` need `cycles-converters`? | Only for `cycles_*` ops. The trophic graph uses none (Aetheria `trophic_probe.py` at `4354ef2c`: arithmetic, smoothstep, exp, hypot, floor, sin, hashing, Voronoi, segment distance). | +| T4 | Who owns CultMath values' wire shape? | `GameCult.Caching.MessagePack`: `CultMathResolver` is the canonical MessagePack shape of every public CultMath value type, in the default chain (`CultDocumentMessagePackSerialization.cs:61`). CultMath references nothing (`CultMath.asmdef` `references: []`). | +| T5 | What do the coverage tests demand of a new public type? | `CultMathSerializationTests.cs:187-196` and `CultMathJsonTests.cs:93-99,210-218`: every exported non-enum struct in the CultMath assembly has a MessagePack formatter, a JSON converter and a dictionary-key round trip, and `CultMathResolver` formats nothing else. A public struct in `CultMath.Expr` would have to be formatted; a class or enum is not covered, and `CultMathResolver` must not list a class. | +| T6 | Can the HLSL mirror cover `out` parameters or buffers? | No. `HlslSourceCompatibilityTests.cs:120-131` builds each argument with `Activator.CreateInstance` over the parameter type, which a by-ref type refuses; `design.md:96-99` drops functions taking GPU resources. So an HLSL twin of `distance_to_segment` needs an `out`-free overload, and the interpreter's buffer reads are outside the mirror. | +| T7 | What does the trophic graph need beyond scalar ops? | (a) Stencils: a predator is a mean over 8 taps of its prey at offset positions (`stencil`, B36); in a graph that is input substitution, as Fidget's `remap_xyz`. (b) Site spans: the slack layer and the strands read every well (`well_slack`, `pairs`, `strands`): a per-batch array input. (c) A per-site weight: the lattice node raises each cell's weight by its proximity to the wells (`lattice_web`, `prox`), a function evaluated at the site, not at the query point. | + +### The model (SKILL step 0b) + +| Kind | What names it | What happens to it over time | Who decides | +|---|---|---|---| +| Expression graph (`ExprGraph`, a sealed immutable class) | Nothing of its own: it is a value. The consumer record that holds it names it (an Aetheria species record's key). Its content hash is derived, for caches only. | Built by the builder or decoded; validated on both paths by one validator; never mutated. An edit builds a new graph. The persisted shape carries a format version; a graph naming an unknown op, a newer format, or a forward operand is refused whole at decode, never partly loaded. | `CultMath.Expr` owns shape, validation and op vocabulary. `GameCult.Caching.MessagePack` owns the wire shape (`CultMathExprResolver`, beside `CultMathResolver`: T4). The consumer's store owns the record, its key and when it changes. Sub-graph references are the consumer store's and are inlined before Build, so the graph stays flat (precedent `aetheria-release:ruling:material-graph-home-modular`). | +| Node | Its index in the graph's topological order; an operand references only a lower index. | Exists only inside one graph value; any rebuild may renumber it. The builder hash-conses identical nodes and drops nodes no output reaches, so one expression always builds to one byte string. An editor that needs stable node ids keeps its own map. | The builder. | +| Port | Input ports: the operand positions of the op's signature in the op table. Output: a node is one scalar; a multi-result op (cellular's fields) is read only through `Pick(node, k)` nodes and evaluated once. Graph ports: named inputs (vary per point: position, time), named params (uniform per batch, each with a default), named outputs; names unique per kind, `[A-Za-z_][A-Za-z0-9_]*`. | Graph port names are the graph's contract; renaming one makes a new graph. | The author, through the builder; the evaluator binds names to indices once per bind. | +| Op vocabulary | A stable string per op: the CultMath function's name, with an arity suffix where overloads differ (`snoise2`, `snoise3`). Written into persisted graphs. | Append-only. A released op's meaning follows its CultMath function under semver (a value change, as the snoise tie, is a Breaking release note); removing an op is a major bump. | `CultMath.Expr`: one op table, read by the C# evaluator and later by the bytecode lowering. No second table. | +| Parameter set (bindings) | The consumer's record (fauna: per-species settings); inside it, param name to value. | Edited freely by the consumer. At bind, a missing name takes the graph's default; an unknown name is refused, typed. CultMath persists no parameter-set type. | The consumer's store. | +| Site span (input kind) | A span-input name in the graph. | Bound per evaluation batch by the caller (wells per tick); never persisted in the graph. C#: `ReadOnlySpan`; HLSL: `StructuredBuffer` plus a count. Read only by span-taking ops; no op produces one. Lands with `expr-trophic-ops` as an append-only format addition. | The caller binds the content; `CultMath.Expr` owns the kind. | +| Bytecode (the lowered tape) | (graph content hash, bytecode format version). | Derived on demand, cache-only; never stored as truth or shipped as a document; rebuilt when the graph or CultMath changes. | `CultMath.Expr`'s lowering (the interpreter cut). Its register model is question `tape-register-model`. | +| HLSL interpreter source (`shaders/CultMath.Tape.hlsl`) | The file, versioned by the CultMath release tag; it declares the bytecode format version it reads. | Changes only in releases under semver; a format change bumps the version and the lowering together. Copied byte-identical into the Unity package (`UnityPackageShaderIsIdenticalToTheCanonicalShader`). | CultMath. | +| Compiled HLSL artifact | Under the interpreter there is no per-graph compiled HLSL. The one compiled artifact is the consumer's compute kernel that includes `CultMath.Tape.hlsl`, named by the consumer's build. | Compiled by the consumer's build (Unity), never generated per graph. Per-graph generated kernels (the r1 emitter) return only with the material line, as a derived artifact pinned against the C# evaluator. | The consumer's build; CultMath owns only the included source. | +| Evaluation results | Derived. | Cache-only, the consumer's. | The consumer. | + +Gap (5) of the fauna map, "CultMath-owned parity for a consumer's combined HLSL", +changes shape under the tape: a consumer's composition is a graph, not HLSL, so +the parity CultMath owns is graph parity, the C# evaluator against the HLSL +interpreter on the consumer's own graph. That harness belongs to the interpreter +cut. `aetheria-fauna:follow_up:flow-parity-under-cultmath` (FlowField's `Tri3D`) +resolves the same way: `Tri3D` becomes a CultMath function and op, with no +Aetheria twin. + +### Decisions (defaults, not forks) + +- **`CultMath.Expr` is the tape's graph; there is one IR.** `expr-ir` r1 is + superseded by r2, the first tape cut, under the same label: ruling + `material-ir-cultmath-now` names the owner and the scalar SSA shape, and the + tape ruling consumes that graph. r2 drops what only the material line used + (cones, frontiers, the HLSL emitter: T2) and the `cycles-converters` + dependency (T3). Those return as lines when their consumers do. +- **Scalar SSA**, as ruled: vector arguments are decomposed operands, and + multi-result ops are read through `Pick`. Fidget's tapes are scalar too. +- **The graph is a class; its wire shape is a resolver beside `CultMathResolver`** + (T4, T5). CultMath stays reference-free and the coverage tests stay as they + are. No JSON shape in the first cut (JSON is debug and xenos export). +- **Stencils are substitution at build time** (T7a), not a loop in the tape. + Each stencil level multiplies the graph by its tap count, as B36 measured. +- **`cycles-noise` r1 is withdrawn**: base `a7966142`, it waits on the + `cycles-converters` merge and is not on this session's frontier. It is a line + below. + +### Questions (admitted in the mind) + +- `tape-register-model`: the HLSL interpreter's register model. Ruled + `tape-register-model-ruled` (groupshared registers). +- `lattice-site-weight-source`: how a weighted lattice node gets a per-site + weight (T7c). Re-asked as `lattice-weight-from-bodies` and ruled + `lattice-weight-from-bodies-ruled` (node-reads-bodies). +- `lattice-window-sound-or-measured` (from section "lattice-weighted-cellular"): + a proven ring search or a fixed measured 7x7 window. Ruled + `lattice-ring-exit-sound` (ring by ring until no farther cell can win). + +Prior art in hand: `F:\Projects\aetheria-material-path-prior-art.md` section 4 +(GPU interpreters: Fidget's crates, Dolphin ubershaders, Laine et al. on +megakernel register pressure; no measured interpreter-versus-kernel timing was +found) and section 6 (IR placement); Aetheria +`docs/research/2026-10-14-trophic-dag-filaments-prior-art.md` (Voronoi, +filaments). Neither covers a GPU tape interpreter's register storage (dynamic +indexing of local arrays and scratch spill, groupshared memory, Fidget-wgpu's +`tape_interpreter.wgsl`, Keeter's MPR 2020) or per-site weight fields in +lattice Voronoi. Both questions have since been ruled. + +### Cut sequence (Pass 7; one line each, mapped when about to run) + +Fauna's first cut, `fauna-trophic-habitat`, evaluates the habitat graph in C# at +candidates. It needs `expr-ir` r2, gaps (2) and (4) with (3) under the strands, +gap (1), and their ops registered (line 5). It does not need the interpreter or +gap (5); its presenter does. Lines 1 and 3 and `cycles-converters` are on +main (`911fc755`). The critical path is line 4a, after the ruling on +`lattice-window-sound-or-measured`, then line 5. Line 4b, the shader twins, +is not on the path to fauna's first cut; it is on the path to fauna's presenter, +with line 6. + +1. `expr-ir` r2 (spec admitted): the graph, builder with substitution, decode + validation, wire shape, C# evaluator. Touches no file `cycles-converters` + touches (new `Expr` folder, `GameCult.Caching.MessagePack`), so it runs on + `origin/main` now and does not wait on that merge. +2. (No sibling spec.) Gap (3) alone was the candidate. It and every node cut + append GLSL fixture families, bump the mirror's compared count and edit + `CultMath.hlsl`, and so does `cycles-converters` (`53f4c213`: + `GlslMirrorTests.cs`, `HlslSourceCompatibilityTests.cs`, `glsl-parity.json`, + `CultMath.hlsl`). Families append after the previous cut's, so these cuts + map on the merged head, not beside the branch. Gap (3) folds into line 3, + whose strand kernel is its only consumer. +3. `trophic-nodes` (CultLib): spec `cut-trophic-nodes.r1` admitted; see + "trophic-nodes" below for its body facts and decisions. +4. Gap (1), mapped in section "lattice-weighted-cellular" on 3's merged head + (`911fc755`), in two cuts. 4a, `lattice-weighted-cellular` + (`cut-lattice-weighted-cellular.r1`), is C#: the node reads the body span + and weights each cell at its centre through line 3's exact `power_border`. + It waits on question `lattice-window-sound-or-measured`. 4b, + `lattice-weighted-shaders` (`cut-lattice-weighted-shaders.r1`), adds the + twins of its four steps, the GLSL, the families and the lavapipe bounds. + It waits on 4a. +5. `expr-trophic-ops` (CultLib): the span input kind and ops for 2-4 in the op + table; the strand reduction over the gated edge span (the graph has no loop, + so a span op is a CultMath function: a C# span overload over a step with its + shader twin, the convention line 3 sets); follow-up + `expr-create-copy-then-validate` (the first cut that touches `ExprGraph`; + line 3 does not); a CultMath Unity tag for fauna. Waits on 1, 3 and 4. + Fauna's first cut waits on this. +6. `tape-interpreter` (CultLib): bytecode lowering, `CultMath.Tape.hlsl`, and + the graph-parity harness (gap 5): C# evaluator against the interpreter on a + graph corpus and on a consumer's graph, dxc compile plus a device run, held + to tolerances measured per op under `cycles-kernel-reference-ruled`'s + stance. Waits on 1 and `tape-register-model`. Fauna's presenter waits on it. +7. `expr-cycles-ops`: `cycles_*` ops, after `cycles-converters` merges. +8. `cycles-noise`, re-mapped from the withdrawn r1, after `cycles-converters` + merges. +9. Material line, when the material graph returns after the demo: cones, + frontiers and an HLSL emitter over the same graph. +10. `cultmath-unity-math-parity` (follow-up): square, exp2, exp10, log2, log10. +11. Pruning (tape step 3) and meshing (step 5): parked as the target says. + +### trophic-nodes + +Written by Imagination (agent `imagination-ag4-trophic`, session +`self-2026-10-16-ag4`) against CultLib `origin/main` `f697e03f`, where +`cycles-converters` (`b136ad9b`), `expr-ir` and `stage-functions`/`stage-shaders` +(`d7d1bcf3`) are merged. One CultLib cut owns what fauna's map line +`cultmath-trophic-nodes` and this map's line 3 both name; fauna's consumer cut +(`fauna-trophic-habitat`) waits on line 5 and the Unity tag, not on this cut +alone. Spec: `cultmath-tapes:cut_spec:cut-trophic-nodes.r1`. + +#### Body facts (trophic-nodes) + +| # | Question | Result | +|---|---|---| +| TN1 | What does the probe compute, exactly? (Aetheria `docs/research/2026-10-14-trophic-dag-probe/trophic_probe.py:49-71`, `2026-10-14-body-voronoi-probe/body_voronoi_probe.py:36-67`, master `6b6e7c7c`) | Body diagram: every body visited, scores sorted, the two winners' `(F2 - F1) / |grad(F2 - F1)|` and its unit normal (the lattice web reads both). Power score `d^2 - sigma^2`, multiplicative `d / sigma` with `sigma` the well's Gaussian width. Gate: per pair `(i, j)`, margin = min over the other sites `k` of `(|k - mid| - r) / r`, `r = |ab| / 2`, unweighted positions; gate `smoothstep(-.15, .15, margin)`; no other site gives margin 9 (gate 1). Strands: max over gated edges of `gate * exp(-(segdist / width)^2)`, `width = 28 + .03 L`. | +| TN2 | Is the first-order power border exact? (scratch `border_probe.py`, double, 3,000 spans of 2-8 sites) | Yes: `F2 - F1` is affine in the query for power scores, so the first-order distance is the distance to the power bisector plane; worst relative error against that plane 2.2e-13. A one-pass fold (strict `<`, F1 then F2) gives the sorted order on every draw; an exact tie keeps the lower index first. Gabriel margin: a third site on the diameter circle gives 0, inside at half radius -0.5. | +| TN3 | Can the shader side take a span? | No resource in the mirror: `HlslSourceCompatibilityTests` compiles the HLSL text as C#, and `CultMath.hlsl` has no `StructuredBuffer` (0 in every `shaders/*.hlsl`). The struct-aware twin rule (`:153-161` at stage-shaders, now `:162-181`) compares struct and `int` arguments and private twins; `compared.Count` is 127 at `:181`. `GlslMirrorTests.FromScalars` (`:488-500`) decodes `int` and structs; `GlslTypes` (`:874-879`) maps names; `Resolve` (`:882-888`) binds public `math` methods only and cannot parse an empty parameter list. | +| TN4 | Wire coverage of a new public struct (`CultMathSerializationTests`, `CultMathJsonTests`, T5) | Every exported struct needs a `CultMathResolver` shape and a `CultMathJson` converter; JSON `Fields` (`CultMathJson.cs:269`) holds one scalar type per struct, so a struct mixing `float` and `int` fields needs new JSON machinery. Pattern: `52d25740` (SpanPath, SpanStage: resolver, JSON, a `Json`, a `RoundTrip` and a `Hex` pin). | +| TN5 | Who calls `distance_to_segment(.., out closest)`? | `MathTests.cs` and Aetheria `Assets/Scripts/ServerShared/Galaxy.cs`; it stays, unchanged in value. | +| TN6 | Is `CultMath` free to take `ReadOnlySpan`? | Yes: `net8.0;netstandard2.1` (`CultMath.csproj:4`); `BatchMath` already takes `ReadOnlySpan`. | + +#### Decisions (defaults, not forks) + +- **A span function is a C# loop over a step that has a shader twin.** The + shader cannot take a span in the mirror (TN3), and a buffer-taking HLSL + function would be a second, untested path. So each span function is one fold: + `site_cells_empty()`, then `site_cells_insert(cells, score, index)` per site, + read by `site_cells_border(cells)`; the per-site score is `power_score` or + `multiplicative_score`. C#'s `power_cells(p, sites)` and + `multiplicative_cells(p, sites)` are that loop and nothing else. A shader + caller (and later the tape interpreter) writes the same loop over its own + buffer. One rule, one path; the per-site functions are mirrored bit for bit. +- **Sites are `float4(position.xyz, weight)`**, the model page's span element; a + 2D consumer uses z = 0. For an explicit span every site is visited, so no + window and no weight-ratio range apply (the lattice node's range is line 4's). +- **Indices are `float` fields** (`nearestSite`, `secondSite`, -1 for none), as + `CultCellular.id` is: one scalar type keeps the MessagePack and JSON shapes on + the existing helpers (TN4), and an index is exact below 2^24, far past any + span a per-point O(N) search serves. +- **The gate is pointwise per pair**: `gabriel_margin(a, b, other)` with a + shader twin, and C#'s `soft_gabriel_gate(sites, first, second, softness)` + folding it over the span (TN1's unweighted positions; a power-weighted + Gabriel graph is not requested by any ruling). +- **The strand reduction is not in this cut.** Its Gaussian profile and width + law are fauna's composition until the graph needs it as an op; line 5 owns + that op, with the same step-and-twin convention. +- **Shader part separable.** The C# functions, struct and wire shapes land + first; the HLSL twins, the regenerated GLSL and the fixture families land in + the last commits under today's `GlslLowering`. Pass `imagination-ag4-shader-runner` + is re-posing the lowering and shader testing (question `device-run-driver`); + if that lands first, only the shader commits are re-mapped. + +### lattice-weighted-cellular + +Written by Imagination (agent `imagination-ag4-lattice-weighted`, session +`self-2026-10-16-ag4`) against CultLib `origin/main` `911fc755`, where +`trophic-nodes` is merged (`7e6881af`). Ruling `lattice-weight-from-bodies-ruled` +(node-reads-bodies). Line 4 splits into two cuts because of Hands' budget: +`cut-lattice-weighted-cellular.r1` (C#) and then `cut-lattice-weighted-shaders.r1` +(twins, GLSL, families, lavapipe bounds). One question, +`lattice-window-sound-or-measured`, gates the first cut's search loop. + +#### Body facts (lattice-weighted-cellular) + +The probes are numpy float64 scripts in +`docs/research/lattice-site-weight/weighted-node/` (`probe.py` is the node, and +each other script is one measure). They use 6 bodies orbiting with period equal to +distance and a sigma ratio of 5:1, `cellSize 260`, `falloff 120` (the body probe's +`3 * EW_U`), `KW .35` and boost 1.6, the ruled look. + +| # | Question | Result | +|---|---|---| +| LW1 | What weight does the ruled look use? (Aetheria `body_voronoi_probe.py` `lattice_web_edges`, master `4e620671`) | `base(.5..1) * (1 + 1.6 * exp(-(border(cell centre) / 120)^2))`. The border is the body diagram's first-order distance under the ruled power metric (`body-diagram-metric-ruled`). Distance is stretched by `1 + near` (up to 2x) across the body border's normal at the query point. Output `max(soft^2, exp(-((F2 - F1)/.1)^2))`, with soft from her smooth-min fold. | +| LW2 | Window sufficiency (`a.py`, 67,600 points against a 19x19 box) | 7x7 has no F1/F2 misses at ratio 5.2, 10 and 20 with stretch 1 or 2. 5x5 misses .1-.3% of points with stretch 2 (output error up to .92) and .04% at 20:1. A worst-case proof covers 7x7 only for ratio x stretch up to about 1.5. | +| LW3 | Are the weights continuous in time? (`c.py`, 576 cell centres, 300 s at 1/60 s) | First-order border: max step .68, and 113 steps over .01, where the second-nearest body changes. Exact `power_border`: max .0032, none over .01. | +| LW4 | Does her fold (from 8, row-major) depend on the window? (`d3.py`, 40,000 straddles of lattice cell boundaries) | Yes. With F1 and F2 exact, soft jumps .114 at 5x5 and .056 at 7x7 with stretch 2. It vanishes at 13x13 on this corpus, but nothing proves that. | +| LW5 | Which fold start is window-independent and continuous? (`d3.py`, `g.py`) | Start at F1 (F1 cell skipped): no window jump, but at F1 identity swaps m jumps .011 and soft .25, because the polynomial smooth min is not associative. Start at F1 + k and fold every cell: swaps jump 4e-15 and window jumps are 0 once the box holds every `d < F1 + 2k`. Its overshoot above m is at most .017k per step (computed), hence the clamp to F1 + k. | +| LW6 | Look of start F1 + k against hers (`h.py`, 40,000 points, 13x13) | Mean output difference 0.0000, max .032 (stretch 1) and .030 (stretch 2). | +| LW7 | Ring-exit cost (`e.py`) | Cells visited: at the ruled look median 25, max 49 (stretch 1) and 81 (stretch 2); at boost 4 with stretch 2, max 121; at boost 9, max 81. The worst-case sound fixed box is 19x19 to 67x67. | + +#### Decisions (defaults, not forks) + +- **The weight reads the exact power border** (`power_border`, trophic-nodes), + not the first-order one the ruled look's probe used: LW3, under + `aetheria-fauna:ruling:habitat-no-pop-ruled`. The look moves where the + first-order distance was wrong (LW3's jumps are the same places). +- **Her fold starts at F1 + k and is clamped to F1 + k**, in absolute row-major + order (LW4-LW6). The look is unchanged to within .03, and the node is + window-independent by construction, which the search's exactness needs. +- **The alignment stretch is in the node.** It is a query-point anisotropy, and + it does change winners (B41). Only the node sees the candidate sites, so a + caller cannot apply it. Stretch 1 is isotropic. +- **float4(F1, F2, smooth, id), no gradients, no struct.** fauna's composition + reads values only, and a struct would owe a wire shape (TN4). Gradients can be + added later as their own function, if a consumer asks. +- **The range is public constants**, so line 5's graph validator reads the range + from CultMath rather than restating it: boost up to 4 (10:1), stretch up to 2, + smoothing up to 1. +- **The base weight takes its own hash lane** (`pcg3d(cell).z`), not the jitter + phase the probe reused. +- **Steps for shaders, the span function in C# only**, by trophic-nodes' + convention: `lattice_site`, `lattice_weight`, `lattice_distance`, + `lattice_smooth_step`. + +## Pass 8: volumetric prioritized (ruling `volumetric-work-prioritized`) + +Written by Imagination (agent `imagination-volumetric-frontier`, session +`self-2026-10-14-eureka`) against CultLib `main` `dfc720e7`. The operator, +2026-10-14, relayed by the Aetheria Self: "I want that volumetric work +prioritized, since it's a totally different authoring framework for the nebulae +and I'll need to build on it to get it up to par". The ruling names three pieces +(the interval- and affine-culled march, the site ground, the integration-native +noise domain) and leaves their order to this Self. Later the same day she pointed +at "the last nebula playground" as having sophisticated noise. Facts on her two +playgrounds were extracted by the Aetheria Self's Eyes into +`F:\Projects\eureka-handoff-aux-2026-10-14\eyes-nebula-labs\facts.md`. + +### The frontier as found + +| Piece | Record | State | +| --- | --- | --- | +| Interval ops | `cut-interval-ops.r4`, reports h1-h4, Soul s1-s3 (s3 all Holds) | Merged to main (`fb567472`). Open Soul findings: `cut-interval-ops.s1.lod-weights-never-exercised` (Low), `cut-interval-ops.s1.shipped-void-two-scenes` (Medium, pre-existing; Pass 4 picked the one shipped void, but the finding was never closed), `cut-interval-ops.s3.lodstep-footprint-branch-unpinned` (Low). | +| GLSL lowering | `cut-glsl-lowering.r2`, h1-h4, s1-s3 (s3 all Holds) | Merged (`bb583e89`). Follow-ups `iv-exp-gpu-widening`, `glsl-fixture-uncovered` and `glsl-browser-parity-run` are open. | +| Affine forms and shaders | `cut-affine-forms.r2` (h1-h3, s1-s3), `cut-affine-shaders.r2` (h1-h3, s1-s3) | Merged (`156782da`). Soul's s3 on affine-forms has one Falsified claim and no open finding; Self carried it as follow-up `gate-detail-scale-sensitivity`. | +| Snoise tie | `cut-snoise-tie.r1`, h1-h2, s1 (all Holds) | Merged (`48aadda0`). It re-pinned `SNOISE_LIPSCHITZ` from 10.099261 to 7.9640074 (Pass 6). | +| Site ground | No document in the mind. The file-era spec `docs/cultmath-interval-ground-cut-site-ground.r3.spec.json` (repo `GameCult/gamecult-site`, base `535d170`) and the stardust spec | Never run. The gamecult-site `origin/main` `af6e206` has no ground shader and vendors no CultMath GLSL. Follow-ups `site-ground-affine-and-centred-warp`, `site-ground-dense-check-blind-past-body` and `wells-oracle-shortfall-affine-forms` wait on its next revision. No site-ground spec was ever admitted to the mind, so its first spec there is `cut-site-ground.r1`, whatever the file era numbered it. | +| Noise domain | Ruling `integration-native-noise-domain`; `docs/research/integration-native-noise-domain.md` (`114bb4f3`, on main) | The probe ran on 2026-10-03. There is no cut. Its source (`DomainProbe/Program.cs`, scratch commit `5ec9f529`, never merged) survived only in a temp scratchpad. It is now copied, with its images and log, to `F:\Projects\eureka-handoff-aux-2026-10-14\imagination-volumetric-frontier\`. | +| Operator's playgrounds | Artifacts "Kernel Nebula Lab" (`c09d2762`, version 1791066352) and "Nebula Span Lab" (`be6a9e31`, version 1791074878, the later one) | Facts file above. The Kernel Lab is the probe's kernel cascade in a page and has no noise function. The Span Lab is the "last nebula playground". | + +No volumetric spec is in force without a report, so none is stale on an old +base. Ruling `wells-overhead-plus-floor`, which the brief named as in force, is +superseded by `affine-wells-contract-cheaper-than-interval`. The next spec does +not touch (c), so it cites neither. Target `r1` is stale for this line: its +`not_in_scope` still parks affine forms, and no invariant covers the noise +domain. The target revision is Self's. + +### The Span Lab is the framework + +The Span Lab's density is a ramp, `ext · clamp((F − s)/B, 0, cap)`. Here `s` is a +height pushed down by power brushes. It is then domain-warped twice by octave sums +of `snoise`, each plain, ridged (`1 − 2|n|`) or curl, with an anisotropic stretch +along a flow axis. The lab's own words: "The span integrator linearises the whole +warp chain per span, bounds the error with a curvature bound, and integrates +optical depth in closed form". Its bound is `0.5 K h²` from a hierarchical chain of +speed, acceleration, Jacobian and second-derivative bounds. Its empty and saturated +proofs use the same model, or the later warps' ranges alone. + +That is ruling `integration-native-noise-domain`'s domain, "built for interval +integration", made with the noise she likes. It is also the "totally different +authoring framework" she will build on. The kernel cascade (the probe and the Kernel +Lab) is the earlier exploration, and it stays a line below. + +**Correction to the brief's expectation.** The next cut is not site-ground. The +site ground's field was then open between the Span Lab framework, the kernel +cascade and r3's marched void. The r3 machinery (the interval pre-pass, the +centred warp, the debug-versus-dense readback) is shaped for a marched field. +Question `site-ground-field` asked this. It is ruled `site-ground-field-ruled`: +the Span Lab framework with the void as its brush. + +### `SNOISE_LIPSCHITZ`: 10.099 in the lab, 7.964 in CultMath + +- **Current: 7.9640074.** It is set in `math.Interval.cs:21`, `CultMath.Interval.hlsl` + and the generated GLSL. `MeasureLipschitz` (seed 0x11B5) refined 7.2400064, and + 7.2400064 x 1.10 = 7.9640074. That measurement is on the tied kernel, re-pinned by + `cut-snoise-tie` (Pass 6 table; Soul's `cut-snoise-tie.s1` all Holds). +- **Stale: 10.099261.** The same measurement on the pre-tie kernel refined 9.181147. + On that kernel snoise jumps by 0.21 to 0.72 inside a 1e-4 ball near lattice + diagonals, so gradient ascent climbed a near-discontinuity. Pass 6 recorded 926 + `af_snoise` misses around that spike before the fix and 0 after. +- **The lab embeds the pre-tie kernel.** Its `cultmath_snoise` uses + `step(x0.yzx, x0.xyz)`, the 0.3.0 cyclic tie (`SPAN` line 244). CultMath's has the + three-component Gustavson order (`CultMath.glsl:90`). Its pins + `SN_L = 10.099261`, `SN_H = 56.050385` and `SN_T = 540` were measured on that + kernel. `SN_T` came from the lab's own hill climb, 487.1 x 1.11. + - So the lab's constant agrees with the lab's kernel. + - But the kernel is discontinuous, so no derivative bound holds across the tie + set. The lab's "proved" span bounds and its bound audit can miss there. + - `SN_H` survived the tie fix unchanged (`MeasureHessian`, same witness). `SN_T` + has never been measured on the tied kernel. +- **Nothing the interval march or the site ground reads is stale.** + - CultLib's march and every `iv_*` and `af_*` function read 7.9640074 in all three + runtimes. + - The site ground has no code. + - The file-era specs and Passes 1-5 cite 10.099261 only as history (as-built + section). + - The stale copy lives only in the lab page. It is recorded as follow-up + `span-lab-pre-tie-kernel`. + +### What of the Span Lab belongs in CultMath (the noise domain) + +One owner each, and the one rule each protects. CultMath owns noise primitives and +their bounds. The consumer owns its composition: brushes, the ramp, which warps +and in what order. The as-built negative "a flow or envelope function in CultMath" +stands. + +| Piece (lab) | Owner | Rule it protects | Line | +| --- | --- | --- | --- | +| `cultmath_snoise_gh`, the analytic Hessian (`makeGH`, string-spliced from the pre-tie grad kernel) | `math.snoise_hessian` in C#, HLSL and GLSL | One snoise kernel. Value, gradient and Hessian come from the same tie order, so no consumer splices its own derivative from an old kernel | Cut `snoise-hessian` (admitted) | +| `SN_T`, the third-derivative tensor norm pin | `SNOISE_THIRD` beside `SNOISE_HESSIAN` | One measured pin per derivative order, re-measured with the kernel | Cut `snoise-hessian` | +| Closed-form optical depth of a clamped linear ramp over a span (`compField` clamp split) | `math.integral_clamp_linear` | One closed form, with the clamp split at the exact crossings | Cut `snoise-hessian` (generic math; no fork) | +| Curl of a three-potential octave sum (`dispVec` mode 2, `curlK`), with its Jacobian from the Hessian | A CultMath curl primitive | Divergence-free by construction. Its bounds come from `L` and `H` | Waits on the curl ruling (not ruled); needs `snoise_hessian` | +| Warp-stage octave field: per-component offsets, per-octave offset, anisotropic stretch `Mop`, ridged `1 − 2|n|` with its fold deviation | CultMath stage functions returning value, Jacobian and span bounds | A stage's bounds compose from the noise pins by the chain rule; a consumer never re-derives them | Waits on question `span-chain-shape` | +| Span evaluator: linearise a composed chain, the curvature bound `K`, the empty and saturated proofs | Per `span-chain-shape` | One composition rule for bounds | Waits on `span-chain-shape` | +| Brushes, the ramp, `ampG`, `brushPoint`, the chain's order, the scroll animation | The consumer (site, Aetheria) | The authored field is the consumer's | Never CultMath | + +`1 − 2|n|` is the affine image `2(1 − |n|) − 1` of `ridged_grad`'s octave term. +Adding it as a variant is a naming choice inside the stage-function cut, not a fork. + +### The noise domain and a curl node (not decided: no ruling) + +The Aetheria Self is testing curl of simplex (`snoise_grad`) as a replacement for +`Tri3D` flow noise. The Span Lab already has curl as a warp mode. The domain's +owner would serve a curl node like this: + +- It is one CultMath primitive: the curl of three offset `snoise` (or octave-sum) + potentials from analytic gradients, with the `cultmath_` HLSL twin, the lowered + GLSL and a fixture family. Aetheria's flow law and the nebula's warp both call + it. Each consumer keeps its own composition and scaling: the lab's + `curlK = 0.25/F`, or Aetheria's amplitude and scroll. +- Its Jacobian, which the span evaluator and the kernel cascade's per-kernel affine + warp both need, is a difference of Hessian entries. That is why `snoise-hessian` + comes first, and why the curl node is not in it. +- Bounds without new constants: + - Each curl component is a difference of two partials, so its magnitude per + octave is at most `2 L` times the amplitude. + - Its variation over a ball is bounded through `SNOISE_HESSIAN`. + - Its curvature, which the span bound needs, is bounded through `SNOISE_THIRD`. +- The as-built line "a flow or envelope function in CultMath" was written against + the site's flow law. A curl basis is a noise primitive like `snoise_grad`. If the + curl node is ruled, the line needs that clarification, not a waiver. + +### Kernel cascade (kept as a line) + +The probe found the cascade exact, and 0.48x the shipped march's cost at 4.2x its +msf on the void. But it "cannot be marched", its look is fibres, and its GPU cost +is traversal, which is unmeasured. Optical depth through it is a sum of per-kernel +segment integrals, so it is order-independent. Additive blending of each kernel's +screen footprint would give exact transmittance in WebGL2, with no compute and no +sorting. Emission is not order-independent. This is a hypothesis with no probe +behind it. `site-ground-field-ruled` picked the Span Lab framework, so the cascade +becomes a cut only if the operator's nebula work picks it. + +### Cut sequence (volumetric line) + +1. `snoise-hessian` (spec admitted): `snoise_hessian`, `SNOISE_THIRD` re-measured + on the tied kernel, `integral_clamp_linear`, in C#, HLSL and GLSL with fixture + families. It touches no `expr-ir` file. Its provenance prose goes in code + comments and the README, not `design.md`, which `expr-ir` edits. +2. Ruled `stage-functions` (`span-chain-shape-ruled`), split in three for size, on one + branch `hands/cultmath-stage-functions`: + - `stage-functions` (specs `cut-stage-functions.r1`-`r3`) and `stage-shaders` (spec + `cut-stage-shaders.r1`): merged to main 2026-10-16 (verdicts cut-stage-functions.s2-s4, + cut-stage-shaders.s1). SpanPath/SpanStage inputs, float-rounding allowances, HLSL and GLSL + twins with SpanPath/SpanStage/SpanNoise as shader structs, a struct-aware mirror with no + `MirrorOnly` list (125 functions compared), `tools/compile-hlsl.ps1` (x64 dxc, `-WX`). + SpanStage.Identity has no shader form (decided in the spec: callers build the struct; a + mirror test proves the shader at a C#-built identity equals fbm_grad/ridged_grad). + - `stage-shaders-device`: a committed WebGL2 runner on Starfire (ANGLE to D3D11, Unity's + driver path; also runnable on a phone) from follow-ups `glsl-browser-parity-run` and + `affine-device-runner-seed`; fixture families across coordinate bands 1e2..1e6; a C# test + reading the device readback against the double kernel; settles follow-up + `span-allowance-gpu-margin`'s four CPU survivors (eg-abs, eh-abs, So-reach, two-en-to-one) + and the size of the 2^-14 absolute term (en-abs-halved survives every CPU test). `fold` + and the ridged sign jump at zero, so their device check is one-sided enclosure, not ulps. + - `cultmath-unity` span release: after `stage-shaders-device`; the smoke shader calls both + span twins; its own Soul pass; then Aetheria's pin bump and its spans-option lowering + (ruling aetheria-nebula-spans-as-option; a moving nebula also waits on + `span-bounds-under-flow`). + - `span-compose`: the composition helper (`span_compose`) and `span_range` for + the empty and saturated proofs, in all three runtimes, with a two-stage chain + enclosure test against dense sampling. + `trophic-nodes` (spec admitted on main after this branch merged) and then + `lattice-weighted-cellular` (waits on it): Pass 7 lines 3-4. + + Body fact (probe on Yggdrasil, scratch `edb3c1c3` over `2fd9431a`; log + `F:\Projects\eureka-handoff-aux-2026-10-14\imagination-stage-functions\probe2.log`): + the HLSL mirror that `HlslSourceCompatibilityTests` compiles exposes every + `static const` as a public static literal field of `CultMathHlsl.HlslShader` + (`CULTMATH_PI` through `CULTMATH_SNOISE_THIRD` and `CULTMATH_CYCLES_*`). So one + reflection test can pin every shader constant to its C# twin. +3. The curl primitive, once the operator rules on curl (the Aetheria flow test). +4. `cut-site-ground.r1` on the Span Lab framework (`site-ground-field-ruled`). + Under that option the two marched-only site follow-ups are withdrawn, and + only the third carries. +5. The kernel cascade, if picked. + +## Pass 9: the shader pipeline (rulings `glsl-es-via-dxc-spirv-cross`, `conforming-run-lavapipe`, `real-device-native-angle`) + +Imagination `imagination-ag4-shader-pipeline`, session self-2026-10-16-ag4, 2026-10-16, on +`origin/main` f65bde6f. The evidence the operator ruled on is `docs/research/native-shader-testing.md` +(f697e03f) and `docs/research/native-shader-probes.md` with its scripts (e598c443). This pass adds +the body facts below, then sequences the three rulings. + +### Body facts (Pass 9) + +Every probe ran through `ygg-verify.sh` on Yggdrasil at f65bde6f, 2026-10-16 between about 16:30 +and 16:50 UTC (18:30 to 18:50 CEST). Logs are in the Imagination scratchpad +(`imagination-ag4-shader-pipeline/split-run1.log`, `img-run1.log`, `snap-run1.log`). + +- **SPIRV-Cross pin.** The newest SDK tag is `vulkan-sdk-1.4.363.0` (commit f11ba9f0, 2026-09-16). + Built from that tag (`-DSPIRV_CROSS_CLI=ON`, Release, 4 cores), it takes 70 s and gives the same + result as the HEAD build the earlier probe used. `tools/get-spirv-cross.ps1` clones HEAD unpinned. +- **dxc pin (Linux).** The asset is + `.../v1.9.2607/linux_dxc_2026_07_29.x86_x64.tar.gz`, sha256 + `55665c87824051ed4774ff3280a79ccbbb7d39243b9736ca5e98222134112d54`, and it reports libdxcompiler 1.9.0.1. + `get-dxc.ps1` pins the Windows zip of the same release. +- **Overloads collapse in dxc, not in SPIRV-Cross.** With `export` on the 173 non-texture definitions, + the library has 127 `OpFunction`s and 127 exports: one per name. Today's source has 22 overloaded + names, 68 definitions and 46 lost. Trophic-nodes (branch `hands/cultmath-trophic-nodes`, unmerged) adds + `cultmath_segment_closest` and `cultmath_distance_to_segment` in 2D and 3D, so 24 names and 72 definitions. + The loss comes from exporting overloaded names, and build-only wrappers avoid it (next bullet). The + source keeps its overloads (ruling `shader-overloads-stay-native`). +- **Build-only export wrappers keep every overload (Pass 9b).** Imagination `imagination-ag4-overload-wrappers`, + 2026-10-16, on 09940e20, ubuntu:24.04 on Yggdrasil, 17:40 to 17:55 UTC (19:40 to 19:55 CEST), log + `imagination-ag4-overload-wrappers/wrap-run2.log` in the session scratchpad. The probe generated one + wrapper per non-texture definition (173) in a build-only file. Each wrapper looks like + `export float3 cmw036_cultmath_lerp(float3 start, float3 end, float3 amount) { return cultmath_lerp(start, end, amount); }`. + The source was unchanged, with no `export` keyword anywhere, and it compiled with dxc `-T lib_6_3 -spirv`. + - At default optimisation dxc inlines every wrapper. The 173 wrappers hold the bodies, and no + overload survives as its own function. + - At `-Od` it keeps the call. That gives 346 functions: 173 wrappers, each with exactly one + `OpFunctionCall` to its own distinct callee. Each callee's `OpName` is already the plain source + name (`cultmath_lerp` four times), so no rename is needed. + - An instruction-level edit of the SPIR-V binary then makes the library. It keeps only the Shader + and Linkage capabilities, drops every `OpExtension`, deletes the wrapper functions with their + names and decorations, and moves each wrapper's `LinkageAttributes ... Export` onto its callee. + `spirv-val --target-env spv1.5` accepts the result. Deleting the export instead of moving it gives + a module SPIRV-Cross refuses ("no entry point"). + - SPIRV-Cross `vulkan-sdk-1.4.363.0 --es --version 310` emits 173 `cultmath_` definitions, as many + per name as the source has. There are no `_N` suffixes and no wrapper names: its own overload + handling renames only on a signature collision. The emitted text is 2621 lines, against 1497 for + today's three files, because `-Od` leaves temporaries. + - Call sites resolve. glslang compiles as a `#version 300 es` fragment shader that calls + `cultmath_lerp(float..)`, `cultmath_lerp(vec3..)`, `cultmath_saturate(vec4)` and + `cultmath_saturate(float)`. A call with `ivec2`, which has no overload, is refused ("no matching + overloaded function"). + - Same computation. All 105 families the probe generator covers ran on lavapipe through the + restored library, and every one is bit-identical to the committed GLSL route. 85 of the 105 are + also bit-identical to the HLSL route, the same 85 where the committed GLSL matches it. + - The rest of the pipeline carries over. Partitioned by origin file, the output gives 178 chunks + (125 core, 51 Cycles, 2 Phacelle). No origin is unknown and nothing calls across licences. + Every overload set lives in one file, and no signature repeats. glslang compiles all four + combinations as ES 3.00. The source has 13 `static const` lines, all of the form + `static const float CULTMATH_X = ;`. None of them reaches the output, and today's GLSL + holds 13. +- **What `-Od` leaves, and what cleans it (Pass 9c).** Imagination `imagination-ag4-od-temps`, + 2026-10-17, on e626bf26 (188 wrappers, 140 names, 117 families), ubuntu:24.04 on Yggdrasil, 10:05 to + 10:35 UTC (12:05 to 12:35 CEST), dxc v1.9.2607, SPIRV-Cross and SPIRV-Tools both built from + `vulkan-sdk-1.4.363.0` (spirv-opt v2026.4), log `od-temps/imag-od7.log` in the session scratchpad, + probe in `docs/research/native-shader-probes/od-temporaries/`. Pass 9b's route as ruled, with no + further step, emits: + - 2824 lines, 86129 bytes, 188 `cultmath_` definitions, 140 names, no suffixed names. The + committed files are 1663 lines of one-line bodies, so line counts do not compare; SPIRV-Cross + prints every body in Allman style. + - Named locals survive, so most functions read like the source. Two things do not. First, 472 + `param_var_*` copies: dxc passes every parameter as a pointer and the caller copies in. Second, + 11 functions assign to a parameter in their body (`smootherstep`, `integral_clamp_linear`, + `fbm_grad`, `ridged_grad`, both Bezier pairs, `span_stage`, `iv_fbm_ball`, `af_fbm`) and come out + `inout`. The HLSL has no `out` or `inout` anywhere. + - That `inout` is a defect in the route, not a blemish. glslang refuses a consumer call with a + value, `cultmath_smootherstep(x + 1.0)` ("l-value required"), and a call with a variable + rewrites the caller's variable. Pass 9b's bit-identical result held because the families call + through their own copies. Overloads that look native must also take values like native ones. + - NaN-safe `min` and `max` expansions (`mix(mix(max(a, b), b, isnan(a)), a, isnan(b))`) from + `NMin` and `NMax`. + - Six `spirv-opt` pass lists on the edited module alone (`--convert-local-access-chains`, + `--ssa-rewrite`, `--eliminate-local-single-block`, `--eliminate-local-single-store`, + `--eliminate-local-multi-store`, `--simplify-instructions`, `--eliminate-dead-branches`, + `--merge-blocks`, `--vector-dce`, `--redundancy-elimination`, `--scalar-replacement`, + `--copy-propagate-arrays`, each with `--eliminate-dead-code-aggressive`) are valid and keep 188 + functions, but make the text bigger (2870 to 2930 lines) and swap named locals for `_N` ids (218 + tokens become 2155 to 2517). `param_var_` and `inout` stay. They are not a cleanup. + - A by-value lowering of the SPIR-V (`od-temporaries/byvalue.py`, 50 lines) makes each Function + pointer parameter a value parameter, with the old id kept as an entry-block local stored from + it, and each call loads what it passed. It changed 187 functions and 456 parameters, validates, + and leaves `inout` at 0. On lavapipe all 117 families stay bit-identical to the committed GLSL. + - Then `spirv-opt --eliminate-local-single-store --eliminate-dead-code-aggressive` removes every + `param_var_` copy (472 to 0): 2604 lines, 79782 bytes, 188 functions, 316 distinct `_N` ids, valid. + Adding SPIRV-Cross `--relax-nan-checks` drops the `isnan` expansions: 2556 lines, 74263 bytes, + 268 `_N` ids. glslang accepts both as ES 3.00, `cultmath_smootherstep(p.x + 1.0)` included. + - That cleaned module is bit-identical to the lavapipe HLSL result on 117 of 117 families, where + the committed GLSL is on 97. It differs from the committed GLSL in 20 families. Against the C# + fixture the exact, at most 4 ulp, at most 64 ulp and over 64 buckets are 80, 11, 9, 17, where + the committed GLSL is 80, 9, 10, 18. `--relax-nan-checks` changes no lavapipe bit. So the + cleaned route is closer to the HLSL than today's GLSL is, and "bit-identical to today's + lowering" cannot be its gate. With apt's spirv-tools 2025.1~rc1 the figures for this route are the same. +- **Why `span_fbm` and `span_ridged` differ by 1 ulp (Pass 9c).** Imagination `imagination-ag4-span-ulp`, + 2026-10-17, on 23ac4e89, same image and tools as `cut-glsl-build-dxc.h1`, probes in the session + scratchpad `logs/ag4-ulp/` (`probe1.sh` to `probe4.sh`). Only the curvature word (word 4 of 6) differs, in + 41 and 42 of 1536 words. Two causes, both measured: + - **dxc's entry-point optimiser reassociates.** `cultmath_snoise_hessian` ends every entry in + `105.0 * (...)`. In the `-O3` entry module the 105 is hoisted out: nine squares are summed bare and + the sum is multiplied once (`OpFMul %11025 %sum`, then `Sqrt`), where the source squares `105 * a` + nine times. That is real arithmetic, not float arithmetic. Neither `NoContraction` nor + `--relax-nan-checks` touches it. `dxc -Gis` (IEEE strictness) stops it. + - **The driver contracts mul+add by use count.** lavapipe (NIR) fuses an `OpFMul` into the `OpFAdd` + that consumes it only when the product has one use. dxc's CSE shares the symmetric Hessian's + off-diagonal squares (two uses each), so the entry module fuses some of the nine pairs; the `-Od` + library module has nine single-use products and fuses all nine. The `OpFAdd` order is the same in + both (left fold, as the C# `span_frobenius`). + - Decorating every `OpFMul`, `OpFAdd`, `OpFSub`, `OpVectorTimesScalar` and `OpDot` `NoContraction` in + both final modules, f103 and f104: `-Od` HLSL equals the built GLSL (0 words differ); `-O3` + HLSL still differs in 31 and 44 (the hoist). `-Gis` (with `-O3`) plus `NoContraction` equals the built GLSL on + 127 of 127 families, and so does `-Od` plus `NoContraction`. Plain `-Od` HLSL differs from the built GLSL in 664 words + (contraction depends on use structure), so `-Od` alone is worse than `-O3`: your suspicion of `-Od` + on the HLSL route is not a fix. + - **Which is right.** Against the C# fixture, exact cases of 256 for f103 are 3 (HLSL) and 4 (GLSL) plain, + and 151 for both under `NoContraction`; for f104, 7 and 10 plain, 141 under it. Of the first 60 families whose + count moved, the strict form is nearer the C# in all but one, which moved by 1. Strict IEEE, no contraction, no + reassociation is what C# computes, so it is "right"; the plain routes are each one driver's + fusion pattern. The built GLSL is source-faithful (nothing in the `-Od` route reassociates). + - **What makes them agree.** The equality gate (`GLSL_DIR` mode) compares both routes in the strict + form: HLSL entry built with `-Gis`, and a harness pass that adds `NoContraction` to every float op of + both modules (about 12 lines of `spirv-dis` and `spirv-as`; `tools/device/nc.py` in the probe). That is + 127 of 127. The shipped GLSL and the C# bounds judge are unchanged. See question `glsl-gate-strict-form`. +- **The build at main, with the rename and the strict form (Pass 9d).** Imagination `imagination-ag5-glsl`, + 2026-10-17, scratch worktree `C:\cl-wt\imag-ag5-probe` (not pushed): `23ac4e89` merged with origin/main + `86cd84a3` as `69987d91` (no conflict; README.md and tools/device/gen.py auto-merged), probe commits + `575badb6` to `d14bfbbe` (`probe/p1.sh`, `p2.sh`, `spec.py`). Yggdrasil, `mcr.microsoft.com/dotnet/sdk:10.0` and + `ubuntu:24.04`; logs in the session scratchpad `imagination-ag5-glsl/p2.log` to `p4.log`. + - **Site arrays break the wrappers.** `wrappers.py` passes `sites[CULTMATH_MAX_SITES]` as the argument (its + last-token rule), and dxc refuses the three wrappers of `cultmath_power_border`, + `cultmath_lattice_cell_distance` and `cultmath_weighted_lattice_cells` ('no known conversion from float4 to + float4 [128]'). Stripping the `[..]` suffix from the argument fixes it; then the build is green: core 139 + functions over 91 names (1554 lines, 54775 bytes), cycles 51/51 (867, 21250), phacelle 1/1 (82, 3199); zero + suffixed ids and zero inout. + - **The renamed fields survive SPIRV-Cross.** With `float4 cosine; float4 sine;` in the HLSL (HLSL only, in + the job), the built phacelle.glsl declares `vec4 cosine; vec4 sine;`. + - **The strict-form gate holds at main.** With `-Gis` on the HLSL entry and NoContraction on both modules + (the text `nc.py` of Pass 9c, probe only): lavapipe-glsl equals lavapipe-hlsl on 129 of 129 work items. + The work list is 125 fixture families (123 at `774bebb0`; the lattice loop added two) plus one + reference item for each of the 4 sampled affine families, so h1's 127 was 123 + 4. + - **The built GLSL loses the capacity override.** dxc preprocesses `CULTMATH_MAX_SITES`, so built core.glsl + has no mention of it and four literal `[128]` arrays. A consumer with `#define CULTMATH_MAX_SITES 4` + passing `vec4 s[4]` fails glslang ('no matching overloaded function'); the same consumer compiles + against the committed (lowered) GLSL and through dxc against the HLSL. + - **dxc has no spec-constant array size.** `[[vk::constant_id(7)]] const int CAP = 128;` as an array + parameter's length is refused ('variable length arrays are not supported in HLSL'). + - **A SPIR-V spec constant carries it.** In the built SPIR-V exactly one constant is an array length + equal to 128 (id 1297), used by nothing but OpTypeArray. Made an OpSpecConstant with SpecId 0, it passes + spirv-val, and SPIRV-Cross ES emits `#ifndef SPIRV_CROSS_CONSTANT_ID_0` / `#define ... 128u` / + `const uint _1297 = SPIRV_CROSS_CONSTANT_ID_0;` with `vec4 sites[_1297]` in every site-array + signature. The probe's consumer defined the macro as a plain int and was refused for the uint + initializer, so the `uint(CULTMATH_MAX_SITES)` mapping that `cut-glsl-build-dxc.r2` writes is + the route, but has not been compiled yet. +- **Capability strip.** `spirv-opt --trim-capabilities` (spirv-tools 2025.1~rc1) leaves all 14 + capabilities and both extensions in place, and SPIRV-Cross still refuses ("RayQuery requires Vulkan + GLSL 460"). Stripping every capability except Shader and Linkage and every OpExtension in the + disassembly, then running `spirv-as`, gives a module that `spirv-val --target-env spv1.5` accepts. + SPIRV-Cross `--es --version 310` lowers it in 54 ms, and dxc takes 322 ms. +- **Named constants vanish.** The SPIR-V has no `OpName` for any `CULTMATH_` constant, so the output + has none. Today's GLSL has 13: 9 in CultMath.glsl and 4 in CultMath.Cycles.glsl. The HLSL source of + every one of them is a `static const float NAME = ;` line, so a build can emit them + from the source lines and should refuse any `static const` line of another form. +- **Per-file split works.** The SPIRV-Cross output was partitioned by the HLSL file that defines each + function and struct (CultMath, Interval and Affine go to core, plus Cycles and Phacelle). That gives + 132 chunks: 79 core, 51 Cycles and 2 Phacelle. No chunk's origin is unknown, no chunk is duplicated, + and no Cycles or Phacelle function calls a function outside core. The output has no `spv*` helper + functions. Its prologue is 3 lines: `#ifdef SPIRV_CROSS_LIBRARY_HEADER`, `#version 310 es` and + `#endif`. glslang compiles core, core+Cycles, core+Phacelle and core+Cycles+Phacelle as `#version 300 es` + fragment shaders. So the licence split survives the switch as a partition step of about 40 lines in the build. +- **One image runs the whole conforming job.** `mcr.microsoft.com/dotnet/sdk:10.0` is Ubuntu 24.04.5 + (noble), dotnet 10.0.401. Its apt has mesa-vulkan-drivers 25.2.8-0ubuntu0.24.04.4 (lavapipe, the + probe's device), glslang-tools 15.1.0, spirv-tools 2025.1~rc1, libvulkan-dev 1.3.275 and gcc 13.2. + `apt-get update --snapshot 20261016T000000Z` (apt 2.8.3) then installs the same versions. That pins + the package set to a date and lets the C# judge run in the same container as the device. +- **Consumer audit.** No public name changes under the wrapper route, so it shows only who reads the + committed GLSL and HLSL. It covers `origin` of Aetheria (master a8586d08 and all of its + remote branches), Asura (60fbd19), Odin (8e1de66) and gamecult-site (af6e206), and HEAD of every + other git repo under F:\Projects except the CultLib worktrees, the archived AetheriaEve and the + retired CultMath history repo. The search was for `cultmath_[a-z]` outside docs. Only one shader + calls CultMath: `Muninn` (1d0ea0b, and its + worktree `Muninn-next`) `crates/muninn-move-tracker/shaders/MoveSphereCandidate.comp.hlsl:88`, one + call to `cultmath_saturate(float)`. Aetheria uses CultMath only from C#. The operator's Span Lab + artifact (be6a9e31) embeds its own copy of the GLSL (follow-up `span-lab-pre-tie-kernel`) rather + than including the file. + +### Decisions (defaults, not forks) + +- **The fixture owner owns the work list and the verdict.** `GlslMirrorTests` writes what a device + must compute: the fixture's families, plus reference families for the four sampled-form checks, + whose reference is the device's own `snoise` or fBm at 75 points of each case. It also judges + what the device returns. The generator only spells shaders, the host only dispatches, and neither + compares anything. The lavapipe job and the later ANGLE tool share this one work list and this one judge. +- **Each device has a recorded bound.** Under `cycles-kernel-reference-ruled`'s stance, a device's + ulp-bounded and platform families are held to a bound measured on that device and committed with + the device's identity. lavapipe re-runs bit-identically, so the bound is a regression gate, and an + identity change refuses until it is re-recorded. Exact and integer families must match bit for + bit, and `check` families must pass their `Verify`. +- **Unique names for dxc live only inside the build** (ruling `shader-overloads-stay-native`). The + build owns three things here. + - The wrapper list. It is generated from the source's own definitions, one wrapper per non-texture + `cultmath_` definition, and the build refuses a definition it cannot read, just as it refuses a + `static const` line of another form. The wrappers are text in the build's temp directory and are + never committed. The source gains no `export` keyword and no `CULTMATH_EXPORT` macro. + - The compile mode. The library compiles at `-Od`, because the default optimiser's inlining is + what erases the overloads. The text it leaves is cleaned by the next two items (Pass 9c), not + shipped as is: `-Od` alone emits `inout` parameters, which native overloads must not have. + - One SPIR-V edit. A single instruction-level pass over the binary, never a regex over text, + strips capabilities and extensions, deletes the wrappers and moves their exports onto the + callees. It replaces the disassembly grep that the capability-strip probe used. It refuses a + wrapper that is not exactly one call. SPIRV-Cross then emits the overloaded names as they are, + so the build has no rename step and no name map. + - By-value parameters. The same pass makes every Function-pointer parameter a value parameter + (`byvalue.py` in the probe), so no emitted function can be `inout`. The build then runs exactly + `spirv-opt --eliminate-local-single-store --eliminate-dead-code-aggressive`, never an inliner + and never `--simplify-instructions` or `--ssa-rewrite`, which turn named locals into `_N` ids, + and SPIRV-Cross runs with `--relax-nan-checks`, so `min` and `max` are the plain intrinsics. + - The gate is the HLSL, not the old text. A cleaned route's lavapipe-glsl result must equal the + lavapipe-hlsl result bit for bit in every family (117 of 117 measured), and the C# judge's + bounds are re-recorded only where a family moved and equals its HLSL result. + +- **CultPhasor's JSON keys (model page row).** Named by `CultMathJson`; written as `cosine`/`sine` from + `phasor-field-rename` on, and read as either those or the legacy `cos`/`sin`, forever unless a later + Breaking change removes the legacy names. Decided by ruling `phasor-fields-renamed-at-source`. The + MessagePack wire is positional and never named the fields, so `.cc` documents are untouched both ways. + A reader from before the rename skips the new keys and decodes zeros (its unknown-property rule), which + is why the change is Breaking in both changelogs: upgrade readers before writers. +- **The capacity through the build.** dxc cannot keep a macro and refuses spec-constant array sizes, so + the build turns the one array-length constant into a SPIR-V spec constant and `partition.py` maps + `CULTMATH_MAX_SITES` onto SPIRV-Cross's `SPIRV_CROSS_CONSTANT_ID_0` with source-copied header lines. + Rejected: building the GLSL per capacity (a consumer would run the build to change one number), and + rewriting `[128]` in the emitted text (the forbidden text post-pass). Pass 9d. + +### Cut sequence (Pass 9; one line each, mapped when about to run) + +1. `shader-conforming-run`: spec admitted. The lavapipe job with the C# device judge, run against + today's committed HLSL and GLSL, so the next cut is verified against a running check. +2. `glsl-build-dxc` (spec `cut-glsl-build-dxc.r2` admitted; r1's h1 left the gate red, Pass 9d): the build, not yet the switch. r2 merges main, carries site arrays and their capacity (a spec constant mapped to `CULTMATH_MAX_SITES`), the strict-form gate and the renamed phasor fields, and waits on `phasor-field-rename` (spec admitted: `cosine`/`sine` in C#, HLSL, GLSL and CultMathJson, legacy keys read; CultMath's next release is 0.5.0, a release cut of its own). `packages/cultmath/tools/glsl/` + holds `build-glsl.sh`, which pins dxc v1.9.2607 (the sha above), SPIRV-Cross and SPIRV-Tools + `vulkan-sdk-1.4.363.0`, plus one SPIR-V tool in Python. The build generates the export wrappers into + its temp directory (never committed), compiles source plus wrappers with `-T lib_6_3 -spirv -Od`, + and runs the one SPIR-V edit (strip, wrapper delete, export move, by-value parameters; Pass 9c). + It runs the pinned `spirv-opt` pair, `spirv-val`, and SPIRV-Cross ES 3.10 with `--relax-nan-checks`, + then partitions by origin file and emits the 13 constants. Output goes to a directory the caller + names. The committed GLSL, `GlslLowering.cs` and its tests are untouched, and the lavapipe job gains + one switch to run a built directory in place of `shaders/*.glsl`. Waits on 1, which is merged. + 2b. `glsl-switch` (mapped when 2 is verified): commits the build's output with the licence lines and + guards, deletes `GlslLowering.cs` and the lowering contract tests, makes the lavapipe job check + the committed files against the build, re-records the lavapipe bounds for moved families + (Pass 9c's gate), and pins `get-spirv-cross.ps1`. If `trophic-nodes` merges first, the build + covers its four new overloads with nothing extra. +3. `angle-capture` (stage-shaders-device part 2): the Starfire native-ANGLE tool on the shared work + list (ES 3.00 fragment flavour, RGBA32UI readback), loading a pinned ANGLE build rather than Docker + Desktop's copy. Captures carry the renderer, ANGLE version and revision, the shader sha and per-family + argument hashes and bits, and the ordinary test run judges them. A shader-sha change marks them stale. + It settles `span-allowance-gpu-margin`'s six CPU survivors, `iv-exp-gpu-widening`'s measurement and + `device-p2-pin-notes`, and closes `glsl-browser-parity-run` and `affine-device-runner-seed`. It waits + on 2b, because a capture of the old lowering goes stale at the switch. + +### shader-lattice-loop (follow-ups `shader-weighted-lattice-loop`, `lattice-shader-pins`) + +Written by Imagination (agent `imagination-ag4-shader-loop`, session `self-2026-10-16-ag4`) against `origin/main` +`e2051c5a` and the build branch at `23ac4e89`. Research and probes: `docs/research/shader-variable-inputs.md`. +Spec: `cultmath-tapes:cut_spec:cut-shader-lattice-loop.r1`. Question: `shader-site-capacity` (gates the spec). + +- **Bodies reach the shader as `float4 sites[CULTMATH_MAX_SITES]` plus `int count`, by value.** A caller accessor + macro cannot survive the library build (the built GLSL has no consumer macros), and library-owned uniforms would + take a binding the consumer owns. dxc, the SPIR-V edit, SPIRV-Cross and a WebGL2-style uniform-array consumer all + accept the array form (probes P1-P3). +- **The shader owns the whole search.** `cultmath_weighted_lattice_cells` and `cultmath_power_border` replace the two + comment recipes; the four steps stay public. The box pass recomputes distances (no shader cache), the ring loop is + bounded by 37 with C#'s exit. +- **The lavapipe run kills the exit and the normaliser** (probe table, research section 3): M1-M6 fail the C# device + judge; M7, a late exit, is equivalent by the window-independence proof. M1 needs several far-ring points. +- **Smooth-step cap point** joins its family (m = f1 + smoothing, d past it, smoothing >= 0.5). +- **Yggdrasil's sdk:10.0 Ubuntu image owns `glsl-parity.json`'s platform values** with the lavapipe bounds; a write + on another OS is refused. +- Left: `shader-span-functions-array-form` (power_cells, multiplicative_cells, soft_gabriel_gate array forms). diff --git a/docs/cultmath-tape-target.md b/docs/cultmath-tape-target.md new file mode 100644 index 00000000..74eae11b --- /dev/null +++ b/docs/cultmath-tape-target.md @@ -0,0 +1,125 @@ +# CultMath tapes: interval-pruned field evaluation on CPU and GPU + +Status: steps 2 and 4 (graph, C# evaluator, HLSL interpreter) unparked on +2026-10-14 (ruling tape-unparked-for-trophic-graphs, which supersedes +tape-target-unparks-when-asura-stable); their model page and cut sequence are +`docs/cultmath-interval-ground-cut.md`, "Pass 7". Steps 3 and 5 (pruning, +meshing) stay parked. The affine-forms +piece was unparked on 2026-10-03 (ruling affine-forms-unparked) and is on main +(156782da), alongside step 1's intervals; its map and as-built record are in +`docs/cultmath-interval-ground-cut.md`. This note records the direction for the +parked steps so they can be picked up without re-deriving it. + +## Intent + +Evaluate large implicit fields, meaning deeply nested CSG trees of brushes with +thousands of nodes, cheaply enough to mesh at many levels of detail and to +raymarch. The operator's words (2026-10-02): "I would love to design a space +station out of a grammar of nested brushes, and have the ability to +automatically mesh it at multiple levels of detail so I can get arbitrarily +close to its tiny details without melting my GPU." + +GameCult has no deep CSG trees today because nothing could evaluate them +cheaply. The capability comes first, and the content follows. + +## Prior art + +[Fidget](https://www.mattkeeter.com/projects/fidget/) by Matt Keeter +(MPL-2.0, Rust, v0.5.1 on 2026-09-27; repo `mkeeter/fidget`). +- It compiles an expression to a register-allocated bytecode tape. +- It evaluates that tape as points, SIMD batches, intervals, and forward-mode + gradients. +- The central trick is interval evaluation over a region. When it proves that + one operand of a `min` or `max` always wins, the tape for that region is + rewritten without the other branch. In the project's example, the tape + shrinks from 254 clauses to about 20 at pixel level. +- `fidget-jit` targets x86-64 and AArch64. +- `fidget-wgpu` has a WGSL tape interpreter, interval ops and tape + simplification on the GPU (`interval_ops.wgsl`, `tape_interpreter.wgsl`, + `tape_simplify.wgsl`). +- `fidget-mesh` implements Manifold Dual Contouring. It is known to be weak on + thin features. +- Halfspace is the IDE codesigned with `fidget-wgpu` (Rust, egui and wgpu, + MPL-2.0). + +## Chosen shape (option c) + +The ideas are ported into CultLib and owned here. Fidget is not a dependency. +Unity renders HLSL on its own graphics backend, so `fidget-wgpu` cannot run +inside it. + +Three options were weighed on 2026-10-02: + +| Option | What it is | Trade | +|---|---|---| +| a | Fidget as a Rust native plugin in Unity | Fastest demo; costs per-platform native builds, an FFI boundary, and an upstream that warns of breaking changes | +| b | Offline bake with a Rust tool; ship meshes | Simplest; the baked depth caps how close a viewer can get | +| c | CultLib owns tape, interval and pruning in C# and HLSL | Most coherent end state; the largest code liability we would own | + +The operator parked (c). An (a) spike to validate authoring and LOD behaviour +before owning code was suggested but not ruled. + +Sketch, to be replaced by the target pass: + +1. **CultMath `interval`** in C# and HLSL with parity tests: + - arithmetic, `min`/`max`, `smin`, `sqrt`, `clamp` and `smoothstep`; + - interval or Lipschitz bounds for every CultMath noise primitive. + + This step needs no tape. It stands alone, and is the first cut to take even + if the rest stays parked. +2. **Tape**: an expression graph lowered to bytecode, with point, interval and + gradient evaluators in C#. Gradients reuse CultMath's analytic-gradient + primitives, which Asura cut 2a built. +3. **Pruning**: per-region tape simplification driven by interval results. +4. **HLSL interpreter** for the same bytecode, with interval ops and pruning. + Fidget's MPL-2.0 WGSL is the reference. MPL code keeps its own MPL-headed + files, as Phacelle does. +5. **Meshing**: an octree of chunks with seams stitched between LOD levels. + - The default is surface nets (GameCult.Geometry, Asura Cut 2) plus + Asura's tile pass: Newton refinement onto `f = 0`, then crease snapping + from field gradients (Asura Cut 6c). + - The operator's lean (2026-10-02) is that gradient work beats dual + contouring here. Thin authored bevels can be shaded by their analytic + normals, and the refined positions can be iterated further. + - Dual contouring is not planned. The tile pass on station brushes is its + test. + +## Truth and lowerings + +The field is data: a typed CultCache document holding the expanded tree. A +generator, such as a brush grammar, expands into that document, and everything +downstream caches it. The CPU evaluator, the HLSL interpreter, the mesher and +collision are all lowerings of that one document. This is how "one +implementation of the field" survives having both CPU and GPU evaluators. +Asura's invariant 2 had to forbid CPU evaluation because its field is HLSL +source. + +## Known consumers + +- **Aetheria volumetric raymarching** (clouds, nebulae). Step 1 alone gives it + empty-space skipping. Coverage and shape terms carry the culling, because + detail octaves only bound to ±amplitude. + - Prerequisite: Aetheria's shaders must use CultMath noise, not their own + copies. That is already owed at Aetheria's CultMath pin bump (see the Asura + cut map, snoise release follow-ups). +- **Space stations from a brush grammar**, meshed in LOD chunks around the + camera. This is a separate project with its own target. This campaign + supplies its evaluator. +- Asura does not need this campaign. Its field is noise-dominated, and its + `A_max` shell and band-limiting already give the cheap culling. + +## Decided since the unpark, and what stays open + +- The spike-or-(c) choice was settled by the operator's unpark: the tape + unparked for Aetheria's trophic species graphs (ruling + `cultmath-tapes:ruling:tape-unparked-for-trophic-graphs`). +- Interval representation: affine forms for noise and warp, unparked on + 2026-10-03 (ruling `cultmath-tapes:ruling:affine-forms-unparked`): one + shared symbol, mapped in `docs/cultmath-interval-ground-cut.md`, "Pass 5". +- Register model: the HLSL interpreter keeps its registers in groupshared + memory, a slice per thread, linear-scan allocated at lowering (ruling + `cultmath-tapes:ruling:tape-register-model-ruled`; research in + `docs/research/tape-register-model.md`). +- Open: whether the brush-grammar station project lives in Aetheria or in + its own repo (follow-up `cultmath-tapes:follow_up:brush-grammar-station-repo`, + raised as an operator question when a station cut reaches the frontier). diff --git a/docs/cultmesh-ts-content-map.md b/docs/cultmesh-ts-content-map.md new file mode 100644 index 00000000..43f2ab03 --- /dev/null +++ b/docs/cultmesh-ts-content-map.md @@ -0,0 +1,158 @@ +# TypeScript CultMesh Content Plane: Map + +Campaign `cultmesh-ts-content`. Imagination wrote this on 2026-10-19 at CultLib +`8990bd46` (origin/main `a88c629e` plus the target doc). The target is +`docs/cultmesh-ts-content-target.md`. This page holds the body facts, the model +page, the rationale and the cut sequence. Specs and questions live in the +typed mind, not here. + +## 1. Body facts + +Each fact was probed by running code or read from source at `8990bd46`. +Scratch probes ran under the session scratchpad (`imagination/`), not in the +repo. + +| # | Fact | Evidence | +|---|---|---| +| F1 | A C#-packed manifest is a MessagePack **fixarray of 10** (`0x9a`): `[artifactId, kind, version, contentHash, sizeBytes, mimeType, createdAtUtc, chunks[], tags[], metadata{}]`. Each chunk ref is a 4-array `[chunkHash, offset, sizeBytes, recordKey]`. The fixture manifest is 1,111 bytes: 6 chunks (5 x 262,144 + 4,831), content hash `f4ae2a7c…2af1`. The empty body packs to 315 bytes with one zero-size chunk whose hash is `e3b0c442…b855` (the SHA-256 of nothing). | probe: `@msgpack/msgpack` 3.1.3 decode of `contracts/cultmesh/content-vectors.cs-written.json`, kind `manifest` | +| F2 | `@msgpack/msgpack` 3.1.3 re-encodes all four C# manifest vectors **byte-identically**, metadata included (`zeta, alpha, mid` keep insertion order). Integers come out minimal (`4831` is `cd12df`, `262144` is `ce00040000`), as MessagePack-CSharp writes them. | same probe, `encode(decode(bytes))` equals the input for all four | +| F3 | Three decoder hazards for a TS manifest reader. (a) JS objects put integer-like keys first (`{zeta,"2",alpha,"1"}` iterates `1,2,zeta,alpha`), so metadata must be ordered entries, not an object, or a `{"10":…,"2":…}` manifest re-encodes in another order. (b) Plain `decode` takes the last of duplicate map keys silently (`{"a":"2"}`); C# `Dictionary` and Rust `ordered_map` refuse duplicates. `new Decoder({ mapKeyConverter })` can refuse them: probed. (c) Plain `decode` rounds int64 above 2^53 (`…993` reads as `…992`); `useBigInt64: true` keeps it exact. | probe (node) | +| F4 | `@msgpack/msgpack`'s decoder is iterative: a 1,000,000-deep `0x91` input decodes in 160 ms but costs about 158 MB of heap. So nesting does not crash it but amplifies memory about 150 times. `checkPayloadDepth` (the owner of ruling `payload-depth-limit-256`) is not exported from any `@gamecult/cultcache-ts` entry: `document.ts:108` exports only the error and the constant. | probe (node); source `packages/cultcache-ts/src/document.ts:2,108,123` | +| F5 | The C# HTTPS connector sends `GET ?chunkHash=&recordKey=`, **without** a `sha256:` prefix, because `BuildChunkUri` runs `NormalizeHash` first. Probed URIs: `https://ygg.example/content?chunkHash=5993ac…&recordKey=mesh%3Acdn%3Achunk%3A5993ac…`. An existing endpoint query is kept and joined with `&` (`?tenant=sp&chunkHash=…`). A null record key sends `recordKey=` (empty). Other characters use `Uri.EscapeDataString`, so on the wire `k with space/ü&=?#` becomes `k%20with%20space%2F%C3%BC%26%3D%3F%23`. | probe: `BuildChunkUri` lines copied into a net10.0 console (`CultMeshHttpsContentTransport.cs:114-122`) | +| F6 | The connector calls `EnsureSuccessStatusCode` and fails on any status outside 2xx. When `Content-Length` is present and is not the chunk's `SizeBytes`, it throws before reading. With no `Content-Length` it copies the stream without checking the length. Verification belongs to the caller's transfer owner. `CanConnect` admits only `https`. The constructor takes a `Func`, so a test can pin a self-signed certificate without modifying the connector. | source `CultMeshHttpsContentTransport.cs:18-29,92-104` | +| F7 | `NormalizeHash` (C#) strips a case-insensitive `sha256:` prefix *before* trimming, then `Trim().ToLowerInvariant()`. It never checks for hex or a length of 64. So the record-key grammar accepts any non-blank string, and a provider must add its own hex check before a hash can become a file name. | source `CultMeshCdn.cs:549-560` | +| F8 | `StableToken` (the token in a manifest record key) is a C# rule with no Rust mirror: `cultnet-rs/src/content.rs` builds no artifact record key. Its Unicode semantics differ from the naive JS spelling in four probed ways. .NET `ToLowerInvariant` leaves `U+0130` unchanged, while JS gives `i` plus `U+0307`. .NET `Trim` keeps `U+FEFF` (and trims `U+0085`, per `char.IsWhiteSpace`), while JS `trim` drops `U+FEFF` and keeps `U+0085`. JS whole-string lowercasing applies final-sigma (`ΑΣ` becomes `ας`), while per-unit lowercasing gives `ασ`. `char.IsLetterOrDigit` is false on a lone surrogate and on `U+00B2`, which JS `\p{L}\p{Nd}` agrees with only when it is tested per UTF-16 unit. | probe (net10.0 console and node); source `CultMeshCdn.cs:562-580` | +| F9 | `CreatedAtUtc` defaults to `DateTimeOffset.UtcNow.ToString("O")`, which looks like `2026-10-19T12:07:25.5235579+00:00`: 7 fractional digits and `+00:00`, never `Z`. | probe (net10.0) | +| F10 | `contracts/cultmesh/content-vectors.cs-written.json` and `.rs-written.json` are written by `tests/GameCult.Mesh.Tests/CultMeshContentVectorTests.cs` and `packages/cultnet-rs/tests/content.rs`, under `CULTNET_WRITE_VECTORS=1`. Each side judges both files. Kinds are `request`, `response` and `manifest`. Rust panics on an unknown kind (`tests/content.rs:302`), and C# requires the Rust labels to equal its own (`CultMeshContentVectorTests.cs:54`). **So a new kind or label in the cs-written file breaks both siblings.** A TS file must be a separate file. | source | +| F11 | **Neither content-vector suite runs in CI.** `cultmesh-portability.yml` filters `dotnet test` to `AuthorityProof`, `RealtimeWireProtocol` and a lease churn test. `cultnet-interop.yml` runs `cargo test … rudp` (a name filter) and the Networking `Rudp` filter. The C#/Rust content parity has only ever been run by hand. | grep of `.github/workflows/*.yml` | +| F12 | TS→C# vector precedent: `scripts/write-cultmesh-realtime-frame-vectors.mjs` writes `realtime-frame-vectors.ts-written.json` from built `dist`, deliberately from **different inputs** than the C# file. `CultMeshRealtimeWireProtocolTests` judges it, and `cultmesh-portability.yml:145-149` runs it. | source | +| F13 | Cross-process precedent for C# against a Node provider exists. `packages/cultnet-ts/test/interop/cultnet-interop.test.ts:536-560` spawns the TS QUIC provider, then runs `dotnet test --filter NativeConnectorReceivesFromExternalProvider` with the endpoint in `CULTMESH_NATIVE_EXTERNAL_ENDPOINT`. The C# test skips without the variable (`tests/GameCult.Mesh.Quic.Native.Tests`, line 21). | source | +| F14 | `cultnet-ts` is CommonJS. Its `./wire`, `./contracts` and `./authority` subpaths import only `@msgpack/msgpack`, `ajv` and `cultcache-ts/document`, so they are browser-safe. Its root `index` pulls `node:` modules (`peer`, `rudp`, `transport`, `security` and others). `cultmesh-browser` (ESM) already imports `cultnet-ts/wire`, `/contracts` and `/authority`. `cultmesh-ts` loads `koffi` lazily, inside a function (`realtime-quic-native.ts:139`), so a new subpath of it pays no native load. The root has `esbuild` ^0.28.1 as a devDependency. | source, grep | +| F15 | TS packages build with `tsc` and test with `node --test dist-test/test/*.test.js` per workspace. `scripts/run-typescript-workspaces.mjs` runs them in order `cultcache-ts, cultnet-ts, cultmesh-ts, cultmesh-browser`, after `check-typescript-tests-wired.mjs`. No StrykerJS config exists in CultLib (`docs/mutation-testing.md:156-159`). | source | +| F16 | **No CultLib TS package except `cultcache-ts` has a publish job.** `publish-packages.yml` triggers on `cultcache-ts-v*`, `cultcache-py-v*`, `cultnet-py-v*` and `cultmesh-py-v*` only. Tags `cultnet-ts-v0.1.1` and `cultmesh-ts-v0.1.1` exist, but no workflow consumes them. `npm view` returns 404 anonymously for `cultnet-ts`, `cultmesh-ts`, `cultmesh-browser` and even `@gamecult/cultcache-ts` (`@gamecult/cultcache-ts` may be private; unverified). The doctrine's rule of at most three tags per push stands (SKILL.md:674). | source; `npm view` | +| F17 | StreamPixels consumes CultLib as the git submodule `vendor/CultLib` (gitlink `30ee8b97`) with `file:` deps and `pnpm.overrides`. Its CI and Idunn recipes build the vendored workspaces (`npm ci --ignore-scripts`, then build `cultcache-ts`, `cultnet-ts` and `cultmesh-ts`). `apps/web` depends only on `cultnet-ts` today, not on `cultmesh-browser`. | StreamPixels `.gitmodules`, `apps/*/package.json`, CI workflow lines 62-95 | +| F18 | The Rust reader sets two guards that the TS reader should match. A caller cap `max_bytes` is checked before any request. And a zero-size chunk is refused unless it is the only one, because a manifest of zero-size chunks would be a request flood. | source `cultnet-rs/src/content.rs:364-385` | + +## 2. Model page + +There is one row per persistent or wire-visible kind. Identity is what names the +kind, lifecycle is what happens to it over time, and authority is who decides. +The HTTP answers are new design: no runtime has an HTTPS content server (target, +"Why now"). They are grounded in three content-addressed HTTP stores, as I +recall their specs; I did not fetch the specs in this pass. The IPFS trustless +gateway answers raw blocks with `Cache-Control: public, max-age=29030400, +immutable`, uses the CID as `ETag`, and returns 400 for an unparseable CID. The +OCI distribution spec's `GET`/`HEAD /v2//blobs/` returns 200 with +the digest header, 404 `BLOB_UNKNOWN` and 400 `DIGEST_INVALID`, and treats Range +(206/416) as optional. Nix binary caches serve `.narinfo` with 200 or 404, +and `nix` probes them with HEAD. My confidence in those three shapes is +moderate to high. + +| Kind | Identity (what names it) | Lifecycle | Authority (who decides; forbidden writers) | +|---|---|---|---| +| **Manifest** `gamecult.mesh.cdn_artifact_manifest.v1` | The record key (row below), derived from `artifactId`, `version` and `contentHash`. On the wire it is the 10-array of F1. Its namespace is the schema id. Two manifests for one body under different ids or versions are distinct and legitimate. | Immutable once packed. A new body or version is a new manifest and a new key. Nothing revises one in place, and deletion is not in scope (no GC). `createdAtUtc` is set at pack, and a caller may pin it so that repacking is reproducible. | The packer (`packContent` in `cultnet-ts/content`) is the only TS writer. The encoder and decoder in the same module are the only TS byte owners. **Forbidden:** a second TS manifest type or encoder in `cultmesh-ts`, `cultmesh-browser` or a consumer, and any URL or endpoint field. | +| **Chunk ref** `CultMeshCdnChunkRef` | Its `chunkHash` (SHA-256 of the chunk bytes) within one manifest, plus `offset`. Two refs may share a hash, which is legal and served once. | Immutable inside its manifest. `recordKey` is derived and may be blank on read (C# and Rust fall back to `mesh:cdn:chunk:`). | Packer writes; `validateManifest` judges contiguity, non-negative sizes and the size sum (C# `ValidateManifestShape` order). Reader and provider never edit one. | +| **Chunk record key** `mesh:cdn:chunk:` | Fully derived from `normalizeHash(chunkHash)`. It is injective only over valid hex, because C# accepts any non-blank string (F7). | Derived on demand, never stored independently of a manifest. | `chunkRecordKey` in `cultnet-ts/content`. On the HTTP wire the provider **checks** a non-blank `recordKey` against it and never derives a file from it. | +| **Artifact record key** `mesh:cdn:artifact:::` | Derived by `StableToken` (F8). It is not injective: `A/b` and `a b` both give `a-b`, and the content hash at the end disambiguates. | Derived on demand. | `artifactRecordKey` in `cultnet-ts/content` mirrors C# per UTF-16 unit. Truth comes from the C#-written `contracts/cultmesh/cdn-record-key-vectors.json`, and TS never authors expectations for it. | +| **Content hash / chunk hash** | Lowercase 64-hex SHA-256. On input, `normalizeHash` accepts `sha256:`, case and surrounding whitespace, as C# does. The HTTP boundary and the reader also demand `/^[0-9a-f]{64}$/`. | Immutable. It *is* the identity. | `sha256Hex` (WebCrypto `crypto.subtle`) in `cultnet-ts/content` is the only TS hasher. The provider and the reader call it and keep no copy. | +| **Stored chunk** (provider disk) | File `/`, flat, one file per distinct chunk hash. For a single-chunk artifact (every StreamPixels artifact, since 125 KB is well under the 4 MiB default chunk) this is the body file StreamPixels already plans (`/srv/streampixels/content/`). | Written by the publisher outside the provider (StreamPixels' publish script) and never written by the provider. Immutable. Deletion has no owner (GC is out of scope). A corrupt or oversized file stays on disk and is never served. | The publisher writes; **the provider is read-only**. The provider verifies each read against its name before serving (`verify-before-serve`). **Forbidden:** any path derived from `recordKey`, the URL path or an unvalidated hash. | +| **Provider store index** | **None.** The file name is the index: the store maps hex to `/` on each request after the hex check. There is no in-memory table, so nothing can go stale. | Not applicable: it is computed per request. | `createDirectoryChunkStore(root)`, a read-only lookup port. A host may supply another `ContentChunkStore`, and the provider verifies whatever any store returns. | +| **The empty chunk** `e3b0c442…b855` | The SHA-256 of zero bytes. | Intrinsic: it needs no file. | The provider answers it as 200 with `Content-Length: 0` without consulting the store, so empty artifacts work against any store. The reader verifies it locally and sends no request. | +| **Wire request** | `GET` or `HEAD ?chunkHash=&recordKey=`. Extra query parameters are ignored (an endpoint may carry its own, F5). The mount path belongs to the host. | Stateless. | Built by the C# connector or the TS reader. The TS reader builds the URL **byte-identical** to `BuildChunkUri` (escaping as `Uri.EscapeDataString`), so C# and browser clients share HTTP cache entries. | +| **Answer 200** (GET) | The body is exactly the verified chunk bytes. | Immutable per URL. | Provider. Headers: `Content-Length: `, `Content-Type: application/octet-stream`, `X-Content-Type-Options: nosniff`, `Cache-Control: public, max-age=31536000, immutable, no-transform`, `ETag: ""` and `Access-Control-Allow-Origin: *`. `no-transform` stops a proxy from compressing the body, which would make `Content-Length` disagree with the decoded size (F6). `nosniff` with octet-stream keeps a public chunk from being rendered as HTML on the host's origin. | +| **Answer 200** (HEAD) | The same headers as GET, with no body. | Same as GET. | Provider. It verifies exactly as GET does, so HEAD can never advertise a corrupt chunk. | +| **Answer 304** | The request's `If-None-Match` contains `""` or `*`. | Same as 200. | Provider, answered before the store is touched. It is safe because the ETag is the content identity. | +| **Answer 400** | `chunkHash` missing, repeated, or not 64 hex after `normalizeHash`; or a non-blank `recordKey` that is not `mesh:cdn:chunk:` (the C# server's `record key disagrees` rule). | Stateless. | Provider. Short `text/plain` reason, no echo of input, `nosniff`. This follows OCI `DIGEST_INVALID` and IPFS's 400 for a bad CID. | +| **Answer 404** | A valid hash whose chunk the store does not hold. | Stateless; a later publish can turn it into 200. | Provider (OCI `BLOB_UNKNOWN`, Nix narinfo 404). The answer carries `Cache-Control: no-store`, so an absence is never cached as immutable. | +| **Answer 405** | Any method other than GET, HEAD or OPTIONS. | Stateless. | Provider, with `Allow: GET, HEAD, OPTIONS`. | +| **Answer 204** (OPTIONS) | A CORS preflight. The reader's GET is a simple request and never preflights. This answer exists for clients that add headers. | Stateless. | Provider: `Access-Control-Allow-Origin: *`, `Access-Control-Allow-Methods: GET, HEAD`, `Access-Control-Allow-Headers: If-None-Match`, `Access-Control-Max-Age: 86400`. | +| **Answer 500** | The store returned bytes whose SHA-256 is not the requested hash, or a file larger than `maxChunkBytes`. | Persists until the operator replaces the file. | Provider. It sends no body bytes and calls the host's `onCorruptChunk(hash)` hook so the host can fail health. It is 500 and not 404 because this is a server fault the operator must see, and a 404 would hide corruption as absence. | +| **Range** | Not supported. A `Range` header is ignored, the answer is 200 with the full chunk (RFC 9110 permits this), and no `Accept-Ranges` header is sent. | Not applicable. | Provider. The chunk is the resumption unit, and resumable TS state is out of scope. OCI treats Range as optional too. | +| **Reader result / error** | `Uint8Array` of the whole body, or one `CultMeshContentError` with `code` ∈ {`manifest-invalid`, `too-large`, `insecure-endpoint`, `webcrypto-unavailable`, `http-status`, `length-mismatch`, `chunk-hash-mismatch`, `content-hash-mismatch`}. An abort rejects with the signal's own reason (`AbortError`). | Transient, held in memory only. No byte of a failed chunk or body is returned, in whole or in part (`verify-before-use`). | `fetchVerifiedContent` in `cultmesh-browser`. Its concurrency window defaults to 4 and is capped at 32 (the C# transfer owner's bounds, `content-sessions.md`). `maxBytes` defaults to 256 MiB and is checked before any request. `https:` is required, except `http:` on loopback hosts for development. | +| **Endpoint** | A URL the caller resolved through CultMesh. | Per call; never persisted in content. | The caller. **Forbidden:** any manifest, chunk-ref or record field carrying it (`no-urls-in-content`). | +| **Vector files** | `content-vectors.cs-written.json` (C#), `.rs-written.json` (Rust), new `content-vectors.ts-written.json` (TS, manifests only, own inputs), new `cdn-record-key-vectors.json` (C#, record-key traps). | Each is rewritten only by its writer under `CULTNET_WRITE_VECTORS=1`. CI never sets the variable: the committed files are the contract. | Each writer owns its file. C# judges the TS file, and TS judges both C# files. The cs-written file gains no kind or label (F10). | + +No cell above is a guess, with two marked exceptions: the prior-art shapes +(recalled, not fetched) and `@gamecult/cultcache-ts`'s npm visibility (F16). + +## 3. Rationale + +**Where the CDN shapes live: `cultnet-ts/src/content.ts`, exported as +`cultnet-ts/content`.** Both consumers already depend on `cultnet-ts`, and its +subpaths are the repo's established browser-safe entry points (F14). A shapes +module inside `cultmesh-browser` cannot be imported by `cultmesh-ts`, which is +CommonJS. A shapes module inside `cultmesh-ts` drags a Node package into the +browser. A new package would add a release surface for roughly 250 lines. The +placement also matches Rust, where `cultnet-rs/src/content.rs` owns the same +rules. An esbuild `platform: "browser"` bundle test pins the browser-safety +claim. + +**Hashing is WebCrypto in one place.** `crypto.subtle` exists in browsers (secure +contexts) and in Node 20+, so one hasher serves the packer, the provider and the +reader. The packer is therefore async. WebCrypto has no incremental digest, so +the whole-body hash needs the body in memory. That is acceptable because the +target keeps artifacts in memory in the browser, and a Node publisher of very +large artifacts would want a streaming packer. That packer is not in scope. + +**Decoding follows the siblings, not a canonical-bytes tribunal.** The manifest +decoder accepts any integer width (as C# does), refuses duplicate metadata keys +(as C# and Rust do, using `mapKeyConverter`), keeps metadata as ordered entries, +keeps int64 exact, and refuses unsafe integers. Before decoding, it runs the +payload depth walk (ruling `payload-depth-limit-256`). That needs +`checkPayloadDepth` exported from `@gamecult/cultcache-ts/document`, a one-name +export from its existing owner, rather than a second walk in `cultnet-ts` +(F4). + +**No TS CultCache document definition for manifests yet.** The shapes module +gives bytes, values and keys. Defining `gamecult.mesh.cdn_artifact_manifest` as +a `cultcache-ts` document needs a formatter, and it would bring the C# `[CultIndex]` +declarations on `Kind`, `Version` and `ContentHash` with it. Ruling +`variants:unique-indexes` says `[CultIndex]` means unique, which would bar two +manifests of one kind in a store. I did not probe whether the reference already +trips on this. No consumer asks for a TS store of manifests: StreamPixels builds +manifests at boot. This is recorded as a follow-up, not done. + +**Provider: `cultmesh-ts/content`, a pure core plus a Node adapter.** The core is +`createContentChunkHandler(store, options) => (request) => Promise`, +where a request is `{ method, url, headers }` and an answer is +`{ status, headers, body? }`. It is framework-neutral, testable without a +socket, and mountable on `node:https`, Express, Fastify or Next. A `toNodeListener` +adapter of about 15 lines covers the bare `node:https` case. The name says +"chunk" because the handler answers chunks only. StreamPixels' sketch, +`createHttpsContentHandler`, implied it does TLS, and it does not: the host or +a reverse proxy terminates TLS. The store is a narrow port, `readChunk(hex) → +bytes | undefined`. The core verifies whatever any store returns, so +`verify-before-serve` does not depend on the store being honest. + +**Reader: `fetchVerifiedContent(endpoint, manifest, options)` in +`cultmesh-browser`.** Before any request it validates everything: shape, cap, +the zero-size rule (F18), and hex hashes. It fetches in a bounded window with +`credentials: "omit"` and an internal `AbortController` chained to the caller's +signal. It refuses a mismatched `Content-Length` before reading. With no +`Content-Length`, it reads through a bounded stream reader. It hashes each +chunk, places it at its offset in a private buffer, and returns that buffer +only after the whole-body hash matches. The C# connector's URL shape is copied +byte for byte (F5), so the pin is a fixture taken from the probe output. + +**The cross-process test runs from TS, as F13 does.** A `node --test` interop +test starts the TS provider over `node:https` with a throwaway self-signed +certificate. It then runs one env-gated NUnit test that drives the unmodified +`CultMeshHttpsContentTransportConnector`, with a handler pinning that +certificate, and checks every chunk with `CultMeshCdn`'s own validation. The TS +reader reads the same chunks from the same provider in the same test. + +**"Released" needs an operator ruling (question admitted).** The target says +"the npm packages StreamPixels vendors", but StreamPixels vendors a gitlink, not +npm (F17). None of the three packages has a publish job, and none is visible on +npm (F16). + +## 4. Cut sequence + +One line per cut. Only C1 is specified. C2 and C3 run in parallel after C1 +merges, each in its own worktree. + +1. **C1 `c1-shapes`**: `cultnet-ts/content` owns the manifest and chunk-ref types, the codec, `normalizeHash`/`parseSha256Hex`, both record-key grammars, `sha256Hex` and `packContent`. TS joins the content vectors in both directions, C# writes record-key vectors, and the C# content-vector suite enters CI. **Specified.** +2. **C2 `c2-provider`**: `cultmesh-ts/content` holds `createContentChunkHandler`, `createDirectoryChunkStore` and `toNodeListener`, with the model page's answers as behavioural tests, path-traversal negatives and verify-before-serve mutants. +3. **C3 `c3-reader`**: `cultmesh-browser` gets `fetchVerifiedContent` and `CultMeshContentError`. It is tested against a fetch double and a live `node:http` loopback provider (C2's, once merged), and covers abort, concurrency bound, empty artifact and URL parity with F5. +4. **C4 `c4-cross-process`**: the TS interop test serves over `node:https`; an env-gated NUnit test drives the unmodified C# connector; the TS reader reads the same chunks; CI lane per F13. +5. **C5 `c5-release`**: version bumps for `cultcache-ts`, `cultnet-ts`, `cultmesh-ts` and `cultmesh-browser`, with CHANGELOGs, then a Soul pass, then tags (no more than three per push). The shape follows the release ruling. diff --git a/docs/cultmesh-ts-content-target.md b/docs/cultmesh-ts-content-target.md new file mode 100644 index 00000000..246950af --- /dev/null +++ b/docs/cultmesh-ts-content-target.md @@ -0,0 +1,99 @@ +# TypeScript CultMesh Content Plane Target + +Campaign `cultmesh-ts-content`. Self wrote this on 2026-10-19 for the +StreamPixels M1 live character preview. That preview is a three.js page that +loads glTF bodies and accessories by content hash from Yggdrasil. + +## Why now + +CultMesh moves large immutable artifacts as content-addressed chunks described +by a `gamecult.mesh.cdn_artifact_manifest`. C# packs manifests, serves chunks +over TCP (`CultMeshContentServer`), fetches them over HTTPS +(`CultMeshHttpsContentTransportConnector`), and verifies each chunk and the +whole body (`CultMeshContentTransferService`). Rust speaks the chunk messages +through `cultnet-rs` `fetch_content` and `answer_content_chunk_request`. +TypeScript has none of this: no manifest type, no packer, no provider and no +reader. And no runtime has an HTTPS content *server*; the C# HTTPS connector +has never had a peer. + +Standing ruling (StreamPixels `state/map.yaml`, "Content plane", operator +2026-09-15): HTTPS content transport serves both browser and overlay. +Yggdrasil plus SHA-256 verification is the trust boundary for now. +Distributed zero-trust distribution is future work. The catalog never stores +URLs; clients resolve content through CultMesh. + +## Target state + +- **One TypeScript owner of the CDN document shapes.** It holds the manifest + and chunk-ref types, their MessagePack wire form, `normalizeHash`, the + record-key grammar (`mesh:cdn:chunk:` and + `mesh:cdn:artifact:::`), and the packer. A manifest + that TypeScript packs is byte-identical to the one C# packs from the same + bytes and options. The owner can be imported in a browser, because the + reader needs it there. +- **An HTTPS content provider in `cultmesh-ts`.** It answers + `GET ?chunkHash=&recordKey=` with exactly the chunk's + bytes and a `Content-Length` equal to the chunk's size: the request shape + the C# connector sends (`CultMeshHttpsContentTransport.cs` `BuildChunkUri`). + Its core is framework-neutral: a request maps to an answer, and a host can + mount it on `node:https` or on any HTTP framework. It reads from a content + store port. The store shipped with it serves content-addressed files from a + directory outside git. The provider never serves a byte it has not + verified against its hash, and it never serves anything but a chunk: + there is no generic static-file route. +- **A verifying reader in `cultmesh-browser`.** Given a resolved endpoint and + a manifest, it fetches the manifest's chunks over HTTPS with the C# query + shape. It checks each response's length, each chunk's SHA-256 and the whole + body's SHA-256 with WebCrypto, and returns the bytes or throws a typed + error. No byte that failed its hash reaches the caller, in whole or in part. + It runs in browsers and in Node 20+. +- **Endpoints come from CultMesh, not from content.** The reader takes the + endpoint as an argument that the caller resolved through CultMesh. Manifests + carry no URL. + +## Invariants + +- `wire-parity`: manifests, chunk refs and record keys are byte-identical + across C#, Rust and TypeScript for the same input. The C# runtime is the + reference. TypeScript writes and reads the shared vectors in + `contracts/cultmesh/`. +- `https-shape-parity`: the C# `CultMeshHttpsContentTransportConnector` + fetches content from the TypeScript provider unmodified, in a cross-process + test. The TypeScript reader fetches the same chunks from the same provider. +- `verify-before-use`: the reader releases no byte that failed its chunk hash + or the whole-body hash, and refuses a response whose length differs from the + advertised size before reading it all. +- `verify-before-serve`: the provider serves only bytes whose SHA-256 equals + the requested chunk hash. +- `chunk-only-route`: the provider answers only chunk requests. A path, a + filename or a hash outside the store can never select a file. +- `no-urls-in-content`: no manifest, chunk ref or record carries an endpoint. +- `one-owner-per-shape`: one TypeScript module owns the CDN shapes, and both + packages consume it. Neither package keeps a private copy. +- `general-purpose`: the plane is judged by what a reasonable consumer + expects, not only by StreamPixels' slice (operator, 2026-09-30). Multi-chunk + artifacts, empty artifacts, cancellation, bounded concurrency and browser + cross-origin use all work. +- `released`: the npm packages StreamPixels vendors are published at versions + that contain this plane. The release is its own cut with a Soul pass before + the tag. + +## Not in this campaign + +- Odin route verification for content. Single-host trust is ruled for now. +- Resumable or durable transfer state in TypeScript. The browser holds + artifacts in memory. +- Distributed or zero-trust distribution, and peer serving. +- A TypeScript TCP or RUDP content server, and an HTTPS content server in Rust + or C#. +- Garbage collection of stored blobs. +- StreamPixels' own export, publish and service wiring (its B2 and B3 cuts). + StreamPixels is the consumer, not part of this change. + +## Consumer + +StreamPixels `map/web-customize` (dfbe2a6), +`docs/web-character-customization-map.md` section B1. Each option's artifact is +10-125 KB, and a full avatar is 0.5-0.8 MB. The browser fetches them. The +service serves them from `/srv/streampixels/content/` on Yggdrasil, outside +git, and hashes every referenced blob at boot. diff --git a/docs/cultnet-error-contract-cut.md b/docs/cultnet-error-contract-cut.md new file mode 100644 index 00000000..ca43b5fe --- /dev/null +++ b/docs/cultnet-error-contract-cut.md @@ -0,0 +1,663 @@ +# CultNet error contract: cut map + +Status: cut map, not started. Imagination pass 1, 2026-09-30, against CultLib `main` at `8fc74c70`. +This document owns the means. There is no separate target doc: section 1 holds the ends until the +operator rules on section 3. After that, Self moves the rulings and invariants into +`contracts/cultnet/cultnet-distributed-database.md` ("Error Codes") and the schema's own description. + +Open: operator questions Q1-Q8 (section 3). No cut is dispatched until Q1, Q2, Q3 and Q8 are ruled. Q4-Q7 +change only single emit sites and can be ruled during Cut 1. + +Depends on: `hands/cultmesh-put-serve-bound` merging first. It introduces `document_unservable` in Python +(`fd394d54`), a codeless unservable refusal in cultmesh-ts (`0eb7434a`) and `CultMeshRudpRejectionReason` in +cultmesh-rs (`c9cdad12`, `85288a5a`). The cuts below convert those sites. Their anchors are by commit, not by +line, because the branch is not on main. + +Found by the put-serve Hands (batch 3, `38000efa`, 2026-09-30); they belong to this map's cuts: +- **Python codes outside the closed code list.** Python refuses with `document_unservable`, + `malformed_document_put` and `snapshot_*_exceeded`. None of these are in the closed `cultnet.error.v0` code + list, and Rust and TS peers refuse to decode an unknown code. +- **Two error-map shapes.** TS sends a two-key error map that its own peers cannot parse. Rust sends the five-key + contract shape. The two agree only at the message level. +- **The session after a refusal.** TS and Python keep the session open after a refusal; Rust sends a goodbye and + ends it. +- **New Rust refusal frame.** The put-serve branch adds a Rust refusal frame, `cultnet.error.v0` carrying the + reason text with no code and no details, sent before the goodbye and acknowledging nothing. Cut 1 gives it a + code. +- Found by the put-serve Soul (merge verdict, 2026-09-30): + - A store `OSError(ENOSPC)` in Python is refused as `malformed_document_put`, with the text "Raw put document could + not be stored." That is a server fault reported as the peer's fault. + - Over RUDP, Python's `document_unservable` details add `fragmentCount` and `maxFragmentCount`, and send + `maxSnapshotBytes: null` when it is unbounded. The map specifies `{responseBytes, maxSnapshotBytes}`. + - `response_unqueueable` (Python, P3) is a new code outside the closed list. + - A TS peer cannot tell "stored, receipt lost" from "refused" (put-serve Soul F4, pass 3). + +Map branch: `main`. + +--- + +## 0. What the Body does today (probed) + +Every claim in this table was established by running code. The C#, Rust and TypeScript probes ran on +Yggdrasil through `ygg-verify.sh` at `8fc74c70`. The Python bytes came from `msgpack.packb` on the exact +dicts `cultmesh_py/server.py:573-589` and `cultmesh-ts/src/index.ts:5921-5926` build. The six probe inputs: + +| Input | Bytes from | +|---|---| +| `cs_cursor_stale` | Rust `tests/error_message.rs` captured C# hex (`cursor_stale`, details `{asOf:1,current:2}`) | +| `cs_routing` | C# `new CultNetErrorMessage { Error, RoutingHint = { Reason="not_primary", Shard=... } }` serialized with `CultNetSchemaMessageSerialization` | +| `cs_codeless` | C# `new CultNetErrorMessage { Error = "boom" }` | +| `cs_unknown_code` | C# with `Code = "document_unservable"`, empty `CultNetErrorDetails` | +| `py_snapshot_byte_limit` | the Python `_error_response` shape: `messageId`, `code: "snapshot_byte_limit_exceeded"`, `details {responseBytes, maxSnapshotBytes}` | +| `ts_two_key` | the cultmesh-ts shape `{schemaVersion, error}` | + +Decoded by: + +| Input | C# `CultNetSchemaMessageSerialization.Deserialize` | Rust `decode_cultnet_message_from_slice` | TS `parseCultNetMessage` | +|---|---|---|---| +| `cs_cursor_stale` | ok | ok, typed | ok | +| `cs_routing` | ok | ok, **routingHint dropped** (`code: None, details: None`) | ok (untyped passthrough) | +| `cs_codeless` | ok | ok | ok | +| `cs_unknown_code` | ok (free string) | **Err: "not a recognized cultnet.error.v0 code"** | **throws: /code must be one of the allowed values** | +| `py_snapshot_byte_limit` | ok, but **details silently become an all-null object** (`responseBytes`, `maxSnapshotBytes` lost), `messageId` dropped | **Err: not a recognized code** | **throws** (missing routingHint, extra messageId, code enum, details keys) | +| `ts_two_key` | ok | ok | **throws: missing routingHint, code, details** — TypeScript cannot parse the errors TypeScript sends | + +Captured C# bytes for the two shapes Rust's vector file does not hold (for Hands' reuse): + +- `cs_codeless`: `85AD736368656D6156657273696F6EB063756C746E65742E6572726F722E7630A56572726F72A4626F6F6DAB726F7574696E6748696E74C0A4636F6465C0A764657461696C73C0` +- `cs_routing`: see the probe; the shard descriptor writes ten keys, nil included. + +Other findings, from reading source at `8fc74c70`: + +1. **The interop CI lane has been red for 40 consecutive `main` runs.** It fails at "Verify CultNet schema + contracts stayed consolidated" (`.github/workflows/cultnet-interop.yml:67-90`). That step forbids every + `*.schema.json` outside `contracts/cultnet/`, and R-AB deliberately vendors 22 copies into + `packages/cultnet-rs/contracts/cultnet/`. Those copies are held byte-equal by + `packages/cultnet-rs/tests/schema_discovery_contracts.rs:74-99`. Nothing after that step (every + cross-runtime interop test) has run on main in that time. Run `36714768445` is the latest. +2. **The schema contradicts itself.** `contracts/cultnet/cultnet.error.schema.json:29` says the code is + "Additive: a v0 peer that does not know this field ignores it" and, in the same sentence, "a closed + enum: Rust and TypeScript refuse". The closed-enum text came from Soul pass 4d (`3f942a57`). It + described what the code did; no operator ruled it. `docs/` holds no ruling on unknown codes. +3. **Emitters that break the schema:** + - cultmesh-ts sends `{schemaVersion, error}` only, at `packages/cultmesh-ts/src/index.ts:5875-5878`, + `5885-5888`, `5913-5916` and `5922-5925`, and on the branch at `0eb7434a`. + - cultmesh-py `_error_response` (`packages/cultmesh-py/src/cultmesh_py/server.py:573-589`) adds a + top-level `messageId`, omits `routingHint`, omits `code` and `details` rather than sending nil, and + sends eight out-of-enum codes: `unsupported_schema_version` (`:161`), `malformed_document_put` + (`:358`), `unregistered_document_put` (`:365`), `malformed_document_delete` (`:386`), + `unregistered_document_delete` (`:393`), `snapshot_document_limit_exceeded` (`:558`), + `snapshot_byte_limit_exceeded` (`:567`) and `simulation_observations_disabled` (`:596`). The branch + adds a ninth, `document_unservable` (`fd394d54`). + - `packages/cultnet-py/src/cultnet_py/interop_peer.py:409-417` also sends `unsupported_schema_version`. + R-2 (`docs/cultnet-selection-cut.md:2046-2053`) required that code, but it never entered the schema + enum. +4. **A second schema authority.** `packages/cultnet-py/src/cultnet_py/schema_catalog.py:17`, `:272` and + `:357-362` publish a hand-built `cultnet.error.v0` descriptor under the canonical `$id`. It has a + different shape: `messageId`, `code` as any string, `details` open, and only `schemaVersion` and `error` + required. The same file does this for every wire message (about 350 lines). This is recorded as + follow-up F-1, not cut here. +5. **Silent refusals.** cultmesh-rs's RUDP document server returns every rejection to the local caller only + (`packages/cultmesh-rs/src/rudp_document_server.rs:470-590`, `CultMeshRudpApplicationRejection`). The + peer gets nothing and times out. On the branch this includes the new `DocumentUnservable`. +6. **Receivers drop the code.** + - Every C# receiver turns an error into `new IOException(error.Error)` or + `new InvalidOperationException(error.Error)`, so a caller cannot branch on the code. The sites: + `src/GameCult.Mesh/CultMeshBodySessions.cs:310`, `CultMeshContentSessions.cs:178/256-260`, + `CultMeshPeerExchange.cs:430/466`, `CultMeshSnapshots.cs:91/107/222-226/743` and + `CultMeshVerseDiscovery.cs:273`, plus `src/GameCult.Networking/CultNetShardReplication.cs:440/574`. + - Rust reads `Error { error, .. }` at `packages/cultmesh-rs/src/lib.rs:823`. + - TS types `CultNetErrorMessage` as `{schemaVersion, error}` only (`packages/cultnet-ts/src/contracts.ts:167-170`). + - Kotlin has no error type. A request that gets an error back fails a + `require(response.schemaVersion == ...)` (`packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt:1278`, + `:1334`), and the peer's text is lost. +7. **No correlation.** Only Python echoes `messageId`. + - `cultmesh-browser` rejects an error only when exactly one operation is pending + (`packages/cultmesh-browser/src/index.ts:724-731`); otherwise the error is dropped and the operation + times out. + - C# `CultMeshContentSessions.OnError` (`:256-260`) fails every pending request on any error. +8. **The reference is inconsistent with itself.** `src/GameCult.Networking/CultNetDatabaseServer.cs:560` + refuses a variant change with a codeless error. The subscription server refuses the same condition with + `ForVariantUnsupported` (`CultNetDatabaseSubscriptionServer.cs:211/333/366`). +9. **routingHint is never consumed.** No receiver in any runtime reads it. C# builds it at + `CultNetDatabaseServer.cs:638-650`, and Rust's decode discards it. +10. **Consumer audit** (read-only, all of `F:\Projects` except CultLib; no git in Aetheria): + - Outside CultLib, nothing sets `code`, `details` or `routingHint`, and nothing branches on a code. + - Emitters: + - Huginn: `crates/huginn-daemon/src/serve.rs:288/307/312`, Rust struct literals + `Error { error, code: None, details: None }`, pinned at cultnet-rs `8fc74c70`. + - AetheriaEve: `Aetheria.State.Daemon/Program.cs:1737/1778`, C# object initializers. + - Decoders read `.error` only: Gjallar `Program.cs:574`, Mimir + `MimirOdinMoveProofEvidenceRingProvider.cs:80`, Hermodr `hermodr-daemon.cjs:1380` (hand-rolled), + AetheriaEve's smoke test (text match against its own emit text), and Huginn's tests (text match). + - Stale vendored TS: + - `StreamPixels/vendor/CultLib` carries the current closed schema, so any change here breaks its + TS error decode until it is re-vendored. + - `Heimdall/vendor/CultLib` carries a pre-R-X schema with `additionalProperties:false` and no + `routingHint`, so it already refuses every error C# sends today. + - Odin, Idunn, Muninn, Ghostlight and voidbot: zero hits. + +## 1. Ends + +- **One schema.** `contracts/cultnet/cultnet.error.schema.json` is the only authority on the shape and on the + code registry. C# embeds it (`GameCult.Networking.csproj:19`), TS mirrors it at build time, and Rust + vendors a copy held byte-equal by test. Nothing else publishes a `cultnet.error.v0` shape (F-1 covers + Python). +- **Every runtime emits only schema-valid errors.** This is proven per emit path against the schema, and + byte-equal to the C# reference for every registry code. +- **Every runtime decodes every error it can receive into a typed value.** A known code becomes its typed + variant with its typed details. An unknown code, if Q1 says so, becomes a typed "other" that keeps the + code string and the raw details. No well-formed error is ever refused, and no field is silently dropped + (routingHint, messageId). +- **Code and details have one owner.** The details a message carries are decided by its code. The types in + every runtime make "cursor_stale with a field" unrepresentable. No free-standing code string plus a + grab-bag details object. +- **A refusal is an answer, not a silence** (R-2 precedent, and Q4). A server that refuses a peer's request, + and can still send, sends a coded error that correlates to the request. +- **The public surface is complete in every runtime**, per the consumer-expectation doctrine: + - a typed error value; + - a constructor per registry code; + - a typed exception or error that request APIs raise when the peer refuses, carrying the typed value. + +## 2. Identity, lifecycle and authority + +| Kind | What names it | Lifecycle | Who decides | +|---|---|---|---| +| Error message | `schemaVersion: cultnet.error.v0`; correlated to its request by `messageId` (Q3) | Sent once, in reply to one request or subscription. Never persisted. | The server that refused. | +| Error code | A snake_case string in the schema's registry (`$defs/knownCode`) | Added by one coordinated change: schema, C# constructor, a C#-written vector, and a typed variant in every runtime. Never renamed and never reused. A retired code stays in the registry marked retired, so an old reader still decodes it. | The operator rules meaning; Self keeps the registry. | +| Details for a code | The code | Frozen with the code. Adding a key to an existing code's details is a new code (or a v1), never an in-place edit (see Q2). | Same as the code. | +| Unknown code, at a reader | The raw string | Preserved as typed `Other`. The reader acts on the `error` text and the absence of a known code. | The reader (Q1). | +| Vector file | `contracts/cultnet/interop/error-vectors.cs-written.json` | Regenerated only by the C# writer test under `CULTNET_WRITE_VECTORS=1` and committed. Every other runtime judges it read-only. | C#, the reference. | +| routingHint | Shard authority refusal | Sent with a null code (unchanged). Typed in every decoder. | CultNetDatabaseServer's authority path. | + +## 3. Operator questions + +**Rulings (operator, 2026-09-30):** "Q1: B / Q2: B / Q3: A / Q8: A". +- **Q1:** closed for emitters, open for readers. An unknown code decodes to a typed `Other`. +- **Q2:** per-code details. +- **Q3:** a nullable top-level `messageId`. +- **Q8:** v0 is corrected in place, with the semver bumps the policy requires. +- Q4-Q7 are still open. +- Cut 1 waits for `hands/cultmesh-put-serve-bound` to merge. + +### Q1. What does a reader do with an error code it does not know? + +Today Rust and TypeScript refuse the whole message. The probes above show the result: the peer's error text +is lost and the caller sees "not a recognized code". In cultmesh-rs's snapshot client the `?` at `lib.rs:812-815` +even turns a peer refusal into a local decode failure. So under a closed enum every new code breaks every +reader that has not upgraded. By `docs/semver-policy.md:86-91` that makes each new code a breaking wire +change, and nine codes are already in flight. + +- **A. Closed enum (today).** Readers refuse unknown codes. Every code addition is a coordinated, + semver-major wire change across all runtimes and consumers. +- **B. Closed for emitters, open for readers.** The schema keeps the registry, and every runtime's emit + constructors can produce only registry codes (tests prove each emit path valid against the schema). + Readers decode an unrecognized code (matching `^[a-z][a-z0-9_]*$`) into a typed `Other { code, details }`. + A new code is an additive, minor change: old readers still surface the text and know "an error I cannot + classify". This is how gRPC status codes and protobuf open enums behave. +- **C. Fully open.** No registry; any string, emit and decode. + +**Recommended: B.** A refusal must never fail to arrive because it is more specific than the reader +expected. B keeps the registry as the single meaning authority. C loses the meaning authority, and A makes +the error channel the most brittle message in CultNet. + +Depends on this: schema `code` shape, every decoder, the doc text at `cultnet-distributed-database.md:107-115`. + +### Q2. How are details shaped on the wire? + +Today C# writes all four detail keys (`field`, `value`, `asOf`, `current`), nil included, because +`CultNetErrorDetails` (`CultNetSchemaMessages.cs:592-603`) is a MessagePack map-mode object. The codes in +flight need new keys: `responseBytes`, `maxSnapshotBytes`, `documentCount`, `maxSnapshotDocuments` and +`schemaVersion`. + +- **A. One shared details record; grow it.** Every detail key of every code sits on one record, written as + nil when unused. Each new key changes the bytes of every existing error that has details, so all of the + C# vectors must be recaptured on every addition. It also breaks every strict reader: TS Ajv, and + StreamPixels' vendored schema, have `additionalProperties:false`. And the type cannot tie a key to its + code. +- **B. Per-code details.** `details` carries exactly the keys its code defines. A defined-but-optional key + is present as nil; another code's keys are absent. Keys are named for their meaning, which retires the + `field: "schemaId"` / `field: "subscriptionId"` indirection that exists only because the record is + shared. Adding a code never changes an existing code's bytes. In every runtime, code and details are + fused into one tagged type: + - Rust: an enum with data. + - C#: sealed subclasses, with a custom formatter for `CultNetErrorMessage`. There is precedent in + `src/GameCult.Mesh/CultMeshRouteRecordFormatter.cs`. + - TS: a discriminated union. + - Kotlin: a sealed class. + - Python: constructors per code over a frozen dataclass. + + The churn is one time. The five existing C# cases with details change bytes, and all eight Rust hex + cases move into the shared vector file anyway (Cut 1). +- **C. Opaque string map.** Untyped; no runtime can offer a typed accessor. + +**Recommended: B.** A is the churn the brief warned of, and it recurs on every future code. B pays it once, +at the moment every vector is being recaptured regardless. + +Depends on this: the schema's `details`, the C# model and formatter, `encode_error_details` +(`packages/cultnet-rs/src/contracts.rs:1339-1366`), and every decoder. + +### Q3. Does an error carry the `messageId` of the request it refuses? + +Python already sends `messageId` (`server.py:583`); the schema forbids it. Without it: + +- `cultmesh-browser` drops an error whenever two operations are pending (`index.ts:724-731`); +- C# content sessions fail every pending request on any error (`CultMeshContentSessions.cs:256-260`). + +Adding a top-level key changes the bytes of every C# error. That happens once, in the same recapture as Q2. + +- **A.** Add a nullable top-level `messageId`. A reply to a request echoes the request's id, and an error + with no request (a subscription push, an unsolicited refusal) sends nil. Receivers correlate by it and + fall back to their current behavior when it is nil. +- **B.** No correlation. Python deletes the field. + +**Recommended: A.** Correlation is a capability any multiplexing client needs, and one runtime already +depends on it. + +### Q4. Do servers send `document_unservable` (and every other refusal they can) to the peer? + +Self ruled that "unservable" must be distinguishable as a typed code in every runtime. On the branch: +Python sends it coded, TypeScript sends it codeless, and Rust tells only its local caller, so the Rust +peer times out. The same Rust silence covers every other document-server rejection: a sink refusal, a +failed snapshot source, too many snapshot documents, and a snapshot response that is too large. + +- **A.** Every refusal of a peer's request that the server can still send is answered with a coded error + carrying the request's `messageId`, and is also reported locally (Rust's `ApplicationRejected` stays as + the local report). The refusals that cannot be answered are the ones where the answer itself cannot be + queued: Rust `PayloadBudgetFull` and `ResponseQueueFailed`. Those stay local-only, and the doc says so. +- **B.** Local-only in Rust; peer replies only where a runtime already sends them. + +**Recommended: A.** R-2 already ruled that a silence is worse than a missing feature +(`docs/cultnet-selection-cut.md:2049-2053`), and the operator's ruling that CultMesh "refuses" puts only +means something to the party that sent the put. + +### Q5. Does Python's `unregistered_document_put` / `unregistered_document_delete` become `unowned_schema`? + +Python sends these when the node has no registered document type for the record's schemaId +(`cultmesh_py/node.py:653-666`). C# `unowned_schema` means "no shard owns this schema and key" +(`CultNetSchemaMessages.cs:537-544`). To a peer both mean "this server will not take that schema here; route +elsewhere". The put and delete variants duplicate what the peer already knows (it sent the message). + +- **A.** Both collapse into `unowned_schema { schemaId }`. The registry text broadens to "this server + stores no document for that schema (and key)". +- **B.** Join as a separate `schema_unregistered { schemaId }`. +- **C.** Join both codes as they are. + +**Recommended: A.** It is one meaning at the peer, and there is one action to take. + +### Q6. Does Python's `malformed_document_put` / `malformed_document_delete` become one `message_invalid { field }`? + +These are sent when the request lacks a required field (`server.py:355-359`, `383-387`). C# has the same +condition, codeless, at `CultNetDatabaseServer.cs:373/415` and `CultNetDatabaseSubscriptionServer.cs:148` +("requires a subscriptionId or messageId"). + +- **A.** One `message_invalid { field }`, naming the missing or ill-typed field. It is used by Python's four + sites and C#'s three. +- **B.** Join both per-message codes and leave C# codeless. + +**Recommended: A.** The per-message suffix repeats the request's own schemaVersion, and C# gains a code for +free. + +### Q7. Does `simulation_observations_disabled` become `unsupported_schema_version`? + +Python sends it when the observation hub is off (`server.py:593-598`), with +`details { schemaVersion: "cultnet.simulation_observation.v0" }`, which is exactly the +`unsupported_schema_version` shape. cultmesh-ts's "no cache for snapshot requests" and "no operation +handler" refusals (`index.ts:5875`, `5913`) mean the same thing: this server does not serve that message. + +- **A.** Collapse. `unsupported_schema_version` means "this server does not serve messages of this + schemaVersion: unknown, a newer version, or not enabled here". The three TS sites and Huginn's "answers + only X, Y, Z" adopt it. +- **B.** Keep a separate `feature_disabled`-style code. + +**Recommended: A.** A peer cannot act differently on "not enabled" and "not known". Python's +`verify.py:335` check follows the rename. + +### Q8. Is this a correction of `cultnet.error.v0` in place, or a new `cultnet.error.v1`? + +Under Q2-B and Q3-A, strict v0 readers (TS Ajv and vendored copies) refuse the new bytes. Tolerant readers +(C#, Rust, Python) keep working, because the probes show they ignore unknown keys and treat a missing key +as null. + +- **A. In place.** The v0 contract has never been decodable across all five runtimes (section 0). No + consumer outside CultLib reads code or details (finding 10). Every publishing package takes the semver + bump its policy requires: + - `org.gamecult.cultlib` major, because the public `CultNetErrorDetails` properties change; + - `cultnet-py` and `cultmesh-py` major, because emitted codes change; + - Rust pins move deliberately. + + StreamPixels and Heimdall re-vendor. +- **B. v1.** Add `cultnet.error.v1`, keep v0 emit for peers that did not advertise v1 in hello, and run + two error encoders in every runtime until v0 retires. + +**Recommended: A.** B builds a version-negotiation path for a message nobody outside CultLib parses beyond +`.error`. The one thing every old reader does need, the `error` text, survives A in every tolerant runtime. + +## 4. The registry (as recommended; rewrite on each ruling) + +| Code | Meaning | Details (per Q2-B; `?` = present-as-nil when absent) | Emitted by after this map | +|---|---|---|---| +| `selection_invalid` | A selection field failed the door. | `{ field, value? }` | C#, Rust (selection) | +| `cursor_stale` | The cursor predates the server's retained history. | `{ asOf, current }` | C#, Rust | +| `cursor_invalid` | The cursor could not be parsed. | none (details nil) | C#, Rust | +| `reference_outside_target` | A hop reference left the declared target. | none | C#, Rust | +| `variant_unsupported` | The selection selects a document variant CultNet does not carry. | `{ subscriptionId? }` | C# (incl. `DatabaseServer.cs:560`) | +| `unowned_schema` | This server stores no document for that schema (and key). | `{ schemaId }` | C#, Python (Q5) | +| `unsupported_schema_version` | This server does not serve messages of this schemaVersion. | `{ schemaVersion }` | Python, TS, Huginn (Q7) | +| `message_invalid` | The request lacks a required field or has an ill-typed one. | `{ field }` | C#, Python (Q6) | +| `snapshot_document_limit_exceeded` | The snapshot answer would exceed the document bound. | `{ documentCount, maxSnapshotDocuments }` | Python, Rust (Q4) | +| `snapshot_byte_limit_exceeded` | The snapshot answer would exceed the byte bound. | `{ responseBytes, maxSnapshotBytes }` | Python, Rust (Q4) | +| `document_unservable` | A put was refused because no snapshot could ever return the stored document under the byte bound. | `{ responseBytes, maxSnapshotBytes }` | Python, TS, Rust (Q4) | + +A null code is legal and means "unclassified". Examples: an exception message from a failed snapshot +source, an authority refusal carrying `routingHint`, and "not authorized" +(`CultNetDatabaseSubscriptionServer.cs:165`). This map does not invent codes for those. + +`snapshot_byte_limit_exceeded` and `document_unservable` have identical details. That is deliberate, and it +is the fixture trap named in the verification rules. + +--- + +## 5. Cuts + +All cuts are made on one campaign branch, `hands/error-contract`, from `main` after +`hands/cultmesh-put-serve-bound` merges. The branch merges to `main` once, after Cut 5's Soul pass. The +reason: Cut 1 changes C# bytes, and Rust's static hex cases would stay green against the stale bytes +(finding: `tests/error_message.rs` pins constants, not the reference). A partial merge would ship a +wire split while every suite passed. Each cut gets its own worktree, created by Self. Heavy verification +runs through `ygg-verify.sh`, never on Starfire. + +### Cut 0. Unblock the interop lane + +- **Repo/branch:** CultLib, `hands/interop-guard` from `main`, merged alone ahead of the campaign. It + does not depend on the rulings. +- **Deletes first:** nothing. +- **Per-file changes:** `.github/workflows/cultnet-interop.yml:72`. The `$stray` filter also accepts + `^packages/cultnet-rs/contracts/cultnet/`, with a comment naming R-AB and + `packages/cultnet-rs/tests/schema_discovery_contracts.rs:74-99` as the equality guard. The namespace + check is unchanged. +- **Authority map:** no ownership change. The canonical owner stays `contracts/cultnet/`, and the Rust + mirror is derived from it, with drift judged by the Rust test. +- **Verification:** + - Push the branch and run the workflow. Report every step that goes red after the guard. None of those + steps has run on main for 40 runs, so expect more red, and treat each failure as its own finding; + do not fix it in this cut. + - Negative: edit one byte of a vendored copy locally and check that the Rust equality test fails. + Reach it on Yggdrasil with `cd packages/cultnet-rs && cargo test --test schema_discovery_contracts`. +- **Ledger:** +3 lines. + +### Cut 1. The contract and the C# reference + +- **Repo/branch:** CultLib `hands/error-contract`, worktree named by Self. +- **First:** capture the current C# bytes for all eight factory cases, plus `cs_codeless` and `cs_routing`, + into the Hands report. This is the before-image a Soul pass compares against. +- **Deletes first:** + - `CultNetErrorDetails` (`src/GameCult.Networking/CultNetSchemaMessages.cs:588-603`, 16 lines) as a + shared record. + - The `field`/`value`/`asOf`/`current` property block and the `[MessagePackObject]`/`[Key]` attributes + on `CultNetErrorMessage` (`:497-521`). Its serialization moves to one formatter. + - `SoulP4dProbeTests.Wire_UnownedSchemaBytes` (`tests/GameCult.Networking.Tests/SoulP4dProbeTests.cs:191-199`). + It is an `[Explicit]` hex printer, superseded by the vector writer. + - The closed-enum paragraph at `contracts/cultnet/cultnet-distributed-database.md:107-115` and + the `code`/`details` descriptions in the schema (`:28-42`). +- **Adds:** + - **Schema** (`contracts/cultnet/cultnet.error.schema.json`, rewritten; the Rust mirror is re-copied + byte-equal): + - Top level: `schemaVersion`, `error` and `routingHint` as today, plus `messageId: string|null` (Q3) + and `code`. All five are required, present-as-nil (R-X is unchanged at the top level). + - `$defs/knownCode` is the registry enum from section 4. + - `code` is `null`, or a string matching `^[a-z][a-z0-9_]*$` (Q1-B). + - `details` is decided by a top-level `oneOf`, one branch per known code, each fixing `code` by + `const` and `details` by exact `properties`/`required`/`additionalProperties:false`. Two more + branches: a null code with null details, and an unknown code (`not: {$ref knownCode}`) with details + `object|null`, open. + - Use `oneOf`/`not`/`const` only. `tests/GameCult.Networking.Tests/MiniJsonSchemaValidator.cs:30-35` + implements those and **not** `if`/`then`/`allOf`, and it refuses unimplemented keywords. TS + compiles with Ajv2020 (`packages/cultnet-ts/src/contracts.ts:1,674`), which handles both. + - **C# model** (`GameCult.Networking`): + - `CultNetErrorMessage { SchemaVersion, Error, MessageId?, RoutingHint?, Refusal? }`, where + `Code => Refusal?.Code` is derived and not settable. + - `abstract CultNetRefusal { string Code }`, with one sealed subclass per registry code carrying its + typed details (`CultNetCursorStaleRefusal(ulong AsOf, ulong Current)` and so on), plus + `CultNetUnknownRefusal(string Code, IReadOnlyDictionary? Details)` for Q1-B. + - `CultNetErrorCodes`: string constants, one per registry code. + - `CultNetErrorMessageFormatter : IMessagePackFormatter`. It writes the five + top-level keys in order (schemaVersion, error, messageId, routingHint, code, details), and details + as exactly the refusal's keys. It reads by key name, tolerates unknown keys at both levels, and + maps an unknown code to `CultNetUnknownRefusal`. Register it through `[MessagePackFormatter]` on + the type, the way `CultMeshRouteRecordFormatter` is wired. + - Factories: keep `ForSelectionInvalid`, `ForCursor`, `ForReferenceOutsideTarget`, + `ForVariantUnsupported` and `ForUnownedSchema` as thin constructors over the refusal types, and add + one per new code. Each takes an optional `messageId`. + - `CultNetPeerErrorException : IOException`, carrying the `CultNetErrorMessage`. + - **Vector writer:** `ErrorVectorTests.WriteErrorVectors`, gated on `CULTNET_WRITE_VECTORS=1` like + `SelectionParityVectorTests.cs:460-552`. It writes `contracts/cultnet/interop/error-vectors.cs-written.json`: + one entry per registry code (both optional-key states where a key is optional), `cs_codeless`, + `cs_routing`, one unknown code with open details, and one error with `messageId` set. Each entry + holds `{ name, messagePackBase64, expected: { error, messageId, code, details, routingHint } }`, + where `expected` is a JSON projection every runtime compares its typed decode against. +- **Per-file changes** (`8fc74c70`): + - `CultNetDatabaseServer.cs:560`: `ForVariantUnsupported(refusal.Message, subscriptionId)`. + - `CultNetDatabaseServer.cs:373`, `:415` and `CultNetDatabaseSubscriptionServer.cs:148` become + `message_invalid { field: "subscriptionId" }` (Q6-A). + - Every `SendCultNet(CultNetErrorMessage...)` that answers a request passes the request's `MessageId`. + - Each receiver listed in finding 6 throws `new CultNetPeerErrorException(error)` instead of + wrapping `error.Error`. `CultMeshContentSessions.OnError` (`:256-260`) fails only the pending entry + whose id matches `error.MessageId`, and falls back to all entries only when the id is nil. + - `CultNetSchemaContractTests.cs:165-214`: the per-factory tests are replaced by one test that validates + every vector's decoded JSON against the schema with `MiniJsonSchemaValidator`, and one test that + serializes each registry factory and asserts byte equality with its committed vector. + - Rewrite `contracts/cultnet/cultnet-distributed-database.md` "Error Codes" to the registry, and state + the Q1 and Q2 rules. +- **Authority map:** + - Owner: the schema's registry owns code meaning and detail shape. `CultNetErrorMessageFormatter` owns + C# bytes. The refusal subclass owns the code-to-details binding. + - Inputs: the refusal instance, messageId, routingHint. + - Outputs: bytes, and `cs-written.json` for the other runtimes. + - Derived state: `CultNetErrorMessage.Code` becomes derived; the refusal decides it. + - Forbidden writers: any `Code = "..."` assignment (it cannot compile); `[Key]` attribute serialization + of the message; hand-typed hex anywhere. + - Shared paths: every server send uses the factories; every receiver uses `CultNetPeerErrorException`. + - Deletion line: `CultNetErrorDetails` and the settable `Code`. +- **Verification** (`dotnet` image): + - Builds: `tests/GameCult.Networking.Tests`, `tests/GameCult.Mesh.Tests`. + - `ErrorVectorTests` with `CULTNET_WRITE_VECTORS=1`, then without, and check that the committed file + reproduces byte-for-byte. + - Tests and the rules they pin: + - vector round trip: bytes, decode, bytes are equal for every entry; + - a registry factory is byte-equal to its vector; + - every vector validates against the schema; + - an unknown code decodes to `CultNetUnknownRefusal` with its raw details intact; + - a Python-shaped error (`py_snapshot_byte_limit` above, with the Q2/Q3 shape) decodes typed with + `responseBytes` and `maxSnapshotBytes` intact. Today's C# silently empties those. + - content-session correlation: two pending requests, an error for the second, and the first still + completes. + - Mutation: Stryker.NET on the formatter and factories. The survivors that must die: + - swapping two known codes whose details are identical (`snapshot_byte_limit_exceeded` and + `document_unservable`); + - padding a nil key into details; + - dropping `messageId` on encode; + - mapping an unknown code to null. + - Negative greps (checked at HEAD, where they hit the sites being cut): + - `git grep -nE 'new (IOException|InvalidOperationException)\(error\.Error\)' -- src` must return 0 + (9 hits at HEAD). + - `git grep -nE 'Field = "(schemaId|subscriptionId)"' -- src` must return 0 (2 at HEAD). + - Operator: none. +- **Ledger:** about -60 C# (the details record, the settable code, the probe printer, and the per-factory + schema tests), +250 (the formatter, the refusal types, the vector writer). The schema grows by about 90 + JSON lines. The net is positive, bought by Q1/Q2 typing in the reference. + +### Cut 2. Rust: cultnet-rs and cultmesh-rs + +- **Deletes first:** + - `CultNetErrorCode` and `CultNetErrorDetails` as separate types (`packages/cultnet-rs/src/contracts.rs:252-310`, + 59 lines); + - `require_error_details` (`:1121-1146`); + - `encode_error_details` (`:1339-1366`); + - the eight hex `Case`s and the header comment in `packages/cultnet-rs/tests/error_message.rs:1-160`. + That file is rewritten to read the vector file. + - Keep `require_legacy_optional_u64` (`:1149`). Check with `git grep` for other callers first; at HEAD, + only the error details use it. +- **Adds:** + - `CultNetMessage::Error { error: String, message_id: Option, routing_hint: Option, refusal: Option }`. + - `enum CultNetRefusal`, with one variant per registry code and its typed fields, plus + `Other { code: String, details: Option }`. + - `CultNetRefusal::code(&self) -> &str`. + - A constructor `CultNetMessage::error(text)` and builder-style `with_refusal` / `with_message_id`, so + consumers stop writing struct literals. Huginn has three. + - Decode reads every top-level key by name and routes unknown codes to `Other` (Q1-B). + - Encode writes the Cut 1 key order. + - `CultNetShardRoutingHint` is typed, reusing the crate's existing shard descriptor type. +- **Per-file changes:** + - `packages/cultnet-rs/src/contracts.rs:361-368` (variant), `:1097-1115` (decode), `:1300-1336` (encode). + - `packages/cultnet-rs/src/selection.rs:1210-1255`: the four refusals build `CultNetRefusal` variants. + - `packages/cultnet-rs/src/content.rs:316`: uses `CultNetMessage::error`. + - `packages/cultmesh-rs/src/lib.rs:812-827`: a peer error becomes a typed error carrying the refusal, + instead of `anyhow!` text. Name it `CultMeshPeerError`, next to the crate's existing error types. + - `packages/cultmesh-rs/src/rudp_document_server.rs` (Q4-A): each `CultMeshRudpRejectionReason` that + can be answered sends the matching coded error, correlated by the request's message id, before + returning `ApplicationRejected`. `PayloadBudgetFull` and `ResponseQueueFailed` stay local. +- **Authority map:** + - Owner: `CultNetRefusal` owns code and details. The schema owns the registry. + - Forbidden writers: string codes (`from_wire_str` survives only inside decode); struct literals of + details. + - Shared paths: selection refusals, document-server refusals and content errors all go through the one + encoder. +- **Verification** (`rust` image, `cd packages/cultnet-rs` then `cd ../cultmesh-rs`): + - `cargo test --workspace`. + - `tests/error_message.rs` pins: every vector decodes to `expected`; encoding the decoded value + reproduces the vector's bytes; the unknown-code vector decodes to `Other`; the routing vector keeps + `routing_hint`. + - cultmesh-rs: a put over the bound makes the peer receive `document_unservable` with the request's + message id, and details equal to the computed size and the bound. Run it at two bounds so that a + constant or an offset in `maxSnapshotBytes` dies. + - A peer that sends a Python-shaped `snapshot_byte_limit_exceeded` produces a `CultMeshPeerError`, not + a decode failure. + - Mutation: `cargo mutants --in-diff` on the cut's diff. Triage every survivor by name. + - Negative: `git grep -n 'CultNetErrorDetails' -- packages` must return 0. +- **Consumer note:** Huginn's `serve.rs:288/307/312` and its tests stop compiling at the next pin bump. + The migration is mechanical (`CultNetMessage::error(...)`), and `:312` adopts `unsupported_schema_version` + (Q7). Self routes it as a Huginn change; it is not part of this branch. + +### Cut 3. TypeScript: cultnet-ts, cultmesh-ts and cultmesh-browser + +- **Deletes first:** + - the two-field `CultNetErrorMessage` interface (`packages/cultnet-ts/src/contracts.ts:167-170`); + - the four literal error constructions in `packages/cultmesh-ts/src/index.ts:5875-5878`, `5885-5888`, + `5913-5916` and `5922-5925`, and the branch's codeless unservable site (`0eb7434a`); + - `rejectCorrelated`'s single-pending heuristic (`packages/cultmesh-browser/src/index.ts:724-731`). +- **Adds:** + - `CultNetErrorMessage` with every field. + - `type CultNetRefusal` as a discriminated union on `code`, with an `{ code: string; details: Record | null; known: false }` arm. + - `createCultNetError(text, { messageId, refusal })` as the only constructor. + - `class CultNetPeerError extends Error { message: CultNetErrorMessage }`. + - `parseCultNetMessage` keeps Ajv validation against the canonical schema; it now accepts every schema + branch, including unknown codes. +- **Per-file changes:** + - cultmesh-ts: the three "does not serve this" sites (`5875`, `5913`, `5922`) send + `unsupported_schema_version` (Q7-A); the snapshot catch (`5885`) sends a null code; the unservable site + sends `document_unservable` with details. + - cultmesh-ts `6527-6529` throws `CultNetPeerError`. + - cultmesh-browser `163`, `584` and `690`: correlate by `messageId`, falling back to today's behavior only + for a nil id. + - `packages/cultnet-ts/src/idunn-odin-presence-publisher.ts:118-120` throws `CultNetPeerError`. + - The legacy `gamecult.networking.v0` path (`contracts.ts:840-844`, `:899-900`) is unchanged. That is a + separate legacy contract. +- **Verification** (`kotlin` image, which carries Node 24; `npm install`, then build cultcache-ts before + cultnet-ts): + - A new `test/error-vectors.test.ts` pins that every vector parses and deep-equals `expected`, and that + `encode(createCultNetError(...))` is byte-equal to each registry vector. + - The cultmesh-ts document-server tests assert that each refusal parses with TypeScript's own + `parseCultNetMessage`. That is the probe's `ts_two_key` failure, pinned. + - Browser: two pending operations, an error for the second, and the first still resolves. + - Mutation: StrykerJS on the diff. + - Negative: `git grep -nE 'schemaVersion: "cultnet\.error\.v0",' -- packages/cultmesh-ts/src packages/cultmesh-browser/src` + must return 0. Exclude `cultnet-ts/src/schema-discovery.ts:302` (a descriptor) and + `contracts.ts:842` (legacy decode); both are legitimate hits for the unscoped pattern. + +### Cut 4. Python: cultnet-py and cultmesh-py + +- **Deletes first:** + - `_error_response` (`packages/cultmesh-py/src/cultmesh_py/server.py:573-589`); + - `unsupported_schema_version_error` (`packages/cultnet-py/src/cultnet_py/interop_peer.py:409-417`); + - every string literal code in `server.py` (lines in finding 3). +- **Adds:** + - `cultnet_py/errors.py`, holding: + - `CultNetErrorCode(StrEnum)`, the registry; + - a frozen `CultNetError` dataclass (`error`, `message_id`, `routing_hint`, `code: CultNetErrorCode | str | None`, + `details: Mapping | None`); + - one constructor function per code, taking exactly that code's keys; + - `to_wire()`, which writes the five top-level keys in the Cut 1 order, nil included; + - `parse_cultnet_error(dict)`. + - `CultNetPeerError` (`client.py:46-50`) keeps `.response` and gains `.error: CultNetError`. +- **Per-file changes:** + - Sites `server.py:158-163`, `355-394`, `555-569` and `593-598` and the branch's `document_unservable` + site use the constructors, with the Q5-A/Q6-A/Q7-A codes. + - `interop_peer.py` uses the constructor. + - `verify.py:335` reads `error.error.code`. + - Tests `packages/cultmesh-py/tests/test_cultmesh.py:2088`, `3791`, `4323` and `4363-4371`, and + `packages/cultnet-py/tests/test_cultnet.py:2342`, follow the renames. +- **Verification** (the image the campaign already uses for Python; state it in the report): + - A vector test pins that every vector parses to `expected` and that each constructor's `msgpack.packb` + is byte-equal to its vector. + - Mutation: mutmut on `errors.py` and the changed server sites. + - Negative: `git grep -nE '"schemaVersion": "cultnet\.error\.v0"' -- packages/cultnet-py/src packages/cultmesh-py/src` + returns only `errors.py`. +- **Not here:** F-1 (`schema_catalog.py` publishes its own shapes). + +### Cut 5. Kotlin: cultmesh-kotlin + +- **Adds:** + - A `CultNetErrorMessage` data class and a `sealed class CultNetRefusal` (known codes plus `Other`), + with a `CultNetMessage.asError(): CultNetErrorMessage?` view. + - `class CultNetPeerException(val error: CultNetErrorMessage) : IOException`. + - At `CultMesh.kt:1278` and `:1334`, and at every `receiveSchemaMessage` consumer that expects a + response, an error response throws `CultNetPeerException` before the `require`. +- **Verification** (`kotlin` image, `pwsh -File build.ps1`): + - A vector test pins that every vector decodes to `expected`. + - Kotlin emits no errors today, so encode parity applies only if a Kotlin server path is added. Say + so in the report; do not invent one. + - There is no mutation tool. Behavioural tests cover it: an error reply to a schema-catalog request + raises `CultNetPeerException` carrying the code. + +### Cut 6. Merge, release, consumers + +- Soul runs over the whole branch before the merge: + - rerun every vector suite; + - decode each runtime's live emissions with every other runtime. The interop lane from Cut 0 is the + harness; add an error round to `tests/GameCult.Networking.InteropPeer` and + `packages/cultnet-ts/test/interop` if Soul finds a runtime pair unreached. +- Release per `docs/semver-policy.md`, with a Soul pass before tags: + - `org.gamecult.cultlib` major, and the tracked Unity DLLs rebuilt, since they embed the schema; + - `cultnet-py` and `cultmesh-py` major. +- Consumers, routed by Self as separate repo changes: + - Huginn: pin bump plus Cut 2's note. + - StreamPixels and Heimdall: re-vendor. Heimdall is already broken by R-X. + - AetheriaEve, Gjallar and Mimir compile against the live CultLib path and read only `.Error`, so they + need no change. That is inferred from the audit; the next build of each confirms it. + - Hermodr: none. + +## 6. Subtraction ledger + +| Cut | Removed (estimate) | Added (estimate) | Formats / targets | +|---|---|---|---| +| 0 | 0 | 3 | none | +| 1 | ~60 C#, schema text | ~250 C#, ~90 schema | + `error-vectors.cs-written.json`; - `[Explicit]` hex printer | +| 2 | ~150 (types, two helpers, 160-line hex test) | ~200 | hex constants gone; vectors read from file | +| 3 | ~40 | ~120 | none | +| 4 | ~40 | ~120 (`errors.py`) | 8 ad-hoc codes → registry | +| 5 | 0 | ~80 | none | + +The net is positive, by roughly 500 lines, across five runtimes. It buys typed decode where there was +none (Kotlin, TS and Python), a correlation capability, and one vector file in place of hand-copied hex. +The pressure point: if Cut 1's formatter passes 150 lines, report it rather than trimming typing. + +## 7. Follow-ups outside this map + +- **F-1.** `packages/cultnet-py/src/cultnet_py/schema_catalog.py` publishes about 350 lines of hand-built + schemas under canonical `$id`s. Python should package and serve `contracts/cultnet/*.schema.json`, the + way Rust vendors them. It is a separate cut, because it covers every message, not errors. It can wait + because the catalog is advisory: no runtime validates a peer's message against a published descriptor. +- **F-2.** Codes for the remaining codeless refusals (authorization, failed snapshot sources, routing). + Wait for a consumer that branches on them. +- **F-3.** Whatever the Cut 0 lane reveals once its later steps run again. diff --git a/docs/cultnet-rudp-ack-cut.md b/docs/cultnet-rudp-ack-cut.md new file mode 100644 index 00000000..1b519484 --- /dev/null +++ b/docs/cultnet-rudp-ack-cut.md @@ -0,0 +1,1637 @@ +# CultNet RUDP: Acknowledged means delivered, one watermark owns ordered delivery, and a write belongs to its session + +**PIVOT, 2026-09-30 (operator): RUDP is retired in favour of QUIC.** Operator: "RUDP really ballooned into +maintaining a robust custom transport across runtimes, when it started as just 'hey, let's do LiteNetLib but +better'. Is there any point maintaining it when we have QUIC?" and then "Yeah, pivot to QUIC adoption, I ain't +gonna let sunk costs take the wheel." +- **Landed 2026-09-30: Cut D, merged at `2f06ef84`** (Soul passes 1-4, batch 5 closing pass 4). It fixes live crashes: a spoofed datagram crashing Node, a malformed frame + killing Python's server, C# stale peers corrupting sessions. +- **Parked, not built:** Cut F, Cut 2 (held on F), Cut 4, Cut K and K1 (including the Kotlin resend-loop gap), Cut 7 + and the receipts port. Nothing of theirs exists to tag, so this map is their record. +- Defects found in RUDP from here on are fixed only if they are live crashes or data loss, until the QUIC campaign + sets RUDP's retirement. +- **Data-loss item from Odin Soul S-5 (2026-09-30).** At Odin's pin `3bf1c0ce`, cultnet-rs records a reliable + packet as received when it arrives, and `create_ack` reports it while ordered delivery still holds an earlier + packet. + - Probe: two pipelined puts, with the first datagram dropped. The second put was ACKed but not on disk. If the + first never arrives, the ACKed second put is never delivered. + - Sessions that carry a single put are safe. + - **Checked (Odin Q5 Imagination, probe P1 at `e4e2a0b9`): still open after ack Cuts 1-1c.** A held, undelivered + put is ACKed, so the pin bump does not close it, and it is a data-loss fix under the pivot rule. Related, P2: a + Pong ACKs a put received before the Ping; P3: a reliable reply created after a put ACKs it. The Odin writer-thread + cut (C5) adds `acknowledgement_withheld` to the document server; the transport fix belongs in cultnet-rs. +- The "CultNet over QUIC" campaign is new, so it opens as a typed Eureka campaign in the Huginn-backed session, not + as a prose map here. + +Status: cut map, Imagination pass 3, 2026-09-30. Pass 3 maps the four rulings below, re-maps Cuts 1c and +4, and adds Cut F (FORWARD-TSN), Cuts 6a-6c (receipts), Cut 7 (expiry, if Q-A8), Cut K (Kotlin), Cut 2c (the +C# fragment bound) and Cut D (a failed send to one peer stays that peer's loss). The text of Cuts 1, 1b, 2 +and 3 is pass 2's; Hands are executing Cuts 1 and 1b (`hands/ack-cut1`) and Cut 2 (`hands/ack-cut2`) from +it. One thing moves for them: Cut 2 merges only together with Cut F (the Cut 2 Soul finding below). + +**Rulings (operator, 2026-09-30).** +- **Q-A1 (a):** Delivered is derived at the sender from a correct receiver's cumulative watermark. The + acknowledgement wire does not change. (Cut F adds one notice to the wire; it carries abandonment, not + delivery.) +- **Q-A2:** "I think this is telling us we don't actually need both received and delivered." + - There is one public meaning: Acknowledged means delivered. + - Receipts go Pending, then Acknowledged (delivered), or Invalidated. No public Received state exists. + - Retransmission still stops on each packet's own ack, so resending stays bounded. + - Flush waits for Acknowledged. +- **Scope added from the stray-packet Soul passes 3 and 4:** session generation. One rule: a write belongs + to the session it was issued in. Mapped as **Cut 1b** (the ending rule) and **Cut 1c** (how a new + generation is recognised), separate from Cut 1 (§8 says why). +- **Q-A3 B:** FORWARD-TSN (RFC 3758) now. On expiry the sender sends an abandonment notice, Ack-typed with + flag `0x10` so old peers ignore it. New receivers treat the sequence as received with no frame and + acknowledge it. The notice's resend has its own bound. A new wire cut in every receiver, before Cut 4. + Mapped as **Cut F** (§6). The recommendation was A; the operator chose B. (Supersedes pass 2's Cut 4 + expiry half, which assumed A.) +- **Q-A4 A:** port per-send receipts (Pending, Acknowledged, Invalidated, and a wait for Acknowledged) to C#, + TypeScript, Python and Kotlin in this campaign, after Cut 4. Mapped as **Cuts 6a-6c** and **K4** (§9). + The recommendation was B. +- **Q-A5 A:** Kotlin is in, as trailing **Cut K**, verified on a Kotlin image added to Yggdrasil first + (Cut K0). +- **Q-A6 A:** the Connect's sequence identifies the session; the default initial sequence becomes random in + [1, 2^31), as TCP's ISN. No wire change; the public default changes. Cut 1c is no longer blocked on a + question. +- **Cut 2 Soul finding (2026-09-30):** Cut 2's never-evict rule refuses a session whose sender expires + fragmented reliable frames (the default Rust `media` channel). Pass 3 absorbs it: Cut F's receiver drops + every incomplete fragment set a notice covers; Cut 2 merges only together with Cut F; C# gets the bound + it never had (Cut 2c). What a receiver does with a sender that never sends notices is **Q-A9**. +- **Ruled after pass 3 (operator, 2026-09-30), each the recommendation:** + - **Q-A7 A:** a notice names one sequence, not a cumulative point. + - **Q-A8 A:** C#, TypeScript, Python and Kotlin gain reliable expiry (Cut 7, K5). + - **Q-A9 B:** a capability bit on Connect and Accept; Cut 2's never-evict rule applies only to peers + that advertise it, and other peers keep pre-Cut-2 eviction. + Cut F is unblocked once Cuts 1 and 3 merge; the text below mapped these answers already. + +- **Body.** CultLib `main` at `e9469cb3`. Every transport file is byte-identical to `3bf1c0c` there + (`git diff 3bf1c0c e9469cb3 -- src packages` is empty), so every `file:line` below is against both unless + it names another revision. + - Odin `origin/main` (`5c37860`) pins `3bf1c0ce` (`crates/odin-core/Cargo.toml:14-17`). A stale local + checkout at `379b826` still shows `a8aeddac`; read Odin's pin from `origin/main`. + - Pass 3 probes: `3e2c7efb` (FN) and `c6f1012c` (CAP) on the Yggdrasil mirror `probe3` (§ Probe + evidence, pass 3). +- **Base of every cut.** `main` at `e9469cb3` or later. +- **Scope.** The RUDP session and socket transports in all five runtimes: C# + `src/GameCult.Networking/CultNetTransport.cs`, Rust `packages/cultnet-rs/src/rudp.rs` (plus + `packages/cultmesh-rs`), TypeScript `packages/cultnet-ts/src/rudp.ts` (plus the two hand-rolled + publishers and `cultmesh-ts`'s document server), Python `packages/cultnet-py/src/cultnet_py/transport.py` + (plus `cultmesh-py`'s server), and Kotlin + `packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt` (Cut K). +- **Wire.** One addition, in Cut F: an Ack packet with flag bit 4 (`0x10`) is an abandonment notice for the + sequence in its sequence field. Every current decoder ignores the bit and every current session ignores + an Ack's sequence field (P7, re-probed as FN in pass 3 in all five runtimes). If Q-A9 is B, the same bit + on Connect and Accept advertises support (probe CAP: old peers ignore it there too). Nothing else changes + on the wire. Cut 1c changes the default initial sequence, which is a value, not a format. + + +## The ends (operator, 2026-09-30) + +- A frame the peer has buffered but not delivered must not look delivered. Today an ordered frame that + arrives behind a gap is held and acknowledged; if the session ends it is lost, and the sender saw + "Acknowledged". +- Resending stays bounded. The sender stops retransmitting a packet when the peer acknowledges that packet, + exactly as today. Delivery-only acknowledgement was rejected: "I don't like the possibility of unbounded + resending on an unresponsive peer application. TCP sounds like it has the right idea." +- One public meaning: **Acknowledged means delivered** to the peer's application boundary (§2). Unordered + reliable frames are delivered on receipt. Receipts go Pending, then Acknowledged, or Invalidated. +- A write belongs to the session it was issued in. When that session ends, a write not yet Acknowledged is + Invalidated. It is never carried into, retransmitted in, or acknowledged by a later session. + + +## The finding that shapes this map + +Self's first proposal put a second acknowledgement on the wire: a per-channel "delivered through N" +watermark beside the received ack. Probing the receivers changed the picture in two ways. + +**1. The ordered receivers are broken in every runtime, and the break is bigger than the session-end case.** +A held frame is not only lost at session end. In a live session it can be stranded forever, or dropped, +while the sender sees it acknowledged. The per-channel `next` pointer (`CultNetTransport.cs:918`, +`rudp.rs:196`, `rudp.ts:160`, `transport.py:424`, `CultMesh.kt:2643`) has been patched twice (`436654de` +added the first-use initialisation, `4335ab10` added the skip over other channels' sequences) and is still +wrong: + +- **P1: a gap filled by another channel strands the ordered channel.** Ordered `o1`, reliable `u` on + another channel (lost), `o2`, `o3`. When `u` arrives, only `u`'s channel is drained. `o2` and `o3` are + never delivered, and the sender's pending set is empty. The same holds with two ordered channels (P1b). +- **P6: a channel first used after other traffic loses frames.** `C1`, `C2` on a new channel, then `X` on + another. `X` arrives, then `C2`, then `C1`. The channel initialises its `next` from + `min(highest+1, frame)`, so `C2` is delivered first and `C1` is **dropped as old** + (`frame.sequence < next`). It was acknowledged. +- Both reproduce at `3bf1c0c` in C#, Rust, TS and Python (pass 2), and did at `d85877a7`, Odin's old pin + `a8aeddac` and Muninn's pin `c2a9a6e5` (pass 1). + +**2. Once the receiver is correct, "delivered" is not new information.** A conforming receiver holds an +ordered frame for exactly one reason: some reliable sequence below it has not arrived. When the last +missing sequence arrives, the same `Receive` call drains the held frames, before the acknowledgement is +built. So: + +> An ordered frame is delivered exactly when every reliable sequence up to its last one has been +> acknowledged. + +The sender already knows that. It is the sender's own **acknowledged-through** watermark: one below the +lowest sequence that is still pending, queued or abandoned. TCP's cumulative ACK means the same thing, +"every byte below N is in the receive buffer", and it sits beside SACK. Here the sender can compute the +cumulative value itself, because every sequence is acknowledged individually and removed from its pending +set. The operator ruled this (Q-A1 a), and then ruled that the per-packet ack is not a public meaning at +all (Q-A2): it only stops retransmission. + +The derivation is sound only if nothing the receiver acknowledged is later dropped while the session +lives, and nothing one session acknowledges is credited to another. The probes found these places where +that fails: + +| # | Where an acknowledged frame is lost, or credited to the wrong session | Runtimes | Fixed by | +|---|---|---|---| +| P1, P1b | A cross-channel gap strands the ordered channel | all five | Cut 1 | +| P6 | Late channel initialisation drops the earlier frame | all five | Cut 1 | +| P5 | A reliable fragment set is evicted after its fragments were acknowledged | Rust, TS, Python (C# and Kotlin have no eviction) | Cut 2 | +| P8 | A retransmit more than 4,096 sequences behind the receiver's highest counts as a duplicate: acknowledged and dropped | all five | Cut 3 (the sender never lets its span reach it) | +| G2 | After `connect()` again on the same transport, a new server session's frames are duplicates of the old one's sequences: acknowledged and dropped | C#, Rust, TS, Python | Cut 1c | +| G3 | A write left owed when a session ends is retransmitted into the next session and delivered there, and in Rust its receipt reads `Acknowledged` | Rust (local `disconnect()`, timeout); C#, TS, Python (every ending) | Cut 1b | + +And places where the sender loses track, or is locked out, without the receiver's help: + +| # | Sender-side lie or lockout | Runtime | Fixed by | +|---|---|---|---| +| G1 | A restarted client on the same endpoint and Connect payload gets an Ack, never an Accept, and stays unconnected | Rust hub, C# listener and C# server mode, TS and Python server mode (Rust server mode resets on every Connect instead) | Cut 1c | +| G1b | C# and Python server-mode transports drop a Connect from any endpoint but the first, so a client that restarts on a new port is locked out for good | C#, Python | Cut 1c | +| P2 | An expired reliable packet leaves a permanent hole. Ordered frames after it are held forever, and `flush_reliable` succeeds (outstanding 0) | Rust (the only runtime with reliable expiry) | Cut F (FORWARD-TSN, Q-A3 B); Cut 4 reports it honestly where a receiver never acknowledges the notice | +| P9 | A receipt for an expiring send reads `Acknowledged` once the packet expires unacknowledged | Rust | Cut 4 | +| P10 | `send_reliable` with a full window queues the frame, then returns an error ("receipts require a non-empty reliable packet set"), so a caller that retries sends it twice | Rust | Cut 4 | + +And two faults found by Soul passes during pass 3: + +| # | Fault | Where | Fixed by | +|---|---|---|---| +| D1 | One peer whose datagrams cannot be sent fails every poll for every peer: the first failed `send_to` aborts `maintain` and `poll_once` (Odin Soul pass) | cultmesh-rs document server, Rust hub, C# listener; the cultmesh-py server's thread dies | Cut D (§10) | +| F2 | After Cut 2, a sender with reliable expiry pins one reliable fragment set per lossy frame, and the 65th refuses the session (Cut 2 Soul pass, default Rust `media`) | Rust, TS, Python receivers with Cut 2 | Cut F releases the sets; Cut 2 merges with it; Q-A9 for senders without notices | + + +## Probe evidence + +Everything ran on Yggdrasil through `ygg-verify.sh`, from local-only probe branches in throwaway +worktrees. Each probe commit survives on the Yggdrasil mirror as `refs/verify/`. + +Pass 1 (base `d85877a7` and the pins; mirror `CultLib-imag-ack`): + +- `de2bdfe8`, `09318d13`, `03eac6ff`: Rust session and socket probes (`packages/cultnet-rs/tests/probe_ack.rs`). +- `b70a69ca`, `2320a4e5`, `7fe5d726`: the C#, TS and Python probes (`ProbeAckTests.cs`, + `probe-ack.test.ts`, `probe_ack.py`). +- `f0e7136c`: the Rust probes at Odin's old pin `a8aeddac`. `bf8fc826`: all four at Muninn's pin `c2a9a6e5`. +- `db7d2886`: **the prototype**, the Rust receiver rebuilt on one watermark plus sender-derived receipt + states (about +130/−125 in `rudp.rs`). Its `Received`/`Delivered` receipt states are superseded by Q-A2; + its receiver is what Cut 1 builds. + +Pass 2 (base `3bf1c0c`; mirror `CultLib-imag-ack2`): + +- `a383e27d`, then `1519a20a` (the C# server-mode G1 probe acknowledges the Accept before the restart, so + it tests a restart and not a lost Accept): the pass-1 probe files restored unchanged, plus + `packages/cultnet-rs/tests/probe_gen.rs`, `packages/cultnet-ts/test/probe-gen.test.ts`, + `packages/cultnet-py/tests/probe_gen.py` and `tests/GameCult.Networking.Tests/ProbeGenTests.cs`. +- Rust and C# G1 run over real loopback UDP (hub, listener, server-mode transport), with the restarted + client bound to the first client's exact address. Python G1 runs over UDP against the server-mode + transport. TS G1 calls `acceptConnect` on the connected session, which is what the socket transport does + for a same-endpoint Connect (`rudp.ts:1034-1049` calls it without a reset, and `rudp.ts:249-251` answers + it as a repeat). G2 and G3 are session-level: the socket transports' `connect()` is `create_connect` and + nothing else (`rudp.rs:1874-1883`, `CultNetTransport.cs:1836-1846`, `rudp.ts:891-897`, + `transport.py:994-998`). + +| # | Probe | Pass 1 (`d85877a7`, pins) | Pass 2 (`3bf1c0c`) | Prototype `db7d2886` | +|---|---|---|---|---| +| P1 | `o1`, reliable `u` lost, `o2`, `o3`; then `u`, then `o3` | Delivered `[o1, u]`; `o2`, `o3` never; sender pending `[]`. Rust, C#, TS, Python; same at both pins | Same, all four | `[o1, u, o2, o3]` | +| P1b | `A1`, `B1` (second ordered channel) lost, `A2`, `A3` | `[A1, B1]`, all four | Same, all four | `[A1, B1, A2, A3]` | +| P6 | `C1`, `C2` on a new channel, then `X`; arrival `X`, `C2`, `C1` | `[C2]`; `C1` dropped. All four | Same, all four | `[C1, C2, X]` | +| P2 | Rust: reliable media with expiry 1 ms, lost; then `s1`, `s2` on `schema` | Nothing delivered. Sender outstanding 0, expired 1, no resends | Same | Unchanged (held behind the hole). Cut 4 makes the sender say so | +| P3 | `s1` lost, `s2` arrives and is acknowledged | `s2` not delivered, but acknowledged: sender pending `[s1]` only | Same | Receipt for `s2` stays short of delivered until `s1` arrives | +| P4 | Rust: `s0` delivered, `s1` lost, then a 5 MiB ordered frame in 60 kB fragments | `RUDP ordered hold buffer is full`: the session is refused. With no gap, delivered | Same | The prototype held every ordered frame, so a 5 MiB frame was refused **even with no gap**: hold only what is not yet deliverable (Cut 1) | +| P5 | 3-fragment reliable frame, 2 fragments acked; 70 lossy fragment sets; last fragment arrives | Rust, TS, Python: never delivered, sender pending `[]` | Same, Rust, TS, Python | Unchanged (Cut 2) | +| P7 | An Ack with flag bit `0x10`, a nonzero sequence field, or a 5-byte payload | Decoded and applied in Rust, C#, TS, Python | Same, all four | n/a | +| P8 | Reliable `g` lost while 4,200+ later sequences are sent and acked; then `g` arrives | `g` not delivered, and acknowledged. All four | Same, all four | Unchanged (Cut 3) | +| P9 | Rust socket: `send_reliable("media")` with expiry 1 ms, never read | `Pending`, then `Acknowledged` | Same | `Pending` | +| P10 | Rust socket: 40 `schema` sends, then `send_reliable` | Error "receipts require a non-empty reliable packet set", after the frame was queued | Same (the probe's `?` fails on that error) | Not addressed (Cut 4) | +| G1 | Client A connects, sends one ordered frame (acknowledging the Accept), and exits. Client B, a fresh session with the same initial sequence, binds A's exact address and sends the same Connect payload five times | n/a | **Locked out.** Rust hub (payload `"svc"` and empty): 5 Acks, 0 Accepts, B unconnected, the hub still holds A's generation. C# listener: same, no `PeerDisconnected`. C# server mode: 5 Acks. Python server mode: 5 Acks. TS session: the answer is an Ack. Rust server mode (control): B gets an Accept and its frame is delivered, because it resets on every Connect | Not probed | +| G1b | C# and Python server mode: a third client on a new port sends a Connect | n/a | No reply; the datagram is counted dropped | Not probed | +| G2 | Client connects to server 1 (initial sequence 1) and receives `old1..3`. Server 1 is gone; the client connects again on the same session to server 2 (initial sequence 1), which sends `new1`, `new2` | n/a | **`new1`, `new2` never delivered, and acknowledged** (server 2's pending set empties). C#, Rust, TS, Python | Not probed | +| G3 | Client sends one ordered write that is lost; the session ends; the client connects to a new server; the client's resends run | n/a | Owed after the end, and **delivered in the next session**: C#, TS, Python on peer Disconnect, local disconnect and timeout; Rust on local disconnect and timeout. Rust on peer Disconnect: owed 0, nothing delivered (`5f1e883d`) | Not probed | +| G3R | Rust socket: `send_reliable`, the write is lost, `disconnect()`, `connect()` on the same transport to a new peer | n/a | Receipt `Pending` after the disconnect; the write is delivered to the new peer; **receipt `Acknowledged`** (the Soul R1 shape) | Not probed | + +Pass 3 (base `e9469cb3`, transport files identical to `3bf1c0c`; mirror `probe3`, commits `3e2c7efb` for FN +and `c6f1012c` for CAP): + +- `packages/cultnet-rs/tests/probe_fn.rs`, `packages/cultnet-ts/test/probe-fn.test.ts`, + `packages/cultnet-py/tests/probe_fn.py`, `tests/GameCult.Networking.Tests/ProbeFnTests.cs` and + `packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/ProbeFn.kt`. +- Images: `eureka-verify-rust`, `mcr.microsoft.com/dotnet/sdk:10.0`, `node:24`, `python:3.12`, and for + Kotlin `eclipse-temurin:21-jdk` with `kotlin-compiler-2.2.21.zip` fetched in the job (the recipe Cut K0 + bakes into an image). + +| # | Probe | Result at `e9469cb3`, all five runtimes | +|---|---|---| +| FN | Sender `a` sends ordered `o1`, `o2`, `o3`; `o2` is lost, so the receiver `b` holds `o3`. `b` sends reliable `x`, which `a` receives. `a` then sends the Cut F notice exactly as specified: `create_ack()` encoded, flag byte `\|= 0x10`, sequence field = `o2`'s sequence. `b` decodes and receives it; then `o2` arrives late | **Old receivers ignore the notice and apply its acks.** It decodes as an Ack; `b`'s pending `[501]` (`x`) empties, so the header's acks were applied; nothing is delivered; `reply` is empty; `b` stays connected; `o2` is **not** marked received (not in `b`'s ack or mask). The late `o2` then delivers `[o2, o3]`: the hole was untouched. Identical in Rust, C#, TypeScript, Python and Kotlin | +| FN-T | Transport path (code, not run) | Every socket transport acks only a reliable, Accept or Data packet, or (TS, Python, Kotlin) one whose receive delivered a frame (`rudp.rs:2152-2155`, `:1713-1715`, `CultNetTransport.cs:2281-2283`, `:2787-2788`, `rudp.ts:1089-1091`, `transport.py:1086-1088`, K:3243-3245). An old receiver delivers nothing on a notice (FN), so the notice draws no reply datagram and is not counted dropped. Every transport already forwards a session's `reply` (`rudp.rs:2135-2137`, `:1708`, `CultNetTransport.cs:2277-2278`, `:2748-2749`, `rudp.ts:1067-1068`, `transport.py:1070-1071`, K:3229, `rudp_document_server.rs:334-336`, `cultmesh-ts/src/index.ts:5828-5830`, `operation-service.ts:186`, `cultmesh-py/.../server.py:246-247`), which is how a new receiver answers a notice | +| CAP | Q-A9 B's capability bit on old peers: `a`'s Connect and `b`'s Accept are each encoded, given flag bit 4, and decoded before delivery; then `a` sends one ordered frame (`probe_cap.rs`, `probe-cap.test.ts`, `probe_cap.py`, `ProbeCapTests.cs`, `ProbeCap.kt`) | **Old peers ignore the bit on the handshake.** Both sides connect, the frame is delivered, and the Connect is acknowledged (the sender's pending holds only the data frame). Identical in all five runtimes | +| K-img | Kotlin self-tests on Linux | `kotlinc-jvm 2.2.21` on OpenJDK 21.0.12 compiles `CultMesh.kt` plus a probe file, and `java -cp out.jar:kotlin-stdlib.jar org.gamecult.cultmesh.CultMeshKt` (the self-tests, K:3349-3373) exits 0 | + +**Suites on the prototype `db7d2886`** (pass 1; baseline `03eac6ff` was all green): + +- `cultnet-rs`: 110 + 4 + 24 pass; `tests/cultnet.rs` 51 pass and 2 fail. Both failures are test shape, + not mechanism: + - `rudp_session_suppresses_duplicates_and_delivers_reliable_ordered_payloads_in_sequence` + (`tests/cultnet.rs:1000`) hands the receiver an Accept with sequence 91 from a sender whose data starts + at 1. That handshake is impossible. Under a watermark seeded by the Accept, every data sequence is + "already below" it. The test must use a consistent handshake. + - `rudp_ordered_channel_tracking_is_bounded` (`:2655`) sends 256 ordered channels with no gap. The + prototype keeps state only for channels with held frames, so nothing is refused. The bound becomes + "channels with held frames", and the test must hold frames behind a gap. +- `cultmesh-rs` did not compile only because the prototype added a status variant. Under Q-A2 the status + enum keeps its three variants, so that break does not recur. + +**Wire compatibility (P7).** Every decoder ignores flag bits 4-7 and byte 35. Every session ignores an +Ack's sequence field and payload (`CultNetTransport.cs:1177`, `rudp.rs:578-592`, `rudp.ts:397`, +`transport.py:612`, `CultMesh.kt:2738`). Every decoder rejects an unknown packet type +(`CultNetTransport.cs` `Enum.IsDefined`, `rudp.rs` `packet_type_from_code`, `rudp.ts:1313`, +`transport.py:1212`, `CultMesh.kt` `fromCode`) and an unknown version byte. So: + +- An additive field fits in an Ack: flag bit 4 set, the value in the Ack's unused sequence field, zero + extra bytes. Old peers apply the ack and ignore the rest. Q-A1 ruled out a watermark there; Cut F puts + the FORWARD-TSN notice there (Q-A3 B), and pass 3's FN probe confirms the old-peer behaviour in all five + runtimes. +- A new packet type or a version bump is not additive: old peers refuse the datagram and count it dropped. +- Cut F's notice needs no negotiation to be safe: it reads as a plain ack to every current peer. Q-A9 asks + whether to advertise support anyway, for the receiver's sake (§6). + + +## Authority map + +- **Owner of ordered delivery (receiver): the session's contiguous received-through watermark `R`.** + - Every reliable sequence up to `R` has been received since the peer state was last reset. + - A held ordered frame whose first sequence is at most `R + 1` is delivered, in sequence order, in the + same call that advanced `R`. + - `R` is seeded by the handshake. `AcceptConnect` seeds it with the Connect's sequence, and receiving + the Accept seeds it with the Accept's sequence. A session connected without a handshake (Rust + `assume_connected`, `rudp.rs:243`, test-only today) seeds it from its first reliable packet. + - It advances in `RememberReceived` and resets with the rest of the peer state (`ResetPeerState`). +- **Owner of retransmission (sender): the pending and queued sets**, as today. A sequence leaves them when + an ack names it. Retransmission stops there. This is not a public meaning. +- **Owner of abandonment (sender, Cut F): the abandoned set.** An expired sequence is announced by notices + until an ack names it or 16 sends pass; then it is stranded (`first_stranded`). The receiver's `Abandon` + branch is the only path that marks a sequence received without its packet, and it drops every incomplete + fragment set the sequence falls in. +- **Owner of Acknowledged (sender): the acknowledged-through watermark `A`**, one below the lowest sequence + that is pending, queued, awaiting its abandonment notice's ack, or stranded in the current generation. An ordered send is Acknowledged when `A` + reaches its last sequence. A reliable unordered send is Acknowledged when every one of its sequences is + acked. +- **Owner of the session boundary: the session's generation.** One primitive ends a generation: the + session stops being connected, every write not yet Acknowledged is Invalidated and dropped from pending + and queued, and the generation counter advances. Every ending path calls it: a peer's Disconnect, a + local disconnect, a timeout and a refused packet (Cut 1b), and from Cut 1c a client's `connect()` on a + session that already had a peer, and a server accepting a Connect that does not repeat the current one. + - What was learned from the peer (`R`, the received set, held frames) is forgotten only where both sides + start fresh: a refusal (as today) and, from Cut 1c, a non-repeated handshake. Forgetting it at a + one-sided ending (a timeout the peer did not see) would let the peer's retransmits be delivered twice. +- **Owner of "is this Connect a repeat": the session**, from the Connect's sequence (Cut 1c; Q-A6). +- **Inputs.** Received sequences and handshake packets (receiver); acks, expiry and ending events + (sender). Nothing else. +- **Outputs.** Delivered frames, in order (receiver). Receipt status and flush completion (sender). +- **Derived, not owners.** + - The per-channel `next` map is **deleted**, not demoted: `_orderedNextSequenceByChannel` + (`CultNetTransport.cs:918`), `ordered_next_sequence_by_channel` (`rudp.rs:196`), + `#orderedNextSequenceByChannel` (`rudp.ts:160`), `_ordered_next_sequence_by_channel` + (`transport.py:424`), `orderedNextSequenceByChannel` (`CultMesh.kt:2643`). + - `expectedSequenceIfUninitialized` and its equivalents are deleted (`CultNetTransport.cs:1151`, + `rudp.rs:540`, `rudp.ts:375`, `transport.py:595`, `CultMesh.kt:2728`). + - `PendingOrderedFrame.NextSequence` is deleted (`rudp.rs:160-163` and equivalents). + - `OutstandingReliablePacketCount` stays, and means "not yet acked in this generation". It is a + retransmission count, not a delivery claim. + - Rust `session_scope: Uuid` (`rudp.rs:135`, `:179`, `:206`, rotated at `:345` and `:601`) is no longer an + owner. It is replaced by the generation (Cut 1b) and then by receipts resolved at their source + (Cut 4). + - TS `#generation`, `#endedGeneration` and `#endGeneration` in the socket transport (`rudp.ts:830-831`, + `:937-940`) are no longer owners; the session's generation replaces them. + - `DisconnectReason` / `disconnect_reason` / `#endedReason` are report-only: why the last generation + ended. They no longer gate flush. +- **Forbidden writers.** + - No path delivers an ordered frame except the drain after `R` advances. + - No receive path drops a frame whose sequence it acknowledged while the generation lives. + - No sender path reports Acknowledged except through `A` (or the unordered rule). + - No ending path leaves a write owed. No path retransmits a write, or sends a notice, into a generation + after the one it was issued in. + - No path marks a sequence received without a packet, except the `Abandon` branch (Cut F). + - No per-peer send failure ends a poll, a loop, a thread or another peer's session (Cut D). + - No transport decides whether a Connect repeats: not by payload (Rust hub `rudp.rs:1637-1647`, C# + listener `CultNetTransport.cs:2670-2688`), not by `Connected` (C# `:2226-2236`, Python + `transport.py:1047-1053`, TS `rudp.ts:249-251`, `:1031-1049`), not by server key or payload + (cultmesh-rs document server `rudp_document_server.rs:413-427`, cultmesh-ts document server + `index.ts:5794-5802`), and not by resetting on every Connect (Rust server mode `rudp.rs:2105-2116`, + cultmesh-py server `server.py:225-240`). +- **Shared paths.** Accept, reliable data, fragments, duplicates and retransmits all advance `R` through + `RememberReceived` and then call the drain. Direct sends, fragmented sends, queued promotion and resends + all feed the pending and queued sets that `A` reads. Every ending path goes through the one generation + primitive. +- **Deletion line.** `DeliverOrdered`, `DrainOrdered` and `SkipReceivedNonChannelSequences` and their + equivalents go before the drain is added: `CultNetTransport.cs:1628-1700`, `rudp.rs:1138-1246`, + `rudp.ts:737-800`, `transport.py:868-920`, `CultMesh.kt:2939-2978`. The transport-level repeat decisions + above go before the session's is added. + + +## The design, question by question + +### 1. Where Acknowledged comes from (Q-A1 a, ruled) + +- Derived at the sender from `A` (§ The finding). No wire change. +- **Why it is sound after Cuts 1-3.** A conforming receiver: + - drops nothing it acknowledged while the session lives (P1, P6: Cut 1; P5: Cut 2; P8: made unreachable + by Cut 3); + - holds an ordered frame only while a sequence below it is missing (Cut 1); + - drains held frames in the call that fills the last gap, before it acknowledges (Cut 1). + - So every sequence up to `s` acked means `s` was delivered. +- **And after Cuts 1b and 1c,** an ack can only be credited to the generation that issued the write + (G3, G2). +- **Mixed versions.** A new sender with an old receiver can be wrong only when that receiver strands a + frame (P1, P6). That needs reliable traffic on more than one channel of one session. The C#, TS, Python + and Kotlin socket transports send reliably only on `schema` (`CultNetTransport.cs:2372-2376`, + `rudp.ts:1254-1262`), so they cannot trigger it. Rust sends reliable `media`/`audio` too + (`rudp.rs:2523-2562` `channel_send_options`). The pass-1 Eyes survey found no live session that mixes + those with `schema`: Muninn's media session carries no `schema` traffic, and neither does Sleipnir's HID + stream. The old receiver loses such frames today in any case. Bumping the pin is the fix. +- **Every Odin-bound publisher's receiver is Odin.** Acknowledged means delivered for Idunn health, + presence and catalog publishing only once Odin pins a CultLib with Cuts 1-3. + +### 2. What "delivered to the application" means + +- **Delivered means the frame left the session's hold and was handed to the transport's application + boundary.** That boundary is: + - C#: enqueued in the socket transport's `_deliveredFrames` (read by `TryReceiveOnce`), or returned in + `CultNetRudpReceiveResult.Delivered` from a bare session; + - Rust: pushed to `delivered_frames` (`rudp.rs:2147`) or the hub's `pending_events`, or handed to the + document server's sink (`cultmesh-rs/src/rudp_document_server.rs:343-360`), which acknowledges only + after the sink accepted; + - TS: the `"frame"` event was emitted (`rudp.ts:1076-1082`); + - Python and Kotlin: the delivered queue. +- **It is not "consumed".** The operator rejected application-driven acknowledgement, and TCP's cumulative + ACK has the same boundary: in the receive buffer, readable, not read. +- A listener or sink that throws or rejects has still been delivered to. The handler-rejection paths from + the stray-packet work end the session, which is the application's answer, not the transport's. + +### 3. The public API (Q-A2, ruled: one meaning) + +- **Rust receipts** (the only runtime that has them today; §9 ports them to the other four): + - `CultNetRudpReliableSendStatus` keeps its three variants, `Pending`, `Acknowledged`, `Invalidated` + (`rudp.rs:146-150`). No variant is added, removed or renamed. `Acknowledged` changes meaning from + "every packet was acked" to "delivered". + - The visible difference: an ordered send behind a missing sequence reads `Pending` until the gap + fills (P3), where today it reads `Acknowledged`. + - Every external caller already means delivered, so none changes code: `cultmesh-rs/src/lib.rs:832` + and `:892`, `tests/rudp_stray_packets.rs:309`, `cultmesh-rs/tests/rudp_document_server.rs:408,415`, + CodexConnector `src/idunn_health.rs:727-745`, Ghostlight + `crates/ghostlight-dungeon/src/idunn_health.rs:1126-1145`. + - **A receipt is resolved once, by its session.** It becomes `Acknowledged` when `A` passes its last + sequence (ordered) or when all its sequences are acked (unordered). It becomes `Invalidated` when its + generation ends first. After that it never changes. + - Mechanism: the receipt carries its sequences, whether it was ordered, and a shared status cell + (`Arc`). The session keeps the unresolved cells, at most one per outstanding send, and + writes each once. `reliable_send_status(&receipt)` (`rudp.rs:1931-1936`) reads the cell; its + signature does not change. + - This deletes the session scope (`rudp.rs:135`, `:179`, `:206`, `:283-285`, `:291-293`, `:345`, + `:601`) and needs no history of ended generations. Today a delivered write reads `Invalidated` after + any reset, because the scope rotates (`rudp.rs:291-293`). The pass-1 design needed a frozen snapshot + of one ended epoch and still misreported older ones. + - `PartialEq` on the receipt compares its sequences, which are unique within a session object because + issued sequences survive resets. + - `send_reliable` receipts cover queued packets (P10). The receipt lists every sequence the send + assigned, not only the ones admitted to the wire (`send_many`, `rudp.rs:456-528`, returns only the + admitted ones; `non_expiring_reliable_receipt`, `:305-318`, refuses an empty set). + - `send_reliable` refuses a channel with reliable expiry (P9). The comment at `rudp.rs:1915-1916` says + this lineage has no expiry, which is false since `bac5be88`. Restore the guard it describes. + - New: `CultNetRudpSocketTransportConnection::wait_acknowledged(&receipt, timeout) -> Result<()>`. It is + the ack wait: it pumps receive and resends like `flush_reliable` and returns when the receipt is + `Acknowledged`. It fails at once when the receipt is `Invalidated`, naming the end reason. It replaces + the hand-rolled loops at `cultmesh-rs/src/lib.rs:806-838` and `:870-900`; CodexConnector and + Ghostlight may adopt it at their next bump, and their existing polling stays correct without it. +- **Flush: one wait, and it means every send of this generation is Acknowledged.** + - A flush belongs to the generation it started in. It fails when that generation ends, whatever comes + after. Rust binds it to the scope today (`rudp.rs:2001-2014`) and TS to its transport generation + (`rudp.ts:911-935`). C# (`CultNetTransport.cs:1914-1931`) and Python (`transport.py:1101-1124`) check + only the disconnect reason, which the next Connect clears (`CultNetTransport.cs:1843`, `:2235`; + `transport.py:997`, `:1054`). Once Cut 1b drops owed writes at every ending, "outstanding is 0" after a + reconnect would read as success, so every runtime binds flush to the session's generation in Cut 1b. + - When every sent sequence is acked, `A` is the highest sequence sent, so every send is Acknowledged. + Under Cut F an abandoned sequence is resolved by its notice's ack, so flush waits for that too. The + only exception is a stranded sequence (a notice the receiver never acknowledged). There + `flush_reliable` (`rudp.rs:1992-2040`) fails at once when an ordered send follows it: that send can + never be Acknowledged, and today flush reports success (P2). + - C# `FlushReliable`, TS `flush`, Python `flush_reliable` and Kotlin `flushReliable` + (`CultMesh.kt:3186`) keep their success condition. Their contract text becomes "every reliable frame + sent in this session has been delivered to the peer's application". These runtimes have no expiry + unless Q-A8 gives them some (Cut 7). +- **Defaults.** Plain flush. No parameter. No second flush. +- **Compatibility.** No signature changes in any runtime except additions (`wait_acknowledged`; TS + `connectAndWait`, §4; the receipts of §9, where C# and Kotlin `SendSchema*` return a receipt instead of + nothing, which is source-compatible). The Rust enum is unchanged. No downstream caller has to change code at its next + bump. + +### 4. Consumers, each assigned + +Surveyed across `F:\Projects` in pass 1; the rows that moved are re-checked at the revision named. Every +consumer that waits wants delivered, which is now just Acknowledged. + +| Consumer | What it waits on today | Change | +|---|---|---| +| `cultmesh-rs/src/lib.rs:781-838` `request_raw_snapshot_from_rudp_catalog` (Idunn `src/drivers.rs:5527` uses it) | a hand-rolled loop until `Acknowledged`, then the response | Cut 4: `wait_acknowledged` | +| `cultmesh-rs/src/lib.rs:870-900` `publish_cultnet_message_to_rudp_catalog` (Odin `odin-daemon`) | a hand-rolled loop until `Acknowledged`, then disconnect. The doc at `:869` claims "application admission" | Cut 4: `wait_acknowledged`; the doc says delivered to the document server's sink (`rudp_document_server.rs:343-372`) | +| `cultmesh-rs/src/lib.rs:918-938` `publish_cultnet_messages_to_rudp_catalog` (Ghostlight `mesh.rs:323`) | `flush_reliable`, then drop. **Several ordered frames, then close** | None; flush now means it | +| `cultmesh-ts/src/index.ts:6070-6098` `publishRudpDocumentOnce` (Heimdall, StreamPixels, Stonks, weksa, Bifrost, VoidBot, Hermodr) | `peer.flush` (`cultnet-ts/src/peer.ts:109-110`), then close | None. Cut 5 moves its connect-and-wait helper (`index.ts:6603-6650`) into cultnet-ts | +| `cultnet-ts/src/idunn-odin-presence-publisher.ts:89-215` `publishDocument`, behind `createIdunnRuntimePresencePublisher`. **StreamPixels' service runs this**: `apps/service/scripts/idunn-entry.mjs` runs `deployment/idunn/runtime-presence.mjs`, which calls `createIdunnRuntimePresencePublisher` (`:46`) from its vendored CultLib `542ddd3` (StreamPixels `a49f7d8`; pass 2's `30ee8b9` is stale), where it lives under its older name `cultnet-ts/src/idunn-runtime-authority.ts:206` | a hand-rolled session loop (`:186-208`) until `outstandingReliablePacketCount === 0`. It does resend (`:205`). It drops `readyToSend` (`:198`), so promoted queued packets wait for the resend timer. It pins `initialSequence: 1` (`:103`) and never sends a Disconnect, so Odin's hub keeps each publish's peer until it times out (each publish binds a new port, so each is a new peer) | Cut 5: the socket transport, `connectAndWait`, `send("schema")`, `flush`, `close` (which sends the Disconnect, `rudp.ts:956-969`) | +| `cultnet-ts/src/signed-daemon-health.ts:104-162` `publishSignedDaemonHealth` (Hermodr, Odin `idunn-rudp.cjs`) | a hand-rolled loop: sends the packets `sendMany` admitted, waits up to 500 ms for the **first** Ack packet of any content (`:146-153`), swallows the timeout, closes. Resends run inside that wait (`:303`) but promoted queued packets are never sent | Cut 5, as above. Today a write not acked within 500 ms, or any payload over 32 packets, is reported published | +| `cultnet-ts/src/operation-service.ts` | the operation response | none (the response is the proof) | +| C# `FlushReliable` callers: Gjallar `Program.cs:3055-3080` (two ordered frames, flush, dispose) | flush | None | +| Heimdall `src/idunn-rudp-health.ts:55-87` (vendored CultLib `b6b1d9c`, Heimdall `d5acc94`) | the first Ack packet | Heimdall's own cut at its bump: call cultnet-ts's publisher after Cut 5 | +| CodexConnector `idunn_health.rs:727-745`, Ghostlight `idunn_health.rs:1126-1145` | `Acknowledged` | None required. Optional `wait_acknowledged` at their next bump | +| Muninn `main.rs:9446-9458`, Sleipnir `main.rs:880-904` | nothing (send and drop) | Follow-up: fire-and-forget health can be silently lost | +| Kotlin `flushReliable` | no callers | Contract text only | + +### 5. The hold buffer and the 4 MiB cap + +- **It belongs here**, because the held frame is exactly the state this map names. +- **Mechanism (P4).** Rust caps held ordered frames at 1,024 frames and 4 MiB (`rudp.rs:47-48`, checked + at `:1181-1187`). A refusal ends the session. The default payload limit is 16 MiB (`rudp.rs:33`). With + one lost packet under a large ordered transfer, a legal 5 MiB frame is refused and kills the session. + - The sender's window counts pending packets, not span or bytes (`rudp.rs:910-942`). While one packet + stays lost, acked packets keep freeing slots, so the held data behind the gap grows without limit. +- **Fix: a sender-side flow window, TCP's receive window without a wire field** (Cut 3). A reliable + packet is admitted to the wire only while: + - its sequence is at most 1,023 above the lowest unacked sequence; and + - the payload bytes of sequences above the lowest unacked one stay within 4 MiB, with at least one + packet always admissible. + - Otherwise it waits in the existing queue. +- **What this buys:** + - a conforming sender never makes a Rust receiver hold more than 4 MiB, so the cap stops refusing legal + traffic; + - a conforming sender never gets 1,024 sequences ahead of the receiver's highest, so the Rust far-ahead + refusal (`rudp.rs:46`, checked at `:626-630`) never drops its packets; + - a conforming sender never leaves a sequence 4,096 behind the receiver's highest, so P8 cannot happen. + The receive-history window stays 4,096 in every runtime (`CultNetTransport.cs:884`, `rudp.rs:35`, + `rudp.ts:20`, `transport.py:404`, `CultMesh.kt:2625`). +- **What is kept.** The cap and the far-ahead refusal stay. They protect against hostile peers. +- **Rejected:** raising the cap to the payload limit or above (16-64 MiB per hostile session instead of + 4); lowering the ordered payload limit to 4 MiB (an API regression for large snapshots). +- **Cost.** Normal flow never has a span beyond the 32-packet window, so the new limits bind only while a + packet is lost. +- **Old senders** (the pinned and vendored ones) can still trip the Rust cap until they bump. +- **Not in scope.** C#, TS, Python and Kotlin receivers have no hold cap. Follow-up. + +### 6. Reliable expiry and FORWARD-TSN (P2; Q-A3 B, ruled) + +- **The hole.** Only Rust has reliable expiry (`rudp.rs:39`, `:898-908`; the Python README's claim of + expiry at `packages/cultnet-py/README.md:103-111` is false, `transport.py` has none). An expired packet's + sequence never reaches the receiver, `R` stops below it, and every ordered frame after it on the session + is held until the session ends. +- **Who expires.** Every Rust `media` sender that does not opt into lossy delivery: the profile's media + delivery defaults to Reliable (`channel_delivery`, `rudp.rs:2515-2521`) and its expiry to 75 ms + (`rudp.rs:39`, set on the client and hub transports at `:1303` and through the profile at `:1548-1549`). + Media frames fragment. Muninn's reliable `audio` also expires; `hands/media-fec-cut3` deletes that profile + entry and moves Muninn's media to lossy delivery, but the default stays reliable-with-expiry for every + other caller. + +**What RFC 3758 does, and what this map keeps.** + +- The sender treats an abandoned chunk as "finally acked and no longer outstanding" (§3.5 A2) and advances + an `Advanced.Peer.Ack.Point` over consecutive abandoned TSNs. When that point passes the peer's + cumulative ack it sends FORWARD TSN (C1-C3), and tries again whenever T3-rtx expires (A5). +- FORWARD TSN carries a **New Cumulative TSN** plus (stream, stream sequence) pairs. The receiver "MUST + consider any missing TSNs earlier than or equal to this value as received" (§3.2), advances its + cumulative point, releases the listed streams' reordering queues, and acks "as if a DATA chunk had been + received" (§3.6). A FORWARD TSN at or behind its cumulative point is out of date, changes nothing, and + still draws a SACK. +- PR-SCTP is negotiated: an endpoint that did not see Forward-TSN-Supported in the peer's INIT must never + send FORWARD TSN (§3.1, §3.3). + +**How CultNet adapts it.** + +- **The notice names one sequence, not a cumulative point.** SCTP's SACK is cumulative, so a cumulative + FORWARD TSN is confirmed by the next SACK. CultNet's ack is not: it names the highest received sequence + plus a 32-bit mask, or one exact older sequence (`create_ack_for_received`, `rudp.rs:751-758`). A + cumulative notice could not be confirmed by that ack, which would mean a second wire field. So each + abandoned sequence gets its own notice, and the receiver answers it with the ack a reliable data packet + with that sequence would draw. That ack removes the sequence from the sender's abandoned set exactly as it + removes a data packet from pending. **Q-A7** puts the cumulative alternative to the operator. +- **No stream pairs.** One watermark `R` owns ordered delivery for every channel (Cut 1), so advancing `R` + and draining releases every channel's held frames. There is nothing per channel to name. +- **Negotiation: only if Q-A9 is B.** The ruling puts the notice in an Ack so an old peer reads it as an + ack (FN), and bounds the resend: an old receiver never acks the notice, and the sender stops after a + fixed number of sends. The Cut 2 Soul finding adds a reason to negotiate after all (Q-A9): a *receiver* + needs to know whether its peer will ever send notices. If Q-A9 is B, the sender also sends notices only + to a peer that advertised the bit (RFC 3758 §3.3), and an old receiver's sequence is stranded at once + instead of after the bound. The abandoned sequence is then *stranded*: the Cut 4 honest + report applies to it (ordered sends after it stay Pending, become Invalidated at the end, and flush fails + fast). That is the behaviour ruling A would have given everywhere; under B only old receivers get it. + +**Wire.** Packet type `4` (ack), flag bit 4 (`0x10`, "abandon"), and no other flag bit. Sequence field: the +abandoned sequence. Ack and ack mask: the sender's current ack state, so the notice is also a genuine ack. +Channel `control`, fragment fields `0`, empty payload. Decoders map type 4 with bit 4 to a new packet type, +**`Abandon`** (Rust `CultNetRudpPacketType::Abandon`, C# `CultNetRudpPacketType.Abandon`, TS `"abandon"`, +Python `CultNetRudpPacketType.ABANDON`, Kotlin `CultNetRudpPacketType.Abandon`), and the encoder maps it +back. Bit 4 on any other type is ignored, as today. No public packet struct gains a field, and no +downstream repo constructs packets or matches the type exhaustively (surveyed: Muninn tests compare +`== Data`; Mimir `CultMeshMedia` compares `Connect` and `Accept`). + +**Golden** (added beside the existing fixture in every runtime and in `docs/cultnet-transport-parity.md` +after the canonical fixture, `:505-517`): + +```text +packetType=abandon (wire: type 4, flags 0x10) +connectionId=0x01020304 +sequence=0x0000002a +ack=0x00000029 +ackMask=0x80000001 +channelId=control +payload=(empty) +hex=434e52300004102b010203040000002a0000002980000001000000000000000000000700636f6e74726f6c +``` + +**Sender (Rust now; any runtime that gains expiry under Q-A8).** + +- An expired packet, pending or queued, leaves the pending and queued sets as today and enters an + **abandoned set**: sequence, sends so far, last sent. It is due at once. +- `due_resends` emits a fresh notice for each due entry (built from the current ack state, not stored), + once per resend delay. After `RUDP_ABANDON_NOTICE_SENDS = 16` sends without an ack the entry leaves the set + and the session records the lowest such sequence as **`first_stranded`**. Sixteen sends at the default + 250 ms is four seconds. At 50% loss in each direction a round trip fails with probability 3/4, and all + sixteen with about 1%; at 20% each way, about 10^-7. The bound is for deaf receivers, not bad links, and + a new receiver that misses every notice degrades to the honest report, never to a lie. +- Any ack naming the sequence removes it from the abandoned set. That ack means the receiver holds the + sequence, from the original packet arriving late or from the notice; either way it is no longer a hole. +- Notices take no send-window slot and no payload bytes. For Cut 3's span rule, an abandoned sequence with + an outstanding notice counts as unacked (the receiver's `R` is held below it); a stranded one does not + (an old receiver has no `R` to hold, and counting it would stop the session after 1,023 more sequences). +- `outstanding_reliable_packet_count` counts abandoned entries, so a flush waits for their notices. +- The session-ending primitive (Cut 1b) and `reset_peer_state` clear the abandoned set and + `first_stranded`: they belong to the generation. + +**Receiver (all five runtimes).** + +- `receive` handles `Abandon` after applying its acks, as RFC 3758 §3.6 does: + - outside `[highest − 4,095, highest + 1,024]`: far-ahead is ignored without remembering (as Rust data + is, `rudp.rs:626-641`), far-behind is a duplicate; + - every incomplete fragment set whose sequence span contains the sequence is dropped (a set's span is + `sequence − fragment_index` for any fragment it holds, for `fragment_count` sequences), whether or not + the sequence was received: that frame can never complete; + - if the sequence was not received, it is remembered through `RememberReceived`, which advances `R` + (Cut 1), and held frames up to `R + 1` drain into `delivered`; + - `reply` is `create_ack_for_received(sequence)`, whether or not anything changed (the out-of-date case + still acks). +- Transports send the reply as they already do, and skip their own ack for an `Abandon` packet + (`rudp.ts:1089`, `transport.py:1087`, K:3243 would otherwise ack it a second time when the drain + delivered). + +**Interaction with the other cuts.** + +- **Cut 1 (`R`).** The notice is the only receive path besides data and Accept that calls + `RememberReceived`; it shares the drain. A late original of an abandoned packet is then a duplicate: acked + and dropped, as PR-SCTP drops it. +- **Cut 1b (ending).** An abandoned entry is a write of its generation; the ending primitive drops it. No + notice is ever sent into a later generation. +- **Cut 1c (generations).** A stale notice from an earlier generation of the same sender carries a + sequence below the new generation's Connect (issued sequences survive resets), so it is a duplicate. A + stale notice from a dead process on the same endpoint and connection id could mark a sequence of the new + process's session, exactly as a stale data packet can be delivered into it today; the random initial + sequence makes both land inside the 5,120-sequence acceptance range with probability about 2^-18. +- **Cut 2 (fragment eviction), from the Cut 2 Soul pass.** Cut 2 never evicts a reliable fragment set and + refuses the session when every pending set is reliable. Its claim that a conforming sender cannot reach + the 64-set bound is **false for an expiring sender**: fragment 0 arrives and is acked, the deadline drops + the rest, and the set is pinned for the session. Soul reproduced the refusal on the 65th lossy default + `media` frame (`soul_probe_expiring_reliable_frames_kill_receiver`, `packages/cultnet-rs/tests/cultnet.rs:3192` + at probe `3be97b34`). Before Cut 2, eviction kept that session alive. + - **With a Cut F sender** the notice for each dropped fragment lands inside the set's span and the + receiver drops the set: the rule above, explicitly "every incomplete set whose span covers a notified + sequence". Dead sets then live one round trip, not the session. + - **With a sender that never sends notices** (every build before Cut F) the receiver cannot tell an + expiring set from a set whose missing fragment is still coming. **Q-A9** decides what the receiver does + then; its recommendation is PR-SCTP's own answer, a capability bit on Connect and Accept (RFC 3758 + §3.1, Forward-TSN-Supported): Cut 2's never-evict rule applies to a peer that advertised it, and the + pre-Cut-2 stalest-set eviction stays for a peer that did not. + - So Cut 2 does not merge alone: it merges together with Cut F, which carries the capability and the + gate (§ Sequencing). +- **Cut 4.** Reads `first_stranded` where pass 2 read `first_abandoned`, and counts outstanding notices as + not yet Acknowledged. + +### 7. Interaction with the merged stray-packet work + +The ack cuts build on these behaviours and do not alter them: + +- A refusing session ends, and its goodbye is built after the reset (`EndRefused` + `CultNetTransport.cs:1315-1319`, `end_refused_session` `rudp.rs:364-367`). The refused sequence is never + acked, so a refusal never becomes a false Acknowledged. +- Issued sequences survive a reset in every runtime (`rudp.rs:341-343`, `CultNetTransport.cs:1292-1308`, + `rudp.ts:214-227`, `transport.py:458-471`). Cut 1c relies on it: a client's second Connect always + carries a new sequence. +- One Accept per generation, and a repeated Connect answered with the Accept still owed, or an Ack. Cut 1c + keeps the answer and moves the decision of what repeats into the session. +- An ended session fails its flush. Cut 1b generalises the TS and Rust binding to the generation into all + four runtimes. +- `5f1e883d` made a peer's Disconnect end Rust receipts (`rudp.rs:596-615`) and removed the + transport-level Pending→Invalidated override. Cut 1b makes the other ending paths agree with it. +- The TS operation service's expiry and handler rejection are above the transport and do not change. + +### 8. Session generation: why it is two cuts, and how a new one is recognised + +- **Why not inside Cut 1.** Cut 1 is a receiver change with a deletion line: one watermark replaces five + per-channel state machines. Its falsifiers are P1, P1b and P6. The generation work touches the ending + paths, the handshake, flush and receipts, and its falsifiers are G1-G3. Both touch `ResetPeerState` and + the Accept path, which is a merge cost, not a shared owner. Keeping them apart lets Soul falsify each + against its own probes. +- **Why two cuts.** The ending rule (Cut 1b) is ruled and needs no mechanism choice: every ending path + drops what it owed. How a new generation is recognised (Cut 1c) needs one (Q-A6). The two are separable + because 1b does not forget peer state: the peer may not know the session ended, and forgetting what was + received would let its retransmits be delivered twice. + **Correction (Cut 1/1b Soul, 2026-09-30): they are separable as specs, not as merges.** 1b drops owed + writes, which leaves holes the sender will never fill; the receiver keeps `R` across the ending, so if the + next handshake does not reset it, every later ordered frame is held and acked, and flush succeeds while + nothing is delivered. Only 1c's reset on a non-repeated handshake removes that. **1b merges only together + with 1c.** Soul also found `R` seeded by the first reliable packet rather than the handshake; ruled: + `R` is seeded only by the handshake, and reliable data before the Accept is neither acked nor delivered. +- **What must hold after both.** A write is Acknowledged or Invalidated within the generation it was + issued in. A restarted client is admitted. A new server session's frames are delivered after a + reconnect. A retransmitted Connect is still a repeat. +- **Recognising a new generation (Cut 1c, Q-A6 A, ruled).** The Connect's sequence identifies the + generation, and the initial sequence is random by default, as TCP's initial sequence number is + (RFC 9293 §3.4.1, RFC 6528). + - A Connect repeats exactly when it carries the sequence of the Connect that started the current + generation. Its retransmits do; a client's second `connect()` cannot, because issued sequences + survive resets; a restarted process almost never does, because it drew a fresh random initial + sequence. + - A stale duplicate of the accepted Connect, delayed in the network, still repeats: same sequence. + - Anything else ends the current generation and starts a new one, at both ends: the client forgets peer + state when it sends a Connect on a session that had a peer, and the server when it accepts a Connect + that does not repeat. + - A client honours an Accept only while its Connect is pending, and only if the Accept's ack field names + that Connect. A stale Accept from an earlier generation cannot seed `R`. + - The initial sequence is drawn from [1, 2^31), which leaves at least 2^31 sequences before the + exhaustion error (`rudp.rs:944-962`) in every runtime. An explicit `initial_sequence` still works, for + tests. + - The Connect payload stays application evidence (the provider layer's `clientSessionId`, + `cultnet-rs/src/provider_session.rs:70-79`), carried to the application as today. It no longer decides + anything in the transport. + +### 9. Receipts in C#, TypeScript, Python and Kotlin (Q-A4 A, ruled) + +- **One design, ported.** Cut 4 builds it in Rust: a receipt carries the sequences its send assigned, + whether it was ordered, and a status cell the session writes once. The session keeps the unresolved + receipts and resolves them after every ack it applies (Acknowledged: ordered when `A` reaches its last + sequence, unordered when every sequence is acked) and in the ending primitive (Invalidated). The four + ports copy that shape; none invents a second one. +- **What every runtime has to change first** (the receipts survey, `e9469cb3`): + - `SendMany`/`sendMany`/`send_many` returns only the packets admitted to the 32-packet window + (`CultNetTransport.cs:1439-1465`, `rudp.ts:586-592`, `transport.py:776-786`, K:2856-2862). A receipt + must be built from every sequence the send *assigned*, queued ones included, which is Rust's P10. + - `ApplyAcknowledgements` only deletes from the pending map (`CultNetTransport.cs:1503-1516`, + `rudp.ts:610-617`, `transport.py:803-807`, K:2882-2889). Resolution hooks in after it. + - Invalidation needs the ending primitive. C#, TS and Python get it in Cut 1b; Kotlin in K2. +- **Where the receipt lives.** On the single-peer socket transport connection, as in Rust + (`CultNetRudpSocketTransportConnection::send_reliable`, `rudp.rs:1903-1930`). The Rust hub has no + receipts, so neither do the C# listener (`CultNetRudpSocketTransportServer`, `:2487`), `cultmesh-ts`'s + document server or `cultmesh-py`'s server. Hub receipts are a follow-up for all five together. +- **Public API, per runtime.** Every runtime's RUDP surface is synchronous-with-timeout except TypeScript's, + which is Promise-and-event. Each port matches its own runtime: + +| | Send | Receipt | Status | Wait | +|---|---|---|---|---| +| Rust (Cut 4) | `send_reliable(&mut self, channel, payload) -> Result` | `packet_sequences()` | `reliable_send_status(&receipt) -> CultNetRudpReliableSendStatus` | `wait_acknowledged(&receipt, timeout) -> Result<()>` | +| C# (6a) | `CultNetRudpSendReceipt SendReliable(string channelId, byte[] payload)`; `SendSchema(...)` and `SendSchemaMessage(...)` return the receipt instead of `void` (source-compatible) | sealed class, `IReadOnlyList PacketSequences` | `receipt.Status` (`CultNetRudpSendStatus { Pending, Acknowledged, Invalidated }`), read without the transport | `void WaitAcknowledged(CultNetRudpSendReceipt receipt, TimeSpan? timeout = null)`, the `FlushReliable` loop (`:1914-1955`); throws `InvalidOperationException` naming the end reason when Invalidated, `TimeoutException` at the deadline | +| TypeScript (6b) | `sendReliable(channelId: string, payload: Uint8Array): CultNetRudpSendReceipt`. `send` keeps `void`, because the transport interface declares it (`transport.ts:132-142`) | `readonly packetSequences: readonly number[]` | `receipt.status: "pending" \| "acknowledged" \| "invalidated"` (string union, as packet types are) | `waitAcknowledged(receipt, timeoutMs = 30_000): Promise`, polling like `flush` (`rudp.ts:911-935`); rejects with the end reason when invalidated | +| Python (6c) | `send_reliable(self, channel_id: str, payload: bytes) -> CultNetRudpSendReceipt` | frozen-looking object, `packet_sequences: tuple[int, ...]` | `receipt.status` (`CultNetRudpSendStatus` enum: `PENDING`, `ACKNOWLEDGED`, `INVALIDATED`) | `wait_acknowledged(self, receipt, timeout_seconds: float = 30.0) -> None`, the `flush_reliable` loop (`:1101-1131`); raises `ConnectionError` when invalidated, `TimeoutError` at the deadline | +| Kotlin (K4) | `fun sendReliable(channelId: String, payload: ByteArray): CultNetRudpSendReceipt`; `sendSchema`/`sendSchemaMessage` return it | `val packetSequences: List` | `receipt.status` (`enum class CultNetRudpSendStatus { Pending, Acknowledged, Invalidated }`), `@Volatile` | `fun waitAcknowledged(receipt, timeoutMs: Long = 30_000, pollIntervalMs: Long = 5)`, the `flushReliable` loop (K:3186-3205); throws `IOException` when invalidated, `SocketTimeoutException` at the deadline | + + - The status is on the receipt, not a transport query, in the four ports: a C#, TS, Python or Kotlin + caller reading `receipt.Status` is the idiom there, and it is what Rust's cell already is underneath. + Rust keeps `reliable_send_status` because its signature is public and used (Cut 4, Unchanged). + - `SendReliable` refuses a channel whose send options are not reliable (as Rust's `send_reliable` does, + `rudp.rs:1903-1930`). If Q-A8 brings expiry to a runtime, it refuses an expiring channel too, as Rust's + does after Cut 4 (P9). + - A receipt from an ended session is Invalidated and stays so; `WaitAcknowledged` on it fails at once. +- **Thread safety.** C# resolves under `_pendingReliableGate` (`:915`) and publishes the status with a + volatile write; Kotlin marks the field `@Volatile`; TS and Python are single-threaded per transport. +- **Docs.** Each runtime's README RUDP section gains the three states and the wait + (`src/GameCult.Networking/README.md`, `packages/cultnet-ts/README.md:24-25`, + `packages/cultnet-py/README.md:103-111`, `packages/cultmesh-kotlin/README.md:229-305`), and the parity + doc's flush paragraph (`docs/cultnet-transport-parity.md:260-273`) names receipts in all five. + +### 10. A failed send to one peer is that peer's lost datagram (Cut D; from the Odin Soul pass) + +- **Finding.** `CultMeshRudpDocumentServer::poll_once` begins with `self.maintain()?` + (`cultmesh-rs/src/rudp_document_server.rs:264`). `maintain` sends every peer's due resends and returns on + the first failed `send_to` (`:392-398`, through `send_packet` `:628-632`). Every per-peer send in + `poll_once` does the same: the reply (`:334-336`), the Accept (`:451`), a snapshot response (`:586-588`), + the goodbye (`:597-604`) and the ack (`:366-373`). + - So one peer whose datagrams cannot be sent fails every poll for every peer. Its resends come due every + 50 ms (`:158`); a poll loop that pauses longer than that between attempts never gets past `maintain` + again while the peer lives, and a peer that keeps sending never idles out (`:384-388`). + - Odin `origin/main` (`crates/odin-daemon/src/main.rs:661-675`) propagates any `poll_once` error, so + today the daemon exits on the first one; the Odin Soul pass reports a branch that retries every 100 ms + and exits after 30 s of failures. Either way one bad peer takes Odin down. + - The same socket is **non-blocking** (`:230`), so `send_to` also fails with `WouldBlock` when the send + buffer is full: a burst of snapshot responses to one peer can fail a poll for everyone with no bad peer + at all. +- **Rule: a send failure is a lost datagram, attributed to its peer.** It is counted and the poll goes on. + RUDP already recovers lost datagrams: the reliable packet stays pending and is resent; an unreliable one + was allowed to be lost. The peer's session ends by the rules that already end sessions: idle timeout, + maximum lifetime, a refusal or a Disconnect. This is TCP's treatment of ICMP unreachables as soft errors + (RFC 1122 §4.2.3.9): report them, do not abort the connection on them. + - Only failures that are not about one peer stay errors: `recv_from` failing with anything but + `WouldBlock` or `ConnectionReset` (Windows reports an earlier ICMP port-unreachable on the *next* + receive; the socket transport already treats it as nothing, `rudp.rs:2059-2066`, the document server does + not, `:266-272`), and encode failures, which are the server's own bug. + - Rejected: ending the peer's session on its first failed send. `WouldBlock` is transient and not the + peer's fault; ending on it would drop healthy peers under load. +- **Same shape elsewhere** (multi-peer servers only; a single-peer transport's failed send is already only + that peer's): + +| Server | Where one peer's failed send stops the others | Change | +|---|---|---| +| cultmesh-rs document server | as above | Cut D | +| Rust hub `CultNetRudpServerHub` | `poll_resends` returns on the first failure (`rudp.rs:1762-1777`); the receive path's sends to one peer abort `receive_event_once` (`:1644`, `:1673`, `:1708`, `:1711`, `:1714`, `:1759`, through `send_packet` `:1799-1804`) | Cut D | +| C# `CultNetRudpSocketTransportServer` (and `RudpCultNetSchemaServer` over it) | `PollResends` walks every peer and the first `SocketException` from `SendTo` (`CultNetTransport.cs:2829-2834`) escapes the loop (`:2796-2805`); `TryReceiveOnce`'s sends are unguarded except the refusal goodbye (`:2687`, `:2704`, `:2749-2750`, `:2788`; guarded `:2739-2745`) | Cut D | +| cultmesh-py server | worse: an `OSError` from `sendto` (`server.py:302-307`) in `_poll_rudp_resends` (`:277-285`) or the receive path escapes `_rudp_loop` (`:203-…`, which catches only `recvfrom`'s errors), and the RUDP thread dies for every peer | Cut D | +| cultmesh-ts document server | none. **Corrected 2026-09-30:** Node does not report send failures on the socket's `error` event. With a callback they go to the callback; without one, libuv drops them silently (Node 24). Only port 0 throws synchronously. Cut D routes every send through `sendRudpDatagram`. | none | +| Kotlin interop server | none that matters: a catch-all logs and continues (K:4025), and it is interop-only | none (Cut K1 reviews it) | + + +## Cuts + +Every cut is on CultLib, on its own branch (`hands/ack-cut`) from `main` at `e9469cb3` or later, in a +worktree Self creates. Heavy verification runs on Yggdrasil. Each cut starts by committing its probes as failing +tests named for the rule, in every runtime it touches. The pass-1 and pass-2 probe files +(`refs/verify/1519a20a` on the `CultLib-imag-ack2` mirror) are the starting point; they print, so each +must become an asserting test. + +Kotlin: every numbered cut below is mapped for C#, Rust, TS and Python. Cut K (Q-A5 A) brings Kotlin to +the same state on a Yggdrasil Kotlin image, in steps K0-K5. + +**Negative checks that stay green in every cut:** + +- the cross-runtime reorder, drop and fragment proofs in the TS interop harness + (`docs/cultnet-transport-parity.md:227-248`); +- the stray-packet tests (`packages/cultnet-rs/tests/rudp_stray_packets.rs`, and their C#, TS and Python + equivalents), except the ones each cut names as encoding the old rule; +- the codec fixture vectors: the existing fixture's bytes never change. Cut F adds one fixture. + +### Cut 1. One watermark owns ordered delivery (receiver) — in flight (`hands/ack-cut1`) + +- **First.** Failing tests P1, P1b and P6 in each runtime. +- **Deletes first:** + - the per-channel `next` map and its resets: `CultNetTransport.cs:918`, `:1305`; `rudp.rs:196`, `:223`, + `:354`; `rudp.ts:160`, `:223`; `transport.py:424`, `:468`; `CultMesh.kt:2643`; + - `expectedSequenceIfUninitialized`: `CultNetTransport.cs:1151-1153`, `rudp.rs:540-543` (used at + `:679`), `rudp.ts:375-377` (used at `:450`), `transport.py:595-599`, `CultMesh.kt:2728`; + - `DeliverOrdered`, `DrainOrdered` and `SkipReceivedNonChannelSequences`: `CultNetTransport.cs:1628-1700`, + `rudp.rs:1138-1246`, `rudp.ts:737-800`, `transport.py:868-920`, `CultMesh.kt:2939-2978`; + - `PendingOrderedFrame.NextSequence` (`rudp.rs:160-163` and equivalents). +- **Adds:** + - `R`, seeded in `AcceptConnect` (`CultNetTransport.cs:1012`, `rudp.rs:383`, `rudp.ts:242`, + `transport.py:485`, `CultMesh.kt:2667`) and on Accept receipt (`CultNetTransport.cs:1155`, + `rudp.rs:544`, `rudp.ts:379`, `transport.py:601`, `CultMesh.kt:2730`); + - `R` advances in `RememberReceived` (`CultNetTransport.cs:1518`, `rudp.rs:973`, `rudp.ts:619`, + `transport.py:809`, `CultMesh.kt:2891`) and resets in `ResetPeerState`; + - a reassembled ordered frame is delivered at once when its first sequence is at most `R + 1` and its + channel holds nothing below it. Otherwise it is held. The caps apply only to what is held: the + prototype held everything and so refused a 5 MiB frame with no gap; + - after every reliable receipt (data, fragment, duplicate, Accept), drain every channel's held frames + whose first sequence is at most `R + 1`, in sequence order; + - Rust only: the 64-channel cap (`rudp.rs:42`) counts channels with held frames. +- **Tests changed:** `packages/cultnet-rs/tests/cultnet.rs:1000` (consistent handshake) and `:2655` + (hold frames behind a gap). The equivalents in the other runtimes are whatever the change breaks. Each + must be read before it is edited, because a test that encodes `min(highest+1, frame)` encodes P6. +- **Verification:** + - P1, P1b and P6 pass in every runtime; + - the full suites: `cargo test` in `cultnet-rs` and `cultmesh-rs`, `dotnet test + tests/GameCult.Networking.Tests`, `npm test` in `cultnet-ts`, the Python suite; + - the TS interop harness across runtimes; + - negative grep: `rg -n "orderedNextSequence|ordered_next_sequence|expectedSequenceIfUninitialized|expected_sequence_if_uninitialized|SkipReceivedNonChannel|skip_received_non_channel" src packages` + returns nothing; + - mutation testing on the diff: cargo-mutants, Stryker.NET, StrykerJS, and mutmut for Python. +- **Ledger.** Per runtime about −70 and +40. Across four, about −280 and +160. + +### Cut 1b. A write belongs to the session it was issued in: every ending drops what it owed — in flight (`hands/ack-cut1`) + +- **First.** Failing tests G3 (each ending path: peer Disconnect, local disconnect, timeout, refusal) in + C#, TS and Python, and local disconnect and timeout in Rust; G3R in Rust; and in every runtime, a flush + started before a timeout or disconnect fails even after a later `connect()` succeeds. +- **The owner.** Each session gets a generation counter and one private primitive that ends the current + generation: not connected; pending and queued dropped; generation advanced. In Rust it also invalidates + the generation's receipts (by the scope today; Cut 4 moves that into the receipts). It does not touch + what was received from the peer (§8). +- **Deletes first:** + - Rust: the inline clearing in the Disconnect branch (`rudp.rs:596-615`) and the scope rotation in + `reset_peer_state` (`:345`), both replaced by the primitive; the receipt doc that says local endings + carry writes (`rudp.rs:128-133`); the flush's scope capture (`:2001-2014`), replaced by the generation; + - TS: the transport's `#generation`, `#endedGeneration`, `#endGeneration` (`rudp.ts:826-831`, + `:937-940`) and their uses in `connect` (`:895`), `flush` (`:913-920`), `checkTimeout` (`:949`), + `#endRefusedSession` (`:976`), the server Connect path (`:1037-1046`) and the disconnect result + (`:1084`). `#endedReason` stays, as the report of why; + - C# and Python: flush's reliance on the disconnect reason (`CultNetTransport.cs:1924-1929`, + `transport.py:1110-1116`). The reason stays, as a report. +- **Adds:** + - the primitive, called from every ending path: + - peer Disconnect: `CultNetTransport.cs:1190-1199`, `rudp.rs:596-615`, `rudp.ts:406-414`, + `transport.py:619-625`; + - local disconnect: `CreateDisconnect` `CultNetTransport.cs:1324-1328`, `create_disconnect` + `rudp.rs:771-781`, `createDisconnect` `rudp.ts:508-515`, `create_disconnect` `transport.py:695-697`; + - timeout, when it fires: `CultNetTransport.cs:1333-1348`, `rudp.rs:783-796`, `rudp.ts:517-526`, + `transport.py:699-706`; + - refusal, through `ResetPeerState` (`CultNetTransport.cs:1292-1308`, `rudp.rs:344-358`, + `rudp.ts:214-227`, `transport.py:458-471`); + - a read-only generation on each session, which each transport's flush captures at start and fails on + when it changes (`CultNetTransport.cs:1914-1945`, `rudp.rs:1992-2040`, `rudp.ts:911-935`, + `transport.py:1101-1124`). +- **Hubs.** The Rust hub and the C# listener already discard a peer's session at its end, so its owed + writes die with it. No change. +- **Tests changed:** `tests/rudp_stray_packets.rs:638-690` keeps passing unchanged (peer Disconnect already + obeys the rule). Tests that expect a write to survive a local disconnect or timeout encode the old rule; + read each before editing. +- **Verification:** + - G3 in every runtime: after every ending path, owed 0 and nothing delivered to the next session; + - G3R: the receipt reads `Invalidated` after `disconnect()`, and stays so after reconnecting; + - the flush test above in every runtime; + - negative: `rg -n "endedGeneration|#endGeneration" packages/cultnet-ts/src` returns nothing; a TS + reconnect from inside a `disconnect` listener still cannot make an ended flush succeed (the case the + TS generation pair was written for, `rudp.ts:826-829`); + - mutation testing on the diff. +- **Ledger.** About −40 and +45 across four runtimes. TS is net negative. + +### Cut 1c. A Connect's sequence says whether it repeats — ready after Cut 1b (Q-A6 A, ruled) + +Pass 3 changes against pass 2: the ruling; three more servers that decide repeats themselves (the +cultmesh-rs and cultmesh-ts document servers and the cultmesh-py server); the second C# default of 100; +the exact default mechanism; the full caller survey; `cultmesh-rs/src/lib.rs:1409` removed from the +production list (it is inside `#[cfg(test)]`, which starts at `:1140`). + +- **Repo/branch:** CultLib `hands/ack-cut1c` from `main` after Cut 1b merges. It uses the ending primitive. +- **First.** Failing tests: + - G1: a restarted client on the same address, connection id and payload is admitted and its frames + delivered, against the Rust hub, the C# listener, server mode in every runtime, the cultmesh-rs + document server (same `(addr, connection_id)` key), the cultmesh-ts document server (same payload) and + the TS operation service; + - G1b: C# and Python server mode admit a Connect from a new endpoint; + - G2: after `connect()` on the same session, a new server session's frames are delivered; + - a stale Accept (its ack field does not name the pending Connect) is ignored; + - the cultmesh-py server and Rust server mode: a *retransmitted* Connect after data has flowed does not + reset the session (today both reset on every Connect). +- **Deletes first:** + - the transport-level repeat decisions: Rust server mode's reset on every Connect (`rudp.rs:2105-2116`); + the Rust hub's payload comparison (`rudp.rs:1637-1647`); C# server mode's `_session.Connected` branch + (`CultNetTransport.cs:2226-2236`); the C# listener's payload comparison (`:2670-2688`); TS's + `movedEndpoint`/`repeated` computation (`rudp.ts:1011-1049`) and the session's `connected` shortcut + (`rudp.ts:249-251`); Python's `connected` branch (`transport.py:1047-1053`); + - **new in pass 3:** the cultmesh-rs document server's "same key is a repeat" arm + (`cultmesh-rs/src/rudp_document_server.rs:413-427`, and its comment at `:414-415` that asks a fresh + client to choose a fresh id); the cultmesh-ts document server's `connectPayload` comparison and field + (`cultmesh-ts/src/index.ts:5794-5802`, `:5806`); the cultmesh-py server's replace-on-every-Connect + (`cultmesh-py/src/cultmesh_py/server.py:225-240`); + - C# and Python server mode's refusal of a Connect from a new endpoint (`CultNetTransport.cs:2212-2216`, + `transport.py:1042-1044`), for Connect packets only. +- **Adds:** + - the session records the sequence of the Connect that started its generation. A Connect repeats exactly + when the session is connected and the Connect carries that sequence. `AcceptConnect` answers a repeat + as `AnswerRepeatedConnect` does today, and otherwise ends the generation, resets peer state and accepts + (`CultNetTransport.cs:1012-1059`, `rudp.rs:383-435`, `rudp.ts:242-290`, `transport.py:485-525`). + `AnswerRepeatedConnect` stops being public; a public predicate `ConnectRepeats(packet)` / + `connect_repeats` / `connectRepeats` serves servers that keep one session per peer and must report the + old one ended (the Rust hub `rudp.rs:1648-1690`, the C# listener `:2690-2710`, the cultmesh-rs document + server). Servers that only call `AcceptConnect` (TS operation service `operation-service.ts:167-175`, + cultmesh-ts document server, cultmesh-py server, server-mode transports) need nothing else: the session + decides; + - `CreateConnect` on a session that has had a peer ends the generation and resets peer state first + (`CultNetTransport.cs:1001-1010`, `rudp.rs:369-381`, `rudp.ts:229-240`, `transport.py:473-483`); + - on Accept receipt, the session honours it only while its Connect is pending and only if the Accept's + ack field names that Connect (`CultNetTransport.cs:1155-1160`, `rudp.rs:544-557`, `rudp.ts:379-390`, + `transport.py:601-604`); + - **the default initial sequence is drawn from a CSPRNG in [1, 2^31)** wherever a default is produced. + The option types do not change (`u32`/`uint`/`number`/`int`), so every explicit value keeps working and + no caller changes code. One private helper per runtime: + - Rust: `rand::random_range(1..1u32 << 31)` (`rand` 0.9 is already a dependency, + `packages/cultnet-rs/Cargo.toml`), in `CultNetRudpSessionOptions::default` (`rudp.rs:108`), + `CultNetRudpSocketTransportOptions::client()` (`:1310`) and `::server()` (`:1329`), + `CultNetRudpServerHubOptions::new()` (`:1377`), and `CultMeshRudpSocketOptions::default` + (`cultnet-rs/src/cultmesh.rs:259`); + - C#: `RandomNumberGenerator.GetInt32(1, int.MaxValue)` as the property initializer at + `CultNetTransport.cs:773`, `:850`, **`:2404` (the listener's 100)**, **`CultNetRudpSchemaServer.cs:48` + (a second 100)** and `src/GameCult.Mesh/CultMesh.cs:547`; + - TypeScript: `crypto.getRandomValues` in the session constructor's `options.initialSequence ?? …` + (`rudp.ts:172`); `cultmesh-ts`'s optional `initialSequence` (`index.ts:4336`) already falls through to it; + - Python: `secrets.randbelow(2**31 - 1) + 1` as a `default_factory` at `transport.py:298`, `:323`, and + as the default of `client.py:396` and `cultmesh-py/src/cultmesh_py/facade.py:160`, `:194` (keyword + defaults become `None` meaning "draw one", since a Python default is evaluated once); + - Kotlin: in Cut K2; + - CultLib's own production pins take the default: `cultmesh-rs/src/lib.rs:964` (client), + `cultmesh-rs/src/rudp_document_server.rs:432` (server). The two TS publishers + (`signed-daemon-health.ts:116`, `idunn-odin-presence-publisher.ts:103`) lose theirs in whichever of + Cut 5 or Cut 1c lands second. Interop peers, the parity tool and tests keep explicit values on purpose. +- **Tests changed** (they encode payload identity or a fixed default): + - `packages/cultnet-rs/tests/rudp_server_hub.rs:171-240` calls `connect()` again with the same payload + and expects no replacement; under this rule that is a new generation. Its retransmit half stays covered + by `rudp_stray_packets.rs:487`; + - `tests/GameCult.Networking.Tests/NetworkingTests.cs:1507` (replace a peer by payload) passes but must + say it relies on distinct sequences; `:700` asserts `PendingReliableSequences == {100}` against the + listener's default; + - asserts that may rely on a default Connect sequence of 1 (read each; pin `1` in the test if it does not + already): `cultnet-rs/tests/cultnet.rs:574`, `:820`, `:851-852`; `cultnet-ts/test/cultnet.test.ts:472`, + `:576`, `:592-593`, `:1536`; `cultnet-py/tests/test_cultnet.py:596`, `:764`, `:779-780`; + - `cultnet-ts/test/cultnet.test.ts:2225` (another endpoint replaces the peer) stays. +- **Verification:** + - G1 (every server above), G1b, G2, the stale Accept and the retransmitted-Connect tests; + - the retransmit tests stay green: `rudp_stray_packets.rs:487`, `:511`, `NetworkingTests.cs:1483`, + `cultnet.test.ts:2119`, `:2134`, `test_cultnet.py:1134`; + - a test per runtime that two default-constructed sessions draw different initial sequences in [1, 2^31); + - negative grep: `rg -n "SequenceEqual\(connectPayload\)|connect_payload == packet.payload|movedEndpoint|byteArraysEqual\(record.connectPayload" src packages` + returns nothing; + - mutation testing on the diff. +- **Ledger.** About −90 and +85 across four runtimes and the three servers. Two CultLib production pins go. + +**Pin-bump notes: callers outside CultLib that pin an initial sequence** (survey, 2026-09-30). A pinned +value keeps a deterministic Connect sequence. It matters on a **client that can restart on the same +endpoint and connection id** (the G1 lockout survives there); on a server or a one-shot client that binds a +fresh port per run it only forgoes the stale-packet protection. Recommendation at each repo's bump: delete +the value. + +| Repo@rev | Site | Value | Role | Consumes CultLib by | +|---|---|---|---|---| +| Muninn@`bd69598` | `crates/muninn-daemon/src/main.rs:5975`; `crates/sleipnir-daemon/src/main.rs:2223` | 1 | client (restart risk) | Cargo pin `c2a9a6e5` | +| Muninn@`bd69598` | `muninn-daemon/src/main.rs:780`, `:5426`; `sleipnir-daemon/src/main.rs:2265` | 1 | server-mode transports | same | +| Gjallar@`6a92976` | `src/Gjallar/Program.cs:431`, `:2955`, `:3027` | 1 | clients (restart risk) | sibling `../CultLib` | +| Mimir@`d88f2e6` | `src/Mimir.EveBrowserReference/Program.cs:682`, `src/Mimir.EveDashboard/Program.cs:801` | 1 | clients (restart risk) | sibling ProjectReference | +| Mimir@`d88f2e6` | `src/Mimir.CultMeshMedia/Program.cs:485` | `peers.Count + 1` | hand-rolled per-peer relay; its Connect handling (`:365`) is its own repeat decision | same | +| weksa@`d16cff5` | `scripts/weksa-rudp-command.cjs:88` (per-peer server loop), `:192` (client); `scripts/idunn-rudp-health.cjs:43` | 1 | server loop and clients | sibling CultLib | +| Bifrost@`42728a6` | `tools/persona-discord-rudp.mjs:9` | 100 | server-mode transport | sibling CultLib | +| Heimdall@`e8e2832` | `src/idunn-rudp-health.ts:65` | 1 | one-shot health client (replaced at its bump, § Sequencing) | submodule `b6b1d9c` | +| Stonks@`981c484`, Vili@`8773c15`, VoidBot@`46d891b` | `src/idunn-rudp.cjs:43`, `scripts/idunn-rudp.cjs:33`, `scripts/publish-idunn-rudp-health.cjs:64` | 1 | one-shot health clients | `file:../CultLib` / sibling path | + +- None in Odin `origin/main` (`5c37860`; Sleipnir now lives in Muninn), Idunn, Hermodr, CodexConnector, + Ghostlight, Huginn or Epiphany. StreamPixels' own code has none; its vendored CultLib (`542ddd3`, at + StreamPixels `a49f7d8`) carries CultLib's own old defaults and pins, which a bump replaces. +- Sibling-path consumers (Gjallar, Mimir, Stonks, Vili, VoidBot, weksa, Bifrost) take the random default + as soon as the local CultLib checkout moves; their pinned sites do not change behaviour until edited. + +### Cut 2. A reliable fragment set is never evicted (receiver: Rust, TS, Python) — in flight (`hands/ack-cut2`); merges with Cut F + +- **First.** Failing test P5 in each of the three. +- **Change:** + - eviction picks the stalest set that holds no reliable fragment (`rudp.rs:1027-1047`, + `rudp.ts:679-692`, `transport.py:836-842`); + - if every pending set holds reliable fragments, the packet is refused and the session ends, as every + other refusal does; + - ~~a conforming sender cannot reach that bound~~ (false for an expiring sender; see the pass 3 + correction below): its window keeps at most 32 reliable packets in flight, and the bound is 64 sets. +- **Verification:** P5 delivers the reliable frame. `d3bc6e66`'s test (lossy fragment sets keep being + evicted) stays green. `fragment_sets_evicted` still counts evictions. +- **Ledger.** About −3 and +12 per runtime. +- **Pass 3 correction (from the Cut 2 Soul pass on `hands/ack-cut2` `c5026aa1`).** The third bullet above + is false for an expiring sender: the default Rust `media` channel expires reliable packets after 75 ms, + a frame's first fragment is delivered and acked, the rest are dropped by the deadline, and the set is + pinned; Soul's `soul_probe_expiring_reliable_frames_kill_receiver` (`packages/cultnet-rs/tests/cultnet.rs:3192` + at `3be97b34`) refuses the session on the 65th such frame, where eviction used to keep it alive. + - **What changes for the branch in flight:** nothing in its code. Its rule is right for every sender that + does not expire. What changes is when it merges: **Cut 2 merges only together with Cut F**, which + releases dead sets through notices and (Q-A9 B) keeps pre-Cut-2 eviction for a peer that never sends + notices. Soul's probe becomes Cut F's regression test. + - C# (`CultNetTransport.cs:921`) and Kotlin (K:2645) have no fragment-set bound at all. **Cut 2c** brings + C# to the same bound; Kotlin gets it in K1 and the gated rule in K3. + +### Cut 2c. C# gets the fragment-set bound (with Cut 2's rule) — merges with Cuts 2 and F + +- **Why in this campaign.** Rust, TS and Python bound pending fragment sets at 64 (`d3bc6e66` lineage; + `rudp.rs:328-340`, `rudp.ts:167`, `transport.py:430`); C# keeps `_fragmentBuffers` + (`CultNetTransport.cs:921`) unbounded, so a hostile peer grows it without limit and the parity doc cannot + call C# conforming. A runtime missing a sibling's protection is a gap to fill. +- **Repo/branch:** CultLib `hands/ack-cut2c`, from `main`; merges together with Cuts 2 and F (the gate + lives in F). +- **First.** C# ports of `d3bc6e66`'s lossy-set test and Cut 2's P5 test. +- **Adds:** `MaxPendingFragmentSets` (default 64, a setter as Rust's `set_max_pending_fragment_sets`, + `rudp.rs:328-340`), a per-set last-touched ordinal, eviction of the stalest set in `Reassemble` + (`:1556`), `FragmentSetsEvicted` beside `OutstandingReliablePacketCount` (`:993`), and Cut 2's rule (a + reliable set is not evicted; if every set is reliable the session is refused through `EndRefused`), + gated as in Cut F. +- **Verification:** the two tests; `GameCult.Networking.Tests` green; Stryker.NET on the diff. +- **Ledger.** About +45 and 0. + +### Cut 3. The sender's flow window: 1,023 sequences and 4 MiB above the lowest unacked — ready (merge after Cut 1) + +- **First.** Failing tests P8 (all runtimes) and P4 (Rust receiver, with a sender from each runtime). +- **Change.** Admission (`AdmitReliablePackets` / `PromoteQueuedReliable` at + `CultNetTransport.cs:1439-1490`, `rudp.rs:910-942`, `rudp.ts:586-600`, `transport.py:776-796`, + `CultMesh.kt:2856-2872`) admits a packet only while: + - the window has a slot (as today); + - its sequence is at most the lowest unacked sequence plus 1,023; + - the admitted payload bytes above the lowest unacked sequence stay within 4 MiB. + - The first packet is always admissible. Expired packets (Rust) do not count as unacked here: they are + gone from the wire. (Cut F refines this: an abandoned sequence counts while its notice is outstanding, + and stops counting once acknowledged or stranded.) +- **Contract.** `docs/cultnet-transport-parity.md` (after `:263`) states the receive window: a receiver + must hold 1,023 sequences and 4 MiB beyond its contiguous watermark, and a conforming sender never + exceeds that. +- **Verification:** + - P8: `g` is delivered; + - P4: the 5 MiB frame is delivered after the gap fills, and the session is never refused; + - the existing large-snapshot tests (`c398bad1`) and the fragment interop stay green; + - the Rust benchmark or media probe shows no throughput change on a lossless link. +- **Ledger.** About +25 per runtime, and nothing removed. + +### Cut D. A failed send to one peer is that peer's lost datagram (Rust document server and hub, C# listener, cultmesh-py server) — ready + +Design in §10. Independent of every other cut; it touches send sites, not session logic. + +- **Repo/branch:** CultLib `hands/ack-cutD` from `main` at `e9469cb3` or later. Merge cost only with Cut 1c + in the Rust hub's and C# listener's Connect arms. +- **First.** Failing tests, one per server, each with two peers where every send to peer X fails: + - cultmesh-rs document server: `poll_once` never returns `Err`; peer Y connects, publishes, is acked and + gets a snapshot response; `maintain` returns `Ok`; the failure count rises; X's session ends by idle + timeout, not by the failure. Also: `recv_from` returning `ConnectionReset` is `Idle`; + - Rust hub: `poll_resends` and `receive_event_once` return `Ok` and keep serving Y; + - C# listener: `PollResends` reaches Y after X throws; `TryReceiveOnce` serves Y; + - cultmesh-py server: the RUDP thread survives an `OSError` from `sendto` and keeps serving Y. + - **The failure seam.** The Rust servers own a `UdpSocket` directly, and a loopback peer's address + cannot be made to fail on demand. Add the narrowest seam at the one send function: a + `#[cfg(test)]` set of addresses whose sends fail with a synthetic `io::Error` in `send_packet` + (`rudp_document_server.rs:628-632`, `rudp.rs:1799-1804`), and the same as an internal test hook in C# + `SendPacket` (`CultNetTransport.cs:2829-2834`). Python patches `socket.sendto` in the test. A socket + port trait would be the full dependency-injection answer; it is not bought here, because the only + consumer is this test. +- **Changes:** + - cultmesh-rs `rudp_document_server.rs`: `send_packet` (`:628-632`) keeps encode errors as errors and turns + a `send_to` failure into a counted loss; every per-peer call site drops its `?` on the send + (`:335`, `:373`, `:397`, `:451`, `:587`, `:603`); a `send_failures()` accessor beside `packets_dropped()` + (`:246-248`); `recv_from` treats `ConnectionReset` like `WouldBlock` (`:266-272`), as the socket + transport does (`cultnet-rs/src/rudp.rs:2059-2066`); + - cultnet-rs hub: `send_packet` (`rudp.rs:1799-1804`) likewise, counted in `CultNetTransportStats` + as a new `send_failures` field; `poll_resends` (`:1762-1777`) and the receive path (`:1644`, `:1673`, + `:1708`, `:1711`, `:1714`, `:1759`) stop propagating it; + - C# `CultNetRudpSocketTransportServer`: `SendPacket` (`:2829-2834`) catches `SocketException`, counts it + in `CultNetTransportStats.SendFailures`, and returns; `PollResends` (`:2796-2805`) and `TryReceiveOnce`'s + sends (`:2687`, `:2704`, `:2749-2750`, `:2788`) need no other change; the refusal goodbye's own catch + (`:2739-2745`) becomes redundant and goes; + - cultmesh-py `server.py`: `_send_rudp_packet` (`:302-307`) catches `OSError` and counts it. +- **Not changed:** single-peer socket transports (a failed send already concerns only their one peer, and + their callers, flush among them, get the error); `cultmesh-ts`'s document server. (Corrected 2026-09-30: Node reports send failures only to a send + callback, never on the socket's `error` event; see the table above.) +- **Authority map:** + - Owner: each peer's session owns its peer's fate (idle timeout, lifetime, refusal, Disconnect). A send + failure is an input to nothing but a counter. + - Forbidden writers: no per-peer send failure ends a poll, a loop, a thread or another peer's session. +- **Verification:** + - the four tests; the full `cultmesh-rs`, `cultnet-rs`, `GameCult.Networking.Tests` and `cultmesh-py` + suites; + - negative: `rg -n "send_packet\(.*\)\?;" packages/cultmesh-rs/src/rudp_document_server.rs` returns + nothing (the pattern matches only a propagated send; encode errors propagate inside `send_packet`); + - operator: an Odin build on this CultLib keeps serving presence while one peer's address is + unroutable. +- **Ledger.** About −15 and +40 (the counters, the seams); tests about +120. + +### Cut F. Abandonment notices (FORWARD-TSN, RFC 3758): every receiver honours one, Rust sends one — blocked on Cuts 1 and 3, on Q-A7 and Q-A9; merges together with Cut 2 + +Design in §6. Mapped for the recommended answers to Q-A7 (one sequence per notice) and Q-A9 (a capability +bit gates Cut 2's rule). + +- **Repo/branch:** CultLib `hands/ack-cutF` from `hands/ack-cut2` rebased on `main` after Cuts 1 and 3 + merge. Cut 1 gives the receiver `R` and the drain the notice feeds; Cut 2 is the fragment code the notice + drops sets from and the rule the capability gates; Cut 3 is the admission rule the notice amends. Cut 2 + and Cut F merge to `main` together (the Cut 2 Soul finding: Cut 2 alone refuses sessions with expiring + senders). Kotlin's half is Cut K3. +- **First.** Failing tests, in C#, Rust, TypeScript and Python: + - the golden: `Abandon` encodes to the §6 bytes and decodes back, beside the existing fixture + (`packages/cultnet-rs/tests/cultnet.rs:319`, `packages/cultnet-ts/test/cultnet.test.ts:311`, + `packages/cultnet-py/tests/test_cultnet.py:409`, `tests/GameCult.Networking.Tests/NetworkingTests.cs:366`); + - a type-4 packet with bit 4 decodes as `Abandon`; bit 4 on a Data packet is still ignored; + - receiver: a notice for a hole advances `R`, drains the held ordered frames behind it, and replies with + the ack for that sequence (FN, inverted: `[o3]` delivered by the notice, `o2` marked received); + - receiver: a notice for a received sequence changes nothing and still replies; + - receiver: a notice inside an incomplete fragment set's span drops the set; + - receiver: a notice more than 1,024 above the highest received is ignored with no reply; + - receiver: the late original after its notice is a duplicate: acked, not delivered; + - Rust sender: an expired pending or queued packet produces a notice at once and then once per resend + delay; an ack naming the sequence stops it; after 16 unacknowledged sends it stops and records + `first_stranded`; every ending clears both; + - Rust end to end (P2 inverted): reliable `media` with expiry is lost, then ordered `s1`, `s2` on + `schema`; after the notice both are delivered and `flush_reliable` succeeds; + - Rust, Cut 3's window: an outstanding notice holds the lowest-unacked point; a stranded sequence does not. + - **the Cut 2 regression**, from Soul's `soul_probe_expiring_reliable_frames_kill_receiver` + (`packages/cultnet-rs/tests/cultnet.rs:3192` at `3be97b34`): 100 default `media` frames, each losing + every fragment but the first. With a Cut F sender the receiver's pending sets return to zero after the + notices and the session lives; with a stand-in sender that never advertises the capability nor sends + notices (Q-A9 B), the receiver evicts the stalest set as before Cut 2 and the session lives; with a + capable peer that stops sending notices, the 65th pinned set still refuses (Cut 2's rule holds where it + is true); + - (Q-A9 B) a Connect or Accept with flag bit 4 records the peer as capable; one without does not; an old + peer's accept of a flagged Connect works (the pass 3 CAP probe, kept as a test). +- **Deletes first:** + - Rust: the plain drop in `purge_expired_reliable` (`rudp.rs:898-908`; the `retain` calls become a move + into the abandoned set; the expired counter stays); + - the doc on `reliable_expire_after_ms` (`rudp.rs:121-124`), which says the packet is dropped; + - `packages/cultnet-py/README.md:103-111`'s claim that the Python session has reliable expiry. It has + none; the claim is false today. +- **Adds, receiver (C#, Rust, TS, Python):** + - the `Abandon` packet type and its codec mapping: Rust enum `rudp.rs:51-59`, `encode_flags` + `:2466-2475`, `packet_type_to_code` `:2477`, `decode_rudp_packet` `:2448-2455`, `packet_type_from_code` + `:2571`; C# `CultNetRudpPacketType` (`CultNetTransport.cs:509`) and `CultNetRudpPacketCodec` `EncodeFlags` `CultNetTransport.cs:697`, + `Decode` `:676-690` (its `Enum.IsDefined` check runs on the wire byte, which stays 4); TS union + `rudp.ts:26` and the codec at `:1264-1320`; Python enum `transport.py:250`, code table `:342`, codec + `:1175-1240`; + - the `Abandon` branch in `receive`, after acks are applied and beside the Ack/Pong branch + (`rudp.rs:578-592`, `CultNetTransport.cs:1177-1187`, `rudp.ts:397`, `transport.py:612`): the range + check, the fragment-set drop over the fragment buffers (`rudp.rs:1001-1114`, `CultNetTransport.cs:1556`, + `rudp.ts:643`, `transport.py:825`), `RememberReceived` and the Cut 1 drain, and + `reply = create_ack_for_received(sequence)` (`rudp.rs:751-758`, `CultNetTransport.cs:1273-1279`, + `rudp.ts:492-497`, `transport.py:685`); + - transports skip their own ack for an `Abandon` packet where a delivering receive would draw one: + `rudp.ts:1089`, `transport.py:1087` (Rust and C# ack only reliable, Accept or Data and need nothing). +- **Adds, capability (Q-A9 B; all four runtimes):** + - `Connect` and `Accept` carry flag bit 4; the session records whether its peer's handshake packet had + it, and resets that with peer state. `create_connect` (`rudp.rs:369-381`, `CultNetTransport.cs:1001-1010`, + `rudp.ts:229-240`, `transport.py:473-483`) and `accept_connect` (`rudp.rs:383-411`, + `CultNetTransport.cs:1012-1059`, `rudp.ts:242-290`, `transport.py:485-525`) set it; the codec keeps bit 4 + on those types (today every decoder drops it); + - the fragment-set bound (Cut 2's eviction, `rudp.rs:1027-1047`, `rudp.ts:679-692`, `transport.py:836-842` + as Cut 2 leaves them) applies the never-evict rule to a capable peer and the pre-Cut-2 stalest-set + eviction to one that is not; + - the sender sends notices only to a capable peer; for another, an expired sequence is stranded at once. +- **Adds, sender (Rust):** + - `RUDP_ABANDON_NOTICE_SENDS = 16` beside `DEFAULT_MEDIA_RELIABLE_EXPIRE_AFTER_MS` (`rudp.rs:39`); + - the abandoned set and `first_stranded` on the session (fields beside `pending_reliable`, + `queued_reliable`, `rudp.rs:193-195`); + - `purge_expired_reliable` moves expired pending and queued sequences into the set; + - `due_resends` (`:797-807`) emits due notices after due packets and retires entries at the bound; + - `apply_acknowledgements` (`:964-971`) removes named sequences from the set; + - `outstanding_reliable_packet_count` (`:270-272`) counts the set; + - the ending primitive (Cut 1b) and `reset_peer_state` (`:344-358`) clear both; + - Cut 3's lowest-unacked point (in `admit_reliable_packets` / `promote_queued_reliable`, `:910-942` as + Cut 3 leaves them) includes the set and excludes `first_stranded`. +- **Docs.** `docs/cultnet-transport-parity.md`: the packet-type and flags rows of the header table + (`:486-487`) gain "`4` with flag bit 4 = abandon"; the golden goes after the canonical fixture + (`:505-517`); the bounded-send paragraph (`:260-273`) gains the notice rule and its resend bound. +- **Authority map:** + - Owner: the sender session's abandoned set decides which sequences are announced and for how long; the + receiver session decides what a notice changes. + - Inputs: expiry (sender); a decoded `Abandon` packet in the current generation (receiver). + - Outputs: notices (sender); a remembered sequence, drained frames and one ack (receiver). + - Derived: `first_stranded` is derived from the set's retirements and read by Cut 4; the expired counter + is report-only. + - Forbidden writers: nothing marks a sequence received without a packet except the `Abandon` branch; no + notice outlives its generation; no transport interprets bit 4. + - Shared paths: data, fragments, duplicates, Accept and notices all advance `R` through + `RememberReceived` and the one drain. + - Deletion line: the plain drop in `purge_expired_reliable` goes before the set is added. +- **Verification:** + - the tests above in four runtimes; + - FN re-run against the new build as a **negative** check: an old-receiver stand-in (a session that drops + `Abandon` packets) never acks, and the Rust sender strands the sequence after 16 sends; + - the TS interop harness gains one lane: a Rust peer sends reliable `media` with expiry whose first + packet the bridge drops, then ordered `schema` frames; the TypeScript receiver delivers the `schema` + frames (`packages/cultnet-ts/test/interop/cultnet-interop.test.ts`, beside the drop lanes); + - negative grep: `rg -n "first_abandoned" packages src` returns nothing (pass 2's name must not appear); + - mutation testing on the diff. +- **Ledger.** Receiver about +40 per runtime (four); Rust sender about +60 and −6; the golden about +25 + per runtime; docs +15 and −8 (the false Python claim). + +### Cut 4. Rust receipts: Acknowledged means delivered, resolved once; honest stranding and queueing — blocked on Cuts 1, 1b and F + +Re-mapped in pass 3 for Q-A3 B. Pass 2's `first_abandoned` (every expiry leaves a permanent hole) is +replaced by Cut F's `first_stranded` (only a notice the receiver never acknowledged leaves one). The rest is +pass 2's cut. + +- **Repo/branch:** CultLib `hands/ack-cut4` from `main` after Cuts 1, 1b and F merge. +- **First.** Failing tests: + - P3: the receipt for `s2` reads `Pending` until `s1` arrives, then `Acknowledged`; + - P9 (`send_reliable` on an expiring channel is refused) and P10 (a window-full `send_reliable` returns a + receipt covering its queued packets, and the frame is sent once); + - a receipt `Acknowledged` before any ending stays `Acknowledged` after the ending and after a reconnect; + a `Pending` one becomes `Invalidated`; + - **P2 with a new receiver:** reliable `media` with expiry is lost, then ordered `s1`, `s2`; their + receipts read `Pending` while the notice is outstanding and `Acknowledged` once it is acked; + `flush_reliable` succeeds; + - **P2 with a deaf receiver** (a stand-in session that drops `Abandon` packets): after 16 notice sends the + receipts for `s1` and `s2` stay `Pending`, `flush_reliable` fails at once naming the stranded sequence, + and the ending makes them `Invalidated`. +- **Deletes first:** + - the session scope (`rudp.rs:135`, `:179`, `:206`, `:283-285`, the check at `:291-293`, and what Cut 1b + left of the rotations); + - the stale comment and the half guard at `rudp.rs:1915-1920`; + - the hand-rolled status loops at `cultmesh-rs/src/lib.rs:806-838` and `:870-900`. +- **Adds:** + - the receipt's status cell and ordered flag; the session's unresolved-receipt list, resolved once + (Acknowledged through `A`, Invalidated by the ending primitive); + - `acked_through` (`A`): one below the lowest sequence that is pending, queued, in Cut F's abandoned set, + or `first_stranded`; + - the receipt covers queued sequences: `send_many` (`:456`) reports every sequence it assigned; + - `send_reliable` (`:1903-1930`) refuses a channel with expiry; + - `wait_acknowledged`; + - `flush_reliable` fails fast when an ordered send follows `first_stranded`, and otherwise waits while + notices are outstanding (Cut F counts them in `outstanding_reliable_packet_count`). +- **Unchanged:** `CultNetRudpReliableSendStatus` (`:146-150`), `reliable_send_status`'s signature + (`:1931`), and every caller of `Acknowledged`: `tests/rudp_stray_packets.rs:309`, + `cultmesh-rs/tests/rudp_document_server.rs:408,415`, CodexConnector, Ghostlight. +- **Changes:** `cultmesh-rs/src/lib.rs:832` and `:892` become `wait_acknowledged`; the doc at `:869` says + delivered to the document server's sink. +- **Verification:** + - the new tests pass; + - `rg -n "session_scope|first_abandoned" packages/cultnet-rs` has no hit; + - both suites are green; + - cargo-mutants on the diff. +- **Ledger.** About −90 (two loops of about 30 each, the scope) and +85 (of which `wait_acknowledged` is + about 35). Five lines smaller than pass 2: the abandoned bookkeeping moved to Cut F. + +### Cut 5. CultLib-internal TS publishers and the contract text (TS, docs) — blocked on Cut 3, and on Cut 1b in TS + +- **Changes:** + - `idunn-odin-presence-publisher.ts:89-215` and `signed-daemon-health.ts:104-162` (with its helpers + `:244-252`, `:273-389`, except the exported `parseEndpoint` `:254-271`) send through + `CultNetRudpSocketTransportConnection`: `connectAndWait`, `send("schema")`, `flush`, `close`. Their + hand-rolled session loops are deleted. The presence publisher keeps rejecting a `cultnet.error.v0` + response, from the transport's `frame` events during the flush. + - `connectAndWait(payload, timeoutMs)` on the TS socket transport, matching C# `ConnectAndWait` + (`CultNetTransport.cs:1859-1880`). It is `cultmesh-ts/src/index.ts:6603-6650` `waitForRudpConnected` moved + down; `createRudpPeer` (`index.ts:6220-6245`) uses it and the cultmesh-ts copy is deleted. + - Flush contract text in all runtimes: "every reliable frame sent in this session has been delivered to + the peer's application". + - `docs/cultnet-transport-parity.md:236-240` (the control-packet guard paragraph) is replaced by the + watermark rule, and `:261-272` gains: Acknowledged means delivered; a write belongs to the session it + was issued in; how a repeated Connect is recognised (after Cut 1c); the receive window (after Cut 3). +- **Verification:** + - `runtime-presence-health.test.ts` and `signed-daemon-health.test.ts` stay green; + - a new test drops the first datagram and still publishes; + - a new test publishes a payload over 32 packets whole; + - a new test shows the publisher's peer receives a Disconnect. +- **Ledger.** About −270 and +50. + +### Cuts 6a, 6b, 6c. Receipts in C#, TypeScript and Python — blocked on Cut 4, and on Cut 1b in each runtime + +Design and public API in §9. One cut per runtime, in parallel worktrees, so Soul can falsify each alone. +Kotlin's is Cut K4. + +- **Repo/branch:** CultLib `hands/ack-cut6a` (C#), `hands/ack-cut6b` (TS), `hands/ack-cut6c` (Python), each + from `main` after Cut 4 merges. Cut 4 is the reference; Cut 1b supplies each runtime's ending primitive. +- **First.** Failing tests, in each runtime: + - an ordered receipt reads Pending while a sequence below it is missing, then Acknowledged (P3); + - a send made while the window is full returns a receipt that covers its queued packets and becomes + Acknowledged; the frame is sent once (P10's shape); + - an Acknowledged receipt stays Acknowledged after the session ends and after a reconnect; a Pending one + becomes Invalidated and stays so; + - the wait returns on Acknowledged, fails at once on Invalidated with the end reason, and times out; + - `SendReliable` on an unreliable channel is refused. +- **Deletes first:** nothing. These runtimes have no receipt code to replace. +- **Adds, per runtime:** + - C# (6a): `CultNetRudpSendReceipt`, `CultNetRudpSendStatus`; in `CultNetRudpSession`, a send path that + records every sequence `SendMany` assigns (`:1075-1140`, before `AdmitReliablePackets` `:1439-1465` + splits them), the unresolved list, resolution after `ApplyAcknowledgements` (`:1503-1516`) and in the + Cut 1b primitive, and `A` over `_pendingReliable` and `_queuedReliable`; on the socket transport, + `SendReliable`, `WaitAcknowledged` (the `FlushReliable` loop, `:1914-1955`), and `SendSchema` + (`:1960`, `:1968`) and `SendSchemaMessage` (`:1976`) returning the receipt; + - TS (6b): `CultNetRudpSendReceipt`, the status union; session changes at `sendMany` (`rudp.ts:304-368`), + `#admitReliablePackets` (`:586-592`), `#applyAcknowledgements` (`:610-617`); transport + `sendReliable` and `waitAcknowledged` beside `send` (`:899-909`) and `flush` (`:911-935`); exported from + the package index; + - Python (6c): `CultNetRudpSendReceipt`, `CultNetRudpSendStatus`; session changes at `send_many` + (`transport.py:538-588`), `_admit_reliable_packets` (`:776-786`), `_apply_acknowledgements` + (`:803-807`); transport `send_reliable` and `wait_acknowledged` beside `send` (`:1000-1009`) and + `flush_reliable` (`:1101-1131`); exported from `cultnet_py`; + - README sections per §9, and the parity doc's flush paragraph. +- **Authority map:** the session owns each receipt's status and writes it once; the transport reads it. + Forbidden writers: no transport, flush or timer writes a status; no receipt resolves from a packet's own + ack when it is ordered (only through `A`). +- **Verification:** the tests above; each runtime's full suite; the Cut 4 behaviour table held side by side + with Rust's (same inputs, same states); negative: in each runtime, the only assignment to the status is + in the session's resolve and end paths (`rg` for the status field outside those two functions returns + nothing); mutation testing on each diff (Stryker.NET, StrykerJS, mutmut). +- **Ledger.** About +90 per runtime, nothing removed; tests about +80 per runtime. + +### Cut 7. Reliable expiry in C#, TypeScript and Python — blocked on Q-A8 and Cut F + +Mapped only for Q-A8's recommended answer A. Each runtime gains Rust's send option (a per-send reliable +expiry, and the profile's `media_reliable_expire_after_ms`, `rudp.rs:2492-2508`) and Cut F's sender half +(the abandoned set, notices at the resend delay, the 16-send bound, `first_stranded`), and its receipts +(Cut 6) refuse an expiring channel. Kotlin's is K5. About +70 per runtime. If Q-A8 is B, this cut is not +built and the parity doc records Rust as the only runtime with partial reliability. + +### Cut K. Kotlin catches up (Q-A5 A, ruled) — K0 ready now; K1-K5 trail the four-runtime cuts + +`CultMesh.kt` (6,332 lines, the only RUDP file) has none of the `3bf1c0c` stray-packet hardening, the P1 +and P6 receiver, no reset path and no repeated-Connect answer. K is split so each step is falsifiable on its +own; the anchors below are `e9469cb3`, where `CultMesh.kt` is identical to `3bf1c0c`. Tests follow the +file's existing pattern (private self-test functions called from `main`, K:3349-3373); moving them out of +the production source is a follow-up. + +**K0. The Kotlin verify image and a Linux build path — ready now.** +- **Stopgap tooling** (`C:\Users\Meta\.claude\skills\eureka\tools\stopgap\`, owned by Self, not a CultLib + commit; it dies with `ygg-verify.sh`): + - `kotlin.Dockerfile`: `FROM eclipse-temurin:21-jdk`; `apt-get install unzip curl`; fetch + `https://github.com/JetBrains/kotlin/releases/download/v2.2.21/kotlin-compiler-2.2.21.zip` (the + version CI pins, `.github/workflows/cultnet-interop.yml:20`) into `/opt/kotlinc`; `ENV + KOTLIN_HOME=/opt/kotlinc PATH=/opt/kotlinc/bin:$PATH`; Node 24 copied from the `node:24` image + (`COPY --from=node:24 /usr/local /usr/local`) for the interop lane; PowerShell 7 (`pwsh`, Microsoft's + Debian package) for `build.ps1`. Pass 3's probe proved the JDK-plus-compiler half: the self-tests exit 0 + (K-img). + - `ygg-verify.sh`: a `kotlin` image alias tagged by that Dockerfile's hash, and the remote build step + generalised from `eureka-verify-rust:*` to `eureka-verify-:*` built from `.Dockerfile` + (today it builds and copies only `rust.Dockerfile`). Edit it by writing a temp file and renaming it over + the old one (the script's own rake). +- **CultLib:** + - `packages/cultmesh-kotlin/build.ps1` becomes portable PowerShell 7: `kotlinc` or `kotlinc.bat` by + platform, `[IO.Path]::PathSeparator` for the classpath, `java` or `java.exe`. One build script stays the + one owner of the Kotlin build; no `build.sh` beside it. + - The interop harness calls `pwsh` off Windows instead of `powershell` + (`packages/cultnet-ts/test/interop/cultnet-interop.test.ts:2799-2809`); it already picks `java` off + Windows (`:31-36`). + - `docs/cultnet-transport-parity.md` says, beside the runtime table (`:35`) and the RUDP claims + (`:205-273`), that Kotlin lacks the `3bf1c0c` hardening and the ack cuts until Cut K lands, so nobody + reads it as conforming meanwhile. +- **Verification:** `ygg-verify.sh kotlin 'cd packages/cultmesh-kotlin && pwsh -File build.ps1'` + runs the self-tests green; the interop lane + (`node --test --test-name-pattern "TypeScript and Kotlin|Kotlin and TypeScript"`) runs green on the same + image; CI on `windows-latest` stays green with the same script. + +**K1. Stray-packet parity** (the `3bf1c0c` behaviours the other four have, each with its test ported from +the C# or TS equivalent): +- a malformed, foreign-id or refused datagram is dropped and counted, never thrown out of `receiveOnce` + (K:3223, K:3228, K:2724, K:2567), with a `packetsDropped` stat (`CultNetTransportStats`, K:774); +- the connection id is checked before the endpoint is claimed, and in server mode only a Connect claims it + (K:3217-3222); +- `resetPeerState` and `endRefusedSession`: the refusing session resets, builds its goodbye after the + reset, and a server forgets its endpoint; a refused packet's sequence is remembered only after + reassembly accepts it (today K:2758 remembers before `reassemble` can throw, K:2915-2922); +- `answerRepeatedConnect`: a repeated Connect queues nothing and is answered with the owed Accept or an Ack + (today every Connect makes a new tracked Accept, K:2667-2676, K:3224-3226, K:4005-4006); +- a Connect from another endpoint replaces the peer in server mode (today ignored, K:3220-3221); +- a peer's Disconnect drops owed writes (K:2745-2748); `connect` clears a stale disconnect reason (K:3106); +- `initialSequence` of `0xFFFFFFFF` is refused at construction (K:2631) and sequence exhaustion is checked + before allocation (K:2841, K:2698-2711); +- the decoder's negative declared length (K:3306-3317) is an ordinary malformed drop; +- the fragment-set bound of 64 (K:2645, K:2911-2937 has none): the stalest set is evicted. Cut 2's + never-evict rule and its capability gate come in K3 with Cut F, as in the other runtimes. + +**K2. Cuts 1, 1b and 1c.** +- Cut 1: delete `orderedNextSequenceByChannel` (K:2643), `expectedSequenceIfUninitialized` (K:2728), + `deliverOrdered`/`drainOrdered`/`skipReceivedNonChannelSequences` (K:2939-2978); seed `R` in + `acceptConnect` (K:2667) and on Accept (K:2730); advance in `rememberReceived` (K:2891). +- Cut 1b: the ending primitive from a peer's Disconnect (K:2745), `createDisconnect` (K:2809), + `checkTimeout` (K:2814-2819) and K1's refusal; `flushReliable` (K:3186-3205) binds to the generation. +- Cut 1c: random defaults at K:2600, K:2996, K:3078 and the server's 100 at K:3016 + (`java.security.SecureRandom`); the session's repeat decision replaces server mode's + every-Connect `acceptConnect` (K:3224-3226) and the interop server's (K:4005); `createConnect` (K:2660) + and the Accept check (K:2730). + +**K3. Cuts 2, 3 and F.** Admission at K:2856-2872 gains the flow window; Cut 2's reliable-set rule behind +the Q-A9 capability; the `Abandon` type and receiver branch (K:2556-2567, K:2738, K:3296-3325), the golden beside `rudpPacketCodecUsesDeterministicReliableOrderedFixture` +(K:5236), and the transport skips its own ack for `Abandon` (K:3243-3245). + +**K4. Receipts** (§9): `sendReliable`, `CultNetRudpSendReceipt`, `CultNetRudpSendStatus`, `waitAcknowledged`, +at `sendMany` (K:2685-2719), `admitReliablePackets` (K:2856-2862), `applyAcknowledgements` (K:2882-2889) +and the transport (K:3132-3205). + +**K5. Reliable expiry and the notice sender** — only if Q-A8 is A (as Cut 7). + +- **Verification, each step:** the Kotlin image's self-tests and interop lane; the step's ported tests; + a negative grep per step (K2: `rg -n "orderedNextSequenceByChannel|expectedSequenceIfUninitialized" + packages/cultmesh-kotlin` returns nothing). +- **Ledger.** K1 about +180 and −40; K2 about −70 and +90; K3 about +80; K4 about +90; K5 about +70. + + +## Subtraction ledger (estimate) + +| Cut | Removed | Added | Other | +|---|---|---|---| +| 1 | ~280 | ~160 | four per-channel state machines become one watermark | +| 1b | ~40 | ~45 | one ending primitive; TS's transport generation pair goes | +| 1c | ~90 | ~85 | seven transport- and server-level repeat decisions become one session predicate; two CultLib production pins go | +| 2 | ~10 | ~35 | none; merges with Cut F | +| 2c | 0 | ~45 | C# gains the fragment-set bound the other runtimes have | +| 3 | 0 | ~100 | a documented receive-window contract | +| D | ~15 | ~40 | one failure counter in three servers; a test seam at each send function | +| F | ~15 | ~350 | **wire: one packet type (`Abandon` = Ack + flag bit 4) and one golden in every runtime; with Q-A9 B, the same bit on Connect and Accept**; the false Python expiry claim goes | +| 4 | ~90 | ~85 | one public method (`wait_acknowledged`); the session scope goes; no enum change | +| 5 | ~270 | ~50 | two hand-rolled RUDP loops and cultmesh-ts's connect wait go | +| 6a-6c | 0 | ~270 | public receipt API in three runtimes (Q-A4 A) | +| 7 | 0 | ~210 | only if Q-A8 is A: partial reliability in three runtimes | +| K0-K5 | ~110 | ~510 | Kotlin reaches parity; one verify image; `build.ps1` portable | + +- **Source, net, four runtimes without Cut 7:** about +325. Pass 2 was about −195; the rulings bought + FORWARD-TSN with its capability gate (about +335 net) and receipts in three runtimes (about +270); Cut D + adds about +25 and Cut 2c about +45. Tests are extra: + about 4 × 25 rule tests. +- **Kotlin:** about +400 net, most of it the `3bf1c0c` hardening the other four already carry. +- **Wire:** one additive packet type, ignored by every current peer (FN). +- **Downstream:** no caller has to change code at its next bump. Callers that pin `initial_sequence` keep + a deterministic Connect sequence until they drop the value (Cut 1c, pin-bump notes). + + +## Operator questions + +Each question stands alone. + +**Ruled (2026-09-30), recorded so they are not re-asked:** + +- **Q-A1. Where does delivered come from?** (a): derived at the sender from the cumulative watermark. +- **Q-A2. One flush, or a "received" flush beside it?** One meaning: Acknowledged means delivered. +- **Q-A3. Reliable expiry next to ordered traffic (P2)?** B: FORWARD-TSN now (Cut F). The recommendation + was A (report honestly, document "don't mix"). +- **Q-A4. Receipts in C#, TypeScript, Python and Kotlin?** A: port them in this campaign, after Cut 4 + (Cuts 6a-6c, K4). The recommendation was B (record a parity gap). +- **Q-A5. Is Kotlin in the campaign?** A: yes, as trailing Cut K on a Yggdrasil Kotlin image (K0). +- **Q-A6. How does a session recognise a new generation?** A: the Connect's sequence identifies it; the + default initial sequence is random in [1, 2^31) (Cut 1c). + +**Open:** + +- **Q-A7. Does an abandonment notice name one sequence, or a new cumulative point? (new in pass 3)** + RFC 3758's FORWARD TSN carries a *New Cumulative TSN*: "every missing sequence up to here counts as + received". SCTP can do that because its SACK is cumulative too, so the next SACK confirms it. CultNet's + ack is not cumulative: it names the highest received sequence plus the 32 below it, or one exact older + sequence. So the two shapes cost different things: + - **A. One sequence per notice.** The receiver answers exactly as it would answer a data packet with + that sequence, and that ack stops the sender's notice as it stops a retransmit. No new ack field. The + cost is one small notice per abandoned packet per resend: an expired 20-fragment frame sends 20 + notices, again every resend delay until acked. + - **B. A cumulative point.** One notice covers every abandoned sequence up to it. But nothing on the + wire can confirm it: an ack naming the point might mean the original of that one packet arrived late, + while lower holes are still open. So B needs a second addition, a confirmation Ack (another flag bit) + carrying the receiver's watermark, which puts a cumulative watermark on the wire after all, the thing + Q-A1 kept off it. + - **Recommended: A.** It keeps the wire change to one flag, reuses the ack path unchanged, and the extra + notices only flow while packets are expiring, which is a lossy moment on one session. + - **Blocks:** Cut F (and K3). Nothing else. + +- **Q-A8. Should C#, TypeScript, Python and Kotlin gain reliable expiry? (new in pass 3)** Rust is the only + runtime that can send a reliable packet that gives up after a deadline (partial reliability, for live + media). Cut F teaches every runtime to *receive* the notice, because any of them can talk to a Rust + sender; only Rust can *send* one. A reasonable consumer of the C# or TS library can expect the same send + option. Today the profile field that configures it (`media_reliable_expire_after_ms`, + `rudp.rs:2492-2508`) exists only in Rust and cultmesh-rs. + - **A. Yes, in this campaign** (Cut 7 for C#, TS, Python; K5 for Kotlin): the send option, the profile + field's behaviour and Cut F's sender half. About +70 per runtime. + - **B. Not now.** The parity doc records Rust as the only runtime with partial reliability. + - **Recommended: A.** CultLib is judged by what a reasonable consumer expects (operator, 2026-09-30), and + after Cut F the sender half is small and already specified. It is independent of every other cut, so it + can go last. + - **Blocks:** Cut 7 and K5 only. + +- **Q-A9. What does a receiver do with fragment sets from a sender that never sends abandonment + notices? (new in pass 3, from the Cut 2 Soul pass)** Cut 2 stops evicting reliable fragment sets, because + evicting one whose fragments were acknowledged loses a frame the sender saw acknowledged (P5). But a + sender with reliable expiry, which is every default Rust `media` sender, abandons the rest of a frame + after its first fragment was acknowledged, so the set can never complete; after 64 of them Cut 2 refuses + the session. Cut F's notices release those sets, but only a Cut F sender sends notices, and the receiver + cannot tell an old expiring sender's dead set from a live set still waiting for a retransmit. + - **A. No fallback; bump both ends together.** Cut 2's rule applies to every peer. Any session between a + Cut 2 receiver and a pre-F expiring sender dies after 64 lossy frames, so every such pair (Muninn's + media, Mimir's relay, browsers on vendored CultLib) must move in the same deploy. + - **B. A capability bit, as PR-SCTP negotiates (recommended).** Connect and Accept carry flag bit 4 + ("I send and honour abandonment notices", RFC 3758 §3.1 Forward-TSN-Supported). Old peers ignore it on + those packets (probe CAP, all five runtimes). Cut 2's never-evict rule applies to a peer that advertised + it; a peer that did not keeps today's stalest-set eviction, with today's P5 risk, which only its own + upgrade removes. The sender also stops sending notices to peers that cannot use them. Cost: one flag on + two packet types and one remembered bit per session. + - **C. Age-based release.** A reliable set untouched for some multiple of the resend delay is released + for every peer. It keeps sessions alive without a wire change, but it releases a live set whose missing + fragment is merely slow, which is the P5 lie Cut 2 exists to remove, now on a timer. + - **Recommended: B.** It is the literature's answer, it makes Cut 2's rule hold exactly where its premise + holds, and mixed versions keep working without coordinated deploys. + - **Blocks:** Cut F's capability half and therefore the merge of Cuts 2, 2c and F. Q-A7 is independent. + +**Not forks, recorded so they are not re-asked:** + +- `Acknowledged` keeps its name and now means delivered. No variant is added or removed. +- Delivered means handed to the transport's application boundary, not consumed. +- The 4 MiB cap stays; the receiver's 4,096 receive history stays. +- A receipt is resolved once. +- Session generation is its own two cuts, not part of Cut 1 (§8). +- The notice's resend bound is 16 sends at the resend delay (§6). It is a constant, not an option. +- Receipts live on the single-peer socket transport in every runtime, as in Rust; hub receipts are a + follow-up for all five together. +- A failed send to one peer is that datagram lost (Cut D, RFC 1122's soft errors); it does not end the + peer's session. + + +## Sequencing and blockers + +1. **Done.** `hands/rudp-stray-packets` merged at `3bf1c0c`. Odin `origin/main` pins `3bf1c0ce`. +2. **In flight** (pass 2 text, unchanged by pass 3): Cuts 1 and 1b on `hands/ack-cut1`, Cut 2 on + `hands/ack-cut2`. No ruling forces a change to their specs: + - Q-A3 B adds the abandoned set, but Cut F adds it and hooks it into Cut 1b's primitive; 1b need not know. + - Q-A4 A needs an ending primitive in C#, TS and Python, which 1b already builds. + - Q-A6 is Cut 1c's. + - **Cut 2's merge moves** (the Cut 2 Soul finding): its code stays as specified, but it refuses sessions + with expiring senders unless Cut F releases their dead sets, so it merges only together with Cut F + (and Cut 2c). Its spec's "a conforming sender cannot reach that bound" is corrected in place. +3. **Ready now:** Cut 3 (merge after Cut 1, as pass 2 said); **Cut D** (independent); **K0** (tooling and + `build.ps1`; independent). +4. **Cut 1c** after Cut 1b merges. +5. **Cut F** built on `hands/ack-cut2` after Cuts 1 and 3 merge, once Q-A7 and Q-A9 are ruled. **Cuts 2, + 2c and F merge to `main` together.** +6. **Cut 4** after Cuts 1, 1b and F. +7. **Cuts 6a, 6b, 6c** after Cut 4, in parallel. +8. **Cut 5** after Cut 3 and Cut 1b in TS, as pass 2 said. It may use 6b's `waitAcknowledged` if 6b lands + first; it does not need it (flush suffices). +9. **Cut 7** after Cut F, once Q-A8 is ruled A. +10. **Cut K** after K0: K1 anytime; K2 after Cuts 1, 1b, 1c; K3 after Cuts 3 and F; K4 after Cut 4 + (and Cuts 6 as the parity reference); K5 after Cut 7. +11. **Pin bumps:** + - **Odin** after Cuts 1, 1b and 3 (it is the receiver for every Idunn publisher, so this bump makes + their Acknowledged mean delivered) and Cut D (it is the document server's only production host). Cuts + 2 and F come together at whichever bump follows their merge. + - **Muninn** (and any consumer of the default reliable `media` channel) takes Cuts 2 and F together. + Under Q-A9 B its ends may move separately; under A they must move in one deploy. Its client and + Sleipnir pins of `initial_sequence: 1` should go at that bump (Cut 1c notes). + - **CodexConnector** and **Ghostlight** need no code change; they may adopt `wait_acknowledged` after + Cut 4. +12. **Vendored TS bumps after Cut 5** (they pick up honest flushes, the TS window and the rewritten + publishers at once): + - **StreamPixels** vendors CultLib `542ddd3` (StreamPixels `a49f7d8`; pass 2's `30ee8b9` is stale). + Its service runs `createIdunnRuntimePresencePublisher`, which that revision carries under its older + name (`cultnet-ts/src/idunn-runtime-authority.ts`, pin at `:333`). + - **Heimdall** vendors `b6b1d9c` and hand-rolls its publisher (`src/idunn-rudp-health.ts:55-87`, + `initialSequence: 1` at `:65`). At its bump it calls cultnet-ts's publisher instead. +13. **Parallel campaigns:** `hands/media-fec-cut3` touches `rudp.rs` only in the imports, the `audio` + profile entry and the `"media" | "audio"` send arm; no overlap with Cuts 1-4, D or F beyond a rebase. + Once it lands, reliable expiry is only `media` in Reliable mode. CultCache publication Cut 4 is + unrelated in either direction. + + +## Follow-ups outside this campaign + +- **Hold caps in C#, TS, Python and Kotlin.** Their ordered hold buffers and per-channel maps are unbounded + against a hostile peer. Rust has caps. The far-ahead refusal on data is Rust-only too. +- **The document server's per-session payload budget never shrinks** (`rudp_document_server.rs:321`, + `:584`). +- **Fire-and-forget health.** Muninn `main.rs:9446`, Sleipnir `main.rs:880-904` and Heimdall's first-ack + wait can lose a health record silently. +- **Receipts on hubs** (Rust hub, C# listener, cultmesh-ts and cultmesh-py servers) in all five runtimes + together; and a peer-level `send`-and-wait in TS's `CultNetPeer` (`peer.ts:98-110`). +- **Kotlin self-tests live in the production source** (`CultMesh.kt` K:5236-5633, run from `main`). Move + them to a test source set once the Kotlin image exists. +- **Callers outside CultLib that pin `initial_sequence`** (Cut 1c's table): drop the value at each bump. +- **Mimir `CultMeshMedia`** hand-rolls a per-peer relay with its own Connect handling (`Program.cs:365`, + `:485`); it should call the session's repeat predicate after its CultLib moves. +- **`CultNetTransportStats` parity.** Cut D adds `send_failures` in Rust and C#; Kotlin has no + `packetsDropped` until K1. Record the stats shape in the parity doc once both land. +- **The P4 probe at the old pins** predates its fix; rerun `09318d13`'s P4 against a pinned sender if + old-sender evidence is needed. + +**Follow-up (media FEC Cut 3 Hands, 2026-09-30):** `channel_send_options` in `rudp.rs` has no test for the +`"schema"` and `"latest"` channel arms. Deleting either falls to the default and every test stays green. Pin their send +flags on the wire the way the media arm is now pinned (raw peer socket), in whichever cut next touches channel +profiles. + +**Rulings after the Cut 1/1b/1c Soul pass (Self, 2026-09-30):** +- **Stale data after a reconnect.** A reliable sequence at or before the generation's seeded `R` (serial arithmetic + within the receive window) is a duplicate: acknowledged, not delivered. This is what §6/§8 already promised. +- **Stale Connect (RFC 5961's challenge ACK).** A Connect whose sequence precedes the current generation's Connect + within the receive window is stale: it is answered with an Ack naming the current generation and does not reset. + A client whose Connect gets no Accept before its connect attempt times out starts a fresh attempt with a newly + drawn initial sequence, so a restarted client whose random sequence lands in that window still connects. +- **Server mode.** A Connect from a different endpoint is never a repeat; the session predicate stays sequence-only. + (Hands' deviation 5 was rejected: pinned clients restarting on a new port were locked out.) +- **The random default belongs to the session.** A session draws its own initial sequence when none is set, so one + options object reused across sessions or reconnects never repeats a sequence. +- **Connect attempts (Self, 2026-09-30, after the Cut 1c fix-batch Soul pass).** While a Connect awaits its Accept, only an + Accept the client honours retires it; an Ack never does (an Ack naming the pending Connect had wedged the client for + good). A fresh attempt after the connect-attempt timeout uses exactly the abandoned sequence + (receive window − 1), + not a random draw: that keeps a late copy of the abandoned Connect inside the new one's stale window while escaping the + server's stale window (unless the server sits exactly there, in which case the next attempt escapes). Only a client's + first Connect draws randomly. +- **Recorded divergence (not this campaign's to fix yet).** Only Rust has a receiver receive-ahead window (1,024). TS, + C# and Python acknowledge a far-ahead reliable frame by name and hold it behind an ordered gap indefinitely, so a + stranded ordered channel is silent loss there and "still owed" in Rust. Map a receive window for the three runtimes. +- **Residuals after the final Cut 1c Soul pass (recorded 2026-09-30, low, not fixed):** + - A late copy of a Connect from two or more attempts back (reordered > ~3 s) still restarts the server; the +window−1 + rule keeps only the immediately previous attempt stale. Rust then times out and reconnects; TS/C#/Python hit the + receive-window divergence above (silent loss behind the gap). + - A client pinning `initial_sequence` that restarts while its old data is still in flight after the restarted Connect + can be matched to the old session's resent Accept (byte-identical; the client cannot tell). Pinning forfeits restart + detection; the random default closes it. Document on the option. + - Repeated failed attempts walk the sequence up 4095 per 3 s and clamp at `u32::MAX−1` after ~18-27 days on one session; + make exhaustion a hard error the caller sees (the clamp removal mutant survives). +- **Cuts 3 and D Soul pass (Self, 2026-09-30).** Cut 3: the 4 MiB bound counts every byte sent above the lowest + unacknowledged sequence, acked or not (the spec's wording; the first implementation counted only pending packets). + Cut D: a send failure is either permanent (the datagram can never be sent as built, e.g. `EMSGSIZE`) or transient; + a permanent failure is returned from a caller-directed send and, inside a poll, ends only that peer's session with a + typed reason; transient failures stay counted losses. Windows `ConnectionResetError` on receive is idle, never fatal, + in every server. Cut D's negative grep `send_packet(...)?;` is obsolete: the `?` now propagates encode errors only. +- **Cut 3 merged at `1210fdc7` (2026-09-30).** + - Batch 2 fixed Rust `send`, which checked the window before purging expired packets. It also added a + new-generation test in all four runtimes. + - Soul pass on batch 2: nothing found. 18 mutants were killed. Interop was 27/27, run in `ack1d-interop:2`, + whose Linux wrappers let the Windows-only Kotlin build run. + - Residual: `packages/cultmesh-rs/Cargo.lock` is stale. + - Also recorded: `packages/cultmesh-kotlin/build.ps1` is Windows-only, so Kotlin interop runs off Windows only + through an image with wrappers. + - P2 (the expiry hole) stays with Cut F. +- **Cut D batch 2, Soul pass 2: fix first.** + - cultnet-ts emits transient send failures as `"error"`, which crashes processes with no listener. Section 10's + claim that "Node reports send failures on the socket's error event" is false on Node 24 without a callback: + they are dropped silently. + - C# stale peer objects write into the replacing session. + - cultmesh-py dies on a non-ValueError per-peer failure. + - Six guards are unpinned. + - Batch 3 is in Hands. + - **K1 gains:** Kotlin's idle resend loop (`CultMesh.kt:4033-4036`) is one `try`, so one peer's permanent failure + stops resends for every later peer. That is in addition to a refused packet not ending that peer's session. +- **Recorded (liveness, not fixed):** a lowest reliable packet lost forever stalls the sender 1,023 sequences ahead + while the peer stays alive; session timeout doesn't end it. TCP ends such a connection after a retransmission + limit (R2). Decide with Cut F (abandonment) whether a reliable packet outstanding past a bound ends the session. diff --git a/docs/cultnet-selection-cut.md b/docs/cultnet-selection-cut.md new file mode 100644 index 00000000..1f64b2bf --- /dev/null +++ b/docs/cultnet-selection-cut.md @@ -0,0 +1,3574 @@ +# CultNet typed selection: cut map + +Date: 2026-09-17. Imagination output. Intended path: `F:\Projects\CultLib\docs\cultnet-selection-cut.md`. +No code in this document has been written; nothing here is committed by +Imagination. This is its own campaign with its own map; it does not touch +`docs/typescript-quic-realtime-cut.md` or any code in that tree. + +**Progress, 2026-09-22.** Cut 1 is running (Hands, Sonnet) on the branch +`cultnet/selection-cut1`. It will not merge to `main` until Soul has passed it. + +- **Commit 0, `e420410`:** the cache's public read surface. Twelve tests, six + mutation entries, all killed. +- **Commit 1, `17d10e0`:** `CultNetSelection` and its evaluator, the three v1 + messages, and the three §1 selector engines deleted. v0 now lowers into a + selection. Test results: Networking 162/162, Mesh 252/253 (one skip that was + already there), Caching 188/188. Nine networking mutation entries, all killed. +- **Mutation harness:** `scripts/mutate-dotnet.ps1` is a shared dotnet/NUnit + harness and works for any NUnit project in this repository. +- **Not run through mutations yet:** S1, S2, S6, S9–S15, S17, S20 and S23. A + test pins each one, but none has a mutation entry. + +Two things were found that this map did not name: + +- **`CultNetDocumentBinding` can carry a schema id that differs from its + descriptor's.** The deleted engines checked for this; the evaluator reads + only the descriptor and cannot see it. The fix is at the call sites + (`WithBindingSchemaAlias`, `ExpandSchemaBindingAliases`), so the evaluator + stays independent of the registry. +- **A fourth copy of schema matching, at `CultNetDatabase.cs:1707`**, which + serves `CreateShardSnapshotResponse`. §1 counted three engines; there are four. + **Self's ruling, 2026-09-22: it collapses into the evaluator in commit 2.** + Leaving it would make the claim of one evaluator false. It is a deletion and + takes a mutation entry like the others. + +**Q-J was not implemented, and the map is the reason.** Commits 0 and 1 +shipped `number` as `double?` (`CultNetSelection.cs:71`), `CompareNumber` as +IEEE comparison (`CultNetSelectionEvaluator.cs:103-113`), a JSON schema that +says `"type": "number"`, and a cache `NumberOf` that returns `double`. The +operator had already ruled decimal strings, and §16 recorded it, but §2 and +D8 still specified float64, and nothing specified the canonical form or the +comparison that the ruling explicitly required. Hands built what §2 said. The +Rust Hands caught the conflict before writing a line and stopped, correctly. +**Self swept §2, D8 and the §7 table on 2026-09-22**, and §2 "Numbers" now +specifies the form. The Q-J fix lands on the branch before the Rust runtime, +as its own commits. Commit 1 is not wire-final until it does. + +**Commit 2 landed** (Sonnet) in five parts: +- `0787608` deletes `_projectRecord`. Its two tests now drive a real change of + identity instead of a projection. It also collapses the fourth matcher. +- `c5b03cb` collapses the CultMesh alias checks. +- `4167cc4` adds the fourth matcher's mutation entry. +- `5ba48f0` finishes the Mesh collapse. `CultMeshSnapshotRequestOptions` and + `CultMeshPeerSnapshotDocumentOptions` become records that carry one + `Selection`, and their clones collapse to `with`. `CleanSnapshotFilter` and + the triple rule give way to two owners, `ResolveDefaultSelection` and + `OverlaySelection`. `CultMeshHotBodySubscription` carries one `Selection`. + The four-tier read fallback becomes one read anchored on the record key, + with the two tiers that could return the wrong key's record deleted. +- `4c33a62` adds the Mesh entries: three reverts killed and two loosenings + **survived**. The survivals are fixture gaps, since no test passes an empty + non-null `recordKeys` or a record key with different casing. They go to the + fix batch. + +Mesh is net **−83** against §11's estimate of about −326. The shortfall has +four parts: +- about −41 is the payload-sniff fallback, which was kept; +- `IsSameCultDocumentSchema` stays, because it already delegates entirely and + inlining it would duplicate the resolution at four sites; +- `CultMeshClient`'s three subscription sites still call the v0 + `SubscribeAsync`, which this cut does not retype. They move with Cut 2, + the watch cut; +- the read keeps two tiers, because a test enforces that. + +This is an honest miss. + +**Two corrections to Hands' report.** First, the payload-sniff fallback was +**not "ruled kept by the operator"**. Hands kept it in `c5b03cb` as a +discrepancy, and Soul is judging whether it is a second selection decision or +a decode capability. Second, Hands reports that one Networking test crashes the +test host on a disposed-socket race in `CultNetRudpSchemaServer`/`CultNetTransport` +and calls it pre-existing. Networking was 162/162 at `17d10e0`, so that claim +must be checked against `17d10e0` and `main` before anyone believes it. It goes +to Soul by name. + +**Q-J fix landed** at `e5348d3` (commit 2f, C#). The Rust runtime is next. + +**Soul on commit 2, 2026-09-22** (Opus, pinned at `4c33a62`). **Commit 2 does +not pass.** + +- **S2-1, medium, predates the range.** The crash is real, and Hands was right + that it is older than this commit. It is a disposed-socket race: the ack + `SendTo` at `CultNetTransport.cs:2549/2593` runs on a test's background poll + thread. About 18 tests start `IsBackground` poll threads, and only one of + them (`:1885`) joins its thread before the server disposes. Crash rates: + + | Checkout | Suite | Crashes | + |---|---|---| + | `17d10e0` | full | 1 of 6 | + | `17d10e0` | subscription subset | 5 of 12 | + | `main` | subscription subset | 1 of 12 | + + "162/162" was luck. A second defect sits in the harness: + `mutate-dotnet.ps1:43/61`, under `$ErrorActionPreference='Stop'` on + PowerShell 5.1, throws the whole run away when a host crash writes to + stderr, where it should record the mutant as NO VERDICT. +- **S2-2, high: the rewritten reconcile tests lost what the old ones proved.** + With `_projectRecord` gone, a source key always equals its record key, and + the delete-then-put now arrives through the live `Watch` path, so + `Reconcile()` has nothing left to do. + - Two mutants that `17d10e0` killed now survive: dropping Reconcile's + identity branch (`:261`), and returning early from Reconcile. + - Dropping the add loop (`:274`) and dropping the live identity branch + (`:340`) survive both before and after the rewrite. + - The `RecordKey` comparisons at `:261` and `:340`, and the throw at + `:311`, are now **dead code**. +- **S2-3, high: the fourth matcher was collapsed into the alias matcher, not + into the evaluator.** `CreateShardSnapshotResponse` + (`CultNetDatabase.cs:633-670`) still loops on its own. + - A probe sent `{schemas:[], keys:[]}` to both paths: the shard path + returned 0 rows, `CreateRawSnapshotResponse` returned 2. + - The binding-alias expansion does not run on the shard path either. That + part is plausible, not probed. + - §2 says an empty list is **refused at the door**. The evaluator reads `[]` + as "no filter" (`CultNetSelectionEvaluator.cs:84`) and the shard path + reads it as "nothing". Neither follows the map. +- **S2-4, medium-high: the Mesh one-pass read returns the wrong schema's + record.** At `CultMesh.cs:2730-2750`, the first candidate at the key that + passes the exact match, the alias match or a trial decode wins. With + `[MeshOther, MeshNote]` at one key, a MeshNote read returned MeshOther. + Before `5ba48f0`, the exact schema was searched first. +- **S2-5, medium: Mesh has two decode rules that disagree.** The read accepts + a record by trial decode. `DecodeSnapshotDocuments` rejects the same record + by payload sniff. `RawSnapshotPayloadMatchesSchema` is a real decode + capability, since both of its tests are keys-only. **It is not a second + selection decision.** It is, though, a second copy of the registry's + resolver (`CultNetDocumentRegistry.TryResolveDescriptorByPayloadSchema` / + `TryReadSchemaVersion` / `InferSchemaName`, `:596-670`). +- **S2-6, high: the public `CultMeshSnapshotRequestOptions.Selection` honours + only `Schemas` and `Keys`.** Mesh sends v0 only. A request with a limit, a + field predicate and a header projection went out as `schemas=null + keys=null`, and two full rows came back. A caller's `Selection` also skips + the old cleaning, so `Keys=[""]` now returns nothing where it used to return + everything. +- **S2-7, low, predates the range: selection meaning is decided in two more + places.** `ResolveDefaultSelection` (`:835`) checks the raw `Count` before + cleaning, so `[" "]` selects everything. `ResolveDefaultSelection` reads + null as "no filter", and `OverlaySelection` (`:840`) reads it as "inherit". +- **S2-8, low.** Both options types changed from `class` to `record`, which + gives them value equality and is acceptable. + `CultMeshHotBodySubscription.Selection` exposes mutable arrays on a contract + that was immutable. The prebuilt Unity `GameCult.Mesh.dll` carries the old + API: a release-time follow-up, rebuilt at the next release cut. +- **S2-9 and S2-10:** a miscount in the entries header. For the two Mesh + survivors, Soul's fixtures kill both. +- **Held:** Mesh 3 killed and 2 survived, as reported. Networking 10 of 10 + killed. Every restore verified by hash. The alias-matcher routing is right. + `IsSameCultDocumentSchema` delegates. + +**Self's rulings, 2026-09-22, for the commit 2 fix batch:** + +- **Empty lists and blank keys are refused at the one door, as §2 already + says.** `CultNetSelection.Validate` refuses `keys: []`, `schemas: []`, and + any key or schema that is empty or whitespace, with `selection_invalid`. + `null` means no filter, everywhere. The evaluator never sees `[]`. v0 + lowering carries over v0's old cleaning: an empty v0 list, or one made only + of blanks, lowers to `null`. That is a v0 compatibility rule the lowering + owns, not a meaning the evaluator carries. `ResolveDefaultSelection` and + `OverlaySelection` stop deciding what null means. They build a + `CultNetSelection` and let the door decide. Overlay means "the caller's + selection replaces the default wholesale". +- **The shard snapshot answers through the evaluator**, binding aliases + included, with no loop of its own. +- **Mesh keeps sending v0 in this cut.** §9 says v0-only peers refuse v1, and + FU-v0 retires v0 later. So `CultMeshSnapshotRequestOptions` refuses, loudly + and typed at construction or send, any `Selection` term v0 cannot carry: + `fields`, `cites`, `cited`, `limit`, `cursor`, `descending`, `projection` + other than the default. **Refused, never silently dropped.** Mesh sending v1 + is a follow-up, **FU-Mesh-v1**, triggered by the first Mesh caller that + needs a term beyond schemas and keys, most likely the Huginn consumer or + Cut 2. +- **The Mesh read searches the exact schema first,** then the alias match, + then a foreign id decoded by payload. It uses **one** decode rule shared + with `DecodeSnapshotDocuments`, and that rule is the registry's resolver. + The Mesh copy in `CultMeshSnapshots.cs` is deleted in favour of + `CultNetDocumentRegistry`'s. +- **The dead identity code is deleted, not tested around.** `:261`, `:340` + and `:311` can no longer fire. Reconcile gets a test for what it still owns + after the deletion: flipping `authorizeRecord` per key while the request + stays authorized, and the add loop. Both surviving mutants must die. +- **Test hygiene belongs to this batch, because a flaky M0 is not a + control.** Every test that starts a background poll thread joins it before + its server is disposed. `mutate-dotnet.ps1` records a host crash as NO + VERDICT and carries on. +- **Also owed by Cut 1 and not yet done: R-2.** Python replies + `unsupported_schema_version` to v1 (§9, `interop_peer.py:360-387`, + `cultmesh_py/server.py:341`), with one test per site. + +**Rust commit 3 landed** at `b090ca9`. Its parity vectors wait on the fix +batch below. + +**The commit 2 fix batch landed** (Sonnet), `568e8e3` and `021e3f1`: + +- **Door and lowering.** The door refuses blank and whitespace entries, and + `CultNetV0SelectionLowering` owns the v0 cleaning. +- **Shard snapshot.** It answers through the evaluator + (`NET-D4-ShardMembership-Revert`), with a fixture for exclusion outside the + shard's prefix. +- **Mesh v0 terms.** `CultMeshSnapshotRequestOptions` refuses any term v0 cannot + carry, and `HotBodySubscription.Selection` returns a copy. +- **Mesh read order.** The read goes exact, then alias, then payload, under one + decode rule, and the Mesh copy of the resolver is deleted. The shared rule + is `CultNetDocumentRegistry.TryReadSchemaVersion`, now public, matched against + the caller's own descriptor. `TryResolveDescriptorByPayloadSchema` is + ambiguous when two CLR types alias one schema id, which the foreign-id + fixture does on purpose. +- **Dead code and test hygiene.** The dead identity code in Reconcile is + deleted, and the poll threads are joined. +- **Harness.** `mutate-dotnet.ps1` records a host crash as NO VERDICT. +- **R-2.** The Python v0 peer refuses v1. + +Tests: Networking 195/195 over ten consecutive runs, with no crash. Mesh +253/254 with one skip that was already there. Caching 192/192. cultnet-py +54/54. Mutation entries 22/22 killed across the fix-batch, Mesh and Networking +files, and both Mesh survivors now die. Delta: Mesh −3, Networking +62. + +**Open for Soul:** + +- It is unclear whether the door now refuses `[]`, as ruled, or only blank + entries. The report names blank entries only. +- Seven `cultmesh-py` daemon tests fail on `ModuleNotFoundError: cultcache_py` + in a spawned child process. Hands calls this pre-existing; `main` must + confirm it. +- The anchor-matching fragility of `mutate-dotnet.ps1` (separator spelling) is + recorded, not fixed. + +**Commit 4 landed** (Sonnet) at `00f4c02`, completing Cut 1's execution. +- **Parity vectors (S12):** `contracts/cultnet/interop/selection-vectors.{cs,rs}-written.json`, + 8 vectors each, read in both directions. Six are evaluated selections. Two + are door refusals: `schemas: []`, and a blank key. +- **Door:** `keys: []` and `schemas: []` **are** refused (`CultNetSelection.cs:326/328`), + as ruled. +- **Tests:** cultnet-rs 111 → 174, cultcache-rs 64 (unchanged), Networking + 196 + 1 skip, Caching 192, Mesh 252/253. +- **Mutation entries**, all killed: + - Rust 23/23; + - Caching 10/10, including 4 Q-J; + - Networking 15/15, including 5 Q-J. + + S6 first survived. Its fixture now carries two references to the same + target under different roles. S9–S15 and S17 do not apply to Rust + (Rust has no subscription client). +- **Open for Soul, highest first:** + - **No `cites` vectors cross the runtimes.** Hands says C#'s + `MatchesCitation` compares `Citation.Target.SchemaId` against the real + SHA-256 schema id with no alias fallback, so "this fixture pair cannot + agree". That is either a fixture limit or **a wire-parity gap in the + hop**, and parity is this cut's invariant. Soul settles which. + - **Size:** `selection.rs` is 1,407 lines and `contracts.rs` +595, about + 2,000 in all against §14's roughly 430. + - Hands calls S20 "structurally vacuous" and S23 without a surface in Rust. + Both are claims, not yet reached, and need checking. +- **A flaky test, recorded as a follow-up.** + `reactive_document_coalesces_direct_same_schema_alias_member_writes` + (`packages/cultnet-rs/tests/cultnet.rs`) fails under the harness's + invocation of the full binary and passes in isolation. The v0-lowering entry's + command was narrowed around it. It is not this cut's code. Its owner is the + reactive-document path. + +**Two pre-merge additions from the Huginn read-side map, 2026-09-22.** They +join the next selection fix batch, whatever the final Soul pass adds. + +- **P-1:** Rust's `Evaluation` gains `matched`. Rust cannot fill the page's + `matched` today. +- **P-2:** derive `Eq` on the selection wire types, because Huginn's request + derives it. + +**Load-bearing for Huginn:** `Cursor::parse` is public and exposes `as_of`. +The organ answers a cursor's page at the cursor's own `asOf`. If a finding +makes `parse` private, expose `cursor_as_of` instead. + +**Soul's whole-cut pass, 2026-09-22** (Opus, at `00f4c02`). **Cut 1 does not +merge.** The notes are in the session scratchpad at `soul-ss4-notes.md`. + +- **High, confirmed:** + - **The C# reference never answers v1.** No v1 listener is registered + (`CultNetDatabaseServer.cs:49-55`, `Server.cs:562-571`). + `CreateSelectionResponse` and `LastWriteSequence` have no callers. §7's + server handling, D6's subscription v1 and S9 were never built. Hands + reported none of it missing. + - **`cited` returns the wrong edges in both runtimes.** Edges are filtered by + whether the *citer* is on the page, but under `cited` the page rows are the + *cited* rows. `exists:true` gives no edges. `exists:false` gives edges into + rows that are not on the page. The committed vector pins the wrong answer. + - **The C# door accepts `"5\n"`.** .NET's `$` matches before a final + newline. Rust and the schema refuse it. +- **Parity broken on caller inputs:** + - **Float rendering at ties.** 394 `f32` and 48 `f64` values out of 200k + render differently, because .NET rounds half to even and Rust does not. + A shortest form is a stand-in for the value in any case: an `f32` of 3e20 + is stored as 300000006012263202816, bits `0x61821ab1`. (Corrected + 2026-09-22. Soul's report and this map first gave 300000002010536247296. + The Rust Hands and an independent Python `Decimal` check both give + ...6012263202816.) + - **`schemas`.** C# matches through the alias matcher and Rust matches exact + ids. `["leaf_a"]` gives 8 rows against 0. + - **Tiebreak.** C# compares UTF-16 code units and Rust compares UTF-8 + bytes, so astral keys sort in opposite orders. + - **`cited` edge order.** It comes from a Rust `HashMap` and is + nondeterministic. + - **`any_of` on a numeric alias.** C# goes through a culture-dependent + `ToString()`. +- **The door is advisory.** Both `select` implementations are public and never + validate. Rust's `matches` only `debug_assert`s the hop, so a release build + ignores `cites` and `cited`. Mesh `EnsureV0Compatible` lets `Keys=[]` and + `[""]` through, and v0 lowering turns them into "every key". +- **Not what the map specifies:** + - `Matched` counts the page, which breaks C5. + - v0 and shard snapshots re-evaluate the whole cache on every page, which is + O(N²/200), and cannot detect a write between pages. + - Cursor digests collide: `["a|b"]` digests the same as `["a","b"]`. + - S20 has no C# test. Two S20 mutants survive 196/196. Rust `select` + ignores `projection`, so the rule has no owner there. Nothing tests + `SelectPage` or `CreateSelectionResponse`. +- **The Networking host still crashes**, 2 in 11 runs. The flaky `HasConsumers` + assertion (`NetworkingTests.cs:1720`) predates this cut. Joins sit outside + `finally` in about 18 tests, so a failed assertion becomes a host crash. The + "10 runs, no crash" claim did not reproduce. +- **Low:** + - The JSON schema disagrees with the runtimes on `limit` bounds and on + `minItems`. + - Python R-2 refuses only v1, so v2 and later are still dropped. + - `TryReadSchemaVersion` is a public sniff heuristic, and two Mesh sites + repeat the same line around it. + - Rust v0 dedups before `reject_duplicates`, so that function is dead. + - `mutate-dotnet.ps1` throws on `\` against `/` in paths. +- **Deletions Soul named:** + - `contracts.rs:1206-1541`, about 335 lines of hand codecs that the serde + derives already round-trip, verified both ways; + - `expand_scientific_notation`, about 46 lines, dead: 400k renders produced + no exponent; + - `reject_duplicates`; + - `RawDocumentHeader::from_document`, which has no callers; + - C#'s `WithBindingSchemaAlias`/`ExpandSchemaBindingAliases` duplicate, + about 60 lines, and a shared lower-and-page loop, about 20 lines. +- **Settled:** `cites` is a fixture limit, not a parity gap. With real SHA-256 + ids, 40 selections agree byte for byte. The seven `cultmesh-py` failures + are environmental: with `PYTHONPATH` set, 78/78 pass. The flaky Rust test + waits 30×5 ms for a flusher, which is too short under contention, and it is + not this cut's. +- **Held:** + - Every mutation suite killed everything. + - Door refusals are byte-identical apart from `"5\n"`. + - The Q-J comparator agrees with Python `Decimal`. + - No float sits on either comparison path. + - Negation, limit clamping and v0 dedup are at parity. + - Mesh reads in the order exact, then alias, then payload. + - Mesh is actually 253/254. + +**Self's rulings for the Cut 1 fix batch, 2026-09-22:** + +- **R-A. Serving v1 is part of this cut.** Both C# servers register v1 + listeners. The snapshot answers through `CreateSelectionResponse` in + last-write order, and the subscription server answers v1 as D6 and §7 say, + with S9 tested. A v1 request that is not served is a defect, not a + follow-up. +- **R-B. Hop edges follow the hop's direction.** Under `cites`, the edges are + the ones *from* page rows. Under `cited`, they are the ones *into* page + rows. Every edge touches a page row. The order is deterministic: the + page-row order, then `(from, role, to)` in code-point order. Regenerate the + vectors. +- **R-C. Every string comparison in the vocabulary uses Unicode code-point + order.** In Rust that is UTF-8 byte order. C# compares by code point, not + by UTF-16 unit. This covers the tiebreak, edge order and anything else + ordered. +- **R-D. A floating-point member renders as its exact decimal expansion, + in canonical form, and not as a shortest form.** Every finite `f32` and + `f64` is an exact dyadic rational and has a finite decimal expansion. That + expansion is the stored value, it is the same in both runtimes by + construction, and it matches the reason for Q-J. Implement it from + mantissa and exponent, with `BigInteger` in C# and a small bignum in Rust. + Add no new dependency unless the expansion cannot be written in about 60 + lines. `decimal` and the integers are unchanged. **Flagged for the + operator's review:** this is Self's reading of Q-J, and it changes what + `ge "3e20"` means for an `f32` of 3e20. **Accepted by the operator, + 2026-09-22** ("I accept your recommendations"). +- **R-E. There is one schema-identity rule in both runtimes.** Rust gets the + alias matcher (the owner is `cultnet-rs`, ported from + `CultNetSchemaAliasMatching`). `schemas`, `cites.target.schemaId` and the + binding id emitted on records all go through it. A `cites` target that + matches no schema is refused at the door, never answered with an empty page. + `ToRawRecord` and `ToEdge` emit the same id. +- **R-F. The door is inside `select`.** `select` validates first, in both + runtimes, and returns the typed refusal. A public entry point that skips + validation does not exist. Rust's hop handling is not a `debug_assert`. + Mesh's `EnsureV0Compatible` runs the door first. +- **R-G. `matched` is the total number of matches, not the page count** (C5). + Rust's `Evaluation` carries it (P-1). A single evaluation answers v0 and + shard paging, taken as one snapshot. +- **R-H. Cursor digests use length-prefixed encoding** for every string and + list, in both runtimes. +- **R-I. The projection has an owner in both runtimes.** `cultnet-rs` gets + `select_page`, which produces `SelectionPage` under `projection`, with + `matched` and edges. C# `SelectPage` and `CreateSelectionResponse` get + tests, and so does S20. Page bytes are compared across the runtimes in the + parity vectors. +- **R-J. `any_of` on a numeric alias** compares the canonical rendering. +- **R-K. Test hygiene is finished, not claimed.** Every poll-thread join + moves into `finally`, and the `HasConsumers` race gets a deterministic + wait. The fix is proven by 20 consecutive full runs. +- **R-L. The contract follows the runtimes.** The schema gains + `minItems: 1` on `schemas` and `keys`, and `limit` is documented as + clamped. Python refuses every `cultnet.*.vN` with N > 0. + `TryReadSchemaVersion` goes back to internal, behind a registry method that + takes the descriptor. `mutate-dotnet.ps1` normalises path separators. +- **R-M. Soul's named deletions all land.** P-2 (`Eq`) lands too. + +**The C# half of the fix batch landed** (Sonnet), `7903853`..`3d32c67`. + +What changed: +- **R-A:** v1 is served by both servers, and D6 reconcile routing is in place. +- **R-C:** `CultNetCodePointComparer` gives code-point order. +- **R-D:** floats render as their exact decimal expansion, computed with + `BigInteger`. +- **R-E:** cites go through the alias matcher, and the wire id is one + `WireSchemaId`. +- **R-F:** the door is unconditional inside `Select`. +- **R-G:** `Matched` is the total, computed once through `EvaluateAll` and + `SelectAll`. +- **R-H:** the cursor digest is length-prefixed. +- **R-J:** numeric `any_of` compares the canonical form. +- **R-M:** `WithBindingSchemaAlias` and the duplicated paging loop are deleted. +- **R-I:** tests kill both S20 mutants. One real bug was fixed in the + process: `ToEdge` serialised a plain-typed payload as a document. +- **R-K:** every join is in `finally`. `HasConsumers` now waits for the + condition. +- **R-L:** the schema carries `minItems`. Python refuses every vN>0 (only + one site exists). The harness normalises path separators. +- **Vectors:** `cs-written.json` is regenerated and gains the float-tie, + cites-by-alias, astral-order and projection cases. + +Tests: Networking 201/202, where the one failure is the stale Rust vector +until the Rust half lands. Caching 192. Mesh 253/254. Python 54, 78 and 34. In +20 full runs there was no crash, but one run had an unexplained failure. + +**Not done, sent to a second Hands:** mutation entries for the fix-batch +rules (there are only regression tests), S9, and a diagnosis of the 1-in-20 +failure over 30 runs. + +**The Rust half of the fix batch landed** (Sonnet), `8b114ed`..`a088435`: +- 36/36 entries killed. +- Three real bugs were found while it ran, among them a v0 fast path that + had inherited the door's "empty matches all". +- The `contracts.rs` hand codecs are gone (−362/+35). +- The Rust Hands corrected `f32` 3e20 to `300000006012263202816`. + +**Shared parity fixture** (Sonnet), `3317ddd` and `defb9a1`. Both runtimes now +build their vectors from +`contracts/cultnet/interop/selection-vectors.fixture.json`, which uses real +SHA-256 ids. A test bug is fixed: both readers had compared the page size with +`matched`. Of 15 vectors in each direction, the following agree byte for byte: +exact ids, float tie, astral order, header and document projection, +`cites`/`cited`, and the refusals. **Two real parity defects:** +- **Two incompatible alias rules.** C#'s `CultNetSchemaAliasMatching.Matches` + (`CultNetDatabase.cs:74-87`) strips `.vN` and compares against the + descriptor's `SchemaName`. Rust's `schema_alias::matches` + (`selection.rs:452-459`) strips `.vN` and compares against the *hash*. No + alias resolves in both. +- **C# does not refuse an unresolved `cites.target`** (`CultNetSelection.cs:361-391`), + which R-E requires. Rust does refuse it. + +**Self's ruling, 2026-09-22: the C# reference's alias rule is the rule.** +CultLib keeps wire parity against the C# reference. An alias is a schema +*name* with a `.vN` suffix, resolved against the descriptor's name. A +hash-shaped alias is not a wire form. Rust ports the name rule, which means +its `RowSet` must expose each schema's name, and it deletes the hash-stripping +matcher. C# refuses an unresolved `cites.target` at the door. Each vector that +fails today becomes a vector both runtimes must pass. + +**The Rust alias port landed** (Sonnet). Rust's `schema_alias::matches` is +now `(candidate, schema_id, schema_name)`, and it matches the C# reference row +for row: exact id, bare name, `.vN` on the name, case-sensitive, the last +`.v` marker wins, and `.v` with no digits is taken literally. The C# table was +produced by running the reference source. The hash-stripping overload is +deleted. `SchemaVersion` and `CompatibleSchemaIds` are not ported, because no +Rust call site needs them; that is a stated reduction. Rust entries are 40/40 +killed. The whole suite had never run under `-Repo` before, and its commands +now carry `--manifest-path`. + +| Reader | Vectors from | Pass | +|---|---|---| +| Rust | `cs-written` | 15/15 | +| C# | `rs-written` | 14/16 | + +The two C# failures both come from the pending C# door refusal of an +unmatched `cites.target`, which sits with the matrix Hands. + +**The early Soul pass (commits 0–1, pinned at `17d10e0`) reported late, on +2026-09-22.** It was interrupted three times by API errors. Much of what it +found is already covered by R-A to R-M. These findings are **new, and still +open against the current branch:** + +- **F2, high: typed refusals never reach the wire.** `CultNetErrorMessage` + (`CultNetSchemaMessages.cs:~498-512`) has no `code` and no `details`. Nothing + maps the selection or cursor exceptions to an error. This means + `selection_invalid`, `cursor_stale`, `cursor_invalid` and + `reference_outside_target` exist only in-process. +- **F6, high: the cursor can be forged.** The digest is an unkeyed SHA-256 + that anyone can recompute, so any caller can mint a cursor. A record key + containing the U+241F delimiter makes a server's own cursor fail to parse. +- **F7, high: authorization sees two different ids.** On the snapshot path, + the authorizer receives the binding's wire id. On the live path it receives + the descriptor id (`CultNetDatabaseSubscriptionServer.cs:~309` against + `:~451`). A row delivered by the snapshot can therefore be refused on its + first live change, or leak through a denylist. No test pins the live id. +- **F8, medium: `LastWriteSequence` is not the order a snapshot reflects.** + - Replica apply paths (`CultNetDatabase.cs:~1416`, `:~1459`) never set it. + - Nothing rebuilds it after a restart. + - Sequences are per shard, but `asOf` is a single `ulong`. +- **F11, medium: v0 lowering changed what v0 answers.** A snapshot with + `recordKeys: []` used to answer empty, and now answers every row. v0 rows + now come back in schema-and-key order instead of the requested key order. +- **F12, medium: the committed schemas do not describe the bytes C# writes.** + - Headers `$ref` a record schema that requires `payload`. + - MessagePack-CSharp writes both `headers` and `documents`, one of them + nil, so every C# page fails the `oneOf`. + - `fieldPredicate` does not forbid `values` and `number` together. +- **F14, low, now reachable because v1 is served: field predicates on a + Removed change throw.** `TryGetIndexValue(null)`, at + `CultNetDatabaseServer.cs:~375`. +- **F15, low: `cites` skips the out-of-target check** for edges that do not + point at the requested key. `EnsureWithinDeclaredTarget` also returns early + when `TargetType` is null. +- **Surviving mutants:** + - S1-Loose (reachable becomes all descriptors); + - S2-AllOf; + - S17-FirstLeaf; + - Door-NoValidate, since fixed by R-F; + - S5-DigestNoFields; + - Auth-LiveSchemaId, which is F7; + - QL-OutOfTargetCites, which is F15. + + S4 has no entry. A clone at `C:\ss1` was left behind: the Soul pass could + not remove it. + +**Self's rulings for fix batch 3, 2026-09-22.** Batch 3 goes to Hands once the +C# matrix Hands and the Rust alias port have landed, so that no two C# Hands +edit `src/` at the same time. + +- **R-N, F2: refusals are wire messages.** `cultnet.error.v0` gains `code` and + `details`. That is an additive field, so the version is unchanged, and v0 + peers ignore it. Every selection and cursor refusal, and + `reference_outside_target`, maps to its code in both servers and in Rust. + Tests decode the bytes a peer actually receives. +- **R-O, F6: cursors are keyed.** The digest becomes an HMAC under a key the + answering server holds. The key is random per process, so a cursor does not + survive a restart and answers `cursor_invalid`. That is acceptable, because + cursors are short-lived and §2 already calls them "minted by the answering + server". The cursor body uses length-prefixed fields, not a delimiter. Rust + does the same, since Huginn mints cursors. +- **R-P, F7: one id reaches the authorizer, and it is the wire id**, on the + snapshot, live and reconcile paths alike. A test pins the id each path + passes. +- **R-Q, F8:** every path that commits a row, whether local or a replica + apply, sets the last-write sequence. It is rebuilt from the mutation log at + startup. A multi-shard selection's `asOf` is defined, or refused: a + selection that spans shards is answered only when every row comes from one + shard's log. Otherwise it is refused with `cursor_stale`/`selection_invalid` + as appropriate, and the choice is documented in §2. A single shard is the + case today. +- **R-R, F11: v0 lowering preserves v0's pre-cut answers exactly.** v0 is a + frozen contract for the TS, Python and Kotlin peers. **This corrects the + earlier ruling in the commit 2 fix batch**, which lowered an empty v0 list + to "no filter". Where the pre-cut v0 server answered empty for + `recordKeys: []`, it still answers empty. Where pre-cut v0 kept the + requested key order, it still does. The pre-cut behaviour comes from the + code at `b3d9cf7`, and tests prove it by running the same requests against + both. +- **R-S, F12: the schemas describe the bytes.** Add a header schema, make the + page shape match what MessagePack-CSharp writes (nil keys included), and + make `fieldPredicate` exclusive. A test decodes real C# bytes against the + schemas. +- **R-T, F14 and F15:** removed changes are evaluated without reading a + document. A removal matches through the selection's keys and schemas + alone, and field predicates count as unknown. `cites` checks every edge + against its declared target. +- **R-U: every surviving mutant from the early pass becomes an entry, and it + must die.** That covers S1-Loose, S2-AllOf, S17-FirstLeaf, + S5-DigestNoFields, Auth-LiveSchemaId, QL-OutOfTargetCites and an S4 entry. + +**Fix batch 3 is landing in pieces, 2026-09-22.** + +- **The harness is retired** (operator ruling). The branch's `mutate-dotnet.ps1`, + the four `*.entries.ps1` and the Rust entries file are deleted. Tests pin + behaviour, and Soul runs Stryker.NET and cargo-mutants on the diff. +- **C#, first pass** (`8d7bee9..f366791`): R-R (v0 lowering answers exactly + what pre-cut v0 answered, key order included) and the cites-refusal vectors. + C# now reads 16 of 16 Rust vectors. It stopped there, so R-N, R-O, R-P, R-Q, + R-S, R-T and R-U were left. + - **R-R meets R-F:** the raw v0 wire answers an explicit empty list with an + empty page, while Mesh's `EnsureV0Compatible` refuses that list before + sending. Both layers keep their own ruling, which is right. +- **Rust** (`5cf31d1..c606eb3`): R-O (keyed cursor), R-T, R-R, and the entries + file deleted. + - **The cursor API for Huginn:** `Cursor::parse` stays public and key-free + and still exposes `as_of`. Only digest verification needs the process key, + so no second helper was needed. + - Rust reads 17 of 17 C# vectors. + - **R-N is pending in Rust by design.** An earlier guess at the wire shape + was backed out; Rust matches C#'s field names byte for byte once they land. +- **C# pass A is in Hands:** R-N, R-P, R-T. **Pass B follows:** R-O, R-Q, R-S, + R-U. +- **C# pass A landed** (`66b5e60`, `e8a3dec`): R-N, R-P and R-T. + - **R-N's wire shape:** `CultNetErrorMessage` gains `code` and `details`. + `CultNetErrorDetails` carries `field`, `value`, `asOf` and `current`. The + codes are `selection_invalid`, `cursor_stale`, `cursor_invalid` and + `reference_outside_target`. The schema gains both fields additively. + - Two catch sites that previously let the exception escape now answer the + peer. + - **R-P:** the live fast path authorized on the descriptor id and now uses + the wire id, so all three paths agree. + - **R-T:** a removal skips field predicates instead of dereferencing a null + document. `cites` no longer early-returns on a null target, and **the root + cause was in CultCache**: a many-reference declared without an explicit + attribute left its target type null, even though the element type was + statically known, so the out-of-target check silently skipped. + - Networking 223 pass and 2 skip; Mesh 255. + - **The Caching claim was wrong.** There is one failure, not three, and it + is identical at the branch head, at `b3d9cf7` and on `main`. It expects a + write to a read-only directory to fail, which cannot happen in a container + running as root. **Environmental.** +- **Rust R-N landed** (`eff62e5`): 213 tests pass. Parity is pinned by + **captured C# bytes** for all four codes, taken from a probe run on the + dotnet image. + - **An encoding trap the vectors would not have caught:** MessagePack C# + always writes all five declared keys in declaration order, nil included, + while Rust's generic path sorts keys alphabetically. Rust now builds that + map by hand. **A key added or reordered in either error type must be + mirrored there.** + - **A defect in C#, sent to pass B:** `ForReferenceOutsideTarget` prefixes a + message that already carries its own prefix, so a peer reads + `reference_outside_target: reference_outside_target: …`. + - The parity-vector machinery carries no concept of an error message, so + R-N's parity lives in its own byte-level test. That is the right home. +- **C# pass B landed** (`a4cf54f`..`52082ec`): R-O, R-Q, R-S and R-U, plus the + doubled `reference_outside_target` prefix. + - Networking 238 pass and 2 skip; Mesh 255. + - **Hand probes: six of seven killed.** S1-Loose, S2-AllOf, S17, S5-DigestNoFields, + Auth-LiveSchemaId and S4 all die. + - **QL-OutOfTargetCites is a genuine gap.** Since pass A fixed + `CultCache.ResolveReferenceTarget`, the fixture's many-reference gets an + inferred target type, so the guard never fires for it. `TargetType` is now + null only for a scalar reference typed as the bare `ICultRecordRef`, and + no fixture reaches that shape. **Open for Soul:** is that shape + registerable at all? If it is, pin it. If it is not, the null branch is + dead and goes. + - **Two fixes found while writing the tests:** + - the cursor's length prefix counted UTF-16 chars, so an astral key did + not round-trip; + - `MiniJsonSchemaValidator` had no `not`, so the exclusivity test found + nothing. + - **`cultnet.raw-document-record.schema.json` was missing `schemaName`, + `schemaVersion` and `schemaContentHash` entirely.** Any real C# page would + have failed it on `additionalProperties: false` before R-S's own bugs even + mattered. + - **Self's correction: cursors need no cross-runtime byte parity.** The + brief for pass B said Rust and C# must encode a cursor identically, on the + premise that one runtime parses another's cursor. **That premise is + wrong.** A cursor is opaque, minted by the answering server and echoed + back by the caller, and the digests cannot verify across processes because + each server holds its own key. Both encodings are length-prefixed + five-field bodies with an HMAC-SHA256 digest, and they differ in base64 + flavour and separators. That is correct and stays. Rust's own doc said so + first. + - **Settled by Soul:** three Caching failures, identical at `b3d9cf7` and + `52082ec`. All three expect a write to a read-only directory to fail, and + the container is root. **Environmental.** Pass B's count was right. + +**Soul's whole-cut pass, 2026-09-22** (Opus, at `52082ec`). **Cut 1 may not +merge.** + +- **Held:** Networking 238 and 2 skips, Mesh 255, cultnet-rs 213. R-Q holds + (both replica applies, the startup rebuild, and a shard-spanning refusal). + R-O holds against a stranger and across a restart, and the astral key + round-trips. R-H's digest covers every selection term. R-R holds and is + honest. R-A holds. R-F's door is inside `EvaluateAll`, which every path + reaches. The canonical-number door is anchored `\A..\z`. +- **S-1, high: the hop indexes rows by record key alone.** `byKey` + (`CultNetSelectionEvaluator.cs:176-178`) and Rust's `HashMap<&str, &R>` + (`selection.rs:1457`) both keep the last row at a key. CultCache keys are + unique **per schema**, and the Mesh tests already put two schemas at one + key. With rows in one order the selection refuses valid data as + `reference_outside_target`; in the other order it succeeds. Under `cited` + the index is a set of bare keys, so a row of one schema counts as cited + because something cites another schema at the same key. +- **S-2, high: R-T's `cites` half did not land in C#.** C# filters edges by + the citation's key (`:355`) **before** `EnsureWithinDeclaredTarget` (`:359`); + Rust checks first. A many-reference declared to one leaf but holding an edge + into another is refused by Rust and accepted by C#. +- **S-3, high: a selection with both hops loses its `cites` edges in Rust.** + `selection.rs:1541` computes one direction for every edge; C# anchors each + edge by its own hop. No vector covers both hops. +- **S-4, high: the error message fails its own schema.** Nothing decodes real + `CultNetErrorMessage` bytes against `cultnet.error.schema.json`. + `routingHint` is undeclared under `additionalProperties: false`, and nil + `details.asOf`, `details.current`, `code` and `details` all fail their + declared types. The header schema shows the nullable pattern was understood + and simply not applied here. +- **S-5, medium: Stryker leaves 85 survivors** over the cut's two core files: + 396 mutants, 310 killed, 85 survived, **75 with no coverage at all**, score + 66%. The old "every entry killed" was an artifact of a hand-picked list. +- **S-6, medium: the cursor is malleable in its own position.** The digest + covers the selection but not the body's `asOf`, `ordinal`, `schemaId` or + `recordKey`. A caller holding one valid cursor can rewrite its position and + reuse the digest. +- **S-7, medium: R-I's claim is false.** The vectors compare ids, `matched`, + `hasNext` and edges. They never compare page bytes, `asOf`, `next`, or a + refusal's code, and `rs-written.json` carries no projection vector at all. +- **S-8, low: the out-of-target null branch is dead.** D11 refuses a bare + `ICultRecordRef` in both scalar and many form, so every surviving shape has + a non-null target. +- **S-9, low: `asOf` is the maximum across all shards**, so a single-shard + page advertises another shard's number, and an unrelated write invalidates + a live cursor. +- **S-10, low: `MiniJsonSchemaValidator` silently ignores** `minimum`, + `maximum`, `maxLength`, `maxItems`, `anyOf`, `allOf`, `if/then/else`, + `uniqueItems` and `format`. The committed schemas use `minimum` 34 times, + including `limit`'s bound. Its `pattern` also runs through .NET `Regex`, + whose `$` accepts a trailing newline. +- **S-11, low:** the v1 subscribe refuses a hop before running the door and + always names field `cites`. +- **S-12, low:** the fixture's prose still calls the alias vectors a + cross-runtime defect, which the alias port fixed. Rust's port also drops + `SchemaVersion` and `CompatibleSchemaIds`, so R-E is two rules agreeing on a + subset. +- **Where the evidence lives.** The pass ran against `52082ec`. Its nine hand + probes — eight C# and the Rust both-hops probe that proved S-3 on a matched + pair — are on branch `soul-probe` in the scratch clone `C:\ss5` + (`e0fd672..107ff5f`), **unpushed**. Nothing reached origin and the pinned + checkout at `F:\Projects\CultLib` was never touched. Notes are at + `scratchpad/soul-sel-final-notes.md`. Probes are scratch by doctrine and are + meant to be thrown away; this pointer exists because S-1 through S-3 were + proven there and fix batch 4's tests have to reproduce them independently. If + `C:\ss5` is gone, the probes are gone with it, and that is acceptable — the + findings are recorded here, which is the durable copy. +- **Soul's own corrections, same pass.** It first reported a wedged + `cargo mutants` job on Yggdrasil and asked for it to be killed. Checking the + box rather than its log, the work directory was already gone: what it had + lost was its detached ssh's output. Self had by then killed the process, + which was Soul's own run, so nothing else was affected. **The shape is worth + keeping: a log is not the machine, and Self acted before confirming the + process was actually stalled.** +- **The Stryker triage is owed, after four attempts, none of them Stryker's + fault.** The `dotnet/sdk:10.0` image has no `python3`; the JSON reporter threw + on `CreateDirectory`; two runs with a different output path ran about fifty + minutes without finishing, against three minutes for the mutation phase that + did complete. The completed run stands, and the command is in Soul's notes: + `dotnet-stryker --project GameCult.Networking.csproj --mutate "**/CultNetSelection*.cs" --reporter json --reporter progress --concurrency 4`. + **Read the HTML report Stryker writes beside the JSON**, rather than parsing + JSON in the container. +- **The triage landed on the fifth attempt, 2026-09-22, and it sharpens S-5 + rather than softening it.** Most of the 85 are message-string mutations and + are not worth chasing; roughly a dozen are real, and they sit on the rules + this cut exists to enforce: + - `CultNetSelection.cs:439`, `Any()` → `All()` survived. §2's "a comparison + on an alias any reachable schema declares non-numeric is refused" degrades + to "refused only if every reachable schema declares it non-numeric". No + fixture has an alias numeric on one reachable leaf and a string on + another — the exact case the rule exists for. + - `CultNetSelection.cs:387`, `||` → `&&` survived. A `cites.target` with a + schemaId and a blank recordKey, or the reverse, stops being refused. + - `member.IndexAlias ?? member.MemberName` → `member.MemberName` survived at + all four sites (`CultNetSelectionEvaluator.cs:352,384,404` and + `CultNetSelection.cs:445`). §2's role-naming rule for the hop is untested + everywhere it is implemented. + - `CultNetSelectionEvaluator.cs:203,204`, `ThenBy` ↔ `ThenByDescending` + survived on both paths: the `(ordinal, schemaId, recordKey)` tiebreak is + pinned by nothing. + - `CultNetSelectionEvaluator.cs:290-297`, five order flips in `EdgesFor`, all + survived. **R-B's "page-row order, then `(from, role, to)` in code-point + order" has no test pinning a single component**, though R-B exists because + that ordering was wrong once already. + - `CultNetSelectionEvaluator.cs:590-605` has no coverage at all: + `ComputeDigest`'s `cites` and `cited` branches, plus the number-presence + flag at `:584-585`. R-H's collision-freedom rests on a reading, not a test. + - `:673,678` survived: `Cursor.Parse`'s length-prefix bounds checks, on + attacker-supplied base64. `:307,322` survived: cursor positioning under + `descending`, and `ComparePosition`'s schema-vs-key tiebreak. `:710,715,729` + survived: the code-point comparator's surrogate path, despite R-C having a + vector for it. + - **Equivalent, not to be chased:** `Selection.cs:103` `<=`, `:118` `>=`, + `:121` `dot <= 0` are guarded upstream and unreachable for canonical input; + `:103,107` turn `sign * x` into `sign / x` with `x` in {-1,1}; `:109` + Max→Min is a no-op because `PadRight` to a shorter length does nothing; + `:80` is a `RegexOptions` flag; `Evaluator:272` is equivalent because + `full.Edges` is empty without a hop. +- **Soul withdrew a finding of its own in the same pass.** It had reported that + C#'s cursor digest does not sort its lists while Rust's does, offered as a + low-severity intra-runtime difference. `CultNetSelectionEvaluator.cs:637` + sorts by code point, same as Rust. The remark belongs in no fix list. +- **cargo-mutants cannot run on `cultnet-rs` at all.** `schema_discovery.rs` + uses `include_str!("../../../contracts/…")`, which escapes the package, so + the tool's copied tree fails its baseline build. **There is no mutation + evidence for the Rust half**, and the package's own source shape is why. + +**Self's rulings for fix batch 4, 2026-09-22:** + +- **R-V (S-1). A row's identity is `(schemaId, recordKey)`, never the key + alone.** Both runtimes index rows and incoming edges by the pair. `RecordRef` + already carries both. Tests: two schemas at one key, in both row orders, + give the same answer; `cited` does not match a row of another schema at the + same key. +- **R-W (S-2 and S-3). The hop behaves identically in both runtimes.** The + target check runs **before** any key filtering, and each edge is anchored by + its own hop, so a selection carrying both `cites` and `cited` returns both + sets. C# adopts Rust's ordering for the first; Rust adopts C#'s per-edge + anchoring for the second. Vectors cover both. +- **R-X (S-4 and S-10). A message that fails its own schema is a defect.** + `cultnet.error.schema.json` declares `routingHint` and every nullable field + the way the header schema does. A test decodes real bytes for every code. + `MiniJsonSchemaValidator` **refuses a schema containing a keyword it does + not implement**, rather than ignoring it, and implements `minimum`, + `maximum`, `maxLength` and `maxItems`. Its `pattern` anchors so a trailing + newline cannot pass. +- **R-Y (S-6).** The cursor's HMAC covers the body as well as the selection, + so the position cannot be rewritten. Test: a rewritten ordinal or key is + refused. +- **R-Z (S-7).** The vectors compare **page bytes**, plus `asOf`, `next` and a + refusal's code, and carry a header-projection and a document-projection + vector on both sides. Where a field is legitimately per-server, such as a + cursor, the vector states that and compares the rest. +- **R-AA (S-5).** Triage all 85 survivors by name. The 75 uncovered mutants + mean whole regions have no test; write behavioural tests for them. A + survivor that is genuinely equivalent gets a one-line reason in the report. + **The triage half is done** (see the list under S-5, 2026-09-22). What is + owed is a behavioural test for each named live survivor: the alias + disagreement across reachable schemas, the half-blank `cites.target`, the + four index-alias role sites, the row tiebreak, `EdgesFor`'s ordering, + `ComputeDigest`'s hop branches, `Cursor.Parse`'s bounds, descending cursor + positioning, and the surrogate comparator. The equivalent mutants are + recorded and are not to be chased. +- **R-AB. Make `cultnet-rs` self-contained enough to mutate.** Replace the + escaping `include_str!` with a build script that stages the contracts into + `OUT_DIR`, or another route that keeps every source path inside the package. + Prove it by running cargo-mutants on the crate. +- **S-8:** delete the dead branch. +- **S-9:** `asOf` is the watermark of the shards the selection actually + covers. +- **S-11:** run the door first, and name the field that is actually set. +- **S-12:** correct the fixture's prose, and state Rust's alias reduction + where R-E is described. + +**Fix batch 4, C# half, landed** (Sonnet) on `cultnet/selection-cut1`, +`52082ec..b7d77b7`: + +- `e99bf46` — R-V, R-W, S-8, R-Y: row identity is `(schemaId, recordKey)`; the + cursor's HMAC covers its own body. +- `b3a8f6d` — S-9, S-11: `asOf` is scoped to the shards the selection covers; + the v1 subscribe door runs before the hop refusal. +- `b7d77b7` — R-X, S-4, S-10: the error schema matches the wire; the validator + refuses keywords it does not implement. + +Counts on Yggdrasil: Networking 247 pass / 2 skip (was 238, so +9 tests), Mesh +255 pass. Caching's three failures are the read-only-directory tests that +cannot fail under the stopgap's root container — unproven, not passing. + +**R-V proven in both row orders.** Before the fix, a narrow reference declared +to `SelLeafA` resolving a key shared with a `SelLeafB` row depended on +insertion order: one order refused a valid reference as `reference_outside_target`, +the other silently resolved to the wrong schema's row for `cited` membership. +After it, both orders resolve through the leaf set and `cited` never matches +the other schema's row at that key. + +**What R-X's new refusal exposed.** Twelve uses of unimplemented keywords +across three committed schemas, none reached by any existing test: +`cultnet.database-change-raw.schema.json` uses `allOf` and `if`/`then`/`else`; +both `cultmesh.verse-catalog-*.schema.json` use `uniqueItems` six times and +`anyOf` once. **Those three schemas are now formally unvalidatable** until +either the keywords are implemented or the schemas are rewritten. Nothing +broke, because nothing ran them through the validator — which is the finding. + +**Two gaps Hands named rather than papered over:** + +- **S-11 has no dedicated regression test.** `HandleSubscribeV1Async` is + private and reachable only through a live LiteNetLib round trip. Fixed by + inspection, covered only by the suite passing. Owed. +- The three unvalidatable schemas above need a decision: implement the + keywords, or rewrite them. + +**Ledger correction.** Commits 0 and 1 came in at about twice the §14 +estimate: + +| Package | Actual (net) | §14 estimate | +|---|---|---| +| Caching | +297 | about +150 | +| Networking | +851 | about +400 | +| contracts | 163 | about 200 | + +The two new Networking files alone are 714 lines, against about 360. The hop's +incoming index, the cursor's digest and mint, and the per-field door messages +all cost more than the prose assumed. The binding-alias fix was not in the +ledger at all. The estimate was wrong; the scope did not grow. The deletions +in commits 2 to 4 (Mesh collapse, `_projectRecord`, the Rust +`snapshot_query.rs`) are still to be counted against the total. + +Status: cut map for two cuts. **Cut 1: the selection vocabulary in the C# +reference runtime and the Rust runtime** (sections 1-17), with the +follow-on runtime cuts and the Huginn consumer cut named and not mapped. +**Cut 2: watching a selection** (section 18), mapped to the same standard, +landing after Cut 1 and depending on it. Cut 1 goes to Hands without +waiting on anything in Cut 2. + +**Rulings this map is written under (operator, 2026-09-17):** + +- The vocabulary lands in CultLib at the CultNet layer, not in Huginn. It + fills a hole: the query side of the substrate was never dropped by + decision, only never asked for. `contracts/cultnet/cultnet-distributed-database.md:10-11` + names RethinkDB changefeeds with "point, table/schema, and **filtered + watches**" as prior art to keep; schema and key allowlists were built, + filtered selection never was. +- The first cut covers the C# reference (`src\GameCult.Networking`) and + Rust (`packages\cultnet-rs`, what Huginn consumes). TypeScript, Python and + Kotlin follow when they have a caller. +- Deletes first: the two untyped stand-ins are replaced, not sat beside. +- The CultMesh subtraction audit is a required part of the map, with real + line counts, and an honest miss beats a padded ledger. +- Nothing on the wire is serde-untagged (rule of this cut; evidence below). + +**What survives unchanged from the Huginn-targeted specification** +(`scratchpad/cut10b-read-side-spec.md`, D1-D4): the five capabilities, the +chosen representation and the rejected ones with their reasons, the order and +snapshot cursor, the role-typed hop, the one negation, and the bound. What +changes: owner, repo, the value model of a field predicate (strings, because +the cache's indexes are strings), the parity obligation, and the subtraction. + +## Pins + +| Repo | Branch | HEAD | State | +|---|---|---|---| +| CultLib | `main` | `51fb449` | dirty in `native/GameCult.Mesh.Quic.Native/*` and `scripts/mutate-cultmesh.mjs` from the live QUIC campaign; **not touched**. Every `file:line` below is against `51fb449`. | +| Huginn | `eureka/memory-organ` | `25a841d` | the consumer; its cut is named in section 12 and mapped in the Epiphany campaign map. | +| Epiphany leaf | `5cda0886` | — | untouched. | + +Baselines: `src/GameCult.Networking` 14,848 lines; `src/GameCult.Mesh` +21,720 lines; `tests/GameCult.Networking.Tests/NetworkingTests.cs` 141 +`[Test]`s; `packages/cultnet-rs` 111 `#[test]`s; `cultnet-rs` depends on +`serde`, `rmp-serde 1.3`, `rmpv`, `serde_json`, `cultcache-rs` and no +`schemars` (`packages/cultnet-rs/Cargo.toml:14-31`). + +## 1. Body facts, each by source read + +**The reference's read side today.** + +- `CultNetDatabase` (`src/GameCult.Networking/CultNetDatabase.cs`): change + kinds `:15-45`; `Watch` `:1052`, `WatchAllChanges` `:1063`, + `WatchRecord` `:1072`; `GetAll` `:776`; per-shard mutation log with + sequence (`:465-466`, `:528-590`, `:631` a snapshot carries + `ShardLogSequence`). `CultNetSchemaAliasMatching` `:47-97` is the one + schema-alias matcher, `internal static`. +- **Three separate selector engines evaluate the same two allowlists:** + `CultNetDocumentRegistry.CreateRawSnapshotResponse` `:263-349` (snapshot, + over `cache.AllEntries` by reflection at `:325-342`) with its own + `MatchesRequestedSchema` `:505-524`; `CultNetDatabaseServer.CreateChangeMessage` + `:347-384` with `Matches`/`MatchesSchema`/`InferSchemaName` `:401-468` + (the LiteNetLib path, the one production construction site, + `CultNetLocal.cs:154`); `CultNetDatabaseSubscriptionServer.CreateChangeCore` + `:442-485` with `MatchesRequestedSchema` `:493-500` (the RUDP path). Two + of them carry an identical reflection copy of `CreateRawRecord` + (`CultNetDatabaseServer.cs:386-399`, `CultNetDatabaseSubscriptionServer.cs:502-515`). +- **The two stand-ins.** `CultNetDatabaseSubscribeMessage` + (`CultNetSchemaMessages.cs:788-826`): `schemaIds` `:805`, `recordKeys` + `:809`, `includeSnapshot` `:813`, then `consumerRuntimeId`, `bodyIds`, + `supportedBodyTransports` (body-plane demand, not selection). The same + pair on `CultNetSnapshotRequestMessage` `:737-741`, + `CultNetShardCatalogRequestMessage` `:949-953` (shard routing, stays), and + `CultNetSchemaCatalogRequestMessage` `:1591` (catalog, stays). + `_projectRecord` on the subscription server (`:27`, `:44`, `:50`, + `:239-240`, `:314`): **no production caller constructs the subscription + server at all** — `grep "new CultNetDatabaseSubscriptionServer"` over + `src/` is empty; it is built only in tests (`NetworkingTests.cs:1596-1605` + passes `projectRecord`). Projection is authority that exists in the + reference and reaches no wire and no caller. +- **The cache already owns addressing.** `CultIndexAttribute` + (`src/GameCult.Caching/CultDocumentContracts.cs:34`, `Alias` `:41`) names + a member as an index; the cache's index values are **strings by + construction** (`CultCache.cs:1084` `Getter = document => getValue(document)?.ToString()`; + `GetByIndex(string alias, string value)` `:1503-1509`). + `CultReferenceAttribute` (`:45`, `TargetType` `:53`, `Many` `:55`) names a + member as a reference; the descriptor records `IsReference`, `IsMany`, + `TargetSchemaName` (`CultCache.cs:1069-1080`). So a field predicate's key + is an index alias and a hop's role is a reference member, both declared + by the document's owner. +- **The declarations are public; the values are not.** `ToCatalogEntry()` + (`CultCache.cs:151-176`) is public and carries every member's `Slot`, + `MemberName`, `TypeName`, `IsReference`, `IsMany`, `TargetSchemaName`, + `IsName`, `IndexAlias`. But `CultDocumentDescriptor.Members` (`:149`) and + `IndexAccessors` (`:148`) are **`internal`**, and `GameCult.Caching` + declares no `InternalsVisibleTo` for `GameCult.Networking` (the only + `InternalsVisibleTo` in `src/` outside the vendored Unity tree is + `GameCult.Caching.MessagePack` → `GameCult.Caching.Tests`). That is why + `CreateRawSnapshotResponse` reaches for reflection at + `CultNetDocumentRegistry.cs:325-342`. **An evaluator outside the cache + assembly cannot read a declared index's value today**, by any means the + cache offers. The earlier claim in this map that no cache change is + needed for addressing was wrong: addressing is declared publicly and + *readable* only inside the cache. Section 6 carries the read surface as + an add; sections 7 and 14 carry its cost. +- **Schemas are hand-written JSON** in `contracts/cultnet/*.schema.json`, + listed by file name in `CultNetSchemaRegistry.cs:360-385`; TypeScript + compiles them with Ajv and refuses unknown fields + (`cultnet.database-subscribe.schema.json` has `additionalProperties: false`); + Python lists required fields per version by hand + (`packages/cultnet-py/src/cultnet_py/schema_catalog.py:283`, `:407`); Rust + types are a serde enum tagged on `schemaVersion` + (`packages/cultnet-rs/src/contracts.rs:252`) with hand validation + (`require_optional_string_vec`, `:548-594`). C# encodes with + MessagePack-CSharp string keys (`[Key("name")]`), i.e. named maps; Rust + encodes with `rmp_serde::to_vec_named`. +- **Runtime coverage of the subscribe message today.** C# server ×2, C# + client (`CultNetDatabaseSubscriptionClient.cs:138-151`); TypeScript + contract only (`packages/cultnet-ts/src/contracts.ts:237-247`, no server + fanout, interop tests send it at `test/interop/cultnet-interop.test.ts:719,798`); + Python server ×2 (`cultnet_py/interop_peer.py:390-401` with + `DatabaseSubscription.matches` `:110-125`, and + `cultmesh_py/server.py:315-331` with `_subscription_matches_document` + `:449-470`, `_schema_matches_request` `:699-716`, and a third copy in + `cultmesh_py/node.py:1322-1345`); **Rust: none** — `cultnet-rs` has + `SnapshotRequest` with the two allowlists (`contracts.rs:314-321`) and no + `DatabaseSubscribe` variant; Kotlin: none (a snapshot-request builder, + `CultMesh.kt:2111`, and a `require(schemaVersion == "…snapshot_request.v0")` + at `:2195`). +- **How each runtime treats a message it does not know**, which is the + wire-parity fact section 9 rests on: C# throws + (`CultNetSchemaMessageSerialization.cs:85` `_ => throw`); TypeScript + `parseCultNetMessage` (`contracts.ts:728-744`) looks the version up in its + Ajv validators and throws when absent; Kotlin `require`s the exact version + (`CultMesh.kt:2195-2196`); Rust's tagged enum fails to deserialize on an + unknown tag; **Python returns `[]`** (`interop_peer.py:360-387` falls off + the chain; `cultmesh_py/server.py:341` delegates to `handle_message`) — a + silent drop, no reply, and for a *known* version with unknown fields + Python reads only the fields it expects (`message.get(...)`), so it would + answer a selector it did not understand with the wrong rows. +- **Every committed write has a shard-log sequence** — assumed from + `CultNetDatabase.cs:465` (`_nextLogSequences`) and the invariant "raw + snapshot/put/delete messages must pass through `CultNetDatabase`" + (`cultnet-distributed-database.md:115-116`); **Hands confirms** that a + local `PutAsync` outside any shard also takes a sequence, because the + order in section 3 rests on it. If it does not, the row's ordinal is its + `storedAt` and the cursor refuses on any advance (section 3 says what + that costs). + +**The Aetheria catalog as a hostile example, verified at +`F:\Projects\Aetheria\Assets\Scripts\ServerShared`:** + +- **Inheritance.** `ItemData.cs:272` `abstract class ItemData` (`Name` + `:275`, `Mass` `:284`), `:313` `abstract class CraftedItemData : ItemData` + (which re-declares `Name` at `:327`, hiding the base's), and only the + leaves carry `[CultDocument]`: `SimpleCommodityData` `:300`, + `CompoundCommodityData` `:330`, `GearData` `:449`, and more. The cache's + `DiscoverMembers` (`CultCache.cs:838-875`) walks `current.BaseType`, so a + leaf's descriptor carries every inherited member with its attributes + (`GetCustomAttribute` reads the member's own attribute wherever it is + declared). Inherited addressing therefore already resolves per leaf. + **Corrected on a second read:** duplicate *slots* are refused + (`:931-935`), and a **hiding member is already refused too** — `:937-943` + groups keyed members by `Member.Name` and rejects any name carried at two + different slots (`HiddenMemberMessage`), while a hiding member re-using + one slot is caught by the duplicate-slot rule. So `CraftedItemData`'s + `Name` at `ItemData.cs:327` hiding `:275` is **not registrable in + CultCache as it stands**, however the aliases fall; that is a finding for + the Aetheria campaign, not a hole here. What is *not* refused by name is + two members with **different names** carrying the **same index alias** + (base `[CultIndex("mass")] Mass`, leaf `[CultIndex("mass")] Weight`). + That does not collide silently either: the alias map is built by + `ToDictionary` at `:462-468`, which throws `ArgumentException("An item + with the same key has already been added")` — a real refusal, from the + wrong owner, naming neither schema nor member nor alias. D10 is therefore + a **renaming of an existing refusal**, not a new rule, and is smaller + than it first looked. +- **A reference to an abstract target.** `FactionProduct.cs:24` + `CultRecordRef Design`. `PersistedMember.FromMember` + (`CultCache.cs:1069-1071`) takes the target type and reads + `CultDocumentAttribute` from it — an abstract base has none, so + **`TargetSchemaName` is `null` today for exactly this reference**. The + registry can compute the leaf set by assignability (it already does for + index lookups, `:1506`, and store routing, `:1828`) but records nothing. +- **A dictionary reference with a value.** `ItemData.cs:333-334` + `[CultReference(typeof(PersonalityAttribute), many: true)] Dictionary, float> DemandProfile`. + The descriptor records `IsMany` (`:1080`) and nothing else: **no code in + the cache enumerates a many-reference's targets**, and the only accessor + is `Getter = document => getValue(document)?.ToString()` (`:1082`), which + on a dictionary yields the CLR type name. The edge and its payload are + declared and unreadable. +- **Numbers.** `PersistedMember.MemberType` (`:1053`) knows the member is a + `float`, and the catalog persists it as `TypeName` (`:38`, `:192`, + compared by `CompareSchemaShapes` `:605-629`), so **a member's numeric + type is already declared and persisted**; what is missing is a typed + accessor beside the string one. Adding an accessor is a runtime change + with no catalog-shape or hash change, because `TypeName` is already in + the canonical shape. + +**The cache's index maps are unique indexes, and the evaluator must not use +them.** `Index(stored)` (`CultCache.cs:1849-1862`) writes +`MapOf(_indexes, (type, alias))[value] = key` — **one key per value, last +writer wins**. Two rows of one type sharing an index value do not collide +loudly; the second silently displaces the first in the map. `GetByIndex` +(`:1502-1508`) reads that map and `Single` (`:1838-1848`) throws only +when *several types* assignable to `T` each contribute a key, never for two +rows of one type. So `GetByIndex` answers "the row that most recently +claimed this value", not "the rows with this value". + +The consequence for this cut is a rule, not a caveat: **the evaluator +evaluates every predicate per row, through the accessor, and never through +`_indexes` or `GetByIndex`.** The declared alias is an *addressing* name — +the cache's own lookup map is a different, lossier thing that happens to be +built from the same declaration. A "use the index, it is already there" +optimisation would turn `kind any_of [weapon]` into a one-row answer. S23 +pins it, `WatchByIndex` already has the bug (section 18), and the +unique-index behaviour itself is left exactly as it is: it is the cache's +own contract for a single-record lookup and this cut does not renegotiate +it. + +**A fourth selector engine, in Rust, that this map's first draft missed.** +`packages/cultnet-rs/src/snapshot_query.rs` (339 lines, `pub use` at +`lib.rs:29`) already serves and asks snapshot requests: + +- `serve_read_only_raw_snapshot` `:64-130` is an engine — it walks the + source's records, refuses a duplicate identity and an unregistered + schema, applies a `CultNetReadOnlySnapshotPolicy` allowlist of + `(schema_id, record_key)` pairs, then filters by the request's + `schema_ids` and `record_keys` (`:112-125`). The policy is + **authorization** and stays; `:112-125` is the fifth copy of the same two + allowlists and goes, as the C# three do. +- `CultNetRawSnapshotQuery` `:158-285` is the client side, and it exposes + the sharpest limit of the two-allowlist model: `request()` `:195-217` + turns a set of exact `(schema, key)` pairs into the **cross product** of + their schemas and their keys, and `accept_response` `:219-284` then + *errors* on any record the cross product dragged in + (`"snapshot response contains unexpected record"`). Asking for `(A,x)` + and `(B,y)` asks for four and refuses two. **v1 does not fix this**: + `schemas × keys` is still a cross product (section 13, Q-M). What v1 does + change is that `accept_response`'s check is a *declared expectation*, not + a re-filter of a page the server got right, and section 8's forbidden + writer is worded to keep that distinction honest. + +**The CultMesh audit** (Explore pass over `src/GameCult.Mesh` and +`CultNetDocumentRegistry.cs`, 92 sites classified) is in section 11 with its +numbers. + +## 2. The vocabulary, exactly + +One shape, `cultnet.selection.v1`, carried by two request messages at a new +version and answered by one page message. Field names are the wire +spelling; C# and Rust type names follow each runtime's convention. + +``` +Selection { + schemas: string[]? // kinds: schema ids or aliases, matched by CultNetSchemaAliasMatching; absent = every schema + keys: string[]? // record-key allowlist; absent = every key + fields: FieldPredicate[]? // conjunction; each is any-of over one declared index alias + cites: Citation? // rows whose declared reference `role` (or any reference) names `target` + cited: Incoming? // rows that some row does / does not name in `role` + projection: "header" | "document" // default "header" + descending: bool // default false; the one order, reversed + limit: uint32? // clamped 1..=200 + cursor: string? // opaque; minted by the answering server +} +FieldPredicate { // one operator per predicate, named by `op`; no union, no untagged + index: string // a declared index alias, reachable on some schema the selection can reach, else refused + op: "any_of" | "lt" | "le" | "ge" | "gt" + values: string[]? // present iff op = any_of; non-empty + number: string? // present iff op is a comparison; a canonical decimal (Q-J, below); the alias must be declared numeric on every reachable schema that declares it +} +Citation { target: RecordRef, role: string? } // target validated as a reference the row owner recognises +Incoming { role: string, exists: bool } +RecordRef { schemaId: string, recordKey: string } + +SelectionPage { // cultnet.snapshot_response_raw.v1 carries this + matched: uint32 + asOf: uint64 // the snapshot the page is exact for + next: string? // absent on the last page + headers: RawDocumentHeader[]? | documents: RawDocumentRecord[]? // exactly one present, by projection + edges: Edge[]? // present iff the selection has `cites` or `cited`: the edges the hop traversed + shardId?, shardEpoch?, shardLogSequence? // as v0 carries them +} +Edge { + from: RecordRef // the citing row + role: string + to: RecordRef // the cited row, its schema resolved to the leaf actually stored + payloadEncoding: "messagepack"?, payload: bytes? // the value attached to the edge (a dictionary's value), typed by the member's declared value type; present under `document`, absent under `header` +} +RawDocumentHeader = RawDocumentRecord minus payload, payloadEncoding +``` + +Messages: `cultnet.snapshot_request.v1 { messageId, selection, shardId?, shardEpoch? }`; +`cultnet.database_subscribe.v1 { messageId, subscriptionId, selection, includeSnapshot, consumerRuntimeId?, bodyIds?, supportedBodyTransports? }`; +`cultnet.snapshot_response_raw.v1` as above. `database_change_raw.v0` and +`database_unsubscribe.v0` are unchanged: a change is a change. + +**Rules, each one owner:** + +- **Order** is `(ordinal, schemaId, recordKey)` ascending, or the reverse + under `descending`. `ordinal` is the sequence of the commit that last + wrote the row (the shard-log sequence in the reference; the receipt + sequence in Huginn). The row owner supplies it; the vocabulary never reads + a clock. +- **Snapshot.** A page is exact as of `asOf`. A cursor carries `asOf`, the + last `(ordinal, schemaId, recordKey)`, and a digest of the selection with + `cursor` and `limit` cleared. A server that can present rows as of the + cursor's `asOf` answers the next page over that snapshot; **a server that + cannot refuses** `cultnet.error.v0 { code: "cursor_stale", details: { asOf, current } }`. + The reference refuses when the shard log has advanced (rows mutate, and a + replay is not this cut's); Huginn never refuses (append-only, one + writer). One contract, two honest servers. A cursor that does not decode, + or whose digest is not this selection's, is `cursor_invalid`. +- **Fields** are predicates over one declared index each, conjoined across + predicates: `any_of` over string values, or one of four comparisons + (`lt`, `le`, `ge`, `gt`) against one number over a declared numeric + member. A row of a schema that does not declare the index never matches + it. An `index` no reachable schema declares, an empty `values`, a + comparison on an alias any reachable schema declares non-numeric, an + empty `keys` or `schemas` list, and a `role` no schema declares are + refused typed at the door (`selection_invalid { field, value }`), never + answered as an empty page. `any_of` values are strings because the + cache's indexes are strings (`CultCache.cs:1084`). Comparison numbers are + **canonical decimal strings** under the operator's Q-J ruling. The rule is + specified in full in the **Numbers** item below. No range operator (two + predicates on one alias make a range), no `ne`, and no nesting. +- **Numbers (Q-J; Self's specification, 2026-09-22, which the ruling asked + for and this map had not yet written).** + - *Canonical form.* A number on the wire matches + `^-?(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$`, and `-0` is excluded. That fixes + one spelling per value. It forbids leading zeros, trailing fractional + zeros, a bare trailing point, an explicit `+`, exponent notation, + negative zero, whitespace, and culture separators. + - *Non-canonical spellings are refused.* Any other spelling is refused at + the door with `selection_invalid { field: "number", value }`. It is never + normalised. The reasons: the cursor digest and the parity vectors need + one byte form per value, and a lenient parser differs between runtimes + at exactly these edges. The ruling says "a non-canonical spelling of an + equal value must not change an answer". That holds because such a + spelling never reaches the evaluator. It gets a typed refusal, not a + different page. + - *Row side.* The cache renders a numeric member as its exact canonical + decimal: + - An integer type renders as its exact decimal. There is no 2^53 limit. + - `decimal` renders with its trailing zeros stripped. + - `float` and `double` render in the runtime's established shortest + round-trip form (`"R"` in .NET, the standard shortest form in Rust), + rewritten from exponent notation to positional digits. Parity pins + this. + - A NaN or infinite member matches no comparison. + - *Comparison.* Both operands are canonical, so they are compared + numerically by sign, then by the integer part's length, then by the + integer digits, then by the fraction digits padded on the right. It is + one small pure function per runtime, with no numeric parse and no + precision limit. + - *Mutants that must die:* + - a lexicographic comparison ("10" < "9"); + - a comparison that ignores sign; + - a comparison that ignores the integer part's length; + - a door that accepts `+1`, `1.0`, `01`, `1e3` or `-0`; + - a row rendering through float64 (a `long` member of 2^53+1 must + compare greater than `"9007199254740992"`). + - Refusing a non-canonical number at the door, rather than normalising it, + was Self's reading of the ruling. **The operator accepted it on + 2026-09-22.** +- **Inheritance.** A schema is a leaf: only a type with `[CultDocument]` + has a schema name, and `schemas` names leaves. A predicate on an alias + applies to every reachable leaf whose descriptor carries a member with + that alias, inherited or own — the cache already discovers inherited + members per leaf, so "gear or commodities with `mass` over 10" is + `schemas: [geardata, simplecommoditydata], fields: [{index: mass, op: gt, number: 10}]` + with `mass` declared once on the abstract base. Two leaves that each + declare a member with the same alias independently are two members; the + predicate reads each leaf's own. One leaf that resolves the same alias to + two members (a base member and a hiding re-declaration both carrying the + alias) is refused at registration (D10). A numeric comparison on an alias + that is numeric on one reachable leaf and a string on another is refused + at the door, because the row owner cannot compare a string. +- **The hop** reads edges the row owner declares: in the reference, members + with `CultReferenceAttribute` (role = the member's index alias or name); + a one-reference yields one edge, a many-reference yields one edge per + element, and a dictionary keyed by references yields one edge per key + **with the value as the edge's payload**. In Rust, `Row::references()` + yields `(role, target, payload)`. **A reference's target is a set of + leaves**: the declared target type's own schema if it is a leaf, else + every registered leaf assignable to it (`CraftedItemData` → + `compoundcommoditydata`, `consumableitemdata`, …). The hop follows an + edge into any row whose schema is in that set. **A stored edge naming a + row whose schema is outside the set refuses the selection** + (`reference_outside_target { from, role, to }`), not skips it: an edge the + declaration forbids is corrupt data and a read does not paper over it. + The citer's status, fields and authorization are not consulted by the + hop; one hop, no second. +- **Edges in the answer.** A selection with `cites` or `cited` returns, beside + the rows, the edges the hop traversed, each with its payload under + `document` projection and without it under `header`. A weighted reference + and a bill of materials are the same shape: follow the edge, return the + payload, filter the rows. **Filtering on the payload as part of the + traversal is not expressible** (section 13): that is a join condition. +- **Projection.** `header` is the record without its payload; `document` is + the record. The consumer decides what a header *means* for typed rows + (Huginn's typed summary is its header; the substrate carries whichever + type the page was instantiated with). +- **Not on the wire:** the admission window (`admittedAfter/Before`) of + Huginn's Cut 9 — `descending` plus the cursor answer "the latest"; a date + window is a range, and ranges are out (R-3). + +**The bound, carried forward in force, with one widening the operator +ruled.** Closed key set (declared aliases), a closed operator set (any-of +and four comparisons, one per predicate, no nesting), no path language, no +expression terms, no OR, one negation, one hop with its edges returned, no +depth field, no sort field, no text, no predicate on an edge's payload in +the traversal. Section 13 lists what is deliberately impossible. The +capability set is now: **C1** typed predicates over declared members, +string any-of and numeric comparison; **C2** projection; **C3** order and +cursor; **C4** one hop, both directions, returning typed edge payloads; +**C5** existence and count without bodies. + +**Nothing on the wire is serde-untagged — rule, with evidence.** Probe +`scratchpad/untagged-probe/` (result in `untagged-probe-result.txt`), run +2026-09-17 against `rmp-serde 1.3.1` / `rmp 0.8.15` / `serde 1.0.229` (the +versions Huginn's lockfile resolves; `cultnet-rs` pins `rmp-serde 1.3`): +every `#[serde(untagged)]` enum with struct variants **fails to round-trip +under positional MessagePack** (`data did not match any variant of untagged +enum`) and passes only under named maps; externally tagged shapes pass under +both. The reference encodes named maps and so does Rust today, so an +untagged shape would work by accident of an undocumented encoding choice. +`grep untagged packages/cultnet-rs/src packages/cultcache-rs/src` is empty +at `51fb449`; this cut keeps it empty and pins it (section 10). + +## 3. Decisions, with the reasons + +**D1. Strings for field values, not typed enums.** In the Huginn-targeted +design a predicate was `Option>`, closed at compile +time. The substrate cannot know a consumer's enums, and the cache's own index +model is string-valued; so the wire carries strings and the row owner +refuses a value outside its enum at the door. The loss is compile-time +closure; what is kept is runtime closure with a typed refusal, which is the +same guarantee to a caller. + +**D2. Declared aliases, not a field-path language.** `index` and `role` are +names the document's owner declared with `CultIndexAttribute` and +`CultReferenceAttribute`; an undeclared name is refused. A dot-path over the +payload would be the string language the bound excludes, and the cache +already has the declaration mechanism. + +**D3. A new message version, not new fields on v0.** Section 1's fact: +Python reads only the fields it knows and would answer a v0 selector it +did not understand with the wrong rows. A v1 version string makes every +runtime not in this cut refuse or drop by its own dispatch rather than +mis-answer. The cost is that v0 stays answerable by the reference until the +follow-ups land (R-1, a scheduled deletion with a named trigger). + +**D4. One evaluator in the reference, three engines deleted.** `Select` +over `(descriptor, key, document)` rows from the cache replaces +`CreateRawSnapshotResponse`'s loop, `CultNetDatabaseServer.CreateChangeMessage`'s +`Matches`, and `CultNetDatabaseSubscriptionServer.CreateChangeCore`. +`CultNetSchemaAliasMatching` (`CultNetDatabase.cs:47-97`) becomes the one +alias matcher and goes `public`; the four Mesh copies and two Networking +copies go. + +**D5. Projection becomes a wire value; `_projectRecord` dies.** The +delegate ran after authorization and reached no caller. `projection` on the +selection is the same authority as a value; `_authorizeRequest` and +`_authorizeRecord` stay, because authorization is not selection. + +**D6. Subscriptions evaluate the selection on the snapshot and on every +change, and hop-bearing selections reconcile.** `cites`/`cited` are +set-dependent: a change to row B can change whether row A matches. The +subscription server already owns a diff-against-delivered reconcile +(`Reconcile` `:251-292`, `DeliveredBySourceRecordKey`); a hop-bearing +subscription runs it on every change instead of the per-change fast path. +That is the mechanism by which "watch a question" falls out, and this cut +does **not** add a local `CultNetDatabase.Watch(Selection)`; section 11 +records what that later cut would collapse; it is Cut 2, section 18 (R-5). + +**D7. The Rust runtime carries the evaluator, not only the types.** Huginn +evaluates selections over its own rows; if `select` lived only in C#, Rust +consumers would each write one. `packages/cultnet-rs/src/selection.rs` +holds the types, the cursor, and `select` over a `Row` trait, with no +subscription client in this cut (Huginn does not subscribe). + +**D8. Numbers are addressable through the type the cache already declares; +the cache gains accessors, not attributes.** A comparison needs a numeric +value the string getter cannot give. `CultCache.cs:1053` holds the CLR +`MemberType` and the catalog already persists `TypeName` in the canonical +shape, so numeric-ness is declared; what is added is runtime: on each +member, `ValueOf(document) -> object?` and `NumberOf(document) -> string?` (the exact canonical decimal, Q-J; was `double?` before 2026-09-22) +(non-null exactly for the closed set of CLR numeric types), and the public +member entry exposes `IsNumeric` derived from `TypeName`. No new attribute, +no catalog-shape change, no schema hash moves, no migration. Rust mirrors +it as `Row::number(index)` and `RowSet::is_numeric(schema, index)`; the +consumer decides from its own types. + +**Verified by source read, because everything downstream rests on it:** +`CultDocumentMemberDescriptor.TypeName` is set at `CultCache.cs:474` from +`CultSchemaTypeNames.FromType(member.MemberType)`, which renders a CLR full +name (`System.Single`, `System.Nullable`, +`System.Collections.Generic.Dictionary, +System.Single>`); `ToCatalogEntry()` `:168` copies it into +`CultSchemaMemberCatalogEntry.TypeName` `:42`; `CompareSchemaShapes` +compares it inside `CanonicalSchemaMember` `:605-629`. Numeric-ness is +declared and persisted today, and the claim holds. + +**Two corrections to the estimate.** First, `IsNumeric` has two possible +authorities — the CLR `MemberType` in hand and the `TypeName` string read +back from a stored catalog. They must agree, or a schema validates one way +locally and another way against a persisted catalog. **The CLR set is the +authority** (a closed set: the eight integer types, `float`, `double`, +`decimal`, and `Nullable` over any of them); the string set is generated +from it by `CultSchemaTypeNames.FromType`, never hand-written. S22 pins +that. + +Second, and larger: the accessor is not the only thing missing. Per section +1, `IndexAccessors` and `Members` are `internal` and `GameCult.Networking` +is not a friend assembly, so the evaluator cannot read *any* declared +value — string or number — without the reflection the map is deleting. The +cache add is therefore a **public read surface over declared members**, of +which the numeric accessor is one method: +`TryGetIndexValue(object document, string alias, out string? value)`, +`TryGetIndexNumber(object document, string alias, out string canonicalDecimal)` +(**revised 2026-09-22 under Q-J**: `NumberOf` returns the member's exact +canonical decimal string, never `double`; see §2 "Numbers"; commit 0 shipped +`double` and is corrected in the Q-J fix), `ReferencesOf` (D11), and a public member view carrying `IndexAlias`, +`IsReference`, `IsMany`, `IsNumeric` and the target **`Type`** (D9 needs +the type, not the name). Section 14 carries the revised cost. + +**D9. A reference's target set is resolved by the registry at evaluation, +not persisted.** Persisting `TargetSchemaNames` would change the canonical +member shape and every stored catalog's hash for such schemas. Resolving at +evaluation by assignability over registered leaves (`:1506`, `:1828` do +this today) costs nothing and is correct as of the registry in hand. The +catalog's `TargetSchemaName` stays what it is (`null` for an abstract +target) and is not read by the hop. + +The resolution needs a **`Type`**, and `CultDocumentMemberDescriptor` +carries only `TargetSchemaName`, a string that is `null` in exactly the +case that matters. So the public member view exposes the target `Type` +(held already on `PersistedMember.MemberType` / the attribute's +`TargetType`, `CultCache.cs:1069-1070`), and the leaf set is +`AllDescriptors` (public, `:254-255`) filtered by +`target.IsAssignableFrom(d.DocumentType)` — the same predicate +`GetByIndex` uses at `:1506` and store routing at `:1828`. It must be +computed **against the registry at evaluation, not at descriptor build**: +`BuildDescriptor` runs per type as it is registered, and a leaf registered +later would be missing from a set frozen early. A cached set keyed by +target type is legitimate only if it is invalidated by `Refresh()` +(`:257-265`) and by `RegisterDescriptor` (`:381-410`); simplest is not to +cache it. + +**D10. The duplicate-alias refusal is renamed, not invented.** The Aetheria +hiding case turned out to be refused already (section 1: `HiddenMemberMessage` +at `CultCache.cs:937-943`), and two differently-named members sharing one +alias already throw — from `ToDictionary` at `:462-468`, as an +`ArgumentException` that names neither the schema, nor the members, nor the +alias. D10 is to replace that with a rejection in `DiscoverMembers`' +`rejections` list, in the shape of its neighbours: one grouping over +`IndexAlias` beside the two at `:931-943`, one message beside +`DuplicateSlotMessage` / `HiddenMemberMessage`. The behaviour barely +changes; what changes is that the refusal can be read. Nothing in the +selection depends on it — a colliding catalog never registers either way — +so it is in this cut only because the cut is already in this file and the +message is four lines. + +**D11. Many-references are enumerated by the cache, with payloads.** On each +reference member, `ReferencesOf(document) -> IEnumerable<(CultRecordKey target, object? payload)>`: +a `CultRecordRef` yields one; an `IEnumerable>` yields +each with no payload; an `IDictionary, V>` yields each key +with its value. Anything else declared `many` is refused at registration +(`unsupported_reference_shape`), so a declaration the cache cannot walk is +never silently walked as nothing. + +The enumeration reads `ICultRecordRef.Key` (`CultDocumentContracts.cs:92-95`), +which every `CultRecordRef` implements (`:97-99`), so it needs no +generic dispatch. Two shape rules fall out of `ResolveReferenceTarget` +(`CultCache.cs:1100-1113`) and belong in the same refusal: a member +declared `many` whose element type is not a `CultRecordRef<>` and whose +attribute names no `TargetType` has **no resolvable target at all** +(`IsReference` is true only because the attribute exists, and +`TargetSchemaName` is `null` for a reason that is not inheritance); and a +`many` member that is neither `IEnumerable>` nor +`IDictionary, V>` cannot be walked. Both are +`unsupported_reference_shape` at registration. A `many: false` member whose +type is not `CultRecordRef` is the same fault and takes the same +refusal. + +**Agreement with our own abandoned prior art** (`ThreadEpiphanyGraphQuery`, +Epiphany `5c62a650`, deleted with its host `5f6f2441`): direction and edge +kind as data, schema derived — agreed; differs as before (predicate not +subgraph read; roles are declared names not free strings; one negation +added; no depth field). + +**Rejected, unchanged in reason:** Qdrant's `Filter` (open dot-path keys, +polymorphic values, OR/threshold/recursion advertised then refused, the +untagged hazard; Cut 11 lowers `FieldPredicate` to `must`/`match.any` in ~30 +lines on the daemon side); ReQL term trees; Firestore `CompositeFilter`; +Mongo/ES magic-key documents; every string-parsed evaluator surveyed. + +## 4. Deletes first + +| Path:lines (at `51fb449`) | Lines | What | +|---|---:|---| +| `src/GameCult.Networking/CultNetDatabaseServer.cs:347-468` | 122 | `CreateChangeMessage`, `CreateRawDocumentRecord`, `Matches`, `MatchesSchema`, `InferSchemaName` — the LiteNetLib selector engine; the handler calls the shared evaluator and the shared raw-record projection | +| `src/GameCult.Networking/CultNetDatabaseSubscriptionServer.cs:424-515` | 92 | `CreateAuthorizedChange`, `CreateChange`, `CreateChangeCore`, `ResolveWireSchemaId`, `MatchesRequestedSchema`, `CreateRawRecord` — the RUDP selector engine | +| `CultNetDatabaseSubscriptionServer.cs:27, :44, :50, :239-240, :314` | 6 | `_projectRecord`, its parameter and its two call sites | +| `CultNetDatabaseSubscriptionServer.cs:294-322` | 29 | `CreateProjectedSnapshot` body: becomes evaluate + authorize + project (~12 lines stay) | +| `src/GameCult.Networking/CultNetDocumentRegistry.cs:263-349` | 87 | `CreateRawSnapshotResponse`: the loop and its reflection over `cache.AllEntries` (`:325-342`); the raw-record construction (`:297-311`) survives as `ToRawRecord` | +| `CultNetDocumentRegistry.cs:505-524` | 20 | `MatchesRequestedSchema`, a copy of `CultNetSchemaAliasMatching.Matches(candidate, descriptor)` | +| `CultNetDocumentRegistry.cs:247-258` | 12 | `CreateSnapshotRequest` (v0 builder); v1 takes a `Selection` | +| **Networking total** | **368** | | +| `src/GameCult.Mesh/CultMeshSnapshots.cs:638-661, 750-773, 889-911` | 71 | three verbatim clones of the selector-carrying options; one `with` copy over a record type remains | +| `src/GameCult.Mesh/CultMesh.cs:2721-2748, 1941-1969` | 57 | the fourth and fifth copies (`ToSnapshotRequestOptions`, `WithPublicationBindingOptions`) | +| `CultMeshSnapshots.cs:973-983` | 11 | `CleanSnapshotFilter`: normalisation is the selection's own validation | +| `CultMeshSnapshots.cs:1000-1009, 1033-1047, 1078-1088` | 36 | the client-side re-filter of a snapshot by schema and `InferSchemaName`; the server's v1 answer is exact, decode stays | +| `CultMesh.cs:2750-2800` | 51 | `ReadDocumentFromSnapshotResponse`'s four-tier fallback (which returns a record with the wrong key when only the schema matches) and `TryDecodeSnapshotDocument`; replaced by one exact read (~10 stay) | +| `CultMesh.cs:3474-3497` | 24 | `IsSameCultDocumentSchema`: `CultNetSchemaAliasMatching`, now public | +| `CultMeshSnapshots.cs:625-636` and the rule at `:198`, `CultMesh.cs:2716` | ~15 | the "no schema filter when keys are given" rule, three times; one place | +| `CultMeshClient.cs:574-604, 830-860, 932-962` selector construction | ~25 net | `{recordKeys, schemaIds}` literals become `Selection` literals; the retry loops stay | +| `CultMeshBodyDemand.cs:177-221` | ~15 net | `CultMeshHotBodySubscription` builds two allowlists; builds one `Selection` | +| `CultMesh.cs:2701-2719, 2838-2858, 2875-2915` | ~20 net | selector construction for peer snapshots and body subscriptions | +| `CultMeshSnapshots.cs:139-201, 434-516, 611-623` overlay logic | ~40 net | overlaying caller `schemaIds`/`recordKeys` onto defaults, four times | +| **Mesh total** | **≈ 365 gross, ≈ 331 net** | see section 11 for what does not go | +| `packages/cultnet-rs/src/snapshot_query.rs:100-130` | ~31 | the fifth selector engine: the `requested_schemas` / `requested_keys` sets and the two `is_some_and` filters inside `serve_read_only_raw_snapshot` become one `select` over a lowered v0 selection. The duplicate-identity and unregistered-schema refusals (`:90-110`) and the whole `CultNetReadOnlySnapshotPolicy` (`:132-157`, authorization) stay | +| `src/GameCult.Caching/CultCache.cs` | **0** | the cache deletes nothing. The string `Getter`/`GetterNullable` pair (`:1081-1082`) stays: it is what `any_of` compares and what the index maps are built from (`:1858`). The numeric accessor is beside it, not instead of it | +| `tests/GameCult.Networking.Tests/NetworkingTests.cs`: `CultNetDatabaseServer_Creates_Filtered_SnapshotResponse` `:3124`, `…_ForCompatibleSchemaAlias` `:3158`, `CultNetDatabaseServer_Creates_Filtered_SubscriptionChange` `:5547`, `…_ForSchemaAlias` `:5601`, `DatabaseSubscription_FiltersLiveChangesByWireSchemaBinding` `:2256`, `…ByRequestedSchemaAlias` `:2310`, and the `projectRecord` lambda in `…AuthorizesRequestAndFiltersSnapshotAndLiveRecords` `:1601-1605` | ~250 | rewritten over v1 selections against the one evaluator (section 10); the rules they pin survive | + +**Not deleted in this cut, by ruling (R-1), and scheduled for deletion on FU-v0's trigger:** the v0 message classes and +their three schema files, the v0 arms in `CultNetSchemaMessageSerialization`, +and the v0 handling in the two servers — kept as a **lowering**: a v0 +request lowers to `Selection { schemas: schemaIds, keys: recordKeys, projection: document }` +and is answered through the same evaluator, so v0 has no engine of its own. +They die with the last runtime follow-up. + +## 5. Keeps and moves + +- `CultNetSchemaAliasMatching` (`CultNetDatabase.cs:47-97`), `internal` → + `public`, the one alias matcher for every runtime-side match. +- `_authorizeRequest`, `_authorizeRecord`, `Reconcile`, `Watch`, + `ApplyProjectedChange`, `PublishDemand`, `DemandChanged` and the body-plane + fields of the subscribe message: authorization, reconciliation and demand + are not selection. +- `CultNetDocumentRegistry`'s raw-record construction (`:297-311`) as + `ToRawRecord(descriptor, binding, key, document, options)`; the payload + schema resolution (`:452-503`) untouched. +- The v0 messages, schemas and arms as a lowering (above). +- `CultMeshSnapshotRequestOptions` as a record `{ Selection, ShardId, ShardEpoch, …transport knobs }`. +- Every (B)-class site of the audit (section 11): transport racing, + authority, freshness, body routing, provider-session validation. +- The interop lanes and CI witness (`.github/workflows/cultnet-interop.yml`) + green throughout, because v0 still answers. + +## 6. Adds + +| Add | Owner | Live consumer | Protected invariant | What it replaces | +|---|---|---|---|---| +| `src/GameCult.Caching/CultCache.cs`: a **public read surface over declared members** — `CultDocumentDescriptor.DeclaredMembers` (a public view: `MemberName`, `Slot`, `IndexAlias`, `IsName`, `IsReference`, `IsMany`, `IsNumeric`, `TargetType`), `TryGetIndexValue(document, alias, out string?)`, `TryGetIndexNumber(document, alias, out string canonicalDecimal)` (Q-J, revised 2026-09-22), `ReferencesOf(document, member)` (D11), `ResolveTargetLeaves(targetType)` over `AllDescriptors` (D9) | `GameCult.Caching` | the evaluator; `CultNetDocumentRegistry`; later any runtime-side reader | **the cache owns addressing and its values**; a reader outside the assembly reads declarations and values through one surface instead of reflecting over documents | the reflection loop at `CultNetDocumentRegistry.cs:325-342`, and the absence that forced it | +| `CultCache.cs` registration refusals: one alias-collision rejection beside `:931-943` (D10), one `unsupported_reference_shape` rejection for a `many`/reference member the cache cannot walk (D11) | `GameCult.Caching` | every registering catalog | a declaration the cache cannot read is refused when it is declared, not answered as nothing when it is read | an `ArgumentException` from `ToDictionary` `:462-468` that names nothing; a silent unwalkable reference | +| `contracts/cultnet/cultnet.selection.schema.json` (`$id`, referenced by `$ref`), `cultnet.snapshot-request.v1.schema.json`, `cultnet.database-subscribe.v1.schema.json`, `cultnet.snapshot-response-raw.v1.schema.json`; registry entries in `CultNetSchemaRegistry.cs` | CultLib contracts | C#, Rust; TS/Py/Kotlin follow-ups | one published shape of a selection, hand-written like its siblings, pinned by vectors in both runtimes | `schemaIds`/`recordKeys`/`includeSnapshot` as the wire's only selection | +| `src/GameCult.Networking/CultNetSelection.cs`: `CultNetSelection`, `CultNetFieldPredicate`, `CultNetCitation`, `CultNetIncoming`, `CultNetSelectionProjection`, `CultNetRecordRef`, `CultNetRawDocumentHeader`, `CultNetSelectionPage`, **`CultNetEdge`** (`From`, `Role`, `To`, `PayloadEncoding?`, `Payload?`), **`CultNetSelectionOperator`** (`AnyOf`, `Lt`, `Le`, `Ge`, `Gt`, serialised as the `op` string, never as a union); `Validate(IReadOnlyList)` — declared aliases and roles, non-empty lists, exactly one of `values`/`number` per `op`, and every reachable leaf declaring a compared alias declares it numeric | `GameCult.Networking` | the three message classes, the evaluator, Mesh | a selection is typed data with one validation | `_projectRecord`, the allowlist pair | +| `src/GameCult.Networking/CultNetSelectionEvaluator.cs`: `Select(cache, descriptors, selection, ordinals, asOf)` → ordered, hopped, cursored, projected page; `Matches(selection, descriptor, key, document)` for a single change; the cursor mint/parse with `cursor_stale` / `cursor_invalid` | `GameCult.Networking` | `CultNetDocumentRegistry` (snapshot), both servers (changes), `Reconcile` | one evaluator; order, snapshot and hop have one owner | the three engines (section 4) | +| `CultNetDatabase.LastWriteSequence(schemaId, key)` (a per-key ordinal kept on apply, ~20 lines) | `CultNetDatabase` | the evaluator's order and cursor | a row's ordinal is its last commit's sequence | `storedAt` as the only time | +| v1 message classes beside the v0 ones; the v0→`Selection` lowering (one function) | `GameCult.Networking` | both servers | v0 has no engine of its own | — | +| `packages/cultnet-rs/src/selection.rs`: the types (`Serialize`, `Deserialize`, no `untagged`; `SelectionOperator` an **externally tagged / string** enum, `Edge { from, role, to, payload_encoding, payload }`), `Row` trait (`id`, `ordinal`, `values(index) -> &[String]`, **`number(index) -> Option`**, **`references() -> Vec<(role, RecordRef, Option>)>`**), `RowSet` trait (`declared_indexes`, `declared_roles`, **`is_numeric(schema, index)`**, **`target_leaves(role)`**), `Malformed`, `select`, cursor mint/parse, `LIMIT_MAX` | `cultnet-rs` | Huginn (section 12), later Rust services | the same evaluator semantics as the reference, pinned by vectors both ways | Huginn's own `select.rs` from the earlier design | +| `snapshot_query.rs`: `serve_read_only_raw_snapshot` calls `select` over a lowered v0 selection; the policy check stays where it is | `cultnet-rs` | its existing callers and tests | the fifth engine has no rule of its own | the filter at `:112-125` | +| `contracts.rs`: `SnapshotRequestV1`, `DatabaseSubscribeV1`, `SnapshotResponseRawV1` variants | `cultnet-rs` | Huginn's daemon | the wire spelling equals the reference's | — | +| `contracts/cultnet/selection-vectors.cs-written.json` and `selection-vectors.rs-written.json`: a fixture row set (`cultnet.interop-selection-row` document type; declared indexes `kind`, `severity`, `tags[]` and **`mass` (numeric, declared on the abstract middle type, not on the leaves)**; references `parent`, `related[]` and **`components` (a dictionary keyed by reference with a float payload)** and **`design` (declared target = the abstract middle, resolving to two leaves)**; **two leaf schemas under one abstract middle**, so inheritance, the abstract target, the dictionary edge and the comparison are all exercised by the fixture rather than argued about in prose), **twenty-eight** selections, and each selection's expected page as ordered ids + `matched` + `next` presence + **the expected `edges` with their payload bytes**. The fixture must also carry, because tests depend on it and a loosening that cannot fail is the fixture's defect: a row whose `mass` **equals** a compared number exactly (S16), **three** rows sharing one index value (S23), one edge pointing outside its declared target (S18), two dictionary entries with **different** payload bytes (S19), and a nullable numeric member and a `decimal` one (S22). **Expected to grow** (R-4): it is chosen for coverage now, not pinned as final, and adding rows or selections to it is a normal change | tests, both runtimes | `NetworkingTests`, `cultnet-rs/tests/selection.rs` | **vectors written by the reference decode and evaluate identically in Rust, and vectors written by Rust decode and evaluate identically in the reference** | a within-runtime round trip, which pins nothing about parity | +| `contracts/cultnet/interop/cultnet.interop-selection-row.schema.json` | contracts | the vectors | — | — | +| `docs/cultnet-selection-cut.md` (this file), a paragraph in `contracts/cultnet/cultnet-distributed-database.md` under "Implemented", and the runtime table row in `docs/runtime-parity-scope.md` | docs | — | describe the live system | — | + +No dependency in either runtime (`schemars` is **not** added to +`cultnet-rs`: the schema is hand-written JSON like every CultNet schema, and +Huginn's derived schema for its own request embeds `Selection` through a +`#[schemars(schema_with)]` field attribute in Huginn. The attribute returns a +`$ref` to this cut's published selection schema `$id`. It does not go through +the substrate. (Corrected 2026-09-22: a hand-written `impl JsonSchema` for a +foreign type fails to compile with `E0117`, the orphan rule. The read-side +Imagination probed it.) — +see section 12). No new package, binary, transport, or store format. +**`packages/cultcache-rs` is untouched**: the C# cache change buys the +evaluator a read surface it does not have, and in Rust the row owner +already supplies exactly that through `Row`/`RowSet`. The asymmetry is +real and intended — the reference reads documents the cache owns, Rust +reads rows the consumer owns — and it is the reason the parity obligation +is on the *vectors* and not on the two implementations' shapes. + +## 7. Per-file changes (code that exists, anchored; new code by name and rule) + +**`src/GameCult.Networking/CultNetSchemaMessages.cs`**: after `:826`, the +three v1 classes; `CultNetSchemaVersions` (`:77`, `:93` and the +`SnapshotResponseRaw` constant) gains `SnapshotRequestV1`, +`DatabaseSubscribeV1`, `SnapshotResponseRawV1`. v0 classes untouched. + +**`CultNetSchemaMessageSerialization.cs:9-85`**: three arms before the +`_ => throw`. + +**`CultNetSchemaRegistry.cs:360-385`**: four `SchemaResourceSpec` entries. + +**`CultNetDatabase.cs`**: `:47` `internal static class` → `public static +class`; a `Dictionary<(string, string), long>` maintained where a mutation +is appended to the shard log (Hands anchors on the append site; section 1's +assumption is confirmed there) and `LastWriteSequence`; `:1052-1075` untouched. + +**`CultNetDocumentRegistry.cs`**: `:247-258` → `CreateSnapshotRequest(messageId, CultNetSelection)`; +`:263-349` → `CreateRawSnapshotResponse(cache, messageId, selection, ordinals, asOf, options)` +calling the evaluator and `ToRawRecord`; `:505-524` deleted. + +**`CultNetDatabaseServer.cs`**: `:276-316` handles v0 (lowered) and v1; +`:332-345` `CreateSubscription` calls `evaluator.Matches(selection, change)` +then `ToRawRecord`; `:347-468` deleted. + +**`CultNetDatabaseSubscriptionServer.cs`**: `:27, :44, :50` `_projectRecord` +deleted; `:112-167` handles v0 (lowered) and v1, and answers a +`snapshot_response_raw.v1` page with `matched`/`asOf`/`next`; `:218-249` +`Watch`: a selection with `cites`/`cited` runs `Reconcile` on every change, +otherwise `Matches` on the changed row; `:294-322` evaluate + authorize + +project; `:424-515` deleted. Module doc `:14-18` rewritten: projection is a +value on the request. + +**`src/GameCult.Caching/CultCache.cs`** (the only cache file this cut +touches): + +- `:112-150` `CultDocumentDescriptor`'s constructor and fields: `Members` + `:149` and `IndexAccessors` `:148` stay `internal`; a **public** + `DeclaredMembers` view and the three value accessors are added beside + them. Do not widen `Members` itself — `CultDocumentMemberDescriptor` is a + mutable internal DTO whose shape `ToCatalogEntry` `:151-176` depends on, + and publishing a mutable descriptor list makes the catalog's shape a + public contract by accident. The public view is a readonly struct or + sealed record built from it. +- `:445-490` `BuildDescriptor`: the alias `ToDictionary` at `:462-468` is + the site of the D10 refusal's *symptom*; the refusal itself belongs in + `DiscoverMembers` so it lands in `rejections` with its neighbours. +- `:838-946` `DiscoverMembers`: two new groupings beside the two at + `:931-943` — one over `IndexAlias` (D10), one over reference shape + (D11) — and two message helpers beside `DuplicateSlotMessage` / + `HiddenMemberMessage`. Nothing in the existing walk changes. +- `:1050-1114` `PersistedMember`: `Getter`/`GetterNullable` `:1081-1082` + untouched; `NumberOf` (non-null exactly for the closed CLR numeric set, + `Nullable` unwrapped) and `ReferencesOf` added beside them; + `MemberType` `:1052` and the attribute's `TargetType` surface through the + public view as the target `Type`. +- `:254-255` `AllDescriptors` is the input to `ResolveTargetLeaves`; the + set is computed per call, not cached, because `Refresh()` `:257-265` and + `RegisterDescriptor` `:381-410` can both add a leaf after any given + descriptor was built. +- `CultSchemaTypeNames.FromType` (`CultSchemaTypeNames.cs:9-31`) is + `internal` and generates the `TypeName` strings; the `IsNumeric` string + set is generated from the CLR set through it, never written by hand + (S22). + +**`packages/cultnet-rs/src/snapshot_query.rs`**: `:100-130` the two +allowlist sets and their filters become one `select` over the lowered +selection; `:64-99` and `:132-157` untouched; `:158-285` +`CultNetRawSnapshotQuery` untouched in this cut and named in Q-M. + +**`CultNetSelection.cs`**, **`CultNetSelectionEvaluator.cs`** (new): as +section 6. Rules that must die under their own mutation are in section 10. + +**`src/GameCult.Mesh/CultMeshSnapshots.cs`**: `:16-62` the options record +carries `Selection`; `:139-201`, `:434-516`, `:611-636` overlay through one +`WithSelection`; `:638-661`, `:750-773`, `:889-911` deleted; `:973-983`, +`:1000-1009`, `:1033-1047`, `:1078-1088` deleted. +**`CultMesh.cs`**: `:1941-1969`, `:2721-2748`, `:2750-2800` (one exact read +remains), `:3474-3497` deleted; `:2701-2719`, `:2838-2858`, `:2875-2915` +build a `Selection`. +**`CultMeshClient.cs:574-604, 830-860, 932-962`**, **`CultMeshBodyDemand.cs:177-221`**: +`Selection` literals. + +**`packages/cultnet-rs/src/selection.rs`** (new), **`contracts.rs:314-331`** +region gains the three v1 variants, **`lib.rs`** re-exports. **`tests/selection.rs`** +(new): the vectors both directions, the evaluator, the cursor, the +refusals, the untagged grep. + +**`tests/GameCult.Networking.Tests/NetworkingTests.cs`**: the seven tests in +section 4 rewritten; new tests in section 10; the vector writer under +`CULTNET_WRITE_VECTORS=1` following `scripts/write-cultmesh-realtime-frame-vectors.mjs` +and the C#-written pattern the QUIC campaign established (`docs/typescript-quic-realtime-cut.md:15-21`). + +## 8. Authority map + +- **Owner.** CultNet's database organ, `src/GameCult.Networking`, as the + reference: `CultNetSelection` owns the shape and its validation; + `CultNetSelectionEvaluator` owns matching, the hop, the order, the + snapshot and the cursor; `CultNetSchemaAliasMatching` owns schema + identity; `CultNetDatabase` owns a row's ordinal. **The cache owns + addressing and every value of it**: which names are indexes, which + members are references, whether a member is numeric, what leaves a + reference may target, what a row's value at an alias is, and what edges + and payloads a row carries — through `CultIndexAttribute` and + `CultReferenceAttribute`, the persisted `TypeName`, and the public read + surface of section 6. The vocabulary reads those declarations and adds + none: no new attribute, no persisted field, no schema-hash movement, and + no opinion in the evaluator about what a CLR type means. **The evaluator + never reflects over a document**; if it needs something the cache does + not expose, the cache gains a method, not the evaluator a `GetProperty`. `packages/cultnet-rs` + is the Rust spelling of the same owner, at wire parity, with the row + owner supplying what the cache supplies in C# (`Row`, `RowSet`). +- **Inputs.** The cache's rows and descriptors, the shard log's sequences, + the selection, the peer's authorization answers. Not inputs: a clock, + a payload path, a transport. +- **Outputs.** Pages (`headers` or `documents`, `matched`, `asOf`, `next`), + per-change match decisions, typed refusals (`selection_invalid`, + `cursor_stale`, `cursor_invalid`) as `cultnet.error.v0` with a code, the + form the reference already uses for routing errors. +- **Derived state.** The page, the order, the incoming-edge index per + evaluation, the cursor. **Demotions:** `schemaIds`/`recordKeys` are no + longer a selection language; they are a lowering of v0 into one. + `_projectRecord` is no longer an authority; projection is a request + value. `CreateRawSnapshotResponse`, `CreateChangeMessage` and + `CreateChangeCore` are no longer engines; they call one. + `IsSameCultDocumentSchema`, the Mesh `InferSchemaName` and the registry's + `MatchesRequestedSchema` are no longer owners of schema identity. +- **Forbidden writers.** Neither server may match a record by a rule of its + own; **`serve_read_only_raw_snapshot` may not filter by schema or key** + (its policy is authorization and stays; its allowlist filter goes); Mesh + may not re-filter a page the server answered — a caller *may* verify a + page against expectations it declared before the request + (`CultNetRawSnapshotQuery::accept_response`, which errors rather than + quietly dropping, and so cannot hide a server that answered wrongly), but + no caller may narrow a page and call the narrowed result the answer; + nothing may mint a + cursor a caller could construct; nothing may answer a page over a + different `asOf` than its cursor's; the evaluator may not read a payload + by path, only declared indexes and references, **and may not reflect over + a document at all**; **the evaluator may not read the cache's `_indexes` + map or call `GetByIndex`** — those answer a unique-index lookup, not a + predicate (section 1, S23); no rule may consult an edge's payload while + traversing (section 13); nothing outside `GameCult.Caching` may decide + whether a member is numeric or what leaves a target resolves to; no type + on the wire is `untagged`; the Rust `select` may not diverge from the + reference on any vector. +- **Shared paths.** The evaluator under snapshot, change, and reconcile; + `CultNetSchemaAliasMatching` under every schema match in both assemblies; + `ToRawRecord` under snapshot and change; the v0 lowering under both + servers. +- **Deletion line.** Commit 0: the cache's public read surface and its two + registration refusals, with S17-S22 green and `GameCult.Networking` + untouched — the cache change is independently true and lands first, so + that if the rest of the cut is cut, the substrate is not left with half a + surface. Commit 1: the shape, the evaluator and the v1 + messages beside v0, with the three engines rewired and deleted and the + seven tests rewritten — green. Commit 2: `_projectRecord` and the + Mesh collapse. Commit 3: Rust. Commit 4: vectors both ways and entries. + Nothing lands with two engines alive. +- **Where the line to CultMesh falls.** Mesh is a client that builds + selections and reads pages; it evaluates nothing. Where Mesh watches a + cache locally by name or index (audit sites #2, #4-9, #16-21), it keeps + its own loops until `CultNetDatabase.Watch(Selection)` exists, which is Cut 2 (section 18). + +## 9. Parity: what this cut covers, and what the other runtimes do + +**In this cut:** the C# reference (both servers, the client, the registry) +and Rust (`cultnet-rs`: types, evaluator, cursor; no subscription client, +because no Rust caller subscribes). Parity is pinned by vectors in both +directions (section 10), not by a round trip inside one runtime. + +**Runtimes not in this cut, stated answer per runtime, by source read:** + +| Runtime | On v0 (unchanged) | On a v1 request it receives | On a v1 page it receives | +|---|---|---|---| +| TypeScript | unaffected; the reference still answers v0 | **refuses**: `parseCultNetMessage` finds no validator for the version and throws (`contracts.ts:728-744`) | refuses the same way | +| Kotlin | unaffected (client only) | **refuses**: `require(schemaVersion == …v0)` throws (`CultMesh.kt:2195`) | n/a as a server; a Kotlin client sends v0 and gets v0 | +| Python | unaffected | **silently drops, no reply**: `handle_server_message` returns `[]` for an unknown version (`interop_peer.py:387`), so a caller times out rather than reading a refusal; **it cannot answer with wrong rows**, because v1 is a version it does not dispatch, which is why D3 chose a version over new fields | as above | +| Rust | in this cut | in this cut | in this cut | + +The one runtime that mis-answers today is none: nothing sends v1 to a +runtime that does not speak it until its follow-up lands, and a stray v1 is +refused (TS, Kotlin, C#) or dropped (Python). **Python's drop is fixed in +this cut, not in its follow-up** (R-2): after this cut the table's Python +row reads "refuses with `unsupported_schema_version`", and every runtime on +the wire answers an unknown version with something a caller can read. The +build budget gains one Python test run for it. + +**Follow-ups, recorded with triggers:** + +- **FU-TS.** `cultnet-ts`: the three v1 contracts, Ajv registration, a + `Selection` type; `cultmesh-ts` builders. Trigger: the first TypeScript + caller that needs a filtered snapshot or subscription (the browser Eve + runtime, when it reads pipeline state). Until then TS refuses v1 loudly. +- **FU-Py.** Its first line is **not** a follow-up: by R-2, `cultnet-py` + and `cultmesh-py` reply `cultnet.error.v0 + { code: "unsupported_schema_version" }` for an unknown version **in this + cut** (five lines at `interop_peer.py:360-387` and the delegating path at + `cultmesh_py/server.py:341`, with one test per site that a v1 message + produces a refusal and not an empty list). The rest of FU-Py is the v1 + contracts, and the **three** copies of the selector match + (`interop_peer.py:110-125`, `cultmesh_py/server.py:449-470`, + `cultmesh_py/node.py:1322-1345`) collapsed into one evaluator. Trigger: + the first Python peer asked a v1 question, or the interop lane gaining a + v1 case. +- **FU-Kt.** `cultmesh-kotlin`: v1 snapshot request builder and page + reader. Trigger: an Android/JVM client reading filtered state. +- **FU-v0.** Retire v0's classes, schemas and lowering once FU-TS, FU-Py, + FU-Kt have landed and the interop lanes send v1. Trigger: the last of the + three. +- **Not a follow-up any more:** `CultNetDatabase.Watch(Selection)` is + **Cut 2**, mapped in section 18 with its own deletes, authority map, + verification and numbers. It lands after this cut. The audit's ≈ 240 + local-watch lines are counted there, and the real figure turned out + larger than the audit's estimate (≈ −378 in Mesh, section 18.3), because + the audit did not count the nine `Collection*` overloads as selection. + +`docs/runtime-parity-scope.md`'s table gains, per runtime, "typed selection +v1: C# and Rust claimed; TS, Python, Kotlin not claimed (refuse / refuse / +drop)". The claim is written where the parity claims live, not here alone. + +## 10. Verification + +**Builds.** `dotnet build` of `GameCult.Caching`, `GameCult.Networking`, +`GameCult.Mesh` and their test projects — the cache is now in the build +budget, and it is the assembly the rest of CultLib depends on, so +`dotnet test tests/GameCult.Caching.Tests` is the gate on commit 0 and runs +on every later commit; `cargo test -p cultnet-rs`; the TypeScript workspace +untouched but `npm run test --workspace packages/cultnet-ts` run once to +prove the interop lane still passes on v0. Host = target = workstation for +C# and Rust; no native code. Nothing cleaned. + +**Tests, each named for the rule it pins, with the mutation that kills it — +a loosening where one exists.** + +| # | Test (C# unless marked) | Pins | Revert kills | Loosening kills | +|---|---|---|---|---| +| S1 | `Selection_RefusesUndeclaredIndexRoleAndEmptyLists` | D2, door refusals typed | validation dropped (empty page) | `index` checked against *any* schema's aliases rather than the reachable ones (a predicate on an alias only an excluded schema declares matches nothing silently) | +| S2 | `Evaluator_ConjoinsAnyOfPredicatesOverDeclaredIndexes` | fields | an arm dropped | any-of treated as all-of | +| S3 | `Evaluator_OrdersByLastWriteSequenceThenIdentityAndReverses` | order, `descending` | sort by `storedAt` | `descending` ignored | +| S4 | `Evaluator_PagesExactlyOnceAndTheLastPageSaysSo` | cursor walk | `next` always present | position `>=` (last item repeats) | +| S5 | `Evaluator_RefusesAStaleCursorAfterTheShardLogAdvances` | `cursor_stale` typed | advance ignored (a page over a moved set) | digest check dropped (a cursor accepted under another selection) | +| S6 | `Evaluator_HopsOneEdgeByDeclaredReferenceAndRole` | hop, roles from `CultReferenceAttribute`, `Many` | role ignored | a second hop followed | +| S7 | `Evaluator_NegatedIncomingEdgeIsTheOnlyNegation` | `cited { exists: false }` | `exists` ignored | citer's status consulted (an unauthorized citer's edge dropped) | +| S8 | `Evaluator_HeaderProjectionCarriesNoPayload` | projection | payload carried | `payloadEncoding` carried without payload | +| S9 | `Subscription_EvaluatesSelectionOnSnapshotAndEveryChange_AndReconcilesHopBearingOnes` (rewrite of `:1587`) | D6 | a change matched by v0 allowlists | a hop-bearing subscription taking the per-change fast path (a change to the citer not reconciled) | +| S10 | `V0Request_LowersToASelectionAndHasNoEngineOfItsOwn` (rewrites of `:3124`, `:3158`, `:5547`, `:5601`, `:2256`, `:2310`) | D3/D4 | v0 matched by its own loop | alias matching inlined again in one server | +| S11 | `SchemaAliasMatching_IsTheOneMatcherInBothAssemblies` (grep-shaped, negative) | D4 | — | — | +| S12 | `SelectionVectors_WrittenByTheReference_DecodeAndEvaluateIdenticallyInRust` (Rust reads `selection-vectors.cs-written.json`) and `SelectionVectors_WrittenByRust_DecodeAndEvaluateIdenticallyInTheReference` (C# reads `selection-vectors.rs-written.json`) | **parity** | any semantic drift on either side | a vector whose expected ids are compared as a set (order lost) — the vectors carry ordered ids and `next` presence | +| S13 (Rust) | `selection_is_never_untagged` (grep over `packages/cultnet-rs/src` for `untagged`, empty) and `selection_round_trips_named_and_positional` (both encodings) | the encoding rule | an `untagged` shape added | — | +| S14 (Rust) | `select_over_a_toy_row_set_matches_orders_hops_pages_and_refuses` | D7, no CultCache knowledge in the evaluator | as S1-S8 | as S1-S8 | +| S15 | `Mesh_ReadsASnapshotPageWithoutReFilteringIt` (Mesh tests) | the client trusts the page | the four-tier fallback restored | schema re-filter restored | +| S16 | `Evaluator_ComparesNumbersAtTheBoundaryForEachOfTheFourOperators` | D8's operators; one operator per predicate; two predicates make a range | the comparison ignored (every row matches) | `le` evaluated as `lt` (and `ge` as `gt`) — **kills only if the fixture carries a row whose `mass` equals the compared number exactly**; the fixture must, and if it does not, that is the fixture's defect, not licence to mutate something easier | +| S17 | `Evaluator_AppliesAnInheritedAliasToEveryReachableLeaf` | the inheritance rule; the cache's `BaseType` walk reaching the evaluator | the walk stopped at the leaf (`CultCache.cs:847`) — kills S17 and S12 together | "reachable" narrowed from *every* leaf matching `schemas` to the first descriptor consulted, so a two-leaf selection on an alias declared only on the abstract middle answers with one leaf's rows and no refusal — **requires the fixture to declare `mass` only on the middle and to carry rows of both leaves** | +| S18 | `Evaluator_ResolvesAnAbstractTargetToItsLeavesAndRefusesAnEdgeOutsideThem` | D9; the typed `reference_outside_target` | the target set taken as `{TargetSchemaName}`, which is `null` for an abstract target, so the hop follows nothing | the out-of-target edge **skipped** instead of refused — the option section 3 rejected, and the mutant that proves the rejection is load-bearing; **requires the fixture to carry one edge pointing at a schema outside the declared target** | +| S19 | `Cache_EnumeratesADictionaryReferenceAsEdgesCarryingItsValues` (cache tests) | D11 | `ReferencesOf` yields nothing for a dictionary — today's behaviour, restored | the keys enumerated and the **values dropped** (`payload` null), which is the shape a careless `IEnumerable` implementation would have; **requires two dictionary entries with different payload bytes**, or the assertion passes on shape alone | +| S20 | `Evaluator_ReturnsTraversedEdgesOnlyForHoppingSelections_AndNoPayloadUnderHeader` | the `edges` rule | `edges` never emitted | payload carried under `header`; and, separately, `edges` emitted for a selection with neither `cites` nor `cited` — a widening rather than a loosening, and killed by the same test | +| S21 | `Cache_RefusesADuplicateIndexAliasAndAnUnwalkableReferenceByName` (cache tests) | D10, D11's shape rule | the rejections removed — **kills only if the test asserts the message names the schema, the two members and the alias**, since without them `ToDictionary` still throws an `ArgumentException` and a shallow `Assert.Throws` passes either way. That is the entire content of D10 | the alias grouping keyed by `MemberName` instead of `IndexAlias`, which refuses nothing the existing `HiddenMemberMessage` (`:937-943`) did not already refuse | +| S23 | `Evaluator_MatchesEveryRowSharingAnIndexValue_NotTheCacheIndexWinner` | the evaluator reads values per row, never `_indexes` / `GetByIndex` | the predicate answered from `GetByIndex`, so an `any_of` over a value **three** fixture rows share answers with one | the per-row read kept but short-circuited after the first match when `matched` is all the caller asked for — a plausible optimisation that makes `matched` a boolean in disguise; **requires three rows sharing one index value**, which the fixture must carry | +| S22 | `Cache_DerivesIsNumericFromTheClrSetAndTheTypeNameSetAgrees` (cache tests) | D8's two authorities agreeing | `IsNumeric` true for every member, so a comparison on a string alias validates and compares `ToString()` lexically | the `TypeName`-string set hand-written and missing `System.Nullable` or `System.Decimal`, so a member is numeric against the live descriptor and non-numeric against the same schema read back from a persisted catalog — **requires the fixture to declare a nullable numeric member and a `decimal` one** | + +**On the parity vectors and the four findings.** S12 is not a new test but +a widened one: the fixture of section 6 carries the abstract middle, the +two leaves, the inherited numeric alias, the dictionary reference with +float payloads and the abstract-target reference, and the vector set +includes at least one selection per finding — a comparison on the +inherited alias, a hop into the abstract target, a hop over the dictionary +returning payloads, and the same hop under `header`. Both directions: +**vectors written by the reference are evaluated in Rust, and vectors +written by Rust are evaluated by the reference**. A round trip inside one +runtime pins nothing and is not counted. The Rust side's fixture rows +implement `Row` over the same declared values, so the vectors test the +*semantics* both ways while each runtime keeps its own source of rows. + +**Negative greps:** `rg -n "GetProperty|GetField|GetCustomAttribute" src/GameCult.Networking` +empty (the evaluator reflects over nothing); +`rg -n "untagged" packages/cultnet-rs/src packages/cultcache-rs/src` +empty; `rg -n "InferSchemaName" src/GameCult.Mesh` empty and +`src/GameCult.Networking` only in `CultNetSchemaAliasMatching` and the +registry's payload-schema resolution; `rg -n "MatchesRequestedSchema|MatchesSchema\(" src` +empty; `rg -n "_projectRecord|projectRecord" src` empty; +`rg -n "SchemaIds = .*RecordKeys = " src/GameCult.Mesh` empty (no +allowlist pair assembled by hand); `rg -n "CloneSnapshot(Facade)?RequestOptions" src` at most one. + +**Mutations.** `tools`-style entries in `scripts/mutate-cultmesh.mjs`'s +format with three new targets, `caching` (killer `dotnet test +tests/GameCult.Caching.Tests`, carrying S19, S21 and S22), `networking` +(killer `dotnet test tests/GameCult.Networking.Tests`) and `rust` (killer +`cargo test -p cultnet-rs`), +one entry per rule above with revert and loosening; the runner's +byte-rewrite/verified-restore discipline applies unchanged. The runner is +the QUIC campaign's file and is dirty in the tree; **this campaign adds its +entries in its own file** (`scripts/mutate-cultnet-selection.mjs` or an +entries module the runner imports) and does not edit the QUIC campaign's +targets — Self decides the exact split at landing. + +## 11. The CultMesh subtraction audit, with real numbers + +Method: an Explore pass classified 92 sites in `src/GameCult.Mesh` and +`CultNetDocumentRegistry.cs` as (A) mechanical selection/projection over +schema ids, keys or fields, or (B) a domain rule (authority, freshness, +transport, session). (A) totalled **1,158 lines**, (B) **429**. **(A) is not +a reduction figure**; it is what *could* be expressed as a selection. What +collapses is what has a replacement in this cut. + +| Category | Sites (audit #) | Lines now | After | Net | +|---|---|---:|---:|---:| +| Selector-carrying options cloned five times | #11, #3, #74, #75, #77 | 128 | ~30 (`with` on a record) | **−98** | +| "No schema filter when keys are given" rule, three times | #65, #73, #10 | ~16 | ~4 | −12 | +| `CleanSnapshotFilter` | #79 | 11 | 0 | −11 | +| Client-side re-filter of a snapshot by schema, plus `InferSchemaName` | #80 (part), #81, #82 | ~51 | ~10 (decode only) | −41 | +| Four-tier read fallback + decode gate | #12, #13 | 50 | ~10 | −40 | +| `IsSameCultDocumentSchema` | #22 | 24 | 0 (public matcher) | −24 | +| Selector literals in client bindings | #32, #34, #35 | 93 | ~68 | −25 | +| Hot-body subscription allowlists | #25 | 45 | ~30 | −15 | +| Peer snapshot / body subscribe selector construction | #10, #14, #15 | 81 | ~61 | −20 | +| Snapshot facade overlay logic | #64, #66-70, #72 | ~110 | ~70 | −40 | +| **Collapses in this cut** | | | | **≈ −326** | +| Local cache/database watches by name and index and their predicates | #2, #4-9, #16-21 | ≈ 240 | ≈ 240 | 0 in this cut; **≈ −378 in Cut 2** (section 18.3 — larger than this audit estimated, because the nine `Collection*` overloads at `CultMesh.cs:2278-2480` were not classified as selection and are) | +| Handle catalogs by type/schema, surface catalog, operation payload | #41-49 | 233 | 233 | 0 — these index *handles*, not records | +| Verse discovery selection and reshaping | #36, #38 (part), #39, #40, #83, #85 | ~110 | ~110 | 0 — over Verse observations, not documents | +| Single-file catalog membership | #58-62 | 81 | 81 | 0 — file-format membership | +| Provider session wire decode gate | #50 | 12 | 12 | 0 | +| (B) sites | 24 sites | 429 | 429 | 0 by definition | + +**Plain statement.** `src/GameCult.Mesh` shrinks by about **326 lines of +21,720 (1.5%)** in this cut, and a further **≈ 378 in Cut 2** — the two +together are about 3.2% of the assembly, and Cut 2 is where the audit's +expectation of a real reduction is met. About 590 of the +audit's (A) lines stay because they select handles, Verse observations or +file-catalog entries, not database records. The operator's expectation of a +net reduction in CultMesh holds, modestly; it does not hold for CultLib as a +whole in this cut, because the Rust runtime is new capability (section 14). +If the expectation was a large reduction, this audit says it is not there +without the watch cut, and it is not there at all for the catalogs and +discovery. + +## 12. Huginn: the consumer cut, and what moved + +**Moves to CultLib (this map):** `Selection`, `Citation`, `Incoming`, +`Projection`, `Page`, the cursor, `select`, the `Row`/`RowSet` traits, the +untagged rule and its probe, the cap, the order rule and the snapshot +contract. Huginn's earlier `select.rs` is never written. + +**Stays with the organ (a smaller, later cut in the Epiphany campaign map, +against a `cultnet-rs` dependency Huginn already has):** + +- `impl Row for PipelineDocumentView`: `ordinal = admission.sequence` + (Q-B A, still recommended; under Q-B B Huginn refuses `cursor_stale` on + advance exactly as the reference does, which is now a legitimate second + option), `values(index)` for the declared aliases `campaign`, `repo`, + `cut`, `kinds`→(schema), `in_force`, `faculty`, `severity`, `confidence`, + `origin`, `authority`, `claim_outcome`, `outcome`; `references()` from + `docs::citations` with the fifteen roles; `RowSet::declared_*` as the + organ's closed lists, so an unknown alias or a value outside an enum + refuses typed. +- `docs::citations`, `CitationRole`, `ResolutionOutcomeKind`, the summary + as the organ's header, the `as_of` restriction of the image to receipts, + the semantic refusal, the ref validation of `cites.target` through the + leaf, and the deletion of `open_items`/`history` with the relation table + unchanged (`history(Subject)` = `kinds: [resolution], cites { target, role: subject }`; + the open lists = five selections). +- **Deleted from the organ's wire (R-3, ruled, not proposed):** + `PipelineQuery`; **`admitted_after` and `admitted_before`**, which existed + only to approximate an order and are replaced by `descending` plus the + cursor — they are a delete in the Huginn cut's own deletes-first table, + with their query-builder call sites, their schema fields and the tests + that pin them, not a deprecation; and `QUERY_LIMIT_MAX`. Huginn's `Query { instance, selection }` carries + the substrate's type; its published request schema embeds `Selection` + through a `#[schemars(schema_with)]` attribute that returns a `$ref` to the + published selection schema. A hand-written impl fails with `E0117` + (corrected 2026-09-22), and the substrate publishes JSON, not `schemars`. It + is pinned by the + existing byte-for-byte test. +- Cut 11's lowering to Qdrant and the after-index application of the hop, + as before. + +The Huginn cut is ordered **after** this cut's commit 3 (Rust) and before +Cut 11 and Cut 13, as 10b was. + +## 13. Deliberately not possible, and why + +OR across predicates (ask twice); negation beyond `cited { exists: false }`; +a predicate on the far end of the hop; a second hop; ranges, dates, text, +paths, sort fields, counts beyond `matched`; a page not tied to `asOf`; +selection across shards or minds; a cursor the caller constructs. Each for +the reason the earlier specification gave, unchanged. + +Named individually, because each has an obvious-looking one-line +implementation and a caller who will ask for it: + +| Not expressible | The obvious ask | Why it is the door | +|---|---|---| +| **A predicate on an edge's payload during traversal** — "components whose quantity is over 4", "demand profile entries weighted above 0.5" | one `if` inside the hop loop, over a payload the evaluator is already holding | **It is a join condition.** The moment a predicate can read a value that belongs to neither the row nor the selection, the evaluator is combining two sources under a condition, and everything that follows is a query planner: which side to drive from, whether to build the incoming-edge index before or after filtering, how `matched` counts a row whose only surviving edge was filtered, what the cursor means when the page is a join result, and whether the payload's type is comparable at all when its declared type differs per leaf. None of that is answerable in a bounded vocabulary. **The caller follows the edge, receives the payload in `edges`, and filters the result** — one extra step for the caller, an entire category of machinery this organ never grows | +| **A set of exact `(schema, key)` pairs** | `keys` already exists; let an entry name its schema | `schemas` × `keys` is a cross product and stays one. `CultNetRawSnapshotQuery` (section 1) shows the cost honestly: it over-requests and verifies. The fix is either a second list shape or a pair type on the wire, and both are the beginning of a term language. A caller who needs exact pairs asks once per schema, or accepts the cross product and verifies against what it declared. Recorded as Q-M, recommendation A: state the limit | +| **A predicate that depends on how many edges a row has** — "hulls with more than three components" | `cited` already counts to one | `exists: true/false` is a boolean, and a threshold is a range over a derived aggregate. Aggregation is a second evaluator with its own ordering and paging semantics | +| **`edges` without rows, or rows the hop excluded** | a `projection: "edges"` | the page's rows are the answer and the edges explain it; an edge-only page is a different question (a graph read) and would need its own order, cursor and bound | + +## 14. Subtraction ledger (estimate) + +| | Removed | Added | +|---|---:|---:| +| `src/GameCult.Caching` | 0 | **~150**: the public member view ~40, `TryGetIndexValue` / `TryGetIndexNumber` + the CLR numeric set ~35, `ReferencesOf` over the three shapes ~40, `ResolveTargetLeaves` ~10, two rejections with their messages ~20 | +| `src/GameCult.Networking` | 368 | ~400 (`CultNetSelection` + `CultNetEdge` + the operator 170, evaluator + cursor + the incoming-edge index 190, ordinals 20, v1 classes and lowering ~40 minus shared) | +| `src/GameCult.Mesh` | ≈ 365 gross | ≈ 40 (one `WithSelection`, one exact read) | +| `packages/cultnet-rs/src` | ~31 (`snapshot_query.rs`'s filter) | ~430 (`selection.rs` 390 with edges and numbers, `contracts.rs` 40) | +| `packages/cultnet-py`, `cultmesh-py` | 0 | ~5 (the `unsupported_schema_version` reply, ruled into this cut) | +| `contracts/cultnet` | 0 | 4 schema files (~200 lines JSON), 1 interop row schema, 2 vector files (generated) | +| tests, C# | ~250 rewritten | ~600 (S1-S12, S15-S18, S20 in Networking; S19, S21, S22 in Caching; the vector writer) | +| tests, Rust | 0 | ~340 (S12-S14 with the edge and number vectors) | +| entries | 0 | ~38 entries across three targets | +| docs | — | this map; two paragraphs | +| **net source outside tests** | | **≈ +32 in C# Networking, +150 in C# Caching, +399 in Rust; ≈ +585 across the repo** | + +**The estimate moved, and in the wrong direction.** The committed version of +this ledger said ≈ +370 and ≈ −18 in C#. Both were wrong, for one reason: +the map assumed the cache needed no change, and the cache needs about 150 +lines of new public surface before the evaluator can read a single declared +value from outside the assembly (section 1). The honest figure is ≈ +585. +What the repo buys for it is unchanged in kind and larger in size: one +evaluator where **five** stood (three in C#, one in Mesh's re-filter, one +in Rust), a read surface where the substrate's own consumers were +reflecting over documents, edges and their payloads where a declared +reference was unreadable, numeric comparison over a type the catalog has +persisted all along, and a Rust runtime with the capability at all. Nothing +here is a reason to shrink the cut; it is a reason not to claim the cut +shrinks the repo. + +The repo grows by about 370 source lines for: a typed selection with a +derived-by-vector schema where two allowlists were the only language; +projection as a value where it was a delegate no caller reached; an exact +snapshot cursor where paging did not exist; one evaluator where three +engines and six schema matchers stood; a Rust runtime that did not have the +capability at all. CultMesh proper shrinks ≈ 326. The liability retired is +not in the line count: five copies of one options record, four spellings +of schema identity, a client that re-filtered what the server answered and +a read that could return the wrong key. + +## 15. Build budget + +C#: **three** assemblies and three test projects (`GameCult.Caching` joins +the budget; it is a dependency of the other two, so touching it rebuilds +them), debug, workstation. Rust: +`cultnet-rs` lib + tests, warm target dir, +0 to +60 paths. Nothing cleaned. +No native, no TypeScript build beyond one interop-lane run. + +## 16. Operator questions, one batch + +**Ruled 2026-09-17 and no longer questions.** Four of the batch are +settled; they are recorded here as rulings and carried in the sections +they govern. + +- **R-1 (was Q-F). v0 retires on a named trigger, not "eventually."** The + reference keeps answering v0 by lowering it into a `Selection`, with no + engine of its own. That lowering is a **scheduled deletion**: it is + deleted when FU-TS, FU-Py and FU-Kt have all landed and the interop lanes + send v1, and that is FU-v0's trigger in section 9. A shim with no + deletion date is a permanent shim; this one has a date written as a + condition, and the condition is checkable by grep over the three + runtimes' contract files. Section 4's "not deleted in this cut" row and + section 5's keeps both point here. +- **R-2 (was the second half of Q-F). Python's silent drop is fixed in this + cut.** Every other runtime refuses a message it does not understand; + Python returns `[]` (`interop_peer.py:387`) and the caller reads a hang + rather than a rejection. The five lines that reply `cultnet.error.v0 + { code: "unsupported_schema_version" }` land here, ahead of FU-Py's own + trigger, because a silence is a worse failure than a missing feature. + Carried in section 9's FU-Py entry and section 14's ledger. +- **R-3 (was Q-G). `descending` is the order; the time windows go.** + `admittedAfter` / `admittedBefore` existed to approximate an order the + vocabulary now states outright, and two filters standing in for an order + are worse than the order. They are deleted from Huginn's wire in the + consumer cut (section 12), not kept as an organ-side alias any-of. "The + latest N" is `descending, limit: N`. +- **R-4 (was Q-I). The fixture is chosen for coverage and expected to + grow.** The vector row type is the dedicated + `cultnet.interop-selection-row` family of section 6, shaped to *exercise* + the four hostile findings rather than describe them: shared fields on an + abstract middle with two leaves under it, a reference whose declared + target is that middle, and a many-reference carrying a payload. It is + **not pinned as final** — the fixture is expected to gain rows and + selections as the vocabulary meets more catalogs, and a change to it is a + normal change, not a contract break. What is pinned is the parity + obligation over whatever the fixture holds: both directions, ordered ids, + `matched`, `next` presence, and the edges with their payloads. +- **R-5 (was Q-H). Watching a selection is its own cut, mapped in section + 18 of this document**, after this one and depending on it. Nothing of it + is smuggled into the selection cut and nothing here is designed around it + speculatively; the seam already drawn — one selector type serving both a + query and a subscription — is all this cut owes it. + +**Still open:** + +- **Q-A. Leaf `Short` titles for question and ruling** (Huginn/Epiphany). + Unchanged: **A, not now** (recommended); B, a leaf follow-up before Cut 13; + C, a text projection (Cut 11's question). Depends: the organ's header row + for those two kinds. +- **Q-B. Huginn's receipt ordinal.** **A, record it** (recommended; exact + order, no `cursor_stale` on an append-only mind); **B, do not**: Huginn + refuses `cursor_stale` on advance like the reference does — now a + legitimate option under one contract, costing a re-walk on a busy mind + and id-order ties within a second. Depends: Huginn's consumer cut only. +- **Q-C. Delete `open_items` and `history`.** **A, delete** (recommended); + B, thin presets in Huginn; C, wire operations (refused). Depends: Cut 13's + tool list. +- **Q-D. The representation.** **A, declared-alias any-of over strings in a + new v1 selection** (recommended; D1, D2); B, Qdrant's `Filter` (rejected, + section 3); C, typed enums on the wire (impossible in the substrate: it + cannot know a consumer's enums; the organ keeps the typed refusal at its + door). Depends: everything in sections 2-10. +- **Q-E.** Withdrawn: the seam question is answered by the placement ruling. +- **Q-J. Number encoding on the wire. RULED B, decimal strings, + 2026-09-17.** The operator: floats are fragile, and strings are the most + reliable way to store a number. **Self's recommendation of A was argued + backwards and the map said so wrongly.** B was framed as "a second value + encoding beside `any_of`'s strings"; it is the opposite. Every value in this + vocabulary is already a string, so decimal strings keep the wire to **one** + value encoding, and it is float64 that would add a second. What B really + costs is a comparison rule, and that is where the danger sits: a decimal + string compared lexicographically answers that ten is less than nine. So + the cut must specify a canonical decimal form and a numeric comparison, + and pin both with mutants — a lexicographic comparison must die, and a + non-canonical spelling of an equal value must not change an answer. Name + the edge cases the canonical form settles: leading and trailing zeros, an + explicit plus, exponent notation, and negative zero. No exactness limit + needs stating, because there is no longer one. + - *Superseded, kept as history:* **A, IEEE float64, with the 2^53 + limit stated in the schema and in this map** (recommended: one encoding, + no parse rule per runtime, and no catalog in hand declares an integer + member wide enough to lose). **B**, decimal strings — exact, but a second + value encoding beside `any_of`'s strings and a per-runtime parse rule, + and two ways to spell a number is how a vocabulary starts growing terms. + **C**, add `integer: int64` beside `number` now, sharing `op` — additive + and untagged-free, and can be added later without breaking A, which is + why adding it now is premature. Depends: the schema files and both + runtimes' predicate types. +- **Q-K. Family names for abstract bases on the wire. PARKED, 2026-09-17, + and Self's reason was wrong.** The operator: this was possible when + CultCache was a single file, so it is odd that it is hard now; not + load bearing either way. That is correct. In-process a family is one + assignability check, because the runtime holds the hierarchy. Over the + wire there is no type system, only schema names, and an abstract type + carries no `[CultDocument]` so it never gets one. **The hardness is not + modelling, it is that nothing publishes the hierarchy where a remote + caller can see it.** The honest cost is therefore a catalog addition, + each leaf's entry naming its base chain, after which a family is the + leaves whose chain contains the name asked for. Small work — but it moves + the catalog's shape, and this cut's whole claim to being cheap is that it + moves neither the catalog's shape nor its hashes. So it is **deferred to a + cut that is already touching the catalog**, not deferred because there is + nothing to name. + + **Trigger named, 2026-09-17: the source-generator campaign needs it first.** + The operator's position is that any project using CultNet wants the types it + touches native, and that where the hierarchy is not being declared in + parallel by hand, a generator should build it. That generator runs against + **published schemas**, with C# authoring and the schema as the contract, + which is what the reference-runtime rule already says. + + The obstacle is the same missing fact. `CultCache.cs:847,887,966` walks the + base types while collecting members and then discards the hierarchy, and + `ToCatalogEntry` (`:152-177`) publishes a schema id, the canonical schema, + the compatible ids and a flat member list carrying slot, name, type, + reference-ness, many-ness, target and alias. **Nothing records what a type + inherits from.** So a generator fed published schemas alone emits one flat + class per leaf with the inherited members copied into each — exactly the + hierarchy the operator wants built for them, and unbuildable from what is + published today. + + So the base chain in the catalog is a **prerequisite of the generator + campaign**, and family names fall out of it for free once it exists. Until + then a family expands at the call site into its leaf schema names, which the + generator can emit as a constant, costing the protocol nothing. The honest + limit of call-site expansion, to be stated wherever it lands: it is + closed-world per compilation, so a leaf declared where the caller does not + compile leaves the list silently short, and an open-world caller must ask the + catalog at run time instead. + + The generator is **its own campaign, mapped after this cut lands** (operator, + 2026-09-17: "definitely later"), because its value is emitting against a + shape that is settled and this cut is what settles it. It is also where the + query sugar comes from: typed per-kind builders make filtering a document by + another kind's field a compile error rather than an empty page. **No source + generator exists in CultLib today** — no Roslyn generator anywhere in the + repository, and `src/GameCult.Caching/emitted/` is empty. + + Superseded reasoning, kept as history: + an abstract type has no `[CultDocument]`, no schema name + and no catalog entry, so there is nothing to name; a caller who wants + "every crafted item" enumerates the leaves from the schema catalog it + already reads. **B**, a `[CultDocumentFamily]` declaration plus a catalog + concept plus a matching rule in every runtime, in a later cut. Note this + is only about the `schemas` list: the *hop* already resolves an abstract + target to its leaves (D9), so the hostile example works under A. +- **Q-L. Refusing an out-of-target reference at write time. RULED A, + 2026-09-17**, with the follow-up upgraded from optional to intended. The + operator: notice on read for now, but on write eventually; today this is + left to consumers to enforce, as Aetheria's Database Tools did and as + CultCache Studio is expected to, and it is easy to insert garbage at the + source level which a cheap check would prevent. + + **Two things make the follow-up worth more than "nice to have."** First, + enforcement living in consumers is duplicated authority by construction: + every tool that writes records re-implements the same check, and a tool + that forgets is indistinguishable from one that does not, until a read + refuses. Second, the check really is cheap — the declaration already names + the target (`TargetSchemaName` on the member catalog entry), and the write + path already has the record in hand. + + **What Self could establish about the consumer story, 2026-09-17:** it + rests on less than it sounds. There is no CultCache Studio repository + under `F:\Projects`, and no project file by that name anywhere; every + reference to it is forward-looking, in Aetheria's migration documents, + where it is described as absorbing that project's Database Tools. Aetheria's + actual data tooling today is the `tools/AetherDb` console project. So the + enforcement being relied on is one tool, in one project, for one catalog, + and there is no second implementation to be inconsistent with yet — which is + the cheapest moment to move the rule to its owner rather than the most + expensive. + + Original options: **A, follow-up (FU-Ref)** (recommended): this cut refuses it at read + (`reference_outside_target`, S18), which is where the corruption is + noticed; refusing at write touches the cache's put path and every + runtime's apply path and is a change of a different size. **B**, in this + cut. Under A, the read-side refusal is the only thing standing between a + corrupt edge and a wrong answer, which is why it refuses instead of + skipping. +- **Q-M. The `(schema, key)` cross product. RULED A, 2026-09-17**, in the + operator's words: once per schema. The cross product stays, the limit is + stated, and a caller needing exact pairs asks once per schema. No third + addressing list and no rule for combining three of them. + Original options: **A, state the limit** + (recommended): `schemas` × `keys` stays a cross product; a caller needing + exact pairs asks once per schema or verifies what it declared, as + `CultNetRawSnapshotQuery` already does. **B**, allow a `refs: + RecordRef[]` list beside `keys` — expressible without a term language and + genuinely useful, at the cost of a third addressing list and a rule for + how three lists combine. **C**, let a `keys` entry carry a schema — a + path language in miniature, refused. Depends: section 13's table and + `snapshot_query.rs`'s client. + +**Q-A, Q-B and Q-C are no longer open.** The operator ruled all three on +2026-09-17 and they are recorded in the Huginn campaign's map, +`F:\Projects\Epiphany\notes\eureka-pipeline-state-cut.md`: receipt ordinals +yes; `open_items` and `history` deleted rather than kept as presets; and the +leaf gains titles on `question` and `ruling`, riding the same store version +bump as the ordinal so there is one migration rather than two. They are named +below only because work here still depends on them. + +What depends on each: S1-S8 on Q-D A; S5 on the shard-log assumption +(section 1) and on Q-B for Huginn; S9 on D6; S16 and the schema files on +Q-J; S18 on Q-L A; the Huginn cut on Q-B and Q-C. Settled by R-1 to R-5: +S10, S12, the fixture, FU-v0's trigger, FU-Py's five lines, Huginn's +window deletion, and the watch cut's existence. + +## 17. What was probed, read, and not settled + +**Probed:** the untagged round trip (section 2). **Read:** every line +anchored above; the CultMesh audit's 92 sites by an Explore pass whose +classification I checked at the sites that carry the ledger (the five +clones, the four matchers, the fallback, the two engines). **Not run:** +`dotnet` or `cargo` on CultLib — the tree is dirty from the QUIC campaign +and no claim here depends on a build; Hands takes the baselines named in +Pins. **Not settled:** whether every committed write has a shard-log +sequence (section 1, Hands confirms at the append site); the exact split of +mutation entries against the QUIC campaign's runner (section 10, Self at +landing); whether MessagePack-CSharp needs a union attribute for the +page's `headers | documents` (it does not if both are optional arrays with +exactly one present, which is the spelling chosen so no union is needed — +Hands confirms the schema says "exactly one" with `oneOf` over `required`). + +**Read on the second pass, and what it changed.** Each of these was read at +the source, and three of them contradicted something this map or its +predecessor's notes asserted: + +| Read | Held | Changed | +|---|---|---| +| `CultCache.cs:474`, `:151-176`, `:598-629`, `CultSchemaTypeNames.cs:9-31` | **Yes.** A member's type name is derived from the CLR type, persisted in the catalog entry and compared inside the canonical shape. Numeric addressing needs no new declaration, no hash movement and no migration — the load-bearing claim of this whole widening | — | +| `CultCache.cs:112-150` | — | **No.** `Members` and `IndexAccessors` are `internal` with no friend assembly, so the evaluator cannot read a declared value from outside `GameCult.Caching` at all. "No cache change is needed for addressing" was false; the cache add is ~150 lines, not ~60, and the ledger moved from ≈ +370 to ≈ +585 | +| `CultCache.cs:931-943`, `:462-468` | — | **No.** A hiding member is already refused (`HiddenMemberMessage`), and a duplicate alias already throws from `ToDictionary`. D10 shrank from "a missing refusal" to "a refusal that names nothing", and its test only means anything if it asserts the message | +| `packages/cultnet-rs/src/snapshot_query.rs` | — | **No.** Rust has a fifth selector engine (`serve_read_only_raw_snapshot:112-125`) that "Rust: none" concealed, and its client (`:195-217`) shows the cross-product limit that v1 does not fix (Q-M) | +| `CultDocumentContracts.cs:92-99`, `CultCache.cs:1100-1113`, `:1495-1509`, `:1818-1838`, `:254-265` | **Yes.** `ICultRecordRef` is the enumerable handle D11 needs; assignability is already how the cache resolves a base type to concrete documents (D9); `AllDescriptors` is public | — | + +**Still not settled, and who settles it:** + +- Whether every committed write takes a shard-log sequence (unchanged; + Hands, at the append site). +- Whether `CultDocumentDescriptor`'s public member view can be a readonly + struct without forcing an allocation per row per predicate in the + evaluator's inner loop. Nothing here depends on the answer being fast, + but a `Select`-per-row over a fresh list would be a silly cost to build + in; Hands measures if a fixture of a few thousand rows is slow, and not + before. +- The exact split of mutation entries against the QUIC campaign's runner + (unchanged; Self at landing). +- Whether `serve_read_only_raw_snapshot`'s existing tests survive the + lowering unchanged; they should, since the behaviour is identical, but + they were not read line by line. +- Q-J, Q-K, Q-L, Q-M: the operator. + +**Not probed, and deliberately:** nothing was built or run against CultLib. +The tree is hosting a live QUIC campaign, and no claim in this map needs a +build to be true — every one of them is a source read, and the three that +were wrong were wrong because the first pass did not read far enough, not +because a build would have caught them. + +--- + +# Cut 2: watching a selection + +Ruled 2026-09-17 (R-5): the operator wants this and wants it soon, so it is +mapped here rather than left as a follow-up trigger. It is **its own cut**, +landing after Cut 1 and depending on it. Nothing below is smuggled into Cut +1, and Cut 1 is not shaped around it: the seam Cut 1 draws — one selector +type serving a query and a subscription alike — is the whole of what Cut 1 +owes this one. Cut 1 can go to Hands without waiting for a ruling on +anything here. + +Same discipline as Cut 1: facts by source read, deletes first, an authority +map, verification with a mutation per rule including a loosening, and a +subtraction estimate with real numbers. + +## 18.1 Body facts + +**The local watch surface today** (`src/GameCult.Networking/CultNetDatabase.cs`): + +- `Watch()` `:1051-1057` filters the change stream by CLR type; + `WatchAllChanges()` `:1063-1067`; `WatchRecord(key)` `:1072-1075`; + `WatchGlobal()` `:1080-1083`; `WatchByName(name)` `:1088-1094`; + `WatchByIndex(alias, value)` `:1100-1107`. +- **`WatchByName` and `WatchByIndex` do not do what they are named.** Both + read the cache's *current single winner* for the lookup and compare it to + the change's document by `ReferenceEquals`. Combined with section 1's + finding that the cache's index maps hold **one key per value**, this + means `WatchByIndex("kind", "cannon")` observes changes to + whichever single `Weapon` most recently claimed `cannon`, not to the + weapons whose kind is `cannon`. It also re-runs the lookup *at change + time*, so a change that clears the value is evaluated against the state + after the clear. The same two lines exist again in CultMesh as + `MatchesName` / `MatchesIndex` (`CultMesh.cs:3312-3333`). +- The rule is set-dependent even without a hop, and nothing tracks + membership: there is no "was in the set, now is not" anywhere in the + local path. `Reconcile` (`CultNetDatabaseSubscriptionServer.cs:251-292`) + is the only membership tracker in the reference and it belongs to a + server, over a delivered set, per peer. + +**The CultMesh collection surface** (`src/GameCult.Mesh/CultMesh.cs`): nine +`Collection*` overloads at `:2278-2480` — three shapes (all / by name / by +index) by three sources (`CultCache` `:2278`, `:2302`, `:2331`; +`CultNetDatabase` `:2362`, `:2386`, `:2413`; `CultMeshNode` `:2442`, +`:2456`, `:2471`, which delegate to the database trio in three lines each). +`CollectionByIndex` over a cache resolves its contents as +`Optional(cache.GetByIndex(alias, value))` — a "collection" of +**at most one row**, whose live feed then filters by `MatchesIndex`. Three +shapes exist because the shape *is* the query language; a selection +replaces the shape axis entirely and leaves the source axis alone. + +**What Cut 1 leaves in place for this cut:** `CultNetSelection` and its +validation, `CultNetSelectionEvaluator.Matches(selection, descriptor, key, +document)` for a single row, the cache's public read surface, and D6's rule +that a hop-bearing selection is set-dependent and must reconcile rather +than decide per change. + +## 18.2 The shape + +``` +CultNetDatabase.Watch(CultNetSelection selection) + -> Observable + +CultNetSelectionChange { + kind: Entered | Left | Updated // membership, not storage + schemaId, recordKey + document: object? // present on Entered/Updated under `document` projection + previous: object? // present on Left/Updated + cause: Self | Edge // this row changed, or a row it cites / is cited by did +} +``` + +**Rules, each one owner:** + +- **Membership, not mutation.** The stream reports a row entering the + selection, leaving it, or changing while inside it. A write to a row that + was outside and stays outside emits nothing. A write that changes a value + the selection filters on emits `Entered` or `Left`, **not** `Updated` — + which is precisely what `WatchByIndex` cannot express today. +- **`cause: Edge`** is how a hop-bearing selection stays honest: when a + change to row B moves row A in or out, the subscriber is told about A, + with the cause marked, and never about B unless B is itself in the set. +- **No order, no cursor, no `asOf`, no `limit`.** A live feed is not a + page. A selection carrying `limit`, `cursor` or `descending` is **refused + at the door** (`selection_invalid { field }`) rather than silently + ignored: "the latest ten, live" is a different question with a different + answer (it needs an eviction rule), and this cut does not answer it. + `projection` is honoured; `schemas`, `keys`, `fields`, `cites` and + `cited` are honoured. +- **The initial set is not a snapshot message.** `Watch` is local and + in-process; it emits `Entered` for every row already matching, at + subscribe time, under the cache's lock, before any live change. There is + no `asOf` because there is no wire and no second reader. +- **A hop-bearing selection recomputes; a plain one decides per row.** + Without `cites`/`cited`, membership is `Matches(selection, row)` and + costs one row's read. With a hop, a change anywhere can move anything, so + the watch re-evaluates the selection over the cache and diffs against the + membership set it holds. That is O(rows) per change and it is stated + plainly rather than hidden (Q-N). + +## 18.3 Deletes first + +| Path:lines | Lines | What | +|---|---:|---| +| `CultNetDatabase.cs:1080-1107` | 28 | `WatchGlobal`, `WatchByName`, `WatchByIndex` — the three that encode a query in a method name, two of them wrongly. `WatchGlobal` lowers to `keys: ["global:{schemaId}"]`, the other two to a `fields` predicate | +| `CultMesh.cs:3312-3333` | 22 | `MatchesName`, `MatchesIndex` — the same `ReferenceEquals`-against-the-winner rule, second copy | +| `CultMesh.cs:2278-2480` | 203 | the nine `Collection*` overloads; **after: three**, one per source (`CultCache`, `CultNetDatabase`, `CultMeshNode`), each taking a `CultNetSelection`, about 75 lines | +| `CultMeshSnapshots.cs` and `CultMesh.cs` local-watch predicates, audit sites #2, #4-9, #16-21 | ~240 | the remaining local watch loops and their inline predicates, about 40 after | +| **Total** | **~493** | **~115 after; net about −378** | + +`Watch()`, `WatchAllChanges()` and `WatchRecord(key)` **stay**, as +Cut 1's v0 lowering stays: a CLR-type filter and a single-key watch are +conveniences that lower to a selection and have no rule of their own. If +they grow a rule again, W6 catches it. + +## 18.4 Adds and authority + +| Add | Owner | Live consumer | Protected invariant | Replaces | +|---|---|---|---|---| +| `CultNetSelectionWatch` in `GameCult.Networking` (~130 lines): the membership set, the per-change decision, the hop recompute, `CultNetSelectionChange` | `CultNetDatabase` | Mesh's three `Collection` overloads; any local consumer that watches a question | membership is tracked in one place, and a row that leaves the set is reported leaving | `WatchByName` / `WatchByIndex` / `MatchesName` / `MatchesIndex`, four spellings of one wrong rule | +| `CultNetDatabase.Watch(CultNetSelection)` (~15 lines) | `CultNetDatabase` | the above | one entry point | three named-query methods | +| Rust: **nothing in this cut** | — | — | — | no Rust caller watches locally; when one does, it gets the same shape over `Row`/`RowSet` | + +- **Owner.** `CultNetSelectionWatch` owns membership and only membership. + `CultNetSelectionEvaluator.Matches` owns whether a row is in the set — + the watch never re-implements a predicate. `CultNetDatabase` owns the + change stream. The cache owns values, as in Cut 1. +- **Inputs.** The change stream, the cache's rows through the public read + surface, the validated selection. Not inputs: a clock, a transport, the + shard log's sequences (there is no order here), a peer's authorization. +- **Outputs.** `Entered` / `Left` / `Updated` with a cause, and one typed + refusal for a selection carrying page-shaped fields. +- **Derived state.** The membership set, and the incoming-edge index when + the selection hops. **Demotions:** `Watch` and `WatchRecord` are no + longer queries, they are lowerings; Mesh's collection *shape* is no + longer a language, it is a `Selection`; `MatchesIndex` is not an owner of + anything. +- **Forbidden writers.** Nothing outside `CultNetSelectionWatch` may decide + membership; no watch path may call `GetByIndex` or `GetByName` to decide + whether a change is interesting (that is the bug being deleted, in both + its copies); Mesh may not filter a feed the watch answered; the watch may + not emit `Updated` for a row that crossed the predicate boundary; the + watch may not accept `limit`, `cursor` or `descending`. +- **Shared paths.** `Matches` under both the query and the watch — a row + that a page would return and a row the watch reports entering are decided + by the same function, or the two truths drift. The subscription server's + `Reconcile` keeps its own per-peer delivered set (it answers a different + question: what this peer has been told) and **does not** become the local + membership tracker. +- **Deletion line.** Commit 1: `CultNetSelectionWatch` and + `Watch(Selection)`, with the three named-query methods deleted and their + tests rewritten. Commit 2: Mesh's nine overloads collapsed to three, both + matchers deleted. Nothing lands with `WatchByIndex` alive beside it. + +## 18.5 Verification + +| # | Test | Pins | Revert kills | Loosening kills | +|---|---|---|---|---| +| W1 | `Watch_ReportsARowLeavingWhenItsFilteredValueChanges` | membership, not mutation — the bug being deleted | `Left` never emitted (today's behaviour restored: the change is simply not delivered) | `Updated` emitted instead of `Left`, so a subscriber holding a list keeps a row that no longer matches | +| W2 | `Watch_ReportsEveryRowSharingAnIndexValue_NotTheCacheIndexWinner` | the deletion of the `ReferenceEquals`-against-the-winner rule | `MatchesIndex` restored | membership decided by the winner *plus* the changed row, which passes a two-row fixture and fails a three-row one — **the fixture must carry three rows sharing the value** | +| W3 | `Watch_EmitsTheInitialSetBeforeAnyLiveChange` | the subscribe-time set | no initial emission | the initial set emitted *after* the subscription goes live, so a write racing the subscribe is delivered twice or not at all — needs a test that writes between subscribe and first emission | +| W4 | `Watch_ReportsAnEdgeCausedEntryWhenTheCiterChanges` | `cause: Edge`, D6 locally | a hop-bearing watch decided per changed row (the citee never moves) | the citee reported with `cause: Self`, which loses the subscriber's ability to tell a row's own change from a set change | +| W5 | `Watch_RefusesAPageShapedSelection` | no order, cursor or limit on a feed | the refusal dropped and the fields ignored | `limit` refused but `descending` ignored — one field's worth of silent ignoring, which is how a "harmless" ignored field becomes a bug report | +| W6 | `Watch_AndSelect_AgreeOnMembershipForTheSameSelection` (property-shaped: for each fixture selection, the set the watch holds equals the ids a page returns) | the shared `Matches` | the watch given its own predicate | the watch's copy agreeing on the plain selections and differing on the hop-bearing ones — kills only if the fixture's selections include hops, which section 6's fixture does | +| W7 | `Mesh_CollectionTakesASelectionAndFiltersNothingItself` (Mesh tests) | the collapse | an overload restored | the three surviving overloads re-filtering the feed after the watch answered | + +**Negative greps:** `rg -n "WatchByIndex|WatchByName|MatchesIndex|MatchesName" src` +empty; `rg -n "GetByIndex|GetByName" src/GameCult.Mesh src/GameCult.Networking` +empty; `rg -n "CollectionByIndex|CollectionByName" src` empty. + +**Mutations.** Entries in this campaign's own file, target `networking` +(killer `dotnet test tests/GameCult.Networking.Tests`) plus the Mesh tests +for W7, one per rule above with its revert and its loosening. + +## 18.6 Subtraction estimate + +| | Removed | Added | +|---|---:|---:| +| `src/GameCult.Networking` | 28 | ~145 | +| `src/GameCult.Mesh` | ~465 | ~115 | +| tests | ~80 rewritten | ~260 (W1-W7) | +| **net source outside tests** | | **about −233** | + +This is the cut where CultMesh actually shrinks: about −350 in +`CultMesh.cs` and the snapshot facade against about +117 in the database +organ. It is also the cut that deletes a wrong answer rather than a +duplicate one — four spellings of "watch the row that currently wins a +unique-index lookup", replaced by one membership tracker over the selection +the caller actually asked about. Cut 1 pays about +585 for the vocabulary; +Cut 2 spends it. + +## 18.7 Operator questions for this cut + +- **Q-N. The hop-bearing watch's recompute.** **A, recompute and diff on + every change** (recommended: obviously correct, O(rows) per change, and + the local caches this runs over hold thousands of rows, not millions). + **B**, maintain an incremental incoming-edge index invalidated per write + — faster, and a second piece of derived state that can disagree with the + cache. Take B only with a measured reason. +- **Q-O. Does `WatchRecord` survive?** **A, yes, as a lowering** + (recommended; it is one key and no rule). **B**, delete it too and make + every caller say `keys: [k]` — cleaner, noisier at its call sites. +- **Q-P. Ordering on a feed, later.** Out of this cut by the rules above. + If "the latest N, live" is wanted, it is a third cut with an eviction + rule, not a field added here. + +**R-AA landed, 2026-09-22** (Sonnet), `b7d77b7..99e366a` on +`cultnet/selection-cut1`. One new test file, 27 tests, 707 lines. **No +production code touched.** Score **66% → 77.62%**: killed 345→371, survived +85→57, no-coverage 75→50, over the same 428-mutant set both passes. Suite +green on Yggdrasil, 271 passed / 2 skipped. + +Every one of the nine named survivor groups is killed, with two corrections to +the triage that matter more than the score. + +- **`EdgesFor`: three of five killed. STRUCK 2026-09-23 — what stood here was + wrong.** It claimed that within one hop direction `(From, Role)` determines + a unique declared edge value, so no legal selection could make two edges + share anchor, From and Role while `To` differs, and recorded `To.SchemaId` + and `To.Key` as equivalent "so nobody pays for them a third time". **A + selection carrying both hops mixes their edges into one bucket**, and Soul + built the counterexample: a row self-referencing through the role it uses to + cite a peer. `To.Key` is now killed in both runtimes; `To.SchemaId` is + settled under R-BA. The text is struck rather than edited because it was + read as a live instruction for two passes. +- **A sixth mutant in the same method that nobody had named**: + `OrderBy(pageRowIndex)`, which is R-B's *primary* key, ahead of + `(from, role, to)`. It survived the first pass and is now killed by a test + that forces page order and `(from, role, to)` order to disagree. The rule + R-B exists to protect had its first component unguarded, and the triage had + not caught that either. +- **The digest needed a golden value, not a comparison.** Beyond the named + branch mutants, about nineteen finer-grained ones survived — deleting + individual `AppendString` calls. A same-versus-different digest test + structurally cannot catch these: a mutant that swaps which case gets which + flag still produces two *different* digests, merely mislabelled. Hands + reconstructed a golden HMAC independently from the method's doc comments + rather than from its private helpers, which is the right way to build one, + and it killed all but three residual coincidences. + +**Line drift: every rule had moved 30–90 lines** from Soul's `52082ec` +numbers, none to a different method. Locate by name, not by number, and do not +trust the numbers in this section either. + +**Four things found along the way, flagged rather than silently fixed.** Two +are test gaps; two look like real defects: + +- `ReadLengthPrefixedFields`, `length <= 0`: a legitimately zero-length field + would be wrongly refused. +- `ReferenceMembers`'s `!member.IsReference` guard: a data member could be + treated as citeable. +- `FindCursorPosition`'s loop bound: an out-of-bounds read when paging past + the last row with a cursor exactly at the end. +- `ComputeDigest`'s `else`-branch appends survive only because the golden + test has both `Cites` and `Cited` non-null; a second golden with both absent + closes them. + +**Self's rulings, 2026-09-22:** + +- **R-AC. STRUCK 2026-09-23. It said the two `EdgesFor` `To` mutants were + equivalent and "recorded, not to be chased".** That instruction was false + and was obeyed for two passes. Soul's counterexample kills `To.Key` in both + runtimes; `To.SchemaId` is settled under R-BA. **The sentence it closed with + — a survivor correctly identified beats a test written to move a number — + is still true, and is exactly why a survivor must be identified by a + construction attempt rather than by an argument.** +- **R-AD. The three suspected defects above get behaviour tests first**, since + a test that fails today is the only thing that proves they are defects + rather than readings. The out-of-bounds read in `FindCursorPosition` is the + one to check first: it is reachable from an attacker-supplied cursor. +- **R-AE. A second golden digest with both hops absent**, closing the three + residual mutants rather than leaving them as folklore. + +**Fix batch 4, Rust half, landed** (Sonnet), `cultnet/selection-cut1` now at +`d7f73af`, rebased onto the C# side's `99e366a`. Six commits: `c91e937` +(R-V and Rust's half of R-W), `97627dd` (R-Y), `4bfd989` and `94c32ac` +(R-AB), `8005586` (S-12, prose), `d7f73af` (a vendored-schema resync). + +**217 Rust tests green** on Yggdrasil, and re-confirmed locally with +`contracts/` entirely hidden, which simulates cargo-mutants' isolated copy. +**Mutants scoped to the diff: 23 tested, 23 caught, 0 missed.** Nothing to +triage. + +**S-2 is C#-only** — Rust already checked the declared target before filtering +by key, so the divergence was one-sided and the C# commits close it. No Rust +change was needed and none was made. S-1 and S-3 are closed by R-V and R-W. + +**R-AB worked, and it took two fixes rather than one.** The named escape was +`schema_discovery.rs`'s `include_str!("../../../contracts/…")`. Vendoring +byte-identical copies under `packages/cultnet-rs/contracts/` fixed that and +left the crate still unmutable: `tests/selection.rs`'s fixture loader read the +same canonical tree three levels up, and 37 of 45 tests panicked under the +isolated copy. The first full-crate run failed its unmutated baseline for +exactly that reason. Vendoring the fixture too, plus a skip-when-absent guard +on the test that reads C#'s own `cs-written.json` output — which cannot be +vendored, being the other runtime's product rather than a checked-in input — +made the crate mutable for the first time. + +**The vendoring is duplicate authority, and it drifted within hours.** The +rebase onto the C# side's landed R-X changed `cultnet.error.schema.json`, and +the vendored copy did not see it. **Hands' own drift test caught it** and the +copy was re-synced at `d7f73af`. + +That is worth stating plainly rather than filing as a win. Twenty-two schemas +now exist twice, and the guard against the copies diverging is a test rather +than a structure. The cleaner shape — a build script staging the canonical +contracts into `OUT_DIR` — **fails for the same reason the `include_str!` +did**: cargo-mutants copies the package tree, so a `build.rs` reaching three +levels up is just as unreachable. Publishing the contracts as their own crate +would fix it properly and is out of this cut's scope. **So the duplicate is +accepted for now, on the record, with the drift test as its named guard.** It +goes in the follow-ups, not the win column. + +**Hands burned an unscoped full-crate mutants run** — 2,329 mutants and a +timeout cascade across files the cut never touched — before rescoping to the +diff. It reported that unprompted and discarded the output. The ruling did say +"the cut's diff"; the run cost most of a night on a shared host. + +## Soul, the merge gate, 2026-09-23 + +Opus, against `d7f73af`. Counts re-run by Soul itself: Networking 269 passed / +2 skipped, Mesh 255, cultnet-rs **224** across 12 targets. (R-AA reported +"271 passed" — that is 269 + 2 skipped. The Rust half reported 217; the +measured figure is 224. Both green, one overstated.) + +**Verdict: Cut 1 may not merge.** Three reasons, any one sufficient. + +### SM-1, high. S-1 is not closed. One ruling became two different rules. + +`CultNetSelectionEvaluator.cs:358-386` resolves a reference's target by +**record key plus the declared leaf set** — its own comment says "a +reference's stored target is a bare record key, the wire carries no schema for +it". `packages/cultnet-rs/src/selection.rs:1765` and `:1817` resolve it by an +exact `by_key.get(&(target.schema_id, target.record_key))` on the +`RecordRef`'s own schema id. R-V said both runtimes index rows **and incoming +edges** by the pair. C# indexes rows by the pair and edges by the key; Rust +indexes both by the pair. + +Probed at the evaluator in both runtimes, same logical rows: + +| Shape | C# | Rust | +|---|---|---| +| Only row at key `k` is out-of-target; narrow ref declared to leaf_a points at `k` | **REFUSED** `reference_outside_target` | **ACCEPTED**, empty page | +| Two rows at key `k`; ref declared to leaf_a, stored target names leaf_b | **ACCEPTED**, resolves the leaf_a row, emits an edge | **REFUSED** `reference_outside_target` | + +**They give opposite answers on the exact shared-key shape R-V was written +for.** A consumer paging the same data through the two runtimes gets a +refusal from one and rows from the other. Parity is this cut's invariant. + +**No vector covers it:** the shared fixture has zero duplicate record keys +across its ten rows, exactly one reference, and that reference's role targets +both leaves — so `reference_outside_target` is never reached cross-runtime at +all. R-V's narrower promise does hold: within each runtime, both row orders +agree. + +### SM-2, high. Both runtimes take a hostile cursor into an unhandled fault, on mirror-image cases. + +- **C#.** `ReadLengthPrefixedFields` (`CultNetSelectionEvaluator.cs:750-751`) + tests `pos + length > bytes.Length` in `int`. A prefix of `2147483647` + overflows, the guard passes, and `Encoding.UTF8.GetString` throws + `ArgumentOutOfRangeException`. `HandleSnapshotRequestV1Async` catches only + the three typed selection exceptions and `CultNetRudpSchemaServer.DispatchAsync` + has no catch at all, so **an untyped exception reaches the server's poll + loop**. The peer gets no answer. +- **Rust.** `read_length_prefixed_fields` (`selection.rs:2044-2046`) parses the + prefix as `usize` and computes `pos + len`; `18446744073709551615` + overflows. Probed: **panic.** + +Rust refuses the `int::MAX` case typed; C# refuses the `usize::MAX` case +typed. **Each runtime has exactly the hole the other closed** — which is what +happens when a rule is hardened twice independently and neither run fed it +garbage. R-N's whole point was that every cursor refusal reaches the wire as +`cursor_invalid`. + +### SM-3, high. R-Z did not land, and nobody said so — including me. + +R-Z required the vectors to compare **page bytes**, plus `asOf`, `next` and a +refusal's **code**, with projection vectors on both sides. +`git diff --stat 52082ec..d7f73af` touches neither +`SelectionParityVectorTests.cs` nor either vector file's vectors. The reader +still compares row ids, `matched`, `hasNext` and edge fields, and +`expectedRefusalField` — **never the code**. There is no page-bytes field in +either JSON. `rs-written.json` still carries no projection vector, which is +S-7's original wording verbatim. The C#-side projection vectors run through +`Select`, which ignores `Projection`, so the comment claiming "page bytes +under each projection" describes something the test does not do. + +**R-Z is absent from the batch's work and from its open list.** Self recorded +the batch as closing its rulings without checking that one, which is the +tracking failure that let it pass silently. + +### SM-4, medium. Two ordering rules are pinned by their mutants, not their behaviour. + +Twelve non-revert mutations, each changing a rule a different way from the +Stryker mutant its R-AA test was written against. Nine died. Three survived: + +- **`EdgesFor`'s secondary key.** Permuting `Role` ahead of `From.Key` + (`:307-311`), keeping every component, passes 269/269. R-AA's test kills the + *primary* key's deletion; the **composition** of the rest is unpinned, and + the fixture's single reference pins nothing either. +- **The row tiebreak.** Swapping `SchemaId` and `Key.Value` in the ascending + tiebreak (`:214`) passes 269/269. The fixture does have one tied ordinal, + but both rows are leaf_a, so **the schemaId component of + `(ordinal, schemaId, recordKey)` is exercised by nothing** — not in unit + tests, not in vectors. Rust's `order_rows` uses the same three components, + so a silent permutation on either side goes unnoticed. +- **`!member.IsReference`** (`:456`) is a redundant second copy of the guard + in `CultCache.ResolveReferences`/`ReferencesOf`, which already returns empty + for a data member. **Equivalent mutant, and duplicate authority** — not a + defect, but not innocent either. + +### SM-5, medium. The Rust half of the vocabulary has 59 live mutants and nobody has looked. + +The diff-scoped run ("23 tested, 23 caught, 0 missed") measures only the lines +batch 4 changed. Soul ran cargo-mutants over the whole of `selection.rs`: +**351 mutants, 274 caught, 59 missed, 14 unviable, 4 timeouts, 36 minutes.** + +- **`canonical_number`: about 35 missed plus all four timeouts.** `is_canonical` + — the Q-J door — has **every branch mutation surviving**. `decompose`, + `pad_right`, `canonicalize_decimal_digits`, `big_mul_small` and + `big_to_most_significant_first` can each be replaced with `String::new()` or + `"xyzzy"` and the suite stays green. **This is R-D, a byte-for-byte wire + parity rule.** +- `validate`: 4 missed, including a deleted `!` and `||` → `&&` — the door R-F + put inside `select`. +- `matches_schema_keys_fields`: 3 missed, including two deleted `!` and an + `==` → `!=` — which rows match. +- `schema_alias::matches`: `==` → `!=` — R-E's one identity rule. + +**S-5 blocked this cut at 66% on the C# side and produced R-AA. The Rust side +of the same rules has never been measured. The asymmetry is the finding.** + +### Settled, not defects + +- **`FindCursorPosition`'s loop bound is not a defect.** It bounds at + `i < ordered.Count`. Probed in both runtimes: paging to the exact end and + replaying the last cursor gives an empty page, `next = null`, no exception, + no panic. The Stryker survivor was a coverage gap. **R-AD's headline + suspicion was wrong**, and settling it was worth the pass. +- **`length <= 0` does not exist** in either runtime, and a zero-length field + parses fine in both. The real bug in that function is SM-2's overflow. +- **S-2 held, and Hands' "C#-only" claim is true** — Soul checked rather than + accepted it. Both Rust call sites run `ensure_within_declared_target` before + any role or key filtering, with a test pinning it. +- **S-3 held.** A both-hops selection returns all its `cites` edges in both + runtimes, each anchored by its own hop, identically. +- **S-12 is half done.** The fixture's prose was fixed; + `SelectionParityVectorTests.cs:200-208` still calls the name-alias case a + "Confirmed cross-runtime defect" that the alias port already fixed. Low, but + it is a falsehood in a file a future reader will trust. + +### Promises that held + +S-4 (real `CultNetErrorMessage` bytes validated against the schema for all +four codes), S-6 (a spliced digest and a reused cursor under a changed +selection both refused), S-9, S-10, S-11 (the hop refusal is gone and the hop +is served; still no dedicated regression test). **R-AB's guard is real**: all +23 vendored files are byte-identical right now, the hand list matches every +`include_str!` 22/22, and flipping one byte makes the drift test fail by name. +**R-AA's tests are mostly behavioural**: nine of twelve hand mutations died, +including the digest under a double-append rather than a deletion, the +comparator forced back to UTF-16 units, both role-naming sites under inverted +precedence, and cursor positioning made inclusive. + +**Caching's three failures remain unproven, not passing** — the stopgap's +container runs as root and the tests need a write to a read-only directory to +fail. Soul declined to call them environmental on its own authority. + +### What Soul could not run + +- **No page-byte parity comparison exists to run.** C#'s page is a + `CultNetSnapshotResponseRawV1Message` envelope; Rust's is a bare + `SelectionPage`. **There is no common wire type**, so R-Z as written needs a + shape decision before it can be implemented at all. +- No fresh Stryker run on the C# side; twelve hand mutations instead, which is + what the brief asked for. The Rust figure is Soul's own measurement. +- Only `selection.rs` was mutated in Rust; `contracts.rs`, `schema_discovery.rs` + and the rest of the crate are unmeasured. + +### The rig, handed over + +`C:\Users\Meta\eureka-soul-probes\cultnet-selection-cut1\` — deliberately +outside the repo and outside the session scratchpad, **so it does not +evaporate the way the Idunn rig did**. `README.md` says where each file drops +in and what it proves: `SoulProbeTests.cs`, `soul_probe.rs`, +`soul-mutants.sh` and twelve precomputed mutated files (the dotnet image has +neither python3 nor perl to patch with). + +## Self's rulings for fix batch 5, 2026-09-23 + +- **R-AF (SM-1). One rule, and the wire decides which.** Hands establishes + empirically what a stored reference actually carries — a bare record key, or + a key and a schema id. **If the wire carries no schema, C#'s rule is right + and Rust adopts it. If it carries both, Rust's is right and C# adopts it.** + I am not choosing by taste between two implementations when the Body already + knows the answer; what I am ruling is that the answer is one rule, derived + from the wire, in both runtimes. **A parity vector must cover the shared-key + shape in both directions** — its absence is why this survived four passes. +- **R-AG (SM-2). Every malformed cursor becomes `cursor_invalid` on the + wire, in both runtimes, and nothing else escapes.** Use checked arithmetic + on both sides. C#'s dispatch path gains a catch so an untyped exception + cannot reach the poll loop. **Feed each runtime the other's proven + overflow**, plus a small set of deliberately hostile cursors, and pin them. + The shape of this bug — each runtime holding exactly the hole the other + closed — means neither side's tests are evidence about the other. +- **R-AH (SM-3). R-Z needs its shape settled before it can be built.** The + envelope types differ, so **the vectors compare the canonical MessagePack + bytes of the page payload** — rows, edges, `asOf`, `next` — which both + runtimes can produce, rather than the transport envelope, which only one + has. Refusals compare the **code**. Projection vectors exist on both sides, + and `Select` must actually honour `Projection` or the vector is a lie. + **Flag for operator review**: this is my ruling on a wire-shape question, + and if the payload's canonical form is meant to be something else, it should + be corrected before the vectors harden around it. +- **R-AI (SM-5). Measure the Rust vocabulary and triage it.** Run + cargo-mutants across `selection.rs` and the rest of the crate's selection + path, and close survivors by behaviour. **`canonical_number` first**: R-D is + a byte-for-byte parity rule whose door currently survives every branch + mutation, which means the canonical decimal form is pinned by nothing in + Rust. Equivalents get a one-line reason. +- **R-AJ (SM-4). Pin the ordering compositions, in both runtimes and in the + vectors**: `EdgesFor`'s secondary key ordering, and the schemaId component + of the row tiebreak, which needs a fixture with a tied ordinal across two + schemas — the current fixture's tie is within one leaf. +- **R-AK. Delete the evaluator's redundant `!member.IsReference` guard.** + `CultCache` owns that decision and already enforces it. Duplicate authority + is the defect even when the duplicate is harmless today. +- **S-12's remainder:** correct the comment that still calls a fixed defect + confirmed. + +### Fix batch 5 landed, 2026-09-23 + +Sonnet, five commits on `sel-fix5`. C# Networking **274 passed / 2 skipped** +(was 269/2), Mesh 255, Rust 50/50 with `cargo-mutants --in-diff` reporting 26 +tested, 21 caught, 5 unviable, **0 missed**. + +**R-AF: the wire carries no schema, so C#'s rule was the right one.** +Established by probe, not by reading either comment: a real `Design` reference +field serialized through `MessagePackSerializer` dumps as `A4-61-2D-65-71` — a +bare five-byte msgpack string, `"a-eq"`. The whole document is +`["citer-1","a-eq"]`. No schema id anywhere. `CultRecordRefFormatter.Serialize` +confirms it: `writer.Write(value.Key.Value)`, unconditionally, for every +`CultRecordRef` in the codebase. + +**Rust adopted C#'s rule.** `Row::references()` returns a bare +`target_record_key`; `by_key` is grouped by record key alone; a new +`resolve_reference_target` mirrors `TryResolveReferenceTarget` exactly — +search every row sharing the key, return the first inside the declared leaf +set, refuse deterministically by schema id if none is. `RecordRef` survives +only where the wire genuinely carries both, which is the `Citation.target` +query filter. + +**The vector that was missing now exists.** The fixture gained a +`citer_narrow` schema with a real SHA-256 id and rows for **both** shapes from +Soul's table: a lone out-of-target row, which refuses, and a shared key with +one in-target and one out-of-target row, which accepts and resolves the +in-target one **regardless of row order**. Plus a new `expectedEvaluationRefusal` +vector field — narrower than R-AH's job, just which typed refusal fires. + +**A second real defect, found while landing R-AF.** Rust's `matches_citation` +resolved and target-checked **every** declared reference on a row before +filtering by the citation's requested role; C# filters by role first. Rust's +role filter moved ahead of resolution to match. One existing Rust test was +therefore pinning behaviour C# does not have, and was rewritten to mirror C#'s +real shape. **This was a live divergence nobody had named** — neither Soul nor +any ruling. + +**R-AG.** C#'s `pos + length` overflowed in unchecked `int`; fixed by +promoting to `long`. Rust's `pos + len` overflowed in `usize`; fixed with +`checked_add`. `CultNetRudpSchemaServer.DispatchAsync` gained a backstop catch +so no untyped exception reaches the poll loop. **Each runtime was fed the +other's proven overflow**, plus three further hostile shapes, four new tests a +side, each confirmed to fail without the fix. + +**R-AJ, and the finding inside it: the existing row-tiebreak test was +degenerate.** Hands hand-reverted the tiebreak and swapped it, and the test +**still passed 100%** — purely by accident of which of `SelLeafA`/`SelLeafB`'s +real hash ids happened to sort first. It was rewritten to assign keys relative +to the schema ids discovered at runtime, then re-probed and now fails +correctly. The same shape was added in Rust, with a shared-fixture vector +carrying a tied ordinal **across two schemas** — the original fixture only +ever tied rows of the same schema. `EdgesFor`'s secondary key got the same +treatment. + +**R-AK.** Verified before deleting: `CultCache.ReferencesOf` already searches +only its own reference members for a role match, and index aliases are unique +per descriptor, so a data member's role string cannot collide with a reference +member's. The redundant guard is gone. + +**S-12** is closed; the stale "confirmed cross-runtime defect" comment is +corrected against source. + +**Not done, and named rather than buried:** + +- **No diff-scoped Stryker run.** `--since` crashed on `GitInfoProvider` in + the detached-clone container, so Hands fell back to whole-file globs: 312 + tested, 262 killed, **47 survived**, 3 timeouts, untriaged between the + changed lines and the large pre-existing bulk of both files. Every rule + Hands touched was separately confirmed by hand. **The tooling failure was + worked around, not root-caused**, which means the next pass inherits it. +- **The RUDP dispatch backstop has no dedicated integration test.** It would + need a fuller server harness. Flagged, not built. + +### R-AI landed, 2026-09-23 — `canonical_number` measured and closed + +Sonnet, four commits rebased cleanly onto `sel-fix5`, pushed as +`sel-fix5-rsmut` at `fc51e9a`; 50/50 Rust tests pass against the rebased tree. +**None of it touches the edge-resolution path** — the whole diff is insertions +inside `canonical_number`'s own nested `mod tests`, with zero hits for +`references`, `by_key`, `matches_citation`, `resolve_reference_target` or +`RecordRef`, so nothing was measured against code batch 5 has since rewritten. + +**126 mutants: 89 caught / 29 missed / 7 timeout / 1 unviable → 114 caught / +4 missed / 6 timeout / 2 unviable.** + +`is_canonical` — the Q-J door, where **every branch mutation had been +surviving** — is closed by direct grammar tests that had never been called +before; the function was only ever reachable indirectly through a handful of +`validate_field` spellings. `compare`, `decompose`, `pad_right`, +`canonicalize_decimal_digits`, `big_mul_small`, `big_to_most_significant_first`, +`big_from_u64` and `exact_decimal_from_mantissa` each got direct tests, every +one confirmed red under its own mutation by a real re-run rather than by +inference. + +**Another test that passed by luck.** `render_f32`'s sign-bit mutant survived +Hands' first negative-value tests because **1.0 and 2.0 happen to have bit 0 +matching their real sign bit**. Adding `-1.0` and `-2.0` killed it. Same shape +as the degenerate row-tiebreak test in batch 5: a fixture whose values +coincidentally satisfy the assertion. + +**Four survivors, all judged equivalent by hand-tracing rather than assumed:** +two in `is_canonical` (a leading-zero guard that is a pure early exit, since +anything it would catch is caught later by the dot check; and an increment +skipping a digit the caller already validated, which the following loop +re-consumes either way), and `|` → `^` in both `render_f64` and `render_f32`, +where the fraction is masked to exactly 52 or 23 bits so the implicit leading +bit is never set and the two operators are bit-identical. + +**Six timeouts are inherent infinite loops under mutation, not test gaps** — a +`+=` → `*=` on a loop's own increment, two on `big_from_u64`'s loop bound, and +two exponent-sign corruptions that wrap a negative `i32` into a near-`usize::MAX` +bound. Any test reaching those lines hangs regardless of what it asserts; the +timeout is cargo-mutants' signal for "behaviour changed", it simply cannot +classify a hang as caught. + +### **`-j4` is not reliable for verdicts on this image, and that is retroactive** + +The identical commit gave **different missed and timeout sets across three +separate `-j4` runs** — `render_f64`'s L284 alone flipped between missed and +caught with no code change — while every `-j1` run reproduced the same 4 +missed / 6 timeout. The likely cause is the shared `CARGO_TARGET_DIR` under +concurrent mutant builds, which is the same class as this pipeline's existing +shared-target scar. + +**This makes every concurrent mutation figure in this campaign provisional**, +including Stryker runs made with `--concurrency 4` and any cargo-mutants +result above `-j1`. It does not invalidate them — a killed mutant that was +genuinely killed stays killed — but a *survivor* list from a concurrent run +cannot be trusted as complete or as accurate. Where a survivor list drove a +ruling, the ruling stands on the hand-confirmed evidence beside it, not on the +count. + +### Honest scheduling account + +Six real runs launched, **two duplicated and killed** — one caught by Hands, +one Self had to flag. Effective slot time on real measurement runs was about +**47 minutes**, spread across **just over five hours of wall-clock**, most of +it back-and-forth: duplicate cleanup, the `-j4` flakiness detour, and the +rebase. Hands reported this unprompted and in detail, which is the only reason +the `-j4` finding exists at all. + +### Unmeasured, and named + +`contracts.rs` (about 100 mutants) and `schema_discovery.rs` (about 50) were +**not run against `sel-fix5` at all**. One partial run, killed mid-flight, +showed several `MISSED` across `contracts.rs`'s `validate_*` family — +`decode_cultnet_message_from_slice`, `validate_message`, +`validate_mutation_contract`, `validate_schema_descriptor`, +`validate_document_record`, `validate_raw_document_record`, +`validate_shard_descriptor`. **That is real signal on the door family, not a +count.** At `-j1`, 150 mutants is a several-hour commitment. + +**Self's decision: queue it, do not run it now.** The merge gate needs a Soul +pass on batch 5 first, and the selection cut cannot merge on a mutation sweep +of an adjacent file. Recorded as a follow-up with the partial signal attached +so the next pass starts from it rather than rediscovering it. + +## Soul, the merge gate again, 2026-09-23 + +Opus, against `fc51e9a`. Counts re-measured: C# Networking 274 / 2 skipped, +Mesh 255. **Rust is 254 tests across 11 targets**, not the 50 reported — +that figure was `tests/selection.rs` alone, one target of eleven. + +**Verdict: Cut 1 may not merge.** Two reasons, either sufficient. + +### SM-6, CONFIRMED, high. R-AK deleted a load-bearing guard, and wrote a false premise into the source to justify it. + +This one is mine. I ruled the `!member.IsReference` guard was duplicate +authority and ordered it deleted. Hands verified and got it wrong, then left +a comment claiming "index aliases are unique per descriptor, so a data +member's role string can never coincide with a reference member's." + +**Source contradicts that.** D10 (`CultCache.cs:1085-1097`) groups only +members whose `ResolveIndexAlias` is non-null — alias against alias. A plain +data member with no alias contributes its `MemberName` to the same role +namespace and is checked against nobody. + +Probed: a document with a data member `Owner` and a reference member aliased +`Owner` **registers fine**, and then every hop path throws +`ArgumentNullException: Value cannot be null (Parameter 'targetType')`. +`ReferenceMembers` now yields the data member, `ReferencesOf` matches it to +the *reference* member's edges by role string, `member.TargetType!` is null, +and `ResolveTargetLeaves` throws. Before the deletion the guard skipped that +member and the selection returned one edge. + +**Restoring the guard leaves 274/274 green — the suite has no opinion either +way.** Any schema shaped that way makes every `cites`/`cited` selection over +it fault, the peer gets no typed refusal, and **the batch's own new dispatch +backstop swallows it with no log.** + +### CONFIRMED, medium. The dispatch backstop is untested and answers nothing. + +`catch (Exception) when (false)` — so the backstop never matches — survives +274/274. `HandleSnapshotRequestV1Async` catches only the three typed selection +exceptions, unlike its siblings `HandleShardLogRequestAsync` and +`HandlePutAsync`, which catch `Exception` and answer a `CultNetErrorMessage`. +**The snapshot path is the one handler where an untyped fault becomes +silence.** R-AG's invariant was that malformed input reaches the wire typed +and nothing else escapes; a silently dropped dispatch is not that. It is a +compensator, and it is already hiding SM-6. + +### SM-4, CONFIRMED, medium. R-AJ closed about half of it, and Rust got the thin half. + +| mutation | C# | Rust | +|---|---|---| +| drop edge-sort `To.SchemaId` | survives | survives | +| drop `To.Key` | survives | survives | +| drop `From.SchemaId` | killed | **survives** | +| drop `Role` | killed | **survives** | +| drop row-order `recordKey` | killed | **survives** | +| swap row-order schema/key *(control)* | killed | killed | + +**The controls dying means the rewritten tests are not degenerate in the old +way** — R-AJ's headline fix is real. But the new Rust edge test puts both +edges on the same `from.schema_id` and never reads `to`, so it pins exactly +one thing: `from.record_key` before `role`. **Dropping `role` entirely — the +component it was written for — survives.** + +### CONFIRMED, medium. Shared-key resolution is order-dependent and unpinned in both runtimes. + +Iterating candidates reversed (C#) and preferring the last in-target candidate +(Rust) both survive. Nothing pins "the first row in the caller's order wins" +when **two in-target** rows share a key; R-AF's new vector covers one-in and +one-out only. Both runtimes agree in source today, and that agreement assumes +both are handed rows in the same order, which nothing between a C# cache and a +Rust row owner guarantees. + +### PLAUSIBLE. `RowSet::target_leaves(role)` takes no schema + +(`selection.rs:1333`), where C# resolves the target set from the declaring +member's own `TargetType`. Two schemas legitimately declaring one role name +with different targets **cannot be expressed in Rust at all**. Low-medium. + +### PLAUSIBLE, low. A `+` prefix in a cursor length field + +parses in Rust (`str::parse::`) and is refused in C# +(`NumberStyles.None`). Gated behind the HMAC, so unreachable without forging +it. Read from source, not probed. + +### Promises that held + +**R-AF's wire fact is confirmed, and harder than the probe claimed.** It is +not one serialization — **the type has nowhere to put a schema id.** +`CultRecordRef` has exactly one field, `ICultRecordRef` exposes only `Key`, +the formatter writes only the key, and all three declared reference shapes +yield `CultRecordKey`. A document carrying scalar, many-list and +many-dictionary references at once encodes with no schema id anywhere. **No +other formatter, version or nesting can introduce one without changing the +type.** C#'s rule was right, Rust adopting it is correct, and it is not wrong +in the other direction. + +**Both runtimes now agree at the evaluator on every shape the previous verdict +split them on** — seven matched probes built independently in each runtime, +identical answers, including the shared-key matrix in either row order. **The +role-filter reordering, which no ruling covered and only Hands had checked, +agrees with C#.** + +**R-AG is behaviourally pinned**: moving the cast inside the parens — still +wrapping, still looking like a fix — kills a test. Dropping the redundant +`length < 0` survives and is genuinely equivalent. + +### R-AH: right scope, under-specified, still unbuilt + +**Comparing the payload rather than the envelope is the right call** — the C# +message carries a non-deterministic `messageId` and three shard fields Rust +has no concept of, while the shared six are in the same declaration order on +both sides with camelCase keys already. + +**But "the canonical MessagePack bytes" is not a specification.** The same +page encodes as 285 bytes compact and 402 named, and **the compact form emits +a 4-element array for a 6-field struct** because `skip_serializing_if` drops +absent optionals positionally — it is not decodable. The ruling must also fix +map encoding with camelCase keys, declared field order, and whether an absent +optional is **omitted** (Rust today) or **nil** (C# today). Those differ right +now, and the same rule has to reach `Edge`, `RawDocumentHeader` and +`SelectionDocumentRecord`. + +**The structural reason it keeps slipping: C# has no page type at the +evaluator layer.** `Select` returns rows, and `Projection` appears once in the +evaluator, inside the cursor digest. Either `Select` gains projection, or the +harness builds the page outside it and the vectors start testing +`CultNetDocumentRegistry` too. **Nobody has chosen, and my ruling did not.** + +At `fc51e9a`: `pageBytes|payloadBytes|canonicalBytes` is **0 hits** in both +vector files, `rs-written.json` still carries no projection vector, and door +refusals still compare a field and never a code. + +**Can parity be claimed without it? No — not byte parity.** What exists is +semantic parity over an agreed field subset. **Even the selection bytes differ +between the two written files for the same vector** — C# writes nine fields +with nils, Rust omits absent ones — so there is no byte-level agreement +anywhere in this cut. + +### What Soul could not run + +No Stryker run; the 47 survivors stay untriaged, and **two of Soul's own +confirmed survivors are on lines batch 5 changed**, so that list is not empty +of real signal. The `--since`/`GitInfoProvider` crash is still not +root-caused. `contracts.rs` and `schema_discovery.rs` unmeasured. The R-AH +harness unbuilt, pending the shape decision. Caching's three failures still +unproven. **One run was lost to CRLF and still exited 0** — fixed in the +stopgap at Eureka `b12016a`, with a verdict sentinel so a job that never ran +cannot report success. + +## Self's rulings for fix batch 6, 2026-09-23 + +- **R-AL (SM-6). Restore the guard, and fix the owner.** The guard is not + duplicate authority — filtering members by kind is the evaluator's own job, + and I was wrong to call it a duplicate. Restore it, delete the false comment, + and add the probed shape as a test that fails without it. **Separately, D10 + is the owner of role-namespace uniqueness and currently admits the + collision**: make registration refuse a data member whose name collides with + a reference member's alias. Both, with tests. **Standing: a "redundant" + deletion must be probed at the shape that would break it, not argued from a + property nobody checked.** This is the second time a redundancy ruling of + mine was wrong; the first was caught by Hands, this one was not. +- **R-AM. The snapshot handler answers like its siblings** — catch + `Exception`, return a `CultNetErrorMessage`. **The dispatch backstop logs**, + always. A backstop that swallows silently is a compensator, and this one hid + a high-severity regression for a whole batch. +- **R-AN. Finish R-AJ in Rust.** Its edge test pins one component of a + four-component rule. Every component of both orderings dies under its own + mutation, in both runtimes. +- **R-AO. Pin shared-key resolution order** — two **in-target** rows sharing a + key — in both runtimes and in a vector. "The first row in the caller's order + wins" is currently a coincidence of source, not a rule. +- **R-AP (R-AH). Decide the shape, then build it.** The payload, as a + **map with camelCase keys**, fields in declared order, and **absent + optionals written as nil** rather than omitted — C#'s current behaviour, + because a decodable fixed-shape encoding is worth more than brevity, and + because omission is what makes the compact form undecodable. The same rule + reaches `Edge`, `RawDocumentHeader` and `SelectionDocumentRecord`. + **`Select` gains projection**, so the thing the vectors test is the thing + that decides; the harness must not assemble a page the evaluator never + produces. +- **R-AQ. Until R-AP lands, this cut claims semantic parity over a named + field subset, not byte parity** — and the map says so in those words. + Soul is right that byte parity cannot be claimed today, and it is better to + name the smaller claim than to let the larger one stand unearned. + **Flagged for the operator**: wire parity is this campaign's stated + invariant, so if semantic parity is not enough for Cut 1 to merge, R-AP + becomes a blocker rather than a follow-up. + +### Fix batch 6 landed, 2026-09-23, verified locally and not on Yggdrasil + +Sonnet, six commits on `sel-fix6` (pushed by Self after review). C# Networking +**279 passed / 2 skipped** (was 274), Mesh 255, Caching 193 unchanged. Rust +**259 across 12 targets** (was 254/11). +650 / −47 across 13 files, no new +targets, packages or dependencies. + +**The verification gap comes first, because it is Self's.** The brief said +"use `ygg-verify.sh`" without its path, where every earlier brief gave the +full path. Hands searched, could not find it, and **verified the whole batch +locally on the workstation** — the exact work the load budget forbids there. +It reported the gap plainly rather than claiming the bar was met, and **left +the branch unpushed on purpose** so the work would not look merge-ready. Both +were the right calls. Recorded as a scar at Eureka `301df32`; **this batch +still owes its Yggdrasil run**, and Soul's pass will provide it. + +- **R-AL.** The guard is restored and the false comment deleted. **The real + fix went to the owner**: D10b in `CultCache.DiscoverMembers` now groups + **every** member by its reference-role namespace (`IndexAlias ?? MemberName`), + not only aliased ones, and refuses registration when a data member's bare + name collides with a reference member's alias. Registration of the probed + shape now throws. Since D10b closes the only production door, the guard + itself is pinned by a test that **builds the colliding descriptor through + reflection to bypass the registry deliberately** — and removing the guard + makes it yield both members and fail. +- **R-AM.** `HandleSnapshotRequestV1Async` now catches `Exception` and answers + a `CultNetErrorMessage`, like its two siblings. The dispatch backstop logs, + always. **Writing the test found a second defect**: the backstop logged + `DynamicInvoke`'s `TargetInvocationException` wrapper — "Exception has been + thrown by the target of an invocation" — rather than the real fault, so it + now unwraps. The first run failed on the wrapper text, which is precisely + the bug that half of R-AM exists to fix. +- **R-AN.** Two isolating Rust tests added; the previous one tied `From` and + `To` across both edges, so dropping `role` survived. + **The `To.SchemaId`/`To.Key` equivalence argument recorded here was FALSE, + and is deleted rather than amended.** It claimed that within a page-position + bucket no construction gives two edges with tied `From` and `Role` and + differing `To`. Soul built the counterexample and ran it in both runtimes: + **a selection carrying both hops mixes their edges into one bucket**, so a + row that self-references through the same role it uses to cite a peer yields + a `cites` edge (`to` = the queried peer) and a `cited` edge (`to` = itself), + tied on `From` and `Role`, differing on `To`. A self-referencing role is a + parent or peer link — ordinary, not exotic. **This is the second + justification-from-an-unchecked-property in three batches**, and R-AL's + standing rule applies to it. + +- **R-AO.** Shared-key order pinned in both runtimes, both row orders, plus a + vector case regenerated into both written files. +- **R-AP, half built and half stopped, correctly.** The encoding is decided + and **C# already did it** — `[MessagePackObject]`/`[Key("name")]` writes a + camelCase map with nil for absent optionals by default. The gap was entirely + Rust-side: `skip_serializing_if = "Option::is_none"` on four types omitted + keys under `to_vec_named`. Removed from all four, `#[serde(default)]` kept + for decode. **Byte-identical now, against real C# MessagePack 3.1.7 hex**: + `RawDocumentHeader` and `Edge`, each broken once by hand to confirm the + assertions are not vacuous. **The byte counts recorded here were wrong** — + 86 and 99 — and are corrected to **228 and 246**, measured on Yggdrasil + against MessagePack C# 3.1.7. The committed hex constants matched the real + bytes exactly all along; only this prose was wrong. + + **"`Select` gains projection" was not built**, and Hands stopped and said + why rather than reporting the ruling closed. Header and document projection + is owned by `CultNetDocumentRegistry.SelectPage`/`SelectAll`, a different + class from the evaluator, which knows only generic rows and descriptors and + has no legitimate route to a schema's wire-binding override. Moving that + ownership is buildable — thread a caller-supplied serializer, as + `ordinalOf`/`shardIdOf` already are — but changes both signatures, every + caller, and the vector harness itself. + +**R-AQ, restated honestly.** The claim has moved from "semantic parity, byte +parity absent" to **"nested wire-type byte parity confirmed and vector-tested; +whole-message byte parity still blocked on unbuilt page-assembly ownership."** +No vector yet exercises the real message output byte for byte. + +### Self's rulings + +- **R-AR. The page-assembly ownership question is its own cut, not a + follow-up.** It changes two public signatures, every caller and the harness, + which is a cut's worth of work and exactly the kind of thing that has + slipped five passes by being carried as a loose end. **Cut 1 does not wait + for it.** +- **R-AS. Cut 1's honest claim is nested wire-type byte parity plus semantic + parity over the named field subset.** The map says that in those words, and + the target document is reconciled to it. **Flagged for the operator:** if + whole-message byte parity is required before this cut merges, R-AR becomes a + blocker and Cut 1 stays open; if it can be its own cut, Cut 1 can close on + the claim above once Soul clears it. + +## Soul, the merge gate, third pass, 2026-09-23 + +Opus. **Every run went to Yggdrasil**, supplying the run batch 6 owed. +Reproduced: C# Networking 279 / 2 skipped, Mesh 255, Rust 259 across 12 +binaries. **Caching is 190 passed / 3 failed** — the three assert a write is +*refused*, which root in a container cannot produce. **Unproven, not +passing**, and Soul declined to call them environmental on its own authority. + +**Verdict: Cut 1 may not merge.** + +### SM-7, CONFIRMED, high. R-AN did not land, and its justification is false. + +Three named survivors are still alive: + +| mutation | Rust | C# | +|---|---|---| +| drop both `to.schemaId` and `to.recordKey` from the edge comparator | **survives** | **survives** | +| drop `recordKey` from the **row** comparator | **survives** | killed | + +The row survivor is the fourth line of SM-4's own table from the previous +gate, and **batch 6 added no Rust row-order test at all**. + +**Soul built the counterexample and ran it in both runtimes.** The false +argument reasoned about each hop separately; a selection carrying **both** +hops mixes their edges into one `Vec`. A row that self-references through the +same role it uses to cite a peer produces a `cites` edge (`to` = the queried +peer) and a `cited` edge (`to` = itself) in the **same page-position bucket**, +tied on `From` and `Role`, differing on `To`. Rust's fixture `peer` role and a +C# `[CultReference(typeof(Self), many: true)]` both express it. Reversing the +`to.recordKey` comparison is killed **only** by Soul's probe, so the branch is +live and decides real output. **A self-referencing role is a parent or peer +link — ordinary.** + +Both runtimes agree today only because the comparator text is duplicated — +the "coincidence of source, not a rule" that SM-4 raised and R-AN was written +to close. + +### SM-8, CONFIRMED, medium. The cut's parity claim has no home. + +Section 9 says the claim is written into `docs/runtime-parity-scope.md`, "not +here alone". **That file contains zero mentions of typed selection**, and +never did — not even the earlier overstated wording. R-AS said the target +document "is reconciled to it". It is not. + +### SM-9, CONFIRMED, low. The map's byte counts are wrong; the constants are right. + +Serialized on Yggdrasil against MessagePack C# 3.1.7: `CultNetRawDocumentHeader` +is **228 bytes**, `CultNetEdge` is **246 bytes**. The committed hex in +`selection_wire_parity.rs` matches **exactly**. The landing note recorded 86 +and 99. **The thing Self asked Soul to distrust was sound; the prose beside it +was not.** + +### Promises that held + +**R-AL is complete, including inheritance.** Seven shapes built through +`Reflection.Emit` and pushed at the real registry, all refused: data name +against reference alias, reference name against reference alias, alias against +alias, data *alias* against reference *name*, implicit many-reference through +`List>`, and **across inheritance**, where the message names +both declaring types. The one shape that still registers is two *data* members +colliding with no reference present — **not a hole**, because the index +namespace is looked up by exact `IndexAlias` and never by the name fallback; +only the reference namespace uses `IndexAlias ?? MemberName`. +`PersistedMember.IsReferenceCandidate` is a character-exact mirror of +`FromMember`'s `isReference`, so D10b cannot disagree with the descriptor it +guards. Narrowing D10b dies; weakening the restored guard dies. + +**R-AM reaches the wire, not just the log.** Real loopback UDP through +LiteNetLib with the production transport: the null-`Selection` fault arrives at +the client and decodes as `CultNetErrorMessage` with the real message. +Mutating the handler to log but answer nothing dies. + +**R-AO's vector genuinely discriminates.** Under last-wins the resolved schema +stops matching the citation's declared target and the page empties, so the +vector has real power rather than merely existing. + +**R-AP's bytes are right, and more of them than claimed.** +`SelectionDocumentRecord` is byte-identical at 269 bytes, and — the one that +matters — **the whole `cultnet.snapshot_response_raw.v1` envelope is +byte-identical at 376 bytes**, Rust's encoder against C#'s message. Nothing +broke on decode. + +### Observations, not defects + +`SelectionPage` has **no C# counterpart to be byte-identical to**; byte parity +is undefined for it. The new generic catch sends raw .NET exception text to an +unauthenticated peer — **exactly what R-AM ordered, and what the siblings do**, +so consistent rather than wrong, but worth its own ruling one day. D10b is +stricter than the restored guard needs: a data member aliased `Owner` beside a +reference member named `Owner` used to register and worked, and is now +refused — defensible, but a breaking registration change with no note. + +### Soul on the wording, and Self's correction + +Soul agrees **R-AR is its own cut**. It does not agree with how I described +the residual gap, and it is right on both counts: + +- **"Nested wire-type byte parity" overstates it.** The branch proves two + types, each at exactly one value with **every optional absent**. Nothing in + the batch touches a header with `tags` populated or an edge with a + `payload` — precisely where `string[]` versus `Vec` and `byte[]` + versus `serde_bytes` could diverge. The correct words are **"byte parity for + `RawDocumentHeader` and `Edge` at an all-optionals-absent value"**. +- **"Blocked on unbuilt page-assembly ownership" is the wrong word, and the + expensive one.** It ran two independent things together: the two *encoders* + producing identical bytes for the same page value, and the two *evaluators* + producing the same page value from the same rows. The second is what the + vectors already compare. **The first needs no ownership move at all — Soul + wrote it this afternoon and it passes at 376 bytes.** What R-AR buys is a + single test driving rows to bytes in one call rather than two halves meeting + on paper. **Calling it blocked made the cheapest available evidence look + expensive, which is how it slipped six passes while sitting there for the + taking.** + +### The rig + +`C:\Users\Meta\eureka-soul-probes\cultnet-selection-cut1-fix6\`, beside batch +5's: three C# probe classes, a Rust wire probe, the counterexample patch, +three mutation drivers, seven precomputed C# mutants, and a README carrying +the full mutation table and the two `ygg-verify.sh` rakes (now in the +script's own header, Eureka `db1c84d`). + +### What Soul could not run + +No Stryker; the C# survivor list stays untriaged. No cargo-mutants sweep — +thirteen hand-built non-revert mutations instead, all at `-j1`. +`contracts.rs` and `schema_discovery.rs` unmeasured, with batch 5's partial +`validate_*` signal still hanging. The `--since`/`GitInfoProvider` crash still +not root-caused. **Soul proved the `to` comparator branch is reachable; it did +not prove the two runtimes would disagree on it, only that nothing stops +them.** + +## Self's rulings for fix batch 7, 2026-09-23 + +- **R-AT (SM-7). Every component of both orderings dies under its own + mutation, in both runtimes** — including `to.schemaId` and `to.recordKey`, + which now have **a known construction to test against**, and Rust's row + comparator `record_key`, which SM-4 named a pass ago and batch 6 never + touched. Take Soul's counterexample from the rig rather than rebuilding it. +- **R-AU. The false equivalence argument is deleted from the map**, done + above, not amended. Standing rule reaffirmed: **an argument that a branch is + unreachable is a claim to falsify, not a reason to skip a test.** +- **R-AV (SM-8). `docs/runtime-parity-scope.md` carries the typed-selection + row**, in the corrected words. A claim whose named home does not mention it + is not recorded. +- **R-AW (SM-9). Correct the byte counts to 228 and 246.** +- **R-AX. Land the whole-message parity vector.** Soul already has it green at + 376 bytes. **This is not blocked and never was** — my wording made it look + so. Land it as a vector on both sides, and add a header with `tags` and an + edge with a `payload`, since those are the shapes where the collection and + byte-array mappings could diverge and the all-absent value proves nothing + about them. +- **R-AY. Cut 1's claim, in these words**: byte parity for the + `snapshot_response_raw.v1` envelope and its nested record types, verified at + populated and absent optional values, plus semantic parity over the named + field subset. **R-AR remains its own cut** and buys a single rows-to-bytes + path, not the claim itself. +- **D10b's strictness gets a note** in the registration error and the map: a + shape that used to register and work is now refused. + +### Fix batch 7 landed, 2026-09-23 + +Sonnet, seven commits on `sel-fix7`, **all verified on Yggdrasil**, one slot +at a time across thirteen sequential jobs with no concurrent verdicts. C# +Networking **280 passed** (was 279 / 2 skipped), Mesh 255 unchanged, Rust +**264 across 12 binaries** (was 259). Caching stays 190 / 3, the three still +unprovable under a root container and deliberately not "fixed". + +**No production logic changed** except one error message and its comment. +Everything else is tests and docs. + +- **R-AT.** All three surviving comparator components now die, in both + runtimes, at `-j1`: dropping both `to` components, reversing + `to.record_key`, and dropping `record_key` from Rust's row comparator. + + **And Hands found that Soul's own construction did not actually kill the + "drop both" mutant.** Taken verbatim from the rig, it survives in *both* + runtimes — not because the branch is unreachable, but because `select`'s + push order happens to match alphabetical sort for that naming, and **the two + runtimes push in opposite orders** (Rust emits `cited` before `cites`, C# the + reverse). Rust needed the self-citer's key to sort *after* the target's, + C# needed the reverse. **A third fixture passing by coincidence**, found + while executing rather than by a later pass. Each runtime now carries its + own naming with the reasoning written into the test. +- **R-AV.** `docs/runtime-parity-scope.md` gains the typed-selection row in + R-AY's words, naming the four files that carry the byte and semantic + vectors and calling out R-AR as separate and still open. **The claim now has + the home the map said it had.** +- **R-AW.** Verified, not assumed: the committed hex constants are **228 and + 246 bytes**, matching a real MessagePack C# 3.1.7 run. The map's prose is + corrected above; the constants were right all along. +- **R-AX. The whole-message vector landed, byte-identical at 376 bytes**, and + the thin evidence is no longer thin: + - `RawDocumentHeader` with `tags = ["alpha","beta"]`: **239 bytes**, + identical — `string[]` and `Vec` agree. + - `Edge` with `payload = [1,2,3]` and `payload_encoding = "messagepack"`: + **261 bytes**, identical — `byte[]` and `serde_bytes` agree. + + **No divergence.** That was a real risk named in the ruling and it did not + materialise. +- **D10b's breaking change is noted** in the error message and its owning + comment: a data member aliased `Owner` beside a reference member named + `Owner` used to register silently and fault at resolution; it is now refused + at the door with no compatibility path. + +**Every condition Soul set for merging is now met.** A final gate pass +follows. + +## Soul, the merge gate, fourth pass, 2026-09-23 + +Opus. Four sequential Yggdrasil jobs, one slot, Rust at `-j1`. Merge to +`origin/main` is conflict-free; main's 42 divergent commits touch no file this +cut touches. + +### **Verdict: Cut 1 may merge.** + +**Baselines, with one correction.** Rust 264 across 12 binaries, Mesh 255, +Caching 190 / 3 — all as reported. **C# Networking is 283 passed / 2 skipped, +not the 280 reported.** Under-reported this time rather than over; the count +still went into the record wrong. + +### The five conditions + +1. **Met for everything that decides output, not met on the letter.** Killed + in both runtimes: dropping both `to` components, dropping `to.record_key` + alone, reversing it, dropping `record_key` from the row comparator, plus + `from.record_key` and `role` in Rust. **The batch's new fixtures are the + killers and they are not coincidental** — Soul attacked them with + single-component variants and they held. + + **But `to.schemaId` survives both dropping and reversing, in both + runtimes.** Hands never claimed it dies alone; **R-AT did, and R-AT was + mine.** Soul could not construct a selection where it decides anything — + under D10b a role resolves to one declared target type and reference + resolution yields at most one row per (role, key) — but says plainly that + is a claim, not a proof, **and the same shape of argument that has been + wrong twice here.** Hence the follow-up is "construct a killer **or delete + the component**", not "record it as equivalent". +2. **Partially met, and the miss is mine.** The false argument is gone where + batch 6 restated it and **still stands, unstruck, at its original site** — + the `EdgesFor` paragraph and ruling **R-AC** ("Recorded, not to be chased"). + Those read as live instructions. I deleted the copy and left the original, + which is the same sweep failure this map has recorded before. +3. **Met.** `runtime-parity-scope.md` carries the row in R-AY's words, naming + four files that all exist. +4. **Met**, and the constants were right all along. +5. **Met, and genuinely two-sided.** The three constants are byte-identical + strings in both files; each runtime serializes and asserts independently, + so **neither reads the other's answer**. All three C# tests pass and **all + three fail when Soul flipped one hex digit** of the expected constant. 239, + 261 and 376 are real MessagePack C# 3.1.7 output. + +### SM-10, CONFIRMED. The 246-byte all-absent `Edge` vector is Rust-only. + +The 228-byte all-absent header is nested inside the 376-byte envelope, so C# +regenerates it. **The edge has no such cover.** A C# edge encoder that resumed +omitting a null `payload`/`payloadEncoding` would still pass the 261-byte +populated vector, and **nothing on the C# side would fail** — which is exactly +what R-AP existed to kill. It leaves `runtime-parity-scope.md`'s "verified at +populated and absent optional values" true for three cells of four. + +**Five lines of C# closes it.** + +### Self's decision: close four items, then merge + +Soul named this the follow-up it "would put a name on". A known hole that a +five-line test closes is not a follow-up — merging over it would be shipping +the exact asymmetry the cut exists to prevent, with a note promising to come +back. **Batch 8 closes items 1 to 4, then the cut merges.** + +- **R-AZ (SM-10).** Mirror the 246-byte all-absent `Edge` constant into + `SelectionWireParityTests.cs`, so both runtimes assert all four cells. +- **R-BA.** Settle `to.schemaId`: **construct a killer, or delete the + component from both comparators.** A component no input can distinguish is + not free — it is a line the next reader must reason about, and the reasoning + has been wrong twice. +- **R-BB.** Correct the landing note to 283 passed / 2 skipped. +- **R-BC.** Strike R-AC and the `EdgesFor` equivalence paragraph **at their + original site**, not with a note beside them. + +**Not blocking, recorded as genuine follow-ups**, none a known defect in the +cut's behaviour and all outside the selection surface: the C# Stryker survivor +list untriaged; `contracts.rs` and `schema_discovery.rs` unmeasured with batch +5's partial `validate_*` signal hanging; the `--since`/`GitInfoProvider` crash +unrooted; Caching's three, which **need a non-root container to prove and must +not be "fixed"**. + +Rig: `C:\Users\Meta\eureka-soul-probes\cultnet-selection-cut1-fix7\`. + +### Fix batch 8 landed, 2026-09-23 — the pre-merge batch + +Sonnet, two commits on `sel-fix8` (`cda28fa`, `492dd0e`), verified on +Yggdrasil at `-j1`. C# Networking **284 passed / 2 skipped** (283 baseline +plus the one new test), Rust **264 across 12 binaries**, unchanged — the +deletion is behaviour-neutral. + +- **R-AZ.** The 246-byte all-absent `Edge` vector is mirrored into + `SelectionWireParityTests.cs`, so both runtimes now assert all four cells. + **Proven non-vacuous**: flipping byte 0 of the constant fails exactly that + test and nothing else, on a throwaway commit that was never pushed. +- **R-BA. Deleted, not constructed — and the argument is stronger than the one + the ruling carried.** Hands traced both resolvers: each resolves a reference + purely from `(citer's schema, role, recordKey)` against the evaluation's own + fixed candidate index, with no edge- or caller-specific input steering which + candidate wins — Rust's `target_leaves(role)` does not even take a schema. + So once `From`, `Role` and `To.RecordKey` tie in the comparator, **the + resolved row including its schema is forced identical by construction**. + + That does not depend on schema-authoring discipline the way my D10b argument + did; it depends only on the resolution function being a pure function of + already-tied inputs. **It is a structural proof rather than a semantic + claim**, which is the distinction that has bitten this cut twice. Hands + checked it against the live counterexample too — the self-citing row breaks + `to.record_key`, not `to.schema_id`. + + The tiebreak is gone from both comparators, with its stale documentation in + a third file. No test relied on it. + +**All four of Soul's pre-merge items are closed**, three by this batch and +R-BC by Self, which struck the false equivalence argument at both original +sites rather than annotating it. diff --git a/docs/cultnet-transport-parity.md b/docs/cultnet-transport-parity.md index d0779196..17fc6964 100644 --- a/docs/cultnet-transport-parity.md +++ b/docs/cultnet-transport-parity.md @@ -271,6 +271,15 @@ Current progress: flush where the runtime supports one, so callers that require confirmed transport delivery do not substitute a fixed sleep. TCP-framed profiles do not publish the field because they do not own the RUDP pending-reliable queue. +- The receive window is a contract, not a discovery. A receiver must hold 1,023 + sequences and 4 MiB of payload beyond its contiguous received watermark, and + a conforming sender never exceeds either. The sender's flow window enforces + it without a wire field: a reliable packet is admitted only while its + sequence is at most 1,023 above the lowest unacked sequence and the payload + above that sequence stays within 4 MiB. The first packet is always + admissible, so a payload larger than 4 MiB goes out alone, and packets wait + in the FIFO in order, so a small packet never overtakes a large one. C#, + Rust, TypeScript, and Python enforce it; Kotlin does not yet. - TypeScript, C#, Rust, Python, and Kotlin now share a portable `cultnet.reconnect_policy.v0` document and deterministic exponential delay helper, and RUDP transport profiles advertise that policy under diff --git a/docs/document-variants-cut.md b/docs/document-variants-cut.md new file mode 100644 index 00000000..854d6cbb --- /dev/null +++ b/docs/document-variants-cut.md @@ -0,0 +1,1557 @@ +# CultCache document variants: cut map (draft) + +Date 2026-09-29. Imagination output for `docs/document-variants-target.md` (branch +`codex/document-variants`). Body read at `origin/main` `268e0ef`. This map owns means only; +the target owns ends and rulings 1-7. Nothing here is decided that the batch in section 4 +asks the operator to decide. + +## 1. Probe facts (run, not inferred) + +Probe: scratch clone `scratchpad/variant-probe` (commit `7b6de8e`, probe files only), run on +Yggdrasil via `ygg-verify.sh` with images `dotnet`, `rust`, `python:3.12-slim`, `node:22`. +Each runtime's current reader wrote a normal store, the bytes were altered four ways, and +the store was reopened. Output in `scratchpad/probe-out/*.txt`. + +| Altered store | C# | Python | TypeScript | Rust | +| --- | --- | --- | --- | --- | +| A. v1 header, record gains slot 4, payload empty | refuses, "read past end of stream" | refuses, "incomplete input" | refuses, "Offset outside DataView" | refuses (strict tuple), misleading legacy-envelope message | +| B. v1, slot 4 plus a full payload | **loads the payload silently** | **loads silently** | **loads silently** | refuses | +| C. header `cultcache.store.v2` | **ignores the header**; refused only by the empty payload | refuses, misleading "legacy envelopes" message | refuses | refuses | +| D. payload holds the delta as a sparse array | **loads `Name=''`, `Max=99`** | **loads `name=None`** | refuses | loads; `get` of that key fails | + +Consequences: +- The **empty payload is the only tripwire every shipped reader trips**, pinned builds + included (Aetheria pins `caching-unity-v1.4.0`). A variant record's payload must be empty, + and the delta must live outside it. +- A payload-as-delta encoding is ruled out: C# and Python misread it silently. +- C# never checks `formatVersion` (`CultDocumentMessagePackSerialization.DeserializeSnapshot` + defaults a missing one to v1). C#, Python and TypeScript skip extra record slots silently. + These are latent defects today and become misreads when the format grows. +- Every refusal is loud but none of them names the record. The target requires named refusals, + so current readers need a small fix (C0). + +Other Body facts that shape the map: +- **CultNet has no member-path grammar.** `docs/cultnet-selection-cut.md` D2: "Declared + aliases, not a field-path language". It reaches top-level declared `index`/`role` aliases + only (`CultDocumentMemberView`). Nothing exists to reuse. See section 3. +- **The schema catalog describes top-level members only.** A nested type (`BehaviorData`, + `PerformanceStat`, `HardpointData`) appears only as a CLR type name. Soft drift and hard + rejection cannot see below slot level. +- **Resolution needs a codec, and the core has none.** `GameCult.Caching` holds objects. The + MessagePack codec lives in `GameCult.Caching.MessagePack`. `CultInspectorModel` already + takes the codec as two injected functions (`CultCacheMessagePack.CreateInspectorModel`). +- **Same concrete type implies same home store.** `Home(type)` routes by type, so ruling 3 + ("same store") falls out of ruling 6. No separate check is needed. +- **The name index shadows silently.** `Index()` does `MapOf(_names, type)[name] = key`, so a + second record with the same name overwrites the entry. A variant that inherits its base's + name would make `GetByName` return one of the two, depending on apply order. +- **Studio edits by whole-document upsert.** `CultInspectorEdit.Commit` calls + `UpsertAsync(type, copy, key)`, and `Duplicate` clones through the codec. +- **Raw readers bypass the cache.** In CultLib: `CultMesh.ReadSingleFileDocument` + (`CultMeshSingleFileDocuments.cs:112`), plus its legacy snapshot decoder. In consumers: + AetheriaEve `AetheriaRuntimeCatalogStore` (directory-store pages). +- **Kotlin reads no store files.** It sees CultNet raw snapshots only. + +### Body at 2026-10-12 (Imagination refresh, `imagination-variants-refresh`) + +Probes run 2026-10-12 from `F:\Projects\CultLib-c2afix` with git only (no builds), after +`git fetch origin`. Scratch worktrees under the session scratchpad were removed afterwards. + +- **C2a head.** `hands/variants-c2a` = `origin/hands/variants-c2a` = `de401056`, worktree clean. + `main` = `origin/main` = `b3bd8dd5`. Merge base `f789c8d1` (2026-09-30). C2a is 207 commits + ahead, main 453. `15ccdbb9`, the base of the five 2026-10-02 specs, is a C2a commit, not a + main commit; C2a has never merged main. +- **Overlap.** `git diff --name-only` from the merge base: C2a touches 141 files, main 285, 33 in + common. In C#, main changed `CultCache.cs` (+18 -4: union guard, internal `Clock` seam), + `CultDocumentMessagePackSerialization.cs` (+9 -3: nesting bound 256), and the persistence and + schema-compatibility contracts (+7, +21). Everything else in common is under `packages/`: + cultmesh-ts `src/index.ts` (main +372 -433, C2a +189 -356), cultcache-rs `lib.rs` (main +276, + C2a +761 -171), cultcache-ts store and cache, cultnet-ts replication. +- **Merge probe.** `git merge --no-ff --no-commit b3bd8dd5` onto `de401056` in a throwaway + worktree: 16 files conflict, 32 hunks. `CultCache.cs` has one: C2a made `MintStoredAt` an + `internal static` (the store's `StoredAtOver` calls it), main made it an instance method over a + new `Clock` seam for its union golden. The cultmesh-ts conflicts carry a semantic one: main + added payload-parse acceptance to the store document (an `accepts` predicate that decodes the + payload, and the test "store document handles choose compatible foreign schema payloads"), + which C2a's retire-schema-alias rule forbids. Main still carries `preserveIncomingSchemaId` + and `resolve_document_and_schema_id_for_raw_record`, which C2a deleted. +- **The stash.** `stash@{0}` in `CultLib-c2afix`, "h3 WIP 2026-10-03: commit-time check-only + keys, stopped for quota; unverified", based on `de401056`, 2 files, +186 -47 + (`CultCache.cs`, `DirectoryMessagePackBackingStore.cs`). It is a draft of the operator's + at-commit ruling (`unheld-removal-refused-at-commit`): `CultCommitRequest.Checks`, staged + checks on each writable store judged under the lock by `RefuseUndeclaredOnDisk`, both stores' + unlocked removal reads deleted, and `ExpectUnchanged` comparing foreign records at their read + versions (`CultForeignRecord.StoredVersion`). No tests, no contract text. Read with + `git stash show -p`; not applied or dropped. +- **The High finding is already fixed.** `rawbytes-in-place-edit-lost` (content-version s2) was + fixed by h3 (`2a3773a4`, range head `a935d15c`: `RawBytes` deleted, the store owns a file's + bytes) and Soul's verdict `cut-c2a-content-version.s3` holds it, with `rawbytes-key-drop-unpinned` + retired by deletion and the five s1 pins (`cache-wrote-version-unpinned`, + `expect-on-removed-unpinned`, `no-condition-hash-unpinned`, `staleness-own-upsert-unpinned`, + `unstored-same-tick-unpinned`) caught at head. `git grep RawBytes de401056 -- src tests`: no + match. Those findings were never closed in the mind. + +## 2. Model page (step 0b) + +| Kind | Named by | Over time | Decided by | +| --- | --- | --- | --- | +| Variant record | its own `CultRecordKey`, minted like any record; same `schemaId` as its type | created, re-overridden, rebased, removed; never converted to or from a plain record implicitly (Q1) | author through Studio or the variant write API; the cache validates | +| Base reference | the base's key, in the record's variant slot | changed only by an explicit rebase; a base cannot be deleted while it has variants, unless the same batch rebases or removes them | author; the cache refuses a cycle, a missing base, a different concrete type, a global type | +| Override entry | `(op, path, id, value)`; op is Set, Insert or Remove | added by editing; removed by clearing; survives base edits while its path resolves | author; the cache refuses entries a base edit strands (Q2); an entry whose member left the type soft-drifts with a warning (Q4 c) | +| Member path | a sequence of `(slot, elementId)` steps; `slot` is the MessagePack `[Key]`; `elementId` is `""` unless the step enters an object-list element | a type change can invalidate it | the type's owner (slot authority); ids by the element's creator | +| Element id | a `[CultElementId]` string member on an object-list element type; `""` means unset | minted by the cache on write when unset; copied unchanged into variants; a moved element is a new element | cache mints it; it is never retargeted | +| Resolved view | `CultStoredDocument.Document` for a variant key | recomputed inside the hold that admits the variant, or any base on its chain | the cache only; never persisted, never written back (Q1) | +| Index and name entries | as today, from the resolved view | a dependent's entries are dropped and re-added in the same `Apply` as its base change | the cache; a variant must override the `[CultName]` member (rule R6) | +| Watches | as today; each re-resolved dependent emits `Updated` with its own `Sequence` | published in the same hold as the base change | the cache | +| Compare-exchange | `(schemaId, storedAt)` of the stored delta (ruling 2) | a base change does not stamp its variants | the cache; the resolved view is not an identity | +| Persisted format version | store header `formatVersion` | `cultcache.store.v2` when the store holds at least one variant; `v1` otherwise (Q5) | the writing store, from content | +| Single-file store file | the path; one MessagePack array `[header, catalog, records]` | replaced whole and atomically; refused when unreadable; see "Store authorities" | each runtime's one reader decides what is a store; the writer derives the header from it | +| Store lock and staging files | `.lock`; a unique temp beside the store | the lock is taken by C# and Rust writers (CultMesh included, through `ReplaceDurable`); staging is removed on a failed write | the store, never CultMesh or a consumer | +| Variant slot on the wire (CultNet) | **empty cell**: no CultNet message carries a delta today | C5 | ruling 4 decides deltas; the message shape is C5's design | +| Dictionary entries, scalar lists, arrays | **empty cell**: no stable identity exists | whole-member Set only (Q7) | Q7 | +| Template (non-item) bases | **empty cell**: parked by ruling 6 | none | not in these cuts | + +## 3. Where the Body contradicts the target + +1. **"A member path in CultNet's grammar"** (ruling 1 and fork 1 text) has nothing to reuse. + CultNet selection deliberately has no path language. This map specifies a minimal slot + path (section 2) owned by `GameCult.Caching`. If CultNet ever needs paths, it can adopt + this one. Nothing is shared today, and nothing is invented twice. +2. **"Overrides are subject to the same soft drift rules as full records"** conflicts with + the ends list: "Loading refuses an override naming a member that does not exist on the + type". Under soft drift, a persisted slot missing locally is ignored with a warning, so + the two rules disagree for a dropped member. Below top level, the catalog has no shape to + drift against at all. See Q4. +3. **"Deletes first"** has little to delete: the feature is additive. The honest deletions + are the silent extra-slot skips and C#'s ignored header. C0 puts them first. + +## 4. Operator questions (one batch) + +**Operator rulings, 2026-09-29, each asked on its own:** + +- **Q1: (a)**, a plain `Upsert` at a variant's key is refused loudly. +- **Q2: (a)**, a base edit removing an overridden element is refused unless the same batch + resolves it. Operator's reading: "the very existence of that element in the child collection + must become the new override state... you can't change the parent without also changing the + child... that's the resolve part of (a)." +- **Q3: ids everywhere, not opt-in.** Operator: "Opt-in sounds nice but consider the UX. We're + planting a footgun if we don't require ids everywhere." Rollout: **required, minted on load**. + The C# registry requires an id member on object-list element types. A store written before ids + existed loads, and ids are minted once on its first write (C2's rewrite). Other runtimes carry + the id as an ordinary member and enforce the rule when they gain variants. Each consumer's type + edit is a sweep in its own repo after C2. +- **Q4: (c) soft drift everywhere. This reverses the recommendation and supersedes the target's + end "loading refuses ... an override naming a member that does not exist on the type".** + Operator: "Soft drift everywhere aligns with the vision... the rationale for adopting + migrationless changes is still valid for variants. Any member dropped in a type change is a + design change, the reason for it to apply to the parent also applies to the variant." A + dangling override, at any depth, is ignored with a warning naming the variant and the member, + and the variant inherits the base value. The other broken-variant refusals (a base cycle, a + missing base, an incompatible base type) stand. +- **Q5: (a)**, the v2 header is written only when the store holds a variant. +- **Q6: yes**, the directory store and CultNet refuse variants loudly until their own cuts. +- **Q7: yes**, object-list elements are addressable by id, and dictionaries, scalar lists and + arrays are replaced whole. The operator asked first whether design roles and quality levels + use dictionaries. They do not: `CraftedItemData.Roles` is a `List` and + `FactionProduct.Roles` is a `List` (Aetheria `ItemData.cs:316`, + `FactionProduct.cs:30`). A market-segment product becomes a variant overriding one + `ProductRole` by id. + +*The questions as asked:* + +**Q1. A plain `Upsert` of a whole document at a variant's key.** It happens when Studio's +current edit commits, when AetherDb migrations do `batch.Upsert(type, doc, key)`, and on a +CultNet remote write. +- (a) Refuse it loudly. A variant changes only through the variant API. Flattening is an + explicit, separate operation. +- (b) Diff the document against the base and store the difference. Ids make the diff + deterministic, but a value set equal to the base stops being an override without anyone + saying so. +- (c) Flatten silently (today's behaviour by default). +- **Recommend (a).** Affects C1's write path, C3's edit commit, and every AetherDb migration + (each skips variants or uses the variant API). + +**Q2. A base edit that removes an element some variant overrides.** +- (a) Refuse the commit unless the same batch clears or retargets those overrides. Studio + offers keep, retarget or clear at edit time, and "keep" means the base edit is not + committed. The store never holds a conflict, and loading refuses one. +- (b) Persist the conflict. The override goes inert, readers get the resolved document + without it, and Studio lists it. +- **Recommend (a).** Option (b) makes a reader's resolved document silently differ from what + the author wrote. Affects C2's validation, C3's rebase UI, and migrations that remove + behaviours. + +**Q3. Scope of "ids everywhere".** +- (a) Every object-list element in every registered document type, in all 28 consumers. The + registry refuses a type whose element types lack an id. +- (b) Only document types that opt in with `[CultVariants]`. For those, the registry requires + `[CultElementId]` on every object element type reachable through their lists, including + union bases. +- **Recommend (b).** Option (a) breaks 28 registries for a feature that one consumer uses. + Affects C2 and Aetheria's adoption cut. A `BehaviorData` id needs a base slot above the + subclasses' highest key (32), which adds about 30 nil bytes per behaviour unless Aetheria + renumbers. + +**Q4. Schema drift under overrides** (contradiction 2). +- (a) Refuse loading when an override names a member missing at any depth, or holds a value + that will not decode into the member's current type. Record this as a stated exception to + soft drift in `cultcache-schema-compatibility.md`. +- (b) Top-level overrides follow catalog soft drift (ignore with a warning); nested ones are + refused. +- **Recommend (a).** It follows the target's ends and is one rule. The cost: after a type + change drops an overridden member, the catalog must be rewritten before the new build opens + it. + +**Q5. Format version.** +- (a) Write `cultcache.store.v2` only when the store holds a variant. Stores without variants + stay byte-identical `v1` for every consumer. +- (b) Always write v2 after the upgrade. +- **Recommend (a).** The empty payload remains the tripwire for pinned old C#, which ignores + the header. Affects C0 and C1. + +**Q6. Slice scope.** Should the directory store and CultNet refuse variants loudly until +their own cuts? The directory store's only consumer is AetheriaEve's raw reader. CultNet +must carry deltas (ruling 4), and no message can yet. +- **Recommend yes.** It is two refusals. Otherwise C1 must design CultNet messages first. + Affects C1's size and the order of C5. + +**Q7. What is addressable below a member.** The proposal: object-list elements by id only. +Dictionary entries, scalar lists and arrays are replaced whole. +- **Recommend yes.** Aetheria's cases (`Hardpoints` whole; `Behaviors[id]...Max`) fit. Keyed + dictionary addressing can be added later without a format change. Affects C2. + +## Cut sequence (2026-10-12) + +Mapped now (specs in the mind): `c2a-declared-apply` r2, the C# commit-time fix batch on +`hands/variants-c2a` (the stash, finished, with tests and contract text), and its sibling +`main-into-c2a` r2, main merged into C2a on `hands/variants-c2a-main` in its own worktree. Later +cuts, one line each, mapped only when Self is about to dispatch them: + +1. **reconcile**: merge `hands/variants-c2a` into `hands/variants-c2a-main` after both Soul passes + hold; Self moves `hands/variants-c2a` there. Waits on both mapped cuts. +2. **parity-ts**: TypeScript write set, one record per key, undeclared records carried and refused, + unheld removals judged at commit. Waits on reconcile. +3. **parity-rs**: Rust `push_all` and `put_prepared_batch` apply a write set, ownership by + declaration, the same commit-time checks. Waits on reconcile; can run beside parity-ts. +4. **parity-py**: Python write-set apply. Waits on reconcile and on `cultlib-gaps` cut + `py-msgpack-default` landing on main (then a main merge into C2a first). +5. **write-set-vectors**: one cross-runtime manifest, read and acted on by all four runtimes; + carries follow-ups `c0-bad-canonical-in-manifest`, `legacy-vectors-all-runtimes`, + `directory-at-path-ts-py-pinned`. Waits on the three parity cuts. +6. **land-c2a**: final main merge, full verification, Soul, then `git merge --no-ff` onto main + with an empty diff against the verified head; no tag. Waits on write-set-vectors, Soul holding, + and `asura:cut_spec:cut-semver-measured` landed. Asura Cut 3 bases on its merge commit. + +Rationale. The 2026-10-02 order (parity, vectors, then merge main) was right when main was close. +Main has since moved 453 commits and rebuilt exactly what the parity cuts change: cultcache-ts +payload ownership, cultmesh-ts, cultcache-rs. Parity mapped before the merge would be mapped +twice. Merging first means every later cut is mapped once, on the code it changes. The C# fix +batch goes first because the operator's at-commit ruling is the contract the parity runtimes +copy; and it touches C# files main barely changed, so it can run beside the merge with one +small reconcile (the `MintStoredAt` region). The High finding is not on this path: h3 fixed it +and Soul s3 held it (body facts above). + +## 5. Cuts, in order + +All cuts are in `F:\Projects\CultLib`. Rebase `codex/document-variants` (docs only) onto +`origin/main`. Each cut is one Hands pass on that branch and merges to main after its Soul +pass. Probes show that a C1 writer can merge safely before other runtimes change, because +every reader refuses it. Verification uses `ygg-verify.sh /f/Projects/CultLib ''`. +The command strings below are the ``. Keep the job's exit status last. + +Overlap: BP-1 (`cultmesh/rust-content-plane`) edits `docs/runtime-parity-scope.md`, which +C0 also edits. Rebase after BP-1 merges. `codex/fix-node24-ajv-esm` has no diff against main. + +### C0. Tripwires: every reader refuses what C1 will write, and names the record + +Deletes: +- The silent extra-slot skip in the C# record decoder + (`CultDocumentMessagePackSerialization.ReadPersistedRecord`'s trailing `Skip` loop) and + its copy in `CultMeshSingleFileDocuments.ReadLegacyPersistedRecord`. +- The `?? "cultcache.store.v1"` defaulting of the header. +- Python `raw_record[:4]` slicing. +- The TypeScript and Python fallthrough to the legacy envelope decoder when the header is a + `cultcache.store.*` string they do not know. + +Adds, one rule in each runtime: a snapshot whose header is not `v1`, or whose record has more +than 4 slots, is refused with a message that names the version or the record key, and says +the store needs a runtime that resolves variants. C# accepts `v1` only, until C1 adds `v2`. + +Keeps: every v1 byte and every v1 test. + +Verification (rule: "unknown header or extra record slot is refused by name"). Each runtime +gets one test, and each test's negative is fixture B from section 1 (full payload plus slot +4) loading: +- `dotnet`: `dotnet test tests/GameCult.Caching.Tests --filter FullyQualifiedName~PreCut2StoreFormat` +- `node:22`: `npm install --no-audit --no-fund && cd packages/cultcache-ts && npm test` +- `python:3.12-slim`: `pip install -q msgpack -e packages/cultcache-py && python -m unittest discover packages/cultcache-py/tests` +- `rust`: `cd packages/cultcache-rs && cargo test` (message only; Rust already refuses) + +Subtraction: about −20 lines of skip and fallthrough; +4 small refusals and 4 tests. Build: +the 4 cache packages only. + +### C1. C# core: variant records, top-level Set overrides, resolution in the admitting hold + +Adds: +- **`CultPersistedRecord.Variant`**, record slot 4: `[baseKey, overrides[]]`. Payload slot 3 + is empty for a variant. An override is `[op, path[], id, value]`. + - Owner: `GameCult.Caching`. + - Consumer: both file stores and Studio. + - Invariant: an old reader refuses rather than misreads (section 1). + - Why no existing owner serves: the payload cannot hold the delta (probe D). +- **`CultStoredDocument.Variant`** (base key and overrides; null for plain records). + `Document` stays the resolved view. +- **A codec port on `CultCache`**: the `(serialize, deserialize)` pair `CultInspectorModel` + already takes, lifted. + - Owner: `GameCult.Caching.MessagePack`, supplied by `CultCacheMessagePack.Create`. + - Consumers: resolution and the inspector model. + - Invariant: one codec per cache; clones and override values use the store's encoding. + - `CultInspectorModel`'s constructor takes the port instead of its own pair, so there is one + pair, not two. + - A cache without a codec refuses variant writes. +- **Write API** on `CultCacheBatch`, with single-call equivalents: `UpsertVariant(key, baseKey, + overrides)`, `Flatten(key)` (Q1a), `Remove` unchanged. Rebase is `UpsertVariant` with a new + base. +- **`Validate` resolves** every admitted variant and every dependent of an admitted or + evicted base, in base-first order, against the post-batch set. It refuses, naming keys: + a cycle; a missing base; a different concrete type; a global type; an evicted base with + surviving variants; a variant whose resolved `[CultName]` equals its base's (R6); a plain + `Upsert` at a variant key (Q1a). **Not refused (Q4 c, operator 2026-09-29):** an override + naming a slot the type no longer has, or holding a value that no longer decodes into the + member's type, soft-drifts exactly as the same member would on a plain record under + `cultcache-schema-compatibility.md`. It is ignored with a warning naming the variant and + the member, and the variant inherits the base value. One rule, the existing soft-drift + path, never a variant-specific one. +- **`Apply` re-resolves dependents** in the same hold. Each emits `Updated` and is re-indexed. + A base change stamps no dependent `storedAt`. +- **Header**: the store writes `v2` iff it holds a variant (Q5a) and reads `v1` and `v2`. +- **Refusals** (Q6): `DirectoryMessagePackBackingStore` push and commit of a variant; + `CultNetDocumentRegistry` row building for a variant; `CultMesh.ReadSingleFileDocument` of + a variant key. +- **Contracts**: the variant record section in `cultcache-persistence-format.md`; one + sentence in `cultcache-schema-compatibility.md` saying overrides soft-drift like members + (Q4 c, no exception); a "variants: C# resolves; others refuse" row in + `runtime-parity-scope.md`. + +Authority map: +- Owner: `CultCache.Validate`/`Apply` owns the resolved view. +- Inputs: stored deltas, base records, the codec. +- Outputs: the resolved `Document`, index entries, changes. +- Demoted: the resolved `Document` is no longer a writable owner for a variant key (Q1a). + `storedAt` is the delta's identity only. +- Forbidden writers: store `Loaded` callbacks never resolve; Studio never writes a resolved + document to a variant key; CultNet never emits a variant row. +- Shared paths: a load (`Admit` with a source), a single write, a batch and a remove all pass + the same `Validate` and `Apply`. There is no second resolution path. + +Verification. New `VariantTests.cs`; each rule gets a positive and a named negative: +- a load with a variant resolves; +- a base edit updates the variant's `Get`, `GetByName` and `GetByIndex`, and `Watch` sees both + changes inside one publication, with no gap in `Sequence` between them. Negative: a + subscriber observing the base change must already read the new variant. +- `Expect` on the variant survives a base change; +- each refusal case, and the refusal message names both keys; +- the header is `v1` without variants and `v2` with them; +- a read-only store resolves; +- a variant round-trips byte-identically through flush. + +Cross-runtime vectors: the Caching interop peer gains `write-variant --file`. A test in +`packages/cultcache-ts/test/cult-cache.test.ts` asserts that TypeScript refuses that file by +name; Python and Rust tests read the same fixture from `contracts/cultcache/variant-store.cc`. + +Command, `dotnet`: +`dotnet test tests/GameCult.Caching.Tests && dotnet test tests/GameCult.Networking.Tests --filter FullyQualifiedName~Registry`, +then the C0 commands for `node:22`, `python` and `rust` against the new fixture. + +Subtraction: the inspector's own codec pair collapses into the port; otherwise net additive, +estimated +350 to 450 lines of core and +400 of tests. Build: the Caching and MessagePack +projects, Caching.Tests, the Networking test filter, the interop peer. + +**C1 status, 2026-09-29 (Self).** C1 landed on `hands/variants-c1` (`136adce`). Soul (Opus) found it +not closeable, and a fix batch is in Hands: +- **F1:** CultNet's live-change paths leak variants as plain records, which breaks Q6. +- **F3:** an undecodable override soft-drifted where a plain record refuses to load. +- **F4:** invalid overrides were accepted at write. +- **F2:** an inherited unique index value shadows the base, and the winner depends on order. + +**Self's readings and defaults, not new operator rulings:** +- **Q4 (c) read literally:** an override follows the plain-record outcome. A missing slot + soft-drifts; a value that no longer decodes refuses loudly, as a plain record does. +- **Invalid overrides are refused at write.** Drift covers type changes after the fact, not + bad writes. +- **F2 extends R6 to indexes.** A commit that leaves a variant sharing an indexed value + with another record is refused. +- **One override per slot.** + +**Open for the operator:** plain records with duplicate unique-index values are silently +overwritten today. That predates variants. Fixing it could refuse existing stores. + +**C2a status, 2026-09-30.** Hands pushed `hands/variants-c2a` at `640ad9a`. +- Element ids are 12 hex characters. Writes mint them at random. Load mints them deterministically. + Derived ids use `[CultElementId(nameof(Member))]`. +- The CDN chunk ref's id is its offset. The witness types carry ids, and the ids cross C#, TS, Python and + Rust. + +Soul held it. Fixes are in Hands: +- ids are never minted inside variant overrides; +- interface unions are never minted; +- a null derived source leaves an empty id; +- load minting is culture-dependent; +- the minted-on-load list goes stale; +- a refused batch leaves minted ids behind; +- the id format is unchecked; +- late union-slot reuse passes registration. + +**C2a rulings (operator, 2026-09-30):** +- **Old readers are tripwired.** A store that holds element ids carries a marker that every pre-C2a reader + refuses under C0's unknown-header rule. An old C# reader can therefore never silently strip nested ids. + MessagePack's generated formatters skip unknown slots inside elements. +- **Duplicate element ids refuse at load,** naming the record, the list and the id. This matches the + duplicate-index ruling. +- **C2b precondition (Soul F7).** Whether a pre-id element keeps its load-time id depends on the write path. + C2b must refuse an override that targets a record whose ids exist only in memory, or mint on open. + +**C2a Soul pass 2 (`e85b201b`), 2026-09-30: hold.** The tripwire only works against unreleased readers. +Every published release (`cultlib-unity-v1.0.60`, `caching-unity-v1.4.0`, `cultcache-ts-v0.14.0`, +`cultcache-py-v0.3.0`) predates C0. The 1.0.60 C# reader loads a v3 store, and its next write is v1 with the ids +stripped (probe). Other findings: +- F2: the same element object twice in one list commits, then the store refuses to load. +- F3: CultMesh single-file writes bypass the marker. +- F4: TS `pushAll` writes the header without reading it first. + +**C2a rulings, 2026-09-30 (operator):** +- **Rollout order closes the released-reader hole.** Ship a CultLib release that refuses v3, move every C# + reader of a store onto it, then let a C2a writer touch that store. There is no format change for this. + This supersedes the claim above that old readers are tripwired: that claim holds only for post-C0 readers. +- **Mark by content.** A store is written as v3 (v5 for directory stores) only when a record actually holds an + element id. An existing v3 header on disk stays. +- Fix batch 3 in Hands: F2, marking by content in every runtime, F3 routed through the cache's header + decision and load checks, F4. + +**C2a Soul pass 3 (`9ed61dd2`), 2026-09-30: fix first.** +- A flattened record's `HoldsIds` goes stale when its base changes in the same batch. +- A conditional commit onto disk ignores content. +- Rust `push_all` clobbers headers it cannot read. +- TS keeps a stale header after the file goes away. +- Self's claim that "rollout order makes the raw-writer hole benign" was wrong. The reader that strips ids + from a v1 store is a post-C0, pre-C2a build. That is exactly the reader the v3 marker targets, and rollout + order does not keep it away. + +**Ruling, 2026-09-30 (operator): C0 is released only together with C2a.** The first CultLib release that +refuses v3 also contains C2a, so no released reader strips ids. C0 and C1 are never released on their own. +Raw and cross-runtime writers that cannot see ids stay sticky-only. Fix batch 4 is in Hands. + +**C2a F2 ruled (operator, 2026-09-30, accepting Self's recommendation B): records nobody claims are carried +untouched.** A store may hold records under a schema id that no local type owns or lists as compatible, for +example after a rename that declared nothing. +- Both store kinds carry those records byte for byte under their own id. The catalog lists them as foreign + records. +- Writes to other records proceed. +- A write that would overwrite or relabel an unclaimed record is refused with a typed schema conflict. +- The single-file store's whole-view write stops relabelling such records onto local types. The directory + store stops refusing every commit while it holds one. +- Why: batches 8-9 showed that the danger is rewriting a record under a new identity (F1, F6), not an + undeclared old id. Batch 10's owner-beats-lister rule makes declaring an old id cheap anyway. +- Self's first lean, "refuse loudly" (A), is superseded. + +**C2a batches 9-10 (Soul pass on `fdb8a60a`, 2026-09-30): hold.** +- **F6, A-B-A lost update on the single-file store.** Ruled by Self: any write that changes a record's bytes or + schema id mints a later `storedAt`. +- **F8, batch 9 over-refused.** An owner beats a lister, so v1 and v2 coexist. +- **F9.** Compatible ids compare as a set. +- **F10.** Typed refusal errors in TS and Python. +- Batch 10 is in Hands. +- **F7 ruled (operator, 2026-09-30): retire `AsSchemaAlias`.** "Schema aliasing sounds like a really bad idea, I + support retiring it." + - C# refuses a second type for one schema, as TS, Python and Rust already do. There is one type per schema in + every runtime. + - The API, its registry path (`IsExactWireAlias`) and the tests that exercised it (7 Mesh, 2 Caching) are + deleted or rewritten. + - No consumer called it. + +**Operator rulings, 2026-09-30:** +- **Duplicate unique-index values do not load** ("Duplicate indices should not load"). This covers + plain records too, so R6-for-indexes becomes one general rule: + - a commit that would leave two records holding one indexed value is refused; + - a store holding duplicates refuses to load, and the refusal names both keys and the index. + - The variant-specific rule `RefuseVariantIndexSharing` collapses into this rule. + - Before it ships, every real store is scanned, so no store stops loading by surprise. + - **Scan result (Eyes, 2026-09-30):** `[CultIndex]` had been recycled as a grouping and + selection-filter declaration: `Category`, `Kind`, `HardpointType`, `ShardId`, and others in + CultMesh, Geometry and docs. AetheriaEve's `aetheria-world.cc` (taxidermy) is the only store + holding duplicates. The only single-result lookups in real code are unique: + `PlayerData.PlayerId` and `Email` in `Server.cs`. The operator: "Pretty sure indexes are + supposed to be unique, it was not my decision to recycle that mechanism for grouping + purposes" and "Grouping was a desirable feature from my old DatabaseListView that didn't + quite make it into the initial CultCache Studio port". + - **Resolution (Self, from those answers):** `[CultIndex]` means unique. Grouping belongs to + the Studio record-grouping campaign's own attribute (`docs/studio-grouping-cut.md` on + `codex/studio-grouping`, attribute-based per the 2026-09-17 ruling). CultNet selection + filters any declared member by its catalog name, so no index is needed for filtering. The + grouping-only `[CultIndex]` declarations are deleted. This is one CultLib cut, queued + behind C2a because both edit `CultCache.cs`. + - The TS/Python last-writer-wins parity gap closes by the same rule when those runtimes + adopt it. +- **CultNet invisibility is a defect** ("looks like a defect to me"): `cache.Commit` and + `cache.UpsertAsync` on a database's cache must publish to subscribers and to the mutation + log (`CultCache.Publish`'s `if (!loaded) continue;`). +- **Hop subscriptions keep refusing variants** until CultNet carries deltas (C5): "keep refusing, + I guess, CultNet will have deltas by the time we're done here anyway". + +### C2. C# element identity and nested paths (Set, Insert, Remove) + +Adds: +- **`[CultElementId]`** (a string member). **Ids everywhere, not opt-in (Q3, operator + 2026-09-29): there is no `[CultVariants]` attribute.** The C# registry requires an id member + on every object element type reachable through a list in any registered document type, + union bases included, and refuses a type that lacks one. +- **Minting**: on write, the cache mints ids for unset ids in every type, and refuses a + duplicate id within one list. A store written before ids existed loads, and its ids are + minted on its first write (minted on load, per the operator's rollout ruling). +- **Path steps below top level.** +- **Insert** anchored after an id, where `""` means the head. An inserted run sits + immediately after its anchor and before base elements added there later. +- **Remove** by id. +- **Canonical order**: removes, then inserts in list order, then sets by path. +- **Q2a refusal**: a base commit that orphans an override is refused. +- **Q7**: whole-member Set for dictionaries, scalar lists and arrays. +- **`CultCache.MintElementIds()`**: the one-shot rewrite for existing stores (ruling 1). It + upserts every record that has an unset id through the normal path. +- **The consumer sweep (Q3 rollout).** About 28 consumers carry list-element types, and each + needs an id member before it can take the CultLib that requires one. C2 ships the + requirement. Self schedules the per-repo sweep, one small type edit per consumer, before + those consumers bump. C2 lists the element types it finds per consumer, as data for that + sweep. + +Keeps: the C1 format unchanged. C2 fills path shapes that C1 refused. + +Verification: +- Two look-alike elements (two of one union subtype) get different overrides, and a base + insert before them retargets nothing. +- Rebase re-applies overrides by id. A missing id is refused, and the message names the + variant, path and id. +- A Set on a removed element is refused. +- Minting is idempotent. +- A registered type with an id-less list element type is refused, naming the type and member. +- A store written before ids loads, and its ids are minted exactly once on first write + (idempotent). +- A C#-written nested-override fixture joins `contracts/cultcache/`. + +Command: `dotnet test tests/GameCult.Caching.Tests`. + +Estimate +300 lines and +350 of tests. Build: as C1, without Networking. + +### C3. Studio: edit the delta + +Adds, in `CultInspectorModel` (engine-free; the lowering stays a renderer): +- For a variant edit, each member path is marked inherited or overridden. +- `Commit` writes `UpsertVariant` with overrides equal to the prior overrides plus a + structural diff by id. It is deterministic because ids exist. +- An explicit "override" pins a value equal to its base's. +- `ClearOverride(path)`. +- `CreateVariant(record)` next to `Duplicate`; it prompts for a name (R6). +- `Rebase(record, base)` returns a conflict list for Q2a before commit. + +Lowering, in `CultCacheStudioWindow`/`Drawers`: an overridden marker and a revert control per +member, a base link, and variant creation and rebase controls. + +Verification: +- `CultInspectorModelTests`: the diff produces exactly the touched paths; clear removes one + entry; the pin survives an equal value; rebase conflicts are listed. +- Negative: a Studio commit never calls a plain `Upsert` at a variant key. + +Only the operator can check these in Unity against a copy of `Aetheria.cc`: +- the markers read correctly; +- clearing reverts the value live; +- a hull variant replaces `Hardpoints`; +- a laser variant changes one behaviour's `PerformanceStat.Max`; +- a base edit shows in the open variant. + +Then tag `caching-unity-v1.5.0`. **This is the point where Aetheria is unblocked.** + +Estimate +250 model, +150 lowering, +250 tests. Build: Caching.Tests. The Unity package is +checked by the operator in the editor. + +### C4. Aetheria adoption (Aetheria repo, its own cut, after the release) + +- Bump the package to `v1.5.0`. +- Add `[CultElementId]` to every list-element type Aetheria's documents carry (ids everywhere, Q3). There is no per-type opt-in. +- Add `[CultElementId]` to `BehaviorData` (base) and `HardpointData`. +- Run `MintElementIds` once over `GameData/Aetheria.cc`. +- AetherDb migrations skip variants or use the variant API (Q1a). +- Re-author the families listed in section 6. + +### C5. CultNet deltas (C# reference) + +Adds a new raw-record message version that carries the variant slot, following selection D3: +a v1 message string, so peers not in this cut refuse through their own dispatch. The C1 +refusal in `CultNetDocumentRegistry` is deleted. Scheduled when a CultNet consumer needs +variants; none does today. + +### Parked: TypeScript, Python and Rust resolution + +Each runtime gets its own cut when a consumer that reads a variant-bearing store exists +(ruling 5). None does. `Aetheria.cc` is read by C# only. + +## 6. First payoff in `Aetheria.cc` + +Scan of the live file (206 records, `v1`): records of one schema whose leaves differ by at +most 20 percent, name excluded. This is a heuristic; the operator confirms the real families. + +| Type | Records | Families that collapse | Records becoming variants | +| --- | --- | --- | --- | +| geardata | 32 | Refinery / Assembly Line / Deep Ore / Surface Ore / Shipyard (1 to 3 leaves differ); Small / Medium / Large Drive; RevvITup 2.0 / deep space burnout / Talaria; Skiron / Iapyx; Arctica / cold like my heart | 10 | +| weaponitemdata | 18 | ChargeBlast SG / ChargeBlast+- (14 of 253 leaves differ); pswarm / scorched void policy; Earp / 6k Shooter; Spectra / ColdFire | 4 | +| hulldata | 5 | Longinus / LonginusX (only `Behaviors`, `Hardpoints` and two cosmetic members differ) | 1 | + +That is 15 of 55 equipment records. In most of these families the difference lies inside +`Behaviors`, so element-level overrides (C2) are what pay. Top-level overrides alone would +still copy each behaviour list. + +## 7. Consumers + +There are 28 projects: C# 13, Rust 9, TypeScript 10, Python 1, Kotlin 0 (Explore survey; +dependency-level for most, read in detail for Aetheria and AetheriaEve). +- **See variants:** Aetheria through C# `Get`, `GetByName` and `CultRecordRef` (resolved + documents only), CultCache Studio (deltas), and AetherDb tools (must honour Q1). +- **Must stay oblivious or refuse:** every other consumer. No other project reads + `Aetheria.cc`. Raw readers refuse through the empty payload plus C0/C1: `CultMesh` + single-file reads, AetheriaEve's directory-page reader (the directory store refuses + variants, Q6), and Mimir (writer only). + +## Schema identity across runtimes (Imagination, 2026-09-30) + +**RULINGS (operator, 2026-09-30).** +- **C1: agreed** ("Agreed on schema identity"). C# puts the declared version string on the wire as the schema id. + F-ID.1 follows Self's recommendation: the id is `.v`, not the bare schemaName. +- **F-ID.2: AetheriaEve is not a consumer.** Operator: "AetheriaEve is purely archaeological, I would recommend + archiving it purely as evidence of what happens when you try to build a game with hyperfocused agents and with + CultLib under construction. We might try again at some point, but it won't look anything like AetheriaEve." C1 + deletes the fallbacks that exist only for AetheriaEve's readers. It does not migrate those readers. +- **F-ID.3: stored C# hash ids.** Operator: "I have no idea". Self's default is to defer C2. C1 changes nothing on + disk. C# keeps reading its own `sha256` ids. F2 already makes other runtimes keep C# records byte-for-byte. C2 + gets mapped only when a cross-runtime store read of a C# store is actually needed. +- C1 is mapped (section "C1 cut: one schema id on the wire", below). **Operator, 2026-09-30: "Yes to both, defaults + are fine".** The per-binding wire-id override is deleted. A declared compatible id resolves on the wire, and the + owner beats a lister. All six defaults stand. Stonks is fixed in Stonks before C1 merges. Order: F2 Soul, then the + put-serve merge, then c2a merges main, then C1.0-C1.5. + +Probed at CultLib `hands/variants-c2a` 92d9e138. The probe ran on Yggdrasil in `ack1d-interop:2` from a scratch branch, which has since been deleted. Sources: `scratchpad/schema-identity-probe/`. Full output: `scratchpad/probe2.log` (store round trip, section 1), plus a wire rerun shown inline below. Every probe used one declared schema: the interop note, name `cultcache.interop-note`, version `cultcache.interop_note.v1`, with six members. + +### 1. How each runtime derives a schema id (probed) + +| Runtime | Id it stamps | Derived from | Carries name / version / content hash? | +|---|---|---|---| +| C# | `sha256:eafe3e…b249` | `sha256("name\|version\|slot:Member:ClrType:value/ref:target:one/many\|…")`. Recomputing it by hand gives the same id. | Store catalog: name, version, `contentHash = sha256(canonical JSON)`, canonical JSON, members. Wire: `schemaName`, `schemaVersion`, `schemaContentHash` are all filled. | +| TS | `cultcache.interop-note` | `definition.schemaId ?? schemaName ?? type`. There is no hash. With no declared version, the version defaults to `.v1`. | contentHash is whatever the author declares. The interop test declares the id string itself. | +| Python | `cultcache.interop-note` | `schema_id or type`. There is no hash. contentHash defaults to the id. | Same as TS. | +| Rust | `cultcache.interop-note` | `#[cultcache(type=…)]`. There is no hash. `schema = "CultCacheInteropNote"` never reaches the catalog. | The catalog entry it writes is fabricated: version `".v1"` (`cultcache.interop-note.v1`, not the declared `…_note.v1`), `members: []`, `contentHash = type`. | +| Kotlin (CultMesh only; it has no store) | `cultcache.interop_note.v1` | `codec.schemaVersion` | Nothing else. | + +On the C# fingerprint: +- **The id stays the same** when only the CLR class or namespace changes (V1). +- **The id changes** when a member is renamed (V2), a slot is appended (V3), `string[]` becomes `List` (V4), the version string changes (V5), or a slot is removed (V6). +- **V2 and V4 produce identical wire bytes.** MessagePack slot arrays carry neither member names nor CLR collection types. So the fingerprint witnesses the C# declaration, not the wire layout. + +The C# registry already refuses two CLR types for one `(name, version)` in a process. The probe crashed on exactly that when V6 and the base type shared an assembly. Inside C#, `(name, version)` is already the ownership key, and the hash adds nothing to ownership. + +### 2. Wire parity for identity does not hold (probed) + +No two runtimes agree, and C# is the only one that hashes. The CultNet interop harness is the parity witness in CI. It never exercises the C# default: `tests/GameCult.Networking.InteropPeer/Program.cs:77,201,1183-1196` binds every type with `ForDocument(schemaId: )`. + +What reads what today: + +- **Stores (`.cc`). C#, Rust, TS and Python all read each other's notes.** It works only because each reader, when the id is unknown, falls back to the embedded catalog's **schemaName**: C# `CultCache.cs:653` `BySchemaName`, TS `cult-cache.ts:827`, Rust `resolve_registered_type` `lib.rs:2754`. Round trip, C# → X → C#: + - Each writer stamps its own record with its own id. + - **A C# rewrite restamps every other runtime's record to `sha256:…`** and drops their catalog entries. + - **A Rust write destroys the C# catalog entry for the id it read.** The entry becomes name=`cultcache.interop-note`, version=`sha256:…eafe….v1`, contentHash=`sha256:…eafe…`, canonical JSON with `schemaName: "sha256:…"`, `members: []`. The C# record bytes survive, but their description is lost. That breaks F2 ("never relabels…") at the catalog level, and it is a defect whatever this fork decides. + - TS and Python kept the C# catalog entry intact. +- **Wire (CultNet raw record carrying a C# `sha256` id):** + +| Reader | `sha256:…` | `cultcache.interop-note` (name) | `cultcache.interop_note.v1` (version) | +|---|---|---|---| +| TS `CultNetDocumentRegistry.applyRawDocumentPut` (probed) | refused | ok | refused | +| Kotlin `CultCache.putRaw` (probed) | refused | ok (documentType) | ok | +| C# `CultNetDocumentRegistry.DeserializeRawDocument` (probed) | ok | ok | ok, **and `gamecult.unknown.v1` → `Note` too** | +| Python `cultnet_py` `resolve_document_for_raw_record` (read only) | only if declared | ok | ok, plus payload sniffing | +| Rust `pull_rudp_catalog_snapshot` (read only, per the Eyes sweep) | dropped silently | — | strips `.vN` and matches the type | + +C# accepts any id because `TryResolveDescriptorBySchemaAlias` and `TryResolveDescriptorByPayloadSchema` (`CultNetDocumentRegistry.cs:755-830`) read slot 0 of the payload as a schema version. Python does the same (`replication.py:160-196`). **Shape routing and aliasing are still live in C# and Python CultNet on c2a**, and so is C# request matching `CultNetSchemaAliasMatching` (`CultNetDatabase.cs:52-89`). F7 has not reached them. + +- **The C# wire id is readable only when the binding is overridden.** The probe showed `ForDocument(schemaId: "cultcache.interop-note")` emits that id with the same payload, name, version and contentHash. `CultMesh.CreateCultNetDocumentRegistry` (`src/GameCult.Mesh/CultMeshDocumentRegistries.cs:69`) never overrides it, so every C# CultMesh host publishes `sha256` ids. + +### 3. Live cross-runtime paths that depend on the fallback + +This section comes from the Eyes sweep. I spot-checked the Hermodr lines, the Odin rule and `CultMeshDocumentRegistries.cs`; the rest I only read. Every one of these paths is **TS reader → C# host (the Aetheria daemon in `F:\Projects\AetheriaEve`)**. + +| # | Consumer | Asks for | Works via | Under C1 | +|---|---|---|---|---| +| 1 | `EveElectron/src/cultmesh-provider-client.mjs:129-143`, started by `AetheriaEve/Aetheria.Rts.Web/Electron/main.ts:65` | `gamecult.eve.provider_advertisement.v1`, `…surface.v1`, `gamecult.fields.*.v1`, `…command_receipt.v1`, `gamecult.cultmesh.cdn.asset_blob.v1` | cultmesh-ts HELD `firstRecordAtKey` | Exact match. The exception is `cdn.asset_blob.v1`: **no writer anywhere declares it**, so that read needs a declaration. | +| 1b | same file, lines 94-108 (command put) | `gamecult.eve.command_invocation.v1` | C# inbound alias (g), probably | Exact match | +| 2 | `AetheriaEve/Aetheria.Rts.Web/Electron/aetheria-cultmesh.ts:138-147, 345-406` (only the verify-stage7* scripts use it) | `gamecult.aetheria.*.v1`, `gamecult.fields.*.v1` | first-record fallback | Exact match | +| 3 | `Hermodr/src/hermodr-daemon.cjs:1335-1363` | provider state, surfaces, CDN | Its own `|| candidates[0]` / `|| documents[0]`, plus C# request alias (f) | Exact match. Delete both fallbacks. | +| 4 | `AetheriaEve/scripts/aetheria-browser-provider-witness.ts:49-60` (a witness, not product code) | eve schemas | cultmesh-browser `recordMatchesSchema` name/version arms | Exact match | +| 5 | `aetheria-cultmesh.ts:408-411`, local `.cc` read | same ids | none: probably already broken (unverified) | still a store-path question | + +**Paths that already work without a fallback, because everyone hand-stamps `.vN`:** +- The Aetheria daemon and Gjallar hand-stamp `.v1` puts to Odin: `Program.cs:4574-4830` and `Gjallar/Program.cs:3040-3080`. +- Odin **refuses any id without `.vN`**: `Odin/crates/odin-daemon/src/main.rs:1310-1326`. +- Rust hosts bind `.vN` through `cultmesh_documents!`: Ghostlight, Epiphany, Muninn. +- Kotlin uses its schemaVersion. +- The Eve C# declaration itself reads `[CultDocument("gamecult.eve.provider_advertisement", SchemaId)]` with `const SchemaId = "gamecult.eve.provider_advertisement.v1"`. Authors already treat the version string as the id. + +Scope flag: every broken consumer lives in `AetheriaEve`, which the CultCache campaign ruled "taxidermy". The operator should confirm those paths are live consumers of this campaign before any cut is shaped for them. + +Stored data: +- `Aetheria/GameData/Aetheria.cc`, `run.cc` and `player.cc` hold 21 C# schemas under `sha256` ids. The Eyes sweep found only C# readers. +- The versions there are the bare string `"1"`: `[CultDocument("aetheria.faction", "1")]`. So a version string is not globally unique across the estate. +- TS stores (Bifrost, VoidBot, weksa, Stonks) are TS-only and hold readable ids. +- Odin's Rust store holds `.vN` ids. + +### 4. What the C# fingerprint protects + +A C#-to-C# store read. A record whose declaration drifted misses the exact id and falls to the persisted-catalog comparison: `CompatibleDrift`, or refused as incompatible (`CultCache.cs:900-936`). + +Across runtimes it protects nothing today: +- The other runtimes do not compute it. +- Their content hashes are placeholder strings. +- The C# wire receiver accepts any id through payload sniffing (probed). +- The hash reacts to renames and CLR collection spellings, which do not change wire bytes (probed V2, V4). + +### Fork F-ID: what names a schema across runtimes + +**(A) Every runtime computes the C# semantic fingerprint; readers name schemas by definition.** +- Every non-C# runtime has to emit C# type spellings: `System.String[]` versus `System.Collections.Generic.List`. +- Rust has to start declaring members and versions at all. +- String-named readers can no longer name a schema. Eve Electron and Hermodr read ids from provider advertisements. +- Odin refuses the ids outright (`.vN` rule). +- Every TS, Python and Rust store holds readable ids. Under no-relabel those records become permanently held unless each runtime lists its old ids. +- Gain: a layout witness that is still over-sensitive (V2 and V4 change the id with no wire change). +- Stored data: Aetheria is untouched; every non-C# store is orphaned. +- Not recommended. + +**(B) Readers match the declared `(schemaName, schemaVersion)` pair the envelope carries.** +- The C# wire already carries both. Store catalogs carry both. +- Two identity strings stay in play: the id for storage, the pair for lookup. That is a split owner. +- `sha256` ids still reach Odin, which refuses them. +- The version alone is ambiguous (Aetheria's `"1"`), so every reader API has to take a pair instead of the one string readers pass today. +- Rust writes a fabricated version, so pair matching against a Rust host fails until Rust declares versions. +- Layout protection is only as good as a contentHash comparison, and no runtime but C# computes a real one. +- Stored data: unchanged, and nothing is relabelled. Resolution becomes pair matching against the catalog, which is a formalised form of today's schemaName fallback. + +**(C) C# puts the readable id on the wire, and the id is the declared version string `.v`.** + +This is what Odin enforces, Rust and Kotlin use, and Eve and Gjallar already hand-stamp. +- C1, wire only: + - `ForDocument` and `CultMesh.CreateCultNetDocumentRegistry` default the binding id to `descriptor.SchemaVersion`. + - Registering a wire binding whose version lacks `.vN` is refused. Aetheria's `"1"` types are not on the wire today. + - Then delete the HELD first-record fallback (cultmesh-ts), Hermodr's two fallbacks, the name and version arms of cultmesh-browser `recordMatchesSchema`, C# `TryResolveDescriptorBySchemaAlias`, payload sniffing and `CultNetSchemaAliasMatching`, and the Python CultNet alias map and sniffing. That finishes F7 on the wire. +- C2, the store as well, as a later cut: C# stamps new writes with the version id and resolves an old `sha256` record by the type's own **computed** former fingerprint. That is a derivation, not an alias. Where a version string changes (Aetheria's `"1"` → `aetheria.faction.v1`), the old id goes into the existing `CompatibleSchemaIds`. +- The fingerprint is demoted to `schemaContentHash`, which the wire already carries. It stays a C#-to-C# drift witness and does not decide identity. +- Costs: + - C#: the default in two files, plus deleting the alias and sniffing paths. + - TS, Hermodr and Python: deletions only. + - Rust and Kotlin: none. + - Mixed-version C# peers: an old host sends `sha256` and a new receiver without sniffing refuses it, so C# peers upgrade together. + - Eve Electron `cdn.asset_blob.v1`: needs a declaring writer. +- Stored data: C1 changes nothing on disk. Under C2, Aetheria's catalogs are read unchanged and records are restamped only when C# rewrites records it understands, which F2 allows. TS, Rust and Odin stores are untouched. + +**Recommendation: C1 now; decide C2 separately.** C1 is the only option where one string names a schema on every runtime and at Odin, where every reader already asks for that string, and where the work is almost entirely deletion. It makes the F7 retirement possible on the wire, because readers no longer need a fallback to find their records. Aetheria's `.cc` files are untouched. B keeps the split and A breaks every readable-id store. Separately from F-ID, the Rust catalog-destruction defect (§2) and the live C# and Python CultNet aliasing should be admitted as findings or follow-ups whatever is ruled. + +**Sub-questions for the operator:** +- F-ID.1: Is the id the version string (`.vN`, as Odin, Rust, Kotlin and Eve do), or `schemaName`, which CultLib's own TS and Python tests use and which is also TS's default? +- F-ID.2: Are the AetheriaEve consumers live for this campaign? +- F-ID.3: Should C2 (store identity) be mapped now, or deferred until a non-C# reader of a C# store exists? + +### Probed versus read + +- **Probed:** + - All C# ids and variants, and the hand-recomputed fingerprint. + - The TS and Python default ids. + - Rust's id and catalog entry, from store bytes. + - Kotlin's id and its accept/refuse behaviour. + - Store round trips C#→Rust/Python/TS→C#, with bytes, including the C# restamp and the Rust catalog destruction. + - C# wire record bytes, default and overridden. + - C# CultNet accepting any id. + - TS CultNet exact-id behaviour. +- **Read only:** + - Python CultNet aliasing and sniffing, and Rust `pull_rudp_catalog_snapshot` dropping unknown records. + - C# request alias matching (f). + - Every consumer path in §3, from the Eyes sweep. I spot-checked Hermodr 1335-1363, Odin 1310-1326, `CultMeshDocumentRegistries.cs:69` and the Eve declaration. + - Path 1b/2b's dependence on (g). + - Path 5 being broken. + - The Aetheria `.cc` catalogs were decoded from the files, with no git. + +## C1 cut: one schema id on the wire + +Imagination, 2026-09-30. This maps the operator's C1 ruling. On the wire, a document's schema id is its declared +version string, `.v`. Every runtime stamps it and every runtime resolves it exactly. A wire binding whose +version lacks `.v` is refused. The AetheriaEve readers are archaeology, and C2 (store identity) is deferred. + +**Anchors.** Line numbers are against CultLib `hands/variants-c2a` at `976b57f1`. That commit is F2 in progress, the +Rust catalog lay-back. I read it from a `git archive` snapshot and did not touch the worktree. Where main +(`4a7fa1d6`, code as of `daedfdd6`) or `hands/cultmesh-put-serve-bound` (`fa34b685`) differs in a file C1 edits, it is +said at the spot. Each anchor also names its symbol, so it can be found again after c2a merges main (see Sequencing). + +### 0. Probe facts + +These are new and were run, not inferred. The sources are in `scratchpad/c1-probe/`. They ran on Yggdrasil in +`ack1d-interop:2` from the scratch ref `refs/scratch/c1probe`, a detached commit on `976b57f1` that is deleted after +this pass. Output is in `scratchpad/c1-probe3.log`. The run was commit `43677b97ac`. + +- **P-VER: a C# version change does not orphan stored records.** The probe used two builds of one type, + `probe.faction`, declared first with version `"1"` and then with `"probe.faction.v1"`, plus a sibling + `probe.ship "1"`. The same members. + - The id changes: `sha256:64eb…` becomes `sha256:0603…`. + - The new build reads the old store through the catalog's schema name (`Claimant`, `CultCache.cs:697`) and reports + `CompatibleDrift` with warnings `compatible_schema_id_drift` and `content_hash_drift`. The record decodes. + - **Opening and flushing without edits leaves the file byte-identical** (1529 bytes, old id). + - **Upserting restamps** that record and its catalog entry to the new id. The untouched sibling keeps its own. + - The old build then reads the rewritten store the same way. + - So a version-string change is a restamp on the next write, not an orphan. This holds only while one local type owns + the schema name. Two local versions of one name make the fallback ambiguous and it throws (`CultCache.cs:697-705`). + - C1 does not need this. It is recorded for C2. +- **P-WIRE: what C1 changes on the C# wire.** + - Binding both types by their version string: with `"1"` twice, c2a's `Register` refuses the second binding + (`CultSchemaConflictException … schema id "1"`). With `probe.faction.v1` and `"1"`, it accepts both. + - The default wire id is still sha256 in both builds. + - With an unbound registry, `DeserializeRawDocument` returned `Faction` for `"1"`, `probe.faction` (the name) and + `probe.faction.v7` (a version nobody declared). Only `some.other.v1` was refused. + - So today a C# receiver resolves a version it has never seen by stripping `.vN` and matching the name. That is the + path C1.0 deletes, and the negative check in §8 pins its death. + +Earlier facts this map rests on, from the §1-§4 probes above: C# hashes the version into the id (V5). The C# wire +id is sha256 unless the binding overrides it. C# CultNet accepts any id through sniffing. TS refuses a version id. +Kotlin stamps its version. + +### 1. What the consumer sweep settles + +This comes from three Eyes-class sweeps over F:\Projects. I read the rows marked (R); the rest were confirmed by the +sweeping agent reading the files. + +- **Aetheria's `"1"` versions never reach the wire.** Aetheria has no CultNet or CultMesh code. `Aetheria.Shared.csproj` + references only the caching assemblies. So C1's refusal never fires for its 24 declarations, and **nothing in + Aetheria changes, on disk or in source.** +- The other C# `"1"` declarations are in StreamPixels `apps/overlay-unity` (24). They are client-only and never bound: + frame ids map to types by hand (`OverlayFrameDocuments.cs:98-116`). +- Every C# type that is bound in any repo already declares `.vN`: AetheriaEve 61, AquaSynth 28, Mimir 37, Brokkr, + Eve, Gjallar, Ymir, Delvehold. **No repo outside CultLib passes `ForDocument(schemaId:)`.** +- **Live C# hosts with default (sha256) bindings:** + - AquaSynth, `AquaSynthCultNetDaemon.cs:431-449`, 19 bindings. Its peers are C# (`AquaDaemonClient.cs`). + - Mimir: `EveDashboard/Program.cs:877-886`, read by Eve Android, which ignores schema ids + (`MainActivity.kt:618-625`); and `CultMeshMedia/Program.cs:277`, C#. + - Delvehold: no server. + - All of these are C#-to-C# or id-blind. They change id together when they rebuild on C1, so no shim is needed. +- **The C# publishers to Odin bypass bindings.** AetheriaEve `Program.cs:4574-4831` and Gjallar `Program.cs:3045,3069` + build their ids by hand and serialize payloads directly. C1 does not change them. Odin's rule is at + `Odin/crates/odin-daemon/src/main.rs:1311-1326` (R). +- **Every Rust wire binding in every repo already binds `.vN`** through `cultmesh_documents!` or + `for_entry_with_schema_id` with `.vN` constants: Odin, Muninn, Ghostlight, Epiphany, Ratatoskr, Huginn. No consumer + uses bare `for_entry::()`. +- **The AetheriaEve readers are archaeology:** + - EveElectron's only code consumer is AetheriaEve (`Aetheria.Rts.Web/package.json:30`). + - Hermodr was parked on 2026-09-30: `gamecult-ops/inventory.md:631-634`, `runbooks/odin-yggdrasil.md:35-48`, and + `scripts/idunn/idunn-deployment-targets.ps1:36-46` (status "archived"). + - cultmesh-browser has two consumers. One is the AetheriaEve witness. The other is CultLib's own sample + `samples/eve-browser-network/browser/main.ts:8`. + - **So C1 edits neither Hermodr nor EveElectron.** Both are archived, so C1 deletes the CultLib fallbacks that exist + only for them and does not migrate them. +- **Non-C# consumers that change id under C1:** + - **Stonks is the only one that breaks.** `F:\Projects\Stonks\src\stonks-daemon.cjs:152-195` declares + `schemaVersion: "v1"` on six definitions, one of them `provider_advertisement` published to Odin at `:303`. Under + C1 its TS registration is refused. Stonks loads `../CultLib` from disk, so it breaks on the first restart after C1 + reaches that checkout. The fix is in Stonks: set each `schemaVersion` to its current `schemaId`. That is six lines, + and they land before C1 is merged to main. + - Bifrost `tools/agent-transport.mjs:62-66`: the id is hyphenated (`…update-request.v0`) and the version has + underscores (`…update_request.v0`). The wire id changes to the version. The snapshot and apply sides are the same + tool on one pinned CultLib (`f67f5122`), so they change together. Its store keeps the hyphenated id. + - Brokkr Python `surfaces/blender/brokkr_bridge/blender_target.py:630-637` declares eight type-only definitions whose + type already ends in `.v0`. The Python default version would make the wire id `….v0.v1`. The fix is in Brokkr: + declare `schema_version=`. No live reader was found, so this is hygiene, not a break. + - repixelizer: `verse_state.py:139-230` declares version ≠ id. Its wire id moves to the `.v0` version, which Odin + accepts. + - Everything else already has id == version: VoidBot, Vili, weksa, Heimdall, StreamPixels, Bifrost's other tools, + Hermodr. + - VoidBot's persona stores use a vendored cultcache-ts and are untouched. +- **Raw health puts are out of C1's reach.** Vili, Stonks, weksa, Bifrost and repixelizer send hand-built + `idunn.daemon_health` with no version, and Bifrost sends `idunn.signed_daemon_health`. These never register a + binding. No receiving binding was found in Idunn or Odin main. That is Soul's consumer check, not a C1 edit. + +**Q3, settled:** no declaration in any repo has to change to satisfy the refusal on a binding that actually exists. +Aetheria and the StreamPixels overlay are the `"1"` repos, and neither binds. Stonks's `"v1"` is TS; it is fixed in +Stonks and touches no store. Stonks's store keeps the ids it holds today, because TS stores under `schemaId`. So +**no declaration change touches disk.** Whether a future change of Aetheria's version string would orphan its records +is the P-VER probe in §0. It is recorded for C2 and not needed by C1. + +**Q4, settled:** C1 changes no store record in any runtime. The store id and the wire id become two derivations: +- C#: sha256 on disk, version on the wire. +- TS: `schemaId ?? schemaName ?? type` on disk, version on the wire. +- Python: `schema_id or type` on disk, version on the wire. +- Rust: the store id and apply-path stamping are unchanged (see C1.4). +- Kotlin: version for both, as today. + +Four places where one variable serves both today must be split. Each has its cut below: +- TS `replication.ts:363-368`, `schemaIdForEnvelope`, which serves the stored id. +- Python `cultmesh_py/node.py:767` and `interop_peer.py:1085`. +- The C# durable shard log, `CultNetShardMutationLogStorage.cs:75-88`. It persists wire-form entries, and so it is the + one C# store that holds wire ids. +- Rust `pull_rudp_catalog_snapshot`, `cultmesh-rs/src/lib.rs:742`. + +### 2. Authority map + +- **Owner.** The declaration's version string is the only wire identity: + - C# `CultDocumentAttribute.SchemaVersion` → `CultDocumentDescriptor.SchemaVersion`; + - TS `definition.schemaVersion`, defaulting to `${schemaName}.v1`, through `schemaIdentityOf(...).schemaVersion`; + - Python `schema_version`, defaulting to `f"{schema_name}.v1"`; + - Rust: the version given to `cultmesh_documents!` or `for_entry_with_schema_id`; + - Kotlin `codec.schemaVersion`. +- **One derivation per runtime:** + - C#: `CultNetDocumentRegistry.WireSchemaId(descriptor)` returns `descriptor.SchemaVersion`. It is the single place + `.vN` is checked, and it is also called eagerly from `Register`. + - TS: `wireSchemaIdOf(definition)` in cultnet-ts. + - Python: `wire_schema_id(definition)` in cultnet_py. + - Rust: `CultNetDocumentBinding::schema_id`, which is already the version. + - Kotlin: `codec.schemaVersion`. +- **Inputs:** the declaration only. Never a payload, a schema name, an inferred name, a record's position in a + response, or a stored record's id. +- **Outputs:** every schema id that crosses a process boundary: + - raw records, puts and deletes; + - snapshot and selection responses, headers, edges and cursors; + - database change messages and shard-log entries; + - snapshot, subscribe and selection filters, and the shard catalog; + - the document-payload schema catalog; + - CultMesh projection-source and state-binding records. +- **Resolution.** A wire id resolves to the binding that owns it (exact). Otherwise it resolves to the one binding that + *declares* it compatible (`CompatibleSchemaIds`, owner beats lister), which is the rule stores already use. **OQ-C1.2 + decides whether declared compatibility applies on the wire.** Anything else is refused. +- **Derived state after C1:** + - C# `descriptor.SchemaId` (sha256) is **store-only**. It keys CultCache, `_predictedDocuments`, + `_lastWriteSequence`, and in-process dictionaries. + - TS and Python `schemaId` are **store-only**. + - `CultNetDocumentBinding.SchemaId` is **derived** (the version). It is no longer an owner. + - `schemaName` is **metadata only**, never matched. + - Payload slot 0 or `schemaVersion` is **data only**, never read for routing. + - `schemaContentHash` is a **C#-to-C# drift witness**, carried and never matched. +- **Forbidden writers, all deleted:** + - C#: `CultNetSchemaAliasMatching`, `TryResolveDescriptorBySchemaAlias`, `TryResolveDescriptorByPayloadSchema`, + `PayloadMatchesSchema`, `TryReadSchemaVersion`, both `InferSchemaName`, `ResolvePayloadSchemaCandidates`, + `ExpandSchemaBindingAliases`, the `ForDocument(schemaId:)` override (OQ-C1.1), the CultMesh `aliased` and + `byPayload` branches, and the descriptor-name and version keys in the C# and TS mesh catalogs; + - TS: `firstRecordAtKey`, cultmesh-browser's name and version arms, `shard-catalog.ts` `inferSchemaName`, and + `inferCultMeshSchemaName` / `bySchemaNameVersion`; + - Python: the name and version keys in `schema_document_map`, `_infer_schema_version_from_payload`, and every + `_infer_schema_name`; + - Rust: `strip_schema_version_suffix` and `selection::schema_alias`; + - Kotlin: `codecs[schemaId]`, the documentType fallback. +- **Shared paths.** Put, delete, snapshot (v0, v1, raw), selection, subscription, database change, shard log (live and + replayed from disk), shard catalog, schema catalog, and CultMesh peer reads all take the id from the one derivation. + A served stored record is stamped by the derivation, never by its stored id. + +### 3. Deletes first (C1.0, subtraction) + +C1.0 deletes every inference path and makes each comparison exact against the existing wire id: the binding id, or +sha256 for an unbound type. C#-to-C# peers keep working. Only readers that relied on a fallback stop resolving, and +those are the AetheriaEve readers, which are archaeology. C1.0 adds no behaviour; C1.1 flips the id. + +**C#, `src/GameCult.Networking`:** +- `CultNetDatabase.cs:47-104`: delete the whole `CultNetSchemaAliasMatching` class (58 lines, public). + - Replace every caller with an exact `string.Equals` against the registry's wire id for the descriptor. + - Callers: `:143, :150` (`ClientAuthorityScope.Matches`); `:252, :260` (`Shard.Matches`); `:1757` (shard-catalog + filter). + - `Shard.Matches(string)` and `ClientAuthorityScope.Matches(string)` compare a configured id with the wire id. + - `EnsureClientAuthority(string)` at `:1640-1652` has no callers; delete it. +- `CultNetDocumentRegistry.cs`: + - Delete `:779-799` `TryResolveDescriptorBySchemaAlias`, `:813-830` `TryResolveDescriptorByPayloadSchema` (public), + `:832-842` `ResolvePayloadSchemaCandidates`, `:852-854` `PayloadMatchesSchema` (public), `:865-898` + `TryReadSchemaVersion`, `:900-910` `InferSchemaName`, and `:538-578` `ExpandSchemaBindingAliases` with its comment. + About 175 lines in all, doc comments included. + - `ResolveDescriptorForRawDocument` (`:755-765`) and `ResolveDescriptorForSchemaId` (`:767-777`) collapse into one + exact lookup. It uses `_bindingsBySchemaId`, or, for a registry with no bindings, the one descriptor whose wire id + equals the id. A miss throws `InvalidOperationException` naming the id. + - Call sites stay on the one method: `CultNetDatabase.cs:717, 947, 998, 1234, 1455`, + `CultNetDatabaseSubscriptionClient.cs:254`, and `CultNetDocumentRegistry.cs:691, 713`. +- `CultNetDocumentRegistry.cs:407, 507`: drop the `ExpandSchemaBindingAliases` calls. `CultNetDatabaseServer.cs:566-567` + and `CultNetDatabaseSubscriptionServer.cs:559-560` pass the selection unchanged. +- `CultNetSelection.cs:393, 453` and `CultNetSelectionEvaluator.cs:88, 422`: exact comparison against the wire id. + - The evaluator reads only descriptors, so C1.0 gives it the registry's `WireSchemaId` as a `Func`. + - After C1.1 the id is `descriptor.SchemaVersion`, and the parameter collapses to that (see C1.1). + - `CultNetSelection.cs:178` doc: "schema ids", not "or aliases". + +**C#, `src/GameCult.Mesh`:** +- `CultMesh.cs:2724-2774` `ReadDocumentFromSnapshotResponse`: delete the `aliased` and `byPayload` branches + (`:2744-2745, 2754-2757`). Pick `exact` or throw. Rewrite the comment block at `:2724-2733`. +- `CultMesh.cs:3441-3464` `IsSameCultDocumentSchema`: the id is local (a `CultNetDatabaseChange` sha256). Replace with + `schemaId == descriptor.SchemaId`, or `storedDescriptor.SchemaId == descriptor.SchemaId`. Delete the comment + claiming "every … decision goes through" the matcher. +- `CultMeshSnapshots.cs:982-985` `DecodeSnapshotDocuments`: keep only `canDeserializeWithBinding`, or + `record.SchemaId == wire id of TDocument`. +- `CultMeshDocumentRegistries.cs:64-71`: the `GroupBy(SchemaId)…Reverse()` loop is left over from aliasing. With c2a's + `Register` refusal, collapse it to one `Register` per distinct type. +- `CultMeshPrimitives.cs` ~`1806-1860` and ~`1996-2050`, the C# `CultMeshDocumentCatalog` and + `CultMeshCollectionCatalog`: drop the schema-version and schema-name keys. A lookup by schema answers by the handle's + type only. **A lookup that more than one handle answers is refused, naming their document ids.** This is the "typed + catalog lookup returns the last handle added" defect, and TS has the same fix below. + +**TS:** +- `cultmesh-ts/src/index.ts:6297-6328` `requestCultNetRawSnapshotDocument`: delete the HELD comment, the + `firstRecordAtKey` option, and `?? atKey[0]`. Delete the caller's `firstRecordAtKey:` at `:2691`. +- `cultmesh-ts/src/index.ts:6175-6191` `normalizeCultMeshDocumentSchema`: drop the `inferCultMeshSchemaName` arm and the + version-from-id arm, and delete `inferCultMeshSchemaName` at `:6228-6238`. +- `cultmesh-ts` catalogs: `CultMeshDocumentCatalog` `:1462-1519` and `CultMeshCollectionCatalog` `:1688-1731`. + - Delete `#bySchemaNameVersion`, `cultMeshSchemaNameVersionKey` (`:6220-6226`), and its arm in + `cultMeshRefuseSecondCatalogType` (`:6197-6218`). + - `tryDocument` and `tryCollection` answer by type or by wire id. When `#byType` holds several handles for one type + (`add` at `:1482` overwrites, so today the last one wins), the lookup is refused with the handles' document ids. + That needs `#byType: Map`. +- `cultmesh-browser/src/index.ts:770-774` `recordMatchesSchema`: exact `record.schemaId === requestedSchema`. Callers + are `:704, :721`. After C1.2, CultLib's `samples/eve-browser-network` asks by version. +- `cultnet-ts/src/shard-catalog.ts:103-130`: `schemaIdsMatch` becomes `===`. Delete `inferSchemaName`. + +**Python:** +- `cultnet_py/replication.py:21-30` `schema_document_map`: key by wire id and compatible ids only; drop `schema_name` and + `schema_version` keys that differ from the wire id. +- `replication.py:158-194`: `resolve_document_for_raw_record` becomes `dict` lookup or `KeyError`. Delete + `_infer_schema_version_from_payload` and `_infer_schema_name`. +- `cultnet_py/shard_catalog.py:143-154`: exact. +- `cultmesh_py/node.py:1311-1343`: `_schema_matches_request` and `_document_matches_schema_id` become exact; delete + `_infer_schema_name`. +- `cultmesh_py/server.py:687-721`: the map copy and request filter become exact; delete `_infer_schema_name`. +- Keep `_documents_alias` / `_resolve_document_alias` (`node.py:1188-1243`). They compare local definitions, not wire + ids (follow-up F-C1-PYALIAS). + +**Rust:** +- `cultmesh-rs/src/lib.rs:750-773`: delete `strip_schema_version_suffix`. `registered_document_type_for_schema` becomes + `binding_by_schema_id(..).map(|b| b.document_type.clone())` and nothing else. Delete the `documents.binding(schema_id)` + type-name arm. +- `cultnet-rs/src/selection.rs:709-851`: delete `schema_alias`, tests included. Its uses at `:1432, 1487, 1651, 2112` + become exact comparisons against the row's binding id. +- `cultnet-rs/src/snapshot_query.rs:160-181` `RawSnapshotRow`: stop defaulting `schema_name` to the id; it reaches + `schema_alias` from `serve_read_only_raw_snapshot` (`:129`). + +**Kotlin:** `cultmesh-kotlin/.../CultMesh.kt:154-155` `codecForSchema`: drop `?: codecs[schemaId]`. That also fixes +`deleteBySchema` at `:170-171`. + +**Not edited, archaeology:** Hermodr `hermodr-daemon.cjs:1335-1363`, EveElectron, and AetheriaEve's own readers. + +**Tests deleted or inverted in C1.0.** Each rule that dies keeps a test that proves it is dead. +- C#: + - `NetworkingTests.cs:3177` (a selection by version matches through the alias): invert to not-found before C1.1. + - `NetworkingTests.cs:4022` (foreign id by sniffing): invert to refused. + - `NetworkingTests.cs:4109, 4140, 4276, 4317, 4366` (shard and scope configured by version): configure by the wire id. + - `CultNetSelectionFixBatchTests.cs:121, 158` (name alias): invert. + - `CultMeshStreamingTests.cs:2638-2708, 3062, 3105` (payload fallback): invert to refused or skipped. +- TS: + - `cultmesh.test.ts:3061-3074, 3244-3249` (HELD): invert to not-found. + - `cultmesh.test.ts:1170-1196, 1241-1286`: catalog by version against a sha256 handle. + - `cultnet.test.ts:1064-1068` (shard by name). + - `cultmesh-browser.test.ts:139, 452, 530, 536, 692-697`. +- Python: + - `test_cultnet.py:1685-1726, 2059-2063`. + - `test_cultmesh.py:291-339, 343-379` (drop the name case). + - `test_cultmesh.py:4150-4302` (sniffing and deletes by version against a sha256 id). +- Rust: `tests/selection.rs:2134, 2151, 2179, 2193, 2216-2219`. + +### 4. C1.1: the C# wire id is the version + +This is a behaviour cut on `src/GameCult.Networking` and `src/GameCult.Mesh`, plus the shared selection fixture with +Rust. + +**The store id and the wire id stay separate.** `descriptor.SchemaId` (sha256) keeps keying CultCache and every +in-process dictionary. The wire id is `descriptor.SchemaVersion`. Once the override is deleted (OQ-C1.1), the wire id +derives from the descriptor alone, with no registry. That is what lets the selection evaluator, the mesh and the +database compute it without a binding. + +**How a C# reader maps `.vN` to its descriptor:** +- `_bindingsBySchemaId` is keyed by `binding.SchemaId`, which now equals `SchemaVersion`. +- An unbound registry looks the version up among its descriptors. +- C# already refuses two types for one `(name, version)` in a registry (`CultCache.cs` `RegisterDescriptor`, "One type + owns a schema"), and c2a's `Register` refuses two types for one binding id. So an exact version lookup has at most one + answer. +- Two types sharing version `"1"` cannot both be bound, because `"1"` is refused first. + +File changes: +- `CultNetDocumentRegistry.cs:76-135` `ForDocument` and `ForDocument(Type…)`: delete the `schemaId` parameter + (OQ-C1.1). The binding id is `descriptor.SchemaVersion`. +- `CultNetDocumentBinding`: the internal constructor at `:44` takes the id from the descriptor. +- `CultNetDocumentRegistry.cs:173` `Register`: before c2a's conflict check, refuse a binding whose id fails + `^.+\.v[0-9]+$`. Throw `CultSchemaConflictException` or `ArgumentException`, naming the type, the declared version, + and the rule. The refusal happens at registration, never at first send. +- `CultNetDocumentRegistry.cs:675-676` `WireSchemaId`: becomes `descriptor.SchemaVersion`, checked by the same rule, so + an unbound `"1"` type is refused when it is first emitted. Every emitter below calls it. +- `CultNetDocumentRegistry.cs:616-645` `ToRawRecord`: the synthesized binding at `:621-626` uses `WireSchemaId`, not + `descriptor.SchemaId`. +- `CultNetDocumentRegistry.cs:217-228` `CreateDocumentDeleteMessage(string schemaId…)`: add + `CreateDocumentDeleteMessage(messageId, CultRecordHandle)`, which derives the wire id. Keep the string overload, + documented as "the wire id". +- `CultNetDatabase.cs` emitters: publish the wire id wherever a `CultNetDatabaseChange.SchemaId` leaves the process. + - `CultNetDatabaseServer.cs:555/581` (removal change) sends `WireSchemaId(descriptor)`, not `change.SchemaId`. The + change record keeps the sha256 locally. + - `CultNetDatabase.cs:1554` `ToLogEntryMessage` `Delete.SchemaId` becomes the wire id. + - `CultNetDatabase.cs:1512` `ApplyCommittedDelete` resolves the incoming delete id through the one exact lookup, not + `GetRequiredBySchemaId`. + - Error text at `:1664, :1725` names the wire id. +- **Durable shard log** (`CultNetShardMutationLogStorage.cs:60-88`, `CultNetDatabase.cs:586-591, 1385-1409`): + - It persists store ids. `Append` rewrites each entry's `schemaId` (put document and delete) to + `descriptor.SchemaId`. + - `GetMutationLogMessages` restamps with `WireSchemaId` on the way out. + - `KeyOf` (`:1399-1409`, the restart rebuild of `_lastWriteSequence`) reads store ids and so agrees with the live + writes at `:1294, 1486, 1531`. That also fixes the rebuild disagreement that exists today when a binding overrides + the id. + - **Existing log files hold sha256 for default bindings, which is the store id, so nothing on disk changes.** Only + logs written through an override hold a foreign id, and only the interop peer used one. No repo outside CultLib uses + `CultNetFileShardMutationLogStore` (grep over F:\Projects). +- Request filters that send the sha256 today switch to `WireSchemaId`: + - `CultNetDatabaseSubscriptionClient.cs:70-71`; + - `CultMeshClient.cs:602, 843, 944`; + - `CultMesh.cs:2696` (`RequestPeerSnapshotAsync`) and `:2038`; + - `CultMeshSnapshots.cs:874` `ResolveDefaultSelection`. +- **Shard catalog and config:** `CultNetShardDescriptor.SchemaIds` and `CultNetClientAuthorityScope.SchemaIds` are wire + ids. They are documented so, and matched exactly (C1.0). +- CultMesh projection sources and binding records (`CultMesh.cs:1521, 1602, 1972, 2032, 2273, 2300, 2331, 2357, 2384, + 2413`; `CultMeshSnapshots.cs:530, 555`) cross the wire as `CultMeshStateBindingRecord [Key(3)]` + (`CultMeshPrimitives.cs:3334`). Stamp them with the version. + - The collection and feed ids built from them (`CultMesh.cs:2298, 2329, 2382, 2411, 3266`) move to the version too. + - The cultmesh-ts type of the same shape then agrees. +- **Selection order and cursor** (`CultNetSelectionEvaluator.cs:213-214, 318, 345, 586, 593`): tie-break and cursor on + the wire id, as Rust does on its binding id. + - This changes a wire-visible order: the parity vector R-AJ flips (`leaf_a.v1 < leaf_b.v1`, where the sha256 order + was `b1f2… < ff35…`). + - Cursors minted before the upgrade stop resuming. That is acceptable, because cursors are per session. +- **Shared fixture, landed in this cut with the Rust side:** + - `contracts/cultnet/interop/selection-vectors.fixture.json`: `schemaId` becomes the version. Delete `nameAlias` and + `hashAlias`. + - Regenerate `selection-vectors.cs-written.json` and `selection-vectors.rs-written.json`. + - `SelectionParityVectorTests.cs:112-117, 156-159` assert the fixture ids equal the declared versions. Delete the + alias cases at `:235, :238, :329`; keep the refusal of an unknown id at `:325`. + - Rust `cultnet-rs/tests/selection.rs:1561-1690, 1849` (vector writer): drop the alias rows; order by the version. +- **Left alone:** `global:{descriptor.SchemaId}` record keys (`CultCache.cs:2473`, `CultNetDatabase.cs:1120`). They are + a record key, not a schema id, and changing them changes store keys. See F-C1-GLOBALKEY. +- **Schema catalog:** `CultNetSchemaRegistry` holds JSON-Schema contracts keyed by `$id` URL, and no production C# host + answers a catalog request (`Server.cs:565` is an allowlist only). The only document-payload registrations are the + interop peer's, which C1.5 changes. Nothing to cut here. + +### 5. C1.2: TypeScript + +Runtime packages `cultcache-ts`, `cultnet-ts`, `cultmesh-ts` and `cultmesh-browser`. + +- `cultcache-ts/src/document.ts:82-91` `schemaIdentityOf` stays the store identity, unchanged. +- **cultnet-ts owns the wire:** `export function wireSchemaIdOf(definition)` returns + `schemaIdentityOf(definition).schemaVersion`. The store keeps a definition with no declared version valid; only a + wire registration refuses it. +- `cultnet-ts/src/replication.ts:52-80` `register`: + - refuse a version failing `/\.v\d+$/` with `SchemaConflictError` or `TypeError`, naming the type; + - key `#owners` by `wireSchemaIdOf`; + - `#listers` keep the declared compatible ids (OQ-C1.2). + - The conflict check at `:59-71` also compares wire ids. +- Outgoing ids: `schemaIdForBinding` (`:349-351`) splits in two. + - Outgoing messages (`:123, :178, :287` put echo) use `wireSchemaIdOf`. + - `applyRawDocumentPutMessage` (`:280-290`) keeps storing under the store id, `schemaIdentityOf(...).schemaId`. + That is the leak point: today the same function feeds both. +- **Serving** (`:196-260`, `:363-368` `schemaIdForEnvelope`, `:336-345` `#createRawDocumentRecord`): + - A served record carries `wireSchemaIdOf(binding)`, never `envelope.schemaId`. + - A record stored under a compatible id holds that version's bytes. It is decoded and re-encoded through the owning + definition before it is served under the owner's id. This matches C#, which serializes from the decoded document + (`CultNetDocumentRegistry.cs:640`). + - `answersTo` (`:354-361`) matches the requested id against the binding's wire id (and its compatible ids if + OQ-C1.2 is yes). + - Tests `cultnet.test.ts:1627-1664` (the wire id equals the store id), `:1703-1708` (served under the stored id) and + `:1713-1744` (a version id does not resolve) are inverted. +- `cultnet-ts/src/shard-catalog.ts`: exact after C1.0; shard ids are wire ids. +- **cultmesh-ts:** + - `cultMeshSchemaFromDefinition` (`index.ts:6168-6173`): `schemaId` for peer reads is `wireSchemaIdOf`. + - `syncDocumentFromPeerSnapshot` (`:3995-4019`) and `cultMeshDocumentFromPeerSnapshot` (`:2668-2710`) ask by wire id. + - `resolveCultMeshStoreDocumentRecord` / `cultMeshAcceptedSchemaIds` (`:6243-6256`) are store-local and stay on + `schemaIdentityOf`. + - The receipt filter at `:5976` compares `receiptBinding.definition.schemaId`, which is `undefined` when not + declared. Compare with `wireSchemaIdOf`. +- Put-serve overlap (not on c2a): `hands/cultmesh-put-serve-bound` adds `#rawPutEnvelope` and + `createRawSnapshotResponseForPut` to this file, on main's shape resolution (`preserveIncomingSchemaId`). After the + merge, the put-sizing response must be built by the same serving path, so it carries the wire id. +- `cultmesh-browser`: exact after C1.0. `samples/eve-browser-network` declares or asks by version. +- **Consumer action, not in CultLib:** Stonks `stonks-daemon.cjs:152-195` sets `schemaVersion` to the full id. It + lands in Stonks before C1 merges to main. + +### 6. C1.3: Python + +- `cultcache_py/documents.py:105-143` `catalog_entry` stays the store identity. Add `wire_schema_id(definition)` in + cultnet_py, returning `schema_version`. +- Registration in `cultnet_py` and `cultmesh_py` refuses a version failing `\.v\d+$`. +- Outgoing ids use `wire_schema_id`: + - `cultmesh_py/node.py:577` (put), `:641` (delete), `:824-827` (sync); + - `client.py:430` (subscribe); + - `node.py:767, 776` (snapshot, never the stored id; a compatible-id record is re-encoded as in TS); + - `server.py:617-633` (catalog). + - `server.py:416, 444` echo a record that has already been resolved exactly, so it carries a wire id. +- Applied records keep being stored under the local store id: `replication.py:42, 84`, `node.py:664-670`. +- Inverted tests: `test_cultmesh.py:4116-4148` (a version request is served under the sha256 id) and `:4215-4258` + (echo of a foreign id). +- `interop_peer.py:1085` serves the stored id; that moves in C1.5. + +### 7. C1.4: Rust mesh and Kotlin + +- **Rust.** The wire id is already the version on every consumer binding. + - `for_entry::()` (`cultnet-rs/src/replication.rs:44-47`) has no consumer. It binds `T::TYPE`, which fails the + refusal unless it ends in `.vN`. Refuse it at `register` like any other id without a version. Keep the constructor, + so a type whose TYPE is `x.v1` still works. + - `for_entry_with_schema_id(id, version)` (`:50-64`): refuse `id != version` or a missing `.vN`. That is one id, and + `cultmesh_documents!` already passes the same string twice. + - `register` (`replication.rs`) applies the rule. + - The apply path keeps stamping `binding.schema_id` (`:400`). That is what Odin, Muninn and the rest store today, so + nothing on disk changes. + - `pull_rudp_catalog_snapshot` (`cultmesh-rs/src/lib.rs:714-747`) stamps the resolved binding's id. It is exact after + C1.0, so no foreign id is written. + - Rust's mixed store ids (typed put stamps `T::TYPE` at `cultcache-rs/src/lib.rs:2362`; apply stamps the version) are + left as they are. That is C2's question, F-C1-RUSTSTOREID. +- **Kotlin.** + - `register` (`CultMesh.kt:79-93`) refuses a `schemaVersion` failing `\.v\d+$`. + - The interop codecs at `CultMesh.kt:3872-3880, 4317-4322, 4351-4354, 3779-3789` put the contract URL in + `schemaVersion`. They become `cultnet.interop_note.v0` and the capability `*.v0` versions. Kotlin's own suite + (`CultMesh.kt` self-checks) moves with them. + +### 7b. C1.5: the interop harness tests the default binding + +The parity witness hid the mismatch because every peer names the note by its JSON-Schema `$id` URL. C1.5 removes the +overrides so each runtime's default binding meets the others. + +- C# `tests/GameCult.Networking.InteropPeer/Program.cs`: + - `:77-80, :201-204`: `ForDocument(payloadSerializer:…, payloadDeserializer:…)` with no id. The + id is `cultnet.interop_note.v0`. + - `:1183-1196`: four capability bindings with no id; their versions are `*.v0` (`:1560-1572`). + - Delete the `*SchemaId` URL constants. + - `LoadSchemaRegistration` (`:1116-1137`): the catalog registration's `SchemaId` becomes `InteropSchemaVersion`. The + JSON `$id` stays inside `SchemaJson`. + - The catalog server at `:682-714` stops copying `SchemaId` into `SchemaVersion`. +- TS `packages/cultnet-ts/test/interop/cultnet-interop-shared.ts:10-19, 289-306` and `cultnet-interop-peer.ts:123, + 135, 896-930`: definitions declare `schemaVersion` and no `schemaId` override. The note id constant is at + `cultnet-interop.test.ts:43`. +- Python `cultnet_py/interop_peer.py:59-68, 869-884, 936-981, 1085, 1149`. +- Rust `cultnet-rs/examples/cultnet_interop_peer.rs:56-67, 1227-1261`: `for_entry_with_schema_id` with the version + only. +- Kotlin: C1.4. +- The Python cultmesh scripts inside `cultnet-interop.test.ts:3872-4060` declare `schema_version` only. +- **The added negative lane** is one scenario in `cultnet-interop.test.ts`. A C# host serves a note from a + **CultMesh-created registry** (`CultMesh.CreateCultNetDocumentRegistry`, the production path). A TS reader: + - asks by `cultnet.interop_note.v0` and gets it; + - asks by `cultnet.interop-note` (the name) and gets not-found; + - asks by the sha256 id and gets not-found. +- CI: `.github/workflows/cultnet-interop.yml:141-163` already runs every pair lane. The new scenario joins the + `TypeScript and C#` pattern. + +### 8. Verification + +Each rule gets a behavioural test that fails when the rule breaks, plus the ecosystem mutation tool on the cut's +diff: Stryker.NET, StrykerJS, mutmut, cargo-mutants. Kotlin has no tool, so its rules are defended by scenario. + +**Positive, across runtimes, with default bindings** (C1.5 lanes, run on Yggdrasil in `ack1d-interop:2`): +- A C# host with a CultMesh-created registry publishes a note, and TS, Rust, Python and Kotlin each read it. Each asks + only by `cultnet.interop_note.v0`. +- Then each non-C# host publishes, and C# reads. +- The wire bytes carry `schemaId = cultnet.interop_note.v0`. Assert the decoded `CultNetRawDocumentRecord`, not a log + line. + +**Negative checks:** +- **No fallback.** In each runtime, a record at the requested key under another id is not returned (TS, C#, browser), + and a payload whose slot 0 names a registered version but whose id is foreign is refused (C#, Python). + - Mutant: restore `?? atKey[0]`, or restore the `byPayload` or `aliased` branch. It must die. +- **Unknown id refused.** + - C# `DeserializeRawDocument` with `gamecult.unknown.v1` throws. Today it returns `Note` (probed). + - TS, Python, Rust and Kotlin `applyRawDocumentPut` with an unknown id throw. +- **No name match.** Asking by `schemaName` finds nothing, in every runtime and in the selection evaluator (C# and + Rust). Mutant: add `|| candidate == descriptor.SchemaName`. +- **Refusal.** + - Registering a C# binding for a `[CultDocument("x", "1")]` type throws at `Register` and names the type. + - An unbound `"1"` type in a registry with no bindings throws at first emission. + - TS, Python, Rust and Kotlin refuse `"v1"` and `"1"`, and accept `x.v0` and `x.v12`. + - Mutants that must die: `\.v\d*$` (accepts `x.v`), `.v` anywhere, and `\d+$` alone (accepts `"1"`). +- **The wire id is derived from the declaration, not a constant.** Two types with different versions each emit their + own. A mutant that returns `SchemaName + ".v1"` must die, so use a fixture whose version is not `.v1`: the + interop note's name is `cultnet.interop-note` and its version is `cultnet.interop_note.v0`. +- **The store id is untouched.** + - A C# store written before C1 is read after it. `dump.py` shows record ids unchanged after a C1 host reads and + serves. + - A TS store with `schemaId: "p1.shared"` keeps that id after a raw put arrives under `p1.shared.v1`. + - Mutant: store under the wire id. It must die. +- **The served id is not the stored id.** A TS or Python record stored under a compatible id is served under the + owner's wire id, with bytes that decode as the owner. Mutant: serve `envelope.schemaId`. +- **Durable log.** + - A C# database with `CultNetFileShardMutationLogStore` writes, restarts, and replays to a replica. The replayed + entries carry the version, and `LastWriteSequence` after the restart equals the value before it. + - A log file written before C1 (sha256 entries) replays under the version. +- **Selection.** The parity vectors agree C#↔Rust with version ids. The tie-break vector R-AJ orders by version. +- **Catalog lookup.** A catalog with two handles of one type refuses a by-schema lookup and names both document ids + (C# and TS). Mutant: return the first or last handle. + +**Builds.** These are the focused set, with no workspace-wide build: +- `dotnet test` on `GameCult.Networking.Tests` and `GameCult.Mesh.Tests`; +- `npm test` in `cultnet-ts`, `cultmesh-ts` and `cultmesh-browser`; +- `pytest` in `cultnet-py` and `cultmesh-py`; +- `cargo test -p cultnet-rs -p cultmesh-rs`; +- the Kotlin self-check; +- the interop lanes. +All of them run on Yggdrasil through `ygg-verify.sh`. + +**Negative greps**, which must return nothing in `src/` and `packages/*/src`: +- `CultNetSchemaAliasMatching|InferSchemaName|inferSchemaName|_infer_schema_name|infer_schema_name` +- `strip_schema_version_suffix|schema_alias|PayloadMatchesSchema|TryReadSchemaVersion|firstRecordAtKey` +- `bySchemaNameVersion|ExpandSchemaBindingAliases` +- in `CultNetDocumentRegistry.cs`: `schemaId:` as a `ForDocument` parameter. + +**Live consumer checks**, after release and before any consumer bumps: +- **Stonks** has its six versions fixed. `idunn` shows Odin holding Stonks' `provider_advertisement` after a Stonks + restart on C1. +- **AquaSynth** daemon and clients rebuilt together; the Dings host round-trips. +- **Mimir** EveDashboard is visible in Eve Android. +- **Bifrost** agent-transport snapshot and apply round-trip. +- **Odin** still ingests from Heimdall, VoidBot, weksa and StreamPixels. Those ids do not change. +- **Grep** Idunn and Odin for a receiving binding of `idunn.daemon_health` with no version. If one exists, it is + refused at startup under C1.4. It was not found in main. + +### 9. Sequencing + +1. **F2 finishes first.** C1 and F2 touch different layers: + - F2 is store-side: `CultCache.cs` `Claimant`, the single-file and directory stores, and the Rust catalog lay-back. + - C1 is wire-side. + - They overlap in three places: + - `cultnet-ts/src/replication.ts`. F2 and batch 10 built owner-beats-lister and the `#listers` refusal (F9, F10) + there, and C1.2 re-keys `#owners` by wire id. The lister rule is kept, with OQ-C1.2 deciding its wire reach. + - `cultnet-ts/test/cultnet.test.ts:1346-1394, 1627-1744`. C1.2 inverts tests F2's batches wrote. + - `cultnet_py/replication.py` `schema_document_map`. + - C1 does not relabel any stored record and adds no store write, so F2's rule ("never relabels … a write over it is + refused") is not in play. F2's test `976b57f1` ("each runtime's writes leave another runtime's records and catalog + entries unchanged") must stay green through C1. + - Hands on F2 should not be interrupted. C1 starts after F2's Soul pass holds. +2. **Then put-serve merges to main** (`hands/cultmesh-put-serve-bound`, based on `b04d03b6`). + - It edits `cultnet-ts/src/replication.ts` on main's resolution. Main still has `preserveIncomingSchemaId` and + payload-shape resolution, which c2a deleted in `0ee98e8c`. + - It also edits `cultmesh-ts/src/index.ts`, `cultmesh_py/server.py` and `node.py`, and `cultmesh-rs`. +3. **Then c2a merges main.** This is the conflict to resolve before C1, whatever C1 is: + - c2a's exact resolution plus put-serve's `createRawSnapshotResponseForPut`; + - main's R1 changes to `CultNetDocumentRegistry.cs` (`rowFilter`) against c2a's `Register` refusal. + - C1 re-anchors on that merge commit. Every anchor above names its symbol for that reason. +4. **C1 cuts, in order, on the variants branch** (or `hands/variants-c1id` cut from it): + - C1.0 C# subtraction; + - C1.0 TS, Python, Rust and Kotlin subtraction, one cut per runtime or together, since they are deletions only; + - C1.1 C# wire id with the shared selection fixture and Rust selection order; + - C1.2 TS; + - C1.3 Python; + - C1.4 Rust and Kotlin; + - C1.5 harness. + - The interop lane is red between C1.1 and C1.5 on the branch. Soul measures at C1.5. + - Stonks' fix lands before the variants branch merges to main. +5. **Release.** C1 is wire-breaking between C# peers of different releases, because an old host sends sha256 and a new + receiver refuses it. It rides the C0/C2a release that the 2026-09-30 ruling already gates. The release note names: + C# peers upgrade together, the refusal of versions without `.vN`, and Stonks. + +### 10. Ledger estimate + +| Cut | Deleted (src) | Added (src) | Tests | Notes | +|---|---|---|---|---| +| C1.0 C# | ~290: alias class 58; registry block ~175; mesh branches ~35; expand ~40 | ~40 exact lookups | ~15 tests inverted, ~6 deleted | public API removed: `CultNetSchemaAliasMatching`, `TryResolveDescriptorByPayloadSchema`, `PayloadMatchesSchema` | +| C1.0 TS/Py/Rust/Kt | ~230: selection `schema_alias` ~140 with tests; Python infer/sniff ~45; TS infer/HELD/catalog keys ~45 | ~20 | ~25 tests deleted or inverted | | +| C1.1 C# | ~30 (override parameter, sha256 fallbacks) | ~80 (refusal, log restamp, emitters) | ~20 changed; fixture and vectors regenerated | wire-visible order change | +| C1.2 TS | ~15 | ~50 (`wireSchemaIdOf`, refusal, serve re-encode) | ~10 | | +| C1.3 Py | ~10 | ~40 | ~8 | | +| C1.4 Rs/Kt | ~5 | ~25 | ~6 | | +| C1.5 harness | ~60 URL constants and overrides | ~40 negative lane | — | | +| **Net** | **~-640 / +295 src**, about **-345** | | | Nothing on disk changes. Two public C# methods and one public C# class are gone. | + +### 11. Operator questions + +**OQ-C1.1: delete the per-binding wire-id override?** +- The overrides are C# `ForDocument(schemaId:)`, Rust's free first argument of `for_entry_with_schema_id`, and the + implicit TS and Python `schemaId`-on-the-wire. +- A. Delete. The declared version is the one wire id, and it derives from the descriptor alone, so the selection + evaluator, the durable log and the mesh need no registry to compute it. No repo outside CultLib passes the override; + only CultLib's interop peer and two conflict tests do. +- B. Keep it, but refuse ids without `.vN`. A second declaration of identity survives beside the version, and every + descriptor-only site (evaluator order, cursor, log, projections) needs the registry again. That is today's + `WireSchemaId` split. +- **Recommendation: A.** It removes a public parameter, which the CultLib consumer rule asks to be put to you rather + than cut silently. What a reasonable consumer loses is the ability to put an id on the wire that its declaration + does not state. That is the thing C1 rules out. +- C1.1's shape depends on the answer. + +**OQ-C1.2: does declared compatibility (`CompatibleSchemaIds`) resolve on the wire?** +- A. Yes, with the same rule the stores use: owner beats lister, and two listers with no owner are refused. A v2 type + that declares `x.v1` compatible accepts a v1 peer's records, so mixed-version peers work when an author declares it. + It is declared, never inferred. c2a's TS and Python registries already do this. Served records always go out under + the owner's wire id, re-encoded (§5). +- B. No, wire resolution is the owner only. Compatible ids become store-only. It is simpler, and a version bump is a + hard break between peers. +- **Recommendation: A.** It is the rule the operator ruled for stores (owner beats lister), applied to one more layer. + It is not aliasing, because nothing is guessed. +- C1.0's Python map, C1.2's `#listers`, and the C# lookup depend on the answer. + +**Defaulted, not asked. Veto if wrong:** +- TS and Python keep their default version `${name}.v1` when none is declared. +- A served record stored under a compatible id is re-encoded through its owner, as C# does. +- `global:{sha256}` record keys stay. +- Rust's apply path keeps stamping the binding id. +- A catalog lookup by schema that more than one handle answers is refused. +- Stonks is fixed in Stonks. + +### 12. Follow-ups (no cut owns them) + +- **F-C1-GLOBALKEY:** `global:{descriptor.SchemaId}` keys (`CultCache.cs:2473`, `CultNetDatabase.cs:1120`) carry the + sha256 across the wire as a record key. This is for C2. +- **F-C1-RUSTSTOREID:** Rust stores hold `T::TYPE` for typed puts and the version for replicated puts. Its catalog + fabricates version `.v1` (`cultcache-rs/src/lib.rs:2694-2708`) even where `cultmesh_documents!` declares another + one. The derive cannot declare a version (`cultcache-rs-derive/src/lib.rs:24-33`), which is a gap beside the other + runtimes. This is for C2. +- **F-C1-PYALIAS:** Python cultmesh `_documents_alias` compares two local definitions by name and version. It is + redundant under one-type-per-schema, but local. +- **F-C1-HEALTHID:** Bifrost sends `idunn.signed_daemon_health` without `.v1` + (`persona-feedback-idunn-health.cjs:41`), where every other sender uses `.v1`. It is pre-existing and unrelated to + C1. +- **F-C1-AEVE-CONST:** the AetheriaEve daemon compares wire ids with version constants (`Program.cs:1591`) and so never + matched under sha256. It is archaeology; record only. + +## F2 forks (operator, 2026-10-01) + +These came from the C2a F2 Hands at `a771e71b`. + +- **Fork A: RULED, forbid slot reuse.** Operator: "Forbid slot reuse. This is expected behavior for any MessagePack or + protobuf veterans." + - A whole-view write keeps laying back records the type does not own. + - Registration refuses a type that puts a different member in a slot the stored catalog shows was used before. + This follows protobuf's reserved field numbers. + - `VariantTests.AFlushShedsAnOverrideOfADroppedSlotSoALaterTypeReusingTheSlotDoesNotResurrectIt` is rewritten to pin + the refusal instead. +- **Fork B: DEFERRED, foreign records in TS, Python and Rust.** Operator: "Foreign records in other runtimes can wait, + I suppose, though I don't love leaving parity on the table." + - Today those runtimes refuse to open a store that holds a record they cannot claim. That is safe, but it is not + parity with C#. + - Carrying foreign records needs their whole-store writers taught first: TS `pushAll` via CultMesh `flush`, and Rust + `put_prepared_batch` → `push_all`. + - Recorded as the next parity cut, not dropped. + +## Soul: cultcache-ts push identity (`hands/cultcache-ts-push-identity` `1d6e1364..a00bb01f`, 2026-10-01) + +Verdict: **hold, not merged.** Recorded under drain mode; no fix dispatched. + +- **Held:** the Stonks duplicate is fixed; the suites on a merge with main are green (cultcache-ts 54/54 with four-runtime interop, cultnet-ts 198/198, cultmesh-ts 128 passing). +- **F1 (CONFIRMED, high):** `isSameRecord` (`single-file-messagepack-backing-store.ts:284-286`) still matches on the stored label. When one definition's type equals another's schemaName, a put or delete for one destroys the other's record at the same key, globals included. The branch's own test "an envelope with no catalog entry replaces a record stored under another schema id that carries its label" pins this hole. The coherent cut: the cache resolver hands the store the persisted identity (key plus schemaId), and the store compares only that. +- **F2 (CONFIRMED, high):** Python (`stores.py:54-67, 105-119`) has the same duplicate bug. A second `put_global` makes the store unloadable. +- **F3 (CONFIRMED, medium):** Rust `entry_id` is `(type, key)`, which duplicates records written by another runtime. Rust also writes its TYPE into the catalog schemaName slot, a parity defect. +- **F4:** mutant MA (legacy global labelled by schema name) survives; the rule needs a committed test. +- **F5 (PLAUSIBLE, high after c2a):** c2a's compatible-owned ids plus clause 1 let a non-owner's write delete the owner's record. c2a's `encodeSnapshot` `${type}::${key}` is a second identity authority. +- Probes survive as unreachable commit `1c7744e2` (ts, rs, py); recover them before gc. + +## Soul: C2a F2 keep unknown records (`hands/variants-c2a` `92d9e138..a771e71b`, 2026-10-01) + +Verdict: **hold, not merged.** Recorded under drain mode; no fix dispatched. The core promise holds: a C# write neither destroys nor relabels a record it doesn't claim. Checked on the real `Aetheria.cc` (206 records): 0 record or entry differences after a commit and a flush. + +- **F1 (CONFIRMED, medium):** C# decodes and re-encodes laid-back catalog entries (`CultDocumentMessagePackSerialization.cs:501,567`, `CultCache.cs:3847-3851`). Unknown entry and member fields are dropped, and nil and int widths are normalized. Fix: carry the raw entry bytes. +- **F2 (CONFIRMED, medium):** laying back a loaded foreign record reverts a newer write by its owner and moves storedAt backwards (`CultCache.cs:3831-3836`, breaks F6). Fix: lay back only while the file still holds the loaded `(id, storedAt)`. +- **F3 (CONFIRMED, medium):** one refused flush blocks every later write to other records. The directory store stays stuck until restart (`CultCache.cs:3827-3831`, `DirectoryMessagePackBackingStore.cs:249-253`). Breaks "writes to other records proceed". +- **F4 (low):** a laid-back record marks the v3 header without holding ids (`CultCache.cs:3731`). +- **F5 (plausible, low):** an in-place change to a laid-back document is dropped silently. +- **F6:** mutants H2 (`CultCache.cs:3850`) and R2 (`lib.rs:2663`) survive. +- **The main merge is its own Hands cut.** + - 8 files conflict, including about 74 KB in `lib.rs`. + - Main refuses a zero-byte store; c2a reads it as an empty v1 store. + - Main's `CultMeshStreamingTests.cs:919` uses `MeshNoteAliasDocument`, which c2a deleted. + - The rough merge fails in Caching, Mesh (compile), TS and Python. +- `ADeterministicIdIsTheSameUnderEveryCulture…` fails at the base too: the image is globalization-invariant. + +## Store authorities (Modeling, body at `hands/variants-c2a` `705ab669`, 2026-10-03) + +Source: cuts `merge-r1` (closed, reports h2-h6) and `mesh-single-file-reader` (closed, report h1). Every `file:line` +is at `705ab669`; re-find by symbol when the branch moves. This section supersedes the Body facts in section 1 +about raw readers (the Mesh legacy snapshot decoder and `ReadLegacyPersistedRecord` no longer exist) and the +merge notes in the C2a Soul sections below. C#, Rust, TypeScript and Python each have one single-file reader, and +CultMesh reaches CultCache's reader, lock and replace through one internal entry. + +Abbreviations: **CS** `src/GameCult.Caching/CultCache.cs` (`SingleFileBackingStore` :3627-4140), **CSM** +`src/GameCult.Caching.MessagePack/CultDocumentMessagePackSerialization.cs`, **MESH** +`src/GameCult.Mesh/CultMeshSingleFileDocuments.cs`, **RS** `packages/cultcache-rs/src/lib.rs`, **TS** +`packages/cultcache-ts/src/single-file-messagepack-backing-store.ts`, **PY** +`packages/cultcache-py/src/cultcache_py/stores.py`, **AUTH** `packages/cultnet-ts/src/idunn-runtime-authority.ts`. + +The one door per runtime, and who walks through it: + +| Runtime | The reader | Callers that must use it | +| --- | --- | --- | +| C# | `SingleFileBackingStore.ReadSnapshot` CS:3997 over `ReadDisk` CS:4026 | `PullAllCore` CS:3665, `PushAll` CS:3768, `CommitBatchCore` CS:3799, `ReadDurable` CS:4014, `ReplaceDurable` CS:4016; MESH:164, :195, :245 | +| Rust | `read_store_unlocked` RS:935 (header by `store_header` RS:389) | `read_all_unlocked` RS:924 (`pull_all` RS:1243 and the read-only snapshot), `write_all_unlocked` RS:983, soft `push_all` RS:1268 | +| TypeScript | `readSingleFileStore` TS:153 (bytes by `readStoreBytes` TS:174), exported from `packages/cultcache-ts/src/index.ts:4` | the store's `#readDisk` TS:108 (`pullAll`, `push`, `delete`, `pushAll`); AUTH:321 `readAuthorityRecord` | +| Python | `pull_all` decode path PY:123-140 (`_read_store` PY:265, `_decode_snapshot` PY:296) | `push`, `push_all`, `delete` call `pull_all` (PY:142-152) | + +### A. Header decision (what the file is, and what header a write carries) + +- **Owner.** Read side: the reader in the table above. C#: `CSM.DeserializeSnapshot` :188 (whole-array proof :245-269), then `RequireSingleFileFormat` :273, reached through `SingleFileMessagePackBackingStore.DeserializeSnapshot` CSM:592. Rust: `store_header` RS:389 is the only classifier of leading bytes (it returns `first` and the whole-array proof separately), then `readable_store_format` RS:2890 and `decode_store_file` RS:2901. TS: `decodeStoreFile` TS:423. Python: `_decode_snapshot` PY:296. Write side: the header is derived from what the reader just saw. C#: `HeaderFor` CS:3439, fed by `disk?.FormatVersion` in `PushAll` and `CommitBatchCore`, and by `existing?.FormatVersion` from MESH:247. Rust: `encode_store_snapshot` RS:2793, fed by the `DiskStore` read in `write_all_unlocked` RS:992. TS: `#format`, set by the pre-write read (TS:48-52, :86-100) and used by `encodeSnapshot` TS:136. Python: `_format`, set in `pull_all`, used by `_encode_snapshot` PY:245. +- **Inputs.** The bytes at the path. **Outputs.** The decoded store with header and catalog; or a typed refusal (`CultStoreUnreadableException` in C#; `CultCacheStoreUnreadable{path, kind}` in Rust, kind `Undecodable` or `UnsupportedFormat`; `StoreUnreadableError` in TS and Python). A refusal names a header only as `cultcache.store.v`. +- **Derived state.** The write header is never decided by the writer: it is the reader's verdict (header read, whole-store flag, whether ids or variants are held). A rewrite of a file that cannot be read cannot happen, because the reader throws first. +- **Forbidden writers.** A second header classifier. Deleted: Rust `leading_header`, `read_array_header`, `read_string`; cultnet-ts's own decode of the store header; the TS async `readStore`; Rust `StoreUnreadableError` (negative grep `StoreUnreadableError` in `packages/cultcache-rs`: no match); Python `_decode_v1_snapshot`. +- **Shared paths.** cultnet-ts reaches the header decision only through `readSingleFileStore` (AUTH:4, :321) and checks only record count, schema id and type. cultnet-ts therefore declares cultcache-ts `^0.15.0`, the first release that exports it. +- **Cut line.** `merge-r1` h3 (Rust) and h4 (TS, cultnet-ts); spec `cut-merge-r1.r3` authority map. +- **Pinned by.** `tests/vectors/document-variants-c2a/readability/manifest.txt`, walked by `StoreReadabilityTests.OpenReadsExactlyTheFilesTheVectorsSayItReads` (C#), `CultMeshSingleFileReadabilityTests.AWriteReplacesAFileExactlyWhenItReads` (Mesh), `a_file_is_replaced_exactly_when_it_reads` (RS:5132), "SingleFileMessagePackBackingStore replaces a file exactly when it reads" (TS test :2321) and `test_single_file_replaces_a_file_exactly_when_it_reads` (Python). AUTH cases: `packages/cultnet-ts/test/idunn-runtime-authority.test.ts`. Declared divergences in the manifest: `legacy-envelopes.bin` (C# refuses; the others read and replace it) and `variant-slot-v3.bin` (C# reads; the others refuse). +- **Known gaps.** `variants:follow_up:c0-bad-canonical-in-manifest` (`current-catalog-bad-canonical.msgpack` is not in the manifest; TS reads it, Rust refuses). `variants:follow_up:legacy-vectors-all-runtimes` (the three `legacy-catalog-*` c0 vectors have a verdict only in C# tests; all four runtimes refuse them, probed). `variants:follow_up:range-check-in-ci` (`npm run test:pack:ts` builds every admitted tag and checks exports, but `.github/workflows/publish-packages.yml` does not run it). + +### B. Existence and links (what "nothing at the path" means) + +- **Owner.** C#: `ReadDisk` CS:4026 decides absence from the path's attributes (`-1`), with `PathIsALink` CS:4057. Rust: `is_absent` RS:3049, inside `read_store_unlocked` RS:936-945. TS: `readStoreBytes` TS:174 (the read and the lstat must both find nothing; the lstat is a test seam). Python: `_read_store` PY:265. +- **Inputs.** The path's attributes and the read result. **Outputs.** Absent (an empty, unmarked store), or bytes, or an I/O error. Only nothing at the path is absent. A link whose target is gone is an I/O error in all four runtimes (C#: `IOException` for a file link and for a Windows directory junction, CS:4040-4048; Rust: `io::Error`; TS: an error with code `ENOENT`; Python: `FileNotFoundError` re-raised). +- **Derived state.** Mesh's `FileNotFoundException` is derived from the store reader's `null` (MESH:164, :195); Mesh no longer owns absence. +- **Forbidden writers.** `File.Exists` or any existence gate in MESH (negative grep `File\.(Exists|ReadAllBytes|Delete|Move|WriteAllBytes)|HasOlderCatalogLayout|ReadLegacySchemaCatalogEntry|WriteFileAtomically|ReadSingleFileSnapshot` over MESH: no match); a zero-length-means-absent shortcut; a writer's own read. +- **Shared paths.** Open, flush, commit, `ReadDurable`, `ReplaceDurable`. Rust `pull_all` RS:1243 also checks `is_absent` on the store and on the lock path before it takes the shared lock; that skips lock creation only, and the verdict stays with the reader. +- **Cut line.** `merge-r1` h2 (C#) and h4/h6 (TS `readStoreBytes`); `mesh-single-file-reader` h1. +- **Pinned by.** C#: `StoreReadabilityTests` `ADanglingFileLinkIsAnIoErrorOnOpenNotAnEmptyStore` :208, `ADanglingDirectoryLinkIsAnIoErrorOnOpenNotAnEmptyStore` :185, and the commit variants :196, :219. Mesh: `ADanglingLinkIsAnIoErrorOnTypedWriteRawWriteAndReadNeverAMissingFile` :107 and `OnlyNothingAtThePathIsAMissingFile` :134 (`CultMeshSingleFileStoreTests.cs`). Rust: `a_dangling_symlink_at_the_store_path_is_an_error_and_nothing_is_written` RS:5832. TS: "readStoreBytes reports nothing at the path only when the lstat finds nothing too". +- **Known gaps.** The writer side still tolerates a dangling link: Rust `write_all_unlocked` RS:992-996 and TS `pushAll` TS:94-100 replace it on a whole-store write (`variants:follow_up:writer-dangling-link-tolerance`, owner `c2a-write-set`). What a replace does to a live link is `variants:follow_up:store-replace-cut` item 2. Windows junction behavior was proven at `42f05f66` and `b1ff2dcb`, not at the final head. + +### C. Zero-byte file + +- **Owner.** None separate: a zero-byte file is bytes the one reader cannot decode. C#: `ReadDisk` returns the bytes and `CSM.DeserializeSnapshot` refuses them (the `Length: > 0` shortcut is deleted). Rust: the `store_header` whole-array proof fails, `Undecodable`. TS: `readSingleFileStore` TS:158 wraps the decode error in `StoreUnreadableError`. Python: the `unpackb` failure is wrapped at PY:139-140. +- **Inputs/outputs.** Zero bytes in; a typed unreadable refusal out; every writer leaves the file as it was. +- **Derived state.** None. **Forbidden writers.** Any `length === 0`, `is_empty` or `Length > 0` branch before decode (negative greps in spec `cut-merge-r1.r3`: `Length: > 0 } bytes` in CS, `data.length === 0` in TS). +- **Shared paths.** Open, flush, commit, soft flush, Mesh typed and raw write, AUTH. +- **Cut line.** `merge-r1` h1-h3; ruling `variants:ruling:merge-r1-precedence`. +- **Pinned by.** Manifest row `zero-byte.bin` (refuses x4) in every walk above; Mesh `AReadOfAZeroByteFileIsRefusedAsUnreadableNotAsAMissingRecord` and `AZeroByteFileIsRefusedOnTypedAndRawWriteAndLeftAlone` (`CultMeshSingleFileStoreTests.cs:175`); the AUTH zero-byte case. +- **Known gaps.** None open. + +### D. Directory at the path + +- **Owner.** C#: the explicit clause in `ReadDisk` CS:4034-4035 (a directory that is not a link is an `IOException`; a directory link falls to the catch at CS:4045). Rust: `fs::read` fails with a non-`NotFound` error, kept as `io::Error` (RS:940-944). TS: `readFileSync` throws `EISDIR`. Python: `Path.read_bytes` raises an `OSError`. +- **Outputs.** An I/O error, never an empty store; the directory is untouched and the refusal text does not echo the path. +- **Forbidden writers.** Treating a directory as absent, or creating a store over it. +- **Shared paths.** Open, commit, Mesh read and write. +- **Cut line.** `mesh-single-file-reader` h1 (the C# clause). Rust, TS and Python were correct by construction of their reads. +- **Pinned by.** C#: `ADirectoryAtTheStorePathIsAnIoErrorOnOpenAndOnCommitNotAnEmptyStore` (`StoreReadabilityTests.cs:236`). Mesh: `ADirectoryAtThePathIsAnIoErrorOnReadAndWriteAndIsLeftAlone` (:149). Rust: `a_write_over_a_directory_stops_at_the_read_and_leaves_no_staging_file` RS:5726. +- **Known gaps.** TS and Python have no test for a directory at the store path. No follow-up is registered; the natural home is `write-set-vectors` with the other readability pins. + +### E. Lock + +- **Owner.** C#: `AcquireLock` CS:4082 (`.lock`, `FileShare.None`, 30 s wait), taken by `PushAll` CS:3766, `CommitBatchCore` CS:3795 and `ReplaceDurable` CS:4018, so Mesh writes wait for it. Rust: `with_exclusive_lock` RS:1038 and `with_shared_lock` RS:1031 (`fs2` flock on `.lock`, `open_lock_file` RS:1162), taken by `pull_all` and `push_all`. TS: no cross-process lock; a per-store promise queue (`#enqueue`) only. Python: `threading.RLock` PY:119, in-process only. +- **Inputs/outputs.** A read-modify-write request; the lock is held across the read and the replace for every writer that merges. +- **Derived state.** A writer's header and merge base come from a read taken inside the lock (C# `PushAll`, `CommitBatchCore`, `ReplaceDurable`; Rust `write_all_unlocked`). TS and Python take them from a read outside any cross-process lock. +- **Forbidden writers.** Any Mesh write outside `AcquireLock` (the former `File.Delete` plus `File.Move` writer and its fixed `path + ".tmp"` are deleted). C# readers on open take no file lock (`ReadSnapshot`), and Rust's read-only snapshot takes none by design. +- **Shared paths.** The C# store and the Mesh single-file helpers; the Rust store. +- **Cut line.** `mesh-single-file-reader` h1. +- **Pinned by.** Mesh `AMeshWriteWaitsForTheStoreLock` (`CultMeshSingleFileStoreTests.cs:187`, deterministic) and `ConcurrentMeshWritersNeverErrorAndLeaveAReadableFile` (:261); mutant m3 (`ReplaceDurable` without `AcquireLock`) killed. +- **Known gaps.** TS and Python have no cross-process lock; the mesh spec cites ruling `variants:ruling:write-lock-python-now-ts-later`, and no follow-up in this record carries the remaining TS work. `variants:follow_up:store-replace-cut` item 3: no test that `ReplaceDurable` reads under the lock. Prior art: `docs/research/cross-process-file-locking-prior-art.md`. + +### F. Replace (staging and atomic swap) + +- **Owner.** C#: `WriteSnapshotAtomically` CS:4104 (unique temp `.{name}.{guid}.tmp`, `WriteThrough`, then `File.Replace`, or `File.Move` when nothing is there), called from `WriteSnapshot` CS:4062 and `ReplaceDurable` CS:4016. Rust: `replace_unlocked` RS:1010, `stage_and_replace` RS:3011, `replace_file_atomically` (unix `rename` RS:3095; Windows `MoveFileExW` with retry RS:3106), then `sync_parent_directory` RS:3198; outcomes `Rejected`, `NotReplaced`, `ReplacedNotDurable`. TS: `#writeAll` TS:124-141 and `renameWithRetry` TS:198 (unique temp, no fsync). Python: `_replace_all` PY:154-159 (fixed `.tmp`, `Path.replace`, no fsync). +- **Inputs/outputs.** Encoded bytes in; the destination holds the old bytes or the new bytes, and a failed write removes its staging file (Rust pins the rename-failure path). +- **Derived state.** None. +- **Forbidden writers.** A second replace in a runtime. MESH's `WriteFileAtomically` is deleted; Mesh reaches the replace only through `ReplaceDurable`. +- **Shared paths.** C# cache flush, commit and Mesh writes; Rust `write_all_unlocked`. +- **Cut line.** `mesh-single-file-reader` h1 (C#). Rust's replace predates the campaign; `merge-r1` h3 added its rename fault seam. +- **Pinned by.** Rust `a_write_whose_rename_fails_is_not_replaced_and_leaves_no_staging_file` (seam `WriteStep::Rename` RS:3212). Mesh `ACacheOpeningDuringMeshWritesNeverSeesAnEmptyStore` (:212, Linux only; it skips Windows). +- **Known gaps.** `variants:follow_up:store-replace-cut`: (1) the Windows primitive, decided by open question `variants:question:windows-store-replace-primitive` (probe: `File.Replace` gave 1,722 empty opens in 17,313 under Mesh writers; `MoveFileExW` and POSIX rename gave none; `docs/research/windows-store-replace-prior-art.md`); (2) what a replace does to a live symlink (Mesh pins parity with a cache commit, `AMeshWriteOverALiveLinkLeavesWhatACacheCommitLeaves` :287); (3) a read-under-lock test; (4) a live directory link misreported as unreachable. Python's fixed temp name lets two processes share one staging file (research doc above). Rust's Windows replace loop and its rename fault line are unmutated (h3, undone). + +### G. Soft write decision (a soft flush writes only where nothing is) + +- **Owner.** The one reader decides; the writer does not. TS: `pushAll` TS:79-104 (absent writes; a readable store is left byte for byte; an unreadable one is refused; a dangling link is refused when soft). Rust: the soft branch of `push_all` RS:1268-1280 (`!read_store_unlocked()?.absent` returns). C#: none; `CultMesh`'s `FlushAsync(bool soft)` accepts the flag and drops it (`src/GameCult.Mesh/CultMesh.cs:433-436`). Python: no soft flush. cultmesh-ts passes the flag (`packages/cultmesh-ts/src/index.ts:4073`). +- **Inputs/outputs.** A flush with `soft`; no write for a readable store, a write for an absent one, the reader's refusal otherwise. +- **Derived state.** None. **Forbidden writers.** A soft check that reads the file its own way (TS `readStore` once returned zero bytes as present; deleted in h4). +- **Shared paths.** TS `pushAll` and Rust `push_all` only. +- **Cut line.** `merge-r1` h4 (TS) and h6 (Rust). +- **Pinned by.** The manifest walks run a soft flush over every vector in TS (the `softPushAll` operation, TS test :2336) and Rust (`soft_push_all`, RS:5149), each with an absent and a dangling-link case; `a_soft_push_all_writes_where_nothing_is_and_refuses_a_dangling_link` RS:6019. +- **Known gaps.** C# and Python have no soft decision, and the C# Mesh flag is dead; no follow-up is registered (h6 `undone` names it). `writer-dangling-link-tolerance` applies to the non-soft branch. + +### What no cut owns yet + +`c2a-write-set` replaces `ReplaceDurable` with `ApplyWriteSet` (comment at CS:4012-4013) and decides `writer-dangling-link-tolerance`. `write-set-vectors` owns `c0-bad-canonical-in-manifest` and `legacy-vectors-all-runtimes`. `merge-main` owns `range-check-in-ci`. Imagination owns `store-replace-cut`. diff --git a/docs/document-variants-target.md b/docs/document-variants-target.md new file mode 100644 index 00000000..0e62ece1 --- /dev/null +++ b/docs/document-variants-target.md @@ -0,0 +1,153 @@ +# CultCache Document Variants: Target + +Date: 2026-09-17 + +Status: target, before any substrate map or cut map. This document owns the ends. +A cut map, written after an Imagination pass over the Body, will own the means. +Branch: `codex/document-variants`. + +## Why + +A CultCache record today is always complete. To make a bigger laser from a +laser, an author copies the record and re-specifies every stat. For a ship hull +with several hardpoint layouts, every layout is a full copy of the hull. When +the base changes, each copy has to be found and edited by hand, and copies drift +apart silently. + +The first consumer is Aetheria's catalog (`F:\Projects\Aetheria\GameData\Aetheria.cc`), +edited in CultCache Studio: + +- **Hull variants:** one hull with several hardpoint layout options. A variant + replaces the whole `HullData.Hardpoints` member. +- **Item variants:** a bigger laser. A variant changes stats nested inside the + design's behavior list, for example one behavior's `PerformanceStat.Max`. + +## Rulings (operator, 2026-09-17) + +- **This is a CultCache feature, not an Aetheria mechanism.** Operator: "Yes, this + is absolutely a CultCache feature, write it up in CultLib". +- **A variant is stored as a delta from its base and resolved by the cache.** A + record stores a reference to its base plus a sparse set of overrides. The + cache resolves it; readers see complete documents. The operator chose this + over two alternatives. Authoring-only variants in Studio over flattened stored + copies leave a derived cache pretending to be data. Per-type variant records + in each consumer rebuild the feature bespoke for every type. + +## Ends + +- **Readers see complete documents.** `Get`, `GetAll`, lookups by name and by + index, watches and snapshots return resolved documents. No consumer outside + the cache and its authoring tools handles a delta. +- **A base change reaches its variants.** Editing a base changes every variant + that does not override the edited value. Watches, indexes and name lookups + observe that change on the variants too, in the same commit that changed the + base. +- **A variant is a record.** It has its own key and name, and references to it + behave like references to any record. In Aetheria a lot's design and a + product's design can name a variant directly. +- **Studio edits the delta.** It shows which values a variant inherits and which + it overrides, and it can clear an override so the base value applies again. +- **Loading refuses a broken variant loudly and names the records.** Cases: + - a cycle of bases; + - a base that does not exist; + - a base whose type the variant's type cannot inherit from; + - ~~an override naming a member that does not exist on the type~~ **superseded 2026-09-29 + (operator, variants Q4 c): a dangling override soft-drifts like any dropped member, ignored + with a warning; see `document-variants-cut.md` section 4.** + + Deleting a base that still has variants is refused. + +## Invariants that must survive + +- **Wire parity** for the persisted format (`src/GameCult.Caching/Contracts/cultcache-persistence-format.md`, + `docs/persisted-record-encoding.md`). Every runtime that reads a store holding + variants resolves them identically, or refuses the store loudly. Which + runtimes resolve is decided in the map, against + `docs/runtime-parity-scope.md`; none may misread silently. +- **One home store per type**, and atomic single-store commit + (`cultcache-store-composition.md`). A base change and the resulting variant + changes are one commit, not a repair that runs afterwards. +- **Schema compatibility** (`cultcache-schema-compatibility.md`): overrides are + subject to the same semantic identity, soft drift and hard rejection rules as + full records. +- **Compare-exchange** (`Expect`, `ExpectUnchanged`) keeps a single meaning for + variants. The map settles whether it tests the stored delta or the resolved + document; it must not mean both. + +## Fork rulings (operator, 2026-09-17) + +- **1, granularity: stable element identity, ids everywhere** (operator, 2026-09-17: "ids + everywhere"). + - Every object element in a list carries a stable id, minted when the element is created. + This is the approach of sequence CRDTs (RGA, YATA/Yjs, Automerge, Fugue). + - Matching algorithms (Myers, diff3, GumTree) are heuristics. They fail on look-alike + elements such as two `EnergyDraw` behaviors, which is why identity is minted, not + inferred. + - An override addresses an element id plus a member path in CultNet's grammar. An + insertion is a new element anchored after an existing id; a removal names the + removed id. Index addressing is out. + - Rebasing is deterministic. An override whose element id exists in the new base + re-applies. One whose element is missing is an explicit conflict that Studio shows, + to keep, retarget or clear; it is never silently retargeted. + - Existing stores get ids minted once, by a rewrite. +- **2, where resolution lives: at load, kept in memory** (operator: "agreed"). Resolution + computes a variant's complete document from its base chain and its overrides. + - The cache holds both the stored delta and the resolved document. + - A base edit re-resolves its variants inside the same commit, so watches and indexes + observe the change atomically. + - Compare-exchange (`Expect`) tests the stored delta. The resolved document is derived. +- **3, cross-store bases: no.** A variant and its base live in the same store. + *Future direction (operator, 2026-09-30, from Aetheria moddable ships):* "we'll want cross-store variant + support eventually; modders should be able to add variants of existing items without modifying the + original". Ruling 3 holds for this campaign. A mod store layering variants over a shipped catalog is the + named future consumer that would reopen it. Until then, no consumer builds its own cross-store resolver: + Aetheria's compose step stays out of resolution. +- **4, CultNet: deltas.** +- **5, runtimes: C# first.** TypeScript, Python, Rust and Kotlin refuse a store + or snapshot containing variants, loudly, until each implements resolution. +- **6, type change: the same concrete type only** (operator: "agreed"). + - An override can only name members the base type has, and rebasing requires the same + type. + - A variant whose type differs from its base's is refused loudly. + - Subtype variants are parked until real content needs a template base. A record + flagged as a template, not a real item, may be the smaller feature. +- **7, clearing and rebasing.** + - Clearing an override removes that member from the variant's stored delta. A member + that is not overridden is not stored. + - Rebasing (changing a variant's base) is supported. Operator: "rebasing is a nice + tool to have, things can get annoying otherwise". + +## Open forks, for the Imagination pass to map and the operator to rule + +1. **Override granularity.** + - Top-level members are enough for hardpoint layouts. + - A bigger laser needs overrides inside list elements. Addressing list + elements by index is fragile: an insertion into the base silently retargets + every variant's overrides. + - Candidates: stable element identity (for example a behavior's type within its + design); replacing whole list elements only; or addressing paths. + - CultNet's selection work already resolves member paths per leaf type, + inherited members included (`docs/cultnet-selection-cut.md`). A variant's + delta addressing should reuse that grammar, not invent a second one. +2. **Where resolution lives:** at load in the cache core, lazily on read, or as a + materialized view the cache maintains. This affects memory, watch cost, and + the compare-exchange meaning. +3. **Base and variant across stores.** Can a variant in one store name a base in + another (a run-store variant of a catalog record)? This interacts with + one-home-store routing and read-only stores. +4. **CultNet.** Do variants travel as deltas, or resolved? A subscriber that + receives only resolved documents needs no resolver; one that edits needs + deltas. +5. **Runtime scope.** Which of C#, TypeScript, Python, Rust and Kotlin resolve, + and which refuse a store containing variants. +6. **Type change.** May a variant's type be a subtype of its base's type, + adding members, or must the two types match? +7. **Clearing and reparenting.** What clearing an override writes, and whether + a variant can change its base. + +## Not in scope + +- Scaling or formula variants ("every stat times 1.5"). An override states a + value. Generated authoring can compute values. +- Any Aetheria catalog content. Aetheria adopts the feature after a release, as + its own cut. diff --git a/docs/mutation-testing.md b/docs/mutation-testing.md new file mode 100644 index 00000000..8db67be5 --- /dev/null +++ b/docs/mutation-testing.md @@ -0,0 +1,159 @@ +# Mutation Testing + +CultLib measures its C# test suites with Stryker.NET, pinned as a repo-local +tool in `dotnet-tools.json`. Coverage is added project by project; a project +with no `stryker-config.json` next to its test project has not been scoped +yet (see "Follow-ups" below for what's outstanding). + +## Running it + +Restore the tool once per checkout: + +```powershell +dotnet tool restore +``` + +Run a full mutation pass from a covered test project's directory, for +example CultMath: + +```powershell +cd packages/cultmath/tests/CultMath.Tests +dotnet stryker -t mtp +``` + +`-t mtp` selects Stryker's Microsoft.Testing.Platform runner. It is required +for test projects on `xunit.v3` (CultMath.Tests is one): Stryker's default +`vstest` runner's coverage capture does not work against xunit.v3's native +test host and the run stalls retrying test sessions indefinitely. Projects +still on `xunit` v2 with `xunit.runner.visualstudio` can use the default +`vstest` runner. + +For a single cut, scope the run to what changed instead of the whole +project: + +```powershell +dotnet stryker -t mtp --since: +``` + +Use a full commit SHA for `--since`, not an abbreviation: `git rev-parse +` first, then pass the full result. Stryker resolves `--since` +through the same git plumbing a short SHA can resolve ambiguously (or fail to +resolve at all) depending on the checkout's object database, and a +misresolved base silently changes what "since" means instead of erroring. + +In a container, also set `git config --global --add safe.directory '*'` +before running Stryker (or any other command that shells out to `git` +against this checkout) - git refuses to operate on a repository owned by a +different user by default, which is the common case for a bind-mounted +checkout in a container. + +Reports land in `StrykerOutput/` next to the test project (git-ignored). +Open the `reports/mutation-report.html` file for a browsable view, or read +`reports/mutation-report.json` for a scriptable one. + +## Triage rules + +The mutation score is not a gate (`break` threshold is 0). Every surviving +mutant is a finding about the tests, not a build failure, and gets triaged +into one of: + +- **missing behavioural test** — name the test that should exist and what + branch, edge case, or component it would exercise. +- **degenerate fixture** — the code path is exercised, but the fixture's + values make two different mutants produce the same observable result (a + zero component that erases a `+`/`-` distinction, an already-normalized + input that erases a `*`/`/` distinction, all-equal or all-same-sign inputs + that erase a boundary or `&&`/`||` distinction). Fix the fixture, don't + invent a new one that only kills that one mutant. +- **equivalent** — the mutant cannot change behaviour. Float-threshold + boundary flips (`>` to `>=`) are equivalent by default. A reasoned + equivalence claim (for example, `>>` and `>>>` on an already-unsigned + operand) needs its one-line reason recorded, not assumed. + +Do not write a hand-rolled mutation suite or anchor test as a substitute. +Where the tool can't reach (native/shader/editor code), the defence is a +behavioural test at the layer the rule is decided, not a committed mutation +harness. + +## Known tool caveat + +Stryker 5.0.0's `mtp` runner is documented as preview. Its per-test coverage +capture was found to report false "Survived" verdicts specifically for +mutations inside `static readonly` field initializers that a test does +cover (confirmed by hand-mutating `bool3.@false` and `bool4.@true` and +running the full suite directly with `dotnet test`, both of which fail +against the mutation that Stryker reported as surviving). Treat a survivor +inside a `static readonly` field initializer as unproven until confirmed +with a direct `dotnet test` run against the same mutation; do not triage it +as a missing test without that check. + +A survivor that looks like it must be covered is unproven until confirmed +with a direct `dotnet test` run against the same hand-applied mutation - but +confirm what the mutant actually is before drawing a tooling conclusion from +it. An earlier pass here reported three survivors in +`CultGeometrySurfaceNets.TryGetOtherEndpoint`'s per-axis `if (x + 1 >= +sizeX) return false;` guards and initially triaged them as a `vstest` +coverage false-survivor (the same shape as the `mtp`/`static readonly` +caveat above). That triage was wrong: the actual mutant Stryker reports +there is `return false` -> `return true` inside the guard, which is +equivalent, not a coverage miss. Returning `true` from +`TryGetOtherEndpoint` still leaves the out `other` coordinate equal to the +current coordinate (see the method: `other` is cloned from `coord` and only +one component is incremented when the method returns `true`), so the caller +compares a sample against itself, the inside/outside flags always match, +and the crossing is skipped exactly as it would have been had the method +correctly returned `false`. No test can distinguish the two branches because +there is nothing to distinguish - it is a legitimate equivalent mutant, not +evidence of a `vstest` false survivor. + +`CultGeometrySurfaceNets.Extract`'s `if (inside == (OrientationSign[axis] < +0))` (the sole authority for quad winding after the geometric cross-product +fallback was deleted) has three mutants on that line: `==` -> `!=`, and `< 0` +negated to `> 0` or widened to `<= 0`. The first two, `inside != (OrientationSign[axis] +< 0)` and `OrientationSign[axis] > 0`, are both reported `Killed`. The third, +`OrientationSign[axis] <= 0`, survives, but it is an equivalent mutant, not a +coverage gap: `OrientationSign` is the fixed table `{ 1, -1, 1 }` and never +holds `0`, so `< 0` and `<= 0` agree on every value the table can actually +produce. There is nothing for a test to distinguish, the same shape as the +`TryGetOtherEndpoint` equivalent mutant above. + +No `vstest` coverage-based false survivor has actually been confirmed for +GameCult.Geometry. Every survivor triaged here so far has turned out to be a +genuine equivalent mutant once hand-mutated and checked directly against +`dotnet test`; treat any survivor that looks like it must obviously be +covered as unproven until confirmed the same way, but do not cite this +project as precedent for the `vstest` caveat itself - that caveat is +`mtp`-runner-specific and documented above for `static readonly` field +initializers, and GameCult.Geometry has never actually hit it. + +## Follow-ups + +CultMath.Tests and GameCult.Geometry.Tests are the only projects currently +scoped. GameCult.Geometry's `stryker-config.json` has no `test-runner` +entry: the project is NUnit 4 with `NUnit3TestAdapter` and +`Microsoft.NET.Test.Sdk`, so Stryker's default `vstest` runner applies +directly (no `mtp` workaround needed, unlike CultMath.Tests's xunit.v3 +suite). + +GameCult.Geometry has only ever been run `--since:`-scoped to the cut that +added surface nets; a full-project baseline (running mutation against all of +`CultGeometryIsoSurface`, `CultGeometryDocuments`, and +`CultGeometryPrimitives`, not just the diff) is a recorded follow-up, not +something either cut did. + +That first `--since` pass did not actually stay diff-scoped: adding +`stryker-config.json` itself in the same cut that first used it made Stryker +log "391 mutants will be tested because: Non-CSharp files in test project +were changed" and mutate the whole `mutate` glob (all four existing +GameCult.Geometry source files), not just the new surface-nets files. A cut +that changes a non-C# file inside the test project (a fixture, this config +file, anything under `Fixtures/`) loses `--since` line-level scoping for that +run; a future cut whose diff is C#-only, against a base commit that already +has `stryker-config.json`, should scope correctly. + +`GameCult.Caching`, `GameCult.Mesh` (+ `.Quic`, `.Quic.Native`), +`GameCult.Networking` (+ `.WebSockets`), and the non-.NET runtimes +(`cultcache-rs/py/ts`, `cultmesh-*`, `cultnet-*`) each still need their own +`stryker-config.json` (or ecosystem-equivalent tool: `cargo-mutants` for +Rust, `StrykerJS` for TypeScript, `mutmut` for Python) and a baseline pass. +None of that is wired into CI yet. diff --git a/docs/nuget-packaging.md b/docs/nuget-packaging.md index afc94570..ed8746bb 100644 --- a/docs/nuget-packaging.md +++ b/docs/nuget-packaging.md @@ -1,5 +1,8 @@ # NuGet Packaging +See `docs/semver-policy.md` for what a version bump on these packages is +required to mean and how a release is checked against that before it ships. + CultLib publishes the managed dependency graph as separate packages. The leaf package is `GameCult.Mesh`; its NuGet dependencies preserve the CultMesh, CultNet, and CultCache ownership boundaries. @@ -8,9 +11,12 @@ CultNet, and CultCache ownership boundaries. powershell -ExecutionPolicy Bypass -File .\scripts\pack-nuget.ps1 ``` -The command creates a local feed under `artifacts/nuget`, verifies that every -internal dependency package exists at the same version, then restores and runs -a clean .NET consumer using only `PackageReference Include="GameCult.Mesh"`. +The command packs `GameCult.Mesh`, `GameCult.Networking.WebSockets`, and every +project they reach through `ProjectReference` (including `GameCult.Math`, which +carries its own version) into a local feed under `artifacts/nuget`. It verifies +that each of those packages exists at the identity MSBuild reports for it, then +restores and runs a clean .NET consumer using only +`PackageReference Include="GameCult.Mesh"`. The Unity distribution remains `org.gamecult.cultlib`, built by `scripts/build-unity-package.ps1`, because Unity consumes the managed assembly @@ -19,5 +25,5 @@ closure through UPM rather than NuGet restore. Install the Unity package from the immutable release tag: ```text -https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.46 +https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.57 ``` diff --git a/docs/research/analytic-integration-feasibility.md b/docs/research/analytic-integration-feasibility.md new file mode 100644 index 00000000..de74e5da --- /dev/null +++ b/docs/research/analytic-integration-feasibility.md @@ -0,0 +1,286 @@ +# Analytic noise integration along warped rays: feasibility probe + +Campaign `cultmath-tapes`, Imagination probe, 2026-10-03. This is a measurement, +not a spec. The tape target stays parked under ruling +`cultmath-tapes:ruling:tape-target-unparks-when-asura-stable`. + +**Verdict.** Exact integration of the noise does not beat sampling for optical +depth on either shipped field. +- The exact line integral of CultMath `snoise` is cheap and correct. Affine warp + spans are long, at 100 to 300 world units. +- The exact noise integral is not the optical depth, because both densities are + nonlinear in the noise. + - The void's wall profile is `pow(·, 0.40)` with two clamps. + - Aetheria's fog is clamped at zero and goes opaque within a few world units. +- Given the *exact* span mean of the noise for free, the resulting transmittance + is still 3.6x worse than the shipped march on the void and 22x worse on the + wells. +- Exact integration wins only on the linear functional `∫ n dt` of octaves the + march undersamples. That gain does not survive the density's nonlinearity. +- Aetheria's triangle noise is integrable exactly as piecewise linear, but costs + 3x to 22x the march, and its shipped form does not meet the preconditions. + +## Scenarios and method + +- **Void:** the shipped void (`NoiseBoundTests.VoidField.Shipped()` at + `hands/cultmath-interval-ops` 2c8585bd). + - Rh 198, S 50, Rc 248, K 1/30, A 20, F0 0.01 (cells of 100 and 25 world), warp + D 10. + - The shipped orbiting camera, N = 8 tiles at f = 935, one jittered pixel ray per + tile. +- **Wells:** the test's Aetheria wells at warp D = 60 (`FogField.Wells(60)`). + - F0 1/414.2167, A 20, B 10, extinction 0.5, flow frequency 1/512, period 8. + - Like the test, this uses the snoise field shape (r1's), not Aetheria's own + triangle noise. Triangle noise is measured separately below, on the same rays. +- **Rays:** 200 per scenario, and 120 for the triangle basis. + - The wells give 147 rays with an active interval; the rest look up and miss + the fog. + - The active interval is where the envelope leaves the density to the noise. + It is cut where the true optical depth reaches 6. + - Active length per ray: void median 140 world (p10 114, p90 193); wells median + 268 (p10 137, p90 623). +- **March steps:** the void's march step (LodStep, 12.5 in z) is a median 14.9 + world along the ray. The wells' quadratic grid gives a median of 9.1 in the + active region. +- **Warp:** `w(p) = flow(p) · shift`, so the affine error scales exactly with + `|shift|`. + - Spans are grown at the worst phase shift, Period / 2. A span is therefore + valid at every frame's phase, for any camera that crosses the same world + segment. + - Each span is anchored at p0 with J·d from a central difference. It grows in + 1-unit (void) or 2-unit (wells) steps until `|w − (w0 + J·d·Δ)| > τ`. +- **Exact simplex integral:** CultMath `snoise(float3)` has kernel radius² 0.5, + so its support never leaves the incident simplices. + - Along a line it is therefore a sum over the lattice points within √0.5 of the + line. Each point contributes `∫ (0.5 − |x|²)⁴ (g·x) dt` on its chord, a + closed-form degree-9 polynomial. + - Validation: + - The lattice sum matches `snoise` within 2e-4 (float32 rounding at + coordinates near 300). + - The segment integral matches a 5e-4-step quadrature within 2.5e-5 per + unit length. +- **Run:** probe code was in a scratch clone (probe-clone@91c8cbf1, never merged) + and ran on Yggdrasil through the verify stopgap, in a dotnet 10 container with + 4 CPUs. Timings are single-threaded C# on that host and are relative. + +## 1. Affine-valid span length (ray length, world units) + +| τ (× coverage cell) | Void p10 / median / p90 | Wells p10 / median / p90 | +|---|---|---| +| 0.05 | 94 / 129 / 211 | 71 / 103 / 169 | +| 0.10 | 141 / 197 / 324 | 108 / 151 / 253 | +| 0.25 | 263 / 420 / 1244 | 184 / 275 / 715 | +| 0.05 × detail cell | 44 / 63 / 97 | 34 / 47 / 75 | + +- One affine span at τ = 0.1 covers about 13 void march steps and about 16 wells + march steps. +- The void shell is shorter than one span. The tiled spans are clipped by the + active interval, at a median of 27 world and 2 spans per ray. +- On the wells, the tiled spans run a median of 128 world, with 2 per ray (p90 4). +- The tangent anchor is the worst affine choice. A secant or Chebyshev fit over + the span cuts the error bound by 2x to 8x, so the spans could be about 1.4x to + 2.8x longer at the same τ. That was not measured. + +## 2. Simplex cells per span, per octave + +Octave `xm` is the coverage octave's frequency times m, warped like the coverage +octave. The shipped detail octave is x4 and is *unwarped* in both fields, so it +needs no affine span at all. + +Counts are for τ = 0.1 tiled spans with both warp phases, given as the median and +then the p90. The rows are simplex cells crossed, then lattice points touched, +which is the exact work. + +| Octave | Void cells | Void lattice points | Wells cells | Wells lattice points | +|---|---|---|---|---| +| x1 | 6 / 16 | 10 / 16 | 4 / 8 | 8 / 10 | +| x2 | 8 / 27 | 10 / 26 | 8 / 12 | 10 / 14 | +| x4 | 13 / 52 | 14 / 44 | 12 / 20 | 14 / 20 | +| x8 | 20 / 100 | 20 / 80 | 22 / 38 | 22 / 34 | +| x16 | 40 / 201 | 35 / 154 | 44 / 72 | 38 / 60 | +| x32 | 75 / 396 | 62 / 302 | 86 / 144 | 70 / 112 | +| x64 | 151 / 793 | 118 / 592 | 172 / 287 | 132 / 218 | + +- On the same spans, the march takes a median of 2 samples per span on the void + (p90 10) and 12 on the wells (p90 25). +- A straight line touches 3.44 lattice points per noise unit. + +## 3. Cost: exact against the march + +- **Measured cost.** + - One snoise is 530 to 610 ns in C# on this host. + - One lattice-point integral (hash, gradient, closed-form polynomial) is + 85 ns, or 0.16 snoise. + - With this probe's naive box-scan enumeration it is 1.24 snoise. That is an + upper bound; a simplex walk visits only crossed cells. +- **How the table counts.** Exact is lattice points × 0.16 + 1 snoise per span + for the Jacobian. March is 1 snoise per sample. Both sides carry the two warp + phases. +- **Tolerance.** τ is 0.1 × *that octave's own* cell, so the affine error is + comparable across octaves. +- **Columns.** The two error columns are RMS errors of the active-length mean + of one warped octave. The last error column is what replacing the octave by its + expectation of 0 costs. + +| Octave | Void exact/march cost | Void err exact / march / expectation | Wells exact/march cost | Wells err exact / march / expectation | +|---|---|---|---|---| +| x1 | 0.36 | 1.1e-2 / 1.6e-3 / 0.21 | 0.11 | 1.9e-2 / 9e-5 / 0.29 | +| x2 | 0.46 | 1.0e-2 / 4.7e-3 / 0.13 | 0.15 | 1.5e-2 / 2e-4 / 0.21 | +| x4 | 0.68 | 9.0e-3 / 4.0e-2 / 0.10 | 0.23 | 1.1e-2 / 5e-4 / 0.18 | +| x8 | **1.03** | 5.8e-3 / 8.0e-2 / 0.067 | 0.36 | 7.2e-3 / 1.1e-3 / 0.10 | +| x16 | 1.64 | 4.0e-3 / 9.0e-2 / 0.050 | 0.56 | 6.4e-3 / 9.4e-3 / 0.088 | +| x32 | 2.89 | 2.8e-3 / 0.105 / 0.036 | 0.87 | 4.7e-3 / 3.3e-2 / 0.057 | +| x64 | 5.26 | 2.0e-3 / 0.095 / 0.025 | **1.44** | 3.2e-3 / 5.3e-2 / 0.040 | + +- **Where exact stops paying on cost:** + - At the measured kernel cost: x8 on the void and between x32 and x64 on the + wells. + - At the brief's model of one snoise per cell crossed: about x1 to x2 on the + void and x8 on the wells, from the per-span table in the probe log. +- **Exact against the march on accuracy:** + - At the shipped step the march is *more* accurate for octaves it oversamples: + void x1 to x2, wells x1 to x8. The exact path's error floor is the affine warp + error, about 1e-2 at τ = 0.1 per cell, and it scales with τ. + - Exact is more accurate at about 0.7x the cost where the march undersamples: + void x4 to x8, wells x16 to x32. + - Above about x16 on the void, the undersampled march is worse than simply + using the expectation (0.095 against 0.025 at x64). That is a band-limiting + result, which the footprint octave weights already exploit. It is not an + exact-integration result. + +## 4. High-octave variance over a span + +- **Span-mean statistics.** Over straight lines of noise length ℓ, the std of + the snoise span mean, against a point std of 0.358, is: + - 0.234 at ℓ = 1; + - 0.170 at ℓ = 2; + - 0.121 at ℓ = 4; + - 0.087 at ℓ = 8; + - 0.061 at ℓ = 16; + - 0.031 at ℓ = 64. + + This is about ℓ^-0.5: the high octaves average out like a random field, not + like a periodic one. +- **Detail octave replaced by its expectation of 0,** on τ = 0.1 spans, measured + as |ΔOD| per span: + - Void: median 0.000 and p90 0.091. Relative to the span's OD (OD > 0.01) the + median is 2.5% and the p90 is 7.6%. The mean detail displacement is a median + 1.0 world (p90 3.6) against the ramp width S = 50. + - Wells: median 0.11 and p90 5.7 optical depths. The relative median is 72%. +- **Why the wells are so bad.** Normalised to the clamp, the density moves + A·fade/B = 2 per unit of noise, and with extinction 0.5 that is 1 optical depth + per world unit per unit of noise. The mean detail displacement of 1.5 world + (p90 3.8) is 15% to 38% of the floor blend B = 10. The wells' optical depth is + set by where the clamp boundary lies, and that is exactly what the expectation + erases. +- So the expectation is adequate for the void's detail octave and is not + adequate for the wells. + +## 5. The clamp and other nonlinearity + +- **Void.** 50.0% of τ = 0.1 spans cross a regime boundary: 0 (d' ≤ Rh), the + wall ramp, or K (d' ≥ Rc). 45.6% of the active length lies in the ramp, where + the density is `K max(0, 1 − 1.5 (1 − (d'/Rc)²)^0.40)`. That is not a + polynomial in n, so exact ∫n does not give ∫ρ there. Outside the ramp the + density is constant and needs no noise. +- **Wells.** 42.3% of spans cross the clamp. Only 9.8% of the active length is + unclamped, so most of the length where the noise "matters" is length where the + noise only decides whether the density is zero. +- **The decisive check: transmittance error.** This is the sup over the ray of + |T_est − T_true|, with the truth taken on a 0.5- or 1-unit grid. + + | Estimator | Void median / p90 | Wells median / p90 | + |---|---|---| + | Shipped march | 0.020 / 0.038 | 0.033 / 0.155 | + | March at 4x density | 0.006 / 0.009 | 0.030 / 0.049 | + | Density of the *exact* span-mean n (τ = 0.1 spans) | 0.072 / 0.125 | 0.719 / 0.997 | + + The last row is an upper bound on what any exact-mean method can deliver + without also modelling the distribution inside the span. It is the + Heitz-style correction the survey describes. It loses to the march on both + fields. + +## Triangle basis (operator's addition) + +The triangle noise is `triNoise3d` in Aetheria `Assets/Shaders/Volumetric.cginc` +(origin/master f1dee184). +- `tri(x) = |frac(x) − 0.5|`. +- It runs two Nimitz-style iterations. Each iterates `p += tri3(bp·2)`, scales + `bp` by 1.8 and `p` by 1.2, and adds `tri(p.z + tri(p.x + tri(p.y)))/z`. +- It makes 18 tri calls per evaluation. + +As shipped, `density()` uses it as follows: +- `pow(triNoise3d(·), exponent)`, with Noise.Exponent −0.25 multiplied by a + slope `flatness` read from a texture (NOISE_SLOPE is on). +- Two phases, warped by `globalFlow`, which is + `Tri3D = cross(normalize(tri3(P)), normalize(tri3(1.618P))) × 15`. +- The fine octave at ×8 is evaluated at a `pos` whose y the coarse octave has + already displaced. +- Amplitude −36.17. + +Self's reading, tested: + +- **"The warped ray is an exact polyline."** This holds for the warp *inside* + `triNoise3d`. It does not hold for Aetheria's flow: `normalize` and `cross` + make the flow piecewise rational. With the normalize dropped, the cross product + of two piecewise-linear vectors is piecewise quadratic. tri composed with a + piecewise polynomial stays piecewise polynomial of the same degree, with + breakpoints at quadratic roots, so that variant is still closed-form. + Counted along the real flow at the worst shift, the kinks run 15% to 30% above + the straight-ray counts, but the pieces between them are curved. +- **"The clamp roots are linear."** This holds only if the exponent is 1. With + −0.25·flatness, each piece is `(a + bt)^e`. One such piece has a closed-form + integral, but the clamp's root on a sum of two powered phases plus the + smoothstep fade has none. +- **"Whole periods give the exact mean."** This holds for one triangle wave at + whole periods, where the mean is exactly 0.25. It fails for the composed form, + which has no period along a general line; the scales 2, 1.8 and 1.2 and the + nested warp are incommensurate. + - Measured on lines, the span-mean std of `triNoise3d` is 0.029 at ℓ = 1, + 0.010 at ℓ = 8 and 0.0042 at ℓ = 64, against a point std of 0.083. That is + about ℓ^-0.47, the same random-field decay as simplex. + - Its bias against the global mean of 0.1995 is within ±0.0015, so the + expectation is unbiased. It is not exact. +- **The cost decides it.** The exact piecewise-linear walk is verified, matching + a 1e-4 quadrature within 3.4e-8. But the nest has 77.7 linear pieces per noise + unit of straight line, against 3.44 lattice points for simplex. + - One piece costs 1.38 point evaluations with a derivative carried. + - At Aetheria's scale, on the wells rays, the pieces per world unit and the + exact cost relative to the march are: + + | Octave | Pieces per world unit | Exact cost / march | + |---|---|---| + | x1 | 0.20 | 2.8x | + | x2 | 0.38 | 5.5x | + | x4 | 0.76 | 11x | + | x8 (shipped fine) | 1.5 | 22x | + | x64 | 12 | 176x | + + - On the void rays it is 4.1x at x1 and 29x at x8. + - At the same time the march's RMS error on the span mean is already small: + 2.4e-3 at x1 and 1.7e-2 at x8. + +## Per-basis verdict + +| Basis | Exact line integral | Under the shipped warp | Optical depth | Verdict | +|---|---|---|---|---| +| Simplex (CultMath `snoise`) | Closed form, 0.16 snoise per lattice point, 3.44 points per noise unit; validated | Affine spans of 100 to 300 world at τ = 0.1 cell; error floor about 1e-2 | Not delivered: the void's pow profile and the wells' clamp make ρ nonlinear in n; the exact-mean transmittance loses 3.6x and 22x | **Viable kernel, wrong target.** Pays only if the density were affine in n over the span, or as a control variate for a march (survey §4, Kettunen 2021) | +| Triangle (`triNoise3d`) | Closed form per linear piece; validated | Not piecewise linear under Aetheria's normalized-cross flow or the −0.25 power; made linear by exponent 1 and a non-normalized flow | Same nonlinearity, plus 78 pieces per noise unit | **Loses.** 3x to 22x the march even where its preconditions hold | +| Gabor kernels (survey §1.2, not probed) | Closed form for any affine-transformed kernel (complex erf, at most 16 terms) | The affine warp spans above transfer directly, with each span a whitening transform | Same density-nonlinearity limit | **Candidate smooth basis for large structure**, to be measured only if the density is first made linear in the noise over a span | + +## What would change the verdict + +- **A density that is affine in the noise inside a span.** For example, the + void's ramp replaced by a linear ramp in d', with clamp crossings bracketed by + the interval bound. Exact simplex integration would then deliver optical depth + directly in the 54% of void length that is outside the ramp's clamps. As + measured, that 54% is constant density and needs no noise at all. +- **Exact integration as a control variate,** not a replacement. The exact mean + is cheap and unbiased for ∫n, and the march corrects the nonlinear residual. + That is the Kettunen construction. It was not measured here. +- **Wider skipping.** The operator's first idea, skipping space outside the warp + range, is already what the interval envelope does, and the probe's active + intervals are its output. + - On the void the noise matters over only about 140 world per ray. + - On the wells, opacity ends the ray within a few world units of entering the + unclamped region. diff --git a/docs/research/analytic-noise-integration-prior-art.md b/docs/research/analytic-noise-integration-prior-art.md new file mode 100644 index 00000000..44810215 --- /dev/null +++ b/docs/research/analytic-noise-integration-prior-art.md @@ -0,0 +1,425 @@ +# Analytic Noise Integration Along Warped Rays: Prior Art Survey + +This is the facts file for an idea the operator raised on 2026-10-03: + +> "I would be happy if we could just skip the space we know has no meaningful structure +> because it's outside of the noise warp range. But what you said about affine arithmetic +> makes me wonder if we can somehow, even within the distorted domain, figure out a series +> of optimal (in terms of extracting structure over multiple frames) spans for which we can +> analytically integrate the noise gradients over those ray segments." + +Self's sketch, as given to this pass: + +- Simplex noise along a straight ray is piecewise polynomial in t, so its line integral + is closed-form per crossed cell. +- A domain warp p + w(p) is nearly affine over a short span, with an affine-arithmetic + error bound, so within that span the warped ray is a straight line in noise space. +- Low octaves are integrated exactly. High octaves are replaced by their expectation, + with a variance bound. +- Clamped density max(0, n - c) is integrated by root-finding per piece. +- Spans are cached and refined across frames. + +Eyes pass, 2026-10-03. This file gives facts and evidence pointers only. It makes no +recommendation. + +Verification marks: + +- **[fetched]** The claim was read in the cited source's full text during this pass. + PDFs were converted with `pdftotext -layout`. +- **[search]** The claim came from a search-result summary or abstract, not a full read. +- **[derivation]** The claim is elementary mathematics worked out in this pass from a + fetched definition. It is not a claim made by any cited source. +- **[not found]** The pass searched for this kind of work and found nothing. + +## 0. Premises of the sketch, checked against definitions + +- **[fetched] + [derivation]** Simplex noise kernel degree. Gustavson, *Simplex noise + demystified* (2005), gives the 3D reference code. Each of the four simplex corners + contributes `t^4 * dot(g, d)` with `t = 0.6 - |d|^2`, and the contribution is zero + when `t < 0`. On a straight ray `d` is affine in the ray parameter, so `|d|^2` is + quadratic and each corner term is a polynomial of degree 8 + 1 = 9. The pieces have + two kinds of breakpoint: the simplex faces the ray crosses (where the corner set + changes), and the entry and exit of each corner's support sphere (`|d|^2 = 0.6`). + Both kinds are roots of polynomials of degree 2 or lower in the ray parameter, so the + breakpoints are closed-form. With the 0.6 radius, the support extends past the + simplex, and the reference code truncates it at the simplex boundary. The resulting + small discontinuity across faces is a known property of that constant. It does not + change the piecewise-polynomial structure. +- **[derivation]** Classic Perlin noise (Perlin 2002 quintic fade `6t^5 - 15t^4 + 10t^3`, + read in Gustavson's text **[fetched]**) is, within one lattice cube along a straight + ray, a polynomial of degree 3 x 5 + 1 = 16. Its breakpoints are the cube faces. +- **[fetched]** Piece count grows with frequency. Balint (CESCG 2019, section 2) + states that many noise functions are piecewise integrable, but the number of pieces + is linear in the noise frequency. Their cost is therefore similar to numerical + integration. Balint designed cosine noise to escape this limit (section 1.1 below). +- **[derivation]** For the clamp `max(0, n - c)` on a degree-9 or degree-16 piece, + the roots of `n - c` are needed. Polynomials of degree 5 or more have no general + closed-form roots (Abel-Ruffini), so the clamp needs numerical root isolation per + piece, for example Sturm sequences, Descartes' rule or Bernstein-basis subdivision. + The integral between the isolated roots is closed-form. + +## 1. Closed-form line integrals of noise, and analytic optical depth + +### 1.1 Cosine noise: Balint, *Closed Form Transmittance in Heterogeneous Media Using Cosine Noise*, CESCG 2019 (non-peer-reviewed) + +- **[fetched]** It computes noise defined as an offset plus a sum of cosines of + `x . S_i`. The paper uses 24 quasirandom vectors S_i, with Sobol directions on the + sphere and lengths in [0.8, 1.2], to look roughly like Perlin noise. Fractal octaves + are further cosine sets. Its line integral is a sum of sines, so the optical depth + over any segment is exact. The paper says this takes two noise samples, one at each + segment end. It also gives closed-form distance sampling, by inverting the integral + with binary search. +- **[fetched]** Cost: two noise-sized evaluations per segment, independent of octave + count. Table 1 reports transmittance evaluation at 179 ms closed-form against + 1250 ms for delta tracking, about 7x faster. A real-time demo with 16 samples ran + at 80 fps at 675 x 1200 (RTX 2080 Ti). +- **[fetched]** Error: exact, with no error term, for the bare sum. The limits are + stated in section 6. Multiplying by a shape function, or composing with a shaping + function, generally destroys the elementary antiderivative. The workarounds + recover exactness only piecewise: constant multipliers between bounding isosurfaces, + or a cubic polynomial interpolant of the multiplier along the ray, since the product + of a polynomial and cosines has an elementary antiderivative. Negative densities from + a low offset are handled by clamping samples and integrals, which is not an exact + `max(0, .)` integral. Domain warp is not discussed. + +### 1.2 Gabor kernels: Condor, Hermann, Yurtsever, Didyk, *Gabor Fields: Orientation-Selective Level-of-Detail for Volume Rendering*, ACM TOG 45(4) art. 62, 2026 (arXiv 2602.05081) + +- **[fetched]** It computes closed-form definite line integrals of anisotropic 3D Gabor + kernels along an arbitrary ray segment (eq. 9). Each kernel is whitened into its + canonical space with a ZCA matrix, so any covariance, that is any affine-transformed + kernel, uses the same formula. The segment integral is the real part of a + complex-erf (Faddeeva) difference. +- **[fetched]** Cost: the complex erf is evaluated by a truncated Taylor series with + early exit, capped at 16 terms. Segments shorter than 1e-4 in whitened units fall back + to a single midpoint evaluation. Kernels are spatially clamped with an adaptive extent + that shrinks with frequency (eq. 15). The paper also renders procedural clouds as + Gaussians modulated by Gabor noise. +- **[fetched]** Error: each segment integral is exact apart from the erf truncation. + Orientation-selective masking of kernels whose line integral is near zero trades a + small error, or variance under stochastic selection, for speed. The paper reports + about 1.78x to 1.96x speedups. Per segment the density-integral estimator is + unbiased, but transmittance is biased by Jensen's inequality. Eq. 19 gives the + second-order bias as `0.5 * Var(tau) * exp(-E[tau])`. + +### 1.3 Analytically integrable media, older + +- **[search]** Iser, *Real-time Light Transport in Analytically Integrable + Quasi-heterogeneous Media*, CESCG 2018. Balint cites it **[fetched]** as using only + exponential and spherical density functions. +- **[fetched via Gabor Fields related work]** The closed-form Gaussian-primitive + transmittance line (Knoll et al. 2021; Condor et al. 2025, *Don't Splat your + Gaussians*) is the base that Gabor Fields extends. + +### 1.4 Piecewise-polynomial segment integration in scientific volume rendering + +- **[fetched]** Engel, Kraus, Ertl, *High-Quality Pre-Integrated Volume Rendering Using + Hardware-Accelerated Pixel Shading*, Graphics Hardware 2001. The scalar field along + the ray is assumed piecewise linear between samples. The volume rendering integral of + each linear segment, through an arbitrary nonlinear transfer function, is then one + lookup in a table indexed by front scalar, back scalar and segment length. Cost: one + texture lookup per segment, plus recomputing the table when the transfer function + changes. Error: exact for the piecewise-linear model. The model error is the + scalar field's deviation from linear between samples. +- **[search]** Williams, Max, Stein, *A High Accuracy Volume Renderer for Unstructured + Data*, IEEE TVCG 4(1), 1998. Exact integration through tetrahedra with linearly + varying scalar and piecewise-linear transfer functions. + +### 1.5 Polynomial noise along a ray + +- **[not found]** No published closed-form segment integral of Perlin or simplex noise + was found, as a method or a code library. Balint's remark in section 0 is the only + published statement found on the piecewise approach, and it dismisses it on cost + grounds. + +## 2. Noise designed for analytic filtering or integration + +- **[fetched]** Lagae, Lefebvre, Drettakis, Dutré, *Procedural Noise using Sparse Gabor + Convolution*, ACM TOG 28(3), 2009. It computes a sparse-convolution noise of Poisson + impulses with Gabor kernels. Each kernel is a Gaussian in frequency, so filtering with + a Gaussian pixel filter multiplies Gaussians, which gives an analytically filtered + kernel. Cost: the paper typically uses 100 impulses per kernel, or 25 to 50 at lower + densities. Table 2 (GTX 280) reports, at 20 impulses per cell, 290 fps for 2D noise, + 111 fps for unfiltered surface noise and 50 fps for filtered surface noise. Error: + the filtering is exact for a Gaussian filter. The noise statistics converge with + impulse density. +- **[fetched]** Lagae, Drettakis, *Filtering Solid Gabor Noise*, ACM TOG 30(4), 2011. It + slices solid Gabor noise, filters each slice of each Gabor kernel, and gets a + generalisation of the projection-slice theorem. It also states that wavelet noise + integrates solid noise perpendicular to the surface. That is a line integral of noise + along the normal, done in the basis. +- **[search]** Cook, DeRose, *Wavelet Noise*, ACM TOG 24(3), 2005. A quadratic B-spline + noise band, which is almost band-limited, built from a precomputed coefficient tile. + Its 3D-to-surface projection integrates the noise along the normal. The original PDF + was not retrievable in this pass. Pixar and ACM both returned HTML. +- **[fetched, survey]** Lagae et al., *A Survey of Procedural Noise Functions*, CGF 2010. + - Lewis's sparse convolution noise has a power spectrum equal to the kernel's, + scaled. + - Frequency clamping (Norton, Rockwood, Skolmoski 1982) cancels bands above the filter + rate. It works only for narrowly band-pass noise, and Perlin noise is only weakly + band-pass. + - Nonlinear functions of noise, such as thresholds and colour maps, are not filtered + by filtering the noise. That is unsolved in general. + - Heidrich, Slusallek, Seidel 1998 (below) computes an area average of a procedural + shader with an error bound, using affine arithmetic. + - Perlin noise's amplitude distribution is visibly non-Gaussian, because it is zero at + every lattice point and has few gradients. The other noises surveyed are + approximately Gaussian. +- **[fetched, via the survey above]** "Filtering procedural textures" lineage: + - Rhoades et al. 1992 filters the colour table over `[N - e, N + e]`. + - Hart et al. 1999 sets `e` from the local noise gradient. + - Lagae 2009 sets the range from the analytically known loss of variance. + +## 3. Affine arithmetic, reduced AA, Taylor models, and bounds on warps + +### 3.1 Gamito and Maddock + +- **[fetched]** Gamito, Maddock, *Ray Casting Implicit Fractal Surfaces with Reduced + Affine Arithmetic*, The Visual Computer 23:155-165, 2007. The full method is read in + Gamito's PhD thesis (Sheffield), sections 5.3 to 5.4. + - **Computes:** a root of `g(t) = 0` along a ray, by subdividing intervals of t. Each + interval is tested with an inclusion `G(T)` computed in reduced AA (Messine's AF1). + The form is `t0 + t1 e1 + t2 e2`: e1 is the shared ray-parameter symbol, and e2 + absorbs every new nonlinearity by condensation after each operation. + - **Noise in RAA:** gradient-noise kernels lose no correlation under RAA, because the + three multiplications are local to one kernel and the cubic Hermite fade is done by + a single Chebyshev affine approximation. The same holds for sparse convolution + noise. Cellular noise loses accuracy, because `min` needs cancellation between + condensed terms, and the F2 and F3 kernels were not implementable. + - **Interval optimisation:** the parallelogram `g1/t1` slope plus or minus `g2` + shrinks `[ta, tb]` before subdividing (eq. 5.27). + - **Cost:** Table 5.2, gradient-noise hypertexture, average evaluations per ray and + time: + + | Method | Evaluations per ray | Time | + |---|---|---| + | IA | 116.57 | 7m35s | + | Standard AA | 61.69 | 40m41s | + | RAA | 61.69 | 6m43s | + | RAA + interval optimisation | 46.39 | 5m04s | + + RAA costs three numbers per quantity against two for IA. Standard AA is tight + but slow because its error-symbol lists grow. + - **Error bound:** conservative inclusion, as proven for AA by Comba and Stolfi 1993. + Rounding error is ignored. +- **[fetched]** Gamito thesis, chapter 9, *Surface Deformation with Flow Mapping*. + - Domain deformation `f(d(x))` with `d` defined by streamlines, that is by an ODE. + This is the case closest to a domain warp in this survey. + - Gamito states that a robust and tight AA estimate of the deformed ray `s(t)` was not + obtainable through the numerical ODE solution, so robustness was given up. + - The replacement test uses Lipschitz unbounding spheres at `s(ta)` and `s(tb)`. A + span is skipped if `|s(tb) - s(ta)| < min(ra, rb)` (eq. 9.23). A sharp turn of the + deformed ray between the endpoints can make this test wrong. + - He names truncated Taylor-series range estimation (Nedialkov et al. 2004) as the + possible fix, at higher cost and complexity. + +### 3.2 Other affine and interval arithmetic sources + +- **[fetched, bibliographic]** Comba, Stolfi, *Affine Arithmetic and its Applications to + Computer Graphics*, SIBGRAPI 1993. de Figueiredo, Stolfi, *Affine Arithmetic: Concepts + and Applications*, Numerical Algorithms 37, 2004. Gamito cites both. AA keeps + first-order correlations through shared noise symbols. Each nonaffine operation adds + one symbol, whose coefficient bounds the linearisation error. Chebyshev or min-range + affine approximations give that coefficient for unary functions. +- **[search]** Knoll, Hijazi, Kensler, Schott, Hansen, Hagen, *Fast Ray Tracing of + Arbitrary Implicit Surfaces with Interval and Affine Arithmetic*, CGF 28(1), 2009. + Inclusion-preserving reduced AA, SIMD CPU at interactive rates, and a stackless GPU + version. +- **[fetched, abstract]** Fryazinov, Pasko, Comninos, *Fast Reliable Ray-tracing of + Procedurally Defined Implicit Surfaces Using Revised Affine Arithmetic*, Bournemouth + TR-NCCA-2009-04. Revised AA, which also keeps one accumulated error symbol, is + reported fastest among the IA and AA variants compared, including on pseudo-random + procedural objects. +- **[fetched]** Sharp, Jacobson, *Spelunking the Deep: Guaranteed Queries on General + Neural Implicit Surfaces via Range Analysis*, ACM TOG 41(4), 2022. This is AA through + long compositions of nonlinear layers, which is structurally like noise composed with + a warp. Table 1 compares the variants. Time is relative to one scalar evaluation, + length is the 1D region that can be certified, and raycast time is relative to the + best method: + + | Variant | Time | Length | Raycast time | + |---|---|---|---| + | Interval | 2.4x | 0.011 | 34.3x | + | Affine-full | 95.3x | 0.821 | 8.4x | + | Affine-fixed (no new symbols kept, extra error condensed into one) | 4.7x | 0.306 | 1.0x | + + The paper uses affine-fixed for ray casting and affine-full for 3D queries. +- **[fetched, survey quote of abstract]** Heidrich, Slusallek, Seidel, *Sampling of + Procedural Shaders using Affine Arithmetic*, ACM TOG 17(3):158-176, 1998. It computes + the average of a procedural shader over a finite area, with an AA error bound. +- **[fetched, project page]** Keeter, *Massively Parallel Rendering of Complex + Closed-Form Implicit Surfaces*, ACM TOG 39(4), 2020. Interval arithmetic over a + shallow, high-branching tile hierarchy does two things: it skips empty tiles, and it + prunes the expression tape per tile. One benchmark drops the expression size by about + two orders of magnitude. It requires only C0 continuity, so warps and blends that break + Lipschitz continuity are allowed. + +### 3.3 Lipschitz bounds through warps + +- **[fetched]** Galin, Guérin, Paris, Peytavie, *Segment Tracing Using Local Lipschitz + Bounds*, CGF 39(2), 2020. It computes a local Lipschitz bound over a ray segment + instead of a global one. Section 4.4 covers warps `f o w^-1`, and bounds the gradient + by the product of the field gradient bound over the transformed segment and the + Jacobian norm bound over the segment. Cost: fewer field queries than sphere tracing, + with no acceleration structure. Error: conservative, if the local bounds are + conservative. +- **[fetched]** Seyb, Jacobson, Nowrouzezahrai, Jarosz, *Non-linear Sphere Tracing for + Rendering Deformed Signed Distance Fields*, ACM TOG 38(6), 2019. + - **Computes:** the ray in deformed space as a curve in undeformed space, by + integrating an ODE whose derivative is the inverse-deformation Jacobian times the ray + direction. An initial value comes from rasterising a deformed hull mesh. + - **Error control:** step requirements for the curve are separated from those for the + SDF. Adaptive Runge-Kutta (RKF45 and DP54 evaluated) is used far from the surface, + and forward Euler near it, against an error tolerance. + - **Scope:** surfaces only. There is no density integration. +- **[fetched]** Moinet, Neyret, *Fast Sphere Tracing of Procedural Volumetric Noise for + Very Large and Detailed Scenes*, CGF 2025 (Eurographics), HAL hal-05046040. + - **Computes:** sphere tracing of FBM density fields, using first- and second-order + (2-Lipschitz) forward inclusion functions. The FBM partial sums act as a nested + bounding volume hierarchy: the remaining octaves are bounded by their amplitude sum + `s(i+1, n)`, so evaluation stops early once a point is provably outside. + - **Cost:** up to 12x faster than classical sphere tracing on opaque or constant-density + scenes. Only up to 1.8x on non-constant density, and that gain comes from empty-space + skipping alone. One example frame: 16 ms against 110 ms naive at 1024 x 1024 on a + 4080 Ti. + - **Stated limits:** FBM used as a domain warp is not supported, nor are nonlinear + transforms of FBM. The paper names analytic estimation of the contribution of + sub-pixel detail as an open problem. + +### 3.4 Taylor models + +- **[search]** Berz, Makino, *Verified Integration of ODEs and Flows Using Differential + Algebraic Methods on High-Order Taylor Models*, Reliable Computing 4, 1998. Makino, + Berz, *Taylor Models and Other Validated Functional Inclusion Methods*, IJPAM 2003. + - **Computes:** a Taylor model is a polynomial of order n plus an interval remainder + bound, which encloses any function given as code over a box. The sharpness of the + remainder scales with the box width to the power n + 1. The method also gives + verified ODE flows. + - **Verified integration:** Berz and Makino also published *New Methods for + High-Dimensional Verified Quadrature* (Reliable Computing 1999). There the integral + of the polynomial part is exact, and the remainder bound times the domain measure + bounds the error. + - First-order AA is the n = 1 case in spirit: an affine part plus a bounded remainder. + +### 3.5 Affine bound on a warp over a span + +- **[derivation]** Over a segment of half-length r, the best affine approximation + (Chebyshev) of a C2 coordinate function has sup error at most `r^2 / 4` times the + maximum of its second derivative along the segment. Linear interpolation of the + endpoints has `r^2 / 2` times that maximum. The noise error caused by a displacement + error of size `delta` is at most `L_noise * delta`. This is the same chain-rule + structure Galin uses in section 4.4. + +## 4. Statistical or expected-value treatment of high-frequency detail + +- **[fetched]** Heitz, Nowrouzezahrai, Poulin, Neyret, *Filtering Color Mapped Textures + and Surfaces*, I3D 2013. It computes the filtered value of a colour map applied to a + procedural function as ``. The noise's footprint distribution is + replaced by a Gaussian with the footprint's mean and variance. This equals the colour + map convolved with `N(0, sigma^2)` and evaluated at the mean, which is precomputed into + a 2D table indexed by (mu, sigma). Cost: one lookup after mu and sigma are computed. + Error: exact when the driving function's footprint distribution is Gaussian. For a + specific noise instance it converges as the footprint grows, and the paper states this + limit. +- **[derivation]** For `X ~ N(mu, sigma^2)`, `E[max(0, X - c)] = (mu - c) Phi(z) + + sigma phi(z)` with `z = (mu - c) / sigma`. This is the rectified-Gaussian mean, and the + scalar instance of the Heitz 2013 construction for the map `max(0, . - c)`. The + survey's fetched finding that Perlin noise is non-Gaussian bears on how accurate it is. +- **[search]** Olano, Baker, *LEAN Mapping*, I3D 2010. Dupuy et al., *LEADR Mapping*, ACM + TOG 32(6), 2013. They store the first and second moments of slopes in mipmaps. Linear + filtering of the moments gives a Gaussian or Beckmann slope distribution per + footprint. Cost: two extra texture channels and linear filtering. Error: the Gaussian + assumption. +- **[fetched]** Gabor Fields (1.2): band and orientation masking of high-frequency + kernels, with the Jensen bias of transmittance `~ 0.5 Var(tau) exp(-E[tau])`. +- **[search]** Vicini, Jakob, Kaplanyan, *A Non-exponential Transmittance Model for + Volumetric Scene Representations*, ACM TOG 40(4), 2021. Bitterli et al., *A Radiative + Transfer Framework for Non-exponential Media*, ACM TOG 37(6), 2018. Jarabo, Aliaga, + Gutierrez 2018, arXiv 1805.02651. Unresolved, correlated sub-voxel density makes + transmittance non-exponential. Positive correlation gives slower decay than exponential. +- **[search]** Kettunen, d'Eon, Pantaleoni, Novák, *An Unbiased Ray-Marching + Transmittance Estimator*, ACM TOG 40(4), 2021. A power-series estimator built around a + control variate. The control variate is a ray-marched mean-density estimate, and rare + higher-order terms remove the bias. It is relevant as the known way to make a + deterministic or expected-value optical depth unbiased. +- **[fetched]** Schneider, *The Real-time Volumetric Cloudscapes of Horizon: Zero Dawn*, + SIGGRAPH 2015 Advances course. The high-detail noise is applied only as erosion where + the low-detail sample is non-zero. Rays take cheap large steps until the low-detail + isosurface is hit, step back once, and then take full samples. After several zero + samples they return to cheap stepping. This is an octave-level skip heuristic with no + bound. Moinet (3.3) is the bounded version for FBM. + +## 5. Temporal reuse of per-pixel or per-tile raymarch structure + +- **[fetched]** Schneider 2015 (above). The full raymarch cost about 20 ms. Each frame + renders 1 of 16 pixels per 4 x 4 block into a quarter-resolution buffer, and + reprojects the previous frame. Where reprojection fails, for example at screen edges, + a low-resolution buffer is substituted. The paper reports 10x or more faster, with a + target of about 2 ms on PS4. +- **[search]** Klein, Strengert, Stegmaier, Ertl, *Exploiting Frame-to-Frame Coherence + for Accelerating High-Quality Volume Raycasting on Graphics Hardware*, IEEE + Visualization 2005. First-hit depths of the previous frame are reprojected by point + splatting to estimate per-pixel ray start points. About 2x on typical datasets. +- **[search]** Yagel, Shi, *Accelerating Volume Animation by Space-Leaping*, IEEE + Visualization 1993. A C-buffer of first non-transparent voxel coordinates, updated + across frames. Gudmundsson, Randén 1990 introduced inter-frame empty-space skipping. +- **[search]** Scherzer et al., *Temporal Coherence Methods in Real-Time Rendering*, + CGF 2012 STAR (Eurographics 2011). Reprojection caches, with depth-tolerance validity + tests for disocclusion. +- **[search]** Hillaire, *Physically Based Sky, Atmosphere and Cloud Rendering in + Frostbite*, SIGGRAPH 2016 course. Temporal reprojection for volumetric clouds. Details + were not read in this pass. +- **[fetched]** Gamito thesis, chapter 7: progressive refinement rendering of + Lipschitz-bounded and AA-bounded surfaces. It refines across passes within one image, + not across animated frames. +- **[not found]** No source was found that caches per-ray span partitions, affine + forms or certified intervals across frames and refines them. + +## 6. Warp linearisation combined with exact segment integration + +- **[not found]** No source was found that combines piecewise affine linearisation of a + domain warp, with an error bound, and exact closed-form integration of noise over the + resulting segments. +- Nearest pieces, each covering part of the combination: + + | Source | What it covers | What it leaves out | + |---|---|---| + | Gamito ch. 9 | Bounding a deformed ray | No integral. AA gave up on the ODE warp | + | Seyb 2019 | ODE curved ray with adaptive error control | Surfaces only | + | Galin 2020 | Jacobian-norm local bounds through warps | Surfaces, not integration | + | Keeter 2020 | Interval pruning that tolerates warps | Surfaces | + | Gabor Fields 2026 | Closed form for any affine-transformed Gabor kernel along a segment | No warp | + | Balint 2019 | Closed form for cosine noise | Composition and warps break it | + | Pre-integration (Engel 2001) | Exact per-segment integral | Under a piecewise-linear model of the scalar | + | Moinet 2025 | Bounded FBM octave skipping | Excludes FBM used as a domain warp | + +- **[search]** Rezk-Salama et al., *Fast Volumetric Deformation on General Purpose + Hardware*, Graphics Hardware 2001. Fetched text: piecewise-trilinear deformation + patches with adaptive subdivision, rendered by object-aligned slicing. The + approximate inverse is `x + O(delta^2)`. A search summary describes the deformed rays + as polylines, but the fetched text uses slicing, not per-ray exact integration. + +## Sources + +- Balint 2019: https://www.cl.cam.ac.uk/~rkm38/pdfs/balint2019cosine_noise.pdf +- Condor et al. 2026, Gabor Fields: https://arxiv.org/pdf/2602.05081 +- Gamito PhD thesis: https://staffwww.dcs.shef.ac.uk/people/S.Maddock/phd_theses/gamito/thesis_small.pdf +- Gamito, Maddock 2007: https://link.springer.com/article/10.1007/s00371-006-0090-7 +- Lagae et al. 2009, Gabor noise: https://www-sop.inria.fr/reves/Basilic/2009/LLDD09/LLDD09PNSGC_paper.pdf +- Lagae, Drettakis 2011: https://inria.hal.science/inria-00606907/file/paper_0049_preprint.pdf +- Lagae et al. 2010 survey: https://www-sop.inria.fr/reves/Basilic/2010/LLCDDELPZ10/LLCDDELPZ10STARPNF.pdf +- Heitz et al. 2013: https://inria.hal.science/hal-00765799 +- Sharp, Jacobson 2022: https://arxiv.org/pdf/2202.02444 +- Seyb et al. 2019: https://cs.dartmouth.edu/~wjarosz/publications/seyb19nonlinear.html +- Galin et al. 2020: https://hal.science/hal-02507361 +- Moinet, Neyret 2025: https://inria.hal.science/hal-05046040 +- Keeter 2020: https://www.mattkeeter.com/research/mpr/ +- Fryazinov et al. 2009: https://eprints.bournemouth.ac.uk/11708/1/TR-NCCA-2009-04.pdf +- Knoll et al. 2009: https://onlinelibrary.wiley.com/doi/10.1111/j.1467-8659.2008.01189.x +- Berz, Makino 1998: https://link.springer.com/article/10.1023/A:1024467732637 +- Engel et al. 2001: https://www3.cs.stonybrook.edu/~mueller/teaching/cse616/engel.pdf +- Gustavson 2005: https://cgvr.cs.uni-bremen.de/teaching/cg_literatur/simplexnoise.pdf +- Schneider 2015: https://advances.realtimerendering.com/s2015/ +- Kettunen et al. 2021: https://jannovak.info/publications/URM/URM.pdf +- Vicini et al. 2021: https://dvicini.github.io/non-exponential-representation/ +- Rezk-Salama et al. 2001: https://www3.cs.stonybrook.edu/~mueller/teaching/cse616/p17-rezk-salama.pdf +- Klein et al. 2005: https://www.researchgate.net/publication/4188150 diff --git a/docs/research/cross-process-file-locking-prior-art.md b/docs/research/cross-process-file-locking-prior-art.md new file mode 100644 index 00000000..298e1722 --- /dev/null +++ b/docs/research/cross-process-file-locking-prior-art.md @@ -0,0 +1,158 @@ +# Cross-process file locking and atomic replace: prior art + +Facts only. Gathered 2026-10-02 for fork `variants:question:ts-python-write-lock`. No conclusions, no recommendation. + +Provenance legend: **[src]** read from CultLib source this pass; **[primary]** vendor/spec/upstream doc or source fetched this pass (the fetch tool summarises pages through a small model, so quoted phrasing is paraphrase-grade unless shown in quotes); **[secondary]** search-result snippet or third-party issue, weak; **[UNVERIFIED]** not confirmed by any source read, or derived by inference only. Nothing here was tested by running code on Windows or Linux. + +Dates caveat: the doc-site fetches reported release dates for `fs2 0.4.3` ("September 9, 2026") and `fs4 1.1.0` ("September 23, 2026"). The fs2 date is implausible against my memory of that crate (long stable, last release years earlier); treat crate dates as **[UNVERIFIED]**. + +--- + +## 0. What CultLib does today (source, this checkout) + +| Runtime | Lock | Temp name | Replace | Pointer | +|---|---|---|---|---| +| C# | Sidecar `.lock`, `new FileStream(lockPath, OpenOrCreate, ReadWrite, FileShare.None, bufferSize 1)`. On `IOException`: if `wait` is false return null, else sleep 10 ms and retry for up to 30 s, after which the exception propagates. | `.{name}.{Guid:N}.tmp`, `FileMode.CreateNew`, `FileShare.None`, `WriteThrough`, `Flush(true)` | `File.Replace(temp, path, null)` if target exists, else `File.Move` | `F:\Projects\CultLib\src\GameCult.Caching\CultCache.cs` lines ~3475-3530 | +| Rust | Sidecar `.lock` (`.lock` appended to full file name), opened `create/read/write/truncate(false)` (std default share mode), then `fs2::FileExt::lock_exclusive` / `lock_shared` / `try_lock_exclusive` (WouldBlock => `None`). Unlock explicit, then drop. | `{name}.{uuid v4}.tmp`; staged file `sync_all` then closed | Unix: `fs::rename`. Windows: `MoveFileExW(MOVEFILE_REPLACE_EXISTING \| MOVEFILE_WRITE_THROUGH)` retried 25 times, 20 ms apart, on ERROR_ACCESS_DENIED(5)/SHARING_VIOLATION(32)/LOCK_VIOLATION(33). Comment cites a Muninn crash on 2026-09-11. | `F:\Projects\CultLib\packages\cultcache-rs\src\lib.rs` ~925-945, 1040-1084, 2870-3030; `Cargo.toml`: `fs2 = "0.4"`, edition 2024 | +| TypeScript | None. In-process promise queue only (`next`/`result` chain). | `${file}.tmp-${pid}-${Date.now()}-${random}` (unique per writer) | `fs/promises.rename`, retried 10 times with 10 ms doubling on EPERM/EBUSY/EACCES; temp removed on error. No fsync of temp. | `F:\Projects\CultLib\packages\cultcache-ts\src\single-file-messagepack-backing-store.ts` ~143-205 | +| Python | None. `threading.RLock` per store object (in-process only). | Fixed `path.with_suffix(suffix + ".tmp")`, i.e. `store.cc.tmp`, shared by all writers | `Path.replace` (`os.replace`); no fsync | `F:\Projects\CultLib\packages\cultcache-py\src\cultcache_py\stores.py` lines 70-82, 121-126 | + +Both C# and Rust name the lock `.lock`. The same-name sidecar is the only thing the two currently share. Both also hold the lock around read-modify-write of the snapshot **[src]**. A lock file is never deleted by either (no stale-file problem; the lock is the kernel object, not the file's existence) **[src, inferred from absence of delete]**. + +Note re the fork text: C# does use a lock (stated in the C# code comment: "excludes other handles in this process and in others alike"). + +--- + +## 1. Language and OS primitives + +### 1.1 .NET `FileStream` / `FileShare` + +- **Windows**: `FileShare` maps to the `dwShareMode` of `CreateFile`. `FileShare.None` = share mode 0: "Any request to open the file (by this process or another process) will fail until the file is closed." **[primary]** https://learn.microsoft.com/en-us/dotnet/api/system.io.fileshare . Win32 side: dwShareMode 0 "cannot be opened again, either by the application that opened it or by another application, until its handle has been closed"; failure is ERROR_SHARING_VIOLATION. **[primary]** https://learn.microsoft.com/en-us/windows/win32/fileio/creating-and-opening-files . Share modes are checked at **open** time and are not byte-range locks; they do not call `LockFileEx` **[inferred]**. +- **Unix**: .NET emulates `FileShare` with advisory `flock(2)`. Source (`SafeFileHandle.Unix.cs`, runtime main): `lockOperation = (share == FileShare.None) ? LOCK_EX : LOCK_SH`, called as `FLock(handle, lockOperation | LOCK_NB)`; on `EWOULDBLOCK` an `IOException` is thrown; handle close issues `LOCK_UN`. **[primary]** https://raw.githubusercontent.com/dotnet/runtime/main/src/libraries/System.Private.CoreLib/src/Microsoft/Win32/SafeHandles/SafeFileHandle.Unix.cs + - So non-`None` opens take a **shared** flock; `None` takes an **exclusive** flock; non-blocking in all cases. A plain read with `FileShare.ReadWrite | Delete` still takes `LOCK_SH`, which would conflict with a writer holding `LOCK_EX` on the same file (only relevant if the same file is opened both ways). **[inferred from source above]** + - Disable switch: env `DOTNET_SYSTEM_IO_DISABLEFILELOCKING`; locking is off by default on Browser/WASI and iOS/tvOS (not Mac Catalyst). **[primary]** + - Because it is advisory flock, it excludes only other openers that also take flock (other .NET processes, or any program calling flock on that file). It does not stop a process that merely `open()`s and writes. **[inferred]** + - Since which .NET version: **[UNVERIFIED]**. I believe the flock-based FileShare emulation has existed since .NET Core 1.x/2.x, and .NET 6 rewrote FileStream into strategies while keeping it, but no source read this pass dates it. + - Windows `FileShare.Delete` is meaningful; the Unix code does not differentiate it. **[primary]** +- `File.Replace(src, dst, backup)` -> Win32 `ReplaceFile`; throws if volumes differ. **[primary]** https://learn.microsoft.com/en-us/dotnet/api/system.io.file.replace . Unix mapping to `rename` **[UNVERIFIED]**. + +### 1.2 Rust + +- `std::fs::File::lock`, `lock_shared`, `try_lock`, `try_lock_shared`, `unlock`: stable since **Rust 1.89.0**. **[primary]** https://doc.rust-lang.org/std/fs/struct.File.html + - Unix/WASI: `flock` (`LOCK_EX`, `LOCK_SH`, `+LOCK_NB`, `LOCK_UN`). Windows: `LockFileEx` (flags `LOCKFILE_EXCLUSIVE_LOCK`, `LOCKFILE_FAIL_IMMEDIATELY`) and `UnlockFile`. + - Docs: lock "may be advisory or mandatory", platform-dependent; on Windows the file must be opened for write (or read+append) for an exclusive lock; re-locking the same handle or a clone is unspecified, possibly deadlock; locks released when the file and all duplicated handles close; "this may change in the future". +- `fs2` 0.4.x (what CultCache Rust uses): Unix `flock(2)`; Windows `LockFileEx` (source `src/windows.rs`: `lock_shared` passes 0, `lock_exclusive` passes `LOCKFILE_EXCLUSIVE_LOCK`, try variants add `LOCKFILE_FAIL_IMMEDIATELY`; `unlock` uses `UnlockFile`). Docs: "advisory"; do not lock one `File` concurrently; duplicated files need great care. **[primary]** https://docs.rs/fs2/latest/fs2/trait.FileExt.html , https://raw.githubusercontent.com/danburkert/fs2-rs/master/src/windows.rs . An earlier summary of the fs2 docs page said "LockFile" for Windows; the source file says `LockFileEx`. Maintenance status of fs2: **[UNVERIFIED]**. +- `fs4`: fork of fs2 adding async, rustix instead of libc; docs say `flock`/`fcntl` on Unix, `LockFileEx` on Windows. Whether std's `File::lock` is mentioned or deprecates it: not stated on the page read. **[primary]** https://docs.rs/fs4/latest/fs4/ . Which Unix call it picks by default (flock vs fcntl): **[UNVERIFIED]**. +- Windows default share mode of Rust `OpenOptions`: `FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE`; `share_mode(0)` makes exclusive. **[primary]** https://doc.rust-lang.org/std/os/windows/fs/trait.OpenOptionsExt.html +- `std::fs::rename`: Unix `rename(2)`; Windows 10 1607+ `MoveFileExW(MOVEFILE_REPLACE_EXISTING)` or `SetFileInformationByHandle(FileRenameInfoEx)` (POSIX semantics); earlier, MoveFileExW only. "may change in future". **[primary]** https://doc.rust-lang.org/std/fs/fn.rename.html . (CultCache Rust bypasses std rename on Windows and calls MoveFileExW itself, per 0.) + +### 1.3 Node + +- No built-in advisory file lock in `node:fs`; **[UNVERIFIED]** by a direct docs read this pass, but nothing in the packages read contradicts it. Options seen: + - `proper-lockfile`: "mkdir strategy" - creates `.lock` as a **directory**; works across local and network FS; stale detection by lock dir **mtime** (default `stale` 10 s, min 5 s; mtime refreshed every `update` = stale/2, min 1 s); `onCompromised` callback when refresh fails or is late; avoids `O_EXCL` because "O_EXCL is broken on NFS" (their README); contrasts with `lockfile` package which uses ctime for staleness, unsuitable for long-running holders. **[primary]** https://raw.githubusercontent.com/moxystudio/node-proper-lockfile/master/README.md + - `lockfile` (npm), `fs-ext` (native `flock`/`fcntl` bindings): not fetched. **[UNVERIFIED]** +- Libuv rename on Windows uses `MoveFileExW(MOVEFILE_REPLACE_EXISTING)`; reports say it fails with EPERM while any handle holds the destination open, and refuses a READONLY destination; some runtimes (Bun PR) fall back to POSIX-semantic replace. **[secondary]** search snippets: https://github.com/oven-sh/bun/pull/43997 , https://github.com/joyent/libuv/issues/283 . Not read from libuv source: **[UNVERIFIED]**. +- `npm/write-file-atomic`: temp name = `filename + "." + murmurhex(__filename, process.pid, ++invocations)` (plus worker thread id); same-process writes to one file queued and serialised; fsync on by default; no cross-process lock mentioned. **[primary]** https://raw.githubusercontent.com/npm/write-file-atomic/main/README.md + +### 1.4 Python + +- `fcntl.flock()` wraps `flock(2)`; docs: "On some systems, this function is emulated using fcntl()". `fcntl.lockf()` is "essentially a wrapper around the fcntl() locking calls". Unix only. "On at least some systems, LOCK_EX can only be used if the file descriptor refers to a file opened for writing." The page does not state whether flock and lockf interact. **[primary]** https://docs.python.org/3/library/fcntl.html +- `msvcrt.locking(fd, mode, nbytes)`: locks `nbytes` from the current file position (may extend past EOF); `LK_LOCK`/`LK_RLCK` retry once per second, 10 attempts, then `OSError`; `LK_NBLCK` fails immediately; regions cannot overlap; adjacent regions not merged. Underlying Win32 call not stated in docs. **[primary]** https://docs.python.org/3/library/msvcrt.html . (The CRT `_locking` is documented elsewhere as `LockFile`-based; **[UNVERIFIED]** here.) +- `filelock` (tox-dev): `FileLock` alias = `UnixFileLock` (`fcntl.flock`, described as kernel-enforced and released on crash) on Unix; `WindowsFileLock` described as `LockFileEx` byte-range locking on Windows (older versions used `msvcrt.locking`; version not checked, **[UNVERIFIED]**); `SoftFileLock` is a "cooperative file-existence marker", with same-host PID inspection and reclaim from dead processes; docs recommend verifying shared-filesystem semantics before deploying soft locks; no statement on cross-type exclusion. **[primary]** https://py-filelock.readthedocs.io/en/latest/index.html +- `portalocker`: README fetch 404; its primitives are **[UNVERIFIED]** (not read). +- `os.replace` on Windows semantics (MoveFileEx REPLACE_EXISTING): **[UNVERIFIED]**, not fetched. + +### 1.5 Interoperability matrix (flock / fcntl / LockFileEx / share modes) + +| Question | Finding | Source | +|---|---|---| +| Linux, local FS: does `flock` exclude `fcntl` (POSIX byte-range) locks? | No. man flock(2): on Linux "there is no interaction between the types of lock placed by flock() and fcntl(2)" (local filesystems). | **[primary]** https://man7.org/linux/man-pages/man2/flock.2.html | +| Linux over NFS (since 2.6.12) | flock is emulated as whole-file fcntl byte-range locks, so flock and fcntl **do** interact there. | same | +| Linux over CIFS (since 5.5) | flock emulated with SMB byte-range locks; flock and fcntl interact; and the lock becomes **mandatory**: I/O from other descriptors on a locked file fails with EACCES. | same | +| Duplicate fds / fork | A lock belongs to the open file description; shared by dup/fork; persists until `LOCK_UN` or **all** duplicates close. Independent `open()`s in the same process conflict with each other under flock. | same | +| Does a Rust `flock` (std or fs2) exclude a .NET-on-Unix `FileShare.None` open? | Both are `flock(LOCK_EX)` on the same inode; by the sources above they should conflict (.NET's non-blocking attempt gets EWOULDBLOCK -> IOException -> CultCache C# retries). **Not tested.** | **[inferred]**; **[UNVERIFIED]** empirically | +| Same, but .NET `FileShare.ReadWrite` opener (shared flock) vs Rust `lock_exclusive` | Conflicts (LOCK_SH vs LOCK_EX), so a reader opening the lock file with any FileShare would block/fail against a Rust holder. CultCache does not open the lock file for reading. | **[inferred]** | +| Windows: does a share-mode-0 open (.NET `FileShare.None`) exclude a Rust `LockFileEx` locker? | Order A: .NET holds the file with share mode 0. Rust's `OpenOptions::open` (share mode default RWD) then fails at `CreateFile` with ERROR_SHARING_VIOLATION, before it can lock. In `open_lock_file` that is a `with_context` error, **not a wait/retry** (looked at the source). Order B: Rust holds a handle (RWD) and `LockFileEx`; .NET `CreateFile` with share mode 0 conflicts with the existing open handle's access -> ERROR_SHARING_VIOLATION -> `IOException` -> C# retries up to 30 s. So mutual exclusion holds in both orders, but in order A Rust errors instead of waiting. | **[inferred]** from MS CreateFile share-mode table + Rust OpenOptionsExt default; **[UNVERIFIED]** empirically | +| Windows: is `LockFileEx` mandatory? | Exclusive region lock "denies all other processes both read and write access to the specified region"; shared lock denies writes; locks are not honoured through mapped views. If a process dies or closes the handle the OS releases the locks, but "the time it takes ... depends upon available system resources" (MS recommends explicit unlock). Handle needs GENERIC_READ or GENERIC_WRITE. | **[primary]** https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-lockfileex | +| Windows: second handle in same process | "If the locking process opens the file a second time, it cannot access the specified region through this second handle until it unlocks the region." | same | +| Rust-on-Windows `LockFileEx` vs Python `msvcrt.locking` (same region?) | `LockFileEx` regions conflict if they overlap; fs2 locks which byte range (offset 0, len u32::MAX..?) : **[UNVERIFIED]**; msvcrt.locking locks `nbytes` from the current position (so depends on `lseek`); whether CRT `_locking` uses LockFile/LockFileEx and which range would need to match: **[UNVERIFIED]**. | +| Python Unix `flock` vs Rust/.NET flock | Same kernel primitive on Linux/macOS (Python's flock "may be emulated using fcntl on some systems", so platform-dependent). Python `lockf` is fcntl: independent from flock on local Linux FS. | **[primary]** python docs + man page | +| macOS flock vs fcntl | **[UNVERIFIED]** (not fetched). | +| POSIX fcntl lock semantics | Per-process: `close()` of **any** fd for the file by the process drops all of that process's fcntl locks (SQLite doc 2.2 below). flock locks are per open-file-description and do not have that hazard. | **[primary]** SQLite howtocorrupt; flock(2) | +| Python `fcntl.flock` on Windows | Module is Unix only (docs). | **[primary]** | + +--- + +## 2. Lockfile protocols in established software + +### git +- Lockfile API: lock for `foo` is `foo.lock`, created with `O_CREAT|O_EXCL`; writer writes new content into it; `commit_lock_file()` renames it over `foo`; `rollback_lock_file()` removes it; writers exclude each other; readers never block and see either old or new content (relies on atomic rename); cleanup of outstanding lockfiles is registered with `atexit` and signal handlers. **[primary]** https://git-scm.com/docs/api-lockfile +- `lockfile.c`: retry with quadratic backoff for at least `timeout_ms`; PID file registered as a tempfile for signal/atexit cleanup; failure message says another git process may be running "or the lock file may be stale" and tells the user to remove it manually. **[primary]** https://raw.githubusercontent.com/git/git/master/lockfile.c +- Consequences recorded in the docs: a hard kill (SIGKILL, power loss) leaves a `.lock` file and later writers fail until it is removed; git does not time-based-reclaim index.lock **[inferred from message text, not stated; UNVERIFIED]**. Note the git design makes the lock file **the temp file** (lock name = staging name); CultCache's current design has a separate sidecar lock plus uniquely named temp. + +### SQLite (see also section 4) +- Unix default VFS: POSIX advisory locks via `fcntl()`; Windows VFS: `LockFile`/`LockFileEx`/`UnlockFile`. Five states UNLOCKED/SHARED/RESERVED/PENDING/EXCLUSIVE. **[primary]** https://www.sqlite.org/lockingv3.html (byte-range layout not stated on that page). +- Built-in unix VFS variants: `unix` (POSIX advisory), `unix-dotfile` (dot-file locking), `unix-excl` (holds exclusive lock, WAL index in heap), `unix-none` (no locking), `unix-namedsem` (VxWorks). "Except for 'unix' and 'unix-excl', the various Unix VFSes all use incompatible locking implementations"; processes using different VFSes on one DB "may not see each others locks ... resulting in database corruption". **[primary]** https://www.sqlite.org/vfs.html . (`unix-flock` / `unix-afp` / `unix-nfs` appear in SQLite's source as separate io-method variants; not listed on that page: **[UNVERIFIED]**.) + +### LMDB +- Uses a separate `lock.mdb` file for the reader table and writer mutex. Header warnings: stale reader slots from aborted programs make the DB grow quickly (`mdb_reader_check`); stale writer lock clears automatically on Windows, BSD with SysV semaphores, and Linux with robust POSIX mutexes, otherwise all DB users must be closed; "Do not have open an LMDB database twice in the same process at the same time. Not even from a plain open() call - close()ing it breaks flock() advisory locking."; "Do not use LMDB databases on remote filesystems, even between processes on the same host. This breaks flock() on some OSes"; `MDB_NOLOCK` disables locking entirely. **[primary]** https://raw.githubusercontent.com/LMDB/lmdb/mdb.master/libraries/liblmdb/lmdb.h +- Note: that warning is about `flock` and `close()`, which contradicts the usual statement that only fcntl locks have the close() hazard; the source of the discrepancy (older Linux/BSD semantics, or the emulated flock on some OS) is **[UNVERIFIED]**. + +### Cargo / npm / pip / Gradle +- Cargo: package-cache and build-dir lock using an OS file lock, prints "Blocking waiting for file lock"; source fetch (`src/cargo/util/flock.rs`) 404; details (flock/fs4/std, handling of filesystems without locking) **[UNVERIFIED]**. +- Gradle: `DefaultFileLockManager` holds cross-process locks on cache/daemon-registry files; reports of builds hanging on locks left by crashed or killed daemons. **[secondary]** web search snippets only (https://discuss.gradle.org/t/gradle-daemon-keeps-locking-intermediate-files-preventing-builds/38004 , https://www.javathinking.com/blog/gradle-build-is-hanging-without-failure-defaultfilelockmanager-acquiring-and-releasing-lock-on-daemon-addresses-registry/ ); Gradle's own docs on lock protocol not read. **[UNVERIFIED]** +- npm: `write-file-atomic` has no cross-process lock (above); npm's cache (cacache) locking: **[UNVERIFIED]**, not fetched. +- pip: **[UNVERIFIED]**, not fetched. + +### Windows rename retry (Postgres) +- `pgrename()` on Windows calls `MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)` and retries on ERROR_ACCESS_DENIED, ERROR_SHARING_VIOLATION, ERROR_LOCK_VIOLATION: up to 100 retries, 0.1 s apart (~10 s). Comment: other applications may have the file open without sharing flags; LOCK_VIOLATION seen from some anti-virus software; bounded because the caller may hold locks affecting other backends. **[primary]** https://raw.githubusercontent.com/postgres/postgres/master/src/port/dirmod.c . CultCache Rust uses the same error set with 25 x 20 ms (0.5 s); TS retries EPERM/EBUSY/EACCES 10 times with doubling from 10 ms (about 10 s worst case) **[src]**. + +--- + +## 3. Temp-file naming and rename atomicity + +- Unique temp names per writer: C# GUID, Rust uuid v4, TS pid+time+random **[src]**; npm write-file-atomic pid + counter hash **[primary]**; Python CultCache fixed `.tmp` **[src]**. Rust additionally has a startup cleanup that deletes only temps matching `..tmp` (tests at `lib.rs` ~3420, 4667-4689 distinguish `not-a-uuid.tmp`, bare `.tmp`, neighbour stores) **[src]**. Note the naming differs between runtimes: C# `.{name}.{guid:N}.tmp` (leading dot, no dashes) vs Rust `{name}.{uuid-with-dashes}.tmp` vs TS `{name}.tmp-...`; whether the Rust stale-temp sweeper recognises C#/TS temps: it matches the Rust format only (per the test names) **[src, partial reading]**. +- Fixed temp name consequence (inferred, not tested): two processes writing `store.cc.tmp` concurrently share one file: interleaved `write_bytes` (truncate-and-write) can yield a mixed or truncated file that one process then renames into place, and the other process's `replace` can fail with source-not-found. **[inferred]** +- POSIX `rename()`: if `new` exists it "shall be removed and old renamed to new"; the rationale requires the action to be atomic; a directory entry named `new` stays visible to other threads throughout and refers to either old or new file; on failure other than I/O errors `new` is unaffected; spec does not define crash durability. **[primary]** https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html +- Directory fsync: the usual pattern is write temp, fsync temp, rename, then fsync the parent directory so the rename survives power loss; many projects have filed bugs for omitting the directory fsync. **[secondary]** search snippets (e.g. https://github.com/npm/write-file-atomic/issues/64 titled "Rename atomicity is not enough"; https://0xkiire.com/crash-consistency-fsync-rename/). Linux ext4 `auto_da_alloc` replace-via-rename heuristic: **[UNVERIFIED]**, not fetched. Whether CultCache Rust/C# fsync the parent directory on Unix: **[UNVERIFIED]** (not seen in the excerpts read; Rust does `sync_all` on the temp, C# `Flush(true)` + `WriteThrough`; TS and Python do neither). +- Windows `MoveFileExW`: + - `MOVEFILE_REPLACE_EXISTING` replaces the destination if ACLs allow; errors if destination is an existing directory; `MOVEFILE_WRITE_THROUGH` waits for the move to be flushed (documented as guaranteeing flush of a copy+delete move). Same-volume rename is a metadata operation. The doc page does not use the word "atomic" and does not describe behavior when the destination is open by another handle. **[primary]** https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-movefileexw + - Open-handle failure: reported from libuv/Bun and Postgres as ERROR_ACCESS_DENIED / SHARING_VIOLATION / LOCK_VIOLATION when another process has the destination open without FILE_SHARE_DELETE, or an anti-virus scan holds it. **[primary]** Postgres comment; **[secondary]** libuv/Bun. + - Rust's std rename (1.0+ Windows 10 1607) may use `FileRenameInfoEx` with POSIX semantics, which can replace an open destination; CultCache Rust calls `MoveFileExW` directly instead **[src; primary for std]**. +- Windows `ReplaceFileW` (used by .NET `File.Replace`): replaced file opened with GENERIC_READ|DELETE|SYNCHRONIZE and share mode `READ|WRITE|DELETE`; replacement file opened with **no sharing mode specified**; preserves creation time, short name, object id, DACLs, encryption, compression, named streams; resulting file has the replacement's file ID; all files must be on the same volume; documented failure states leave the system in partially-moved states: ERROR_UNABLE_TO_REMOVE_REPLACED (1175; names unchanged), ERROR_UNABLE_TO_MOVE_REPLACEMENT (1176; with no backup, the replaced file "no longer exists" and the replacement exists under its original name), ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 (1177). `REPLACEFILE_WRITE_THROUGH` "not supported". The page makes no statement that ReplaceFile is atomic; it describes it as combining steps. **[primary]** https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-replacefilew + - So on Windows, C# (`File.Replace`) and Rust/TS/Python (MoveFileEx or equivalent) use different primitives with different failure windows. **[inferred from the two pages]** +- .NET `File.Move` with overwrite on Windows/Unix: **[UNVERIFIED]** (CultCache C# uses `File.Move(temp, path)` only when the target does not exist; there is a window in which another writer creates the target between the `File.Exists` check and the move; the lock covers it when taken **[src, inferred]**). + +--- + +## 4. Known failures and warnings + +SQLite "How To Corrupt An SQLite Database File" (https://www.sqlite.org/howtocorrupt.html) **[primary]**: +- 2.1 Filesystems with broken or missing lock implementations (network filesystems, NFS) can corrupt when multiple processes access. +- 2.2 POSIX advisory locks are cancelled by `close()`: `close()` on any descriptor for the file by any thread in the process releases the process's locks on that file; example: thread B opens, reads and closes the DB file for a backup and thread A's locks vanish silently. SQLite works around it with a mutex-protected global list of open files, which fails if two copies of SQLite are linked into one app (2.3; a commercial product shipped this bug with infrequent corruption on Linux/Mac). WAL multi-process defenses added in 3.51.0 (2025-11-04). +- 2.4 Two processes using different locking protocols (e.g. POSIX advisory vs dot-file) cannot see each other's locks; all connections must use the same protocol. +- 2.5 Unlinking or renaming the DB file while in use: processes end up with different physical files sharing one journal; SQLite warns (since 3.7.17) when the file is unlinked while open. +- 2.6 Multiple links (hard/symbolic links): same hazard; resolved by canonicalising symlinks since 3.10.0. +- 2.7 Carrying a connection across `fork()`: all locking mechanisms fail with unpredictable results. +- 1.3/1.4 Hot journal deleted, moved or mispaired with database. +- The SQLite VFS page: incompatible unix VFS locking => corruption (section 2 above). + +Other recorded failure modes: +- Windows `LockFileEx` locks are released by the OS on process death but with a lag (MS doc). **[primary]** +- CIFS flock becomes mandatory (man flock(2)). **[primary]** +- Lock file left behind: git (cleanup via atexit/signal; a hard kill leaves `.lock`, message tells operator to remove) **[primary]**; Gradle hangs after killed daemons **[secondary]**; `proper-lockfile` and `filelock.SoftFileLock` provide mtime / PID-based stale reclaim as a mitigation **[primary]**. +- Lock protocols that are compatible only when everyone uses the same one: SQLite (above); `filelock` docs do not state cross-type exclusion between `UnixFileLock`/`SoftFileLock`. **[primary]** +- Lost-update by missing cross-process lock around read-modify-write: `write-file-atomic` documents only same-process serialisation; no source read this pass reports a concrete lost-update bug in it. A search-based report of corrupted/missing "settings.json" on Windows from a failed atomic write exists as an unvetted issue (https://github.com/BarganConstantin/ccdeck/issues/772, **[secondary]**, read-only destination). Reports specific to cross-language writers of one file, other than SQLite's different-VFS warning: not found this pass. **[UNVERIFIED]** +- Lock file deleted by one participant while others hold or wait on it (different inode afterward): general hazard of delete-on-unlock lock files, not sourced this pass beyond SQLite 2.5 (unlink of a live file); **[UNVERIFIED]** as a named issue for flock sidecars. + +--- + +## 5. Open items not resolved by reading (candidates for an empirical check; nothing done) + +1. Do the C# `FileShare.None` lock and Rust `fs2::lock_exclusive` actually exclude each other on Windows (both open orders) and on Linux? Only inferred above. +2. Does fs2 on Windows lock the same byte range as std 1.89 `File::lock` and as Python `msvcrt.locking`/`filelock`? Unread. +3. macOS behavior of flock vs fcntl and of .NET FileShare there. Unread. +4. .NET release that introduced Unix FileShare-via-flock. Unread. +5. Whether any runtime fsyncs the parent directory after rename on Unix. Unread. +6. Cargo, npm, pip, Gradle lock protocol primary sources. Unread. +7. `portalocker`, `fs-ext`, `lockfile`, `proper-lockfile` behavior under Windows share modes. Unread. diff --git a/docs/research/culling-efficiency-oracle-prior-art.md b/docs/research/culling-efficiency-oracle-prior-art.md new file mode 100644 index 00000000..cf0d8077 --- /dev/null +++ b/docs/research/culling-efficiency-oracle-prior-art.md @@ -0,0 +1,305 @@ +# Culling Efficiency Against an Oracle: Prior Art Survey + +This is the facts file for Eureka question `cultmath-tapes:question:wells-ceiling-oracle`, +which interprets ruling `cultmath-tapes:ruling:operator-wells-contract-vs-ceiling`. That +ruling holds scenario (c) to "at least 90% of the probe-free ceiling (the cost of the +dense cells alone)". The question asks what "ceiling" means: + +- (a) the pre-pass's own mask, under which a pre-pass that skips nothing scores 0.98; +- (b) an oracle mask, the cells where at least one ray samples nonzero density. + +Under (b), Imagination measured 0.38 at warp 0 and 0.19 at warp D. + +This survey covers how published work measures culling or skipping efficiency against +ground truth, and what efficiency figures conservative bounds reach. Eyes pass, +2026-10-03. It gives facts and evidence pointers only, with no recommendation. + +Verification marks: + +- **[fetched]** The claim was read in the cited source's full text during this pass. + PDFs were converted with `pdftotext -layout`. +- **[search]** The claim came from a search-result summary, not a full read. +- **[not found]** The source was read, and the named kind of measurement is absent from it. + +Reference kinds used below: + +- **oracle**: an exact or ground-truth answer computed independently of the method, + such as the exact visible set or the set of truly non-empty cells. +- **self**: the method's own result, or a baseline that does no culling. +- **peer**: another approximate method. + +## 1. Visibility culling: conservative versus exact visible set + +### 1.1 Survey vocabulary + +- **[fetched]** Cohen-Or, Chrysanthou, Silva, Durand, *A Survey of Visibility for + Walkthrough Applications* (IEEE TVCG 2003). Section 2 lists "Tightness of + approximation" as a review criterion. It notes that few papers report the ratio + between the size of the potentially visible set and the size of the visible set, + and asks later work to report it. Most surveyed techniques are conservative, which + means they overestimate the visible set. + https://www.cs.tau.ac.il/~dcor/online_papers/papers/visibility-survey-ieee.pdf +- **[fetched]** Bittner, *Hierarchical Techniques for Visibility Computations* (PhD + thesis, CTU Prague, 2002), chapter 2, equations 2.1 to 2.4. It defines a quality + measure against the exact PVS `S_E`: + - relative overestimation `Q_o = |S_A \ S_E| / |S_E|`; + - relative underestimation `Q_u = |S_E \ S_A| / |S_E|`; + - the expected quality, which is the expectation of these over inputs. + + The same text appears in Bittner and Wonka, *Visibility in Computer Graphics* + (section 4.3). + https://dcgi.fel.cvut.cz/home/bittner/publications/diss_noimages.pdf + http://www.casa.ucl.ac.uk/mike-michigan-april1/mike's%20stuff/attach/bittner_wonka.pdf +- **[fetched]** Nirenstein, Blake, Gain, *Exact From-Region Visibility Culling* (EGWR + 2002), introduction and Table 1. The paper classifies algorithms as exact, + conservative, aggressive or approximate. Conservative methods "incur a false + visibility error". The paper states: + - exact visibility "provides a benchmark for comparing other approaches"; + - the percentage of polygons culled is "a very crude and imperfect metric", because + it ignores the type, distribution and magnitude of visibility error. + + Reported results (Table 2) are culling fractions of the whole scene: 99.45% for the + town and 99.12% for the forest. No conservative method is measured against the + exact set in this paper **[not found]**. A search summary attributed a 95.5% figure + for extended projection to this paper, but that figure is not in the full text. + https://people.cs.uct.ac.za/~jgain/wp-content/papercite-data/pdf/nirenstein2002.pdf + +### 1.2 Measured conservative-versus-exact ratios + +- **[fetched]** Bittner, Wonka, Wimmer, *Fast Exact From-Region Visibility in Urban + Scenes* (EGSR 2005), section 6. The exact 2.5D algorithm is used as the oracle, and + the paper simulates conservative methods against it: + - **Section 6.2, one penumbra wedge per occluder.** The conservative PVS was more + than 47% larger than the exact PVS for 2 m view cells and more than 76% larger + for 4 m view cells. As exact/conservative ratios these are ≤ 0.68 and ≤ 0.57. + - **Section 6.3, object-space discretization** (Wonka et al.'s method, a 1400×1400 + grid, Vienna). The PVS overestimate averaged 17%, a ratio of about 0.85. + - **Section 6.3, Table 4, line-space discretization** (Leyvand et al.). PVS sizes by + grid resolution, with the exact PVS last: + + | Scene | 512 | 1024 | 2048 | 16384 | exact | + |---------|--------|--------|--------|-------|-------| + | Vienna | 633 | 535 | 489 | 455 | 235 | + | Atlanta | 50,744 | 25,751 | 10,082 | 2,656 | 1,152 | + + The ratios exact/conservative below are computed from that table, not quoted from + the paper: + - Vienna: 0.37, 0.44, 0.48, 0.52; + - Atlanta: 0.023, 0.045, 0.11, 0.43. + + The paper says the overestimation comes from conservative shrinking and from gaps + "between formerly connected occluders". + + https://peterwonka.net/Publications/pdfs/2005.EGSR.Bittner.FastExactFromRegionVisibility.pdf + +### 1.3 Run-time occlusion culling against an ideal renderer + +- **[fetched]** Mattausch, Bittner, Wimmer, *CHC++: Coherent Hierarchical Culling + Revisited* (Eurographics 2008), section 7 (Figure 7) and the conclusion. The + reference algorithm "OPT" renders only the visible nodes of the hierarchy and + issues no queries. It was implemented by recording visibility with an exact + stop-and-wait pass, so it is an oracle at node granularity that is independent of + the method under test. CHC++ is reported to be "for most cases within a few percent + of the 'ideal' method". + + Caveat: occlusion queries are exact per-node tests, not conservative range bounds. + The gap to OPT measures query overhead and latency, not bound looseness. + + The paper also separates out the "optimal" algorithm defined by Guthe et al. + (NOHC-OPT), and shows CHC++ "clearly below" that optimum. That earlier optimum was a + cost-model optimum, not an oracle. + https://dcgi.fel.cvut.cz/home/bittner/publications/chc++.pdf +- **[fetched]** Zhang et al., *Visibility Culling using Hierarchical Occlusion Maps* + (SIGGRAPH 1997). It reports "% culling" of the total model, and frame time + normalized to rendering without HOM. Both are **self** references. No comparison + with the exact visible set **[not found]**. + https://www.cs.princeton.edu/courses/archive/spr01/cs598b/papers/zhang97.pdf +- **[search]** Wonka et al., *Guided Visibility Sampling* (SIGGRAPH 2006). This is + an aggressive, sampling-based PVS method. Its Table 2 reports error as false pixels + on a 1000×1000 screen, together with PVS size. Section 4.5 compares it to Bittner's + exact algorithm on one scene, because exact solvers do not run on the larger test + scenes. The text was extracted in this pass, but not read in full. + https://peterwonka.net/Publications/pdfs/2006.SG.Wonka.GuidedVisibilitySampling.final.pdf + +## 2. Empty-space skipping in volume rendering + +- **[fetched]** Li, Mueller, Kaufman, *Empty Space Skipping and Occlusion Clipping for + Texture-based Volume Rendering* (IEEE Vis 2003): + - **Section 5, Table 1.** Empty-space skipping is measured as a frame-rate speedup + over no skipping, 2.8× on average. This is a **self** reference. + - **Section 5, Table 2.** It reports the percentage of non-empty voxels skipped + through occlusion, 48% to 64% with a 56.2% average. The denominator is all + non-empty voxels, not the truly occluded voxels. The authors write that "there + are still many occluded voxels that have not been skipped" and call the number + "smaller than we have expected". The truly occluded set is not computed + **[not found]**. + - **Section 5.** Overhead is reported separately. The opacity map and clipping cost + about 10% of the empty-space-skipping render time, measured with a mode that pays + the overhead but skips nothing ("ESS+M"). + + https://www3.cs.stonybrook.edu/~mueller/papers/OcclusionClipping.pdf +- **[fetched]** Zellmann, *Comparing Hierarchical Data Structures for Sparse Volume + Rendering with Empty Space Skipping* (arXiv 1912.09596, 2019). It reports frame + rates and build times, and compares only against naive ray marching and simple + macrocell grids, as the paper itself states. No step count or sample count against + an ideal traversal **[not found]**. + https://arxiv.org/abs/1912.09596 +- **[search]** Hadwiger et al., *SparseLeap* (IEEE TVCG 24(1), 2018). It builds + per-pixel lists of ray segments by rasterizing occupancy geometry. The full text + was not retrieved (the repository returned HTML), so it is unknown whether it + reports skip efficiency against the true empty space. + https://vccvisualization.org/research/sparseleap/ +- **[search]** Deakin and Knackstedt, *Efficient ray casting of volumetric images using + distance maps for empty space skipping* (Computational Visual Media 6(1), 2020). The + full text was not retrieved. + +## 3. Interval and affine arithmetic for implicits, noise and SDF marching + +- **[fetched]** Keeter, *Massively Parallel Rendering of Complex Closed-Form Implicit + Surfaces* (SIGGRAPH 2020): + - **Section 3, Interval arithmetic.** Ambiguous regions "either contain the shape's + boundary or are a false positive (due to interval arithmetic's conservative + behavior)". The false-positive share is not measured **[not found]**. + - **Section 2.1, Figure 5.** Reported efficiency is against **self** and peer + baselines: a brute-force per-pixel interpreter (about 58 ms/MP) and a compiled + kernel (about 3 ms/MP). + - **Section 3.2, Figure 6.** Tape length is reduced 17× in 64² tiles and 216× in 8² + subtiles, from 6056 clauses to means of 356 and 28. + - **Section 5, Figures 9 and 10.** Heatmaps of work per pixel show extra work at + model edges, where interval evaluation "can't skip entire regions". The text says + many smooth blends lead "to less useful interval evaluation results". + - **Section 6.** It names reduced affine arithmetic as a way "to more tightly bound + intervals". + + https://www.mattkeeter.com/research/mpr/keeter_mpr20.pdf +- **[fetched]** Keeter, *Gradients are the new intervals* (blog, 2025-05-14). It + compares interval evaluation with gradient-based pseudo-intervals by tape length + (120.2 against 121.5 clauses) and by render time. These are peer references. There + are no tile-classification counts and no ground truth **[not found]**. + https://www.mattkeeter.com/blog/2025-05-14-gradients/ +- **[fetched]** Heidrich, Slusallek, Seidel, *Sampling Procedural Shaders Using Affine + Arithmetic* (ACM TOG 17(3), 1998): + - **What "error" measures.** Error is the width of the computed range per pixel. It + is not compared with the true range from dense sampling **[not found]**. The + tightness against the true variation is argued qualitatively, from shader cross + sections. + - **Section 3.2.** Noise over an affine form that spans several lattice cells falls + back to interval arithmetic, and a span of more than two cells returns the full + noise range [0, 1]. For turbulence (blue marble), 81% of pixels lie within 5% + error and 59% within 1%. The eroded shader, with high-frequency noise, gets 77% + and 53%. + - **Section 4.** Against AA, interval arithmetic gave errors "up to 50 percent where + affine arithmetic produces errors below 1/256" (wood shader, Figures 6 and 7). + + https://vccimaging.org/Publications/Heidrich1998SPS/Heidrich1998SPS.pdf +- **[fetched]** Gamito and Maddock, *Ray casting implicit fractal surfaces with reduced + affine arithmetic* (The Visual Computer 23(3), 2007). Section 5, Tables 1 to 3, use + a sphere hypertextured with three octaves of noise. The accuracy proxy is the + average number of interval evaluations per ray, a **peer** comparison with no oracle + count. The rows below are reconstructed from a mangled text layout, and the + reconstruction agrees with the paper's prose. + + | Noise | IA evals/ray | IA time | Standard AA evals/ray | Reduced AA evals/ray | Reduced AA + interval optimisation, evals/ray | Its time | + |------------------------|--------------|-----------|-----------------------|----------------------|-----------------------------------------------|-----------| + | Perlin gradient | 78.40 | 8m27.5s | 34.60 | 34.60 | 20.81 | 3m43.2s | + | Lewis sparse convolution | 48.44 | 26m31.0s | 23.25 | 23.25 | 13.46 | 6m29.3s | + | Worley cellular | 45.70 | 25m54.7s | 32.56 | 43.78 | 21.29 | 14m25.9s | + + The text cites "the excessive conservativeness of IA estimates", and says IA + compensates by being fast. + https://eprints.whiterose.ac.uk/id/eprint/3762/1/gamito_newraycastvisual.pdf +- **[fetched]** Knoll, Hijazi, Kensler, Schott, Hansen, Hagen, *Fast Ray Tracing of + Arbitrary Implicit Surfaces with Interval and Affine Arithmetic* (CGF 28(1), 2009). + Section 6.1.1 and Tables 1 and 2 report frames per second for IA against reduced + AA: + - RAA is "generally 1.5 to 2× faster", and "3 to 4 times faster" for functions + "with high bound overestimation"; + - IA is faster for superquadrics. + + These are **peer** references, with no oracle count of wasted subdivisions + **[not found]**. + https://sci.utah.edu/~knolla/cgrtia.pdf +- **[fetched]** Sharp and Jacobson, *Spelunking the Deep: Guaranteed Queries on General + Neural Implicit Surfaces via Range Analysis* (SIGGRAPH 2022), section 3.4 and Table 1. + Tightness is measured as "the typical size of a region which can be bounded away + from the zero": + + | Method | 1D length | 3D volume | Ray-cast time (relative to the fastest) | + |---------------|-----------|-----------------|-----------------------------------------| + | interval | 0.011 | < 0.001 × 10⁻³ | 34.3× | + | affine (full) | 0.821 | 3.499 × 10⁻³ | 8.4× | + | affine (fixed)| 0.306 | 0.267 × 10⁻³ | 1.0× | + + The prose says interval arithmetic "yields extremely pessimistic bounds". These are + **peer** references, with no oracle region size **[not found]**. + https://arxiv.org/abs/2202.02444 +- **[fetched]** Mitchell, *Robust Ray Intersection with Interval Arithmetic* (Graphics + Interface 1990). It reports root-finding timings for its method and for peer + root finders. No pruning-against-oracle measure **[not found]**. + http://graphicsinterface.org/wp-content/uploads/gi1990-8.pdf +- Duff, *Interval Arithmetic and Recursive Subdivision for Implicit Functions and + Constructive Solid Geometry* (SIGGRAPH 1992), and Snyder, *Interval Analysis for + Computer Graphics* (SIGGRAPH 1992), were not retrieved in this pass. + https://doi.org/10.1145/142920.134027 + +## 4. Conservative rasterization and tile classification + +- **[fetched]** Hasselgren, Akenine-Möller, Ohlsson, *Conservative Rasterization* + (GPU Gems 2, chapter 42): + - **Section 42.1.** It defines overestimated rasterization as every pixel whose cell + intersects the polygon, and underestimated rasterization as every pixel whose + cell lies wholly inside it. + - **Section 42.5.** Overdraw is discussed qualitatively: it depends on triangle + acuity and resolution. Figure 42-7 compares the two proposed algorithms only. No + count of excess fragments against the exact overlap set **[not found]**. + + https://developer.nvidia.com/gpugems/gpugems2/part-v-image-oriented-computing/chapter-42-conservative-rasterization +- **[search]** Antochi, Juurlink, Vassiliadis, Liuha, *Scene management models and + overlap tests for tile-based rendering* (DSD 2004), and the companion *Efficient + tile-aware bounding-box overlap test*. In a search summary, the bounding-box + triangle-to-tile test "can generate up to 30% false positives" on common workloads, + measured against exact overlap. The full text could not be retrieved (the TU Delft + host refused the connection, and CiteSeerX returned HTML). + https://citeseerx.ist.psu.edu/document?doi=5c78f05f185b9513bf930588dd2a4ae334090620 + +## 5. Summary of reference kinds and reported figures + +| Source | Reference | Figure reported | +|--------|-----------|-----------------| +| Bittner et al. 2005, §6.2 | oracle (exact PVS) | conservative PVS +47% / +76% (ratio ≤ 0.68 / ≤ 0.57) | +| Bittner et al. 2005, §6.3 | oracle | object discretization +17% (≈ 0.85); line-space 0.023–0.52 by scene and resolution | +| Bittner thesis, ch. 2 | oracle | defines `Q_o`, `Q_u` relative to `|S_E|` | +| Cohen-Or et al. 2003 | — | notes the PVS/visible-set ratio is rarely reported | +| Nirenstein et al. 2002 | oracle (its own exact) | percent culled; calls that metric crude | +| CHC++ 2008 | oracle (OPT, node level) | within a few percent of OPT (exact queries, not bounds) | +| HOM 1997 | self | % of model culled, normalized frame time | +| Li, Mueller, Kaufman 2003 | self / all non-empty | 2.8× speedup; 56% of non-empty voxels skipped; overhead ≈ 10% reported separately | +| Zellmann 2019 | self | fps against no skipping | +| Keeter 2020 | self (brute force, compiled) | 17× / 216× tape reduction; false-positive share not measured | +| Heidrich et al. 1998 | none (range width) | IA error up to 50% where AA < 1/256 | +| Gamito, Maddock 2007 | peer | IA 2.1–3.8× more evaluations per ray than reduced AA + optimisation on noise | +| Knoll et al. 2009 | peer | RAA 1.5–4× faster than IA | +| Sharp, Jacobson 2022 | peer | IA provable region about 75× smaller in 1D than full AA | +| GPU Gems 2, ch. 42 | peer | qualitative overdraw | +| Antochi et al. 2004 [search] | oracle (exact overlap) | bounding box up to 30% false positives | + +On the interval side (section 3), none of the sources read in this pass reports a +pruning or culling fraction against an oracle mask, such as the truly empty cells or +the truly non-ambiguous tiles. They report only against self or peer baselines. The +oracle-referenced ratios found are all on the visibility side (sections 1.2 and 1.3), +and the one from rasterization (section 4) is search-only. No published figure was +found for interval-arithmetic culling of noise or warped-noise fields as a fraction of +an oracle. + +## 6. Local context (from the eureka mind, not re-measured) + +- **Question** `cultmath-tapes:question:wells-ceiling-oracle` (admitted 2026-10-03, + Imagination). At 3ac7250a it gives: + - warp 0: oracle efficiency 0.38, mask ceiling 0.96, cull fraction 0.95; + - warp D = 60: oracle efficiency 0.19, mask ceiling 0.99, cull fraction 0.84; + - a pre-pass that skips nothing: 0.14 against the oracle. +- **Finding** `cultmath-tapes:finding:cut-interval-ops.s2.wells-ceiling-contract-vacuous` + (Soul, confirmed by mutation). The mask-referenced (c) check reports 0.98 with the + wells skip disabled. Locations are in + `packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs`: lines 1257–1260, 1437 + and 1461. diff --git a/docs/research/cultcache-union-decode-tolerance-prior-art.md b/docs/research/cultcache-union-decode-tolerance-prior-art.md new file mode 100644 index 00000000..fe3fe618 --- /dev/null +++ b/docs/research/cultcache-union-decode-tolerance-prior-art.md @@ -0,0 +1,75 @@ +# Union and record decode tolerance: prior art and CultCache's stance + +Fork: thing2:question:contract-decode-tolerance. Follow-up: thing2:follow_up:cultcache-union-parity. +Eyes pass, 2026-10-10, session self-2026-10-10c-eureka. Facts only; no recommendation. +Tags: [fetched] read this session; [local] read in the repo this session; [background] prior knowledge, not refetched; [not found] the fetched page did not say. + +## 1. Established systems + +### Protocol Buffers +- Unknown fields: proto3 "preserve[s] unknown fields and include[s] them during parsing and in the serialized output", matching proto2. Lost on JSON serialization and on field-by-field copy into a new message; CopyFrom/MergeFrom avoid the loss. (protobuf.dev/programming-guides/proto3/, "Unknown Fields") [fetched]. The version proto3 started preserving (3.5) [background]. +- Unknown oneof case: no distinct state. The page warns a NOT_SET result is ambiguous: the oneof may be unset, or set to a field from a newer schema [fetched]. A oneof member the reader lacks is an ordinary unknown field, so it sits in the unknown-field set and is re-emitted [background]. +- Unknown enum values: "unrecognized enum values will be preserved in the message" (raw int in open-enum languages, accessor in Java) and re-serialized [fetched]. + +### Cap'n Proto +- Union: a separate tag says which member is set. Adding a member to a union is safe because "existing programs should already know to check the union's tag"; they "may or may not behave reasonably when the tag has a value they don't recognize". Moving an existing field into a new union can show an old reader "a garbage value or throw an exception" (capnproto.org/language.html, "Unions", "Evolving Your Protocol") [fetched]. +- which() on an unknown discriminant: [not found] in the fetched language and encoding pages. C++ generated which() returns the tag as an enum and the reader is expected to switch with a default [background]. +- Preservation: [not found] on the fetched pages; structs "can be traversed (e.g., copied) without knowing their type" (encoding.html, Structs) [fetched]. Copy preservation of unknown data is [background]. + +### Avro (schema resolution; reader schema and writer schema both required) +- Both unions: reader takes its first branch matching the writer's selected branch; "if none match, an error is signalled". Writer union, reader non-union: the selected writer branch must match, else error (Avro spec, Schema Resolution) [fetched; also quoted from the 1.11.1 spec in docs/research/read-only-record-signal-prior-art.md:176-178]. +- Record, writer has an extra field: "the writer's value for that field is ignored". Reader field missing from the writer: reader's default if it has one; no default is an error [fetched]. +- Enum, writer symbol absent in reader: reader's declared default if any, else error [fetched]. +- Preservation: none. Extra fields are dropped by resolution [fetched]. + +### FlatBuffers +- Union evolution: appending a member is safe ("CodeV1 will not recognize the another_a"); inserting in the middle without an explicit discriminant misreads members; inserting with an explicit discriminant is safe (flatbuffers.dev/evolution/) [fetched]. +- What an old reader sees for an unknown union type, and re-serialization preservation: [not found] on that page. Generated readers expose a type byte plus a union table pointer; an unknown type value falls outside the generated enum [background]. + +### Thrift +- Unknown fields and unknown union field ids: [not found] in thrift-rpc.md. Protocol readers skip unrecognized field ids and drop the data; an unknown union id leaves the union empty, and a union with no field set can fail validation [background]. + +### MessagePack-CSharp [Union] +- README Union section says only "Unique union keys are required"; it states no behaviour for an unknown key and no option for it [fetched, first 100k chars of the README]. +- Missing keys: members initialize to default (README, Object Serialization) [fetched]. Extra array elements for [Key(int)] and unknown string keys: README silent; it shows a manual formatter that loops and skips extras [fetched]. +- Generated and dynamic union formatters skip the payload and yield null when the key is absent from the union's key map [background]. The estate's own measurement agrees: unknown arm key decodes to null, no error (question document, "Measured in the C# reference... MessagePack-CSharp 3.1.7") [local, via eureka-state view]. The vendored copy at F:\Projects\CultPong\Assets\Scripts\MessagePack\Resolvers\DynamicUnionResolver.cs does a key-map TryGetValue at :347 (type-map TryGetValue at :206); the miss branch was not read. +- No configurable unknown-union behaviour found in the README; whether a newer version adds one [not found]. + +### serde +- enum-representations page says nothing on unknown variant names, #[serde(other)] or deny_unknown_fields [fetched]. serde_derive de.rs was fetched but the identifier/enum_ modules holding unknown_variant were not in the excerpt [not found]. +- [background] default: an unknown variant is an error ("unknown variant `X`, expected one of ..."); #[serde(other)] on a unit variant makes the identifier decoder return it for any unknown name (units only, payload discarded); unknown struct fields are ignored unless #[serde(deny_unknown_fields)]; a missing field is an error unless #[serde(default)] or Option. + +### Bincode / postcard +- [background] Both are non-self-describing: an enum is a variant index (bincode u32, postcard varint) followed by fields in order; an out-of-range index is a decode error; there are no field tags, so an extra or missing slot is detectable only by running out of or leaving bytes. Evolution is by schema versioning outside the format. Not fetched. + +## 2. Preservation across an older reader, and the failure each answers +| System | Unknown data survives re-encode? | Failure answered | +|---|---|---| +| Protobuf | yes: unknown fields (hence unknown oneof cases) and unknown enum ints, in binary APIs only [fetched] | old intermediary re-serializing a newer message (purpose: background) | +| Cap'n Proto | page silent; reader sees a tag it may not know and must handle it [fetched] | in-place access; append-only evolution | +| Avro | no: extra field dropped, or error on no branch / no default [fetched] | writer schema travels with data, so resolution is exact and loud | +| FlatBuffers | page silent [fetched] | append-only evolution, explicit discriminants | +| Thrift | no (skipped) [background] | forward tolerance for old readers | +| MessagePack-CSharp | no: arm becomes null (measured), extra slot skipped | not documented | +| serde | no; error by default [background] | type safety; leniency is opt-in | +| Bincode/postcard | n/a [background] | compactness; no evolution in the format | +| Unity SerializeReference, DataContract ExtensionData | yes: bytes retained and recoverable (docs/research/read-only-record-signal-prior-art.md:182-205) [local] | data loss from missing types | + +## 3. CultCache's own stance (F:\Projects\CultLib) +- docs/persisted-record-encoding.md:1-19: persisted records are verified by re-encoding what was decoded and comparing bytes; a record that reads but re-encodes differently is refused, on live data at startup or next read. Three Idunn guards cited at :10-14. [local] A tolerated extra trailing slot or a null-collapsed arm would not re-encode to the stored bytes; whether those guards would run on such records was not tested. +- No evolution/compatibility doc: `ls docs | grep persist|evol|compat|schema|version` returns only persisted-record-encoding.md. docs/document-variants-cut.md:327-333 covers union-slot reuse at registration ("late union-slot reuse passes registration"; "interface unions are never minted") [local, grep lines only]. +- Reference union handling: src/GameCult.Caching/CultInspectorModel.cs:768-774 classifies an abstract/interface type by its [UnionAttribute]s ordered by key and refuses a type with none ("declares no [Union] subtypes", :772); also :120. This is the inspector's shape classifier; decode is MessagePack-CSharp's. No other use of UnionAttribute in src/GameCult.Caching. [local] +- Trailing-slot tolerance: packages/cultcache-ts/test/cult-cache.test.ts:1176-1195, "CultCache interop reader accepts missing compatible trailing slots and rejects mismatched slots": a legacy-payload store with fewer slots reads with `tags: []`; a mismatched-type payload rejects with /Expected string/u. Missing trailing slots are tested; extra trailing slots are not. [local] +- TS decode: packages/cultcache-ts/src/cult-cache.ts:679-692 wraps a formatter as `schema.parse(decode(payload))`, so TS strictness is whatever the zod schema says; no TS union codec (follow-up text). [local] +- Rust: packages/cultcache-rs/src/*.rs has no unknown-arm or extra-slot handling found by grep; "unknown" hits are store-header tests (:4889-4890 refuses an unknown header by name; :5009-5019 unknown-header.msgpack, variant-v2.msgpack). Rust enum arms persist as serde external tags (follow-up text). [local] +- Consumers persisting unions: Aetheria (F:\Projects\Aetheria) has `[Union]` abstract classes in Assets/Scripts/ServerShared: Provenance.cs:96-98 (keys 0-2), ItemInstance.cs:18-21 (keys 0-3) and :29-31, Environment.cs:73. The assembly registers CultCache documents (AssemblyInfo.cs:3-4; Galaxy.cs, ItemData.cs, AetheriaStores.cs reference CultCache); ItemInstance is held in entity item lists (Entity.cs:2003). An older build reading a store with a newer arm key would take the C# null-arm path, if these types sit inside persisted CultCache documents; that persistence path was not traced. Aetheria-legacy has more unions (Behaviors.cs:29-38, Item.cs:43-63, Contract.cs:10-11); commented-out keys 8, 9 at Behaviors.cs:37-38 show arms retired in place. [local] +- Ghostlight and Huginn: not searched for [Union] (the grep matched only Aetheria). Follow-up text: "No live record crosses runtimes as a union today" [local, view]. Same-runtime older-build-reads-newer-store: unverified. +- The question document records the C# measurement: extra trailing slot skipped and equal; missing trailing slot leaves member default; unknown arm null, for a Node in a list and for an Outcome; Rust and TS union decoders with explicit keys refuse by construction; Rust extra-slot behaviour unmeasured [local, view]. + +## 4. Operator's stated value, and how each option relates (inferred) +Verbatim, operator-rapport.md:50: "nobody should have to carry bytes they don't understand ... CultCache's whole promise is that a cache's contents are self-identifying via the upfront catalog." Context: pushing back on storing retired slots as metadata (:49). [local] +- Preserve-unknown (protobuf, Unity): the older reader carries bytes the catalog does not describe. Opposite to the stated value. +- Drop silently (Avro extra fields, MessagePack slot skipping, Thrift skip): nobody carries the bytes, but the loss is silent and a re-encode no longer equals the stored bytes (persisted-record-encoding.md:4-6). +- Null the arm (current C# union behaviour): the unknown arm becomes a value the catalog does not describe either; the record decodes as if valid. +- Refuse (Avro no-branch, serde default, Rust/TS explicit-key decoders, store-header refusal): the reader declares it cannot understand the bytes; consistent with self-identifying content because undescribed content is not accepted. +- Tolerate trailing slots but refuse unknown arms (fork option 1): the catalog-described slot list governs required members; slots beyond it are skipped, which is the drop-silently pattern for slots and the refuse pattern for arms. diff --git a/docs/research/cycles-fma-contraction.md b/docs/research/cycles-fma-contraction.md new file mode 100644 index 00000000..1e25be67 --- /dev/null +++ b/docs/research/cycles-fma-contraction.md @@ -0,0 +1,83 @@ +# Cycles CPU FMA contraction: facts for the kernel-pin fork + +Serves finding `cultmath-tapes:finding:cut-cycles-converters.s1.kernel-pin-unraised-fork` (kind Finding, InForce, Medium, admitted 2026-10-13, soul-cycles-converters-s1). +Gathered by eyes-cycles-fma, session self-2026-10-14-eureka, 2026-10-14. Facts only; no recommendation. + +Strength marks: [src] read from source text; [doc] vendor or standards documentation; [web] issue, forum or search-result summary; [abs] absence of evidence (searched, not found). +"Raw" Blender paths below are fetched as `https://projects.blender.org/api/v1/repos/blender/blender/raw/?ref=`. Local copies of the main-branch files are in `...\scratchpad\eyes-cycles-fma\dl\`. + +## 0. The finding's own record (what is being tested) + +- [src] The finding quotes the oracle probes: with the AVX2 kernel, 17 function rows differ from committed fixtures (floored_modulo 151/1024 cases ... color 55/1024), worst `mix_overlay` 493 ulp, `cycles_floored_modulo` 958152704 ulp (sign flip). Yggdrasil's /proc/cpuinfo shows avx2 and fma. +- [src] Oracle code: `kernel_check()` in `tools/cycles-oracle/oracle.py` bakes FLOORED_MODULO of 10000 by 0.1 and compares to numpy unfused `a - floor(a/b)*b`; exits 4 if the kernel fuses. Read with `git show e48f9488:packages/cultmath/tools/cycles-oracle/oracle.py` (lines ~528-551), README lines 20-30, `CyclesOracleTests.cs` lines 5-18 (those paths are not in the working tree at main; they exist at commit e48f9488). The oracle Blender is 5.2.2. + +## 1. Cycles CPU kernels and flags + +1. [src] The CMake file defines two x86 CPU kernel variants only: an SSE4.2 baseline and an AVX2 kernel (`WITH_KERNEL_AVX2`). No AVX-512 flag or kernel appears; `kernel.cpp` lists `cpu` and `cpu_avx2`. `intern/cycles/CMakeLists.txt` lines 76-130, 137-143 (main and v5.2.2); `intern/cycles/device/cpu/kernel.cpp` line 11 (v5.2.2): `KERNEL_NAME_EVAL(cpu, name), KERNEL_NAME_EVAL(cpu_avx2, name)`. +2. [src] GCC/Clang flags (CMakeLists.txt lines 97-100): SSE4.2 = `-msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2`; AVX2 = SSE4.2 flags + `-mavx -mavx2 -mfma -mlzcnt -mbmi -mbmi2 -mf16c`. The `-mfma` flag is what makes FMA instructions available only in the AVX2 kernel. MSVC: AVX2 kernel `/arch:AVX2`, SSE4.2 kernel empty on x64 (lines 82-89). Intel compilers use `/QxCORE-AVX2` or `-xcore-avx2`. +3. [src] Contraction flags, GCC/Clang block (CMakeLists.txt lines 160-180, main = v5.2.2): `-fno-trapping-math`, `-fno-math-errno`, `-fno-signed-zeros`, `-ffp-contract=on`, `-freciprocal-math`; `-fassociative-math` is commented out ("problems with bsdf_D for GGX on Linux (#130389)"); `-ffinite-math-only` deliberately not set. These are appended to the global `CMAKE_CXX_FLAGS`, so they apply to both kernels; only `-mfma` differs. GCC additionally gets `-fno-signaling-nans`, `-fno-rounding-math`, `-mfpmath=sse`. +4. [src] MSVC (non-clang) block (line 149): `/fp:fast`, with the comment "Unlike GCC/clang we still use fast math, because there is no fine grained control and the speedup we get here is too big to ignore." For clang-cl the GCC/Clang flag list is passed with a `/clang:` prefix (line 198). +5. [src] History of the contraction flag (Forgejo API commit messages): + - `f96f3c33af`, 2024-09-30, "Cycles: Add some more math optimizations": added `-ffp-contract=fast`, `-freciprocal-math`, `-fassociative-math`. Message: "These are used on Windows and HIP anyways, so our code can't expect exact IEEE semantics in any case." Measured "~1.5% speedup in my very quick test". + - `0fc58f0aba`, 2024-11-25, "Disable -fassociative-math on Linux to avoid GGX issues". + - `7b19e74cad`, 2025-12-14 (PR 150318): changed `fast` to `on`: "Disable FMA auto-vectorization across different statements in Cycles, because GCC 15.2.1 manages to ruin the viewport's scaling and offset" (GCC bug 106902). It also removed a `remove_cc_flag("-ffp-contract=off")` block ("Not needed to make cycles automated tests pass with -march=native. However Blender itself needs this flag"). + - Before 2024-09-30 the CMake file carried no Cycles-specific contraction flag; the global Blender flag was `-ffp-contract=off` (stripped for Cycles by that `remove_cc_flag` block). [src, inferred from the removed lines; the earlier state was not read at an older tag.] +6. [doc] GCC definition: `-ffp-contract=on` "enables contraction within one expression, but not across different statements"; `fast` forms FMA "if the target has native support"; default `off` for ISO C, `fast` otherwise. Source: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html. (Which GCC release implemented `on` for C++ was not checked.) +7. [src] Cycles' floored modulo is one C++ expression: `return (b != 0.0f) ? a - floorf(a / b) * b : 0.0f;` in `intern/cycles/util/math_base.h` (v5.2.2 line 613-616; main line 646-649). `NODE_MATH_FLOORED_MODULO` calls it from `kernel/svm/math_util.h` line 164. `safe_modulo` (truncated) uses `fmodf`, not an expression. `-freciprocal-math` also permits `a/b` to become `a * (1/b)`. +8. [src] Env switch: `intern/cycles/util/debug.cpp` (v5.2.2) line 29 `CHECK_CPU_FLAGS(avx2, "CYCLES_CPU_NO_AVX2")`, line 23 `flag = (getenv(env) == nullptr)`; presence of the variable disables the AVX2 kernel. [web] added 2015-02 by Sergey Sharybin, commit 4b04a4e, described as developer-only: https://lists.blender.org/pipermail/bf-blender-cvs/2015-February/073396.html (via search summary). +9. [src] The AVX2 kernel is selected at runtime by CPU capability: `system.cpp` `system_cpu_support_avx2()` requires avx2 and f16c ("F16C is considered part of AVX2 for our purpose"), so a default Blender on any AVX2 CPU uses it. +10. [src] Cycles' own render tests are image tests with a default `fail_threshold = 0.016`, `fail_percent = 1` (`tests/python/modules/render_report.py` lines 287-288), overridden per test (e.g. 0.032, 0.06, 0.048; `tests/python/cycles_render_tests.py` ~339-357). They compare images, not per-node bit patterns. A grep for AVX/NO_AVX in these two files found nothing, so the tests do not appear to pin a kernel. [src for what was found; absence is [abs]] + +## 1b. GPU backends + +11. [src] CUDA: `intern/cycles/device/cuda/device_impl.cpp` line ~225 passes `--use_fast_math` to nvcc (nvcc fuses FMA by default; `--fmad` default is documented NVIDIA behaviour, not fetched here). `kernel/device/cuda/compat.h` line 89 has the comment "Use fast math functions". +12. [src] HIP: `kernel/device/hip/compat.h` line 91 "Use fast math functions" (the HIP compile flags were not located; the commit message in item 5 states HIP already runs without exact IEEE semantics). +13. [src] Metal: `device/metal/device_impl.mm` line 570 `options.fastMathEnabled = YES;`. +14. [src] oneAPI: `kernel/device/oneapi/CMakeLists.txt` line 71 `-ffast-math`, line 83 `-cl-fast-relaxed-math` for spir64. +15. [src] OptiX: not separately examined (OptiX kernels are CUDA-compiled). +16. [src] The fp-contract/fast-math choices are thus explicit in all of: CPU (`on`, both kernels), MSVC CPU (`/fp:fast`), CUDA, HIP, Metal, oneAPI. + +## 1c. Do Blender developers treat CPU/GPU numeric differences as bugs + +17. [web] Issue #101114 (Power math node precision): a developer said they do not handle such precision issues as bugs since implementation is by the GPU driver and manufacturer. https://developer.blender.org/T101114 (search-result summary; page not read). +18. [web] Issue #68687 (Eevee modulo inconsistent): a developer said the imprecision "is likely to remain as it is an implementation behavior we cannot ensure"; reporters noted Cycles gave the expected result. https://developer.blender.org/T68687 (summary). +19. [web] Issue #53348 (Cycles CPU vs GPU in World nodes): a developer attributed the difference to "--fast-math we use for CUDA" and noted disabling it costs about 15% speed. https://projects.blender.org/blender/blender/issues/53348 (summary; page returned 403 to WebFetch). +20. [web] Issue #67448 "Shader node float precision issue cause different results on CPU and GPU" exists (archived); its content was not read (redirect not followed). https://developer.blender.org/T67448 +21. [abs] No Blender issue specific to Floored Modulo and FMA/AVX2 was found; no Blender document stating a CPU/GPU numeric parity guarantee was found. + +## 2. Shader languages + +22. [doc] HLSL `precise`: separate operations stay separate ("where a mul and add operation might have been fused into a mad operation, precise forces the operations to remain separate"; fusion then only via the explicit `mad` intrinsic); order of operations preserved; IEEE NaN/INF honoured. It propagates only to operations that contribute to the `precise`-qualified variable; marking shader outputs is recommended. https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-variable-syntax +23. [doc] HLSL `mad`: may be fused or mul+add in hardware; for `precise` values the hardware must be consistent across all uses of that mad on that hardware. https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/mad (search summary). [web] The HLSL team blog says any operation may be refactored unless `precise`, and `/Gis` makes all computations precise: https://learn.microsoft.com/ko-kr/archive/blogs/marcelolr/precise-and-ieee-strictness-in-hlsl (summary). +24. [abs] DXC's default contraction of plain `a*b+c` was not confirmed from DXC docs or source; clang HLSL PR #119820 "Make fast math the default for HLSL" exists (https://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20241209/654101.html), content not read. +25. [src] Vulkan SPIR-V environment (https://registry.khronos.org/vulkan/specs/1.3/html/chap37.html, fetched and grepped): "Implementations may rearrange floating-point operations using any of the mathematical properties governing the expressions in precise arithmetic ... may involve a different number of rounding steps"; "This rearrangement can be prevented for particular operations by using the NoContraction decoration." Without NoContraction the flags AllowContract/AllowReassoc/AllowRecip/AllowTransform are assumed. Same page: OpFMod "Inherited from x - y * floor(x/y)"; OpFRem inherited from `x - y * trunc(x/y)`; OpFDiv 2.5 ULP for |y| in [2^-126, 2^126]; and the page lists `OpFmaKHR`/`shaderFmaFloat32` (a core-spec FMA capability) as new. +26. [doc] GLSL: `precise` qualifier ("the qualifier precise will ensure that operations contributing to a variable's value are performed in the order and with the precision specified") "effectively prohibits the arbitrary use of fused multiply-add"; under `precise`, `fma()` is one operation and `a*b+c` is two. Sources: GL_ARB_gpu_shader5 / OES_gpu_shader5 text and https://registry.khronos.org/OpenGL-Refpages/gl4/html/fma.xhtml (search summary). `invariant` was not looked up. +27. [doc] SPIR-V `NoContraction` goes on the intermediate-result instructions, not the variable; GLSL `precise` lowers to it in glslang/ANGLE. [web] LLVM-based backends have contracted NoContraction multiplies into fma before (bug report in search results, wording in item summary only). +28. [web] Metal: `MTLCompileOptions.fastMathEnabled`/`mathMode` (fast vs safe); in safe mode MSL requires correctly rounded FP32 add, sub, mul, div, fma; `metal::precise` namespace gives precise library functions; explicit `fma()` is the advice for controlling fusion. https://developer.apple.com/documentation/metal/mtlcompileoptions/mathmode.md and https://developer.apple.com/forums/thread/90959 (summaries). Current Xcode default for fast math was not confirmed ([web] sources conflict). No Metal `fp_contract` pragma found [abs]. +29. [abs] Unity's shader compiler (FXC/DXC via HLSLcc/SPIRV-Cross) contraction behaviour: no documentation found. + +## 3. C# / .NET + +30. [doc] `Math.FusedMultiplyAdd` (and `MathF`): "Returns (x * y) + z, rounded as one ternary operation"; infinite-precision multiply and add then one rounding. Available .NET Core 3.0+ and .NET 5-11. https://learn.microsoft.com/en-us/dotnet/api/system.math.fusedmultiplyadd +31. [web] dotnet/runtime issue #10137 "[Jit] Recognize FMA pattern and Emit Fused Multiply Add" closed 2024-02-05 as COMPLETED with the maintainer comment: "Closing this. We have explicit `FusedMultiplyAdd` APIs and will likely cover any future 'pick the better of MultiplyAdd or FusedMultiplyAdd' via an explicit `MultiplyAddEstimate` API." (read with `gh issue view 10137 -R dotnet/runtime`). Earlier comments there state the intent that `a*b+c` stay two IEEE roundings. PR #61037 adds an arm64 MADD fold for integers only (summary). +32. [web] Issue #98704 "Math.FusedMultiplyAdd returns wrong results on systems without FMA3 support", closed COMPLETED 2025-05-06: the software fallback had been an estimate (suspected ucrtbase `fma`), so correct rounding was guaranteed only with hardware FMA3; `COMPlus_EnableFMA=0` did not reproduce it on FMA3 hardware. Fix details were not read. Also [web] TA-Lib issue #340 reports the same misrounding concern. +33. [abs] A statement in .NET docs that RyuJIT never contracts floating-point `a*b+c` was not found; #10137's closure is the nearest evidence. The CultMath repo's own use of FusedMultiplyAdd/MathF.FusedMultiplyAdd was not searched. + +## 4. Other reference implementations and tolerance policies + +34. [src] OpenShadingLanguage testsuite (`testsuite/runtest.py` lines 82-87): image diff thresholds `failthresh = 0.004`, `hardfail = 0.01`, `failpercent = 0.02`, warn at 2x failthresh; "A test fails if more than failpercent of pixel values differ by more than failthresh ... or if even one pixel differs by more than hardfail." Raw URL: https://raw.githubusercontent.com/AcademySoftwareFoundation/OpenShadingLanguage/main/testsuite/runtest.py +35. [src] Blender's Cycles render tests: item 10 (image thresholds, default 0.016/1%). +36. [doc] Vulkan precision table lists per-operation ULP classes (item 25); functions defined as expressions inherit the budgets of their constituents (GLES3 CTS spec, https://fuchsia.googlesource.com/third_party/vulkan-cts/+/30e25b62d60b36b923d19a0c0759ef6cb7201f9e/doc/testspecs/GLES3/functional.shaders.builtin_functions.precision.txt, summary). Historical draft GL_ARB_shader_precision: `a*b+c` "correctly rounded single operation or sequence of two correctly rounded operations", fma same as a*b+c (https://developer.download.nvidia.com/opengl/specs/GL_ARB_shader_precision.txt, summary). +37. [abs] Not found/not examined: MaterialX reference-vs-generated shader tolerances (only structure of MaterialXTest located); glTF sample renderer conformance; any published "bit-exact vs ulp class" policy statement from Khronos, MaterialX, OSL or Blender; the Vulkan CTS source ULP constants for mix/smoothstep/fma. + +## 5. Floored modulo specifics + +38. [src] Definition in Cycles: `a - floorf(a / b) * b` (item 7). For a=10000, b=0.1f the quotient a/b rounds to 100000 (float) and floorf gives 100000, so the unfused product 100000*b rounds to 10000 and the result is 0, as the oracle records; the fused form computes the residual of the exact product (b is not exactly 0.1), yielding -1.49e-4 as the finding records. [abs] This arithmetic was not re-run here; it restates the finding's `kernel_check` docstring (oracle.py). +39. [abs] No Blender issue or commit mentioning Floored Modulo together with FMA, contraction or AVX2 was found. [web] Related reports concern modulo/wrap disagreements between Cycles and Eevee/GPU drivers (#101562, #68687, #88151). +40. [doc] Vulkan states OpFMod is "inherited from x - y * floor(x/y)", i.e. the same formula, so a GPU implementation of it follows its own contraction/precision rules (item 25). + +## Coverage and gaps + +- Strong [src]: Cycles flag set per ISA and compiler, the history of `-ffp-contract`, `safe_floored_modulo`, `CYCLES_CPU_NO_AVX2` mechanism, GPU backends' fast-math flags, Cycles/OSL image-test thresholds, Vulkan NoContraction and OpFMod text, HLSL `precise`. +- Gaps: which compiler/version builds official Blender 5.2.2 release binaries (matters for how `-ffp-contract=on` is honoured); the 4.x flags before/after 2024-09-30 at release tags; DXC/Unity default contraction; Metal contraction pragma; MaterialX, glTF and Vulkan CTS numeric tolerances; a direct statement that RyuJIT never contracts; Blender developer position on CPU/GPU parity beyond forum/issue summaries (several pages 403 to WebFetch). +- Files of record: `C:\Users\Meta\AppData\Local\Temp\claude\F--Projects-CultLib\0d5eef6e-e366-457f-bbc6-0151080ae1a8\scratchpad\eyes-cycles-fma\dl\` (CMakeLists.txt, math_base.h, math_util.h, vk.html). diff --git a/docs/research/decode-stack-safety.md b/docs/research/decode-stack-safety.md new file mode 100644 index 00000000..e6058104 --- /dev/null +++ b/docs/research/decode-stack-safety.md @@ -0,0 +1,83 @@ +# Decode stack safety: prior art (facts only) + +Serves follow-up `cultlib-gaps:follow_up:decode-stack-safety` (campaign cultlib-gaps), source finding `thing2:finding:cut-contract-rs.s1.decode-stack-overflow-within-bound`. +Gathered 2026-10-12 by eyes-decode-stack at CultLib `67c79d5c`. No recommendation. Web facts come from WebFetch/WebSearch summaries of the pages named; items marked UNVERIFIED were not confirmed against primary source. + +## A. The local door (what exists today) + +- `packages/cultcache-rs/src/lib.rs:503` `MAX_PAYLOAD_DEPTH = 256`; `check_payload_depth` (~526-540) is an iterative walk with a `[usize; 256]` count stack, scalars skipped by length. +- `lib.rs:598-604` `decode_payload`: `check_payload_depth(payload)?; rmp_serde::from_slice(payload)`. Its doc comment calls rmp-serde's own counter (1024) "only a backstop". +- Derive: `packages/cultcache-rs/cultcache-rs-derive/src/lib.rs:294-330` generates `impl Deserialize` with a `Visitor::visit_seq` over slot-ordered arrays (`deserialize_tuple`); unknown trailing elements are consumed via `IgnoredAny`. +- rmp-serde resolved version: 1.3.1 (rmp 0.8.15; `packages/cultcache-rs/Cargo.lock`). Its depth limit is a `u16` `depth: 1024`, decremented per array/map/ext (`~/.cargo/registry/src/*/rmp-serde-1.3.1/src/decode.rs` lines 181, 213, 294, 566, 583, 616), error `DepthLimitExceeded`, tunable with `Deserializer::set_max_depth` (clamped to u16::MAX, lines 307-310). CHANGELOG line 95: "Default stack protector depth is now 1024 instead of 1000." +- Upstream master rmp-serde (fetched summary, not checked line by line against 1.3.1): the `deserialize_newtype_struct` MSGPACK_EXT_STRUCT_NAME branch builds `ExtDeserializer` without `depth_count!`; the `any_inner` ext path does use it. +- Existing local tests that already use sized threads: `packages/cultcache-rs/tests/union_parity.rs` ~786-830: `stack_budget_debug_2mib` (comment: "A debug build on a 2 MiB thread carries 405 containers of this document; the bound keeps every accepted payload below that") on a slim fixture (`wrap_chain(126, ...)`), and `the_walk_does_not_recurse` (100000 nested arrays refused on a 256 KiB thread). No stacker, `stack_size`, or thread spawn in `src/` or `Cargo.toml`. +- The rmp-serde 1024 counter and the CultLib 256 bound both count containers; per-level stack cost depends on the target type (follow-up text: 15-19 KiB release, 87-95 KiB debug per level for contract-sized types). + +## B. Rust serde ecosystem + +### serde_json +- Default limit 128: `Deserializer::new` sets `remaining_depth: 128` (field `u8`); `check_recursion!` returns `ErrorCode::RecursionLimitExceeded` at 0; invoked in `deserialize_any/seq/map/struct/enum`. https://github.com/serde-rs/json/blob/master/src/de.rs +- `disable_recursion_limit()` exists only under Cargo feature `unbounded_depth`. Docs: "Parse arbitrarily deep JSON structures without any consideration for overflowing the stack"; tells the caller to "provide some other way to protect against stack overflows" and names `serde_stacker`. Docs also warn that Display, Debug and Drop on the result can overflow. https://docs.rs/serde_json/latest/serde_json/struct.Deserializer.html +- The limit is a nesting-level count; no per-type frame accounting (code read: counter decrement only). The serde_json README mentions no recursion limit. + +### serde_stacker (dtolnay) +- Adapter wrapping a serde (de)serializer that grows the stack dynamically; README examples use `serde_json::Deserializer`, call `disable_recursion_limit()`, wrap with `serde_stacker::Deserializer::new`, nest 10,000 levels. README names Display/Debug/Drop as other overflow points and shows a manual iterative drop. README does not say it depends on `stacker` (UNVERIFIED). https://github.com/dtolnay/serde-stacker +- It is a serde-level `Deserializer` wrapper, so it hooks calls routed through the wrapped deserializer. + +### rmp-serde / rmpv +- rmp-serde: depth counter 1024 default (section A). Search found no RUSTSEC advisory or issue for rmp / rmp-serde stack overflow (negative search, not proof). https://github.com/3Hren/msgpack-rust (rmp-serde/src/decode.rs). +- rmpv not inspected. + +### Other Rust deserializers +- ciborium: `recurse: usize` default 256 in `from_reader`; `from_reader_with_recursion_limit`; doc: "Set a high recursion limit at your own risk (of stack exhaustion)!" https://github.com/enarx/ciborium (ciborium/src/de/mod.rs) +- serde_cbor: RUSTSEC-2019-0025, tags nested without limit, <1 kB input overflows the stack, fixed in 0.10.2 by limiting nested tags. https://rustsec.org/advisories/RUSTSEC-2019-0025 +- rustc-serialize: RUSTSEC-2022-0004, JSON parser with no depth limit, "stack overflow, which aborts the process", unpatched, advises serde. https://rustsec.org/advisories/RUSTSEC-2022-0004 +- yaml-rust: RUSTSEC-2018-0006, deep nesting aborts, fixed by depth check. https://rustsec.org/advisories/RUSTSEC-2018-0006 +- serde-json-wasm: GHSA-j87p-gjr6-m4pv, overflow on deep untrusted JSON, fixed 1.0.1 by recursion depth check. https://advisories.gitlab.com/pkg/cargo/serde-json-wasm/GHSA-j87p-gjr6-m4pv/ +- quick-xml PR 982: adds a depth cap to its serde deserializer, default 128 "matching serde_json". https://github.com/tafia/quick-xml/pull/982 +- prost: `const RECURSION_LIMIT: u32 = 100`, comment "100 is the default recursion limit in the C++ implementation"; disabled by feature `no-recursion-limit`. https://github.com/tokio-rs/prost/blob/master/prost/src/lib.rs +- bincode, postcard, simd-json: searches returned nothing on depth handling; not established either way. +- Rust forum user report: serde overflowing the default stack beyond roughly 100 levels in some types, worked around with a 32 MiB thread. https://users.rust-lang.org/t/deserialize-large-nested-struct-without-stack-overflow/136335 + +## C. Stack-growth mechanism: stacker / psm / stacksafe + +- `stacker::maybe_grow(red_zone, stack_size, f)`: checks whether the current stack is within `red_zone` bytes of its end; if so allocates a new stack of "at least `stack_size` bytes" and runs `f` there; else runs on the current stack. The closure runs on a stack with at least `red_zone` bytes available. https://docs.rs/stacker/latest/stacker/fn.maybe_grow.html +- Source (rust-lang/stacker `src/lib.rs`): remaining stack = stack pointer minus thread-local `STACK_LIMIT` (lazily from `guess_os_stack_limit`); if `remaining_stack()` is `None`, `maybe_grow` "immediately grow[s]"; panics are caught on the new stack and re-raised after the segment is freed (`catch_unwind` / `resume_unwind`); on unsupported platforms `_grow` is a no-op that just calls the callback. +- Platform: README says psm on most platforms, a Fibers-based implementation on Windows; "On all unsupported platforms this library is a noop... code will continue to hit the guard pages". https://github.com/rust-lang/stacker +- psm README table (rust-lang/stacker/psm/README.mkd): Windows x86_64 Available Yes / Tested Yes / Callstack "Yes, but disabled"; Windows i686, aarch64, arm: No/No/No; Linux x86_64, i686, aarch64, arm: Yes/Yes/Yes; wasm: No/No/No ("callstack is not even in an address space"). Text: stacks allocated the usual way are not valid on Windows; Fibers offered as an "unnecessarily slow and inflexible" alternative. +- CONFLICT, not reconciled: stacker's code selects a Windows backend (`backends::windows::_grow`, `cfg(all(windows, not(miri)))`) while the psm table marks Windows callstack "disabled"; stacker has a wasm32 branch (alloc-based restore guard) while psm lists wasm as No. An older docs.rs stacker 0.1.0 page lists a different verified-platform list. +- Not found in sources read: per-call cost numbers; Windows aarch64 behavior of stacker beyond the psm table. +- rustc usage (ensure_sufficient_stack, red zone / segment constants): two fetches returned 404; not recorded. +- `stacksafe` (fast/stacksafe): `#[stacksafe]` attribute checks remaining stack at function entry and allocates a new segment below a threshold; defaults 128 KiB threshold, 2 MiB segment; optional `serde` feature gives stack-safe (de)serialization for the `StackSafe` wrapper; MSRV 1.88.0; credits Orson Peters' `recursive` crate; says it supports platforms stacker supports (dependency on stacker not confirmed). https://github.com/fast/stacksafe + +## D. Dedicated thread with sized stack + +- `std::thread`: default spawned-thread stack "currently 2 MiB on all Tier-1 platforms"; `Builder::stack_size`; `RUST_MIN_STACK` (overridden by `stack_size`, "may be ignored after program start"); "the stack size of the main thread is not determined by Rust". https://doc.rust-lang.org/std/thread/index.html +- Local use is in tests only (`union_parity.rs`, section A). No library was found in this pass that spawns its own decode thread for untrusted input; the Rust forum report (section B) and the protobuf.js advisory describe it as a caller-side or process-level workaround. +- protobuf.js CVE-2026-44289 workarounds: reject excessively nested messages at an outer protocol boundary, or isolate decoding "in a process that can be safely restarted". https://corgea.com/advisories/vulnerabilities/CVE-2026-44289 + +## E. Non-recursive decoders + +- `deser` crate (mitsuhiko, experimental): "does not recurse on the call stack, so deep nesting needs no recursion limit"; nested sinks/emitters kept in an arena; not serde-compatible; calls itself "an experiment". https://github.com/mitsuhiko/deser/wiki +- `core-json`: no-std JSON parser with a fixed-size or caller-supplied state stack; typed layer is a separate crate, `core-json-traits`. https://docs.rs/core-json +- No serde-compatible explicit-stack derive deserializer found (search negative). +- msgpack-javascript: decoder iterative, `StackPool` array of states; DecoderOptions has no max depth, only length caps (`maxStrLength`, `maxBinLength`, `maxArrayLength`, `maxMapLength`, `maxExtLength`); pool memory grows with deepest nesting; array states allocate `new Array(size)` up front. https://github.com/msgpack/msgpack-javascript/blob/main/src/Decoder.ts +- msgpack-python C unpacker (`unpack_template.h`): explicit `unpack_stack stack[MSGPACK_EMBED_STACK_SIZE]`, `start_container` returns -3 at `top >= SIZE`. `unpack.h` defines the size as 1024 (`unpack_define.h` default is 32). Local probe (msgpack 1.2.2, CPython 3.13.15, `python -I`): 100, 256, 1000 nested arrays decode ok; 100000 raises `StackError`. +- CultLib's own `check_payload_depth` walkers are iterative (Rust lib.rs ~526; TS `packages/cultcache-ts/src/payload-depth.ts`; C# `CultPayloadDepth.cs`). + +## F. Advisories and other-language limits + +- MessagePack-CSharp CVE-2026-48506 / GHSA-vh6j-jc39-fggf (published 2026-06-25): `MessagePackReader.TrySkip()` recursed without counting depth, bypassing `MaximumObjectGraphDepth`; reachable through generated formatters' `reader.Skip()` on unknown keys; uncatchable StackOverflowException; affected <2.5.301 and 3.0.0 to <3.1.7; fix: iterative loop with a heap pending-count. https://securelayer7.net/lab/cve-2026-48506-messagepack-csharp-tryskip-uncontrolled-recursion-dos . Related: CVE-2026-48512 (`ConvertFromJson` recursion), CVE-2026-48513 (Union deserialization not consistently under depth enforcement). +- Default `MaximumObjectGraphDepth`: the sources read do not state it (a figure of 500 was not confirmed). +- protobuf: documented unmarshal depth limits Java 100, C++ 100, Go 10000 (plan to lower to 100); the page gives no rationale. https://protobuf.dev/programming-guides/proto-limits/ . CVE-2024-7254: protobuf-java nested SGROUP unknown fields/maps unbounded recursion, StackOverflow, CVSS 4.0 8.7, fixed 3.25.5 / 4.27.5 / 4.28.2. https://cveawg.mitre.org/api/cve/CVE-2024-7254 (CONFLICT: RHEL reports not affected; an OpenCVE page says no fix, against the CVE record's fixed versions). +- Go encoding/gob CVE-2022-30635: uncontrolled recursion on ignored fields; fix adds a depth limit of 10,000; fixed in 1.17.12 / 1.18.4. https://go.googlesource.com/go/+/6fa37e98ea4382bf881428ee0c150ce591500eb7 . Go encoding/json nesting constant: not confirmed. +- .NET System.Text.Json: `JsonSerializerOptions.MaxDepth` default 0 meaning 64; exceeding throws `JsonException`. https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions.maxdepth +- Python `json`: docs say the module "does not impose any such limits beyond those of the relevant Python datatypes themselves or the Python interpreter itself"; RecursionError for deep input not mentioned. https://docs.python.org/3/library/json.html . The pure-Python msgpack fallback Unpacker recurses (`# TODO should we eliminate the recursion?`), has no depth option, converts `RecursionError` to `StackError`. https://github.com/msgpack/msgpack-python/blob/main/msgpack/fallback.py +- msgpack5 (JS) CVE-2026-107298: no nesting limit, deep input exhausts the decoder stack (title seen only). https://vulert.com/vuln-db/CVE-2026-107298 + +## G. CultLib's other runtimes + +- C# reference: `src/GameCult.Caching.MessagePack/CultMessagePackSecurity.cs`: `UntrustedData.WithMaximumObjectGraphDepth(256)` as backstop; the rule is `CultPayloadDepth.Check`. MessagePack package pinned 3.1.7 (`GameCult.Caching.MessagePack.csproj`), the TrySkip fix version. Other C# surfaces use bare `MessagePackSecurity.UntrustedData` (`src/GameCult.Mesh/CultMeshProviderSessionWire.cs:231`, `src/GameCult.Networking/CultNetSchemaMessageSerialization.cs:15`, `src/GameCult.Networking/MessageSerialization.cs:8`). +- TypeScript: `@msgpack/msgpack ^3.1.3` (`packages/cultcache-ts/package.json`); decoder iterative with no depth option (section E); encode passes `maxDepth: MAX_PAYLOAD_DEPTH * 2` (`src/document-formatter.ts:21`); `checkPayloadDepth` iterative. node_modules not present, so the installed version was not read. +- Python: `msgpack>=1.0` (`packages/cultcache-py/pyproject.toml`); `documents.py:135` and `stores.py:97,384` call `msgpack.unpackb(..., raw=False)`; the C extension has an explicit 1024 stack, so 256-bounded payloads fit; the pure-Python fallback is recursive. +- Whether a typed (class-mapped) TS/Py/C# decode layer above these raw decoders recurses per type was not inspected in this pass. diff --git a/docs/research/device-capture-runners.md b/docs/research/device-capture-runners.md new file mode 100644 index 00000000..34ebe808 --- /dev/null +++ b/docs/research/device-capture-runners.md @@ -0,0 +1,103 @@ +# Device capture runners: how established projects capture real-GPU results, and what a browser driver can silently get wrong + +For `cultmath-tapes:question:device-run-driver` (campaign `cultmath-tapes`) and follow-up `cultmath-tapes:follow_up:glsl-browser-parity-run`. +Gathered by eyes-ag3-device-driver, session self-2026-10-15-ag3, 2026-10-16. Facts only; no recommendation. + +Strength marks: [src] read from a primary source text this pass; [doc] vendor or standards documentation read this pass; [web] search-result or fetch-summary of a page (a small model summarised it; check before quoting); [abs] searched, not found. +Chromium doc pages were read at `main` or at an old pinned revision as noted; Chromium GPU bot details drift, so the dates matter. + +## 0. What the question asks (the record) + +- [src] Question `device-run-driver` (Imagination, 2026-10-16): a static page (`packages/cultmath/tools/device-runner`) compiles each family's call against `CultMath.glsl`, reads back through an RGBA32UI target, emits raw bits; C# judges. Options: `committed-captures` (page + stdlib Python server, any WebGL2 browser is a driver, captures committed with renderer, revision, shader sha, args hash, result bits, judged by `DeviceCaptureTests` on Linux), `playwright-live` (Microsoft.Playwright test dependency, Windows-only, ANGLE D3D11, must refuse SwiftShader), `both`. +- [src] Prior precedent named in the question: three Soul/Hands passes through the desktop app's built-in browser on Starfire, renderer `ANGLE (NVIDIA GeForce GTX 1070 Direct3D11)`. +- [src] Follow-up `glsl-browser-parity-run` records both GLSL files probed on a GTX 1070 (phacelle within 3.1e-6 of max(|v|,1), frustum check 0/256). + +## 1. How established projects capture real-GPU results for CI + +| Project | What runs where | What is stored, and where | What identifies the device | Source | +|---|---|---|---|---| +| Khronos WebGL conformance suite | Static HTML pages. Open `webgl-conformance-tests.html` in the browser under test (`?run=1` auto-starts), then "display text summary". Run by hand in any browser. | Formal results go as a pull request to the `KhronosGroup/WebGLConformanceSubmissions` repo. Older README copies said email `webgl_conformance_submissions@khronos.org`. Only WebGL implementors submit. | README instruction: "Verify that the User Agent and WebGL renderer strings identify your browser and target correctly." The summary text carries them. | [src] raw.githubusercontent.com/KhronosGroup/WebGL/main/sdk/tests/README.md (read 2026-10-16); [web] search summary of CONFORMANCE_RULES.txt | +| Khronos WebGL conformance rules | Results carry forward: "results submitted for an earlier version of the browser carry forward to later versions ... that do not cause any previously passing test to fail"; for OS versions likewise (a new OS version needs a new submission). | The carry-forward rule is the only staleness rule found. | | [web] search summary of CONFORMANCE_RULES.txt, not read in full | +| Vulkan CTS conformance submission | Run on the vendor's driver builds, every fraction. | Submission package must contain full `TestResults.qpa` logs per driver build and fraction, `git status` and `git log --first-parent ^..HEAD` output of a clean CTS checkout, `git format-patch` output of any CTS changes over the release tag, and a statement file with a `CONFORM_VERSION` line carrying the CTS git tag, plus PRODUCT, CPU, OS. `verify_submission.py` checks the package against the current mustpass list. | PRODUCT/CPU/OS lines in the statement. | [web] search summaries of `external/vulkancts/README.md` in Fuchsia/Android/Chromium mirrors (mirror copies differ by version) | +| Chromium GPU bots | Physical machines in Swarming; most tests via Telemetry launching the full browser; `webgl_conformance_tests` and pixel tests. `chromium.gpu.fyi` tests top-of-tree ANGLE. | Expected outcomes in per-test expectation files (`pixel_expectations.txt` under `content/test/gpu/gpu_tests/test_expectations/`, `Failure` entries). Pixel images are not in the repo (Skia Gold, below). Some pixel tests check only a few pixels with handwritten code so one check serves all vendors. | Swarming task dimensions: `gpu` = PCI vendor:device-driver version (example `10de:2184-440.100`), plus `os`, `cpu`, `pool`. The page does not describe a runtime renderer-string check. | [src] chromium.googlesource.com/chromium/src/+/main/docs/gpu/gpu_testing.md (read 2026-10-16) | +| Skia Gold (Chromium pixel tests) | goldctl client sends the produced image, the test name and hardware/software config metadata to a service. | Approved images live in a service (storage bucket + triage UI), not git. A test passes if the hash of the produced image is in that test's approved-hash list; default exact matching, multiple baselines per test. An unknown hash fails until a human triages it. Doc says local runs "differ slightly from bot images" and uploads need allow-listing; `--local-pixel-tests` disables upload. | Config metadata uploaded with each image. | [web] search summary of `docs/gpu/gpu_pixel_testing_with_gold.md` (pinned old revisions); [src] gpu_testing.md for the local-run flags | +| WebGPU CTS in Chromium | gpuweb/cts compiled to JS, run through WPT and Telemetry; Telemetry covers non-virtual devices with real GPUs. A pinned revision is auto-rolled. | Expectations per platform: Fail/Skip may be any CTS query; Slow/Crash/Timeout must list parameters in loader order. | | [web] search summaries of Chromium `web_tests/webgpu/README.md` and a 2022 W3C public-gpu post by Kai Ninomiya (not read in full) | +| Dawn node runner | `dawn.node` binding runs the CTS without a browser; `run-cts` can instead drive a Chrome instance. | `--output ` writes a results file, `--expect ` diffs a later run against it. Dawn keeps `webgpu-cts/expectations.txt`, pruned when tests start passing, with wide `Failure` wildcards for flaky ones. | | [web] search summaries of Dawn `src/dawn/node/README.md` and commit `f78edf56` ("Expand CTS expectations for Win11 QC CI bot") | +| three.js | `test/e2e/puppeteer.js` screenshots almost all examples and compares to stored references; helpers `deterministic-injection.js`, `clean-page.js`, `check-coverage.js` exist in an older release's `test/e2e`. | Reference screenshots in the repo. | A 2020 issue: screenshots were black on macOS with the GPU-path flags; a maintainer floated using SwiftShader everywhere "to avoid GPU-specific bugs". Current flags and CI setup not confirmed. | [web] search summaries of discourse.threejs.org and a lightrun mirror of the GitHub issue; [abs] current `puppeteer.js` flags not read | +| Babylon.js / Babylon Native | Visualization tests list scenes in `tests/test/visualization/config.json` (Babylon Native: `Apps\ValidationTests\Scripts\config.json`); each entry names a reference image, optional per-scene pixel-difference threshold. | Reference images in `ReferenceImages/` in the repo; `-u` regenerates. Babylon Native CI fails on too-different images and stores rendered/error images as an artifact. | | [web] search summaries of forum.babylonjs.com and a Babylon Native `ContinuousIntegration.md` fork; [abs] an `errorRatio` key was not found | +| glslang / SPIRV-Cross | No GPU. SPIRV-Cross round-trips `shaders/` through glslangValidator/spirv-as and SPIRV-Cross, diffs output text against committed `reference/` files; `test_shaders.py` exits non-zero on difference, `--update` regenerates references that then ride in the PR; says to use the right glslang and SPIRV-Tools versions. Only hardware option: `--malisc` static cycle counts. | Reference text in the repo. | | [src] raw.githubusercontent.com/KhronosGroup/SPIRV-Cross/main/README.md (read 2026-10-16); [abs] glslang's own test practice not read | +| dEQP GLES3 builtin precision tests | Random inputs through built-ins in a shader; outputs via transform feedback or framebuffer pixel; compared to a reference interval, not a single value. | Spec text of tolerances (section 4). | | [src] doc/testspecs/GLES3/functional.shaders.builtin_functions.precision.txt (Fuchsia mirror, read 2026-10-16) | + +Observations across the rows (no ranking): +- [src/web] Where real-GPU outputs are exact or large, the approved results are stored outside a source repo (Gold, Swarming expectations) or as submission packages (WebGL, Vulkan CTS). Where outputs are text from a deterministic tool (SPIRV-Cross) the reference is committed beside the source and `--update` regenerates it. +- [web] Only the Vulkan CTS submission package was found to record the exact source revision (tag plus `git log`) inside the result bundle; WebGL's rule is the carry-forward rule above. No project was found that refuses a committed capture automatically because a shader source hash changed. [abs] +- [src] Chromium's GPU doc keys a bot's hardware by PCI id and driver version rather than by a renderer string read inside the page. + +## 2. Headless browser drivers on real GPUs + +### 2.1 Fallback to a software renderer + +- [src] Chromium SwiftShader doc (read at `refs/heads/main`): flags `--use-gl=angle --use-angle=swiftshader` (SwANGLE as the ES driver); `--use-gl=angle --use-angle=swiftshader-webgl --enable-unsafe-swiftshader` (WebGL fallback). "Automatic fallback to SwiftShader-backed WebGL is deprecated ... WebGL context creation will soon fail instead of falling back." `--enable-unsafe-swiftshader` opts in and suppresses the console warning. The page does not describe how to verify the renderer. +- [web] Blink-dev "Intent to Remove: SwiftShader Fallback": deprecation period began Chrome 130; estimated desktop ship Chrome 137; a later reply from Rick Byers says API owners consider it high-risk and may phase it, so the milestone was unconfirmed in the thread; Finch feature `AllowSwiftShaderFallback`; headless SwiftShader use "will still be supported by opting in"; desktop only. Sources disagree on the shipped milestone (a Winaero Chrome 137 write-up says WARP replaces it on Windows, which the blink-dev page does not mention; Samsung's browser policy page says M139). Not resolved. [web] +- [src] Chrome developer blog "Supercharge Web AI model testing": "By default, Headless Chrome disables GPU." `chrome://gpu` showed "Software only, hardware acceleration unavailable" until drivers were fixed; "Some combinations of flags allow detection of the GPU, but don't allow you to actually use the GPU." Failing renderer string: `ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver-5.0.0)`; working: `ANGLE (NVIDIA Corporation, Tesla T4/PCIe/SSE2, OpenGL ES 3.2 NVIDIA 525.105.17)`. Linux flags there: `--headless=new --use-angle=vulkan --enable-features=Vulkan --disable-vulkan-surface --enable-unsafe-webgpu`. Setup was Colab, not CI. +- [web] A Playwright-on-GPU-runner write-up (createit.com) reported renderer ANGLE-on-Vulkan with SwiftShader; headed Chromium under a virtual display used the GPU; a Vulkan flag set later gave `llvmpipe`, still software. +- [src] Chromium GPU testing doc: example bot flags `--use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu`, passed via `--extra-browser-args`. +- [src] Playwright `chromiumSwitches.ts` at `main` (read 2026-10-16) contains no GPU, SwiftShader, ANGLE or headless switch. [abs] What the downloaded headless shell binary itself defaults to was not found. +- [abs] No source was found on `--use-angle=d3d11` combined with headless Playwright on Windows, and none on the renderer string a Windows GPU reports under headless. +- [web] `--disable-gpu` is reported by one source to force software rendering. + +### 2.2 Detecting a fallback from inside the page + +- [doc] `WEBGL_debug_renderer_info` exposes `UNMASKED_RENDERER_WEBGL` through `gl.getExtension(...)` then `gl.getParameter(...)`; MDN says it may be limited to privileged contexts depending on privacy settings, and Firefox disables it when `privacy.resistFingerprinting` is true, so `getExtension` can return null (MDN, via search result). +- [doc] `failIfMajorPerformanceCaveat: true` makes `getContext` return null if the browser would use a dramatically slow implementation (MDN, via search result). [web, unconfirmed here] whether Chrome treats SwiftShader as such a caveat was not found in a source this pass. +- [src] Strings observed in sources: SwiftShader `ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) ...))` and `Google SwiftShader`; hardware `ANGLE (NVIDIA ..., Direct3D11)` form as in the question's precedent. +- [src] Chromium's own bots do not read a string; they identify hardware by Swarming dimensions (section 1). +- [web] `WebGLShaderPrecisionFormat` from `getShaderPrecisionFormat(FRAGMENT_SHADER, HIGH_FLOAT)`: `precision` 23 means real highp float; it reports mantissa bits, nothing about subnormal handling; Safari mis-reported it as of April 2020 (WebKit bug via webglfundamentals). +- [web] A sample WebGL report line: `ANGLE (Intel(R) HD Graphics 4600 Direct3D11 vs_5_0 ps_5_0)`, highp/highp, precision 23. + +### 2.3 Windows service and session 0 + +- [web] Microsoft XPDM-vs-WDDM table: on WDDM, Session 0 isolation means a Direct3D 9 HAL device is never available from a service (NULLREF, HAL, REF "No"; WARP10 "Yes"). +- [web] Microsoft support article 978635: starting with Windows 8.1 / Server 2012 R2, Direct3D 11 supports use from a Windows service. WARP is recommended by Microsoft for service/server environments. +- [web] VTK issue 18657 (GitLab): swap-chain creation failed on Windows CI runners because the process ran in Session 0, which has no graphics hardware access; runners were moved from system services to scheduled tasks. +- [abs] No source found on headless Chrome or ANGLE behaviour specifically inside a service. The pattern the sources support is an interactive user session or a scheduled task that runs only when the user is logged on. + +## 3. Committed-capture designs: versioning against source hashes and refusing stale captures + +- [src] SPIRV-Cross: references are text regenerated by the tool; staleness is detected by re-running the tool and diffing, not by a stored hash. The tool versions (glslang, SPIRV-Tools) are named in the README as the ones to use. +- [web] Skia Gold: the approved set is keyed by test name plus image hash; an unknown hash fails until triaged. Config metadata is uploaded with the image. No source-revision binding was found. +- [web] Vulkan CTS: the result package carries the CTS tag, `git log` and patches; a checker script validates the package against the mustpass list for the version. +- [web] WebGL: carry-forward rule (earlier passing results hold for later browser versions that fail no previously passing test). +- [web] Babylon / three.js: reference image names live in a config list; regeneration is a flag (`-u`); a missing reference is an error (a 404 in a Karma run, Babylon forum). +- [src] Chromium expectation files: per-test `Failure` entries are removed once a test passes (gpu_testing.md); Dawn prunes `expectations.txt` the same way. +- [abs] No project was found whose committed device capture embeds a hash of the shader source it ran and is rejected by CI when that hash no longer matches the checked-in source. (Search was for the pattern, not an exhaustive survey of repositories.) + +## 4. Float behaviour that bears on judging captures across ANGLE/D3D11, native GL and mobile GPUs + +### 4.1 What the standards guarantee + +- [doc] Qualifiers are minimums. highp float "is at least a 32 bit value", range about +-2^62 in the WebGL2Fundamentals table (exponents stripped in extraction, inferred); mediump at least 16 bit, range +-2^14, relative precision 2^-10; lowp at least 9 bit, range +-2 (webgl2fundamentals precision lesson; asawicki.info April 2015 for the 2^-10 and 2^-8 figures). On a desktop GPU mediump "will still most likely use 32bits internally"; the lesson's author's Pixel 2 XL used 16 bit for mediump and lowp. +- [doc] Highp in fragment shaders is optional in OpenGL ES 2.0 (a shader declaring it fails to compile where unsupported). [web] GL_ARB_shader_precision text: internal processing need not match IEEE 754; rounding mode cannot be set and is undefined; "any denormalized value input into a shader or potentially generated by an operation in a shader can be flushed to 0." +- [src] dEQP GLES3 precision spec tolerances (ULP unless noted): `+ - *` under 1 ULP; `/` 2.5 ULP for 2^-126 <= |y| <= 2^127-1; sin/cos 2^-11 abs on [-pi, pi]; asin/acos 4; atan2 6; atan 5; exp 3+2|x| highp; inversesqrt 2; log 3 ULP highp outside the central range; exact (0 ULP) abs, sign, floor, trunc, roundEven, ceil, min, max, clamp, step; derived functions (tan, pow, sqrt, mix, smoothstep, fract, mod ...) judged by their expansions. The page does not mention flush to zero. Lowp and mediump results on overflow "must produce an infinity or the max/min value". +- [web] Olli Etuaho on the WebGL list, 14 Nov 2014: proposes testing only at the spec minimums, with subnormals flushed to zero, since code that works there will likely work with more bits; concedes not simulating built-in internals is a gap. + +### 4.2 Direct3D 11 (the ANGLE/D3D11 path) + +- [doc] Microsoft Learn "Floating-point rules (Direct3D 11)" (updated 2025-04-15), 32-bit rules: "Denorms are flushed to sign-preserved zero on input and output of any floating-point mathematical operation" (exceptions: I/O or data movement that does not manipulate the data). Add/sub/mul within 0.5 ULP, and the page says hardware may truncate; sqrt and rcp 1 ULP; rcp and rsq have a separate relaxed requirement; "Fused operations (such as mad, dp3) produce results that are no less accurate than the worst possible serial ordering of evaluation of the unfused expansion", each unfused step allowed 1 ULP (D3D10 page: 1 ULP for mul/div). NaN bit patterns are not preserved. min/max flush denorms for comparison but the result "may or may not be denorm flushed". Doubles preserve denorms; 16-bit floats preserve denorms. +- [abs] No source found that states how ANGLE's D3D11 translation, fxc/dxc flags, or NVIDIA's D3D11 driver treat denormals or contraction beyond the D3D rules above. +- [web] ANGLE's `FeaturesD3D.h` workaround list contains HLSL-compiler-specific rewrites (for example expanding `pow` into multiplies on an affected compiler, per search summary); a Wine D3D11 trig test failed on one NVIDIA configuration with roughly 0.1% relative error, not on AMD (Wine bug thread, cause not identified). +- [web] ANGLE D3D11 vs D3D9 rendering differences are reported in Mozilla bug 1122912 (unresolved in the excerpt). + +### 4.3 Mobile and other native GPUs + +- [web] ARM blog "Benchmarking floating point precision in mobile GPUs, Part III": Vivante GC4000 and Imagination SGX 554 "do not support subnormal values" (below 2^-126 treated as zero); Mali-T604 supports subnormals, and the authors say Mali Midgard is the only mobile family they know to; the measuring shader divides by 2 per exponent step and multiplies back, drawing underflow pixels red. No ULP measurements in that part; Part II (not read) is said to find GPUs taking "the easy (round-to-zero) way out". +- [web] asawicki.info: `length`, `normalize`, `distance` and dot products in a `mediump` shader can overflow at (74,74,74) because 3*74^2 = 16428 exceeds 2^14; a GPU may pass because it uses more precision than required. +- [abs] No source read this pass on Adreno, Apple, current Mali or PowerVR denormal and contraction behaviour; the ARM post covers 2013-era parts. +- [abs] FMA contraction in GLSL: no WebGL or GLSL ES source was read here on whether `a*b+c` may be fused (see `docs/research/cycles-fma-contraction.md` for the Cycles CPU case and the D3D "mad" fused-op tolerance above). + +## 5. Gaps left by this pass + +- Current three.js `test/e2e/puppeteer.js` flags and Babylon `config.json` tolerance keys were not read from the repositories (search summaries only). +- Gold, WebGPU CTS and Dawn node pages are search summaries, not full reads. +- Whether Chrome's shipped (not 130-era) behaviour fails WebGL context creation when no GPU is usable, versus using WARP on Windows, is unresolved between the sources in section 2.1. +- Nothing here was measured on Starfire; no run of any driver was made. diff --git a/docs/research/element-id-header-flags.md b/docs/research/element-id-header-flags.md new file mode 100644 index 00000000..30016c3d --- /dev/null +++ b/docs/research/element-id-header-flags.md @@ -0,0 +1,49 @@ +# Prior art: a header flag one writer sets and content another writer cannot see + +Serves: `variants:question:non-csharp-writers-mark-ids` (raised in +`variants:follow_up:foreign-ids-under-v1-header`, campaign `variants`). Gathered by +Imagination, session self-2026-10-14b-eureka, 2026-10-14. Facts with pointers; the +recommendation lives in the question, not here. + +The CultLib case: the store header (`cultcache.store.v1` / `v3`) says whether any record +holds an element id, so a reader older than ids refuses the store instead of rewriting +elements without them. An element id is an ordinary keyed string in the payload, so a +runtime that does not know which member is the id (cultcache-py, -ts, -rs today) cannot +tell from content whether to mark. The persistence contract +(`src/GameCult.Caching/Contracts/cultcache-persistence-format.md:424-427` at 6afa8ed9) +says those runtimes keep a `v3` header they found and do not decide. + +## How established formats split the job + +| System | Who sets the flag | What an implementation that does not understand the feature does | Pointer | +|---|---|---|---| +| ext4 superblock | The code that first uses a feature sets its bit in `s_feature_compat`, `_ro_compat` or `_incompat`. | Unknown `incompat` bit: refuse to mount (fsck stops too). Unknown `ro_compat` bit: mount read-only, never write. Unknown `compat` bit: read and write freely; fsck should not modify. | https://www.kernel.org/doc/html/latest/filesystems/ext4/super.html (feature fields) | +| SQLite file header | The writer's journal mode sets the write/read version bytes (offsets 18, 19); the schema format number (offset 44) is set by the writer of the newer schema features. | Read version 1-2 with write version > 2: open read-only. Read version > 2: neither read nor write. | https://www.sqlite.org/fileformat.html section 1.3.3, 1.3.10 | +| git repository format | A repository declares `core.repositoryformatversion = 1` and the `extensions.*` it uses; the tool enabling a feature writes its extension key. | Any unimplemented `extensions.*` key in a v1 repo: the operation must not proceed (read or write). | https://git-scm.com/docs/repository-version | +| Protocol Buffers | No flag. New fields are self-delimited by tag. | Parsers keep unknown fields and write them back (proto2 always; proto3 again since 3.5), so an old reader does not drop a newer writer's data on rewrite. | https://protobuf.dev/programming-guides/proto3/#unknowns | +| Avro container files | The writer embeds its full schema in the file header. | Reader resolves writer schema against its own; a writer field the reader lacks is ignored, so it is lost if the reader rewrites. | https://avro.apache.org/docs/current/specification/ ("Schema Resolution") | +| Parquet | Writer stamps `created_by` (application and version) in FileMetaData. | Readers keep a list of known-bad writer versions and distrust their metadata (parquet-mr ignores min/max statistics from writers before 1.8.0, PARQUET-251). | https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift (`created_by`); https://issues.apache.org/jira/browse/PARQUET-251 | + +## Patterns, as facts + +- Flag-based formats (ext4, SQLite, git) put the duty to set the flag on the writer that + introduces the content. None of them has a writer that carries feature content while + not knowing it is that feature: an implementation that does not understand a feature + either does not write (ro_compat, SQLite read-only) or does not touch the store (git). +- Formats without a flag (protobuf, Avro) handle the older reader by preservation + (protobuf keeps unknown fields) or accept loss (Avro drops unknown writer fields on + rewrite). CultCache's C# 1.x readers skip unknown keyed slots and do not preserve + them, which is why the `v3` header exists. +- Parquet's `created_by` is a third option: readers judge content by who wrote it and + compensate for writers known to get a flag or statistic wrong. +- No system surveyed asks a reader to infer a feature flag from content it cannot + recognise; where content cannot be recognised, the burden is on writers. + +## Mechanism facts from this pass (probes at 6afa8ed9 on Yggdrasil) + +- A C# cache that pulls the Python-written `py-store/leaf-record.cc` (v1, element ids + `000000000021/22`) holds that record with `HoldsIds = true`, `IdsInMemoryOnly = false`; + a C# write that adds an unrelated record copies it forward and leaves the header `v1`. + The ids survive in C#; a pre-id reader with a type lacking the id slot would drop them. +- cultcache-py, -ts and -rs read `v3` and keep it on rewrite; none has a declaration of + which member is an element id. diff --git a/docs/research/foreign-records-prior-art.md b/docs/research/foreign-records-prior-art.md new file mode 100644 index 00000000..4238bb6e --- /dev/null +++ b/docs/research/foreign-records-prior-art.md @@ -0,0 +1,462 @@ +# Foreign Records: Prior Art Survey + +Facts file for the single-file "foreign records" fork (lay-back versus refusing +whole-view writes while holding records the writer does not own). Eyes pass, +2026-10-02. Facts and evidence pointers only; no recommendation. + +Verification marks: + +- **[fetched]** the claim was read on the cited page during this pass. +- **[search]** the claim came from a search-result summary of the cited page, + not a full read. +- **[memory]** recalled from the cited source, not re-read in this pass. + Treat it as unverified. + +## 0. Our design, for comparison + +Source: `src/GameCult.Caching/Contracts/cultcache-persistence-format.md` (main, 614fd445). + +- Store is `[header, catalog, records]`; the catalog "must embed a catalog entry + for every schema referenced by the records it contains" (Embedded Schema Catalog). +- The stated purpose of the catalog is to let another implementation "decide + whether it can: read directly, soft-migrate with warnings, or refuse the data + honestly". +- Soft migration lists "persisted schema has extra slots the local reader can + safely ignore or preserve" and the warning "field preserved but not surfaced + natively". That is slot-level preservation inside a record the reader owns. The + contract does not mention records under schema ids the reader does not own; + the lay-back ruling lives elsewhere (grep of `src/**/*.md` for "foreign" or + "lay-back" found nothing). +- Concurrency: "A plain flush and an unconditional commit are last-writer-wins + ... a single file is replaced by the writer's whole view." "Conditional commit + is the only safe multi-process write." C# and Rust implement conditional + commit; TypeScript and Python do not yet (Transaction Visibility). + +Granularity note used throughout: most systems below handle unknown *fields +inside a record whose type the writer knows*. Our fork is about unknown *whole +records* (schema ids) inside a container the writer rewrites. Each entry says +which granularity it covers. + +## 1. Serialization formats + +### 1.1 Protocol Buffers: unknown-field preservation + +- **What it does.** Unknown fields are "well-formed protocol buffer serialized + data representing fields that the parser does not recognize". Proto3 messages + "preserve unknown fields and include them during parsing and in the serialized + output, which matches proto2 behavior." [fetched] https://protobuf.dev/programming-guides/proto3/ (Unknown Fields) +- **Where preservation fails, per the docs.** Serializing to JSON; iterating + fields to populate a new message. Mitigation given: use binary, use + `CopyFrom()`/`MergeFrom()`. TextFormat prints unknown fields by number but + cannot parse them back. [fetched] same page. +- **History.** Proto3 shipped dropping unknown fields. v3.5.0 release notes: + "Unknown fields are now preserved in proto3 for most of the language + implementations for proto3 by default." C++ and Python offer + `DiscardUnknownFields()`, Java a `DiscardUnknownFieldsParser`, for callers who + relied on dropping. The release notes give no rationale. [fetched] + https://github.com/protocolbuffers/protobuf/releases/tag/v3.5.0 +- **Why it was restored.** No official rationale document was found. The + user-facing request is issue #272 (2015-04-07): "I know that unknown fields + have been removed from proto3, but I am trying to get an explanation about why + this change was made". The thread body was not readable in this pass. [fetched, + partial] https://github.com/protocolbuffers/protobuf/issues/272. Secondary + accounts attribute the reversal to pass-through and read-modify-write + intermediaries in uncoordinated upgrades. [search] + https://github.com/scalapb/ScalaPB/issues/406, https://kmcd.dev/posts/protobuf-unknown-fields/. + **The primary reasoning is unverified.** +- **Cost and regret.** Go: preservation through `XXX_unrecognized []byte` + broke users who compared proto3 messages with `==` or used them as map keys. + [search] https://groups.google.com/d/msg/golang-nuts/F5xFHTfwRnY/sPv5nTVXBQAJ. + JSON round trips still drop unknown fields; there is an open request to keep + them. [search] https://github.com/golang/protobuf/issues/1390. A secondary + source flags preserved unknown fields as a way to smuggle unvalidated payloads + past validation at trust boundaries. [fetched] https://kmcd.dev/posts/protobuf-unknown-fields/ +- **Granularity.** Field level, inside a message the reader's code knows. + Protobuf does not preserve unknown *message types*; the closest is + `google.protobuf.Any` (type URL plus bytes), which carries an opaque typed + payload as a declared field. [memory] +- **Differs from us.** There is no in-band schema. Unknown bytes are + uninterpretable without the newer `.proto`, and only tag and wire type are + self-describing. There is no container rewrite or multi-process store + concern; protobuf is a message codec. + +### 1.2 Protobuf field-number reuse + +- **Rule.** "Field numbers should never be reused. Never take a field number out + of the reserved list for reuse with a new field definition." Listed + consequences: "Developer time lost to debugging, A parse/merge error (best case + scenario), Leaked PII/SPII, Data corruption." Syntax: `reserved 2, 15, 9 to 11;` + and `reserved "foo", "bar";`. [fetched] https://protobuf.dev/programming-guides/proto3/ +- Best practices: "Never re-use a tag number. It messes up deserialization." + Reserve deleted numbers. "Almost never change the type of a field." Renaming + breaks JSON and text format because they key on names. [fetched] + https://protobuf.dev/best-practices/dos-donts/ +- Kleppmann (2012): "you must never reuse the tag number for another field in + future, because you may still have data stored that uses that tag for the field + you deleted". [fetched] https://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html +- **Named public incidents:** none found in this pass. The docs' consequence + list is the strongest primary evidence; blog posts repeat it. **Unverified.** +- **Differs from us.** Our `schemaId` is a content hash of the canonical slot + schema, so changing slot meaning changes the id. The reuse hazard moves from + "number collides" to "a record under an old id is carried, or reinterpreted, + after an undeclared rename". + +### 1.3 Avro and schema registries + +- **Resolution.** The reader needs the writer's schema. Fields in the writer + schema but not the reader's are ignored. Reader fields missing from the writer + take the reader default, or raise an error when there is no default. Aliases + map renames. [fetched] https://avro.apache.org/docs/1.11.1/specification/ (Schema Resolution) +- **Object Container Files** carry the schema once in the header (`avro.schema`, + required). One file has one writer schema. [fetched] same page. +- **Kleppmann (2012):** Avro needs "the exact same version of the schema as the + writer of the data", so you either "annotate each record with its schema + version" or use "a schema registry". [fetched] blog above. +- **Confluent wire format:** byte 0 is the magic byte (0), bytes 1 to 4 are the + big-endian schema id; the deserializer fetches the writer schema by id. + [fetched] https://docs.confluent.io/platform/current/schema-registry/fundamentals/serdes-develop/index.html +- **Compatibility modes:** BACKWARD (the default), FORWARD, FULL, their + `_TRANSITIVE` forms, and NONE. BACKWARD is the default "so that you can rewind + consumers to the beginning of the topic". Upgrade order follows the mode: + consumers first for BACKWARD, producers first for FORWARD. [fetched] + https://docs.confluent.io/platform/current/schema-registry/fundamentals/schema-evolution.html +- **Failure mode.** Resolution projects writer data onto the reader schema, so + writer-only fields are gone from the decoded object. A read-modify-write by an + older reader loses them unless the application keeps the writer record. + [inference from the spec; no Avro doc states it as a warning] +- **Differs from us.** Kafka records are immutable log entries, so consumers + never rewrite the producer's records. A container file is written once by one + writer. Neither case has whole-file rewrite by several processes. + +### 1.4 Thrift + +- Generated readers switch on field id and call + `TProtocolUtil.skip(iprot, schemeField.type)` in the default case: unknown + fields are skipped. [search; generated-code pattern] Kleppmann (2012) says the + same of protobuf and Thrift: the parser "can figure out how many bytes it needs + to skip". [fetched] +- **Conflict.** "Thrift: The Missing Guide" says unknown fields "are not + discarded, and if the message is later serialized, the unknown fields are + serialized along with it". That text reads as copied from protobuf docs. + [fetched] https://diwakergupta.github.io/thrift-missing-guide/. Apache Thrift's + generated Java skips without retaining. **Retention is unverified and likely + false for stock Apache Thrift.** +- Rules: never change numeric tags; new fields optional; prefix removed fields + `OBSOLETE_`. [fetched] Missing Guide. + +### 1.5 Cap'n Proto + +- Field ordinals are append-only: "as long as each new member's number is larger + than all previous members"; "You cannot change a field, method, or enumerant's + number." [fetched] https://capnproto.org/language.html +- Unknown fields survive a copy: "If you copy the struct from one message to + another (e.g. by calling a set() method on a parent object), the extra fields + will be preserved." Caveat: "copying a struct value from another message into + an element of a list will truncate the value". [fetched] https://capnproto.org/cxx.html +- The wire format carries just enough structure (struct or list, sizes) to copy + an object recursively without its schema. [search] + https://capnproto.org/encoding.html. Preservation is a property of the encoding, + not of a per-type rule. +- **Differs from us.** The copy is opaque; nothing is reinterpreted. There is no + catalog and no store. + +### 1.6 FlatBuffers + +- Add new fields at the end; never remove one, mark it `deprecated` instead (no + accessors are generated); explicit `id` attributes relax ordering. Old readers + ignore unknown fields. [search] https://flatbuffers.dev/evolution/ +- The object API (unpack, mutate, pack) builds a fresh buffer from native + fields. Whether unknown fields survive that round trip: **not verified in + this pass** [memory: they do not]. +- Known defect: C++ object API with deprecated fields generated non-compiling + code. [search] https://github.com/google/flatbuffers/issues/5186 + +### 1.7 Microsoft Bond + +- `bonded` defers deserialization and holds a reference to the serialized + form. "Using bonded allows the intermediary to aggregate responses, + preserving their full content, even though schema of Response is not known + when the aggregator is built." Transcoding through a bonded value preserves + fields not in `T`. [fetched] https://microsoft.github.io/bond/manual/bond_cpp.html +- Untagged protocols (Simple Binary) "serialize only data and thus require that + consumers know the payload schema via some out-of-band mechanism"; Bond also + has runtime schemas (`SchemaDef`) for that. [fetched; SchemaDef from memory] +- Changing ordinals is a breaking change. [fetched] +- **Note.** Bond's preservation is an explicit opt-in wrapper type at the + declared pass-through point, not default retention of everything. + +### 1.8 MessagePack-based schema systems + +- MessagePack itself has no schema. MessagePack-CSharp (`[Key(n)]` int keys, the + basis of our slot layout) has no documented unknown-key or extension-data + retention for typed objects. A search found no such feature and no issue + requesting it. **Unverified absence.** + https://github.com/MessagePack-CSharp/MessagePack-CSharp +- Comparable opt-in field-level retention in other ecosystems: + Newtonsoft.Json and System.Text.Json `[JsonExtensionData]` capture unmapped + properties into a dictionary and write them back; serde `#[serde(flatten)]` into + a map does the same, and is incompatible with `deny_unknown_fields`. [search] + https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/migrate-from-newtonsoft, + https://serde.rs/attr-flatten.html. All are field level and opt in per type. +- **FIDL (Fuchsia), RFC-0033:** messages with unknown fields "MUST be validated + and parsed successfully"; the default is `flexible` (unknown values allowed and + exposed), and the `strict` keyword makes unknown fields invalid. Unknown + handles must be closed by default. The RFC frames strictness as a security tool + for protocols where misinterpreting new data is dangerous. [fetched] + https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0033_handling_unknown_fields_strictness + +## 2. Embedded stores and document databases + +### 2.1 SQLite + +- **Unknown tables.** The writer modifies pages through the B-tree and rollback + or WAL journal. Tables a program never touches are never rewritten, so there is + no rule about them. [memory; consistent with the file format doc] +- **Unknown schema syntax.** A library older than 3.31.0 opening a schema with + generated columns "will perceive the generated column syntax as an error and + will report that the database schema is corrupt". Older versions can read and + write newer files "as long as the database schema does not contain features + ... not understood by the earlier version". [search] https://sqlite.org/gencol.html. + The whole database is refused, not just the table. +- **File format versions.** Write version > 2: "the database file must be treated + as read-only". Read version > 2: "that database cannot be read or written". + [fetched] https://www.sqlite.org/fileformat2.html (offsets 18 and 19). This is + a format-level read-only fallback for content the library cannot safely write. +- **Schema change across connections.** The schema cookie (offset 40) is bumped + on every schema change. A prepared statement checks it and reprepares or fails + with `SQLITE_SCHEMA`. [fetched] same page. +- `user_version` (offset 60) and `application_id` (offset 68) are application + owned; SQLite does not use them. [fetched] +- **Whole-file rewrite.** SQLite's own comparison: custom and wrapped + pile-of-files formats "usually require a rewrite of the entire document in + order to change a single byte", and application concurrency logic for them is + "a notorious bug-magnet". [fetched] https://www.sqlite.org/appfileformat.html +- **Differs from us.** The schema is SQL text in `sqlite_schema`, not a typed + slot catalog. Writes are partial and in place, and there is one implementation + rather than five. + +### 2.2 LMDB + +- Opaque byte keys and values, no schema; named sub-databases. Copy-on-write + B+tree with MVCC. One writer at a time, serialized by a mutex in the lock file; + readers do not block the writer and the writer does not block readers; + several processes may open one environment. [search; lmdb.tech/doc was not + reachable over TLS in this pass] https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database, + https://lmdb.readthedocs.io/ +- `MDB_INCOMPATIBLE`: an operation does not match a database's flags (for + example dupsort), or "the database type changed". [search] +- **Differs from us.** There are no types, so "foreign" is not a concept; + untouched keys are never rewritten. + +### 2.3 Core Data (Apple) + +- **Model mismatch is refused.** "The model used to open the store is + incompatible with the one used to create the store" (Cocoa error 134100) + unless a migration runs: lightweight (inferred mapping, using + `NSMigratePersistentStoresAutomaticallyOption` and + `NSInferMappingModelAutomaticallyOption`) or custom/staged. [search] + https://developer.apple.com/forums/thread/100639 +- Store metadata holds per-entity version hashes (`NSStoreModelVersionHashes`). + `isConfiguration(withName:compatibleWithStoreMetadata:)` compares them with + the model. [search] + https://developer.apple.com/documentation/coredata/nsmanagedobjectmodel/isconfiguration(withname:compatiblewithstoremetadata:) +- **Atomic stores (XML, binary) are the closest analogue to our single file.** + They keep the whole object graph in memory and save the whole file: "the old + file is not deleted until the new one has been successfully written." + [fetched] https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/PersistentStoreFeatures.html. + Combined with the refusal above, an atomic store is never rewritten by a model + that does not cover every entity in it. The page says nothing on multi-process + access to atomic stores. [fetched: absence] +- **Differs from us.** Single runtime, entity-hash catalog in metadata, a + migration-or-refuse gate at open. No foreign entity is ever carried. + +### 2.4 Realm + +- Opening with a changed schema requires a higher `schemaVersion`, plus a + `migrationBlock` where needed; otherwise "Migration is required". Added and + removed properties are applied to the on-disk schema automatically on + migration. [search] https://github.com/realm/realm-js/issues/4752, + https://realm.netlify.app/docs/swift/latest/ +- A changelog entry allows opening old frozen versions "with a schema that + contains additional classes, but not additional properties". [search] + https://github.com/realm/realm-core/releases?page=5 +- Whether a Realm opened with a class *subset* keeps the other tables untouched: + **not verified** [memory: the tables are kept, since Realm writes in place by + table and does not rewrite the whole file]. +- Realm file-format upgrades are one-way. [memory] + +### 2.5 CouchDB and PouchDB + +- `PUT /{db}/{docid}` writes a new revision of the whole document; there is no + field merge, and omitted fields are gone in the new revision. A missing or + stale `_rev` returns `409 Conflict`: "specified revision is not latest for + target document". The revision may be given in the body, as `rev`, or in + `If-Match`. [fetched] https://docs.couchdb.org/en/stable/api/document/common.html +- Under replication, conflicting revisions are all kept; one deterministic + winner is chosen and the others are marked `_conflicts`; CouchDB does not merge. + [search] https://docs.couchdb.org/en/stable/replication/conflicts.html +- There is no schema; unknown fields survive only if the client writes them + back. Document-mapper layers drop them: Mongoose's `strict` option "ensures + that values passed to our model constructor that were not specified in our + schema do not get saved to the db", and is "enabled by default". [fetched] + https://mongoosejs.com/docs/guide.html (MongoDB, cited as the same pattern). +- **RxDB** (on PouchDB or other storage): any schema `version` > 0 requires + `migrationStrategies` for each step; a strategy returning `null` deletes the + document; writes during a running migration fail with `COL25`; in multi-tab + setups "exactly one tab is running a migration of a collection". [fetched] + https://rxdb.info/migration-schema.html. Opening storage written by a newer + RxDB major is refused ("Cannot open database state with newer RxDB version"). + [search] https://github.com/pubkey/rxdb/issues/5836 +- **Differs from us.** The per-document `_rev` gives optimistic concurrency at + record granularity, and documents are never rewritten as a side effect of + writing another. + +### 2.6 IndexedDB + +- No field schema: values are structured clones, stored by value. Schema is + object stores and indexes, versioned by an integer. [fetched] https://www.w3.org/TR/IndexedDB/ +- Opening with a higher version fires `upgradeneeded` inside a versionchange + transaction. Opening with a *lower* version than the stored one fails with + `VersionError`: "An attempt was made to open a database using a lower version + than the existing version." Older code is refused outright. [fetched] same spec. +- Other open connections receive `versionchange`; if they stay open the upgrader + gets `blocked`. [fetched] same spec and + https://developer.mozilla.org/en-US/docs/Web/API/IDBOpenDBRequest/blocked_event +- **Differs from us.** The browser engine is the single writer implementation + and the schema has one integer owner per database. + +### 2.7 Whole-file rewrite while preserving unknown content + +Systems found that rewrite a container while keeping parts they do not +understand: + +- **Automerge binary format.** Programs that edit documents must "maintain all + columns, even those that they don't understand the meaning of" and write null + into unknown columns for new rows. Implementations "must preserve operations + containing actions they don't support". Unknown value type codes: "MUST read and + store the type code and `length` bytes". Changes are SHA-256 hashed over their + binary form, so byte preservation is required for hash integrity. [fetched] + https://automerge.org/automerge-binary-format-spec/. The unit carried is an + immutable, content-addressed change; nothing preserved is ever re-decided by + the carrier. +- **Core Data atomic stores** rewrite the whole file but refuse to open under an + incompatible model (2.3), so they never carry unknown entities. +- No system was found that rewrites a whole mutable file while carrying + mutable records of unknown types that other writers may change concurrently. + **Absence of evidence, not a verified negative.** + +## 3. Literature + +- **Kleppmann, *Designing Data-Intensive Applications* (1st ed., O'Reilly 2017), + ch. 4 "Encoding and Evolution", section "Dataflow Through Databases".** [memory, + not re-read] The section says an older version of code may read, update and + write back a record written by newer code, and newer fields can be lost unless + the old code keeps unknown fields. Figure 4-7 shows this. The section contains + the line "data outlives code" [search; confirmed in secondary notes + https://gist.github.com/bcherny/b870a60d1650973df7e400c8603ac76d]. It also says + rewriting data into a new schema is possible but expensive, so most databases + avoid it. **The exact wording is unverified.** +- **Scherzinger, Klettke, Störl, "Managing Schema Evolution in NoSQL Data + Stores", DBPL 2013.** Contrasts eager migration with *lazy* migration (migrate + on read or touch) for schema-less stores whose data grows heterogeneous. + [search] https://arxiv.org/abs/1308.0514 +- **Ringlstetter, Scherzinger, Bissyandé, "Data model evolution using + object-NoSQL mappers: folklore or state-of-the-art?", BIGDSE@ICSE 2016, + pp. 33-36.** Mapper evolution annotations (rename, remove, transform on load) + are used on GitHub, but mostly for tasks other than evolving the data model. + [search] https://dblp.org/rec/conf/icse/RinglstetterSB16.html +- **Scherzinger and Sidortschuck, "An Empirical Study on the Design and Evolution + of NoSQL Database Schemas", ER 2020.** [search, not read] + https://arxiv.org/pdf/2003.00054 +- **Bancilhon and Spyratos, "Update semantics of relational views", ACM TODS + 6(4), 1981, pp. 557-575.** A view update is translated by holding a chosen + *complement* constant; a complete set of view updates has a translator iff it + is translatable under constant complement. [search] + https://dl.acm.org/doi/10.1145/319628.319634. Mapping (this survey's framing, + not the paper's): a writer's owned records are a view of the store, the foreign + records are the complement, and lay-back is constant-complement translation. +- **Foster, Greenwald, Moore, Pierce, Schmitt, "Combinators for bidirectional tree + transformations", POPL 2005 / TOPLAS 2007.** A lens is `get: S -> V` and + `put: V x S -> S`. Laws: GetPut, `put(get(s), s) = s`; PutGet, + `get(put(v, s)) = v`; PutPut is the stronger optional law. `put` takes the + source `s` as an argument, so the complement is restored from whatever `s` is + supplied. [search for the paper; the law statements are from memory, and one + search summary had GetPut and PutGet swapped] + https://www.cis.upenn.edu/~bcpierce/papers/lenses-toplas-final.pdf +- **Litt, van Hardenberg, Henry, "Project Cambria" (Ink & Switch, Oct 2020).** + Bidirectional lenses between schema versions, arranged as a graph. In + Cambria-Automerge every write is tagged with its writer's schema and translated + at read time, so "old changes can be evolved using lenses that didn't even + exist at the time of the original change". Lenses travel inside the document. + Stated limits: lossy conversions (scalar to array), one-way changes + (split/merge), no external lookups, untested performance. "There are limits to + interoperability." [fetched] https://www.inkandswitch.com/cambria/ +- **Local-first and CRDT, Automerge:** see 2.7. Unknown ops, columns and value + types from newer peers are preserved byte for byte and are immutable once + written. [fetched] + +## 4. Concurrency facts for whole-file rewrite + +- **Last-writer-wins on whole replace** loses a concurrent writer's changes + unless the write is conditional. Our contract already says this (section 0). +- **HTTP optimistic concurrency.** RFC 9110 §13.1.1 If-Match exists to prevent + the "lost update" problem; a failed precondition returns 412 Precondition + Failed (§15.5.13). [memory; the page fetch truncated before those sections] + https://www.rfc-editor.org/rfc/rfc9110.html#section-13.1.1 +- **Per-record CAS:** CouchDB `_rev`, 409 (2.5). +- **Git ref update:** `git update-ref ` stores the new value + "after verifying that the current value of the matches ". + Transactions lock every ref (`.lock` files) at `prepare`; "If all s can be + locked with matching s simultaneously, all modifications are + performed. Otherwise, no modifications are performed." [fetched] + https://git-scm.com/docs/git-update-ref. The pattern: take an exclusive lock + file, compare the old value under the lock, write, rename into place. +- **SQLite** serializes writers by file lock (rollback) or WAL write lock; + schema-cookie checks catch schema drift between prepare and run (2.1). +- **LMDB:** single writer mutex across processes, MVCC readers (2.2). +- **IndexedDB:** schema change is an exclusive versionchange transaction that + waits on other connections (2.6). +- **RxDB:** one migrating tab, writes refused during migration (2.5). +- **Crash consistency of temp-plus-rename.** Pillai et al., "All File Systems Are + Not Created Equal: On the Complexity of Crafting Crash-Consistent + Applications", OSDI 2014. The ALICE tool found 60 crash vulnerabilities across + 11 widely used applications; persistence properties, including how rename + orders against data writes, vary across six Linux file systems. [search] + https://research.cs.wisc.edu/adsl/Publications/alice-osdi14.pdf. Whether + `fsync` of the temp file and its directory is needed for durability of the + rename: [memory: yes on Linux ext4 and others]. Windows `MoveFileEx` with + `MOVEFILE_REPLACE_EXISTING` and `ReplaceFile` atomicity guarantees: **not + verified in this pass.** + +## 5. Cross-cutting facts, as observed (not conclusions) + +- Every system found that preserves unknown data does so at *field* level + inside a record whose type the code owns (protobuf, Cap'n Proto, Bond opt-in, + JSON extension data, serde flatten), or as *immutable content-addressed* + units (Automerge changes). +- Systems that hold several record types in one store either rewrite only what + they touch (SQLite, LMDB, Realm [unverified], CouchDB, IndexedDB), or rewrite + the whole file and refuse a model that does not cover the file (Core Data + atomic stores). +- Systems where older code meets a newer schema at open time do one of: + refuse to open (IndexedDB `VersionError`, Core Data 134100, RxDB newer-major, + SQLite unknown schema syntax), go read-only (SQLite write version > 2), or + require a migration before any write (Realm, RxDB, Core Data). +- Protobuf moved from dropping to preserving (3.5). Its documented residual + losses are in conversion paths (JSON, field-by-field copy), and Go's + preservation broke message comparability. +- FIDL made preserve-and-expose the default and added `strict` as an opt-in + refusal, justified on security grounds. + +## Not verified in this pass + +- Primary rationale for restoring proto3 unknown fields in 3.5. +- Any named incident caused by protobuf field-number reuse. +- Stock Apache Thrift retention of unknown fields (the Missing Guide says yes, + the generated-code pattern says skip). +- FlatBuffers object-API round trip of unknown fields. +- MessagePack-CSharp unknown-key retention (absence). +- Realm behaviour opening with a class subset. +- Exact DDIA wording and figure number. +- LMDB primary docs (TLS failure); RFC 9110 section text. +- Windows rename and replace atomicity semantics. diff --git a/docs/research/ground-motion-law.md b/docs/research/ground-motion-law.md new file mode 100644 index 00000000..25bdebda --- /dev/null +++ b/docs/research/ground-motion-law.md @@ -0,0 +1,115 @@ +# Ground motion law: prior art (facts only) + +Serves fork: cultmath-tapes, site-ground motion law (invariant `one-motion-owner`, target `cultmath-tapes:target:r2`), blocks `cut-site-ground`. +Gathered by Eyes, session self-2026-10-14b-eureka, 2026-10-14. No recommendation. Committed by Self before the fork was put. + +Method: primary PDFs were downloaded to the session scratchpad and read with pdftotext ("read"). "[secondary]" marks facts taken from a web-search summary, forum or blog, not read at the primary source. "[not verified]" marks things looked for and not reached. + +## 1. How shipped volumetric clouds move, and what breaks + +### 1.1 Horizon Zero Dawn, Schneider and Vos, SIGGRAPH 2015 +Source: https://www.advances.realtimerendering.com/s2015/The%20Real-time%20Volumetric%20Cloudscapes%20of%20Horizon%20-%20Zero%20Dawn%20-%20ARTR.pdf (99 slides, read) +- Density = low-frequency 3D Perlin-Worley base shape times height gradient and coverage, eroded by a high-frequency 3D Worley texture (slides ~34-37). +- A 128^2, 3-channel 2D curl noise texture "is non divergent and is used to fake fluid motion"; it distorts the cloud shapes and distorts the sample position of the second (detail) 3D noise "to fake the swirly distortions from atmospheric turbulence" (slides 33, 37). The curl texture is a static distortion of the detail lookup, not a time-integrated flow. +- Summary slide (48): noises are custom, "made from Perlin, Worley and Curl noise", and "all animated in a given wind direction". Wind direction varies over altitude (slide 21). High cirrus/alto layers are 2D textures "tiling and scrolling at different speeds and directions" (slide 87). +- Large-scale evolution is not noise motion: coverage, precipitation and cloud type come from a 2D weather map driven by a simulation, with a wind-speed control (slides 39-44). +- Reprojection (slides 92-93): quarter-res buffer updates 1 of 16 pixels per 4x4 block each frame; "We reproject the previous frame to ensure we have something persistent"; where reprojection fails (screen edges) the low-res result is substituted. Stated as making the shader "10x faster or more"; raw cost ~20 ms, target ~2 ms. + +### 1.2 Nubis, Evolved, Schneider, SIGGRAPH 2022 +Source: https://advances.realtimerendering.com/s2022/SIGGRAPH2022-Advances-NubisEvolved-NoVideos.pdf (read) +- Slide "Skies / Vertical Profile Model / Animating Density": the motion law for sky density is a sample-position offset, `noise_sample_position = sample_position - wind_direction * scroll_offset` (comment "Deform sample coordinates"). +- Slide family "VFX / Animating Superstorm Density / The Mesocyclone": each ring samples noise at `GetRotatedPosition(sample_position, superstorm_center, time_offset * RingRotationSpeed[n])`, later with a per-ring `ring_skew[n]`: different rotation rates per layer about one center, no flow field. +- Slide "VFX / Animating Cloud Density For Skies" (code listing): the reprojection pass reads a stored per-pixel `cloud_distance` from a "CloudAttrWorkingBuffer", reconstructs `cloud_world_space = invView * (eyeRay * cloud_distance)`, applies the SAME motion law to that world position (rotate about the storm center blended by `superstorm_mask`; scroll `cloud_world_space + scroll_direction_2D * deltaTime`), then projects it with `inReprojectionMatrix` to get the previous-frame UV. The history lookup is displaced by the density's own motion, using one depth per pixel written by the march. +- The 2022 and 2023 decks show an "Aero Cloud Solver" frame (Apply Buoyant Force, Advect Density, Advect Velocity, Non-Divergence, Sourcing) among the history slides, as the offline VFX approach. + +### 1.3 Nubis3 (Nubis Cubed), Schneider, SIGGRAPH 2023 +Source: https://advances.realtimerendering.com/s2023/Nubis%20Cubed%20(Advances%202023).pdf (read) +- Voxel clouds, slide "Sampling Density": `inSamplePosition -= float3(cCloudWindOffset.x, cCloudWindOffset.y, 0.0) * voxel_cloud_animation_speed`. Wind offset only; no curl, no flow field. +- A comparison table lists "Evolution: Yes" for the Vertical Profile method and "Pseudomotion Only" for the Envelope method, and "Pseudomotion Only" in later tables for the voxel methods. +- March is SDF-accelerated: "Hybrid SDF, Adaptive and Jittered samples"; jitter is `animated_hash` within 250 m of camera, `static_hash` beyond. +- No temporal reprojection slide found in the extracted text. + +### 1.4 Frostbite, Hillaire, SIGGRAPH 2016 +Source: https://media.contentapi.ea.com/content/dam/eacom/frostbite/files/s2016_pbs_frostbite_sky_clouds.pdf (read; section 5.5.3 and the cloud intro) +- 5.5.3: clouds rendered in a single pass; each frame samples are randomly offset within their step range; current frame blended with previous "according to a constant blend factor" (EMA); "For the final frame to not look blurry when the camera is moving/rotating very fast, we re-project the previous result according to previous and current camera properties". Camera-only reprojection; no density-motion term stated. +- Text cites Guerette's visual-flow technique to give a panoramic cloud texture the illusion of motion along the wind direction, noting it has no variation of cloud shape, weather or lighting. +- Frostbite volumetric fog temporal blend, as reproduced by Flax Engine: Halton jitter, 7% current / rest history (https://flaxengine.com/?p=941) [secondary]. Godot docs: higher blend "makes ghosting much worse", moving fog volumes and lights leave a trail (https://docs.godotengine.org/en/stable/tutorials/3d/volumetric_fog.html) [secondary]. +- Hillaire 2015 (Frostbite unified volumetrics) temporal section: [not verified] (158 MB PPTX; SlideShare copy cuts off before it). + +### 1.5 Toft, Bowles, Zimmermann (Studio Gobo), "Optimisations for Real-Time Volumetric Cloudscapes", arXiv 2016 +Source: https://arxiv.org/abs/1609.05344 (PDF read) +- Calls the Horizon 1/16-pixel scheme "a fairly complex technique which may introduce visual artifacts as a result of the 4x4 pattern by which pixels are updated". +- Alternative: far fewer march steps + random per-pixel start offset + analytic integration per step + Playdead-style TAA (Pedersen, INSIDE, 2016) on a low-res buffer. Timings, 1080p GTX 1080 (Fig. 3): half res 128 steps 128.0 ms; half res 8 steps jitter+TAA 7.5 ms; quarter res 8 steps jitter+TAA 2.4 ms. + +### 1.6 UE Volumetric Clouds +- Official component docs list View/Reflection/Shadow sample-count scales and a transmittance stop threshold; nothing on temporal behavior: https://dev.epicgames.com/documentation/unreal-engine/volumetric-cloud-component-properties-in-unreal-engine [secondary]. +- Forum: Mode 2 traces 1 pixel per 4x4 block and reprojects 15, "lots of latency", cloud "would leak after reprojection over opaque meshes": https://forums.unrealengine.com/t/volumetriccloud/688516 [secondary]. +- Forum hypothesis (unconfirmed): a VolumetricCloud writes neither depth nor velocity, so TSR has nothing to reject history on, causing trailing and banding inside a cloud: https://forums.unrealengine.com/t/tsr-ghosting-against-a-volumetriccloud-the-player-stands-inside-every-rejection-knob-measured-none-help/2837437 [secondary]. +- Bug UE-198490 (fixed 5.4): horizontal flicker lines from the temporal component; workaround `r.VolumetricRenderTarget.Mode=1`: https://issues.unrealengine.com/issue/UE-198490 [secondary]. + +### 1.7 Red Dead Redemption 2 clouds (Bauer, SIGGRAPH 2019) +Talk exists ("Creating the Atmospheric World of Red Dead Redemption 2: A Complete and Integrated Solution", Advances in Real-Time Rendering in Games 2019). Slides [not verified]: not among the PDF/PPTX links on https://www.advances.realtimerendering.com/s2019/index.htm; a guessed URL returned 404. Nothing about its motion or reprojection was read. + +### 1.8 Shadertoy-scale nebulae +[not verified]. No Shadertoy source was read in this pass. + +### 1.9 What the sources say breaks +- Pulsing and repetition: Vlachos names these as the two problems of two-phase flow-map animation (3.1). +- Stretching: a texture advected by a non-uniform flow stretches without bound unless regenerated (Neyret, 3.3). +- 4x4 update-pattern artifacts (Toft et al., 1.5); latency and leaking over opaque geometry in 1/16 modes (UE forum, 1.6). +- Camera-only reprojection fails when content moves: https://www.wayline.io/blog/altos-1-1-better-temporal-reprojection-for-volumetric-clouds-in-unity ("When the player moves their camera, the history becomes useless") [secondary]. A hobby engine skips a velocity buffer "since the clouds move slowly", uses bilinear history sampling and EMA: https://handmade.network/p/75/monter/blog/p/7201-engine_optimization__fast_high-quality_cloudscape_through_noise_and_reprojection [secondary]. + +## 2. Temporal reprojection of raymarched volumes whose density moves + +- A volume has no single surface depth. Nubis 2022 writes a per-pixel `cloud_distance` during the march, rebuilds a world point from it, applies the density motion law to that point, then projects with the previous view-projection (1.2). This is the only shipped density-motion-aware reprojection found at a primary source. +- Horizon 2015 and Frostbite 2016 reproject with camera properties only (1.1, 1.4). +- AtmoPlugin (hobby project, GitHub PR #15): raymarch writes a "contribution-weighted" reprojection depth into alpha, taken where opacity exceeds 5%, with fallbacks surface depth, scene depth, mid-atmosphere, infinity; temporal pass reprojects the pixel center with previous camera and planet transforms: https://github.com/Upa2sdo2l/AtmoPlugin/pull/15 [secondary]. +- Two hybrid depth-of-field papers reproject semi-transparent regions by average world position of far-field hits, with a 3x3 neighborhood fallback when there is no hit, and lerp by latest hit ratio during motion to reduce ghosting: https://arxiv.org/pdf/2210.04981 and https://arxiv.org/pdf/2210.06158 [secondary]. +- A search for a published "transmittance-weighted depth" reprojection for clouds returned nothing; it is not an established term in anything reached. +- Reported costs and artefacts of history: higher history weight = more ghosting for moving volumes (Godot, 1.4); EMA "stable in static scenes but performs poorly under dynamic volumetric lighting", and variance clipping plus low-discrepancy jitter tested on froxel data, implemented in Frostbite (a thesis at https://gupea.ub.gu.se/items/e05613c2-e1d4-48b0-b41e-c32f4b0ecbae, blocked by bot protection; only a search summary was seen) [secondary]; UE TSR trailing when no depth/velocity is written (1.6). +- Playdead's TAA (Pedersen, GDC 2016) is the history-reprojection reference cited by both Frostbite and Toft et al. + +## 3. Flow maps, curl noise, advected textures + +### 3.1 Flow maps, Vlachos, Valve, SIGGRAPH 2010 "Water Flow in Portal 2" +Source: https://www.advances.realtimerendering.com/s2010/Vlachos-Waterflow(SIGGRAPH%202010%20Advanced%20RealTime%20Rendering%20Course).pdf (read) +- Builds on Max and Becker 1995 "Flow visualization using moving textures": offset the UV by the 2D flow vector scaled by time; "distortion looks reasonable for the first 1/3 of uv space". +- "Blend the short animated segment in two layers. Each layer is offset half a phase so we can hide the restart for each layer." +- Two named problems: repetition ("the same normals will flow through the same point") and pulsing ("the surface appears to pulse in a repeating pattern"). Repetition solved by offsetting the second layer's sample; pulsing solved by a noise texture that offsets phase per pixel. Cost vs two scrolling normal maps: +2 texture fetches, +21 ALU instructions. +- Colors (Portal 2): distortion interval offset to -fraction..+fraction so the peak is at rest, favouring less distortion than for normals. Listed future work: dynamic per-frame flow vectors. +- Catlike Coding (https://catlikecoding.com/unity/tutorials/flow/texture-distortion/) [secondary]: p=frac(time), weight `1 - |1 - 2p|`, second pattern shifted half a period so weights sum to 1; Perlin noise in the flow map's A channel added to time staggers the pulse as a wave; per-phase "jump" vector times floor(time) shifts UVs only while weight is zero, limited to about +/-0.25, loop length is LCM of jump denominators; strong deformation makes compressed flow maps blocky; large-area flow maps have low effective resolution. +- Golus flow-map notes: [not verified]. + +### 3.2 Curl noise, Bridson, Hourihan, Nordenstam, TOG 26(3) 2007 +Source: https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph2007-curlnoise.pdf (read, 3 pages) +- Velocity = curl of a noise-valued potential (2D scalar potential rotated 90 degrees; 3D three noise functions, "the same noise function evaluated at large offsets"). Divergence-free by construction: "No sources or sinks ('gutters')"; contrasted with plain noise as velocity, which "will generally contain many sinks" where particles accumulate. +- Derivatives by finite difference (displacement 10^-4 of the domain "works fine in single precision"). With noise at length scale L: vortices of diameter about L, speeds O(1/L). Several octaves with power-law amplitude falloff resemble Kolmogorov turbulence. +- Time variation: "achieved very simply by using time-varying noise"; pseudo-advection of Flow Noise mentioned as untried. +- Boundaries: potential multiplied by smooth ramp of distance to solids, `ramp(r) = 15/8 r - 10/8 r^3 + 3/8 r^5`. +- The paper names particle advection as a primary use. It says Perlin and Neyret's Flow Noise textures "cannot be used for moving particle systems". +- Perlin and Neyret, "Flow Noise" (SIGGRAPH 2001 sketch): rotating gradients over time plus pseudo-advection of small octaves by large ones; needs noise with analytic derivatives. https://evasion.inrialpes.fr/~Fabrice.Neyret/flownoise/index.gb.html ; Gustavson's simplex noise code exposes the derivative and a rotation parameter `t` for it (https://www.itn.liu.se/~stegu76/simplexnoise/DSOnoises.html) [secondary]. + +### 3.3 Advected textures, Neyret, SCA 2003 +Source: https://evasion.inrialpes.fr/Publications/2003/Ney03/neyret161.pdf (read) +- A noise texture advected by a flow stretches; periodic regeneration prevents stretch from growing on steady flows, but the regeneration rate (latency) is hard to tune and blending regenerated layers causes ghosting and contrast loss. +- Method: accumulate local deformation (time integral of the strain-tensor norm) per layer since its last regeneration; blend layers of different latency by a criterion on that accumulated deformation against a user target (analogous to MIP-mapping); each layer blends three phase-shifted regenerated textures; proposes a procedural-texture blending scheme that avoids contrast loss. +- Needs a velocity field to compute deformation; the paper's flow came from a low-resolution fluid simulation. + +### 3.4 Does a span / Lipschitz bound survive advection or a time-dependent warp +No source found states it. What was read: +- Seyb, Jacobson, Nowrouzezahrai, Jarosz, "Non-linear sphere tracing for rendering deformed signed distance fields", TOG 38(6) 2019 (PDF read): stepping in deformed space needs the Lipschitz constant of S o D^-1; "for affine transformations this is trivial [Stander and Hart 1994], but for more complicated deformations Lipschitz constants can be tedious or even impossible to compute analytically"; a global constant degrades step size where it is large; local constants "require a non-negligible computation whenever the deformation changes, i.e., every frame". Their remedy: trace in undeformed space as an ODE, avoiding the inverse deformation. https://par.nsf.gov/servlets/purl/10172295 +- Galin et al., "Segment Tracing Using Local Lipschitz Bounds", CGF 39(2) 2020: local Lipschitz bounds per ray segment, bounds derived per operator and primitive (abstract/search summary only) https://diglib.eg.org/handle/10.1111/cgf13951 [secondary]. +- Bridson 2007: speed of a noise-derived velocity is O(1/L) per octave (informal amplitude bound). +- Neyret 2003: the quantity that grows under advection is the time-integrated strain-tensor norm. +- A bound on the time derivative of a warped field, or a space-time Lipschitz constant: [not found]. + +## 4. Particle layers coherent with a volumetric field +- No shipped system found that drives volumetric density and a particle layer from one stated shared motion law. +- Niagara Curl Noise Force: reads a pre-baked, medium-resolution tiling curl-noise field by default, or computes a Perlin-derived curl at higher cost; docs do not state the divergence-free property: https://dev.epicgames.com/documentation/unreal-engine/particle-spawn-group-reference-for-niagara-effects-in-unreal-engine [secondary]. +- Frostbite 2015 couples particles to fog by voxelizing particle extinction into the same froxel volume, so they are lit together (shared volume, not shared velocity): https://www.ea.com/news/physically-based-unified-volumetric-rendering-in-frostbite [secondary]. +- Flax: volume particles write into the fog's 3D textures: https://docs.flaxengine.com/manual/graphics/fog-effects/volumetric-fog.html [secondary]. Godot demo of particle-faked fog animated with wind/attractors; "billboards make the fog appear to rotate with the camera": https://github.com/Bauxitedev/volumetric-fog-demo [secondary]. +- Bridson's curl noise is built for particle advection and the divergence-free property is its stated reason (3.2). +- Nubis 2022 / Nubis3 slides read carry no particle layer sharing the density motion law. + +## 5. Not reached +RDR2 (Bauer 2019) slides; Hillaire 2015 temporal section; Golus flow-map notes; any Shadertoy nebula source; UE internals beyond forum reports; any source bounding the time derivative of a warped noise field. diff --git a/docs/research/integration-native-noise-domain.md b/docs/research/integration-native-noise-domain.md new file mode 100644 index 00000000..0dcdfae1 --- /dev/null +++ b/docs/research/integration-native-noise-domain.md @@ -0,0 +1,291 @@ +# An integration-native volumetric noise domain: probe + +Campaign `cultmath-tapes`, Imagination probe, 2026-10-03, under ruling +`cultmath-tapes:ruling:integration-native-noise-domain`. This is research under the +parked tape target. It has no spec, no shipped-field change and no committed code. + +It follows `analytic-integration-feasibility.md`, which found that exact noise +integrals are cheap but that the shipped densities are nonlinear in the noise. The +question here is the reverse one. Suppose a domain is designed so that span +integration holds by construction. Does it buy more visual detail per unit cost +than the shipped fields? + +On the operator's instruction (relayed by Self), the reference is physical, not +Aetheria's tuned compositing: +- transmittance is Beer–Lambert, `T = exp(-τ)`; +- the images use single scattering with Henyey–Greenstein `g = 0.6` and albedo 1; +- both fields are integrated the same way. + +The shipped look is a comparison, not a target. + +## Verdict + +**On the void, yes, by a wide margin. On the wells, modestly.** At or below the +shipped march's cost, the integration-native field carries much more resolvable +detail, and it is exact. The catches: +- The look changes character. The default cascade reads as fibres or brush strokes, + not as soft cloud. +- The cost is traversal, not integration. +- The field cannot be ray-marched at all. Every consumer, shadow rays included, + must use the exact path. + +Headline numbers, 512 x 256, single-threaded C# on Yggdrasil: + +| Void, transmittance image | Cost per pixel | vs shipped march | msf (grad²/var) | Power above 1/8 cycle/px | Pixels with \|∇T\| > 0.05 | +|---|---|---|---|---|---| +| Shipped field, converged reference (595 samples) | n/a | n/a | 0.0111 | 0.20% | 0.00% | +| Shipped march (11.4 samples) | 28.9 µs (44 snoise3) | 1.00x | 0.0178 | 0.71% | 0.00% | +| Integration-native, 2 levels, exact | 13.9 µs | **0.48x** | **0.0755** | **2.95%** | 41.9% | +| Integration-native, 3 levels, exact | 35.7 µs | 1.24x | 0.125 | 9.15% | 54.7% | +| Integration-native, 6 levels (LOD stops at 4 to 5), exact | 74.2 µs | 2.57x | 0.159 | 12.5% | 60.9% | + +- **Mean density is matched.** + - The integration-native field places mass from the shipped field's noise-averaged + density. + - Mean window optical depth is 1.62 to 1.74 against the shipped 1.81. + - Mean T is 0.25 to 0.40 against 0.17. The difference comes from intermittency: + the image std is 0.29 against 0.05, at a near-equal mean. +- **msf is normalised by variance.** It measures spatial frequency, not contrast. +- **Single-scattering images, void.** The images are 256 x 128 with a point light at + the sun, and both are tonemapped with the same exposure. The shipped image's msf + is 0.0023, with 0.22% of power above 1/8. The integration-native image's msf is + 0.101, with 16.9% of power above 1/8. +- **Wells.** + - Transmittance is a near-opaque silhouette for both fields: equal msf (0.011), + so it carries no signal. + - Single scattering at 6 levels (1.20x the march cost): + - msf is 0.073 against 0.069; + - power above 1/8 is 10.1% against 7.0%; + - the edge fraction is 16.7% against 9.5%. + - At 4 levels the cost is 0.77x the march. + +**Exactness.** Against a converged march of the same field at 0.02 world: +- The relative τ error is a median 3e-5 and a maximum of 1.0e-4 on the void, and a + median 1e-5 and a maximum of 1.0e-4 on the wells. +- The binned gather against brute force over all roots differs by at most 1.3e-15. +- The shipped march against its own converged reference: |ΔT| is a median 0.0055 + (p90 0.013) on the void and a median 0.0006 (max 0.83 on grazing rays) on the + wells. + +**The detail is only reachable by integration.** +- Marching the same integration-native field at the shipped step gives a void |ΔT| + median of 0.14, a p90 of 0.48 and a maximum of 0.83. +- A field this detailed is beyond the march at its step. That is the operator's + premise, measured: the shipped fields' softness fits the regime that renders them. + +## The primitive set + +The primitive set has one design rule: nonlinearity lives in kernel placement, and +linearity lives in the integration. The density is a sum of nonnegative, +compact-support kernels. Everything nonlinear is evaluated once per kernel, at its +centre, and never per sample. That covers envelopes, clamps, `pow` profiles, the +flow warp and placement. + +### Bases (closed-form line integral over a segment) + +| Primitive | Why it integrates | Cost per span (measured unless marked) | +|---|---|---| +| Compact polynomial ellipsoid kernel, `(1 − u)^k` with `u = \|A⁻¹(x − μ)\|²` | On a line, u is quadratic in t, so the kernel is a polynomial of degree 2k between the two roots of `u = 1`, which are closed form. Same algebra as the simplex lattice integral in the first probe | k = 0: 5.5 to 7.4 ns; k = 1: 8 to 9.5 ns; k = 2: 11.7 ns. About 0.01 to 0.02 snoise3 (snoise3 is 610 to 650 ns in C#) | +| Truncated Gaussian ellipsoid, `exp(−κu)` on `u ≤ 1` | `exp` of a quadratic is a Gaussian in t, giving an erf difference. Truncation only clips the limits | 32 to 36 ns with A&S 7.1.26 erf (error ≤ 1.5e-7), about 0.05 snoise3 | +| k = 0 ellipsoid (constant density) | Chord length; this is EVER's primitive (Mai et al. 2024 [memory]) | 5.5 ns | +| Gabor kernel (Gaussian × cosine) | Complex erf, any affine transform (Gabor Fields 2026, eq. 9 [fetched in the prior-art file]) | Not probed. Up to 16 Taylor terms [paper] | +| Cosine sum (Balint 2019) | Integral is a sum of sines | Not probed. Two noise-sized evaluations per segment [paper]. Signed, so it needs an offset; low contrast | +| Simplex lattice (CultMath `snoise`) | First probe: degree 9 per lattice point | 0.16 snoise3 per point, 3.44 points per noise unit. Signed: only usable where density is affine in it | + +### Warps + +| Warp | Why it stays exact | Cost | +|---|---|---| +| Per-kernel affine warp: centre moved by `f(μ)·s`, shape by `(I + J·s)` | An affine image of an ellipsoid is an ellipsoid, so the ray stays straight and the kernel stays closed form. The warp *defines* the field, so there is no approximation error. It is evaluated once per root per frame (7 flow evaluations with the Jacobian) | Frame build 39 ms (void, 2540 roots) and 57 ms (wells, 16947 roots), or 19 and 27 ns per 1080p pixel amortised | +| Children inherit the parent's affine frame | The cascade has descendants that are exact affine images, so the warp is evaluated only at the roots | One 3x3 product per child, from a table | +| Not allowed | A per-point warp `x + w(x)` inside a span: the warped ray curves, which was the first probe's problem | n/a | + +### Transfer and placement + +| Rule | Status | +|---|---| +| Any function of the kernel centre: the shipped clamp, `pow`, the smoothstep fade, the noise-averaged density `E_n[ρ(x, n)]` from 16 empirical noise quantiles, through a 1D LUT over d (void) or s (wells) | Exact by construction, at one lookup per kernel | +| Affine transfer of the sum (`a + b Σ K_i`) | Exact | +| Any 1D function of an *affine* coordinate, `∫ f(a + bt) dt = ΔF / b` (pre-integration, Engel 2001) | Exact [derivation, not probed]: height fog `exp(−y/h)` and ramps in y | +| Polynomial or exp of a *quadric* coordinate; an indicator or clamp of a quadric (chord through roots) | Exact [derivation, not probed]: spherical shells and paraboloid bowls as envelopes | +| Product of the sum with a polynomial envelope in t | Exact, polynomial times polynomial [derivation, not probed] | +| Forbidden inside a span: `f(Σ K_i)` for nonlinear f, `max`/`min` of fields, a clamp of a signed sum, or noise displacing an envelope's argument | These are exactly what broke the first probe | + +### Composition: the mass-conserving multiplicative cascade + +- **Roots** sit on a jittered grid: spacing H0 = 30 world on the void and 40 on the + wells, one root per cell. + - Mass is `P(μ)·H0³`, so the mean density equals the shipped noise-averaged + density. + - The ellipsoid is elongated along the flow direction projected on the shell or + fog layer (aspect 1.3 to 2.4), with ±0.6 rad of jitter, and flattened along the + normal (×0.5 void, ×0.4 wells). + - There are two copies per root, at the shipped two-phase shifts with weights w0 + and 1 − w0. Time animation is therefore the shipped crossfade, exact under + summation. +- **Children.** Each node keeps 25% of its mass and gives 75% to Nc = 5 children. + - Child weights are `u²·P(child)/P(parent)`, normalised. The `u²` makes the cascade + intermittent; the P ratio sharpens it toward the envelope. + - A child is scale 0.4, with aspect up to 1.6 and ±0.6 rad of rotation. + - Children sit along the parent's major axis: offset 0.6 along it, 0.21 across. + - All of this comes from a 256-entry table indexed by hash. A descendant bound of + 1.77 times the ellipsoid holds the subtree, so the parent is a BVH node. +- **LOD.** A node is a leaf when its children would be smaller than 0.5 × the pixel + footprint at that depth. It then keeps its full mass. Because the cascade conserves + mass, truncation is a mean-preserving prefilter: the expectation step of the first + probe, exact here instead of approximate. +- **Gather.** + - Roots are binned by their subtree AABB into a hash grid of H0 cells. + - The ray walks the grid with Amanatides–Woo DDA and mailboxing, clipped to the + shipped active windows, so both fields integrate the same span. + - It exits early once Στ ≥ 7, which is valid because every term is nonnegative. + +## "Juice" under these constraints + +| Effect | Mechanism here | Measured or prior art | +|---|---|---| +| Filaments, wisps | Anisotropic children chained along the parent's major axis, which follows the flow | Visible in `void-T-IN-L6.png` as streaks along the flow. Gabor Fields uses anisotropic Gabor kernels for orientation-selective detail [fetched] | +| Sharp edges | Low-order kernels: k = 1 is the default, k = 0 gives hard ellipsoids | k = 0 (`L6-hard`) changes msf by −9% on the void. Edges come from kernel boundaries, not clamps | +| Voids | Regions with no kernel mass are exactly zero and are skipped by the gather at no cost | Structural | +| Turbulent intermittency | Random multiplicative cascade, the p-model of turbulent dissipation (Meneveau & Sreenivasan 1987 [memory]); clustered kernels, as in a Neyman–Scott process [memory] | Image std 0.29 against 0.05 at near-equal mean OD | +| Flow and animation | Per-kernel warp at the shipped flow and phases. Alternatives are Lagrangian advection of kernel centres with lifetimes (advected textures, Neyret 2003 [memory]) and Gabor phase for oscillatory detail (flow noise, Perlin & Neyret 2001 [memory]) | Only the two-phase crossfade was measured | +| Fine detail riding on structure | Children exist only inside parents, so detail appears only where matter is. This is Schneider's erosion idea (2015 [fetched]) without the per-sample clamp | Structural | + +Wavelet turbulence (Kim et al. 2008 [memory]) and curl noise (Bridson 2007 [memory]) +were not used. A per-point warp is ruled out above. Curl noise could orient kernels, +evaluated per kernel, at no cost to exactness. + +## Measurements + +**Setup.** +- Probe source: scratch clone `probe-clone@5ec9f529`, + `packages/cultmath/probe/DomainProbe/Program.cs`, never merged. +- Run on Yggdrasil through the verify stopgap: dotnet 10 container, 4 CPUs, tiered + JIT off. +- Full log: Self's scratchpad, `dom-full1.log`. +- The scenes are those of the first probe, with fixed cameras: + - Void: the shipped orbiting camera at time 20, at the 1920-wide f = 935 field of + view, rendered at 512 x 256. + - Wells: warp D = 60, camera at xz (1200, 0) looking at the central well, slopes + x ±1 and y from −0.85 to 0.15. +- The window is the shipped field's active intervals. Every method integrates the + same window. + +**Cost.** +- Single-threaded C#, best of three passes over the same 2048 random pixels. +- The host is shared, and absolute timings moved by up to 2x between the smoke run + and the full run; Flow went from 125 to 660 ns. Ratios within one run are the + reliable numbers. +- Flow is 47% of a shipped sample in this run, so a flow-cached march would cost + about 15 µs on the void and 31 µs on the wells. + +| Config (void) | Cost vs march | Roots visited / nodes tested / kernels integrated per pixel | Kernels per level | +|---|---|---|---| +| L1 | 0.12x | 43 / 8 / 8 | 8 | +| L2 | 0.48x | 59 / 25 / 20 | 8, 12 | +| L3 | 1.24x | 74 / 42 / 28 | 8, 12, 8 | +| L4 | 1.81x | 82 / 60 / 35 | 8, 12, 8, 7 | +| L6 (default) | 2.57x | 93 / 86 / 36 | 8, 12, 8, 7, 1, 0 | +| L6, no child placement | 1.79x | 93 / 91 / 39 | same metrics as L6 | +| L6, no LOD | 2.95x | 93 / 103 / 49 | 8, 12, 8, 7, 7, 7 | + +| Config (wells) | Cost vs march | Kernels integrated per pixel | +|---|---|---| +| L1 | 0.04x | 5 | +| L2 | 0.23x | 11 | +| L3 | 0.49x | 16 | +| L4 | 0.77x | 20 | +| L6 | 1.20x | 25 | +| L6, no child placement | 0.62x | 27 | + +**Where the time goes.** +- The integrals are about 36 kernels × 10 ns, or 0.4 µs of a 74 µs pixel. +- The rest is traversal: + - roots visited but missed: 93 visited for 8 hits, because AABBs of elongated + rotated ellipsoids are loose; + - child generation; + - placement lookups. The wells' placement costs a 5-bowl `Sdf`, and dropping + child placement halves the wells cost with identical metrics. + +**Aliasing.** One sample per pixel against four on the default void field: |ΔT| has +an RMS of 0.015 (p90 0.022). At 4 spp the msf is 0.146 against 0.159. So about 92% +of the measured detail is resolved structure, not sparkle. Exact along the ray is +not the same thing as antialiased across the pixel; the LOD rule is the prefilter. + +**Variants, void L6 (msf / power above 1/8).** +- k = 1 default: 0.159 / 12.5%. +- Hard k = 0: 0.145 / 11.0%. +- Gaussian (erf): 0.174 / 14.2%, at 0.89x the polynomial cost here. The erf kernel is + 3x the polynomial kernel in isolation, but the kernel is not where the time goes. + +## Images + +All images are in Self's session scratchpad, +`C:\Users\Meta\AppData\Local\Temp\claude\F--Projects-CultLib\b7e842a1-2045-474e-a51b-240d832b770b\scratchpad\integration-domain-images\`: + +- **Transmittance, 512 x 256.** Shown as `sqrt(1 − T)`, white for opaque. + - `void-T-shipped-ref.png`, `void-T-shipped-march.png`. + - `void-T-IN-L1.png`, `void-T-IN-L3.png`, `void-T-IN-L6.png`, + `void-T-IN-L6-hard.png`, `void-T-IN-L6-gauss.png`. + - The wells equivalents, which are silhouettes and uninformative. +- **Single scattering, 256 x 128.** + - Method: HG g = 0.6 and albedo 1. The point light is at the void's sun with 1/r² + falloff; the wells use a directional sun with a sky background. + - Each view sample takes a shadow ray: a 2-world march for the shipped field, an + exact traversal for the integration-native field. + - Tonemap: `1 − exp(−1.5 L / p99(shipped))`, then gamma 2.2, the same exposure for + both fields. + - `void-SS-shipped.png`, `void-SS-IN-L6.png`, `wells-SS-shipped.png`, + `wells-SS-IN-L6.png`. + +What they show: +- The shipped void is a soft, low-contrast haze. +- The integration-native void is dense flow-aligned streaks with deep gaps, like + hair or brush strokes. +- The shipped wells are smooth rolling dunes. The integration-native wells are + layered pancakes with streaked detail. + +## The catches + +1. **The character is a design parameter, and this probe picked one.** + - High anisotropy, axis-chained children and an intermittent `u²` split give + fibres. + - A cloudier look would need rounder children, wider offsets and less + intermittency. That trades away some measured detail and was not swept. + - The detail metrics measure spatial frequency, not taste. The operator has to + look at the images. +2. **The cost is a BVH, not arithmetic.** + - Integration is nearly free. Traversal, child generation and placement dominate. + - Tighter root bounds (OBB tests before AABB bins), cheaper placement and fewer + children are obvious levers, but none was measured. + - On a GPU, variable-length kernel lists per ray diverge. 3DGRT (Moënne-Loccoz et + al. 2024 [memory]) puts the same problem on hardware ray tracing. + - CPU C# ratios do not transfer to the GPU, where snoise is relatively cheaper. +3. **It is all or nothing.** + - This field cannot be marched. At the shipped step, |ΔT| is a median 0.14. + - Shadow rays, light probes and any sampler consumer need the exact traversal too. + The single-scattering pass here cost an exact shadow traversal per view sample: + 257 s for both void SS images together, against 54 s for the whole 512 x 256 + shipped transmittance set. + - Lighting has no closed form. The in-scatter integral is still quadrature. What + the domain makes exact is every optical depth inside it. A per-kernel lighting + cache would amortise shadows, but that is a different shading model (splat-like), + and so a product fork. +4. **Exact along the ray, not across the pixel.** The LOD truncation is the + prefilter. 8% of the measured detail at 1 spp is aliasing. +5. **The wells gain little** because the shipped wells fog is near-opaque. Its look + is the surface silhouette, and that is set at root scale. The domain pays most + where the medium is semi-transparent, as in the void. +6. **Timing noise.** Absolute costs vary up to 2x between runs on the shared host. + The cost ratios above are within one run. + +## What would change the verdict + +- A sweep toward a cloud-like character: round children, Nc = 8, wider offsets, + Gaussian kernels. It should be judged on the single-scattering images against the + same cost. +- Tight root culling: an exact ellipsoid-versus-bin test, or roots stored by + oriented bound. If roots visited fall from 93 to near the 8 hits, the void L3 cost + would fall well under the march. +- A GPU port of one level-limited configuration, to replace the C# ratios with + shader timings. diff --git a/docs/research/inverse-procedural-modelling-prior-art.md b/docs/research/inverse-procedural-modelling-prior-art.md new file mode 100644 index 00000000..15a26567 --- /dev/null +++ b/docs/research/inverse-procedural-modelling-prior-art.md @@ -0,0 +1,151 @@ +# Inverse procedural modelling: describing messy meshes as programs + +Eyes pass, 2026-10-10. Operator: "What if the model had some trash geo and its goal is to describe it parametrically?" Context: Tripo hard-surface hulls; CultMath intervals and affine forms on main, tape/brush grammar parked (docs/cultmath-tape-target.md); the earlier GameCult/VibeGeometry attempt (2026-05). Facts only; tags mark FETCHED, SEARCH (search summary only) and KNOWLEDGE (unverified). + +# Eyes facts: inverse procedural modelling (mesh -> parametric program) +Date 2026-10-10. Tags: FETCHED (page/file read this session), SEARCH (search-result digest only), KNOWLEDGE (unverified recall). +Search digests come from a small model; SEARCH numbers are not paper-verified. + +## 0. What exists in GameCult +- FETCHED F:\Projects\CultLib\docs\cultmath-tape-target.md: steps 2-5 (tape, pruning, HLSL interpreter, meshing) PARKED (2026-10-02, + ruling tape-target-unparks-when-asura-stable). Step 1 intervals + affine forms are on main (docs/cultmath-interval-ground-cut.md). + The "grammar of nested brushes" is operator intent only (quote 2026-10-02: space station from "a grammar of nested brushes"); + doc says the station project is "a separate project with its own target". Chosen shape (c): port Fidget ideas into CultLib (Fidget = + MPL-2.0 Rust, v0.5.1). Meshing plan: surface nets + Asura tile pass (Newton refinement onto f=0, crease snapping from field gradients); + "Thin authored bevels can be shaded by their analytic normals". Tape gradients "reuse CultMath's analytic-gradient primitives". +- FETCHED grep CultLib\docs for brush/tape: "brush" hits in cultmath-interval-ground-cut.md are Aetheria noise/gravity-well field brushes + (PowerBrush (1-x^2)^16 etc.), not CSG brushes. No CSG brush grammar or tape code exists in CultLib; only the parked doc. +- FETCHED (voidbot) separate repo GameCult/GameCult.Geometry.Csg ("CultGeometry CSG", Rust; local F:\Projects\GameCult.Geometry.Csg). + Mesh-based convex plane-splitting CSG (not SDF), RealtimeCSG-shaped API: ordered Additive/Subtractive/Intersecting brush streams, boxes, + oriented boxes, CylinderZ/DomeCapZ/FloretArm, dirty-frontier, OBJ output, plus domain-tree/selected-cut LOD schemas (src/cult_geometry). + Doc text: "agents should revise intent by moving, adding, or renaming brushes, not by poking triangles"; "brush list is the durable + design surface. The mesh is a cache." + +## 0b. The earlier "vibe geometry" attempt +- FETCHED voidbot gamecult-site GameCult/Projects/VibeGeometry.md: repo GameCult/VibeGeometry, started 2026-05-04, last public push + 2026-05-07; "agent-authored Blender scene generation: geometry nodes, Python builders, semantic graph contracts, render evidence, and + the ongoing war against decorative node spaghetti". Org ledger: "Started as architecture and persistence scaffolding, then dived almost + immediately into CSG grammar, parity fixtures, native bridge probing, mesh generation, and performance work." +- FETCHED local git F:\Projects\VibeGeometry-cultgeometry-rename (93 commits). Commit 09bff8c (2026-05-29, "Focus VibeGeometry on vg-csg") + deleted the scene-generation tree; recoverable at 09bff8c^: docs/research/procedural-doctrine.md (~1000-line "spatial reasoning + playbook"), dream-machine-grammar.md, geonodes-translation-corpus.md, ircss-french-houses-* (translations of Blender node graphs into + Geometry Script Python), builds/{aetheria-bloom-habitat, lucent-tether-habitat, dream-machine-level, industrial-maintenance-loop}.md, + notes/architecture-rationale.md, a "reusable procedural helper library" (aa4d49d). The DSL was Blender Python via Geometry Script + (fork F:\Projects\geometry-script; upstream PR carson-katri/geometry-script#69 linked by Metacrat 2026-05-04) emitting geometry-node + graphs, plus the Rust brush DSL (LevelDsl: solid_box, cut_box, solid_oriented_box, dome_cap_z, floret_arm). +- FETCHED notes/architecture-rationale.md @09bff8c^, section "Core Failure": "The central failure mode is local plausibility without global + coherence. An agent can write plausible Blender Python, create a large node graph, and still lose the visual machine ... the script + runs, the graph exists, the render has objects in it, and somehow the target has been replaced by decorative procedural fog". + "Seductive proxies": valid Python, non-empty renders, high node counts, pretty materials, parameter sliders. + procedural-doctrine.md: "Ornament in the wrong frame is not detail. It is a confident lie". Commit titles record frame errors: + "Correct Bloom terrace slum orientation", "Correct Lucent dome spin-gravity frame", "Move Lucent ray florets outside dome". +- FETCHED VibeGeometry README: "failed experiments are useful without being allowed to hold a steering wheel"; old mission "deleted + from the live tree"; live mission narrowed to runtime CSG (domain tree -> LOD CSG -> selected cut -> triangles). +- NOT FOUND: no indexed operator or agent statement that models "weren't good enough at spatial reasoning to use the DSL". voidbot + search_history (Discord) returned only unrelated hits. The repo docs above are the only failure statements in project words + (coherence and frame errors; the phrase "spatial reasoning" appears only in the playbook title and its body). + +## 1. Inverse CSG / shape-program synthesis +Most train or test on DeepCAD / ShapeNet / ABC / Infinigen; none retrieved was evaluated on noisy AI-generated hard-surface meshes. +- InverseCSG (Du et al., SIGGRAPH Asia 2018, MIT). SEARCH: mesh/point samples -> CSG program; geometric processing (RANSAC-style primitive + detection) turns the mixed discrete/continuous problem into a purely discrete one; careful point samples guide a discrete search; + divide-and-conquer segmentation; program synthesis (solver) per segment. Claims >100 primitive parts, compact programs, beats prior + methods on compactness/runtime. D2CSG authors (SEARCH) criticise it: RANSAC needs tuning, noisy initial primitives, long search. + Project page inversecsg.csail.mit.edu lists code; licence not checked. +- CSGNet (Sharma 2018): KNOWLEDGE only; supervised, voxel/2D -> CSG sequence. +- UCSG-Net (Kania, NeurIPS 2020). SEARCH: unsupervised; predicts box/sphere params; differentiable indicator on SDF; several CSG layers with + soft operator choice; structure and params learned jointly by gradient descent; autoencoding scope (2D/3D), no mesh-to-program at test + for unseen exotic shapes beyond the trained net. +- CAPRI-Net (CVPR 2022). SEARCH: axis-aligned quadric primitives, fixed 3-layer assembly; ABC point-cloud Chamfer 0.09 vs UCSG 1.43; ~5.3 vs + 12.92 convex shapes. D2CSG (2023), CSG-Stump (2021): SEARCH, unsupervised compact trees. SECAD-Net (CVPR 2023): SEARCH, sketch-extrude, + editable; CD 2.94/4.20 (ABC/Fusion) vs UCSG 3.14/4.45. +- Point2CAD (Liu et al.): SEARCH only that a repo exists (jofcodeusal/point2cad mirror, Docker toshas/point2cad); method not retrieved. + Point2Cyl (CVPR 2022): SEARCH, supervised net to extrusion cylinders. DeepCAD (Wu 2021): KNOWLEDGE, ~178k sketch-extrude sequences. +- ShapeAssembly (Jones 2020, TOG): SEARCH; programs of cuboid proxies attached to each other with free parameters; extraction from PartNet. + ShapeMOD (2021): SEARCH; discovers macros across a corpus minimising calls and free parameters. Repos/licences not found by search + (KNOWLEDGE: github rkjones4/ShapeAssembly exists; unverified). +- CAD-Recode (Rukhovich et al., ICCV 2025, arXiv 2412.14042). FETCHED abstract: point cloud -> CadQuery Python (sketch-extrude); point-cloud + projector + small pretrained LLM decoder; trained on 1M procedurally generated CAD sequences; eval DeepCAD, Fusion360, CC3D (real scans); + output usable by off-the-shelf LLMs for editing and QA. SEARCH (unverified): Qwen 0.5B/1.5B decoders; DeepCAD mean CD 3.43 -> 0.30, IoU + 77.6 -> 92.0 vs CAD-SIGNet; test time: 10 sampled candidates executed, min-Chamfer kept. Code github.com/filaPro/cad-recode (SEARCH); + HF dataset filapro/cad-recode is CC-BY-NC-4.0 (SEARCH); repo licence unchecked. Structure by autoregressive decoding, params as literal + tokens, re-ranking by Chamfer. Abstract says nothing on fillets/chamfers. +- MeshCoder (Dai et al., NeurIPS 2025, arXiv 2508.14879). FETCHED: 16,384-point cloud -> triplane tokenizer -> Llama-3.2-1B (LoRA) -> + Blender Python. API: cube/cylinder/UV-sphere/cone/torus, Translation (sweep 2D section along 3D trajectory), Bridge Loop, Boolean + (union/intersect/diff), Array, Fill Grid, Spoon, Fork. Data: ~10M part-code pairs, ~1M object-code pairs, 41 categories (Infinigen + Indoor). Table 2 averages CD x1e-2 / IoU%: Shape2Prog 6.00/45.0, PLAD 1.87/67.6, MeshCoder 0.06/86.75. Worst: Fork 58.9 IoU, CeilingLight + 65.8, Array parts 78.9. Limits: human-made objects only; geometry only; training objects kept only if every part CD < 5e-3. LLM does not + edit; edits are manual param changes; GPT-4o used only for QA on the code. Output is part-segmented. Licence not stated in paper. +- CADCodeVerify (Alrashedy, ICLR 2025, arXiv 2410.05340). SEARCH: text prompt -> CadQuery (GPT-4); VLM writes/answers validation questions + about renders and refines; CADPrompt benchmark (200 objects); GPT-4 point-cloud distance -7.30%, compile rate +5.5% (v2; v1 said 5.0% + success). Target is a prompt, not a mesh. +- Newer render-loop agents (SEARCH): SEIG "Thinking in Blender" (arXiv 2606.02580): single reference image -> staged Blender code (geometry, + materials, composition, lighting), VLM generator + verifier per stage; FETCHED abstract gives no numbers, no code link. LL3M (2508.08228): + text -> Blender with critic reading renders. ShapeCraft (2510.17603): renders bbox/part/global views as feedback. SceneCraft (2403.01248): + render-critique-revise. Not found by search: "3D-Premise", "LLMto3D", Img2CAD/Text2CAD specifics. + +## 2. Classical primitive fitting as a front end +- Efficient RANSAC (Schnabel/Wahl/Klein, CGF 2007): SEARCH/FETCHED page text: planes, spheres, cylinders, cones, tori in unorganised clouds; + multi-million-point sets "within less than a minute". CGAL Shape Detection implements it plus Region Growing (Lafarge&Mallet). CGAL is + dual GPL/LGPL + commercial; the Shape Detection package's own licence NOT confirmed (digest guessed GPL). +- GlobFit (Li/Wu/Chrysanthou/Sharf/Cohen-Or/Mitra, SIGGRAPH 2011): SEARCH; starts from RANSAC primitives, discovers global relations + (orientation, placement, equality; symmetry) and enforces them by constrained optimisation; assumes man-made, repeated, globally aligned + parts. Code: archived code.google.com/archive/p/globfit, "research use only" wording. +- Mitra 2006 symmetry detection, SPFN (2019): KNOWLEDGE/SEARCH only. ParSeNet (2020): SEARCH; B-spline patch decomposition, beats RANSAC + and SPFN baselines. No repos/licences retrieved. +- What fits supply as data: exact primitive parameters with inlier sets and residuals, segment labels, relation graph (GlobFit). + InverseCSG uses the primitives to make the problem discrete. Recorded weakness: noisy primitives, parameter tuning (SEARCH). + +## 3. Differentiable fitting of SDF/CSG programs +- UCSG-Net (above): soft operator selection; structure learned jointly. +- Fuzzy Boolean differentiable CSG (dgp.toronto.edu/~hsuehtil/pdf/fuzzyBoolean.pdf): SEARCH; gradient descent over boolean and primitive + parameters; notes prior work pre-fixes tree structure and operators and optimises only primitive params; replaces min/max with a unified + fuzzy operator so the operation type is optimised. Costs listed: analytic SDF per primitive type, per-iteration SDF evaluation, image + losses need differentiable sphere tracing. +- DiffCSG (arXiv 2409.01421): SEARCH; differentiable rasterisation of mesh CSG, image-space gradients to primitive params; image-guided + editing, not mesh fitting. +- ResFit, Residual Primitive Fitting with SuperFrusta (arXiv 2512.09201): SEARCH; one analytic SDF primitive with 8 params (dilation, taper, + bulge, onion hollowing, profile roundness, axial scaling); alternates global shape analysis and local primitive optimisation; code "to be + open-sourced upon acceptance". +- Evolutionary mesh -> CSG abstraction (SEARCH; authors not retrieved): fast, coarse. Sigmoid-over-SDF soft occupancy with alternating + add-primitive / joint-refine loop (SEARCH, primitive-scene paper). +- Not found: a published gradient fit of an SDF program with bevel/round parameters to a messy hard-surface mesh. +- Handling of discrete structure across sources: soft selection (UCSG, CSG-Stump, fuzzy Boolean); pre-fixed structure (InverseCSG after + RANSAC; CAPRI-Net fixed layers); greedy add/prune (ResFit); neural token decoding (CAD-Recode, MeshCoder). + +## 4. LLM spatial reasoning in 3D code generation +- BlenderGym (Gu et al., CVPR 2025, arXiv 2504.01786). FETCHED: 245 start-goal Blender scene pairs, five tasks (placement, lighting, + procedural material, blend shape, procedural geometry); the VLM sees start and goal and edits Blender code (target-matching setting). + Table 1 best-VLM vs human: geometry Chamfer 1.120 (GPT-4-Turbo) vs 0.334; geometry photometric loss 6.747 vs 1.269; placement CD 8.324 vs + 1.532; blend shape CD 0.904 vs 0.399. Paper: VLMs "particularly poorly in procedural material and geometry editing"; all open-source + models except MiniCPM failed to produce executable code on >75% of geometry instances. Verifier agreement with humans: human 0.79, + Claude 3.5 Sonnet 0.66, random 0.5. Scaling a small verifier (InternVL2-8B, k 1 -> 64 over 32 candidates) beat unscaled GPT-4o and + Claude 3.5 on blend shape. Low compute: less verification share (0.33); high compute: more (0.62-0.73). Models are 2024-25 era. Code + licence not in retrieved text. +- BenchCAD (arXiv 2605.10865): SEARCH; 17,900 CadQuery programs, 106 part families; frontier models recover coarse outer geometry but fail + faithful parametric programs; sweeps/lofts/twist-extrudes replaced by sketch-extrude; single-literal errors (5.6 vs 5.85) at IoU >= 0.9. + BenchCAD-Edit: text instruction sets the upper bound; the image is "at best a clarifier and at worst a distractor" for thinking models. +- Text2CAD-Bench (2605.18430): SEARCH; execution failures even at easy level; sweep/loft/shell widely fail; executing != correct. +- Text-to-B-Rep paper (2603.11831): SEARCH; spatial misalignment of primitives, omitted fillets, geometry contradicting described layout; + authors blame weak precise 3D spatial reasoning. +- "Foundation Models for Automatic CAD Generation" (2607.05573): SEARCH, single source; numeric analytic feedback peaked at round 1; VLM + critique of renders kept improving in rounds 2-3 for DeepSeek/Qwen; VLM critics struggle on rotationally symmetric geometry. +- Multi-view conditioning beat single-view and sketch on Chamfer/F-score in a B-Rep paper (SEARCH, not CadQuery). +- Target vs description: BlenderGym gives a target and still shows a large human gap; CAD-Recode and MeshCoder avoid prompting by training + point-cloud encoders; no controlled prompted-LLM study of target-vs-description was found. +- MindCube spatial study (SEARCH): errors 20% final reasoning step, 13% 3D reconstruction, 6% generated programs. + +## 5. Hard-surface specifics +- SDF rounding (Quilez distfunctions, SEARCH): sdRoundBox = box SDF minus r, an iso-offset so the shape grows by r. Polynomial smin with k + as blend band; Quilez marks smin as "bound" not exact. Chamfer/fillet operators not retrieved; KNOWLEDGE: hg_sdf (Mercury) has + fOpUnionChamfer / fOpUnionRound / fOpUnionStairs (unverified here). +- MeshCoder (FETCHED): no fillet/chamfer primitive; booleans, sweeps, bridge-loop, arrays only. +- BenchCAD / text-to-B-Rep (SEARCH): omitted fillets/refinement features named as failure; sweeps/lofts degrade to extrudes. +- CAD-Recode/DeepCAD data are sketch-extrude (SEARCH/KNOWLEDGE); fillet/chamfer not covered in what was retrieved. +- InverseCSG output: boolean of primitives, no blends (KNOWLEDGE). CAPRI-Net quadrics: smooth surface in one primitive (SEARCH). ResFit + primitive has a profile-roundness parameter (SEARCH). + +## Gaps +- Operator/agent words on why VibeGeometry failed: not indexed (see 0b). +- Not read at body level: CAD-Recode fillet handling, InverseCSG experiments, GlobFit relation list, SEIG numbers, ResFit results. +- Licences unverified: InverseCSG, ShapeAssembly, CAD-Recode repo, MeshCoder, GlobFit, CGAL Shape Detection, Point2CAD. diff --git a/docs/research/lattice-site-weight.md b/docs/research/lattice-site-weight.md new file mode 100644 index 00000000..c6bb0ac9 --- /dev/null +++ b/docs/research/lattice-site-weight.md @@ -0,0 +1,84 @@ +# Facts for `cultmath-tapes:question:lattice-site-weight-source` + +Agent eyes-lattice-site-weight, session self-2026-10-14-eureka, 2026-10-14. Facts only, no recommendation. +Marks: [src] source code, [doc] repo doc, [web] web page, [abs] absence found, [probe] measured by the scripts beside this file. +The eureka-state view of the question id failed (`view` wants a PipelineRef, not the id string); the question text was taken from the brief. + +## 1. What the fauna probe did (Aetheria 4354ef2c, read via `git show`) + +- [src] `docs/research/2026-10-14-trophic-dag-probe/trophic_probe.py` `lattice_web` (lines 95-119): per lattice cell `(cx,cz)` in a (2*WIN+1)^2 window (WIN=2): jittered site `(c+.5)*LAT` plus a drifting offset; weight `wt = (hash*.5+.5) * (1 + BOOST*prox)`, `prox = max over wells of exp(-(|site - well| / (2.2*.103*r))^2)`, BOOST 1.6; `d = hypot(...) * wt`; F1, F2 and a polynomial smooth-min `m` accumulated in loop order; output `max(soft^2, exp(-((f2-f1)/.10)^2))`. Wells orbit with zone time, so the site weight is a function of time. +- [src] The weight is read at the site's lattice position `(cx+.5)*LAT`, not at the query point and not at the drifted site. +- [doc] `docs/aetheria-fauna-map.md` B34: largest presence step for `lattice` .124 (8 steps over .1); "not discontinuities: a traced member's web value rises .03 per step for 5 steps, a thin weighted border sweeping a fixed candidate"; window 7x7 changes nothing; boost .6 removes the steps (.047); reading the lattice drift at the member's cycle start removes them at full boost (.011, `cyc.log`). +- [doc] Map r4 gap (1): "a 2D weighted lattice cellular with the smooth-min blend (her node) on `pcg3d` cells and zone time"; "The search window follows the weight range ... The CultMath node states the weight range it supports" (map lines 438, 444-446). +- [doc] Prior art doc `docs/research/2026-10-14-trophic-dag-filaments-prior-art.md` 1.1.7 [M]: power diagram evaluated pointwise by the same neighbour search "only if the search window is widened with the weight range"; marked "Neither derivation checked against a source". + +## 2. Literature and implementations + +- [web] Wikipedia, Weighted Voronoi diagram (https://en.wikipedia.org/wiki/Weighted_Voronoi_diagram): multiplicative = distance divided by positive site weight (circular Dirichlet tessellation, edges circular arcs and line segments); additive = weight subtracted from distance (hyperbolic Dirichlet tessellation, hyperbola arcs and segments); power diagram = weight subtracted from squared distance. A multiplicatively weighted cell may be non-convex, disconnected or hold holes. The page says nothing on continuity. +- [web] Sangil Lee, "Understanding the Variations of Cellular Noise" (https://sangillee.com/_posts/2025-04-18-Cellular-noises/): weighted Voronoi as effective distance `(1/w)*|x - seed|` with `w = 0.2 + 0.8 * random3(cell).z`, i.e. the per-site weight is a component of the hash of the lattice cell id, computed inside the noise function; the weighted example loops 5x5 instead of 3x3 (no reason given). +- [web] Inigo Quilez, Voronoise (https://iquilezles.org/articles/voronoise/): `hash3(cell id)` yields jitter in `.xy` and a per-cell value in `.z`; 5x5 window; notes `min()` is discontinuous and the smooth blend fixes that. No weighted variant. +- [web] Worley noise, Wikipedia and The Book of Shaders (https://thebookofshaders.com/12/): the standard is current cell plus neighbours (3x3), with a wider pass for exact borders; Worley's original used a variable number of points per cell. Nothing found on per-point weight attributes beyond the Lee article; the continuity guidance in the search results was general-knowledge reasoning, not sourced. +- [abs] No source found stating a continuity theorem for weighted Worley; no source found for a node that takes its per-site weight from an external field function. The only per-site weight mechanism found in shader writing is the hash of the cell id. +- [probe] Continuity as observed (section 4): F1 stays continuous as long as the window contains the true winner; failure occurs when it does not. + +## 3. CultMath today + +- [src] `F:\Projects\CultLib\packages\cultmath\src\CultMath\math.cs:909` `public static CultCellular cellular(float3 p)`: one argument, 3D, unweighted; sites `neighbor + jitter` with jitter from `pcg3d(int3(neighbor))` through `cellular_unit`; fixed 5x5x5 window with a per-offset lower-bound prune (`max(0,|d|-1)`), whose exactness proof (comment above the function) relies on the jitter being in [0,1) and on equal weights; returns `CultCellular { nearest = (grad F1, F1), edge = (grad(F2-F1), F2-F1), id = pcg4d of the winning cell mapped to [0,1) }` (`CultCellular.cs`). Hash is of the integer cell, never the float bits. +- [src] `math.cs:831-847` `smin_grad(float4 a, float4 b, float k)`: quadratic smooth-min with analytic gradient (value-and-gradient form). +- [src] `Voronoi.cs` (`Voronoi.SampleTones`, native `cultmath_apollonian_voronoi_tones`) is a UI-tone colour sampler over a hash-jittered field with a hard-coded 5x5 loop; takes x, y, tone, span; not a weighted-cell function. +- [abs] No function in CultMath takes a weight, a callback, or a site span; no weighted cellular, no per-site hash output exposed besides `id`. (Map B28 states the same.) HLSL twin at `shaders/CultMath.hlsl:440-503`. +- [doc] `packages/cultmath/docs/design.md` ~265-340: `cellular` section, search-radius proof and pruned/unpruned test pin. +- Fact for composition: `CultCellular.id` is already a per-cell hash scalar available to the caller after the call, but only for the winning cell, after F1/F2 are decided. + +## 4. Probe: where does the weight come from, 2D, 4 orbiting wells + +Scripts: `siteweight_probe.py`, `siteweight_probe2.py`; raw numbers `probe_results.json`, `probe_results2.json`. numpy, scratch; hash is a lowbias32-style integer hash (stand-in for pcg3d). Units: lattice cell = 1; domain [1,7]^2, 500x500 grid (600 for shape rows); wells with radii .6-1.2 cells orbiting a centre; weight `wt = base(.5..1) * (1 + B*prox)`, B = 1.6, WIN = 2, the fauna probe's smooth-min and border output. + +Correction (2026-10-14, from the Aetheria Self's body-Voronoi probe, Aetheria 05a44541): the fauna probe's `trophic_probe.py` weights at the cell centre `(cx+.5)*LAT` (section 1 above), which is the `cellc` variant below, not `site`. An earlier label here called `site` the fauna probe's method. + +Variants: `base` (no field); `site` (field at the jittered site position); `qpt` (field at the query point, same factor on every candidate); `cellc` (node calls the field at the integer cell centre, `cell + .5`, no jitter); `site_t0` (as `site` but field read at t=0 while wells have moved); `warp` (extra: query scaled `q*(1+B*prox(q))`). + +### 4a. Winner identity, fraction of grid pixels whose winning cell differs (t=0 / t=8) + +| variant | vs `site` | vs `base` | +|---|---|---| +| base | .147 / .156 | 0 / 0 | +| qpt | .147 / .156 | 0 / 0 (identical argmin to base) | +| cellc | .127 / .114 | .185 / .147 | +| site_t0 | 0 / .226 | .147 / .147 | +| warp | .675 / .646 | .668 / .639 | +| site | 0 / 0 | .147 / .156 | + +Mean absolute difference of the border output vs `site`: base .169/.186, qpt .168/.180, cellc .164/.156, site_t0 0/.234, warp .310/.280. Number of distinct cells on the grid: 53 for base, site and qpt; 54 cellc; 143/128 warp. + +[probe] `qpt` leaves every winner unchanged because the factor is common to all candidates; it changes F1, F2 and the smooth-min scale, which moves the border line (border pixel fraction near wells .164 vs .300 for base, far .250 vs .281). + +### 4b. Cell size and border near wells (pixels per cell, mean; "near" = within 1 well radius), t=0 + +| | near | far | border fraction near / far | +|---|---|---|---| +| base | 10951 | 10515 | .300 / .281 | +| site | 9672 | 11439 | .270 / .253 | +| qpt | 10951 | 10515 | .164 / .250 | +| cellc | 11562 | 12274 | .274 / .262 | +| warp | 3447 | 8566 | .291 / .302 | + +### 4c. Pop measure, dense spatial line (6001 points over 6 cells, step 1e-3 cell), max |step| of F1 and of output, window sweep vs window 6 reference + +- With the true winner inside the window, every variant's max F1 step is small (site .0010-.0033, qpt .0019-.0079, cellc .0009-.0041, warp .0054-.022, base .0007-.0013 per 1e-3). +- WIN=1 (3x3): `site` F1 error vs window 6 up to .174 (diagonal line, B=1.6; max output step .95); `cellc` .155-.194; `base` .0065; `qpt` .0092-.0113; `warp` none seen. At WIN=2 and B=1.6 all variants' F1 error is 0. +- Weight range: `site` at B=6 (weight ratio about 12:1), t=8, horizontal line: WIN=2 error .0169 (output step .371); WIN=3 error 0. +- Note: even `base` (weights .5-1, ratio 2) shows F1 error .0065 at WIN=1. + +### 4d. Pop measure, time at fixed query points (wells move), step refinement (worst point from a dt=.01 scan, refined) + +| variant | dt .01 max output step | dt 1e-3 | dt 1e-4 | dt 1e-5 | max F1 step at dt 1e-5 | +|---|---|---|---|---|---| +| site | .1083 | .01125 | .00113 | .000113 | 2.9e-6 | +| qpt | .00461 | .000461 | 4.6e-5 | 4.6e-6 | 4.1e-6 | +| cellc | .1060 | .0204 | .00206 | .000207 | 5.2e-6 | + +[probe] All three steps scale linearly with dt: no discontinuity in time for any variant when the window holds the winner. Winner-id changes over t in [0,20] at 4 query points (dt .01): base 0, qpt 0, site 17, cellc 15, site_t0 0. + +### 4e. Caveats of the probe +Static smooth proximity field, 4 wells, 2D, one seed of the hash; 3 boost values in the pop table only B=1.6 and 6.0; no gradient-bearing outputs measured; `cellc` field is sampled at the cell centre, so it differs from `site` by the jitter distance; no visual images rendered, only the numeric measures above. The `warp` variant is an addition outside the three asked and is reported for completeness. diff --git a/docs/research/lattice-site-weight/probe_results.json b/docs/research/lattice-site-weight/probe_results.json new file mode 100644 index 00000000..85177328 --- /dev/null +++ b/docs/research/lattice-site-weight/probe_results.json @@ -0,0 +1,559 @@ +{ + "grid": { + "t=0.0": { + "base": { + "winner_differs_from_site": 0.14684, + "winner_differs_from_base": 0.0, + "out_absdiff_vs_site_mean": 0.1692938271424024, + "out_absdiff_vs_site_max": 0.9999999999999667, + "n_cells": 53 + }, + "site": { + "winner_differs_from_site": 0.0, + "winner_differs_from_base": 0.14684, + "out_absdiff_vs_site_mean": 0.0, + "out_absdiff_vs_site_max": 0.0, + "n_cells": 53 + }, + "qpt": { + "winner_differs_from_site": 0.14684, + "winner_differs_from_base": 0.0, + "out_absdiff_vs_site_mean": 0.1679024745847925, + "out_absdiff_vs_site_max": 1.0, + "n_cells": 53 + }, + "cellc": { + "winner_differs_from_site": 0.126984, + "winner_differs_from_base": 0.184648, + "out_absdiff_vs_site_mean": 0.16449204766510442, + "out_absdiff_vs_site_max": 0.99999757371696, + "n_cells": 54 + }, + "warp": { + "winner_differs_from_site": 0.6748, + "winner_differs_from_base": 0.667952, + "out_absdiff_vs_site_mean": 0.31037303493350155, + "out_absdiff_vs_site_max": 1.0, + "n_cells": 143 + }, + "site_t0": { + "winner_differs_from_site": 0.0, + "winner_differs_from_base": 0.14684, + "out_absdiff_vs_site_mean": 0.0, + "out_absdiff_vs_site_max": 0.0, + "n_cells": 53 + }, + "site_window2_vs_window5_winner_differs": 0.0 + }, + "t=8.0": { + "base": { + "winner_differs_from_site": 0.155996, + "winner_differs_from_base": 0.0, + "out_absdiff_vs_site_mean": 0.18560227222422834, + "out_absdiff_vs_site_max": 0.9999999025356109, + "n_cells": 53 + }, + "site": { + "winner_differs_from_site": 0.0, + "winner_differs_from_base": 0.155996, + "out_absdiff_vs_site_mean": 0.0, + "out_absdiff_vs_site_max": 0.0, + "n_cells": 53 + }, + "qpt": { + "winner_differs_from_site": 0.155996, + "winner_differs_from_base": 0.0, + "out_absdiff_vs_site_mean": 0.17977625463968147, + "out_absdiff_vs_site_max": 0.999999999999996, + "n_cells": 53 + }, + "cellc": { + "winner_differs_from_site": 0.114268, + "winner_differs_from_base": 0.146552, + "out_absdiff_vs_site_mean": 0.1556440909167879, + "out_absdiff_vs_site_max": 0.9999919751523085, + "n_cells": 54 + }, + "warp": { + "winner_differs_from_site": 0.646396, + "winner_differs_from_base": 0.639384, + "out_absdiff_vs_site_mean": 0.2802002446118991, + "out_absdiff_vs_site_max": 1.0, + "n_cells": 128 + }, + "site_t0": { + "winner_differs_from_site": 0.226044, + "winner_differs_from_base": 0.14684, + "out_absdiff_vs_site_mean": 0.23360220832359216, + "out_absdiff_vs_site_max": 1.0, + "n_cells": 53 + }, + "site_window2_vs_window5_winner_differs": 0.0 + } + }, + "line_pop": { + "horizontal z=2.6 (near well 0)": { + "base t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.000679179751586656, + "maxjump_out_per_step": 0.011527150729375713, + "maxjump_f1_with_window6": 0.000679179751586656, + "f1_err_vs_win6": 0.0 + }, + "base t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.000679179751586656, + "maxjump_out_per_step": 0.011527150729375713, + "maxjump_f1_with_window6": 0.000679179751586656, + "f1_err_vs_win6": 0.0 + }, + "site t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0010050426622043585, + "maxjump_out_per_step": 0.016002826669016756, + "maxjump_f1_with_window6": 0.0010050426622043585, + "f1_err_vs_win6": 0.0 + }, + "site t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.0010050426622043585, + "maxjump_out_per_step": 0.016002826669016756, + "maxjump_f1_with_window6": 0.0010050426622043585, + "f1_err_vs_win6": 0.0 + }, + "site t=0.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.001918579519211816, + "maxjump_out_per_step": 0.03595224397909913, + "maxjump_f1_with_window6": 0.001918579519211816, + "f1_err_vs_win6": 0.0 + }, + "site t=0.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.001918579519211816, + "maxjump_out_per_step": 0.03595224397909913, + "maxjump_f1_with_window6": 0.001918579519211816, + "f1_err_vs_win6": 0.0 + }, + "qpt t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0019043178713147313, + "maxjump_out_per_step": 0.016796471326461004, + "maxjump_f1_with_window6": 0.0019043178713147313, + "f1_err_vs_win6": 0.0 + }, + "qpt t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.0019043178713147313, + "maxjump_out_per_step": 0.016796471326461004, + "maxjump_f1_with_window6": 0.0019043178713147313, + "f1_err_vs_win6": 0.0 + }, + "qpt t=0.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.0056772408954191, + "maxjump_out_per_step": 0.04338667429132481, + "maxjump_f1_with_window6": 0.0056772408954191, + "f1_err_vs_win6": 0.0 + }, + "qpt t=0.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.0056772408954191, + "maxjump_out_per_step": 0.04338667429132481, + "maxjump_f1_with_window6": 0.0056772408954191, + "f1_err_vs_win6": 0.0 + }, + "cellc t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.000899555983544964, + "maxjump_out_per_step": 0.028931107704223913, + "maxjump_f1_with_window6": 0.000899555983544964, + "f1_err_vs_win6": 0.0 + }, + "cellc t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.000899555983544964, + "maxjump_out_per_step": 0.028998803253634242, + "maxjump_f1_with_window6": 0.000899555983544964, + "f1_err_vs_win6": 0.0 + }, + "cellc t=0.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.001589550701590614, + "maxjump_out_per_step": 0.02212547196092063, + "maxjump_f1_with_window6": 0.001589550701590614, + "f1_err_vs_win6": 0.0 + }, + "cellc t=0.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.001589550701590614, + "maxjump_out_per_step": 0.02212547196092063, + "maxjump_f1_with_window6": 0.001589550701590614, + "f1_err_vs_win6": 0.0 + }, + "warp t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.005413713480415305, + "maxjump_out_per_step": 0.11861272322439464, + "maxjump_f1_with_window6": 0.005413713480415305, + "f1_err_vs_win6": 0.0 + }, + "warp t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.005413713480415305, + "maxjump_out_per_step": 0.6979479036971218, + "maxjump_f1_with_window6": 0.005413713480415305, + "f1_err_vs_win6": 0.0 + }, + "warp t=0.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.019199908363967788, + "maxjump_out_per_step": 0.28876383821796175, + "maxjump_f1_with_window6": 0.019199908363967788, + "f1_err_vs_win6": 0.0 + }, + "warp t=0.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.019199908363967788, + "maxjump_out_per_step": 0.28876383821796175, + "maxjump_f1_with_window6": 0.019199908363967788, + "f1_err_vs_win6": 0.0 + }, + "base t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.000679179751586656, + "maxjump_out_per_step": 0.011527150729375713, + "maxjump_f1_with_window6": 0.000679179751586656, + "f1_err_vs_win6": 0.0 + }, + "base t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.000679179751586656, + "maxjump_out_per_step": 0.011527150729375713, + "maxjump_f1_with_window6": 0.000679179751586656, + "f1_err_vs_win6": 0.0 + }, + "site t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0011605444949153165, + "maxjump_out_per_step": 0.03721603977227228, + "maxjump_f1_with_window6": 0.0011605444949153165, + "f1_err_vs_win6": 0.0 + }, + "site t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.0011605444949153165, + "maxjump_out_per_step": 0.037218919278060314, + "maxjump_f1_with_window6": 0.0011605444949153165, + "f1_err_vs_win6": 0.0 + }, + "site t=8.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.01726416929635244, + "maxjump_out_per_step": 0.37104796823449204, + "maxjump_f1_with_window6": 0.0024839789447830274, + "f1_err_vs_win6": 0.016881040623005106 + }, + "site t=8.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.0024839789447830274, + "maxjump_out_per_step": 0.045046050707719165, + "maxjump_f1_with_window6": 0.0024839789447830274, + "f1_err_vs_win6": 0.0 + }, + "qpt t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0019988841823728176, + "maxjump_out_per_step": 0.01873902874992317, + "maxjump_f1_with_window6": 0.0019988841823728176, + "f1_err_vs_win6": 0.0 + }, + "qpt t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.0019988841823728176, + "maxjump_out_per_step": 0.01873902874992317, + "maxjump_f1_with_window6": 0.0019988841823728176, + "f1_err_vs_win6": 0.0 + }, + "qpt t=8.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.005628071367035137, + "maxjump_out_per_step": 0.04897917252830741, + "maxjump_f1_with_window6": 0.005628071367035137, + "f1_err_vs_win6": 0.0 + }, + "qpt t=8.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.005628071367035137, + "maxjump_out_per_step": 0.04897917252830741, + "maxjump_f1_with_window6": 0.005628071367035137, + "f1_err_vs_win6": 0.0 + }, + "cellc t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0013893624582810293, + "maxjump_out_per_step": 0.0186819346008138, + "maxjump_f1_with_window6": 0.0013893624582810293, + "f1_err_vs_win6": 0.0 + }, + "cellc t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.0013893624582810293, + "maxjump_out_per_step": 0.02079886198517822, + "maxjump_f1_with_window6": 0.0013893624582810293, + "f1_err_vs_win6": 0.0 + }, + "cellc t=8.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.0033405760083177194, + "maxjump_out_per_step": 0.07493559630083158, + "maxjump_f1_with_window6": 0.0033405760083177194, + "f1_err_vs_win6": 0.0 + }, + "cellc t=8.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.0033405760083177194, + "maxjump_out_per_step": 0.07493559630083158, + "maxjump_f1_with_window6": 0.0033405760083177194, + "f1_err_vs_win6": 0.0 + }, + "warp t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.005131686955684001, + "maxjump_out_per_step": 0.10245451309831222, + "maxjump_f1_with_window6": 0.005131686955684001, + "f1_err_vs_win6": 0.0 + }, + "warp t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.005131686955684001, + "maxjump_out_per_step": 0.5048292489051344, + "maxjump_f1_with_window6": 0.005131686955684001, + "f1_err_vs_win6": 0.0 + }, + "warp t=8.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.01955931573768127, + "maxjump_out_per_step": 0.2975581851502386, + "maxjump_f1_with_window6": 0.01955931573768127, + "f1_err_vs_win6": 0.0 + }, + "warp t=8.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.01955931573768127, + "maxjump_out_per_step": 0.2975581851502386, + "maxjump_f1_with_window6": 0.01955931573768127, + "f1_err_vs_win6": 0.0 + } + }, + "diagonal": { + "base t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.001275910800458191, + "maxjump_out_per_step": 0.03528728288006466, + "maxjump_f1_with_window6": 0.001275910800458191, + "f1_err_vs_win6": 0.0 + }, + "base t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.006834249882349042, + "maxjump_out_per_step": 0.45027124784270633, + "maxjump_f1_with_window6": 0.001275910800458191, + "f1_err_vs_win6": 0.006469535309243879 + }, + "site t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0018160559768694018, + "maxjump_out_per_step": 0.036994428279204405, + "maxjump_f1_with_window6": 0.0018160559768694018, + "f1_err_vs_win6": 0.0 + }, + "site t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.17389687729083692, + "maxjump_out_per_step": 0.9512571305077048, + "maxjump_f1_with_window6": 0.0018160559768694018, + "f1_err_vs_win6": 0.17352236500589702 + }, + "site t=0.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.0032951968389483, + "maxjump_out_per_step": 0.08101849084444412, + "maxjump_f1_with_window6": 0.0032951968389483, + "f1_err_vs_win6": 0.0 + }, + "site t=0.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.0032951968389483, + "maxjump_out_per_step": 0.08049836455119364, + "maxjump_f1_with_window6": 0.0032951968389483, + "f1_err_vs_win6": 0.0 + }, + "qpt t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0026472302788482782, + "maxjump_out_per_step": 0.03868824720262809, + "maxjump_f1_with_window6": 0.0026472302788482782, + "f1_err_vs_win6": 0.0 + }, + "qpt t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.010707146916472454, + "maxjump_out_per_step": 0.21289370234612265, + "maxjump_f1_with_window6": 0.0026472302788482782, + "f1_err_vs_win6": 0.009199392603544854 + }, + "qpt t=0.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.007883634786070015, + "maxjump_out_per_step": 0.07213687421025916, + "maxjump_f1_with_window6": 0.007883634786070015, + "f1_err_vs_win6": 0.0 + }, + "qpt t=0.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.007883634786070015, + "maxjump_out_per_step": 0.07213687421025916, + "maxjump_f1_with_window6": 0.007883634786070015, + "f1_err_vs_win6": 0.0 + }, + "cellc t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0021042254469000876, + "maxjump_out_per_step": 0.03605934023336077, + "maxjump_f1_with_window6": 0.0021042254469000876, + "f1_err_vs_win6": 0.0 + }, + "cellc t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.15454958335751312, + "maxjump_out_per_step": 0.47361732317771077, + "maxjump_f1_with_window6": 0.0021042254469000876, + "f1_err_vs_win6": 0.15418392181872642 + }, + "cellc t=0.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.004089971897996092, + "maxjump_out_per_step": 0.04544931913493744, + "maxjump_f1_with_window6": 0.004089971897996092, + "f1_err_vs_win6": 0.0 + }, + "cellc t=0.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.004089971897996092, + "maxjump_out_per_step": 0.04544931913493744, + "maxjump_f1_with_window6": 0.004089971897996092, + "f1_err_vs_win6": 0.0 + }, + "warp t=0.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.007786414559647126, + "maxjump_out_per_step": 0.10615772398185219, + "maxjump_f1_with_window6": 0.007786414559647126, + "f1_err_vs_win6": 0.0 + }, + "warp t=0.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.007786414559647126, + "maxjump_out_per_step": 0.10615772398185219, + "maxjump_f1_with_window6": 0.007786414559647126, + "f1_err_vs_win6": 0.0 + }, + "warp t=0.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.0220788526153487, + "maxjump_out_per_step": 0.2726388272791984, + "maxjump_f1_with_window6": 0.0220788526153487, + "f1_err_vs_win6": 0.0 + }, + "warp t=0.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.0220788526153487, + "maxjump_out_per_step": 0.2726388272791984, + "maxjump_f1_with_window6": 0.0220788526153487, + "f1_err_vs_win6": 0.0 + }, + "base t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.001275910800458191, + "maxjump_out_per_step": 0.03528728288006466, + "maxjump_f1_with_window6": 0.001275910800458191, + "f1_err_vs_win6": 0.0 + }, + "base t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.006834249882349042, + "maxjump_out_per_step": 0.45027124784270633, + "maxjump_f1_with_window6": 0.001275910800458191, + "f1_err_vs_win6": 0.006469535309243879 + }, + "site t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.00155291340314212, + "maxjump_out_per_step": 0.04226739191047357, + "maxjump_f1_with_window6": 0.00155291340314212, + "f1_err_vs_win6": 0.0 + }, + "site t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.11344119297302535, + "maxjump_out_per_step": 0.3917028634066005, + "maxjump_f1_with_window6": 0.00155291340314212, + "f1_err_vs_win6": 0.11285505036112697 + }, + "site t=8.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.002453426564246408, + "maxjump_out_per_step": 0.03688685308461992, + "maxjump_f1_with_window6": 0.002453426564246408, + "f1_err_vs_win6": 0.0 + }, + "site t=8.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.002453426564246408, + "maxjump_out_per_step": 0.03688685308461992, + "maxjump_f1_with_window6": 0.002453426564246408, + "f1_err_vs_win6": 0.0 + }, + "qpt t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0018171966866530331, + "maxjump_out_per_step": 0.03560130205583023, + "maxjump_f1_with_window6": 0.0018171966866530331, + "f1_err_vs_win6": 0.0 + }, + "qpt t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.011573594040749535, + "maxjump_out_per_step": 0.44945714067888365, + "maxjump_f1_with_window6": 0.0018171966866530331, + "f1_err_vs_win6": 0.011263134181283219 + }, + "qpt t=8.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.004178672365624969, + "maxjump_out_per_step": 0.06700822884555246, + "maxjump_f1_with_window6": 0.004178672365624969, + "f1_err_vs_win6": 0.0 + }, + "qpt t=8.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.004178672365624969, + "maxjump_out_per_step": 0.06700822884555246, + "maxjump_f1_with_window6": 0.004178672365624969, + "f1_err_vs_win6": 0.0 + }, + "cellc t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.0013657606892926166, + "maxjump_out_per_step": 0.03848639655536479, + "maxjump_f1_with_window6": 0.0013657606892926166, + "f1_err_vs_win6": 0.0 + }, + "cellc t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.19448286979973972, + "maxjump_out_per_step": 0.9778972151563999, + "maxjump_f1_with_window6": 0.0013657606892926166, + "f1_err_vs_win6": 0.1940193666886757 + }, + "cellc t=8.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.0016119831862634326, + "maxjump_out_per_step": 0.05348368104496215, + "maxjump_f1_with_window6": 0.0016119831862634326, + "f1_err_vs_win6": 0.0 + }, + "cellc t=8.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.0016119831862634326, + "maxjump_out_per_step": 0.05348368104496215, + "maxjump_f1_with_window6": 0.0016119831862634326, + "f1_err_vs_win6": 0.0 + }, + "warp t=8.0 B=1.6 WIN=2": { + "maxjump_f1_per_step": 0.00389655575000758, + "maxjump_out_per_step": 0.06278112824237458, + "maxjump_f1_with_window6": 0.00389655575000758, + "f1_err_vs_win6": 0.0 + }, + "warp t=8.0 B=1.6 WIN=1": { + "maxjump_f1_per_step": 0.00389655575000758, + "maxjump_out_per_step": 0.4429137542853424, + "maxjump_f1_with_window6": 0.00389655575000758, + "f1_err_vs_win6": 0.0 + }, + "warp t=8.0 B=6.0 WIN=2": { + "maxjump_f1_per_step": 0.012386023943556368, + "maxjump_out_per_step": 0.1972931166165931, + "maxjump_f1_with_window6": 0.012386023943556368, + "f1_err_vs_win6": 0.0 + }, + "warp t=8.0 B=6.0 WIN=3": { + "maxjump_f1_per_step": 0.012386023943556368, + "maxjump_out_per_step": 0.1972931166165931, + "maxjump_f1_with_window6": 0.012386023943556368, + "f1_err_vs_win6": 0.0 + } + } + }, + "time_pop": { + "base": { + "maxjump_f1_per_dt": 0.0, + "maxjump_out_per_dt": 0.0, + "winner_changes_total": 0 + }, + "site": { + "maxjump_f1_per_dt": 0.006243969970252006, + "maxjump_out_per_dt": 0.10827554277384255, + "winner_changes_total": 17 + }, + "qpt": { + "maxjump_f1_per_dt": 0.004880867091880958, + "maxjump_out_per_dt": 0.004611044852681684, + "winner_changes_total": 0 + }, + "cellc": { + "maxjump_f1_per_dt": 0.006179970448791816, + "maxjump_out_per_dt": 0.10604425529368433, + "winner_changes_total": 15 + }, + "site_t0": { + "maxjump_f1_per_dt": 0.0, + "maxjump_out_per_dt": 0.0, + "winner_changes_total": 0 + } + } +} \ No newline at end of file diff --git a/docs/research/lattice-site-weight/probe_results2.json b/docs/research/lattice-site-weight/probe_results2.json new file mode 100644 index 00000000..ab7ce6fb --- /dev/null +++ b/docs/research/lattice-site-weight/probe_results2.json @@ -0,0 +1,140 @@ +{ + "timejump site dt=0.01": { + "q": [ + 2.3, + 2.8 + ], + "t_worst": 9.91, + "max_out_step": 0.10827554277384255, + "max_f1_step": 0.0028572323710521763 + }, + "timejump site dt=0.001": { + "q": [ + 2.3, + 2.8 + ], + "t_worst": 9.91, + "max_out_step": 0.011248851985623975, + "max_f1_step": 0.00028847749905558384 + }, + "timejump site dt=0.0001": { + "q": [ + 2.3, + 2.8 + ], + "t_worst": 9.91, + "max_out_step": 0.00113067110268672, + "max_f1_step": 2.8874698390524145e-05 + }, + "timejump site dt=1e-05": { + "q": [ + 2.3, + 2.8 + ], + "t_worst": 9.91, + "max_out_step": 0.00011316362556801352, + "max_f1_step": 2.8877387294734547e-06 + }, + "timejump qpt dt=0.01": { + "q": [ + 5.9, + 1.9 + ], + "t_worst": 16.21, + "max_out_step": 0.00461104485268235, + "max_f1_step": 0.004042127425204045 + }, + "timejump qpt dt=0.001": { + "q": [ + 5.9, + 1.9 + ], + "t_worst": 16.21, + "max_out_step": 0.0004611240505579539, + "max_f1_step": 0.000406360115853599 + }, + "timejump qpt dt=0.0001": { + "q": [ + 5.9, + 1.9 + ], + "t_worst": 16.21, + "max_out_step": 4.611242486959877e-05, + "max_f1_step": 4.065726355373389e-05 + }, + "timejump qpt dt=1e-05": { + "q": [ + 5.9, + 1.9 + ], + "t_worst": 16.21, + "max_out_step": 4.611242504171109e-06, + "max_f1_step": 4.065938649877587e-06 + }, + "timejump cellc dt=0.01": { + "q": [ + 5.9, + 1.9 + ], + "t_worst": 0.39, + "max_out_step": 0.10604425529368433, + "max_f1_step": 0.005110972264514513 + }, + "timejump cellc dt=0.001": { + "q": [ + 5.9, + 1.9 + ], + "t_worst": 0.39, + "max_out_step": 0.020376801353283347, + "max_f1_step": 0.0005172341605852449 + }, + "timejump cellc dt=0.0001": { + "q": [ + 5.9, + 1.9 + ], + "t_worst": 0.39, + "max_out_step": 0.002064834070920063, + "max_f1_step": 5.178482072565327e-05 + }, + "timejump cellc dt=1e-05": { + "q": [ + 5.9, + 1.9 + ], + "t_worst": 0.39, + "max_out_step": 0.00020688477103125713, + "max_f1_step": 5.179096147611695e-06 + }, + "shape base": { + "mean_cell_pixels_near_wells": 10951.06215310558, + "mean_cell_pixels_far": 10515.08654105133, + "border_frac_near": 0.3004222385907398, + "border_frac_far": 0.28125746844758714 + }, + "shape site": { + "mean_cell_pixels_near_wells": 9671.733834071645, + "mean_cell_pixels_far": 11438.643308839986, + "border_frac_near": 0.2704401863244494, + "border_frac_far": 0.25280623954417336 + }, + "shape qpt": { + "mean_cell_pixels_near_wells": 10951.06215310558, + "mean_cell_pixels_far": 10515.08654105133, + "border_frac_near": 0.1644136900747995, + "border_frac_far": 0.2500635410778843 + }, + "shape cellc": { + "mean_cell_pixels_near_wells": 11562.292900789493, + "mean_cell_pixels_far": 12273.640744435888, + "border_frac_near": 0.27424759572989177, + "border_frac_far": 0.2618651108270203 + }, + "shape warp": { + "mean_cell_pixels_near_wells": 3446.9220259152826, + "mean_cell_pixels_far": 8566.10048594699, + "border_frac_near": 0.29084665580811486, + "border_frac_far": 0.3016702768114897 + } +} \ No newline at end of file diff --git a/docs/research/lattice-site-weight/siteweight_probe.py b/docs/research/lattice-site-weight/siteweight_probe.py new file mode 100644 index 00000000..a134dd58 --- /dev/null +++ b/docs/research/lattice-site-weight/siteweight_probe.py @@ -0,0 +1,123 @@ +"""Scratch probe: where does a weighted lattice Voronoi cell get its weight? +2D, lattice cell = 1 unit, wells with a proximity field, numpy only. +Variants of the per-site weight wt_i (multiplies the distance to site i, as the fauna probe's lattice_web): + base : wt = hashed .5..1, no field (reference, the unweighted-by-field node) + site : wt = base*(1+B*prox(site position, t)) (fauna probe, 4354ef2c) + qpt : wt = base*(1+B*prox(query position, t)) (common factor for every candidate site) + cellc : wt = base*(1+B*prox(lattice cell centre, t)) (node calls the field at the integer cell id) + site_t0: as site, but field read at t=0 (stale time) while wells have moved + warp : base weights, query warped q' = q*(1+B*prox(q)) (domain scaling, a different construct) +""" +import numpy as np, sys, json +rng_seed = 7 +def hash01(ix, iz, k): + # integer hash (lowbias32-style), stand-in for pcg3d; deterministic, vectorised + x = (ix.astype(np.uint64)*np.uint64(73856093) ^ iz.astype(np.uint64)*np.uint64(19349663) ^ np.uint64(k*83492791+rng_seed)) & np.uint64(0xFFFFFFFF) + x ^= x >> np.uint64(16); x = (x*np.uint64(0x7feb352d)) & np.uint64(0xFFFFFFFF) + x ^= x >> np.uint64(15); x = (x*np.uint64(0x846ca68b)) & np.uint64(0xFFFFFFFF) + x ^= x >> np.uint64(16) + return (x >> np.uint64(8)).astype(np.float64)/16777216.0 + +W0 = np.array([[2.0,2.5],[5.5,4.0],[3.5,6.0],[6.5,1.5]]); WS = np.array([0.8,1.2,0.6,1.0]) +OM = np.array([0.30,-0.22,0.17,-0.41]) # well orbit rate, rad per unit t (wells orbit a centre) +CEN = np.array([4.0,4.0]) +def wells(t): + r = W0-CEN; c, s = np.cos(OM*t), np.sin(OM*t) + return CEN + np.stack([r[:,0]*c-r[:,1]*s, r[:,0]*s+r[:,1]*c], 1) +def prox(x, z, t): + w = wells(t); out = 0 + for k in range(len(w)): + out = np.maximum(out, np.exp(-(np.hypot(x-w[k,0], z-w[k,1])/WS[k])**2)) + return out + +KW=.35 +def node(qx, qz, variant, t=0.0, B=1.6, WIN=2, tfield=None): + """returns f1, f2, winning cell id (ix*10007+iz), soft border value""" + qx0, qz0 = qx, qz + if variant == 'warp': + s = 1+B*prox(qx, qz, t); qx, qz = qx*s, qz*s + nx, nz = np.floor(qx), np.floor(qz) + m = np.full(qx.shape, 8.0); f1 = m.copy(); f2 = m.copy(); wid = np.zeros(qx.shape) + pq = prox(qx0, qz0, t) + tf = t if tfield is None else tfield + for j in range(-WIN, WIN+1): + for i in range(-WIN, WIN+1): + cx, cz = nx+i, nz+j + ox, oz = hash01(cx, cz, 11), hash01(cx, cz, 12) + base = hash01(cx, cz, 13)*.5+.5 + sx, sz = cx+ox, cz+oz + if variant in ('base','warp'): wt = base + elif variant == 'site': wt = base*(1+B*prox(sx, sz, tf)) + elif variant == 'site_t0': wt = base*(1+B*prox(sx, sz, 0.0)) + elif variant == 'cellc': wt = base*(1+B*prox(cx+.5, cz+.5, tf)) + elif variant == 'qpt': wt = base*(1+B*pq) + d = np.hypot(sx-qx, sz-qz)*wt + upd1 = d < f1; upd2 = (~upd1) & (d < f2) + wid = np.where(upd1, cx*10007+cz, wid) + f2 = np.where(upd1, f1, np.where(upd2, d, f2)); f1 = np.where(upd1, d, f1) + h = (lambda u: u*u*(3-2*u))(np.clip(.5+.5*(m-d)/KW, 0, 1)) + m = m+(d-m)*h-h*(1-h)*KW/(1+3*KW) + gap0 = .25*KW/(1+3*KW) + soft = np.clip((f1-m)/gap0, 0, 1) + out = np.maximum(soft**2, np.exp(-((f2-f1)/.10)**2)) + return f1, f2, wid, out + +def grid(n=500, lo=1.0, hi=7.0): + xs = np.linspace(lo, hi, n); X, Z = np.meshgrid(xs, xs); return X, Z + +def main(): + R = {} + X, Z = grid() + for t in (0.0, 8.0): + ref = {v: node(X, Z, v, t) for v in ('base','site','qpt','cellc','warp')} + ref['site_t0'] = node(X, Z, 'site_t0', t) + # large-window truth for 'site' (exact argmin unless window too small) + truth = node(X, Z, 'site', t, WIN=5)[2] + key = f"t={t}"; R[key] = {} + for v, (f1, f2, wid, out) in ref.items(): + R[key][v] = dict( + winner_differs_from_site=float((wid != ref['site'][2]).mean()), + winner_differs_from_base=float((wid != ref['base'][2]).mean()), + out_absdiff_vs_site_mean=float(np.abs(out-ref['site'][3]).mean()), + out_absdiff_vs_site_max=float(np.abs(out-ref['site'][3]).max()), + n_cells=int(len(np.unique(wid)))) + R[key]['site_window2_vs_window5_winner_differs'] = float((ref['site'][2] != truth).mean()) + # cell count density near wells for site vs base + # pop measure: dense line, step 1e-3 units; also jumps in time at fixed q + ts = np.linspace(1.0, 7.0, 6001) # 1e-3 + lines = {'horizontal z=2.6 (near well 0)': (ts, np.full_like(ts, 2.6)), + 'diagonal': (ts, 1.0+ts*0.9-0.5)} + P = {} + for ln, (lx, lz) in lines.items(): + P[ln] = {} + for t in (0.0, 8.0): + for v in ('base','site','qpt','cellc','warp'): + for B, WIN in ((1.6,2),(1.6,1),(6.0,2),(6.0,3)): + if v in ('base',) and B != 1.6: continue + f1, f2, wid, out = node(lx, lz, v, t, B, WIN) + ref = node(lx, lz, v, t, B, 6) + P[ln][f"{v} t={t} B={B} WIN={WIN}"] = dict( + maxjump_f1_per_step=float(np.abs(np.diff(f1)).max()), + maxjump_out_per_step=float(np.abs(np.diff(out)).max()), + maxjump_f1_with_window6=float(np.abs(np.diff(ref[0])).max()), + f1_err_vs_win6=float(np.abs(f1-ref[0]).max())) + # time pop: fixed query points, t stepped at 1e-2; wells move + tt = np.linspace(0, 20, 2001) + qs = [(2.3,2.8),(4.7,3.9),(3.5,5.5),(5.9,1.9)] + T = {} + for v in ('base','site','qpt','cellc','site_t0'): + mj = 0; mo = 0; changes = 0 + for (qx, qz) in qs: + f1s=[];outs=[];wids=[] + for t in tt: + a,b,w,o = node(np.array([qx]), np.array([qz]), v, t) + f1s.append(a[0]); outs.append(o[0]); wids.append(w[0]) + mj=max(mj,np.abs(np.diff(f1s)).max()); mo=max(mo,np.abs(np.diff(outs)).max()) + changes += int((np.diff(wids)!=0).sum()) + T[v] = dict(maxjump_f1_per_dt=float(mj), maxjump_out_per_dt=float(mo), winner_changes_total=changes) + json.dump(dict(grid=R, line_pop=P, time_pop=T), open('probe_results.json','w'), indent=1) + print(json.dumps(R, indent=1)); print(json.dumps(T, indent=1)) + for ln in P: + print(ln) + for k,v in P[ln].items(): print(' ', k, {a: round(b,5) for a,b in v.items()}) +main() diff --git a/docs/research/lattice-site-weight/siteweight_probe2.py b/docs/research/lattice-site-weight/siteweight_probe2.py new file mode 100644 index 00000000..172f5549 --- /dev/null +++ b/docs/research/lattice-site-weight/siteweight_probe2.py @@ -0,0 +1,37 @@ +"""Follow-up: (1) continuity refinement: does the max time-jump of 'site' scale with dt? (2) cell size near vs far from wells, +border-pixel fraction per variant.""" +import numpy as np, json, importlib.util, sys, io, contextlib +spec = importlib.util.spec_from_file_location('p', 'siteweight_probe.py') +src = open('siteweight_probe.py').read().replace('\nmain()\n', '\n') # import without running main +ns = {}; exec(compile(src, 'p', 'exec'), ns) +node, prox, grid, wells = ns['node'], ns['prox'], ns['grid'], ns['wells'] +res = {} +# (1) worst time step at dt=.01 for each variant, then refine dt inside +-.02 of it (continuity: step should shrink ~ with dt) +qs = [(2.3,2.8),(4.7,3.9),(3.5,5.5),(5.9,1.9)] +def series(v, qx, qz, tt): + f1 = np.empty(len(tt)); out = np.empty(len(tt)) + for k, t in enumerate(tt): + a,b,w,o = node(np.array([qx]), np.array([qz]), v, t); f1[k]=a[0]; out[k]=o[0] + return f1, out +for v in ('site','qpt','cellc'): + tt = np.arange(0, 20.0001, 0.01); best = (0, None, None) + for qx, qz in qs: + f1, out = series(v, qx, qz, tt); i = int(np.argmax(np.abs(np.diff(out)))) + if abs(out[i+1]-out[i]) > best[0]: best = (abs(out[i+1]-out[i]), (qx,qz), tt[i]) + _, q, t0 = best + for dt in (0.01, 0.001, 0.0001, 0.00001): + t2 = np.arange(t0-0.02, t0+0.03, dt); f1, out = series(v, q[0], q[1], t2) + res[f"timejump {v} dt={dt}"] = dict(q=q, t_worst=float(t0), max_out_step=float(np.abs(np.diff(out)).max()), max_f1_step=float(np.abs(np.diff(f1)).max())) + print(v, dt, res[f"timejump {v} dt={dt}"], flush=True) +# (2) cell area near vs far wells, border fraction +X, Z = grid(600) +w = wells(0.0) +near = np.min([np.hypot(X-w[k,0], Z-w[k,1])/ns['WS'][k] for k in range(4)], axis=0) < 1.0 +for v in ('base','site','qpt','cellc','warp'): + f1,f2,wid,out = node(X, Z, v, 0.0) + ids, cnt = np.unique(wid, return_counts=True); area = dict(zip(ids, cnt)) + pa = np.array([area[i] for i in wid.ravel()]).reshape(wid.shape) + res[f"shape {v}"] = dict(mean_cell_pixels_near_wells=float(pa[near].mean()), mean_cell_pixels_far=float(pa[~near].mean()), + border_frac_near=float((out[near]>.5).mean()), border_frac_far=float((out[~near]>.5).mean())) + print(v, res[f"shape {v}"]) +json.dump(res, open('probe_results2.json','w'), indent=1) diff --git a/docs/research/lattice-site-weight/weighted-node/a.py b/docs/research/lattice-site-weight/weighted-node/a.py new file mode 100644 index 00000000..3f090668 --- /dev/null +++ b/docs/research/lattice-site-weight/weighted-node/a.py @@ -0,0 +1,11 @@ +import numpy as np, probe as P +g = np.linspace(-3200, 3200, 260); X, Z = np.meshgrid(g, g); q = np.stack([X, Z], -1) +rng = np.random.default_rng(3); ang = rng.uniform(0, 6.283, X.shape); nrm = np.stack([np.cos(ang), np.sin(ang)], -1) +for boost, S in [(1.6, 1), (1.6, 2), (4, 1), (4, 2), (9, 1)]: + ref = P.node(q, 100.0, 9, boost, S, nrm) + row = [] + for W in (2, 3, 4, 5): + r = P.node(q, 100.0, W, boost, S, nrm) + miss = np.mean((np.abs(r[0]-ref[0])>1e-12)|(np.abs(r[1]-ref[1])>1e-12)) + row.append(f"W{W}: miss {miss:.5f} dOut {np.abs(r[3]-ref[3]).max():.3f}") + print(f"boost {boost} S {S} ratio {2*(1+boost):.1f}x{S}:", "; ".join(row)) diff --git a/docs/research/lattice-site-weight/weighted-node/c.py b/docs/research/lattice-site-weight/weighted-node/c.py new file mode 100644 index 00000000..be65bb9d --- /dev/null +++ b/docs/research/lattice-site-weight/weighted-node/c.py @@ -0,0 +1,10 @@ +import numpy as np, probe as P +g = (np.arange(-12, 12) + .5) * 260; X, Z = np.meshgrid(g, g); c = np.stack([X, Z], -1).reshape(-1, 2) +for ex in (False, True): + prev = None; worst = 0; big = 0 + for t in np.arange(0, 300, 1/60): + Pw = np.exp(-(P.border(c, P.bodies(t), ex) / P.FALL) ** 2) + if prev is not None: + s = np.abs(Pw - prev); worst = max(worst, s.max()); big += (s > .01).sum() + prev = Pw + print("exact" if ex else "first-order", f"cell-centre profile: max step per 1/60 s {worst:.4f}, steps > .01: {big} (576 centres x 18000 ticks)") diff --git a/docs/research/lattice-site-weight/weighted-node/d3.py b/docs/research/lattice-site-weight/weighted-node/d3.py new file mode 100644 index 00000000..d718dee9 --- /dev/null +++ b/docs/research/lattice-site-weight/weighted-node/d3.py @@ -0,0 +1,9 @@ +import numpy as np, probe as P +rng = np.random.default_rng(9); n = 15000 +kx = rng.integers(-12, 12, n); z = rng.uniform(-3100, 3100, n); eps = 1e-6 +qa = np.stack([kx * 260.0 - eps, z], -1)[None]; qb = np.stack([kx * 260.0 + eps, z], -1)[None] +for W, fold, boost, S in [(6,"f1kw",1.6,2),(6,"her",1.6,2),(6,"f1kw",4,2)]: + ang = rng.uniform(0, 6.283, n); nrm = np.stack([np.cos(ang), np.sin(ang)], -1)[None] + a = P.node(qa, 100.0, W, boost, S, nrm, True, fold); b = P.node(qb, 100.0, W, boost, S, nrm, True, fold) + j = np.abs(a[3] - b[3]); js = np.abs(a[2]-b[2]); jf = np.abs(a[0]-b[0]) + print(f"W{W} {fold} B{boost} S{S}: cell-boundary jump out max {j.max():.4f} (>.01: {np.mean(j>.01):.4f}), soft max {js.max():.4f}, F1 max {jf.max():.2e}") diff --git a/docs/research/lattice-site-weight/weighted-node/e.py b/docs/research/lattice-site-weight/weighted-node/e.py new file mode 100644 index 00000000..e3735ab9 --- /dev/null +++ b/docs/research/lattice-site-weight/weighted-node/e.py @@ -0,0 +1,13 @@ +import numpy as np, probe as P +g = np.linspace(-3200, 3200, 200); X, Z = np.meshgrid(g, g); q = np.stack([X, Z], -1) +rng = np.random.default_rng(3); ang = rng.uniform(0, 6.283, X.shape); nrm = np.stack([np.cos(ang), np.sin(ang)], -1) +wmin = .5 +for boost, S in [(1.6, 1), (1.6, 2), (4, 2), (9, 1)]: + f1, f2, soft, out = P.node(q, 100.0, 6, boost, S, nrm) + C = np.maximum(f2, f1 + P.KW) + k = np.floor(C / wmin).astype(int) + 1 # first ring whose lower bound (k-1)*wmin >= C is excluded... rings visited 0..k + k = np.ceil(C / wmin).astype(int) # rings 0..k visited (ring k+1 has lb k*wmin >= C) + cells = (2 * k + 1) ** 2 + wmax = 1.0 * (1 + boost); Usound = 1.58 * wmax * S + Wsound = int(np.ceil((Usound + P.KW) / wmin)) + print(f"B{boost} S{S}: rings needed p50 {np.median(k):.0f} p99 {np.percentile(k,99):.0f} max {k.max()} -> cells p50 {np.median(cells):.0f} max {cells.max()}; worst-case sound W {Wsound} ({(2*Wsound+1)**2} cells)") diff --git a/docs/research/lattice-site-weight/weighted-node/g.py b/docs/research/lattice-site-weight/weighted-node/g.py new file mode 100644 index 00000000..14c9049a --- /dev/null +++ b/docs/research/lattice-site-weight/weighted-node/g.py @@ -0,0 +1,14 @@ +import numpy as np, probe as P, sys +fold = sys.argv[1]; rng = np.random.default_rng(2); jm = js = 0; nsw = 0 +for k in range(3): + o = rng.uniform(-2500, 2500, 2); a = rng.uniform(0, 3.1416); d = np.array([np.cos(a), np.sin(a)]) + s = np.arange(0, 15 * 260, .5); P.node((o + s[:, None] * d)[None], 100.0, 3, 1.6, 1.0, None, True, fold); a1 = P.node.a1[0].copy() + idx = np.nonzero(np.diff(a1))[0][:40] + lo = s[idx]; hi = s[idx + 1]; ref = a1[idx] + for _ in range(40): + mid = .5 * (lo + hi); P.node((o + mid[:, None] * d)[None], 100.0, 3, 1.6, 1.0, None, True, fold) + same = P.node.a1[0] == ref; lo = np.where(same, mid, lo); hi = np.where(same, hi, mid) + ra = P.node((o + lo[:, None] * d)[None], 100.0, 3, 1.6, 1.0, None, True, fold); ma = P.node.m[0].copy() + rb = P.node((o + hi[:, None] * d)[None], 100.0, 3, 1.6, 1.0, None, True, fold); mb = P.node.m[0] + jm = max(jm, np.abs(ma - mb).max()); js = max(js, np.abs(ra[2] - rb[2]).max()); nsw += len(idx) +print(fold, f"F1 swaps {nsw}: max jump m {jm:.2e}, soft {js:.2e}") diff --git a/docs/research/lattice-site-weight/weighted-node/h.py b/docs/research/lattice-site-weight/weighted-node/h.py new file mode 100644 index 00000000..2cd3d10d --- /dev/null +++ b/docs/research/lattice-site-weight/weighted-node/h.py @@ -0,0 +1,6 @@ +import numpy as np, probe as P +g = np.linspace(-3200, 3200, 200); X, Z = np.meshgrid(g, g); q = np.stack([X, Z], -1) +rng = np.random.default_rng(3); ang = rng.uniform(0, 6.283, X.shape); nrm = np.stack([np.cos(ang), np.sin(ang)], -1) +for S in (1, 2): + a = P.node(q, 100.0, 6, 1.6, S, nrm, True, "her"); b = P.node(q, 100.0, 6, 1.6, S, nrm, True, "f1kw") + d = np.abs(a[3] - b[3]); print(f"S{S} look her vs f1kw: mean {d.mean():.4f} p99 {np.percentile(d,99):.3f} max {d.max():.3f}; mean out {a[3].mean():.3f}") diff --git a/docs/research/lattice-site-weight/weighted-node/probe.py b/docs/research/lattice-site-weight/weighted-node/probe.py new file mode 100644 index 00000000..cb596847 --- /dev/null +++ b/docs/research/lattice-site-weight/weighted-node/probe.py @@ -0,0 +1,60 @@ +"""Weighted lattice cellular probe (Imagination, lattice-weighted-cellular). numpy, float64. +Bodies orbit (period = distance s). Cell weight = base(hash)*(1+BOOST*exp(-(border(centre)/FALL)^2)), +border over the bodies' power scores (site.w = sigma). Her fold: row-major, m from 8; variant m0f1 starts m at F1.""" +import numpy as np, sys +LAT, FALL, KW, EW, OMEGA = 260.0, 120.0, .35, .10, .05 +GAP0 = .25 * KW / (1 + 3 * KW) +rng = np.random.default_rng(7) +NB = 6 +DIST = np.array([0.0, 700, 1200, 1800, 2400, 3000]); PH = rng.uniform(0, 6.283, NB) +SIG = np.array([1500, 300, 450, 350, 900, 600]) / np.sqrt(128.0) * 4 # sigma ratio 5:1, edges well inside +def bodies(t): + a = PH + np.where(DIST > 0, 2 * np.pi * t / np.maximum(DIST, 1), 0) + return np.stack([np.cos(a) * DIST, np.sin(a) * DIST], -1) + +def h32(x): + x = x.astype(np.uint32) + x ^= x >> 16; x *= np.uint32(0x7feb352d); x ^= x >> 15; x *= np.uint32(0x846ca68b); x ^= x >> 16 + return x +def hash01(cx, cz, s): + k = ((cx.astype(np.int64) * 73856093) ^ (cz.astype(np.int64) * 19349663) ^ (s * 83492791)) & 0xffffffff + return (h32(h32(k)) >> 8) / 16777216.0 + +def border(q, B, exact): + """q: (...,2). Power border distance over bodies B.""" + sc = ((q[..., None, :] - B) ** 2).sum(-1) - SIG ** 2 + o = np.argsort(sc, -1); i1 = o[..., 0]; i2 = o[..., 1] + s1 = B[i1] + if not exact: + s2 = B[i2]; return (np.take_along_axis(sc, i2[..., None], -1)[..., 0] - np.take_along_axis(sc, i1[..., None], -1)[..., 0]) / (2 * np.linalg.norm(s2 - s1, axis=-1)) + best = np.full(q.shape[:-1], 1e30) + w1 = SIG[i1] + for k in range(NB): + d = B[k] - s1; L = np.linalg.norm(d, axis=-1) + pl = np.maximum((((s1 - q) * d).sum(-1) + .5 * ((d * d).sum(-1) + w1 ** 2 - SIG[k] ** 2)) / np.where(L > 0, L, 1), 0) + best = np.where((L > 0) & (pl < best), pl, best) + return best + +def node(q, t, W, boost, S=1.0, nrm=None, exact=True, fold="her"): + B = bodies(t); p = q / LAT; n = np.floor(p); f = p - n + if nrm is None: nrm = np.zeros_like(q); nrm[..., 0] = 1 + ds = [] + for j in range(-W, W + 1): + for i in range(-W, W + 1): + cx, cz = n[..., 0] + i, n[..., 1] + j + base = .5 + .5 * hash01(cx, cz, 1) + P = np.exp(-(border(np.stack([(cx + .5) * LAT, (cz + .5) * LAT], -1), B, exact) / FALL) ** 2) + wt = base * (1 + boost * P) + ox = .5 + .5 * np.sin(OMEGA * t + 6.2831 * hash01(cx, cz, 2)); oz = .5 + .5 * np.sin(OMEGA * t + 6.2831 * hash01(cx, cz, 3)) + vx, vz = i - f[..., 0] + ox, j - f[..., 1] + oz + a = vx * nrm[..., 0] + vz * nrm[..., 1]; c = -vx * nrm[..., 1] + vz * nrm[..., 0] + ds.append(np.hypot(S * a, c) * wt) + D = np.stack(ds, -1); srt = np.sort(D, -1); f1, f2 = srt[..., 0], srt[..., 1]; a1 = np.argmin(D, -1) + m = np.full(f1.shape, 8.0) if fold == "her" else (f1 + KW if fold == "f1kw" else f1.copy()) + for k in range(D.shape[-1]): + d = D[..., k] + h = np.clip(.5 + .5 * (m - d) / KW, 0, 1); h = h * h * (3 - 2 * h) + mn = m + (d - m) * h - h * (1 - h) * KW / (1 + 3 * KW) + m = np.where((fold == "m0f1") & (a1 == k), m, mn) + soft = np.clip((f1 - m) / GAP0, 0, 1); node.m = m; node.a1 = a1 + return f1, f2, soft, np.maximum(soft ** 2, np.exp(-((f2 - f1) / EW) ** 2)) diff --git a/docs/research/native-shader-probes.md b/docs/research/native-shader-probes.md new file mode 100644 index 00000000..087a87e6 --- /dev/null +++ b/docs/research/native-shader-probes.md @@ -0,0 +1,143 @@ +# Shader runner probes: the HLSL-to-GLSL ES toolchain, lavapipe on Yggdrasil, native ANGLE on Starfire + +For the cultmath-tapes questions that replace `device-run-driver`: `glsl-es-translation-owner`, +`conforming-shader-run` and `real-device-shader-run`. These are body facts measured by +imagination-ag4-shader-runner (session self-2026-10-16-ag4) on 2026-10-16, between about 14:10 and +15:20 UTC (16:10 to 17:20 CEST). Every probe read CultLib at f697e03f (origin/main). Companion to +`docs/research/native-shader-testing.md` (f697e03f) and `docs/research/device-capture-runners.md` (c9d3e672). + +The probe scripts are in this directory under `p/`: `probe.sh` and `lib.sh` (Yggdrasil jobs), `fam.py` +(the per-family shader generator and bit judge), `vkrun.c` (an 87-line Vulkan compute host) and +`angle_native.py` (a 96-line native ANGLE host). They are throwaway probe code, not a proposed +implementation. The logs are `q12-run3.log` (lavapipe) and `lib-run4.log` (library route). The earlier +runs are superseded: run1 used a raw-ulp metric, run2 died on CRLF, and lib-run1 to lib-run3 failed on +the capability and grep problems recorded below. + +## Metric + +Each fixture family has 256 cases, and the fixture records the C# result bits. "Exact" means all 256 +cases are bit-identical to the C# fixture. Otherwise the worst error is given in units of +2^-23 * max(|expected|, 1) (written "u1" below), the scale the fixture's ulp-bounded checks use. NaN and +Inf cases are compared only as NaN-versus-not-NaN. These figures describe the data. They are not the +fixture's own judge, which is C# and per family: GlslMirrorTests tolerances, and the `check` text on 10 +families. + +## The fixture surface (glsl-parity.json at f697e03f) + +- 109 families, each with 256 cases, encoded `args -> result` as hex 32-bit words. There are at most 32 + words per case. +- 105 families use only float, int, vecN, ivecN and mat3 (mat3 appears as a return only). The other 4 + take or return structs: `CultCellular cultmath_cellular(vec3)`, `CultPhasor cultmath_phacelle(vec3, + vec3, float, float)`, and `SpanNoise cultmath_span_fbm/ridged(SpanPath, SpanStage, int, float, float)`. + Any runner needs per-struct flatteners in field order for these 4. +- Tolerance classes: 89 are `ulp-bounded`, 2 are `exact`, 7 are `platform` (exp, pow, log, asin, acos, + atan, and phacelle's sin and cos), and 10 carry a `check` (enclosure). +- What a harness needs: generate one shader per family that reads the argument words, bit-casts them to + the signature's types, calls the function and writes the result words. The probe generator does this + for both HLSL and GLSL in 112 lines of Python, judge included. + +## Q1. Can dxc emit a SPIR-V library that SPIRV-Cross lowers to GLSL ES for CultMath's real surface? + +Yggdrasil, ubuntu:24.04. Tools: dxc v1.9.2607 Linux (`linux_dxc_2026_07_29`, the version get-dxc.ps1 +pins on Windows), and SPIRV-Cross built from HEAD 300681bb (2026-10-14). + +| Step | Result | +|---|---| +| `dxc -T lib_6_6 -spirv -fspv-target-env=vulkan1.2 CultMath.hlsl`, no change to the source | fails: "No OpEntryPoint ... only allowed if the Linkage ... capability is being used" | +| `-default-linkage external` (lib_6_3, universal1.5), no `export` | fails the same way: no exports in SPIR-V | +| `export` added to every top-level `cultmath_` definition, vulkan1.2 | fails: "Capability Linkage is not allowed by Vulkan 1.2" | +| same, `-fspv-target-env=universal1.5` | compiles, but declares 14 capabilities, ray query, interlock, quad control and partitioned subgroups among them | +| SPIRV-Cross `--es --version 310` on that module | fails: "RayQuery requires Vulkan GLSL 460" | +| ray query stripped | fails: "Cannot find mapping for combined sampler parameter". The Texture2D/SamplerState functions were exported | +| `export` only on the 173 non-texture definitions, all capabilities but Shader and Linkage stripped, every OpExtension stripped, then `spirv-as` | assembles; SPIRV-Cross `--es --version 310` exits 0 | +| SPIRV-Cross `--es --version 300` | fails: "At least ESSL 3.10 required for compute shaders" (a library gets a GLCompute placeholder entry) | +| ES 3.10 output, `#version` guarded by `#ifdef SPIRV_CROSS_LIBRARY_HEADER`, placeholder main removed, compiled by glslang as a `#version 300 es` fragment shader | compiles | + +Shape of the output against the committed lowering: + +| | committed (CultMath.glsl, .Cycles, .Phacelle) | dxc + SPIRV-Cross | +|---|---|---| +| lines | 1035 + Cycles + Phacelle | 3458, one file (the MPL and Apache files are merged) | +| function definitions | 173 (121 + 51 + 1) | 127 | +| overloads | kept | **46 dropped**: one definition per name survives (for example `cultmath_snoise(vec2)` and `cultmath_iv_snoise_ball(vec2, float)` are gone) | +| SSA temporaries `_NNN` | 0 | 5632 | +| min and max | as written | NaN-guarded `mix(mix(min(a,b),b,isnan(a)),a,isnan(b))` | + +In `cultmath_snoise(vec3)` as emitted, the body is one temporary per SSA value (`vec3 _1157 = floor(...)`) +and constants are spelt to 20 digits. + +**Answer:** yes, but only with three owned workarounds: an `export` annotation on 173 definitions, +which FXC (Unity's D3D11 compiler) does not accept, so it would have to be a macro; a capability and +extension strip pass; and unique names for 46 overloads, which breaks the public API for both the HLSL +and the GLSL consumers. The output is generated text, not a readable library. + +## Q2. Does a conforming Vulkan implementation run the families in a Linux container on Yggdrasil? + +Yggdrasil, ubuntu:24.04, apt packages: mesa-vulkan-drivers 25.2.8 (lavapipe), glslang-tools 15.1.0, +spirv-tools 2025.1~rc1, libvulkan-dev, and the same dxc. There is no GPU. + +- Device: `llvmpipe (LLVM 20.1.2, 256 bits)`, Vulkan 1.4. Float controls for f32: denormPreserve 0, + flushToZero 0, RTE 1, RTZ 0, signedZeroInfNanPreserve 1. +- HLSL route: a generated `cs_6_0` compute shader that includes CultMath.hlsl, through `dxc -spirv + -fspv-target-env=vulkan1.2`. 105 of 105 families compile and run. Fma instructions in the SPIR-V: 0. +- GLSL route: the committed CultMath.glsl, .Cycles.glsl and .Phacelle.glsl concatenated after `#version + 310 es` and highp precision, as a compute shader through `glslangValidator -V`. 105 of 105 compile and + run. +- Library route: the dxc + SPIRV-Cross library from Q1 through glslang. 103 of 105 run; the 2 missing + ones are the dropped overloads. Against the fixture: 75 exact, 4 within 4 u1, 7 within 64, 17 above + 64. Its worst rows are the same figures as the HLSL route's. +- Time: all 105 dispatches together take 8 s on a re-run. Each job runs about 4 minutes, almost all of + it apt, the dxc download and the SPIRV-Cross build. +- Determinism: re-running all 105 SPIR-V modules gave bit-identical outputs. +- The HLSL and GLSL routes are bit-identical to each other in 85 of 105 families. +- Against the C# fixture, HLSL route: 75 exact, 6 within 4 u1, 7 within 64, 17 above 64. GLSL route: + 75, 4, 8 and 18. The largest errors are in the `coordinate bands 1e2 to 4e6` families of snoise_grad + and snoise_hessian (13e6 and 1.6e8 u1), then fbm_grad and ridged_grad (about 3.5e3 to 5e3 u1), Cycles + arcsine (2.7e3) and arccosine (1.0e3), and the other hessian families (1e3 to 2.4e3). + +**Answer:** yes. The image needs nothing beyond distro packages and the pinned dxc. It is +deterministic and fast, and it runs both the HLSL and the lowered GLSL on the same implementation. + +## Q3. A real-device run on Starfire without a browser: native ANGLE + +Starfire. The host is `angle_native.py`, Python ctypes over the libEGL.dll and libGLESv2.dll that ship +with Docker Desktop 4.71.0 (an Electron app): ANGLE 2.1.26626, git hash a4490148bd3d. Display: +`EGL_PLATFORM_ANGLE_TYPE_D3D11`. Context: ES 3.0, optionally `EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE`. +Each family is a `#version 300 es` fragment shader, with arguments read by texelFetch from an RGBA32UI +texture and results written to up to 3 RGBA32UI targets over a 16x16 grid, then read back with +glReadPixels. The same RGBA32UI readback is used by the scratchpad browser pages (gpu.js). + +- `GL_RENDERER`: `ANGLE (NVIDIA, NVIDIA GeForce GTX 1070 (0x00001B81) Direct3D11 vs_5_0 ps_5_0, D3D11)`. + `GL_VERSION`: `OpenGL ES 3.0 (ANGLE 2.1.26626 git hash: a4490148bd3d)`. +- 105 of 105 families compile and run. All 105 together take 6.3 s wall, process start included. The GL + error at the end is 0. +- The WebGL-compatibility context and the plain ES 3.0 context are bit-identical in 105 of 105 families. +- Against the C# fixture: 38 exact, 31 within 4 u1, 17 within 64, 19 above 64. +- It agrees with the earlier browser measurements on the same GPU. `cultmath_iv_exp`: 19 of 256 exact, + worst 12 ulp; the browser run of finding iv-exp-gpu-not-enclosed measured "up to 12 ulp". + `cultmath_iv_frustum_ball`: 213 of 256 exact, so 43 off, by at most 2 ulp; finding + frustum-exact-unsound-on-webgl2 measured "43/256 cases by up to 2 ulp". +- The dxc + SPIRV-Cross library from Q1 also runs on this ANGLE, as a WebGL-compatibility ES 3.00 + fragment shader: 103 of 105 families (the 2 dropped overloads fail to compile), with 41 exact. It is + bit-identical to the committed lowering's ANGLE output in 71 of 103 families. +- Largest differences: the `coordinate bands 1e2 to 4e6` families again. 173 cases of snoise_grad and + 415 component values of snoise_hessian differ by more than 1e-3 relative, up to 2 and 20. These + families exist for the span allowance's device margin (follow-up span-allowance-gpu-margin, cut + stage-shaders-device). Their judge is the allowance check, not an ulp bound. + +**Answer:** yes. A pinned ANGLE build, loaded natively, runs the site's real translation path +(ES 3.00, then ANGLE, then HLSL, then D3DCompile, then the NVIDIA D3D11 driver) with no browser and no +SwiftShader fallback, because the backend is named explicitly and the renderer string is recorded. The +result agrees bit for bit with the WebGL-compatibility context, and it reproduces the two browser +measurements on record. + +## What was not probed + +- SwiftShader as a second conforming implementation. +- Amber as the dispatch host instead of a small owned one. +- WARP and native D3D11 HLSL on Starfire, which is the Unity consumer path. +- naga with dxc SPIR-V as input. +- Chrome's own ANGLE feature flags, which the native host does not reproduce. +- Mobile or mediump devices. +- An Electron release's ANGLE pinned by download. The probe used the copy Docker Desktop happens to + ship. diff --git a/docs/research/native-shader-probes/angle_native.py b/docs/research/native-shader-probes/angle_native.py new file mode 100644 index 00000000..f47578b8 --- /dev/null +++ b/docs/research/native-shader-probes/angle_native.py @@ -0,0 +1,96 @@ +"""Probe: run the GLSL fixture families through a native ANGLE (DLLs shipped with an Electron app), D3D11 +backend, ES 3.0 context, fragment-shader readback through RGBA32UI targets. No browser. +usage: py -3 -I angle_native.py [webgl]""" +import ctypes as C, json, os, struct, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +import fam + +dll, fx, sh, out = sys.argv[1:5]; webgl = len(sys.argv) > 5 +os.add_dll_directory(dll) +egl = C.CDLL(os.path.join(dll, 'libEGL.dll')); gl = C.CDLL(os.path.join(dll, 'libGLESv2.dll')) +egl.eglGetProcAddress.restype = C.c_void_p +for n in ['eglInitialize', 'eglChooseConfig', 'eglCreatePbufferSurface', 'eglCreateContext', 'eglMakeCurrent', 'eglBindAPI', 'eglGetError']: + getattr(egl, n).restype = C.c_void_p if n.startswith('eglCreate') else C.c_uint +egl.eglCreatePbufferSurface.argtypes = [C.c_void_p, C.c_void_p, C.POINTER(C.c_int)] +egl.eglCreateContext.argtypes = [C.c_void_p, C.c_void_p, C.c_void_p, C.POINTER(C.c_int)] +egl.eglMakeCurrent.argtypes = [C.c_void_p, C.c_void_p, C.c_void_p, C.c_void_p] +egl.eglInitialize.argtypes = [C.c_void_p, C.c_void_p, C.c_void_p] +egl.eglChooseConfig.argtypes = [C.c_void_p, C.POINTER(C.c_int), C.POINTER(C.c_void_p), C.c_int, C.POINTER(C.c_int)] +GPD = C.CFUNCTYPE(C.c_void_p, C.c_uint, C.c_void_p, C.POINTER(C.c_int))(egl.eglGetProcAddress(b'eglGetPlatformDisplayEXT')) +def ia(*v): return (C.c_int * (len(v) + 1))(*v, 0x3038) +disp = GPD(0x3202, None, ia(0x3203, 0x3208)) # EGL_PLATFORM_ANGLE_TYPE_ANGLE = D3D11 +assert egl.eglInitialize(disp, None, None), 'eglInitialize %x' % egl.eglGetError() +cfg = C.c_void_p(); ncfg = C.c_int() +egl.eglChooseConfig(disp, ia(0x3033, 0x1, 0x3040, 0x40), C.byref(cfg), 1, C.byref(ncfg)) # PBUFFER, ES3 +surf = egl.eglCreatePbufferSurface(disp, cfg, ia(0x3057, 16, 0x3056, 16)) +egl.eglBindAPI(0x30A0) +ctx_attr = (0x3098, 3) + ((0x33AC, 1) if webgl else ()) # CLIENT_VERSION 3 [, WEBGL_COMPATIBILITY_ANGLE] +ctx = egl.eglCreateContext(disp, cfg, None, ia(*ctx_attr)) +assert ctx and egl.eglMakeCurrent(disp, surf, surf, ctx), 'context %x' % egl.eglGetError() +gl.glGetString.restype = C.c_char_p +print('GL_RENDERER', gl.glGetString(0x1F01).decode()); print('GL_VERSION', gl.glGetString(0x1F02).decode()) +print('webgl compatibility context', webgl) + +gl.glCreateShader.restype = C.c_uint; gl.glCreateProgram.restype = C.c_uint +def shader(kind, src): + s = gl.glCreateShader(kind); b = C.c_char_p(src.encode()); gl.glShaderSource(s, 1, C.byref(b), None); gl.glCompileShader(s) + ok = C.c_int(); gl.glGetShaderiv(s, 0x8B81, C.byref(ok)) + if not ok.value: + buf = C.create_string_buffer(4000); gl.glGetShaderInfoLog(s, 4000, None, buf); raise RuntimeError(buf.value.decode()[:300]) + return s +VS = '#version 300 es\nvoid main() { vec2 p = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2); gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0); }\n' +lib = open(os.environ['LIBGLSL']).read() if os.environ.get('LIBGLSL') else ''.join(open(os.path.join(sh, f)).read() for f in ['CultMath.glsl', 'CultMath.Cycles.glsl', 'CultMath.Phacelle.glsl']) +vao = C.c_uint(); gl.glGenVertexArrays(1, C.byref(vao)); gl.glBindVertexArray(vao) +d = json.load(open(fx)); man = []; skipped = 0 +for idx, f in enumerate(d['functions']): + r, name, ps = fam.parse(f['glsl']); rt = fam.ty(r); pts = [fam.ty(p) for p in ps] + if rt is None or any(p is None for p in pts): skipped += 1; continue + nin = sum(p[1] for p in pts); nout = rt[1]; tw = (nin + 3) // 4; nt = (nout + 3) // 4; tag = 'f%03d' % idx + words = [int(x, 16) for c in f['cases'] for x in c.split('->')[0].split()] + tex = [] + for ci in range(256): + row = words[ci * nin:(ci + 1) * nin]; tex += row + [0] * (tw * 4 - nin) + lines, off = [], 0 + for j, (p, (ht, n, k)) in enumerate(zip(ps, pts)): + src = ', '.join('w[%d]' % (off + t) for t in range(n)); v = ('uvec%d(%s)' % (n, src)) if n > 1 else src + conv = {'f': 'uintBitsToFloat', 'i': ('ivec%d' % n if n > 1 else 'int'), 'u': ''}[k] + lines.append(' %s a%d = %s(%s);' % (p, j, conv, v)); off += n + lines.append(' %s r = %s(%s);' % (r, name, ', '.join('a%d' % j for j in range(len(ps))))) + comps = ['r[%d][%d]' % (a, b) for a in range(3) for b in range(3)] if r == 'mat3' else ['r'] if nout == 1 else ['r[%d]' % i for i in range(nout)] + for i, c in enumerate(comps): + lines.append(' ow[%d] = %s(%s);' % (i, {'f': 'floatBitsToUint', 'i': 'uint', 'u': ''}[rt[2]], c)) + outs = ''.join('layout(location = %d) out highp uvec4 o%d;\n' % (t, t) for t in range(nt)) + wr = ''.join(' o%d = uvec4(ow[%d], ow[%d], ow[%d], ow[%d]);\n' % (t, 4 * t, 4 * t + 1, 4 * t + 2, 4 * t + 3) for t in range(nt)) + FS = ('#version 300 es\nprecision highp float;\nprecision highp int;\n' + lib + '\nuniform highp usampler2D In;\n' + outs + + 'void main() {\n int i = int(gl_FragCoord.y) * 16 + int(gl_FragCoord.x);\n uint w[%d];\n for (int k = 0; k < %d; k++) w[k] = texelFetch(In, ivec2(k / 4, i), 0)[k %% 4];\n' + ' uint ow[%d];\n' % (tw * 4, nin, nt * 4) + '\n'.join(lines) + '\n' + ''.join(' ow[%d] = 0u;\n' % z for z in range(nout, nt * 4)) + wr + '}\n') + try: + prog = gl.glCreateProgram(); gl.glAttachShader(prog, shader(0x8B31, VS)); gl.glAttachShader(prog, shader(0x8B30, FS)); gl.glLinkProgram(prog) + except RuntimeError as e: + print('compile fail', f['glsl'], str(e).replace('\n', ' ')[:200]); continue + gl.glUseProgram(prog) + t_in = C.c_uint(); gl.glGenTextures(1, C.byref(t_in)); gl.glActiveTexture(0x84C0); gl.glBindTexture(0x0DE1, t_in) + gl.glTexParameteri(0x0DE1, 0x2801, 0x2600); gl.glTexParameteri(0x0DE1, 0x2800, 0x2600) + buf = (C.c_uint * len(tex))(*tex); gl.glTexImage2D(0x0DE1, 0, 0x8D70, tw, 256, 0, 0x8D99, 0x1405, buf) + gl.glUniform1i(gl.glGetUniformLocation(prog, b'In'), 0) + fbo = C.c_uint(); gl.glGenFramebuffers(1, C.byref(fbo)); gl.glBindFramebuffer(0x8D40, fbo) + tos = (C.c_uint * nt)(); gl.glGenTextures(nt, tos) + for t in range(nt): + gl.glBindTexture(0x0DE1, tos[t]); gl.glTexImage2D(0x0DE1, 0, 0x8D70, 16, 16, 0, 0x8D99, 0x1405, None) + gl.glFramebufferTexture2D(0x8D40, 0x8CE0 + t, 0x0DE1, tos[t], 0) + gl.glDrawBuffers(nt, (C.c_uint * nt)(*[0x8CE0 + t for t in range(nt)])) + gl.glActiveTexture(0x84C0); gl.glBindTexture(0x0DE1, t_in) + gl.glViewport(0, 0, 16, 16); gl.glDrawArrays(0x0004, 0, 3) + res = [[0] * 1024 for _ in range(nt)] + for t in range(nt): + gl.glReadBuffer(0x8CE0 + t); px = (C.c_uint * 1024)(); gl.glReadPixels(0, 0, 16, 16, 0x8D99, 0x1405, px); res[t] = list(px) + flat = [] + for ci in range(256): + allw = sum((res[t][ci * 4:ci * 4 + 4] for t in range(nt)), []); flat += allw[:nout] + open(os.path.join(out, tag + '.in'), 'wb').write(b'\0') + open(os.path.join(out, tag + '.angle.out'), 'wb').write(struct.pack('<%dI' % len(flat), *flat)) + man.append({'tag': tag, 'glsl': f['glsl'], 'n': 256, 'nout': nout, 'kind': rt[2], 'tol': f['tolerance'], 'platform': f.get('platform')}) + gl.glDeleteFramebuffers(1, C.byref(fbo)); gl.glDeleteTextures(nt, tos); gl.glDeleteTextures(1, C.byref(t_in)); gl.glDeleteProgram(prog) +print('gl error at end 0x%x' % gl.glGetError(), '; ran', len(man), 'skipped struct', skipped) +json.dump(man, open(os.path.join(out, 'manifest.json'), 'w')) +fam.cmp(fx, out, 'angle') diff --git a/docs/research/native-shader-probes/fam.py b/docs/research/native-shader-probes/fam.py new file mode 100644 index 00000000..28489f10 --- /dev/null +++ b/docs/research/native-shader-probes/fam.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +"""Probe: per fixture family, generate an HLSL and a GLSL ES 3.10 compute shader that call the family's +function on the fixture's argument bits, and compare device results with the fixture's result bits. +usage: fam.py gen | fam.py cmp """ +import json, re, struct, sys, os + +SCAL = {'float': ('float', 1, 'f'), 'int': ('int', 1, 'i'), 'uint': ('uint', 1, 'u')} +def ty(t): + if t in SCAL: return SCAL[t] + m = re.fullmatch(r'(i|u|)vec([234])', t) + if m: + k = {'': 'f', 'i': 'i', 'u': 'u'}[m.group(1)]; n = int(m.group(2)) + return ({'f': 'float', 'i': 'int', 'u': 'uint'}[k] + str(n), n, k) + if t == 'mat3': return ('float3x3', 9, 'f') + return None + +def parse(sig): + m = re.fullmatch(r'(\w+)\s+(\w+)\((.*)\)', sig) + ps = [p.strip() for p in m.group(3).split(',') if p.strip()] + return m.group(1), m.group(2), ps + +def hlsl_read(k, words): + return {'f': 'asfloat', 'i': 'asint', 'u': ''}[k] + '(' + words + ')' + +def gen(fx, out): + d = json.load(open(fx)); man = []; skipped = [] + for idx, f in enumerate(d['functions']): + r, name, ps = parse(f['glsl']) + rt = ty(r); pts = [ty(p) for p in ps] + if rt is None or any(p is None for p in pts): + skipped.append(f['glsl']); continue + nin = sum(p[1] for p in pts); nout = rt[1] + tag = 'f%03d' % idx + words = [] + for c in f['cases']: + a, b = c.split('->'); aw = a.split(); assert len(aw) == nin, (f['glsl'], len(aw), nin) + words += [int(x, 16) for x in aw] + open(os.path.join(out, tag + '.in'), 'wb').write(struct.pack('<%dI' % len(words), *words) if words else b'\0\0\0\0') + # HLSL + hl, gl, off = [], [], 0 + for j, (p, (ht, n, k)) in enumerate(zip(ps, pts)): + idxs = ', '.join('In[b + %d]' % (off + t) for t in range(n)) + gidx = ', '.join('In.a[b + %du]' % (off + t) for t in range(n)) + if ht == 'float3x3': raise SystemExit('mat3 arg unsupported') + vec = ('uint%d(%s)' % (n, idxs)) if n > 1 else idxs + hl.append(' %s a%d = %s;' % (ht, j, hlsl_read(k, vec) if k != 'u' else vec)) + gvec = ('uvec%d(%s)' % (n, gidx)) if n > 1 else gidx + gfun = {'f': 'uintBitsToFloat', 'i': ('ivec%d' % n if n > 1 else 'int'), 'u': ''}[k] + gl.append(' %s a%d = %s(%s);' % (p, j, gfun, gvec)) + off += n + args = ', '.join('a%d' % j for j in range(len(ps))) + hl.append(' %s r = %s(%s);' % (rt[0], name, args)) + gl.append(' %s r = %s(%s);' % (r, name, args)) + if rt[0] == 'float3x3': + comps = ['r[%d][%d]' % (i, j) for i in range(3) for j in range(3)] + elif rt[1] == 1: comps = ['r'] + else: comps = ['r[%d]' % i for i in range(rt[1])] + for i, c in enumerate(comps): + hl.append(' Out[o + %d] = %s;' % (i, {'f': 'asuint', 'i': 'asuint', 'u': ''}[rt[2]] + '(' + c + ')')) + gl.append(' Out.a[o + %du] = %s;' % (i, {'f': 'floatBitsToUint', 'i': 'uint', 'u': ''}[rt[2]] + '(' + c + ')')) + n = len(f['cases']) + open(os.path.join(out, tag + '.hlsl'), 'w').write( + '#include "CultMath.hlsl"\n[[vk::binding(0)]] StructuredBuffer In;\n[[vk::binding(1)]] RWStructuredBuffer Out;\n' + '[numthreads(64, 1, 1)] void main(uint3 id : SV_DispatchThreadID) {\n uint i = id.x; if (i >= %du) return; uint b = i * %du; uint o = i * %du;\n%s\n}\n' + % (n, nin, nout, '\n'.join(hl))) + open(os.path.join(out, tag + '.body.glsl'), 'w').write( + 'layout(local_size_x = 64) in;\nlayout(std430, binding = 0) readonly buffer IB { uint a[]; } In;\nlayout(std430, binding = 1) buffer OB { uint a[]; } Out;\n' + 'void main() {\n uint i = gl_GlobalInvocationID.x; if (i >= %du) return; uint b = i * %du; uint o = i * %du;\n%s\n}\n' + % (n, nin, nout, '\n'.join(gl))) + man.append({'tag': tag, 'glsl': f['glsl'], 'n': n, 'nout': nout, 'kind': rt[2], 'tol': f['tolerance'], 'platform': f.get('platform')}) + json.dump(man, open(os.path.join(out, 'manifest.json'), 'w')) + print('generated', len(man), 'families; skipped (struct types)', len(skipped), ':', '; '.join(skipped)) + +def ordered(u): # float bits -> monotonic int for ulp distance + return u if u < 0x80000000 else 0x80000000 - u + +def cmp(fx, out, tag): + d = json.load(open(fx)); man = json.load(open(os.path.join(out, 'manifest.json'))) + rows = []; buckets = {'exact': 0, '<=4': 0, '<=64': 0, '>64': 0, 'missing': 0} + for m in man: + p = os.path.join(out, m['tag'] + '.' + tag + '.out') + if not os.path.exists(p): buckets['missing'] += 1; rows.append((m['glsl'], 'MISSING', '')); continue + got = struct.unpack('<%dI' % (m['n'] * m['nout']), open(p, 'rb').read()) + f = d['functions'][int(m['tag'][1:])] + worst = 0; exact = 0; nanmis = 0 + for ci, c in enumerate(f['cases']): + exp = [int(x, 16) for x in c.split('->')[1].split()] + g = got[ci * m['nout']:(ci + 1) * m['nout']] + if list(g) == exp: exact += 1; continue + for e, h in zip(exp, g): + if m['kind'] != 'f': worst = max(worst, 1 << 40); continue + en = (e & 0x7f800000) == 0x7f800000 and e & 0x7fffff; hn = (h & 0x7f800000) == 0x7f800000 and h & 0x7fffff + if en or hn: + if not (en and hn): nanmis += 1 + continue + fe = struct.unpack('64' + if worst >= 1 << 40: b = '>64' + buckets[b] += 1 + rows.append((m['glsl'], '%d/%d exact' % (exact, m['n']), 'max err %s ulp(max(|v|,1))%s' % (('%.1f' % worst) if worst < 1 << 40 else 'int-mismatch', ', nan-mismatch %d' % nanmis if nanmis else ''))) + print(tag, 'buckets', buckets) + for r in sorted(rows, key=lambda r: r[1])[:0]: pass + rows.sort(key=lambda r: -float(re.search(r'max err ([0-9.]+)', r[2]).group(1)) if re.search(r'max err ([0-9.]+)', r[2]) else -1e18) + for r in rows[:int(os.environ.get('CMP_TOP', '25'))]: + if not r[1].startswith('256/256'): print(' ', r[0], '|', r[1], '|', r[2]) + +if __name__ == '__main__': + {'gen': lambda: gen(sys.argv[2], sys.argv[3]), 'cmp': lambda: cmp(sys.argv[2], sys.argv[3], sys.argv[4])}[sys.argv[1]]() diff --git a/docs/research/native-shader-probes/lib.sh b/docs/research/native-shader-probes/lib.sh new file mode 100644 index 00000000..39b62a70 --- /dev/null +++ b/docs/research/native-shader-probes/lib.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +# Probe job, runs in ubuntu:24.04 with /src = CultLib at the probed revision. Q1 library path, Q2 lavapipe runs. +set -u +P=/tmp/p; W=/tmp/w; mkdir -p $W/fam $W/tools; cd $W +step() { echo; echo "=== $*"; } +step apt +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq >/dev/null && apt-get install -y -qq --no-install-recommends ca-certificates curl git cmake g++ make python3 \ + mesa-vulkan-drivers libvulkan-dev vulkan-tools glslang-tools spirv-tools >/dev/null 2>&1; echo "apt exit $?" +dpkg-query -W -f='${Package} ${Version}\n' mesa-vulkan-drivers glslang-tools spirv-tools libvulkan-dev +step dxc +url=$(curl -s https://api.github.com/repos/microsoft/DirectXShaderCompiler/releases/tags/v1.9.2607 | python3 -c "import json,sys;print([a['browser_download_url'] for a in json.load(sys.stdin)['assets'] if 'linux' in a['name'] and a['name'].endswith('.tar.gz')][0])") +echo "$url"; curl -sL --fail -o dxc.tgz "$url" && mkdir -p tools/dxc && tar xzf dxc.tgz -C tools/dxc; DXC=$(find tools/dxc -name dxc -type f | head -1); echo "DXC=$DXC"; $DXC --version 2>&1 | head -2 +step spirv-cross +git clone -q --depth 1 https://github.com/KhronosGroup/SPIRV-Cross.git tools/sc && git -C tools/sc log -1 --format='SPIRV-Cross %H %cs' && \ + cmake -S tools/sc -B tools/scb -DCMAKE_BUILD_TYPE=Release -DSPIRV_CROSS_ENABLE_TESTS=OFF >/dev/null && cmake --build tools/scb --target spirv-cross -j4 >/dev/null 2>&1; SC=tools/scb/spirv-cross; ls -la $SC | cut -c1-120 +SH=/src/packages/cultmath/shaders +python3 - "$SH" <<'PY' +import re,sys,os,shutil +src=sys.argv[1]; dst='/tmp/w/shx'; shutil.copytree(src,dst,dirs_exist_ok=True); n=0 +for fn in os.listdir(dst): + if fn.endswith('.hlsl'): + t=open(os.path.join(dst,fn)).read(); t2,k=re.subn(r'(?m)^(?!static|export)(\w+(?:\dx\d)?\s+cultmath_\w+\s*\(([^)]*)\))', lambda m: m.group(1) if re.search('Texture2D|SamplerState', m.group(2)) else 'export ' + m.group(1), t); k=len(re.findall(r'(?m)^export ', t2)); n+=k; open(os.path.join(dst,fn),'w').write(t2) +print('export keywords added', n) +PY +step "L1 dxc lib_6_3 universal1.5, export on non-texture defs" +$DXC -T lib_6_3 -HV 2021 -spirv -fspv-target-env=universal1.5 -I shx shx/CultMath.hlsl -Fo lib.spv 2>&1 | head -3; echo "exit ${PIPESTATUS[0]}" +spirv-dis lib.spv -o lib.spvasm; echo "exports $(grep -c 'LinkageAttributes.*Export' lib.spvasm); capabilities $(grep -c OpCapability lib.spvasm)" +step "L1b -default-linkage external, no export keyword" +$DXC -T lib_6_3 -HV 2021 -spirv -fspv-target-env=universal1.5 -default-linkage external -I $SH $SH/CultMath.hlsl -Fo libd.spv 2>&1 | head -3; echo "exit ${PIPESTATUS[0]}" +[ -s libd.spv ] && { spirv-dis libd.spv -o libd.spvasm; echo "exports $(grep -c 'LinkageAttributes.*Export' libd.spvasm)"; } +step "L2 strip every capability but Shader and Linkage, every extension; SPIRV-Cross ES 310 and 300" +grep -vP '^\s*OpCapability (?!Shader$|Linkage$)|^\s*OpExtension ' lib.spvasm > s.spvasm; spirv-as --target-env spv1.5 s.spvasm -o s.spv; echo "as exit $?" +for v in 310 300; do $SC s.spv --es --version $v --output s.$v.glsl 2>&1 | head -2; echo "es$v exit ${PIPESTATUS[0]}"; done +G=s.310.glsl; echo "G=$G"; [ -s "$G" ] || { echo PROBE-DONE; exit 0; } +step "L3 shape of $G" +echo "lines $(wc -l < $G); defs cultmath_: $(grep -cE '^\w+ cultmath_\w+\(' $G); distinct: $(grep -oE '^\w+ cultmath_\w+\(' $G | sed -E 's/^\w+ //' | sort -u | wc -l); renamed _N: $(grep -oE '^\w+ cultmath_\w+_[0-9]+\(' $G | wc -l); _NNN temporaries: $(grep -oE '\b_[0-9]+\b' $G | wc -l); non-cultmath defs: $(grep -cE '^\w+ (?!cultmath_)\w+\(' -P $G)" +grep -nE '^#|^layout|precision|^struct|^void main' $G | head -12 +echo "--- renamed defs sample:"; grep -oE '^\w+ cultmath_\w+_[0-9]+\([^)]*\)' $G | head -6 +echo "--- snoise(vec3):"; awk '/^(highp )?float cultmath_snoise\((highp )?vec3/{p=1} p{print; if(++n>=22) exit}' $G +sed -E '/^#version/d; /^layout\(local_size/d' $G | awk 'BEGIN{s=0} /^void main\(\)/{s=1} s==0{print} s==1&&/^\}/{s=0}' > lib.body.glsl +{ printf '#version 300 es\nprecision highp float;\nprecision highp int;\n'; cat lib.body.glsl; printf 'out highp vec4 c;\nvoid main() { c = vec4(cultmath_snoise(gl_FragCoord.xyz)); }\n'; } > es300.frag +glslangValidator es300.frag > es300.txt 2>&1; echo "glslang ES 3.00 fragment with the library: exit $? $(grep -m3 ERROR es300.txt | tr '\n' ' ' | cut -c1-300)" +step "L4 library through glslang on lavapipe" +gcc -O2 -o vkrun $P/vkrun.c -lvulkan 2>/dev/null; python3 $P/fam.py gen /src/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json fam >/dev/null +okl=0; for b in fam/*.body.glsl; do t=${b%.body.glsl}; tag=$(basename $t); n=$(python3 -c "import json;m={x['tag']:x for x in json.load(open('fam/manifest.json'))}['$tag'];print(m['n'],m['nout'])") + { printf '#version 310 es\nprecision highp float;\nprecision highp int;\n'; cat lib.body.glsl $b; } > $t.l.comp + glslangValidator -V --target-env vulkan1.2 -o $t.l.spv $t.l.comp >$t.l.log 2>&1 && ./vkrun $t.l.spv $t.in $t.lib.out $n && okl=$((okl+1)); done +echo "library path ran $okl of 105"; grep -h -m1 ERROR fam/*.l.log | sed -E 's/[0-9]+:/N:/g' | sort | uniq -c | sort -rn | head -6 +CMP_TOP=8 python3 $P/fam.py cmp /src/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json fam lib +echo "LIBGZ-BEGIN"; gzip -9c lib.body.glsl | base64 -w0; echo; echo "LIBGZ-END" +echo PROBE-DONE diff --git a/docs/research/native-shader-probes/od-temporaries/byvalue.py b/docs/research/native-shader-probes/od-temporaries/byvalue.py new file mode 100644 index 00000000..6c6d638d --- /dev/null +++ b/docs/research/native-shader-probes/od-temporaries/byvalue.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +"""Probe: by-value parameter lowering on a SPIR-V module. dxc -Od passes every parameter as a Function pointer and the +caller copies in; a callee that assigns its parameter then comes out of SPIRV-Cross as `inout`. This pass makes each +Function-pointer parameter a value parameter: the old param id becomes a local variable in the entry block, stored from the +new value parameter; each call loads the pointer it passed. usage: byvalue.py """ +import struct, sys +def load(p): + b = open(p, 'rb').read(); w = list(struct.unpack('<%dI' % (len(b) // 4), b)); ins = []; i = 5 + while i < len(w): n = w[i] >> 16; ins.append(w[i:i + n]); i += n + return w[:5], ins +def op(x): return x[0] & 0xffff +def mk(o, *ws): return [((len(ws) + 1) << 16) | o, *ws] +h, ins = load(sys.argv[1]); bound = h[3] +ptr = {x[1]: (x[2], x[3]) for x in ins if op(x) == 32} # id -> (storage, pointee) +ftype = {x[1]: x for x in ins if op(x) == 33} +fnparams = {}; cur = None; fntype = {} +for x in ins: # analysis: per function, which params are Function pointers + if op(x) == 54: cur = x[2]; fnparams[cur] = []; fntype[cur] = x[4] + elif op(x) == 55 and cur is not None: + t = x[1]; conv = t in ptr and ptr[t][0] == 7 + fnparams[cur].append((x[2], t, ptr[t][1] if conv else None, bound if conv else None)); bound += conv +newtype = {}; typeins = []; sig = {tuple(x[2:]): x[1] for x in ins if op(x) == 33} +for f, ps in fnparams.items(): + if any(p[2] for p in ps): + ft = ftype[fntype[f]]; key = (ft[2], *[p[2] if p[2] else p[1] for p in ps]) + if key not in sig: bound += 1; sig[key] = bound; typeins.append(mk(33, bound, *key)) + newtype[f] = sig[key] +names = {x[1]: x for x in ins if op(x) == 5} +out = []; cur = None; pend = []; need_stores = False; first = True; pc = 0 +for x in ins: + o = op(x) + if o == 54 and first: out += typeins; first = False + if need_stores and o != 59: + out += [mk(62, p, q) for p, _, q in pend]; pend = []; need_stores = False + if o == 54: + cur = x[2]; pc = 0 + if cur in newtype: x = x[:4] + [newtype[cur]] + x[5:] + elif o == 55: + _, t, pointee, q = fnparams[cur][pc]; pc += 1 + if pointee: out.append(mk(55, pointee, q)); pend.append((x[2], t, q)); continue + elif o == 248 and pend: + out.append(x); out += [mk(59, t, p, 7) for p, t, _ in pend]; need_stores = True; continue + elif o == 57: + callee = x[3]; args = x[4:]; new = [] + for a, (_, _, pointee, _) in zip(args, fnparams[callee]): + if pointee: bound += 1; out.append(mk(61, pointee, bound, a)); new.append(bound) + else: new.append(a) + x = x[:4] + new; x[0] = (len(x) << 16) | 57 + out.append(x) + if o == 5 and x[1] in [p[0] for ps in fnparams.values() for p in ps if p[2]]: + q = next(p[3] for ps in fnparams.values() for p in ps if p[0] == x[1]); out.append([x[0], q] + x[2:]) +h[3] = bound + 1; w = h + [v for x in out for v in x]; open(sys.argv[2], 'wb').write(struct.pack('<%dI' % len(w), *w)) +print('byvalue: %d functions changed, %d params' % (len(newtype), sum(1 for ps in fnparams.values() for p in ps if p[2]))) diff --git a/docs/research/native-shader-probes/od-temporaries/od.sh b/docs/research/native-shader-probes/od-temporaries/od.sh new file mode 100644 index 00000000..f8ebb794 --- /dev/null +++ b/docs/research/native-shader-probes/od-temporaries/od.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +# Imagination probe: what dxc -Od leaves in the SPIRV-Cross GLSL and what cleans it. ubuntu:24.04, /src = CultLib, /cache persists tools. +set -u; P=/src/docs/research/native-shader-probes; O=$P/overload-wrappers; W=/tmp/w; mkdir -p $W /cache; cd $W +step() { echo; echo "=== $*"; } +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq >/dev/null && apt-get install -y -qq --no-install-recommends ca-certificates curl git cmake g++ make python3 gcc \ + mesa-vulkan-drivers libvulkan-dev glslang-tools spirv-tools >/dev/null 2>&1; echo "apt exit $?" +dpkg-query -W -f='${Package} ${Version}\n' spirv-tools glslang-tools mesa-vulkan-drivers +if [ ! -x /cache/sc/spirv-cross ]; then + git clone -q --depth 1 --branch vulkan-sdk-1.4.363.0 https://github.com/KhronosGroup/SPIRV-Cross.git /cache/scsrc + cmake -S /cache/scsrc -B /cache/scb -DCMAKE_BUILD_TYPE=Release -DSPIRV_CROSS_ENABLE_TESTS=OFF -DSPIRV_CROSS_CLI=ON >/dev/null && cmake --build /cache/scb --target spirv-cross -j8 >/dev/null 2>&1 + mkdir -p /cache/sc; cp /cache/scb/spirv-cross /cache/sc/ +fi +if [ ! -x /cache/dxc/bin/dxc ]; then + curl -sL --fail -o /cache/dxc.tgz https://github.com/microsoft/DirectXShaderCompiler/releases/download/v1.9.2607/linux_dxc_2026_07_29.x86_x64.tar.gz + mkdir -p /cache/dxc && tar xzf /cache/dxc.tgz -C /cache/dxc +fi +DXC=$(find /cache/dxc -name dxc -type f | head -1); SC=/cache/sc/spirv-cross; export LD_LIBRARY_PATH=$(dirname $DXC)/../lib:${LD_LIBRARY_PATH:-} +if [ ! -x /cache/st/spirv-opt ]; then + git clone -q --depth 1 --branch vulkan-sdk-1.4.363.0 https://github.com/KhronosGroup/SPIRV-Tools.git /cache/stsrc + git clone -q --depth 1 --branch vulkan-sdk-1.4.363.0 https://github.com/KhronosGroup/SPIRV-Headers.git /cache/stsrc/external/spirv-headers + cmake -S /cache/stsrc -B /cache/stb -DCMAKE_BUILD_TYPE=Release -DSPIRV_SKIP_TESTS=ON -DSPIRV_WERROR=OFF >/dev/null && cmake --build /cache/stb --target spirv-opt spirv-val spirv-dis spirv-as -j8 >/dev/null 2>&1 + mkdir -p /cache/st; cp /cache/stb/tools/spirv-* /cache/st/ +fi +export PATH=/cache/st:$PATH; echo "spirv-opt from $(which spirv-opt)" +echo "dxc $DXC"; $DXC --version 2>&1|head -2; spirv-opt --version | head -1 +SH=/src/packages/cultmath/shaders; FX=/src/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json +step "1 build the -Od library as in Pass 9b" +python3 $O/wrapgen.py $SH shw +$DXC -T lib_6_3 -HV 2021 -spirv -fspv-target-env=universal1.5 -Od -I shw shw/cm_wrappers.hlsl -Fo w.spv 2>&1 | head -3 +python3 $O/spvedit.py edit w.spv e.spv shw/wrappers.tsv export; spirv-val --target-env spv1.5 e.spv && echo "val ok" +nf() { spirv-dis "$1" | grep -c ' = OpFunction '; }; echo "functions in e.spv: $(nf e.spv)" +step "2 variants: by-value lowering, then spirv-opt (never an inliner)" +cp e.spv v0.spv +python3 $P/od-temporaries/byvalue.py e.spv b0.spv; spirv-val --target-env spv1.5 b0.spv && echo "b0 val ok" +spirv-opt --target-env=spv1.5 --ssa-rewrite --eliminate-dead-code-aggressive --simplify-instructions e.spv -o v2.spv +SSA="--ssa-rewrite --eliminate-dead-code-aggressive" +declare -A VP=([b1]="--eliminate-local-single-store --eliminate-dead-code-aggressive" [b2]="$SSA" [b3]="$SSA --simplify-instructions" [b4]="--eliminate-local-single-block --eliminate-local-single-store --eliminate-local-multi-store --eliminate-dead-code-aggressive --merge-blocks") +for v in b1 b2 b3 b4; do spirv-opt --target-env=spv1.5 ${VP[$v]} b0.spv -o $v.spv 2>$v.err; echo "$v opt exit $? functions $(nf $v.spv 2>/dev/null) $(head -c 160 $v.err)"; done +cp b1.spv b1r.spv; VS="v0 b0 b1 b1r b3" +for v in $VS; do [ -s $v.spv ] || continue + spirv-val --target-env spv1.5 $v.spv >$v.val 2>&1; vx=$? + $SC $v.spv --es --version 310 $([ $v = b1r ] && echo --relax-nan-checks) --output $v.glsl >$v.sc 2>&1; sx=$? + [ -s $v.glsl ] || { echo "$v val $vx sc exit $sx"; head -3 $v.val $v.sc; continue; } + python3 - $v $vx $sx <<'PY' +import re,sys +v,vx,sx=sys.argv[1:4]; g=open(f'/tmp/w/{v}.glsl').read() +defs=re.findall(r'(?m)^(?:\w+ )*?(\w+) (cultmath_\w+)\(([^)]*)\)\n\{',g) +ids=re.findall(r'\b_\d+\b',g) +print(f'{v}: val={vx} sc={sx} lines={g.count(chr(10))} bytes={len(g)} cultmath_defs={len(defs)} distinct={len(set(d[1] for d in defs))} id_tokens={len(ids)} distinct_ids={len(set(ids))} param_var={g.count("param_var_")} inout={len(re.findall(r"inout",g))} suffixed={len(re.findall(r"cultmath_\w+_\d+\(",g))}') +PY +done +mkdir -p /cache/out; cp *.glsl *.spv /cache/out/ 2>/dev/null +step "3 SPIRV-Cross options" +for opt in "--remove-unused-variables"; do for v in v0 b2; do $SC $v.spv --es --version 310 $opt --output $v.o.glsl >/dev/null 2>&1; echo "$v + $opt: lines $(wc -l < $v.o.glsl)"; done; done +step "4 lerp(vec3) as emitted: v0 vs b2, vs committed" +for v in v0 b2; do echo "--- $v lerp(vec3)"; awk '/^(highp )?vec3 cultmath_lerp\((highp )?vec3/{p=1} p{print} p&&/^}/{exit}' $v.glsl; done +echo "--- committed lerp(vec3)"; grep -n -A3 -E '^(highp )?vec3 cultmath_lerp\(' $SH/CultMath.glsl | head -6 +for v in v0 b2; do echo "--- $v snoise(vec3) head"; awk '/^(highp )?float cultmath_snoise\((highp )?vec3/{p=1} p{print; if(++n>=40) exit}' $v.glsl; done +step "5 conformance on lavapipe, every family, per variant vs committed GLSL and HLSL" +mkdir -p fam; gcc -O2 -o vkrun $P/vkrun.c -lvulkan && python3 $P/fam.py gen $FX fam >/dev/null +cat $SH/CultMath.glsl $SH/CultMath.Cycles.glsl $SH/CultMath.Phacelle.glsl > all.glsl +body() { sed -E '/^#version/d; /^#ifdef SPIRV_CROSS/d; /^#endif/d; /^layout\(local_size/d' $1 | awk 'BEGIN{s=0} /^void main\(\)/{s=1} s==0{print} s==1&&/^\}/{s=0}'; } +for v in $VS; do [ -s $v.glsl ] && body $v.glsl > $v.body; done +run() { local t=fam/$1 n; n=$(python3 -c "import json;m={x['tag']:x for x in json.load(open('fam/manifest.json'))}['$1'];print(m['n'],m['nout'])") + { printf '#version 310 es\nprecision highp float;\nprecision highp int;\n'; cat $3 $t.body.glsl; } > $t.$2.comp + glslangValidator -V --target-env vulkan1.2 -o $t.$2.spv $t.$2.comp >$t.$2.log 2>&1 && ./vkrun $t.$2.spv $t.in $t.$2.out $n; } +for b in fam/*.body.glsl; do tag=$(basename ${b%.body.glsl}) + n=$(python3 -c "import json;m={x['tag']:x for x in json.load(open('fam/manifest.json'))}['$tag'];print(m['n'],m['nout'])") + $DXC -T cs_6_0 -E main -HV 2021 -spirv -fspv-target-env=vulkan1.2 -I $SH fam/$tag.hlsl -Fo fam/$tag.h.spv >/dev/null 2>&1 && ./vkrun fam/$tag.h.spv fam/$tag.in fam/$tag.h.out $n + run $tag g all.glsl; for v in $VS; do [ -s $v.body ] && run $tag $v $v.body; done; done +export VS; python3 - <<'PY' +import os,filecmp +d='/tmp/w/fam'; tags=sorted(f[:-10] for f in os.listdir(d) if f.endswith('.body.glsl')) +def same(a,b): return [t for t in tags if os.path.exists(f'{d}/{t}.{a}.out') and os.path.exists(f'{d}/{t}.{b}.out') and filecmp.cmp(f'{d}/{t}.{a}.out',f'{d}/{t}.{b}.out',shallow=False)] +print('families',len(tags),'hlsl ran',len([t for t in tags if os.path.exists(f'{d}/{t}.h.out')]),'committed glsl ran',len([t for t in tags if os.path.exists(f'{d}/{t}.g.out')])) +for v in os.environ['VS'].split(): + ran=[t for t in tags if os.path.exists(f'{d}/{t}.{v}.out')] + sg=same(v,'g'); print(v,'ran',len(ran),'bit-identical to committed glsl',len(sg),'to hlsl',len(same(v,'h')),'| differs from g:',[t for t in ran if t not in sg][:8]) +print('committed vs hlsl',len(same('g','h')),'of',len(tags)) +PY +for v in v0 b2; do { printf '#version 300 es\nprecision highp float;\nprecision highp int;\n'; cat $v.body; printf 'out highp vec4 c;\nvoid main() { vec3 p = gl_FragCoord.xyz; c = vec4(cultmath_lerp(p, p.yzx, vec3(0.5)), cultmath_lerp(1.0, 2.0, p.x)) + cultmath_saturate(vec4(p, 1.0)) + vec4(cultmath_snoise(p)); }\n'; } > $v.es300.frag; glslangValidator $v.es300.frag >$v.es300.txt 2>&1; echo "$v ES 3.00 glslang exit $? $(grep -m2 ERROR $v.es300.txt | tr '\n' ' ' | cut -c1-200)"; done +for t in g $VS; do echo "--- cmp vs C# fixture: $t"; CMP_TOP=3 python3 $P/fam.py cmp $FX fam $t 2>&1 | grep -v "^ *$" | head -8; done +echo PROBE-DONE diff --git a/docs/research/native-shader-probes/overload-wrappers/lava.sh b/docs/research/native-shader-probes/overload-wrappers/lava.sh new file mode 100644 index 00000000..e36f346b --- /dev/null +++ b/docs/research/native-shader-probes/overload-wrappers/lava.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Imagination probe, lavapipe leg: every fixture family through three routes on lavapipe. +# h = HLSL by dxc cs_6_0, g = committed GLSL by glslang, r = restored overloaded library GLSL (lib.body.glsl) by glslang. +set -u; P=/tmp/p; W=/tmp/w; cd $W; SH=/src/packages/cultmath/shaders; FX=/src/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json +echo; echo "=== 2b lavapipe: same computation" +mkdir -p fam; gcc -O2 -o vkrun $P/vkrun.c -lvulkan && python3 $P/fam.py gen $FX fam >/dev/null +cat $SH/CultMath.glsl $SH/CultMath.Cycles.glsl $SH/CultMath.Phacelle.glsl > all.glsl +ok=(0 0 0); first=1 +for b in fam/*.body.glsl; do t=${b%.body.glsl}; tag=$(basename $t) + n=$(python3 -c "import json;m={x['tag']:x for x in json.load(open('fam/manifest.json'))}['$tag'];print(m['n'],m['nout'])") + $DXC_PATH -T cs_6_0 -E main -HV 2021 -spirv -fspv-target-env=vulkan1.2 -I $SH $t.hlsl -Fo $t.h.spv >$t.h.log 2>&1 && ./vkrun $t.h.spv $t.in $t.h.out $n && ok[0]=$((ok[0]+1)) + for r in g r; do src=all.glsl; [ $r = r ] && src=lib.body.glsl + { printf '#version 310 es\nprecision highp float;\nprecision highp int;\n'; cat $src $b; } > $t.$r.comp + glslangValidator -V --target-env vulkan1.2 -o $t.$r.spv $t.$r.comp >$t.$r.log 2>&1 && ./vkrun $t.$r.spv $t.in $t.$r.out $n && { [ $r = g ] && ok[1]=$((ok[1]+1)) || ok[2]=$((ok[2]+1)); } + done +done +echo "ran on lavapipe: hlsl ${ok[0]}, committed glsl ${ok[1]}, restored glsl ${ok[2]} (of $(ls fam/*.body.glsl | wc -l))" +grep -h -m1 ERROR fam/*.r.log | sed -E 's/[0-9]+:/N:/g' | sort | uniq -c | sort -rn | head -5 +python3 - <<'PY' +import os,filecmp +d='/tmp/w/fam'; tags=sorted(f[:-10] for f in os.listdir(d) if f.endswith('.body.glsl')) +def same(a,b): return [t for t in tags if os.path.exists(f'{d}/{t}.{a}.out') and os.path.exists(f'{d}/{t}.{b}.out') and filecmp.cmp(f'{d}/{t}.{a}.out',f'{d}/{t}.{b}.out',shallow=False)] +rg=same('r','g'); rh=same('r','h'); gh=same('g','h') +print('bit-identical: restored vs committed glsl',len(rg),'| restored vs hlsl',len(rh),'| committed glsl vs hlsl',len(gh),'of',len(tags)) +print('restored differs from committed glsl in:',[t for t in tags if t not in rg][:12]) +print('restored differs from hlsl but committed glsl matches hlsl:',[t for t in gh if t not in rh][:12]) +PY + +CMP_TOP=10 python3 $P/fam.py cmp $FX fam r 2>&1 | head -16 diff --git a/docs/research/native-shader-probes/overload-wrappers/split.py b/docs/research/native-shader-probes/overload-wrappers/split.py new file mode 100644 index 00000000..d789d0da --- /dev/null +++ b/docs/research/native-shader-probes/overload-wrappers/split.py @@ -0,0 +1,39 @@ +import re,sys,os,collections +sh,g,out=sys.argv[1:4]; os.makedirs(out,exist_ok=True) +origin={}; owner={'CultMath.hlsl':'core','CultMath.Interval.hlsl':'core','CultMath.Affine.hlsl':'core','CultMath.Cycles.hlsl':'cycles','CultMath.Phacelle.hlsl':'phacelle'} +for fn,o in owner.items(): + t=open(os.path.join(sh,fn)).read() + for m in re.finditer(r'(?m)^(?:export\s+)?\w+\s+(cultmath_\w+)\s*\(',t): origin.setdefault(m.group(1),o) + for m in re.finditer(r'(?m)^struct\s+(\w+)',t): origin.setdefault(m.group(1),o) +text=open(g).read() +# top-level chunks: struct blocks and function definitions; everything else is prologue +lines=text.split('\n'); chunks=[]; i=0; pro=[] +while i1][:6]) +for o,b in files.items(): open(os.path.join(out,o+'.glsl'),'w').write('\n'.join(b)+'\n') +print('split sizes', {o:len('\n'.join(b).split('\n')) for o,b in files.items()}) diff --git a/docs/research/native-shader-probes/overload-wrappers/spvedit.py b/docs/research/native-shader-probes/overload-wrappers/spvedit.py new file mode 100644 index 00000000..1c2807d3 --- /dev/null +++ b/docs/research/native-shader-probes/overload-wrappers/spvedit.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +"""Probe: instruction-level SPIR-V edit (binary, no text regex). +stats how each wrapper looks after dxc +edit mode drop: strip caps (keep Shader, Linkage) and extensions, delete + wrapper functions and their names/decorations, set each callee's OpName to the overloaded source name. + mode export: as drop, but each wrapper's Export decoration moves to its callee instead of being deleted.""" +import struct, sys, collections +def load(p): + b = open(p, 'rb').read(); w = list(struct.unpack('<%dI' % (len(b) // 4), b)); ins = []; i = 5 + while i < len(w): n = w[i] >> 16; ins.append(w[i:i + n]); i += n + return w[:5], ins +def s_dec(ws): + b = struct.pack('<%dI' % len(ws), *ws); return b[:b.index(0)].decode() +def s_enc(s): + b = s.encode() + b'\0'; b += b'\0' * (-len(b) % 4); return list(struct.unpack('<%dI' % (len(b) // 4), b)) +def op(x): return x[0] & 0xffff +def funcs(ins): + fs = {}; cur = None + for k, x in enumerate(ins): + if op(x) == 54: cur = x[2]; fs[cur] = [k, None, [], set()] + if cur is not None: + if op(x) == 57: fs[cur][2].append(x[3]) + o = op(x) + if o == 248: fs[cur][3].add(x[1]) + elif o not in (8, 317, 62, 246, 247, 249, 250, 253, 254, 252) and len(x) > 2: fs[cur][3].add(x[2]) + if op(x) == 56: fs[cur][1] = k; cur = None + return fs +def names(ins): return {x[1]: s_dec(x[2:]) for x in ins if op(x) == 5} +def wrappers(tsv): return [l.split('\t') for l in open(tsv).read().splitlines() if l] +def analyse(ins, tsv): + nm = names(ins); fs = funcs(ins); byname = {v: k for k, v in nm.items() if k in fs}; res = [] + for wn, name, fn, ps in wrappers(tsv): + fid = byname.get(wn); callees = fs[fid][2] if fid else None + res.append((wn, name, fid, callees)) + return nm, fs, res +if sys.argv[1] == 'stats': + h, ins = load(sys.argv[2]); nm, fs, res = analyse(ins, sys.argv[3]) + missing = [r[0] for r in res if r[2] is None]; inl = [r[0] for r in res if r[2] and not r[3]] + multi = [r[0] for r in res if r[3] and len(r[3]) != 1] + callee = collections.Counter(r[3][0] for r in res if r[3] and len(r[3]) == 1) + wrong = [(r[0], nm.get(r[3][0])) for r in res if r[3] and len(r[3]) == 1 and nm.get(r[3][0]) != r[1]] + print('functions %d, wrappers found %d of %d, missing %d, inlined (no call) %d, not-one-call %d' % (len(fs), len(res) - len(missing), len(res), len(missing), len(inl), len(multi))) + print('distinct callees %d, callee shared by >1 wrapper %d' % (len(callee), sum(1 for c in callee.values() if c > 1))) + print('callee OpName != source name: %d %s' % (len(wrong), wrong[:4])) + calls = sum(len(f[2]) for f in fs.values()); print('total OpFunctionCall %d; non-wrapper functions %d' % (calls, len(fs) - len(res) + len(missing))) + print('sample', [(r[0], nm.get(r[3][0]) if r[3] else None) for r in res[:3]], 'missing sample', missing[:3], 'inlined sample', inl[:3]) + sys.exit(0) +_, src, dst, tsv, mode = sys.argv[1:6] +h, ins = load(src); nm, fs, res = analyse(ins, tsv) +drop_k = set(); drop_ids = set(); setname = {}; retarget = {} +for wn, name, fid, callees in res: + if fid is None or not callees or len(callees) != 1: sys.exit('refuse: wrapper %s is not one call' % wn) + a, b, _, ids = fs[fid]; drop_k.update(range(a, b + 1)); drop_ids |= ids | {fid} + setname[callees[0]] = name; retarget[fid] = callees[0] +drop_ids |= set(retarget) +outi = []; named = set() +for k, x in enumerate(ins): + if k in drop_k: continue + o = op(x) + if o == 17 and x[1] not in (1, 5): continue + if o == 10: continue + if o == 5 and x[1] in setname: x = [0] + [x[1]] + s_enc(setname[x[1]]); x[0] = (len(x) << 16) | 5; named.add(x[1]) + elif o in (5, 6) and x[1] in drop_ids: continue + if o == 71 and x[1] in drop_ids: + if mode == 'export' and x[1] in retarget and x[2] == 41: x = [x[0], retarget[x[1]]] + x[2:] + else: continue + outi.append(x) +for fid, name in setname.items(): + if fid not in named: outi.insert(next(i for i, x in enumerate(outi) if op(x) == 5), [((2 + len(s_enc(name))) << 16) | 5, fid] + s_enc(name)) +w = h + [v for x in outi for v in x]; open(dst, 'wb').write(struct.pack('<%dI' % len(w), *w)) +print('edit %s: dropped %d wrapper functions, renamed %d callees, kept %d instructions' % (mode, len(res), len(setname), len(outi))) diff --git a/docs/research/native-shader-probes/overload-wrappers/wrap.sh b/docs/research/native-shader-probes/overload-wrappers/wrap.sh new file mode 100644 index 00000000..65d6360c --- /dev/null +++ b/docs/research/native-shader-probes/overload-wrappers/wrap.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +# Imagination probe: build-only export wrappers -> dxc lib_6_3 -spirv -> SPIR-V edit -> SPIRV-Cross ES. /src = CultLib. +set -u; P=/tmp/p; W=/tmp/w; mkdir -p $W/tools; cd $W +step() { echo; echo "=== $*"; } +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq >/dev/null && apt-get install -y -qq --no-install-recommends ca-certificates curl git cmake g++ make python3 \ + mesa-vulkan-drivers libvulkan-dev glslang-tools spirv-tools >/dev/null 2>&1; echo "apt exit $?" +curl -sL --fail -o dxc.tgz https://github.com/microsoft/DirectXShaderCompiler/releases/download/v1.9.2607/linux_dxc_2026_07_29.x86_x64.tar.gz +echo "dxc sha ok: $(sha256sum dxc.tgz | cut -c1-64 | grep -c 55665c87824051ed4774ff3280a79ccbbb7d39243b9736ca5e98222134112d54)" +mkdir -p tools/dxc && tar xzf dxc.tgz -C tools/dxc; DXC=$(find tools/dxc -name dxc -type f | head -1) +git clone -q --depth 1 --branch vulkan-sdk-1.4.363.0 https://github.com/KhronosGroup/SPIRV-Cross.git tools/sc +cmake -S tools/sc -B tools/scb -DCMAKE_BUILD_TYPE=Release -DSPIRV_CROSS_ENABLE_TESTS=OFF -DSPIRV_CROSS_CLI=ON >/dev/null && cmake --build tools/scb --target spirv-cross -j4 >/dev/null 2>&1; SC=tools/scb/spirv-cross; ls $SC >/dev/null && echo "spirv-cross built" +SH=/src/packages/cultmath/shaders +step "1 wrappers" +python3 $P/wrapgen.py $SH shw; head -3 shw/cm_wrappers.hlsl | cut -c1-160; grep -c '' shw/wrappers.tsv +echo "source defs per overloaded name: $(cut -f2 shw/wrappers.tsv | sort | uniq -c | awk '$1>1{n++; d+=$1} END{print n" names, "d" defs"}')" +step "2 dxc lib_6_3 on source plus wrappers" +for v in default Od; do f=""; [ $v = Od ] && f="-Od" + $DXC -T lib_6_3 -HV 2021 -spirv -fspv-target-env=universal1.5 $f -I shw shw/cm_wrappers.hlsl -Fo w.$v.spv 2>&1 | head -3; echo "[$v] dxc exit ${PIPESTATUS[0]}" + [ -s w.$v.spv ] && python3 $P/spvedit.py stats w.$v.spv shw/wrappers.tsv; done +V=default; python3 $P/spvedit.py stats w.default.spv shw/wrappers.tsv | grep -q 'inlined (no call) 0,' || V=Od; echo "using variant $V" +step "3 SPIR-V edit, validate, SPIRV-Cross ES 310" +for m in drop export; do python3 $P/spvedit.py edit w.$V.spv e.$m.spv shw/wrappers.tsv $m + spirv-val --target-env spv1.5 e.$m.spv 2>&1 | head -2; echo "[$m] val exit ${PIPESTATUS[0]}" + $SC e.$m.spv --es --version 310 --output e.$m.glsl 2>&1 | head -2; echo "[$m] spirv-cross exit ${PIPESTATUS[0]}, lines $(wc -l < e.$m.glsl 2>/dev/null)" + spirv-dis e.$m.spv | grep -E 'OpCapability|OpExtension' | tr -s ' ' | sort | uniq -c | tr '\n' ' '; echo; done +cmp -s e.drop.glsl e.export.glsl && echo "drop and export outputs identical" || echo "drop and export outputs DIFFER" +for m in drop export; do G=e.$m.glsl; [ -s $G ] || continue; python3 - $G shw/wrappers.tsv <<'PY' +import re,sys,collections +g=open(sys.argv[1]).read(); rows=[l.split('\t') for l in open(sys.argv[2]).read().splitlines() if l] +src=collections.Counter(r[1] for r in rows) +defs=re.findall(r'(?m)^(?:\w+ )*?(\w+) (\w+)\(([^)]*)\)\n\{',g); out=collections.Counter(d[1] for d in defs) +print(sys.argv[1],'defs',len(defs),'cultmath_ defs',sum(v for k,v in out.items() if k.startswith('cultmath_')),'source defs',sum(src.values())) +print(' names whose def count differs from source:',[(k,src[k],out.get(k,0)) for k in src if src[k]!=out.get(k,0)][:8]) +print(' non-source names emitted:',[k for k in out if k not in src][:10],' cmw in text:',g.count('cmw'),' suffixed _N cultmath names:',len(re.findall(r'\bcultmath_\w+_\d+\(',g))) +print(' prologue:',' | '.join(l for l in g.split('\n')[:6] if l.startswith('#'))[:200], ' main:', g.count('void main')) +PY +done +G=e.export.glsl; echo "--- cultmath_lerp and cultmath_saturate as emitted:"; grep -E '^\w+ cultmath_(lerp|saturate)\(' $G +step "3b glslang ES 3.00 fragment, call sites resolve per overload" +sed -E '/^#version/d; /^#ifdef SPIRV_CROSS/d; /^#endif/d; /^layout\(local_size/d' $G | awk 'BEGIN{s=0} /^void main\(\)/{s=1} s==0{print} s==1&&/^\}/{s=0}' > lib.body.glsl +{ printf '#version 300 es\nprecision highp float;\nprecision highp int;\n'; cat lib.body.glsl; printf 'out highp vec4 c;\nvoid main() { vec3 p = gl_FragCoord.xyz; float a = cultmath_lerp(1.0, 2.0, p.x); vec3 b = cultmath_lerp(p, p.yzx, vec3(0.5)); vec4 s = cultmath_saturate(vec4(p, a)); c = vec4(b, cultmath_saturate(a)) + s + vec4(cultmath_snoise(p)); }\n'; } > es300.frag +glslangValidator es300.frag > es300.txt 2>&1; echo "glslang ES 3.00 fragment: exit $? $(grep -m3 ERROR es300.txt | tr '\n' ' ' | cut -c1-300)" +sed -i 's/cultmath_saturate(a))/cultmath_saturate(ivec2(1)))/' es300.frag; glslangValidator es300.frag > neg.txt 2>&1; echo "negative (no ivec2 overload) refused: exit $? $(grep -m1 ERROR neg.txt | cut -c1-160)" +step "4 split, constants, capability strip" +python3 $P/split.py $SH $G $W/split 2>&1 | head -6 +for combo in "core" "core cycles" "core phacelle" "core cycles phacelle"; do f=$W/combo.frag; { printf '#version 300 es\nprecision highp float;\nprecision highp int;\n'; for c in $combo; do cat $W/split/$c.glsl; done; printf 'out highp vec4 c;\nvoid main() { c = vec4(cultmath_snoise(gl_FragCoord.xyz)) + vec4(cultmath_lerp(gl_FragCoord.xyz, vec3(1.0), vec3(0.5)), 1.0); }\n'; } > $f; glslangValidator $f > $W/c.txt 2>&1; echo "glslang [$combo]: exit $? $(grep -m2 ERROR $W/c.txt | tr '\n' ' ' | cut -c1-200)"; done +echo "static const lines: $(grep -hcE '^static const' $SH/*.hlsl | awk '{s+=$1}END{print s}'); of form 'static const float CULTMATH_X = lit;': $(grep -hcE '^static const float CULTMATH_\w+ = [-0-9.eEfx]+;' $SH/*.hlsl | awk '{s+=$1}END{print s}'); CULTMATH_ in output $(grep -c 'CULTMATH_' $G); in committed glsl $(cat $SH/*.glsl | grep -cE '^(const )?\w* ?float CULTMATH_')" +DXC_PATH=$DXC bash $P/lava.sh +echo PROBE-DONE diff --git a/docs/research/native-shader-probes/overload-wrappers/wrapgen.py b/docs/research/native-shader-probes/overload-wrappers/wrapgen.py new file mode 100644 index 00000000..e0a4cbf8 --- /dev/null +++ b/docs/research/native-shader-probes/overload-wrappers/wrapgen.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +"""Probe: build-only export wrappers. One exported, uniquely named wrapper per top-level cultmath_ definition +(texture-taking ones skipped). Source is copied unchanged. usage: wrapgen.py +Writes /cm_wrappers.hlsl and /wrappers.tsv (wrapper, name, file, params).""" +import os, re, sys, shutil +sh, out = sys.argv[1:3]; shutil.copytree(sh, out, dirs_exist_ok=True) +SIG = re.compile(r'(?m)^(\w+)\s+(cultmath_\w+)\s*\(([^)]*)\)') +files = ['CultMath.hlsl', 'CultMath.Interval.hlsl', 'CultMath.Affine.hlsl', 'CultMath.Cycles.hlsl', 'CultMath.Phacelle.hlsl'] +w = ['#include "CultMath.hlsl"']; rows = []; k = 0 +for fn in files: + for m in SIG.finditer(open(os.path.join(sh, fn)).read()): + ret, name, ps = m.group(1), m.group(2), m.group(3) + if re.search(r'Texture|Sampler', ps): continue + params = [p.strip() for p in ps.split(',') if p.strip()] + args = [re.split(r'\s+', p)[-1] for p in params] + wn = 'cmw%03d_%s' % (k, name); k += 1 + call = '%s(%s)' % (name, ', '.join(args)) + w.append('export %s %s(%s) { %s%s; }' % (ret, wn, ', '.join(params), '' if ret == 'void' else 'return ', call)) + rows.append('\t'.join([wn, name, fn, ', '.join(params)])) +open(os.path.join(out, 'cm_wrappers.hlsl'), 'w').write('\n'.join(w) + '\n') +open(os.path.join(out, 'wrappers.tsv'), 'w').write('\n'.join(rows) + '\n') +print('wrappers', k) diff --git a/docs/research/native-shader-probes/probe.sh b/docs/research/native-shader-probes/probe.sh new file mode 100644 index 00000000..74a65d18 --- /dev/null +++ b/docs/research/native-shader-probes/probe.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# Probe job, runs in ubuntu:24.04 with /src = CultLib at the probed revision. Q1 library path, Q2 lavapipe runs. +set -u +P=/tmp/p; W=/tmp/w; mkdir -p $W/fam $W/tools; cd $W +step() { echo; echo "=== $*"; } +step apt +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq >/dev/null && apt-get install -y -qq --no-install-recommends ca-certificates curl git cmake g++ make python3 \ + mesa-vulkan-drivers libvulkan-dev vulkan-tools glslang-tools spirv-tools >/dev/null 2>&1; echo "apt exit $?" +dpkg-query -W -f='${Package} ${Version}\n' mesa-vulkan-drivers glslang-tools spirv-tools libvulkan-dev +step dxc +url=$(curl -s https://api.github.com/repos/microsoft/DirectXShaderCompiler/releases/tags/v1.9.2607 | python3 -c "import json,sys;print([a['browser_download_url'] for a in json.load(sys.stdin)['assets'] if 'linux' in a['name'] and a['name'].endswith('.tar.gz')][0])") +echo "$url"; curl -sL --fail -o dxc.tgz "$url" && mkdir -p tools/dxc && tar xzf dxc.tgz -C tools/dxc; DXC=$(find tools/dxc -name dxc -type f | head -1); echo "DXC=$DXC"; $DXC --version 2>&1 | head -2 +step spirv-cross +git clone -q --depth 1 https://github.com/KhronosGroup/SPIRV-Cross.git tools/sc && git -C tools/sc log -1 --format='SPIRV-Cross %H %cs' && \ + cmake -S tools/sc -B tools/scb -DCMAKE_BUILD_TYPE=Release -DSPIRV_CROSS_ENABLE_TESTS=OFF >/dev/null && cmake --build tools/scb --target spirv-cross -j4 >/dev/null 2>&1; SC=tools/scb/spirv-cross; ls -la $SC | cut -c1-120 +SH=/src/packages/cultmath/shaders +step "Q1a dxc library SPIR-V, no wrapper (lib_6_6, vulkan1.2)" +$DXC -T lib_6_6 -HV 2021 -spirv -fspv-target-env=vulkan1.2 -I $SH $SH/CultMath.hlsl -Fo lib.spv 2>&1 | head -8; echo "dxc exit ${PIPESTATUS[0]}" +[ -f lib.spv ] && { spirv-dis lib.spv -o lib.spvasm; echo "functions: $(grep -c ' = OpFunction ' lib.spvasm) exports: $(grep -c 'LinkageAttributes.*Export' lib.spvasm) entrypoints: $(grep -c OpEntryPoint lib.spvasm)"; } +step "Q1b dxc library with 'export' added to every top-level cultmath_ definition" +python3 - "$SH" <<'PY' +import re,sys,os,shutil +src=sys.argv[1]; dst='/tmp/w/shx'; shutil.copytree(src,dst,dirs_exist_ok=True) +n=0 +for fn in os.listdir(dst): + if not fn.endswith('.hlsl'): continue + t=open(os.path.join(dst,fn)).read() + t2,k=re.subn(r'(?m)^(?!static|export)(\w+(?:\dx\d)?\s+cultmath_\w+\s*\()', r'export \1', t); n+=k + open(os.path.join(dst,fn),'w').write(t2) +print('export keywords added', n) +PY +for v in "universal1.5" "vulkan1.2 -Vd" "vulkan1.3 -Vd"; do echo "--- variant: -fspv-target-env=$v"; rm -f libx.spv + $DXC -T lib_6_6 -HV 2021 -spirv -fspv-target-env=$v -I shx shx/CultMath.hlsl -Fo libx.spv 2>&1 | head -4; echo "dxc exit ${PIPESTATUS[0]}" + [ -s libx.spv ] && { spirv-dis libx.spv -o libx.spvasm; echo "functions: $(grep -c ' = OpFunction ' libx.spvasm) exports: $(grep -c 'LinkageAttributes.*Export' libx.spvasm) OpName cultmath_: $(grep -c 'OpName.*"cultmath_' libx.spvasm) Fma: $(grep -c ' Fma ' libx.spvasm) NoContraction: $(grep -c NoContraction libx.spvasm)"; spirv-val --target-env vulkan1.2 libx.spv 2>&1 | head -2; break; } +done +LIB=libx.spv +step "Q1c SPIRV-Cross ES output of $LIB" +for v in 300 310; do $SC $LIB --es --version $v --output lib$v.glsl 2>&1 | head -3; echo "spirv-cross --es --version $v exit ${PIPESTATUS[0]}"; done +for v in 300 310; do [ -s lib$v.glsl ] || continue + echo "lib$v.glsl: $(wc -l < lib$v.glsl) lines; defs named cultmath_: $(grep -cE '^\w+ cultmath_\w+\(' lib$v.glsl); distinct names: $(grep -oE '^\w+ cultmath_\w+\(' lib$v.glsl | sed -E 's/^\w+ //' | sort -u | wc -l); suffixed _N names: $(grep -oE '^\w+ cultmath_\w+_[0-9]+\(' lib$v.glsl | wc -l); _NNN temporaries: $(grep -oE '\b_[0-9]+\b' lib$v.glsl | wc -l); precision lines: $(grep -c precision lib$v.glsl); main: $(grep -c 'void main' lib$v.glsl)"; done +echo "committed CultMath.glsl: $(wc -l < $SH/CultMath.glsl) lines; defs $(grep -cE '^\w+ cultmath_\w+\(' $SH/CultMath.glsl); distinct names $(grep -oE '^\w+ cultmath_\w+\(' $SH/CultMath.glsl | sed -E 's/^\w+ //' | sort -u | wc -l)" +F=$(ls lib310.glsl lib300.glsl 2>/dev/null | head -1); [ -n "$F" ] && { echo "--- head of $F"; head -12 $F; echo "--- cultmath_snoise(vec3) as emitted (first 25 lines)"; awk '/^float cultmath_snoise\(/{p=1} p{print; if(++n>=25) exit}' $F; } +for v in 300 310; do [ -s lib$v.glsl ] && { glslangValidator -S comp lib$v.glsl >gv$v.txt 2>&1; echo "glslang -S comp lib$v.glsl exit $? : $(head -3 gv$v.txt | tr '\n' ' ' | cut -c1-300)"; }; done +step "Q2 lavapipe runner" +gcc -O2 -o vkrun $P/vkrun.c -lvulkan && echo "vkrun built" +python3 $P/fam.py gen /src/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json fam +cat $SH/CultMath.glsl $SH/CultMath.Cycles.glsl $SH/CultMath.Phacelle.glsl > all.glsl +python3 - <<'PY' +import json; print('families', len(json.load(open('/tmp/w/fam/manifest.json')))) +PY +ok_h=0; ok_g=0; fail=0; first=1 +for h in fam/*.hlsl; do t=${h%.hlsl}; tag=$(basename $t) + n=$(python3 -c "import json;m={x['tag']:x for x in json.load(open('fam/manifest.json'))}['$tag'];print(m['n'],m['nout'])") + if $DXC -T cs_6_0 -E main -HV 2021 -spirv -fspv-target-env=vulkan1.2 -I $SH $h -Fo $t.h.spv >$t.h.log 2>&1; then + if [ $first = 1 ]; then VKRUN_INFO=1 ./vkrun $t.h.spv $t.in $t.hlsl.out $n; first=0; else ./vkrun $t.h.spv $t.in $t.hlsl.out $n; fi && ok_h=$((ok_h+1)) || echo "run fail hlsl $tag" + else fail=$((fail+1)); echo "dxc fail $tag: $(head -2 $t.h.log | tr '\n' ' ' | cut -c1-200)"; fi + { printf '#version 310 es\nprecision highp float;\nprecision highp int;\n'; cat all.glsl $t.body.glsl; } > $t.comp + if glslangValidator -V --target-env vulkan1.2 -o $t.g.spv $t.comp >$t.g.log 2>&1; then ./vkrun $t.g.spv $t.in $t.glsl.out $n && ok_g=$((ok_g+1)) || echo "run fail glsl $tag" + else echo "glslang fail $tag: $(grep -m2 ERROR $t.g.log | tr '\n' ' ' | cut -c1-200)"; fi +done +echo "ran: hlsl->dxc->lavapipe $ok_h, committed glsl->glslang->lavapipe $ok_g, dxc compile failures $fail" +echo "dxc-compute Fma total: $(for s in fam/*.h.spv; do spirv-dis $s | grep -c ' Fma '; done | python3 -c "import sys;print(sum(int(l) for l in sys.stdin))")" +python3 $P/fam.py cmp /src/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json fam hlsl +python3 $P/fam.py cmp /src/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json fam glsl +python3 - <<'PY2' +import os,filecmp +fs=sorted(f[:-9] for f in os.listdir('/tmp/w/fam') if f.endswith('.hlsl.out')) +same=sum(filecmp.cmp('/tmp/w/fam/%s.hlsl.out'%f,'/tmp/w/fam/%s.glsl.out'%f,shallow=False) for f in fs if os.path.exists('/tmp/w/fam/%s.glsl.out'%f)) +print('lavapipe: HLSL-path and GLSL-path outputs bit-identical in',same,'of',len(fs),'families') +PY2 +t0=$(date +%s); for h in fam/*.h.spv; do t=${h%.h.spv}; n=$(python3 -c "import json;m={x['tag']:x for x in json.load(open('fam/manifest.json'))}['$(basename $t)'];print(m['n'],m['nout'])"); ./vkrun $h $t.in $t.rerun.out $n; cmp -s $t.rerun.out $t.hlsl.out || echo "NONDETERMINISTIC $(basename $t)"; done; echo "rerun of 105 SPIR-V modules on lavapipe: $(( $(date +%s) - t0 ))s, determinism check done" +step "Q2b SPIRV-Cross ES 3.10 library through glslang on lavapipe (only if Q1 produced one)" +if [ -s lib310.glsl ]; then sed -E '/^#version/d; /^void main\(\)/,/^\}/d' lib310.glsl > lib.body.glsl; okl=0 + for b in fam/*.body.glsl; do t=${b%.body.glsl}; tag=$(basename $t); n=$(python3 -c "import json;m={x['tag']:x for x in json.load(open('fam/manifest.json'))}['$tag'];print(m['n'],m['nout'])") + { printf '#version 310 es\nprecision highp float;\nprecision highp int;\n'; cat lib.body.glsl $b; } > $t.l.comp + glslangValidator -V --target-env vulkan1.2 -o $t.l.spv $t.l.comp >$t.l.log 2>&1 && ./vkrun $t.l.spv $t.in $t.lib.out $n && okl=$((okl+1)) + done; echo "lib path ran $okl"; grep -h -m1 ERROR fam/*.l.log | sort | uniq -c | sort -rn | head -5 + python3 $P/fam.py cmp /src/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json fam lib | head -15 +fi +echo PROBE-DONE diff --git a/docs/research/native-shader-probes/strict-form/nc.py b/docs/research/native-shader-probes/strict-form/nc.py new file mode 100644 index 00000000..4771b66c --- /dev/null +++ b/docs/research/native-shader-probes/strict-form/nc.py @@ -0,0 +1,11 @@ +import re,sys +src,dst=sys.argv[1:3] +L=open(src).read().split('\n') +ids=[] +for l in L: + m=re.match(r'\s*(%\w+) = Op(FMul|FAdd|FSub|VectorTimesScalar|Dot)\b',l) + if m: ids.append(m.group(1)) +i=next(k for k,l in enumerate(L) if re.search(r'= OpType',l)) +L[i:i]=[' OpDecorate %s NoContraction'%x for x in ids] +open(dst,'w').write('\n'.join(L)) +print(src,len(ids)) diff --git a/docs/research/native-shader-probes/strict-form/probe1.sh b/docs/research/native-shader-probes/strict-form/probe1.sh new file mode 100644 index 00000000..f0baa154 --- /dev/null +++ b/docs/research/native-shader-probes/strict-form/probe1.sh @@ -0,0 +1,19 @@ +set -e +apt-get update -qq >/dev/null; apt-get install -y -qq --no-install-recommends python3 spirv-tools >/dev/null 2>&1 +P=packages/cultmath/tools +python3 - <<'PY' +p='packages/cultmath/tools/device/run-lavapipe.sh' +s=open(p).read() +k='python3 "$DEV/gen.py" "$W/work" "$CM"\n' +s=s.replace(k,k+'sed -i -E "s/[.](cos|sin)([^A-Za-z0-9_])/._\1\2/g" "$W"/work/*.comp\ngrep -E "^f10[34]\t" "$W/work/manifest.txt" >"$W/work/m2"; mv "$W/work/m2" "$W/work/manifest.txt"\n') +open(p,'w').write(s) +PY +bash $P/glsl/build-glsl.sh /tmp/glslout >/dev/null +GLSL_DIR=/tmp/glslout bash $P/device/run-lavapipe.sh 2>&1 | tail -4 || true +W=/tmp/device/work +for t in f103 f104; do for r in h g; do + spirv-dis --raw-id $W/$t.$r.spv -o /tmp/$t.$r.dis + echo "== $t $r: NoContraction $(grep -c NoContraction /tmp/$t.$r.dis) Fma $(grep -c ' Fma ' /tmp/$t.$r.dis) FMul $(grep -c OpFMul /tmp/$t.$r.dis) FAdd $(grep -c OpFAdd /tmp/$t.$r.dis) FSub $(grep -c OpFSub /tmp/$t.$r.dis) lines $(wc -l /dev/null; apt-get install -y -qq --no-install-recommends python3 spirv-tools >/dev/null 2>&1 +cat >/tmp/nc.py <<'PYEOF' +import re,sys +src,dst=sys.argv[1:3] +L=open(src).read().split('\n') +ids=[] +for l in L: + m=re.match(r'\s*(%\w+) = Op(FMul|FAdd|FSub|VectorTimesScalar|Dot)\b',l) + if m: ids.append(m.group(1)) +i=next(k for k,l in enumerate(L) if re.search(r'= OpType',l)) +L[i:i]=[' OpDecorate %s NoContraction'%x for x in ids] +open(dst,'w').write('\n'.join(L)) +print(src,len(ids)) +PYEOF +P=packages/cultmath/tools +python3 - <<'PY' +p='packages/cultmath/tools/device/run-lavapipe.sh' +s=open(p).read() +k='python3 "$DEV/gen.py" "$W/work" "$CM"\n' +s=s.replace(k,k+'sed -i -E "s/[.](cos|sin)([^A-Za-z0-9_])/._\1\2/g" "$W"/work/*.comp\ngrep -E "^f10[34]\t" "$W/work/manifest.txt" >"$W/work/m2"; mv "$W/work/m2" "$W/work/manifest.txt"\n') +open(p,'w').write(s) +PY +bash $P/glsl/build-glsl.sh /tmp/glslout >/dev/null +GLSL_DIR=/tmp/glslout bash $P/device/run-lavapipe.sh 2>&1 | tail -4 || true +W=/tmp/device/work; R=/tmp/device +mkdir -p $R/nc/lavapipe-hlsl $R/nc/lavapipe-glsl +while IFS=$'\t' read -r tag _ _ n _ wout; do + for r in h g; do + spirv-dis --raw-id $W/$tag.$r.spv -o /tmp/$tag.$r.dis + python3 /tmp/nc.py /tmp/$tag.$r.dis /tmp/$tag.$r.nc.dis + spirv-as --target-env vulkan1.2 /tmp/$tag.$r.nc.dis -o $W/$tag.$r.nc.spv + spirv-val --target-env vulkan1.2 $W/$tag.$r.nc.spv + d=hlsl; [ $r = g ] && d=glsl + $R/vkrun $W/$tag.$r.nc.spv $W/$tag.in $R/nc/lavapipe-$d/$tag.out $n $wout >/dev/null + done + echo "$tag nc: hlsl==glsl $(cmp -s $R/nc/lavapipe-hlsl/$tag.out $R/nc/lavapipe-glsl/$tag.out && echo YES || echo NO); nc-hlsl==plain-hlsl $(cmp -s $R/nc/lavapipe-hlsl/$tag.out $R/results/lavapipe-hlsl/$tag.out && echo YES || echo NO); nc-glsl==plain-glsl $(cmp -s $R/nc/lavapipe-glsl/$tag.out $R/results/lavapipe-glsl/$tag.out && echo YES || echo NO)" +done <$W/manifest.txt +cp /tmp/device/vkrun /tmp/ 2>/dev/null || true +export CULTMATH_DEVICE_NAME=$(sort -u $R/device.txt | head -1 | sed 's/^device=//') CULTMATH_DEVICE_IDENTITY=x CULTMATH_WRITE_DEVICE_BOUNDS=1 +for v in results nc; do + export CULTMATH_DEVICE_RESULTS=$R/$v + dotnet test packages/cultmath/tests/CultMath.Tests --no-build --filter "FullyQualifiedName~GlslMirrorTests.DeviceResultsHoldFixture" >/tmp/judge.$v.log 2>&1 || true + echo "== judge $v"; grep -E "^(lavapipe-)" packages/cultmath/tests/CultMath.Tests/fixtures/device-bounds-lavapipe.txt | grep -E " 10[34] " | cut -f1,2,5,6 || tail -5 /tmp/judge.$v.log + tail -3 /tmp/judge.$v.log +done diff --git a/docs/research/native-shader-probes/strict-form/probe3.sh b/docs/research/native-shader-probes/strict-form/probe3.sh new file mode 100644 index 00000000..d1585a9e --- /dev/null +++ b/docs/research/native-shader-probes/strict-form/probe3.sh @@ -0,0 +1,53 @@ +set -e +apt-get update -qq >/dev/null; apt-get install -y -qq --no-install-recommends python3 spirv-tools >/dev/null 2>&1 +cat >/tmp/nc.py <<'PYEOF' +import re,sys +src,dst=sys.argv[1:3] +L=open(src).read().split('\n') +ids=[] +for l in L: + m=re.match(r'\s*(%\w+) = Op(FMul|FAdd|FSub|VectorTimesScalar|Dot)\b',l) + if m: ids.append(m.group(1)) +i=next(k for k,l in enumerate(L) if re.search(r'= OpType',l)) +L[i:i]=[' OpDecorate %s NoContraction'%x for x in ids] +open(dst,'w').write('\n'.join(L)) +print(src,len(ids)) +PYEOF +P=packages/cultmath/tools +python3 - <<'PY' +p='packages/cultmath/tools/device/run-lavapipe.sh' +s=open(p).read() +k='python3 "$DEV/gen.py" "$W/work" "$CM"\n' +s=s.replace(k,k+'sed -i -E "s/[.](cos|sin)([^A-Za-z0-9_])/._\1\2/g" "$W"/work/*.comp\ngrep -E "^f10[34]\t" "$W/work/manifest.txt" >"$W/work/m2"; mv "$W/work/m2" "$W/work/manifest.txt"\n') +open(p,'w').write(s) +PY +bash $P/glsl/build-glsl.sh /tmp/glslout >/dev/null +GLSL_DIR=/tmp/glslout bash $P/device/run-lavapipe.sh 2>&1 | tail -4 || true +W=/tmp/device/work; R=/tmp/device +DXC=$(find $R/dxc -name dxc -type f | head -1); export LD_LIBRARY_PATH=$(dirname $DXC)/../lib:$(dirname $DXC) +CM=packages/cultmath +cat >/tmp/cnt.py <<'PYEOF' +import sys,struct +a=open(sys.argv[1],'rb').read();b=open(sys.argv[2],'rb').read() +n=len(a)//4;x=struct.unpack('<%dI'%n,a);y=struct.unpack('<%dI'%n,b) +d=[i for i in range(n) if x[i]!=y[i]] +print(len(d),'of',n,'cols',sorted(set(i%6 for i in d))) +PYEOF +run() { # name spv tag n wout + $R/vkrun $2 $W/$3.in /tmp/o.$1.$3 $4 $5 >/dev/null; } +OPT="--target-env=spv1.5 --eliminate-local-single-store --eliminate-dead-code-aggressive" +while IFS=$' ' read -r tag _ _ n _ wout; do + for r in h g; do spirv-dis --raw-id $W/$tag.$r.spv -o /tmp/$tag.$r.dis; python3 /tmp/nc.py /tmp/$tag.$r.dis /tmp/$tag.$r.nc.dis >/dev/null; spirv-as --target-env vulkan1.2 /tmp/$tag.$r.nc.dis -o $W/$tag.$r.nc.spv; done + # h variants + $DXC -T cs_6_0 -E main -HV 2021 -spirv -fspv-target-env=vulkan1.2 -Od -I $CM/shaders $W/$tag.hlsl -Fo $W/$tag.hOd.spv >/dev/null 2>&1 + spirv-opt $OPT $W/$tag.hOd.spv -o $W/$tag.hOdO.spv + for v in hOd hOdO; do spirv-dis --raw-id $W/$tag.$v.spv -o /tmp/$tag.$v.dis; python3 /tmp/nc.py /tmp/$tag.$v.dis /tmp/$tag.$v.nc.dis >/dev/null; spirv-as --target-env vulkan1.2 /tmp/$tag.$v.nc.dis -o $W/$tag.$v.nc.spv; done + for v in h g hOd hOdO; do run $v $W/$tag.$v.spv $tag $n $wout; run $v.nc $W/$tag.$v.nc.spv $tag $n $wout; done + for v in h hOd hOdO; do + echo "$tag $v vs g: $(python3 /tmp/cnt.py /tmp/o.$v.$tag /tmp/o.g.$tag)" + echo "$tag $v.nc vs g.nc: $(python3 /tmp/cnt.py /tmp/o.$v.nc.$tag /tmp/o.g.nc.$tag)" + done + echo "$tag h.nc vs h: $(python3 /tmp/cnt.py /tmp/o.h.nc.$tag /tmp/o.h.$tag)" + echo "$tag g.nc vs g: $(python3 /tmp/cnt.py /tmp/o.g.nc.$tag /tmp/o.g.$tag)" + echo "$tag hOd.nc vs hOd: $(python3 /tmp/cnt.py /tmp/o.hOd.nc.$tag /tmp/o.hOd.$tag)" +done <$W/manifest.txt diff --git a/docs/research/native-shader-probes/strict-form/probe4.sh b/docs/research/native-shader-probes/strict-form/probe4.sh new file mode 100644 index 00000000..5b521cf9 --- /dev/null +++ b/docs/research/native-shader-probes/strict-form/probe4.sh @@ -0,0 +1,53 @@ +set -e +apt-get update -qq >/dev/null; apt-get install -y -qq --no-install-recommends python3 spirv-tools >/dev/null 2>&1 +cat >/tmp/nc.py <<'PYEOF' +import re,sys +src,dst=sys.argv[1:3] +L=open(src).read().split('\n') +ids=[] +for l in L: + m=re.match(r'\s*(%\w+) = Op(FMul|FAdd|FSub|VectorTimesScalar|Dot)\b',l) + if m: ids.append(m.group(1)) +i=next(k for k,l in enumerate(L) if re.search(r'= OpType',l)) +L[i:i]=[' OpDecorate %s NoContraction'%x for x in ids] +open(dst,'w').write('\n'.join(L)) +print(src,len(ids)) +PYEOF +P=packages/cultmath/tools +python3 - <<'PY' +p='packages/cultmath/tools/device/run-lavapipe.sh' +s=open(p).read() +k='python3 "$DEV/gen.py" "$W/work" "$CM"\n' +s=s.replace(k,k+'sed -i -E "s/[.](cos|sin)([^A-Za-z0-9_])/._\\1\\2/g" "$W"/work/*.comp\n') +open(p,'w').write(s) +PY +bash $P/glsl/build-glsl.sh /tmp/glslout >/dev/null +GLSL_DIR=/tmp/glslout bash $P/device/run-lavapipe.sh 2>&1 | tail -4 || true +set +e +W=/tmp/device/work; R=/tmp/device +DXC=$(find $R/dxc -name dxc -type f | head -1); export LD_LIBRARY_PATH=$(dirname $DXC)/../lib:$(dirname $DXC) +CM=packages/cultmath +for d in plain ncod gis; do mkdir -p $R/$d/lavapipe-hlsl $R/$d/lavapipe-glsl; done +while IFS=$'\t' read -r tag _ _ n _ wout; do + spirv-dis --raw-id $W/$tag.g.spv -o /tmp/g.dis; python3 /tmp/nc.py /tmp/g.dis /tmp/g.nc.dis >/dev/null; spirv-as --target-env vulkan1.2 /tmp/g.nc.dis -o /tmp/g.nc.spv + $DXC -T cs_6_0 -E main -HV 2021 -spirv -fspv-target-env=vulkan1.2 -Od -I $CM/shaders $W/$tag.hlsl -Fo /tmp/hOd.spv >/dev/null 2>&1 + spirv-dis --raw-id /tmp/hOd.spv -o /tmp/hOd.dis; python3 /tmp/nc.py /tmp/hOd.dis /tmp/hOd.nc.dis >/dev/null; spirv-as --target-env vulkan1.2 /tmp/hOd.nc.dis -o /tmp/hOd.nc.spv + $DXC -T cs_6_0 -E main -HV 2021 -spirv -fspv-target-env=vulkan1.2 -Gis -I $CM/shaders $W/$tag.hlsl -Fo /tmp/hGis.spv >/dev/null 2>&1 + spirv-dis --raw-id /tmp/hGis.spv -o /tmp/hGis.dis; python3 /tmp/nc.py /tmp/hGis.dis /tmp/hGis.nc.dis >/dev/null; spirv-as --target-env vulkan1.2 /tmp/hGis.nc.dis -o /tmp/hGis.nc.spv + cp $R/results/lavapipe-hlsl/$tag.out $R/plain/lavapipe-hlsl/; cp $R/results/lavapipe-glsl/$tag.out $R/plain/lavapipe-glsl/ + $R/vkrun /tmp/hOd.nc.spv $W/$tag.in $R/ncod/lavapipe-hlsl/$tag.out $n $wout >/dev/null + $R/vkrun /tmp/g.nc.spv $W/$tag.in $R/ncod/lavapipe-glsl/$tag.out $n $wout >/dev/null + $R/vkrun /tmp/hGis.nc.spv $W/$tag.in $R/gis/lavapipe-hlsl/$tag.out $n $wout >/dev/null + cp $R/ncod/lavapipe-glsl/$tag.out $R/gis/lavapipe-glsl/ + for d in plain ncod gis; do cmp -s $R/$d/lavapipe-hlsl/$tag.out $R/$d/lavapipe-glsl/$tag.out || echo "EQ-FAIL $d $tag"; done +done <$W/manifest.txt +export CULTMATH_DEVICE_WORK=$W CULTMATH_DEVICE_NAME=$(sort -u $R/device.txt | head -1 | sed 's/^device=//') CULTMATH_DEVICE_IDENTITY=x CULTMATH_WRITE_DEVICE_BOUNDS=1 +B=packages/cultmath/tests/CultMath.Tests/fixtures/device-bounds-lavapipe.txt +for v in plain ncod gis; do + export CULTMATH_DEVICE_RESULTS=$R/$v + dotnet test packages/cultmath/tests/CultMath.Tests --no-build --filter "FullyQualifiedName~GlslMirrorTests.DeviceResultsHoldFixture" >/tmp/judge.$v.log 2>&1 || true + grep -aE "Error Message" -A8 /tmp/judge.$v.log | head -14; ls -la $B; cp $B /tmp/bounds.$v; echo "judge $v: $(tail -3 /tmp/judge.$v.log | tr '\n' ' ')" +done +for v in plain ncod gis; do awk -F'\t' -v v=$v '{k=$1; u[k]+=$5; if($5+0>m[k]+0)m[k]=$5; c[k]++} END{for(k in c) print "BOUNDS",v,k,"families",c[k],"maxulp",m[k],"sumulp",u[k]}' /tmp/bounds.$v; done +for v in plain ncod; do awk -F'\t' '{print $1"/"$2"\t"$5}' /tmp/bounds.$v | sort > /tmp/b.$v; done +join -t$'\t' /tmp/b.plain /tmp/b.ncod | awk -F'\t' '$2!=$3{print "ULPDIFF",$1,"plain",$2,"ncod",$3}' | head -60 diff --git a/docs/research/native-shader-probes/vkrun.c b/docs/research/native-shader-probes/vkrun.c new file mode 100644 index 00000000..8cd8d3f8 --- /dev/null +++ b/docs/research/native-shader-probes/vkrun.c @@ -0,0 +1,87 @@ +// Probe runner: one compute dispatch, binding 0 = input uints, binding 1 = output uints. +// usage: vkrun [entry] +#include +#include +#include +#include +#define CK(x) do { VkResult r_ = (x); if (r_ != VK_SUCCESS) { fprintf(stderr, "FAIL %s = %d\n", #x, r_); exit(2); } } while (0) + +static void *slurp(const char *p, size_t *n) { + FILE *f = fopen(p, "rb"); if (!f) { perror(p); exit(2); } + fseek(f, 0, SEEK_END); *n = ftell(f); fseek(f, 0, SEEK_SET); + void *b = malloc(*n ? *n : 4); fread(b, 1, *n, f); fclose(f); return b; +} + +int main(int argc, char **argv) { + if (argc < 6) { fprintf(stderr, "usage\n"); return 2; } + size_t spvn, inn; void *spv = slurp(argv[1], &spvn); void *in = slurp(argv[2], &inn); + unsigned ncases = atoi(argv[4]), ow = atoi(argv[5]); const char *entry = argc > 6 ? argv[6] : "main"; + size_t outn = (size_t)ncases * ow * 4; + + VkApplicationInfo ai = { VK_STRUCTURE_TYPE_APPLICATION_INFO, 0, "probe", 1, "probe", 1, VK_API_VERSION_1_2 }; + VkInstanceCreateInfo ici = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 0, 0, &ai }; + VkInstance inst; CK(vkCreateInstance(&ici, 0, &inst)); + uint32_t np = 1; VkPhysicalDevice pd; vkEnumeratePhysicalDevices(inst, &np, &pd); if (!np) { fprintf(stderr, "no device\n"); return 2; } + VkPhysicalDeviceFloatControlsProperties fc = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES }; + VkPhysicalDeviceProperties2 pp = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, &fc }; + vkGetPhysicalDeviceProperties2(pd, &pp); + if (getenv("VKRUN_INFO")) + printf("device=%s api=%u.%u driver=%u f32: denormPreserve=%u ftz=%u rte=%u rtz=%u signedZeroInfNan=%u\n", + pp.properties.deviceName, VK_VERSION_MAJOR(pp.properties.apiVersion), VK_VERSION_MINOR(pp.properties.apiVersion), + pp.properties.driverVersion, fc.shaderDenormPreserveFloat32, fc.shaderDenormFlushToZeroFloat32, + fc.shaderRoundingModeRTEFloat32, fc.shaderRoundingModeRTZFloat32, fc.shaderSignedZeroInfNanPreserveFloat32); + + float prio = 1; VkDeviceQueueCreateInfo qci = { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 0, 0, 0, 1, &prio }; + VkDeviceCreateInfo dci = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 0, 0, 1, &qci }; + VkDevice dev; CK(vkCreateDevice(pd, &dci, 0, &dev)); VkQueue q; vkGetDeviceQueue(dev, 0, 0, &q); + + VkPhysicalDeviceMemoryProperties mp; vkGetPhysicalDeviceMemoryProperties(pd, &mp); + VkBuffer buf[2]; VkDeviceMemory mem[2]; size_t sz[2] = { inn, outn }; void *map[2]; + for (int i = 0; i < 2; i++) { + VkBufferCreateInfo bci = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, 0, 0, sz[i], VK_BUFFER_USAGE_STORAGE_BUFFER_BIT }; + CK(vkCreateBuffer(dev, &bci, 0, &buf[i])); VkMemoryRequirements mr; vkGetBufferMemoryRequirements(dev, buf[i], &mr); + uint32_t t = 0; VkMemoryPropertyFlags want = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + for (; t < mp.memoryTypeCount; t++) if ((mr.memoryTypeBits & (1u << t)) && (mp.memoryTypes[t].propertyFlags & want) == want) break; + VkMemoryAllocateInfo mai = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, 0, mr.size, t }; + CK(vkAllocateMemory(dev, &mai, 0, &mem[i])); CK(vkBindBufferMemory(dev, buf[i], mem[i], 0)); + CK(vkMapMemory(dev, mem[i], 0, sz[i], 0, &map[i])); + } + memcpy(map[0], in, inn); memset(map[1], 0xEE, outn); + + VkDescriptorSetLayoutBinding b[2] = { { 0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT }, + { 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT } }; + VkDescriptorSetLayoutCreateInfo lci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 0, 0, 2, b }; + VkDescriptorSetLayout dsl; CK(vkCreateDescriptorSetLayout(dev, &lci, 0, &dsl)); + VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 0, 0, 1, &dsl }; + VkPipelineLayout pl; CK(vkCreatePipelineLayout(dev, &plci, 0, &pl)); + VkShaderModuleCreateInfo smci = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, 0, 0, spvn, spv }; + VkShaderModule sm; CK(vkCreateShaderModule(dev, &smci, 0, &sm)); + VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 0, 0, + { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 0, 0, VK_SHADER_STAGE_COMPUTE_BIT, sm, entry }, pl }; + VkPipeline pipe; CK(vkCreateComputePipelines(dev, 0, 1, &cpci, 0, &pipe)); + + VkDescriptorPoolSize ps = { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2 }; + VkDescriptorPoolCreateInfo dpci = { VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, 0, 0, 1, 1, &ps }; + VkDescriptorPool dp; CK(vkCreateDescriptorPool(dev, &dpci, 0, &dp)); + VkDescriptorSetAllocateInfo dsai = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 0, dp, 1, &dsl }; + VkDescriptorSet ds; CK(vkAllocateDescriptorSets(dev, &dsai, &ds)); + VkDescriptorBufferInfo dbi[2] = { { buf[0], 0, VK_WHOLE_SIZE }, { buf[1], 0, VK_WHOLE_SIZE } }; + VkWriteDescriptorSet w[2]; + for (int i = 0; i < 2; i++) { VkWriteDescriptorSet x = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, ds, i, 0, 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 0, &dbi[i] }; w[i] = x; } + vkUpdateDescriptorSets(dev, 2, w, 0, 0); + + VkCommandPoolCreateInfo cpi = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 0, 0, 0 }; + VkCommandPool cp; CK(vkCreateCommandPool(dev, &cpi, 0, &cp)); + VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 0, cp, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1 }; + VkCommandBuffer cb; CK(vkAllocateCommandBuffers(dev, &cbai, &cb)); + VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; + CK(vkBeginCommandBuffer(cb, &cbbi)); + vkCmdBindPipeline(cb, VK_PIPELINE_BIND_POINT_COMPUTE, pipe); + vkCmdBindDescriptorSets(cb, VK_PIPELINE_BIND_POINT_COMPUTE, pl, 0, 1, &ds, 0, 0); + vkCmdDispatch(cb, (ncases + 63) / 64, 1, 1); + CK(vkEndCommandBuffer(cb)); + VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, 0, 0, 0, 0, 1, &cb }; + CK(vkQueueSubmit(q, 1, &si, 0)); CK(vkQueueWaitIdle(q)); + FILE *f = fopen(argv[3], "wb"); fwrite(map[1], 1, outn, f); fclose(f); + return 0; +} diff --git a/docs/research/native-shader-testing.md b/docs/research/native-shader-testing.md new file mode 100644 index 00000000..6a8712e7 --- /dev/null +++ b/docs/research/native-shader-testing.md @@ -0,0 +1,178 @@ +# Native shader testing: how established projects check shader numerics without a browser, and what each path proves + +For `cultmath-tapes:question:device-run-driver` (campaign `cultmath-tapes`). Companion to `docs/research/device-capture-runners.md` (CultLib c9d3e672), which covered browser drivers only; not repeated here. +Also serves the operator's question of 2026-10-16 on why CultMath lowers HLSL to GLSL with its own text lowering (section on HLSL to GLSL ES / SPIR-V toolchains). +Gathered by an Eyes pass for Eureka Self, session self-2026-10-16-ag4, 2026-10-16. Facts only; no recommendation. + +Strength marks: [src] read from a primary source text this pass (raw file fetched and read or grepped locally, or a spec PDF converted to text); [doc] vendor or project documentation page read this pass (via a fetch summariser, so check before quoting); [web] search-result summary only, not read in full; [abs] searched, not found. +Nothing was built or run. Dates matter: several repos below are moving; read at HEAD on 2026-10-16. + +## 0. The record + +- [src] Operator, 2026-10-16, verbatim: "There has to be a better way to test shader code than getting a browser involved". An observation that sets research direction, not a design ruling. +- [src] Question `device-run-driver` (viewed in the mind): options committed-captures / playwright-live / both; the runner is a static page that compiles each family's call against `CultMath.glsl`, reads back via RGBA32UI, emits raw bits; C# judges. +- [src] CultMath shader files: `packages/cultmath/shaders/` has `CultMath.hlsl` (673 lines), `CultMath.Affine.hlsl`, `.Cycles.hlsl`, `.Interval.hlsl`, `.Phacelle.hlsl`, and `CultMath.glsl` (900), `.Cycles.glsl`, `.Phacelle.glsl`. HLSL intrinsics seen by grep across the `.hlsl` files: `asuint` (13), `asfloat` (6), `saturate` (2); no `mad`, `fma`, `frexp`, `ldexp`, `precise`, `sincos`, `rcp`, `groupshared`, `#include` hits in the grep (the `GlslLowering.cs` doc comment says the HLSL has "includes" that are inlined). +- [src] The `.glsl` files contain no `precision` statement and no `#version` line (grep found none); a consumer supplies them. +- [src] `GlslLowering.cs` header: the GLSL ES 3.00 files are a regex text transformation of the HLSL; a dialect gap is fixed in the HLSL "in the subset both languages share". + +## 1. Google Amber + +- [doc] README (github.com/google/amber): runs on Vulkan (fully supported); Dawn listed "WIP". A command-line `amber` tool runs script files, reports pass/fail by exit code, can write output buffers and images to files. Says "not an officially supported Google product". AmberScript is the format getting new features; VkScript (the VkRunner syntax) is kept for history, no new features. Build bots check that Amber compiles on several targets; "integration tests don't run on the bots because of bot limitations, so only unit tests run in CI". +- [src] Maintenance: GitHub API `google/amber`: not archived, created 2018-11-13, pushed 2026-09-24, 76 open issues. Last five commits 2026-05-28 to 2026-09-24 (ray query support, acceleration structures, alpha-to-coverage, barrier fixes). +- [doc] AmberScript (docs/amber_script.md): starts `#!amber`. `SHADER compute ` where format is GLSL, HLSL, SPIRV-ASM, SPIRV-HEX, SPIRV-BIN or OPENCL-C, inline, `FILE`, or `VIRTUAL_FILE`; optional `TARGET_ENV`. `PIPELINE compute ... END`. `BUFFER DATA_TYPE [STD140|STD430] DATA ... END | FILL v | SERIES_FROM s INC_BY i`, types include int8..int64, uint8..uint64, float16, float, double, vectors, matrices. `COPY a TO b`. `RUN x y z`. +- [doc] Expectations: `EXPECT IDX EQ|NE|LT|LE|GT|GE `; with tolerance `EXPECT IDX TOLERANCE EQ ` (1 to 4 floats, a trailing `%` makes one relative; components without one use a default); whole-buffer `EQ_BUFFER`, `RMSE_BUFFER ... TOLERANCE `, `EQ_HISTOGRAM_EMD_BUFFER ... TOLERANCE `. Pixel forms `EQ_RGB`, `EQ_RGBA` use 0-255. Comparison is on typed values, not raw bit patterns; a uint32 buffer compared with `EQ` is an exact integer compare. [abs] A ULP-based tolerance form was not found in the AmberScript doc. +- [doc] VkScript (docs/vk_script.md): `probe ssbo` has a `~=` fuzzy-equal comparator and a `tolerance t0 [t1 t2 t3]` command. +- [web] Amber with SwiftShader: a build option `AMBER_ENABLE_SWIFTSHADER`/`AMBER_USE_SWIFTSHADER` builds SwiftShader as a Vulkan ICD; run with `VK_ICD_FILENAMES` pointing at its manifest; `amber -d` style device listing confirms it. [abs] Amber's own CI workflow files were not found at the paths tried (404); whether Amber CI uses lavapipe or SwiftShader was not established. +- [web] Amber lineage: shader test files mirror VkRunner's format; Amber is shipped inside Android's `external/deqp-deps` and Vulkan CTS. + +## 2. Software Vulkan: Mesa lavapipe and SwiftShader + +### 2.1 Conformance and float behaviour + +- [web] Lavapipe announced formally Vulkan 1.2 conformant (Phoronix, May 2022) and Vulkan 1.3 conformant (July 2022; Khronos submission 696, AMD Ryzen 7 1800X, Mesa 22.1). A Mesa issue (#5472, older) complained lavapipe reported a conformance version while not yet conformant; resolution not checked. +- [web] Mesa MR 11739 "WIP: lavapipe: float_controls" (author's words as summarised): passes about 97% of CTS, fails `float_controls...denorm_*_preserve` cases, "llvmpipe/gallivm have no concept of setting a specific denorm mode"; the author said they probably would not continue. Current merged state of float controls in lavapipe: [abs] (the Mesa GitLab pages and `lvp_device.c` were behind bot protection or not at the tried path). +- [web] A separate llvmpipe MR disables denorms for compute shaders to align with fragment shaders, because OpenCL CTS tests "don't expect working denorms". +- [web] SwiftShader commit "Implement VK_KHR_shader_float_controls": at that time SwiftShader exposed no preserve, denorm or rounding controls and set all denorm-preserve and flush-to-zero flags false. Current values: [abs]. +- [doc] Vulkan float controls (core in 1.2): a flush-to-zero flag set means denormals may be flushed, not that they are; preservation needs `shaderDenormPreserveFloat32` and a `DenormPreserve` execution mode on the entry point. Rounding-mode controls do not apply to float to int conversions (always toward zero). +- [web] Mesa lavapipe docs page (docs.mesa3d.org/drivers/lavapipe.html) 404s at the tried URL; the `llvmpipe.html` page was read and says nothing of lavapipe floats. +- [src] D3D11 floating-point rules (learn.microsoft.com, doc dated 2025-02/04): 32-bit ops are within 1 ULP (add, subtract, multiply: 0.5 ULP "applies only to addition, subtraction, and multiplication", hardware may truncate); "Denorms are flushed to sign-preserved zero on input and output of any floating-point mathematical operation" (data movement exempt); min/max flush for comparison but the result may or may not be flushed; fused operations (mad, dp3) are no less accurate than the worst serial ordering with each step allowed 1 ULP; sqrt and rcp 1 ULP, rcp/rsq have their own relaxed requirement; x*1.0, x/1.0, x+-0.0 return x "except denorm flushed"; NaN payload bits not preserved; no exceptions or traps; double precision preserves denorms and follows IEEE 754R; float16 preserves denorms. +- [src] GLSL ES 3.00 spec section 4.5.1 (Khronos PDF, converted locally): highp float is "defined by the IEEE 754 standard for 32-bit" in storage; "Any subnormal (denormalized) value input into a shader or potentially generated by any operation in a shader can be flushed to 0. The rounding mode cannot be set and is undefined." Required precisions: `a+b, a-b, a*b` correctly rounded; `a/b` and `1.0/b` 2.5 ULP for b in [2^-126, 2^126]; `a*b+c` "correctly rounded single operation or sequence of two correctly rounded operations"; `exp`, `exp2` (3 + 2|x|) ULP; `log`, `log2` 3 ULP outside [0.5, 2.0] and absolute error < 2^-21 inside; `inversesqrt` 2 ULP; `sqrt` inherits from `1.0/inversesqrt`; trig and `determinant` have undefined precision; explicit conversions correctly rounded; "rounding mode ... must not affect the result by more than 1 ULP". NaNs and Infs "are not required to be generated". +- [src] GLSL ES 3.10 spec (NVIDIA-hosted copy of the Khronos PDF) repeats the same flush-to-zero sentence (line 3061 of the converted text). +- [src] Table of required ranges in ES 3.00: highp relative precision 2^-24 (as IEEE); mediump minimum range (-2^14, 2^14), relative 2^-10; lowp minimum range (-2, 2), absolute 2^-8. Integers: highp 32-bit; mediump 16 to 32 bits; lowp 9 to 32 bits. "Mediump and lowp ... have maximum range and precision as defined by IEEE 754", so an implementation may run them at 32 bits. + +### 2.2 Who uses software Vulkan in CI + +- [src] wgpu `.github/workflows/ci.yml` (trunk, read via fetch): job `gpu-test` on `windows-2022`, `macos-14`, `ubuntu-24.04`. Linux installs the Vulkan SDK and Mesa (driver named only via the composite action, not visible), sets `LVP_POISON_MEMORY: true`; Windows installs DXC and WARP (`install-warp` action), Agility SDK, Mesa, Vulkan SDK, sets `WGPU_DX12_COMPILER: dxc`. Tests run with `cargo xtask test` (nextest). +- [doc] wgpu `docs/testing.md`: names `LVP_POISON_MEMORY` ("fills all newly initialized memory with a non-zero value"); describes a parameter system that skips or expects failure per adapter; says nothing on float or denorm differences. +- [web] onnxruntime commit replaced Mesa lavapipe with SwiftShader in headless CI because an old lavapipe returned `VK_ERROR_INCOMPATIBLE_DRIVER` when Dawn asked for a Vulkan 1.3 instance; the SwiftShader ICD is built from source there and used by Dawn. +- [web] Dawn/Chromium use the SwiftShader Vulkan ICD for headless runs; ANGLE end2end has a `VULKAN_SWIFTSHADER` config and a `--deqp-egl-display-type=angle-swiftshader` mode (section 4). +- [web] Wine/vkd3d: tests marked broken on WARP; a November 2025 commit disabled 64-bit wave bitwise ops on WARP "known to be buggy"; a merge request says WARP "doesn't emulate faithfully a hardware device". +- [abs] No project was found that commits raw float bit patterns from lavapipe or SwiftShader as a reference. Projects found compare with tolerance, by pixel, or by exact integer. + +## 3. GLSL/HLSL to SPIR-V + +### 3.1 glslang + +- [src] glslang README (read at main): ESSL is a supported front end; compute shaders use `.comp`; stage is inferred from the file extension; C++ and C interfaces exist; JS/WASM build via `-DENABLE_GLSLANG_JS=ON`. Tests: gtest under `gtests/` plus a `runtests` script, expected outputs in `Test/baseResults/`. +- [src] The HLSL front end of glslang is deprecated: README states deprecation, slated for removal in the next major version with at least 18 months' notice, no bug reports accepted. Commit "Deprecate the HLSL front-end." dated 2026-04-16 (GitHub API). This does not touch `dxc -spirv`, a separate compiler. +- [web] Compute shaders need desktop GLSL 4.30 or GLSL ES 3.10 (Mesa error text "Compute shaders require GLSL 4.30 or GLSL ES 3.10"). In ES 3.10 only the last member of a shader storage block may be a runtime-sized array; desktop is looser. +- [src] SPIRV-Cross (section 3.3) throws "At least ESSL 3.10 required for compute shaders." for ES versions under 310. So a `#version 300 es` compute shader does not exist: a GLSL ES 3.00 fragment function ported to compute becomes a 3.10 shader. +- [src] ES 3.10 section 4.7.4: vertex and compute languages have predeclared `precision highp float; precision highp int;`; the fragment language has "no default precision qualifier for floating point types" and `mediump int`. So an unqualified float in a compute shader is highp, while a fragment shader must declare a float precision. +- [src] ES 3.10 and 3.00 share the flush-to-zero sentence and the ULP table for highp (the 3.10 table was not diffed line by line; the denorm sentence was). +- [abs] A published comparison of ES compute against desktop 4.30 numerics (same function, fragment vs compute) was not found. The two specs' highp rules, as read, are the same sentence; what a given driver does per stage is not stated by either spec. + +### 3.2 dxc -spirv + +- [src] DXC `docs/SPIR-V.rst` (235 KB, read by grep): default target environment `vulkan1.0` via `-fspv-target-env`; `-fspv-entrypoint-name=` exists; `min16float`, `min10float`, `min16int`, `min12int`, `min16uint` map to 32-bit types with `RelaxedPrecision` unless `-enable-16bit-types`, which gives real 16-bit types and the `Float16` capability. `lib_6_x` appears only in the raytracing section ("must be compiled as library using lib_6_3/lib_6_4"). [abs] No statement in the doc that a non-raytracing `lib_6_x` library compiles to SPIR-V with exported functions; no statement on denormal execution modes. +- [src] `SPV_KHR_float_controls` is in the supported-extension list; no description of when dxc emits denorm modes (not found by grep of the doc). +- [src] HLSL exposes `asuint`/`asfloat` as bitcasts; in SPIR-V these are `OpBitcast`. (CultMath's use is section 0.) + +### 3.3 SPIRV-Cross (SPIR-V to GLSL ES/HLSL/MSL) + +- [src] README (main): ES example `spirv-cross --version 310 --es test.spv`; sections on HLSL-derived SPIR-V; names glslangValidator's `-e` entry-point flag in an error hint. Active: commits 2026-09-18, 2026-09-22, 2026-10-14. +- [src] `spirv_glsl.cpp`: `#version` is written as `#version es` when `options.es && version > 100`; ES is allowed from 100 up (the `300 es` form is the emitted string); buffer blocks need ES >= 300, `binding` needs >= 310. +- [src] Precision: `backend.allow_precision_qualifiers = options.vulkan_semantics || options.es;` `flags_to_qualifiers_glsl` emits `mediump ` for ids with `RelaxedPrecision`, else `highp `, and omits either when it equals the fragment default; structs and doubles get none. `Options::Fragment` defaults are `default_float_precision = Mediump`, `default_int_precision = Highp` (`spirv_glsl.hpp` lines 196-197). `emit_header()` writes `precision

float;` and `precision

int;` only for fragment shaders when `options.es`. So a function-only library run through `--es` with default options would, in a fragment context, assume mediump float defaults and tag non-relaxed values `highp`. +- [src] Library modules: `spirv_parser.cpp` (main) handles a module with no `OpEntryPoint` but with `OpDecorate ... LinkageAttributes ... Export`: marks `is_library_module`, uses the first exported function as a placeholder entry point with execution model GLCompute, and `spirv_glsl.cpp` emits "each exported function as a normal free function" plus the callees. A module with neither throws "There is no entry point in the SPIR-V module." The code paths exist at HEAD; which release first had them, and whether the output is valid for ES, were not checked. +- [web] A Unity issue reports min16float hints (`min16f as def32` modifier in FXC bytecode) not honoured in SPIR-V/ESSL output (mediump produced where highp was expected). One blog summary says SPIRV-Cross may pick a low default precision unless told otherwise (not authoritative). +- [src] Readability: [abs] no source characterising readability of the emitted GLSL was found; SPIRV-Cross output is generated text with temporaries named `_` unless debug names survive (names come from OpName; not verified for dxc output). + +## 4. Native ANGLE without a browser + +- [doc] ANGLE README: implements EGL 1.5 and GLES 2.0/3.0/3.1 over Vulkan, desktop GL, GLES, D3D9, D3D11, Metal; "Chrome uses ANGLE for all graphics rendering on Windows" and it is the default WebGL backend for Chrome and Firefox on Windows; its shader compiler can emit Desktop GLSL, Vulkan GLSL, HLSL, ESSL. +- [doc] ANGLE `doc/DevSetup.md`: build standalone with `fetch angle`, `gn gen out/Debug`, `autoninja -C out/Debug`; tests, libraries and samples land in `out/Debug`; on Windows default backend is D3D11 (D3D9 otherwise); backend chosen at runtime through `EGL_ANGLE_platform_angle` via `eglGetPlatformDisplayEXT` (`util/EGLWindow.cpp` as example); backends removable via GN args `angle_enable_d3d11` etc. [abs] prebuilt binaries not covered in the doc. +- [src] ANGLE `doc/dEQP.md`: targets `angle_deqp_gles2_tests`, `angle_deqp_gles3_tests`, `angle_deqp_gles31_tests`, `angle_deqp_egl_tests`; renderer chosen with `--deqp-egl-display-type=angle-d3d11 | angle-d3d9 | angle-d3d11-fl93 | angle-gl | angle-gles | angle-metal | angle-swiftshader | angle-vulkan` (same as `--use-angle=X`); default is Vulkan except Apple (OpenGL); test lists come from `third_party/VK-GL-CTS/.../gles3-main.txt`; GoogleTest builds of the same targets run on the bots with expectation files in `src/tests/deqp_support`. +- [src] ANGLE `doc/TestingAndProcesses.md`: angle_end2end_tests expectations live in `src/tests/angle_end2end_tests_expectations.txt` (`SKIP`, `TIMEOUT` only); the WebGL conformance expectations live in the Chromium tree, not the ANGLE tree. +- [web] `angle_end2end_tests` configs include `ES2_D3D11_WARP`, `ES2_D3D11_REFERENCE`, feature-level variants and `VULKAN_SWIFTSHADER`; end2end tests subsume the older angle_tests and standalone tests. +- [doc] ANGLE `EGL_ANGLE_create_context_webgl_compatibility` / `ANGLE_webgl_compatibility` (spec text, Draft): `eglCreateContext` attribute `EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE` adds WebGL validation; shaders with `#version 100` get WebGL 1 rules and `#version 300 es` get WebGL 2 rules. +- [src] Path in D3D11 (`src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp`, main): ANGLE translator emits HLSL, then `D3DCompile` with profile `vs_5_0`/`ps_5_0` style (`getMajorShaderModel`), flags `D3DCOMPILE_OPTIMIZATION_LEVEL2`, plus `D3DCOMPILE_IEEE_STRICTNESS` only `if (workarounds.enableIEEEStrictness)`; on failure retries with `SKIP_VALIDATION`, then `SKIP_OPTIMIZATION`. The HLSL is generated at link time (`DynamicShaderCompilation.md`) because signatures between stages must be known. +- [src] ANGLE `doc/CompilingTranslatorWithEmscripten.md`: the translator alone can be compiled for use from a page (preliminary notes). +- [abs] The `enableIEEEStrictness` workaround's default value in ANGLE and in Chrome was not found. [abs] Whether Chrome's WebGL2 context and a standalone ANGLE EGL context share all translator options and workaround flags was not established (same repository; Chrome applies its own feature flags and the WebGL-compatibility context). +- [abs] No source found for a project that uses a standalone ANGLE `libEGL`/`libGLESv2` as a compute-readback harness; ANGLE's own tests use it as the system under test. +- [src] Context: GLES 3.0 cannot run compute (3.1 adds it); ANGLE advertises 3.1 (README). A WebGL2 fragment readback and an ES 3.1 compute readback are different ANGLE shader paths (pixel-shader HLSL vs compute-shader HLSL). + +## 5. D3D11/D3D12 compute harnesses for HLSL + +- [src] DXC repo `tools/clang/unittests/HLSLExec/` files: `ExecutionTest.cpp`, `HlslExecTestUtils.cpp`, `LongVectors.cpp`, `ShaderOpArithTable.xml`, `ShaderOpTest.cpp` and others; the test project uses TAEF (WEX) test methods. +- [src] `HlslExecTestUtils.cpp`: `useWarpByDefault()` returns true unless `_HLK_CONF` is defined; when the `UseWARP` parameter is set it creates a device from `EnumWarpAdapter` at feature level 11_0, with an optional `WARP_DLL` path to load a specific WARP build. +- [src] `ExecutionTest.cpp`: `DenormBinaryFloatOpTest`/`DenormTertiaryFloatOpTest` read tables from `ShaderOpArithTable.xml#DenormBinaryFloatOpTable`/`DenormTertiaryFloatOpTable` (rows like `FDivDenormFTZ`; columns `ShaderOp.Target`, `ShaderOp.Arguments`, `Validation.Type`, `Validation.Tolerance`, inputs and expected values); a helper `ifdenorm_flushf_eq` accepts either flushed or unflushed results; derivative tests use `CompareFloatULP(..., 1)` with alternative acceptable values. +- [src] `LongVectors.cpp`: validation config `Epsilon(tol)` or `Ulp(tol)`; default is ULP 1.0 for floating-point types, exact for others; failures print the validation type and tolerance. +- [src] DXC's `HLSLExec` tests thus run on WARP by default and on hardware via a flag; tolerances are per-row in data tables. +- [web] Shader Test Framework (KStocky, D3D12, Catch2, HLSL 202x): README says "very experimental"; tests are HLSL functions run through a `ShaderTestFixture`; a device can be hardware or WARP (README read by fetch did not state WARP; a search summary and the Skyrim Community Shaders DeepWiki page did); README does not state its float comparison. Used by Skyrim Community Shaders per a DeepWiki page (AI-generated, unverified). +- [web] An LLVM 2025 dev meeting talk lists "accuracy tolerances" and "NaN/INF/denorm handling" among hard areas for HLSL test writing. +- [web] WARP is Microsoft's recommended D3D11 device for service/server environments; Session 0 services cannot use hardware D3D9 HAL on WDDM (also in the earlier file). +- [abs] WARP's own float conformance statement (denorm flushing, mad fusion) was not found in a primary document; the D3D11 rules in 2.1 are the contract WARP implements. +- [web] vkd3d-proton and Wine's `d3d12` tests mark WARP-specific broken cases (see 2.2). + +## 6. Other paths + +### 6.1 Slang + +- [doc] Targets page (shader-slang.org/slang/user-guide/targets.html): D3D11 (DXBC), D3D12 (DXIL), Vulkan (SPIR-V), OpenGL (GLSL source, SPIR-V, vendor binaries; "only limited support for compiling code for OpenGL"), Metal, CUDA and OptiX, CPU compute ("compute only", "functional, but not feature- or performance-complete"), WebGPU (WGSL, "work in progress"). GLSL ES: not mentioned. +- [doc] `a2-04-glsl-target-specific.md`: version selected by `-profile glsl_` (example `glsl_450`); the GLSL target "is currently less mature than the SPIR-V target and has several known limitations"; known issue with 3-element vector constant-buffer packing. GLSL ES / `300 es`: not mentioned. [abs] A search for Slang emitting `#version 300 es` found nothing. +- [doc] `docs/cpu-target.md`: outputs C++ (`-target cpp`) or executables, shared libraries, host-callable code, object code; in-process execution through `getTargetHostCallable`; default host-callable backend is `slang-llvm` (no file system, no C compiler needed, shader style only), alternatives are system Clang/GCC/Visual Studio via temp files; limitations: no barriers, no user atomics (except compiler-generated 32/64-bit int add), entry points cannot be named `main`, `float16_t` unsupported, limited bounds-check handling; "no content on floating-point semantics". +- [web] Slang can compile to SPIR-V directly or via GLSL (`-emit-spirv-via-glsl`, glslang downstream). + +### 6.2 wgpu / naga + +- [src] naga README table: inputs SPIR-V (primary), WGSL (primary, "fully validated"), GLSL (secondary, "GLSL 440+ and Vulkan semantics only"); outputs SPIR-V, Metal, HLSL ("Shader Model 5.0+"), WGSL (secondary), GLSL (secondary, "GLSL 330+ and GLSL ES 300+"). HLSL is not an input language. naga is a different translator from ANGLE's; wgpu's DX12 path uses naga HLSL output compiled with DXC or FXC (`WGPU_DX12_COMPILER`, ci.yml). +- [src] wgpu CI deletes `naga/tests/out` snapshots before test runs (ci.yml), i.e. naga keeps snapshot-compared output files. + +### 6.3 Tint (Dawn's WGSL compiler) + +- [web] Search snapshots (2020-2021, a CMake-only Dawn fork): Tint reads WGSL (default on) and SPIR-V (`TINT_BUILD_SPV_READER`, off by default); writers for SPIR-V, WGSL, HLSL, MSL, GLSL (GLSL writer added October 2021, validated with glslang). [abs] The current upstream README was not retrievable (404 at tried paths), so current readers and writers are unconfirmed. + +### 6.4 Shader-function unit-test frameworks and GPU-free paths + +- [web] `shadertest` (Kupoman, Python): load a GLSL file, call its functions from pytest; supports bool, int, uint, float and vectors; implementation (GPU context) not read. +- [web] `shdr` (cdave1): experimental CPU emulator for GLSL fragment shaders, translates GLSL to JavaScript, "does not quite match the glsl". `rpu` (Rust crate): a GLSL-like language compiled to WebAssembly for CPU rendering, not full GLSL. HlslUnit (.NET): an interpreter that runs HLSL on the CPU (search summary). +- [web] Blender added infrastructure to run GLSL shader unit tests and shares C++/GLSL source in the GPU module, compiled through the real GPU backend. +- [web] Khronos forum "GLSL Unit" (Google MapsGL team) unit-testing framework for shaders, old, likely dormant. +- [doc] Vulkan Validation Layers `debug_printf`: shaders print through `debugPrintfEXT`; output goes to the validation layer message stream; [web] each a runtime Vulkan layer, not a numeric assertion framework. +- [abs] No GPU-free GLSL ES interpreter with IEEE-faithful float semantics, maintained, and used by a notable project was found. + +## 7. Cross-cutting: tools that produce SPIR-V for sections 1-3 (item 8) + +| Tool | Input | Output | Library with no entry point | Maintenance | +|---|---|---|---|---| +| glslang | GLSL, ESSL, HLSL (deprecated 2026-04-16) | SPIR-V | not covered in README | active (commits 2026-04) | +| dxc `-spirv` | HLSL | SPIR-V | `lib_6_x` only documented for raytracing; `-E` entry otherwise [abs] export behaviour | active repo, wiki and docs | +| SPIRV-Cross | SPIR-V | GLSL (incl. `300 es`, `310 es`), HLSL, MSL | HEAD has library-module path keyed on `LinkageAttributes Export` | active (2026-10-14) | +| Slang | Slang (accepts HLSL-like syntax) | SPIR-V, HLSL, GLSL desktop (`-profile glsl_N`), WGSL (WIP), CPU, others | not examined | active | +| Unity HLSLcc | DX bytecode (DXBC) | GLSL 3.2+, GLSL ES 2.0+ ("OpenGL ES 3.0+" used for Unity), Metal, Vulkan GLSL | n/a (bytecode) | `pushed_at` 2024-07-16, not archived, 30 open issues, README "used to generate all Unity shaders for OpenGL, OpenGL ES 3.0+, Metal, Vulkan"; supports `min16float`, infers sampler precision | +| naga | WGSL, SPIR-V, GLSL 440+ | SPIR-V, WGSL, GLSL ES 300+, HLSL SM5+, MSL | n/a | active (wgpu) | +| Tint | WGSL (SPIR-V reader optional) | SPIR-V, HLSL, MSL, GLSL (per 2021 snapshot) | n/a | unconfirmed | + +- [src] Which can also feed Amber/Vulkan runs: glslang and dxc produce SPIR-V from GLSL/HLSL; Amber itself accepts HLSL and GLSL source in `SHADER` blocks directly (section 1), choosing compilers internally [web: Amber builds against glslang/shaderc; which is used for HLSL not read]. +- [src] Which can emit GLSL ES 3.00 for the web from one source: SPIRV-Cross (`--es --version 300`, with the fragment precision options above), naga (GLSL ES 300+), HLSLcc (GLSL ES from DXBC; `ES 3.0+` per README), Slang (not documented). +- [web] WGSL for the web: naga and Tint write WGSL (naga: "secondary"); Slang WGSL target "work in progress". + +## 8. What each path exercises (stated as facts about the scope of each check) + +| Path | Executes | Compiler/translator in the chain | Float rules in force | What a pass establishes | What it does not | +|---|---|---|---|---|---| +| Amber on lavapipe | SPIR-V on Mesa llvmpipe JIT (CPU) | glslang or dxc/other to SPIR-V, then Mesa NIR/LLVM | Vulkan spec; GLSL-derived SPIR-V denorm handling per Mesa; FMA contraction per Mesa/LLVM | The shader source, as compiled to SPIR-V, computes within the stated tolerance on a Vulkan 1.3 conformant implementation | Behaviour of ANGLE's HLSL, fxc/D3DCompile, NVIDIA D3D11 | +| Amber on SwiftShader | SPIR-V on SwiftShader's JIT (Reactor/Subzero) | same front end | Vulkan spec; float controls reported off (older commit) | same, on a second conforming implementation | same | +| Amber on a real Vulkan GPU | SPIR-V on the driver | same | vendor | The SPIR-V on that driver | WebGL path | +| glslang/SPIRV-Cross text snapshot tests | nothing executed | translators only | none | translation is stable between versions | numerics | +| ANGLE `angle_end2end`/dEQP on D3D11 | GLSL ES via ANGLE translator, HLSL, `D3DCompile` (fxc), NVIDIA D3D11 driver, as in Chrome on Windows | ANGLE as built in the harness (the same codebase Chrome vendors) | D3D11 rules (flush to zero, 1 ULP) over ESSL rules | The ES shader behaviour of that ANGLE build on that driver | Chrome's own flags/feature overrides unless reproduced | +| ANGLE on SwiftShader (`angle-swiftshader`) | GLSL ES via ANGLE to SPIR-V, SwiftShader | ANGLE Vulkan backend | Vulkan | ANGLE's Vulkan translation path, software | ANGLE's D3D11 path | +| D3D11/12 compute on WARP | HLSL via dxc/fxc, WARP CPU rasterizer | Microsoft compiler | D3D rules as implemented by WARP | The HLSL source on a D3D conformant software device | NVIDIA hardware or the WebGL route | +| D3D11/12 compute on GTX 1070 | HLSL via dxc/fxc, NVIDIA driver | | D3D rules, vendor | The HLSL source on that GPU | other vendors | +| wgpu/naga on lavapipe or WARP | WGSL (or SPIR-V in) via naga | naga | WGSL/Vulkan or D3D12 | naga's translation of that source on that device | ANGLE or glslang/dxc paths | +| Slang CPU | Slang to C++ or LLVM, run on the host CPU | Slang | host CPU IEEE with the host compiler's flags (page silent) | Slang source semantics on a CPU | HLSL or GLSL as consumers compile them | +| GLSL-to-CPU emulators/interpreters | the interpreter | the interpreter | the interpreter's host floats | the interpreted source | any real driver | +| Browser WebGL2 (earlier file) | GLSL ES via browser's ANGLE | | | the exact consumer path on that browser/GPU | other browsers/drivers | + +- [src] Spec positions that bound what a conforming-implementation pass can claim: GLSL ES 3.00/3.10 allow flush of subnormals to zero at any time, undefined rounding, `a*b+c` either fused or two roundings, and undefined trig precision; D3D11 requires flushing subnormals on math input/output and allows fused ops up to the unfused tolerance; Vulkan lets an implementation flush unless a preserve mode is requested and supported. +- [src] Where the same GLSL ES source goes through ANGLE→HLSL→`D3DCompile`→driver, the compiler flags in `Renderer11.cpp` (OPTIMIZATION_LEVEL2, retry configurations, conditional IEEE_STRICTNESS) are part of the path; a SPIR-V route (glslang or dxc, then a Vulkan implementation) has none of those stages. +- [abs] No source found that quantifies disagreement between ANGLE→D3D11 and a Vulkan software implementation for the same GLSL ES function. + +## 9. Gaps (searched, not resolved) + +- Lavapipe and SwiftShader current `VkPhysicalDeviceFloatControlsProperties` values; FMA contraction policy in either; the lavapipe docs page. +- Amber's own CI jobs and which compilers it uses for HLSL and GLSL. +- Whether `dxc -spirv` can emit an exported-function library that SPIRV-Cross's library path accepts; whether `dxc` flush/preserve execution modes are emitted by default. +- Tint's current readers and writers. +- Slang GLSL ES output; Slang CPU float flags. +- ANGLE: default of `enableIEEEStrictness`; prebuilt standalone `libEGL`/`libGLESv2` availability for Windows outside Chrome/Electron; Chrome-specific translator options. +- WARP numerics statement; DXC test tolerance values per intrinsic row (the XML table structure was read, not every row). diff --git a/docs/research/payload-depth-limit.md b/docs/research/payload-depth-limit.md new file mode 100644 index 00000000..44ef6e26 --- /dev/null +++ b/docs/research/payload-depth-limit.md @@ -0,0 +1,221 @@ +# Payload nesting limits in comparable libraries + +Fork: `cultlib-gaps:question:payload-depth-limit` (options reference-500, shared-256, shared-128). +Raised in `cultlib-gaps:cut_spec:cut-union-bounds-cs.r1`. Gathered 2026-10-11 by Eyes +(`eyes-depth-limit-prior-art`). Facts only; no recommendation. Source files were fetched +from each project's default branch on 2026-10-11 (raw.githubusercontent.com); line numbers +refer to those fetches and move with the branch. "(inferred)" marks a reading of code or +text that the source does not state. + +Terms: "read" = decode/parse; "write" = encode/serialize; "skipped" = content a decoder +walks past without materialising (ignored fields, unknown fields). + +## 1. Summary table + +| Library | Default | Counts | Read / write | Source | +|---|---|---|---|---| +| MessagePack-CSharp (UntrustedData and TrustedData) | 500 (`MaximumObjectGraphDepth`) | each `DepthStep` call: formatter-driven, one step per container a formatter enters; check is `Depth >= max` before increment | read only; skipped content not counted unless a formatter calls DepthStep (see 2.1) | MessagePackSecurity.cs:31,41,92,266-273 | +| rmp-serde | 1024 (`depth: u16`, `set_max_depth`) | containers (array, map, ext newtype) via `depth_count!`; counter decremented, error at 0 | read: yes; write: error variant exists but is never constructed | decode.rs:51-60,213,294,309-310,566,583,616; encode.rs:37,49,64 | +| serde_json | 128 (`remaining_depth`, `disable_recursion_limit`) | each `[` and `{` entered by `deserialize_any`-style paths; error when the counter reaches 0 (deepest enterable container is 127, inferred from the decrement-then-test-zero code) | read only; serializer has no depth code; skipped values (`ignore_value`) are iterative and contain no `check_recursion!` call | de.rs:63,1357-1387,1434,1445,1102-1215; ser.rs (no match) | +| msgpack-python (C unpacker) | 1024 (`MSGPACK_EMBED_STACK_SIZE`) | each container pushed on a fixed stack, before the zero-length check; raises `StackError` | read: yes (including `skip()`); write: `Packer` `DEFAULT_RECURSE_LIMIT = 1024` (`ValueError`) | unpack.h:19; unpack_template.h:117-127; _unpacker.pyx:208-211,524; _packer.pyx:42,259-262 | +| msgpack-python (pure-Python fallback) | Python's recursion limit; `RecursionError` is mapped to `StackError` | recursion frames | read; write via `DEFAULT_RECURSE_LIMIT = 1024` | fallback.py:66,586-606 | +| @msgpack/msgpack | decode: no depth limit found (heap-allocated `StackPool`, iterative); encode `maxDepth` 100 | encode: depth argument to `doEncode` | read: unbounded; write: yes (`Too deep objects in depth N`) | Decoder.ts:111-190,640-643; Encoder.ts:9,97,173; README.md:119 | +| msgpackr | no depth option found | recursive `readObject` (inferred from the single recursion comment at unpack.js:506) | neither | unpack.js, pack.js (grep for depth/maxDepth: no hit) | +| System.Text.Json | 64 (reader and serializer); writer default 1000 | `JsonReaderOptions.MaxDepth`; `JsonSerializerOptions.MaxDepth` default is the minimum of reader and writer defaults | read: yes; write: yes (writer 1000, serializer 64) | JsonReaderOptions.cs:13,43; JsonWriterOptions.cs:18; JsonSerializerOptions.cs:27-28,580-593 | +| Newtonsoft.Json | 64 (`JsonReader` ctor; `MaxDepth` nullable) | reader `Depth + 1 > _maxDepth` | read; `JsonWriter.cs` has no MaxDepth match | JsonReader.cs:332,356-359 | +| protobuf C++ | 100 (`default_recursion_limit_`) | recursion budget decremented per nested message/group | read | coded_stream.h:630,1588-1602,1637 | +| protobuf C# | 100 (`DefaultRecursionLimit`) | CodedInputStream recursion | read | CodedInputStream.cs:57,120-147 | +| protobuf Java | 100 (`defaultRecursionLimit`) | CodedInputStream recursion | read | CodedInputStream.java:45,52,521 | +| protobuf upb | 100 (`kUpb_WireFormat_DefaultDepthLimit`) | `d->depth` per decode; max configurable up to a uint16 | read | upb/wire/internal/constants.h:11; decode.c:105,140,192,619,1306-1312 | +| ciborium | 256 (`recurse` counter) | `recurse()` wrapper around array/map/tag decode | read only (cib_ser.rs has no depth/recurs match) | ciborium/src/de/mod.rs:54-74,812,854 | +| cbor2 (Python) | 400 `max_depth` since 5.9.0 (CVE-2026-26209 fix); 6.0.0 (2026-04-28) rewrote the decoder in Rust as iterative, "limited only by the available memory" | containers | read | docs/versionhistory.rst:120-142,172-173 | +| BSON (MongoDB) | 100 levels | "Each object or array adds a level" | the doc page does not say read vs write | mongodb.com/docs/manual/reference/limits/ | +| Go encoding/json | 10000 (`maxNestingDepth`) | scanner `parseState` stack length; the scanner validates the whole input before decoding (`checkValid`) | read; encoder has no depth limit, only pointer-cycle detection after 1000 pointer levels (`startDetectingCyclesAfter`) | scanner.go:146-186; encode.go:298-305,764 | +| simdjson | 1024 (`DEFAULT_MAX_DEPTH`) | parser allocation parameter | read | common_defs.h:49; dom/parser.h:596,599 | + +## 2. Detail by library + +### 2.1 MessagePack-CSharp (the C# reference's decoder) + +- `UntrustedData` and `TrustedData` both set `MaximumObjectGraphDepth = 500` + (MessagePackSecurity.cs:31, 41; property initialiser 92). `TrustedData` was lowered to 500 + by commit 6b025eab "Limit stack depth to 500 even for trusted data" (2024-10-29) and + set from `UntrustedData` by 7c087905 (2024-11-28), per the commit history of + MessagePackSecurity.cs (api.github.com/repos/MessagePack-CSharp/MessagePack-CSharp/commits?path=src/MessagePack/MessagePackSecurity.cs). + The commit messages give no rationale for the value 500. +- `DepthStep(ref MessagePackReader)` throws `InsufficientExecutionStackException` when + `reader.Depth >= MaximumObjectGraphDepth`, else increments (MessagePackSecurity.cs:266-273). + The doc comment says callers must decrement after leaving the edge (:254-260). +- Counting is by contract with formatters, not by the reader: README.md says `DepthStep` and + `Depth--` "should surround the bulk of any `IMessagePackFormatter.Deserialize` method" + (README lines ~1161-1175). So content no formatter reads is not counted (inferred from the + README contract; the CultLib measurement in the question confirms it: an extra trailing slot + of 100000 nested arrays is accepted). +- Write: no depth check in the serializer or writer in the code fetched (MessagePackReader.cs + holds `Depth` at :53-75,133; the writer was not fetched). The CultLib question reports a + 3001-deep payload written and then refused on read. +- Advisory GHSA-7q36-4xx7-xcxf / CVE-2020-5234 (published 2020-01-31): "Untrusted data can lead + to DoS attack due to hash collisions and stack overflow in MessagePack". Affected < 1.9.11 and + >= 2.0.0 < 2.1.90. Mitigation is opting into `UntrustedData`; the advisory text does not state + the depth value. +- Advisory GHSA-cj9g-3mj2-g8vv / CVE-2026-48512 (published 2026-06-25), fixed in 2.5.301 and + 3.1.7: the JSON conversion helpers (`ConvertFromJson`, `TinyJsonReader.ReadNextToken`, the + ext-100 branch of `ConvertToJson`) recursed without consulting `MaximumObjectGraphDepth`; the + advisory says `UntrustedData` "does not fully mitigate" them. This is the class of defect + "a depth limit exists but one recursive path skips it". + +### 2.2 rmp-serde (the Rust runtime's decoder) + +- `Deserializer` has `depth: u16`, initialised to 1024 (decode.rs:181, 213, 294); + `set_max_depth` clamps to `u16::MAX` (:309-310). +- `depth_count!` decrements, returns `DepthLimitExceeded` when the counter reaches 0, runs the + body, increments (decode.rs:51-62). Used for arrays (:566), maps (:583) and ext newtype (:616). + So the usable nesting is 1023 levels (inferred from decrement-then-test-zero). +- `ignored_any` is forwarded to `deserialize_any` (decode.rs:~749-753 `forward_to_deserialize_any!`), + which goes through the same counted paths: skipped containers are counted. +- Write: `Error::DepthLimitExceeded` exists in encode.rs (:37, 49, 64) but a grep finds no site + that constructs it (only definition, `source`, `Display`). The writer has no depth check + (inferred from the three matches). +- Crate version at fetch: 1.3.1 (Cargo.toml). No RUSTSEC advisory about depth was found for + rmp-serde, rmpv or ciborium in a web search (search-engine result, not a database query). + +### 2.3 serde_json + +- `remaining_depth: u8 = 128` (de.rs:34, 63); `check_recursion!` decrements and errors with + `RecursionLimitExceeded` when it reaches 0 (de.rs:1372-1387), used at the `[`/`{` branches of + `deserialize_any` and the typed deserialize methods (de.rs:1434, 1445, 1750, 1801, 1838, 1849, + 1882). `disable_recursion_limit()` exists behind the `unbounded_depth` feature (de.rs:197-216, + 1357-1370). A third-party analysis (search result, not fetched) states the deepest enterable + container is level 127. +- `deserialize_ignored_any` calls `ignore_value()` (de.rs:1910-1916). `ignore_value` (:1102-~1215) + is an explicit loop with a heap `scratch` stack of frames and contains no `check_recursion!` + (the `check_recursion!` lines in the file are all at 1372+). Reading: ignored values in + serde_json are walked iteratively and are not depth-limited (inferred from the code; not + tested). This differs from the question's statement that "serde_json ... count ignored values + the same way". +- Serializer: grep of ser.rs for depth/recurs returns no match. +- Related: serde-json-wasm GHSA-rr69-rxr6-8qwf / RUSTSEC-2024-0012 (2024-02-09), fixed in 1.0.1 + and 0.5.2: "This was fixed by adding a check for recursion depth"; the advisory text gives no value. + rustc_serialize RUSTSEC-2022-0004: parsing had no stack-depth limit and "can cause a stack + overflow, which aborts the process". +- serde_stacker (crates.io description) grows the stack dynamically and is documented as paired + with `disable_recursion_limit()`; its README warns that Drop, Debug and Display on deep values + can still overflow. A forum thread reports dropping a deeply nested `Value` (~10 million + levels) overflowing after a successful parse. + +### 2.4 msgpack-python + +- C unpacker: `MSGPACK_EMBED_STACK_SIZE` 1024 (unpack.h:19); `start_container` returns -3 when + `top >= 1024` before it checks for an empty container (unpack_template.h:117-127), and -3 is + raised as `StackError` (_unpacker.pyx:208-211, 521-524). The docstring says "Raises `StackError` + when `packed` contains too nested" (_unpacker.pyx:158, 313). Empty containers at depth 1025 are + therefore also refused (inferred from check order). `skip()` runs the same state machine + (fallback.py:599-606 shows `skip` raising `StackError`; the C path is the same unpack function, + inferred). +- Pure-Python fallback: depth is Python's recursion limit; `RecursionError` is converted to + `StackError` (fallback.py:586-606). +- Packer: `DEFAULT_RECURSE_LIMIT = 1024`; `_pack` raises `ValueError("recursion limit exceeded.")` + when `nest_limit < 0` and decrements per container (_packer.pyx:42, 259-262; fallback.py:66, 699-711, 801-804). + +### 2.5 JavaScript + +- @msgpack/msgpack Decoder: iterative, with a heap `StackPool` (Decoder.ts:111-190, loop :640-643); + no depth option appears in the decoder (grep of "depth" returns only stack-pool lines). The + README option table lists `maxDepth` default 100 (README.md:119) and Encoder.ts uses it + (`DEFAULT_MAX_DEPTH = 100`, :9; `doEncode` throws `Too deep objects in depth N` when + `depth > maxDepth`, :173). So the library is asymmetric: encode bounded, decode unbounded in + depth (limited by memory). The CultLib question states TS "parse the whole payload"; consistent. +- msgpackr: grep of unpack.js and pack.js finds no maxDepth option or depth counter. +- msgpack5 (another npm package) GHSA-24ch-f2g6-9hhh (2026-10-08): "The decoder has no + nesting-depth limit for arrays and maps ... exhaust the JavaScript call stack"; fix in 6.1.0 + limits depth to 100 by default, option `maxDepth`, error "Maximum decode depth exceeded". +- msgpack-java: CVE record at vulncheck.com ("through 0.9.12", GitHub issue #1015): + `MessageUnpacker.unpackValue()` "recursively deserializes arrays and maps without nesting + depth limits", causing StackOverflowError. Fix value not retrieved. + +### 2.6 .NET JSON + +- System.Text.Json: `JsonReaderOptions.DefaultMaxDepth = 64` (JsonReaderOptions.cs:13); + `JsonWriterOptions.DefaultMaxDepth = 1000` (JsonWriterOptions.cs:18); + `JsonSerializerOptions.DefaultMaxDepth` = the reader's 64, with a comment that it is the + minimum of the reader and writer defaults (JsonSerializerOptions.cs:27-28). So the serializer + limit applies to both directions at 64; the bare writer at 1000. +- Newtonsoft.Json: `JsonReader` constructor sets `_maxDepth = 64` (JsonReader.cs:332); exceeding + throws `JsonReaderException` "The reader's MaxDepth of {0} has been exceeded" (:356-359). + `JsonWriter.cs` has no MaxDepth match. Advisory GHSA-5crp-9r3c-p9vr / CVE-2024-21907 + (published 2022-06-22, affects < 13.0.1): "Insecure Defaults ... improper handling of + expressions with high nesting level that lead to StackOverFlow exception or high CPU and RAM + usage". Advisory figures: deserialising needs >10 million nesting (9.5 MB of `{a:{a:`) for >10 s + of CPU; serialising (`SerializeObject`, `JObject.ToString`) overflowed the stack at about + 20,000 levels. The advisory's own mitigation example sets `MaxDepth = 128`; the 13.0.1 default + is 64 (the changelog line was not retrieved; the 64 is read from the code above). + +### 2.7 Protobuf + +- Default recursion limit 100 in C++ (coded_stream.h:630 comment "100 by default"), C# + (CodedInputStream.cs:57), Java (CodedInputStream.java:45) and upb (constants.h:11). C# rejects a + non-positive limit (cs:142-144); upb stores it in a 16-bit field (`upb_DecodeOptions_MaxDepth`). +- Skipped content: GHSA-735f-pc8j-v9w8 / CVE-2024-7254 (published 2024-09-19): in protobuf Java + (full and lite), Kotlin and JRuby, "Parsing nested groups as unknown fields with + DiscardUnknownFieldsParser or Java Protobuf Lite parser, or against Protobuf map fields, + creates unbounded recursions". Fixed in 3.25.5, 4.27.5, 4.28.2. The advisory implies unknown + (skipped) content had escaped the recursion limit until the fix. +- No write-side limit was looked up. + +### 2.8 CBOR, BSON, Go, simdjson + +- ciborium: `recurse: 256` in `from_reader` and `deserializer_from_reader` + (de/mod.rs:812, 854); `from_reader_with_recursion_limit` documents "Set a high recursion limit at + your own risk (of stack exhaustion)!" (:819-822, 859-862). `recurse()` errors + `RecursionLimitExceeded` at 0 (:64-74). No depth/recurs match in ser/mod.rs. +- cbor2: advisory GHSA-3c37-wwvx-h642 / CVE-2026-26209 (published 2026-03-23, fixed 5.9.0): + "uncontrolled recursion" in both the pure-Python and C decoders; PoC is 1000 nested `0x81` + bytes raising `RecursionError`. The C decoder used `Py_EnterRecursiveCall` (Python's + interpreter limit). Fix: `max_depth` parameter, default 400, in 5.9.0 (versionhistory.rst:172-173). + 6.0.0 (2026-04-28): decoder rewritten in Rust, iterative, depth "limited only by the available + memory" (versionhistory.rst:138-140). +- BSON: MongoDB documents "no more than 100 levels of nesting for BSON documents. Each object or + array adds a level." The page does not state read vs write. +- Go encoding/json: `maxNestingDepth = 10000` "limits the max nesting depth to prevent stack + overflow" (scanner.go:146-148); `pushParseState` errors "exceeded max depth" when the parse stack + exceeds it (:181-185). `checkValid` scans the whole input before decode (scanner.go:30), so every + container, including ones the target type ignores, is counted (inferred from `checkValid` being + the first step of `Unmarshal`; not read in decode.go). Encoder: `ptrLevel` over 1000 starts + cycle detection, which is not a depth limit (encode.go:298-305). +- simdjson: `constexpr size_t DEFAULT_MAX_DEPTH = 1024` (common_defs.h:49); `allocate(capacity, + max_depth = DEFAULT_MAX_DEPTH)`. (The PHP binding defaults to 512 per the PHP manual.) + +## 3. Read-side vs write-side, and skipped content + +Enforces on write: rmp-serde (variant defined, no construction found: no); msgpack-python Packer +(1024); @msgpack/msgpack Encoder (100); System.Text.Json (serializer 64, writer 1000); Go +encoding/json (no depth limit; cycle detection only); MessagePack-CSharp (no); serde_json (no); +ciborium (no); Newtonsoft (no match in JsonWriter.cs). + +Counts skipped/ignored content: rmp-serde (yes, via `ignored_any` to `deserialize_any`); +msgpack-python C unpacker (yes, `skip()` shares the stack); Go (scanner pre-pass, inferred); +serde_json (apparently no: `ignore_value` is iterative and uncounted, inferred); +MessagePack-CSharp (no: counting is by formatter contract); protobuf Java (unknown groups were +unbounded before CVE-2024-7254). + +## 4. Stack use per nesting level + +No library documents bytes of stack per nesting level. What exists: +- ciborium: "Set a high recursion limit at your own risk (of stack exhaustion)!" +- Newtonsoft advisory: serialisation overflowed the default stack at about 20,000 levels + (a count, not bytes; thread stack size not stated in the advisory). +- cbor2 advisory PoC: 1000 nested arrays reached the Python recursion limit. +- Rhai docs (search snippet, a different system): default call depth 64 in release, 8 in debug, + an illustration that debug frames are larger. +- CultLib's own measurement (from the question, not a prior-art source): Rust debug on 2 MiB + aborts at about 408 containers, which is about 5 KiB per level (2 MiB / 408, inferred); + release carries 1200+; Python near 1000; TS near 4000. +- serde_json and rmp-serde pick 128 and 1024 respectively; neither source documents how the value + was derived. Arrow Parquet Variant (docs.rs search result) says it picked MAX_NESTING_DEPTH 128 + "to match serde_json" because validation recurses. + +## 5. Not retrieved + +The rationale for 500 in MessagePack-CSharp; the Newtonsoft 13.0.1 release note; the fix depth +chosen by msgpack-java and serde-json-wasm; protobuf write-side behaviour; decode.go's use of +`checkValid`; MessagePack-CSharp writer code; simdjson's depth-error semantics. diff --git a/docs/research/py-msgpack-default/README.md b/docs/research/py-msgpack-default/README.md new file mode 100644 index 00000000..03388625 --- /dev/null +++ b/docs/research/py-msgpack-default/README.md @@ -0,0 +1,22 @@ +# Python MessagePack default payload: history and probes (2026-10-11) + +Serves `cultlib-gaps:ruling:py-msgpack-default` and `cultlib-gaps:cut_spec:cut-py-msgpack-default.r1`. + +## How a JSON payload default got into .cc + +1. Ghostlight `2531b42` (2026-05-06), the first consumer: "The JSONL store is deliberate bootstrap plumbing", msgpack optional. +2. CultLib `b214daab` (2026-05-24) squashed in `python/cultcache-py` from GameCult/cultcache-py@9b4bbb8a with + `define_document_type` already defaulting to `_json_payload_encoder`; msgpack was an optional extra and the README + promised a standard-library-only bootstrap. JSON was the default because it was the only codec without msgpack. +3. CultLib `a1ef58cb` (2026-06-13) made msgpack a hard dependency but kept the JSON default and the optional-import + guards, so the default outlived its reason. +4. Earlier history is unreachable (GameCult/cultcache-py no longer exists; CultLib holds only the squash). voidbot + `search_history` found no discussion of the choice. + +## Probes + +- `probe1.py`, `probe2.py`: no runtime records a payload's format in the store, so a reader cannot tell JSON from + MessagePack except by trying; a one-byte JSON payload `0`-`9` is valid MessagePack (48-57); a MessagePack map with + a non-str/bytes key packs but `unpackb` refuses it. +- `rmpprobe/`: `rmp_serde::from_slice` reads a JSON object's bytes as `Number(123)`, which is why Brokkr's daemon must + read exactly one MessagePack value with a trailing-bytes check. diff --git a/docs/research/py-msgpack-default/probe1.py b/docs/research/py-msgpack-default/probe1.py new file mode 100644 index 00000000..7276ab25 --- /dev/null +++ b/docs/research/py-msgpack-default/probe1.py @@ -0,0 +1,47 @@ +import json, sys, msgpack +print(sys.version.split()[0], msgpack.version) +def pk(v): return msgpack.packb(v, use_bin_type=True) +def up(b): return msgpack.unpackb(b, raw=False) +def jd(v): return json.dumps(v, ensure_ascii=False, sort_keys=True).encode() +cases = {"dict": {"schema":"x","n":1}, "list":[1,2], "str":"hi", "digit":5, "neg":-3, "true":True, "null":None, "float":1.5, "bigdigit":12} +print("== msgpack.unpackb on JSON payloads") +for k,v in cases.items(): + b = jd(v) + try: r = up(b); print(k, b, "->ACCEPTED", repr(r)) + except Exception as e: print(k, b, "->", type(e).__module__+"."+type(e).__name__, isinstance(e, ValueError), str(e)[:60]) +print("== json.loads on msgpack payloads") +for k,v in cases.items(): + b = pk(v) + try: r = json.loads(b.decode("utf-8")); print(k, b, "->ACCEPTED", repr(r)) + except Exception as e: print(k, b, "->", type(e).__name__, str(e)[:50]) +print("== semantic differences, value -> json roundtrip vs msgpack roundtrip") +diffs = {"intkeys": {1:"a"}, "tuple": (1,2), "bytes": b"ab", "bigint": 2**70, "nan": float("nan"), "boolkey": {True:1}, "nested_intkey": {"a":{2:3}}, "set": {1,2}, "order": {"b":1,"a":2}} +for k,v in diffs.items(): + out=[] + try: out.append("json:"+repr(json.loads(jd(v)))) + except Exception as e: out.append("json:"+type(e).__name__) + try: b=pk(v) + except Exception as e: out.append("pack:"+type(e).__name__+":"+str(e)[:40]); print(k, out); continue + try: out.append("mp:"+repr(up(b))) + except Exception as e: out.append("unpack:"+type(e).__name__+":"+str(e)[:60]) + try: out.append("mp_nonstrict:"+repr(msgpack.unpackb(b, raw=False, strict_map_key=False))) + except Exception as e: out.append("ns:"+type(e).__name__) + print(k, out) +print("== custom node classes") +import collections, types +class OnlyIter: + def __iter__(self): return iter([1]) +for k,v in {"deque":collections.deque([1]), "mappingproxy":types.MappingProxyType({"a":1}), "userlist":collections.UserList([1]), "onlyiter":OnlyIter(), "frozenset":frozenset([1]), "userdict":collections.UserDict({"a":1})}.items(): + r=[] + for name,f in (("pack",pk),("json",jd)): + try: f(v); r.append(name+":ok") + except Exception as e: r.append(name+":"+type(e).__name__) + print(k, r) +print("== JSON read recursion threshold") +for d in (900, 1000, 3000, 5000, 10000, 100000): + try: json.loads("["*d + "]"*d); print(d, "ok") + except RecursionError: print(d, "RecursionError") +print("== msgpack read deep") +for d in (300, 1000, 2000, 100000): + try: up(b"\x91"*d + b"\xc0"); print(d,"ok") + except Exception as e: print(d, type(e).__module__, type(e).__name__) diff --git a/docs/research/py-msgpack-default/probe2.py b/docs/research/py-msgpack-default/probe2.py new file mode 100644 index 00000000..259320eb --- /dev/null +++ b/docs/research/py-msgpack-default/probe2.py @@ -0,0 +1,33 @@ +# Brokkr-shaped flow at CultLib 9d7b5842: a store written by today's JSON default, then read by a MessagePack-default definition. +import sys, tempfile, os, json, msgpack, timeit, dataclasses +sys.path.insert(0, r"F:/Projects/CultLib/packages/cultcache-py/src") +import cultcache_py as cc +from cultcache_py.stores import SingleFileMessagePackBackingStore +d = tempfile.mkdtemp(); path = os.path.join(d, "blender-editor.ccmp") +def open_cache(defn): + c = cc.CultCache.builder().register_document_type(defn).add_generic_store(SingleFileMessagePackBackingStore(path)).build() + c.pull_all_backing_stores(); return c +old = cc.define_document_type("brokkr.sync.var.v0") +value = {"schema": "brokkr.sync.var.v0", "syncVarId": "v1", "enabled": True, "kind": "transform", "updatedAt": "2026-10-11T00:00:00Z"} +c = open_cache(old); c.put(old, "sync/vars/v1", value) +raw = msgpack.unpackb(open(path, "rb").read(), raw=False) +print("store header", raw[0], "catalog entry", raw[1][0][:5] if raw[1] else None) +print("record", raw[2][0][:3], "payload", raw[2][0][3][:40]) +# MessagePack-default reader, today's _messagepack pair standing in for the proposed default +new = cc.define_document_type("brokkr.sync.var.v0", payload_encoder=lambda t: msgpack.packb(t, use_bin_type=True), payload_decoder=lambda b: msgpack.unpackb(b, raw=False)) +try: open_cache(new); print("new reader: ACCEPTED") +except Exception as e: print("new reader refused:", type(e).__module__, type(e).__name__, str(e)[:80]) +# opt-in JSON pair reads it +print("json opt-in reads:", open_cache(old).get(old, "sync/vars/v1") == value) +# migration: read with JSON definition, write with MessagePack definition, same key +v = open_cache(old).get(old, "sync/vars/v1"); c2 = cc.CultCache.builder().register_document_type(new).add_generic_store(SingleFileMessagePackBackingStore(path)).build() +c2._state # not pulled: pull would fail on the JSON doc +try: + c2.put(new, "sync/vars/v1", v); print("put without pull ok") +except Exception as e: print("put without pull:", type(e).__name__, str(e)[:80]) +print("after migration new reader reads:", open_cache(new).get(new, "sync/vars/v1") == value) +# size and speed, one Brokkr-shaped document +jb = json.dumps(value, ensure_ascii=False, sort_keys=True).encode(); mb = msgpack.packb(value, use_bin_type=True) +print("bytes json", len(jb), "msgpack", len(mb)) +print("encode us json %.2f msgpack %.2f" % (timeit.timeit(lambda: json.dumps(value, ensure_ascii=False, sort_keys=True).encode(), number=100000)*10, timeit.timeit(lambda: msgpack.packb(value, use_bin_type=True), number=100000)*10)) +print("decode us json %.2f msgpack %.2f" % (timeit.timeit(lambda: json.loads(jb.decode()), number=100000)*10, timeit.timeit(lambda: msgpack.unpackb(mb, raw=False), number=100000)*10)) diff --git a/docs/research/py-msgpack-default/rmpprobe/Cargo.toml b/docs/research/py-msgpack-default/rmpprobe/Cargo.toml new file mode 100644 index 00000000..05ae7ca1 --- /dev/null +++ b/docs/research/py-msgpack-default/rmpprobe/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rmpprobe" +version = "0.1.0" +edition = "2021" +[dependencies] +rmp-serde = "=1.3.1" +serde_json = "1" +serde = "1" diff --git a/docs/research/py-msgpack-default/rmpprobe/src/main.rs b/docs/research/py-msgpack-default/rmpprobe/src/main.rs new file mode 100644 index 00000000..198c4760 --- /dev/null +++ b/docs/research/py-msgpack-default/rmpprobe/src/main.rs @@ -0,0 +1,21 @@ +fn main() { + let json_obj = br#"{"enabled":true,"kind":"transform","schema":"brokkr.sync.var.v0"}"#; + let r: Result = rmp_serde::from_slice(json_obj); + println!("rmp_serde on a JSON object payload: {:?}", r); + let mp = rmp_serde::to_vec(&serde_json::json!({"schema":"x","n":1})).unwrap(); + println!("rmp_serde::to_vec of a json! object, first byte {:#04x} len {}", mp[0], mp.len()); + let j: Result, _> = serde_json::from_slice(&mp); + println!("serde_json on that MessagePack map: {:?}", j.map(|_| ()).map_err(|e| e.to_string())); + let mut de = rmp_serde::Deserializer::from_read_ref(&json_obj[..]); + let v: serde_json::Value = serde::Deserialize::deserialize(&mut de).unwrap(); + println!("one_value(json obj) = {:?}; one_value(mp) = {:?}", one_value(json_obj), one_value(&mp).map(|_| ())); + println!("consumed {} of {} bytes, value {:?}", de.get_ref().len() as usize, json_obj.len(), v); +} +#[allow(dead_code)] +fn one_value(bytes: &[u8]) -> Result { + let mut de = rmp_serde::Deserializer::new(std::io::Cursor::new(bytes)); + let v: serde_json::Value = serde::Deserialize::deserialize(&mut de).map_err(|e| e.to_string())?; + let used = de.get_ref().position() as usize; + if used != bytes.len() { return Err(format!("{} trailing bytes after the first MessagePack value", bytes.len() - used)); } + Ok(v) +} diff --git a/docs/research/py-slot-scalar-types-prior-art.md b/docs/research/py-slot-scalar-types-prior-art.md new file mode 100644 index 00000000..34a350d4 --- /dev/null +++ b/docs/research/py-slot-scalar-types-prior-art.md @@ -0,0 +1,160 @@ +# Python slot scalar types vs the C# reference: facts and pointers + +Fork served: cultlib-gaps: Python slot scalar types vs the C# reference's refusals, raised by cut-union-bounds-py.h1 undone. +Date: 2026-10-11. Gathered by eyes-py-slot-scalar-types (read-only). Facts and pointers only; no recommendation. + +Checkout caveat: line numbers below are the operator checkout at `main` 4ea296ae. cultcache-py's bounds cut lives on +branch `hands/union-bounds-py` (head 4328ddb4); cultcache-ts's union codec lives on `hands/union-codec-ts` +(absent from `main`: `git ls-tree HEAD packages/cultcache-ts/src` has no `codec.ts`). + +## 1. In CultLib + +### 1.1 The measured gap (the trigger) + +Verdict `cultlib-gaps:verdict:cut-union-bounds-py.s1`, claim `scalar-type-parity-unproven`, outcome Unproven, no finding +(spec did not promise it). Probe `cross.py g-` files, 168 cases, job1.log: +- 13 scalar slots x 8 wrong values; agree 86; C# refuses and Python accepts 82; C# accepts and Python refuses 0. +- String slots (Id, Box.Id, Text.Id, Text.Content, Image.Uri, Image.Alt, Comp.Name, Pending.Message, Tool.Name): + Python accepts int, float, true, bin, array, map (refuses neither str nor nil, as C#). +- Int slots (Version, Completed.SourceVersion, Tool.Uses, Part.Count): Python accepts float, str, true, bin, array, map + and nil; int5 agrees. +- All 8 container-shape slots (children list, record, slot list, outcomes list, arm slots, union x2, document) agree on + every wrong value (64 shape replacements agree). So only scalar leaves differ. +- Related earlier finding: `cultlib-gaps:finding:cut-union-codec-py.s2.python-decode-slot-strictness-differs` + (Python accepts Tool wire value [1,['hammer',12]] as Text(content=12), C# refuses; Python refuses short Gem value, + C# accepts with default). Resolved Deferred to `cultlib-gaps:cut_spec:cut-union-bounds-py.r1`. + +### 1.2 C# reference: how a slot's scalar type is declared and refused + +- Declaration is the C# member type plus `[Key(n)]`; there is no CultLib scalar-type vocabulary. + `src/GameCult.Caching/README.md:16-27` (example), `src/GameCult.Caching/Contracts/cultcache-schema-compatibility.md:31-35` + ("A member's slot is its MessagePack `[Key(n)]` integer"). +- Registry checks are structural only (CultCache.cs:1015-1053, messages 1430-1461: needs [MessagePackObject], [Key] on every + public member, no string keys, distinct keys, constructor shape). +- The wrong-scalar refusal is made by MessagePack-CSharp's per-type formatter (external library, not CultLib code); CultLib + contains no scalar-type check of its own. (Grep of `src/` for scalar/wrong-type checks found none; unions get a guard: + `src/GameCult.Caching.MessagePack/CultUnionGuard.cs:44-50` refuses non-integer key, key outside Int32, undeclared key, + nil arm slots.) +- Published schema: each member's `TypeName` is generated from the member's CLR type, + `CultCache.cs:647` `TypeName = CultSchemaTypeNames.FromType(member.MemberType)`; `CultSchemaTypeNames.cs:9-31` yields + `System.String`, `System.Int32`, `System.String[]`, `System.Collections.Generic.List<...>`. + Catalog members persisted with `Slot, MemberName, TypeName, IsReference, IsMany, TargetSchemaName, IndexAlias, IsName` + (`CultDocumentMessagePackSerialization.cs:465-496`; `CultCache.cs:39,326`). +- The catalog TypeName is load-bearing at open: `CultCache.cs:874-877` a persisted member with a different TypeName is an + error (`slot N changed type 'A' -> 'B'`); an absent member is only a warning (`:863-872`). The catalog names a type; no + code reads it to validate payload scalars on read. + +### 1.3 cultcache-rs + +- Slot types are the Rust field types, enforced by serde. `packages/cultcache-rs/cultcache-rs-derive/src/lib.rs`: + `#[cultcache(key = N)]` per field (`:126-171`), `slot_codec` (`:177`) generates `Serialize` as a positional tuple with nil + gaps and `Deserialize` by slot (`:213-258`), extra trailing slots skipped with `IgnoredAny` (`:233`, `:305`). `bytes` and + `default` attributes are the only extras (`:175-176`). Union: `CultUnion` derive, arm key Int32, unknown key a decode error + (`:87-97`, `:326-340`; `packages/cultcache-rs/README.md:187-196`). +- No separate scalar-type vocabulary; no catalog-type derivation was looked for in rs here (not read). + +### 1.4 cultcache-ts + +- On `main`: no slot codec. `packages/cultcache-ts/src/document.ts:51-64` takes author-declared schema members and refuses + an empty `typeName`; `types.ts:22-24` member has `slot`, `typeName`. `swarm-documents.ts:91-95` hand-writes + `typeName: "string"|"long"|"object"`. Payload encode/decode is a user function (`types.ts:17-18`). +- On branch `hands/union-codec-ts`, `packages/cultcache-ts/src/codec.ts`: typed leaf codecs `string`, `boolean`, `bytes`, + `int32`, `int64`, `float32`, `float64`, `list`, `array`, `nullable`, each with the reference's `typeName` + (`"System.String"`, `"System.Int32"`, ... lines 39-128) and `expect`/`refuse` on a wrong kind in both encode and decode + (lines 31-42, 60-79). `SlotsCodec.members` derives the schema catalog from the slot codecs (lines 17-20). Header + comment lines 5-8 say the reference refuses a store whose slot names another type. +- Precedent in the mind: finding `cultlib-gaps:finding:cut-union-codec-ts.s1.codec-catalog-refused-by-reference` (High, + Fixed 0882eee9): TS codec first derived `System.Object` for every slot; C# refused the whole store (7 slots). + +### 1.5 cultcache-py today + +- Slot = `DatabaseEntryField(name, key, default, codec, many)`; `codec` is a `SlotCodec` (encode/decode callables) only for + nested record or union (`documents.py:61-92`). A scalar slot has no codec and no type: `encode_slot`/`decode_slot` + return the value unchanged when `field.codec is None` (`:370-386`). Consumers write `("name", 0)` tuples, 3-tuples with a + default, or `database_entry_field("body", 1, codec=..., many=True)` (`:276-283, 417-`; + `packages/cultcache-py/tests/test_union_parity.py:25-59`; README `packages/cultcache-py/README.md:30,114-148`). +- Python-side checks that exist: record is a list (`:394-396`), missing required slot (`:398-409`), union shape/arm key + (`:313-325`, bool excluded by `_is_key` `:346-347`), many-slot is a list (`:383-384`), key >= 0 (`:88-89`). +- Catalog: `define_database_entry_type` emits every member with `type_name="System.Object"` (`documents.py:244`) and + `canonical_schema_json` built from the members (`:140-160`). `interop.py:38-46` instead hard-codes C# names + (`System.String`, `System.String[]`) for its one fixed document. + Same `System.Object` default earlier caused the TS finding in 1.4 (finding text: "the codec's default copies Python's + define_database_entry_type, whose own stores would hit the same refusal"). +- Published schema carrying slot types for Python to read: the C# catalog carries `TypeName` per slot (1.2), persisted in + the store and compared at open; `interop.py` shows Python reading catalog entries. No JSON Schema / CultNet schema with + scalar types was found by grep in cultcache-py; `canonical_schema_json` in Python is built from `type_name` members. + Whether a CultNet schema catalog outside the store (cultnet-py) exposes slot scalar types was not checked. + +### 1.6 Probe: the C# reference opening Python-written stores (2026-10-11, imagination-cl-py-slot-types) + +Section 1.5 left this untested. Python 3.13 and cultcache-py at main 2037dd44 wrote four single-file stores of +`cultcache.interop-note`. The C# reference at 2037dd44 read them through +`tests/GameCult.Caching.InteropPeer read --file` (dotnet sdk 10.0 on Yggdrasil, ygg-verify job1). The scripts and +log are in the Imagination scratchpad `imagination-cl-py-slot-types/` (`write_stores.py`, `cmd.txt`, `job1.log`). + +| Store | Python definition | Payload | C# result | +|---|---|---|---| +| a | `interop.py` (`define_document_type`, catalog members hand-typed `System.String`, `System.String[]`) | correct | opens, record read | +| b | `define_database_entry_type`, same schema name and version as C# | correct | refused: `Persisted schema 'cultcache.interop-note' ... is incompatible ...: slot 0 changed type 'System.Object' -> 'System.String'; slot 1 ...` (every slot) | +| c | as b | `title = 12` | refused at the catalog, as b | +| d | as a (typed catalog) | `title = 12`, accepted by Python on write | refused at decode: `Record 'note:python-d' ... cannot be decoded ... Unexpected msgpack code 12 (positive fixint)` | + +Mechanism (source read): the C# schema id is a SHA-256 of the semantic fingerprint (`CultCache.cs:656-658`), while +Python's defaults to the type name. A Python-written entry therefore never matches by id. It resolves by schema name +(`CultCache.cs:518-521`), and the content hashes differ, so `CompareSchemaShapes` runs and refuses any TypeName mismatch +(`:874-877`). The refusal is thrown from the pull, so the C# cache does not open the store at all. + +Consequences: +- `define_database_entry_type` has no `members` or per-slot type parameter (`documents.py:214-229`). An ordinary + Python consumer cannot write a store that a C# peer with the same schema name will open. The only way to get one is + to hand-build `define_document_type` with typed members, as `interop.py` does. This is the TS finding + `cut-union-codec-ts.s1.codec-catalog-refused-by-reference` again, this time in Python. +- Store d: a wrong scalar that Python accepts on write makes the store unreadable to the C# reference. +- A C# `object` member is also cataloged `System.Object`, and MessagePack-CSharp's object formatter accepts any + value. Python's current default is therefore true of a C# `object` slot, and false for every typed C# slot. + +Real consumer definitions for scale (source read): `cultnet_py/cultmesh_contracts.py:626-698` +(`CultMeshSimulationFact`, a frozen dataclass annotated `str`, `int`, `float`, `str | None`, passed as `cls=`), and +`repixelizer/src/repixelizer/verse_state.py:77-118` (dict values with no `cls`; `("value", 0)` and `("surface", 4)` +hold whole nested structures in one slot, which is a genuine "any" slot). Python annotations do not carry the C# widths: +`int` cannot say Int32 or Int64, and `float` cannot say Single or Double. + +## 2. Prior art (dynamic host, declared field types) + +| System | Types come from | Write | Read | Evidence | +|---|---|---|---|---| +| protobuf python | .proto IDL, generated classes | type-checked on field assignment (`TypeError`; `ValueError` out of range; bool rejected for int) | wire-type mismatch handling not stated in docs | protobuf.dev/reference/python/python-generated ("setting `foo` to a value of the wrong type will raise a `TypeError`"); `type_checkers.py` (IntValueChecker rejects bool `TypeError`, out of range `ValueError`; UnicodeValueChecker non-UTF-8 `ValueError`) https://raw.githubusercontent.com/protocolbuffers/protobuf/main/python/google/protobuf/internal/type_checkers.py ; proto3 guide: wire format "doesn't provide a way to detect fields encoded using one definition and decoded using another" https://protobuf.dev/programming-guides/proto3/ | +| Apache Avro python | Avro schema (JSON), not host code | `DatumWriter.write` calls `validate(..., raise_on_error=True)` -> `AvroTypeException`; union branch picked by non-raising validate | reader does not validate values; checks schema resolution (`SchemaResolutionException`) and decodes by writer schema | https://raw.githubusercontent.com/apache/avro/main/lang/py/avro/io.py ; fastavro writer: `validator` parameter "validation will be done on the records" (opt-in) https://fastavro.readthedocs.io/en/latest/writer.html | +| Thrift python | .thrift IDL, generated code | generated `write` calls `validate()` which checks required-field presence only (not scalar types); `writeFieldBegin` writes the given type unchecked | generated read emits `if ftype == TType.X:` ... `else: iprot.skip(ftype)`: a wrong wire type is silently skipped, field left unset | t_py_generator.cc `generate_py_struct_reader`, `generate_py_struct_required_validator` https://raw.githubusercontent.com/apache/thrift/master/compiler/cpp/src/thrift/generate/t_py_generator.cc ; TBinaryProtocol.py `writeFieldBegin`/`readFieldBegin` have no type check | +| pydantic v2 | Python annotations in host code | validates input at construction / `validate_python` / `validate_json`; lax coercion default, strict opt-in per call, field or config | same entry points | https://pydantic.dev/docs/validation/latest/concepts/strict_mode/ ("Lax mode (default) coerces"; page does not say assignment or serialization validates) | +| msgspec | Python annotations (Struct) in host code | docs (not retrieved; search snippet only): encode serializes values without enforcing annotations | decode validates against the `type=` and raises `ValidationError`; `array_like=True` encodes Struct as positional array | search result only, unverified: https://jcristharif.com/msgspec/usage.html (fetch returned 404 for usage/structs/supported-types pages) | +| Cap'n Proto (pycapnp) | .capnp schema loaded at runtime (`capnp.load`) | assignment type-error behavior not documented on the fetched page | n/a (pointer-based, no parse step) | https://capnproto.github.io/pycapnp/capnp.html (schema loading: "much like loading a Python module") | +| FlatBuffers python | .fbs schema, `flatc --python` generated typed accessors/builders | no runtime type validation stated on the fetched page | typed accessors read at fixed offsets; no value validation stated | https://flatbuffers.dev/languages/python/ | +| MessagePack (msgpack-python) | none | none | none | no IDL; the format is schemaless (msgpack-python itself not fetched) | + +Observed pattern in the fetched sources, stated as fact only: +- Type source is an IDL/schema in protobuf, Avro, Thrift, Cap'n Proto, FlatBuffers; host-code annotations in pydantic and + msgspec. +- Write-side type checking: protobuf (assignment), Avro (default on), pydantic/msgspec (on construction/decode of input); + Thrift write checks required presence only; fastavro opt-in. +- Read-side: Avro reader trusts the writer schema; Thrift generated reader skips mismatched wire types; protobuf docs silent. + +Not retrieved / unverified: pycapnp assignment error; FlatBuffers runtime checks; Thrift generated `validate` on type; +msgspec authoritative statements; protobuf python parse behavior for wrong wire type. + +## 3. Precedent in the mind + +Tool `query` (`eureka-state`), semantic "python slot scalar type validation parity with C# reference", top_k 10, no schema +filter (a `schemas` filter named Ruling/Resolution/Finding was refused: no such schema; schema names are +`.`-style, not enumerated here). Roots variants and cultlib-gaps both appeared; matched 40. Relevant hits: +- `cultlib-gaps:finding:cut-union-codec-py.s2.python-decode-slot-strictness-differs` (PreExisting, Low, Deferred to + union-bounds-py.r1): first record of Python decode strictness differing in both directions. +- `cultlib-gaps:finding:cut-union-codec-ts.s1.codec-catalog-refused-by-reference` (High, Fixed): `System.Object` catalog + types refused by the reference; evidence note says Python's `define_database_entry_type` default has the same shape. +- `cultlib-gaps:finding:cut-union-codec-py.s1.missing-field-typed-item` (Fixed 36aa1a44): Python fixture declared slot 6 as + Item union where C# says Node?; golden carried nil so tests passed. +- `aetheria-release:follow_up:py-float-width-parity`: Python msgpack round-trip widens float32 to float64 (204 -> 284 bytes); + float width is another undeclared-scalar-type consequence in Python (owner CultLib cultcache-py). +- `cultlib-gaps:cut_spec:cut-slot-readonly-parity.r2` and `cut-slot-tolerance.r*`: read-only/unread-slot rules, adjacent. +- No ruling or follow_up was returned that decides scalar-type parity for Python. A dedicated Ruling query was not run + (schema id unknown; the only attempted names were refused). diff --git a/docs/research/py-typed-leaves-probe/PyLeavesProbe.cs b/docs/research/py-typed-leaves-probe/PyLeavesProbe.cs new file mode 100644 index 00000000..56913a3c --- /dev/null +++ b/docs/research/py-typed-leaves-probe/PyLeavesProbe.cs @@ -0,0 +1,100 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using GameCult.Caching; +using GameCult.Caching.MessagePack; +using MessagePack; +using NUnit.Framework; + +namespace GameCult.Caching.Tests.PyLeavesProbe +{ + [MessagePackObject] public sealed class ProbeInner { [Key(0)] public string N = ""; [Key(1)] public float W; } + [Union(0, typeof(ProbeCircle))] public interface IProbeShape { } + [MessagePackObject] public sealed class ProbeCircle : IProbeShape { [Key(0)] public float R; } + + [CultDocument("cultcache.py-leaves-probe", "cultcache.py_leaves_probe.v1")] + [MessagePackObject] + public sealed class ProbeDoc + { + [Key(0)] [CultName] public string Id = ""; + [Key(1)] public bool Flag; + [Key(2)] public byte[] Blob = Array.Empty(); + [Key(3)] public int I; + [Key(4)] public long L; + [Key(5)] public float F; + [Key(6)] public double D; + [Key(7)] public int? MaybeI; + [Key(8)] public List Tags = new(); + [Key(9)] public string[] Names = Array.Empty(); + [Key(10)] public object? Any; + [Key(11)] public ProbeInner? Nested; + [Key(12)] public List Items = new(); + [Key(13)] public IProbeShape? Shape; + [Key(14)] public float[] Floats = Array.Empty(); + [Key(15)] public float? MaybeF; + } + + [MessagePackObject] public sealed class S1 { [Key(0)] public string? V; } + [MessagePackObject] public sealed class B1 { [Key(0)] public bool V; } + [MessagePackObject] public sealed class Y1 { [Key(0)] public byte[]? V; } + [MessagePackObject] public sealed class O1 { [Key(0)] public object? V; } + [MessagePackObject] public sealed class LS1 { [Key(0)] public List? V; } + [MessagePackObject] public sealed class NI1 { [Key(0)] public int? V; } + [MessagePackObject] public sealed class R1 { [Key(0)] public ProbeInner? V; } + [MessagePackObject] public sealed class U1 { [Key(0)] public IProbeShape? V; } + [MessagePackObject] public sealed class LI1 { [Key(0)] public List? V; } + + public class PyLeavesProbeTests + { + static readonly MessagePackSerializerOptions Options = CultDocumentMessagePackSerialization.OptionsFor(typeof(PyLeavesProbeTests).Assembly); + + [Test] + public void TypeNames() + { + var names = typeof(CultCache).Assembly.GetType("GameCult.Caching.CultSchemaTypeNames")!.GetMethod("FromType")!; + foreach (var t in new[] { typeof(string), typeof(bool), typeof(byte[]), typeof(int), typeof(long), typeof(float), typeof(double), + typeof(int?), typeof(bool?), typeof(float?), typeof(List), typeof(string[]), typeof(List), typeof(object), + typeof(ProbeInner), typeof(List), typeof(IProbeShape), typeof(float[]), typeof(List>), + typeof(Dictionary), typeof(byte[][]) , typeof(List)}) + TestContext.Out.WriteLine($"TYPENAME {t} => {names.Invoke(null, new object[] { t })}"); + } + + [TestCase("a-leaf-catalog.cc")] + [TestCase("b-wrong-leaf.cc")] + public async Task OpenPythonStore(string file) + { + var path = Path.Combine("/tmp/pyst", file); + try + { + var cache = new CultCache(); + cache.AddBackingStore(new SingleFileMessagePackBackingStore(path)); + await cache.PullAllBackingStoresAsync(); + var doc = cache.AllEntries.OfType().Single(); + var bytes = MessagePackSerializer.Serialize(doc, Options); + TestContext.Out.WriteLine($"OPEN {file} OK id={doc.Id} F={doc.F:R} Shape={doc.Shape?.GetType().Name} Any={doc.Any?.GetType().Name} items={doc.Items.Count}"); + TestContext.Out.WriteLine($"CSHARP-REWRITE {file} {Convert.ToHexString(bytes).ToLowerInvariant()}"); + } + catch (Exception e) + { + TestContext.Out.WriteLine($"OPEN {file} REFUSED {e.GetType().Name}: {e.Message.Split('\n')[0]}"); + } + } + + static readonly string[] Values = { "05", "ff", "cb3ff8000000000000", "ca3fc00000", "c0", "c2", "c3", "a161", "d90161", "c40100", "90", "9101", "91a161", "80", "81a161a162", "920091ca3f800000" }; + + static string Try(byte[] p) { try { var v = MessagePackSerializer.Deserialize(p, Options); return "ok"; } catch { return "--"; } } + + [Test] + public void ScalarReads() + { + foreach (var v in Values) + { + var p = Convert.FromHexString("91" + v); + TestContext.Out.WriteLine($"READ {v,-22} string={Try(p)} bool={Try(p)} bytes={Try(p)} object={Try(p)} list={Try(p)} int?={Try(p)} record={Try(p)} union={Try(p)} list={Try(p)}"); + } + } + } +} diff --git a/docs/research/py-typed-leaves-probe/README.md b/docs/research/py-typed-leaves-probe/README.md new file mode 100644 index 00000000..acb2866f --- /dev/null +++ b/docs/research/py-typed-leaves-probe/README.md @@ -0,0 +1,17 @@ +# Python typed leaves: probe evidence (2026-10-11) + +Serves `cultlib-gaps:ruling:py-slot-typed-leaves` and the specs +`cultlib-gaps:cut_spec:cut-leaf-vectors-cs.r1` and `cut-py-typed-leaves.r1`. +Run by the Imagination pass `imagination-cl-py-typed-leaves` on Yggdrasil at CultLib main 4ec4bfb7. + +- `write_probe_stores.py` + `PyLeavesProbe.cs`: a Python store whose catalog uses the leaf type names + (from `CultSchemaTypeNames.FromType`) is opened by the C# reference and its payload rewritten byte-identical, + float32 included (except inside an `object` slot, where C# itself rewrites a fixint as uint8). Negative control: + one slot named Int64 where C# has Int32 is refused ("slot 3 changed type"). +- `proto_leaves.py` + `run_vectors.py`: prototype leaves reproduce the C# numeric-leaves vectors (160 reads, 46 writes, + the mixed record). `truth.py`: what C# accepts per slot type (byte[] accepts str; bool only false/true; record + accepts []; nil in an int slot refused). +- `perf.py`: float32 via a marker with packb-first fallback; a 1.5k-node record with float32 about 0.8 ms vs 0.1 ms. +- `job1.log`: the verify run. + +Scripts are probes, not a suite; they are kept so the next pass can rerun them. diff --git a/docs/research/py-typed-leaves-probe/perf.py b/docs/research/py-typed-leaves-probe/perf.py new file mode 100644 index 00000000..61fc7f28 --- /dev/null +++ b/docs/research/py-typed-leaves-probe/perf.py @@ -0,0 +1,22 @@ +import sys, time, msgpack +sys.path.insert(0, sys.argv[1]); import proto_leaves as L +# a HullData-like record: 20 float32 slots, strings, nested list of 200 small records +rec = lambda i: ["part%d" % i, i, [L.Float32(0.5*i), L.Float32(1.5), L.Float32(2.5)], None] +tree = ["id", 3, [L.Float32(float(i)) for i in range(20)], [rec(i) for i in range(200)]] +plain = ["id", 3, [float(i) for i in range(20)], [["part%d" % i, i, [0.5*i,1.5,2.5], None] for i in range(200)]] +N=300 +t=time.perf_counter(); [L.write(tree) for _ in range(N)]; a=time.perf_counter()-t +t=time.perf_counter(); [msgpack.packb(plain, use_bin_type=True) for _ in range(N)]; b=time.perf_counter()-t +t=time.perf_counter(); [msgpack.unpackb(msgpack.packb(plain)) for _ in range(N)]; c=time.perf_counter()-t +print(f"walk-writer {a/N*1e6:.0f} us/rec, packb {b/N*1e6:.0f} us/rec, ratio {a/b:.1f}x; size {len(L.write(tree))} vs {len(msgpack.packb(plain))}") +def pack_tree(t): + try: return msgpack.packb(t, use_bin_type=True) + except TypeError: return L.write(t) +assert pack_tree(plain) == L.write(plain) == msgpack.packb(plain, use_bin_type=True) +assert pack_tree(tree) == L.write(tree) +t=time.perf_counter(); [pack_tree(plain) for _ in range(N)]; p=time.perf_counter()-t +t=time.perf_counter(); [pack_tree(tree) for _ in range(N)]; q=time.perf_counter()-t +print(f"pack_tree plain {p/N*1e6:.0f} us, float32 tree {q/N*1e6:.0f} us") +try: + pack_tree([object()]) +except TypeError as e: print("custom object:", e) diff --git a/docs/research/py-typed-leaves-probe/proto_leaves.py b/docs/research/py-typed-leaves-probe/proto_leaves.py new file mode 100644 index 00000000..8f1c479e --- /dev/null +++ b/docs/research/py-typed-leaves-probe/proto_leaves.py @@ -0,0 +1,87 @@ +"""Scratch prototype of cultcache_py.leaves, to establish mechanisms against the C# vectors. Not for the repo.""" +import math, struct, msgpack + +class Refused(ValueError): pass + +def kind(v): + if v is None: return "nil" + if isinstance(v, bool): return "a boolean" + if isinstance(v, int): return "an integer" + if isinstance(v, float): return "a float" + if isinstance(v, str): return "a string" + if isinstance(v, (bytes, bytearray, memoryview)): return "bytes" + if isinstance(v, (list, tuple)): return "an array" + if isinstance(v, dict): return "a map" + return type(v).__name__ + +def refuse(what, v): raise Refused(f"expected {what}, found {kind(v)}") + +class Float32: # tree marker: written as MessagePack float 32 + __slots__ = ("value",) + def __init__(self, v): self.value = v + +def int_to_f32(v: int) -> float: + if abs(v) <= 2**53: + return f32(float(v)) + m = abs(v); excess = m.bit_length() - 24 + kept = m >> excess; rest = m - (kept << excess); half = 1 << (excess - 1) + if rest > half or (rest == half and kept & 1): kept += 1 + r = float(kept) * 2.0**excess # kept<=2^24 exact; scaling exact unless overflow + return f32(-r if v < 0 else r) + +def f32(x: float) -> float: + try: + return struct.unpack(">f", struct.pack(">f", x))[0] + except OverflowError: + return math.copysign(math.inf, x) + +class Leaf: + def __init__(self, type_name, enc, dec, value_type=False): + self.type_name, self.encode, self.decode, self.value_type = type_name, enc, dec, value_type + +def _int_leaf(name, what, lo, hi): + def enc(v): + if not isinstance(v, int) or isinstance(v, bool): refuse(what, v) + if not lo <= v <= hi: raise Refused(f"expected {what}, found an integer out of range") + return v + return Leaf(name, enc, enc, True) + +int32 = _int_leaf("System.Int32", "an int32", -2**31, 2**31-1) +int64 = _int_leaf("System.Int64", "an int64", -2**63, 2**63-1) + +def _f32_enc(v): + if isinstance(v, bool) or not isinstance(v, (int, float)): refuse("a float32", v) + return Float32(int_to_f32(v) if isinstance(v, int) else f32(v)) +def _f32_dec(v): + if isinstance(v, bool) or not isinstance(v, (int, float)): refuse("a float32", v) + return int_to_f32(v) if isinstance(v, int) else f32(v) +float32 = Leaf("System.Single", _f32_enc, _f32_dec, True) +def _f64(v): + if isinstance(v, bool) or not isinstance(v, (int, float)): refuse("a float64", v) + return float(v) # int > 2^53 rounds once (Python int->float is correctly rounded) +float64 = Leaf("System.Double", _f64, _f64, True) +def _str(v): + if v is not None and not isinstance(v, str): refuse("a string", v) + return v +string = Leaf("System.String", _str, _str) +def _bool(v): + if not isinstance(v, bool): refuse("a boolean", v) + return v +boolean = Leaf("System.Boolean", _bool, _bool, True) + +# writer: msgpack-python per value, float32 through a single-float packer, containers by header +_P = msgpack.Packer(use_bin_type=True) +_P32 = msgpack.Packer(use_bin_type=True, use_single_float=True) +def write(tree) -> bytes: + out = bytearray() + stack = [tree] + while stack: + n = stack.pop() + if isinstance(n, Float32): out += _P32.pack(n.value) + elif isinstance(n, list): + out += _P.pack_array_header(len(n)); stack.extend(reversed(n)) + elif isinstance(n, dict): + out += _P.pack_map_header(len(n)) + for k, v in reversed(list(n.items())): stack.append(v); stack.append(k) + else: out += _P.pack(n) + return bytes(out) diff --git a/docs/research/py-typed-leaves-probe/run_vectors.py b/docs/research/py-typed-leaves-probe/run_vectors.py new file mode 100644 index 00000000..c97f7b7a --- /dev/null +++ b/docs/research/py-typed-leaves-probe/run_vectors.py @@ -0,0 +1,25 @@ +import sys, struct, msgpack, math +sys.path.insert(0, sys.argv[2]) +import proto_leaves as L +d = sys.argv[1] +leaves = {"int32": L.int32, "int64": L.int64, "float32": L.float32, "float64": L.float64} +rows = msgpack.unpackb(open(d+"/reads.msgpack","rb").read(), raw=False) +bad = 0 +for leaf, payload, ok, bits in rows: + raw = msgpack.unpackb(payload, raw=False)[0] + try: + v = leaves[leaf].decode(raw); got = True + b = struct.pack(">q", v) if leaf.startswith("int") else struct.pack(">d", v) + except L.Refused: got, b = False, b"" + if got != ok or (ok and b != bits): + bad += 1; print("READ DIFF", leaf, payload.hex(), "C#", ok, bits.hex(), "py", got, b.hex()) +print("reads", len(rows), "diffs", bad) +wr = msgpack.unpackb(open(d+"/writes.msgpack","rb").read(), raw=False) +bad = 0 +for leaf, text, want in wr: + v = int(text) if leaf.startswith("int") else struct.unpack(">d", bytes.fromhex(text))[0] + got = L.write([leaves[leaf].encode(v)]) + if got != want: bad += 1; print("WRITE DIFF", leaf, text, want.hex(), got.hex()) +print("writes", len(wr), "diffs", bad) +mixed = L.write([L.string.encode("n1"), L.int32.encode(7), L.int64.encode(8), L.float32.encode(1.5), L.float64.encode(2.5)]) +print("mixed equal:", mixed == open(d+"/mixed-record.msgpack","rb").read(), mixed.hex()) diff --git a/docs/research/py-typed-leaves-probe/truth.py b/docs/research/py-typed-leaves-probe/truth.py new file mode 100644 index 00000000..1fc24e9d --- /dev/null +++ b/docs/research/py-typed-leaves-probe/truth.py @@ -0,0 +1,18 @@ +import msgpack, struct, sys +d = sys.argv[1] +rows = msgpack.unpackb(open(d+"/reads.msgpack","rb").read(), raw=False) +from collections import defaultdict +t = defaultdict(list) +for leaf, payload, ok, bits in rows: + tok = payload[1:].hex() + t[leaf].append((tok, ok, bits.hex())) +for leaf, cases in t.items(): + print(leaf, "accepts", sum(ok for _,ok,_ in cases), "of", len(cases)) + print(" refused:", [tok for tok,ok,_ in cases if not ok]) +# float accepted from integer? int from float? +f = msgpack.unpackb(open(d+"/float32-nan.msgpack","rb").read(), raw=False) +for p, b in f: + v = msgpack.unpackb(p)[0] + bits = struct.pack(">d", v).hex() + repacked = msgpack.packb([v], use_single_float=True).hex() + print("nan in", p.hex(), "C# out", b.hex(), "py double", bits, "py repack f32", repacked) diff --git a/docs/research/py-typed-leaves-probe/write_probe_stores.py b/docs/research/py-typed-leaves-probe/write_probe_stores.py new file mode 100644 index 00000000..bca857d3 --- /dev/null +++ b/docs/research/py-typed-leaves-probe/write_probe_stores.py @@ -0,0 +1,42 @@ +"""Writes Python stores whose catalog carries the C# type names the proposed leaves would derive, for the C# reference to open.""" +import sys, os +sys.path.insert(0, r"F:\Projects\CultLib\packages\cultcache-py\src"); sys.path.insert(0, os.path.dirname(__file__)) +import proto_leaves as L +from cultcache_py import CultCache, SingleFileMessagePackBackingStore +from cultcache_py.documents import define_document_type +from cultcache_py.backing_store import CultCacheSchemaCatalogMember as M + +NS = "GameCult.Caching.Tests.PyLeavesProbe" +LIST = "System.Collections.Generic.List<{}>" +MEMBERS = [ # slot, member, C# type name the leaf derives + (0, "Id", "System.String"), (1, "Flag", "System.Boolean"), (2, "Blob", "System.Byte[]"), + (3, "I", "System.Int32"), (4, "L", "System.Int64"), (5, "F", "System.Single"), (6, "D", "System.Double"), + (7, "MaybeI", "System.Nullable"), (8, "Tags", LIST.format("System.String")), + (9, "Names", "System.String[]"), (10, "Any", "System.Object"), (11, "Nested", NS + ".ProbeInner"), + (12, "Items", LIST.format(NS + ".ProbeInner")), (13, "Shape", NS + ".IProbeShape"), + (14, "Floats", "System.Single[]"), (15, "MaybeF", "System.Nullable"), +] +F32 = lambda x: L.Float32(L.f32(x)) +def payload(doc_id): + inner = lambda n, w: [n, F32(w)] + return [doc_id, True, b"\x01\x02", 7, 2**40, F32(0.1), 0.1, None, ["a", "b"], ["x"], {"k": [1, "two"]}, + inner("n", 1.25), [inner("i0", 0.5), inner("i1", 2.0)], [0, [F32(3.5)]], [F32(1.0), F32(0.1)], F32(2.5)] + +def write(path, members, tree_for): + doc = define_document_type( + "cultcache.py-leaves-probe", encode=lambda v: v, decode=lambda v: v, + payload_encoder=L.write, payload_decoder=lambda b: b, name=lambda v: v[0], + schema_name="cultcache.py-leaves-probe", schema_version="cultcache.py_leaves_probe.v1", + members=[M(slot=s, member_name=n, type_name=t, is_name=(s == 0)) for s, n, t in members]) + if os.path.exists(path): os.remove(path) + cache = CultCache.builder().register_document_type(doc).add_generic_store(SingleFileMessagePackBackingStore(path)).build() + cache.pull_all_backing_stores() + tree = tree_for(os.path.basename(path)) + cache.put(doc, tree[0], tree) + print(path, "payload", L.write(tree).hex()) + +out = sys.argv[1] +write(os.path.join(out, "a-leaf-catalog.cc"), MEMBERS, payload) +# negative control: the int32 slot cataloged as the int64 leaf would name it +wrong = [(s, n, "System.Int64" if s == 3 else t) for s, n, t in MEMBERS] +write(os.path.join(out, "b-wrong-leaf.cc"), wrong, payload) diff --git a/docs/research/read-only-record-signal-prior-art.md b/docs/research/read-only-record-signal-prior-art.md new file mode 100644 index 00000000..5a2dc3c3 --- /dev/null +++ b/docs/research/read-only-record-signal-prior-art.md @@ -0,0 +1,310 @@ +# Read-Only Record Signal: Prior Art Survey + +Facts file for Eureka question `variants:question:read-only-record-signal`: how a +developer learns that a held record is read-only before a write is refused. Its +options are (a) no new API, (b) a live query such as +`CultCache.IsWritable(key)`, and (c) a list beside `ForeignRecords`. Eyes pass, +2026-10-03. Facts and evidence pointers only; no recommendation. + +Verification marks: + +- **[fetched]** the claim was read on the cited page or source during this pass. +- **[search]** the claim came from a search-result summary of the cited page, + not a full read. +- **[memory]** recalled from the cited source, not re-read in this pass. + Treat it as unverified. + +Signal shapes used below: + +- **property**: a flag or state on the loaded object itself. +- **query**: a call on the store, session or registry that answers at call time. +- **list**: an enumeration of affected items, captured or computed. +- **type**: the read-only status is a distinct static type. +- **exception only**: nothing to ask; the write is the first signal. + +## 0. Our design, for comparison + +Source: branch `hands/variants-c2a` (head e9a66876), `src/GameCult.Caching/CultCache.cs`. + +- `CultDocumentRegistry.Declares(string schemaId)` (line 738) is `internal`. Its + comment: "The one answer to whether a cache may write, relabel or remove a + record stored under this id ... Read live, so a type registered later that + declares the id claims its records at their next write." [fetched] +- `GetRequired()` (line 631) registers lazily, so the set of declared ids can + grow after load. [fetched] +- The backing store already exposes `ForeignRecords` (line 3421), an + `IReadOnlyList` "the last load found and carries untouched", + set at load (`SetForeignRecords`, line 3599). `CultForeignRecord` (line 162) + carries `Key`, `SchemaId`, `SchemaName`, `StoredAt`. [fetched] +- The store also has a store-level `public bool IsReadOnly { get; }` (line 3419), + fixed at construction. [fetched] +- Main (162bd1fc) exposes `LastSchemaMigrationReports` (CultCache.cs:3136), whose + entries carry no record key (per the question text). [fetched for the + property; the no-key claim is the question's] + +## 1. ORMs + +### EF Core: no-tracking queries and keyless entity types + +- Signal shape: **query** on the context, plus a **model** query. + `context.Entry(e).State` returns an `EntityState`; `Detached` means "not being + tracked by the DbContext", and its "Action on SaveChanges" is none. + ([Change Tracking](https://learn.microsoft.com/en-us/ef/core/change-tracking/), "Entity states" table) [fetched] +- No-tracking results (`AsNoTracking`, or `QueryTrackingBehavior.NoTracking` on + the context) are plain instances; changes to them are not persisted by + `SaveChanges`. ([Tracking vs. No-Tracking](https://learn.microsoft.com/en-us/ef/core/querying/tracking), "No-tracking queries") [fetched] +- Keyless entity types "are never tracked for changes in the DbContext and + therefore are never inserted, updated or deleted"; their mapped object is + "treated as a read-only query source". + ([Keyless Entity Types](https://learn.microsoft.com/en-us/ef/core/modeling/keyless-entity-types), "characteristics", "Mapping to database objects") [fetched] +- Attempting to `Attach`/`Update` a keyless instance throws + `InvalidOperationException` with `CoreStrings.KeylessTypeTracked`: "Unable to + track an instance of type '{type}' because it does not have a primary key." + ([CoreStrings.KeylessTypeTracked](https://learn.microsoft.com/en-gb/dotnet/api/microsoft.entityframeworkcore.diagnostics.corestrings.keylesstypetracked?view=efcore-8.0)) [search] +- The model answers keylessness: `IReadOnlyEntityType.IsKeyless` / + `FindPrimaryKey() == null`. [memory] +- Pitfall: modifying a no-tracking instance and calling `SaveChanges` is silent; + nothing is written and nothing is thrown. `ChangeTracker.HasChanges()` returns + false (Change Tracking page, closing tip). [fetched] + +### Hibernate: @Immutable and read-only entities + +- Signal shape: **query** on the session. `Session.isReadOnly(Object + entityOrProxy)`: "Is the specified entity or proxy read-only?"; + `isDefaultReadOnly()` for the session default; `setReadOnly(Object, boolean)` + flips one entity. ([Session javadoc 6.4](https://docs.hibernate.org/orm/6.4/javadocs/org/hibernate/Session.html)) [fetched] +- Read-only can be set per session (`setDefaultReadOnly`), per query + (`Query.setReadOnly(true)`, before execution) or per entity. + ([Hibernate 4.3 manual ch. 12, 12.1.2-12.1.3](https://docs.hibernate.org/orm/4.3/manual/en-US/html/ch12.html)) [fetched] +- Write behaviour: changes to read-only entities are ignored at flush, no + exception ("Hibernate will not update simple properties or updatable + single-ended associations"); "A read-only entity can be deleted." (ch. 12.1) [fetched] +- `@Immutable`: "Changes made in memory to the state of an immutable entity are + never synchronized to the database. The changes are ignored, with no exception + thrown." Immutable collections, by contrast, throw `HibernateException` on add + or remove. ([@Immutable javadoc 6.2](https://docs.hibernate.org/orm/6.2/javadocs/org/hibernate/annotations/Immutable.html)) [fetched] +- Bulk HQL updates of immutable entities: setting + `hibernate.query.immutable_entity_update_query_handling_mode` chooses `warning` + (default) or `exception`. ([QuerySettings 6.6](https://docs.hibernate.org/orm/6.6/javadocs/org/hibernate/cfg/QuerySettings.html)) [search] +- Pitfall: the default for entity changes is silent loss; the read-only state is + per session, so the same row is writable in another session. + +### ActiveRecord: readonly? + +- Signal shape: **property** on the record. `readonly?` "returns true if the + record is marked as read-only"; `readonly!` marks it. + ([ActiveRecord::Core](https://api.rubyonrails.org/classes/ActiveRecord/Core.html)) [fetched] +- Relation-level: `User.readonly` marks every loaded record; + `users.first.save # => ActiveRecord::ReadOnlyRecord: User is marked as readonly`. + ([QueryMethods#readonly](https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html)) [fetched] +- Write behaviour: save, update or destroy raise `ActiveRecord::ReadOnlyRecord`. [fetched] +- The flag is set when the record is loaded and lives on the in-memory object; it + is not re-derived from the database or the model at write time. [memory] + +## 2. Document stores and embedded databases + +### Realm (Kotlin SDK): frozen objects + +- Signal shape: **property** functions on the object. + `BaseRealmObject.isFrozen()`: "A frozen object is tied to a specific version of + the data in the realm and fields retrieved from this object instance will not + update"; also `isManaged()` and `isValid()` ("the Realm is open and the + underlying object has not been deleted"). + ([BaseRealmObjectExt.kt L41-71](https://github.com/realm/realm-kotlin/blob/main/packages/library-base/src/commonMain/kotlin/io/realm/kotlin/ext/BaseRealmObjectExt.kt)) [fetched] +- Recovery path: `MutableRealm.findLatest(obj)` returns a live, writable copy + inside a write block, or `null` "if the object has been deleted". + ([MutableRealm.kt L50-56](https://github.com/realm/realm-kotlin/blob/main/packages/library-base/src/commonMain/kotlin/io/realm/kotlin/MutableRealm.kt)) [fetched] +- Write behaviour: writing to a frozen object throws. Early SDKs threw a generic + "Wrong transactional state ..." message; issue #297 asked for "Frozen objects + cannot be modified" plus a pointer to `findLatest`. + ([realm-kotlin#297](https://github.com/realm/realm-kotlin/issues/297)) [fetched] +- Pitfall: `isFrozen()` is stable for a given instance, but `isValid()` is live + and can flip when another writer deletes the object. + +### Couchbase Lite + +- Signal shape: **type**. "By default, a document is immutable when it is read + from the database. Use the Document.ToMutable() to create an updatable + instance." `Document` versus `MutableDocument` makes the distinction static. + ([Couchbase Lite C# Documents](https://docs.couchbase.com/couchbase-lite/current/csharp/document.html), "Mutability") [fetched] +- Write conflicts with other writers are handled at save by concurrency control + (last-write-wins or fail-on-conflict) or a conflict handler. [memory] + +### LiteDB + +- Signal shape: **store-level option** only. Connection string `ReadOnly` + ("Open datafile in read-only mode"). No per-document read-only state found. + ([LiteDB connection string](https://www.litedb.org/docs/connection-string/)) [fetched] + +### SQLite + +- Signal shape: **store query**. `sqlite3_db_readonly(D,N)` "returns 1 if the + database N of connection D is read-only, 0 if it is read/write, or -1 if N is + not the name of a database". ([sqlite3_db_readonly](https://www.sqlite.org/c3ref/db_readonly.html)) [fetched] +- `sqlite3_stmt_readonly()` answers whether a prepared statement writes. [memory] + +### Core Data + +- Signal shape: **store property** plus an open option. + `NSPersistentStore.isReadOnly`: "A Boolean value that indicates whether the + persistent store is read-only" (get/set); + `NSReadOnlyPersistentStoreOption`: "A flag that indicates whether a store is + treated as read-only", default false. + ([isReadOnly](https://developer.apple.com/documentation/coredata/nspersistentstore/isreadonly), + [NSReadOnlyPersistentStoreOption](https://developer.apple.com/documentation/coredata/nsreadonlypersistentstoreoption)) [fetched] +- Granularity: store, not object. An object's store is reachable through its + `objectID.persistentStore`. [memory] + +## 3. Serializers and schema evolution: unknown or foreign data + +### Protocol Buffers + +- Unknown fields: "Proto3 messages preserve unknown fields and include them + during parsing and in the serialized output." They are lost on JSON + serialization or when copying field by field into a new message. + ([proto3 guide, Unknown Fields](https://protobuf.dev/programming-guides/proto3/)) [fetched] +- Signal shape for unknown fields: **property/list** on the message, + `getUnknownFields()` returning an `UnknownFieldSet` (Java). [memory] +- `Any` with a foreign type: **query** `any.is(Foo.class)` returns a boolean; + `unpack(Class)` throws `InvalidProtocolBufferException`. + ([Any javadoc](https://protobuf.dev/reference/java/api-docs/com/google/protobuf/Any.html)) [fetched] +- Granularity: fields inside a known message, or one embedded payload; no + ownership or write-permission concept. + +### Apache Avro + +- Writer fields absent from the reader schema are dropped: "the writer's value + for that field is ignored". A union branch the reader lacks: "if none match, an + error is signalled". ([Avro 1.11.1 spec, Schema Resolution](https://avro.apache.org/docs/1.11.1/specification/)) [fetched] +- Signal shape: **exception only** for unresolvable data; nothing marks a record + as carrying dropped fields. + +### Unity SerializeReference: missing types (closest found to CultCache) + +- A host asset holds managed references whose recorded type (assembly, + namespace, class) is not in the current project. +- Signal shape: **query** returning a bool and a **list**. + `SerializationUtility.HasManagedReferencesWithMissingTypes(Object obj)`: "returns + true if one or more managed references is missing its type." + `GetManagedReferencesWithMissingTypes` returns the + `ManagedReferenceMissingType` entries: `assemblyName`, `className`, + `namespaceName`, `referenceId`, `serializedData`. + ([HasManagedReferencesWithMissingTypes](https://docs.unity3d.com/6000.0/Documentation/ScriptReference/SerializationUtility.HasManagedReferencesWithMissingTypes.html), + [ManagedReferenceMissingType](https://docs.unity3d.com/6000.0/Documentation/ScriptReference/ManagedReferenceMissingType.html)) [fetched] +- Behaviour: the field stays null, the persisted state is retained on resave, and + if the type returns later, "the state of the Managed Reference object can be + recovered". `ClearManagedReferenceWithMissingType` removes one deliberately. + ([GetManagedReferencesWithMissingTypes](https://docs.unity3d.com/ScriptReference/SerializationUtility.GetManagedReferencesWithMissingTypes.html)) [search] +- Both calls are made on demand against a host object; the docs do not say the + list is cached at load. A sibling `PrefabUtility.HasManagedReferencesWithMissingTypes` + exists for prefab instances. [search] + +### .NET DataContractSerializer: IExtensibleDataObject + +- Unknown members round-trip through an opaque `ExtensionDataObject` property on + the object. It cannot be inspected, so it is a carrier, not a signal. [memory] + +## 4. File systems and object stores + +### POSIX access(2) and TOCTOU + +- Signal shape: **query** on the path. `access(path, W_OK)` fails with `EROFS` on + a read-only file system. The check uses the real UID/GID, "rather than the + effective IDs as is done when actually attempting an operation". + ([access(2)](https://man7.org/linux/man-pages/man2/access.2.html)) [fetched] +- Pitfall: checking before `open(2)` "creates a security hole" because the state + can change between check and use (access(2) NOTES). [fetched] +- Python's `os.access` docs repeat the warning and show the EAFP alternative: try + the `open` and catch `PermissionError`. + ([os.access](https://docs.python.org/3/library/os.html#os.access)) [fetched] +- CWE-367 defines TOCTOU as checking "the state of a resource before using that + resource, but the resource's state can change between the check and the use". + Mitigations listed: drop the check, make check and use atomic, lock before the + check, recheck after use, shrink the window. + ([CWE-367](https://cwe.mitre.org/data/definitions/367.html)) [fetched] + +### Amazon S3 Object Lock + +- Signal shape: **metadata on the object version**, read with HEAD/GET. + `HeadObject` returns `x-amz-object-lock-mode` (`GOVERNANCE | COMPLIANCE`), + `x-amz-object-lock-retain-until-date` and `x-amz-object-lock-legal-hold`, + "only returned if the requester has the `s3:GetObjectRetention` permission" + (legal hold: `s3:GetObjectLegalHold`). Dedicated calls exist as well + (`GetObjectRetention`, `GetObjectLegalHold`). + ([HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)) [fetched] +- Write behaviour: a versioned DELETE of a locked version returns `403 Access + Denied`; a simple DELETE succeeds and adds a delete marker. A PUT to the same + key succeeds and creates a new version; the old version stays locked. Governance + mode can be bypassed with `s3:BypassGovernanceRetention` plus the + `x-amz-bypass-governance-retention:true` header. + ([Object Lock](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html), "How deletes work", "Retention modes") [fetched] +- Pitfalls: the signal depends on read permission (absent header does not mean + unlocked); legal holds can be "freely placed and removed" by anyone with + `s3:PutObjectLegalHold`, so the answer can change between HEAD and DELETE; under + variable retention the retain-until date "moves forward as time passes" while an + event hold is on. (Object Lock page, "Legal holds", "Retain-until-date behavior") [fetched] + +### Git LFS lockable files + +- Ownership signal enforced through the file system: files marked lockable "are + made read-only in the working copy when not locked by the current user" + (`lfs.setlockablereadonly`, default true). + ([git-lfs-config](https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-config.adoc), L448-455) [fetched] +- The authoritative check is server-side at push: Git LFS "verifies that pushes + don't alter files locked by others". + ([git-lfs-lock](https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-lock.adoc)) [fetched] +- Pitfall: the read-only bit reflects lock state as of the last checkout or lock + command; `chmod` defeats it locally, and the push check decides. [memory for the + staleness; the push check is fetched] + +## 5. Collections (the type-system version of the same question) + +- .NET `ICollection.IsReadOnly`: a **property**. Read-only here "does not + indicate whether individual elements of the collection can be modified"; an + array cast to `ICollection` reports true while its elements stay writable. + Mutators throw `NotSupportedException`. + ([ICollection.IsReadOnly](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.icollection-1.isreadonly)) [fetched; the exception is memory] +- Java `Collection`: **exception only**. Mutators are "optional operations" that + throw `UnsupportedOperationException`; the interface has no query for + modifiability. ([Collection, Java 21](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Collection.html)) [fetched] + +## 6. Summary table + +| System | Granularity | Signal shape | Write when read-only | Can the answer go stale? | +|---|---|---|---|---| +| EF Core no-tracking | entity instance | query (`Entry(e).State`) | silent no-op | yes, attach/detach changes it | +| EF Core keyless | entity type | model query (`IsKeyless`) [memory] | throws on attach/update | no (model is fixed after build) | +| Hibernate read-only | entity in session | query (`Session.isReadOnly(e)`) | ignored at flush; delete allowed | per session; settable | +| Hibernate @Immutable | entity type | annotation | ignored, no exception; bulk HQL warns or throws | no | +| ActiveRecord | record | property (`readonly?`) | raises `ReadOnlyRecord` | set at load, not re-derived [memory] | +| Realm frozen | object version | property (`isFrozen()`, `isValid()`) | throws; `findLatest` for a writable copy | `isValid` is live | +| Couchbase Lite | document | type (`Document` vs `MutableDocument`) | n/a, no mutators | no | +| LiteDB, SQLite, Core Data | store or database | option plus store query/property | refused by the store | rarely | +| protobuf unknown fields / Any | field / payload | property list [memory] / `is()` query | preserved / unpack throws | no | +| Avro | field / union branch | exception only | field dropped / error | no | +| Unity missing types | managed reference in a host | query (bool) plus list (key, type name, data) | data preserved; recoverable when type returns | answered on demand | +| POSIX access(2) | path | query | open fails | yes, TOCTOU (documented) | +| S3 Object Lock | object version | metadata via HEAD/GET | versioned delete 403; PUT makes a new version | yes, holds and event holds change | +| Git LFS lockable | file | file-system read-only bit | push refused by server | yes, as of last checkout | +| .NET ICollection | collection | property | `NotSupportedException` | no | +| Java Collection | collection | exception only | `UnsupportedOperationException` | n/a | + +Patterns observed, stated as facts across the sources above: + +- Every system that offers an advance signal still has the write path decide: + EF Core, Realm, ActiveRecord, S3, Git LFS and POSIX all refuse or ignore at the + write regardless of what a check said. +- Where the read-only state can change after it was observed (POSIX permissions, + S3 holds, Git LFS locks, EF Core attach/detach), the documentation either warns + of TOCTOU (POSIX, Python, CWE-367) or places the authoritative check at the + write (S3, Git LFS push). +- Silent-ignore write behaviour (Hibernate entities, EF Core no-tracking) is the + case where the advance signal is the only signal; Hibernate added an opt-in + exception mode for bulk updates. +- The closest analog to records under an unregistered schema id (Unity missing + types) exposes both an on-demand bool query and an on-demand list carrying the + reference id and the recorded type name, and recovers the data when the type + returns. +- Store-level read-only (LiteDB, SQLite, Core Data, and CultCache's own + `CacheBackingStore.IsReadOnly`) is a property or query on the store, not on the + record. diff --git a/docs/research/serializer-unowned-holders.md b/docs/research/serializer-unowned-holders.md new file mode 100644 index 00000000..759503c3 --- /dev/null +++ b/docs/research/serializer-unowned-holders.md @@ -0,0 +1,31 @@ +# Prior art: refuse or walk a container the identity walk does not own + +For `variants:question:c2a-unowned-holders` (campaign `variants`, cut `c2a-element-id-holes` r5). +These are from Imagination's reading. No web fetch was made in this pass, so check the +pointers before quoting them outside the mind. + +| System | Unknown or unsupported type in a payload | Extension point | Pointer | +|---|---|---|---| +| Protocol Buffers | Not expressible. A field is a scalar, a message, `repeated`, or `map`. No other container exists. | None. You model the data as messages. | protobuf.dev, Language Guide (proto3), "Repeated fields" and "Maps" | +| Microsoft Bond | Fixed container set: `list`, `vector`, `set`, `map`, `nullable`, `blob`, `bonded`. Any other type is a codegen error. | Type aliases with explicit converters, declared per type. | microsoft.github.io/bond/manual/bond_cs.html, "Type aliases" and "Custom type mappings" | +| Orleans 7+ serializer | Throws `CodecNotFoundException` when it serializes a type with no codec (not `[GenerateSerializer]`, not registered). | Surrogates via `[RegisterConverter]`, or codecs registered per type. Built-in codecs cover the BCL immutable collections. | learn.microsoft.com/dotnet/orleans/host/configuration-guide/serialization | +| MessagePack-CSharp 3.1.7 | `DynamicObjectResolver` refuses an unannotated type (formatter null, the serializer throws) unless the caller opts into contractless. | Resolvers, `[MessagePackFormatter]`. | Probed: `scratchpad/imag-r5/probe1.log` (NkHold: std=null, contractless builds one) | +| System.Text.Json (source gen) | `NotSupportedException` for types outside the generated metadata. Polymorphism needs `[JsonDerivedType]` registration. | `JsonConverter`, `[JsonDerivedType]`. | learn.microsoft.com/dotnet/standard/serialization/system-text-json/polymorphism | + +## What the table says for CultCache's id walk + +1. Every system that guarantees something about a payload's structure fails closed on a + shape it does not own. The failure is loud and comes at build or first use. It never + drops data silently. Protobuf and Bond refuse when the schema is written, and Orleans, + MessagePack and STJ refuse when the type is first serialized. None of them walks an + arbitrary wrapper on the chance that it is a container. +2. Each system supports a fixed set of containers and walks those natively. Extension is + explicit and per type: Bond aliases, Orleans surrogates, STJ converters. The walker + never infers it from a type's shape. +3. Orleans covers the BCL immutable collections with built-in codecs. Each added container + is a deliberate, tested entry. A reasonable consumer therefore expects ImmutableArray to + be supported when the library says so, and refused loudly when it does not. Nobody + expects silent nil ids. + +CultCache's id walk today is open-world: a shape it does not recognise passes as a leaf. +That is the opposite of every row above, and it is the common cause of findings s1-s4. diff --git a/docs/research/shader-variable-inputs.md b/docs/research/shader-variable-inputs.md new file mode 100644 index 00000000..c8ea3296 --- /dev/null +++ b/docs/research/shader-variable-inputs.md @@ -0,0 +1,111 @@ +# Shader variable-length inputs: how shader libraries take a span, and what CultMath's build route allows + +For `cultmath-tapes:follow_up:shader-weighted-lattice-loop` and `cultmath-tapes:follow_up:lattice-shader-pins` (campaign `cultmath-tapes`). +Imagination pass, agent `imagination-ag4-shader-loop`, session `self-2026-10-16-ag4`, 2026-10-17, against CultLib `origin/main` `e2051c5a` +and the build branch `hands/cultmath-glsl-build-dxc` `23ac4e89`. Probes are in `docs/research/shader-variable-inputs/`. + +Tags: [src] primary source text read this pass; [web] search summary only; [probe] run this pass, output quoted below. + +## 1. The question + +C#'s `weighted_lattice_cells` reads the body span once per lattice cell (the weight is the exact power border of the +cell centre), and the ring search around it is the part a consumer cannot safely write by hand: the exit bound, +the two passes and the box-independent fold order. The shader port has the four steps only. A shader function cannot +take `ReadOnlySpan`, the library targets GLSL ES 3.00 fragment shaders (WebGL2: no storage buffers), and the GLSL is +built from the HLSL by dxc `lib_6_3` SPIR-V plus SPIRV-Cross (ruling `glsl-es-via-dxc-spirv-cross`). +So how do bodies reach a shader `weighted_lattice_cells`? + +## 2. Prior art: how shader code that ships as a library takes a variable number of inputs + +- [src] Unity URP (`ShaderLibrary/Input.hlsl`, `RealtimeLights.hlsl`, Graphics `master`): a fixed capacity + `MAX_VISIBLE_LIGHTS` chosen per platform (`MAX_VISIBLE_LIGHT_COUNT_LOW_END_MOBILE` under `SHADER_API_GLES30`, + `_MOBILE` for GLES3/WebGPU, `_DESKTOP` otherwise), constant-buffer arrays `float4 _AdditionalLightsPosition[MAX_VISIBLE_LIGHTS]` + and the like, with `StructuredBuffer` only behind `USE_STRUCTURED_BUFFER_FOR_LIGHT_DATA` (defined 0). The + count is a uniform read through `GetAdditionalLightsCount()`, and `GetAdditionalLight(uint i, float3 positionWS)` is + the accessor; `LIGHT_LOOP_BEGIN(lightCount)` / `LIGHT_LOOP_END` macros hide the cluster versus plain loop. The + pipeline owns the storage and the accessor; user shaders call them. Capacity plus count, storage owned by the include. +- [src] Filament (`shaders/src/surface_light_punctual.fs`, `main`): the loop is the engine's, over a froxel record + (`froxelsUniforms.records`, then `froxelRecordUniforms.records`) giving `recordOffset` and `count`; each light is + `lightsUniforms.lights[lightIndex]`, a uniform-block array. Material code never sees the loop. The engine owns both + the storage and the loop because it also owns the uniform layout. +- [src] three.js (`ShaderChunk/lights_fragment_begin.glsl.js`, `dev`): `for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ )` + under `#pragma unroll_loop_start`, reading `pointLights[ i ]`; `NUM_POINT_LIGHTS` is a define the renderer writes, + so the shader is regenerated per light count. Count as a compile-time constant; the library is source text. +- [web] Bevy: clustered forward needs storage buffers; on WebGL2 it falls back to a uniform buffer with a capped + object count (`MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS` 204 in an older `bevy_pbr`, asserted to fit 16384 bytes; the + Many Lights example says 256 lights under `WGPU_SETTINGS_PRIO=webgl2`). Capacity plus count where storage is absent. +- [web] lygia (README conventions, via search): reuse by `#ifndef` / `#define` options the caller sets before the + include (`SAMPLER_FNC(TEX, UV)`, `MYFUNC_TYPE`, per-function sampler overrides). Caller-supplied accessor macros; the + library ships as source text, which is what lets a macro reach inside a function body. + +The pattern that splits them: a caller-supplied accessor (lygia, URP's accessor functions, three.js's define) works +where the library is source text the caller's preprocessor sees. Where the library is compiled or its storage layout is +fixed (URP's GLES path, Bevy's WebGL2 fallback, Filament's uniform blocks), the input is a fixed-capacity array plus a +count, and the capacity is a named library constant. + +## 3. What the build route allows (probes) + +| Candidate | HLSL (dxc) | Library SPIR-V and SPIRV-Cross GLSL | C# mirror (`TransformHlslToCSharp`) | Verdict | +|---|---|---|---|---| +| Fixed-size array parameter plus count | compiles, `lib_6_3` and `cs_6_0` [probe P1, P3] | see P2 | needs one transform (`T x[N]` parameter to `T[] x`) | see section 4 | +| Caller accessor macro (`CULTMATH_BODY(i)`) | the library build defines no accessor, so the function is absent [probe P4] | absent from the built GLSL: SPIRV-Cross output carries no consumer macro | the mirror would need the macro too | refused by the route | +| Bodies packed into library-owned constants | a library cbuffer or uniform | a uniform block in a function-only library; a binding the consumer does not own | a static field | refused (P5, by construction, not run): a library may not own a consumer's binding | + +Probes (files in `shader-variable-inputs/`): + +- [probe] P1, local, dxc 2026_07_29 (`.tools/dxc`): `lattice-array.hlsl` (CultMath.hlsl, `prototype.hlsl`, one export) + compiles with `-T lib_6_3 -HV 2021 -spirv -fspv-target-env=universal1.5 -Od`. The SPIR-V types the array as + `OpTypeArray %v4float %uint_16` behind a Function pointer, and `-Od` copies it at each call (`param_var_bodies`). +- [probe] P3, local: `entry-cbuffer.hlsl` passes a cbuffer array directly and a `StructuredBuffer` copied into a local + array; both compile to SPIR-V (`cs_6_0`) and to DXIL. +- [probe] P4, local: `macro-accessor.hlsl` with no `CULTMATH_BODY` defined fails, `use of undeclared identifier`: a + macro-parameterised function does not exist in a library compiled without the caller's macros, so the built GLSL + cannot carry it. Shipping it would need a hand-kept GLSL text beside the build, a second owner the ruling removed. +- [probe] P2, Yggdrasil job (`probe.sh` at `23ac4e89`, sdk:10.0, 2026-10-17): with the prototype appended to + `CultMath.hlsl` and two build-tool edits (`wrappers.py` strips `[N]` from an argument name; `partition.py` accepts + `static const int`), `build-glsl.sh` is green ("build shape ok", "suffixed ids: 0; inout: 0") and emits + `const int CULTMATH_MAX_SITES = 16;`, `vec4 cultmath_power_border(vec3 p, vec4 sites[16], int count)` and + `vec4 cultmath_weighted_lattice_cells(vec2 p, float time, vec4 bodies[16], int count, ...)`. A `#version 300 es` + fragment consumer passing `uniform vec4 zone[CULTMATH_MAX_SITES]` compiles with glslang. +- [probe] Same job, lavapipe (`llvmpipe (LLVM 20.1.2, 256 bits)`), 257 cases from `ref/Program.cs` (the ring-17 point + of `TheCapIsReachedAndMatchesTheFullBox` and 7 neighbours, four looks, five normals including (3e-30, -4e-30) and + (1e30, 2e30), a zero normal at stretch 1, counts 0, 1, 3, 6, 16), judged against C#'s bits at 2.2e-6 max(|v|, 1): + +| Variant (HLSL route unless named) | bit-exact | over bound | worst | +|---|---|---|---| +| built GLSL | 237 | 0 | 1.19e-6 | +| HLSL (equal to built GLSL bit for bit) | 237 | 0 | 1.19e-6 | +| M1 exit at `0.5 k` | 236 | 1 | 4.28e-3 | +| M2 exit ignores the smooth band (`>= f2`) | 226 | 13 | 8.33e-2 | +| M3 normaliser drops the divide by the largest component | 148 | 96 | 1e30 | +| M4 normaliser drops the divide by length | 1 | 208 | 0.259 | +| M5 smooth step loses its `min` cap | 153 | 85 | 2.26e-3 | +| M6 box pass skips its first row | 228 | 9 | 0.807 | +| M7 exit one ring late (`0.5 (k - 2)`) | 237 | 0 | 1.19e-6 | + +M7 is equivalent: the result does not depend on the box (the proof above `weighted_lattice_cells`), so a late exit +costs rings and changes nothing. M1 is killed by one case of 257, the ring-17 point: an early exit only matters where +a far ring wins, so the device family must carry several such points. + +## 4. Decision + +The fixed-size array plus count is the only candidate the route admits, and it is the shape the compiled-library +prior art uses (URP's GLES path, Bevy's WebGL2 fallback, Filament's uniform blocks). The capacity is a named library +constant, `CULTMATH_MAX_SITES`, shared by every span-taking shader function. Its value is +`cultmath-tapes:question:shader-site-capacity` (Aetheria zones: p50 17, p99 57, max 80 bodies, gravity map B28). + +The shader recomputes each distance in the box pass instead of caching it: C#'s 75 x 75 stack cache is not a shader +option, and recomputing gives the same value, as the probe's bit-exact HLSL and built-GLSL agreement shows. +Reflection cannot pass a `ReadOnlySpan`, so the mirror and the fixture reach the C# span functions through one +explicit adapter table rather than `MethodInfo.Invoke`. + +## 5. lattice-shader-pins + +- The smooth-step family draws m in [f1, f1 + smoothing), so the cap never binds. The cap binds when m = f1 + smoothing, + d = f1 + x smoothing with x around 1.3 to 1.9, and smoothing above about 0.25: next - m = (d - m) h - h (1 - h) + smoothing / (1 + 3 smoothing) is positive there (for smoothing 1 and d - m = 0.5, h = 0.156 and next - m = +0.045). + M5 above is killed by the whole function already; the step family should kill it on its own. +- Platform values: `8b31e47e` rewrote 7 platform-family entries of `glsl-parity.json` from "Ubuntu 24.04.5 LTS" to + "Microsoft Windows 10.0.26200", while `7ddb1040` recorded the lavapipe bounds on Yggdrasil against that fixture. + The bounds, the lavapipe job and the build route all run in Yggdrasil's sdk:10.0 Ubuntu image, so that image + owns the fixture's platform values too. A write on another OS is refused rather than reviewed. diff --git a/docs/research/shader-variable-inputs/entry-cbuffer.hlsl b/docs/research/shader-variable-inputs/entry-cbuffer.hlsl new file mode 100644 index 00000000..7e6ced39 --- /dev/null +++ b/docs/research/shader-variable-inputs/entry-cbuffer.hlsl @@ -0,0 +1,15 @@ +// Probe C: a compute entry passing a constant-buffer array, and one passing a StructuredBuffer copied to a local array. +#include "lattice-array.hlsl" +cbuffer Zone : register(b0) { float4 zoneBodies[CULTMATH_MAX_SITES]; int zoneCount; }; +StructuredBuffer bufferBodies : register(t1); +RWStructuredBuffer result : register(u2); +[numthreads(64, 1, 1)] +void main(uint3 id : SV_DispatchThreadID) +{ + float2 p = float2(id.x * 7.0, id.y * 11.0); + float4 local[CULTMATH_MAX_SITES]; + for (int i = 0; i < CULTMATH_MAX_SITES; i++) + local[i] = i < zoneCount ? bufferBodies[i] : float4(0.0, 0.0, 0.0, 1.0); + result[id.x] = cultmath_weighted_lattice_cells(p, 1.0, zoneBodies, zoneCount, 260.0, 0.3, 1.6, 120.0, 0.35, float2(1.0, 2.0), 1.5) + + cultmath_weighted_lattice_cells(p, 1.0, local, zoneCount, 260.0, 0.3, 1.6, 120.0, 0.35, float2(1.0, 2.0), 1.5); +} diff --git a/docs/research/shader-variable-inputs/entry.comp.tail b/docs/research/shader-variable-inputs/entry.comp.tail new file mode 100644 index 00000000..c6713929 --- /dev/null +++ b/docs/research/shader-variable-inputs/entry.comp.tail @@ -0,0 +1,16 @@ +layout(local_size_x = 64) in; +layout(std430, binding = 0) readonly buffer IB { uint a[]; } In; +layout(std430, binding = 1) buffer OB { uint a[]; } Out; +void main() +{ + uint i = gl_GlobalInvocationID.x; if (i >= NCASES) return; uint b = i * 76u; + vec4 bodies[CULTMATH_MAX_SITES]; + for (int k = 0; k < CULTMATH_MAX_SITES; k++) + bodies[k] = uintBitsToFloat(uvec4(In.a[b + 2u + 4u * uint(k)], In.a[b + 3u + 4u * uint(k)], In.a[b + 4u + 4u * uint(k)], In.a[b + 5u + 4u * uint(k)])); + uint c = b + 67u; + vec4 r = cultmath_weighted_lattice_cells(uintBitsToFloat(uvec2(In.a[b], In.a[b + 1u])), uintBitsToFloat(In.a[c]), bodies, int(In.a[b + 66u]), + uintBitsToFloat(In.a[c + 1u]), uintBitsToFloat(In.a[c + 2u]), uintBitsToFloat(In.a[c + 3u]), uintBitsToFloat(In.a[c + 4u]), + uintBitsToFloat(In.a[c + 5u]), uintBitsToFloat(uvec2(In.a[c + 6u], In.a[c + 7u])), uintBitsToFloat(In.a[c + 8u])); + uvec4 w = floatBitsToUint(r); + Out.a[i * 4u] = w.x; Out.a[i * 4u + 1u] = w.y; Out.a[i * 4u + 2u] = w.z; Out.a[i * 4u + 3u] = w.w; +} diff --git a/docs/research/shader-variable-inputs/entry.hlsl b/docs/research/shader-variable-inputs/entry.hlsl new file mode 100644 index 00000000..91b21046 --- /dev/null +++ b/docs/research/shader-variable-inputs/entry.hlsl @@ -0,0 +1,16 @@ +// Probe compute entry (HLSL route): 76 words in per case (p, 16 bodies, count, 9 parameters), 4 words out. +#include "CultMath.hlsl" +[[vk::binding(0)]] StructuredBuffer In; +[[vk::binding(1)]] RWStructuredBuffer Out; +[numthreads(64, 1, 1)] void main(uint3 id : SV_DispatchThreadID) +{ + uint i = id.x; if (i >= NCASES) return; uint b = i * 76u; + float4 bodies[CULTMATH_MAX_SITES]; + for (int k = 0; k < CULTMATH_MAX_SITES; k++) + bodies[k] = float4(asfloat(In[b + 2 + 4 * k]), asfloat(In[b + 3 + 4 * k]), asfloat(In[b + 4 + 4 * k]), asfloat(In[b + 5 + 4 * k])); + uint c = b + 67u; + float4 r = cultmath_weighted_lattice_cells(float2(asfloat(In[b]), asfloat(In[b + 1])), asfloat(In[c]), bodies, asint(In[b + 66]), + asfloat(In[c + 1]), asfloat(In[c + 2]), asfloat(In[c + 3]), asfloat(In[c + 4]), asfloat(In[c + 5]), + float2(asfloat(In[c + 6]), asfloat(In[c + 7])), asfloat(In[c + 8])); + Out[i * 4] = asuint(r.x); Out[i * 4 + 1] = asuint(r.y); Out[i * 4 + 2] = asuint(r.z); Out[i * 4 + 3] = asuint(r.w); +} diff --git a/docs/research/shader-variable-inputs/judge.py b/docs/research/shader-variable-inputs/judge.py new file mode 100644 index 00000000..97b23985 --- /dev/null +++ b/docs/research/shader-variable-inputs/judge.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +"""Compare a device output with C#'s reference bits: cases over the lavapipe bound 2.2e-6 max(|v|, 1), and the largest. +usage: judge.py

` for directories that hold the built assemblies' +dependencies). A package with no such directory takes no `--api-built`, and one +that has it cannot omit it. The measured set is every managed assembly tracked +under that directory, at any depth, at the previous tag, read as git blobs (no +worktree, no network, unaffected by what the working tree tracks now) and keyed +by file name. A DLL is managed when its PE header carries a CLI header; a +native DLL has none and is not measured, and a tracked `.dll` that is not a PE +image refuses. Two managed assemblies with one name refuse. The checker +compares each built assembly with its namesake using +`Microsoft.DotNet.ApiCompat.Tool`; each `CPnnnn` diagnostic is one measured +break. Every managed assembly the previous tag tracked that the build no +longer hands over is itself a measured break, whatever its name or place, so a +release script passes every assembly it ships. A built assembly with no +namesake at the tag is an addition and is not examined. + +Measuring nothing is a refusal, never a pass. The check refuses, naming what +is missing, when the previous tag tracks no managed assembly under the +declared directory (a wrong or moved directory, or a tag that predates it); +when git cannot read the tracked assemblies; and when the tool fails to +measure (not installed, an unreadable assembly, a crash: a non-zero exit with +no diagnostic line). A first release measures nothing. + +The tool and the `NETStandard.Library.Ref` 2.1.0 reference assemblies are +pinned in `scripts/api-gate/` (`.config/dotnet-tools.json` and +`ApiRefs.csproj`) and restored there by the check itself, so a release does +not depend on any other tool in the repository's manifest. NuGet is needed +until both are cached under `scripts/api-gate`. Both sides of every +comparison resolve netstandard types through those reference assemblies, and the +new side also through the built DLL's own directory and every `--api-refs` +directory. No suppression file is kept: a suppression would be a second, silent +declaration of a break, so a break is declared only under `### Breaking`. + +A passing measured run prints that unmeasured changes still need declaring. + +#### Unmeasured changes + +ApiCompat does not report these changes to a public member, and the check +therefore passes them. Each is a breaking change under the rules above and is +declared under `### Breaking`, as behavioural breaks are: + +- a member gaining or losing `static`; +- a parameter gaining or losing `ref`, `out` or `in`; +- a `const` field's value changing; +- an enum member's underlying value changing; +- a field gaining or losing `readonly`; +- a default parameter value changing. + +The release scripts run the check once the assemblies under judgement exist, +after the build and before anything is copied into the package. + +Run it directly: `node scripts/check-changelog-semver.mjs --package +--version [--cwd ] [--api-built ... [--api-refs ...]]`. +Any other option is a usage error (exit 2). Its own tests live in +`scripts/check-changelog-semver.test.mjs` (`node --test +scripts/check-changelog-semver.test.mjs`). + +It is wired into: + +- `.github/workflows/publish-packages.yml`, through + `scripts/release-after-suite.mjs`, for `cultcache-ts`, `cultcache-py`, + `cultnet-py`, and `cultmesh-py`, with `fetch-depth: 0` so the checkout holds + the tags; +- `scripts/build-unity-package.ps1`, for `org.gamecult.cultlib`; +- `packages/cultmath/scripts/build-unity-package.ps1`, for + `org.gamecult.cultmath`; +- `scripts/verify-caching-unity-release.ps1`, for `org.gamecult.caching.unity`. + +Each of those runs the check's own tests before it releases. The Unity release +scripts run them before they call the check, and the tests pin that order. In +`publish-packages.yml` the release step runs `scripts/release-after-suite.mjs` +with the run's git ref. From one process it checks that a tag ref is the +package's declared prefix and manifest version, runs these tests, runs this +check for the tagged version, runs the package's own tests (`npm test`, or the +Python package's unit tests), and only then the release action: `npm publish` +for `cultcache-ts`, which it refuses on any ref but a release tag, and for the +Python packages the sdist and wheel build, whose output is all the PyPI upload +step uploads. The checks run with the known test-runner and token variables +removed (`NODE_OPTIONS`, `NODE_TEST_CONTEXT`, any other `NODE_TEST_*` variable, +and `NODE_AUTH_TOKEN`), so none of those can make the tests run nothing and +pass, and only the release action receives the token. That list names known +variables; it does not prove that no other inherited variable can affect a +check. The npm Publish step and the Python sdist and wheel build step start the +guard under `env -u NODE_OPTIONS`, so a `NODE_OPTIONS` preload set in the +workflow's or job's `env:` cannot run code inside the guard before its first +line. +The gate is that call, not a step condition, so no `if:` or `continue-on-error` +can release what a check refused. The tests compare each job's release steps +with their expected text exactly, less the steps' `if:` lines. Removing the call +is still possible, but only as a visible edit to those steps and to the tests. + +The guard and that pin stop accidental workflow edits. They do not stop a +deliberate one: an extra step that publishes, a workflow-level `defaults:` or +`env:`, or a fake `node` on `$GITHUB_PATH` all pass them. Deliberate edits are +review's job, as ruled in `suite-gate-structural-not-parsed`, and the pin +does not try to parse the workflow for them. For the same reason it has no ban +on `shell` or `defaults`: such a ban defends only against a deliberate edit, +and it also refused harmless settings such as `defaults.run.working-directory`. +A step-level `shell:` on a release step still fails the exact comparison. +A recommendation for the operator, not something this repository can set: the +Python job already runs in the `pypi` GitHub environment, as PyPI trusted +publishing expects. Putting the npm job in an environment with required +reviewers would make every npm release wait for a person's approval. That is a +GitHub settings change. + +`org.gamecult.cultlib` compiles CultMath from source and ships beside +`org.gamecult.cultmath`, so its build refuses unless it declares exactly the +CultMath package's version and every `CultMath.dll` it built equals the one +that package tracks, byte for byte. Any CultMath source change therefore means: +release `org.gamecult.cultmath`, declare its new version in +`org.gamecult.cultlib`, then release `org.gamecult.cultlib`. The bytes also +depend on the checkout and the toolchain. `.gitattributes` pins CultMath +source to CRLF on every checkout, because the tracked DLL was built from CRLF +source and line endings reach the DLL through the pdb's document checksums; a +clone checked out before that rule may still hold LF files (`git ls-files +--eol packages/cultmath/src` shows `w/lf`) until they are checked out again. +The build needs a git checkout, and refuses up front without `.git`: the repo +root maps to `/_/` through git, so an archive or source zip would write its +own path into the DLL. No `global.json` pins the .NET SDK, so the same refusal +at unchanged source and CRLF checkout means this SDK or host differs from the +one that built the tracked DLL. + +### Coverage gaps + +`publish-packages.yml` only triggers on `cultcache-ts-v*`, `cultcache-py-v*`, +`cultnet-py-v*`, and `cultmesh-py-v*` tag pushes — it does not build or gate +the Unity UPM packages at all; those are consumed directly by git tag +(`unity/org.gamecult.cultlib`, `packages/cultmath/unity/org.gamecult.cultmath`, +`src/GameCult.Unity/Assets/Caching`), so a workflow trigger on their tags +cannot be added to that file without also giving it a reason to check out and +build Unity content it currently has no job for. The check is instead wired +into the scripts that already run at Unity-package release time: +`build-unity-package.ps1` and `packages/cultmath/scripts/build-unity-package.ps1` +already verify version consistency between the built assembly and +`package.json`, so the semver check runs alongside that as one more release +gate. `org.gamecult.caching.unity` has no build script at all today — it is +pure C# source tagged directly with no compile step — so +`scripts/verify-caching-unity-release.ps1` exists solely to run this check +before that package is tagged; it is not a build script and does not become +one. + +None of this is enforced by a git hook or branch protection rule: it runs +when someone remembers to run the Unity release scripts, the same way the +existing assembly-version check does. A tag pushed by hand without running +the release script bypasses both checks equally; closing that gap is a CI +trigger on tag push for the Unity packages, not something this change adds. + +What stays unmeasured: behaviour behind an unchanged signature, wire formats, +native exports of the QUIC bridge, and the Caching Unity package's source +(it has no assembly). Those rest on the `### Breaking` declaration. + +Rust crates (consumed as pinned git revisions, not tagged releases in the +usual sense) and the CultNet protocol surface itself (no automated wire +compatibility test currently gates a release) are policy by convention only — +described above, not mechanically checked. Extending the checker to a Rust +crate's `Cargo.toml`/`CHANGELOG.md` or to an automated CultNet interop +compatibility gate is future work, not part of this change. + +`@gamecult/cultcache-ts`, `cultcache-py`, `cultnet-py`, and `cultmesh-py` +currently have **no `CHANGELOG.md` file at all**; the check refuses their next +tagged release ("changelog not found at ") until each +package's file exists. A release with no changelog is not a smaller problem +than a mislabelled one. The next release of each creates its file: +`packages/cultcache-ts/CHANGELOG.md` arrives with the document-variants work +(`hands/variants-c2a`), and whoever cuts the next release of `cultcache-py`, +`cultnet-py` or `cultmesh-py` creates that package's file. Backfilling +changelog content for past releases would mean inventing release-note prose +for history nobody here knows first-hand, so the gap stays named. diff --git a/docs/studio-grouping-cut.md b/docs/studio-grouping-cut.md new file mode 100644 index 00000000..770d0698 --- /dev/null +++ b/docs/studio-grouping-cut.md @@ -0,0 +1,432 @@ +# Studio Record Grouping And Reference Drag-Drop Cut + +First mapped 2026-09-17 (Imagination) against CultLib `122c217`. **Refreshed 2026-09-29 +(Imagination) against CultLib `main` `feeced8` and Aetheria `codex/fire-control-12` `4b594e11`.** +Every `file:line` below is against those revisions unless marked. Hands re-reads an anchor +before editing it; `main` keeps moving. + +**Rulings.** Q1 **B** (a class attribute on the model; argument order is nesting order; +2026-09-17). Q2 **A** (occupied values only). Q3 **A** (list only, not the ref picker). +Q4 **A** (no record search). Q5 **overtaken**: one release from `main`, together with +document-variants C3 (`docs/document-variants-cut.md`), taking whatever native-plugin drift +`main` carries. Q6 **A** (flat row by resolved value, C3's variant marker; 2026-09-30). Q7 **B** (legacy parity +minus manufacturer, plus `FactionProductData` by `Manufacturer` then `Design`, plus +`WeaponItemData` by `WeaponType`; 2026-09-30). + +## Target + +### Ends + +1. **Declared record grouping.** `[CultInspectorGroupBy(nameof(A), nameof(B))]` on a document + class makes Studio's record list for that type a foldout tree, nested in argument order. A + declaration on a base type groups every derived type listed under it. +2. **Create in a group.** Every group node offers `Create`. The new record gets every grouped + member on the path to that node set to that node's value, so it lands in that node. +3. **Reference drag and drop.** A record row dragged from Studio's list onto any + `CultRecordRef` value the inspector draws (member, list element, dictionary key or value) + is accepted exactly when the ref's picker would offer that record. + +Recovered from the legacy "Database Tools" window (Aetheria `d3db1730`, +`Assets/Scripts/CultCache/Editor/DatabaseView.cs`, `AetheriaDatabaseView.cs`, +`Inspectors/DatabaseLinkInspector.cs`). Selector lambdas are rejected (operator, 2026-09-17). + +**The attribute is not `[CultIndex]`.** `[CultIndex]` means unique (operator, 2026-09-30; +`CultDocumentContracts.cs:34`). Grouping is `CultInspectorGroupByAttribute`, in +`CultInspectorAttributes.cs`, read only by `CultInspectorModel`. It changes no schema id, +catalog entry, index, or store byte. The index cut's deletion of grouping-only `[CultIndex]` +declarations (CultMesh, Geometry) adds no `[CultInspectorGroupBy]` in their place: those are +service stores, not Studio-authored catalogs. + +### Invariants + +- **I1. The model owns grouping.** `CultInspectorModel` alone decides which members group a + listed type and in what order, which declarations are invalid (and the notice), the tree's + partition, node identity, order and labels, and the object create-in-group makes. Studio + lowers the tree; it never reads the attribute, calls `SetValue` for a preset, or computes a + group label. +- **I2. The leaves partition the candidates.** Across all leaves the tree holds exactly + `RecordCandidates(CultRecordRef, records)`, each record once, in candidate order + inside a leaf. Grouping never hides a record, including one whose grouped value is unset, + dangling, or an undefined enum value. +- **I3. The listed type owns the tree's shape.** Grouping comes from the type selected in the + type pane, never from each record's runtime type. +- **I4. Node identity is value identity, not the label.** A ref groups by key, an enum by its + underlying value, other kinds by the value's invariant string. Foldout state keys on node id. +- **I5. Create-in-group round-trips.** Upsert what `CreateInGroup(listed, node)` returns, + regroup: the new record lies in a node with the same id. +- **I6. One candidate rule.** `IsRecordCandidate(refType, record)` is the only test for "this + record may be this ref's value". `RecordCandidates` filters through it; drop acceptance calls it. +- **I7. One ref label.** The model owns `None` and `Missing `; the picker and group labels + both use it. +- **I8. Invalid declarations never break the window.** They give a flat list plus the model's + notice, never a throw in `OnGUI`. +- **I9. A drop honours the picker's gates.** Refused in a disabled (read-only) scope, when the + payload came from another model, and when the key equals the current key. A dictionary-key + drop still passes `ReplaceKey` (`CultCacheStudioDrawers.cs:303-309`). +- **I10 (new). Grouping reads what readers read.** A variant record groups, labels, and is a + drop candidate by its resolved `Document` (`CultCache.cs:369-371`), never its delta. + +### Non-goals + +No sibling-runtime port (TS `cult-cache-inspector.ts` is a byte dumper; Rust and Python have +no inspector). No runtime CultUI panel. No search (Q4), no picker grouping (Q3), no +drop-to-append on list headers, no legacy `New ` naming. + +## Body findings + +Kept from 2026-09-17, re-anchored: + +- **F3.** Legacy grouping matched the exact type; grouping derived records under a base + declaration is new. +- **F4.** Legacy create-in-group was dead (`DatabaseView.cs:70-75` throws); legacy foldouts + keyed on the label hash. +- **F5.** `member.GetCustomAttributes(true)` ignores `inherit` for a `PropertyInfo`, so a base + `[M] abstract P` is not seen on the override. Sites: `CultInspectorModel.cs:36` (now the only + metadata site: `MetadataOf` caches it per member, `:341-351`) and `:209` + (`CultInspectorDrawerClaims.Resolve`). Fix: `Attribute.GetCustomAttributes(member, true)`. +- **F6.** Studio `Add` creates only the listed type (`CultCacheStudioWindow.cs:340-346`, + `CreateElement(type, type)`), disabled when the model cannot create it (`:141`). So + create-in-group never makes a derived type, and an abstract listed type offers no `Create`. +- **F7.** Studio search filters the type pane only (`:112-120`). +- **F8.** Foldouts are in-memory (`CultCacheStudioDrawers.cs:33`); `OnDisable` closes the store + (`:48-51`), domain reload included. The only `EditorPrefs` key is `LastPathKey` (`:13`). +- **F9.** No drawer claims `CultRecordRef<>`, so every ref reaches `DrawRecordRef` + (`CultCacheStudioDrawers.cs:254-280`). +- **F10.** The Studio editor sources compile outside Unity (netstandard2.1, C# 9, against + Unity 6000.3.24f1 `Editor\Data\Managed\UnityEngine\*.dll` without the `UnityEditor.dll` + facade, plus the built `GameCult.Caching*` and tracked `MessagePack*.dll`). The 09-17 + scratch project is gone; Hands rebuilds it in its own scratch from this recipe. +- **F11.** The record row reads its click in `GUILayout.Toggle` (`:184`); a drag start must be + handled on a reserved rect before the toggle draws (IMGUI convention, not probed). + +New since the map: + +- **F12. Variants (C1, `6ffe17a`).** `CultInspectorModel(registry, CultCodec)` + (`CultInspectorModel.cs:302-306`); Studio still calls `CultCacheMessagePack.CreateInspectorModel(registry)` + (`CultCacheMessagePack.cs:33-34`, unchanged). `CultStoredDocument.Variant` is the delta + (`CultCache.cs:374`); `Document` is the resolved view. A top-level override is a + `Set` whose path is one step at the member's slot (`CultVariants.cs:72-73`), so "is this + grouped member overridden on this variant" is computable from the member's `Slot`. +- **F13. Every Studio commit to a variant key is refused until C3.** `CultInspectorEdit.Commit` + is a plain `UpsertAsync` (`CultInspectorModel.cs:266-282`); Q1a refuses a plain write at a + variant key (`CultCache.cs:2494-2496`). A drop into a variant's inspector therefore reports + that refusal until C3 lands. The release waits for C3, so no shipped Studio shows it, but + the operator click-through must run after C3. +- **F14. Studio `Duplicate` of a variant makes a flattened plain copy** + (`CultCacheStudioWindow.cs:349-353` clones the resolved `Document`). Not this campaign's + defect; C3's `CreateVariant` sits beside it. +- **F15. Element ids (C2a, `hands/variants-c2a`, WIP `df74f8c`).** No grouping interaction: + grouped members are top-level scalars and refs; ids live on list elements. Drops write a ref + into the edit document; ids are untouched and minted on write for new elements; C3's diff + keys overrides on them. Two consequences: + - After C2a, registration refuses a document type whose object-list element lacks a + `[CultElementId]` (`CultCache.cs` descriptor build, WIP). Cut 1's new fixtures carry no + object lists. + - C2a does not hide or lock the id member, so Studio shows it as an editable string. + Hand-editing one retargets overrides. That belongs to C3 (make `[CultElementId]` members + read-only in the model), not here; flagged for Self. +- **F16. The 1.0.60/1.4.0 release shipped** (`0155ba8`, tags on `45c2f40`) and + `codex/asset-guid-attribute` is merged. It already carried the 302,080-byte native bridge, + so the 09-17 Q5 drift is spent. Native source has moved since (`git diff --stat 45c2f40 main + -- native/`: 5 files, +840/-118), so this release rebuilds the bridge again. The v1 exports + the managed side imports (`src/GameCult.Mesh.Quic.Native/*.cs:263-276`) remain at + `cultmesh_quic_native.cpp:1405-1465`. +- **F17. Aetheria's schema moved.** `ItemData.Manufacturer` is gone (slot 3 retired, + `ItemData.cs:281-282`). The manufacturer relation now lives on `FactionProductData` + (`FactionProduct.cs:27`, `CultRecordRef Manufacturer`; `:24`, + `CultRecordRef Design`). Aetheria pins `cultlib-unity-v1.0.60` / + `caching-unity-v1.4.0` / `cultmath-unity-v0.2.4` (`Packages/manifest.json:54-56`), + `CultLibRevision` `45c2f40` and a separate `CultMathRevision` `6d5e209` + (`Directory.Build.props:6,10`). +- **F18. After C2a, Aetheria cannot take the new CultLib without its element-id sweep** + (`List`, `List`, `List`, `List`, + `List`, `List`, among others). So the Aetheria re-pin belongs to + variants C4, and this campaign's Cut 4 shrinks to annotations and tests on top of it. + +## Identity and authority + +| Thing | Owner | Lifecycle | Persisted | +|---|---|---|---| +| `[CultInspectorGroupBy]` | consumer source | compile time; nearest declaration wins; no arguments opts out | source only | +| `CultInspectorGrouping` (resolved) | model | cached per listed type like `_shapes` (`CultInspectorModel.cs:296`) | no | +| `CultInspectorRecordGroup` tree, node ids, labels | model | rebuilt each `OnGUI`, as `RecordCandidates` is (`CultCacheStudioWindow.cs:167`) | no | +| Group foldouts (node id → bool) | window | window memory; cleared by `CloseStore` (`:318-327`) | no | +| Drag payload `{ Model, Key }` under `"GameCult.CultCacheStudio.Record"` | Studio list (source) | one drag | no | +| Drop acceptance | `IsRecordCandidate` plus I9 gates | per `DragUpdated`/`DragPerform` | no | +| Created-in-group object | model makes; `CultCache` admits via `UpsertAsync`, as `Add` | new plain record | store, on `Save` | + +## Forks + +Q1-Q5 are ruled (header). Two remain. + +### Q6. RULED A (2026-09-30). How does the grouped list show a variant? (blocks nothing in Cuts 1-2; shapes C3's row lowering) + +Mechanical defaults, not asked: a variant groups by its resolved values (I10), so a variant +that inherits its base's `HullType` sits in the base's node and moves when the base changes; +create-in-group always makes a plain record; C3's `CreateVariant` needs no preset because the +variant inherits its base's group; a variant is a valid drag payload. + +- **A. Flat by resolved value.** A variant is an ordinary row in its resolved group. C3 adds a + row marker ("variant of Longinus"). Which of its grouped values are overridden shows in the + inspector through C3's per-member marker, not in the tree. +- **B. Nested under the base.** Inside a leaf, a variant row sits indented under its base's row + when both share the leaf; otherwise it stands alone with the marker. +- **C. A's rows plus an inherited/overridden glyph on the row** for the grouped members. +- **Recommendation: A.** I2 stays one rule, the tree has one shape, and the base link already + lives in C3's inspector. B makes the tree's shape depend on two relations, and splits + whenever a variant overrides a grouped value. C duplicates C3's inspector marker. + +### Q7. RULED B (2026-09-30). Which Aetheria types group, and by what? + +Candidates on `codex/fire-control-12` (enums unless noted; `[Flags]` enums excluded): + +| Type | Member | Anchor | Note | +|---|---|---|---| +| `SimpleCommodityData` | `Category` (`SimpleCommodityCategory`) | `ItemData.cs:310` | legacy parity | +| `CompoundCommodityData` | `Category` (`CompoundCommodityCategory`) | `ItemData.cs:338` | legacy parity | +| `GearData` | `Hardpoint` (`HardpointType`) | `ItemData.cs:454` | legacy parity; `WeaponItemData` inherits when listed under `GearData` | +| `WeaponItemData` | `WeaponType`; or `WeaponCaliber`, `WeaponRange` | `ItemData.cs:485`, `:482`, `:479` | re-declaration, applies when listing weapons | +| `HullData` | `HullType` | `ItemData.cs:519` | legacy parity | +| `FactionProductData` | `Manufacturer` (ref `Faction`), then `Design` (ref `CraftedItemData`) | `FactionProduct.cs:27`, `:24` | where "by manufacturer" now lives | +| `Loadout` | `Hull` (ref `HullData`) | `Loadout.cs:17` | optional | + +`ConsumableItemData`, `CargoBayData`, `DockingBayData`, `Faction`, `PersonalityAttribute` +have no groupable member worth a level. + +- **A. Legacy parity minus manufacturer:** commodities by `Category`, `GearData` by + `Hardpoint`, `HullData` by `HullType`. +- **B. A, plus `FactionProductData` by `Manufacturer` then `Design`, plus `WeaponItemData` by + `WeaponType`.** +- **C. B with `FactionProductData` by `Design` then `Manufacturer`** (the market-segment view: + who makes this design). +- **D. B plus `Loadout` by `Hull`.** +- **Recommendation: B.** It recovers everything the legacy window grouped, puts the + manufacturer view where the manufacturer now is, and gives the weapon list its own axis. + C is the better view if the operator authors products per design rather than per faction. + Product record counts are unprobed; Cut 4's Hands reports them. + +## Defaults (recorded, not asked) + +- **Labels:** enum `Enum.GetName`, else the number; ref `RecordLabel` of the candidate with that + key (for `Faction`, `Name`, not legacy `ShortName`); unset ref `None`; dangling `Missing `; + string its value or `(empty)`; integer invariant string; bool `False`/`True`. +- **Order within a level:** enums by underlying value; refs `None` first, then label + (`OrdinalIgnoreCase`, then key), `Missing` last; strings `OrdinalIgnoreCase` then ordinal; + integers numeric; `false` before `true`. +- **Groupable kinds:** String, Integer, Bool, Enum (not `[Flags]`), RecordRef. Refused with a + notice and a flat list: any other kind (Float included), a `[Flags]` enum, `Hidden`, + `IsReadOnly`, a name that is not an inspector member of the listed type, a name given twice. +- **Global types are never grouped.** +- **Foldouts:** window memory, collapsed by default, cleared by `CloseStore`. Create-in-group, + `Add` and `Duplicate` expand the path to the new selection. No `EditorPrefs`/`SessionState`. +- **Create into a `Missing ` node** presets the dangling key (keeps I5). +- **A drop of the current key is rejected** (no no-op commit). +- **Variants:** see Q6's defaults and I10. + +## Sequence with document variants + +| Cut | Files | Overlaps grouping? | +|---|---|---| +| Variants C2a (element ids, in flight) | `CultCache.cs`, new `CultElementIds.cs`, Mesh/Geometry documents, `ElementIdTests.cs` | no | +| Index cut (`[CultIndex]` means unique; queued behind C2a) | `CultCache.cs`, Mesh/Geometry | no | +| Variants C2b (nested paths; inferred from the brief, not yet written in the variants map) | `CultCache.cs`, `CultVariants.cs` | no | +| **Grouping Cuts 1-2** | `CultInspectorModel.cs`, `CultInspectorAttributes.cs`, `CultInspectorModelTests.cs`, `CultCacheStudioWindow.cs`, `CultCacheStudioDrawers.cs`, Studio README | — | +| Variants C3 (Studio edits the delta) | `CultInspectorModel.cs` (edit, commit, diff, `CreateVariant`, `Rebase`), window (variant controls beside `Duplicate`, row marker), drawers (per-member marker and revert), `CultInspectorModelTests.cs` | **yes: all five grouping files** | + +**Order:** grouping Cuts 1-2 now, in parallel with C2a, the index cut and C2b (no shared +files). Grouping merges to `main` before C3's Hands starts; C3 needs C2b anyway. C3 then +rebases onto grouping and lowers its row marker inside the grouped row drawing that Cut 2 +writes. Then **one release (Cut 3)**, then one Aetheria pass (variants C4 plus Cut 4). + +Where they touch: `DrawRecords` rows (`CultCacheStudioWindow.cs:180-185`; grouping rewrites, +C3 marks); the toolbar (`:142-157`; C3 adds variant buttons beside `Duplicate`, grouping +leaves it alone); `DrawRecordRef` (grouping adds the drop target; C3 marks at the member +level in `DrawValue`, not inside it); `CultInspectorModel.cs` (disjoint methods); +`CultInspectorModelTests.cs` (disjoint fixtures; name grouping fixtures `Group*`). + +**One release commit:** Cut 3 below is the single release for both campaigns. The variants +map's C3 line "Then tag `caching-unity-v1.5.0`" should point here instead of owning a second +release step (proposal for Self). + +## Cuts + +Hands for Cuts 1-2: branch `hands/studio-grouping` in a fresh worktree off `origin/main` +(Self picks the path, e.g. `C:/wsNN-grouping`). `F:\Projects\CultLib-studio-grouping` holds the +superseded docs-only `codex/studio-grouping`; do not reuse it. Do not touch the main checkout. +Mutation testing is Stryker.NET on the cut's diff; there are no hand-applied mutations. + +### Cut 1. CultLib model: declaration, tree, candidate and label authority (~150k tokens) + +- **Delete and collapse first:** + - `CultInspectorModel.cs:519`: the inline `target.IsInstanceOfType(record.Document) && + record.Key.Value.Length > 0` in `RecordCandidates` (`:514-522`) moves into + `IsRecordCandidate`; `RecordCandidates` filters through it (I6). + - `:36` and `:209`: `member.GetCustomAttributes(true)` → `Attribute.GetCustomAttributes(member, true)` (F5). +- **Add in `CultInspectorAttributes.cs`**, before `CultInspectorDrawerAttribute` (`:81-86`): + `CultInspectorGroupByAttribute(params string[] members)`, `AttributeUsage(Class, + Inherited = true, AllowMultiple = false)`, property `Members`, with a comment in the file's + style stating nesting, nearest-wins and opt-out. +- **Add in `CultInspectorModel.cs`** (or a sibling `CultInspectorGrouping.cs`, same namespace; + one file while it stays under ~800 lines; it is 645 now): + - `CultInspectorGrouping { Type ListedType; IReadOnlyList Members; string? Notice }` + (members empty when `Notice` is set). + - `CultInspectorRecordGroup { string Id; string Label; int Depth; IReadOnlyList Values; + IReadOnlyList Children; IReadOnlyList Records; int Count }`. + - `GroupingOf(Type listed)`, cached like `ShapeOf` (`:324-333`): names resolve against + `MembersOf(listed)` (`:335-339`); validation per Defaults. + - `GroupRecords(Type listed, IEnumerable records)`: partitions + `RecordCandidates(CultRecordRef)` by value identity, reading each record's + `Document` (resolved, I10). + - `CreateInGroup(Type listed, CultInspectorRecordGroup group, out string? notice)`: + `CreateElement(listed, listed, out notice)` (`:387-398`), then `SetValue` each level; refs + via `CreateRecordRef` (`:524-529`). `ArgumentException` for a node not of `listed`'s current + grouping. + - `IsRecordCandidate(Type refType, CultStoredDocument record)`. + - `RecordRefLabel(Type refType, object? value, IEnumerable records)`: `None`, + `RecordLabel` (`:315-319`), or `Missing `. +- **Tests** in `tests/GameCult.Caching.Tests/CultInspectorModelTests.cs` (476 lines; fixtures + `:299-476`). New fixtures `GroupBase` (abstract) / `GroupLeaf : GroupBase` `[CultDocument]`, + a re-declaring type and an opting-out type; members: enum declared out of alphabetical + order, `CultRecordRef`, string, float, `[Flags]` enum, hidden int, read-only int. + No object lists (F15). Behaviours, one test each: + 1. levels nest in declared order, not slot order; + 2. a `GroupLeaf` listed under `GroupBase` groups by the base declaration (I3); + 3. nearest declaration wins; an empty declaration opts out; + 4. leaves partition the candidates over unset refs, dangling refs and undefined enum values (I2); + 5. two refs sharing one `[CultName]` give two nodes; `None` first; `Missing k` last (I4, I7); + 6. enum nodes order by value; + 7. create at depth 2, upsert into a temp single-file `CultCache`, regroup: same node id (I5); + 8. each invalid declaration (unknown, float, `[Flags]`, hidden, read-only, duplicate) gives a + notice and a flat tree, no throw (I8); + 9. `IsRecordCandidate` accepts a subtype, refuses a sibling and an empty key, and + `RecordCandidates` equals the records it accepts (I6); + 10. a base abstract property's `[CultInspectorLabel]` reaches the override's metadata (F5); + 11. **a variant groups by its resolved value**: base with `Enum=A`, variant overriding it to + `B` via `UpsertVariantAsync` and `Override`, regroup: the variant is in `B`; change the + base to `C` with the variant not overriding it, regroup: it follows to `C` (I10). +- **Verify (Yggdrasil):** + `ygg-verify.sh /f/Projects/CultLib dotnet 'dotnet test tests/GameCult.Caching.Tests -c Release'`, + then + `ygg-verify.sh /f/Projects/CultLib dotnet 'dotnet tool install -g dotnet-stryker && export PATH="$PATH:$HOME/.dotnet/tools" && cd tests/GameCult.Caching.Tests && dotnet stryker --project GameCult.Caching.csproj --since: > /tmp/s.log 2>&1; rc=$?; tail -60 /tmp/s.log; exit $rc'`. + Survivors triaged by name in the report. +- **Ledger:** model ~+170, attributes ~+15, tests ~+230; one predicate collapsed. + +### Cut 2. CultLib Studio: lower the tree, create in group, drag source, drop target (~150k tokens) + +- **Delete first:** + - `CultCacheStudioDrawers.cs:266` inline `"Missing " + key : "None"` → + `Model.RecordRefLabel(type, value, Records)` for `names[0]` when `index == 0`. + - `CultCacheStudioWindow.cs:180-185` flat `foreach` → tree drawing. +- **Window** (`CultCacheStudioWindow.cs`): + - fields (`:13-30`): `Dictionary _groupFoldouts` (ordinal), `const string RecordDragKey`; + `CloseStore` (`:318-327`) clears them. + - `DrawRecords` (`:135-189`): `GroupingOf(_selectedType)`; a `Notice` shows a warning + `HelpBox`. Draw `GroupRecords(_selectedType, _records)` recursively: foldout `Label (Count)` + indented by `Depth`; an expanded node draws children, leaf rows, then a `Create` mini + button under `Add`'s gate (`:141-146`). The root is not a foldout; `Add` stays root create. + - row: reserve the rect with `GUILayoutUtility.GetRect`, handle `MouseDrag` there first + (`PrepareStartDrag`, `SetGenericData(RecordDragKey, new CultCacheStudioRecordDrag(_model, key))`, + empty `objectReferences`, `StartDrag(label)`, `Use()`), then `GUI.Toggle(rect, ...)` (F11). + Keep the existing `` suffix logic (`:182-183`) in one place for C3 to extend. + - `AddInGroup(node)` mirrors `Add` (`:340-346`) through `Run` (`:369`); selects the key and + expands the node's id prefixes. `Add`/`Duplicate` reveal the new record's path (a + `_revealKey` resolved next frame is acceptable). +- **Drawers** (`CultCacheStudioDrawers.cs`): `internal sealed class CultCacheStudioRecordDrag + { Model; Key }`. In `DrawRecordRef` (`:254-280`), capture the `HorizontalScope` rect; on + `DragUpdated`/`DragPerform` inside it with our payload: `Copy` when `GUI.enabled`, same + `Model`, key differs, record in `Records`, and `IsRecordCandidate`; else `Rejected`. Leave + foreign drags alone. On perform: `AcceptDrag`, `next = key`, `GUI.changed = true`, `Use()`; + return through the existing `:279`. +- **README** (`src/GameCult.Unity/Assets/Caching/README.md`): grouping, create in group and + drag-to-reference after the paragraph at `:30-34`; the grouping API, `IsRecordCandidate`, + `RecordRefLabel` under `## Inspection Model` (`:39`). +- **Verify:** + - Cut 1's Yggdrasil test command still passes. + - Negative greps (each empty): + `rg -n "IsInstanceOfType" src/GameCult.Unity/Assets/Caching/Editor | rg -v "assetType.IsInstanceOfType"` (I6; `:215` is the asset-GUID sub-asset check, not candidacy); + `rg -n "\"Missing \"" src/GameCult.Unity/Assets/Caching/Editor` (I7; the union drawer's + `"None"` at `:393` is not a ref label, so grep `Missing` only); + `rg -n "SetValue|GetCustomAttribute|CultInspectorGroupBy" src/GameCult.Unity/Assets/Caching/Editor/CultCacheStudioWindow.cs` (I1); + `rg -n "EditorPrefs" src/GameCult.Unity/Assets/Caching/Editor` shows only `LastPathKey`. + - **Starfire, one job, editor closed:** the F10 compile gate, `dotnet build` of a scratch + netstandard2.1 project over the worktree's `Assets/Caching/Editor/*.cs`. 0 errors. +- **Ledger:** window ~+80, drawers ~+30, README ~+20; two inline decisions deleted. + +### Cut 3. Joint release: cultlib Unity 1.0.61, Studio 1.5.0 (after grouping and variants C3 merge) + +- **Base:** `main` with grouping Cuts 1-2 and variants C1-C3 merged; a clean worktree. +- **Files:** `unity/org.gamecult.cultlib/package.json:4` `1.0.60` → `1.0.61`; + `src/GameCult.Unity/Assets/Caching/package.json:4` `1.4.0` → `1.5.0` and `:13` dependency + `1.0.61`; `CHANGELOG.md` entries in both packages (grouping, create in group, drag to + reference; variant editing from C3); plugins via + `powershell -File scripts\build-unity-package.ps1 -UpdateTemplate` (Windows: MSVC and the + pinned MsQuic digests; its version check is at `:168-170`). +- **Tags:** `cultlib-unity-v1.0.61`, `caching-unity-v1.5.0`; no `cultmath-unity` tag. +- **Verify (Starfire, one job at a time):** + - byte check: rerun the script; `git status --porcelain unity/` is empty; + - expected diff: `GameCult.Caching.dll/.pdb` changes, and `gamecult_mesh_quic_native.dll` + changes (F16); `msquic.dll` should not (same pinned digest). Anything else stops the release; + - API present: reflect over the tracked `GameCult.Caching.dll` for + `CultInspectorGroupByAttribute`, `GroupRecords`, `CreateInGroup`, `IsRecordCandidate`, + `RecordRefLabel`, and C3's `CreateVariant`; + - native ABI: `dumpbin /exports` lists `cultmesh_quic_open`, `_state`, `_poll`, `_error`, `_close`; + - `git ls-remote --tags origin` lists both tags. + +### Cut 4. Aetheria: grouping annotations (inside variants C4's pass; blocked on Q7) + +- **Where:** the Aetheria branch and worktree Self opens for variants C4. Never + `F:\Projects\Aetheria`'s working tree. C4 owns the pin bump (`Directory.Build.props:6`, and + `Packages/manifest.json:54-55` to `#caching-unity-v1.5.0` / `#cultlib-unity-v1.0.61`; + `:56` cultmath unchanged; `packages-lock.json` follows) and the element-id sweep (F18). This + cut adds only: + - Q7's `[CultInspectorGroupBy(...)]` class attributes (recommendation B: five declarations); + - `tests/Aetheria.Shared.Tests/StudioGroupingTests.cs` (xUnit): `GroupingOf` over + `CultCacheMessagePack.CreateInspectorModel(registry)` names exactly the declared members + per annotated type with no notice; `GroupingOf(typeof(WeaponItemData))` follows Q7; every + registered document type's `GroupingOf` has a null notice. +- **Verify:** + - headless (Starfire, one job; the revision check needs `CultLibRoot` clean at the release + SHA and `CultMathRoot` clean at `6d5e209`): + `dotnet test tests\Aetheria.Shared.Tests -p:CultLibRoot= -p:CultMathRoot=`; + - Unity 6000.3.24f1 batchmode compile, editor closed: + `-batchmode -nographics -quit -projectPath -logFile `; 0 errors, + both new tags resolved. +- **Operator only, in Aetheria's Studio against a copy of `GameData/Aetheria.cc`:** + - each annotated type shows the declared levels; `GearData` includes `` rows; + - create in a node: the record lands there and is selected; + - drag a `Faction` onto a `FactionProductData.Manufacturer`: accepted; drag a gear record onto + it: rejected; + - drag a `PersonalityAttribute` onto a `DemandProfile` key that already exists: refused + through the notice; + - read-only open: every drop rejected; + - a variant (once C4 authors one, e.g. `LonginusX`) sits in its resolved `HullType` node, + and a drop into its inspector writes an override (C3), not a refusal; + - close without edits: store bytes unchanged. + +## Subtraction ledger + +Added: one attribute, two model types, five model methods, ~11 CultLib and ~3 Aetheria tests, +~110 Studio lines, five annotations. Collapsed: the candidate predicate (now one method, reused +by drop), the ref label strings, the property-inheritance miss (F5). Not added: selectors, +registries, `EditorPrefs` keys, runtime ports, packages, targets, daemons, a second release. +Build footprint: `GameCult.Caching` and its tests (Yggdrasil); the F10 compile gate, the +package script (all tracked plugins including the native bridge) and Aetheria's headless and +batchmode checks (Starfire; Windows is the target for the editor plugin and win-x64 bridge). + +## What the 2026-09-17 map had wrong as of `feeced8` + +- Cut 4 grouped `GearData` by `Manufacturer`; `ItemData.Manufacturer` no longer exists (F17). +- Q5's native-plugin drift was spent by the 1.0.60 release (F16); the Cut 3 "rebase onto + `codex/asset-guid-attribute`" note is obsolete (merged). +- Cut 4 re-pinned Aetheria on its own; after C2a it cannot, without the id sweep (F18). +- Aetheria branch `codex/cultcache-cutover`, props `:5`, manifest `:53-55`, cultmath `v0.2.3`: now + `codex/fire-control-12`, `:6`, `:54-56`, `v0.2.4` with a separate CultMath pin. +- Negative greps for `IsInstanceOfType` and `"None"` would fail on unrelated lines (`:215`, `:393`). +- Hand-applied mutations per test are retired; Stryker.NET on the diff replaces them. +- Moved anchors: `RecordCandidates` `:512-520`→`:514-522`; `_shapes` `:298`→`:296`; `RecordLabel` + `:313-317`→`:315-319`; `CreateElement` `:385-396`→`:387-398`; drawer attribute `:80`→`:81-86`; + `DrawRecordRef` `:195-221`→`:254-280`, label `:207`→`:266`; `ReplaceKey` routing + `:243-251`→`:303-309`; test fixtures `:380-459`→`:299-476`; README `:36-39`→`:30-39`; build-script + version check `:150-155`→`:168-170`. +- Worktree `F:\Projects\CultLib-studio-grouping` is now the superseded docs branch; Hands uses a + fresh one. diff --git a/docs/typescript-quic-realtime-cut.md b/docs/typescript-quic-realtime-cut.md new file mode 100644 index 00000000..ebef2893 --- /dev/null +++ b/docs/typescript-quic-realtime-cut.md @@ -0,0 +1,2771 @@ +# TypeScript QUIC Realtime Plane Cut Map + +Date: 2026-09-16 + +Status: Imagination output for the target in +`docs/typescript-quic-realtime-target.md` (operator-accepted 2026-09-16). No +code in this document has been written. Nothing here is committed by +Imagination; the root agent commits. Q5, Q6 and Q7 were ruled the same day +(section 13, Rulings); Q5 was then re-ruled from A to C: no registry in this +campaign, registry publication parked for a later pass by choice. Cut 6, +section 5.4, the binary-resolution and dependency lines of Cut 4, and Cut 7's +ledger are remapped under C (landed 2026-09-16, same day). Q8 is ruled: +the built binaries are committed to the tree (section 11.2). No operator +question is open. **Cut 1 landed** at `e234a64` (shared verifier, tests, +C#-written vectors), `66286b9` (browser copy deleted, −143 net) and +`062a5c6` (mutation runner; twelve killed, one equivalent), then three +Soul passes and three fix batches; **closed 2026-09-16**, three residuals +landed at `c64a2da`, `6c933d0`, `fe2555d`. + +**Cut 2 landed** at `6cbc73f` (the codec, 178 lines; C#-written and +TypeScript-written frame vectors, each decoded by the other side, the C# +test reading both with the reference alone) and `ae29910` (37 entries as a +third runner target; 72 of 72 across the three targets killed, one +equivalent named). Closed 2026-09-16 after Soul's pass and one fix batch. +Hands' discrepancies, kept: the +65,535-byte identity and 64 MiB payload ceilings recorded as a build rule +plus the digest of the whole encoding rather than half a megabyte of +literal text; the Body has five refusal messages where the spec listed six +(negative length and length-sum mismatch share one); three refusals added +that C#'s type system gives free, among them **a real divergence found by +the test: `TextDecoder` deletes a leading U+FEFF where +`Encoding.UTF8.GetString` keeps it, and U+FEFF is not .NET whitespace, so +such an identity passes `Validate` and reaches the wire**, closed with +`ignoreBOM`; C# sums lengths under `checked` and TS covers the overflow +with its length refusal, unreachable from either encoder. Residual 1's +exact-equality verification could not hold as written: applying the +pre-check leaves eleven stricter-than-C# spellings, all the safe direction, +pinned by name, because exact agreement needs .NET's registered-scheme +table. The no-control-byte test caught a literal U+001F the Write tool put +into its own introducing comment. + +Two items for Self's ruling, both taken: **`npm run test:ts` and `build:ts` +have been broken since `8cb3b72`** (the scoped rename; Hands first +attributed it to `8dd5a45`, which only bumped a version, and Soul +corrected it) because `scripts/run-typescript-workspaces.mjs:9` names the +old unscoped `cultcache-ts`; one-word fix, lands in Cut 2's fix batch. +**The runner is `scripts/mutate-cultmesh.mjs`** since `65f2b66`'s batch +(renamed from `mutate-cultmesh-authority.mjs` once it carried a codec +target); every reference below that names the old path is history. + +**Soul's pass on Cut 2** (Fable; probes `probe-cs/`, `parity.mjs`, +`symmetric.mjs` and others in the session scratchpad) held byte parity in +both directions over its own thirty-nine encode specs and thirty +hand-built byte strings: identical digests, identical refusal messages, +identical U+FFFD counts on invalid UTF-8, the byte-order mark round trip, +all four digest ceilings regenerated from their build rules on both sides, +the five decode refusals in the same order, and every symmetric two-site +mutant dead. **Cut 2 does not close as promised**, on three small findings +in the fix batch: + +- **The mutant Hands called equivalent is not.** A 37-byte frame whose + identity lengths cancel a negative payload length sums to exactly 37 and + decodes to blank identities where C# refuses. The clause is right; nothing + defended it. Medium. +- **The decoded payload aliases the frame when the input is a Node + `Buffer`**, because `Buffer.prototype.slice` is a view; the test used only + a `Uint8Array`. The same trap the repo recorded for `verifyP256`. Medium + for the bridge, nil today. +- **Neither half of the frame parity runs in CI**; a C# codec change leaves + everything green. The Cut 1 scar, repeated. Medium. + +Recorded, not defects: the reference encoder writes delivery values its +own decoder refuses (a cast on the enum), where TypeScript refuses at +encode, the stricter side; an overflow near `int.MaxValue` is reachable +from hostile bytes and refused on both sides with different words; the +runner's sentinel detects only the last mutant by design, and the sidecar +repair names the mutation a dead run was inside. + +**The Cut 2 fix batch landed** (Opus) at `65f2b66` (the aggregate scripts +reach every workspace again; breakage confirmed at `8cb3b72`), `9a4c939` +(the payload copy is `new Uint8Array(bytes.subarray(…))`, because Soul's +prescribed `Uint8Array.prototype.slice.call` returns a `Buffer` from a +`Buffer` through `@@species` and fails Soul's own assertion; three crafted +negative-length frames refused; the false equivalence note gone), +`6ed0ff7` (both halves of the frame parity in CI on both OSes) and +`7a0749b` (the eleven stricter spellings named for what they are: three +backslash, two missing-authority, four host repairs, two `URL` throws; the +same slip in `isProtectedEndpoint`'s own comment fixed). 75 of 75 +mutations killed across three targets. Gap, not a workaround: `npm run +test:ts` still cannot go green on the workstation because one +`cultcache-ts` test spawns `python`, the Store alias stub here; `py -3` +has msgpack; pre-existing since `8cb3b72` and outside every cut. + +**Cut 3 landed** (Opus) at `6a091ef` (the bridge: 440 → 1,168 lines of +C++, a two-role event-queue C ABI v2 with twelve exports, the five v1 +exports kept as a Windows-only Unity shim) and `23dc093` (CMake for both +platforms, `scripts/build-quic-native.sh`, README). Host and target: +win32-x64 built and smoked on the workstation (MSVC 14.44, CMake 4.3.2); +linux-x64 built and smoked in the workstation's Docker `debian:13`, which +is the development loop and **not release-grade**; its release build is +Cut 6's Actions job. Fifteen-check FFI smoke 15 of 15 on both; the v1 gate +3 passed, 1 skipped by design; ten native mutations killed under two green +controls; exports 17 on Windows and exactly 12 on Linux with hidden +visibility; the deb digest and header sizes match the probe ledger; +manifests with SHA-256s beside every binary. Two bugs the old shape never +exercised, found by hanging tests and now mutation-pinned: the v1 +certificate pin must be attached before `ConnectionStart` (the handshake +reaches the certificate event on a worker thread at once on loopback), and +teardown must close connection handles itself because `RegistrationClose` +blocks until every child is closed. Spec discrepancies kept: `ntdll` on the +Windows link list; the deb carries no licence text, so the script copies +the committed MIT text; the deb ships no unversioned `.so` symlink, so the +script creates one; four Linux runtime libraries are load-bearing and now +in the README. Soul in flight. + +**Q9, the one fork Cut 3 hit, ruled A on 2026-09-16 (detail below).** The +pinned Windows MsQuic is the Schannel flavour, and Schannel does not +implement `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12`: `ConfigurationLoadCredential` +returns `QUIC_STATUS_NOT_SUPPORTED`, so the provider role cannot open a +listener on Windows under it. The identical bridge DLL passes the full +smoke beside the OpenSSL 2.5.9 `msquic.dll` (SHA-256 `FEE9A664…`, +4,181,856 bytes). Linux is unaffected: Microsoft ships only the OpenSSL +build for Debian. +- **A. Pin OpenSSL on Windows.** One credential type on both platforms, + provider role works, ABI unchanged. Costs: the package URL and digest in + `build-quic-native.ps1`; the committed Windows `msquic.dll` grows from + 537 KB to 4.18 MB, so Q8's tree price becomes about 11.6 MB; the Unity + plugin's `msquic.dll` diverges until the operator's unscheduled rebuild. + The v1 client path works under either flavour. +- **B. Keep Schannel and convert PKCS12 to a certificate context via + `PFXImportCertStore`.** Keeps the pin and the Unity DLL; puts about + forty lines of Windows crypto in the shared provider path, breaking + "runtime-neutral" and the cut's own negative grep. +- **C. Providers Linux-only.** Cheapest; kills the Windows FFI smoke the + cut requires and the Windows provider lanes Cuts 4 and 5 need. +**Recommended: A. Ruled A, 2026-09-16** ("A"). The Windows pin moves to +`Microsoft.Native.Quic.MsQuic.OpenSSL` 2.5.9 in `build-quic-native.ps1` +with its digest; Q8's committed tree price is restated at about 11.6 MB; +the Unity plugin's `msquic.dll` stays Schannel until the operator's +rebuild, recorded in section 15, and the v1 client path is verified under +both flavours. The spec's "one credential type for Schannel and OpenSSL" +sentence in section 8 is withdrawn: the header declares the type and only +the OpenSSL provider implements it. *(Digest correction, Soul: `FEE9A664…` +is the NuGet zip, 19,179,817 bytes; the DLL is `c17c6581…`, 4,181,856 +bytes. Hands' report and this map's first record had the zip's digest on +the DLL.)* + +**Soul's pass on Cut 3** (Fable; `soul3-*` in the session scratchpad, +including a C consumer of the ABI that is not koffi and an ASan build of +the bridge) held the Cut 2 fixes entire, the export counts, the greps, the +clean-container Linux rebuild byte-identical to the manifest, the four +load-bearing Linux runtime libraries, the stress at 16,384 frames with +zero lost or reordered on both targets, both hang mutations dying by +timeout, and both of Q9's load-bearing claims (Schannel refuses the PKCS12 +credential with not-supported; the identical bridge passes 15 of 15 beside +the OpenSSL DLL; the v1 gate passes beside either). **Cut 3 does not +close.** Found, in a fix batch (Opus): + +- **A use-after-free between the host thread and MsQuic's worker** (high): + the id lookups drop the lock and return a raw pointer, the worker frees + the object on shutdown-complete, and the host's next send dereferences + it. One in three release runs crashes on each target under an ordinary + peer-driven stream teardown; three of three under ASan. The fix is an + object kept alive across the call, not a guard. +- **Event 7 is not one per frame send**: the kind-byte send completes as + its own event with nothing to tell it apart, six events for five frames. +- **The initiator of a shutdown never learns its connection is gone**: + MsQuic gives it only shutdown-complete, which the bridge swallows. +- **Return codes invert by platform**: `QUIC_STATUS` is a negative HRESULT + on Windows and a positive errno on POSIX, so a Linux host checking for a + negative code misses every failure; the README promised negative. +- **`runtime_close` wakes a blocked poller into freed memory**; the wake + makes the pattern look supported. Close must quiesce. +- **No host-facing header**: the struct layout and the twelve signatures + live in the `.cpp` and the spec; Soul wrote its C consumer from the spec. +- Smaller: an unbounded per-connection trace string from the v1 + diagnostics; a listener config failure leaving a dead handle in the map; + a stream emplaced after start; a partial listener open leaving an entry; + a null-payload poll consuming the event; the DLL importing the VC + runtime with the README silent. + +The Q9 pin change and the manifest's stale commit line ride in the same +batch. + +**The Cut 3 fix batch landed** (Opus; its commits are signed Opus 5, which +is what ran) at `9a01321` (`include/cultmesh_quic_native.h`, 305 lines: +the event struct with offsets static-asserted, every export, the id and +return-code conventions, the lifetime and threading rules; the koffi smoke +and Soul's C consumer are checked against it), `47aa7b6` (objects kept +alive across the call that names them: one `shared_ptr` per map entry, a +lookup returns a reference the caller holds for the whole MsQuic call, the +worker drops only the map's reference, the handle closes exactly once in +the destructor under the exchange guard, a stream owns its connection so +close order is structural; `runtime_close` marks closing, wakes pollers, +waits for `active_calls == 0`, and refuses any later call), `8c41896` (the +ABI gaps: one event 7 per frame send with `Canceled` distinct; event 4 +uniform at completion for every path, the initiator included, published +after the id stops resolving; return codes mapped negative on every +platform with `cultmesh_quic_last_status` for the raw status, thirteen v2 +exports now; a null payload with capacity refused; a stream in the map +before start; failed listeners leaving nothing) and `c729dff` (the OpenSSL +pin with both digests, `/MT` so the DLL imports no CRT, manifests with a +real commit line). Host and target: win32-x64 on the workstation, 20 of 20 +smoke checks, the C consumer's seq, cancel, stress (16,384 frames, zero +lost or reordered), race 400×20 with zero crashes, closerace 20×512, the v1 +gate 3 passed 1 skipped, 18 exports; linux-x64 in the workstation's Docker +`debian:13`, development loop only, the same set plus ASan clean on every +mode, 13 exports. 22 of 23 mutations killed under two green controls. +**L3 survived**: deleting the quiesce wait cannot be caught, because the +wake happens under the lock and every poller drains before teardown; right +by construction and by reading, unfalsifiable by this harness. Soul rules +whether that stands or a dev-only probe asserts the invariant. Open after +the batch: the Unity plugin's `msquic.dll` is still Schannel until the +package build runs; the Schannel dependency cache is orphaned; the v1 +return-code values changed while the zero-versus-nonzero contract held. +Bridge 302,080 bytes / `f4c5f644…` (win32-x64, static CRT), 108,128 / +`61d5b96e…` (linux-x64). + +**Soul's second pass on the fix batch** (Fable; `soul3b-*` in the session +scratchpad, its C consumer extended with close, re-entry and completion-race +scenarios, ThreadSanitizer and AddressSanitizer on linux-x64 in the +workstation's Docker `debian:13`). Held: the lifetime model, race 400×20 with +zero crashes on both targets and ASan clean on every mode; 16,384 of 16,384 +frames under stress with none lost or reordered; one completion event per +frame with cancellation distinct; the completion event uniform at the end of +every connection, with its mutant killed on both targets; negative return +codes everywhere; the null-payload refusal; the header compiling clean as +both C and C++ under maximum warnings on two compilers with no padding and +no implicit conversion; no C runtime import; the OpenSSL pin re-downloaded +and both digests equal; the version-one gate green beside either flavour of +the library. **The cut does not close at `c729dff`.** Findings: + +- **The quiesce is one line short, and it is a use-after-free.** `~CallScope` + decrements the call count under the lock, releases it, and only then + notifies. The closer's predicate is already true, so if that last poller is + preempted in between, the runtime is destroyed and the notify lands on a + freed condition variable. ThreadSanitizer caught it on the **unmutated** + bridge, so the previous batch's model was right in shape and wrong by one + line. Confirmed, medium, and the blocker. +- **The header oversells the return code.** It is portably negative, not + portably meaningful: the same failure is −12032 on Windows and −1126 on + Linux, and the Windows mask collides two distinct statuses onto −1002. The + sign is the contract; the magnitude is diagnostic. Low, wording. +- **The previous batch's own README claims a rebuild reproduces the committed + Unity plugin.** It does not: that plugin is the older Schannel build at + 40,448 bytes with a C runtime import, against 302,080 bytes without one + today. Low, and exactly the stale-artifact trap. The current build does + reproduce itself. +- **A Windows status sign-extends in diagnostics**, printing sixteen hex + digits. Trivial. + +**L3 is ruled: it becomes killable, it is not accepted as unfalsifiable.** +Soul established the survival was a harness limit rather than a proof of +correctness. Under AddressSanitizer with pollers blocked mid-copy of large +frames, deleting the quiesce wait hit use-after-free four times in +forty-eight attempts, while the release scenario never observed it. So a +dev-only assertion now aborts when the call count is non-zero after the +quiesce block, which fires deterministically with enough blocked pollers and +makes the mutation die by the existing scenario; the sanitizer run stays as +the second check. That assertion does not cover the defect above, where the +count has already reached zero. **Two mutations are honest only on the +sanitizer target:** the pop-then-copy one and the closed-handle one survive +on Windows release and kill three times of three under AddressSanitizer, so +the entries table must say which target each is honest on. A mutation whose +kill depends on the target is not killed until it runs there. + +**The second fix batch landed** (Opus) at `a4753f4` (the notify moves inside +the gate), `dc9e12c` (a Windows status stops sign-extending in diagnostics), +`53d5929` (the header says the return code is portably negative, not portably +meaningful), `19d8d5c` (the readme says the committed Unity plugin is the +older build), `f4186e7` (a committed scenario runner for the runtime +lifetime) and `180917d` (four native entries, each naming the target it is +honest on). + +**The discovery that outweighed the fix: there was no committed native +harness at all.** Every native mutation kill this cut had reported came from +consumers and scenarios that lived in agent scratchpads and no longer exist. +The runner at the previous head carried three package targets and nothing +touching the bridge, and two entries could not even be re-marked because +their definitions were gone. Hands built what the brief had assumed already +existed. + +**Soul's third pass, 2026-09-17** (Fable). Held: the lifetime fix on both +targets, the reverted notify killed three of three by the thread sanitizer +and invisible to the address sanitizer, so its target marking is right; the +assertion killing the deleted wait deterministically on both targets and +absent from both shipped libraries and a fresh release build; two fresh +release builds byte-identical to the committed artifact; the return-code +numbers recomputed from the pinned headers; byte-exact restore on both hosts. +**Cut 3 still does not close**, and the reason is that the harness defending +the fix is weaker than the fix: + +- **The committed Linux path does not run as committed.** The sanitizer + configuration dies before the scenario starts, on the kernel's + address-space randomisation, and the runner swallows the child's standard + error, so a future agent sees a red control and no diagnosis. Soul reached + four of four kills only by disabling randomisation and relaxing the + container's seccomp profile, neither of which any committed file mentions. + The image came from a definition that is not in the repository, and the + documented development recipe cannot run the runner at all, since it + installs the C++ toolchain but not the JavaScript runtime. High for the + claim that the Linux kills are rerunnable. +- **The scenario does not test the rule it exists for.** Deleting the call + guard from the polling entry point, so host calls are not counted at all, + survived nine runs of nine across every configuration. The harness pins the + order of the count and the notify, not that anything is counted. +- **The scenario passes vacuously when nothing parks.** Inverting the timeout + comparison makes every poller return before the close begins, and the + scenario is green on all six configurations. +- **The bounded-wait loosening is pinned by a constant, not by the rule.** At + one millisecond it dies with as few as two calls outstanding; at fifty + milliseconds it survives on both targets. A bounded wait is the wrong + contract at any bound. +- **A skipped entry exits zero** with no closing summary, so a gate reads a + host that killed nothing as green. +- **The header contradicts itself**, forbidding a call that begins after + close starts and separately promising such a poll is refused, when that + refusal path reads freed memory after teardown. + +**Two rules are defended by nothing committed**: popping before copying, and +a handle closed under a live call. Both were previously reported killed on +the sanitizer target only, and neither has a definition left. The third fix +batch is told to give each a real entry or to say plainly that the rule is +undefended, because an honest gap beats a fabricated kill. + +**The third fix batch landed** at `62e53df` (the development seam and a +hold-then-close scenario), `e4e09a0` (four entries, the bounded wait at 50 ms, +an exit status on skips, the child's stderr on a red control, re-execution +with randomisation disabled), `12c8bfc` (the header's self-contradiction) and +`4407098` (the committed container, the Ninja generator, the README recipe +with the seccomp requirement). + +**Soul's fourth pass, 2026-09-17** (Fable, banked mid-pass when that model ran +out, resumed on Opus from the bank; the handoff paid for itself by carrying a +live harness process, a dirty tree and two leads the successor opened with). +**The verdict splits, so it is given twice.** + +*The infrastructure question is now yes.* The committed container built with no +cache, then the literal README run line, gives eight killed, none surviving, +none skipped, exit zero on Linux; Windows gives six killed, two honestly +skipped, and a real exit code. A stranger can rerun both targets today. The +seccomp requirement is genuinely load-bearing and the randomisation +re-execution genuinely runs. The development seam is absent from a release +build: thirteen production symbols, no debug symbols, no assertion strings, +and every executable section byte-identical between pre- and post-change +release builds. The predecessor's harness had already exited, restoring the +tree byte-exactly, so the restore path holds. + +*The rules question is still no.* Three of the four rules in the native table +are pinned. The fourth is not, and the cause is structural rather than a bad +constant: + +- **F1, confirmed, high: the hold sits after the wait whose duration is the + rule**, so every timeout mutant lands in a blind spot by construction. + A hard-coded 100 ms survives Windows and Linux with assertions, and dies + under the thread sanitizer only because its slowdown trips an unrelated + condition. **A hard-coded 2000 ms survives the entire matrix on both + targets.** A host asking for five seconds silently gets two and every + consumer's poll loop spins at two and a half times the rate it asked for, + forever. The committed one-millisecond entry dies only because one is less + than the scenario's fifty-millisecond settle: constant pinning constant. +- **F2, confirmed, high: the pop-before-copy gap was wrong about itself.** + A client opening to a closed loopback port reaches that path in about a + millisecond with no listener, credential or connection, because the failure + path always publishes a non-empty reason; fifteen lines. Moving the pop + before the copy then crashes an ordinary optimised build twice out of two, + while both committed scenarios stay green on that same binary. +- **F3, confirmed, medium: the refusal during a close has no entry** and + survives being neutered, though the header promises it. A call entering + behind the closer increments the in-flight count behind the wait, which can + then never reach zero. +- F4, low: the seam misdescribes itself, claiming the held call touches + nothing afterwards when its scope destructor takes the gate, decrements and + notifies. The safety comes from the assertion, not the hold. +- F5, low: the bounded wait at 600 ms survives, the same shape as F1 and + honestly labelled as a limit by Hands. +- Also: "the close wakes every blocked poll" **is** defended by committed code + but has no entry, so the table understates coverage in one place while + overstating it in another. + +**Two scars from the pass itself.** An export made with `git archive` carried +1,459 inserted carriage returns, poisoning any byte comparison built on it; +raw blobs verified against the worktree hash are the only safe source. And the +51 bytes that differ between pre- and post-change release builds are accounted +for: 48 are four copies of the reproducibility content hash, and the last +three sit in exception metadata outside every executable section and **could +not be fully accounted for**, which Soul said rather than rounding away. The +same source rebuilt at the same path twice differs by zero bytes; built +elsewhere it differs by 69, so the figure is only meaningful at a shared path. + +**One undocumented step remains** in an otherwise clean path: the README +hardcodes the container mount, so a newcomer on another checkout must edit the +line. + +**The fourth fix batch landed** at `25d7de2` (the container mount taken from +the running checkout rather than one machine's path) and `a937a0b` (the +scenarios, the seam correction and the new entries). + +**Hands rejected Self's diagnosis and gave a better one.** Self had said the +blind spot was that the hold sat after the wait whose duration was the rule. +The real cause is that **no committed scenario ever let a timeout finish a +poll**: both ended their waits with a close, so the timeout governed nothing +either could observe. The fix is therefore a scenario rather than a seam +recording. `polltimeout` polls an idle runtime and measures elapsed against +what was asked, **at two values with non-overlapping bands** — 200 ms in +[180,500] and 900 ms in [880,1200] — because one value cannot tell a bridge +honouring the host's timeout from one waiting on a constant that happens to +equal it, and no constant lies in both bands. No new export, no header change, +and it works in the shipped shape. + +All three constants now die by that scenario: 100 ms, 600 ms and 2000 ms. The +600 ms case survives both older scenarios and dies to the new one, which is +the demonstration of what the old ones could not see; Hands kept it as a hand +check rather than carrying a third constant in the table. + +Also landed: Soul's closed-port probe committed as `payloadfit`, reaching the +two-phase poll in about a millisecond, where the pop-before-copy mutant +segfaults an optimised Windows build with no sanitizer, five runs of five; an +entry for the refusal of a call racing a close; an entry for the wake, which +the table had been silently failing to claim; and the seam's self-description +corrected, since a held call does leave its scope, which takes the gate, +decrements and notifies. Release shape unchanged on both targets, with no +debug exports and no assertion strings. + +**Tables now: Linux 18 killed, none surviving, none skipped, exit 0. Windows +16 killed, none surviving, two honestly skipped, exit 2.** Controls green on +both. + +**A declared equivalence, handed to Soul rather than substituted.** Changing +the close's wake-all to a wake-one survives, and Hands argues it is equivalent +rather than uncovered, because the first poller out calls wake-all under the +gate from its own scope destructor. It recorded the equivalence beside the +entry and shipped the queue-conditional wake as the loosening instead. This +campaign's fourth encounter with that defect shape, and the first where the +answer was an argued equivalence rather than a swap. + +Named limits: the 600 ms mutant lives only in the report; `payloadfit` and +`polltimeout` run only in the assertion configuration, so the pop-before-copy +kill rests on an unsanitized crash and an exit code rather than an +address-sanitizer configuration the harness still lacks. **Soul's fifth pass, 2026-09-17** (Opus). Both targets reproduced end to end +from a fresh clone at a different path. **Cut 3 still does not close, and for +the same underlying reason in a third costume: the scenario proves the wait is +not a constant, not that it is the host's.** + +- **F1, confirmed, high: an expression defeats the two-band argument.** No + constant sits in both bands, which is true and is not the rule. Any mapping + that is identity at 200 and 900 passes for free, and the late tolerance is a + flat 300 ms. Three mutants, each run through all five Windows scenarios, all + **survived all five**: clamping the wait to at most a second, adding 150 ms, + and scaling by six fifths. **The clamp is the one that matters**, because its + failure is verbatim the bug this batch claims to fix — a host asking for five + seconds gets one, forever, with nothing reporting it — and "cap the wait so + shutdown gets noticed" is the most ordinary spelling that line will ever be + given. The close is cheap: raise the long probe above any plausible ceiling, + which kills the clamp and the scale, and make the tolerance proportional + rather than flat, which kills the offset. +- **F2, confirmed, medium: a Windows clone cannot run the documented Linux + path at all.** `.gitattributes:2` is `* text=auto` with no rule for shell + scripts, so a default Windows clone writes the build script with carriage + returns and the container dies in under a second complaining about the + interpreter line. Soul hit it from a clean clone before anything else ran. + The mount fix works; this is a second, independent blocker on the same + documented path, and it fires for the likeliest newcomer. One line repairs + it. +- **F3, confirmed, low: the only non-comment source change in the range is + pinned by nothing.** Reverting the hold's new guard survived all five + scenarios, because the timeout scenario never arms the hold and the other two + never let a timeout expire, so nothing is ever in both states at once. The + seam folds away in release, so nothing shipped is at risk; it is the + recurring shape again. + +**The declared equivalence holds, and its stated reason was the weaker half.** +Narrowing the close's wake to one waiter is genuinely equivalent, reproduced. +But the equivalence rests on two premises together: the closing flag is set +permanently under the gate before the notify and appears in every waiter's +predicate, so after a close begins no poller can block at all; and each exiting +call's own destructor takes the gate, decrements and wakes everyone, cascading. +Soul then narrowed **both** wakes, which also survived and **is not equivalent +by any argument**, since a notify consumed by the closer stalls the chain. It +passes on wait-queue ordering alone. The premises belong beside the entry so +the claim is checkable rather than assertable. + +**Held:** Linux 18 killed and Windows 16 with two honest skips, both +reproduced; 600 ms dying to the new scenario and surviving the older two; +the closed-port probe reaching the two-phase poll and both pop-before-copy +entries dying on both targets; the release shape clean on both, with the new +local folding away. **The red-control path proved itself unasked** — a run +from a deep temporary path failed MSBuild's file tracker, and the harness +reported a red control with the child's output rather than banking eighteen +kills it had not earned. + +**Two record corrections.** The source digest quoted in the previous report is +checkout-dependent, because line-ending conversion changes it; Soul's clone +restored to a different one. It is not a portable identity. And the Windows +harness needs a short checkout path or the control fails on the file tracker, +which belongs where a newcomer meets it. **Fifth fix batch in Hands.** + +**The fifth fix batch landed** (Opus), `ca6c0f5..244154e`. F2: `*.sh text +eol=lf` in `.gitattributes` (`ca6c0f5`); the container line no longer picks a +shell's continuation, the Dockerfile's recipe mounts the running checkout, and +the win32-x64 short-path requirement is stated where a newcomer meets it +(`c177533`). F1: the long probe is 5000 ms and the late tolerance is +`60 + timeout/8` rather than a flat 300, which kills the clamp and the scale on +both checks and the offset on the short one; the clamp is its own entry. Stated +limit, in source beside the tolerance: **a scaling smaller than an eighth +survives** (`c682619`). F3: `holdtimeout` puts a call in both states; the +revert and the reordered-conditions loosening both die there at about 800 ms +and on nothing else (`5ab4c62`). The single-waiter equivalence now states both +premises beside the entry, and narrowing both wakes is recorded as **not yet +reached**, with why a scenario cannot force it while the first premise holds +(`b985f07`). The restore digest is printed as a restore check, not an identity +(`244154e`). Hands' numbers: win32-x64 19 killed, 2 honest skips; linux-x64 21 +killed. **Soul's sixth pass dispatched 2026-09-22** (Opus). + +**Soul's sixth pass, 2026-09-22** (Opus). Hands' table reproduced exactly from +fresh `autocrlf=true` clones: win32-x64 19 killed, 2 skips; linux-x64 21 +killed; controls green. **Cut 3 still does not close.** Every scenario so far +has a single-threaded host. + +- **N1, confirmed, medium: the wait's predicate is pinned by nothing.** Dropping + it (`wait_for(lock, ms(t)) == no_timeout`, `cultmesh_quic_native.cpp:1179-1180`) + survived the whole matrix on both targets. At the bridge, a second host thread + calling `cultmesh_quic_last_error` every 20 ms made an idle `poll(1000)` return + after 0 and 20 ms, where the real bridge stays 1000. Every `CallScope` + destructor wakes all waiters (`:286`), so a host with a poll thread and a send + thread spins at the rate of its other calls. The rule "a poll with nothing to + deliver stays for its timeout" is pinned only for a host with one thread. +- **N2, confirmed, low-medium: the stated limit understates what survives.** + Survived on both targets: `min(t,5000)`, `min(t,4990)`, `t*11/10`, `t+70`. + `max(t,220)` survived on Linux and died on Windows. `max(t,250)` and `t+80` + die only on `holdtimeout`'s 150 ms probe, by margins of 22 and 2 ms, so those + kills depend on timing. "5000 is above any plausible ceiling" is wrong, + because 5000 is itself a round ceiling, and no probe can see a floor under + about 60 ms. Either add a small-timeout probe and a probe above 5000, or state + the full limit: offsets to about 75 ms, floors to about 220 ms, and clamps at + or above about 4980 ms. +- **N3, confirmed, low-medium: the LF fix does not reach an existing clone.** + A clone made at `367c9bc` and moved to `244154e` keeps the CRLF script, since + the blob did not change. Its status is clean and it still dies on `bash\r`. + Nothing tells an existing clone to check its `*.sh` out again. +- **N4, confirmed, low (development seam): no hold mutant is a function of the + input.** `(woken || timeout_ms > 1000) && HELD` survived on both targets. + Both of Hands' hold entries only rearrange the guard's syntax. + +**Held:** F2 from a fresh clone, covering every file the container runs or +parses. F3's revert and its loosening, with only `holdtimeout` failing under the +revert. The clamp entry. Both equivalence premises, checked against source, with +"narrow both wakes" recorded as not yet reached. Restores verified by hash +against `checkout-index`. Sidecar repair after a mid-mutation `taskkill`. +`polltimeout` and `holdtimeout` stayed green for five rounds under 16 burners on +8 CPUs. **Not run:** a forced red control, and Windows under a CPU burner. +**All four go to Hands as the sixth fix batch.** + +**The sixth fix batch landed** (Opus), `b3d9cf7..ff72f16`. Details: + +- **N3 (`b3d9cf7`):** the README gives an existing clone a one-line repair beside + the container path. It is `git rm --cached -q scripts/build-quic-native.sh; + git checkout HEAD -- scripts/build-quic-native.sh`. A plain checkout keeps the + CR. The line was verified on clones made at `367c9bc` from Git Bash and from + PowerShell 5.1. +- **N2 (`37967e8`):** the timeout probes are 15, 200 and 7300 ms. The 15 ms + probe takes the fastest of ten tries, and every try is still checked for an + early return. There are new entries for a round clamp, a floor and an + offset. The limits measured on both targets are now written in source: + - `t+25` survives and `t+40` dies; + - `max(t,40)` survives and `max(t,50)` dies; + - `t*106/100` survives and `t*108/100` dies; + - `min(t,7285)` survives and `min(t,7275)` dies; + - any shortening up to 20 ms survives. + + The "above any plausible ceiling" claim is deleted. +- **N1 (`4ffa4c9`):** `pollbusy` runs a second host thread that calls into the + bridge while a poll is idle. Three entries sit on it: the revert, "reads + what woke it", and "each wake restarts the whole timeout". All three die on + `pollbusy` on both targets. +- **N4 (`ff72f16`):** `holdtimeout` makes a second held poll at 1300 ms. The + input-derived hold mutant dies there and nowhere else. +- **Recorded as not yet reached:** the loosening that checks only `closing`. + It breaks "an arriving event ends the wait early", a promise no scenario + measures. + +Hands' numbers: + +| Target | Killed | Survived | Skipped | Control | +|---|---|---|---|---| +| win32-x64 | 26 | 0 | 2 | green | +| linux-x64 | 28 | 0 | 0 | green | + +Under 16 burners on 8 CPUs, 15 of 15 rounds passed on each target. The worst +single poll was 15 ms late on Windows and 41 ms on Linux. + +**The batch added one mechanism nobody specified. Self accepted it, 2026-09-22.** +On Windows the timed scenarios raise their own process priority. Without that, +Windows under load put polls up to 127 ms late. The unmodified bridge then +failed even the pre-batch tolerance: the 150 ms hold probe came back 100–115 ms +late against 78 ms allowed. The only alternative was a flat allowance of about +150 ms, which would readmit the offsets and floors this batch exists to kill. +The priority change is test-fixture only, needs no admin rights, and changes +nothing in the bridge. Accepted, and handed to Soul to attack. +**Soul's seventh pass dispatched** (Opus). + +**Soul's seventh pass, 2026-09-22** (Opus). Reproduced from a fresh clone: + +| Target | Killed | Survived | Skipped | Control | +|---|---|---|---|---| +| win32-x64 | 26 | 0 | 2 | green | +| linux-x64 | 28 | 0 | 0 | green | + +Exit 2 on win32 is by design: it means entries were skipped +(`mutate-cultmesh.mjs:1192`). A forced red control was reported red, and the +harness ran nothing after it. Restores matched `checkout-index` by hash. N3 +holds from both shells. **The priority raise is sound.** It is scoped to the +process, which exits after each scenario, and it cannot hide a lock held +across a sleep, because every thread in the process is raised equally. +**Cut 3 still does not close.** + +- **S1, medium: N1 is not closed.** Two predicate mutants survive the full + matrix on both targets: + - **K1**, `|| ++wakes > 64`. Under a thread calling in a yield loop, an idle + `poll(1000)` returns after 0–5 ms. + - **K2**, `|| !runtime->error.empty()`. After one refused call, every later + idle poll returns at 0 ms. + + `pollbusy` covers one call kind, at one pace, on a runtime with no error + recorded. +- **S2, medium: the 15 ms probe has no early check.** The check is + `elapsed < 15 - 20`, which cannot fail. Both `t<50 ? 0 : t` and `t/16*16` + survive. +- **S3, low-medium: more derived waits survive.** Rounding up to a 40 ms + quantum survives. So does any fault that only shows after a runtime's 12th + poll, because no scenario polls a runtime more than 12 times. +- **S4, low: two stated boundaries depend on timing on Windows.** `t+25` died + in one of two repetitions. `min(t,7275)` survived in one of two. +- **S5, low:** the hold guard `timeout_ms > 1500` survives. The stated limit + should put the ceiling at 1300. + +**Self's ruling, 2026-09-22: change the method, not the probes.** This rule has +now taken seven passes. Each fix batch pinned the functions the previous Soul +named, and the next Soul found another function that equals the identity at +every probe point. A rule about the arithmetic of a derived wait cannot +converge under wall-clock observation from outside, because there is always +another function that matches at the probes. The skill already says it: put +the observation where the rule is decided. + +- **The wait.** A dev-only seam, of the same kind as the existing hold seam + and folded away in release, records the timeout the bridge actually hands to + its condition wait on every poll. A scenario asserts that it equals the + host's argument **exactly**: + - over a spread of values: 0, 1, 15, 16, 39, 40, 999, 1000, 1001, 7300, + `INT32_MAX`, and the bridge's documented maximum if it has one; + - on polls well past the 12th on a single runtime. + + Every clamp, floor, round, scale, offset and later-poll mutant then dies by + equality, deterministically, on every host, with no timing tolerance. The + wall-clock scenarios stay as proof that the recorded wait is actually waited, + with **generous** margins. The wide boundary table goes: those limits existed + only because the observation was indirect. Stated limits that are no longer + true are deleted, not kept as history in source. +- **The predicate.** A `pollhammer` scenario runs one host thread that calls + every entry point which touches the gate, in a yield loop, while another + thread holds an idle poll. It runs once on a clean runtime and once after a + refused call has recorded an error. The poll must stay for its timeout, + within a generous margin. K1, K2 and a "returns on any wake" revert must die + there. +- **The seam itself** gets a revert entry and a loosening entry: a seam that + records the argument instead of the computed wait must die. The release shape + must still fold it away. + +To Hands (Sonnet) as the seventh fix batch. + +**The seventh fix batch landed** (Sonnet), `66830e9` and `b8fad13`. + +What was added: + +- **`waitseam`** checks the wait by equality. A dev-only seam, gated like the + hold seam and folded away in release, records the timeout the bridge hands + its condition wait. The scenario asserts it equals the host's argument for + 0 to `INT32_MAX` and over 40 polls on a single runtime. For + `timeout_ms <= 0` the bridge never reaches the wait, so the scenario asserts + the seam was left untouched. That is also what kills the loosening "records + unconditionally". The bridge documents no maximum below `INT32_MAX`. +- **`pollhammer`** covers the predicate. It runs every gate-touching entry + point in a yield loop, both on a clean runtime and after a recorded error. + +What was removed: + +- the fastest-of-ten mechanism; +- the tight tolerances, replaced by one generous 800 ms margin; +- the stated-limits table; +- **the Windows priority raise.** + +Which scenario kills which mutant: + +- K1, K2 and the "returns on any wake" revert die on `pollhammer`. +- Every derived wait from passes 5 to 7 dies on `waitseam`. That includes the + quantum rounds, the small-timeout zero, doubling after the 12th poll, + `t+25` and `min(t,7275)`. All of them are now deterministic. +- S5's `>1500` hold guard dies on `holdtimeout`, with a probe at 1600 ms. +- The seam's revert and loosening die on `waitseam`. + +Harness results, with restores matching `checkout-index`: + +| Target | Killed | Survived | Skipped | Control | +|---|---|---|---|---| +| win32-x64 | 39 | 0 | 2 | green | +| linux-x64 | 41 | 0 | 0 | green | + +Stress: 5 rounds with 16 burners on each target, all green. Worst overshoot +was 325 ms on Windows and 26 ms on Linux. + +**Scar:** the stress cleanup used `taskkill /IM node.exe /T`. That killed every +Node process on the shared host. The rule now in the Eureka skill is to kill +by PID. **Soul's eighth pass dispatched** (Opus). + +**Soul's eighth pass, 2026-09-22** (Opus). Hands' numbers reproduced: 39 killed +on Windows and 41 on Linux. Restores matched `checkout-index`. A forced red +control was reported red. The seam records the same evaluation that the wait +receives, and it folds out of release: there are no debug exports, and the +release macro is plain `(timeout_ms)`. The wall-clock layer is not vacuous. It +kills every shortening, and on `pollhammer` it kills K1, K2 and Soul's new P2 +and P3. **Cut 3 still does not close.** The method moved the gaps outward. + +- **F1, medium: nothing runs the timeout rule against the release build.** + The only configuration without asserts runs `closerace` alone, and no CI + builds the bridge. The seam macro creates a release-only site at `:108`. + Mutant R1 changes the `#else` to `((timeout_ms)/10)` and survives by + construction. Run against the release build, `polltimeout`, `pollbusy` and + `pollhammer` each kill it. +- **F2, medium: the seam records the integer, not the duration handed to + `wait_for`** (`:1201-1202`). Each of these survives on both targets: + - `ms(RECORD(t)) + 600ms`; + - `max(ms(RECORD(t)), 500ms)`, which turns a 15 ms realtime poll into + 500 ms; + - a 1/909 duration ratio. + + Only lengthening survives, since the timed layer's early tolerance kills + any shortening. +- **F3, medium: the predicate is covered only on a runtime with no live + objects.** `|| !runtime->connections.empty()` survives on both targets. With + one open connection, an idle `poll(1000)` returns in 0 ms, so any host with a + connection busy-spins. +- **F4, low-medium: a zero-timeout poll is never timed.** `sleep_for(500ms)` + on `timeout_ms == 0` survives, as does a 300 ms spin. A game loop that polls + with 0 every frame would stall. No negative timeout is probed, and -1 would + collide with the seam's sentinel value. +- **F5, plausible, low:** `closerace` goes red under load on Windows in 4 of 5 + rounds. It is starved of CPU, not the bridge. It fails loud, but it makes + the control flaky. +- **F6, low:** stale prose: the 1300 ms history at `mutate-cultmesh.mjs:763`, + a scenario list missing `pollhammer`, and a header §7 intro that still says + "quiesce only". + +**Self's rulings, 2026-09-22:** + +1. **F1.** The harness gains a plain **release** configuration on both + targets. It runs `polltimeout`, `pollbusy`, `pollhammer` and the new + zero-timeout check against the release library, and R1 goes in as an + entry. The release build is the thing that ships, so a rule the release + build never runs is not pinned. +2. **F2.** The seam wraps **the whole argument to `wait_for`**, meaning the + duration expression. It records that duration's count, and `waitseam` + asserts it equals `milliseconds(host argument)`. W1, W2 and W3 go in as + entries. +3. **F3.** `pollhammer` also runs against a runtime that holds live objects: + an open connection to an unroutable address, plus a listener and a stream + where the fixture can make them. P1 goes in as an entry. +4. **F4.** Any `timeout_ms <= 0` returns within a small bound, timed with a + generous margin. A negative timeout is probed. The seam's sentinel moves to + a value that cannot collide, or becomes a separate "recorded" flag. Z1 and + Z2 go in as entries. +5. **F5.** `closerace`'s fixture gets whatever it needs to survive + starvation, such as barriers or longer windows, without weakening what it + checks. Prove it with 5 rounds under 16 burners on Windows. +6. **F6.** Fix the prose. + +**Superseded the same day, 2026-09-22, by the operator's retirement of the +mutation harness.** The operator's words: *"The manual mutation testing turned +out to be a terrible idea, lots of guarding the shape of the code instead of +the behavior. Better to have nothing than a harness that punishes +refactoring."* `scripts/mutate-cultmesh.mjs` and every committed suite are +deleted, with no fallback. Four of the six rulings above named harness entries +(R1, W1–W3, P1, Z1, Z2); those clauses are dead text. What each ruling +protected is not: + +1. **F1 stands as behaviour.** The scenarios gain a **release** configuration + on both targets, run against the release library. The release build is the + thing that ships, so a rule the release build never runs is not pinned. + Without the harness there is no R1 entry; the release path is proven by the + scenarios themselves going red when the seam's `#else` shortens the wait, + which Soul checks by hand on a scratch copy. +2. **F2 stands.** The seam wraps the whole argument to `wait_for` — the + duration expression — and `waitseam` asserts it equals + `milliseconds(host argument)`. The assertion is the pin; W1–W3 are Soul's + hand probes, not committed entries. +3. **F3 stands.** `pollhammer` also runs against a runtime holding live + objects: an open connection to an unroutable address, plus a listener and a + stream where the fixture can make them. +4. **F4 stands.** Any `timeout_ms <= 0` returns within a small bound, timed + with a generous margin. A negative timeout is probed. The seam's sentinel + moves to a value that cannot collide, or becomes a separate recorded flag. +5. **F5 stands**, and its 5 rounds under 16 burners run **on Yggdrasil**. The + burners that motivated this ruling are what froze the operator's + workstation on 2026-09-22; no CPU burner runs on Starfire again. +6. **F6 widens.** The prose fix now includes removing every reference to the + deleted harness, not only the stale 1300 ms history and the scenario list. + +**There is no mutation evidence for the bridge and there will not be one +committed.** It is C++, and no ecosystem mutation tool is wired here. The +bridge's rules are pinned by behavioural scenarios at the layer that decides +them; a mutant is a thing Soul tries by hand on a scratch copy and throws away. + +**The eighth fix batch landed** (Sonnet) at `5646ff7`, before the retirement, +and the harness deletion followed at `796433f`. Both are on +`hands/cultmath-erf`, not yet on `main`. What landed: + +- the seam wraps the whole duration handed to `wait_for`, and its "unset" + sentinel became a separate `debug_wait_recorded` flag, so a recorded `-1` + cannot read as nothing recorded; +- `pollhammer` runs against a runtime holding a live connection to an + unroutable address (RFC 5737 TEST-NET-1), a stream on it, and a real + never-connected listener; +- a `zerotimeout` scenario pins that `timeout_ms <= 0` returns within 50 ms, + probing 0, -1 and `INT32_MIN`; +- `closerace`'s settle waits for `debug_peak_calls` to reach the poller count + instead of sleeping a guessed duration; +- `kGenerousLateToleranceMs` narrows from 800 ms to 400 ms, so the wall-clock + layer catches arithmetic applied outside the seam's own argument — + `waitseam`'s equality check structurally cannot see that. + +The release configuration and the seven mutation entries (R1, W1–W3, P1, +Z1–Z2) landed **inside the harness**, and went out with it two commits later. +The scenario runner and every seam survived untouched: the README and the dev +Dockerfile now document building with `-DCULTMESH_QUIC_BUILD_TESTS=ON +-DCULTMESH_QUIC_DEBUG_ASSERTS=ON` and running each scenario as a direct +argument to the binary. **The release configuration is therefore owed again as +a plain build, not as a harness target**, and R1's substance — that the +release macro is unexercised — is a Soul hand probe now. + +**The Linux leg ran on Yggdrasil, 2026-09-22** (Sonnet), against +`hands/cultmath-erf` HEAD, in an image built from the committed +`scripts/quic-native-linux-dev.Dockerfile` (pinned `debian:13`, tagged by +content hash `cultlib-quic-native-dev:13d7fbd109fc`). No repo change was +needed and none was made. + +- **Asserts build, all ten scenarios pass**, 20 rounds each: `closerace`, + `holdclose`, `holdtimeout`, `polltimeout`, `pollbusy`, `pollhammer`, + `zerotimeout`, `payloadfit`, `latecall`, `waitseam` (11 probes, 40 repeated + polls on one runtime). +- **Release build, asserts off, all four required scenarios pass**: + `polltimeout`, `pollbusy`, `pollhammer`, `zerotimeout`. +- Worst overshoot anywhere was 4 ms, against `kGenerousLateToleranceMs` of + 400 ms. **F1 is closed on Linux**: the build that ships now runs the timeout + rule. + +**A defect in the README's own worked example, found by running it.** The +example builds the test binary and runs it directly, and every scenario dies +with `libmsquic.so.2: cannot open shared object file`. Both the bridge and the +test executable carry `INSTALL_RPATH "$ORIGIN"` and expect the MsQuic runtime +beside them in `bin/`, but nothing puts it there for a test build — only +`build-quic-native.sh`'s packaged output directory gets that copy. Hands +worked around it with a `cp` after each build and correctly did not treat it +as a bridge defect. **This is the documented path, written in `796433f` when +the harness was deleted, and it has never worked.** A documented path that +fails on first use is worse than no documentation: it was published in the +same commit that removed the working one. + +**The README's worked example was broken twice, and fixed at `5533c34`** +(Sonnet, on `hands/cultmath-erf`). + +- The loader failure above, fixed in its owner: a `POST_BUILD` step on the + test target copies `libmsquic.so.2` beside the built binaries. CMake already + receives `MSQUIC_LIB_DIR` as a required argument on Linux, so no new input, + option or script was invented — the knowledge it already had now acts + instead of sitting in prose. The `$ORIGIN` rpath is untouched. +- **A second, independent break that fires first.** The example passed + `-DMSQUIC_INCLUDE_DIR` and `-DMSQUIC_LIB_DIR` as relative paths. CMake + resolves a relative cache path against the `CMakeLists.txt` that consumes + it, not the directory `cmake` ran in, so the build failed on a missing + `msquic.h` **before the loader problem was ever reachable**. Fixed to + absolute paths with a paragraph saying why. + +So the documented path failed at its first command, not its last. It was +published in `796433f` — the commit that deleted the working path — and +nobody ran it. **The check that would have caught this is running the +documentation, which is what found it now.** Verified on Yggdrasil by +executing the README's command block literally, with no extra step: +`polltimeout` and `pollbusy` both pass, 20 rounds each. + +Structural delta: one `add_custom_command`, four lines, in the test target's +build graph. No new files, scripts, options or targets. + +**The Windows leg ran, 2026-09-22** (Sonnet), and found the same class of +defect as Linux in a far worse form. Committed at `f3aae70`. + +**The scenarios were passing against the wrong MsQuic.** The bridge imports +`msquic.dll` by name. Neither `build-quic-native.ps1` nor CMake ever copied +the pinned library beside the test binary in the build tree — only into the +packaged output directory, which a test build never produces. Linux failed +loudly here (`cannot open shared object file`). **Windows did not fail at +all**: DLL search fell through to `PATH` and loaded an unrelated `msquic.dll` +from the Windows Performance Toolkit — 529,480 bytes, SHA `B2B7FD2D…` — +instead of the pinned `Microsoft.Native.Quic.MsQuic.OpenSSL` 2.5.9 build at +4,181,856 bytes, SHA `C17C6581…`. Every asserts scenario passed on the first +run against that binary with nothing indicating anything was wrong. + +This is the doctrine's own trap: a stale asset impersonating logic, and the +green result was the thing hiding it. Fixed by mirroring `5533c34`'s Linux +`POST_BUILD` copy on the Windows side, taking `msquic.dll` from +`MSQUIC_ROOT/bin/x64`. Both test build directories now carry the pinned +library at the right size and SHA, and every result below is from a rerun +after the fix. + +**Open question, not yet answered: how far back does this reach?** Every +earlier Windows scenario and mutation number in this campaign was produced on +this machine, and the copy has never existed. If the harness did not place the +pinned DLL itself, then Windows figures recorded in earlier passes — including +the 39-killed count — were measured against whatever `msquic.dll` happened to +be on `PATH`. **Nothing here re-proves those numbers.** They should be treated +as unconfirmed until someone checks whether the deleted harness copied the +library, and re-runs them if it did not. + +**Asserts build** (`Debug`, tests on, asserts on), nine scenarios, all pass: +`polltimeout` (worst overshoot 31 ms), `pollbusy` (17 ms), `pollhammer`, +`zerotimeout` (3 probes), `payloadfit`, `holdclose` (20×256 pollers), +`latecall`, `holdtimeout` (63 ms), `waitseam` (11 probes, 40 repeated polls). +Every overshoot is far inside the 400 ms tolerance and nothing was weakened. + +**Release build** (asserts off): `polltimeout` (20 ms), `pollbusy` (24 ms), +`pollhammer`, `zerotimeout`, and `payloadfit` as a bonus — all pass. **F1 is +now closed on both platforms.** `holdclose` refuses to run there with +*"needs the development seam"*, which is useful evidence in itself: it proves +the release build's asserts are genuinely compiled out rather than merely +untested. + +`closerace` was **not run**. It is the sixteen-burner stress, which stays an +operator fork. + +**A documentation gap, not a wrong instruction.** The README's Windows section +documents only the plain library build and carries no worked test-build +recipe, where the Linux section has one. Hands followed the brief's flags +because nothing better existed. That gap is why the missing DLL copy went +unnoticed for so long: there was no documented Windows path to run, and so +nobody ran one. + +### Cut 3 closed, 2026-09-23 + +StreamPixels is the priority now, and this is the first cut on its path. +The operator named it the week's goal: *"We needed to get to the StreamPixels +cut this week. We need that TO EAT."* + +- **Windows release configuration** (Sonnet, `quic-cut3-winrel`, no repo + change). This is a plain release build, asserts off, of the four required + scenarios, 20 rounds each: all pass, worst overshoot 16 ms against 400 ms. + The `msquic.dll` beside the binary is 4,181,856 bytes, SHA-256 `C17C6581…`, + which matches `build-quic-native.ps1`'s pin for the OpenSSL 2.5.9 runtime, + so the silent wrong-DLL load did not happen again. **F1 is closed on both + platforms.** Documentation gap: the README has no Windows test-build + CMake line; Hands mirrored the Linux one. +- **F5, operator fork ruled:** *"Feel free to set Starfire on fire, I'll step + away. If I know it's coming, it's not so bad."* Load on Starfire is allowed + when the operator is told first and nothing else runs alongside it. + - **Linux** (Yggdrasil, 16 burners on a 4-CPU cap, asserts on, `cc71f17`): + `closerace` 5 rounds of `20x256`, all pass. Earlier text in this map + records `20×512`; these rounds ran the binary's default size. + - **Windows, first run** (Starfire, 16 burners on 8 logical CPUs, asserts + on): **5 of 5 fail**, every one with *"256 of 256 pollers returned before + the close began, so they were never in the race"*. **This was not a + bridge defect. The fixture contradicted itself.** Under the debug seam, + the settle waited up to 30 s for every poller to be counted inside, while + each poller's wait timed out after `kPollTimeoutMs` = 5 s. Under + starvation, the early pollers left before the late ones were counted. The + bridge neither crashed nor asserted. + - **Fixture fix** `44ab376` (Sonnet): the settle budget is named, and + `kPollTimeoutMs` is derived as that budget plus 5 s in both + configurations. A deadline that expires now reports *"fixture could not + settle"* instead of blaming the pollers. The new message was reached only + by forcing the branch; under load on either platform, the counted + deadline never expired naturally. `HoldCloseOnce`, `LateCallOnce` and + `HoldTimeoutOnce` share the settle idiom but not the defect, because their + pollers are held at a barrier and cannot time out during it. + - **Windows rerun at `44ab376`:** `closerace 20x256: ok` in all 5 rounds + under 16 burners. A direct run confirmed exit code 0, because the runner + script lost the exit codes (`Start-Process -NoNewWindow` with redirected + output). The Linux rerun at the same commit: all ten scenarios pass, and + `closerace` passes 5 of 5 under 16 burners. **F5 is closed on both + platforms.** +- **Recorded, not blocking:** whether Windows numbers from before today were + measured against the pinned MsQuic stays unconfirmed. Today's were. + +Cut 3's work lives on `hands/cultmath-erf` plus `quic-cut3-winrel`, and +neither is merged to `main`. Cut 4 branches from `cc71f17`. + +### Cut 4, 2026-09-23: landed, gated, fix batch 1, confirming pass running + +**Landed** (Sonnet, 12 commits, `cc71f17..c57b613` on `quic-cut4`): the koffi +binding, consumer, session manager and trust. It reported 109/109 on Yggdrasil. +The interop lane was reported as an operator fork (EHOSTUNREACH). **Scars from +this landing:** +- A test helper leaked a runtime handle. It left a verify job idle at 0% CPU + for 25 minutes, and the agent waiting on it never woke. Self found the hang + with a SIGUSR2 diagnostic report: the event loop was idle with only + unreferenced handles. The fix at the owner: `ygg-verify.sh` gained a watchdog + (Eureka `9359e9c`). The first watchdog leaked the slot lock to its own + `sleep` child and held two slots for an hour; fixed at `dbe594e`. +- The agent ran past 550k tokens of context and was retired for a fresh one. + Its cut came in at +2,061 lines against an estimate of about 1,300. + +**Soul gate (Opus): Cut 5 may not build on this.** Confirmed by executed probes: +- A malformed frame from a peer killed the whole process (an unhandled + rejection in the pump). C# faults only that connection. +- `release()` was a use-after-free: it closed the runtime while a + `nextEvent.async` call was queued but not started. Exit 134 under + thread-pool saturation with `MALLOC_PERTURB_`. +- A peer shutdown leaked a runtime reference, and pending receives hung + forever. +- The session manager never went offline on transport death (C# + `InvalidateRealtimeSession`), and had no disposed guard or single-flight. +- The race waited on `allSettled`, so one dead route cost about 10 s. C# + returns the first success. +- `streamKinds` and the receive queue grew without bound, with no latest-only + coalescing as in C#'s inbox. +- The types said `bigint` while koffi struct members returned `number`, so + the canceled-send check was dead code. +- Eight spec rules had no killing test (M2–M4, M6–M10), and M1 was killed + only by a hang. + +**The interop "fork" was not a network problem.** Self's IPv6 hypothesis was +refuted: IPv6 was enabled and `--network host` failed identically. The probe's +first explanation, that an AF_INET socket ignores v4-mapped traffic, was also +wrong: ECONNREFUSED meant nothing was listening. The executed cause: +- the harness spawns peers with `stdio: ["ignore", ...]`, and the C# serve loop + stops on stdin EOF, so the listener tore itself down at once; +- the serve mode broadcast without waiting for a client; +- .NET in the image could not find `libmsquic`. + +**Fix batch 1** (fresh Sonnet, `c57b613..8e32bff`): +- 125/125 pass. **The C# managed provider to TS consumer lane passes**, + separate processes, on Linux. +- Kills are confirmed for reverted fixes 1 and 3–6. **Not proven by + execution:** the `release()` ordering fix (checked by reading only) and + kills for Soul's M2–M10. +- **The cut grew by about +906 net instead of shrinking.** Hands declined the + subtraction item on its own authority, arguing that `NativeBindings` is the + only static typing over koffi. `realtime-quic.ts` is 849 lines, against an + estimate of about 650 across Cuts 4 and 5 combined. +- Fix 7 coerces u64 struct members from `number`, which is lossy above 2^53. + +A confirming Soul pass (Opus) is rerunning the crash reproductions and M1–M10, +checking the 2^53 exposure, and judging the subtraction. **Cut 5 started in +parallel** on `quic-cut5` from `8e32bff`, to save wall-clock time. If Soul +finds defects, Cut 5 rebases onto their fixes. + +### Cut 4 confirmed, fix batch 2, Cut 5 landed, retention (StreamPixels Cut C), 2026-09-23 + +- **Cut 4 confirming Soul pass (Opus):** the core fixes hold under abuse. + - The `release()` use-after-free survives 300 cycles with the thread pool + saturated and `MALLOC_PERTURB_`. The old order dumps core. + - Malformed frames fault only their own connection. + - Racing and coalescing match C#. + - koffi returns `bigint` above 2^53, so there is no precision loss. + - It found that a throwing `onDisposed` handler killed the process or + leaked a ref, and that several fixes had no killing test. +- **Cut 5 landed** (Sonnet, `8e32bff..fd2a701`): the TS provider. **All four + lanes pass on Windows, including TS provider to the C# native connector, + the Unity overlay's path.** Linux: 3 lanes pass and 1 skips (Windows-only). +- **Fix batch 2** (Sonnet, `fd2a701..275010a`): + - Handler isolation, a use-after-free regression test (reverted order + crashes), 18 mutations killed, two further leaks fixed, and the root + lockfile fixed (`npm ci` works; this unblocked the StreamPixels deploy). + 146/146 on both hosts. + - **Scar:** this agent ran to about 800k tokens over 2.6 h because Self + packed ten items, subtraction, two hosts and a late addition into one + brief. Fix batches are split per file from here on. + - Subtraction missed: net +39 against Soul's −130..−150 estimate. The + `NativeBindings` collapse moved code rather than deleting it. +- **Retention** (StreamPixels Cut C, operator OQ1 = A; Sonnet, + `275010a..8cf89a7` on `quic-retention`): the provider retains the newest + latest-only frame per `(channel, body)` and seeds each new peer before it + joins, in TS (+12 lines) and C# (+36, seeding under the same lock as the + add). A late-joining C# native connector receives the retained frame on + Windows. Both runtimes' mutations are killed. + +**Soul gate on Cut 5 plus fix batch 2 (Opus): do not merge toward +StreamPixels.** Executed probes found: +1. **Critical: every provider peer is evicted at `handshakeTimeoutMs`.** A + handler swap meant CONNECTED was never recorded. No test lived past 10 s. +2. **Critical: `koffi.alloc` is never freed.** About 53 B per native call, + about 36 MB a day idle, and gigabytes a day under load. +3. **High for StreamPixels:** no chain-validated no-pin connect path exists in + the C# native connector or the bridge. The operator therefore ruled a + **pinned, long-lived self-signed certificate** (StreamPixels map, section + 7), so no bridge change is needed. +4. **High: client frames pile up unboundedly** in the provider's + `readyFrames`. C#'s inbox coalesces. +5. **Medium:** one invalid frame evicts every peer while `broadcast` reports + success. +6. **Medium:** `advertisedEndpoint` cannot describe a public host. +7. **Low:** `receive(abortedSignal)` never settles. +8. **Plausible:** the consumer-side native event queue is unbounded when + Unity stops polling. +9. **Hygiene:** under M2 the provider test file hangs for 234 s. + +Held: stalled peers never block latest-only `broadcast` (about 2 µs per +call), per-peer memory is bounded by the key count, 20k churn cycles return to +baseline apart from the koffi leak, eviction racing with dispose is clean, and +wire parity at maximum sizes is byte-identical. Lane 2's golden check is not +tautological. + +In the mutation matrix, Hands' 18 are killed. Surviving provider mutants: P3 +(send-failure eviction), P4 and P8 (two claimed fixes with no killing test), +P10b (`onFault` isolation), and the dispose and resurrection guards. + +**Fixes in flight, split per file:** +- **3a** (`realtime-quic.ts`, on `quic-retention`): synchronous accept via + `retain()`, which deletes the async-accept window and its guards and fixes + finding 1 structurally; encode once in `broadcast`; an `advertisedHost` + option; `receive(aborted)`; tests for P3, P8 and P10b; hygiene. +- **3c** (`realtime-quic-native.ts`, on `quic-koffi-leak`): allocate once, free + on close, and a steady-state RSS test. +- **3b** follows 3a: one inbox shaped like C#'s `CultMeshRealtimeInbox` across + the transport, provider fan-in and outbox, fixing finding 4. + +**Cut 1 Soul findings, 2026-09-16.** Held: every test count, both negative +greps, all twelve mutations rerun and killed, the control catching a +truncated write, the equivalent mutant confirmed (Node 24 WebCrypto refuses +every non-64-byte P1363 signature tried, across forty keys), the separator +byte matching C#, and the TypeScript-signs-C#-verifies direction proven by +a probe over adversarial inputs, which nothing in the repo yet pins. Found: + +- **The mutation runner leaves the last mutant compiled in `dist/`**, which + is git-ignored, and the browser tests then pass against it. A stale asset + impersonating logic, the doctrine's own trap. Medium. +- **The C# half of the vector check never runs in CI.** The only `dotnet + test` of that project is filtered to one lease test; a C# transcript + change would leave the committed vector self-consistent and nothing red. + Medium. +- **`verifyP256` fails closed on Node `Buffer` inputs**: `.slice().buffer` + on a pooled buffer is the whole pool. Internal callers allocate their own + bytes, so it is safe today and wrong for the Cut 4 consumer. Medium. +- **The `protocolIds` sort is untested**: the vector's ids were written + sorted, so removing the sort survives. Low-medium. +- **Four edge divergences from the C# rules**: an empty signature is + "unsigned" in C# and "invalid" in TypeScript; C#'s loopback set is wider + (`127.0.0.2`, and the TypeScript test pinned the narrower answer); root + lookup and validity window check in opposite orders; duplicate root key + ids throw in C# and take-first in TypeScript. All aligned to C# in the fix + batch. +- **The negative grep pins names, not structure**: a local shim under + another name passed every browser test and both greps. A guard-strength + note, recorded. +- **A killed runner leaves the mutant in the tree**; a sidecar restore is + added, as Epiphany's harness has. +- **`cultmesh-ts` resolves modules with `moduleResolution: "Node"`**, which + ignores `exports`, so `cultnet-ts/authority` is unresolvable from that + package until Cut 4 changes it; the root re-export covers it today. + +**The Cut 1 fix batch landed** at `c2ffc32` (`verifyP256` copies its bytes; +empty or whitespace signature is unsigned; root lookup before the validity +window; duplicate root key ids refuse at first use; the loopback set is +C#'s, probed through the public policy: `127.0.0.0/8` in any spelling +`URL` normalises, `::1`, the IPv4-mapped `::ffff:7f00:1`, `localhost`, +`loopback`; `localhost.`, `0.0.0.0`, `::` and `::ffff:127.0.0.2` are not), +`1590145` (`scripts/sign-cultmesh-authority-vectors.mjs` writes +`contracts/cultmesh/authority-route-vectors.ts-signed.json` over adversarial +inputs and a C# test verifies it; a one-character change to the committed +signature fails that test), `cf1203a` (`cultmesh-portability.yml` runs +`dotnet test --filter AuthorityProof` on both OSes on every push; the +interop workflow was Windows-only and main-only) and `0e4f479` (the runner +rebuilds `dist/` after the final restore and asserts a sentinel from the +restored source; a sidecar of the original bytes is written first and +repaired from at the next start). Twenty mutations, twenty killed. Tests +74, 17, 10; closure smoke four tarballs. + +Scars from the batch: **the runner's two multi-line anchors matched nothing +on a CRLF checkout** (the tree is `autocrlf=true`, HEAD is LF, the anchors +were `\n`), so the runner would have thrown at those entries; the earlier +"killed" claims for the transcript-order and nonce mutations came from an +LF-on-disk state. Anchors are now normalised to the file's EOL. Fixes 1 and +2 share one commit because Hands had made both before committing. +**Still open after the batch:** the browser client's local-development +short-circuit at `packages/cultmesh-browser/src/index.ts:915` tests +`!route.certificate` where the shared verifier now treats an empty +signature as unsigned, so such a route passes the verifier and is then +asked for a provider proof, where C# would not ask. **Landed** at `a801e0a`: +`isUnsignedCertificate` is exported from the shared module and used by the +verifier and the browser's session check, with a browser test for the +blank-signature loopback route, the signed loopback route that still needs +a proof, and the blank-signature remote refused in both modes. Twenty-one +mutations, twenty-one killed. Tests 74, 18, 10. + +**Second Soul pass, 2026-09-16.** Held: byte copy, root before window, duplicate +root ids refusing on the unsigned path in either insertion order, the sort +pinned, the U+001F separator on both sides, 33 of 39 field tampers failing the +C# test with the survivors explained, the runner repairing itself after a +SIGKILL and leaving `dist/` free of every mutant string, all 21 anchors +matching once on both LF and CRLF copies, and every test and grep. Cut 1 +closes on its stated invariants. Four edge divergences from the C# rules +remain, with one guard gap, to be fixed before Cut 4 makes a non-C# signer +real (in Hands): + +- **`isLoopbackEndpoint` is not `Uri.IsLoopback`**: 15 of 90 probed + endpoints disagree. Seven are reachable and TS-wider (a trailing dot on + the host, `ws:` without `//`, a backslash separator, fullwidth characters, + a tab), because `URL` normalises what C# refuses; eight are C#-wider and + unreachable in the browser (zone ids the `URL` parser throws on, + `file:`/`mailto:` schemes the filter drops). The doc comment claimed + equivalence. Low: local-development only. +- **`trim()` is not `char.IsWhiteSpace`** at U+0085 (C# whitespace, TS not) + and U+FEFF (TS trims, C# does not), so a signature of either is + "unsigned" on one side and "signed" on the other; both are carriable on + the rendezvous wire. Low, fail-open only where an absent certificate is + already accepted. +- **C# cleans the route before the transcript and TS transcribes raw**: + duplicate or padded protocol ids, padded generation and padded key ids + verify in C# and refuse in TS, and an absent protocol list gets a default + in TS and `""` in C#. Latent while every signer is C#; live at the first + TS signer. Low-medium. +- **Two C# refusals collapse into one TS message** (not base64; not P1363). + Low. +- **A local `=== ""` shim beside the shared call in the browser survives + every test**, because no browser test uses a whitespace signature; the + name grep is silent by construction. Low-medium. +- **No workflow runs the `cultnet-ts` tests on Linux**, and the interop + workflow is Windows-only and main-only; on a `codex/**` push only the C# + half of the vector check runs. Low. +- Recorded, not a defect: the TS-signed vector is not reproducible + byte-for-byte (random `k`); the C# test pins that the committed bytes + verify under current rules, and the TS test pins that the committed file + verifies under the current module. + +**The edge-alignment batch landed** (Opus) at `e67e695` (C#'s whitespace +set through three named helpers; the two signature refusals split to C#'s +texts), `c4c2330` (route fields cleaned before the transcript as the C# +constructors clean them: trim, drop blanks, distinct, sort; generation and +key ids trimmed; a null or empty protocol list transcribes as `""`, and the +TS default that wrote bytes the reference never writes is gone; `verseId` +deliberately raw, because `CanonicalRoute` passes it raw), `803ee12` (a +raw-endpoint pre-check refusing the spellings WHATWG `URL` repairs and +`System.Uri` does not; loopback disagreements 15 → 6, all six documented +unreachable), `dfe582e` (the browser's local reading of "unsigned" killed +by a whitespace-signature session test; the runner mutates the browser +target too, with per-target sidecar, control, sentinel and post-restore +assertion) and `0dfef0e` (the TypeScript authority tests in CI on both +operating systems). Soul's probes rerun: 88 endpoints, zero reachable +disagreements; 34 code points, zero; five signature shapes, byte-identical +messages; fifteen field tampers, zero mismatches against C#'s answers. +Tests 77, 18, 79, 10; closure smoke four tarballs; 33 shared and one +browser mutation killed. + +Two scars from the batch, both recorded because they are the kind a +postmortem should carry: **the runner's sidecar bit twice**, a throw inside +the mutation loop leaving it behind so the next run "repaired" from stale +bytes and silently reverted two fixes Hands had just made (the sidecar is +now removed in the `finally` immediately after the verified restore); and +**a literal NUL byte was committed inside a regex** at `803ee12`, which made +git classify the file as binary, stop normalising its line endings, and +diff the whole file as a rewrite, escaped at `dfe582e`. Residuals named, +not guessed at: `isProtectedEndpoint` did not get the pre-check and no +probe covers protected-scheme spellings; a negative priority throws in C# +and transcribes in TS, unreachable while only C# signs; two browser +mutations survive because the verifier refuses those routes first. + +**Third Soul pass, closing.** Held: all 34 whitespace code points in the +browser path too, with C#'s `VerifySessionProof` answer as the +expectation; the three signature refusals byte-identical; cleaning parity +in both directions with fresh keys (nine of nine each way, a padded +`verseId` refused cross-wise, C# confirmed not to trim it); 88 loopback +spellings with only the documented unreachable disagreements; the runner's +control writing through the same path as its mutations; CI's job, matrix, +triggers and setup order as promised; every suite, the closure smoke, both +greps. **Cut 1 is closed; Cut 2 may start.** Three residuals go with Cut 2's +Hands pass: + +- **`isProtectedEndpoint` lacks the raw-shape pre-check** that + `isLoopbackEndpoint` got, so eleven spellings C# refuses as unparseable + are accepted and dialled after repair by `URL`. A trusted signer would + have to emit a malformed endpoint, so security holds and the parity + invariant does not. Five lines. Low-medium. +- **A literal U+001F byte sits in the separator string** in source and + twice in the tests, where C# spells it ``; git does not treat it as + binary, but any editor that strips C0 controls changes every signature + with no visible diff. The NUL scar one rank lower. +- **The sidecar footgun is narrowed, not removed**: a SIGKILL still leaves + it, and an edit made before the next run is overwritten by the repair. + Repair must refuse when the file matches neither the sidecar nor the + mutant. + +Two corrections to this map's own record of the batch: **the NUL scar was +overstated**, since the byte sat past git's binary sniff and no whole-file +rewrite exists in history, only the normalisation path saw it and the blob +was LF-only anyway; and **CI was not green throughout the batch**, two of +its commits failing an unrelated Eve checkpoint job before the authority +steps existed, green from `0dfef0e`. + +Seen by Hands, recorded for section 15: `packages/cultnet-ts/src/generated/swarm-contracts.generated.ts` +is rewritten with LF by every build while the tree is `autocrlf=true`, so +it shows modified with zero content diff after any build; the generator's +line endings and the repo's normalisation disagree, and every pass discards +the churn by hand. + +Anchor: repo `F:\Projects\CultLib`, branch `main`, HEAD +`8d8ad568aa280bac34bf123503a9e38c175eb558`. The three commits since the +original anchor `f2cd2eb4` (`bf9f6f7`, `3c29fc9`, `8d8ad56`) touch only this +document `(probe: git log --stat)`, so every `file:line` below, read against +`f2cd2eb4`, is still exact at `8d8ad568`. If HEAD moves, re-anchor before +cutting. + +How to read this document: section 1 prices the largest liability first, as +the target requires, because if that price had turned out to dominate the +campaign, the cut order below would have been wrong. Section 2 is the probe +ledger; every mechanism claim in this map carries `(probe)` when it was +established by running something, or `(source read)` when it was established +by reading a file at a named line. Nothing is claimed from a package name or a +README. Section 3 is the consumer audit. Section 4 names rejected options and +why. Section 5 is the authority map for every ownership change. Sections 6-12 +are the cuts. Section 13 holds the operator questions; section 14 the +subtraction estimate; section 15 what could not be assigned. + +Two corrections to the target, recorded here rather than silently absorbed: + +- The target cites `src/GameCult.Mesh.Quic/CultMeshRealtimeTransports.cs`. + That file is `src/GameCult.Mesh.Quic/CultMeshQuicRealtimeTransport.cs` + (674 lines). `CultMeshRealtimeTransports.cs` exists, but in + `src/GameCult.Mesh/`, and holds the transport-neutral contracts + (`CultMeshRealtimeDelivery` at :8-13, `CultMeshRealtimeFrame` at :19-44, + `ICultMeshRealtimeTransport` at :46-52, + `ICultMeshRealtimeTransportConnector` at :55-63) `(source read)`. +- This map's first issue attributed the phrase "shipped through a registry" + to the target. The target contains no such phrase and no word "registry" + `(probe: rg)`; the reading was the map's, and it is withdrawn. What is + true: today only `@gamecult/cultcache-ts` has a registry publish job + (`.github/workflows/publish-packages.yml:20-24`, `:40-76`); `cultnet-ts`, + `cultmesh-ts` and `cultmesh-browser` have none, and every external consumer + reaches them by `file:` path (section 3). Q5 was ruled C on that Body: no + registry in this campaign, publication parked. + +## 1. The largest liability, priced first + +The target's biggest new surface is CultLib owning native MsQuic bindings for +Node on two platforms. The price depends on three things: what Node itself +offers, what the repo already owns, and how a native artifact reaches a +consumer host without a toolchain. Each was probed. + +### 1.1 What Node offers + +- Node `v24.15.0` on Starfire has no `node:quic`, with or without + `--experimental-quic` (`ERR_UNKNOWN_BUILTIN_MODULE`), and its internal + binding table has no `quic` entry (`No such binding: quic` under + `--expose-internals`). `process.versions` reports `openssl 3.5.5`, no + `ngtcp2`, no `nghttp3`, `napi 10` `(probe)`. Yggdrasil runs Node `24.14.1` + from NodeSource (`F:\Projects\gamecult-ops\inventory.md:660`) `(source read)`, + so the same absence holds on the deploy host. +- Conclusion: there is no first-party QUIC in this Node line. Anything that + works is native. + +### 1.2 What the repo already owns + +- `native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp` (440 lines) is a + CultLib-owned C ABI over MsQuic: `cultmesh_quic_open/state/poll/error/close` + (`:309-440`). It negotiates ALPN `cultmesh-state-v1` (`:32`, `:341-344`), + uses deferred certificate validation and answers the pin decision through + `ConnectionCertificateValidationComplete` (`:239-263`), reassembles the + 1-byte-kind plus 4-byte-LE-length QUIC stream framing (`:123-157`), and + queues whole encoded frames for a polling host (`:400-418`). It is Windows + desktop only by construction: ``, ``, `` + (`:1-3`), `CryptHashCertificate2` for the pin (`:184-200`), + `__declspec` exports (`:18-22`), and the CMake build refuses non-Windows + (`CMakeLists.txt:4-6`) `(source read)`. +- The bridge is consumed by the Unity connector through `DllImport` of library + name `gamecult_mesh_quic_native` + (`src/GameCult.Mesh.Quic.Native/CultMeshNativeQuicRealtimeTransport.cs:259-277`), + which polls every 2 ms by default (`:14`, `:167-203`) `(source read)`. The + built DLL and `msquic.dll` 2.5.9 are committed at + `unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/` (last rebuilt in + `a0813c6`, 2026-09-14) `(probe: git log)`. +- The Windows build is scripted and pinned: `scripts/build-quic-native.ps1` + downloads `Microsoft.Native.Quic.MsQuic.Schannel` `2.5.9` by URL, checks its + SHA-256 (`:13-14`, `:27-41`), and builds with CMake `-A x64` (`:48-52`). + The last build on this machine used Visual Studio 17 2022 Build Tools, MSVC + 14.44 (`artifacts/quic-native-build/x64/Release/CMakeCache.txt`) `(probe)`. + `cl.exe` is not on PATH but Build Tools are installed, so the existing + script works here as-is. +- `tests/GameCult.Mesh.Quic.Native.Tests/GameCult.Mesh.Quic.Native.Tests.csproj:20-29` + builds that bridge before the test build and copies it beside the test + output `(source read)`. `scripts/build-unity-package.ps1:80-82`, `:143-147` + builds it again for the Unity package `(source read)`. + +Conclusion: CultLib already owns the MsQuic body for one platform, one role +(client), and one host (Unity). The cost of the target is extending that body +to a second role (provider), a second platform (Linux x64), and a second host +(Node), not creating a body from nothing. + +### 1.3 How Node loads it + +The decisive probe: from Node 24.15.0, with `koffi@3.3.0` installed into the +scratchpad, `koffi.load` loaded the committed `msquic.dll` then +`gamecult_mesh_quic_native.dll`, bound the five v1 exports by C prototype, +called `cultmesh_quic_open("127.0.0.1", 9, <64 zero hex>)` which returned `0` +with a non-null handle, observed `cultmesh_quic_state` move from `Connecting` +to `Failed` after 34 ms, read the bridge's structured error string through +`cultmesh_quic_error` ("shut down by the transport (status=0xFFFFFFFF800704D0, +error=0x1, msquic=F:\...\msquic.dll, events=event=1)"), got `-2` from +`cultmesh_quic_poll` on a failed client, and closed cleanly `(probe: +scratchpad/koffi-probe/probe.js)`. MsQuic ran its worker threads inside the +Node process and the poll model crossed the boundary without any callback +into JS. + +What that proves and what it does not: + +- Proves: the existing CultLib C ABI is directly loadable and drivable from + the Node line in question with no addon build, no Node headers, no MSVC at + install time, and no per-Node-version artifact. The `.async` call form + exists on bound functions (`typeof state.async === "function"`), which is + the mechanism for a blocking wait off the JS thread `(probe)`. +- Does not prove: a QUIC handshake succeeded (port 9 was intentionally dead); + that the provider role works (the bridge has none); that Linux works (the + bridge is Windows-only). Those are cut deliverables, not probe results. + +koffi facts used by the design, from its shipped documentation, not from +memory: JS callbacks always run on the main thread and calls from other +threads are queued to it, with an explicit deadlock warning if the main thread +blocks on a secondary thread (`node_modules/koffi/doc/callbacks.md:166-176`); +asynchronous calls run on a worker pool sized to the core count with a default +cap of 256 queued calls (`doc/misc.md:26`, `:37`); prebuilt binaries ship for +Windows x64 and Linux/glibc x64 among others, Node >= 16, no compiler needed +(`doc/index.md:17-38`) `(source read)`. Package weight: 1,713,562 bytes +unpacked, 87 files, MIT `(probe: npm view)`. The design below uses no JS +callbacks at all; the only crossing is one blocking `next_event` wait per +runtime issued through `.async`, so the deadlock class in `callbacks.md:176` +cannot occur. + +### 1.4 How it reaches Linux + +- `libmsquic` is published by Microsoft for Debian 13 (trixie) at + `packages.microsoft.com/debian/13/prod`, versions including `2.5.9` + (`pool/main/libm/libmsquic/libmsquic_2.5.9_amd64.deb`, 2,906,420 bytes, + SHA-256 `1baa61ade0b7b4a99f6dcb6b00d9aedb12b5566d00918a325be7425e878e51ba`, + `Depends: libssl3t64, libnuma1, libxdp1, libnl-route-3-200`) `(probe)`. + Yggdrasil is Debian 13 (`gamecult-ops/inventory.md:356`) `(source read)`. + The same `2.5.9` pinned for Windows exists for the deploy host. +- The NuGet packages carry Windows binaries only: `Microsoft.Native.Quic.MsQuic.OpenSSL` + 2.5.9 contains `bin/{x64,x86,arm64}/msquic.dll`, `lib/*/msquic.lib`, + and headers `msquic.h`, `msquicp.h`, `msquic_winuser.h`; no `.so`, no + `msquic_posix.h` `(probe: nupkg listing)`. The Linux build needs + `msquic.h`, `msquic_posix.h`, `quic_sal_stub.h` from the msquic source + tree at tag `v2.5.9`; all three are fetchable at + `raw.githubusercontent.com/microsoft/msquic/v2.5.9/src/inc/` (HTTP 200, + 79,280 / 17,909 / 4,731 bytes) `(probe)`. GitHub releases `v2.5.9` carry only + `*_test.zip` bundles; `v2.5.11`, `v2.6.1` carry no assets `(probe)`, so the + deb is the only distribution-grade Linux runtime for this version. +- Build host for Linux: Docker Desktop on Starfire runs a `linux/amd64` engine + `(probe: docker version)`, so a `debian:13` container is a Linux build host + for the development loop. The release artifact must come from a Linux host + the deploy path trusts: Yggdrasil itself, or a CI runner. Q6. +- Windows toolchain: MSVC Build Tools 2022 present; CMake 4.3.2; also a MinGW + gcc from StrawberryPerl on PATH `(probe)`. The map keeps MSVC for Windows + because the committed Unity DLL is built with MSVC `/Brepro` for + reproducibility (`CMakeLists.txt:17-19`) `(source read)`; mixing toolchains + for one DLL is a liability with no capability behind it. + +### 1.5 Price verdict + +The binding does not dominate the campaign. The C body exists; the Node load +path is proven with one 1.7 MB MIT dependency and zero addon tooling; the +Linux runtime is a pinned distro package on the exact target OS; the Windows +build is already scripted. The real cost is the C++ rewrite from a +client-only, Windows-only, per-client poll bridge to a runtime-neutral, +two-role event bridge (section 8), estimated at roughly 1,000 lines of C++ +replacing 440, plus a Linux build script and CI job. That is one cut, not the +campaign. + +What would have changed this verdict: if the bridge had needed JS callbacks +from MsQuic worker threads (it does not; the wait/event model avoids them), or +if `libmsquic` had not been available for Debian 13 at the pinned version (it +is), or if the FFI load had failed on Node 24 (it did not). + +## 2. Probe ledger + +| # | Claim | Method | Evidence | +| --- | --- | --- | --- | +| P1 | Node 24.15.0 has no `node:quic` and no internal quic binding | probe | `require('node:quic')` -> `ERR_UNKNOWN_BUILTIN_MODULE` with and without `--experimental-quic`; `--expose-internals` -> `No such binding: quic`; `process.versions.ngtcp2 === undefined` | +| P2 | The committed CultLib MsQuic bridge loads and runs from Node 24 via koffi | probe | `scratchpad/koffi-probe/probe.js`: open rc 0, state 2 after 34 ms, structured error string, poll -2, clean close | +| P3 | koffi ships Windows x64 and Linux glibc x64 prebuilds, needs no compiler, Node >= 16 | source read | `koffi/doc/index.md:17-38` | +| P4 | koffi async calls run on a worker pool; JS callbacks only on the main thread | source read | `koffi/doc/misc.md:26,37`; `koffi/doc/callbacks.md:166-176` | +| P5 | koffi is 1.7 MB unpacked, MIT | probe | `npm view koffi dist.unpackedSize dist.fileCount`; `package.json:27` | +| P6 | MSVC Build Tools 2022 (14.44) and CMake 4.3.2 are present; the last bridge build used them | probe | `artifacts/quic-native-build/x64/Release/CMakeCache.txt`; `cmake --version` | +| P7 | `libmsquic 2.5.9` exists for Debian 13 amd64 with its SHA-256 and dependency set | probe | `packages.microsoft.com/debian/13/prod/dists/trixie/main/binary-amd64/Packages` | +| P8 | Yggdrasil is Debian 13 with Node 24.14.1 from NodeSource | source read | `gamecult-ops/inventory.md:356`, `:660` | +| P9 | MsQuic NuGet OpenSSL 2.5.9 carries no Linux binary or posix header | probe | nupkg listing | +| P10 | MsQuic POSIX headers are fetchable at tag v2.5.9 | probe | HTTP 200 for `msquic.h`, `msquic_posix.h`, `quic_sal_stub.h`, `msquic_winuser.h` | +| P11 | The pinned `msquic.h` has `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12`, deferred/indicated certificate flags, `QUIC_SEND_FLAG_FIN`, `QUIC_STREAM_EVENT_SEND_COMPLETE`, API version 2 | source read | `artifacts/dependencies/msquic-schannel-2.5.9/package/build/native/include/msquic.h:123,132-133,142,246,394-398,1290,1530,1850` | +| P12 | Docker Desktop on Starfire runs a linux/amd64 engine | probe | `docker version --format '{{.Server.Os}}/{{.Server.Arch}}'` -> `linux/amd64` | +| P13 | `openssl` 3.5.5 CLI is available on Starfire (mingw) | probe | `which openssl` | +| P14 | npm names `cultmesh-ts`, `cultnet-ts`, `cultmesh-browser`, `@gamecult/cultmesh-ts`, `@gamecult/cultnet-ts`, `@gamecult/cultmesh-quic-native` are all unclaimed | probe | `npm view version` returned nothing for each | +| P15 | Only `@gamecult/cultcache-ts` and the three Python packages have publish jobs | source read | `.github/workflows/publish-packages.yml:20-24,40-76` | +| P16 | Every external TS consumer uses `file:` paths; none uses a registry version | probe (Explore agent over `F:\Projects`) | section 3 | +| P17 | The StreamPixels deploy path extracts a CultLib tarball beside the app and runs `pnpm install --frozen-lockfile` and `pnpm build` on Yggdrasil | source read | `gamecult-ops/scripts/deploy-streampixels-preview.sh:21,95-103` | +| P18 | The Unity native connector refuses any endpoint without a 64-hex `cert-sha256` pin | source read | `CultMeshNativeQuicRealtimeTransport.cs:103-105` | +| P19 | C# `IsProtected` accepts `wss`, `https`, or any scheme containing `quic`; the browser verifier accepts only `wss` | source read | `CultMeshAuthorityProof.cs:156-162`; `cultmesh-browser/src/index.ts:965` | +| P20 | C# and browser canonical route transcripts are field-for-field identical | source read | `CultMeshAuthorityProof.cs:275-292` vs `cultmesh-browser/src/index.ts:979-996` | + +## 3. Consumer audit + +Method: every `package.json` under `F:\Projects` (excluding `node_modules`, +`dist`, `dist-test`, `.git`, `bin`, `obj`, `Library`, `Temp`, and CultLib +itself and its worktree copies) checked for the four package names, plus a +grep of every `*.ts/*.tsx/*.mts/*.cts/*.js/*.mjs/*.cjs` import or require of +them, with symbols read from the import lines. Vendored copies inside +`Heimdall/vendor/CultLib`, `VoidBot/vendor/cultcache-ts`, and +`gamecult-ops/.artifacts/*` were classified as library-internal, not +consumers. + +Result: + +| Package | Repos | Source files | Symbols actually imported (union) | +| --- | ---: | ---: | --- | +| `cultnet-ts` | 11 (StreamPixels, Heimdall, AetheriaEve, AetheriaEve-cultlib-admission, VoidBot, Stonks, Vili, weksa, Sai, EvePlugins, Bifrost) | 28 | `CultNetRudpSession`, `decodeRudpPacket`, `encodeRudpPacket`, `encodeCultNetMessageForWire`, `parseCultNetMessage`, `invokeCultNetOperation`, `startCultNetOperationServer`, `defineCultNetDocumentBinding`, `CultNetDocumentRegistry`, runtime-presence helpers, and message/packet types | +| `cultnet-ts/contracts` | 0 | 0 | one esbuild alias only (`AetheriaEve-cultlib-admission/scripts/verify-aetheria-browser-provider.mjs:48`); `cultmesh-browser` is its only importer and is inside CultLib | +| `cultmesh-ts` | 7 (StreamPixels, Heimdall, AetheriaEve and its worktree, Stonks, weksa, Odin and its worktree) | 10 | `CultMesh`, `cultMeshRectFromBounds`, `cultMeshViewportRequest`, and types (`CultMeshRudpEndpoint`, `CultMeshDocumentCatalog`, `CultMeshViewportRequest`, diagnostics types) | +| `@gamecult/cultcache-ts` | 1 (Heimdall) | 5 | `SingleFileMessagePackBackingStore`, `defineDocumentType`, `CultCacheEnvelope` | +| `cultcache-ts` (old unscoped name) | 8 | 16 | `CultCache`, `SingleFileMessagePackBackingStore`, `defineDocumentRegistry`, `defineDocumentType`, `/inspection` | +| `cultmesh-browser` | 1 (AetheriaEve and its worktree) | 1 | `CultMeshBrowserClient`, `CultMeshBrowserOdinRendezvous`, `decodeCultNetPayload` | + +StreamPixels specifically: `apps/service/package.json:25-27` declares +`cultcache-ts`, `cultmesh-ts`, `cultnet-ts` as `file:../../../CultLib/packages/`; +`apps/service/src/verse-state.ts:4-6` imports `defineDocumentType`, +`CultMesh`, `defineCultNetDocumentBinding`; `apps/service/src/idunn-rudp-health.ts:2-7` +imports `encodeCultNetMessageForWire`, `encodeRudpPacket`, and two types. +Nothing else in StreamPixels imports these packages. No TS/JS file anywhere +under `F:\Projects` references `cultmesh-state+quic` or `CultMeshRealtime`. + +Sizing consequences: + +- Nothing this migration adds has a consumer yet. The QUIC surface is new + API; no existing export is reshaped, so no external repo changes are + required by the CultLib cuts. StreamPixels adoption is consumer work after + release (target, "Not in this migration"). +- The `verifyAuthorityRoute` family in `cultmesh-browser` is module-private + (not exported at `cultmesh-browser/src/index.ts:955`, `:979`, `:998`, + `:1012`, `:1028`), so moving it (Q2) changes no external import. The three + symbols AetheriaEve imports stay. +- `cultnet-ts/contracts` has no external consumer; adding a sibling subpath + export for the shared verifier follows an existing, internally consumed + pattern rather than inventing a new one. +- The `cultcache-ts` naming split (8 repos on the old unscoped name, Heimdall + on `@gamecult/`) is pre-existing and not touched here, but it is the + precedent Q5 has to reckon with. + +## 4. Rejected options + +- **Node built-in QUIC.** Absent in Node 24 (P1). Not a choice. +- **`@matrixai/quic` 2.0.9.** A Rust/quiche-based QUIC stack with its own + stream, certificate and event semantics `(probe: npm view description)`. + Rejected because the target requires the bytes on the wire, the ALPN, the + stream-kind byte, the deferred certificate pin decision, and the close/abort + codes to match `GameCult.Mesh.Quic` and the Unity MsQuic connector; two QUIC + stacks would have to be proven equivalent at every one of those points, and + CultLib would own neither. Semantically wrong for this campaign, not merely + unfashionable. +- **`@fails-components/webtransport` 1.6.8.** libquiche behind a WebTransport + (HTTP/3) session model `(probe)`. Wrong layer: the realtime plane is raw + QUIC with ALPN `cultmesh-state-v1`, not HTTP/3. +- **`node-quic` 0.1.3.** A wrapper around an abandoned pure-JS QUIC `(probe)`. + Not TLS 1.3 MsQuic; rejected on the same grounds. +- **A Node-API addon (node-addon-api + node-gyp/cmake-js) wrapping MsQuic + directly.** Viable, but it creates a second C++ owner of MsQuic callback + semantics beside the Unity bridge, requires Node headers and MSVC on every + Windows build host and a Node-ABI artifact per platform, and buys nothing the + C ABI plus FFI does not (P2). Rejected as duplicate authority. If koffi were + ever removed, the cheapest replacement is a thin N-API shim over the same C + ABI, not a second MsQuic body. +- **A separate .NET provider process or a WebSocket shortcut.** Already ruled + out by the operator (target, line 15-17). +- **JS callbacks from MsQuic worker threads.** koffi supports them by queuing + to the main thread (P4), but it turns every MsQuic event into a + cross-thread hop and opens the documented deadlock class. Rejected in favour + of the event-queue/wait model the existing bridge already uses. +- **Building the Windows DLL with the MinGW gcc on PATH.** Present (P6) but the + committed Unity artifact is MSVC `/Brepro`; two toolchains for one DLL is a + reproducibility liability. Rejected. +- **Building the Linux artifact on Starfire and shipping it.** Cross-building + is explicitly forbidden by the target; a Docker `debian:13` container on + Starfire is a Linux host and is fine for the development loop, but the + release artifact comes from the builder the operator names in Q6. +- **Keeping `cert-sha256` verification in C.** The v2 ABI hands the DER + certificate to the host and waits for the decision, which is the "caller + hook" the target demands and removes the Windows-only + `CryptHashCertificate2` from the portable path. The v1 entrypoint keeps its + in-C pin check only as the Unity compatibility shim (section 8). + +## 5. Authority maps + +### 5.1 Native MsQuic bridge (`native/GameCult.Mesh.Quic.Native`) + +- Owner: `cultmesh_quic_native.cpp` owns MsQuic registration, configuration, + listener, connection and stream handles, TLS credential loading, the + 1-byte-kind + 4-byte-LE-length stream framing, and a single event queue per + runtime. +- Inputs: host/port, PKCS12 bytes and password for providers, the host's + certificate decision for clients, encoded frame bytes to send. +- Outputs: events (`listener_new_connection`, `connection_connected`, + `connection_certificate_received` with DER payload, `connection_shutdown` + with code/status/text, `stream_started` with kind, `stream_frame` with the + whole encoded frame, `stream_send_complete`, `stream_shutdown`); the bound + listener port; structured error text. +- Derived state: none that the host reads as truth. Connection counts, remote + addresses and MsQuic status codes are diagnostics. +- Forbidden writers: the bridge never decodes a CultMesh frame, never decides + delivery semantics, never coalesces, never accepts a certificate on its own + in the v2 path, never reconnects. The v1 shim is the only place a pin is + compared in C, for the Unity contract only. +- Shared paths: the Unity managed connector (v1 exports) and the Node binding + (v2 exports) use the same library, the same MsQuic runtime, the same + framing code. +- Deletion line: the per-client `Client` struct with its own registration + (`:51-63`, `:316-393`), Windows-only includes and export macros (`:1-3`, + `:18-22`), `CertificateMatchesPin` as the sole trust path (`:184-200`). + +### 5.2 TypeScript QUIC realtime plane (`packages/cultmesh-ts`) + +- Owner: `src/realtime-quic.ts` owns provider and consumer semantics: which + stream kind carries which delivery mode, the per-peer keyed coalescing + outbox for `LatestOnly`, the single ordered stream for `ReliableOrdered`, + `Unreliable` failing closed, the generation filter on receive, and the + certificate pin decision on the consumer. +- Inputs: bridge events; `CultMeshRealtimeFrame` objects from application + code; an advertised `CultMeshTransportCandidate`-shaped route from the + session manager; the consumer's trust policy. +- Outputs: encoded frames to the bridge; decoded frames to the application; + the advertised endpoint string for a provider (with `cert-sha256`). +- Derived state: connection health, connected peer count, stream ids. +- Forbidden writers: application code never opens a stream, picks an + endpoint, or writes a reconnect loop (target). `src/realtime-wire.ts` never + touches a socket. `src/realtime-quic-native.ts` (the koffi binding) never + interprets frame bytes. +- Shared paths: provider broadcast and consumer send both go through + `sendFrame` on the same transport object; the coalescing outbox is the only + path for `LatestOnly` on a provider, whether the caller is a test, a tick, or + a reconnect. +- Deletion line: none inside `cultmesh-ts` (there is no prior QUIC code); the + RUDP provider transport at `src/provider-rudp-transport.ts` is untouched. + +### 5.3 Shared TypeScript route verification (Q2) + +- Owner after the cut: `packages/cultnet-ts/src/cultmesh-authority.ts`, + published as subpath `cultnet-ts/authority`. It is the only TypeScript + implementation of: Odin root lookup, validity window, canonical route + transcript, canonical session transcript, P-256/P1363 verification, + loopback detection, and the protected-scheme rule. +- Inputs: a route view (Verse, authority runtime, endpoint, protocol ids, + priority, generation, certificate), a trust policy (`mode`, `odinRoots`, + `now`), a session-open request and an accepted message. +- Outputs: resolution or a thrown `Error` whose message is the C# reference's + for the same refusal. *(First written as "the same message texts the + browser package emits today (its tests pin them)"; Soul found the browser + tests pin two messages only, and the channel-protection text was false for + QUIC. Corrected 2026-09-16.)* +- Derived state: none. +- Forbidden writers: `cultmesh-browser` must not retain or regrow + `verifyAuthorityRoute`, `canonicalRoute`, `canonicalSession`, + `canonicalFields`, `verifyP256`, or `isLoopbackEndpoint`; `cultmesh-ts` must + not implement any of them; neither transport package may depend on the + other. Negative greps in section 6 pin this. +- Shared paths: the browser WebSocket client and the Node QUIC consumer verify + the same route bytes through the same function. +- Deletion line: `cultmesh-browser/src/index.ts:955-1072` and `:797-808`. +- Behavioural note, not a silent change: the protected-scheme rule becomes the + C# rule (`wss`, `https`, scheme containing `quic`; + `CultMeshAuthorityProof.cs:156-162`) instead of `wss`-only + (`cultmesh-browser/src/index.ts:965`). The browser client still refuses + non-`ws(s)` route endpoints at `:537-540`, so browser behaviour is + unchanged; the shared module simply stops being wrong for QUIC routes. + +### 5.4 Build and packaging + +- Owner: `scripts/build-quic-native.ps1` (Windows x64) and the new + `scripts/build-quic-native.sh` (Linux x64) own producing the bridge + artifact; the new `.github/workflows/quic-native.yml` owns producing the + release-grade artifact for both platforms (Q6 A) and attaching it to a + GitHub Release; the committed tree `packages/cultmesh-ts/native/` owns + delivery to consumers (Q5 C): whatever carries the package directory (a + `git archive`, an `npm pack` tarball, a pnpm `file:` copy) carries the + binaries with it, and `packages/cultmesh-ts/native/MANIFEST.txt` plus + `SHA256SUMS` own provenance (MsQuic version, build host, digest per file). +- Inputs: pinned MsQuic 2.5.9 (Schannel NuGet on Windows; `libmsquic` deb on + Linux) with SHA-256 checks; the bridge source; the pinned `debian:13` image + digest for the Linux builder. +- Outputs: `gamecult_mesh_quic_native.dll` + `msquic.dll` (win32-x64), + `libgamecult_mesh_quic_native.so` + `libmsquic.so.2` (linux-x64), the MsQuic + license, and the two provenance files. +- Derived state: `artifacts/` (git-ignored, `.gitignore:66`) is the + development-loop build output and never delivery; the Unity plugin copies at + `unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/` remain the Unity + package's own body (section 8, operator-only rebuild), not a source for + Node. +- Forbidden writers: no `postinstall` compile or download step in any + package; a consumer host never needs CMake, a compiler, or registry access + for the binding; no workflow commits binaries to `main` (the operator + commits from a Release asset whose digest the manifest records, Q8); + `realtime-quic-native.ts` never searches `node_modules` for a platform + package. +- Deletion line: the platform packages + `packages/cultmesh-quic-native/{win32-x64,linux-x64}` and + `optionalDependencies` from the ruling-A map are never created; the Windows + script is kept and the Unity package script keeps calling it. +- Parked seam (registry publication, later pass): the same `quic-native.yml` + artifacts are the payload a publish job would wrap; the reattachment point + is a `cultmesh-ts` job shaped like `publish-packages.yml:39-78` that depends + on the two build jobs, plus `optionalDependencies` in + `packages/cultmesh-ts/package.json` and a `node_modules` branch in the + resolver. None of that exists under C. + +## 6. Cut 1 (subtraction): one TypeScript route verifier + +Purpose: land Q2 before any QUIC code exists, so the Node consumer has one +owner to call and the browser package has nothing left to grow. + +Deletes (exact): + +- `packages/cultmesh-browser/src/index.ts:955-977` `verifyAuthorityRoute` + (23 lines), `:979-996` `canonicalRoute` (18), `:998-1010` `canonicalSession` + (13), `:1012-1026` `canonicalFields` (15), `:1028-1058` `verifyP256` (31), + `:1065-1072` `isLoopbackEndpoint` (8), `:797-803` `bytesToBase64` (7), + `:805-808` `base64ToBytes` (4). Total 119 lines deleted from the browser + package. `randomNonce` (`:1060-1063`) stays: it is browser-client behaviour, + not verification. + +Keeps and moves: + +- The deleted bodies move verbatim into + `packages/cultnet-ts/src/cultmesh-authority.ts` as exported functions, with + one edit: the protected-scheme test in `verifyAuthorityRoute` becomes + `isProtectedEndpoint(endpoint)` implementing the C# rule (P19). Types + `CultMeshBrowserIdentity`, `CultMeshBrowserRoute`, + `CultMeshBrowserP256PublicKey`, `CultMeshBrowserRouteCertificate`, + `CultMeshBrowserAuthorityTrustMode`, `CultMeshBrowserAuthorityTrustPolicy` + (`cultmesh-browser/src/index.ts:19-53`) move too, renamed without the + `Browser` infix (`CultMeshAuthorityIdentity`, `CultMeshAuthorityRouteView`, + `CultMeshP256PublicKey`, `CultMeshAuthorityRouteCertificate`, + `CultMeshAuthorityTrustMode`, `CultMeshAuthorityTrustPolicy`). + `cultmesh-browser` re-exports them under the old names as type aliases. +- `validateSessionAcceptance` (`:926-953`) stays in the browser package; it + compares WebSocket handshake fields. Its crypto lines (`:944-951`) are + replaced by a call to the new `verifyProviderSessionProof(request, endpoint, + providerKey, signature)` exported from the shared module. + +Adds: + +- `packages/cultnet-ts/src/cultmesh-authority.ts` (about 190 lines: the moved + 119 plus types and `isProtectedEndpoint`). Browser-safe by construction: it + may use only `globalThis.crypto.subtle`, `TextEncoder`, `atob`, `btoa`, + `URL`, `DataView`, `Uint8Array`. No `node:` import. +- `packages/cultnet-ts/package.json:7-18` gains an `"./authority"` export + beside `"./contracts"` (`:12-16`), same three-key shape. +- `packages/cultnet-ts/src/index.ts` re-exports the module's public names. +- `packages/cultnet-ts/test/cultmesh-authority.test.ts` (about 150 lines): + signs a route with `node:crypto` `generateKeyPairSync("ec", { namedCurve: + "P-256" })` and verifies through the shared module; one negative per rule + (expired, unsigned remote, wrong Odin root, mutated endpoint, wrong signature + length); and asserts `isProtectedEndpoint` accepts `wss://`, `https://`, + `cultmesh-state+quic://` and rejects `ws://`, `cultnet+tcp://`. +- A cross-runtime vector: `tests/GameCult.Mesh.Tests/CultMeshAuthorityProofTests.cs` + gains a test that calls `CultMeshAuthorityProof.CreateSignedRoute` + (`src/GameCult.Mesh/CultMeshAuthorityProof.cs:221`) with a fixed test key + and writes `contracts/cultmesh/authority-route-vectors.json` (route fields, + Odin public key, signature) when `CULTMESH_WRITE_VECTORS=1`, and otherwise + asserts the committed file still verifies. The TS test verifies the same + file through the shared module. This is a shared-vector check, not + cross-process interop; it proves the transcript bytes, which is what Q2 + needs. + +Per-file changes: + +- `packages/cultmesh-browser/src/index.ts:1-17` add + `import { verifyAuthorityRoute, verifyProviderSessionProof, isLoopbackEndpoint, type ... } from "cultnet-ts/authority";` + (the package already imports `cultnet-ts/contracts` at `:2-17`, so + resolution is proven). `:536` and `:914` call the imported function + unchanged. `:944-951` call `verifyProviderSessionProof`. `:961` and `:965` + are gone with the function. +- `packages/cultmesh-browser/tsconfig.json` unchanged (`moduleResolution: + "Bundler"` already resolves the `exports` map). + +Verification: + +- `npm run test --workspace packages/cultnet-ts` (build + unit; pins the + shared verifier and the vector file). +- `npm run test --workspace packages/cultmesh-browser` (all 17 existing tests + at `test/cultmesh-browser.test.ts:29-472` must pass unchanged; they pin the + error strings and the refusal order, including "rejects a mutated or expired + signed route before opening a provider socket" at `:239-258`). +- `dotnet test tests/GameCult.Mesh.Tests --filter FullyQualifiedName~AuthorityProof` + (vector generation/verification; focused, one project). +- `node scripts/test-typescript-package-closure.mjs` (the packed + `cultmesh-browser` tarball must resolve `cultnet-ts/authority` from the + registry-shaped install at `scripts/test-typescript-package-closure.mjs:63-72`). +- Negative greps (must return nothing): + `rg -n "crypto\.subtle\.(verify|importKey)|function (verifyAuthorityRoute|canonicalRoute|canonicalSession|canonicalFields|verifyP256|isLoopbackEndpoint|isProtectedEndpoint|isUnsignedCertificate)" packages/cultmesh-browser/src packages/cultmesh-ts/src` + and `rg -n "cultmesh-browser" packages/cultmesh-ts/package.json packages/cultnet-ts/package.json`. + *(The name list grew by two after the fix batch: `isProtectedEndpoint`, + written fresh as the C# rule, and `isUnsignedCertificate`, the shared + reading of "unsigned" the browser's session check now uses. Soul noted + the grep pins names, not structure; a shim under another name passes it.)* +- Operator-only: none. + +## 7. Cut 2 (behaviour, pure TypeScript): the realtime frame codec + +Purpose: byte parity with `CultMeshRealtimeWireProtocol` before any transport +exists, proven in both directions with shared vectors. + +Deletes: none. + +Adds: + +- `packages/cultmesh-ts/src/realtime-wire.ts` (about 130 lines). Exports + `CULTMESH_REALTIME_ALPN = "cultmesh-state-v1"`, + `CULTMESH_REALTIME_CONNECTION_CLOSE_CODE = 0x43554c54n`, + `CULTMESH_REALTIME_STREAM_ABORT_CODE = 0x53544154n`, + `CULTMESH_REALTIME_RELIABLE_STREAM = 1`, `CULTMESH_REALTIME_LATEST_ONLY_STREAM = 2`, + `CULTMESH_REALTIME_MAX_PAYLOAD_BYTES = 64 * 1024 * 1024`, + `CULTMESH_REALTIME_MAX_ENCODED_FRAME_BYTES` (= max payload + 37 + 3 * 65535, + matching `CultMeshRealtimeWireProtocol.cs:20`), type + `CultMeshRealtimeDelivery = "reliable-ordered" | "latest-only" | "unreliable"` + with wire bytes 0/1/2 in that order (`CultMeshRealtimeTransports.cs:8-13`), + interface `CultMeshRealtimeFrame { channelId; schemaId; bodyId; + producerEpoch: bigint; sequence: bigint; delivery; payload: Uint8Array }`, + `encodeRealtimeFrame(frame): Uint8Array`, `decodeRealtimeFrame(bytes): + CultMeshRealtimeFrame`. Layout exactly `CultMeshRealtimeWireProtocol.cs:37-54` + (magic `0x31545343` LE u32, delivery u8, epoch i64 LE, sequence i64 LE, + three u16 LE lengths, payload i32 LE, header size i32 LE = 37, version u16 + LE = 1, then UTF-8 identities, then payload). Decode rejections match + `:60-76` one for one: truncated header, wrong magic, unsupported version or + header size, delivery out of range, negative payload length, length sum + mismatch. Epoch and sequence are `bigint` because i64 exceeds the safe + integer range; validation mirrors `CultMeshRealtimeTransports.cs:29-39` + (non-empty identities, non-negative epoch/sequence). +- `contracts/cultmesh/realtime-frame-vectors.json`: written by a new C# test + `tests/GameCult.Mesh.Tests/CultMeshRealtimeWireProtocolTests.cs` under + `CULTMESH_WRITE_VECTORS=1` and otherwise asserted against. Cases: one frame + per delivery mode with small payload; empty payload; identities at exactly + 65,535 UTF-8 bytes (multi-byte characters included so byte length and + character length differ); epoch and sequence at `long.MaxValue`; and a + 64 MiB-payload case recorded as `{ sha256OfEncoding, encodedLength }` rather + than bytes. Malformed cases: wrong magic, version 2, header size 36, + delivery 3, payload length -1, length sum off by one, each with the C# + exception message. There is no existing C# test for this codec + (`rg CultMeshRealtimeWireProtocol tests` returns nothing `(probe)`), so this + is also the first direct C# codec test. +- `packages/cultmesh-ts/test/realtime-wire.test.ts` (about 120 lines): every + vector decodes to the recorded fields and re-encodes to the recorded bytes; + every malformed vector throws; the 64 MiB case is built in-process and its + SHA-256 compared; TypeScript-produced bytes for the same fields equal the + C#-produced bytes (this direction is what "TypeScript encodings decode in + C#" means when the vector file is the medium; the cross-process direction is + cut 5). +- `packages/cultmesh-ts/src/index.ts:37-40` gains `export * from "./realtime-wire";`. + +Verification: + +- `dotnet test tests/GameCult.Mesh.Tests --filter FullyQualifiedName~RealtimeWireProtocol`. +- `npm run test --workspace packages/cultmesh-ts`. +- Negative grep: `rg -n "0x31545343|cultmesh-state-v1" packages --glob '!**/dist*/**'` + must hit only `realtime-wire.ts` and its test in TypeScript (one codec). +- Operator-only: none. + +## 8. Cut 3 (native, subtraction then behaviour): the runtime-neutral bridge + +Purpose: one MsQuic body for Unity and Node, two roles, two platforms, no +callbacks across the host boundary. + +Deletes first (in `native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp`): + +- `:1-3` Windows includes; `:18-22` `__declspec` macros; `:51-63` per-client + `Client` with its own `api/registration/configuration`; `:184-200` + `CertificateMatchesPin` as the trust path; `:288-305` `CloseHandles`; + `:309-393` `cultmesh_quic_open` as the primary API. About 200 of 440 lines + are removed or rewritten; the framing consumer (`:123-157`), stream callback + (`:159-182`), trace/error helpers (`:65-86`, `:202-221`) are kept in spirit + and re-homed on the runtime. +- `CMakeLists.txt:4-6` (Windows-only fatal) and `:7-9` (`MSQUIC_ROOT` + mandatory) are replaced by a platform branch. + +Adds (C ABI v2, all `extern "C"`, exported with a portable macro +`CULTMESH_API` that is `__declspec(dllexport)` on MSVC and +`__attribute__((visibility("default")))` elsewhere): + +``` +int32_t cultmesh_quic_runtime_open(const char* app_name, void** out_runtime); +void cultmesh_quic_runtime_close(void* runtime); +int32_t cultmesh_quic_listener_open(void* runtime, const char* host, uint16_t port, + const uint8_t* pkcs12, int32_t pkcs12_len, const char* password, + uint64_t* out_listener_id, uint16_t* out_bound_port); +void cultmesh_quic_listener_close(void* runtime, uint64_t listener_id); +int32_t cultmesh_quic_connection_open(void* runtime, const char* host, uint16_t port, + uint64_t* out_connection_id); +int32_t cultmesh_quic_connection_certificate_complete(void* runtime, uint64_t connection_id, + int32_t accept); +void cultmesh_quic_connection_shutdown(void* runtime, uint64_t connection_id, uint64_t code); +int32_t cultmesh_quic_stream_open(void* runtime, uint64_t connection_id, uint8_t kind, + uint64_t* out_stream_id); +int32_t cultmesh_quic_stream_send_frame(void* runtime, uint64_t stream_id, + const uint8_t* encoded_frame, int32_t length, int32_t fin); +void cultmesh_quic_stream_shutdown(void* runtime, uint64_t stream_id, uint64_t code); +int32_t cultmesh_quic_next_event(void* runtime, int32_t timeout_ms, + cultmesh_quic_event* out_event, uint8_t* payload, int32_t payload_capacity, + int32_t* out_required); +int32_t cultmesh_quic_last_error(void* runtime, char* destination, int32_t capacity); +``` + +- `cultmesh_quic_event` is a fixed 64-byte struct: `uint32 type; uint32 + stream_kind; uint64 listener_id; uint64 connection_id; uint64 stream_id; + uint64 code; int32 status; int32 payload_length; uint8 reserved[16]`. + Types: 1 `listener_new_connection`, 2 `connection_connected`, 3 + `connection_certificate_received` (payload = DER), 4 `connection_shutdown` + (payload = UTF-8 reason), 5 `stream_started` (inbound, `stream_kind` set + from the first byte), 6 `stream_frame` (payload = one whole encoded frame, + length prefix stripped), 7 `stream_send_complete`, 8 `stream_shutdown`, 9 + `listener_stopped`. `next_event` returns 0 on timeout, 1 with the event + filled and payload copied, 2 when `payload_capacity` is too small (event + stays at the head; `out_required` set), negative on error. This is the v1 + two-phase poll convention (`:400-418`) applied to a queue of typed events. +- Client connections use `QUIC_CREDENTIAL_TYPE_NONE` with + `INDICATE_CERTIFICATE_RECEIVED | DEFER_CERTIFICATE_VALIDATION | + USE_PORTABLE_CERTIFICATES` (already at `:358-364`), return + `QUIC_STATUS_PENDING` from the certificate event, enqueue event 3, and call + `ConnectionCertificateValidationComplete` only when the host calls + `certificate_complete` (P11: `msquic.h:132-133,142,1290`). Timeout: the + bridge sets a 10 s handshake idle; if the host never answers, MsQuic's + handshake timeout closes the connection and event 4 is emitted. +- Listeners load `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12` + (`msquic.h:123,394-398`), one credential type for Schannel and OpenSSL; the + provider's advertised pin is the SHA-256 of the DER certificate computed on + the TypeScript side from the same PKCS12 with `node:crypto` (no hashing in + C). +- Settings mirror the C# server/connector: `PeerUnidiStreamCount 1024` + (`CultMeshQuicRealtimeTransport.cs:77`, `:202`), idle timeout 30 s and + keep-alive 5 s as in the existing bridge (`:335-338`). +- `stream_send_frame` copies the bytes, prepends the 4-byte LE length, calls + `StreamSend` (with `QUIC_SEND_FLAG_FIN` when `fin`), and emits event 7 on + `QUIC_STREAM_EVENT_SEND_COMPLETE`. `stream_open` writes the kind byte as the + first send. Framing therefore lives in C on both directions, exactly where + the v1 bridge already keeps it (`:123-157`), and `CultMeshQuicRealtimeProtocol` + keeps it in C# (`CultMeshQuicRealtimeTransport.cs:635-655`). +- The v1 exports `cultmesh_quic_open/state/poll/error/close` are kept, Windows + only (`#ifdef _WIN32`), implemented on top of a private runtime with the pin + check retained from `:184-200`. External contract protected: the Unity + package `DllImport` at `CultMeshNativeQuicRealtimeTransport.cs:259-277` and + `CanConnect`'s Windows gate at `:39-41`. They delegate; they decide nothing + new. +- `CMakeLists.txt`: Windows branch unchanged in effect (MSVC, `/Brepro`, + `MSQUIC_ROOT` from the NuGet layout, links `msquic crypt32 bcrypt`); Linux + branch links `msquic` from `MSQUIC_LIB_DIR` (the extracted deb's + `usr/lib/x86_64-linux-gnu`) with headers from `MSQUIC_INCLUDE_DIR`, `-fvisibility=hidden`, + output `libgamecult_mesh_quic_native.so`, `RPATH $ORIGIN` so the sibling + `libmsquic.so.2` resolves. +- `scripts/build-quic-native.sh` (about 70 lines): fetches + `libmsquic_2.5.9_amd64.deb` from the packages.microsoft.com pool URL in P7, + verifies its SHA-256, extracts with `dpkg-deb -x`, fetches the three headers + at tag `v2.5.9` (P10) and verifies their SHA-256 (record the hashes at first + run into the script, the same way `build-quic-native.ps1:14` pins the + NuGet), configures CMake with Ninja, and copies `libgamecult_mesh_quic_native.so`, + `libmsquic.so.2`, and the MsQuic LICENSE into `artifacts/quic-native/linux-x64`. +- `native/GameCult.Mesh.Quic.Native/README.md` rewritten to describe both + roles, both platforms, the v1/v2 split, and the "no host callbacks" rule. + +Per-file changes outside `native/`: + +- `scripts/build-quic-native.ps1:54-58` output path becomes + `artifacts/quic-native/win32-x64` by default (parameter default at `:4`); + callers `build-unity-package.ps1:80-82` and the Native.Tests csproj `:20-22` + pass explicit `-OutputDirectory` today, so they are unaffected. +- No change to `src/GameCult.Mesh.Quic.Native/*.cs`. The Unity managed + connector keeps polling v1. + +Verification: + +- Windows: `powershell -File scripts/build-quic-native.ps1` then + `dotnet test tests/GameCult.Mesh.Quic.Native.Tests` (the csproj rebuilds the + bridge itself at `:20-22`; all four tests at + `CultMeshNativeQuicRealtimeTransportTests.cs:15-141` must pass, including the + wrong-pin refusal at `:79-99` and the departed-client test at `:101-141`). + This is the regression gate for the v1 shim. +- Windows FFI smoke, before any TypeScript transport exists: + `scratchpad`-style script (to be committed as + `packages/cultmesh-ts/test/realtime-quic-native.test.ts` in cut 4) that + opens a runtime, a listener with a PKCS12 generated by `openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 ... | openssl pkcs12 -export` + (P13), a client connection to it, answers event 3 with accept, sees event 2 + on both sides, opens a latest-only stream, sends one frame with `fin`, and + reads event 6 on the server side with the identical bytes. +- Linux, development loop: build the committed image + `scripts/quic-native-linux-dev.Dockerfile`, pinned to the same `debian:13` + digest as the release workflow, and follow the recipe in the bridge's own + README. The image carries the compiler, Ninja, Node, `setarch` and the + library's runtime dependencies, and the sanitizer configurations need the + container's default seccomp profile relaxed so randomisation can be + disabled. The README and the Dockerfile header own that recipe; this map + does not restate it. This is a Linux build on a Linux host; it is not the + release artifact (Q6). *(The earlier one-line `docker run` recipe here + installed no JavaScript runtime and could not run the mutation runner at + all, and said nothing about randomisation or seccomp, which is how the + Linux path came to be red for everyone but the agent that had found the + flags by hand.)* +- Build economy: the only builds are the native CMake target and + `tests/GameCult.Mesh.Quic.Native.Tests` (which pulls `GameCult.Mesh.Quic`, + `GameCult.Mesh.Quic.Native`, `GameCult.Mesh`, `GameCult.Networking`, + `GameCult.Caching` by project reference). Before the first `dotnet build`, + take `Get-ChildItem -Recurse F:\Projects\CultLib\bin,F:\Projects\CultLib\obj,F:\Projects\CultLib\artifacts | Select FullName,Length` + to a scratch file and diff afterwards; restore or delete anything outside + those five projects' outputs. +- Negative greps: `rg -n "CryptHashCertificate2|wincrypt" native/` must hit + only inside the `#ifdef _WIN32` v1 block; `rg -n "windows.h" native/` only + inside `#ifdef _WIN32`. +- Operator-only: rebuilding and re-committing the Unity plugin DLL + (`unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll`) + and cutting a Unity package version through `scripts/build-unity-package.ps1` + is a release action; the map does not schedule it. Until it happens, Unity + keeps the old DLL, which is fine because v1 exports are unchanged. + +## 9. Cut 4 (behaviour): Node binding, consumer, session manager, trust + +Purpose: a TypeScript consumer that connects by advertised candidate, verifies +the Odin route through the cut-1 module, pins the TLS certificate, and +receives frames from the C# managed provider in a separate process. + +Deletes: none. + +Adds: + +- `packages/cultmesh-ts/src/realtime-quic-native.ts` (about 260 lines): the + koffi binding. Resolves the binary directory as `CULTMESH_QUIC_NATIVE_DIR` + when set (the development loop and CI point it at + `artifacts/quic-native/` straight from a build), otherwise + `path.join(__dirname, "..", "native", `${process.platform}-${process.arch}`)`, + the committed tree cut 6 lands (Q5 C; `__dirname` is `dist/` at runtime, so + the path holds in the repo, in an `npm pack` tarball, and in a pnpm `file:` + copy alike). No `node_modules` lookup, no platform package, no registry. + When neither directory holds `msquic` and the bridge, throw one error naming + both paths tried and the env var; until cut 6 lands, that is the error every + caller outside the test suite gets. Loads `msquic` first, then the bridge, by absolute path + (the probe showed the dependent library must be resolvable before the + bridge loads). Declares the twelve v2 prototypes. Exposes + `CultMeshQuicNativeRuntime` with a single event pump: a loop that awaits + `nextEvent.async(runtime, 250, ...)` and dispatches typed events to + registered listeners/connections by id. One pump per process-wide runtime; + reference-counted open/close. No koffi callbacks anywhere. +- `packages/cultmesh-ts/src/realtime-quic.ts` (about 650 lines across cuts 4 + and 5). Cut 4 lands: `CultMeshQuicRealtimeTransport` (implements + `sendFrame`, `receiveFrame`, `dispose`, `transportId = "msquic-realtime"`, + `endpoint`; the `isVerifiedFor(verseId, authorityRuntimeId, protocolId, + routeGeneration)` check mirroring `CultMeshQuicRealtimeTransport.cs:352-361`), + `CultMeshQuicRealtimeConnector` (`connectorId`, `priority`, `canConnect(candidate)`, + `connect(candidate, target, signal)`), and the receive path: stream kind + vs frame delivery consistency (`:519-524`), and the per-`(channel, body)` + generation filter that drops older `(producerEpoch, sequence)` (`:538-560`). + Certificate decision on event 3: caller `validateProviderCertificate(target, + der)` if supplied, else SHA-256 of DER equals the endpoint's `cert-sha256` + (`:111-119`, case-insensitive hex); otherwise reject. Endpoint parsing: + scheme `cultmesh-state+quic`, host, port, optional pin (`:98-109`). +- `CultMeshQuicRealtimeSessionManager` in the same file: takes an + `ICultMeshRealtimeLookupSource`-shaped port `{ resolve(target): Promise }`, + a trust policy from `cultnet-ts/authority`, and connectors. Binds + candidates from `authorityRoutes` whose `protocolIds` include + `cultmesh.realtime_state.v1` (`CultMeshSessions.cs:77`) and whose + `authorityRuntimeId` matches; verifies each with `verifyAuthorityRoute` + before any connector is asked; orders by connector priority then route + priority; races at most `maxRacedCandidates` per tier (`:833-880`); requires + `isVerifiedFor` after connect (`:885-896`); keys sessions by + `verseId + "\u001f" + authorityRuntimeId` (`:46`); marks offline on transport + failure. Ships with `CultMeshStaticRealtimeLookupSource` (an array of + `CultMeshVerseDescriptorMessage` from `cultnet-ts/contracts:350-369`). No + Odin WebSocket rendezvous in Node in this migration (Q7). +- `CultMesh` facade (`packages/cultmesh-ts/src/index.ts:4700`) gains statics + beside the RUDP ones at `:6008-6186`: `parseQuicRealtimeEndpoint`, + `createQuicRealtimeConnector(options)`, `createQuicRealtimeSessionManager(options)`, + and in cut 5 `createQuicRealtimeProvider(options)`. +- `packages/cultmesh-ts/package.json:44-48` gains `"koffi": "3.3.0"` (exact). + No `optionalDependencies`: under Q5 C the binaries are files of this + package, not packages of their own. `koffi` is required lazily inside + `realtime-quic-native.ts` so consumers that never touch QUIC (AetheriaEve + Electron, Odin, Stonks, weksa) load nothing native. `koffi` itself is a + registry dependency like `@msgpack/msgpack` (`:45`); every consumer host + already installs from the registry (`deploy-streampixels-preview.sh:102`), + so this adds no new kind of fetch. +- `packages/cultmesh-ts/test/realtime-quic-native.test.ts` (about 150 lines): + the cut-3 FFI smoke, now against the runtime class. +- `packages/cultmesh-ts/test/realtime-quic-consumer.test.ts` (about 250 + lines): TypeScript consumer against a TypeScript listener opened through + the raw runtime (no provider semantics yet): connect with correct pin; + refuse wrong pin (`cert-sha256` of 64 zeros, mirroring + `CultMeshNativeQuicRealtimeTransportTests.cs:79-99`); refuse missing + certificate when no validator; caller validator observed with the target + identity; generation filter drops a late older generation (mirrors + `CultMeshQuicRealtimeTransportTests.cs:111-140`). +- Trust negatives, each a separate test with its own mutation, in the same + file, through the session manager with a static lookup source and a signed + route built with `node:crypto`: (a) expired certificate (`now` past + `expiresAt`); (b) unsigned remote route (certificate absent, mode + `authenticated-remote`); (c) wrong Odin root (trust has a different + `keyId`); (d) `cert-sha256` pin mismatch (route verifies, TLS pin fails, so + the connector rejects before `isVerifiedFor`); (e) replayed nonce. On the + QUIC plane there is no `session_open` nonce exchange; the route's + freshness is its generation plus the TLS handshake. The replay test + therefore mutates `generation` on the connected transport's target and + asserts `isVerifiedFor` fails and the session manager disposes the + transport (`CultMeshSessions.cs:885-896`). If the operator wants a nonce on + QUIC, that is a protocol addition on both runtimes and belongs to a later + pipeline; this map does not invent it. +- Interop lane, C# managed provider to TypeScript consumer, separate + processes: `tests/GameCult.Networking.InteropPeer/Program.cs:27-49` gains + mode `quic-realtime-serve` (`--port`, `--frames N`, `--delivery + latest-only|reliable-ordered`, `--interval-ms`): creates a self-signed + certificate exactly as `CultMeshQuicRealtimeTransportTests.cs:203-228`, + starts `CultMeshQuicRealtimeServer`, prints one JSON line + `{ endpoint: "cultmesh-state+quic://127.0.0.1:?cert-sha256=" }` + to stdout, then broadcasts `N` frames with increasing sequence and exits + after the last `send_complete` or on stdin close. + `GameCult.Networking.InteropPeer.csproj:9-11` gains a `ProjectReference` to + `src/GameCult.Mesh.Quic/GameCult.Mesh.Quic.csproj`. + `packages/cultnet-ts/test/interop/cultnet-interop.test.ts` gains + `test("CultMesh QUIC realtime: C# managed provider and TypeScript consumer", ...)` + using `spawnServeProcess` (`:2491`) for the C# peer and `runJsonCommand` + (`:2557`) for a new TypeScript peer script + `packages/cultmesh-ts/test/interop/cultmesh-quic-peer.ts` (`dial --endpoint + --expect N`) that prints the received frames as JSON (fields plus payload + hex). The harness drives processes; it does not import `cultmesh-ts` + (dependency direction: `cultmesh-ts` depends on `cultnet-ts`, so the reverse + import is forbidden). The peer script path follows the `tsPeerScript` + pattern at `:41`. + +Verification: + +- `npm run test --workspace packages/cultmesh-ts` with + `CULTMESH_QUIC_NATIVE_DIR=artifacts/quic-native/win32-x64`. +- `npm run test:interop --workspace packages/cultnet-ts` filtered with + `--test-name-pattern "QUIC realtime"`; it builds the C# interop peer through + the existing `csharpInteropPeerBuild` path (`:45-58`, `:71`). +- Negative greps: `rg -n "new Function|koffi\.register|\.async\(" packages/cultmesh-ts/src` + must show `.async(` only on `nextEvent` in `realtime-quic-native.ts` and no + `koffi.register` (no callbacks); + `rg -n "verifyP256|canonicalRoute" packages/cultmesh-ts/src` must return + nothing. +- Operator-only: none. + +## 10. Cut 5 (behaviour): TypeScript provider and the coalescing outbox + +Purpose: the StreamPixels role. A TypeScript listener that broadcasts with an +explicit delivery mode and cannot be backpressured by a slow consumer, proven +against both C# connectors in separate processes. + +Deletes: none. + +Adds (in `packages/cultmesh-ts/src/realtime-quic.ts`): + +- `CultMeshQuicRealtimeProvider.listen({ host, port, serverCertificate: + { pkcs12, password }, handshakeTimeoutMs })`: opens a listener, computes + `advertisedEndpoint` (`cultmesh-state+quic://:?cert-sha256=`, + uppercase, because the Unity connector requires the pin, P18), accepts + connections into a peer set, exposes `connectionCount`, `broadcast(frame)`, + `receive()` for client-originated frames, `dispose()`. +- Delivery semantics, mirroring `CultMeshQuicRealtimeTransport.cs`: + `reliable-ordered` opens one unidirectional stream of kind 1 per peer on + first use and serialises writes behind a per-peer promise chain; `broadcast` + resolves when every peer's `send_complete` arrives or the peer is evicted + (`:216-235`, `:237-255`). `latest-only` enqueues into a per-peer keyed + outbox (`Map<"channel\u001fbody", frame>` plus a ready queue) and returns + synchronously (`:363-367`, `:572-618`); each peer's pump opens a fresh kind-2 + stream per frame, sends with `fin`, and only dequeues the next frame after + `send_complete`, so a stalled peer accumulates at most one pending frame per + `(channel, body)` and never blocks `broadcast`. `unreliable` throws + `NotSupported` with the same sentence as `:373-375` adjusted for the + runtime. +- Peer eviction on send failure or `connection_shutdown`; no reconnect logic + on the provider. + +Interop lanes (all separate processes; all in +`packages/cultnet-ts/test/interop/cultnet-interop.test.ts`): + +- TypeScript provider to C# native connector (the Unity one): the harness + starts `cultmesh-quic-peer.ts serve --frames 5 --delivery latest-only`, + reads its advertised endpoint from stdout, then runs + `dotnet test tests/GameCult.Mesh.Quic.Native.Tests --filter FullyQualifiedName~NativeConnectorReceivesFromExternalManagedProvider` + with `CULTMESH_NATIVE_EXTERNAL_ENDPOINT=` (the existing test at + `CultMeshNativeQuicRealtimeTransportTests.cs:15-33` is reused unchanged: it + already asserts a frame arrives with non-empty schema, body and payload). + Rename the test to `NativeConnectorReceivesFromExternalProvider` since the + provider is no longer necessarily managed; the env var name stays. +- TypeScript provider to C# managed connector: add + `ManagedConnectorReceivesFromExternalProvider` to + `tests/GameCult.Mesh.Quic.Tests/CultMeshQuicRealtimeTransportTests.cs`, + gated by the same `CULTMESH_NATIVE_EXTERNAL_ENDPOINT`, using + `CultMeshQuicRealtimeTransportConnector` with the pin from the endpoint + (`:111-119`) and no validator, asserting frame fields and payload bytes + equal what the TypeScript peer prints. The harness runs it the same way. +- `LatestOnly` under a stalled consumer: `cultmesh-quic-peer.ts serve + --frames 200 --delivery latest-only --interval-ms 1` while the harness dials + twice with the TypeScript consumer, pauses one consumer's pump for 500 ms + (a test hook on the runtime that stops calling `next_event`), and asserts: + the provider's 200 `broadcast` calls complete within a bounded time + regardless of the pause; the healthy consumer reaches sequence 199; the + paused consumer, once resumed, converges on 199 with fewer than 200 frames + received. This is the TypeScript form of + `CultMeshNativeQuicRealtimeTransportTests.cs:101-141` plus the convergence + assertion from `CultMeshQuicRealtimeTransportTests.cs:111-140`. +- Golden bytes across processes: the C# managed connector lane above prints + the received frame's re-encoding (via `CultMeshRealtimeWireProtocol.EncodeFrame`) + as hex; the harness compares it with the TypeScript peer's `encodeRealtimeFrame` + output for the same frame. That closes "TypeScript encodings decode in C#" + by process, not by shared file. + +Verification: + +- `npm run test --workspace packages/cultmesh-ts` (provider unit tests with + the TypeScript consumer in-process but separate connections: reliable + ordering in both directions mirrors `CultMeshQuicRealtimeTransportTests.cs:71-110`; + latest-only coalescing; unreliable fails closed). +- `npm run test:interop --workspace packages/cultnet-ts --test-name-pattern "QUIC realtime"`. +- `dotnet test tests/GameCult.Mesh.Quic.Tests` and + `dotnet test tests/GameCult.Mesh.Quic.Native.Tests` without the env var + (the new tests `Assert.Ignore`, the existing ones still pass). +- Negative greps: `rg -n "setInterval|setTimeout" packages/cultmesh-ts/src/realtime-quic.ts` + must show no polling of the bridge (the pump is the only wait); + `rg -n "reconnect" packages/cultmesh-ts/src/realtime-quic.ts` must return + nothing on the provider side. +- Operator-only: none. + +## 11. Cut 6 (packaging and release, remapped under Q5 C) + +Purpose: a consumer host with no toolchain and no registry access for the +binding gets it by receiving the `cultmesh-ts` package directory, which is how +every consumer already receives the package (P16, P17). Registry publication +is parked, not ruled out; the seam it reattaches to is named at the end of +this section. + +### 11.1 Body facts this cut stands on + +- The deploy tarball is a `git archive`. The Idunn actuator on Starfire runs + `git -C CultLib archive --format=tar --output= origin/main packages/cultnet-ts packages/cultcache-ts` + (`F:\Projects\Odin\scripts\deploy-yggdrasil-streampixels.ps1:59`), uploads + it by `sftp` (`:127`), and `deploy-streampixels-preview.sh:95-99` extracts it + into `/srv/streampixels/CultLib` after deleting only those two package + directories (`:97`) `(source read)`. Two consequences: only committed files + ride (a `git archive` cannot carry untracked or ignored files), and + `packages/cultmesh-ts` is not in the archive today at all, although + StreamPixels declares it (`apps/service/package.json:26`). Adding it to the + archive list and to `:97` is deploy work in Odin and gamecult-ops, outside + this campaign (section 16); the Yggdrasil smoke below therefore ships its + own archive of the same shape rather than waiting on that change. +- pnpm materialises a `file:` directory dependency as a copy of the + package's `files` entries only: with `pnpm 10.33.0`, `node_modules/cultmesh-ts` + held `README.md`, `dist`, `package.json` and nothing else (no `src`, no + `test`) `(probe: scratch consumer with file: overrides)`. `files` is the + gate, so `native` must be listed in it. +- The MsQuic binaries the koffi probe loaded (P2) are the Unity plugin copies + at `unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/` (`probe.js:4-7`), + committed in plain git (`git ls-files`; `.gitattributes` is `* text=auto` + only, no LFS), `gamecult_mesh_quic_native.dll` 40,448 bytes and + `msquic.dll` 536,928 bytes `(probe)`. Committing binaries beside the code + that loads them is therefore existing practice in this repo, not a new one. +- The Linux runtime is one file: `libmsquic.so.2 -> libmsquic.so.2.5.9`, + 7,375,872 bytes, inside the pinned deb (P7); the deb also carries + `libmsquic.lttng.so.2.5.9` and `datapath_raw_xdp_kern.o`, neither needed + `(probe: dpkg-deb -c in debian:13)`. The repo pack is 31.68 MiB today + `(probe: git count-objects)`. +- `debian:13` resolved to digest + `sha256:f324c7ff54321e8d9c588493a20244965938ce0aa50bbd1022d38010e9ffc4b1` + on 2026-09-16 and carries `g++ 4:14.2.0-1` `(probe: docker pull; apt-cache + policy)`. The builder is pinned by that digest, not by the moving tag. +- `GameCult/CultLib` is public `(probe: gh repo view)` and already carries two + GitHub Releases with binary assets, `cultlib-unity-v1.0.3` + (`org.gamecult.cultlib-1.0.3.tgz`) and `gamecult-geometry-v0.1.0` (a crate + and nupkgs) `(probe: gh release view)`; nothing in `scripts/`, `docs/` or + `.github/` creates them, so they were cut by hand `(source read: rg)`. + Release assets on a public repo download with plain `curl`, no token. +- The npm registry is reachable from Starfire: `npm ping` answers `PONG`, + `npm view koffi` is HTTP 200, and `npm view @gamecult/cultcache-ts` is a + 404 because it was never published `(probe)`. This confirms the corrected + premise in section 13: C is deferral, not necessity. +- `.gitignore` ignores `artifacts/` (`:66`) and `node_modules`; it has no rule + for `*.so` or `*.dll` `(source read)`, so nothing blocks the commit path. +- The root `package-lock.json` is committed `(probe: git ls-files)`, so + `npm ci` is the real install path (as `publish-packages.yml:55` uses it); + `cultnet-interop.yml:95` uses `npm install --no-package-lock` instead, a + pre-existing inconsistency this cut does not touch. + +### 11.2 Q8, the fork C surfaces (operator decision, recommended option first) + +Where do the built binaries live so that the `git archive` above carries +them to the host? + +- **Option 1, commit them.** `packages/cultmesh-ts/native/{win32-x64,linux-x64}/` + hold the four binaries, committed by the operator from the Release assets + the workflow attaches, with `MANIFEST.txt` and `SHA256SUMS` beside them. + Price: about 8.0 MB in the tree (7,375,872 + 536,928 + 40,448 + the bridge + `.so`, on the order of 60 KB); pack growth roughly the compressed size, + about 3 MB, and that only when the MsQuic pin moves, because + `libmsquic.so.2` and `msquic.dll` are copies of Microsoft's files and + change with the pin, not with the bridge. A bridge rebuild adds tens of KB. + A CI job checks `sha256sum -c SHA256SUMS` on every push, so the manifest + and the bytes cannot drift. Deploy path change required: none beyond the + `packages/cultmesh-ts` archive-list fix already owed. Human step: download, + verify, commit (operator-only, section 11.7). +- **Option 2, fetch them.** `native//` is git-ignored; the tree + commits only `MANIFEST.txt`, `SHA256SUMS` and a `scripts/fetch-quic-native.mjs` + (about 80 lines) that downloads the Release assets and verifies digests. + Price: zero binary bytes in git, but every carrier of the package directory + becomes incomplete until the fetch runs: a fresh clone, every worktree, + Heimdall's vendored copy, `npm pack` (a tarball without binaries looks + valid), and the actuator, which must run the fetch and then `tar --append` + the ignored files after `git archive` (cross-repo edit in Odin), or the + deploy script must fetch from GitHub on Yggdrasil at deploy time (cross-repo + edit in gamecult-ops, plus GitHub egress the StreamPixels path does not + have today). It is the "tarball with a `.so` in it by hand" failure the + original Q5 text warned about, moved one step left. + +**Recommended: Option 1.** The tarball is a `git archive`, so committed is the +only state that rides it without a second mechanism; the repo already commits +the same `msquic.dll` for Unity; and the growth is bounded by the MsQuic pin, +not by bridge iteration. Everything below is written for Option 1; Option 2 +changes only 11.4's manifest paragraph, the closure smoke, and the operator +steps, and is not mapped further unless chosen. + +**Ruled 2026-09-16: Option 1.** Operator: "Commit them, yeah." Option 2 is +history. + +### 11.3 Deletes + +None in the tree. The ruling-A surfaces (`packages/cultmesh-quic-native/*`, +`optionalDependencies`, `cultnet-ts`/`cultmesh-ts` publish jobs, new tag +prefixes in `publish-packages.yml:20-24`) are never created; that is the +subtraction, and it is an estimate change, not a diff (section 11.8). + +The existing `@gamecult/cultcache-ts` publish job +(`.github/workflows/publish-packages.yml:39-78`) stays. It is out of this +campaign's scope: it publishes a package this migration does not touch, its +only consumer today reaches it by `file:` (`F:\Projects\Heimdall\package.json:22` +`(source read)`), and it is the shape the parked registry pass will copy for +`cultnet-ts` and `cultmesh-ts`. Whether it should run before then is a +question for that pass. + +### 11.4 Keeps and moves + +- `scripts/build-quic-native.ps1` and the Unity plugin binaries are untouched + (5.4 deletion line). `scripts/build-quic-native.sh` is the cut-3 script, + unchanged here. +- The MsQuic license text already committed at + `unity/org.gamecult.cultlib/Third Party Notices/MSQUIC-LICENSE.txt` is + copied, not referenced, to `packages/cultmesh-ts/native/MSQUIC-LICENSE.txt`, + because the package directory must be self-contained once copied out of the + repo (11.1, pnpm). Same MIT text for both platforms. + +### 11.5 Adds + +- `packages/cultmesh-ts/native/win32-x64/gamecult_mesh_quic_native.dll`, + `packages/cultmesh-ts/native/win32-x64/msquic.dll`, + `packages/cultmesh-ts/native/linux-x64/libgamecult_mesh_quic_native.so`, + `packages/cultmesh-ts/native/linux-x64/libmsquic.so.2` (the real file, not + the symlink; `RPATH $ORIGIN` from cut 3 resolves it beside the bridge). + Directory names are exactly `${process.platform}-${process.arch}` so the + cut-4 resolver needs no table. +- `packages/cultmesh-ts/native/SHA256SUMS`: `sha256sum` format, one line per + binary, relative paths, generated by the workflow and committed verbatim. +- `packages/cultmesh-ts/native/MANIFEST.txt` (about 20 lines, `key=value`): + `msquic.version=2.5.9`; `msquic.windows.source` = the NuGet URL at + `build-quic-native.ps1:30` with its SHA-256 from `:14`; + `msquic.linux.source` = the deb pool URL from P7 with its SHA-256; + `bridge.commit` = the CultLib commit the bridge was built from; + `build.workflow_run` = the Actions run URL; `build.release` = the Release + tag; `build.win32-x64.host` = runner image plus MSVC version as printed by + the job; `build.linux-x64.host` = `ubuntu-latest` plus the `debian:13` + digest plus `g++` version as printed; and the date. Every value is copied + from the run log by the operator, then the CI check below keeps the file + and the bytes agreeing. The binding never reads this file; it exists for + readers and for the digest check. +- `.github/workflows/quic-native.yml` (about 120 lines), four jobs: + - `build-win32-x64` on `windows-latest`: checkout, run + `scripts/build-quic-native.ps1 -OutputDirectory artifacts/quic-native/win32-x64`, + print `cl.exe` version and `Get-FileHash` of both files, upload + `actions/upload-artifact` named `quic-native-win32-x64`. + - `build-linux-x64` on `ubuntu-latest` with + `container: debian:13@sha256:f324c7ff54321e8d9c588493a20244965938ce0aa50bbd1022d38010e9ffc4b1` + (Q6 A; the digest is the pin, the tag is the label): `apt-get install -y + cmake ninja-build g++ curl ca-certificates dpkg`, run + `scripts/build-quic-native.sh`, print `g++ --version` and `sha256sum`, + upload `quic-native-linux-x64`. No Node in this job; loading is proven by + the interop job below, on the same image. + - `release`, `needs` both, `if: startsWith(github.ref, 'refs/tags/cultmesh-quic-native-v')`, + `permissions: contents: write`: download both artifacts, write + `SHA256SUMS` and a draft `MANIFEST.txt` with every value the jobs printed, + and run `gh release create "$GITHUB_REF_NAME" --verify-tag` with the two + per-platform `.tar.gz` files, `SHA256SUMS` and `MANIFEST.txt` as assets + (`GH_TOKEN: ${{ github.token }}`; `gh` is preinstalled on hosted runners, + no third-party release action). The release notes are the manifest. + - `verify-committed` on `push` and `pull_request`, `ubuntu-latest`, one + step: `cd packages/cultmesh-ts/native && sha256sum -c SHA256SUMS`. This is + the check that the tree's bytes are the bytes the manifest names. + - Triggers: `push` to `main` and `pull_request` run `verify-committed` + only; `workflow_dispatch` runs the two builds (dry run, uploads + artifacts, no release); a `cultmesh-quic-native-v*` tag runs all four. + Only `release` has write permission. +- `packages/cultmesh-ts/package.json:14-16`: `"files": ["dist", "native"]`. + No version bump: under C nothing keys on the version; provenance keys on + the commit in `MANIFEST.txt`. +- `packages/cultmesh-ts/src/realtime-quic-native.ts` (cut 4): the runtime + class gains a readonly `nativeDirectory` (the absolute directory it loaded + from). Diagnostic only; the closure smoke asserts on it. +- `scripts/test-typescript-package-closure.mjs`: + - `:39-41`: for `cultmesh-ts`, assert the packed file list contains all + four binaries, `native/SHA256SUMS`, `native/MANIFEST.txt` and + `native/MSQUIC-LICENSE.txt`, on every host (the tarball carries both + platforms; the host only decides which loads). + - `:59-70`: the runtime smoke adds + `assert.equal(typeof mesh.CultMesh.createQuicRealtimeConnector, "function")`, + the same for `createQuicRealtimeProvider`, then opens a + `CultMeshQuicNativeRuntime`, asserts + `runtime.nativeDirectory` ends with `node_modules/cultmesh-ts/native/` + (path separators normalised), and closes it. The child at `:70` runs with + `CULTMESH_QUIC_NATIVE_DIR` deleted from its env so the default path is the + one exercised. The point: the binaries load from the installed copy of the + package, not from a repo path or a registry. +- `.github/workflows/cultnet-interop.yml`: + - After the C# RUDP step (`:127-128`): a step building the Windows bridge + (`scripts/build-quic-native.ps1 -OutputDirectory artifacts/quic-native/win32-x64`) + and a step running the `QUIC realtime` lanes with + `CULTMESH_QUIC_NATIVE_DIR` set to that directory, so CI proves the lanes + against a fresh build, then a second run of + `node scripts/test-typescript-package-closure.mjs` proves the committed + Windows binaries load without the env var. + - A second job `interop-quic-linux` on `ubuntu-latest` with the same pinned + `debian:13` container: `apt-get install` the build tools plus `libicu` + (dotnet's runtime need), `actions/setup-dotnet@v4` 10.0.x and + `actions/setup-node@v4` 24 (both work inside a container), build the + bridge with `scripts/build-quic-native.sh`, `npm ci`, run only the + TypeScript-provider-to-managed-connector and TypeScript-to-TypeScript + lanes (section 15: the native-connector lane is Windows by design), then + the closure script without the env var. The container is not optional: + the artifact is linked against Debian 13's glibc 2.41 and `ubuntu-latest` + (24.04) carries glibc 2.39 `(probe: ldd --version in both images)`, so a + symbol version the bridge or `libmsquic` references can be absent on the + bare runner; run the lanes on the image the artifact targets rather than + discover that per symbol. +- `README.md` of `packages/cultmesh-ts` gains a "QUIC Realtime Plane" section + after "RUDP Helpers" (`README.md:332`) with provider and consumer examples + matching the C# README (`src/GameCult.Mesh.Quic/README.md:13-62`), and a + "Native binaries" paragraph: where they live, that a `file:` dependency or + an `npm pack` tarball carries them, the `CULTMESH_QUIC_NATIVE_DIR` + override, the two provenance files, Windows x64 and Linux x64 (Debian 13 + glibc) only, and the four `libmsquic` runtime dependencies (P7) a Linux host + must already have. + +### 11.6 Per-file changes + +- `packages/cultmesh-ts/package.json:14-16`, `files` gains `"native"`. +- `packages/cultmesh-ts/src/realtime-quic-native.ts` (cut 4 file), one + readonly field `nativeDirectory` set at load. +- `scripts/test-typescript-package-closure.mjs:39-41`, `:59-70` as above; + `:9` unchanged (no new packages). +- `.github/workflows/cultnet-interop.yml`, two steps after `:128`, one job + after `:140`. +- `.github/workflows/quic-native.yml`, new. +- `.github/workflows/publish-packages.yml`, unchanged. +- `packages/cultmesh-ts/native/` (seven files), new, four of them binary and + operator-committed (11.7). +- `packages/cultmesh-ts/README.md`, one section after `:332`. + +### 11.7 Verification + +- `node scripts/test-typescript-package-closure.mjs` on Windows, with + `CULTMESH_QUIC_NATIVE_DIR` unset in the shell. Pins: the tarball carries + both platforms and the provenance files; the installed copy loads its own + binaries. +- `cd packages/cultmesh-ts/native && sha256sum -c SHA256SUMS` (Git Bash on + Windows). Pins: committed bytes equal the manifest. +- `git check-ignore -v packages/cultmesh-ts/native/linux-x64/libmsquic.so.2` + must exit 1 (not ignored), and + `git ls-files packages/cultmesh-ts/native | wc -l` must print 7. Pins: the + binaries are tracked, so a `git archive` carries them. +- `npm pack packages/cultmesh-ts --dry-run --json | node -p "JSON.parse(require('fs').readFileSync(0,'utf8'))[0].files.map(f=>f.path).filter(p=>p.startsWith('native/')).join('\n')"` + must list seven `native/` paths; the closure script already asserts this, + this is the one-liner for a reader. +- `workflow_dispatch` of `quic-native.yml`: both build jobs green, artifacts + present, no release created. A tag push `cultmesh-quic-native-v` + creates the Release with four assets. Pins: Q6 A, the builder is a Linux + host on the deploy OS and the artifact has a public, digest-named home. +- Negative greps (must return nothing): + `rg -n "optionalDependencies|cultmesh-quic-native-(win32|linux)|@gamecult/cultmesh-quic-native" packages scripts .github --glob '!**/node_modules/**' --glob '!**/dist*/**'` + (no platform packages exist); + `rg -n "node_modules|require\.resolve" packages/cultmesh-ts/src/realtime-quic-native.ts` + (the resolver never searches for a package); + `rg -n "\"(pre|post)install\"" packages/*/package.json` (no install-time + compile or download); + `rg -n "NPM_TOKEN|npm publish|registry-url" .github/workflows/quic-native.yml` + (the native workflow publishes to no registry). +- Operator-only, in order: + 1. After the tag build, download the Release assets, compare every digest + with the run log and with `SHA256SUMS`, place the binaries under + `packages/cultmesh-ts/native//`, fill `MANIFEST.txt` from the + log, commit. This is the only path bytes take into the tree; no workflow + writes to `main`. + 2. Yggdrasil smoke, which installs from what C ships (the archived tree) + and nothing else. On Starfire, at the commit from step 1: + `git -C F:\Projects\CultLib archive --format=tar --output=$env:TEMP\cultlib-quic-smoke.tar ` + (the actuator's own mechanism, `deploy-yggdrasil-streampixels.ps1:51,59`, + whole tree), then `sftp` it to `gamecultadmin@yggdrasil.gamecult.org:/home/gamecultadmin/`. + On Yggdrasil: + `mkdir -p /tmp/cultmesh-quic-smoke && tar -xf ~/cultlib-quic-smoke.tar -C /tmp/cultmesh-quic-smoke && cd /tmp/cultmesh-quic-smoke`; + `(cd packages/cultmesh-ts/native && sha256sum -c SHA256SUMS)` (the bytes + that arrived are the bytes the manifest names); + `ldd packages/cultmesh-ts/native/linux-x64/libmsquic.so.2 | grep "not found"` + must print nothing. If it prints, the missing ones are among + `libnuma1`, `libxdp1`, `libnl-route-3-200` (P7; `libssl3t64` is base): + under C nothing installs them because the deb itself is never installed + on the host, so `sudo apt-get install` them once and record it in + `gamecult-ops/inventory.md` beside the Node line (`:660`). Then + `npm ci` (registry access from Yggdrasil is the deploy path's own + assumption, `deploy-streampixels-preview.sh:102`) and + `node scripts/test-typescript-package-closure.mjs` with the env var + unset: this is the same smoke CI runs, now on Node 24.14.1 (P8) on the + deploy host, loading `node_modules/cultmesh-ts/native/linux-x64`. + Then the handshake: `npm run test --workspace packages/cultmesh-ts` + (builds `dist-test` and runs the cut-4/5 suites on the host), then a + throwaway PKCS12 + (`openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -nodes -subj /CN=127.0.0.1 -days 2 -keyout k.pem -out c.pem && openssl pkcs12 -export -inkey k.pem -in c.pem -passout pass:smoke -out smoke.p12`), + `node packages/cultmesh-ts/dist-test/test/interop/cultmesh-quic-peer.js serve --frames 5 --delivery latest-only --pkcs12 smoke.p12 --password smoke` + in one shell (it prints the advertised endpoint), and + `node packages/cultmesh-ts/dist-test/test/interop/cultmesh-quic-peer.js dial --endpoint --expect 5` + in a second, which must print five frames. If cut 5 landed `serve` with + a generated certificate instead of `--pkcs12/--password` flags, add the + flags in this cut; the smoke needs a certificate it can name. Finish + with `rm -rf /tmp/cultmesh-quic-smoke ~/cultlib-quic-smoke.tar`. This is + the only place the Linux artifact is proven on the deploy host, and only + the operator holds the key. + 3. Nothing here touches `/srv/streampixels`; StreamPixels adoption + (archive list, `:97`, its stale lockfile) is consumer work (section 15, + section 16). + +### 11.8 Subtraction estimate delta against section 14 + +Row 6 of the table read `0 removed, 60 (manifests) + 130 (workflow) + 30 +(closure) + 60 (README) = +280` with `+2 optional platform packages` and `+3 +publish jobs` in the dependencies line. Under C: + +- Removed: 0 (the `cultcache-ts` job stays, 11.3). +- Added text: about 120 (`quic-native.yml`) + 40 (interop workflow) + 30 + (closure) + 70 (README) + 25 (`MANIFEST.txt`, `SHA256SUMS`) + 1 + (`package.json`) = about +285, the same order as before; the 60 lines of + platform-package manifests are gone and the release/verify jobs take their + place. +- Added binary: four files, about 8.0 MB in the tree under Option 1, 0 under + Option 2. Section 14 has no column for this; it is the real price of C and + is stated here so it is not hidden in a line count. +- Dependencies line becomes: +0 optional platform packages (was +2); +0 + publish jobs (was +3); +1 workflow file with four jobs (two builds, one + release, one digest check) and +1 job in the interop workflow (was "+1 CI + job"). Runtime dependency unchanged: `koffi` only. +- Campaign total: about +3,900 source lines, unchanged; plus 8.0 MB of + committed binaries. + +### 11.9 Parked seam: registry publication (later pass) + +Not in this campaign, by the operator's choice (section 13). When it is +picked up, it reattaches here without remapping the rest: + +- `publish-packages.yml` gains `cultnet-ts` and `cultmesh-ts` jobs shaped like + `:39-78`, tag prefixes at `:20-24`, dispatch options at `:30-33`; the + `cultmesh-ts` job `needs` the two `quic-native.yml` build jobs (or the + workflow is merged) and publishes the artifacts they already produce as + `@gamecult/cultmesh-quic-native-{win32-x64,linux-x64}` platform packages. +- `packages/cultmesh-ts/package.json` gains `optionalDependencies` on those + two names; `realtime-quic-native.ts` gains a third resolution branch after + the env var and before the committed `native/` directory, or the committed + directory is retired in the same pass. +- Naming (unscoped `cultnet-ts`/`cultmesh-ts` versus `@gamecult/*`) is the + original Q5 A/B fork, still open for that pass; P14 recorded all names + unclaimed on 2026-09-16. +- Its Body precondition is an `NPM_TOKEN` repository secret minted on + npmjs.com, which the operator can now reach (section 13). + +## 12. Cut 7 (documentation and ledgers) + +- `docs/runtime-parity-scope.md:38` TypeScript row: add "CultMesh QUIC + realtime provider and consumer over CultLib-owned MsQuic bindings (Windows + x64, Linux x64), byte-parity with C#, cross-process interop lanes" to + "Claimed parity"; add "QUIC datagrams (`Unreliable`), browser QUIC" to "Not + claimed". +- `src/GameCult.Mesh/docs/transport-planes.md:35-46`: name the TypeScript + provider/consumer beside the .NET and Unity bodies; `:122-125`: state that + `CULTMESH_NATIVE_EXTERNAL_ENDPOINT` now accepts any provider and is driven + by the TypeScript interop harness. +- `docs/cultnet-transport-parity.md`: no change. It maps RUDP/TCP/LiteNetLib + ownership; the realtime plane is a CultMesh plane, not a CultNet transport + profile, and pretending otherwise would put QUIC into a document whose cut + line says "Do not put UDP packet mechanics into CultMesh" the other way + round. +- `docs/parked-features.md`: one entry, "Node Odin WebSocket rendezvous", + pointing at `cultmesh-browser/src/index.ts:84-191` as the browser owner and + the `ICultMeshRealtimeLookupSource` port as the seam (Q7). +- `docs/typescript-quic-realtime-target.md:5-7`: status line updated to point + at this map. +- Under Q5 C, the delivery story every document tells is the one in section + 11: the binding ships inside `packages/cultmesh-ts/native/`, provenance + lives in `MANIFEST.txt` and `SHA256SUMS`, and consumers keep `file:` paths. + `native/GameCult.Mesh.Quic.Native/README.md` (cut 3) and + `packages/cultmesh-ts/README.md` (cut 6) both point at `MANIFEST.txt` as the + provenance owner rather than restating versions or digests. The parity row + above says "bindings shipped in the `cultmesh-ts` package tree", not + "published". Registry publication is described in exactly one place, as + parked: section 11.9 of this map. + +Verification: `rg -n "CultMeshRealtimeTransports.cs" docs src/GameCult.Mesh/docs` +returns only correct paths; +`rg -n -i "registry|npm publish|platform package|optionalDependencies" packages/cultmesh-ts/README.md native/GameCult.Mesh.Quic.Native/README.md docs/runtime-parity-scope.md src/GameCult.Mesh/docs/transport-planes.md` +returns nothing (the only permitted mentions are this map's sections 11.9 and +13 and the target's history). + +## 13. Operator questions + +The four rulings in the target (Q1-Q4) are closed and not reopened. These are +the forks the probes surfaced. + +- **Q5. Registry names.** The binding cannot ship as prebuilt platform + packages without `cultmesh-ts` itself being on a registry, and today every + consumer uses `file:` paths and only `@gamecult/cultcache-ts` is published + (P15, P16). All candidate names are unclaimed (P14). A: publish `cultnet-ts` + and `cultmesh-ts` under their existing unscoped names (no import changes in + any of the 11 consuming repos) and put only the new native platform packages + under `@gamecult/cultmesh-quic-native-{win32-x64,linux-x64}`. B: scope + everything as `@gamecult/*` now and take the import rename across consumers + as a separate consumer task. C: no registry; ship the binaries inside the + CultLib tarball the deploy script already extracts on Yggdrasil + (`deploy-streampixels-preview.sh:95-99`), keeping `file:` consumption. + **Recommended: A.** It reshapes nothing consumers use, matches the + `cultcache-ts` precedent of scoping only what is new, and gives StreamPixels + a versioned artifact instead of a tarball with a `.so` in it. C is the + cheapest but leaves the deploy path owning a native binary by hand, which is + the failure the target's "shipped through a registry" phrase was written to + avoid. +- **Q6. Linux release builder.** A: GitHub Actions `ubuntu-latest` with + `container: debian:13` (same OS as Yggdrasil, P8), artifact published by the + workflow, verified on Yggdrasil by the operator smoke in cut 6. B: build on + Yggdrasil in the deploy script (installs CMake and g++ on a live public + host; every deploy compiles). C: build on Starfire's Docker `debian:13` + engine (P12) and publish from the workstation. **Recommended: A.** It is a + Linux host, it is reproducible from a tag, and it keeps compilers off + Yggdrasil. C is kept for the development loop only. +- **Q7. Node-side Odin rendezvous.** The TypeScript consumer needs a route + source. The browser package has an Odin WebSocket rendezvous + (`cultmesh-browser/src/index.ts:84-191`); Node 24 has a global `WebSocket`, + so it would run, but `cultmesh-ts` may not depend on `cultmesh-browser` + (Q2's spirit), and the first consumer of the Node QUIC path is the interop + harness, not a product. A: ship the lookup-source port plus a static source + now, park the Node Odin rendezvous with a note. B: move the Odin rendezvous + into `cultnet-ts` beside the verifier in this migration so Node and browser + share it. **Recommended: A.** B is the right end state but is a second + ownership move in one pipeline; it should follow once a Node consumer that + discovers through Odin exists. + +Not asked, because the target already decided them: datagrams stay out (Q4); +no TLS on TCP planes (Q1); Windows x64 and Linux x64 only (Q3); the verifier +moves to a shared browser-safe module (Q2, section 6 names the module). + +### Rulings, 2026-09-16 + +The operator took all three recommendations the same day the map was written. +Each is now a standing ruling; the options above are history. + +- **Q5 ruled A, then re-ruled C the same day.** A had `cultnet-ts` and + `cultmesh-ts` publishing under their unscoped names with only the two native + platform packages scoped. The re-ruling was first stated as necessity ("we + don't even have npm access and cannot get it because our entire subnet is + blocked"); the operator corrected that Body fact the same day after + reaching npm signup: "apparently that was true yesterday." The registry is + reachable from Starfire (`npm ping` answers, section 11.1 `(probe)`), and an + `NPM_TOKEN` can be minted. **C still stands for this campaign, by choice: + no registry.** In the operator's words, registry publication is "still for + a later pass". Consumers keep `file:` paths. The native binaries ship inside + the `cultmesh-ts` package tree that the deploy path's `git archive` carries, + and Q6's Actions build attaches both platform artifacts to a GitHub Release + instead of publishing packages. Registry publication of `cultnet-ts`, + `cultmesh-ts` and the native binaries is parked, not ruled out; section 11.9 + names the seam it reattaches to, and the original A/B naming fork stays + open for that pass. Cut 6 is remapped under C (section 11); section 5.4, + Cut 4's binary resolution and dependency lines, and Cut 7's ledger follow + it. The one fork C surfaces, whether the binaries are committed or fetched + from the Release, is Q8 in section 11.2. +- **Q8 ruled Option 1.** The four native binaries are committed at + `packages/cultmesh-ts/native//` with their manifest and digests, + so they ride the `git archive` the deploy path already builds. Operator's + words: "Commit them, yeah." +- **Q6 ruled A.** The Linux release artifact is built by GitHub Actions on + `ubuntu-latest` inside `container: debian:13`, published by the workflow, + and verified by the operator smoke on Yggdrasil in cut 6. The Docker + `debian:13` engine on the workstation is the development loop only; nothing + it produces is a release artifact. No compiler is installed on Yggdrasil. +- **Q7 ruled A.** Cut 4 ships the `ICultMeshRealtimeLookupSource` port and a + static source. The Node Odin WebSocket rendezvous is parked with a note in + cut 7's ledger; it moves into `cultnet-ts` beside the verifier in a later + pipeline, once a Node consumer that discovers through Odin exists. + +## 14. Subtraction estimate + +Both sides of the number, by cut, in source lines (tests included, generated +`dist*` excluded, vector JSON excluded): + +| Cut | Removed or replaced | Added | Net | +| --- | ---: | ---: | ---: | +| 1 trust module | 119 (browser) | 190 (module) + 150 (tests) + 40 (C# vector test) | +261 | +| 2 codec | 0 | 130 + 120 (TS test) + 120 (C# test) | +370 | +| 3 bridge | ~200 rewritten of 440 C++; 24 CMake | ~1,000 C++ (replacing 440), 60 CMake, 70 sh, 40 README | +~700 net C++/build | +| 4 consumer | 0 | 260 (binding) + 400 (consumer/session manager) + 400 (tests) + 200 (C# interop mode) + 150 (harness) + 120 (peer script) | +1,530 | +| 5 provider | 0 | 250 (provider) + 300 (tests) + 150 (harness) + 40 (C# tests) | +740 | +| 6 packaging | 0 | 60 (package manifests) + 130 (workflow) + 30 (closure smoke) + 60 (README) | +280 | +| 7 docs | ~10 | ~40 | +30 | +| Total | ~350 | ~4,260 | about +3,900 | + +Dependencies: +1 runtime dependency on `cultmesh-ts` (`koffi`, 1.7 MB, MIT, +loaded lazily); +0 optional platform packages; +0 build-time Node +dependencies (no node-gyp, no node-addon-api, no cmake-js). Targets: +0 .NET +projects (the C# interop peer gains one project reference); +1 CMake platform +branch; +1 shell build script; +1 workflow file with four jobs; +1 job in +the interop workflow; and, under Q8 option 1, about 8.0 MB of committed +binaries. *(This line first read "+2 optional platform packages; +3 publish +jobs; +1 CI job" under ruling A; section 11.8 carries the delta.)* + +Why the number is positive and still acceptable: the target orders a new +capability (a QUIC realtime plane in a runtime that has none), and every line +above either is that capability, proves it against the C# reference, or ships +it. The subtraction that was available (one verifier instead of two, one +MsQuic body instead of two, one framing implementation per language instead +of one per host) is taken in cuts 1 and 3. Anything that would have shrunk +the number further (a third-party QUIC stack, a callback-driven addon, a +tarball with a `.so`) was rejected in section 4 for reasons that are not +about line count. + +## 15. Not assignable to a cut + +- **The Unity package release** carrying the rebuilt bridge DLL. The v1 ABI + is preserved, so no cut requires it, but the committed DLL will lag the + source until the operator runs `scripts/build-unity-package.ps1` and + commits. Recorded here so nobody reads the stale DLL as evidence the + rewrite did not happen. +- **StreamPixels certificate provisioning** (which PKCS12, where it lives on + Yggdrasil, how its pin reaches the Odin route). Consumer work by the target. +- **A nonce on the QUIC plane.** The target lists "a replayed nonce" among + trust negatives, but the QUIC plane has no nonce exchange in C# either + (`CultMeshQuicRealtimeTransport.cs` opens no session message; trust is the + Odin route plus the TLS pin, `transport-planes.md:71-73`). Cut 4 tests the + replay class that does exist (route generation). Adding a nonce is a + cross-runtime protocol change and needs its own target. +- **Linux coverage of the C# native connector.** `CanConnect` is Windows-only + (`CultMeshNativeQuicRealtimeTransport.cs:40`); the Linux interop job in cut 6 + therefore runs the TypeScript-provider-to-managed-connector lane and the + TypeScript-to-TypeScript lanes only. The native-connector lane is Windows + by design, matching where Unity runs. +- **The `cultcache-ts` naming split** across consumers (section 3). Out of + scope. Q5 C touches no package name and publishes nothing, so it makes the + split neither better nor worse; the split becomes the parked registry + pass's problem (section 11.9), where the A/B naming fork is still open. + One consequence to carry there: StreamPixels' lockfile resolves + `cultmesh-ts`'s cache dependency as unscoped `cultcache-ts` + (`F:\Projects\StreamPixels\pnpm-lock.yaml:2561-2564` `(source read)`) while + `packages/cultmesh-ts/package.json:46` now names `@gamecult/cultcache-ts`, + so a `pnpm install --frozen-lockfile` against the current tree would refuse + before any QUIC code is reached. Consumer work, recorded so the Yggdrasil + smoke in section 11.7 is not mistaken for StreamPixels adoption. + +## 16. Reminder of what a wrong cut looks like + +If a cut touches `src/GameCult.Mesh/CultMeshTcp*.cs`, adds TLS to the TCP +schema or content connectors, adds WebTransport to `cultmesh-browser`, adds +QUIC to `cultnet-py`, `cultnet-rs`, or `cultmesh-kotlin`, or edits anything +under `F:\Projects\StreamPixels`, it has left the target's "Not in this +migration" list and is wrong. Stop and re-read this map. diff --git a/docs/typescript-quic-realtime-target.md b/docs/typescript-quic-realtime-target.md new file mode 100644 index 00000000..751d5277 --- /dev/null +++ b/docs/typescript-quic-realtime-target.md @@ -0,0 +1,160 @@ +# TypeScript QUIC Realtime Plane Target + +Date: 2026-09-16 + +Status: target accepted by the operator (2026-09-16), ready for Eureka. No cut +map exists yet. When the pipeline starts, Imagination maps the cut into +`docs/typescript-quic-realtime-cut.md` against `main` at `a0813c6` or later. + +The TypeScript runtime gains the CultMesh QUIC realtime state plane that the C# +runtime already has: a provider that serves frames and a consumer that receives +them, byte-compatible with `GameCult.Mesh.Quic` and the native MsQuic connector +the Unity package ships. This document states the end state and the invariants +that constrain getting there. + +Operator ruling, 2026-09-16, on providing QUIC for a Node service: "Option 2 all +the way, this is what CultLib is supposed to be, we're not half assing it." A +separate .NET provider process and a WebSocket shortcut were both rejected. + +## Why now + +The first consumer is StreamPixels. Its service (Node 24, TypeScript, on +Yggdrasil) must publish realtime state to a Unity overlay running on a +streamer's machine. The overlay is a receive-only client using the Unity +package's `CultMeshNativeQuicRealtimeTransportConnector`. Today no TypeScript +path exists: + +- Node v24.15.0 has no `node:quic`, with or without `--experimental-quic`. +- `packages/cultmesh-ts` and `packages/cultnet-ts` contain no QUIC code. +- `GameCult.Mesh.Quic` (.NET 10, `System.Net.Quic`) is the only QUIC provider. +- The C# TCP control and content connectors are plaintext and restricted to + loopback (`src/GameCult.Mesh/docs/transport-planes.md`, "Security and release + gate"), so they cannot carry the overlay's remote session either. + +## This touches the foundation + +- **Wire parity is an invariant.** The C# codec is the reference: + `src/GameCult.Mesh/CultMeshRealtimeWireProtocol.cs`. The TypeScript runtime + must produce and accept identical bytes: + - ALPN `cultmesh-state-v1`; connection close code `0x43554c54`, stream abort + code `0x53544154`; reliable stream type `1`, latest-only stream type `2`. + - Frame: magic `0x31545343`, then a 37-byte little-endian fixed header + (delivery byte, producer epoch i64, sequence i64, channel/schema/body id + lengths u16, payload length i32, header size i32 = 37, wire version u16 = + 1), then UTF-8 channel id, schema id, body id, then payload. + - Limits: payload at most 64 MiB; each identity at most 65,535 UTF-8 bytes; + decode rejects wrong magic, unknown version, out-of-range delivery, and any + length that does not sum exactly. +- **Delivery semantics are an invariant** + (`src/GameCult.Mesh.Quic/README.md`, `CultMeshRealtimeTransports.cs`): + - `ReliableOrdered`: one persistent ordered stream; broadcast is + completion-bearing. + - `LatestOnly`: independent streams; at most one pending frame per + `(channel, body)`, replaced by a newer `(producer epoch, sequence)` + generation; a keyed coalescing outbox per physical peer, so a slow or + departed consumer never backpressures the producer. + - `Unreliable`: fails closed until datagrams are exposed, matching the managed + C# adapter. +- **Trust is an invariant.** No remote session comes online without the chain + in `transport-planes.md`: an Odin-signed `CultMeshRouteCertificate` (Verse, + authority runtime, protocol set, endpoint, generation, validity, provider + P-256 key) checked against consumer-pinned Odin roots, TLS 1.3, and the + endpoint certificate bound to that route, including the + `cultmesh-state+quic://host:port?cert-sha256=` pin. + Signatures are ECDSA P-256 over SHA-256 with P1363 `r || s` encoding and the + length-prefixed canonical transcript. Unsigned traffic exists only under an + explicit `LocalDevelopment` policy on loopback. +- **One implementation of TypeScript route verification.** `cultmesh-browser` + already verifies Odin route certificates and provider nonce possession with + WebCrypto (`packages/cultmesh-browser/src/index.ts`, `verifyAuthorityRoute`, + `canonicalRoute`, `canonicalSession`, `verifyP256`). The Node QUIC path must + reuse that owner, not grow a second verifier. +- **The realtime plane carries state frames only.** Schemas, commands, + receipts, manifests, and immutable content do not travel through it + (`ICultMeshRealtimeTransport` doc comment). RUDP is never installed + implicitly in its place. +- **Existing consumers survive.** The StreamPixels service already imports + `cultcache-ts`, `cultnet-ts`, and `cultmesh-ts` (`verse-state.ts`, + `idunn-rudp-health.ts`) for Odin advertisement and Idunn health over RUDP. + Imagination audits every other TypeScript consumer across `F:\Projects` + before sizing the cut. + +## Target state + +- `cultmesh-ts` exposes a QUIC realtime provider and a QUIC realtime consumer + with the same ergonomic shape as the C# `CultMeshQuicRealtimeServer` + (listen, broadcast with an explicit delivery mode) and + `ICultMeshRealtimeTransportConnector` (connect by advertised candidate, + receive frames), under the branded `CultMesh` entrypoint. +- QUIC comes from native MsQuic bindings owned by CultLib, not from a Node + polyfill or a third-party QUIC stack with different semantics. How the binding + is built and shipped is the means (Imagination probes it); what it must + deliver is TLS 1.3, ALPN, independent unidirectional or bidirectional streams, + certificate validation with a caller hook, and clean close and abort codes. +- Frame encoding and decoding exist once in TypeScript and are tested against + bytes produced by the C# codec. +- Application code never picks endpoints, ranks routes, or writes reconnect + loops; `CultMeshSessionManager`-equivalent route selection owns that, as in C#. +- The build produces binaries for the hosts that run them: Windows x64 for + local development, and Linux x64 for Yggdrasil, built on Linux or the deploy + path's builder, not cross-compiled on Starfire. + +## Not in this migration + +One foundation per pipeline. These are separate, named pipelines or consumer +work: + +- **TypeScript content plane** (a provider in `cultmesh-ts`, a verifying HTTPS + reader in `cultmesh-browser`) for exported character artifacts. HTTPS content + transport and single-host trust on Yggdrasil were already ruled. +- **Authenticated remote control plane** (TLS on the TCP schema and content + connectors). See Q1. +- **Browser QUIC** (WebTransport). Browsers keep the verified WebSocket path. +- **Python, Rust, and Kotlin QUIC.** The parity scope is role-scoped; this + migration claims TypeScript and C# only. +- **StreamPixels integration** (service publication, overlay subscription, and + the catalog and scene-intent schemas) is consumer work in StreamPixels after a + released `cultmesh-ts` exists. + +## Verification the cut must reach + +- Golden frame bytes from the C# codec decode in TypeScript, and TypeScript + encodings decode in C#, for every delivery mode and at the length limits. + Malformed inputs are rejected identically. +- Separate processes, both directions: a TypeScript provider to the C# native + connector (the one Unity uses) and to the managed connector, and a C# managed + provider to the TypeScript consumer. Extend the existing parity harnesses + (`CULTMESH_NATIVE_EXTERNAL_ENDPOINT`, `packages/cultnet-ts/test/interop`) rather + than adding a parallel one. +- `LatestOnly` coalescing: a stalled consumer does not delay the producer, and + the consumer converges on the terminal generation. +- Trust negatives: an expired or unsigned route, the wrong Odin root, a + mismatched `cert-sha256` pin, and a replayed nonce are each refused, with a + mutation per rule. +- The Linux x64 binary runs on the Yggdrasil deploy path, verified on that host. + +## Rulings (operator, 2026-09-16) + +The operator accepted every recommendation below ("You got it"). Each question +is kept with its options as the record of what was decided against. + +- **Q1. Which remote plane carries the overlay's non-frame data?** The realtime + plane forbids schemas, commands, and content, and the TCP planes are + loopback-only. A: publish her character, the subathon window, and scene + intents as QUIC state frames with their CultCache schema id and payload, and + ship the costume catalog as a versioned immutable artifact on the HTTPS + content plane; the overlay sends no commands, so it needs no remote control + plane. B: add TLS to the TCP schema and content connectors as its own + pipeline first. **Recommended: A.** It needs no new plane for M1, matches a + receive-only client, and leaves TLS TCP to the first consumer that sends + commands. +- **Q2. Where does shared TypeScript route verification live?** It is inside + `cultmesh-browser` today, and `cultmesh-ts` is Node-only. A: move it to a + browser-safe shared module that both import (for example beside + `cultnet-ts/contracts`). B: have `cultmesh-ts` depend on `cultmesh-browser`. + **Recommended: A**, so neither transport package owns the other's trust. +- **Q3. Which platforms must the native binding support at release?** + **Recommended: Windows x64 and Linux x64 only**, the two hosts that run it + today. +- **Q4. Are QUIC datagrams (`Unreliable`) in scope?** **Recommended: no.** Fail + closed like the managed C# adapter; no consumer needs them. diff --git a/dotnet-tools.json b/dotnet-tools.json new file mode 100644 index 00000000..6da5949f --- /dev/null +++ b/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-stryker": { + "version": "5.0.0", + "commands": [ + "dotnet-stryker" + ], + "rollForward": false + } + } +} diff --git a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt index 2850951d..c3dfc304 100644 --- a/native/GameCult.Mesh.Quic.Native/CMakeLists.txt +++ b/native/GameCult.Mesh.Quic.Native/CMakeLists.txt @@ -1,20 +1,118 @@ cmake_minimum_required(VERSION 3.24) project(gamecult_mesh_quic_native LANGUAGES CXX) -if(NOT WIN32) - message(FATAL_ERROR "The current CultMesh native QUIC connector supports Windows desktop only") -endif() -if(NOT DEFINED MSQUIC_ROOT) - message(FATAL_ERROR "MSQUIC_ROOT must point at the extracted Microsoft.Native.Quic.MsQuic.Schannel package build/native directory") +# Two platforms, one source. Windows takes MsQuic from the pinned OpenSSL NuGet +# layout (MSQUIC_ROOT); Linux takes it from the extracted libmsquic deb, whose +# headers and library land in unrelated places, so they are named separately. +if(NOT WIN32 AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux")) + message(FATAL_ERROR "The CultMesh native QUIC bridge supports Windows x64 and Linux x64") endif() add_library(gamecult_mesh_quic_native SHARED cultmesh_quic_native.cpp) target_compile_features(gamecult_mesh_quic_native PRIVATE cxx_std_20) -target_compile_definitions(gamecult_mesh_quic_native PRIVATE GAMECULT_MESH_QUIC_NATIVE_EXPORTS WIN32_LEAN_AND_MEAN NOMINMAX) -target_include_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/include") -target_link_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/lib/x64") -target_link_libraries(gamecult_mesh_quic_native PRIVATE msquic crypt32 bcrypt) +# include/cultmesh_quic_native.h is the host-facing contract, not an internal +# detail: the bridge includes it, and so does any consumer that can. +target_include_directories(gamecult_mesh_quic_native PUBLIC include) + +if(WIN32) + if(NOT DEFINED MSQUIC_ROOT) + message(FATAL_ERROR "MSQUIC_ROOT must point at the extracted Microsoft.Native.Quic.MsQuic.OpenSSL package build/native directory") + endif() + # Static CRT. A Node or Unity host without the Visual C++ redistributable + # installed cannot load a DLL that imports vcruntime140.dll, and the failure + # arrives as "the specified module could not be found" with nothing naming the + # missing runtime. The bridge carries its own instead. + set_property(TARGET gamecult_mesh_quic_native PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + target_compile_definitions(gamecult_mesh_quic_native PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX) + target_include_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/include") + target_link_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_ROOT}/lib/x64") + # crypt32 and bcrypt belong to the v1 shim alone: CryptHashCertificate2 + # compares the Unity pin. Nothing in the v2 path needs them. ntdll carries + # RtlIpv4/6StringToAddressEx, which msquic_winuser.h's inline QuicAddrFromString + # calls to parse the listener host; the Linux header parses it in-tree instead. + target_link_libraries(gamecult_mesh_quic_native PRIVATE msquic crypt32 bcrypt ntdll) + # The DLL is committed beside its source, so a rebuild must reproduce it: /Brepro drops the link timestamps. + target_compile_options(gamecult_mesh_quic_native PRIVATE /Brepro) + target_link_options(gamecult_mesh_quic_native PRIVATE /Brepro) +else() + if(NOT DEFINED MSQUIC_INCLUDE_DIR OR NOT DEFINED MSQUIC_LIB_DIR) + message(FATAL_ERROR "MSQUIC_INCLUDE_DIR and MSQUIC_LIB_DIR must point at the msquic v2.5.9 headers and the extracted libmsquic library directory") + endif() + target_include_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_INCLUDE_DIR}") + target_link_directories(gamecult_mesh_quic_native PRIVATE "${MSQUIC_LIB_DIR}") + target_link_libraries(gamecult_mesh_quic_native PRIVATE msquic pthread) + # Only the CULTMESH_API exports leave the .so; everything else stays internal. + target_compile_options(gamecult_mesh_quic_native PRIVATE -fvisibility=hidden -fvisibility-inlines-hidden) + # libmsquic.so.2 ships beside the bridge rather than being installed + # system-wide, so the loader is pointed at the bridge's own directory. + set_target_properties(gamecult_mesh_quic_native PROPERTIES + BUILD_WITH_INSTALL_RPATH TRUE + INSTALL_RPATH "$ORIGIN") +endif() set_target_properties(gamecult_mesh_quic_native PROPERTIES OUTPUT_NAME "gamecult_mesh_quic_native" - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + +# The runtime-lifetime scenarios. Off by default: the shipped artifact is the +# library alone, and a delivery build has no business producing an executable. +# CULTMESH_QUIC_DEBUG_ASSERTS goes with them, never into a shipped binary — it +# makes the bridge state the quiesce invariant instead of leaving it to whatever +# a sanitizer happens to catch. +option(CULTMESH_QUIC_BUILD_TESTS "Build the runtime-lifetime scenario runner" OFF) +option(CULTMESH_QUIC_DEBUG_ASSERTS "Abort the bridge on a violated internal invariant" OFF) + +if(CULTMESH_QUIC_DEBUG_ASSERTS) + target_compile_definitions(gamecult_mesh_quic_native PRIVATE CULTMESH_QUIC_DEBUG_ASSERTS) +endif() + +if(CULTMESH_QUIC_BUILD_TESTS) + add_executable(cultmesh_quic_native_tests tests/cultmesh_quic_native_tests.cpp) + target_compile_features(cultmesh_quic_native_tests PRIVATE cxx_std_20) + # The header only. The scenarios drive the bridge as a host does, so they get + # no more of it than a host has. + target_link_libraries(cultmesh_quic_native_tests PRIVATE gamecult_mesh_quic_native) + # The scenarios see the development seam (section 7 of the header) exactly when + # the library has one, so `holdclose` compiles out of the same builds the + # bridge's own assertions compile out of. + if(CULTMESH_QUIC_DEBUG_ASSERTS) + target_compile_definitions(cultmesh_quic_native_tests PRIVATE CULTMESH_QUIC_DEBUG_ASSERTS) + endif() + set_target_properties(cultmesh_quic_native_tests PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + if(WIN32) + # gamecult_mesh_quic_native.dll imports msquic.dll, and the scenario + # runner loads it from its own directory (or PATH) at process start, not + # from MSQUIC_ROOT. build-quic-native.ps1's packaged output gets a copy + # from its own recipe; a test build has no packaging step, so without this + # the loader falls through to whatever msquic.dll happens to already be on + # PATH — silently running the scenarios against an unpinned, wrong-version + # MsQuic instead of failing to start. CMake already knows MSQUIC_ROOT, so + # it places the pinned DLL itself instead of leaving the reader to guess + # why a scenario passed against the wrong binary. + add_custom_command(TARGET cultmesh_quic_native_tests POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + "${MSQUIC_ROOT}/bin/x64/msquic.dll" + "$/msquic.dll") + else() + target_link_libraries(cultmesh_quic_native_tests PRIVATE pthread) + # The linker resolves the bridge's own NEEDED libmsquic.so.2 while linking + # this executable, and the runtime copy only lands beside the binaries after + # the build; point it at the extracted package instead. + target_link_options(cultmesh_quic_native_tests PRIVATE "-Wl,-rpath-link,${MSQUIC_LIB_DIR}") + set_target_properties(cultmesh_quic_native_tests PROPERTIES + BUILD_WITH_INSTALL_RPATH TRUE + INSTALL_RPATH "$ORIGIN") + # Both binaries carry INSTALL_RPATH "$ORIGIN" and expect libmsquic.so.2 + # beside them at load time. build-quic-native.sh's packaged output gets + # that copy from its own recipe; a test build has no packaging step, so + # the runner would otherwise die at once with "cannot open shared object + # file". CMake already knows where MSQUIC_LIB_DIR is, so it places the + # file itself instead of leaving the reader to run an extra cp by hand. + add_custom_command(TARGET cultmesh_quic_native_tests POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + "${MSQUIC_LIB_DIR}/libmsquic.so.2" + "$/libmsquic.so.2") + endif() +endif() diff --git a/native/GameCult.Mesh.Quic.Native/README.md b/native/GameCult.Mesh.Quic.Native/README.md index 875ebb3b..ae5d78d2 100644 --- a/native/GameCult.Mesh.Quic.Native/README.md +++ b/native/GameCult.Mesh.Quic.Native/README.md @@ -1,10 +1,168 @@ # GameCult.Mesh.Quic.Native -This Windows desktop bridge keeps MsQuic's callback-heavy C API below the -managed runtime boundary. It accepts a discovery-authorized SHA-256 certificate -pin, negotiates `cultmesh-state-v1`, and emits complete CultMesh realtime frame -payloads. It owns transport only; frame meaning remains in `GameCult.Mesh`. +One MsQuic body for every CultMesh host that is not .NET: two roles (provider +and consumer), two platforms (Windows x64 and Linux x64), and no callbacks +across the host boundary. -The build consumes Microsoft's pinned -`Microsoft.Native.Quic.MsQuic.Schannel` package. It does not contain -Aetheria-specific code. +The bridge owns MsQuic registration, configuration, listener, connection and +stream handles, TLS credential loading, the `cultmesh-state-v1` ALPN, the +1-byte-kind plus 4-byte-LE-length QUIC stream framing, and one event queue per +runtime. It owns transport and nothing else: it never decodes a CultMesh frame, +never decides delivery semantics, never coalesces, never reconnects, and in the +v2 path never decides whether to trust a certificate. Frame meaning stays in +`GameCult.Mesh` and in the TypeScript codec; trust stays with the host. + +## No host callbacks + +Every crossing is the host calling in, including the one blocking wait. MsQuic's +worker threads only ever push onto the queue and wake that wait, so no host +runtime is called from a thread it does not own. That is what lets one binary +serve a Node process through FFI and a Unity player through P/Invoke without +either one's threading rules leaking into the other. + +It is also why nothing here includes a Node header, a Unity header, or a +JavaScript engine: the bridge does not know what is on the other side. + +## Two ABIs + +**v2** is the runtime-neutral queue API, and the one new hosts should use. It is +stated once, in [`include/cultmesh_quic_native.h`](include/cultmesh_quic_native.h): +the 64-byte event struct with its field order and asserted offsets, the thirteen +exports with their signatures, the id and return-code conventions, the object +lifetime rules and the threading rules. That file is the contract. This README +does not restate it, and where the two ever disagree the header is right. + +A host that can include it should. A host that cannot — koffi, Unity's +P/Invoke — declares the same thing in its own FFI and is checked against the +header by a test rather than by eye. + +Two things worth reading before writing a host, because they are easy to get +wrong from the outside: + +- **Return codes are negative on a bad call, on every platform.** `-1` is a bad + call, `-2` a rejected argument, `<= -1000` a MsQuic refusal. `QUIC_STATUS` + itself is not portable — a negative HRESULT on Windows, a positive errno on + POSIX — so it never reaches a host; `cultmesh_quic_last_status` hands over the + raw value for diagnostics and nothing else. +- **`cultmesh_quic_runtime_close` quiesces.** It marks the runtime closing, wakes + every blocked `cultmesh_quic_next_event`, and waits for every in-flight call to + return before it frees anything. No host call may begin after it starts. + +A client connection defers certificate validation: the bridge indicates the +certificate, emits event 3 carrying the DER, and answers MsQuic only when the +host calls `cultmesh_quic_connection_certificate_complete`. If the host never +answers, MsQuic's 10-second handshake timeout closes the connection and event 4 +reports it. Providers load their certificate as PKCS12; the advertised +`cert-sha256` pin is computed by the host from that same PKCS12, not here. + +**v1** is the five exports the shipped Unity package imports by name +(`cultmesh_quic_open`, `_state`, `_poll`, `_error`, `_close`). They are Windows +only, matching `CultMeshNativeQuicRealtimeTransport.CanConnect`, and are +implemented on top of a private v2 runtime holding one connection. They decide +nothing the v2 path does not, with one exception: a v1 connection carries a +SHA-256 pin that is compared here, in C, because that is the contract the +managed connector was built against. A v2 connection never carries one. + +## Building + +Windows x64, from the repo root: + + powershell -File scripts/build-quic-native.ps1 + +MsQuic comes from `Microsoft.Native.Quic.MsQuic.OpenSSL` 2.5.9, pinned twice: the +NuGet zip by digest and size, and the `msquic.dll` inside it by digest and size, +because the archive is what the download is checked against and the DLL is what +actually ships beside the bridge. The OpenSSL flavour rather than Schannel +because Schannel's MsQuic refuses `QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12`, +which is the only credential type a provider has on both platforms. + +The build uses MSVC with `/Brepro` so that a build reproduces itself: the link +timestamps are dropped, and building the same source twice gives the same bytes. +It links the CRT statically (`/MT`), because a Node or Unity host without the +Visual C++ redistributable cannot load a DLL that imports `vcruntime140.dll`, +and the failure it reports names no missing runtime; the bridge carries its own. + +The committed Unity plugin +(`unity/org.gamecult.cultlib/Runtime/Plugins/x86_64/gamecult_mesh_quic_native.dll`) +is this build: 302,080 bytes, `/MT`, OpenSSL MsQuic, no CRT import. It replaced +an older 40,448-byte build — before `/MT` and before the move off Schannel, +still importing `VCRUNTIME140.dll` and `MSVCP140.dll` — at the CultLib 1.0.60 / +Studio 1.4.0 release. + +Linux x64, on a Debian 13 host: + + scripts/build-quic-native.sh + +MsQuic comes from Microsoft's Debian 13 pool as a pinned `.deb`, and the POSIX +headers from the msquic source tree at the matching tag; all four downloads are +verified by SHA-256. The bridge is linked with `-fvisibility=hidden` so only the +v2 exports leave the `.so`, and with `RPATH $ORIGIN` so the `libmsquic.so.2` +shipped beside it resolves without being installed system-wide. + +A Linux host still needs MsQuic's own runtime dependencies present: +`libssl3t64`, `libnuma1`, `libxdp1`, `libnl-route-3-200`. + +The development loop for it is one committed image, +[`scripts/quic-native-linux-dev.Dockerfile`](../../scripts/quic-native-linux-dev.Dockerfile), +pinned to the same `debian:13` digest the release workflow builds in. It carries +the toolchain, MsQuic's runtime dependencies, and `setarch`, because a +sanitizer build of the runtime-lifetime scenarios needs `personality(ADDR_NO_RANDOMIZE)` +and a container that cannot ask for that cannot run them: + + docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts + docker run --rm --security-opt seccomp=unconfined -v "${PWD}:/src" -w /src cultlib-quic-native-dev bash -lc " + scripts/build-quic-native.sh + cmake -S native/GameCult.Mesh.Quic.Native -B artifacts/quic-native-tests/linux-x64 -G Ninja \ + -DCMAKE_BUILD_TYPE=Release -DCULTMESH_QUIC_BUILD_TESTS=ON -DCULTMESH_QUIC_DEBUG_ASSERTS=ON \ + -DMSQUIC_INCLUDE_DIR=\$(pwd)/artifacts/dependencies/msquic-linux-2.5.9/include \ + -DMSQUIC_LIB_DIR=\$(pwd)/artifacts/dependencies/msquic-linux-2.5.9/package/usr/lib/x86_64-linux-gnu + cmake --build artifacts/quic-native-tests/linux-x64 + for scenario in closerace holdclose holdtimeout polltimeout pollbusy pollhammer zerotimeout payloadfit latecall waitseam; do + setarch -R artifacts/quic-native-tests/linux-x64/bin/cultmesh_quic_native_tests \"\${scenario}\" || exit 1 + done + " + +Both lines are run from the repository root, and the mount is that root wherever +it is: `${PWD}` in PowerShell, `$(pwd)` in a POSIX shell. `MSQUIC_INCLUDE_DIR` +and `MSQUIC_LIB_DIR` need `$(pwd)` too, even though the `cmake` invocation +itself already runs from `/src`: CMake resolves a relative path passed as a +cache variable against the CMakeLists.txt that consumes it +(`native/GameCult.Mesh.Quic.Native`), not against the directory `cmake` was +invoked from, so a bare `artifacts/...` here looks for the dependency one level +too deep and fails the compile before it reaches the loader. The test target's +own build now copies `libmsquic.so.2` from `MSQUIC_LIB_DIR` beside the built +binaries, so nothing else here needs the packaged output directory `scripts/build-quic-native.sh` +produces. `CULTMESH_QUIC_BUILD_TESTS` +is off in the shipped configuration (see the CMakeLists.txt option comment); it +turns on the scenario runner `tests/cultmesh_quic_native_tests.cpp` compiles into, +and `CULTMESH_QUIC_DEBUG_ASSERTS` turns on both the bridge's internal invariant +assertions and the four scenarios (`holdclose`, `latecall`, `holdtimeout`, +`waitseam`) that need the development seam in section 7 of the header. Each +scenario name is a positional argument to the built binary; run them individually +to bisect a failure, or all ten as shown to cover the runtime-lifetime rules. + +A Windows clone made before `.gitattributes` kept shell scripts at LF still has +`scripts/build-quic-native.sh` with carriage returns, and pulling does not fix +it: the script's content did not change, so git neither rewrites it nor reports +it modified. The container then dies at once on the interpreter `bash\r`. From +the repository root, in either shell, this checks the script out again under the +current attributes: + + git rm --cached -q scripts/build-quic-native.sh; git checkout HEAD -- scripts/build-quic-native.sh + +`--security-opt seccomp=unconfined` is load-bearing, not caution. A +ThreadSanitizer configuration needs the process's address space where it expects +it, so a TSan run must be re-executed under `setarch -R`, which asks the kernel +for `personality(ADDR_NO_RANDOMIZE)`. Docker's default seccomp profile denies +that call. Without it ThreadSanitizer dies before `main` with "unexpected memory +mapping" — a configuration that never starts, not a scenario that passed. + +A win32-x64 build of the scenario runner needs the checkout somewhere short — +near a drive root rather than under a deep temporary directory. MSVC builds the +bridge and its scenario runner through MSBuild, whose file tracker gives out on +long paths, and the build then fails outright rather than naming the path as the +cause. + +Where an artifact was built is part of what it is. The Linux binary is linked +against Debian 13's glibc, so a build from anywhere else is a different artifact +whatever the file name says. diff --git a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp index bbb6e193..5964de43 100644 --- a/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp +++ b/native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp @@ -1,24 +1,116 @@ -#include -#include -#include +// The CultMesh MsQuic bridge: one MsQuic body, two roles, two platforms. +// +// This file owns MsQuic registration, configuration, listener, connection and +// stream handles, TLS credential loading, the 1-byte-kind plus 4-byte-LE-length +// QUIC stream framing, and a single event queue per runtime. It owns transport +// only. It never decodes a CultMesh frame, never decides delivery semantics, +// never coalesces, never reconnects, and in the v2 path never accepts a +// certificate on its own: the host answers, through +// `cultmesh_quic_connection_certificate_complete`. +// +// No host callbacks. Every crossing is the host calling in, including the one +// blocking wait (`cultmesh_quic_next_event`). MsQuic's worker threads only ever +// push onto the queue and wake that wait, so the bridge is runtime-neutral: it +// includes no Node headers, no Unity headers, and nothing platform-specific +// outside the `_WIN32` block at the bottom of this file. +// +// Two ABIs live here. v2 is the queue API above, for any host. v1 is the five +// exports the Unity managed connector already imports by name +// (`CultMeshNativeQuicRealtimeTransport.cs`, `NativeMethods`), kept Windows-only +// and implemented on top of a private v2 runtime. v1 is the only place a +// certificate pin is compared in C, because that is the contract Unity was +// shipped with; it delegates everything else and decides nothing new. + +// The host-facing contract lives in include/cultmesh_quic_native.h and is +// included here so this file cannot drift from it: the event layout, the +// exports, the return codes, the lifetime rules and the threading rules are +// stated there once and asserted at compile time. +#define CULTMESH_QUIC_BUILD 1 +#include + #include +#include #include #include +#include #include #include +#include +#include #include #include #include #include #include #include +#include +#include #include -#if defined(GAMECULT_MESH_QUIC_NATIVE_EXPORTS) -#define CULTMESH_API extern "C" __declspec(dllexport) +#define CULTMESH_API extern "C" CULTMESH_QUIC_API + +// Development builds only, and never in a shipped binary: after +// `cultmesh_quic_runtime_close` has quiesced, no host call may still be inside +// the library. The wait is what makes that true, and its absence is otherwise +// visible only as a use-after-free a sanitizer catches by luck — a poller has to +// be preempted in the right window. With pollers blocked, this states the +// invariant directly, so a build without the wait dies on the first close rather +// than on the run that happens to be unlucky. +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) +#define CULTMESH_QUIC_ASSERT_QUIESCED(count) \ + do { \ + const int cultmesh_quic_remaining = (count); \ + if (cultmesh_quic_remaining != 0) { \ + std::fprintf(stderr, \ + "cultmesh_quic_runtime_close: %d host call(s) still inside the " \ + "library after the quiesce\n", cultmesh_quic_remaining); \ + std::fflush(stderr); \ + std::abort(); \ + } \ + } while (false) #else -#define CULTMESH_API extern "C" __declspec(dllimport) +#define CULTMESH_QUIC_ASSERT_QUIESCED(count) ((void)0) +#endif + +// Development builds only, and never in a shipped binary: the seam the scenario +// runner drives the quiesce through. A scenario that only sleeps and hopes its +// pollers are inside the library cannot tell a bridge that counts host calls +// from one that does not, so the bridge says so itself: +// +// - PEAK raises the high-water mark of calls counted inside, so a scenario can +// assert that the calls it launched were counted rather than assumed. +// - AT_CLOSE records how many were counted when the close began its wait, which +// is the number the wait exists for. +// - HELD parks a call inside the library until the scenario releases it, so the +// close races calls that are genuinely there for as long as the scenario +// wants them there, instead of for as long as the schedule happens to give. +// It returns true when it parked, and a held call makes no further call of +// its own; what it does still do is leave its CallScope, which takes the gate, +// decrements the count and notifies. That is the ordinary exit every export +// makes, and it is the bridge's wait — not the hold — that keeps the runtime +// alive underneath it. +// - RECORD_WAIT wraps the whole duration handed to the condition wait in +// `cultmesh_quic_next_event`, in place, as a pass-through: it stores that +// duration's count and returns the duration unchanged, so a mutation to +// what is actually waited on changes what this reports rather than the two +// ever being able to diverge. It wraps `timeout_ms` after conversion to +// `std::chrono::milliseconds`, not before — Self's ruling of 2026-09-22, +// after arithmetic applied to the converted duration survived a seam that +// only recorded the raw integer underneath it. A scenario reads it and +// asserts equality against the timeout it asked for, deterministically and +// with no timing tolerance, in place of inferring the same fact from how +// long a call took to return. +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) +#define CULTMESH_QUIC_DEBUG_PEAK(count) DebugRaisePeak(count) +#define CULTMESH_QUIC_DEBUG_AT_CLOSE(count) DebugRecordCallsAtClose(count) +#define CULTMESH_QUIC_DEBUG_HELD(lock) DebugHoldCall(lock) +#define CULTMESH_QUIC_DEBUG_RECORD_WAIT(duration) DebugRecordWait(duration) +#else +#define CULTMESH_QUIC_DEBUG_PEAK(count) ((void)0) +#define CULTMESH_QUIC_DEBUG_AT_CLOSE(count) ((void)0) +#define CULTMESH_QUIC_DEBUG_HELD(lock) (false) +#define CULTMESH_QUIC_DEBUG_RECORD_WAIT(duration) (duration) #endif namespace { @@ -26,11 +118,1168 @@ namespace { constexpr uint32_t kApiVersion = 2; constexpr uint64_t kConnectionCloseCode = 0x43554c54; constexpr uint64_t kStreamAbortCode = 0x53544154; -constexpr uint8_t kReliableStream = 1; -constexpr uint8_t kLatestOnlyStream = 2; +constexpr uint8_t kReliableStream = CULTMESH_QUIC_STREAM_RELIABLE; +constexpr uint8_t kLatestOnlyStream = CULTMESH_QUIC_STREAM_LATEST_ONLY; constexpr uint32_t kMaximumEncodedFrameBytes = (64u * 1024u * 1024u) + 37u + (3u * 65535u); constexpr char kAlpn[] = "cultmesh-state-v1"; +// Mirrors the C# server and connector: CultMeshQuicRealtimeTransport.cs:77,:202 +// for the stream ceiling, and the idle/keep-alive pair the v1 bridge already +// used (:335-338). +constexpr uint32_t kIdleTimeoutMs = 30000; +constexpr uint32_t kKeepAliveIntervalMs = 5000; +constexpr uint16_t kPeerUnidiStreamCount = 1024; +// If the host never answers the certificate event, this is what closes the +// connection instead of leaking it: MsQuic's own handshake timeout fires and +// the shutdown arrives as event 4. +constexpr uint32_t kHandshakeIdleTimeoutMs = 10000; + +// Short names for the header's event codes; the header is the contract. +constexpr uint32_t kEventListenerNewConnection = CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION; +constexpr uint32_t kEventConnectionConnected = CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED; +constexpr uint32_t kEventConnectionCertificateReceived = CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED; +constexpr uint32_t kEventConnectionShutdown = CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN; +constexpr uint32_t kEventStreamStarted = CULTMESH_QUIC_EVENT_STREAM_STARTED; +constexpr uint32_t kEventStreamFrame = CULTMESH_QUIC_EVENT_STREAM_FRAME; +constexpr uint32_t kEventStreamSendComplete = CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE; +constexpr uint32_t kEventStreamShutdown = CULTMESH_QUIC_EVENT_STREAM_SHUTDOWN; +constexpr uint32_t kEventListenerStopped = CULTMESH_QUIC_EVENT_LISTENER_STOPPED; + +struct Runtime; +struct Connection; + +struct QueuedEvent { + cultmesh_quic_event header{}; + std::vector payload; +}; + +// Objects are shared-owned, and that is the whole lifetime model. The runtime's +// maps hold one reference each; an export that names an id takes its own +// reference under the lock and holds it for the entire MsQuic call. MsQuic's +// worker, on shutdown-complete, drops the map's reference only. The handle +// follows the object: it is closed exactly once, in the destructor, by whichever +// holder drops last, under a one-shot exchange guard. See section 4 of +// include/cultmesh_quic_native.h, which is where this is promised to hosts. + +struct Stream { + Runtime* runtime = nullptr; + // Shared, not raw: this is what keeps a connection's handle open for as long + // as any of its streams still exist, so stream handles always close first. + std::shared_ptr owner; + HQUIC handle = nullptr; + uint64_t id = 0; + uint8_t kind = 0; + bool inbound = false; + bool has_kind = false; + std::atomic handle_closed{false}; + // Inbound reassembly only. MsQuic delivers stream bytes in arbitrary + // chunks, so the length prefix and the frame it introduces can arrive in + // separate receives. + std::vector buffered; + + ~Stream(); +}; + +struct Connection : std::enable_shared_from_this { + Runtime* runtime = nullptr; + HQUIC handle = nullptr; + uint64_t id = 0; + uint64_t listener_id = 0; + bool inbound = false; + // Written by the host thread in `cultmesh_quic_connection_shutdown`, read on + // an MsQuic worker when the shutdown completes: the code the host passed is + // what its own event 4 has to carry. + std::atomic closing{false}; + std::atomic shutdown_code{0}; + // Why it ended, recorded by whichever initiated-by callback saw it and read + // by shutdown-complete, which is the single emitter of event 4. Both run on + // this connection's own worker, serialized. + std::string shutdown_reason; + int32_t shutdown_status = 0; + // Set when MsQuic is closing the handle itself (an app close already in + // progress), so the destructor's one-shot close stands down. + std::atomic handle_closed{false}; + // v1 only. A connection carrying a pin has its certificate answered in C + // against that pin; a v2 connection never sets this and is always answered + // by the host. Nothing outside the `_WIN32` block below ever sets it. + bool has_pin = false; + std::array pin{}; + // v1 diagnostics: the MsQuic event sequence, which the v1 error string + // reports and nothing in v2 reads. + std::string trace; + + ~Connection(); +}; + +struct Listener { + Runtime* runtime = nullptr; + HQUIC handle = nullptr; + HQUIC configuration = nullptr; + uint64_t id = 0; + std::atomic handle_closed{false}; + + ~Listener(); +}; + +struct Runtime { + const QUIC_API_TABLE* api = nullptr; + HQUIC registration = nullptr; + // One client configuration serves every outbound connection: the ALPN, + // settings and credential flags are identical for all of them. + HQUIC client_configuration = nullptr; + + std::mutex gate; + std::condition_variable signal; + std::deque events; + std::unordered_map> listeners; + std::unordered_map> connections; + std::unordered_map> streams; + uint64_t next_id = 1; + std::string error; + // The raw platform status behind the last MsQuic refusal, kept because the + // portable return code deliberately throws its bits away. + int32_t last_status = 0; + bool closing = false; + // Host calls currently inside the library. `cultmesh_quic_runtime_close` + // waits for this to reach zero before it touches a handle. + int active_calls = 0; +}; + +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) +// The development seam behind the three CULTMESH_QUIC_DEBUG_ macros. None of it +// is compiled into a shipped library. +std::atomic debug_peak_calls{0}; +std::atomic debug_calls_at_close{-1}; +std::mutex debug_hold_gate; +std::condition_variable debug_hold_signal; +bool debug_hold_armed = false; +std::atomic debug_last_wait_ms{-1}; +// Separate from the value above on purpose: once the seam records the whole +// duration (not just a millisecond count already known to be positive), a +// mutation could in principle make a wait get recorded at exactly -1, and an +// int32_t alone cannot tell that apart from "nothing recorded yet". This flag +// is the "recorded" bit; the getter below is the only thing that still hands +// out -1 for the unset case. +std::atomic debug_wait_recorded{false}; + +void DebugRaisePeak(int count) { + int peak = debug_peak_calls.load(std::memory_order_relaxed); + while (count > peak && !debug_peak_calls.compare_exchange_weak(peak, count)) { + } +} + +void DebugRecordCallsAtClose(int count) { debug_calls_at_close.store(count); } + +// Parks the calling host thread inside the library until the scenario releases +// it. The runtime gate is dropped first, so nothing else is blocked behind the +// held call, and it is never retaken: the call is still counted, because its +// CallScope is still alive, and that is the whole point. +bool DebugHoldCall(std::unique_lock& lock) { + std::unique_lock hold(debug_hold_gate); + if (!debug_hold_armed) return false; + lock.unlock(); + debug_hold_signal.wait(hold, [] { return !debug_hold_armed; }); + return true; +} + +// A pass-through: it stores the duration's count and returns the duration +// unmodified, so wrapping it around the whole expression handed to the +// condition wait makes the two impossible to desync by construction. Whatever +// that expression evaluates to — the plain converted argument today, or a +// derivation a future change or a mutation introduces inside this call — is +// what gets recorded, because it is the same evaluation. Anything applied +// outside this call, after it returns, is what the wall-clock scenarios exist +// to catch instead; see their generous-tolerance comment. +std::chrono::milliseconds DebugRecordWait(std::chrono::milliseconds duration) { + debug_last_wait_ms.store(static_cast(duration.count())); + debug_wait_recorded.store(true); + return duration; +} +#endif + +// Every host-facing export enters through this. It refuses once +// `cultmesh_quic_runtime_close` has started, and otherwise holds the runtime +// open for the length of the call. +class CallScope { +public: + explicit CallScope(Runtime* runtime) : runtime_(runtime) { + if (runtime_ == nullptr) return; + std::lock_guard lock(runtime_->gate); + if (runtime_->closing) return; + ++runtime_->active_calls; + CULTMESH_QUIC_DEBUG_PEAK(runtime_->active_calls); + entered_ = true; + } + // The notify stays under `gate`, and that is the whole point of it. Released + // first, the closer's predicate is already true, so it can return from its + // wait, run the teardown and destroy the runtime — condition variable + // included — before this thread reaches the notify. Holding the lock across + // both means the closer cannot leave `signal.wait` until this scope has let + // go, so the condition variable is still alive when it is signalled. + ~CallScope() { + if (!entered_) return; + std::lock_guard lock(runtime_->gate); + --runtime_->active_calls; + runtime_->signal.notify_all(); + } + CallScope(const CallScope&) = delete; + CallScope& operator=(const CallScope&) = delete; + bool entered() const { return entered_; } + +private: + Runtime* runtime_ = nullptr; + bool entered_ = false; +}; + +Stream::~Stream() { + if (handle != nullptr && runtime != nullptr && runtime->api != nullptr && + !handle_closed.exchange(true)) + runtime->api->StreamClose(handle); +} + +Connection::~Connection() { + if (handle != nullptr && runtime != nullptr && runtime->api != nullptr && + !handle_closed.exchange(true)) + runtime->api->ConnectionClose(handle); +} + +Listener::~Listener() { + if (runtime == nullptr || runtime->api == nullptr) return; + if (handle != nullptr && !handle_closed.exchange(true)) runtime->api->ListenerClose(handle); + if (configuration != nullptr) runtime->api->ConfigurationClose(configuration); +} + +// Every send buffer outlives its `StreamSend` call: MsQuic reads the bytes +// asynchronously and only releases them at SEND_COMPLETE, where this is freed. +struct SendRequest { + QUIC_BUFFER buffer{}; + std::vector bytes; + // Which send this was. The bridge writes the stream's kind byte itself, and + // that completion is not the host's to hear about; event 7 is one per + // `cultmesh_quic_stream_send_frame` and nothing else. + bool is_frame = false; +}; + +// A `QUIC_STATUS` reaches this through `uint32_t`, never straight to `uint64_t`: +// it is a signed HRESULT on Windows, and widening it signed printed every +// Windows failure as `0xFFFFFFFF80072B18`. The status is 32 bits on both +// platforms and is read as 32 bits here. +std::string Hex(uint64_t value) { + std::ostringstream text; + text << "0x" << std::hex << std::uppercase << value; + return text.str(); +} + +void SetError(Runtime* runtime, const std::string& message) { + if (runtime == nullptr) return; + std::lock_guard lock(runtime->gate); + runtime->error = message; +} + +// `QUIC_STATUS` never reaches a host. It is a negative HRESULT on Windows and a +// positive errno on POSIX, so a host that checked for a negative value saw every +// Linux failure as success. One negative space on both platforms instead; the +// raw bits go to `cultmesh_quic_last_status`. See section 3 of the header. +int32_t MsQuicCode(QUIC_STATUS status) { + return CULTMESH_QUIC_RESULT_MSQUIC_BASE - + static_cast(static_cast(status) & 0xffffu); +} + +int32_t Refuse(Runtime* runtime, QUIC_STATUS status, const std::string& message) { + if (runtime != nullptr) { + std::lock_guard lock(runtime->gate); + runtime->error = message; + runtime->last_status = static_cast(status); + } + return MsQuicCode(status); +} + +// The only way anything reaches the host. Callers must not hold `gate`. +void Publish(Runtime* runtime, const cultmesh_quic_event& header, const uint8_t* payload, size_t payload_length) { + QueuedEvent queued; + queued.header = header; + queued.header.payload_length = static_cast(payload_length); + if (payload != nullptr && payload_length > 0) + queued.payload.assign(payload, payload + payload_length); + { + std::lock_guard lock(runtime->gate); + if (runtime->closing) return; + runtime->events.push_back(std::move(queued)); + } + runtime->signal.notify_all(); +} + +void PublishSimple(Runtime* runtime, uint32_t type, uint64_t listener_id, uint64_t connection_id, + uint64_t stream_id, uint64_t code, int32_t status, uint32_t stream_kind = 0) { + cultmesh_quic_event header{}; + header.type = type; + header.stream_kind = stream_kind; + header.listener_id = listener_id; + header.connection_id = connection_id; + header.stream_id = stream_id; + header.code = code; + header.status = status; + Publish(runtime, header, nullptr, 0); +} + +// v1 diagnostics only, and bounded. A v2 connection has no reader for this, and +// a long-lived one appended to it once per MsQuic event for as long as it lived. +constexpr size_t kMaximumTraceBytes = 512; + +void AppendTrace(Connection* connection, const std::string& event) { + if (connection == nullptr || !connection->has_pin) return; + std::lock_guard lock(connection->runtime->gate); + if (connection->trace.size() >= kMaximumTraceBytes) return; + if (!connection->trace.empty()) connection->trace += ","; + connection->trace += event; +} + +uint32_t ReadUInt32LittleEndian(const uint8_t* value) { + return static_cast(value[0]) | + (static_cast(value[1]) << 8) | + (static_cast(value[2]) << 16) | + (static_cast(value[3]) << 24); +} + +void WriteUInt32LittleEndian(uint8_t* destination, uint32_t value) { + destination[0] = static_cast(value & 0xff); + destination[1] = static_cast((value >> 8) & 0xff); + destination[2] = static_cast((value >> 16) & 0xff); + destination[3] = static_cast((value >> 24) & 0xff); +} + +uint64_t NextId(Runtime* runtime) { + std::lock_guard lock(runtime->gate); + return runtime->next_id++; +} + +// The three lookups. Each returns a reference the caller owns for as long as it +// holds it, taken under the lock, so nothing the caller then names can be freed +// under it. A raw pointer here was the use-after-free. +std::shared_ptr FindConnection(Runtime* runtime, uint64_t id) { + std::lock_guard lock(runtime->gate); + const auto found = runtime->connections.find(id); + return found == runtime->connections.end() ? nullptr : found->second; +} + +std::shared_ptr FindStream(Runtime* runtime, uint64_t id) { + std::lock_guard lock(runtime->gate); + const auto found = runtime->streams.find(id); + return found == runtime->streams.end() ? nullptr : found->second; +} + +// Takes the object out of its map and returns it, so the caller's reference — +// and any destructor it ends up running — lives outside the lock. +template +auto Detach(std::mutex& gate, Map& map, uint64_t id) { + typename Map::mapped_type detached; + std::lock_guard lock(gate); + const auto found = map.find(id); + if (found == map.end()) return detached; + detached = std::move(found->second); + map.erase(found); + return detached; +} + +void ShutdownConnectionForProtocolFault(const std::shared_ptr& connection, const std::string& message) { + if (connection == nullptr) return; + SetError(connection->runtime, message); + if (connection->runtime->api != nullptr && connection->handle != nullptr) + connection->runtime->api->ConnectionShutdown( + connection->handle, QUIC_CONNECTION_SHUTDOWN_FLAG_NONE, kStreamAbortCode); +} + +// Reassembles whole encoded frames out of the stream byte sequence and +// publishes one event 6 per frame, length prefix stripped. The first byte of an +// inbound stream is its kind, which becomes event 5. +bool ConsumeFrames(Stream* stream) { + Runtime* runtime = stream->runtime; + auto& bytes = stream->buffered; + if (!stream->has_kind) { + if (bytes.empty()) return true; + stream->kind = bytes.front(); + bytes.erase(bytes.begin()); + stream->has_kind = true; + if (stream->kind != kReliableStream && stream->kind != kLatestOnlyStream) { + ShutdownConnectionForProtocolFault(stream->owner, "CultMesh QUIC stream kind is invalid."); + return false; + } + PublishSimple(runtime, kEventStreamStarted, stream->owner->listener_id, stream->owner->id, + stream->id, 0, 0, stream->kind); + } + + while (bytes.size() >= sizeof(uint32_t)) { + const uint32_t length = ReadUInt32LittleEndian(bytes.data()); + if (length == 0 || length > kMaximumEncodedFrameBytes) { + ShutdownConnectionForProtocolFault(stream->owner, "CultMesh QUIC frame length is invalid."); + return false; + } + const size_t framed_length = sizeof(uint32_t) + static_cast(length); + if (bytes.size() < framed_length) return true; + + cultmesh_quic_event header{}; + header.type = kEventStreamFrame; + header.stream_kind = stream->kind; + header.listener_id = stream->owner->listener_id; + header.connection_id = stream->owner->id; + header.stream_id = stream->id; + Publish(runtime, header, bytes.data() + sizeof(uint32_t), length); + + bytes.erase(bytes.begin(), bytes.begin() + static_cast(framed_length)); + } + return true; +} + +// Drops the map's reference and nothing else. If the map was the last holder the +// object dies here, outside the lock, and its destructor closes the handle; if a +// host call is still inside, the object outlives this by exactly that long. +void DestroyStream(Runtime* runtime, uint64_t stream_id) { + [[maybe_unused]] const auto detached = Detach(runtime->gate, runtime->streams, stream_id); +} + +QUIC_STATUS QUIC_API StreamCallback(HQUIC, void* context, QUIC_STREAM_EVENT* event) { + auto* stream = static_cast(context); + Runtime* runtime = stream->runtime; + switch (event->Type) { + case QUIC_STREAM_EVENT_RECEIVE: + for (uint32_t index = 0; index < event->RECEIVE.BufferCount; ++index) { + const auto& buffer = event->RECEIVE.Buffers[index]; + stream->buffered.insert(stream->buffered.end(), buffer.Buffer, buffer.Buffer + buffer.Length); + } + ConsumeFrames(stream); + break; + case QUIC_STREAM_EVENT_SEND_COMPLETE: { + // Which send finished is the client context's job to say. Without it the + // bridge's own kind byte completed as an anonymous event 7 and the host + // counted six completions for five frames. + auto* request = static_cast(event->SEND_COMPLETE.ClientContext); + const bool is_frame = request != nullptr && request->is_frame; + delete request; + if (is_frame) + PublishSimple(runtime, kEventStreamSendComplete, stream->owner->listener_id, stream->owner->id, + stream->id, + event->SEND_COMPLETE.Canceled + ? CULTMESH_QUIC_SEND_CANCELED + : CULTMESH_QUIC_SEND_COMPLETED, + 0, stream->kind); + break; + } + case QUIC_STREAM_EVENT_PEER_SEND_SHUTDOWN: + if (!stream->buffered.empty()) + ShutdownConnectionForProtocolFault(stream->owner, "CultMesh QUIC stream ended with a truncated frame."); + break; + case QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE: { + // Everything this event reports is read before the map's reference goes, + // because that reference may be the last one and `stream` may not + // survive `DestroyStream`. + const uint64_t stream_id = stream->id; + const uint64_t connection_id = stream->owner->id; + const uint64_t listener_id = stream->owner->listener_id; + const uint32_t kind = stream->kind; + // An app close already in progress means MsQuic closes this handle + // itself; anything else leaves it to the last holder's destructor. + if (event->SHUTDOWN_COMPLETE.AppCloseInProgress) stream->handle_closed.store(true); + DestroyStream(runtime, stream_id); + PublishSimple(runtime, kEventStreamShutdown, listener_id, connection_id, stream_id, 0, 0, kind); + break; + } + default: + break; + } + return QUIC_STATUS_SUCCESS; +} + +void DestroyConnection(Runtime* runtime, uint64_t connection_id) { + // Declared first so it dies last: whatever order these drop in, a stream + // holds its connection, so every stream handle closes before the connection + // handle does. + std::shared_ptr connection; + std::vector> streams; + { + std::lock_guard lock(runtime->gate); + for (auto it = runtime->streams.begin(); it != runtime->streams.end();) { + if (it->second->owner != nullptr && it->second->owner->id == connection_id) { + streams.push_back(std::move(it->second)); + it = runtime->streams.erase(it); + } else { + ++it; + } + } + const auto found = runtime->connections.find(connection_id); + if (found != runtime->connections.end()) { + connection = std::move(found->second); + runtime->connections.erase(found); + } + } +} + +#if defined(_WIN32) +// Declared here, defined in the v1 block at the bottom: the pin comparison is +// the one piece of the certificate path that is Windows-only and v1-only. +bool CertificateMatchesPin(Connection* connection, QUIC_CERTIFICATE* certificate); +#endif + +QUIC_STATUS QUIC_API ConnectionCallback(HQUIC handle, void* context, QUIC_CONNECTION_EVENT* event) { + auto* connection = static_cast(context); + Runtime* runtime = connection->runtime; + AppendTrace(connection, "event=" + std::to_string(static_cast(event->Type))); + switch (event->Type) { + case QUIC_CONNECTION_EVENT_CONNECTED: + PublishSimple(runtime, kEventConnectionConnected, connection->listener_id, connection->id, 0, 0, 0); + break; + case QUIC_CONNECTION_EVENT_PEER_STREAM_STARTED: { + auto stream = std::make_shared(); + stream->runtime = runtime; + stream->owner = connection->shared_from_this(); + stream->handle = event->PEER_STREAM_STARTED.Stream; + stream->inbound = true; + stream->id = NextId(runtime); + Stream* raw = stream.get(); + { + std::lock_guard lock(runtime->gate); + runtime->streams.emplace(raw->id, std::move(stream)); + } + runtime->api->SetCallbackHandler( + event->PEER_STREAM_STARTED.Stream, reinterpret_cast(StreamCallback), raw); + break; + } + case QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED: { + const auto* encoded = reinterpret_cast(event->PEER_CERTIFICATE_RECEIVED.Certificate); + AppendTrace(connection, "certificate-status=" + + Hex(static_cast(event->PEER_CERTIFICATE_RECEIVED.DeferredStatus))); +#if defined(_WIN32) + if (connection->has_pin) { + // The v1 contract: the pin decision is made here, in C, and the host + // is never asked. Only `cultmesh_quic_open` sets `has_pin`. + const bool matches = CertificateMatchesPin( + connection, event->PEER_CERTIFICATE_RECEIVED.Certificate); + if (!matches) + SetError(runtime, + "CultMesh QUIC provider certificate does not match the advertised SHA-256 pin."); + const auto completion = runtime->api->ConnectionCertificateValidationComplete( + handle, + matches ? static_cast(1) : static_cast(0), + matches ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); + if (QUIC_FAILED(completion)) { + SetError(runtime, "CultMesh QUIC certificate validation completion failed (status=" + + Hex(static_cast(completion)) + ")."); + return completion; + } + return QUIC_STATUS_PENDING; + } +#endif + // v2: the DER goes to the host and the handshake waits. Nothing here + // decides trust. If the host never answers, MsQuic's handshake timeout + // closes the connection and event 4 reports it. + cultmesh_quic_event header{}; + header.type = kEventConnectionCertificateReceived; + header.listener_id = connection->listener_id; + header.connection_id = connection->id; + header.status = static_cast(event->PEER_CERTIFICATE_RECEIVED.DeferredStatus); + const uint8_t* der = (encoded != nullptr) ? encoded->Buffer : nullptr; + const size_t der_length = (encoded != nullptr) ? encoded->Length : 0; + Publish(runtime, header, der, der_length); + return QUIC_STATUS_PENDING; + } + // The two initiated-by events say why a connection is ending, not that it + // has ended; the object and its id are still live here. They record the + // reason and the code, and shutdown-complete below is the one place event 4 + // is emitted, once per connection id, after the id has stopped resolving. + // All three of these run on the connection's own MsQuic worker, serialized, + // which is what lets these fields be plain members. + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: + connection->shutdown_reason = "CultMesh QUIC connection was shut down by the transport (status=" + + Hex(static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status)) + ", error=" + + Hex(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode) + ")."; + connection->shutdown_code.store(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode); + connection->shutdown_status = static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status); + break; + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_PEER: + connection->shutdown_reason = "CultMesh QUIC connection was shut down by the peer."; + connection->shutdown_code.store(event->SHUTDOWN_INITIATED_BY_PEER.ErrorCode); + break; + case QUIC_CONNECTION_EVENT_SHUTDOWN_COMPLETE: { + const uint64_t connection_id = connection->id; + if (event->SHUTDOWN_COMPLETE.AppCloseInProgress) connection->handle_closed.store(true); + // A host that ended the connection itself gets nothing else from MsQuic + // — no initiated-by-peer, no initiated-by-transport — so without this + // its own connection id simply stopped existing and the end of a + // connection was observable only from the other side. + cultmesh_quic_event header{}; + header.type = kEventConnectionShutdown; + header.listener_id = connection->listener_id; + header.connection_id = connection_id; + header.code = connection->shutdown_code.load(); + header.status = connection->shutdown_status; + const std::string reason = connection->shutdown_reason.empty() + ? std::string("CultMesh QUIC connection was shut down by the host.") + : connection->shutdown_reason; + DestroyConnection(runtime, connection_id); + Publish(runtime, header, reinterpret_cast(reason.data()), reason.size()); + break; + } + default: + break; + } + return QUIC_STATUS_SUCCESS; +} + +QUIC_STATUS QUIC_API ListenerCallback(HQUIC, void* context, QUIC_LISTENER_EVENT* event) { + auto* listener = static_cast(context); + Runtime* runtime = listener->runtime; + switch (event->Type) { + case QUIC_LISTENER_EVENT_NEW_CONNECTION: { + auto connection = std::make_shared(); + connection->runtime = runtime; + connection->handle = event->NEW_CONNECTION.Connection; + connection->inbound = true; + connection->listener_id = listener->id; + connection->id = NextId(runtime); + Connection* raw = connection.get(); + { + std::lock_guard lock(runtime->gate); + runtime->connections.emplace(raw->id, std::move(connection)); + } + runtime->api->SetCallbackHandler( + event->NEW_CONNECTION.Connection, reinterpret_cast(ConnectionCallback), raw); + const auto status = runtime->api->ConnectionSetConfiguration( + event->NEW_CONNECTION.Connection, listener->configuration); + if (QUIC_FAILED(status)) { + SetError(runtime, "CultMesh QUIC inbound connection configuration failed (status=" + + Hex(static_cast(status)) + ")."); + // Returning a failure here is MsQuic's signal to reject and close + // this connection itself, so the entry made a moment ago has to go + // with it rather than sitting in the map naming a dead handle. + raw->handle_closed.store(true); + DestroyConnection(runtime, raw->id); + return status; + } + PublishSimple(runtime, kEventListenerNewConnection, listener->id, raw->id, 0, 0, 0); + break; + } + case QUIC_LISTENER_EVENT_STOP_COMPLETE: + PublishSimple(runtime, kEventListenerStopped, listener->id, 0, 0, 0, 0); + break; + default: + break; + } + return QUIC_STATUS_SUCCESS; +} + +void FillSettings(QUIC_SETTINGS& settings) { + settings.IdleTimeoutMs = kIdleTimeoutMs; + settings.IsSet.IdleTimeoutMs = 1; + settings.KeepAliveIntervalMs = kKeepAliveIntervalMs; + settings.IsSet.KeepAliveIntervalMs = 1; + settings.PeerUnidiStreamCount = kPeerUnidiStreamCount; + settings.IsSet.PeerUnidiStreamCount = 1; + settings.HandshakeIdleTimeoutMs = kHandshakeIdleTimeoutMs; + settings.IsSet.HandshakeIdleTimeoutMs = 1; +} + +QUIC_BUFFER AlpnBuffer() { + return QUIC_BUFFER{ + static_cast(sizeof(kAlpn) - 1), + reinterpret_cast(const_cast(kAlpn)) + }; +} + +// Opened once per runtime, on first outbound connection. +QUIC_STATUS EnsureClientConfiguration(Runtime* runtime) { + if (runtime->client_configuration != nullptr) return QUIC_STATUS_SUCCESS; + + QUIC_SETTINGS settings{}; + FillSettings(settings); + QUIC_BUFFER alpn = AlpnBuffer(); + HQUIC configuration = nullptr; + auto status = runtime->api->ConfigurationOpen( + runtime->registration, &alpn, 1, &settings, sizeof(settings), nullptr, &configuration); + if (QUIC_FAILED(status)) return status; + + QUIC_CREDENTIAL_CONFIG credentials{}; + credentials.Type = QUIC_CREDENTIAL_TYPE_NONE; + credentials.Flags = static_cast( + QUIC_CREDENTIAL_FLAG_CLIENT | + QUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVED | + QUIC_CREDENTIAL_FLAG_DEFER_CERTIFICATE_VALIDATION | + QUIC_CREDENTIAL_FLAG_USE_PORTABLE_CERTIFICATES); + status = runtime->api->ConfigurationLoadCredential(configuration, &credentials); + if (QUIC_FAILED(status)) { + runtime->api->ConfigurationClose(configuration); + return status; + } + runtime->client_configuration = configuration; + return QUIC_STATUS_SUCCESS; +} + +// `pin` is the v1 shim's and nothing else passes it. It must be attached before +// `ConnectionStart`, not after it returns: the handshake runs on an MsQuic +// worker thread and reaches the certificate event immediately on loopback, so a +// pin applied afterwards loses the race, the connection takes the v2 path, and +// the handshake stalls waiting for an answer from a host that was never told to +// give one. +int32_t OpenConnection(Runtime* runtime, const char* host, uint16_t port, uint64_t* out_connection_id, + const std::array* pin) { + if (runtime == nullptr || host == nullptr || *host == '\0' || port == 0 || out_connection_id == nullptr) + return -1; + *out_connection_id = 0; + + auto status = EnsureClientConfiguration(runtime); + if (QUIC_FAILED(status)) { + return Refuse(runtime, status, "CultMesh QUIC client configuration failed (status=" + + Hex(static_cast(status)) + ")."); + } + + auto connection = std::make_shared(); + connection->runtime = runtime; + connection->id = NextId(runtime); + if (pin != nullptr) { + connection->has_pin = true; + connection->pin = *pin; + } + Connection* raw = connection.get(); + + status = runtime->api->ConnectionOpen(runtime->registration, ConnectionCallback, raw, &raw->handle); + if (QUIC_FAILED(status)) { + return Refuse(runtime, status, "CultMesh QUIC connection open failed (status=" + + Hex(static_cast(status)) + ")."); + } + { + std::lock_guard lock(runtime->gate); + runtime->connections.emplace(raw->id, connection); + } + + status = runtime->api->ConnectionStart( + raw->handle, runtime->client_configuration, QUIC_ADDRESS_FAMILY_UNSPEC, host, port); + if (QUIC_FAILED(status)) { + // The map's reference goes and this local one goes with the scope; the + // handle is closed by whichever of the two drops last, exactly once. + DestroyConnection(runtime, raw->id); + return Refuse(runtime, status, "CultMesh QUIC connection start failed (status=" + + Hex(static_cast(status)) + ")."); + } + + *out_connection_id = raw->id; + return 0; +} + +} // namespace + +// --------------------------------------------------------------------------- +// C ABI v2: the runtime-neutral bridge. +// --------------------------------------------------------------------------- + +CULTMESH_API int32_t cultmesh_quic_runtime_open(const char* app_name, void** out_runtime) { + if (out_runtime == nullptr) return -1; + *out_runtime = nullptr; + auto runtime = std::make_unique(); + + // No runtime yet to hang `last_status` on, so these two refusals lose the + // raw bits. Everything after this point keeps them. + auto status = MsQuicOpenVersion(kApiVersion, reinterpret_cast(&runtime->api)); + if (QUIC_FAILED(status)) return MsQuicCode(status); + + const QUIC_REGISTRATION_CONFIG registration_config = { + (app_name != nullptr && *app_name != '\0') ? app_name : "GameCult.Mesh.Quic.Native", + QUIC_EXECUTION_PROFILE_TYPE_REAL_TIME + }; + status = runtime->api->RegistrationOpen(®istration_config, &runtime->registration); + if (QUIC_FAILED(status)) { + MsQuicClose(runtime->api); + return MsQuicCode(status); + } + + *out_runtime = runtime.release(); + return 0; +} + +CULTMESH_API void cultmesh_quic_runtime_close(void* handle) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return; + + // Quiesce before anything is closed or freed. Marking the runtime closing + // refuses every call that has not started; waking the pollers gets the + // blocked ones out of `next_event`; waiting for `active_calls` to reach zero + // is what makes the teardown below safe at all. A wake without the wait is + // how a poller returns into freed memory, so the wait is the contract, not + // the wake. Objects are taken out of the maps here and released after the + // lock, so their destructors run on this thread and close their handles. + std::vector> streams; + std::vector> connections; + std::vector> listeners; + { + std::unique_lock lock(runtime->gate); + if (runtime->closing) return; + runtime->closing = true; + runtime->signal.notify_all(); + CULTMESH_QUIC_DEBUG_AT_CLOSE(runtime->active_calls); + runtime->signal.wait(lock, [runtime] { return runtime->active_calls == 0; }); + CULTMESH_QUIC_ASSERT_QUIESCED(runtime->active_calls); + for (auto& entry : runtime->streams) streams.push_back(std::move(entry.second)); + for (auto& entry : runtime->connections) connections.push_back(std::move(entry.second)); + for (auto& entry : runtime->listeners) listeners.push_back(std::move(entry.second)); + runtime->streams.clear(); + runtime->connections.clear(); + runtime->listeners.clear(); + } + + // Bottom-up, and by the app's own hand. `RegistrationClose` blocks until + // every child handle the app opened has been closed *by the app*, and a + // silent shutdown delivers no shutdown events at all, so leaning on the + // callbacks to do the closing deadlocks the caller forever. + streams.clear(); + for (auto& connection : connections) + if (connection->handle != nullptr && !connection->handle_closed.load()) + runtime->api->ConnectionShutdown( + connection->handle, QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, kConnectionCloseCode); + connections.clear(); + listeners.clear(); + if (runtime->client_configuration != nullptr) { + runtime->api->ConfigurationClose(runtime->client_configuration); + runtime->client_configuration = nullptr; + } + + // No callback can be running past this point. + if (runtime->registration != nullptr) { + runtime->api->RegistrationClose(runtime->registration); + runtime->registration = nullptr; + } + if (runtime->api != nullptr) { + MsQuicClose(runtime->api); + runtime->api = nullptr; + } + delete runtime; +} + +CULTMESH_API int32_t cultmesh_quic_listener_open( + void* handle, const char* host, uint16_t port, + const uint8_t* pkcs12, int32_t pkcs12_len, const char* password, + uint64_t* out_listener_id, uint16_t* out_bound_port) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || pkcs12 == nullptr || pkcs12_len <= 0 || out_listener_id == nullptr) + return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; + *out_listener_id = 0; + if (out_bound_port != nullptr) *out_bound_port = 0; + + // Held here until the listener is fully started. Every failure path below + // simply returns: the destructor closes whatever was opened, and a partial + // open therefore leaves neither a handle nor a map entry behind. + auto listener = std::make_shared(); + listener->runtime = runtime; + listener->id = NextId(runtime); + + QUIC_SETTINGS settings{}; + FillSettings(settings); + QUIC_BUFFER alpn = AlpnBuffer(); + auto status = runtime->api->ConfigurationOpen( + runtime->registration, &alpn, 1, &settings, sizeof(settings), nullptr, &listener->configuration); + if (QUIC_FAILED(status)) { + return Refuse(runtime, status, "CultMesh QUIC listener configuration failed (status=" + + Hex(static_cast(status)) + ")."); + } + + // PKCS12 is the one credential type Schannel and OpenSSL both take, which + // is why the provider ships a PKCS12 rather than a platform store handle. + QUIC_CERTIFICATE_PKCS12 pkcs12_certificate{}; + pkcs12_certificate.Asn1Blob = pkcs12; + pkcs12_certificate.Asn1BlobLength = static_cast(pkcs12_len); + pkcs12_certificate.PrivateKeyPassword = (password != nullptr && *password != '\0') ? password : nullptr; + + QUIC_CREDENTIAL_CONFIG credentials{}; + credentials.Type = QUIC_CREDENTIAL_TYPE_CERTIFICATE_PKCS12; + credentials.CertificatePkcs12 = &pkcs12_certificate; + credentials.Flags = QUIC_CREDENTIAL_FLAG_NONE; + status = runtime->api->ConfigurationLoadCredential(listener->configuration, &credentials); + if (QUIC_FAILED(status)) { + return Refuse(runtime, status, "CultMesh QUIC listener certificate could not be loaded (status=" + + Hex(static_cast(status)) + ")."); + } + + Listener* raw = listener.get(); + status = runtime->api->ListenerOpen(runtime->registration, ListenerCallback, raw, &raw->handle); + if (QUIC_FAILED(status)) { + return Refuse(runtime, status, "CultMesh QUIC listener open failed (status=" + + Hex(static_cast(status)) + ")."); + } + + QUIC_ADDR address{}; + QuicAddrSetFamily(&address, QUIC_ADDRESS_FAMILY_UNSPEC); + QuicAddrSetPort(&address, port); + if (host != nullptr && *host != '\0' && !QuicAddrFromString(host, port, &address)) { + SetError(runtime, "CultMesh QUIC listener host is not an IP address."); + return -2; + } + + // In the map before it starts accepting, because the callback that accepts + // an inbound connection reads the listener through it. + { + std::lock_guard lock(runtime->gate); + runtime->listeners.emplace(raw->id, listener); + } + + QUIC_BUFFER listener_alpn = AlpnBuffer(); + status = runtime->api->ListenerStart(raw->handle, &listener_alpn, 1, &address); + if (QUIC_FAILED(status)) { + Detach(runtime->gate, runtime->listeners, raw->id); + return Refuse(runtime, status, "CultMesh QUIC listener start failed (status=" + + Hex(static_cast(status)) + ")."); + } + + // Port 0 means "pick one"; the host needs the chosen port to advertise it. + QUIC_ADDR bound{}; + uint32_t bound_size = sizeof(bound); + status = runtime->api->GetParam(raw->handle, QUIC_PARAM_LISTENER_LOCAL_ADDRESS, &bound_size, &bound); + if (QUIC_FAILED(status)) { + Detach(runtime->gate, runtime->listeners, raw->id); + return Refuse(runtime, status, "CultMesh QUIC listener address could not be read (status=" + + Hex(static_cast(status)) + ")."); + } + if (out_bound_port != nullptr) *out_bound_port = QuicAddrGetPort(&bound); + *out_listener_id = raw->id; + return 0; +} + +CULTMESH_API void cultmesh_quic_listener_close(void* handle, uint64_t listener_id) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return; + CallScope scope(runtime); + if (!scope.entered()) return; + // Taken out of the map, then released here: ~Listener closes the handle + // (which is what produces event 9) and its configuration, exactly once. + [[maybe_unused]] const auto detached = Detach(runtime->gate, runtime->listeners, listener_id); +} + +CULTMESH_API int32_t cultmesh_quic_connection_open( + void* handle, const char* host, uint16_t port, uint64_t* out_connection_id) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; + return OpenConnection(runtime, host, port, out_connection_id, nullptr); +} + +CULTMESH_API int32_t cultmesh_quic_connection_certificate_complete( + void* handle, uint64_t connection_id, int32_t accept) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; + const auto connection = FindConnection(runtime, connection_id); + if (connection == nullptr) return -1; + const auto status = runtime->api->ConnectionCertificateValidationComplete( + connection->handle, + accept != 0 ? static_cast(1) : static_cast(0), + accept != 0 ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); + if (QUIC_FAILED(status)) { + return Refuse(runtime, status, "CultMesh QUIC certificate validation completion failed (status=" + + Hex(static_cast(status)) + ")."); + } + return 0; +} + +CULTMESH_API void cultmesh_quic_connection_shutdown(void* handle, uint64_t connection_id, uint64_t code) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return; + CallScope scope(runtime); + if (!scope.entered()) return; + const auto connection = FindConnection(runtime, connection_id); + if (connection == nullptr || connection->closing.exchange(true)) return; + // Kept for the shutdown-complete callback: this is the code the initiator's + // own event 4 carries, matching the one the peer sees. + connection->shutdown_code.store(code); + if (connection->handle != nullptr) + runtime->api->ConnectionShutdown(connection->handle, QUIC_CONNECTION_SHUTDOWN_FLAG_NONE, code); +} + +CULTMESH_API int32_t cultmesh_quic_stream_open( + void* handle, uint64_t connection_id, uint8_t kind, uint64_t* out_stream_id) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || out_stream_id == nullptr) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; + *out_stream_id = 0; + if (kind != kReliableStream && kind != kLatestOnlyStream) return -2; + const auto connection = FindConnection(runtime, connection_id); + if (connection == nullptr) return -1; + + auto stream = std::make_shared(); + stream->runtime = runtime; + stream->owner = connection; + stream->kind = kind; + stream->has_kind = true; + stream->id = NextId(runtime); + Stream* raw = stream.get(); + + auto status = runtime->api->StreamOpen( + connection->handle, QUIC_STREAM_OPEN_FLAG_UNIDIRECTIONAL, + StreamCallback, raw, &raw->handle); + if (QUIC_FAILED(status)) { + return Refuse(runtime, status, "CultMesh QUIC stream open failed (status=" + + Hex(static_cast(status)) + ")."); + } + // In the map before it starts. `StreamStart` can reach shutdown-complete on + // an MsQuic worker before it returns here, and that callback has to find the + // stream to report it and to drop the map's reference. + { + std::lock_guard lock(runtime->gate); + runtime->streams.emplace(raw->id, stream); + } + status = runtime->api->StreamStart(raw->handle, QUIC_STREAM_START_FLAG_IMMEDIATE); + if (QUIC_FAILED(status)) { + DestroyStream(runtime, raw->id); + return Refuse(runtime, status, "CultMesh QUIC stream start failed (status=" + + Hex(static_cast(status)) + ")."); + } + + // The kind byte is the first thing on the stream, which is what the peer's + // reassembly reads before any length prefix. + auto* request = new SendRequest(); + request->bytes.assign(1, kind); + request->buffer.Buffer = request->bytes.data(); + request->buffer.Length = 1; + status = runtime->api->StreamSend(raw->handle, &request->buffer, 1, QUIC_SEND_FLAG_NONE, request); + if (QUIC_FAILED(status)) { + delete request; + return Refuse(runtime, status, "CultMesh QUIC stream kind could not be sent (status=" + + Hex(static_cast(status)) + ")."); + } + + *out_stream_id = raw->id; + return 0; +} + +CULTMESH_API int32_t cultmesh_quic_stream_send_frame( + void* handle, uint64_t stream_id, const uint8_t* encoded_frame, int32_t length, int32_t fin) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || encoded_frame == nullptr || length <= 0) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; + if (static_cast(length) > kMaximumEncodedFrameBytes) return -2; + // The reference is held for the whole `StreamSend` below, so the worker + // cannot free the stream or close its handle underneath this call. + const auto stream = FindStream(runtime, stream_id); + if (stream == nullptr || stream->handle == nullptr) return -1; + + // The bytes are copied because MsQuic reads them after this returns; the + // 4-byte LE length prefix is the QUIC stream framing, and it is added here + // so that framing lives in one place for both directions. + auto* request = new SendRequest(); + request->is_frame = true; + request->bytes.resize(sizeof(uint32_t) + static_cast(length)); + WriteUInt32LittleEndian(request->bytes.data(), static_cast(length)); + std::memcpy(request->bytes.data() + sizeof(uint32_t), encoded_frame, static_cast(length)); + request->buffer.Buffer = request->bytes.data(); + request->buffer.Length = static_cast(request->bytes.size()); + + const auto flags = (fin != 0) ? QUIC_SEND_FLAG_FIN : QUIC_SEND_FLAG_NONE; + const auto status = runtime->api->StreamSend(stream->handle, &request->buffer, 1, flags, request); + if (QUIC_FAILED(status)) { + delete request; + return Refuse(runtime, status, "CultMesh QUIC frame send failed (status=" + + Hex(static_cast(status)) + ")."); + } + return 0; +} + +CULTMESH_API void cultmesh_quic_stream_shutdown(void* handle, uint64_t stream_id, uint64_t code) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return; + CallScope scope(runtime); + if (!scope.entered()) return; + const auto stream = FindStream(runtime, stream_id); + if (stream == nullptr || stream->handle == nullptr) return; + runtime->api->StreamShutdown(stream->handle, QUIC_STREAM_SHUTDOWN_FLAG_ABORT, code); +} + +// The one blocking crossing; see section 6 of the header for its returns. The +// call scope is what `cultmesh_quic_runtime_close` waits on: a poller blocked +// here is woken by `closing` and counted out before anything is freed. +CULTMESH_API int32_t cultmesh_quic_next_event( + void* handle, int32_t timeout_ms, cultmesh_quic_event* out_event, + uint8_t* payload, int32_t payload_capacity, int32_t* out_required) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || out_event == nullptr || out_required == nullptr || payload_capacity < 0) + return -1; + // A null buffer with a non-zero capacity is a lie about the buffer. Taking + // it meant the event was consumed and its payload silently dropped. + if (payload == nullptr && payload_capacity > 0) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; + *out_required = 0; + + std::unique_lock lock(runtime->gate); + if (runtime->events.empty() && timeout_ms > 0) { + // The host's timeout bounds the wait; an event or the close ends it + // sooner, and `woken` is which of the two happened. RECORD_WAIT wraps + // this exact argument; see the development seam note near its macros. + const bool woken = runtime->signal.wait_for( + lock, CULTMESH_QUIC_DEBUG_RECORD_WAIT(std::chrono::milliseconds(timeout_ms)), + [runtime] { return !runtime->events.empty() || runtime->closing; }); + // Development builds only; a no-op unless a scenario has armed the hold. + // A held call returns the same 0 an empty queue would have, and makes no + // further call of its own. Only a woken call is held: one whose own + // timeout expired is on its way out, and parking it would let a scenario + // report a call the bridge kept when what kept it was the fixture. + if (woken && CULTMESH_QUIC_DEBUG_HELD(lock)) return 0; + } + if (runtime->events.empty()) return 0; + + const QueuedEvent& queued = runtime->events.front(); + const auto required = static_cast(queued.payload.size()); + if (required > payload_capacity) { + *out_required = required; + return 2; + } + *out_event = queued.header; + if (required > 0 && payload != nullptr) + std::memcpy(payload, queued.payload.data(), static_cast(required)); + *out_required = required; + runtime->events.pop_front(); + return 1; +} + +CULTMESH_API int32_t cultmesh_quic_last_error(void* handle, char* destination, int32_t capacity) { + auto* runtime = static_cast(handle); + if (runtime == nullptr || destination == nullptr || capacity <= 0) return -1; + CallScope scope(runtime); + if (!scope.entered()) return -1; + std::lock_guard lock(runtime->gate); + const size_t count = (std::min)(runtime->error.size(), static_cast(capacity - 1)); + std::memcpy(destination, runtime->error.data(), count); + destination[count] = '\0'; + return static_cast(count); +} + +CULTMESH_API int32_t cultmesh_quic_last_status(void* handle) { + auto* runtime = static_cast(handle); + if (runtime == nullptr) return 0; + CallScope scope(runtime); + if (!scope.entered()) return 0; + std::lock_guard lock(runtime->gate); + return runtime->last_status; +} + +// --------------------------------------------------------------------------- +// C ABI v1: the Unity shim. Windows only, by the same construction as its only +// caller (`CultMeshNativeQuicRealtimeTransport.CanConnect` is Windows-gated). +// +// These five exports are the contract the shipped Unity package imports by +// name. They are preserved byte for byte in signature and behaviour, and they +// decide nothing the v2 path does not: a v1 client is a private runtime with one +// connection. The single exception is the pin, which v1 compares here in C +// because that is what the managed connector was built against. +// --------------------------------------------------------------------------- + +#if defined(_WIN32) + +#include +#include +#include + +namespace { + enum class ClientState : int32_t { Connecting = 0, Connected = 1, @@ -38,50 +1287,33 @@ enum class ClientState : int32_t { Closed = 3, }; -struct Client; - -struct StreamContext { - explicit StreamContext(Client* client) : owner(client) {} - Client* owner; - std::vector buffered; - uint8_t kind = 0; - bool has_kind = false; -}; - -struct Client { - const QUIC_API_TABLE* api = nullptr; - HQUIC registration = nullptr; - HQUIC configuration = nullptr; - HQUIC connection = nullptr; - std::array certificate_pin{}; - std::atomic state{ClientState::Connecting}; - std::atomic closing{false}; - std::mutex gate; - std::deque> received; +struct V1Client { + Runtime* runtime = nullptr; + uint64_t connection_id = 0; + ClientState state = ClientState::Connecting; + std::deque> frames; std::string error; - std::string trace; + bool closing = false; + // The managed connector polls `state` and `poll` from its own loop and may + // read `error` from the caller's thread, so the drain and everything it + // mutates sit behind one lock. Held only around `Pump` and the fields; it is + // always taken before the runtime's, never after. + std::mutex gate; }; -void AppendTrace(Client* client, const std::string& event) { - if (client == nullptr || client->state.load() == ClientState::Connected) return; - std::lock_guard lock(client->gate); - if (!client->trace.empty()) client->trace += ","; - client->trace += event; -} - -std::string TraceSnapshot(Client* client) { - if (client == nullptr) return "none"; - std::lock_guard lock(client->gate); - return client->trace.empty() ? "none" : client->trace; -} - -void SetFailure(Client* client, const std::string& message) { - if (client == nullptr || client->closing.load()) return; - { - std::lock_guard lock(client->gate); - if (client->error.empty()) client->error = message; - } - client->state.store(ClientState::Failed); +std::string LoadedMsQuicPath() { + const auto module = GetModuleHandleW(L"msquic.dll"); + if (module == nullptr) return "unresolved"; + std::array path{}; + const auto length = GetModuleFileNameW(module, path.data(), static_cast(path.size())); + if (length == 0 || length >= path.size()) return "unresolved"; + const auto required = WideCharToMultiByte( + CP_UTF8, 0, path.data(), static_cast(length), nullptr, 0, nullptr, nullptr); + if (required <= 0) return "unresolved"; + std::string utf8(static_cast(required), '\0'); + WideCharToMultiByte( + CP_UTF8, 0, path.data(), static_cast(length), utf8.data(), required, nullptr, nullptr); + return utf8; } bool ParseHexNibble(char value, uint8_t& nibble) { @@ -104,287 +1336,90 @@ bool ParsePin(const char* value, std::array& pin) { return true; } -uint32_t ReadUInt32LittleEndian(const uint8_t* value) { - return static_cast(value[0]) | - (static_cast(value[1]) << 8) | - (static_cast(value[2]) << 16) | - (static_cast(value[3]) << 24); -} +// Drains the runtime's event queue into the v1 client's own shape: frames for +// `poll`, a state for `state`, an error string for `error`. This is where the +// v1 contract is reconstructed from v2 events, and the only place it is. +void Pump(V1Client* client) { + cultmesh_quic_event header{}; + std::vector payload; + for (;;) { + int32_t required = 0; + auto result = cultmesh_quic_next_event( + client->runtime, 0, &header, + payload.empty() ? nullptr : payload.data(), + static_cast(payload.size()), &required); + if (result == 2) { + payload.resize(static_cast(required)); + continue; + } + if (result != 1) break; -void FailStream(StreamContext* stream, const char* message) { - SetFailure(stream->owner, message); - if (stream->owner != nullptr && stream->owner->api != nullptr && stream->owner->connection != nullptr) - stream->owner->api->ConnectionShutdown( - stream->owner->connection, - QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, - kStreamAbortCode); -} - -bool ConsumeFrames(StreamContext* stream) { - auto& bytes = stream->buffered; - if (!stream->has_kind) { - if (bytes.empty()) return true; - stream->kind = bytes.front(); - bytes.erase(bytes.begin()); - stream->has_kind = true; - if (stream->kind != kReliableStream && stream->kind != kLatestOnlyStream) { - FailStream(stream, "CultMesh QUIC stream kind is invalid."); - return false; + switch (header.type) { + case kEventConnectionConnected: + if (client->state == ClientState::Connecting) client->state = ClientState::Connected; + break; + case kEventStreamFrame: + client->frames.emplace_back(payload.begin(), payload.begin() + header.payload_length); + break; + case kEventConnectionShutdown: + if (client->closing) { + client->state = ClientState::Closed; + } else if (client->state != ClientState::Failed) { + client->state = ClientState::Failed; + if (client->error.empty()) { + char runtime_error[1024]{}; + cultmesh_quic_last_error(client->runtime, runtime_error, sizeof(runtime_error)); + // The pin refusal is the runtime's, and the managed + // connector matches on its wording; anything else is the + // transport's own reason plus where msquic came from. + client->error = runtime_error[0] != '\0' + ? std::string(runtime_error) + : std::string(reinterpret_cast(payload.data()), + static_cast(header.payload_length)); + client->error += " (msquic=" + LoadedMsQuicPath() + ")"; + } + } + break; + default: + break; } } - - while (bytes.size() >= sizeof(uint32_t)) { - const uint32_t length = ReadUInt32LittleEndian(bytes.data()); - if (length == 0 || length > kMaximumEncodedFrameBytes) { - FailStream(stream, "CultMesh QUIC frame length is invalid."); - return false; - } - const size_t framed_length = sizeof(uint32_t) + static_cast(length); - if (bytes.size() < framed_length) return true; - std::vector frame(length); - std::memcpy(frame.data(), bytes.data() + sizeof(uint32_t), length); - { - std::lock_guard lock(stream->owner->gate); - stream->owner->received.emplace_back(std::move(frame)); - } - bytes.erase(bytes.begin(), bytes.begin() + static_cast(framed_length)); - if (stream->kind == kLatestOnlyStream && !bytes.empty()) { - FailStream(stream, "CultMesh latest-only QUIC stream carried multiple frames."); - return false; - } - } - return true; } -QUIC_STATUS QUIC_API StreamCallback(HQUIC stream_handle, void* context, QUIC_STREAM_EVENT* event) { - auto* stream = static_cast(context); - switch (event->Type) { - case QUIC_STREAM_EVENT_RECEIVE: - for (uint32_t index = 0; index < event->RECEIVE.BufferCount; ++index) { - const auto& buffer = event->RECEIVE.Buffers[index]; - stream->buffered.insert(stream->buffered.end(), buffer.Buffer, buffer.Buffer + buffer.Length); - } - ConsumeFrames(stream); - break; - case QUIC_STREAM_EVENT_PEER_SEND_SHUTDOWN: - if (!stream->buffered.empty()) - FailStream(stream, "CultMesh QUIC stream ended with a truncated frame."); - break; - case QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE: - if (!event->SHUTDOWN_COMPLETE.AppCloseInProgress) - stream->owner->api->StreamClose(stream_handle); - delete stream; - break; - default: - break; - } - return QUIC_STATUS_SUCCESS; -} - -bool CertificateMatchesPin(Client* client, QUIC_CERTIFICATE* certificate) { +bool CertificateMatchesPin(Connection* connection, QUIC_CERTIFICATE* certificate) { if (certificate == nullptr) return false; const auto* encoded = reinterpret_cast(certificate); if (encoded->Buffer == nullptr || encoded->Length == 0) return false; BYTE digest[32]{}; DWORD digest_length = sizeof(digest); if (!CryptHashCertificate2( - BCRYPT_SHA256_ALGORITHM, - 0, - nullptr, - encoded->Buffer, - encoded->Length, - digest, - &digest_length) || digest_length != sizeof(digest)) + BCRYPT_SHA256_ALGORITHM, 0, nullptr, + encoded->Buffer, encoded->Length, digest, &digest_length) || + digest_length != sizeof(digest)) return false; - return std::memcmp(digest, client->certificate_pin.data(), sizeof(digest)) == 0; -} - -std::string Hex(uint64_t value) { - std::ostringstream text; - text << "0x" << std::hex << std::uppercase << value; - return text.str(); -} - -std::string LoadedMsQuicPath() { - const auto module = GetModuleHandleW(L"msquic.dll"); - if (module == nullptr) return "unresolved"; - std::array path{}; - const auto length = GetModuleFileNameW(module, path.data(), static_cast(path.size())); - if (length == 0 || length >= path.size()) return "unresolved"; - const auto required = WideCharToMultiByte( - CP_UTF8, 0, path.data(), static_cast(length), nullptr, 0, nullptr, nullptr); - if (required <= 0) return "unresolved"; - std::string utf8(static_cast(required), '\0'); - WideCharToMultiByte( - CP_UTF8, 0, path.data(), static_cast(length), utf8.data(), required, nullptr, nullptr); - return utf8; -} - -QUIC_STATUS QUIC_API ConnectionCallback(HQUIC connection, void* context, QUIC_CONNECTION_EVENT* event) { - auto* client = static_cast(context); - AppendTrace(client, "event=" + std::to_string(static_cast(event->Type))); - switch (event->Type) { - case QUIC_CONNECTION_EVENT_CONNECTED: - client->state.store(ClientState::Connected); - break; - case QUIC_CONNECTION_EVENT_PEER_STREAM_STARTED: { - auto* stream = new (std::nothrow) StreamContext(client); - if (stream == nullptr) return QUIC_STATUS_OUT_OF_MEMORY; - client->api->SetCallbackHandler( - event->PEER_STREAM_STARTED.Stream, - reinterpret_cast(StreamCallback), - stream); - break; - } - case QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED: - { - AppendTrace( - client, - "certificate-status=" + - Hex(static_cast(event->PEER_CERTIFICATE_RECEIVED.DeferredStatus))); - const auto matches = CertificateMatchesPin( - client, - event->PEER_CERTIFICATE_RECEIVED.Certificate); - if (!matches) { - SetFailure(client, "CultMesh QUIC provider certificate does not match the advertised SHA-256 pin."); - } - const auto completion = client->api->ConnectionCertificateValidationComplete( - connection, - matches ? TRUE : FALSE, - matches ? QUIC_TLS_ALERT_CODE_SUCCESS : QUIC_TLS_ALERT_CODE_BAD_CERTIFICATE); - if (QUIC_FAILED(completion)) { - SetFailure( - client, - "CultMesh QUIC certificate validation completion failed (status=" + - Hex(static_cast(completion)) + ")."); - return completion; - } - return QUIC_STATUS_PENDING; - } - case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: - if (!client->closing.load()) { - SetFailure( - client, - "CultMesh QUIC connection was shut down by the transport " - "(status=" + Hex(static_cast(event->SHUTDOWN_INITIATED_BY_TRANSPORT.Status)) + - ", error=" + Hex(event->SHUTDOWN_INITIATED_BY_TRANSPORT.ErrorCode) + - ", msquic=" + LoadedMsQuicPath() + - ", events=" + TraceSnapshot(client) + ")."); - } - break; - case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_PEER: - if (!client->closing.load()) - SetFailure(client, "CultMesh QUIC connection was shut down by the provider."); - break; - case QUIC_CONNECTION_EVENT_SHUTDOWN_COMPLETE: - if (client->closing.load()) client->state.store(ClientState::Closed); - break; - default: - break; - } - return QUIC_STATUS_SUCCESS; -} - -void CloseHandles(Client* client) { - if (client->connection != nullptr) { - client->api->ConnectionClose(client->connection); - client->connection = nullptr; - } - if (client->configuration != nullptr) { - client->api->ConfigurationClose(client->configuration); - client->configuration = nullptr; - } - if (client->registration != nullptr) { - client->api->RegistrationClose(client->registration); - client->registration = nullptr; - } - if (client->api != nullptr) { - MsQuicClose(client->api); - client->api = nullptr; - } + return std::memcmp(digest, connection->pin.data(), sizeof(digest)) == 0; } } // namespace CULTMESH_API int32_t cultmesh_quic_open( - const char* host, - uint16_t port, - const char* certificate_sha256, - Client** result) { + const char* host, uint16_t port, const char* certificate_sha256, V1Client** result) { if (host == nullptr || *host == '\0' || port == 0 || result == nullptr) return -1; *result = nullptr; - auto client = std::make_unique(); - if (!ParsePin(certificate_sha256, client->certificate_pin)) return -2; - QUIC_STATUS status = MsQuicOpenVersion( - kApiVersion, - reinterpret_cast(&client->api)); - if (QUIC_FAILED(status)) return status; + std::array pin{}; + if (!ParsePin(certificate_sha256, pin)) return -2; - const QUIC_REGISTRATION_CONFIG registration_config = { - "GameCult.Mesh.Quic.Native", - QUIC_EXECUTION_PROFILE_TYPE_REAL_TIME - }; - status = client->api->RegistrationOpen(®istration_config, &client->registration); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); - return status; - } + auto client = std::make_unique(); + void* runtime_handle = nullptr; + const auto opened = cultmesh_quic_runtime_open("GameCult.Mesh.Quic.Native", &runtime_handle); + if (opened != 0) return opened; + client->runtime = static_cast(runtime_handle); - QUIC_SETTINGS settings{}; - settings.IdleTimeoutMs = 30000; - settings.IsSet.IdleTimeoutMs = TRUE; - settings.KeepAliveIntervalMs = 5000; - settings.IsSet.KeepAliveIntervalMs = TRUE; - settings.PeerUnidiStreamCount = 1024; - settings.IsSet.PeerUnidiStreamCount = TRUE; - const QUIC_BUFFER alpn = { - static_cast(sizeof(kAlpn) - 1), - reinterpret_cast(const_cast(kAlpn)) - }; - status = client->api->ConfigurationOpen( - client->registration, - &alpn, - 1, - &settings, - sizeof(settings), - nullptr, - &client->configuration); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); - return status; - } - - QUIC_CREDENTIAL_CONFIG credentials{}; - credentials.Type = QUIC_CREDENTIAL_TYPE_NONE; - credentials.Flags = static_cast( - QUIC_CREDENTIAL_FLAG_CLIENT | - QUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVED | - QUIC_CREDENTIAL_FLAG_DEFER_CERTIFICATE_VALIDATION | - QUIC_CREDENTIAL_FLAG_USE_PORTABLE_CERTIFICATES); - status = client->api->ConfigurationLoadCredential(client->configuration, &credentials); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); - return status; - } - - status = client->api->ConnectionOpen( - client->registration, - ConnectionCallback, - client.get(), - &client->connection); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); - return status; - } - status = client->api->ConnectionStart( - client->connection, - client->configuration, - QUIC_ADDRESS_FAMILY_UNSPEC, - host, - port); - if (QUIC_FAILED(status)) { - CloseHandles(client.get()); + // The pin goes in before the connection starts; see OpenConnection. + const auto status = OpenConnection(client->runtime, host, port, &client->connection_id, &pin); + if (status != 0) { + cultmesh_quic_runtime_close(client->runtime); return status; } @@ -392,49 +1427,87 @@ CULTMESH_API int32_t cultmesh_quic_open( return 0; } -CULTMESH_API int32_t cultmesh_quic_state(Client* client) { +CULTMESH_API int32_t cultmesh_quic_state(V1Client* client) { if (client == nullptr) return static_cast(ClientState::Failed); - return static_cast(client->state.load()); + std::lock_guard lock(client->gate); + Pump(client); + return static_cast(client->state); } CULTMESH_API int32_t cultmesh_quic_poll( - Client* client, - uint8_t* destination, - int32_t destination_length, - int32_t* required_length) { + V1Client* client, uint8_t* destination, int32_t destination_length, int32_t* required_length) { if (client == nullptr || required_length == nullptr || destination_length < 0) return -1; std::lock_guard lock(client->gate); - if (client->received.empty()) { + Pump(client); + if (client->frames.empty()) { *required_length = 0; - return client->state.load() == ClientState::Failed ? -2 : 0; + return client->state == ClientState::Failed ? -2 : 0; } - const auto& frame = client->received.front(); + const auto& frame = client->frames.front(); if (frame.size() > static_cast(INT32_MAX)) return -3; *required_length = static_cast(frame.size()); if (destination == nullptr || destination_length < *required_length) return 2; std::memcpy(destination, frame.data(), frame.size()); - client->received.pop_front(); + client->frames.pop_front(); return 1; } -CULTMESH_API int32_t cultmesh_quic_error( - Client* client, - char* destination, - int32_t destination_length) { +CULTMESH_API int32_t cultmesh_quic_error(V1Client* client, char* destination, int32_t destination_length) { if (client == nullptr || destination == nullptr || destination_length <= 0) return -1; std::lock_guard lock(client->gate); + Pump(client); const size_t count = (std::min)(client->error.size(), static_cast(destination_length - 1)); std::memcpy(destination, client->error.data(), count); destination[count] = '\0'; return static_cast(count); } -CULTMESH_API void cultmesh_quic_close(Client* client) { +CULTMESH_API void cultmesh_quic_close(V1Client* client) { if (client == nullptr) return; - client->closing.store(true); - if (client->connection != nullptr && client->api != nullptr) - client->api->ConnectionShutdown(client->connection, QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT, kConnectionCloseCode); - CloseHandles(client); - client->state.store(ClientState::Closed); + { + std::lock_guard lock(client->gate); + client->closing = true; + } + // `runtime_close` already shuts the connection down silently with the same + // CULT close code and then closes the handle, which is what v1 did before + // it delegated. Shutting it down here as well would only race that. + cultmesh_quic_runtime_close(client->runtime); + client->state = ClientState::Closed; delete client; } + +#endif // _WIN32 + +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) +// The development seam's three exports. They exist only in a build configured +// with CULTMESH_QUIC_DEBUG_ASSERTS; a shipped library exports neither these nor +// the counters behind them. See section 7 of the header. +CULTMESH_API void cultmesh_quic_debug_hold_calls(int32_t hold) { + if (hold != 0) { + debug_peak_calls.store(0); + debug_calls_at_close.store(-1); + } + { + std::lock_guard lock(debug_hold_gate); + debug_hold_armed = hold != 0; + } + debug_hold_signal.notify_all(); +} + +CULTMESH_API int32_t cultmesh_quic_debug_peak_calls(void) { + return debug_peak_calls.load(); +} + +CULTMESH_API int32_t cultmesh_quic_debug_calls_at_close(void) { + return debug_calls_at_close.load(); +} + +CULTMESH_API int32_t cultmesh_quic_debug_last_wait_ms(void) { + return debug_wait_recorded.load() ? debug_last_wait_ms.load() : -1; +} + +CULTMESH_API void cultmesh_quic_debug_reset_last_wait_ms(void) { + debug_wait_recorded.store(false); + debug_last_wait_ms.store(-1); +} +#endif diff --git a/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h new file mode 100644 index 00000000..758ecb8a --- /dev/null +++ b/native/GameCult.Mesh.Quic.Native/include/cultmesh_quic_native.h @@ -0,0 +1,371 @@ +/* GameCult.Mesh.Quic.Native — C ABI v2, the runtime-neutral CultMesh QUIC bridge. + * + * This header is the contract. It is the single place the event layout, the + * exports, the id and return-code conventions, the object lifetime rules and the + * threading rules are stated; `cultmesh_quic_native.cpp` includes it, the README + * points at it, and a host that cannot include it (koffi, P/Invoke) declares the + * same thing in its own FFI and is checked against this file by a test. + * + * It is C. It includes nothing of MsQuic, nothing of Node, nothing of Unity, and + * nothing platform-specific: a host binds these twelve queue exports plus + * `cultmesh_quic_last_status` and needs no other build input. + * + * The v1 Unity exports (`cultmesh_quic_open`, `_state`, `_poll`, `_error`, + * `_close`) are deliberately not here. They are a Windows-only shim for a + * shipped managed connector, not a contract offered to new hosts. + */ + +#ifndef CULTMESH_QUIC_NATIVE_H +#define CULTMESH_QUIC_NATIVE_H + +#include +#include + +#if defined(__cplusplus) +#define CULTMESH_QUIC_STATIC_ASSERT(condition, message) static_assert(condition, message) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#define CULTMESH_QUIC_STATIC_ASSERT(condition, message) _Static_assert(condition, message) +#else +#define CULTMESH_QUIC_STATIC_ASSERT(condition, message) +#endif + +/* `CULTMESH_QUIC_BUILD` is defined by the bridge's own translation unit and by + * nothing else. A consumer gets plain declarations and links by name, which is + * what every host here does: all three load the library at runtime. */ +#if defined(CULTMESH_QUIC_BUILD) +# if defined(_WIN32) +# define CULTMESH_QUIC_API __declspec(dllexport) +# else +# define CULTMESH_QUIC_API __attribute__((visibility("default"))) +# endif +#else +# define CULTMESH_QUIC_API +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/* --------------------------------------------------------------------------- + * 1. The event + * + * Exactly 64 bytes, no implicit padding, field order below is the ABI. A host + * that reorders a field reads a different struct; the offsets are asserted here + * so a compiler that pads differently fails the build rather than the wire. + * --------------------------------------------------------------------------- */ + +struct cultmesh_quic_event { + uint32_t type; /* offset 0 — one of the cultmesh_quic_event_type values */ + uint32_t stream_kind; /* offset 4 — 1 reliable, 2 latest-only; 0 when not a stream event */ + uint64_t listener_id; /* offset 8 — 0 for an outbound connection */ + uint64_t connection_id; /* offset 16 */ + uint64_t stream_id; /* offset 24 */ + uint64_t code; /* offset 32 — meaning depends on `type`; see below */ + int32_t status; /* offset 40 — the raw platform QUIC status, diagnostics only */ + int32_t payload_length; /* offset 44 — bytes written into the caller's payload buffer */ + uint8_t reserved[16]; /* offset 48 — zero today; do not read meaning into it */ +}; + +CULTMESH_QUIC_STATIC_ASSERT(sizeof(struct cultmesh_quic_event) == 64, + "the event struct is a 64-byte ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, type) == 0, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, stream_kind) == 4, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, listener_id) == 8, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, connection_id) == 16, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, stream_id) == 24, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, code) == 32, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, status) == 40, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, payload_length) == 44, + "event field offsets are an ABI contract"); +CULTMESH_QUIC_STATIC_ASSERT(offsetof(struct cultmesh_quic_event, reserved) == 48, + "event field offsets are an ABI contract"); + +enum cultmesh_quic_event_type { + /* A listener accepted an inbound connection. `listener_id`, `connection_id`. */ + CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION = 1, + /* The handshake completed. `connection_id`. */ + CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED = 2, + /* Payload: the peer's DER certificate. The handshake is blocked until the + * host answers with `cultmesh_quic_connection_certificate_complete`. */ + CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED = 3, + /* The connection is gone, whoever ended it, and its id no longer resolves. + * Payload: a UTF-8 reason. `code` is the QUIC application error code — the + * peer's when the peer ended it, and the code the host passed to + * `cultmesh_quic_connection_shutdown` when the host did. Emitted exactly + * once per connection id, including for the initiator of a local shutdown: + * every connection id's end is observable from the host that owns it. */ + CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN = 4, + /* An inbound stream's first byte named its kind. `stream_id`, `stream_kind`. */ + CULTMESH_QUIC_EVENT_STREAM_STARTED = 5, + /* Payload: one whole encoded frame, the 4-byte length prefix stripped. */ + CULTMESH_QUIC_EVENT_STREAM_FRAME = 6, + /* One per `cultmesh_quic_stream_send_frame` call that returned 0, and never + * for the bridge's own kind byte. `code` is a cultmesh_quic_send_result. */ + CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE = 7, + /* The stream is gone. `stream_id`, `stream_kind`. */ + CULTMESH_QUIC_EVENT_STREAM_SHUTDOWN = 8, + /* The listener stopped. `listener_id`. */ + CULTMESH_QUIC_EVENT_LISTENER_STOPPED = 9 +}; + +/* The `code` of event 7. A canceled send is a send MsQuic released without + * putting on the wire — the stream was aborted or the connection ended under it. + * It is reported, not silently dropped. */ +enum cultmesh_quic_send_result { + CULTMESH_QUIC_SEND_COMPLETED = 0, + CULTMESH_QUIC_SEND_CANCELED = 1 +}; + +/* The first byte of every CultMesh QUIC stream. */ +enum cultmesh_quic_stream_kind { + CULTMESH_QUIC_STREAM_RELIABLE = 1, + CULTMESH_QUIC_STREAM_LATEST_ONLY = 2 +}; + +/* --------------------------------------------------------------------------- + * 2. Ids + * + * Listeners, connections and streams are named by `uint64_t` ids drawn from one + * per-runtime counter that starts at 1 and never repeats. 0 is never a valid id + * and is what an out parameter holds when a call fails. An id is the only thing + * a host ever holds: there is no host-visible pointer to a connection or stream, + * so a host cannot outlive an object it is naming. An id whose object is gone is + * a bad call (-1), not undefined behaviour. + * --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- + * 3. Return codes — negative on a bad call, on every platform + * + * Every int32_t-returning export returns: + * + * 0 the call succeeded + * 1, 2 `cultmesh_quic_next_event` only; see its comment + * -1 a bad call: a null handle, a null out parameter, + * or an id whose object is gone + * -2 an argument the bridge rejects on its own terms: + * an unknown stream kind, an oversized frame, a + * listener host that is not an IP literal + * <= -1000 MsQuic refused. The bridge code is + * -(1000 + (raw_status & 0xffff)); the raw + * platform status is available from + * `cultmesh_quic_last_status` and a sentence about + * it from `cultmesh_quic_last_error`. + * + * This mapping exists because `QUIC_STATUS` itself is not portable: it is a + * negative HRESULT on Windows and a positive errno on POSIX, so a host that + * checked for a negative value saw every Linux failure as success. + * + * What the mapping makes portable is the sign, and only the sign. A failure is + * negative everywhere, and that is what a host may branch on. The magnitude of a + * <= -1000 code is diagnostic and platform-specific: the same MsQuic failure + * carries different numbers on different platforms (a TLS error is -12032 on + * win32-x64 and -1126 on linux-x64; an ALPN already in use is -1009 against + * -1091), and the 16-bit mask can give two distinct statuses the same code + * (`QUIC_STATUS_USER_CANCELED` and `QUIC_STATUS_FILE_NOT_FOUND` are both -1002 + * on Windows). Switching on a particular code is therefore not portable and not + * a reliable identification of the failure. Report it, log it, and read + * `cultmesh_quic_last_status` and `cultmesh_quic_last_error` beside it. + * --------------------------------------------------------------------------- */ + +#define CULTMESH_QUIC_RESULT_BAD_CALL (-1) +#define CULTMESH_QUIC_RESULT_BAD_ARGUMENT (-2) +#define CULTMESH_QUIC_RESULT_MSQUIC_BASE (-1000) + +/* --------------------------------------------------------------------------- + * 4. Object lifetime — resolved from an id, kept alive across the call + * + * The bridge's objects are shared-owned. The runtime's maps hold one reference + * each; an export that names an id takes its own reference under the lock and + * holds it for the whole MsQuic call, so an object cannot be freed under a host + * thread that is using it. MsQuic's worker, on shutdown-complete, removes the + * map entry and drops the map's reference only — it never frees an object a host + * call is inside. + * + * The MsQuic handle follows the object: it is closed exactly once, by whichever + * holder drops the last reference (or by `cultmesh_quic_runtime_close`), under a + * one-shot exchange guard. A handle is therefore valid for as long as any holder + * has a reference to its object, which is the property the host thread needs. A + * stream holds a reference to its connection, so stream handles are always + * closed before the connection handle they belong to. + * + * `cultmesh_quic_runtime_close` quiesces before it tears anything down. It marks + * the runtime closing, wakes every blocked `cultmesh_quic_next_event`, and waits + * for every in-flight export to return before it closes a handle or frees a + * byte. No host call may begin after `cultmesh_quic_runtime_close` starts. That + * ordering is the host's, and it is a prohibition rather than a race the bridge + * arbitrates: once the close returns, the handle names freed memory, and a call + * made with it has nothing left to refuse it. A call that races the start of the + * close, while it is still running, is refused with -1 and touches nothing; that + * narrows one mis-ordering and does not make the prohibition optional. + * --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- + * 5. Threading + * + * There are no host callbacks. Every crossing is the host calling in. + * + * - MsQuic's worker threads run inside this library only. They push events onto + * the runtime's queue and wake the one blocking wait. No host code is ever + * called from a thread the host does not own. + * - `cultmesh_quic_next_event` is called from host threads, one or many. It is + * the only blocking export. Concurrent callers each get a distinct event. + * - Every other export may be called from any host thread at any time, except + * during or after `cultmesh_quic_runtime_close`. + * - `cultmesh_quic_runtime_close` is called once, from one thread, and + * quiesces as described above. + * --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- + * 6. The exports + * --------------------------------------------------------------------------- */ + +/* Opens a runtime: one MsQuic registration, one event queue. `app_name` may be + * null. `*out_runtime` is the opaque handle every other export takes. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_runtime_open( + const char* app_name, void** out_runtime); + +/* Quiesces, tears down and frees the runtime. Safe to call with null. After it + * returns, the handle is dead; see section 4 for the ordering rule. */ +CULTMESH_QUIC_API void cultmesh_quic_runtime_close(void* runtime); + +/* Opens a provider listener on `host`:`port` with a PKCS12 credential. `host` + * may be null or empty for any address, otherwise it must be an IP literal. + * `port` 0 binds an ephemeral port, which `*out_bound_port` reports. A failure + * leaves no listener behind and no id allocated to the host. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_listener_open( + void* runtime, const char* host, uint16_t port, + const uint8_t* pkcs12, int32_t pkcs12_length, const char* password, + uint64_t* out_listener_id, uint16_t* out_bound_port); + +/* Stops and closes a listener. Its accepted connections are not affected. + * Emits event 9. Unknown ids are ignored. */ +CULTMESH_QUIC_API void cultmesh_quic_listener_close( + void* runtime, uint64_t listener_id); + +/* Starts an outbound connection. Certificate validation is deferred: the host + * gets event 3 and must answer. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_connection_open( + void* runtime, const char* host, uint16_t port, uint64_t* out_connection_id); + +/* Answers event 3. `accept` non-zero continues the handshake; zero fails it with + * a bad-certificate alert. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_connection_certificate_complete( + void* runtime, uint64_t connection_id, int32_t accept); + +/* Ends a connection with a QUIC application error code. The initiator gets its + * own event 4 carrying `code`, as the peer does. Unknown ids are ignored. */ +CULTMESH_QUIC_API void cultmesh_quic_connection_shutdown( + void* runtime, uint64_t connection_id, uint64_t code); + +/* Opens an outbound unidirectional stream and puts `kind` on the wire as its + * first byte. That byte is the bridge's own and never produces an event 7. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_stream_open( + void* runtime, uint64_t connection_id, uint8_t kind, uint64_t* out_stream_id); + +/* Queues one whole encoded frame, length-prefixed by the bridge. A call that + * returns 0 produces exactly one event 7 later, completed or canceled. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_stream_send_frame( + void* runtime, uint64_t stream_id, + const uint8_t* encoded_frame, int32_t length, int32_t fin); + +/* Aborts a stream with a QUIC application error code. Unknown ids are ignored. */ +CULTMESH_QUIC_API void cultmesh_quic_stream_shutdown( + void* runtime, uint64_t stream_id, uint64_t code); + +/* The one blocking crossing. + * + * 0 nothing within `timeout_ms`. A poller already blocked here when + * `cultmesh_quic_runtime_close` starts is woken and returns 0. A poll that + * begins after the close starts is forbidden by section 4, and is not a + * case this return code covers. + * 1 `*out_event` filled and up to `payload_capacity` payload bytes copied; + * `*out_required` is the payload size + * 2 `payload_capacity` is too small. Nothing is consumed and nothing is + * written to `*out_event`; `*out_required` is the size to allocate. Ask + * again with a big enough buffer and the same event is delivered. + * -1 a bad call, including a null `payload` with a non-zero + * `payload_capacity`, which is a lie about the buffer and is refused + * rather than treated as a discard. + * + * `payload` may be null when `payload_capacity` is 0: that is the two-phase + * poll's first ask. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_next_event( + void* runtime, int32_t timeout_ms, struct cultmesh_quic_event* out_event, + uint8_t* payload, int32_t payload_capacity, int32_t* out_required); + +/* The last error sentence, NUL-terminated, truncated to `capacity`. Returns the + * number of bytes written, or -1 on a bad call. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_last_error( + void* runtime, char* destination, int32_t capacity); + +/* The raw platform `QUIC_STATUS` behind the last <= -1000 return, as its own + * bits: a negative HRESULT on Windows, a positive errno on POSIX. Diagnostics + * only; what is portable about the return code is its sign, not its value. 0 + * when nothing has failed. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_last_status(void* runtime); + +/* --------------------------------------------------------------------------- + * 7. The development seam + * + * Present only in a library configured with `CULTMESH_QUIC_DEBUG_ASSERTS`, which + * a shipped build never is. It exists for the runtime-lifetime scenarios: the + * quiesce is a promise about host calls that are inside the library, and the + * wait scenarios need the same kind of promise about the exact duration the + * bridge hands its own condition wait. A scenario that can only sleep and hope + * cannot tell a bridge that counts and waits correctly from one that does not. + * + * It is process-wide, not per-runtime, because the numbers outlive the runtime + * they describe: `cultmesh_quic_runtime_close` frees the runtime, and the count + * it waited on is read afterwards. The scenarios open one runtime at a time. + * --------------------------------------------------------------------------- */ +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + +/* Non-zero arms the hold and resets both counters: every call that reaches the + * blocking wait in `cultmesh_quic_next_event` parks inside the library instead + * of returning. Zero releases every held call and disarms it. A held call + * returns 0 and touches the runtime no further. */ +CULTMESH_QUIC_API void cultmesh_quic_debug_hold_calls(int32_t hold); + +/* The high-water mark of host calls counted inside the library since the hold + * was armed. Zero means no call was ever counted. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_debug_peak_calls(void); + +/* How many host calls were counted inside the library when the last + * `cultmesh_quic_runtime_close` began its wait, or -1 if no close has begun one + * since the hold was armed. This is the number the wait exists for. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_debug_calls_at_close(void); + +/* The whole duration, in milliseconds, most recently handed to the condition + * wait inside `cultmesh_quic_next_event`, recorded at the point the wait is + * entered rather than observed from outside. A poll whose queue is not empty, + * or whose `timeout_ms` is not greater than zero, never enters that wait and + * leaves this unchanged. -1 until the first such wait, or after + * `cultmesh_quic_debug_reset_last_wait_ms` — tracked by a separate internal + * flag, not by -1 being stored here, so a wait that ever recorded exactly -1 + * itself could not be confused with nothing having been recorded. + * + * This exists because a wall-clock probe cannot tell the host's timeout from + * any function of it that is the identity at the probe's own value — a floor, + * a round, a clamp, a later-poll fault, there is always another one that + * matches. This reads what the bridge actually handed its wait instead of + * inferring it from how long a call took. */ +CULTMESH_QUIC_API int32_t cultmesh_quic_debug_last_wait_ms(void); + +/* Resets the value `cultmesh_quic_debug_last_wait_ms` reports to -1, without + * touching the hold or the two call counters above. */ +CULTMESH_QUIC_API void cultmesh_quic_debug_reset_last_wait_ms(void); + +#endif /* CULTMESH_QUIC_DEBUG_ASSERTS */ + +#if defined(__cplusplus) +} +#endif + +#endif /* CULTMESH_QUIC_NATIVE_H */ diff --git a/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp new file mode 100644 index 00000000..e42b6d25 --- /dev/null +++ b/native/GameCult.Mesh.Quic.Native/tests/cultmesh_quic_native_tests.cpp @@ -0,0 +1,1305 @@ +// Scenario runner for the bridge's runtime lifetime rules. +// +// This is the one part of the bridge a host cannot check by reading: whether +// `cultmesh_quic_runtime_close` is safe against host threads that are inside the +// library when it starts. Everything here drives that path and nothing else. It +// opens a runtime, parks pollers in `cultmesh_quic_next_event`, closes the +// runtime underneath them, and asserts what the header promises: every parked +// poller returns, and none of them touches the runtime after it is gone. +// +// It consumes the bridge through include/cultmesh_quic_native.h — the same +// contract a host has — and nothing else. No MsQuic header, no internals. +// +// The failures it exists to catch are not visible in the return values, because +// a use-after-free is not an error code. Two things make them visible instead: +// a sanitizer build (ThreadSanitizer for the notify/destroy race, AddressSanitizer +// for the freed-runtime dereference), and `CULTMESH_QUIC_DEBUG_ASSERTS`, which +// makes the bridge state the quiesce invariant itself rather than leaving it to +// be caught by an unlucky thread schedule. +// +// cultmesh_quic_native_tests closerace [iterations] [pollers] +// cultmesh_quic_native_tests holdclose [iterations] [pollers] +// cultmesh_quic_native_tests polltimeout [iterations] +// cultmesh_quic_native_tests pollbusy [iterations] +// cultmesh_quic_native_tests latecall [iterations] +// cultmesh_quic_native_tests holdtimeout [iterations] +// cultmesh_quic_native_tests waitseam [iterations] +// cultmesh_quic_native_tests pollhammer [iterations] +// cultmesh_quic_native_tests zerotimeout [iterations] +// cultmesh_quic_native_tests payloadfit [iterations] +// +// `closerace` hunts the race: many pollers, many iterations, and whatever the +// schedule gives. `holdclose` takes the guessing out of it — the bridge's +// development seam (section 7 of the header) holds the pollers inside the +// library until this scenario releases them, and reports how many host calls the +// bridge actually counted, so the scenario asserts the quiesce instead of +// assuming its own fixture worked. It needs CULTMESH_QUIC_DEBUG_ASSERTS. +// +// In both of those the wait is ended by the close, so the host's timeout governs +// nothing either of them can see, and a bridge waiting on a constant of its own +// passes both. `polltimeout` is the one that lets the timeout govern the return +// and measures it, and `pollbusy` measures it again with the host's other thread +// calling in throughout, which wakes the wait. `latecall` covers the other half +// of section 4: a call that races the start of a close is refused rather than +// counted behind its wait. +// `holdtimeout` covers the seam's own rule, which nothing else is in a position +// to see: the hold parks a call the wait woke and not one whose own timeout +// expired, so the quiesce the hold scenarios assert is the bridge's doing and +// not the fixture's. +// +// Self's ruling of 2026-09-22, after seven Soul passes against `polltimeout`, +// `pollbusy` and `holdtimeout` alone: a wall-clock probe cannot tell the host's +// timeout from any function of it that is the identity at the probe's own +// value, because there is always another function that matches. `waitseam` +// puts the observation where the rule is decided instead of where its effect +// eventually shows: it reads `cultmesh_quic_debug_last_wait_ms`, the bridge's +// own account of what it handed its condition wait, and asserts equality +// against the host's argument, deterministically, with no timing tolerance. +// `polltimeout`, `pollbusy` and `holdtimeout` stay only as generous-margin +// proof that the recorded wait is really waited and not merely recorded. +// `pollhammer` covers the wait's predicate the same way `pollbusy` used to try +// to: one thread hammers every gate-touching entry point that cannot itself +// queue an event, in a yield loop, while another holds a single idle poll, and +// the poll must still stay for its timeout. +// +// Exit code 0 means every assertion held. Anything else, including a sanitizer +// abort or the bridge's own assertion, is a failure. Under ThreadSanitizer run +// it with `TSAN_OPTIONS=halt_on_error=1`, or a reported race leaves the exit +// code to the last thing that set it. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +// `CloseRaceOnce`'s own settle budget, named here — ahead of `kPollTimeoutMs` +// below — so the poll timeout can be derived from it instead of drifting apart +// as a second freestanding number. Under CPU starvation the settle can spend +// this whole budget waiting for every poller to be counted inside the library +// before the close begins; a poll timeout shorter than that lets the first +// pollers time out for real while the fixture is still waiting on the last +// ones, which is exactly the failure this scenario exists to catch, not the +// one it is supposed to be running. +constexpr int32_t kCloseRaceCountedDeadlineMs = 30000; // asserts-on: cap on the peak_calls wait +constexpr int32_t kCloseRaceAssertsSettleMs = 50; // asserts-on: fixed remainder after counted +constexpr int32_t kCloseRaceNoSeamSettleMs = 500; // no-seam #else: fixed settle window +constexpr int32_t kCloseRaceSettleBudgetMs = + (kCloseRaceCountedDeadlineMs + kCloseRaceAssertsSettleMs) > kCloseRaceNoSeamSettleMs + ? (kCloseRaceCountedDeadlineMs + kCloseRaceAssertsSettleMs) + : kCloseRaceNoSeamSettleMs; + +// Long enough that a poller is still parked when the close begins, in every +// configuration, even when the settle above burns its whole budget. The close +// is what ends the wait; this timeout only bounds the scenario if the close +// never arrives, which is itself the failure, so a long poll timeout costs +// nothing on a passing run. The flat 5 s margin is headroom above the settle +// budget, not a second guess at it. +constexpr int32_t kPollTimeoutMs = kCloseRaceSettleBudgetMs + 5000; + +// A poller asks for a payload buffer, so the close races a `next_event` that has +// somewhere to copy into rather than one that can only ever return 0. +constexpr int32_t kPayloadCapacity = 4096; + +int Fail(const std::string& message) { + std::fprintf(stderr, "FAILED: %s\n", message.c_str()); + return 1; +} + +// One iteration: `pollers` threads parked in `next_event`, then a close under +// them. Returns an empty string when every promise held. +// +// Each poller makes exactly one blocking call and does not call again. Section 5 +// of the header puts the ordering on the host — no call may *begin* during a +// close — so a scenario that kept re-entering would be testing a shape the +// bridge declines to support, and its report would be the harness's own fault. +// A call already inside the library is the case the quiesce exists for, and that +// is the one run here. +std::string CloseRaceOnce(int pollers) { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + // Counts threads about to enter the blocking call. The close waits for all of + // them, so the race is run with the pollers actually inside rather than with + // threads that have not started yet. + std::atomic entering{0}; + std::atomic returned{0}; + std::atomic undefined_return{0}; + std::atomic timed_out{0}; + // Set just before the close, and read by each poller as it returns. A poller + // that is already out by then was never in the race, and a scenario full of + // those passes without testing anything: this is what catches a bridge whose + // blocking crossing has stopped blocking. + std::atomic closing_started{false}; + std::atomic left_before_the_close{0}; + +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + // Reset before any poller thread exists, so nothing here can race a + // `CallScope` that has already been counted: `cultmesh_quic_next_event` + // raises `debug_peak_calls` the moment its `CallScope` is constructed, at + // the very top of the call, and a reset performed even microseconds after + // that construction would zero a count no further call is coming to raise + // again, stranding the settle loop below at "not yet" until its deadline. + cultmesh_quic_debug_hold_calls(1); + cultmesh_quic_debug_hold_calls(0); +#endif + + std::vector threads; + threads.reserve(static_cast(pollers)); + for (int index = 0; index < pollers; ++index) { + threads.emplace_back([runtime, &entering, &returned, &undefined_return, &timed_out, + &closing_started, &left_before_the_close] { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + + entering.fetch_add(1); + const auto started = std::chrono::steady_clock::now(); + // Parked here when the close arrives. `closing` wakes the wait; the + // call scope this thread holds is what the close must count out + // before it frees anything. + const int32_t result = cultmesh_quic_next_event( + runtime, kPollTimeoutMs, &event, payload.data(), kPayloadCapacity, &required); + const auto elapsed = std::chrono::duration_cast( + std::chrono::steady_clock::now() - started).count(); + + if (result != 0 && result != 1 && result != 2) undefined_return.fetch_add(1); + // The close is what ends this wait. Sitting out the whole timeout + // instead means the wake never reached it. + if (elapsed >= kPollTimeoutMs / 2) timed_out.fetch_add(1); + if (!closing_started.load()) left_before_the_close.fetch_add(1); + returned.fetch_add(1); + }); + } + + while (entering.load() < pollers) std::this_thread::yield(); +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + // A fixed settle races CPU starvation: under enough contending threads a + // poller that has only incremented `entering` can sit preempted for far + // longer than any sleep this scenario could afford, so the close would + // begin before it ever reached the blocking wait — not the race this + // scenario exists to run, just a fixture that gave up too soon. Where the + // development seam is compiled in, this reads the bridge's own count + // instead of guessing at a duration: the settle ends only once every + // poller is actually counted inside, however long the scheduler took. + const auto counted_deadline = std::chrono::steady_clock::now() + + std::chrono::milliseconds(kCloseRaceCountedDeadlineMs); + while (cultmesh_quic_debug_peak_calls() < pollers && + std::chrono::steady_clock::now() < counted_deadline) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + + // The fixture's own settle can fail to reach every poller inside the + // deadline above, distinct from the race this scenario exists to run. + // Proceeding to the close anyway would then produce the pollers' own + // failure message — "N of M pollers returned before the close began" — + // which blames the pollers for a race the fixture never set up. Report + // this plainly instead, and unstick the parked pollers before returning so + // this iteration does not just sit out `kPollTimeoutMs`. + const int32_t counted = cultmesh_quic_debug_peak_calls(); + if (counted < pollers) { + closing_started.store(true); + cultmesh_quic_runtime_close(runtime); + for (auto& thread : threads) thread.join(); + return "fixture could not settle: " + std::to_string(counted) + " of " + + std::to_string(pollers) + " pollers counted inside after " + + std::to_string(kCloseRaceCountedDeadlineMs) + " ms"; + } + + // `active_calls` — what `peak_calls` reflects — is raised the moment a + // poller's `CallScope` is constructed, at the top of + // `cultmesh_quic_next_event`, not when it reaches the condition wait a few + // statements later. Counted-inside is the expensive part to wait for under + // starvation (getting the scheduler to run a thread at all); a short fixed + // settle covers the cheap remainder (a lock acquisition and an empty-queue + // check) once every poller is already scheduled and running. + std::this_thread::sleep_for(std::chrono::milliseconds(kCloseRaceAssertsSettleMs)); +#else + // No seam in this configuration (the sanitizer build deliberately ships + // without one), so the settle falls back to a longer fixed window rather + // than the 50 ms that starved under 16 contending burners. It is still a + // window, not a guarantee — the honest limit of a config with no way to + // ask the bridge what it has actually counted. + std::this_thread::sleep_for(std::chrono::milliseconds(kCloseRaceNoSeamSettleMs)); +#endif + + closing_started.store(true); + cultmesh_quic_runtime_close(runtime); + for (auto& thread : threads) thread.join(); + + if (left_before_the_close.load() != 0) + return std::to_string(left_before_the_close.load()) + " of " + std::to_string(pollers) + + " pollers returned before the close began, so they were never in the race"; + if (undefined_return.load() != 0) + return std::to_string(undefined_return.load()) + " poller(s) saw a return the header does not define"; + if (timed_out.load() != 0) + return std::to_string(timed_out.load()) + " of " + std::to_string(pollers) + + " pollers sat out the timeout instead of being woken by the close"; + if (returned.load() != pollers) + return std::to_string(returned.load()) + " of " + std::to_string(pollers) + " pollers returned"; + return {}; +} + +// The three timeouts `polltimeout` asks for: a spread, not a hunt for any +// particular derivation. `waitseam` is what proves the bridge hands its +// condition wait the host's own argument, exactly, at every value that matters +// — these three exist only to prove that value is then really waited on, so +// the spread just needs to be a short one, an ordinary one and a long one. +constexpr int32_t kShortestPollMs = 15; +constexpr int32_t kShortPollMs = 200; +constexpr int32_t kLongPollMs = 7300; + +// How much sooner than the timeout a poll may return. A wait may be late; it may +// not be early, because returning early is exactly what waiting on a shorter +// duration looks like. This is scheduler granularity, not slack. +constexpr int kEarlyToleranceMs = 20; + +// How much later than the timeout a poll may return. Generous on purpose: these +// scenarios are no longer where a clamp, a floor, a round or a scale is caught +// — `waitseam` catches those by equality, with no clock involved — so this only +// has to catch a wait that is wrong by a lot: a constant of the bridge's own, a +// wait that never happens, a hold that parks a call its own timeout already +// ended, or the W1-W3 family Self's ruling of 2026-09-22 added, which apply +// their arithmetic to the duration `wait_for` actually receives *after* the +// seam has already recorded it and so cannot be caught by `waitseam`'s +// equality check at all. 400 ms sits above the worst overshoot a 16-burner +// stress pass measured on a loaded win32 host (180 ms; 27 ms on linux) and +// below every one of W1-W3's smallest offsets (485 ms), so one flat margin +// still serves every probe this file times without going blind to the family +// it was widened for. +constexpr int kGenerousLateToleranceMs = 400; + +struct TimedPoll { + int32_t result; + long long elapsed_ms; +}; + +TimedPoll PollFor(void* runtime, int32_t timeout_ms) { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + const auto started = std::chrono::steady_clock::now(); + const int32_t result = cultmesh_quic_next_event( + runtime, timeout_ms, &event, payload.data(), kPayloadCapacity, &required); + const auto elapsed = std::chrono::duration_cast( + std::chrono::steady_clock::now() - started).count(); + return {result, elapsed}; +} + +// The host's timeout, and the only thing it is: how long a poll with nothing to +// deliver stays inside the library. Nothing else here checks it — `closerace` +// and `holdclose` both end their waits with a close, so in both of them the +// bridge could wait on any duration at all and every assertion would still hold. +// A runtime with no listener and no connection has nothing to deliver, so the +// timeout is what ends this poll, and the elapsed time is what it waited on. +// The bands every timed poll is held to, and the worst overshoot seen, which is +// printed so a tolerance can be checked against a machine under load rather than +// trusted. +struct Overshoot { + long long worst_ms = LLONG_MIN; + void Record(const TimedPoll& poll, int32_t timeout_ms) { + worst_ms = (std::max)(worst_ms, poll.elapsed_ms - timeout_ms); + } +}; + +std::string CheckTimedPoll(const TimedPoll& poll, int32_t timeout_ms, int late_tolerance_ms) { + const std::string asked = "a poll asking for " + std::to_string(timeout_ms) + " ms "; + if (poll.result != 0) + return asked + "returned " + std::to_string(poll.result) + ", not the 0 an idle runtime owes it"; + if (poll.elapsed_ms < timeout_ms - kEarlyToleranceMs) + return asked + "returned after " + std::to_string(poll.elapsed_ms) + + " ms: the wait ended on some shorter duration than the one it was given"; + if (poll.elapsed_ms > static_cast(timeout_ms) + late_tolerance_ms) + return asked + "returned after " + std::to_string(poll.elapsed_ms) + + " ms: the wait ended on some longer duration than the one it was given"; + return {}; +} + +constexpr std::array kTimedProbesMs{kShortestPollMs, kShortPollMs, kLongPollMs}; + +std::string PollTimeoutOnce(std::array& overshoot) { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + std::string failure; + for (size_t probe = 0; probe < kTimedProbesMs.size() && failure.empty(); ++probe) { + const TimedPoll poll = PollFor(runtime, kTimedProbesMs[probe]); + overshoot[probe].Record(poll, kTimedProbesMs[probe]); + failure = CheckTimedPoll(poll, kTimedProbesMs[probe], kGenerousLateToleranceMs); + } + + cultmesh_quic_runtime_close(runtime); + return failure; +} + +int PollTimeout(int iterations) { + std::array overshoot{}; + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = PollTimeoutOnce(overshoot); + if (!failure.empty()) + return Fail("polltimeout iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("polltimeout %dx: ok (worst overshoot %lld ms at %d, %lld ms at %d, %lld ms at %d)\n", + iterations, overshoot[0].worst_ms, kTimedProbesMs[0], overshoot[1].worst_ms, kTimedProbesMs[1], + overshoot[2].worst_ms, kTimedProbesMs[2]); + return 0; +} + +// How long `pollbusy`'s poll asks for, and how often the host's other thread +// calls into the library while it waits. +constexpr int32_t kBusyPollMs = 1000; +constexpr int kBusyCallEveryMs = 20; + +// The same rule as `polltimeout` — a poll with nothing to deliver stays for its +// timeout — for a host with more than one thread, which is every real host: one +// thread polls, another sends, shuts streams down, reads the last error. +// +// Every host call leaves through a scope that wakes every waiter on the +// runtime's condition variable, because that is how the close learns a call has +// left. So a poll is woken each time any other thread makes any call, and what +// keeps it inside is the wait's predicate: nothing queued and no close means +// wait again, for the rest of the time the host asked for. With one host thread +// nothing else ever calls during the wait, and the predicate could be deleted +// with every other scenario still green. +// +// The other thread keeps calling for twice the poll's timeout and then stops, +// so a wait that restarts its whole timeout on every wake is seen as late +// rather than hanging the scenario. +std::string PollBusyOnce(Overshoot& overshoot) { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + std::atomic calls{0}; + std::atomic refused{0}; + std::thread other([runtime, &calls, &refused] { + const auto until = std::chrono::steady_clock::now() + std::chrono::milliseconds(2 * kBusyPollMs); + std::array message{}; + while (std::chrono::steady_clock::now() < until) { + if (cultmesh_quic_last_error(runtime, message.data(), static_cast(message.size())) < 0) + refused.fetch_add(1); + calls.fetch_add(1); + std::this_thread::sleep_for(std::chrono::milliseconds(kBusyCallEveryMs)); + } + }); + + const TimedPoll poll = PollFor(runtime, kBusyPollMs); + const int calls_during = calls.load(); + other.join(); + cultmesh_quic_runtime_close(runtime); + + overshoot.Record(poll, kBusyPollMs); + if (refused.load() != 0) + return std::to_string(refused.load()) + " call(s) from the host's other thread were refused " + "by a runtime that was not closing"; + // The timing first: a poll that left on the first wake returns before the + // other thread has had time to make many calls, and that is the bridge + // failing, not the fixture. + const std::string failure = CheckTimedPoll(poll, kBusyPollMs, kGenerousLateToleranceMs); + if (!failure.empty()) return failure + ", while the host's other thread was calling in"; + // A poll that passed with fewer calls than this was never woken, and passed + // because the fixture did nothing rather than because the bridge held. + if (calls_during < 3) + return "the host's other thread made " + std::to_string(calls_during) + + " call(s) during the poll, so nothing woke it"; + return {}; +} + +int PollBusy(int iterations) { + Overshoot overshoot{}; + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = PollBusyOnce(overshoot); + if (!failure.empty()) + return Fail("pollbusy iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("pollbusy %dx: ok (worst overshoot %lld ms at %d)\n", iterations, overshoot.worst_ms, + kBusyPollMs); + return 0; +} + +// Nothing listens on the discard port, so a connection to it fails and the +// bridge says why. That reason is the payload this scenario needs, and reaching +// it takes no listener, no credential and no established connection. +constexpr uint16_t kClosedPort = 9; + +// How long the failure is given to arrive. The loopback refusal is immediate; +// if the refusal is swallowed instead, MsQuic's own handshake timeout ends the +// connection at 10 seconds and event 4 still arrives, so this only bounds a +// bridge that reports nothing at all. +constexpr int kEventDeadlineMs = 20000; + +// The bridge writes its own reason sentences and every one of them starts here. +// Checking the bytes, and not only the length, is what separates a payload +// copied out of the queued event from one copied out of an event that was popped +// first: the second reads freed memory, which does not spell this. +constexpr char kReasonPrefix[] = "CultMesh QUIC connection"; + +// The two-phase poll, which is the shape every host uses to size its buffer: +// ask with nothing, be told what it needs, ask again. What makes it work is that +// the refusal consumes nothing — the event is still queued, payload and all, +// after a return of 2 — and that the copy happens before the event is popped. +// Both are section 6 of the header, and nothing committed reached either. +std::string PayloadFitOnce() { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + std::string failure; + uint64_t connection_id = 0; + const int32_t connecting = + cultmesh_quic_connection_open(runtime, "127.0.0.1", kClosedPort, &connection_id); + if (connecting != 0) { + cultmesh_quic_runtime_close(runtime); + return "cultmesh_quic_connection_open returned " + std::to_string(connecting); + } + + // An out parameter the bridge must not write on a refusal, filled with + // something the bridge never writes so that a write is visible. + cultmesh_quic_event poisoned{}; + std::memset(&poisoned, 0xab, sizeof(poisoned)); + cultmesh_quic_event event = poisoned; + int32_t required = 0; + int32_t result = 0; + + // Ask with no room at all until the event carrying the failure reason + // arrives. An event with no payload fits in nothing, so it is delivered and + // polled past rather than mistaken for this one. + const auto deadline = std::chrono::steady_clock::now() + std::chrono::milliseconds(kEventDeadlineMs); + for (;;) { + event = poisoned; + required = 0; + result = cultmesh_quic_next_event(runtime, 250, &event, nullptr, 0, &required); + if (result == 2 && required > 0) break; + if (result < 0) { + failure = "cultmesh_quic_next_event returned " + std::to_string(result); + break; + } + if (std::chrono::steady_clock::now() >= deadline) { + failure = "no event carrying a payload arrived within " + + std::to_string(kEventDeadlineMs) + " ms of a connection to a closed port"; + break; + } + } + + if (failure.empty() && std::memcmp(&event, &poisoned, sizeof(event)) != 0) + failure = "the refusal wrote to *out_event, which the header says it leaves alone"; + + // Again, with the same empty buffer: a refusal that consumed the event + // leaves nothing to find the second time. + if (failure.empty()) { + cultmesh_quic_event again = poisoned; + int32_t required_again = 0; + const int32_t second = cultmesh_quic_next_event(runtime, 0, &again, nullptr, 0, &required_again); + if (second != 2 || required_again != required) + failure = "the second ask returned " + std::to_string(second) + " needing " + + std::to_string(required_again) + ", not the 2 needing " + std::to_string(required) + + " the first one did: the refusal consumed the event"; + } + + // And with room, which is where the copy happens. The tail beyond the + // payload is written too, so a copy that ran past what it was told to write + // is visible. + if (failure.empty()) { + constexpr uint8_t kTail = 0x5a; + std::vector payload(static_cast(required) + 16, kTail); + cultmesh_quic_event delivered = poisoned; + int32_t required_delivered = 0; + const int32_t third = cultmesh_quic_next_event( + runtime, 0, &delivered, payload.data(), static_cast(payload.size()), + &required_delivered); + const std::string reason(reinterpret_cast(payload.data()), + static_cast(required)); + if (third != 1 || required_delivered != required) + failure = "the ask with room returned " + std::to_string(third) + " needing " + + std::to_string(required_delivered) + ", not the 1 needing " + + std::to_string(required) + " the refusal promised"; + else if (delivered.type != CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN || + delivered.connection_id != connection_id || + delivered.payload_length != required) + failure = "the delivered event was type " + std::to_string(delivered.type) + + " on connection " + std::to_string(delivered.connection_id) + " carrying " + + std::to_string(delivered.payload_length) + " byte(s), not the failed connection's own"; + else if (reason.rfind(kReasonPrefix, 0) != 0) + failure = "the payload delivered was '" + reason + "', not a reason this bridge writes"; + else if (payload[static_cast(required)] != kTail) + failure = "the copy wrote past the " + std::to_string(required) + " bytes it reported"; + } + + // Consumed now, and only now. + if (failure.empty()) { + cultmesh_quic_event emptied = poisoned; + int32_t required_emptied = 0; + const int32_t fourth = + cultmesh_quic_next_event(runtime, 0, &emptied, nullptr, 0, &required_emptied); + if (fourth != 0) + failure = "the event was still queued after being delivered: a further ask returned " + + std::to_string(fourth); + } + + cultmesh_quic_runtime_close(runtime); + return failure; +} + +int PayloadFit(int iterations) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = PayloadFitOnce(); + if (!failure.empty()) + return Fail("payloadfit iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("payloadfit %dx: ok\n", iterations); + return 0; +} + +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + +// How long a poll that does not block is given to prove it by returning, after +// the calls have been counted and before the close begins. A bridge whose +// blocking wait no longer blocks has emptied itself of host calls by the time +// the close starts, and `calls_at_close` then says 0. +constexpr int kSettleMs = 100; + +// How long the close is required to stay inside `cultmesh_quic_runtime_close` +// while the pollers are held. The held calls are what it is waiting for, and +// nothing releases them until this elapses, so a close that returns first gave +// up on a call that was still inside. This bounds what the scenario can see: a +// close that waits for longer than this and then gives up is not distinguished +// from one that waits properly, which is the honest limit of the check. +constexpr int kHeldWindowMs = 500; + +// How long the pollers are given to be counted inside the library before the +// close begins. Reaching `pollers` is the normal path; the deadline only stops +// a bridge that never counts them from hanging the scenario. +constexpr int kCountedDeadlineMs = 2000; + +// One iteration of the quiesce itself, with the guesswork taken out: the pollers +// are held inside the library by the bridge's own development seam until this +// scenario lets them go, and the bridge says how many calls it counted rather +// than the scenario assuming the schedule put them there. +// +// Three promises, and a mutation that breaks any one of them is seen here: +// - the calls are counted (`peak`), so a blocking crossing outside a call scope +// is not merely uncounted-but-lucky, it reads as zero; +// - they were still counted when the close began its wait (`calls_at_close`), +// so a poll that stopped blocking cannot leave the scenario testing an empty +// library; +// - the close did not return while they were held, so a wait that gives up +// after any interval shorter than the hold is not a wait. +std::string HoldCloseOnce(int pollers) { + cultmesh_quic_debug_hold_calls(1); + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) { + cultmesh_quic_debug_hold_calls(0); + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + } + + std::atomic returned{0}; + std::atomic undefined_return{0}; + std::vector threads; + threads.reserve(static_cast(pollers)); + for (int index = 0; index < pollers; ++index) { + threads.emplace_back([runtime, &returned, &undefined_return] { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + const int32_t result = cultmesh_quic_next_event( + runtime, kPollTimeoutMs, &event, payload.data(), kPayloadCapacity, &required); + if (result != 0 && result != 1 && result != 2) undefined_return.fetch_add(1); + returned.fetch_add(1); + }); + } + + const auto counted_deadline = + std::chrono::steady_clock::now() + std::chrono::milliseconds(kCountedDeadlineMs); + while (cultmesh_quic_debug_peak_calls() < pollers && + std::chrono::steady_clock::now() < counted_deadline) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + std::this_thread::sleep_for(std::chrono::milliseconds(kSettleMs)); + + std::atomic closed{false}; + std::thread closer([runtime, &closed] { + cultmesh_quic_runtime_close(runtime); + closed.store(true); + }); + const auto held_until = + std::chrono::steady_clock::now() + std::chrono::milliseconds(kHeldWindowMs); + while (!closed.load() && std::chrono::steady_clock::now() < held_until) + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + + const bool closed_while_held = closed.load(); + const int32_t peak = cultmesh_quic_debug_peak_calls(); + const int32_t at_close = cultmesh_quic_debug_calls_at_close(); + + cultmesh_quic_debug_hold_calls(0); + closer.join(); + for (auto& thread : threads) thread.join(); + + if (peak != pollers) + return "the library's peak count of host calls inside it was " + std::to_string(peak) + ", not " + + std::to_string(pollers) + ": either the blocking crossing is not inside a call scope, or it " + + "did not block long enough for the pollers to be inside it together"; + if (at_close != pollers) + return "the close began its wait with " + std::to_string(at_close) + + " host call(s) counted inside, not " + std::to_string(pollers) + + "; the pollers were not inside the library when the close started"; + if (closed_while_held) + return "the close returned while " + std::to_string(pollers) + + " host call(s) were still held inside the library"; + if (undefined_return.load() != 0) + return std::to_string(undefined_return.load()) + " poller(s) saw a return the header does not define"; + if (returned.load() != pollers) + return std::to_string(returned.load()) + " of " + std::to_string(pollers) + " pollers returned"; + return {}; +} + +// One iteration of the other half of section 4: a call made while a close is +// running is refused, and is not counted behind the close's wait. +// +// The prohibition is the host's — no call may begin after the close starts — and +// the bridge does not make it optional. What it does do is refuse the call that +// races the start, and that refusal is load-bearing rather than courteous: a +// call admitted after the closer has begun increments the in-flight count behind +// a wait that has already read it, and the wait can then be left waiting on a +// count that reaches zero only when the late caller happens to leave. +// +// The seam is what makes the window wide enough to aim at: a held poller keeps +// the close inside its wait for as long as this scenario wants it there. +std::string LateCallOnce() { + cultmesh_quic_debug_hold_calls(1); + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) { + cultmesh_quic_debug_hold_calls(0); + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + } + + std::thread poller([runtime] { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + cultmesh_quic_next_event( + runtime, kPollTimeoutMs, &event, payload.data(), kPayloadCapacity, &required); + }); + + const auto counted_deadline = + std::chrono::steady_clock::now() + std::chrono::milliseconds(kCountedDeadlineMs); + while (cultmesh_quic_debug_peak_calls() < 1 && + std::chrono::steady_clock::now() < counted_deadline) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + std::this_thread::sleep_for(std::chrono::milliseconds(kSettleMs)); + + std::thread closer([runtime] { cultmesh_quic_runtime_close(runtime); }); + // The close has begun its wait once it has read the count, and the held + // poller is what keeps it there. + const auto started_deadline = + std::chrono::steady_clock::now() + std::chrono::milliseconds(kCountedDeadlineMs); + while (cultmesh_quic_debug_calls_at_close() < 0 && + std::chrono::steady_clock::now() < started_deadline) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + const int32_t at_close = cultmesh_quic_debug_calls_at_close(); + + // Two calls, from a thread of their own so that a bridge which admits them + // cannot park this one: one that does not block, and then the blocking + // crossing. That order, because a bridge that admits the blocking one parks + // it inside the library until the hold is released, and a call made after + // that would be racing the teardown rather than the wait. + std::atomic late_poll{0}; + std::atomic late_error{0}; + std::thread late([runtime, &late_poll, &late_error] { + std::array message{}; + late_error.store(cultmesh_quic_last_error(runtime, message.data(), + static_cast(message.size()))); + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + late_poll.store(cultmesh_quic_next_event( + runtime, kPollTimeoutMs, &event, payload.data(), kPayloadCapacity, &required)); + }); + + std::this_thread::sleep_for(std::chrono::milliseconds(kSettleMs)); + cultmesh_quic_debug_hold_calls(0); + late.join(); + closer.join(); + poller.join(); + + if (at_close < 1) + return "the close did not begin its wait with the poller counted inside, so nothing held it " + "open for a call to race"; + if (late_poll.load() != -1) + return "cultmesh_quic_next_event returned " + std::to_string(late_poll.load()) + + " to a call made during the close, not the -1 that refuses it"; + if (late_error.load() != -1) + return "cultmesh_quic_last_error returned " + std::to_string(late_error.load()) + + " to a call made during the close, not the -1 that refuses it"; + return {}; +} + +// How long `holdtimeout`'s two polls ask for, and how long the hold stays armed +// under them. The gap between each poll and the hold is the whole measurement: +// a poll the hold parks leaves when the hold is released, so its elapsed time +// lands at the last number instead of its own. +// +// Two polls, a short one and a long one, because a guard that tests the timeout +// instead of the wake — park it unless it was long — is identity on any single +// value on one side of its threshold. The long one sits above 1500, the stated +// ceiling on how long the hold guard may treat a long wait as surely worth +// parking; the hold stays armed well past it so a guard that parks anyway is +// held for the rest of the arming instead of leaving on its own timeout, which +// is the overshoot this scenario's late tolerance is wide enough to see. +constexpr int32_t kHeldTimeoutPollMs = 150; +constexpr int32_t kHeldLongTimeoutPollMs = 1600; +constexpr int kHoldArmedMs = 3000; + +// The seam's own rule, and the only scenario that can see it: the hold parks a +// call the wait woke, and not one whose own timeout expired. +// +// Everything else that arms the hold parks a woken call, so the guard governs +// nothing either of them observes — the timeout scenario never arms the hold, +// and the hold scenarios never let a timeout expire, so nothing was ever in +// both states at once and the guard could be deleted with every scenario still +// green. This puts calls in both states: the hold is armed, and the runtime is +// idle, so each wait ends on its timeout and the call is on its way out. +// +// It matters because a scenario that parked such a call would then report the +// bridge keeping a host call inside the library when what kept it was the +// fixture — the quiesce numbers `holdclose` asserts would be the seam's, not +// the bridge's. +std::string HoldTimeoutOnce(std::array& overshoot) { + cultmesh_quic_debug_hold_calls(1); + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) { + cultmesh_quic_debug_hold_calls(0); + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + } + + // Each on a thread of its own, because a parked call does not come back until + // the release below and this thread is what releases it. + constexpr std::array timeouts{kHeldTimeoutPollMs, kHeldLongTimeoutPollMs}; + std::array polls{}; + std::array pollers; + for (size_t index = 0; index < timeouts.size(); ++index) + pollers[index] = std::thread([runtime, &polls, &timeouts, index] { + polls[index] = PollFor(runtime, timeouts[index]); + }); + + std::this_thread::sleep_for(std::chrono::milliseconds(kHoldArmedMs)); + cultmesh_quic_debug_hold_calls(0); + for (auto& poller : pollers) poller.join(); + cultmesh_quic_runtime_close(runtime); + + for (size_t index = 0; index < timeouts.size(); ++index) { + const TimedPoll& poll = polls[index]; + const int32_t timeout_ms = timeouts[index]; + overshoot[index].Record(poll, timeout_ms); + if (poll.result != 0) + return "a poll ended by its own timeout returned " + std::to_string(poll.result) + + ", not the 0 an idle runtime owes it"; + if (poll.elapsed_ms < timeout_ms - kEarlyToleranceMs) + return "a poll asking for " + std::to_string(timeout_ms) + " ms returned after " + + std::to_string(poll.elapsed_ms) + " ms, so the fixture never let its timeout run out"; + if (poll.elapsed_ms > timeout_ms + kGenerousLateToleranceMs) + return "a poll asking for " + std::to_string(timeout_ms) + " ms returned after " + + std::to_string(poll.elapsed_ms) + " ms: the hold parked a call its own timeout had " + "already ended, and it left when the hold did"; + } + return {}; +} + +int HoldTimeout(int iterations) { + std::array overshoot{}; + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = HoldTimeoutOnce(overshoot); + if (!failure.empty()) + return Fail("holdtimeout iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("holdtimeout %dx: ok (worst overshoot %lld ms at %d, %lld ms at %d)\n", iterations, + overshoot[0].worst_ms, kHeldTimeoutPollMs, overshoot[1].worst_ms, kHeldLongTimeoutPollMs); + return 0; +} + +int LateCall(int iterations) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = LateCallOnce(); + if (!failure.empty()) + return Fail("latecall iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("latecall %dx: ok\n", iterations); + return 0; +} + +int HoldClose(int iterations, int pollers) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = HoldCloseOnce(pollers); + if (!failure.empty()) + return Fail("holdclose iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("holdclose %dx%d: ok\n", iterations, pollers); + return 0; +} + +// The values `waitseam` asks for: the smallest, the seam's own sentinel-versus- +// zero boundary, one on either side of a 16 ms quantum and of a 40 ms one, the +// ordinary `pollbusy` timeout and its neighbours, `polltimeout`'s long probe, +// and INT32_MAX. Nothing in section 6 of the header states a maximum on +// `timeout_ms` narrower than what `int32_t` itself holds, so INT32_MAX is the +// ceiling this checks and nothing wider is claimed. +constexpr std::array kWaitSeamProbesMs{ + 0, 1, 15, 16, 39, 40, 999, 1000, 1001, 7300, INT32_MAX}; + +// How long a probe's own poller thread is given to reach the wait before this +// gives up on it and fails with the probe named, rather than hanging. +constexpr int kWaitSeamDeadlineMs = 2000; + +// One probe: ask a fresh, otherwise-idle runtime for `timeout_ms` and read +// `cultmesh_quic_debug_last_wait_ms` — the bridge's own account of what it +// handed its condition wait — instead of measuring how long the call took. +// Every clamp, floor, round, scale, offset and later-poll mapping Soul's seven +// passes found is the identity at some wall-clock probe; none of them is the +// identity here unless it is also the identity at every value below, because +// this reads the argument itself rather than inferring it from elapsed time. +// +// `timeout_ms <= 0` never reaches the wait at all — `cultmesh_quic_next_event` +// returns at once when the queue is empty — so there is nothing for the seam to +// record, and the honest check is the converse: it must still say nothing, +// which is exactly what a seam that recorded the raw argument on every call, +// instead of only the value it actually handed its wait, would get wrong. +std::string WaitSeamProbeOnce(int32_t timeout_ms) { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + cultmesh_quic_debug_reset_last_wait_ms(); + + std::string failure; + if (timeout_ms <= 0) { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + const int32_t result = cultmesh_quic_next_event( + runtime, timeout_ms, &event, payload.data(), kPayloadCapacity, &required); + const int32_t recorded = cultmesh_quic_debug_last_wait_ms(); + if (result != 0) + failure = "a poll asking for " + std::to_string(timeout_ms) + " ms returned " + + std::to_string(result) + ", not the 0 an idle runtime owes it"; + else if (recorded != -1) + failure = "a poll asking for " + std::to_string(timeout_ms) + " ms recorded " + + std::to_string(recorded) + " ms on the wait seam, though the bridge's own guard " + "never enters a wait for a timeout that is not greater than zero"; + cultmesh_quic_runtime_close(runtime); + return failure; + } + + // A real wait, on a thread of its own: a probe at INT32_MAX has to be + // released by the close, not waited out. + std::thread poller([runtime, timeout_ms] { + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + cultmesh_quic_next_event(runtime, timeout_ms, &event, payload.data(), kPayloadCapacity, &required); + }); + + const auto deadline = std::chrono::steady_clock::now() + std::chrono::milliseconds(kWaitSeamDeadlineMs); + int32_t recorded = cultmesh_quic_debug_last_wait_ms(); + while (recorded == -1 && std::chrono::steady_clock::now() < deadline) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + recorded = cultmesh_quic_debug_last_wait_ms(); + } + + cultmesh_quic_runtime_close(runtime); + poller.join(); + + if (recorded != timeout_ms) + failure = "a poll asking for " + std::to_string(timeout_ms) + " ms recorded " + + std::to_string(recorded) + " ms on the wait seam: the bridge handed its condition " + "wait something other than the host's own argument"; + return failure; +} + +// Past the twelfth poll on one runtime: no scenario before this one ever asked +// a runtime for a thirteenth, so a wait that only changes shape after twelve +// had nowhere to be seen. Forty short waits on a runtime that stays open for +// all of them, each checked by equality. +constexpr int32_t kWaitSeamRepeatedMs = 5; +constexpr int kWaitSeamRepeatedPolls = 40; + +std::string WaitSeamRepeatedOnce() { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + std::string failure; + for (int poll = 0; poll < kWaitSeamRepeatedPolls && failure.empty(); ++poll) { + cultmesh_quic_debug_reset_last_wait_ms(); + std::vector payload(static_cast(kPayloadCapacity)); + cultmesh_quic_event event{}; + int32_t required = 0; + cultmesh_quic_next_event( + runtime, kWaitSeamRepeatedMs, &event, payload.data(), kPayloadCapacity, &required); + const int32_t recorded = cultmesh_quic_debug_last_wait_ms(); + if (recorded != kWaitSeamRepeatedMs) + failure = "poll " + std::to_string(poll + 1) + " of " + + std::to_string(kWaitSeamRepeatedPolls) + " on one runtime recorded " + + std::to_string(recorded) + " ms, not " + std::to_string(kWaitSeamRepeatedMs); + } + cultmesh_quic_runtime_close(runtime); + return failure; +} + +int WaitSeam(int iterations) { + for (int iteration = 0; iteration < iterations; ++iteration) { + for (int32_t probe : kWaitSeamProbesMs) { + const std::string failure = WaitSeamProbeOnce(probe); + if (!failure.empty()) + return Fail("waitseam iteration " + std::to_string(iteration) + " probe " + + std::to_string(probe) + ": " + failure); + } + const std::string repeated = WaitSeamRepeatedOnce(); + if (!repeated.empty()) + return Fail("waitseam iteration " + std::to_string(iteration) + ": " + repeated); + } + std::printf("waitseam %dx: ok (%zu probes, %d repeated polls on one runtime)\n", + iterations, kWaitSeamProbesMs.size(), kWaitSeamRepeatedPolls); + return 0; +} + +#endif // CULTMESH_QUIC_DEBUG_ASSERTS + +// How long `pollhammer`'s idle poll asks for. One host thread hammers every +// gate-touching entry point that cannot itself queue an event, in a yield +// loop, while another holds this one poll idle; each hammered call's +// `CallScope` destructor notifies every waiter on the runtime's condition +// variable (cultmesh_quic_native.cpp:286), so the idle poll is woken many times +// over for every timeout it is given here. That is exactly the shape a wake +// count or an error-state predicate exploits, and exactly what a revert that +// returns on any wake at all fails immediately. +// +// `cultmesh_quic_connection_open`, `cultmesh_quic_listener_open` and +// `cultmesh_quic_stream_open` touch the same gate but can each queue a real +// event on this runtime, and a genuine event is allowed to end the idle poll +// early — hammering with those would make an early return ambiguous between +// the fault this scenario hunts and a real delivery, so they are left out. The +// refused `listener_open` below is a setup step run once, not part of the +// loop, and it leaves no listener behind. +constexpr int32_t kHammerPollMs = 1000; + +// A self-signed ECDSA P-256 PKCS12, generated once with OpenSSL and embedded so +// this scenario needs no crypto library of its own and no network fetch: +// openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \ +// -keyout key.pem -out cert.pem -days 3650 -nodes -subj "/CN=cultmesh-quic-native-tests" +// openssl pkcs12 -export -out test.p12 -inkey key.pem -in cert.pem -passout pass: +// Used only to give pollhammer's live-objects run a listener that can actually +// load a credential; nothing ever connects to it, so it never accepts and never +// queues an event this scenario would have to tell apart from a bug. +constexpr std::array kSelfSignedPkcs12{{ + 0x30, 0x82, 0x04, 0x3c, 0x02, 0x01, 0x03, 0x30, 0x82, 0x03, 0xf2, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x82, + 0x03, 0xe3, 0x04, 0x82, 0x03, 0xdf, 0x30, 0x82, 0x03, 0xdb, 0x30, 0x82, + 0x02, 0x8a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, + 0x06, 0xa0, 0x82, 0x02, 0x7b, 0x30, 0x82, 0x02, 0x77, 0x02, 0x01, 0x00, + 0x30, 0x82, 0x02, 0x70, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x07, 0x01, 0x30, 0x5f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x05, 0x0d, 0x30, 0x52, 0x30, 0x31, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0c, 0x30, 0x24, 0x04, 0x10, 0x48, + 0xdf, 0x04, 0x5a, 0x31, 0x34, 0x6d, 0xe0, 0x7c, 0xde, 0x3c, 0xa2, 0xde, + 0xf2, 0x8d, 0x20, 0x02, 0x02, 0x08, 0x00, 0x30, 0x0c, 0x06, 0x08, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x09, 0x05, 0x00, 0x30, 0x1d, 0x06, + 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a, 0x04, 0x10, + 0x44, 0x04, 0xd9, 0x9b, 0x99, 0x3a, 0xcb, 0x89, 0xc0, 0xcb, 0x53, 0xe3, + 0xe3, 0x5b, 0xb4, 0x48, 0x80, 0x82, 0x02, 0x00, 0x92, 0xcc, 0x04, 0xcf, + 0x7d, 0x58, 0xec, 0x68, 0x1a, 0x1b, 0xd5, 0x3b, 0x17, 0x57, 0x22, 0xd5, + 0x45, 0x00, 0xff, 0x05, 0x0f, 0x0d, 0x18, 0x8b, 0x72, 0x5b, 0xcc, 0xd9, + 0x87, 0xf4, 0x99, 0x44, 0x7c, 0xd6, 0xc3, 0x02, 0x2a, 0xaf, 0xd9, 0x10, + 0x14, 0xd3, 0x9f, 0x1a, 0x2c, 0x7b, 0x4f, 0xe6, 0x0b, 0x1d, 0x7f, 0xb9, + 0xf4, 0x01, 0x5c, 0x4b, 0xd5, 0xa1, 0x57, 0xb0, 0x3d, 0xe0, 0xbc, 0x70, + 0x72, 0xe0, 0xe9, 0xb8, 0x9a, 0xde, 0x68, 0xfe, 0x7c, 0xc7, 0xca, 0xcc, + 0x61, 0x32, 0x88, 0x72, 0xdd, 0x97, 0x28, 0x7b, 0x5b, 0x0d, 0x30, 0xf5, + 0xa2, 0xd1, 0xe8, 0x89, 0xd4, 0x1d, 0x88, 0x28, 0xd2, 0xc3, 0x02, 0x93, + 0xa1, 0x27, 0xfb, 0x4a, 0xe7, 0xdc, 0xac, 0xf3, 0x0d, 0xa9, 0xd3, 0x14, + 0x37, 0x71, 0xb7, 0xe5, 0xaf, 0xdb, 0xb6, 0xda, 0x42, 0xb7, 0x24, 0x7a, + 0x94, 0xad, 0x73, 0x79, 0xde, 0x21, 0xb9, 0x13, 0x63, 0x98, 0x33, 0x62, + 0x4a, 0x36, 0xb8, 0x6d, 0x14, 0x8b, 0x84, 0xf0, 0x8e, 0x55, 0xcc, 0x95, + 0x14, 0x54, 0xcc, 0x68, 0x4b, 0x09, 0x24, 0xb4, 0x79, 0x49, 0x05, 0xc7, + 0x0e, 0xfe, 0xed, 0x23, 0x8c, 0x87, 0xc6, 0xc3, 0x76, 0x25, 0xd9, 0xd6, + 0xae, 0x5a, 0xf4, 0x86, 0x74, 0xb8, 0x44, 0x22, 0xe8, 0xfc, 0xa5, 0xc2, + 0x25, 0xbd, 0x84, 0xfd, 0x92, 0x96, 0xe2, 0x66, 0xa9, 0xb0, 0x1f, 0xd3, + 0x8d, 0xf7, 0x1c, 0xce, 0xed, 0x09, 0x11, 0x61, 0xec, 0x2d, 0xa4, 0x9d, + 0xb9, 0xdb, 0xd4, 0x2e, 0xa4, 0xff, 0xe6, 0x09, 0x8e, 0x9a, 0x0b, 0xdf, + 0x30, 0xf4, 0xea, 0xe6, 0x09, 0x2d, 0x16, 0xec, 0x5d, 0xb6, 0x39, 0xda, + 0xd4, 0x43, 0x41, 0x95, 0xc8, 0x32, 0xd2, 0xac, 0x17, 0x58, 0x05, 0x7e, + 0x10, 0x24, 0xae, 0xd6, 0x58, 0x80, 0x0a, 0x29, 0xcb, 0x4b, 0x78, 0x62, + 0xbe, 0xf6, 0x6c, 0x7d, 0x44, 0x07, 0x7b, 0xfb, 0xd9, 0xb6, 0x74, 0x75, + 0x9f, 0xe6, 0xb4, 0xc3, 0x54, 0x53, 0x46, 0xdb, 0xf2, 0xa1, 0x47, 0xb8, + 0xf1, 0xff, 0x01, 0xba, 0xde, 0xf9, 0xca, 0xd6, 0xc0, 0x38, 0x40, 0xd0, + 0x86, 0x72, 0xc8, 0xcf, 0xdd, 0xd6, 0xf6, 0x36, 0xe0, 0xf3, 0x2e, 0x95, + 0x23, 0xdb, 0x99, 0x72, 0x1c, 0xa6, 0xa0, 0xf7, 0x17, 0x93, 0x1e, 0x20, + 0x6c, 0x75, 0x25, 0x0e, 0x1c, 0xab, 0xa4, 0xce, 0x35, 0xd4, 0xf4, 0xc6, + 0x63, 0x89, 0x0d, 0xa9, 0x91, 0x0b, 0x7e, 0xce, 0x7d, 0x4d, 0x5e, 0xbf, + 0xfd, 0xa9, 0xbd, 0xb6, 0x1e, 0x2b, 0x08, 0x5d, 0x7a, 0xdd, 0x61, 0xdf, + 0x24, 0xe0, 0xff, 0x4b, 0xeb, 0xa2, 0xeb, 0xb6, 0x2f, 0x2c, 0xbf, 0x9b, + 0x5f, 0x6a, 0x1a, 0x33, 0xae, 0x02, 0x6d, 0xbf, 0x8e, 0x6f, 0xeb, 0xda, + 0x17, 0x88, 0x79, 0xf8, 0xe0, 0x1c, 0x1d, 0x64, 0x7c, 0xc3, 0xc2, 0xc1, + 0xce, 0x12, 0x67, 0x74, 0xbc, 0xef, 0x9f, 0x2f, 0x35, 0xef, 0x40, 0x24, + 0xc1, 0x5f, 0x82, 0xc9, 0x00, 0x2c, 0xbf, 0x2b, 0xbf, 0x64, 0x39, 0x63, + 0x0c, 0xcd, 0x6f, 0xe5, 0x18, 0xfa, 0xeb, 0x02, 0x61, 0xc3, 0x22, 0xb0, + 0xfd, 0xfb, 0x9d, 0x32, 0xbb, 0x2f, 0xd8, 0x9d, 0x63, 0x8d, 0x9e, 0xb1, + 0x5a, 0x7d, 0xc3, 0xe5, 0xcc, 0xae, 0xe4, 0x71, 0x0d, 0x7b, 0xa9, 0x80, + 0xbd, 0xef, 0x86, 0x12, 0x13, 0x42, 0xf8, 0x14, 0xcb, 0xa9, 0xfd, 0x86, + 0xea, 0xd5, 0x81, 0x54, 0x87, 0xbc, 0x66, 0x24, 0xfd, 0x12, 0xf5, 0x6b, + 0xf4, 0x45, 0x7e, 0x41, 0x8e, 0x00, 0xf3, 0x63, 0xc7, 0x24, 0xc5, 0xa1, + 0xfd, 0x70, 0xbc, 0xfa, 0x26, 0xa0, 0x07, 0xc2, 0x97, 0xb1, 0xe0, 0x42, + 0x5a, 0x2b, 0x65, 0xec, 0xda, 0x45, 0x79, 0xe5, 0x18, 0xf2, 0xce, 0x8e, + 0xc3, 0xe3, 0x74, 0x6d, 0x30, 0x82, 0x01, 0x49, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x82, 0x01, 0x3a, 0x04, + 0x82, 0x01, 0x36, 0x30, 0x82, 0x01, 0x32, 0x30, 0x82, 0x01, 0x2e, 0x06, + 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x02, + 0xa0, 0x81, 0xf7, 0x30, 0x81, 0xf4, 0x30, 0x5f, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0d, 0x30, 0x52, 0x30, 0x31, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0c, 0x30, 0x24, + 0x04, 0x10, 0xd8, 0x91, 0xb9, 0x92, 0x3a, 0x1e, 0x6b, 0xa2, 0x57, 0x44, + 0x16, 0x3a, 0xea, 0x36, 0x8d, 0x60, 0x02, 0x02, 0x08, 0x00, 0x30, 0x0c, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x09, 0x05, 0x00, + 0x30, 0x1d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, + 0x2a, 0x04, 0x10, 0x35, 0x48, 0x03, 0x23, 0x6a, 0x3d, 0x5f, 0x96, 0xb7, + 0xfb, 0xb1, 0xcb, 0xdc, 0x0c, 0x1f, 0x79, 0x04, 0x81, 0x90, 0x4d, 0x36, + 0x5b, 0x1e, 0xc1, 0xc1, 0xa3, 0xfa, 0x85, 0xe6, 0x58, 0x89, 0x5d, 0xbe, + 0x17, 0xb4, 0x90, 0x96, 0x2d, 0x3d, 0x32, 0xe2, 0x73, 0x6c, 0x2c, 0xfd, + 0x7b, 0xe4, 0x9c, 0x82, 0x3c, 0xe4, 0x7a, 0x58, 0x45, 0xdd, 0xcd, 0x00, + 0xa2, 0x52, 0xf9, 0x98, 0xd4, 0x0f, 0x64, 0x0b, 0x58, 0x27, 0xfe, 0xfc, + 0xfd, 0x60, 0x3f, 0x7e, 0x6f, 0x73, 0x73, 0xda, 0x16, 0x34, 0x83, 0x38, + 0x89, 0x3d, 0xbe, 0xde, 0x0a, 0x47, 0x7b, 0xcd, 0xc1, 0x88, 0x72, 0x38, + 0x95, 0xb5, 0x54, 0xfa, 0x2a, 0x84, 0x2b, 0xcd, 0x98, 0xe3, 0x20, 0xd2, + 0xac, 0xd8, 0xf5, 0xa8, 0xd2, 0xef, 0x1f, 0x99, 0x88, 0x16, 0x6f, 0xf2, + 0x08, 0xe9, 0x28, 0xc8, 0x7a, 0x02, 0x57, 0x5c, 0x1c, 0x94, 0x0f, 0x57, + 0xfc, 0x0e, 0x85, 0x63, 0xc5, 0x44, 0x45, 0x4f, 0xc6, 0x35, 0x52, 0x3d, + 0xd4, 0xe2, 0x22, 0x6f, 0x72, 0xde, 0x55, 0xad, 0x20, 0x84, 0x91, 0x14, + 0x7e, 0x5f, 0x98, 0x2a, 0x5e, 0x2b, 0xf4, 0xc5, 0x10, 0x1b, 0x31, 0x25, + 0x30, 0x23, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, + 0x15, 0x31, 0x16, 0x04, 0x14, 0xbd, 0x8a, 0x08, 0x3c, 0x66, 0xf7, 0x9d, + 0xa0, 0x25, 0x8b, 0x33, 0xac, 0xc2, 0x5e, 0xdc, 0x76, 0xd4, 0x33, 0x1a, + 0xd6, 0x30, 0x41, 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20, 0x4e, 0x6f, + 0x75, 0x90, 0x57, 0xb4, 0x39, 0x1e, 0xc3, 0x97, 0x50, 0x5e, 0x4d, 0xf2, + 0xa8, 0xf9, 0x0e, 0xcd, 0x7f, 0x57, 0x31, 0xae, 0xf2, 0x87, 0x0a, 0x55, + 0xb0, 0xbc, 0xd6, 0x11, 0x83, 0xc3, 0x04, 0x08, 0x52, 0x79, 0xb1, 0x83, + 0xe6, 0xe4, 0x6e, 0x4d, 0x02, 0x02, 0x08, 0x00, +}}; + +std::string PollHammerOnce(bool with_recorded_error, bool with_live_objects) { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + if (with_recorded_error) { + // Not a certificate at all: PKCS12 parsing fails before any network + // I/O, so this is refused synchronously and leaves no listener behind, + // and `runtime->error` is non-empty for the rest of this runtime's life. + const uint8_t junk[] = {0x00, 0x01, 0x02, 0x03}; + uint64_t listener_id = 0; + uint16_t bound_port = 0; + const int32_t result = cultmesh_quic_listener_open( + runtime, nullptr, 0, junk, static_cast(sizeof(junk)), "", &listener_id, &bound_port); + if (result >= 0) { + cultmesh_quic_runtime_close(runtime); + return "cultmesh_quic_listener_open accepted a junk PKCS12 credential"; + } + } + + // Self's ruling of 2026-09-22, F3: the predicate covered by the hammer set + // above is only ever exercised on a runtime with nothing live in it. An + // unroutable address (RFC 5737 TEST-NET-1) gets a connection into + // `runtime->connections` at once — `cultmesh_quic_connection_open` inserts + // it before the handshake starts — and that handshake then never completes + // inside this scenario's poll window, so it queues no event of its own. A + // best-effort stream rides the same connection. The listener is real (a + // credential MsQuic actually loads) but nothing ever connects to it, so it + // never accepts and never queues an event either: every object here is + // live in the runtime's maps without ever waking the idle poll on its own. + uint64_t live_connection_id = 0; + uint64_t live_stream_id = 0; + uint64_t live_listener_id = 0; + if (with_live_objects) { + const int32_t connecting = + cultmesh_quic_connection_open(runtime, "192.0.2.1", 9, &live_connection_id); + if (connecting != 0) { + cultmesh_quic_runtime_close(runtime); + return "cultmesh_quic_connection_open (live-objects setup) returned " + + std::to_string(connecting); + } + // Best-effort: whether this succeeds is not the point of the + // scenario, and P1's predicate names `connections`, not `streams`. + cultmesh_quic_stream_open( + runtime, live_connection_id, CULTMESH_QUIC_STREAM_RELIABLE, &live_stream_id); + uint16_t bound_port = 0; + cultmesh_quic_listener_open(runtime, "127.0.0.1", 0, kSelfSignedPkcs12.data(), + static_cast(kSelfSignedPkcs12.size()), "", &live_listener_id, &bound_port); + } + + std::atomic hammering{true}; + std::thread hammer([runtime, &hammering] { + constexpr uint64_t kBogusId = 0xffffffffffffffffull; + const uint8_t frame[] = {0x00}; + std::array message{}; + while (hammering.load(std::memory_order_relaxed)) { + cultmesh_quic_last_error(runtime, message.data(), static_cast(message.size())); + cultmesh_quic_last_status(runtime); + cultmesh_quic_connection_shutdown(runtime, kBogusId, 0); + cultmesh_quic_stream_shutdown(runtime, kBogusId, 0); + cultmesh_quic_stream_send_frame(runtime, kBogusId, frame, 1, 0); + cultmesh_quic_connection_certificate_complete(runtime, kBogusId, 0); + cultmesh_quic_listener_close(runtime, kBogusId); + std::this_thread::yield(); + } + }); + + const TimedPoll poll = PollFor(runtime, kHammerPollMs); + hammering.store(false, std::memory_order_relaxed); + hammer.join(); + if (live_listener_id != 0) cultmesh_quic_listener_close(runtime, live_listener_id); + if (live_connection_id != 0) cultmesh_quic_connection_shutdown(runtime, live_connection_id, 0); + (void)live_stream_id; + cultmesh_quic_runtime_close(runtime); + + if (poll.result != 0) + return "the idle poll returned " + std::to_string(poll.result) + + ", not the 0 an idle runtime owes it"; + if (poll.elapsed_ms < kHammerPollMs - kEarlyToleranceMs) + return "the idle poll returned after " + std::to_string(poll.elapsed_ms) + + " ms while another thread hammered the gate, ending its wait early"; + if (poll.elapsed_ms > static_cast(kHammerPollMs) + kGenerousLateToleranceMs) + return "the idle poll returned after " + std::to_string(poll.elapsed_ms) + + " ms: well past its own timeout"; + return {}; +} + +int PollHammer(int iterations) { + for (int iteration = 0; iteration < iterations; ++iteration) { + std::string failure = PollHammerOnce(false, false); + if (!failure.empty()) + return Fail("pollhammer iteration " + std::to_string(iteration) + " (clean runtime): " + failure); + failure = PollHammerOnce(true, false); + if (!failure.empty()) + return Fail("pollhammer iteration " + std::to_string(iteration) + + " (after a refused call recorded an error): " + failure); + failure = PollHammerOnce(false, true); + if (!failure.empty()) + return Fail("pollhammer iteration " + std::to_string(iteration) + + " (with a live connection, stream and listener): " + failure); + } + std::printf("pollhammer %dx: ok\n", iterations); + return 0; +} + +// Self's ruling of 2026-09-22, F4: any `timeout_ms <= 0` has to return within a +// small, generously-margined bound, and a negative timeout has to be probed +// too — the bridge's own guard (`timeout_ms > 0`) already treats zero and +// negative alike, so 0, -1 and INT32_MIN all take the same fast path and none +// of them may collide with the seam's own "nothing recorded" sentinel. +constexpr std::array kZeroTimeoutProbesMs{0, -1, INT32_MIN}; + +// Generous next to `kEarlyToleranceMs`/`kGenerousLateToleranceMs` because a +// non-positive timeout never enters the condition wait at all, so this is +// bounding a runtime lock acquisition and an empty-queue check, not a +// scheduler wakeup — the margin only has to be well clear of a mistake that +// makes this path sleep or spin, not of ordinary jitter. +constexpr int kZeroTimeoutBoundMs = 50; + +std::string ZeroTimeoutOnce(int32_t timeout_ms) { + void* runtime = nullptr; + const int32_t opened = cultmesh_quic_runtime_open("cultmesh-quic-native-tests", &runtime); + if (opened != 0 || runtime == nullptr) + return "cultmesh_quic_runtime_open returned " + std::to_string(opened); + + const TimedPoll poll = PollFor(runtime, timeout_ms); + cultmesh_quic_runtime_close(runtime); + + if (poll.result != 0) + return "a poll asking for " + std::to_string(timeout_ms) + " ms returned " + + std::to_string(poll.result) + ", not the 0 an idle runtime owes it"; + if (poll.elapsed_ms > kZeroTimeoutBoundMs) + return "a poll asking for " + std::to_string(timeout_ms) + " ms returned after " + + std::to_string(poll.elapsed_ms) + " ms: a non-positive timeout must return within " + + std::to_string(kZeroTimeoutBoundMs) + " ms, not stall or spin"; + return {}; +} + +int ZeroTimeout(int iterations) { + for (int iteration = 0; iteration < iterations; ++iteration) { + for (int32_t probe : kZeroTimeoutProbesMs) { + const std::string failure = ZeroTimeoutOnce(probe); + if (!failure.empty()) + return Fail("zerotimeout iteration " + std::to_string(iteration) + " probe " + + std::to_string(probe) + ": " + failure); + } + } + std::printf("zerotimeout %dx: ok (%zu probes)\n", iterations, kZeroTimeoutProbesMs.size()); + return 0; +} + +int CloseRace(int iterations, int pollers) { + for (int iteration = 0; iteration < iterations; ++iteration) { + const std::string failure = CloseRaceOnce(pollers); + if (!failure.empty()) + return Fail("closerace iteration " + std::to_string(iteration) + ": " + failure); + } + std::printf("closerace %dx%d: ok\n", iterations, pollers); + return 0; +} + +} // namespace + +int main(int argc, char** argv) { + if (argc < 2) { + std::fprintf(stderr, + "usage: %s closerace|holdclose|holdtimeout|polltimeout|pollbusy|pollhammer|zerotimeout|" + "payloadfit|latecall|waitseam [iterations] [pollers]\n", + argv[0]); + return 2; + } + const std::string scenario = argv[1]; + const int iterations = argc > 2 ? std::atoi(argv[2]) : 20; + const int pollers = argc > 3 ? std::atoi(argv[3]) : 256; + if (iterations <= 0 || pollers <= 0) { + std::fprintf(stderr, "%s needs a positive iteration and poller count\n", scenario.c_str()); + return 2; + } + if (scenario == "closerace") return CloseRace(iterations, pollers); + if (scenario == "polltimeout") return PollTimeout(iterations); + if (scenario == "pollbusy") return PollBusy(iterations); + if (scenario == "pollhammer") return PollHammer(iterations); + if (scenario == "zerotimeout") return ZeroTimeout(iterations); + if (scenario == "payloadfit") return PayloadFit(iterations); + if (scenario == "holdclose" || scenario == "latecall" || scenario == "holdtimeout" || + scenario == "waitseam") { +#if defined(CULTMESH_QUIC_DEBUG_ASSERTS) + if (scenario == "latecall") return LateCall(iterations); + if (scenario == "holdtimeout") return HoldTimeout(iterations); + if (scenario == "waitseam") return WaitSeam(iterations); + return HoldClose(iterations, pollers); +#else + std::fprintf(stderr, + "%s needs the development seam: configure with " + "-DCULTMESH_QUIC_DEBUG_ASSERTS=ON\n", scenario.c_str()); + return 2; +#endif + } + std::fprintf(stderr, "unknown scenario '%s'\n", scenario.c_str()); + return 2; +} diff --git a/package-lock.json b/package-lock.json index f027ecd5..403865c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -489,6 +489,326 @@ "dev": true, "license": "MIT" }, + "node_modules/@koromix/koffi-android-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-android-arm64/-/koffi-android-arm64-3.3.0.tgz", + "integrity": "sha512-lHXE2mq+uG6CVeX1iepn2ATcAWMZPagr+J0ICYge7wTMDYc5pPRQMq0Rr/16775i6QlUqQqpk8c5Gu66+u3gGA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-android-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-android-x64/-/koffi-android-x64-3.3.0.tgz", + "integrity": "sha512-7EeVK/KS9XNbOsUfy0B3uuSjPQZenjJ35y9QSi6R6eK4Fv0oGvREQaBzIJRJwonxp7sJfGObnwnQTnKTVK2DWA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-darwin-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-darwin-arm64/-/koffi-darwin-arm64-3.3.0.tgz", + "integrity": "sha512-2R9bihYmYFyRP98wRG2m5WQVKMONf7DoPJI8RkGCOUB2afOXJEVXFepiSKxBZGPml8i1USwAxMUwkzbJ5uMG1A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-darwin-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-darwin-x64/-/koffi-darwin-x64-3.3.0.tgz", + "integrity": "sha512-OecYCQfzhUx+XyAtatIHlk0jIz87wKNjtYvwlwgMwgaGQwO/TxFeReNo+s3167Rh1a9c8rUIOjq1jfzAPBxbKA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-freebsd-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-freebsd-arm64/-/koffi-freebsd-arm64-3.3.0.tgz", + "integrity": "sha512-6ytHzV1DuyxTP5LtFmQ3imBk71j/F/Nb0Hcwhjcn35esnknm5rQbgRl6tNRldrkGnM4GIAJpsagooUBh1xAzYg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-freebsd-ia32": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-freebsd-ia32/-/koffi-freebsd-ia32-3.3.0.tgz", + "integrity": "sha512-hINo5z1Iz2u3Rx3oHfzcmi5A03gYAoYf4nCJJYaY0bb5IuGdIC7noQTyyI9YxfyTJgoqw3wKFWWYtvsAmEo9Hw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-freebsd-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-freebsd-x64/-/koffi-freebsd-x64-3.3.0.tgz", + "integrity": "sha512-7XQYAZh828nW6+y3IdyUNdo2VbVHL5ZC8Qb+yqHrlDjTjVXSyGYZJHAyJZ5c7eSTTKBhtIMTX238rIsdexxrog==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-linux-arm": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-arm/-/koffi-linux-arm-3.3.0.tgz", + "integrity": "sha512-NbahRKKKFkHoFN/ZpLY+w4F6eYSqV4KMN40PmjZ1xQjG/XjYb6PIYgE41c7/acAPxOYqujrcaI3B4BAgWYm5/A==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-linux-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-arm64/-/koffi-linux-arm64-3.3.0.tgz", + "integrity": "sha512-Eo/+wGeawGICzJkUlkzi/KerAJ6U1L/Hf7cnJKH7aGgCOY5RRnjUqXs/eL+UDpRcFHzGeUn+Fq+8q2VxYxvAfw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-linux-ia32": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-ia32/-/koffi-linux-ia32-3.3.0.tgz", + "integrity": "sha512-u9tKuj42RFWJU8ZgZqcBhkFCkIZE/SE6oR1ljpukttJUhOVuaf/lmsWxyOxiVu3U8T1gtD658FlLgrbMVIn6aQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-linux-loong64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-loong64/-/koffi-linux-loong64-3.3.0.tgz", + "integrity": "sha512-2hKlNZ6OXkTUp6fcueZcP0sQ6yhpdfANg9/mWxDKzT1o8qIj4qJD7UcZLCcRIC8JXiP8JQwZBtlPuyXIqofDQg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-linux-ppc64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-ppc64/-/koffi-linux-ppc64-3.3.0.tgz", + "integrity": "sha512-bIVAoHgzyRN7xs529BK7rF3BbZUTJgIr0t/wvBvAgaIpreKsdZ/QWxhedKRbTN7ljlDHkPZFmu5XcCjb/vqUag==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-linux-riscv64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-riscv64/-/koffi-linux-riscv64-3.3.0.tgz", + "integrity": "sha512-2niYAe+TBXbvf7yog/aiHiDUrKQn+RkMSH5x3ZYo65OQyII1CY3Jk2kP3Pe735gq0LzIYJsDuGMW+02ighSadQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-linux-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-x64/-/koffi-linux-x64-3.3.0.tgz", + "integrity": "sha512-apU8ZMOrOh1eqMP/Pp0sDZ/WY6A4r6JWph26h63VM9nZ+5KCTYuPgojfoLPNvrfI/bn1PY3+bpXKRhZHI3gxbQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-openbsd-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-openbsd-arm64/-/koffi-openbsd-arm64-3.3.0.tgz", + "integrity": "sha512-iTyHMCSSs+X579sWJv7XVFMp9gOfROI8IUEwp09YxJpGvmiSoipI0J7kytFuFq6dyuwO0Ymy4JdlmKnCM0qkxg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-openbsd-ia32": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-openbsd-ia32/-/koffi-openbsd-ia32-3.3.0.tgz", + "integrity": "sha512-xCvMV+4VNHjTxgVPEsBzU0k8dlA7aoFO5QjRF9lVU/NzGhUedlYvFgaF6IWsGOoWEaNt9hgP4KK/wxMbm9v8EQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-openbsd-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-openbsd-x64/-/koffi-openbsd-x64-3.3.0.tgz", + "integrity": "sha512-xItIwx1elM8k1pTudEfuV/1U2gQ06+rFfxCVXrZkyWYYGTzmA5To00f8garJFR+E9gbjQJbn8QDFvWMI+i2sMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-win32-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-win32-arm64/-/koffi-win32-arm64-3.3.0.tgz", + "integrity": "sha512-fD41LgKBx5i1YlJDuds4tRHAaG5vV55tvagzJwKFDR/5BDeaFvH9QFMUMDoNl2LkmVyeug0dIElHr/oxejh3IA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-win32-ia32": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-win32-ia32/-/koffi-win32-ia32-3.3.0.tgz", + "integrity": "sha512-BfDbDVEuQwPZOvWXawc3JT/7i9cN7QHYotgo014jjXb9pNv46Ykhb0RRglkcHg+SdytW/7pxYn18YwcQP6LLvQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/@koromix/koffi-win32-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@koromix/koffi-win32-x64/-/koffi-win32-x64-3.3.0.tgz", + "integrity": "sha512-D+ORp73rTmvGVfq01+4uBmgVZqrPqU9N9xCZCfexaCDlVk0WQsaqid1dGsi6eScJuHt4Cp8s1i5/4CsecxFTKQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, "node_modules/@msgpack/msgpack": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.3.tgz", @@ -715,6 +1035,38 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/koffi": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/koffi/-/koffi-3.3.0.tgz", + "integrity": "sha512-UeyQtptuPeCP0BqKD+Q8ftTQhIUBHO7bXyK9DVIaW9hJSg0BrICm4K5N8Qtn7zKk20sb5vpnES9KBqVksM2kpQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "url": "https://liberapay.com/Koromix" + }, + "optionalDependencies": { + "@koromix/koffi-android-arm64": "3.3.0", + "@koromix/koffi-android-x64": "3.3.0", + "@koromix/koffi-darwin-arm64": "3.3.0", + "@koromix/koffi-darwin-x64": "3.3.0", + "@koromix/koffi-freebsd-arm64": "3.3.0", + "@koromix/koffi-freebsd-ia32": "3.3.0", + "@koromix/koffi-freebsd-x64": "3.3.0", + "@koromix/koffi-linux-arm": "3.3.0", + "@koromix/koffi-linux-arm64": "3.3.0", + "@koromix/koffi-linux-ia32": "3.3.0", + "@koromix/koffi-linux-loong64": "3.3.0", + "@koromix/koffi-linux-ppc64": "3.3.0", + "@koromix/koffi-linux-riscv64": "3.3.0", + "@koromix/koffi-linux-x64": "3.3.0", + "@koromix/koffi-openbsd-arm64": "3.3.0", + "@koromix/koffi-openbsd-ia32": "3.3.0", + "@koromix/koffi-openbsd-x64": "3.3.0", + "@koromix/koffi-win32-arm64": "3.3.0", + "@koromix/koffi-win32-ia32": "3.3.0", + "@koromix/koffi-win32-x64": "3.3.0" + } + }, "node_modules/lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", @@ -850,7 +1202,7 @@ "version": "0.3.0", "license": "MIT", "dependencies": { - "@msgpack/msgpack": "^3.1.3", + "@gamecult/cultcache-ts": "^0.14.0", "cultnet-ts": "^0.2.0" }, "devDependencies": { @@ -866,8 +1218,8 @@ "license": "MIT", "dependencies": { "@gamecult/cultcache-ts": "^0.14.0", - "@msgpack/msgpack": "^3.1.2", - "cultnet-ts": "^0.2.0" + "cultnet-ts": "^0.2.0", + "koffi": "3.3.0" }, "devDependencies": { "@types/node": "^24.0.0", diff --git a/packages/cultcache-py/README.md b/packages/cultcache-py/README.md index 23effdbd..41c3095c 100644 --- a/packages/cultcache-py/README.md +++ b/packages/cultcache-py/README.md @@ -67,6 +67,7 @@ store. - `define_document_type(...)` - `define_database_entry_type(...)` - `database_entry_field(...)` +- `leaves` (typed slot leaves) - `define_document_registry(...)` - `CultCache.builder()` - `register_document_type(...)` @@ -148,6 +149,55 @@ That matches the Rust `#[derive(DatabaseEntry)]` formatter shape and the C# `[Key(n)]` intent: schema evolution comes from stable field slots, not source member order. +## Typed Leaves + +A slot with no codec is untyped: it is an `object` in C#, cataloged `System.Object`, and takes any MessagePack value. +Give a slot a leaf from `cultcache_py.leaves` and it writes and reads exactly what the C# type does, refuses the rest +on write and on read, and carries the C# type name in the schema catalog, which the C# reference checks against its +own class. + +```python +from cultcache_py import database_entry_field, define_database_entry_type, leaves as t + +settings_doc = define_database_entry_type( + "settings", + [ + database_entry_field("theme", 0, codec=t.string), + database_entry_field("retries", 1, codec=t.int32, default=0), + database_entry_field("tags", 2, codec=t.list(t.string), default=list), + ], +) +``` + +| Leaf | C# type | Python value | +| --- | --- | --- | +| `t.string` | `string` | `str` | +| `t.boolean` | `bool` | `bool` | +| `t.bytes` | `byte[]` | `bytes`, `bytearray`, `memoryview`; a MessagePack str reads as its UTF-8 bytes | +| `t.int32`, `t.int64` | `int`, `long` | `int` within range (not `bool`, not `float`) | +| `t.float32`, `t.float64` | `float`, `double` | `int` or `float`; a float32 is written as MessagePack float 32 | +| `t.list(x)` | `List` | `list` or `tuple`, each element through `x` | +| `t.array(x)` | `T[]` | the same wire as `t.list(x)` | +| `t.any` | `object` | any plain MessagePack value or a timestamp; the default of an untyped slot | +| `t.nullable(x)` | `T?` | `None`, or whatever `x` takes | +| `t.lazy(get)` | | a leaf resolved on first use, for a union that refers to itself | + +Nil is refused unless the slot is wrapped in `t.nullable`. Wrap a C# `string`, `byte[]`, `List`, array, class or +interface slot that may hold null (`t.nullable(t.string)`), and a value type that may hold null (`int?` is +`t.nullable(t.int32)`, cataloged `System.Nullable`); a reference type keeps its own name. A `default` +fills a slot the payload is too short to have, never a nil that is present. + +A record or union is named for C# with `type_name=`, the class's `FullName` (a nested class joins with `+`): + +```python +inner = define_record_codec("Inner", [database_entry_field("n", 0, codec=t.string)], type_name="My.App.Doc+Inner") +shape = define_union("Shape", {0: ("Circle", circle)}, type_name="My.App.Doc+IShape") +``` + +Without `type_name=` the slot is cataloged `System.Object`. A refusal reads ` slot (): expected +, found `, prefixed `element : ` inside a list and `Union '' arm : ` inside a union, and never +carries the value. + ## Wire Parity See [docs/python-runtime-parity.md](../../docs/python-runtime-parity.md) for diff --git a/packages/cultcache-py/src/cultcache_py/__init__.py b/packages/cultcache-py/src/cultcache_py/__init__.py index 07721ef4..dbfac403 100644 --- a/packages/cultcache-py/src/cultcache_py/__init__.py +++ b/packages/cultcache-py/src/cultcache_py/__init__.py @@ -1,29 +1,45 @@ from .backing_store import BackingStore, CultCacheEnvelope from .backing_store import CultCacheSchemaCatalogEntry, CultCacheSchemaCatalogMember +from . import leaves from .cache import CultCache, CultCacheBuilder from .documents import ( + MAX_PAYLOAD_DEPTH, + MAX_SLOT_KEY, + CultCachePayloadDepthError, DatabaseEntryField, DocumentDefinition, + UnionArm, database_entry_field, define_database_entry_type, define_document_registry, define_document_type, + define_record_codec, + define_union, ) +from .leaves import SlotCodec from .stores import JsonLinesBackingStore, SingleFileMessagePackBackingStore __all__ = [ "BackingStore", "CultCache", "CultCacheBuilder", + "CultCachePayloadDepthError", "CultCacheEnvelope", "CultCacheSchemaCatalogEntry", "CultCacheSchemaCatalogMember", "DatabaseEntryField", "DocumentDefinition", "JsonLinesBackingStore", + "MAX_PAYLOAD_DEPTH", + "MAX_SLOT_KEY", "SingleFileMessagePackBackingStore", + "SlotCodec", + "UnionArm", + "leaves", "database_entry_field", "define_database_entry_type", "define_document_registry", "define_document_type", + "define_record_codec", + "define_union", ] diff --git a/packages/cultcache-py/src/cultcache_py/documents.py b/packages/cultcache-py/src/cultcache_py/documents.py index e8511249..91d09ab8 100644 --- a/packages/cultcache-py/src/cultcache_py/documents.py +++ b/packages/cultcache-py/src/cultcache_py/documents.py @@ -2,9 +2,13 @@ import json from dataclasses import MISSING, dataclass, field +from collections.abc import Mapping, Sequence, Set +from itertools import chain from typing import Any, Callable, Generic, Iterable, TypeVar from .backing_store import CultCacheSchemaCatalogEntry, CultCacheSchemaCatalogMember +from .leaves import Float32, SlotCodec +from .leaves import any as _any_leaf T = TypeVar("T") @@ -13,6 +17,51 @@ Decoder = Callable[[Any], T] Validator = Callable[[T], None] Extractor = Callable[[T], str | int | float | bool | None] +MAX_PAYLOAD_DEPTH = 256 +"""The payload nesting limit, equal to the C# reference's `MaximumPayloadDepth`: every array and map counts, read +or skipped, the outermost one is depth 1; depth 256 is accepted and 257 refused, on read and on write.""" + +MAX_SLOT_KEY = 65535 +"""The largest slot key a record may define: the largest MessagePack array16 length.""" + +try: + from msgpack.exceptions import StackError as _MsgpackStackError + + _STACK_FAULTS: tuple[type[BaseException], ...] = (_MsgpackStackError,) +except ModuleNotFoundError: + _STACK_FAULTS = () + + +_CONTAINERS = (Mapping, Sequence, Set) +_SCALAR_SEQUENCES = (str, bytes, bytearray, memoryview) + + +class CultCachePayloadDepthError(ValueError): + """A payload nests deeper than `MAX_PAYLOAD_DEPTH`. Names the type, the depth reached and the limit; never the payload.""" + + def __init__(self, type_name: str, direction: str) -> None: + self.depth = MAX_PAYLOAD_DEPTH + 1 + self.limit = MAX_PAYLOAD_DEPTH + super().__init__( + f"{type_name} payload nests {self.depth} containers deep; the limit is {self.limit} (refused on {direction})." + ) + + +def _refuse_past_depth_limit(tree: Any, type_name: str, direction: str) -> None: + """The one nesting count. Walks a payload tree iteratively (every mapping, sequence and set that is not text or + bytes is a container), refusing the first container past `MAX_PAYLOAD_DEPTH`.""" + stack = [(tree, 1)] if _is_container(tree) else [] + while stack: + node, depth = stack.pop() + if depth > MAX_PAYLOAD_DEPTH: + raise CultCachePayloadDepthError(type_name, direction) + children = chain(node.keys(), node.values()) if isinstance(node, Mapping) else node + stack.extend((child, depth + 1) for child in children if _is_container(child)) + + +def _is_container(node: Any) -> bool: + return isinstance(node, _CONTAINERS) and not isinstance(node, _SCALAR_SEQUENCES) + def _default_encode(value: Any) -> Any: if hasattr(value, "model_dump"): @@ -36,7 +85,7 @@ def _json_payload_decoder(payload: bytes) -> Any: return json.loads(payload.decode("utf-8")) -def _messagepack_payload_encoder(value: Any) -> bytes: +def _msgpack() -> Any: try: import msgpack # type: ignore except ModuleNotFoundError as exc: @@ -44,7 +93,35 @@ def _messagepack_payload_encoder(value: Any) -> bytes: "MessagePack payload encoding requires the optional 'msgpack' dependency. " "Install with: python -m pip install cultcache-py[msgpack]" ) from exc - return msgpack.packb(value, use_bin_type=True) + return msgpack + + +def _pack_tree(tree: Any) -> bytes: + """The bytes of the tree the leaves produced. `packb` writes everything but a `Float32`, which it refuses with a + TypeError; only then does an iterative walk pack each array and map header and each value, a `Float32` through a + single-float packer.""" + msgpack = _msgpack() + try: + return msgpack.packb(tree, use_bin_type=True) # type: ignore[no-any-return] + except TypeError: + pass + plain = msgpack.Packer(use_bin_type=True) + single = msgpack.Packer(use_bin_type=True, use_single_float=True) + out: list[bytes] = [] + stack = [tree] + while stack: + node = stack.pop() + if isinstance(node, Float32): + out.append(single.pack(node.value)) + elif isinstance(node, (list, tuple)): + out.append(plain.pack_array_header(len(node))) + stack.extend(reversed(node)) + elif isinstance(node, dict): + out.append(plain.pack_map_header(len(node))) + stack.extend(reversed([part for pair in node.items() for part in pair])) + else: + out.append(plain.pack(node)) + return b"".join(out) def _messagepack_payload_decoder(payload: bytes) -> Any: @@ -63,12 +140,33 @@ class DatabaseEntryField: name: str key: int default: Any = MISSING + codec: SlotCodec = _any_leaf + + def __post_init__(self) -> None: + if not _is_key(self.key) or not 0 <= self.key <= MAX_SLOT_KEY: + raise ValueError(f"DatabaseEntry field keys must be integers within 0..{MAX_SLOT_KEY}") + if not isinstance(self.codec, SlotCodec): + raise ValueError("DatabaseEntry field codec must be a SlotCodec: a leaf from cultcache_py.leaves, or leaves.lazy") -def database_entry_field(name: str, key: int, *, default: Any = MISSING) -> DatabaseEntryField: - if key < 0: - raise ValueError("DatabaseEntry field keys must be non-negative integers") - return DatabaseEntryField(name=name, key=key, default=default) +def database_entry_field( + name: str, + key: int, + *, + default: Any = MISSING, + codec: SlotCodec = _any_leaf, +) -> DatabaseEntryField: + """A slot. `codec` is the slot's leaf (cultcache_py.leaves, a record or a union); with none the slot is untyped, + an `object` in C#. A `default` fills a slot the payload is too short to have, never a nil.""" + return DatabaseEntryField(name=name, key=key, default=default, codec=codec) + + +@dataclass(frozen=True) +class UnionArm: + """A decoded union value: the arm's declared name and its decoded record (None for a unit arm).""" + + name: str + value: Any = None @dataclass(frozen=True) @@ -88,16 +186,27 @@ class DocumentDefinition(Generic[T]): content_hash: str | None = None canonical_schema_json: str | None = None compatible_schema_ids: tuple[str, ...] = field(default_factory=tuple) - members: tuple[CultCacheSchemaCatalogMember, ...] = field(default_factory=tuple) + members: tuple[CultCacheSchemaCatalogMember, ...] | Callable[[], tuple[CultCacheSchemaCatalogMember, ...]] = field( + default_factory=tuple + ) + """The catalog rows, or a function returning them: a document made of leaves derives them when the catalog is first + built, so a `lazy` leaf can name a definition made later.""" _catalog_entry: CultCacheSchemaCatalogEntry | None = field(default=None, init=False, repr=False, compare=False) def encode_payload(self, value: T) -> bytes: if self.validate: self.validate(value) - return self.payload_encoder(self.encode(value)) + tree = self.encode(value) + _refuse_past_depth_limit(tree, self.type, "write") + return self.payload_encoder(tree) def decode_payload(self, payload: bytes) -> T: - value = self.decode(self.payload_decoder(payload)) + try: + tree = self.payload_decoder(payload) + except _STACK_FAULTS: + raise CultCachePayloadDepthError(self.type, "read") from None + _refuse_past_depth_limit(tree, self.type, "read") + value = self.decode(tree) if self.validate: self.validate(value) return value @@ -105,6 +214,7 @@ class DocumentDefinition(Generic[T]): def catalog_entry(self) -> CultCacheSchemaCatalogEntry: if self._catalog_entry is not None: return self._catalog_entry + members = tuple(self.members() if callable(self.members) else self.members) schema_id = self.schema_id or self.type schema_name = self.schema_name or self.type schema_version = self.schema_version or f"{schema_name}.v1" @@ -123,7 +233,7 @@ class DocumentDefinition(Generic[T]): "indexAlias": member.index_alias, "isName": member.is_name, } - for member in self.members + for member in members ], }, ensure_ascii=False, @@ -137,7 +247,7 @@ class DocumentDefinition(Generic[T]): content_hash=self.content_hash or schema_id, canonical_schema_json=canonical_schema_json, compatible_schema_ids=tuple(compatible_schema_ids), - members=tuple(self.members), + members=members, ) object.__setattr__(self, "_catalog_entry", catalog_entry) return catalog_entry @@ -160,7 +270,7 @@ def define_document_type( content_hash: str | None = None, canonical_schema_json: str | None = None, compatible_schema_ids: Iterable[str] | None = None, - members: Iterable[CultCacheSchemaCatalogMember] | None = None, + members: Iterable[CultCacheSchemaCatalogMember] | Callable[[], tuple[CultCacheSchemaCatalogMember, ...]] | None = None, ) -> DocumentDefinition[T]: return DocumentDefinition( type=type, @@ -178,7 +288,7 @@ def define_document_type( content_hash=content_hash, canonical_schema_json=canonical_schema_json, compatible_schema_ids=tuple(compatible_schema_ids or ()), - members=tuple(members or ()), + members=members if callable(members) else tuple(members or ()), ) @@ -205,65 +315,36 @@ def define_database_entry_type( and newly added fields can use higher keys without rewriting older payloads. """ - normalized = [_normalize_database_entry_field(field) for field in fields] - if not normalized: - raise ValueError("DatabaseEntry document types require at least one field") - keys = [field.key for field in normalized] - if len(keys) != len(set(keys)): - raise ValueError(f"DatabaseEntry document type {type!r} has duplicate field keys") - normalized.sort(key=lambda field: field.key) - max_key = max(keys) + normalized = _normalize_fields(type, fields) member_name_lookup = name if isinstance(name, str) else None index_lookup = indexes or {} - members = tuple( - CultCacheSchemaCatalogMember( - slot=field.key, - member_name=_pascal_case(field.name), - type_name="System.Object", - is_name=field.name == member_name_lookup, - index_alias=next( - (alias for alias, extractor in index_lookup.items() if extractor == field.name), - None, - ), + + def members() -> tuple[CultCacheSchemaCatalogMember, ...]: + return tuple( + CultCacheSchemaCatalogMember( + slot=field.key, + member_name=_pascal_case(field.name), + type_name=field.codec.type_name or _any_leaf.type_name, + is_name=field.name == member_name_lookup, + index_alias=next( + (alias for alias, extractor in index_lookup.items() if extractor == field.name), + None, + ), + ) + for field in normalized ) - for field in normalized - ) - def encode(value: Any) -> list[Any]: - slots = [None] * (max_key + 1) - for field in normalized: - slots[field.key] = extract_value(value, field.name) - return slots - - def decode(raw: Any) -> Any: - if not isinstance(raw, list): - raise ValueError(f"DatabaseEntry document type {type!r} expected a MessagePack array") - values: dict[str, Any] = {} - for field in normalized: - if field.key < len(raw): - value = raw[field.key] - elif field.default is not MISSING: - value = field.default() if callable(field.default) else field.default - else: - raise ValueError( - f"DatabaseEntry document type {type!r} is missing required slot {field.key}" - ) - if value is None and field.default is not MISSING: - value = field.default() if callable(field.default) else field.default - values[field.name] = value - if cls is None: - return values - return cls(**values) + record = _record_codec(type, normalized, cls) return define_document_type( type, - encode=encode, - decode=decode, + encode=record.encode, + decode=record.decode, validate=validate, global_document=global_document, name=name, indexes=indexes, - payload_encoder=_messagepack_payload_encoder, + payload_encoder=_pack_tree, payload_decoder=_messagepack_payload_decoder, schema_id=schema_id, schema_name=schema_name, @@ -275,6 +356,81 @@ def define_database_entry_type( ) +def define_record_codec( + name: str, + fields: Iterable[DatabaseEntryField | tuple[str, int] | tuple[str, int, Any]], + *, + cls: type[Any] | None = None, + type_name: str | None = None, +) -> SlotCodec: + """A nested record: the same slot array as a document payload, usable as a field's codec or a union arm. + `type_name` is the C# FullName of the class it mirrors, for the catalog; without it the catalog names the slot as an untyped one.""" + return _record_codec(name, _normalize_fields(name, fields), cls, type_name) + + +def define_union( + name: str, + arms: Mapping[int, tuple[str, SlotCodec | None]], + *, + type_name: str | None = None, +) -> SlotCodec: + """A union: `[armKey, [armSlots...]]`. Each arm is `(arm name, record codec)`; a unit arm has no codec and is + written `[armKey, []]`. A key the union does not declare is refused, never carried, and so is nil: wrap the union + in `leaves.nullable` for a slot that may be null. `type_name` is the C# FullName of the interface, for the catalog.""" + by_key = dict(arms) + by_name = {arm_name: (key, codec) for key, (arm_name, codec) in by_key.items()} + if not by_key: + raise ValueError(f"Union {name!r} requires at least one arm") + if len(by_name) != len(by_key): + raise ValueError(f"Union {name!r} has duplicate arm names") + if any(not _is_key(key) or not _INT32_MIN <= key <= _INT32_MAX for key in by_key): + raise ValueError(f"Union {name!r} arm keys must be integers within Int32") + if any(codec is not None and not isinstance(codec, SlotCodec) for _, codec in by_key.values()): + raise ValueError(f"Union {name!r} arm codecs must be SlotCodecs or None") + + def encode(value: Any) -> Any: + if value is None: + raise ValueError(f"Union {name!r}: expected an arm, found nil") + if not isinstance(value, UnionArm) or value.name not in by_name: + raise ValueError(f"Union {name!r} was given a value that is not one of its arms") + key, codec = by_name[value.name] + if codec is None: + if value.value is not None: + raise ValueError(f"Union {name!r} arm {key} is a unit arm and carries no value") + return [key, []] + try: + return [key, codec.encode(value.value)] + except ValueError as error: + raise ValueError(f"Union {name!r} arm {key}: {error}") from None + + def decode(raw: Any) -> Any: + if raw is None: + raise ValueError(f"Union {name!r}: expected an arm, found nil") + if not isinstance(raw, list) or len(raw) != 2: + raise ValueError(f"Union {name!r} value is malformed: expected [armKey, [armSlots]]") + key = raw[0] + if not _is_key(key): + raise ValueError(f"Union {name!r} value is malformed: the arm key is non-integer") + if not _INT32_MIN <= key <= _INT32_MAX: + raise ValueError(f"Union {name!r} value is malformed: the arm key is outside Int32") + if key not in by_key: + declared = ", ".join(str(declared_key) for declared_key in sorted(by_key)) + raise ValueError(f"Union {name!r} does not declare arm key {key} (declared: {declared})") + if raw[1] is None: + raise ValueError(f"Union {name!r} arm {key} has nil slots") + if not isinstance(raw[1], list): + raise ValueError(f"Union {name!r} value is malformed: expected [armKey, [armSlots]]") + arm_name, codec = by_key[key] + if codec is None: + return UnionArm(arm_name, None) + try: + return UnionArm(arm_name, codec.decode(raw[1])) + except ValueError as error: + raise ValueError(f"Union {name!r} arm {key}: {error}") from None + + return SlotCodec(encode=encode, decode=decode, type_name=type_name) + + def define_document_registry(*documents: DocumentDefinition[Any]) -> tuple[DocumentDefinition[Any], ...]: return tuple(documents) @@ -287,6 +443,64 @@ def extract_value(value: Any, extractor: str | Extractor[Any]) -> str | int | fl return getattr(value, extractor, None) +_INT32_MIN = -(2**31) +_INT32_MAX = 2**31 - 1 + + +def _is_key(value: Any) -> bool: + return isinstance(value, int) and not isinstance(value, bool) + + +def _normalize_fields( + type: str, + fields: Iterable[DatabaseEntryField | tuple[str, int] | tuple[str, int, Any]], +) -> list[DatabaseEntryField]: + normalized = [_normalize_database_entry_field(field) for field in fields] + if not normalized: + raise ValueError("DatabaseEntry document types require at least one field") + keys = [field.key for field in normalized] + if len(keys) != len(set(keys)): + raise ValueError(f"DatabaseEntry document type {type!r} has duplicate field keys") + return sorted(normalized, key=lambda field: field.key) + + +def _record_codec( + type: str, normalized: list[DatabaseEntryField], cls: type[Any] | None, type_name: str | None = None +) -> SlotCodec: + max_key = normalized[-1].key + + def encode(value: Any) -> list[Any]: + if value is None: + raise ValueError(f"DatabaseEntry document type {type!r}: expected a record, found nil") + slots = [None] * (max_key + 1) + for field in normalized: + try: + slots[field.key] = field.codec.encode(extract_value(value, field.name)) + except ValueError as error: + raise ValueError(f"{type} slot {field.key} ({field.name}): {error}") from None + return slots + + def decode(raw: Any) -> Any: + if not isinstance(raw, list): + raise ValueError(f"DatabaseEntry document type {type!r} expected a MessagePack array") + values: dict[str, Any] = {} + for field in normalized: + if field.key < len(raw): + try: + values[field.name] = field.codec.decode(raw[field.key]) + except ValueError as error: + raise ValueError(f"{type} slot {field.key} ({field.name}): {error}") from None + elif field.default is MISSING: + values[field.name] = None + else: + values[field.name] = field.default() if callable(field.default) else field.default + if cls is None: + return values + return cls(**values) + + return SlotCodec(encode=encode, decode=decode, type_name=type_name) + + def _normalize_database_entry_field( field: DatabaseEntryField | tuple[str, int] | tuple[str, int, Any], ) -> DatabaseEntryField: diff --git a/packages/cultcache-py/src/cultcache_py/interop.py b/packages/cultcache-py/src/cultcache_py/interop.py index 021969f1..70521963 100644 --- a/packages/cultcache-py/src/cultcache_py/interop.py +++ b/packages/cultcache-py/src/cultcache_py/interop.py @@ -1,50 +1,29 @@ -from __future__ import annotations +from __future__ import annotations import argparse import json from typing import Any -import msgpack - -from . import CultCache, CultCacheSchemaCatalogMember, SingleFileMessagePackBackingStore, define_document_type +from . import CultCache, SingleFileMessagePackBackingStore, database_entry_field, define_database_entry_type, leaves as t INTEROP_SCHEMA_VERSION = "cultcache.interop_note.v1" -interop_note_document = define_document_type( +interop_note_document = define_database_entry_type( "cultcache.interop-note", - encode=lambda note: [ - note["schemaVersion"], - note["documentId"], - note["authorRuntimeId"], - note["title"], - note["body"], - note["tags"], + [ + database_entry_field("schemaVersion", 0, codec=t.nullable(t.string)), + database_entry_field("documentId", 1, codec=t.nullable(t.string)), + database_entry_field("authorRuntimeId", 2, codec=t.nullable(t.string)), + database_entry_field("title", 3, codec=t.nullable(t.string)), + database_entry_field("body", 4, codec=t.nullable(t.string)), + database_entry_field("tags", 5, default=list, codec=t.nullable(t.array(t.string))), ], - decode=lambda slots: { - "schemaVersion": slots[0], - "documentId": slots[1], - "authorRuntimeId": slots[2], - "title": slots[3], - "body": slots[4], - "tags": slots[5] if len(slots) > 5 and slots[5] is not None else [], - }, name="documentId", - payload_encoder=lambda value: msgpack.packb(value, use_bin_type=True), - payload_decoder=lambda payload: msgpack.unpackb(payload, raw=False), schema_id="cultcache.interop-note", schema_name="cultcache.interop-note", schema_version=INTEROP_SCHEMA_VERSION, content_hash="cultcache.interop-note", - canonical_schema_json='{"schemaName":"cultcache.interop-note","schemaVersion":"cultcache.interop_note.v1","members":[{"slot":0,"name":"SchemaVersion","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false},{"slot":1,"name":"DocumentId","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":true},{"slot":2,"name":"AuthorRuntimeId","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false},{"slot":3,"name":"Title","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false},{"slot":4,"name":"Body","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false},{"slot":5,"name":"Tags","type":"System.String[]","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false}]}', compatible_schema_ids=("cultcache.interop-note",), - members=( - CultCacheSchemaCatalogMember(0, "SchemaVersion", "System.String"), - CultCacheSchemaCatalogMember(1, "DocumentId", "System.String", is_name=True), - CultCacheSchemaCatalogMember(2, "AuthorRuntimeId", "System.String"), - CultCacheSchemaCatalogMember(3, "Title", "System.String"), - CultCacheSchemaCatalogMember(4, "Body", "System.String"), - CultCacheSchemaCatalogMember(5, "Tags", "System.String[]"), - ), ) diff --git a/packages/cultcache-py/src/cultcache_py/leaves.py b/packages/cultcache-py/src/cultcache_py/leaves.py new file mode 100644 index 00000000..2d76078e --- /dev/null +++ b/packages/cultcache-py/src/cultcache_py/leaves.py @@ -0,0 +1,294 @@ +"""Typed slot leaves: each owns its slot's C# type name, its write check and its read check, nil included. + +A leaf is a `SlotCodec`. It turns a Python value into the tree the reference runtimes write and back, refusing a +kind the C# type would refuse. Refusals read ', found ' and never carry the value; the +record codec prefixes them with the type, slot key and field, a list with the element, a union with its arm. + +Several names here (`bytes`, `list`, `any`) shadow builtins inside this module on purpose: write +`from cultcache_py import leaves as t` and use `t.string`, `t.list(t.string)`. +""" + +from __future__ import annotations + +import math +import struct +from collections.abc import Mapping +from dataclasses import dataclass +from typing import Any, Callable, NoReturn + +try: + from msgpack import ExtType as _ExtType +except ModuleNotFoundError: + _ExtType = () # type: ignore[assignment,misc] + +_bool, _bytes, _list, _int, _float, _str = bool, bytes, list, int, float, str +_BYTE_LIKE = (_bytes, bytearray, memoryview) +_INT32 = (-(2**31), 2**31 - 1) +_INT64 = (-(2**63), 2**63 - 1) +_WRITABLE_INT = (-(2**63), 2**64 - 1) + + +@dataclass(frozen=True) +class SlotCodec: + """The leaf of one slot: how a value is written and read, and the C# type name the catalog carries for it. + + `type_name` is the reference's name for the slot's type (None when only the consumer knows it: a record or union + without `type_name=`, which the catalog lists as System.Object). `value_type` is True for a C# value type, which + the reference makes `Nullable` when the slot may be nil.""" + + encode: Callable[[Any], Any] + decode: Callable[[Any], Any] + type_name: str | None = None + value_type: bool = False + + +class _Derived(SlotCodec): + """A leaf whose name comes from another leaf, read when the catalog is built, so a `lazy` target defined later resolves.""" + + def __init__(self, encode: Callable[[Any], Any], decode: Callable[[Any], Any], name: Callable[[], str | None], + value_type: Callable[[], _bool] = lambda: False) -> None: + object.__setattr__(self, "encode", encode) + object.__setattr__(self, "decode", decode) + object.__setattr__(self, "_name", name) + object.__setattr__(self, "_value_type", value_type) + + @property # type: ignore[override] + def type_name(self) -> str | None: + return self._name() # type: ignore[attr-defined,no-any-return] + + @property # type: ignore[override] + def value_type(self) -> _bool: + return self._value_type() # type: ignore[attr-defined,no-any-return] + + +@dataclass(frozen=True) +class Float32: + """A float32 the float32 leaf writes, already rounded to float32 (an overflow is infinity, as the C# cast): the + payload packer writes it as MessagePack float 32.""" + + value: float + + +def _kind(raw: Any) -> str: + if raw is None: + return "nil" + if isinstance(raw, _bool): + return "boolean" + if isinstance(raw, _int): + return "integer" + if isinstance(raw, (_float, Float32)): + return "float" + if isinstance(raw, _str): + return "string" + if isinstance(raw, _BYTE_LIKE): + return "bytes" + if isinstance(raw, _ExtType): # a namedtuple, so before the arrays + return "ext" + if isinstance(raw, (_list, tuple)): + return "array" + return "map" if isinstance(raw, Mapping) else "other" + + +def _refuse(what: str, found: str) -> NoReturn: + raise ValueError(f"expected {what}, found {found}") + + +def _is_int(raw: Any) -> _bool: + return isinstance(raw, _int) and not isinstance(raw, _bool) + + +def _string_encode(value: Any) -> Any: + if not isinstance(value, _str): + _refuse("a string", _kind(value)) + return value + + +string = SlotCodec(_string_encode, _string_encode, "System.String") + + +def _boolean_check(value: Any) -> Any: + if not isinstance(value, _bool): + _refuse("a boolean", _kind(value)) + return value + + +boolean = SlotCodec(_boolean_check, _boolean_check, "System.Boolean", True) + + +def _bytes_encode(value: Any) -> Any: + if not isinstance(value, _BYTE_LIKE): + _refuse("bytes", _kind(value)) + return value if isinstance(value, _bytes) else _bytes(value) + + +def _bytes_decode(raw: Any) -> Any: + # The reference's byte[] reads a MessagePack str as its UTF-8 bytes and writes bin. + if isinstance(raw, _str): + return raw.encode("utf-8") + if not isinstance(raw, _bytes): + _refuse("bytes", _kind(raw)) + return raw + + +bytes = SlotCodec(_bytes_encode, _bytes_decode, "System.Byte[]") + + +def _integer(type_name: str, what: str, low: _int, high: _int) -> SlotCodec: + def check(value: Any) -> Any: + if not _is_int(value): + _refuse(what, _kind(value)) + if not low <= value <= high: + _refuse(what, "an integer out of range") + return value + + return SlotCodec(check, check, type_name, True) + + +int32 = _integer("System.Int32", "an int32", *_INT32) +int64 = _integer("System.Int64", "an int64", *_INT64) + + +def _round_to_float32(value: _float) -> _float: + try: + return struct.unpack(">f", struct.pack(">f", value))[0] # type: ignore[no-any-return] + except OverflowError: + return math.copysign(math.inf, value) + + +def _int_to_float32(value: _int) -> _float: + """An integer to the nearest float32 in one rounding, ties to even, as the reference's cast does: through a double + first, the two roundings can disagree past 2**53.""" + if -(2**53) <= value <= 2**53: + return _round_to_float32(_float(value)) + magnitude = -value if value < 0 else value + excess = magnitude.bit_length() - 24 + kept = magnitude >> excess + rest = magnitude - (kept << excess) + half = 1 << (excess - 1) + rounded = _float((kept + 1 if rest > half or (rest == half and kept & 1) else kept) << excess) + return -rounded if value < 0 else rounded + + +def _checked_int(what: str, value: _int) -> _int: + if not _WRITABLE_INT[0] <= value <= _WRITABLE_INT[1]: + _refuse(what, "an integer out of range") + return value + + +def _number(what: str, value: Any) -> _float: + """A number as a double: a float as it is, an integer (within the 64-bit range) rounded once.""" + if isinstance(value, _float): + return value + if not _is_int(value): + _refuse(what, _kind(value)) + return _float(_checked_int(what, value)) + + +def _float32_value(value: Any) -> _float: + """The float32 a number rounds to, in one rounding, as the reference's cast does.""" + if _is_int(value): + return _int_to_float32(_checked_int("a float32", value)) + return _round_to_float32(_number("a float32", value)) + + +def _float32_encode(value: Any) -> Any: + return Float32(_float32_value(value)) + + +def _float64_check(value: Any) -> Any: + return _number("a float64", value) + + +float32 = SlotCodec(_float32_encode, _float32_value, "System.Single", True) +float64 = SlotCodec(_float64_check, _float64_check, "System.Double", True) + + +def _refuse_ext(tree: Any) -> None: + """The reference reads an `object` slot as a plain value or a timestamp; any other extension is refused.""" + stack = [tree] + while stack: + node = stack.pop() + if isinstance(node, _ExtType): + _refuse("an object", "ext") + if isinstance(node, Mapping): + stack.extend(node.keys()) + stack.extend(node.values()) + elif isinstance(node, (_list, tuple)): + stack.extend(node) + + +def _any_check(value: Any) -> Any: + _refuse_ext(value) + return value + + +any = SlotCodec(_any_check, _any_check, "System.Object") + + +def _sequence(item: SlotCodec, wrap: Callable[[str], str]) -> SlotCodec: + def encode(value: Any) -> Any: + if not isinstance(value, (_list, tuple)): + _refuse("an array", _kind(value)) + out = [] + for index, element in enumerate(value): + try: + out.append(item.encode(element)) + except ValueError as error: + raise ValueError(f"element {index}: {error}") from None + return out + + def decode(raw: Any) -> Any: + if not isinstance(raw, _list): + _refuse("an array", _kind(raw)) + out = [] + for index, element in enumerate(raw): + try: + out.append(item.decode(element)) + except ValueError as error: + raise ValueError(f"element {index}: {error}") from None + return out + + return _Derived(encode, decode, lambda: None if item.type_name is None else wrap(item.type_name)) + + +def list(item: SlotCodec) -> SlotCodec: + """C# `List`.""" + return _sequence(item, lambda name: f"System.Collections.Generic.List<{name}>") + + +def array(item: SlotCodec) -> SlotCodec: + """C# `T[]`: the same wire as `list`.""" + return _sequence(item, lambda name: f"{name}[]") + + +def nullable(inner: SlotCodec) -> SlotCodec: + """A slot that may be nil: None both ways, otherwise `inner`. A C# reference type (string, byte[], List, array, + class, interface) is nullable as it is; a value type is `Nullable`.""" + + def name() -> str | None: + if inner.type_name is not None and inner.value_type: + return f"System.Nullable<{inner.type_name}>" + return inner.type_name + + return _Derived( + lambda value: None if value is None else inner.encode(value), + lambda raw: None if raw is None else inner.decode(raw), + name, + ) + + +def lazy(get: Callable[[], SlotCodec]) -> SlotCodec: + """A leaf that names its target on first use, so a union can refer to itself or to a definition made later.""" + resolved: _list[SlotCodec] = [] + + def target() -> SlotCodec: + if not resolved: + resolved.append(get()) + return resolved[0] + + return _Derived( + lambda value: target().encode(value), + lambda raw: target().decode(raw), + lambda: target().type_name, + lambda: target().value_type, + ) diff --git a/packages/cultcache-py/src/cultcache_py/stores.py b/packages/cultcache-py/src/cultcache_py/stores.py index 697882e0..704a3851 100644 --- a/packages/cultcache-py/src/cultcache_py/stores.py +++ b/packages/cultcache-py/src/cultcache_py/stores.py @@ -5,7 +5,7 @@ import json import os import threading from pathlib import Path -from typing import Any +from typing import Any, Callable, TypeVar from .backing_store import ( CultCacheEnvelope, @@ -14,6 +14,9 @@ from .backing_store import ( ) STORE_FORMAT_VERSION = "cultcache.store.v1" +_STORE_FORMAT_PREFIX = "cultcache.store." +_PERSISTED_RECORD_SLOTS = 4 +_Contents = TypeVar("_Contents") class JsonLinesBackingStore: @@ -23,10 +26,11 @@ class JsonLinesBackingStore: def pull_all(self) -> list[CultCacheEnvelope]: with self._lock: - if not self.path.exists(): + text = _read_store(self.path, lambda path: path.read_text(encoding="utf-8")) + if text is None: return [] envelopes: list[CultCacheEnvelope] = [] - for line_number, line in enumerate(self.path.read_text(encoding="utf-8").splitlines(), start=1): + for line_number, line in enumerate(text.splitlines(), start=1): if not line.strip(): continue raw = json.loads(line) @@ -86,10 +90,9 @@ class SingleFileMessagePackBackingStore: def pull_all(self) -> list[CultCacheEnvelope]: msgpack = self._msgpack() with self._lock: - if not self.path.exists(): - return [] - data = self.path.read_bytes() - if not data: + # An empty file is not a store (no writer leaves one), so it is decoded and refused. + data = _read_store(self.path, Path.read_bytes) + if data is None: return [] decoded = msgpack.unpackb(data, raw=False) snapshot = _decode_v1_snapshot(decoded) @@ -152,8 +155,46 @@ def _encode_v1_snapshot(envelopes: list[CultCacheEnvelope]) -> list[Any]: return [STORE_FORMAT_VERSION, catalog, records] +def _read_store(path: Path, read: Callable[[Path], _Contents]) -> _Contents | None: + """Reads a store file, or returns None when nothing is at its path. + + Only nothing is absent. A dangling symbolic link is something: reading it as + empty would let the writer replace the link and move the store off its volume. + Any other failure to reach the file stays an OSError. + """ + try: + return read(path) + except FileNotFoundError: + if path.is_symlink(): + raise + return None + + +def _describe_identity(value: Any) -> str: + """A record key or schema id as a refusal may show it: a string is an identity and is + named; anything else is described by its type, since the value is the store's.""" + if isinstance(value, str): + return repr(value) + return f"<{type(value).__name__}>" + + +def _describe_header(header: str) -> str: + """Echoes a header only in the shape cultcache.store.v; the bytes are the store's.""" + version = header[len(_STORE_FORMAT_PREFIX) + 1:] if header.startswith(_STORE_FORMAT_PREFIX + "v") else "" + if version.isascii() and version.isdigit(): + return repr(header) + return f"an unrecognised {_STORE_FORMAT_PREFIX}* header of {len(header.encode('utf-8'))} bytes" + + def _decode_v1_snapshot(decoded: Any) -> list[CultCacheEnvelope] | None: - if not isinstance(decoded, list) or not decoded or decoded[0] != STORE_FORMAT_VERSION: + if not isinstance(decoded, list) or not decoded: + return None + if isinstance(decoded[0], str) and decoded[0].startswith(_STORE_FORMAT_PREFIX) and decoded[0] != STORE_FORMAT_VERSION: + raise ValueError( + f"CultCache store format {_describe_header(decoded[0])} is not one this runtime reads; " + f"it reads {STORE_FORMAT_VERSION!r} only" + ) + if decoded[0] != STORE_FORMAT_VERSION: return None if len(decoded) < 3 or not isinstance(decoded[1], list) or not isinstance(decoded[2], list): raise ValueError("CultCache v1 snapshot must contain a schema catalog and record array") @@ -169,7 +210,13 @@ def _decode_v1_snapshot(decoded: Any) -> list[CultCacheEnvelope] | None: for raw_record in decoded[2]: if not isinstance(raw_record, list) or len(raw_record) < 4: raise ValueError("CultCache persisted records must be MessagePack arrays") - key, schema_id, stored_at, payload = raw_record[:4] + if len(raw_record) > _PERSISTED_RECORD_SLOTS: + raise ValueError( + f"CultCache record {_describe_identity(raw_record[0])} (schema {_describe_identity(raw_record[1])}) " + f"has {len(raw_record)} slots, more than " + f"the {_PERSISTED_RECORD_SLOTS} of a {STORE_FORMAT_VERSION} record, so this is not a valid store" + ) + key, schema_id, stored_at, payload = raw_record if not isinstance(key, str) or not key: raise ValueError("CultCache persisted records must declare a key") if not isinstance(schema_id, str) or not schema_id: diff --git a/packages/cultcache-py/tests/test_cultcache.py b/packages/cultcache-py/tests/test_cultcache.py index ac81cc6d..6e85f833 100644 --- a/packages/cultcache-py/tests/test_cultcache.py +++ b/packages/cultcache-py/tests/test_cultcache.py @@ -1,5 +1,6 @@ from __future__ import annotations +import os import tempfile import threading import unittest @@ -802,5 +803,168 @@ class CultCacheTests(unittest.TestCase): self.assertEqual(cache.get_required_envelope(document, "item:one").key, "item:one") + # Shared refusal vectors: tests/vectors/document-variants-c0, read by every runtime's tests. + _VECTORS = Path(__file__).resolve().parents[3] / "tests" / "vectors" / "document-variants-c0" + _ITEM_SCHEMA_ID = "sha256:88d3fdf0a927acf3b163940d8f8c7fe62b3316542ce771a67ec8bc038f594788" + + def _pull_vector(self, name: str) -> list[CultCacheEnvelope]: + with tempfile.TemporaryDirectory() as tmp: + store_path = Path(tmp) / "store.msgpack" + store_path.write_bytes((self._VECTORS / name).read_bytes()) + return SingleFileMessagePackBackingStore(store_path).pull_all() + + def test_single_file_refuses_unknown_header_by_name(self) -> None: + with self.assertRaises(ValueError) as caught: + self._pull_vector("unknown-header.msgpack") + self.assertIn("cultcache.store.v9", str(caught.exception)) + + def test_single_file_refuses_extra_record_slot_naming_the_record(self) -> None: + with self.assertRaises(ValueError) as caught: + self._pull_vector("extra-slot-full-payload.msgpack") + self.assertIn("item:anvil", str(caught.exception)) + self.assertIn(self._ITEM_SCHEMA_ID, str(caught.exception)) + + def test_single_file_refuses_variant_store_by_version_or_record(self) -> None: + with self.assertRaises(ValueError) as caught: + self._pull_vector("variant-v2.msgpack") + message = str(caught.exception) + self.assertTrue("cultcache.store.v2" in message or "item:anvil-big" in message, message) + + def test_single_file_refuses_the_csharp_written_variant_store_by_version_or_record(self) -> None: + with self.assertRaises(ValueError) as caught: + self._pull_vector("../document-variants-c1/variant-store.msgpack") + message = str(caught.exception) + self.assertTrue("cultcache.store.v2" in message or "laser-big" in message, message) + + def test_v1_store_written_at_the_base_commit_still_reads_byte_for_byte(self) -> None: + envelopes = self._pull_vector("v1-base.msgpack") + self.assertEqual([(e.key, e.type) for e in envelopes], [("alpha", "vectors.item"), ("beta", "vectors.item")]) + self.assertEqual(envelopes[0].payload, b"\x92\xa5alpha\x01") + self.assertEqual(envelopes[1].payload, b"\x92\xa4beta\x02") + + def test_single_file_refusals_say_what_was_found_without_blaming_variants(self) -> None: + with self.assertRaises(ValueError) as unsupported: + self._pull_vector("unknown-header.msgpack") + self.assertIn("not one this runtime reads", str(unsupported.exception)) + self.assertNotIn("variant", str(unsupported.exception)) + with self.assertRaises(ValueError) as invalid: + self._pull_vector("extra-slot-full-payload.msgpack") + self.assertIn("not a valid store", str(invalid.exception)) + self.assertNotIn("variant", str(invalid.exception)) + + def test_single_file_only_a_missing_store_reads_as_empty(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + self.assertEqual(SingleFileMessagePackBackingStore(Path(tmp) / "store.cc").pull_all(), []) + + # An existing empty file is not a store: no CultCache writer leaves one. + empty = Path(tmp) / "empty.cc" + empty.write_bytes(b"") + with self.assertRaises(ValueError): + SingleFileMessagePackBackingStore(empty).pull_all() + self.assertEqual(empty.read_bytes(), b"") + + # An empty array is the legacy envelope array with no envelopes: no header, no format claimed. + legacy_empty = Path(tmp) / "legacy-empty.cc" + legacy_empty.write_bytes(b"\x90") + self.assertEqual(SingleFileMessagePackBackingStore(legacy_empty).pull_all(), []) + + def test_single_file_refusals_never_echo_a_value_from_the_store(self) -> None: + import msgpack # type: ignore + + with tempfile.TemporaryDirectory() as tmp: + path = Path(tmp) / "store.cc" + cases = [ + (["cultcache.store.v12", [], []], True), + (["cultcache.store.SECRET-HEADER", [], []], False), + (["cultcache.store.v12SECRET", [], []], False), + (["cultcache.store.v", [], []], False), + (["cultcache.store.v1", ["SECRET-CATALOG-TEXT"], []], None), + ] + for value, echoed in cases: + path.write_bytes(msgpack.packb(value, use_bin_type=True)) + with self.assertRaises(ValueError) as caught: + SingleFileMessagePackBackingStore(path).pull_all() + message = str(caught.exception) + if echoed: + self.assertIn(repr(value[0]), message) + else: + self.assertNotIn("SECRET", message) + if echoed is False: + self.assertNotIn(repr(value[0]), message) + self.assertIn(f"of {len(value[0])} bytes", message) + + def test_single_file_record_refusal_names_only_a_string_key(self) -> None: + import msgpack # type: ignore + + with tempfile.TemporaryDirectory() as tmp: + path = Path(tmp) / "store.cc" + for key, schema in ((["SECRET-IN-LIST"], "s"), (b"SECRET-BYTES", "s"), ("k", {"SECRET": 1})): + path.write_bytes(msgpack.packb( + ["cultcache.store.v1", [], [[key, schema, "t", b"\x90", "extra"]]], use_bin_type=True)) + with self.assertRaises(ValueError) as caught: + SingleFileMessagePackBackingStore(path).pull_all() + self.assertNotIn("SECRET", str(caught.exception)) + self.assertIn("not a valid store", str(caught.exception)) + + # What a write does through a symbolic link today. R3 decides whether a write resolves + # the link or refuses it; this pins the current behaviour so that change is deliberate. + @unittest.skipIf(os.name != "posix", "symbolic links need POSIX here") + def test_r3_decides_resolve_or_refuse_a_push_through_a_live_link_replaces_the_link(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + volume = Path(tmp) / "volume" + volume.mkdir() + target = volume / "store.cc" + envelope = CultCacheEnvelope(key="a", type="t", payload=b"\x90", stored_at="2026-09-30T00:00:00Z") + SingleFileMessagePackBackingStore(target).push(envelope) + before = target.read_bytes() + link = Path(tmp) / "store.cc" + link.symlink_to(target) + SingleFileMessagePackBackingStore(link).push(replace(envelope, key="b")) + self.assertFalse(link.is_symlink()) + self.assertTrue(link.is_file()) + self.assertEqual(target.read_bytes(), before) + + @unittest.skipIf(os.name != "posix", "symbolic links need POSIX here") + def test_a_dangling_symlink_at_a_store_path_is_an_os_error_and_nothing_is_written(self) -> None: + for store_type in (SingleFileMessagePackBackingStore, JsonLinesBackingStore): + with tempfile.TemporaryDirectory() as tmp: + volume = Path(tmp) / "volume" + volume.mkdir() + path = Path(tmp) / "store.cc" + path.symlink_to(volume / "store.cc") + store = store_type(path) + with self.assertRaises(FileNotFoundError): + store.pull_all() + with self.assertRaises(FileNotFoundError): + store.push(CultCacheEnvelope(key="k", type="t", payload=b"\x90", stored_at="2026-09-30T00:00:00Z")) + self.assertTrue(path.is_symlink()) + self.assertEqual(list(volume.iterdir()), []) + + @unittest.skipIf(os.name != "posix", "symlink loops and file-as-parent errors are POSIX errno cases") + def test_json_lines_store_that_cannot_be_reached_is_an_os_error(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + self.assertEqual(JsonLinesBackingStore(Path(tmp) / "missing.jsonl").pull_all(), []) + loop = Path(tmp) / "loop.jsonl" + loop.symlink_to(loop) + parent = Path(tmp) / "body" + parent.write_bytes(b"not a directory") + for path in (loop, parent / "store.jsonl"): + with self.assertRaises(OSError) as caught: + JsonLinesBackingStore(path).pull_all() + self.assertNotIsInstance(caught.exception, FileNotFoundError) + + @unittest.skipIf(os.name != "posix", "symlink loops and file-as-parent errors are POSIX errno cases") + def test_single_file_store_that_cannot_be_reached_is_an_os_error(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + loop = Path(tmp) / "loop.cc" + loop.symlink_to(loop) + parent = Path(tmp) / "body" + parent.write_bytes(b"not a directory") + for path in (loop, parent / "store.cc"): + with self.assertRaises(OSError) as caught: + SingleFileMessagePackBackingStore(path).pull_all() + self.assertNotIsInstance(caught.exception, FileNotFoundError) + + if __name__ == "__main__": unittest.main() diff --git a/packages/cultcache-py/tests/test_typed_leaves.py b/packages/cultcache-py/tests/test_typed_leaves.py new file mode 100644 index 00000000..9b432efd --- /dev/null +++ b/packages/cultcache-py/tests/test_typed_leaves.py @@ -0,0 +1,733 @@ +from __future__ import annotations + +import math +import struct +import unittest +from pathlib import Path + +import msgpack + +from cultcache_py import ( + CultCache, + SingleFileMessagePackBackingStore, + UnionArm, + database_entry_field, + define_database_entry_type, + define_record_codec, + define_union, + leaves as t, +) +from cultcache_py.documents import _pack_tree +from cultcache_py.interop import interop_note_document + +VECTORS = Path(__file__).resolve().parents[3] / "tests" / "vectors" / "numeric-leaves" +CANARY = "CANARY-leaf-9d41" +REFERENCE = "GameCult.Caching.Tests.NumericLeafVectorTests+" + + +def _vector(name: str) -> list: + return msgpack.unpackb((VECTORS / name).read_bytes(), raw=False) + + +def _slot(leaf: t.SlotCodec): + return define_database_entry_type("tests.leaf", [database_entry_field("v", 0, codec=leaf)]) + + +def _doubles(bits: bytes) -> float: + return struct.unpack(">d", bits)[0] + + +def _is_signalling_float32(payload: bytes) -> bool: + if len(payload) != 6 or payload[1] != 0xCA: + return False + word = struct.unpack(">I", payload[2:])[0] + return word & 0x7F800000 == 0x7F800000 and word & 0x007FFFFF != 0 and word & 0x00400000 == 0 + + +def _kinded(node): + """A decoded tree with its kinds kept: bool, int and float never compare equal; numeric width is not part of it.""" + if isinstance(node, bool): + return ("bool", node) + if isinstance(node, int): + return ("int", node) + if isinstance(node, float): + return ("float", "nan" if math.isnan(node) else struct.pack(">d", node)) + if isinstance(node, (list, tuple)): + return ("array", [_kinded(item) for item in node]) + if isinstance(node, dict): + return ("map", [(_kinded(k), _kinded(v)) for k, v in node.items()]) + return (type(node).__name__, node) + + +NUMERIC = {"int32": t.int32, "int64": t.int64, "float32": t.float32, "float64": t.float64} + + +class NumericVectorTests(unittest.TestCase): + def test_reads_accept_refuse_and_round_exactly_as_the_reference(self) -> None: + rows = _vector("reads.msgpack") + self.assertEqual(len(rows), 160) + accepted = refused = 0 + for leaf, payload, was_accepted, bits in rows: + label = f"{leaf} {payload.hex()}" + document = _slot(NUMERIC[leaf]) + if not was_accepted: + with self.assertRaises(ValueError, msg=label): + document.decode_payload(payload) + refused += 1 + continue + read = document.decode_payload(payload)["v"] + if leaf.startswith("float"): + if math.isnan(_doubles(bits)): + self.assertTrue(math.isnan(read), label) + else: + self.assertEqual(struct.pack(">d", read), bits, label) + else: + self.assertEqual(read, int.from_bytes(bits, "big", signed=True), label) + accepted += 1 + self.assertEqual((accepted + refused, accepted > 40, refused > 40), (160, True, True)) + + def test_writes_are_the_bytes_the_reference_writes(self) -> None: + rows = _vector("writes.msgpack") + self.assertEqual(len(rows), 46) + for leaf, text, expected in rows: + value = _doubles(bytes.fromhex(text)) if leaf.startswith("float") else int(text) + self.assertEqual(_slot(NUMERIC[leaf]).encode_payload({"v": value}), expected, f"{leaf} {text}") + + def test_the_mixed_record_is_written_byte_for_byte_and_read_back(self) -> None: + mixed = define_database_entry_type( + "tests.mixed", + [ + database_entry_field("id", 0, codec=t.string), + database_entry_field("i", 1, codec=t.int32), + database_entry_field("l", 2, codec=t.int64), + database_entry_field("f", 3, codec=t.float32), + database_entry_field("d", 4, codec=t.float64), + ], + ) + committed = (VECTORS / "mixed-record.msgpack").read_bytes() + value = {"id": "n1", "i": 7, "l": 8, "f": 1.5, "d": 2.5} + self.assertEqual(mixed.encode_payload(value), committed) + self.assertEqual(mixed.decode_payload(committed), value) + + def test_float32_infinities_and_quiet_nans_keep_their_bits_and_signalling_ones_come_back_quieted(self) -> None: + rows = _vector("float32-nan.msgpack") + self.assertEqual(len(rows), 6) + document = _slot(t.float32) + quieted = 0 + for payload, reference in rows: + written = document.encode_payload(document.decode_payload(payload)) + if _is_signalling_float32(payload): + # follow_up py-float32-snan-quieted: msgpack's unpacker quiets the NaN before the leaf sees it. + self.assertEqual(reference, payload, "the reference keeps the signalling bits") + word = struct.unpack(">I", payload[2:])[0] | 0x00400000 + self.assertEqual(written, b"\x91\xca" + struct.pack(">I", word)) + quieted += 1 + else: + self.assertEqual(written, reference, payload.hex()) + self.assertEqual(quieted, 3) + + +def _inner_record() -> t.SlotCodec: + return define_record_codec( + "LeafInner", + [ + database_entry_field("n", 0, default="", codec=t.string), + database_entry_field("w", 1, default=0.0, codec=t.float32), + ], + type_name=REFERENCE + "LeafInner", + ) + + +def _shape() -> t.SlotCodec: + circle = define_record_codec( + "LeafCircle", [database_entry_field("r", 0, default=0.0, codec=t.float32)], type_name=REFERENCE + "LeafCircle" + ) + return define_union("LeafShape", {0: ("LeafCircle", circle)}, type_name=REFERENCE + "ILeafShape") + + +# The C# slot types of leaves-reads.msgpack, each as a reference-type slot that may be null (nullable) and bare. +def _reference_leaves(nullable: bool) -> dict[str, t.SlotCodec]: + inner, shape = _inner_record(), _shape() + wrap = t.nullable if nullable else (lambda leaf: leaf) + return { + "string": wrap(t.string), + "bytes": wrap(t.bytes), + "list-string": wrap(t.list(t.string)), + "array-string": wrap(t.array(t.string)), + "list-int32": wrap(t.list(t.int32)), + "record": wrap(inner), + "list-record": wrap(t.list(inner)), + "union": wrap(shape), + } + + +class LeavesReadsVectorTests(unittest.TestCase): + NIL = bytes.fromhex("91c0") + + def _check(self, leaf_name: str, leaf: t.SlotCodec, rows: list, *, nil_refused: bool = False) -> int: + document = _slot(leaf) + checked = 0 + for name, payload, accepted, rewrite in rows: + if name != leaf_name: + continue + label = f"{name} {payload.hex()}" + if not accepted or (nil_refused and payload == self.NIL): + with self.assertRaises(ValueError, msg=label): + document.decode_payload(payload) + else: + value = document.decode_payload(payload) + self.assertEqual(document.encode_payload(value), rewrite, label) + checked += 1 + return checked + + def test_reference_type_leaves_held_as_nullable_read_and_rewrite_exactly_as_csharp(self) -> None: + rows = _vector("leaves-reads.msgpack") + self.assertEqual(len(rows), 308) + extra = {"nullable-int32": t.nullable(t.int32)} + for name, leaf in {**_reference_leaves(True), **extra}.items(): + self.assertEqual(self._check(name, leaf, rows), 28, name) + self.assertTrue(any(row[0] == name and row[2] for row in rows) and any(row[0] == name and not row[2] for row in rows), name) + + def test_the_bare_leaf_accepts_the_same_rows_minus_nil(self) -> None: + rows = _vector("leaves-reads.msgpack") + for name, leaf in _reference_leaves(False).items(): + self.assertEqual(self._check(name, leaf, rows, nil_refused=True), 28, name) + + def test_boolean_is_a_bare_value_leaf(self) -> None: + self.assertEqual(self._check("boolean", t.boolean, _vector("leaves-reads.msgpack")), 28) + + def test_any_reads_what_the_reference_reads_and_rewrites_to_the_same_value(self) -> None: + # ruling any-rewrite-binds-kind-and-value: the kind and exact value of the rewrite, recursively; numeric width is free ("05" -> "cc05"). + rows = _vector("leaves-reads.msgpack") + document = _slot(t.any) + count = 0 + for name, payload, accepted, rewrite in rows: + if name != "any": + continue + label = f"any {payload.hex()}" + if not accepted: + with self.assertRaises(ValueError, msg=label): + document.decode_payload(payload) + else: + written = document.encode_payload(document.decode_payload(payload)) + self.assertEqual(_kinded(msgpack.unpackb(written, raw=False)), _kinded(msgpack.unpackb(rewrite, raw=False)), label) + count += 1 + self.assertEqual(count, 28) + + def test_the_any_comparison_tells_bool_int_and_float_apart_and_ignores_only_numeric_width(self) -> None: + # ruling any-rewrite-binds-kind-and-value: Python's == makes True == 1 == 1.0; _kinded does not. + self.assertNotEqual(_kinded([True]), _kinded([1])) + self.assertNotEqual(_kinded([1]), _kinded([1.0])) + self.assertNotEqual(_kinded({"k": [5]}), _kinded({"k": [5.0]})) + self.assertNotEqual(_kinded([0.0]), _kinded([-0.0])) + self.assertNotEqual(_kinded(["a"]), _kinded([b"a"])) + self.assertEqual(_kinded(msgpack.unpackb(bytes.fromhex("9105"))), _kinded(msgpack.unpackb(bytes.fromhex("91cc05")))) + self.assertEqual( + _kinded(msgpack.unpackb(bytes.fromhex("91ca3fc00000"))), _kinded(msgpack.unpackb(bytes.fromhex("91cb3ff8000000000000"))) + ) + + def test_any_refuses_an_extension_that_is_not_a_timestamp_wherever_it_nests(self) -> None: + document = _slot(t.any) + for payload in (bytes.fromhex("91d40100"), bytes.fromhex("9191d40100"), bytes.fromhex("9181a161d40100")): + with self.assertRaises(ValueError, msg=payload.hex()): + document.decode_payload(payload) + with self.assertRaises(ValueError): + t.any.encode({"k": [msgpack.ExtType(1, b"\x00")]}) + with self.assertRaises(ValueError) as caught: + t.any.decode(msgpack.ExtType(1, b"\x00")) + self.assertEqual(str(caught.exception), "expected an object, found ext") + self.assertIsNone(t.any.decode(None)) + self.assertIsNone(t.any.encode(None)) + + +def _leaf_record_document(): + inner, shape = _inner_record(), _shape() + document = define_database_entry_type( + "cultcache.leaf-record", + [ + database_entry_field("id", 0, codec=t.string), + database_entry_field("flag", 1, codec=t.boolean), + database_entry_field("blob", 2, codec=t.bytes), + database_entry_field("i", 3, codec=t.int32), + database_entry_field("l", 4, codec=t.int64), + database_entry_field("f", 5, codec=t.float32), + database_entry_field("d", 6, codec=t.float64), + database_entry_field("maybe_i", 7, codec=t.nullable(t.int32)), + database_entry_field("tags", 8, codec=t.list(t.string)), + database_entry_field("names", 9, codec=t.array(t.string)), + database_entry_field("any", 10, codec=t.any), + database_entry_field("nested", 11, codec=t.nullable(inner)), + database_entry_field("items", 12, codec=t.list(inner)), + database_entry_field("shape", 13, codec=t.nullable(shape)), + database_entry_field("floats", 14, codec=t.array(t.float32)), + database_entry_field("maybe_f", 15, codec=t.nullable(t.float32)), + ], + name="id", + ) + return document + + +class LeafRecordCatalogTests(unittest.TestCase): + def test_a_python_mirror_derives_the_catalog_the_csharp_store_writes_and_the_payload_round_trips(self) -> None: + document = _leaf_record_document() + members, payload = _vector("leaf-record.msgpack") + derived = [ + [m.slot, m.member_name, m.type_name, m.is_reference, m.is_many, m.target_schema_name, m.is_name, m.index_alias] + for m in document.catalog_entry().members + ] + self.assertEqual(derived, members) + self.assertEqual(document.encode_payload(document.decode_payload(payload)), payload) + + def test_nullable_names_a_value_type_nullable_and_a_reference_type_as_itself(self) -> None: + self.assertEqual(t.nullable(t.int32).type_name, "System.Nullable") + self.assertEqual(t.nullable(t.boolean).type_name, "System.Nullable") + self.assertEqual(t.nullable(t.string).type_name, "System.String") + self.assertEqual(t.nullable(t.list(t.string)).type_name, "System.Collections.Generic.List") + self.assertEqual(t.array(t.nullable(t.int64)).type_name, "System.Nullable[]") + self.assertEqual(t.array(t.float32).type_name, "System.Single[]") + self.assertEqual(t.bytes.type_name, "System.Byte[]") + self.assertFalse(t.nullable(t.int32).value_type) + self.assertEqual([c.value_type for c in (t.string, t.boolean, t.bytes, t.int32, t.int64, t.float32, t.float64, t.any)], + [False, True, False, True, True, True, True, False]) + + def test_an_unnamed_record_or_union_is_listed_as_an_untyped_slot_and_a_list_of_one_too(self) -> None: + record = define_record_codec("Plain", [("a", 0)]) + self.assertIsNone(record.type_name) + self.assertIsNone(t.list(record).type_name) + self.assertIsNone(t.nullable(record).type_name) + document = define_database_entry_type( + "tests.unnamed", [database_entry_field("r", 0, codec=record), database_entry_field("l", 1, codec=t.list(record))] + ) + self.assertEqual([m.type_name for m in document.catalog_entry().members], ["System.Object", "System.Object"]) + + def test_a_recursive_union_through_lazy_encodes_decodes_and_names_its_type(self) -> None: + link = define_record_codec( + "Link", [database_entry_field("next", 0, codec=t.nullable(t.lazy(lambda: chain)))], type_name="Tests.Link" + ) + chain = define_union("Chain", {0: ("Link", link), 1: ("End", None)}, type_name="Tests.Chain") + self.assertEqual(t.lazy(lambda: chain).type_name, "Tests.Chain") + self.assertEqual(t.nullable(t.lazy(lambda: chain)).type_name, "Tests.Chain") + value = UnionArm("Link", {"next": UnionArm("Link", {"next": UnionArm("End")})}) + written = chain.encode(value) + self.assertEqual(written, [0, [[0, [[1, []]]]]]) + self.assertEqual(chain.decode(written), value) + self.assertIs(t.lazy(lambda: t.int32).value_type, True) + document = define_database_entry_type("tests.chain", [database_entry_field("root", 0, codec=t.nullable(chain))]) + self.assertEqual(document.catalog_entry().members[0].type_name, "Tests.Chain") + + def test_a_lazy_leaf_resolves_its_target_once(self) -> None: + calls = [] + leaf = t.lazy(lambda: calls.append(1) or t.int32) + self.assertEqual(calls, []) + leaf.encode(1) + leaf.decode(2) + leaf.type_name + self.assertEqual(calls, [1]) + + +class SlotNilAndDefaultTests(unittest.TestCase): + def test_a_present_nil_goes_to_the_leaf_and_a_default_fills_only_a_slot_past_the_payloads_end(self) -> None: + document = define_database_entry_type( + "tests.defaults", + [ + database_entry_field("count", 0, default=0, codec=t.int32), + database_entry_field("label", 1, default="", codec=t.string), + database_entry_field("maybe", 2, default="dflt", codec=t.nullable(t.string)), + database_entry_field("tags", 3, default=list, codec=t.list(t.string)), + ], + ) + self.assertEqual( + document.decode_payload(msgpack.packb([3, "x", None, ["a"]])), {"count": 3, "label": "x", "maybe": None, "tags": ["a"]} + ) + self.assertEqual(document.decode_payload(msgpack.packb([3])), {"count": 3, "label": "", "maybe": "dflt", "tags": []}) + self.assertIsNot( + document.decode_payload(msgpack.packb([3]))["tags"], document.decode_payload(msgpack.packb([3]))["tags"] + ) + for bad in ([None], [3, None], [3, "x", None, None]): + with self.assertRaises(ValueError, msg=str(bad)): + document.decode_payload(msgpack.packb(bad)) + + def test_a_write_missing_a_non_nullable_field_is_refused_naming_the_slot(self) -> None: + document = define_database_entry_type( + "tests.required", + [database_entry_field("count", 0, codec=t.int32), database_entry_field("label", 1, codec=t.nullable(t.string))], + ) + self.assertEqual(document.encode_payload({"count": 1}), msgpack.packb([1, None])) + with self.assertRaises(ValueError) as caught: + document.encode_payload({"label": "x"}) + self.assertEqual(str(caught.exception), "tests.required slot 0 (count): expected an int32, found nil") + with self.assertRaises(ValueError) as nil_record: + define_record_codec("R", [("a", 0)]).encode(None) + self.assertIn("found nil", str(nil_record.exception)) + + def test_an_untyped_definition_keeps_its_catalog_and_bytes_and_reads_a_present_nil_as_none(self) -> None: + document = define_database_entry_type("tests.untyped", [("name", 0), ("owner_id", 1, "none"), ("tags", 3, list)]) + self.assertEqual([(m.slot, m.member_name, m.type_name) for m in document.catalog_entry().members], + [(0, "Name", "System.Object"), (1, "OwnerId", "System.Object"), (3, "Tags", "System.Object")]) + # Values computed with the code at base 4ec4bfb7. + self.assertEqual(document.encode_payload({"name": "n", "owner_id": "o", "tags": ["a"]}).hex(), "94a16ea16fc091a161") + self.assertEqual(document.decode_payload(bytes.fromhex("94a16ea16fc091a161")), {"name": "n", "owner_id": "o", "tags": ["a"]}) + self.assertEqual(document.decode_payload(bytes.fromhex("94a16ec0c0c0")), {"name": "n", "owner_id": None, "tags": None}) + self.assertEqual(document.decode_payload(bytes.fromhex("91a16e")), {"name": "n", "owner_id": "none", "tags": []}) + self.assertEqual(_pack_tree(["x", 1.5, {"k": [b"y"]}]), msgpack.packb(["x", 1.5, {"k": [b"y"]}], use_bin_type=True)) + + def test_the_interop_note_catalog_is_the_one_the_hand_written_definition_had(self) -> None: + entry = interop_note_document.catalog_entry() + names = [(m.slot, m.member_name, m.type_name, m.is_name) for m in entry.members] + self.assertEqual( + names, + [(0, "SchemaVersion", "System.String", False), (1, "DocumentId", "System.String", True), + (2, "AuthorRuntimeId", "System.String", False), (3, "Title", "System.String", False), + (4, "Body", "System.String", False), (5, "Tags", "System.String[]", False)], + ) + # Captured from the hand-written definition at base 4ec4bfb7. + self.assertEqual(entry.canonical_schema_json, _BASE_INTEROP_CATALOG) + self.assertEqual( + (entry.schema_id, entry.schema_name, entry.schema_version, entry.content_hash, entry.compatible_schema_ids), + ("cultcache.interop-note", "cultcache.interop-note", "cultcache.interop_note.v1", "cultcache.interop-note", + ("cultcache.interop-note",)), + ) + note = {"schemaVersion": "cultcache.interop_note.v1", "documentId": "note:py", "authorRuntimeId": "py", + "title": "t", "body": "b", "tags": ["py", "interop"]} + self.assertEqual(interop_note_document.encode_payload(note).hex(), _BASE_INTEROP_PAYLOAD) + self.assertEqual(interop_note_document.decode_payload(bytes.fromhex(_BASE_INTEROP_PAYLOAD)), note) + self.assertEqual(interop_note_document.decode_payload(msgpack.packb(["v", "d", "a", "t", "b"]))["tags"], []) + + +_BASE_INTEROP_CATALOG = ( + '{"schemaName":"cultcache.interop-note","schemaVersion":"cultcache.interop_note.v1","members":[' + '{"slot":0,"name":"SchemaVersion","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false},' + '{"slot":1,"name":"DocumentId","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":true},' + '{"slot":2,"name":"AuthorRuntimeId","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false},' + '{"slot":3,"name":"Title","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false},' + '{"slot":4,"name":"Body","type":"System.String","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false},' + '{"slot":5,"name":"Tags","type":"System.String[]","isReference":false,"many":false,"targetSchemaName":null,"indexAlias":null,"isName":false}]}' +) +_BASE_INTEROP_PAYLOAD = "96" + "".join( + msgpack.packb(v, use_bin_type=True).hex() + for v in ("cultcache.interop_note.v1", "note:py", "py", "t", "b", ["py", "interop"]) +) + + +class LeafRuleTests(unittest.TestCase): + def _refusal(self, run) -> str: + with self.assertRaises(ValueError) as caught: + run() + return str(caught.exception) + + def test_refusals_name_the_slot_and_the_kind_found_and_never_the_value(self) -> None: + cases = [ + (t.int32, CANARY, "expected an int32, found string"), + (t.int64, 1.5, "expected an int64, found float"), + (t.string, b"bin", "expected a string, found bytes"), + (t.boolean, 1, "expected a boolean, found integer"), + (t.bytes, 5, "expected bytes, found integer"), + (t.float32, CANARY, "expected a float32, found string"), + (t.float64, [CANARY], "expected a float64, found array"), + (t.list(t.string), {CANARY: 1}, "expected an array, found map"), + (t.string, None, "expected a string, found nil"), + (t.int32, True, "expected an int32, found boolean"), + (t.int32, 2**31, "expected an int32, found an integer out of range"), + ] + for leaf, value, expected in cases: + document = _slot(leaf) + with self.subTest(expected=expected, direction="write"): + self.assertEqual(self._refusal(lambda: document.encode_payload({"v": value})), f"tests.leaf slot 0 (v): {expected}") + with self.subTest(expected=expected, direction="read"): + payload = msgpack.packb([value], use_bin_type=True) + message = self._refusal(lambda: document.decode_payload(payload)) + self.assertTrue(message.startswith("tests.leaf slot 0 (v): expected "), message) + self.assertNotIn(CANARY, message) + + def test_a_list_element_refusal_names_the_element_and_a_union_arm_refusal_names_the_arm(self) -> None: + self.assertEqual( + self._refusal(lambda: t.list(t.int32).decode([1, "x"])), "element 1: expected an int32, found string" + ) + self.assertEqual( + self._refusal(lambda: t.array(t.list(t.int32)).encode([[1], [2, None]])), + "element 1: element 1: expected an int32, found nil", + ) + arm = define_union("U", {3: ("A", define_record_codec("A", [database_entry_field("n", 0, codec=t.int32)]))}) + self.assertEqual( + self._refusal(lambda: arm.decode([3, [CANARY]])), "Union 'U' arm 3: A slot 0 (n): expected an int32, found string" + ) + self.assertEqual( + self._refusal(lambda: arm.encode(UnionArm("A", {"n": None}))), "Union 'U' arm 3: A slot 0 (n): expected an int32, found nil" + ) + + def test_string_boolean_and_bytes_domains(self) -> None: + self.assertEqual(t.string.encode("é"), "é") + self.assertIs(t.boolean.decode(True), True) + self.assertEqual(t.bytes.encode(bytearray(b"ab")), b"ab") + self.assertEqual(t.bytes.encode(memoryview(b"ab")), b"ab") + self.assertIs(type(t.bytes.encode(bytearray(b"ab"))), bytes) + self.assertEqual(t.bytes.decode("é"), "é".encode("utf-8")) + self.assertEqual(t.bytes.decode(b"\x00"), b"\x00") + self.assertEqual(t.bytes.decode(""), b"") + for refuse in (lambda: t.bytes.decode(5), lambda: t.bytes.encode("str")): + self.assertIn("expected bytes", self._refusal(refuse)) + + def test_integer_leaves_hold_their_ranges_and_refuse_floats_and_booleans(self) -> None: + self.assertEqual((t.int32.encode(-(2**31)), t.int32.encode(2**31 - 1)), (-(2**31), 2**31 - 1)) + self.assertEqual((t.int64.decode(-(2**63)), t.int64.decode(2**63 - 1)), (-(2**63), 2**63 - 1)) + for leaf, value in ((t.int32, -(2**31) - 1), (t.int32, 2**31), (t.int64, -(2**63) - 1), (t.int64, 2**63), (t.int64, 2**64 - 1)): + self.assertIn("out of range", self._refusal(lambda: leaf.decode(value))) + self.assertIn("out of range", self._refusal(lambda: leaf.encode(value))) + for bad in (1.0, True, False, "1", None): + self.assertIn("expected an int32", self._refusal(lambda: t.int32.decode(bad))) + + def test_float_leaves_take_ints_and_floats_round_once_and_refuse_booleans(self) -> None: + self.assertEqual(t.float32.decode(0.1), struct.unpack(">f", struct.pack(">f", 0.1))[0]) + self.assertEqual(t.float32.decode(2**24 + 1), float(2**24)) + self.assertEqual(t.float32.decode(1e300), math.inf) + self.assertEqual(t.float32.decode(-1e300), -math.inf) + self.assertEqual(t.float64.decode(2**53 + 1), float(2**53)) + # past 2**53 a double then a float32 rounding can differ from one rounding: 2**62 + 2**38 + 1 is above the tie. + value = 2**62 + 2**38 + 1 + self.assertEqual(t.float32.decode(value), float(2**62 + 2**39)) + self.assertEqual(t.float32.decode(-value), -float(2**62 + 2**39)) + tie_even, tie_odd = 2**62 + 2**38, 2**62 + 2**39 + 2**38 + self.assertEqual(t.float32.decode(tie_even), float(2**62)) + self.assertEqual(t.float32.decode(tie_odd), float(2**62 + 2**40)) + self.assertEqual(t.float32.encode(2**64 - 1), t.Float32(float(2**64))) + self.assertEqual(t.float32.encode(1.5), t.Float32(1.5)) + self.assertEqual(t.float64.encode(3), 3.0) + self.assertIs(type(t.float64.encode(3)), float) + for leaf in (t.float32, t.float64): + for bad in (True, "1", None, [1.0]): + self.assertIn("expected a float", self._refusal(lambda: leaf.decode(bad))) + self.assertIn("expected a float", self._refusal(lambda: leaf.encode(bad))) + self.assertIn("out of range", self._refusal(lambda: leaf.encode(2**64))) + self.assertIn("out of range", self._refusal(lambda: leaf.encode(-(2**63) - 1))) + + def test_list_and_array_write_lists_and_tuples_and_read_only_arrays(self) -> None: + self.assertEqual(t.list(t.int32).encode((1, 2)), [1, 2]) + self.assertEqual(t.array(t.string).decode(["a"]), ["a"]) + self.assertEqual(t.list(t.int32).encode([]), []) + self.assertIn("expected an array", self._refusal(lambda: t.list(t.int32).encode("12"))) + self.assertIn("expected an array", self._refusal(lambda: t.list(t.int32).decode((1,)))) + self.assertIn("expected an array", self._refusal(lambda: t.array(t.int32).decode(None))) + + def test_nullable_passes_none_and_otherwise_defers(self) -> None: + maybe = t.nullable(t.int32) + self.assertIsNone(maybe.encode(None)) + self.assertIsNone(maybe.decode(None)) + self.assertEqual((maybe.encode(0), maybe.decode(0)), (0, 0)) + self.assertIn("expected an int32", self._refusal(lambda: maybe.decode("x"))) + self.assertEqual((t.nullable(t.boolean).encode(False), t.nullable(t.string).decode("")), (False, "")) + + def test_a_field_codec_must_be_a_slot_codec(self) -> None: + self.assertIn("must be a SlotCodec", self._refusal(lambda: database_entry_field("a", 0, codec=lambda: t.int32))) # type: ignore[arg-type] + + +class LeafBoundaryTests(unittest.TestCase): + def _refusal(self, run) -> str: + with self.assertRaises(ValueError) as caught: + run() + return str(caught.exception) + + def test_float32_writes_a_subnormal_as_a_float_32_with_its_exact_bits(self) -> None: + document = _slot(t.float32) + for value, expected in ( + (1e-40, "91ca000116c2"), + (-1e-40, "91ca800116c2"), + (1.401298464324817e-45, "91ca00000001"), + (7e-46, "91ca00000000"), + (1.1754942106924411e-38, "91ca007fffff"), + ): + self.assertEqual(document.encode_payload({"v": value}).hex(), expected, repr(value)) + + def test_float_leaves_write_an_int_across_the_whole_64_bit_range_and_refuse_beyond_it(self) -> None: + for leaf in (t.float32, t.float64): + for ok in (3, 0, -(2**63), 2**64 - 1): + leaf.encode(ok) + for bad in (-(2**63) - 1, 2**64): + what = "a float32" if leaf is t.float32 else "a float64" + expected = f"expected {what}, found an integer out of range" + self.assertEqual(self._refusal(lambda: leaf.encode(bad)), expected) + self.assertEqual(self._refusal(lambda: leaf.decode(bad)), expected) + self.assertEqual(t.float32.encode(3), t.Float32(3.0)) + self.assertEqual(t.float32.encode(-(2**63)), t.Float32(-float(2**63))) + self.assertEqual(t.float64.encode(-(2**63)), -float(2**63)) + self.assertEqual(t.float64.encode(2**64 - 1), float(2**64)) + + def test_an_integer_past_2_to_53_rounds_to_float32_once_not_through_a_double(self) -> None: + # 2**53 + 2**29 + 1 is above the float32 tie, but rounding to a double first lands on the tie and rounds down. + value = 2**53 + 2**29 + 1 + self.assertEqual(t.float32.decode(value), float(2**53 + 2**30)) + self.assertEqual(t.float32.decode(-value), -float(2**53 + 2**30)) + self.assertEqual(t.float32.encode(value), t.Float32(float(2**53 + 2**30))) + self.assertEqual(t.float32.decode(2**53), float(2**53)) + self.assertEqual(t.float32.decode(-(2**53)), -float(2**53)) + + def test_the_kind_a_refusal_reports(self) -> None: + for value, kind in ((msgpack.ExtType(1, b""), "ext"), (object(), "other"), (t.Float32(1.0), "float"), + (bytearray(1), "bytes"), ((1,), "array"), ({}, "map"), (True, "boolean")): + self.assertEqual(self._refusal(lambda: t.int32.encode(value)), f"expected an int32, found {kind}") + + def test_definition_time_refusals_say_what_is_wrong(self) -> None: + self.assertEqual( + self._refusal(lambda: database_entry_field("a", 0, codec=object)), # type: ignore[arg-type] + "DatabaseEntry field codec must be a SlotCodec: a leaf from cultcache_py.leaves, or leaves.lazy", + ) + self.assertEqual( + self._refusal(lambda: define_union("Loose", {0: ("A", object)})), # type: ignore[dict-item] + "Union 'Loose' arm codecs must be SlotCodecs or None", + ) + self.assertEqual( + self._refusal(lambda: define_record_codec("R", [("a", 0)]).encode(None)), + "DatabaseEntry document type 'R': expected a record, found nil", + ) + + def test_value_objects_are_immutable_and_unnamed_by_default(self) -> None: + import dataclasses + + plain = t.SlotCodec(lambda v: v, lambda v: v) + self.assertIsNone(plain.type_name) + self.assertIs(plain.value_type, False) + self.assertIs(t.nullable(plain).value_type, False) + self.assertIs(t.list(plain).value_type, False) + self.assertIsNone(t.nullable(plain).type_name) + for frozen, field_name in ((plain, "encode"), (t.Float32(1.0), "value"), (t.nullable(t.int32), "encode")): + with self.assertRaises(dataclasses.FrozenInstanceError): + setattr(frozen, field_name, None) + + def test_a_definition_made_without_members_has_an_empty_catalog(self) -> None: + from cultcache_py.documents import DocumentDefinition + + self.assertEqual(DocumentDefinition(type="tests.bare").catalog_entry().members, ()) + + +class BytesAtTheDepthSeamTests(unittest.TestCase): + def test_bytes_bytearray_and_memoryview_leaves_at_depth_256_are_accepted_on_write_and_read(self) -> None: + blob = define_record_codec("Blob", [database_entry_field("data", 0, codec=t.list(t.bytes))]) + wrap = define_record_codec("Wrap", [database_entry_field("inner", 0, codec=t.nullable(t.lazy(lambda: deep_union)))]) + deep_union = define_union("Deep", {0: ("Wrap", wrap), 1: ("Blob", blob)}) + document = define_database_entry_type("tests.deep_bytes", [database_entry_field("root", 0, codec=deep_union)]) + for data in (b"\x01\x02", bytearray(b"\x01\x02"), memoryview(b"\x01\x02")): + value = UnionArm("Blob", {"data": [data]}) + for _ in range(126): + value = UnionArm("Wrap", {"inner": value}) + payload = document.encode_payload({"root": value}) + decoded = document.decode_payload(payload) + self.assertEqual(document.encode_payload(decoded), payload) + leaf = decoded["root"] + while leaf.name == "Wrap": + leaf = leaf.value["inner"] + self.assertEqual(leaf.value["data"], [b"\x01\x02"]) + + +class PackTreeTests(unittest.TestCase): + def test_a_float32_anywhere_in_the_tree_is_written_as_float_32_and_everything_else_as_packb_does(self) -> None: + tree = [t.Float32(1.5), {"k": t.Float32(0.1), "b": b"\x01", "s": "x", "n": None}, (t.Float32(2.0), [True, 7, 2.5])] + packer = msgpack.Packer(use_bin_type=True) + single = msgpack.Packer(use_bin_type=True, use_single_float=True) + expected = ( + packer.pack_array_header(3) + single.pack(1.5) + + packer.pack_map_header(4) + packer.pack("k") + single.pack(0.1) + packer.pack("b") + packer.pack(b"\x01") + + packer.pack("s") + packer.pack("x") + packer.pack("n") + packer.pack(None) + + packer.pack_array_header(2) + single.pack(2.0) + packer.pack([True, 7, 2.5]) + ) + self.assertEqual(_pack_tree(tree), expected) + self.assertEqual(_pack_tree(t.Float32(1.5)), bytes.fromhex("ca3fc00000")) + + def test_a_float32_overflow_is_infinity_and_a_value_nothing_can_pack_is_still_a_type_error(self) -> None: + self.assertEqual(_pack_tree([t.float32.encode(1e300)]), bytes.fromhex("91ca7f800000")) + self.assertEqual(_pack_tree([t.float32.encode(-1e300)]), bytes.fromhex("91caff800000")) + with self.assertRaises(TypeError): + _pack_tree([t.Float32(1.0), object()]) + with self.assertRaises(TypeError): + _pack_tree([object()]) + + def test_a_tree_with_no_float32_is_packb_unchanged(self) -> None: + tree = {"a": [1, 2.5, "x", b"y", None, True, {"b": -1}], "c": (3, 4)} + self.assertEqual(_pack_tree(tree), msgpack.packb(tree, use_bin_type=True)) + + def test_the_union_golden_scalar_direction_is_refused_as_the_reference_refuses_it(self) -> None: + from test_union_parity import node # the fixture with the C# golden's leaves + + with self.assertRaises(ValueError) as caught: + node.decode([1, ["hammer", 12]]) + self.assertEqual(str(caught.exception), "Union 'Node' arm 1: Text slot 1 (content): expected a string, found integer") + self.assertNotIn("hammer", str(caught.exception)) + self.assertEqual(node.decode([1, ["hammer", "x"]]), UnionArm("Text", {"id": "hammer", "content": "x"})) + + +PY_STORES = VECTORS / "py-store" +# slot -> the C# type name a wrong catalog gives it; the reference refuses each ("slot N changed type"). +WRONG_NAMES = {3: "System.Int64", 5: "System.Double", 7: "System.Int32", 14: "System.Double[]"} + + +def _python_authored_leaf_record() -> dict: + return { + "id": "py", "flag": False, "blob": bytearray([1, 255]), "i": -(2**31), "l": 2**63 - 1, "f": 0.1, "d": 1e-300, + "maybe_i": None, "tags": [], "names": ("\u00e9", "z"), "any": {"k": [1, True, None, 2.5, "s"], "n": -3}, + "nested": None, "items": [{"n": "one", "w": 2**53 + 2**29 + 1}, {"n": "two", "w": 1e-40}], + "shape": UnionArm("LeafCircle", {"r": 0.1}), "floats": [0.1, 3, -0.0, 1e39], "maybe_f": None, + } + + +def _write_store(path: Path, document, value: dict) -> None: + path.unlink(missing_ok=True) + cache = CultCache.builder().register_document_type(document).add_generic_store(SingleFileMessagePackBackingStore(path)).build() + cache.pull_all_backing_stores() + cache.put(document, value["id"], value) + + +def _wrong_catalog(document, slot: int): + import dataclasses + + good = tuple(document.catalog_entry().members) + return dataclasses.replace( + document, members=lambda: tuple(dataclasses.replace(m, type_name=WRONG_NAMES[slot]) if m.slot == slot else m for m in good) + ) + + +class PythonWrittenStoreVectorTests(unittest.TestCase): + """The stores under tests/vectors/numeric-leaves/py-store are written only by this class, with CULTCACHE_WRITE_VECTORS=1; + GameCult.Caching.Tests (PythonWrittenStoreTests) opens them with the C# reference and asserts every field.""" + + def test_the_committed_stores_are_what_the_definition_writes_and_read_back(self) -> None: + import os + import tempfile + + document = _leaf_record_document() + value = _python_authored_leaf_record() + if os.environ.get("CULTCACHE_WRITE_VECTORS"): + PY_STORES.mkdir(exist_ok=True) + _write_store(PY_STORES / "leaf-record.cc", document, value) + for slot in WRONG_NAMES: + _write_store(PY_STORES / f"wrong-slot-{slot}.cc", _wrong_catalog(document, slot), value) + with tempfile.TemporaryDirectory() as tmp: + fresh = Path(tmp) / "fresh.cc" + _write_store(fresh, document, value) + [committed] = SingleFileMessagePackBackingStore(PY_STORES / "leaf-record.cc").pull_all() + [again] = SingleFileMessagePackBackingStore(fresh).pull_all() + self.assertEqual(committed.payload, again.payload) + self.assertEqual(committed.catalog_entry.members, again.catalog_entry.members) + self.assertEqual(committed.payload, document.encode_payload(value)) + for slot, name in WRONG_NAMES.items(): + [wrong] = SingleFileMessagePackBackingStore(PY_STORES / f"wrong-slot-{slot}.cc").pull_all() + self.assertEqual(wrong.catalog_entry.members[slot].type_name, name) + self.assertEqual(wrong.payload, committed.payload) + + +class StoreRoundTripTests(unittest.TestCase): + def test_a_float32_slot_survives_a_single_file_store(self) -> None: + import tempfile + + document = define_database_entry_type( + "tests.store", [database_entry_field("id", 0, codec=t.string), database_entry_field("f", 1, codec=t.float32)], name="id" + ) + with tempfile.TemporaryDirectory() as tmp: + path = Path(tmp) / "store.cc" + cache = CultCache.builder().register_document_type(document).add_generic_store(SingleFileMessagePackBackingStore(path)).build() + cache.pull_all_backing_stores() + cache.put(document, "a", {"id": "a", "f": 0.1}) + [envelope] = SingleFileMessagePackBackingStore(path).pull_all() + self.assertEqual(envelope.payload, bytes.fromhex("92a161ca3dcccccd")) + self.assertEqual(envelope.catalog_entry.members[1].type_name, "System.Single") + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/cultcache-py/tests/test_union_parity.py b/packages/cultcache-py/tests/test_union_parity.py new file mode 100644 index 00000000..e6fe6c2f --- /dev/null +++ b/packages/cultcache-py/tests/test_union_parity.py @@ -0,0 +1,717 @@ +from __future__ import annotations + +import collections +import dataclasses +import shutil +import tempfile +import traceback +import types +import unittest +from pathlib import Path + +import msgpack + +from cultcache_py import ( + MAX_PAYLOAD_DEPTH, + MAX_SLOT_KEY, + CultCache, + CultCachePayloadDepthError, + DatabaseEntryField, + SlotCodec, + SingleFileMessagePackBackingStore, + UnionArm, + database_entry_field, + define_database_entry_type, + define_document_type, + define_record_codec, + define_union, + leaves as t, +) + +VECTORS = Path(__file__).resolve().parents[3] / "tests" / "vectors" / "union-parity" + +_GOLDEN = "GameCult.Caching.Tests.UnionParityVectorTests+" +_node = t.nullable(t.lazy(lambda: node)) +composition = define_record_codec( + "Composition", + [database_entry_field("name", 0, codec=t.string), database_entry_field("body", 1, codec=_node)], + type_name=_GOLDEN + "Composition", +) +box = define_record_codec( + "Box", + [ + database_entry_field("id", 0, codec=t.string), + database_entry_field("children", 1, codec=t.list(t.lazy(lambda: node))), + ], + type_name=_GOLDEN + "Box", +) +text = define_record_codec( + "Text", + [database_entry_field("id", 0, codec=t.string), database_entry_field("content", 1, codec=t.string)], + type_name=_GOLDEN + "Text", +) +use = define_record_codec( + "Use", + [ + database_entry_field("id", 0, codec=t.string), + database_entry_field("composition", 1, codec=composition), + database_entry_field("slots", 2, codec=t.list(t.nullable(t.lazy(lambda: node)))), + ], + type_name=_GOLDEN + "Use", +) +image = define_record_codec( + "Image", + [ + database_entry_field("id", 0, codec=t.string), + database_entry_field("uri", 1, codec=t.string), + database_entry_field("alt", 3, codec=t.string), + ], + type_name=_GOLDEN + "Image", +) +wrap = define_record_codec("Wrap", [database_entry_field("inner", 0, codec=_node)], type_name=_GOLDEN + "Wrap") +node = define_union( + "Node", + {0: ("Box", box), 1: ("Text", text), 2: ("Use", use), 5: ("Image", image), 6: ("Wrap", wrap)}, + type_name=_GOLDEN + "Node", +) +outcome = define_union( + "Outcome", + { + 0: ("Pending", define_record_codec("Pending", [database_entry_field("message", 0, codec=t.string)])), + 1: ("Completed", define_record_codec("Completed", [database_entry_field("source_version", 0, codec=t.int32)])), + 2: ("Denied", None), + -2147483648: ("Floor", None), + 2147483647: ("Ceiling", None), + }, + type_name=_GOLDEN + "Outcome", +) +tool = define_record_codec( + "Tool", + [database_entry_field("name", 0, codec=t.string), database_entry_field("uses", 1, codec=t.int32)], + type_name=_GOLDEN + "Tool", +) +part = define_record_codec( + "Part", + [database_entry_field("name", 0, codec=t.string), database_entry_field("count", 1, codec=t.int32)], + type_name=_GOLDEN + "Part", +) +gem = define_record_codec("Gem", [database_entry_field("name", 0, codec=t.string)], type_name=_GOLDEN + "Gem") +item = define_union("Item", {0: ("Gem", gem), 1: ("Tool", tool), 2: ("Part", part)}, type_name=_GOLDEN + "Item") +crafted = define_union("CraftedItem", {0: ("Tool", tool), 1: ("Part", part)}, type_name=_GOLDEN + "CraftedItem") + +surface_document = define_database_entry_type( + "tests.union_surface", + [ + database_entry_field("id", 0, codec=t.string), + database_entry_field("version", 1, codec=t.int32), + database_entry_field("root", 2, codec=_node), + database_entry_field("outcomes", 3, codec=t.list(outcome)), + database_entry_field("part", 4, codec=t.nullable(item)), + database_entry_field("crafted", 5, codec=t.nullable(crafted)), + database_entry_field("missing", 6, codec=_node), + ], + name="id", +) + + +def _surface_value() -> dict: + return { + "id": "surface", + "version": 3, + "root": UnionArm( + "Box", + { + "id": "root", + "children": [ + UnionArm("Text", {"id": "t1", "content": "hello"}), + UnionArm( + "Use", + { + "id": "u1", + "composition": { + "name": "comp", + "body": UnionArm( + "Box", + { + "id": "inner", + "children": [ + UnionArm("Text", {"id": "deep", "content": "x"}), + UnionArm("Image", {"id": "img", "uri": "uri://a", "alt": "alt"}), + ], + }, + ), + }, + "slots": [ + UnionArm("Text", {"id": "s1", "content": "slot"}), + None, + UnionArm("Box", {"id": "b2", "children": []}), + ], + }, + ), + UnionArm("Image", {"id": "i2", "uri": "uri://b", "alt": ""}), + ], + }, + ), + "outcomes": [ + UnionArm("Pending", {"message": "wait"}), + UnionArm("Completed", {"source_version": 7}), + UnionArm("Denied"), + ], + "part": UnionArm("Tool", {"name": "hammer", "uses": 12}), + "crafted": UnionArm("Part", {"name": "gear", "count": 4}), + "missing": None, + } + + +def _vector(name: str) -> bytes: + return (VECTORS / name).read_bytes() + + +class UnionSurfaceVectorTests(unittest.TestCase): + def test_surface_payload_decodes_to_the_value_and_re_encodes_byte_identical(self) -> None: + payload = _vector("union-surface.msgpack") + decoded = surface_document.decode_payload(payload) + self.assertEqual(decoded, _surface_value()) + self.assertEqual(surface_document.encode_payload(decoded), payload) + + def test_the_csharp_written_store_reads_and_the_cache_rewrites_the_same_payload(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + path = Path(tmp) / "union-surface.cc" + shutil.copyfile(VECTORS / "union-surface.cc", path) + cache = ( + CultCache.builder() + .register_document_type(surface_document) + .add_generic_store(SingleFileMessagePackBackingStore(path)) + .build() + ) + cache.pull_all_backing_stores() + self.assertEqual(cache.get(surface_document, "surface"), _surface_value()) + fresh = Path(tmp) / "fresh.cc" + writer = ( + CultCache.builder() + .register_document_type(surface_document) + .add_generic_store(SingleFileMessagePackBackingStore(fresh)) + .build() + ) + writer.pull_all_backing_stores() + writer.put(surface_document, "surface", _surface_value()) + [envelope] = SingleFileMessagePackBackingStore(fresh).pull_all() + self.assertEqual(envelope.payload, _vector("union-surface.msgpack")) + + def test_the_missing_slot_is_a_node_and_agrees_with_the_csharp_written_root(self) -> None: + payload = _vector("union-surface.msgpack") + slots = msgpack.unpackb(payload, raw=False) + slots[6] = slots[2] + decoded = surface_document.decode_payload(msgpack.packb(slots, use_bin_type=True)) + self.assertEqual(decoded["missing"], _surface_value()["root"]) + self.assertEqual(surface_document.encode_payload(decoded), msgpack.packb(slots, use_bin_type=True)) + with self.assertRaises(ValueError): + surface_document.encode_payload({**_surface_value(), "missing": UnionArm("Part", {"name": "gear", "count": 4})}) + + def test_the_store_vector_payload_equals_the_surface_payload(self) -> None: + [envelope] = SingleFileMessagePackBackingStore(VECTORS / "union-surface.cc").pull_all() + self.assertEqual(envelope.payload, _vector("union-surface.msgpack")) + + def test_every_outcome_in_the_manifest_is_held(self) -> None: + outcomes = msgpack.unpackb(_vector("outcomes.msgpack"), raw=False) + self.assertEqual(len(outcomes), 9) + refused = read_only = 0 + for file, outcome_kind, union, key, detail in outcomes: + payload = _vector(file) + if outcome_kind == "refused": + refused += 1 + with self.assertRaises(ValueError, msg=file) as caught: + surface_document.decode_payload(payload) + message = str(caught.exception) + self.assertIn(union, message, file) + if detail == "unknown-arm": + self.assertIn(f"arm key {key} ", message, file) + else: + self.assertEqual(detail, "arity") + self.assertIn("malformed", message, file) + else: + read_only += 1 + self.assertEqual(outcome_kind, "read-only", file) + self.assertEqual(surface_document.decode_payload(payload), _surface_value(), file) + self.assertEqual((refused, read_only), (5, 4)) + + +class UnionCodecRuleTests(unittest.TestCase): + CANARY = "canary-7f3a91" + + def test_a_union_refuses_nil_both_ways_unless_it_is_wrapped_in_nullable(self) -> None: + for refuse in (lambda: node.encode(None), lambda: node.decode(None)): + with self.assertRaises(ValueError) as caught: + refuse() + self.assertEqual(str(caught.exception), "Union 'Node': expected an arm, found nil") + maybe = t.nullable(node) + self.assertIsNone(maybe.encode(None)) + self.assertIsNone(maybe.decode(None)) + self.assertEqual(maybe.decode(maybe.encode(UnionArm("Text", {"id": "a", "content": "b"}))), UnionArm("Text", {"id": "a", "content": "b"})) + with self.assertRaises(ValueError) as write: + surface_document.encode_payload({**_surface_value(), "outcomes": [None]}) + self.assertEqual( + str(write.exception), + "tests.union_surface slot 3 (outcomes): element 0: Union 'Outcome': expected an arm, found nil", + ) + + def test_unit_arm_is_written_with_empty_slots_and_reads_back(self) -> None: + self.assertEqual(outcome.encode(UnionArm("Denied")), [2, []]) + self.assertEqual(outcome.decode([2, []]), UnionArm("Denied", None)) + + def test_unit_arm_refuses_a_value_to_carry(self) -> None: + with self.assertRaises(ValueError) as caught: + outcome.encode(UnionArm("Denied", {"message": self.CANARY})) + self.assertEqual(str(caught.exception), "Union 'Outcome' arm 2 is a unit arm and carries no value") + + def test_arm_keys_are_written_as_declared(self) -> None: + self.assertEqual(node.encode(UnionArm("Image", {"id": "a", "uri": "b", "alt": "c"})), [5, ["a", "b", None, "c"]]) + self.assertEqual(node.encode(UnionArm("Text", {"id": "a", "content": "b"})), [1, ["a", "b"]]) + + def test_encode_refuses_an_arm_the_union_does_not_declare_without_echoing_it(self) -> None: + with self.assertRaises(ValueError) as caught: + crafted.encode(UnionArm("Gem", {"name": self.CANARY})) + self.assertEqual( + str(caught.exception), "Union 'CraftedItem' was given a value that is not one of its arms" + ) + with self.assertRaises(ValueError): + node.encode({"id": "a"}) + + def test_unknown_key_names_the_union_the_key_and_the_declared_keys_never_the_payload(self) -> None: + with self.assertRaises(ValueError) as caught: + node.decode([4, [self.CANARY]]) + message = str(caught.exception) + self.assertEqual(message, "Union 'Node' does not declare arm key 4 (declared: 0, 1, 2, 5, 6)") + + def test_a_malformed_union_value_is_refused_without_echoing_it(self) -> None: + for raw in ( + [1], + [1, ["a"], "extra"], + [1, self.CANARY], + self.CANARY, + {"k": self.CANARY}, + [self.CANARY, []], + [True, []], + [1.0, []], + ): + with self.subTest(raw=type(raw).__name__): + with self.assertRaises(ValueError) as caught: + node.decode(raw) + message = str(caught.exception) + self.assertTrue(message.startswith("Union 'Node' value is malformed: "), message) + self.assertNotIn(self.CANARY, message) + + def test_extra_trailing_arm_slots_are_read(self) -> None: + self.assertEqual( + node.decode([1, ["a", "b", "extra"]]), + UnionArm("Text", {"id": "a", "content": "b"}), + ) + + def test_a_list_slot_requires_an_array_and_keeps_nil_elements_of_a_nullable_item(self) -> None: + slots = [UnionArm("Text", {"id": "a", "content": "b"}), None] + inner = {"name": "c", "body": None} + encoded = use.encode({"id": "u", "composition": inner, "slots": slots}) + self.assertEqual(encoded, ["u", ["c", None], [[1, ["a", "b"]], None]]) + self.assertEqual(use.decode(encoded)["slots"], slots) + with self.assertRaises(ValueError) as caught: + use.decode(["u", ["c", None], self.CANARY]) + self.assertEqual(str(caught.exception), "Use slot 2 (slots): expected an array, found string") + with self.assertRaises(ValueError) as nil_element: + box.decode(["b", [None]]) + self.assertEqual( + str(nil_element.exception), + "Box slot 1 (children): element 0: Union 'Node': expected an arm, found nil", + ) + + def test_a_list_of_nested_records_keeps_a_nil_element_as_csharp_writes_it(self) -> None: + row = define_record_codec( + "Row", [("id", 0), database_entry_field("cells", 1, codec=t.list(t.nullable(text)))] + ) + cells = [None, {"id": "c", "content": "x"}, None] + encoded = row.encode({"id": "r", "cells": cells}) + self.assertEqual(encoded, ["r", [None, ["c", "x"], None]]) + self.assertEqual(row.decode(encoded), {"id": "r", "cells": cells}) + + def test_a_unit_arm_with_extra_slots_is_read_past(self) -> None: + self.assertEqual(outcome.decode([2, ["extra"]]), UnionArm("Denied")) + + def test_union_arms_are_immutable_hashable_values(self) -> None: + arm = UnionArm("Denied") + with self.assertRaises(dataclasses.FrozenInstanceError): + arm.name = "Pending" # type: ignore[misc] + self.assertEqual(len({UnionArm("Denied"), UnionArm("Denied"), UnionArm("Pending", "wait")}), 2) + + def test_a_short_record_is_read_with_nil_for_the_slots_it_lacks_as_the_reference_reads_it(self) -> None: + self.assertEqual(node.decode([1, ["only-id"]]), UnionArm("Text", {"id": "only-id", "content": None})) + self.assertEqual(node.decode([0, ["sapphire"]]), UnionArm("Box", {"id": "sapphire", "children": None})) + + def test_definition_rules(self) -> None: + cases = [ + ("Empty", {}, "Union 'Empty' requires at least one arm"), + ("Dup", {0: ("A", None), 1: ("A", None)}, "Union 'Dup' has duplicate arm names"), + ("Wide", {2**31: ("A", None)}, "Union 'Wide' arm keys must be integers within Int32"), + ("Narrow", {-(2**31) - 1: ("A", None)}, "Union 'Narrow' arm keys must be integers within Int32"), + ("Flag", {True: ("A", None), "x": ("B", None)}, "Union 'Flag' arm keys must be integers within Int32"), + ] + for union_name, arms, expected in cases: + with self.subTest(union=union_name): + with self.assertRaises(ValueError) as caught: + define_union(union_name, arms) + self.assertEqual(str(caught.exception), expected) + for union_name, key in (("TrueKey", True), ("FalseKey", False)): + with self.assertRaises(ValueError) as caught: + define_union(union_name, {key: ("A", None)}) + self.assertEqual(str(caught.exception), f"Union {union_name!r} arm keys must be integers within Int32") + edge = define_union("Edge", {-(2**31): ("Low", None), -1: ("Negative", None), 2**31 - 1: ("High", None)}) + for arm_name, key in (("Low", -(2**31)), ("Negative", -1), ("High", 2**31 - 1)): + self.assertEqual(edge.encode(UnionArm(arm_name)), [key, []]) + self.assertEqual(edge.decode([key, []]), UnionArm(arm_name)) + for loose in (lambda: node, node.encode, "node", object): + with self.assertRaises(ValueError) as caught: + database_entry_field("loose", 1, codec=loose) # type: ignore[arg-type] + self.assertIn("must be a SlotCodec", str(caught.exception)) + with self.assertRaises(ValueError): + define_union("Loose", {0: ("A", lambda: node)}) # type: ignore[dict-item] + + +class RecordCodecTests(unittest.TestCase): + def test_a_default_fills_a_slot_past_the_payloads_end_and_a_callable_default_is_called(self) -> None: + record = define_record_codec( + "Defaulted", + [("id", 0), ("label", 1, "none"), ("tags", 2, list), ("plain", 3, 0)], + ) + self.assertEqual(record.decode(["a"]), {"id": "a", "label": "none", "tags": [], "plain": 0}) + self.assertEqual(record.decode(["a", "x"]), {"id": "a", "label": "x", "tags": [], "plain": 0}) + self.assertEqual(record.decode(["a", None, None, None]), {"id": "a", "label": None, "tags": None, "plain": None}) + self.assertEqual(record.decode(["a", "x", ["t"], 5]), {"id": "a", "label": "x", "tags": ["t"], "plain": 5}) + + def test_a_document_type_names_its_members_and_marks_the_name_and_index_slots(self) -> None: + document = define_database_entry_type( + "tests.members", + [("id", 0), ("source_version", 1), ("owner", 2)], + name="id", + indexes={"by_owner": "owner"}, + ) + members = {member.slot: member for member in document.catalog_entry().members} + self.assertEqual( + [members[slot].member_name for slot in (0, 1, 2)], ["Id", "SourceVersion", "Owner"] + ) + self.assertEqual([members[slot].is_name for slot in (0, 1, 2)], [True, False, False]) + self.assertEqual([members[slot].index_alias for slot in (0, 1, 2)], [None, None, "by_owner"]) + + def test_a_document_without_a_string_name_marks_no_member_as_the_name(self) -> None: + document = define_database_entry_type("tests.named", [("id", 0)], name=lambda value: value["id"]) + self.assertFalse(document.catalog_entry().members[0].is_name) + + def test_a_record_that_is_not_an_array_is_refused_naming_the_type_only(self) -> None: + for refuse in (lambda r: r.decode({"id": "canary-7f3a91"}), lambda r: r.decode("canary-7f3a91")): + record = define_record_codec("Plain", [("id", 0)]) + with self.assertRaises(ValueError) as caught: + refuse(record) + self.assertEqual(str(caught.exception), "DatabaseEntry document type 'Plain' expected a MessagePack array") + self.assertNotIn("canary-7f3a91", str(caught.exception)) + + def test_field_tuples_of_the_wrong_length_are_refused(self) -> None: + for fields in ([("id",)], [("id", 0, 1, 2)]): + with self.assertRaises(ValueError) as caught: + define_record_codec("Bad", fields) + self.assertEqual( + str(caught.exception), "DatabaseEntry field tuples must be (name, key) or (name, key, default)" + ) + self.assertEqual(define_record_codec("Pair", [("id", 0)]).decode(["a"]), {"id": "a"}) + self.assertEqual(define_record_codec("Triple", [("id", 1, "d")]).decode([None]), {"id": "d"}) + + def test_duplicate_and_empty_field_lists_are_refused_naming_the_type(self) -> None: + with self.assertRaises(ValueError) as caught: + define_record_codec("Twice", [("a", 0), ("b", 0)]) + self.assertEqual(str(caught.exception), "DatabaseEntry document type 'Twice' has duplicate field keys") + with self.assertRaises(ValueError) as empty: + define_record_codec("Nothing", []) + self.assertEqual(str(empty.exception), "DatabaseEntry document types require at least one field") + + def test_a_plain_field_helper_makes_an_untyped_slot(self) -> None: + plain = define_record_codec("Plain", [database_entry_field("id", 0), database_entry_field("label", 1)]) + self.assertEqual(plain.decode(plain.encode({"id": "a", "label": "b"})), {"id": "a", "label": "b"}) + self.assertEqual(plain.decode(["a"]), {"id": "a", "label": None}) + field = database_entry_field("id", 0) + self.assertIs(field.codec, t.any) + + def test_a_directly_constructed_field_requires_a_default_and_is_untyped(self) -> None: + with self.assertRaises(TypeError): + DatabaseEntryField(name="id", key=0) # type: ignore[call-arg] + field = DatabaseEntryField(name="id", key=0, default=dataclasses.MISSING) + self.assertIs(field.codec, t.any) + + def test_slot_codecs_and_fields_are_immutable(self) -> None: + with self.assertRaises(dataclasses.FrozenInstanceError): + node.encode = None # type: ignore[misc] + with self.assertRaises(dataclasses.FrozenInstanceError): + database_entry_field("id", 0).key = 1 # type: ignore[misc] + + def test_slot_keys_are_integers_within_zero_and_the_cap_however_the_field_is_made(self) -> None: + message = "DatabaseEntry field keys must be integers within 0..65535" + self.assertEqual(MAX_SLOT_KEY, 65535) + database_entry_field("zero", 0) + top = define_record_codec("Top", [("last", MAX_SLOT_KEY)]) + self.assertEqual(len(top.encode({"last": "x"})), MAX_SLOT_KEY + 1) + self.assertEqual(top.decode(top.encode({"last": "x"})), {"last": "x"}) + for make in ( + lambda key: database_entry_field("bad", key), + lambda key: DatabaseEntryField(name="bad", key=key, default=dataclasses.MISSING), + lambda key: define_record_codec("Bad", [("bad", key)]), + lambda key: define_record_codec("Bad", [("bad", key, "d")]), + ): + for key in (-1, MAX_SLOT_KEY + 1, 2**31, True, 1.0, "1"): + with self.subTest(key=key): + with self.assertRaises(ValueError) as caught: + make(key) + self.assertEqual(str(caught.exception), message) + + def test_slot_order_follows_keys_not_declaration_order(self) -> None: + record = define_record_codec("Ordered", [("b", 2), ("a", 0)]) + self.assertEqual(record.encode({"a": "x", "b": "y"}), ["x", None, "y"]) + + +CANARY = "CANARY-union-golden-4c2a" + + +def _wrap_chain(wraps: int, leaf: UnionArm) -> UnionArm: + value = leaf + for _ in range(wraps): + value = UnionArm("Wrap", {"inner": value}) + return value + + +class BoundsVectorTests(unittest.TestCase): + def test_every_bounds_outcome_is_held(self) -> None: + entries = msgpack.unpackb(_vector("bounds-outcomes.msgpack"), raw=False) + self.assertEqual(entries[0], ["limit", MAX_PAYLOAD_DEPTH]) + counts = {"accepted": 0, "refused": 0, "read-only": 0} + for file, outcome_kind, union, key, detail in entries[1:]: + counts[outcome_kind] += 1 + payload = _vector(file) + if outcome_kind == "accepted": + self.assertEqual( + surface_document.encode_payload(surface_document.decode_payload(payload)), _vector(detail), file + ) + elif outcome_kind == "read-only": + self.assertEqual(surface_document.decode_payload(payload), _surface_value(), file) + else: + with self.assertRaises(ValueError, msg=file) as caught: + surface_document.decode_payload(payload) + message = str(caught.exception) + self.assertNotIn(CANARY, message, file) + if detail == "depth": + self.assertIsInstance(caught.exception, CultCachePayloadDepthError, file) + self.assertIn(surface_document.type, message, file) + self.assertIn("nests 257 containers deep", message, file) + self.assertIn("the limit is 256", message, file) + self.assertIn("refused on read", message, file) + continue + self.assertNotIsInstance(caught.exception, CultCachePayloadDepthError, file) + self.assertIn(f"Union '{union}' ", message, file) + if detail == "key-out-of-range": + self.assertIn("outside Int32", message, file) + self.assertNotIn("does not declare", message, file) + elif detail == "key-not-integer": + self.assertIn("non-integer", message, file) + else: + self.assertEqual(detail, "nil-slots") + self.assertIn(f"arm {key} has nil slots", message, file) + self.assertEqual(counts, {"accepted": 4, "refused": 7, "read-only": 1}) + + def test_the_value_at_the_limit_writes_the_vector_and_the_value_past_it_is_refused_on_write(self) -> None: + at_limit = {**_surface_value(), "root": _wrap_chain(126, UnionArm("Box", {"id": "leaf", "children": []}))} + self.assertEqual(surface_document.encode_payload(at_limit), _vector("depth-at-limit.msgpack")) + past = {**_surface_value(), "root": _wrap_chain(127, UnionArm("Text", {"id": "leaf", "content": CANARY}))} + with self.assertRaises(CultCachePayloadDepthError) as caught: + surface_document.encode_payload(past) + message = str(caught.exception) + self.assertEqual((caught.exception.depth, caught.exception.limit), (257, 256)) + self.assertIn("the limit is 256", message) + self.assertIn("refused on write", message) + self.assertNotIn(CANARY, message) + + def test_a_cache_put_of_the_value_past_the_limit_refuses_and_stores_nothing(self) -> None: + past = {**_surface_value(), "root": _wrap_chain(127, UnionArm("Box", {"id": "leaf", "children": []}))} + with tempfile.TemporaryDirectory() as tmp: + path = Path(tmp) / "store.cc" + cache = ( + CultCache.builder() + .register_document_type(surface_document) + .add_generic_store(SingleFileMessagePackBackingStore(path)) + .build() + ) + with self.assertRaises(CultCachePayloadDepthError): + cache.put(surface_document, "surface", past) + self.assertIsNone(cache.get(surface_document, "surface")) + + def test_a_payload_beyond_the_c_unpackers_own_stack_is_the_depth_refusal(self) -> None: + deep = b"\x91" * 2000 + b"\xc0" + with self.assertRaises(CultCachePayloadDepthError) as caught: + surface_document.decode_payload(deep) + self.assertEqual(str(caught.exception).count("refused on read"), 1) + huge = b"\x98" + b"\xc0" * 7 + b"\x91" * 100000 + b"\xc0" + with self.assertRaises(CultCachePayloadDepthError): + surface_document.decode_payload(huge) + + def test_a_deep_value_is_refused_by_the_depth_error_not_a_recursion_error(self) -> None: + tree = define_document_type("tests.deep_tree", encode=lambda value: value) + with self.assertRaises(CultCachePayloadDepthError) as caught: + tree.encode_payload(_nest(5000)) + self.assertIn("refused on write", str(caught.exception)) + document = define_document_type("tests.json_tree") + with self.assertRaises(CultCachePayloadDepthError) as read: + document.decode_payload(b"[" * 300 + b"]" * 300) + self.assertIn("refused on read", str(read.exception)) + + def test_a_codec_that_exhausts_the_interpreter_stack_keeps_its_own_recursion_error_on_each_side(self) -> None: + def boom(value: object) -> object: + return boom(value) + + document = define_document_type("tests.boom", encode=boom, decode=boom) + for run in (lambda: document.encode_payload("x"), lambda: document.decode_payload(b'"x"')): + try: + run() + except RecursionError as caught: + self.assertNotIsInstance(caught, CultCachePayloadDepthError) + self.assertIn("boom", [frame.name for frame in traceback.extract_tb(caught.__traceback__)]) + else: + self.fail("the codec's RecursionError was swallowed") + with self.assertRaises(CultCachePayloadDepthError) as stack: + surface_document.decode_payload(bytes([0x91]) * 2000 + bytes([0xC0])) + self.assertEqual( + str(stack.exception), + "tests.union_surface payload nests 257 containers deep; the limit is 256 (refused on read).", + ) + + def test_a_json_payload_past_the_interpreters_own_stack_keeps_the_decoders_recursion_error(self) -> None: + document = define_document_type("tests.json_tree") + with self.assertRaises(RecursionError) as caught: + document.decode_payload(b"[" * 100000) + self.assertNotIsInstance(caught.exception, CultCachePayloadDepthError) + + def test_a_refusal_reports_the_depth_where_the_walk_stopped_whatever_the_payloads_real_depth(self) -> None: + document = define_document_type("tests.json_tree", encode=lambda value: value) + for depth in (257, 300, 900): + with self.assertRaises(CultCachePayloadDepthError) as write: + document.encode_payload(_nest(depth)) + self.assertEqual((write.exception.depth, write.exception.limit), (257, 256), depth) + with self.assertRaises(CultCachePayloadDepthError) as read: + document.decode_payload(b"[" * depth + b"]" * depth) + self.assertEqual((read.exception.depth, read.exception.limit), (257, 256), depth) + + def test_the_validator_sees_the_value_on_write_and_the_decoded_value_on_read(self) -> None: + seen: list[object] = [] + document = define_document_type("tests.validated", validate=seen.append) + document.decode_payload(document.encode_payload({"a": 1})) + self.assertEqual(seen, [{"a": 1}, {"a": 1}]) + + def test_a_cycle_is_refused_as_depth(self) -> None: + loop: list = [] + loop.append(loop) + document = define_document_type("tests.cycle", encode=lambda value: value) + with self.assertRaises(CultCachePayloadDepthError): + document.encode_payload(loop) + + +def _nest(depth: int, mixed: bool = False) -> object: + value: object = "leaf" + for level in range(depth): + value = {"k": value} if mixed and level % 2 == 0 else [value] + return value + + +def _as_tuple(tree: object) -> object: + return tuple(_as_tuple(child) for child in tree) if isinstance(tree, list) else tree + + +class PayloadDepthRuleTests(unittest.TestCase): + """The nesting rule at its seam, on definitions that are not unions: the same routine serves any payload codec.""" + + def test_the_limit_is_256_and_depth_256_is_accepted_on_read_and_write_while_257_is_refused(self) -> None: + self.assertEqual(MAX_PAYLOAD_DEPTH, 256) + document = define_document_type("tests.json_tree", encode=lambda value: value) + for mixed in (False, True): + at_limit = _nest(256, mixed) + self.assertEqual(document.decode_payload(document.encode_payload(at_limit)), at_limit) + past = _nest(257, mixed) + with self.assertRaises(CultCachePayloadDepthError): + document.encode_payload(past) + with self.assertRaises(CultCachePayloadDepthError): + document.decode_payload(document.payload_encoder(past)) + + def test_a_tuple_and_a_container_dict_key_count_as_containers(self) -> None: + document = define_document_type("tests.tuple_tree", encode=lambda value: value, payload_encoder=lambda tree: b"ok") + self.assertEqual(document.encode_payload(_as_tuple(_nest(256))), b"ok") + with self.assertRaises(CultCachePayloadDepthError): + document.encode_payload(_as_tuple(_nest(257))) + self.assertEqual(document.encode_payload({_as_tuple(_nest(255)): 1}), b"ok") + with self.assertRaises(CultCachePayloadDepthError): + document.encode_payload({_as_tuple(_nest(256)): 1}) + + def test_every_mapping_sequence_and_set_counts_not_only_list_tuple_and_dict(self) -> None: + wrappers = { + "deque": lambda inner: collections.deque([inner]), + "mappingproxy": lambda inner: types.MappingProxyType({"k": inner}), + "frozenset": lambda inner: frozenset([inner]), + "userlist": lambda inner: collections.UserList([inner]), + } + for name, wrap in wrappers.items(): + document = define_document_type(f"tests.{name}", encode=lambda value: value, payload_encoder=lambda tree: b"ok") + at_limit: object = "leaf" + for _ in range(256): + at_limit = wrap(at_limit) + self.assertEqual(document.encode_payload(at_limit), b"ok", name) + with self.assertRaises(CultCachePayloadDepthError, msg=name): + document.encode_payload(wrap(at_limit)) + decoding = define_document_type(f"tests.{name}.read", payload_decoder=lambda payload, w=wrap: w(at_limit)) + with self.assertRaises(CultCachePayloadDepthError, msg=name): + decoding.decode_payload(b"x") + + def test_text_and_bytes_are_leaves_however_long(self) -> None: + document = define_document_type("tests.leaves", encode=lambda value: value, payload_encoder=lambda tree: b"ok") + self.assertEqual(document.encode_payload([["x" * 100000, b"y" * 100000, bytearray(5), memoryview(b"z")]]), b"ok") + + def test_a_scalar_payload_has_no_depth(self) -> None: + document = define_document_type("tests.scalar", encode=lambda value: value) + for scalar in ("x", 5, None): + self.assertEqual(document.decode_payload(document.encode_payload(scalar)), scalar) + + def test_the_refusal_names_the_type_the_depth_and_the_limit_and_never_the_payload(self) -> None: + document = define_document_type("tests.json_tree", encode=lambda value: value) + value: object = CANARY + for _ in range(257): + value = [value] + with self.assertRaises(CultCachePayloadDepthError) as caught: + document.encode_payload(value) + self.assertEqual( + str(caught.exception), + "tests.json_tree payload nests 257 containers deep; the limit is 256 (refused on write).", + ) + self.assertIsInstance(caught.exception, ValueError) + + +class UnionDecodeBoundsTests(unittest.TestCase): + def test_the_arm_key_refusals_name_the_union_and_say_what_is_wrong(self) -> None: + cases = [ + ([2**31, []], "Union 'Node' value is malformed: the arm key is outside Int32"), + ([-(2**31) - 1, []], "Union 'Node' value is malformed: the arm key is outside Int32"), + ([1.0, []], "Union 'Node' value is malformed: the arm key is non-integer"), + ([True, []], "Union 'Node' value is malformed: the arm key is non-integer"), + ([1, None], "Union 'Node' arm 1 has nil slots"), + ([1, CANARY], "Union 'Node' value is malformed: expected [armKey, [armSlots]]"), + ] + for raw, expected in cases: + with self.subTest(key=raw[0], slots=type(raw[1]).__name__): + with self.assertRaises(ValueError) as caught: + node.decode(raw) + self.assertEqual(str(caught.exception), expected) + + def test_the_ends_of_the_int32_key_domain_are_unit_arms_that_read_and_write(self) -> None: + self.assertEqual(outcome.decode([-(2**31), []]), UnionArm("Floor")) + self.assertEqual(outcome.encode(UnionArm("Ceiling")), [2**31 - 1, []]) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/cultcache-rs/Cargo.toml b/packages/cultcache-rs/Cargo.toml index 23d53801..9610aeb6 100644 --- a/packages/cultcache-rs/Cargo.toml +++ b/packages/cultcache-rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cultcache-rs" -version = "0.2.0" +version = "0.3.0" edition = "2024" license = "MIT" publish = false @@ -22,6 +22,8 @@ redb = "4.1.0" serde = { version = "1", features = ["derive"] } serde_bytes = "0.11" serde_json = "1" +serde_stacker = "0.1.14" +stacker = "0.1.25" uuid = { version = "1", features = ["v4"] } [dev-dependencies] diff --git a/packages/cultcache-rs/README.md b/packages/cultcache-rs/README.md index 1ad01eb0..afae7285 100644 --- a/packages/cultcache-rs/README.md +++ b/packages/cultcache-rs/README.md @@ -184,6 +184,49 @@ without pretending Rust has runtime reflection hiding under the floorboards. - `load_soa` - `SingleFileMessagePackBackingStore` +## Unions + +A union that crosses runtimes is written `[armKey, [armSlots...]]`, the shape the C# reference writes for +`[Union(key, type)]`. Derive `CultUnion` on an enum: every variant carries `#[cultcache(key = N)]` and is a unit +(`[N, []]`) or a newtype over a `#[derive(CultSlots)]` struct, which is a `DatabaseEntry`'s slot array without the +entry consts (a `String` or an `Option` is not an arm, and is a compile error). An arm key is the reference's Int32, negatives included, and is given once. A key the enum does not declare is a decode error naming the enum and the declared keys, and never +quoting the payload. A null union is `Option`. Plain serde enums are untouched and keep their bytes. + +```rust +use cultcache_rs::{CultSlots, CultUnion}; + +#[derive(Clone, Debug, PartialEq, CultUnion)] +enum Node { + #[cultcache(key = 0)] + Box(BoxArm), + #[cultcache(key = 1)] + Text(TextArm), + #[cultcache(key = 5)] + Spacer, // a unit arm: [5, []] +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct BoxArm { + #[cultcache(key = 0)] + id: String, + #[cultcache(key = 1)] + children: Vec, // recursive +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct TextArm { + #[cultcache(key = 0)] + id: String, + #[cultcache(key = 1)] + content: String, +} + +let tree = Node::Box(BoxArm { id: "root".into(), children: vec![Node::Spacer] }); +let bytes = rmp_serde::to_vec(&tree)?; +assert_eq!(rmp_serde::from_slice::(&bytes)?, tree); +# Ok::<(), Box>(()) +``` + ## Structure Of Arrays The C# CultCache hot path exposes CPU-local SoA scans as: @@ -293,6 +336,61 @@ writes. That protects ordinary multi-process access to the same file. It is still not a multi-master replication protocol, and it is not a substitute for a coordinator when higher-level write ordering matters. +A write that fails part way, for example on a full disk, removes its staging +file and leaves the store as it was. A read that fails tells you why through +the error chain: + +```rust +use cultcache_rs::{CacheBackingStore, CultCacheStoreUnreadable, CultCacheStoreUnreadableKind, SingleFileMessagePackBackingStore}; + +let store = SingleFileMessagePackBackingStore::new("cache.cc"); +if let Err(error) = store.pull_all() { + match error.downcast_ref::().map(|unreadable| unreadable.kind) { + // The bytes were read and are not a store: truncated, garbled, or invalid. + Some(CultCacheStoreUnreadableKind::Undecodable) => {} + // The header names a format this runtime does not read, such as a newer one. + Some(CultCacheStoreUnreadableKind::UnsupportedFormat) => {} + // The bytes could not be read at all: a std::io::Error is in the chain. + _ => {} + } +} +``` + +An I/O failure never carries `CultCacheStoreUnreadable`, and the chain under +`CultCacheStoreUnreadable` never holds a `std::io::Error`. + +Only a store file that does not exist (`std::io::ErrorKind::NotFound`) reads as +an empty store. Any other failure to reach it, such as a symlink loop, a file +where a parent directory should be, or a missing permission, is an I/O error. +A store file that exists and holds zero bytes is `Undecodable`: no CultCache +writer leaves one. A symbolic link whose target is gone is not a missing store: +reading it is an I/O error, so a read-then-write (`push`, `delete`, the exchanges) +fails before writing. Writes do not yet follow links: a write through a live link, +and a `push_all` through a dangling one, replace the link with a regular file and +leave its target alone. A refusal names no +value read from the file; it names a record only by its key and schema id, and +a header only when it has the shape `cultcache.store.v`. + +A write that fails says what it left on disk: + +```rust +use cultcache_rs::{CultCacheStoreWriteFailed, CultCacheStoreWriteFailedKind}; + +fn outcome(error: &anyhow::Error) { + match error.downcast_ref::().map(|failed| failed.kind) { + // The entries cannot be stored; retrying them fails the same way. + Some(CultCacheStoreWriteFailedKind::Rejected) => {} + // Staging, fsync or rename failed: the store file holds what it held before, + // and a retry may succeed once the fault (a full disk, say) clears. + Some(CultCacheStoreWriteFailedKind::NotReplaced) => {} + // The rename landed and the directory sync failed: the new snapshot is in + // place but may not survive a crash. + Some(CultCacheStoreWriteFailedKind::ReplacedNotDurable) => {} + _ => {} + } +} +``` + ## Near-Term Ergonomic Improvements 1. **Derive macro** @@ -358,6 +456,39 @@ That is the Rust version of the original trick: The derive/registry work should preserve that shape. Its job is to remove manual registration ceremony, not to loosen the closed-world boundary. +Payload nesting is bounded at 256 MessagePack containers, checked before any +recursion; past the bound the refusal is a typed `PayloadTooDeep`. Typed decode +of stored bytes then grows its stack: the decoder checks the remaining stack +at entry and `serde_stacker` checks it at every container, moving +onto a fresh segment whenever less than 512 KiB remains, so a payload inside the +bound decodes on a small thread instead of aborting the process. Envelope and +store reads (single-file, redb, v1 snapshots) use the same grown decoder and +keep accepting and refusing what they did, without the payload walk. + +The guarantee holds for records the derives produce. `MAX_RECORD_INLINE_BYTES` +(16 KiB) is the largest `size_of` a `DatabaseEntry`, `CultSlots` or `CultUnion` +record may have, and the derives refuse a larger one at compile time: put its +large data behind a `Vec` or a `Box`. A field of a type the derives did not +produce that is larger than that, behind a `Box` or `Vec`, is outside the +guarantee. The decoder's own frames have a fixed floor that no payload changes: at the bound a thread decodes a record of +this size from about 56 KiB in a release build and 72 KiB in a debug build for a caller that only tests the result +(`is_ok`), plus the caller's own frames. The figure depends on how the caller holds the result: one that moves the +record out holds a second copy and needs more (about 104 KiB in debug). Stack growth was verified on +x86_64-pc-windows-msvc by hand (`decode_stack`, revision 10a39dac, 13 tests, debug and release); a `stacker` bump or a change +to the stack-size tests repeats it. +The crate does not +build for wasm32 (`fs2`), and no wasm behaviour is claimed. + +### Build dependencies + +Stack growth adds these crates to every consumer's build, and a C toolchain +(`psm`, `stacker`). On all targets: `serde_stacker` 0.1.14, `stacker` 0.1.25, +`psm` 0.1.32, `cc` 1.8.0, `find-msvc-tools` 0.1.14, `shlex` 2.0.1 (MIT OR +Apache-2.0), `object` 0.39.1 (Apache-2.0 OR MIT) and `ar_archive_writer` 0.5.3 +(Apache-2.0 WITH LLVM-exception, build-only). On `x86_64-pc-windows-msvc` also +`libc` 0.2.190 and `windows-sys` 0.61.2 (MIT OR Apache-2.0), beside the 0.59 the +crate uses itself. + ## License Private GameCult infrastructure for now. Public packaging can wait until the diff --git a/packages/cultcache-rs/cultcache-rs-derive/Cargo.toml b/packages/cultcache-rs/cultcache-rs-derive/Cargo.toml index 74d52a4f..de299ff7 100644 --- a/packages/cultcache-rs/cultcache-rs-derive/Cargo.toml +++ b/packages/cultcache-rs/cultcache-rs-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cultcache-rs-derive" -version = "0.1.0" +version = "0.2.0" edition = "2024" publish = false diff --git a/packages/cultcache-rs/cultcache-rs-derive/src/lib.rs b/packages/cultcache-rs/cultcache-rs-derive/src/lib.rs index 7d613194..65e41b92 100644 --- a/packages/cultcache-rs/cultcache-rs-derive/src/lib.rs +++ b/packages/cultcache-rs/cultcache-rs-derive/src/lib.rs @@ -12,6 +12,13 @@ use syn::parse_macro_input; #[proc_macro_derive(DatabaseEntry, attributes(cultcache))] pub fn derive_database_entry(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); + match database_entry_codec(input) { + Ok(tokens) => tokens.into(), + Err(error) => error.to_compile_error().into(), + } +} + +fn database_entry_codec(input: DeriveInput) -> syn::Result { let ident = input.ident.clone(); let mut entry_type: Option = None; let mut schema_name: Option = None; @@ -23,55 +30,105 @@ pub fn derive_database_entry(input: TokenStream) -> TokenStream { { let parse_result = attribute.parse_nested_meta(|meta| { if meta.path.is_ident("type") { + once(&entry_type, &meta, "type")?; entry_type = Some(meta.value()?.parse()?); Ok(()) } else if meta.path.is_ident("schema") { + once(&schema_name, &meta, "schema")?; schema_name = Some(meta.value()?.parse()?); Ok(()) } else { Err(meta.error("unsupported cultcache attribute")) } }); - if let Err(error) = parse_result { - return error.to_compile_error().into(); - } + parse_result?; } let Some(entry_type) = entry_type else { - return syn::Error::new_spanned( + return Err(syn::Error::new_spanned( ident, "DatabaseEntry derive requires #[cultcache(type = \"...\")]", - ) - .to_compile_error() - .into(); + )); }; let schema_name = schema_name.unwrap_or_else(|| LitStr::new(&ident.to_string(), ident.span())); - let fields = match input.data { + let slots = named_slots(input.data, &ident, "DatabaseEntry")?; + let codec = slot_codec(&ident, &slots); + + Ok(quote! { + impl ::cultcache_rs::DatabaseEntry for #ident { + const TYPE: &'static str = #entry_type; + const SCHEMA_NAME: &'static str = #schema_name; + } + + #codec + }) +} + +/// A named struct whose fields carry `#[cultcache(key = N)]`: the same positional +/// array a `DatabaseEntry` is, without the entry consts. The payload of a union arm, +/// or any nested record that crosses runtimes. +#[proc_macro_derive(CultSlots, attributes(cultcache))] +pub fn derive_cult_slots(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + match cult_slots_codec(input) { + Ok(tokens) => tokens.into(), + Err(error) => error.to_compile_error().into(), + } +} + +fn cult_slots_codec(input: DeriveInput) -> syn::Result { + let ident = input.ident.clone(); + if !input.generics.params.is_empty() { + return Err(syn::Error::new_spanned(ident, "CultSlots derive does not support generics")); + } + let slots = named_slots(input.data, &ident, "CultSlots")?; + Ok(slot_codec(&ident, &slots)) +} + +/// An enum written as `[key, armSlots]`. Every variant carries `#[cultcache(key = N)]` +/// and is a unit (`[N, []]`) or a newtype over a type that serializes as an array. +/// A key the enum does not declare is a decode error; there is no catch-all arm. +#[proc_macro_derive(CultUnion, attributes(cultcache))] +pub fn derive_cult_union(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + match union_codec(input) { + Ok(tokens) => tokens.into(), + Err(error) => error.to_compile_error().into(), + } +} + +/// The largest array16 length: a slot record is written as a dense array, so a key above it would +/// make every encode allocate and write an unbounded run of nils. Every runtime and the C# catalog +/// refuse the same domain. +const MAX_SLOT_KEY: usize = 65535; + +fn named_slots(data: Data, ident: &syn::Ident, owner: &str) -> syn::Result> { + let fields = match data { Data::Struct(data) => match data.fields { Fields::Named(fields) => fields.named, _ => { - return syn::Error::new_spanned( + return Err(syn::Error::new_spanned( ident, - "DatabaseEntry derive requires a named struct", - ) - .to_compile_error() - .into(); + format!("{owner} derive requires a named struct"), + )); } }, _ => { - return syn::Error::new_spanned(ident, "DatabaseEntry derive requires a struct") - .to_compile_error() - .into(); + return Err(syn::Error::new_spanned( + ident, + format!("{owner} derive requires a struct"), + )); } }; let mut slots: Vec = Vec::new(); for field in fields { let Some(field_ident) = field.ident else { - return syn::Error::new_spanned(field.ty, "DatabaseEntry derive requires named fields") - .to_compile_error() - .into(); + return Err(syn::Error::new_spanned( + field.ty, + format!("{owner} derive requires named fields"), + )); }; let mut key: Option = None; let mut default = false; @@ -81,10 +138,18 @@ pub fn derive_database_entry(input: TokenStream) -> TokenStream { .iter() .filter(|attr| attr.path().is_ident("cultcache")) { - let parse_result = attribute.parse_nested_meta(|meta| { + attribute.parse_nested_meta(|meta| { if meta.path.is_ident("key") { + once(&key, &meta, "key")?; let value: LitInt = meta.value()?.parse()?; - key = Some(value.base10_parse()?); + let slot: usize = value.base10_parse()?; + if slot > MAX_SLOT_KEY { + return Err(syn::Error::new_spanned( + &value, + format!("{owner} slot key {slot} is outside 0..={MAX_SLOT_KEY}"), + )); + } + key = Some(slot); Ok(()) } else if meta.path.is_ident("default") { default = true; @@ -95,26 +160,19 @@ pub fn derive_database_entry(input: TokenStream) -> TokenStream { } else { Err(meta.error("unsupported field cultcache attribute")) } - }); - if let Err(error) = parse_result { - return error.to_compile_error().into(); - } + })?; } let Some(key) = key else { - return syn::Error::new_spanned( + return Err(syn::Error::new_spanned( field_ident, - "DatabaseEntry fields require #[cultcache(key = N)]", - ) - .to_compile_error() - .into(); + format!("{owner} fields require #[cultcache(key = N)]"), + )); }; if slots.iter().any(|slot| slot.key == key) { - return syn::Error::new_spanned( + return Err(syn::Error::new_spanned( field_ident, - format!("duplicate DatabaseEntry slot {key}"), - ) - .to_compile_error() - .into(); + format!("duplicate {owner} slot {key}"), + )); } slots.push(CultCacheSlot { key, @@ -125,6 +183,12 @@ pub fn derive_database_entry(input: TokenStream) -> TokenStream { }); } slots.sort_by_key(|slot| slot.key); + Ok(slots) +} + +/// The one slot generator: Serialize as a positional array with nil gaps, Deserialize +/// by slot with the `default` and `bytes` attributes. +fn slot_codec(ident: &syn::Ident, slots: &[CultCacheSlot]) -> proc_macro2::TokenStream { let max_slot = slots.iter().map(|slot| slot.key).max().unwrap_or(0); let serialize_elements = (0..=max_slot).map(|slot| { @@ -211,15 +275,19 @@ pub fn derive_database_entry(input: TokenStream) -> TokenStream { }); quote! { - impl ::cultcache_rs::DatabaseEntry for #ident { - const TYPE: &'static str = #entry_type; - const SCHEMA_NAME: &'static str = #schema_name; + const _: () = ::core::assert!( + ::core::mem::size_of::<#ident>() <= ::cultcache_rs::MAX_RECORD_INLINE_BYTES, + "a CultCache record is at most cultcache_rs::MAX_RECORD_INLINE_BYTES bytes inline; box its largest slot" + ); + + impl ::cultcache_rs::SlotRecord for #ident { + fn __slots_array() {} } impl ::serde::Serialize for #ident { - fn serialize(&self, serializer: S) -> ::std::result::Result + fn serialize<__S>(&self, serializer: __S) -> ::std::result::Result<__S::Ok, __S::Error> where - S: ::serde::Serializer, + __S: ::serde::Serializer, { use ::serde::ser::SerializeTuple; let mut tuple = serializer.serialize_tuple(#max_slot + 1)?; @@ -229,22 +297,22 @@ pub fn derive_database_entry(input: TokenStream) -> TokenStream { } impl<'de> ::serde::Deserialize<'de> for #ident { - fn deserialize(deserializer: D) -> ::std::result::Result + fn deserialize<__D>(deserializer: __D) -> ::std::result::Result where - D: ::serde::Deserializer<'de>, + __D: ::serde::Deserializer<'de>, { - struct CultCacheVisitor; + struct __CultCacheVisitor; - impl<'de> ::serde::de::Visitor<'de> for CultCacheVisitor { + impl<'de> ::serde::de::Visitor<'de> for __CultCacheVisitor { type Value = #ident; fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { formatter.write_str(concat!("a CultCache array for ", stringify!(#ident))) } - fn visit_seq(self, mut seq: A) -> ::std::result::Result + fn visit_seq<__A>(self, mut seq: __A) -> ::std::result::Result where - A: ::serde::de::SeqAccess<'de>, + __A: ::serde::de::SeqAccess<'de>, { #(#option_declarations)* let mut index = 0usize; @@ -262,11 +330,35 @@ pub fn derive_database_entry(input: TokenStream) -> TokenStream { } } - deserializer.deserialize_tuple(#max_slot + 1, CultCacheVisitor) + deserializer.deserialize_tuple(#max_slot + 1, __CultCacheVisitor) } } } - .into() +} + +/// An attribute names each thing once; a second `key = N` would silently win otherwise. +fn once(seen: &Option, meta: &syn::meta::ParseNestedMeta, name: &str) -> syn::Result<()> { + if seen.is_some() { + return Err(meta.error(format!("repeated `{name}`: #[cultcache({name} = ...)] is given once"))); + } + Ok(()) +} + +/// An arm key is the reference's Int32, negatives included: `key = 5` or `key = -1`. +fn arm_key(meta: &syn::meta::ParseNestedMeta) -> syn::Result { + let expr: syn::Expr = meta.value()?.parse()?; + let (negative, literal) = match expr { + syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Int(literal), .. }) => (false, literal), + syn::Expr::Unary(syn::ExprUnary { op: syn::UnOp::Neg(_), expr, .. }) => match *expr { + syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Int(literal), .. }) => (true, literal), + other => return Err(syn::Error::new_spanned(other, "a CultUnion arm key is an integer literal")), + }, + other => return Err(syn::Error::new_spanned(other, "a CultUnion arm key is an integer literal")), + }; + let magnitude: i128 = literal.base10_parse()?; + let value = if negative { -magnitude } else { magnitude }; + i32::try_from(value) + .map_err(|_| syn::Error::new_spanned(&literal, format!("CultUnion arm key {value} is outside Int32"))) } struct CultCacheSlot { @@ -276,3 +368,478 @@ struct CultCacheSlot { default: bool, bytes: bool, } + +fn union_codec(input: DeriveInput) -> syn::Result { + let ident = input.ident.clone(); + if !input.generics.params.is_empty() { + return Err(syn::Error::new_spanned( + ident, + "CultUnion derive does not support generics", + )); + } + let Data::Enum(data) = input.data else { + return Err(syn::Error::new_spanned(ident, "CultUnion derive requires an enum")); + }; + if data.variants.is_empty() { + return Err(syn::Error::new_spanned(ident, "CultUnion derive requires at least one variant")); + } + + struct Arm { + key: i32, + ident: syn::Ident, + payload: Option, + } + let mut arms: Vec = Vec::new(); + for variant in data.variants { + let mut key: Option = None; + for attribute in variant + .attrs + .iter() + .filter(|attr| attr.path().is_ident("cultcache")) + { + attribute.parse_nested_meta(|meta| { + if meta.path.is_ident("key") { + once(&key, &meta, "key")?; + key = Some(arm_key(&meta)?); + Ok(()) + } else { + Err(meta.error("unsupported variant cultcache attribute")) + } + })?; + } + let Some(key) = key else { + return Err(syn::Error::new_spanned( + &variant.ident, + "CultUnion variants require #[cultcache(key = N)]", + )); + }; + if arms.iter().any(|arm| arm.key == key) { + return Err(syn::Error::new_spanned( + &variant.ident, + format!("duplicate CultUnion key {key}"), + )); + } + let payload = match variant.fields { + Fields::Unit => None, + Fields::Unnamed(fields) if fields.unnamed.len() == 1 => { + Some(fields.unnamed.into_iter().next().expect("one field").ty) + } + _ => { + return Err(syn::Error::new_spanned( + &variant.ident, + "a CultUnion variant is a unit or a newtype: use a newtype over a #[derive(CultSlots)] struct", + )); + } + }; + arms.push(Arm { + key, + ident: variant.ident, + payload, + }); + } + + let enum_name = ident.to_string(); + let mut declared_keys: Vec = arms.iter().map(|arm| arm.key).collect(); + declared_keys.sort_unstable(); + let declared = declared_keys.iter().map(i32::to_string).collect::>().join(", "); + let unknown_message = format!("unknown arm key {{}} for union {enum_name}; declared keys: {declared}"); + let arity_message = format!("union {enum_name} is not a [key, slots] pair"); + let non_integer_message = format!("union {enum_name} has a non-integer arm key; declared keys: {declared}"); + let nil_slots_message = format!("union {enum_name} arm {{}} has nil slots; declared keys: {declared}"); + let out_of_range_message = format!("union {enum_name} has an arm key outside Int32; declared keys: {declared}"); + let payload_checks = arms.iter().filter_map(|arm| arm.payload.as_ref()).map(|ty| { + quote! { assert_slot_record::<#ty>(); } + }); + + let serialize_arms = arms.iter().map(|arm| { + let variant = &arm.ident; + let key = arm.key; + if arm.payload.is_some() { + quote! { + Self::#variant(arm) => { + tuple.serialize_element(&#key)?; + tuple.serialize_element(arm)?; + } + } + } else { + quote! { + Self::#variant => { + tuple.serialize_element(&#key)?; + tuple.serialize_element(&[(); 0])?; + } + } + } + }); + + let deserialize_arms = arms.iter().map(|arm| { + let variant = &arm.ident; + let key = arm.key; + if let Some(ty) = &arm.payload { + quote! { + #key => { + // A nil in the slots position is not an empty record. + match seq.next_element::<::std::option::Option<#ty>>()? { + ::std::option::Option::Some(::std::option::Option::Some(arm)) => #ident::#variant(arm), + ::std::option::Option::Some(::std::option::Option::None) => { + return ::std::result::Result::Err(::serde::de::Error::custom( + format!(#nil_slots_message, #key), + )); + } + ::std::option::Option::None => { + return ::std::result::Result::Err(::serde::de::Error::custom(#arity_message)); + } + } + } + } + } else { + quote! { + #key => { + match seq + .next_element::<::std::option::Option<[(); 0]>>() + .map_err(|_| ::serde::de::Error::custom(#arity_message))? + { + ::std::option::Option::Some(::std::option::Option::Some(_)) => #ident::#variant, + ::std::option::Option::Some(::std::option::Option::None) => { + return ::std::result::Result::Err(::serde::de::Error::custom( + format!(#nil_slots_message, #key), + )); + } + ::std::option::Option::None => { + return ::std::result::Result::Err(::serde::de::Error::custom(#arity_message)); + } + } + } + } + } + }); + + Ok(quote! { + const _: () = ::core::assert!( + ::core::mem::size_of::<#ident>() <= ::cultcache_rs::MAX_RECORD_INLINE_BYTES, + "a CultCache record is at most cultcache_rs::MAX_RECORD_INLINE_BYTES bytes inline; box its largest slot" + ); + + // An arm is a slots array: a newtype over anything else is refused here, by the + // trait the CultSlots and DatabaseEntry derives implement. + const _: fn() = || { + #[allow(dead_code)] + fn assert_slot_record() {} + #(#payload_checks)* + }; + + impl ::serde::Serialize for #ident { + fn serialize<__S>(&self, serializer: __S) -> ::std::result::Result<__S::Ok, __S::Error> + where + __S: ::serde::Serializer, + { + use ::serde::ser::SerializeTuple; + let mut tuple = serializer.serialize_tuple(2)?; + match self { + #(#serialize_arms)* + } + tuple.end() + } + } + + impl<'de> ::serde::Deserialize<'de> for #ident { + fn deserialize<__D>(deserializer: __D) -> ::std::result::Result + where + __D: ::serde::Deserializer<'de>, + { + // The reference classifies the key before the arm: an integer in Int32, an + // integer outside it, or not an integer. No input value is kept or echoed. + enum __ArmKey { + Int(i64), + OutOfRange, + NonInteger, + } + struct __ArmKeyProbe(__ArmKey); + struct __ArmKeyVisitor; + + impl<'de> ::serde::de::Visitor<'de> for __ArmKeyVisitor { + type Value = __ArmKeyProbe; + + fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + formatter.write_str("an integer arm key") + } + + fn visit_i64<__E>(self, value: i64) -> ::std::result::Result { + Ok(__ArmKeyProbe(__ArmKey::Int(value))) + } + + fn visit_u64<__E>(self, value: u64) -> ::std::result::Result { + Ok(__ArmKeyProbe(match i64::try_from(value) { + Ok(value) => __ArmKey::Int(value), + Err(_) => __ArmKey::OutOfRange, + })) + } + + fn visit_bool<__E>(self, _: bool) -> ::std::result::Result { + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + fn visit_f64<__E>(self, _: f64) -> ::std::result::Result { + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + fn visit_str<__E>(self, _: &str) -> ::std::result::Result { + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + fn visit_bytes<__E>(self, _: &[u8]) -> ::std::result::Result { + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + fn visit_unit<__E>(self) -> ::std::result::Result { + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + fn visit_none<__E>(self) -> ::std::result::Result { + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + fn visit_some<__D>(self, deserializer: __D) -> ::std::result::Result + where + __D: ::serde::Deserializer<'de>, + { + <::serde::de::IgnoredAny as ::serde::Deserialize>::deserialize(deserializer)?; + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + // A MessagePack ext value (fixext, timestamp, ext8) reaches the visitor here. + fn visit_newtype_struct<__D>(self, deserializer: __D) -> ::std::result::Result + where + __D: ::serde::Deserializer<'de>, + { + <::serde::de::IgnoredAny as ::serde::Deserialize>::deserialize(deserializer)?; + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + fn visit_seq<__A>(self, mut seq: __A) -> ::std::result::Result + where + __A: ::serde::de::SeqAccess<'de>, + { + while seq.next_element::<::serde::de::IgnoredAny>()?.is_some() {} + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + + fn visit_map<__A>(self, mut map: __A) -> ::std::result::Result + where + __A: ::serde::de::MapAccess<'de>, + { + while map.next_entry::<::serde::de::IgnoredAny, ::serde::de::IgnoredAny>()?.is_some() {} + Ok(__ArmKeyProbe(__ArmKey::NonInteger)) + } + } + + impl<'de> ::serde::Deserialize<'de> for __ArmKeyProbe { + fn deserialize<__D>(deserializer: __D) -> ::std::result::Result + where + __D: ::serde::Deserializer<'de>, + { + deserializer.deserialize_any(__ArmKeyVisitor) + } + } + + struct __CultUnionVisitor; + + impl<'de> ::serde::de::Visitor<'de> for __CultUnionVisitor { + type Value = #ident; + + fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + formatter.write_str(concat!("a [key, slots] pair for union ", stringify!(#ident))) + } + + fn visit_seq<__A>(self, mut seq: __A) -> ::std::result::Result + where + __A: ::serde::de::SeqAccess<'de>, + { + if seq.size_hint().is_some_and(|len| len != 2) { + return ::std::result::Result::Err(::serde::de::Error::custom(#arity_message)); + } + let key = match seq + .next_element::<__ArmKeyProbe>() + .map_err(|_| ::serde::de::Error::custom(#arity_message))? + .ok_or_else(|| ::serde::de::Error::custom(#arity_message))? + .0 + { + __ArmKey::Int(wide) => match i32::try_from(wide) { + Ok(key) => key, + Err(_) => { + return ::std::result::Result::Err(::serde::de::Error::custom(#out_of_range_message)); + } + }, + __ArmKey::OutOfRange => { + return ::std::result::Result::Err(::serde::de::Error::custom(#out_of_range_message)); + } + __ArmKey::NonInteger => { + return ::std::result::Result::Err(::serde::de::Error::custom(#non_integer_message)); + } + }; + let value = match key { + #(#deserialize_arms)* + other => { + return ::std::result::Result::Err(::serde::de::Error::custom( + format!(#unknown_message, other), + )); + } + }; + if seq.next_element::<::serde::de::IgnoredAny>()?.is_some() { + return ::std::result::Result::Err(::serde::de::Error::custom(#arity_message)); + } + Ok(value) + } + } + + deserializer.deserialize_tuple(2, __CultUnionVisitor) + } + } + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn union_error(source: &str) -> String { + let input: DeriveInput = syn::parse_str(source).expect("the fixture parses"); + union_codec(input).expect_err("the fixture is refused").to_string() + } + + fn slots_error(source: &str) -> String { + let input: DeriveInput = syn::parse_str(source).expect("the fixture parses"); + let Err(error) = named_slots(input.data, &input.ident, "CultSlots") else { + panic!("the fixture is refused"); + }; + error.to_string() + } + + fn union_ok(source: &str) { + let input: DeriveInput = syn::parse_str(source).expect("the fixture parses"); + union_codec(input).expect("the fixture is accepted"); + } + + // Keys other than 0 throughout, so a default of 0 cannot stand in for a missing key. + #[test] + fn a_variant_without_a_key_is_refused_for_that_reason() { + let message = union_error("enum E { #[cultcache(key = 4)] A(Arm), B }"); + assert!(message.contains("require #[cultcache(key = N)]"), "{message}"); + let message = union_error("enum E { B, #[cultcache(key = 4)] A(Arm) }"); + assert!(message.contains("require #[cultcache(key = N)]"), "{message}"); + } + + #[test] + fn two_variants_with_one_key_are_refused_for_that_reason() { + let message = union_error("enum E { #[cultcache(key = 4)] A(Arm), #[cultcache(key = 4)] B }"); + assert!(message.contains("duplicate CultUnion key 4"), "{message}"); + let message = union_error("enum E { #[cultcache(key = 0x4)] A(Arm), #[cultcache(key = 4)] B }"); + assert!(message.contains("duplicate CultUnion key 4"), "{message}"); + } + + #[test] + fn a_repeated_key_attribute_is_refused_on_a_variant_and_on_a_field() { + for source in [ + "enum E { #[cultcache(key = 7)] #[cultcache(key = 0)] A(Arm) }", + "enum E { #[cultcache(key = 7, key = 0)] A(Arm) }", + ] { + let message = union_error(source); + assert!(message.contains("repeated `key`"), "{source}: {message}"); + } + for source in [ + "struct S { #[cultcache(key = 7)] #[cultcache(key = 0)] a: String }", + "struct S { #[cultcache(key = 7, key = 0)] a: String }", + ] { + let message = slots_error(source); + assert!(message.contains("repeated `key`"), "{source}: {message}"); + } + } + + #[test] + fn a_duplicate_slot_is_refused_for_that_reason() { + let message = slots_error("struct S { #[cultcache(key = 3)] a: String, #[cultcache(key = 3)] b: String }"); + assert!(message.contains("duplicate CultSlots slot 3"), "{message}"); + } + + #[test] + fn a_field_without_a_key_is_refused_for_that_reason() { + let message = slots_error("struct S { #[cultcache(key = 3)] a: String, b: String }"); + assert!(message.contains("fields require #[cultcache(key = N)]"), "{message}"); + } + + #[test] + fn struct_multi_field_and_generic_variants_are_refused_for_their_reasons() { + let message = union_error("enum E { #[cultcache(key = 4)] A { id: String } }"); + assert!(message.contains("use a newtype over a #[derive(CultSlots)] struct"), "{message}"); + let message = union_error("enum E { #[cultcache(key = 4)] A(Arm, Arm) }"); + assert!(message.contains("use a newtype over a #[derive(CultSlots)] struct"), "{message}"); + let message = union_error("enum E { #[cultcache(key = 4)] A(Arm), #[cultcache(key = 5)] B(T) }"); + assert!(message.contains("does not support generics"), "{message}"); + } + + // The arm key domain is the reference's Int32: negatives declare, Int32::MAX declares, + // one past it is a compile error. + #[test] + fn the_arm_key_domain_is_int32() { + union_ok("enum E { #[cultcache(key = -1)] A(Arm), #[cultcache(key = 2147483647)] B, #[cultcache(key = -2147483648)] C }"); + for source in [ + "enum E { #[cultcache(key = 2147483648)] A(Arm) }", + "enum E { #[cultcache(key = -2147483649)] A(Arm) }", + "enum E { #[cultcache(key = 4294967296)] A(Arm) }", + ] { + let message = union_error(source); + assert!(message.contains("outside Int32"), "{source}: {message}"); + } + let message = union_error("enum E { #[cultcache(key = \"1\")] A(Arm) }"); + assert!(message.contains("integer literal"), "{message}"); + } + fn entry_result(source: &str) -> syn::Result { + database_entry_codec(syn::parse_str(source).expect("the fixture parses")) + } + + fn slots_result(source: &str) -> syn::Result { + cult_slots_codec(syn::parse_str(source).expect("the fixture parses")) + } + + // Each attribute names a thing once; the second would silently win otherwise. + #[test] + fn a_repeated_type_or_schema_attribute_is_refused_for_that_reason() { + for source in [ + "#[cultcache(type = \"a.one\")] #[cultcache(type = \"a.two\")] struct S { #[cultcache(key = 0)] id: String }", + "#[cultcache(type = \"a.one\", type = \"a.two\")] struct S { #[cultcache(key = 0)] id: String }", + "#[cultcache(type = \"a.one\", schema = \"s.one\")] #[cultcache(schema = \"s.two\")] struct S { #[cultcache(key = 0)] id: String }", + "#[cultcache(type = \"a.one\", schema = \"s.one\", schema = \"s.two\")] struct S { #[cultcache(key = 0)] id: String }", + ] { + let message = entry_result(source).expect_err(source).to_string(); + assert!(message.contains("repeated `type`") || message.contains("repeated `schema`"), "{source}: {message}"); + } + entry_result("#[cultcache(type = \"a.one\", schema = \"s.one\")] struct S { #[cultcache(key = 0)] id: String }") + .expect("one type and one schema are accepted"); + } + + #[test] + fn a_generic_slots_struct_and_a_missing_type_are_refused_for_their_reasons() { + let message = slots_result("struct S { #[cultcache(key = 0)] id: T }").unwrap_err().to_string(); + assert!(message.contains("does not support generics"), "{message}"); + let message = entry_result("struct S { #[cultcache(key = 0)] id: String }").unwrap_err().to_string(); + assert!(message.contains("requires #[cultcache(type"), "{message}"); + } + + // A slot record is a dense array: keys stop at the largest array16 length. + #[test] + fn the_slot_key_domain_ends_at_65535() { + slots_error_free("struct S { #[cultcache(key = 0)] a: String, #[cultcache(key = 65535)] b: String }"); + for source in [ + "struct S { #[cultcache(key = 65536)] a: String }", + "struct S { #[cultcache(key = 4294967296)] a: String }", + "struct S { #[cultcache(key = 0x10000)] a: String }", + ] { + let message = slots_error(source); + assert!(message.contains("outside 0..=65535"), "{source}: {message}"); + } + } + + fn slots_error_free(source: &str) { + let input: DeriveInput = syn::parse_str(source).expect("the fixture parses"); + named_slots(input.data, &input.ident, "CultSlots").expect("the fixture is accepted"); + } +} diff --git a/packages/cultcache-rs/src/lib.rs b/packages/cultcache-rs/src/lib.rs index ed9cae32..ecb69145 100644 --- a/packages/cultcache-rs/src/lib.rs +++ b/packages/cultcache-rs/src/lib.rs @@ -1,3 +1,138 @@ +//! The derives refuse a malformed union at compile time. Each block below is a valid +//! union with one property changed; keys are never 0, so a refusal cannot be a default +//! key colliding with a declared 0. The derive crate's unit tests assert the message of +//! every refusal the derive itself makes; a `compile_fail` block shows only that it fails. +//! +//! ``` +//! use cultcache_rs::{CultSlots, CultUnion}; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String } +//! #[derive(CultUnion)] +//! enum Fine { #[cultcache(key = -1)] A(Arm), #[cultcache(key = 2147483647)] B, #[cultcache(key = 4)] C } +//! ``` +//! +//! A variant without a key, first and last: +//! +//! ```compile_fail +//! use cultcache_rs::{CultSlots, CultUnion}; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String } +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 4)] A(Arm), B } +//! ``` +//! +//! ```compile_fail +//! use cultcache_rs::{CultSlots, CultUnion}; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String } +//! #[derive(CultUnion)] +//! enum Bad { B, #[cultcache(key = 4)] A(Arm) } +//! ``` +//! +//! Two variants with one key: +//! +//! ```compile_fail +//! use cultcache_rs::{CultSlots, CultUnion}; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String } +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 4)] A(Arm), #[cultcache(key = 4)] B } +//! ``` +//! +//! A key attribute given twice: +//! +//! ```compile_fail +//! use cultcache_rs::CultUnion; +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 4)] #[cultcache(key = 5)] A } +//! ``` +//! +//! A key outside Int32: +//! +//! ```compile_fail +//! use cultcache_rs::CultUnion; +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 2147483648)] A } +//! ``` +//! +//! A struct variant: +//! +//! ```compile_fail +//! use cultcache_rs::CultUnion; +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 4)] A { id: String }, #[cultcache(key = 5)] B } +//! ``` +//! +//! A multi-field tuple variant: +//! +//! ```compile_fail +//! use cultcache_rs::{CultSlots, CultUnion}; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String } +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 4)] A(Arm, Arm), #[cultcache(key = 5)] B } +//! ``` +//! +//! A generic enum: +//! +//! ```compile_fail +//! use cultcache_rs::{CultSlots, CultUnion}; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String } +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 4)] A(Arm), #[cultcache(key = 5)] B(std::marker::PhantomData) } +//! ``` +//! +//! An arm that is not a slots record (rustc's `SlotRecord` bound, not the derive, refuses it): +//! +//! ```compile_fail +//! use cultcache_rs::CultUnion; +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 4)] A(String) } +//! ``` +//! +//! ```compile_fail +//! use cultcache_rs::{CultSlots, CultUnion}; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String } +//! #[derive(CultUnion)] +//! enum Bad { #[cultcache(key = 4)] A(Option) } +//! ``` +//! +//! A hand-written `SlotRecord` impl, which only the derives provide: +//! +//! ```compile_fail,E0046 +//! use cultcache_rs::SlotRecord; +//! struct Sneaky(String); +//! impl SlotRecord for Sneaky {} +//! ``` +//! +//! A CultSlots field without a key, a repeated slot, a repeated key attribute, and a generic struct: +//! +//! ```compile_fail +//! use cultcache_rs::CultSlots; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String, name: String } +//! ``` +//! +//! ```compile_fail +//! use cultcache_rs::CultSlots; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: String, #[cultcache(key = 3)] name: String } +//! ``` +//! +//! ```compile_fail +//! use cultcache_rs::CultSlots; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] #[cultcache(key = 4)] id: String } +//! ``` +//! +//! ```compile_fail +//! use cultcache_rs::CultSlots; +//! #[derive(CultSlots)] +//! struct Arm { #[cultcache(key = 3)] id: T } +//! ``` + use anyhow::Context; use anyhow::Result; use anyhow::anyhow; @@ -20,6 +155,8 @@ use redb::{Database, ReadableDatabase, ReadableTable, TableDefinition}; extern crate self as cultcache_rs; +pub use cultcache_rs_derive::CultSlots; +pub use cultcache_rs_derive::CultUnion; pub use cultcache_rs_derive::DatabaseEntry; pub trait DatabaseEntry: Serialize + DeserializeOwned + Clone + Send + 'static { @@ -27,6 +164,19 @@ pub trait DatabaseEntry: Serialize + DeserializeOwned + Clone + Send + 'static { const SCHEMA_NAME: &'static str = "DatabaseEntry"; } +/// A type written as a positional slots array: what the `CultSlots` and `DatabaseEntry` +/// derives implement, and what a `CultUnion` arm must carry. +#[diagnostic::on_unimplemented( + message = "`{Self}` is not a slots record", + label = "a CultUnion arm is a newtype over a #[derive(CultSlots)] struct", + note = "a String, an Option or any other type is not written as an array of slots" +)] +pub trait SlotRecord { + /// Implemented only by the derives, which write the positional array the contract names. + #[doc(hidden)] + fn __slots_array(); +} + pub trait CultCacheRegistry { fn register_entries(&self, cache: &mut CultCache) -> Result<()>; } @@ -271,7 +421,7 @@ struct PersistedSchemaCatalogMember( Option, ); -#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Debug, serde::Serialize)] struct PersistedRecord( String, String, @@ -279,6 +429,447 @@ struct PersistedRecord( #[serde(with = "serde_bytes")] Vec, ); +impl<'de> serde::Deserialize<'de> for PersistedRecord { + /// Reads the four v1 slots and refuses a fifth, naming the record. No runtime reads a + /// v1 store holding such a record, so the store is not a valid one. + fn deserialize>(deserializer: D) -> std::result::Result { + use serde::de::{Error, IgnoredAny, SeqAccess, Visitor}; + + struct RecordVisitor; + impl<'de> Visitor<'de> for RecordVisitor { + type Value = PersistedRecord; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a CultCache persisted record of 4 slots") + } + + fn visit_seq>(self, mut seq: A) -> std::result::Result { + let key: String = seq.next_element()?.ok_or_else(|| A::Error::invalid_length(0, &self))?; + let schema_id: String = seq.next_element()?.ok_or_else(|| A::Error::invalid_length(1, &self))?; + let stored_at: String = seq.next_element()?.ok_or_else(|| A::Error::invalid_length(2, &self))?; + let payload: serde_bytes::ByteBuf = + seq.next_element()?.ok_or_else(|| A::Error::invalid_length(3, &self))?; + if seq.next_element::()?.is_some() { + return Err(A::Error::custom(format!( + "{RECORD_REFUSAL}{key:?} (schema {schema_id:?}) has more than the 4 slots of a {STORE_FORMAT_V1} record, so this is not a valid store" + ))); + } + Ok(PersistedRecord(key, schema_id, stored_at, payload.into_vec())) + } + } + + deserializer.deserialize_seq(RecordVisitor) + } +} + +const STORE_FORMAT_V1: &str = "cultcache.store.v1"; + +/// Opens every refusal CultCache raises about one persisted record. The decoder's own +/// messages can quote the bytes; these name only the record's key and schema id. +const RECORD_REFUSAL: &str = "CultCache record "; + +/// A store header as a refusal may show it: echoed when it has the shape +/// `cultcache.store.v`, and otherwise described only by its length, since the +/// bytes are the store's and an error text must not carry them. +fn describe_header(header: &str) -> String { + let known_shape = header + .strip_prefix("cultcache.store.v") + .is_some_and(|version| !version.is_empty() && version.bytes().all(|byte| byte.is_ascii_digit())); + if known_shape { + format!("{header:?}") + } else { + format!("an unrecognised cultcache.store.* header of {} bytes", header.len()) + } +} + +/// What a failed decode tells the operator: CultCache's own context and record +/// refusals, and for a decoder failure only its kind, never a value from the bytes. +fn describe_undecodable(error: &anyhow::Error) -> String { + let mut parts = Vec::new(); + for cause in error.chain() { + if let Some(decode) = cause.downcast_ref::() { + parts.push(describe_decode_error(decode)); + break; + } + parts.push(cause.to_string()); + } + parts.join(": ") +} + +/// The deepest a document payload may nest, on read and on write, in every CultCache runtime: every +/// MessagePack array and map counts, read by a deserializer or skipped past it, and the outermost +/// array is depth 1. A payload of this depth is accepted and one container deeper is refused. It is +/// the C# reference's `CultMessagePackSecurity.MaximumPayloadDepth`. +pub const MAX_PAYLOAD_DEPTH: usize = 256; + +/// A payload nests more containers than [`MAX_PAYLOAD_DEPTH`]. It names the depth reached and the +/// limit, never payload bytes, and can be recovered from the `anyhow::Error` a read or write returns. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct PayloadTooDeep { + pub depth: usize, + pub limit: usize, +} + +impl std::fmt::Display for PayloadTooDeep { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + formatter, + "payload nests {} MessagePack containers deep; the limit is {}", + self.depth, self.limit + ) + } +} + +impl std::error::Error for PayloadTooDeep {} + +/// Walks the MessagePack headers of one payload without recursion, counting every array and map and +/// refusing the first container past [`MAX_PAYLOAD_DEPTH`]. Scalars are skipped by length and nothing +/// is allocated per element. A payload that ends early is the decoder's to refuse. +pub fn check_payload_depth(bytes: &[u8]) -> std::result::Result<(), PayloadTooDeep> { + let mut remaining = [0usize; MAX_PAYLOAD_DEPTH]; + let mut depth = 0usize; + let mut position = 0usize; + while position < bytes.len() { + let Some((advance, children)) = element_header(bytes, position) else { + return Ok(()); + }; + position = position.saturating_add(advance); + if let Some(children) = children { + if depth == MAX_PAYLOAD_DEPTH { + return Err(PayloadTooDeep { depth: MAX_PAYLOAD_DEPTH + 1, limit: MAX_PAYLOAD_DEPTH }); + } + if children > 0 { + remaining[depth] = children; + depth += 1; + continue; + } + } + // One element is complete; close every container it was the last element of. + while depth > 0 { + remaining[depth - 1] -= 1; + if remaining[depth - 1] != 0 { + break; + } + depth -= 1; + } + if depth == 0 { + return Ok(()); + } + } + Ok(()) +} + +/// The element at `position`: how many bytes to advance past it (its whole length for a scalar, its +/// header for a container) and, for a container, how many child elements follow. `None` when the +/// payload ends inside the header. +fn element_header(bytes: &[u8], position: usize) -> Option<(usize, Option)> { + // The big-endian length after the code byte. + let length = |width: usize| -> Option { + let field = bytes.get(position + 1..position + 1 + width)?; + Some(field.iter().fold(0usize, |length, byte| (length << 8) | usize::from(*byte))) + }; + let code = bytes[position]; + Some(match code { + 0x00..=0x7f | 0xe0..=0xff | 0xc0..=0xc3 => (1, None), + 0x80..=0x8f => (1, Some(2 * usize::from(code & 0x0f))), + 0x90..=0x9f => (1, Some(usize::from(code & 0x0f))), + 0xa0..=0xbf => (1 + usize::from(code & 0x1f), None), + 0xc4 | 0xd9 => (2usize.saturating_add(length(1)?), None), + 0xc5 | 0xda => (3usize.saturating_add(length(2)?), None), + 0xc6 | 0xdb => (5usize.saturating_add(length(4)?), None), + 0xc7 => (3usize.saturating_add(length(1)?), None), + 0xc8 => (4usize.saturating_add(length(2)?), None), + 0xc9 => (6usize.saturating_add(length(4)?), None), + 0xca | 0xce | 0xd2 => (5, None), + 0xcb | 0xcf | 0xd3 => (9, None), + 0xcc | 0xd0 => (2, None), + 0xcd | 0xd1 | 0xd4 => (3, None), + 0xd5 => (4, None), + 0xd6 => (6, None), + 0xd7 => (10, None), + 0xd8 => (18, None), + 0xdc => (3, Some(length(2)?)), + 0xdd => (5, Some(length(4)?)), + 0xde => (3, Some(length(2)?.saturating_mul(2))), + 0xdf => (5, Some(length(4)?.saturating_mul(2))), + }) +} + +/// The stack left below which a decode moves to a fresh segment. Measured (map D10, D12): the +/// distance between two stack checks is 14 times the inline size of the record entered plus 3 KiB in +/// a debug build and 6 times in release, so at [`MAX_RECORD_INLINE_BYTES`] it is 220 KiB and 93 KiB; +/// 512 KiB is 2.3 times the larger. A record the derives produced can never exceed that bound. +const DECODE_RED_ZONE: usize = 512 * 1024; + +/// The size of each segment a decode grows onto, four red zones. It does not change the cost of a +/// decode (map D6); it only has to exceed the red zone plus one gap. +const DECODE_STACK_SEGMENT: usize = 2 * 1024 * 1024; + +/// The largest `size_of` a record the derives produce may have. `DatabaseEntry`, `CultSlots` and +/// `CultUnion` refuse a larger one at compile time: put its large data behind a `Vec` or a `Box`. +/// +/// Decoding builds a record in stack frames that hold it, and the distance between two stack checks +/// grows with its size, so the decode's red zone is set against a record of exactly this size. A +/// field of a type the derives did not produce (a plain serde struct, a large tuple) that exceeds +/// this size behind a `Box` or `Vec` is outside the guarantee. +/// +/// ```compile_fail,E0080 +/// use cultcache_rs::CultSlots; +/// +/// #[derive(CultSlots)] +/// struct TooLarge { +/// #[cultcache(key = 0)] +/// a: [[u64; 32]; 32], +/// #[cultcache(key = 1)] +/// b: [[u64; 32]; 32], +/// #[cultcache(key = 2)] +/// one_more: u8, +/// } +/// ``` +/// +/// A union is refused by its own size, though every arm is within the limit: +/// +/// ```compile_fail,E0080 +/// use cultcache_rs::{CultSlots, CultUnion}; +/// +/// #[derive(CultSlots)] +/// struct Arm { +/// #[cultcache(key = 0)] +/// a: [[u64; 32]; 32], +/// #[cultcache(key = 1)] +/// b: [[u64; 32]; 32], +/// } +/// +/// #[derive(CultUnion)] +/// enum TooLarge { +/// #[cultcache(key = 0)] +/// Arm(Arm), +/// #[cultcache(key = 1)] +/// Leaf, +/// } +/// ``` +/// +/// A record of exactly the limit, a union over a record of exactly the limit's half, and a record +/// under it with a `Vec` for its large data compile: +/// +/// ``` +/// use cultcache_rs::{CultSlots, CultUnion}; +/// +/// #[derive(CultSlots)] +/// struct AtTheLimit { +/// #[cultcache(key = 0)] +/// a: [[u64; 32]; 32], +/// #[cultcache(key = 1)] +/// b: [[u64; 32]; 32], +/// } +/// +/// #[derive(CultSlots)] +/// struct Half { +/// #[cultcache(key = 0)] +/// a: [[u64; 32]; 32], +/// } +/// +/// #[derive(CultUnion)] +/// enum Fits { +/// #[cultcache(key = 0)] +/// Half(Half), +/// #[cultcache(key = 1)] +/// Leaf, +/// } +/// +/// #[derive(CultSlots)] +/// struct Boxed { +/// #[cultcache(key = 0)] +/// large: Vec, +/// #[cultcache(key = 1)] +/// header: [[u64; 32]; 31], +/// } +/// ``` +pub const MAX_RECORD_INLINE_BYTES: usize = 16 * 1024; + +/// The one grown decoder of stored bytes: the outer stack check, then `serde_stacker` re-checks at +/// every container serde's impls descend through, skipped values included. No nesting bound is applied here; [`decode_payload`] walks first. +fn decode_grown(bytes: &[u8]) -> std::result::Result { + stacker::maybe_grow(DECODE_RED_ZONE, DECODE_STACK_SEGMENT, || { + let mut reader = rmp_serde::Deserializer::from_read_ref(bytes); + let mut grown = serde_stacker::Deserializer::new(&mut reader); + grown.red_zone = DECODE_RED_ZONE; + grown.stack_size = DECODE_STACK_SEGMENT; + T::deserialize(grown) + }) +} + +/// The one decode of a document payload: the nesting bound first, then [`decode_grown`], whose +/// rmp-serde depth counter (1024) is only a backstop. A failure keeps its kind and never quotes the +/// bytes. Readers of stored envelope payloads outside this crate decode through it too. +/// +/// A payload inside the bound decodes on any thread that has the decoder's fixed floor, which no payload +/// changes: at the bound, about 56 KiB in release and 72 KiB in debug for a caller that only tests the +/// result (`is_ok`), plus the caller's own frames. The figure depends on how the caller holds the result: +/// one that moves the record out holds a second copy and needs more (about 104 KiB in debug). That holds +/// for every record the derives produce, which [`MAX_RECORD_INLINE_BYTES`] bounds. Stack growth was +/// verified on x86_64-pc-windows-msvc by hand (`decode_stack`, revision 10a39dac, 13 tests, debug and release); a +/// `stacker` bump or a change to the stack-size tests repeats it. +pub fn decode_payload(payload: &[u8]) -> Result { + check_payload_depth(payload)?; + decode_grown(payload).map_err(opaque_decode_error) +} + +/// The nesting bound for an envelope admitted without a typed decode, from the same walk that +/// [`decode_payload`] runs first. Names the entry's type and key, never the payload. +fn require_payload_depth(entry: &CultCacheEnvelope) -> Result<()> { + check_payload_depth(&entry.payload).with_context(|| { + format!( + "refused CultCache envelope {:?} at key {:?}", + entry.r#type, entry.key + ) + }) +} + +/// A decoder failure as an error that keeps only its kind. Every decode of stored bytes +/// goes through this or [`describe_undecodable`], so no error text quotes a stored value. +fn opaque_decode_error(error: rmp_serde::decode::Error) -> anyhow::Error { + anyhow!(describe_decode_error(&error)) +} + +/// The text of a decode failure. Field names in it come from the type, never from the bytes. +fn describe_decode_error(error: &rmp_serde::decode::Error) -> String { + use rmp_serde::decode::Error; + match error { + Error::InvalidMarkerRead(_) | Error::InvalidDataRead(_) => "the bytes end before the store does", + Error::TypeMismatch(_) => "a value has a MessagePack type the store format does not allow", + Error::OutOfRange => "a number is out of range for its slot", + Error::LengthMismatch(_) => "an array has a length the store format does not allow", + Error::Utf8Error(_) => "a string is not valid UTF-8", + Error::DepthLimitExceeded => "values are nested deeper than the decoder allows", + Error::Syntax(message) | Error::Uncategorized(message) if message.starts_with(RECORD_REFUSAL) => { + return message.clone(); + } + Error::Syntax(message) | Error::Uncategorized(message) => { + return describe_serde_message(message); + } + } + .to_string() +} + +/// serde's own texts, kept only where they cannot carry a received value: a missing or duplicated +/// field is named by the type's static field name (checked to look like one), an unknown tag and a +/// mistyped value are described by kind. Everything else, `unknown field` included, is opaque. +fn describe_serde_message(message: &str) -> String { + for lead in ["missing field `", "duplicate field `"] { + if let Some(name) = message.strip_prefix(lead).and_then(|rest| rest.strip_suffix('`')) { + let is_name = (1..=64).contains(&name.len()) + && name.bytes().all(|byte| byte.is_ascii_alphanumeric() || byte == b'_'); + if is_name { + return message.to_string(); + } + } + } + if message.starts_with("unknown variant ") { + "a tag names no variant this type knows".to_string() + } else if message.starts_with("invalid type: ") { + "a value has a MessagePack type the store format does not allow".to_string() + } else { + "a value does not fit the store format".to_string() + } +} + +/// The store header string, or `None` when the bytes do not open with an array whose +/// first slot is a string (the legacy envelope array starts with a map). Only the +/// leading bytes are read, so a store cut short after its header still names its format. +fn store_header(bytes: &[u8]) -> Option { + let mut offset = 0usize; + if read_array_header(bytes, &mut offset)? == 0 { + return None; + } + read_string(bytes, &mut offset) +} + +/// A single-file store whose bytes were read and not accepted. It sits in the error +/// chain of every such read, so a consumer tells it apart with +/// `error.downcast_ref::()`. A failure to read the bytes +/// at all stays a [`std::io::Error`] in the chain and never carries this type; the +/// chain under this type never holds an `io::Error`, so the two never overlap. +#[derive(Clone, Debug, PartialEq, Eq)] +#[non_exhaustive] +pub struct CultCacheStoreUnreadable { + pub path: PathBuf, + pub kind: CultCacheStoreUnreadableKind, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[non_exhaustive] +pub enum CultCacheStoreUnreadableKind { + /// The bytes are not a store this runtime's format accepts: truncated, garbled, + /// or a record the format does not allow. + Undecodable, + /// The header names a store format this runtime does not read, such as one + /// written by a newer runtime. The rest of the file was not judged. + UnsupportedFormat, +} + +impl std::fmt::Display for CultCacheStoreUnreadable { + fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + match self.kind { + CultCacheStoreUnreadableKind::Undecodable => { + write!(formatter, "CultCache store {} is not decodable", self.path.display()) + } + CultCacheStoreUnreadableKind::UnsupportedFormat => write!( + formatter, + "CultCache store {} is in a format this runtime does not read", + self.path.display() + ), + } + } +} + +impl std::error::Error for CultCacheStoreUnreadable {} + +/// A write to a single-file store that failed, and what it left on disk. It sits in the +/// error chain of every such failure, above the cause, so a consumer tells the outcomes +/// apart with `error.downcast_ref::()`. +#[derive(Clone, Debug, PartialEq, Eq)] +#[non_exhaustive] +pub struct CultCacheStoreWriteFailed { + pub path: PathBuf, + pub kind: CultCacheStoreWriteFailedKind, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[non_exhaustive] +pub enum CultCacheStoreWriteFailedKind { + /// The entries cannot be stored as a snapshot, for example two document types + /// claim one schema id. Nothing was written, and retrying the same entries fails + /// the same way: this is a refusal, not an I/O failure. + Rejected, + /// The write failed before the store file was replaced (creating, writing or + /// syncing the staging file, or renaming it): the file holds what it held before. + NotReplaced, + /// The store file was replaced, then syncing its directory failed: the new + /// snapshot is in place but may not survive a crash. + ReplacedNotDurable, +} + +impl std::fmt::Display for CultCacheStoreWriteFailed { + fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + match self.kind { + CultCacheStoreWriteFailedKind::Rejected => { + write!(formatter, "CultCache store {} refused a snapshot it cannot store", self.path.display()) + } + CultCacheStoreWriteFailedKind::NotReplaced => { + write!(formatter, "CultCache store {} was not replaced", self.path.display()) + } + CultCacheStoreWriteFailedKind::ReplacedNotDurable => write!( + formatter, + "CultCache store {} was replaced, but the replacement is not yet durable", + self.path.display() + ), + } + } +} + +impl std::error::Error for CultCacheStoreWriteFailed {} + #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct PushAllOptions { pub soft: bool, @@ -355,10 +946,12 @@ impl SingleFileMessagePackBackingStore { /// either file. Writers using the sibling lock cannot replace the snapshot /// until `action` returns. /// - /// Releasing the lock is RAII cleanup. A release failure therefore cannot - /// rewrite the completed action's result; consumers that need to observe - /// that cleanup failure can use - /// [`Self::with_read_only_shared_snapshot_and_unlock_diagnostic`]. + /// Releasing the lock is RAII cleanup, under the same policy as every lock in + /// this crate (see `release_lock`): a release failure cannot rewrite the + /// completed action's result. This path alone also offers an observer for that + /// failure, [`Self::with_read_only_shared_snapshot_and_unlock_diagnostic`], + /// because a provider crossing may need to report it; the locked read and write + /// paths discard it. pub fn with_read_only_shared_snapshot( &self, action: impl FnOnce(Vec) -> Result, @@ -650,17 +1243,44 @@ impl SingleFileMessagePackBackingStore { } fn read_all_unlocked(&self) -> Result> { - if !self.path.exists() { - return Ok(Vec::new()); + // Only a store that is not there is empty. A file that is there and empty is + // not a store (no writer leaves one), and any other failure to reach the file, + // such as a symlink loop, a file where a directory should be, or no permission, + // stays an io::Error: reading it as empty would let a writer replace a store it + // never saw. + // A dangling symbolic link is something at the path, not nothing: reading it as + // empty would let the writer rename a file over the link and move the store off + // the volume the link pointed to. + let bytes = match fs::read(&self.path) { + Ok(bytes) => bytes, + Err(error) if error.kind() == std::io::ErrorKind::NotFound && is_absent(&self.path)? => { + return Ok(Vec::new()); + } + Err(error) => { + return Err(anyhow::Error::new(error) + .context(format!("failed to read {}", self.path.display()))); + } + }; + let unreadable = |kind, detail: anyhow::Error| { + // The detail is rebuilt as text that names no value read from the bytes. The + // decoder reports a short read as an io::Error, and dropping it keeps an + // io::Error in the chain meaning only that the file itself could not be read. + anyhow!(describe_undecodable(&detail)).context(CultCacheStoreUnreadable { + path: self.path.clone(), + kind, + }) + }; + match store_header(&bytes) { + Some(header) if header == STORE_FORMAT_V1 => decode_store_snapshot(&bytes) + .map_err(|error| unreadable(CultCacheStoreUnreadableKind::Undecodable, error)), + Some(header) if header.starts_with("cultcache.store.") => Err(unreadable( + CultCacheStoreUnreadableKind::UnsupportedFormat, + anyhow!("its header is {}; this runtime reads {STORE_FORMAT_V1:?} only", describe_header(&header)), + )), + _ => decode_grown(&bytes) + .context("failed to decode legacy CultCache envelope array") + .map_err(|error| unreadable(CultCacheStoreUnreadableKind::Undecodable, error)), } - let bytes = fs::read(&self.path) - .with_context(|| format!("failed to read {}", self.path.display()))?; - if bytes.is_empty() { - return Ok(Vec::new()); - } - decode_store_snapshot(&bytes) - .or_else(|_| rmp_serde::from_slice(&bytes)) - .with_context(|| format!("failed to decode MessagePack {}", self.path.display())) } /// Reads one filesystem snapshot without creating or opening the sibling @@ -676,29 +1296,39 @@ impl SingleFileMessagePackBackingStore { } fn write_all_unlocked(&self, entries: &[CultCacheEnvelope]) -> Result<()> { + let failed = |kind| CultCacheStoreWriteFailed { + path: self.path.clone(), + kind, + }; + let bytes = encode_store_snapshot(entries) + .and_then(|snapshot| rmp_serde::to_vec(&snapshot).context("failed to encode MessagePack")) + .map_err(|error| error.context(failed(CultCacheStoreWriteFailedKind::Rejected)))?; + self.replace_unlocked(&bytes) + .map_err(|error| error.context(failed(CultCacheStoreWriteFailedKind::NotReplaced)))?; + sync_parent_directory(&self.path) + .map_err(|error| error.context(failed(CultCacheStoreWriteFailedKind::ReplacedNotDurable))) + } + + /// Everything up to and including the rename over the store file. On failure the + /// store file is as it was. + fn replace_unlocked(&self, bytes: &[u8]) -> Result<()> { if let Some(parent) = self.path.parent() { fs::create_dir_all(parent) .with_context(|| format!("failed to create {}", parent.display()))?; } remove_abandoned_staging_files(&self.path)?; - let bytes = rmp_serde::to_vec(&encode_store_snapshot(entries)?) - .context("failed to encode MessagePack")?; let tmp_path = temporary_path_for(&self.path); - let mut staged = OpenOptions::new() + let staged = OpenOptions::new() .create_new(true) .write(true) .open(&tmp_path) .with_context(|| format!("failed to create {}", tmp_path.display()))?; - use std::io::Write; - staged - .write_all(&bytes) - .with_context(|| format!("failed to write {}", tmp_path.display()))?; - staged - .sync_all() - .with_context(|| format!("failed to sync {}", tmp_path.display()))?; - drop(staged); - replace_file_atomically(&tmp_path, &self.path)?; - sync_parent_directory(&self.path)?; + // From here the staging file is this write's to remove: a write that fails + // for lack of space must not keep holding the space it failed on. + if let Err(error) = stage_and_replace(staged, &tmp_path, bytes, &self.path) { + let _ = fs::remove_file(&tmp_path); + return Err(error); + } Ok(()) } @@ -706,20 +1336,14 @@ impl SingleFileMessagePackBackingStore { let lock = self.open_lock_file()?; fs2::FileExt::lock_shared(&lock) .with_context(|| format!("failed to lock {}", self.lock_path().display()))?; - let result = action(); - fs2::FileExt::unlock(&lock) - .with_context(|| format!("failed to unlock {}", self.lock_path().display()))?; - result + release_lock(lock, action()) } fn with_exclusive_lock(&self, action: impl FnOnce() -> Result) -> Result { let lock = self.open_lock_file()?; fs2::FileExt::lock_exclusive(&lock) .with_context(|| format!("failed to lock {}", self.lock_path().display()))?; - let result = action(); - fs2::FileExt::unlock(&lock) - .with_context(|| format!("failed to unlock {}", self.lock_path().display()))?; - result + release_lock(lock, action()) } /// Replaces the named entries only if each still matches its expectation. @@ -836,10 +1460,7 @@ impl SingleFileMessagePackBackingStore { .with_context(|| format!("failed to lock {}", self.lock_path().display())); } } - let result = action(); - fs2::FileExt::unlock(&lock) - .with_context(|| format!("failed to unlock {}", self.lock_path().display()))?; - result.map(Some) + release_lock(lock, action()).map(Some) } fn open_lock_file(&self) -> Result { @@ -924,7 +1545,7 @@ fn unique_batch_ids( impl CacheBackingStore for SingleFileMessagePackBackingStore { fn pull_all(&self) -> Result> { - if !self.path.exists() && !self.lock_path().exists() { + if is_absent(&self.path)? && is_absent(&self.lock_path())? { return Ok(Vec::new()); } self.with_shared_lock(|| self.read_all_unlocked()) @@ -1029,10 +1650,7 @@ impl RedbMessagePackBackingStore { .with_context(|| format!("failed to open {}", lock_path.display()))?; fs2::FileExt::lock_exclusive(&lock) .with_context(|| format!("failed to lock {}", lock_path.display()))?; - let result = self.open_database().and_then(|database| action(&database)); - fs2::FileExt::unlock(&lock) - .with_context(|| format!("failed to unlock {}", lock_path.display()))?; - result + release_lock(lock, self.open_database().and_then(|database| action(&database))) } fn lock_path(&self) -> PathBuf { @@ -1812,7 +2430,9 @@ fn read_redb_entry( table .get(key.as_slice())? .map(|value| { - rmp_serde::from_slice(value.value()).context("failed to decode redb CultCache envelope") + decode_grown(value.value()) + .map_err(opaque_decode_error) + .context("failed to decode redb CultCache envelope") }) .transpose() } @@ -1834,7 +2454,9 @@ fn read_all_redb( .iter()? .map(|row| { let (_, value) = row?; - rmp_serde::from_slice(value.value()).context("failed to decode redb CultCache envelope") + decode_grown(value.value()) + .map_err(opaque_decode_error) + .context("failed to decode redb CultCache envelope") }) .collect::>>()?; entries.sort_by_key(entry_id); @@ -2065,7 +2687,7 @@ impl CultCache { let Some(entry) = self.entries.get(&entry_id_parts(T::TYPE, key)) else { return Ok(None); }; - let payload = rmp_serde::from_slice(&entry.payload).with_context(|| { + let payload = decode_payload(&entry.payload).with_context(|| { format!( "failed to decode CultCache entry {:?} at key {:?} as {}", T::TYPE, @@ -2098,7 +2720,7 @@ impl CultCache { if entry.r#type != T::TYPE { continue; } - values.push(rmp_serde::from_slice(&entry.payload).with_context(|| { + values.push(decode_payload(&entry.payload).with_context(|| { format!( "failed to decode CultCache entry {:?} at key {:?} as {}", T::TYPE, @@ -2119,7 +2741,7 @@ impl CultCache { } values.push(( entry.key.clone(), - rmp_serde::from_slice(&entry.payload).with_context(|| { + decode_payload(&entry.payload).with_context(|| { format!( "failed to decode CultCache entry {:?} at key {:?} as {}", T::TYPE, @@ -2201,7 +2823,7 @@ impl CultCache { key: String, payload: Vec, ) -> Result<(CultCacheEnvelope, T)> { - let parsed: T = rmp_serde::from_slice(&payload).with_context(|| { + let parsed: T = decode_payload(&payload).with_context(|| { format!( "failed to validate CultCache entry {:?} at key {:?} as {}", T::TYPE, @@ -2244,6 +2866,7 @@ impl CultCache { entry.r#type )); } + require_payload_depth(entry)?; let Some(home) = self.home_index(&entry.r#type)? else { continue; }; @@ -2288,7 +2911,7 @@ impl CultCache { /// claiming compile-time knowledge of its payload schema. This is the /// CultMesh/schema-registry boundary: callers own payload validation before /// admission; CultCache still enforces registered type, identity, timestamp, - /// routing, and persistence. + /// the payload nesting bound ([`MAX_PAYLOAD_DEPTH`]), routing, and persistence. pub fn put_raw_envelope(&mut self, entry: CultCacheEnvelope) -> Result<()> { if !self.definitions.contains_key(&entry.r#type) { return Err(anyhow!( @@ -2308,6 +2931,7 @@ impl CultCache { entry.r#type )); } + require_payload_depth(&entry)?; if let Some(home) = self.home_index(&entry.r#type)? { self.stores[home].store.push(&entry)?; } @@ -2337,7 +2961,7 @@ impl CultCache { )); } - rmp_serde::from_slice(&entry.payload).with_context(|| { + decode_payload(&entry.payload).with_context(|| { format!( "failed to validate CultCache envelope {:?} at key {:?} as {}", T::TYPE, @@ -2511,18 +3135,16 @@ fn encode_store_snapshot(entries: &[CultCacheEnvelope]) -> Result Result> { let snapshot: PersistedStoreSnapshot = - rmp_serde::from_slice(bytes).context("failed to decode CultCache v1 snapshot")?; - if snapshot.0 != "cultcache.store.v1" { - return Err(anyhow!("unsupported CultCache snapshot {}", snapshot.0)); - } + decode_grown(bytes).context("failed to decode CultCache v1 snapshot")?; let catalog = snapshot .1 @@ -2660,6 +3282,47 @@ fn temporary_path_for(path: &Path) -> PathBuf { path.with_file_name(file_name) } +/// Writes and syncs the staged snapshot, closes it, and renames it over `destination`. +fn stage_and_replace(mut staged: File, staged_path: &Path, bytes: &[u8], destination: &Path) -> Result<()> { + use std::io::Write; + staged + .write_all(bytes) + .with_context(|| format!("failed to write {}", staged_path.display()))?; + injected_write_fault(WriteStep::StagingSync) + .and_then(|()| staged.sync_all()) + .with_context(|| format!("failed to sync {}", staged_path.display()))?; + drop(staged); + replace_file_atomically(staged_path, destination) +} + +/// Releases a lock taken around `result`'s action and returns that result. +/// +/// The policy for every lock in this crate: an unlock failure never replaces the action's +/// result, so a write that landed is reported as landed. The failure is discarded here +/// because these paths have no observer; the read-only snapshot, whose API offers one, +/// hands it to [`SingleFileMessagePackBackingStore::with_read_only_shared_snapshot_and_unlock_diagnostic`]. +/// +/// Dropping `lock` closes this descriptor, which releases the lock only when no other +/// descriptor shares its open file description. A child forked without exec holds such a +/// duplicate, and the lock then stays held until the child closes it or exits. +fn release_lock(lock: File, result: Result) -> Result { + let _unlock_failure_released_by_close = + injected_write_fault(WriteStep::Unlock).and_then(|()| fs2::FileExt::unlock(&lock)); + drop(lock); + result +} + +/// True only when nothing is at `path`; a symbolic link, dangling or not, is something. +/// A path that cannot be inspected (a file where a directory should be, no permission) +/// is an error, never absent. +fn is_absent(path: &Path) -> Result { + match fs::symlink_metadata(path) { + Ok(_) => Ok(false), + Err(error) if error.kind() == std::io::ErrorKind::NotFound => Ok(true), + Err(error) => Err(anyhow::Error::new(error).context(format!("failed to inspect {}", path.display()))), + } +} + fn remove_abandoned_staging_files(destination: &Path) -> Result<()> { let Some(parent) = destination.parent() else { return Ok(()); @@ -2803,11 +3466,41 @@ fn sync_parent_directory(path: &Path) -> Result<()> { let Some(parent) = path.parent() else { return Ok(()); }; - File::open(parent) + injected_write_fault(WriteStep::DirectorySync) + .and_then(|()| File::open(parent)) .and_then(|directory| directory.sync_all()) .with_context(|| format!("failed to sync {}", parent.display())) } +/// The steps no test can make fail for real: fsync and unlock do not fail on a healthy +/// filesystem. Tests arm one step on their own thread; builds outside tests never fail here. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[allow(dead_code)] +enum WriteStep { + StagingSync, + DirectorySync, + Unlock, +} + +#[cfg(test)] +thread_local! { + static INJECTED_WRITE_FAULT: std::cell::Cell> = const { std::cell::Cell::new(None) }; +} + +#[cfg(test)] +fn injected_write_fault(step: WriteStep) -> std::io::Result<()> { + if INJECTED_WRITE_FAULT.with(|fault| fault.get()) == Some(step) { + return Err(std::io::Error::other("injected write fault")); + } + Ok(()) +} + +#[cfg(not(test))] +#[inline(always)] +fn injected_write_fault(_step: WriteStep) -> std::io::Result<()> { + Ok(()) +} + #[cfg(windows)] fn sync_parent_directory(_path: &Path) -> Result<()> { // MoveFileExW with MOVEFILE_WRITE_THROUGH owns publication durability. @@ -2926,6 +3619,8 @@ mod tests { store.push(&released)?; let writer_path = store_path.clone(); + let gate_path = store_path.clone(); + let gate_released = released.clone(); let (started_tx, started_rx) = mpsc::channel(); let (finished_tx, finished_rx) = mpsc::channel(); store.with_read_only_shared_snapshot(|captured| { @@ -2940,15 +3635,21 @@ mod tests { writer.push(&engaged).unwrap(); finished_tx.send(()).unwrap(); }); - started_rx.recv_timeout(Duration::from_secs(1))?; + started_rx.recv_timeout(Duration::from_secs(30))?; assert!( finished_rx .recv_timeout(Duration::from_millis(100)) .is_err() ); + // The writer is still waiting on the gate: the file on disk is untouched. + assert_eq!( + SingleFileMessagePackBackingStore::new(&gate_path).pull_all_read_only_snapshot()?, + vec![gate_released.clone()] + ); Ok(()) })?; - finished_rx.recv_timeout(Duration::from_secs(1))?; + // The writer fsyncs twice once the gate opens; under IO pressure that is slow. + finished_rx.recv_timeout(Duration::from_secs(60))?; assert_eq!(store.pull_all()?[0].payload, b"engaged"); Ok(()) } @@ -4573,4 +5274,715 @@ mod tests { assert_eq!(store.pull_all_read_only_snapshot()?, vec![admitted]); Ok(()) } + + // Shared refusal vectors: tests/vectors/document-variants-c0, read by every runtime's tests. + const ITEM_SCHEMA_ID: &str = "sha256:88d3fdf0a927acf3b163940d8f8c7fe62b3316542ce771a67ec8bc038f594788"; + + fn pull_vector(name: &str) -> Result> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.msgpack"); + let vector = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../tests/vectors/document-variants-c0") + .join(name); + std::fs::copy(vector, &path)?; + SingleFileMessagePackBackingStore::new(&path).pull_all() + } + + fn refusal(name: &str) -> String { + format!("{:#}", pull_vector(name).unwrap_err()) + } + + #[test] + fn single_file_refuses_unknown_header_by_name() { + assert!(refusal("unknown-header.msgpack").contains("cultcache.store.v9")); + } + + #[test] + fn single_file_refuses_extra_record_slot_naming_the_record() { + let message = refusal("extra-slot-full-payload.msgpack"); + assert!(message.contains("item:anvil"), "{message}"); + assert!(message.contains(ITEM_SCHEMA_ID), "{message}"); + } + + #[test] + fn single_file_refuses_variant_store_by_version_or_record() { + let message = refusal("variant-v2.msgpack"); + assert!( + message.contains("cultcache.store.v2") || message.contains("item:anvil-big"), + "{message}" + ); + } + + // The store the C# runtime wrote through its own variant API (tests/vectors/document-variants-c1). + #[test] + fn single_file_refuses_the_csharp_written_variant_store_by_version_or_record() { + let message = refusal("../document-variants-c1/variant-store.msgpack"); + assert!( + message.contains("cultcache.store.v2") || message.contains("laser-big"), + "{message}" + ); + } + + #[test] + fn v1_store_written_at_the_base_commit_still_reads_byte_for_byte() -> Result<()> { + let envelopes = pull_vector("v1-base.msgpack")?; + let rows: Vec<_> = envelopes.iter().map(|e| (e.key.as_str(), e.r#type.as_str())).collect(); + assert_eq!(rows, vec![("alpha", "vectors.item"), ("beta", "vectors.item")]); + assert_eq!(envelopes[0].payload, b"\x92\xa5alpha\x01"); + assert_eq!(envelopes[1].payload, b"\x92\xa4beta\x02"); + Ok(()) + } + + // Store read and write faults: what a consumer can tell apart, and what a failed + // write leaves on disk. + + fn unreadable_kind(error: &anyhow::Error) -> Option { + error + .downcast_ref::() + .map(|unreadable| unreadable.kind) + } + + fn io_error_in(error: &anyhow::Error) -> Option<&std::io::Error> { + error.chain().find_map(|cause| cause.downcast_ref::()) + } + + /// A store of three records written by this runtime, returned with its bytes. + fn written_store(path: &Path) -> Result<(SingleFileMessagePackBackingStore, Vec)> { + let store = SingleFileMessagePackBackingStore::new(path); + let records = vec![ + snapshot_envelope("alpha", &[1; 64]), + snapshot_envelope("beta", &[2; 64]), + snapshot_envelope("gamma", &[3; 64]), + ]; + assert!(store.compare_exchange_snapshot(&[], &records)?); + let bytes = fs::read(path)?; + Ok((store, bytes)) + } + + #[test] + fn a_truncated_store_is_undecodable_on_every_read_and_is_left_as_it_was() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let (store, bytes) = written_store(&path)?; + let truncated = &bytes[..bytes.len() / 2]; + fs::write(&path, truncated)?; + + let failures = [ + store.pull_all().unwrap_err(), + store.pull_all_read_only_snapshot().unwrap_err(), + store + .compare_exchange_snapshot(&[], &[snapshot_envelope("delta", b"4")]) + .unwrap_err(), + ]; + for error in &failures { + assert_eq!(unreadable_kind(error), Some(CultCacheStoreUnreadableKind::Undecodable), "{error:#}"); + assert_eq!(error.downcast_ref::().unwrap().path, path); + assert!(error.to_string().contains(&path.display().to_string()), "{error}"); + assert!(io_error_in(error).is_none(), "{error:#}"); + } + assert_eq!(fs::read(&path)?, truncated); + Ok(()) + } + + #[test] + fn bytes_that_are_not_a_store_are_undecodable() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let store = SingleFileMessagePackBackingStore::new(&path); + // The last opens like a store, with a string where the header goes, but only a + // `cultcache.store.*` header claims a format this runtime might not read. + for bytes in [ + &b"not a store at all"[..], + &[0x92, 0xa3, b'a', b'b'][..], + &[0xc1][..], + &[0x92, 0xa2, b'a', b'b', 0x90][..], + &[0x93, 0xb0, b'c', b'u', b'l', b't', b'c', b'a', b'c', b'h', b'e', b'.', b's', b't', b'o', b'r', b'e', b'X', 0x90, 0x90][..], + ] { + fs::write(&path, bytes)?; + let error = store.pull_all().unwrap_err(); + assert_eq!(unreadable_kind(&error), Some(CultCacheStoreUnreadableKind::Undecodable), "{bytes:?}: {error:#}"); + } + Ok(()) + } + + #[test] + fn a_v1_store_holding_a_record_v1_does_not_allow_is_undecodable() { + let error = pull_vector("extra-slot-full-payload.msgpack").unwrap_err(); + assert_eq!(unreadable_kind(&error), Some(CultCacheStoreUnreadableKind::Undecodable), "{error:#}"); + } + + #[test] + fn a_store_in_a_format_this_runtime_does_not_read_is_unsupported_even_when_cut_short() -> Result<()> { + for name in ["unknown-header.msgpack", "variant-v2.msgpack", "../document-variants-c1/variant-store.msgpack"] { + let error = pull_vector(name).unwrap_err(); + assert_eq!(unreadable_kind(&error), Some(CultCacheStoreUnreadableKind::UnsupportedFormat), "{name}: {error:#}"); + } + + // The header is all this runtime judges: a newer store cut short is still a + // newer store, not a damaged one this runtime could replace. + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.msgpack"); + let vector = fs::read( + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../tests/vectors/document-variants-c0/unknown-header.msgpack"), + )?; + let truncated = &vector[..vector.len() / 2]; + fs::write(&path, truncated)?; + let store = SingleFileMessagePackBackingStore::new(&path); + for error in [store.pull_all().unwrap_err(), store.pull_all_read_only_snapshot().unwrap_err()] { + assert_eq!(unreadable_kind(&error), Some(CultCacheStoreUnreadableKind::UnsupportedFormat), "{error:#}"); + assert!(format!("{error:#}").contains("cultcache.store.v9"), "{error:#}"); + assert!(io_error_in(&error).is_none(), "{error:#}"); + } + assert_eq!(fs::read(&path)?, truncated); + Ok(()) + } + + #[test] + fn a_store_that_cannot_be_read_is_an_io_error_and_never_unreadable() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + fs::create_dir(&path)?; + let store = SingleFileMessagePackBackingStore::new(&path); + for error in [store.pull_all().unwrap_err(), store.pull_all_read_only_snapshot().unwrap_err()] { + assert!(io_error_in(&error).is_some(), "{error:#}"); + assert_eq!(unreadable_kind(&error), None, "{error:#}"); + } + Ok(()) + } + + /// Runs one write in a child process whose file-size limit is far below the + /// snapshot, with SIGXFSZ ignored so the write fails with EFBIG instead of + /// killing the child: a real mid-write failure after the staging file exists, + /// reached without permissions (the verification container runs as root). + #[cfg(unix)] + #[test] + fn a_write_that_fails_part_way_leaves_no_staging_file_and_keeps_the_store() -> Result<()> { + const CHILD_STORE: &str = "CULTCACHE_RS_FILE_SIZE_LIMITED_STORE"; + if let Ok(path) = std::env::var(CHILD_STORE) { + let mut store = SingleFileMessagePackBackingStore::new(path); + let error = store + .push(&snapshot_envelope("large", &vec![7; 1 << 20])) + .unwrap_err(); + let io = io_error_in(&error).expect("a size-limited write fails with an io::Error"); + assert_eq!(io.kind(), std::io::ErrorKind::FileTooLarge, "{error:#}"); + assert_eq!(write_failure_kind(&error), Some(CultCacheStoreWriteFailedKind::NotReplaced), "{error:#}"); + assert_eq!(unreadable_kind(&error), None, "{error:#}"); + return Ok(()); + } + + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let (store, before) = written_store(&path)?; + let child = std::process::Command::new("sh") + .arg("-c") + .arg("trap '' XFSZ; ulimit -f 64; exec \"$0\" --exact --test-threads=1 --quiet tests::a_write_that_fails_part_way_leaves_no_staging_file_and_keeps_the_store") + .arg(std::env::current_exe()?) + .env(CHILD_STORE, &path) + .output()?; + assert!( + child.status.success(), + "the size-limited child did not fail its write as expected: {} +{}{}", + child.status, + String::from_utf8_lossy(&child.stdout), + String::from_utf8_lossy(&child.stderr) + ); + + let staging: Vec<_> = fs::read_dir(temp.path())? + .map(|entry| entry.map(|entry| entry.file_name().to_string_lossy().into_owned())) + .collect::>>()? + .into_iter() + .filter(|name| name.starts_with("store.cc.") && name.ends_with(".tmp")) + .collect(); + assert_eq!(staging, Vec::::new()); + assert_eq!(fs::read(&path)?, before); + assert_eq!(store.pull_all()?.len(), 3); + Ok(()) + } + + /// Every read of a single-file store: the locked pull, the lock-free provider + /// snapshot, and the exchange a writer reads through. + fn every_read(store: &SingleFileMessagePackBackingStore) -> [Result>; 3] { + [ + store.pull_all(), + store.pull_all_read_only_snapshot(), + store + .compare_exchange_snapshot(&[], &[snapshot_envelope("delta", b"4")]) + .map(|_| Vec::new()), + ] + } + + fn assert_io_failure_on_every_read(store: &SingleFileMessagePackBackingStore) { + for result in every_read(store) { + let error = result.expect_err("a store that cannot be reached must not read as empty"); + let io = io_error_in(&error).expect("the failure to reach the store is an io::Error"); + assert_ne!(io.kind(), std::io::ErrorKind::NotFound, "{error:#}"); + assert_eq!(unreadable_kind(&error), None, "{error:#}"); + } + } + + #[test] + fn only_a_missing_store_reads_as_empty() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let store = SingleFileMessagePackBackingStore::new(&path); + assert!(store.pull_all()?.is_empty()); + assert!(store.pull_all_read_only_snapshot()?.is_empty()); + assert!(store.compare_exchange_snapshot(&[], &[snapshot_envelope("delta", b"4")])?); + + // A store whose lock file is gone is still a store, not an absent one. + fs::remove_file(store.lock_path())?; + assert_eq!(store.pull_all()?, vec![snapshot_envelope("delta", b"4")]); + Ok(()) + } + + #[cfg(unix)] + #[test] + fn a_store_behind_a_symlink_loop_is_an_io_error_on_every_read() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + std::os::unix::fs::symlink(&path, &path)?; + assert_io_failure_on_every_read(&SingleFileMessagePackBackingStore::new(&path)); + assert!(fs::symlink_metadata(&path)?.file_type().is_symlink()); + Ok(()) + } + + #[cfg(unix)] + #[test] + fn a_store_under_a_file_instead_of_a_directory_is_an_io_error_on_every_read() -> Result<()> { + let temp = tempfile::tempdir()?; + let parent = temp.path().join("body"); + fs::write(&parent, b"not a directory")?; + assert_io_failure_on_every_read(&SingleFileMessagePackBackingStore::new(parent.join("store.cc"))); + assert_eq!(fs::read(&parent)?, b"not a directory"); + Ok(()) + } + + #[test] + fn an_existing_empty_file_is_undecodable_and_is_left_as_it_was() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + fs::write(&path, b"")?; + let store = SingleFileMessagePackBackingStore::new(&path); + for result in every_read(&store) { + let error = result.expect_err("no CultCache writer leaves an empty file, so it is not a store"); + assert_eq!(unreadable_kind(&error), Some(CultCacheStoreUnreadableKind::Undecodable), "{error:#}"); + assert!(io_error_in(&error).is_none(), "{error:#}"); + } + assert_eq!(fs::read(&path)?, b""); + + // An empty array is the legacy envelope array with no envelopes: it has no + // header, so it claims no format, and it is an empty store. + fs::write(&path, [0x90])?; + assert!(store.pull_all()?.is_empty()); + assert!(store.pull_all_read_only_snapshot()?.is_empty()); + Ok(()) + } + + #[test] + fn a_newer_store_is_named_once_its_header_string_is_complete() -> Result<()> { + let vector = fs::read( + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../tests/vectors/document-variants-c0/unknown-header.msgpack"), + )?; + // One byte of array header, one of string header, then the 18-byte header string. + let header = "cultcache.store.v9"; + let header_end = 2 + header.len(); + assert_eq!(header_end, 20); + assert_eq!(&vector[2..header_end], header.as_bytes()); + + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let store = SingleFileMessagePackBackingStore::new(&path); + for length in 1..=vector.len() { + fs::write(&path, &vector[..length])?; + let error = store.pull_all().unwrap_err(); + let expected = if length < header_end { + CultCacheStoreUnreadableKind::Undecodable + } else { + CultCacheStoreUnreadableKind::UnsupportedFormat + }; + assert_eq!(unreadable_kind(&error), Some(expected), "cut to {length}: {error:#}"); + } + Ok(()) + } + + #[test] + fn refusals_say_what_was_found_without_blaming_variants() { + let unsupported = format!("{:#}", pull_vector("unknown-header.msgpack").unwrap_err()); + assert!(unsupported.contains("\"cultcache.store.v9\""), "{unsupported}"); + assert!(unsupported.contains("does not read"), "{unsupported}"); + assert!(!unsupported.contains("variant"), "{unsupported}"); + + // The C# reference refuses the same bytes: a v1 store with a longer record is + // not a store any runtime reads, so no upgrade is suggested. + let invalid = format!("{:#}", pull_vector("extra-slot-full-payload.msgpack").unwrap_err()); + assert!(invalid.contains("not a valid store"), "{invalid}"); + assert!(!invalid.contains("variant"), "{invalid}"); + assert!(!invalid.contains("runtime that"), "{invalid}"); + } + + /// The store path is a directory, so the staging file is written and synced and + /// then cannot be renamed over it: a failure after the write, reached without + /// permissions. + #[test] + fn a_write_that_fails_at_the_rename_leaves_no_staging_file() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + fs::create_dir(&path)?; + fs::write(path.join("kept"), b"kept")?; + let mut store = SingleFileMessagePackBackingStore::new(&path); + + let error = store + .push_all(&[snapshot_envelope("alpha", b"1")], PushAllOptions::default()) + .unwrap_err(); + assert!(format!("{error:#}").contains("failed to atomically replace"), "{error:#}"); + + let staging: Vec<_> = fs::read_dir(temp.path())? + .map(|entry| entry.map(|entry| entry.file_name().to_string_lossy().into_owned())) + .collect::>>()? + .into_iter() + .filter(|name| name.starts_with("store.cc.") && name.ends_with(".tmp")) + .collect(); + assert_eq!(staging, Vec::::new()); + assert_eq!(fs::read(path.join("kept"))?, b"kept"); + Ok(()) + } + + /// MessagePack bytes of a fixstr, for store fixtures built by hand. + fn fixstr(text: &str) -> Vec { + assert!(text.len() < 32); + let mut bytes = vec![0xa0 | text.len() as u8]; + bytes.extend_from_slice(text.as_bytes()); + bytes + } + + #[test] + fn a_refusal_never_echoes_a_value_from_the_store() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let store = SingleFileMessagePackBackingStore::new(&path); + + // A v1 store whose catalog holds a string where an entry goes, and a legacy + // envelope array holding a string where an envelope goes: the decoder's own + // message would quote both strings. + let mut v1 = vec![0x93]; + v1.extend(fixstr(STORE_FORMAT_V1)); + v1.push(0x91); + v1.extend(fixstr("SECRET-CATALOG-TEXT")); + v1.push(0x90); + let mut legacy = vec![0x91]; + legacy.extend(fixstr("SECRET-LEGACY-TEXT")); + for bytes in [v1, legacy] { + fs::write(&path, &bytes)?; + for result in every_read(&store) { + let error = result.unwrap_err(); + assert_eq!(unreadable_kind(&error), Some(CultCacheStoreUnreadableKind::Undecodable), "{error:#}"); + assert!(!format!("{error:#}").contains("SECRET"), "{error:#}"); + assert!(!format!("{error:?}").contains("SECRET"), "{error:?}"); + } + } + Ok(()) + } + + #[test] + fn a_header_is_echoed_only_in_the_known_shape() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let store = SingleFileMessagePackBackingStore::new(&path); + for (header, echoed) in [ + ("cultcache.store.v12", true), + ("cultcache.store.SECRET-HEADER", false), + ("cultcache.store.v12SECRET", false), + ("cultcache.store.v", false), + ] { + let mut bytes = vec![0x93]; + bytes.extend(fixstr(header)); + bytes.extend([0x90, 0x90]); + fs::write(&path, &bytes)?; + let error = store.pull_all().unwrap_err(); + let text = format!("{error:#}"); + assert_eq!(unreadable_kind(&error), Some(CultCacheStoreUnreadableKind::UnsupportedFormat), "{text}"); + if echoed { + assert!(text.contains(&format!("\"{header}\"")), "{text}"); + } else { + assert!(!text.contains(&format!("\"{header}\"")), "{text}"); + assert!(!text.contains("SECRET"), "{text}"); + assert!(text.contains(&format!("of {} bytes", header.len())), "{text}"); + } + } + Ok(()) + } + + /// Nothing at the store path is an empty store; a symbolic link whose target is + /// gone is something, and a writer must not rename a file over it. + #[cfg(unix)] + #[test] + fn a_dangling_symlink_at_the_store_path_is_an_error_and_nothing_is_written() -> Result<()> { + let temp = tempfile::tempdir()?; + let volume = temp.path().join("volume"); + fs::create_dir(&volume)?; + let target = volume.join("store.cc"); + let path = temp.path().join("store.cc"); + std::os::unix::fs::symlink(&target, &path)?; + let store = SingleFileMessagePackBackingStore::new(&path); + for result in every_read(&store) { + let error = result.expect_err("a dangling link must not read as an empty store"); + assert!(io_error_in(&error).is_some(), "{error:#}"); + assert_eq!(unreadable_kind(&error), None, "{error:#}"); + } + assert!(fs::symlink_metadata(&path)?.file_type().is_symlink()); + assert!(!target.exists()); + assert_eq!(fs::read_dir(&volume)?.count(), 0); + Ok(()) + } + + fn write_failure_kind(error: &anyhow::Error) -> Option { + error + .downcast_ref::() + .map(|failed| failed.kind) + } + + /// Runs `write` with `step` made to fail on this thread. + fn with_write_fault(step: WriteStep, write: impl FnOnce() -> T) -> T { + INJECTED_WRITE_FAULT.with(|fault| fault.set(Some(step))); + let result = write(); + INJECTED_WRITE_FAULT.with(|fault| fault.set(None)); + result + } + + #[test] + fn a_write_that_fails_before_the_rename_is_not_replaced_and_the_store_is_intact() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let (store, before) = written_store(&path)?; + let error = with_write_fault(WriteStep::StagingSync, || { + store.compare_exchange_snapshot(&store.pull_all().unwrap(), &[snapshot_envelope("delta", b"4")]) + }) + .unwrap_err(); + assert_eq!(write_failure_kind(&error), Some(CultCacheStoreWriteFailedKind::NotReplaced), "{error:#}"); + assert!(io_error_in(&error).is_some(), "{error:#}"); + assert!(error.to_string().contains(&format!("{} was not replaced", path.display())), "{error}"); + assert_eq!(fs::read(&path)?, before); + assert_eq!(fs::read_dir(temp.path())?.count(), 2, "only the store and its lock remain"); + + // The rename fails when the store path is a directory. + let blocked = temp.path().join("blocked.cc"); + fs::create_dir(&blocked)?; + let mut blocked_store = SingleFileMessagePackBackingStore::new(&blocked); + let error = blocked_store + .push_all(&[snapshot_envelope("alpha", b"1")], PushAllOptions::default()) + .unwrap_err(); + assert_eq!(write_failure_kind(&error), Some(CultCacheStoreWriteFailedKind::NotReplaced), "{error:#}"); + assert!(fs::metadata(&blocked)?.is_dir()); + Ok(()) + } + + #[cfg(unix)] + #[test] + fn a_write_whose_directory_sync_fails_is_replaced_but_not_durable() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let (store, _) = written_store(&path)?; + let replacement = vec![snapshot_envelope("delta", b"4")]; + let error = with_write_fault(WriteStep::DirectorySync, || { + store.compare_exchange_snapshot(&store.pull_all().unwrap(), &replacement) + }) + .unwrap_err(); + assert_eq!(write_failure_kind(&error), Some(CultCacheStoreWriteFailedKind::ReplacedNotDurable), "{error:#}"); + assert!(error.to_string().contains(&format!("{} was replaced, but the replacement is not yet durable", path.display())), "{error}"); + assert!(io_error_in(&error).is_some(), "{error:#}"); + assert_eq!(store.pull_all()?, replacement); + Ok(()) + } + + #[test] + fn a_write_failure_names_no_value_from_the_snapshot() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let store = SingleFileMessagePackBackingStore::new(&path); + let error = with_write_fault(WriteStep::StagingSync, || { + store.compare_exchange_snapshot(&[], &[snapshot_envelope("SECRET-KEY", b"SECRET-PAYLOAD")]) + }) + .unwrap_err(); + assert_eq!(write_failure_kind(&error), Some(CultCacheStoreWriteFailedKind::NotReplaced), "{error:#}"); + assert!(!format!("{error:#}").contains("SECRET"), "{error:#}"); + Ok(()) + } + + #[test] + fn a_write_that_landed_is_reported_as_landed_when_the_unlock_after_it_fails() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let (mut store, _) = written_store(&path)?; + let replacement = vec![snapshot_envelope("delta", b"4")]; + let exchanged = with_write_fault(WriteStep::Unlock, || { + store.compare_exchange_snapshot(&store.pull_all().unwrap(), &replacement) + })?; + assert!(exchanged); + assert_eq!(store.pull_all()?, replacement); + + let pushed = snapshot_envelope("epsilon", b"5"); + with_write_fault(WriteStep::Unlock, || store.push(&pushed))?; + assert!(with_write_fault(WriteStep::Unlock, || store.pull_all())?.contains(&pushed)); + + // The lock was released: another writer takes it at once. + assert!(matches!( + store.try_compare_exchange_snapshot(&store.pull_all()?, &replacement)?, + TryCompareExchangeSnapshotOutcome::Exchanged + )); + + // The keyed store releases its lock the same way. + let mut keyed = RedbMessagePackBackingStore::new(temp.path().join("keyed.redb"))?; + with_write_fault(WriteStep::Unlock, || keyed.push(&pushed))?; + assert_eq!(keyed.pull_all()?, vec![pushed]); + Ok(()) + } + + // What a write does through a symbolic link today. R3 decides whether a write + // resolves the link or refuses it; until then these pin the current behaviour so the + // change is deliberate. Reads refuse a dangling link (see the test above). + #[cfg(unix)] + #[test] + fn r3_decides_resolve_or_refuse_a_push_through_a_live_link_replaces_the_link() -> Result<()> { + let temp = tempfile::tempdir()?; + let volume = temp.path().join("volume"); + fs::create_dir(&volume)?; + let target = volume.join("store.cc"); + SingleFileMessagePackBackingStore::new(&target).push(&snapshot_envelope("a", b"1"))?; + let before = fs::read(&target)?; + let link = temp.path().join("store.cc"); + std::os::unix::fs::symlink(&target, &link)?; + + SingleFileMessagePackBackingStore::new(&link).push(&snapshot_envelope("b", b"2"))?; + assert!(fs::symlink_metadata(&link)?.file_type().is_file(), "the link was replaced by a regular file"); + assert_eq!(fs::read(&target)?, before, "the store the link pointed to is unchanged"); + Ok(()) + } + + #[cfg(unix)] + #[test] + fn r3_decides_resolve_or_refuse_a_push_all_through_a_dangling_link_replaces_the_link() -> Result<()> { + let temp = tempfile::tempdir()?; + let volume = temp.path().join("volume"); + fs::create_dir(&volume)?; + let link = temp.path().join("store.cc"); + std::os::unix::fs::symlink(volume.join("store.cc"), &link)?; + + SingleFileMessagePackBackingStore::new(&link).push_all(&[snapshot_envelope("a", b"1")], PushAllOptions::default())?; + assert!(fs::symlink_metadata(&link)?.file_type().is_file(), "the link was replaced by a regular file"); + assert_eq!(fs::read_dir(&volume)?.count(), 0, "nothing reached the link's volume"); + Ok(()) + } + + #[test] + fn a_keyed_store_refusal_never_echoes_a_stored_value() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("keyed.redb"); + let envelope = snapshot_envelope("k", b"1"); + RedbMessagePackBackingStore::new(&path)?.push(&envelope)?; + { + let database = redb::Database::create(&path)?; + let write = database.begin_write()?; + { + let mut table = write.open_table(REDB_ENVELOPES)?; + let keys: Vec> = table + .iter()? + .map(|row| row.map(|(key, _)| key.value().to_vec())) + .collect::>()?; + let mut value = vec![0xab]; + value.extend_from_slice(b"SECRET-REDB"); + for key in keys { + table.insert(key.as_slice(), value.as_slice())?; + } + } + write.commit()?; + } + let store = RedbMessagePackBackingStore::new(&path)?; + for error in [store.pull_all().unwrap_err(), store.compare_and_swap_entry(&envelope, snapshot_envelope("k", b"2")).unwrap_err()] { + assert!(format!("{error:#}").contains("failed to decode redb CultCache envelope"), "{error:#}"); + assert!(!format!("{error:#}").contains("SECRET"), "{error:#}"); + } + Ok(()) + } + + #[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)] + enum Choice { + Only, + } + + #[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)] + struct SkippedChoice { + #[serde(default, skip_serializing_if = "Option::is_none")] + choice: Option, + text: String, + } + + #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] + #[cultcache(type = "skipped-choice")] + struct ChoiceNote { + #[cultcache(key = 0)] + value: SkippedChoice, + } + + #[test] + fn a_document_decode_refusal_names_the_entry_and_never_a_stored_value() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + // A compact SkippedChoice with no choice is [text], so decoding it reads the text + // where the enum goes, and serde's own message would quote it as an unknown variant. + let secret = ChoiceNote { + value: SkippedChoice { + choice: None, + text: "SECRET-CHOICE".into(), + }, + }; + let mut payload = vec![0x91, 0x91, 0xad]; + payload.extend_from_slice(b"SECRET-CHOICE"); + let malformed = CultCacheEnvelope { + key: "k".into(), + r#type: ::TYPE.into(), + payload, + stored_at: "2026-09-30T00:00:00Z".into(), + schema_id: None, + }; + SingleFileMessagePackBackingStore::new(&path).push(&malformed)?; + let mut cache = CultCache::new(); + cache.register_entry_type::()?; + cache.add_generic_backing_store(SingleFileMessagePackBackingStore::new(&path))?; + cache.pull_all_backing_stores()?; + + let refusals = [ + ("get", cache.get::("k").unwrap_err()), + ("get_all", cache.get_all::().unwrap_err()), + ("get_all_with_keys", cache.get_all_with_keys::().unwrap_err()), + ("put_envelope", cache.put_envelope::(malformed.clone()).unwrap_err()), + ("prepare_entry", cache.prepare_entry("compact", &secret).unwrap_err()), + ]; + for (path, error) in refusals { + let text = format!("{error:#}"); + assert!(!text.contains("SECRET"), "{path}: {text}"); + assert!(text.contains("CultCache"), "{path}: {text}"); + } + Ok(()) + } + + #[test] + fn a_snapshot_the_store_cannot_hold_is_rejected_before_any_write() -> Result<()> { + let temp = tempfile::tempdir()?; + let path = temp.path().join("store.cc"); + let (store, before) = written_store(&path)?; + let mut first = snapshot_envelope("x", b"1"); + first.schema_id = Some("shared".into()); + let mut second = snapshot_envelope("y", b"2"); + second.r#type = "other".into(); + second.schema_id = Some("shared".into()); + let error = store + .compare_exchange_snapshot(&store.pull_all()?, &[first, second]) + .unwrap_err(); + assert_eq!(write_failure_kind(&error), Some(CultCacheStoreWriteFailedKind::Rejected), "{error:#}"); + assert!(error.to_string().contains("refused a snapshot it cannot store"), "{error}"); + assert!(io_error_in(&error).is_none(), "{error:#}"); + assert_eq!(fs::read(&path)?, before); + Ok(()) + } } diff --git a/packages/cultcache-rs/tests/decode_stack.rs b/packages/cultcache-rs/tests/decode_stack.rs new file mode 100644 index 00000000..5e31df49 --- /dev/null +++ b/packages/cultcache-rs/tests/decode_stack.rs @@ -0,0 +1,478 @@ +//! Typed decode never aborts a payload inside the nesting bound, whatever the caller's stack, for +//! every record the derives accept (up to `MAX_RECORD_INLINE_BYTES` inline); envelope reads of a +//! store go through the same grown decoder. +//! Each test runs its decode in a child test process on a thread of a stated size, so an abort +//! fails one named test. Values are built, encoded, compared and dropped on a large thread; only +//! the decode runs on the small one. + +use cultcache_rs::CacheBackingStore; +use cultcache_rs::CultCacheEnvelope; +use cultcache_rs::CultCacheStoreUnreadable; +use cultcache_rs::CultCacheStoreUnreadableKind; +use cultcache_rs::CultSlots; +use cultcache_rs::CultUnion; +use cultcache_rs::MAX_PAYLOAD_DEPTH; +use cultcache_rs::MAX_RECORD_INLINE_BYTES; +use cultcache_rs::PayloadTooDeep; +use cultcache_rs::RedbMessagePackBackingStore; +use cultcache_rs::SingleFileMessagePackBackingStore; +use cultcache_rs::check_payload_depth; +use cultcache_rs::decode_payload; +use serde::de::DeserializeOwned; + +const CHILD_MARKER: &str = "CULTCACHE_DECODE_STACK_CHILD"; +const KIB: usize = 1024; + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct Wide32 { + #[cultcache(key = 0)] + a0: [u64; 32], + #[cultcache(key = 1)] + a1: [u64; 32], + #[cultcache(key = 2)] + a2: [u64; 32], + #[cultcache(key = 3)] + a3: [u64; 32], + #[cultcache(key = 4)] + a4: [u64; 32], + #[cultcache(key = 5)] + a5: [u64; 32], + #[cultcache(key = 6)] + a6: [u64; 32], + #[cultcache(key = 7)] + a7: [u64; 32], + #[cultcache(key = 8)] + a8: [u64; 32], + #[cultcache(key = 9)] + a9: [u64; 32], + #[cultcache(key = 10)] + a10: [u64; 32], + #[cultcache(key = 11)] + a11: [u64; 32], + #[cultcache(key = 12)] + a12: [u64; 32], + #[cultcache(key = 13)] + a13: [u64; 32], + #[cultcache(key = 14)] + a14: [u64; 32], + #[cultcache(key = 15)] + a15: [u64; 32], + #[cultcache(key = 16)] + a16: [u64; 32], + #[cultcache(key = 17)] + a17: [u64; 32], + #[cultcache(key = 18)] + a18: [u64; 32], + #[cultcache(key = 19)] + a19: [u64; 32], + #[cultcache(key = 20)] + a20: [u64; 32], + #[cultcache(key = 21)] + a21: [u64; 32], + #[cultcache(key = 22)] + a22: [u64; 32], + #[cultcache(key = 23)] + a23: [u64; 32], + #[cultcache(key = 24)] + a24: [u64; 32], + #[cultcache(key = 25)] + a25: [u64; 32], + #[cultcache(key = 26)] + a26: [u64; 32], + #[cultcache(key = 27)] + a27: [u64; 32], + #[cultcache(key = 28)] + a28: [u64; 32], + #[cultcache(key = 29)] + a29: [u64; 32], + #[cultcache(key = 30)] + a30: [u64; 32], + #[cultcache(key = 31)] + a31: [u64; 32], + #[cultcache(key = 32)] + next: Option>, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct One { + #[cultcache(key = 0)] + a: u8, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct DynamicSlot { + #[cultcache(key = 0)] + v: serde_json::Value, +} + +/// Runs `body` on a thread with a stack of `bytes`, returning what it returns. +fn on_stack(bytes: usize, body: impl FnOnce() -> R + Send + 'static) -> R { + std::thread::Builder::new().stack_size(bytes).spawn(body).unwrap().join().unwrap() +} + +/// Runs `body` in a child process that runs only the test `name`; the parent passes when the +/// child exits cleanly having run exactly that one test. An abort in the child fails the parent. +fn in_child(name: &str, body: impl FnOnce()) { + if std::env::var_os(CHILD_MARKER).is_some() { + body(); + return; + } + let output = std::process::Command::new(std::env::current_exe().unwrap()) + .args([name, "--exact", "--nocapture", "--test-threads=1"]) + .env(CHILD_MARKER, "1") + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + assert!( + output.status.success() && stdout.contains("1 passed"), + "child {name} failed: {:?} +{stdout} +{stderr}", + output.status + ); +} + +/// A chain of `levels` Wide32 records: `levels` containers deep, plus one for its last arrays. +fn wide_chain(levels: usize) -> Wide32 { + let mut chain: Option> = None; + for level in (0..levels).rev() { + let mut node = Wide32 { next: chain, ..empty_wide() }; + node.a0[0] = level as u64; + chain = Some(Box::new(node)); + } + *chain.unwrap() +} + +fn empty_wide() -> Wide32 { + Wide32 { + a0: [0; 32], + a1: [0; 32], + a2: [0; 32], + a3: [0; 32], + a4: [0; 32], + a5: [0; 32], + a6: [0; 32], + a7: [0; 32], + a8: [0; 32], + a9: [0; 32], + a10: [0; 32], + a11: [0; 32], + a12: [0; 32], + a13: [0; 32], + a14: [0; 32], + a15: [0; 32], + a16: [0; 32], + a17: [0; 32], + a18: [0; 32], + a19: [0; 32], + a20: [0; 32], + a21: [0; 32], + a22: [0; 32], + a23: [0; 32], + a24: [0; 32], + a25: [0; 32], + a26: [0; 32], + a27: [0; 32], + a28: [0; 32], + a29: [0; 32], + a30: [0; 32], + a31: [0; 32], + next: None, + } +} + +/// The decode alone runs on the small thread. Its result is boxed there so that the thread's own +/// return machinery, which would hold several more copies of a large record in a debug build, does +/// not count against the stack under test; what the caller's frames hold is the caller's to size. +fn decode_on(stack: usize, bytes: Vec) -> anyhow::Result { + *on_stack(stack, move || Box::new(decode_payload::(&bytes))) +} + +#[test] +fn a_wide_record_at_the_limit_decodes_on_a_1mib_thread() { + in_child("a_wide_record_at_the_limit_decodes_on_a_1mib_thread", || { + let bytes = on_stack(64 * KIB * KIB, || { + rmp_serde::to_vec(&wide_chain(MAX_PAYLOAD_DEPTH - 1)).unwrap() + }); + let decoded = decode_on::(1024 * KIB, bytes).unwrap(); + on_stack(64 * KIB * KIB, move || { + assert!(decoded == wide_chain(MAX_PAYLOAD_DEPTH - 1)); + }); + }); +} + +#[test] +fn one_past_the_limit_is_refused_typed_on_a_1mib_thread() { + in_child("one_past_the_limit_is_refused_typed_on_a_1mib_thread", || { + let bytes = on_stack(64 * KIB * KIB, || { + rmp_serde::to_vec(&wide_chain(MAX_PAYLOAD_DEPTH)).unwrap() + }); + let error = decode_on::(1024 * KIB, bytes).unwrap_err(); + assert_eq!( + error.downcast_ref::(), + Some(&PayloadTooDeep { depth: MAX_PAYLOAD_DEPTH + 1, limit: MAX_PAYLOAD_DEPTH }) + ); + }); +} + +#[test] +fn a_foreign_value_at_the_limit_decodes_on_a_64kib_thread() { + in_child("a_foreign_value_at_the_limit_decodes_on_a_64kib_thread", || { + // The slot's array is depth 1, so 255 nested arrays under it reach depth 256. + let value = on_stack(64 * KIB * KIB, || { + let mut value = serde_json::Value::Null; + for _ in 0..MAX_PAYLOAD_DEPTH - 1 { + value = serde_json::Value::Array(vec![value]); + } + value + }); + let expected = DynamicSlot { v: value }; + let bytes = on_stack(64 * KIB * KIB, { + let expected = expected.clone(); + move || rmp_serde::to_vec(&expected).unwrap() + }); + let decoded = decode_on::(64 * KIB, bytes).unwrap(); + on_stack(64 * KIB * KIB, move || { + assert!(decoded == expected); + drop(expected); + }); + }); +} + +#[test] +fn a_skipped_slot_at_the_limit_decodes_on_a_64kib_thread() { + in_child("a_skipped_slot_at_the_limit_decodes_on_a_64kib_thread", || { + // [1, [[...]]]: slot 1 is unknown to One and is skipped; the whole payload is 256 deep. + let mut bytes = vec![0x92u8, 0x01]; + bytes.extend(std::iter::repeat_n(0x91u8, MAX_PAYLOAD_DEPTH - 2)); + bytes.push(0x90); + let decoded = decode_on::(64 * KIB, bytes).unwrap(); + assert_eq!(decoded, One { a: 1 }); + }); +} + +// A record the derives accept at the bound: two slots of 31 arrays of 32 words, 15,880 bytes inline. +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct Largest { + #[cultcache(key = 0)] + a: [[u64; 32]; 31], + #[cultcache(key = 1)] + b: [[u64; 32]; 31], + #[cultcache(key = 2)] + next: Option>, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct LargestUnionArm { + #[cultcache(key = 0)] + a: [[u64; 32]; 31], + #[cultcache(key = 1)] + b: [[u64; 32]; 31], + #[cultcache(key = 2)] + next: Option>, +} + +// The fixture is the largest arm the derives accept next to a unit variant, which is the point. +#[allow(clippy::large_enum_variant)] +#[derive(Clone, Debug, PartialEq, CultUnion)] +enum LargestUnion { + #[cultcache(key = 0)] + Arm(LargestUnionArm), + #[cultcache(key = 1)] + Leaf, +} + +// The fixtures sit within a KiB under the bound, so a decode that survives them survives any record. +const _: () = assert!( + std::mem::size_of::() <= MAX_RECORD_INLINE_BYTES + && std::mem::size_of::() + KIB >= MAX_RECORD_INLINE_BYTES + && std::mem::size_of::() <= MAX_RECORD_INLINE_BYTES + && std::mem::size_of::() + KIB >= MAX_RECORD_INLINE_BYTES +); + +fn largest_chain(levels: usize) -> Largest { + let mut chain: Option> = None; + for level in (0..levels).rev() { + let mut a = [[0u64; 32]; 31]; + a[0][0] = level as u64; + chain = Some(Box::new(Largest { a, b: [[0; 32]; 31], next: chain })); + } + *chain.unwrap() +} + +fn union_chain(levels: usize) -> LargestUnion { + let mut chain = LargestUnion::Leaf; + for level in (0..levels).rev() { + let mut a = [[0u64; 32]; 31]; + a[0][0] = level as u64; + chain = LargestUnion::Arm(LargestUnionArm { a, b: [[0; 32]; 31], next: Some(Box::new(chain)) }); + } + chain +} + +#[test] +fn a_wide_record_20_levels_deep_decodes_on_a_1mib_thread() { + in_child("a_wide_record_20_levels_deep_decodes_on_a_1mib_thread", || decode_wide_chain(20, 1024 * KIB)); +} + +#[test] +fn a_wide_record_100_levels_deep_decodes_on_a_1mib_thread() { + in_child("a_wide_record_100_levels_deep_decodes_on_a_1mib_thread", || decode_wide_chain(100, 1024 * KIB)); +} + +#[test] +fn a_wide_record_decodes_on_a_96kib_thread_at_one_level_and_at_the_limit() { + in_child("a_wide_record_decodes_on_a_96kib_thread_at_one_level_and_at_the_limit", || { + decode_wide_chain(1, 96 * KIB); + decode_wide_chain(MAX_PAYLOAD_DEPTH - 1, 96 * KIB); + }); +} + +#[test] +fn the_largest_record_decodes_on_an_88kib_thread_at_one_level() { + in_child("the_largest_record_decodes_on_an_88kib_thread_at_one_level", || { + // The door's own floor, not the payload, decides this size: one Largest level, boxed as decode_on + // does, needs 72 KiB in debug and 56 in release with the outer stack check, and 104 in release + // without it. + let bytes = on_stack(64 * KIB * KIB, || rmp_serde::to_vec(&largest_chain(1)).unwrap()); + let decoded = decode_on::(88 * KIB, bytes).unwrap(); + on_stack(64 * KIB * KIB, move || assert!(decoded == largest_chain(1))); + }); +} + +fn decode_wide_chain(levels: usize, stack: usize) { + let bytes = on_stack(64 * KIB * KIB, move || rmp_serde::to_vec(&wide_chain(levels)).unwrap()); + let decoded = decode_on::(stack, bytes).unwrap(); + on_stack(64 * KIB * KIB, move || assert!(decoded == wide_chain(levels))); +} + +#[test] +fn the_largest_record_at_the_limit_decodes_on_every_thread_size() { + in_child("the_largest_record_at_the_limit_decodes_on_every_thread_size", || { + // 254 records of Largest are 256 containers deep (each is one, its slots' arrays two more); + // 127 union levels are the same (a union and its arm are two each, the leaf's arrays two). + let (records, unions) = on_stack(64 * KIB * KIB, || { + let records = rmp_serde::to_vec(&largest_chain(254)).unwrap(); + let unions = rmp_serde::to_vec(&union_chain(127)).unwrap(); + assert!(check_payload_depth(&records).is_ok()); + assert!(check_payload_depth(&unions).is_ok()); + assert!(check_payload_depth(&rmp_serde::to_vec(&largest_chain(255)).unwrap()).is_err()); + assert!(check_payload_depth(&rmp_serde::to_vec(&union_chain(128)).unwrap()).is_err()); + (records, unions) + }); + let sizes = (160..=1024).step_by(32).map(|kib| kib * KIB).chain([1536, 2048, 3072, 4096, 8192].map(|kib| kib * KIB)); + for size in sizes { + println!("thread of {} KiB", size / KIB); + let decoded = decode_on::(size, records.clone()).unwrap(); + let decoded_union = decode_on::(size, unions.clone()).unwrap(); + on_stack(64 * KIB * KIB, move || { + assert!(decoded == largest_chain(254)); + assert!(decoded_union == union_chain(127)); + }); + } + }); +} + +/// One stored envelope, `{key: "k", type: "t", payload: bin[1], storedAt: "s", extra: [[[...]]]}`, +/// whose unknown key nests 1000 containers deep and is skipped without a payload walk. +fn deep_envelope() -> Vec { + let mut bytes = vec![0x85]; + for (name, value) in [("key", &[0xa1, b'k'][..]), ("type", &[0xa1, b't']), ("payload", &[0xc4, 1, 1]), ("storedAt", &[0xa1, b's'])] { + bytes.push(0xa0 | name.len() as u8); + bytes.extend(name.as_bytes()); + bytes.extend(value); + } + bytes.extend([0xa5, b'e', b'x', b't', b'r', b'a']); + bytes.extend(std::iter::repeat_n(0x91u8, 999)); + bytes.push(0x90); + bytes +} + +fn fixstr(text: &str) -> Vec { + let mut bytes = vec![0xa0 | text.len() as u8]; + bytes.extend(text.as_bytes()); + bytes +} + +#[test] +fn a_legacy_store_with_a_deep_unknown_envelope_key_reads_on_a_64kib_thread() { + in_child("a_legacy_store_with_a_deep_unknown_envelope_key_reads_on_a_64kib_thread", || { + let directory = tempfile::tempdir().unwrap(); + let path = directory.path().join("legacy.cc"); + std::fs::write(&path, [vec![0x91], deep_envelope()].concat()).unwrap(); + let entries = on_stack(64 * KIB, move || SingleFileMessagePackBackingStore::new(path).pull_all_read_only_snapshot()).unwrap(); + assert_eq!(entries.len(), 1); + assert_eq!(entries[0].key, "k"); + }); +} + +#[test] +fn a_v1_store_with_a_deep_fifth_record_slot_is_refused_typed_on_a_64kib_thread() { + in_child("a_v1_store_with_a_deep_fifth_record_slot_is_refused_typed_on_a_64kib_thread", || { + // [header, [], [[key, schema, storedAt, payload, [[[...]]]]]]: the record's unknown fifth slot is + // skipped 1000 containers deep, then the record is refused. + let mut bytes = vec![0x93]; + bytes.extend(fixstr("cultcache.store.v1")); + bytes.extend([0x90, 0x91, 0x95]); + for text in ["k", "s", "t"] { + bytes.extend(fixstr(text)); + } + bytes.extend([0xc4, 1, 1]); + bytes.extend(std::iter::repeat_n(0x91u8, 999)); + bytes.push(0x90); + let directory = tempfile::tempdir().unwrap(); + let path = directory.path().join("v1.cc"); + std::fs::write(&path, bytes).unwrap(); + let error = on_stack(64 * KIB, move || SingleFileMessagePackBackingStore::new(path).pull_all_read_only_snapshot()).unwrap_err(); + let unreadable = error.downcast_ref::().expect("a typed refusal"); + assert!(matches!(unreadable.kind, CultCacheStoreUnreadableKind::Undecodable)); + }); +} + +/// A redb store holding the one deep envelope under its identity, `["t", "k"]`. +fn redb_with_deep_row(path: &std::path::Path) { + let database = redb::Database::create(path).unwrap(); + let write = database.begin_write().unwrap(); + { + let mut table = write + .open_table(redb::TableDefinition::<&[u8], &[u8]>::new("cultcache_envelopes")) + .unwrap(); + table.insert([0x92, 0xa1, b't', 0xa1, b'k'].as_slice(), deep_envelope().as_slice()).unwrap(); + } + write.commit().unwrap(); +} + +#[test] +fn a_redb_store_with_a_deep_unknown_envelope_key_reads_on_a_104kib_thread() { + in_child("a_redb_store_with_a_deep_unknown_envelope_key_reads_on_a_104kib_thread", || { + let directory = tempfile::tempdir().unwrap(); + let path = directory.path().join("rows.redb"); + redb_with_deep_row(&path); + let entries = on_stack(104 * KIB, move || RedbMessagePackBackingStore::new(path).unwrap().pull_all()).unwrap(); + assert_eq!(entries.len(), 1); + assert_eq!(entries[0].key, "k"); + }); +} + +#[test] +fn a_redb_compare_and_swap_reads_a_deep_unknown_envelope_key_on_a_104kib_thread() { + in_child("a_redb_compare_and_swap_reads_a_deep_unknown_envelope_key_on_a_104kib_thread", || { + let directory = tempfile::tempdir().unwrap(); + let path = directory.path().join("rows.redb"); + redb_with_deep_row(&path); + let expected = CultCacheEnvelope { + key: "k".into(), + r#type: "t".into(), + payload: vec![1], + stored_at: "s".into(), + schema_id: None, + }; + let replacement = CultCacheEnvelope { payload: vec![2], ..expected.clone() }; + let swapped = on_stack(104 * KIB, move || { + RedbMessagePackBackingStore::new(path).unwrap().compare_and_swap_entry(&expected, replacement) + }) + .unwrap(); + assert!(swapped); + }); +} diff --git a/packages/cultcache-rs/tests/union_parity.rs b/packages/cultcache-rs/tests/union_parity.rs new file mode 100644 index 00000000..6b120791 --- /dev/null +++ b/packages/cultcache-rs/tests/union_parity.rs @@ -0,0 +1,1012 @@ +//! The Rust runtime held to tests/vectors/union-parity, written by the C# reference. +//! Bytes and outcomes are read from the committed files; only the constructed value is spelled here. + +use std::path::PathBuf; + +use cultcache_rs::CultCache; +use cultcache_rs::CacheBackingStore; +use cultcache_rs::CultCacheEnvelope; +use cultcache_rs::MAX_PAYLOAD_DEPTH; +use cultcache_rs::PayloadTooDeep; +use cultcache_rs::check_payload_depth; +use cultcache_rs::CultSlots; +use cultcache_rs::CultUnion; +use cultcache_rs::DatabaseEntry; +use cultcache_rs::SingleFileMessagePackBackingStore; + +#[derive(Clone, Debug, PartialEq, CultUnion)] +enum Node { + #[cultcache(key = 0)] + Box(BoxArm), + #[cultcache(key = 1)] + Text(TextArm), + #[cultcache(key = 2)] + Use(UseArm), + #[cultcache(key = 5)] + Image(ImageArm), + #[cultcache(key = 6)] + Wrap(WrapArm), +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct WrapArm { + #[cultcache(key = 0)] + inner: Option>, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct BoxArm { + #[cultcache(key = 0)] + id: String, + #[cultcache(key = 1)] + children: Vec, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct TextArm { + #[cultcache(key = 0)] + id: String, + #[cultcache(key = 1)] + content: String, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct UseArm { + #[cultcache(key = 0)] + id: String, + #[cultcache(key = 1)] + composition: Composition, + #[cultcache(key = 2)] + slots: Vec>, +} + +// Slot 2 is retired: a gap written nil. +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct ImageArm { + #[cultcache(key = 0)] + id: String, + #[cultcache(key = 1)] + uri: String, + #[cultcache(key = 3)] + alt: String, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct Composition { + #[cultcache(key = 0)] + name: String, + #[cultcache(key = 1)] + body: Option>, +} + +#[derive(Clone, Debug, PartialEq, CultUnion)] +enum Outcome { + #[cultcache(key = 0)] + Pending(PendingArm), + #[cultcache(key = 1)] + Completed(CompletedArm), + #[cultcache(key = 2)] + Denied, + #[cultcache(key = -2147483648)] + Floor, + #[cultcache(key = 2147483647)] + Ceiling, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct PendingArm { + #[cultcache(key = 0)] + message: String, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct CompletedArm { + #[cultcache(key = 0)] + source_version: i32, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct NamedArm { + #[cultcache(key = 0)] + name: String, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct UsesArm { + #[cultcache(key = 0)] + name: String, + #[cultcache(key = 1)] + uses: i32, +} + +#[derive(Clone, Debug, PartialEq, CultSlots)] +struct CountArm { + #[cultcache(key = 0)] + name: String, + #[cultcache(key = 1)] + count: i32, +} + +#[derive(Clone, Debug, PartialEq, CultUnion)] +enum Item { + #[cultcache(key = 0)] + Gem(NamedArm), + #[cultcache(key = 1)] + Tool(UsesArm), + #[cultcache(key = 2)] + Part(CountArm), +} + +// The same arms as Item under its own keys: key 2 is unknown to it. +#[derive(Clone, Debug, PartialEq, CultUnion)] +enum CraftedItem { + #[cultcache(key = 0)] + Tool(UsesArm), + #[cultcache(key = 1)] + Part(CountArm), +} + +#[derive(Clone, Debug, PartialEq, DatabaseEntry)] +#[cultcache(type = "tests.union_surface", schema = "tests.union_surface.v1")] +struct UnionSurface { + #[cultcache(key = 0)] + id: String, + #[cultcache(key = 1)] + version: i32, + #[cultcache(key = 2)] + root: Option, + #[cultcache(key = 3)] + outcomes: Vec, + #[cultcache(key = 4)] + part: Option, + #[cultcache(key = 5)] + crafted: Option, + #[cultcache(key = 6)] + missing: Option, +} + +fn text(id: &str, content: &str) -> Node { + Node::Text(TextArm { id: id.into(), content: content.into() }) +} + +fn image(id: &str, uri: &str, alt: &str) -> Node { + Node::Image(ImageArm { id: id.into(), uri: uri.into(), alt: alt.into() }) +} + +fn boxed(id: &str, children: Vec) -> Node { + Node::Box(BoxArm { id: id.into(), children }) +} + +fn constructed() -> UnionSurface { + let inner = boxed("inner", vec![text("deep", "x"), image("img", "uri://a", "alt")]); + UnionSurface { + id: "surface".into(), + version: 3, + root: Some(boxed( + "root", + vec![ + text("t1", "hello"), + Node::Use(UseArm { + id: "u1".into(), + composition: Composition { name: "comp".into(), body: Some(std::boxed::Box::new(inner)) }, + slots: vec![Some(text("s1", "slot")), None, Some(boxed("b2", vec![]))], + }), + image("i2", "uri://b", ""), + ], + )), + outcomes: vec![ + Outcome::Pending(PendingArm { message: "wait".into() }), + Outcome::Completed(CompletedArm { source_version: 7 }), + Outcome::Denied, + ], + part: Some(Item::Tool(UsesArm { name: "hammer".into(), uses: 12 })), + crafted: Some(CraftedItem::Part(CountArm { name: "gear".into(), count: 4 })), + missing: None, + } +} + +fn vector(name: &str) -> Vec { + let path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../tests/vectors/union-parity") + .join(name); + std::fs::read(&path).unwrap_or_else(|error| panic!("{}: {error}", path.display())) +} + +fn decode(bytes: &[u8]) -> Result { + rmp_serde::from_slice(bytes).map_err(|error| error.to_string()) +} + +#[test] +fn union_surface_decodes_and_reencodes() { + let payload = vector("union-surface.msgpack"); + let value = constructed(); + assert_eq!(decode(&payload).unwrap(), value); + assert_eq!(rmp_serde::to_vec(&value).unwrap(), payload); +} + +#[test] +fn a_unit_arm_is_a_key_and_an_empty_slots_array() { + assert_eq!(rmp_serde::to_vec(&Outcome::Denied).unwrap(), [0x92, 0x02, 0x90]); + assert_eq!(rmp_serde::from_slice::(&[0x92, 0x02, 0x90]).unwrap(), Outcome::Denied); +} + +#[test] +fn union_refusal_vectors() { + let outcomes: Vec<(String, String, String, Option, String)> = + rmp_serde::from_slice(&vector("outcomes.msgpack")).unwrap(); + let (mut refused, mut read_only) = (0, 0); + for (file, outcome, union, key, detail) in outcomes { + let result = decode(&vector(&file)); + match outcome.as_str() { + "refused" => { + refused += 1; + let message = result.expect_err(&file); + assert!(message.contains(&union), "{file}: {message}"); + if detail == "unknown-arm" { + let key = key.expect(&file); + assert!(message.contains(&format!("unknown arm key {key} ")), "{file}: {message}"); + } + for canary in ["root", "hello", "uri://", "surface"] { + assert!(!message.contains(canary), "{file} echoed a value: {message}"); + } + } + "read-only" => { + read_only += 1; + assert_eq!(result.expect(&file), constructed(), "{file}"); + } + other => panic!("{file}: unknown outcome {other}"), + } + } + assert_eq!((refused, read_only), (5, 4)); +} + +// A nil where the arm's slots belong is not an empty record, for an arm with slots and a unit arm. +#[test] +fn nil_slots_are_refused_naming_the_union_and_the_key() { + for (bytes, key) in [(vec![0x92, 0x01, 0xc0], "1"), (vec![0x92, 0x02, 0xc0], "2")] { + let message = rmp_serde::from_slice::(&bytes).unwrap_err().to_string(); + assert!(message.contains("Outcome") && message.contains(&format!("arm {key} has nil slots")), "{message}"); + } +} + +#[test] +fn an_unknown_arm_lists_the_declared_keys_and_never_echoes_the_payload() { + // Shaped like a real arm, an array of strings, under an undeclared key. + let bytes = rmp_serde::to_vec(&(99u64, ("CANARY-7f3a", "CANARY-91bc"))).unwrap(); + let message = rmp_serde::from_slice::(&bytes).unwrap_err().to_string(); + assert!(message.contains("Node") && message.contains("99") && message.contains("0, 1, 2, 5"), "{message}"); + assert!(!message.contains("CANARY"), "{message}"); +} + +#[test] +fn a_union_that_is_not_a_key_and_slots_pair_is_refused_naming_the_enum() { + let cases: [(&str, Vec); 4] = [ + ("an empty array", vec![0x90]), + ("a trailing element", rmp_serde::to_vec(&(1u64, (7u8,), 0u8)).unwrap()), + ("a string key", rmp_serde::to_vec(&("CANARY-key", (7u8,))).unwrap()), + ("a unit arm with slots", rmp_serde::to_vec(&(2u64, ("CANARY-slot",))).unwrap()), + ]; + for (label, bytes) in cases { + let message = rmp_serde::from_slice::(&bytes).unwrap_err().to_string(); + assert!(message.contains("Outcome"), "{label}: {message}"); + assert!(!message.contains("CANARY"), "{label}: {message}"); + } +} + +// A plain derive struct: the door names a missing or duplicated field (a static name from the type) +// and describes a mistyped value by kind, never quoting it. +#[derive(Debug, serde::Deserialize)] +#[allow(dead_code)] +struct Probe { + name: String, + flag: bool, +} + +#[test] +fn a_missing_or_duplicate_field_is_named_and_a_mistyped_value_is_not() { + let name = |value: &str| [&[0xa4][..], b"name", &[0xa0 | value.len() as u8][..], value.as_bytes()].concat(); + let flag_true = [&[0xa4][..], b"flag", &[0xc3][..]].concat(); + + let missing = [&[0x81][..], &name("a")].concat(); + let message = cultcache_rs::decode_payload::(&missing).unwrap_err().to_string(); + assert!(message.contains("missing field `flag`"), "{message}"); + + let duplicated = [&[0x83][..], &name("a"), &name("b"), &flag_true].concat(); + let message = cultcache_rs::decode_payload::(&duplicated).unwrap_err().to_string(); + assert!(message.contains("duplicate field `name`"), "{message}"); + + let canary = "CANARY-3d9e"; + let flag_text = [&[0xa4][..], b"flag", &[0xa0 | canary.len() as u8][..], canary.as_bytes()].concat(); + let mistyped = [&[0x82][..], &name("a"), &flag_text].concat(); + let message = cultcache_rs::decode_payload::(&mistyped).unwrap_err().to_string(); + assert!(!message.contains("CANARY"), "{message}"); + assert!(message.contains("MessagePack type"), "{message}"); +} + +// A decoder whose error text is the string it reads, standing for any serde message. +struct Raises; + +impl<'de> serde::Deserialize<'de> for Raises { + fn deserialize>(deserializer: D) -> Result { + let message = ::deserialize(deserializer)?; + Err(serde::de::Error::custom(message)) + } +} + +#[test] +fn a_field_name_is_kept_only_when_it_looks_like_a_field_name() { + let refusal = |message: &str| { + let bytes = rmp_serde::to_vec(message).unwrap(); + match cultcache_rs::decode_payload::(&bytes) { + Ok(_) => panic!("Raises never decodes"), + Err(error) => error.to_string(), + } + }; + assert_eq!(refusal("missing field `a_1`"), "missing field `a_1`"); + assert_eq!(refusal("duplicate field `Z9`"), "duplicate field `Z9`"); + let long = format!("missing field `{}`", "a".repeat(64)); + assert_eq!(refusal(&long), long); + for message in [ + "missing field `has space CANARY`".to_string(), + "missing field `x-CANARY`".to_string(), + "missing field ``".to_string(), + format!("duplicate field `{}`", "a".repeat(65)), + "unknown field `CANARY`, expected `a`".to_string(), + ] { + let text = refusal(&message); + assert_eq!(text, "a value does not fit the store format", "{message}"); + } + assert_eq!(refusal("unknown variant `CANARY`, expected `a`"), "a tag names no variant this type knows"); + assert!(!refusal("invalid type: string \"CANARY\", expected a bool").contains("CANARY")); +} + +#[test] +fn the_key_decides_the_arm() { + // Tool and Part carry different slots under different keys in the two unions. + let bytes = rmp_serde::to_vec(&(1u64, ("hammer", 3u8))).unwrap(); + assert_eq!( + rmp_serde::from_slice::(&bytes).unwrap(), + Item::Tool(UsesArm { name: "hammer".into(), uses: 3 }) + ); + assert_eq!( + rmp_serde::from_slice::(&bytes).unwrap(), + CraftedItem::Part(CountArm { name: "hammer".into(), count: 3 }) + ); +} + +#[test] +fn union_store_reads() { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("union-surface.cc"); + std::fs::write(&path, vector("union-surface.cc")).unwrap(); + let mut cache = CultCache::new(); + cache.register_entry_type::().unwrap(); + cache.add_generic_backing_store(SingleFileMessagePackBackingStore::new(&path)).unwrap(); + cache.pull_all_backing_stores().unwrap(); + assert_eq!(cache.get::("surface").unwrap(), Some(constructed())); +} + +// The arm key domain is the reference's Int32. Expected bytes are what MessagePack-CSharp writes +// for the same keys (WriteInt32: fixneg, uint32, int32); the refusal classes are CultUnionGuard's. +mod arm_keys { + use cultcache_rs::CultSlots; + use cultcache_rs::CultUnion; + + #[derive(Clone, Debug, PartialEq, CultSlots)] + struct Count { + #[cultcache(key = 0)] + name: String, + #[cultcache(key = 1)] + count: i32, + } + + #[derive(Clone, Debug, PartialEq, CultUnion)] + enum Keyed { + #[cultcache(key = -1)] + Negative(Count), + #[cultcache(key = 2147483647)] + Max(Count), + #[cultcache(key = -2147483648)] + Min, + #[cultcache(key = 7)] + Plain(Count), + } + + fn count() -> Count { + Count { name: "n".into(), count: 1 } + } + + fn message(bytes: &[u8]) -> String { + rmp_serde::from_slice::(bytes).unwrap_err().to_string() + } + + #[test] + fn negative_and_int32_max_keys_are_declared_and_round_trip() { + let cases: [(Keyed, &[u8]); 4] = [ + (Keyed::Negative(count()), &[0x92, 0xff, 0x92, 0xa1, b'n', 0x01]), + (Keyed::Max(count()), &[0x92, 0xce, 0x7f, 0xff, 0xff, 0xff, 0x92, 0xa1, b'n', 0x01]), + (Keyed::Min, &[0x92, 0xd2, 0x80, 0x00, 0x00, 0x00, 0x90]), + (Keyed::Plain(count()), &[0x92, 0x07, 0x92, 0xa1, b'n', 0x01]), + ]; + for (value, bytes) in cases { + assert_eq!(rmp_serde::to_vec(&value).unwrap(), bytes, "{value:?}"); + assert_eq!(rmp_serde::from_slice::(bytes).unwrap(), value); + } + } + + // Every integer width of a negative key reads as the same arm. + #[test] + fn a_negative_key_reads_in_every_integer_width() { + for key in [&[0xff][..], &[0xd0, 0xff], &[0xd1, 0xff, 0xff], &[0xd2, 0xff, 0xff, 0xff, 0xff], &[0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]] { + let mut bytes = vec![0x92]; + bytes.extend_from_slice(key); + bytes.extend_from_slice(&[0x92, 0xa1, b'n', 0x01]); + assert_eq!(rmp_serde::from_slice::(&bytes).unwrap(), Keyed::Negative(count()), "{key:02x?}"); + } + } + + fn pair(key: &[u8]) -> Vec { + let mut bytes = vec![0x92]; + bytes.extend_from_slice(key); + bytes.extend_from_slice(&[0x92, 0xa1, b'C', 0xa1, b'A']); + bytes + } + + // A negative key the union does not declare is an unknown arm naming the key, as in the reference. + #[test] + fn a_negative_undeclared_key_is_an_unknown_arm_naming_the_key() { + for (key, shown) in [(&[0xe0][..], "-32"), (&[0xd0, 0xdf], "-33"), (&[0xd1, 0x80, 0x00], "-32768"), (&[0xd2, 0x80, 0x00, 0x00, 0x01], "-2147483647")] { + let text = message(&pair(key)); + assert!(text.contains(&format!("unknown arm key {shown} ")), "{text}"); + assert!(text.contains("declared keys: -2147483648, -1, 7, 2147483647"), "{text}"); + assert!(!text.contains("CA"), "{text}"); + } + } + + // Outside Int32 is its own class, naming neither the value nor the payload. + #[test] + fn keys_outside_int32_are_their_own_class_and_never_echoed() { + let wide: [&[u8]; 6] = [ + &[0xce, 0x80, 0x00, 0x00, 0x00], + &[0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00], + &[0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + &[0xd3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff], + &[0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + &[0xcf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + ]; + for key in wide { + let text = message(&pair(key)); + assert!(text.contains("an arm key outside Int32"), "{key:02x?}: {text}"); + assert!(text.contains("Keyed") && !text.contains("CA"), "{text}"); + for value in ["4294967296", "9223372036854775807", "9223372036854775808", "18446744073709551615"] { + assert!(!text.contains(value), "{text}"); + } + } + } + + #[test] + fn a_key_that_is_not_an_integer_is_its_own_class_and_never_echoed() { + let keys: [&[u8]; 10] = [ + // A MessagePack ext: fixext 1, the timestamp extension and ext 8. + &[0xd4, 0x01, 0x00], + &[0xd6, 0xff, 0x00, 0x00, 0x00, 0x00], + &[0xc7, 0x02, 0x05, b'C', b'A'], + &[0xc0], + &[0xc3], + &[0xcb, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + &[0xa6, b'C', b'A', b'N', b'A', b'R', b'Y'], + &[0xc4, 0x02, b'C', b'A'], + &[0x91, 0xa6, b'C', b'A', b'N', b'A', b'R', b'Y'], + &[0x81, 0xa6, b'C', b'A', b'N', b'A', b'R', b'Y', 0x01], + ]; + for key in keys { + let text = message(&pair(key)); + assert!(text.contains("a non-integer arm key") && text.contains("Keyed"), "{key:02x?}: {text}"); + assert!(!text.contains("CANARY") && !text.contains("CA"), "{text}"); + } + } + + // Anything that is not a two-element array is the arity class, whatever its first element is. + #[test] + fn a_pair_of_the_wrong_length_is_refused_before_its_key_is_read() { + for bytes in [&[0x91, 0xa1, b'x'][..], &[0x93, 0x07, 0x90, 0x00], &[0x90]] { + let text = message(bytes); + assert!(text.contains("is not a [key, slots] pair"), "{bytes:02x?}: {text}"); + } + } +} + +mod serde_enum_bytes { + use cultcache_rs::DatabaseEntry; + + #[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] + enum External { + Unit, + Newtype(u32), + Struct { n: u8 }, + } + + #[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] + #[serde(tag = "kind")] + enum Internal { + A { n: u8 }, + } + + #[derive(Clone, Debug, PartialEq, DatabaseEntry)] + #[cultcache(type = "tests.plain_enums")] + struct PlainEnums { + #[cultcache(key = 0)] + unit: External, + #[cultcache(key = 1)] + newtype: External, + #[cultcache(key = 2)] + structured: External, + #[cultcache(key = 3)] + tagged: Internal, + } + + // Computed with the derive and serde at b0f40577, before CultUnion existed. + const AT_BASE: &[u8] = &[ + 0x94, 0xa4, b'U', b'n', b'i', b't', 0x81, 0xa7, b'N', b'e', b'w', b't', b'y', b'p', b'e', 0x05, 0x81, + 0xa6, b'S', b't', b'r', b'u', b'c', b't', 0x91, 0x01, 0x92, 0xa1, b'A', 0x01, + ]; + + #[test] + fn serde_enum_bytes_stable() { + let value = PlainEnums { + unit: External::Unit, + newtype: External::Newtype(5), + structured: External::Struct { n: 1 }, + tagged: Internal::A { n: 1 }, + }; + let bytes = rmp_serde::to_vec(&value).unwrap(); + assert_eq!(bytes, AT_BASE); + assert_eq!(rmp_serde::from_slice::(AT_BASE).unwrap(), value); + } +} + +// Names a derive's generated code must not capture: the generic parameters and the local items of the +// expansion, used as user type names. +mod generated_names { + use cultcache_rs::CultSlots; + use cultcache_rs::CultUnion; + use cultcache_rs::DatabaseEntry; + + #[derive(Clone, Debug, PartialEq, CultSlots)] + struct D { + #[cultcache(key = 0)] + name: String, + } + + #[derive(Clone, Debug, PartialEq, CultSlots)] + struct S { + #[cultcache(key = 0)] + count: i32, + } + + #[derive(Clone, Debug, PartialEq, CultSlots)] + struct ArmKey { + #[cultcache(key = 0)] + id: i32, + } + + #[derive(Clone, Debug, PartialEq, CultUnion)] + enum A { + #[cultcache(key = 1)] + D(D), + #[cultcache(key = 2)] + S(S), + #[cultcache(key = 3)] + ArmKey(ArmKey), + #[cultcache(key = 4)] + E, + } + + #[derive(Clone, Debug, PartialEq, CultUnion)] + enum CultUnionVisitor { + #[cultcache(key = 1)] + A(ArmKey), + } + + #[derive(Clone, Debug, PartialEq, DatabaseEntry)] + #[cultcache(type = "tests.names")] + struct E { + #[cultcache(key = 0)] + union: A, + #[cultcache(key = 1)] + other: CultUnionVisitor, + } + + #[test] + fn types_named_like_generated_generics_and_locals_round_trip() { + let value = E { + union: A::D(D { name: "n".into() }), + other: CultUnionVisitor::A(ArmKey { id: 9 }), + }; + let bytes = rmp_serde::to_vec(&value).unwrap(); + assert_eq!(rmp_serde::from_slice::(&bytes).unwrap(), value); + for union in [A::S(S { count: 2 }), A::ArmKey(ArmKey { id: 3 }), A::E] { + let bytes = rmp_serde::to_vec(&union).unwrap(); + assert_eq!(rmp_serde::from_slice::(&bytes).unwrap(), union); + } + } +} + +// The reference's CultUnionGuard classes, from bounds-outcomes.msgpack; depth entries go through the +// cache because the nesting rule lives in its one decode. +const CANARY: &str = "CANARY-union-golden-4c2a"; + +fn envelope(key: &str, payload: &[u8]) -> CultCacheEnvelope { + CultCacheEnvelope { + key: key.into(), + r#type: UnionSurface::TYPE.into(), + payload: payload.to_vec(), + stored_at: "2026-01-01T00:00:00Z".into(), + schema_id: None, + } +} + +// A payload past the bound cannot be admitted through the cache, so a store file written behind its +// back stands in for one a peer or an older runtime left. +fn through_cache(payload: &[u8]) -> Result { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("foreign.cc"); + SingleFileMessagePackBackingStore::new(&path).push(&envelope("k", payload)).unwrap(); + let mut cache = CultCache::new(); + cache.register_entry_type::().unwrap(); + cache.add_generic_backing_store(SingleFileMessagePackBackingStore::new(&path)).unwrap(); + cache.pull_all_backing_stores().unwrap(); + match cache.get::("k") { + Ok(value) => Ok(value.expect("the envelope was stored")), + Err(error) => Err(format!("{error:#}")), + } +} + +#[test] +fn bounds_vectors() { + let entries: Vec = rmp_serde::from_slice(&vector("bounds-outcomes.msgpack")).unwrap(); + assert_eq!(entries[0], serde_json::json!(["limit", 256])); + assert_eq!(MAX_PAYLOAD_DEPTH, 256); + let (mut accepted, mut refused, mut read_only) = (0, 0, 0); + for entry in &entries[1..] { + let fields: Vec<&str> = entry.as_array().unwrap().iter().filter_map(|field| field.as_str()).collect(); + let (file, outcome, union, detail) = (fields[0], fields[1], fields[2], fields[3]); + let bytes = vector(file); + let result = if union == "UnionSurface" { through_cache(&bytes) } else { decode(&bytes) }; + match outcome { + "accepted" => { + accepted += 1; + let value = result.unwrap_or_else(|message| panic!("{file}: {message}")); + assert_eq!(rmp_serde::to_vec(&value).unwrap(), vector(detail), "{file}"); + match file { + "arm-key-int32-min.msgpack" => assert_eq!(value.outcomes.last(), Some(&Outcome::Floor)), + "arm-key-int32-max.msgpack" | "arm-key-wide-coding.msgpack" => { + assert_eq!(value.outcomes.last(), Some(&Outcome::Ceiling)) + } + _ => {} + } + } + "read-only" => { + read_only += 1; + assert_eq!(result.unwrap_or_else(|message| panic!("{file}: {message}")), constructed(), "{file}"); + } + "refused" => { + refused += 1; + let message = result.expect_err(file); + // The cache path names the entry type in its context; the union names itself. + let names = if union == "UnionSurface" { UnionSurface::TYPE } else { union }; + assert!(message.contains(names), "{file}: {message}"); + let class = match detail { + "key-out-of-range" => "outside Int32", + "key-not-integer" => "non-integer", + "nil-slots" => "arm 1 has nil slots", + "depth" => "the limit is 256", + other => panic!("{file}: unknown class {other}"), + }; + assert!(message.contains(class), "{file}: {message}"); + assert!(!message.contains(CANARY), "{file} echoed a value: {message}"); + } + other => panic!("{file}: unknown outcome {other}"), + } + } + assert_eq!((accepted, refused, read_only), (4, 7, 1)); +} + +fn wrap_chain(wraps: usize, leaf: Node) -> UnionSurface { + let mut node = leaf; + for _ in 0..wraps { + node = Node::Wrap(WrapArm { inner: Some(std::boxed::Box::new(node)) }); + } + UnionSurface { root: Some(node), ..constructed() } +} + +// Each Wrap adds a pair and a slots array; the surface array is depth 1, so a Box leaf (pair, slots, +// children) ends at 2 * (wraps + 1) + 2 and a Text leaf at 2 * (wraps + 1) + 1. +#[test] +fn the_constructed_chains_write_the_vector_bytes() { + let at_limit = wrap_chain(126, boxed("leaf", vec![])); + assert_eq!(rmp_serde::to_vec(&at_limit).unwrap(), vector("depth-at-limit.msgpack")); + let past_limit = wrap_chain(127, text("leaf", CANARY)); + assert_eq!(rmp_serde::to_vec(&past_limit).unwrap(), vector("depth-past-limit.msgpack")); +} + +#[test] +fn the_canary_is_in_the_committed_bytes() { + let bytes = vector("depth-past-limit.msgpack"); + assert!(bytes.windows(CANARY.len()).any(|window| window == CANARY.as_bytes())); +} + +#[test] +fn write_refused_past_limit() { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("depth.cc"); + let mut cache = CultCache::new(); + cache.register_entry_type::().unwrap(); + cache.add_generic_backing_store(SingleFileMessagePackBackingStore::new(&path)).unwrap(); + + let at_limit = wrap_chain(126, boxed("leaf", vec![])); + assert_eq!(cache.put("at", &at_limit).unwrap(), at_limit); + let stored = cache.snapshot_envelopes(); + assert_eq!(stored.len(), 1); + assert_eq!(stored[0].payload, vector("depth-at-limit.msgpack")); + let file_before = std::fs::read(&path).unwrap(); + + let error = cache.put("past", &wrap_chain(127, text("leaf", CANARY))).unwrap_err(); + assert_eq!(error.downcast_ref::(), Some(&PayloadTooDeep { depth: 257, limit: 256 })); + assert!(!format!("{error:#}").contains(CANARY), "{error:#}"); + assert_eq!(cache.get::("past").unwrap(), None); + assert_eq!(cache.snapshot_envelopes(), stored); + assert_eq!(std::fs::read(&path).unwrap(), file_before); +} + +// Every door an envelope enters the store by holds the one bound: the typed put above, and the raw +// doors a peer's bytes arrive through. Three nestings: union arms and maps +// written by the production encoder, and the arrays of the committed vector. +#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] +struct MapNest { + inner: Option>, +} + +#[derive(Clone, Debug, PartialEq, DatabaseEntry)] +#[cultcache(type = "tests.map_doc", schema = "tests.map_doc.v1")] +struct MapDoc { + #[cultcache(key = 0)] + root: Option, +} + +// The document array is depth 1 and each MapNest is one map. +fn map_doc(maps: usize) -> MapDoc { + let mut nest = MapNest { inner: None }; + for _ in 1..maps { + nest = MapNest { inner: Some(std::boxed::Box::new(nest)) }; + } + MapDoc { root: Some(nest) } +} + +#[test] +fn maps_count_one_level_each_on_every_write_door() { + let at_limit = map_doc(MAX_PAYLOAD_DEPTH - 1); + let past_limit = map_doc(MAX_PAYLOAD_DEPTH); + let at_bytes = rmp_serde::to_vec_named(&at_limit).unwrap(); + let past_bytes = rmp_serde::to_vec_named(&past_limit).unwrap(); + assert_eq!(check_payload_depth(&at_bytes), Ok(())); + assert_eq!(check_payload_depth(&past_bytes), Err(TOO_DEEP)); + + let mut cache = CultCache::new(); + cache.register_entry_type::().unwrap(); + let (prepared, parsed) = cache.prepare_entry_named("at", &at_limit).unwrap(); + assert_eq!((prepared.payload.as_slice(), &parsed), (at_bytes.as_slice(), &at_limit)); + cache.put_prepared_batch(vec![prepared]).unwrap(); + assert_eq!(cache.get::("at").unwrap(), Some(at_limit)); + let error = cache.prepare_entry_named("past", &past_limit).unwrap_err(); + assert_eq!(error.downcast_ref::(), Some(&TOO_DEEP)); +} + +fn raw(type_name: &str, key: &str, payload: Vec) -> CultCacheEnvelope { + CultCacheEnvelope { r#type: type_name.into(), ..envelope(key, &payload) } +} + +#[test] +fn the_raw_doors_hold_the_bound_for_arms_maps_and_arrays() { + let arms_at = rmp_serde::to_vec(&wrap_chain(126, boxed("leaf", vec![]))).unwrap(); + let arms_past = rmp_serde::to_vec(&wrap_chain(127, text("leaf", CANARY))).unwrap(); + let maps_at = rmp_serde::to_vec_named(&map_doc(MAX_PAYLOAD_DEPTH - 1)).unwrap(); + let maps_past = rmp_serde::to_vec_named(&map_doc(MAX_PAYLOAD_DEPTH)).unwrap(); + let arrays_at = vector("depth-at-limit.msgpack"); + let arrays_past = vector("depth-past-limit.msgpack"); + let cases = [ + (UnionSurface::TYPE, "arms", arms_at, arms_past), + (MapDoc::TYPE, "maps", maps_at, maps_past), + (UnionSurface::TYPE, "arrays", arrays_at, arrays_past), + ]; + for (type_name, name, at, past) in cases { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("doors.cc"); + let mut cache = CultCache::new(); + cache.register_entry_type::().unwrap(); + cache.register_entry_type::().unwrap(); + cache.add_generic_backing_store(SingleFileMessagePackBackingStore::new(&path)).unwrap(); + cache.put_raw_envelope(raw(type_name, "at-raw", at.clone())).unwrap(); + cache.put_prepared_batch(vec![raw(type_name, "at-batch", at.clone())]).unwrap(); + let stored = cache.snapshot_envelopes(); + let file_before = std::fs::read(&path).unwrap(); + + let refusals = [ + cache.put_raw_envelope(raw(type_name, "past-raw", past.clone())).unwrap_err(), + // The valid entry staged beside it must not land either. + cache + .put_prepared_batch(vec![raw(type_name, "ok-staged", at.clone()), raw(type_name, "past-batch", past.clone())]) + .unwrap_err(), + ]; + for error in refusals { + assert_eq!(error.downcast_ref::(), Some(&TOO_DEEP), "{name}"); + let message = format!("{error:#}"); + assert!(message.contains(type_name) && !message.contains(CANARY), "{name}: {message}"); + } + assert_eq!(cache.snapshot_envelopes(), stored, "{name}"); + assert_eq!(std::fs::read(&path).unwrap(), file_before, "{name}"); + } +} + +// The bound counts containers, not stack: decode grows its own stack, so the document at the limit +// decodes on a 1 MiB thread in both profiles, and every refusal is an error, not an abort. +#[test] +fn the_union_chain_at_the_limit_decodes_on_a_1mib_thread() { + std::thread::Builder::new() + .stack_size(1024 * 1024) + .spawn(|| { + assert_eq!( + through_cache(&vector("depth-at-limit.msgpack")).unwrap(), + wrap_chain(126, boxed("leaf", vec![])) + ); + let refused = through_cache(&vector("depth-past-limit.msgpack")).unwrap_err(); + assert!(refused.contains("the limit is 256"), "{refused}"); + let mut cache = CultCache::new(); + cache.register_entry_type::().unwrap(); + let value = wrap_chain(126, boxed("leaf", vec![])); + assert_eq!(cache.put("at", &value).unwrap(), value); + assert_eq!(cache.get::("at").unwrap(), Some(value)); + let mut deep = vec![0x91u8; 100_000]; + deep.push(0xc0); + let refused = through_cache(&deep).unwrap_err(); + assert!(refused.contains("the limit is 256"), "{refused}"); + }) + .unwrap() + .join() + .unwrap(); +} + +// The walk is iterative: 100000 nested arrays are refused on a 256 KiB stack. +#[test] +fn the_walk_does_not_recurse() { + std::thread::Builder::new() + .stack_size(256 * 1024) + .spawn(|| { + let mut deep = vec![0x91u8; 100_000]; + deep.push(0xc0); + assert_eq!(check_payload_depth(&deep), Err(PayloadTooDeep { depth: 257, limit: 256 })); + }) + .unwrap() + .join() + .unwrap(); +} + +fn nested(open: &[u8], levels: usize, leaf: &[u8]) -> Vec { + let mut bytes = open.repeat(levels); + bytes.extend_from_slice(leaf); + bytes +} + +const TOO_DEEP: PayloadTooDeep = PayloadTooDeep { depth: 257, limit: 256 }; + +// Every container header width counts one level, and the bound sits between 256 and 257 for each. +#[test] +fn every_container_header_counts_one_level() { + let openers: [(&str, &[u8]); 6] = [ + ("fixarray", &[0x91]), + ("array16", &[0xdc, 0x00, 0x01]), + ("array32", &[0xdd, 0x00, 0x00, 0x00, 0x01]), + ("fixmap", &[0x81, 0x01]), + ("map16", &[0xde, 0x00, 0x01, 0x01]), + ("map32", &[0xdf, 0x00, 0x00, 0x00, 0x01, 0x01]), + ]; + for (name, open) in openers { + assert_eq!(check_payload_depth(&nested(open, 256, &[0xc0])), Ok(()), "{name} at the limit"); + assert_eq!(check_payload_depth(&nested(open, 257, &[0xc0])), Err(TOO_DEEP), "{name} past the limit"); + } + // An empty container still counts the level it sits on. + assert_eq!(check_payload_depth(&nested(&[0x91], 255, &[0x90])), Ok(())); + assert_eq!(check_payload_depth(&nested(&[0x91], 256, &[0x90])), Err(TOO_DEEP)); + assert_eq!(check_payload_depth(&nested(&[0x91], 255, &[0x80])), Ok(())); + assert_eq!(check_payload_depth(&nested(&[0x91], 256, &[0x80])), Err(TOO_DEEP)); +} + +// Every scalar and container header is followed by the chain that tests the bound. The skipped bytes +// are filled with the array marker, so a skip that stops short reads them as containers and a skip +// that runs long eats the chain: either way the chain's depth stops reading as 256 and 257. +#[test] +fn every_element_is_skipped_by_its_length_and_counted_by_its_children() { + const FILL: u8 = 0x91; + let filled = |head: &[u8], bytes: usize| -> Vec { [head.to_vec(), vec![FILL; bytes]].concat() }; + let long = |code: u8, width: usize, length: usize, extra: usize| -> Vec { + let size = length.to_be_bytes(); + filled(&[&[code][..], &size[size.len() - width..]].concat(), length + extra) + }; + let mut elements: Vec> = vec![ + vec![0x00], + vec![0xff], + vec![0xc0], + vec![0xc2], + vec![0xc3], + filled(&[0xcc], 1), + filled(&[0xcd], 2), + filled(&[0xce], 4), + filled(&[0xcf], 8), + filled(&[0xd0], 1), + filled(&[0xd1], 2), + filled(&[0xd2], 4), + filled(&[0xd3], 8), + filled(&[0xca], 4), + filled(&[0xcb], 8), + filled(&[0xa3], 3), + filled(&[0xbf], 31), + filled(&[0xd4], 2), + filled(&[0xd5], 3), + filled(&[0xd6], 5), + filled(&[0xd7], 9), + filled(&[0xd8], 17), + ]; + for (code, width) in [(0xd9, 1), (0xc4, 1), (0xda, 2), (0xc5, 2), (0xdb, 4), (0xc6, 4)] { + for length in [3, 200, 256, 65536] { + if length < (1usize << (8 * width)) { + elements.push(long(code, width, length, 0)); + } + } + } + // An ext carries a type byte after its length. + for (code, width) in [(0xc7, 1), (0xc8, 2), (0xc9, 4)] { + for length in [3, 200, 256, 65536] { + if length < (1usize << (8 * width)) { + elements.push(long(code, width, length, 1)); + } + } + } + // Containers whose children are scalars, so a wrong child count shifts everything after them. + elements.push(vec![0x92, 0x00, 0x00]); + elements.push(vec![0x93, 0x00, 0x00, 0x00]); + elements.push(vec![0x82, 0x00, 0x00, 0x00, 0x00]); + elements.push(vec![0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); + elements.push([vec![0xdc, 0x01, 0x00], vec![0x00; 256]].concat()); + elements.push([vec![0xdd, 0x00, 0x00, 0x00, 0x03], vec![0x00; 3]].concat()); + elements.push([vec![0xde, 0x00, 0x03], vec![0x00; 6]].concat()); + elements.push([vec![0xde, 0x01, 0x00], vec![0x00; 512]].concat()); + elements.push([vec![0xdf, 0x00, 0x00, 0x00, 0x03], vec![0x00; 6]].concat()); + elements.push(vec![0xdc, 0x00, 0x00]); + elements.push(vec![0xdf, 0x00, 0x00, 0x00, 0x00]); + + let with_chain = |levels: usize| { + let mut bytes = vec![0xdd]; + bytes.extend_from_slice(&u32::try_from(elements.len() + 1).unwrap().to_be_bytes()); + for element in &elements { + bytes.extend_from_slice(element); + } + bytes.extend(nested(&[0x91], levels, &[0xc0])); + bytes + }; + assert_eq!(check_payload_depth(&with_chain(255)), Ok(())); + assert_eq!(check_payload_depth(&with_chain(256)), Err(TOO_DEEP)); +} + +// An ending cut short is the decoder's to refuse, never a panic or a depth error. +#[test] +fn a_payload_cut_short_is_not_a_depth_error() { + for bytes in [&[0xdc, 0x00][..], &[0xdd, 0, 0], &[0xd9], &[0xc5, 0x00], &[0xde], &[0xdf, 0, 0, 0], &[0x91], &[]] { + assert_eq!(check_payload_depth(bytes), Ok(()), "{bytes:02x?}"); + } + assert_eq!(check_payload_depth(&[0xdb, 0xff, 0xff, 0xff, 0xff, b'a']), Ok(())); +} + +#[test] +fn the_refusal_names_depth_and_limit_only() { + assert_eq!(TOO_DEEP.to_string(), "payload nests 257 MessagePack containers deep; the limit is 256"); +} diff --git a/packages/cultcache-ts/README.md b/packages/cultcache-ts/README.md index d1730958..9e208dfe 100644 --- a/packages/cultcache-ts/README.md +++ b/packages/cultcache-ts/README.md @@ -32,6 +32,37 @@ This is not an ORM in a fake mustache. It is for cases where you want: That keeps the polymorphic boundary tight without making callers write boilerplate by candlelight. +## Reading And Writing Payloads + +A document's bytes travel as a `DocumentPayload`: in a store envelope, a CultNet record and a +realtime frame. At run time it is the same `Uint8Array`, so nothing on the wire changes. At compile +time it is opaque: it is assignable to and from neither `Uint8Array` nor `ArrayLike`, so no +MessagePack decoder accepts it. + +What the type guarantees is that a payload cannot be read or assigned directly: a decoder call, an +assignment to `Uint8Array` and `new Uint8Array(payload)` fail to compile. It does not stop what the +runtime value allows, because the value is a `Uint8Array`. These routes read it without the owner: +`instanceof Uint8Array` or `ArrayBuffer.isView` narrowing, `Object.values`, `Object.assign` onto a +`Uint8Array`, a JSON round trip, `Reflect.get`, and a cast. A read made that way sees the raw bytes, +which for a codec or formatter document are not the document. No lint or guard closes them. Read +through `decodeDocumentPayload`, and when you need the bytes themselves (hashing, signing, a store +write) take them with `documentPayloadBytes`, the sanctioned escape. + +- `decodeDocumentPayload(definition, payload)` reads a payload through the definition's formatter, + codec or plain map and then its schema. The definition is required. +- `encodeDocumentPayload(definition, value)` is the writer: the schema first, then the formatter, + codec or plain map. +- `documentPayloadFromBytes(bytes)` is where bytes enter (a record you validated, a store read, a + writer of pre-encoded or signed bytes) and `documentPayloadBytes(payload)` is where they leave (a + store write, a frame encode, hashing or signing). Reach for them only at those edges. + +```ts +const note = decodeDocumentPayload(noteDocument, envelope.payload); // parsed Note +const payload = encodeDocumentPayload(noteDocument, note); // DocumentPayload +``` + +Browsers import the same names from `@gamecult/cultcache-ts/document`, which holds no Node built-ins. + ## `.cc` Inspection CultCache files may use the `.cc` extension. The bytes are still the canonical @@ -222,6 +253,10 @@ const combatLogDocument = defineDocumentType({ If you do not supply one, `CultCacheTS` uses MessagePack plus Zod validation by default. +The 256-container nesting bound (`MAX_PAYLOAD_DEPTH`, refused with `CultCachePayloadDepthError`) covers the MessagePack the +library itself writes: the default format and a codec. A payload your formatter writes is opaque bytes in any format, so the +library does not walk it as MessagePack; its format and its bounds are your formatter's. + Zod is no longer mandatory. Any schema object with a `parse(...)` function will do, which means generated Ajv-backed JSON-schema contracts can feed the cache directly as long as they expose the same parse surface. @@ -234,6 +269,54 @@ The important boundary is this: So callers get typed values, and the persistence layer does not become an open polymorphic sewer. +## Slot Records and Unions + +`codec` writes the reference runtimes' record shape: a MessagePack array indexed by slot key, nil in a gap, and a +union as `[armKey, [armSlots...]]`. A union value is `{ kind: armName, ...armFields }`. + +```ts +import { codecs, defineDocumentType } from "@gamecult/cultcache-ts"; +const { slots, union, list, lazy, string } = codecs; + +const NS = "MyApp.Scene+"; // the C# names of the types, as the reference writes them into a store's schema catalog + +type Node = + | { kind: "Box"; id: string; children: (Node | null)[] } + | { kind: "Text"; id: string; content: string } + | { kind: "Image"; id: string; uri: string; alt: string }; + +const node: codecs.Codec = union("Node", { + 0: ["Box", slots<{ id: string; children: (Node | null)[] }>({ 0: ["id", string], 1: ["children", list(lazy(() => node))] })], + 1: ["Text", slots<{ id: string; content: string }>({ 0: ["id", string], 1: ["content", string] })], + 5: ["Image", slots<{ id: string; uri: string; alt: string }>({ 0: ["id", string], 1: ["uri", string], 3: ["alt", string] })], // slot 2 retired +}, `${NS}Node`); + +const sceneDocument = defineDocumentType({ + type: "scene", + schema: sceneSchema, + codec: slots({ 0: ["id", string], 1: ["root", node], 2: ["title", string, ""] }), + name: "id", +}); +``` + +- A slot is `[name, codec, default?]`. A gap is written nil and skipped on read; an extra trailing slot is skipped; a + slot missing from the payload (or nil, when a default is declared) takes its default, and is refused without one. +- A union refuses an undeclared arm key on read, naming the union, the key and the declared keys. Nothing falls back + to a default arm. An arm with no slots is `codecs.unit` and is written `[key, []]`. +- A refusal names the union, the field and the slot; it never echoes the value it refused. +- The leaves are `string`, `boolean`, `bytes`, `int32`, `int64`, `float32` and `float64`, each writing the MessagePack the + C# type writes and refusing what C# refuses (a float in an int slot, an `int` outside Int32). `int64` reads a number + when the value is a safe integer and a bigint beyond 2^53, and refuses a number beyond 2^53 on write. `list`, `array` + and `nullable` wrap a leaf, a union or a record. A `float32` slot rounds an integer once, as the reference's cast does. +- Every codec carries the reference's type name, and a store's schema catalog is derived from those names, because the + reference refuses a store whose slot names another type. The leaves know theirs; give a union or a record its C# name + as the last argument of `union(name, arms, typeName)` or `slots(spec, typeName)`. A codec with a slot it cannot name + refuses to derive members: pass `members` instead. +- An arm key is an integer within Int32 (negative too), in any MessagePack integer encoding. A float key (even `1.0`) is + refused on read, and a union refuses a key outside Int32 when it is defined. A slot key is within 0 to Int32 max. +- `codec` supplies the document's formatter and, unless `members` is given, its catalog members. A definition may not + carry both `codec` and `formatter`. `schema.parse` still runs on every decoded value. + ## Raw Envelope Fast Path For bit-compatible neighbors such as CultNet peers that already share the same diff --git a/packages/cultcache-ts/package.json b/packages/cultcache-ts/package.json index 67f8d5ed..852c047e 100644 --- a/packages/cultcache-ts/package.json +++ b/packages/cultcache-ts/package.json @@ -10,12 +10,24 @@ "require": "./dist/index.js", "default": "./dist/index.js" }, + "./document": { + "types": "./dist/document.d.ts", + "require": "./dist/document.js", + "default": "./dist/document.js" + }, "./inspection": { "types": "./dist/cult-cache-inspector.d.ts", "require": "./dist/cult-cache-inspector.js", "default": "./dist/cult-cache-inspector.js" } }, + "typesVersions": { + "*": { + "document": [ + "dist/document.d.ts" + ] + } + }, "files": [ "dist" ], @@ -23,7 +35,7 @@ "build": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json", "prepack": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json", "typecheck": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json --pretty false", - "test": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/test/cult-cache.test.js" + "test": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/test/*.test.js" }, "keywords": [ "messagepack", @@ -45,7 +57,7 @@ }, "homepage": "https://github.com/GameCult/CultLib/tree/main/packages/cultcache-ts#readme", "engines": { - "node": ">=18" + "node": ">=20" }, "dependencies": { "@msgpack/msgpack": "^3.1.3", diff --git a/packages/cultcache-ts/src/codec.ts b/packages/cultcache-ts/src/codec.ts new file mode 100644 index 00000000..9b885159 --- /dev/null +++ b/packages/cultcache-ts/src/codec.ts @@ -0,0 +1,370 @@ +import type { CultCacheSchemaCatalogMember } from "./types"; +import { WireFloat } from "./wire"; + +// A codec turns a value into the shape the reference runtimes write and back. Slot records are positional arrays with +// nil gaps; a union value is { kind: armName, ...armFields }, written [armKey, [armSlots...]]. Refusals name the union +// or the slot and the key or code, and never echo a decoded value. `typeName` is the reference's name for the type +// (CultSchemaTypeNames.FromType): a store's schema catalog carries it per slot, and the reference refuses a store whose +// slot names another type. The leaves know theirs; a union or a record the codec cannot name from C# is given it. +export interface Codec { + encode(value: TValue): unknown; + decode(raw: unknown): TValue; + readonly typeName?: string; + // True for a type the reference makes Nullable when the slot may be nil (int, long, float, double, bool). + readonly valueType?: boolean; +} + +export interface SlotsCodec extends Codec { + // Throws when a slot's codec has no typeName: the catalog cannot be derived without the reference's names. + readonly members: readonly CultCacheSchemaCatalogMember[]; + readonly names: readonly string[]; +} + +function kindOf(raw: unknown): string { + if (raw === null || raw === undefined) return "nil"; + if (Array.isArray(raw)) return "array"; + if (raw instanceof WireFloat) return "float"; + if (typeof raw === "bigint") return "integer"; + return typeof raw; +} + +function refuse(what: string, found: string): never { + throw new Error(`expected ${what}, found ${found}`); +} + +function expect(raw: unknown, what: string, ok: boolean): asserts ok { + if (!ok) refuse(what, kindOf(raw)); +} + +export const string: Codec = { + typeName: "System.String", + encode: (value) => (expect(value, "a string", typeof value === "string"), value), + decode: (raw) => (expect(raw, "a string", typeof raw === "string"), raw as string), +}; + +export const boolean: Codec = { + typeName: "System.Boolean", + valueType: true, + encode: (value) => (expect(value, "a boolean", typeof value === "boolean"), value), + decode: (raw) => (expect(raw, "a boolean", typeof raw === "boolean"), raw as boolean), +}; + +// The reference's byte[] reads a MessagePack str as its bytes and writes bin (an old-spec writer's output), so a str is +// accepted and re-encodes as bin. The wire reader has already decoded the str, so a str that held invalid UTF-8 (it +// reads back U+FFFD) is refused rather than turned into other bytes. +export const bytes: Codec = { + typeName: "System.Byte[]", + encode: (value) => (expect(value, "bytes", value instanceof Uint8Array), value), + decode(raw) { + if (typeof raw === "string") { + if (raw.includes("�")) refuse("bytes", "a string that is not valid UTF-8"); + return new TextEncoder().encode(raw); + } + expect(raw, "bytes", raw instanceof Uint8Array); + return raw as Uint8Array; + }, +}; + +// A C# integer slot: written as the smallest MessagePack integer and read from any integer encoding in range. A float is +// refused even when it holds a whole number, as the reference refuses it. +function integerCodec(typeName: string, what: string, low: bigint, high: bigint): Codec { + const inRange = (value: number | bigint) => value >= low && value <= high; + return { + typeName, + valueType: true, + encode(value) { + if (typeof value === "bigint") { + if (!inRange(value)) refuse(what, "an integer out of range"); + return value; + } + if (typeof value !== "number") refuse(what, kindOf(value)); + if (!Number.isSafeInteger(value)) { + refuse(what, Number.isInteger(value) ? "a number beyond 2^53, which needs a bigint" : "a non-integer number"); + } + if (!inRange(value)) refuse(what, "an integer out of range"); + return value; + }, + decode(raw) { + if (typeof raw !== "number" && typeof raw !== "bigint") refuse(what, kindOf(raw)); + if (!inRange(raw)) refuse(what, "an integer out of range"); + return raw; + }, + }; +} + +// C# int. Always a number. +export const int32 = integerCodec("System.Int32", "an int32", -(2n ** 31n), 2n ** 31n - 1n) as Codec; +// C# long. A number when the value is a safe integer, a bigint beyond 2^53 (so 64-bit values never lose precision). +export const int64 = integerCodec("System.Int64", "an int64", -(2n ** 63n), 2n ** 63n - 1n); + +// A 64-bit integer to the nearest float32 in one rounding, ties to even, as the reference's cast does. Number(value) +// first would round to a double and then again, and the two roundings can disagree. A bigint reaches here only beyond +// 2^53 (the wire reader returns a number for any smaller integer), so at least 30 bits are rounded away. +function bigintToFloat32(value: bigint): number { + const magnitude = value < 0n ? -value : value; + const excess = magnitude.toString(2).length - 24; + const kept = magnitude >> BigInt(excess); + const rest = magnitude - (kept << BigInt(excess)); + const half = 1n << BigInt(excess - 1); + const rounded = Number(rest > half || (rest === half && (kept & 1n) === 1n) ? kept + 1n : kept) * 2 ** excess; + return value < 0n ? -rounded : rounded; +} + +function floatCodec(typeName: string, wide: boolean): Codec { + const what = wide ? "a float64" : "a float32"; + return { + typeName, + valueType: true, + encode(value) { + expect(value, what, typeof value === "number"); + return new WireFloat(value, wide); + }, + decode(raw) { + if (raw instanceof WireFloat) { + // A JS number has no NaN payload, so a signalling float32 NaN cannot be kept; refusing beats changing its bytes. + if (raw.signalling && !wide) refuse(what, "a signalling NaN"); + return wide ? raw.value : Math.fround(raw.value); + } + if (typeof raw === "number") return wide ? raw : Math.fround(raw); + if (typeof raw === "bigint") return wide ? Number(raw) : bigintToFloat32(raw); + return refuse(what, kindOf(raw)); + }, + }; +} + +// C# float, written as MessagePack float 32. +export const float32 = floatCodec("System.Single", false); +// C# double, written as MessagePack float 64. +export const float64 = floatCodec("System.Double", true); + +function sequence(item: Codec, nameOf: (itemName: string) => string): Codec { + return { + get typeName() { return item.typeName === undefined ? undefined : nameOf(item.typeName); }, + encode(value) { + expect(value, "an array", Array.isArray(value)); + return value.map((element, index) => at(`element ${index}`, () => item.encode(element))); + }, + decode(raw) { + expect(raw, "an array", Array.isArray(raw)); + return (raw as unknown[]).map((element, index) => at(`element ${index}`, () => item.decode(element))); + }, + }; +} + +// C# List. +export function list(item: Codec): Codec { + return sequence(item, (name) => `System.Collections.Generic.List<${name}>`); +} + +// C# T[]. The same wire as list. +export function array(item: Codec): Codec { + return sequence(item, (name) => `${name}[]`); +} + +// A slot that may be nil. For a value type the reference's name is Nullable; for a reference type it is unchanged. +export function nullable(inner: Codec): Codec { + return { + get typeName() { + return inner.typeName !== undefined && inner.valueType ? `System.Nullable<${inner.typeName}>` : inner.typeName; + }, + encode: (value) => (value === null || value === undefined ? null : inner.encode(value)), + decode: (raw) => (raw === null ? null : inner.decode(raw)), + }; +} + +export function lazy(get: () => Codec): Codec { + let resolved: Codec | undefined; + const codec = () => (resolved ??= get()); + return { + get typeName() { return codec().typeName; }, + get valueType() { return codec().valueType; }, + encode: (value) => codec().encode(value), + decode: (raw) => codec().decode(raw), + }; +} + +// Prefixes a refusal with where it happened, so a nested refusal still names its field and its union. +function at(where: string, run: () => TResult): TResult { + try { + return run(); + } catch (error) { + throw new Error(`${where}: ${(error as Error).message}`); + } +} + +type SlotSpec = + | readonly [name: TName, codec: Codec] + | readonly [name: TName, codec: Codec, defaultValue: TValue | (() => TValue)]; + +type SlotsSpec = Readonly }[keyof TValue & string]>>; + +const INT32_MIN = -(2 ** 31); +const INT32_MAX = 2 ** 31 - 1; + +// The largest slot key. A slot record is written as a dense array of key+1 slots (the reference writes the same, nil +// in every gap), so a key is a payload length: the cap keeps a definition's typo from allocating without bound. +export const MAX_SLOT_KEY = 65535; + +// The declared keys, ascending. The reference's keys are Int32: a union arm may be any (a negative one too), a slot is +// 0 to MAX_SLOT_KEY, and a key outside its range is refused at definition rather than allocated for. +function slotKeys(spec: Readonly>, owner: string, low: number, high: number): number[] { + return Object.keys(spec) + .map((text) => { + if (!/^-?(0|[1-9][0-9]*)$/u.test(text) || (low >= 0 && text.startsWith("-"))) { + throw new Error(`${owner} declares the key "${text}", which is not ${low < 0 ? "an" : "a non-negative"} integer.`); + } + const key = BigInt(text); + if (key < BigInt(low) || key > BigInt(high)) { + throw new Error(`${owner} declares the key ${text}, which is ${high === INT32_MAX ? "outside Int32" : `above the slot key limit ${high}`}.`); + } + return Number(key); + }) + // Object.keys lists negative keys after the others, in the order they were written: sort them numerically. + .sort((left, right) => left - right); +} + +function pascalCase(name: string): string { + return name + .split(/[^A-Za-z0-9]/u) + .filter((part) => part.length > 0) + .map((part) => part[0].toUpperCase() + part.slice(1)) + .join(""); +} + +// A positional record: slot `key` holds field `name`. Gaps are written nil and skipped on read, extra trailing slots +// are skipped, and a slot missing from the payload takes its declared default or is refused. A default fills only a +// missing trailing slot, never a nil: as in the reference, a nil in a reference slot (string, bytes, record, union, +// list) reads as null and writes back as nil, so a record the reference wrote re-encodes byte-identical, and a nil in +// a value slot (int, float, bool) is refused unless the slot is nullable. +export function slots(spec: SlotsSpec, typeName?: string): SlotsCodec { + const keys = slotKeys(spec, "A slot record", 0, MAX_SLOT_KEY); + if (keys.length === 0) { + throw new Error("A slot record declares no slots."); + } + const fields = keys.map((key) => { + const [name, codec, ...rest] = (spec as unknown as Readonly>>)[key]; + return { key, name, codec, hasDefault: rest.length > 0, defaultValue: rest[0] }; + }); + const seen = new Set(); + for (const field of fields) { + if (seen.has(field.name)) { + throw new Error(`A slot record declares the field "${field.name}" twice.`); + } + seen.add(field.name); + } + const length = keys[keys.length - 1] + 1; + const defaultOf = (field: (typeof fields)[number]): unknown => + typeof field.defaultValue === "function" ? (field.defaultValue as () => unknown)() : field.defaultValue; + + return { + names: fields.map((field) => field.name), + typeName, + get members() { + return fields.map((field) => { + if (field.codec.typeName === undefined) { + throw new Error(`${field.name} (slot ${field.key}) has no C# type name for the schema catalog; give its union or record a typeName, or give the document its members.`); + } + return { slot: field.key, memberName: pascalCase(field.name), typeName: field.codec.typeName }; + }); + }, + encode(value) { + expect(value, "a record", typeof value === "object" && value !== null); + const out: unknown[] = new Array(length).fill(null); + for (const field of fields) { + const member = (value as Record)[field.name]; + out[field.key] = member === null && !field.codec.valueType + ? null + : at(`${field.name} (slot ${field.key})`, () => field.codec.encode(member)); + } + return out; + }, + decode(raw) { + expect(raw, "an array of slots", Array.isArray(raw)); + const input = raw as unknown[]; + const out: Record = {}; + for (const field of fields) { + const present = field.key < input.length; + if (!present && !field.hasDefault) { + throw new Error(`${field.name} (slot ${field.key}): the slot is missing and declares no default.`); + } + out[field.name] = !present + ? defaultOf(field) + : input[field.key] === null && !field.codec.valueType + ? null + : at(`${field.name} (slot ${field.key})`, () => field.codec.decode(input[field.key])); + } + return out as TValue; + }, + }; +} + +// An arm with no slots. It is written [key, []], never [key, nil]. +export interface UnitArm { + readonly unit: true; +} +export const unit: UnitArm = Object.freeze({ unit: true }); + +type ArmSpec = readonly [armName: TKind, body: SlotsCodec | UnitArm]; + +// A tagged union written [armKey, [armSlots...]]. The reader refuses an undeclared key, naming the union, the key and +// the declared keys; there is no fallback arm. +export function union( + name: string, + arms: Readonly>>, + typeName?: string, +): Codec { + const keys = slotKeys(arms, `Union ${name}`, INT32_MIN, INT32_MAX); + if (keys.length === 0) { + throw new Error(`Union ${name} declares no arms.`); + } + const byKey = new Map | UnitArm }>(); + const byName = new Map(); + for (const key of keys) { + const [armName, body] = arms[key]; + if (byName.has(armName)) { + throw new Error(`Union ${name} declares the arm "${armName}" twice.`); + } + if (body !== unit && (body as SlotsCodec).names.includes("kind")) { + throw new Error(`Union ${name} arm "${armName}" declares a slot named kind, which is the union's own tag.`); + } + byKey.set(key, { armName, body }); + byName.set(armName, key); + } + const declared = keys.join(", "); + + return { + typeName, + encode(value) { + if (value === null || value === undefined) { + return null; + } + const key = byName.get((value as { kind?: string }).kind as string); + if (key === undefined) { + throw new Error(`Union ${name}: the value's kind is not one of its arms (${[...byName.keys()].join(", ")}).`); + } + const { armName, body } = byKey.get(key)!; + return [key, body === unit ? [] : at(`arm ${armName}`, () => (body as SlotsCodec).encode(value))]; + }, + decode(raw) { + if (raw === null) { + return null; + } + if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) { + throw new Error(`Union ${name}: expected [key, slots] and found something else.`); + } + const key: unknown = raw[0]; + if (typeof key !== "number" && typeof key !== "bigint") { + throw new Error(`Union ${name}: the arm key is not an integer (declared keys: ${declared}).`); + } + if (key < INT32_MIN || key > INT32_MAX) { + throw new Error(`Union ${name}: the arm key is outside Int32 (declared keys: ${declared}).`); + } + const arm = byKey.get(Number(key)); + if (arm === undefined) { + throw new Error(`Union ${name}: unknown arm key ${key} (declared keys: ${declared}).`); + } + const fields = arm.body === unit ? {} : at(`arm ${arm.armName}`, () => (arm.body as SlotsCodec).decode(raw[1])); + return { kind: arm.armName, ...fields } as unknown as TValue; + }, + }; +} diff --git a/packages/cultcache-ts/src/cult-cache-inspector.ts b/packages/cultcache-ts/src/cult-cache-inspector.ts index 1301fe47..56a0f6e3 100644 --- a/packages/cultcache-ts/src/cult-cache-inspector.ts +++ b/packages/cultcache-ts/src/cult-cache-inspector.ts @@ -1,5 +1,8 @@ import { decode } from "@msgpack/msgpack"; +import { checkPayloadDepth } from "./payload-depth"; +import { STORE_FORMAT_VERSION, isV1Snapshot, requireV1RecordSlots } from "./store-format"; + export interface CultCacheInspection { filePath: string; fileSizeBytes: number; @@ -39,8 +42,6 @@ export interface InspectedRecord { payloadDecodeError?: string; } -const STORE_FORMAT_VERSION = "cultcache.store.v1"; - export function inspectCultCacheBytes( filePath: string, bytes: Uint8Array, @@ -197,6 +198,7 @@ function decodeV1Record(value: unknown, catalogBySchemaId: Map { try { - return { payloadPreview: toJsonSafe(decode(payload)) }; + return { payloadPreview: toJsonSafe(decodeBoundedPayload(payload)) }; } catch (error) { return { payloadPreview: { @@ -349,10 +357,6 @@ function toJsonSafe(value: unknown): unknown { return value; } -function isV1Snapshot(value: unknown): value is unknown[] { - return Array.isArray(value) && value[0] === STORE_FORMAT_VERSION; -} - function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null; } diff --git a/packages/cultcache-ts/src/cult-cache.ts b/packages/cultcache-ts/src/cult-cache.ts index 57766be9..2f2fb063 100644 --- a/packages/cultcache-ts/src/cult-cache.ts +++ b/packages/cultcache-ts/src/cult-cache.ts @@ -1,11 +1,17 @@ -import { decode, encode } from "@msgpack/msgpack"; - +import { + decodeDocumentPayload, + documentPayloadBytes, + documentPayloadFromBytes, + encodeDocumentPayload, + resolveDocumentMembers, +} from "./document"; +import { resolveDocumentFormatter } from "./document-formatter"; +import type { DocumentPayload } from "./document"; import type { AnyCultCacheDocumentDefinition, CacheBackingStore, CultCacheDocumentAccessor, CultCacheDocumentDefinition, - CultCacheDocumentFormatter, CultCacheDocumentRegistry, CultCacheDocumentValue, CultCacheEnvelope, @@ -15,10 +21,16 @@ import type { type Accessor = (value: unknown) => string | undefined; +// A registered definition reads and writes its documents through the owner, on payloads the cache has cloned. +type RegisteredFormatter = { + encode(value: unknown): DocumentPayload; + decode(payload: DocumentPayload): unknown; +}; + type RegisteredDefinition = { readonly definition: AnyCultCacheDocumentDefinition; readonly global: boolean; - readonly formatter: CultCacheDocumentFormatter; + readonly formatter: RegisteredFormatter; readonly catalogEntry: CultCacheSchemaCatalogEntry; nameAccessor?: Accessor; indexAccessors: ReadonlyMap; @@ -675,21 +687,13 @@ export class CultCache { } } - #createFormatter(definition: AnyCultCacheDocumentDefinition): CultCacheDocumentFormatter { - const userFormatter = definition.formatter ?? { - encode: (value: unknown) => encode(value), - decode: (payload: Uint8Array) => decode(payload), - }; + #createFormatter(definition: AnyCultCacheDocumentDefinition): RegisteredFormatter { + // A definition that declares both a codec and a formatter is refused here, where it is registered. + resolveDocumentFormatter(definition); return { - encode: (value: unknown) => { - const parsed = definition.schema.parse(value); - return this.#cloneBytes(userFormatter.encode(parsed)); - }, - decode: (payload: Uint8Array) => { - const decoded = userFormatter.decode(this.#cloneBytes(payload)); - return definition.schema.parse(decoded); - }, + encode: (value: unknown) => this.#cloneBytes(encodeDocumentPayload(definition, value)), + decode: (payload: DocumentPayload) => decodeDocumentPayload(definition, this.#cloneBytes(payload)), }; } @@ -699,7 +703,7 @@ export class CultCache { const canonicalSchemaJson = definition.canonicalSchemaJson ?? JSON.stringify({ schemaName, schemaVersion, - members: [...(definition.members ?? [])] + members: [...resolveDocumentMembers(definition)] .sort((left, right) => left.slot - right.slot) .map((member) => ({ slot: member.slot, @@ -724,7 +728,7 @@ export class CultCache { contentHash: definition.contentHash ?? schemaId, canonicalSchemaJson, compatibleSchemaIds, - members: [...(definition.members ?? [])] + members: [...resolveDocumentMembers(definition)] .sort((left, right) => left.slot - right.slot) .map((member) => ({ slot: member.slot, @@ -1030,7 +1034,7 @@ export class CultCache { return `${type}::${indexName}`; } - #cloneBytes(payload: Uint8Array): Uint8Array { - return new Uint8Array(payload); + #cloneBytes(payload: DocumentPayload): DocumentPayload { + return documentPayloadFromBytes(new Uint8Array(documentPayloadBytes(payload))); } } diff --git a/packages/cultcache-ts/src/document-formatter.ts b/packages/cultcache-ts/src/document-formatter.ts new file mode 100644 index 00000000..799b2558 --- /dev/null +++ b/packages/cultcache-ts/src/document-formatter.ts @@ -0,0 +1,32 @@ +import { decode, encode } from "@msgpack/msgpack"; + +import { MAX_PAYLOAD_DEPTH } from "./payload-depth"; +import type { SlotsCodec } from "./codec"; +import type { AnyCultCacheDocumentDefinition, CultCacheDocumentFormatter } from "./types"; +import { readWire, writeWire } from "./wire"; + +// The one place that decides how a document is encoded: its own formatter, or its codec's, or a plain map. A codec and a +// formatter are two answers to one question, so a definition that carries both is refused wherever it enters (the +// builder resolves through here as well). Package-internal: no entry of the package's exports map names this module, so +// a consumer cannot import the formatter and read a payload around the schema. +export function resolveDocumentFormatter(definition: AnyCultCacheDocumentDefinition): CultCacheDocumentFormatter { + if (definition.codec && definition.formatter) { + throw new Error(`CultCache document type "${definition.type}" declares both a codec and a formatter.`); + } + return definition.formatter ?? (definition.codec ? codecFormatter(definition.codec) : plainDocumentFormatter); +} + +const plainDocumentFormatter: CultCacheDocumentFormatter = { + // The encoder's own depth refusal (100 by default) is set above the limit, so the payload walk decides. + encode: (value: unknown) => encode(value, { maxDepth: MAX_PAYLOAD_DEPTH * 2 }), + decode: (payload: Uint8Array) => decode(payload), +}; + +// The formatter a document gets from a slot codec: the codec's value as one MessagePack payload. Private to this module +// for the same reason as the resolver: exported, it would read a payload without the schema. +function codecFormatter(codec: SlotsCodec): CultCacheDocumentFormatter { + return { + encode: (value) => writeWire(codec.encode(value)), + decode: (payload) => codec.decode(readWire(payload)), + }; +} diff --git a/packages/cultcache-ts/src/document.ts b/packages/cultcache-ts/src/document.ts index ff85d5af..0b019011 100644 --- a/packages/cultcache-ts/src/document.ts +++ b/packages/cultcache-ts/src/document.ts @@ -1,7 +1,11 @@ +import { resolveDocumentFormatter } from "./document-formatter"; +import { checkPayloadDepth } from "./payload-depth"; import type { AnyCultCacheDocumentDefinition, + CultCacheSchemaCatalogMember, CultCacheDocumentDefinition, CultCacheDocumentRegistry, + CultCacheDocumentValue, CultCacheSchema, } from "./types"; @@ -66,7 +70,83 @@ export function defineDocumentType( } } - return Object.freeze({ ...definition }); + resolveDocumentFormatter(definition); + return Object.freeze(definition.codec ? { ...definition, members: resolveDocumentMembers(definition) } : { ...definition }); +} + +/** + * The bytes of one document, as they travel in a store envelope, a CultNet record or a realtime frame. + * + * At run time this is the same `Uint8Array`, so frames encode as they always did. At compile time it is opaque: it is not + * assignable to or from `Uint8Array` or `ArrayLike`, so no byte decoder accepts it. The only reader is + * `decodeDocumentPayload(definition, payload)`, which needs the definition that says how the bytes are laid out, and the + * only writer is `encodeDocumentPayload(definition, value)`. The two escapes are named: `documentPayloadFromBytes` where + * bytes enter (a validated record, a store read, tests, a writer of pre-encoded or signed bytes) and + * `documentPayloadBytes` where they leave (a store write, a frame encode, hashing or signing). + * + * The key is a plain string, not a unique symbol, so two installed copies of this package stay compatible. + * + * What the type guarantees: a payload cannot be read or assigned directly (a decoder call, `const b: Uint8Array = p`, + * `new Uint8Array(p)` fail to compile). What it does not: the runtime value is a `Uint8Array`, so these routes read it + * without the owner: `instanceof Uint8Array` or `ArrayBuffer.isView` narrowing, `Object.values`, `Object.assign` onto a + * `Uint8Array`, a JSON round trip, `Reflect.get`, and a cast. A codec or formatter document read that way is raw bytes, + * not the document. The sanctioned escape for bytes is `documentPayloadBytes`; the reader is `decodeDocumentPayload`. + */ +export interface DocumentPayload { + readonly "cultcache.documentPayload": true; + readonly byteLength: number; +} + +export function documentPayloadFromBytes(bytes: Uint8Array): DocumentPayload { + return bytes as unknown as DocumentPayload; +} + +export function documentPayloadBytes(payload: DocumentPayload): Uint8Array { + return payload as unknown as Uint8Array; +} + +export { CultCachePayloadDepthError, MAX_PAYLOAD_DEPTH, checkPayloadDepth } from "./payload-depth"; + +// The payload nesting bound covers the MessagePack the library itself writes: the plain default formatter and a codec. A +// user formatter's bytes are opaque and in any format; its format and bounds are its own. +function writesLibraryMessagePack(definition: AnyCultCacheDocumentDefinition): boolean { + return !definition.formatter; +} + +// The one reader of a document payload: through the definition's formatter, codec or plain map, then its schema. A +// reader holds the definition or it has no business reading the bytes, so there is no definition-less form. +export function decodeDocumentPayload( + definition: TDefinition, + payload: DocumentPayload, +): CultCacheDocumentValue { + const bytes = documentPayloadBytes(payload); + if (writesLibraryMessagePack(definition)) checkPayloadDepth(bytes, `document type "${definition.type}" payload`); + const decoded = resolveDocumentFormatter(definition).decode(bytes); + return definition.schema.parse(decoded) as CultCacheDocumentValue; +} + +// The one writer: the definition's schema first, then its formatter, codec or plain map. +export function encodeDocumentPayload(definition: AnyCultCacheDocumentDefinition, value: unknown): DocumentPayload { + const bytes = resolveDocumentFormatter(definition).encode(definition.schema.parse(value)); + if (writesLibraryMessagePack(definition)) checkPayloadDepth(bytes, `document type "${definition.type}" value`); + return documentPayloadFromBytes(bytes); +} + +// The schema members of a document: the ones it declares, else those its codec derives, else none. +export function resolveDocumentMembers(definition: AnyCultCacheDocumentDefinition): readonly CultCacheSchemaCatalogMember[] { + if (definition.members || !definition.codec) { + return definition.members ?? []; + } + const codec = definition.codec; + const indexAlias = (slotName: string) => + !Array.isArray(definition.indexes) && definition.indexes + ? Object.entries(definition.indexes).find(([, accessor]) => accessor === slotName)?.[0] ?? null + : null; + return codec.members.map((member, index) => ({ + ...member, + isName: (definition.name as unknown) === codec.names[index], + indexAlias: indexAlias(codec.names[index]), + })); } export function defineDocumentRegistry< diff --git a/packages/cultcache-ts/src/index.ts b/packages/cultcache-ts/src/index.ts index 92f7b481..8646d12e 100644 --- a/packages/cultcache-ts/src/index.ts +++ b/packages/cultcache-ts/src/index.ts @@ -1,6 +1,17 @@ +export * as codecs from "./codec"; +export type { Codec, SlotsCodec } from "./codec"; export { CultCache, CultCacheBuilder } from "./cult-cache"; export { inspectCultCacheBytes } from "./cult-cache-inspector"; -export { defineDocumentRegistry, defineDocumentType } from "./document"; +export { + decodeDocumentPayload, + defineDocumentRegistry, + defineDocumentType, + documentPayloadBytes, + documentPayloadFromBytes, + encodeDocumentPayload, +} from "./document"; +export { CultCachePayloadDepthError, MAX_PAYLOAD_DEPTH } from "./payload-depth"; +export type { DocumentPayload } from "./document"; export { SingleFileMessagePackBackingStore } from "./single-file-messagepack-backing-store"; export type { AnyCultCacheDocumentDefinition, diff --git a/packages/cultcache-ts/src/payload-depth.ts b/packages/cultcache-ts/src/payload-depth.ts new file mode 100644 index 00000000..40ca7afe --- /dev/null +++ b/packages/cultcache-ts/src/payload-depth.ts @@ -0,0 +1,70 @@ +// The one payload nesting rule in TypeScript, the twin of the C# reference's CultPayloadDepth.Check: every MessagePack +// array and map counts, whether a reader reads it or skips past it, and the outermost array is depth 1. Depth +// MAX_PAYLOAD_DEPTH is accepted and one container deeper is refused, on read and on write. +export const MAX_PAYLOAD_DEPTH = 256; + +export class CultCachePayloadDepthError extends Error { + constructor(readonly depth: number, readonly limit: number, subject: string) { + super(`${subject} nests ${depth} MessagePack containers deep; the limit is ${limit}.`); + this.name = "CultCachePayloadDepthError"; + } +} + +// Walks the headers of one MessagePack value iteratively (a count stack bounded by the limit, scalars skipped by length, +// nothing read) and throws at the first container past the limit. The message names the subject, the depth and the limit, +// never payload bytes. A payload that ends early is the reader's to refuse. +export function checkPayloadDepth(bytes: Uint8Array, subject = "document payload"): void { + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + const remaining = new Float64Array(MAX_PAYLOAD_DEPTH); + let depth = 0; + let position = 0; + // The big-endian length that follows the code byte, when the payload is long enough to hold it. + const width = (size: 1 | 2 | 4): number | undefined => { + if (position + 1 + size > bytes.length) return undefined; + return size === 1 ? view.getUint8(position + 1) : size === 2 ? view.getUint16(position + 1) : view.getUint32(position + 1); + }; + while (position < bytes.length) { + const code = bytes[position]; + let header = 0; + let children = 0; + let skip = 0; + let container = false; + if (code <= 0x7f || code >= 0xe0 || code === 0xc0 || code === 0xc1 || code === 0xc2 || code === 0xc3) skip = 1; + else if (code <= 0x8f) { container = true; header = 1; children = 2 * (code & 0x0f); } + else if (code <= 0x9f) { container = true; header = 1; children = code & 0x0f; } + else if (code <= 0xbf) skip = 1 + (code & 0x1f); + else if (code === 0xc4 || code === 0xd9) { const n = width(1); if (n === undefined) return; skip = 2 + n; } + else if (code === 0xc5 || code === 0xda) { const n = width(2); if (n === undefined) return; skip = 3 + n; } + else if (code === 0xc6 || code === 0xdb) { const n = width(4); if (n === undefined) return; skip = 5 + n; } + else if (code === 0xc7) { const n = width(1); if (n === undefined) return; skip = 3 + n; } + else if (code === 0xc8) { const n = width(2); if (n === undefined) return; skip = 4 + n; } + else if (code === 0xc9) { const n = width(4); if (n === undefined) return; skip = 6 + n; } + else if (code === 0xca || code === 0xce || code === 0xd2) skip = 5; + else if (code === 0xcb || code === 0xcf || code === 0xd3) skip = 9; + else if (code === 0xcc || code === 0xd0) skip = 2; + else if (code === 0xcd || code === 0xd1 || code === 0xd4) skip = 3; + else if (code === 0xd5) skip = 4; + else if (code === 0xd6) skip = 6; + else if (code === 0xd7) skip = 10; + else if (code === 0xd8) skip = 18; + else if (code === 0xdc) { const n = width(2); if (n === undefined) return; container = true; header = 3; children = n; } + else if (code === 0xdd) { const n = width(4); if (n === undefined) return; container = true; header = 5; children = n; } + else if (code === 0xde) { const n = width(2); if (n === undefined) return; container = true; header = 3; children = 2 * n; } + else { const n = width(4); if (n === undefined) return; container = true; header = 5; children = 2 * n; } + + if (container) { + if (depth === MAX_PAYLOAD_DEPTH) throw new CultCachePayloadDepthError(MAX_PAYLOAD_DEPTH + 1, MAX_PAYLOAD_DEPTH, subject); + position += header; + if (children > 0) { + remaining[depth++] = children; + continue; + } + } else { + position += skip; + } + + // One element is complete; close every container it was the last element of. + while (depth > 0 && --remaining[depth - 1] === 0) depth--; + if (depth === 0) return; + } +} diff --git a/packages/cultcache-ts/src/single-file-messagepack-backing-store.ts b/packages/cultcache-ts/src/single-file-messagepack-backing-store.ts index 4d2bb4f9..d0f295d5 100644 --- a/packages/cultcache-ts/src/single-file-messagepack-backing-store.ts +++ b/packages/cultcache-ts/src/single-file-messagepack-backing-store.ts @@ -1,9 +1,12 @@ -import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises"; +import { lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises"; import { dirname, resolve } from "node:path"; import { decode, encode } from "@msgpack/msgpack"; import { z } from "zod"; +import { documentPayloadBytes, documentPayloadFromBytes } from "./document"; +import { checkPayloadDepth } from "./payload-depth"; +import { STORE_FORMAT_VERSION, isV1Snapshot, requireV1RecordSlots } from "./store-format"; import type { CacheBackingStore, CultCacheEnvelope, @@ -12,8 +15,6 @@ import type { PushAllOptions, } from "./types"; -const STORE_FORMAT_VERSION = "cultcache.store.v1"; - const envelopeSchema = z.object({ key: z.string().min(1), type: z.string().min(1), @@ -42,64 +43,60 @@ export class SingleFileMessagePackBackingStore implements CacheBackingStore { } async pullAll(): Promise { - try { - const data = await readFile(this.filePath); - if (data.length === 0) { - return []; - } + // An empty file is not a store, since no CultCache writer leaves one, so it is + // decoded and refused. Only a read that finds nothing at the path is an empty store. + const data = await readStore(this.filePath); + if (data === undefined) { + return []; + } - const decoded = decode(data); - const snapshot = decodeSnapshot(decoded); - if (snapshot) { - return snapshot.records.map((record) => { - const catalogEntry = resolveCatalogEntryForRecord(record, snapshot.catalogBySchemaId); - if (!catalogEntry) { - throw new Error(`CultCache persisted record "${record.key}" references missing schema id "${record.schemaId}".`); - } - - return { - key: record.key, - type: catalogEntry.schemaName, - schemaId: record.schemaId, - catalogEntry, - payload: record.payload, - storedAt: record.storedAt, - }; - }); - } - - const legacy = decodeLegacyEnvelopeArray(decoded); - if (legacy) { - let repairedLegacyPayload = false; - const normalized = legacy.map((entry) => { - const payload = normalizePayload(entry.payload); - if (payload !== entry.payload) { - repairedLegacyPayload = true; - } - - return { - ...entry, - payload, - }; - }); - const parsed = envelopeArraySchema.parse(normalized) as CultCacheEnvelope[]; - - if (repairedLegacyPayload) { - await this.#writeAll(parsed); + const decoded = decode(data); + const snapshot = decodeSnapshot(decoded); + if (snapshot) { + return snapshot.records.map((record) => { + const catalogEntry = resolveCatalogEntryForRecord(record, snapshot.catalogBySchemaId); + if (!catalogEntry) { + throw new Error(`CultCache persisted record "${record.key}" references missing schema id "${record.schemaId}".`); } - return parsed; - } - - throw new Error(`CultCache file ${this.filePath} is not a recognized CultCache MessagePack store.`); - } catch (error) { - const code = (error as NodeJS.ErrnoException).code; - if (code === "ENOENT") { - return []; - } - - throw error; + return { + key: record.key, + type: catalogEntry.schemaName, + schemaId: record.schemaId, + catalogEntry, + payload: documentPayloadFromBytes(record.payload), + storedAt: record.storedAt, + }; + }); } + + const legacy = decodeLegacyEnvelopeArray(decoded); + if (legacy) { + let repairedLegacyPayload = false; + const normalized = legacy.map((entry) => { + const payload = normalizePayload(entry.payload); + if (payload !== entry.payload) { + repairedLegacyPayload = true; + } + + return { + ...entry, + payload, + }; + }); + const parsed: CultCacheEnvelope[] = envelopeArraySchema.parse(normalized).map((entry) => ({ + ...entry, + payload: documentPayloadFromBytes(entry.payload), + })); + + if (repairedLegacyPayload) { + await this.#writeAll(parsed); + } + + return parsed; + } + + throw new Error(`CultCache file ${this.filePath} is not a recognized CultCache MessagePack store.`); } async push(entry: CultCacheEnvelope): Promise { @@ -125,16 +122,8 @@ export class SingleFileMessagePackBackingStore implements CacheBackingStore { async pushAll(entries: CultCacheEnvelope[], options: PushAllOptions = {}): Promise { await this.#enqueue(async () => { - if (options.soft) { - try { - await readFile(this.filePath); - return; - } catch (error) { - const code = (error as NodeJS.ErrnoException).code; - if (code !== "ENOENT") { - throw error; - } - } + if (options.soft && (await readStore(this.filePath)) !== undefined) { + return; } await this.#writeAll(entries); @@ -174,6 +163,33 @@ export class SingleFileMessagePackBackingStore implements CacheBackingStore { } } +/** + * Reads a store file, or returns undefined when nothing is at its path. A dangling symbolic + * link is something: reading it as empty would let the writer rename a file over the link + * and move the store off its volume. Any other failure to reach the file is thrown. + */ +async function readStore(path: string): Promise { + try { + return await readFile(path); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== "ENOENT") { + throw error; + } + } + + try { + await lstat(path); + } catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") { + return undefined; + } + + throw error; + } + + throw Object.assign(new Error(`CultCache store ${path} is a symbolic link whose target does not exist.`), { code: "ENOENT" }); +} + async function renameWithRetry(source: string, destination: string): Promise { let delayMs = 10; let lastError: unknown; @@ -221,7 +237,7 @@ function encodeSnapshot(entries: CultCacheEnvelope[]): unknown[] { entry.key, schemaIdForEnvelope(entry), entry.storedAt, - entry.payload, + documentPayloadBytes(entry.payload), ]); return [ @@ -285,7 +301,7 @@ function encodeCatalogMember(member: CultCacheSchemaCatalogMember): unknown[] { } function decodeSnapshot(decoded: unknown): DecodedSnapshot | undefined { - if (!Array.isArray(decoded) || decoded.length === 0 || decoded[0] !== STORE_FORMAT_VERSION) { + if (!isV1Snapshot(decoded)) { return undefined; } @@ -340,6 +356,7 @@ function resolveCatalogEntryForRecord( function inferSchemaVersionFromPayload(payload: Uint8Array): string | undefined { try { + checkPayloadDepth(payload); const decoded = decode(payload); if (Array.isArray(decoded) && typeof decoded[0] === "string") { return decoded[0]; @@ -436,6 +453,7 @@ function decodeRecord(value: unknown): PersistedRecord { throw new Error("CultCache persisted records must be MessagePack arrays."); } + requireV1RecordSlots(value); const [key = "", schemaId = "", storedAt = "", payload = new Uint8Array()] = value; if (!isNonEmptyString(key) || !isNonEmptyString(schemaId) || !isNonEmptyString(storedAt)) { throw new Error("CultCache persisted records must declare key, schemaId, and storedAt."); diff --git a/packages/cultcache-ts/src/store-format.ts b/packages/cultcache-ts/src/store-format.ts new file mode 100644 index 00000000..4f579505 --- /dev/null +++ b/packages/cultcache-ts/src/store-format.ts @@ -0,0 +1,61 @@ +export const STORE_FORMAT_VERSION = "cultcache.store.v1"; + +const STORE_FORMAT_PREFIX = "cultcache.store."; +const PERSISTED_RECORD_SLOTS = 4; + +/** + * True for a v1 snapshot, false for anything that is not a CultCache store header (the legacy + * envelope array). Any other `cultcache.store.*` header is refused by name. + */ +export function isV1Snapshot(decoded: unknown): decoded is unknown[] { + if (!Array.isArray(decoded) || typeof decoded[0] !== "string" || !decoded[0].startsWith(STORE_FORMAT_PREFIX)) { + return false; + } + + if (decoded[0] !== STORE_FORMAT_VERSION) { + throw new Error( + `CultCache store format ${describeHeader(decoded[0])} is not one this runtime reads; it reads "${STORE_FORMAT_VERSION}" only.`, + ); + } + + return true; +} + +/** + * A store header as a refusal may show it: echoed in the shape `cultcache.store.v`, + * and otherwise described only by its length, since the bytes are the store's. + */ +function describeHeader(header: string): string { + return /^cultcache\.store\.v[0-9]+$/u.test(header) + ? `"${header}"` + : `an unrecognised ${STORE_FORMAT_PREFIX}* header of ${new TextEncoder().encode(header).length} bytes`; +} + +/** + * A record key or schema id as a refusal may show it: a string is an identity and is named; + * anything else is described by its type, since the value is the store's. + */ +function describeIdentity(value: unknown): string { + if (typeof value === "string") { + return `"${value}"`; + } + + const kind = Array.isArray(value) + ? "array" + : value instanceof Uint8Array + ? "bytes" + : value === null + ? "nil" + : typeof value; + return `<${kind}>`; +} + +/** Refuses a persisted record with more slots than v1 defines, naming its key and schema id. */ +export function requireV1RecordSlots(record: unknown[]): void { + if (record.length > PERSISTED_RECORD_SLOTS) { + throw new Error( + `CultCache record ${describeIdentity(record[0])} (schema ${describeIdentity(record[1])}) has ${record.length} slots, more than ` + + `the ${PERSISTED_RECORD_SLOTS} of a ${STORE_FORMAT_VERSION} record, so this is not a valid store.`, + ); + } +} diff --git a/packages/cultcache-ts/src/types.ts b/packages/cultcache-ts/src/types.ts index fe3795e1..88c20f2e 100644 --- a/packages/cultcache-ts/src/types.ts +++ b/packages/cultcache-ts/src/types.ts @@ -1,3 +1,6 @@ +import type { SlotsCodec } from "./codec"; +import type { DocumentPayload } from "./document"; + export type CultCacheIndexScalar = string | number | boolean | bigint; export interface CultCacheSchema { @@ -60,6 +63,7 @@ export interface CultCacheDocumentDefinition>>> | readonly CultCacheDocumentIndexDefinition>[]; formatter?: CultCacheDocumentFormatter>; + codec?: SlotsCodec & object>; } export type CultCacheDocumentValue = InferCultCacheSchemaValue< @@ -77,7 +81,7 @@ export interface CultCacheDocumentRegistry< export interface CultCacheEnvelope { key: string; type: string; - payload: Uint8Array; + payload: DocumentPayload; storedAt: string; schemaId?: string; catalogEntry?: CultCacheSchemaCatalogEntry; diff --git a/packages/cultcache-ts/src/wire.ts b/packages/cultcache-ts/src/wire.ts new file mode 100644 index 00000000..12bf572a --- /dev/null +++ b/packages/cultcache-ts/src/wire.ts @@ -0,0 +1,134 @@ +// The slice of MessagePack a codec value uses: nil, booleans, integers, floats, strings, binaries and arrays. A codec +// must tell an integer from a float and keep 64-bit integers whole, which a general decoder that hands back JS numbers +// cannot; so the codec path owns its reader and writer. An integer decodes to a number, or to a bigint when it is +// outside the safe range. A float decodes to a WireFloat, whatever its value. + +export class WireFloat { + // signalling: a float32 NaN whose quiet bit is clear. The JS number it becomes has lost that payload. + constructor(readonly value: number, readonly wide: boolean, readonly signalling = false) {} +} + +const SAFE_MIN = BigInt(Number.MIN_SAFE_INTEGER); +const SAFE_MAX = BigInt(Number.MAX_SAFE_INTEGER); +const utf8 = new TextEncoder(); +const utf8Decoder = new TextDecoder(); + +export function writeWire(tree: unknown): Uint8Array { + const parts: number[] = []; + put(tree, parts); + return Uint8Array.from(parts); +} + +function be(parts: number[], bytes: number, value: bigint): void { + for (let shift = BigInt((bytes - 1) * 8); shift >= 0n; shift -= 8n) { + parts.push(Number((value >> shift) & 0xffn)); + } +} + +function putInt(value: bigint, parts: number[]): void { + if (value >= 0n) { + if (value < 128n) parts.push(Number(value)); + else if (value < 0x100n) { parts.push(0xcc); be(parts, 1, value); } + else if (value < 0x10000n) { parts.push(0xcd); be(parts, 2, value); } + else if (value < 0x100000000n) { parts.push(0xce); be(parts, 4, value); } + else if (value < 0x10000000000000000n) { parts.push(0xcf); be(parts, 8, value); } + else throw new Error("cannot write an integer wider than 64 bits."); + } else if (value >= -32n) parts.push(0x100 + Number(value)); + else if (value >= -0x80n) { parts.push(0xd0); be(parts, 1, value & 0xffn); } + else if (value >= -0x8000n) { parts.push(0xd1); be(parts, 2, value & 0xffffn); } + else if (value >= -0x80000000n) { parts.push(0xd2); be(parts, 4, value & 0xffffffffn); } + else if (value >= -0x8000000000000000n) { parts.push(0xd3); be(parts, 8, value & 0xffffffffffffffffn); } + else throw new Error("cannot write an integer wider than 64 bits."); +} + +function putLength(length: number, parts: number[], fix: number, fixMax: number, codes: readonly [number, number, number]): void { + if (length <= fixMax) parts.push(fix | length); + else if (codes[0] !== 0 && length < 0x100) { parts.push(codes[0]); be(parts, 1, BigInt(length)); } + else if (length < 0x10000) { parts.push(codes[1]); be(parts, 2, BigInt(length)); } + else { parts.push(codes[2]); be(parts, 4, BigInt(length)); } +} + +function put(node: unknown, parts: number[]): void { + if (node === null) parts.push(0xc0); + else if (typeof node === "boolean") parts.push(node ? 0xc3 : 0xc2); + else if (typeof node === "bigint") putInt(node, parts); + else if (typeof node === "number") { + if (!Number.isSafeInteger(node)) throw new Error("cannot write a number that is not a safe integer; floats are WireFloat."); + putInt(BigInt(node), parts); + } else if (node instanceof WireFloat) { + const view = new DataView(new ArrayBuffer(8)); + if (node.wide) { view.setFloat64(0, node.value); parts.push(0xcb); } else { view.setFloat32(0, node.value); parts.push(0xca); } + for (let index = 0; index < (node.wide ? 8 : 4); index += 1) parts.push(view.getUint8(index)); + } else if (typeof node === "string") { + const text = utf8.encode(node); + putLength(text.length, parts, 0xa0, 31, [0xd9, 0xda, 0xdb]); + for (const byte of text) parts.push(byte); + } else if (node instanceof Uint8Array) { + putLength(node.length, parts, 0, -1, [0xc4, 0xc5, 0xc6]); + for (const byte of node) parts.push(byte); + } else if (Array.isArray(node)) { + putLength(node.length, parts, 0x90, 15, [0, 0xdc, 0xdd]); + for (const element of node) put(element, parts); + } else { + throw new Error("cannot write this kind of value."); + } +} + +export function readWire(payload: Uint8Array): unknown { + const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength); + let offset = 0; + + const take = (count: number): number => { + if (offset + count > payload.length) throw new Error("the MessagePack payload is truncated."); + offset += count; + return offset - count; + }; + const integer = (value: bigint): number | bigint => (value >= SAFE_MIN && value <= SAFE_MAX ? Number(value) : value); + const string = (length: number): string => utf8Decoder.decode(payload.subarray(take(length), offset)); + const binary = (length: number): Uint8Array => payload.slice(take(length), offset); + const array = (length: number): unknown[] => { + const out: unknown[] = []; + for (let index = 0; index < length; index += 1) out.push(next()); + return out; + }; + + function next(): unknown { + const head = payload[take(1)]; + if (head < 0x80) return head; + if (head >= 0xe0) return head - 0x100; + if (head >= 0xa0 && head <= 0xbf) return string(head & 0x1f); + if (head >= 0x90 && head <= 0x9f) return array(head & 0x0f); + switch (head) { + case 0xc0: return null; + case 0xc2: return false; + case 0xc3: return true; + case 0xc4: return binary(view.getUint8(take(1))); + case 0xc5: return binary(view.getUint16(take(2))); + case 0xc6: return binary(view.getUint32(take(4))); + case 0xca: { + const at = take(4); + const bits = view.getUint32(at); + return new WireFloat(view.getFloat32(at), false, (bits & 0x7f800000) === 0x7f800000 && (bits & 0x007fffff) !== 0 && (bits & 0x00400000) === 0); + } + case 0xcb: return new WireFloat(view.getFloat64(take(8)), true); + case 0xcc: return view.getUint8(take(1)); + case 0xcd: return view.getUint16(take(2)); + case 0xce: return view.getUint32(take(4)); + case 0xcf: return integer(view.getBigUint64(take(8))); + case 0xd0: return view.getInt8(take(1)); + case 0xd1: return view.getInt16(take(2)); + case 0xd2: return view.getInt32(take(4)); + case 0xd3: return integer(view.getBigInt64(take(8))); + case 0xd9: return string(view.getUint8(take(1))); + case 0xda: return string(view.getUint16(take(2))); + case 0xdb: return string(view.getUint32(take(4))); + case 0xdc: return array(view.getUint16(take(2))); + case 0xdd: return array(view.getUint32(take(4))); + default: throw new Error("the MessagePack payload holds a type a codec does not read (map, extension or reserved)."); + } + } + + const tree = next(); + if (offset !== payload.length) throw new Error("the MessagePack payload has bytes after its value."); + return tree; +} diff --git a/packages/cultcache-ts/test/cult-cache.test.ts b/packages/cultcache-ts/test/cult-cache.test.ts index 5932b2f8..6dc59451 100644 --- a/packages/cultcache-ts/test/cult-cache.test.ts +++ b/packages/cultcache-ts/test/cult-cache.test.ts @@ -2,7 +2,7 @@ import assert from "node:assert/strict"; import { exec, execFile } from "node:child_process"; import { EventEmitter } from "node:events"; import { existsSync } from "node:fs"; -import { access, mkdtemp, readFile, writeFile } from "node:fs/promises"; +import { access, lstat, mkdir, mkdtemp, readdir, readFile, symlink, writeFile } from "node:fs/promises"; import { homedir, tmpdir } from "node:os"; import { dirname, join, resolve, delimiter } from "node:path"; import { test } from "node:test"; @@ -13,7 +13,7 @@ import { z } from "zod"; import { CultCache } from "../src/cult-cache"; import { inspectCultCacheBytes } from "../src/cult-cache-inspector"; -import { defineDocumentRegistry, defineDocumentType } from "../src/document"; +import { defineDocumentRegistry, defineDocumentType, documentPayloadBytes, documentPayloadFromBytes } from "../src/document"; import { SingleFileMessagePackBackingStore } from "../src/single-file-messagepack-backing-store"; import type { CacheBackingStore, CultCacheEnvelope, CultCacheSchema } from "../src/types"; @@ -202,7 +202,7 @@ test("CultCache fails closed on unknown or illegal persisted polymorphic state", { key: "mystery", type: "forbidden", - payload: encode({ theme: "ash" }), + payload: documentPayloadFromBytes(encode({ theme: "ash" })), storedAt: new Date().toISOString(), }, ])) @@ -219,13 +219,13 @@ test("CultCache fails closed on unknown or illegal persisted polymorphic state", { key: "one", type: "settings", - payload: encode({ theme: "ash" }), + payload: documentPayloadFromBytes(encode({ theme: "ash" })), storedAt: new Date().toISOString(), }, { key: "two", type: "settings", - payload: encode({ theme: "ember" }), + payload: documentPayloadFromBytes(encode({ theme: "ember" })), storedAt: new Date().toISOString(), }, ])) @@ -328,6 +328,26 @@ test("CultCache can ingest raw envelopes without re-encoding the payload", async assert.deepEqual(target.getRequiredEnvelope(noteDocument, "note:hello").payload, envelope.payload); }); +test("the cache keeps its own copy of an envelope's bytes: a caller mutating them afterwards changes nothing", async () => { + const noteDocument = defineDocumentType({ type: "note", schema: z.object({ title: z.string(), body: z.string() }) }); + const origin = CultCache.builder().withDocumentType(noteDocument) + .withGenericStore(new SingleFileMessagePackBackingStore(join(await mkdtemp(join(tmpdir(), "cultcache-ts-")), "origin.msgpack"))).build(); + const target = CultCache.builder().withDocumentType(noteDocument) + .withGenericStore(new SingleFileMessagePackBackingStore(join(await mkdtemp(join(tmpdir(), "cultcache-ts-")), "target.msgpack"))).build(); + await origin.put(noteDocument, "note:hello", { title: "Hello", body: "world" }); + + const envelope = origin.getRequiredEnvelope(noteDocument, "note:hello"); + const before = Buffer.from(documentPayloadBytes(envelope.payload)); + await target.putEnvelope(noteDocument, envelope); + documentPayloadBytes(envelope.payload).fill(0); + + assert.deepEqual(Buffer.from(documentPayloadBytes(target.getRequiredEnvelope(noteDocument, "note:hello").payload)), before); + const read = target.getRequiredEnvelope(noteDocument, "note:hello"); + documentPayloadBytes(read.payload).fill(0); + assert.deepEqual(Buffer.from(documentPayloadBytes(target.getRequiredEnvelope(noteDocument, "note:hello").payload)), before); + assert.deepEqual(target.getRequired(noteDocument, "note:hello"), { title: "Hello", body: "world" }); +}); + test("SingleFileMessagePackBackingStore writes the CultCache v1 snapshot shape", async () => { const namedDocument = defineDocumentType({ type: "tests.named_entry", @@ -650,7 +670,7 @@ async function storeState(path: string): Promise { return []; } return (await new SingleFileMessagePackBackingStore(path).pullAll()) - .map((entry) => `${entry.type}:${entry.key}:${Buffer.from(entry.payload).toString("hex")}`) + .map((entry) => `${entry.type}:${entry.key}:${Buffer.from(documentPayloadBytes(entry.payload)).toString("hex")}`) .sort(); } @@ -821,8 +841,8 @@ test("concurrentGlobalPutsCannotBothReachDisk", async () => { const onDisk = await inner.pullAll(); assert.deepEqual(onDisk.map((entry) => entry.key), [CultCache.GLOBAL_KEY]); assert.deepEqual( - Buffer.from(onDisk[0].payload), - Buffer.from(cache.getRequiredEnvelope(settingsDocument, CultCache.GLOBAL_KEY).payload), + Buffer.from(documentPayloadBytes(onDisk[0].payload)), + Buffer.from(documentPayloadBytes(cache.getRequiredEnvelope(settingsDocument, CultCache.GLOBAL_KEY).payload)), ); assert.deepEqual(cache.getRequiredGlobal(settingsDocument), { t: "second" }); const reloaded = build(new SingleFileMessagePackBackingStore(storePath)); @@ -1042,7 +1062,7 @@ test("pullWithThrowingIndexAccessorLeavesCacheUnchanged", async () => { await new SingleFileMessagePackBackingStore(storePath).push({ ...potion, key: "bomb", - payload: encode({ name: "Bomb", category: "explosive" }), + payload: documentPayloadFromBytes(encode({ name: "Bomb", category: "explosive" })), }); await assert.rejects(cache.pullAllBackingStores(), /category accessor refuses Bomb/u); @@ -1349,7 +1369,7 @@ async function writeTsInteropStore( members: interopNoteDocument.members, }, storedAt: new Date().toISOString(), - payload, + payload: documentPayloadFromBytes(payload), }); return note; } @@ -1413,3 +1433,178 @@ async function runJsonCommand( return JSON.parse(trimmed.split(/\r?\n/).at(-1) as string); } + +// Shared refusal vectors: tests/vectors/document-variants-c0, read by every runtime's tests. +const variantVectors = resolve(cultLibRoot, "tests", "vectors", "document-variants-c0"); +const itemSchemaId = "sha256:88d3fdf0a927acf3b163940d8f8c7fe62b3316542ce771a67ec8bc038f594788"; + +async function pullVector(name: string): Promise { + const dir = await mkdtemp(join(tmpdir(), "cultcache-vector-")); + const file = join(dir, "store.msgpack"); + await writeFile(file, await readFile(join(variantVectors, name))); + return new SingleFileMessagePackBackingStore(file).pullAll(); +} + +test("SingleFileMessagePackBackingStore refuses an unknown store header by name", async () => { + await assert.rejects(() => pullVector("unknown-header.msgpack"), /cultcache\.store\.v9/u); +}); + +test("SingleFileMessagePackBackingStore refuses an extra record slot naming the record", async () => { + await assert.rejects( + () => pullVector("extra-slot-full-payload.msgpack"), + (error: Error) => error.message.includes("item:anvil") && error.message.includes(itemSchemaId), + ); +}); + +test("SingleFileMessagePackBackingStore refuses a variant store by version or record", async () => { + await assert.rejects( + () => pullVector("variant-v2.msgpack"), + (error: Error) => error.message.includes("cultcache.store.v2") || error.message.includes("item:anvil-big"), + ); +}); + +test("SingleFileMessagePackBackingStore refuses the C#-written variant store by version or record", async () => { + await assert.rejects( + () => pullVector("../document-variants-c1/variant-store.msgpack"), + (error: Error) => error.message.includes("cultcache.store.v2") || error.message.includes("laser-big"), + ); +}); + +test("SingleFileMessagePackBackingStore refusals say what was found without blaming variants", async () => { + await assert.rejects( + () => pullVector("unknown-header.msgpack"), + (error: Error) => error.message.includes("not one this runtime reads") && !error.message.includes("variant"), + ); + await assert.rejects( + () => pullVector("extra-slot-full-payload.msgpack"), + (error: Error) => error.message.includes("not a valid store") && !error.message.includes("variant"), + ); +}); + +test("SingleFileMessagePackBackingStore reads only a missing store as empty", async () => { + const dir = await mkdtemp(join(tmpdir(), "cultcache-absent-")); + assert.deepEqual(await new SingleFileMessagePackBackingStore(join(dir, "store.cc")).pullAll(), []); + + // An existing empty file is not a store: no CultCache writer leaves one. + const empty = join(dir, "empty.cc"); + await writeFile(empty, new Uint8Array()); + await assert.rejects(() => new SingleFileMessagePackBackingStore(empty).pullAll()); + assert.equal((await readFile(empty)).length, 0); + + // An empty array is the legacy envelope array with no envelopes: no header, no format claimed. + const legacyEmpty = join(dir, "legacy-empty.cc"); + await writeFile(legacyEmpty, Uint8Array.of(0x90)); + assert.deepEqual(await new SingleFileMessagePackBackingStore(legacyEmpty).pullAll(), []); +}); + +test("SingleFileMessagePackBackingStore reports a store it cannot reach as an I/O error", { skip: process.platform === "win32" }, async () => { + const dir = await mkdtemp(join(tmpdir(), "cultcache-unreachable-")); + const loop = join(dir, "loop.cc"); + await symlink(loop, loop); + const parent = join(dir, "body"); + await writeFile(parent, "not a directory"); + for (const [path, code] of [[loop, "ELOOP"], [join(parent, "store.cc"), "ENOTDIR"]] as const) { + await assert.rejects( + () => new SingleFileMessagePackBackingStore(path).pullAll(), + (error: NodeJS.ErrnoException) => error.code === code, + ); + } +}); + +test("SingleFileMessagePackBackingStore refusals never echo a value from the store", async () => { + const dir = await mkdtemp(join(tmpdir(), "cultcache-canary-")); + const file = join(dir, "store.cc"); + const cases: Array<[unknown[], boolean | undefined]> = [ + [["cultcache.store.v12", [], []], true], + [["cultcache.store.SECRET-HEADER", [], []], false], + [["cultcache.store.v12SECRET", [], []], false], + [["cultcache.store.v", [], []], false], + [["cultcache.store.v1", ["SECRET-CATALOG-TEXT"], []], undefined], + ]; + for (const [value, echoed] of cases) { + await writeFile(file, encode(value)); + const header = value[0] as string; + await assert.rejects( + () => new SingleFileMessagePackBackingStore(file).pullAll(), + (error: Error) => { + if (echoed) { + return error.message.includes(`"${header}"`); + } + return !error.message.includes("SECRET") + && (echoed === undefined || (!error.message.includes(`"${header}"`) && error.message.includes(`of ${header.length} bytes`))); + }, + ); + } +}); + +test("SingleFileMessagePackBackingStore refuses a dangling symlink at its path and writes nothing", { skip: process.platform === "win32" }, async () => { + const dir = await mkdtemp(join(tmpdir(), "cultcache-dangling-")); + const volume = join(dir, "volume"); + await mkdir(volume); + const file = join(dir, "store.cc"); + await symlink(join(volume, "store.cc"), file); + const store = new SingleFileMessagePackBackingStore(file); + const envelope = { key: "k", type: "t", payload: documentPayloadFromBytes(Uint8Array.of(0x90)), storedAt: "2026-09-30T00:00:00Z" }; + await assert.rejects(() => store.pullAll(), (error: NodeJS.ErrnoException) => error.code === "ENOENT"); + await assert.rejects(() => store.push(envelope), (error: NodeJS.ErrnoException) => error.code === "ENOENT"); + await assert.rejects(() => store.pushAll([envelope], { soft: true }), (error: NodeJS.ErrnoException) => error.code === "ENOENT"); + assert.ok((await lstat(file)).isSymbolicLink()); + assert.deepEqual(await readdir(volume), []); +}); + +test("SingleFileMessagePackBackingStore record refusal names only a string key", async () => { + const dir = await mkdtemp(join(tmpdir(), "cultcache-record-key-")); + const file = join(dir, "store.cc"); + const secret = new TextEncoder().encode("SECRET-BYTES"); + for (const [key, schema] of [[["SECRET-IN-ARRAY"], "s"], [secret, "s"], ["k", { SECRET: 1 }]] as const) { + await writeFile(file, encode(["cultcache.store.v1", [], [[key, schema, "t", Uint8Array.of(0x90), "extra"]]])); + await assert.rejects( + () => new SingleFileMessagePackBackingStore(file).pullAll(), + (error: Error) => !error.message.includes("SECRET") && !error.message.includes("83,69,67") && error.message.includes("not a valid store"), + ); + } +}); + +// What a write does through a symbolic link today. R3 decides whether a write resolves the link +// or refuses it; these pin the current behaviour so that change is deliberate. +test("R3 decides resolve-or-refuse: a push through a live link replaces the link", { skip: process.platform === "win32" }, async () => { + const dir = await mkdtemp(join(tmpdir(), "cultcache-live-link-")); + const volume = join(dir, "volume"); + await mkdir(volume); + const target = join(volume, "store.cc"); + const envelope = { key: "a", type: "t", payload: documentPayloadFromBytes(Uint8Array.of(0x90)), storedAt: "2026-09-30T00:00:00Z" }; + await new SingleFileMessagePackBackingStore(target).push(envelope); + const before = await readFile(target); + const link = join(dir, "store.cc"); + await symlink(target, link); + await new SingleFileMessagePackBackingStore(link).push({ ...envelope, key: "b" }); + assert.ok((await lstat(link)).isFile()); + assert.deepEqual(await readFile(target), before); +}); + +test("R3 decides resolve-or-refuse: a pushAll through a dangling link replaces the link", { skip: process.platform === "win32" }, async () => { + const dir = await mkdtemp(join(tmpdir(), "cultcache-dangling-push-all-")); + const volume = join(dir, "volume"); + await mkdir(volume); + const link = join(dir, "store.cc"); + await symlink(join(volume, "store.cc"), link); + await new SingleFileMessagePackBackingStore(link).pushAll([{ key: "a", type: "t", payload: documentPayloadFromBytes(Uint8Array.of(0x90)), storedAt: "2026-09-30T00:00:00Z" }]); + assert.ok((await lstat(link)).isFile()); + assert.deepEqual(await readdir(volume), []); +}); + +test("CultCache inspector refuses the same vectors by name", async () => { + const inspect = async (name: string) => inspectCultCacheBytes(name, await readFile(join(variantVectors, name))); + await assert.rejects(() => inspect("unknown-header.msgpack"), /cultcache\.store\.v9/u); + await assert.rejects( + () => inspect("extra-slot-full-payload.msgpack"), + (error: Error) => error.message.includes("item:anvil") && error.message.includes(itemSchemaId), + ); +}); + +test("a v1 store written at the base commit still reads byte for byte", async () => { + const envelopes = await pullVector("v1-base.msgpack"); + assert.deepEqual(envelopes.map((entry) => [entry.key, entry.type]), [["alpha", "vectors.item"], ["beta", "vectors.item"]]); + assert.deepEqual([...documentPayloadBytes(envelopes[0]!.payload)], [0x92, 0xa5, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x01]); + assert.deepEqual([...documentPayloadBytes(envelopes[1]!.payload)], [0x92, 0xa4, 0x62, 0x65, 0x74, 0x61, 0x02]); +}); diff --git a/packages/cultcache-ts/test/decode-document-payload.test.ts b/packages/cultcache-ts/test/decode-document-payload.test.ts new file mode 100644 index 00000000..a18055de --- /dev/null +++ b/packages/cultcache-ts/test/decode-document-payload.test.ts @@ -0,0 +1,43 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; + +import { encode } from "@msgpack/msgpack"; +import { z } from "zod"; + +import { codecs, decodeDocumentPayload, defineDocumentType, documentPayloadBytes, documentPayloadFromBytes, encodeDocumentPayload } from "../src"; + +const payloadOf = (bytes: Uint8Array) => documentPayloadFromBytes(bytes); +const note = z.object({ id: z.string(), count: z.number() }); +const plain = defineDocumentType({ type: "t.plain", schemaId: "t.plain.v0", schema: note, name: "id" }); +const codec = defineDocumentType({ + type: "t.codec", + schemaId: "t.codec.v0", + schema: note, + name: "id", + codec: codecs.slots<{ id: string; count: number }>({ 0: ["id", codecs.string], 1: ["count", codecs.int32] }, "T.Note"), +}); +const formatted = defineDocumentType({ + type: "t.formatted", + schemaId: "t.formatted.v0", + schema: note, + name: "id", + formatter: { encode: (value) => encode([(value as { id: string }).id]), decode: () => ({ id: "from-formatter", count: 0 }) }, +}); + +test("a payload is read by its definition's formatter, a codec's, or a plain map", () => { + assert.deepEqual(decodeDocumentPayload(plain, payloadOf(encode({ id: "a", count: 1 }))), { id: "a", count: 1 }); + assert.deepEqual(decodeDocumentPayload(codec, payloadOf(encode(["a", 1]))), { id: "a", count: 1 }); + assert.deepEqual(decodeDocumentPayload(formatted, payloadOf(new Uint8Array([0xc0]))), { id: "from-formatter", count: 0 }); +}); + +test("a definition that declares both a codec and a formatter is refused where its payload is read", () => { + const both = { ...codec, formatter: formatted.formatter } as typeof codec; + assert.throws(() => decodeDocumentPayload(both, payloadOf(encode(["a", 1]))), (error: Error) => + error.message === 'CultCache document type "t.codec" declares both a codec and a formatter.'); +}); + +test("a payload is written by its definition's codec or formatter, the way it is read", () => { + assert.deepEqual(documentPayloadBytes(encodeDocumentPayload(codec, { id: "a", count: 1 })), encode(["a", 1])); + assert.deepEqual(documentPayloadBytes(encodeDocumentPayload(plain, { id: "a", count: 1 })), encode({ id: "a", count: 1 })); + assert.deepEqual(documentPayloadBytes(encodeDocumentPayload(formatted, { id: "a", count: 1 })), encode(["a"])); +}); diff --git a/packages/cultcache-ts/test/payload-depth.test.ts b/packages/cultcache-ts/test/payload-depth.test.ts new file mode 100644 index 00000000..02e55ab3 --- /dev/null +++ b/packages/cultcache-ts/test/payload-depth.test.ts @@ -0,0 +1,273 @@ +import assert from "node:assert/strict"; +import { mkdtemp, readFile, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { test } from "node:test"; + +import { encode } from "@msgpack/msgpack"; +import { z } from "zod"; + +import * as root from "../src"; +import { inspectCultCacheBytes } from "../src/cult-cache-inspector"; +import { + CultCachePayloadDepthError, + MAX_PAYLOAD_DEPTH, + decodeDocumentPayload, + defineDocumentType, + documentPayloadBytes, + documentPayloadFromBytes, + encodeDocumentPayload, +} from "../src/document"; +import * as codecs from "../src/codec"; +import { checkPayloadDepth } from "../src/payload-depth"; +import { SingleFileMessagePackBackingStore } from "../src/single-file-messagepack-backing-store"; + +const L = MAX_PAYLOAD_DEPTH; +const CANARY = "CANARY-payload-depth-91d3"; + +const cat = (...parts: Uint8Array[]) => Uint8Array.from(parts.flatMap((part) => [...part])); +const bytes = (...values: number[]) => Uint8Array.from(values); +const repeat = (unit: Uint8Array, times: number) => { + const out = new Uint8Array(unit.length * times); + for (let index = 0; index < times; index += 1) out.set(unit, index * unit.length); + return out; +}; +// n containers nested in one another around a leaf; `open` is one container's header with one child (two for a map). +const chain = (open: Uint8Array, n: number, leaf: Uint8Array = bytes(0xc0)) => cat(repeat(open, n), leaf); +const arrays = (n: number, leaf?: Uint8Array) => chain(bytes(0x91), n, leaf); + +const refused = (payload: Uint8Array, label: string) => + assert.throws(() => checkPayloadDepth(payload), (error: unknown) => + error instanceof CultCachePayloadDepthError && error.depth === L + 1 && error.limit === L, label); + +test("the limit is 256: depth 256 passes and 257 is refused, for every array and map header width", () => { + assert.equal(L, 256); + const kinds: [string, Uint8Array][] = [ + ["fixarray", bytes(0x91)], + ["array16", bytes(0xdc, 0, 1)], + ["array32", bytes(0xdd, 0, 0, 0, 1)], + ["fixmap", bytes(0x81, 0x00)], + ["map16", bytes(0xde, 0, 1, 0x00)], + ["map32", bytes(0xdf, 0, 0, 0, 1, 0x00)], + ]; + for (const [name, open] of kinds) { + assert.doesNotThrow(() => checkPayloadDepth(chain(open, L)), `${name} at the limit`); + refused(chain(open, L + 1), `${name} past the limit`); + } +}); + +test("an empty map or array as the innermost container counts like any other", () => { + for (const empty of [bytes(0x90), bytes(0x80), bytes(0xdc, 0, 0), bytes(0xdd, 0, 0, 0, 0), bytes(0xde, 0, 0), bytes(0xdf, 0, 0, 0, 0)]) { + assert.doesNotThrow(() => checkPayloadDepth(arrays(L - 1, empty))); + refused(arrays(L, empty), "empty innermost past the limit"); + } + // [a chain of 255, a chain of 255]: the first sibling closes before the second opens, so the depth is 256, not 511. + const sibling = arrays(L - 1); + assert.doesNotThrow(() => checkPayloadDepth(cat(bytes(0x92), sibling, sibling))); + refused(cat(bytes(0x92), sibling, arrays(L)), "the second sibling is one deeper"); + // A map's key and value both count as elements: {key: chain, key: chain} closes after four elements. + assert.doesNotThrow(() => checkPayloadDepth(cat(bytes(0x82, 0x00), sibling, bytes(0x01), sibling))); + refused(cat(bytes(0x82, 0x00), sibling, bytes(0x01), arrays(L)), "the second map value is one deeper"); + refused(cat(bytes(0x82), arrays(L), sibling, bytes(0x01), sibling), "a map key one deeper"); +}); + +test("a header counts every child it announces, up to the widest of each kind", () => { + const nils = (count: number) => repeat(bytes(0xc0), count); + const kinds: [string, Uint8Array, number][] = [ + ["the longest fixarray", bytes(0x9f), 15], + ["the longest fixmap", bytes(0x8f), 30], + ["array16 of two", bytes(0xdc, 0, 2), 2], + ["array32 of two", bytes(0xdd, 0, 0, 0, 2), 2], + ["map16 of two pairs", bytes(0xde, 0, 2), 4], + ["map32 of two pairs", bytes(0xdf, 0, 0, 0, 2), 4], + ]; + for (const [name, header, elements] of kinds) { + assert.doesNotThrow(() => checkPayloadDepth(cat(header, nils(elements - 1), arrays(L - 1))), `${name}: the last child at the limit`); + refused(cat(header, nils(elements - 1), arrays(L)), `${name}: the last child past it`); + } +}); + +test("every scalar is skipped by its length, whatever bytes it holds", () => { + const filler = (count: number) => repeat(bytes(0x91), count); + const scalars: [string, Uint8Array][] = [ + ["nil", bytes(0xc0)], ["the never-used 0xc1", bytes(0xc1)], ["false", bytes(0xc2)], ["true", bytes(0xc3)], ["positive fixint", bytes(0x7f)], ["negative fixint", bytes(0xe0)], + ["uint8", bytes(0xcc, 0x91)], ["uint16", cat(bytes(0xcd), filler(2))], ["uint32", cat(bytes(0xce), filler(4))], ["uint64", cat(bytes(0xcf), filler(8))], + ["int8", bytes(0xd0, 0x91)], ["int16", cat(bytes(0xd1), filler(2))], ["int32", cat(bytes(0xd2), filler(4))], ["int64", cat(bytes(0xd3), filler(8))], + ["float32", cat(bytes(0xca), filler(4))], ["float64", cat(bytes(0xcb), filler(8))], + ["fixext1", cat(bytes(0xd4), filler(2))], ["fixext2", cat(bytes(0xd5), filler(3))], ["fixext4", cat(bytes(0xd6), filler(5))], + ["fixext8", cat(bytes(0xd7), filler(9))], ["fixext16", cat(bytes(0xd8), filler(17))], + ["fixstr", cat(bytes(0xa3), filler(3))], ["the longest fixstr", cat(bytes(0xbf), filler(31))], ["str8", cat(bytes(0xd9, 3), filler(3))], ["str16", cat(bytes(0xda, 0, 3), filler(3))], + ["str32", cat(bytes(0xdb, 0, 0, 0, 3), filler(3))], + ["bin8", cat(bytes(0xc4, 3), filler(3))], ["bin16", cat(bytes(0xc5, 0, 3), filler(3))], ["bin32", cat(bytes(0xc6, 0, 0, 0, 3), filler(3))], + ["ext8", cat(bytes(0xc7, 3, 0x7f), filler(3))], ["ext16", cat(bytes(0xc8, 0, 3, 0x7f), filler(3))], + ["ext32", cat(bytes(0xc9, 0, 0, 0, 3, 0x7f), filler(3))], + ["str16 of 300 bytes", cat(bytes(0xda, 0x01, 0x2c), filler(300))], + ]; + for (const [name, scalar] of scalars) { + assert.doesNotThrow(() => checkPayloadDepth(cat(bytes(0x92), scalar, arrays(L - 1))), `${name} then a chain at the limit`); + refused(cat(bytes(0x92), scalar, arrays(L)), `${name} then a chain past it`); + // As the leaf of a chain: a scalar read at the wrong length leaves containers open, and the sibling chain then reads one deeper. + assert.doesNotThrow(() => checkPayloadDepth(cat(bytes(0x92), arrays(L - 1, scalar), arrays(L - 1))), `${name} closes the chain it ends`); + } +}); + +test("a payload that ends early, is empty or carries trailing bytes is the reader's business, not the walk's", () => { + for (const early of [[], [0xd9], [0xda, 0], [0xdb, 0, 0, 0], [0xc4], [0xc5, 0], [0xc6, 0, 0, 0], [0xc7], [0xc8, 0], [0xc9, 0, 0, 0], [0xdc, 0], [0xdd, 0, 0, 0], [0xde, 0], [0xdf, 0, 0, 0]]) { + assert.doesNotThrow(() => checkPayloadDepth(bytes(...early)), early.map((value) => value.toString(16)).join(" ")); + } + assert.doesNotThrow(() => checkPayloadDepth(arrays(L - 1, bytes(0x91))), "a chain cut off before its leaf"); + assert.doesNotThrow(() => checkPayloadDepth(cat(bytes(0x90), arrays(L + 50))), "bytes after the first complete value are not walked"); + assert.doesNotThrow(() => checkPayloadDepth(bytes(0xc0))); +}); + +test("the walk is iterative: 100000 nested arrays are refused with the depth error, not a RangeError", () => { + refused(arrays(100_000), "100000 nested arrays"); + refused(chain(bytes(0x81, 0x00), 100_000), "100000 nested maps"); +}); + +test("a refusal names the subject, the depth and the limit and never a byte of the payload", () => { + const payload = chain(bytes(0x91), L + 1, cat(bytes(0xd9, CANARY.length), new TextEncoder().encode(CANARY))); + assert.throws( + () => checkPayloadDepth(payload, 'document type "t.note" payload'), + (error: unknown) => error instanceof CultCachePayloadDepthError + && error.name === "CultCachePayloadDepthError" + && error.message === 'document type "t.note" payload nests 257 MessagePack containers deep; the limit is 256.', + ); + const canaryPayload = payload; + assert.throws(() => checkPayloadDepth(canaryPayload), (error: Error) => !error.message.includes(CANARY) && !JSON.stringify(error).includes(CANARY)); +}); + +const note = z.object({ id: z.string(), count: z.number() }); +const slotCalls: string[] = []; +const watched = { ...codecs.string, decode: (raw: unknown) => (slotCalls.push("decode"), codecs.string.decode(raw)), encode: (value: string) => (slotCalls.push("encode"), codecs.string.encode(value)) }; +const guarded = defineDocumentType({ + type: "t.guarded", + schemaId: "t.guarded.v0", + schema: note, + name: "id", + codec: codecs.slots<{ id: string; count: number }>({ 0: ["id", watched], 1: ["count", codecs.int32] }, "T.Guarded"), +}); + +test("the owner refuses a payload past the limit before a codec reads it, and a codec's bytes before they are wrapped", () => { + assert.throws(() => decodeDocumentPayload(guarded, documentPayloadFromBytes(arrays(L + 1))), CultCachePayloadDepthError); + assert.deepEqual(slotCalls, [], "the codec never saw the deep payload"); + assert.deepEqual(decodeDocumentPayload(guarded, documentPayloadFromBytes(encode(["a", 1]))), { id: "a", count: 1 }); + + const formatterBytes = (value: unknown) => documentPayloadBytes(encodeDocumentPayload(guarded, value)); + assert.deepEqual(formatterBytes({ id: "a", count: 1 }), encode(["a", 1])); +}); + +test("a document without a codec or formatter writes a value L deep and refuses L+1 by the walk", () => { + const anything = defineDocumentType({ type: "t.any", schemaId: "t.any.v0", schema: z.any(), name: "id" }); + const nest = (n: number): unknown => (n === 1 ? [] : [nest(n - 1)]); + const atLimit = encodeDocumentPayload(anything, nest(L)); + assert.deepEqual(documentPayloadBytes(atLimit), encode(nest(L), { maxDepth: 1000 })); + assert.deepEqual(decodeDocumentPayload(anything, atLimit), nest(L)); + assert.throws(() => encodeDocumentPayload(anything, nest(L + 1)), (error: unknown) => + error instanceof CultCachePayloadDepthError && error.depth === L + 1 && error.limit === L + && error.message === 'document type "t.any" value nests 257 MessagePack containers deep; the limit is 256.'); + assert.throws(() => decodeDocumentPayload(anything, documentPayloadFromBytes(arrays(L + 1))), CultCachePayloadDepthError); +}); + +test("the limit and its error are exported from the root, and the walk itself is not", () => { + assert.equal(root.MAX_PAYLOAD_DEPTH, 256); + assert.equal(root.CultCachePayloadDepthError, CultCachePayloadDepthError); + assert.equal("checkPayloadDepth" in root, false); +}); + +// A v1 store whose one record carries `payload` as bin and no catalog entry, so the record's schema is inferred from the +// payload's first element. +async function storeWith(payload: Uint8Array): Promise { + const file = join(await mkdtemp(join(tmpdir(), "cultcache-payload-depth-")), "deep.cc"); + await writeFile(file, encode(["cultcache.store.v1", [], [["record-1", "sha256:stale", "2026-06-25T12:00:00Z", payload]]])); + return file; +} +const stamped = (containersInsideTheStamp: number) => + cat(bytes(0x92), encode("tests.schema_stamped_entry.v1"), arrays(containersInsideTheStamp)); + +test("the inspector previews a payload at the limit and reports one past it, or 100000 deep, as a decode error", async () => { + const atLimit = await storeWith(stamped(L - 1)); + const previewed = inspectCultCacheBytes(atLimit, await readFile(atLimit)).records[0]!; + assert.equal(previewed.payloadDecodeError, undefined); + assert.equal(previewed.schemaName, "tests.schema_stamped_entry", "a payload the walk accepts yields its stamp"); + + for (const inside of [L, 100_000]) { + const file = await storeWith(stamped(inside)); + const record = inspectCultCacheBytes(file, await readFile(file)).records[0]!; + assert.equal(record.payloadDecodeError, "document payload nests 257 MessagePack containers deep; the limit is 256."); + assert.equal(record.schemaName, "", "the stamp of a payload the walk refuses is not recovered"); + } +}); + +test("the single-file store infers a legacy record's schema from a payload at the limit and from none past it", async () => { + const atLimit = await storeWith(stamped(L - 1)); + const [read] = await new SingleFileMessagePackBackingStore(atLimit).pullAll(); + assert.equal(read.catalogEntry?.schemaVersion, "tests.schema_stamped_entry.v1"); + + const past = await storeWith(stamped(L)); + await assert.rejects(() => new SingleFileMessagePackBackingStore(past).pullAll(), /missing schema id/u); +}); + +// A header whose length or count needs all four bytes: the low sixteen bits of the length are small, the whole is not. +const be32 = (n: number) => bytes((n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff); + +test("a 32-bit length or count is read whole: the walk skips a 65539-byte scalar and counts 65540 children", () => { + const blob = repeat(bytes(0x91), 65539); + const scalars: [string, Uint8Array][] = [ + ["bin32", cat(bytes(0xc6), be32(65539), blob)], + ["str32", cat(bytes(0xdb), be32(65539), blob)], + ["ext32", cat(bytes(0xc9), be32(65539), bytes(0x7f), blob)], + ]; + for (const [name, scalar] of scalars) { + assert.doesNotThrow(() => checkPayloadDepth(cat(bytes(0x92), scalar, arrays(L - 1))), `${name} of 65539 bytes then a chain at the limit`); + refused(cat(bytes(0x92), scalar, arrays(L)), `${name} of 65539 bytes then a chain past it`); + } + // Both counts exceed 65535 and their low sixteen bits are small (4 children; 1 pair), so a count cut to 16 bits closes the container early. + const wide: [string, Uint8Array, number][] = [ + ["array32", cat(bytes(0xdd), be32(65540)), 65540], + ["map32", cat(bytes(0xdf), be32(65537)), 2 * 65537], + ]; + for (const [name, header, children] of wide) { + const nils = repeat(bytes(0xc0), children); + refused(cat(bytes(0x92), header, nils, arrays(L)), `${name} announcing more than 65535: the sibling chain past the limit`); + assert.doesNotThrow(() => checkPayloadDepth(cat(bytes(0x92), header, nils, arrays(L - 1))), `${name}: the sibling chain at the limit`); + } +}); + +test("a user formatter's bytes are its own: a 0x91 grey image round-trips, while plain and codec documents are still walked", () => { + const grey = defineDocumentType({ + type: "t.grey", + schemaId: "t.grey.v0", + schema: z.object({ pixels: z.custom() }), + name: "pixels", + formatter: { encode: (value) => (value as { pixels: Uint8Array }).pixels, decode: (payload) => ({ pixels: payload }) }, + }); + for (const size of [300, 4096]) { + const pixels = new Uint8Array(size).fill(0x91); + const written = encodeDocumentPayload(grey, { pixels }); + assert.deepEqual(documentPayloadBytes(written), pixels, `${size} bytes written as the formatter made them`); + assert.deepEqual(decodeDocumentPayload(grey, written), { pixels }, `${size} bytes read back through the formatter`); + } + + const anything = defineDocumentType({ type: "t.any2", schemaId: "t.any2.v0", schema: z.any(), name: "id" }); + const nest = (n: number): unknown => (n === 1 ? [] : [nest(n - 1)]); + assert.throws(() => encodeDocumentPayload(anything, nest(L + 1)), CultCachePayloadDepthError); + assert.throws(() => decodeDocumentPayload(anything, documentPayloadFromBytes(arrays(L + 1))), CultCachePayloadDepthError); + + // A slot that writes `depth` nested arrays, so a codec document can be made as deep as the test needs. + const nested: codecs.Codec = { + typeName: "System.Object", + encode: (depth) => nest(depth), + decode: (raw) => (raw as unknown[]).length, + }; + const coded = defineDocumentType({ + type: "t.coded", + schemaId: "t.coded.v0", + schema: z.any(), + name: "id", + codec: codecs.slots<{ id: string; depth: number }>({ 0: ["id", codecs.string], 1: ["depth", nested] }, "T.Coded"), + }); + assert.doesNotThrow(() => encodeDocumentPayload(coded, { id: "a", depth: L - 1 })); + assert.throws(() => encodeDocumentPayload(coded, { id: "a", depth: L }), CultCachePayloadDepthError); + assert.throws(() => decodeDocumentPayload(coded, documentPayloadFromBytes(arrays(L + 1))), CultCachePayloadDepthError); +}); diff --git a/packages/cultcache-ts/test/payload-type.test.ts b/packages/cultcache-ts/test/payload-type.test.ts new file mode 100644 index 00000000..7d7e31f7 --- /dev/null +++ b/packages/cultcache-ts/test/payload-type.test.ts @@ -0,0 +1,61 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; + +import { decode, encode } from "@msgpack/msgpack"; +import { z } from "zod"; + +import { + decodeDocumentPayload, + defineDocumentType, + documentPayloadBytes, + documentPayloadFromBytes, + encodeDocumentPayload, + type AnyCultCacheDocumentDefinition, + type CultCacheEnvelope, + type DocumentPayload, +} from "../src"; + +// The rule: a document payload is read only through its definition. The type is the enforcement, so this file is the +// proof: tsc compiles it only if every line below that carries @ts-expect-error is an error. A line that starts to +// compile makes its @ts-expect-error unused, which is itself an error, so the suite stops until the payload is opaque +// again. The function is never called; the lines are not meant to run. +export function refusedReaders(envelope: CultCacheEnvelope, definition: AnyCultCacheDocumentDefinition, payload: DocumentPayload): void { + // @ts-expect-error a plain msgpack decoder does not accept a document payload + decode(envelope.payload); + // @ts-expect-error a payload is not assignable to bytes + const bytes: Uint8Array = envelope.payload; + // @ts-expect-error nor is it a byte source a copy may be taken from + new Uint8Array(envelope.payload); + // @ts-expect-error a definition's formatter reads bytes, not a payload; the owner unwraps for it + definition.formatter!.decode(envelope.payload); + // @ts-expect-error the owner needs the definition that says how the bytes are laid out + decodeDocumentPayload(undefined, payload); + // @ts-expect-error bytes are not a payload until they enter by name + const forged: DocumentPayload = new Uint8Array(); + void [bytes, forged]; +} + +const note = defineDocumentType({ + type: "t.note", + schemaId: "t.note.v0", + schema: z.object({ id: z.string(), count: z.number() }), + name: "id", +}); + +test("a payload is the same bytes at run time, so frames and stores see no change", () => { + const bytes = encode({ id: "a", count: 1 }); + const payload = documentPayloadFromBytes(bytes); + assert.equal(documentPayloadBytes(payload), bytes); + assert.equal(payload.byteLength, bytes.byteLength); +}); + +test("the owner writes a payload through the definition's schema and reads it back through the same one", () => { + const payload = encodeDocumentPayload(note, { id: "a", count: 1 }); + assert.deepEqual(decode(documentPayloadBytes(payload)), { id: "a", count: 1 }); + assert.deepEqual(decodeDocumentPayload(note, payload), { id: "a", count: 1 }); + // A refusal names the field and never echoes the value it refused. + const refusesWithoutEchoing = (action: () => unknown) => + assert.throws(action, (error: Error) => /count/.test(error.message) && !error.message.includes("canary-value")); + refusesWithoutEchoing(() => encodeDocumentPayload(note, { id: "a", count: "canary-value" })); + refusesWithoutEchoing(() => decodeDocumentPayload(note, documentPayloadFromBytes(encode({ id: "a", count: "canary-value" })))); +}); diff --git a/packages/cultcache-ts/test/union-parity.test.ts b/packages/cultcache-ts/test/union-parity.test.ts new file mode 100644 index 00000000..f3e79b37 --- /dev/null +++ b/packages/cultcache-ts/test/union-parity.test.ts @@ -0,0 +1,893 @@ +import assert from "node:assert/strict"; +import { existsSync } from "node:fs"; +import { mkdtemp, readFile, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { test } from "node:test"; + +import { decode, encode } from "@msgpack/msgpack"; +import { z } from "zod"; + +import { codecs } from "../src"; +import { MAX_SLOT_KEY, type Codec } from "../src/codec"; +import { CultCache } from "../src/cult-cache"; +import { readWire, WireFloat, writeWire } from "../src/wire"; +import { + CultCachePayloadDepthError, + MAX_PAYLOAD_DEPTH, + decodeDocumentPayload, + defineDocumentType, + documentPayloadBytes, + documentPayloadFromBytes, + encodeDocumentPayload, +} from "../src/document"; +import { SingleFileMessagePackBackingStore } from "../src/single-file-messagepack-backing-store"; +import type { AnyCultCacheDocumentDefinition, CacheBackingStore, CultCacheEnvelope } from "../src/types"; + +const { array, boolean, bytes, float32, float64, int32, int64, lazy, list, nullable, slots, string, union, unit } = codecs; + +// The names the C# reference gives the fixture's types (CultSchemaTypeNames.FromType), as union-surface.cc carries them. +const CS = "GameCult.Caching.Tests.UnionParityVectorTests+"; + +// The golden is tests/vectors/union-parity, written by the C# reference. Everything below that is bytes or an expected +// outcome is read from those committed files; only the value the payload must decode to is spelled here. +function findVectors(from: string): string { + for (let dir = from; ; dir = resolve(dir, "..")) { + if (existsSync(join(dir, "tests", "vectors", "union-parity"))) return join(dir, "tests", "vectors", "union-parity"); + if (resolve(dir, "..") === dir) throw new Error("tests/vectors/union-parity not found above the test."); + } +} +const vectors = findVectors(__dirname); +const read = async (name: string) => new Uint8Array(await readFile(join(vectors, name))); + +// The string the C# writer put inside every refusal payload, to prove a refusal never echoes the payload. +const CANARY = "CANARY-union-golden-4c2a"; + +type Node = + | { kind: "Box"; id: string; children: (Node | null)[] } + | { kind: "Text"; id: string; content: string } + | { kind: "Use"; id: string; composition: Composition; slots: (Node | null)[] } + | { kind: "Image"; id: string; uri: string; alt: string } + | { kind: "Wrap"; inner: Node | null }; +interface Composition { name: string; body: Node | null } +type Outcome = { kind: "Pending"; message: string } | { kind: "Completed"; sourceVersion: number } | { kind: "Denied" } | { kind: "Floor" } | { kind: "Ceiling" }; +type Item = { kind: "Gem"; name: string } | { kind: "Tool"; name: string; uses: number } | { kind: "Part"; name: string; count: number }; +type CraftedItem = { kind: "Tool"; name: string; uses: number } | { kind: "Part"; name: string; count: number }; +interface Surface { + id: string; + version: number; + root: Node | null; + outcomes: (Outcome | null)[]; + part: Item | null; + crafted: CraftedItem | null; + missing: Node | null; +} + +const composition = slots({ 0: ["name", string], 1: ["body", lazy(() => node)] }, `${CS}Composition`); +const node: Codec = union("Node", { + 0: ["Box", slots<{ id: string; children: (Node | null)[] }>({ 0: ["id", string], 1: ["children", list(lazy(() => node))] })], + 1: ["Text", slots<{ id: string; content: string }>({ 0: ["id", string], 1: ["content", string] })], + 2: ["Use", slots<{ id: string; composition: Composition; slots: (Node | null)[] }>({ + 0: ["id", string], 1: ["composition", composition], 2: ["slots", list(lazy(() => node))], + })], + 5: ["Image", slots<{ id: string; uri: string; alt: string }>({ 0: ["id", string], 1: ["uri", string], 3: ["alt", string] })], + 6: ["Wrap", slots<{ inner: Node | null }>({ 0: ["inner", lazy(() => node)] })], +}, `${CS}Node`); +const outcome = union("Outcome", { + 0: ["Pending", slots<{ message: string }>({ 0: ["message", string] })], + 1: ["Completed", slots<{ sourceVersion: number }>({ 0: ["sourceVersion", int32] })], + 2: ["Denied", unit], + [-2147483648]: ["Floor", unit], + 2147483647: ["Ceiling", unit], +}, `${CS}Outcome`); +const toolArm = slots<{ name: string; uses: number }>({ 0: ["name", string], 1: ["uses", int32] }); +const partArm = slots<{ name: string; count: number }>({ 0: ["name", string], 1: ["count", int32] }); +const item = union("Item", { + 0: ["Gem", slots<{ name: string }>({ 0: ["name", string] })], + 1: ["Tool", toolArm], + 2: ["Part", partArm], +}, `${CS}Item`); +const craftedItem = union("CraftedItem", { 0: ["Tool", toolArm], 1: ["Part", partArm] }, `${CS}CraftedItem`); +const surfaceCodec = slots({ + 0: ["id", string], + 1: ["version", int32], + 2: ["root", node], + 3: ["outcomes", list(outcome)], + 4: ["part", item], + 5: ["crafted", craftedItem], + 6: ["missing", node, null], +}, `${CS}UnionSurface`); + +const nodeSchema: z.ZodType = z.lazy(() => + z.union([ + z.null(), + z.discriminatedUnion("kind", [ + z.object({ kind: z.literal("Box"), id: z.string(), children: z.array(nodeSchema) }), + z.object({ kind: z.literal("Text"), id: z.string(), content: z.string() }), + z.object({ + kind: z.literal("Use"), + id: z.string(), + composition: z.object({ name: z.string(), body: nodeSchema }), + slots: z.array(nodeSchema), + }), + z.object({ kind: z.literal("Image"), id: z.string(), uri: z.string(), alt: z.string() }), + z.object({ kind: z.literal("Wrap"), inner: nodeSchema }), + ]), + ])); +const surfaceSchema = z.object({ + id: z.string(), + version: z.number(), + root: nodeSchema, + outcomes: z.array(z.union([ + z.null(), + z.discriminatedUnion("kind", [ + z.object({ kind: z.literal("Pending"), message: z.string() }), + z.object({ kind: z.literal("Completed"), sourceVersion: z.number() }), + z.object({ kind: z.literal("Denied") }), + z.object({ kind: z.literal("Floor") }), + z.object({ kind: z.literal("Ceiling") }), + ]), + ])), + part: z.union([z.null(), z.discriminatedUnion("kind", [ + z.object({ kind: z.literal("Gem"), name: z.string() }), + z.object({ kind: z.literal("Tool"), name: z.string(), uses: z.number() }), + z.object({ kind: z.literal("Part"), name: z.string(), count: z.number() }), + ])]), + crafted: z.union([z.null(), z.discriminatedUnion("kind", [ + z.object({ kind: z.literal("Tool"), name: z.string(), uses: z.number() }), + z.object({ kind: z.literal("Part"), name: z.string(), count: z.number() }), + ])]), + missing: nodeSchema, +}) as unknown as z.ZodType; + +function surfaceDocument(schemaId?: string) { + return defineDocumentType({ + type: "tests.union_surface", + schemaId: schemaId ?? "tests.union_surface.v1", + schemaName: "tests.union_surface", + schemaVersion: "tests.union_surface.v1", + schema: surfaceSchema, + codec: surfaceCodec, + name: "id", + }); +} + +const golden: Surface = { + id: "surface", + version: 3, + root: { + kind: "Box", + id: "root", + children: [ + { kind: "Text", id: "t1", content: "hello" }, + { + kind: "Use", + id: "u1", + composition: { + name: "comp", + body: { + kind: "Box", + id: "inner", + children: [ + { kind: "Text", id: "deep", content: "x" }, + { kind: "Image", id: "img", uri: "uri://a", alt: "alt" }, + ], + }, + }, + slots: [{ kind: "Text", id: "s1", content: "slot" }, null, { kind: "Box", id: "b2", children: [] }], + }, + { kind: "Image", id: "i2", uri: "uri://b", alt: "" }, + ], + }, + outcomes: [{ kind: "Pending", message: "wait" }, { kind: "Completed", sourceVersion: 7 }, { kind: "Denied" }], + part: { kind: "Tool", name: "hammer", uses: 12 }, + crafted: { kind: "Part", name: "gear", count: 4 }, + missing: null, +}; + +const hex = (data: Uint8Array) => Buffer.from(data).toString("hex"); + +async function outcomeEntries() { + const entries = decode(await read("outcomes.msgpack")) as [string, string, string, number | null, string][]; + return entries.map(([file, outcome, unionName, key, detail]) => ({ file, outcome, unionName, key, detail })); +} + +test("the union surface vector decodes to the constructed value and re-encodes byte-identical", async () => { + const committed = await read("union-surface.msgpack"); + const decoded = surfaceCodec.decode(readWire(committed)); + assert.deepEqual(decoded, golden); + assert.equal(hex(writeWire(surfaceCodec.encode(decoded))), hex(committed)); + assert.equal(hex(writeWire(surfaceCodec.encode(golden))), hex(committed)); +}); + +test("a unit arm is written [key, []] and its payload must be an array", () => { + assert.deepEqual(outcome.encode({ kind: "Denied" }), [2, []]); + assert.throws(() => outcome.decode([2, null]), /Union Outcome/u); +}); + +test("union-surface.cc reads through SingleFileMessagePackBackingStore and writes the same payload", async () => { + const dir = await mkdtemp(join(tmpdir(), "union-parity-")); + const file = join(dir, "union-surface.cc"); + await writeFile(file, await read("union-surface.cc")); + const [envelope] = await new SingleFileMessagePackBackingStore(file).pullAll(); + assert.equal(hex(documentPayloadBytes(envelope.payload)), hex(await read("union-surface.msgpack"))); + + const document = surfaceDocument(envelope.schemaId); + const cache = CultCache.builder().withDocumentType(document).withGenericStore(new SingleFileMessagePackBackingStore(file)).build(); + await cache.pullAllBackingStores(); + assert.deepEqual(cache.get(document, envelope.key), golden); + + const written = join(dir, "written.cc"); + const fresh = CultCache.builder().withDocumentType(document).withGenericStore(new SingleFileMessagePackBackingStore(written)).build(); + await fresh.put(document, envelope.key, golden); + const [rewritten] = await new SingleFileMessagePackBackingStore(written).pullAll(); + assert.equal(hex(documentPayloadBytes(rewritten.payload)), hex(documentPayloadBytes(envelope.payload))); + + // The reference refuses a store whose schema catalog names another type for a slot, so the catalog TS writes must be + // the one C# wrote: same canonical schema text, same member names, slots and types. + assert.equal(rewritten.catalogEntry!.canonicalSchemaJson, envelope.catalogEntry!.canonicalSchemaJson); + const shape = (members: readonly { slot: number; memberName: string; typeName: string; isName?: boolean }[]) => + members.map((member) => [member.slot, member.memberName, member.typeName, member.isName === true]); + assert.deepEqual(shape(rewritten.catalogEntry!.members!), shape(envelope.catalogEntry!.members!)); + assert.equal(rewritten.catalogEntry!.members!.length, 7); +}); + +test("every outcome vector is listed and holds: refusals name the union and key, never the payload", async () => { + const entries = await outcomeEntries(); + assert.equal(entries.length, 9); + const document = surfaceDocument(); + let refused = 0; + const carrying: string[] = []; + let readOnly = 0; + + for (const { file, outcome: expected, unionName, key, detail } of entries) { + const payload = await read(file); + if (expected === "refused") { + refused += 1; + if (Buffer.from(payload).includes(CANARY)) carrying.push(file); + assert.throws( + () => surfaceCodec.decode(readWire(payload)), + (error: Error) => { + assert.ok(!error.message.includes(CANARY), `${file}: the refusal echoed the payload`); + if (detail === "arity") { + return error.message.includes(`Union ${unionName}`) && error.message.includes("expected [key, slots]"); + } + return error.message.includes(`Union ${unionName}:`) && error.message.includes(`key ${key} `); + }, + file, + ); + const refusingCache = CultCache.builder().withDocumentType(document).withGenericStore(memoryStore([envelopeOf(payload)])).build(); + await assert.rejects(() => refusingCache.pullAllBackingStores(), new RegExp(`Union ${unionName}`, "u"), file); + } else { + readOnly += 1; + assert.equal(expected, "read-only"); + assert.deepEqual(surfaceCodec.decode(readWire(payload)), golden, `${file}: the extra slot is read past`); + } + } + assert.deepEqual([refused, readOnly], [5, 4]); + assert.deepEqual(carrying, ["unknown-arm-field.msgpack", "unknown-arm-list.msgpack", "unknown-arm-nested.msgpack"], "the canary is in the payloads whose arm is unknown"); +}); + +test("a refusal lists the declared keys, so a key only the outer union declares is unknown to the inner", async () => { + const entry = (await outcomeEntries()).find((candidate) => candidate.file === "inner-union-outer-key.msgpack")!; + const payload = readWire(await read(entry.file)) as unknown[]; + assert.throws( + () => surfaceCodec.decode(payload), + /Union CraftedItem: unknown arm key 2 \(declared keys: 0, 1\)\./u, + ); +}); + +test("an arm that is not [key, slots] is refused naming the union, and a non-integer key is not echoed", () => { + for (const bad of [[1], [1, null], [1, [], []], "x", 7, {}]) { + assert.throws(() => node.decode(bad), /^Error: Union Node: expected \[key, slots\]/u); + } + assert.throws( + () => node.decode([CANARY, []]), + (error: Error) => error.message.includes("Union Node") && error.message.includes("not an integer") && !error.message.includes(CANARY), + ); +}); + +test("an arm key that is not a declared key is refused, with no fallback", () => { + assert.throws(() => node.decode([4, []]), /Union Node: unknown arm key 4 \(declared keys: 0, 1, 2, 5, 6\)/u); + assert.throws(() => outcome.decode([3, []]), /Union Outcome: unknown arm key 3/u); +}); + +test("a union encodes by kind and refuses a kind it does not declare without echoing it", () => { + assert.deepEqual(node.encode({ kind: "Text", id: "a", content: "b" }), [1, ["a", "b"]]); + assert.equal(node.encode(null), null); + assert.throws( + () => node.encode({ kind: CANARY, id: "a" } as unknown as Node), + (error: Error) => error.message.includes("Union Node") && !error.message.includes(CANARY), + ); +}); + +test("slots: a gap writes nil, a missing slot reads its default, one without a default is refused naming the slot", () => { + const record = slots<{ a: string; c: string; d: number }>({ 0: ["a", string], 2: ["c", string], 4: ["d", int32, 9] }); + assert.deepEqual(record.encode({ a: "x", c: "y", d: 1 }), ["x", null, "y", null, 1]); + assert.deepEqual(record.decode(["x", null, "y"]), { a: "x", c: "y", d: 9 }); + assert.deepEqual(record.decode(["x", 5, "y", null]), { a: "x", c: "y", d: 9 }); + assert.throws(() => record.decode(["x", 5, "y", null, null]), { message: "d (slot 4): expected an int32, found nil" }); + assert.throws(() => record.decode(["x"]), /c \(slot 2\): the slot is missing and declares no default/u); + assert.deepEqual(record.decode(["x", null, "y", null, 1, "extra", "slots"]), { a: "x", c: "y", d: 1 }); + assert.throws(() => record.decode({ a: "x" }), /expected an array of slots/u); +}); + +test("slots: a default may be a function and fills only a missing slot, never a nil", () => { + const record = slots<{ tags: string[] }>({ 0: ["tags", list(string), () => ["fresh"]] }); + assert.deepEqual(record.decode([]), { tags: ["fresh"] }); + assert.deepEqual(record.decode([null]), { tags: null }); + const counted = slots<{ n: number }>({ 0: ["n", int32, 4] }); + assert.deepEqual(counted.decode([]), { n: 4 }); + assert.throws(() => counted.decode([null]), { message: "n (slot 0): expected an int32, found nil" }); +}); + +test("a slot refusal names the field and slot and never the value", () => { + const record = slots<{ name: string }>({ 3: ["name", string] }); + assert.throws( + () => record.decode([null, null, null, { secret: CANARY }]), + (error: Error) => error.message.startsWith("name (slot 3):") && !error.message.includes(CANARY), + ); +}); + +test("leaf codecs refuse the wrong shape on both sides, saying what was expected and what kind was found", () => { + const table: [string, Codec, string, unknown, string][] = [ + ["string", string, "a string", 5, "number"], + ["int32", int32, "an int32", "5", "string"], + ["int32", int32, "an int32", Number.POSITIVE_INFINITY, "a non-integer number"], + ["int32", int32, "an int32", Number.NaN, "a non-integer number"], + ["int32", int32, "an int32", 1.5, "a non-integer number"], + ["int32", int32, "an int32", 2 ** 31, "an integer out of range"], + ["int64", int64, "an int64", 2 ** 53, "a number beyond 2^53, which needs a bigint"], + ["int64", int64, "an int64", 2n ** 63n, "an integer out of range"], + ["float64", float64, "a float64", "1.5", "string"], + ["float32", float32, "a float32", null, "nil"], + ["boolean", boolean, "a boolean", "true", "string"], + ["bytes", bytes, "bytes", [1, 2], "array"], + ["string", string, "a string", null, "nil"], + ["list", list(string), "an array", "abc", "string"], + ]; + for (const [label, codec, what, bad, found] of table) { + for (const side of ["encode", "decode"] as const) { + // Decode sees the wire's shapes: a JS float or a number beyond 2^53 never arrives from a payload. + if (side === "decode" && (typeof bad === "number" && (!Number.isInteger(bad) || Math.abs(bad) >= 2 ** 53))) continue; + assert.throws(() => codec[side](bad), { message: `expected ${what}, found ${found}` }, `${label} ${side}`); + } + } + for (const [codec, good] of [[string, "s"], [int32, 1], [int64, 5], [float64, 1.5], [float32, 1.5], [boolean, false], [bytes, new Uint8Array([7])], [list(int32), [1, 2]]] as [Codec, unknown][]) { + assert.deepEqual(codec.decode(codec.encode(good)), good); + } +}); + +test("a list element refusal names the element, and nullable writes nil for null and undefined", () => { + const numbers = list(int32); + assert.throws(() => numbers.encode([1, "x" as unknown as number]), /^Error: element 1: expected an int32, found string$/u); + assert.throws(() => numbers.decode([1, 2, null]), /^Error: element 2: expected an int32, found nil$/u); + const maybe = nullable(int32); + assert.equal(maybe.encode(null), null); + assert.equal(maybe.encode(undefined as unknown as null), null); + assert.equal(maybe.encode(0), 0); + assert.equal(maybe.decode(null), null); + assert.equal(maybe.decode(0), 0); + assert.throws(() => maybe.decode("x"), /expected an int32/u); +}); + +test("a record refuses what is not a record and names the field and slot of a bad value", () => { + const record = slots<{ name: string }>({ 3: ["name", string] }); + assert.throws(() => record.encode(null as unknown as { name: string }), /^Error: expected a record, found nil$/u); + assert.throws(() => record.encode("x" as unknown as { name: string }), /^Error: expected a record, found string$/u); + assert.throws(() => record.encode({ name: 5 as unknown as string }), /^Error: name \(slot 3\): expected a string, found number$/u); +}); + +test("a union names itself, its arm and the field when an arm's slots are refused", () => { + assert.throws(() => node.encode({ kind: "Text", id: "a", content: 5 as unknown as string }), /^Error: arm Text: content \(slot 1\): expected a string, found number$/u); + assert.throws(() => node.decode([1, ["a", 5]]), /^Error: arm Text: content \(slot 1\): expected a string, found number$/u); + assert.equal(node.encode(undefined as unknown as null), null); + assert.throws( + () => node.encode({ kind: "Nope" } as unknown as Node), + /^Error: Union Node: the value's kind is not one of its arms \(Box, Text, Use, Image, Wrap\)\.$/u, + ); +}); + +test("slot names become catalog member names in Pascal case", () => { + const record = slots<{ _hidden: string; two_words: string; Mixed9: string }>({ 0: ["_hidden", string], 1: ["two_words", string], 2: ["Mixed9", string] }); + assert.deepEqual(record.members.map((member) => member.memberName), ["Hidden", "TwoWords", "Mixed9"]); +}); + +test("definitions are refused at definition time", () => { + assert.throws(() => union<{ kind: "A" }>("U", { 0: ["A", slots<{ kind: string }>({ 0: ["kind", string] })] }), /Union U arm "A" declares a slot named kind/u); + assert.throws(() => union<{ kind: "A" | "B" }>("U", { 0: ["A", unit], 1: ["A" as "B", unit] }), /declares the arm "A" twice/u); + assert.throws(() => union<{ kind: "A" }>("U", { x: ["A", unit] } as never), /^Error: Union U declares the key "x", which is not an integer\.$/u); + assert.throws(() => union<{ kind: "A" }>("U", { "01": ["A", unit] } as never), /key "01"/u); + assert.throws(() => union<{ kind: "A" }>("U", { "1.5": ["A", unit] } as never), /key "1\.5"/u); + assert.throws(() => union<{ kind: "A" }>("U", {} as never), /^Error: Union U declares no arms\.$/u); + assert.throws(() => slots<{ a: string; b: string }>({ 0: ["a", string], 1: ["a" as "b", string] }), /declares the field "a" twice/u); + assert.throws(() => slots<{ a: string }>({}), /declares no slots/u); + assert.throws(() => slots<{ a: string }>({ [-1]: ["a", string] }), /^Error: A slot record declares the key "-1"/u); + assert.throws( + () => defineDocumentType({ + type: "t", + schema: surfaceSchema, + codec: surfaceCodec, + formatter: { encode: () => new Uint8Array(), decode: () => golden }, + }), + /declares both a codec and a formatter/u, + ); +}); + +test("a codec supplies the document's catalog members unless it is given its own", () => { + const document = defineDocumentType({ + type: "t", + schema: z.object({ a: z.string(), the_b: z.string() }), + codec: slots<{ a: string; the_b: string }>({ 0: ["a", string], 3: ["the_b", string] }), + name: "a", + indexes: { byB: "the_b" }, + }); + assert.deepEqual(document.members, [ + { slot: 0, memberName: "A", typeName: "System.String", isName: true, indexAlias: null }, + { slot: 3, memberName: "TheB", typeName: "System.String", isName: false, indexAlias: "byB" }, + ]); + const given = [{ slot: 9, memberName: "Mine", typeName: "System.String" }]; + const own = defineDocumentType({ type: "t", schema: z.object({ a: z.string() }), codec: slots<{ a: string }>({ 0: ["a", string] }), members: given }); + assert.deepEqual(own.members, given); +}); + +test("schema.parse still runs on a decoded value, and a document without a codec still writes a map", async () => { + const strict = defineDocumentType({ + type: "t", + schema: z.object({ a: z.string().min(3) }), + codec: slots<{ a: string }>({ 0: ["a", string] }), + }); + const store = memoryStore([{ key: "k", type: "t", payload: documentPayloadFromBytes(encode(["xy"])), storedAt: new Date().toISOString() }]); + await assert.rejects(() => CultCache.builder().withDocumentType(strict).withGenericStore(store).build().pullAllBackingStores()); + + const plain = defineDocumentType({ type: "p", schema: z.object({ id: z.string() }) }); + const holder = memoryStore([]); + await CultCache.builder().withDocumentType(plain).withGenericStore(holder).build().put(plain, "k", { id: "d" }); + assert.deepEqual(decode(documentPayloadBytes(holder.entries[0].payload)), { id: "d" }); +}); + +test("bytes and nullable round-trip through a slot record", () => { + const record = slots<{ blob: Uint8Array; maybe: string | null }>({ 0: ["blob", bytes], 1: ["maybe", nullable(string)] }); + const wire = encode(record.encode({ blob: new Uint8Array([1, 2]), maybe: null })); + assert.deepEqual(record.decode(decode(wire)), { blob: new Uint8Array([1, 2]), maybe: null }); + assert.throws(() => record.decode([new Uint8Array(), 4]), /maybe \(slot 1\): expected a string/u); +}); + +const fromHex = (text: string) => new Uint8Array(Buffer.from(text, "hex")); + +// Arm keys are integers within Int32 in the reference: a float key is refused even when it holds a whole number, and a +// key outside Int32 is refused whether it is declared or read. Every payload below is [key, [7]] or [key, ["wait"]]. +test("an arm key is an integer in any MessagePack integer encoding, and a float-typed key is refused", () => { + const completed = { kind: "Completed", sourceVersion: 7 }; + for (const key of ["01", "cc01", "cd0001", "ce00000001", "cf0000000000000001", "d001", "d10001", "d200000001", "d30000000000000001"]) { + assert.deepEqual(outcome.decode(readWire(fromHex(`92${key}9107`))), completed, key); + } + for (const key of ["ca3f800000", "cb3ff0000000000000"]) { + assert.throws(() => outcome.decode(readWire(fromHex(`92${key}9107`))), { message: "Union Outcome: the arm key is not an integer (declared keys: -2147483648, 0, 1, 2, 2147483647)." }, key); + } + assert.throws(() => outcome.decode(readWire(fromHex("92cb800000000000000091a477616974"))), /^Error: Union Outcome: the arm key is not an integer/u, "-0.0 is a float, not key 0"); + for (const key of ["ce80000000", "cf8000000000000000", "d30000000080000000"]) { + assert.throws(() => outcome.decode(readWire(fromHex(`92${key}9107`))), { message: "Union Outcome: the arm key is outside Int32 (declared keys: -2147483648, 0, 1, 2, 2147483647)." }, key); + } + assert.throws(() => outcome.decode(readWire(fromHex("92d2800000019107"))), { message: "Union Outcome: unknown arm key -2147483647 (declared keys: -2147483648, 0, 1, 2, 2147483647)." }); + assert.throws(() => outcome.decode(readWire(fromHex("92ff9107"))), { message: "Union Outcome: unknown arm key -1 (declared keys: -2147483648, 0, 1, 2, 2147483647)." }); +}); + +test("a union refuses a declared arm key outside Int32", () => { + assert.doesNotThrow(() => union<{ kind: "A" }>("U", { 2147483647: ["A", unit] })); + assert.throws(() => union<{ kind: "A" }>("U", { 2147483648: ["A", unit] }), { message: "Union U declares the key 2147483648, which is outside Int32." }); + assert.throws(() => union<{ kind: "A" }>("U", { 3000000000: ["A", unit] }), /outside Int32/u); +}); + +test("the wire reader keeps 64-bit integers whole, tells a float from an integer, and refuses what is not a value", () => { + assert.equal(readWire(fromHex("cf0020000000000001")), 2n ** 53n + 1n); + assert.equal(readWire(fromHex("cf001fffffffffffff")), 2 ** 53 - 1); + assert.equal(readWire(fromHex("d38000000000000000")), -(2n ** 63n)); + assert.equal(readWire(fromHex("cfffffffffffffffff")), 2n ** 64n - 1n); + assert.ok(readWire(fromHex("cb3ff0000000000000")) instanceof WireFloat); + assert.ok(readWire(fromHex("ca3f800000")) instanceof WireFloat); + assert.equal(readWire(fromHex("01")), 1); + assert.throws(() => readWire(fromHex("92a161")), /truncated/u, "an array that promises more than the payload holds"); + assert.throws(() => readWire(fromHex("dd")), /truncated/u); + assert.throws(() => readWire(fromHex("ddffffffff")), /truncated/u, "a huge array header reserves nothing"); + assert.throws(() => readWire(fromHex("a5616263")), /truncated/u); + assert.throws(() => readWire(fromHex("0102")), /bytes after its value/u); + assert.throws(() => readWire(fromHex("81a161a162")), /map, extension or reserved/u); + assert.throws(() => readWire(fromHex("c1")), /map, extension or reserved/u); + assert.throws(() => readWire(fromHex("d4010a")), /map, extension or reserved/u); +}); + +test("the wire writer writes the smallest integer, keeps a float's width, and round-trips what it reads", () => { + const tree = [0, 127, 128, 255, 256, 65535, 65536, 4294967295, 4294967296, -1, -32, -33, -128, -129, -32768, -32769, -2147483648, -2147483649, + 2n ** 53n, 2n ** 64n - 1n, -(2n ** 63n), new WireFloat(1.5, false), new WireFloat(1.5, true), "", "a".repeat(31), "a".repeat(32), "a".repeat(256), + new Uint8Array(0), new Uint8Array(300), [], null, true, false, "héllo"]; + assert.deepEqual(readWire(writeWire(tree)), tree); + assert.equal(hex(writeWire(5)), "05"); + assert.equal(hex(writeWire(128)), "cc80"); + assert.equal(hex(writeWire(-33)), "d0df"); + assert.equal(hex(writeWire(2n ** 53n + 2n)), "cf0020000000000002"); + assert.equal(hex(writeWire(new WireFloat(3, true))), "cb4008000000000000"); + assert.equal(hex(writeWire(new WireFloat(1.5, false))), "ca3fc00000"); + assert.equal(hex(writeWire(new Array(16).fill(null))), `dc0010${"c0".repeat(16)}`); + assert.throws(() => writeWire(1.5), /not a safe integer/u); + assert.throws(() => writeWire(2 ** 53), /not a safe integer/u); + assert.throws(() => writeWire(2n ** 64n), /wider than 64 bits/u); + assert.throws(() => writeWire({}), /this kind of value/u); +}); + +test("a codec and a formatter are refused together wherever the definition enters", () => { + const both = { type: "t", schema: surfaceSchema, codec: surfaceCodec, formatter: { encode: () => new Uint8Array(), decode: () => golden } }; + assert.throws(() => defineDocumentType(both), /declares both a codec and a formatter/u); + assert.throws(() => CultCache.builder().withDocumentType(both), /declares both a codec and a formatter/u); + assert.throws(() => CultCache.builder().withRegistry([both]), /declares both a codec and a formatter/u); +}); + +test("a definition that skips defineDocumentType still writes its codec's bytes and its derived catalog", async () => { + const raw = { type: "tests.union_surface", schemaId: "tests.union_surface.v1", schema: surfaceSchema, codec: surfaceCodec, name: "id" } as unknown as AnyCultCacheDocumentDefinition; + const holder = memoryStore([]); + const cache = CultCache.builder().withDocumentType(raw).withGenericStore(holder).build(); + await cache.put(raw as never, "surface", golden as never); + assert.equal(hex(documentPayloadBytes(holder.entries[0].payload)), hex(await read("union-surface.msgpack"))); + const [snapshot] = cache.snapshot(); + assert.deepEqual(snapshot.catalogEntry!.members!.map((member) => member.typeName).slice(0, 2), ["System.String", "System.Int32"]); +}); + +test("every leaf and wrapper carries the reference's type name, and a catalog is not derived from a codec that cannot name a slot", () => { + assert.deepEqual( + [string, boolean, bytes, int32, int64, float32, float64].map((codec) => codec.typeName), + ["System.String", "System.Boolean", "System.Byte[]", "System.Int32", "System.Int64", "System.Single", "System.Double"], + ); + assert.equal(list(int64).typeName, "System.Collections.Generic.List"); + assert.equal(array(string).typeName, "System.String[]"); + assert.equal(nullable(int32).typeName, "System.Nullable"); + assert.equal(nullable(string).typeName, "System.String"); + assert.equal(nullable(list(string)).typeName, "System.Collections.Generic.List"); + assert.equal(list(union<{ kind: "A" }>("U", { 0: ["A", unit] })).typeName, undefined); + const unnamed = slots<{ id: string; what: { kind: "A" } | null }>({ 0: ["id", string], 1: ["what", union<{ kind: "A" }>("U", { 0: ["A", unit] })] }); + assert.throws(() => unnamed.members, /^Error: what \(slot 1\) has no C# type name for the schema catalog/u); + assert.throws(() => defineDocumentType({ type: "t", schema: z.any(), codec: unnamed as never }), /what \(slot 1\) has no C# type name/u); + const given = defineDocumentType({ type: "t", schema: z.any(), codec: unnamed as never, members: [{ slot: 0, memberName: "Id", typeName: "System.String" }] }); + assert.equal(given.members!.length, 1); +}); + +// tests/vectors/numeric-leaves is written by the C# reference (NumericLeafVectorTests): what it reads and refuses for each +// numeric leaf, and the bytes it writes. +const numericVectors = join(vectors, "..", "numeric-leaves"); +const numericLeaves: Record> = { int32, int64, float32, float64 }; +const doubleBitsHex = (value: number) => { + const view = new DataView(new ArrayBuffer(8)); + view.setFloat64(0, value); + return Buffer.from(view.buffer).toString("hex"); +}; +const int64BitsHex = (value: number | bigint) => BigInt.asUintN(64, BigInt(value)).toString(16).padStart(16, "0"); +const isNaNBits = (bitsHex: string) => { + const bits = BigInt(`0x${bitsHex}`); + return ((bits >> 52n) & 0x7ffn) === 0x7ffn && (bits & ((1n << 52n) - 1n)) !== 0n; +}; + +const isSignallingFloat32 = (payload: Uint8Array) => { + // payload is a one-slot record [float32]: 91 ca b0 b1 b2 b3 + if (payload.length !== 6 || payload[1] !== 0xca) return false; + const bits = new DataView(payload.buffer, payload.byteOffset).getUint32(2); + return (bits & 0x7f800000) === 0x7f800000 && (bits & 0x007fffff) !== 0 && (bits & 0x00400000) === 0; +}; + +test("numeric leaves read and refuse exactly what the C# reference does", async () => { + const rows = readWire(new Uint8Array(await readFile(join(numericVectors, "reads.msgpack")))) as [string, Uint8Array, boolean, Uint8Array][]; + assert.equal(rows.length, 160); + let accepted = 0; + let refused = 0; + for (const [leaf, payload, wasAccepted, bits] of rows) { + const label = `${leaf} ${hex(payload)}`; + const record = slots<{ v: unknown }>({ 0: ["v", numericLeaves[leaf]] }); + if (wasAccepted && leaf === "float32" && isSignallingFloat32(payload)) { + // The one reading that differs from the reference: it reads a float32 signalling NaN, this runtime refuses it + // (float32-nan.msgpack shows the reference keeps its bits, which a JS number cannot). + assert.throws(() => record.decode(readWire(payload)), (error: Error) => !error.message.includes(hex(payload).slice(2)), label); + refused += 1; + } else if (wasAccepted) { + const read = record.decode(readWire(payload)).v as number | bigint; + const wanted = hex(bits); + if (leaf.startsWith("float")) { + if (isNaNBits(wanted)) assert.ok(Number.isNaN(read), label); + else assert.equal(doubleBitsHex(read as number), wanted, label); + } else { + assert.equal(int64BitsHex(read), wanted, label); + } + accepted += 1; + } else { + assert.throws(() => record.decode(readWire(payload)), (error: Error) => !error.message.includes(hex(payload).slice(2)), label); + refused += 1; + } + } + assert.ok(accepted > 40 && refused > 40, `accepted ${accepted}, refused ${refused}`); + assert.equal(accepted + refused, rows.length); +}); + +// float32-nan.msgpack: [payload, bytes the reference writes after reading it] for a float32 slot holding an infinity or a NaN. +// The reference keeps every payload bit; a JS number cannot keep a signalling NaN's, so that read is refused. +test("a float32 NaN round-trips with its bits, and a signalling one is refused on read", async () => { + const rows = readWire(new Uint8Array(await readFile(join(numericVectors, "float32-nan.msgpack")))) as [Uint8Array, Uint8Array][]; + assert.equal(rows.length, 6); + const record = slots<{ v: number }>({ 0: ["v", float32] }); + let refused = 0; + for (const [payload, rewritten] of rows) { + if (isSignallingFloat32(payload)) { + assert.equal(hex(rewritten), hex(payload), "the reference keeps the signalling bits"); + assert.throws(() => record.decode(readWire(payload)), { message: "v (slot 0): expected a float32, found a signalling NaN" }, hex(payload)); + refused += 1; + } else { + assert.equal(hex(writeWire(record.encode(record.decode(readWire(payload))))), hex(rewritten), hex(payload)); + } + } + assert.equal(refused, 3); +}); + +test("only a NaN with its quiet bit clear is signalling: a finite float32 with a clear bit 22 reads, and a float64 slot reads any float32 NaN", () => { + const f32 = slots<{ v: number }>({ 0: ["v", float32] }); + const f64 = slots<{ v: number }>({ 0: ["v", float64] }); + assert.equal(f32.decode(readWire(fromHex("91ca3f800001"))).v, Math.fround(1.0000001192092896)); + assert.equal(f32.decode(readWire(fromHex("91ca00000001"))).v, Math.fround(1e-45)); + assert.equal(f32.decode(readWire(fromHex("91ca7f800000"))).v, Infinity); + assert.ok(Number.isNaN(f32.decode(readWire(fromHex("91ca7fc00001"))).v)); + assert.ok(Number.isNaN(f64.decode(readWire(fromHex("91ca7f800001"))).v)); +}); + +test("numeric leaves write the bytes the C# reference writes, and 64-bit values lose nothing", async () => { + const rows = readWire(new Uint8Array(await readFile(join(numericVectors, "writes.msgpack")))) as [string, string, Uint8Array][]; + assert.equal(rows.length, 46); + for (const [leaf, text, expected] of rows) { + const value = leaf.startsWith("float") ? new DataView(Uint8Array.from(Buffer.from(text, "hex")).buffer).getFloat64(0) : leaf === "int32" ? Number(text) : BigInt(text); + const record = slots<{ v: unknown }>({ 0: ["v", numericLeaves[leaf]] }); + assert.equal(hex(writeWire(record.encode({ v: value }))), hex(expected), `${leaf} ${text}`); + } + const wide = slots<{ v: number | bigint }>({ 0: ["v", int64] }); + for (const value of [2n ** 53n + 1n, 2n ** 63n - 1n, -(2n ** 63n), -(2n ** 53n) - 1n]) { + assert.equal(wide.decode(readWire(writeWire(wide.encode({ v: value })))).v, value); + } + assert.equal(wide.decode(readWire(writeWire(wide.encode({ v: 2n })))).v, 2, "a bigint that fits comes back a number"); +}); + +test("the wire writer's width boundaries: where a length or an integer changes its header", () => { + assert.equal(hex(writeWire(0)), "00"); + assert.equal(hex(writeWire("a".repeat(31))).slice(0, 2), "bf"); + assert.equal(hex(writeWire("a".repeat(32))).slice(0, 4), "d920"); + assert.equal(hex(writeWire("a".repeat(255))).slice(0, 4), "d9ff"); + assert.equal(hex(writeWire("a".repeat(256))).slice(0, 6), "da0100"); + assert.equal(hex(writeWire("a".repeat(65535))).slice(0, 6), "daffff"); + assert.equal(hex(writeWire("a".repeat(65536))).slice(0, 10), "db00010000"); + assert.equal(hex(writeWire(new Uint8Array(1))), "c40100"); + assert.equal(hex(writeWire(new Uint8Array(256))).slice(0, 6), "c50100"); + assert.equal(hex(writeWire(new Uint8Array(65536))).slice(0, 10), "c600010000"); + assert.equal(hex(writeWire(new Array(15).fill(null))), `9f${"c0".repeat(15)}`); + assert.equal(hex(writeWire(new Array(65535).fill(null))).slice(0, 6), "dcffff"); + assert.equal(hex(writeWire(new Array(65536).fill(null))).slice(0, 10), "dd00010000"); + assert.throws(() => writeWire(-(2n ** 63n) - 1n), { message: "cannot write an integer wider than 64 bits." }); + assert.throws(() => writeWire(undefined), /this kind of value/u); + assert.equal(hex(writeWire(-(2n ** 63n))), "d38000000000000000"); +}); + +test("the wire reader's boundaries: the largest fixarray, the 32-bit binary and string, the safe integer edge", () => { + assert.deepEqual(readWire(fromHex(`9f${"c0".repeat(15)}`)), new Array(15).fill(null)); + assert.deepEqual(readWire(fromHex("c600000001aa")), new Uint8Array([0xaa])); + assert.equal(readWire(fromHex("db0000000161")), "a"); + assert.equal(readWire(fromHex("d3ffe0000000000001")), -(2 ** 53 - 1)); + assert.equal(readWire(fromHex("d3ffe0000000000000")), -(2n ** 53n)); + assert.equal(readWire(fromHex("cf0020000000000000")), 2n ** 53n); +}); + +test("a refusal says what was found: nil, a float, an integer that is not the slot's, a plain kind", () => { + assert.throws(() => int32.encode(undefined as unknown as number), { message: "expected an int32, found nil" }); + assert.throws(() => string.decode(new WireFloat(1, true)), { message: "expected a string, found float" }); + assert.throws(() => string.decode(5n), { message: "expected a string, found integer" }); + assert.throws(() => int32.decode(new WireFloat(7, true)), { message: "expected an int32, found float" }); + assert.throws(() => float64.decode("1"), { message: "expected a float64, found string" }); + assert.throws(() => int64.encode(1.5), { message: "expected an int64, found a non-integer number" }); +}); + +test("nullable names a value type Nullable and anything else as itself", () => { + assert.equal(nullable(boolean).typeName, "System.Nullable"); + assert.equal(nullable(int64).typeName, "System.Nullable"); + assert.equal(nullable(float32).typeName, "System.Nullable"); + assert.equal(nullable(float64).typeName, "System.Nullable"); + assert.equal(nullable(bytes).typeName, "System.Byte[]"); + const unnamedValueType: Codec = { valueType: true, encode: (value) => value, decode: (raw) => raw as number }; + assert.equal(nullable(unnamedValueType).typeName, undefined); + assert.equal(lazy(() => int32).valueType, true); +}); + +test("the Int32 edges of an arm key: the largest is an arm, one past either end is outside", () => { + const edge = union<{ kind: "A" }>("U", { 2147483647: ["A", unit] }); + assert.deepEqual(edge.decode(readWire(fromHex("92ce7fffffff90"))), { kind: "A" }); + assert.deepEqual(edge.encode({ kind: "A" }), [2147483647, []]); + assert.throws(() => edge.decode(readWire(fromHex("92ce8000000090"))), { message: "Union U: the arm key is outside Int32 (declared keys: 2147483647)." }); + assert.throws(() => edge.decode(readWire(fromHex("92d3ffffffff7fffffff90"))), { message: "Union U: the arm key is outside Int32 (declared keys: 2147483647)." }); + assert.throws(() => edge.decode(readWire(fromHex("92d3ffffffff8000000090"))), { message: "Union U: unknown arm key -2147483648 (declared keys: 2147483647)." }); +}); + +function envelopeOf(payload: Uint8Array): CultCacheEnvelope { + return { key: "surface", type: "tests.union_surface", payload: documentPayloadFromBytes(payload), storedAt: new Date().toISOString() }; +} + +function memoryStore(entries: CultCacheEnvelope[]): CacheBackingStore & { entries: CultCacheEnvelope[] } { + return { + entries, + async pullAll() { return entries.map((entry) => ({ ...entry })); }, + async push(entry) { entries.push(entry); }, + async delete() {}, + }; +} + +test("arm keys span Int32 and are listed ascending; slot keys are non-negative Int32", () => { + const keys = union<{ kind: "High" | "Zero" | "Neg" | "Low" }>("U", { + 2147483647: ["High", unit], + 0: ["Zero", unit], + [-1]: ["Neg", unit], + [-2147483648]: ["Low", unit], + }); + for (const [kind, key] of [["High", 2147483647], ["Zero", 0], ["Neg", -1], ["Low", -2147483648]] as const) { + const written = keys.encode({ kind }); + assert.deepEqual(written, [key, []]); + assert.deepEqual(keys.decode(readWire(writeWire(written))), { kind }); + } + assert.throws(() => keys.decode(readWire(fromHex("920590"))), { message: "Union U: unknown arm key 5 (declared keys: -2147483648, -1, 0, 2147483647)." }); + assert.throws(() => union<{ kind: "A" }>("U", { [-2147483649]: ["A", unit] }), { message: "Union U declares the key -2147483649, which is outside Int32." }); + assert.throws(() => union<{ kind: "A" }>("U", { 99999999999999999999: ["A", unit] } as never), { message: "Union U declares the key 100000000000000000000, which is outside Int32." }); + assert.throws(() => slots<{ a: string }>({ 2147483647: ["a", string] }), { message: "A slot record declares the key 2147483647, which is above the slot key limit 65535." }); + assert.throws(() => slots<{ a: string }>({ 2147483648: ["a", string] }), { message: "A slot record declares the key 2147483648, which is above the slot key limit 65535." }); + assert.throws(() => slots<{ a: string }>({ [-1]: ["a", string] }), { message: 'A slot record declares the key "-1", which is not a non-negative integer.' }); +}); + +// A slot record is a dense array of key+1 slots, as the reference writes it, so the key is capped: the largest accepted +// key writes a 65536-slot payload, one more is refused at definition. +test("a slot key is capped at 65535: the cap is the largest slot record, one past it is refused at definition", () => { + assert.equal(MAX_SLOT_KEY, 65535); + const edge = slots<{ a: string }>({ 65535: ["a", string] }); + const written = edge.encode({ a: "x" }) as unknown[]; + assert.equal(written.length, 65536); + assert.equal(written[65535], "x"); + assert.equal(written.filter((slot) => slot === null).length, 65535); + assert.deepEqual(edge.decode(readWire(writeWire(written))), { a: "x" }); + assert.throws(() => slots<{ a: string }>({ 65536: ["a", string] }), { message: "A slot record declares the key 65536, which is above the slot key limit 65535." }); +}); + +test("the mixed-record vector is the bytes the reference writes for a record of every leaf kind", async () => { + const mixed = slots<{ id: string; i: number; l: number | bigint; f: number; d: number }>({ + 0: ["id", string], 1: ["i", int32], 2: ["l", int64], 3: ["f", float32], 4: ["d", float64], + }); + const committed = new Uint8Array(await readFile(join(vectors, "..", "numeric-leaves", "mixed-record.msgpack"))); + assert.equal(hex(writeWire(mixed.encode({ id: "n1", i: 7, l: 8, f: 1.5, d: 2.5 }))), hex(committed)); + assert.deepEqual(mixed.decode(readWire(committed)), { id: "n1", i: 7, l: 8, f: 1.5, d: 2.5 }); +}); + +// tests/vectors/slot-nil is written by the C# reference (SlotNilVectorTests): what it reads and rewrites for a nil, a str in a +// byte[] slot, and a record short of its last slots. A runtime accepts what it accepts and rewrites the same bytes. +test("slots read and rewrite exactly what the C# reference does for nil, a str in bytes, and short records", async () => { + const inner = slots<{ x: string }>({ 0: ["x", string, ""] }); + const probe = slots<{ s: string; i: number; b: Uint8Array; r: { x: string }; l: string[] }>({ + 0: ["s", string, ""], + 1: ["i", int32, 0], + 2: ["b", bytes, () => new Uint8Array()], + 3: ["r", inner, null as unknown as { x: string }], + 4: ["l", list(string), () => []], + }); + const rows = readWire(new Uint8Array(await readFile(join(vectors, "..", "slot-nil", "reads.msgpack")))) as [string, Uint8Array, boolean, Uint8Array][]; + assert.equal(rows.length, 17); + let accepted = 0; + for (const [name, payload, wasAccepted, rewritten] of rows) { + if (wasAccepted) { + assert.equal(hex(writeWire(probe.encode(probe.decode(readWire(payload))))), hex(rewritten), name); + accepted += 1; + } else { + assert.throws(() => probe.decode(readWire(payload)), (error: Error) => !error.message.includes(hex(payload).slice(2)), name); + } + } + assert.equal(accepted, 15); + // A character outside the BMP is four UTF-8 bytes (U+1F600 is f0 9f 98 80); a CESU-8 reader, or one with no four-byte + // branch, fails here against the bytes the C# reference wrote. + const astral = rows.find(([name]) => name === "string-astral")!; + assert.equal(probe.decode(readWire(astral[1])).s, "\u{1F600}"); + assert.equal(hex(writeWire(probe.encode(probe.decode(readWire(astral[1]))))), hex(astral[3])); + const astralInBytes = rows.find(([name]) => name === "bytes-str-astral")!; + assert.equal(hex(probe.decode(readWire(astralInBytes[1])).b), "f09f9880"); +}); + +test("a nil reads as null and writes as nil in every reference slot, and a value slot refuses it", () => { + const record = slots<{ s: string; b: Uint8Array; i: number }>({ 0: ["s", string], 1: ["b", bytes], 2: ["i", int32, 5] }); + const read = record.decode([null, null, 3]); + assert.deepEqual(read, { s: null, b: null, i: 3 }); + assert.deepEqual(record.encode(read), [null, null, 3]); + assert.throws(() => record.encode({ s: "a", b: new Uint8Array(), i: null as unknown as number }), { message: "i (slot 2): expected an int32, found nil" }); + assert.throws(() => record.decode(["a", new Uint8Array(), null]), { message: "i (slot 2): expected an int32, found nil" }); +}); + +test("a bytes slot reads a MessagePack str as its bytes and writes bin, and refuses a str that was not valid UTF-8", () => { + const record = slots<{ b: Uint8Array }>({ 0: ["b", bytes] }); + const read = record.decode(readWire(fromHex("91a3616263"))); + assert.equal(hex(read.b), "616263"); + assert.equal(hex(writeWire(record.encode(read))), "91c403616263"); + assert.throws(() => record.decode(readWire(fromHex("91a2c328"))), { message: "b (slot 0): expected bytes, found a string that is not valid UTF-8" }); + assert.throws(() => record.decode([5]), { message: "b (slot 0): expected bytes, found number" }); +}); + +// ---- the bounds vectors: arm keys at the ends of the Int32 domain, nil arm slots, payload nesting ---- + +const wrapChain = (wraps: number, leaf: Node): Node => { + let node: Node = leaf; + for (let index = 0; index < wraps; index += 1) node = { kind: "Wrap", inner: node }; + return node; +}; +// A Wrap adds 2 containers, a Box with no children 3, a Text leaf 2, and the outermost array is 1 (the C# test's arithmetic). +const AT_LIMIT_WRAPS = (MAX_PAYLOAD_DEPTH - 1 - 3) / 2; +const PAST_LIMIT_WRAPS = (MAX_PAYLOAD_DEPTH + 1 - 1 - 2) / 2; +const atLimitValue: Surface = { ...golden, root: wrapChain(AT_LIMIT_WRAPS, { kind: "Box", id: "leaf", children: [] }) }; +const pastLimitValue: Surface = { ...golden, root: wrapChain(PAST_LIMIT_WRAPS, { kind: "Text", id: "leaf", content: CANARY }) }; + +async function boundsEntries() { + const raw = decode(await read("bounds-outcomes.msgpack")) as unknown[][]; + const [limit, ...rest] = raw; + return { limit, entries: rest.map(([file, outcome, unionName, key, detail]) => ({ file: file as string, outcome: outcome as string, unionName: unionName as string, key: key as number | null, detail: detail as string })) }; +} + +test("every bounds vector is listed and holds: accepted files decode and re-encode, refused files are refused naming the union or the depth", async () => { + const { limit, entries } = await boundsEntries(); + assert.deepEqual(limit, ["limit", MAX_PAYLOAD_DEPTH]); + assert.equal(entries.length, 12); + const document = surfaceDocument(); + const counts = { accepted: 0, refused: 0, readOnly: 0 }; + + for (const { file, outcome: expected, unionName, key, detail } of entries) { + const payload = documentPayloadFromBytes(await read(file)); + if (expected === "accepted") { + counts.accepted += 1; + const value = decodeDocumentPayload(document, payload); + assert.equal(hex(documentPayloadBytes(encodeDocumentPayload(document, value))), hex(await read(detail)), `${file}: re-encodes to ${detail}`); + } else if (expected === "read-only") { + counts.readOnly += 1; + assert.deepEqual(decodeDocumentPayload(document, payload), golden, `${file}: the extra slots are read past`); + } else { + counts.refused += 1; + assert.throws( + () => decodeDocumentPayload(document, payload), + (error: Error) => { + assert.ok(!error.message.includes(CANARY), `${file}: the refusal echoed the payload`); + if (detail === "depth") { + return error instanceof CultCachePayloadDepthError && error.depth === MAX_PAYLOAD_DEPTH + 1 && error.limit === MAX_PAYLOAD_DEPTH + && error.message.includes(`"${document.type}"`) && error.message.includes("257") && error.message.includes("256"); + } + assert.ok(!(error instanceof CultCachePayloadDepthError), file); + const said = detail === "key-out-of-range" ? "outside Int32" : detail === "key-not-integer" ? "not an integer" : "expected [key, slots]"; + return error.message.includes(`Union ${unionName}:`) && error.message.includes(said); + }, + file, + ); + } + } + assert.deepEqual(counts, { accepted: 3 + 1, refused: 4 + 1 + 2, readOnly: 1 }); +}); + +test("the constructed values write the committed at-limit payload byte for byte, and the past-limit value is refused and stored nowhere", async () => { + const document = surfaceDocument(); + assert.equal(hex(documentPayloadBytes(encodeDocumentPayload(document, atLimitValue))), hex(await read("depth-at-limit.msgpack"))); + assert.deepEqual(decodeDocumentPayload(document, documentPayloadFromBytes(await read("depth-at-limit.msgpack"))), atLimitValue); + + assert.throws( + () => encodeDocumentPayload(document, pastLimitValue), + (error: Error) => error instanceof CultCachePayloadDepthError && error.depth === 257 && !error.message.includes(CANARY), + ); + + const entries: CultCacheEnvelope[] = []; + const cache = CultCache.builder().withDocumentType(document).withGenericStore(memoryStore(entries)).build(); + await assert.rejects(() => cache.put(document, "past", pastLimitValue), CultCachePayloadDepthError); + assert.equal(entries.length, 0, "nothing reached the store"); + assert.equal(cache.get(document, "past"), undefined, "nothing is held in memory"); + await cache.put(document, "at", atLimitValue); + assert.equal(entries.length, 1); + assert.equal(hex(documentPayloadBytes(entries[0]!.payload)), hex(await read("depth-at-limit.msgpack"))); +}); + +test("a cache load refuses a store whose record is past the limit, naming the type and not the payload", async () => { + const document = surfaceDocument(); + const refusing = CultCache.builder().withDocumentType(document).withGenericStore(memoryStore([envelopeOf(await read("depth-past-limit.msgpack"))])).build(); + await assert.rejects(() => refusing.pullAllBackingStores(), (error: Error) => error instanceof CultCachePayloadDepthError && !error.message.includes(CANARY)); +}); diff --git a/packages/cultmath/README.md b/packages/cultmath/README.md index 0be46738..381b194a 100644 --- a/packages/cultmath/README.md +++ b/packages/cultmath/README.md @@ -26,13 +26,82 @@ shader semantics. acceleration and semi-implicit Euler integration - `math` intrinsics: `radians`, `degrees`, `abs`, `floor`, `ceil`, `frac`, `min`, `max`, `clamp`, `saturate`, `lerp`, `step`, `smoothstep`, `dot`, - `cross`, `length`, `distance`, `normalize`, `reflect`, `csum`, exponential - `decay`/`damp`, intercept/segment helpers, Catmull-Rom, Bezier curves, and + `cross`, `length`, `distance`, `normalize`, `reflect`, `csum`, `erf`, + `erfinv` (scalar only), exponential + `decay`/`damp`, intercept/segment helpers (`distance_to_segment` in 2D and 3D, with and without `out closest`, and `segment_closest`), Catmull-Rom, Bezier curves, and deterministic value-noise primitives +- Site cells: `power_cells` and `multiplicative_cells` return the two nearest sites of a point as `CultSiteCells`, + `soft_gabriel_gate` gates a pair of sites by the empty-disc margin. Each is a loop over the shader steps + `cultmath_power_score` / `cultmath_multiplicative_score`, `cultmath_site_cells_empty`, `cultmath_site_cells_insert`, + `cultmath_site_cells_border`, `cultmath_power_border_step` (the exact power cell border, `power_border`) and `cultmath_gabriel_margin`; a shader loops over its own buffer. +- Weighted lattice cells: `weighted_lattice_cells` returns `float4(F1, F2, smooth, id)` over a jittered, + drifting lattice whose cell weights come from the exact power border of the body span at each cell centre, with a stretched + metric and an exact ring search over the stated range (`LatticeMaxBoost`, `LatticeMaxStretch`, `LatticeMaxSmoothing`). It composes the + public steps `lattice_site`, `lattice_weight`, `lattice_distance` and `lattice_smooth_step`. The shaders carry the four steps as + `cultmath_lattice_site`, `cultmath_lattice_weight`, `cultmath_lattice_distance` and `cultmath_lattice_smooth_step`, and the whole function as `cultmath_weighted_lattice_cells(p, time, bodies, + count, ...)` over a `float4 bodies[CULTMATH_MAX_SITES]` array (128 by default; define the macro before including to change it); + `cultmath_power_border(p, sites, count)` is the matching border. The argument checks become the shader caller's preconditions. - `shaders/CultMath.hlsl`, a canonical HLSL mirror include for shader-side parity. HLSL already owns `float2`, `float3`, and `float4`; the include - exposes `cultmath_*` functions for shared semantics, including CultMath's - safe `normalize` contract. + exposes `cultmath_*` functions for shared semantics HLSL does not provide. + It includes `shaders/CultMath.Phacelle.hlsl` (MPL-2.0), + `shaders/CultMath.Cycles.hlsl` (Apache-2.0) and + `shaders/CultMath.Interval.hlsl` and `shaders/CultMath.Affine.hlsl` from the same + directory, so ship all five. +- Cycles node semantics (Apache-2.0): `cycles_*` functions that compute what + Blender's Cycles renderer computes for the Math node operations whose results + differ from a plain intrinsic (`cycles_divide`, `cycles_power`, `cycles_modulo`, + `cycles_wrap`, `cycles_pingpong`, `cycles_smooth_min`, ...), Map Range + (`cycles_map_range_linear`, `_stepped`, `_smoothstep`, `_smootherstep`), Clamp + (`cycles_clamp_minmax`, `cycles_clamp_range`), Mix (`cycles_mix_float`, + `cycles_mix_vector` and every colour blend mode as `cycles_mix_`), RGB to BW, + and `cycles_ramp_index`, where a Color Ramp reads its table. `cultmath_cycles_*` in + HLSL and GLSL. Operands are finite floats, and the tests hold every function to + the results of Blender 5.2.2's own CPU Cycles (`tools/cycles-oracle`). +- interval arithmetic for culling empty space: `iv_*` functions + over `float2(lo, hi)` (`iv_add`, `iv_mul`, `iv_exp`, `iv_smoothstep`, ...) + and `iv_snoise_ball`/`iv_fbm_ball`, which bound `snoise` and `fbm_grad` over a + ball, and `iv_frustum_ball`, the ball around a screen tile's rays over a depth + segment, so one probe serves the whole tile (its radius carries its own + float32 rounding bound). The arithmetic functions return an interval built to + contain the function's value over their operand intervals, so a raymarch + can skip a segment whose `hi` is below its cutoff; `cultmath_iv_*` in HLSL. + The noise functions rest on empirical constants with a margin, not a proof: + `iv_snoise_ball(float3)` on `SNOISE_LIPSCHITZ` (`iv_fbm_ball` through it), + `iv_snoise_ball(float2)` on `SNOISE2_LIPSCHITZ`, and `af_snoise` on + `SNOISE_HESSIAN` and `SNOISE_LIPSCHITZ` (`af_fbm` through it); the enclosure + tests sample them. `iv_frustum_ball` and `af_frustum_ball` read no noise + constant: the ball is geometry plus a rounding widening, and the noise call + it feeds carries the constant. + The bounds compose with a consumer's own analytic envelope (a height fog, a + carved sphere): its interval over the segment proves empty space in one probe, + and the noise ball is consulted only near the surface. See `docs/design.md`, + "Intervals". +- `shaders/CultMath.glsl` (MIT), the same `cultmath_*` library in GLSL ES 3.00 + for WebGL2, generated from `CultMath.hlsl` (never edited by hand), and + `shaders/CultMath.Phacelle.glsl` (MPL-2.0), generated from + `CultMath.Phacelle.hlsl`, which holds `cultmath_phacelle` alone, and + `shaders/CultMath.Cycles.glsl` (Apache-2.0), generated from + `CultMath.Cycles.hlsl`, which holds the `cultmath_cycles_*` functions. GLSL has no + `#include`: a WebGL consumer concatenates `CultMath.glsl` after its own + `#version 300 es` line and `precision highp float; precision highp int;` + (the library declares no precision, and its hashes need 32-bit integers), + then `CultMath.Phacelle.glsl` only if it calls `cultmath_phacelle` and + `CultMath.Cycles.glsl` only if it calls a `cultmath_cycles_` function, then its + own shader source. +- Span primitives (`math.Span.cs`, `cultmath_*` in HLSL and GLSL): `snoise_hessian`, + the analytic Hessian of `snoise(float3)` on the same lattice, hash and tie order as + `snoise_grad` (a symmetric `float3x3`; GLSL `mat3`), and `integral_clamp_linear(a, + b, lo, hi, t0, t1)`, the closed-form integral over `[t0, t1]` of `clamp(a + b t, + lo, hi)`; and the octave stages `span_fbm(path, stage, + octaves, lacunarity, gain)` and `span_ridged` (shader twins `cultmath_span_fbm` and `cultmath_span_ridged`, + whose callers build the `SpanStage` themselves), over a `SpanPath` and a `SpanStage` (`SpanStage.Identity` + is the plain fbm in C#), which return a `SpanNoise` (`field` as `float4(gradient, value)`, + `curvature`, `fold`) for a stretched, offset, shifted octave sum over a span. Three measured bounds describe `snoise`: `SNOISE_LIPSCHITZ` (gradient + length, `NoiseBoundTests.MeasureLipschitz`), `SNOISE_HESSIAN` (Hessian spectral + norm, `MeasureHessian`) and `SNOISE_THIRD` (third-derivative operator norm, + `MeasureThird`); each is 1.10 times a seeded maximum refined by ascent, and a + fast test pins it. They are empirical with a margin, not proofs. - `Voronoi.SampleTones`, a C# batch surface that calls the Rust `cultmath-core` native kernel when `cultmath_core` is available and falls back to the managed parity path otherwise. @@ -59,7 +128,7 @@ float grain = math.value_noise_bicubic(math.float2(12.0f, 3.5f)); ```hlsl #include "CultMath.hlsl" -float3 normal = cultmath_normalize(float3(0.25, 1.0, -0.1)); +float3 normal = normalize(float3(0.25, 1.0, -0.1)); float rim = cultmath_saturate(1.0 - dot(normal, float3(0.0, 0.0, -1.0))); float glow = cultmath_smoothstep(0.2, 1.0, rim); float grain = cultmath_value_noise_bicubic(float2(12.0, 3.5)); @@ -98,12 +167,19 @@ The repository root is not a Unity package. Build the tracked package with assembly and rejects stale binaries, missing metadata, unexpected assemblies, or leaked C# source. +Before tagging `cultmath-unity-v*`, run the import and dispatch smoke on a Windows machine with a GPU, +alone: `packages/cultmath/scripts/unity-smoke/run-unity-smoke.ps1 -UnityExe `. It +builds a scratch project outside the repository that references the package by a `file:` path, +dispatches a compute shader that includes `CultMath.Interval.hlsl` and `CultMath.Affine.hlsl`, requires +a deliberately broken control shader to be rejected, and deletes the project afterwards. + ## Shader Tooling CultMath keeps portable DXC outside git under `packages/cultmath/.tools/`: ```powershell .\packages\cultmath\tools\get-dxc.ps1 +.\packages\cultmath\tools\compile-hlsl.ps1 .\packages\cultmath\tools\get-spirv-cross.ps1 .\packages\cultmath\tools\compile-hlsl-spirv.ps1 ` -ShaderPath E:\Projects\Odin\crates\muninn-move-tracker\shaders\MoveSphereCandidate.comp.hlsl ` @@ -114,6 +190,10 @@ CultMath keeps portable DXC outside git under `packages/cultmath/.tools/`: -OutputPath E:\Projects\Odin\crates\muninn-move-tracker\artifacts\shader\MoveSphereCandidate.comp.metal ``` +`tools/glsl/build-glsl.sh ` (Linux, repository root) builds the library GLSL from the HLSL with dxc, SPIRV-Cross and SPIRV-Tools and writes `core.glsl`, `cycles.glsl` and `phacelle.glsl` bodies into ``. It does not yet own the committed GLSL; `GlslLowering` still does. `GLSL_DIR= tools/device/run-lavapipe.sh` runs that output on lavapipe and compares it with the HLSL results bit for bit instead of judging the committed files. That comparison is in strict form (dxc `-Gis` and a `NoContraction` decoration on every float result of both modules), and a consumer overrides `CULTMATH_MAX_SITES` in the built GLSL the same way as in HLSL: define it before including `core.glsl`. + +`compile-hlsl.ps1` compiles both `CultMath.hlsl` copies as a `lib_6_3` library with the x64 DXC; a warning fails it too (`-WX`). + DXC emits Vulkan SPIR-V with `-spirv`. `-TargetEnv vulkan1.2` is exposed by the script, but the current Windows DXC release compiled this shader successfully with DXC's default Vulkan target while rejecting the dotted target-env value. @@ -123,6 +203,12 @@ class. SPIRV-Cross emits Metal Shading Language from SPIR-V on Windows; building an iPad-ready `.metallib` still belongs to Apple's Metal compiler on an Apple toolchain. +The lavapipe conforming run executes every fixture family through the HLSL (dxc) and the committed GLSL +(glslang) on Mesa lavapipe and judges the results in `GlslMirrorTests.DeviceResultsHoldFixture`. It needs a Linux +container with apt: from the repo root, `tools/stopgap/ygg-verify.sh mcr.microsoft.com/dotnet/sdk:10.0 +'bash packages/cultmath/tools/device/run-lavapipe.sh'`. `WRITE_BOUNDS=1` in front of the script re-records the +device's bounds file and prints it between `BOUNDS-BEGIN` and `BOUNDS-END`. + ## Doctrine The goal is mechanical sympathy between CPU-side authoring, native kernels, and diff --git a/packages/cultmath/THIRD-PARTY-NOTICES.md b/packages/cultmath/THIRD-PARTY-NOTICES.md index 06ebb6c3..041f048b 100644 --- a/packages/cultmath/THIRD-PARTY-NOTICES.md +++ b/packages/cultmath/THIRD-PARTY-NOTICES.md @@ -6,6 +6,69 @@ simplex-noise functions by Ian McEwan and Ashima Arts, as distributed by Stefan Gustavson's `webgl-noise` project and Unity Mathematics. +`math.snoise(float3)` and `cultmath_snoise(float3)` follow `src/noise3D.glsl` and +`math.snoise(float2)` follows `src/noise2D.glsl` of stegu/webgl-noise at commit +`22434e04d7753f7e949e8d724ab3da2864c17a0f` (the simplex-boundary fix is +`21d9fe23d7`, scale `ff3b5d34ea`, permutation `a3e6d57095`). Modified from upstream: +the 3D corner tie order follows Gustavson's `simplexnoise1234`, because the +upstream `step` compares are cyclic where the offset's components are equal. + +`math.snoise_grad`/`cultmath_snoise_grad` (and the `fbm_grad`/`ridged_grad` +octave sums built on them) follow the analytic-gradient differentiation from +the same project's `src/noise3Dgrad.glsl`, with the same kernel radius, +permutation and scale as `snoise(float3)`. + - Copyright 2011 Ashima Arts. - Upstream: - License: MIT. + +## Cycles node semantics + +`math.cycles_*` and `cultmath_cycles_*` port what Blender's Cycles renderer +computes for the Math, Map Range, Clamp, Mix and RGB to BW nodes and for a Color +Ramp lookup. Each function's comment names the Cycles file it follows, all from +`intern/cycles` at the Blender `v5.2.2` tag: `kernel/svm/math_util.h`, +`kernel/svm/map_range.h`, `kernel/svm/clamp.h`, `kernel/svm/mix.h`, +`kernel/svm/color_util.h`, `kernel/svm/ramp.h`, `kernel/svm/convert.h`, +`util/math_base.h`, `util/math_float3.h` and `util/color.h`. The code was +changed: Cycles C++ became C# and HLSL, one function per node operation, with +the nodes' socket defaults and clamp options left to the caller, and the modulo +is the quotient form every CultMath target shares rather than `fmodf`. Nothing +was read from Blender's GPL sources (`source/blender/gpu`, `source/blender/blenlib`). + +- Copyright 2011-2022 Blender Foundation. +- Upstream: (`intern/cycles`). +- License: Apache-2.0 (), which is + per-file here: it covers `src/CultMath/math.Cycles.cs`, + `shaders/CultMath.Cycles.hlsl` and the Unity copy of that include, and + `shaders/CultMath.Cycles.glsl`, which is generated from that include. Each + carries the Apache-2.0 header and this attribution. The rest of CultMath, the + generated GLSL library included, is MIT or MPL-2.0 as above, so the + `GameCult.Math` NuGet package and the `org.gamecult.cultmath` Unity package + both declare `MIT AND MPL-2.0 AND Apache-2.0` and ship this file. +- The test fixtures under `tests/CultMath.Tests/fixtures/cycles-oracle` are + results of running Blender 5.2.2 through `tools/cycles-oracle/oracle.py` + (GPL-3.0-or-later, a Blender Python script, shipped neither in the NuGet + package nor in the Unity package). + +## Phacelle Noise + +`math.phacelle` and `cultmath_phacelle` follow Rune Skovbo Johansen's Phacelle +noise (Shadertoy `t3dyWl`; erosion filter `wXcfWn`; blog, March 2026), read +from the C# port `PhacelleNoise` in `lpmitchell/AdvancedTerrainErosion` +(`AdvancedTerrainErosion.cs`, converted to burstable C# by Luke Mitchell, +2026). The cell weight, the phase blend and the normalization follow it. The +3D-cell generalisation, the caller-supplied stripe wave vector, the exact +gradient and the exact pruning are new here. + +- Copyright (c) 2025 Rune Skovbo Johansen. +- Upstream: +- License: MPL-2.0 (). MPL-2.0 is file-level, so it + covers exactly the files that carry the port and nothing else: + `src/CultMath/math.Phacelle.cs`, `src/CultMath/CultPhasor.cs`, + `shaders/CultMath.Phacelle.hlsl` and the Unity copy of that include, and + `shaders/CultMath.Phacelle.glsl`, which is generated from that include. Each + carries the MPL-2.0 header and this attribution. The rest of CultMath, the + generated GLSL library included, is MIT, so the `GameCult.Math` NuGet + package and the `org.gamecult.cultmath` Unity package both declare + `MIT AND MPL-2.0` and ship this file. diff --git a/packages/cultmath/docs/design.md b/packages/cultmath/docs/design.md index de09ee26..3b63f4d2 100644 --- a/packages/cultmath/docs/design.md +++ b/packages/cultmath/docs/design.md @@ -52,7 +52,26 @@ That makes these HLSL rules, not options: operand returns the other (so `saturate(NaN)` is 0), `clamp(x, a, b)` is `min(max(x, a), b)`, and `saturate(x)` is `min(1, max(0, x))`, which maps -0 to +0; `any`/`all` accept numeric vectors (a component is true when it is - not 0); `min`, `max`, and `abs` on int vectors return int vectors. + not 0); `min`, `max`, and `abs` on int vectors return int vectors; int + `clamp` is `IMin(IMax(x, a), b)`, so inverted bounds return `b`. +- Same-size vector conversions (`intN(floatN)`, `floatN(intN)`, `boolN(floatN)`, + `boolN(intN)`, `floatN(boolN)`, `intN(boolN)`) exist as constructors and + `math` functions and follow dxc: float to int is `fptosi`, truncating toward + zero; numeric to bool is `!= 0` (`fcmp une`, so NaN is true); bool to numeric + is 0 or 1. DXIL leaves float-to-int undefined for NaN and out-of-range values, + and so does C#; CultMath does not pin them. +- `normalize(x)` is `x * Rsqrt(Dot(x, x))`, which is how dxc lowers it, and + DXIL.rst defines `Rsqrt` as `1 / sqrt(src)`. A zero vector therefore + normalizes to NaN (`0 * inf`), and a NaN component makes every component NaN. + (The special-value table under `Rsqrt` in DXIL.rst is a copy of the `Round` + table and contradicts that definition, so CultMath follows the definition.) + `length` and `distance` are `Sqrt` of the summed squares, so a zero vector + gives 0. Callers that can meet zero-length vectors guard them before calling + `normalize`. +- dxc demotes double `frac`, `exp`, `lerp`, and `floor` to float. CultMath's + double overloads keep double precision instead: `frac(double)` is + `x - floor(x)` in double. That is a deliberate divergence for CPU simulation + time, which shaders do not carry. dxc marks float arithmetic and compares `fast` (no NaNs) unless a value is `precise`, so drivers may optimize NaN handling away and NaN results on real @@ -64,9 +83,7 @@ GPU. Because `min`, `max`, and `saturate` return the non-NaN operand, some functions turn NaN or infinity into numbers: `smoothstep(a, a, a)` is 0; infinite inputs to `smoothstep` and the intercept helpers give numbers; the bezier, `smoothstep01`, and `smootherstep` functions return finite values for -NaN input; and `normalize((NaN, 2.41))` is `(NaN, 2.41e20)`, because the NaN -length is clamped to the epsilon and the other component is divided by it. -Callers that must detect bad data should check `isnan` before calling these +NaN input. Callers that must detect bad data should check `isnan` before calling these functions. Deferred until a consumer needs them: `float4x4`, `transpose`, `determinant`, @@ -78,12 +95,17 @@ and HLSL's one-based `_11`..`_33` element names. Roslyn against CultMath. These transformations are the complete list; if a body needs anything else, the test fails: -1. Include guards (`#ifndef`/`#define`/`#endif`) are dropped. +1. Include guards (`#ifndef`/`#define`/`#endif`) are dropped, except the capacity macro (`#ifndef CULTMATH_MAX_SITES`, + `#define CULTMATH_MAX_SITES 128`, `#endif`), which becomes `const int CULTMATH_MAX_SITES = 128;`. 2. Functions taking `Texture2D`/`SamplerState` are dropped; GPU resources have no CultMath analog. 3. File-scope `static const` becomes `const`. 4. Floating literals gain `f` (`0.5` becomes `0.5f`). -5. The file body is wrapped in a class, since C# has no free functions; HLSL +5. Struct fields gain `public`. HLSL struct members have no access-modifier + concept; a C# struct's fields default to `private`, which would hide them + from the mirror test's reflection-based field comparison. +6. An array parameter `T name[CULTMATH_MAX_SITES]` becomes `T[] name`. +7. The file body is wrapped in a class, since C# has no free functions; HLSL functions become private instance methods. HLSL constructs that stay outside the target and must not appear in the mirror: @@ -92,8 +114,10 @@ local) and writes through a swizzle component (`v.xy.x = s`, which C# rejects as modifying a temporary). The HLSL side is checked too: `tools/get-dxc.ps1` fetches Microsoft's -DirectXShaderCompiler, and -`dxc -T lib_6_3 -HV 2021 shaders/CultMath.hlsl` must compile cleanly. +DirectXShaderCompiler (x64), and `tools/compile-hlsl.ps1` compiles both copies of +`CultMath.hlsl` with it (`dxc -T lib_6_3 -HV 2021 -WX`, so a warning fails like an error and the +text must compile cleanly); the script throws when a shader file is missing, when dxc cannot +launch or when it exits non-zero, so a stale exit code never reads as a pass. The mirror test compares bit patterns (any NaN equals any NaN; -0 differs from 0). It proves the text of `CultMath.hlsl` computes the same float32 results as @@ -103,9 +127,374 @@ compiled under `using static CultMath.math;`, so its intrinsics are C# `math` itself: the test proves the composition in the text, not the intrinsic rules, which only `HlslSemanticsTests` pins. +Every mirror function is compared, internals included: its counterpart is the `math` +function of the same name, public or private (`snoise_mod289` and `snoise_permute` are +private), and a function with no counterpart fails by name. A struct parameter maps to the +CultMath type of the same name, and only if both have the same instance fields by name, type +and order (`SpanPath`, `SpanStage`); the argument is built from the case's scalars field by +field and copied to its C# twin by field name. + +The comparison also allows exactly one struct return shape: a mirror function +whose HLSL return type is a plain struct of `float`/`floatN`/`int`/`intN` +fields is compared to its C# counterpart field by field, recursing into each +field's own components, down to bit-for-bit scalars, matching each leaf's +declaration path (field names, not just position) and declared type as well +as its value. `CultCellular` (`math.cs`, `cellular`), `CultPhasor` +(`math.Phacelle.cs`, `phacelle`), `SpanNoise` (`math.Span.cs`, `span_fbm`) and `CultSiteCells` +(`math.Sites.cs`, `site_cells_insert`) are its consumers. `CultSiteCells` is also a struct parameter (`site_cells_insert`, `site_cells_border`). A struct return with a mismatched, reordered-by-name, or +retyped field does not get a second comparison path or a shape of its own; +it fails the same walk that already handles a bare vector return. + +### GLSL Target: Source Transformations + +`shaders/CultMath.glsl` is a GLSL ES 3.00 (WebGL2) library generated from +`shaders/CultMath.hlsl` by `GlslLowering` (in the test project), and +`shaders/CultMath.Phacelle.glsl` is generated beside it from +`shaders/CultMath.Phacelle.hlsl`. Both are derived files: never edit them by +hand. Regenerate them, and the golden fixture +`tests/CultMath.Tests/fixtures/glsl-parity.json`, with: + +```powershell +$env:CULTMATH_WRITE_GLSL = "1"; dotnet test packages/cultmath/tests/CultMath.Tests --filter GlslMirrorTests +``` + +Run it on Yggdrasil's `mcr.microsoft.com/dotnet/sdk:10.0` image (Ubuntu 24.04) only: that image owns the fixture's platform +families and `device-bounds-lavapipe.txt`, and `CULTMATH_WRITE_GLSL=1` fails on any other OS. Re-record the bounds there in +the same revision (`WRITE_BOUNDS=1`, `tools/device/run-lavapipe.sh`). + +`GlslMirrorTests.CommittedGlslEqualsLowering` fails on any difference between +either committed file and the lowering of the committed HLSL. These +transformations, in order, are the complete list: + +1. Each `#include "name"` is replaced in place by the included file, by the + same resolver the C# mirror uses; GLSL has no `#include`. The exception is + an include under a file-level licence of its own, listed in one table, + `GlslLowering.SeparateFiles`: its line is dropped and the file is lowered on + its own, by the same steps, into its own output. The table has one entry, + `CultMath.Phacelle.hlsl` to `CultMath.Phacelle.glsl`, because Phacelle is + MPL-2.0 and MPL-2.0 is file-level: kept separate, it leaves + `CultMath.glsl` MIT. Nothing else in the lowering is keyed by name. +2. Include guards are dropped, and so are the functions taking + `Texture2D`/`SamplerState`; the host shader samples its own textures. +3. Type names: `floatN`, `intN`, `uintN` and `boolN` become `vecN`, `ivecN`, + `uvecN` and `bvecN`. +4. File-scope `static const` becomes `const`. +5. C-style casts `(float)x`, `(int)x` and `(uint)x` become `float(x)`, `int(x)` + and `uint(x)`. The operand is found by a balanced-bracket scanner: + `(int)((state >> 28) + 4u)` nests parentheses. +6. Intrinsics are renamed: `lerp` to `mix`, `frac` to `fract`, `rsqrt` to + `inversesqrt`, `asuint` to `floatBitsToUint`, `asfloat` to + `uintBitsToFloat`, and `saturate(x)` becomes `clamp(x, 0.0, 1.0)`. +7. Float literals pass through unchanged. +8. Each output is wrapped in a guard named for its file: `CULTMATH_GLSL`, + `CULTMATH_PHACELLE_GLSL`. +9. The first line names the file as generated, its sources and its licence, + and says how to regenerate it; `CultMath.glsl`'s also says which + functions live in the separate file. + +GLSL ES 3.00 is stricter than HLSL: no implicit conversions between int, uint +and float, no C-style casts, and no `step(genType, float)` overload. Those gaps +are closed in the HLSL, never in the lowering: the HLSL is written in the subset +both languages share, with edits that are legal HLSL and compute the same bits +(`step(h, float4(0.0, 0.0, 0.0, 0.0))` rather than `step(h, 0.0)`, `+ 4u` where +a uint is added, `(float)((uint)hash.x >> 8)` before a float multiply). The C# +mirror and the FXC and dxc compiles keep those edits honest. A body that needs a +transformation outside the list fails `GlslMirrorTests.NoHlslOnlyTokensSurvive` +rather than gaining a special case. + +The library declares no precision. The host shader does, and it must be +`precision highp float; precision highp int;`: the PCG hashes need 32-bit +integers. `tools/compile-glsl.ps1` writes such a wrapper (its own `#version +300 es` line, the precision, the library by string concatenation, and one call +of every public function) and compiles it with glslang, which +`tools/get-glslang.ps1` fetches pinned. It runs twice: over `CultMath.glsl` +alone, and with `-Phacelle` over `CultMath.glsl` followed by +`CultMath.Phacelle.glsl`, the order a consumer that calls `cultmath_phacelle` +concatenates them in. Two negative controls must fail: `-Body` with an HLSL +token (`float x = lerp(0.0, 1.0, 0.5);`), and `-Body` calling +`cultmath_phacelle` without `-Phacelle`, which proves the MIT file does not +carry it. The Unity package ships neither GLSL file. + +Parity runs in two legs, each with one owner: HLSL against C# by the mirror +test, bit for bit; GLSL against C# by the golden fixture, which records 256 +seeded cases per function family as float32 bit patterns, evaluated by the +consumer on WebGL2 and read back. The families `pcg3d` and `pcg4d` are marked +exact; the float families are ulp-bounded, the bound measured on the device. +A conforming leg runs every fixture family through both routes on a device: `tools/device/run-lavapipe.sh` +compiles the HLSL with dxc and the committed GLSL with glslang, dispatches each family on Mesa lavapipe, and +`GlslMirrorTests.DeviceResultsHoldFixture` judges the results. Exact and integer families must match bit for bit, +families with a check pass their `Verify`, the sampled-form families are checked on the device's own noise values, +and every other family is held to the worst error recorded for that device in +`tests/CultMath.Tests/fixtures/device-bounds-lavapipe.txt`. + +`iv_frustum_ball` is ulp-bounded, not exact: it calls `sqrt`, which GLSL ES +3.00 does not require to be correctly rounded, and WebGL2 compilers may +reassociate. On a GTX 1070 under ANGLE's D3D11 backend its radius differs from +C# by up to 2 ulp in 43 of 256 cases, sometimes smaller. What the march needs +is enclosure, and what culling needs is a ball no wider than its rounding +widening, so the family's fixture entry carries a `check` the consumer applies +to every case: from the case's arguments `(mx, my, z0, z1, fp, warp)`, compute +in double `zm = (z0 + z1) / 2`, the centre `c = (mx zm, my zm, zm)`, its +`|c|_1 = |mx zm| + |my zm| + |zm|`, the radius +`r = (z1 - z0) / 2 sqrt(mx^2 + my^2 + 1) + z1 fp + warp` and +`d = |GPU centre - c|`, and require +`r + d <= GPU radius <= r + d + 2^-19 (r + |c|_1)`. The lower side is +enclosure; the upper side is the bound `NoiseBoundTests` pins in C#, so a +lowering that inflates the ball fails too. Only those two bounds fail the +check; the largest ulp distance is reported as for any ulp-bounded family. +`GoldenFixtureMatchesCSharp` applies the same check to C#'s own results. + +Every `af_*` function is an ulp-bounded family, and `af_snoise`, `af_fbm` and `af_frustum_ball` also carry a two-sided `check` +of their own, applied the same way: the device's own `snoise` or fBm at 75 sampled points of the case's set must lie in the device's +form with no tolerance (a device whose gradient error exceeds the allowance fails), its width must not pass the Lipschitz form's +allowance, and the device's `af_frustum_ball` radius must enclose the sampled ray points and stay within its rounding widening. +The reference is the device's own noise, which is right for culling soundness but would pass a device whose noise is wrong +everywhere, so two appended families (`af_snoise` and `af_fbm`, 256 cases each) add the centre leg: the fixture's own `x0` +(C#'s value at the centre) must lie in the device form's `[x0 - e, x0 + e]`, for every `af_snoise` and `af_fbm` family. They +also draw reach `|axis| + radius` from 1e-6 to 1e-3, the short slices near a camera, where the float32 allowance is most of `e`: +the main families' reach is at least about 1e-3, where the second-order remainder is far larger and a device that drops the +allowance still passes. `GoldenFixtureMatchesCSharp` requires each of the two to hold cases that fail on C#'s own results once +the allowance is removed. + +Four more appended families, the coordinate-band `snoise_grad` and `snoise_hessian` reads (256 cases each, the magnitude of the +point log-uniform from 1e-4 to 1e2 and from 1e2 to 4e6), carry an allowance `check`: with `S = |x|_1` and the allowances +`math.span_slack(math.span_rounding(1, x, zero stage, 0, 0, 0))` (the owners of the span stage's allowances in C#, HLSL and GLSL), +the result must lie within the allowance of the kernel's exact value, gradient or Hessian in double, no tolerance. The two small +families must also fail it in at least 16 cases once the absolute term is removed. `GoldenFixtureMatchesCSharp` applies the check +to C#'s own results, and a device capture is judged by the same `Verify`. + +`GoldenFixtureMatchesCSharp` evaluates C# on the committed fixture's own +arguments. Arguments are drawn only when the fixture is regenerated +(`CULTMATH_WRITE_GLSL=1`), because the draw itself calls `MathF.Pow`, whose +bits differ by OS. `iv_exp` and `phacelle` take their C# results from the +platform's `exp`, `sin` and `cos`, which also differ by OS, so their entries +name the platform that generated them and the test compares them case by case +against the running platform, printing the largest distance. `iv_exp` +("ulp-bounded, platform exp") must agree within one ulp. `phacelle` +("ulp-bounded, platform exp, sin, cos; across platforms |diff| <= 2^-20 +max(|v|, 1); on a device |diff| <= 2^-18 max(|v|, 1)") must agree across +platforms within `2^-20 max(|v|, 1)` per component, `v` being +the fixture's value: its sums of `exp`, `sin` and `cos` cancel near zero, where +ulps mean nothing, and Windows differs from the Linux fixture by up to +`3.6e-7 max(|v|, 1)`. The device clause is `2^-18` because the devices measured +are farther: lavapipe is `2.2e-6 max(|v|, 1)` and the GTX 1070 `3.1e-6`; the conforming +run judges it. Every other family is compared as text. `phacelle` is in +`CultMath.Phacelle.glsl`, so the evaluator concatenates +`CultMath.Phacelle.glsl` after `CultMath.glsl` for that family, with +normalization 0.5. The site does not vendor the MPL file and skips the family. +Its evaluator is the lavapipe GLSL route of the conforming run above, which covers +every fixture family, `phacelle` included. The real-device leg (ANGLE D3D11 on the GTX 1070) +is the later cut `angle-capture`; the one GLSL evaluation of `phacelle` on that device is a single probe (GTX 1070, ANGLE D3D11: within `3.1e-6 max(|v|, 1)` +of C#). Asura's `gpu-snoise-parity` is a different check, an FXC and Unity +readback of `snoise`, and evaluates no GLSL. + +## Invariant 8: Value-and-Gradient Primitives + +A primitive tagged invariant 8 returns its value and analytic gradient +together, laid out as `float4(gradient.xyz, value.w)`, with no value-only twin +(a value-only form would be a second path with no consumer). `smin_grad` and +`cellular` are the first primitives in this family: + +- `smin_grad(float4 a, float4 b, float k)` is Inigo Quilez's quadratic-polynomial + smooth minimum ("smooth minimum", + ), carried to value-and-gradient + form. Its blend factor `h` is affine in `b.w - a.w`, so differentiating the + value with respect to position, the terms carrying `dh/dp` cancel exactly; + the surviving gradient is `lerp(∇b, ∇a, h)`, the same `h` the value uses. + This is the analytic gradient, not an approximation, and it is continuous + across the `|a.w - b.w| = k` seam where `h` saturates to 0 or 1. +- `cellular(float3 p)` is Worley's cellular texture basis function ("A + Cellular Texture Basis Function", SIGGRAPH 1996), searched over the + jittered 5×5×5 neighbourhood of feature points selected by `pcg3d` (never + the sin-based `hash`), with cells whose position-only lower bound already + exceeds the running F2 skipped before their hash is even computed. It + returns `CultCellular { nearest, edge, id }`: `nearest` is `(∇F1, F1)`, + `edge` is `(∇F2 - ∇F1, F2 - F1)`, and `id` is the nearest cell's `pcg4d` + hash (over the cell coordinate alone, never the `pcg3d` hash that produced + its jitter) mapped to `[0, 1)`. `∇F1` and `∇F2` are each undefined exactly + at their own feature point (`F1 = 0` or `F2 = 0`); `cellular` follows the + repo's existing degenerate-normal convention + (`GameCult.Geometry.CultGeometryIsoSurface.EmitOrientedTriangle`, which + guards a zero-length normal and returns the zero vector instead of the NaN + a bare `normalize` gives there) and returns the zero vector rather than NaN + for either. `F1 = 0` is ordinary (`p` sits on a feature point); `F2 = 0` + needs two distinct cells' `pcg3d`-jittered feature points to land on the + same float32 value in every component, which is unreachable at ordinary + magnitudes but confirmed reachable (see "Precision domain" below). The + identity of the nearest and second-nearest feature point changes + discontinuously across the `F1 = F2` set (a genuine kink, not a numerical + artifact), so `∇F1` and `∇F2` are only continuous away from that set. + + The 5×5×5 radius is exact, not merely safer than the classic 3×3×3 radius: + for a query at position `u` inside its own cell (`u` in `[0, 1)^3` per + component) and a candidate feature at integer cell offset `d` with jitter + `j` in `[0, 1)^3`, the per-axis displacement `(u_i - j_i) - d_i` is always + strictly greater in magnitude than `max(0, |d_i| - 1)`, because + `u_i - j_i` is always strictly inside `(-1, 1)`. So any cell with `|d_i| >= + 3` on some axis is strictly farther than 2 from the query. Two real, + always-present candidates bound `F1` and `F2`: the query's own cell, whose + distance is always strictly less than `sqrt(3)` (every axis strictly under + 1); and the near-side neighbour on whichever single axis has `u_i` closest + to a cell boundary. Let `m = min(u_i, 1 - u_i)` on that chosen axis, so + `m` is in `[0, 1/2]` by construction. Stepping one cell towards that + nearer boundary puts the query within `1 + m` of the far face on the + offset axis and within `1 - m` of the near face on each of the other two + axes, so that neighbour's squared distance is at most + `(1 + m)^2 + 2*(1 - m)^2 = 3 - 2m + 3m^2 <= 3` for every `m` in `[0, 1/2]` + (3 at `m = 0`, dipping to a minimum of `8/3 ~= 2.667` at `m = 1/3`, then + rising back to 2.75 at `m = 1/2`), and strictly below 3 because + the jitter never reaches exactly 0 or 1. `F2` is at most the larger of + these two real candidates (any two real candidates upper-bound the + 2nd-smallest value over the full infinite candidate set), so `F1 < + sqrt(3)` and `F2 < sqrt(3)` always, comfortably under the radius-2 + exclusion distance of 2, with margin `2 - sqrt(3) ~= 0.268` (Soul's + adversarial check, cut 2a-i: the worst realizable in-box `F2` is exactly + `sqrt(3)`, reached only in the unattainable limit at a cell corner). 3×3×3's + matching argument only reaches radius 1, whose excluded cells start at + distance 1, short of the `sqrt(3)` ceiling — the gap its measured failures + (9 of 400,000 points in `[-50, 50]^3`, worst error 0.088) live in. + + An earlier version of this proof picked the near-side neighbour on a fixed + axis instead of whichever axis sits closest to its own boundary, and that + version is wrong (Soul, cut 2a-i): `u = (0.5, 0, 0)` with the x-neighbour's + jittered feature at `(-1, 1 - 2^-24, 1 - 2^-24)` gives a distance of about + 2.06, outside the radius-2 exclusion the proof needs — `u.x = 0.5` is the + point on the cell farthest from any boundary, so `x` was the wrong axis to + fix there. Choosing the axis by proximity to its own boundary is what keeps + `m <= 1/2` and the bound at `sqrt(3)`. + + `CellularAndSminGradTests` pins both the prune's bit-identical equivalence + to an unpruned 5×5×5 reference and the search's exact agreement with an + independent 7×7×7 brute-force oracle. + + Precision domain: `cellular`'s exactness above is a statement about the + search radius, not about float32. Past `|p|` of roughly `2^23`, adjacent + integer cells stop being distinguishable from their neighbours at float32 + precision in some directions, and distinct cells' jittered features can + round onto the same value, making `F1 = F2` ties (and, per-component, + `F2 = 0`) increasingly common from about `1e6` and confirmed at `2^24` + (measured: 4096 of 4096 sampled integer points at `2^24` hit this before + the guard above). `cellular` stays finite there; it does not stay accurate + in the sense of matching the idealized real-valued Worley field. + + The lower-bound prune's bit-identity to the unpruned 5×5×5 search also has + a domain: it holds for `|p| < 2^25`. Above that, `cell + d` (an integer + cell coordinate plus a small integer offset) starts to round in float32, + so a pruned cell's own recomputed offset can land on a different neighbour + than the unpruned loop visits at that same nominal `(dx, dy, dz)`, and the + two search paths diverge (Soul, cut 2a-i: measured 180 of 1,100,000 points + differ at `|p| ~= 3.4e7`). This is a float32-precision limit on the prune's + equivalence proof, not a bug in the prune itself: below `2^25` the two + paths are proven bit-identical (`PrunedSearchIsBitIdenticalToTheUnprunedFiveCubedSearch`, + which samples `[-50, 50]^3`, is comfortably inside that domain). + +- `snoise(float3)` follows webgl-noise `src/noise3D.glsl` as of + stegu/webgl-noise `22434e04d7`: kernel radius squared `0.5`, output scale + `105`, permutation `mod289((34x+10)x)`. Upstream's `21d9fe23d7` (2020-10-14, + "an age-old bug that caused slight discontinuities along simplex + boundaries") moved the radius from `0.6` to `0.5`; at `0.6` a lattice vertex + outside the four summed corners can lie inside the kernel, leaving a value + jump at the cell boundary (3.1e-3 over the committed probe's 400 lines). `ff3b5d34ea` set the scale + to `105` and `a3e6d57095` (2021-06-30) the permutation; the 2D `snoise` shares + that permutation helper, so its values changed too, while its own kernel + (`0.5`) and scale (`130`) already matched upstream. + `NoiseGradTests.SnoiseAndItsGradientAreContinuousAcrossSimplexCellBoundaries` + pins the continuity. Ties in the offset `x0` resolve in Gustavson's + `simplexnoise1234` order (x over y, y over z, x over z), a total order, so the + four corners are always a simplex. Upstream's `step` compares are cyclic: where + the three components are equal, which is every input whose differences `y - x` + and `z - x` are whole numbers (every integer point, the origin and every + `(t, t, t)` among them), the corners repeat the origin vertex and the value + jumps by about 0.77 near the origin and up to 1.56 at magnitudes of 64 and + above. `SnoiseTieScopeTests` pins the set against the 0.3.0 values. `NoiseGradTests.SnoiseIsContinuousOnTheSimplexDiagonal` pins the order. +- `snoise_grad(float3 p)` carries `snoise(float3)` to value-and-gradient form, + following the differentiation in webgl-noise `src/noise3Dgrad.glsl` (Ashima + Arts / Ian McEwan, MIT), which uses the same radius, permutation and scale as + `snoise(float3)`: per corner, `m0 = max(0.5 - dot(x,x), 0)`, so + `d(m0^4 * dot(p,x))/dx = -8*m0^3*dot(p,x)*x + m0^4*p`, summed over the four + corners and scaled by the same constant as the value, so `.w` is exactly + `snoise(float3)`. `fbm_grad` and + `ridged_grad` are octave sums of `snoise_grad`: each octave samples at + `p * frequency`, so by the chain rule its gradient scales by that same + frequency, and both amplitude (`gain`) and frequency (`lacunarity`) compound + per octave rather than applying once to the whole sum. `ridged_grad` folds + each octave about zero (`Σ aᵢ(1 − |nᵢ|)`, gradient `−Σ aᵢfᵢ sign(nᵢ)∇nᵢ`, + Musgrave's ridged multifractal, *Texturing and Modeling* ch. 16); the crease + at `nᵢ = 0` is deliberate (the operator's dune term, 2026-09-25), not a bug. + Both clamp `octaves` to `[0, 16]`: `HlslSourceCompatibilityTests`'s bit-parity + oracle drives every mirrored `int` parameter across the full int32 range, + which is the right domain for `pcg3d`/`pcg4d`'s O(1) hash inputs but would + turn an unclamped octave count into a multi-billion-iteration loop for these + two mirrors. +- `phacelle(float3 p, float3 side, float offset, float normalization)` is Rune + Skovbo Johansen's Phacelle noise ("phase + cell": a stripe pattern built by + blending one cosine/sine wave per jittered cell), generalised to 3D cells. It + returns `CultPhasor { cosine, sine }`, each `(∇, value)`. `side` is the stripe + wave vector, whose length is 2π times the stripe frequency; in 3D the + perpendicular to the flow is not unique, so the caller chooses it (on a unit + sphere, `cross(p̂, flow)`). `offset` is the phase in cycles. It visits 4×4×4 + cells with `pcg3d`-hashed jitter in `[-0.5, 0.5)`, weights each wave by + `max(0, exp(-2d²) - 0.01111)`, and normalizes the blended phasor as upstream + does (length 1 where the raw length is at least `1 - normalization`, scaled + by `1 / (1 - normalization)` below). The gradient is exact, weight + derivatives and normalization included, rather than upstream's + `∇cos ≈ -sin·side`, which ignores the weight gradient. It is discontinuous + where the raw length crosses the normalization threshold and where a cell's + weight leaves its support (d² = 2.24995, distance 1.49998); the value is + continuous at both. At the support edge `∇w` jumps from `-4·0.01111·v` to 0, + a per-cell jump of length `0.0444·|v|` (0.0667 at `|v| = 1.5`); measured over + random points, the output gradient jumps by a median 1.5% of its length and + at most about 27%. `normalization` is meant to lie in `[0, 1]`: 1 or more + saturates (every output is stretched to length 1), a negative value scales + every output down by `1 / (1 - normalization)`, and the normalized gradient + scales as `1 / |I|` for the blended phasor `I`, so it grows where the blend + nearly cancels. The total weight `W` is positive for every `pcg3d` input (the + smallest found by hill-climbing is 0.056); `W = 0`, and a NaN output, needs + adversarial jitter no hash yields. + Cells whose per-axis lower bound `Σ max(0, |local - g| - 0.5)²` is at least + 2.25 lie outside the support and have weight exactly 0, so they are skipped, + which changes no output bit. Cells whose bound sits just under 2.25 can still + carry a nonzero weight, so the cut cannot be lowered; `PhacelleTests` pins + the cut with points next to such cells, against an internal overload with the + prune disabled, and the HLSL mirror test pins it on the shader side. The prune + keeps about 45 of the 64 cells on average (a saving of about 30%); about 14 + have a nonzero weight. The port sits in its own MPL-2.0 files + (`math.Phacelle.cs`, `CultPhasor.cs`, `CultMath.Phacelle.hlsl`); see + `THIRD-PARTY-NOTICES.md`. No 2D variant exists; nothing consumes one. + +Integer hashing uses the PCG hashes from Jarzynski and Olano, "Hash Functions +for GPU Rendering" (JCGT 9(3), 2020): `pcg(uint)` is O'Neill's RXS-M-XS 32/32 +permutation over one LCG step, and `pcg3d`/`pcg4d` are the paper's (3 → 3) and +(4 → 4) hashes. They use only uint multiply, add, xor, and shifts. dxc wraps +uint multiply and add modulo 2^32 exactly as C# unchecked arithmetic does, so +they are integer-exact in HLSL and on the CPU, GPU included, unlike the +`sin`-based `hash`. CultMath has no uint vectors, so `pcg3d(int3)` and +`pcg4d(int4)` carry uint bit patterns in int components. The `float2`/`float3`/`float4` +overloads hash the IEEE-754 bits (`asuint`), so -0 and 0 hash differently; they +exist for callers that already hold a hash key as float bits, and `pcg3d(float2)` +holds z at 0, which is the paper's route for (2 → N) inputs. Seeds and other +scalar uses take one output component. + +`cellular`'s jitter and id always hash the integer cell coordinate directly +(`pcg3d(int3(neighbor))`, `pcg4d(int4(int3(cellId), 0))`), never a cell +coordinate's float32 bit pattern. Hashing the bit pattern of an +integer-valued float is not the same permutation as hashing the integer: two +adjacent cells' bit patterns share more structure (both have the same +exponent and a mantissa that differs by one increment) than two adjacent +integers do going into `pcg3d`'s own mixing, and that residual structure +survived into the jitter. Hashing the integer cell coordinate directly is +exact and runtime-independent, and it is the HLSL mirror's own hash, so C# +and shader agree bit-for-bit. What pins this is the oracle and mirror tests, +not a uniformity measurement: reverting to hashing the float bits (or the +sin-based hash) is caught by `ProductionSearchMatchesTheBruteForceOracleExactly`, +`EveryMirrorFunctionMatchesCSharpMath`, `F1NeverExceedsF2`, and the other +tests that key off the integer-hash fixtures (cut 2a-i). `CellularAndSminGradTests` +(`JitterAndIdPassAChiSquareUniformityTest`) checks the uniformity of the hash +as `cellular` uses it: the jitter marginals and the id pass a chi-square test +at a stated significance against `pcg3d(int3(...))`. + Where HLSL is silent, CultMath keeps its own decisions and does not defer to -Unity.Mathematics: `normalize` is safe (divides by `max(length, 1e-20)`), -`hash` returns float, and `Random` is CultMath's own xorshift32. Engine-shaped +Unity.Mathematics: `hash` returns float, and `Random` is CultMath's own xorshift32. Engine-shaped helpers that HLSL lacks (`float2x2.Rotate`, `float3x3.Euler`, `quaternion`, `snoise`) enter only when a consumer needs them, with their semantics stated in code. @@ -114,6 +503,572 @@ Known C# friction: under `using static CultMath.math;` the constructor functions (`float3(...)`, `float3x3(...)`) hide the type names in member access, so static members need a qualified type (`CultMath.float3x3.Euler(...)`). +## Sites + +A site is `float4(position.xyz, weight)`; a 2D consumer uses z = 0. `math.Sites.cs` scores a query point +against a site two ways and keeps the two best: + +- `power_score(p, site)`: value `|p - s|^2 - w^2`, gradient `2 (p - s)`. A power cell is the intersection of the + half-spaces bounded by the radical planes against every other site, so `power_border` is exact. +- `multiplicative_score(p, site)`: value `|p - s| / w`, gradient `(p - s) / (|p - s| w)`, zero at `p = s` + (cellular's degenerate convention). Its borders are Apollonius circles, and the border distance is first order. + +A span function is a C# loop over a per-site step that has a shader twin, because the HLSL mirror cannot take a +span or a buffer. `site_cells_empty()` starts the fold, `site_cells_insert(cells, score, index)` folds one score +in (strict `<` against F1, the old F1 moving to second, else strict `<` against F2, so an exact tie keeps the +earlier index first), and `site_cells_border(cells)` reads `float4(unit normal, distance)`, with `n = grad F2 - +grad F1` pointing toward the nearest site and `(0, 0, 0, 1.0e30)` when there is no second site. That border is +the distance to the bisector of the two lowest scores, first order and for either metric; it is not the distance +to the nearest site's cell boundary (the F2 - F1 edge error: the second-lowest score is not the nearest plane in +general). The exact power cell border is a second pass: `power_border_step(p, owner, other, border)` takes the +running `float4(unit normal toward the owner, distance)` and the radical plane of `owner` against `other`, with +the distance built from the offset `owner - p` and the weight difference `(w1 - w2)(w1 + w2)` so it does not +cancel for close sites seen from far; the cell boundary distance is the least over every site except the owner +(the fold's nearest), and a site coincident with the owner has no plane. The step trusts the caller's owner: a +query outside the owner's cell reports distance 0 with that plane's normal, not an error. `power_border(p, sites)` is that loop; +the shader's `cultmath_power_border(p, sites, count)` is the same loop over a by-value array (see "Sites in a shader" below). +Cell spans refuse a non-finite query, site position or weight, and more than 2^24 sites (indices are floats). +`power_cells` and +`multiplicative_cells` are that loop over a `ReadOnlySpan` and nothing else; a shader caller writes the +same loop over its own array. Every site of an explicit span is visited, so no window and no weight-ratio range +apply. `CultSiteCells` holds the two score fields and the two site indices (floats, -1 for none). + +`gabriel_margin(a, b, other)` is `(|other - (a + b) / 2| - r) / r` with `r = |a - b| / 2`: zero on the diameter +circle, negative inside it, -1 when `a` and `b` coincide. `soft_gabriel_gate(sites, first, second, softness)` +is `smoothstep(-softness, softness, least margin over every other site)` on positions alone, 1 when no other site +exists; it is C# only. `distance_to_segment(point, start, end)` has out-free 2D and 3D forms beside the `out` +form, all over one public `segment_closest` per dimension, each with its 2D and 3D shader overload. + +## Weighted lattice cells + +`weighted_lattice_cells(p, time, bodies, cellSize, drift, boost, falloff, smoothing, stretchNormal, stretch)` in +`math.Lattice.cs` returns `float4(F1, F2, smooth, id)` over a jittered, drifting lattice, in cell units times weight. +Four public steps compose it, and a shader or a tape composes the same four: + +- `lattice_site(cell, time, drift)`: the site `cell + 0.5 + 0.5 sin(drift time + 2 pi u)` per axis (so it stays within + one cell of the corner) and the base weight `0.5 + 0.5 u`, in [0.5, 1), from its own hash lane. +- `lattice_weight(base, border, boost, falloff)`: `base (1 + boost exp(-(border / falloff)^2))`. `border` is + `power_border` at the cell centre over the body span (exact, so the weight is continuous as bodies move; the first + order `site_cells_border` jumps where the second-nearest body changes and is not used). +- `lattice_distance(q, site, weight, normal, stretch)`: `weight |(stretch a, c)|`, `a` and `c` the offset along and + across the unit normal; isotropic at stretch 1. +- `lattice_smooth_step(m, d, f1, smoothing)`: the smooth minimum fold, started at `F1 + smoothing` and clamped to it, + so a cell with `d >= F1 + 2 smoothing` changes nothing and the result does not depend on the box visited. + +The search visits Chebyshev rings around the query's cell and stops before ring `k` once `0.5 (k - 1) >= max(F2, +F1 + 2 smoothing)`: every cell on ring `k` has `d >= 0.5 (k - 1)` (site within one cell of its corner, weight at +least 0.5, stretch at least 1). A second pass folds the visited box in absolute row-major order, so ties and the +smooth minimum do not depend on how far the search went. The proof is the comment above `weighted_lattice_cells`. + +The accepted range is boost 0 to `LatticeMaxBoost` (4, a weight ratio of 10:1), stretch 1 to `LatticeMaxStretch` (2) +and smoothing up to `LatticeMaxSmoothing` (1); outside it the function throws `ArgumentException`. `LatticeMaxRing` +(37) is the proven greatest ring at the range edge. Measured over 24,000 points on orbiting bodies (six bodies, +sigma ratio 6:1, the ruled look and the range edge), the greatest ring visited has median 3, 99th percentile 7 and +maximum 8 (49, 225 and 289 cells); `RingsStayWellInsideTheCap` asserts these. + +### Sites in a shader + +A shader function cannot take a span, so `cultmath_power_border(p, sites, count)`, `cultmath_lattice_cell_distance(...)` +and `cultmath_weighted_lattice_cells(p, time, bodies, count, ...)` take `float4 sites[CULTMATH_MAX_SITES]` by value and the +count in use, with `count` in `[0, CULTMATH_MAX_SITES]`. `CULTMATH_MAX_SITES` is 128 unless the consumer defines it before +including the library (`#ifndef`): 128 covers every Aetheria zone within GLSL ES 3.00's 224 guaranteed fragment uniform +vectors, and loops run to `count`, so the capacity costs uniform space, not iterations. A caller whose sites live in a +buffer copies them into a local array first; the library takes no resource, accessor macro or uniform of its own. The preconditions the C# +functions throw for are the caller's in a shader (finite arguments, `cellSize > 0`, the stated ranges, `p` within 2^23 +cells). The ring pass is bounded `k <= 37` and exits as C# does; the box pass recomputes each distance instead of caching +75 x 75 of them, which gives the same values. The C# mirror compiles the array as `T[]`, and +`HlslSourceCompatibilityTests.SiteArrayMirrorsMatchCSharp` compares the three functions through the span twins in +`SiteArrays` (reflection cannot pass a `ReadOnlySpan`); `CULTMATH_MAX_SITES` is a shader-only capacity with no C# twin. + +## Intervals + +`math.Interval.cs` and `shaders/CultMath.Interval.hlsl` (included from +`CultMath.hlsl` after the Phacelle include) carry interval arithmetic for +culling empty space with a proof. Their invariant, **intervals-enclose**: every +interval function returns a `[lo, hi]` that contains `f(x)` for every `x` in +its input region, where `f(x)` is the same function evaluated pointwise in +float32. A consumer that skips a region because `hi < cutoff` has skipped +nothing that was there. + +Representation: an interval is `float2(lo, hi)` with `lo <= hi`, both finite. +There is no empty interval; a caller that needs "provably empty" tests +`hi < cutoff`. `iv_point(x)` is `float2(x, x)`. + +Ops: `iv_point`, `iv_add`, `iv_sub`, `iv_neg`, `iv_mul` (the least and greatest +of the four corner products), `iv_scale(iv, float)`, `iv_abs` and `iv_sqr` +(an interval straddling zero starts at 0), `iv_min`, `iv_max`, `iv_sqrt` +(`lo` clamped at 0), `iv_exp`, `iv_clamp(iv, float, float)`, `iv_saturate`, +`iv_smoothstep(float, float, iv)` (its ordered endpoints) and +`iv_lerp(iv, iv, float)`. No others until a consumer names one. Each has an +HLSL mirror named `cultmath_iv_*`, compared bit for bit by +`HlslSourceCompatibilityTests`. + +The ulp-widening rule. Each bound is computed with the pointwise function's +own float32 operations. IEEE round-to-nearest is monotone, so an op that is +monotone on its region encloses its float32 evaluation exactly, with no +widening; that covers every op above except two, which widen by exactly one +ulp, in the implementation and never in the test: + +- `iv_exp`: `exp` is not required to be correctly rounded, so a libm need not + be monotone. .NET's `MathF.Exp` on Linux steps down 0 times over every float + in [-87, 88.7] (`IntervalTests.MeasureMonotonicity`), so on that CPU the + widening is a margin; it is there for other libms and GPUs. +- `iv_smoothstep`: `t * t * (3 - 2t)` in float32 steps down 337,095 times over + the floats in [0, 1], each time by at most 1 ulp (`MeasureMonotonicity`). + Since `t = saturate((x - minimum) / (maximum - minimum))` is itself monotone + in `x`, that covers every `smoothstep`. + +`iv_lerp` is the natural interval extension of `x + (y - x) * amount`, which is +how `lerp` evaluates; every step is monotone, so it encloses with no widening +for any `amount`, and it is tight only when `a` is a point, because `x` appears +twice. + +`IntervalTests` runs every op over 10,000 seeded intervals (centres in +[-20, 20], widths log-uniform in [1e-4, 10], every eighth a point) and 16 +points inside each, endpoints and zero included, with no tolerance; and for +every op it raises `lo` and lowers `hi` by one ulp and requires the harness to +catch each. A new op is one entry in that table. + +Noise bounds. `iv_snoise_ball(c, r)` is `[n - L r, n + L r]` intersected with +`[-1, 1]`, where `n = snoise(c)` and `L = SNOISE_LIPSCHITZ`: one `snoise`, value +only. No interval function reads `snoise_grad`, and none has a value-only or +gradient twin. `iv_fbm_ball(c, r, octaves, lacunarity, gain)` is the octave sum +of `iv_snoise_ball(c * f_i, r * |f_i|)` scaled by `a_i`, compounding frequency +and amplitude exactly as `fbm_grad` does, octaves clamped to [0, 16]. A domain +warp that moves a point by at most `D` is enclosed by the radius `r + D` +(`NoiseBoundTests.WarpedPointsStayEnclosed`); this is what the gamecult.org +ground's march rests on. + +`iv_frustum_ball(m_c, z0, z1, footprintPerDepth, warp)` is the ball one probe +serves a whole screen tile with. In a pinhole camera frame looking down `+z`, +where the ray of slope `m` is the points `(m z, z)`, it encloses every point of +every ray whose slope lies within `footprintPerDepth` of `m_c` (`N / (sqrt(2) f)` +for an `N x N` tile at focal length `f` pixels: the full pixel footprint, so +sub-pixel jitter is covered), over depths `[z0, z1]`, each point moved by a warp +of length at most `warp`. The centre is `(m_c z_m, z_m)`, `z_m` the mid-depth; +the radius is `((z1 - z0) / 2) |(m_c, 1)| + z1 footprintPerDepth + warp`. A point +of slope `m_c + e` at depth `z` is the centre plus `(z - z_m)(m_c, 1)` plus +`z (e, 0)`. The returned ball is float32, and on a degenerate (`z0 == z1`), +thin or far segment the rounding of the centre alone exceeds the gap the +triangle inequality leaves, so the radius is widened by +`(|c|_1 + radius) 2^-20`. With `u = 2^-24`, each centre component carries at most +two roundings (`z_m`, then the product), so the float centre is within +`2u |c|_1` of the exact one; the radius carries at most seven (`z1 - z0`, the +axis length at `3u`, the product, `z1 footprintPerDepth`, the sum, `+ warp`), so +the exact radius is at most `(1 + 7u)` times the float one; the widening rounds +once more. `2^-20 = 16u` covers `8u (|c|_1 + radius)` twice over, and fma +contraction only removes roundings. The axis count assumes a correctly rounded +`sqrt`, which IEEE gives C#. GLSL ES 3.00 does not: it inherits `sqrt`'s +precision from `inversesqrt`, and D3D-backed compilers may reassociate. So the +bound is proven for C# and HLSL on IEEE hardware, and on GLSL it is measured: +on a GTX 1070 under ANGLE's D3D11 backend the fixture's 256 cases keep a +minimum relative slack of `1.98e-6` (about `33u`), the same as C#'s. The +fixture's enclosure check is what measures it on each device. The caller rotates and translates the centre into world space and scales +centre and radius by its noise frequency; the rounding of that transform is the +caller's. `NoiseBoundTests.TileBallEnclosesEveryRaySegment` checks 2,000 seeded +tiles x 64 points of the r2 domain and 2,000 tiles x 8 corner points of each of +seven extreme families (`z0 == z1`, `z1 - z0 = 1e-6 z1`, `|m_c|` to 1000, `z` to +`1e7`, `z0 = 0` with `z1` to `1e-3`, `f` down to 1, warp to `1e6`), corner flows +full-length and outward, distances in double, with no tolerance. It pins the ball +to the derivation both ways (`r <= ball.w <= r + 2^-19 (r + |c|_1)`), so a ball +that forgets the widening fails and one grown past it fails too. A moving camera needs nothing +more: each frame's probes use that frame's camera, and no ball, mask or probe +result is carried from one frame to the next. + +The noise ball alone proves little: at `L` near 10 it bounds `snoise` to a width +of `2 L r`, which covers all of `[-1, 1]` once `L r` reaches 1. Empty space +becomes provable through an analytic envelope. The consumer's density is a +pre-distortion SDF (a height fog, a well map, a carved sphere) that noise +displaces only near its surface, and the consumer composes the bound from `iv_*` +ops. The envelope is taken over the slice's exact box (`iv_mul` of the depth +range by each slope range, then the SDF's own monotone pieces), together with its +fade. The noise is `iv_snoise_ball` over `iv_frustum_ball`, scaled by the noise +frequency. The warp moves only the noise argument, so it enlarges the ball and +the envelope's box takes none of it. Where the fade's upper end is 0 the noise +term is identically 0 and no `snoise` is evaluated. Where the envelope already +proves the slice empty with the noise at its full range, the ball is not +evaluated either. A probe is worth attempting only when the best result any +centre value could give would prove the slice, and a ball with `L r >= 2` is +`[-1, 1]` whatever `snoise(c)` is, so it costs nothing. CultMath owns none of the +envelope: the interval files have no envelope function, and each consumer composes +its own. `NoiseBoundTests.EnvelopeBoundEnclosesDensity` checks that composition, +the one the site and Aetheria use, over 2,000 seeded slices x 64 warped points +with no tolerance. + +`L` has provenance, not a proof. `NoiseBoundTests.MeasureLipschitz` (slow, +explicit) takes the largest `|snoise_grad|` over 1e6 seeded points in +[-256, 256]^3 (7.1933103), refines the 1e4 largest by gradient ascent +(7.2400064), and multiplies by 1.10: `L = 7.9640074`. It also reaches +`|snoise| = 0.9718335` by the same ascent on the value, which is what lets the +bound intersect with `[-1, 1]`. `LipschitzConstantPinsSampledGradients` +checks 1e5 more seeded points against `L` and climbs again from the start +`MeasureLipschitz` prints as its witness, failing if `L` is not 1.10 times that +maximum to within half a percent, so a 1% move of `L` fails. The enclosure tests +over 2,000 balls x 64 points are the defence. A change to the `snoise` kernel +must re-run `MeasureLipschitz` and re-pin `L` and the witness. + +What the ball bounds guarantee: enclosure of `snoise` and `fbm_grad(...).w` over +the ball, in float32. What they do not: anything about tapes, pruning or choice tracking. Correlation +between the operands of one expression is what "Affine forms" below adds. +How loose the ball bounds are is a number: +`NoiseBoundTests.TightnessReport` prints the mean interval width over the +sampled range: 5.08 for `iv_snoise_ball` at `r = 0.05`, 1.96 at 0.25 and 1.28 +at 1.0; 6.64 and 2.82 for 4-octave `iv_fbm_ball` at 0.05 and 0.25. + +The saving is measured where there is empty space to find. +`NoiseBoundTests.IntervalSkipHalvesEvaluations` draws screen tiles, each with +its own camera, and runs one pre-pass per tile over the dense grid's cell ranges: +it starts with the whole grid, skips and doubles a range it proves empty, halves +one it cannot, and runs to the grid's end. It then draws the tile's `N^2` ray +slopes, one per pixel, jittered inside it. Each ray is marched three times with +the same integrator and the same early-out at transmittance 0.02: over every +cell (dense), over the tile's unproven cells (the tile march), and over the +oracle mask, the cells whose mid-depth density is nonzero for at least one of +the tile's rays. The tile march and the oracle march integrate the dense march's +nonzero cells, so their transmittance agrees with it exactly in every +configuration. The oracle is a ceiling the pre-pass cannot move: dense cost over +oracle cost. Against it the test prints the efficiency (oracle cost over the +tile march's cost with its probes) and the cull fraction (the oracle-empty cells +the pre-pass proves empty). The probe overhead is the tile march's cost over that +cost plus the probes'. Cost is counted in `snoise` evaluations, with an envelope +evaluation or probe weighted 0.2. That weight is an estimate, and both counts are +printed. The flow is not counted. At `N = 8`, in Aetheria's units on its +256-cell quadratic grid out to the Main Camera's far plane, 2048: + +- (a) Height fog, camera above the safety band, rays level and up: the whole + grid is one envelope probe per tile, against 256 envelope evaluations per ray, + 16384x. Every cell is oracle-empty and the pre-pass proves them all. +- (b) Inside the fog: 1.16x, and 1.11x with the warp. Most cells are fog, and + the pre-pass probes each one. +- (c) The deep well (ruling `wells-scale-order-of-magnitude`): the zone bowl + plus one well at its centre, `PowerPulse` exponent 2, scale 2220, depth 600. + The band `G = 60` is where only the noise decides density (`s` within + `F -+ 1.5 A` with the fade at 1); depth and half-depth radius are each + `10 G`. The camera's `xz` is uniform within 300 of the centre, at + `y = F - h(xz) / 2`, so it looks across the bowl from inside it. Both rows run + on the same seeds. With no warp, the centred interval takes 3.20x (oracle + ceiling 5.24x, efficiency 0.611, cull fraction 0.988, probe overhead 0.940) + and the affine bound 3.57x (efficiency 0.682, cull 0.993, overhead 0.905). With + the warp `D = 60`: 3.12x (ceiling 5.31x, efficiency 0.588, cull 0.987, overhead + 0.929) against 3.46x (efficiency 0.651, cull 0.993, overhead 0.880), so affine + is 1.12x and 1.11x cheaper. The range mask (the oracle cells plus every cell + where any of 5 x 5 slopes x 9 depths has density above zero) gives a range + ceiling of 0.859 (0.848 with the warp), the cost a bound that proves exactly + the range-empty cells would reach against the oracle's; the efficiencies + against it are 0.794 and 0.712 (warp 0), 0.768 and 0.694 (warp `D`). +- (c-band) The shallow wells, four mass-derived wells in the zone bowl with + the camera gazing across, whose geometry is band-dominated, printed only. + Centred interval 3.01x (efficiency 0.414, cull 0.960, overhead 0.958), affine + 3.95x (0.544, 0.980, 0.901); with the warp 2.75x (0.383, 0.954, 0.944) against + 3.54x (0.494, 0.976, 0.865). +- (d) r1's uniform slab, which has no envelope: 1.38x with the warp 0.05, and + 1.67x with no warp. +- (e) The void at the shipped point (ruling `operator-shipped-void`): `Rh = 198`, + `S = 50`, `Rc = Rh + S = 248`, `e = -ln 1.5 / ln(1 - (Rh / Rc)^2)`, the + shipped camera, 200 tiles. The fixed-step reference takes 36.34 steps per + pixel. The same cells masked by the pre-pass take 20.08, with identical + transmittance. The footprint-aware march takes 13.50: 2.69x fewer. `snoise` + per pixel goes from 32.98 to 26.70, and combined cost from 40.25 to 29.54 with + the probes, 1.36x. Every one of the 200 tiles proves a body. Before the body + both marches are measured against a converged one (midpoint quadrature at + `h = 0.5` over every cell, trusting no pre-pass): the relative optical-depth + error at the body start is at most 0.0608 for the fixed-step march and 0.08639 + for the footprint march, 1.42x. Over the grid of hollow radius, camera offset + and ramp width the steps ratio runs from 1.59x (`Rh = 100`, low, `S = 150`) to + 27.45x (`Rh = 1000`, centred, `S = 10`), the cost ratio from 1.26x to 3.89x, + and the depth-error ratio from 0.85 to 4.72 (`Rh = 200`, centred, `S = 150`, + where the errors are 0.01504 and 0.003188). LOD-far takes 14.19x fewer steps; + its depth errors, 0.2849 and 0.205, are not comparable, because its + fixed-step reference keeps the octaves the footprint march truncates. + +The analytic body (ruling `operator-analytic-wall-body`). When a single dense +cell's own bound is a positive point, the pre-pass spends one more probe over +the rest of the grid. If that bound is a positive point too, every point of +every ray of the tile from there on has exactly that density, so the footprint +march takes one closed-form step, `exp(-BodyDepth)`, from the body start to the +grid's end and stops. `BodyDepth` is density x extinction x length x `|dir|`. +`NoiseBoundTests.AnalyticBodyMatchesFineMarch` pins it: the bound, the mask and +the pointwise densities agree exactly at the body, and `BodyDepth` equals the +summed fixed-step depth of the body cells within 1e-4 relative. The comparison +is in the depth domain, so LOD-far's deep bodies do not underflow. + +The footprint-truncated void weights its octaves by `w_i(z)`, decreasing in `z`. +Its bound takes each weight over `[w_i(z1), 1]` rather than +`[w_i(z1), w_i(z0)]`, because one bound serves both the full field (`w = 1`) and +the truncated one. `[w_i(z1), 1]` contains both, and `iv_mul` is monotone in its +interval argument, so the composed interval encloses both fields. +`NoiseBoundTests.WeightBoundEnclosesOneSignedNoise` checks it on LOD-far over +2,000 segments: each weight lies in its bound, and `w(z) n` lies in +`iv_mul(bound, n)` for a one-signed `n`. A lower end of `w(z0)` fails it. + +The contracts, at `N = 8`, the lower of warp 0 and `D`: + +- (a) at least 2x combined cost; +- (c) on the deep well (rulings `affine-wells-contract-cheaper-than-interval` + and `wells-overhead-plus-floor`): the affine bound's combined cost ratio is + above the centred interval's at warp 0 and at warp `D`; and, hard, the + pre-pass proves at least half of the oracle-empty cells empty under both + bounds, so a pre-pass that skips nothing fails. The probe overhead, the + efficiencies against the oracle and the range ceiling, the ceilings and the + cull fraction are printed, not asserted; (c-band) is printed only; +- (e) at the shipped void: the masked fixed-step march agrees with the reference + exactly; the footprint march's optical depth at the body start is off the + converged march's by at most twice the fixed-step march's error; and it takes + at most half the reference's steps per pixel. + +This run meets every contract: (a) 16384x, (c) affine 3.57x and 3.46x against +the centred interval's 3.20x and 3.12x, with a cull fraction of 0.987 at the +lowest, (e) 2.69x fewer steps and a depth error 1.42x the fixed-step march's. +The fields, the grids, the 0.2 envelope weight and the 2.0 gradient weight are +not tuned toward the contracts. An affine probe is one `snoise_grad`, counted at +2.0 `snoise` evaluations (an estimate, printed beside the count). + +Consumers: the gamecult.org ground shader (through the GLSL lowering) and +Aetheria's nebula raymarch at its CultMath pin bump. + +## Affine forms + +`math.Affine.cs` carries reduced affine forms with one shared symbol: a +`float3(x0, a, e)` is the set `x0 + a eps + e delta` with `eps` and `delta` in +`[-1, 1]` and `e >= 0` (Messine's AF1, as Gamito and Maddock use it for gradient +noise, in one register as an interval is a `float2`). `eps` is shared by every +form over one region (for a screen-tile slice, the depth parameter, `z = z_m + +h eps`), so `af_sub(x, x)` has `a = 0`; `delta` is private to the form, and +every term that cannot be tracked is condensed into `e`. A slice is a +`float4(centre, radius)` with a `float3` axis. No op takes a compound type, a +reference parameter or a swizzle write, so each mirrors into the HLSL common +subset. + +The ops: `af_point`, `af_symbol`, `af_from_iv`, `af_range` (the bridge back to +`iv_*`), `af_add`, `af_sub`, `af_neg`, `af_scale`, `af_add_iv`, `af_mul` (the +product `|a_x a_y|` and the cross-error terms condensed into `e`, so there is +no `af_sqr`), `af_snoise` and `af_fbm`, and the slice pair `af_frustum_axis` and +`af_frustum_ball`. + +Rounding. Every op returns a form whose set at each `eps` contains the float32 +value of its function at every point of its operands' sets at that `eps`. Each +op folds its own float32 rounding into `e` as `S 2^-20`, `S` the sum of the +magnitudes its roundings are relative to (named in the op's comment): at most +`8u S` is needed with `u = 2^-24`, and the factor of two over that is the +allowance for a device whose `+` and `*` are faithful rather than correctly +rounded. `AffineTests.EveryOpEnclosesItsPoints` evaluates the form's set in +double and the function in float32 with no tolerance. Products and `af_from_iv` also +add `2^-126`, the most an underflow to a subnormal can lose (`TinyOperandsEncloseTheirPoints`). +`af_from_iv` halves its endpoints before it sums and differences them, and `af_range` +scales its terms before it sums them, so endpoints near the float maximum do not overflow +in the middle of the op; a form that overflows anyway gives `af_range` infinite endpoints, +never NaN (`FromIntervalAndRangeHoldAtTheExtremes`). `af_range` finds a NaN endpoint by its bit pattern, because +`lo == lo` is a compare dxc marks `fast` and deletes under its default flags. `AbsorptionsArePinned` and +`SnoiseFormCarriesItsDocumentedWidth` pin each absorption and `af_snoise`'s float32 allowance both +ways: the enclosure tests alone cannot see them on a CPU, where float32 is exact. + +`af_snoise(centre, axis, radius)` encloses `snoise` over `centre + axis eps + w`, +`|w| <= radius`, from one `snoise_grad`. It returns the narrower of the +Lipschitz form `(n, 0, L R)` and the centred form `(n, g . axis, |g| radius + +M R^2 / 2)` (`R = |axis| + radius`, `L = SNOISE_LIPSCHITZ`, `M = +SNOISE_HESSIAN`), so its total width is never more than the Lipschitz form's. +The centred form is Taylor's theorem, which is why it beats the ball when the +radius is small and the axis carries the variation. `af_fbm` compounds octaves +as `iv_fbm_ball` does. The float32 evaluation allowance is derived in +`af_snoise`'s comment. + +`SNOISE_HESSIAN = 55.642143` is 1.10 times the refined maximum of the spectral +norm of the Hessian of `snoise(float3)`, measured by +`NoiseBoundTests.MeasureHessian` over 1e6 seeded points (the analytic +`snoise_hessian`, below) and refined by ascent from the 1e4 largest: refined +maximum 50.5838. The central differences of `snoise_grad` that an earlier pin +used read 50.955 at h = 1e-3, their roundoff. +`HessianConstantPinsSampledCurvature` fails on a 1% move. +`snoise_hessian(float3)` (`math.Span.cs`) is the analytic Hessian of `snoise`: a +symmetric `float3x3` on the same lattice, hash and tie order as `snoise_grad`, +differentiating each corner's gradient `-8 m^3 s x + m^4 p` once more. Each +off-diagonal entry is computed once and placed twice, so the matrix equals its +transpose bit for bit, and a clamped corner (`m = 0`) contributes nothing. Built +from nine scalars, the matrix reads as columns in GLSL (`mat3`) and rows in HLSL, +which is the same matrix because it is symmetric. `SNOISE_THIRD = 535.8009` +(`math.Span.cs`) is the next order: 1.10 times the maximum, over 1e6 seeded points, +of the operator norm of the third-derivative tensor of `snoise`, refined from the +1e4 largest; measured 487.0917 on the tied kernel. The tensor is closed form, in +double: `snoise_hessian`'s per-corner entry differentiated once more, on the +kernel's lattice, tie order and hash, and the test +`ThirdTensorMatchesDifferencesOfTheHessian` holds it against Richardson-extrapolated +differences of the double Hessian. The operator norm is a local ascent over unit +vectors (a dense sweep of 20,000 directions at the witness finds 99.9987% of it) and +the outer maximum a sampled search refined by ascent, so the constant is empirical +with a 10% margin, not a proof; an earlier pin from central differences of the +float Hessian read 488.1047, its roundoff. +`MeasureThird` takes the measurement and `ThirdConstantPinsSampled` pins it. +`integral_clamp_linear(a, b, lo, hi, t0, t1)` is the closed-form integral over +`[t0, t1]` of `clamp(a + b t, lo, hi)`. All three have HLSL and GLSL lowerings and +`glsl-parity.json` fixture families (`snoise_hessian`, `integral_clamp_linear`; the +`af_snoise` and `af_fbm` families are regenerated for the re-pin). +`SNOISE2_LIPSCHITZ = 8.117002` is the same for the gradient of `snoise(float2)` +(`MeasureLipschitz2`: sampled 7.2575, refined 7.3791, witness (-67.12454, +-129.53296), `|snoise2|` at most 0.99964), and it backs `iv_snoise_ball(float2, +float)`. Both are empirical with a margin, not proofs. A random ball cannot see a +curvature constant 20% low, so `SNOISE_HESSIAN` is defended by +`HessianConstantPinsSampledCurvature` and `SnoiseFormEnclosesTheCurvatureWitness` +(`af_snoise` at the point where the curvature is realised, along 4,000 directions: a +constant of 40 misses there). The margin over the function itself: a scan of the whole +289^3 hash period found a realised maximum of 50.58, and bounding each corner's gradient +independently over every hash configuration gives 52.22, so 55.64 sits 7% above the +configuration bound. A change to the kernels must re-run the measurements. + +### Span stages + +`span_fbm` and `span_ridged` (`math.Span.cs`; `cultmath_span_fbm` and `cultmath_span_ridged` in HLSL over +the same struct types, `cultmath_span_stage` behind both, and GLSL derived) are the octave stages +of a warp chain, `span_fbm(path, stage, octaves, lacunarity, gain)`, each returning +one `SpanNoise { float4 field; float curvature; float fold; }`. The inputs are two +structs with named public fields and no positional constructor, so the three floats +of the span and the six fields of the transform cannot be swapped silently. +`SpanPath { midpoint, velocity, speed, acceleration, halfLength }` is the path +`q(t)`, `|t| <= halfLength`, through `midpoint` with `velocity` at `t = 0`, +`|q'| <= speed` and `|q''| <= acceleration` along it. `SpanStage { frequency, +stretch, axis, shift, offset, octaveStep }` makes octave `o` sample `snoise_grad` +at `x_o(q) = f_o (M q + shift) + offset + o octaveStep`, with `f_o = +lacunarity^o`, amplitude `gain^o`, and `M = frequency (I + (1/stretch - 1) a a^T)`, +`a = normalize(axis)`; a zero axis or `stretch` 1 means no stretch, and `stretch` +must be positive and finite (unguarded, like `lacunarity`). `default(SpanStage)` +has frequency 0; `SpanStage.Identity` is the stage whose field equals `fbm_grad` +and `ridged_grad` bit for bit. `octaves`, `lacunarity` and `gain` stay positional: +they are `fbm_grad`'s own trailing triple, and `octaves` is the one int among the +scalars. `field` is the octave sum and its gradient in `q` (`f_o M grad n_o`). +`span_ridged` sums `gain^o (1 - |n_o|)`, `ridged_grad`'s convention. The Span +Lab's stage is `1 - 2|n|` per octave: with `G` the sum of `gain^o` over the +octaves (signed, so the alternating sum for a negative gain), its value is `2 value +- G`, and its gradient, curvature and fold are twice `span_ridged`'s. + +The shaders have no `SpanStage.Identity`: a shader caller builds every stage field itself (in GLSL, +`SpanStage(1.0, 1.0, vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0))` is the identity). A constant would +need a second transformation rule (C# has no const structs, GLSL wants a constructor) and a mirror +exemption, for one value; the mirror test proves instead that the shader text at a C#-built identity +returns `cultmath_fbm_grad` and `cultmath_ridged_grad`'s field bit for bit. + +Bounds come from the three pins only. With `|M| = |frequency| max(1, 1/stretch)` and +`nu = f_o |M| speed` the noise-space speed, the Hessian of the noise on the span has +operator norm at most `Hl = min(SNOISE_HESSIAN, ||snoise_hessian(x_mid)||_F + e_h + +SNOISE_THIRD nu halfLength)`, so `curvature = sum gain^o f_o^2 |M|^2 Hl` bounds the +operator norm of the field's Hessian in `q` at every point of the span (the pin takes +over once the third-derivative term exceeds it, and at `halfLength` 0 the local tier +alone remains). For `span_ridged`, an octave leaves the branch it is on at the +midpoint (`1 - s n`, `s` the midpoint's sign of `n`) only where `n` changes sign, and +there `|n| <= V - |n_mid|`, with `V = (|grad n_mid . w| + e_g |w|) halfLength + (Hl nu |w| ++ Gl f_o |M| acceleration) halfLength^2 / 2 + 2 e_n`, `w = f_o M velocity` and `Gl = +min(SNOISE_LIPSCHITZ, |grad n_mid| + e_g + Hl nu halfLength)`; `fold = sum 2 gain^o +max(V - |n_mid|, 0)`, exactly 0 for `span_fbm` and for an octave that cannot reach zero. + +The float32 `snoise`, `snoise_grad` and `snoise_hessian` are not the exact functions, so +the quantities read at the midpoint carry allowances, by the derivation of `af_snoise`'s +comment. `S_o = |f_o| (|M q|_1 + |shift|_1) + |offset|_1 + |o octaveStep|_1 + sqrt(3) nu +halfLength` is the sum of the magnitudes the octave coordinate's roundings are relative +to, and `e_n = 2^-14 + L 2^-20 S_o` (value), `e_g = 2^-12 + H 2^-20 S_o` (gradient +length) and `e_h = 2^-10 + T 2^-20 S_o` (Frobenius norm of the Hessian), with `L`, `H`, +`T` the three pins; they add no pin. Measured against a double kernel with the float +hash (6000 points per band, `|x|` from 2^-2 to 2^23), two samples observed the error's +maxima as fractions of `e_n`, `e_g` and `e_h`: 0.057, 0.046 and 0.075 in the cut's own +sample (seed not recorded; the 0.075 is against `T 2^-20 |x|_1` alone, at the smallest +band, where the absolute Hessian error is 2.3e-5 and the absolute term carries it), and +0.064, 0.0485 and 0.057 in an audit's (seed 0x501). They are samples, not bounds: a new +seed moves them. They say the allowances enclose the error with a margin of about 15. +Errors grow linearly in `|x|`: the value's is 2e-4 at 2^8, 1.5e-2 at 2^14 and 0.94 at 2^20. +Rounding in the Frobenius-to-operator-norm step needs no allowance: the Frobenius norm +exceeds the operator norm. + +Domain. No coordinate range is checked, clamped or refused. The allowances grow with +`S_o`, so `curvature` saturates at `SNOISE_HESSIAN` (true everywhere) by `S_o` of about +1.1e5, and `fold` turns positive for every octave whose `V + 2 e_n` reaches `|n_mid|`: +the bounds stay sound at every magnitude and stop being informative where float32 noise +is (see "Precision domain" above). `SpanStageTests` encloses the exact (double) Hessian +norm and both the float and the exact branch departure at 64 points of seeded spans in +bands of `S_o` from under 1e2 to over 1e6, and in a fixed span where the local tier +with its third-derivative term halved fails. + +The slice. `af_frustum_ball(centreSlope, z0, z1, footprintPerDepth, +warpVariation)` returns the centre `(m_c z_m, z_m)` and a radius `z1 +footprintPerDepth + warpVariation`, with `af_frustum_axis` the axis `(m_c, 1) h`: +every ray point at depth `z` is `centre + axis eps(z) + w`. Its derivation +and the clamp residual are in the comment. The caller rotates, translates and +scales the slice into the noise's frame, and owns the rounding of that. + +The centred warp. A flow-warped sample reads `snoise` at `p + flow(p) shift`. The +caller does not enlarge the ball by the whole displacement `|flow| shift`; it +moves the centre by the flow at the centre, `c + flow(c) shift`, and widens the +radius by the flow's variation across the ball, `r + |shift| rho` with `rho = +FlowAmplitude (SNOISE2_LIPSCHITZ FlowFrequency r + a) sqrt 2` (the clamp to the unit +disc is nonexpansive), where `a = 2^-14 + L2 2^-20 (|q|_1 + r FlowFrequency)` is the +float32 allowance of the flow's two `snoise(float2)` reads (the point `q` plus its offset rounds at the +magnitude of `q`, and a float32 flow at two points of a ball differs by more than the exact +function can). CultMath owns neither the flow nor the envelope: the warp's +centre and variation are the caller's, and a consumer adds them to the slice's +`warpVariation` or to the form's radius. With two phases that cross-fade, each +phase takes its own centre; one ball serves when the phases' centres coincide +(warp 0). `NoiseBoundTests.CentredWarpStaysEnclosed` checks 2,000 balls, radius 1e-3 to +500, and fails when `rho` is dropped or halved; `AffineWarpStaysEnclosed` checks +3,000 tile slices of `FogField.Slice`, which returns the final `af_snoise` arguments +(each phase's moved centre and grown radius, the detail's unwarped set, the shared axis), +so the affine bound wires nothing itself: the reach over which the flow is varied is +`|axis| + radius`, each phase carries its own growth, and the gate reads each argument's +reach. It fails when the reach is the ball's radius or the larger of the two, a phase's +growth is dropped or taken from the other phase, the axis or the detail radius is scaled, +or `rho` is halved. `AffineCompositionTightensItsRanges` sees the shared-symbol +composition itself: the bound is exactly the intersection of the affine arithmetic's piece +and the interval composition over the forms' ranges, and the affine piece is the narrower +of the two in at least 35% of the open slices (the piece alone is wider in total). + +The deep well is the representative Aetheria case: the camera inside a sun's +bowl, looking across. `DeepWellIsTenBandsDeepAndWide` computes the band `G` from +`FogField`'s own floor offset, amplitude and noise range (60) and requires the +depth (633 at the centre against the rim) and the half-depth radius to be at +least `10 G`, every drawn camera sitting inside the well below the rim; a well of +depth 150 fails. The shallow wells stay as the printed shallow-well, band-dominated row (c-band). + +The test field's affine bound takes depth as `af_symbol(z_m, h)`, builds `s` +affine in it with the height interval, the footprint and the slope-depth +product in `e` through `af_add_iv`, takes the noise through `af_frustum_*` and +`af_snoise` per phase and for the detail octave, fades by `af_from_iv` and +`af_mul`, reads the range with `af_range`, and intersects with the centred +interval's bound (both sound). `FogField.Bound` makes no direct `snoise` call. +The cull-map render (`DeepWellCullMap`, explicit) writes a PNG when +`CULTMATH_WRITE_CULLMAP` names a directory: one deep-well camera at warp `D`, +960 x 540 in 8 x 8 tiles, with panels for dense cells per ray under the centred +interval, under the affine bound and under the oracle mask (one logarithmic +scale) and the transmittance. Its run: 4.23, 3.60 and 2.02 cells per ray on +average, 44 the most, mean transmittance 0.278. + +## Expressions + +`CultMath.Expr` holds a scalar SSA expression graph as a persisted value, a builder +for it, and a C# evaluator. + +- **Graph (`ExprGraph`)**: a sealed immutable class. It has no name of its own; the + consumer record that holds it names it. Nodes are in topological order, an operand + names a lower node, and an edit builds a new graph. A persisted graph carries a + format version (1); one naming an unknown op, a newer format or a forward operand is + refused whole at decode. `ExprGraph.Create` is the one validator, run by the builder + and by decode. +- **Node**: its index in the topological order. The builder hash-conses identical + (op, operands, constant bits) nodes and drops nodes no output reaches, so one + expression always builds the same bytes; any rebuild may renumber nodes. +- **Port**: graph inputs vary per point, params are uniform per batch and carry a + default, outputs name a node. Names are `[A-Za-z_][A-Za-z0-9_]*`, unique per kind. + An op's operands are positional; a multi-result op (`cellular3`: nearest.xyzw, + edge.xyzw, id) is read only through `Pick`. +- **Op vocabulary**: one table (`ExprOps`), a stable string per op, append-only. + Vector arguments are decomposed operands: `snoise2`, `snoise3`, `cellular3`. An op + calls its CultMath function; a function's value change is a Breaking release note. +- **Evaluation**: `ExprEvaluator.Evaluate` runs the nodes in order through the table, + one IEEE single per op, so a result equals the direct composition of the same math + calls bit for bit. Params bind by name (`ExprBindings`): a missing name takes its + default and an unknown name is refused. +- **Stencils** are substitution at build time (`ExprBuilder.Substitute`, Fidget's + `remap_xyz`): N substitutions of the position inputs combined by ops give an ordinary + flat graph. There is no loop construct. + +The MessagePack shape belongs to `GameCult.Caching.MessagePack` (`CultMathExprResolver`). +Interval, affine and gradient evaluation over the graph, bytecode, the HLSL +interpreter and pruning are not built. + ## Rules - Keep type names HLSL-shaped: `float2`, `float3`, `float4`, `float3x3`, and `math`. diff --git a/packages/cultmath/scripts/build-unity-package.ps1 b/packages/cultmath/scripts/build-unity-package.ps1 index b64e9446..a1e16282 100644 --- a/packages/cultmath/scripts/build-unity-package.ps1 +++ b/packages/cultmath/scripts/build-unity-package.ps1 @@ -41,6 +41,27 @@ foreach ($path in @($freshAssembly, $freshSymbols)) { } } +# docs/semver-policy.md (CultLib root, two levels up from this script): refuse a release whose version +# does not tell the truth. The check measures the freshly built CultMath.dll's public API against the +# DLL the previous cultmath-unity tag tracked (read from git), so it runs once the build exists. +# cultmath is pre-1.0 (0.y.z): a break must be at least a minor bump. $repoRoot above is this package's +# own root (packages\cultmath), not CultLib's; the shared checker script lives one level above that. +$cultLibRoot = Split-Path -Parent (Split-Path -Parent $repoRoot) +$cultmathVersion = (Get-Content -LiteralPath (Join-Path $templateRoot "package.json") -Raw | ConvertFrom-Json).version +# The suite pins the checker's rules and the declared tag prefixes, so it runs first. +& node --test (Join-Path $cultLibRoot "scripts\check-changelog-semver.test.mjs") +if ($LASTEXITCODE -ne 0) { + throw "The release check suite failed (scripts/check-changelog-semver.test.mjs); not releasing." +} +& node (Join-Path $cultLibRoot "scripts\check-changelog-semver.mjs") ` + --package "org.gamecult.cultmath" ` + --version $cultmathVersion ` + --cwd $cultLibRoot ` + --api-built $freshAssembly +if ($LASTEXITCODE -ne 0) { + throw "CultMath Unity package failed the semver policy check (see docs/semver-policy.md)." +} + $requiredTemplateFiles = @( "LICENSE.md", "LICENSE.md.meta", @@ -59,7 +80,15 @@ $requiredTemplateFiles = @( "Runtime\UnityBridge\UnityConversions.cs", "Runtime\UnityBridge\UnityConversions.cs.meta", "Shaders\CultMath.hlsl", - "Shaders\CultMath.hlsl.meta" + "Shaders\CultMath.hlsl.meta", + "Shaders\CultMath.Phacelle.hlsl", + "Shaders\CultMath.Phacelle.hlsl.meta", + "Shaders\CultMath.Interval.hlsl", + "Shaders\CultMath.Interval.hlsl.meta", + "Shaders\CultMath.Affine.hlsl", + "Shaders\CultMath.Affine.hlsl.meta", + "Shaders\CultMath.Cycles.hlsl", + "Shaders\CultMath.Cycles.hlsl.meta" ) foreach ($relativePath in $requiredTemplateFiles) { if (-not (Test-Path -LiteralPath (Join-Path $templateRoot $relativePath) -PathType Leaf)) { diff --git a/packages/cultmath/scripts/unity-smoke/Broken.compute b/packages/cultmath/scripts/unity-smoke/Broken.compute new file mode 100644 index 00000000..2d7b11c1 --- /dev/null +++ b/packages/cultmath/scripts/unity-smoke/Broken.compute @@ -0,0 +1,11 @@ +#pragma kernel CSMain +#include "Packages/org.gamecult.cultmath/Shaders/CultMath.hlsl" +#include "Packages/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl" +#include "Packages/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl" +RWStructuredBuffer Out; +[numthreads(1,1,1)] void CSMain(uint3 id : SV_DispatchThreadID) +{ + float2 r = cultmath_iv_add_missing(float2(1, 2), float2(3, 5)); + float2 a = cultmath_af_range(cultmath_af_add(cultmath_af_point(3), cultmath_af_point(5))); + Out[0] = float4(r, a); +} diff --git a/packages/cultmath/scripts/unity-smoke/CultMath.Smoke.Tests.asmdef b/packages/cultmath/scripts/unity-smoke/CultMath.Smoke.Tests.asmdef new file mode 100644 index 00000000..9017551b --- /dev/null +++ b/packages/cultmath/scripts/unity-smoke/CultMath.Smoke.Tests.asmdef @@ -0,0 +1,14 @@ +{ + "name": "CultMath.Smoke.Tests", + "rootNamespace": "", + "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner" ], + "includePlatforms": [ "Editor" ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ "nunit.framework.dll", "CultMath.dll" ], + "autoReferenced": false, + "defineConstraints": [ "UNITY_INCLUDE_TESTS" ], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/packages/cultmath/scripts/unity-smoke/Good.compute b/packages/cultmath/scripts/unity-smoke/Good.compute new file mode 100644 index 00000000..0235c23e --- /dev/null +++ b/packages/cultmath/scripts/unity-smoke/Good.compute @@ -0,0 +1,11 @@ +#pragma kernel CSMain +#include "Packages/org.gamecult.cultmath/Shaders/CultMath.hlsl" +#include "Packages/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl" +#include "Packages/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl" +RWStructuredBuffer Out; +[numthreads(1,1,1)] void CSMain(uint3 id : SV_DispatchThreadID) +{ + float2 r = cultmath_iv_add(float2(1, 2), float2(3, 5)); + float2 a = cultmath_af_range(cultmath_af_add(cultmath_af_point(3), cultmath_af_point(5))); + Out[0] = float4(r, a); +} diff --git a/packages/cultmath/scripts/unity-smoke/SmokeTests.cs b/packages/cultmath/scripts/unity-smoke/SmokeTests.cs new file mode 100644 index 00000000..91777785 --- /dev/null +++ b/packages/cultmath/scripts/unity-smoke/SmokeTests.cs @@ -0,0 +1,44 @@ +using System; +using CultMath; +using NUnit.Framework; +using UnityEditor; +using UnityEngine; +using UnityEngine.TestTools; + +public class SmokeTests +{ + // Compiles by FindKernel and dispatches on the device; false when the shader does not compile or the output is wrong. + static bool CompilesAndRuns(string path) + { + var cs = AssetDatabase.LoadAssetAtPath(path); + Assert.IsNotNull(cs, path); + int k; + try { k = cs.FindKernel("CSMain"); } catch (Exception e) { Debug.Log("SMOKE " + path + " FindKernel threw: " + e.Message); return false; } + if (!cs.HasKernel("CSMain") || !cs.IsSupported(k)) { Debug.Log("SMOKE " + path + " kernel unusable"); return false; } + var buf = new ComputeBuffer(1, 16); + try + { + cs.SetBuffer(k, "Out", buf); + cs.Dispatch(k, 1, 1, 1); + var o = new Vector4[1]; buf.GetData(o); + Debug.Log($"SMOKE {path} out=({o[0].x},{o[0].y},{o[0].z},{o[0].w}) gpu={SystemInfo.graphicsDeviceType}"); + return o[0].x == 4f && o[0].y == 7f && o[0].z <= 8f && o[0].w >= 8f && o[0].w - o[0].z < 1e-3f; + } + finally { buf.Release(); } + } + + [Test] public void CSharpIntervalAndAffineWork() + { + var r = math.iv_add(new float2(1, 2), new float2(3, 5)); + Assert.AreEqual(4f, r.x); Assert.AreEqual(7f, r.y); + Assert.AreEqual(0f, math.snoise(new float3(0, 0, 0))); + } + + [Test] public void RealShaderCompilesAndDispatches() { Assert.IsTrue(CompilesAndRuns("Assets/Shaders/Good.compute")); } + + [Test] public void BrokenShaderIsDetected() + { + LogAssert.ignoreFailingMessages = true; + Assert.IsFalse(CompilesAndRuns("Assets/Shaders/Broken.compute")); + } +} diff --git a/packages/cultmath/scripts/unity-smoke/run-unity-smoke.ps1 b/packages/cultmath/scripts/unity-smoke/run-unity-smoke.ps1 new file mode 100644 index 00000000..641459e6 --- /dev/null +++ b/packages/cultmath/scripts/unity-smoke/run-unity-smoke.ps1 @@ -0,0 +1,94 @@ +<# +.SYNOPSIS + The release smoke for the tracked org.gamecult.cultmath Unity package: imports it into a + scratch project, compiles and dispatches a compute shader that includes the package's + CultMath.Interval.hlsl and CultMath.Affine.hlsl on a real graphics device, and proves a + deliberately broken shader is rejected. + +.DESCRIPTION + Run it on a Windows machine with a GPU, alone, before tagging cultmath-unity-v*. The scratch + project is built outside the repository under -WorkRoot, references the package by a file: path, + and is deleted afterwards (-Keep leaves it). Exit 0 only when Unity exited 0, this run wrote the + results file (earlier ones are deleted before launch), and all three tests of SmokeTests.cs + passed: the C# calls, the real shader dispatched with the right output, and the broken control + shader detected. + + Never add -nographics. Without a device nothing compiles, and + ShaderUtil.GetComputeShaderMessageCount reports 0 messages for a compute shader that calls an + undeclared function until FindKernel or Dispatch compiles it, so a message-count check passes a + broken shader. SmokeTests.cs compiles by FindKernel, dispatches, and reads the output back. + + For a long run start it detached and poll the log, for example: + Start-Process powershell -WindowStyle Hidden -ArgumentList '-File', '', '-UnityExe', '', '-WorkRoot', '' + The script writes unity.pid and unity.log under the scratch root's logs folder (kept after the run). + +.PARAMETER UnityExe + Path to Unity.exe of the editor to test with (the cut that released 0.4.0 used 6000.3.24f1). +.PARAMETER WorkRoot + Directory outside the repository for the scratch project and logs. Default: a new folder under TEMP. +.PARAMETER Keep + Keep the scratch project instead of deleting it. +#> +param( + [Parameter(Mandatory)] [string] $UnityExe, + [string] $WorkRoot = (Join-Path $env:TEMP ("cultmath-unity-smoke-" + [guid]::NewGuid().ToString('N').Substring(0, 8))), + [switch] $Keep +) +$ErrorActionPreference = 'Stop' +if (-not (Test-Path -LiteralPath $UnityExe -PathType Leaf)) { throw "UnityExe not found: $UnityExe" } + +$smoke = $PSScriptRoot +$package = (Resolve-Path (Join-Path $smoke '..\..\unity\org.gamecult.cultmath')).Path +$repoRoot = (git -C $smoke rev-parse --show-toplevel).Trim() +$work = [IO.Path]::GetFullPath($WorkRoot) +if ($work.StartsWith([IO.Path]::GetFullPath($repoRoot), [StringComparison]::OrdinalIgnoreCase)) { + throw "WorkRoot must be outside the repository: $work" +} +$project = Join-Path $work 'project' +$logs = Join-Path $work 'logs' +New-Item -ItemType Directory -Force -Path $logs | Out-Null +foreach ($d in 'Packages', 'Assets\Shaders', 'Assets\Tests') { New-Item -ItemType Directory -Force -Path (Join-Path $project $d) | Out-Null } + +Copy-Item -LiteralPath (Join-Path $smoke 'Good.compute'), (Join-Path $smoke 'Broken.compute') -Destination (Join-Path $project 'Assets\Shaders') +Copy-Item -LiteralPath (Join-Path $smoke 'SmokeTests.cs'), (Join-Path $smoke 'CultMath.Smoke.Tests.asmdef') -Destination (Join-Path $project 'Assets\Tests') + +$packageUri = 'file:' + $package.Replace([string][char]92, '/') +$manifest = [ordered]@{ + dependencies = [ordered]@{ + 'com.unity.test-framework' = '1.6.0' + 'org.gamecult.cultmath' = $packageUri + } +} +[IO.File]::WriteAllText((Join-Path $project 'Packages\manifest.json'), ($manifest | ConvertTo-Json -Depth 4), (New-Object Text.UTF8Encoding($false))) + +$log = Join-Path $logs 'unity.log' +$results = Join-Path $logs 'results.xml' +# A kept logs folder may hold an earlier run's evidence: nothing from a previous run may decide this one. +foreach ($stale in $log, $results, (Join-Path $logs 'unity.pid')) { Remove-Item -LiteralPath $stale -Force -ErrorAction SilentlyContinue } +if (Test-Path -LiteralPath $results) { throw "could not clear the previous results file: $results" } +$unityArgs = @('-batchmode', '-projectPath', $project, '-runTests', '-testPlatform', 'EditMode', + '-testResults', $results, '-logFile', $log) +$launched = Get-Date +$p = Start-Process -PassThru -FilePath $UnityExe -ArgumentList $unityArgs -WindowStyle Hidden +$p.Id | Out-File (Join-Path $logs 'unity.pid') -Encoding ascii +"unity pid=$($p.Id) log=$log" +$p.WaitForExit() +"unity exit=$($p.ExitCode)" + +# Pass needs all of: Unity exited 0; a results file written by this run; the real shader test passed and +# the broken control test passed (it asserts that the broken shader is rejected). +$ok = $false +if ($p.ExitCode -ne 0) { "unity exited non-zero: $($p.ExitCode)" } +elseif (-not (Test-Path -LiteralPath $results)) { 'no results file from this run' } +elseif ((Get-Item -LiteralPath $results).LastWriteTime -lt $launched) { 'results file predates this run' } +else { + $cases = @(([xml](Get-Content -LiteralPath $results -Raw)).SelectNodes('//test-case')) + $cases | ForEach-Object { "{0} {1}" -f $_.result, $_.name } + $want = 'CSharpIntervalAndAffineWork', 'RealShaderCompilesAndDispatches', 'BrokenShaderIsDetected' + $passed = @($cases | Where-Object { $_.result -eq 'Passed' } | ForEach-Object { ($_.name -split '\.')[-1] }) + $ok = (@($want | Where-Object { $passed -contains $_ }).Count -eq $want.Count) +} +Get-Content -LiteralPath $log -ErrorAction SilentlyContinue | Select-String -CaseSensitive -Pattern '^SMOKE ' | ForEach-Object { $_.Line } + +if (-not $Keep) { Remove-Item -LiteralPath $project -Recurse -Force } +if ($ok) { 'SMOKE PASSED'; exit 0 } else { 'SMOKE FAILED'; exit 1 } diff --git a/packages/cultmath/shaders/CultMath.Affine.hlsl b/packages/cultmath/shaders/CultMath.Affine.hlsl new file mode 100644 index 00000000..eee7a2de --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Affine.hlsl @@ -0,0 +1,142 @@ +#ifndef CULTMATH_AFFINE_HLSL +#define CULTMATH_AFFINE_HLSL + +// Reduced affine forms with one shared symbol over float3(x0, a, e): the set { x0 + a eps + e delta : +// delta in [-1, 1] } at the region's shared eps in [-1, 1], e >= 0. Every cultmath_af_* function mirrors +// math.Affine.cs bit for bit; see that file and docs/design.md ("Affine forms") for each op's enclosure +// and the float32 rounding allowance it folds into e. Included by CultMath.hlsl after +// CultMath.Interval.hlsl, whose CULTMATH_SNOISE_LIPSCHITZ it shares, and after its own +// definition of cultmath_snoise_grad. + +// An upper bound on the spectral norm of the Hessian of cultmath_snoise(float3); provenance in +// math.Affine.cs (SNOISE_HESSIAN). +static const float CULTMATH_SNOISE_HESSIAN = 55.642143; + +// The absolute rounding of one float32 read of cultmath_snoise_grad, value and gradient; the owner is +// math.Affine.cs (SNOISE_READ_VALUE, SNOISE_READ_GRADIENT), read here by cultmath_af_snoise and in +// CultMath.hlsl by cultmath_span_slack. +static const float CULTMATH_SNOISE_READ_VALUE = 6.103515625e-5; +static const float CULTMATH_SNOISE_READ_GRADIENT = 2.44140625e-4; + +// An upper bound on the operator norm of the third-derivative tensor of cultmath_snoise(float3), the +// next order after CULTMATH_SNOISE_HESSIAN; provenance in math.Span.cs (SNOISE_THIRD). +static const float CULTMATH_SNOISE_THIRD = 535.8009; + +float3 cultmath_af_point(float value) { return float3(value, 0.0, 0.0); } +float3 cultmath_af_symbol(float x0, float a) { return float3(x0, a, 0.0); } + +float3 cultmath_af_from_iv(float2 interval) +{ + float x0 = interval.x * 0.5 + interval.y * 0.5; + float e = interval.y * 0.5 - interval.x * 0.5; + return float3(x0, 0.0, e + (abs(x0) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +// An endpoint that would be NaN is the infinity on its side. NaN is found by its bit pattern: dxc marks +// compares fast, so a test that needs NaN to make `lo == lo` false is deleted under its default flags. +float2 cultmath_af_range(float3 x) +{ + float r = abs(x.y) + x.z; + float w = abs(x.x) * 9.5367431640625e-7 + r * 9.5367431640625e-7; + float lo = x.x - r - w; + float hi = x.x + r + w; + return float2((asuint(lo) & 0x7fffffffu) > 0x7f800000u ? asfloat(0xff800000u) : lo, + (asuint(hi) & 0x7fffffffu) > 0x7f800000u ? asfloat(0x7f800000u) : hi); +} + +float3 cultmath_af_add(float3 x, float3 y) +{ + float x0 = x.x + y.x; + float a = x.y + y.y; + float e = x.z + y.z; + return float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7); +} + +float3 cultmath_af_sub(float3 x, float3 y) +{ + float x0 = x.x - y.x; + float a = x.y - y.y; + float e = x.z + y.z; + return float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7); +} + +float3 cultmath_af_neg(float3 x) { return float3(-x.x, -x.y, x.z); } + +float3 cultmath_af_scale(float3 x, float s) +{ + float x0 = x.x * s; + float a = x.y * s; + float e = x.z * abs(s); + return float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +float3 cultmath_af_add_iv(float3 x, float2 interval) { return cultmath_af_add(x, cultmath_af_from_iv(interval)); } + +float3 cultmath_af_mul(float3 x, float3 y) +{ + float x0 = x.x * y.x; + float p = x.x * y.y; + float q = y.x * x.y; + float a = p + q; + float e = abs(x.x) * y.z + abs(y.x) * x.z + (abs(x.y) + x.z) * (abs(y.y) + y.z); + return float3(x0, a, e + (abs(x0) + abs(p) + abs(q) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +// The narrower of the Lipschitz form and the centred (Taylor) form over every p = centre + axis eps + w, +// |w| <= radius, from one cultmath_snoise_grad at the centre; the allowance for the float32 evaluation is +// in math.Affine.cs. +float3 cultmath_af_snoise(float3 centre, float3 axis, float radius) +{ + float4 g = cultmath_snoise_grad(centre); + float3 gradient = float3(g.x, g.y, g.z); + float reach = length(axis) + radius; + float lipschitz = CULTMATH_SNOISE_LIPSCHITZ * reach; + float a = dot(gradient, axis); + float remainder = length(gradient) * radius + 0.5 * CULTMATH_SNOISE_HESSIAN * reach * reach; + float allowance = CULTMATH_SNOISE_READ_VALUE + CULTMATH_SNOISE_READ_GRADIENT * reach + + CULTMATH_SNOISE_LIPSCHITZ * 9.5367431640625e-7 * (abs(centre.x) + abs(centre.y) + abs(centre.z) + reach); + bool centred = abs(a) + remainder < lipschitz; + float slope = centred ? a : 0.0; + float e = (centred ? remainder : lipschitz) + allowance; + return float3(g.w, slope, e + (abs(g.w) + abs(slope) + e) * 9.5367431640625e-7); +} + +// Octave sum of cultmath_af_snoise, compounding frequency and amplitude as the value-and-gradient fBm does. +float3 cultmath_af_fbm(float3 centre, float3 axis, float radius, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float3 sum = float3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + sum = cultmath_af_add(sum, cultmath_af_scale(cultmath_af_snoise(centre * frequency, axis * frequency, radius * abs(frequency)), amplitude)); + frequency *= lacunarity; + amplitude *= gain; + } + + return sum; +} + +// The axis of a screen tile's slice over the depth segment [z0, z1]; camera frame of +// cultmath_iv_frustum_ball. +float3 cultmath_af_frustum_axis(float2 centreSlope, float z0, float z1) +{ + float h = (z1 - z0) * 0.5; + return float3(centreSlope.x * h, centreSlope.y * h, h); +} + +// The affine slice of a screen tile over [z0, z1]: centre xyz, radius w. Derivation in math.Affine.cs. +float4 cultmath_af_frustum_ball(float2 centreSlope, float z0, float z1, float footprintPerDepth, float warpVariation) +{ + float zm = (z0 + z1) * 0.5; + float h = (z1 - z0) * 0.5; + float cx = centreSlope.x * zm; + float cy = centreSlope.y * zm; + float spread = (abs(centreSlope.x) + abs(centreSlope.y) + 1.0) * h; + float radius = z1 * footprintPerDepth + warpVariation; + radius += (abs(cx) + abs(cy) + abs(zm) + spread + radius) * 9.5367431640625e-7; + return float4(cx, cy, zm, radius); +} + +#endif diff --git a/packages/cultmath/shaders/CultMath.Affine.hlsl.meta b/packages/cultmath/shaders/CultMath.Affine.hlsl.meta new file mode 100644 index 00000000..81cc7925 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Affine.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 26f28fce38e14eed8b9b5dbd758e4ffc +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/shaders/CultMath.Cycles.glsl b/packages/cultmath/shaders/CultMath.Cycles.glsl new file mode 100644 index 00000000..67639b07 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Cycles.glsl @@ -0,0 +1,363 @@ +// Generated from shaders/CultMath.Cycles.hlsl by GlslLowering (packages/cultmath/tests/CultMath.Tests/GlslLowering.cs). Do not edit; regenerate with CULTMATH_WRITE_GLSL=1 dotnet test --filter GlslMirrorTests. Apache-2.0; requires CultMath.glsl before it. +#ifndef CULTMATH_CYCLES_GLSL +#define CULTMATH_CYCLES_GLSL +// SPDX-License-Identifier: Apache-2.0 +// +// Cycles node semantics: what Blender's Cycles renderer computes for the Math, Map Range, Clamp, Mix and +// RGB to BW nodes and for a Color Ramp lookup, ported function by function from the Cycles kernel +// (intern/cycles of the Blender v5.2.2 tag; SPDX-FileCopyrightText: 2011-2022 Blender Foundation, Apache-2.0): +// kernel/svm/{math_util,map_range,clamp,mix,color_util,ramp,convert}.h, util/math_base.h, util/color.h and +// util/math_float3.h. Each function's comment names its Cycles source. Modified by GameCult: Cycles C++ +// becomes HLSL, a function per node operation, and the node's socket defaults and clamp options are left to +// the caller. This file is Apache-2.0 (section 4: it was changed); CultMath.hlsl, which includes it after its +// own definitions, is MIT (see THIRD-PARTY-NOTICES.md). math.Cycles.cs mirrors it bit for bit. +// +// Operands are finite floats. NaN and infinite operands are outside the oracle's reach and the mirror's. + +// FLT_EPSILON, the least epsilon a Compare node honours. +const float CULTMATH_CYCLES_FLT_EPSILON = 1.1920929e-07; + +// The scene-linear luminance coefficients Cycles reads from Blender 5.2.2's default OCIO config +// (kernel/film linear_rgb_to_gray). The oracle fixture pins them with a case per primary. +const float CULTMATH_CYCLES_RGB_TO_Y_R = 0.212639093; +const float CULTMATH_CYCLES_RGB_TO_Y_G = 0.715169132; +const float CULTMATH_CYCLES_RGB_TO_Y_B = 0.0721927434; + +// ---- Math node (kernel/svm/math_util.h svm_math; util/math_base.h) ---- + +// safe_divide +float cultmath_cycles_divide(float a, float b) { return b != 0.0 ? a / b : 0.0; } + +// safe_powf with compatible_powf. A negative base takes an integral exponent's parity; a base below zero +// with a fractional exponent is 0. +float cultmath_cycles_power(float a, float b) +{ + float whole = b >= 0.0 ? floor(b) : ceil(b); + if (a < 0.0 && b != whole) + return 0.0; + if (b == 0.0) + return 1.0; + if (a == 0.0) + return 0.0; + if (a < 0.0) + { + float magnitude = pow(-a, b); + // Odd exactly when the remainder is 1: an infinite exponent leaves NaN here and is even, as powf(a, +-inf) is never negative. + return b - 2.0 * floor(0.5 * b) == 1.0 ? -magnitude : magnitude; + } + return pow(a, b); +} + +// safe_logf +float cultmath_cycles_logarithm(float a, float b) +{ + if (a <= 0.0 || b <= 0.0) + return 0.0; + float denominator = log(b); + return denominator != 0.0 ? log(a) / denominator : 0.0; +} + +// safe_sqrtf +float cultmath_cycles_sqrt(float a) { return sqrt(max(a, 0.0)); } + +// inversesqrtf +float cultmath_cycles_inverse_sqrt(float a) { return a > 0.0 ? 1.0 / sqrt(a) : 0.0; } + +// safe_modulo is fmodf, the remainder with the dividend's sign, exactly. GLSL has no fmod, and a - b trunc(a / b) +// is wrong where the quotient rounds up to an integer or the product rounds (3 mod 0.3 is 0.29999995, not 0). +// So this subtracts the largest power-of-two multiple of the divisor not above the remainder until the +// remainder is below the divisor: every step is an exact subtraction, as in fmod. The loops are bounded by the +// binades a float spans. +float cultmath_cycles_modulo(float a, float b) +{ + float remainder = abs(a); + float divisor = abs(b); + for (int steps = 0; steps < 300 && remainder >= divisor && divisor > 0.0; steps++) + { + float multiple = divisor; + for (int doublings = 0; doublings < 300 && multiple * 2.0 <= remainder; doublings++) + multiple = multiple * 2.0; + remainder = remainder - multiple; + } + return b != 0.0 ? (a < 0.0 ? -remainder : remainder) : 0.0; +} + +// safe_floored_modulo; a build that contracts it differs by a bound stated at cycles_floored_modulo in math.Cycles.cs and the README +float cultmath_cycles_floored_modulo(float a, float b) { return b != 0.0 ? a - floor(a / b) * b : 0.0; } + +// wrapf (note the argument order: value, max, min); contraction bound as for floored_modulo +float cultmath_cycles_wrap(float value, float max_value, float min_value) +{ + float range = max_value - min_value; + return range != 0.0 ? value - (range * floor((value - min_value) / range)) : min_value; +} + +// floorf(safe_divide(a, b)) * b +float cultmath_cycles_snap(float a, float b) { return floor(cultmath_cycles_divide(a, b)) * b; } + +// pingpongf +float cultmath_cycles_pingpong(float a, float b) +{ + float scaled = (a - b) / (b * 2.0); + return b != 0.0 ? abs((scaled - floor(scaled)) * b * 2.0 - b) : 0.0; +} + +// smoothminf +float cultmath_cycles_smooth_min(float a, float b, float k) +{ + float h = max(k - abs(a - b), 0.0) / k; + return k != 0.0 ? min(a, b) - h * h * h * k * 0.16666667 : min(a, b); +} + +// -smoothminf(-a, -b, k) +float cultmath_cycles_smooth_max(float a, float b, float k) { return -cultmath_cycles_smooth_min(-a, -b, k); } + +// NODE_MATH_COMPARE +float cultmath_cycles_compare(float a, float b, float epsilon) +{ + return (a == b || abs(a - b) <= max(epsilon, CULTMATH_CYCLES_FLT_EPSILON)) ? 1.0 : 0.0; +} + +// NODE_MATH_ROUND +float cultmath_cycles_round(float a) { return floor(a + 0.5); } + +// NODE_MATH_TRUNC +float cultmath_cycles_trunc(float a) { return a >= 0.0 ? floor(a) : ceil(a); } + +// NODE_MATH_FRACTION +float cultmath_cycles_fract(float a) { return a - floor(a); } + +// compatible_signf +float cultmath_cycles_sign(float a) { return a == 0.0 ? 0.0 : (a < 0.0 ? -1.0 : 1.0); } + +// safe_asinf +float cultmath_cycles_arcsine(float a) { return asin(clamp(a, -1.0, 1.0)); } + +// safe_acosf +float cultmath_cycles_arccosine(float a) { return acos(clamp(a, -1.0, 1.0)); } + +// compatible_atan2 (a is y, b is x) +float cultmath_cycles_arctan2(float a, float b) { return (b == 0.0 && a == 0.0) ? 0.0 : atan(a, b); } + +// ---- Map Range node (kernel/svm/map_range.h svm_node_map_range) ---- +// A Map Range node's Clamp option is a Clamp node of type Range on its result (MapRangeNode::expand): +// compose cultmath_cycles_clamp_range over these. + +float cultmath_cycles_map_range_linear(float value, float from_min, float from_max, float to_min, float to_max) +{ + float factor = (value - from_min) / (from_max - from_min); + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +float cultmath_cycles_map_range_stepped(float value, float from_min, float from_max, float to_min, float to_max, float steps) +{ + float factor = (value - from_min) / (from_max - from_min); + factor = steps > 0.0 ? floor(factor * (steps + 1.0)) / steps : 0.0; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// The value itself, not a normalized one, goes through smoothstep(from_min, from_max, .), flipped when +// from_min > from_max (util/math_base.h smoothstep). +float cultmath_cycles_map_range_smoothstep(float value, float from_min, float from_max, float to_min, float to_max) +{ + float low = min(from_min, from_max); + float high = max(from_min, from_max); + float t = (value - low) / (high - low); + float eased = value < low ? 0.0 : (value >= high ? 1.0 : (3.0 - 2.0 * t) * (t * t)); + float factor = from_min > from_max ? 1.0 - eased : eased; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// smootherstep of map_range.h, flipped when from_min > from_max. +float cultmath_cycles_map_range_smootherstep(float value, float from_min, float from_max, float to_min, float to_max) +{ + float low = min(from_min, from_max); + float high = max(from_min, from_max); + float x = clamp(cultmath_cycles_divide(value - low, high - low), 0.0, 1.0); + float eased = x * x * x * (x * (x * 6.0 - 15.0) + 10.0); + float factor = from_min > from_max ? 1.0 - eased : eased; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// ---- Clamp node (kernel/svm/clamp.h svm_node_clamp) ---- + +// Type Min Max +float cultmath_cycles_clamp_minmax(float value, float min_value, float max_value) { return clamp(value, min_value, max_value); } + +// Type Range: the bounds swap when min_value > max_value. +float cultmath_cycles_clamp_range(float value, float min_value, float max_value) +{ + return min_value > max_value ? clamp(value, max_value, min_value) : clamp(value, min_value, max_value); +} + +// ---- Mix node (kernel/svm/mix.h, color_util.h) ---- +// Factor clamping (svm_node_mix_color's saturatef) and result clamping (saturate) are the caller's. + +// svm_node_mix_float +float cultmath_cycles_mix_float(float t, float a, float b) { return a * (1.0 - t) + b * t; } + +// svm_node_mix_vector +vec3 cultmath_cycles_mix_vector(float t, vec3 a, vec3 b) { return a * (vec3(1.0, 1.0, 1.0) - t) + b * t; } + +vec3 cultmath_cycles_mix_blend(float t, vec3 col1, vec3 col2) { return col1 + t * (col2 - col1); } + +vec3 cultmath_cycles_mix_add(float t, vec3 col1, vec3 col2) { return col1 + t * ((col1 + col2) - col1); } + +vec3 cultmath_cycles_mix_mul(float t, vec3 col1, vec3 col2) { return col1 + t * (col1 * col2 - col1); } + +vec3 cultmath_cycles_mix_screen(float t, vec3 col1, vec3 col2) +{ + float tm = 1.0 - t; + vec3 one = vec3(1.0, 1.0, 1.0); + return one - (vec3(tm, tm, tm) + t * (one - col2)) * (one - col1); +} + +vec3 cultmath_cycles_mix_overlay(float t, vec3 col1, vec3 col2) +{ + float tm = 1.0 - t; + return vec3( + col1.x < 0.5 ? col1.x * (tm + 2.0 * t * col2.x) : 1.0 - (tm + 2.0 * t * (1.0 - col2.x)) * (1.0 - col1.x), + col1.y < 0.5 ? col1.y * (tm + 2.0 * t * col2.y) : 1.0 - (tm + 2.0 * t * (1.0 - col2.y)) * (1.0 - col1.y), + col1.z < 0.5 ? col1.z * (tm + 2.0 * t * col2.z) : 1.0 - (tm + 2.0 * t * (1.0 - col2.z)) * (1.0 - col1.z)); +} + +vec3 cultmath_cycles_mix_sub(float t, vec3 col1, vec3 col2) { return col1 + t * ((col1 - col2) - col1); } + +vec3 cultmath_cycles_mix_div(float t, vec3 col1, vec3 col2) +{ + float tm = 1.0 - t; + return vec3( + col2.x != 0.0 ? tm * col1.x + t * col1.x / col2.x : col1.x, + col2.y != 0.0 ? tm * col1.y + t * col1.y / col2.y : col1.y, + col2.z != 0.0 ? tm * col1.z + t * col1.z / col2.z : col1.z); +} + +vec3 cultmath_cycles_mix_diff(float t, vec3 col1, vec3 col2) { return col1 + t * (abs(col1 - col2) - col1); } + +vec3 cultmath_cycles_mix_exclusion(float t, vec3 col1, vec3 col2) +{ + return max(col1 + t * ((col1 + col2 - 2.0 * col1 * col2) - col1), vec3(0.0, 0.0, 0.0)); +} + +vec3 cultmath_cycles_mix_dark(float t, vec3 col1, vec3 col2) { return col1 + t * (min(col1, col2) - col1); } + +vec3 cultmath_cycles_mix_light(float t, vec3 col1, vec3 col2) { return col1 + t * (max(col1, col2) - col1); } + +vec3 cultmath_cycles_mix_dodge(float t, vec3 col1, vec3 col2) +{ + vec3 divisor = vec3(1.0, 1.0, 1.0) - t * col2; + return vec3( + col1.x != 0.0 ? (divisor.x <= 0.0 ? 1.0 : min(col1.x / divisor.x, 1.0)) : col1.x, + col1.y != 0.0 ? (divisor.y <= 0.0 ? 1.0 : min(col1.y / divisor.y, 1.0)) : col1.y, + col1.z != 0.0 ? (divisor.z <= 0.0 ? 1.0 : min(col1.z / divisor.z, 1.0)) : col1.z); +} + +vec3 cultmath_cycles_mix_burn(float t, vec3 col1, vec3 col2) +{ + float tm = 1.0 - t; + vec3 divisor = tm + t * col2; + vec3 burnt = vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - col1) / divisor; + return vec3( + divisor.x <= 0.0 ? 0.0 : clamp(burnt.x, 0.0, 1.0), + divisor.y <= 0.0 ? 0.0 : clamp(burnt.y, 0.0, 1.0), + divisor.z <= 0.0 ? 0.0 : clamp(burnt.z, 0.0, 1.0)); +} + +// rgb_to_hsv of util/color.h +vec3 cultmath_cycles_rgb_to_hsv(vec3 rgb) +{ + float cmax = max(rgb.x, max(rgb.y, rgb.z)); + float cmin = min(rgb.x, min(rgb.y, rgb.z)); + float cdelta = cmax - cmin; + float s = cmax != 0.0 ? cdelta / cmax : 0.0; + vec3 c = (vec3(cmax, cmax, cmax) - rgb) / cdelta; + float h = rgb.x == cmax ? c.z - c.y : (rgb.y == cmax ? 2.0 + c.x - c.z : 4.0 + c.y - c.x); + h = h * 0.16666667; // Cycles' kernel is built with reciprocal math: h /= 6.0f computes h * (1 / 6.0f). + h = h < 0.0 ? h + 1.0 : h; + return vec3(s != 0.0 ? h : 0.0, s, cmax); +} + +// hsv_to_rgb of util/color.h +vec3 cultmath_cycles_hsv_to_rgb(vec3 hsv) +{ + float h = hsv.x == 1.0 ? 0.0 : hsv.x; + h = h * 6.0; + float i = floor(h); + float f = h - i; + float p = hsv.z * (1.0 - hsv.y); + float q = hsv.z * (1.0 - (hsv.y * f)); + float t = hsv.z * (1.0 - (hsv.y * (1.0 - f))); + vec3 rgb = i == 0.0 ? vec3(hsv.z, t, p) : + (i == 1.0 ? vec3(q, hsv.z, p) : + (i == 2.0 ? vec3(p, hsv.z, t) : + (i == 3.0 ? vec3(p, q, hsv.z) : + (i == 4.0 ? vec3(t, p, hsv.z) : vec3(hsv.z, p, q))))); + return hsv.y != 0.0 ? rgb : vec3(hsv.z, hsv.z, hsv.z); +} + +vec3 cultmath_cycles_mix_hue(float t, vec3 col1, vec3 col2) +{ + vec3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + vec3 hsv = cultmath_cycles_rgb_to_hsv(col1); + vec3 shifted = cultmath_cycles_hsv_to_rgb(vec3(hsv2.x, hsv.y, hsv.z)); + return hsv2.y != 0.0 ? col1 + t * (shifted - col1) : col1; +} + +vec3 cultmath_cycles_mix_sat(float t, vec3 col1, vec3 col2) +{ + float tm = 1.0 - t; + vec3 hsv = cultmath_cycles_rgb_to_hsv(col1); + vec3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + return hsv.y != 0.0 ? cultmath_cycles_hsv_to_rgb(vec3(hsv.x, tm * hsv.y + t * hsv2.y, hsv.z)) : col1; +} + +vec3 cultmath_cycles_mix_val(float t, vec3 col1, vec3 col2) +{ + float tm = 1.0 - t; + vec3 hsv = cultmath_cycles_rgb_to_hsv(col1); + vec3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + return cultmath_cycles_hsv_to_rgb(vec3(hsv.x, hsv.y, tm * hsv.z + t * hsv2.z)); +} + +vec3 cultmath_cycles_mix_color(float t, vec3 col1, vec3 col2) +{ + vec3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + vec3 hsv = cultmath_cycles_rgb_to_hsv(col1); + vec3 shifted = cultmath_cycles_hsv_to_rgb(vec3(hsv2.x, hsv2.y, hsv.z)); + return hsv2.y != 0.0 ? col1 + t * (shifted - col1) : col1; +} + +vec3 cultmath_cycles_mix_soft(float t, vec3 col1, vec3 col2) +{ + float tm = 1.0 - t; + vec3 one = vec3(1.0, 1.0, 1.0); + vec3 scr = one - (one - col2) * (one - col1); + return tm * col1 + t * ((one - col1) * col2 * col1 + col1 * scr); +} + +vec3 cultmath_cycles_mix_linear(float t, vec3 col1, vec3 col2) +{ + return col1 + t * (2.0 * col2 + vec3(-1.0, -1.0, -1.0)); +} + +// ---- RGB to BW node (kernel/svm/convert.h NODE_CONVERT_CF) ---- + +float cultmath_cycles_rgb_to_bw(vec3 color) +{ + return color.x * CULTMATH_CYCLES_RGB_TO_Y_R + color.y * CULTMATH_CYCLES_RGB_TO_Y_G + color.z * CULTMATH_CYCLES_RGB_TO_Y_B; +} + +// ---- Color Ramp lookup (kernel/svm/ramp.h rgb_ramp_lookup, without extrapolation) ---- + +// Where a ramp of `size` table entries is read at t: (index, weight), the lower entry and the weight of the +// next one. The colour is table[index] when weight is 0 and (1 - weight) table[index] + weight table[index + 1] +// otherwise. The ramp table itself is the caller's; Blender's holds 257 entries, the ramp sampled at i / 256. +vec2 cultmath_cycles_ramp_index(float t, int size) +{ + float f = (t > 0.0 ? (t < 1.0 ? t : 1.0) : 0.0) * float(size - 1); + int index = clamp(int(f), 0, size - 1); + float lower = float(index); + return vec2(lower, f - lower); +} + +#endif diff --git a/packages/cultmath/shaders/CultMath.Cycles.hlsl b/packages/cultmath/shaders/CultMath.Cycles.hlsl new file mode 100644 index 00000000..d7731407 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Cycles.hlsl @@ -0,0 +1,363 @@ +#ifndef CULTMATH_CYCLES_HLSL +#define CULTMATH_CYCLES_HLSL + +// SPDX-License-Identifier: Apache-2.0 +// +// Cycles node semantics: what Blender's Cycles renderer computes for the Math, Map Range, Clamp, Mix and +// RGB to BW nodes and for a Color Ramp lookup, ported function by function from the Cycles kernel +// (intern/cycles of the Blender v5.2.2 tag; SPDX-FileCopyrightText: 2011-2022 Blender Foundation, Apache-2.0): +// kernel/svm/{math_util,map_range,clamp,mix,color_util,ramp,convert}.h, util/math_base.h, util/color.h and +// util/math_float3.h. Each function's comment names its Cycles source. Modified by GameCult: Cycles C++ +// becomes HLSL, a function per node operation, and the node's socket defaults and clamp options are left to +// the caller. This file is Apache-2.0 (section 4: it was changed); CultMath.hlsl, which includes it after its +// own definitions, is MIT (see THIRD-PARTY-NOTICES.md). math.Cycles.cs mirrors it bit for bit. +// +// Operands are finite floats. NaN and infinite operands are outside the oracle's reach and the mirror's. + +// FLT_EPSILON, the least epsilon a Compare node honours. +static const float CULTMATH_CYCLES_FLT_EPSILON = 1.1920929e-07; + +// The scene-linear luminance coefficients Cycles reads from Blender 5.2.2's default OCIO config +// (kernel/film linear_rgb_to_gray). The oracle fixture pins them with a case per primary. +static const float CULTMATH_CYCLES_RGB_TO_Y_R = 0.212639093; +static const float CULTMATH_CYCLES_RGB_TO_Y_G = 0.715169132; +static const float CULTMATH_CYCLES_RGB_TO_Y_B = 0.0721927434; + +// ---- Math node (kernel/svm/math_util.h svm_math; util/math_base.h) ---- + +// safe_divide +float cultmath_cycles_divide(float a, float b) { return b != 0.0 ? a / b : 0.0; } + +// safe_powf with compatible_powf. A negative base takes an integral exponent's parity; a base below zero +// with a fractional exponent is 0. +float cultmath_cycles_power(float a, float b) +{ + float whole = b >= 0.0 ? floor(b) : ceil(b); + if (a < 0.0 && b != whole) + return 0.0; + if (b == 0.0) + return 1.0; + if (a == 0.0) + return 0.0; + if (a < 0.0) + { + float magnitude = pow(-a, b); + // Odd exactly when the remainder is 1: an infinite exponent leaves NaN here and is even, as powf(a, +-inf) is never negative. + return b - 2.0 * floor(0.5 * b) == 1.0 ? -magnitude : magnitude; + } + return pow(a, b); +} + +// safe_logf +float cultmath_cycles_logarithm(float a, float b) +{ + if (a <= 0.0 || b <= 0.0) + return 0.0; + float denominator = log(b); + return denominator != 0.0 ? log(a) / denominator : 0.0; +} + +// safe_sqrtf +float cultmath_cycles_sqrt(float a) { return sqrt(max(a, 0.0)); } + +// inversesqrtf +float cultmath_cycles_inverse_sqrt(float a) { return a > 0.0 ? 1.0 / sqrt(a) : 0.0; } + +// safe_modulo is fmodf, the remainder with the dividend's sign, exactly. GLSL has no fmod, and a - b trunc(a / b) +// is wrong where the quotient rounds up to an integer or the product rounds (3 mod 0.3 is 0.29999995, not 0). +// So this subtracts the largest power-of-two multiple of the divisor not above the remainder until the +// remainder is below the divisor: every step is an exact subtraction, as in fmod. The loops are bounded by the +// binades a float spans. +float cultmath_cycles_modulo(float a, float b) +{ + float remainder = abs(a); + float divisor = abs(b); + for (int steps = 0; steps < 300 && remainder >= divisor && divisor > 0.0; steps++) + { + float multiple = divisor; + for (int doublings = 0; doublings < 300 && multiple * 2.0 <= remainder; doublings++) + multiple = multiple * 2.0; + remainder = remainder - multiple; + } + return b != 0.0 ? (a < 0.0 ? -remainder : remainder) : 0.0; +} + +// safe_floored_modulo; a build that contracts it differs by a bound stated at cycles_floored_modulo in math.Cycles.cs and the README +float cultmath_cycles_floored_modulo(float a, float b) { return b != 0.0 ? a - floor(a / b) * b : 0.0; } + +// wrapf (note the argument order: value, max, min); contraction bound as for floored_modulo +float cultmath_cycles_wrap(float value, float max_value, float min_value) +{ + float range = max_value - min_value; + return range != 0.0 ? value - (range * floor((value - min_value) / range)) : min_value; +} + +// floorf(safe_divide(a, b)) * b +float cultmath_cycles_snap(float a, float b) { return floor(cultmath_cycles_divide(a, b)) * b; } + +// pingpongf +float cultmath_cycles_pingpong(float a, float b) +{ + float scaled = (a - b) / (b * 2.0); + return b != 0.0 ? abs((scaled - floor(scaled)) * b * 2.0 - b) : 0.0; +} + +// smoothminf +float cultmath_cycles_smooth_min(float a, float b, float k) +{ + float h = max(k - abs(a - b), 0.0) / k; + return k != 0.0 ? min(a, b) - h * h * h * k * 0.16666667 : min(a, b); +} + +// -smoothminf(-a, -b, k) +float cultmath_cycles_smooth_max(float a, float b, float k) { return -cultmath_cycles_smooth_min(-a, -b, k); } + +// NODE_MATH_COMPARE +float cultmath_cycles_compare(float a, float b, float epsilon) +{ + return (a == b || abs(a - b) <= max(epsilon, CULTMATH_CYCLES_FLT_EPSILON)) ? 1.0 : 0.0; +} + +// NODE_MATH_ROUND +float cultmath_cycles_round(float a) { return floor(a + 0.5); } + +// NODE_MATH_TRUNC +float cultmath_cycles_trunc(float a) { return a >= 0.0 ? floor(a) : ceil(a); } + +// NODE_MATH_FRACTION +float cultmath_cycles_fract(float a) { return a - floor(a); } + +// compatible_signf +float cultmath_cycles_sign(float a) { return a == 0.0 ? 0.0 : (a < 0.0 ? -1.0 : 1.0); } + +// safe_asinf +float cultmath_cycles_arcsine(float a) { return asin(clamp(a, -1.0, 1.0)); } + +// safe_acosf +float cultmath_cycles_arccosine(float a) { return acos(clamp(a, -1.0, 1.0)); } + +// compatible_atan2 (a is y, b is x) +float cultmath_cycles_arctan2(float a, float b) { return (b == 0.0 && a == 0.0) ? 0.0 : atan2(a, b); } + +// ---- Map Range node (kernel/svm/map_range.h svm_node_map_range) ---- +// A Map Range node's Clamp option is a Clamp node of type Range on its result (MapRangeNode::expand): +// compose cultmath_cycles_clamp_range over these. + +float cultmath_cycles_map_range_linear(float value, float from_min, float from_max, float to_min, float to_max) +{ + float factor = (value - from_min) / (from_max - from_min); + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +float cultmath_cycles_map_range_stepped(float value, float from_min, float from_max, float to_min, float to_max, float steps) +{ + float factor = (value - from_min) / (from_max - from_min); + factor = steps > 0.0 ? floor(factor * (steps + 1.0)) / steps : 0.0; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// The value itself, not a normalized one, goes through smoothstep(from_min, from_max, .), flipped when +// from_min > from_max (util/math_base.h smoothstep). +float cultmath_cycles_map_range_smoothstep(float value, float from_min, float from_max, float to_min, float to_max) +{ + float low = min(from_min, from_max); + float high = max(from_min, from_max); + float t = (value - low) / (high - low); + float eased = value < low ? 0.0 : (value >= high ? 1.0 : (3.0 - 2.0 * t) * (t * t)); + float factor = from_min > from_max ? 1.0 - eased : eased; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// smootherstep of map_range.h, flipped when from_min > from_max. +float cultmath_cycles_map_range_smootherstep(float value, float from_min, float from_max, float to_min, float to_max) +{ + float low = min(from_min, from_max); + float high = max(from_min, from_max); + float x = clamp(cultmath_cycles_divide(value - low, high - low), 0.0, 1.0); + float eased = x * x * x * (x * (x * 6.0 - 15.0) + 10.0); + float factor = from_min > from_max ? 1.0 - eased : eased; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// ---- Clamp node (kernel/svm/clamp.h svm_node_clamp) ---- + +// Type Min Max +float cultmath_cycles_clamp_minmax(float value, float min_value, float max_value) { return clamp(value, min_value, max_value); } + +// Type Range: the bounds swap when min_value > max_value. +float cultmath_cycles_clamp_range(float value, float min_value, float max_value) +{ + return min_value > max_value ? clamp(value, max_value, min_value) : clamp(value, min_value, max_value); +} + +// ---- Mix node (kernel/svm/mix.h, color_util.h) ---- +// Factor clamping (svm_node_mix_color's saturatef) and result clamping (saturate) are the caller's. + +// svm_node_mix_float +float cultmath_cycles_mix_float(float t, float a, float b) { return a * (1.0 - t) + b * t; } + +// svm_node_mix_vector +float3 cultmath_cycles_mix_vector(float t, float3 a, float3 b) { return a * (float3(1.0, 1.0, 1.0) - t) + b * t; } + +float3 cultmath_cycles_mix_blend(float t, float3 col1, float3 col2) { return col1 + t * (col2 - col1); } + +float3 cultmath_cycles_mix_add(float t, float3 col1, float3 col2) { return col1 + t * ((col1 + col2) - col1); } + +float3 cultmath_cycles_mix_mul(float t, float3 col1, float3 col2) { return col1 + t * (col1 * col2 - col1); } + +float3 cultmath_cycles_mix_screen(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 one = float3(1.0, 1.0, 1.0); + return one - (float3(tm, tm, tm) + t * (one - col2)) * (one - col1); +} + +float3 cultmath_cycles_mix_overlay(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + return float3( + col1.x < 0.5 ? col1.x * (tm + 2.0 * t * col2.x) : 1.0 - (tm + 2.0 * t * (1.0 - col2.x)) * (1.0 - col1.x), + col1.y < 0.5 ? col1.y * (tm + 2.0 * t * col2.y) : 1.0 - (tm + 2.0 * t * (1.0 - col2.y)) * (1.0 - col1.y), + col1.z < 0.5 ? col1.z * (tm + 2.0 * t * col2.z) : 1.0 - (tm + 2.0 * t * (1.0 - col2.z)) * (1.0 - col1.z)); +} + +float3 cultmath_cycles_mix_sub(float t, float3 col1, float3 col2) { return col1 + t * ((col1 - col2) - col1); } + +float3 cultmath_cycles_mix_div(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + return float3( + col2.x != 0.0 ? tm * col1.x + t * col1.x / col2.x : col1.x, + col2.y != 0.0 ? tm * col1.y + t * col1.y / col2.y : col1.y, + col2.z != 0.0 ? tm * col1.z + t * col1.z / col2.z : col1.z); +} + +float3 cultmath_cycles_mix_diff(float t, float3 col1, float3 col2) { return col1 + t * (abs(col1 - col2) - col1); } + +float3 cultmath_cycles_mix_exclusion(float t, float3 col1, float3 col2) +{ + return max(col1 + t * ((col1 + col2 - 2.0 * col1 * col2) - col1), float3(0.0, 0.0, 0.0)); +} + +float3 cultmath_cycles_mix_dark(float t, float3 col1, float3 col2) { return col1 + t * (min(col1, col2) - col1); } + +float3 cultmath_cycles_mix_light(float t, float3 col1, float3 col2) { return col1 + t * (max(col1, col2) - col1); } + +float3 cultmath_cycles_mix_dodge(float t, float3 col1, float3 col2) +{ + float3 divisor = float3(1.0, 1.0, 1.0) - t * col2; + return float3( + col1.x != 0.0 ? (divisor.x <= 0.0 ? 1.0 : min(col1.x / divisor.x, 1.0)) : col1.x, + col1.y != 0.0 ? (divisor.y <= 0.0 ? 1.0 : min(col1.y / divisor.y, 1.0)) : col1.y, + col1.z != 0.0 ? (divisor.z <= 0.0 ? 1.0 : min(col1.z / divisor.z, 1.0)) : col1.z); +} + +float3 cultmath_cycles_mix_burn(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 divisor = tm + t * col2; + float3 burnt = float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - col1) / divisor; + return float3( + divisor.x <= 0.0 ? 0.0 : clamp(burnt.x, 0.0, 1.0), + divisor.y <= 0.0 ? 0.0 : clamp(burnt.y, 0.0, 1.0), + divisor.z <= 0.0 ? 0.0 : clamp(burnt.z, 0.0, 1.0)); +} + +// rgb_to_hsv of util/color.h +float3 cultmath_cycles_rgb_to_hsv(float3 rgb) +{ + float cmax = max(rgb.x, max(rgb.y, rgb.z)); + float cmin = min(rgb.x, min(rgb.y, rgb.z)); + float cdelta = cmax - cmin; + float s = cmax != 0.0 ? cdelta / cmax : 0.0; + float3 c = (float3(cmax, cmax, cmax) - rgb) / cdelta; + float h = rgb.x == cmax ? c.z - c.y : (rgb.y == cmax ? 2.0 + c.x - c.z : 4.0 + c.y - c.x); + h = h * 0.16666667; // Cycles' kernel is built with reciprocal math: h /= 6.0f computes h * (1 / 6.0f). + h = h < 0.0 ? h + 1.0 : h; + return float3(s != 0.0 ? h : 0.0, s, cmax); +} + +// hsv_to_rgb of util/color.h +float3 cultmath_cycles_hsv_to_rgb(float3 hsv) +{ + float h = hsv.x == 1.0 ? 0.0 : hsv.x; + h = h * 6.0; + float i = floor(h); + float f = h - i; + float p = hsv.z * (1.0 - hsv.y); + float q = hsv.z * (1.0 - (hsv.y * f)); + float t = hsv.z * (1.0 - (hsv.y * (1.0 - f))); + float3 rgb = i == 0.0 ? float3(hsv.z, t, p) : + (i == 1.0 ? float3(q, hsv.z, p) : + (i == 2.0 ? float3(p, hsv.z, t) : + (i == 3.0 ? float3(p, q, hsv.z) : + (i == 4.0 ? float3(t, p, hsv.z) : float3(hsv.z, p, q))))); + return hsv.y != 0.0 ? rgb : float3(hsv.z, hsv.z, hsv.z); +} + +float3 cultmath_cycles_mix_hue(float t, float3 col1, float3 col2) +{ + float3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + float3 hsv = cultmath_cycles_rgb_to_hsv(col1); + float3 shifted = cultmath_cycles_hsv_to_rgb(float3(hsv2.x, hsv.y, hsv.z)); + return hsv2.y != 0.0 ? col1 + t * (shifted - col1) : col1; +} + +float3 cultmath_cycles_mix_sat(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 hsv = cultmath_cycles_rgb_to_hsv(col1); + float3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + return hsv.y != 0.0 ? cultmath_cycles_hsv_to_rgb(float3(hsv.x, tm * hsv.y + t * hsv2.y, hsv.z)) : col1; +} + +float3 cultmath_cycles_mix_val(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 hsv = cultmath_cycles_rgb_to_hsv(col1); + float3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + return cultmath_cycles_hsv_to_rgb(float3(hsv.x, hsv.y, tm * hsv.z + t * hsv2.z)); +} + +float3 cultmath_cycles_mix_color(float t, float3 col1, float3 col2) +{ + float3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + float3 hsv = cultmath_cycles_rgb_to_hsv(col1); + float3 shifted = cultmath_cycles_hsv_to_rgb(float3(hsv2.x, hsv2.y, hsv.z)); + return hsv2.y != 0.0 ? col1 + t * (shifted - col1) : col1; +} + +float3 cultmath_cycles_mix_soft(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 one = float3(1.0, 1.0, 1.0); + float3 scr = one - (one - col2) * (one - col1); + return tm * col1 + t * ((one - col1) * col2 * col1 + col1 * scr); +} + +float3 cultmath_cycles_mix_linear(float t, float3 col1, float3 col2) +{ + return col1 + t * (2.0 * col2 + float3(-1.0, -1.0, -1.0)); +} + +// ---- RGB to BW node (kernel/svm/convert.h NODE_CONVERT_CF) ---- + +float cultmath_cycles_rgb_to_bw(float3 color) +{ + return color.x * CULTMATH_CYCLES_RGB_TO_Y_R + color.y * CULTMATH_CYCLES_RGB_TO_Y_G + color.z * CULTMATH_CYCLES_RGB_TO_Y_B; +} + +// ---- Color Ramp lookup (kernel/svm/ramp.h rgb_ramp_lookup, without extrapolation) ---- + +// Where a ramp of `size` table entries is read at t: (index, weight), the lower entry and the weight of the +// next one. The colour is table[index] when weight is 0 and (1 - weight) table[index] + weight table[index + 1] +// otherwise. The ramp table itself is the caller's; Blender's holds 257 entries, the ramp sampled at i / 256. +float2 cultmath_cycles_ramp_index(float t, int size) +{ + float f = (t > 0.0 ? (t < 1.0 ? t : 1.0) : 0.0) * (float)(size - 1); + int index = clamp((int)f, 0, size - 1); + float lower = (float)index; + return float2(lower, f - lower); +} + +#endif diff --git a/packages/cultmath/shaders/CultMath.Cycles.hlsl.meta b/packages/cultmath/shaders/CultMath.Cycles.hlsl.meta new file mode 100644 index 00000000..c455a809 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Cycles.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e7f15f6042b54d728ada5e82dee741b4 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/shaders/CultMath.Interval.hlsl b/packages/cultmath/shaders/CultMath.Interval.hlsl new file mode 100644 index 00000000..bc084ace --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Interval.hlsl @@ -0,0 +1,133 @@ +#ifndef CULTMATH_INTERVAL_HLSL +#define CULTMATH_INTERVAL_HLSL + +// Interval arithmetic over float2(lo, hi), lo <= hi, both finite. Every cultmath_iv_* function returns +// an interval containing f(x) for every x in its input intervals, mirroring math.Interval.cs bit for +// bit; see that file and docs/design.md ("Intervals") for each op's enclosure and its ulp widening. +// Included by CultMath.hlsl after its own definitions of cultmath_smoothstep and cultmath_snoise. + +// Lipschitz constant of cultmath_snoise(float3); provenance in math.Interval.cs (SNOISE_LIPSCHITZ). +static const float CULTMATH_SNOISE_LIPSCHITZ = 7.9640074; + +// Lipschitz constant of cultmath_snoise(float2); provenance in math.Interval.cs (SNOISE2_LIPSCHITZ). +static const float CULTMATH_SNOISE2_LIPSCHITZ = 8.117002; + +float2 cultmath_iv_point(float value) { return float2(value, value); } +float2 cultmath_iv_add(float2 a, float2 b) { return float2(a.x + b.x, a.y + b.y); } +float2 cultmath_iv_sub(float2 a, float2 b) { return float2(a.x - b.y, a.y - b.x); } +float2 cultmath_iv_neg(float2 a) { return float2(-a.y, -a.x); } + +float2 cultmath_iv_mul(float2 a, float2 b) +{ + float p0 = a.x * b.x; + float p1 = a.x * b.y; + float p2 = a.y * b.x; + float p3 = a.y * b.y; + return float2(min(min(p0, p1), min(p2, p3)), max(max(p0, p1), max(p2, p3))); +} + +float2 cultmath_iv_scale(float2 a, float s) { return s >= 0.0 ? float2(a.x * s, a.y * s) : float2(a.y * s, a.x * s); } + +float2 cultmath_iv_abs(float2 a) +{ + if (a.x >= 0.0) + return a; + if (a.y <= 0.0) + return float2(-a.y, -a.x); + return float2(0.0, max(-a.x, a.y)); +} + +float2 cultmath_iv_min(float2 a, float2 b) { return float2(min(a.x, b.x), min(a.y, b.y)); } +float2 cultmath_iv_max(float2 a, float2 b) { return float2(max(a.x, b.x), max(a.y, b.y)); } + +float2 cultmath_iv_sqr(float2 a) +{ + float l = a.x * a.x; + float h = a.y * a.y; + if (a.x >= 0.0) + return float2(l, h); + if (a.y <= 0.0) + return float2(h, l); + return float2(0.0, max(l, h)); +} + +float2 cultmath_iv_sqrt(float2 a) { return float2(sqrt(max(a.x, 0.0)), sqrt(max(a.y, 0.0))); } + +// Widened by one ulp on each side: exp is not required to be correctly rounded. +float2 cultmath_iv_exp(float2 a) +{ + float lo = exp(a.x); + float hi = exp(a.y); + return float2(lo > 0.0 ? asfloat(asuint(lo) - 1u) : 0.0, asfloat(asuint(hi) + 1u)); +} + +float2 cultmath_iv_clamp(float2 a, float minimum, float maximum) +{ + return float2(cultmath_clamp(a.x, minimum, maximum), cultmath_clamp(a.y, minimum, maximum)); +} + +float2 cultmath_iv_saturate(float2 a) { return float2(cultmath_saturate(a.x), cultmath_saturate(a.y)); } + +// The endpoints, ordered, widened by one ulp inside [0, 1]: the float32 evaluation of smoothstep is +// monotone only to within one ulp. +float2 cultmath_iv_smoothstep(float minimum, float maximum, float2 a) +{ + float s0 = cultmath_smoothstep(minimum, maximum, a.x); + float s1 = cultmath_smoothstep(minimum, maximum, a.y); + float lo = min(s0, s1); + float hi = max(s0, s1); + return float2(lo > 0.0 ? asfloat(asuint(lo) - 1u) : 0.0, hi < 1.0 ? asfloat(asuint(hi) + 1u) : 1.0); +} + +// The natural interval extension of x + (y - x) * amount, which is how cultmath_lerp evaluates. +float2 cultmath_iv_lerp(float2 a, float2 b, float amount) { return cultmath_iv_add(a, cultmath_iv_scale(cultmath_iv_sub(b, a), amount)); } + +// [n - L r, n + L r] intersected with [-1, 1], n = cultmath_snoise(centre). One snoise, value only. +float2 cultmath_iv_snoise_ball(float3 centre, float radius) +{ + float n = cultmath_snoise(centre); + float e = CULTMATH_SNOISE_LIPSCHITZ * radius; + return float2(max(n - e, -1.0), min(n + e, 1.0)); +} + +// The 2D overload: [n - L2 r, n + L2 r] intersected with [-1, 1], n = cultmath_snoise(centre). One snoise, value only. +float2 cultmath_iv_snoise_ball(float2 centre, float radius) +{ + float n = cultmath_snoise(centre); + float e = CULTMATH_SNOISE2_LIPSCHITZ * radius; + return float2(max(n - e, -1.0), min(n + e, 1.0)); +} + +// Octave sum of cultmath_iv_snoise_ball, compounding frequency and amplitude as the value-and-gradient fBm does. +float2 cultmath_iv_fbm_ball(float3 centre, float radius, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float2 sum = float2(0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + sum = cultmath_iv_add(sum, cultmath_iv_scale(cultmath_iv_snoise_ball(centre * frequency, radius * abs(frequency)), amplitude)); + frequency *= lacunarity; + amplitude *= gain; + } + + return sum; +} + +// A ball (xyz centre, w radius) enclosing every point of every ray of a screen tile over the depth segment +// [z0, z1], warped by at most warp. Camera frame: pinhole at the origin looking down +z, ray (m z, z). +// footprintPerDepth = N / (sqrt(2) f) for an N x N tile at focal length f. The radius is widened by +// (|c|_1 + radius) 2^-20, which covers the ball's own float32 rounding. Derivation in math.Interval.cs. +float4 cultmath_iv_frustum_ball(float2 centreSlope, float z0, float z1, float footprintPerDepth, float warp) +{ + float zm = (z0 + z1) * 0.5; + float axis = sqrt(centreSlope.x * centreSlope.x + centreSlope.y * centreSlope.y + 1.0); + float cx = centreSlope.x * zm; + float cy = centreSlope.y * zm; + float radius = (z1 - z0) * 0.5 * axis + z1 * footprintPerDepth + warp; + radius += (abs(cx) + abs(cy) + abs(zm) + radius) * 9.5367431640625e-7; + return float4(cx, cy, zm, radius); +} + +#endif diff --git a/packages/cultmath/shaders/CultMath.Interval.hlsl.meta b/packages/cultmath/shaders/CultMath.Interval.hlsl.meta new file mode 100644 index 00000000..a22ec627 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Interval.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4d8a899561654ac990cab0bf48658cc1 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/shaders/CultMath.Phacelle.glsl b/packages/cultmath/shaders/CultMath.Phacelle.glsl new file mode 100644 index 00000000..c22c67c4 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Phacelle.glsl @@ -0,0 +1,99 @@ +// Generated from shaders/CultMath.Phacelle.hlsl by GlslLowering (packages/cultmath/tests/CultMath.Tests/GlslLowering.cs). Do not edit; regenerate with CULTMATH_WRITE_GLSL=1 dotnet test --filter GlslMirrorTests. MPL-2.0; requires CultMath.glsl before it. +#ifndef CULTMATH_PHACELLE_GLSL +#define CULTMATH_PHACELLE_GLSL +// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of +// the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. +// +// Phacelle noise. Copyright (c) 2025 Rune Skovbo Johansen (Shadertoy t3dyWl; MPL-2.0), read from the +// C# port PhacelleNoise in lpmitchell/AdvancedTerrainErosion, converted to burstable C# by Luke +// Mitchell (2026). Modified by GameCult: 3D cells, a caller-supplied stripe wave vector, an exact +// gradient and exact pruning. This file is an MPL-2.0 file; CultMath.hlsl, which includes it after +// its own definitions of CULTMATH_TAU and cultmath_pcg3d, is MIT (see THIRD-PARTY-NOTICES.md). + +// Invariant 8's struct return shape for cultmath_phacelle, compared field by field and bit for bit +// against CultMath.CultPhasor, same field order. +struct CultPhasor +{ + vec4 cosine; + vec4 sine; +}; + +// Johansen's Phacelle noise on 3D cells. See math.phacelle's comment (math.Phacelle.cs) for the stripe wave +// vector, the weight, the normalization, the exact gradient and why the prune is exact. Mirrors +// the C# body operation for operation; the C#-only internal overload that switches the prune off +// has no shader twin. +CultPhasor cultmath_phacelle(vec3 p, vec3 side, float offset, float normalization) +{ + vec3 cell = floor(p); + vec3 local = p - cell; + float phaseOffset = offset * CULTMATH_TAU; + float sumW = 0.0; + float sumCos = 0.0; + float sumSin = 0.0; + vec3 gradW = vec3(0.0, 0.0, 0.0); + vec3 gradCos = vec3(0.0, 0.0, 0.0); + vec3 gradSin = vec3(0.0, 0.0, 0.0); + + for (int dz = -1; dz <= 2; dz++) + { + float gz = max(0.0, abs(local.z - float(dz)) - 0.5); + for (int dy = -1; dy <= 2; dy++) + { + float gy = max(0.0, abs(local.y - float(dy)) - 0.5); + for (int dx = -1; dx <= 2; dx++) + { + float gx = max(0.0, abs(local.x - float(dx)) - 0.5); + if (gx * gx + gy * gy + gz * gz >= 2.25) + continue; + + vec3 gridStep = vec3(dx, dy, dz); + ivec3 hash = cultmath_pcg3d(ivec3(cell + gridStep)); + vec3 jitter = vec3( + float(uint(hash.x) >> 8) * (1.0 / 16777216.0) - 0.5, + float(uint(hash.y) >> 8) * (1.0 / 16777216.0) - 0.5, + float(uint(hash.z) >> 8) * (1.0 / 16777216.0) - 0.5); + vec3 v = local - gridStep - jitter; + float falloff = exp(-2.0 * dot(v, v)); + float w = max(0.0, falloff - 0.01111); + vec3 dw = w > 0.0 ? (-4.0 * falloff) * v : vec3(0.0, 0.0, 0.0); + float phase = dot(v, side) + phaseOffset; + float c = cos(phase); + float s = sin(phase); + + sumW += w; + sumCos += w * c; + sumSin += w * s; + gradW += dw; + gradCos += dw * c - (w * s) * side; + gradSin += dw * s + (w * c) * side; + } + } + } + + float invW = 1.0 / sumW; + float rawCos = sumCos * invW; + float rawSin = sumSin * invW; + vec3 gradRawCos = (gradCos - rawCos * gradW) * invW; + vec3 gradRawSin = (gradSin - rawSin * gradW) * invW; + float rawLength = sqrt(rawCos * rawCos + rawSin * rawSin); + float floorLength = 1.0 - normalization; + + CultPhasor result; + if (rawLength > floorLength) + { + float outCos = rawCos / rawLength; + float outSin = rawSin / rawLength; + vec3 gradLength = (rawCos * gradRawCos + rawSin * gradRawSin) / rawLength; + result.cosine = vec4((gradRawCos - outCos * gradLength) / rawLength, outCos); + result.sine = vec4((gradRawSin - outSin * gradLength) / rawLength, outSin); + } + else + { + result.cosine = vec4(gradRawCos / floorLength, rawCos / floorLength); + result.sine = vec4(gradRawSin / floorLength, rawSin / floorLength); + } + + return result; +} + +#endif diff --git a/packages/cultmath/shaders/CultMath.Phacelle.hlsl b/packages/cultmath/shaders/CultMath.Phacelle.hlsl new file mode 100644 index 00000000..deb47813 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Phacelle.hlsl @@ -0,0 +1,99 @@ +#ifndef CULTMATH_PHACELLE_HLSL +#define CULTMATH_PHACELLE_HLSL + +// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of +// the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. +// +// Phacelle noise. Copyright (c) 2025 Rune Skovbo Johansen (Shadertoy t3dyWl; MPL-2.0), read from the +// C# port PhacelleNoise in lpmitchell/AdvancedTerrainErosion, converted to burstable C# by Luke +// Mitchell (2026). Modified by GameCult: 3D cells, a caller-supplied stripe wave vector, an exact +// gradient and exact pruning. This file is an MPL-2.0 file; CultMath.hlsl, which includes it after +// its own definitions of CULTMATH_TAU and cultmath_pcg3d, is MIT (see THIRD-PARTY-NOTICES.md). + +// Invariant 8's struct return shape for cultmath_phacelle, compared field by field and bit for bit +// against CultMath.CultPhasor, same field order. +struct CultPhasor +{ + float4 cosine; + float4 sine; +}; + +// Johansen's Phacelle noise on 3D cells. See math.phacelle's comment (math.Phacelle.cs) for the stripe wave +// vector, the weight, the normalization, the exact gradient and why the prune is exact. Mirrors +// the C# body operation for operation; the C#-only internal overload that switches the prune off +// has no shader twin. +CultPhasor cultmath_phacelle(float3 p, float3 side, float offset, float normalization) +{ + float3 cell = floor(p); + float3 local = p - cell; + float phaseOffset = offset * CULTMATH_TAU; + float sumW = 0.0; + float sumCos = 0.0; + float sumSin = 0.0; + float3 gradW = float3(0.0, 0.0, 0.0); + float3 gradCos = float3(0.0, 0.0, 0.0); + float3 gradSin = float3(0.0, 0.0, 0.0); + + for (int dz = -1; dz <= 2; dz++) + { + float gz = max(0.0, abs(local.z - (float)dz) - 0.5); + for (int dy = -1; dy <= 2; dy++) + { + float gy = max(0.0, abs(local.y - (float)dy) - 0.5); + for (int dx = -1; dx <= 2; dx++) + { + float gx = max(0.0, abs(local.x - (float)dx) - 0.5); + if (gx * gx + gy * gy + gz * gz >= 2.25) + continue; + + float3 gridStep = float3(dx, dy, dz); + int3 hash = cultmath_pcg3d(int3(cell + gridStep)); + float3 jitter = float3( + (float)((uint)hash.x >> 8) * (1.0 / 16777216.0) - 0.5, + (float)((uint)hash.y >> 8) * (1.0 / 16777216.0) - 0.5, + (float)((uint)hash.z >> 8) * (1.0 / 16777216.0) - 0.5); + float3 v = local - gridStep - jitter; + float falloff = exp(-2.0 * dot(v, v)); + float w = max(0.0, falloff - 0.01111); + float3 dw = w > 0.0 ? (-4.0 * falloff) * v : float3(0.0, 0.0, 0.0); + float phase = dot(v, side) + phaseOffset; + float c = cos(phase); + float s = sin(phase); + + sumW += w; + sumCos += w * c; + sumSin += w * s; + gradW += dw; + gradCos += dw * c - (w * s) * side; + gradSin += dw * s + (w * c) * side; + } + } + } + + float invW = 1.0 / sumW; + float rawCos = sumCos * invW; + float rawSin = sumSin * invW; + float3 gradRawCos = (gradCos - rawCos * gradW) * invW; + float3 gradRawSin = (gradSin - rawSin * gradW) * invW; + float rawLength = sqrt(rawCos * rawCos + rawSin * rawSin); + float floorLength = 1.0 - normalization; + + CultPhasor result; + if (rawLength > floorLength) + { + float outCos = rawCos / rawLength; + float outSin = rawSin / rawLength; + float3 gradLength = (rawCos * gradRawCos + rawSin * gradRawSin) / rawLength; + result.cosine = float4((gradRawCos - outCos * gradLength) / rawLength, outCos); + result.sine = float4((gradRawSin - outSin * gradLength) / rawLength, outSin); + } + else + { + result.cosine = float4(gradRawCos / floorLength, rawCos / floorLength); + result.sine = float4(gradRawSin / floorLength, rawSin / floorLength); + } + + return result; +} + +#endif diff --git a/packages/cultmath/shaders/CultMath.Phacelle.hlsl.meta b/packages/cultmath/shaders/CultMath.Phacelle.hlsl.meta new file mode 100644 index 00000000..69308465 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.Phacelle.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e07a3b95c1d84f2aa6b83d4c5f19a0d7 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/shaders/CultMath.glsl b/packages/cultmath/shaders/CultMath.glsl new file mode 100644 index 00000000..6ebf3f36 --- /dev/null +++ b/packages/cultmath/shaders/CultMath.glsl @@ -0,0 +1,1270 @@ +// Generated from shaders/CultMath.hlsl and CultMath.Interval.hlsl and CultMath.Affine.hlsl by GlslLowering (packages/cultmath/tests/CultMath.Tests/GlslLowering.cs). Do not edit; regenerate with CULTMATH_WRITE_GLSL=1 dotnet test --filter GlslMirrorTests. MIT. cultmath_phacelle is in CultMath.Phacelle.glsl, to be concatenated after this file by consumers that call it. cultmath_cycles_divide, cultmath_cycles_power, cultmath_cycles_logarithm, cultmath_cycles_sqrt, cultmath_cycles_inverse_sqrt, cultmath_cycles_modulo, cultmath_cycles_floored_modulo, cultmath_cycles_wrap, cultmath_cycles_snap, cultmath_cycles_pingpong, cultmath_cycles_smooth_min, cultmath_cycles_smooth_max, cultmath_cycles_compare, cultmath_cycles_round, cultmath_cycles_trunc, cultmath_cycles_fract, cultmath_cycles_sign, cultmath_cycles_arcsine, cultmath_cycles_arccosine, cultmath_cycles_arctan2, cultmath_cycles_map_range_linear, cultmath_cycles_map_range_stepped, cultmath_cycles_map_range_smoothstep, cultmath_cycles_map_range_smootherstep, cultmath_cycles_clamp_minmax, cultmath_cycles_clamp_range, cultmath_cycles_mix_float, cultmath_cycles_mix_vector, cultmath_cycles_mix_blend, cultmath_cycles_mix_add, cultmath_cycles_mix_mul, cultmath_cycles_mix_screen, cultmath_cycles_mix_overlay, cultmath_cycles_mix_sub, cultmath_cycles_mix_div, cultmath_cycles_mix_diff, cultmath_cycles_mix_exclusion, cultmath_cycles_mix_dark, cultmath_cycles_mix_light, cultmath_cycles_mix_dodge, cultmath_cycles_mix_burn, cultmath_cycles_rgb_to_hsv, cultmath_cycles_hsv_to_rgb, cultmath_cycles_mix_hue, cultmath_cycles_mix_sat, cultmath_cycles_mix_val, cultmath_cycles_mix_color, cultmath_cycles_mix_soft, cultmath_cycles_mix_linear, cultmath_cycles_rgb_to_bw, cultmath_cycles_ramp_index is in CultMath.Cycles.glsl, to be concatenated after this file by consumers that call it. +#ifndef CULTMATH_GLSL +#define CULTMATH_GLSL +// CultMath HLSL mirror. +// +// HLSL already owns the vec2/vec3/vec4 type names and most primitive +// intrinsics. This include names the CultMath semantic surface explicitly so +// shader code, C# wrappers, and Rust/native parity fixtures can share the same +// small vocabulary without local helper drift. + +const float CULTMATH_PI = 3.14159265358979323846; +const float CULTMATH_TAU = 6.28318530717958647692; +const float CULTMATH_HALF_PI = 1.57079632679489661923; + +float cultmath_radians(float degrees_value) { return degrees_value * (CULTMATH_PI / 180.0); } +float cultmath_degrees(float radians_value) { return radians_value * (180.0 / CULTMATH_PI); } + +float cultmath_frac(float value) { return value - floor(value); } +vec2 cultmath_frac(vec2 value) { return value - floor(value); } +vec3 cultmath_frac(vec3 value) { return value - floor(value); } +vec4 cultmath_frac(vec4 value) { return value - floor(value); } + +float cultmath_clamp(float value, float minimum, float maximum) { return min(max(value, minimum), maximum); } +vec2 cultmath_clamp(vec2 value, vec2 minimum, vec2 maximum) { return min(max(value, minimum), maximum); } +vec3 cultmath_clamp(vec3 value, vec3 minimum, vec3 maximum) { return min(max(value, minimum), maximum); } +vec4 cultmath_clamp(vec4 value, vec4 minimum, vec4 maximum) { return min(max(value, minimum), maximum); } + +// DXIL Saturate is FMin(1, FMax(0, x)); dxc lowers min/max to the same FMin/FMax, NaN rules included. +float cultmath_saturate(float value) { return min(1.0, max(0.0, value)); } +vec2 cultmath_saturate(vec2 value) { return min(vec2(1.0, 1.0), max(vec2(0.0, 0.0), value)); } +vec3 cultmath_saturate(vec3 value) { return min(vec3(1.0, 1.0, 1.0), max(vec3(0.0, 0.0, 0.0), value)); } +vec4 cultmath_saturate(vec4 value) { return min(vec4(1.0, 1.0, 1.0, 1.0), max(vec4(0.0, 0.0, 0.0, 0.0), value)); } + +float cultmath_lerp(float start, float end, float amount) { return start + (end - start) * amount; } +vec2 cultmath_lerp(vec2 start, vec2 end, vec2 amount) { return start + (end - start) * amount; } +vec3 cultmath_lerp(vec3 start, vec3 end, vec3 amount) { return start + (end - start) * amount; } +vec4 cultmath_lerp(vec4 start, vec4 end, vec4 amount) { return start + (end - start) * amount; } + +float cultmath_step(float edge, float value) { return value < edge ? 0.0 : 1.0; } +vec2 cultmath_step(vec2 edge, vec2 value) { return vec2(cultmath_step(edge.x, value.x), cultmath_step(edge.y, value.y)); } +vec3 cultmath_step(vec3 edge, vec3 value) { return vec3(cultmath_step(edge.x, value.x), cultmath_step(edge.y, value.y), cultmath_step(edge.z, value.z)); } +vec4 cultmath_step(vec4 edge, vec4 value) { return vec4(cultmath_step(edge.x, value.x), cultmath_step(edge.y, value.y), cultmath_step(edge.z, value.z), cultmath_step(edge.w, value.w)); } + +float cultmath_smoothstep(float minimum, float maximum, float value) +{ + float t = cultmath_saturate((value - minimum) / (maximum - minimum)); + return t * t * (3.0 - 2.0 * t); +} + +vec2 cultmath_smoothstep(vec2 minimum, vec2 maximum, vec2 value) +{ + vec2 t = cultmath_saturate((value - minimum) / (maximum - minimum)); + return t * t * (vec2(3.0, 3.0) - vec2(2.0, 2.0) * t); +} + +vec3 cultmath_smoothstep(vec3 minimum, vec3 maximum, vec3 value) +{ + vec3 t = cultmath_saturate((value - minimum) / (maximum - minimum)); + return t * t * (vec3(3.0, 3.0, 3.0) - vec3(2.0, 2.0, 2.0) * t); +} + +vec4 cultmath_smoothstep(vec4 minimum, vec4 maximum, vec4 value) +{ + vec4 t = cultmath_saturate((value - minimum) / (maximum - minimum)); + return t * t * (vec4(3.0, 3.0, 3.0, 3.0) - vec4(2.0, 2.0, 2.0, 2.0) * t); +} + +float cultmath_smoothstep01(float value) { return cultmath_smoothstep(0.0, 1.0, value); } + +float cultmath_smootherstep(float value) +{ + value = cultmath_saturate(value); + return value * value * value * (value * (value * 6.0 - 15.0) + 10.0); +} + +vec2 cultmath_snoise_mod289(vec2 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } +vec3 cultmath_snoise_mod289(vec3 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } +vec4 cultmath_snoise_mod289(vec4 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } +vec3 cultmath_snoise_permute(vec3 value) { return cultmath_snoise_mod289(((value * 34.0) + 10.0) * value); } +vec4 cultmath_snoise_permute(vec4 value) { return cultmath_snoise_mod289(((value * 34.0) + 10.0) * value); } + +// Ashima Arts / Ian McEwan 3D simplex noise (MIT), same float32 evaluation +// order as the C# math.snoise(vec3) mirror. Ties resolve in simplexnoise1234's +// total order; see math.snoise. +float cultmath_snoise(vec3 value) +{ + vec2 c = vec2(1.0 / 6.0, 1.0 / 3.0); + vec3 i = floor(value + dot(value, c.yyy)); + vec3 x0 = value - i + dot(i, c.xxx); + vec3 g = vec3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); + vec3 l = 1.0 - g; + vec3 i1 = min(g.xyz, l.zxy); + vec3 i2 = max(g.xyz, l.zxy); + vec3 x1 = x0 - i1 + c.xxx; + vec3 x2 = x0 - i2 + c.yyy; + vec3 x3 = x0 - 0.5; + + i = cultmath_snoise_mod289(i); + vec4 p = cultmath_snoise_permute(cultmath_snoise_permute(cultmath_snoise_permute( + i.z + vec4(0.0, i1.z, i2.z, 1.0)) + i.y + vec4(0.0, i1.y, i2.y, 1.0)) + i.x + vec4(0.0, i1.x, i2.x, 1.0)); + + const float n_ = 0.142857142857; + vec3 ns = vec3(2.0 * n_, 0.5 * n_ - 1.0, n_); + vec4 j = p - 49.0 * floor(p * ns.z * ns.z); + vec4 x_ = floor(j * ns.z); + vec4 y_ = floor(j - 7.0 * x_); + vec4 x = x_ * ns.x + ns.yyyy; + vec4 y = y_ * ns.x + ns.yyyy; + vec4 h = 1.0 - abs(x) - abs(y); + + vec4 b0 = vec4(x.xy, y.xy); + vec4 b1 = vec4(x.zw, y.zw); + vec4 s0 = floor(b0) * 2.0 + 1.0; + vec4 s1 = floor(b1) * 2.0 + 1.0; + vec4 sh = -step(h, vec4(0.0, 0.0, 0.0, 0.0)); + vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + vec3 p0 = vec3(a0.xy, h.x); + vec3 p1 = vec3(a0.zw, h.y); + vec3 p2 = vec3(a1.xy, h.z); + vec3 p3 = vec3(a1.zw, h.w); + vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + vec4 m = max(0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + m = m * m; + return 105.0 * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); +} + +float cultmath_snoise(vec2 value) +{ + vec4 c = vec4( + 0.211324865405187, + 0.366025403784439, + -0.577350269189626, + 0.024390243902439); + vec2 i = floor(value + dot(value, c.yy)); + vec2 x0 = value - i + dot(i, c.xx); + vec2 i1 = x0.x > x0.y ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + vec4 x12 = vec4(x0.x + c.x - i1.x, x0.y + c.x - i1.y, x0.x + c.z, x0.y + c.z); + + i = cultmath_snoise_mod289(i); + vec3 p = cultmath_snoise_permute( + cultmath_snoise_permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0)); + vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m *= m; + m *= m; + + vec3 x = 2.0 * fract(p * c.w) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + + vec3 g = vec3( + a0.x * x0.x + h.x * x0.y, + a0.y * x12.x + h.y * x12.y, + a0.z * x12.z + h.z * x12.w); + return 130.0 * dot(m, g); +} + +// Analytic gradient of cultmath_snoise(vec3) (invariant 8), following webgl-noise +// src/noise3Dgrad.glsl (Ashima Arts / McEwan, MIT); same kernel, permutation and scale as +// cultmath_snoise(vec3) (stegu/webgl-noise 22434e04d7). See the C# math.snoise_grad comment for the +// derivation. Every local up through p0..p3 and x0..x3 is cultmath_snoise(vec3)'s own derivation +// verbatim. +vec4 cultmath_snoise_grad(vec3 value) +{ + vec2 c = vec2(1.0 / 6.0, 1.0 / 3.0); + vec3 i = floor(value + dot(value, c.yyy)); + vec3 x0 = value - i + dot(i, c.xxx); + vec3 g = vec3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); + vec3 l = 1.0 - g; + vec3 i1 = min(g.xyz, l.zxy); + vec3 i2 = max(g.xyz, l.zxy); + vec3 x1 = x0 - i1 + c.xxx; + vec3 x2 = x0 - i2 + c.yyy; + vec3 x3 = x0 - 0.5; + + i = cultmath_snoise_mod289(i); + vec4 p = cultmath_snoise_permute(cultmath_snoise_permute(cultmath_snoise_permute( + i.z + vec4(0.0, i1.z, i2.z, 1.0)) + i.y + vec4(0.0, i1.y, i2.y, 1.0)) + i.x + vec4(0.0, i1.x, i2.x, 1.0)); + + const float n_ = 0.142857142857; + vec3 ns = vec3(2.0 * n_, 0.5 * n_ - 1.0, n_); + vec4 j = p - 49.0 * floor(p * ns.z * ns.z); + vec4 x_ = floor(j * ns.z); + vec4 y_ = floor(j - 7.0 * x_); + vec4 x = x_ * ns.x + ns.yyyy; + vec4 y = y_ * ns.x + ns.yyyy; + vec4 h = 1.0 - abs(x) - abs(y); + + vec4 b0 = vec4(x.xy, y.xy); + vec4 b1 = vec4(x.zw, y.zw); + vec4 s0 = floor(b0) * 2.0 + 1.0; + vec4 s1 = floor(b1) * 2.0 + 1.0; + vec4 sh = -step(h, vec4(0.0, 0.0, 0.0, 0.0)); + vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + vec3 p0 = vec3(a0.xy, h.x); + vec3 p1 = vec3(a0.zw, h.y); + vec3 p2 = vec3(a1.xy, h.z); + vec3 p3 = vec3(a1.zw, h.w); + vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + vec4 m0 = max(0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + vec4 m2 = m0 * m0; + vec4 m3 = m2 * m0; + vec4 m4 = m2 * m2; + + vec4 px = vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)); + float value2 = 105.0 * dot(m4, px); + vec3 grad = -8.0 * m3.x * x0 * px.x + m4.x * p0 + + -8.0 * m3.y * x1 * px.y + m4.y * p1 + + -8.0 * m3.z * x2 * px.z + m4.z * p2 + + -8.0 * m3.w * x3 * px.w + m4.w * p3; + grad *= 105.0; + + return vec4(grad, value2); +} + +// Analytic Hessian of cultmath_snoise(vec3); see the C# math.snoise_hessian comment for the +// derivation. Every local up through p0..p3 and x0..x3 is cultmath_snoise_grad's own. The matrix is +// built from nine scalars, which read as rows in HLSL and as columns in GLSL; it is symmetric, so the +// two agree. +mat3 cultmath_snoise_hessian(vec3 value) +{ + vec2 c = vec2(1.0 / 6.0, 1.0 / 3.0); + vec3 i = floor(value + dot(value, c.yyy)); + vec3 x0 = value - i + dot(i, c.xxx); + vec3 g = vec3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); + vec3 l = 1.0 - g; + vec3 i1 = min(g.xyz, l.zxy); + vec3 i2 = max(g.xyz, l.zxy); + vec3 x1 = x0 - i1 + c.xxx; + vec3 x2 = x0 - i2 + c.yyy; + vec3 x3 = x0 - 0.5; + + i = cultmath_snoise_mod289(i); + vec4 p = cultmath_snoise_permute(cultmath_snoise_permute(cultmath_snoise_permute( + i.z + vec4(0.0, i1.z, i2.z, 1.0)) + i.y + vec4(0.0, i1.y, i2.y, 1.0)) + i.x + vec4(0.0, i1.x, i2.x, 1.0)); + + const float n_ = 0.142857142857; + vec3 ns = vec3(2.0 * n_, 0.5 * n_ - 1.0, n_); + vec4 j = p - 49.0 * floor(p * ns.z * ns.z); + vec4 x_ = floor(j * ns.z); + vec4 y_ = floor(j - 7.0 * x_); + vec4 x = x_ * ns.x + ns.yyyy; + vec4 y = y_ * ns.x + ns.yyyy; + vec4 h = 1.0 - abs(x) - abs(y); + + vec4 b0 = vec4(x.xy, y.xy); + vec4 b1 = vec4(x.zw, y.zw); + vec4 s0 = floor(b0) * 2.0 + 1.0; + vec4 s1 = floor(b1) * 2.0 + 1.0; + vec4 sh = -step(h, vec4(0.0, 0.0, 0.0, 0.0)); + vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + vec3 p0 = vec3(a0.xy, h.x); + vec3 p1 = vec3(a0.zw, h.y); + vec3 p2 = vec3(a1.xy, h.z); + vec3 p3 = vec3(a1.zw, h.w); + vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + vec4 m0 = max(0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + vec4 m2 = m0 * m0; + vec4 m3 = m2 * m0; + vec4 px = vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)); + vec4 wide = 48.0 * m2 * px; + vec4 narrow = 8.0 * m3; + + vec4 cxx = vec4(x0.x, x1.x, x2.x, x3.x); + vec4 cxy = vec4(x0.y, x1.y, x2.y, x3.y); + vec4 cxz = vec4(x0.z, x1.z, x2.z, x3.z); + vec4 cpx = vec4(p0.x, p1.x, p2.x, p3.x); + vec4 cpy = vec4(p0.y, p1.y, p2.y, p3.y); + vec4 cpz = vec4(p0.z, p1.z, p2.z, p3.z); + + float hxx = 105.0 * (dot(wide * cxx, cxx) - dot(narrow, 2.0 * cpx * cxx + px)); + float hyy = 105.0 * (dot(wide * cxy, cxy) - dot(narrow, 2.0 * cpy * cxy + px)); + float hzz = 105.0 * (dot(wide * cxz, cxz) - dot(narrow, 2.0 * cpz * cxz + px)); + float hxy = 105.0 * (dot(wide * cxx, cxy) - dot(narrow, cpx * cxy + cpy * cxx)); + float hxz = 105.0 * (dot(wide * cxx, cxz) - dot(narrow, cpx * cxz + cpz * cxx)); + float hyz = 105.0 * (dot(wide * cxy, cxz) - dot(narrow, cpy * cxz + cpz * cxy)); + return mat3(hxx, hxy, hxz, hxy, hyy, hyz, hxz, hyz, hzz); +} + +// The integral over [t0, t1] of clamp(a + b t, lo, hi); see the C# math.integral_clamp_linear comment. +float cultmath_integral_clamp_linear(float a, float b, float lo, float hi, float t0, float t1) +{ + lo = min(lo, hi); + if (b == 0.0) + return t1 != t0 ? clamp(a, lo, hi) * (t1 - t0) : 0.0; + + float direction = t1 < t0 ? -1.0 : 1.0; + float start = min(t0, t1); + float stop = max(t0, t1); + float atLo = (lo - a) / b; + float atHi = (hi - a) / b; + float enter = clamp(min(atLo, atHi), start, stop); + float leave = clamp(max(atLo, atHi), start, stop); + float before = b > 0.0 ? lo : hi; + float after = b > 0.0 ? hi : lo; + float held = enter > start ? before * (enter - start) : 0.0; + float kept = stop > leave ? after * (stop - leave) : 0.0; + float total = held + (a + b * (0.5 * (enter + leave))) * (leave - enter) + kept; + return direction * total; +} + +// Octave sum of cultmath_snoise_grad (invariant 8); see the C# math.fbm_grad comment for the +// per-octave frequency/amplitude derivation and why octaves is clamped. +vec4 cultmath_fbm_grad(vec3 p, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float value = 0.0; + vec3 gradient = vec3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + vec4 n = cultmath_snoise_grad(p * frequency); + value += amplitude * n.w; + gradient += amplitude * frequency * n.xyz; + frequency *= lacunarity; + amplitude *= gain; + } + + return vec4(gradient, value); +} + +// Ridged multifractal noise (Musgrave, Texturing and Modeling, ch. 16); see the C# math.ridged_grad +// comment for the fold/sign derivation, the deliberate crease at n = 0, and why octaves is clamped. +vec4 cultmath_ridged_grad(vec3 p, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float value = 0.0; + vec3 gradient = vec3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + vec4 n = cultmath_snoise_grad(p * frequency); + float s = sign(n.w); + value += amplitude * (1.0 - abs(n.w)); + gradient += -amplitude * frequency * s * n.xyz; + frequency *= lacunarity; + amplitude *= gain; + } + + return vec4(gradient, value); +} + +float cultmath_lengthsq(vec2 value) { return dot(value, value); } +float cultmath_lengthsq(vec3 value) { return dot(value, value); } +float cultmath_lengthsq(vec4 value) { return dot(value, value); } + +float cultmath_distance(vec2 left, vec2 right) { return length(left - right); } +float cultmath_distance(vec3 left, vec3 right) { return length(left - right); } +float cultmath_distance(vec4 left, vec4 right) { return length(left - right); } + +vec2 cultmath_reflect(vec2 incident, vec2 normal_value) +{ + return incident - 2.0 * dot(normal_value, incident) * normal_value; +} + +vec3 cultmath_reflect(vec3 incident, vec3 normal_value) +{ + return incident - 2.0 * dot(normal_value, incident) * normal_value; +} + +vec2 cultmath_rotate(vec2 value, float radians_value) +{ + float s = sin(radians_value); + float c = cos(radians_value); + return vec2(value.x * c - value.y * s, value.x * s + value.y * c); +} + +vec2 cultmath_rotate_degrees(vec2 value, float degrees_value) +{ + return cultmath_rotate(value, cultmath_radians(degrees_value)); +} + +float cultmath_csum(vec2 value) { return value.x + value.y; } +float cultmath_csum(vec3 value) { return value.x + value.y + value.z; } +float cultmath_csum(vec4 value) { return value.x + value.y + value.z + value.w; } + +float cultmath_decay(float source, float lambda_value, float dt) { return source * exp(-lambda_value * dt); } +vec2 cultmath_decay(vec2 source, float lambda_value, float dt) { return source * exp(-lambda_value * dt); } +vec3 cultmath_decay(vec3 source, float lambda_value, float dt) { return source * exp(-lambda_value * dt); } +vec4 cultmath_decay(vec4 source, float lambda_value, float dt) { return source * exp(-lambda_value * dt); } + +float cultmath_damp(float start, float end, float lambda_value, float dt) +{ + return cultmath_lerp(start, end, 1.0 - exp(-lambda_value * dt)); +} + +vec2 cultmath_damp(vec2 start, vec2 end, float lambda_value, float dt) +{ + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, vec2(amount, amount)); +} + +vec3 cultmath_damp(vec3 start, vec3 end, float lambda_value, float dt) +{ + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, vec3(amount, amount, amount)); +} + +vec4 cultmath_damp(vec4 start, vec4 end, float lambda_value, float dt) +{ + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, vec4(amount, amount, amount, amount)); +} + +float cultmath_catmullrom(float p0, float p1, float p2, float p3, float t) +{ + float t2 = t * t; + float t3 = t2 * t; + return 0.5 * ((2.0 * p1) + (p2 - p0) * t + (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3) * t2 + (-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3); +} + +vec2 cultmath_catmullrom(vec2 p0, vec2 p1, vec2 p2, vec2 p3, float t) +{ + float t2 = t * t; + float t3 = t2 * t; + return 0.5 * ((2.0 * p1) + (p2 - p0) * t + (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3) * t2 + (-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3); +} + +vec3 cultmath_catmullrom(vec3 p0, vec3 p1, vec3 p2, vec3 p3, float t) +{ + float t2 = t * t; + float t3 = t2 * t; + return 0.5 * ((2.0 * p1) + (p2 - p0) * t + (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3) * t2 + (-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3); +} + +vec4 cultmath_catmullrom(vec4 p0, vec4 p1, vec4 p2, vec4 p3, float t) +{ + float t2 = t * t; + float t3 = t2 * t; + return 0.5 * ((2.0 * p1) + (p2 - p0) * t + (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3) * t2 + (-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3); +} + +float cultmath_quadratic_bezier(float p0, float p1, float p2, float t) +{ + t = cultmath_saturate(t); + float inv = 1.0 - t; + return inv * inv * p0 + 2.0 * inv * t * p1 + t * t * p2; +} + +vec3 cultmath_quadratic_bezier(vec3 p0, vec3 p1, vec3 p2, float t) +{ + t = cultmath_saturate(t); + float inv = 1.0 - t; + return inv * inv * p0 + 2.0 * inv * t * p1 + t * t * p2; +} + +float cultmath_cubic_bezier(float p0, float p1, float p2, float p3, float t) +{ + t = cultmath_saturate(t); + float inv = 1.0 - t; + return inv * inv * inv * p0 + 3.0 * inv * inv * t * p1 + 3.0 * inv * t * t * p2 + t * t * t * p3; +} + +vec3 cultmath_cubic_bezier(vec3 p0, vec3 p1, vec3 p2, vec3 p3, float t) +{ + t = cultmath_saturate(t); + float inv = 1.0 - t; + return inv * inv * inv * p0 + 3.0 * inv * inv * t * p1 + 3.0 * inv * t * t * p2 + t * t * t * p3; +} + +float cultmath_hash(float value) { return cultmath_frac(sin(value) * 43758.5453); } +float cultmath_hash(vec2 value) { return cultmath_hash(dot(value, vec2(127.1, 311.7))); } +float cultmath_hash(vec3 value) { return cultmath_hash(dot(value, vec3(127.1, 311.7, 74.7))); } + +// PCG hashes (Jarzynski and Olano, JCGT 2020), written over scalar uints so CultMath's ivec3/ivec4 carry the bits. +uint cultmath_pcg(uint value) +{ + uint state = value * 747796405u + 2891336453u; + uint word = ((state >> int((state >> 28) + 4u)) ^ state) * 277803737u; + return (word >> 22) ^ word; +} + +ivec3 cultmath_pcg3d(ivec3 value) +{ + uint x = uint(value.x) * 1664525u + 1013904223u, y = uint(value.y) * 1664525u + 1013904223u, z = uint(value.z) * 1664525u + 1013904223u; + x += y * z; y += z * x; z += x * y; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; + x += y * z; y += z * x; z += x * y; + return ivec3(int(x), int(y), int(z)); +} + +ivec3 cultmath_pcg3d(vec3 value) { return cultmath_pcg3d(ivec3(int(floatBitsToUint(value.x)), int(floatBitsToUint(value.y)), int(floatBitsToUint(value.z)))); } +ivec3 cultmath_pcg3d(vec2 value) { return cultmath_pcg3d(vec3(value, 0.0)); } + +ivec4 cultmath_pcg4d(ivec4 value) +{ + uint x = uint(value.x) * 1664525u + 1013904223u, y = uint(value.y) * 1664525u + 1013904223u; + uint z = uint(value.z) * 1664525u + 1013904223u, w = uint(value.w) * 1664525u + 1013904223u; + x += y * w; y += z * x; z += x * y; w += y * z; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; w ^= w >> 16; + x += y * w; y += z * x; z += x * y; w += y * z; + return ivec4(int(x), int(y), int(z), int(w)); +} + +ivec4 cultmath_pcg4d(vec4 value) { return cultmath_pcg4d(ivec4(int(floatBitsToUint(value.x)), int(floatBitsToUint(value.y)), int(floatBitsToUint(value.z)), int(floatBitsToUint(value.w)))); } + +// Inigo Quilez, "smooth minimum": quadratic-polynomial smin carried to value-and-gradient form. See +// math.smin_grad's comment (math.cs) for why the gradient blend is exact, not an approximation. +vec4 cultmath_smin_grad(vec4 a, vec4 b, float k) +{ + float h = clamp(0.5 + 0.5 * (b.w - a.w) / k, 0.0, 1.0); + float value = mix(b.w, a.w, h) - k * h * (1.0 - h); + vec3 gradient = mix(b.xyz, a.xyz, h); + return vec4(gradient, value); +} + +// Invariant 8's one struct return shape (design.md, "HLSL Target: Source Transformations"): +// compared field by field and bit for bit against CultMath.CultCellular, same field order. +struct CultCellular +{ + vec4 nearest; + vec4 edge; + float id; +}; + +// Worley, "A Cellular Texture Basis Function" (SIGGRAPH 1996). See math.cellular's comment +// (math.cs) for the hashing, gradient, search-radius exactness proof, id source and +// degenerate-point conventions this mirrors exactly, including the 5x5x5 lower-bound prune. +CultCellular cultmath_cellular(vec3 p) +{ + vec3 cell = floor(p); + float f1 = 1.0e30; + float f2 = 1.0e30; + vec3 c1 = vec3(0.0, 0.0, 0.0); + vec3 c2 = vec3(0.0, 0.0, 0.0); + vec3 cellId = vec3(0.0, 0.0, 0.0); + + for (int dz = -2; dz <= 2; dz++) + { + float lz = max(0.0, abs(float(dz)) - 1.0); + for (int dy = -2; dy <= 2; dy++) + { + float ly = max(0.0, abs(float(dy)) - 1.0); + for (int dx = -2; dx <= 2; dx++) + { + float lx = max(0.0, abs(float(dx)) - 1.0); + float lowerBound = sqrt(lx * lx + ly * ly + lz * lz); + if (lowerBound >= f2) + continue; + + vec3 neighbor = cell + vec3(dx, dy, dz); + ivec3 hash = cultmath_pcg3d(ivec3(neighbor)); + vec3 jitter = vec3( + float(uint(hash.x) >> 8) * (1.0 / 16777216.0), + float(uint(hash.y) >> 8) * (1.0 / 16777216.0), + float(uint(hash.z) >> 8) * (1.0 / 16777216.0)); + vec3 feature = neighbor + jitter; + float d = cultmath_distance(p, feature); + + if (d < f1) + { + f2 = f1; c2 = c1; + f1 = d; c1 = feature; cellId = neighbor; + } + else if (d < f2) + { + f2 = d; c2 = feature; + } + } + } + } + + // F1 = 0 and F2 = 0 share the same degenerate-gradient guard; see math.cellular's comment + // (math.cs) for why F2 = 0 is reachable past roughly |p| = 2^23. + vec3 grad1 = f1 > 0.0 ? (p - c1) / f1 : vec3(0.0, 0.0, 0.0); + vec3 grad2 = f2 > 0.0 ? (p - c2) / f2 : vec3(0.0, 0.0, 0.0); + + // id comes from pcg4d over the winning cell's integer coordinate alone (same int-hashing rule + // as the jitter above), never from the pcg3d hash that produced its jitter (F4). + ivec4 idHash = cultmath_pcg4d(ivec4(ivec3(cellId), 0)); + + CultCellular result; + result.nearest = vec4(grad1, f1); + result.edge = vec4(grad2 - grad1, f2 - f1); + result.id = float(uint(idHash.w) >> 8) * (1.0 / 16777216.0); + return result; +} + +// Sites: a site is vec4(position.xyz, weight). A shader function cannot take a span (design.md, "Sites"), so a span is a +// fixed-capacity array and a count (cultmath_power_border, below), or a loop over a per-site step: +// CultSiteCells cells = cultmath_site_cells_empty(); +// for (int i = 0; i < count; i++) +// cells = cultmath_site_cells_insert(cells, cultmath_power_score(p, sites[i]), i); +// The exact power cell border is cultmath_power_border, the second loop over the sites that skips the owner cells.nearestSite. +// The step trusts the owner: a p outside the owner's cell reports distance 0 with that plane's normal, not an error. +// Statement for statement with math.Sites.cs (power_score, multiplicative_score, site_cells_*, gabriel_margin). +struct CultSiteCells +{ + vec4 nearest; + vec4 second; + float nearestSite; + float secondSite; +}; + +vec4 cultmath_power_score(vec3 p, vec4 site) +{ + vec3 offset = p - site.xyz; + return vec4(offset * 2.0, dot(offset, offset) - site.w * site.w); +} + +vec4 cultmath_multiplicative_score(vec3 p, vec4 site) +{ + vec3 offset = p - site.xyz; + float r = length(offset); + vec3 gradient = r > 0.0 ? offset / (r * site.w) : vec3(0.0, 0.0, 0.0); + return vec4(gradient, r / site.w); +} + +CultSiteCells cultmath_site_cells_empty() +{ + CultSiteCells result; + result.nearest = vec4(0.0, 0.0, 0.0, 1.0e30); + result.second = vec4(0.0, 0.0, 0.0, 1.0e30); + result.nearestSite = -1.0; + result.secondSite = -1.0; + return result; +} + +CultSiteCells cultmath_site_cells_insert(CultSiteCells cells, vec4 score, int index) +{ + CultSiteCells result = cells; + if (score.w < cells.nearest.w) + { + result.second = cells.nearest; + result.secondSite = cells.nearestSite; + result.nearest = score; + result.nearestSite = float(index); + } + else if (score.w < cells.second.w) + { + result.second = score; + result.secondSite = float(index); + } + + return result; +} + +vec4 cultmath_site_cells_border(CultSiteCells cells) +{ + vec3 n = cells.second.xyz - cells.nearest.xyz; + float len = length(n); + if (cells.secondSite < 0.0 || len <= 0.0) + return vec4(0.0, 0.0, 0.0, 1.0e30); + return vec4(n / len, (cells.second.w - cells.nearest.w) / len); +} + +vec4 cultmath_power_border_step(vec3 p, vec4 owner, vec4 other, vec4 border) +{ + vec3 d = other.xyz - owner.xyz; + float len = length(d); + if (len <= 0.0) + return border; + float plane = max((dot(owner.xyz - p, d) + 0.5 * (dot(d, d) + (owner.w - other.w) * (owner.w + other.w))) / len, 0.0); + return plane < border.w ? vec4(-d / len, plane) : border; +} + +float cultmath_gabriel_margin(vec3 a, vec3 b, vec3 other) +{ + float r = cultmath_distance(a, b) * 0.5; + if (r <= 0.0) + return -1.0; + return (cultmath_distance(other, (a + b) * 0.5) - r) / r; +} + +// Weighted lattice cells: the four per-cell steps of math.Lattice.cs, statement for statement; cultmath_weighted_lattice_cells, +// after them, is the whole function. +vec3 cultmath_lattice_site(vec2 cell, float time, float drift) +{ + ivec3 h = cultmath_pcg3d(ivec3(int(cell.x), int(cell.y), 0)); + vec2 phase = vec2(float(uint(h.x) >> 8) * (1.0 / 16777216.0), float(uint(h.y) >> 8) * (1.0 / 16777216.0)); + vec2 site = cell + 0.5 + 0.5 * vec2(sin(drift * time + CULTMATH_TAU * phase.x), sin(drift * time + CULTMATH_TAU * phase.y)); + return vec3(site, 0.5 + 0.5 * (float(uint(h.z) >> 8) * (1.0 / 16777216.0))); +} + +float cultmath_lattice_weight(float base_weight, float border, float boost, float falloff) +{ + float t = border / falloff; + return base_weight * (1.0 + boost * exp(-(t * t))); +} + +float cultmath_lattice_distance(vec2 q, vec2 site, float weight, vec2 normal, float stretch) +{ + vec2 v = site - q; + float a = dot(v, normal); + float c = v.x * normal.y - v.y * normal.x; + return weight * length(vec2(stretch * a, c)); +} + +float cultmath_lattice_smooth_step(float m, float d, float f1, float smoothing) +{ + if (d >= f1 + 2.0 * smoothing) + return m; + float h = cultmath_smoothstep(0.0, 1.0, 0.5 + 0.5 * (m - d) / smoothing); + float next = m + (d - m) * h - h * (1.0 - h) * smoothing / (1.0 + 3.0 * smoothing); + return min(next, f1 + smoothing); +} + +// Sites by value: a shader function cannot take a span, so these take vec4 sites[CULTMATH_MAX_SITES] and the count in use, with +// count in [0, CULTMATH_MAX_SITES]. A consumer defines CULTMATH_MAX_SITES before including this file to change the capacity; loops +// run to count, so the capacity costs uniform space, not iterations. A caller whose sites live in a buffer copies them into a local array first. +// The preconditions the C# functions throw for are the caller's in a shader: finite arguments, cellSize > 0, boost in [0, 4], +// falloff > 0, smoothing in (0, 1], stretch in [1, 2], p within 2^23 cells. A zero stretchNormal means (1, 0) and needs stretch == 1. +// cultmath_weighted_lattice_cells is math.weighted_lattice_cells: the ring pass is bounded by k <= 37 and exits as C# does, and the +// box pass recomputes each distance instead of caching it (a 75 x 75 private array is not a shader option), with the same values. +#ifndef CULTMATH_MAX_SITES +#define CULTMATH_MAX_SITES 128 +#endif + +vec4 cultmath_power_border(vec3 p, vec4 sites[CULTMATH_MAX_SITES], int count) +{ + CultSiteCells cells = cultmath_site_cells_empty(); + for (int i = 0; i < count; i++) + cells = cultmath_site_cells_insert(cells, cultmath_power_score(p, sites[i]), i); + vec4 border = vec4(0.0, 0.0, 0.0, 1.0e30); + int owner = int(cells.nearestSite); + if (owner < 0) + return border; + for (int k = 0; k < count; k++) + if (k != owner) + border = cultmath_power_border_step(p, sites[owner], sites[k], border); + return border; +} + +float cultmath_lattice_cell_distance(vec2 q, vec2 cell, float time, float drift, vec4 bodies[CULTMATH_MAX_SITES], int count, + float cellSize, float boost, float falloff, vec2 normal, float stretch) +{ + vec3 site = cultmath_lattice_site(cell, time, drift); + float border = cultmath_power_border(vec3((cell + 0.5) * cellSize, 0.0), bodies, count).w; + return cultmath_lattice_distance(q, site.xy, cultmath_lattice_weight(site.z, border, boost, falloff), normal, stretch); +} + +vec4 cultmath_weighted_lattice_cells(vec2 p, float time, vec4 bodies[CULTMATH_MAX_SITES], int count, float cellSize, float drift, + float boost, float falloff, float smoothing, vec2 stretchNormal, float stretch) +{ + float scale = max(abs(stretchNormal.x), abs(stretchNormal.y)); + vec2 normal = vec2(1.0, 0.0); + if (scale > 0.0) + { + normal = stretchNormal / scale; + normal = normal / length(normal); + } + vec2 q = p / cellSize; + vec2 origin = floor(q); + int cx0 = int(origin.x); + int cz0 = int(origin.y); + float f1 = 1.0e30; + float f2 = 1.0e30; + int reach = 0; + for (int k = 0; k <= 37; k++) + { + if (k > 1 && 0.5 * float(k - 1) >= max(f2, f1 + 2.0 * smoothing)) + break; + for (int dz = -k; dz <= k; dz++) + { + int step = dz == -k || dz == k || k == 0 ? 1 : 2 * k; + for (int dx = -k; dx <= k; dx += step) + { + float d = cultmath_lattice_cell_distance(q, vec2(cx0 + dx, cz0 + dz), time, drift, bodies, count, cellSize, boost, falloff, normal, stretch); + if (d < f1) { f2 = f1; f1 = d; } + else if (d < f2) f2 = d; + } + } + reach = k; + } + float m = f1 + smoothing; + float best = 1.0e30; + float second = 1.0e30; + int winDx = 0; + int winDz = 0; + for (int dz = -reach; dz <= reach; dz++) + for (int dx = -reach; dx <= reach; dx++) + { + float d = cultmath_lattice_cell_distance(q, vec2(cx0 + dx, cz0 + dz), time, drift, bodies, count, cellSize, boost, falloff, normal, stretch); + if (d < best) { second = best; best = d; winDx = dx; winDz = dz; } + else if (d < second) second = d; + m = cultmath_lattice_smooth_step(m, d, f1, smoothing); + } + ivec4 id = cultmath_pcg4d(ivec4(cx0 + winDx, cz0 + winDz, 0, 0)); + return vec4(best, second, m, float(uint(id.w) >> 8) * (1.0 / 16777216.0)); +} + +vec2 cultmath_segment_closest(vec2 point_value, vec2 start, vec2 end) +{ + vec2 segment = end - start; + float segmentLengthSq = cultmath_lengthsq(segment); + if (segmentLengthSq <= 0.0) + return start; + + float t = cultmath_saturate(dot(point_value - start, segment) / segmentLengthSq); + return start + segment * t; +} + +vec3 cultmath_segment_closest(vec3 point_value, vec3 start, vec3 end) +{ + vec3 segment = end - start; + float segmentLengthSq = cultmath_lengthsq(segment); + if (segmentLengthSq <= 0.0) + return start; + + float t = cultmath_saturate(dot(point_value - start, segment) / segmentLengthSq); + return start + segment * t; +} + +float cultmath_distance_to_segment(vec2 point_value, vec2 start, vec2 end) +{ + return cultmath_distance(point_value, cultmath_segment_closest(point_value, start, end)); +} + +float cultmath_distance_to_segment(vec3 point_value, vec3 start, vec3 end) +{ + return cultmath_distance(point_value, cultmath_segment_closest(point_value, start, end)); +} + + + + +// Interval arithmetic over vec2(lo, hi), lo <= hi, both finite. Every cultmath_iv_* function returns +// an interval containing f(x) for every x in its input intervals, mirroring math.Interval.cs bit for +// bit; see that file and docs/design.md ("Intervals") for each op's enclosure and its ulp widening. +// Included by CultMath.hlsl after its own definitions of cultmath_smoothstep and cultmath_snoise. + +// Lipschitz constant of cultmath_snoise(vec3); provenance in math.Interval.cs (SNOISE_LIPSCHITZ). +const float CULTMATH_SNOISE_LIPSCHITZ = 7.9640074; + +// Lipschitz constant of cultmath_snoise(vec2); provenance in math.Interval.cs (SNOISE2_LIPSCHITZ). +const float CULTMATH_SNOISE2_LIPSCHITZ = 8.117002; + +vec2 cultmath_iv_point(float value) { return vec2(value, value); } +vec2 cultmath_iv_add(vec2 a, vec2 b) { return vec2(a.x + b.x, a.y + b.y); } +vec2 cultmath_iv_sub(vec2 a, vec2 b) { return vec2(a.x - b.y, a.y - b.x); } +vec2 cultmath_iv_neg(vec2 a) { return vec2(-a.y, -a.x); } + +vec2 cultmath_iv_mul(vec2 a, vec2 b) +{ + float p0 = a.x * b.x; + float p1 = a.x * b.y; + float p2 = a.y * b.x; + float p3 = a.y * b.y; + return vec2(min(min(p0, p1), min(p2, p3)), max(max(p0, p1), max(p2, p3))); +} + +vec2 cultmath_iv_scale(vec2 a, float s) { return s >= 0.0 ? vec2(a.x * s, a.y * s) : vec2(a.y * s, a.x * s); } + +vec2 cultmath_iv_abs(vec2 a) +{ + if (a.x >= 0.0) + return a; + if (a.y <= 0.0) + return vec2(-a.y, -a.x); + return vec2(0.0, max(-a.x, a.y)); +} + +vec2 cultmath_iv_min(vec2 a, vec2 b) { return vec2(min(a.x, b.x), min(a.y, b.y)); } +vec2 cultmath_iv_max(vec2 a, vec2 b) { return vec2(max(a.x, b.x), max(a.y, b.y)); } + +vec2 cultmath_iv_sqr(vec2 a) +{ + float l = a.x * a.x; + float h = a.y * a.y; + if (a.x >= 0.0) + return vec2(l, h); + if (a.y <= 0.0) + return vec2(h, l); + return vec2(0.0, max(l, h)); +} + +vec2 cultmath_iv_sqrt(vec2 a) { return vec2(sqrt(max(a.x, 0.0)), sqrt(max(a.y, 0.0))); } + +// Widened by one ulp on each side: exp is not required to be correctly rounded. +vec2 cultmath_iv_exp(vec2 a) +{ + float lo = exp(a.x); + float hi = exp(a.y); + return vec2(lo > 0.0 ? uintBitsToFloat(floatBitsToUint(lo) - 1u) : 0.0, uintBitsToFloat(floatBitsToUint(hi) + 1u)); +} + +vec2 cultmath_iv_clamp(vec2 a, float minimum, float maximum) +{ + return vec2(cultmath_clamp(a.x, minimum, maximum), cultmath_clamp(a.y, minimum, maximum)); +} + +vec2 cultmath_iv_saturate(vec2 a) { return vec2(cultmath_saturate(a.x), cultmath_saturate(a.y)); } + +// The endpoints, ordered, widened by one ulp inside [0, 1]: the float32 evaluation of smoothstep is +// monotone only to within one ulp. +vec2 cultmath_iv_smoothstep(float minimum, float maximum, vec2 a) +{ + float s0 = cultmath_smoothstep(minimum, maximum, a.x); + float s1 = cultmath_smoothstep(minimum, maximum, a.y); + float lo = min(s0, s1); + float hi = max(s0, s1); + return vec2(lo > 0.0 ? uintBitsToFloat(floatBitsToUint(lo) - 1u) : 0.0, hi < 1.0 ? uintBitsToFloat(floatBitsToUint(hi) + 1u) : 1.0); +} + +// The natural interval extension of x + (y - x) * amount, which is how cultmath_lerp evaluates. +vec2 cultmath_iv_lerp(vec2 a, vec2 b, float amount) { return cultmath_iv_add(a, cultmath_iv_scale(cultmath_iv_sub(b, a), amount)); } + +// [n - L r, n + L r] intersected with [-1, 1], n = cultmath_snoise(centre). One snoise, value only. +vec2 cultmath_iv_snoise_ball(vec3 centre, float radius) +{ + float n = cultmath_snoise(centre); + float e = CULTMATH_SNOISE_LIPSCHITZ * radius; + return vec2(max(n - e, -1.0), min(n + e, 1.0)); +} + +// The 2D overload: [n - L2 r, n + L2 r] intersected with [-1, 1], n = cultmath_snoise(centre). One snoise, value only. +vec2 cultmath_iv_snoise_ball(vec2 centre, float radius) +{ + float n = cultmath_snoise(centre); + float e = CULTMATH_SNOISE2_LIPSCHITZ * radius; + return vec2(max(n - e, -1.0), min(n + e, 1.0)); +} + +// Octave sum of cultmath_iv_snoise_ball, compounding frequency and amplitude as the value-and-gradient fBm does. +vec2 cultmath_iv_fbm_ball(vec3 centre, float radius, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + vec2 sum = vec2(0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + sum = cultmath_iv_add(sum, cultmath_iv_scale(cultmath_iv_snoise_ball(centre * frequency, radius * abs(frequency)), amplitude)); + frequency *= lacunarity; + amplitude *= gain; + } + + return sum; +} + +// A ball (xyz centre, w radius) enclosing every point of every ray of a screen tile over the depth segment +// [z0, z1], warped by at most warp. Camera frame: pinhole at the origin looking down +z, ray (m z, z). +// footprintPerDepth = N / (sqrt(2) f) for an N x N tile at focal length f. The radius is widened by +// (|c|_1 + radius) 2^-20, which covers the ball's own float32 rounding. Derivation in math.Interval.cs. +vec4 cultmath_iv_frustum_ball(vec2 centreSlope, float z0, float z1, float footprintPerDepth, float warp) +{ + float zm = (z0 + z1) * 0.5; + float axis = sqrt(centreSlope.x * centreSlope.x + centreSlope.y * centreSlope.y + 1.0); + float cx = centreSlope.x * zm; + float cy = centreSlope.y * zm; + float radius = (z1 - z0) * 0.5 * axis + z1 * footprintPerDepth + warp; + radius += (abs(cx) + abs(cy) + abs(zm) + radius) * 9.5367431640625e-7; + return vec4(cx, cy, zm, radius); +} + + + + + + +// Reduced affine forms with one shared symbol over vec3(x0, a, e): the set { x0 + a eps + e delta : +// delta in [-1, 1] } at the region's shared eps in [-1, 1], e >= 0. Every cultmath_af_* function mirrors +// math.Affine.cs bit for bit; see that file and docs/design.md ("Affine forms") for each op's enclosure +// and the float32 rounding allowance it folds into e. Included by CultMath.hlsl after +// CultMath.Interval.hlsl, whose CULTMATH_SNOISE_LIPSCHITZ it shares, and after its own +// definition of cultmath_snoise_grad. + +// An upper bound on the spectral norm of the Hessian of cultmath_snoise(vec3); provenance in +// math.Affine.cs (SNOISE_HESSIAN). +const float CULTMATH_SNOISE_HESSIAN = 55.642143; + +// The absolute rounding of one float32 read of cultmath_snoise_grad, value and gradient; the owner is +// math.Affine.cs (SNOISE_READ_VALUE, SNOISE_READ_GRADIENT), read here by cultmath_af_snoise and in +// CultMath.hlsl by cultmath_span_slack. +const float CULTMATH_SNOISE_READ_VALUE = 6.103515625e-5; +const float CULTMATH_SNOISE_READ_GRADIENT = 2.44140625e-4; + +// An upper bound on the operator norm of the third-derivative tensor of cultmath_snoise(vec3), the +// next order after CULTMATH_SNOISE_HESSIAN; provenance in math.Span.cs (SNOISE_THIRD). +const float CULTMATH_SNOISE_THIRD = 535.8009; + +vec3 cultmath_af_point(float value) { return vec3(value, 0.0, 0.0); } +vec3 cultmath_af_symbol(float x0, float a) { return vec3(x0, a, 0.0); } + +vec3 cultmath_af_from_iv(vec2 interval) +{ + float x0 = interval.x * 0.5 + interval.y * 0.5; + float e = interval.y * 0.5 - interval.x * 0.5; + return vec3(x0, 0.0, e + (abs(x0) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +// An endpoint that would be NaN is the infinity on its side. NaN is found by its bit pattern: dxc marks +// compares fast, so a test that needs NaN to make `lo == lo` false is deleted under its default flags. +vec2 cultmath_af_range(vec3 x) +{ + float r = abs(x.y) + x.z; + float w = abs(x.x) * 9.5367431640625e-7 + r * 9.5367431640625e-7; + float lo = x.x - r - w; + float hi = x.x + r + w; + return vec2((floatBitsToUint(lo) & 0x7fffffffu) > 0x7f800000u ? uintBitsToFloat(0xff800000u) : lo, + (floatBitsToUint(hi) & 0x7fffffffu) > 0x7f800000u ? uintBitsToFloat(0x7f800000u) : hi); +} + +vec3 cultmath_af_add(vec3 x, vec3 y) +{ + float x0 = x.x + y.x; + float a = x.y + y.y; + float e = x.z + y.z; + return vec3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7); +} + +vec3 cultmath_af_sub(vec3 x, vec3 y) +{ + float x0 = x.x - y.x; + float a = x.y - y.y; + float e = x.z + y.z; + return vec3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7); +} + +vec3 cultmath_af_neg(vec3 x) { return vec3(-x.x, -x.y, x.z); } + +vec3 cultmath_af_scale(vec3 x, float s) +{ + float x0 = x.x * s; + float a = x.y * s; + float e = x.z * abs(s); + return vec3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +vec3 cultmath_af_add_iv(vec3 x, vec2 interval) { return cultmath_af_add(x, cultmath_af_from_iv(interval)); } + +vec3 cultmath_af_mul(vec3 x, vec3 y) +{ + float x0 = x.x * y.x; + float p = x.x * y.y; + float q = y.x * x.y; + float a = p + q; + float e = abs(x.x) * y.z + abs(y.x) * x.z + (abs(x.y) + x.z) * (abs(y.y) + y.z); + return vec3(x0, a, e + (abs(x0) + abs(p) + abs(q) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +// The narrower of the Lipschitz form and the centred (Taylor) form over every p = centre + axis eps + w, +// |w| <= radius, from one cultmath_snoise_grad at the centre; the allowance for the float32 evaluation is +// in math.Affine.cs. +vec3 cultmath_af_snoise(vec3 centre, vec3 axis, float radius) +{ + vec4 g = cultmath_snoise_grad(centre); + vec3 gradient = vec3(g.x, g.y, g.z); + float reach = length(axis) + radius; + float lipschitz = CULTMATH_SNOISE_LIPSCHITZ * reach; + float a = dot(gradient, axis); + float remainder = length(gradient) * radius + 0.5 * CULTMATH_SNOISE_HESSIAN * reach * reach; + float allowance = CULTMATH_SNOISE_READ_VALUE + CULTMATH_SNOISE_READ_GRADIENT * reach + + CULTMATH_SNOISE_LIPSCHITZ * 9.5367431640625e-7 * (abs(centre.x) + abs(centre.y) + abs(centre.z) + reach); + bool centred = abs(a) + remainder < lipschitz; + float slope = centred ? a : 0.0; + float e = (centred ? remainder : lipschitz) + allowance; + return vec3(g.w, slope, e + (abs(g.w) + abs(slope) + e) * 9.5367431640625e-7); +} + +// Octave sum of cultmath_af_snoise, compounding frequency and amplitude as the value-and-gradient fBm does. +vec3 cultmath_af_fbm(vec3 centre, vec3 axis, float radius, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + vec3 sum = vec3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + sum = cultmath_af_add(sum, cultmath_af_scale(cultmath_af_snoise(centre * frequency, axis * frequency, radius * abs(frequency)), amplitude)); + frequency *= lacunarity; + amplitude *= gain; + } + + return sum; +} + +// The axis of a screen tile's slice over the depth segment [z0, z1]; camera frame of +// cultmath_iv_frustum_ball. +vec3 cultmath_af_frustum_axis(vec2 centreSlope, float z0, float z1) +{ + float h = (z1 - z0) * 0.5; + return vec3(centreSlope.x * h, centreSlope.y * h, h); +} + +// The affine slice of a screen tile over [z0, z1]: centre xyz, radius w. Derivation in math.Affine.cs. +vec4 cultmath_af_frustum_ball(vec2 centreSlope, float z0, float z1, float footprintPerDepth, float warpVariation) +{ + float zm = (z0 + z1) * 0.5; + float h = (z1 - z0) * 0.5; + float cx = centreSlope.x * zm; + float cy = centreSlope.y * zm; + float spread = (abs(centreSlope.x) + abs(centreSlope.y) + 1.0) * h; + float radius = z1 * footprintPerDepth + warpVariation; + radius += (abs(cx) + abs(cy) + abs(zm) + spread + radius) * 9.5367431640625e-7; + return vec4(cx, cy, zm, radius); +} + + + + +// Span stages (invariant 8): the SpanPath, SpanStage and SpanNoise of math.Span.cs, field for field in +// C#'s order, and cultmath_span_stage, its octave stage, statement for statement so the text is a bit-for-bit +// mirror. They follow the includes because the bounds read CULTMATH_SNOISE_LIPSCHITZ, _HESSIAN and _THIRD. +// A shader caller builds a SpanStage itself (SpanStage(1.0, 1.0, vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)) +// is the identity of math.SpanStage.Identity, which has no shader form); see math.span_stage's comments for +// the span, the transform, the bounds and the allowances. cultmath_span_rounding and cultmath_span_slack +// are math.span_rounding and math.span_slack, the owners of S_o and of the three allowances. +struct SpanPath +{ + vec3 midpoint; + vec3 velocity; + float speed; + float acceleration; + float halfLength; +}; + +struct SpanStage +{ + float frequency; + float stretch; + vec3 axis; + vec3 shift; + vec3 offset; + vec3 octaveStep; +}; + +struct SpanNoise +{ + vec4 field; + float curvature; + float fold; +}; + +float cultmath_span_rounding(float scale, vec3 mq, SpanStage stage, vec3 octaveShift, float nu, float halfLength) +{ + return 9.5367431640625e-7 * (abs(scale) * (cultmath_csum(abs(mq)) + cultmath_csum(abs(stage.shift))) + cultmath_csum(abs(stage.offset)) + cultmath_csum(abs(octaveShift)) + 1.7320508 * nu * halfLength); +} + +vec3 cultmath_span_slack(float rounding) +{ + return vec3(CULTMATH_SNOISE_READ_VALUE + CULTMATH_SNOISE_LIPSCHITZ * rounding, + CULTMATH_SNOISE_READ_GRADIENT + CULTMATH_SNOISE_HESSIAN * rounding, + 9.765625e-4 + CULTMATH_SNOISE_THIRD * rounding); +} + +// The octave stage behind cultmath_span_fbm and cultmath_span_ridged, as math.span_stage is behind span_fbm +// and span_ridged. The Frobenius norm of the Hessian is written out in C#'s order (GLSL has no _mRC member +// access); the C# local named step is octaveShift here (it would shadow GLSL's step()). +SpanNoise cultmath_span_stage(bool ridged, SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + vec3 q = path.midpoint; + float halfLength = path.halfLength; + octaves = clamp(octaves, 0, 16); + bool stretched = dot(stage.axis, stage.axis) > 0.0 && stage.stretch != 1.0; + vec3 direction = stretched ? normalize(stage.axis) : vec3(0.0, 0.0, 0.0); + float squeeze = stretched ? 1.0 / stage.stretch - 1.0 : 0.0; + float norm = abs(stage.frequency) * (stretched ? max(1.0, 1.0 / stage.stretch) : 1.0); + vec3 mq = stretched ? stage.frequency * (q + squeeze * dot(direction, q) * direction) : stage.frequency * q; + vec3 mv = stretched ? stage.frequency * (path.velocity + squeeze * dot(direction, path.velocity) * direction) : stage.frequency * path.velocity; + float amplitude = 1.0; + float scale = 1.0; + float value = 0.0; + vec3 gradient = vec3(0.0, 0.0, 0.0); + float curvature = 0.0; + float fold = 0.0; + for (int i = 0; i < octaves; i++) + { + vec3 octaveShift = float(i) * stage.octaveStep; + vec3 x = scale * (mq + stage.shift) + (stage.offset + octaveShift); + vec4 n = cultmath_snoise_grad(x); + vec3 g = vec3(n.x, n.y, n.z); + vec3 mg = stretched ? stage.frequency * (g + squeeze * dot(direction, g) * direction) : stage.frequency * g; + if (ridged) + { + float s = sign(n.w); + value += amplitude * (1.0 - abs(n.w)); + gradient += -amplitude * scale * s * mg; + } + else + { + value += amplitude * n.w; + gradient += amplitude * scale * mg; + } + + float weight = abs(amplitude); + float factor = abs(scale) * norm; + float nu = factor * path.speed; + float rounding = cultmath_span_rounding(scale, mq, stage, octaveShift, nu, halfLength); + vec3 slack = cultmath_span_slack(rounding); + float valueSlack = slack.x; + float gradientSlack = slack.y; + float hessianSlack = slack.z; + mat3 hm = cultmath_snoise_hessian(x); + float frobenius = sqrt(hm[0][0] * hm[0][0] + hm[0][1] * hm[0][1] + hm[0][2] * hm[0][2] + hm[1][0] * hm[1][0] + hm[1][1] * hm[1][1] + hm[1][2] * hm[1][2] + + hm[2][0] * hm[2][0] + hm[2][1] * hm[2][1] + hm[2][2] * hm[2][2]); + float hessianBound = min(CULTMATH_SNOISE_HESSIAN, frobenius + hessianSlack + CULTMATH_SNOISE_THIRD * nu * halfLength); + curvature += weight * factor * factor * hessianBound; + if (ridged) + { + vec3 w = scale * mv; + float reach = hessianBound * nu * halfLength; + float gl = min(CULTMATH_SNOISE_LIPSCHITZ, length(g) + gradientSlack + reach); + float travel = (abs(dot(g, w)) + gradientSlack * length(w)) * halfLength + (hessianBound * nu * length(w) + gl * factor * path.acceleration) * (0.5 * halfLength * halfLength) + 2.0 * valueSlack; + fold += 2.0 * weight * max(travel - abs(n.w), 0.0); + } + + scale *= lacunarity; + amplitude *= gain; + } + + SpanNoise result; + result.field = vec4(gradient, value); + result.curvature = curvature; + result.fold = fold; + return result; +} + +SpanNoise cultmath_span_fbm(SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + return cultmath_span_stage(false, path, stage, octaves, lacunarity, gain); +} + +SpanNoise cultmath_span_ridged(SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + return cultmath_span_stage(true, path, stage, octaves, lacunarity, gain); +} + +float cultmath_value_noise(vec2 position) +{ + vec2 cell = floor(position); + vec2 local = cultmath_frac(position); + vec2 u = local * local * (vec2(3.0, 3.0) - vec2(2.0, 2.0) * local); + + float a = cultmath_hash(cell); + float b = cultmath_hash(cell + vec2(1.0, 0.0)); + float c = cultmath_hash(cell + vec2(0.0, 1.0)); + float d = cultmath_hash(cell + vec2(1.0, 1.0)); + + return cultmath_lerp(cultmath_lerp(a, b, u.x), cultmath_lerp(c, d, u.x), u.y); +} + +float cultmath_value_noise_bicubic(vec2 position) +{ + vec2 cell = floor(position); + vec2 local = cultmath_frac(position); + + float y0 = cultmath_catmullrom(cultmath_hash(cell + vec2(-1.0, -1.0)), cultmath_hash(cell + vec2(0.0, -1.0)), cultmath_hash(cell + vec2(1.0, -1.0)), cultmath_hash(cell + vec2(2.0, -1.0)), local.x); + float y1 = cultmath_catmullrom(cultmath_hash(cell + vec2(-1.0, 0.0)), cultmath_hash(cell + vec2(0.0, 0.0)), cultmath_hash(cell + vec2(1.0, 0.0)), cultmath_hash(cell + vec2(2.0, 0.0)), local.x); + float y2 = cultmath_catmullrom(cultmath_hash(cell + vec2(-1.0, 1.0)), cultmath_hash(cell + vec2(0.0, 1.0)), cultmath_hash(cell + vec2(1.0, 1.0)), cultmath_hash(cell + vec2(2.0, 1.0)), local.x); + float y3 = cultmath_catmullrom(cultmath_hash(cell + vec2(-1.0, 2.0)), cultmath_hash(cell + vec2(0.0, 2.0)), cultmath_hash(cell + vec2(1.0, 2.0)), cultmath_hash(cell + vec2(2.0, 2.0)), local.x); + + return cultmath_catmullrom(y0, y1, y2, y3, local.y); +} + +#endif diff --git a/packages/cultmath/shaders/CultMath.hlsl b/packages/cultmath/shaders/CultMath.hlsl index 365705f5..d3eea396 100644 --- a/packages/cultmath/shaders/CultMath.hlsl +++ b/packages/cultmath/shaders/CultMath.hlsl @@ -11,7 +11,6 @@ static const float CULTMATH_PI = 3.14159265358979323846; static const float CULTMATH_TAU = 6.28318530717958647692; static const float CULTMATH_HALF_PI = 1.57079632679489661923; -static const float CULTMATH_NORMALIZE_EPSILON = 1.0e-20; float cultmath_radians(float degrees_value) { return degrees_value * (CULTMATH_PI / 180.0); } float cultmath_degrees(float radians_value) { return radians_value * (180.0 / CULTMATH_PI); } @@ -77,17 +76,18 @@ float cultmath_smootherstep(float value) float2 cultmath_snoise_mod289(float2 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } float3 cultmath_snoise_mod289(float3 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } float4 cultmath_snoise_mod289(float4 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } -float3 cultmath_snoise_permute(float3 value) { return cultmath_snoise_mod289(((value * 34.0) + 1.0) * value); } -float4 cultmath_snoise_permute(float4 value) { return cultmath_snoise_mod289(((value * 34.0) + 1.0) * value); } +float3 cultmath_snoise_permute(float3 value) { return cultmath_snoise_mod289(((value * 34.0) + 10.0) * value); } +float4 cultmath_snoise_permute(float4 value) { return cultmath_snoise_mod289(((value * 34.0) + 10.0) * value); } // Ashima Arts / Ian McEwan 3D simplex noise (MIT), same float32 evaluation -// order as the C# math.snoise(float3) mirror. +// order as the C# math.snoise(float3) mirror. Ties resolve in simplexnoise1234's +// total order; see math.snoise. float cultmath_snoise(float3 value) { float2 c = float2(1.0 / 6.0, 1.0 / 3.0); float3 i = floor(value + dot(value, c.yyy)); float3 x0 = value - i + dot(i, c.xxx); - float3 g = step(x0.yzx, x0.xyz); + float3 g = float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); float3 l = 1.0 - g; float3 i1 = min(g.xyz, l.zxy); float3 i2 = max(g.xyz, l.zxy); @@ -112,7 +112,7 @@ float cultmath_snoise(float3 value) float4 b1 = float4(x.zw, y.zw); float4 s0 = floor(b0) * 2.0 + 1.0; float4 s1 = floor(b1) * 2.0 + 1.0; - float4 sh = -step(h, 0.0); + float4 sh = -step(h, float4(0.0, 0.0, 0.0, 0.0)); float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; @@ -126,9 +126,9 @@ float cultmath_snoise(float3 value) p2 *= norm.z; p3 *= norm.w; - float4 m = max(0.6 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + float4 m = max(0.5 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); m = m * m; - return 42.0 * dot(m * m, float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); + return 105.0 * dot(m * m, float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); } float cultmath_snoise(float2 value) @@ -163,6 +163,207 @@ float cultmath_snoise(float2 value) return 130.0 * dot(m, g); } +// Analytic gradient of cultmath_snoise(float3) (invariant 8), following webgl-noise +// src/noise3Dgrad.glsl (Ashima Arts / McEwan, MIT); same kernel, permutation and scale as +// cultmath_snoise(float3) (stegu/webgl-noise 22434e04d7). See the C# math.snoise_grad comment for the +// derivation. Every local up through p0..p3 and x0..x3 is cultmath_snoise(float3)'s own derivation +// verbatim. +float4 cultmath_snoise_grad(float3 value) +{ + float2 c = float2(1.0 / 6.0, 1.0 / 3.0); + float3 i = floor(value + dot(value, c.yyy)); + float3 x0 = value - i + dot(i, c.xxx); + float3 g = float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); + float3 l = 1.0 - g; + float3 i1 = min(g.xyz, l.zxy); + float3 i2 = max(g.xyz, l.zxy); + float3 x1 = x0 - i1 + c.xxx; + float3 x2 = x0 - i2 + c.yyy; + float3 x3 = x0 - 0.5; + + i = cultmath_snoise_mod289(i); + float4 p = cultmath_snoise_permute(cultmath_snoise_permute(cultmath_snoise_permute( + i.z + float4(0.0, i1.z, i2.z, 1.0)) + i.y + float4(0.0, i1.y, i2.y, 1.0)) + i.x + float4(0.0, i1.x, i2.x, 1.0)); + + const float n_ = 0.142857142857; + float3 ns = float3(2.0 * n_, 0.5 * n_ - 1.0, n_); + float4 j = p - 49.0 * floor(p * ns.z * ns.z); + float4 x_ = floor(j * ns.z); + float4 y_ = floor(j - 7.0 * x_); + float4 x = x_ * ns.x + ns.yyyy; + float4 y = y_ * ns.x + ns.yyyy; + float4 h = 1.0 - abs(x) - abs(y); + + float4 b0 = float4(x.xy, y.xy); + float4 b1 = float4(x.zw, y.zw); + float4 s0 = floor(b0) * 2.0 + 1.0; + float4 s1 = floor(b1) * 2.0 + 1.0; + float4 sh = -step(h, float4(0.0, 0.0, 0.0, 0.0)); + float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + float3 p0 = float3(a0.xy, h.x); + float3 p1 = float3(a0.zw, h.y); + float3 p2 = float3(a1.xy, h.z); + float3 p3 = float3(a1.zw, h.w); + float4 norm = 1.79284291400159 - 0.85373472095314 * float4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + float4 m0 = max(0.5 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + float4 m2 = m0 * m0; + float4 m3 = m2 * m0; + float4 m4 = m2 * m2; + + float4 px = float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)); + float value2 = 105.0 * dot(m4, px); + float3 grad = -8.0 * m3.x * x0 * px.x + m4.x * p0 + + -8.0 * m3.y * x1 * px.y + m4.y * p1 + + -8.0 * m3.z * x2 * px.z + m4.z * p2 + + -8.0 * m3.w * x3 * px.w + m4.w * p3; + grad *= 105.0; + + return float4(grad, value2); +} + +// Analytic Hessian of cultmath_snoise(float3); see the C# math.snoise_hessian comment for the +// derivation. Every local up through p0..p3 and x0..x3 is cultmath_snoise_grad's own. The matrix is +// built from nine scalars, which read as rows in HLSL and as columns in GLSL; it is symmetric, so the +// two agree. +float3x3 cultmath_snoise_hessian(float3 value) +{ + float2 c = float2(1.0 / 6.0, 1.0 / 3.0); + float3 i = floor(value + dot(value, c.yyy)); + float3 x0 = value - i + dot(i, c.xxx); + float3 g = float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); + float3 l = 1.0 - g; + float3 i1 = min(g.xyz, l.zxy); + float3 i2 = max(g.xyz, l.zxy); + float3 x1 = x0 - i1 + c.xxx; + float3 x2 = x0 - i2 + c.yyy; + float3 x3 = x0 - 0.5; + + i = cultmath_snoise_mod289(i); + float4 p = cultmath_snoise_permute(cultmath_snoise_permute(cultmath_snoise_permute( + i.z + float4(0.0, i1.z, i2.z, 1.0)) + i.y + float4(0.0, i1.y, i2.y, 1.0)) + i.x + float4(0.0, i1.x, i2.x, 1.0)); + + const float n_ = 0.142857142857; + float3 ns = float3(2.0 * n_, 0.5 * n_ - 1.0, n_); + float4 j = p - 49.0 * floor(p * ns.z * ns.z); + float4 x_ = floor(j * ns.z); + float4 y_ = floor(j - 7.0 * x_); + float4 x = x_ * ns.x + ns.yyyy; + float4 y = y_ * ns.x + ns.yyyy; + float4 h = 1.0 - abs(x) - abs(y); + + float4 b0 = float4(x.xy, y.xy); + float4 b1 = float4(x.zw, y.zw); + float4 s0 = floor(b0) * 2.0 + 1.0; + float4 s1 = floor(b1) * 2.0 + 1.0; + float4 sh = -step(h, float4(0.0, 0.0, 0.0, 0.0)); + float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + float3 p0 = float3(a0.xy, h.x); + float3 p1 = float3(a0.zw, h.y); + float3 p2 = float3(a1.xy, h.z); + float3 p3 = float3(a1.zw, h.w); + float4 norm = 1.79284291400159 - 0.85373472095314 * float4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + float4 m0 = max(0.5 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + float4 m2 = m0 * m0; + float4 m3 = m2 * m0; + float4 px = float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)); + float4 wide = 48.0 * m2 * px; + float4 narrow = 8.0 * m3; + + float4 cxx = float4(x0.x, x1.x, x2.x, x3.x); + float4 cxy = float4(x0.y, x1.y, x2.y, x3.y); + float4 cxz = float4(x0.z, x1.z, x2.z, x3.z); + float4 cpx = float4(p0.x, p1.x, p2.x, p3.x); + float4 cpy = float4(p0.y, p1.y, p2.y, p3.y); + float4 cpz = float4(p0.z, p1.z, p2.z, p3.z); + + float hxx = 105.0 * (dot(wide * cxx, cxx) - dot(narrow, 2.0 * cpx * cxx + px)); + float hyy = 105.0 * (dot(wide * cxy, cxy) - dot(narrow, 2.0 * cpy * cxy + px)); + float hzz = 105.0 * (dot(wide * cxz, cxz) - dot(narrow, 2.0 * cpz * cxz + px)); + float hxy = 105.0 * (dot(wide * cxx, cxy) - dot(narrow, cpx * cxy + cpy * cxx)); + float hxz = 105.0 * (dot(wide * cxx, cxz) - dot(narrow, cpx * cxz + cpz * cxx)); + float hyz = 105.0 * (dot(wide * cxy, cxz) - dot(narrow, cpy * cxz + cpz * cxy)); + return float3x3(hxx, hxy, hxz, hxy, hyy, hyz, hxz, hyz, hzz); +} + +// The integral over [t0, t1] of clamp(a + b t, lo, hi); see the C# math.integral_clamp_linear comment. +float cultmath_integral_clamp_linear(float a, float b, float lo, float hi, float t0, float t1) +{ + lo = min(lo, hi); + if (b == 0.0) + return t1 != t0 ? clamp(a, lo, hi) * (t1 - t0) : 0.0; + + float direction = t1 < t0 ? -1.0 : 1.0; + float start = min(t0, t1); + float stop = max(t0, t1); + float atLo = (lo - a) / b; + float atHi = (hi - a) / b; + float enter = clamp(min(atLo, atHi), start, stop); + float leave = clamp(max(atLo, atHi), start, stop); + float before = b > 0.0 ? lo : hi; + float after = b > 0.0 ? hi : lo; + float held = enter > start ? before * (enter - start) : 0.0; + float kept = stop > leave ? after * (stop - leave) : 0.0; + float total = held + (a + b * (0.5 * (enter + leave))) * (leave - enter) + kept; + return direction * total; +} + +// Octave sum of cultmath_snoise_grad (invariant 8); see the C# math.fbm_grad comment for the +// per-octave frequency/amplitude derivation and why octaves is clamped. +float4 cultmath_fbm_grad(float3 p, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float value = 0.0; + float3 gradient = float3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + float4 n = cultmath_snoise_grad(p * frequency); + value += amplitude * n.w; + gradient += amplitude * frequency * n.xyz; + frequency *= lacunarity; + amplitude *= gain; + } + + return float4(gradient, value); +} + +// Ridged multifractal noise (Musgrave, Texturing and Modeling, ch. 16); see the C# math.ridged_grad +// comment for the fold/sign derivation, the deliberate crease at n = 0, and why octaves is clamped. +float4 cultmath_ridged_grad(float3 p, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float value = 0.0; + float3 gradient = float3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + float4 n = cultmath_snoise_grad(p * frequency); + float s = sign(n.w); + value += amplitude * (1.0 - abs(n.w)); + gradient += -amplitude * frequency * s * n.xyz; + frequency *= lacunarity; + amplitude *= gain; + } + + return float4(gradient, value); +} + float cultmath_lengthsq(float2 value) { return dot(value, value); } float cultmath_lengthsq(float3 value) { return dot(value, value); } float cultmath_lengthsq(float4 value) { return dot(value, value); } @@ -171,10 +372,6 @@ float cultmath_distance(float2 left, float2 right) { return length(left - right) float cultmath_distance(float3 left, float3 right) { return length(left - right); } float cultmath_distance(float4 left, float4 right) { return length(left - right); } -float2 cultmath_normalize(float2 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } -float3 cultmath_normalize(float3 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } -float4 cultmath_normalize(float4 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } - float2 cultmath_reflect(float2 incident, float2 normal_value) { return incident - 2.0 * dot(normal_value, incident) * normal_value; @@ -213,17 +410,20 @@ float cultmath_damp(float start, float end, float lambda_value, float dt) float2 cultmath_damp(float2 start, float2 end, float lambda_value, float dt) { - return cultmath_lerp(start, end, 1.0 - exp(-lambda_value * dt)); + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, float2(amount, amount)); } float3 cultmath_damp(float3 start, float3 end, float lambda_value, float dt) { - return cultmath_lerp(start, end, 1.0 - exp(-lambda_value * dt)); + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, float3(amount, amount, amount)); } float4 cultmath_damp(float4 start, float4 end, float lambda_value, float dt) { - return cultmath_lerp(start, end, 1.0 - exp(-lambda_value * dt)); + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, float4(amount, amount, amount, amount)); } float cultmath_catmullrom(float p0, float p1, float p2, float p3, float t) @@ -286,6 +486,487 @@ float cultmath_hash(float value) { return cultmath_frac(sin(value) * 43758.5453) float cultmath_hash(float2 value) { return cultmath_hash(dot(value, float2(127.1, 311.7))); } float cultmath_hash(float3 value) { return cultmath_hash(dot(value, float3(127.1, 311.7, 74.7))); } +// PCG hashes (Jarzynski and Olano, JCGT 2020), written over scalar uints so CultMath's int3/int4 carry the bits. +uint cultmath_pcg(uint value) +{ + uint state = value * 747796405u + 2891336453u; + uint word = ((state >> (int)((state >> 28) + 4u)) ^ state) * 277803737u; + return (word >> 22) ^ word; +} + +int3 cultmath_pcg3d(int3 value) +{ + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u, z = (uint)value.z * 1664525u + 1013904223u; + x += y * z; y += z * x; z += x * y; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; + x += y * z; y += z * x; z += x * y; + return int3((int)x, (int)y, (int)z); +} + +int3 cultmath_pcg3d(float3 value) { return cultmath_pcg3d(int3((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z))); } +int3 cultmath_pcg3d(float2 value) { return cultmath_pcg3d(float3(value, 0.0)); } + +int4 cultmath_pcg4d(int4 value) +{ + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u; + uint z = (uint)value.z * 1664525u + 1013904223u, w = (uint)value.w * 1664525u + 1013904223u; + x += y * w; y += z * x; z += x * y; w += y * z; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; w ^= w >> 16; + x += y * w; y += z * x; z += x * y; w += y * z; + return int4((int)x, (int)y, (int)z, (int)w); +} + +int4 cultmath_pcg4d(float4 value) { return cultmath_pcg4d(int4((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z), (int)asuint(value.w))); } + +// Inigo Quilez, "smooth minimum": quadratic-polynomial smin carried to value-and-gradient form. See +// math.smin_grad's comment (math.cs) for why the gradient blend is exact, not an approximation. +float4 cultmath_smin_grad(float4 a, float4 b, float k) +{ + float h = saturate(0.5 + 0.5 * (b.w - a.w) / k); + float value = lerp(b.w, a.w, h) - k * h * (1.0 - h); + float3 gradient = lerp(b.xyz, a.xyz, h); + return float4(gradient, value); +} + +// Invariant 8's one struct return shape (design.md, "HLSL Target: Source Transformations"): +// compared field by field and bit for bit against CultMath.CultCellular, same field order. +struct CultCellular +{ + float4 nearest; + float4 edge; + float id; +}; + +// Worley, "A Cellular Texture Basis Function" (SIGGRAPH 1996). See math.cellular's comment +// (math.cs) for the hashing, gradient, search-radius exactness proof, id source and +// degenerate-point conventions this mirrors exactly, including the 5x5x5 lower-bound prune. +CultCellular cultmath_cellular(float3 p) +{ + float3 cell = floor(p); + float f1 = 1.0e30; + float f2 = 1.0e30; + float3 c1 = float3(0.0, 0.0, 0.0); + float3 c2 = float3(0.0, 0.0, 0.0); + float3 cellId = float3(0.0, 0.0, 0.0); + + for (int dz = -2; dz <= 2; dz++) + { + float lz = max(0.0, abs((float)dz) - 1.0); + for (int dy = -2; dy <= 2; dy++) + { + float ly = max(0.0, abs((float)dy) - 1.0); + for (int dx = -2; dx <= 2; dx++) + { + float lx = max(0.0, abs((float)dx) - 1.0); + float lowerBound = sqrt(lx * lx + ly * ly + lz * lz); + if (lowerBound >= f2) + continue; + + float3 neighbor = cell + float3(dx, dy, dz); + int3 hash = cultmath_pcg3d(int3(neighbor)); + float3 jitter = float3( + (float)((uint)hash.x >> 8) * (1.0 / 16777216.0), + (float)((uint)hash.y >> 8) * (1.0 / 16777216.0), + (float)((uint)hash.z >> 8) * (1.0 / 16777216.0)); + float3 feature = neighbor + jitter; + float d = cultmath_distance(p, feature); + + if (d < f1) + { + f2 = f1; c2 = c1; + f1 = d; c1 = feature; cellId = neighbor; + } + else if (d < f2) + { + f2 = d; c2 = feature; + } + } + } + } + + // F1 = 0 and F2 = 0 share the same degenerate-gradient guard; see math.cellular's comment + // (math.cs) for why F2 = 0 is reachable past roughly |p| = 2^23. + float3 grad1 = f1 > 0.0 ? (p - c1) / f1 : float3(0.0, 0.0, 0.0); + float3 grad2 = f2 > 0.0 ? (p - c2) / f2 : float3(0.0, 0.0, 0.0); + + // id comes from pcg4d over the winning cell's integer coordinate alone (same int-hashing rule + // as the jitter above), never from the pcg3d hash that produced its jitter (F4). + int4 idHash = cultmath_pcg4d(int4(int3(cellId), 0)); + + CultCellular result; + result.nearest = float4(grad1, f1); + result.edge = float4(grad2 - grad1, f2 - f1); + result.id = (float)((uint)idHash.w >> 8) * (1.0 / 16777216.0); + return result; +} + +// Sites: a site is float4(position.xyz, weight). A shader function cannot take a span (design.md, "Sites"), so a span is a +// fixed-capacity array and a count (cultmath_power_border, below), or a loop over a per-site step: +// CultSiteCells cells = cultmath_site_cells_empty(); +// for (int i = 0; i < count; i++) +// cells = cultmath_site_cells_insert(cells, cultmath_power_score(p, sites[i]), i); +// The exact power cell border is cultmath_power_border, the second loop over the sites that skips the owner cells.nearestSite. +// The step trusts the owner: a p outside the owner's cell reports distance 0 with that plane's normal, not an error. +// Statement for statement with math.Sites.cs (power_score, multiplicative_score, site_cells_*, gabriel_margin). +struct CultSiteCells +{ + float4 nearest; + float4 second; + float nearestSite; + float secondSite; +}; + +float4 cultmath_power_score(float3 p, float4 site) +{ + float3 offset = p - site.xyz; + return float4(offset * 2.0, dot(offset, offset) - site.w * site.w); +} + +float4 cultmath_multiplicative_score(float3 p, float4 site) +{ + float3 offset = p - site.xyz; + float r = length(offset); + float3 gradient = r > 0.0 ? offset / (r * site.w) : float3(0.0, 0.0, 0.0); + return float4(gradient, r / site.w); +} + +CultSiteCells cultmath_site_cells_empty() +{ + CultSiteCells result; + result.nearest = float4(0.0, 0.0, 0.0, 1.0e30); + result.second = float4(0.0, 0.0, 0.0, 1.0e30); + result.nearestSite = -1.0; + result.secondSite = -1.0; + return result; +} + +CultSiteCells cultmath_site_cells_insert(CultSiteCells cells, float4 score, int index) +{ + CultSiteCells result = cells; + if (score.w < cells.nearest.w) + { + result.second = cells.nearest; + result.secondSite = cells.nearestSite; + result.nearest = score; + result.nearestSite = (float)index; + } + else if (score.w < cells.second.w) + { + result.second = score; + result.secondSite = (float)index; + } + + return result; +} + +float4 cultmath_site_cells_border(CultSiteCells cells) +{ + float3 n = cells.second.xyz - cells.nearest.xyz; + float len = length(n); + if (cells.secondSite < 0.0 || len <= 0.0) + return float4(0.0, 0.0, 0.0, 1.0e30); + return float4(n / len, (cells.second.w - cells.nearest.w) / len); +} + +float4 cultmath_power_border_step(float3 p, float4 owner, float4 other, float4 border) +{ + float3 d = other.xyz - owner.xyz; + float len = length(d); + if (len <= 0.0) + return border; + float plane = max((dot(owner.xyz - p, d) + 0.5 * (dot(d, d) + (owner.w - other.w) * (owner.w + other.w))) / len, 0.0); + return plane < border.w ? float4(-d / len, plane) : border; +} + +float cultmath_gabriel_margin(float3 a, float3 b, float3 other) +{ + float r = cultmath_distance(a, b) * 0.5; + if (r <= 0.0) + return -1.0; + return (cultmath_distance(other, (a + b) * 0.5) - r) / r; +} + +// Weighted lattice cells: the four per-cell steps of math.Lattice.cs, statement for statement; cultmath_weighted_lattice_cells, +// after them, is the whole function. +float3 cultmath_lattice_site(float2 cell, float time, float drift) +{ + int3 h = cultmath_pcg3d(int3((int)cell.x, (int)cell.y, 0)); + float2 phase = float2((float)((uint)h.x >> 8) * (1.0 / 16777216.0), (float)((uint)h.y >> 8) * (1.0 / 16777216.0)); + float2 site = cell + 0.5 + 0.5 * float2(sin(drift * time + CULTMATH_TAU * phase.x), sin(drift * time + CULTMATH_TAU * phase.y)); + return float3(site, 0.5 + 0.5 * ((float)((uint)h.z >> 8) * (1.0 / 16777216.0))); +} + +float cultmath_lattice_weight(float base_weight, float border, float boost, float falloff) +{ + float t = border / falloff; + return base_weight * (1.0 + boost * exp(-(t * t))); +} + +float cultmath_lattice_distance(float2 q, float2 site, float weight, float2 normal, float stretch) +{ + float2 v = site - q; + float a = dot(v, normal); + float c = v.x * normal.y - v.y * normal.x; + return weight * length(float2(stretch * a, c)); +} + +float cultmath_lattice_smooth_step(float m, float d, float f1, float smoothing) +{ + if (d >= f1 + 2.0 * smoothing) + return m; + float h = cultmath_smoothstep(0.0, 1.0, 0.5 + 0.5 * (m - d) / smoothing); + float next = m + (d - m) * h - h * (1.0 - h) * smoothing / (1.0 + 3.0 * smoothing); + return min(next, f1 + smoothing); +} + +// Sites by value: a shader function cannot take a span, so these take float4 sites[CULTMATH_MAX_SITES] and the count in use, with +// count in [0, CULTMATH_MAX_SITES]. A consumer defines CULTMATH_MAX_SITES before including this file to change the capacity; loops +// run to count, so the capacity costs uniform space, not iterations. A caller whose sites live in a buffer copies them into a local array first. +// The preconditions the C# functions throw for are the caller's in a shader: finite arguments, cellSize > 0, boost in [0, 4], +// falloff > 0, smoothing in (0, 1], stretch in [1, 2], p within 2^23 cells. A zero stretchNormal means (1, 0) and needs stretch == 1. +// cultmath_weighted_lattice_cells is math.weighted_lattice_cells: the ring pass is bounded by k <= 37 and exits as C# does, and the +// box pass recomputes each distance instead of caching it (a 75 x 75 private array is not a shader option), with the same values. +#ifndef CULTMATH_MAX_SITES +#define CULTMATH_MAX_SITES 128 +#endif + +float4 cultmath_power_border(float3 p, float4 sites[CULTMATH_MAX_SITES], int count) +{ + CultSiteCells cells = cultmath_site_cells_empty(); + for (int i = 0; i < count; i++) + cells = cultmath_site_cells_insert(cells, cultmath_power_score(p, sites[i]), i); + float4 border = float4(0.0, 0.0, 0.0, 1.0e30); + int owner = (int)cells.nearestSite; + if (owner < 0) + return border; + for (int k = 0; k < count; k++) + if (k != owner) + border = cultmath_power_border_step(p, sites[owner], sites[k], border); + return border; +} + +float cultmath_lattice_cell_distance(float2 q, float2 cell, float time, float drift, float4 bodies[CULTMATH_MAX_SITES], int count, + float cellSize, float boost, float falloff, float2 normal, float stretch) +{ + float3 site = cultmath_lattice_site(cell, time, drift); + float border = cultmath_power_border(float3((cell + 0.5) * cellSize, 0.0), bodies, count).w; + return cultmath_lattice_distance(q, site.xy, cultmath_lattice_weight(site.z, border, boost, falloff), normal, stretch); +} + +float4 cultmath_weighted_lattice_cells(float2 p, float time, float4 bodies[CULTMATH_MAX_SITES], int count, float cellSize, float drift, + float boost, float falloff, float smoothing, float2 stretchNormal, float stretch) +{ + float scale = max(abs(stretchNormal.x), abs(stretchNormal.y)); + float2 normal = float2(1.0, 0.0); + if (scale > 0.0) + { + normal = stretchNormal / scale; + normal = normal / length(normal); + } + float2 q = p / cellSize; + float2 origin = floor(q); + int cx0 = (int)origin.x; + int cz0 = (int)origin.y; + float f1 = 1.0e30; + float f2 = 1.0e30; + int reach = 0; + for (int k = 0; k <= 37; k++) + { + if (k > 1 && 0.5 * (float)(k - 1) >= max(f2, f1 + 2.0 * smoothing)) + break; + for (int dz = -k; dz <= k; dz++) + { + int step = dz == -k || dz == k || k == 0 ? 1 : 2 * k; + for (int dx = -k; dx <= k; dx += step) + { + float d = cultmath_lattice_cell_distance(q, float2(cx0 + dx, cz0 + dz), time, drift, bodies, count, cellSize, boost, falloff, normal, stretch); + if (d < f1) { f2 = f1; f1 = d; } + else if (d < f2) f2 = d; + } + } + reach = k; + } + float m = f1 + smoothing; + float best = 1.0e30; + float second = 1.0e30; + int winDx = 0; + int winDz = 0; + for (int dz = -reach; dz <= reach; dz++) + for (int dx = -reach; dx <= reach; dx++) + { + float d = cultmath_lattice_cell_distance(q, float2(cx0 + dx, cz0 + dz), time, drift, bodies, count, cellSize, boost, falloff, normal, stretch); + if (d < best) { second = best; best = d; winDx = dx; winDz = dz; } + else if (d < second) second = d; + m = cultmath_lattice_smooth_step(m, d, f1, smoothing); + } + int4 id = cultmath_pcg4d(int4(cx0 + winDx, cz0 + winDz, 0, 0)); + return float4(best, second, m, (float)((uint)id.w >> 8) * (1.0 / 16777216.0)); +} + +float2 cultmath_segment_closest(float2 point_value, float2 start, float2 end) +{ + float2 segment = end - start; + float segmentLengthSq = cultmath_lengthsq(segment); + if (segmentLengthSq <= 0.0) + return start; + + float t = cultmath_saturate(dot(point_value - start, segment) / segmentLengthSq); + return start + segment * t; +} + +float3 cultmath_segment_closest(float3 point_value, float3 start, float3 end) +{ + float3 segment = end - start; + float segmentLengthSq = cultmath_lengthsq(segment); + if (segmentLengthSq <= 0.0) + return start; + + float t = cultmath_saturate(dot(point_value - start, segment) / segmentLengthSq); + return start + segment * t; +} + +float cultmath_distance_to_segment(float2 point_value, float2 start, float2 end) +{ + return cultmath_distance(point_value, cultmath_segment_closest(point_value, start, end)); +} + +float cultmath_distance_to_segment(float3 point_value, float3 start, float3 end) +{ + return cultmath_distance(point_value, cultmath_segment_closest(point_value, start, end)); +} + +#include "CultMath.Phacelle.hlsl" +#include "CultMath.Interval.hlsl" +#include "CultMath.Cycles.hlsl" +#include "CultMath.Affine.hlsl" + +// Span stages (invariant 8): the SpanPath, SpanStage and SpanNoise of math.Span.cs, field for field in +// C#'s order, and cultmath_span_stage, its octave stage, statement for statement so the text is a bit-for-bit +// mirror. They follow the includes because the bounds read CULTMATH_SNOISE_LIPSCHITZ, _HESSIAN and _THIRD. +// A shader caller builds a SpanStage itself (SpanStage(1.0, 1.0, vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)) +// is the identity of math.SpanStage.Identity, which has no shader form); see math.span_stage's comments for +// the span, the transform, the bounds and the allowances. cultmath_span_rounding and cultmath_span_slack +// are math.span_rounding and math.span_slack, the owners of S_o and of the three allowances. +struct SpanPath +{ + float3 midpoint; + float3 velocity; + float speed; + float acceleration; + float halfLength; +}; + +struct SpanStage +{ + float frequency; + float stretch; + float3 axis; + float3 shift; + float3 offset; + float3 octaveStep; +}; + +struct SpanNoise +{ + float4 field; + float curvature; + float fold; +}; + +float cultmath_span_rounding(float scale, float3 mq, SpanStage stage, float3 octaveShift, float nu, float halfLength) +{ + return 9.5367431640625e-7 * (abs(scale) * (cultmath_csum(abs(mq)) + cultmath_csum(abs(stage.shift))) + cultmath_csum(abs(stage.offset)) + cultmath_csum(abs(octaveShift)) + 1.7320508 * nu * halfLength); +} + +float3 cultmath_span_slack(float rounding) +{ + return float3(CULTMATH_SNOISE_READ_VALUE + CULTMATH_SNOISE_LIPSCHITZ * rounding, + CULTMATH_SNOISE_READ_GRADIENT + CULTMATH_SNOISE_HESSIAN * rounding, + 9.765625e-4 + CULTMATH_SNOISE_THIRD * rounding); +} + +// The octave stage behind cultmath_span_fbm and cultmath_span_ridged, as math.span_stage is behind span_fbm +// and span_ridged. The Frobenius norm of the Hessian is written out in C#'s order (GLSL has no _mRC member +// access); the C# local named step is octaveShift here (it would shadow GLSL's step()). +SpanNoise cultmath_span_stage(bool ridged, SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + float3 q = path.midpoint; + float halfLength = path.halfLength; + octaves = clamp(octaves, 0, 16); + bool stretched = dot(stage.axis, stage.axis) > 0.0 && stage.stretch != 1.0; + float3 direction = stretched ? normalize(stage.axis) : float3(0.0, 0.0, 0.0); + float squeeze = stretched ? 1.0 / stage.stretch - 1.0 : 0.0; + float norm = abs(stage.frequency) * (stretched ? max(1.0, 1.0 / stage.stretch) : 1.0); + float3 mq = stretched ? stage.frequency * (q + squeeze * dot(direction, q) * direction) : stage.frequency * q; + float3 mv = stretched ? stage.frequency * (path.velocity + squeeze * dot(direction, path.velocity) * direction) : stage.frequency * path.velocity; + float amplitude = 1.0; + float scale = 1.0; + float value = 0.0; + float3 gradient = float3(0.0, 0.0, 0.0); + float curvature = 0.0; + float fold = 0.0; + for (int i = 0; i < octaves; i++) + { + float3 octaveShift = (float)i * stage.octaveStep; + float3 x = scale * (mq + stage.shift) + (stage.offset + octaveShift); + float4 n = cultmath_snoise_grad(x); + float3 g = float3(n.x, n.y, n.z); + float3 mg = stretched ? stage.frequency * (g + squeeze * dot(direction, g) * direction) : stage.frequency * g; + if (ridged) + { + float s = sign(n.w); + value += amplitude * (1.0 - abs(n.w)); + gradient += -amplitude * scale * s * mg; + } + else + { + value += amplitude * n.w; + gradient += amplitude * scale * mg; + } + + float weight = abs(amplitude); + float factor = abs(scale) * norm; + float nu = factor * path.speed; + float rounding = cultmath_span_rounding(scale, mq, stage, octaveShift, nu, halfLength); + float3 slack = cultmath_span_slack(rounding); + float valueSlack = slack.x; + float gradientSlack = slack.y; + float hessianSlack = slack.z; + float3x3 hm = cultmath_snoise_hessian(x); + float frobenius = sqrt(hm[0][0] * hm[0][0] + hm[0][1] * hm[0][1] + hm[0][2] * hm[0][2] + hm[1][0] * hm[1][0] + hm[1][1] * hm[1][1] + hm[1][2] * hm[1][2] + + hm[2][0] * hm[2][0] + hm[2][1] * hm[2][1] + hm[2][2] * hm[2][2]); + float hessianBound = min(CULTMATH_SNOISE_HESSIAN, frobenius + hessianSlack + CULTMATH_SNOISE_THIRD * nu * halfLength); + curvature += weight * factor * factor * hessianBound; + if (ridged) + { + float3 w = scale * mv; + float reach = hessianBound * nu * halfLength; + float gl = min(CULTMATH_SNOISE_LIPSCHITZ, length(g) + gradientSlack + reach); + float travel = (abs(dot(g, w)) + gradientSlack * length(w)) * halfLength + (hessianBound * nu * length(w) + gl * factor * path.acceleration) * (0.5 * halfLength * halfLength) + 2.0 * valueSlack; + fold += 2.0 * weight * max(travel - abs(n.w), 0.0); + } + + scale *= lacunarity; + amplitude *= gain; + } + + SpanNoise result; + result.field = float4(gradient, value); + result.curvature = curvature; + result.fold = fold; + return result; +} + +SpanNoise cultmath_span_fbm(SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + return cultmath_span_stage(false, path, stage, octaves, lacunarity, gain); +} + +SpanNoise cultmath_span_ridged(SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + return cultmath_span_stage(true, path, stage, octaves, lacunarity, gain); +} + float cultmath_value_noise(float2 position) { float2 cell = floor(position); diff --git a/packages/cultmath/src/CultMath/BoundedLeastSquares.cs b/packages/cultmath/src/CultMath/BoundedLeastSquares.cs new file mode 100644 index 00000000..7e580755 --- /dev/null +++ b/packages/cultmath/src/CultMath/BoundedLeastSquares.cs @@ -0,0 +1,540 @@ +using System.Runtime.InteropServices; + +namespace CultMath; + +/// Outcome of a solve. +public enum BoundedLeastSquaresStatus +{ + /// The KKT conditions hold: every free variable has zero gradient and every bound has a gradient pointing into it. + Converged, + + /// The iteration cap was reached. x holds the last feasible iterate, which is never worse than the clamped start. + IterationLimit, + + /// The input broke the contract; nothing was solved and x is exactly as passed. names which input. + InvalidInput, +} + +/// Which input of breaks its contract; the first failure in the order of the members. +public enum BoundedLeastSquaresInput +{ + /// Every input meets the contract; Solve will not return . + Valid, + + /// The KKT tolerance is not finite and greater than zero. + InvalidTolerance, + + /// Some lo or hi is NaN, lo[j] > hi[j], lo[j] is +Inf or hi[j] is -Inf. + InvalidBounds, + + /// Some entry of a is NaN or infinite. + NonFiniteMatrix, + + /// Some entry of b is NaN or infinite. With n = 0 there is no unknown, b is never read and no entry is judged. + NonFiniteTarget, +} + +/// A decision took, for tests that pin the stopping rule by its decisions. +internal enum SolveEvent +{ + /// A step stopped at a bound: column, step length. + Step, + + /// A bound whose violation beat the best so far, judged against its rounding bound: column, violation, noise, best before. + Candidate, + + /// A bound released: column, the stall mark after the release. + Release, + + /// A free column whose gradient is above the tolerance, so the free set is not stationary: column, the gradient's magnitude, the tolerance it was judged against. One per such column, before the pass's other decisions. + FreeViolated, + + /// KKT holds and the solve is over: the tolerance. + Kkt, + + /// A stationarity miss with no release, the cost fell and the solve goes on: cost, mark before, allowance. + Miss, + + /// A stationarity miss with no release, the cost did not fall: the solve is over: cost, mark, allowance. + Stall, + + /// The iteration cap ended the solve. + Cap, +} + +/// Observes the decisions of one solve in order; never changes one. +internal interface ISolveTrace +{ + void Record(SolveEvent kind, int column, double a, double b, double c); +} + +/// +/// Dense bounded least squares: min ||A x - b||^2 subject to lo <= x <= hi, for small problems +/// (tens of rows and columns). C#-only, like the intercept helpers in ; there is no HLSL mirror. +/// +/// +/// Primal active set. Each iteration solves the free variables by Cholesky on the normal equations, takes the +/// step to the first bound it would cross, and, once a full step lands, releases the bound with the most +/// violated gradient sign. Free columns that are linearly dependent on earlier free columns (a zero column, a +/// duplicate) get a zero step instead of a failed pivot, so a singular free set never throws. +/// +/// Precision. A, b and x are float at the API; everything else, including the working iterate, the +/// gradient and the KKT test, is double, carved from the caller's workspace. x is converted in at the start +/// and back out at the end, so a returned float x is the nearest float to the double solution and always +/// inside the box. +/// +/// +/// Stopping. KKT termination uses a tolerance of (1e-6) times the problem's +/// gradient scale (the largest gradient component at the box point nearest the origin), so scaling A, b or the +/// bounds, and the choice of warm start, do not change it. A caller whose rows span many decades of weight can pass +/// a smaller kktRelativeTolerance, which changes only this tolerance: the rounding bound and progress rule +/// below and the pivot threshold are fixed. A bound is released only when its violation exceeds both the tolerance +/// and the rounding bound of its double gradient, so a tolerance below the noise cannot cycle on a release. The +/// tolerance is otherwise only a resolution: once a stationarity miss that releases nothing has been followed by a +/// pass that lowers the cost by no more than rounding, the solver reports +/// , so a free set whose residual is rounding costs one confirming +/// iteration rather than the iteration cap. A pass that releases a bound is never judged by the cost. +/// +/// +/// Near-singular problems. The normal equations square the condition number, so the cost gap grows with cond(A) +/// (measured: below 1e-6 of |b|^2 through cond(A) 3e5, about 2e-5 at 1e6; the gap is relative to |b|^2), independent of the absolute scale of A. +/// The solver owns optimality up to that range. Columns whose pivot falls below 1e-12 of their own diagonal (cond(A) +/// beyond roughly 1e6) are treated as dependent and not moved, so the answer there is one optimum among many, not the +/// minimum-norm one. Callers beyond that range, or that need the minimum-norm answer, add a small ridge row to +/// A and b; that stays the caller's policy. +/// +/// The solver allocates nothing and is deterministic. +/// +/// Input contract: kktRelativeTolerance must be finite and greater than zero; a and b must be finite; lo and hi must not be NaN and need +/// lo <= hi. Infinite bounds are allowed and mean unbounded on that side (lo = -Inf, +/// hi = +Inf); lo = +Inf or hi = -Inf is invalid. Any violation returns +/// without throwing, with iterations 0 and +/// x exactly as passed. A NaN or infinite warm start is legal: it is clamped into the box (an infinite +/// result on an unbounded side becomes 0 clamped to the box). Spans shorter than the stated dimensions are a +/// caller bug and throw . reports which input broke the +/// contract, and Solve returns InvalidInput exactly when it does not return +/// . +/// +/// +public static class BoundedLeastSquares +{ + /// Default iteration cap for Solve. + public const int DefaultMaxIterations = 100; + + /// Default KKT tolerance, relative to the gradient scale; see Stopping in the type remarks. + public const double DefaultKktRelativeTolerance = 1e-6; + + private const double PivotRelativeTolerance = 1e-12; + private const double StallRelativeTolerance = 1e-15; + + /// Floats of caller-supplied workspace needed for columns. + public static int WorkspaceLength(int n) => 2 * (2 * n * n + 6 * n) + 3 * n; + + /// + /// Checks the inputs of Solve against its contract and names the first one that breaks it, in the order + /// tolerance, bounds, matrix, target. Solve calls this and returns + /// for any result but . + /// It reads its arguments only, allocates nothing and does not throw for a bad value. + /// + /// Rows of . + /// Columns of , and length of and . + /// Row-major m * n matrix. + /// Length m target. With n = 0 there is no unknown and is not read. + /// Lower bounds. + /// Upper bounds. + /// The tolerance Solve will be given. + /// A span is shorter than the stated dimensions, or or is negative: a caller bug, not an invalid input. + public static BoundedLeastSquaresInput Validate( + int m, int n, + ReadOnlySpan a, ReadOnlySpan b, + ReadOnlySpan lo, ReadOnlySpan hi, + double kktRelativeTolerance = DefaultKktRelativeTolerance) + { + if (m < 0 || n < 0 || a.Length < m * n || b.Length < m || lo.Length < n || hi.Length < n) + throw new ArgumentException("BoundedLeastSquares: span shorter than the stated dimensions."); + + if (!(kktRelativeTolerance > 0.0) || double.IsPositiveInfinity(kktRelativeTolerance)) + return BoundedLeastSquaresInput.InvalidTolerance; + for (var j = 0; j < n; j++) + if (!(lo[j] <= hi[j]) || float.IsPositiveInfinity(lo[j]) || float.IsNegativeInfinity(hi[j])) + return BoundedLeastSquaresInput.InvalidBounds; + for (var i = 0; i < m * n; i++) + if (!float.IsFinite(a[i])) + return BoundedLeastSquaresInput.NonFiniteMatrix; + if (n > 0) + for (var r = 0; r < m; r++) + if (!float.IsFinite(b[r])) + return BoundedLeastSquaresInput.NonFiniteTarget; + return BoundedLeastSquaresInput.Valid; + } + + /// + /// Minimises ||A x - b||^2 subject to lo <= x <= hi. is the warm start + /// on entry (clamped to the box first) and the result on exit. + /// + /// Rows of . + /// Columns of , and length of , and . + /// Row-major m * n matrix. + /// Length m target. + /// Lower bounds; each must be <= hi; -Inf means unbounded below. + /// Upper bounds; +Inf means unbounded above. + /// Warm start in, solution out. + /// At least floats; contents on entry are ignored. + /// Active-set iterations used. + /// Iteration cap. + public static BoundedLeastSquaresStatus Solve( + int m, int n, + ReadOnlySpan a, ReadOnlySpan b, + ReadOnlySpan lo, ReadOnlySpan hi, + Span x, Span workspace, + out int iterations, + int maxIterations = DefaultMaxIterations) + => Solve(m, n, a, b, lo, hi, x, workspace, out iterations, DefaultKktRelativeTolerance, maxIterations); + + /// + /// Minimises ||A x - b||^2 subject to lo <= x <= hi. is the warm start + /// on entry (clamped to the box first) and the result on exit. is the + /// stationarity resolution relative to the gradient scale defined under Stopping; the overload without it passes + /// and gives the same result. + /// + /// Rows of . + /// Columns of , and length of , and . + /// Row-major m * n matrix. + /// Length m target. + /// Lower bounds; each must be <= hi; -Inf means unbounded below. + /// Upper bounds; +Inf means unbounded above. + /// Warm start in, solution out. + /// At least floats; contents on entry are ignored. + /// Active-set iterations used. + /// Finite and greater than zero, else . Tighten it when rows span many decades of weight; releases below the gradient's rounding bound are not taken, and free-set residuals at rounding level end on the progress rule. + /// Iteration cap. + public static BoundedLeastSquaresStatus Solve( + int m, int n, + ReadOnlySpan a, ReadOnlySpan b, + ReadOnlySpan lo, ReadOnlySpan hi, + Span x, Span workspace, + out int iterations, + double kktRelativeTolerance, + int maxIterations = DefaultMaxIterations) + => SolveTraced(m, n, a, b, lo, hi, x, workspace, out iterations, kktRelativeTolerance, maxIterations, null); + + // The whole solve. A trace sink only observes: every decision below is taken from the same values with or without one. + internal static BoundedLeastSquaresStatus SolveTraced( + int m, int n, + ReadOnlySpan a, ReadOnlySpan b, + ReadOnlySpan lo, ReadOnlySpan hi, + Span x, Span workspace, + out int iterations, + double kktRelativeTolerance, + int maxIterations, + ISolveTrace? trace) + { + if (x.Length < n || workspace.Length < WorkspaceLength(n)) + throw new ArgumentException("BoundedLeastSquares: span shorter than the stated dimensions."); + iterations = 0; + if (Validate(m, n, a, b, lo, hi, kktRelativeTolerance) != BoundedLeastSquaresInput.Valid) + return BoundedLeastSquaresStatus.InvalidInput; + + // Double-precision vectors and matrices first, then the integer flags, all carved from the caller's floats. + var doubleCount = 2 * n * n + 6 * n; + var dbl = MemoryMarshal.Cast(workspace.Slice(0, 2 * doubleCount)); + var ata = Take(ref dbl, n * n); + var chol = Take(ref dbl, n * n); + var atb = Take(ref dbl, n); + var g = Take(ref dbl, n); + var p = Take(ref dbl, n); + var y = Take(ref dbl, n); + var rhs = Take(ref dbl, n); + var xd = Take(ref dbl, n); + // One flag per column: 0 free, -1 at lo, +1 at hi. Free-list and dependency flags follow. + var ints = MemoryMarshal.Cast(workspace.Slice(2 * doubleCount, 3 * n)); + var state = Take(ref ints, n); + var freeIndex = Take(ref ints, n); + var dependent = Take(ref ints, n); + + for (var j = 0; j < n; j++) + { + var sb = 0.0; + for (var r = 0; r < m; r++) + sb += (double)a[r * n + j] * b[r]; + atb[j] = sb; + for (var k = 0; k <= j; k++) + { + var sa = 0.0; + for (var r = 0; r < m; r++) + sa += (double)a[r * n + j] * a[r * n + k]; + ata[j * n + k] = sa; + ata[k * n + j] = sa; + } + } + + // From here x is written. A warm start that is NaN is moved to the lower bound, and an infinite result + // (an unbounded side) restarts from 0 clamped to the box. The working iterate lives in double; x is only + // the API's float view of it. + for (var j = 0; j < n; j++) + { + var l = lo[j]; + var h = hi[j]; + var v = float.IsNaN(x[j]) ? l : Math.Clamp(x[j], l, h); + if (float.IsInfinity(v)) + v = Math.Clamp(0f, l, h); + x[j] = v; + xd[j] = v; + state[j] = v == l ? -1 : (v == h ? 1 : 0); + } + + // The tolerance's scale is the gradient magnitude at the box point nearest the origin (the origin itself + // when it is inside the box, where the gradient is -A^T b). It depends on A, b and the bounds, never on the + // warm start, so a far start cannot be judged converged by its own steepness, and b = 0 with a box that + // excludes the origin still gets a real scale. It is zero only when that point is already stationary, and + // then the progress rule below does the stopping. + var gScale = 0.0; + for (var j = 0; j < n; j++) + { + var s = -atb[j]; + for (var k = 0; k < n; k++) + s += ata[j * n + k] * Math.Clamp(0.0, lo[k], hi[k]); + gScale = Math.Max(gScale, Math.Abs(s)); + } + var kktTol = kktRelativeTolerance * gScale; + + // Cost at the last point from which the solver continued past a stationarity miss with no release; a + // release resets it. A stationarity miss that ends without lowering it has nothing left to gain: the + // tolerance is a resolution, not the stopping rule, and a noise floor above it must not spin to the cap. + var fMark = double.PositiveInfinity; + var status = BoundedLeastSquaresStatus.IterationLimit; + while (true) + { + Gradient(ata, atb, xd, g, n); + + var freeCount = 0; + for (var j = 0; j < n; j++) + if (state[j] == 0) + freeIndex[freeCount++] = j; + SolveFreeSet(ata, chol, g, p, y, rhs, freeIndex.Slice(0, freeCount), dependent, n); + + var t = 1.0; + var block = -1; + for (var i = 0; i < freeCount; i++) + { + var j = freeIndex[i]; + var pj = p[j]; + if (pj == 0.0) continue; + var tj = pj > 0.0 ? (hi[j] - xd[j]) / pj : (lo[j] - xd[j]) / pj; + if (tj < t) + { + t = tj; + block = j; + } + } + + if (block >= 0) + { + if (iterations >= maxIterations) { trace?.Record(SolveEvent.Cap, -1, 0.0, 0.0, 0.0); status = BoundedLeastSquaresStatus.IterationLimit; break; } + iterations++; + trace?.Record(SolveEvent.Step, block, t, 0.0, 0.0); + for (var i = 0; i < freeCount; i++) + { + var j = freeIndex[i]; + xd[j] = Math.Clamp(xd[j] + t * p[j], lo[j], hi[j]); + } + if (p[block] > 0.0) { xd[block] = hi[block]; state[block] = 1; } + else { xd[block] = lo[block]; state[block] = -1; } + continue; + } + + for (var i = 0; i < freeCount; i++) + { + var j = freeIndex[i]; + xd[j] = Math.Clamp(xd[j] + p[j], lo[j], hi[j]); + } + Gradient(ata, atb, xd, g, n); + + // Stationarity of the free set is part of KKT: a Newton step on a near-singular free set can leave a residual gradient. + var freeViolated = FreeSetViolated(g, freeIndex, freeCount, kktTol, trace); + var release = SelectRelease(ata, atb, xd, g, state, lo, hi, kktTol, n, trace); + if (JudgePass(release, freeViolated, kktTol, ref fMark, xd, g, atb, n, trace)) { status = BoundedLeastSquaresStatus.Converged; break; } + if (iterations >= maxIterations) { trace?.Record(SolveEvent.Cap, -1, 0.0, 0.0, 0.0); status = BoundedLeastSquaresStatus.IterationLimit; break; } + iterations++; + // A stationarity miss re-solves the same free set from the improved point. + if (release >= 0) state[release] = 0; + } + + for (var j = 0; j < n; j++) + x[j] = (float)xd[j]; + return status; + } + + // Whether any free column's gradient is above the tolerance; every such column is recorded with the magnitude and the threshold it was judged against. + internal static bool FreeSetViolated(ReadOnlySpan g, ReadOnlySpan freeIndex, int freeCount, double kktTol, ISolveTrace? trace) + { + var violated = false; + for (var i = 0; i < freeCount; i++) + { + var magnitude = Math.Abs(g[freeIndex[i]]); + if (magnitude > kktTol) + { + trace?.Record(SolveEvent.FreeViolated, freeIndex[i], magnitude, kktTol, 0.0); + violated = true; + } + } + return violated; + } + + // The bound to release: the one with the most violated gradient sign, the first of equal violations, and only if + // the violation exceeds both the tolerance (the starting `worst`) and the rounding bound of its own gradient. + // -1 when none qualifies. + internal static int SelectRelease( + ReadOnlySpan ata, ReadOnlySpan atb, ReadOnlySpan x, ReadOnlySpan g, + ReadOnlySpan state, ReadOnlySpan lo, ReadOnlySpan hi, double kktTol, int n, ISolveTrace? trace) + { + var release = -1; + var worst = kktTol; + for (var j = 0; j < n; j++) + { + if (lo[j] == hi[j]) continue; + // A bound at lo wants a positive gradient and one at hi a negative one; a free column has state 0. + var violation = state[j] * g[j]; + if (violation > worst) + { + var noise = ReleaseNoise(ata, atb, x, j, n); + trace?.Record(SolveEvent.Candidate, j, violation, noise, worst); + if (violation > noise) + { + worst = violation; + release = j; + } + } + } + return release; + } + + // What a full step's outcome means for the solve: true when it is over. Nothing to release and a stationary free + // set is KKT. Nothing to release with a stationarity miss ends when the cost has not fallen below the last such + // miss's by more than rounding, else it records the cost. A release is never judged by the cost and resets the mark. + internal static bool JudgePass( + int release, bool freeViolated, double kktTol, ref double fMark, + ReadOnlySpan x, ReadOnlySpan g, ReadOnlySpan atb, int n, ISolveTrace? trace) + { + if (release < 0 && !freeViolated) + { + trace?.Record(SolveEvent.Kkt, -1, kktTol, 0.0, 0.0); + return true; + } + if (release < 0) + { + var f = Objective(x, g, atb, n, out var fScale); + var allowance = StallRelativeTolerance * fScale; + var stalled = f >= fMark - allowance; + trace?.Record(stalled ? SolveEvent.Stall : SolveEvent.Miss, -1, f, fMark, allowance); + if (stalled) return true; + fMark = f; + } + else + { + fMark = double.PositiveInfinity; + trace?.Record(SolveEvent.Release, release, fMark, 0.0, 0.0); + } + return false; + } + + private static Span Take(ref Span pool, int length) + { + var head = pool.Slice(0, length); + pool = pool.Slice(length); + return head; + } + + // 0.5 x^T A^T A x - x^T A^T b (the cost up to a constant), from the gradient at x; scale is the magnitude of + // the terms summed, which is what the rounding error of the sum is proportional to. + private static double Objective(ReadOnlySpan x, ReadOnlySpan g, ReadOnlySpan atb, int n, out double scale) + { + var f = 0.0; + scale = 0.0; + for (var j = 0; j < n; j++) + { + f += 0.5 * x[j] * (g[j] - atb[j]); + scale += 0.5 * Math.Abs(x[j]) * (Math.Abs(g[j]) + Math.Abs(atb[j])); + } + return f; + } + + // Rounding bound of the double gradient component j: gamma_(n+1) (Higham, inner products) times the magnitude of its terms. + internal static double ReleaseNoise(ReadOnlySpan ata, ReadOnlySpan atb, ReadOnlySpan x, int j, int n) + { + var s = Math.Abs(atb[j]); + for (var k = 0; k < n; k++) s += Math.Abs(ata[j * n + k] * x[k]); + return (n + 1) * 2.220446049250313e-16 * s; + } + + private static void Gradient(ReadOnlySpan ata, ReadOnlySpan atb, ReadOnlySpan x, Span g, int n) + { + for (var j = 0; j < n; j++) + { + var s = -atb[j]; + for (var k = 0; k < n; k++) + s += ata[j * n + k] * x[k]; + g[j] = s; + } + } + + // Newton step over the free set: solves (A^T A)_FF p_F = -g_F by Cholesky. A free column whose pivot collapses + // (dependent on earlier free columns) is dropped from the factor and gets p = 0. No refinement step: Cholesky is + // backward stable, so the residual, which is the gradient the KKT test reads, is already at rounding level, and + // refining in the same precision does not improve the forward error. + private static void SolveFreeSet( + ReadOnlySpan ata, Span l, ReadOnlySpan g, Span p, Span y, + Span rhs, ReadOnlySpan free, Span dependent, int n) + { + var k = free.Length; + for (var i = 0; i < k; i++) + { + var fi = free[i]; + var d = ata[fi * n + fi]; + for (var c = 0; c < i; c++) + d -= l[i * n + c] * l[i * n + c]; + if (d <= PivotRelativeTolerance * ata[fi * n + fi]) + { + dependent[i] = 1; + for (var c = 0; c < i; c++) l[i * n + c] = 0.0; + l[i * n + i] = 1.0; + for (var r = i + 1; r < k; r++) l[r * n + i] = 0.0; + continue; + } + dependent[i] = 0; + var lii = Math.Sqrt(d); + l[i * n + i] = lii; + for (var r = i + 1; r < k; r++) + { + var s = ata[free[r] * n + fi]; + for (var c = 0; c < i; c++) + s -= l[r * n + c] * l[i * n + c]; + l[r * n + i] = s / lii; + } + } + + for (var i = 0; i < k; i++) + rhs[i] = dependent[i] != 0 ? 0.0 : -g[free[i]]; + Substitute(l, rhs, y, p, free, n); + } + + // Solves L L^T out = rhs; rhs is indexed by free-list position, out by column. + private static void Substitute(ReadOnlySpan l, ReadOnlySpan rhs, Span y, Span outByColumn, ReadOnlySpan free, int n) + { + var k = free.Length; + for (var i = 0; i < k; i++) + { + var s = rhs[i]; + for (var c = 0; c < i; c++) + s -= l[i * n + c] * y[c]; + y[i] = s / l[i * n + i]; + } + for (var i = k - 1; i >= 0; i--) + { + var s = y[i]; + for (var r = i + 1; r < k; r++) + s -= l[r * n + i] * outByColumn[free[r]]; + outByColumn[free[i]] = s / l[i * n + i]; + } + } +} diff --git a/packages/cultmath/src/CultMath/BoundedLeastSquares.cs.meta b/packages/cultmath/src/CultMath/BoundedLeastSquares.cs.meta new file mode 100644 index 00000000..fb5bd819 --- /dev/null +++ b/packages/cultmath/src/CultMath/BoundedLeastSquares.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4ba991e1b6c54e099bc7ea16541734c5 diff --git a/packages/cultmath/src/CultMath/CultCellular.cs b/packages/cultmath/src/CultMath/CultCellular.cs new file mode 100644 index 00000000..f856236c --- /dev/null +++ b/packages/cultmath/src/CultMath/CultCellular.cs @@ -0,0 +1,26 @@ +namespace CultMath; + +/// +/// The value-and-gradient result of (invariant 8's one struct +/// return shape). Every field follows the same float4(gradient.xyz, value.w) layout as a +/// bare value-and-gradient return. +/// +public struct CultCellular +{ + /// (∇F1, F1): the gradient and distance to the nearest feature point. + public float4 nearest; + + /// (∇F2 - ∇F1, F2 - F1): for lineae along cell borders. + public float4 edge; + + /// The nearest cell's pcg4d hash, mapped to [0, 1); independent of the pcg3d hash that + /// produced that cell's jitter. + public float id; + + public CultCellular(float4 nearest, float4 edge, float id) + { + this.nearest = nearest; + this.edge = edge; + this.id = id; + } +} diff --git a/packages/cultmath/src/CultMath/CultCellular.cs.meta b/packages/cultmath/src/CultMath/CultCellular.cs.meta new file mode 100644 index 00000000..8c9ed1ae --- /dev/null +++ b/packages/cultmath/src/CultMath/CultCellular.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 76be9498b63e410891715b3ec965caf8 diff --git a/packages/cultmath/src/CultMath/CultMath.csproj b/packages/cultmath/src/CultMath/CultMath.csproj index 7c567105..333fb20a 100644 --- a/packages/cultmath/src/CultMath/CultMath.csproj +++ b/packages/cultmath/src/CultMath/CultMath.csproj @@ -8,7 +8,9 @@ CultMath CultMath GameCult.Math - 0.2.0 + + MIT AND MPL-2.0 AND Apache-2.0 + 0.4.1 Clean-room C# math shaped for HLSL-style renderer code. GameCult README.md @@ -21,6 +23,11 @@ + + + + + diff --git a/packages/cultmath/src/CultMath/CultPhasor.cs b/packages/cultmath/src/CultMath/CultPhasor.cs new file mode 100644 index 00000000..4b5b6a96 --- /dev/null +++ b/packages/cultmath/src/CultMath/CultPhasor.cs @@ -0,0 +1,27 @@ +// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of +// the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. +// +// The result type of math.phacelle (math.Phacelle.cs), Rune Skovbo Johansen's Phacelle noise +// (Copyright (c) 2025, MPL-2.0; see THIRD-PARTY-NOTICES.md). + +namespace CultMath; + +/// +/// The value-and-gradient result of +/// (invariant 8's struct return shape). Both fields use the float4(gradient.xyz, value.w) +/// layout of a bare value-and-gradient return. +/// +public struct CultPhasor +{ + /// (∇cos, cos): the normalized cosine wave and its gradient. + public float4 cosine; + + /// (∇sin, sin): the normalized sine wave and its gradient. + public float4 sine; + + public CultPhasor(float4 cosine, float4 sine) + { + this.cosine = cosine; + this.sine = sine; + } +} diff --git a/packages/cultmath/src/CultMath/CultPhasor.cs.meta b/packages/cultmath/src/CultMath/CultPhasor.cs.meta new file mode 100644 index 00000000..d586aa3f --- /dev/null +++ b/packages/cultmath/src/CultMath/CultPhasor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 807ae2c8a758cf31896da12f1e5047bd diff --git a/packages/cultmath/src/CultMath/CultSiteCells.cs b/packages/cultmath/src/CultMath/CultSiteCells.cs new file mode 100644 index 00000000..3e5cea60 --- /dev/null +++ b/packages/cultmath/src/CultMath/CultSiteCells.cs @@ -0,0 +1,30 @@ +namespace CultMath; + +/// +/// The two nearest sites of a query point under one site score ( or +/// ), built by folding sites through +/// . Each score field follows the +/// float4(gradient.xyz, value.w) layout of a bare value-and-gradient return. +/// +public struct CultSiteCells +{ + /// (∇F1, F1): the smallest score and its gradient. 1.0e30 in w when no site was inserted. + public float4 nearest; + + /// (∇F2, F2): the second smallest score and its gradient. 1.0e30 in w when fewer than two sites were inserted. + public float4 second; + + /// Index of the nearest site as inserted, -1 when none. A float so the struct holds one scalar type, as does; exact below 2^24. + public float nearestSite; + + /// Index of the second nearest site as inserted, -1 when none. + public float secondSite; + + public CultSiteCells(float4 nearest, float4 second, float nearestSite, float secondSite) + { + this.nearest = nearest; + this.second = second; + this.nearestSite = nearestSite; + this.secondSite = secondSite; + } +} diff --git a/packages/cultmath/src/CultMath/CultSiteCells.cs.meta b/packages/cultmath/src/CultMath/CultSiteCells.cs.meta new file mode 100644 index 00000000..a3033e23 --- /dev/null +++ b/packages/cultmath/src/CultMath/CultSiteCells.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f6479c37f7d349708f54ec7e4d671200 diff --git a/packages/cultmath/src/CultMath/Expr.meta b/packages/cultmath/src/CultMath/Expr.meta new file mode 100644 index 00000000..6bab6f53 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a99b96b837a3454781b426cec6bfe837 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/src/CultMath/Expr/ExprBindings.cs b/packages/cultmath/src/CultMath/Expr/ExprBindings.cs new file mode 100644 index 00000000..0382e026 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprBindings.cs @@ -0,0 +1,39 @@ +namespace CultMath.Expr; + +/// +/// The param values of one graph for an evaluation batch: every param at its default unless overridden by name. +/// +public sealed class ExprBindings +{ + private ExprBindings(ExprGraph graph, float[] values) + { + Graph = graph; + Values = values; + } + + public ExprGraph Graph { get; } + + /// One value per param, in the graph's param order. + internal float[] Values { get; } + + /// + /// Binds 's params: a name in replaces the param's default + /// and every other param keeps it. A name the graph has no param for is refused. + /// + public static ExprBindings Bind(ExprGraph graph, IReadOnlyDictionary? overrides = null) + { + var values = new float[graph.ParamNames.Count]; + for (var i = 0; i < values.Length; i++) values[i] = BitConverter.Int32BitsToSingle(graph.ParamDefaultBits[i]); + if (overrides is not null) + { + foreach (var pair in overrides) + { + var index = graph.ParamIndex(pair.Key); + if (index < 0) throw new ExprGraphException("unknown-param"); + values[index] = pair.Value; + } + } + + return new ExprBindings(graph, values); + } +} diff --git a/packages/cultmath/src/CultMath/Expr/ExprBindings.cs.meta b/packages/cultmath/src/CultMath/Expr/ExprBindings.cs.meta new file mode 100644 index 00000000..f306a3b1 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprBindings.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c9dea1bb6c854e8f80a5e0f05902fd17 diff --git a/packages/cultmath/src/CultMath/Expr/ExprBuilder.cs b/packages/cultmath/src/CultMath/Expr/ExprBuilder.cs new file mode 100644 index 00000000..7ffca144 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprBuilder.cs @@ -0,0 +1,184 @@ +namespace CultMath.Expr; + +/// A node of an under construction. Only the builder that made it accepts it. +public sealed class ExprValue +{ + internal ExprValue(ExprBuilder owner, int index, int resultCount) + { + Owner = owner; + Index = index; + ResultCount = resultCount; + } + + internal ExprBuilder Owner { get; } + + internal int Index { get; } + + /// More than one for a multi-result op, whose results are read only through . + public int ResultCount { get; } +} + +/// +/// Builds an . Identical (op, operands, constant bits) nodes are one node, and +/// drops nodes no output reaches and renumbers densely, so the same call sequence builds +/// byte-identical graphs. Every call runs the validator's rules and refuses at the call. +/// +public sealed class ExprBuilder +{ + private readonly List nodes = new(); + private readonly List handles = new(); + private readonly Dictionary interned = new(); + private readonly List inputNames = new(); + private readonly List paramNames = new(); + private readonly List paramDefaultBits = new(); + private readonly List outputNames = new(); + private readonly List outputNodes = new(); + + /// The graph input of this name, declared on first use. + public ExprValue Input(string name) + { + var port = inputNames.IndexOf(name); + if (port < 0) + { + ExprGraph.CheckPortName(name); + port = inputNames.Count; + inputNames.Add(name); + } + + return Intern(ExprNode.Input(port)); + } + + /// The graph param of this name, declared on first use. Declaring it again with other default bits is refused. + public ExprValue Param(string name, float defaultValue) => ParamBits(name, BitConverter.SingleToInt32Bits(defaultValue)); + + /// A constant; its bits (a signed zero, a NaN payload, a subnormal) are kept. + public ExprValue Const(float value) => ConstBits(BitConverter.SingleToInt32Bits(value)); + + public ExprValue Call(string op, params ExprValue[] operands) + { + var indices = new int[operands.Length]; + for (var i = 0; i < operands.Length; i++) indices[i] = Own(operands[i]); + return Intern(ExprNode.Call(op, indices)); + } + + /// Result of a multi-result node. + public ExprValue Pick(ExprValue node, int k) => Intern(ExprNode.Pick(Own(node), k)); + + /// Names a single-result node as an output. + public void Output(string name, ExprValue value) + { + ExprGraph.CheckPortName(name); + if (outputNames.Contains(name)) throw new ExprGraphException("duplicate-port-name"); + var node = Own(value); + ExprGraph.CheckOutput(node, nodes); + outputNames.Add(name); + outputNodes.Add(node); + } + + /// The graph of the outputs declared so far: only nodes an output reaches, renumbered densely in build order. + public ExprGraph Build() + { + var live = new bool[nodes.Count]; + foreach (var node in outputNodes) live[node] = true; + for (var i = nodes.Count - 1; i >= 0; i--) + if (live[i]) + foreach (var operand in nodes[i].Operands) live[operand] = true; + + var renumbered = new int[nodes.Count]; + var kept = new List(); + for (var i = 0; i < nodes.Count; i++) + { + if (!live[i]) continue; + renumbered[i] = kept.Count; + kept.Add(nodes[i].WithOperands(nodes[i].Operands.Select(operand => renumbered[operand]).ToArray())); + } + + return ExprGraph.Create( + ExprGraph.FormatVersion, inputNames, paramNames, paramDefaultBits, outputNames, outputNodes.Select(node => renumbered[node]).ToList(), kept); + } + + /// + /// Rebuilds inside this builder with the named inputs replaced by the given values + /// (Fidget's remap_xyz) and returns each output's value by name. An input not named is this builder's input + /// of that name; every param is this builder's param of that name. A stencil is N substitutions combined by + /// ops: an ordinary flat graph, with no loop construct. + /// + public IReadOnlyDictionary Substitute(ExprGraph graph, IReadOnlyDictionary replacements) + { + foreach (var pair in replacements) + { + if (!graph.InputNames.Contains(pair.Key)) throw new ExprGraphException("unknown-input"); + Own(pair.Value); + if (pair.Value.ResultCount != 1) throw new ExprGraphException("bare-multi-result"); + } + + var mapped = new ExprValue[graph.Nodes.Count]; + for (var i = 0; i < mapped.Length; i++) + { + var node = graph.Nodes[i]; + switch (node.Kind) + { + case ExprNodeKind.Input: + var input = graph.InputNames[node.Payload]; + mapped[i] = replacements.TryGetValue(input, out var replacement) ? replacement : Input(input); + break; + case ExprNodeKind.Param: + mapped[i] = ParamBits(graph.ParamNames[node.Payload], graph.ParamDefaultBits[node.Payload]); + break; + case ExprNodeKind.Const: + mapped[i] = ConstBits(node.Payload); + break; + case ExprNodeKind.Pick: + mapped[i] = Pick(mapped[node.Operands[0]], node.Payload); + break; + default: + mapped[i] = Call(node.WireName, node.Operands.Select(operand => mapped[operand]).ToArray()); + break; + } + } + + var outputs = new Dictionary(); + for (var o = 0; o < graph.OutputNames.Count; o++) outputs[graph.OutputNames[o]] = mapped[graph.OutputNodes[o]]; + return outputs; + } + + private ExprValue ParamBits(string name, int bits) + { + var port = paramNames.IndexOf(name); + if (port < 0) + { + ExprGraph.CheckPortName(name); + port = paramNames.Count; + paramNames.Add(name); + paramDefaultBits.Add(bits); + } + else if (paramDefaultBits[port] != bits) + { + throw new ExprGraphException("port-conflict"); + } + + return Intern(ExprNode.Param(port)); + } + + private ExprValue ConstBits(int bits) => Intern(ExprNode.Const(bits)); + + private int Own(ExprValue value) + { + if (value.Owner != this) throw new ExprGraphException("foreign-operand", nodes.Count); + return value.Index; + } + + private ExprValue Intern(ExprNode node) + { + ExprGraph.CheckNode(nodes.Count, node, nodes, inputNames.Count, paramNames.Count); + if (!interned.TryGetValue(node.Key, out var index)) + { + index = nodes.Count; + nodes.Add(node); + handles.Add(new ExprValue(this, index, node.ResultCount)); + interned[node.Key] = index; + } + + return handles[index]; + } +} diff --git a/packages/cultmath/src/CultMath/Expr/ExprBuilder.cs.meta b/packages/cultmath/src/CultMath/Expr/ExprBuilder.cs.meta new file mode 100644 index 00000000..a65eb534 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprBuilder.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7326eeabc2d04a43b3d0a1fe6e45b018 diff --git a/packages/cultmath/src/CultMath/Expr/ExprEvaluator.cs b/packages/cultmath/src/CultMath/Expr/ExprEvaluator.cs new file mode 100644 index 00000000..2912f1ee --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprEvaluator.cs @@ -0,0 +1,57 @@ +namespace CultMath.Expr; + +/// +/// Evaluates an per point: nodes in order through , IEEE single per op, +/// so a result equals the direct composition of the same math calls bit for bit. Allocates once per call, never per point. +/// +public static class ExprEvaluator +{ + /// + /// Columns are contiguous: input i of point p is inputs[i * n + p], and output o is + /// outputs[o * n + p], where n = outputs.Length / graph.OutputNames.Count. + /// + public static void Evaluate(ExprGraph graph, ExprBindings bindings, ReadOnlySpan inputs, Span outputs) + { + if (bindings.Graph != graph) throw new ExprGraphException("foreign-bindings"); + var outputCount = graph.OutputNames.Count; + if (outputCount == 0) return; + if (outputs.Length % outputCount != 0) throw new ExprGraphException("column-shape"); + var points = outputs.Length / outputCount; + if (inputs.Length != points * graph.InputNames.Count) throw new ExprGraphException("column-shape"); + + var nodes = graph.NodeArray; + var outputNodes = graph.OutputNodeArray; + var start = graph.SlotStart; + var slots = new float[graph.SlotCount]; + Span operands = stackalloc float[ExprOps.MaxArity]; + for (var point = 0; point < points; point++) + { + for (var i = 0; i < nodes.Length; i++) + { + var node = nodes[i]; + switch (node.Kind) + { + case ExprNodeKind.Input: + slots[start[i]] = inputs[node.Payload * points + point]; + break; + case ExprNodeKind.Param: + slots[start[i]] = bindings.Values[node.Payload]; + break; + case ExprNodeKind.Const: + slots[start[i]] = BitConverter.Int32BitsToSingle(node.Payload); + break; + case ExprNodeKind.Pick: + slots[start[i]] = slots[start[node.OperandArray[0]] + node.Payload]; + break; + default: + var op = node.Op!; + for (var k = 0; k < op.Arity; k++) operands[k] = slots[start[node.OperandArray[k]]]; + op.Evaluate(operands.Slice(0, op.Arity), new Span(slots, start[i], op.ResultCount)); + break; + } + } + + for (var o = 0; o < outputCount; o++) outputs[o * points + point] = slots[start[outputNodes[o]]]; + } + } +} diff --git a/packages/cultmath/src/CultMath/Expr/ExprEvaluator.cs.meta b/packages/cultmath/src/CultMath/Expr/ExprEvaluator.cs.meta new file mode 100644 index 00000000..f89bacf4 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprEvaluator.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 38108254b5b4430b8f87094e6905dc59 diff --git a/packages/cultmath/src/CultMath/Expr/ExprGraph.cs b/packages/cultmath/src/CultMath/Expr/ExprGraph.cs new file mode 100644 index 00000000..d0edc488 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprGraph.cs @@ -0,0 +1,180 @@ +namespace CultMath.Expr; + +/// +/// An immutable scalar SSA expression graph: nodes in topological order (an operand names a lower node), named +/// inputs that vary per point, named params that are uniform per batch and carry a default, and named outputs. +/// A graph is a value; an edit builds a new one. is the one validator: the builder runs +/// it on and a decoder runs it on persisted bytes, so no partial graph is ever returned. +/// +public sealed class ExprGraph +{ + /// The persisted format version this build reads and writes. + public const int FormatVersion = 1; + + private readonly string[] inputNames; + private readonly string[] paramNames; + private readonly int[] paramDefaultBits; + private readonly string[] outputNames; + private readonly int[] outputNodes; + private readonly ExprNode[] nodes; + + private ExprGraph(string[] inputNames, string[] paramNames, int[] paramDefaultBits, string[] outputNames, int[] outputNodes, ExprNode[] nodes) + { + this.inputNames = inputNames; + this.paramNames = paramNames; + this.paramDefaultBits = paramDefaultBits; + this.outputNames = outputNames; + this.outputNodes = outputNodes; + this.nodes = nodes; + InputNames = Array.AsReadOnly(inputNames); + ParamNames = Array.AsReadOnly(paramNames); + ParamDefaultBits = Array.AsReadOnly(paramDefaultBits); + OutputNames = Array.AsReadOnly(outputNames); + OutputNodes = Array.AsReadOnly(outputNodes); + Nodes = Array.AsReadOnly(nodes); + SlotStart = new int[nodes.Length]; + var slots = 0; + for (var i = 0; i < nodes.Length; i++) + { + SlotStart[i] = slots; + slots += nodes[i].ResultCount; + } + + SlotCount = slots; + } + + public IReadOnlyList InputNames { get; } + + public IReadOnlyList ParamNames { get; } + + /// The default of each param as float bits, so a NaN payload or a signed zero survives. + public IReadOnlyList ParamDefaultBits { get; } + + public IReadOnlyList OutputNames { get; } + + /// The node each output reads. + public IReadOnlyList OutputNodes { get; } + + public IReadOnlyList Nodes { get; } + + /// The evaluator's view of the nodes: the private array, never handed out. + internal ExprNode[] NodeArray => nodes; + + /// The evaluator's view of the output nodes: the private array, never handed out. + internal int[] OutputNodeArray => outputNodes; + + /// Where each node's results start in an evaluator's value array. + internal int[] SlotStart { get; } + + internal int SlotCount { get; } + + /// The index of the param of this name, or -1. + internal int ParamIndex(string name) => Array.IndexOf(paramNames, name); + + /// + /// Validates and returns a graph, or throws naming the rule and the node. + /// The rules: format version, port counts, port names (syntax, unique per kind), and per node its kind's + /// operand count, a known op and its arity, operands below the node and never a bare multi-result node, + /// pick range, port index and payload; and per output a node in range that is not a bare multi-result node. + /// + public static ExprGraph Create( + int version, + IReadOnlyList inputNames, + IReadOnlyList paramNames, + IReadOnlyList paramDefaultBits, + IReadOnlyList outputNames, + IReadOnlyList outputNodes, + IReadOnlyList nodes) + { + if (version != FormatVersion) throw new ExprGraphException("version"); + if (paramNames.Count != paramDefaultBits.Count || outputNames.Count != outputNodes.Count) throw new ExprGraphException("port-count"); + CheckPortNames(inputNames); + CheckPortNames(paramNames); + CheckPortNames(outputNames); + + var before = new List(nodes.Count); + for (var i = 0; i < nodes.Count; i++) + { + CheckNode(i, nodes[i], before, inputNames.Count, paramNames.Count); + before.Add(nodes[i]); + } + + foreach (var node in outputNodes) CheckOutput(node, before); + + return new ExprGraph( + inputNames.ToArray(), paramNames.ToArray(), paramDefaultBits.ToArray(), outputNames.ToArray(), outputNodes.ToArray(), nodes.ToArray()); + } + + /// A port name is [A-Za-z_][A-Za-z0-9_]*. + internal static void CheckPortName(string name) + { + if (name.Length == 0 || !IsHead(name[0])) throw new ExprGraphException("port-name"); + for (var i = 1; i < name.Length; i++) + if (!IsHead(name[i]) && !(name[i] >= '0' && name[i] <= '9')) throw new ExprGraphException("port-name"); + } + + private static bool IsHead(char c) => c == '_' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + + private static void CheckPortNames(IReadOnlyList names) + { + var seen = new HashSet(); + foreach (var name in names) + { + CheckPortName(name); + if (!seen.Add(name)) throw new ExprGraphException("duplicate-port-name"); + } + } + + /// The rules for one node given the nodes before it. The builder runs this per call, the validator per node. + internal static void CheckNode(int index, ExprNode node, IReadOnlyList before, int inputCount, int paramCount) + { + var operands = node.Operands; + switch (node.Kind) + { + case ExprNodeKind.Input: + CheckLeaf(index, node, inputCount); + break; + case ExprNodeKind.Param: + CheckLeaf(index, node, paramCount); + break; + case ExprNodeKind.Const: + if (operands.Count != 0) throw new ExprGraphException("arity", index); + break; + case ExprNodeKind.Pick: + if (operands.Count != 1) throw new ExprGraphException("arity", index); + CheckOperandOrder(index, operands[0]); + var results = before[operands[0]].ResultCount; + if (results <= 1 || node.Payload < 0 || node.Payload >= results) throw new ExprGraphException("pick-range", index); + break; + default: + if (node.Op is null) throw new ExprGraphException("unknown-op", index); + if (operands.Count != node.Op.Arity) throw new ExprGraphException("arity", index); + if (node.Payload != 0) throw new ExprGraphException("payload", index); + foreach (var operand in operands) + { + CheckOperandOrder(index, operand); + if (before[operand].ResultCount != 1) throw new ExprGraphException("bare-multi-result", index); + } + + break; + } + } + + private static void CheckLeaf(int index, ExprNode node, int portCount) + { + if (node.Operands.Count != 0) throw new ExprGraphException("arity", index); + if (node.Payload < 0 || node.Payload >= portCount) throw new ExprGraphException("port-index", index); + } + + private static void CheckOperandOrder(int index, int operand) + { + if (operand < 0 || operand >= index) throw new ExprGraphException("operand-order", index); + } + + /// An output reads a node in range that is single-result. + internal static void CheckOutput(int node, IReadOnlyList nodes) + { + if (node < 0 || node >= nodes.Count) throw new ExprGraphException("output-node"); + if (nodes[node].ResultCount != 1) throw new ExprGraphException("bare-multi-result", node); + } +} diff --git a/packages/cultmath/src/CultMath/Expr/ExprGraph.cs.meta b/packages/cultmath/src/CultMath/Expr/ExprGraph.cs.meta new file mode 100644 index 00000000..d6d57122 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprGraph.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 04d707ad2a4e4e0299407ce1d86afea3 diff --git a/packages/cultmath/src/CultMath/Expr/ExprGraphException.cs b/packages/cultmath/src/CultMath/Expr/ExprGraphException.cs new file mode 100644 index 00000000..7d10a002 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprGraphException.cs @@ -0,0 +1,22 @@ +namespace CultMath.Expr; + +/// +/// The one refusal of the expression graph: a build call, a decoded encoding, a binding or an evaluation +/// that breaks a rule. names the rule and the node it broke at +/// (-1 when no node is involved). The message names the rule and never echoes a value it was given. +/// +public sealed class ExprGraphException : Exception +{ + public ExprGraphException(string rule, int nodeIndex = -1) + : base(nodeIndex < 0 ? rule : rule + " at node " + nodeIndex) + { + Rule = rule; + NodeIndex = nodeIndex; + } + + /// The rule broken, a short stable name such as unknown-op or operand-order. + public string Rule { get; } + + /// The index of the node the rule broke at, or -1. + public int NodeIndex { get; } +} diff --git a/packages/cultmath/src/CultMath/Expr/ExprGraphException.cs.meta b/packages/cultmath/src/CultMath/Expr/ExprGraphException.cs.meta new file mode 100644 index 00000000..02d5feca --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprGraphException.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 88e355a7be3f44ada7f1d9464c60428e diff --git a/packages/cultmath/src/CultMath/Expr/ExprNode.cs b/packages/cultmath/src/CultMath/Expr/ExprNode.cs new file mode 100644 index 00000000..d0bd7d39 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprNode.cs @@ -0,0 +1,83 @@ +namespace CultMath.Expr; + +/// What a node is: a graph input, a graph param, a constant, a pick of one result of a multi-result node, or a call of an op. +public enum ExprNodeKind +{ + Input, + Param, + Const, + Pick, + Call, +} + +/// +/// One node of an : a kind, the operand node indices (always lower than its own), +/// and one integer payload: the port index of an input or param, the float bits of a constant, the result +/// index of a pick, and zero for a call. Immutable. +/// +public sealed class ExprNode +{ + private const string InputName = "input"; + private const string ParamName = "param"; + private const string ConstName = "const"; + private const string PickName = "pick"; + + private static readonly int[] NoOperands = Array.Empty(); + + private readonly int[] operandArray; + + private ExprNode(ExprNodeKind kind, string wireName, int[] operands, int payload, ExprOp? op) + { + Kind = kind; + WireName = wireName; + operandArray = operands; + Operands = Array.AsReadOnly(operands); + Payload = payload; + Op = op; + ResultCount = op?.ResultCount ?? 1; + } + + public ExprNodeKind Kind { get; } + + /// The persisted name: an op name for a call, otherwise input, param, const or pick. + public string WireName { get; } + + public IReadOnlyList Operands { get; } + + /// The evaluator's view of the operands: the private array, never handed out. + internal int[] OperandArray => operandArray; + + public int Payload { get; } + + /// How many floats the node produces: the op's result count for a call, otherwise one. + public int ResultCount { get; } + + /// The op of a known call; null for every other node and for a call naming an unknown op. + internal ExprOp? Op { get; } + + public static ExprNode Input(int port) => new(ExprNodeKind.Input, InputName, NoOperands, port, null); + + public static ExprNode Param(int port) => new(ExprNodeKind.Param, ParamName, NoOperands, port, null); + + public static ExprNode Const(int bits) => new(ExprNodeKind.Const, ConstName, NoOperands, bits, null); + + public static ExprNode Pick(int node, int result) => new(ExprNodeKind.Pick, PickName, new[] { node }, result, null); + + public static ExprNode Call(string op, IReadOnlyList operands) => + new(ExprNodeKind.Call, op, operands.ToArray(), 0, ExprOps.Find(op)); + + /// The node a persisted names. A name that is none of the four kinds is a call, which the validator checks against the op table. + public static ExprNode FromWire(string wireName, IReadOnlyList operands, int payload) => wireName switch + { + InputName => new ExprNode(ExprNodeKind.Input, wireName, operands.ToArray(), payload, null), + ParamName => new ExprNode(ExprNodeKind.Param, wireName, operands.ToArray(), payload, null), + ConstName => new ExprNode(ExprNodeKind.Const, wireName, operands.ToArray(), payload, null), + PickName => new ExprNode(ExprNodeKind.Pick, wireName, operands.ToArray(), payload, null), + _ => new ExprNode(ExprNodeKind.Call, wireName, operands.ToArray(), payload, ExprOps.Find(wireName)), + }; + + internal ExprNode WithOperands(int[] operands) => new(Kind, WireName, operands, Payload, Op); + + /// Equal keys are the same expression: the builder's hash-consing identity. + internal string Key => WireName + "|" + string.Join(",", operandArray) + "|" + Payload; +} diff --git a/packages/cultmath/src/CultMath/Expr/ExprNode.cs.meta b/packages/cultmath/src/CultMath/Expr/ExprNode.cs.meta new file mode 100644 index 00000000..99f5388e --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprNode.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fc3cb4abaa27482aa98a76cd876b8805 diff --git a/packages/cultmath/src/CultMath/Expr/ExprOps.cs b/packages/cultmath/src/CultMath/Expr/ExprOps.cs new file mode 100644 index 00000000..f8a63d9c --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprOps.cs @@ -0,0 +1,86 @@ +using static CultMath.math; + +namespace CultMath.Expr; + +/// One entry of the op table: a stable name, its arity, its result count and its C# implementation. +public sealed class ExprOp +{ + /// Writes ( floats) from + /// ( floats). + public delegate void Function(ReadOnlySpan operands, Span results); + + private readonly Function function; + + internal ExprOp(string name, int arity, int resultCount, Function function) + { + Name = name; + Arity = arity; + ResultCount = resultCount; + this.function = function; + } + + /// The persisted name. Append-only: a released name keeps its meaning. + public string Name { get; } + + public int Arity { get; } + + /// One for a scalar op; more for an op read only through . + public int ResultCount { get; } + + public void Evaluate(ReadOnlySpan operands, Span results) => function(operands, results); +} + +/// +/// The one op table of the expression graph: each op names a CultMath function and calls it, wrapping no type +/// and copying no body. The C# evaluator reads it, and so does any later lowering. +/// +public static class ExprOps +{ + /// The largest arity in the table. + internal const int MaxArity = 4; + + private static ExprOp Op(string name, int arity, ExprOp.Function function) => new(name, arity, 1, function); + + private static readonly ExprOp[] Table = + { + Op("add", 2, (a, r) => r[0] = a[0] + a[1]), + Op("sub", 2, (a, r) => r[0] = a[0] - a[1]), + Op("mul", 2, (a, r) => r[0] = a[0] * a[1]), + Op("div", 2, (a, r) => r[0] = a[0] / a[1]), + Op("neg", 1, (a, r) => r[0] = -a[0]), + Op("min", 2, (a, r) => r[0] = min(a[0], a[1])), + Op("max", 2, (a, r) => r[0] = max(a[0], a[1])), + Op("abs", 1, (a, r) => r[0] = abs(a[0])), + Op("floor", 1, (a, r) => r[0] = floor(a[0])), + Op("frac", 1, (a, r) => r[0] = frac(a[0])), + Op("sqrt", 1, (a, r) => r[0] = sqrt(a[0])), + Op("exp", 1, (a, r) => r[0] = exp(a[0])), + Op("log", 1, (a, r) => r[0] = log(a[0])), + Op("pow", 2, (a, r) => r[0] = pow(a[0], a[1])), + Op("sin", 1, (a, r) => r[0] = sin(a[0])), + Op("cos", 1, (a, r) => r[0] = cos(a[0])), + Op("clamp", 3, (a, r) => r[0] = clamp(a[0], a[1], a[2])), + Op("saturate", 1, (a, r) => r[0] = saturate(a[0])), + Op("lerp", 3, (a, r) => r[0] = lerp(a[0], a[1], a[2])), + Op("step", 2, (a, r) => r[0] = step(a[0], a[1])), + Op("smoothstep", 3, (a, r) => r[0] = smoothstep(a[0], a[1], a[2])), + Op("select", 4, (a, r) => r[0] = select(a[0] > a[1], a[2], a[3])), + Op("snoise2", 2, (a, r) => r[0] = snoise(new float2(a[0], a[1]))), + Op("snoise3", 3, (a, r) => r[0] = snoise(new float3(a[0], a[1], a[2]))), + new ExprOp("cellular3", 3, 9, (a, r) => + { + var c = cellular(new float3(a[0], a[1], a[2])); + r[0] = c.nearest.x; r[1] = c.nearest.y; r[2] = c.nearest.z; r[3] = c.nearest.w; + r[4] = c.edge.x; r[5] = c.edge.y; r[6] = c.edge.z; r[7] = c.edge.w; + r[8] = c.id; + }), + }; + + private static readonly Dictionary ByName = Table.ToDictionary(op => op.Name); + + /// Every op, in declaration order. + public static IReadOnlyList All => Table; + + /// The op with this persisted name, or null. + public static ExprOp? Find(string name) => ByName.TryGetValue(name, out var op) ? op : null; +} diff --git a/packages/cultmath/src/CultMath/Expr/ExprOps.cs.meta b/packages/cultmath/src/CultMath/Expr/ExprOps.cs.meta new file mode 100644 index 00000000..d2f541e5 --- /dev/null +++ b/packages/cultmath/src/CultMath/Expr/ExprOps.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f2cb6ebc7a4f43d59009e613a1b75888 diff --git a/packages/cultmath/src/CultMath/SpanNoise.cs b/packages/cultmath/src/CultMath/SpanNoise.cs new file mode 100644 index 00000000..dcdf8385 --- /dev/null +++ b/packages/cultmath/src/CultMath/SpanNoise.cs @@ -0,0 +1,29 @@ +namespace CultMath; + +/// +/// The result of and (invariant 8's one struct +/// return shape): an octave stage's value and gradient at the midpoint of a span, with the bounds that +/// hold over the whole span. +/// +public struct SpanNoise +{ + /// (∇, value): the stage's gradient in the span's space and its value, in the float4(gradient.xyz, value.w) layout of a bare value-and-gradient return. + public float4 field; + + /// An upper bound, at every point the span can reach, on the operator norm of the field's Hessian in the span's space. + public float curvature; + + /// + /// An upper bound on how far a ridged sum can leave its midpoint branch over the span (each octave's + /// 1 - |n| against the same octave continued with the midpoint's sign of n); 0 for + /// and for any octave that cannot cross zero over the span. + /// + public float fold; + + public SpanNoise(float4 field, float curvature, float fold) + { + this.field = field; + this.curvature = curvature; + this.fold = fold; + } +} diff --git a/packages/cultmath/src/CultMath/SpanNoise.cs.meta b/packages/cultmath/src/CultMath/SpanNoise.cs.meta new file mode 100644 index 00000000..d838deb2 --- /dev/null +++ b/packages/cultmath/src/CultMath/SpanNoise.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fe0da4c343e24c3781b076943f08ddbc diff --git a/packages/cultmath/src/CultMath/SpanPath.cs b/packages/cultmath/src/CultMath/SpanPath.cs new file mode 100644 index 00000000..cc6524d9 --- /dev/null +++ b/packages/cultmath/src/CultMath/SpanPath.cs @@ -0,0 +1,26 @@ +namespace CultMath; + +/// +/// The span and bound over: the path q(t), +/// |t| <= , through at t = 0 with there, +/// |q'| <= and |q''| <= along it. speed is at least +/// |velocity|; speed, acceleration and halfLength are non-negative. Name every field: the three floats +/// have no order a caller could mistake for a convention. +/// +public struct SpanPath +{ + /// q(0), the point the field and its gradient are evaluated at. + public float3 midpoint; + + /// q'(0). + public float3 velocity; + + /// An upper bound on |q'(t)| over the span; at least |velocity|. + public float speed; + + /// An upper bound on |q''(t)| over the span. + public float acceleration; + + /// The span covers |t| <= halfLength; 0 is the midpoint alone. + public float halfLength; +} diff --git a/packages/cultmath/src/CultMath/SpanPath.cs.meta b/packages/cultmath/src/CultMath/SpanPath.cs.meta new file mode 100644 index 00000000..3c58b0e9 --- /dev/null +++ b/packages/cultmath/src/CultMath/SpanPath.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3a8c1d52e7b94f06a1d5c2b9e04f7a31 diff --git a/packages/cultmath/src/CultMath/SpanStage.cs b/packages/cultmath/src/CultMath/SpanStage.cs new file mode 100644 index 00000000..faeccd3e --- /dev/null +++ b/packages/cultmath/src/CultMath/SpanStage.cs @@ -0,0 +1,33 @@ +namespace CultMath; + +/// +/// The transform of one octave stage of a warp chain, as and +/// read it. Octave o samples snoise at x_o = f_o (M q + shift) + offset + +/// o octaveStep, with f_o = lacunarity^o and M = (I + (1/ - 1) a a^T), +/// a = normalize(); a zero axis, or a stretch of 1, means no stretch. stretch must be +/// positive and finite, and nothing guards it. default(SpanStage) has frequency 0, which samples +/// one point: start from . +/// +public struct SpanStage +{ + /// The stage whose span_fbm/span_ridged field equals fbm_grad/ridged_grad: frequency 1, stretch 1, every vector zero. + public static readonly SpanStage Identity = new SpanStage { frequency = 1.0f, stretch = 1.0f }; + + /// The scale of M; its sign is kept. + public float frequency; + + /// The factor the axis direction is stretched by (M scales it by 1/stretch); 1 is none. + public float stretch; + + /// The direction stretch applies along; any length, zero for none. + public float3 axis; + + /// Added to M q before the per-octave scaling. + public float3 shift; + + /// Added after the per-octave scaling. + public float3 offset; + + /// Added to the octave coordinate once per octave index: o octaveStep. + public float3 octaveStep; +} diff --git a/packages/cultmath/src/CultMath/SpanStage.cs.meta b/packages/cultmath/src/CultMath/SpanStage.cs.meta new file mode 100644 index 00000000..7edaee93 --- /dev/null +++ b/packages/cultmath/src/CultMath/SpanStage.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9d46b0f27c1e4a85b3e8f1a60c2d5b97 diff --git a/packages/cultmath/src/CultMath/Swizzles.g.cs b/packages/cultmath/src/CultMath/Swizzles.g.cs index ce84bbc4..db1c56bd 100644 --- a/packages/cultmath/src/CultMath/Swizzles.g.cs +++ b/packages/cultmath/src/CultMath/Swizzles.g.cs @@ -7,6 +7,8 @@ namespace CultMath; public partial struct float2 { public float2(float2 xy) : this(xy.x, xy.y) { } + public float2(int2 value) : this(value.x, value.y) { } + public float2(bool2 value) : this(value.x ? 1.0f : 0.0f, value.y ? 1.0f : 0.0f) { } public float r { readonly get => x; set => x = value; } public float g { readonly get => y; set => y = value; } public readonly float2 xx => new(x, x); @@ -72,6 +74,8 @@ public partial struct float3 public float3(float x, float2 yz) : this(x, yz.x, yz.y) { } public float3(float2 xy, float z) : this(xy.x, xy.y, z) { } public float3(float3 xyz) : this(xyz.x, xyz.y, xyz.z) { } + public float3(int3 value) : this(value.x, value.y, value.z) { } + public float3(bool3 value) : this(value.x ? 1.0f : 0.0f, value.y ? 1.0f : 0.0f, value.z ? 1.0f : 0.0f) { } public float r { readonly get => x; set => x = value; } public float g { readonly get => y; set => y = value; } public float b { readonly get => z; set => z = value; } @@ -320,6 +324,8 @@ public partial struct float4 public float4(float2 xy, float2 zw) : this(xy.x, xy.y, zw.x, zw.y) { } public float4(float3 xyz, float w) : this(xyz.x, xyz.y, xyz.z, w) { } public float4(float4 xyzw) : this(xyzw.x, xyzw.y, xyzw.z, xyzw.w) { } + public float4(int4 value) : this(value.x, value.y, value.z, value.w) { } + public float4(bool4 value) : this(value.x ? 1.0f : 0.0f, value.y ? 1.0f : 0.0f, value.z ? 1.0f : 0.0f, value.w ? 1.0f : 0.0f) { } public float r { readonly get => x; set => x = value; } public float g { readonly get => y; set => y = value; } public float b { readonly get => z; set => z = value; } @@ -1001,6 +1007,8 @@ public partial struct float4 public partial struct int2 { public int2(int2 xy) : this(xy.x, xy.y) { } + public int2(float2 value) : this((int)value.x, (int)value.y) { } + public int2(bool2 value) : this(value.x ? 1 : 0, value.y ? 1 : 0) { } public int r { readonly get => x; set => x = value; } public int g { readonly get => y; set => y = value; } public readonly int2 xx => new(x, x); @@ -1066,6 +1074,8 @@ public partial struct int3 public int3(int x, int2 yz) : this(x, yz.x, yz.y) { } public int3(int2 xy, int z) : this(xy.x, xy.y, z) { } public int3(int3 xyz) : this(xyz.x, xyz.y, xyz.z) { } + public int3(float3 value) : this((int)value.x, (int)value.y, (int)value.z) { } + public int3(bool3 value) : this(value.x ? 1 : 0, value.y ? 1 : 0, value.z ? 1 : 0) { } public int r { readonly get => x; set => x = value; } public int g { readonly get => y; set => y = value; } public int b { readonly get => z; set => z = value; } @@ -1314,6 +1324,8 @@ public partial struct int4 public int4(int2 xy, int2 zw) : this(xy.x, xy.y, zw.x, zw.y) { } public int4(int3 xyz, int w) : this(xyz.x, xyz.y, xyz.z, w) { } public int4(int4 xyzw) : this(xyzw.x, xyzw.y, xyzw.z, xyzw.w) { } + public int4(float4 value) : this((int)value.x, (int)value.y, (int)value.z, (int)value.w) { } + public int4(bool4 value) : this(value.x ? 1 : 0, value.y ? 1 : 0, value.z ? 1 : 0, value.w ? 1 : 0) { } public int r { readonly get => x; set => x = value; } public int g { readonly get => y; set => y = value; } public int b { readonly get => z; set => z = value; } @@ -1995,6 +2007,8 @@ public partial struct int4 public partial struct bool2 { public bool2(bool2 xy) : this(xy.x, xy.y) { } + public bool2(float2 value) : this(value.x != 0.0f, value.y != 0.0f) { } + public bool2(int2 value) : this(value.x != 0, value.y != 0) { } public bool r { readonly get => x; set => x = value; } public bool g { readonly get => y; set => y = value; } public readonly bool2 xx => new(x, x); @@ -2060,6 +2074,8 @@ public partial struct bool3 public bool3(bool x, bool2 yz) : this(x, yz.x, yz.y) { } public bool3(bool2 xy, bool z) : this(xy.x, xy.y, z) { } public bool3(bool3 xyz) : this(xyz.x, xyz.y, xyz.z) { } + public bool3(float3 value) : this(value.x != 0.0f, value.y != 0.0f, value.z != 0.0f) { } + public bool3(int3 value) : this(value.x != 0, value.y != 0, value.z != 0) { } public bool r { readonly get => x; set => x = value; } public bool g { readonly get => y; set => y = value; } public bool b { readonly get => z; set => z = value; } @@ -2308,6 +2324,8 @@ public partial struct bool4 public bool4(bool2 xy, bool2 zw) : this(xy.x, xy.y, zw.x, zw.y) { } public bool4(bool3 xyz, bool w) : this(xyz.x, xyz.y, xyz.z, w) { } public bool4(bool4 xyzw) : this(xyzw.x, xyzw.y, xyzw.z, xyzw.w) { } + public bool4(float4 value) : this(value.x != 0.0f, value.y != 0.0f, value.z != 0.0f, value.w != 0.0f) { } + public bool4(int4 value) : this(value.x != 0, value.y != 0, value.z != 0, value.w != 0) { } public bool r { readonly get => x; set => x = value; } public bool g { readonly get => y; set => y = value; } public bool b { readonly get => z; set => z = value; } @@ -3102,9 +3120,15 @@ public partial struct double3 public static partial class math { public static float2 float2(float2 xy) => new(xy); + public static float2 float2(int2 value) => new(value); + public static float2 float2(bool2 value) => new(value); + public static float2 float2(int value) => new(value, value); public static float3 float3(float x, float2 yz) => new(x, yz); public static float3 float3(float2 xy, float z) => new(xy, z); public static float3 float3(float3 xyz) => new(xyz); + public static float3 float3(int3 value) => new(value); + public static float3 float3(bool3 value) => new(value); + public static float3 float3(int value) => new(value, value, value); public static float4 float4(float x, float y, float2 zw) => new(x, y, zw); public static float4 float4(float x, float2 yz, float w) => new(x, yz, w); public static float4 float4(float x, float3 yzw) => new(x, yzw); @@ -3112,10 +3136,17 @@ public static partial class math public static float4 float4(float2 xy, float2 zw) => new(xy, zw); public static float4 float4(float3 xyz, float w) => new(xyz, w); public static float4 float4(float4 xyzw) => new(xyzw); + public static float4 float4(int4 value) => new(value); + public static float4 float4(bool4 value) => new(value); + public static float4 float4(int value) => new(value, value, value, value); public static int2 int2(int2 xy) => new(xy); + public static int2 int2(float2 value) => new(value); + public static int2 int2(bool2 value) => new(value); public static int3 int3(int x, int2 yz) => new(x, yz); public static int3 int3(int2 xy, int z) => new(xy, z); public static int3 int3(int3 xyz) => new(xyz); + public static int3 int3(float3 value) => new(value); + public static int3 int3(bool3 value) => new(value); public static int4 int4(int x, int y, int2 zw) => new(x, y, zw); public static int4 int4(int x, int2 yz, int w) => new(x, yz, w); public static int4 int4(int x, int3 yzw) => new(x, yzw); @@ -3123,10 +3154,16 @@ public static partial class math public static int4 int4(int2 xy, int2 zw) => new(xy, zw); public static int4 int4(int3 xyz, int w) => new(xyz, w); public static int4 int4(int4 xyzw) => new(xyzw); + public static int4 int4(float4 value) => new(value); + public static int4 int4(bool4 value) => new(value); public static bool2 bool2(bool2 xy) => new(xy); + public static bool2 bool2(float2 value) => new(value); + public static bool2 bool2(int2 value) => new(value); public static bool3 bool3(bool x, bool2 yz) => new(x, yz); public static bool3 bool3(bool2 xy, bool z) => new(xy, z); public static bool3 bool3(bool3 xyz) => new(xyz); + public static bool3 bool3(float3 value) => new(value); + public static bool3 bool3(int3 value) => new(value); public static bool4 bool4(bool x, bool y, bool2 zw) => new(x, y, zw); public static bool4 bool4(bool x, bool2 yz, bool w) => new(x, yz, w); public static bool4 bool4(bool x, bool3 yzw) => new(x, yzw); @@ -3134,4 +3171,6 @@ public static partial class math public static bool4 bool4(bool2 xy, bool2 zw) => new(xy, zw); public static bool4 bool4(bool3 xyz, bool w) => new(xyz, w); public static bool4 bool4(bool4 xyzw) => new(xyzw); + public static bool4 bool4(float4 value) => new(value); + public static bool4 bool4(int4 value) => new(value); } diff --git a/packages/cultmath/src/CultMath/math.Affine.cs b/packages/cultmath/src/CultMath/math.Affine.cs new file mode 100644 index 00000000..e7b8eb4b --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Affine.cs @@ -0,0 +1,249 @@ +namespace CultMath; + +public static partial class math +{ + // Reduced affine forms with one shared symbol (design.md, "Affine forms"): float3(x0, a, e) is the + // set { x0 + a eps + e delta : delta in [-1, 1] } at the region's shared eps in [-1, 1], with + // e >= 0. Every form over one region shares that eps (for a screen-tile slice, the depth + // parameter), and delta is private to the form. This is Messine's AF1 as Gamito and Maddock use it + // for gradient noise (t0 + t1 e1 + t2 e2), in one register, as an interval is a float2. + // + // Every af_* op returns a form whose set, at each eps, contains f evaluated pointwise in float32 at + // every point of its operands' sets at that same eps. Rounding rule: each op folds its own float32 + // rounding into e as (S) 2^-20, where S is the sum of the magnitudes the op's roundings are + // relative to (named in each comment). With u = 2^-24, every op below needs at most 8u S (its + // component roundings, the pointwise result's own rounding, and the roundings of computing e), so + // 2^-20 = 16u covers it twice over; the factor of two is the allowance for a device whose + and * + // are faithful (within one ulp) rather than correctly rounded, and fma contraction only removes + // roundings. Products also add 2^-126, the most any underflow to a subnormal can lose. The + // enclosure tests evaluate the form's set in double and f in float32 with no tolerance + // (AffineTests.EveryOpEnclosesItsPoints). No op takes a compound type or a reference parameter: each is a + // plain function of float values, so it mirrors into the HLSL common subset. + + // An upper bound on the spectral norm of the Hessian of snoise(float3). Provenance: + // NoiseBoundTests.MeasureHessian (slow, explicit) takes the largest Hessian norm (snoise_hessian, + // largest absolute eigenvalue) over 1e6 seeded points, refines the 1e4 largest by ascent, and + // multiplies the refined maximum by 1.10 (50.5838 measured, 55.642143 pinned; the central + // differences of snoise_grad it replaced read 50.955 here, their roundoff at h = 1e-3); + // NoiseBoundTests.HessianConstantPinsSampledCurvature pins this value against a fast re-measure and + // the ascent from MeasureHessian's witness. Empirical with a margin, not a proof. Random balls + // cannot see a constant 20% low, so the defence is those two curvature tests plus + // NoiseBoundTests.SnoiseFormEnclosesTheCurvatureWitness, where af_snoise misses at the point the + // curvature is realised if the constant is under it. The margin over the function: a scan of the + // whole 289^3 hash period found a realised maximum of 50.58, and bounding each corner's gradient + // independently over every hash configuration gives 52.22 (Soul pass s1). A change to the snoise + // kernel must re-run MeasureHessian and re-pin it. SNOISE_THIRD (math.Span.cs) is the next-order pin. + public const float SNOISE_HESSIAN = 55.642143f; + + // The absolute rounding of one float32 read of the snoise kernel, apart from the coordinate's own + // rounding (af_snoise's comment derives both): 2^-14 on the value and 2^-12 on the gradient. The single + // owner of the two, read by af_snoise and by span_slack (math.Span.cs); the shader twins are + // CULTMATH_SNOISE_READ_VALUE and CULTMATH_SNOISE_READ_GRADIENT. + internal const float SNOISE_READ_VALUE = 6.103515625e-5f; + internal const float SNOISE_READ_GRADIENT = 2.44140625e-4f; + + /// The point form (x, 0, 0): the value x at every eps. Exact. + public static float3 af_point(float value) => new(value, 0.0f, 0.0f); + + /// + /// The shared symbol itself, (x0, a, 0): the value x0 + a eps. It is how a region's parameter enters + /// (for a tile slice, depth z = z_m + h eps), so it is exact by definition: eps is defined through it. + /// + public static float3 af_symbol(float x0, float a) => new(x0, a, 0.0f); + + /// + /// Every value of the interval [lo, hi], uncorrelated with eps: (lo / 2 + hi / 2, 0, hi / 2 - lo / 2), + /// the halves taken before the sum and the difference so that endpoints near the float maximum do not + /// overflow in them. Rounding: x0 and e each round once, and a value of the interval is within e of x0 + /// only up to those; S = |x0| + e. Halving a subnormal endpoint loses at most 2^-150, and the sum and + /// difference of subnormals are exact, so 2^-126 covers the underflow (the e of an interval spanning + /// one subnormal step would otherwise round to 0). |x0| + e is at most the larger endpoint + /// in magnitude, so it does not overflow. If e + its absorption exceeds the float maximum it is + /// infinity, which still encloses. + /// + public static float3 af_from_iv(float2 interval) + { + var x0 = interval.x * 0.5f + interval.y * 0.5f; + var e = interval.y * 0.5f - interval.x * 0.5f; + return new float3(x0, 0.0f, e + (abs(x0) + e) * 9.5367431640625e-7f + 1.17549435e-38f); + } + + /// + /// The interval of every value of the form over every eps: x0 -+ (|a| + e), the bridge to iv_*. The + /// endpoints round inward by at most u (|x0| + |a| + e) each, so each is moved outward by + /// (|x0| + |a| + e) 2^-20, formed term by term so that the sum never passes the float maximum before it + /// is scaled. A form with an infinite component (an overflowed op) gives infinite + /// endpoints, and an endpoint that would be NaN (infinity minus infinity, or a NaN component) is + /// the infinity on its side, so the result is never NaN and still encloses. NaN is found by its bit + /// pattern, not by lo == lo, which a compiler that assumes no NaNs (dxc's default) deletes. + /// + public static float2 af_range(float3 x) + { + var r = abs(x.y) + x.z; + var w = abs(x.x) * 9.5367431640625e-7f + r * 9.5367431640625e-7f; + var lo = x.x - r - w; + var hi = x.x + r + w; + return new float2((asuint(lo) & 0x7fffffffu) > 0x7f800000u ? float.NegativeInfinity : lo, + (asuint(hi) & 0x7fffffffu) > 0x7f800000u ? float.PositiveInfinity : hi); + } + + /// + /// Encloses x + y: (x0 + y0, a_x + a_y, e_x + e_y). The shared symbol keeps the two forms + /// correlated, so af_sub(x, x) has a = 0. Rounding: S = |x0| + |a| + e of the result. + /// + public static float3 af_add(float3 x, float3 y) + { + var x0 = x.x + y.x; + var a = x.y + y.y; + var e = x.z + y.z; + return new float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7f); + } + + /// Encloses x - y: (x0 - y0, a_x - a_y, e_x + e_y). Rounding as af_add. + public static float3 af_sub(float3 x, float3 y) + { + var x0 = x.x - y.x; + var a = x.y - y.y; + var e = x.z + y.z; + return new float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7f); + } + + /// Encloses -x: (-x0, -a, e). Exact. + public static float3 af_neg(float3 x) => new(-x.x, -x.y, x.z); + + /// + /// Encloses x * s: (x0 s, a s, e |s|). Rounding: S = |x0| + |a| + e of the result, plus 2^-126 + /// for underflow. + /// + public static float3 af_scale(float3 x, float s) + { + var x0 = x.x * s; + var a = x.y * s; + var e = x.z * abs(s); + return new float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7f + 1.17549435e-38f); + } + + /// Encloses x + v for v in the interval, uncorrelated with eps: af_add(x, af_from_iv(interval)). + public static float3 af_add_iv(float3 x, float2 interval) => af_add(x, af_from_iv(interval)); + + /// + /// Encloses x * y, AF1's product: (x0 y0, x0 a_y + y0 a_x, |x0| e_y + |y0| e_x + (|a_x| + e_x)(|a_y| + e_y)). + /// The last term condenses the eps^2 term a_x a_y and every cross term with an error symbol into e, + /// so a form multiplied by itself is wider than its square: there is no af_sqr until a consumer + /// names one. Rounding: a can cancel, so S = |x0| + |x0 a_y| + |y0 a_x| + e, plus 2^-126 for + /// underflow. + /// + public static float3 af_mul(float3 x, float3 y) + { + var x0 = x.x * y.x; + var p = x.x * y.y; + var q = y.x * x.y; + var a = p + q; + var e = abs(x.x) * y.z + abs(y.x) * x.z + (abs(x.y) + x.z) * (abs(y.y) + y.z); + return new float3(x0, a, e + (abs(x0) + abs(p) + abs(q) + e) * 9.5367431640625e-7f + 1.17549435e-38f); + } + + /// + /// Encloses snoise(p) for every p = centre + axis eps + w with |w| <= radius, from one snoise_grad at + /// the centre (value n, gradient g). With R = |axis| + radius it returns the narrower of two sound + /// forms: the Lipschitz form (n, 0, L R), L = SNOISE_LIPSCHITZ, and the centred form + /// (n, g . axis, |g| radius + M R^2 / 2), M = SNOISE_HESSIAN. The centred form is Taylor's theorem: + /// snoise(c + d) = n + g . d + r with |r| <= M |d|^2 / 2, d = axis eps + w, g . w <= |g| radius. + /// radius must be at least 0. + /// + /// Both forms carry an allowance for the float32 evaluation of snoise, which is not the exact + /// function: 2^-14 + 2^-12 R + L 2^-20 (|centre|_1 + R). The skew and the corner offsets round the + /// input point by at most about 2u |p|_1 before any kernel term is formed (the hashing is exact on + /// integers below 2^24), so a float32 snoise of p is the exact one at a point within 2u |p|_1, which + /// moves the value by at most L 2u |p|_1; for both p and the centre, with the caller's scaling of the + /// point by a frequency (one rounding) and a factor of two for a GPU, 16u = 2^-20. The kernel's + /// absolute rounding is at most 105 x four corners x terms of magnitude below 0.5^4 x 1.8 over about + /// 30 operations, under 2^-15, doubled to 2^-14; the gradient's error times |d| <= R is under 2^-13 R, + /// doubled to 2^-12 R. AffineTests.SnoiseFormEnclosesBall checks the result with no tolerance on the + /// CPU, and the fixture's enclosure check measures it on a GPU. Rounding of the form itself: S = + /// |n| + |a| + e. The Lipschitz form is chosen when its half-width L R is at most the centred form's + /// |a| + |g| radius + M R^2 / 2, so the total width is never more than the Lipschitz form's. + /// + public static float3 af_snoise(float3 centre, float3 axis, float radius) + { + var g = snoise_grad(centre); + var gradient = new float3(g.x, g.y, g.z); + var reach = length(axis) + radius; + var lipschitz = SNOISE_LIPSCHITZ * reach; + var a = dot(gradient, axis); + var remainder = length(gradient) * radius + 0.5f * SNOISE_HESSIAN * reach * reach; + var allowance = SNOISE_READ_VALUE + SNOISE_READ_GRADIENT * reach + + SNOISE_LIPSCHITZ * 9.5367431640625e-7f * (abs(centre.x) + abs(centre.y) + abs(centre.z) + reach); + var centred = abs(a) + remainder < lipschitz; + var slope = centred ? a : 0.0f; + var e = (centred ? remainder : lipschitz) + allowance; + return new float3(g.w, slope, e + (abs(g.w) + abs(slope) + e) * 9.5367431640625e-7f); + } + + /// + /// Encloses the fBm value, sum of a_i snoise(p f_i) over the octaves, for every p = centre + axis eps + /// + w with |w| <= radius: the octave sum of af_snoise(centre f_i, axis f_i, radius |f_i|) scaled by + /// a_i, with frequency f_i and amplitude a_i compounded exactly as fbm_grad compounds them (its .w is + /// what AffineTests.SnoiseFormEnclosesBall encloses). The rounding of p f_i, inside fbm_grad, and of + /// the scaled centre and axis here, moves each point by at most 3u (|centre f_i|_1 + R f_i), inside + /// af_snoise's allowance for its input point. octaves is clamped to [0, 16] as there. + /// + public static float3 af_fbm(float3 centre, float3 axis, float radius, int octaves, float lacunarity, float gain) + { + octaves = clamp(octaves, 0, 16); + var amplitude = 1.0f; + var frequency = 1.0f; + var sum = new float3(0.0f, 0.0f, 0.0f); + for (var i = 0; i < octaves; i++) + { + sum = af_add(sum, af_scale(af_snoise(centre * frequency, axis * frequency, radius * abs(frequency)), amplitude)); + frequency *= lacunarity; + amplitude *= gain; + } + + return sum; + } + + /// + /// The axis of a screen tile's slice over the depth segment [z0, z1], for af_frustum_ball's centre: + /// (m_c, 1) h with h = (z1 - z0) / 2, in the camera frame of iv_frustum_ball (a pinhole at the + /// origin looking down +z, the ray of slope m the points (m z, z)). Its z component is h itself, the + /// symbol's coefficient for depth: z = z_m + h eps. Its rounding is af_frustum_ball's. + /// + public static float3 af_frustum_axis(float2 centreSlope, float z0, float z1) + { + var h = (z1 - z0) * 0.5f; + return new float3(centreSlope.x * h, centreSlope.y * h, h); + } + + /// + /// The affine slice of a screen tile over [z0, z1]: a centre (xyz) and radius (w) such that every point + /// of every ray of the tile at depth z in [z0, z1] is centre + axis eps(z) + w', |w'| <= radius, with + /// axis = af_frustum_axis(centreSlope, z0, z1), z_m = (z0 + z1) / 2, h = (z1 - z0) / 2 (both float32, + /// as computed here) and eps(z) = clamp((z - z_m) / h, -1, 1) (0 where h is 0). The centre is + /// (m_c z_m, z_m) and the radius z1 footprintPerDepth + warpVariation, where footprintPerDepth is + /// iv_frustum_ball's and warpVariation is what the caller's warp can add once its value at the centre + /// is applied to the centre (design.md, "Affine forms", the centred warp). Derivation: a point of + /// slope m_c + e (|e| <= footprintPerDepth) at depth z is (m_c z_m, z_m) + (m_c, 1)(z - z_m) + + /// (e z, 0), and (m_c, 1)(z - z_m) = axis eps(z) + (m_c, 1) r(z), where the clamp residual + /// |r(z)| = |z - z_m - h eps(z)| is at most u (|z_m| + h), one rounding each of z_m and h. A caller + /// taking depth as af_symbol(z_m, h) adds the same residual, 2^-23 (|z_m| + h) covers it, to that + /// form's e. Rounding: the centre's products and the axis's products round once each (u |c|_1 and + /// u |axis|_1 against |eps| <= 1), the residual is at most u (|c|_1 + |axis|_1) since + /// |(m_c, 1)| <= |m_c|_1 + 1, and the radius rounds at most four times; 2^-20 (|c|_1 + |axis|_1 + + /// radius) covers it twice over (AffineTests.FrustumSliceEnclosesEveryRayPoint, extreme families + /// included). The caller rotates and translates the centre into world space, rotates the axis, and + /// scales all three by its noise frequency; the rounding of that transform is the caller's. + /// + public static float4 af_frustum_ball(float2 centreSlope, float z0, float z1, float footprintPerDepth, float warpVariation) + { + var zm = (z0 + z1) * 0.5f; + var h = (z1 - z0) * 0.5f; + var cx = centreSlope.x * zm; + var cy = centreSlope.y * zm; + var spread = (abs(centreSlope.x) + abs(centreSlope.y) + 1.0f) * h; + var radius = z1 * footprintPerDepth + warpVariation; + radius += (abs(cx) + abs(cy) + abs(zm) + spread + radius) * 9.5367431640625e-7f; + return new float4(cx, cy, zm, radius); + } +} diff --git a/packages/cultmath/src/CultMath/math.Affine.cs.meta b/packages/cultmath/src/CultMath/math.Affine.cs.meta new file mode 100644 index 00000000..34ba0047 --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Affine.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 86b87ffb6c8a4d72b067a64f9f8a06ce diff --git a/packages/cultmath/src/CultMath/math.Cycles.cs b/packages/cultmath/src/CultMath/math.Cycles.cs new file mode 100644 index 00000000..835d3d72 --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Cycles.cs @@ -0,0 +1,397 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Cycles node semantics: what Blender's Cycles renderer computes for the Math, Map Range, Clamp, Mix and +// RGB to BW nodes and for a Color Ramp lookup, ported function by function from the Cycles kernel +// (intern/cycles of the Blender v5.2.2 tag; SPDX-FileCopyrightText: 2011-2022 Blender Foundation, Apache-2.0): +// kernel/svm/{math_util,map_range,clamp,mix,color_util,ramp,convert}.h, util/math_base.h, util/color.h and +// util/math_float3.h. Each function's comment names its Cycles source. Modified by GameCult: Cycles C++ +// becomes C#, a function per node operation, and the node's socket defaults and clamp options are left to +// the caller. This file is Apache-2.0 (section 4: it was changed); the rest of CultMath is MIT, except the +// MPL-2.0 Phacelle files (see THIRD-PARTY-NOTICES.md). shaders/CultMath.Cycles.hlsl mirrors it bit for bit. +// +// Operands are finite floats. NaN and infinite operands are outside the oracle's reach and the mirror's. +// CyclesOracleTests holds every function to the results of Blender 5.2.2's own CPU Cycles. + +namespace CultMath; + +public static partial class math +{ + // FLT_EPSILON, the least epsilon a Compare node honours. + private const float CYCLES_FLT_EPSILON = 1.1920929e-07f; + + /// The scene-linear red luminance coefficient Cycles' RGB to BW node reads from Blender 5.2.2's default OCIO config. + public const float CYCLES_RGB_TO_Y_R = 0.212639093f; + + /// The scene-linear green luminance coefficient Cycles' RGB to BW node reads from Blender 5.2.2's default OCIO config. + public const float CYCLES_RGB_TO_Y_G = 0.715169132f; + + /// The scene-linear blue luminance coefficient Cycles' RGB to BW node reads from Blender 5.2.2's default OCIO config. + public const float CYCLES_RGB_TO_Y_B = 0.0721927434f; + + // ---- Math node (kernel/svm/math_util.h svm_math; util/math_base.h) ---- + + /// Math node Divide (safe_divide): a / b, or 0 when b is 0. + public static float cycles_divide(float a, float b) => b != 0.0f ? a / b : 0.0f; + + /// + /// Math node Power (safe_powf with compatible_powf): 0 for a negative base with a fractional exponent, + /// 1 for exponent 0, 0 for base 0. A negative base takes an integral exponent's parity. + /// + public static float cycles_power(float a, float b) + { + var whole = b >= 0.0f ? floor(b) : ceil(b); + if (a < 0.0f && b != whole) + return 0.0f; + if (b == 0.0f) + return 1.0f; + if (a == 0.0f) + return 0.0f; + if (a < 0.0f) + { + var magnitude = pow(-a, b); + // Odd exactly when the remainder is 1: an infinite exponent leaves NaN here and is even, as powf(a, +-inf) is never negative. + return b - 2.0f * floor(0.5f * b) == 1.0f ? -magnitude : magnitude; + } + + return pow(a, b); + } + + /// Math node Logarithm (safe_logf): log(a) / log(b), or 0 when a or b is not positive or log(b) is 0. + public static float cycles_logarithm(float a, float b) + { + if (a <= 0.0f || b <= 0.0f) + return 0.0f; + var denominator = log(b); + return denominator != 0.0f ? log(a) / denominator : 0.0f; + } + + /// Math node Square Root (safe_sqrtf): the square root of max(a, 0). + public static float cycles_sqrt(float a) => sqrt(max(a, 0.0f)); + + /// Math node Inverse Square Root (inversesqrtf): 1 / sqrt(a), or 0 when a is not positive. + public static float cycles_inverse_sqrt(float a) => a > 0.0f ? 1.0f / sqrt(a) : 0.0f; + + /// + /// Math node Truncated Modulo (safe_modulo), the remainder with the dividend's sign, exactly as fmodf computes + /// it, or 0 when b is 0. GLSL has no fmod, and a - b trunc(a / b) is wrong where the quotient rounds up to an + /// integer or the product rounds (3 mod 0.3 is 0.29999995, not 0). So this subtracts the largest power-of-two + /// multiple of the divisor not above the remainder until the remainder is below the divisor: every step is an + /// exact subtraction, as in fmod. The loops are bounded by the binades a float spans. + /// + public static float cycles_modulo(float a, float b) + { + var remainder = abs(a); + var divisor = abs(b); + for (var steps = 0; steps < 300 && remainder >= divisor && divisor > 0.0f; steps++) + { + var multiple = divisor; + for (var doublings = 0; doublings < 300 && multiple * 2.0f <= remainder; doublings++) + multiple = multiple * 2.0f; + remainder = remainder - multiple; + } + + return b != 0.0f ? (a < 0.0f ? -remainder : remainder) : 0.0f; + } + + /// Math node Floored Modulo (safe_floored_modulo): a - floor(a / b) b, or 0 when b is 0, with one IEEE single + /// rounding per operation (the reference of ruling cycles-kernel-reference-ruled). A build that contracts + /// a - floor(a / b) b into one fused operation differs by at most 2^-23 (|a / b| + 1) |b| (measured 0.91 of 2^-24 (|a| + |b|) + /// on Blender 5.2.2's AVX2 kernel); a fast-math build may also move floor(a / b) by one near an integer quotient, + /// so the result differs by a whole |b|. See tools/cycles-oracle/README.md. + public static float cycles_floored_modulo(float a, float b) => b != 0.0f ? a - floor(a / b) * b : 0.0f; + + /// Math node Wrap (wrapf; note the argument order): value wrapped into [min_value, max_value), or min_value for an empty range, + /// with one IEEE single rounding per operation. A build that contracts value - range floor(...) into one fused operation differs by at + /// most 2^-23 (|value| + |min_value| + |range|) (measured 0.77 of 2^-24 on the AVX2 kernel); a fast-math build may also move floor by one, + /// a whole |range|. See tools/cycles-oracle/README.md. + public static float cycles_wrap(float value, float max_value, float min_value) + { + var range = max_value - min_value; + return range != 0.0f ? value - (range * floor((value - min_value) / range)) : min_value; + } + + /// Math node Snap: floor(safe_divide(a, b)) b. + public static float cycles_snap(float a, float b) => floor(cycles_divide(a, b)) * b; + + /// Math node Ping-Pong (pingpongf): a triangle wave of a with period 2 b, or 0 when b is 0. + public static float cycles_pingpong(float a, float b) + { + var scaled = (a - b) / (b * 2.0f); + return b != 0.0f ? abs((scaled - floor(scaled)) * b * 2.0f - b) : 0.0f; + } + + /// Math node Smooth Minimum (smoothminf): the polynomial smooth minimum of width k, or min(a, b) when k is 0. + public static float cycles_smooth_min(float a, float b, float k) + { + var h = max(k - abs(a - b), 0.0f) / k; + return k != 0.0f ? min(a, b) - h * h * h * k * 0.16666667f : min(a, b); + } + + /// Math node Smooth Maximum: -smoothminf(-a, -b, k). + public static float cycles_smooth_max(float a, float b, float k) => -cycles_smooth_min(-a, -b, k); + + /// Math node Compare: 1 when a equals b or they differ by at most max(epsilon, FLT_EPSILON), else 0. + public static float cycles_compare(float a, float b, float epsilon) => + (a == b || abs(a - b) <= max(epsilon, CYCLES_FLT_EPSILON)) ? 1.0f : 0.0f; + + /// Math node Round: floor(a + 0.5). + public static float cycles_round(float a) => floor(a + 0.5f); + + /// Math node Truncate: floor for a >= 0, ceil otherwise. + public static float cycles_trunc(float a) => a >= 0.0f ? floor(a) : ceil(a); + + /// Math node Fraction: a - floor(a). + public static float cycles_fract(float a) => a - floor(a); + + /// Math node Sign (compatible_signf): 0 for 0, -1 below, 1 above. + public static float cycles_sign(float a) => a == 0.0f ? 0.0f : (a < 0.0f ? -1.0f : 1.0f); + + /// Math node Arcsine (safe_asinf, util/math_base.h): asin of a clamped to [-1, 1]. + public static float cycles_arcsine(float a) => asin(clamp(a, -1.0f, 1.0f)); + + /// Math node Arccosine (safe_acosf, util/math_base.h): acos of a clamped to [-1, 1]. + public static float cycles_arccosine(float a) => acos(clamp(a, -1.0f, 1.0f)); + + /// Math node Arctan2 (compatible_atan2, util/math_base.h; a is y, b is x): 0 at the origin, else atan2(a, b). + public static float cycles_arctan2(float a, float b) => (b == 0.0f && a == 0.0f) ? 0.0f : atan2(a, b); + + // ---- Map Range node (kernel/svm/map_range.h svm_node_map_range) ---- + // A Map Range node's Clamp option is a Clamp node of type Range on its result (MapRangeNode::expand): + // compose cycles_clamp_range over these. + + /// Map Range, Linear: to_min + (value - from_min) / (from_max - from_min) (to_max - to_min), or 0 when from_max equals from_min. + public static float cycles_map_range_linear(float value, float from_min, float from_max, float to_min, float to_max) + { + var factor = (value - from_min) / (from_max - from_min); + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0f; + } + + /// Map Range, Stepped: the linear factor quantized to `steps` steps (0 when steps is not positive), or 0 when from_max equals from_min. + public static float cycles_map_range_stepped(float value, float from_min, float from_max, float to_min, float to_max, float steps) + { + var factor = (value - from_min) / (from_max - from_min); + factor = steps > 0.0f ? floor(factor * (steps + 1.0f)) / steps : 0.0f; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0f; + } + + /// + /// Map Range, Smooth Step: the value goes through smoothstep(from_min, from_max, .), flipped when from_min + /// is above from_max (util/math_base.h smoothstep), or 0 when from_max equals from_min. + /// + public static float cycles_map_range_smoothstep(float value, float from_min, float from_max, float to_min, float to_max) + { + var low = min(from_min, from_max); + var high = max(from_min, from_max); + var t = (value - low) / (high - low); + var eased = value < low ? 0.0f : (value >= high ? 1.0f : (3.0f - 2.0f * t) * (t * t)); + var factor = from_min > from_max ? 1.0f - eased : eased; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0f; + } + + /// Map Range, Smoother Step (map_range.h smootherstep), flipped when from_min is above from_max, or 0 when from_max equals from_min. + public static float cycles_map_range_smootherstep(float value, float from_min, float from_max, float to_min, float to_max) + { + var low = min(from_min, from_max); + var high = max(from_min, from_max); + var x = clamp(cycles_divide(value - low, high - low), 0.0f, 1.0f); + var eased = x * x * x * (x * (x * 6.0f - 15.0f) + 10.0f); + var factor = from_min > from_max ? 1.0f - eased : eased; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0f; + } + + // ---- Clamp node (kernel/svm/clamp.h svm_node_clamp) ---- + + /// Clamp node, Min Max: clamp(value, min_value, max_value). + public static float cycles_clamp_minmax(float value, float min_value, float max_value) => clamp(value, min_value, max_value); + + /// Clamp node, Range: as Min Max, with the bounds swapped when min_value is above max_value. + public static float cycles_clamp_range(float value, float min_value, float max_value) => + min_value > max_value ? clamp(value, max_value, min_value) : clamp(value, min_value, max_value); + + // ---- Mix node (kernel/svm/mix.h, color_util.h) ---- + // Factor clamping (svm_node_mix_color's saturatef) and result clamping (saturate) are the caller's. + + /// Mix node, Float (svm_node_mix_float): a (1 - t) + b t. + public static float cycles_mix_float(float t, float a, float b) => a * (1.0f - t) + b * t; + + /// Mix node, Vector, uniform factor (svm_node_mix_vector): a (1 - t) + b t per component. + public static float3 cycles_mix_vector(float t, float3 a, float3 b) => a * (new float3(1.0f, 1.0f, 1.0f) - t) + b * t; + + /// Mix node, Mix blend mode (svm_mix_blend). + public static float3 cycles_mix_blend(float t, float3 col1, float3 col2) => col1 + t * (col2 - col1); + + /// Mix node, Add blend mode (svm_mix_add). + public static float3 cycles_mix_add(float t, float3 col1, float3 col2) => col1 + t * ((col1 + col2) - col1); + + /// Mix node, Multiply blend mode (svm_mix_mul). + public static float3 cycles_mix_mul(float t, float3 col1, float3 col2) => col1 + t * (col1 * col2 - col1); + + /// Mix node, Screen blend mode (svm_mix_screen). + public static float3 cycles_mix_screen(float t, float3 col1, float3 col2) + { + var tm = 1.0f - t; + var one = new float3(1.0f, 1.0f, 1.0f); + return one - (new float3(tm, tm, tm) + t * (one - col2)) * (one - col1); + } + + /// Mix node, Overlay blend mode (svm_mix_overlay). + public static float3 cycles_mix_overlay(float t, float3 col1, float3 col2) + { + var tm = 1.0f - t; + return new float3( + col1.x < 0.5f ? col1.x * (tm + 2.0f * t * col2.x) : 1.0f - (tm + 2.0f * t * (1.0f - col2.x)) * (1.0f - col1.x), + col1.y < 0.5f ? col1.y * (tm + 2.0f * t * col2.y) : 1.0f - (tm + 2.0f * t * (1.0f - col2.y)) * (1.0f - col1.y), + col1.z < 0.5f ? col1.z * (tm + 2.0f * t * col2.z) : 1.0f - (tm + 2.0f * t * (1.0f - col2.z)) * (1.0f - col1.z)); + } + + /// Mix node, Subtract blend mode (svm_mix_sub). + public static float3 cycles_mix_sub(float t, float3 col1, float3 col2) => col1 + t * ((col1 - col2) - col1); + + /// Mix node, Divide blend mode (svm_mix_div): a channel whose col2 is 0 keeps col1. + public static float3 cycles_mix_div(float t, float3 col1, float3 col2) + { + var tm = 1.0f - t; + return new float3( + col2.x != 0.0f ? tm * col1.x + t * col1.x / col2.x : col1.x, + col2.y != 0.0f ? tm * col1.y + t * col1.y / col2.y : col1.y, + col2.z != 0.0f ? tm * col1.z + t * col1.z / col2.z : col1.z); + } + + /// Mix node, Difference blend mode (svm_mix_diff). + public static float3 cycles_mix_diff(float t, float3 col1, float3 col2) => col1 + t * (abs(col1 - col2) - col1); + + /// Mix node, Exclusion blend mode (svm_mix_exclusion). + public static float3 cycles_mix_exclusion(float t, float3 col1, float3 col2) => + max(col1 + t * ((col1 + col2 - 2.0f * col1 * col2) - col1), new float3(0.0f, 0.0f, 0.0f)); + + /// Mix node, Darken blend mode (svm_mix_dark). + public static float3 cycles_mix_dark(float t, float3 col1, float3 col2) => col1 + t * (min(col1, col2) - col1); + + /// Mix node, Lighten blend mode (svm_mix_light). + public static float3 cycles_mix_light(float t, float3 col1, float3 col2) => col1 + t * (max(col1, col2) - col1); + + /// Mix node, Dodge blend mode (svm_mix_dodge). + public static float3 cycles_mix_dodge(float t, float3 col1, float3 col2) + { + var divisor = new float3(1.0f, 1.0f, 1.0f) - t * col2; + return new float3( + col1.x != 0.0f ? (divisor.x <= 0.0f ? 1.0f : min(col1.x / divisor.x, 1.0f)) : col1.x, + col1.y != 0.0f ? (divisor.y <= 0.0f ? 1.0f : min(col1.y / divisor.y, 1.0f)) : col1.y, + col1.z != 0.0f ? (divisor.z <= 0.0f ? 1.0f : min(col1.z / divisor.z, 1.0f)) : col1.z); + } + + /// Mix node, Burn blend mode (svm_mix_burn). + public static float3 cycles_mix_burn(float t, float3 col1, float3 col2) + { + var tm = 1.0f - t; + var divisor = tm + t * col2; + var burnt = new float3(1.0f, 1.0f, 1.0f) - (new float3(1.0f, 1.0f, 1.0f) - col1) / divisor; + return new float3( + divisor.x <= 0.0f ? 0.0f : clamp(burnt.x, 0.0f, 1.0f), + divisor.y <= 0.0f ? 0.0f : clamp(burnt.y, 0.0f, 1.0f), + divisor.z <= 0.0f ? 0.0f : clamp(burnt.z, 0.0f, 1.0f)); + } + + /// RGB to HSV as Cycles computes it (util/color.h rgb_to_hsv): hue in [0, 1), saturation, value. + public static float3 cycles_rgb_to_hsv(float3 rgb) + { + var cmax = max(rgb.x, max(rgb.y, rgb.z)); + var cmin = min(rgb.x, min(rgb.y, rgb.z)); + var cdelta = cmax - cmin; + var s = cmax != 0.0f ? cdelta / cmax : 0.0f; + var c = (new float3(cmax, cmax, cmax) - rgb) / cdelta; + var h = rgb.x == cmax ? c.z - c.y : (rgb.y == cmax ? 2.0f + c.x - c.z : 4.0f + c.y - c.x); + h = h * 0.16666667f; // Cycles' kernel is built with reciprocal math: h /= 6.0f computes h * (1 / 6.0f). + h = h < 0.0f ? h + 1.0f : h; + return new float3(s != 0.0f ? h : 0.0f, s, cmax); + } + + /// HSV to RGB as Cycles computes it (util/color.h hsv_to_rgb). + public static float3 cycles_hsv_to_rgb(float3 hsv) + { + var h = hsv.x == 1.0f ? 0.0f : hsv.x; + h = h * 6.0f; + var i = floor(h); + var f = h - i; + var p = hsv.z * (1.0f - hsv.y); + var q = hsv.z * (1.0f - (hsv.y * f)); + var t = hsv.z * (1.0f - (hsv.y * (1.0f - f))); + var rgb = i == 0.0f ? new float3(hsv.z, t, p) : + (i == 1.0f ? new float3(q, hsv.z, p) : + (i == 2.0f ? new float3(p, hsv.z, t) : + (i == 3.0f ? new float3(p, q, hsv.z) : + (i == 4.0f ? new float3(t, p, hsv.z) : new float3(hsv.z, p, q))))); + return hsv.y != 0.0f ? rgb : new float3(hsv.z, hsv.z, hsv.z); + } + + /// Mix node, Hue blend mode (svm_mix_hue). + public static float3 cycles_mix_hue(float t, float3 col1, float3 col2) + { + var hsv2 = cycles_rgb_to_hsv(col2); + var hsv = cycles_rgb_to_hsv(col1); + var shifted = cycles_hsv_to_rgb(new float3(hsv2.x, hsv.y, hsv.z)); + return hsv2.y != 0.0f ? col1 + t * (shifted - col1) : col1; + } + + /// Mix node, Saturation blend mode (svm_mix_sat). + public static float3 cycles_mix_sat(float t, float3 col1, float3 col2) + { + var tm = 1.0f - t; + var hsv = cycles_rgb_to_hsv(col1); + var hsv2 = cycles_rgb_to_hsv(col2); + return hsv.y != 0.0f ? cycles_hsv_to_rgb(new float3(hsv.x, tm * hsv.y + t * hsv2.y, hsv.z)) : col1; + } + + /// Mix node, Value blend mode (svm_mix_val). + public static float3 cycles_mix_val(float t, float3 col1, float3 col2) + { + var tm = 1.0f - t; + var hsv = cycles_rgb_to_hsv(col1); + var hsv2 = cycles_rgb_to_hsv(col2); + return cycles_hsv_to_rgb(new float3(hsv.x, hsv.y, tm * hsv.z + t * hsv2.z)); + } + + /// Mix node, Color blend mode (svm_mix_color). + public static float3 cycles_mix_color(float t, float3 col1, float3 col2) + { + var hsv2 = cycles_rgb_to_hsv(col2); + var hsv = cycles_rgb_to_hsv(col1); + var shifted = cycles_hsv_to_rgb(new float3(hsv2.x, hsv2.y, hsv.z)); + return hsv2.y != 0.0f ? col1 + t * (shifted - col1) : col1; + } + + /// Mix node, Soft Light blend mode (svm_mix_soft). + public static float3 cycles_mix_soft(float t, float3 col1, float3 col2) + { + var tm = 1.0f - t; + var one = new float3(1.0f, 1.0f, 1.0f); + var scr = one - (one - col2) * (one - col1); + return tm * col1 + t * ((one - col1) * col2 * col1 + col1 * scr); + } + + /// Mix node, Linear Light blend mode (svm_mix_linear). + public static float3 cycles_mix_linear(float t, float3 col1, float3 col2) => + col1 + t * (2.0f * col2 + new float3(-1.0f, -1.0f, -1.0f)); + + // ---- RGB to BW node (kernel/svm/convert.h NODE_CONVERT_CF) ---- + + /// RGB to BW node: the scene-linear luminance of a colour. + public static float cycles_rgb_to_bw(float3 color) => + color.x * CYCLES_RGB_TO_Y_R + color.y * CYCLES_RGB_TO_Y_G + color.z * CYCLES_RGB_TO_Y_B; + + // ---- Color Ramp lookup (kernel/svm/ramp.h rgb_ramp_lookup, without extrapolation) ---- + + /// + /// Where a Color Ramp of `size` table entries is read at t: (index, weight), the lower entry and the + /// weight of the next one. The colour is table[index] when weight is 0 and + /// (1 - weight) table[index] + weight table[index + 1] otherwise. The ramp table itself is the caller's; + /// Blender's holds 257 entries, the ramp sampled at i / 256. + /// + public static float2 cycles_ramp_index(float t, int size) + { + var f = (t > 0.0f ? (t < 1.0f ? t : 1.0f) : 0.0f) * (float)(size - 1); + var index = clamp((int)f, 0, size - 1); + var lower = (float)index; + return new float2(lower, f - lower); + } +} diff --git a/packages/cultmath/src/CultMath/math.Cycles.cs.meta b/packages/cultmath/src/CultMath/math.Cycles.cs.meta new file mode 100644 index 00000000..fc3e97cb --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Cycles.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0484788fead24b7cb0b8b373bf7e1f9d diff --git a/packages/cultmath/src/CultMath/math.Interval.cs b/packages/cultmath/src/CultMath/math.Interval.cs new file mode 100644 index 00000000..5d0a6da4 --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Interval.cs @@ -0,0 +1,223 @@ +namespace CultMath; + +public static partial class math +{ + // Interval arithmetic over float2(lo, hi), lo <= hi, both finite (design.md, "Intervals"). Every + // iv_* function returns an interval that contains f(x) for every x in its input intervals, where + // f(x) is the same function evaluated pointwise in float32, mirrored by cultmath_iv_* in + // shaders/CultMath.Interval.hlsl. Each bound is computed with the pointwise function's own float32 + // operations; because IEEE round-to-nearest is monotone, an op that is monotone on its region + // encloses its float32 evaluation with no widening. Where float32 evaluation is not monotone, or + // the libm is not required to be, the bound is widened by exactly one ulp, and the doc comment + // says so. There is no empty interval: a caller that needs "provably empty" tests hi < cutoff. + + // Lipschitz constant of snoise(float3) in its input: an upper bound on the length of its analytic + // gradient. Provenance: NoiseBoundTests.MeasureLipschitz (slow, explicit) takes the largest gradient + // length over 1e6 seeded points, refines the 1e4 largest by gradient ascent, and multiplies the + // refined maximum by 1.10; NoiseBoundTests.LipschitzConstantPinsSampledGradients pins this value + // against a fast re-measure and the ascent from MeasureLipschitz's witness. + // Empirical with a margin, not a proof; the enclosure tests are the defence. A change to the + // snoise kernel must re-run MeasureLipschitz and re-pin this constant. + public const float SNOISE_LIPSCHITZ = 7.9640074f; + + // Lipschitz constant of snoise(float2) in its input, with SNOISE_LIPSCHITZ's provenance rule: + // NoiseBoundTests.MeasureLipschitz2 (slow, explicit) takes the largest gradient length (central + // differences over exact float steps) over 1e6 seeded points, refines the 1e4 largest by ascent and + // multiplies by 1.10; NoiseBoundTests.Lipschitz2ConstantPins pins it against a fast re-measure and + // the ascent from MeasureLipschitz2's witness. A change to the 2D snoise kernel must re-run + // MeasureLipschitz2 and re-pin this constant. + public const float SNOISE2_LIPSCHITZ = 8.117002f; + + /// The point interval [x, x]. + public static float2 iv_point(float value) => new(value, value); + + /// Encloses x + y for x in a, y in b. Monotone: no widening. + public static float2 iv_add(float2 a, float2 b) => new(a.x + b.x, a.y + b.y); + + /// Encloses x - y for x in a, y in b. Monotone: no widening. + public static float2 iv_sub(float2 a, float2 b) => new(a.x - b.y, a.y - b.x); + + /// Encloses -x for x in a. Exact. + public static float2 iv_neg(float2 a) => new(-a.y, -a.x); + + /// + /// Encloses x * y for x in a, y in b: the least and greatest of the four corner products. The + /// product is monotone in each factor for a fixed sign of the other, so no widening. + /// + public static float2 iv_mul(float2 a, float2 b) + { + var p0 = a.x * b.x; + var p1 = a.x * b.y; + var p2 = a.y * b.x; + var p3 = a.y * b.y; + return new(min(min(p0, p1), min(p2, p3)), max(max(p0, p1), max(p2, p3))); + } + + /// Encloses x * s for x in a. Monotone: no widening. + public static float2 iv_scale(float2 a, float s) => s >= 0.0f ? new(a.x * s, a.y * s) : new(a.y * s, a.x * s); + + /// Encloses abs(x) for x in a; an interval straddling zero gives [0, max(-lo, hi)]. Exact. + public static float2 iv_abs(float2 a) + { + if (a.x >= 0.0f) + return a; + if (a.y <= 0.0f) + return new(-a.y, -a.x); + return new(0.0f, max(-a.x, a.y)); + } + + /// Encloses min(x, y) for x in a, y in b. Monotone: no widening. + public static float2 iv_min(float2 a, float2 b) => new(min(a.x, b.x), min(a.y, b.y)); + + /// Encloses max(x, y) for x in a, y in b. Monotone: no widening. + public static float2 iv_max(float2 a, float2 b) => new(max(a.x, b.x), max(a.y, b.y)); + + /// + /// Encloses x * x for x in a; an interval straddling zero gives [0, max(lo * lo, hi * hi)]. Tighter + /// than iv_mul(a, a), which cannot know both factors are the same x. Monotone on each side of zero: + /// no widening. + /// + public static float2 iv_sqr(float2 a) + { + var l = a.x * a.x; + var h = a.y * a.y; + if (a.x >= 0.0f) + return new(l, h); + if (a.y <= 0.0f) + return new(h, l); + return new(0.0f, max(l, h)); + } + + /// + /// Encloses sqrt(x) for x in a with x >= 0 (sqrt's domain): lo is clamped at 0, so [-4, 9] gives [0, 3] + /// and an interval wholly below zero gives [0, 0]. sqrt is correctly rounded, hence monotone: no + /// widening. + /// + public static float2 iv_sqrt(float2 a) => new(sqrt(max(a.x, 0.0f)), sqrt(max(a.y, 0.0f))); + + /// + /// Encloses exp(x) for x in a. Widened by one ulp on each side, because exp is not required to be + /// correctly rounded, so a libm need not be monotone. Where exp(hi) overflows to infinity, hi is NaN, + /// which a cull test hi < cutoff reads as "not provably below", the safe side. + /// + public static float2 iv_exp(float2 a) + { + var lo = exp(a.x); + var hi = exp(a.y); + return new(lo > 0.0f ? asfloat(asuint(lo) - 1u) : 0.0f, asfloat(asuint(hi) + 1u)); + } + + /// Encloses clamp(x, minimum, maximum) for x in a. Monotone: no widening. + public static float2 iv_clamp(float2 a, float minimum, float maximum) => + new(clamp(a.x, minimum, maximum), clamp(a.y, minimum, maximum)); + + /// Encloses saturate(x) for x in a. Monotone: no widening. + public static float2 iv_saturate(float2 a) => new(saturate(a.x), saturate(a.y)); + + /// + /// Encloses smoothstep(minimum, maximum, x) for x in a. smoothstep is monotone in x (increasing when + /// minimum < maximum, decreasing when minimum > maximum), so the bound is its value at the two + /// endpoints, ordered. Its float32 evaluation t * t * (3 - 2t) is not monotone, by at most one ulp + /// (IntervalTests.MeasureMonotonicity), so the bound is widened by one ulp inside [0, 1]. + /// + public static float2 iv_smoothstep(float minimum, float maximum, float2 a) + { + var s0 = smoothstep(minimum, maximum, a.x); + var s1 = smoothstep(minimum, maximum, a.y); + var lo = min(s0, s1); + var hi = max(s0, s1); + return new(lo > 0.0f ? asfloat(asuint(lo) - 1u) : 0.0f, hi < 1.0f ? asfloat(asuint(hi) + 1u) : 1.0f); + } + + /// + /// Encloses lerp(x, y, amount) = x + (y - x) * amount for x in a, y in b, by evaluating that expression + /// with iv_sub, iv_scale and iv_add. Each step is monotone, so the result encloses the float32 lerp + /// with no widening, for any amount. It is the natural interval extension: x appears twice, so for + /// non-point a the width is (width(a) + width(b)) * |amount| + width(a), wider than the true range. + /// + public static float2 iv_lerp(float2 a, float2 b, float amount) => iv_add(a, iv_scale(iv_sub(b, a), amount)); + + /// + /// Encloses snoise(x) for every x within distance radius of centre: [n - L r, n + L r] intersected + /// with [-1, 1], where n = snoise(centre) and L = SNOISE_LIPSCHITZ. radius must be at least 0. One + /// snoise evaluation, value only. A domain warp that moves x by at most D is enclosed by passing + /// radius + D (NoiseBoundTests.WarpedPointsStayEnclosed). + /// + public static float2 iv_snoise_ball(float3 centre, float radius) + { + var n = snoise(centre); + var e = SNOISE_LIPSCHITZ * radius; + return new(max(n - e, -1.0f), min(n + e, 1.0f)); + } + + /// + /// Encloses snoise(x) for every 2D x within distance radius of centre: [n - L2 r, n + L2 r] intersected + /// with [-1, 1], n = snoise(centre), L2 = SNOISE2_LIPSCHITZ. radius must be at least 0. One snoise + /// evaluation, value only. Like iv_snoise_ball(float3) it is exact for the point it is handed and + /// carries no allowance for the float32 evaluation: a consumer whose 2D flow is evaluated at points + /// it rounds itself (a shifted, scaled or projected point) adds 2^-14 + L2 2^-20 (|centre|_1 + radius) + /// to the width, the convention af_snoise carries for the 3D point + /// (NoiseBoundTests.FlowVariationCarriesItsAllowance, CentredWarpStaysEnclosed). + /// + public static float2 iv_snoise_ball(float2 centre, float radius) + { + var n = snoise(centre); + var e = SNOISE2_LIPSCHITZ * radius; + return new(max(n - e, -1.0f), min(n + e, 1.0f)); + } + + /// + /// Encloses the fBm value, sum of a_i * snoise(x * f_i) over the octaves, for every x within distance + /// radius of centre: the octave sum of iv_snoise_ball(centre * f_i, radius * |f_i|) scaled by a_i, + /// with frequency f_i and amplitude a_i compounded exactly as the value-and-gradient fBm compounds + /// them (its .w is what NoiseBoundTests.FbmBallEnclosesPoints encloses). octaves is clamped to [0, 16] + /// as there. + /// + public static float2 iv_fbm_ball(float3 centre, float radius, int octaves, float lacunarity, float gain) + { + octaves = clamp(octaves, 0, 16); + var amplitude = 1.0f; + var frequency = 1.0f; + var sum = new float2(0.0f, 0.0f); + for (var i = 0; i < octaves; i++) + { + sum = iv_add(sum, iv_scale(iv_snoise_ball(centre * frequency, radius * abs(frequency)), amplitude)); + frequency *= lacunarity; + amplitude *= gain; + } + + return sum; + } + + /// + /// A ball (xyz centre, w radius) enclosing every point of every ray of a screen tile over the depth + /// segment [z0, z1], each point then moved by a warp of length at most warp: the ball to hand + /// iv_snoise_ball (scaled by the noise frequency) when one probe serves the whole tile. Camera frame: + /// a pinhole at the origin looking down +z, where the ray of slope m is the points (m z, z). + /// centreSlope is the tile's central slope m_c; footprintPerDepth is the largest distance of any + /// ray's slope from m_c, N / (sqrt(2) f) for an N x N pixel tile at focal length f pixels (the full + /// pixel footprint, so sub-pixel jitter is covered). The centre is (m_c z_m, z_m), z_m = (z0 + z1) / 2; + /// the radius is ((z1 - z0) / 2) |(m_c, 1)| + z1 footprintPerDepth + warp. Derivation: a point of slope + /// m_c + e (|e| <= footprintPerDepth) at depth z is c + (z - z_m)(m_c, 1) + z (e, 0); the first term is + /// at most the first radius term, the second at most the second, and the warp adds at most warp. + /// The ball also carries its own float32 rounding: the radius is widened by (|c|_1 + radius) 2^-20. + /// With u = 2^-24, each centre component carries at most two roundings (z_m, then the product), so the + /// float centre is within 2u |c|_1 of the exact one; the radius carries at most seven, so the exact + /// radius is at most (1 + 7u) times the float one; the widening rounds once more. 2^-20 = 16u covers + /// 8u (|c|_1 + radius) twice over, and fma contraction only removes roundings. So every exact point of + /// every ray, at any depth and slope, lies in the returned float ball + /// (NoiseBoundTests.TileBallEnclosesEveryRaySegment, degenerate and far segments included). The caller + /// rotates and translates the centre into world space (the radius is unchanged) and scales both by its + /// noise frequency; the rounding of that transform is the caller's. + /// + public static float4 iv_frustum_ball(float2 centreSlope, float z0, float z1, float footprintPerDepth, float warp) + { + var zm = (z0 + z1) * 0.5f; + var axis = sqrt(centreSlope.x * centreSlope.x + centreSlope.y * centreSlope.y + 1.0f); + var cx = centreSlope.x * zm; + var cy = centreSlope.y * zm; + var radius = (z1 - z0) * 0.5f * axis + z1 * footprintPerDepth + warp; + radius += (abs(cx) + abs(cy) + abs(zm) + radius) * 9.5367431640625e-7f; + return new float4(cx, cy, zm, radius); + } +} diff --git a/packages/cultmath/src/CultMath/math.Interval.cs.meta b/packages/cultmath/src/CultMath/math.Interval.cs.meta new file mode 100644 index 00000000..eb3b76d1 --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Interval.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3eb757caae684b388921e28e3c87ba3a diff --git a/packages/cultmath/src/CultMath/math.Lattice.cs b/packages/cultmath/src/CultMath/math.Lattice.cs new file mode 100644 index 00000000..a3c6ddba --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Lattice.cs @@ -0,0 +1,212 @@ +namespace CultMath; + +public static partial class math +{ + // Weighted lattice cells: a jittered, drifting cellular field whose cells are weighted by how close the cell's + // centre lies to a border of the body diagram (the power diagram of the zone's body span). The public steps are + // the four per-cell rules a tape or a shader composes; weighted_lattice_cells is the loop over them. + + /// The greatest boost accepts: weights span 0.5 to 5, a ratio of 10:1. + public const float LatticeMaxBoost = 4.0f; + + /// The greatest stretch accepts. + public const float LatticeMaxStretch = 2.0f; + + /// The greatest smoothing accepts, in cell units. + public const float LatticeMaxSmoothing = 1.0f; + + /// + /// The outermost ring the search can reach anywhere in the accepted range (see the proof above + /// ). + /// + public const int LatticeMaxRing = 37; + + // A query beyond this many cells from the origin has no integer cell id in float precision. + private const float LatticeMaxCoordinate = 8388608.0f; + + /// + /// The site of a lattice cell: float3(site.xy, base weight). The site is cell + 0.5 + 0.5 sin(drift + /// time + 2 pi u) per axis, so it stays within one cell of the cell's corner and drifts at rate + /// . The base weight is 0.5 + 0.5 u, in [0.5, 1), from its own hash lane. + /// + public static float3 lattice_site(float2 cell, float time, float drift) + { + var h = pcg3d(new int3((int)cell.x, (int)cell.y, 0)); + var phase = new float2(cellular_unit(h.x), cellular_unit(h.y)); + var site = cell + 0.5f + 0.5f * new float2(sin(drift * time + TAU * phase.x), sin(drift * time + TAU * phase.y)); + return new float3(site, 0.5f + 0.5f * cellular_unit(h.z)); + } + + /// + /// The weight of a cell: base (1 + boost exp(-(border / falloff)^2)), where is + /// the distance from the cell's centre to the nearest body-diagram border. + /// + public static float lattice_weight(float @base, float border, float boost, float falloff) + { + var t = border / falloff; + return @base * (1.0f + boost * exp(-(t * t))); + } + + /// + /// The weighted distance from to , in cell units: + /// weight |(stretch a, c)| with a and c the offset's components along and across the unit + /// . Isotropic at stretch 1. + /// + public static float lattice_distance(float2 q, float2 site, float weight, float2 normal, float stretch) + { + var v = site - q; + var a = dot(v, normal); + var c = v.x * normal.y - v.y * normal.x; + return weight * length(new float2(stretch * a, c)); + } + + /// + /// One step of the smooth minimum fold: folded with distance , for a + /// nearest distance . A distance of at least f1 + 2 smoothing leaves + /// unchanged, and the result never exceeds f1 + smoothing. Start the fold at + /// f1 + smoothing and visit every cell once, in an order that does not depend on the search box. + /// + public static float lattice_smooth_step(float m, float d, float f1, float smoothing) + { + if (d >= f1 + 2.0f * smoothing) + return m; + var h = smoothstep(0.0f, 1.0f, 0.5f + 0.5f * (m - d) / smoothing); + var next = m + (d - m) * h - h * (1.0f - h) * smoothing / (1.0f + 3.0f * smoothing); + return min(next, f1 + smoothing); + } + + // Proof that the ring search finds every cell that can change an output (ruling lattice-ring-exit-sound). + // + // Let c0 = floor(q) and let a cell lie on Chebyshev ring k around c0 (an offset of k on some axis). Its site lies + // within [cell, cell + 1] per axis and q within [c0, c0 + 1), so on that axis |site - q| >= k - 1. The length of + // the offset is at least that, the stretch is at least 1 (it only lengthens), and the weight is at least + // 0.5 (base >= 0.5, boost >= 0). So every cell on ring k or beyond has d >= 0.5 (k - 1), and the same holds for + // every farther ring. + // + // A cell with d >= F2 changes neither F1 nor F2, and a cell with d >= F1 + 2 smoothing leaves the smooth minimum + // unchanged (lattice_smooth_step returns m before folding it). So the search stops before ring k once + // 0.5 (k - 1) >= max(F2, F1 + 2 smoothing), with F1 and F2 taken over the rings visited. Those values only fall + // as rings are added, so the running cutoff is at least the final one: stopping on it never stops early. Every + // unvisited cell then changes no output, for every weight, stretch and drift. + // + // The loop terminates inside the accepted range. Cell c0 gives a distance below sqrt(2) in cell units. The + // neighbour on the nearer side of the axis whose query fraction sits closest to a cell boundary (fraction m <= 1/2) + // lies within (1 + m, 1) per axis, below sqrt(3.25). Weights are below 1 + LatticeMaxBoost and stretch is at most + // LatticeMaxStretch, so F2 < 10 sqrt(3.25) = 18.03 and F1 + 2 smoothing < 10 sqrt(2) + 2 = 16.2. The exit holds at + // 0.5 (k - 1) >= 18.03, that is at k = 38, so rings 0 to 37 (LatticeMaxRing) are the most visited. + // + // The result does not depend on the box visited. The second pass folds F1, F2 and the winning id in absolute + // row-major order (strict <, so an exact tie keeps the earlier cell), and the smooth minimum starts at + // F1 + smoothing and is clamped to it, so a cell with d >= F1 + 2 smoothing, visited or not, changes nothing. + + /// + /// Weighted cellular noise over a jittered lattice: float4(F1, F2, smooth, id). F1 and F2 are the two + /// smallest weighted distances from in cell units times weight, smooth is the smooth minimum + /// (, in the same units), and id is a hash of the winning cell in [0, 1). + /// + /// + /// A cell's weight is of the exact power border distance () + /// of the cell's centre in the body span (float4(position.xyz, sigma), z = 0), so it is + /// continuous as the bodies move. Distances are stretched by along + /// (isotropic at 1). The search is exact in the accepted range: boost 0 to + /// , stretch 1 to , smoothing up to . + /// + /// An argument is not finite, a size is not above zero, a value is outside its range, the normal is zero while stretch exceeds 1, or the body span is refused as refuses it. + public static float4 weighted_lattice_cells( + float2 p, float time, ReadOnlySpan bodies, float cellSize, float drift, float boost, float falloff, + float smoothing, float2 stretchNormal, float stretch) + { + // Cell centres stay finite: the farthest one the search can reach is a ring past the query's cell. + var reachSpan = cellSize * (LatticeMaxRing + 2); + if (!float.IsFinite(cellSize) || !(cellSize > 0.0f) || !float.IsFinite(reachSpan)) + throw new ArgumentException("cellSize must be finite and greater than zero, and small enough for its cell centres to be finite.", nameof(cellSize)); + if (!float.IsFinite(p.x) || !float.IsFinite(p.y) || !(abs(p.x / cellSize) < LatticeMaxCoordinate) || !(abs(p.y / cellSize) < LatticeMaxCoordinate) + || !float.IsFinite(abs(p.x) + reachSpan) || !float.IsFinite(abs(p.y) + reachSpan)) + throw new ArgumentException("p must be finite and within 2^23 cells of the origin.", nameof(p)); + if (!float.IsFinite(time)) + throw new ArgumentException("time must be finite.", nameof(time)); + if (!float.IsFinite(drift)) + throw new ArgumentException("drift must be finite.", nameof(drift)); + if (!float.IsFinite(drift * time)) + throw new ArgumentException("drift times time must be finite.", nameof(drift)); + if (!float.IsFinite(boost) || boost < 0.0f || boost > LatticeMaxBoost) + throw new ArgumentException("boost must be within [0, LatticeMaxBoost].", nameof(boost)); + if (!float.IsFinite(falloff) || !(falloff > 0.0f)) + throw new ArgumentException("falloff must be finite and greater than zero.", nameof(falloff)); + if (!float.IsFinite(smoothing) || !(smoothing > 0.0f) || smoothing > LatticeMaxSmoothing) + throw new ArgumentException("smoothing must be within (0, LatticeMaxSmoothing].", nameof(smoothing)); + if (!float.IsFinite(stretch) || stretch < 1.0f || stretch > LatticeMaxStretch) + throw new ArgumentException("stretch must be within [1, LatticeMaxStretch].", nameof(stretch)); + if (!float.IsFinite(stretchNormal.x) || !float.IsFinite(stretchNormal.y)) + throw new ArgumentException("stretchNormal must be finite.", nameof(stretchNormal)); + // Scaled by its largest component first, so a tiny or huge normal normalises to unit length. + var scale = max(abs(stretchNormal.x), abs(stretchNormal.y)); + if (scale > 0.0f) + { + stretchNormal /= scale; + stretchNormal /= length(stretchNormal); + } + else if (stretch > 1.0f) + throw new ArgumentException("stretchNormal must not be zero while stretch exceeds 1.", nameof(stretchNormal)); + else + stretchNormal = new float2(1.0f, 0.0f); + require_cell_span(new float3(p, 0.0f), bodies, positiveWeights: false, nameof(bodies)); + + const int Width = 2 * LatticeMaxRing + 1; + Span cache = stackalloc float[Width * Width]; + var q = p / cellSize; + var origin = floor(q); + var cx0 = (int)origin.x; + var cz0 = (int)origin.y; + var f1 = 1.0e30f; + var f2 = 1.0e30f; + var reach = 0; + + for (var k = 0; ; k++) + { + if (k > 1 && 0.5f * (k - 1) >= max(f2, f1 + 2.0f * smoothing)) + break; + if (k > LatticeMaxRing) + throw new InvalidOperationException("The lattice ring search left its proven range."); + for (var dz = -k; dz <= k; dz++) + { + var step = dz == -k || dz == k || k == 0 ? 1 : 2 * k; + for (var dx = -k; dx <= k; dx += step) + { + var d = lattice_cell_distance(q, new float2(cx0 + dx, cz0 + dz), time, drift, bodies, cellSize, boost, falloff, stretchNormal, stretch); + cache[(dz + LatticeMaxRing) * Width + dx + LatticeMaxRing] = d; + if (d < f1) { f2 = f1; f1 = d; } + else if (d < f2) f2 = d; + } + } + reach = k; + } + + var m = f1 + smoothing; + var best = 1.0e30f; + var second = 1.0e30f; + var winDx = 0; + var winDz = 0; + for (var dz = -reach; dz <= reach; dz++) + for (var dx = -reach; dx <= reach; dx++) + { + var d = cache[(dz + LatticeMaxRing) * Width + dx + LatticeMaxRing]; + if (d < best) { second = best; best = d; winDx = dx; winDz = dz; } + else if (d < second) second = d; + m = lattice_smooth_step(m, d, f1, smoothing); + } + + var id = pcg4d(new int4(cx0 + winDx, cz0 + winDz, 0, 0)); + return new float4(best, second, m, cellular_unit(id.w)); + } + + internal static float lattice_cell_distance( + float2 q, float2 cell, float time, float drift, ReadOnlySpan bodies, float cellSize, float boost, float falloff, + float2 normal, float stretch) + { + var site = lattice_site(cell, time, drift); + var centre = (cell + 0.5f) * cellSize; + var border = power_border_unchecked(new float3(centre, 0.0f), bodies).w; + return lattice_distance(q, site.xy, lattice_weight(site.z, border, boost, falloff), normal, stretch); + } +} diff --git a/packages/cultmath/src/CultMath/math.Lattice.cs.meta b/packages/cultmath/src/CultMath/math.Lattice.cs.meta new file mode 100644 index 00000000..a4f24ecd --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Lattice.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0a182e056c8c4258881c347ead6d571d diff --git a/packages/cultmath/src/CultMath/math.Phacelle.cs b/packages/cultmath/src/CultMath/math.Phacelle.cs new file mode 100644 index 00000000..25689737 --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Phacelle.cs @@ -0,0 +1,127 @@ +// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of +// the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. +// +// Phacelle noise. Copyright (c) 2025 Rune Skovbo Johansen (Shadertoy t3dyWl; MPL-2.0), read from the +// C# port PhacelleNoise in lpmitchell/AdvancedTerrainErosion, converted to burstable C# by Luke +// Mitchell (2026). Modified by GameCult: 3D cells, a caller-supplied stripe wave vector, an exact +// gradient and exact pruning. This file and CultPhasor.cs are the MPL-2.0 files of CultMath; the +// rest of the package is MIT (see THIRD-PARTY-NOTICES.md). + +namespace CultMath; + +public static partial class math +{ + // Johansen's Phacelle noise (phase + cell), generalised to 3D cells with a caller-supplied + // stripe wave vector. Each of the 4x4x4 cells around p carries one jittered feature point + // (jitter in [-0.5, 0.5) per axis, from pcg3d over the integer cell coordinate, the same + // integer-hashing rule as cellular) and one cosine/sine wave that runs along `side` (the wave + // vector: its length is 2*pi times the stripe frequency, and the caller chooses which + // perpendicular it is; on a unit sphere that is cross(p_hat, flow)). The waves are blended with + // the bell weight max(0, exp(-2 d^2) - 0.01111) (exactly 0 at distance 1.5, the nearest a + // feature outside the 4x4x4 block can be in 2D, which is what keeps cell-grid lines out), and + // the blended phasor is normalized: its length is stretched to 1 wherever the raw length is at + // least 1 - normalization, and scaled by 1 / (1 - normalization) below that. `offset` is the + // phase in cycles (1 is a full turn). Value and normalization follow Johansen's + // PhacelleNoise as ported in lpmitchell/AdvancedTerrainErosion. + // + // `normalization` is meant to lie in [0, 1]. At 0 the output is the raw blend (a phasor of + // length at most 1); at 1 the floor is 0 and every output is stretched to length 1. Values of + // 1 or more saturate at that (the floor is never above the raw length), and a negative value + // scales every output down by 1 / (1 - normalization) < 1. The normalized gradient scales as + // 1 / |I| where I is the blended phasor (below), so it grows wherever the blend nearly + // cancels; a normalization near 1 lets that happen at every point. + // + // The gradient is exact: it carries the weight derivative (grad w = -4 v exp(-2 |v|^2) where + // w > 0) and the normalization, not upstream's convention grad(cos) ~ -sin * side, which + // ignores the weight gradient (Asura probe: 16.8 deg off at the median, 97.8 at the 95th + // percentile; the exact form is 0.00 and 0.03). With P = sum(w * (cos, sin)) and W = sum(w), + // I = P / W has grad I = (grad P - I * grad W) / W; above the threshold the output is I / |I| + // with gradient (grad I - out * grad|I|) / |I|, below it grad I / (1 - normalization). The + // value is continuous at both seams below; the gradient is not. + // * Where |I| crosses the threshold, the gradient jumps between the two branches. + // * Where a cell's weight leaves its support (d^2 = ln(1 / 0.01111) / 2 = 2.24995, distance + // 1.49998), grad w jumps from -4 * 0.01111 * v to 0: a per-cell jump of length + // 0.0444 * |v|, 0.0667 at |v| = 1.5. Measured over random points, the resulting jump in + // the output gradient is a median 1.5% of its length and at most about 27%. + // + // W is the sum of 64 weights and is positive for every input pcg3d produces (the smallest + // W found by hill-climbing the hash-driven cell contents is 0.056). It is 0, and the output + // NaN, only if all 64 weights vanish, which takes adversarial jitter no hash yields. + // + // Pruning is exact: per axis, |local - g| - 0.5 (floored at 0) lower-bounds |v| for any jitter, + // so a cell whose summed square is at least 2.25 lies outside the support (2.24995 < 2.25) and + // has weight exactly 0: it contributes nothing to any sum. Cells whose bound sits just under + // 2.25 can still have a nonzero weight, so the cut cannot be lowered. On average the prune + // keeps about 45 of the 64 cells (a saving of about 30%); only about 14 have a nonzero weight. + // Only the internal overload can switch the prune off; PhacelleTests uses it to pin bit equality. + public static CultPhasor phacelle(float3 p, float3 side, float offset, float normalization) => + phacelle(p, side, offset, normalization, true); + + internal static CultPhasor phacelle(float3 p, float3 side, float offset, float normalization, bool prune) + { + var cell = floor(p); + var local = p - cell; + var phaseOffset = offset * TAU; + var sumW = 0.0f; + var sumCos = 0.0f; + var sumSin = 0.0f; + var gradW = new float3(0.0f, 0.0f, 0.0f); + var gradCos = new float3(0.0f, 0.0f, 0.0f); + var gradSin = new float3(0.0f, 0.0f, 0.0f); + + for (var dz = -1; dz <= 2; dz++) + { + var gz = max(0.0f, abs(local.z - (float)dz) - 0.5f); + for (var dy = -1; dy <= 2; dy++) + { + var gy = max(0.0f, abs(local.y - (float)dy) - 0.5f); + for (var dx = -1; dx <= 2; dx++) + { + var gx = max(0.0f, abs(local.x - (float)dx) - 0.5f); + if (prune && gx * gx + gy * gy + gz * gz >= 2.25f) + continue; + + var gridStep = new float3(dx, dy, dz); + var hash = pcg3d(int3(cell + gridStep)); + var jitter = new float3(cellular_unit(hash.x) - 0.5f, cellular_unit(hash.y) - 0.5f, cellular_unit(hash.z) - 0.5f); + var v = local - gridStep - jitter; + var falloff = exp(-2.0f * dot(v, v)); + var w = max(0.0f, falloff - 0.01111f); + var dw = w > 0.0f ? (-4.0f * falloff) * v : new float3(0.0f, 0.0f, 0.0f); + var phase = dot(v, side) + phaseOffset; + var c = cos(phase); + var s = sin(phase); + + sumW += w; + sumCos += w * c; + sumSin += w * s; + gradW += dw; + gradCos += dw * c - (w * s) * side; + gradSin += dw * s + (w * c) * side; + } + } + } + + var invW = 1.0f / sumW; + var rawCos = sumCos * invW; + var rawSin = sumSin * invW; + var gradRawCos = (gradCos - rawCos * gradW) * invW; + var gradRawSin = (gradSin - rawSin * gradW) * invW; + var rawLength = sqrt(rawCos * rawCos + rawSin * rawSin); + var floorLength = 1.0f - normalization; + + if (rawLength > floorLength) + { + var outCos = rawCos / rawLength; + var outSin = rawSin / rawLength; + var gradLength = (rawCos * gradRawCos + rawSin * gradRawSin) / rawLength; + return new CultPhasor( + new float4((gradRawCos - outCos * gradLength) / rawLength, outCos), + new float4((gradRawSin - outSin * gradLength) / rawLength, outSin)); + } + + return new CultPhasor( + new float4(gradRawCos / floorLength, rawCos / floorLength), + new float4(gradRawSin / floorLength, rawSin / floorLength)); + } +} diff --git a/packages/cultmath/src/CultMath/math.Phacelle.cs.meta b/packages/cultmath/src/CultMath/math.Phacelle.cs.meta new file mode 100644 index 00000000..898abc4c --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Phacelle.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2c9d4e6b1a8f47d3b05e7a3c9d1f8e26 diff --git a/packages/cultmath/src/CultMath/math.Sites.cs b/packages/cultmath/src/CultMath/math.Sites.cs new file mode 100644 index 00000000..a5a4937b --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Sites.cs @@ -0,0 +1,209 @@ +namespace CultMath; + +public static partial class math +{ + // Sites: the model page's span element float4(position.xyz, weight). A span function is a C# loop over + // a per-site step that has a shader twin (site_cells_empty, then site_cells_insert per site); a shader + // cannot take a span, so shader callers write the same loop over their own buffer. One fold, one rule. + + // Power score of a site: value |p - s|^2 - w^2, gradient 2 (p - s). The cell of a site is the intersection + // of the half-spaces bounded by its radical planes against every other site (power_border_step). + public static float4 power_score(float3 p, float4 site) + { + var offset = p - site.xyz; + return new float4(offset * 2.0f, dot(offset, offset) - site.w * site.w); + } + + // Multiplicative score of a site: value |p - s| / w, gradient (p - s) / (|p - s| w). At p = s the + // gradient is zero, cellular's degenerate-gradient convention. + public static float4 multiplicative_score(float3 p, float4 site) + { + var offset = p - site.xyz; + var r = length(offset); + var gradient = r > 0.0f ? offset / (r * site.w) : new float3(0.0f, 0.0f, 0.0f); + return new float4(gradient, r / site.w); + } + + // The fold's identity: no site yet. 1.0e30 is cellular's sentinel (GLSL ES has no inf literal). + public static CultSiteCells site_cells_empty() => + new(new float4(0.0f, 0.0f, 0.0f, 1.0e30f), new float4(0.0f, 0.0f, 0.0f, 1.0e30f), -1.0f, -1.0f); + + // One fold step. Strict < against F1 (the old F1 moves to second), else strict < against F2, so an exact + // tie keeps the earlier index first. + public static CultSiteCells site_cells_insert(CultSiteCells cells, float4 score, int index) + { + var result = cells; + if (score.w < cells.nearest.w) + { + result.second = cells.nearest; + result.secondSite = cells.nearestSite; + result.nearest = score; + result.nearestSite = (float)index; + } + else if (score.w < cells.second.w) + { + result.second = score; + result.secondSite = (float)index; + } + + return result; + } + + // float4(unit normal, distance) of the bisector of the two lowest scores: n = grad F2 - grad F1, distance + // (F2 - F1) / |n|, normal n / |n| (into the nearest site's cell). First order, for either metric. It is NOT + // the distance to the nearest site's cell boundary, which the second-lowest score does not give in general; + // for power scores that is power_border. (0, 0, 0, 1.0e30) when there is no second site or |n| = 0. + public static float4 site_cells_border(CultSiteCells cells) + { + var n = cells.second.xyz - cells.nearest.xyz; + var len = length(n); + if (cells.secondSite < 0.0f || len <= 0.0f) + return new float4(0.0f, 0.0f, 0.0f, 1.0e30f); + return new float4(n / len, (cells.second.w - cells.nearest.w) / len); + } + + // One step of the exact power cell border. owner is the site whose cell p lies in (the fold's nearest); + // other is another site. The radical plane of the pair is {x : |x - s1|^2 - w1^2 = |x - s2|^2 - w2^2}; + // with d = s2 - s1 the signed distance from p to it, positive on the owner's side, is + // ((s1 - p).d + (|d|^2 + w1^2 - w2^2) / 2) / |d|. It is built from the offset s1 - p and the weight + // difference (w1 - w2)(w1 + w2), never from a difference of two large squared distances, so it does not + // cancel for a far query or close sites. border is the running (unit normal toward the owner, distance), + // starting at (0, 0, 0, 1.0e30): the cell's boundary distance is the least plane distance over every other + // site. A site coincident with the owner has no plane and leaves border unchanged. The step trusts the caller's + // owner: a p outside the owner's cell has a negative signed distance to some plane, which is clamped to 0, so the + // step reports distance 0 with that plane's normal, a plausible on-the-border answer, not an error. + public static float4 power_border_step(float3 p, float4 owner, float4 other, float4 border) + { + var d = other.xyz - owner.xyz; + var len = length(d); + if (len <= 0.0f) + return border; + var plane = max((dot(owner.xyz - p, d) + 0.5f * (dot(d, d) + (owner.w - other.w) * (owner.w + other.w))) / len, 0.0f); + return plane < border.w ? new float4(-d / len, plane) : border; + } + + // Gabriel margin of the pair (a, b) against a third site: (|other - mid| - r) / r with mid = (a + b) / 2 + // and r = |a - b| / 2. 0 on the diameter circle, negative inside it, -1 when a and b coincide. + public static float gabriel_margin(float3 a, float3 b, float3 other) + { + var r = distance(a, b) * 0.5f; + if (r <= 0.0f) + return -1.0f; + return (distance(other, (a + b) * 0.5f) - r) / r; + } + + // Index floats hold integers exactly up to 2^24, so a longer span is refused. + private const int MaxSiteSpan = 1 << 24; + + private static bool all_finite(float3 v) => float.IsFinite(v.x) && float.IsFinite(v.y) && float.IsFinite(v.z); + + // The one validation of a cell span: finite query, finite positions and weights, weights above zero when + // positiveWeights, at most 2^24 sites. Messages name the parameter, never a value. + private static void require_cell_span(float3 p, ReadOnlySpan sites, bool positiveWeights, string spanName = "sites") + { + if (!all_finite(p)) + throw new ArgumentException("The query point must be finite.", nameof(p)); + if (sites.Length > MaxSiteSpan) + throw new ArgumentException("A site span holds at most 2^24 sites.", spanName); + for (var i = 0; i < sites.Length; i++) + { + if (!all_finite(sites[i].xyz)) + throw new ArgumentException("Site positions must be finite.", spanName); + if (!float.IsFinite(sites[i].w) || (positiveWeights && !(sites[i].w > 0.0f))) + throw new ArgumentException(positiveWeights ? "Site weights must be finite and greater than zero." : "Site weights must be finite.", spanName); + } + } + + /// + /// The two nearest sites of by (the power diagram), every + /// site visited. A site is float4(position.xyz, weight); use z = 0 for 2D. Ties keep the lower index first. + /// + /// The query or a site position or weight is not finite, or the span holds more than 2^24 sites. + public static CultSiteCells power_cells(float3 p, ReadOnlySpan sites) + { + require_cell_span(p, sites, positiveWeights: false); + return power_cells_unchecked(p, sites); + } + + private static CultSiteCells power_cells_unchecked(float3 p, ReadOnlySpan sites) + { + var cells = site_cells_empty(); + for (var i = 0; i < sites.Length; i++) + cells = site_cells_insert(cells, power_score(p, sites[i]), i); + return cells; + } + + /// + /// The exact distance from to the boundary of its power cell, and the unit normal of the + /// nearest boundary plane pointing into the cell: float4(normal, distance). The cell is the + /// intersection of the half-spaces bounded by the radical planes against every other site, so the distance is + /// the least over them. A site coincident with the owner has no plane; a cell + /// with no bounding plane (one site, or only coincident ones) gives (0, 0, 0, 1.0e30). + /// + /// As . + public static float4 power_border(float3 p, ReadOnlySpan sites) + { + require_cell_span(p, sites, positiveWeights: false); + return power_border_unchecked(p, sites); + } + + // The border over an already validated span, which the lattice calls once per cell. + private static float4 power_border_unchecked(float3 p, ReadOnlySpan sites) + { + var border = new float4(0.0f, 0.0f, 0.0f, 1.0e30f); + var owner = (int)power_cells_unchecked(p, sites).nearestSite; + if (owner < 0) + return border; + for (var k = 0; k < sites.Length; k++) + if (k != owner) + border = power_border_step(p, sites[owner], sites[k], border); + return border; + } + + /// + /// The two nearest sites of by (distance divided by + /// weight), every site visited. A site is float4(position.xyz, weight); use z = 0 for 2D. + /// + /// The query or a site position is not finite, a weight is not finite and greater than zero, or the span holds more than 2^24 sites. + public static CultSiteCells multiplicative_cells(float3 p, ReadOnlySpan sites) + { + require_cell_span(p, sites, positiveWeights: true); + var cells = site_cells_empty(); + for (var i = 0; i < sites.Length; i++) + cells = site_cells_insert(cells, multiplicative_score(p, sites[i]), i); + return cells; + } + + /// + /// Whether sites and are neighbours in the Gabriel graph + /// of (positions only; weights are ignored): smoothstep(-softness, softness, the + /// least over every other site). 1 when no other site exists. + /// + /// An index is outside the span. + /// The indices are equal, softness is not finite and greater than zero, or a site position is not finite. + public static float soft_gabriel_gate(ReadOnlySpan sites, int first, int second, float softness) + { + if (first < 0 || first >= sites.Length) + throw new ArgumentOutOfRangeException(nameof(first), "Index is outside the site span."); + if (second < 0 || second >= sites.Length) + throw new ArgumentOutOfRangeException(nameof(second), "Index is outside the site span."); + if (first == second) + throw new ArgumentException("The two indices must differ.", nameof(second)); + if (!(float.IsFinite(softness) && softness > 0.0f)) + throw new ArgumentException("Softness must be finite and greater than zero.", nameof(softness)); + + for (var k = 0; k < sites.Length; k++) + if (!all_finite(sites[k].xyz)) + throw new ArgumentException("Site positions must be finite.", nameof(sites)); + + var margin = float.PositiveInfinity; + for (var k = 0; k < sites.Length; k++) + { + if (k == first || k == second) + continue; + margin = min(margin, gabriel_margin(sites[first].xyz, sites[second].xyz, sites[k].xyz)); + } + + return smoothstep(-softness, softness, margin); + } +} diff --git a/packages/cultmath/src/CultMath/math.Sites.cs.meta b/packages/cultmath/src/CultMath/math.Sites.cs.meta new file mode 100644 index 00000000..f9956189 --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Sites.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 856a5e425b6b45f4a8b3e9a8cd32fe38 diff --git a/packages/cultmath/src/CultMath/math.Span.cs b/packages/cultmath/src/CultMath/math.Span.cs new file mode 100644 index 00000000..410b1aa3 --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Span.cs @@ -0,0 +1,276 @@ +namespace CultMath; + +public static partial class math +{ + // An upper bound on the operator norm of the third-derivative tensor of snoise(float3): + // max over unit u of |D^3 snoise(p)[u, u, u]|, the next order after SNOISE_LIPSCHITZ (gradient) + // and SNOISE_HESSIAN (curvature). Provenance: NoiseBoundTests.MeasureThird (slow, explicit) takes + // the largest such norm over 1e6 seeded points of [-256, 256]^3 of the closed-form tensor (snoise_hessian's + // per-corner derivation differentiated once more, in double, with the kernel's lattice, tie order and + // hash; NoiseBoundTests.ThirdTensorMatchesDifferencesOfTheHessian pins it against differences of the + // double Hessian), then an ascent over unit vectors for the tensor's operator norm, refines the 1e4 + // largest by ascent over the point, and multiplies the maximum by 1.10; it prints the witness start. + // NoiseBoundTests.ThirdConstantPinsSampled pins the value against a fast re-measure and the ascent + // from that witness. Measured on the tied kernel (snoise_grad's order), not on any pre-tie splice: + // refined maximum 487.0917, a dense sweep of 20,000 directions at the witness's ascent end found + // 99.9987% of the tensor norm there. The inner maximisation is a local ascent and the outer a sampled + // search refined by ascent: empirical with a margin, not a proof. A change to the snoise kernel must + // re-run MeasureThird and re-pin it. + public const float SNOISE_THIRD = 535.8009f; + + // Analytic Hessian of snoise(float3): the symmetric matrix of second partial derivatives, same + // lattice, hash and tie order as snoise_grad, whose kernel it differentiates once more. Every local + // up through p0..p3 and x0..x3 is snoise_grad's own derivation verbatim. Per corner, with + // m = max(0.5 - dot(x,x), 0) and s = dot(p,x), the corner's gradient is -8 m^3 s x + m^4 p, so + // d/dx_j of its i-th component is 48 m^2 s x_i x_j - 8 m^3 (p_j x_i + p_i x_j + s delta_ij) (the + // derivative of m^3 is -6 m^2 x_j, of s is p_j); summed over the four corners and scaled by the + // same 105. A clamped corner (m = 0) contributes nothing, and the m^2 and m^3 factors make the + // contribution vanish continuously as it clamps. Each off-diagonal entry is computed once and + // placed twice, so the matrix is its own transpose bit for bit. A float3x3 is built from its nine + // scalars, which the GLSL lowering reads as columns and HLSL as rows: the matrix is symmetric. + public static float3x3 snoise_hessian(float3 value) + { + const float cx = 1.0f / 6.0f; + const float cy = 1.0f / 3.0f; + var i = floor(value + dot(value, new float3(cy, cy, cy))); + var x0 = value - i + dot(i, new float3(cx, cx, cx)); + var g = new float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0f - step(x0.z, x0.x)); + var l = 1.0f - g; + var lzxy = new float3(l.z, l.x, l.y); + var i1 = min(g, lzxy); + var i2 = max(g, lzxy); + var x1 = x0 - i1 + cx; + var x2 = x0 - i2 + cy; + var x3 = x0 - 0.5f; + + i = snoise_mod289(i); + var p = snoise_permute(snoise_permute(snoise_permute( + i.z + new float4(0.0f, i1.z, i2.z, 1.0f)) + i.y + new float4(0.0f, i1.y, i2.y, 1.0f)) + i.x + new float4(0.0f, i1.x, i2.x, 1.0f)); + + const float n = 0.142857142857f; + var ns = new float3(2.0f * n, 0.5f * n - 1.0f, n); + var j = p - 49.0f * floor(p * ns.z * ns.z); + var xs = floor(j * ns.z); + var ys = floor(j - 7.0f * xs); + var x = xs * ns.x + ns.y; + var y = ys * ns.x + ns.y; + var h = 1.0f - abs(x) - abs(y); + + var b0 = new float4(x.x, x.y, y.x, y.y); + var b1 = new float4(x.z, x.w, y.z, y.w); + var s0 = floor(b0) * 2.0f + 1.0f; + var s1 = floor(b1) * 2.0f + 1.0f; + var sh = -step(h, 0.0f); + var a0 = new float4(b0.x, b0.z, b0.y, b0.w) + new float4(s0.x, s0.z, s0.y, s0.w) * new float4(sh.x, sh.x, sh.y, sh.y); + var a1 = new float4(b1.x, b1.z, b1.y, b1.w) + new float4(s1.x, s1.z, s1.y, s1.w) * new float4(sh.z, sh.z, sh.w, sh.w); + + var p0 = new float3(a0.x, a0.y, h.x); + var p1 = new float3(a0.z, a0.w, h.y); + var p2 = new float3(a1.x, a1.y, h.z); + var p3 = new float3(a1.z, a1.w, h.w); + var norm = 1.79284291400159f - 0.85373472095314f * new float4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + var m0 = max(0.5f - new float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0f); + var m2 = m0 * m0; + var m3 = m2 * m0; + var px = new float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)); + var wide = 48.0f * m2 * px; + var narrow = 8.0f * m3; + + // One component of every corner's x and p per register. + var cxx = new float4(x0.x, x1.x, x2.x, x3.x); + var cxy = new float4(x0.y, x1.y, x2.y, x3.y); + var cxz = new float4(x0.z, x1.z, x2.z, x3.z); + var cpx = new float4(p0.x, p1.x, p2.x, p3.x); + var cpy = new float4(p0.y, p1.y, p2.y, p3.y); + var cpz = new float4(p0.z, p1.z, p2.z, p3.z); + + var hxx = 105.0f * (dot(wide * cxx, cxx) - dot(narrow, 2.0f * cpx * cxx + px)); + var hyy = 105.0f * (dot(wide * cxy, cxy) - dot(narrow, 2.0f * cpy * cxy + px)); + var hzz = 105.0f * (dot(wide * cxz, cxz) - dot(narrow, 2.0f * cpz * cxz + px)); + var hxy = 105.0f * (dot(wide * cxx, cxy) - dot(narrow, cpx * cxy + cpy * cxx)); + var hxz = 105.0f * (dot(wide * cxx, cxz) - dot(narrow, cpx * cxz + cpz * cxx)); + var hyz = 105.0f * (dot(wide * cxy, cxz) - dot(narrow, cpy * cxz + cpz * cxy)); + return new float3x3(hxx, hxy, hxz, hxy, hyy, hyz, hxz, hyz, hzz); + } + + // The integral over [t0, t1] of clamp(a + b t, lo, hi) dt, in closed form. The line meets lo at + // (lo - a) / b and hi at (hi - a) / b; the span is cut at those two crossings into the stretch held + // at the bound the line starts beyond, the stretch on the ramp (a trapezoid: its length times the + // line's value at the stretch's midpoint), and the stretch held at the far bound. b = 0 is the + // constant clamp(a, lo, hi); t1 < t0 is the negative of the integral over [t1, t0]; lo above hi + // clamps to hi everywhere, as clamp does, and is normalised (lo = min(lo, hi)) before anything reads it, + // so no clamp ever sees lo above hi (GLSL leaves that undefined). A crossing that overflows (b tiny) lies past the span and + // cuts nothing. A held stretch contributes only when its length is positive, so an infinite bound + // (relu has hi = +inf) times a zero length never forms: the integral of a ramp clamped on one side + // only is finite. + public static float integral_clamp_linear(float a, float b, float lo, float hi, float t0, float t1) + { + lo = min(lo, hi); + if (b == 0.0f) + return t1 != t0 ? clamp(a, lo, hi) * (t1 - t0) : 0.0f; + + var direction = t1 < t0 ? -1.0f : 1.0f; + var start = min(t0, t1); + var stop = max(t0, t1); + var atLo = (lo - a) / b; + var atHi = (hi - a) / b; + var enter = clamp(min(atLo, atHi), start, stop); + var leave = clamp(max(atLo, atHi), start, stop); + var before = b > 0.0f ? lo : hi; + var after = b > 0.0f ? hi : lo; + var held = enter > start ? before * (enter - start) : 0.0f; + var kept = stop > leave ? after * (stop - leave) : 0.0f; + var total = held + (a + b * (0.5f * (enter + leave))) * (leave - enter) + kept; + return direction * total; + } + + private static float span_frobenius(float3x3 m) => + sqrt(m._m00 * m._m00 + m._m01 * m._m01 + m._m02 * m._m02 + m._m10 * m._m10 + m._m11 * m._m11 + m._m12 * m._m12 + + m._m20 * m._m20 + m._m21 * m._m21 + m._m22 * m._m22); + + // Plain fbm of snoise over a span: the octave stage of a warp chain, its value and gradient at the + // span's midpoint and the bounds that hold over the whole span. See span_stage for the span, the + // transform and the bound rules. At SpanStage.Identity the field equals fbm_grad(path.midpoint, + // octaves, lacunarity, gain) bit for bit. + public static SpanNoise span_fbm(SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) => + span_stage(false, path, stage, octaves, lacunarity, gain); + + // Ridged fbm over a span: octave o contributes gain^o (1 - |n_o|), ridged_grad's convention. fold + // bounds how far the sum can leave the branch it is on at the midpoint. At SpanStage.Identity the field + // equals ridged_grad bit for bit. + // + // The Span Lab's stage is 1 - 2|n| per octave. With G the sum of gain^o over the octaves (signed: a + // negative gain gives its alternating sum), the lab's value is 2 value - G, and its gradient, + // curvature and fold are twice this one's. A consumer in the lab form applies that mapping and does + // not derive its own bounds. + public static SpanNoise span_ridged(SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) => + span_stage(true, path, stage, octaves, lacunarity, gain); + + // 2^-20 S_o: the rounding one octave's read of the noise carries, S_o being the sum of the magnitudes the + // octave's coordinate is formed from and the span's reach (the allowance paragraph above). The single + // owner of S_o; span_slack turns it into the three allowances. + internal static float span_rounding(float scale, float3 mq, SpanStage stage, float3 step, float nu, float halfLength) => + 9.5367431640625e-7f * (abs(scale) * (csum(abs(mq)) + csum(abs(stage.shift))) + csum(abs(stage.offset)) + csum(abs(step)) + 1.7320508f * nu * halfLength); + + // The allowances (e_n, e_g, e_h) of the value, the gradient's length and the Hessian's Frobenius norm at + // a rounding of 2^-20 S_o: the absolute term of each plus its derivative's pin times the rounding. The + // single owner of the three allowances of a span; af_snoise (math.Affine.cs) forms its own allowance + // from the same SNOISE_READ_VALUE and SNOISE_READ_GRADIENT, the owners of the first two absolute terms, + // so widening either moves every reader of the kernel at once. + internal static float3 span_slack(float rounding) => new( + SNOISE_READ_VALUE + SNOISE_LIPSCHITZ * rounding, + SNOISE_READ_GRADIENT + SNOISE_HESSIAN * rounding, + 9.765625e-4f + SNOISE_THIRD * rounding); + + // The span is SpanPath: q(t), |t| <= halfLength, through midpoint with velocity at t = 0, |q'| <= speed + // and |q''| <= acceleration along it (speed at least |velocity|; all three and halfLength non-negative). + // The transform is SpanStage: octave o samples snoise_grad at x_o(q) = f_o (M q + shift) + offset + + // o octaveStep with f_o = lacunarity^o, amplitude gain^o and M = frequency (I + (1/stretch - 1) a a^T), + // a = normalize(axis); a zero axis, or stretch 1, means no stretch. stretch must be positive and + // finite, and nothing guards it, as nothing guards lacunarity. octaves clamps to [0, 16] as fbm_grad's + // does. The field is the octave sum in q: gradient f_o M grad n_o (M is symmetric), the same octave + // loop as fbm_grad and ridged_grad. + // + // Bounds, per octave, from SNOISE_LIPSCHITZ (L), SNOISE_HESSIAN (H) and SNOISE_THIRD (T) only. With + // |M| = |frequency| max(1, 1/stretch) (1 without stretch) and nu = f_o |M| speed, the noise-space speed: + // * |x(t) - x_mid| <= nu halfLength, so the Hessian of n at x(t) has operator norm at most + // Hl = min(H, ||hessian(x_mid)||_F + e_h + T nu halfLength) (the Hessian is T-Lipschitz in operator + // norm, and the Frobenius norm bounds the operator norm), and |grad n(x(t))| at most + // Gl = min(L, |grad n_mid| + e_g + Hl nu halfLength). + // * curvature = sum gain^o f_o^2 |M|^2 Hl: the Hessian in q of n(x_o(q)) is f_o^2 M H M. + // * fold, ridged only. Over the span the octave's value departs from its midpoint branch + // gain^o (1 - s n) (s the sign of n at the midpoint) only where n has changed sign, and there + // |n(t)| <= V - |n_mid|, V bounding |n(t) - n_mid|. Writing n(t) - n_mid as the integral of + // grad n . x', x' = w + rho with w = f_o M velocity and |rho| <= f_o |M| acceleration |t|, and + // grad n = grad n_mid + delta with |delta| <= Hl nu |t|: + // V = (|grad n_mid . w| + e_g |w|) halfLength + (Hl nu |w| + Gl f_o |M| acceleration) halfLength^2 / 2 + // + 2 e_n, + // and the octave's fold is 2 gain^o max(V - |n_mid|, 0), zero when it cannot reach zero. + // + // The float32 snoise, snoise_grad and snoise_hessian are not the exact functions, and the field a + // consumer reads is the float one, so what is read at the midpoint carries an allowance, by the + // derivation af_snoise's comment gives (math.Affine.cs): the skew and the corner offsets round the + // coordinate by about 2u of the magnitudes it is formed from, which moves a result by its derivative + // times that, and the caller's scaling of the point and a GPU's evaluation take 2u to 16u = 2^-20. + // S_o is the sum of those magnitudes, |f_o| (|M q|_1 + |shift|_1) + |offset|_1 + |o octaveStep|_1, plus + // the span's reach sqrt(3) nu halfLength (the coordinate of a path point); span_rounding is its owner. The + // allowances are the value's e_n = 2^-14 + L 2^-20 S_o, the gradient length's e_g = 2^-12 + H 2^-20 S_o + // (H is the gradient's own derivative's pin) and the Hessian's Frobenius norm's e_h = 2^-10 + T 2^-20 S_o + // (T is the Hessian's derivative's pin): SNOISE_READ_VALUE and SNOISE_READ_GRADIENT (math.Affine.cs) are the + // absolute terms of the first two, 2^-10 the Hessian's; span_slack is the owner of the three. They are observed where they are decided: the coordinate-band + // snoise_grad and snoise_hessian families of glsl-parity.json and SpanAllowanceCoversReadsAlongTheSpan + // check every read against them. Those observations are samples, not bounds: a new seed moves them. What + // they say is that the allowances enclose the error with a margin of about 15. + // No new pin enters. + // + // Domain: no coordinate range is checked, clamped or refused. The allowances grow with S_o, so + // curvature saturates at H (true everywhere) by S_o of about 1.1e5, and fold turns positive for every + // octave whose V + 2 e_n reaches |n_mid|: the bounds stay sound at every magnitude and stop being + // informative where float32 noise is (design.md, Precision domain). + private static SpanNoise span_stage(bool ridged, SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) + { + var q = path.midpoint; + var halfLength = path.halfLength; + octaves = clamp(octaves, 0, 16); + var stretched = dot(stage.axis, stage.axis) > 0.0f && stage.stretch != 1.0f; + var direction = stretched ? normalize(stage.axis) : new float3(0.0f, 0.0f, 0.0f); + var squeeze = stretched ? 1.0f / stage.stretch - 1.0f : 0.0f; + var norm = abs(stage.frequency) * (stretched ? max(1.0f, 1.0f / stage.stretch) : 1.0f); + var mq = stretched ? stage.frequency * (q + squeeze * dot(direction, q) * direction) : stage.frequency * q; + var mv = stretched ? stage.frequency * (path.velocity + squeeze * dot(direction, path.velocity) * direction) : stage.frequency * path.velocity; + var amplitude = 1.0f; + var scale = 1.0f; + var value = 0.0f; + var gradient = new float3(0.0f, 0.0f, 0.0f); + var curvature = 0.0f; + var fold = 0.0f; + for (var i = 0; i < octaves; i++) + { + var step = (float)i * stage.octaveStep; + var x = scale * (mq + stage.shift) + (stage.offset + step); + var n = snoise_grad(x); + var g = new float3(n.x, n.y, n.z); + var mg = stretched ? stage.frequency * (g + squeeze * dot(direction, g) * direction) : stage.frequency * g; + if (ridged) + { + var s = (float)sign(n.w); + value += amplitude * (1.0f - abs(n.w)); + gradient += -amplitude * scale * s * mg; + } + else + { + value += amplitude * n.w; + gradient += amplitude * scale * mg; + } + + var weight = abs(amplitude); + var factor = abs(scale) * norm; + var nu = factor * path.speed; + var rounding = span_rounding(scale, mq, stage, step, nu, halfLength); + var slack = span_slack(rounding); + var valueSlack = slack.x; + var gradientSlack = slack.y; + var hessianSlack = slack.z; + var local = min(SNOISE_HESSIAN, span_frobenius(snoise_hessian(x)) + hessianSlack + SNOISE_THIRD * nu * halfLength); + curvature += weight * factor * factor * local; + if (ridged) + { + var w = scale * mv; + var reach = local * nu * halfLength; + var gl = min(SNOISE_LIPSCHITZ, length(g) + gradientSlack + reach); + var travel = (abs(dot(g, w)) + gradientSlack * length(w)) * halfLength + (local * nu * length(w) + gl * factor * path.acceleration) * (0.5f * halfLength * halfLength) + 2.0f * valueSlack; + fold += 2.0f * weight * max(travel - abs(n.w), 0.0f); + } + + scale *= lacunarity; + amplitude *= gain; + } + + return new SpanNoise(new float4(gradient, value), curvature, fold); + } +} diff --git a/packages/cultmath/src/CultMath/math.Span.cs.meta b/packages/cultmath/src/CultMath/math.Span.cs.meta new file mode 100644 index 00000000..31f6c409 --- /dev/null +++ b/packages/cultmath/src/CultMath/math.Span.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1466848dfbfc420ab4f3f67090944a67 diff --git a/packages/cultmath/src/CultMath/math.cs b/packages/cultmath/src/CultMath/math.cs index ca74857f..0d22dc4c 100644 --- a/packages/cultmath/src/CultMath/math.cs +++ b/packages/cultmath/src/CultMath/math.cs @@ -1,5 +1,10 @@ using System; +// Cut 2a-i fix batch 1: cellular_unit's [0,1) mapping bug (F7) is only reachable from cellular's +// private call sites; this lets CultMath.Tests probe it directly instead of hunting for a hash +// input that happens to land on the bit pattern under test. +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("CultMath.Tests")] + namespace CultMath; public static partial class math @@ -105,6 +110,9 @@ public static partial class math public static float2 frac(float2 value) => value - floor(value); public static float3 frac(float3 value) => value - floor(value); public static float4 frac(float4 value) => value - floor(value); + // dxc has no double Frc: it demotes to float, as it does for exp and lerp. CultMath's double + // overloads keep double precision instead, so frac(double) is x - floor(x) in double. + public static double frac(double value) => value - Math.Floor(value); // dxc lowers float min/max/clamp to DXIL FMin/FMax (saturate to Saturate, defined as FMin(1, FMax(0, x))). // DXIL.rst: FMin(a, b) is a < b ? a : b, FMax(a, b) is a >= b ? a : b, and a NaN operand returns the other. @@ -130,6 +138,11 @@ public static partial class math public static float2 clamp(float2 value, float2 minimum, float2 maximum) => min(max(value, minimum), maximum); public static float3 clamp(float3 value, float3 minimum, float3 maximum) => min(max(value, minimum), maximum); public static float4 clamp(float4 value, float4 minimum, float4 maximum) => min(max(value, minimum), maximum); + // dxc lowers int clamp to IMin(IMax(x, a), b): inverted bounds return b rather than throwing like Math.Clamp. + public static int clamp(int value, int minimum, int maximum) => min(max(value, minimum), maximum); + public static int2 clamp(int2 value, int2 minimum, int2 maximum) => min(max(value, minimum), maximum); + public static int3 clamp(int3 value, int3 minimum, int3 maximum) => min(max(value, minimum), maximum); + public static int4 clamp(int4 value, int4 minimum, int4 maximum) => min(max(value, minimum), maximum); // DXIL Saturate is FMin(1, FMax(0, x)); that operand order, unlike clamp(x, 0, 1), maps -0 to +0. public static float saturate(float value) => min(1.0f, max(0.0f, value)); @@ -205,9 +218,10 @@ public static partial class math public static float distance(float3 left, float3 right) => length(left - right); public static float distance(float4 left, float4 right) => length(left - right); - public static float2 normalize(float2 value) => value / max(length(value), 1.0e-20f); - public static float3 normalize(float3 value) => value / max(length(value), 1.0e-20f); - public static float4 normalize(float4 value) => value / max(length(value), 1.0e-20f); + // dxc lowers normalize(x) to x * Rsqrt(Dot(x, x)), and DXIL Rsqrt is 1 / sqrt(src): a zero vector is 0 * inf = NaN. + public static float2 normalize(float2 value) => value * (1.0f / MathF.Sqrt(dot(value, value))); + public static float3 normalize(float3 value) => value * (1.0f / MathF.Sqrt(dot(value, value))); + public static float4 normalize(float4 value) => value * (1.0f / MathF.Sqrt(dot(value, value))); public static quaternion normalize(quaternion value) { var length = MathF.Sqrt(value.x * value.x + value.y * value.y + value.z * value.z + value.w * value.w); @@ -303,18 +317,41 @@ public static partial class math } public static float distance_to_segment(float2 point, float2 start, float2 end, out float2 closest) + { + closest = segment_closest(point, start, end); + return distance(point, closest); + } + + /// The distance from to the segment -; a degenerate segment is its start. + public static float distance_to_segment(float2 point, float2 start, float2 end) => + distance(point, segment_closest(point, start, end)); + + /// The distance from to the segment -; a degenerate segment is its start. + public static float distance_to_segment(float3 point, float3 start, float3 end) => + distance(point, segment_closest(point, start, end)); + + /// The point of the segment - nearest ; a degenerate segment is its start. + public static float2 segment_closest(float2 point_value, float2 start, float2 end) { var segment = end - start; var segmentLengthSq = lengthsq(segment); if (segmentLengthSq <= 0.0f) - { - closest = start; - return distance(point, start); - } + return start; - var t = saturate(dot(point - start, segment) / segmentLengthSq); - closest = start + segment * t; - return distance(point, closest); + var t = saturate(dot(point_value - start, segment) / segmentLengthSq); + return start + segment * t; + } + + /// The point of the segment - nearest ; a degenerate segment is its start. + public static float3 segment_closest(float3 point_value, float3 start, float3 end) + { + var segment = end - start; + var segmentLengthSq = lengthsq(segment); + if (segmentLengthSq <= 0.0f) + return start; + + var t = saturate(dot(point_value - start, segment) / segmentLengthSq); + return start + segment * t; } public static float catmullrom(float p0, float p1, float p2, float p3, float t) @@ -373,6 +410,44 @@ public static partial class math public static float hash(float2 value) => hash(dot(value, new float2(127.1f, 311.7f))); public static float hash(float3 value) => hash(dot(value, new float3(127.1f, 311.7f, 74.7f))); + public static uint asuint(float value) => (uint)BitConverter.SingleToInt32Bits(value); + public static float asfloat(uint value) => BitConverter.Int32BitsToSingle((int)value); + + // PCG hashes from Jarzynski and Olano, "Hash Functions for GPU Rendering" (JCGT 9(3), 2020). Integer-only, so + // dxc and C# agree bit for bit. pcg3d/pcg4d carry uint bit patterns in int3/int4; float overloads hash IEEE bits. + public static uint pcg(uint value) + { + var state = value * 747796405u + 2891336453u; + var word = ((state >> (int)((state >> 28) + 4)) ^ state) * 277803737u; + return (word >> 22) ^ word; + } + + public static int3 pcg3d(int3 value) + { + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u, z = (uint)value.z * 1664525u + 1013904223u; + x += y * z; y += z * x; z += x * y; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; + x += y * z; y += z * x; z += x * y; + return new int3((int)x, (int)y, (int)z); + } + + // The paper hashes 2 -> N inputs through pcg3d with the unused component held constant. + public static int3 pcg3d(float2 value) => pcg3d(new float3(value, 0.0f)); + public static int3 pcg3d(float3 value) => pcg3d(new int3((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z))); + + public static int4 pcg4d(int4 value) + { + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u; + uint z = (uint)value.z * 1664525u + 1013904223u, w = (uint)value.w * 1664525u + 1013904223u; + x += y * w; y += z * x; z += x * y; w += y * z; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; w ^= w >> 16; + x += y * w; y += z * x; z += x * y; w += y * z; + return new int4((int)x, (int)y, (int)z, (int)w); + } + + public static int4 pcg4d(float4 value) => + pcg4d(new int4((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z), (int)asuint(value.w))); + public static float log(float value) => MathF.Log(value); public static float2 log(float2 value) => new(log(value.x), log(value.y)); public static float3 log(float3 value) => new(log(value.x), log(value.y), log(value.z)); @@ -475,15 +550,91 @@ public static partial class math a._m20 * b._m01 + a._m21 * b._m11 + a._m22 * b._m21, a._m20 * b._m02 + a._m21 * b._m12 + a._m22 * b._m22); + // Abramowitz & Stegun 7.1.26, a single-precision rational/exponential fit with a stated + // max absolute error of 1.5e-7. erf is odd, so only x >= 0 is fit and the sign is restored. + // Measured against an independent reference: worst absolute error 6.621e-7, inside the + // 2e-6 bar this package's tests pin. + public static float erf(float value) + { + const float p = 0.3275911f; + const float a1 = 0.254829592f; + const float a2 = -0.284496736f; + const float a3 = 1.421413741f; + const float a4 = -1.453152027f; + const float a5 = 1.061405429f; + + var s = sign(value); + var x = abs(value); + var t = 1.0f / (1.0f + p * x); + var poly = ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t; + var result = 1.0f - poly * exp(-x * x); + return s * result; + } + + // Giles, "Approximating the erfinv function" (GPU Computing Gems, 2010): a single-precision + // minimax polynomial in two ranges of w = -ln((1-x)(1+x)), central and tail. + // Domain is [-1, 1]. Outside it, including +-infinity, the result is NaN (there is no real + // inverse). At the edges the mathematical limit is infinite: erfinv(1) = +infinity and + // erfinv(-1) = -infinity. The unguarded polynomial hits log(0) = -infinity at those edges and + // the tail branch's leading coefficient is negative, so it delivers the wrong sign; guard the + // edges explicitly instead of trusting the fit through the singularity. + // Measured against an independent reference: worst absolute error 5.066e-7, and the + // erf(erfinv(y)) round trip 6.109e-7 worst case, both inside the 2e-6 bar this package's + // tests pin. + public static float erfinv(float value) + { + if (value >= 1.0f) return value > 1.0f ? float.NaN : float.PositiveInfinity; + if (value <= -1.0f) return value < -1.0f ? float.NaN : float.NegativeInfinity; + + var w = -log((1.0f - value) * (1.0f + value)); + float p; + if (w < 5.0f) + { + w -= 2.5f; + p = 2.81022636e-08f; + p = 3.43273939e-07f + p * w; + p = -3.5233877e-06f + p * w; + p = -4.39150654e-06f + p * w; + p = 0.00021858087f + p * w; + p = -0.00125372503f + p * w; + p = -0.00417768164f + p * w; + p = 0.246640727f + p * w; + p = 1.50140941f + p * w; + } + else + { + w = sqrt(w) - 3.0f; + p = -0.000200214257f; + p = 0.000100950558f + p * w; + p = 0.00134934322f + p * w; + p = -0.00367342844f + p * w; + p = 0.00573950773f + p * w; + p = -0.0076224613f + p * w; + p = 0.00943887047f + p * w; + p = 1.00167406f + p * w; + p = 2.83297682f + p * w; + } + + return p * value; + } + // Ashima Arts / Ian McEwan 3D simplex noise (MIT), mirrored by cultmath_snoise(float3) - // in shaders/CultMath.hlsl with the same float32 evaluation order. + // in shaders/CultMath.hlsl with the same float32 evaluation order. Follows stegu/webgl-noise + // src/noise3D.glsl at 22434e04d7 (kernel radius^2 0.5, scale 105, permute (34x+10)x); see + // THIRD-PARTY-NOTICES.md. Continuous across simplex-cell boundaries + // (NoiseGradTests.SnoiseAndItsGradientAreContinuousAcrossSimplexCellBoundaries). Ties in x0 resolve + // in Gustavson's simplexnoise1234 order (x over y, y over z, x over z), a total order, so the four + // corners are always a simplex; upstream's step is cyclic and degenerates where x0's components are + // equal (NoiseGradTests.SnoiseIsContinuousOnTheSimplexDiagonal). + // SNOISE_LIPSCHITZ (math.Interval.cs) is measured from this kernel: a change here must re-run + // NoiseBoundTests.MeasureLipschitz and re-pin it. public static float snoise(float3 value) { const float cx = 1.0f / 6.0f; const float cy = 1.0f / 3.0f; var i = floor(value + dot(value, new float3(cy, cy, cy))); var x0 = value - i + dot(i, new float3(cx, cx, cx)); - var g = step(new float3(x0.y, x0.z, x0.x), x0); + var g = new float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0f - step(x0.z, x0.x)); var l = 1.0f - g; var lzxy = new float3(l.z, l.x, l.y); var i1 = min(g, lzxy); @@ -523,9 +674,9 @@ public static partial class math p2 *= norm.z; p3 *= norm.w; - var m = max(0.6f - new float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0f); + var m = max(0.5f - new float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0f); m = m * m; - return 42.0f * dot(m * m, new float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); + return 105.0f * dot(m * m, new float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); } // Ashima Arts / Ian McEwan 2D simplex noise, kept component-explicit so @@ -571,8 +722,280 @@ public static partial class math private static float2 snoise_mod289(float2 value) => value - floor(value * (1.0f / 289.0f)) * 289.0f; private static float3 snoise_mod289(float3 value) => value - floor(value * (1.0f / 289.0f)) * 289.0f; private static float4 snoise_mod289(float4 value) => value - floor(value * (1.0f / 289.0f)) * 289.0f; - private static float3 snoise_permute(float3 value) => snoise_mod289(((value * 34.0f) + 1.0f) * value); - private static float4 snoise_permute(float4 value) => snoise_mod289(((value * 34.0f) + 1.0f) * value); + private static float3 snoise_permute(float3 value) => snoise_mod289(((value * 34.0f) + 10.0f) * value); + private static float4 snoise_permute(float4 value) => snoise_mod289(((value * 34.0f) + 10.0f) * value); + + // Analytic gradient of snoise(float3) (invariant 8), following the differentiation in + // webgl-noise src/noise3Dgrad.glsl (Ashima Arts / McEwan, MIT), which uses the same kernel + // radius^2 0.5, permutation (34x+10)x and scale 105 as snoise(float3) (stegu/webgl-noise + // 22434e04d7). Every local up through p0..p3 and x0..x3 below is snoise(float3)'s own derivation + // verbatim, so .w is that same field (NoiseGradTests.SnoiseGradValueIsBitEqualToSnoise pins the + // two bit-equal over a random sweep). Per corner, m0 = max(0.5 - dot(x,x), 0), so dm0/dx = -2x, + // and d(m0^4 * dot(p,x))/dx = 4*m0^3*(-2x)*dot(p,x) + m0^4*p = -8*m0^3*dot(p,x)*x + m0^4*p (p is + // that corner's own gradient constant, independent of x); summed over the four corners and + // scaled by the same 105 as the value. + public static float4 snoise_grad(float3 value) + { + const float cx = 1.0f / 6.0f; + const float cy = 1.0f / 3.0f; + var i = floor(value + dot(value, new float3(cy, cy, cy))); + var x0 = value - i + dot(i, new float3(cx, cx, cx)); + var g = new float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0f - step(x0.z, x0.x)); + var l = 1.0f - g; + var lzxy = new float3(l.z, l.x, l.y); + var i1 = min(g, lzxy); + var i2 = max(g, lzxy); + var x1 = x0 - i1 + cx; + var x2 = x0 - i2 + cy; + var x3 = x0 - 0.5f; + + i = snoise_mod289(i); + var p = snoise_permute(snoise_permute(snoise_permute( + i.z + new float4(0.0f, i1.z, i2.z, 1.0f)) + i.y + new float4(0.0f, i1.y, i2.y, 1.0f)) + i.x + new float4(0.0f, i1.x, i2.x, 1.0f)); + + const float n = 0.142857142857f; + var ns = new float3(2.0f * n, 0.5f * n - 1.0f, n); + var j = p - 49.0f * floor(p * ns.z * ns.z); + var xs = floor(j * ns.z); + var ys = floor(j - 7.0f * xs); + var x = xs * ns.x + ns.y; + var y = ys * ns.x + ns.y; + var h = 1.0f - abs(x) - abs(y); + + var b0 = new float4(x.x, x.y, y.x, y.y); + var b1 = new float4(x.z, x.w, y.z, y.w); + var s0 = floor(b0) * 2.0f + 1.0f; + var s1 = floor(b1) * 2.0f + 1.0f; + var sh = -step(h, 0.0f); + var a0 = new float4(b0.x, b0.z, b0.y, b0.w) + new float4(s0.x, s0.z, s0.y, s0.w) * new float4(sh.x, sh.x, sh.y, sh.y); + var a1 = new float4(b1.x, b1.z, b1.y, b1.w) + new float4(s1.x, s1.z, s1.y, s1.w) * new float4(sh.z, sh.z, sh.w, sh.w); + + var p0 = new float3(a0.x, a0.y, h.x); + var p1 = new float3(a0.z, a0.w, h.y); + var p2 = new float3(a1.x, a1.y, h.z); + var p3 = new float3(a1.z, a1.w, h.w); + var norm = 1.79284291400159f - 0.85373472095314f * new float4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + var m0 = max(0.5f - new float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0f); + var m2 = m0 * m0; + var m3 = m2 * m0; + var m4 = m2 * m2; + + var px = new float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)); + var value2 = 105.0f * dot(m4, px); + var grad = -8.0f * m3.x * x0 * px.x + m4.x * p0 + + -8.0f * m3.y * x1 * px.y + m4.y * p1 + + -8.0f * m3.z * x2 * px.z + m4.z * p2 + + -8.0f * m3.w * x3 * px.w + m4.w * p3; + grad *= 105.0f; + + return new float4(grad, value2); + } + + // Octave sum of snoise_grad (invariant 8). Each octave samples snoise_grad at p scaled by the + // running frequency, so by the chain rule its gradient scales by that same frequency + // (d/dp[n(f*p)] = f * grad_n(f*p)); amplitude and frequency both compound per octave (gain, + // lacunarity respectively), not applied once for the whole sum, so with 1 octave this is exactly + // snoise_grad (NoiseGradTests.FbmGradWithOneOctaveEqualsSnoiseGrad). octaves is clamped to + // [0, 16]: HlslSourceCompatibilityTests' bit-parity oracle drives every mirrored int parameter + // across the full int32 range, which is the right domain for pcg3d/pcg4d's O(1) hash inputs but + // would turn an unclamped octave count into a multi-billion-iteration loop for this mirror. + public static float4 fbm_grad(float3 p, int octaves, float lacunarity, float gain) + { + octaves = clamp(octaves, 0, 16); + var amplitude = 1.0f; + var frequency = 1.0f; + var value = 0.0f; + var gradient = new float3(0.0f, 0.0f, 0.0f); + for (var i = 0; i < octaves; i++) + { + var n = snoise_grad(p * frequency); + value += amplitude * n.w; + gradient += amplitude * frequency * new float3(n.x, n.y, n.z); + frequency *= lacunarity; + amplitude *= gain; + } + + return new float4(gradient, value); + } + + // Ridged multifractal noise (Musgrave, Texturing and Modeling, ch. 16; the operator's dune term, + // 2026-09-25): each octave folds snoise_grad about zero, value = Sum a_i*(1 - |n_i|), gradient = + // -Sum a_i*f_i*sign(n_i)*grad(n_i), the same per-octave frequency scaling as fbm_grad's chain + // rule plus the fold's sign flip (d|n|/dp = sign(n)*dn/dp). The crease at n_i = 0 is real and + // deliberate, not a bug: NoiseGradTests excludes a band around it, the same way cellular excludes + // its F1 = F2 seam. sign follows this codebase's HLSL-matching convention (design.md: sign + // returns int, 0 at exactly 0), so the crease itself contributes no gradient rather than an + // arbitrary one. Same octave clamp as fbm_grad, for the same bit-parity-oracle reason. + public static float4 ridged_grad(float3 p, int octaves, float lacunarity, float gain) + { + octaves = clamp(octaves, 0, 16); + var amplitude = 1.0f; + var frequency = 1.0f; + var value = 0.0f; + var gradient = new float3(0.0f, 0.0f, 0.0f); + for (var i = 0; i < octaves; i++) + { + var n = snoise_grad(p * frequency); + var s = (float)sign(n.w); + value += amplitude * (1.0f - abs(n.w)); + gradient += -amplitude * frequency * s * new float3(n.x, n.y, n.z); + frequency *= lacunarity; + amplitude *= gain; + } + + return new float4(gradient, value); + } + + // Inigo Quilez, "smooth minimum" (https://iquilezles.org/articles/smin/): the quadratic-polynomial + // smin, carried to value-and-gradient form (invariant 8). h is affine in (b.w - a.w) inside the + // smoothing band, so differentiating value = lerp(b.w, a.w, h) - k*h*(1-h) with respect to + // position, the terms carrying dh/dp cancel exactly (dh/dp * [(a.w-b.w) - k + 2*k*h] and the + // bracket is identically zero given how h is built from a.w-b.w). What is left is exactly + // lerp(∇b, ∇a, h): the gradient blend is not an approximation, it is the analytic gradient. + // Outside the band (|a.w - b.w| >= k), h saturates to 0 or 1 and this is exactly min(a, b) with + // that input's own gradient, continuously (h and the correction term both reach the boundary at + // the same value from the smooth side, so there is no kink to exclude here the way cellular's + // F1 = F2 seam needs one). + public static float4 smin_grad(float4 a, float4 b, float k) + { + var h = saturate(0.5f + 0.5f * (b.w - a.w) / k); + var value = lerp(b.w, a.w, h) - k * h * (1.0f - h); + var gradient = lerp(new float3(b.x, b.y, b.z), new float3(a.x, a.y, a.z), h); + return new float4(gradient, value); + } + + // Worley, "A Cellular Texture Basis Function" (SIGGRAPH 1996): F1/F2 and their analytic + // gradients, searched over the jittered neighbourhood of feature points. Feature points are + // selected with pcg3d over each neighbour's integer cell coordinate (design.md, "Integer + // hashing"), never the float32 bit pattern of that coordinate and never the sin-based hash. + // Hashing the integer cell coordinate directly is exact and runtime-independent, and it is what + // the HLSL mirror does, so C# and shader stay bit-for-bit aligned. What pins this is the oracle + // and mirror tests, not a uniformity measurement: reverting to hashing the float32 bit pattern + // (or the sin-based hash) is caught by ProductionSearchMatchesTheBruteForceOracleExactly, + // EveryMirrorFunctionMatchesCSharpMath, F1NeverExceedsF2, and the other tests that key off the + // integer-hash fixtures. The + // gradient of a distance field, del|p - c|, is the unit vector (p - c)/|p - c|; that is undefined exactly at + // a feature point (F1 = 0 or F2 = 0), so cellular follows the repo's existing degenerate-normal + // convention (GameCult.Geometry.CultGeometryIsoSurface.EmitOrientedTriangle: guard the zero-length + // case and return the zero vector instead of the NaN a bare normalize would produce there). + // + // The search radius is 2 cells on every axis (5x5x5), not the classic 1-cell (3x3x3) radius, + // because 3x3x3 is not exact: measured 9 of 400,000 points in [-50,50]^3 land on the wrong F2 + // (worst error 0.088), and past |p| of about 2^23 the float32 jitter can put two distinct cells' + // features on the same value, which 3x3x3 has no chance of noticing either way. 5x5x5 is exact, + // not merely safer, by the following argument: + // + // Let u = p - cell be the query's position inside its own cell (u in [0,1)^3 per component), and + // let a candidate feature at integer cell offset d = (dx, dy, dz) sit at d + j for some jitter j + // in [0,1)^3. Per axis, the displacement from p to that feature is (u_i - j_i) - d_i; since + // u_i - j_i is always strictly inside (-1, 1) regardless of the actual u_i and j_i values, + // |displacement_i| is always strictly greater than max(0, |d_i| - 1). So every cell with |d_i| >= + // 3 on some axis is strictly farther than 2 from p (that axis alone already gives max(0, 3-1) = + // 2). Now bound F1 and F2 from above using two real, always-present candidates: the query's own + // cell (d = 0), whose distance is always strictly less than sqrt(3) (every axis strictly under + // 1); and the near-side neighbour on whichever single axis's u_i sits closest to a cell + // boundary. Let m = min(u_i, 1 - u_i) on that chosen axis (m is in [0, 1/2] by construction, + // since it is the smaller of the two). Stepping one cell towards that nearer boundary puts the + // query within (1 + m) of the far face on the offset axis and within (1 - m) of the near face on + // each of the other two axes, so that neighbour's squared distance is at most + // (1 + m)^2 + 2*(1 - m)^2 = 3 - 2m + 3m^2, which is <= 3 for every m in [0, 1/2] (3 at m = 0, + // dipping to a minimum of 8/3 ~= 2.667 at m = 1/3, then rising back to 2.75 at m = 1/2), and + // strictly below 3 because the jitter never reaches exactly 0 or + // 1 (u_i - j_i stays strictly inside (-1, 1), so this bound, like the own-cell one, is never + // tight). F2 is at most the larger of these two real candidates (adding candidates to a set can + // only lower or hold its 2nd-smallest value), so F1 < sqrt(3) and F2 < sqrt(3) always: roughly + // 1.732 < 2, margin 2 - sqrt(3) ~= 0.268 (Soul's adversarial check, cut 2a-i: the worst + // realizable in-box F2 is exactly sqrt(3), reached only in the unattainable limit at a cell + // corner). Every cell outside the 5x5x5 block is farther than 2, hence farther than either F1 or + // F2, so the true global F1 and F2 are always inside it. (The matching argument for 3x3x3 only + // reaches radius 1, whose excluded cells start at distance > 1, which is less than the 1.732 + // ceiling — the gap 3x3x3's failures live in.) + // + // An earlier version of this proof picked the near-side neighbour on a fixed axis rather than + // whichever axis sits closest to its boundary, and that version is wrong (Soul, cut 2a-i): + // u = (0.5, 0, 0) with the x-neighbour's jittered feature at (-1, 1 - 2^-24, 1 - 2^-24) gives a + // distance of about 2.06, outside the radius-2 exclusion the proof needs. Choosing the axis by + // proximity to its own boundary is what keeps m <= 1/2 and the bound at sqrt(3); x was the wrong + // axis to fix there because u.x = 0.5 is the point on the whole cube farthest from any boundary. + // + // The loop below still visits every one of the 125 cells in a fixed order, but skips the + // pcg3d/jitter/distance work for a cell whose distance cannot possibly beat the current f2: that + // per-cell lower bound (the max(0, |d_i| - 1) term above, combined across axes) depends only on + // the integer offset, never on p or the hash, so pruning a cell the unpruned loop would also + // have rejected changes no output bit (CellularExactSearchTests pins the pruned/unpruned + // equivalence and the exactness against a 7x7x7 brute-force oracle). + public static CultCellular cellular(float3 p) + { + var cell = floor(p); + var f1 = 1.0e30f; + var f2 = 1.0e30f; + var c1 = new float3(0.0f, 0.0f, 0.0f); + var c2 = new float3(0.0f, 0.0f, 0.0f); + var cellId = new float3(0.0f, 0.0f, 0.0f); + + for (var dz = -2; dz <= 2; dz++) + { + var lz = max(0.0f, abs((float)dz) - 1.0f); + for (var dy = -2; dy <= 2; dy++) + { + var ly = max(0.0f, abs((float)dy) - 1.0f); + for (var dx = -2; dx <= 2; dx++) + { + var lx = max(0.0f, abs((float)dx) - 1.0f); + var lowerBound = sqrt(lx * lx + ly * ly + lz * lz); + if (lowerBound >= f2) + continue; + + var neighbor = cell + new float3(dx, dy, dz); + var hash = pcg3d(int3(neighbor)); + var jitter = new float3(cellular_unit(hash.x), cellular_unit(hash.y), cellular_unit(hash.z)); + var feature = neighbor + jitter; + var d = distance(p, feature); + + if (d < f1) + { + f2 = f1; c2 = c1; + f1 = d; c1 = feature; cellId = neighbor; + } + else if (d < f2) + { + f2 = d; c2 = feature; + } + } + } + } + + // F1 = 0 is reachable (p sits exactly on a feature point). F2 = 0 needs two distinct cells' + // pcg3d-jittered features to land on the same float32 value in every component: unreachable + // at ordinary magnitudes, but confirmed reachable past roughly |p| = 2^23 (design.md, + // "Precision domain"), so both share the same degenerate-gradient guard. + var grad1 = f1 > 0.0f ? (p - c1) / f1 : new float3(0.0f, 0.0f, 0.0f); + var grad2 = f2 > 0.0f ? (p - c2) / f2 : new float3(0.0f, 0.0f, 0.0f); + + // id comes from pcg4d over the winning cell's integer coordinate alone (same int-hashing + // rule as the jitter above), never from the pcg3d hash that produced its jitter: sharing a + // hash between id and jitter would make id a deterministic function of the jitter it is + // supposed to be independent from, correlated across every cell (F4). + var idHash = pcg4d(new int4(int3(cellId), 0)); + + return new CultCellular( + new float4(grad1, f1), + new float4(grad2 - grad1, f2 - f1), + cellular_unit(idHash.w)); + } + + // Maps a hash component's uint bit pattern to [0, 1) using the top 24 bits, so the result is + // always strictly less than 1: a plain divide-by-2^32 rounds 0xFFFFFF80..0xFFFFFFFF up to + // exactly 1.0f in float32, outside the documented range. (uint >> 8) has at most 24 significant + // bits, which float32's 24-bit mantissa represents exactly, and the division is by an exact power + // of two, so both the shift-and-convert and the divide are the same IEEE-754 round-to-nearest on + // dxc and C#, bit-exact on both sides. + internal static float cellular_unit(int bits) => ((uint)bits >> 8) * (1.0f / 16777216.0f); public static float value_noise(float2 position) { diff --git a/packages/cultmath/tests/CultMath.Tests/AffineTests.cs b/packages/cultmath/tests/CultMath.Tests/AffineTests.cs new file mode 100644 index 00000000..e73f34f5 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/AffineTests.cs @@ -0,0 +1,725 @@ +using CultMath; +using Xunit; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// The affine forms of math.Affine.cs (design.md, "Affine forms"). A form (x0, a, e) is the set +/// x0 + a eps + e delta at the region's shared eps; every check evaluates that set in double and the +/// pointwise function in float32, with no tolerance. Operand values are float32 values drawn inside +/// their operands' sets at one shared eps, endpoints (eps and delta at -1 and 1) included. +/// +public sealed class AffineTests +{ + private readonly ITestOutputHelper output; + + public AffineTests(ITestOutputHelper output) => this.output = output; + + private static float Uniform(System.Random random, float lo, float hi) => lo + (hi - lo) * random.NextSingle(); + + private static float LogUniform(System.Random random, float lo, float hi) => + MathF.Exp(Uniform(random, MathF.Log(lo), MathF.Log(hi))); + + private static float Signed(System.Random random, float magnitude) => random.Next(2) == 0 ? -magnitude : magnitude; + + // Whether value lies in the form's set at eps, in double. + private static bool InForm(float3 form, float eps, double value) => + Math.Abs(value - (form.x + (double)form.y * eps)) <= form.z; + + // A form with its centre in [-20, 20] and |a| and e log-uniform over [1e-5, 20]; one in eight has + // a = 0 and one in eight e = 0. + private static float3 DrawForm(System.Random random) + { + var x0 = Uniform(random, -20.0f, 20.0f); + var a = random.Next(8) == 0 ? 0.0f : Signed(random, LogUniform(random, 1.0e-5f, 20.0f)); + var e = random.Next(8) == 0 ? 0.0f : LogUniform(random, 1.0e-5f, 20.0f); + return new float3(x0, a, e); + } + + private static float2 DrawInterval(System.Random random) + { + var lo = Uniform(random, -20.0f, 20.0f); + return new float2(lo, lo + (random.Next(8) == 0 ? 0.0f : LogUniform(random, 1.0e-5f, 40.0f))); + } + + // The tiny family: magnitudes from 1e-21 to 1e-17, products near and under 2^-126 = 1.2e-38, where a + // float32 result rounds to a subnormal and the absorption S 2^-20 is smaller than that loss. + private static float3 DrawTiny(System.Random random) => + new(random.Next(8) == 0 ? 0.0f : Signed(random, LogUniform(random, 1.0e-21f, 1.0e-17f)), + random.Next(4) == 0 ? 0.0f : Signed(random, LogUniform(random, 1.0e-21f, 1.0e-17f)), + random.Next(4) == 0 ? 0.0f : LogUniform(random, 1.0e-21f, 1.0e-17f)); + + private static float2 DrawTinyInterval(System.Random random) + { + var lo = Signed(random, LogUniform(random, 1.0e-21f, 1.0e-17f)); + return new float2(lo, lo + (random.Next(8) == 0 ? 0.0f : LogUniform(random, 1.0e-21f, 1.0e-17f))); + } + + // A float32 value in the form's set at eps, delta at an endpoint when asked; NaN when rounding leaves + // no float of the set near the drawn point (a set narrower than an ulp). + private static float Member(System.Random random, float3 form, float eps, bool endpoint) + { + var centre = form.x + (double)form.y * eps; + var delta = endpoint ? (random.Next(2) == 0 ? -1.0 : 1.0) : Uniform(random, -1.0f, 1.0f); + var value = (float)(centre + form.z * delta); + for (var k = 0; k < 4 && !InForm(form, eps, value); k++) + value = value > centre ? MathF.BitDecrement(value) : MathF.BitIncrement(value); + return InForm(form, eps, value) ? value : float.NaN; + } + + private static float MemberOf(System.Random random, float2 interval, bool endpoint) => + endpoint ? (random.Next(2) == 0 ? interval.x : interval.y) : Math.Clamp(Uniform(random, interval.x, interval.y), interval.x, interval.y); + + private readonly record struct Operands(float3 X, float3 Y, float2 Iv, float S); + + private readonly record struct Values(float X, float Y, float V, float S); + + // One op under the harness: Build gives the result's membership test (eps, value) from the operand + // forms, F the pointwise float32 function of operand values. + private sealed record Op(string Name, Func> Build, Func F); + + private static Func Form(float3 form) => (eps, value) => InForm(form, eps, value); + + private static Func Range(float2 range) => (_, value) => value >= range.x && value <= range.y; + + private static readonly Op[] Ops = + { + new("af_point", o => Form(af_point(o.X.x)), v => v.S), + new("af_symbol", o => Form(af_symbol(o.X.x, o.X.y)), v => v.S), + new("af_from_iv", o => Form(af_from_iv(o.Iv)), v => v.V), + new("af_range", o => Range(af_range(o.X)), v => v.X), + new("af_add", o => Form(af_add(o.X, o.Y)), v => v.X + v.Y), + new("af_sub", o => Form(af_sub(o.X, o.Y)), v => v.X - v.Y), + new("af_neg", o => Form(af_neg(o.X)), v => -v.X), + new("af_scale", o => Form(af_scale(o.X, o.S)), v => v.X * v.S), + new("af_add_iv", o => Form(af_add_iv(o.X, o.Iv)), v => v.X + v.V), + new("af_mul", o => Form(af_mul(o.X, o.Y)), v => v.X * v.Y), + }; + + // Runs one op over `forms` seeded operand draws x 16 (eps, delta) draws; returns the misses and up to + // four witnesses. The first four draws per form put eps at an endpoint, the first eight delta. + // af_point and af_symbol are checked on their defining value: the point x0 itself, and x0 + a eps in + // double (the symbol defines eps, so it has no float32 evaluation to enclose). + private static (int Misses, List Witness) Harness(Op op, int seed, int forms = 10_000, Func? draw = null, bool tiny = false) + { + draw ??= tiny ? DrawTiny : DrawForm; + var random = new System.Random(seed); + var misses = 0; + var witness = new List(); + for (var t = 0; t < forms; t++) + { + var operands = new Operands(draw(random), draw(random), tiny ? DrawTinyInterval(random) : DrawInterval(random), + random.Next(8) == 0 ? 0.0f : tiny ? Signed(random, LogUniform(random, 1.0e-32f, 1.0e-19f)) : Uniform(random, -4.0f, 4.0f)); + var contains = op.Build(operands); + for (var d = 0; d < 16; d++) + { + var eps = d < 4 ? (d % 2 == 0 ? -1.0f : 1.0f) : Uniform(random, -1.0f, 1.0f); + var endpoint = d < 8; + var x = Member(random, operands.X, eps, endpoint); + var y = Member(random, operands.Y, eps, endpoint); + if (float.IsNaN(x) || float.IsNaN(y)) + continue; + var v = MemberOf(random, operands.Iv, endpoint); + double f = op.Name switch + { + "af_point" => operands.X.x, + "af_symbol" => operands.X.x + (double)operands.X.y * eps, + _ => op.F(new Values(x, y, v, operands.S)), + }; + if (!contains(eps, f)) + { + misses++; + if (witness.Count < 4) + witness.Add($"{op.Name}: X {operands.X}, Y {operands.Y}, iv {operands.Iv}, s {operands.S:R}; eps {eps:R}, values ({x:R}, {y:R}, {v:R}) give {f:R}"); + } + } + } + + return (misses, witness); + } + + [Fact] + public void EveryOpEnclosesItsPoints() + { + var failures = new List(); + foreach (var op in Ops) + { + var (misses, witness) = Harness(op, 0xAF00); + if (misses > 0) + failures.Add($"{op.Name}: {misses} misses" + Environment.NewLine + string.Join(Environment.NewLine, witness)); + } + + Assert.True(failures.Count == 0, string.Join(Environment.NewLine, failures)); + } + + private static float3 Shrink(float3 form) => new(form.x, form.y, form.z > 0.0f ? MathF.BitDecrement(form.z) : 0.0f); + + // Each op with its rounding absorption removed: the propagated error alone, computed in float32. + private static readonly Op[] Unabsorbed = + { + new("af_from_iv", o => Form(new float3((o.Iv.x + o.Iv.y) * 0.5f, 0.0f, (o.Iv.y - o.Iv.x) * 0.5f)), v => v.V), + new("af_range", o => Range(new float2(o.X.x - (MathF.Abs(o.X.y) + o.X.z), o.X.x + (MathF.Abs(o.X.y) + o.X.z))), v => v.X), + new("af_add", o => Form(new float3(o.X.x + o.Y.x, o.X.y + o.Y.y, o.X.z + o.Y.z)), v => v.X + v.Y), + new("af_sub", o => Form(new float3(o.X.x - o.Y.x, o.X.y - o.Y.y, o.X.z + o.Y.z)), v => v.X - v.Y), + new("af_scale", o => Form(new float3(o.X.x * o.S, o.X.y * o.S, o.X.z * MathF.Abs(o.S))), v => v.X * v.S), + new("af_add_iv", o => Form(new float3(o.X.x + (o.Iv.x + o.Iv.y) * 0.5f, o.X.y, o.X.z + (o.Iv.y - o.Iv.x) * 0.5f)), v => v.X + v.V), + new("af_mul", o => Form(new float3(o.X.x * o.Y.x, o.X.x * o.Y.y + o.Y.x * o.X.y, + MathF.Abs(o.X.x) * o.Y.z + MathF.Abs(o.Y.x) * o.X.z + (MathF.Abs(o.X.y) + o.X.z) * (MathF.Abs(o.Y.y) + o.Y.z))), v => v.X * v.Y), + }; + + // One-ulp mutants that survive, each with the reason. A rounding absorption bounds the worst case + // over every operand value, and 2^-20 S is 16u S, at least eight ulps of the larger of |x0|, |a| and + // e; one ulp less of e leaves the rest of that margin, which no sampled rounding can cross. + private static readonly Dictionary OneUlpSurvivors = new() + { + ["af_from_iv"] = "the absorption (|x0| + e) 2^-20 is at least eight ulps of e over the one rounding of x0 and e it covers", + ["af_range"] = "each endpoint moves outward by (|x0| + |a| + e) 2^-20, eight ulps past the one rounding it covers", + ["af_add"] = "the absorption 2^-20 S is eight ulps of S's largest term past the three roundings it covers", + ["af_sub"] = "as af_add", + ["af_scale"] = "as af_add", + ["af_add_iv"] = "two absorptions, af_from_iv's and af_add's", + ["af_mul"] = "the absorption 2^-20 (|x0| + |x0 a_y| + |y0 a_x| + e) is eight ulps past the products it covers", + }; + + /// + /// The rounding absorptions are load-bearing: with each op's absorption removed (Unabsorbed), the + /// harness finds a miss for every op. Each op's e shrunk by one ulp is run too; it survives for every + /// op, because the absorption is a worst-case bound many ulps wide, and each survivor is named with + /// its reason in OneUlpSurvivors. A one-ulp mutant that starts failing, or one that is not named, + /// fails this test, so the list cannot go stale. + /// + [Fact] + public void EveryRoundingTermIsCaught() + { + var problems = new List(); + foreach (var mutant in Unabsorbed) + { + var (misses, _) = Harness(mutant, 0xAF01); + output.WriteLine($"AF-REPORT {mutant.Name} without absorption: {misses} misses"); + if (misses == 0) + problems.Add($"{mutant.Name}: removing the rounding absorption is not caught"); + } + + foreach (var op in Ops.Where(o => o.Name is not ("af_point" or "af_symbol" or "af_neg"))) + { + var shrunk = op.Name == "af_range" + ? op with { Build = o => { var r = af_range(o.X); return Range(new float2(MathF.BitIncrement(r.x), MathF.BitDecrement(r.y))); } } + : op with { Build = o => Form(Shrink(BuildForm(op.Name, o))) }; + var (misses, _) = Harness(shrunk, 0xAF02); + output.WriteLine($"AF-REPORT {op.Name} with e one ulp short: {misses} misses"); + var named = OneUlpSurvivors.ContainsKey(op.Name); + if (misses == 0 && !named) + problems.Add($"{op.Name}: e one ulp short survives and is not named"); + if (misses > 0 && named) + problems.Add($"{op.Name}: e one ulp short is now caught; remove it from OneUlpSurvivors"); + } + + Assert.True(problems.Count == 0, string.Join(Environment.NewLine, problems)); + } + + private static float3 BuildForm(string name, Operands o) => name switch + { + "af_from_iv" => af_from_iv(o.Iv), + "af_add" => af_add(o.X, o.Y), + "af_sub" => af_sub(o.X, o.Y), + "af_scale" => af_scale(o.X, o.S), + "af_add_iv" => af_add_iv(o.X, o.Iv), + "af_mul" => af_mul(o.X, o.Y), + _ => throw new ArgumentException(name), + }; + + /// + /// The shared symbol correlates: for x = af_symbol(x0, a), af_sub(x, x) and af_add(x, af_neg(x)) have + /// a = 0 and e at most their own rounding, and af_sub(af_scale(x, 2), af_add(x, x)) has a = 0. A + /// mutant of af_add, af_sub or af_scale that condensed a into e would leave e of order |a|. + /// + [Fact] + public void SharedSymbolCorrelates() + { + var random = new System.Random(0xAF03); + for (var t = 0; t < 10_000; t++) + { + var x = af_symbol(Uniform(random, -20.0f, 20.0f), Signed(random, LogUniform(random, 1.0e-5f, 20.0f))); + foreach (var (name, form) in new[] + { + ("af_sub(x, x)", af_sub(x, x)), + ("af_add(x, af_neg(x))", af_add(x, af_neg(x))), + ("af_sub(af_scale(x, 2), af_add(x, x))", af_sub(af_scale(x, 2.0f), af_add(x, x))), + }) + { + var rounding = (MathF.Abs(x.x) + MathF.Abs(x.y)) * 1.0e-5f; + Assert.True(form.y == 0.0f && form.z <= rounding, $"{name} for x = {x} is {form}: a must be 0 and e at most {rounding:R}"); + } + } + } + + // Forms whose range straddles zero (|x0| below |a| + e) or is one-signed (|x0| above it). + private static float3 DrawSigned(System.Random random, bool straddle) + { + var a = Signed(random, LogUniform(random, 1.0e-3f, 10.0f)); + var e = LogUniform(random, 1.0e-3f, 10.0f); + var reach = MathF.Abs(a) + e; + return new float3(Signed(random, straddle ? Uniform(random, 0.0f, 0.9f * reach) : reach * Uniform(random, 1.1f, 4.0f)), a, e); + } + + /// + /// af_mul encloses the product over forms that straddle zero and forms that are one-signed, every + /// sign combination. The eps^2 term a_x a_y is what the condensed e carries for eps at +-1: a mutant + /// dropping |a_x a_y| from e misses there. + /// + [Fact] + public void MulEnclosesEverySignCase() + { + var mul = Ops.Single(o => o.Name == "af_mul"); + var dropped = mul with + { + Build = o => + { + var r = af_mul(o.X, o.Y); + return Form(new float3(r.x, r.y, r.z - MathF.Abs(o.X.y * o.Y.y))); + }, + }; + foreach (var (sx, sy) in new[] { (true, true), (true, false), (false, true), (false, false) }) + { + var seed = 0xAF04 + (sx ? 1 : 0) + (sy ? 2 : 0); + var flip = 0; + float3 Draw(System.Random r) => DrawSigned(r, (flip++ % 2 == 0) ? sx : sy); + var (misses, witness) = Harness(mul, seed, 5_000, Draw); + Assert.True(misses == 0, $"af_mul, straddling ({sx}, {sy}): {misses} misses" + Environment.NewLine + string.Join(Environment.NewLine, witness)); + flip = 0; + var (caught, _) = Harness(dropped, seed, 5_000, Draw); + Assert.True(caught > 0, $"af_mul without |a_x a_y|, straddling ({sx}, {sy}), is not caught"); + } + } + + // af_snoise's float32 allowance, as its doc comment states it, for the width comparison below. + private static double Allowance(float3 centre, double reach) => + SNOISE_READ_VALUE + SNOISE_READ_GRADIENT * reach + + SNOISE_LIPSCHITZ * Math.ScaleB(Math.Abs(centre.x) + Math.Abs(centre.y) + Math.Abs(centre.z) + reach, -20); + + /// + /// af_snoise reads the same absolute rounding terms of the kernel as span_slack: at the origin with no + /// axis, the form's error is span_slack's value allowance at zero rounding plus the Lipschitz form's + /// L R, and each unit of reach adds span_slack's gradient term at zero rounding plus L 2^-20 (the + /// coordinate's own rounding). Widening the kernel's absolute read in one reader and not the other, + /// the device judge's possible outcome, fails here. The expected bits are formed from span_slack, not + /// from a literal. + /// + [Fact] + public void SnoiseFormAndSpanSlackShareTheKernelsAbsoluteTerms() + { + var zero = new float3(0.0f, 0.0f, 0.0f); + var slack = span_slack(0.0f); + var value = snoise_grad(zero).w; + foreach (var reach in new[] { 0.0f, 1.0f, 3.0f }) + { + var lipschitz = SNOISE_LIPSCHITZ * reach; + var allowance = slack.x + slack.y * reach + SNOISE_LIPSCHITZ * 9.5367431640625e-7f * reach; + var e = lipschitz + allowance; + var expected = e + (abs(value) + 0.0f + e) * 9.5367431640625e-7f; + var form = af_snoise(zero, zero, reach); + Assert.True(BitConverter.SingleToInt32Bits(form.z) == BitConverter.SingleToInt32Bits(expected), + $"af_snoise(0, 0, {reach:R}).z is {form.z:R}; the allowances span_slack reads give {expected:R}"); + } + } + + private static float3 UnitVector(System.Random random) + { + float3 v; + do + { + v = new float3(Uniform(random, -1.0f, 1.0f), Uniform(random, -1.0f, 1.0f), Uniform(random, -1.0f, 1.0f)); + } + while (dot(v, v) > 1.0f || dot(v, v) < 1.0e-4f); + + return normalize(v); + } + + // A float32 point of the set centre + axis eps + w, |w| <= radius, checked in double; the first eight + // w are on the surface. Where the float32 sum rounds a point out of the set, w is pulled in by the + // overshoot and 2^-21 (|centre|_1 + |axis|_1) and the sum retried; a point that still rounds out is + // reported as null and skipped. + private static float3? PointOf(System.Random random, float3 centre, float3 axis, float radius, float eps, int index) + { + var w = UnitVector(random) * (index < 8 ? radius : radius * MathF.Cbrt(random.NextSingle())); + for (var k = 0; k < 6; k++) + { + var p = centre + axis * eps + w; + var (dx, dy, dz) = (p.x - (centre.x + (double)axis.x * eps), p.y - (centre.y + (double)axis.y * eps), p.z - (centre.z + (double)axis.z * eps)); + var distance = Math.Sqrt(dx * dx + dy * dy + dz * dz); + if (distance <= radius) + return p; + w *= (float)(Math.Max(0.0, 2.0 * radius - distance - Math.ScaleB(Math.Abs(centre.x) + Math.Abs(centre.y) + Math.Abs(centre.z) + Math.Abs(axis.x) + Math.Abs(axis.y) + Math.Abs(axis.z), -21)) / radius); + } + + return null; + } + + /// + /// af_snoise and af_fbm over 2,000 (centre, axis, radius) each: centres in [-20, 20]^3, radius + /// log-uniform in [1e-4, 2], |axis| uniform in [0, 2] (an eighth exactly 0). 64 points + /// centre + axis eps + w per case, eps at -1 and 1 for the first eight; snoise (fbm_grad(...).w) in + /// float32 lies in the form at eps, no tolerance. Dropping the M R^2 / 2 remainder from a centred + /// form misses. af_snoise's total width is never more than the Lipschitz form's, L R plus the + /// allowance. + /// + [Fact] + public void SnoiseFormEnclosesBall() + { + var random = new System.Random(0xAF10); + var (misses, remainderMisses, skipped, centredCases) = (0, 0, 0, 0); + var witness = new List(); + for (var b = 0; b < 4000; b++) + { + var fbm = b >= 2000; + var centre = new float3(Uniform(random, -20.0f, 20.0f), Uniform(random, -20.0f, 20.0f), Uniform(random, -20.0f, 20.0f)); + var axis = random.Next(8) == 0 ? new float3(0.0f, 0.0f, 0.0f) : UnitVector(random) * Uniform(random, 0.0f, 2.0f); + var radius = LogUniform(random, 1.0e-4f, 2.0f); + var (octaves, lacunarity, gain) = (random.Next(0, 7), Uniform(random, 1.5f, 2.5f), Uniform(random, 0.3f, 0.7f)); + var form = fbm ? af_fbm(centre, axis, radius, octaves, lacunarity, gain) : af_snoise(centre, axis, radius); + var reach = (double)length(axis) + radius; + var remainder = 0.5 * SNOISE_HESSIAN * reach * reach; + var mutant = new float3(form.x, form.y, (float)(form.z - remainder)); + if (!fbm) + { + var lipschitz = (SNOISE_LIPSCHITZ * reach + Allowance(centre, reach) + Math.ScaleB(Math.Abs(form.x), -20)) * (1.0 + Math.ScaleB(1.0, -18)); + Assert.True(Math.Abs(form.y) + form.z <= lipschitz, $"af_snoise({centre}, {axis}, {radius:R}) = {form} is wider than the Lipschitz form's half-width {lipschitz:R}"); + centredCases += form.y != 0.0f ? 1 : 0; + } + + for (var i = 0; i < 64; i++) + { + var eps = i < 8 ? (i % 2 == 0 ? -1.0f : 1.0f) : Uniform(random, -1.0f, 1.0f); + var p = PointOf(random, centre, axis, radius, eps, i); + if (p is not { } point) + { + skipped++; + continue; + } + + var value = fbm ? fbm_grad(point, octaves, lacunarity, gain).w : snoise(point); + if (!InForm(form, eps, value)) + { + misses++; + if (witness.Count < 4) + witness.Add($"{(fbm ? $"af_fbm(..., {octaves}, {lacunarity:R}, {gain:R})" : "af_snoise")}({centre}, {axis}, {radius:R}) = {form} misses {value:R} at eps {eps:R}, {point}"); + } + + if (!fbm && form.y != 0.0f && !InForm(mutant, eps, value)) + remainderMisses++; + } + } + + output.WriteLine($"AF-REPORT af_snoise/af_fbm enclosure: {misses} misses, {skipped} points skipped (rounded out of the set), {centredCases} of 2000 af_snoise cases centred, {remainderMisses} misses with the remainder dropped"); + Assert.True(misses == 0, string.Join(Environment.NewLine, witness)); + Assert.True(skipped < 64 * 4000 / 100, $"{skipped} points rounded out of their sets"); + Assert.True(remainderMisses > 0, "dropping M R^2 / 2 from the centred form is not caught"); + } + + /// + /// At radius 1e-3 and |axis| = 1e-3, af_snoise takes the centred form in every one of 2,000 seeded + /// cases (a is nonzero), and its mean total width is under half of the Lipschitz form's 2 L R. A + /// mutant that always returns the Lipschitz form has a = 0. + /// + [Fact] + public void SnoiseChoosesTheCentredFormWhereNarrower() + { + var random = new System.Random(0xAF11); + var sum = 0.0; + for (var b = 0; b < 2000; b++) + { + var centre = new float3(Uniform(random, -20.0f, 20.0f), Uniform(random, -20.0f, 20.0f), Uniform(random, -20.0f, 20.0f)); + var axis = UnitVector(random) * 1.0e-3f; + var form = af_snoise(centre, axis, 1.0e-3f); + var lipschitz = 2.0 * SNOISE_LIPSCHITZ * 2.0e-3; + var width = 2.0 * (Math.Abs(form.y) + form.z); + Assert.True(form.y != 0.0f && width < lipschitz, $"af_snoise({centre}, {axis}, 1e-3) = {form}: not the centred form, or no narrower than 2 L R = {lipschitz:R}"); + sum += width / lipschitz; + } + + output.WriteLine($"AF-REPORT af_snoise at radius 1e-3: mean width over 2 L R {sum / 2000:F3}"); + Assert.True(sum / 2000 < 0.5, $"mean width over 2 L R is {sum / 2000:F3}, not under half"); + } + + /// + /// af_frustum_ball and af_frustum_axis over iv_frustum_ball's families (NoiseBoundTests.DrawBallCase: + /// the r2 domain and the degenerate, thin, wide-slope, far, from-the-camera, tiny-focal and huge-warp + /// extremes), 2,000 tiles each, warp passed as the warp variation: every exact ray point (m z, z), + /// formed in double from the float32 slope and depth at the footprint's corners at both depth ends + /// (and 56 more for the r2 domain), moved by a full-length outward flow of length warp, is within + /// radius of centre + axis eps(z), eps(z) = clamp((z - z_m) / h, -1, 1) with z_m and h the centre's z + /// and the axis's z (0 when h is 0). The radius is pinned to the derivation both ways: + /// r <= w <= r + 2^-19 (r + |c|_1 + |axis|_1), r = z1 footprintPerDepth + warp in double. + /// + [Fact] + public void FrustumSliceEnclosesEveryRayPoint() + { + var random = new System.Random(0xAF12); + string[] families = { "r2 domain", "degenerate", "thin", "wide slope", "far", "from the camera", "tiny focal", "huge warp" }; + var failures = new Dictionary(); + var witness = new List(); + foreach (var family in families) + { + failures[family] = 0; + for (var t = 0; t < 2000; t++) + { + var (n, focal, slope, z0, z1, warp) = NoiseBoundTests.DrawBallCase(random, family); + var half = n / (2.0f * focal); + var footprint = n / (MathF.Sqrt(2.0f) * focal); + var axis = af_frustum_axis(slope, z0, z1); + var ball = af_frustum_ball(slope, z0, z1, footprint, warp); + var (cx, cy, cz, w) = ((double)ball.x, (double)ball.y, (double)ball.z, (double)ball.w); + var r = z1 * (double)footprint + warp; + var c1 = Math.Abs(cx) + Math.Abs(cy) + Math.Abs(cz); + var a1 = Math.Abs((double)axis.x) + Math.Abs((double)axis.y) + Math.Abs((double)axis.z); + if (!(r <= w && w <= r + Math.ScaleB(r + c1 + a1, -19))) + { + failures[family]++; + if (witness.Count < 8) + witness.Add($"{family} pin: af_frustum_ball({slope}, {z0:R}, {z1:R}, {footprint:R}, {warp:R}) = {ball}, derivation {r:R}"); + } + + // The axis is (m_c, 1) h exactly, and the radius carries the documented widening, the + // rounding of the centre, the axis (spread) and the radius at 2^-20 each, to 15% (the + // radius rounds too). + var h = (z1 - z0) * 0.5f; + var spread = ((double)Math.Abs(slope.x) + Math.Abs(slope.y) + 1.0) * h; + var widening = Math.ScaleB(c1 + spread + r, -20); + if (!(axis.z == h && axis.x == slope.x * h && axis.y == slope.y * h && Math.Abs(w - r - widening) <= 0.15 * widening + Math.ScaleB(w, -22))) + { + failures[family]++; + if (witness.Count < 8) + witness.Add($"{family} axis or widening: af_frustum_ball({slope}, {z0:R}, {z1:R}, {footprint:R}, {warp:R}) = {ball}, axis {axis}, widening {w - r:R} against {widening:R}"); + } + + for (var i = 0; i < (family == "r2 domain" ? 64 : 8); i++) + { + var offset = i < 8 + ? new float2((i & 1) == 0 ? -half : half, (i & 2) == 0 ? -half : half) + : new float2(Uniform(random, -half, half), Uniform(random, -half, half)); + var z = i < 8 ? ((i & 4) == 0 ? z0 : z1) : Uniform(random, z0, z1); + var m = slope + offset; + var eps = axis.z == 0.0f ? 0.0 : Math.Clamp((z - cz) / axis.z, -1.0, 1.0); + var (qx, qy, qz) = (cx + axis.x * eps, cy + axis.y * eps, cz + axis.z * eps); + var (dx, dy, dz) = (m.x * (double)z - qx, m.y * (double)z - qy, z - qz); + var away = Math.Sqrt(dx * dx + dy * dy + dz * dz); + var distance = away + warp; + if (!(distance <= w)) + { + failures[family]++; + if (witness.Count < 8) + witness.Add($"{family}: af_frustum_ball({slope}, {z0:R}, {z1:R}, {footprint:R}, {warp:R}) = {ball}, axis {axis} misses slope {m}, depth {z:R} by {(distance - w) / w:R} r"); + } + } + } + } + + Assert.True(failures.Values.Sum() == 0, string.Join(", ", families.Select(f => $"{f} {failures[f]}")) + Environment.NewLine + string.Join(Environment.NewLine, witness)); + } + + /// + /// Underflow. Operands of magnitude 1e-21 to 1e-17 put products near and under 2^-126, where float32 + /// rounds to a subnormal and the relative absorption S 2^-20 is smaller than the loss: every op + /// still encloses, no tolerance. af_mul and af_scale carry the 2^-126 term; a mutant that subtracts + /// it misses here. + /// + [Fact] + public void TinyOperandsEncloseTheirPoints() + { + var failures = new List(); + foreach (var op in Ops) + { + var (misses, witness) = Harness(op, 0xAF05, 10_000, tiny: true); + if (misses > 0) + failures.Add($"{op.Name}: {misses} misses" + Environment.NewLine + string.Join(Environment.NewLine, witness)); + } + + Assert.True(failures.Count == 0, string.Join(Environment.NewLine, failures)); + } + + private const float MinNormal = 1.17549435e-38f; + + private static bool Near(double observed, double expected, double relative = 1.0e-5) => + Math.Abs(observed - expected) <= relative * Math.Abs(expected); + + /// + /// The rounding absorption of each op, pinned both ways. With no propagated error in e, af_add, + /// af_sub, af_scale, af_mul and af_from_iv return an e equal to their documented absorption (and + /// 2^-126 where documented) to a part in 1e5 of its double value, and af_range moves each endpoint + /// outward by (|x0| + |a| + e) 2^-20 to 30% (the endpoints round once). A factor, a sign or an + /// operator changed in any of them fails here; the one-ulp changes of the worst-case absorption are + /// the OneUlpSurvivors set EveryRoundingTermIsCaught names. + /// + [Fact] + public void AbsorptionsArePinned() + { + var u20 = Math.ScaleB(1.0, -20); + var random = new System.Random(0xAF06); + for (var t = 0; t < 2_000; t++) + { + var (x0, y0) = (Uniform(random, -20.0f, 20.0f), Uniform(random, -20.0f, 20.0f)); + var (ax, ay) = (Signed(random, LogUniform(random, 1.0e-3f, 20.0f)), Signed(random, LogUniform(random, 1.0e-3f, 20.0f))); + var scale = Signed(random, LogUniform(random, 1.0e-2f, 4.0f)); + var x = new float3(x0, ax, 0.0f); + var y = new float3(y0, ay, 0.0f); + + var sum = af_add(x, y); + Assert.True(Near(sum.z, (Math.Abs((double)sum.x) + Math.Abs((double)sum.y)) * u20), $"af_add({x}, {y}) = {sum}: e is not (|x0| + |a|) 2^-20"); + var difference = af_sub(x, y); + Assert.True(Near(difference.z, (Math.Abs((double)difference.x) + Math.Abs((double)difference.y)) * u20), $"af_sub({x}, {y}) = {difference}: e is not (|x0| + |a|) 2^-20"); + var scaled = af_scale(x, scale); + Assert.True(Near(scaled.z, (Math.Abs((double)scaled.x) + Math.Abs((double)scaled.y)) * u20 + MinNormal), $"af_scale({x}, {scale:R}) = {scaled}: e is not (|x0| + |a|) 2^-20 + 2^-126"); + + // a_x = 0 leaves the product's propagated error 0 and its a = x0 a_y. + var px = new float3(x0, 0.0f, 0.0f); + var product = af_mul(px, y); + var terms = Math.Abs((double)product.x) + Math.Abs((double)x0 * ay); + Assert.True(Near(product.z, terms * u20 + MinNormal), $"af_mul({px}, {y}) = {product}: e is not (|x0 y0| + |x0 a_y|) 2^-20 + 2^-126"); + + var iv = DrawInterval(random); + var form = af_from_iv(iv); + var (mid, half) = (((double)iv.x + iv.y) / 2.0, ((double)iv.y - iv.x) / 2.0); + var expected = half + (Math.Abs(mid) + half) * u20 + MinNormal; + Assert.True(Math.Abs(form.z - expected) <= 1.0e-5 * (Math.Abs(mid) + half) * u20 + 1.0e-6 * half + 1.0e-12 * expected, + $"af_from_iv({iv}) = {form}: e is not half-width + (|mid| + half-width) 2^-20 + 2^-126 = {expected:R}"); + + var wide = new float3(Uniform(random, -20.0f, 20.0f), Signed(random, LogUniform(random, 1.0e-3f, 20.0f)), LogUniform(random, 1.0e-3f, 20.0f)); + var range = af_range(wide); + var reach = Math.Abs((double)wide.y) + wide.z; + var absorption = (Math.Abs((double)wide.x) + reach) * u20; + var outward = ((double)range.y - range.x) / 2.0 - reach; + Assert.True(Math.Abs(outward - absorption) <= 0.3 * absorption, $"af_range({wide}) = {range}: endpoints are {outward:R} past x0 -+ (|a| + e), not (|x0| + |a| + e) 2^-20 = {absorption:R}"); + } + } + + /// + /// af_from_iv and af_range at the float32 extremes. Subnormal endpoints (including [0, the least + /// subnormal], whose halved width underflows to 0) and endpoints near the float maximum (where lo + + /// hi, hi - lo or the absorption would overflow) give a form whose set holds both endpoints and the + /// midpoint, and an af_range that holds them with no NaN endpoint. A form with an infinite or NaN + /// component, as an overflowed op returns, gives an af_range with no NaN endpoint. + /// + [Fact] + public void FromIntervalAndRangeHoldAtTheExtremes() + { + var least = BitConverter.Int32BitsToSingle(1); + var max = float.MaxValue; + var random = new System.Random(0xAF07); + var specials = new[] { 0.0f, least, 2 * least, 100 * least, MinNormal - least, MinNormal, 3.0f * MinNormal, 1.0e-30f, 1.0f, 1.0e20f, 1.0e30f, max / 4, max / 2, max * 0.75f, max }; + var misses = new List(); + void Check(float lo, float hi) + { + var form = af_from_iv(new float2(lo, hi)); + var range = af_range(form); + if (float.IsNaN(form.x) || float.IsNaN(form.z) || float.IsNaN(range.x) || float.IsNaN(range.y)) + misses.Add($"af_from_iv([{lo:R}, {hi:R}]) = {form}, af_range = {range}: NaN"); + foreach (var value in new[] { lo, hi, (float)(((double)lo + hi) / 2.0) }) + { + if (!InForm(form, 0.0f, value)) + misses.Add($"af_from_iv([{lo:R}, {hi:R}]) = {form} misses {value:R}"); + if (!(range.x <= value && value <= range.y)) + misses.Add($"af_range(af_from_iv([{lo:R}, {hi:R}])) = {range} misses {value:R}"); + } + + // Tight where the answer is representable: an endpoint is no farther than 2^-18 (|lo| + |hi|) + // from the interval's, unless that bound passes the float maximum, where infinity is the answer. + var slack = Math.ScaleB(Math.Abs((double)lo) + Math.Abs((double)hi), -18) + 1.0e-37; + if ((double)lo - slack > -(double)max && range.x < (double)lo - slack) + misses.Add($"af_range(af_from_iv([{lo:R}, {hi:R}])).x = {range.x:R}, more than 2^-18 (|lo| + |hi|) under lo"); + if ((double)hi + slack < (double)max && range.y > (double)hi + slack) + misses.Add($"af_range(af_from_iv([{lo:R}, {hi:R}])).y = {range.y:R}, more than 2^-18 (|lo| + |hi|) over hi"); + } + + foreach (var a in specials) + foreach (var b in specials) + { + Check(-a, b); + Check(-Math.Max(a, b), -Math.Min(a, b)); + Check(Math.Min(a, b), Math.Max(a, b)); + } + + for (var t = 0; t < 200_000; t++) + { + var sign = random.Next(2) == 0 ? 1 : -1; + var lo = sign * BitConverter.Int32BitsToSingle(random.Next(0, random.Next(2) == 0 ? 1 << 20 : 0x00800000)); + var width = BitConverter.Int32BitsToSingle(random.Next(0, random.Next(2) == 0 ? 1 << 12 : 1 << 22)); + Check(lo, lo + width); + } + + var odd = new[] { float.PositiveInfinity, float.NegativeInfinity, float.NaN, 0.0f, 1.0f, max }; + foreach (var x0 in odd) + foreach (var a in odd) + foreach (var e in odd) + { + var range = af_range(new float3(x0, a, e)); + // The range encloses x0 -+ (|a| + e) wherever that is a number, and is the whole line on the + // side where it is not (infinity minus infinity, a NaN component): the infinity on that side. + var spread = Math.Abs((double)a) + e; + var enclosesLow = double.IsNaN(x0 - spread) ? range.x == float.NegativeInfinity : range.x <= x0 - spread; + var enclosesHigh = double.IsNaN(x0 + spread) ? range.y == float.PositiveInfinity : range.y >= x0 + spread; + if (!enclosesLow || !enclosesHigh) + misses.Add($"af_range(({x0}, {a}, {e})) = {range}"); + } + + Assert.True(misses.Count == 0, $"{misses.Count} misses:" + Environment.NewLine + string.Join(Environment.NewLine, misses.Take(8))); + } + + /// + /// af_snoise's width, pinned both ways. Over 6,000 seeded (centre, axis, radius) with reach R from 1e-3 + /// to 3 (centres in [-20, 20]^3, a third out to [-1000, 1000]^3, a third of the axes and a third of the + /// radii 0), the form is the documented rule evaluated in double from snoise_grad: x0 = n; the centred + /// form when |g . axis| + |g| radius + M R^2 / 2 is under L R (checked away from that boundary), else + /// the Lipschitz form; e = that half-width + the float32 allowance (2^-14 + 2^-12 R + L 2^-20 (|centre|_1 + R)) + /// plus the form's own rounding absorption (|n| + |a| + e) 2^-20; each of x0, a and e within a part in + /// 1e6 of it. The enclosure tests pass on an allowance or an absorption of any size on the CPU, where + /// float32 is exact; this is the test that sees them. + /// + [Fact] + public void SnoiseFormCarriesItsDocumentedWidth() + { + var u20 = Math.ScaleB(1.0, -20); + double lipschitz = SNOISE_LIPSCHITZ, hessian = SNOISE_HESSIAN; + var random = new System.Random(0xAF13); + var (centred, wide) = (0, 0); + for (var t = 0; t < 6_000; t++) + { + var spread = t % 3 == 2 ? 1000.0f : 20.0f; + var centre = new float3(Uniform(random, -spread, spread), Uniform(random, -spread, spread), Uniform(random, -spread, spread)); + var axis = random.Next(3) == 0 ? new float3(0.0f, 0.0f, 0.0f) : UnitVector(random) * LogUniform(random, 1.0e-3f, 3.0f); + var radius = random.Next(3) == 0 ? 0.0f : LogUniform(random, 1.0e-3f, 3.0f); + var g = snoise_grad(centre); + var reach = (double)length(axis) + radius; + var lip = lipschitz * reach; + var a = (double)g.x * axis.x + (double)g.y * axis.y + (double)g.z * axis.z; + var remainder = Math.Sqrt((double)g.x * g.x + (double)g.y * g.y + (double)g.z * g.z) * radius + 0.5 * hessian * reach * reach; + var allowance = Math.ScaleB(1.0, -14) + Math.ScaleB(reach, -12) + + lipschitz * u20 * (Math.Abs((double)centre.x) + Math.Abs((double)centre.y) + Math.Abs((double)centre.z) + reach); + + double Width(bool useCentred, out double slope) + { + slope = useCentred ? a : 0.0; + var e = (useCentred ? remainder : lip) + allowance; + return e + (Math.Abs((double)g.w) + Math.Abs(slope) + e) * u20; + } + + var zCentred = Width(true, out var slopeCentred); + var zLipschitz = Width(false, out _); + var form = af_snoise(centre, axis, radius); + var observedCentred = Math.Abs(form.z - zCentred) <= Math.Abs(form.z - zLipschitz); + var expectedCentred = Math.Abs(a) + remainder < lip; + if (Math.Abs(Math.Abs(a) + remainder - lip) > 1.0e-3 * lip) + Assert.True(observedCentred == expectedCentred || zCentred == zLipschitz, $"af_snoise({centre}, {axis}, {radius:R}) = {form} took the {(observedCentred ? "centred" : "Lipschitz")} form; the rule takes the {(expectedCentred ? "centred" : "Lipschitz")} one (|a| + remainder = {Math.Abs(a) + remainder:R}, L R = {lip:R})"); + var z = observedCentred ? zCentred : zLipschitz; + var slope = observedCentred ? slopeCentred : 0.0; + Assert.True(form.x == g.w, $"af_snoise({centre}, {axis}, {radius:R}).x0 = {form.x:R}, snoise = {g.w:R}"); + Assert.True(Math.Abs(form.y - slope) <= 1.0e-5 * Math.Abs((double)length(new float3(g.x, g.y, g.z)) * length(axis)) + 1.0e-12, $"af_snoise({centre}, {axis}, {radius:R}).a = {form.y:R}, g . axis = {slope:R}"); + Assert.True(Math.Abs(form.z - z) <= 1.0e-6 * z, $"af_snoise({centre}, {axis}, {radius:R}) = {form}: e is {form.z:R}, the documented rule gives {z:R}"); + centred += observedCentred ? 1 : 0; + wide += !observedCentred ? 1 : 0; + } + + output.WriteLine($"AF-REPORT af_snoise width: {centred} centred cases, {wide} Lipschitz cases"); + Assert.True(centred > 1000 && wide > 1000, $"the cases do not exercise both forms: {centred} centred, {wide} Lipschitz"); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/BatchMathTests.cs b/packages/cultmath/tests/CultMath.Tests/BatchMathTests.cs new file mode 100644 index 00000000..62280c74 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/BatchMathTests.cs @@ -0,0 +1,427 @@ +using System; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +// Stryker's mtp baseline on hands/adopt-stryker found BatchMath undefended in three ways: +// both existing tests used 2-3 particles while LaneCount >= 4, so the vector body never ran +// and only the scalar tail executed; both held y at 0 for every particle, so every y-axis +// mutation was invisible; and the guard branches (early return, negative deltaTime, length +// mismatch) were never exercised. These tests read LaneCount at runtime, use +// LaneCount * 3 + 1 particles (a non-empty vector body AND a non-empty remainder), give every +// particle distinct nonzero x and y, and pin results against a scalar reference computed here +// rather than by calling the code under test. +public sealed class BatchMathTests +{ + private const float Tolerance = 1e-4f; + + [Fact] + public void RadialFalloffMatchesScalarReferenceAcrossVectorBodyAndRemainder() + { + var lanes = BatchMath.LaneCount; + var count = lanes * 3 + 1; + Assert.True(count > lanes, "fixture must exceed one lane to exercise the vector body"); + Assert.True((count % lanes) != 0, "fixture must leave a non-empty scalar remainder"); + + var px = new float[count]; + var py = new float[count]; + var ax = new float[count]; + var ay = new float[count]; + // Distinct, asymmetric per-particle values: x and y follow different formulas so an + // x/y swap mutation is observable, and no particle sits at the falloff center. + for (var i = 0; i < count; i++) + { + px[i] = i * 1.3f - 4.0f; + py[i] = i * -0.7f + 2.5f; + } + + const float centerX = 3.0f; + const float centerY = -1.0f; + const float strength = 5.0f; + // Chosen so some particles fall inside the radius and some fall outside it, exercising + // both the ConditionalSelect(inRange, ...) vector path and the scalar "continue". + const float radius = 6.0f; + + // The scalar remainder is exactly one particle (index count-1). The generator above puts + // it far outside the radius, which would leave any y-axis mutation in the scalar tail's + // "in range" arithmetic unobserved (the only remainder particle never reaches it). Pin it + // inside the radius with a nonzero, non-degenerate y offset instead. + px[count - 1] = centerX + 2.0f; + py[count - 1] = centerY + 1.5f; + + BatchMath.AddRadialFalloffAcceleration2D(px, py, centerX, centerY, strength, radius, ax, ay); + + var insideCount = 0; + var outsideCount = 0; + for (var i = 0; i < count; i++) + { + var dx = centerX - px[i]; + var dy = centerY - py[i]; + var distanceSquared = Math.Max(dx * dx + dy * dy, 1.0e-8f); + var distance = MathF.Sqrt(distanceSquared); + + if (distance > radius) + { + outsideCount++; + Assert.Equal(0.0f, ax[i], Tolerance); + Assert.Equal(0.0f, ay[i], Tolerance); + continue; + } + + insideCount++; + var falloff = Math.Max(0.0f, 1.0f - distance / radius); + var magnitude = strength * falloff; + var expectedAx = dx / distance * magnitude; + var expectedAy = dy / distance * magnitude; + Assert.Equal(expectedAx, ax[i], Tolerance); + Assert.Equal(expectedAy, ay[i], Tolerance); + } + + Assert.True(insideCount > 0, "fixture must include particles inside the radius"); + Assert.True(outsideCount > 0, "fixture must include particles outside the radius"); + } + + [Fact] + public void RadialFalloffAccumulatesOntoExistingAcceleration() + { + // Guards against a mutation that assigns instead of accumulating: seed a nonzero + // acceleration and confirm the falloff contribution is added to it, not overwritten. + var px = new[] { 0.0f }; + var py = new[] { 0.0f }; + var ax = new[] { 10.0f }; + var ay = new[] { -20.0f }; + + BatchMath.AddRadialFalloffAcceleration2D(px, py, 1.0f, 0.0f, 4.0f, 8.0f, ax, ay); + + var dx = 1.0f - 0.0f; + var dy = 0.0f - 0.0f; + var distance = MathF.Sqrt(dx * dx + dy * dy); + var falloff = Math.Max(0.0f, 1.0f - distance / 8.0f); + var magnitude = 4.0f * falloff; + Assert.Equal(10.0f + dx / distance * magnitude, ax[0], Tolerance); + Assert.Equal(-20.0f + dy / distance * magnitude, ay[0], Tolerance); + } + + [Fact] + public void RadialFalloffValidatesEqualSpanLengths() + { + var px = new float[3]; + var py = new float[2]; + var ax = new float[3]; + var ay = new float[3]; + + Assert.Throws(() => + BatchMath.AddRadialFalloffAcceleration2D(px, py, 0.0f, 0.0f, 1.0f, 1.0f, ax, ay)); + } + + [Fact] + public void RadialFalloffIsNoOpWhenRadiusIsNonPositive() + { + var px = new[] { 1.0f, 2.0f }; + var py = new[] { 3.0f, -4.0f }; + var ax = new[] { 5.0f, 6.0f }; + var ay = new[] { 7.0f, 8.0f }; + + BatchMath.AddRadialFalloffAcceleration2D(px, py, 0.0f, 0.0f, 9.0f, 0.0f, ax, ay); + + Assert.Equal(new[] { 5.0f, 6.0f }, ax); + Assert.Equal(new[] { 7.0f, 8.0f }, ay); + } + + [Fact] + public void RadialFalloffIsNoOpWhenStrengthIsZero() + { + var px = new[] { 1.0f, 2.0f }; + var py = new[] { 3.0f, -4.0f }; + var ax = new[] { 5.0f, 6.0f }; + var ay = new[] { 7.0f, 8.0f }; + + BatchMath.AddRadialFalloffAcceleration2D(px, py, 0.0f, 0.0f, 0.0f, 10.0f, ax, ay); + + Assert.Equal(new[] { 5.0f, 6.0f }, ax); + Assert.Equal(new[] { 7.0f, 8.0f }, ay); + } + + [Fact] + public void RadialFalloffIsNoOpWhenSpansAreEmpty() + { + var px = Array.Empty(); + var py = Array.Empty(); + var ax = Array.Empty(); + var ay = Array.Empty(); + + // Must not throw for a valid but degenerate zero-length batch. + BatchMath.AddRadialFalloffAcceleration2D(px, py, 0.0f, 0.0f, 1.0f, 1.0f, ax, ay); + + Assert.Empty(ax); + Assert.Empty(ay); + } + + [Fact] + public void EulerIntegrationMatchesScalarReferenceAcrossVectorBodyAndRemainder() + { + var lanes = BatchMath.LaneCount; + var count = lanes * 3 + 1; + Assert.True((count % lanes) != 0, "fixture must leave a non-empty scalar remainder"); + + const float deltaTime = 0.25f; + var dynamicMask = new float[count]; + var px = new float[count]; + var py = new float[count]; + var vx = new float[count]; + var vy = new float[count]; + var ax = new float[count]; + var ay = new float[count]; + + for (var i = 0; i < count; i++) + { + // Every third particle is frozen (mask 0) so the mask branch is exercised across + // both the vector body and the remainder, not only at the array's edges. + dynamicMask[i] = i % 3 == 0 ? 0.0f : 1.0f; + px[i] = i * 0.4f - 1.0f; + py[i] = i * -0.6f + 3.0f; + vx[i] = i * 0.2f + 1.0f; + vy[i] = i * -0.3f - 2.0f; + ax[i] = i * 0.5f - 2.5f; + ay[i] = i * -0.9f + 1.5f; + } + + // The scalar remainder is exactly one particle (index count-1). The mask pattern above + // would leave it frozen for lane counts divisible by 3, which masks every y-axis (and + // x-axis) mutation in the scalar tail's arithmetic to zero regardless of the mutation. + // Force it dynamic so the remainder actually exercises the scalar tail's math. + dynamicMask[count - 1] = 1.0f; + + // Independent copies for the scalar reference; the arrays under test are mutated in place. + var expectedPx = (float[])px.Clone(); + var expectedPy = (float[])py.Clone(); + var expectedVx = (float[])vx.Clone(); + var expectedVy = (float[])vy.Clone(); + + BatchMath.IntegrateSemiImplicitEuler2D(deltaTime, dynamicMask, px, py, vx, vy, ax, ay); + + var anyFrozen = false; + var anyMoving = false; + for (var i = 0; i < count; i++) + { + var mask = dynamicMask[i]; + expectedVx[i] += ax[i] * deltaTime * mask; + expectedVy[i] += ay[i] * deltaTime * mask; + expectedPx[i] += expectedVx[i] * deltaTime * mask; + expectedPy[i] += expectedVy[i] * deltaTime * mask; + + if (mask == 0.0f) anyFrozen = true; else anyMoving = true; + + Assert.Equal(expectedVx[i], vx[i], Tolerance); + Assert.Equal(expectedVy[i], vy[i], Tolerance); + Assert.Equal(expectedPx[i], px[i], Tolerance); + Assert.Equal(expectedPy[i], py[i], Tolerance); + } + + Assert.True(anyFrozen, "fixture must include masked-off (frozen) particles"); + Assert.True(anyMoving, "fixture must include dynamic particles"); + } + + [Fact] + public void EulerIntegrationRejectsNonPositiveDeltaTime() + { + var dynamicMask = new[] { 1.0f }; + var px = new[] { 0.0f }; + var py = new[] { 0.0f }; + var vx = new[] { 0.0f }; + var vy = new[] { 0.0f }; + var ax = new[] { 0.0f }; + var ay = new[] { 0.0f }; + + Assert.Throws(() => + BatchMath.IntegrateSemiImplicitEuler2D(0.0f, dynamicMask, px, py, vx, vy, ax, ay)); + Assert.Throws(() => + BatchMath.IntegrateSemiImplicitEuler2D(-1.0f, dynamicMask, px, py, vx, vy, ax, ay)); + } + + [Fact] + public void EulerIntegrationValidatesEqualSpanLengths() + { + var dynamicMask = new float[3]; + var px = new float[3]; + var py = new float[3]; + var vx = new float[2]; + var vy = new float[3]; + var ax = new float[3]; + var ay = new float[3]; + + Assert.Throws(() => + BatchMath.IntegrateSemiImplicitEuler2D(0.5f, dynamicMask, px, py, vx, vy, ax, ay)); + } + + [Fact] + public void Float2RadialFalloffMatchesScalarReferenceWithNonzeroYAndOutOfRangeParticles() + { + var count = 5; + var positions = new float2[count]; + for (var i = 0; i < count; i++) + { + positions[i] = new float2(i * 1.1f - 2.0f, i * -0.8f + 1.0f); + } + + var center = new float2(1.5f, -0.5f); + const float strength = 3.0f; + const float radius = 3.0f; + var acceleration = new float2[count]; + + BatchMath.AddRadialFalloffAcceleration2D(positions, center, strength, radius, acceleration); + + var insideCount = 0; + var outsideCount = 0; + for (var i = 0; i < count; i++) + { + var delta = center - positions[i]; + var distanceSquared = Math.Max(delta.x * delta.x + delta.y * delta.y, 1.0e-8f); + var distance = MathF.Sqrt(distanceSquared); + + if (distance > radius) + { + outsideCount++; + Assert.Equal(0.0f, acceleration[i].x, Tolerance); + Assert.Equal(0.0f, acceleration[i].y, Tolerance); + continue; + } + + insideCount++; + var falloff = Math.Max(0.0f, 1.0f - distance / radius); + var expected = delta / distance * (strength * falloff); + Assert.Equal(expected.x, acceleration[i].x, Tolerance); + Assert.Equal(expected.y, acceleration[i].y, Tolerance); + } + + Assert.True(insideCount > 0, "fixture must include particles inside the radius"); + Assert.True(outsideCount > 0, "fixture must include particles outside the radius"); + } + + [Fact] + public void Float2RadialFalloffAccumulatesOntoExistingAcceleration() + { + // Guards against a mutation that assigns instead of accumulating (BatchMath.cs:115): + // seed a nonzero, per-element-distinct acceleration and confirm the falloff + // contribution is added to it, not overwritten. An out-of-range particle must be left + // exactly at its seed value, not reset to zero. + var count = 5; + var positions = new float2[count]; + var seedAcceleration = new float2[count]; + for (var i = 0; i < count; i++) + { + positions[i] = new float2(i * 1.1f - 2.0f, i * -0.8f + 1.0f); + seedAcceleration[i] = new float2(i * 2.3f + 4.0f, i * -1.7f - 6.0f); + } + + var center = new float2(1.5f, -0.5f); + const float strength = 3.0f; + const float radius = 3.0f; + var acceleration = (float2[])seedAcceleration.Clone(); + + BatchMath.AddRadialFalloffAcceleration2D(positions, center, strength, radius, acceleration); + + var insideCount = 0; + var outsideCount = 0; + for (var i = 0; i < count; i++) + { + var delta = center - positions[i]; + var distanceSquared = Math.Max(delta.x * delta.x + delta.y * delta.y, 1.0e-8f); + var distance = MathF.Sqrt(distanceSquared); + + if (distance > radius) + { + outsideCount++; + Assert.Equal(seedAcceleration[i].x, acceleration[i].x, Tolerance); + Assert.Equal(seedAcceleration[i].y, acceleration[i].y, Tolerance); + continue; + } + + insideCount++; + var falloff = Math.Max(0.0f, 1.0f - distance / radius); + var contribution = delta / distance * (strength * falloff); + Assert.Equal(seedAcceleration[i].x + contribution.x, acceleration[i].x, Tolerance); + Assert.Equal(seedAcceleration[i].y + contribution.y, acceleration[i].y, Tolerance); + } + + Assert.True(insideCount > 0, "fixture must include particles inside the radius"); + Assert.True(outsideCount > 0, "fixture must include particles outside the radius"); + } + + [Fact] + public void Float2EulerIntegrationMatchesScalarReferenceWithNonzeroYAndMask() + { + const float deltaTime = 0.2f; + var dynamicMask = new[] { 1.0f, 0.0f, 1.0f }; + var position = new[] { new float2(0.0f, 0.0f), new float2(1.0f, 1.0f), new float2(-2.0f, 3.0f) }; + var velocity = new[] { new float2(1.0f, -1.0f), new float2(2.0f, 2.0f), new float2(-1.0f, 0.5f) }; + var acceleration = new[] { new float2(0.5f, 1.5f), new float2(3.0f, -3.0f), new float2(2.0f, -0.5f) }; + + var expectedPosition = (float2[])position.Clone(); + var expectedVelocity = (float2[])velocity.Clone(); + + BatchMath.IntegrateSemiImplicitEuler2D(deltaTime, dynamicMask, position, velocity, acceleration); + + for (var i = 0; i < position.Length; i++) + { + var mask = dynamicMask[i]; + expectedVelocity[i] += acceleration[i] * deltaTime * mask; + expectedPosition[i] += expectedVelocity[i] * deltaTime * mask; + + Assert.Equal(expectedVelocity[i].x, velocity[i].x, Tolerance); + Assert.Equal(expectedVelocity[i].y, velocity[i].y, Tolerance); + Assert.Equal(expectedPosition[i].x, position[i].x, Tolerance); + Assert.Equal(expectedPosition[i].y, position[i].y, Tolerance); + } + } + + [Fact] + public void Float2EulerIntegrationRejectsNonPositiveDeltaTime() + { + var dynamicMask = new[] { 1.0f }; + var position = new[] { float2.zero }; + var velocity = new[] { float2.zero }; + var acceleration = new[] { float2.zero }; + + Assert.Throws(() => + BatchMath.IntegrateSemiImplicitEuler2D(0.0f, dynamicMask, position, velocity, acceleration)); + } + + [Fact] + public void Float2EulerIntegrationValidatesEqualSpanLengths() + { + var dynamicMask = new float[3]; + var position = new float2[3]; + var velocity = new float2[2]; + var acceleration = new float2[3]; + + Assert.Throws(() => + BatchMath.IntegrateSemiImplicitEuler2D(0.5f, dynamicMask, position, velocity, acceleration)); + } + + [Fact] + public void Float2RadialFalloffValidatesEqualSpanLengths() + { + var positions = new float2[3]; + var acceleration = new float2[2]; + + Assert.Throws(() => + BatchMath.AddRadialFalloffAcceleration2D(positions, float2.zero, 1.0f, 1.0f, acceleration)); + } + + [Fact] + public void Float2RadialFalloffIsNoOpWhenRadiusIsNonPositiveOrStrengthIsZero() + { + var positions = new[] { new float2(1.0f, 3.0f), new float2(2.0f, -4.0f) }; + var acceleration = new[] { new float2(5.0f, 7.0f), new float2(6.0f, 8.0f) }; + + BatchMath.AddRadialFalloffAcceleration2D(positions, float2.zero, 9.0f, 0.0f, acceleration); + Assert.Equal(new float2(5.0f, 7.0f), acceleration[0]); + Assert.Equal(new float2(6.0f, 8.0f), acceleration[1]); + + BatchMath.AddRadialFalloffAcceleration2D(positions, float2.zero, 0.0f, 10.0f, acceleration); + Assert.Equal(new float2(5.0f, 7.0f), acceleration[0]); + Assert.Equal(new float2(6.0f, 8.0f), acceleration[1]); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresBaseTraces.cs b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresBaseTraces.cs new file mode 100644 index 00000000..fc20695a --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresBaseTraces.cs @@ -0,0 +1,612 @@ +using System.Collections.Generic; + +namespace CultMath.Tests; + +// The decisions of the base commit dbcb2a8e (BoundedLeastSquares.cs with the same events added at the same points, nothing else changed) +// on the BlsTrace cases. Head must reproduce every line. +internal static class BlsBaseTraces +{ + internal static readonly Dictionary Expected = new() + { + ["tie-pair"] = """ + Candidate 0 1 6.661338147750939E-16 1E-06 + Release 0 Infinity 0 0 + Kkt -1 1E-06 0 0 + end Converged 1 3f800000 00000000 + """, + ["tie-triple"] = """ + Candidate 0 2 1.7763568394002505E-15 2E-06 + Release 0 Infinity 0 0 + Kkt -1 2E-06 0 0 + end Converged 1 3f800000 00000000 00000000 + """, + ["tie-pair-cap-0"] = """ + Candidate 0 1 6.661338147750939E-16 1E-06 + Release 0 Infinity 0 0 + Cap -1 0 0 0 + end IterationLimit 0 00000000 00000000 + """, + ["tie-pair-at-hi"] = """ + Candidate 0 3 1.9984014443252818E-15 1E-06 + Release 0 Infinity 0 0 + Step 0 0.3333333333333333 0 0 + Candidate 1 2 1.3322676295501878E-15 1E-06 + Release 1 Infinity 0 0 + Step 1 0.5 0 0 + Kkt -1 1E-06 0 0 + end Converged 4 00000000 00000000 + """, + ["step-lands-on-bound"] = """ + Kkt -1 1E-06 0 0 + end Converged 0 3f800000 + """, + ["step-blocked"] = """ + Step 0 0.2 0 0 + Kkt -1 3E-06 0 0 + end Converged 1 3f800000 bf000000 + """, + ["w5-shift0-1e-12"] = """ + Candidate 1 135111.75592265668 3.900108740394563E-10 1.5002178145105112E-07 + Candidate 7 137847.8859493429 3.97908931879844E-10 135111.75592265668 + Release 7 Infinity 0 0 + Step 7 0.4366038070185627 0 0 + Candidate 1 76194.22899199842 5.600810209156691E-10 1.5002178145105112E-07 + Release 1 Infinity 0 0 + Step 1 0.7573476181786473 0 0 + Candidate 2 11849.84792945953 4.782591048738879E-10 1.5002178145105112E-07 + Candidate 4 17935.626996204504 7.122810428200547E-10 11849.84792945953 + Release 4 Infinity 0 0 + Candidate 0 633.4374486887755 6.019496088675069E-10 1.5002178145105112E-07 + Candidate 3 776.2927740423111 8.68340538093788E-10 633.4374486887755 + Candidate 11 2665.4946252912787 3.120333456889181E-11 776.2927740423111 + Release 11 Infinity 0 0 + Candidate 0 0.2169954634180158 6.022639451081885E-10 1.5002178145105112E-07 + Candidate 3 0.26539156234684924 8.683991289001988E-10 0.2169954634180158 + Release 3 Infinity 0 0 + Step 4 0.06907420089782461 0 0 + Candidate 0 0.0362638246792244 7.758593413765183E-10 1.5002178145105112E-07 + Candidate 2 0.0760455647832714 6.59955603932088E-10 0.0362638246792244 + Candidate 5 0.1938752159811088 5.480900325737566E-11 0.0760455647832714 + Release 5 Infinity 0 0 + Step 11 0.03215405619865555 0 0 + Candidate 0 0.004646654699172359 7.758594326420045E-10 1.5002178145105112E-07 + Candidate 1 0.008483701902150642 9.999787174674693E-10 0.004646654699172359 + Candidate 4 0.01007973030937137 9.812607064514548E-10 0.008483701902150642 + Release 4 Infinity 0 0 + Candidate 0 0.0032877034464036115 6.980323623931817E-10 1.5002178145105112E-07 + Release 0 Infinity 0 0 + Candidate 2 0.002053476287983358 6.004885051312699E-10 1.5002178145105112E-07 + Release 2 Infinity 0 0 + Candidate 7 0.0014518519601551816 9.294667933498287E-10 1.5002178145105112E-07 + Release 7 Infinity 0 0 + Kkt -1 1.5002178145105112E-07 0 0 + end Converged 14 3e64b5b7 3f800000 3477cb66 3e0efa90 3f48c5cd 3f44d339 00000000 3f6c163f 00000000 00000000 00000000 00000000 + """, + ["w5-shift1-1e-12"] = """ + Candidate 0 6737.644464075565 1.9448748840962782E-11 1.5002178145105112E-07 + Candidate 2 135111.75592265668 3.900108740394563E-10 6737.644464075565 + Candidate 8 137847.8859493429 3.97908931879844E-10 135111.75592265668 + Release 8 Infinity 0 0 + Step 8 0.4366038070185627 0 0 + Candidate 0 5151.85545116663 2.402625547421844E-11 1.5002178145105112E-07 + Candidate 2 76194.22899199842 5.600810209156691E-10 5151.85545116663 + Release 2 Infinity 0 0 + Step 2 0.7573476181786473 0 0 + Candidate 0 3065.16054302454 3.0049666978425744E-11 1.5002178145105112E-07 + Candidate 3 11849.84792945953 4.782591048738879E-10 3065.16054302454 + Candidate 5 17935.626996204504 7.122810428200547E-10 11849.84792945953 + Release 5 Infinity 0 0 + Candidate 0 2665.4946252912787 3.120333456889181E-11 1.5002178145105112E-07 + Release 0 Infinity 0 0 + Candidate 1 0.21699546342279064 6.022639451081885E-10 1.5002178145105112E-07 + Candidate 4 0.2653915623377543 8.683991289001988E-10 0.21699546342279064 + Release 4 Infinity 0 0 + Step 5 0.06907420086992105 0 0 + Candidate 1 0.0362638246951974 7.758593413765183E-10 1.5002178145105112E-07 + Candidate 3 0.07604556476871949 6.59955603932088E-10 0.0362638246951974 + Candidate 6 0.19387521598218882 5.480900325737565E-11 0.07604556476871949 + Release 6 Infinity 0 0 + Step 0 0.03215405619799004 0 0 + Candidate 1 0.004646654706448317 7.758594326420045E-10 1.5002178145105112E-07 + Candidate 2 0.0084837019094266 9.999787174674693E-10 0.004646654706448317 + Candidate 5 0.010079730302095413 9.812607064514548E-10 0.0084837019094266 + Release 5 Infinity 0 0 + Candidate 1 0.0032877034464036115 6.98032362558651E-10 1.5002178145105112E-07 + Release 1 Infinity 0 0 + Candidate 3 0.0020534762807074003 6.004885049847546E-10 1.5002178145105112E-07 + Release 3 Infinity 0 0 + Candidate 8 0.0014518519383273087 9.294667932478118E-10 1.5002178145105112E-07 + Release 8 Infinity 0 0 + Kkt -1 1.5002178145105112E-07 0 0 + end Converged 14 00000000 3e64b5b7 3f800000 3477cb66 3e0efa90 3f48c5cd 3f44d339 00000000 3f6c163f 00000000 00000000 00000000 + """, + ["w5-shift5-1e-12"] = """ + Candidate 0 137847.8859493429 3.97908931879844E-10 1.5002178145105112E-07 + Release 0 Infinity 0 0 + Step 0 0.4366038070185627 0 0 + Candidate 4 5151.85545116663 2.402625547421844E-11 1.5002178145105112E-07 + Candidate 6 76194.22899199842 5.600810209156691E-10 5151.85545116663 + Release 6 Infinity 0 0 + Step 6 0.7573476181786473 0 0 + Candidate 4 3065.16054302454 3.0049666978425744E-11 1.5002178145105112E-07 + Candidate 7 11849.84792945953 4.782591048738879E-10 3065.16054302454 + Candidate 9 17935.626996204504 7.122810428200548E-10 11849.84792945953 + Release 9 Infinity 0 0 + Candidate 4 2665.4946252912787 3.120333456889181E-11 1.5002178145105112E-07 + Release 4 Infinity 0 0 + Candidate 5 0.21699546341733367 6.022639451081885E-10 1.5002178145105112E-07 + Candidate 8 0.26539156235958217 8.683991289001988E-10 0.21699546341733367 + Release 8 Infinity 0 0 + Step 9 0.06907420085879441 0 0 + Candidate 5 0.03626382468792144 7.758593413765183E-10 1.5002178145105112E-07 + Candidate 7 0.07604556476871949 6.59955603932088E-10 0.03626382468792144 + Candidate 10 0.19387521598173407 5.480900325737565E-11 0.07604556476871949 + Release 10 Infinity 0 0 + Step 4 0.03215405619816462 0 0 + Candidate 0 0.009507730177574558 1.0214105219138004E-09 1.5002178145105112E-07 + Candidate 9 0.01007973029754794 9.81260706451455E-10 0.009507730177574558 + Release 9 Infinity 0 0 + Candidate 0 0.0016777917876424908 9.191744022622724E-10 1.5002178145105112E-07 + Candidate 5 0.003287703438218159 6.980323624876057E-10 0.0016777917876424908 + Release 5 Infinity 0 0 + Candidate 0 0.0014518512944050599 9.29466768014945E-10 1.5002178145105112E-07 + Candidate 7 0.0020534762884381053 6.004885050882204E-10 0.0014518512944050599 + Release 7 Infinity 0 0 + Candidate 0 0.0014518519615194236 9.294667933556894E-10 1.5002178145105112E-07 + Release 0 Infinity 0 0 + Kkt -1 1.5002178145105112E-07 0 0 + end Converged 14 3f6c163f 00000000 00000000 00000000 00000000 3e64b5b7 3f800000 3477cb66 3e0efa90 3f48c5cd 3f44d339 00000000 + """, + ["w5-shift7-1e-12"] = """ + Candidate 1 67022.28908552075 1.9346519011515402E-10 1.5002178145105112E-07 + Candidate 2 137847.8859493429 3.97908931879844E-10 67022.28908552075 + Release 2 Infinity 0 0 + Step 2 0.4366038070185627 0 0 + Candidate 1 37467.36481177385 2.7877783940654753E-10 1.5002178145105112E-07 + Candidate 8 76194.22899199842 5.600810209156691E-10 37467.36481177385 + Release 8 Infinity 0 0 + Step 8 0.7573476181786473 0 0 + Candidate 1 8650.132742734299 3.6196108123398433E-10 1.5002178145105112E-07 + Candidate 9 11849.84792945953 4.782591048738879E-10 8650.132742734299 + Candidate 11 17935.626996204504 7.122810428200548E-10 11849.84792945953 + Release 11 Infinity 0 0 + Candidate 0 610.3107119330159 4.058698497767296E-11 1.5002178145105112E-07 + Candidate 6 2665.4946252912787 3.120333456889181E-11 610.3107119330159 + Release 6 Infinity 0 0 + Candidate 0 0.21130910008525916 4.2238488714754606E-11 1.5002178145105112E-07 + Candidate 7 0.21699546341733367 6.022639451081885E-10 0.21130910008525916 + Candidate 10 0.26539156235958217 8.683991289001988E-10 0.21699546341733367 + Release 10 Infinity 0 0 + Step 11 0.06907420085879441 0 0 + Candidate 0 0.19387521598173407 5.480900325737565E-11 1.5002178145105112E-07 + Release 0 Infinity 0 0 + Step 6 0.032154056198701104 0 0 + Candidate 2 0.00950773017393658 1.0214105219138004E-09 1.5002178145105112E-07 + Candidate 11 0.01007973030937137 9.81260706451455E-10 0.00950773017393658 + Release 11 Infinity 0 0 + Candidate 2 0.0016777917990111746 9.191744022547622E-10 1.5002178145105112E-07 + Candidate 7 0.003287703439127654 6.980323624818886E-10 0.0016777917990111746 + Release 7 Infinity 0 0 + Candidate 2 0.0014518512834911235 9.2946676790583E-10 1.5002178145105112E-07 + Candidate 9 0.0020534762988972943 6.004885050176478E-10 0.0014518512834911235 + Release 9 Infinity 0 0 + Candidate 2 0.0014518519601551816 9.294667935855503E-10 1.5002178145105112E-07 + Release 2 Infinity 0 0 + Kkt -1 1.5002178145105112E-07 0 0 + end Converged 14 3f44d339 00000000 3f6c163f 00000000 00000000 00000000 00000000 3e64b5b7 3f800000 3477cb66 3e0efa90 3f48c5cd + """, + ["w5-shift11-1e-12"] = """ + Candidate 0 135111.75592265668 3.900108740394563E-10 1.5002178145105112E-07 + Candidate 6 137847.8859493429 3.97908931879844E-10 135111.75592265668 + Release 6 Infinity 0 0 + Step 6 0.4366038070185627 0 0 + Candidate 0 76194.22899199842 5.600810209156691E-10 1.5002178145105112E-07 + Release 0 Infinity 0 0 + Step 0 0.7573476181786473 0 0 + Candidate 1 11849.84792945953 4.782591048738879E-10 1.5002178145105112E-07 + Candidate 3 17935.626996204504 7.122810428200547E-10 11849.84792945953 + Release 3 Infinity 0 0 + Candidate 2 776.2927740423111 8.68340538093788E-10 1.5002178145105112E-07 + Candidate 10 2665.4946252912787 3.120333456889181E-11 776.2927740423111 + Release 10 Infinity 0 0 + Candidate 2 0.26539156234684924 8.683991289001988E-10 1.5002178145105112E-07 + Release 2 Infinity 0 0 + Step 3 0.06907420089782461 0 0 + Candidate 1 0.0760455647832714 6.59955603932088E-10 1.5002178145105112E-07 + Candidate 4 0.1938752159811088 5.480900325737566E-11 0.0760455647832714 + Release 4 Infinity 0 0 + Step 10 0.03215405619865555 0 0 + Candidate 0 0.008483701902150642 9.999787174674693E-10 1.5002178145105112E-07 + Candidate 3 0.01007973030937137 9.812607064514548E-10 0.008483701902150642 + Release 3 Infinity 0 0 + Candidate 1 0.001579840580234304 5.938316649352929E-10 1.5002178145105112E-07 + Candidate 6 0.0016777917771833017 9.191744021382341E-10 0.001579840580234304 + Candidate 11 0.0032877034464036115 6.980323623931817E-10 0.0016777917771833017 + Release 11 Infinity 0 0 + Candidate 1 0.002053476281616895 6.004885051443822E-10 1.5002178145105112E-07 + Release 1 Infinity 0 0 + Candidate 6 0.0014518519456032664 9.29466793204687E-10 1.5002178145105112E-07 + Release 6 Infinity 0 0 + Kkt -1 1.5002178145105112E-07 0 0 + end Converged 14 3f800000 3477cb66 3e0efa90 3f48c5cd 3f44d339 00000000 3f6c163f 00000000 00000000 00000000 00000000 3e64b5b7 + """, + ["w5-default"] = """ + Candidate 1 135111.75592265668 3.900108740394563E-10 0.1500217814510511 + Candidate 7 137847.8859493429 3.97908931879844E-10 135111.75592265668 + Release 7 Infinity 0 0 + Step 7 0.4366038070185627 0 0 + Candidate 1 76194.22899199842 5.600810209156691E-10 0.1500217814510511 + Release 1 Infinity 0 0 + Step 1 0.7573476181786473 0 0 + Candidate 2 11849.84792945953 4.782591048738879E-10 0.1500217814510511 + Candidate 4 17935.626996204504 7.122810428200547E-10 11849.84792945953 + Release 4 Infinity 0 0 + Candidate 0 633.4374486887755 6.019496088675069E-10 0.1500217814510511 + Candidate 3 776.2927740423111 8.68340538093788E-10 633.4374486887755 + Candidate 11 2665.4946252912787 3.120333456889181E-11 776.2927740423111 + Release 11 Infinity 0 0 + Candidate 0 0.2169954634180158 6.022639451081885E-10 0.1500217814510511 + Candidate 3 0.26539156234684924 8.683991289001988E-10 0.2169954634180158 + Release 3 Infinity 0 0 + Step 4 0.06907420089782461 0 0 + Candidate 5 0.1938752159811088 5.480900325737566E-11 0.1500217814510511 + Release 5 Infinity 0 0 + Step 11 0.03215405619865555 0 0 + Kkt -1 0.1500217814510511 0 0 + end Converged 10 00000000 3f800000 00000000 3f122168 3f800000 3ee2570c 00000000 3f800000 00000000 00000000 00000000 00000000 + """, + ["w5-1e-9"] = """ + Candidate 1 135111.75592265668 3.900108740394563E-10 0.00015002178145105113 + Candidate 7 137847.8859493429 3.97908931879844E-10 135111.75592265668 + Release 7 Infinity 0 0 + Step 7 0.4366038070185627 0 0 + Candidate 1 76194.22899199842 5.600810209156691E-10 0.00015002178145105113 + Release 1 Infinity 0 0 + Step 1 0.7573476181786473 0 0 + Candidate 2 11849.84792945953 4.782591048738879E-10 0.00015002178145105113 + Candidate 4 17935.626996204504 7.122810428200547E-10 11849.84792945953 + Release 4 Infinity 0 0 + Candidate 0 633.4374486887755 6.019496088675069E-10 0.00015002178145105113 + Candidate 3 776.2927740423111 8.68340538093788E-10 633.4374486887755 + Candidate 11 2665.4946252912787 3.120333456889181E-11 776.2927740423111 + Release 11 Infinity 0 0 + Candidate 0 0.2169954634180158 6.022639451081885E-10 0.00015002178145105113 + Candidate 3 0.26539156234684924 8.683991289001988E-10 0.2169954634180158 + Release 3 Infinity 0 0 + Step 4 0.06907420089782461 0 0 + Candidate 0 0.0362638246792244 7.758593413765183E-10 0.00015002178145105113 + Candidate 2 0.0760455647832714 6.59955603932088E-10 0.0362638246792244 + Candidate 5 0.1938752159811088 5.480900325737566E-11 0.0760455647832714 + Release 5 Infinity 0 0 + Step 11 0.03215405619865555 0 0 + Candidate 0 0.004646654699172359 7.758594326420045E-10 0.00015002178145105113 + Candidate 1 0.008483701902150642 9.999787174674693E-10 0.004646654699172359 + Candidate 4 0.01007973030937137 9.812607064514548E-10 0.008483701902150642 + Release 4 Infinity 0 0 + Candidate 0 0.0032877034464036115 6.980323623931817E-10 0.00015002178145105113 + Release 0 Infinity 0 0 + Candidate 2 0.002053476287983358 6.004885051312699E-10 0.00015002178145105113 + Release 2 Infinity 0 0 + Candidate 7 0.0014518519601551816 9.294667933498287E-10 0.00015002178145105113 + Release 7 Infinity 0 0 + Kkt -1 0.00015002178145105113 0 0 + end Converged 14 3e64b5b7 3f800000 3477cb66 3e0efa90 3f48c5cd 3f44d339 00000000 3f6c163f 00000000 00000000 00000000 00000000 + """, + ["w5-cap-3"] = """ + Candidate 1 135111.75592265668 3.900108740394563E-10 1.5002178145105112E-07 + Candidate 7 137847.8859493429 3.97908931879844E-10 135111.75592265668 + Release 7 Infinity 0 0 + Step 7 0.4366038070185627 0 0 + Candidate 1 76194.22899199842 5.600810209156691E-10 1.5002178145105112E-07 + Release 1 Infinity 0 0 + Cap -1 0 0 0 + end IterationLimit 3 00000000 00000000 00000000 00000000 00000000 00000000 00000000 3f800000 00000000 00000000 00000000 00000000 + """, + ["confirm-pass-1"] = """ + Candidate 0 1.579785345010647 1.070372468301927E-15 3.4029892871621996E-11 + Candidate 1 267440.9365187891 1.7819678819499464E-10 1.579785345010647 + Release 1 Infinity 0 0 + Miss -1 -0.013847553852146902 Infinity 1.3847553852146903E-17 + Kkt -1 3.4029892871621996E-11 0 0 + end Converged 2 bf800000 b7d8d9d8 + """, + ["confirm-pass-2"] = """ + Candidate 0 459906.13776790636 3.064812525589559E-10 9.174025280630848E-11 + Release 0 Infinity 0 0 + Miss -1 -0.009148166097177548 Infinity 9.148166097177549E-18 + Kkt -1 9.174025280630848E-11 0 0 + end Converged 2 b9511fc3 00000000 + """, + ["noise-one-heavy"] = """ + Step 2 0.024621369447167075 0 0 + Candidate 5 0.012439710770288478 7.959493583159782E-17 0 + Release 5 Infinity 0 0 + Miss -1 6.382790758681003E-20 Infinity 3.5111012909447177E-34 + Candidate 2 1.7763568394002505E-14 5.656022558163373E-13 0 + Candidate 3 1.5178830414797062E-18 6.655962418338423E-17 0 + Miss -1 4.449537197592434E-20 6.382790758681003E-20 4.4495371975924343E-35 + Candidate 2 2.842170943040401E-14 5.656022558163373E-13 0 + Candidate 3 2.6020852139652106E-18 6.655962418338423E-17 0 + Miss -1 4.3626178182815784E-20 4.449537197592434E-20 8.122105116216791E-35 + Candidate 2 2.4868995751603507E-14 5.656022558163373E-13 0 + Candidate 3 2.168404344971009E-18 6.655962418338423E-17 0 + Stall -1 4.5923297824441354E-20 4.3626178182815784E-20 5.911346354815417E-35 + end Converged 5 bcd3d632 00000000 b56215c6 bd1ed80d 00000000 3c154621 + """, + ["noise-one-light"] = """ + Step 2 0.024621369199885876 0 0 + Candidate 5 12.439710484934402 7.959493151937227E-14 0 + Release 5 Infinity 0 0 + Candidate 2 1.164670302474663E-20 5.656022762441261E-20 0 + Candidate 3 2.0650148258027912E-14 6.655962175358023E-14 0 + Miss -1 6.070552180371575E-20 Infinity 8.382049277624677E-34 + Candidate 2 4.235164736271502E-22 5.656022762441263E-20 0 + Candidate 3 2.6645352591003757E-15 6.655962175358026E-14 0 + Miss -1 2.7840962879986504E-21 6.070552180371575E-20 1.0613730890584895E-34 + Stall -1 3.341824384345746E-20 2.7840962879986504E-21 5.303670554538265E-35 + end Converged 4 b7d8ebb8 00000000 c106c1d7 b822a7fd 00000000 3718db44 + """, + ["noise-ascending"] = """ + Step 2 0.024621365926673414 0 0 + Candidate 5 1243.970980681693 7.959492843486517E-12 0 + Release 5 Infinity 0 0 + Candidate 2 8.326672684688674E-17 5.6560222323987015E-15 0 + Candidate 3 3.1086244689504383E-15 6.655962152994665E-14 0 + Miss -1 2.4960527060967552E-20 Infinity 1.0260573563230584E-34 + Candidate 3 1.5543122344752192E-15 6.655962152994665E-14 0 + Kkt -1 0 0 0 + end Converged 3 bcd3d632 00000000 b8b0a103 b822a7fd 00000000 33c3a805 + """, + ["near-singular-3"] = """ + Kkt -1 4.011347176225968E-07 0 0 + end Converged 0 cb42b27d cacc2e2d 49ac1c2a cae3caf3 4a4a8d2d 4ac85877 49e01bee 4a1115bf ca628e52 cb4f0de4 c9a80340 ca273e77 caa50c4a 498330e8 cafde285 ca5a8f4e ca576c89 ca517d14 4aa437c5 00000000 cadb0117 ca3073e4 4aab2053 4a273cf8 + """, + ["near-singular-11"] = """ + Kkt -1 8.26586030599639E-07 0 0 + end Converged 0 c9e0f987 c999e95d c9305c40 49c39403 ca2d4887 cadb1864 49752be6 ca9b41c5 ca3d7042 4a1f2341 48f59fdc 4a865715 c950dbee 4aa1e545 49f2e233 4a19c6b5 c9865f16 4a9d9500 ca24f675 4a1f7a2c ca84489a 4a7b50aa ca34c295 00000000 + """, + ["below-noise-2"] = """ + Miss -1 -0.49773013750831796 Infinity 4.994142446397116E-16 + Stall -1 -0.49747185997938986 -0.49773013750831796 4.992128425425914E-16 + end Converged 1 4a0f075c 4a068153 ca43258d c98493ab 4a2dd375 4a1d0b0b 4969536f 48b0cc93 c99ce69b c9be826d c827f0d4 c690e0d3 c9e0c560 485f7251 49c00e74 4939fadc ca264bd4 4a21483e c93e1efa 4a0a6b52 ca401661 c9df1aa4 c97ec1d5 4a134dbe + """, + ["below-noise-9"] = """ + Miss -1 -0.49865831712645864 Infinity 5.014509747560003E-16 + Stall -1 -0.49841675352897546 -0.49865831712645864 5.014635585960667E-16 + end Converged 1 c989ed22 4a0e7096 c98bf358 498c0fda 4a59e43c c82ef778 ca09dc93 c9f6326b 49feecdd c84efa98 c9155228 cac57da7 49c5dd82 49934cfe c82a770a 496d11ec 4a1a9b15 49084d80 485f9b84 4a12918f 4a0b2594 49e90cd5 c9f587a0 c92ccca9 + """, + ["boxed-conditioned"] = """ + Step 6 1.7950541723871097E-06 0 0 + Step 3 7.627008876179801E-07 0 0 + Step 7 1.2561155441158494E-05 0 0 + Step 2 2.5030117160256515E-05 0 0 + Step 4 0.00010110066197668991 0 0 + Step 0 0.0009920440120834782 0 0 + Step 1 0.004498393465636397 0 0 + Step 5 0.01208289710393302 0 0 + Candidate 3 0.14713995573185712 3.023980745569078E-16 6.053930821702194E-10 + Candidate 4 0.49326802296517885 1.1111503645474022E-15 0.14713995573185712 + Release 4 Infinity 0 0 + Step 4 0.05208634850970442 0 0 + Candidate 3 0.14559191607117922 3.023980745569078E-16 6.053930821702194E-10 + Release 3 Infinity 0 0 + Step 3 0.0045758825891475145 0 0 + Candidate 6 0.03694908965828074 8.947385886461852E-17 6.053930821702194E-10 + Candidate 7 0.04406217168160146 1.5294423693380426E-16 0.03694908965828074 + Release 7 Infinity 0 0 + Step 7 0.09930368626410971 0 0 + Candidate 6 0.035916303301579564 8.947385886461852E-17 6.053930821702194E-10 + Release 6 Infinity 0 0 + Step 6 0.007199613540050211 0 0 + Kkt -1 6.053930821702194E-10 0 0 + end Converged 16 bd4ccccd bd4ccccd 3d4ccccd bd4ccccd bd4ccccd 3d4ccccd 3d4ccccd bd4ccccd + """, + ["random-5"] = """ + Candidate 1 2.3674161062532875 2.1026878960246686E-15 2.367416106253287E-06 + Release 1 Infinity 0 0 + Candidate 2 1.1521571531355912 1.0233211195181646E-15 2.367416106253287E-06 + Release 2 Infinity 0 0 + Kkt -1 2.367416106253287E-06 0 0 + end Converged 2 00000000 3eed0d99 3e4a4f4e + """, + ["random-5-warm-hi"] = """ + Candidate 0 2.5083502579763883 2.22786256818387E-15 2.367416106253287E-06 + Candidate 2 4.168064738401132 7.758404534582419E-15 2.5083502579763883 + Release 2 Infinity 0 0 + Candidate 0 2.3851527197990436 2.11844117341457E-15 2.367416106253287E-06 + Candidate 1 3.0072430750429278 8.055628322575466E-15 2.3851527197990436 + Release 1 Infinity 0 0 + Candidate 0 1.678136149614912 1.4904843134066255E-15 2.367416106253287E-06 + Release 0 Infinity 0 0 + Step 0 0.24975695258808922 0 0 + Kkt -1 2.367416106253287E-06 0 0 + end Converged 4 00000000 3eed0d99 3e4a4f4e + """, + ["random-17"] = """ + Step 4 0.1232927301830878 0 0 + Step 2 0.7178536883498736 0 0 + Kkt -1 3.93442891781855E-06 0 0 + end Converged 2 beb31769 bee93450 bf800000 00000000 3dcccccd 00000000 bf432cd8 3c1e7a75 + """, + ["random-17-warm-hi"] = """ + Candidate 0 1.1914277145018732 1.1651190341326312E-14 3.93442891781855E-06 + Candidate 2 8.918271049237749 2.2324704556906607E-14 1.1914277145018732 + Release 2 Infinity 0 0 + Step 2 0.9608581392999689 0 0 + Candidate 0 0.12375707360068922 1.1651190341326312E-14 3.93442891781855E-06 + Candidate 1 0.46721760431143355 1.776136934146532E-14 0.12375707360068922 + Candidate 3 5.9589017943044995 1.7762048080698952E-14 0.46721760431143355 + Candidate 5 6.330922749270252 2.0454695850835226E-14 5.9589017943044995 + Release 5 Infinity 0 0 + Step 5 0.6196380883752669 0 0 + Candidate 1 1.2265685104711581 1.6243881393846015E-14 3.93442891781855E-06 + Candidate 3 4.91009654542079 1.5666114156513806E-14 1.2265685104711581 + Release 3 Infinity 0 0 + Step 3 0.4723422790325044 0 0 + Candidate 1 2.313755717662308 1.4071244908743248E-14 3.93442891781855E-06 + Release 1 Infinity 0 0 + Candidate 2 0.54389362384502 1.823003362441137E-14 3.93442891781855E-06 + Candidate 6 2.3746920633686277 6.957925871969801E-15 0.54389362384502 + Release 6 Infinity 0 0 + Candidate 7 1.5652291166895491 9.329087077889423E-15 3.93442891781855E-06 + Release 7 Infinity 0 0 + Candidate 0 0.9877280584738057 5.425941552304341E-15 3.93442891781855E-06 + Release 0 Infinity 0 0 + Kkt -1 3.93442891781855E-06 0 0 + end Converged 10 beb31769 bee93450 bf800000 00000000 3dcccccd 00000000 bf432cd8 3c1e7a75 + """, + ["random-40"] = """ + Step 0 0.6917697000772063 0 0 + Step 1 0.08710458252709695 0 0 + Step 2 0.04883630084124485 0 0 + Candidate 4 0.9459344738504001 6.568402131960035E-15 9.16596182404494E-06 + Release 4 Infinity 0 0 + Step 4 0.29527820149229345 0 0 + Kkt -1 9.16596182404494E-06 0 0 + end Converged 5 3f800000 bf800000 bf800000 00000000 3dcccccd + """, + ["random-40-warm-hi"] = """ + Candidate 1 4.718545111140088 9.652651618643102E-15 9.16596182404494E-06 + Candidate 3 5.026292374797416 1.201620793157454E-14 4.718545111140088 + Release 3 Infinity 0 0 + Step 3 0.08526897635819114 0 0 + Candidate 1 4.75316070860798 9.60653437865909E-15 9.16596182404494E-06 + Release 1 Infinity 0 0 + Candidate 2 3.678831066315437 4.901187544235657E-15 9.16596182404494E-06 + Release 2 Infinity 0 0 + Step 1 0.525739055641334 0 0 + Step 2 0.74742310322831 0 0 + Kkt -1 9.16596182404494E-06 0 0 + end Converged 6 3f800000 bf800000 bf800000 00000000 3dcccccd + """, + }; + + // The FreeViolated lines of the same cases: the free-set test is a decision the base took inline and did not record, so these + // are recorded at head. The decisions they feed (Miss, Stall, Kkt) are the base commit's above, and the structural test ties each line to them. + internal static readonly Dictionary FreeViolatedLines = new() + { + ["confirm-pass-1"] = """ + FreeViolated 1 4.191491598248831E-11 3.4029892871621996E-11 0 + """, + ["confirm-pass-2"] = """ + FreeViolated 0 9.329426120530115E-11 9.174025280630848E-11 0 + """, + ["noise-one-heavy"] = """ + FreeViolated 0 1.3877787807814457E-17 0 0 + FreeViolated 0 1.6046192152785466E-17 0 0 + FreeViolated 5 4.336808689942018E-19 0 0 + FreeViolated 0 4.336808689942018E-19 0 0 + FreeViolated 5 4.336808689942018E-19 0 0 + FreeViolated 0 1.3010426069826053E-18 0 0 + FreeViolated 5 4.336808689942018E-19 0 0 + FreeViolated 0 4.336808689942018E-19 0 0 + FreeViolated 5 2.168404344971009E-19 0 0 + """, + ["noise-one-light"] = """ + FreeViolated 0 5.684341886080802E-14 0 0 + FreeViolated 0 2.9753977059954195E-14 0 0 + FreeViolated 5 8.881784197001252E-16 0 0 + FreeViolated 0 3.9968028886505635E-15 0 0 + FreeViolated 5 2.220446049250313E-16 0 0 + FreeViolated 0 3.1086244689504383E-15 0 0 + FreeViolated 5 6.661338147750939E-16 0 0 + """, + ["noise-ascending"] = """ + FreeViolated 0 6.938893903907228E-17 0 0 + FreeViolated 0 2.6020852139652106E-18 0 0 + FreeViolated 5 1.1368683772161603E-13 0 0 + """, + ["below-noise-2"] = """ + FreeViolated 1 4.3655745685100555E-11 3.610817172344793E-14 0 + FreeViolated 2 5.4569682106375694E-12 3.610817172344793E-14 0 + FreeViolated 3 7.275957614183426E-12 3.610817172344793E-14 0 + FreeViolated 4 1.4551915228366852E-11 3.610817172344793E-14 0 + FreeViolated 5 3.2741809263825417E-11 3.610817172344793E-14 0 + FreeViolated 6 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 7 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 10 2.1827872842550278E-11 3.610817172344793E-14 0 + FreeViolated 11 1.4551915228366852E-11 3.610817172344793E-14 0 + FreeViolated 12 2.0372681319713593E-10 3.610817172344793E-14 0 + FreeViolated 14 3.637978807091713E-12 3.610817172344793E-14 0 + FreeViolated 15 4.3655745685100555E-11 3.610817172344793E-14 0 + FreeViolated 16 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 17 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 18 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 19 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 20 7.275957614183426E-12 3.610817172344793E-14 0 + FreeViolated 21 1.1641532182693481E-10 3.610817172344793E-14 0 + FreeViolated 23 1.1641532182693481E-10 3.610817172344793E-14 0 + FreeViolated 0 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 1 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 2 5.4569682106375694E-12 3.610817172344793E-14 0 + FreeViolated 3 2.1827872842550278E-11 3.610817172344793E-14 0 + FreeViolated 4 3.637978807091713E-11 3.610817172344793E-14 0 + FreeViolated 5 1.0913936421275139E-11 3.610817172344793E-14 0 + FreeViolated 7 4.3655745685100555E-11 3.610817172344793E-14 0 + FreeViolated 8 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 9 1.8189894035458565E-12 3.610817172344793E-14 0 + FreeViolated 10 2.1827872842550278E-11 3.610817172344793E-14 0 + FreeViolated 11 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 12 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 13 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 14 3.637978807091713E-12 3.610817172344793E-14 0 + FreeViolated 17 2.3283064365386963E-10 3.610817172344793E-14 0 + FreeViolated 18 3.637978807091713E-11 3.610817172344793E-14 0 + FreeViolated 19 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 20 3.637978807091713E-11 3.610817172344793E-14 0 + FreeViolated 21 5.820766091346741E-11 3.610817172344793E-14 0 + FreeViolated 22 7.275957614183426E-11 3.610817172344793E-14 0 + FreeViolated 23 2.9103830456733704E-11 3.610817172344793E-14 0 + """, + ["below-noise-9"] = """ + FreeViolated 0 1.8189894035458565E-12 5.814784892130276E-14 0 + FreeViolated 1 6.548361852765083E-11 5.814784892130276E-14 0 + FreeViolated 2 4.001776687800884E-11 5.814784892130276E-14 0 + FreeViolated 3 8.731149137020111E-11 5.814784892130276E-14 0 + FreeViolated 4 5.093170329928398E-11 5.814784892130276E-14 0 + FreeViolated 5 1.8189894035458565E-12 5.814784892130276E-14 0 + FreeViolated 6 6.548361852765083E-11 5.814784892130276E-14 0 + FreeViolated 7 2.9103830456733704E-11 5.814784892130276E-14 0 + FreeViolated 8 1.382431946694851E-10 5.814784892130276E-14 0 + FreeViolated 9 2.1827872842550278E-11 5.814784892130276E-14 0 + FreeViolated 10 4.3655745685100555E-11 5.814784892130276E-14 0 + FreeViolated 11 6.184563972055912E-11 5.814784892130276E-14 0 + FreeViolated 12 1.3642420526593924E-11 5.814784892130276E-14 0 + FreeViolated 13 6.548361852765083E-11 5.814784892130276E-14 0 + FreeViolated 14 8.003553375601768E-11 5.814784892130276E-14 0 + FreeViolated 15 1.8189894035458565E-11 5.814784892130276E-14 0 + FreeViolated 16 7.275957614183426E-11 5.814784892130276E-14 0 + FreeViolated 17 6.548361852765083E-11 5.814784892130276E-14 0 + FreeViolated 18 3.637978807091713E-11 5.814784892130276E-14 0 + FreeViolated 19 4.3655745685100555E-11 5.814784892130276E-14 0 + FreeViolated 20 1.4551915228366852E-11 5.814784892130276E-14 0 + FreeViolated 21 3.637978807091713E-11 5.814784892130276E-14 0 + FreeViolated 22 3.637978807091713E-12 5.814784892130276E-14 0 + FreeViolated 23 4.3655745685100555E-11 5.814784892130276E-14 0 + FreeViolated 0 1.000444171950221E-11 5.814784892130276E-14 0 + FreeViolated 1 1.2369127944111824E-10 5.814784892130276E-14 0 + FreeViolated 2 3.637978807091713E-11 5.814784892130276E-14 0 + FreeViolated 3 5.093170329928398E-11 5.814784892130276E-14 0 + FreeViolated 4 5.820766091346741E-11 5.814784892130276E-14 0 + FreeViolated 5 3.637978807091713E-12 5.814784892130276E-14 0 + FreeViolated 6 5.820766091346741E-11 5.814784892130276E-14 0 + FreeViolated 7 4.3655745685100555E-11 5.814784892130276E-14 0 + FreeViolated 8 1.4551915228366852E-10 5.814784892130276E-14 0 + FreeViolated 9 7.275957614183426E-12 5.814784892130276E-14 0 + FreeViolated 10 1.3096723705530167E-10 5.814784892130276E-14 0 + FreeViolated 11 5.4569682106375694E-11 5.814784892130276E-14 0 + FreeViolated 12 1.6370904631912708E-11 5.814784892130276E-14 0 + FreeViolated 13 2.1827872842550278E-11 5.814784892130276E-14 0 + FreeViolated 14 1.4551915228366852E-11 5.814784892130276E-14 0 + FreeViolated 15 2.1827872842550278E-11 5.814784892130276E-14 0 + FreeViolated 16 1.4551915228366852E-10 5.814784892130276E-14 0 + FreeViolated 17 3.637978807091713E-11 5.814784892130276E-14 0 + FreeViolated 18 8.003553375601768E-11 5.814784892130276E-14 0 + FreeViolated 19 7.275957614183426E-12 5.814784892130276E-14 0 + FreeViolated 20 2.9103830456733704E-11 5.814784892130276E-14 0 + FreeViolated 21 8.731149137020111E-11 5.814784892130276E-14 0 + FreeViolated 22 1.4551915228366852E-11 5.814784892130276E-14 0 + FreeViolated 23 1.0913936421275139E-10 5.814784892130276E-14 0 + """, + }; +} diff --git a/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTests.cs b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTests.cs new file mode 100644 index 00000000..136e6e1b --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTests.cs @@ -0,0 +1,1734 @@ +using System.Collections.Generic; +using System; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +// Fixtures are deliberately non-degenerate: A is non-square and non-identity, and b is outside A's range, +// so the unconstrained optimum has a real residual and the box actually bites. +public sealed class BoundedLeastSquaresTests +{ + private static double Cost(int m, int n, float[] a, float[] b, float[] x) + { + var c = 0.0; + for (var r = 0; r < m; r++) + { + var s = -(double)b[r]; + for (var j = 0; j < n; j++) s += (double)a[r * n + j] * x[j]; + c += s * s; + } + return c; + } + + // Gradient of 0.5*||Ax-b||^2, in double. + private static double[] Gradient(int m, int n, float[] a, float[] b, float[] x) + { + var g = new double[n]; + for (var r = 0; r < m; r++) + { + var s = -(double)b[r]; + for (var j = 0; j < n; j++) s += (double)a[r * n + j] * x[j]; + for (var j = 0; j < n; j++) g[j] += a[r * n + j] * s; + } + return g; + } + + private static double AtbScale(int m, int n, float[] a, float[] b) + { + var mx = 0.0; + for (var j = 0; j < n; j++) + { + var s = 0.0; + for (var r = 0; r < m; r++) s += (double)a[r * n + j] * b[r]; + mx = Math.Max(mx, Math.Abs(s)); + } + return 1 + mx; + } + + // Asserts feasibility and the KKT sign rule: free columns have ~zero gradient, columns at lo have + // gradient >= 0, columns at hi have gradient <= 0. + private static void AssertKkt(int m, int n, float[] a, float[] b, float[] lo, float[] hi, float[] x) + { + var g = Gradient(m, n, a, b, x); + var tol = 1e-3 * AtbScale(m, n, a, b); + for (var j = 0; j < n; j++) + { + Assert.True(x[j] >= lo[j] && x[j] <= hi[j], $"column {j} outside its box: {x[j]}"); + if (lo[j] == hi[j]) continue; + if (x[j] == lo[j]) Assert.True(g[j] >= -tol, $"column {j} at lo with gradient {g[j]}"); + else if (x[j] == hi[j]) Assert.True(g[j] <= tol, $"column {j} at hi with gradient {g[j]}"); + else Assert.True(Math.Abs(g[j]) <= tol, $"column {j} free with gradient {g[j]}"); + } + } + + // Accelerated projected gradient (FISTA) with step 1/L, L bounded by the Frobenius norm squared of A. + // Independent of the solver's active-set logic; run to a fixed point. + private static double ReferenceCost(int m, int n, float[] a, float[] b, float[] lo, float[] hi) + { + var frob = 0.0; + foreach (var v in a) frob += (double)v * v; + var step = 1.0 / Math.Max(frob, 1e-12); + var x = new double[n]; + var y = new double[n]; + var xf = new float[n]; + for (var j = 0; j < n; j++) x[j] = y[j] = Math.Clamp(0.0, lo[j], hi[j]); + var t = 1.0; + for (var it = 0; it < 100000; it++) + { + for (var j = 0; j < n; j++) xf[j] = (float)y[j]; + var g = Gradient(m, n, a, b, xf); + var moved = 0.0; + var tNext = (1.0 + Math.Sqrt(1.0 + 4.0 * t * t)) / 2.0; + for (var j = 0; j < n; j++) + { + var next = Math.Clamp(y[j] - step * g[j], lo[j], hi[j]); + moved = Math.Max(moved, Math.Abs(next - x[j])); + y[j] = next + (t - 1.0) / tNext * (next - x[j]); + x[j] = next; + } + t = tNext; + if (moved < 1e-10) break; + } + for (var j = 0; j < n; j++) xf[j] = (float)x[j]; + return Cost(m, n, a, b, xf); + } + + private static BoundedLeastSquaresStatus Solve(int m, int n, float[] a, float[] b, float[] lo, float[] hi, float[] x, + out int iterations, int maxIterations = BoundedLeastSquares.DefaultMaxIterations) + => BoundedLeastSquares.Solve(m, n, a, b, lo, hi, x, new float[BoundedLeastSquares.WorkspaceLength(n)], out iterations, maxIterations); + + private static float[] Fill(float value, int n) + { + var v = new float[n]; + Array.Fill(v, value); + return v; + } + + private static double[] NormalEquationSolution(int m, int n, float[] a, float[] b) + { + var mat = new double[n, n + 1]; + for (var i = 0; i < n; i++) + { + for (var j = 0; j < n; j++) + for (var r = 0; r < m; r++) mat[i, j] += (double)a[r * n + i] * a[r * n + j]; + for (var r = 0; r < m; r++) mat[i, n] += (double)a[r * n + i] * b[r]; + } + for (var c = 0; c < n; c++) + { + var piv = mat[c, c]; + for (var j = 0; j <= n; j++) mat[c, j] /= piv; + for (var i = 0; i < n; i++) + { + if (i == c) continue; + var f = mat[i, c]; + for (var j = 0; j <= n; j++) mat[i, j] -= f * mat[c, j]; + } + } + var x = new double[n]; + for (var i = 0; i < n; i++) x[i] = mat[i, n]; + return x; + } + + private static (int m, int n, float[] a, float[] b, float[] lo, float[] hi) RandomProblem(uint seed) + { + var rng = new CultMath.Random(seed * 7919u); + var n = rng.NextInt(2, 17); + var m = rng.NextInt(n, 25); + var a = new float[m * n]; + var b = new float[m]; + for (var i = 0; i < a.Length; i++) a[i] = rng.NextFloat(-1f, 1f); + for (var i = 0; i < m; i++) b[i] = rng.NextFloat(-3f, 3f); + var lo = new float[n]; + var hi = new float[n]; + for (var j = 0; j < n; j++) + { + switch (rng.NextInt(3)) + { + case 0: lo[j] = -1f; hi[j] = 1f; break; + case 1: lo[j] = 0f; hi[j] = 1f; break; + default: lo[j] = -0.25f; hi[j] = 0.1f; break; + } + } + return (m, n, a, b, lo, hi); + } + + private static readonly float[] A54 = + { + 1.0f, 0.3f, -0.2f, + 0.2f, 1.1f, 0.4f, + -0.5f, 0.6f, 0.9f, + 0.7f, -0.4f, 0.5f, + 0.1f, 0.8f, -0.6f, + }; + + private static readonly float[] B5 = { 0.9f, -0.4f, 1.3f, 0.2f, -0.7f }; + + [Fact] + public void InteriorOptimumEqualsNormalEquations() + { + const int m = 5, n = 3; + var x = new float[n]; + var status = Solve(m, n, A54, B5, Fill(-100f, n), Fill(100f, n), x, out _); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + + var expected = NormalEquationSolution(m, n, A54, B5); + for (var i = 0; i < n; i++) Assert.Equal(expected[i], x[i], 1e-4); + } + + [Fact] + public void KktHoldsOnRandomBoxedProblems() + { + var anyActive = false; + for (uint seed = 1; seed <= 150; seed++) + { + var (m, n, a, b, lo, hi) = RandomProblem(seed); + var x = new float[n]; + var status = Solve(m, n, a, b, lo, hi, x, out _); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"seed {seed} ({m}x{n}) hit the cap"); + AssertKkt(m, n, a, b, lo, hi, x); + for (var j = 0; j < n; j++) anyActive |= x[j] == lo[j] || x[j] == hi[j]; + + var cs = Cost(m, n, a, b, x); + var cr = ReferenceCost(m, n, a, b, lo, hi); + Assert.True(Math.Abs(cs - cr) <= 1e-4 * cr + 1e-6, $"seed {seed} ({m}x{n}): solver cost {cs}, reference {cr}"); + } + Assert.True(anyActive); + } + + [Fact] + public void AllBoundsActive() + { + const int m = 4, n = 3; + var a = new[] { 1.0f, 0.2f, 0.1f, 0.1f, 1.0f, 0.3f, -0.2f, 0.2f, 1.0f, 0.5f, 0.5f, 0.4f }; + var b = new[] { 10f, -10f, 10f, 1f }; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + var x = new float[n]; + var status = Solve(m, n, a, b, lo, hi, x, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.Equal(new[] { 1f, -1f, 1f }, x); + Assert.Equal(3, iterations); + AssertKkt(m, n, a, b, lo, hi, x); + } + + [Fact] + public void ZeroColumn() + { + const int m = 5, n = 3; + var a = (float[])A54.Clone(); + for (var r = 0; r < m; r++) a[r * n + 1] = 0f; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + var x = new float[n]; + var status = Solve(m, n, a, B5, lo, hi, x, out _); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + AssertKkt(m, n, a, B5, lo, hi, x); + var cs = Cost(m, n, a, B5, x); + var cr = ReferenceCost(m, n, a, B5, lo, hi); + Assert.True(Math.Abs(cs - cr) <= 1e-4 * cr + 1e-6); + } + + [Fact] + public void DuplicateColumns() + { + const int m = 5, n = 3; + var a = (float[])A54.Clone(); + for (var r = 0; r < m; r++) a[r * n + 2] = a[r * n + 0]; + var lo = Fill(-1f, n); + var hi = new[] { 0.3f, 1f, 0.3f }; + var x = new float[n]; + var status = Solve(m, n, a, B5, lo, hi, x, out _); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + AssertKkt(m, n, a, B5, lo, hi, x); + var cs = Cost(m, n, a, B5, x); + var cr = ReferenceCost(m, n, a, B5, lo, hi); + Assert.True(Math.Abs(cs - cr) <= 1e-4 * cr + 1e-6); + } + + [Fact] + public void WarmStartMatchesColdStart() + { + const int m = 5, n = 3; + var lo = new[] { -0.2f, -1f, 0f }; + var hi = new[] { 0.5f, 0.3f, 1f }; + var cold = new float[n]; + Solve(m, n, A54, B5, lo, hi, cold, out _); + AssertKkt(m, n, A54, B5, lo, hi, cold); + + var starts = new[] { new[] { 0.5f, -1f, 1f }, new[] { 9f, 9f, -9f }, new[] { 0.1f, 0.1f, 0.5f }, (float[])cold.Clone() }; + foreach (var start in starts) + { + var status = Solve(m, n, A54, B5, lo, hi, start, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + for (var j = 0; j < n; j++) Assert.Equal(cold[j], start[j], 1e-4); + if (ReferenceEquals(start, starts[^1])) Assert.Equal(0, iterations); + } + } + + [Fact] + public void AsymmetricBounds() + { + const int m = 5, n = 3; + var lo = new[] { -1f, 0f, -1f }; + var hi = new[] { 1f, 1f, 1f }; + // Column 1 wants to go negative (b has a strong component against it) but its floor is 0. + var b = new[] { 0.2f, -2.5f, 0.4f, -1.5f, -2.0f }; + var x = new float[n]; + var status = Solve(m, n, A54, b, lo, hi, x, out _); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + AssertKkt(m, n, A54, b, lo, hi, x); + Assert.Equal(0f, x[1]); + Assert.True(x[0] < 0f || x[2] < 0f, "a symmetric-bounds column should use its negative side"); + var cs = Cost(m, n, A54, b, x); + var cr = ReferenceCost(m, n, A54, b, lo, hi); + Assert.True(Math.Abs(cs - cr) <= 1e-4 * cr + 1e-6); + } + + [Fact] + public void IterationCapReturnsFeasibleIterateAndLimitStatus() + { + const int m = 4, n = 3; + var a = new[] { 1.0f, 0.2f, 0.1f, 0.1f, 1.0f, 0.3f, -0.2f, 0.2f, 1.0f, 0.5f, 0.5f, 0.4f }; + var b = new[] { 10f, -10f, 10f, 1f }; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + var x = new float[n]; + var start = Cost(m, n, a, b, x); + var status = Solve(m, n, a, b, lo, hi, x, out var iterations, maxIterations: 1); + Assert.Equal(BoundedLeastSquaresStatus.IterationLimit, status); + Assert.Equal(1, iterations); + for (var j = 0; j < n; j++) Assert.InRange(x[j], lo[j], hi[j]); + Assert.True(Cost(m, n, a, b, x) < start); + + var zero = new float[n]; + Assert.Equal(BoundedLeastSquaresStatus.IterationLimit, Solve(m, n, a, b, lo, hi, zero, out iterations, maxIterations: 0)); + Assert.Equal(0, iterations); + Assert.Equal(new float[n], zero); + } + + [Fact] + public void StartOutsideTheBoxIsClampedFirst() + { + const int m = 5, n = 3; + var lo = Fill(-0.1f, n); + var hi = Fill(0.1f, n); + var x = new[] { 50f, -50f, float.NaN }; + Solve(m, n, A54, B5, lo, hi, x, out _, maxIterations: 0); + Assert.Equal(new[] { 0.1f, -0.1f, -0.1f }, x); + } + + [Fact] + public void FixedColumnStaysPutEvenWhenItsGradientWantsOut() + { + const int m = 5, n = 3; + var lo = new[] { -100f, -1f, -100f }; + var hi = new[] { 100f, -1f, 100f }; + var x = new float[n]; + var status = Solve(m, n, A54, B5, lo, hi, x, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.Equal(-1f, x[1]); + Assert.True(Gradient(m, n, A54, B5, x)[1] < -1e-3, "fixture must pull the fixed column inward"); + Assert.Equal(0, iterations); + AssertKkt(m, n, A54, B5, lo, hi, x); + } + + [Fact] + public void WarmCallAllocatesNothing() + { + const int m = 5, n = 3; + var lo = new[] { -0.2f, -1f, 0f }; + var hi = new[] { 0.5f, 0.3f, 1f }; + var x = new float[n]; + var workspace = new float[BoundedLeastSquares.WorkspaceLength(n)]; + BoundedLeastSquares.Solve(m, n, A54, B5, lo, hi, x, workspace, out _); + + var before = GC.GetAllocatedBytesForCurrentThread(); + var status = BoundedLeastSquares.Solve(m, n, A54, B5, lo, hi, x, workspace, out _); + var after = GC.GetAllocatedBytesForCurrentThread(); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.Equal(0L, after - before); + } + + [Fact] + public void LargeInteriorOptimumEqualsNormalEquations() + { + const int m = 24, n = 16; + var rng = new CultMath.Random(4242u); + var a = new float[m * n]; + var b = new float[m]; + for (var i = 0; i < a.Length; i++) a[i] = rng.NextFloat(-1f, 1f); + for (var i = 0; i < m; i++) b[i] = rng.NextFloat(-3f, 3f); + var x = new float[n]; + var status = Solve(m, n, a, b, Fill(-1000f, n), Fill(1000f, n), x, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.Equal(0, iterations); + var expected = NormalEquationSolution(m, n, a, b); + for (var i = 0; i < n; i++) Assert.Equal(expected[i], x[i], 1e-3); + } + + [Fact] + public void ScaledAndNearDuplicateColumnsAreOptimal() + { + const int m = 5, n = 3; + foreach (var noise in new[] { 0f, 1e-5f }) + { + var a = (float[])A54.Clone(); + for (var r = 0; r < m; r++) a[r * n + 2] = 0.37f * a[r * n + 0] + noise * (r - 2); + var lo = Fill(-1f, n); + var hi = new[] { 0.6f, 1f, 0.6f }; + var x = new float[n]; + var status = Solve(m, n, a, B5, lo, hi, x, out _); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + AssertKkt(m, n, a, B5, lo, hi, x); + var cs = Cost(m, n, a, B5, x); + var cr = ReferenceCost(m, n, a, B5, lo, hi); + Assert.True(Math.Abs(cs - cr) <= 1e-4 * cr + 1e-6, $"noise {noise}: solver cost {cs}, reference {cr}"); + } + } + + [Fact] + public void WorkspaceContentsOnEntryAreIgnored() + { + const int m = 5, n = 3; + var zeroCol = (float[])A54.Clone(); + for (var r = 0; r < m; r++) zeroCol[r * n + 1] = 0f; + var dupCol = (float[])A54.Clone(); + for (var r = 0; r < m; r++) dupCol[r * n + 2] = dupCol[r * n + 0]; + foreach (var a in new[] { A54, zeroCol, dupCol }) + { + var lo = new[] { -1f, -1f, -1f }; + var hi = new[] { 0.3f, 1f, 0.3f }; + var clean = new float[n]; + Solve(m, n, a, B5, lo, hi, clean, out var cleanIterations); + foreach (var junk in new[] { float.NaN, 7f, -1e30f }) + { + var workspace = new float[BoundedLeastSquares.WorkspaceLength(n)]; + Array.Fill(workspace, junk); + var x = new float[n]; + BoundedLeastSquares.Solve(m, n, a, B5, lo, hi, x, workspace, out var iterations); + Assert.Equal(clean, x); + Assert.Equal(cleanIterations, iterations); + } + } + } + + // Junk in the workspace, including NaN doubles, must not reach any decision: random boxed problems (which release + // bounds and use the tolerance) give bit-identical x and the same iteration count. + [Fact] + public void WorkspaceJunkNeverReachesTheSolveOnRandomProblems() + { + for (uint seed = 1; seed <= 25; seed++) + { + var (m, n, a, b, lo, hi) = RandomProblem(seed); + var clean = new float[n]; + Solve(m, n, a, b, lo, hi, clean, out var cleanIterations); + foreach (var junk in new[] { float.NaN, 7f, -1e30f }) + { + var workspace = new float[BoundedLeastSquares.WorkspaceLength(n)]; + Array.Fill(workspace, junk); + var x = new float[n]; + BoundedLeastSquares.Solve(m, n, a, b, lo, hi, x, workspace, out var iterations); + Assert.Equal(cleanIterations, iterations); + for (var j = 0; j < n; j++) + Assert.Equal(BitConverter.SingleToInt32Bits(clean[j]), BitConverter.SingleToInt32Bits(x[j])); + } + } + } + + [Fact] + public void WarmStartAtAVertexTakesNoIterations() + { + const int m = 4, n = 3; + var a = new[] { 1.0f, 0.2f, 0.1f, 0.1f, 1.0f, 0.3f, -0.2f, 0.2f, 1.0f, 0.5f, 0.5f, 0.4f }; + var b = new[] { 10f, -10f, 10f, 1f }; + var x = new[] { 1f, -1f, 1f }; + var status = Solve(m, n, a, b, Fill(-1f, n), Fill(1f, n), x, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.Equal(0, iterations); + Assert.Equal(new[] { 1f, -1f, 1f }, x); + } + + [Fact] + public void IterationCountFollowsTheCapExactly() + { + var sawRelease = false; + for (uint seed = 1; seed <= 40; seed++) + { + var (m, n, a, b, lo, hi) = RandomProblem(seed); + var full = new float[n]; + Solve(m, n, a, b, lo, hi, full, out var needed); + var previousCost = double.MaxValue; + for (var cap = 0; cap <= needed; cap++) + { + var x = new float[n]; + var status = Solve(m, n, a, b, lo, hi, x, out var iterations, cap); + Assert.Equal(cap, iterations); + Assert.Equal(cap < needed ? BoundedLeastSquaresStatus.IterationLimit : BoundedLeastSquaresStatus.Converged, status); + for (var j = 0; j < n; j++) Assert.InRange(x[j], lo[j], hi[j]); + var cost = Cost(m, n, a, b, x); + Assert.True(cost <= previousCost * (1 + 1e-6) + 1e-9, $"seed {seed} cap {cap}: cost rose from {previousCost} to {cost}"); + previousCost = cost; + } + sawRelease |= needed > n; + } + Assert.True(sawRelease, "no random problem needed more iterations than columns, so no bound was ever released"); + } + + [Fact] + public void EachShortSpanIsRejected() + { + const int m = 5, n = 3; + var ws = new float[BoundedLeastSquares.WorkspaceLength(n)]; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + void Expect(Action call) => Assert.Contains("BoundedLeastSquares", Assert.Throws(call).Message); + Expect(() => BoundedLeastSquares.Solve(m, n, new float[m * n - 1], B5, lo, hi, new float[n], ws, out _)); + Expect(() => BoundedLeastSquares.Solve(m, n, A54, new float[m - 1], lo, hi, new float[n], ws, out _)); + Expect(() => BoundedLeastSquares.Solve(m, n, A54, B5, new float[n - 1], hi, new float[n], ws, out _)); + Expect(() => BoundedLeastSquares.Solve(m, n, A54, B5, lo, new float[n - 1], new float[n], ws, out _)); + Expect(() => BoundedLeastSquares.Solve(m, n, A54, B5, lo, hi, new float[n - 1], ws, out _)); + Expect(() => BoundedLeastSquares.Solve(m, n, A54, B5, lo, hi, new float[n], new float[ws.Length - 1], out _)); + Expect(() => BoundedLeastSquares.Solve(-1, n, A54, B5, lo, hi, new float[n], ws, out _)); + Expect(() => BoundedLeastSquares.Solve(m, -1, A54, B5, lo, hi, new float[n], ws, out _)); + // Exactly sized spans, and empty problems, are accepted. + BoundedLeastSquares.Solve(m, n, A54, B5, lo, hi, new float[n], ws, out _); + Assert.Equal(BoundedLeastSquaresStatus.Converged, BoundedLeastSquares.Solve(0, 0, default, default, default, default, default, default, out _)); + Assert.Equal(BoundedLeastSquaresStatus.Converged, BoundedLeastSquares.Solve(0, n, default, default, lo, hi, new float[n], ws, out _)); + } + + // Well-conditioned enough (m = n + 6) that x is comparable across scales. + private static (int m, int n, float[] a, float[] b, float[] lo, float[] hi) ScaleProblem(uint seed) + { + var rng = new CultMath.Random(seed * 104729u); + var n = rng.NextInt(3, 11); + var m = n + 6; + var a = new float[m * n]; + var b = new float[m]; + for (var i = 0; i < a.Length; i++) a[i] = rng.NextFloat(-1f, 1f); + for (var i = 0; i < m; i++) b[i] = rng.NextFloat(-3f, 3f); + var lo = new float[n]; + var hi = new float[n]; + for (var j = 0; j < n; j++) + { + lo[j] = rng.NextFloat(-0.6f, -0.05f); + hi[j] = rng.NextFloat(0.05f, 0.6f); + } + return (m, n, a, b, lo, hi); + } + + private static float[] Scaled(float[] v, float k) + { + var r = new float[v.Length]; + for (var i = 0; i < v.Length; i++) r[i] = v[i] * k; + return r; + } + + [Fact] + public void SolutionIsScaleFree() + { + var sawActive = false; + for (uint seed = 1; seed <= 40; seed++) + { + var (m, n, a, b, lo, hi) = ScaleProblem(seed); + var x = (float[])lo.Clone(); + Assert.Equal(BoundedLeastSquaresStatus.Converged, Solve(m, n, a, b, lo, hi, x, out _)); + AssertKkt(m, n, a, b, lo, hi, x); + for (var j = 0; j < n; j++) sawActive |= x[j] == lo[j] || x[j] == hi[j]; + + foreach (var k in new[] { 1e-6f, 1e3f, 1e6f }) + { + // b and the bounds scaled: x scales with them. + var xb = Scaled(lo, k); + var status = Solve(m, n, a, Scaled(b, k), Scaled(lo, k), Scaled(hi, k), xb, out _); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"seed {seed} k {k}: {status}"); + for (var j = 0; j < n; j++) + Assert.True(Math.Abs(xb[j] - x[j] * k) <= 1e-3 * Math.Abs(k) * (1 + Math.Abs(x[j])), $"seed {seed} b*{k} col {j}: {xb[j]} vs {x[j] * k}"); + + // A scaled: x scales inversely, so the bounds stay put and only b is scaled with A to keep the same box. + var xa = (float[])lo.Clone(); + var lo2 = Scaled(lo, 1f / k); + var hi2 = Scaled(hi, 1f / k); + for (var j = 0; j < n; j++) xa[j] = lo2[j]; + status = Solve(m, n, Scaled(a, k), b, lo2, hi2, xa, out _); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"seed {seed} A*{k}: {status}"); + for (var j = 0; j < n; j++) + Assert.True(Math.Abs(xa[j] - x[j] / k) <= 1e-3 * Math.Abs(1 / k) * (1 + Math.Abs(x[j])), $"seed {seed} A*{k} col {j}: {xa[j]} vs {x[j] / k}"); + } + } + Assert.True(sawActive); + } + + [Fact] + public void NonFiniteOrInvertedInputIsRejectedAndLeavesXUntouched() + { + const int m = 5, n = 3; + var nan = float.NaN; + var inf = float.PositiveInfinity; + var cases = new (string name, Action corrupt)[] + { + ("A NaN", (a, b, lo, hi) => a[4] = nan), + ("A +Inf", (a, b, lo, hi) => a[7] = inf), + ("A -Inf", (a, b, lo, hi) => a[1] = -inf), + ("b NaN", (a, b, lo, hi) => b[2] = nan), + ("b +Inf", (a, b, lo, hi) => b[0] = inf), + ("lo NaN", (a, b, lo, hi) => lo[1] = nan), + ("hi NaN", (a, b, lo, hi) => hi[2] = nan), + ("lo > hi", (a, b, lo, hi) => { lo[1] = 0.5f; hi[1] = 0.25f; }), + ("lo = +Inf", (a, b, lo, hi) => { lo[0] = inf; hi[0] = inf; }), + ("hi = -Inf", (a, b, lo, hi) => { lo[0] = -inf; hi[0] = -inf; }), + }; + foreach (var (name, corrupt) in cases) + { + var a = (float[])A54.Clone(); + var b = (float[])B5.Clone(); + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + corrupt(a, b, lo, hi); + foreach (var start in new[] { new[] { 0.5f, -3f, 9f }, new[] { nan, 0f, 0f } }) + { + var x = (float[])start.Clone(); + var status = Solve(m, n, a, b, lo, hi, x, out var iterations); + Assert.True(status == BoundedLeastSquaresStatus.InvalidInput, $"{name}: {status}"); + Assert.Equal(0, iterations); + for (var j = 0; j < n; j++) + Assert.Equal(BitConverter.SingleToInt32Bits(start[j]), BitConverter.SingleToInt32Bits(x[j])); + } + } + } + + [Fact] + public void ValidateNamesTheFirstInvalidInput() + { + const int m = 5, n = 3; + var nan = float.NaN; + var inf = float.PositiveInfinity; + const double goodTol = 1e-6; + var cases = new (string name, BoundedLeastSquaresInput expected, double tol, Action corrupt)[] + { + ("valid", BoundedLeastSquaresInput.Valid, goodTol, (a, b, lo, hi) => { }), + ("infinite bounds are unbounded", BoundedLeastSquaresInput.Valid, goodTol, (a, b, lo, hi) => { lo[0] = -inf; hi[1] = inf; }), + ("lo = hi", BoundedLeastSquaresInput.Valid, goodTol, (a, b, lo, hi) => { lo[2] = 0.5f; hi[2] = 0.5f; }), + ("tolerance 0", BoundedLeastSquaresInput.InvalidTolerance, 0.0, (a, b, lo, hi) => { }), + ("tolerance negative", BoundedLeastSquaresInput.InvalidTolerance, -1e-6, (a, b, lo, hi) => { }), + ("tolerance NaN", BoundedLeastSquaresInput.InvalidTolerance, double.NaN, (a, b, lo, hi) => { }), + ("tolerance +Inf", BoundedLeastSquaresInput.InvalidTolerance, double.PositiveInfinity, (a, b, lo, hi) => { }), + ("tolerance tiny but positive", BoundedLeastSquaresInput.Valid, double.Epsilon, (a, b, lo, hi) => { }), + ("lo NaN", BoundedLeastSquaresInput.InvalidBounds, goodTol, (a, b, lo, hi) => lo[1] = nan), + ("hi NaN", BoundedLeastSquaresInput.InvalidBounds, goodTol, (a, b, lo, hi) => hi[2] = nan), + ("lo > hi", BoundedLeastSquaresInput.InvalidBounds, goodTol, (a, b, lo, hi) => { lo[1] = 0.5f; hi[1] = 0.25f; }), + ("lo = +Inf", BoundedLeastSquaresInput.InvalidBounds, goodTol, (a, b, lo, hi) => { lo[0] = inf; hi[0] = inf; }), + ("hi = -Inf", BoundedLeastSquaresInput.InvalidBounds, goodTol, (a, b, lo, hi) => { lo[0] = -inf; hi[0] = -inf; }), + ("A NaN", BoundedLeastSquaresInput.NonFiniteMatrix, goodTol, (a, b, lo, hi) => a[4] = nan), + ("A +Inf", BoundedLeastSquaresInput.NonFiniteMatrix, goodTol, (a, b, lo, hi) => a[7] = inf), + ("A -Inf in the last entry", BoundedLeastSquaresInput.NonFiniteMatrix, goodTol, (a, b, lo, hi) => a[m * n - 1] = -inf), + ("b NaN", BoundedLeastSquaresInput.NonFiniteTarget, goodTol, (a, b, lo, hi) => b[2] = nan), + ("b +Inf in the first entry", BoundedLeastSquaresInput.NonFiniteTarget, goodTol, (a, b, lo, hi) => b[0] = inf), + ("b -Inf in the last entry", BoundedLeastSquaresInput.NonFiniteTarget, goodTol, (a, b, lo, hi) => b[m - 1] = -inf), + // Two faults at once: the earlier member in the order wins, whichever input comes first in the argument list. + ("tolerance and bounds", BoundedLeastSquaresInput.InvalidTolerance, 0.0, (a, b, lo, hi) => lo[0] = nan), + ("tolerance and A", BoundedLeastSquaresInput.InvalidTolerance, double.NaN, (a, b, lo, hi) => a[0] = nan), + ("tolerance and b", BoundedLeastSquaresInput.InvalidTolerance, -1.0, (a, b, lo, hi) => b[0] = nan), + ("bounds and A", BoundedLeastSquaresInput.InvalidBounds, goodTol, (a, b, lo, hi) => { hi[0] = nan; a[0] = nan; }), + ("bounds and b", BoundedLeastSquaresInput.InvalidBounds, goodTol, (a, b, lo, hi) => { lo[2] = 1f; hi[2] = -1f; b[4] = inf; }), + ("A and b", BoundedLeastSquaresInput.NonFiniteMatrix, goodTol, (a, b, lo, hi) => { a[14] = inf; b[0] = nan; }), + }; + foreach (var (name, expected, tol, corrupt) in cases) + { + var a = (float[])A54.Clone(); + var b = (float[])B5.Clone(); + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + corrupt(a, b, lo, hi); + var verdict = BoundedLeastSquares.Validate(m, n, a, b, lo, hi, tol); + Assert.True(expected == verdict, $"{name}: {verdict}"); + + var x = new float[n]; + var status = BoundedLeastSquares.Solve(m, n, a, b, lo, hi, x, new float[BoundedLeastSquares.WorkspaceLength(n)], out _, tol); + Assert.True((status == BoundedLeastSquaresStatus.InvalidInput) == (expected != BoundedLeastSquaresInput.Valid), $"{name}: Solve {status}"); + } + + // The overload without a tolerance validates against the default one. + Assert.Equal(BoundedLeastSquaresInput.Valid, BoundedLeastSquares.Validate(m, n, A54, B5, Fill(-1f, n), Fill(1f, n))); + Assert.Equal(BoundedLeastSquaresInput.InvalidBounds, BoundedLeastSquares.Validate(m, n, A54, B5, Fill(2f, n), Fill(1f, n))); + } + + [Fact] + public void ValidateReadsOnlyTheStatedDimensions() + { + // Entries beyond m * n, m and n are not inputs: a NaN there is not a fault. + const int m = 2, n = 2; + var a = new[] { 1f, 0f, 0f, 1f, float.NaN }; + var b = new[] { 1f, 1f, float.NaN }; + var lo = new[] { -1f, -1f, float.NaN }; + var hi = new[] { 1f, 1f, float.NaN }; + Assert.Equal(BoundedLeastSquaresInput.Valid, BoundedLeastSquares.Validate(m, n, a, b, lo, hi)); + + // A problem with no unknown has no use for b, so a non-finite b is not an invalid input there. + var nanB = new[] { float.NaN, 1f }; + Assert.Equal(BoundedLeastSquaresInput.Valid, BoundedLeastSquares.Validate(2, 0, ReadOnlySpan.Empty, nanB, ReadOnlySpan.Empty, ReadOnlySpan.Empty)); + Assert.Equal(BoundedLeastSquaresStatus.Converged, BoundedLeastSquares.Solve(2, 0, ReadOnlySpan.Empty, nanB, ReadOnlySpan.Empty, ReadOnlySpan.Empty, + Span.Empty, Span.Empty, out _)); + } + + [Fact] + public void ValidateThrowsOnAShortSpanLikeSolve() + { + const int m = 5, n = 3; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + // The caller-bug contract holds ahead of any value check: a NaN tolerance does not hide it. + Assert.Throws(() => BoundedLeastSquares.Validate(m, n, A54.AsSpan(1), B5, lo, hi, double.NaN)); + Assert.Throws(() => BoundedLeastSquares.Validate(m, n, A54, B5.AsSpan(1), lo, hi)); + Assert.Throws(() => BoundedLeastSquares.Validate(m, n, A54, B5, lo.AsSpan(1), hi)); + Assert.Throws(() => BoundedLeastSquares.Validate(m, n, A54, B5, lo, hi.AsSpan(1))); + Assert.Throws(() => BoundedLeastSquares.Validate(-1, n, A54, B5, lo, hi)); + Assert.Throws(() => BoundedLeastSquares.Validate(m, -1, A54, B5, lo, hi)); + } + + [Fact] + public void ValidateAllocatesNothing() + { + const int m = 5, n = 3; + var bad = (float[])A54.Clone(); + bad[14] = float.NaN; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + foreach (var (name, a, tol) in new[] { ("valid", A54, 1e-6), ("invalid matrix", bad, 1e-6), ("invalid tolerance", A54, 0.0) }) + { + var bytes = new long[2]; + for (var call = 0; call < 2; call++) + { + var before = GC.GetAllocatedBytesForCurrentThread(); + BoundedLeastSquares.Validate(m, n, a, B5, lo, hi, tol); + bytes[call] = GC.GetAllocatedBytesForCurrentThread() - before; + } + Assert.True(bytes[0] == 0 && bytes[1] == 0, $"{name}: first call {bytes[0]} B, second {bytes[1]} B"); + } + } + + [Fact] + public void SolveReturnsInvalidInputExactlyWhenValidateIsNotValid() + { + var invalid = 0; + for (uint seed = 1; seed <= 300; seed++) + { + var (m, n, a, b, lo, hi) = RandomProblem(seed); + var rng = new CultMath.Random(seed * 104729u); + var tol = 1e-6; + // Corrupt zero to three inputs, so some problems stay clean. + for (var k = rng.NextInt(4); k > 0; k--) + { + switch (rng.NextInt(5)) + { + case 0: tol = rng.NextInt(2) == 0 ? 0.0 : double.NaN; break; + case 1: lo[rng.NextInt(n)] = float.NaN; break; + case 2: { var j = rng.NextInt(n); lo[j] = hi[j] + 1f; } break; + case 3: a[rng.NextInt(m * n)] = rng.NextInt(2) == 0 ? float.NaN : float.NegativeInfinity; break; + default: b[rng.NextInt(m)] = float.PositiveInfinity; break; + } + } + var verdict = BoundedLeastSquares.Validate(m, n, a, b, lo, hi, tol); + var start = Fill(0.5f, n); + var x = (float[])start.Clone(); + var status = BoundedLeastSquares.Solve(m, n, a, b, lo, hi, x, new float[BoundedLeastSquares.WorkspaceLength(n)], out var iterations, tol); + Assert.True((status == BoundedLeastSquaresStatus.InvalidInput) == (verdict != BoundedLeastSquaresInput.Valid), $"seed {seed}: {verdict} but {status}"); + if (verdict != BoundedLeastSquaresInput.Valid) + { + invalid++; + Assert.Equal(0, iterations); + Assert.Equal(start, x); + } + } + Assert.InRange(invalid, 100, 280); + } + + // ANoiseLevelViolationIsNeverReleased with the columns rescaled by S (x scales by 1/S, so A x is unchanged): the gate is + // the rounding bound of the released column's own gradient, whatever the scale of that column or of its neighbours. A gate + // read from another column's row, or one that shrinks as the terms grow, releases rounding noise and spins. + [Fact] + public void ANoiseLevelViolationIsNeverReleasedAtAnyColumnScale() + { + const int m = 2, n = 6; + var a0 = new[] + { + 1.0213068f, 0.97530603f, -0.5673449f, -0.64136946f, -0.07432885f, -0.35571396f, + 0.4326824f, 1.1969734f, -0.1343108f, -0.23431005f, -1.4009786f, 0.10656489f, + }; + var lo0 = new[] { -0.44782114f, 0f, -0.008422324f, -0.03878026f, 0f, -6.6434336f }; + var hi0 = new[] { 0.0448007f, 0f, 0.005942123f, 0.0785512f, 0f, 0.23079813f }; + var x0 = new[] { -0.28347927f, 0f, 0.0051532285f, -0.03878026f, 0f, 0.23079813f }; + var patterns = new (string name, float[] scale)[] + { + ("uniform 1e3", Fill(1e3f, n)), + ("uniform 1e-3", Fill(1e-3f, n)), + ("ascending", new[] { 1f, 1e1f, 1e2f, 1e3f, 1e4f, 1e5f }), + ("descending", new[] { 1e5f, 1e4f, 1e3f, 1e2f, 1e1f, 1f }), + ("one heavy column", new[] { 1f, 1f, 1e4f, 1f, 1f, 1f }), + ("one light column", new[] { 1e3f, 1e3f, 1e-3f, 1e3f, 1e3f, 1e3f }), + }; + foreach (var (name, scale) in patterns) + { + var a = new float[m * n]; + var lo = new float[n]; + var hi = new float[n]; + var x = new float[n]; + for (var j = 0; j < n; j++) + { + for (var i = 0; i < m; i++) a[i * n + j] = a0[i * n + j] * scale[j]; + lo[j] = lo0[j] / scale[j]; + hi[j] = hi0[j] / scale[j]; + x[j] = Math.Clamp(x0[j] / scale[j], lo[j], hi[j]); + } + var status = Solve(m, n, a, new float[m], lo, hi, x, out var iterations); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"{name}: {status}"); + Assert.True(iterations <= 8, $"{name}: {iterations} iterations"); + } + } + + // Soul's stall-after-a-release family (cut bls-release-stop, s1): after a release the next stationarity miss is not yet + // a stall, so the solve takes one more pass to confirm before it stops. Two small problems whose release is followed by + // exactly such a miss; ending that first miss at once (a stall mark that starts below every cost) stops one pass early. + [Theory] + [InlineData( + new[] { -0.0067761745f, -207.21786f, -0.004115388f, -751.1994f, -8.1700025E-05f, -481.7794f, 0.0038280683f, 480.12833f }, + new[] { 1.7477255f, 2.4914713f, -2.3861952f, 2.187128f }, + -1f, 1f, -0.25f, 0.1f)] + [InlineData( + new[] { 70.07762f, 5.7015634f, 111.790436f, -12.586686f, 75.29796f, 12.872999f, -402.25464f, -1.8093401f, -524.51056f, -8.649797f }, + new[] { -1.8312539f, 2.9556413f, 0.7550676f, -2.1365998f, 2.30717f }, + -1f, 1f, 0f, 1f)] + public void AReleaseIsConfirmedByAPassBeforeTheSolveStops(float[] a, float[] b, float lo0, float hi0, float lo1, float hi1) + { + var m = b.Length; + const int n = 2; + var lo = new[] { lo0, lo1 }; + var hi = new[] { hi0, hi1 }; + var x = (float[])lo.Clone(); + Assert.Equal(BoundedLeastSquaresStatus.Converged, SolveAt(m, n, a, b, lo, hi, x, out var iterations, 1e-12)); + Assert.Equal(2, iterations); + AssertKkt(m, n, a, b, lo, hi, x); + } + + [Fact] + public void InfiniteBoundsMeanUnbounded() + { + const int m = 5, n = 3; + var inf = float.PositiveInfinity; + var x = new float[n]; + Assert.Equal(BoundedLeastSquaresStatus.Converged, Solve(m, n, A54, B5, Fill(-inf, n), Fill(inf, n), x, out _)); + var expected = NormalEquationSolution(m, n, A54, B5); + for (var j = 0; j < n; j++) Assert.Equal(expected[j], x[j], 1e-4); + + // One-sided, with an infinite warm start: the start is clamped to a finite point first. + var y = new[] { -inf, inf, float.NaN }; + var lo = new[] { -inf, 0.2f, -inf }; + var hi = new[] { inf, inf, 0.1f }; + Assert.Equal(BoundedLeastSquaresStatus.Converged, Solve(m, n, A54, B5, lo, hi, y, out _)); + AssertKkt(m, n, A54, B5, lo, hi, y); + Assert.All(y, v => Assert.True(float.IsFinite(v))); + } + + // Exact reference: every assignment of each column to {lo, hi, free}, free set solved in double. + private static double ExactBoxedCost(int m, int n, float[] a, float[] b, float[] lo, float[] hi, double pivotTol = 1e-9, double ridge = 0.0) + { + var maxDiag = 0.0; + for (var j = 0; j < n; j++) + { + var d = 0.0; + for (var r = 0; r < m; r++) d += (double)a[r * n + j] * a[r * n + j]; + maxDiag = Math.Max(maxDiag, d); + } + var best = double.MaxValue; + var total = 1; + for (var j = 0; j < n; j++) total *= 3; + var x = new double[n]; + for (var code = 0; code < total; code++) + { + var c = code; + var free = new System.Collections.Generic.List(); + for (var j = 0; j < n; j++) + { + var d = c % 3; c /= 3; + if (d == 0) x[j] = lo[j]; else if (d == 1) x[j] = hi[j]; else free.Add(j); + } + var k = free.Count; + if (k > 0) + { + var mat = new double[k, k + 1]; + for (var i = 0; i < k; i++) + { + for (var l = 0; l < k; l++) + for (var r = 0; r < m; r++) mat[i, l] += (double)a[r * n + free[i]] * a[r * n + free[l]]; + for (var r = 0; r < m; r++) + { + var fixedPart = 0.0; + for (var j = 0; j < n; j++) if (!free.Contains(j)) fixedPart += (double)a[r * n + j] * x[j]; + mat[i, k] += (double)a[r * n + free[i]] * (b[r] - fixedPart); + } + } + for (var i = 0; i < k; i++) mat[i, i] += ridge * maxDiag; + var ok = true; + for (var col = 0; col < k && ok; col++) + { + var piv = col; + for (var r = col + 1; r < k; r++) if (Math.Abs(mat[r, col]) > Math.Abs(mat[piv, col])) piv = r; + if (Math.Abs(mat[piv, col]) < pivotTol) { ok = false; break; } + for (var l = 0; l <= k; l++) (mat[col, l], mat[piv, l]) = (mat[piv, l], mat[col, l]); + for (var r = 0; r < k; r++) + { + if (r == col) continue; + var f = mat[r, col] / mat[col, col]; + for (var l = col; l <= k; l++) mat[r, l] -= f * mat[col, l]; + } + } + if (!ok) continue; + for (var i = 0; i < k; i++) + { + x[free[i]] = mat[i, k] / mat[i, i]; + if (x[free[i]] < lo[free[i]] - 1e-12 || x[free[i]] > hi[free[i]] + 1e-12) ok = false; + } + if (!ok) continue; + } + var cost = 0.0; + for (var r = 0; r < m; r++) + { + var s = -(double)b[r]; + for (var j = 0; j < n; j++) s += (double)a[r * n + j] * x[j]; + cost += s * s; + } + best = Math.Min(best, cost); + } + return best; + } + + // m < n with columns that are nearly parallel (condition number of A around 1e2), b outside the reachable set. + // The absolute scale of A must not matter: the KKT tolerance is relative, and the working iterate is double, so a + // 1e6 A with untouched bounds reaches the same optimum to the same allowance. + [Theory] + [InlineData(1f)] + [InlineData(1e6f)] + public void NearCollinearColumnsReachTheExactOptimum(float scale) + { + const int m = 2, n = 7; + for (var family = 0; family < 4; family++) + { + for (uint seed = 1; seed <= 120; seed++) + { + var rng = new CultMath.Random(seed * 15485863u + (uint)family * 977u); + var a = new float[m * n]; + for (var j = 0; j < n; j++) + { + switch (family) + { + case 0: a[j] = rng.NextFloat(0.5f, 1f); a[n + j] = 0.01f * rng.NextFloat(-1f, 1f); break; + case 1: a[j] = 1f + 0.02f * rng.NextFloat(-1f, 1f); a[n + j] = 0.01f * rng.NextFloat(-1f, 1f); break; + case 2: a[j] = rng.NextFloat(-1f, 1f); a[n + j] = 0.01f * a[j] + 0.01f * rng.NextFloat(-1f, 1f); break; + default: a[j] = rng.NextFloat(0.5f, 1f); a[n + j] = a[j] * 0.9f + 0.01f * rng.NextFloat(-1f, 1f); break; + } + } + for (var i = 0; i < a.Length; i++) a[i] *= scale; + var b = new[] { rng.NextFloat(-8f, 8f), rng.NextFloat(-8f, 8f) }; + var lo = new float[n]; + var hi = new float[n]; + for (var j = 0; j < n; j++) { lo[j] = rng.NextFloat() < 0.5f ? -1f : 0f; hi[j] = 1f; } + var x = new float[n]; + var status = Solve(m, n, a, b, lo, hi, x, out _); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"family {family} seed {seed}: {status}"); + var gap = Cost(m, n, a, b, x) - ExactBoxedCost(m, n, a, b, lo, hi); + var allowed = 1e-5 * (b[0] * b[0] + b[1] * b[1]); + Assert.True(gap <= allowed, $"family {family} seed {seed}: cost {gap} above the exact optimum (allowed {allowed})"); + } + } + } + + // A pass can end with the KKT test still failing and the cost exactly where it was: a dependent free column keeps a + // gradient above the tolerance, or a bound release lands on a column the factor drops. The solver must call that + // converged; if the stall rule mis-reads the cost scale or the progress, it spins to the iteration cap instead. + // Each kind is a fixed-seed batch of small boxed problems with warm starts on and off the bounds and pinned columns: + // rank-deficient (duplicate and zero columns), nearly collinear (1e-2 to 1e-5), integer-tied, wide, cond(A) 1e5 to + // 3e5, and "weak", where b lies along the weakest singular direction of a cond(A) 1e6 to 1e7 matrix so the gradient + // tolerance sits below the rounding noise with interior columns nonzero. Every kind must converge; all but "weak" + // (past the documented condition range) must also land within the documented cost gap, relative to |b|^2, of an + // exact enumeration of the active sets (a 1e-15 ridge keeps singular free sets solvable). + [Theory] + [InlineData("plain", 300)] + [InlineData("rankdef", 300)] + [InlineData("collinear", 300)] + [InlineData("integer-tie", 300)] + [InlineData("wide", 300)] + [InlineData("cond", 300)] + [InlineData("weak", 6000)] + public void StalledPassesConvergeInsteadOfSpinningToTheCap(string kind, int seeds) + { + var failures = new System.Collections.Generic.List(); + for (uint seed = 1; seed <= seeds; seed++) + { + var rng = new CultMath.Random(seed * 2246822519u + (uint)kind.Length * 3266489917u); + double Gauss() => Math.Sqrt(-2.0 * Math.Log(1.0 - rng.NextFloat() * 0.999999)) * Math.Cos(2.0 * Math.PI * rng.NextFloat()); + var n = rng.NextInt(2, 8); + var m = rng.NextInt(2, 12); + if (kind == "wide") m = Math.Max(1, n - rng.NextInt(1, 4)); + if (kind == "cond" || kind == "weak") m = n + rng.NextInt(0, 5); + float[] a; + float[] bWeak = null; + if (kind == "weak") + { + (a, bWeak) = BlsTrace.ConditionedProblem(m, n, Math.Pow(10.0, 6.0 + rng.NextFloat()), seed, 1.0, true); + } + else if (kind == "cond") + { + a = BlsTrace.ConditionedProblem(m, n, Math.Pow(10.0, 5.0 + 0.5 * rng.NextFloat()), seed).a; + } + else + { + a = new float[m * n]; + for (var i = 0; i < m; i++) + { + var row = new double[n]; + for (var j = 0; j < n; j++) row[j] = kind == "integer-tie" ? rng.NextInt(-2, 3) : Gauss(); + for (var j = 1; j < n; j++) + { + if (kind == "rankdef" && j % 3 == 1) row[j] = row[j - 1]; + if (kind == "rankdef" && j % 3 == 2) row[j] = 0.0; + if (kind == "collinear" && j % 2 == 1) row[j] = row[j - 1] + Math.Pow(10.0, -rng.NextInt(2, 6)) * Gauss(); + } + for (var j = 0; j < n; j++) a[i * n + j] = (float)row[j]; + } + } + var lo = new float[n]; + var hi = new float[n]; + var x = new float[n]; + var xt = new double[n]; + for (var j = 0; j < n; j++) + { + var w = Math.Pow(10.0, rng.NextInt(-2, 2)); + lo[j] = (float)(-w * rng.NextFloat()); + hi[j] = (float)(w * rng.NextFloat()); + if (rng.NextInt(6) == 0) hi[j] = lo[j]; + else if (rng.NextInt(8) == 0) lo[j] = hi[j] = 0f; + else if (rng.NextInt(8) == 0) { lo[j] = (float)(0.5 + rng.NextFloat()); hi[j] = lo[j] + 0.5f; } + if (kind == "weak") { var c = (float)Math.Pow(10.0, rng.NextInt(3, 9)); lo[j] = rng.NextInt(2) == 0 ? -c : 0f; hi[j] = c; } + if (kind == "integer-tie") { lo[j] = -1f; hi[j] = rng.NextInt(4) == 0 ? -1f : 1f; } + x[j] = rng.NextInt(3) == 0 ? lo[j] : rng.NextInt(2) == 0 ? hi[j] : lo[j] + (hi[j] - lo[j]) * rng.NextFloat(); + xt[j] = (lo[j] + hi[j]) / 2.0 + (hi[j] - lo[j]) * 3.0 * (rng.NextFloat() - 0.5); + } + var noise = Math.Pow(10.0, rng.NextInt(-2, 4)); + var mode = rng.NextInt(4); + var b = new float[m]; + for (var i = 0; i < m; i++) + { + var s = 0.0; + for (var j = 0; j < n; j++) s += (double)a[i * n + j] * xt[j]; + b[i] = bWeak != null ? bWeak[i] : mode == 0 ? 0f : (float)(s + noise * Gauss() * (mode == 3 ? 1.0 : 0.01)); + } + var status = Solve(m, n, a, b, lo, hi, x, out var iterations); + if (status != BoundedLeastSquaresStatus.Converged) + { + failures.Add($"seed {seed}: {status} after {iterations}"); + continue; + } + if (kind == "weak") continue; + var bb = 0.0; + foreach (var v in b) bb += (double)v * v; + if (bb == 0.0) bb = 1.0; + var gap = Cost(m, n, a, b, x) - ExactBoxedCost(m, n, a, b, lo, hi, 1e-300, 1e-15); + if (gap > 1e-5 * bb) failures.Add($"seed {seed}: cost gap {gap / bb:E2} of |b|^2"); + } + Assert.True(failures.Count == 0, $"{kind}: {failures.Count} of {seeds} failed; first: {string.Join("; ", failures.GetRange(0, Math.Min(3, failures.Count)))}"); + } + + // Unsaturated allocator-shaped ticks: 24 columns, every column free at the optimum. The solve is one Newton step; + // at most one more may confirm it. Before the working iterate moved to double, the float gradient's noise floor + // exceeded the tolerance from cond ~1e3 and the solver spun to the 100-iteration cap on optimal points. + [Theory] + [InlineData(1e2)] + [InlineData(1e3)] + [InlineData(1e4)] + public void UnsaturatedIllConditionedProblemsConvergeInAtMostTwoIterations(double cond) + { + const int m = 28, n = 24; + for (uint seed = 1; seed <= 30; seed++) + { + var (a, b) = BlsTrace.ConditionedProblem(m, n, cond, seed); + var x = new float[n]; + var status = Solve(m, n, a, b, Fill(-1e9f, n), Fill(1e9f, n), x, out var iterations); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"cond {cond} seed {seed}: {status} after {iterations}"); + Assert.True(iterations <= 2, $"cond {cond} seed {seed}: {iterations} iterations"); + var bb = 0.0; + foreach (var v in b) bb += (double)v * v; + var expected = NormalEquationSolution(m, n, a, b); + var xs = new float[n]; + for (var j = 0; j < n; j++) xs[j] = (float)expected[j]; + Assert.True(Cost(m, n, a, b, x) - Cost(m, n, a, b, xs) <= 1e-6 * bb, $"cond {cond} seed {seed}: cost above the exact optimum"); + } + } + + // Near the pivot cutoff (cond(A) ~ 3e7, cond(A^T A) ~ 1e15) a Newton step leaves a free gradient above the + // tolerance on some problems. Those take one confirming iteration and stop because it lowers nothing; the rest + // are stationary at once. Never the cap, and never spinning. + [Fact] + public void NearSingularFreeSetsConfirmOnceAndStop() + { + const int m = 28, n = 24; + var confirmed = 0; + for (uint seed = 1; seed <= 60; seed++) + { + var (a, b) = BlsTrace.ConditionedProblem(m, n, 3e7, seed); + var x = new float[n]; + var status = Solve(m, n, a, b, Fill(-1e9f, n), Fill(1e9f, n), x, out var iterations); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"seed {seed}: {status}"); + Assert.True(iterations <= 3, $"seed {seed}: {iterations} iterations"); + if (iterations > 0) confirmed++; + } + Assert.InRange(confirmed, 1, 20); + } + + // b along the smallest left singular vector makes the optimum lie along the weakest direction: |A^T b| is tiny, so + // the tolerance (1e-6 of it) sits below the rounding noise of the gradient (~1e-16 |A^T A| |x|) for cond(A) >= 1e6. + // The tolerance is then unreachable, and the solver must stop on the progress rule, after the handful of Newton + // passes that still lower the cost, never at the 100-iteration cap. + [Theory] + [InlineData(1e6)] + [InlineData(1e7)] + public void ToleranceBelowTheNoiseFloorStopsOnProgressNotOnTheCap(double cond) + { + const int m = 28, n = 24; + var confirmed = 0; + for (uint seed = 1; seed <= 30; seed++) + { + var (a, b) = BlsTrace.ConditionedProblem(m, n, cond, seed, 1.0, bAlongSmallestSingularVector: true); + var x = new float[n]; + var status = Solve(m, n, a, b, Fill(-1e9f, n), Fill(1e9f, n), x, out var iterations); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"cond {cond} seed {seed}: {status} after {iterations}"); + Assert.True(iterations <= 6, $"cond {cond} seed {seed}: {iterations} iterations"); + if (iterations >= 1) confirmed++; + } + Assert.True(confirmed >= 15, $"cond {cond}: only {confirmed} of 30 reached the tolerance floor"); + } + + // Scale-freeness was only claimed for scaling A, b and the bounds together; A alone at 1e6 with the bounds left + // alone must also converge, and as fast. + [Theory] + [InlineData(1e2)] + [InlineData(1e4)] + public void LargeAWithUnscaledBoundsConvergesInAtMostTwoIterations(double cond) + { + const int m = 28, n = 24; + for (uint seed = 1; seed <= 30; seed++) + { + var (a, b) = BlsTrace.ConditionedProblem(m, n, cond, seed, 1e6); + var x = new float[n]; + var status = Solve(m, n, a, b, Fill(-1e3f, n), Fill(1e3f, n), x, out var iterations); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"cond {cond} seed {seed}: {status} after {iterations}"); + Assert.True(iterations <= 2, $"cond {cond} seed {seed}: {iterations} iterations"); + } + } + + // b = 0 must not borrow its tolerance from the start point: a far start's own gradient is enormous, so that + // scale judged it converged after one iteration at cost 5001. The optimum here is ~1e-9. + [Fact] + public void ZeroTargetFromAFarStartIsNotJudgedConvergedByItsOwnSteepness() + { + var a = new[] { 1f, 1f, 1f, 1.0001f }; + var b = new float[2]; + var lo = new[] { 0.5f, -1e6f }; + var hi = new[] { 1e6f, 1e6f }; + var x = new[] { 1e6f, 1e6f }; + var status = Solve(2, 2, a, b, lo, hi, x, out _); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + AssertKkt(2, 2, a, b, lo, hi, x); + Assert.True(Cost(2, 2, a, b, x) < 1e-6, $"cost {Cost(2, 2, a, b, x)}"); + Assert.True(x[0] >= 0.5f); + + // The origin inside the box: the answer is the origin, from any start. + var lo2 = new[] { -1e6f, -1e6f }; + var y = new[] { 1e6f, -1e6f }; + Assert.Equal(BoundedLeastSquaresStatus.Converged, Solve(2, 2, a, b, lo2, hi, y, out _)); + Assert.True(Cost(2, 2, a, b, y) < 1e-9, $"cost {Cost(2, 2, a, b, y)}"); + } + + // The tolerance scale is the gradient at the box point nearest the origin. Here that point is 1000 and the + // wanted release is a gradient of about 6e-5 against a 1000-scale problem: only a scale taken from the box point + // (about 6e-5, tolerance 6e-11) releases it; a scale taken from A^T b (about 1000, tolerance 1e-3) would not. + // Run with the excluded column in each position so the scale must come from the right entry. + [Fact] + public void ToleranceScaleIsTheGradientAtTheBoxPointNearestTheOrigin() + { + var a = new[] { 1f, 0f, 0f, 1f }; + foreach (var excluded in new[] { 0, 1 }) + { + var b = new float[2]; + var lo = new[] { -1e6f, -1e6f }; + var hi = new[] { 1e6f, 1e6f }; + b[excluded] = 1000.0001f; + lo[excluded] = 1000f; + hi[excluded] = 2000f; + var x = new float[2]; + x[excluded] = 1000f; + var status = Solve(2, 2, a, b, lo, hi, x, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.True(iterations >= 1, $"column {excluded}: no release"); + Assert.Equal(b[excluded], x[excluded]); + Assert.Equal(0f, x[1 - excluded]); + } + } + + // b = 0 with the origin in the box and the start at the origin: the gradient is exactly zero and so is the + // tolerance. Nothing is violated, so the solve is over without an iteration. + [Fact] + public void ZeroTargetAtTheOriginTakesNoIterations() + { + const int m = 5, n = 3; + var x = new float[n]; + var status = Solve(m, n, A54, new float[m], Fill(-1f, n), Fill(1f, n), x, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.Equal(0, iterations); + Assert.Equal(new float[n], x); + } + + // One column, A = [1], with b beyond the box: the first Newton step would cross a bound, so with a cap of 0 the + // solver returns the clamped start untouched. That makes the clamp itself the thing under test, for every + // combination of a finite, infinite or NaN start with finite and infinite bounds. + [Fact] + public void WarmStartClampIsExact() + { + var inf = float.PositiveInfinity; + var cases = new (float lo, float hi, float start, float expected)[] + { + (-1f, 1f, 0.25f, 0.25f), + (-1f, 1f, 5f, 1f), + (-1f, 1f, -5f, -1f), + (-1f, 1f, float.NaN, -1f), + (0.5f, 2f, inf, 2f), + (0.5f, 2f, -inf, 0.5f), + (0.2f, inf, inf, 0.2f), + (0.2f, inf, -inf, 0.2f), + (0.2f, inf, float.NaN, 0.2f), + (-inf, -2f, -inf, -2f), + (-inf, -2f, 3f, -2f), + (-inf, 3f, float.NaN, 0f), + (-inf, 3f, -inf, 0f), + (-2f, inf, float.NaN, -2f), + (-inf, -2f, float.NaN, -2f), + (-inf, 3f, 1f, 1f), + }; + foreach (var (l, h, start, expected) in cases) + { + // b beyond the box on the side the start is not on the bound of, so the step crosses a bound (or the + // start already sits on one). + var b = new[] { float.IsInfinity(h) ? l - 10f : h + 10f }; + if (float.IsInfinity(l) && float.IsInfinity(h)) b[0] = 0f; + var x = new[] { start }; + Solve(1, 1, new[] { 1f }, b, new[] { l }, new[] { h }, x, out var iterations, maxIterations: 0); + Assert.Equal(0, iterations); + Assert.True(x[0] == expected, $"box [{l}, {h}] start {start}: {x[0]}, expected {expected}"); + } + } + + // A duplicate column that is free and interior gets no step: the columns share one gradient, and moving both + // along it would overshoot. + [Fact] + public void FreeDuplicateColumnGetsNoStep() + { + const int m = 5, n = 3; + var a = (float[])A54.Clone(); + for (var r = 0; r < m; r++) a[r * n + 2] = a[r * n + 0]; + var x = new float[n]; + var status = Solve(m, n, a, B5, Fill(-100f, n), Fill(100f, n), x, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.Equal(0, iterations); + Assert.Equal(0f, x[2]); + var reduced = new float[m * 2]; + for (var r = 0; r < m; r++) { reduced[r * 2] = a[r * n]; reduced[r * 2 + 1] = a[r * n + 1]; } + var xr = NormalEquationSolution(m, 2, reduced, B5); + Assert.Equal(xr[0], x[0], 1e-4); + Assert.Equal(xr[1], x[1], 1e-4); + } + + // Columns 1000x apart in scale and exactly parallel: the pivot tolerance is relative to the column's own + // diagonal, so it catches the duplicate at any absolute scale. + [Theory] + [InlineData(1e3f)] + [InlineData(1e-3f)] + public void ParallelColumnsAreDependentAtAnyAbsoluteScale(float scale) + { + const int m = 5, n = 3; + var a = (float[])A54.Clone(); + for (var r = 0; r < m; r++) a[r * n + 2] = 0.37f * a[r * n + 0]; + for (var i = 0; i < a.Length; i++) a[i] *= scale; + var lo = Fill(-1000f / scale, n); + var hi = Fill(1000f / scale, n); + var x = new float[n]; + var status = Solve(m, n, a, B5, lo, hi, x, out var iterations); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.True(iterations <= 2, $"{iterations} iterations"); + var reduced = new float[m * 2]; + for (var r = 0; r < m; r++) { reduced[r * 2] = a[r * n]; reduced[r * 2 + 1] = a[r * n + 1]; } + var xr = NormalEquationSolution(m, 2, reduced, B5); + var xs = new float[n]; + xs[0] = (float)xr[0]; + xs[1] = (float)xr[1]; + var bb = 0.0; + foreach (var v in B5) bb += (double)v * v; + Assert.True(Cost(m, n, a, B5, x) - Cost(m, n, a, B5, xs) <= 1e-6 * bb, "cost above the reduced optimum"); + } + + // No path allocates: not the first InvalidInput, not a cap hit, not a solve that releases bounds. Each path is + // measured on its first call and again after, so a one-time runtime cost shows up as a difference between the two + // rather than as a solver allocation. + [Fact] + public void EveryPathAllocatesNothing() + { + const int m = 4, n = 3; + var a = new[] { 1.0f, 0.2f, 0.1f, 0.1f, 1.0f, 0.3f, -0.2f, 0.2f, 1.0f, 0.5f, 0.5f, 0.4f }; + var b = new[] { 10f, -10f, 10f, 1f }; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + var workspace = new float[BoundedLeastSquares.WorkspaceLength(n)]; + var x = new float[n]; + var bad = (float[])a.Clone(); + bad[4] = float.NaN; + + var paths = new (string name, float[] a, int cap, BoundedLeastSquaresStatus expected)[] + { + ("invalid", bad, 100, BoundedLeastSquaresStatus.InvalidInput), + ("converged", a, 100, BoundedLeastSquaresStatus.Converged), + ("limit", a, 1, BoundedLeastSquaresStatus.IterationLimit), + }; + foreach (var (name, matrix, cap, expected) in paths) + { + var bytes = new long[2]; + for (var call = 0; call < 2; call++) + { + Array.Clear(x); + var before = GC.GetAllocatedBytesForCurrentThread(); + var status = BoundedLeastSquares.Solve(m, n, matrix, b, lo, hi, x, workspace, out _, cap); + bytes[call] = GC.GetAllocatedBytesForCurrentThread() - before; + Assert.Equal(expected, status); + } + Assert.True(bytes[0] == 0 && bytes[1] == 0, $"{name}: first call {bytes[0]} B, second {bytes[1]} B"); + } + } + + // The allocator problem of the Aetheria thrust allocator: four throttles u in [0,1] and four slack pairs + // e+x e-x e+y e-y in [0,2]. Rows: x and y translation, yaw, four slack pulls, four throttle regularisers. Duel columns. + private static readonly float[] DuelX = { 0f, 0f, 29.08f, -21.80f }; + private static readonly float[] DuelY = { 53.94f, 61.19f, 0f, 0f }; + private static readonly float[] DuelYaw = { 49.24f, -55.86f, 166.26f, -124.63f }; + + private static (int m, int n, float[] a, float[] b, float[] lo, float[] hi) DuelProblem(float ix, float iy, float iz) + { + const int m = 11, n = 8; + const float h = 100f, wy = 1000f, w = 0.3f, kappa = 10f, rho = 0.1f; + var a = new float[m * n]; + var b = new float[m]; + var rows = new[] { DuelX, DuelY, DuelYaw }; + var intent = new[] { ix, iy, iz }; + for (var r = 0; r < 3; r++) + { + var pos = 0f; + var neg = 0f; + foreach (var v in rows[r]) { if (v > 0f) pos += v; else neg -= v; } + var s = Math.Max(pos, neg); + var d = intent[r] * (intent[r] >= 0f ? pos : neg); + var weight = r == 2 ? wy : h; + for (var k = 0; k < 4; k++) a[r * n + k] = weight * rows[r][k] / s; + if (r < 2) + { + a[r * n + 4 + 2 * r] = -weight; + a[r * n + 5 + 2 * r] = weight; + } + b[r] = weight * d / s; + } + for (var k = 0; k < 4; k++) + { + a[(3 + k) * n + 4 + k] = w; + b[3 + k] = -w * kappa; + a[(7 + k) * n + k] = rho; + } + var lo = new float[n]; + var hi = new float[n]; + for (var j = 0; j < n; j++) hi[j] = j < 4 ? 1f : 2f; + return (m, n, a, b, lo, hi); + } + + private static string Bits(BoundedLeastSquaresStatus status, int iterations, float[] x) + { + var sb = new System.Text.StringBuilder().Append(status).Append(' ').Append(iterations); + foreach (var v in x) sb.Append(' ').Append(BitConverter.SingleToInt32Bits(v).ToString("x8")); + return sb.ToString(); + } + + // The before/after pin of the cut that added a tolerance argument: literals recorded by running the pre-cut solver. + [Fact] + public void DefaultSolvesAreBitIdenticalToTheirGoldenBits() + { + List Run(bool passTheDefault) + { + var cases = new List(); + BoundedLeastSquaresStatus Go(int m, int n, float[] a, float[] b, float[] lo, float[] hi, float[] x, out int it) + => passTheDefault + ? SolveAt(m, n, a, b, lo, hi, x, out it, BoundedLeastSquares.DefaultKktRelativeTolerance) + : Solve(m, n, a, b, lo, hi, x, out it); + { + const int m = 5, n = 3; + var x = new float[n]; + var status = Go(m, n, A54, B5, Fill(-1f, n), Fill(1f, n), x, out var it); + cases.Add(Bits(status, it, x)); + } + foreach (var seed in new uint[] { 3, 11, 29 }) + { + var (m, n, a, b, lo, hi) = RandomProblem(seed); + var x = new float[n]; + var status = Go(m, n, a, b, lo, hi, x, out var it); + cases.Add(Bits(status, it, x)); + } + { + var (m, n, a, b, lo, hi) = DuelProblem(0f, 0.5f, 0.25f); + var x = new float[n]; + var status = Go(m, n, a, b, lo, hi, x, out var it); + cases.Add(Bits(status, it, x)); + } + return cases; + } + var golden = new[] + { + "Converged 0 3e8cfe03 bdd096e8 3f65616f", + "Converged 7 3f800000 00000000 be800000 bdb5b48d 00000000 3f800000 bf3f85df 3dca36f5 3dd187b0 3dcccccd 3f469416 3ea87652 3f4e1a2a", + "Converged 2 be800000 be2481b8 bf1f1f78 3eb37f7c 3ec24a46 bdbe3cf6 3dcccccd", + "Converged 3 00000000 3d0d206f 3dcccccd 3f800000 3ef2bfd6 3ebe0bf2 bf600698 bf800000 3f528e24 bddf446c 3c173499 00000000", + "Converged 5 3f800000 00000000 3ce45d43 00000000 3ce39ffe 00000000 00000000 3d0098ef", + }; + Assert.Equal(string.Join("\n", golden), string.Join("\n", Run(false))); + Assert.Equal(string.Join("\n", golden), string.Join("\n", Run(true))); + } + + private static BoundedLeastSquaresStatus SolveAt(int m, int n, float[] a, float[] b, float[] lo, float[] hi, float[] x, + out int iterations, double kktRelativeTolerance, int maxIterations = BoundedLeastSquares.DefaultMaxIterations) + => BoundedLeastSquares.Solve(m, n, a, b, lo, hi, x, new float[BoundedLeastSquares.WorkspaceLength(n)], out iterations, + kktRelativeTolerance, maxIterations); + + private static float[] Start(int n, float throttles) + { + var x = new float[n]; + for (var k = 0; k < 4; k++) x[k] = throttles; + return x; + } + + [Fact] + public void TheDefaultToleranceConstantIsOneEMinusSix() + { + Assert.Equal(1e-6, BoundedLeastSquares.DefaultKktRelativeTolerance); + for (uint seed = 1; seed <= 50; seed++) + { + var (m, n, a, b, lo, hi) = RandomProblem(seed); + var omitted = new float[n]; + var passed = new float[n]; + var s1 = Solve(m, n, a, b, lo, hi, omitted, out var i1); + var s2 = SolveAt(m, n, a, b, lo, hi, passed, out var i2, BoundedLeastSquares.DefaultKktRelativeTolerance); + Assert.Equal(Bits(s1, i1, omitted), Bits(s2, i2, passed)); + } + } + + // Row 0 is heavy (gradient scale 1e4); row 1 carries a light term whose gradient w^2 = 9e-6 sits under 1e-6 of + // that scale, so the default calls x0 stationary at 0 although cost falls by 90 when x0 rises to 1. + private static readonly float[] HeavyA = { 10f, 100f, 0.003f, 0f }; + private static readonly float[] HeavyB = { 100f, 0.003f }; + + [Fact] + public void ALightTermUnderAHeavyRowIsResolvedOnlyByATightEnoughTolerance() + { + const int m = 2, n = 2; + var lo = new float[n]; + var hi = Fill(1f, n); + foreach (var tol in new[] { BoundedLeastSquares.DefaultKktRelativeTolerance, 1e-9 }) + { + var x = new float[n]; + Assert.Equal(BoundedLeastSquaresStatus.Converged, SolveAt(m, n, HeavyA, HeavyB, lo, hi, x, out _, tol)); + Assert.Equal(0f, x[0]); + } + var tight = new float[n]; + Assert.Equal(BoundedLeastSquaresStatus.Converged, SolveAt(m, n, HeavyA, HeavyB, lo, hi, tight, out _, 1e-12)); + Assert.Equal(1f, tight[0], 1e-5); + Assert.Equal(0.9f, tight[1], 1e-5); + } + + [Fact] + public void ATightToleranceDoesNotDependOnTheStart() + { + const int m = 2, n = 2; + var lo = new float[n]; + var hi = Fill(1f, n); + foreach (var (s0, s1) in new[] { (0f, 0f), (1f, 0f), (0.5f, 0.5f), (1f, 1f) }) + { + var x = new[] { s0, s1 }; + Assert.Equal(BoundedLeastSquaresStatus.Converged, SolveAt(m, n, HeavyA, HeavyB, lo, hi, x, out _, 1e-12)); + Assert.Equal(1f, x[0], 1e-5); + Assert.Equal(0.9f, x[1], 1e-5); + } + var cold = new float[n]; + var warm = new[] { 1f, 0f }; + Solve(m, n, HeavyA, HeavyB, lo, hi, cold, out _); + Solve(m, n, HeavyA, HeavyB, lo, hi, warm, out _); + Assert.Equal(0f, cold[0]); + Assert.Equal(1f, warm[0]); + } + + [Theory] + [InlineData(0f, 0.5f, 0.25f)] + [InlineData(-1f, 0f, 0.25f)] + public void AnAllocatorShapedProblemIsStartIndependentAtATightTolerance(float ix, float iy, float iz) + { + var (m, n, a, b, lo, hi) = DuelProblem(ix, iy, iz); + var cold = Start(n, 0f); + Assert.Equal(BoundedLeastSquaresStatus.Converged, SolveAt(m, n, a, b, lo, hi, cold, out var coldIterations, 1e-12)); + Assert.True(coldIterations <= 20, $"cold {coldIterations} iterations"); + foreach (var throttles in new[] { 1f, 0.5f }) + { + var x = Start(n, throttles); + var status = SolveAt(m, n, a, b, lo, hi, x, out var iterations, 1e-12); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + Assert.True(iterations <= 20, $"start {throttles}: {iterations} iterations"); + for (var k = 0; k < 4; k++) Assert.Equal(cold[k], x[k], 1e-4); + } + + var defaultCold = Start(n, 0f); + var defaultOnes = Start(n, 1f); + Solve(m, n, a, b, lo, hi, defaultCold, out _); + Solve(m, n, a, b, lo, hi, defaultOnes, out _); + var spread = 0.0; + for (var k = 0; k < 4; k++) spread = Math.Max(spread, Math.Abs(defaultOnes[k] - defaultCold[k])); + Assert.True(spread >= 0.5, $"default tolerance: starts differ by only {spread}"); + } + + // Soul's W5 (finding aetheria-release:finding:cut-thrust-allocator-core.s1.solver-converged-early): an allocator + // matrix (3 force rows, 4 slack pulls, 8 ridge rows; 8 throttles in [0,1], 4 slacks in [0,2]). From x = 0 the + // last release lowered the cost by less than the stall band while throttle 7 still sat at its upper bound + // with a gradient ten thousand times the tolerance, and the solver reported Converged there. + [Theory] + [InlineData(1e-12)] + [InlineData(1e-9)] + public void TheStopAfterAReleaseIsOnTheGradientNotTheCost(double tolerance) + { + var (m, n, a, b, lo, hi) = BlsTrace.AllocatorW5(0); + var cold = new float[n]; + Assert.Equal(BoundedLeastSquaresStatus.Converged, SolveAt(m, n, a, b, lo, hi, cold, out _, tolerance)); + Assert.Equal(0.92221445f, cold[7], 1e-4); + + var again = (float[])cold.Clone(); + Assert.Equal(BoundedLeastSquaresStatus.Converged, SolveAt(m, n, a, b, lo, hi, again, out var iterations, tolerance)); + Assert.Equal(0, iterations); + for (var j = 0; j < n; j++) Assert.Equal(cold[j], again[j], 1e-6); + } + + // The same problem with its columns rotated by `shift`, so that throttle 7 sits in every column position in turn and the + // release the old rule misjudged is a release of column 0, of the last column and of every one between. The stop after a + // release reads the gradient of whichever column was released, never a fixed one. + [Theory] + [InlineData(1e-12)] + [InlineData(1e-9)] + public void TheStopAfterAReleaseIsOnTheGradientWhicheverColumnWasReleased(double tolerance) + { + const int n = 12; + for (var shift = 0; shift < n; shift++) + { + var (m, _, a, b, lo, hi) = BlsTrace.AllocatorW5(shift); + var cold = new float[n]; + Assert.True(BoundedLeastSquaresStatus.Converged == SolveAt(m, n, a, b, lo, hi, cold, out _, tolerance), $"shift {shift}"); + Assert.True(Math.Abs(cold[(7 + shift) % n] - 0.92221445f) <= 1e-4, $"shift {shift}: throttle 7 is {cold[(7 + shift) % n]}"); + + var again = (float[])cold.Clone(); + Assert.True(BoundedLeastSquaresStatus.Converged == SolveAt(m, n, a, b, lo, hi, again, out var iterations, tolerance), $"shift {shift}: re-solve"); + Assert.True(iterations == 0, $"shift {shift}: re-solve took {iterations} iterations"); + } + } + + // b = 0 with the origin inside the box: the optimum is any x with Ax = 0, the gradient scale is 0 and so is the tolerance, and + // every gradient component the solve leaves behind is rounding. Releasing on such a violation cycles release / + // stationarity miss / re-bind until the iteration cap (the plain-batch problem at seed 141 in miniature). + [Fact] + public void ANoiseLevelViolationIsNeverReleased() + { + const int m = 2, n = 6; + var a = new[] + { + 1.0213068f, 0.97530603f, -0.5673449f, -0.64136946f, -0.07432885f, -0.35571396f, + 0.4326824f, 1.1969734f, -0.1343108f, -0.23431005f, -1.4009786f, 0.10656489f, + }; + var b = new float[m]; + var lo = new[] { -0.44782114f, 0f, -0.008422324f, -0.03878026f, 0f, -6.6434336f }; + var hi = new[] { 0.0448007f, 0f, 0.005942123f, 0.0785512f, 0f, 0.23079813f }; + var x = new[] { -0.28347927f, 0f, 0.0051532285f, -0.03878026f, 0f, 0.23079813f }; + Assert.Equal(BoundedLeastSquaresStatus.Converged, Solve(m, n, a, b, lo, hi, x, out var iterations)); + Assert.True(iterations <= 4, $"{iterations} iterations"); + for (var i = 0; i < m; i++) + { + var r = 0.0; + for (var j = 0; j < n; j++) r += a[i * n + j] * x[j]; + Assert.Equal(0.0, r, 1e-5); + } + } + + [Fact] + public void AnInvalidToleranceIsRejectedAndLeavesXUntouched() + { + const int m = 5, n = 3; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + foreach (var tol in new[] { 0.0, -1e-6, double.NaN, double.PositiveInfinity, double.NegativeInfinity, double.MinValue }) + { + var x = new[] { 0.25f, -0.5f, 2f }; + var before = (float[])x.Clone(); + var status = SolveAt(m, n, A54, B5, lo, hi, x, out var iterations, tol); + Assert.True(status == BoundedLeastSquaresStatus.InvalidInput, $"tolerance {tol}: {status}"); + Assert.Equal(0, iterations); + for (var j = 0; j < n; j++) + Assert.Equal(BitConverter.SingleToInt32Bits(before[j]), BitConverter.SingleToInt32Bits(x[j])); + } + var tiny = new float[n]; + Assert.Equal(BoundedLeastSquaresStatus.Converged, SolveAt(m, n, A54, B5, lo, hi, tiny, out _, double.Epsilon)); + } + + [Theory] + [InlineData(1e6, 1e-12)] + [InlineData(1e6, 1e-30)] + [InlineData(1e7, 1e-12)] + [InlineData(1e7, 1e-30)] + public void ATightToleranceStopsOnProgressNotOnTheCap(double cond, double tol) + { + const int m = 28, n = 24; + var worst = 0; + for (uint seed = 1; seed <= 30; seed++) + { + var (a, b) = BlsTrace.ConditionedProblem(m, n, cond, seed, 1.0, bAlongSmallestSingularVector: true); + var x = new float[n]; + var status = SolveAt(m, n, a, b, Fill(-1e9f, n), Fill(1e9f, n), x, out var iterations, tol); + Assert.True(status == BoundedLeastSquaresStatus.Converged, $"cond {cond} tol {tol} seed {seed}: {status} after {iterations}"); + worst = Math.Max(worst, iterations); + } + Assert.True(worst <= 30, $"cond {cond} tol {tol}: {worst} iterations"); + } + + [Fact] + public void TheTolerancePathAllocatesNothing() + { + const int m = 4, n = 3; + var a = new[] { 1.0f, 0.2f, 0.1f, 0.1f, 1.0f, 0.3f, -0.2f, 0.2f, 1.0f, 0.5f, 0.5f, 0.4f }; + var b = new[] { 10f, -10f, 10f, 1f }; + var lo = Fill(-1f, n); + var hi = Fill(1f, n); + var workspace = new float[BoundedLeastSquares.WorkspaceLength(n)]; + var x = new float[n]; + var paths = new (string name, double tol, BoundedLeastSquaresStatus expected)[] + { + ("tight", 1e-12, BoundedLeastSquaresStatus.Converged), + ("invalid", double.NaN, BoundedLeastSquaresStatus.InvalidInput), + }; + foreach (var (name, tol, expected) in paths) + { + var bytes = new long[2]; + for (var call = 0; call < 2; call++) + { + Array.Clear(x); + var before = GC.GetAllocatedBytesForCurrentThread(); + var status = BoundedLeastSquares.Solve(m, n, a, b, lo, hi, x, workspace, out _, tol); + bytes[call] = GC.GetAllocatedBytesForCurrentThread() - before; + Assert.Equal(expected, status); + } + Assert.True(bytes[0] == 0 && bytes[1] == 0, $"{name}: first call {bytes[0]} B, second {bytes[1]} B"); + } + } + + [Fact] + public void TheOriginalSolveSignatureStillExists() + { + var original = typeof(BoundedLeastSquares).GetMethod(nameof(BoundedLeastSquares.Solve), new[] + { + typeof(int), typeof(int), + typeof(ReadOnlySpan), typeof(ReadOnlySpan), typeof(ReadOnlySpan), typeof(ReadOnlySpan), + typeof(Span), typeof(Span), + typeof(int).MakeByRefType(), typeof(int), + }); + Assert.NotNull(original); + } + + // The heavy-row shape with a free light weight w: at (x0, x1) = (0, 1) the gradient of x0 is w^2 against a + // gradient scale of 1e4, so x0's release flips where the caller's tolerance crosses the relative gradient + // computed here from the inputs alone. + private static float[] ShapeA(float w) => new[] { 10f, 100f, w, 0f }; + private static float[] ShapeB(float w) => new[] { 100f, w }; + + private static double ShapeRelativeGradient(float w) + { + var a = ShapeA(w); + var b = ShapeB(w); + double atb0 = (double)a[0] * b[0] + (double)a[2] * b[1]; + double atb1 = (double)a[1] * b[0] + (double)a[3] * b[1]; + var gScale = Math.Max(Math.Abs(atb0), Math.Abs(atb1)); + double ata01 = (double)a[0] * a[1] + (double)a[2] * a[3]; + return Math.Abs(ata01 - atb0) / gScale; + } + + private static float ShapeX0(float w, double? tolerance) + { + var x = new float[2]; + var lo = new float[2]; + var hi = Fill(1f, 2); + var status = tolerance is { } t + ? SolveAt(2, 2, ShapeA(w), ShapeB(w), lo, hi, x, out _, t) + : Solve(2, 2, ShapeA(w), ShapeB(w), lo, hi, x, out _); + Assert.Equal(BoundedLeastSquaresStatus.Converged, status); + return x[0]; + } + + // Weights put the relative gradient at about 1e-5 (above the default tolerance) and 9e-10, 9e-12, 9e-14 (below it). + [Theory] + [InlineData(0.316f)] + [InlineData(0.03f)] + [InlineData(0.003f)] + [InlineData(0.0003f)] + public void TheReleaseFlipsAtTheCallersToleranceTimesTheGradientScale(float w) + { + var rel = ShapeRelativeGradient(w); + Assert.True(ShapeX0(w, rel * 1.05) == 0f, $"w {w} rel {rel:R}: above the threshold x0 stays at 0"); + var below = ShapeX0(w, rel * 0.95); + Assert.True(Math.Abs(below - 1f) < 1e-4, $"w {w} rel {rel:R}: below the threshold x0 is {below}"); + } + + // A relative gradient 10% either side of 1e-6: the solve that omits the tolerance releases the one above and + // not the one below, and equals the solve that passes the default, so the forwarded default is 1e-6 and no + // other value within 10%. + [Theory] + [InlineData(0.104881f, 1f)] + [InlineData(0.094868f, 0f)] + public void TheOmittedToleranceReleasesAtOneEMinusSixAndNowhereNear(float w, float expectedX0) + { + var rel = ShapeRelativeGradient(w); + Assert.InRange(rel, 0.9e-6 * 0.99, 1.1e-6 * 1.01); + Assert.Equal(expectedX0, ShapeX0(w, null), 1e-4); + Assert.Equal(expectedX0, ShapeX0(w, BoundedLeastSquares.DefaultKktRelativeTolerance), 1e-4); + } + + // The box is wide enough that no bound is ever released, so any difference between the default and a tight + // tolerance is decided by the stationarity test of the free set alone. + [Fact] + public void AllFreeConditionedProblemsHonourTheToleranceAtTheFreeSetTest() + { + const int m = 28, n = 24; + int differ = 0, total = 0; + foreach (var cond in new[] { 1e2, 1e3, 1e4, 1e5, 1e6 }) + foreach (var along in new[] { true, false }) + for (uint seed = 1; seed <= 30; seed++) + { + var (a, b) = BlsTrace.ConditionedProblem(m, n, cond, seed, 1.0, bAlongSmallestSingularVector: along); + var byDefault = new float[n]; + var tight = new float[n]; + var s1 = Solve(m, n, a, b, Fill(-1e9f, n), Fill(1e9f, n), byDefault, out var i1); + var s2 = SolveAt(m, n, a, b, Fill(-1e9f, n), Fill(1e9f, n), tight, out var i2, 1e-12); + total++; + if (Bits(s1, i1, byDefault) != Bits(s2, i2, tight)) differ++; + } + Assert.True(differ >= total / 10, $"only {differ} of {total} all-free solves changed between the default and 1e-12"); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTrace.cs b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTrace.cs new file mode 100644 index 00000000..c9baeb0e --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTrace.cs @@ -0,0 +1,225 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CultMath; + +namespace CultMath.Tests; + +// The solver's decisions, recorded in order through the internal ISolveTrace seam, and the problems they are recorded on. +// BlsTrace is the only place that knows how a trace is written; BoundedLeastSquaresTraceTests compares it with the trace +// the base commit (dbcb2a8e) produced for the same problems, and with hand-built decision inputs. +internal static class BlsTrace +{ + internal sealed class Recorder : ISolveTrace + { + public readonly List Lines = new(); + + public void Record(SolveEvent kind, int column, double a, double b, double c) + => Lines.Add($"{kind} {column} {F(a)} {F(b)} {F(c)}"); + } + + // Round-trip text: equal strings are equal doubles. + internal static string F(double v) => v.ToString("R", CultureInfo.InvariantCulture); + + internal sealed record Case(string Name, int M, int N, float[] A, float[] B, float[] Lo, float[] Hi, float[] X0, double Tolerance, int MaxIterations); + + // The solve of one case: every decision, then the status, the iteration count and the bits of x. + internal static string Trace(Case c) + { + var rec = new Recorder(); + var x = (float[])c.X0.Clone(); + var status = BoundedLeastSquares.SolveTraced(c.M, c.N, c.A, c.B, c.Lo, c.Hi, x, + new float[BoundedLeastSquares.WorkspaceLength(c.N)], out var iterations, c.Tolerance, c.MaxIterations, rec); + var sb = new StringBuilder(); + foreach (var line in rec.Lines) sb.Append(line).Append('\n'); + sb.Append($"end {status} {iterations}"); + foreach (var v in x) sb.Append(' ').Append(BitConverter.SingleToInt32Bits(v).ToString("x8", CultureInfo.InvariantCulture)); + return sb.ToString(); + } + + private static float[] Fill(float value, int n) + { + var v = new float[n]; + Array.Fill(v, value); + return v; + } + + private static Case Make(string name, int m, int n, float[] a, float[] b, float[] lo, float[] hi, float[]? x0 = null, + double tol = BoundedLeastSquares.DefaultKktRelativeTolerance, int max = BoundedLeastSquares.DefaultMaxIterations) + => new(name, m, n, a, b, lo, hi, x0 ?? (float[])lo.Clone(), tol, max); + + internal static IEnumerable Cases() + { + // Equal violations: which column is released first is the tie-break (min |x0 + x1 - 1| on [0,1]^2, then three copies). + yield return Make("tie-pair", 1, 2, new[] { 1f, 1f }, new[] { 1f }, new float[2], Fill(1f, 2)); + yield return Make("tie-triple", 2, 3, Fill(1f, 6), new[] { 1f, 1f }, new float[3], Fill(1f, 3)); + // The cap reached right after a release, before any further step: the other place the cap ends a solve. + yield return Make("tie-pair-cap-0", 1, 2, new[] { 1f, 1f }, new[] { 1f }, new float[2], Fill(1f, 2), max: 0); + yield return Make("tie-pair-at-hi", 1, 2, new[] { 1f, 1f }, new[] { -1f }, new float[2], Fill(1f, 2), Fill(1f, 2)); + + // A step that lands exactly on a bound is a full step, not a blocked one. + yield return Make("step-lands-on-bound", 1, 1, new[] { 1f }, new[] { 1f }, new[] { 0f }, new[] { 1f }, new[] { 0.5f }); + yield return Make("step-blocked", 2, 2, new[] { 1f, 0f, 0f, 1f }, new[] { 3f, -0.5f }, new[] { 0f, -1f }, new[] { 1f, 1f }, new[] { 0.5f, 0.5f }); + + // Soul's W5, with throttle 7 released from every column position in turn (column 0 included). + foreach (var shift in new[] { 0, 1, 5, 7, 11 }) + { + var (m, n, a, b, lo, hi) = AllocatorW5(shift); + yield return Make($"w5-shift{shift}-1e-12", m, n, a, b, lo, hi, new float[n], 1e-12); + } + { + var (m, n, a, b, lo, hi) = AllocatorW5(0); + yield return Make("w5-default", m, n, a, b, lo, hi, new float[n]); + yield return Make("w5-1e-9", m, n, a, b, lo, hi, new float[n], 1e-9); + yield return Make("w5-cap-3", m, n, a, b, lo, hi, new float[n], 1e-12, 3); + } + + // A release followed by a stationarity miss: the first miss is not yet a stall. + yield return Make("confirm-pass-1", 4, 2, + new[] { -0.0067761745f, -207.21786f, -0.004115388f, -751.1994f, -8.1700025E-05f, -481.7794f, 0.0038280683f, 480.12833f }, + new[] { 1.7477255f, 2.4914713f, -2.3861952f, 2.187128f }, new[] { -1f, -0.25f }, new[] { 1f, 0.1f }, tol: 1e-12); + yield return Make("confirm-pass-2", 5, 2, + new[] { 70.07762f, 5.7015634f, 111.790436f, -12.586686f, 75.29796f, 12.872999f, -402.25464f, -1.8093401f, -524.51056f, -8.649797f }, + new[] { -1.8312539f, 2.9556413f, 0.7550676f, -2.1365998f, 2.30717f }, new[] { -1f, 0f }, new[] { 1f, 1f }, tol: 1e-12); + + // The noise-level problems: columns rescaled so the gate is the only thing between a release and a spin. + { + const int m = 2, n = 6; + var a0 = new[] + { + 1.0213068f, 0.97530603f, -0.5673449f, -0.64136946f, -0.07432885f, -0.35571396f, + 0.4326824f, 1.1969734f, -0.1343108f, -0.23431005f, -1.4009786f, 0.10656489f, + }; + var lo0 = new[] { -0.44782114f, 0f, -0.008422324f, -0.03878026f, 0f, -6.6434336f }; + var hi0 = new[] { 0.0448007f, 0f, 0.005942123f, 0.0785512f, 0f, 0.23079813f }; + var x0 = new[] { -0.28347927f, 0f, 0.0051532285f, -0.03878026f, 0f, 0.23079813f }; + foreach (var (name, scale) in new (string, float[])[] + { + ("one-heavy", new[] { 1f, 1f, 1e4f, 1f, 1f, 1f }), + ("one-light", new[] { 1e3f, 1e3f, 1e-3f, 1e3f, 1e3f, 1e3f }), + ("ascending", new[] { 1f, 1e1f, 1e2f, 1e3f, 1e4f, 1e5f }), + }) + { + var a = new float[m * n]; + var lo = new float[n]; + var hi = new float[n]; + var x = new float[n]; + for (var j = 0; j < n; j++) + { + for (var i = 0; i < m; i++) a[i * n + j] = a0[i * n + j] * scale[j]; + lo[j] = lo0[j] / scale[j]; + hi[j] = hi0[j] / scale[j]; + x[j] = Math.Clamp(x0[j] / scale[j], lo[j], hi[j]); + } + yield return Make($"noise-{name}", m, n, a, new float[m], lo, hi, x); + } + } + + // Near-singular and below-the-noise-floor free sets: stationarity misses and stalls. + foreach (var seed in new uint[] { 3, 11 }) + { + var (a, b) = ConditionedProblem(28, 24, 3e7, seed); + yield return Make($"near-singular-{seed}", 28, 24, a, b, Fill(-1e9f, 24), Fill(1e9f, 24), new float[24]); + } + foreach (var seed in new uint[] { 2, 9 }) + { + var (a, b) = ConditionedProblem(28, 24, 1e7, seed, 1.0, bAlongSmallestSingularVector: true); + yield return Make($"below-noise-{seed}", 28, 24, a, b, Fill(-1e9f, 24), Fill(1e9f, 24), new float[24]); + } + { + var (a, b) = ConditionedProblem(12, 8, 1e5, 4); + yield return Make("boxed-conditioned", 12, 8, a, b, Fill(-0.05f, 8), Fill(0.05f, 8), new float[8], 1e-9); + } + + // Boxed random problems, cold and from a far warm start. + foreach (var seed in new uint[] { 5, 17, 40 }) + { + var rng = new CultMath.Random(seed * 7919u); + var n = rng.NextInt(2, 9); + var m = rng.NextInt(n, 14); + var a = new float[m * n]; + var b = new float[m]; + for (var i = 0; i < a.Length; i++) a[i] = rng.NextFloat(-1f, 1f); + for (var i = 0; i < m; i++) b[i] = rng.NextFloat(-3f, 3f); + var lo = new float[n]; + var hi = new float[n]; + for (var j = 0; j < n; j++) + { + lo[j] = rng.NextInt(2) == 0 ? -1f : 0f; + hi[j] = rng.NextInt(2) == 0 ? 1f : 0.1f; + } + yield return Make($"random-{seed}", m, n, a, b, lo, hi, new float[n]); + yield return Make($"random-{seed}-warm-hi", m, n, a, b, lo, hi, (float[])hi.Clone()); + } + } + + // A = U diag(s) V^T with s geometric from 1 down to 1/cond, so cond(A) is the requested value (float rounding of A + // perturbs it slightly). m x n with m >= n; b is generic, so it has a real residual when m > n. + internal static (float[] a, float[] b) ConditionedProblem(int m, int n, double cond, uint seed, double aScale = 1.0, bool bAlongSmallestSingularVector = false) + { + var rng = new CultMath.Random(seed * 2654435761u + 17u); + double[][] Orthonormal(int dim, int count) + { + var q = new double[count][]; + for (var k = 0; k < count; k++) + { + var v = new double[dim]; + for (var i = 0; i < dim; i++) v[i] = rng.NextFloat(-1f, 1f); + for (var pass = 0; pass < 2; pass++) + for (var l = 0; l < k; l++) + { + var dot = 0.0; + for (var i = 0; i < dim; i++) dot += v[i] * q[l][i]; + for (var i = 0; i < dim; i++) v[i] -= dot * q[l][i]; + } + var norm = 0.0; + for (var i = 0; i < dim; i++) norm += v[i] * v[i]; + norm = Math.Sqrt(norm); + for (var i = 0; i < dim; i++) v[i] /= norm; + q[k] = v; + } + return q; + } + var u = Orthonormal(m, n); + var w = Orthonormal(n, n); + var a = new float[m * n]; + for (var k = 0; k < n; k++) + { + var s = aScale * Math.Pow(cond, -(double)k / Math.Max(1, n - 1)); + for (var r = 0; r < m; r++) + for (var c = 0; c < n; c++) + a[r * n + c] += (float)(u[k][r] * s * w[k][c]); + } + var b = new float[m]; + for (var i = 0; i < m; i++) b[i] = bAlongSmallestSingularVector ? (float)u[n - 1][i] : rng.NextFloat(-3f, 3f); + return (a, b); + } + + // Column j of the returned problem is column (j - shift) mod 12 of Soul's W5. + internal static (int m, int n, float[] a, float[] b, float[] lo, float[] hi) AllocatorW5(int shift) + { + const int m = 15, n = 12; + var w = new float[m * n]; + w[0 * n + 2] = 100f; w[0 * n + 8] = -100f; w[0 * n + 9] = 100f; + var row1 = new[] { 13.882518f, 20.86695f, 0f, 14.8965845f, 12.38046f, 22.115599f, -13.706654f, 15.85789f, 0f, 0f, -100f, 100f }; + var row2 = new[] { -187.72859f, 239.31168f, 158.87828f, -270.31165f, 235.38467f, -14.704258f, 121.61232f, 244.81305f }; + for (var j = 0; j < n; j++) w[1 * n + j] = row1[j]; + for (var j = 0; j < row2.Length; j++) w[2 * n + j] = row2[j]; + for (var k = 0; k < 4; k++) w[(3 + k) * n + 8 + k] = 0.3f; + for (var i = 0; i < 8; i++) w[(7 + i) * n + i] = 0.1f; + var b = new float[m]; + b[1] = 67.385445f; b[2] = 558.70917f; + for (var k = 0; k < 4; k++) b[3 + k] = -3f; + var lo = new float[n]; + var hi = new float[n]; + var a = new float[m * n]; + for (var j = 0; j < n; j++) + { + var to = (j + shift) % n; + hi[to] = j < 8 ? 1f : 2f; + for (var r = 0; r < m; r++) a[r * n + to] = w[r * n + j]; + } + return (m, n, a, b, lo, hi); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTraceTests.cs b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTraceTests.cs new file mode 100644 index 00000000..57b2f9f2 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTraceTests.cs @@ -0,0 +1,360 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +// The stopping rule is a set of decisions, so it is pinned where it is decided. The solver reports each decision, in order and +// with the values it compared, through an internal trace sink (ISolveTrace); these tests assert that record with exact +// equality, never a status or a tolerance band. Two sources of truth: +// - BlsBaseTraces: the same decisions as the base commit dbcb2a8e took them on the same problems, so Solve's defaults are +// unchanged decision by decision, not only in the end; +// - hand-built inputs to the three judgement functions, for states a solve may never reach (a release after a stationarity +// miss with a finite stall mark) where only the decision itself can be asked. +public sealed class BoundedLeastSquaresTraceTests +{ + private static string Normal(string s) => s.Replace("\r\n", "\n"); + + [Fact] + public void EveryDecisionEqualsTheBaseCommitsOnTheSameProblem() + { + foreach (var c in BlsTrace.Cases()) + { + Assert.True(BlsBaseTraces.Expected.TryGetValue(c.Name, out var expected), $"{c.Name}: no base trace"); + var trace = BlsTrace.Trace(c); + Assert.Equal(Normal(expected!), WithoutFreeViolated(trace)); + var free = string.Join("\n", trace.Split('\n').Where(l => l.StartsWith("FreeViolated ", StringComparison.Ordinal))); + Assert.Equal(Normal(BlsBaseTraces.FreeViolatedLines.GetValueOrDefault(c.Name, "")), free); + } + Assert.Equal(BlsTrace.Cases().Count(), BlsBaseTraces.Expected.Count); + } + + // The base commit took the free-set test inline and recorded nothing for it; its record is the one thing the base traces lack. + private static string WithoutFreeViolated(string trace) + => string.Join("\n", trace.Split('\n').Where(l => !l.StartsWith("FreeViolated ", StringComparison.Ordinal))); + + // In a real solve the free-set test is a decision of its own, taken before the pass's release and outcome: a miss or a + // stall always follows the violating columns that caused it, KKT never does, and each recorded magnitude is above the + // threshold recorded beside it. + [Fact] + public void EveryMissAndStallIsPrecededByTheFreeColumnsThatBrokeStationarityAndKktByNone() + { + var misses = 0; + foreach (var c in BlsTrace.Cases()) + { + var violated = 0; + foreach (var line in BlsTrace.Trace(c).Split('\n')) + { + var parts = line.Split(' '); + switch (parts[0]) + { + case "FreeViolated": + violated++; + Assert.InRange(int.Parse(parts[1], System.Globalization.CultureInfo.InvariantCulture), 0, c.N - 1); + Assert.True(double.Parse(parts[2], System.Globalization.CultureInfo.InvariantCulture) > double.Parse(parts[3], System.Globalization.CultureInfo.InvariantCulture), c.Name); + break; + case "Miss": + case "Stall": + misses++; + Assert.True(violated > 0, $"{c.Name}: {parts[0]} without a violating free column"); + violated = 0; + break; + case "Kkt": + Assert.True(violated == 0, $"{c.Name}: KKT after a violating free column"); + break; + case "Release": + case "Step": + case "Cap": + violated = 0; + break; + } + } + } + Assert.True(misses > 0); + } + + // Each kind of decision, and the ones the stop rule's variants differ on, occurs in the recorded problems: a case table + // that stopped exercising a decision would pin nothing about it. + [Fact] + public void TheCasesExerciseEveryKindOfDecision() + { + var lines = BlsTrace.Cases().SelectMany(c => BlsTrace.Trace(c).Split('\n')).ToList(); + foreach (var kind in Enum.GetValues()) + Assert.True(lines.Any(l => l.StartsWith(kind + " ", StringComparison.Ordinal)), $"{kind} is never recorded"); + Assert.Contains(lines, l => l.StartsWith("Release 0 ", StringComparison.Ordinal)); + Assert.Contains(lines, l => l.StartsWith("Release 11 ", StringComparison.Ordinal)); + } + + // The sink only observes: with it, without it and through the public overload the solve is the same, bit for bit. + [Fact] + public void ARecordingSinkNeverChangesTheSolve() + { + foreach (var c in BlsTrace.Cases()) + { + var plain = (float[])c.X0.Clone(); + var traced = (float[])c.X0.Clone(); + var viaPublic = (float[])c.X0.Clone(); + var ws = new float[BoundedLeastSquares.WorkspaceLength(c.N)]; + var s1 = BoundedLeastSquares.SolveTraced(c.M, c.N, c.A, c.B, c.Lo, c.Hi, plain, ws, out var i1, c.Tolerance, c.MaxIterations, null); + var s2 = BoundedLeastSquares.SolveTraced(c.M, c.N, c.A, c.B, c.Lo, c.Hi, traced, ws, out var i2, c.Tolerance, c.MaxIterations, new BlsTrace.Recorder()); + var s3 = BoundedLeastSquares.Solve(c.M, c.N, c.A, c.B, c.Lo, c.Hi, viaPublic, ws, out var i3, c.Tolerance, c.MaxIterations); + Assert.True(s1 == s2 && s2 == s3 && i1 == i2 && i2 == i3, c.Name); + for (var j = 0; j < c.N; j++) + { + Assert.Equal(BitConverter.SingleToInt32Bits(plain[j]), BitConverter.SingleToInt32Bits(traced[j])); + Assert.Equal(BitConverter.SingleToInt32Bits(plain[j]), BitConverter.SingleToInt32Bits(viaPublic[j])); + } + } + } + + private static string Judge(int release, bool freeViolated, ref double fMark, double[] x, double[] g, double[] atb, out bool over, double kktTol = 0.5) + { + var rec = new BlsTrace.Recorder(); + over = BoundedLeastSquares.JudgePass(release, freeViolated, kktTol, ref fMark, x, g, atb, x.Length, rec); + return string.Join("\n", rec.Lines); + } + + // Cost 0.5 * sum x (g - atb) = 2 and scale 0.5 * sum |x| (|g| + |atb|) = 4 for this point. + private static readonly double[] X1 = { 2.0 }; + private static readonly double[] G1 = { 3.0 }; + private static readonly double[] Atb1 = { 1.0 }; + + // A release is never judged by the cost, whichever column it is: a column-0 release with a stall mark the cost has not + // beaten goes on, and the mark is reset to +Inf. + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + public void AReleaseOfAnyColumnIsNotJudgedByTheCostAndResetsTheMark(int column) + { + var x = new[] { 2.0, 2.0, 2.0 }; + var g = new[] { 3.0, 3.0, 3.0 }; + var atb = new[] { 1.0, 1.0, 1.0 }; + var mark = 1.0; // below the cost 6: a stationarity miss with this mark would be a stall + var trace = Judge(column, true, ref mark, x, g, atb, out var over); + Assert.False(over); + Assert.Equal(double.PositiveInfinity, mark); + Assert.Equal($"Release {column} Infinity 0 0", trace); + } + + // The reset is to +Inf: not the cost (that would make the next equal cost a stall at once), not nothing. + [Fact] + public void AReleaseResetsTheMarkToPositiveInfinityNotToTheCostNorLeavesItStale() + { + var mark = 5.0; + Judge(2, false, ref mark, X1, G1, Atb1, out var over); + Assert.False(over); + Assert.Equal(double.PositiveInfinity, mark); + + // After the reset a miss at the cost the stale mark would have stopped on is only recorded. + var trace = Judge(-1, true, ref mark, X1, G1, Atb1, out over); + Assert.False(over); + Assert.Equal(2.0, mark); + Assert.Equal($"Miss -1 2 Infinity {BlsTrace.F(1e-15 * 4.0)}", trace); + } + + [Fact] + public void AStationarityMissIsOverOnlyWhenTheCostHasNotFallenByMoreThanTheRoundingAllowance() + { + var allowance = 1e-15 * 4.0; + + var mark = 2.0 + 3e-15; // 2 >= mark - allowance: not enough progress + var trace = Judge(-1, true, ref mark, X1, G1, Atb1, out var over); + Assert.True(over); + Assert.Equal($"Stall -1 2 {BlsTrace.F(2.0 + 3e-15)} {BlsTrace.F(allowance)}", trace); + + mark = 2.0 + 5e-15; // 2 < mark - allowance: progress, so go on and record the cost + trace = Judge(-1, true, ref mark, X1, G1, Atb1, out over); + Assert.False(over); + Assert.Equal(2.0, mark); + Assert.Equal($"Miss -1 2 {BlsTrace.F(2.0 + 5e-15)} {BlsTrace.F(allowance)}", trace); + + mark = 2.0; // equal cost is a stall + trace = Judge(-1, true, ref mark, X1, G1, Atb1, out over); + Assert.True(over); + Assert.Equal($"Stall -1 2 2 {BlsTrace.F(allowance)}", trace); + } + + // The stall comparison is f >= mark - allowance, pinned at its boundary to one ulp each side like the release gate. The point has + // cost exactly 0 (so the mark is the allowance itself and the subtraction is exact) and scale 4, allowance 4e-15: a stall at mark == + // allowance, progress one ulp above it, whatever factor, offset or clamp the comparison puts on the allowance. + [Fact] + public void TheStallComparisonIsExactAtTheAllowanceToTheUlp() + { + var x = new[] { 1.0, 1.0 }; + var g = new[] { 3.0, 1.0 }; + var atb = new[] { 1.0, 3.0 }; + var allowance = 1e-15 * 4.0; + + var mark = allowance; // 0 >= allowance - allowance + var trace = Judge(-1, true, ref mark, x, g, atb, out var over); + Assert.True(over); + Assert.Equal($"Stall -1 0 {BlsTrace.F(allowance)} {BlsTrace.F(allowance)}", trace); + + mark = Math.BitIncrement(allowance); // 0 < the smallest positive difference + trace = Judge(-1, true, ref mark, x, g, atb, out over); + Assert.False(over); + Assert.Equal(0.0, mark); + Assert.Equal($"Miss -1 0 {BlsTrace.F(Math.BitIncrement(allowance))} {BlsTrace.F(allowance)}", trace); + + mark = Math.BitDecrement(allowance); // 0 >= a negative difference + trace = Judge(-1, true, ref mark, x, g, atb, out over); + Assert.True(over); + Assert.Equal($"Stall -1 0 {BlsTrace.F(Math.BitDecrement(allowance))} {BlsTrace.F(allowance)}", trace); + } + + private static string FreeViolated(double[] g, int[] freeIndex, int freeCount, double kktTol, out bool violated) + { + var rec = new BlsTrace.Recorder(); + violated = BoundedLeastSquares.FreeSetViolated(g, freeIndex, freeCount, kktTol, rec); + return string.Join("\n", rec.Lines); + } + + // Every free column is judged, and each one that breaks stationarity is named with its gradient magnitude and the threshold + // it was judged against: not the first or last free column only, a column that is not free never, and the columns past + // freeCount never. + [Fact] + public void EveryFreeColumnIsJudgedAndTheViolatingOnesAreNamedWithTheirThreshold() + { + var g = new[] { 0.1, -0.3, 9.0, 0.2, -0.5, 7.0 }; + + // Column 1 only, in the middle of the free list. + var trace = FreeViolated(g, new[] { 0, 1, 3, 4, 5 }, 3, 0.25, out var violated); + Assert.True(violated); + Assert.Equal("FreeViolated 1 0.3 0.25 0", trace); + + // The free list is not the column order: the recorded column is the column, in list order, and column 2 (a bound) is not listed. + trace = FreeViolated(g, new[] { 4, 3, 1, 0, 5 }, 4, 0.25, out violated); + Assert.True(violated); + Assert.Equal("FreeViolated 4 0.5 0.25 0\nFreeViolated 1 0.3 0.25 0", trace); + + // Only the last listed column violates; only the first does. + trace = FreeViolated(g, new[] { 0, 3, 4 }, 3, 0.25, out violated); + Assert.Equal("FreeViolated 4 0.5 0.25 0", trace); + trace = FreeViolated(g, new[] { 4, 0, 3 }, 3, 0.25, out violated); + Assert.Equal("FreeViolated 4 0.5 0.25 0", trace); + + trace = FreeViolated(g, new[] { 0, 3 }, 2, 0.25, out violated); + Assert.False(violated); + Assert.Equal("", trace); + trace = FreeViolated(g, new int[0], 0, 0.0, out violated); + Assert.False(violated); + } + + // The threshold is the tolerance itself, at any scale: equal is stationary, one ulp above it (either sign) is not, one ulp + // below it is, and the threshold recorded is the one compared against. + [Theory] + [InlineData(1e-6)] + [InlineData(0.25)] + [InlineData(3.0)] + [InlineData(1e6)] + public void TheFreeStationarityThresholdIsTheToleranceToTheUlp(double kktTol) + { + var freeIndex = new[] { 0, 1, 2 }; + var above = Math.BitIncrement(kktTol); + var g = new[] { kktTol, -above, Math.BitDecrement(kktTol) }; + var trace = FreeViolated(g, freeIndex, 3, kktTol, out var violated); + Assert.True(violated); + Assert.Equal($"FreeViolated 1 {BlsTrace.F(above)} {BlsTrace.F(kktTol)} 0", trace); + + trace = FreeViolated(new[] { kktTol, -kktTol, Math.BitDecrement(kktTol) }, freeIndex, 3, kktTol, out violated); + Assert.False(violated); + Assert.Equal("", trace); + } + + // The cost and its scale are 0.5 sum x_j (g_j - atb_j) and 0.5 sum |x_j| (|g_j| + |atb_j|) over every column. + [Fact] + public void TheCostAndItsScaleCountEveryColumnAndTheirOwnSigns() + { + var x = new[] { 2.0, -1.0 }; + var g = new[] { 3.0, 1.0 }; + var atb = new[] { 1.0, 2.0 }; + var mark = double.PositiveInfinity; + var trace = Judge(-1, true, ref mark, x, g, atb, out var over); + Assert.False(over); + Assert.Equal($"Miss -1 2.5 Infinity {BlsTrace.F(1e-15 * 5.5)}", trace); + Assert.Equal(2.5, mark); + } + + [Fact] + public void NothingToReleaseAndAStationaryFreeSetIsKktAtOnce() + { + var mark = 1.0; + var trace = Judge(-1, false, ref mark, X1, G1, Atb1, out var over, kktTol: 0.25); + Assert.True(over); + Assert.Equal("Kkt -1 0.25 0 0", trace); + Assert.Equal(1.0, mark); + } + + private static string Select(double[] ata, double[] atb, double[] x, double[] g, int[] state, float[] lo, float[] hi, double kktTol, out int release) + { + var rec = new BlsTrace.Recorder(); + release = BoundedLeastSquares.SelectRelease(ata, atb, x, g, state, lo, hi, kktTol, x.Length, rec); + return string.Join("\n", rec.Lines); + } + + // Equal violations: the first column wins, and the second is never even a candidate. + [Fact] + public void OfEquallyViolatedBoundsTheFirstIsReleased() + { + var ata = new[] { 1.0, 0.0, 0.0, 1.0 }; + var atb = new[] { 0.0, 0.0 }; + var x = new[] { 0.0, 0.0 }; + var trace = Select(ata, atb, x, new[] { -1.0, -1.0 }, new[] { -1, -1 }, new[] { 0f, 0f }, new[] { 1f, 1f }, 0.1, out var release); + Assert.Equal(0, release); + Assert.Equal("Candidate 0 1 0 0.1", trace); + + // The most violated wins wherever it is, and a later equal one does not take it over. + ata = new[] { 1.0, 0, 0, 0, 1.0, 0, 0, 0, 1.0 }; + trace = Select(ata, new[] { 0.0, 0.0, 0.0 }, new[] { 0.0, 0.0, 0.0 }, new[] { -0.5, -2.0, -2.0 }, new[] { -1, -1, -1 }, new[] { 0f, 0f, 0f }, new[] { 1f, 1f, 1f }, 0.1, out release); + Assert.Equal(1, release); + Assert.Equal("Candidate 0 0.5 0 0.1\nCandidate 1 2 0 0.5", trace); + } + + [Fact] + public void ABoundIsReleasedOnlyAboveBothTheToleranceAndItsRoundingBound() + { + var ata = new[] { 1.0 }; + var lo = new[] { 0f }; + var hi = new[] { 1f }; + var x = new[] { 0.0 }; + + // violation == tolerance: not released (and not a candidate). + var trace = Select(ata, new[] { 0.0 }, x, new[] { -0.25 }, new[] { -1 }, lo, hi, 0.25, out var release); + Assert.Equal(-1, release); + Assert.Equal("", trace); + + // violation == rounding bound: a candidate that is not released. The bound here is (1 + 1) eps |atb| = 2 eps. + var noise = 2 * 2.220446049250313e-16 * 1.0; + trace = Select(ata, new[] { 1.0 }, x, new[] { -noise }, new[] { -1 }, lo, hi, 0.0, out release); + Assert.Equal(-1, release); + Assert.Equal($"Candidate 0 {BlsTrace.F(noise)} {BlsTrace.F(noise)} 0", trace); + + // One step above both: released. + var above = Math.BitIncrement(noise); + trace = Select(ata, new[] { 1.0 }, x, new[] { -above }, new[] { -1 }, lo, hi, 0.0, out release); + Assert.Equal(0, release); + Assert.Equal($"Candidate 0 {BlsTrace.F(above)} {BlsTrace.F(noise)} 0", trace); + + // A bound at hi violates with a positive gradient; a fixed column (lo == hi) is never released however steep. + trace = Select(ata, new[] { 0.0 }, new[] { 1.0 }, new[] { 4.0 }, new[] { 1 }, lo, hi, 0.5, out release); + Assert.Equal(0, release); + trace = Select(ata, new[] { 0.0 }, x, new[] { -9.0 }, new[] { -1 }, new[] { 0.5f }, new[] { 0.5f }, 0.5, out release); + Assert.Equal(-1, release); + Assert.Equal("", trace); + } + + // gamma_(n+1) = (n + 1) eps, times the magnitude of the terms of the released column's own gradient: its |atb| and its row of + // |ata x|. + [Fact] + public void TheRoundingBoundIsGammaTimesTheMagnitudeOfTheColumnsOwnTerms() + { + var ata = new[] { 2.0, 1.0, 1.0, 3.0 }; + var atb = new[] { 0.5, -4.0 }; + var x = new[] { 0.25, -2.0 }; + Assert.Equal(3 * 2.220446049250313e-16 * 10.25, BoundedLeastSquares.ReleaseNoise(ata, atb, x, 1, 2)); + Assert.Equal(3 * 2.220446049250313e-16 * 3.0, BoundedLeastSquares.ReleaseNoise(ata, atb, x, 0, 2)); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/CellularAndSminGradTests.cs b/packages/cultmath/tests/CultMath.Tests/CellularAndSminGradTests.cs new file mode 100644 index 00000000..465f6961 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/CellularAndSminGradTests.cs @@ -0,0 +1,686 @@ +using System; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +public sealed class CellularAndSminGradTests +{ + // Central-difference tolerances for smin_grad and cellular (F5), sized separately: the two + // functions have different curvature, so the same eps does not carry the same truncation + // error, and an earlier shared 3e-4 tolerance was fragile against both (Soul, cut 2a-i: measured + // max error smin 2.74e-4, cellular nearest 1.25e-4, cellular edge 1.88e-4 on a small sample — + // and re-measured here at 5.3e-4, 2.0e-4, 2.6e-4 on a larger one — against that 3e-4 tolerance, + // sometimes under 1.1x headroom, not the "~6e-5 noise" an earlier version of this comment + // claimed). Each tolerance below is set from its own measured worst case with real headroom. + + // smin_grad's value is exactly quadratic in position within a smoothing band (math.cs comment on + // smin_grad: h is affine in b.w - a.w, which is itself affine in position, so value(q) has zero + // third derivative there): central differences have no truncation error from curvature, only + // float32 rounding noise, so a larger eps directly dilutes that noise with no accuracy cost. + // Measured max error at eps=0.01f over 10,000 samples: 4.37e-5 (up from eps=0.001f's 5.3e-4, + // confirming the noise is eps-limited, not curvature-limited); this tolerance keeps about 5.7x + // headroom over that. A uniform-scale mutant on the returned gradient (a 1.01x M9/M16-style + // mutant applied here) still dies down to a 1.0005x scale (0.05%); it survives at 1.0002x. + private const float SminGradientTolerance = 2.5e-4f; + + // cellular's F1/F2 are Euclidean distance fields: real curvature away from a feature point means + // central differences DO carry O(eps^2) truncation error, so (unlike smin_grad) a larger eps + // makes things worse, not better; a sweep at eps in {0.0002f, 0.0003f, 0.0005f, 0.0007f, 0.001f} + // over 8,000 samples found the committed eps=0.0005f already close to the sweet spot. Measured + // max error at that eps: nearest 2.04e-4, edge 2.57e-4; this tolerance keeps just over 5x + // headroom over the larger of the two. M9 (grad1 * 1.01) and M16 (grad2 * 1.01) both still die + // down to a 1.002x scale (0.2%); both survive at 1.001x. + private const float CellularGradientTolerance = 1.3e-3f; + + // ---- smin_grad ---- + + [Fact] + public void SminValueNeverExceedsTheOrdinaryMinimum() + { + var random = new System.Random(0xACE1); + for (var i = 0; i < 256; i++) + { + var a = new float4(RandomUnit(random), RandomScalar(random)); + var b = new float4(RandomUnit(random), RandomScalar(random)); + var k = 0.05f + random.NextSingle() * 5.0f; + + var result = math.smin_grad(a, b, k); + + Assert.True(result.w <= math.min(a.w, b.w) + 1.0e-4f, $"a.w={a.w} b.w={b.w} k={k} smin={result.w}"); + } + } + + [Fact] + public void SminMatchesTheHardMinimumAndItsGradientOutsideTheBand() + { + var random = new System.Random(0xACE2); + for (var i = 0; i < 64; i++) + { + var gradA = RandomUnit(random); + var gradB = RandomUnit(random); + var k = 0.1f + random.NextSingle() * 2.0f; + + // Push b comfortably above a, past the smoothing band, so a is the ordinary minimum. + var aw = random.NextSingle() * 10.0f - 5.0f; + var bw = aw + k * (1.5f + random.NextSingle()); + var a = new float4(gradA, aw); + var b = new float4(gradB, bw); + + var lower = math.smin_grad(a, b, k); + Assert.Equal(aw, lower.w, precision: 4); + Assert.Equal(gradA.x, lower.x, precision: 4); + Assert.Equal(gradA.y, lower.y, precision: 4); + Assert.Equal(gradA.z, lower.z, precision: 4); + + // Argument order must not matter: b below a is symmetric. + var higher = math.smin_grad(b, a, k); + Assert.Equal(aw, higher.w, precision: 4); + Assert.Equal(gradA.x, higher.x, precision: 4); + Assert.Equal(gradA.y, higher.y, precision: 4); + Assert.Equal(gradA.z, higher.z, precision: 4); + } + } + + [Fact] + public void SminGradientMatchesCentralDifferencesOfItsOwnValue() + { + var random = new System.Random(0xACE3); + var tested = 0; + while (tested < 200) + { + var cf = RandomUnit(random); + var cg = RandomUnit(random); + var offF = random.NextSingle() * 4.0f - 2.0f; + var offG = random.NextSingle() * 4.0f - 2.0f; + var k = 0.2f + random.NextSingle() * 2.0f; + var p = new float3(random.NextSingle() * 4.0f - 2.0f, random.NextSingle() * 4.0f - 2.0f, random.NextSingle() * 4.0f - 2.0f); + + float F(float3 q) => math.dot(q, cf) + offF; + float G(float3 q) => math.dot(q, cg) + offG; + float Smin(float3 q) => math.smin_grad(new float4(cf, F(q)), new float4(cg, G(q)), k).w; + + // Stay clear of the |a.w - b.w| = k seam: central differences straddling a kink would + // disagree with either side's analytic gradient (the same reason cellular excludes a + // band around its own F1 = F2 set). The band has an absolute floor, not just a + // fraction of k: eps grew to 0.01f below (SminGradientTolerance's comment), and a + // fraction-of-k-only band could be narrower than the diff can shift by eps*|cf-cg| + // (up to about 0.035 here) when k is small, letting p +/- eps step across the seam even + // though p itself was clear of it. + var diff = F(p) - G(p); + if (Math.Abs(Math.Abs(diff) - k) < Math.Max(0.05f * k, 0.05f)) + continue; + + tested++; + var analytic = math.smin_grad(new float4(cf, F(p)), new float4(cg, G(p)), k); + + // eps=0.01f, not 0.001f: smin is exactly quadratic within a band (no truncation error + // from curvature; see SminGradientTolerance's comment), so the larger eps only dilutes + // float32 rounding noise, at no accuracy cost, while still comfortably inside the band + // exclusion above. + const float eps = 0.01f; + var numeric = new float3( + (Smin(p + new float3(eps, 0.0f, 0.0f)) - Smin(p - new float3(eps, 0.0f, 0.0f))) / (2.0f * eps), + (Smin(p + new float3(0.0f, eps, 0.0f)) - Smin(p - new float3(0.0f, eps, 0.0f))) / (2.0f * eps), + (Smin(p + new float3(0.0f, 0.0f, eps)) - Smin(p - new float3(0.0f, 0.0f, eps))) / (2.0f * eps)); + + AssertWithinTolerance(numeric.x, analytic.x, SminGradientTolerance); + AssertWithinTolerance(numeric.y, analytic.y, SminGradientTolerance); + AssertWithinTolerance(numeric.z, analytic.z, SminGradientTolerance); + } + } + + [Fact] + public void SminGradientIsNotAConstantBlendOrTheSwappedFactor() + { + // Falsifies two named mutants directly: blending the gradient with a constant 0.5 instead of + // h, or with (1 - h) instead of h. Here a is comfortably the minimum (h saturates to 1 in the + // correct formula), so the correct gradient is exactly a's, unmixed. A constant-0.5 blend or a + // swapped (1 - h) blend both pull in b's gradient, which differs from a's here. + var a = new float4(1.0f, 0.0f, 0.0f, -3.0f); + var b = new float4(0.0f, 1.0f, 0.0f, 5.0f); + + var result = math.smin_grad(a, b, 0.25f); + + Assert.Equal(1.0f, result.x, precision: 5); + Assert.Equal(0.0f, result.y, precision: 5); + Assert.Equal(0.0f, result.z, precision: 5); + Assert.Equal(-3.0f, result.w, precision: 5); + } + + // ---- cellular ---- + + [Fact] + public void F1NeverExceedsF2() + { + var random = new System.Random(0xCE11); + for (var i = 0; i < 256; i++) + { + var p = new float3(random.NextSingle() * 20.0f - 10.0f, random.NextSingle() * 20.0f - 10.0f, random.NextSingle() * 20.0f - 10.0f); + var result = math.cellular(p); + Assert.True(result.edge.w >= -1.0e-4f, $"F2 - F1 = {result.edge.w} at {p.x},{p.y},{p.z}"); + + // Both returned .w values, checked against the independent 7x7x7 brute-force oracle (F1, + // F6), not a value the test derived some other way. + var (f1, f2) = FindF1F2(p); + Assert.Equal(f1, result.nearest.w, precision: 3); + Assert.Equal(f2 - f1, result.edge.w, precision: 3); + } + } + + [Fact] + public void NearestFeatureWinsEvenWhenItIsInTheLastVisitedNeighbourCell() + { + // math.cellular's own search order visits neighbour offsets with dz outermost and dx + // innermost over a 5x5x5 block (F6), and it also prunes cells whose position-only lower + // bound already exceeds the running F2. Offsets with any |component| = 2 are not provably + // unreachable as F1: their minimum possible distance is 1 (e.g. (2, 0, 0), whose lower bound + // per the exactness proof in math.cs is max(0, 2-1) = 1), well inside the query's own cell's + // sqrt(3) ceiling, so a |component| = 2 offset winning F1 is rare rather than impossible + // (Soul, cut 2a-i: measured 3 F1 wins in 2,000,000 samples). It is still rare enough that the + // 3x3x3 corners remain the practically-reachable "last" cases for this test. (dx, dy, dz) + // = (1, 1, 1) is the last of those the fixed iteration order visits, and if pruning or search + // order were broken, this is the offset most likely to be skipped. Rather than hand-picking a + // hash value, search random points for one whose true nearest feature (by independent brute + // force over the same 5x5x5 block) happens to live in exactly that cell, at a comfortable + // margin from the F1 = F2 seam, then check math.cellular agrees. + var random = new System.Random(0xCE14); + var lastOffset = new float3(1.0f, 1.0f, 1.0f); + for (var attempt = 0; attempt < 5000; attempt++) + { + var p = new float3(random.NextSingle() * 8.0f - 4.0f, random.NextSingle() * 8.0f - 4.0f, random.NextSingle() * 8.0f - 4.0f); + var (offset, f1, f2) = FindNearestOffset(p); + if (!offset.Equals(lastOffset) || f1 < 0.05f || f2 - f1 < 0.05f) + continue; + + var cell = new float3(MathF.Floor(p.x), MathF.Floor(p.y), MathF.Floor(p.z)); + var feature = FeaturePoint(cell + lastOffset); + var expectedGradient = (p - feature) / f1; + + var result = math.cellular(p); + Assert.Equal(f1, result.nearest.w, precision: 4); + Assert.Equal(expectedGradient.x, result.nearest.x, precision: 4); + Assert.Equal(expectedGradient.y, result.nearest.y, precision: 4); + Assert.Equal(expectedGradient.z, result.nearest.z, precision: 4); + return; + } + + Assert.Fail("did not find a random point whose nearest feature lives in the last-visited neighbour cell"); + } + + [Fact] + public void NearestGradientIsFiniteZeroAtAFeaturePointInsteadOfNaN() + { + var feature = FeaturePoint(new float3(4.0f, -2.0f, 9.0f)); + var result = math.cellular(feature); + + Assert.Equal(0.0f, result.nearest.w, precision: 4); + Assert.True(float.IsFinite(result.nearest.x) && float.IsFinite(result.nearest.y) && float.IsFinite(result.nearest.z)); + Assert.Equal(0.0f, result.nearest.x, precision: 5); + Assert.Equal(0.0f, result.nearest.y, precision: 5); + Assert.Equal(0.0f, result.nearest.z, precision: 5); + } + + [Fact] + public void GradientMatchesCentralDifferencesAwayFromTheF1EqualsF2Seam() + { + var random = new System.Random(0xCE12); + var tested = 0; + var attempts = 0; + while (tested < 120 && attempts < 20000) + { + attempts++; + var p = new float3(random.NextSingle() * 6.0f - 3.0f, random.NextSingle() * 6.0f - 3.0f, random.NextSingle() * 6.0f - 3.0f); + var (f1, f2, f3) = FindF1F2F3(p); + + // Exclude a band around the F1 = F2 set: the identity of the nearest and second-nearest + // feature swap there, a genuine kink in F1 and F2 alike, not something central differences + // can approximate. Also exclude a band around F2 = F3: edge (F2 - F1) kinks there too, + // since the second-nearest feature's identity swaps (Soul, cut 2a-i: an unfiltered sample + // hit a 0.78 edge error this way). Also skip the exact feature point itself (F1 = 0), + // covered separately. + if (f2 - f1 < 0.05f || f1 < 0.01f || f3 - f2 < 0.05f) + continue; + + tested++; + var result = math.cellular(p); + + // eps=0.0005f: unlike smin_grad, cellular's F1/F2 are Euclidean distance fields with real + // curvature, so central differences carry O(eps^2) truncation error and a larger eps is + // worse, not better (see CellularGradientTolerance's comment for the measured sweep). + const float eps = 0.0005f; + + // Differentiate cellular's own returned .w values (F1): calling cellular again at p +/- + // eps and reading result.nearest.w / result.edge.w, not a duplicate FindF1F2 search. A + // mutant that corrupts only the returned gradient, leaving the returned value alone, + // would survive a check built on an independent value oracle; it cannot survive this one. + float NearestValueAt(float3 q) => math.cellular(q).nearest.w; + float EdgeValueAt(float3 q) => math.cellular(q).edge.w; + + AssertGradientMatchesCentralDifference(NearestValueAt, p, eps, result.nearest, CellularGradientTolerance); + AssertGradientMatchesCentralDifference(EdgeValueAt, p, eps, result.edge, CellularGradientTolerance); + } + + Assert.True(tested >= 100, $"only {tested} of {attempts} random points landed away from the F1=F2 band"); + } + + [Fact] + public void IdIsConstantAcrossAFeaturesWholeRegionAndVariesBetweenCells() + { + var random = new System.Random(0xCE13); + var baseCell = new float3(2.0f, 2.0f, 2.0f); + var feature = FeaturePoint(baseCell); + var idAtFeature = math.cellular(feature).id; + + for (var i = 0; i < 32; i++) + { + // Small offsets that stay inside the same Voronoi region (well short of any neighbour). + var jitter = new float3(random.NextSingle() * 0.2f - 0.1f, random.NextSingle() * 0.2f - 0.1f, random.NextSingle() * 0.2f - 0.1f); + var nearby = feature + jitter; + if (!FindNearestCell(nearby).Equals(baseCell)) + continue; + + Assert.Equal(idAtFeature, math.cellular(nearby).id, precision: 6); + } + + var otherCellId = math.cellular(FeaturePoint(baseCell + new float3(5.0f, 0.0f, 0.0f))).id; + Assert.NotEqual(idAtFeature, otherCellId); + } + + [Fact] + public void IdIsNotCorrelatedWithAnyJitterComponent() + { + // F4: id must come from hash bits the jitter never uses. A mutant that takes id from + // hash.x (or hash.y) makes id literally equal to that jitter component, which this catches + // as a correlation near 1.0, far past the 0.05 threshold. n = 20000 keeps sampling noise + // (measured under 0.01 at this n) well clear of that threshold. + const int n = 20000; + var random = new System.Random(0xCE15); + var ids = new double[n]; + var jitterX = new double[n]; + var jitterY = new double[n]; + var jitterZ = new double[n]; + + for (var i = 0; i < n; i++) + { + var cell = new float3(random.Next(-2000, 2000), random.Next(-2000, 2000), random.Next(-2000, 2000)); + var hash = math.pcg3d(math.int3(cell)); + var jitter = new float3(Unit(hash.x), Unit(hash.y), Unit(hash.z)); + + ids[i] = math.cellular(cell + jitter).id; + jitterX[i] = jitter.x; + jitterY[i] = jitter.y; + jitterZ[i] = jitter.z; + } + + Assert.True(Math.Abs(Correlation(ids, jitterX)) < 0.05, "id correlates with jitter.x"); + Assert.True(Math.Abs(Correlation(ids, jitterY)) < 0.05, "id correlates with jitter.y"); + Assert.True(Math.Abs(Correlation(ids, jitterZ)) < 0.05, "id correlates with jitter.z"); + } + + [Fact] + public void JitterAndIdPassAChiSquareUniformityTest() + { + // F4/jitter uniformity: cellular hashes the winning cell's INTEGER coordinate (design.md, + // "Integer hashing"), never that coordinate's float32 bit pattern. Hashing the bit pattern of + // an integer-valued float shares more structure between adjacent cells (same exponent, a + // mantissa one increment apart) than the integers themselves do going into pcg3d's own + // mixing, and that structure survived into the jitter: Soul measured jitter.x's marginal + // chi-square statistic at 203.8 over 1,000,000 cells this way (15 degrees of freedom; + // critical value 37.7 at alpha = 0.001), soundly rejecting uniformity. 16 equal-width bins + // over [0, 1) give those same 15 degrees of freedom for jitter.x/y/z and id alike. + const int n = 200_000; + const int bins = 16; + const double criticalValue = 37.7; // chi-square, 15 df, alpha = 0.001 + + var jitterXCounts = new int[bins]; + var jitterYCounts = new int[bins]; + var jitterZCounts = new int[bins]; + var idCounts = new int[bins]; + var random = new System.Random(0xCE19); + + for (var i = 0; i < n; i++) + { + var cell = new float3(random.Next(-100000, 100000), random.Next(-100000, 100000), random.Next(-100000, 100000)); + var hash = math.pcg3d(math.int3(cell)); + jitterXCounts[Bin(Unit(hash.x), bins)]++; + jitterYCounts[Bin(Unit(hash.y), bins)]++; + jitterZCounts[Bin(Unit(hash.z), bins)]++; + + var idHash = math.pcg4d(new int4(math.int3(cell), 0)); + idCounts[Bin(Unit(idHash.w), bins)]++; + } + + var expected = (double)n / bins; + AssertUniform(jitterXCounts, expected, criticalValue, "jitter.x"); + AssertUniform(jitterYCounts, expected, criticalValue, "jitter.y"); + AssertUniform(jitterZCounts, expected, criticalValue, "jitter.z"); + AssertUniform(idCounts, expected, criticalValue, "id"); + } + + private static int Bin(float value, int binCount) => Math.Clamp((int)(value * binCount), 0, binCount - 1); + + private static void AssertUniform(int[] counts, double expected, double criticalValue, string name) + { + var chiSquare = 0.0; + foreach (var count in counts) + { + var delta = count - expected; + chiSquare += delta * delta / expected; + } + + Assert.True(chiSquare < criticalValue, $"{name} chi-square {chiSquare:G6} exceeds critical value {criticalValue} ({counts.Length - 1} df)"); + } + + [Fact] + public void NoNaNAtIntegerPointsNear2To24() + { + // F3: past |p| of about 2^23, distinct cells' jittered features can round to the same + // float32 value, making F2 = 0 reachable. Soul measured 4096 of 4096 integer points at 2^24 + // producing NaN before the guard; this pins the fix over the same sample. + const float scale = 16777216.0f; // 2^24 + for (var ix = 0; ix < 16; ix++) + for (var iy = 0; iy < 16; iy++) + for (var iz = 0; iz < 16; iz++) + { + var p = new float3(scale + ix, scale + iy, scale + iz); + var result = math.cellular(p); + + Assert.True( + float.IsFinite(result.nearest.x) && float.IsFinite(result.nearest.y) && + float.IsFinite(result.nearest.z) && float.IsFinite(result.nearest.w), + $"nearest not finite at {p.x},{p.y},{p.z}: {result.nearest.x},{result.nearest.y},{result.nearest.z},{result.nearest.w}"); + Assert.True( + float.IsFinite(result.edge.x) && float.IsFinite(result.edge.y) && + float.IsFinite(result.edge.z) && float.IsFinite(result.edge.w), + $"edge not finite at {p.x},{p.y},{p.z}: {result.edge.x},{result.edge.y},{result.edge.z},{result.edge.w}"); + Assert.True(float.IsFinite(result.id), $"id not finite at {p.x},{p.y},{p.z}"); + } + } + + [Fact] + public void CellularUnitMapsAllOnesBitsBelowOne() + { + // F7: cellular_unit(0xFFFFFFFF) must land in [0, 1), not round up to exactly 1.0f. + var mapped = math.cellular_unit(-1); // -1's bit pattern is 0xFFFFFFFF. + Assert.True(mapped >= 0.0f && mapped < 1.0f, $"cellular_unit(0xFFFFFFFF) = {mapped}"); + } + + [Fact] + public void ProductionSearchMatchesTheBruteForceOracleExactly() + { + // F6, part 2: the production 5x5x5 search must equal the independent 7x7x7 oracle exactly + // (to the oracle's own float32 precision), over a large seeded sweep in the domain Soul + // measured ([-50, 50]^3, where 3x3x3 missed 9 of 400,000 points). + var random = new System.Random(0xCE16); + for (var i = 0; i < 20000; i++) + { + var p = new float3(random.NextSingle() * 100.0f - 50.0f, random.NextSingle() * 100.0f - 50.0f, random.NextSingle() * 100.0f - 50.0f); + var result = math.cellular(p); + var (f1, f2) = FindF1F2(p); + + Assert.Equal(f1, result.nearest.w, precision: 4); + Assert.Equal(f2 - f1, result.edge.w, precision: 4); + } + } + + [Fact] + public void SearchReachesEveryAxisAlignedRadiusTwoSlice() + { + // F6, part 2 (Soul finding): a single-slice loop-bound mutant on one axis (e.g. dz < 2 + // instead of dz <= 2, silently dropping the +2 layer on that axis alone) still passed the + // random 20,000-point sweeps above. That is not those sweeps being weak; it is the + // exactness proof's own margin (F1, F2 always < sqrt(3), a radius-2 cell's lower bound is + // max(0, 2-1) = 1, not "exactly 2" as an earlier version of this comment claimed) making a + // genuine win from any single |offset component| = 2 cell rare over uniformly random points + // (Soul, cut 2a-i: measured about 1 hit in 28,000 samples, not the "zero in 3,000,000" an + // earlier version of this comment claimed). + // Hunting for one by choosing candidate query POINTS is the wrong end of the search; this + // instead scans candidate integer CELLS and, for each, builds the query point most likely to + // realize that cell's neighbour as the winner: the closest point of the query cell's own unit + // cube to the target neighbour's actual jittered feature. That construction finds a real + // example for every one of the six axis-aligned radius-2 offsets within a couple thousand + // candidate cells, deterministically (pcg3d has no randomness to get lucky or unlucky with). + foreach (var offset in AxisAlignedRadiusTwoOffsets) + { + var p = FindPointRealizingOffset(offset); + var (f1, f2) = FindF1F2(p); // independent 7x7x7 oracle + var result = math.cellular(p); + Assert.Equal(f1, result.nearest.w, precision: 3); + Assert.Equal(f2 - f1, result.edge.w, precision: 3); + } + } + + // The six axis-aligned radius-2 offsets (F6, part 2): shared by + // SearchReachesEveryAxisAlignedRadiusTwoSlice and, via FindPointRealizingOffset, by + // HlslSourceCompatibilityTests' mirror-comparison inputs, so both pin the same construction. + internal static readonly float3[] AxisAlignedRadiusTwoOffsets = + { + new(2.0f, 0.0f, 0.0f), new(-2.0f, 0.0f, 0.0f), + new(0.0f, 2.0f, 0.0f), new(0.0f, -2.0f, 0.0f), + new(0.0f, 0.0f, 2.0f), new(0.0f, 0.0f, -2.0f), + }; + + // Hunting for a query point where a radius-2 offset wins F1 or F2 by choosing candidate query + // POINTS is the wrong end of the search (Soul, cut 2a-i: about 1 hit in 28,000 uniformly random + // points); this instead scans candidate integer CELLS and, for each, builds the query point most + // likely to realize that cell's neighbour as the winner: the closest point of the query cell's + // own unit cube to the target neighbour's actual jittered feature. That construction finds a + // real example for every one of the six axis-aligned radius-2 offsets within a couple thousand + // candidate cells, deterministically (pcg3d has no randomness to get lucky or unlucky with). + internal static float3 FindPointRealizingOffset(float3 offset) + { + for (var qz = -80; qz <= 80; qz++) + for (var qy = -80; qy <= 80; qy++) + for (var qx = -80; qx <= 80; qx++) + { + var q = new float3(qx, qy, qz); + var targetFeature = FeaturePoint(q + offset); + var p = new float3( + Math.Clamp(targetFeature.x, q.x, q.x + 0.999f), + Math.Clamp(targetFeature.y, q.y, q.y + 0.999f), + Math.Clamp(targetFeature.z, q.z, q.z + 0.999f)); + + var (f1, f2) = FindF1F2(p); // independent 7x7x7 oracle + var d = math.distance(p, targetFeature); + if (MathF.Abs(d - f1) > 1.0e-4f && MathF.Abs(d - f2) > 1.0e-4f) + continue; // this cell didn't realize the target offset as F1 or F2; try another. + + return p; + } + + throw new InvalidOperationException($"could not construct a query point where offset {offset.x},{offset.y},{offset.z} ever wins F1 or F2"); + } + + [Fact] + public void PrunedSearchIsBitIdenticalToTheUnprunedFiveCubedSearchBelowTwoToTheTwentyFifth() + { + // F6, part 2: the lower-bound prune inside math.cellular's loop must never change the + // result. Compares against an independent, unpruned 5x5x5 reference that visits every cell + // in the same fixed order, over a large seeded sweep in [-50, 50]^3. + // + // This bit-identity has a domain: it holds for |p| < 2^25 (design.md, "Precision domain"). + // Above that, cell + offset starts to round in float32, so the pruned loop's recomputed + // neighbour and the unpruned loop's neighbour at the same nominal (dx, dy, dz) can land on + // different actual cells, and the two searches diverge (Soul, cut 2a-i: 180 of 1,100,000 + // points differ at |p| ~= 3.4e7). [-50, 50]^3 is comfortably inside the proven domain. + var random = new System.Random(0xCE18); + for (var i = 0; i < 20000; i++) + { + var p = new float3(random.NextSingle() * 100.0f - 50.0f, random.NextSingle() * 100.0f - 50.0f, random.NextSingle() * 100.0f - 50.0f); + var pruned = math.cellular(p); + var unpruned = UnprunedCellular5x5x5(p); + + Assert.Equal(unpruned.nearest.x, pruned.nearest.x); + Assert.Equal(unpruned.nearest.y, pruned.nearest.y); + Assert.Equal(unpruned.nearest.z, pruned.nearest.z); + Assert.Equal(unpruned.nearest.w, pruned.nearest.w); + Assert.Equal(unpruned.edge.x, pruned.edge.x); + Assert.Equal(unpruned.edge.y, pruned.edge.y); + Assert.Equal(unpruned.edge.z, pruned.edge.z); + Assert.Equal(unpruned.edge.w, pruned.edge.w); + Assert.Equal(unpruned.id, pruned.id); + } + } + + // Independent of math.cellular's own pruning: visits every cell of the 5x5x5 block, in the same + // fixed order, unconditionally. + private static CultCellular UnprunedCellular5x5x5(float3 p) + { + var cell = new float3(MathF.Floor(p.x), MathF.Floor(p.y), MathF.Floor(p.z)); + var f1 = 1.0e30f; + var f2 = 1.0e30f; + var c1 = float3.zero; + var c2 = float3.zero; + var cellId = float3.zero; + + for (var dz = -2; dz <= 2; dz++) + for (var dy = -2; dy <= 2; dy++) + for (var dx = -2; dx <= 2; dx++) + { + var neighbor = cell + new float3(dx, dy, dz); + var feature = FeaturePoint(neighbor); + var d = math.distance(p, feature); + if (d < f1) { f2 = f1; c2 = c1; f1 = d; c1 = feature; cellId = neighbor; } + else if (d < f2) { f2 = d; c2 = feature; } + } + + var grad1 = f1 > 0.0f ? (p - c1) / f1 : float3.zero; + var grad2 = f2 > 0.0f ? (p - c2) / f2 : float3.zero; + var idHash = math.pcg4d(new int4(math.int3(cellId), 0)); + return new CultCellular(new float4(grad1, f1), new float4(grad2 - grad1, f2 - f1), Unit(idHash.w)); + } + + private static double Correlation(double[] a, double[] b) + { + var n = a.Length; + var meanA = 0.0; + var meanB = 0.0; + for (var i = 0; i < n; i++) { meanA += a[i]; meanB += b[i]; } + meanA /= n; + meanB /= n; + + var cov = 0.0; + var varA = 0.0; + var varB = 0.0; + for (var i = 0; i < n; i++) + { + var da = a[i] - meanA; + var db = b[i] - meanB; + cov += da * db; + varA += da * da; + varB += db * db; + } + + return cov / Math.Sqrt(varA * varB); + } + + // ---- shared fixtures: an independent brute-force Worley search over the same public pcg3d + // hash cellular itself is documented to use (design.md, "Integer hashing"), so these tests do + // not anchor to cellular's own control flow or iteration order. FindF1F2 searches 7x7x7 (radius + // 3), strictly wider than production's own proven-sufficient 5x5x5 (F6), so it is a true + // independent oracle rather than a second copy of the algorithm under test. ---- + + internal static float3 FeaturePoint(float3 cell) + { + var hash = math.pcg3d(math.int3(cell)); + var jitter = new float3(Unit(hash.x), Unit(hash.y), Unit(hash.z)); + return cell + jitter; + } + + // Mirrors math.cellular_unit's top-24-bit [0, 1) mapping (F7) exactly, so this fixture never + // drifts from production's own jitter/id mapping. + private static float Unit(int bits) => ((uint)bits >> 8) * (1.0f / 16777216.0f); + + private static (float f1, float f2) FindF1F2(float3 p) + { + var (f1, f2, _) = FindF1F2F3(p); + return (f1, f2); + } + + // Same independent 7x7x7 oracle as FindF1F2, plus the third-nearest distance. Central-difference + // tests need this: excluding only the F1=F2 gap is not enough, because a small F2=F3 gap is also + // a kink (the identity of the second-nearest feature swaps there), and hitting one produces a + // large, curvature-driven finite-difference error unrelated to eps or float noise (Soul, cut + // 2a-i: an unfiltered large sample hit an edge error of 0.78 this way, versus ~2e-4 once F2=F3 + // is also excluded). + private static (float f1, float f2, float f3) FindF1F2F3(float3 p) + { + var cell = new float3(MathF.Floor(p.x), MathF.Floor(p.y), MathF.Floor(p.z)); + var f1 = float.PositiveInfinity; + var f2 = float.PositiveInfinity; + var f3 = float.PositiveInfinity; + for (var dz = -3; dz <= 3; dz++) + for (var dy = -3; dy <= 3; dy++) + for (var dx = -3; dx <= 3; dx++) + { + var d = math.distance(p, FeaturePoint(cell + new float3(dx, dy, dz))); + if (d < f1) { f3 = f2; f2 = f1; f1 = d; } + else if (d < f2) { f3 = f2; f2 = d; } + else if (d < f3) { f3 = d; } + } + + return (f1, f2, f3); + } + + private static (float3 offset, float f1, float f2) FindNearestOffset(float3 p) + { + var cell = new float3(MathF.Floor(p.x), MathF.Floor(p.y), MathF.Floor(p.z)); + var f1 = float.PositiveInfinity; + var f2 = float.PositiveInfinity; + var bestOffset = float3.zero; + for (var dz = -2; dz <= 2; dz++) + for (var dy = -2; dy <= 2; dy++) + for (var dx = -2; dx <= 2; dx++) + { + var offset = new float3(dx, dy, dz); + var d = math.distance(p, FeaturePoint(cell + offset)); + if (d < f1) { f2 = f1; f1 = d; bestOffset = offset; } + else if (d < f2) { f2 = d; } + } + + return (bestOffset, f1, f2); + } + + private static float3 FindNearestCell(float3 p) + { + var cell = new float3(MathF.Floor(p.x), MathF.Floor(p.y), MathF.Floor(p.z)); + var best = float.PositiveInfinity; + var bestCell = cell; + for (var dz = -1; dz <= 1; dz++) + for (var dy = -1; dy <= 1; dy++) + for (var dx = -1; dx <= 1; dx++) + { + var neighbour = cell + new float3(dx, dy, dz); + var d = math.distance(p, FeaturePoint(neighbour)); + if (d < best) { best = d; bestCell = neighbour; } + } + + return bestCell; + } + + private static void AssertGradientMatchesCentralDifference(Func scalarField, float3 p, float eps, float4 valueAndGradient, float tolerance) + { + var numeric = new float3( + (scalarField(p + new float3(eps, 0.0f, 0.0f)) - scalarField(p - new float3(eps, 0.0f, 0.0f))) / (2.0f * eps), + (scalarField(p + new float3(0.0f, eps, 0.0f)) - scalarField(p - new float3(0.0f, eps, 0.0f))) / (2.0f * eps), + (scalarField(p + new float3(0.0f, 0.0f, eps)) - scalarField(p - new float3(0.0f, 0.0f, eps))) / (2.0f * eps)); + + AssertWithinTolerance(numeric.x, valueAndGradient.x, tolerance); + AssertWithinTolerance(numeric.y, valueAndGradient.y, tolerance); + AssertWithinTolerance(numeric.z, valueAndGradient.z, tolerance); + } + + // A fixed decimal-place Assert.Equal snaps two numbers that agree to within a few times 1e-5 to + // different rounded digits whenever their true difference straddles a rounding boundary (seen: + // 0.824987829 vs 0.825006127, agreeing to 2e-5, rounding to 0.82 and 0.83). An absolute-tolerance + // check states the actual claim (central differences agree with the analytic gradient within the + // finite-difference step's own truncation error) without that artifact. + private static void AssertWithinTolerance(float expected, float actual, float tolerance) => + Assert.True(MathF.Abs(expected - actual) <= tolerance, $"expected {expected}, actual {actual}, tolerance {tolerance}"); + + private static float3 RandomUnit(System.Random random) => + new(random.NextSingle() * 2.0f - 1.0f, random.NextSingle() * 2.0f - 1.0f, random.NextSingle() * 2.0f - 1.0f); + + private static float RandomScalar(System.Random random) => random.NextSingle() * 20.0f - 10.0f; +} diff --git a/packages/cultmath/tests/CultMath.Tests/CyclesOracleTests.cs b/packages/cultmath/tests/CultMath.Tests/CyclesOracleTests.cs new file mode 100644 index 00000000..e4afbc74 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/CyclesOracleTests.cs @@ -0,0 +1,460 @@ +using System.Reflection; +using System.Text.Json.Nodes; +using Xunit; + +namespace CultMath.Tests; + +/// +/// math.cycles_* and the shader mirror's cultmath_cycles_* (shaders/CultMath.Cycles.hlsl, compiled as C#) against +/// the results of Blender 5.2.2's own Cycles on the CPU, the reference of ruling +/// cultmath-tapes:ruling:cycles-kernel-reference-ruled: Cycles' formulas with one IEEE single rounding per +/// operation. The fixtures under fixtures/cycles-oracle are written by +/// tools/cycles-oracle/oracle.py (never by hand): each case is the operands and the node's baked results as +/// float32 bit patterns. Every function is compared at every case within the tolerance named in +/// ; a function not named there is held to 0 ulp. Signed zeros are not distinguished (-0 +/// equals 0), and NaN equals NaN. The fixtures come from Cycles' SSE4.2 CPU kernel, which does not fuse +/// multiply-adds as C# does not (oracle.py checks this before it bakes); other builds are other tolerance classes +/// (tools/cycles-oracle/README.md). Cycles' film writes 0 for an infinite or +/// NaN result, so a case whose result here is not finite and whose fixture result is 0 holds nothing to compare. +/// +public sealed class CyclesOracleTests +{ + // The ulp distance a function is allowed from the reference. Empty: the fixtures are the SSE4.2 kernel's results + // and every function equals them, power and logarithm included (glibc's powf and logf, 0 ulp from MathF on Linux). + // An entry needs a measured case on the reference named in it (a failing case's bits and ulp); other builds' + // tolerances belong to the class table in tools/cycles-oracle/README.md, not here. + private static readonly Dictionary Tolerances = new(); + + private const string CSharp = "C#"; + private const string Mirror = "HLSL mirror"; + + private static readonly Lazy<(object Shader, Type Type)> ShaderMirror = new(() => + { + var (assembly, errors) = HlslSourceCompatibilityTests.CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var type = assembly!.GetType("CultMathHlsl.HlslShader")!; + return (Activator.CreateInstance(type)!, type); + }); + + /// One implementation of the Cycles functions: CultMath's C# or the HLSL text compiled as C#. + private static object Call(string target, string function, params object[] arguments) + { + if (target == CSharp) + return Method(function).Invoke(null, arguments)!; + var (shader, type) = ShaderMirror.Value; + var method = type.GetMethod("cultmath_" + function, BindingFlags.Instance | BindingFlags.NonPublic) + ?? throw new InvalidOperationException("no mirror function cultmath_" + function); + return method.Invoke(shader, arguments)!; + } + + public static IEnumerable Families() => + from family in new[] { "math", "map-range", "clamp", "mix", "rgb-to-bw" } + from target in new[] { CSharp, Mirror } + select new object[] { family, target }; + + public static IEnumerable Targets() => new[] { CSharp, Mirror }.Select(target => new object[] { target }); + + private static string FixturePath(string family) => + Path.Combine(HlslSourceCompatibilityTests.FindCultMathRoot(), "tests", "CultMath.Tests", "fixtures", "cycles-oracle", family + ".json"); + + private static JsonObject Load(string family) => JsonNode.Parse(File.ReadAllText(FixturePath(family)))!.AsObject(); + + private static float Float(string token) => BitConverter.Int32BitsToSingle((int)Convert.ToUInt32(token, 16)); + + // A float32 bit pattern as an integer whose order and differences are the floats' order and ulps. + private static int Ordered(float value) + { + var bits = BitConverter.SingleToInt32Bits(value); + return bits < 0 ? int.MinValue - bits : bits; + } + + private static long Distance(float want, float have) => + want == have || (float.IsNaN(want) && float.IsNaN(have)) ? 0 : float.IsNaN(want) || float.IsNaN(have) ? long.MaxValue : Math.Abs((long)Ordered(want) - Ordered(have)); + + // The method takes floats and float3s only; each float3 is three consecutive tokens. + private static object[] Arguments(MethodInfo method, string[] tokens) + { + var values = new List(); + var next = 0; + foreach (var parameter in method.GetParameters()) + { + if (parameter.ParameterType == typeof(float)) + values.Add(Float(tokens[next++])); + else if (parameter.ParameterType == typeof(float3)) + { + values.Add(new float3(Float(tokens[next]), Float(tokens[next + 1]), Float(tokens[next + 2]))); + next += 3; + } + else + throw new InvalidOperationException($"{method.Name}: parameter type {parameter.ParameterType.Name} is not a fixture operand"); + } + + // The operands a function does not take (Map Range's Steps, for the three kinds that ignore it) are left unread. + Assert.True(next <= tokens.Length, $"{method.Name}: {next} operands wanted, {tokens.Length} in the case"); + return values.ToArray(); + } + + private static float[] Flatten(object result) => result switch + { + float f => new[] { f }, + float2 v => new[] { v.x, v.y }, + float3 v => new[] { v.x, v.y, v.z }, + _ => throw new InvalidOperationException(result.GetType().Name), + }; + + private static MethodInfo Method(string name) => + typeof(math).GetMethod(name, BindingFlags.Public | BindingFlags.Static) ?? throw new InvalidOperationException("no CultMath function " + name); + + [Theory] + [MemberData(nameof(Families))] + public void FamilyMatchesBlender(string family, string target) + { + var fixture = Load(family); + Assert.Equal("5.2.2 LTS", (string?)fixture["blender"]); + Assert.Equal("d13f752e3b9c", (string?)fixture["build_hash"]); + var functions = fixture["functions"]!.AsArray(); + Assert.NotEmpty(functions); + var failures = new List(); + foreach (var entry in functions) + { + var name = (string)entry!["function"]!; + var method = Method(name); + var clamped = (string?)entry["then"] is not null; + var allowed = Tolerances.TryGetValue(name, out var tolerance) ? tolerance.Ulp : 0; + var worst = 0L; + string? worstCase = null; + var cases = entry["cases"]!.AsArray(); + Assert.True(cases.Count >= 1000, $"{name}: only {cases.Count} fixture cases"); + foreach (var line in cases) + { + var sides = ((string)line!).Split(" -> "); + var operands = sides[0].Split(' '); + var have = Flatten(Call(target, name, Arguments(method, operands))); + if (clamped) + { + // A Map Range node's Clamp option is a Clamp node of type Range on its result. + have = Flatten(Call(target, "cycles_clamp_range", have[0], Float(operands[3]), Float(operands[4]))); + } + + var want = sides[1].Split(' ').Select(Float).ToArray(); + Assert.Equal(want.Length, have.Length); + for (var k = 0; k < want.Length; k++) + { + if (!float.IsFinite(have[k]) && want[k] == 0.0f) + continue; + var distance = Distance(want[k], have[k]); + if (distance > worst) + { + worst = distance; + worstCase = $"{line} ({target} {BitConverter.SingleToInt32Bits(have[k]):x8})"; + } + } + } + + if (worst > allowed) + failures.Add($"{target} {name}{(clamped ? " with Clamp" : string.Empty)}: {worst} ulp from Blender, allowed {allowed}; worst case {worstCase}"); + } + + Assert.True(failures.Count == 0, string.Join(Environment.NewLine, failures)); + } + + private static JsonNode RampEntry(string interpolation) => + Load("ramp")["functions"]!.AsArray().Single(e => e!["node"]!.ToString() == "ShaderNodeValToRGB " + interpolation)!; + + [Theory] + [MemberData(nameof(Targets))] + public void RampIndexNamesTheEntryBlenderReads(string target) + { + var entry = RampEntry("CONSTANT"); + var size = (int)entry["table_entries"]!; + var stops = entry["stops"]!.AsArray().Select(stop => (Position: Float((string)stop![0]!), Value: Float((string)stop[1]!))).ToArray(); + + // A constant ramp's table: the value of the last stop at or before the entry's position. + var table = Enumerable.Range(0, size).Select(i => + { + var position = (double)i / (size - 1); + var stop = stops.LastOrDefault(s => s.Position <= position); + return stop == default ? stops[0].Value : stop.Value; + }).ToArray(); + + var cases = entry["cases"]!.AsArray().Select(line => ((string)line!).Split(" -> ")).ToArray(); + Assert.True(table.Distinct().Count() > 30, "the constant ramp's table should name 32 entries apart"); + foreach (var line in cases) + { + var lookup = Flatten(Call(target, "cycles_ramp_index", Float(line[0]), size)); + var index = (int)lookup[0]; + Assert.InRange(index, 0, size - 1); + Assert.True(Distance(Float(line[1]), table[index]) == 0, $"ramp t {line[0]}: index {index} reads {table[index]}, Blender {Float(line[1])}"); + } + + // Every stop's value appears in the results at its own boundary, so the cases do cross the entries. + Assert.True(cases.Select(line => line[1]).Distinct().Count() >= 32, "the cases never cross the stops"); + } + + [Theory] + [MemberData(nameof(Targets))] + public void RampWeightBlendsTheEntryWithTheNextOne(string target) + { + // A linear ramp from 0 to 1: entry i holds i / (size - 1) to within the float rounding of Blender's table, and + // a lookup at (index, weight) reads (index + weight) / (size - 1). A weight that is off by a fraction of a + // percent, or an index that is off by one, moves the result by more than the bound. + var entry = RampEntry("LINEAR"); + var size = (int)entry["table_entries"]!; + var worst = 0.0; + var fractional = 0; + foreach (var line in entry["cases"]!.AsArray().Select(line => ((string)line!).Split(" -> "))) + { + var lookup = Flatten(Call(target, "cycles_ramp_index", Float(line[0]), size)); + Assert.InRange(lookup[1], 0.0f, 1.0f); + fractional += lookup[1] > 0.0f ? 1 : 0; + var expected = (lookup[0] + lookup[1]) / (size - 1); + worst = Math.Max(worst, Math.Abs(expected - Float(line[1]))); + } + + Assert.True(fractional > 500, "the cases hold too few interpolated lookups"); + Assert.True(worst <= Math.ScaleB(1.0, -22), $"a lookup is {worst} from (index + weight) / (size - 1), more than 2^-22"); + } + + [Theory] + [MemberData(nameof(Targets))] + public void ResultsTheFilmCannotShowFollowTheCyclesSource(string target) + { + // Cycles' film writes 0 for an infinite or NaN result, so the fixtures cannot tell the guards that return 0 + // from the division that would return an infinity. These are the guards in svm_math (util/math_base.h): + // safe_logf, safe_divide and inversesqrtf return 0 where the plain operation is not finite. + float One(string function, params float[] arguments) => (float)Call(target, function, arguments.Cast().ToArray()); + Assert.Equal(0.0f, One("cycles_logarithm", 0.0f, 2.0f)); + Assert.Equal(0.0f, One("cycles_logarithm", -1.0f, 2.0f)); + Assert.Equal(0.0f, One("cycles_logarithm", 2.0f, 0.0f)); + Assert.Equal(0.0f, One("cycles_logarithm", 2.0f, -1.0f)); + Assert.Equal(0.0f, One("cycles_divide", 1.0f, 0.0f)); + Assert.Equal(0.0f, One("cycles_inverse_sqrt", 0.0f)); + Assert.Equal(0.0f, One("cycles_modulo", 1.0f, 0.0f)); + Assert.Equal(0.0f, One("cycles_floored_modulo", 1.0f, 0.0f)); + } + + private static float OperandOrInfinity(string token) => token == "inf" ? float.PositiveInfinity : token == "-inf" ? float.NegativeInfinity : Float(token); + + [Theory] + [MemberData(nameof(Targets))] + public void InfiniteOperandsFollowBlender(string target) + { + // infinite.json: operands that are infinite, made inside Blender's kernel (the film writes 0 for an infinity), and + // results read back through comparisons with 0 as "inf", "-inf" or "nan" where the film showed 0. + var functions = Load("infinite")["functions"]!.AsArray(); + Assert.Equal(new[] { "cycles_power", "cycles_modulo", "cycles_map_range_smoothstep" }, functions.Select(f => (string)f!["function"]!).ToArray()); + var cases = 0; + foreach (var entry in functions) + { + var name = (string)entry!["function"]!; + foreach (var line in entry["cases"]!.AsArray()) + { + var sides = ((string)line!).Split(" -> "); + var operands = sides[0].Split(' ').Select(OperandOrInfinity).Cast().ToArray(); + var have = (float)Call(target, name, operands); + var ok = sides[1] switch + { + "nan" => float.IsNaN(have), + "inf" => float.IsPositiveInfinity(have), + "-inf" => float.IsNegativeInfinity(have), + var token => Distance(Float(token), have) == 0, + }; + Assert.True(ok, $"{target} {name} {sides[0]}: Blender {sides[1]}, here {have}"); + cases++; + } + } + + Assert.True(cases >= 45, $"{cases} infinite-operand cases"); + } + + [Theory] + [MemberData(nameof(Targets))] + public void InfiniteOperandsFollowTheCyclesSource(string target) + { + // Blender 5.2.2 (infinite.json rows named beside each pin). powf(a, +-inf) is never negative, so an infinite + // exponent is even; modulo and smoothstep of an infinity are NaN where inf - inf or inf / inf forms. + float One(string function, params float[] arguments) => (float)Call(target, function, arguments.Cast().ToArray()); + const float inf = float.PositiveInfinity; + Assert.Equal(0x3f800000, BitConverter.SingleToInt32Bits(One("cycles_power", -1.0f, inf))); + Assert.Equal(0x3f800000, BitConverter.SingleToInt32Bits(One("cycles_power", -1.0f, -inf))); + Assert.Equal(inf, One("cycles_power", -2.0f, inf)); + Assert.Equal(inf, One("cycles_power", -0.5f, -inf)); + Assert.Equal(0, BitConverter.SingleToInt32Bits(One("cycles_power", -2.0f, -inf))); + Assert.Equal(-8.0f, One("cycles_power", -2.0f, 3.0f)); + Assert.Equal(0x3f800000, BitConverter.SingleToInt32Bits(One("cycles_power", -1.0f, 2.0f))); + Assert.True(float.IsNaN(One("cycles_modulo", inf, 1.0f))); + Assert.True(float.IsNaN(One("cycles_modulo", -inf, 3.0f))); + Assert.True(float.IsNaN(One("cycles_modulo", inf, 0.1f))); + Assert.True(float.IsNaN(One("cycles_map_range_smoothstep", -inf, -inf, 1.0f, 2.0f, 3.0f))); + Assert.True(float.IsNaN(One("cycles_map_range_smoothstep", -inf, 1.0f, -inf, 2.0f, 3.0f))); + Assert.Equal(2.0f, One("cycles_map_range_smoothstep", -inf, 1.0f, 5.0f, 2.0f, 3.0f)); + } + + [Theory] + [MemberData(nameof(Targets))] + public void InverseTrigonometryFollowsTheCyclesGuards(string target) + { + // util/math_base.h: safe_asinf and safe_acosf clamp to [-1, 1] before asinf and acosf; compatible_atan2 returns 0 + // at the origin (x == 0 && y == 0) and is atan2f everywhere else, so its guard is only the origin. + float One(string function, params float[] arguments) => (float)Call(target, function, arguments.Cast().ToArray()); + Assert.Equal(MathF.Asin(1.0f), One("cycles_arcsine", 2.0f)); + Assert.Equal(MathF.Asin(-1.0f), One("cycles_arcsine", -1.5f)); + Assert.Equal(MathF.Asin(1.0f), One("cycles_arcsine", 1.0000001f)); + Assert.Equal(0.0f, One("cycles_arccosine", 2.0f)); + Assert.Equal(MathF.Acos(-1.0f), One("cycles_arccosine", -2.0f)); + Assert.Equal(0.0f, One("cycles_arctan2", 0.0f, 0.0f)); + Assert.Equal(0.0f, One("cycles_arctan2", 0.0f, -0.0f)); + Assert.Equal(0.0f, One("cycles_arctan2", -0.0f, -0.0f)); + Assert.Equal(MathF.Atan2(-0.0f, -1.0f), One("cycles_arctan2", -0.0f, -1.0f)); + Assert.Equal(MathF.Atan2(0.0f, -1.0f), One("cycles_arctan2", 0.0f, -1.0f)); + Assert.Equal(MathF.Atan2(1.0f, 0.0f), One("cycles_arctan2", 1.0f, 0.0f)); + Assert.Equal(MathF.Atan2(-1.0f, 0.0f), One("cycles_arctan2", -1.0f, 0.0f)); + // The guard is the origin alone: a guard on either zero would zero these (the plain atan2 values are pi and pi/2). + Assert.NotEqual(0.0f, One("cycles_arctan2", 0.0f, -1.0f)); + Assert.NotEqual(0.0f, One("cycles_arctan2", 1.0f, 0.0f)); + foreach (var value in new[] { One("cycles_arcsine", 2.0f), One("cycles_arccosine", -2.0f), One("cycles_arctan2", 0.0f, -0.0f), One("cycles_arctan2", 1.0f, 0.0f) }) + Assert.True(float.IsFinite(value)); + } + + [Theory] + [MemberData(nameof(Targets))] + public void MapRangeSmoothStepDecidesTheTopEdgeBeforeDividing(string target) + { + // util/math_base.h smoothstep returns 1 for x >= edge1 before it forms t. With an overflowing range + // (high - low = infinity) the division would be infinity / infinity, NaN. + float Smooth(params float[] arguments) => (float)Call(target, "cycles_map_range_smoothstep", arguments.Cast().ToArray()); + Assert.Equal(1.0f, Smooth(3.0e38f, -3.0e38f, 3.0e38f, 0.0f, 1.0f)); + Assert.Equal(0.0f, Smooth(3.0e38f, 3.0e38f, -3.0e38f, 0.0f, 1.0f)); + Assert.Equal(0.0f, Smooth(-3.0e38f, -3.0e38f, 3.0e38f, 0.0f, 1.0f)); + } + + [Fact] + public void FlooredModuloAndWrapUnderContractionStayWithinTheBound() + { + // Ruling cycles-kernel-reference-ruled: a build that contracts a - floor(a / b) b into one fused operation differs + // from the reference by at most 2^-23 (|a| + |b|), and the wrap model by 2^-23 (|value| + |min| + |range|). The fused + // model is MathF.FusedMultiplyAdd, test-only; no cycles_* function uses it. + var bound = Math.ScaleB(1.0, -23); + var worstModulo = 0.0; + var worstWrap = 0.0; + var seenPair = false; + foreach (var entry in Load("math")["functions"]!.AsArray()) + { + var name = (string)entry!["function"]!; + if (name != "cycles_floored_modulo" && name != "cycles_wrap") + continue; + foreach (var line in entry["cases"]!.AsArray()) + { + var o = ((string)line!).Split(" -> ")[0].Split(' ').Select(Float).ToArray(); + if (name == "cycles_floored_modulo") + { + float a = o[0], b = o[1]; + if (b == 0.0f) + continue; + var fused = MathF.FusedMultiplyAdd(-MathF.Floor(a / b), b, a); + var scale = Math.Abs((double)a) + Math.Abs((double)b); + var difference = Math.Abs((double)fused - math.cycles_floored_modulo(a, b)); + Assert.True(difference <= bound * scale, $"floored modulo ({line}): fused {fused} is {difference / scale} of |a| + |b| from the reference"); + worstModulo = Math.Max(worstModulo, difference / scale); + if (a == 10000.0f && b == 0.1f) + { + seenPair = true; + Assert.Equal(-1.4901161e-4f, fused); + Assert.Equal(0.0f, math.cycles_floored_modulo(a, b)); + } + } + else + { + float value = o[0], max = o[1], min = o[2]; + var range = max - min; + if (range == 0.0f) + continue; + var fused = MathF.FusedMultiplyAdd(-range, MathF.Floor((value - min) / range), value); + var scale = Math.Abs((double)value) + Math.Abs((double)min) + Math.Abs((double)range); + var difference = Math.Abs((double)fused - math.cycles_wrap(value, max, min)); + Assert.True(difference <= bound * scale, $"wrap ({line}): fused {fused} is {difference / scale} of |value| + |min| + |range| from the reference"); + worstWrap = Math.Max(worstWrap, difference / scale); + } + } + } + + Assert.True(seenPair, "the fixture holds no (10000, 0.1) floored modulo case"); + // The cases reach the contraction regime: a bound of 2^-25 would fail. + Assert.True(worstModulo > Math.ScaleB(1.0, -25), $"the worst floored modulo contraction is only {worstModulo} of |a| + |b|"); + Assert.True(worstWrap > Math.ScaleB(1.0, -25), $"the worst wrap contraction is only {worstWrap} of |value| + |min| + |range|"); + } + + // The values oracle.py draws the specials of a function from (SPECIAL, plus the arcsine and arccosine edge rows); a row with any other operand holds a random draw. + private static readonly HashSet Alphabet = new[] + { + 0.0, 1.0, -1.0, 0.5, -0.5, 2.0, -2.0, 3.0, -2.75, 0.1, -0.1, 7.5, -7.5, 1.0e-7, -1.0e-7, 100.0, -100.0, 1.0e4, 0.3, 0.7, 1.5, 1.0000001, -1.0000001, + }.Select(v => (float)v).ToHashSet(); + + [Fact] + public void OperandStreamsDifferPerFunction() + { + // oracle.py seeds every function, every blend mode's second colours and every ramp from its own name, so no two + // share a stream of draws. At e48f9488 the seed was the name's first four bytes, and 'cycles_' shared them all. + var functions = Load("math")["functions"]!.AsArray() + .Select(e => (Name: (string)e!["function"]!, Rows: e["cases"]!.AsArray().Select(l => ((string)l!).Split(" -> ")[0]).ToArray())) + .ToArray(); + Assert.True(functions.Length >= 17, "the math fixture lost functions"); + foreach (var f in functions) + { + var draws = f.Rows.Where(row => row.Split(' ').Any(token => !Alphabet.Contains(Float(token)))).ToHashSet(); + Assert.True(draws.Count >= 8, $"{f.Name} holds only {draws.Count} random-draw rows"); + foreach (var g in functions.Where(g => string.CompareOrdinal(f.Name, g.Name) < 0 && g.Rows[0].Split(' ').Length == f.Rows[0].Split(' ').Length)) + { + var shared = g.Rows.Count(row => draws.Contains(row)); + Assert.True(shared == 0, $"{f.Name} and {g.Name} share {shared} random-draw rows"); + } + } + + var modes = Load("mix")["functions"]!.AsArray() + .Where(e => ((string)e!["function"]!).StartsWith("cycles_mix_") && ((string)e["cases"]![0]!).Split(" -> ")[0].Split(' ').Length == 7) + .Select(e => (Name: (string)e!["function"]!, Rows: e["cases"]!.AsArray().Select(l => ((string)l!).Split(" -> ")[0].Split(' ')).ToArray())) + .ToArray(); + Assert.True(modes.Length >= 15, "the mix fixture lost blend modes"); + static string Multiset(IEnumerable rows, int first) => string.Join("|", rows.Select(r => string.Join(" ", r.Skip(first).Take(3))).OrderBy(x => x, StringComparer.Ordinal)); + foreach (var mode in modes) + Assert.True(Multiset(mode.Rows, 1) != Multiset(mode.Rows, 4), $"{mode.Name}: the second colours are the first colours"); + foreach (var f in modes) + foreach (var g in modes.Where(g => string.CompareOrdinal(f.Name, g.Name) < 0)) + Assert.True(Multiset(f.Rows, 4) != Multiset(g.Rows, 4), $"{f.Name} and {g.Name} draw the same second colours"); + + var ramps = Load("ramp")["functions"]!.AsArray() + .Select(e => e!["cases"]!.AsArray().Select(l => ((string)l!).Split(" -> ")[0]).ToArray()).ToArray(); + Assert.Equal(2, ramps.Length); + var tail = ramps[0].TakeLast(100).ToHashSet(); + Assert.True(!ramps[1].TakeLast(100).Any(tail.Contains), "the ramps' random t tails overlap"); + } + + [Theory] + [MemberData(nameof(Targets))] + public void HueSaturationAndValueOfThePrimariesFollowCycles(string target) + { + // util/color.h rgb_to_hsv: hue 0 for red, 1/3 for green, 2/3 for blue, saturation 1, value 1; a grey has + // hue 0 and saturation 0. Red's hue is exactly 0 and not 1, which hsv_to_rgb would read the same. + float[] Hsv(float r, float g, float b) => Flatten(Call(target, "cycles_rgb_to_hsv", new float3(r, g, b))); + Assert.Equal(new[] { 0.0f, 1.0f, 1.0f }, Hsv(1.0f, 0.0f, 0.0f)); + Assert.Equal(new[] { 0.0f, 0.0f, 0.5f }, Hsv(0.5f, 0.5f, 0.5f)); + Assert.Equal(1.0f / 3.0f, Hsv(0.0f, 1.0f, 0.0f)[0], 6); + Assert.Equal(2.0f / 3.0f, Hsv(0.0f, 0.0f, 1.0f)[0], 6); + var back = Flatten(Call(target, "cycles_hsv_to_rgb", new float3(0.0f, 1.0f, 1.0f))); + Assert.Equal(new[] { 1.0f, 0.0f, 0.0f }, back); + } + + [Fact] + public void RgbToBwCoefficientsAreTheOnesBlenderReads() + { + var entry = Load("rgb-to-bw")["functions"]!.AsArray().Single()!["cases"]!.AsArray().Select(line => ((string)line!).Split(" -> ")).ToArray(); + float Primary(int channel) => Float(entry.First(c => + { + var operands = c[0].Split(' ').Select(Float).ToArray(); + return Enumerable.Range(0, 3).All(k => operands[k] == (k == channel ? 1.0f : 0.0f)); + })[1]); + Assert.Equal(math.CYCLES_RGB_TO_Y_R, Primary(0)); + Assert.Equal(math.CYCLES_RGB_TO_Y_G, Primary(1)); + Assert.Equal(math.CYCLES_RGB_TO_Y_B, Primary(2)); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/ExprTests.cs b/packages/cultmath/tests/CultMath.Tests/ExprTests.cs new file mode 100644 index 00000000..491e7537 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/ExprTests.cs @@ -0,0 +1,611 @@ +using CultMath.Expr; +using Xunit; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// CultMath.Expr: the evaluator equals the direct composition of the same math calls bit for bit (every op and a +/// corpus imitating Aetheria's trophic compositions), the builder is canonical and refuses at the call, substitution +/// builds stencils, constants and param defaults keep their bits, bindings resolve by name, the validator's rules +/// refuse each one by name, and no refusal echoes a value it was given. +/// +/// Hand mutations these must kill: an op's implementation or operand order swapped in the table (the per-op +/// comparison); hash-consing disabled or the dead-node pass removed (BuildIsCanonical); Substitute leaving an input +/// unmapped (SubstituteEqualsOffsetEvaluation); a validator rule deleted (ValidatorRefusesEachRuleByName and the +/// builder refusals); a constant routed through float arithmetic (ConstantsKeepTheirBits). +/// +public sealed class ExprTests +{ + private const int Points = 4096; + private const string Canary = "CANARY"; + + private static readonly float[] Edge = + { + 0f, -0f, 1f, -1f, 0.5f, 3f, 1e-30f, float.Epsilon, -float.Epsilon, 1.17549435e-38f / 2f, + float.NaN, float.PositiveInfinity, float.NegativeInfinity, float.MaxValue, -float.MaxValue, 1e30f, -1e30f, + }; + + private static bool Same(float a, float b) => + (float.IsNaN(a) && float.IsNaN(b)) || BitConverter.SingleToInt32Bits(a) == BitConverter.SingleToInt32Bits(b); + + private static float[] Column(System.Random rng, int points, float lo, float hi, double edgeShare) + { + var column = new float[points]; + for (var i = 0; i < points; i++) + column[i] = rng.NextDouble() < edgeShare ? Edge[rng.Next(Edge.Length)] : lo + (hi - lo) * rng.NextSingle(); + return column; + } + + private static float[] Pack(params float[][] columns) => columns.SelectMany(column => column).ToArray(); + + private static float[] Run(ExprGraph graph, ExprBindings bindings, params float[][] columns) + { + var points = columns[0].Length; + var outputs = new float[points * graph.OutputNames.Count]; + ExprEvaluator.Evaluate(graph, bindings, Pack(columns), outputs); + return outputs; + } + + private static void AssertSame(float[] expected, float[] actual, int offset, string what) + { + for (var i = 0; i < expected.Length; i++) + Assert.True(Same(expected[i], actual[offset + i]), $"{what} point {i}: expected bits {BitConverter.SingleToInt32Bits(expected[i]):X8}, got {BitConverter.SingleToInt32Bits(actual[offset + i]):X8}"); + } + + // The reference side is written by hand, beside the table and not from it. + private static readonly Dictionary> Reference = new() + { + ["add"] = a => new[] { a[0] + a[1] }, + ["sub"] = a => new[] { a[0] - a[1] }, + ["mul"] = a => new[] { a[0] * a[1] }, + ["div"] = a => new[] { a[0] / a[1] }, + ["neg"] = a => new[] { -a[0] }, + ["min"] = a => new[] { min(a[0], a[1]) }, + ["max"] = a => new[] { max(a[0], a[1]) }, + ["abs"] = a => new[] { abs(a[0]) }, + ["floor"] = a => new[] { floor(a[0]) }, + ["frac"] = a => new[] { frac(a[0]) }, + ["sqrt"] = a => new[] { sqrt(a[0]) }, + ["exp"] = a => new[] { exp(a[0]) }, + ["log"] = a => new[] { log(a[0]) }, + ["pow"] = a => new[] { pow(a[0], a[1]) }, + ["sin"] = a => new[] { sin(a[0]) }, + ["cos"] = a => new[] { cos(a[0]) }, + ["clamp"] = a => new[] { clamp(a[0], a[1], a[2]) }, + ["saturate"] = a => new[] { saturate(a[0]) }, + ["lerp"] = a => new[] { lerp(a[0], a[1], a[2]) }, + ["step"] = a => new[] { step(a[0], a[1]) }, + ["smoothstep"] = a => new[] { smoothstep(a[0], a[1], a[2]) }, + ["select"] = a => new[] { a[0] > a[1] ? a[2] : a[3] }, + ["snoise2"] = a => new[] { snoise(new float2(a[0], a[1])) }, + ["snoise3"] = a => new[] { snoise(new float3(a[0], a[1], a[2])) }, + ["cellular3"] = a => + { + var c = cellular(new float3(a[0], a[1], a[2])); + return new[] { c.nearest.x, c.nearest.y, c.nearest.z, c.nearest.w, c.edge.x, c.edge.y, c.edge.z, c.edge.w, c.id }; + }, + }; + + [Fact] + public void OpTableIsTheStableVocabulary() + { + var expected = new (string Name, int Arity, int Results)[] + { + ("add", 2, 1), ("sub", 2, 1), ("mul", 2, 1), ("div", 2, 1), ("neg", 1, 1), ("min", 2, 1), ("max", 2, 1), + ("abs", 1, 1), ("floor", 1, 1), ("frac", 1, 1), ("sqrt", 1, 1), ("exp", 1, 1), ("log", 1, 1), ("pow", 2, 1), + ("sin", 1, 1), ("cos", 1, 1), ("clamp", 3, 1), ("saturate", 1, 1), ("lerp", 3, 1), ("step", 2, 1), + ("smoothstep", 3, 1), ("select", 4, 1), ("snoise2", 2, 1), ("snoise3", 3, 1), ("cellular3", 3, 9), + }; + Assert.Equal(expected, ExprOps.All.Select(op => (op.Name, op.Arity, op.ResultCount)).ToArray()); + Assert.Equal(ExprOps.All.Count, Reference.Count); + Assert.Equal(expected.Select(op => op.Name).OrderBy(name => name), Reference.Keys.OrderBy(name => name)); + Assert.Null(ExprOps.Find("input")); + Assert.Null(ExprOps.Find("nope")); + Assert.Same(ExprOps.All[3], ExprOps.Find("div")); + } + + [Fact] + public void EvaluatorEqualsDirectComposition() + { + var rng = new System.Random(20261014); + foreach (var op in ExprOps.All) + { + var builder = new ExprBuilder(); + var inputs = Enumerable.Range(0, op.Arity).Select(i => builder.Input("i" + i)).ToArray(); + var call = builder.Call(op.Name, inputs); + if (op.ResultCount == 1) builder.Output("r", call); + else for (var k = 0; k < op.ResultCount; k++) builder.Output("r" + k, builder.Pick(call, k)); + var graph = builder.Build(); + + var columns = Enumerable.Range(0, op.Arity).Select(_ => Column(rng, Points, -8f, 8f, 0.25)).ToArray(); + var outputs = Run(graph, ExprBindings.Bind(graph), columns); + for (var k = 0; k < op.ResultCount; k++) + { + var expected = new float[Points]; + for (var p = 0; p < Points; p++) + expected[p] = Reference[op.Name](columns.Select(column => column[p]).ToArray())[k]; + AssertSame(expected, outputs, k * Points, op.Name + " result " + k); + } + } + } + + [Fact] + public void EvaluatorEqualsDirectCompositionOnTheCorpus() + { + var rng = new System.Random(77); + var x = Column(rng, Points, -2f, 3f, 0.2); + var z = Column(rng, Points, -500f, 500f, 0.1); + + // smooth: smoothstep(0.2, 0.8, v) + var b = new ExprBuilder(); + b.Output("o", b.Call("smoothstep", b.Const(0.2f), b.Const(0.8f), b.Input("v"))); + var smooth = b.Build(); + AssertSame(x.Select(v => smoothstep(0.2f, 0.8f, v)).ToArray(), Run(smooth, ExprBindings.Bind(smooth), x), 0, "smooth"); + + // holling: p * (1 + k) / (p + k), k a param + b = new ExprBuilder(); + var p = b.Input("p"); + var k = b.Param("k", 0.25f); + b.Output("o", b.Call("div", b.Call("mul", p, b.Call("add", b.Const(1f), k)), b.Call("add", p, k))); + var holling = b.Build(); + AssertSame(x.Select(v => v * (1f + 0.25f) / (v + 0.25f)).ToArray(), Run(holling, ExprBindings.Bind(holling), x), 0, "holling"); + var overrides = new Dictionary { ["k"] = 0.4f }; + AssertSame(x.Select(v => v * (1f + 0.4f) / (v + 0.4f)).ToArray(), Run(holling, ExprBindings.Bind(holling, overrides), x), 0, "holling k=0.4"); + + // envelope: b^0.75 + b = new ExprBuilder(); + b.Output("o", b.Call("pow", b.Input("b"), b.Const(0.75f))); + var envelope = b.Build(); + AssertSame(x.Select(v => pow(v, 0.75f)).ToArray(), Run(envelope, ExprBindings.Bind(envelope), x), 0, "envelope"); + + // an 8-tap ring stencil of snoise2, with the centre, summed in order + var (ring, offsets) = RingStencil(48f); + var expected = new float[Points]; + for (var i = 0; i < Points; i++) + { + var sum = snoise(new float2(x[i] * 0.013f, z[i] * 0.017f)); + for (var t = 0; t < 8; t++) sum += snoise(new float2((x[i] + offsets[t].x) * 0.013f, (z[i] + offsets[t].y) * 0.017f)); + expected[i] = sum / 9f; + } + + AssertSame(expected, Run(ring, ExprBindings.Bind(ring), x, z), 0, "ring stencil"); + + // a cellular3 Pick chain: (edge.w - nearest.w) * id + b = new ExprBuilder(); + var cell = b.Call("cellular3", b.Input("x"), b.Input("y"), b.Input("z")); + b.Output("o", b.Call("mul", b.Call("sub", b.Pick(cell, 7), b.Pick(cell, 3)), b.Pick(cell, 8))); + var chain = b.Build(); + var y = Column(rng, Points, -6f, 6f, 0.05); + var cx = Column(rng, Points, -6f, 6f, 0.05); + var cz = Column(rng, Points, -6f, 6f, 0.05); + AssertSame( + Enumerable.Range(0, Points).Select(i => + { + var c = cellular(new float3(cx[i], y[i], cz[i])); + return (c.edge.w - c.nearest.w) * c.id; + }).ToArray(), + Run(chain, ExprBindings.Bind(chain), cx, y, cz), 0, "cellular chain"); + } + + private static ExprGraph Field() + { + var b = new ExprBuilder(); + b.Output("f", b.Call("snoise2", b.Call("mul", b.Input("x"), b.Const(0.013f)), b.Call("mul", b.Input("z"), b.Const(0.017f)))); + return b.Build(); + } + + private static (ExprGraph Graph, (float x, float y)[] Offsets) RingStencil(float radius) + { + var field = Field(); + var offsets = Enumerable.Range(0, 8) + .Select(t => (MathF.Cos(2f * MathF.PI * t / 8f) * radius, MathF.Sin(2f * MathF.PI * t / 8f) * radius)) + .ToArray(); + var b = new ExprBuilder(); + var x = b.Input("x"); + var z = b.Input("z"); + var sum = b.Substitute(field, new Dictionary { ["x"] = x, ["z"] = z })["f"]; + foreach (var (ox, oz) in offsets) + { + var tap = b.Substitute(field, new Dictionary + { + ["x"] = b.Call("add", x, b.Const(ox)), + ["z"] = b.Call("add", z, b.Const(oz)), + })["f"]; + sum = b.Call("add", sum, tap); + } + + b.Output("o", b.Call("div", sum, b.Const(9f))); + return (b.Build(), offsets); + } + + [Fact] + public void SubstituteEqualsOffsetEvaluation() + { + var rng = new System.Random(5); + var x = Column(rng, Points, -500f, 500f, 0.05); + var z = Column(rng, Points, -500f, 500f, 0.05); + var field = Field(); + var (stencil, offsets) = RingStencil(48f); + + var centre = Run(field, ExprBindings.Bind(field), x, z); + var sum = (float[])centre.Clone(); + for (var t = 0; t < 8; t++) + { + var tap = Run(field, ExprBindings.Bind(field), x.Select(v => v + offsets[t].x).ToArray(), z.Select(v => v + offsets[t].y).ToArray()); + for (var i = 0; i < Points; i++) sum[i] += tap[i]; + } + + var expected = sum.Select(s => s / 9f).ToArray(); + AssertSame(expected, Run(stencil, ExprBindings.Bind(stencil), x, z), 0, "substituted stencil"); + + // The wrong input substituted (z only) is a different graph and differs. + var b = new ExprBuilder(); + b.Input("x"); + var wz = b.Input("z"); + var wrong = b.Substitute(field, new Dictionary { ["z"] = b.Call("add", wz, b.Const(offsets[1].y)) })["f"]; + b.Output("o", wrong); + var wrongGraph = b.Build(); + var wrongOut = Run(wrongGraph, ExprBindings.Bind(wrongGraph), x, z); + var offsetOut = Run(field, ExprBindings.Bind(field), x, z.Select(v => v + offsets[1].y).ToArray()); + AssertSame(offsetOut, wrongOut, 0, "z-only substitution equals z-only offset"); + var xOffset = Run(field, ExprBindings.Bind(field), x.Select(v => v + offsets[1].x).ToArray(), z.Select(v => v + offsets[1].y).ToArray()); + Assert.Contains(Enumerable.Range(0, Points), i => !Same(xOffset[i], wrongOut[i])); + + // Substitute declares the graph's ports it does not replace, and refuses a name the graph lacks. + Assert.Equal(new[] { "x", "z" }, wrongGraph.InputNames); + var half = new ExprBuilder(); + half.Output("f", half.Substitute(field, new Dictionary { ["z"] = half.Const(1f) })["f"]); + Assert.Equal(new[] { "x" }, half.Build().InputNames); + var c = new ExprBuilder(); + var ex = Assert.Throws(() => c.Substitute(field, new Dictionary { [Canary] = c.Const(1f) })); + Assert.Equal("unknown-input", ex.Rule); + Assert.DoesNotContain(Canary, ex.Message); + var d = new ExprBuilder(); + var foreign = Assert.Throws(() => d.Substitute(field, new Dictionary { ["x"] = c.Const(1f) })); + Assert.Equal("foreign-operand", foreign.Rule); + var cell = d.Call("cellular3", d.Const(0f), d.Const(0f), d.Const(0f)); + Assert.Equal("bare-multi-result", Assert.Throws(() => d.Substitute(field, new Dictionary { ["x"] = cell })).Rule); + + // The checks are the call's own: a graph that is only its input still refuses a foreign or multi-result replacement. + var identity = new ExprBuilder(); + identity.Output("o", identity.Input("x")); + var passThrough = identity.Build(); + var e = new ExprBuilder(); + Assert.Equal("foreign-operand", Refusal(() => e.Substitute(passThrough, new Dictionary { ["x"] = c.Const(1f) })).Rule); + Assert.Equal("bare-multi-result", Refusal(() => e.Substitute(passThrough, new Dictionary { ["x"] = e.Call("cellular3", e.Const(0f), e.Const(0f), e.Const(0f)) })).Rule); + Assert.Same(c.Const(1f), c.Substitute(passThrough, new Dictionary { ["x"] = c.Const(1f) })["o"]); + } + + [Fact] + public void SubstituteCarriesParamsConstantsAndPicks() + { + // o = p * k + cellular(p, p, k).edge.w - 0.5, with k a param of default 0.25. + var g = new ExprBuilder(); + var gp = g.Input("p"); + var gk = g.Param("k", 0.25f); + var cell = g.Call("cellular3", gp, gp, gk); + g.Output("o", g.Call("sub", g.Call("add", g.Call("mul", gp, gk), g.Pick(cell, 7)), g.Const(0.5f))); + var graph = g.Build(); + + var b = new ExprBuilder(); + var shifted = b.Call("add", b.Input("x"), b.Const(1.5f)); + b.Output("o", b.Substitute(graph, new Dictionary { ["p"] = shifted })["o"]); + var rebuilt = b.Build(); + + Assert.Equal(new[] { "x" }, rebuilt.InputNames); + Assert.Equal(graph.ParamNames, rebuilt.ParamNames); + Assert.Equal(graph.ParamDefaultBits, rebuilt.ParamDefaultBits); + var x = Column(new System.Random(3), 512, -5f, 5f, 0.1); + foreach (var k in new[] { 0.25f, 0.9f }) + { + var expected = x.Select(v => + { + var p = v + 1.5f; + return p * k + cellular(new float3(p, p, k)).edge.w - 0.5f; + }).ToArray(); + var bindings = ExprBindings.Bind(rebuilt, new Dictionary { ["k"] = k }); + AssertSame(expected, Run(rebuilt, bindings, x), 0, "substituted graph, k=" + k); + } + + // A param met again with other default bits is a conflict, not a silent pick. + var c = new ExprBuilder(); + c.Param("k", 0.5f); + Assert.Equal("port-conflict", Refusal(() => c.Substitute(graph, new Dictionary())).Rule); + } + + private static string Signature(ExprGraph g) => + string.Join(";", g.InputNames) + "|" + string.Join(";", g.ParamNames.Zip(g.ParamDefaultBits, (n, v) => n + "=" + v)) + "|" + + string.Join(";", g.OutputNames.Zip(g.OutputNodes, (n, v) => n + "=" + v)) + "|" + + string.Join(";", g.Nodes.Select(n => n.WireName + "(" + string.Join(",", n.Operands) + ")" + n.Payload)); + + private static ExprGraph Sample(bool withDeadNode) + { + var b = new ExprBuilder(); + var x = b.Input("x"); + var y = b.Input("y"); + b.Param("unused", 2f); + var once = b.Call("mul", x, y); + var twice = b.Call("mul", x, y); + if (withDeadNode) b.Call("sin", b.Call("neg", y)); + b.Output("o", b.Call("add", once, twice)); + return b.Build(); + } + + [Fact] + public void BuildIsCanonical() + { + var graph = Sample(false); + Assert.Equal(Signature(graph), Signature(Sample(false))); + + Assert.Single(graph.Nodes, n => n.WireName == "mul"); + Assert.Equal(new[] { "input", "input", "mul", "add" }, graph.Nodes.Select(n => n.WireName)); + Assert.Equal(new[] { 2, 2 }, graph.Nodes[3].Operands); + + var withDead = Sample(true); + Assert.Equal(Signature(graph), Signature(withDead)); + Assert.DoesNotContain(withDead.Nodes, n => n.WireName == "sin" || n.WireName == "neg"); + + // The ports are the graph's contract: an unused param stays, and constants are told apart by bits. + Assert.Equal(new[] { "unused" }, graph.ParamNames); + var b = new ExprBuilder(); + var sameZero = b.Call("add", b.Const(0f), b.Const(0f)); + var minusZero = b.Const(-0f); + b.Output("a", sameZero); + b.Output("b", minusZero); + var zeros = b.Build(); + Assert.Equal(new[] { 0, int.MinValue }, zeros.Nodes.Where(n => n.Kind == ExprNodeKind.Const).Select(n => n.Payload)); + Assert.Equal(3, zeros.Nodes.Count); + } + + [Fact] + public void ConstantsKeepTheirBits() + { + var nanBits = 0x7FC12345; + var constants = new[] { -0f, BitConverter.Int32BitsToSingle(nanBits), BitConverter.Int32BitsToSingle(1) }; + var b = new ExprBuilder(); + for (var i = 0; i < constants.Length; i++) b.Output("c" + i, b.Const(constants[i])); + b.Output("p", b.Param("p", BitConverter.Int32BitsToSingle(nanBits))); + var graph = b.Build(); + + Assert.Equal(new[] { unchecked((int)0x80000000), nanBits, 1 }, graph.Nodes.Where(n => n.Kind == ExprNodeKind.Const).Select(n => n.Payload)); + Assert.Equal(new[] { nanBits }, graph.ParamDefaultBits); + var outputs = new float[graph.OutputNames.Count]; + ExprEvaluator.Evaluate(graph, ExprBindings.Bind(graph), ReadOnlySpan.Empty, outputs); + Assert.Equal(new[] { unchecked((int)0x80000000), nanBits, 1, nanBits }, outputs.Select(BitConverter.SingleToInt32Bits)); + } + + [Fact] + public void BindingsResolveByName() + { + var b = new ExprBuilder(); + b.Output("o", b.Call("sub", b.Param("a", 1.5f), b.Param("b", 4f))); + var graph = b.Build(); + float Eval(ExprBindings bindings) + { + var o = new float[1]; + ExprEvaluator.Evaluate(graph, bindings, ReadOnlySpan.Empty, o); + return o[0]; + } + + Assert.Equal(1.5f - 4f, Eval(ExprBindings.Bind(graph))); + Assert.Equal(1.5f - 4f, Eval(ExprBindings.Bind(graph, new Dictionary()))); + Assert.Equal(10f - 4f, Eval(ExprBindings.Bind(graph, new Dictionary { ["a"] = 10f }))); + Assert.Equal(1.5f - 7f, Eval(ExprBindings.Bind(graph, new Dictionary { ["b"] = 7f }))); + + var ex = Assert.Throws(() => ExprBindings.Bind(graph, new Dictionary { [Canary] = 1f })); + Assert.Equal("unknown-param", ex.Rule); + Assert.DoesNotContain(Canary, ex.Message); + + var other = new ExprBuilder(); + other.Output("o", other.Const(1f)); + var foreign = other.Build(); + Assert.Equal("foreign-bindings", Assert.Throws(() => + ExprEvaluator.Evaluate(graph, ExprBindings.Bind(foreign), ReadOnlySpan.Empty, new float[1])).Rule); + } + + [Fact] + public void EvaluateRefusesWrongColumnShapes() + { + var b = new ExprBuilder(); + b.Output("o", b.Input("x")); + b.Output("p", b.Call("neg", b.Input("x"))); + var graph = b.Build(); + var bindings = ExprBindings.Bind(graph); + Assert.Equal("column-shape", Assert.Throws(() => ExprEvaluator.Evaluate(graph, bindings, new float[2], new float[5])).Rule); + Assert.Equal("column-shape", Assert.Throws(() => ExprEvaluator.Evaluate(graph, bindings, new float[3], new float[4])).Rule); + var short_ = new float[4]; + Assert.Equal("column-shape", Assert.Throws(() => ExprEvaluator.Evaluate(graph, bindings, new float[1], short_)).Rule); + Assert.Equal("column-shape", Assert.Throws(() => ExprEvaluator.Evaluate(graph, bindings, ReadOnlySpan.Empty, short_)).Rule); + Assert.Equal(new float[4], short_); + var outputs = new float[6]; + ExprEvaluator.Evaluate(graph, bindings, new[] { 1f, 2f, 3f }, outputs); + var none = new ExprBuilder().Build(); + ExprEvaluator.Evaluate(none, ExprBindings.Bind(none), ReadOnlySpan.Empty, Span.Empty); + Assert.Equal(new[] { 1f, 2f, 3f, -1f, -2f, -3f }, outputs); + } + + [Fact] + public void AValidatedGraphCannotBeChangedThroughItsLists() + { + var b = new ExprBuilder(); + var x = b.Input("x"); + var k = b.Param("k", 2f); + b.Output("o", b.Call("mul", x, k)); + var graph = b.Build(); + var input = new[] { 1f, 2f, 3f }; + var before = new float[3]; + ExprEvaluator.Evaluate(graph, ExprBindings.Bind(graph), input, before); + var operands = graph.Nodes[2].Operands; + + Assert.False(graph.InputNames is string[] || graph.ParamNames is string[] || graph.OutputNames is string[]); + Assert.False(graph.ParamDefaultBits is int[] || graph.OutputNodes is int[] || operands is int[] || graph.Nodes is ExprNode[]); + Assert.Throws(() => ((IList)operands)[0] = 7); + Assert.Throws(() => ((IList)graph.OutputNodes)[0] = 99); + Assert.Throws(() => ((IList)graph.ParamDefaultBits)[0] = 0); + Assert.Throws(() => ((IList)graph.InputNames)[0] = "bad name"); + Assert.Throws(() => ((IList)graph.ParamNames)[0] = "bad name"); + Assert.Throws(() => ((IList)graph.OutputNames)[0] = "bad name"); + Assert.Throws(() => ((IList)graph.Nodes)[0] = graph.Nodes[1]); + + var after = new float[3]; + ExprEvaluator.Evaluate(graph, ExprBindings.Bind(graph), input, after); + Assert.Equal(before, after); + Assert.Equal(new[] { 2f, 4f, 6f }, after); + } + + [Fact] + public void CreateCopiesWhatItIsGiven() + { + var inputs = new[] { "x" }; + var outputs = new[] { "o" }; + var outputNodes = new[] { 0 }; + var nodes = new[] { ExprNode.Input(0) }; + var graph = ExprGraph.Create(ExprGraph.FormatVersion, inputs, Array.Empty(), Array.Empty(), outputs, outputNodes, nodes); + + inputs[0] = "bad name"; + outputs[0] = "bad name"; + outputNodes[0] = 99; + nodes[0] = ExprNode.Const(0); + + Assert.Equal(new[] { "x" }, graph.InputNames); + Assert.Equal(new[] { "o" }, graph.OutputNames); + Assert.Equal(new[] { 0 }, graph.OutputNodes); + Assert.Equal(ExprNodeKind.Input, graph.Nodes[0].Kind); + var operands = new[] { 0 }; + var call = ExprNode.Call("neg", operands); + operands[0] = 5; + Assert.Equal(new[] { 0 }, call.Operands); + } + + private static ExprGraphException Refusal(Action action) => Assert.Throws(action); + + [Fact] + public void TheBuilderRefusesAtTheCall() + { + var b = new ExprBuilder(); + var x = b.Input("x"); + var cell = b.Call("cellular3", x, x, x); + + var unknown = Refusal(() => b.Call(Canary + "op", x)); + Assert.Equal("unknown-op", unknown.Rule); + Assert.Equal(2, unknown.NodeIndex); + Assert.DoesNotContain(Canary, unknown.Message); + Assert.Equal("arity", Refusal(() => b.Call("add", x)).Rule); + Assert.Equal("arity", Refusal(() => b.Call("neg", x, x)).Rule); + Assert.Equal("pick-range", Refusal(() => b.Pick(x, 0)).Rule); + Assert.Equal("pick-range", Refusal(() => b.Pick(cell, 9)).Rule); + Assert.Equal("pick-range", Refusal(() => b.Pick(cell, -1)).Rule); + Assert.Equal("bare-multi-result", Refusal(() => b.Call("neg", cell)).Rule); + Assert.Equal("bare-multi-result", Refusal(() => b.Output("o", cell)).Rule); + Assert.Equal("foreign-operand", Refusal(() => b.Call("neg", new ExprBuilder().Const(1f))).Rule); + Assert.Equal("port-name", Refusal(() => b.Input(Canary + "-bad")).Rule); + Assert.Equal("port-name", Refusal(() => b.Input("1x")).Rule); + Assert.Equal("port-name", Refusal(() => b.Input("")).Rule); + Assert.Equal("port-name", Refusal(() => b.Param("a b", 1f)).Rule); + Assert.Equal("port-name", Refusal(() => b.Output("a.b", x)).Rule); + Assert.Equal(b.Pick(cell, 8).ResultCount, 1); + Assert.Equal(9, cell.ResultCount); + + b.Output("o", x); + Assert.Equal("duplicate-port-name", Refusal(() => b.Output("o", x)).Rule); + Assert.Same(x, b.Input("x")); + b.Param("p", 1f); + Assert.Equal("port-conflict", Refusal(() => b.Param("p", 2f)).Rule); + Assert.Same(b.Param("p", 1f), b.Param("p", 1f)); + Assert.NotNull(b.Input("p")); + Assert.Equal(new[] { "x", "p" }, b.Build().InputNames); + } + + private static ExprNode[] N(params ExprNode[] nodes) => nodes; + + private static ExprGraph Make( + ExprNode[] nodes, + int version = 1, + string[]? inputs = null, + string[]? paramNames = null, + int[]? paramBits = null, + string[]? outputNames = null, + int[]? outputNodes = null) => + ExprGraph.Create( + version, + inputs ?? new[] { "x" }, + paramNames ?? Array.Empty(), + paramBits ?? Array.Empty(), + outputNames ?? new[] { "o" }, + outputNodes ?? new[] { 0 }, + nodes); + + [Fact] + public void ValidatorRefusesEachRuleByName() + { + void Rule(string rule, Action act, int node = -1) + { + var ex = Assert.Throws(act); + Assert.Equal(rule, ex.Rule); + Assert.Equal(node, ex.NodeIndex); + } + + var x = ExprNode.Input(0); + Assert.Equal(1, Make(nodes: N(x)).Nodes.Count); + Rule("version", () => Make(version: 2, nodes: N(x))); + Rule("version", () => Make(version: 0, nodes: N(x))); + Rule("port-count", () => Make(paramNames: new[] { "a" }, nodes: N(x))); + Rule("port-count", () => Make(outputNames: new[] { "a", "b" }, nodes: N(x))); + Rule("port-name", () => Make(inputs: new[] { "9" }, nodes: N(x))); + Rule("duplicate-port-name", () => Make(inputs: new[] { "x", "x" }, nodes: N(x))); + Rule("duplicate-port-name", () => Make(paramNames: new[] { "a", "a" }, paramBits: new[] { 0, 0 }, nodes: N(x))); + Rule("duplicate-port-name", () => Make(outputNames: new[] { "a", "a" }, outputNodes: new[] { 0, 0 }, nodes: N(x))); + Assert.Equal(1, Make(inputs: new[] { "x" }, paramNames: new[] { "x" }, paramBits: new[] { 0 }, nodes: N(x)).Nodes.Count); + Rule("port-index", () => Make(nodes: N(ExprNode.Input(1))), 0); + Rule("port-index", () => Make(nodes: N(ExprNode.Input(-1))), 0); + Rule("port-index", () => Make(nodes: N(x, ExprNode.Param(0))), 1); + Rule("arity", () => Make(nodes: N(ExprNode.FromWire("input", new[] { 0 }, 0))), 0); + Rule("arity", () => Make(nodes: N(ExprNode.FromWire("const", new[] { 0 }, 0))), 0); + Rule("arity", () => Make(nodes: N(x, ExprNode.FromWire("pick", new int[0], 0))), 1); + Rule("payload", () => Make(nodes: N(x, ExprNode.FromWire("neg", new[] { 0 }, 7))), 1); + Rule("output-node", () => Make(outputNodes: new[] { 1 }, nodes: N(x))); + Rule("output-node", () => Make(outputNodes: new[] { -1 }, nodes: N(x))); + Rule("bare-multi-result", () => Make(outputNodes: new[] { 1 }, nodes: N(x, ExprNode.Call("cellular3", new[] { 0, 0, 0 }))), 1); + Rule("pick-range", () => Make(outputNodes: new[] { 1 }, nodes: N(x, ExprNode.Pick(0, 0))), 1); + Rule("operand-order", () => Make(nodes: N(x, ExprNode.Pick(5, 0))), 1); + Rule("operand-order", () => Make(nodes: N(x, ExprNode.Call("neg", new[] { -1 }))), 1); + Rule("operand-order", () => Make(nodes: N(x, ExprNode.Call("neg", new[] { 1 }))), 1); + } + + [Fact] + public void PortNamesAcceptTheirWholeAlphabetAndNothingBeside() + { + foreach (var name in new[] { "a", "z", "A", "Z", "_", "_9", "a0", "Z9", "x_Y_z_0" }) + Assert.Equal(new[] { name }, Make(nodes: N(ExprNode.Input(0)), inputs: new[] { name }).InputNames); + foreach (var name in new[] { "", "9", "@", "[", "`", "{", "/", ":", "a b", "a-b", "é" }) + Assert.Equal("port-name", Refusal(() => Make(nodes: N(ExprNode.Input(0)), inputs: new[] { name })).Rule); + foreach (var name in new[] { "a@", "a[", "a`", "a{", "a/", "a:" }) + Assert.Equal("port-name", Refusal(() => Make(nodes: N(ExprNode.Input(0)), inputs: new[] { name })).Rule); + } + + [Fact] + public void RefusalsNameTheirRuleAndNodeAndNothingElse() + { + var b = new ExprBuilder(); + var x = b.Input("x"); + Assert.Equal("unknown-op at node 1", Refusal(() => b.Call("nope", x)).Message); + Assert.Equal("port-name", Refusal(() => b.Input("1")).Message); + Assert.Equal("version", Refusal(() => Make(nodes: N(ExprNode.Input(0)), version: 3)).Message); + Assert.Equal(-1, Refusal(() => b.Input("1")).NodeIndex); + Assert.Equal(1, Refusal(() => b.Call("nope", x)).NodeIndex); + Assert.Equal(0, new ExprGraphException("r", 0).NodeIndex); + Assert.Equal("r at node 0", new ExprGraphException("r", 0).Message); + } + + [Fact] + public void FromWireNamesTheFourLeafKindsAndCalls() + { + foreach (var kind in new[] { "input", "param", "const", "pick" }) + Assert.Equal(kind, ExprNode.FromWire(kind, Array.Empty(), 0).WireName); + Assert.Equal(ExprNodeKind.Call, ExprNode.FromWire("add", new[] { 0, 0 }, 0).Kind); + Assert.Equal(ExprNodeKind.Call, ExprNode.FromWire("nope", Array.Empty(), 0).Kind); + Assert.Equal(new[] { ExprNodeKind.Input, ExprNodeKind.Param, ExprNodeKind.Const, ExprNodeKind.Pick }, + new[] { "input", "param", "const", "pick" }.Select(name => ExprNode.FromWire(name, Array.Empty(), 0).Kind)); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/FirstOrderInterceptTests.cs b/packages/cultmath/tests/CultMath.Tests/FirstOrderInterceptTests.cs new file mode 100644 index 00000000..a211d266 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/FirstOrderInterceptTests.cs @@ -0,0 +1,182 @@ +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +// math.first_order_intercept_time / first_order_intercept had one happy-path test before this +// (MathTests.FirstOrderInterceptSolvesSimpleClosingTarget). Stryker's baseline on +// hands/adopt-stryker found L264 (zero relative velocity), L270 (the a-approx-zero linear +// fallback), L280/L283 (the quadratic determinant and its roots) and L285 (the t1>0 branch) +// all undefended by fixtures that never varied relative velocity, never went linear, never +// lacked a solution, and never used off-axis/off-origin shooter and target state. +// +// For the closing cases (a genuine positive root exists), the assertion is behavioural: the +// returned aim point, fired at shotSpeed from a moving shooter, and the target's own motion +// must put the shot and the target at the same place at the returned time. That is verified by +// computing both positions independently in the test from math.first_order_intercept's own +// contract (targetPosition + time * targetRelativeVelocity is the aim point; the shot's actual +// world position folds in the shooter's velocity), not by re-deriving a second copy of the +// production formula. +// +// For the no-solution branches, there is no physical coincidence to check (the fallback is not +// a root of the intercept equation), so the assertion instead pins the contract read directly +// from the source at math.cs:264-298: velocitySquared < 0.001 => 0; determinant < 0 => 0; +// determinant > 0 with both roots <= 0 => 0 (via max(t2, 0)). +public sealed class FirstOrderInterceptTests +{ + private const int Precision = 4; + + [Fact] + public void ZeroRelativeVelocityReturnsZeroTime() + { + // Target and shooter share a velocity: targetRelativeVelocity is exactly zero, well + // under the 0.001 lengthsq guard, regardless of either party's absolute speed. + var time = math.first_order_intercept_time( + shotSpeed: 50.0f, + targetRelativePosition: new float3(12.0f, -7.0f, 3.0f), + targetRelativeVelocity: float3.zero); + + Assert.Equal(0.0f, time); + + var aimPoint = math.first_order_intercept( + shooterPosition: new float3(1.0f, 2.0f, 3.0f), + shooterVelocity: new float3(4.0f, 4.0f, 4.0f), + shotSpeed: 50.0f, + targetPosition: new float3(13.0f, -5.0f, 6.0f), + targetVelocity: new float3(4.0f, 4.0f, 4.0f)); + + // Contract: with time 0, the aim point is exactly the target's current position. + Assert.Equal(13.0f, aimPoint.x, Precision); + Assert.Equal(-5.0f, aimPoint.y, Precision); + Assert.Equal(6.0f, aimPoint.z, Precision); + } + + [Fact] + public void LinearFallbackWhenRelativeSpeedMatchesShotSpeedProducesPhysicalIntercept() + { + // velocitySquared == shotSpeed*shotSpeed makes a == 0 (|a| < 0.001), forcing the + // linear branch: time = -lengthsq(pos) / (2 * dot(vel, pos)), clamped to >= 0. + var shooterPosition = new float3(2.0f, -3.0f, 1.0f); + var shooterVelocity = new float3(1.0f, 0.5f, -0.5f); + var targetRelativePosition = new float3(10.0f, 0.0f, 0.0f); + var targetRelativeVelocity = new float3(-2.0f, 0.0f, 0.0f); + const float shotSpeed = 2.0f; // |targetRelativeVelocity| == 2 == shotSpeed => a == 0 + + var time = math.first_order_intercept_time(shotSpeed, targetRelativePosition, targetRelativeVelocity); + + // -100 / (2 * -20) = 2.5, computed independently of the production formula's code path. + Assert.Equal(2.5f, time, Precision); + + var targetPosition = shooterPosition + targetRelativePosition; + var targetVelocity = shooterVelocity + targetRelativeVelocity; + + var aimPoint = math.first_order_intercept(shooterPosition, shooterVelocity, shotSpeed, targetPosition, targetVelocity); + AssertShotAndTargetCoincideAtTime(shooterPosition, shooterVelocity, shotSpeed, aimPoint, targetPosition, targetVelocity, time); + } + + [Fact] + public void NegativeDeterminantReturnsZeroWhenTargetOutrunsTheProjectile() + { + // Target moving fast and mostly sideways, with a slow shot, so no real root of the + // intercept quadratic exists. b = 2*dot(vel, pos) is deliberately nonzero (-40): if it + // were 0, a mutant that drops the "determinant < 0" branch entirely and falls through to + // `max(-b / (2a), 0)` would coincidentally also compute 0 and this test would not + // distinguish the two. + var time = math.first_order_intercept_time( + shotSpeed: 1.0f, + targetRelativePosition: new float3(10.0f, 0.0f, 0.0f), + targetRelativeVelocity: new float3(-2.0f, 30.0f, 0.0f)); + + Assert.Equal(0.0f, time); + } + + [Fact] + public void BothQuadraticRootsPositiveReturnsTheEarlierOne() + { + // velocitySquared > shotSpeed*shotSpeed (a > 0): the target is relatively faster than + // the shot, but closing almost head-on, so both quadratic roots are real and positive + // (lengthsq(pos) >= 0 forces same-signed roots whenever a > 0). This is the only shape + // that reaches the `t1 > 0` branch's `t2 > 0 ? min(t1, t2) : t1` line at all; every other + // fixture in this file keeps t1 <= 0. + var shooterPosition = new float3(4.0f, -2.0f, 1.0f); + var shooterVelocity = new float3(0.5f, -0.5f, 0.0f); + var shotSpeed = 5.0f; + var targetRelativePosition = new float3(10.0f, 0.0f, 0.0f); + var targetRelativeVelocity = new float3(-20.0f, 0.0f, 0.0f); + + var time = math.first_order_intercept_time(shotSpeed, targetRelativePosition, targetRelativeVelocity); + + // a = 400 - 25 = 375, b = -400, c = 100, determinant = 10000, root = 100: + // t1 = (400 + 100) / 750 = 0.6667, t2 = (400 - 100) / 750 = 0.4. Both positive; the + // earlier one (0.4) is the physically correct intercept time. + Assert.Equal(0.4f, time, Precision); + + var targetPosition = shooterPosition + targetRelativePosition; + var targetVelocity = shooterVelocity + targetRelativeVelocity; + var aimPoint = math.first_order_intercept(shooterPosition, shooterVelocity, shotSpeed, targetPosition, targetVelocity); + AssertShotAndTargetCoincideAtTime(shooterPosition, shooterVelocity, shotSpeed, aimPoint, targetPosition, targetVelocity, time); + } + + [Fact] + public void RecedingTargetWithBothRootsNonPositiveReturnsZero() + { + // Target moving directly away from the shooter, faster than a slow shot: a real + // determinant exists but both quadratic roots are negative, so t1 > 0 is false and the + // function falls through to max(t2, 0) == 0. + var time = math.first_order_intercept_time( + shotSpeed: 1.0f, + targetRelativePosition: new float3(10.0f, 0.0f, 0.0f), + targetRelativeVelocity: new float3(5.0f, 0.0f, 0.0f)); + + Assert.Equal(0.0f, time); + } + + [Fact] + public void ClosingCaseWithOffOriginOffAxisPositionsProducesPhysicallyConsistentIntercept() + { + // Neither shooter nor target sits at the origin, no vector is axis-aligned, and both + // parties are moving. This is the fixture shape ("degenerate fixtures are how these + // survived") the earlier single test never exercised. + var shooterPosition = new float3(2.0f, 3.0f, -1.0f); + var shooterVelocity = new float3(1.0f, -1.0f, 0.5f); + var shotSpeed = 10.0f; + var targetPosition = new float3(15.0f, 8.0f, 4.0f); + var targetVelocity = new float3(-3.0f, 2.0f, 1.0f); + + var targetRelativePosition = targetPosition - shooterPosition; + var targetRelativeVelocity = targetVelocity - shooterVelocity; + var time = math.first_order_intercept_time(shotSpeed, targetRelativePosition, targetRelativeVelocity); + + Assert.True(time > 0.0f, "fixture must produce a genuine closing solution"); + + var aimPoint = math.first_order_intercept(shooterPosition, shooterVelocity, shotSpeed, targetPosition, targetVelocity); + AssertShotAndTargetCoincideAtTime(shooterPosition, shooterVelocity, shotSpeed, aimPoint, targetPosition, targetVelocity, time); + } + + /// + /// Fires from , inheriting + /// and adding toward , and asserts the + /// shot's world position at coincides with the target's own actual + /// motion ( + time * ). + /// This is the behavioural contract first_order_intercept exists to serve: aim here, and the + /// target will be there when the shot arrives. + /// + private static void AssertShotAndTargetCoincideAtTime( + float3 shooterPosition, + float3 shooterVelocity, + float shotSpeed, + float3 aimPoint, + float3 targetPosition, + float3 targetVelocity, + float time) + { + var direction = math.normalize(aimPoint - shooterPosition); + var shotVelocity = shooterVelocity + shotSpeed * direction; + var shotPositionAtTime = shooterPosition + time * shotVelocity; + var targetPositionAtTime = targetPosition + time * targetVelocity; + + Assert.Equal(targetPositionAtTime.x, shotPositionAtTime.x, Precision); + Assert.Equal(targetPositionAtTime.y, shotPositionAtTime.y, Precision); + Assert.Equal(targetPositionAtTime.z, shotPositionAtTime.z, Precision); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/GlslLowering.cs b/packages/cultmath/tests/CultMath.Tests/GlslLowering.cs new file mode 100644 index 00000000..9af009f3 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/GlslLowering.cs @@ -0,0 +1,187 @@ +using System.Text; +using System.Text.RegularExpressions; + +namespace CultMath.Tests; + +/// +/// The HLSL to GLSL ES 3.00 transformation that produces shaders/CultMath.glsl, and one file per +/// entry, from shaders/CultMath.hlsl and its includes. The steps below, +/// in order, are the complete list documented in docs/design.md (GLSL Target: Source Transformations). +/// A dialect gap outside the list is fixed in the HLSL, in the subset both languages share, never by a +/// special case here; GlslMirrorTests fails on any HLSL-only token that survives. +/// +internal static class GlslLowering +{ + /// + /// Includes under a file-level licence of their own: each is lowered into its own output file instead + /// of being inlined, so CultMath.glsl stays MIT. This table is the lowering's only rule keyed by name. + /// + internal static readonly IReadOnlyDictionary SeparateFiles = + new Dictionary + { + // Phacelle is a port of MPL-2.0 code, and MPL-2.0 covers the files that carry it. + ["CultMath.Phacelle.hlsl"] = ("CultMath.Phacelle.glsl", "MPL-2.0"), + // The Cycles node semantics are a port of Apache-2.0 code, and the licence travels with the file. + ["CultMath.Cycles.hlsl"] = ("CultMath.Cycles.glsl", "Apache-2.0"), + }; + + private const string Regenerate = + "by GlslLowering (packages/cultmath/tests/CultMath.Tests/GlslLowering.cs). Do not edit; regenerate with " + + "CULTMATH_WRITE_GLSL=1 dotnet test --filter GlslMirrorTests."; + + /// + /// The lowered files as (name under shaders/, text): CultMath.glsl first, then one per + /// entry, which requires CultMath.glsl before it. + /// + internal static IReadOnlyList<(string File, string Text)> Lower(string cultMathRoot) + { + // 1. Each #include is inlined in place by the C# mirror's own resolver, except a SeparateFiles + // include, which leaves nothing behind and is lowered into its own file. + var inlined = new List(); + var library = HlslSourceCompatibilityTests.ReadShaderSource(cultMathRoot, name => + { + if (SeparateFiles.ContainsKey(name)) + return false; + inlined.Add(name); + return true; + }); + + var outputs = new List<(string File, string Text)>(); + var pointers = new List(); + foreach (var (hlsl, (glsl, licence)) in SeparateFiles) + { + var text = LowerText( + File.ReadAllText(Path.Combine(cultMathRoot, "shaders", hlsl)), + $"// Generated from shaders/{hlsl} {Regenerate} {licence}; requires CultMath.glsl before it.", + glsl); + var functions = Regex.Matches(text, @"(?m)^\w+\s+(cultmath_\w+)\s*\(").Select(m => m.Groups[1].Value); + pointers.Add($" {string.Join(", ", functions)} is in {glsl}, to be concatenated after this file by consumers that call it."); + outputs.Add((glsl, text)); + } + + var includes = string.Concat(inlined.Select(name => " and " + name)); + outputs.Insert(0, ("CultMath.glsl", LowerText( + library, $"// Generated from shaders/CultMath.hlsl{includes} {Regenerate} MIT.{string.Concat(pointers)}", "CultMath.glsl"))); + return outputs; + } + + private static string LowerText(string hlsl, string provenance, string file) + { + var source = hlsl.ReplaceLineEndings("\n"); + + // 2. Include guards are dropped, and so are the functions taking Texture2D/SamplerState, exactly + // as the C# mirror drops them; the host shader samples its own textures. The capacity macro + // (#ifndef CULTMATH_MAX_SITES ... #endif) stays: GLSL has the preprocessor, and a consumer overrides it. + source = HlslSourceCompatibilityTests.DropGuards(source, (name, value) => $"#ifndef {name}\n#define {name} {value}\n#endif"); + source = Regex.Replace(source, @"(?ms)^\w+ \w+\([^)]*\b(Texture2D|SamplerState)\b[^)]*\)\s*\{.*?^\}[ \t]*$", string.Empty); + + // 3. Type names: floatN, intN, uintN and boolN become vecN, ivecN, uvecN and bvecN, and float3x3 + // becomes mat3 (the one matrix type the library returns: a float3x3 is built from nine scalars, + // which HLSL reads as rows and GLSL as columns, so only symmetric matrices are exported). + source = LowerTypeNames(source); + + // 4. File-scope `static const` becomes `const`. + source = Regex.Replace(source, @"(?m)^static const ", "const "); + + // 5. C-style casts (float)x, (int)x and (uint)x become constructor calls float(x), int(x) and + // uint(x). The operand is found by a balanced scanner, not a regex: (int)((state >> 28) + 4u) + // nests parentheses. + source = LowerCasts(source); + + // 6. Intrinsic renames: lerp -> mix, frac -> fract, rsqrt -> inversesqrt, asuint -> + // floatBitsToUint, asfloat -> uintBitsToFloat, atan2 -> atan (GLSL's two-argument arctangent), + // and saturate(x) -> clamp(x, 0.0, 1.0). + // Identifier boundaries keep cultmath_lerp and the rest of the cultmath_ names intact. + source = Regex.Replace(source, @"\blerp\(", "mix("); + source = Regex.Replace(source, @"\bfrac\(", "fract("); + source = Regex.Replace(source, @"\brsqrt\(", "inversesqrt("); + source = Regex.Replace(source, @"\basuint\(", "floatBitsToUint("); + source = Regex.Replace(source, @"\basfloat\(", "uintBitsToFloat("); + source = Regex.Replace(source, @"\batan2\(", "atan("); + source = LowerSaturate(source); + + // 7. Float literals pass through: HLSL's unsuffixed 0.5 and 1.0e30 are GLSL literals already. + + // 8. The guard named for the file (CultMath.glsl -> CULTMATH_GLSL), and 9. the provenance line. + var guard = file.ToUpperInvariant().Replace('.', '_'); + return provenance + "\n#ifndef " + guard + "\n#define " + guard + "\n" + source.Trim('\n') + "\n\n#endif\n"; + } + + /// Step 3 alone; GlslMirrorTests maps the HLSL signatures with it to compare overloads. + internal static string LowerTypeNames(string source) + { + source = Regex.Replace(source, @"\bfloat([234])\b", "vec$1"); + source = Regex.Replace(source, @"\bint([234])\b", "ivec$1"); + source = Regex.Replace(source, @"\buint([234])\b", "uvec$1"); + source = Regex.Replace(source, @"\bbool([234])\b", "bvec$1"); + return Regex.Replace(source, @"\bfloat3x3\b", "mat3"); + } + + private static readonly Regex Cast = new(@"\((float|int|uint)\)"); + + private static string LowerCasts(string source) + { + for (var match = Cast.Match(source); match.Success; match = Cast.Match(source)) + { + var start = match.Index + match.Length; + var end = OperandEnd(source, start); + // A parenthesized operand lends its own parentheses to the constructor call. + var operand = source[start] == '(' && Balanced(source, start) == end ? source[(start + 1)..(end - 1)] : source[start..end]; + source = source[..match.Index] + match.Groups[1].Value + "(" + operand + ")" + source[end..]; + } + + return source; + } + + // The cast operand: a parenthesized group, or an identifier or number followed by any member + // accesses, calls and indexing. Anything else is outside the list and throws. + private static int OperandEnd(string source, int index) + { + if (index < source.Length && source[index] == '(') + return Balanced(source, index); + var token = Regex.Match(source[index..], @"^[A-Za-z_0-9]+"); + if (!token.Success) + throw new InvalidOperationException($"cast operand outside the lowering list at: {source.Substring(index, Math.Min(40, source.Length - index))}"); + index += token.Length; + while (index < source.Length) + { + if (source[index] == '(' || source[index] == '[') + index = Balanced(source, index); + else if (source[index] == '.' && index + 1 < source.Length && (char.IsLetter(source[index + 1]) || source[index + 1] == '_')) + index += 1 + Regex.Match(source[(index + 1)..], @"^[A-Za-z_0-9]+").Length; + else + break; + } + + return index; + } + + // The index one past the bracket that closes the one at `open`. + private static int Balanced(string source, int open) + { + var depth = 0; + for (var i = open; i < source.Length; i++) + { + if (source[i] is '(' or '[') + depth++; + else if (source[i] is ')' or ']' && --depth == 0) + return i + 1; + } + + throw new InvalidOperationException($"unbalanced bracket at {open}"); + } + + private static string LowerSaturate(string source) + { + var saturate = new Regex(@"\bsaturate\("); + for (var match = saturate.Match(source); match.Success; match = saturate.Match(source)) + { + var open = match.Index + match.Length - 1; + var close = Balanced(source, open); + var argument = source[(open + 1)..(close - 1)]; + source = source[..match.Index] + "clamp(" + argument + ", 0.0, 1.0)" + source[close..]; + } + + return source; + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Device.cs b/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Device.cs new file mode 100644 index 00000000..9324cad5 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Device.cs @@ -0,0 +1,701 @@ +using System.Globalization; +using System.Text.Json.Nodes; +using CultMath; +using Xunit; +using Xunit.Sdk; + +namespace CultMath.Tests; + +/// +/// The conforming run's C# half. says what a device must compute: every fixture +/// family on the fixture's own arguments, plus one reference family for each sampled-form family, whose +/// points are the ones the form check evaluates. says whether a device's results +/// hold: exact and integer families bit for bit, check families by their Verify, sampled-form families by +/// the form check on the device's own reference values, every other family within its recorded bound. +/// The generator, the Vulkan host and the job script only spell, dispatch and run; they compare nothing. +/// +public sealed partial class GlslMirrorTests +{ + private static readonly string[] DeviceRoutes = { "lavapipe-hlsl", "lavapipe-glsl" }; + + private static string BoundsPath => Path.Combine(Root, "tests", "CultMath.Tests", "fixtures", "device-bounds-lavapipe.txt"); + + private static string? Env(string name) => Environment.GetEnvironmentVariable(name) is { Length: > 0 } value ? value : null; + + private static JsonArray FixtureFamilies() => JsonNode.Parse(File.ReadAllText(FixturePath))!["functions"]!.AsArray(); + + private static string[] Sides(JsonNode? entry) => ((string)entry!).Split(" -> "); + + private static uint[] DevWords(string hex) => hex.Split(' ').Select(h => Convert.ToUInt32(h, 16)).ToArray(); + + private static string DevHex(IEnumerable words) => string.Join(' ', words.Select(w => w.ToString("x8"))); + + private static uint[] ReadWords(string path) + { + var bytes = File.ReadAllBytes(path); + var words = new uint[bytes.Length / 4]; + for (var i = 0; i < words.Length; i++) + words[i] = BitConverter.ToUInt32(bytes, i * 4); + return words; + } + + private static void WriteWords(string path, IEnumerable words) + { + using var writer = new BinaryWriter(File.Create(path)); + foreach (var word in words) + writer.Write(word); + } + + private static bool IsSampledForm(Family family) => + family.Check is not null && (family.Glsl.Contains("cultmath_af_snoise(") || family.Glsl.Contains("cultmath_af_fbm(")); + + private static string Tag(int family) => $"f{family:D3}"; + + private static string RefTag(int family) => $"r{family:D3}"; + + private sealed record WorkItem(string Tag, string Index, string Glsl, int N, int WordsIn, int WordsOut); + + // ---- What a device must compute ---- + + private static List WriteWork(string dir) + { + Directory.CreateDirectory(dir); + var fixture = FixtureFamilies(); + Assert.Equal(Families.Length, fixture.Count); + var items = new List(); + for (var f = 0; f < Families.Length; f++) + { + Assert.Equal(Families[f].Glsl, (string?)fixture[f]!["glsl"]); + var cases = fixture[f]!["cases"]!.AsArray(); + WriteWords(Path.Combine(dir, Tag(f) + ".in"), cases.SelectMany(c => DevWords(Sides(c)[0]))); + items.Add(new WorkItem(Tag(f), f.ToString(CultureInfo.InvariantCulture), Families[f].Glsl, cases.Count, DevWords(Sides(cases[0])[0]).Length, DevWords(Sides(cases[0])[1]).Length)); + if (IsSampledForm(Families[f])) + items.Add(WriteReference(dir, f, cases)); + } + + File.WriteAllLines(Path.Combine(dir, "manifest.txt"), items.Select(i => string.Join('\t', i.Tag, i.Index, i.Glsl, i.N, i.WordsIn, i.WordsOut))); + return items; + } + + // The points the form check evaluates the reference at, in the order it evaluates them: the reference + // func records p, and for fBm the case's octaves, lacunarity and gain, then answers as C# does. + private static WorkItem WriteReference(string dir, int family, JsonArray cases) + { + var fbm = Families[family].Glsl.Contains("cultmath_af_fbm("); + var recorded = new List(); + Func recorder = (t, p) => + { + recorded.AddRange(new[] { BitConverter.SingleToUInt32Bits(p.x), BitConverter.SingleToUInt32Bits(p.y), BitConverter.SingleToUInt32Bits(p.z) }); + if (fbm) + recorded.AddRange(t[7..10].Select(h => Convert.ToUInt32(h, 16))); + return fbm ? FbmReference(t, p) : SnoiseReference(t, p); + }; + if (fbm) + AssertFbmForm(cases, false, recorder); + else + AssertSnoiseForm(cases, false, recorder); + + var wordsIn = fbm ? 6 : 3; + WriteWords(Path.Combine(dir, RefTag(family) + ".in"), recorded); + return new WorkItem(RefTag(family), "ref:" + family.ToString(CultureInfo.InvariantCulture), + fbm ? "vec4 cultmath_fbm_grad(vec3, int, float, float)" : "float cultmath_snoise(vec3)", recorded.Count / wordsIn, wordsIn, fbm ? 4 : 1); + } + + [Fact] + public void WriteDeviceWork() + { + var dir = Env("CULTMATH_DEVICE_WORK"); + Assert.SkipUnless(dir is not null, "CULTMATH_DEVICE_WORK= writes the work list a device runs"); + var items = WriteWork(dir!); + output.WriteLine($"{items.Count} work items ({items.Count(i => i.Index.StartsWith("ref:"))} reference families) in {dir}"); + } + + // ---- Whether a device's results hold ---- + + private sealed record BoundRow(string Route, int Index, string Glsl, string Tolerance, int Exact, double Worst, int NanClass, string Bits); + + private sealed record Measured(BoundRow Row, string Class); + + private sealed record Judgement(List Failures, List Rows); + + // Which words of a family's result are floats; the rest are integers and must match bit for bit. + private static IEnumerable FloatWords(Type type) => + type == typeof(float) ? new[] { true } + : type == typeof(int) || type == typeof(uint) ? new[] { false } + : type == typeof(float3x3) ? Enumerable.Repeat(true, 9) + : type.GetFields().Where(f => !f.IsStatic).SelectMany(f => FloatWords(f.FieldType)); + + // u1 = |device - fixture| / max(|fixture|, 1) / 2^-23 per float component, worst over the family; NaN and + // Inf are compared as classes (NaN against not-NaN, an Inf against anything else), never by value. + private static (int Exact, double Worst, int NanClass) Measure(JsonArray cases, bool[] floatWord, uint[] got) + { + int exact = 0, nanClass = 0; + var worst = 0.0; + var wordsOut = floatWord.Length; + for (var c = 0; c < cases.Count; c++) + { + var want = DevWords(Sides(cases[c])[1]); + var same = true; + for (var w = 0; w < wordsOut; w++) + { + var have = got[c * wordsOut + w]; + if (have == want[w]) + continue; + same = false; + if (!floatWord[w]) + { + nanClass++; + continue; + } + + var e = BitConverter.UInt32BitsToSingle(want[w]); + var h = BitConverter.UInt32BitsToSingle(have); + if (float.IsNaN(e) || float.IsNaN(h)) + nanClass += float.IsNaN(e) == float.IsNaN(h) ? 0 : 1; + else if (float.IsInfinity(e) || float.IsInfinity(h)) + nanClass += e == h ? 0 : 1; + else + worst = Math.Max(worst, Math.Abs((double)e - h) / Math.Max(Math.Abs((double)e), 1.0) / Math.ScaleB(1.0, -23)); + } + + if (same) + exact++; + } + + return (exact, worst, nanClass); + } + + // The device's own reference values, in the order WriteReference recorded their points. The check asks + // for the reference at a point; the point it asks for must be the one the device was given at that place. + private static Func DeviceReference(string work, string routeResults, WorkItem reference) + { + var points = ReadWords(Path.Combine(work, reference.Tag + ".in")); + var values = ReadWords(Path.Combine(routeResults, reference.Tag + ".out")); + Assert.Equal(reference.N * reference.WordsOut, values.Length); + var next = 0; + return (_, p) => + { + Assert.True(next < reference.N, "reference point asked for past the recorded work"); + var at = next * reference.WordsIn; + Assert.True(points[at] == BitConverter.SingleToUInt32Bits(p.x) && points[at + 1] == BitConverter.SingleToUInt32Bits(p.y) && points[at + 2] == BitConverter.SingleToUInt32Bits(p.z), + $"reference point {next} is not the point the device was given"); + return BitConverter.UInt32BitsToSingle(values[next++ * reference.WordsOut + reference.WordsOut - 1]); + }; + } + + // sha256 of the family's result bytes, and of its reference result when it is judged on one. + private static string ResultBits(string path, string? reference) + { + var bytes = File.ReadAllBytes(path); + if (reference is not null) + bytes = bytes.Concat(File.ReadAllBytes(reference)).ToArray(); + return Convert.ToHexString(System.Security.Cryptography.SHA256.HashData(bytes)).ToLowerInvariant(); + } + + // A tolerance text may state what a device is allowed: "on a device |diff| <= 2^-N max(|v|, 1)", which in + // u1 units (2^-23) is 2^(23-N). The judge reads it here and nowhere else. + private static double? StatedDeviceLimit(string tolerance) + { + var m = System.Text.RegularExpressions.Regex.Match(tolerance, @"on a device \|diff\| <= 2\^-(\d+) max\(\|v\|, 1\)"); + return m.Success ? Math.ScaleB(1.0, 23 - int.Parse(m.Groups[1].Value)) : null; + } + + private static string FirstLine(Exception e) + { + var line = e.Message.Split('\n')[0]; + return line.Length > 300 ? line[..300] : line; + } + + private static Judgement JudgeDevice(string work, string results, string renderer, string identity, string boundsPath, bool write) + { + var failures = new List(); + var measured = new List(); + Dictionary<(string, int), BoundRow>? recorded = null; + if (!write) + { + if (!File.Exists(boundsPath)) + return new Judgement(new List { "no recorded device bounds; record them with CULTMATH_WRITE_DEVICE_BOUNDS=1" }, measured); + var (header, rows) = ReadBounds(boundsPath); + if (header.GetValueOrDefault("renderer") != renderer || header.GetValueOrDefault("identity") != identity) + return new Judgement(new List { "the device or its toolchain is not the one the bounds were recorded on; re-record them with CULTMATH_WRITE_DEVICE_BOUNDS=1" }, measured); + recorded = rows; + } + + var fixture = FixtureFamilies(); + var items = File.ReadAllLines(Path.Combine(work, "manifest.txt")).Select(l => l.Split('\t')) + .ToDictionary(c => c[1], c => new WorkItem(c[0], c[1], c[2], int.Parse(c[3]), int.Parse(c[4]), int.Parse(c[5]))); + foreach (var route in DeviceRoutes) + for (var f = 0; f < Families.Length; f++) + { + var family = Families[f]; + var cases = fixture[f]!["cases"]!.AsArray(); + var name = $"{route} #{f} {family.Glsl}"; + var path = Path.Combine(results, route, Tag(f) + ".out"); + if (!File.Exists(path)) + { + failures.Add($"{name}: missing {Tag(f)}.out"); + continue; + } + + var floatWord = FloatWords(Resolve(family.Glsl).ReturnType).ToArray(); + var got = ReadWords(path); + if (got.Length != cases.Count * floatWord.Length) + { + failures.Add($"{name}: {Tag(f)}.out holds {got.Length} words, not {cases.Count * floatWord.Length}"); + continue; + } + + var (exact, worst, nanClass) = Measure(cases, floatWord, got); + var bits = ResultBits(path, IsSampledForm(family) ? Path.Combine(results, route, RefTag(f) + ".out") : null); + var exactClass = family.Tolerance == "exact" || !floatWord.Any(w => w); + var kind = exactClass ? "exact" : IsSampledForm(family) ? "sampled" : family.Verify is not null ? "check" : "bound"; + measured.Add(new Measured(new BoundRow(route, f, family.Glsl, family.Tolerance, exact, worst, nanClass, bits), kind)); + try + { + if (exactClass) + Assert.True(exact == cases.Count, $"{exact} of {cases.Count} cases are bit-identical to the fixture"); + else if (kind == "sampled") + { + var reference = DeviceReference(work, Path.Combine(results, route), items["ref:" + f]); + if (family.Glsl.Contains("cultmath_af_fbm(")) + AssertFbmForm(cases, false, reference); + else + AssertSnoiseForm(cases, false, reference); + } + else if (kind == "check") + family.Verify!(new JsonArray(cases.Select((c, i) => (JsonNode)JsonValue.Create(Sides(c)[0] + " -> " + DevHex(got.Skip(i * floatWord.Length).Take(floatWord.Length)))!).ToArray())); + } + catch (XunitException e) + { + failures.Add($"{name}: {FirstLine(e)}"); + } + } + + if (write) + { + WriteBounds(boundsPath, renderer, identity, measured.Select(m => m.Row)); + recorded = measured.ToDictionary(m => (m.Row.Route, m.Row.Index), m => m.Row); + } + + foreach (var m in measured) + { + var name = $"{m.Row.Route} #{m.Row.Index} {m.Row.Glsl}"; + if (!recorded!.TryGetValue((m.Row.Route, m.Row.Index), out var bound)) + failures.Add($"{name}: no recorded row; re-record with CULTMATH_WRITE_DEVICE_BOUNDS=1"); + else if (bound.Glsl != m.Row.Glsl || bound.Tolerance != m.Row.Tolerance) + failures.Add($"{name}: the recorded row is for another family; re-record with CULTMATH_WRITE_DEVICE_BOUNDS=1"); + else if (m.Class == "bound" && (m.Row.Worst > bound.Worst || m.Row.NanClass > bound.NanClass)) + failures.Add($"{name}: worst u1 {m.Row.Worst:R} and {m.Row.NanClass} NaN-class mismatches, past the recorded {bound.Worst:R} and {bound.NanClass}"); + else if (m.Class == "bound" && StatedDeviceLimit(m.Row.Tolerance) is { } limit && m.Row.Worst > limit) + failures.Add($"{name}: worst u1 {m.Row.Worst:R}, past the {limit:R} its stated tolerance allows a device"); + else if (m.Row.Bits != bound.Bits && !failures.Any(x => x.StartsWith(name + ":"))) + failures.Add($"{name}: the result bits differ from the recorded run's; if the change is meant, re-record with CULTMATH_WRITE_DEVICE_BOUNDS=1"); + } + + return new Judgement(failures, measured); + } + + // ---- The recorded bounds: plain text, tab-separated, one row per route and family ---- + + private static void WriteBounds(string path, string renderer, string identity, IEnumerable rows) + { + var lines = new List + { + "# renderer\t" + renderer, + "# identity\t" + identity, + "# route\tindex\tglsl\ttolerance\texact cases\tworst u1\tNaN-class mismatches result sha256; written only by CULTMATH_WRITE_DEVICE_BOUNDS=1", + }; + lines.AddRange(rows.OrderBy(r => r.Route, StringComparer.Ordinal).ThenBy(r => r.Index) + .Select(r => string.Join('\t', r.Route, r.Index, r.Glsl, r.Tolerance, r.Exact, r.Worst.ToString("R", CultureInfo.InvariantCulture), r.NanClass, r.Bits))); + File.WriteAllText(path, string.Join('\n', lines) + "\n"); + } + + private static (Dictionary Header, Dictionary<(string, int), BoundRow> Rows) ReadBounds(string path) + { + var header = new Dictionary(); + var rows = new Dictionary<(string, int), BoundRow>(); + foreach (var line in File.ReadAllLines(path)) + { + var c = line.Split('\t'); + if (line.StartsWith("# renderer\t") || line.StartsWith("# identity\t")) + header[c[0][2..]] = c[1]; + else if (!line.StartsWith('#') && line.Length > 0) + rows[(c[0], int.Parse(c[1]))] = new BoundRow(c[0], int.Parse(c[1]), c[2], c[3], int.Parse(c[4]), double.Parse(c[5], CultureInfo.InvariantCulture), int.Parse(c[6]), c[7]); + } + + return (header, rows); + } + + [Fact] + public void DeviceResultsHoldFixture() + { + var results = Env("CULTMATH_DEVICE_RESULTS"); + Assert.SkipUnless(results is not null, "CULTMATH_DEVICE_RESULTS= (holding /.out) judges a device's results"); + var work = Env("CULTMATH_DEVICE_WORK"); + var renderer = Env("CULTMATH_DEVICE_NAME"); + var identity = Env("CULTMATH_DEVICE_IDENTITY"); + Assert.True(work is not null && renderer is not null && identity is not null, "CULTMATH_DEVICE_WORK, CULTMATH_DEVICE_NAME and CULTMATH_DEVICE_IDENTITY are required beside CULTMATH_DEVICE_RESULTS"); + var judgement = JudgeDevice(work!, results!, renderer!, identity!, BoundsPath, Env("CULTMATH_WRITE_DEVICE_BOUNDS") == "1"); + foreach (var route in DeviceRoutes) + { + var rows = judgement.Rows.Where(m => m.Row.Route == route).ToList(); + output.WriteLine($"{route}: {rows.Count} families judged: " + string.Join(", ", rows.GroupBy(m => m.Class).OrderBy(g => g.Key).Select(g => $"{g.Count()} {g.Key}"))); + foreach (var m in rows.OrderByDescending(m => m.Row.Worst).Take(5)) + output.WriteLine($" worst u1 {m.Row.Worst:R}, {m.Row.NanClass} NaN-class: #{m.Row.Index} {m.Row.Glsl} ({m.Class})"); + } + + foreach (var failure in judgement.Failures.Take(60)) + output.WriteLine("FAIL " + failure); + Assert.True(judgement.Failures.Count == 0, $"{judgement.Failures.Count} device results do not hold the fixture; first: {judgement.Failures.FirstOrDefault()}"); + } + + // ---- The judge against simulated devices ---- + // A faithful device answers the fixture's own result bits and, for a reference family, C#'s snoise or + // fBm at the recorded points. A test alters what one family or one route answers. + + private sealed record Simulated(string Root, string Work, string Results, string Bounds) : IDisposable + { + public void Dispose() => Directory.Delete(Root, true); + } + + private static Simulated Simulate(Func? alter = null) + { + var root = Path.Combine(Path.GetTempPath(), "cultmath-device-" + Guid.NewGuid().ToString("N")); + var work = Path.Combine(root, "work"); + var items = WriteWork(work); + var fixture = FixtureFamilies(); + foreach (var route in DeviceRoutes) + { + Directory.CreateDirectory(Path.Combine(root, "results", route)); + foreach (var item in items) + { + uint[] words; + if (item.Index.StartsWith("ref:")) + { + var points = ReadWords(Path.Combine(work, item.Tag + ".in")); + words = new uint[item.N * item.WordsOut]; + for (var k = 0; k < item.N; k++) + { + var at = k * item.WordsIn; + var p = new float3(BitConverter.UInt32BitsToSingle(points[at]), BitConverter.UInt32BitsToSingle(points[at + 1]), BitConverter.UInt32BitsToSingle(points[at + 2])); + var tokens = new string[10]; + if (item.WordsIn == 6) + for (var t = 0; t < 3; t++) + tokens[7 + t] = points[at + 3 + t].ToString("x8"); + words[k * item.WordsOut + item.WordsOut - 1] = BitConverter.SingleToUInt32Bits(item.WordsIn == 6 ? FbmReference(tokens, p) : SnoiseReference(tokens, p)); + } + } + else + words = fixture[int.Parse(item.Index)]!["cases"]!.AsArray().SelectMany(c => DevWords(Sides(c)[1])).ToArray(); + + WriteWords(Path.Combine(root, "results", route, item.Tag + ".out"), alter?.Invoke(route, item, words) ?? words); + } + } + + return new Simulated(root, work, Path.Combine(root, "results"), Path.Combine(root, "bounds.txt")); + } + + private static Judgement Record(Simulated device) => JudgeDevice(device.Work, device.Results, "test renderer", "test identity", device.Bounds, true); + + private static Judgement Judge(Simulated device, Simulated recordedOn, string renderer = "test renderer", string identity = "test identity") => + JudgeDevice(device.Work, device.Results, renderer, identity, recordedOn.Bounds, false); + + // Every case's first result word, altered. + private static uint[] Alter(WorkItem item, uint[] words, Func change, int cases = int.MaxValue) + { + var altered = (uint[])words.Clone(); + for (var c = 0; c < Math.Min(item.N, cases); c++) + altered[c * item.WordsOut] = change(altered[c * item.WordsOut]); + return altered; + } + + // A family judged by its recorded bound alone: not exact, not checked, not a sampled form, a float first word. + private static int BoundFamily() => + Array.FindIndex(Families, f => f.Tolerance == "ulp-bounded" && f.Verify is null && FloatWords(Resolve(f.Glsl).ReturnType).First()); + + [Fact] + public void AFaithfulDeviceHoldsEveryFamilyOnBothRoutes() + { + using var device = Simulate(); + var recorded = Record(device); + Assert.Empty(recorded.Failures); + Assert.Equal(DeviceRoutes.Length * Families.Length, recorded.Rows.Count); + Assert.All(recorded.Rows, m => Assert.Equal(0.0, m.Row.Worst)); + Assert.Equal(DeviceRoutes.Length * Families.Count(IsSampledForm), recorded.Rows.Count(m => m.Class == "sampled")); + Assert.Equal(DeviceRoutes.Length * Families.Count(f => f.Tolerance == "exact"), recorded.Rows.Count(m => m.Class == "exact")); + Assert.Empty(Judge(device, device).Failures); + } + + [Fact] + public void AnExactFamilyAllowsNoDifferenceAtAll() + { + // Bounds recorded on the very device that is off by one ulp: a bound would pass it, the exact rule must not. + var exact = Array.FindIndex(Families, f => f.Tolerance == "exact"); + using var off = Simulate((route, item, words) => route == "lavapipe-glsl" && item.Index == exact.ToString() ? Alter(item, words, w => w ^ 1u) : words); + Record(off); + var failures = Judge(off, off).Failures; + Assert.Single(failures); + Assert.Contains($"lavapipe-glsl #{exact} ", failures[0]); + + // One case in 256 is enough. + using var oneCase = Simulate((_, item, words) => item.Index == exact.ToString() ? Alter(item, words, w => w ^ 1u, 1) : words); + Record(oneCase); + Assert.Equal(DeviceRoutes.Length, Judge(oneCase, oneCase).Failures.Count); + } + + [Fact] + public void AFamilyIsHeldToItsRecordedWorstAndNotBeyond() + { + var f = BoundFamily(); + using var near = Simulate((_, item, words) => item.Index == f.ToString() ? Alter(item, words, w => w ^ 4u) : words); + Record(near); + Assert.Empty(Judge(near, near).Failures); + using var farther = Simulate((_, item, words) => item.Index == f.ToString() ? Alter(item, words, w => w ^ 7u) : words); + var failures = Judge(farther, near).Failures; + Assert.Equal(DeviceRoutes.Length, failures.Count); + Assert.All(failures, line => Assert.Contains($"#{f} ", line)); + + var lines = File.ReadAllLines(near.Bounds).ToList(); + var at = lines.FindIndex(l => l.StartsWith($"lavapipe-hlsl\t{f}\t")); + var row = lines[at].Split('\t'); + Assert.NotEqual(0.0, double.Parse(row[5], CultureInfo.InvariantCulture)); + row[5] = "0"; + lines[at] = string.Join('\t', row); + File.WriteAllLines(near.Bounds, lines); + Assert.Single(Judge(near, near).Failures); + + lines.RemoveAt(at); + File.WriteAllLines(near.Bounds, lines); + var missing = Judge(near, near).Failures; + Assert.Single(missing); + Assert.Contains("no recorded row", missing[0]); + } + + [Fact] + public void ABoundMeasuresTheErrorAgainstTheFixturesMagnitude() + { + // The metric divides by max(|fixture|, 1): a result of twice a fixture value of at least 2 is 2^23 away, + // and of twice a fixture value under 1 is |fixture| 2^23 away. + var fixture = FixtureFamilies(); + float Fixture(int family, int c) => BitConverter.UInt32BitsToSingle(DevWords(Sides(fixture[family]!["cases"]![c])[1])[0]); + int Find(int family, Func wanted) => Enumerable.Range(0, Points).FirstOrDefault(c => wanted(Math.Abs(Fixture(family, c))), -1); + bool Large(float v) => v is >= 2.0f and < 1e30f; + bool Small(float v) => v is > 1e-3f and < 1.0f; + var f = Enumerable.Range(0, Families.Length).First(g => Families[g].Tolerance == "ulp-bounded" && Families[g].Verify is null + && FloatWords(Resolve(Families[g].Glsl).ReturnType).First() && Find(g, Large) >= 0 && Find(g, Small) >= 0); + var large = Find(f, Large); + var small = Find(f, Small); + foreach (var (c, expected) in new[] { (large, Math.ScaleB(1.0, 23)), (small, Math.Abs((double)Fixture(f, small)) * Math.ScaleB(1.0, 23)) }) + { + using var device = Simulate((_, item, words) => + { + if (item.Index != f.ToString()) + return words; + var doubled = (uint[])words.Clone(); + doubled[c * item.WordsOut] = BitConverter.SingleToUInt32Bits(2.0f * BitConverter.UInt32BitsToSingle(words[c * item.WordsOut])); + return doubled; + }); + Assert.Equal(expected, Record(device).Rows.First(m => m.Row.Route == "lavapipe-hlsl" && m.Row.Index == f).Row.Worst); + } + } + + [Fact] + public void ANaNWhereTheFixtureHasANumberFailsAFamilyRecordedWithout() + { + var f = BoundFamily(); + using var faithful = Simulate(); + Record(faithful); + using var nan = Simulate((_, item, words) => item.Index == f.ToString() ? Alter(item, words, _ => 0x7fc00000u) : words); + var failures = Judge(nan, faithful).Failures; + Assert.Equal(DeviceRoutes.Length, failures.Count); + Assert.All(failures, line => Assert.Contains("NaN-class", line)); + } + + [Fact] + public void AMissingOutputFailsOnlyItsFamily() + { + using var device = Simulate(); + Record(device); + File.Delete(Path.Combine(device.Results, "lavapipe-hlsl", Tag(3) + ".out")); + var failures = Judge(device, device).Failures; + Assert.Single(failures); + Assert.Contains("missing", failures[0]); + Assert.Contains("lavapipe-hlsl #3 ", failures[0]); + } + + [Fact] + public void ADeviceOrToolchainOtherThanTheRecordedOneIsRefusedBeforeJudging() + { + using var device = Simulate(); + Record(device); + foreach (var (renderer, identity) in new[] { ("another renderer", "test identity"), ("test renderer", "another toolchain") }) + { + var judgement = Judge(device, device, renderer, identity); + Assert.Single(judgement.Failures); + Assert.Empty(judgement.Rows); + } + } + + [Theory] + [InlineData("cultmath_af_snoise(")] + [InlineData("cultmath_af_fbm(")] + public void ASampledFormIsJudgedOnTheDevicesOwnReferenceAtTheRecordedPoints(string function) + { + var sampled = Array.FindIndex(Families, f => IsSampledForm(f) && f.Glsl.Contains(function)); + using var faithful = Simulate(); + Record(faithful); + + // A reference that answers wrongly puts the form's enclosure out of reach. + using var wrong = Simulate((_, item, words) => item.Index == "ref:" + sampled + ? words.Select(w => BitConverter.SingleToUInt32Bits(BitConverter.UInt32BitsToSingle(w) + 100.0f)).ToArray() : words); + var failures = Judge(wrong, faithful).Failures; + Assert.Equal(DeviceRoutes.Length, failures.Count); + Assert.All(failures, line => Assert.Contains($"#{sampled} ", line)); + + // Two points in the other order: the device's i-th answer is not for the point the check asks about. + using var swapped = Simulate(); + var path = Path.Combine(swapped.Work, RefTag(sampled) + ".in"); + var stride = function.Contains("fbm") ? 6 : 3; + var points = ReadWords(path); + (points[0], points[stride]) = (points[stride], points[0]); + WriteWords(path, points); + var order = Judge(swapped, faithful).Failures; + Assert.Equal(DeviceRoutes.Length, order.Count); + Assert.All(order, line => Assert.Contains("not the point the device was given", line)); + } + + [Fact] + public void AnInfinityWhereTheFixtureHasAnotherValueIsAMismatchOfClass() + { + var fixture = FixtureFamilies(); + int f = -1, c = 0, w = 0; + for (var g = 0; g < Families.Length && f < 0; g++) + { + if (Families[g].Tolerance == "exact" || Families[g].Verify is not null) + continue; + var floatWord = FloatWords(Resolve(Families[g].Glsl).ReturnType).ToArray(); + for (var k = 0; k < Points && f < 0; k++) + { + var want = DevWords(Sides(fixture[g]!["cases"]![k])[1]); + for (var at = 0; at < want.Length && f < 0; at++) + if (floatWord[at] && float.IsInfinity(BitConverter.UInt32BitsToSingle(want[at]))) + (f, c, w) = (g, k, at); + } + } + + Assert.True(f >= 0, "no fixture family holds an infinite result"); + using var faithful = Simulate(); + Record(faithful); + using var finite = Simulate((_, item, words) => + { + if (item.Index != f.ToString()) + return words; + var altered = (uint[])words.Clone(); + altered[c * item.WordsOut + w] = BitConverter.SingleToUInt32Bits(1.0f); + return altered; + }); + var failures = Judge(finite, faithful).Failures; + Assert.Equal(DeviceRoutes.Length, failures.Count); + Assert.All(failures, line => Assert.Contains("NaN-class", line)); + } + + [Fact] + public void ARecordedRowForAnotherFamilyIsRefused() + { + using var device = Simulate(); + Record(device); + var lines = File.ReadAllLines(device.Bounds).ToList(); + var at = lines.FindIndex(l => l.StartsWith("lavapipe-glsl 5 ")); + var row = lines[at].Split(' '); + row[2] = "float cultmath_other(float)"; + lines[at] = string.Join(' ', row); + File.WriteAllLines(device.Bounds, lines); + var failures = Judge(device, device).Failures; + Assert.Single(failures); + Assert.Contains("another family", failures[0]); + } + + [Fact] + public void ACheckFamilyIsJudgedByItsVerify() + { + var f = Array.FindIndex(Families, fam => fam.Verify is not null && !IsSampledForm(fam)); + using var faithful = Simulate(); + Record(faithful); + using var broken = Simulate((_, item, words) => item.Index == f.ToString() ? words.Select(_ => 0x7fc00000u).ToArray() : words); + var failures = Judge(broken, faithful).Failures; + Assert.Equal(DeviceRoutes.Length, failures.Count); + Assert.All(failures, line => Assert.Contains($"#{f} ", line)); + } + + [Fact] + public void AChangeInResultBitsFailsEvenWithinTheRecordedBound() + { + // Recorded on a device off in every case; judged on one off in a single case. The bound holds, the bits do not. + var f = BoundFamily(); + using var recorded = Simulate((_, item, words) => item.Index == f.ToString() ? Alter(item, words, w => w ^ 4u) : words); + Record(recorded); + using var fewer = Simulate((_, item, words) => item.Index == f.ToString() ? Alter(item, words, w => w ^ 4u, 1) : words); + var failures = Judge(fewer, recorded).Failures; + Assert.Equal(DeviceRoutes.Length, failures.Count); + Assert.All(failures, line => { Assert.Contains($"#{f} ", line); Assert.Contains("result bits differ", line); }); + } + + [Fact] + public void AFamilyIsHeldToTheDeviceToleranceItsOwnTextStates() + { + // Recorded on the very device that violates it: only the stated tolerance can fail the family. + var f = Array.FindIndex(Families, fam => StatedDeviceLimit(fam.Tolerance) is not null); + Assert.True(f >= 0, "no family states a device tolerance"); + using var far = Simulate((_, item, words) => item.Index == f.ToString() ? Alter(item, words, w => w ^ 0x00100000u) : words); + Record(far); + var failures = Judge(far, far).Failures; + Assert.Equal(DeviceRoutes.Length, failures.Count); + Assert.All(failures, line => Assert.Contains("stated tolerance", line)); + } + + [Theory] + [InlineData(24, true)] + [InlineData(40, false)] + public void TheStatedDeviceToleranceIsTheLimitInUlpsOfTheFixturesMagnitude(int ulps, bool holds) + { + // 2^-18 max(|v|, 1) is 32 u1. A fixture value in [1, 1.1) moved by k ulps is k/|v| u1 away, 0.91 k to k. + var f = Array.FindIndex(Families, fam => StatedDeviceLimit(fam.Tolerance) is not null); + Assert.Equal(32.0, StatedDeviceLimit(Families[f].Tolerance)); + var fixture = FixtureFamilies()[f]!["cases"]!.AsArray(); + var floatWord = FloatWords(Resolve(Families[f].Glsl).ReturnType).ToArray(); + var at = -1; + for (var c = 0; c < fixture.Count && at < 0; c++) + { + var want = DevWords(Sides(fixture[c])[1]); + for (var w = 0; w < want.Length && at < 0; w++) + if (floatWord[w] && Math.Abs(BitConverter.UInt32BitsToSingle(want[w])) is >= 1.0f and < 1.1f) + at = c * want.Length + w; + } + + Assert.True(at >= 0, "no fixture value of the family lies in [1, 1.1)"); + using var device = Simulate((_, item, words) => + { + if (item.Index != f.ToString()) + return words; + var moved = (uint[])words.Clone(); + moved[at] += (uint)ulps; // magnitude grows by k ulps whatever the sign + return moved; + }); + Record(device); + var failures = Judge(device, device).Failures; + Assert.Equal(holds ? 0 : DeviceRoutes.Length, failures.Count); + } + + [Fact] + public void AChangeInTheReferenceBitsOfASampledFormFailsItsFamily() + { + // One ulp in one reference value stays inside the form's enclosure, so only the recorded bits can see it. + var sampled = Array.FindIndex(Families, IsSampledForm); + using var faithful = Simulate(); + Record(faithful); + using var moved = Simulate((_, item, words) => item.Index == "ref:" + sampled ? Alter(item, words, w => w + 1u, 1) : words); + var failures = Judge(moved, faithful).Failures; + Assert.Equal(DeviceRoutes.Length, failures.Count); + Assert.All(failures, line => { Assert.Contains($"#{sampled} ", line); Assert.Contains("result bits differ", line); }); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Mutants.cs b/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Mutants.cs new file mode 100644 index 00000000..c896a6a1 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Mutants.cs @@ -0,0 +1,60 @@ +using System.Reflection; +using System.Text.RegularExpressions; +using Xunit; + +namespace CultMath.Tests; + +public sealed partial class GlslMirrorTests +{ + private const string Weighted = "cultmath_weighted_lattice_cells("; + private const string SmoothStep = "cultmath_lattice_smooth_step("; + + // Edits of the shader text that each break one rule of the lattice loop. M7 (the exit one ring late) is absent: by the + // window-independence proof a later exit visits more cells and changes nothing, so no case can kill it. + private static readonly (string Name, string Function, string Old, string New, int Kills)[] LatticeMutants = + { + ("M1 exit one ring early", Weighted, "0.5 * (float)(k - 1) >= max(f2", "0.5 * (float)k >= max(f2", 3), + ("M2 exit ignores the smoothing band", Weighted, ">= max(f2, f1 + 2.0 * smoothing))", ">= f2)", 1), + ("M3 no pre-normalisation of the normal", Weighted, "normal = stretchNormal / scale;", "normal = stretchNormal;", 1), + ("M4 no unit length for the normal", Weighted, "normal = normal / length(normal);", "normal = normal * 1.0;", 1), + ("M5 smooth step without its clamp", SmoothStep, "return min(next, f1 + smoothing);", "return next;", 1), + ("M6 box pass skips its first row", Weighted, "for (int dz = -reach; dz <= reach; dz++)", "for (int dz = -reach + 1; dz <= reach; dz++)", 1), + }; + + /// + /// Each rule of the lattice loop is pinned by the committed fixture's own cases: the shader text with one rule broken (a + /// mutant mirror, the text a device runs) returns another result than the fixture on at least the stated number of + /// cases of the family that exercises it, the exit one ring early on at least three. The device judge holds the same + /// cases to their recorded bound, so a mutant these cases separate fails it too. + /// + [Fact] + public void TheFixtureCasesSeparateEveryLatticeMutantFromTheShader() + { + var families = FixtureFamilies(); + foreach (var (name, function, old, replacement, kills) in LatticeMutants) + { + var (assembly, errors) = HlslSourceCompatibilityTests.CompileShaderMirror(mutate: text => + { + Assert.True(text.Split(old).Length == 2, $"{name}: the shader text no longer holds exactly one \"{old}\""); + return text.Replace(old, replacement); + }); + Assert.True(assembly is not null, name + ": " + string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var mirror = shaderType.GetMethod(function[..^1], BindingFlags.Instance | BindingFlags.NonPublic)!; + + var f = Array.FindIndex(Families, family => family.Glsl.Contains(function)); + var method = Resolve(Families[f].Glsl); + var killed = 0; + foreach (var entry in families[f]!["cases"]!.AsArray()) + { + var sides = Sides(entry); + if (Hex(new[] { mirror.Invoke(shader, Arguments(method, sides[0]))! }) != sides[1]) + killed++; + } + + output.WriteLine($"{name}: separated on {killed} of {Points} cases of {Families[f].Glsl}"); + Assert.True(killed >= kills, $"{name}: the {Families[f].Glsl} fixture cases separate it on {killed} of {Points}, fewer than {kills}"); + } + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Precision.cs b/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Precision.cs new file mode 100644 index 00000000..dbf7fabf --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.Precision.cs @@ -0,0 +1,57 @@ +using System.Text.RegularExpressions; +using Xunit; + +namespace CultMath.Tests; + +public sealed partial class GlslMirrorTests +{ + // Tripwire: lavapipe and desktop ANGLE ignore mediump and min16float, so a reduced-precision qualifier in the + // committed shaders would change the computation on a phone GPU and nowhere the conforming run can see it. + // Stated limits: a syntax guardrail only. It reads whole words in the committed .glsl and .hlsl under shaders/ + // with comments removed; it does not see a qualifier spelled through a macro, an include or a generated + // shader, and it says nothing about a driver that relaxes highp itself. It names file and line, never text. + // Recorded limit (s2.tripwire-slashslash-star-hides): block comments are cut before line comments, so a qualifier between `// x /*` and `// */` passes. + private static readonly Regex ReducedPrecision = new( + @"\b(mediump|lowp|min(10|12|16)(float|int|uint)[1-4]?(x[1-4])?|half[1-4]?(x[1-4])?)\b|\bprecision\s+(?!highp\b)\w+", RegexOptions.Compiled); + + private static IEnumerable ReducedPrecisionLines(string source) + { + var text = Regex.Replace(source, @"/\*.*?\*/", m => new string('\n', m.Value.Count(c => c == '\n')), RegexOptions.Singleline); + var lines = text.Split('\n'); + for (var i = 0; i < lines.Length; i++) + { + var code = lines[i].Split("//")[0]; + if (ReducedPrecision.IsMatch(code)) + yield return i + 1; + } + } + + [Fact] + public void CommittedShadersCarryNoReducedPrecisionQualifier() + { + var found = new List(); + foreach (var file in Directory.EnumerateFiles(Path.Combine(Root, "shaders")).Where(f => f.EndsWith(".glsl") || f.EndsWith(".hlsl")).OrderBy(f => f, StringComparer.Ordinal)) + found.AddRange(ReducedPrecisionLines(File.ReadAllText(file)).Select(line => $"{Path.GetFileName(file)}:{line}")); + Assert.True(found.Count == 0, "reduced-precision qualifier at " + string.Join(", ", found)); + } + + [Theory] + [InlineData("mediump float x;", true)] + [InlineData("lowp vec3 c;", true)] + [InlineData("precision mediump float;", true)] + [InlineData("precision highp float;", false)] + [InlineData("min16float x;", true)] + [InlineData("min10float2 x;", true)] + [InlineData("min16int i;", true)] + [InlineData("half3x3 m;", true)] + [InlineData("float half_width;", false)] + [InlineData("float x; // mediump is not used", false)] + [InlineData("/* half\n min16float */ float x;", false)] + public void TheTripwireReadsQualifiersAndNotComments(string source, bool trips) => Assert.Equal(trips, ReducedPrecisionLines(source).Any()); + + [Fact] + public void TheTripwireNamesTheLine() + { + Assert.Equal(new[] { 3 }, ReducedPrecisionLines("float a;\n/* c */\nmediump float b;\n").ToArray()); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.cs b/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.cs new file mode 100644 index 00000000..c2b604f6 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/GlslMirrorTests.cs @@ -0,0 +1,1079 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json.Nodes; +using System.Text.RegularExpressions; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +/// +/// shaders/CultMath.glsl and shaders/CultMath.Phacelle.glsl are derived: each is exactly its +/// output from the committed HLSL, no HLSL-only token survives the +/// lowering, no public function is dropped except the texture samplers, the MPL-2.0 Phacelle code lives +/// only in its own file, and the golden fixture a WebGL2 consumer evaluates is C#'s current output. With +/// CULTMATH_WRITE_GLSL=1 set, the first and last tests write the committed files before comparing, which +/// is the one regeneration path. +/// +public sealed partial class GlslMirrorTests +{ + private readonly ITestOutputHelper output; + + public GlslMirrorTests(ITestOutputHelper output) => this.output = output; + + // The fixture is written by Yggdrasil's mcr.microsoft.com/dotnet/sdk:10.0 image (Ubuntu 24.04) only: its platform families record + // that platform's libm, so a write from another OS would move them. + private static bool Write => Environment.GetEnvironmentVariable("CULTMATH_WRITE_GLSL") == "1" + ? OperatingSystem.IsLinux() ? true : throw new InvalidOperationException("CULTMATH_WRITE_GLSL=1 writes glsl-parity.json, whose platform families belong to Yggdrasil's Ubuntu image (mcr.microsoft.com/dotnet/sdk:10.0): regenerate it there.") + : false; + + private static string Root => HlslSourceCompatibilityTests.FindCultMathRoot(); + + private static string FixturePath => Path.Combine(Root, "tests", "CultMath.Tests", "fixtures", "glsl-parity.json"); + + private static string Hlsl => HlslSourceCompatibilityTests.ReadShaderSource(Root).ReplaceLineEndings("\n"); + + private static IReadOnlyList<(string File, string Text)> Lowered => GlslLowering.Lower(Root); + + [Fact] + public void CommittedGlslEqualsLowering() + { + foreach (var (file, expected) in Lowered) + { + var path = Path.Combine(Root, "shaders", file); + if (Write) + File.WriteAllText(path, expected); + var committed = File.ReadAllText(path).ReplaceLineEndings("\n"); + Assert.True(committed == expected, $"shaders/{file} is not the lowering of the committed HLSL (regenerate with CULTMATH_WRITE_GLSL=1):\n" + UnifiedDiff(committed, expected)); + } + } + + // Counting stand-ins for the mirror's clamp, one per overload, declared in the mirror's class so they + // hide math.clamp for every function in it. Each counts a call whose minimum exceeds its maximum in any + // component and forwards to math.clamp. (The int vector overloads only forward: no mirror function + // clamps integer vectors with swapped bounds, and counting them would be unreachable.) + private const string CountingClampShadows = @" +public static int ClampMinAboveMax; +static float clamp(float x, float a, float b) { if (a > b) ClampMinAboveMax++; return math.clamp(x, a, b); } +static float2 clamp(float2 x, float2 a, float2 b) { if (a.x > b.x || a.y > b.y) ClampMinAboveMax++; return math.clamp(x, a, b); } +static float3 clamp(float3 x, float3 a, float3 b) { if (a.x > b.x || a.y > b.y || a.z > b.z) ClampMinAboveMax++; return math.clamp(x, a, b); } +static float4 clamp(float4 x, float4 a, float4 b) { if (a.x > b.x || a.y > b.y || a.z > b.z || a.w > b.w) ClampMinAboveMax++; return math.clamp(x, a, b); } +static int clamp(int x, int a, int b) { if (a > b) ClampMinAboveMax++; return math.clamp(x, a, b); } +static int2 clamp(int2 x, int2 a, int2 b) { if (a.x > b.x || a.y > b.y) ClampMinAboveMax++; return math.clamp(x, a, b); } +static int3 clamp(int3 x, int3 a, int3 b) { if (a.x > b.x || a.y > b.y || a.z > b.z) ClampMinAboveMax++; return math.clamp(x, a, b); } +static int4 clamp(int4 x, int4 a, int4 b) { if (a.x > b.x || a.y > b.y || a.z > b.z || a.w > b.w) ClampMinAboveMax++; return math.clamp(x, a, b); } +"; + + /// + /// The lowering keeps HLSL's statement order (CommittedGlslEqualsLowering pins the GLSL as that + /// lowering), and GLSL leaves clamp(x, minVal, maxVal) undefined for minVal above maxVal, so no clamp + /// reached by cultmath_integral_clamp_linear may see lo above hi, on any path and for any spelling of the + /// normalisation. The mirror is compiled with counting clamps and the function is run over the edge grid + /// (lo above hi, infinite bounds, zero-length spans, b = 0 and b != 0): the count of such clamp calls + /// stays 0 after every call. The cases are HlslSourceCompatibilityTests.IntegralClampLinearCases: the grid fixes + /// a in {-2.5, 0, 1.5}, so a normalisation keyed on a past 1.75 never clamps wrongly there; the committed + /// fixture's random cases reach it. + /// + [Fact] + public void IntegralClampLinearNeverClampsWithMinAboveMax() + { + var (assembly, errors) = HlslSourceCompatibilityTests.CompileShaderMirror(CountingClampShadows); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var count = shaderType.GetField("ClampMinAboveMax")!; + var function = shaderType.GetMethod("cultmath_integral_clamp_linear", BindingFlags.Instance | BindingFlags.NonPublic)!; + + var bad = new List(); + foreach (var c in HlslSourceCompatibilityTests.IntegralClampLinearCases) + { + count.SetValue(null, 0); + function.Invoke(shader, c.Cast().ToArray()); + if ((int)count.GetValue(null)! > 0) + bad.Add($"({string.Join(", ", c)})"); + } + + Assert.True(bad.Count == 0, $"{bad.Count} cases clamp with the minimum above the maximum:{Environment.NewLine}{string.Join(Environment.NewLine, bad.Take(12))}"); + } + + // Identifier boundaries: cultmath_lerp is a CultMath function, lerp( is HLSL. + private static readonly Regex HlslOnly = new( + @"\b(float|u?int|bool)[234]\b|\bfloat3x3\b|\blerp\(|\bfrac\(|\bsaturate\(|\brsqrt\(|\basuint\(|\basfloat\(|\batan2\(|static const|\((float|int|uint)\)|Texture2D|SamplerState|#include|precision (high|medium|low)p"); + + [Fact] + public void NoHlslOnlyTokensSurvive() + { + foreach (var (file, text) in Lowered) + { + var survivors = HlslOnly.Matches(text).Select(m => m.Value).Distinct().ToArray(); + Assert.True(survivors.Length == 0, $"HLSL-only tokens in {file}: " + string.Join(", ", survivors)); + } + } + + private static readonly Regex Definition = new(@"(?m)^\w+\s+(cultmath_\w+)\s*\(([^)]*)\)"); + + // A definition's signature, its name and parameter types, so an overload counts on its own: + // "cultmath_pcg3d(vec2)". HLSL type names are mapped by the lowering's own step 3. + private static string Signature(Match definition) => + definition.Groups[1].Value + "(" + string.Join(", ", definition.Groups[2].Value + .Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries) + .Select(parameter => GlslLowering.LowerTypeNames(string.Join(' ', Regex.Split(parameter, @"\s+")[..^1])))) + ")"; + + [Fact] + public void EveryPublicFunctionIsLowered() + { + var lowered = Lowered; + var hlsl = Definition.Matches(Hlsl).Where(m => !Regex.IsMatch(m.Groups[2].Value, @"\b(Texture2D|SamplerState)\b")) + .Select(Signature).ToHashSet(); + var glsl = lowered.SelectMany(output => Definition.Matches(output.Text)).Select(Signature).ToHashSet(); + Assert.Contains("cultmath_pcg3d(vec2)", glsl); + Assert.True(hlsl.SetEquals(glsl), "HLSL only: " + string.Join(", ", hlsl.Except(glsl)) + "; GLSL only: " + string.Join(", ", glsl.Except(hlsl))); + + // The MPL-2.0 code is in its own file and nowhere in the MIT library. + var library = lowered.Single(output => output.File == "CultMath.glsl").Text; + var phacelle = lowered.Single(output => output.File == "CultMath.Phacelle.glsl").Text; + foreach (var token in new[] { "cultmath_phacelle(", "CultPhasor" }) + { + Assert.DoesNotContain(token, library); + Assert.Contains(token, phacelle); + } + + // The Apache-2.0 code is in its own file too, and the MPL-2.0 file holds none of it. + var cycles = lowered.Single(output => output.File == "CultMath.Cycles.glsl").Text; + Assert.DoesNotContain("cultmath_cycles_divide(", library); + Assert.DoesNotContain("cultmath_cycles_divide(", phacelle); + Assert.Contains("float cultmath_cycles_divide(", cycles); + } + + // The two-file contract a consumer relies on when it concatenates CultMath.Phacelle.glsl after + // CultMath.glsl: distinct guards (a shared one would hide the second file's body), each provenance + // line naming its file's licence, and the MIT file pointing at the one that holds cultmath_phacelle. + [Fact] + public void TwoFileHeaderContract() + { + var lowered = Lowered; + var guards = lowered.Select(output => Regex.Match(output.Text, @"^[^\n]*\n#ifndef (\w+)\n#define \1\n").Groups[1].Value).ToArray(); + Assert.All(guards, guard => Assert.NotEqual(string.Empty, guard)); + Assert.Equal(guards.Length, guards.Distinct().Count()); + + var library = lowered.Single(output => output.File == "CultMath.glsl").Text.Split('\n')[0]; + var phacelle = lowered.Single(output => output.File == "CultMath.Phacelle.glsl").Text.Split('\n')[0]; + Assert.Contains(" MIT.", library); + Assert.DoesNotContain("MPL", library); + Assert.Contains("cultmath_phacelle is in CultMath.Phacelle.glsl", library); + Assert.Contains(" MPL-2.0;", phacelle); + Assert.DoesNotContain("MIT", phacelle); + + var cycles = lowered.Single(output => output.File == "CultMath.Cycles.glsl").Text.Split('\n')[0]; + Assert.Contains("cultmath_cycles_ramp_index is in CultMath.Cycles.glsl", library); + Assert.Contains(" Apache-2.0;", cycles); + Assert.DoesNotContain("MIT", cycles); + Assert.DoesNotContain("MPL", cycles); + } + + [Fact] + public void GoldenFixtureMatchesCSharp() + { + // Arguments are drawn only here, when regenerating: Interval draws widths through MathF.Pow, whose + // bits differ by OS. Checking evaluates C# on the committed fixture's own arguments. + if (Write) + { + var random = new System.Random(Seed); + Directory.CreateDirectory(Path.GetDirectoryName(FixturePath)!); + File.WriteAllText(FixturePath, GoldenFixture((f, _) => Families[f].Arguments(random))); + } + + var committed = JsonNode.Parse(File.ReadAllText(FixturePath))!.AsObject(); + var committedFamilies = committed["functions"]!.AsArray(); + Assert.Equal(Families.Length, committedFamilies.Count); + for (var f = 0; f < Families.Length; f++) + Assert.True(committedFamilies[f]!["cases"]!.AsArray().Count == Points, $"{Families[f].Glsl}: the fixture does not hold {Points} cases"); + var current = JsonNode.Parse(GoldenFixture((f, p) => + Arguments(Resolve(Families[f].Glsl), ((string)committedFamilies[f]!["cases"]![p]!).Split(" -> ")[0])))!.AsObject(); + var currentFamilies = current["functions"]!.AsArray(); + + // Family by family: every family is compared as text, except those whose C# bits come from the + // platform's libm, which are compared case by case within their family's platform bound. A family + // with a check must also pass it on C#'s own results, so the rule the WebGL2 consumer applies holds + // for the reference. + for (var f = 0; f < Families.Length; f++) + { + var want = currentFamilies[f]!.AsObject(); + var have = committedFamilies[f]!.AsObject(); + var name = (string)want["glsl"]!; + Assert.Equal(name, (string?)have["glsl"]); + Assert.Equal((string)want["tolerance"]!, (string?)have["tolerance"]); + Assert.Equal((string?)want["check"], (string?)have["check"]); + switch (Families[f].Platform) + { + case Platform.Ulp: + var ulps = MaxDistance(have["cases"]!.AsArray(), want["cases"]!.AsArray(), (x, y) => Math.Abs((long)Ordered(x) - Ordered(y))); + output.WriteLine($"{name}: within {ulps} ulp of this platform's libm ({RuntimeInformation.OSDescription}); fixture generated on {have["platform"]}"); + Assert.True(ulps <= 1, $"{name}: {ulps} ulp from this platform's result, more than 1"); + break; + case Platform.Scaled: + var scaled = MaxDistance(have["cases"]!.AsArray(), want["cases"]!.AsArray(), (x, y) => + { + double v = BitConverter.Int32BitsToSingle(x), w = BitConverter.Int32BitsToSingle(y); + return x == y ? 0.0 : Math.Abs(v - w) / Math.Max(Math.Abs(v), 1.0); + }); + output.WriteLine($"{name}: |diff| / max(|v|, 1) at most {scaled:R} from this platform's libm ({RuntimeInformation.OSDescription}); fixture generated on {have["platform"]}"); + Assert.True(scaled <= ScaledPlatformBound, $"{name}: {scaled:R} max(|v|, 1) from this platform's result, more than 2^-20"); + break; + default: + Assert.True(JsonNode.DeepEquals(want, have), $"fixtures/glsl-parity.json family {name} is not C#'s current output (regenerate with CULTMATH_WRITE_GLSL=1)"); + break; + } + + if (want["check"] is not null) + output.WriteLine($"{name}: {Families[f].Verify!(want["cases"]!.AsArray())}"); + } + + committed.Remove("functions"); + current.Remove("functions"); + Assert.True(JsonNode.DeepEquals(current, committed), "fixtures/glsl-parity.json header is not the generator's (regenerate with CULTMATH_WRITE_GLSL=1)"); + } + + // The largest distance, component by component, between two families' results (committed first). + private static double MaxDistance(JsonArray committed, JsonArray current, Func distance) + { + var max = 0.0; + for (var c = 0; c < current.Count; c++) + { + var haveBits = ((string)committed[c]!).Split(" -> ")[1].Split(' ').Select(h => (int)Convert.ToUInt32(h, 16)).ToArray(); + var wantBits = ((string)current[c]!).Split(" -> ")[1].Split(' ').Select(h => (int)Convert.ToUInt32(h, 16)).ToArray(); + Assert.Equal(wantBits.Length, haveBits.Length); + max = Math.Max(max, haveBits.Zip(wantBits, distance).Max()); + } + + return max; + } + + // FrustumBall applied to C#'s own results: every case's ball encloses the exact one and is no wider + // than its rounding widening allows. + private static string AssertFrustumBall(JsonArray cases) + { + double low = double.PositiveInfinity, high = double.PositiveInfinity; + foreach (var entry in cases) + { + var sides = ((string)entry!).Split(" -> "); + var a = Floats(sides[0]); + var b = Floats(sides[1]); + double mx = a[0], my = a[1], z0 = a[2], z1 = a[3], footprint = a[4], warp = a[5]; + var zm = (z0 + z1) / 2.0; + var radius = (z1 - z0) / 2.0 * Math.Sqrt(mx * mx + my * my + 1.0) + z1 * footprint + warp; + double dx = b[0] - mx * zm, dy = b[1] - my * zm, dz = b[2] - zm; + var reach = radius + Math.Sqrt(dx * dx + dy * dy + dz * dz); + var c1 = Math.Abs(mx * zm) + Math.Abs(my * zm) + Math.Abs(zm); + Assert.True(b[3] >= reach, $"iv_frustum_ball case {entry}: radius short of the exact ball by {reach - b[3]}"); + Assert.True(b[3] <= reach + Math.ScaleB(radius + c1, -19), $"iv_frustum_ball case {entry}: radius past the exact ball by {b[3] - reach}, more than 2^-19 (r + |c|_1)"); + low = Math.Min(low, (b[3] - reach) / radius); + high = Math.Min(high, (reach + Math.ScaleB(radius + c1, -19) - b[3]) / Math.ScaleB(radius + c1, -19)); + } + return $"least slack: {low:E3} of r above the exact ball, {high:F3} of 2^-19 (r + |c|_1) below its widening"; + } + + private static readonly double[] CheckEps = { -1.0, -0.5, 0.0, 0.5, 1.0 }; + + // The origin, the six axis directions and the eight cube corners, normalised. + private static readonly (double X, double Y, double Z)[] CheckDirections = CheckDirectionList().ToArray(); + + private static IEnumerable<(double X, double Y, double Z)> CheckDirectionList() + { + yield return (0.0, 0.0, 0.0); + foreach (var s in new[] { -1.0, 1.0 }) + { + yield return (s, 0.0, 0.0); + yield return (0.0, s, 0.0); + yield return (0.0, 0.0, s); + } + + var corner = 1.0 / Math.Sqrt(3.0); + foreach (var sx in new[] { -corner, corner }) + foreach (var sy in new[] { -corner, corner }) + foreach (var sz in new[] { -corner, corner }) + yield return (sx, sy, sz); + } + + // SampledForm applied to C#'s own results, with C#'s own snoise or fBm as the reference value. A form + // must enclose its reference at every sample, and be no wider than the Lipschitz form's allowance. + // allowance is the part of e that is the float32 allowance; a family that allowanceDecides must have a + // sample that falls outside the form once it is removed, so the family can tell a device whose error + // passes the allowance from one that does not. + private static string AssertSampledForm(JsonArray cases, string name, Func reference, Func widthBound, + Func allowance, bool allowanceDecides) + { + double least = double.PositiveInfinity, leastRelative = double.PositiveInfinity, tightest = double.PositiveInfinity; + var decided = 0; + foreach (var entry in cases) + { + var sides = ((string)entry!).Split(" -> "); + var tokens = sides[0].Split(' '); + double[] a = Floats(string.Join(' ', tokens.Take(7))), form = Floats(sides[1]); + double x0 = form[0], slope = form[1], e = form[2]; + var withoutAllowance = e - allowance(tokens, a); + var allowanceNeeded = false; + foreach (var eps in CheckEps) + foreach (var d in CheckDirections) + { + var p = new float3((float)(a[0] + a[3] * eps + a[6] * d.X), (float)(a[1] + a[4] * eps + a[6] * d.Y), (float)(a[2] + a[5] * eps + a[6] * d.Z)); + double value = reference(tokens, p), middle = x0 + slope * eps; + var inside = Math.Min(value - (middle - e), middle + e - value); + Assert.True(inside >= 0.0, $"{name} case {entry}: the reference {value:R} at eps {eps} and direction {d} is outside the form's range [{middle - e:R}, {middle + e:R}] by {-inside:R}"); + least = Math.Min(least, inside); + leastRelative = Math.Min(leastRelative, inside / e); + allowanceNeeded |= Math.Abs(value - middle) > withoutAllowance; + } + + if (allowanceNeeded) + decided++; + + var bound = widthBound(tokens, a); + Assert.True(Math.Abs(slope) + e <= bound + Math.ScaleB(1.0 + bound, -16), $"{name} case {entry}: the width {Math.Abs(slope) + e:R} is past B + 2^-16 (1 + B) = {bound + Math.ScaleB(1.0 + bound, -16):R}"); + tightest = Math.Min(tightest, (bound + Math.ScaleB(1.0 + bound, -16) - Math.Abs(slope) - e) / bound); + } + + Assert.True(!allowanceDecides || decided > 0, $"{name}: no sample falls outside the form once the float32 allowance is removed, so the family cannot fail a device whose error passes it"); + return $"least enclosure slack {least:E3} ({leastRelative:E3} of e), least tightness slack {tightest:E3} of B, {decided} of {cases.Count} cases need the allowance"; + } + + // The float32 allowance of one octave of af_snoise: 2^-14 + 2^-12 R + L 2^-20 (|c|_1 + R). + private static double SnoiseAllowance(double centre1, double reach) => + math.SNOISE_READ_VALUE + math.SNOISE_READ_GRADIENT * reach + math.SNOISE_LIPSCHITZ * Math.ScaleB(centre1 + reach, -20); + + // The Lipschitz form's width bound for one octave of the sampled-form check. + private static double SnoiseWidthBound(double centre1, double reach) => math.SNOISE_LIPSCHITZ * reach + SnoiseAllowance(centre1, reach); + + private static double Length3(double[] a, int first) => Math.Sqrt(a[first] * a[first] + a[first + 1] * a[first + 1] + a[first + 2] * a[first + 2]); + + private static double SnoiseOctave(Func octave, double[] a, double frequency) => + octave((Math.Abs(a[0]) + Math.Abs(a[1]) + Math.Abs(a[2])) * frequency, (Length3(a, 3) + a[6]) * frequency); + + // The amplitude-weighted sum of a per-octave quantity over the fBm's octaves. + private static double FbmOctaves(string[] t, double[] a, Func octave) + { + var (octaves, lacunarity, gain) = ((int)Convert.ToUInt32(t[7], 16), Floats(t[8])[0], Floats(t[9])[0]); + double sum = 0.0, amplitude = 1.0, frequency = 1.0; + for (var i = 0; i < Math.Clamp(octaves, 0, 16); i++) + { + sum += amplitude * SnoiseOctave(octave, a, frequency); + amplitude *= gain; + frequency *= lacunarity; + } + + return sum; + } + + private static float SnoiseReference(string[] tokens, float3 p) => math.snoise(p); + + private static float FbmReference(string[] t, float3 p) => math.fbm_grad(p, (int)Convert.ToUInt32(t[7], 16), (float)Floats(t[8])[0], (float)Floats(t[9])[0]).w; + + private static string AssertSnoiseForm(JsonArray cases, bool allowanceDecides = false, Func? reference = null) => + AssertSampledForm(cases, "af_snoise", reference ?? SnoiseReference, + (_, a) => SnoiseOctave(SnoiseWidthBound, a, 1.0), (_, a) => SnoiseOctave(SnoiseAllowance, a, 1.0), allowanceDecides); + + private static string AssertFbmForm(JsonArray cases, bool allowanceDecides = false, Func? reference = null) => + AssertSampledForm(cases, "af_fbm", + reference ?? FbmReference, + (t, a) => FbmOctaves(t, a, SnoiseWidthBound), (t, a) => FbmOctaves(t, a, SnoiseAllowance), allowanceDecides); + + // AffineFrustumBall applied to C#'s own results. + private static string AssertAffineFrustumBall(JsonArray cases) + { + double enclosure = double.PositiveInfinity, lower = double.PositiveInfinity, upper = double.PositiveInfinity; + var diagonal = new[] { (0.0, 0.0), (1.0, 0.0), (-1.0, 0.0), (0.0, 1.0), (0.0, -1.0), (Math.Sqrt(0.5), Math.Sqrt(0.5)), (Math.Sqrt(0.5), -Math.Sqrt(0.5)), (-Math.Sqrt(0.5), Math.Sqrt(0.5)), (-Math.Sqrt(0.5), -Math.Sqrt(0.5)) }; + foreach (var entry in cases) + { + var sides = ((string)entry!).Split(" -> "); + var a = Floats(sides[0]); + var b = Floats(sides[1]); + double mx = a[0], my = a[1], z0 = a[2], z1 = a[3], fp = a[4], warp = a[5]; + double zm = (z0 + z1) / 2.0, h = (z1 - z0) / 2.0; + var r0 = z1 * fp + warp; + var c1 = Math.Abs(mx * zm) + Math.Abs(my * zm) + Math.Abs(zm); + var spread = (Math.Abs(mx) + Math.Abs(my) + 1.0) * h; + double dx = b[0] - mx * zm, dy = b[1] - my * zm, dz = b[2] - zm; + var d = Math.Sqrt(dx * dx + dy * dy + dz * dz); + foreach (var z in new[] { z0, (3.0 * z0 + z1) / 4.0, zm, (z0 + 3.0 * z1) / 4.0, z1 }) + { + var eps = h > 0.0 ? Math.Clamp((z - zm) / h, -1.0, 1.0) : 0.0; + foreach (var (ex, ey) in diagonal) + { + double px = (mx + fp * ex) * z - (b[0] + mx * h * eps), py = (my + fp * ey) * z - (b[1] + my * h * eps), pz = z - (b[2] + h * eps); + var slack = b[3] - (Math.Sqrt(px * px + py * py + pz * pz) + warp); + Assert.True(slack >= 0.0, $"af_frustum_ball case {entry}: the ray point at depth {z:R} and offset ({ex}, {ey}) is outside the ball by {-slack:R}"); + enclosure = Math.Min(enclosure, slack / b[3]); + } + } + + Assert.True(b[3] >= r0 + d, $"af_frustum_ball case {entry}: radius short of R0 + d by {r0 + d - b[3]}"); + Assert.True(b[3] <= r0 + d + Math.ScaleB(r0 + c1 + spread, -19), $"af_frustum_ball case {entry}: radius past R0 + d by {b[3] - r0 - d}, more than 2^-19 (R0 + |c0|_1 + spread)"); + lower = Math.Min(lower, (b[3] - r0 - d) / r0); + upper = Math.Min(upper, (r0 + d + Math.ScaleB(r0 + c1 + spread, -19) - b[3]) / Math.ScaleB(r0 + c1 + spread, -19)); + } + + return $"least enclosure slack {enclosure:E3} of the radius, least slack above R0 + d {lower:E3} of R0, below its widening {upper:F3} of 2^-19 (R0 + |c0|_1 + spread)"; + } + + private const string SpanAllowanceRead = + "Read at the case's point x, with S = |x|_1 and (e_n, e_g, e_h) = math.span_slack(math.span_rounding(1, x, zero stage, 0, 0, 0)), " + + "against the kernel's exact values in double: |n - n_exact| <= e_n and |g - g_exact|_2 <= e_g for snoise_grad, " + + "||H - H_exact||_F <= e_h for snoise_hessian, no tolerance. " + + "Report the largest fraction of each allowance per decade of S and the largest absolute error at S < 1e-2."; + + // SpanAllowanceRead applied to a family's results (C#'s own, or a device's): every read is within the + // allowance math.span_slack gives at its point, the owner's own numbers and no restated literal. A small + // family (bands 1e-4 to 1e2) must also fail the check once the absolute term is removed in at least 16 + // cases, and hold at least 48 cases with S <= 1e-2: the allowance's absolute term is what decides there. + private static string AssertSpanAllowance(JsonArray cases, bool hessian, bool small) + { + var absolute = math.span_slack(0.0f); + var fractions = new SortedDictionary(); + double smallestError = 0.0; + int absoluteDecides = 0, nearOrigin = 0; + foreach (var entry in cases) + { + var sides = ((string)entry!).Split(" -> "); + double[] x = Floats(sides[0]), result = Floats(sides[1]); + var s = Math.Abs(x[0]) + Math.Abs(x[1]) + Math.Abs(x[2]); + var slack = math.span_slack(math.span_rounding(1.0f, new float3((float)x[0], (float)x[1], (float)x[2]), default, new float3(0.0f, 0.0f, 0.0f), 0.0f, 0.0f)); + double valueError = 0.0, gradientError, valueFraction = 0.0, gradientFraction; + bool needsAbsolute; + if (hessian) + { + var exact = NoiseBoundTests.HessianDouble(x[0], x[1], x[2]); + var sum = 0.0; + for (var i = 0; i < 9; i++) + sum += (result[i] - exact[i]) * (result[i] - exact[i]); + gradientError = Math.Sqrt(sum); + Assert.True(gradientError <= slack.z, $"snoise_hessian case {entry}: ||H - H_exact||_F is {gradientError:R}, past the allowance {slack.z:R}"); + gradientFraction = gradientError / slack.z; + needsAbsolute = gradientError > slack.z - absolute.z; + } + else + { + var exact = NoiseBoundTests.GradDouble(x[0], x[1], x[2]); + valueError = Math.Abs(result[3] - NoiseBoundTests.ValueDouble(x[0], x[1], x[2])); + gradientError = Math.Sqrt((result[0] - exact[0]) * (result[0] - exact[0]) + (result[1] - exact[1]) * (result[1] - exact[1]) + (result[2] - exact[2]) * (result[2] - exact[2])); + Assert.True(valueError <= slack.x, $"snoise_grad case {entry}: |n - n_exact| is {valueError:R}, past the allowance {slack.x:R}"); + Assert.True(gradientError <= slack.y, $"snoise_grad case {entry}: |g - g_exact|_2 is {gradientError:R}, past the allowance {slack.y:R}"); + valueFraction = valueError / slack.x; + gradientFraction = gradientError / slack.y; + needsAbsolute = valueError > slack.x - absolute.x || gradientError > slack.y - absolute.y; + } + + var decade = (int)Math.Floor(Math.Log10(s)); + fractions.TryGetValue(decade, out var largest); + fractions[decade] = (Math.Max(largest.Value, valueFraction), Math.Max(largest.Gradient, gradientFraction)); + if (needsAbsolute) + absoluteDecides++; + if (s < 1.0e-2) + smallestError = Math.Max(smallestError, Math.Max(valueError, gradientError)); + if (s <= 1.0e-2) + nearOrigin++; + } + + if (small) + { + Assert.True(absoluteDecides >= 16, $"only {absoluteDecides} of {cases.Count} cases fail once the absolute term is removed: the family cannot tell a device that needs it from one that does not"); + Assert.True(nearOrigin >= 48, $"only {nearOrigin} of {cases.Count} cases have |x|_1 <= 1e-2"); + } + + var report = string.Join(", ", fractions.Select(f => hessian ? $"1e{f.Key}: {f.Value.Gradient:F3}" : $"1e{f.Key}: {f.Value.Value:F3}/{f.Value.Gradient:F3}")); + return $"largest fraction of {(hessian ? "e_h" : "e_n/e_g")} per decade of |x|_1: {report}; largest absolute error at |x|_1 < 1e-2 {smallestError:E3}; {absoluteDecides} of {cases.Count} cases need the absolute term"; + } + + // A committed case's arguments, decoded into the C# method's parameter types in Hex's field order. + private static object[] Arguments(MethodInfo method, string hex) + { + var scalars = new Queue(hex.Split(' ').Select(h => Convert.ToUInt32(h, 16))); + var arguments = method.GetParameters().Select(parameter => FromScalars(parameter.ParameterType, scalars)).ToArray(); + Assert.Empty(scalars); + return arguments; + } + + private static object FromScalars(Type type, Queue scalars) + { + if (type == typeof(float)) + return BitConverter.Int32BitsToSingle((int)scalars.Dequeue()); + if (type == typeof(int)) + return (int)scalars.Dequeue(); + if (type == typeof(uint)) + return scalars.Dequeue(); + if (type.IsArray) + { + var array = Array.CreateInstance(type.GetElementType()!, SiteArrays.Capacity); + for (var i = 0; i < array.Length; i++) + array.SetValue(FromScalars(type.GetElementType()!, scalars), i); + return array; + } + + var value = Activator.CreateInstance(type)!; + foreach (var field in type.GetFields().Where(f => !f.IsStatic)) + field.SetValue(value, FromScalars(field.FieldType, scalars)); + return value; + } + + private static double[] Floats(string hex) => + hex.Split(' ').Select(h => (double)BitConverter.Int32BitsToSingle((int)Convert.ToUInt32(h, 16))).ToArray(); + + // A float32 bit pattern as an integer whose order and differences are the floats' order and ulps. + private static int Ordered(int bits) => bits < 0 ? int.MinValue - bits : bits; + + // ---- The golden fixture ---- + + private const int Seed = 20261002; + private const int Points = 256; + + // How GoldenFixtureMatchesCSharp compares a family whose C# bits come from the platform's libm (exp, + // sin, cos) and so differ by OS; such an entry records the platform that generated it. Every other + // family is compared as text. + private enum Platform { None, Ulp, Scaled } + + // Platform.Scaled: |diff| <= 2^-20 max(|v|, 1) per component. Ulps mean nothing near zero, where + // phacelle's sums of exp, sin and cos cancel; Windows differs from Linux by up to 3.6e-7 of it. + private const double ScaledPlatformBound = 9.5367431640625e-7; + + private sealed record Family(string Glsl, string Tolerance, Func Arguments, string? Check = null, Platform Platform = Platform.None, Func? Verify = null); + + private static float Uniform(System.Random r, float lo, float hi) => lo + (hi - lo) * r.NextSingle(); + private static float2 Point2(System.Random r) => new(Uniform(r, -50.0f, 50.0f), Uniform(r, -50.0f, 50.0f)); + + private static float3 Point3(System.Random r) => new(Uniform(r, -50.0f, 50.0f), Uniform(r, -50.0f, 50.0f), Uniform(r, -50.0f, 50.0f)); + + // A point on the simplex tie set, where snoise's x0 has equal components (NoiseGradTests.SnoiseIsContinuousOnTheSimplexDiagonal): + // seven of eight draws lie on a lattice diagonal v + s (1, 1, 1), v = L - sum(L) / 6 for an integer L, and one of eight on + // the line (t, t, t). A device that runs a different tie rule reads a different function here. + private static float3 TiePoint3(System.Random r) + { + if (r.Next(8) == 0) + { + var t = Uniform(r, -50.0f, 50.0f); + return new float3(t, t, t); + } + + var lx = r.Next(-64, 65); + var ly = r.Next(-64, 65); + var lz = r.Next(-64, 65); + var shift = (lx + ly + lz) / 6.0f; + var s = r.NextSingle(); + return new float3(lx - shift + s, ly - shift + s, lz - shift + s); + } + private static int Bits(System.Random r) => r.Next(int.MinValue, int.MaxValue); + + private static float2 Interval(System.Random r) + { + var centre = Uniform(r, -20.0f, 20.0f); + var width = MathF.Pow(10.0f, Uniform(r, -4.0f, 1.0f)); + return new float2(centre - width * 0.5f, centre + width * 0.5f); + } + + // iv_frustum_ball's sqrt is not correctly rounded on WebGL2 and its compilers may reassociate, so its + // bits are not portable; what the march needs is enclosure, and what culling needs is a ball no wider + // than its rounding widening. The consumer checks both in double from each case's arguments. It is + // written into the family's fixture entry, where the consumer reads it. + private const string FrustumBall = + "enclosure and tightness: from the arguments (mx, my, z0, z1, fp, warp) compute in double zm = (z0 + z1) / 2, " + + "c = (mx zm, my zm, zm), |c|_1 = |mx zm| + |my zm| + |zm|, r = (z1 - z0) / 2 sqrt(mx^2 + my^2 + 1) + z1 fp + warp " + + "and d = |GPU centre - c| (Euclidean); every case must have r + d <= GPU radius <= r + d + 2^-19 (r + |c|_1). " + + "Report the largest ulp distance per component as for any ulp-bounded family; only the two bounds fail the check."; + + // An affine form (x0, a, e): e >= 0, spanning the widths a probe's forms take. + private static float3 Form(System.Random r) => new(Uniform(r, -20.0f, 20.0f), Uniform(r, -5.0f, 5.0f), MathF.Pow(10.0f, Uniform(r, -4.0f, 1.0f))); + + // A slice's axis and radius in noise space, log-uniform from 1e-3 to 0.5: below about 0.15 the + // centred form of af_snoise wins, above it the Lipschitz form does, so both are drawn. + private static float3 Axis3(System.Random r) + { + var scale = MathF.Pow(10.0f, Uniform(r, -3.0f, -0.3f)); + return new float3(Uniform(r, -1.0f, 1.0f) * scale, Uniform(r, -1.0f, 1.0f) * scale, Uniform(r, -1.0f, 1.0f) * scale); + } + + private static float BallRadius(System.Random r) => MathF.Pow(10.0f, Uniform(r, -3.0f, -0.3f)); + + // A slice of reach 1e-6 to 1e-3, the short slices and small footprints near a camera, where the float32 + // allowance is most of the form's width: the centre in [-50, 50] or [-1, 1], an axis of random direction + // (zero in one case of four) and a radius, each log-uniform in 1e-6 to 1e-3. + private static object[] SmallReachSlice(System.Random r) + { + var span = r.Next(2) == 0 ? 50.0f : 1.0f; + var centre = new float3(Uniform(r, -span, span), Uniform(r, -span, span), Uniform(r, -span, span)); + var axis = new float3(0.0f, 0.0f, 0.0f); + if (r.Next(4) != 0) + { + var direction = math.normalize(new float3(Uniform(r, -1.0f, 1.0f), Uniform(r, -1.0f, 1.0f), Uniform(r, -1.0f, 1.0f))); + axis = direction * MathF.Pow(10.0f, Uniform(r, -6.0f, -3.0f)); + } + + return new object[] { centre, axis, MathF.Pow(10.0f, Uniform(r, -6.0f, -3.0f)) }; + } + + private const string SampledForm = + "the arguments are (cx, cy, cz, ax, ay, az, radius, ...) and the result is the form (x0, a, e). Enclosure: for eps in " + + "{-1, -0.5, 0, 0.5, 1} and d in {0, +-ex, +-ey, +-ez, (+-1, +-1, +-1) / sqrt(3)} (15 directions), form the point " + + "p = c + axis eps + radius d in double and round it to float32; the device's own reference value at p must lie in " + + "[x0 + a eps - e, x0 + a eps + e] with no tolerance, so a device whose gradient error exceeds the allowance fails. " + + "Tightness: with L = 7.9640074 and, for each octave (one for af_snoise), R = |axis| + radius, " + + "B = L R + 2^-14 + 2^-12 R + L 2^-20 (|c|_1 + R), the width |a| + e must be at most B + 2^-16 (1 + B). " + + "Report the least slack of each side, absolutely and as a fraction of e; only the two bounds fail the check. "; + + private const string SnoiseForm = SampledForm + "The reference value is cultmath_snoise(p)."; + + private const string FbmForm = SampledForm + + "The reference value is cultmath_fbm_grad(p, octaves, lacunarity, gain).w, and B is the sum over octaves i of gain^i B_i, " + + "where B_i is B for the centre lacunarity^i c, the axis lacunarity^i axis and the radius lacunarity^i radius."; + + // The two small-reach families add the centre leg to every af_snoise and af_fbm family. The device's + // reference value is its own noise, so a device whose noise is wrong everywhere encloses its own wrong + // values; C#'s value at the centre, the form's own x0 in the fixture, is the independent reading. + private const string CentreLeg = + " Centre leg, for every cultmath_af_snoise and cultmath_af_fbm family of this fixture, the earlier ones included: " + + "the fixture's own x0 in the result (C#'s value at the centre) must lie in [x0 - e, x0 + e] of the GPU's form, with " + + "no tolerance, so a device whose noise differs from C#'s by more than its e fails."; + + private const string SmallReach = + " These cases have reach |axis| + radius of 1e-6 to 1e-3, where the float32 allowance is most of e and the second order " + + "remainder is not; the enclosure above fails a device whose gradient error exceeds the allowance."; + + private const string SnoiseSmallForm = SnoiseForm + SmallReach + CentreLeg; + + private const string FbmSmallForm = FbmForm + SmallReach + CentreLeg; + + private const string AffineFrustumBall = + "enclosure and tightness: from the arguments (mx, my, z0, z1, fp, warpVariation) compute in double zm = (z0 + z1) / 2, " + + "h = (z1 - z0) / 2, axis = (mx h, my h, h), c0 = (mx zm, my zm, zm), |c0|_1 = |mx zm| + |my zm| + |zm|, R0 = z1 fp + warpVariation, " + + "spread = (|mx| + |my| + 1) h and d = |GPU centre - c0|. Enclosure: for z in {z0, (3 z0 + z1) / 4, zm, (z0 + 3 z1) / 4, z1}, " + + "eps = clamp((z - zm) / h, -1, 1) and the nine footprint offsets e in {(0, 0), (+-1, 0), (0, +-1), (+-1, +-1) / sqrt(2)}, " + + "the point P = ((mx + fp e.x) z, (my + fp e.y) z, z) satisfies |P - (GPU centre + axis eps)| + warpVariation <= GPU radius. " + + "Tightness: R0 + d <= GPU radius <= R0 + d + 2^-19 (R0 + |c0|_1 + spread). " + + "Report the least slack of each side; only the bounds fail the check."; + + // The Cycles node families' operands: values past [0, 1] on both sides, so the clamps, the extrapolating + // factors and the divisions by a small number all show. + private static float CyclesValue(System.Random r) => Uniform(r, -20.0f, 20.0f); + private static float CyclesFactor(System.Random r) => Uniform(r, -0.5f, 1.5f); + private static float3 CyclesColor(System.Random r) => new(Uniform(r, -0.25f, 1.25f), Uniform(r, -0.25f, 1.25f), Uniform(r, -0.25f, 1.25f)); + + // A Phacelle stripe wave vector: each component in [-6, 6], about one stripe per cell. + private static float3 Side(System.Random r) => new(Uniform(r, -6.0f, 6.0f), Uniform(r, -6.0f, 6.0f), Uniform(r, -6.0f, 6.0f)); + + // Every family the site's WebGL2 readback evaluates, in a fixed order. A new family is appended, so the + // seeded stream and every earlier family's cases stay as they were. pcg3d and pcg4d are "exact"; the + // float families are ulp-bounded, with the bound measured on the device by the consumer, and + // iv_frustum_ball also carries an enclosure check; the four coordinate-band snoise_grad and snoise_hessian + // families carry an allowance check, applied to C#'s own results here and to a device's by the device judge. phacelle is in CultMath.Phacelle.glsl, so its + // evaluator concatenates that file after CultMath.glsl; the site, which does not vendor it, skips it. + private static readonly Family[] Families = new Family[] + { + new("float cultmath_snoise(vec3)", "ulp-bounded", r => new object[] { Point3(r) }), + new("float cultmath_snoise(vec2)", "ulp-bounded", r => new object[] { new float2(Uniform(r, -50.0f, 50.0f), Uniform(r, -50.0f, 50.0f)) }), + new("vec4 cultmath_snoise_grad(vec3)", "ulp-bounded", r => new object[] { Point3(r) }), + new("vec4 cultmath_fbm_grad(vec3, int, float, float)", "ulp-bounded", r => new object[] { Point3(r), 4, 2.0f, 0.5f }), + new("vec4 cultmath_ridged_grad(vec3, int, float, float)", "ulp-bounded", r => new object[] { Point3(r), 4, 2.0f, 0.5f }), + new("CultCellular cultmath_cellular(vec3)", "ulp-bounded", r => new object[] { Point3(r) }), + new("ivec3 cultmath_pcg3d(ivec3)", "exact", r => new object[] { new int3(Bits(r), Bits(r), Bits(r)) }), + new("ivec4 cultmath_pcg4d(ivec4)", "exact", r => new object[] { new int4(Bits(r), Bits(r), Bits(r), Bits(r)) }), + new("vec2 cultmath_iv_point(float)", "ulp-bounded", r => new object[] { Uniform(r, -20.0f, 20.0f) }), + new("vec2 cultmath_iv_add(vec2, vec2)", "ulp-bounded", r => new object[] { Interval(r), Interval(r) }), + new("vec2 cultmath_iv_sub(vec2, vec2)", "ulp-bounded", r => new object[] { Interval(r), Interval(r) }), + new("vec2 cultmath_iv_neg(vec2)", "ulp-bounded", r => new object[] { Interval(r) }), + new("vec2 cultmath_iv_mul(vec2, vec2)", "ulp-bounded", r => new object[] { Interval(r), Interval(r) }), + new("vec2 cultmath_iv_scale(vec2, float)", "ulp-bounded", r => new object[] { Interval(r), Uniform(r, -4.0f, 4.0f) }), + new("vec2 cultmath_iv_abs(vec2)", "ulp-bounded", r => new object[] { Interval(r) }), + new("vec2 cultmath_iv_min(vec2, vec2)", "ulp-bounded", r => new object[] { Interval(r), Interval(r) }), + new("vec2 cultmath_iv_max(vec2, vec2)", "ulp-bounded", r => new object[] { Interval(r), Interval(r) }), + new("vec2 cultmath_iv_sqr(vec2)", "ulp-bounded", r => new object[] { Interval(r) }), + new("vec2 cultmath_iv_sqrt(vec2)", "ulp-bounded", r => new object[] { Interval(r) }), + new("vec2 cultmath_iv_clamp(vec2, float, float)", "ulp-bounded", r => new object[] { Interval(r), Uniform(r, -25.0f, 0.0f), Uniform(r, 0.0f, 25.0f) }), + new("vec2 cultmath_iv_saturate(vec2)", "ulp-bounded", r => new object[] { Interval(r) }), + new("vec2 cultmath_iv_smoothstep(float, float, vec2)", "ulp-bounded", r => new object[] { Uniform(r, -25.0f, 0.0f), Uniform(r, 0.0f, 25.0f), Interval(r) }), + new("vec2 cultmath_iv_lerp(vec2, vec2, float)", "ulp-bounded", r => new object[] { Interval(r), Interval(r), Uniform(r, 0.0f, 1.0f) }), + new("vec2 cultmath_iv_snoise_ball(vec3, float)", "ulp-bounded", r => new object[] { Point3(r), Uniform(r, 0.001f, 2.0f) }), + new("vec2 cultmath_iv_fbm_ball(vec3, float, int, float, float)", "ulp-bounded", r => new object[] { Point3(r), Uniform(r, 0.001f, 2.0f), 4, 2.0f, 0.5f }), + new("vec4 cultmath_iv_frustum_ball(vec2, float, float, float, float)", "ulp-bounded", r => + { + var slope = new float2(Uniform(r, -1.0f, 1.0f), Uniform(r, -1.0f, 1.0f)); + var z0 = Uniform(r, 0.1f, 100.0f); + return new object[] { slope, z0, z0 + Uniform(r, 0.01f, 50.0f), Uniform(r, 0.0001f, 0.05f), Uniform(r, 0.0f, 2.0f) }; + }, FrustumBall, Verify: AssertFrustumBall), + new("vec2 cultmath_iv_exp(vec2)", "ulp-bounded, platform exp", r => new object[] { Interval(r) }, Platform: Platform.Ulp), + new("CultPhasor cultmath_phacelle(vec3, vec3, float, float)", "ulp-bounded, platform exp, sin, cos; across platforms |diff| <= 2^-20 max(|v|, 1); on a device |diff| <= 2^-18 max(|v|, 1)", + r => new object[] { Point3(r), Side(r), Uniform(r, 0.0f, 1.0f), 0.5f }, Platform: Platform.Scaled), + new("float cultmath_snoise(vec3)", "ulp-bounded, on the simplex tie set", r => new object[] { TiePoint3(r) }), + new("vec4 cultmath_snoise_grad(vec3)", "ulp-bounded, on the simplex tie set", r => new object[] { TiePoint3(r) }), + new("vec3 cultmath_af_point(float)", "ulp-bounded", r => new object[] { Uniform(r, -20.0f, 20.0f) }), + new("vec3 cultmath_af_symbol(float, float)", "ulp-bounded", r => new object[] { Uniform(r, -20.0f, 20.0f), Uniform(r, -5.0f, 5.0f) }), + new("vec3 cultmath_af_from_iv(vec2)", "ulp-bounded", r => new object[] { Interval(r) }), + new("vec2 cultmath_af_range(vec3)", "ulp-bounded", r => new object[] { Form(r) }), + new("vec3 cultmath_af_add(vec3, vec3)", "ulp-bounded", r => new object[] { Form(r), Form(r) }), + new("vec3 cultmath_af_sub(vec3, vec3)", "ulp-bounded", r => new object[] { Form(r), Form(r) }), + new("vec3 cultmath_af_neg(vec3)", "ulp-bounded", r => new object[] { Form(r) }), + new("vec3 cultmath_af_scale(vec3, float)", "ulp-bounded", r => new object[] { Form(r), Uniform(r, -4.0f, 4.0f) }), + new("vec3 cultmath_af_add_iv(vec3, vec2)", "ulp-bounded", r => new object[] { Form(r), Interval(r) }), + new("vec3 cultmath_af_mul(vec3, vec3)", "ulp-bounded", r => new object[] { Form(r), Form(r) }), + new("vec3 cultmath_af_snoise(vec3, vec3, float)", "ulp-bounded", r => new object[] { Point3(r), Axis3(r), BallRadius(r) }, SnoiseForm, Verify: cases => AssertSnoiseForm(cases)), + new("vec3 cultmath_af_fbm(vec3, vec3, float, int, float, float)", "ulp-bounded", r => new object[] { Point3(r), Axis3(r), BallRadius(r), 4, 2.0f, 0.5f }, FbmForm, Verify: cases => AssertFbmForm(cases)), + new("vec3 cultmath_af_frustum_axis(vec2, float, float)", "ulp-bounded", r => + { + var z0 = Uniform(r, 0.1f, 100.0f); + return new object[] { new float2(Uniform(r, -1.0f, 1.0f), Uniform(r, -1.0f, 1.0f)), z0, z0 + Uniform(r, 0.01f, 50.0f) }; + }), + new("vec4 cultmath_af_frustum_ball(vec2, float, float, float, float)", "ulp-bounded", r => + { + var slope = new float2(Uniform(r, -1.0f, 1.0f), Uniform(r, -1.0f, 1.0f)); + var z0 = Uniform(r, 0.1f, 100.0f); + return new object[] { slope, z0, z0 + Uniform(r, 0.01f, 50.0f), Uniform(r, 0.0001f, 0.05f), Uniform(r, 0.0f, 2.0f) }; + }, AffineFrustumBall, Verify: AssertAffineFrustumBall), + new("vec2 cultmath_iv_snoise_ball(vec2, float)", "ulp-bounded", r => new object[] { new float2(Uniform(r, -50.0f, 50.0f), Uniform(r, -50.0f, 50.0f)), Uniform(r, 0.001f, 2.0f) }), + new("vec3 cultmath_af_snoise(vec3, vec3, float)", "ulp-bounded, reach 1e-6 to 1e-3", SmallReachSlice, SnoiseSmallForm, Verify: cases => AssertSnoiseForm(cases, allowanceDecides: true)), + new("vec3 cultmath_af_fbm(vec3, vec3, float, int, float, float)", "ulp-bounded, reach 1e-6 to 1e-3", r => SmallReachSlice(r).Concat(new object[] { 4, 2.0f, 0.5f }).ToArray(), FbmSmallForm, Verify: cases => AssertFbmForm(cases, allowanceDecides: true)), + new("float cultmath_cycles_divide(float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_power(float, float)", "ulp-bounded, platform pow", r => new object[] { Uniform(r, -4.0f, 4.0f), r.Next(2) == 0 ? r.Next(-4, 5) : Uniform(r, -3.0f, 3.0f) }, Platform: Platform.Ulp), + new("float cultmath_cycles_logarithm(float, float)", "ulp-bounded, platform log", r => new object[] { Uniform(r, 0.01f, 20.0f), Uniform(r, 0.01f, 20.0f) }, Platform: Platform.Ulp), + new("float cultmath_cycles_sqrt(float)", "ulp-bounded", r => new object[] { CyclesValue(r) }), + new("float cultmath_cycles_inverse_sqrt(float)", "ulp-bounded", r => new object[] { CyclesValue(r) }), + new("float cultmath_cycles_modulo(float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_floored_modulo(float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_wrap(float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), Uniform(r, -10.0f, 10.0f), Uniform(r, -10.0f, 10.0f) }), + new("float cultmath_cycles_snap(float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_pingpong(float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_smooth_min(float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r), Uniform(r, -5.0f, 5.0f) }), + new("float cultmath_cycles_smooth_max(float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r), Uniform(r, -5.0f, 5.0f) }), + new("float cultmath_cycles_compare(float, float, float)", "ulp-bounded", r => { var a = CyclesValue(r); return new object[] { a, a + Uniform(r, -1.0f, 1.0f) * 1.0e-3f, Uniform(r, 0.0f, 2.0e-3f) }; }), + new("float cultmath_cycles_round(float)", "ulp-bounded", r => new object[] { CyclesValue(r) }), + new("float cultmath_cycles_trunc(float)", "ulp-bounded", r => new object[] { CyclesValue(r) }), + new("float cultmath_cycles_fract(float)", "ulp-bounded", r => new object[] { CyclesValue(r) }), + new("float cultmath_cycles_sign(float)", "ulp-bounded", r => new object[] { r.Next(4) == 0 ? 0.0f : CyclesValue(r) }), + new("float cultmath_cycles_map_range_linear(float, float, float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r), CyclesValue(r), CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_map_range_stepped(float, float, float, float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r), CyclesValue(r), CyclesValue(r), CyclesValue(r), Uniform(r, -1.0f, 8.0f) }), + new("float cultmath_cycles_map_range_smoothstep(float, float, float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r), CyclesValue(r), CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_map_range_smootherstep(float, float, float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r), CyclesValue(r), CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_clamp_minmax(float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_clamp_range(float, float, float)", "ulp-bounded", r => new object[] { CyclesValue(r), CyclesValue(r), CyclesValue(r) }), + new("float cultmath_cycles_mix_float(float, float, float)", "ulp-bounded", r => new object[] { CyclesFactor(r), CyclesValue(r), CyclesValue(r) }), + new("vec3 cultmath_cycles_mix_vector(float, vec3, vec3)", "ulp-bounded", r => new object[] { CyclesFactor(r), CyclesColor(r), CyclesColor(r) }), + new("vec3 cultmath_cycles_rgb_to_hsv(vec3)", "ulp-bounded", r => new object[] { CyclesColor(r) }), + new("vec3 cultmath_cycles_hsv_to_rgb(vec3)", "ulp-bounded", r => new object[] { new float3(r.NextSingle(), r.NextSingle(), Uniform(r, 0.0f, 2.0f)) }), + new("float cultmath_cycles_rgb_to_bw(vec3)", "ulp-bounded", r => new object[] { CyclesColor(r) }), + new("vec2 cultmath_cycles_ramp_index(float, int)", "ulp-bounded", r => new object[] { Uniform(r, -0.25f, 1.25f), 257 }), + }.Concat(new[] + { + "blend", "add", "mul", "screen", "overlay", "sub", "div", "diff", "exclusion", "dark", "light", "dodge", "burn", "hue", "sat", "val", "color", "soft", "linear", + }.Select(mode => new Family($"vec3 cultmath_cycles_mix_{mode}(float, vec3, vec3)", "ulp-bounded", r => new object[] { CyclesFactor(r), CyclesColor(r), CyclesColor(r) }))).Concat(new[] + { + new Family("float cultmath_cycles_arcsine(float)", "ulp-bounded, platform asin", r => new object[] { Uniform(r, -1.5f, 1.5f) }, Platform: Platform.Ulp), + new Family("float cultmath_cycles_arccosine(float)", "ulp-bounded, platform acos", r => new object[] { Uniform(r, -1.5f, 1.5f) }, Platform: Platform.Ulp), + new Family("float cultmath_cycles_arctan2(float, float)", "ulp-bounded, platform atan", r => new object[] { Uniform(r, -20.0f, 20.0f), Uniform(r, -20.0f, 20.0f) }, Platform: Platform.Ulp), + new Family("mat3 cultmath_snoise_hessian(vec3)", "ulp-bounded", r => new object[] { Point3(r) }), + new Family("mat3 cultmath_snoise_hessian(vec3)", "ulp-bounded, on the simplex tie set", r => new object[] { TiePoint3(r) }), + new Family("float cultmath_integral_clamp_linear(float, float, float, float, float, float)", "ulp-bounded", + r => + { + var lo = Uniform(r, -2.0f, 0.5f); + return new object[] { Uniform(r, -4.0f, 4.0f), r.Next(8) == 0 ? 0.0f : Uniform(r, -4.0f, 4.0f), lo, lo + Uniform(r, 0.0f, 3.0f), Uniform(r, -3.0f, 3.0f), Uniform(r, -3.0f, 3.0f) }; + }), + // The edge cases the family above never draws: lo above hi (b = 0 and b != 0; the lowering must + // normalise before any clamp sees it) and infinite bounds (hi = +inf, lo = -inf, both). + new Family("float cultmath_integral_clamp_linear(float, float, float, float, float, float)", "ulp-bounded, lo above hi and infinite bounds", + r => + { + var a = Uniform(r, -4.0f, 4.0f); + var slope = Uniform(r, -4.0f, 4.0f); + var (t0, t1) = (Uniform(r, -3.0f, 3.0f), Uniform(r, -3.0f, 3.0f)); + return r.Next(5) switch + { + 0 => new object[] { a, 0.0f, Uniform(r, 0.5f, 2.0f), Uniform(r, -2.0f, 0.4f), t0, t1 }, + 1 => new object[] { a, slope, Uniform(r, 0.5f, 2.0f), Uniform(r, -2.0f, 0.4f), t0, t1 }, + 2 => new object[] { a, slope, Uniform(r, -2.0f, 1.0f), float.PositiveInfinity, t0, t1 }, + 3 => new object[] { a, slope, float.NegativeInfinity, Uniform(r, -1.0f, 2.0f), t0, t1 }, + _ => new object[] { a, slope, float.NegativeInfinity, float.PositiveInfinity, t0, t1 }, + }; + }), + // Zero-length spans (t1 = t0 three times in four) with a flat or sloped line, and infinite clamp bounds + // on either side or both: an infinite bound times a zero length must give +0, and a flat line clamped + // to an infinite bound over a nonzero span is infinite, never NaN. + new Family("float cultmath_integral_clamp_linear(float, float, float, float, float, float)", "ulp-bounded, zero-length spans and flat infinite clamps", + r => + { + float Line() => r.Next(3) switch { 0 => 0.0f, 1 => -0.0f, _ => Uniform(r, -4.0f, 4.0f) }; + float Bound() => r.Next(3) switch { 0 => float.NegativeInfinity, 1 => float.PositiveInfinity, _ => Uniform(r, -2.0f, 2.0f) }; + var (a, b, lo, hi) = (Line(), Line(), Bound(), Bound()); + var t0 = Uniform(r, -3.0f, 3.0f); + var t1 = r.Next(4) != 0 ? t0 : Uniform(r, -3.0f, 3.0f); + return new object[] { a, b, lo, hi, t0, t1 }; + }), + // The span stages over their struct arguments: realistic stages and spans (SpanStageTests' own draw), the + // midpoint a Point3, one span in four a point. + new Family("SpanNoise cultmath_span_fbm(SpanPath, SpanStage, int, float, float)", "ulp-bounded", SpanArguments), + new Family("SpanNoise cultmath_span_ridged(SpanPath, SpanStage, int, float, float)", "ulp-bounded", SpanArguments), + // The kernel's reads over coordinate bands, the magnitude log-uniform in the band: the allowance of + // math.span_slack is checked against the exact kernel at every case (SpanAllowanceRead). + new Family("vec4 cultmath_snoise_grad(vec3)", "ulp-bounded, coordinate bands 1e-4 to 1e2", r => new object[] { BandPoint3(r, 1.0e-4, 1.0e2) }, SpanAllowanceRead, Verify: cases => AssertSpanAllowance(cases, hessian: false, small: true)), + new Family("vec4 cultmath_snoise_grad(vec3)", "ulp-bounded, coordinate bands 1e2 to 4e6", r => new object[] { BandPoint3(r, 1.0e2, 4.0e6) }, SpanAllowanceRead, Verify: cases => AssertSpanAllowance(cases, hessian: false, small: false)), + new Family("mat3 cultmath_snoise_hessian(vec3)", "ulp-bounded, coordinate bands 1e-4 to 1e2", r => new object[] { BandPoint3(r, 1.0e-4, 1.0e2) }, SpanAllowanceRead, Verify: cases => AssertSpanAllowance(cases, hessian: true, small: true)), + new Family("mat3 cultmath_snoise_hessian(vec3)", "ulp-bounded, coordinate bands 1e2 to 4e6", r => new object[] { BandPoint3(r, 1.0e2, 4.0e6) }, SpanAllowanceRead, Verify: cases => AssertSpanAllowance(cases, hessian: true, small: false)), + // Segment distance in 2D and 3D (one segment in eight degenerate), then the site cells: scores, fold step + // over states built by inserting 0-3 random scores (one in four with an exactly tied score), border, margin. + new Family("float cultmath_distance_to_segment(vec2, vec2, vec2)", "ulp-bounded", r => + { + var start = Point2(r); + return new object[] { Point2(r), start, r.Next(8) == 0 ? start : Point2(r) }; + }), + new Family("vec2 cultmath_segment_closest(vec2, vec2, vec2)", "ulp-bounded", r => + { + var start = Point2(r); + return new object[] { Point2(r), start, r.Next(8) == 0 ? start : Point2(r) }; + }), + new Family("float cultmath_distance_to_segment(vec3, vec3, vec3)", "ulp-bounded", r => + { + var start = Point3(r); + return new object[] { Point3(r), start, r.Next(8) == 0 ? start : Point3(r) }; + }), + new Family("vec3 cultmath_segment_closest(vec3, vec3, vec3)", "ulp-bounded", r => + { + var start = Point3(r); + return new object[] { Point3(r), start, r.Next(8) == 0 ? start : Point3(r) }; + }), + // The border step: owner and other random (one in six coincident), a running border either empty or a + // random (normal, distance); one in six other is a distinct site within 1e-3 of the owner (inside the 1e-2 guard a + // changed length test would trip), one in six coincident. + new Family("vec4 cultmath_power_border_step(vec3, vec4, vec4, vec4)", "ulp-bounded", r => + { + var owner = Site(r, 0.1f, 20.0f); + var border = r.Next(2) == 0 ? new float4(0.0f, 0.0f, 0.0f, 1.0e30f) : new float4(Point3(r), Uniform(r, 0.0f, 50.0f)); + var pick = r.Next(6); + var near = new float4(owner.xyz + new float3(Uniform(r, 1.0e-4f, 1.0e-3f), Uniform(r, -1.0e-3f, 1.0e-3f), Uniform(r, -1.0e-3f, 1.0e-3f)), Uniform(r, 0.1f, 20.0f)); + return new object[] { Point3(r), owner, pick == 0 ? owner : pick == 1 ? near : Site(r, 0.1f, 20.0f), border }; + }), + new Family("vec4 cultmath_power_score(vec3, vec4)", "ulp-bounded", r => new object[] { Point3(r), Site(r, 0.1f, 20.0f) }), + new Family("vec4 cultmath_multiplicative_score(vec3, vec4)", "ulp-bounded", r => new object[] { Point3(r), Site(r, 0.1f, 100.0f, logWeight: true) }), + new Family("CultSiteCells cultmath_site_cells_insert(CultSiteCells, vec4, int)", "ulp-bounded", r => + { + var (cells, scores) = CellsState(r); + var score = r.Next(4) == 0 && scores.Count > 0 ? scores[r.Next(scores.Count)] : PowerOrMultiplicative(r); + return new object[] { cells, score, scores.Count }; + }), + new Family("vec4 cultmath_site_cells_border(CultSiteCells)", "ulp-bounded", r => + { + var (cells, _) = CellsState(r, minimum: r.Next(8) == 0 ? 0 : 2); + return new object[] { cells }; + }), + new Family("float cultmath_gabriel_margin(vec3, vec3, vec3)", "ulp-bounded", r => + { + var a = Point3(r); + return new object[] { a, r.Next(8) == 0 ? a : Point3(r), Point3(r) }; + }), + // The lattice steps. The cell is an integer-valued vec2 (negative and large included), time and drift span + // zero and the accepted range; the weight's border covers 0, near the falloff, and the 1.0e30 of no body. + new Family("vec3 cultmath_lattice_site(vec2, float, float)", "ulp-bounded", r => + new object[] { new float2(r.Next(-4000, 4000), r.Next(-4000, 4000)), r.Next(6) == 0 ? 0.0f : Uniform(r, -200.0f, 200.0f), r.Next(6) == 0 ? 0.0f : Uniform(r, -3.0f, 3.0f) }), + new Family("float cultmath_lattice_weight(float, float, float, float)", "ulp-bounded", r => + { + var falloff = Uniform(r, 0.05f, 40.0f); + var border = r.Next(5) switch { 0 => 0.0f, 1 => 1.0e30f, 2 => falloff * Uniform(r, 0.9f, 1.1f), _ => Uniform(r, 0.0f, 3.0f * falloff) }; + var boost = r.Next(5) switch { 0 => 0.0f, 1 => 4.0f, _ => Uniform(r, 0.0f, 4.0f) }; + return new object[] { Uniform(r, 0.5f, 1.0f), border, boost, falloff }; + }), + new Family("float cultmath_lattice_distance(vec2, vec2, float, vec2, float)", "ulp-bounded", r => + { + var angle = Uniform(r, 0.0f, 6.2831855f); + var normal = r.Next(6) == 0 ? new float2(1.0f, 0.0f) : new float2(MathF.Cos(angle), MathF.Sin(angle)); + var stretch = r.Next(5) switch { 0 => 1.0f, 1 => 2.0f, _ => Uniform(r, 1.0f, 2.0f) }; + return new object[] { Point2(r), Point2(r), Uniform(r, 0.5f, 5.0f), normal, stretch }; + }), + // The smooth step: d exactly at f1 + 2 smoothing one in four (the equal branch), near it one in four, the + // smoothing near 0 and at 1, m anywhere up to f1 + smoothing. + // One draw in four is the cap point: m = f1 + smoothing exactly and d = f1 + smoothing (1 + U(0.3, 0.9)) with smoothing in + // [0.5, 1], where next exceeds f1 + smoothing and the min clamps; a step that returns next reads another function there. + new Family("float cultmath_lattice_smooth_step(float, float, float, float)", "ulp-bounded", r => + { + if (r.Next(4) == 0) + { + var cappedSmoothing = Uniform(r, 0.5f, 1.0f); + var cappedF1 = Uniform(r, 0.0f, 10.0f); + return new object[] { cappedF1 + cappedSmoothing, cappedF1 + cappedSmoothing * (1.0f + Uniform(r, 0.3f, 0.9f)), cappedF1, cappedSmoothing }; + } + + var smoothing = r.Next(5) switch { 0 => 1.0f, 1 => Uniform(r, 1.0e-3f, 1.0e-2f), _ => Uniform(r, 0.01f, 1.0f) }; + var f1 = Uniform(r, 0.0f, 10.0f); + var edge = f1 + 2.0f * smoothing; + var d = r.Next(4) switch { 0 => edge, 1 => edge * Uniform(r, 0.99f, 1.01f), _ => Uniform(r, f1, edge + 1.0f) }; + return new object[] { Uniform(r, f1, f1 + smoothing), d, f1, smoothing }; + }), + // The site-array functions: a fixed-capacity array and a count, killed on the device (the lattice at rings up to 17). + new Family($"vec4 cultmath_power_border(vec3, vec4[{SiteArrays.Capacity}], int)", "ulp-bounded", SiteArrays.PowerBorderArguments), + new Family($"vec4 cultmath_weighted_lattice_cells(vec2, float, vec4[{SiteArrays.Capacity}], int, float, float, float, float, float, vec2, float)", "ulp-bounded", SiteArrays.LatticeArguments), + }).ToArray(); + + // A point of magnitude m, m log-uniform in [lo, hi]: one component at +-m, the other two uniform in [-m, m], + // the axis of the large one random. + private static float3 BandPoint3(System.Random r, double lo, double hi) + { + var m = lo * Math.Pow(hi / lo, r.NextDouble()); + var v = new double[] { (r.NextDouble() * 2.0 - 1.0) * m, (r.NextDouble() * 2.0 - 1.0) * m, (r.NextDouble() * 2.0 - 1.0) * m }; + v[r.Next(3)] = r.Next(2) == 0 ? m : -m; + return new float3((float)v[0], (float)v[1], (float)v[2]); + } + + + // A site float4(position.xyz, weight): the weight uniform in [lo, hi], or log-uniform when logWeight. + private static float4 Site(System.Random r, float lo, float hi, bool logWeight = false) + { + var p = Point3(r); + return new float4(p.x, p.y, p.z, logWeight ? lo * MathF.Pow(hi / lo, r.NextSingle()) : Uniform(r, lo, hi)); + } + + private static float4 PowerOrMultiplicative(System.Random r) => + r.Next(2) == 0 ? math.power_score(Point3(r), Site(r, 0.1f, 20.0f)) : math.multiplicative_score(Point3(r), Site(r, 0.1f, 100.0f, logWeight: true)); + + // A fold state made by the production path: site_cells_insert over a few random scores (at least minimum). + private static (CultSiteCells Cells, List Scores) CellsState(System.Random r, int minimum = 0) + { + var scores = new List(); + var cells = math.site_cells_empty(); + for (var i = minimum + r.Next(4 - minimum); i > 0; i--) + { + var score = r.Next(4) == 0 && scores.Count > 0 ? scores[^1] : PowerOrMultiplicative(r); + cells = math.site_cells_insert(cells, score, scores.Count); + scores.Add(score); + } + + return (cells, scores); + } + + private static object[] SpanArguments(System.Random r) + { + var stage = SpanStageTests.Stage.Draw(r); + var halfLength = r.Next(4) == 0 ? 0.0f : new[] { 0.02f, 0.1f, 0.5f }[r.Next(3)]; + var span = SpanStageTests.Span.Draw(r, Point3(r), halfLength, Uniform(r, 0.0f, 2.0f)); + return new object[] { span.Path, stage.S, stage.Octaves, stage.Lacunarity, stage.Gain }; + } + + /// + /// The committed fixture's cases of the three cultmath_integral_clamp_linear families, decoded into the + /// C# arguments (a, b, lo, hi, t0, t1): the random cases the clamp-normalisation tests also run. + /// + internal static IReadOnlyList IntegralClampLinearFixtureCases + { + get + { + const string clamp = "float cultmath_integral_clamp_linear(float, float, float, float, float, float)"; + var method = Resolve(clamp); + return JsonNode.Parse(File.ReadAllText(FixturePath))!["functions"]!.AsArray() + .Where(family => (string)family!["glsl"]! == clamp) + .SelectMany(family => family!["cases"]!.AsArray()) + .Select(entry => Arguments(method, ((string)entry!).Split(" -> ")[0]).Select(a => (float)a).ToArray()) + .ToArray(); + } + } + + // The fixture text, each case's arguments given by family and point index. + private static string GoldenFixture(Func arguments) + { + var json = new StringBuilder(); + json.Append("{\n"); + json.Append(" \"generator\": \"GlslMirrorTests.GoldenFixtureMatchesCSharp (packages/cultmath/tests/CultMath.Tests); regenerate with CULTMATH_WRITE_GLSL=1\",\n"); + json.Append($" \"seed\": {Seed},\n"); + json.Append($" \"points\": {Points},\n"); + json.Append(" \"encoding\": \"each case is 'arguments -> result', every scalar a float32 or 32-bit integer bit pattern in hex, vectors and structs flattened in field order\",\n"); + json.Append(" \"functions\": [\n"); + for (var f = 0; f < Families.Length; f++) + { + var family = Families[f]; + var method = Resolve(family.Glsl); + json.Append(" {\n"); + json.Append($" \"glsl\": \"{family.Glsl}\",\n"); + json.Append($" \"tolerance\": \"{family.Tolerance}\",\n"); + if (family.Check is not null) + json.Append($" \"check\": \"{family.Check}\",\n"); + if (family.Platform != Platform.None) + json.Append($" \"platform\": \"{RuntimeInformation.OSDescription}; {RuntimeInformation.FrameworkDescription}\",\n"); + json.Append(" \"cases\": [\n"); + for (var p = 0; p < Points; p++) + { + var values = arguments(f, p); + var result = method.Invoke(null, values)!; + json.Append(" \"").Append(Hex(values)).Append(" -> ").Append(Hex(new[] { result })).Append('"'); + json.Append(p + 1 < Points ? ",\n" : "\n"); + } + + json.Append(" ]\n"); + json.Append(f + 1 < Families.Length ? " },\n" : " }\n"); + } + + json.Append(" ]\n}\n"); + return json.ToString(); + } + + private static readonly Dictionary GlslTypes = new() + { + ["float"] = typeof(float), ["int"] = typeof(int), ["vec2"] = typeof(float2), ["vec3"] = typeof(float3), + ["vec4"] = typeof(float4), ["ivec3"] = typeof(int3), ["ivec4"] = typeof(int4), + ["SpanPath"] = typeof(SpanPath), ["SpanStage"] = typeof(SpanStage), + ["CultSiteCells"] = typeof(CultSiteCells), + [$"vec4[{SiteArrays.Capacity}]"] = typeof(float4[]), + }; + + // The C# math method a GLSL signature names: cultmath_ dropped, parameter types mapped. + private static MethodInfo Resolve(string glsl) + { + var match = Regex.Match(glsl, @"^\w+ cultmath_(\w+)\(([^)]*)\)$"); + var types = match.Groups[2].Value.Split(", ").Select(t => GlslTypes[t]).ToArray(); + return typeof(math).GetMethod(match.Groups[1].Value, BindingFlags.Public | BindingFlags.Static, null, types, null) + ?? typeof(SiteArrays).GetMethod(match.Groups[1].Value, BindingFlags.NonPublic | BindingFlags.Static, null, types, null) + ?? throw new InvalidOperationException("no C# math counterpart for " + glsl); + } + + private static string Hex(IEnumerable values) => string.Join(" ", values.SelectMany(Scalars).Select(v => v switch + { + float f => BitConverter.SingleToInt32Bits(f).ToString("x8"), + int i => i.ToString("x8"), + uint u => u.ToString("x8"), + _ => throw new InvalidOperationException(v.GetType().Name), + })); + + // A float3x3 flattens row by row; the matrices the library exports are symmetric, so the order is + // the same read as GLSL's columns. + private static IEnumerable Scalars(object value) => value is float or int or uint + ? new[] { value } + : value is Array array + ? array.Cast().SelectMany(Scalars) + : value is float3x3 matrix + ? new object[] { matrix._m00, matrix._m01, matrix._m02, matrix._m10, matrix._m11, matrix._m12, matrix._m20, matrix._m21, matrix._m22 } + : value.GetType().GetFields().Where(f => !f.IsStatic).SelectMany(f => Scalars(f.GetValue(value)!)); + + // ---- A small unified diff for the failure message ---- + + private static string UnifiedDiff(string before, string after) + { + var a = before.Split('\n'); + var b = after.Split('\n'); + if ((long)a.Length * b.Length > 4_000_000) + { + var first = Enumerable.Range(0, Math.Min(a.Length, b.Length)).FirstOrDefault(i => a[i] != b[i], Math.Min(a.Length, b.Length)); + return $"@@ first difference at line {first + 1} @@\n-{(first < a.Length ? a[first] : "")}\n+{(first < b.Length ? b[first] : "")}"; + } + + var lcs = new int[a.Length + 1, b.Length + 1]; + for (var i = a.Length - 1; i >= 0; i--) + for (var j = b.Length - 1; j >= 0; j--) + lcs[i, j] = a[i] == b[j] ? lcs[i + 1, j + 1] + 1 : Math.Max(lcs[i + 1, j], lcs[i, j + 1]); + + var lines = new List { "--- committed", "+++ lowering" }; + int x = 0, y = 0; + while (x < a.Length || y < b.Length) + { + if (x < a.Length && y < b.Length && a[x] == b[y]) { x++; y++; continue; } + lines.Add($"@@ -{x + 1} +{y + 1} @@"); + while (x < a.Length && (y >= b.Length || lcs[x + 1, y] >= lcs[x, y + 1]) && !(y < b.Length && a[x] == b[y])) + lines.Add("-" + a[x++]); + while (y < b.Length && (x >= a.Length || a[x] != b[y])) + lines.Add("+" + b[y++]); + if (lines.Count > 200) + break; + } + + return string.Join("\n", lines.Take(200)); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs index 445ad255..477cb613 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslMirrorTests.cs @@ -7,7 +7,7 @@ public sealed class HlslMirrorTests [Fact] public void HlslMirrorDoesNotPublishGeometryKernels() { - var source = File.ReadAllText(Path.Combine(GetCultMathRoot(), "shaders", "CultMath.hlsl")); + var source = HlslSourceCompatibilityTests.ReadShaderSource(GetCultMathRoot()); Assert.DoesNotContain("AdvancedErosionFilter.hlsl", source); Assert.DoesNotContain("Planetary.hlsl", source); Assert.DoesNotContain("spherical_erosion", source); @@ -17,7 +17,7 @@ public sealed class HlslMirrorTests [Fact] public void HlslMirrorPublishesCultMathPrimitives() { - var include = File.ReadAllText(Path.Combine(GetCultMathRoot(), "shaders", "CultMath.hlsl")); + var include = HlslSourceCompatibilityTests.ReadShaderSource(GetCultMathRoot()); var requiredSymbols = new[] { "cultmath_radians", @@ -31,7 +31,6 @@ public sealed class HlslMirrorTests "cultmath_smootherstep", "cultmath_lengthsq", "cultmath_distance", - "cultmath_normalize", "cultmath_reflect", "cultmath_rotate", "cultmath_csum", @@ -41,12 +40,17 @@ public sealed class HlslMirrorTests "cultmath_quadratic_bezier", "cultmath_cubic_bezier", "cultmath_hash", + "cultmath_pcg(uint", + "cultmath_pcg3d(int3", + "cultmath_pcg4d(int4", "cultmath_value_noise", "cultmath_snoise(float2", "cultmath_snoise(float3", "cultmath_value_noise_bicubic", "cultmath_value_noise_texture", "cultmath_value_noise_texture_bicubic", + "cultmath_smin_grad", + "cultmath_cellular", }; foreach (var symbol in requiredSymbols) @@ -54,8 +58,22 @@ public sealed class HlslMirrorTests Assert.Contains(symbol, include); } - Assert.Contains("CULTMATH_NORMALIZE_EPSILON", include); - Assert.Contains("max(length(value), CULTMATH_NORMALIZE_EPSILON)", include); + // HLSL's normalize intrinsic is the contract; a mirror copy would only restate it. + Assert.DoesNotContain("cultmath_normalize", include); + } + + [Theory] + [InlineData("CultMath.hlsl")] + [InlineData("CultMath.Phacelle.hlsl")] + [InlineData("CultMath.Interval.hlsl")] + [InlineData("CultMath.Affine.hlsl")] + [InlineData("CultMath.Cycles.hlsl")] + public void UnityPackageShaderIsIdenticalToTheCanonicalShader(string name) + { + var root = GetCultMathRoot(); + Assert.Equal( + File.ReadAllText(Path.Combine(root, "shaders", name)).ReplaceLineEndings("\n"), + File.ReadAllText(Path.Combine(root, "unity", "org.gamecult.cultmath", "Shaders", name)).ReplaceLineEndings("\n")); } private static string GetCultMathRoot() diff --git a/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs index 7b845ea7..27a79234 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslSemanticsTests.cs @@ -187,6 +187,33 @@ public sealed class HlslSemanticsTests Assert.Equal(DoubleBits(-0.0), DoubleBits(math.max(-0.0, 0.0))); Assert.Equal(DoubleBits(0.0), DoubleBits(math.min(-0.0, 0.0))); + // dxc: normalize(x) is x * Rsqrt(Dot(x, x)); length and distance are Sqrt of the summed squares. + static bool AllNaN(float4 value) => + float.IsNaN(value.x) && float.IsNaN(value.y) && float.IsNaN(value.z) && float.IsNaN(value.w); + var n2 = math.normalize(float2.zero); + Assert.True(float.IsNaN(n2.x) && float.IsNaN(n2.y)); + var n3 = math.normalize(float3.zero); + Assert.True(float.IsNaN(n3.x) && float.IsNaN(n3.y) && float.IsNaN(n3.z)); + Assert.True(AllNaN(math.normalize(float4.zero))); + var nanX = math.normalize(new float2(float.NaN, 2.41f)); + Assert.True(float.IsNaN(nanX.x) && float.IsNaN(nanX.y)); + Assert.True(AllNaN(math.normalize(new float4(1.0f, float.NaN, 2.41f, 1.0f)))); + var skew = new float3(0.25f, 1.0f, -0.1f); + var inverseLength = 1.0f / MathF.Sqrt(skew.x * skew.x + skew.y * skew.y + skew.z * skew.z); + var normalized = math.normalize(skew); + Assert.Equal(Bits(skew.x * inverseLength), Bits(normalized.x)); + Assert.Equal(Bits(skew.y * inverseLength), Bits(normalized.y)); + Assert.Equal(Bits(skew.z * inverseLength), Bits(normalized.z)); + Assert.Equal(Bits(0.0f), Bits(math.length(float2.zero))); + Assert.Equal(Bits(0.0f), Bits(math.length(float3.zero))); + Assert.Equal(Bits(0.0f), Bits(math.length(float4.zero))); + Assert.Equal(Bits(0.0f), Bits(math.distance(new float3(1.0f, 2.0f, 3.0f), new float3(1.0f, 2.0f, 3.0f)))); + + // asuint(float) reinterprets the IEEE-754 bits. + Assert.Equal(0x80000000u, math.asuint(-0.0f)); + Assert.Equal(0x3FC00000u, math.asuint(1.5f)); + Assert.Equal(0x7FC00000u, math.asuint(BitConverter.Int32BitsToSingle(0x7FC00000))); + Assert.Equal(0, math.sign(float.NaN)); Assert.Equal(-1, math.sign(-0.5f)); Assert.Equal(new int3(-1, 0, 1), math.sign(new float3(-2.0f, 0.0f, 4.0f))); @@ -311,6 +338,43 @@ public sealed class HlslSemanticsTests Assert.Equal(new int4(5, 5, 5, 5), math.int4(5)); } + [Fact] + public void VectorConversionsFollowDxc() + { + // fptosi truncates toward zero; NaN and out-of-range inputs are undefined in DXIL and not pinned. + Assert.Equal(new int2(-1, 2), math.int2(new float2(-1.7f, 2.9f))); + Assert.Equal(new int3(0, 0, 3), new int3(new float3(-0.5f, 0.5f, 3.99f))); + Assert.Equal(new float4(1.0f, -2.0f, 3.0f, 0.0f), math.float4(new int4(1, -2, 3, 0))); + // Numeric to bool is `!= 0` (fcmp une for float, so NaN is true); bool to numeric is 0 or 1. + Assert.Equal(new bool2(true, false), math.bool2(new float2(float.NaN, -0.0f))); + Assert.Equal(new bool3(false, true, true), math.bool3(new int3(0, 5, -1))); + Assert.Equal(new float2(1.0f, 0.0f), math.float2(new bool2(true, false))); + Assert.Equal(new int4(0, 1, 1, 0), math.int4(new bool4(false, true, true, false))); + // intN(intN) is exact; it must not promote through float and lose 2^24 + 1. + Assert.Equal(new int2(16777217, -16777217), math.int2(new int2(16777217, -16777217))); + float2 splat = math.float2(0); + Assert.Equal(float2.zero, splat); + } + + [Fact] + public void FracAndIntegerClampFollowHlsl() + { + // frac(double) keeps double precision; a float frac of 1e9 + 0.25 would return 0. + Assert.Equal(0.25, math.frac(1.0e9 + 0.25)); + Assert.Equal(0.75, math.frac(-0.25)); + Assert.Equal(0.5f, math.frac(2.5f)); + + // IMin(IMax(x, a), b): the result stays int, and inverted bounds return b. + int clamped = math.clamp(7, -1, 3); + Assert.Equal(3, clamped); + Assert.Equal(-1, math.clamp(-5, -1, 3)); + Assert.Equal(0, math.clamp(1, 3, 0)); + Assert.Equal(new int2(0, 3), math.clamp(new int2(-4, 9), 0, 3)); + Assert.Equal(new int3(1, 2, 3), math.clamp(new int3(1, 2, 3), new int3(0, 0, 0), new int3(5, 5, 5))); + Assert.Equal(new int4(2, 2, 4, 4), math.clamp(new int4(1, 2, 5, 4), new int4(2), new int4(4))); + Assert.Equal(1.0f, math.clamp(2.0f, -1, 1)); + } + [Fact] public void MatrixMulFollowsHlslRowMajorConvention() { @@ -380,11 +444,12 @@ public sealed class HlslSemanticsTests } [Theory] - [InlineData(0.0f, 0.0f, 0.0f, -0.41219875f)] - [InlineData(0.25f, -0.5f, 1.75f, 0.5250269f)] - [InlineData(12.25f, -4.5f, 3.125f, 0.008141451f)] - [InlineData(-7.3f, 2.9f, 101.4f, 0.578015f)] - public void Snoise3MatchesUnityMathematicsReference(float x, float y, float z, float expected) + [InlineData(0.0f, 0.0f, 0.0f, 0.0f)] + [InlineData(1.25f, 1.25f, 1.25f, -0.245501652f)] + [InlineData(0.25f, -0.5f, 1.75f, 0.0492948629f)] + [InlineData(12.25f, -4.5f, 3.125f, 0.443114728f)] + [InlineData(-7.3f, 2.9f, 101.4f, -0.10221792f)] + public void Snoise3MatchesGoldenValues(float x, float y, float z, float expected) { Assert.Equal(expected, math.snoise(new float3(x, y, z)), precision: 5); } diff --git a/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs b/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs index ca4584c7..2c994be8 100644 --- a/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/HlslSourceCompatibilityTests.cs @@ -25,21 +25,95 @@ public sealed class HlslSourceCompatibilityTests Assert.NotNull(ShaderFunction(shader, "cultmath_snoise", typeof(float3))); Assert.NotNull(ShaderFunction(shader, "cultmath_snoise", typeof(float2))); Assert.NotNull(ShaderFunction(shader, "cultmath_value_noise_bicubic", typeof(float2))); + Assert.NotNull(ShaderFunction(shader, "cultmath_smin_grad", typeof(float4), typeof(float4), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_cellular", typeof(float3))); + var siteCells = shader.GetNestedType("CultSiteCells", BindingFlags.Public | BindingFlags.NonPublic)!; + Assert.NotNull(ShaderFunction(shader, "cultmath_power_score", typeof(float3), typeof(float4))); + Assert.NotNull(ShaderFunction(shader, "cultmath_multiplicative_score", typeof(float3), typeof(float4))); + Assert.NotNull(ShaderFunction(shader, "cultmath_site_cells_empty")); + Assert.NotNull(ShaderFunction(shader, "cultmath_site_cells_insert", siteCells, typeof(float4), typeof(int))); + Assert.NotNull(ShaderFunction(shader, "cultmath_site_cells_border", siteCells)); + Assert.NotNull(ShaderFunction(shader, "cultmath_gabriel_margin", typeof(float3), typeof(float3), typeof(float3))); + Assert.NotNull(ShaderFunction(shader, "cultmath_power_border_step", typeof(float3), typeof(float4), typeof(float4), typeof(float4))); + Assert.NotNull(ShaderFunction(shader, "cultmath_lattice_site", typeof(float2), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_lattice_weight", typeof(float), typeof(float), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_lattice_distance", typeof(float2), typeof(float2), typeof(float), typeof(float2), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_lattice_smooth_step", typeof(float), typeof(float), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_segment_closest", typeof(float2), typeof(float2), typeof(float2))); + Assert.NotNull(ShaderFunction(shader, "cultmath_distance_to_segment", typeof(float2), typeof(float2), typeof(float2))); + Assert.NotNull(ShaderFunction(shader, "cultmath_segment_closest", typeof(float3), typeof(float3), typeof(float3))); + Assert.NotNull(ShaderFunction(shader, "cultmath_distance_to_segment", typeof(float3), typeof(float3), typeof(float3))); + Assert.NotNull(ShaderFunction(shader, "cultmath_snoise_grad", typeof(float3))); + Assert.NotNull(ShaderFunction(shader, "cultmath_snoise_hessian", typeof(float3))); + Assert.NotNull(ShaderFunction(shader, "cultmath_integral_clamp_linear", typeof(float), typeof(float), typeof(float), typeof(float), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_fbm_grad", typeof(float3), typeof(int), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_ridged_grad", typeof(float3), typeof(int), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_phacelle", typeof(float3), typeof(float3), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_iv_snoise_ball", typeof(float3), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_iv_fbm_ball", typeof(float3), typeof(float), typeof(int), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_iv_snoise_ball", typeof(float2), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_af_snoise", typeof(float3), typeof(float3), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_af_fbm", typeof(float3), typeof(float3), typeof(float), typeof(int), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_af_frustum_ball", typeof(float2), typeof(float), typeof(float), typeof(float), typeof(float))); + var (spanPath, spanStage) = SpanTypes(shader); + Assert.NotNull(ShaderFunction(shader, "cultmath_span_fbm", spanPath, spanStage, typeof(int), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_span_ridged", spanPath, spanStage, typeof(int), typeof(float), typeof(float))); + Assert.NotNull(ShaderFunction(shader, "cultmath_span_stage", typeof(bool), spanPath, spanStage, typeof(int), typeof(float), typeof(float))); } + // The mirror's struct types are private nested types of HlslShader (a struct without a modifier). + private static (Type Path, Type Stage) SpanTypes(Type shader) => + (shader.GetNestedType("SpanPath", BindingFlags.Public | BindingFlags.NonPublic)!, shader.GetNestedType("SpanStage", BindingFlags.Public | BindingFlags.NonPublic)!); + // HLSL functions carry no access modifier, so they compile as private instance methods. private static MethodInfo? ShaderFunction(Type shader, string name, params Type[] parameters) => shader.GetMethod(name, BindingFlags.Instance | BindingFlags.NonPublic, null, parameters, null); - // Mirror internals with no public C# math counterpart. Any other cultmath_* function must match one. - private static readonly string[] MirrorOnly = { "cultmath_snoise_mod289", "cultmath_snoise_permute" }; - - private static readonly float[] Specials = { 0.0f, -0.0f, 1.0f, -1.0f, 0.5f, -2.75f, 3.0f, 1.0e-7f, 1.0e4f, -1.0e4f, 1.0e7f, float.NaN }; + // Shader constants with no C# twin of the same name (empty when every constant has one). + private static readonly string[] ConstantsWithoutTwin = { "CULTMATH_MAX_SITES" }; /// - /// Every mirror function with a C# math counterpart returns the same bits (any NaN equals any NaN; + /// Every static const of the compiled HLSL mirror (a static literal CULTMATH_* field, whatever its access) is the + /// same float32, bit for bit, as the math constant of the same name without the prefix (private ones + /// included), so a pin edited in one runtime and not the other fails here whichever constant it is. + /// A constant with neither a twin nor a listing in ConstantsWithoutTwin fails too. + /// + [Fact] + public void EveryShaderConstantEqualsItsCSharpTwin() + { + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shader = assembly!.GetType("CultMathHlsl.HlslShader")!; + var constants = shader.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static) + .Where(f => f.IsLiteral && f.FieldType == typeof(float) && f.Name.StartsWith("CULTMATH_", StringComparison.Ordinal)) + .ToArray(); + Assert.True(constants.Length >= 10, $"only {constants.Length} shader constants were found by reflection"); + foreach (var constant in constants) + { + var name = constant.Name["CULTMATH_".Length..]; + var twin = typeof(math).GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + if (twin is null) + { + Assert.True(ConstantsWithoutTwin.Contains(constant.Name), $"{constant.Name} has no math.{name} and is not listed in ConstantsWithoutTwin"); + continue; + } + + var shaderValue = (float)constant.GetRawConstantValue()!; + var mathValue = (float)twin.GetValue(null)!; + Assert.True(BitConverter.SingleToInt32Bits(shaderValue) == BitConverter.SingleToInt32Bits(mathValue), + $"{constant.Name} is {shaderValue:R} in the shader and math.{name} is {mathValue:R}"); + } + } + + // Special values every mirror argument takes: zeros, ties, negatives, large values, NaN and both infinities. + private static readonly float[] Specials = { 0.0f, -0.0f, 1.0f, -1.0f, 0.5f, -2.75f, 3.0f, 1.0e-7f, 1.0e4f, -1.0e4f, 1.0e7f, float.NaN, float.PositiveInfinity, float.NegativeInfinity }; + + /// + /// Every mirror function matches the math function of the same name, public or private (a function with no + /// twin fails, and nothing is exempt), with a struct parameter mapped by name and fields to the CultMath + /// type of the same name, and returns the same bits (any NaN equals any NaN; /// -0 differs from 0) over random inputs, every special value in every argument (ties, zeros, - /// negatives, NaN, large values, integer lattice points), special pairs, and vectors whose first two + /// negatives, NaN, infinities, large values, integer lattice points), special pairs, and vectors whose first two /// components tie (x0.x == x0.y in snoise). This proves the text of CultMath.hlsl computes the same /// float32 results as C# math on the CPU. It does not prove GPU agreement: driver sin precision alone /// makes cultmath_hash and value noise differ bit for bit on hardware. The mirror's intrinsics are C# @@ -62,48 +136,627 @@ public sealed class HlslSourceCompatibilityTests for (var k = 0; k < 64; k++) { var values = Enumerable.Range(0, 32).Select(_ => Next()).ToArray(); cases.Add(i => values[i]); } for (var k = 0; k < 16; k++) { var values = Enumerable.Range(0, 32).Select(_ => Next()).ToArray(); cases.Add(i => values[i & ~1]); } + // Distinct sites closer than 1e-2 (slots 3-6 are the owner and 7-10 the other site of + // cultmath_power_border_step): a length guard wider than "coincident" changes the result for these only. + for (var k = 0; k < 16; k++) + { + var values = Enumerable.Range(0, 32).Select(_ => Next()).ToArray(); + for (var c = 0; c < 3; c++) values[7 + c] = values[3 + c] + (random.NextSingle() * 2.0f - 1.0f) * 1.0e-3f; + values[7] += 2.0e-4f; + cases.Add(i => values[i]); + } + + // Points aimed squarely at cellular's HLSL mirror (F6/F3 Soul findings): the generic random + // and special-value cases above pass ~92 inputs through cultmath_cellular and never happen to + // hit a point where a radius-2 cell wins (about 3.5e-5 of points, Soul measured) or an + // integer point at or past 2^23, so an HLSL mutant of the search radius, the prune, or the + // removed F2=0 guard can survive this test even though it changes cellular's real output. + void AddPointCase(float3 point) + { + var values = new[] { point.x, point.y, point.z }; + cases.Add(i => i < values.Length ? values[i] : 0.0f); + } + + // The six constructed points from CellularAndSminGradTests.SearchReachesEveryAxisAlignedRadiusTwoSlice: + // each one realizes a different axis-aligned radius-2 offset as F1 or F2, which is exactly + // the case an `if (lowerBound >= f2)` prune written as `>= f1`, or a search radius narrowed on + // one axis (`dz < 2`, `dx` starting at -1), changes. + foreach (var offset in CellularAndSminGradTests.AxisAlignedRadiusTwoOffsets) + AddPointCase(CellularAndSminGradTests.FindPointRealizingOffset(offset)); + + // Integer points at 2^24, several, both signs: past |p| ~= 2^23 distinct cells' jittered + // features can round onto the same float32 value (design.md, "Precision domain"), making + // F2 = 0 reachable and exercising the grad2 = f2 > 0 ? ... : zero guard this test would + // otherwise never touch. + const float twoTo24 = 16777216.0f; + AddPointCase(new float3(twoTo24, twoTo24, twoTo24)); + AddPointCase(new float3(-twoTo24, -twoTo24, -twoTo24)); + AddPointCase(new float3(twoTo24 + 3.0f, -twoTo24 + 5.0f, twoTo24 - 7.0f)); + AddPointCase(new float3(-twoTo24 + 11.0f, twoTo24 - 13.0f, -twoTo24 + 17.0f)); + + // One exact F1 = F2 tie point: the midpoint of two adjacent cells' feature points is + // bit-exact-equidistant from both by construction (negating a vector does not change its + // length, and p - a = -(p - b) here by symmetry), without needing to search for one. + var tieMidpoint = (CellularAndSminGradTests.FeaturePoint(new float3(0.0f, 0.0f, 0.0f)) + + CellularAndSminGradTests.FeaturePoint(new float3(1.0f, 0.0f, 0.0f))) * 0.5f; + AddPointCase(tieMidpoint); + var mismatches = new List(); var compared = new HashSet(); - foreach (var mirror in shaderType.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).Where(m => m.Name.StartsWith("cultmath_"))) + foreach (var mirror in shaderType.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).Where(m => m.Name.StartsWith("cultmath_") && !m.GetParameters().Any(p => p.ParameterType.IsArray))) { var types = mirror.GetParameters().Select(p => p.ParameterType).ToArray(); - var counterpart = typeof(math).GetMethod(mirror.Name["cultmath_".Length..], BindingFlags.Public | BindingFlags.Static, null, types, null); - if (counterpart is null) - { - Assert.Contains(mirror.Name, MirrorOnly); - continue; - } + var counterpart = Twin(shaderType, mirror.Name["cultmath_".Length..], types); + Assert.True(counterpart is not null, $"{mirror.Name} has no C# math function of the same name and parameter types, public or private"); compared.Add(mirror.Name); foreach (var input in cases) { var slot = 0; - var args = types.Select(t => t == typeof(float) ? (object)input(slot++) - : Activator.CreateInstance(t, Enumerable.Range(0, Components(t)).Select(_ => (object)input(slot++)).ToArray())!).ToArray(); - var expected = Floats(counterpart.Invoke(null, args)!); - var actual = Floats(mirror.Invoke(shader, args)!); - if (expected.Length != actual.Length || expected.Zip(actual).Any(p => !(float.IsNaN(p.First) && float.IsNaN(p.Second)) - && BitConverter.SingleToInt32Bits(p.First) != BitConverter.SingleToInt32Bits(p.Second))) + var args = types.Select(t => Build(t, () => input(slot++))).ToArray(); + var expected = Values(counterpart!.Invoke(null, args.Select(a => CopyFields(a, TwinType(shaderType, a.GetType())!)).ToArray())!); + var actual = Values(mirror.Invoke(shader, args)!); + if (!BitwiseEqual(expected, actual)) { - mismatches.Add($"{mirror.Name}({string.Join(", ", args.Select(a => string.Join(" ", Floats(a))))}): C# {string.Join(" ", expected)}, mirror {string.Join(" ", actual)}"); + mismatches.Add($"{mirror.Name}({string.Join(", ", args.Select(a => string.Join(" ", Values(a).Select(v => v.Value))))}): C# {string.Join(" ", expected.Select(v => v.Value))}, mirror {string.Join(" ", actual.Select(v => v.Value))}"); } } } Assert.True(mismatches.Count == 0, $"{mismatches.Count} mismatches:{Environment.NewLine}{string.Join(Environment.NewLine, mismatches.Take(12))}"); - Assert.Equal(26, compared.Count); + // The three site-array functions are compared by SiteArrayMirrorsMatchCSharp, which draws their counts and arrays. + Assert.Equal(140, compared.Count); } - private static int Components(Type t) => t.GetFields().Count(f => f.FieldType == typeof(float) && !f.IsStatic); - - private static float[] Floats(object value) => value is float f ? new[] { f } - : value.GetType().GetFields().Where(field => field.FieldType == typeof(float) && !field.IsStatic).Select(field => (float)field.GetValue(value)!).ToArray(); - - /// The documented HLSL-to-C# transformations, and nothing else. - internal static string TransformHlslToCSharp(string hlsl) + /// + /// The shader functions that take a site array and a count are bit-equal to C#'s span functions on the same + /// arguments: at least 64 compared cases each, counts 0 to the capacity with filler after the count (a loop bound that + /// ignores the count reads it), the lattice at rings up to 17. A case C# refuses is skipped and counted. + /// + [Fact] + public void SiteArrayMirrorsMatchCSharp() { - // 1. Include guards (#ifndef/#define/#endif) are dropped; C# has no textual include. - var source = Regex.Replace(hlsl, @"(?m)^\s*#(ifndef|define|endif)\b.*$", string.Empty); + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + Assert.Equal(17, SiteArrays.FarPoints[0].Ring); + Assert.All(SiteArrays.FarPoints, far => Assert.InRange(far.Ring, 8, LatticeMaxRing)); + + var draws = new (string Name, Func Draw)[] + { + ("power_border", SiteArrays.PowerBorderArguments), + ("lattice_cell_distance", SiteArrays.LatticeCellDistanceArguments), + ("weighted_lattice_cells", SiteArrays.LatticeArguments), + }; + foreach (var (name, draw) in draws) + { + var mirror = shaderType.GetMethod("cultmath_" + name, BindingFlags.Instance | BindingFlags.NonPublic)!; + var twin = typeof(SiteArrays).GetMethod(name, BindingFlags.Static | BindingFlags.NonPublic)!; + Assert.Equal(twin.GetParameters().Select(p => p.ParameterType), mirror.GetParameters().Select(p => p.ParameterType)); + var random = new System.Random(0x517E); + int compared = 0, refused = 0; + for (var i = 0; i < 160; i++) + { + var args = draw(random); + object expected; + try { expected = twin.Invoke(null, args)!; } + catch (TargetInvocationException e) when (e.InnerException is ArgumentException) { refused++; continue; } + var actual = Values(mirror.Invoke(shader, args)!); + Assert.True(BitwiseEqual(Values(expected), actual), + $"{name} case {i}: C# {string.Join(" ", Values(expected).Select(v => v.Value))}, mirror {string.Join(" ", actual.Select(v => v.Value))}"); + compared++; + } + + Assert.True(compared >= 64, $"{name} compared only {compared} cases ({refused} refused)"); + } + } + + /// A consumer defines CULTMATH_MAX_SITES before including the library; the mirror compiles with the capacity changed. + [Fact] + public void TheSiteCapacityIsOverridable() + { + var (assembly, errors) = CompileShaderMirror(defines: new Dictionary { ["CULTMATH_MAX_SITES"] = 4 }); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + Assert.Equal(4, (int)shaderType.GetField("CULTMATH_MAX_SITES", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)!.GetRawConstantValue()!); + var sites = new[] { new float4(0, 0, 0, 1), new float4(10, 0, 0, 1), new float4(0, 10, 0, 2), new float4(-10, 0, 0, 1) }; + var border = (float4)shaderType.GetMethod("cultmath_power_border", BindingFlags.Instance | BindingFlags.NonPublic)!.Invoke(Activator.CreateInstance(shaderType), new object[] { new float3(1, 1, 0), sites, 4 })!; + Assert.Equal(power_border(new float3(1, 1, 0), sites), border); + } + + /// + /// The 1500 arguments (a, b, lo, hi, t0, t1) at which integral_clamp_linear's zero-length rule, its lo + /// normalisation and its infinite bounds all bite: a in {-2.5, 0, 1.5}, b in {-1.5, -0, 0, 2}, lo in + /// {-inf, -1, 0.5, 3, +inf}, hi in {-inf, -0.5, 1, 4, +inf}, and (t0, t1) in {(0, 0), (1.25, 1.25), (-1, 2), + /// (2, -1), (0, 1e-30)}. One spelling, read by the mirror grid test and by the GLSL clamp shadow test. + /// + internal static IReadOnlyList IntegralClampLinearEdgeGrid { get; } = BuildIntegralClampLinearEdgeGrid(); + + private static List BuildIntegralClampLinearEdgeGrid() + { + var inf = float.PositiveInfinity; + var grid = new List(); + foreach (var a in new[] { -2.5f, 0.0f, 1.5f }) + foreach (var b in new[] { -1.5f, -0.0f, 0.0f, 2.0f }) + foreach (var lo in new[] { -inf, -1.0f, 0.5f, 3.0f, inf }) + foreach (var hi in new[] { -inf, -0.5f, 1.0f, 4.0f, inf }) + foreach (var (t0, t1) in new[] { (0.0f, 0.0f), (1.25f, 1.25f), (-1.0f, 2.0f), (2.0f, -1.0f), (0.0f, 1.0e-30f) }) + grid.Add(new[] { a, b, lo, hi, t0, t1 }); + return grid; + } + + /// + /// The edge grid followed by the committed GLSL fixture's cases of the three integral_clamp_linear families + /// (GlslMirrorTests.IntegralClampLinearFixtureCases, decoded): one list, read by the mirror test and by the + /// clamp-shadow test. The grid fixes a in {-2.5, 0, 1.5}, so a guard keyed on a past 1.75 hides from it + /// (Soul s4); the fixture's random a in [-4, 4] closes that. + /// + internal static IReadOnlyList IntegralClampLinearCases => IntegralClampLinearEdgeGrid.Concat(GlslMirrorTests.IntegralClampLinearFixtureCases).ToArray(); + + /// + /// The compiled mirror's cultmath_integral_clamp_linear returns C#'s bits on every edge case (the grid and + /// the fixture's cases), and C#'s result is never NaN there. The generic case set catches each of the function's guards (the held and + /// kept stretch guards, the flat branch's zero-length guard) only by its rotation: with the kept guard + /// removed it finds 0 mismatches, with the held guard removed 1 once infinities join the specials, and the + /// edge grid finds 246 for either every time. + /// + [Fact] + public void IntegralClampLinearMirrorMatchesCSharpOnTheEdgeCases() + { + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var mirror = ShaderFunction(shaderType, "cultmath_integral_clamp_linear", Enumerable.Repeat(typeof(float), 6).ToArray())!; + + var mismatches = new List(); + var cases = IntegralClampLinearCases; + foreach (var c in cases) + { + var expected = integral_clamp_linear(c[0], c[1], c[2], c[3], c[4], c[5]); + var actual = (float)mirror.Invoke(shader, c.Cast().ToArray())!; + Assert.False(float.IsNaN(expected), $"C# returns NaN at ({string.Join(", ", c)})"); + if (BitConverter.SingleToInt32Bits(expected) != BitConverter.SingleToInt32Bits(actual)) + mismatches.Add($"({string.Join(", ", c)}): C# {expected:R}, mirror {actual:R}"); + } + + Assert.True(mismatches.Count == 0, $"{mismatches.Count} of {cases.Count} cases differ:{Environment.NewLine}{string.Join(Environment.NewLine, mismatches.Take(12))}"); + } + + /// + /// At a SpanStage the shader has no identity constant for, so C#'s identity (copied field by field) is the + /// argument: the mirror's cultmath_span_fbm and cultmath_span_ridged return the field of the mirror's own + /// cultmath_fbm_grad and cultmath_ridged_grad, bit for bit, for 0 to 20 octaves over random and simplex-tie + /// points. The shader-side statement of math.SpanStage.Identity (design decision a: no shader identity). + /// + [Fact] + public void SpanStagesAtIdentityAreFbmAndRidgedInTheMirror() + { + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var (pathType, stageType) = SpanTypes(shaderType); + var spanArguments = new[] { pathType, stageType, typeof(int), typeof(float), typeof(float) }; + var pairs = new[] + { + (Span: ShaderFunction(shaderType, "cultmath_span_fbm", spanArguments)!, Plain: ShaderFunction(shaderType, "cultmath_fbm_grad", typeof(float3), typeof(int), typeof(float), typeof(float))!), + (Span: ShaderFunction(shaderType, "cultmath_span_ridged", spanArguments)!, Plain: ShaderFunction(shaderType, "cultmath_ridged_grad", typeof(float3), typeof(int), typeof(float), typeof(float))!), + }; + var identity = CopyFields(SpanStage.Identity, stageType); + + var random = new System.Random(0x57A6E2); + var compared = 0; + foreach (var p in SpanStageTests.Points(random)) + { + var octaves = random.Next(0, 21); + var lacunarity = 1.4f + 1.2f * random.NextSingle(); + var gain = 0.3f + 0.5f * random.NextSingle(); + var path = CopyFields(new SpanPath { midpoint = p, velocity = new float3(0.6f, 0.0f, 0.8f), speed = 1.0f, acceleration = 0.5f, halfLength = 0.25f }, pathType); + foreach (var (span, plain) in pairs) + { + var field = FieldOf(span.Invoke(shader, new object[] { path, identity, octaves, lacunarity, gain })!, "field"); + var expected = plain.Invoke(shader, new object[] { p, octaves, lacunarity, gain })!; + Assert.True(BitwiseEqual(Values(expected), Values(field)), $"{span.Name} at {p}, {octaves} octaves: {string.Join(" ", Values(field).Select(v => v.Value))} is not {plain.Name} {string.Join(" ", Values(expected).Select(v => v.Value))}"); + compared++; + } + } + + Assert.True(compared >= 460, $"only {compared} identity comparisons ran"); + } + + /// + /// The generic comparison draws every argument from [-100, 100] (and specials), where the octave loop's + /// frequency, stretch and span terms saturate: 0 or 16 octaves, a Hessian bound pinned at its global value. + /// This sweep draws SpanStageTests' realistic stages and spans (4000, one in four with a zero axis, one in + /// four with a point span, halfLength 0), both stages, and the mirror must return C#'s bits for the whole + /// SpanNoise. Each of stretched and unstretched stages, and of positive and zero fold, must be met at least + /// 500 times, or the sweep proves nothing about that branch. + /// + [Fact] + public void SpanStageMirrorMatchesCSharpBitForBitOnRealisticSpans() + { + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var (pathType, stageType) = SpanTypes(shaderType); + var spanArguments = new[] { pathType, stageType, typeof(int), typeof(float), typeof(float) }; + var mirrors = new[] { ShaderFunction(shaderType, "cultmath_span_fbm", spanArguments)!, ShaderFunction(shaderType, "cultmath_span_ridged", spanArguments)! }; + + var random = new System.Random(0x5EED4); + float Next(float extent) => (random.NextSingle() * 2.0f - 1.0f) * extent; + int stretched = 0, unstretched = 0, folded = 0, flat = 0; + for (var i = 0; i < 4000; i++) + { + var drawn = SpanStageTests.Stage.Draw(random); + var stage = drawn.S; + if (i % 4 == 1) + stage.axis = new float3(0.0f, 0.0f, 0.0f); + var halfLength = i % 4 == 2 ? 0.0f : new[] { 0.02f, 0.1f, 0.5f, 2.0f }[random.Next(4)]; + var span = SpanStageTests.Span.Draw(random, new float3(Next(30.0f), Next(30.0f), Next(30.0f)), halfLength, random.NextSingle() * 2.0f); + var arguments = new object[] { CopyFields(span.Path, pathType), CopyFields(stage, stageType), drawn.Octaves, drawn.Lacunarity, drawn.Gain }; + if (dot(stage.axis, stage.axis) > 0.0f && stage.stretch != 1.0f) + stretched++; + else + unstretched++; + for (var m = 0; m < 2; m++) + { + var expected = m == 0 ? span_fbm(span.Path, stage, drawn.Octaves, drawn.Lacunarity, drawn.Gain) : span_ridged(span.Path, stage, drawn.Octaves, drawn.Lacunarity, drawn.Gain); + var actual = mirrors[m].Invoke(shader, arguments)!; + Assert.True(BitwiseEqual(Values(expected), Values(actual)), + $"{mirrors[m].Name} differs from C# at midpoint {span.Path.midpoint}, halfLength {halfLength:R}, {drawn.Octaves} octaves: C# {string.Join(" ", Values(expected).Select(v => v.Value))}, mirror {string.Join(" ", Values(actual).Select(v => v.Value))}"); + if (m == 1 && expected.fold > 0.0f) + folded++; + else if (m == 1) + flat++; + } + } + + Assert.True(stretched >= 500 && unstretched >= 500 && folded >= 500 && flat >= 500, + $"the sweep meets a branch too rarely: stretched {stretched}, unstretched {unstretched}, fold > 0 {folded}, fold = 0 {flat} of 4000"); + } + + /// + /// The generic comparison above passes about a hundred inputs through cultmath_phacelle, and + /// its prune only changes an output for the rare cell whose weight is nonzero but whose lower + /// bound sits just under the 2.25 cut (Soul's F6 lesson for cellular): a mirror whose cut is 2.0 + /// survives a hundred inputs. A dense sweep of realistic arguments closes that gap. + /// + [Fact] + public void PhacelleMirrorMatchesCSharpBitForBitAcrossADenseSweep() + { + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var mirror = ShaderFunction(shaderType, "cultmath_phacelle", typeof(float3), typeof(float3), typeof(float), typeof(float))!; + + var random = new System.Random(0x5EED2); + float Next(float extent) => (random.NextSingle() * 2.0f - 1.0f) * extent; + for (var i = 0; i < 20000; i++) + { + var p = new float3(Next(50.0f), Next(50.0f), Next(50.0f)); + var side = new float3(Next(9.0f), Next(9.0f), Next(9.0f)); + var offset = random.NextSingle(); + var normalization = random.NextSingle(); + var expected = Values(phacelle(p, side, offset, normalization)); + var actual = Values(mirror.Invoke(shader, new object[] { p, side, offset, normalization })!); + Assert.True(BitwiseEqual(expected, actual), $"mirror differs from C# at p = {p}, side = {side}"); + } + } + + /// + /// The generic comparison draws centre, axis and radius from [-100, 100], where the reach is far past the + /// 0.15 or so below which cultmath_af_snoise's centred form is the narrower one, so an HLSL edit + /// of the choice between the centred and the Lipschitz form (a threshold, a reordered sum) survives it. + /// This sweep draws realistic slices (axis and radius log-uniform in 1e-3 to 0.5, the reach of a tile + /// near a camera), which land on both sides of the choice and next to it, for cultmath_af_snoise + /// and cultmath_af_fbm. + /// + [Fact] + public void AffineSnoiseMirrorMatchesCSharpBitForBitOnBothSidesOfItsBranch() + { + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var snoiseMirror = ShaderFunction(shaderType, "cultmath_af_snoise", typeof(float3), typeof(float3), typeof(float))!; + var fbmMirror = ShaderFunction(shaderType, "cultmath_af_fbm", typeof(float3), typeof(float3), typeof(float), typeof(int), typeof(float), typeof(float))!; + + var random = new System.Random(0x5EED3); + float Next(float extent) => (random.NextSingle() * 2.0f - 1.0f) * extent; + float Reach() => 1.0e-3f * MathF.Pow(500.0f, random.NextSingle()); + int centred = 0, lipschitz = 0; + for (var i = 0; i < 20000; i++) + { + var centre = new float3(Next(50.0f), Next(50.0f), Next(50.0f)); + var axis = normalize(new float3(Next(1.0f), Next(1.0f), Next(1.0f))) * Reach(); + var radius = Reach(); + var expected = af_snoise(centre, axis, radius); + var actual = Values(snoiseMirror.Invoke(shader, new object[] { centre, axis, radius })!); + Assert.True(BitwiseEqual(Values(expected), actual), $"cultmath_af_snoise differs from C# at centre = {centre}, axis = {axis}, radius = {radius}"); + if (expected.y != 0.0f) + centred++; + else + lipschitz++; + + if (i % 8 == 0) + { + var fbmExpected = Values(af_fbm(centre, axis, radius, 4, 2.0f, 0.5f)); + var fbmActual = Values(fbmMirror.Invoke(shader, new object[] { centre, axis, radius, 4, 2.0f, 0.5f })!); + Assert.True(BitwiseEqual(fbmExpected, fbmActual), $"cultmath_af_fbm differs from C# at centre = {centre}, axis = {axis}, radius = {radius}"); + } + } + + Assert.True(centred > 2000 && lipschitz > 2000, $"the sweep meets one branch too rarely: centred {centred}, Lipschitz {lipschitz} of 20000"); + } + + /// + /// The generic comparison stops at 1e7, so an HLSL edit of cultmath_af_range's NaN test that + /// misreads the finite values near the float maximum (or an overflowed endpoint) survives it. Forms + /// from zero to the float maximum, infinite and NaN components, both signs, in every slot: the mirror + /// returns C#'s bits, and neither endpoint is ever NaN. + /// + [Fact] + public void AffineRangeMirrorMatchesCSharpBitForBitAtTheFloatExtremes() + { + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var mirror = ShaderFunction(shaderType, "cultmath_af_range", typeof(float3))!; + + var magnitudes = new[] { 0.0f, 1.0f, 1.0e30f, 1.0e38f, float.MaxValue / 2.0f, float.MaxValue, float.PositiveInfinity, float.NaN }; + var values = magnitudes.Concat(magnitudes.Where(m => !float.IsNaN(m)).Select(m => -m)).ToArray(); + foreach (var x0 in values) + foreach (var a in values) + foreach (var e in values) + { + var form = new float3(x0, a, e); + var expected = af_range(form); + var actual = Values(mirror.Invoke(shader, new object[] { form })!); + Assert.True(BitwiseEqual(Values(expected), actual), $"cultmath_af_range differs from C# at {form}"); + Assert.False(float.IsNaN(expected.x) || float.IsNaN(expected.y), $"af_range({form}) is {expected}, a NaN endpoint"); + } + } + + /// + /// The dense sweep almost never meets a cell whose box bound is just under the 2.25 cut and whose + /// weight is still nonzero: a mirror cut of 2.245, 2.24 or 2.2 survives it. These points sit next + /// to such cells (), so the mirror must match C# bit for + /// bit, and must match the unpruned C# sum (the shader has no prune switch, so that is the + /// independent statement that the cut is exact). + /// + [Fact] + public void PhacelleMirrorMatchesCSharpBitForBitNextToCellsJustInsideTheCut() + { + var (assembly, errors) = CompileShaderMirror(); + Assert.True(assembly is not null, string.Join(Environment.NewLine, errors)); + var shaderType = assembly!.GetType("CultMathHlsl.HlslShader")!; + var shader = Activator.CreateInstance(shaderType); + var mirror = ShaderFunction(shaderType, "cultmath_phacelle", typeof(float3), typeof(float3), typeof(float), typeof(float))!; + + foreach (var p in PhacelleTests.PruneCutPoints) + { + Assert.True(PhacelleTests.HasCellJustInsideTheCut(p), $"no cell just inside the cut at {p}"); + var actual = Values(mirror.Invoke(shader, new object[] { p, PhacelleTests.PruneCutSide, PhacelleTests.PruneCutOffset, PhacelleTests.PruneCutNormalization })!); + var pruned = Values(phacelle(p, PhacelleTests.PruneCutSide, PhacelleTests.PruneCutOffset, PhacelleTests.PruneCutNormalization)); + var unpruned = Values(phacelle(p, PhacelleTests.PruneCutSide, PhacelleTests.PruneCutOffset, PhacelleTests.PruneCutNormalization, false)); + Assert.True(BitwiseEqual(pruned, actual), $"mirror differs from C# at p = {p}"); + Assert.True(BitwiseEqual(unpruned, actual), $"mirror differs from the unpruned C# sum at p = {p}"); + } + } + + /// + /// A hand-built pair of structs standing in for a mirror struct return and its C# counterpart + /// (invariant 8's one struct return shape, e.g. ): same field shape, + /// different concrete type, exactly like the real mirror comparison. Proves the field-by-field, + /// bit-for-bit walk actually rejects a struct whose field differs; without this, the walk could + /// have been comparing lengths only, or skipping the nested vector's own components. + /// + private struct StructMirrorProbeExpected { public float4 first; public float second; } + private struct StructMirrorProbeActual { public float4 first; public float second; } + + [Fact] + public void StructReturnComparisonRejectsAMismatchedField() + { + var expected = new StructMirrorProbeExpected { first = new float4(1.0f, 2.0f, 3.0f, 4.0f), second = 5.0f }; + var matching = new StructMirrorProbeActual { first = new float4(1.0f, 2.0f, 3.0f, 4.0f), second = 5.0f }; + var mismatchedLeaf = new StructMirrorProbeActual { first = new float4(1.0f, 2.0f, 3.0f, 4.0f), second = 5.5f }; + var mismatchedNestedComponent = new StructMirrorProbeActual { first = new float4(1.0f, 2.0f, -3.0f, 4.0f), second = 5.0f }; + + Assert.True(BitwiseEqual(Values(expected), Values(matching))); + Assert.False(BitwiseEqual(Values(expected), Values(mismatchedLeaf))); + Assert.False(BitwiseEqual(Values(expected), Values(mismatchedNestedComponent))); + } + + /// + /// Struct shapes standing in for CultCellular's own field order (nearest; edge; id), used + /// to falsify two named mutants (F2): H2 declares the mirror struct with its first two fields + /// swapped (edge; nearest; id) and swaps the assignments to match, so every leaf VALUE + /// still lands in the same POSITION as the correct struct; only the field NAME at each position + /// differs. H3 renames and retypes every field (id becomes an int carrying the same bits) while + /// keeping the original position order, so only NAME and TYPE differ, never position. + /// + private struct NearestEdgeIdExpected { public float4 nearest; public float4 edge; public float id; } + private struct EdgeNearestIdSwappedNames { public float4 edge; public float4 nearest; public float id; } + private struct RenamedAndRetypedFields { public float4 a; public float4 b; public int c; } + + [Fact] + public void StructReturnComparisonRejectsFieldsSwappedByNameEvenWhenValuesAlign() + { + // H2: the mutant struct's field ORDER is (edge, nearest, id), and its assignments are + // swapped to match, so declaration-position values are identical to the correct struct's. + // Only checking names (not just position) can tell these apart. + var expected = new NearestEdgeIdExpected + { + nearest = new float4(1.0f, 2.0f, 3.0f, 4.0f), + edge = new float4(5.0f, 6.0f, 7.0f, 8.0f), + id = 9.0f, + }; + var swapped = new EdgeNearestIdSwappedNames + { + edge = new float4(1.0f, 2.0f, 3.0f, 4.0f), // holds what should be "nearest"'s value. + nearest = new float4(5.0f, 6.0f, 7.0f, 8.0f), // holds what should be "edge"'s value. + id = 9.0f, + }; + + Assert.False(BitwiseEqual(Values(expected), Values(swapped))); + } + + [Fact] + public void StructReturnComparisonRejectsRenamedAndRetypedFields() + { + // H3: field order matches the correct struct exactly, but every field is renamed, and id is + // retyped from float to int carrying the same bit pattern the correct id would round to. + var expected = new NearestEdgeIdExpected + { + nearest = new float4(1.0f, 2.0f, 3.0f, 4.0f), + edge = new float4(5.0f, 6.0f, 7.0f, 8.0f), + id = 9.0f, + }; + var renamed = new RenamedAndRetypedFields + { + a = new float4(1.0f, 2.0f, 3.0f, 4.0f), + b = new float4(5.0f, 6.0f, 7.0f, 8.0f), + c = BitConverter.SingleToInt32Bits(9.0f), + }; + + Assert.False(BitwiseEqual(Values(expected), Values(renamed))); + } + + // Integer arguments take the bit pattern of the float input, so specials become 0, 0x80000000, NaN bits, ... + // A bool argument is true when its float input is positive. + private static readonly Type[] Scalars = { typeof(float), typeof(int), typeof(uint), typeof(bool) }; + + private static object Scalar(Type t, float f) => t == typeof(float) ? f + : t == typeof(bool) ? f > 0.0f + : t == typeof(int) ? BitConverter.SingleToInt32Bits(f) : (object)(uint)BitConverter.SingleToInt32Bits(f); + + private static FieldInfo[] InstanceFields(Type t) => t.GetFields(BindingFlags.Public | BindingFlags.Instance); + + // One function ARGUMENT from the case's scalars, in field order: a scalar from its float, a vector by the + // constructor taking its scalar fields, a struct field by field, recursively. + private static object Build(Type t, Func next) + { + if (Scalars.Contains(t)) + return Scalar(t, next()); + var fields = InstanceFields(t); + var constructor = t.GetConstructor(fields.Select(f => f.FieldType).ToArray()); + if (constructor is not null) + return constructor.Invoke(fields.Select(f => Build(f.FieldType, next)).ToArray()); + var value = Activator.CreateInstance(t)!; + foreach (var field in fields) + field.SetValue(value, Build(field.FieldType, next)); + return value; + } + + // The CultMath type a mirror parameter type stands for: itself, or for a type nested in HlslShader the + // CultMath type of the same name, only if both have the same instance fields by name, type (mapped + // likewise) and order. Null when there is no such twin. + private static Type? TwinType(Type shaderType, Type mirror) + { + if (mirror.DeclaringType != shaderType) + return mirror; + var twin = typeof(math).Assembly.GetType("CultMath." + mirror.Name); + if (twin is null) + return null; + var mine = InstanceFields(mirror); + var theirs = InstanceFields(twin); + return mine.Length == theirs.Length && mine.Zip(theirs).All(p => p.First.Name == p.Second.Name && TwinType(shaderType, p.First.FieldType) == p.Second.FieldType) ? twin : null; + } + + // The math function of the mirror function's name, with its parameter types mapped, public or private. + private static MethodInfo? Twin(Type shaderType, string name, Type[] mirrorTypes) + { + var types = mirrorTypes.Select(t => TwinType(shaderType, t)).ToArray(); + return types.Any(t => t is null) ? null + : typeof(math).GetMethod(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static, null, types!, null); + } + + // A struct value as another struct type of the same fields by name: itself when the type is the same. + private static object CopyFields(object source, Type target) + { + if (source.GetType() == target) + return source; + var copy = Activator.CreateInstance(target)!; + foreach (var field in InstanceFields(target)) + field.SetValue(copy, CopyFields(source.GetType().GetField(field.Name)!.GetValue(source)!, field.FieldType)); + return copy; + } + + private static object FieldOf(object value, string name) => value.GetType().GetField(name)!.GetValue(value)!; + + /// + /// One flattened scalar leaf of a (possibly nested) return value: its declaration path (field + /// names joined by '.'), its declared type, and its value. Carrying path and type, not just the + /// value, is what lets the struct-return comparison reject a field that was renamed or retyped + /// but landed in the same position (F2): a positional-only comparison cannot tell "edge" holding + /// nearest's value apart from "nearest" holding it. + /// + private readonly record struct Leaf(string Path, Type Type, object Value); + + /// + /// Flattens a return value to its scalar leaves, recursing through struct fields of any type + /// (invariant 8's one struct return shape, e.g. 's float4/float4/float + /// fields) so a struct return is compared field by field, down to bit-for-bit scalars, exactly + /// like a bare vector return already is. Each leaf keeps the field name (and its ancestors') and + /// declared type it was read from. + /// + private static Leaf[] Values(object value, string path = "") => Scalars.Contains(value.GetType()) + ? new[] { new Leaf(path, value.GetType(), value) } + : value is float3x3 matrix + ? new[] { matrix._m00, matrix._m01, matrix._m02, matrix._m10, matrix._m11, matrix._m12, matrix._m20, matrix._m21, matrix._m22 } + .Select((entry, k) => new Leaf((path.Length == 0 ? "" : path + ".") + "_m" + k / 3 + k % 3, typeof(float), entry)).ToArray() + : value.GetType().GetFields().Where(f => !f.IsStatic) + .SelectMany(f => Values(f.GetValue(value)!, path.Length == 0 ? f.Name : path + "." + f.Name)) + .ToArray(); + + // Compares leaves by NAME and TYPE as well as value, in declaration order, so a mirror struct + // whose fields are reordered, renamed, or retyped relative to its C# counterpart fails here even + // when the flattened values happen to line up positionally (F2's H2/H3 mutants). + private static bool BitwiseEqual(Leaf[] expected, Leaf[] actual) => + expected.Length == actual.Length && expected.Zip(actual).All(p => + p.First.Path == p.Second.Path && p.First.Type == p.Second.Type && + (p.First.Value is float a && p.Second.Value is float b + ? (float.IsNaN(a) && float.IsNaN(b)) || BitConverter.SingleToInt32Bits(a) == BitConverter.SingleToInt32Bits(b) + : p.First.Value.Equals(p.Second.Value))); + + /// + /// The text of CultMath.hlsl with each #include "name" replaced in place by the + /// included file from the same directory, as the shader compiler would resolve it. Only the + /// package's own includes exist, so a missing file is an error rather than a skip. An include for + /// which returns false is dropped with its line instead (the GLSL + /// lowering's separately licensed files); the C# mirror inlines every one. + /// + internal static string ReadShaderSource(string cultMathRoot, Func? inline = null) + { + var shaders = Path.Combine(cultMathRoot, "shaders"); + return Regex.Replace(File.ReadAllText(Path.Combine(shaders, "CultMath.hlsl")), @"(?m)^#include ""([^""]+)""[ \t]*\r?$(\n?)", + match => inline is null || inline(match.Groups[1].Value) + ? File.ReadAllText(Path.Combine(shaders, match.Groups[1].Value)) + match.Groups[2].Value + : string.Empty); + } + + /// + /// The text without its include-guard lines. A capacity macro (#ifndef X, #define X n, #endif, a + /// consumer-overridable default) is not a guard: gives the text it becomes, from its name and value. + /// + internal static string DropGuards(string source, Func capacity) => + Regex.Replace(source, @"(?m)^#ifndef (CULTMATH_MAX_\w+)\r?\n#define \1 (\d+)\r?\n#endif[ \t]*$|^[ \t]*#(ifndef|define|endif)\b.*$", + match => match.Groups[1].Success ? capacity(match.Groups[1].Value, match.Groups[2].Value) : string.Empty); + + /// + /// The documented HLSL-to-C# transformations, and nothing else. is C# source a + /// test supplies, placed first in the class body: it is not a transformation of the HLSL. + /// + internal static string TransformHlslToCSharp(string hlsl, string members = "", IReadOnlyDictionary? defines = null) + { + // 1. Include guards (#ifndef/#define/#endif) are dropped; C# has no textual include. A capacity macro + // (#ifndef X, #define X n, #endif) becomes `const int X = n;`, or the value a test defines for X. + var source = DropGuards(hlsl, (name, value) => $"const int {name} = {(defines is not null && defines.TryGetValue(name, out var defined) ? defined : value)};"); // 2. Functions taking Texture2D/SamplerState resources are dropped; GPU resources have // no CultMath analog. @@ -115,14 +768,26 @@ public sealed class HlslSourceCompatibilityTests // 4. Floating literals gain the `f` suffix; an unsuffixed C# literal is a double. source = Regex.Replace(source, @"(? + m.Groups[1].Value + Regex.Replace(m.Groups[2].Value, @"(?m)^(\s*)(\w+\s+\w+;)", "$1public $2") + m.Groups[3].Value); + + // 6. An array parameter `T name[N]` becomes `T[] name`; the mirror takes the array whole and the count beside it. + source = Regex.Replace(source, @"\b(\w+) (\w+)\[CULTMATH_MAX_\w+\]", "$1[] $2"); + + // 7. The file body is wrapped in a class; C# has no free functions. + return "using CultMath;\nusing static CultMath.math;\nnamespace CultMathHlsl;\npublic class HlslShader\n{\n" + members + source + "\n}\n"; } - private static (Assembly? Assembly, IReadOnlyList Errors) CompileShaderMirror() + internal static (Assembly? Assembly, IReadOnlyList Errors) CompileShaderMirror(string members = "", IReadOnlyDictionary? defines = null, Func? mutate = null) { - var hlsl = File.ReadAllText(Path.Combine(FindCultMathRoot(), "shaders", "CultMath.hlsl")); - var tree = CSharpSyntaxTree.ParseText(TransformHlslToCSharp(hlsl)); + var hlsl = ReadShaderSource(FindCultMathRoot()); + if (mutate is not null) + hlsl = mutate(hlsl); + var tree = CSharpSyntaxTree.ParseText(TransformHlslToCSharp(hlsl, members, defines)); var references = ((string)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES")!) .Split(Path.PathSeparator) .Append(typeof(math).Assembly.Location) @@ -143,7 +808,7 @@ public sealed class HlslSourceCompatibilityTests return (result.Success ? Assembly.Load(stream.ToArray()) : null, errors); } - private static string FindCultMathRoot() + internal static string FindCultMathRoot() { var directory = new DirectoryInfo(AppContext.BaseDirectory); while (directory is not null && !File.Exists(Path.Combine(directory.FullName, "packages", "cultmath", "shaders", "CultMath.hlsl"))) diff --git a/packages/cultmath/tests/CultMath.Tests/IntervalTests.cs b/packages/cultmath/tests/CultMath.Tests/IntervalTests.cs new file mode 100644 index 00000000..4f165eab --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/IntervalTests.cs @@ -0,0 +1,312 @@ +using CultMath; +using Xunit; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// intervals-enclose for every iv_* op (design.md, "Intervals"): for each op, intervals with seeded random +/// centres and widths and the points inside them; f(x), evaluated pointwise in float32 by the same C# math +/// the op mirrors, must lie in op(I) with no tolerance. +/// +/// Stryker mutates operators, not float bounds, so the mutants that matter most here are written by hand +/// and run by : for every op, the lo bound raised by one ulp and the +/// hi bound lowered by one ulp must each fail the harness. Two pairs are equivalent mutants on this CPU and +/// are not in that list: +/// - iv_exp's one-ulp widening, both sides: MathF.Exp is monotone over every float on the Linux runtime +/// (MeasureMonotonicity prints 0 violations), so removing the widening encloses here. It is kept because +/// exp is not required to be correctly rounded, and another libm or a GPU need not be monotone. +/// - iv_smoothstep's one-ulp widening: the generic harness never meets one of smoothstep's 1-ulp +/// non-monotone steps; constructs one on +/// each side and kills both mutants. +/// +public sealed class IntervalTests +{ + private readonly ITestOutputHelper output; + + public IntervalTests(ITestOutputHelper output) => this.output = output; + + private const int IntervalCount = 10000; + private const int PointsPerInterval = 16; + + // One row of the shared harness: how many interval arguments the op takes, how to draw its scalar + // arguments, the op itself and the pointwise function it encloses. A new op is one entry here. + internal sealed record Op( + string Name, + int Intervals, + Func Scalars, + Func Bound, + Func Pointwise, + bool NonNegativeDomain = false); + + private static float[] None(System.Random random) => Array.Empty(); + + private static float Uniform(System.Random random, float lo, float hi) => lo + (hi - lo) * random.NextSingle(); + + internal static readonly Op[] Ops = + { + new("iv_point", 0, r => new[] { Uniform(r, -20.0f, 20.0f) }, (i, s) => iv_point(s[0]), (x, s) => s[0]), + new("iv_add", 2, None, (i, s) => iv_add(i[0], i[1]), (x, s) => x[0] + x[1]), + new("iv_sub", 2, None, (i, s) => iv_sub(i[0], i[1]), (x, s) => x[0] - x[1]), + new("iv_neg", 1, None, (i, s) => iv_neg(i[0]), (x, s) => -x[0]), + new("iv_mul", 2, None, (i, s) => iv_mul(i[0], i[1]), (x, s) => x[0] * x[1]), + new("iv_scale", 1, r => new[] { Uniform(r, -4.0f, 4.0f) }, (i, s) => iv_scale(i[0], s[0]), (x, s) => x[0] * s[0]), + new("iv_abs", 1, None, (i, s) => iv_abs(i[0]), (x, s) => abs(x[0])), + new("iv_min", 2, None, (i, s) => iv_min(i[0], i[1]), (x, s) => min(x[0], x[1])), + new("iv_max", 2, None, (i, s) => iv_max(i[0], i[1]), (x, s) => max(x[0], x[1])), + new("iv_sqr", 1, None, (i, s) => iv_sqr(i[0]), (x, s) => x[0] * x[0]), + new("iv_sqrt", 1, None, (i, s) => iv_sqrt(i[0]), (x, s) => sqrt(x[0]), NonNegativeDomain: true), + new("iv_exp", 1, None, (i, s) => iv_exp(i[0]), (x, s) => exp(x[0])), + new("iv_clamp", 1, r => new[] { Uniform(r, -25.0f, 25.0f), Uniform(r, -25.0f, 25.0f) }, + (i, s) => iv_clamp(i[0], s[0], s[1]), (x, s) => clamp(x[0], s[0], s[1])), + new("iv_saturate", 1, None, (i, s) => iv_saturate(i[0]), (x, s) => saturate(x[0])), + new("iv_smoothstep", 1, r => new[] { Uniform(r, -25.0f, 25.0f), Uniform(r, -25.0f, 25.0f) }, + (i, s) => iv_smoothstep(s[0], s[1], i[0]), (x, s) => smoothstep(s[0], s[1], x[0])), + new("iv_lerp", 2, r => new[] { Uniform(r, -0.5f, 1.5f) }, (i, s) => iv_lerp(i[0], i[1], s[0]), (x, s) => lerp(x[0], x[1], s[0])), + }; + + // Centres in [-20, 20], widths log-uniform in [1e-4, 10]. Every eighth interval is a point + // interval: a bound that is only reached when an argument is a point (iv_lerp's, where x appears + // twice) is still reached, so a one-ulp shrink of it is still caught. + private static float2 RandomInterval(System.Random random, int index) + { + var centre = Uniform(random, -20.0f, 20.0f); + if (index % 8 == 7) + return iv_point(centre); + var width = MathF.Pow(10.0f, Uniform(random, -4.0f, 1.0f)); + return new float2(centre - width * 0.5f, centre + width * 0.5f); + } + + // The points inside one argument: both endpoints, zero when the interval holds it, and the rest + // uniform. Endpoints and zero are where a tight bound is reached. + private static float[] PointsInside(System.Random random, float2 interval, bool nonNegative) + { + var lo = nonNegative ? max(interval.x, 0.0f) : interval.x; + var hi = nonNegative ? max(interval.y, 0.0f) : interval.y; + var points = new float[PointsPerInterval]; + points[0] = lo; + points[1] = hi; + var next = 2; + if (lo < 0.0f && hi > 0.0f) + points[next++] = 0.0f; + for (; next < points.Length; next++) + points[next] = min(max(lo + (hi - lo) * random.NextSingle(), lo), hi); + return points; + } + + /// Runs one op over the seeded set; returns the violations, at most a few, described. + internal static List Violations(Op op, Func? mutate = null, int seed = 0x1A7E) + { + var random = new System.Random(seed); + var violations = new List(); + var count = 0; + for (var k = 0; k < IntervalCount; k++) + { + var intervals = new float2[op.Intervals]; + for (var a = 0; a < op.Intervals; a++) + intervals[a] = RandomInterval(random, k + a); + var scalars = op.Scalars(random); + var bound = op.Bound(intervals, scalars); + if (mutate is not null) + bound = mutate(bound); + + var points = intervals.Select(i => PointsInside(random, i, op.NonNegativeDomain)).ToArray(); + for (var p = 0; p < PointsPerInterval; p++) + { + // Binary ops visit the four endpoint corners first (p = 0..3), then pair points by index. + var x = new float[op.Intervals]; + for (var a = 0; a < op.Intervals; a++) + x[a] = op.Intervals == 2 && p < 4 ? points[a][a == 0 ? p & 1 : p >> 1] : points[a][p]; + var value = op.Pointwise(x, scalars); + if (!(value >= bound.x && value <= bound.y)) + { + if (count++ < 4) + violations.Add($"{op.Name}({string.Join(", ", intervals)}; {string.Join(", ", scalars)}) = {bound}, f({string.Join(", ", x)}) = {value:R}"); + } + } + } + + if (count > violations.Count) + violations.Add($"... {count} violations in all"); + return violations; + } + + [Fact] + public void EveryOpEnclosesItsPoints() + { + var failures = Ops.SelectMany(op => Violations(op)).ToList(); + Assert.True(failures.Count == 0, string.Join(Environment.NewLine, failures)); + } + + internal static float NextUp(float v) => v == 0.0f ? asfloat(1u) : asfloat(v > 0.0f ? asuint(v) + 1u : asuint(v) - 1u); + private static float NextDown(float v) => -NextUp(-v); + + /// + /// The hand-mutation list: every op's lo raised by one ulp, and its hi lowered by one ulp, must each + /// fail the harness. The two equivalent pairs are named in the class comment. + /// + [Fact] + public void EveryOneUlpShrinkIsCaught() + { + var survivors = new List(); + foreach (var op in Ops.Where(o => o.Name is not "iv_exp" and not "iv_smoothstep")) + { + if (Violations(op, b => new float2(NextUp(b.x), b.y)).Count == 0) + survivors.Add(op.Name + " lo + 1 ulp"); + if (Violations(op, b => new float2(b.x, NextDown(b.y))).Count == 0) + survivors.Add(op.Name + " hi - 1 ulp"); + } + + Assert.True(survivors.Count == 0, "surviving one-ulp shrinks: " + string.Join(", ", survivors)); + } + + [Fact] + public void MulCoversEverySignCase() + { + // Both positive, both negative, mixed both ways, and a factor straddling zero on either side. + Assert.Equal(new float2(2.0f, 12.0f), iv_mul(new float2(1.0f, 3.0f), new float2(2.0f, 4.0f))); + Assert.Equal(new float2(2.0f, 12.0f), iv_mul(new float2(-3.0f, -1.0f), new float2(-4.0f, -2.0f))); + Assert.Equal(new float2(-12.0f, -2.0f), iv_mul(new float2(1.0f, 3.0f), new float2(-4.0f, -2.0f))); + Assert.Equal(new float2(-12.0f, -2.0f), iv_mul(new float2(-3.0f, -1.0f), new float2(2.0f, 4.0f))); + Assert.Equal(new float2(-8.0f, 12.0f), iv_mul(new float2(-2.0f, 3.0f), new float2(2.0f, 4.0f))); + Assert.Equal(new float2(-12.0f, 8.0f), iv_mul(new float2(-2.0f, 3.0f), new float2(-4.0f, -2.0f))); + Assert.Equal(new float2(-15.0f, 12.0f), iv_mul(new float2(-2.0f, 3.0f), new float2(-5.0f, 4.0f))); + } + + [Fact] + public void SqrtClampsANegativeLoAtZero() + { + Assert.Equal(new float2(0.0f, 3.0f), iv_sqrt(new float2(-4.0f, 9.0f))); + Assert.Equal(new float2(0.0f, 0.0f), iv_sqrt(new float2(-4.0f, -1.0f))); + Assert.Equal(new float2(2.0f, 3.0f), iv_sqrt(new float2(4.0f, 9.0f))); + } + + [Fact] + public void AbsAndSqrStraddlingZeroStartAtZero() + { + Assert.Equal(new float2(0.0f, 3.0f), iv_abs(new float2(-3.0f, 2.0f))); + Assert.Equal(new float2(0.0f, 5.0f), iv_abs(new float2(-2.0f, 5.0f))); + Assert.Equal(new float2(2.0f, 5.0f), iv_abs(new float2(-5.0f, -2.0f))); + Assert.Equal(new float2(0.0f, 9.0f), iv_sqr(new float2(-3.0f, 2.0f))); + Assert.Equal(new float2(4.0f, 25.0f), iv_sqr(new float2(-5.0f, -2.0f))); + } + + [Fact] + public void MinAndMaxAreThePointwiseMinAndMaxOfTheEnds() + { + var a = new float2(-1.0f, 4.0f); + var b = new float2(2.0f, 3.0f); + Assert.Equal(new float2(-1.0f, 3.0f), iv_min(a, b)); + Assert.Equal(new float2(2.0f, 4.0f), iv_max(a, b)); + } + + [Fact] + public void SmoothstepBoundsAreItsOrderedEndpointsWidenedByOneUlp() + { + var rising = iv_smoothstep(0.0f, 1.0f, new float2(0.25f, 0.5f)); + Assert.Equal(NextDown(smoothstep(0.0f, 1.0f, 0.25f)), rising.x); + Assert.Equal(NextUp(smoothstep(0.0f, 1.0f, 0.5f)), rising.y); + + // minimum > maximum: smoothstep falls, so the endpoints swap. + var falling = iv_smoothstep(1.0f, 0.0f, new float2(0.25f, 0.5f)); + Assert.Equal(NextDown(smoothstep(1.0f, 0.0f, 0.5f)), falling.x); + Assert.Equal(NextUp(smoothstep(1.0f, 0.0f, 0.25f)), falling.y); + + // The widening never leaves [0, 1]. + Assert.Equal(new float2(0.0f, 1.0f), iv_smoothstep(0.0f, 1.0f, new float2(-2.0f, 3.0f))); + } + + /// + /// smoothstep's float32 evaluation steps down by one ulp in places (MeasureMonotonicity). Three + /// consecutive floats t0 < t1 < t2 with f(t1) below both neighbours put f(t1) outside the ordered + /// endpoints of [t0, t2]; three with f(t1) above both put it outside on the other side. The widened + /// bound encloses both; without the widening it does not. + /// + [Fact] + public void SmoothstepWideningCoversItsFloatNonMonotonicity() + { + float F(float t) => smoothstep(0.0f, 1.0f, t); + float2? dip = null, peak = null; + for (var t = 1.0e-4f; t < 0.01f && (dip is null || peak is null); t = NextUp(t)) + { + var t1 = NextUp(t); + var t2 = NextUp(t1); + if (dip is null && F(t1) < F(t) && F(t1) < F(t2)) + dip = new float2(t, t2); + if (peak is null && F(t1) > F(t) && F(t1) > F(t2)) + peak = new float2(t, t2); + } + + Assert.NotNull(dip); + Assert.NotNull(peak); + foreach (var (interval, low) in new[] { (dip!.Value, true), (peak!.Value, false) }) + { + var mid = F(NextUp(interval.x)); + var unwidened = new float2(min(F(interval.x), F(interval.y)), max(F(interval.x), F(interval.y))); + Assert.False(mid >= unwidened.x && mid <= unwidened.y, $"the {(low ? "dip" : "peak")} at {interval} is inside the endpoints"); + var bound = iv_smoothstep(0.0f, 1.0f, interval); + Assert.True(mid >= bound.x && mid <= bound.y, $"iv_smoothstep{interval} = {bound} misses {mid:R}"); + } + } + + [Fact] + public void LerpIsTheNaturalExtensionAndTightForPointArguments() + { + Assert.Equal(new float2(lerp(1.0f, 3.0f, 0.25f), lerp(1.0f, 7.0f, 0.25f)), iv_lerp(iv_point(1.0f), new float2(3.0f, 7.0f), 0.25f)); + Assert.Equal(new float2(-1.0f + (2.0f - 1.0f) * 0.5f, 1.0f + (4.0f + 1.0f) * 0.5f), iv_lerp(new float2(-1.0f, 1.0f), new float2(2.0f, 4.0f), 0.5f)); + } + + [Fact] + public void ExpIsWidenedByOneUlpOnEachSide() + { + var bound = iv_exp(new float2(-1.0f, 2.0f)); + Assert.Equal(NextDown(exp(-1.0f)), bound.x); + Assert.Equal(NextUp(exp(2.0f)), bound.y); + Assert.Equal(0.0f, iv_exp(new float2(-200.0f, 0.0f)).x); + } + + /// + /// The monotonicity the widening rules rest on, measured over every float: exp over [-87, 88.7], the + /// range where it neither underflows to a subnormal nor overflows, and smoothstep(0, 1, t) over [0, 1], + /// which covers every smoothstep because t = saturate((x - minimum) / (maximum - minimum)) is itself + /// monotone in x. Prints the number of steps down and the largest, in ulps. Slow: about a minute. + /// + [Fact(Explicit = true)] + [Trait("Category", "Slow")] + public void MeasureMonotonicity() + { + long expDown = 0, expWorst = 0; + var previous = exp(-87.0f); + for (var x = NextUp(-87.0f); x <= 88.7f; x = NextUp(x)) + { + var e = exp(x); + if (e < previous) + { + expDown++; + expWorst = Math.Max(expWorst, (long)asuint(previous) - asuint(e)); + } + + previous = e; + } + + long smoothDown = 0, smoothWorst = 0; + var runningMax = 0.0f; + for (var bits = 0u; bits <= asuint(1.0f); bits++) + { + var s = smoothstep(0.0f, 1.0f, asfloat(bits)); + if (s < runningMax) + { + smoothDown++; + smoothWorst = Math.Max(smoothWorst, (long)asuint(runningMax) - asuint(s)); + } + else + { + runningMax = s; + } + } + + output.WriteLine($"IV-REPORT monotonicity: exp steps down {expDown} times, worst {expWorst} ulp; smoothstep steps down {smoothDown} times, worst {smoothWorst} ulp"); + Assert.True(expWorst <= 1, $"exp steps down by {expWorst} ulp; one ulp of widening is not enough"); + Assert.True(smoothWorst <= 1, $"smoothstep steps down by {smoothWorst} ulp; one ulp of widening is not enough"); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/LatticeCellsTests.cs b/packages/cultmath/tests/CultMath.Tests/LatticeCellsTests.cs new file mode 100644 index 00000000..f6363da1 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/LatticeCellsTests.cs @@ -0,0 +1,460 @@ +using Xunit; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// The weighted lattice cell function and its public steps. The oracle and the double reference are written here +/// from the public steps and the spec formula; the ring search is never the reference for itself. +/// +public sealed class LatticeCellsTests +{ + internal const float Cell = 260.0f; + internal const float Falloff = 120.0f; + internal const float Drift = 0.7f; + internal static readonly float2 Normal = new(0.6f, 0.8f); + + internal sealed record Look(float Boost, float Stretch, float Smoothing, float Falloff = LatticeCellsTests.Falloff); + + internal static readonly Look[] Looks = + { + new(1.6f, 1.0f, 0.35f), new(1.6f, 2.0f, 0.35f), new(LatticeMaxBoost, LatticeMaxStretch, LatticeMaxSmoothing), new(0.0f, 1.0f, 0.05f), + }; + + internal static float4[] Bodies(float t) + { + var bodies = new float4[6]; + for (var i = 0; i < bodies.Length; i++) + { + var angle = 0.001f * (i + 1) * t + i; + var radius = 300.0f + 220.0f * i; + bodies[i] = new float4(radius * MathF.Cos(angle), radius * MathF.Sin(angle), 0.0f, 40.0f + 40.0f * i); + } + return bodies; + } + + private static float CellWeight(float2 cell, float time, float4[] bodies, Look look) + { + var site = lattice_site(cell, time, Drift); + var border = power_border(new float3((cell + 0.5f) * Cell, 0.0f), bodies).w; + return lattice_weight(site.z, border, look.Boost, look.Falloff); + } + + // Folds F1, F2, id and smooth over the box of the given radius in absolute row-major order. + internal static float4 BoxFold(float2 p, float time, float4[] bodies, Look look, int radius, + Dictionary<(int, int), float> weights, float2? unitNormal = null) + { + var q = p / Cell; + var c0 = floor(q); + var cells = new List<(float2 cell, float d)>(); + for (var dz = -radius; dz <= radius; dz++) + for (var dx = -radius; dx <= radius; dx++) + { + var cell = c0 + new float2(dx, dz); + var key = ((int)cell.x, (int)cell.y); + if (!weights.TryGetValue(key, out var w)) + weights[key] = w = CellWeight(cell, time, bodies, look); + var site = lattice_site(cell, time, Drift); + cells.Add((cell, lattice_distance(q, site.xy, w, unitNormal ?? Normal, look.Stretch))); + } + float f1 = 1.0e30f, f2 = 1.0e30f; + var win = default(float2); + foreach (var (cell, d) in cells) + { + if (d < f1) { f2 = f1; f1 = d; win = cell; } + else if (d < f2) f2 = d; + } + var m = f1 + look.Smoothing; + foreach (var (_, d) in cells) + m = lattice_smooth_step(m, d, f1, look.Smoothing); + var id = pcg4d(new int4((int)win.x, (int)win.y, 0, 0)); + return new float4(f1, f2, m, cellular_unit(id.w)); + } + + internal static float4 Call(float2 p, float time, float4[] bodies, Look look, float2? normal = null) => + weighted_lattice_cells(p, time, bodies, Cell, Drift, look.Boost, look.Falloff, look.Smoothing, normal ?? Normal, look.Stretch); + + internal static float2 RandomPoint(System.Random r) => + new((r.NextSingle() * 2.0f - 1.0f) * 1500.0f, (r.NextSingle() * 2.0f - 1.0f) * 1500.0f); + + [Fact] + public void RingSearchEqualsTheFullBoxOracle() + { + var r = new System.Random(41); + foreach (var look in Looks) + for (var batch = 0; batch < 20; batch++) + { + var time = 13.0f * batch; + var bodies = Bodies(time); + var weights = new Dictionary<(int, int), float>(); + for (var i = 0; i < 1000; i++) + { + var p = RandomPoint(r); + var expected = BoxFold(p, time, bodies, look, 12, weights); + var actual = Call(p, time, bodies, look); + Assert.Equal(expected, actual); + } + } + } + + internal delegate bool Stop(int k, float f1, float f2, Look look); + + internal static readonly (string name, Stop stop)[] Rules = + { + ("correct", (k, f1, f2, l) => k > 1 && 0.5f * (k - 1) >= max(f2, f1 + 2.0f * l.Smoothing)), + ("cutoff F1 + k", (k, f1, f2, l) => k > 1 && 0.5f * (k - 1) >= max(f2, f1 + l.Smoothing)), + ("bound 0.5*k", (k, f1, f2, l) => k > 0 && 0.5f * k >= max(f2, f1 + 2.0f * l.Smoothing)), + ("greatest weight", (k, f1, f2, l) => k > 1 && (1.0f + l.Boost) * (k - 1) >= max(f2, f1 + 2.0f * l.Smoothing)), + ("F1 only", (k, f1, f2, l) => k > 1 && 0.5f * (k - 1) >= f1 + 2.0f * l.Smoothing), + }; + + // The radius of the box a search with the given exit rule visits (rings 0 to k - 1 when it stops before ring k). + internal static int Radius(float2 p, float time, float4[] bodies, Look look, Stop stop, + Dictionary<(int, int), float> weights) + { + var q = p / Cell; + var c0 = floor(q); + float f1 = 1.0e30f, f2 = 1.0e30f; + for (var k = 0; k <= LatticeMaxRing; k++) + { + if (stop(k, f1, f2, look)) + return k - 1; + for (var dz = -k; dz <= k; dz++) + for (var dx = -k; dx <= k; dx++) + { + if (Math.Max(Math.Abs(dx), Math.Abs(dz)) != k) + continue; + var cell = c0 + new float2(dx, dz); + var key = ((int)cell.x, (int)cell.y); + if (!weights.TryGetValue(key, out var w)) + weights[key] = w = CellWeight(cell, time, bodies, look); + var d = lattice_distance(q, lattice_site(cell, time, Drift).xy, w, Normal, look.Stretch); + if (d < f1) { f2 = f1; f1 = d; } + else if (d < f2) f2 = d; + } + } + return LatticeMaxRing; + } + + [Fact] + public void ConstructedPointsRealizeTheExitBound() + { + var failed = new Dictionary(); + var r = new System.Random(7); + foreach (var look in new[] { Looks[2], Looks[3] }) + for (var batch = 0; batch < 20; batch++) + { + var time = 29.0f * batch; + var bodies = Bodies(time); + var weights = new Dictionary<(int, int), float>(); + for (var i = 0; i < 1500; i++) + { + var p = RandomPoint(r); + var expected = BoxFold(p, time, bodies, look, 12, weights); + foreach (var (name, stop) in Rules) + { + var got = BoxFold(p, time, bodies, look, Math.Max(0, Radius(p, time, bodies, look, stop, weights)), weights); + if (!got.Equals(expected)) + failed[name] = failed.GetValueOrDefault(name) + 1; + } + } + } + Assert.False(failed.ContainsKey("correct")); + foreach (var (name, _) in Rules.Skip(1)) + Assert.True(failed.GetValueOrDefault(name) > 0, name + " is not caught by any point"); + } + + [Fact] + public void SmoothIgnoresCellsBeyondTheBand() + { + var r = new System.Random(3); + for (var i = 0; i < 20000; i++) + { + var k = 0.05f + 0.95f * r.NextSingle(); + var f1 = 8.0f * r.NextSingle(); + var m = f1 + k - (r.NextSingle() < 0.5f ? 0.0f : 2.0f * k * r.NextSingle()); + var far = f1 + 2.0f * k + 5.0f * r.NextSingle(); + Assert.Equal(m, lattice_smooth_step(m, far, f1, k)); + var near = f1 + 2.0f * k * r.NextSingle(); + Assert.True(lattice_smooth_step(m, near, f1, k) <= f1 + k); + } + Assert.NotEqual(1.0f, lattice_smooth_step(1.0f + 0.35f, 1.0f + 0.35f, 1.0f, 0.35f)); + } + + private static float2 Dir(System.Random r) + { + var a = r.NextSingle() * TAU; + return new float2(MathF.Cos(a), MathF.Sin(a)); + } + + [Fact] + public void ContinuousAcrossCellBoundariesAndBorders() + { + var look = Looks[1]; + var bodies = Bodies(11.0f); + var r = new System.Random(5); + var worst = 0.0f; + for (var line = 0; line < 6; line++) + { + var a = RandomPoint(r); + var dir = Dir(r); + const int steps = 4000; + var length = 6.0f * Cell; + var prev = Call(a, 11.0f, bodies, look); + for (var s = 1; s <= steps; s++) + { + var cur = Call(a + dir * (length * s / steps), 11.0f, bodies, look); + var step = length / steps / Cell; + // A weighted distance changes at most weight * stretch per cell unit of travel. + Assert.True(abs(cur.z - prev.z) < 12.0f * step + 1e-3f); + Assert.True(abs(cur.x - prev.x) < 12.0f * step + 1e-5f * 12.0f); + worst = max(worst, abs((cur.x - cur.z) - (prev.x - prev.z))); + prev = cur; + } + } + Assert.True(worst < 12.0f * 6.0f / 4000 * 2.0f + 1e-3f); + // Straddling a lattice cell boundary by 1e-3 of a cell. + for (var i = 0; i < 300; i++) + { + var p = RandomPoint(r); + var edge = new float2(MathF.Round(p.x / Cell) * Cell, p.y); + var lo = Call(edge - new float2(1e-3f * Cell, 0.0f), 11.0f, bodies, look); + var hi = Call(edge + new float2(1e-3f * Cell, 0.0f), 11.0f, bodies, look); + Assert.True(abs(lo.x - hi.x) < 1e-3f * 24.0f); + Assert.True(abs(lo.y - hi.y) < 1e-3f * 24.0f); + Assert.True(abs(lo.z - hi.z) < 1e-3f * 24.0f); + Assert.True(abs((lo.x - lo.z) - (hi.x - hi.z)) < 1e-3f * 24.0f); + } + } + + [Fact] + public void WeightsAreContinuousAsBodiesOrbit() + { + var look = Looks[2]; + var cells = Enumerable.Range(0, 576).Select(i => new float2(i % 24 - 12, i / 24 - 12)).ToArray(); + var prev = new float[cells.Length]; + for (var s = 0; s <= 300 * 60; s++) + { + var bodies = Bodies(s / 60.0f); + for (var i = 0; i < cells.Length; i++) + { + var site = lattice_site(cells[i], 0.0f, Drift); + var border = power_border(new float3((cells[i] + 0.5f) * Cell, 0.0f), bodies).w; + var w = lattice_weight(site.z, border, look.Boost, Falloff) / site.z; + if (s > 0) + Assert.True(abs(w - prev[i]) <= 0.01f * look.Boost, $"cell {cells[i]} at {s}: {prev[i]} -> {w}"); + prev[i] = w; + } + } + } + + [Fact] + public void F1F2AndSmoothAreContinuousThroughWinnerSwaps() + { + var r = new System.Random(19); + var bodies = Bodies(11.0f); + var swaps = 0; + foreach (var look in new[] { Looks[1], Looks[2] }) + for (var line = 0; line < 6; line++) + { + var a = RandomPoint(r); + var b = RandomPoint(r); + float2 At(float t) => a + (b - a) * t; + const int Steps = 4000; + for (var s = 1; s <= Steps; s++) + { + float lo = (s - 1) / (float)Steps, hi = s / (float)Steps; + if (Call(At(lo), 11.0f, bodies, look).w == Call(At(hi), 11.0f, bodies, look).w) + continue; + swaps++; + for (var i = 0; i < 40; i++) + { + var mid = 0.5f * (lo + hi); + if (Call(At(mid), 11.0f, bodies, look).w == Call(At(lo), 11.0f, bodies, look).w) lo = mid; else hi = mid; + } + var before = Call(At(lo), 11.0f, bodies, look); + var after = Call(At(hi), 11.0f, bodies, look); + var bound = 12.0f * length(At(hi) - At(lo)) / Cell + 1e-5f * 12.0f; + Assert.True(abs(before.x - after.x) < bound, $"F1 {before.x} -> {after.x}"); + Assert.True(abs(before.y - after.y) < bound, $"F2 {before.y} -> {after.y}"); + Assert.True(abs(before.z - after.z) < bound, $"smooth {before.z} -> {after.z}"); + } + } + Assert.True(swaps >= 20, $"only {swaps} winner swaps crossed"); + } + + [Fact] + public void TheCapIsReachedAndMatchesTheFullBox() + { + // A cell whose every neighbour is boosted far and stretched needs ring 17, past the cap a smaller bound would set. + var look = new Look(LatticeMaxBoost, LatticeMaxStretch, LatticeMaxSmoothing, 1.0e6f); + var p = new float2(1446.7345f, -680.7637f); + const float Time = 97.69269f; + var bodies = Bodies(Time); + var weights = new Dictionary<(int, int), float>(); + var ring = Radius(p, Time, bodies, look, Rules[0].stop, weights); + Assert.InRange(ring, 13, LatticeMaxRing); + Assert.Equal(BoxFold(p, Time, bodies, look, LatticeMaxRing, weights), Call(p, Time, bodies, look)); + // The cap is the greatest ring the range's worst case can need: the exit holds once 0.5 (k - 1) reaches the + // larger of the F2 and F1 + 2 smoothing bounds, which are (1 + boost) stretch sqrt(3.25) and (1 + boost) stretch sqrt(2) + 2 smoothing. + var f2Bound = (1.0f + LatticeMaxBoost) * LatticeMaxStretch * MathF.Sqrt(3.25f); + var bandBound = (1.0f + LatticeMaxBoost) * LatticeMaxStretch * MathF.Sqrt(2.0f) + 2.0f * LatticeMaxSmoothing; + Assert.Equal((int)MathF.Ceiling(2.0f * max(f2Bound, bandBound)), LatticeMaxRing); + } + + [Fact] + public void AnExactTieChangesOnlyTheIdToTheEarlierRowMajorCell() + { + // Cells sharing a base weight and, at these coordinates, a rounded site: a query on that site is at distance 0 from both. + foreach (var (earlier, time) in new[] { (new float2(6003486, 3996 + 6000000), 0.0f), (new float2(6007572, 2713 + 6000000), 4.07f) }) + { + var later = earlier + new float2(0, 1); + var siteA = lattice_site(earlier, time, 1.0f); + Assert.Equal(siteA, lattice_site(later, time, 1.0f)); + var got = weighted_lattice_cells(siteA.xy, time, Array.Empty(), 1.0f, 1.0f, 0.0f, 1.0f, 0.01f, Normal, 1.0f); + var idOf = (float2 c) => cellular_unit(pcg4d(new int4((int)c.x, (int)c.y, 0, 0)).w); + Assert.NotEqual(idOf(earlier), idOf(later)); + Assert.Equal(new float4(0.0f, 0.0f, got.z, idOf(earlier)), got); + } + } + + private static void Refuses(string parameter, Action call) => + Assert.Equal(parameter, Assert.Throws(call).ParamName); + + [Fact] + public void RefusesOutsideTheRange() + { + var b = Bodies(0.0f); + var p = new float2(10.0f, 20.0f); + var n = Normal; + float4 W(float2? pp = null, float time = 0, float cell = Cell, float drift = Drift, float boost = 1.6f, float falloff = Falloff, + float smoothing = 0.35f, float2? normal = null, float stretch = 1.5f, float4[]? bodies = null) => + weighted_lattice_cells(pp ?? p, time, bodies ?? b, cell, drift, boost, falloff, smoothing, normal ?? n, stretch); + + W(boost: 0.0f); W(boost: LatticeMaxBoost); W(stretch: 1.0f); W(stretch: LatticeMaxStretch); + W(smoothing: LatticeMaxSmoothing); W(normal: float2.zero, stretch: 1.0f); W(normal: new float2(1.0e-45f, 0.0f)); W(bodies: Array.Empty()); + Refuses("p", () => W(pp: new float2(float.NaN, 0))); + Refuses("cellSize", () => W(cell: 0.0f)); + Refuses("cellSize", () => W(cell: float.PositiveInfinity)); + Refuses("cellSize", () => W(cell: 1.0e37f)); + Refuses("p", () => W(pp: new float2(3.0e38f, 0))); + Refuses("p", () => W(pp: new float2(0, 1.0e10f))); + Refuses("p", () => W(pp: new float2(3.3e38f, 0), cell: 1.0e36f)); + Refuses("time", () => W(time: float.PositiveInfinity)); + Refuses("drift", () => W(drift: float.NaN)); + Refuses("drift", () => W(time: 3.0e38f, drift: 2.0f)); + W(time: 1.0e30f, drift: 1.0e-30f); + Refuses("boost", () => W(boost: -0.01f)); + Refuses("boost", () => W(boost: LatticeMaxBoost + 0.01f)); + Refuses("falloff", () => W(falloff: 0.0f)); + Refuses("falloff", () => W(falloff: float.NaN)); + Refuses("smoothing", () => W(smoothing: 0.0f)); + Refuses("smoothing", () => W(smoothing: LatticeMaxSmoothing + 0.01f)); + Refuses("stretch", () => W(stretch: 0.99f)); + Refuses("stretch", () => W(stretch: LatticeMaxStretch + 0.01f)); + Refuses("stretchNormal", () => W(normal: float2.zero)); + Refuses("stretchNormal", () => W(normal: new float2(float.NaN, 1))); + Refuses("bodies", () => W(bodies: new[] { new float4(float.NaN, 0, 0, 1) })); + Refuses("bodies", () => W(bodies: new[] { new float4(0, 0, 0, float.PositiveInfinity) })); + } + + [Fact] + public void RingsStayWellInsideTheCap() + { + var r = new System.Random(41); + var rings = new List(); + foreach (var look in Looks) + for (var batch = 0; batch < 20; batch++) + { + var time = 13.0f * batch; + var bodies = Bodies(time); + var weights = new Dictionary<(int, int), float>(); + for (var i = 0; i < 300; i++) + rings.Add(Radius(RandomPoint(r), time, bodies, look, Rules[0].stop, weights)); + } + Assert.True(rings.Max() <= LatticeMaxRing - 2, $"greatest ring {rings.Max()}"); + rings.Sort(); + Assert.Equal((3, 7, 8), (rings[rings.Count / 2], rings[rings.Count * 99 / 100], rings[^1])); + } + + + [Fact] + public void StretchNormalIsNormalised() + { + var bodies = Bodies(3.0f); + var r = new System.Random(8); + for (var i = 0; i < 50; i++) + { + var p = RandomPoint(r); + Assert.Equal(Call(p, 3.0f, bodies, Looks[1]), Call(p, 3.0f, bodies, Looks[1], Normal * 7.0f)); + } + } + + [Fact] + public void ANormalOfAnyMagnitudeActsAsItsDirection() + { + // A tiny normal once normalised to length 0.944 and a huge one to zero; both then missed a winning cell. + var none = Array.Empty(); + var look = new Look(0.0f, 1.0f, 0.01f); + var invSqrt2 = new float2(0.70710677f, 0.70710677f); + var cases = new (float2 given, float2 unit)[] + { + (new float2(3.0e-23f, 4.0e-23f), Normal), (new float2(6.0e29f, 8.0e29f), Normal), + (new float2(1.0e30f, 1.0e30f), invSqrt2), (new float2(1.0e-44f, 1.0e-44f), invSqrt2), (new float2(3.0e38f, 3.0e38f), invSqrt2), + }; + var weights = new Dictionary<(int, int), float>(); + foreach (var (given, unit) in cases) + { + var miss = new float2(-1040.0f, -1481.7773f); + Assert.Equal(BoxFold(miss, 54.725235f, none, look, 12, weights, unit), Call(miss, 54.725235f, none, look, given)); + var r = new System.Random(3); + for (var i = 0; i < 300; i++) + { + var p = RandomPoint(r); + Assert.Equal(BoxFold(p, 7.0f, none, Looks[1], 12, weights, unit), Call(p, 7.0f, none, Looks[1], given)); + } + } + } + + [Fact] + public void MatchesTheProbeFormula() + { + var look = Looks[1]; + var r = new System.Random(2); + var bodies = Bodies(5.0f); + for (var i = 0; i < 2000; i++) + { + var p = RandomPoint(r); + var got = Call(p, 5.0f, bodies, look); + var nrm = (x: (double)Normal.x, y: (double)Normal.y); + var q = (x: (double)p.x / Cell, y: (double)p.y / Cell); + var ds = new List(); + for (var cz = (int)Math.Floor(q.y) - 8; cz <= (int)Math.Floor(q.y) + 8; cz++) + for (var cx = (int)Math.Floor(q.x) - 8; cx <= (int)Math.Floor(q.x) + 8; cx++) + { + var h = pcg3d(new int3(cx, cz, 0)); + double u0 = cellular_unit(h.x), u1 = cellular_unit(h.y), u2 = cellular_unit(h.z); + var ph = 2 * Math.PI; + var sx = cx + 0.5 + 0.5 * Math.Sin(Drift * 5.0 + ph * u0); + var sy = cz + 0.5 + 0.5 * Math.Sin(Drift * 5.0 + ph * u1); + var border = power_border(new float3(((float)cx + 0.5f) * Cell, ((float)cz + 0.5f) * Cell, 0), bodies).w; + var weight = (0.5 + 0.5 * u2) * (1 + look.Boost * Math.Exp(-Math.Pow(border / (double)Falloff, 2))); + double vx = sx - q.x, vy = sy - q.y; + double a = vx * nrm.x + vy * nrm.y, c = vx * nrm.y - vy * nrm.x; + ds.Add(weight * Math.Sqrt(look.Stretch * look.Stretch * a * a + c * c)); + } + var d = ds.OrderBy(x => x).ToArray(); + double m = d[0] + look.Smoothing; + foreach (var dd in ds) + { + if (dd >= d[0] + 2 * look.Smoothing) continue; + var h = Math.Clamp(0.5 + 0.5 * (m - dd) / look.Smoothing, 0, 1); + h = h * h * (3 - 2 * h); + m = Math.Min(m + (dd - m) * h - h * (1 - h) * look.Smoothing / (1 + 3 * look.Smoothing), d[0] + look.Smoothing); + } + Assert.InRange(got.x - d[0], -1e-4, 1e-4); + Assert.InRange(got.y - d[1], -1e-4, 1e-4); + Assert.InRange(got.z - m, -1e-4, 1e-4); + } + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/MathTests.cs b/packages/cultmath/tests/CultMath.Tests/MathTests.cs index de1bf996..3dc374bf 100644 --- a/packages/cultmath/tests/CultMath.Tests/MathTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/MathTests.cs @@ -12,6 +12,41 @@ public sealed class MathTests Assert.Equal(0.75f, math.frac(-1.25f)); } + // Expected values come from a Python transcription of the paper's pcg3d/pcg4d (JCGT 9(3) 2020, p. 32) and + // O'Neill's pcg_output_rxs_m_xs_32_32 with PCG_DEFAULT_MULTIPLIER_32/INCREMENT_32, independent of this code. + [Fact] + public void PcgHashesMatchReferenceTranscription() + { + static int3 U3(uint x, uint y, uint z) => new((int)x, (int)y, (int)z); + static int4 U4(uint x, uint y, uint z, uint w) => new((int)x, (int)y, (int)z, (int)w); + + Assert.Equal(0x07BB2FE2u, math.pcg(0u)); + Assert.Equal(0xA8BEEA3Cu, math.pcg(1u)); + Assert.Equal(0x995312E1u, math.pcg(0x12345678u)); + Assert.Equal(0xE62A4902u, math.pcg(0xFFFFFFFFu)); + Assert.Equal(U3(0x9BAFD7C6u, 0xA8E88A6Bu, 0x3F15482Cu), math.pcg3d(new int3(0, 0, 0))); + Assert.Equal(U3(0xFA9F79A6u, 0x48F2F44Cu, 0x596F5AB1u), math.pcg3d(new int3(1, 2, 3))); + Assert.Equal(U3(0x67DCF282u, 0x49E87E17u, 0x10018917u), math.pcg3d(U3(0xFFFFFFFFu, 0x80000000u, 0x7FFFFFFFu))); + Assert.Equal(U4(0x0F02F829u, 0x2D568769u, 0x32B0C43Bu, 0xD32548EAu), math.pcg4d(new int4(0, 0, 0, 0))); + Assert.Equal(U4(0x3622CD16u, 0xF11471D8u, 0xE1109B3Fu, 0x02B94C2Fu), math.pcg4d(new int4(1, 2, 3, 4))); + Assert.Equal(U4(0x72180037u, 0x81D493E6u, 0xD9BA7226u, 0x14C9ABA7u), math.pcg4d(U4(0xFFFFFFFFu, 0x80000000u, 0x7FFFFFFFu, 0xDEADBEEFu))); + Assert.Equal(U3(0xA7B40FEEu, 0x9B70DFC0u, 0x3106C2C5u), math.pcg3d(new float3(1.5f, -2.25f, 1e7f))); + Assert.Equal(U3(0x5A09E5C6u, 0x53EC0DABu, 0x4BE4A1ECu), math.pcg3d(new float2(3.0f, 4.0f))); + Assert.Equal(U4(0x1849E380u, 0xF199DEE0u, 0x6C6B4934u, 0x34AF16DFu), + math.pcg4d(new float4(-0.0f, BitConverter.Int32BitsToSingle(0x7FC00000), 0.5f, 1e-7f))); + } + + [Fact] + public void Pcg3dSeparatesAPositionGrid() + { + // A single 32-bit component is subject to birthday collisions (x has one here); the full output is distinct. + var hashes = new HashSet(); + for (var i = 0; i < 100; i++) + for (var j = 0; j < 100; j++) + hashes.Add(math.pcg3d(new float2(i * 0.5f - 25.0f, j * 0.5f - 25.0f))); + Assert.Equal(10000, hashes.Count); + } + [Fact] public void VectorOperationsAreComponentWise() { @@ -272,10 +307,10 @@ public sealed class MathTests [Theory] [InlineData(0.0f, 0.0f, 0.0f)] - [InlineData(0.25f, -0.5f, -0.425866783f)] - [InlineData(12.25f, -4.5f, 0.258312f)] - [InlineData(536.5106f, 536.5106f, -0.6901103f)] - public void SimplexNoiseMatchesUnityMathematics(float x, float y, float expected) + [InlineData(0.25f, -0.5f, 0.225074813f)] + [InlineData(12.25f, -4.5f, -0.388599217f)] + [InlineData(536.5106f, 536.5106f, 0.538390875f)] + public void SimplexNoiseMatchesGoldenValues(float x, float y, float expected) { Assert.Equal(expected, math.snoise(new float2(x, y)), precision: 6); } @@ -332,4 +367,160 @@ public sealed class MathTests Assert.Equal(0.0f, px[1], precision: 5); Assert.Equal(0.0f, py[1], precision: 5); } + + // Tabulated to 16 significant figures (Abramowitz & Stegun table 7.1 lineage / standard erf tables). + [Theory] + [InlineData(0.0f, 0.0)] + [InlineData(0.5f, 0.5204998778130465)] + [InlineData(-0.5f, -0.5204998778130465)] + [InlineData(1.0f, 0.8427007929497149)] + [InlineData(-1.0f, -0.8427007929497149)] + [InlineData(2.0f, 0.9953222650189527)] + [InlineData(-2.0f, -0.9953222650189527)] + [InlineData(3.0f, 0.9999779095030014)] + [InlineData(-3.0f, -0.9999779095030014)] + public void ErfMatchesReferenceValues(float x, double expected) + { + Assert.True( + Math.Abs(math.erf(x) - expected) <= 2e-6, + $"erf({x}) = {math.erf(x)}, expected {expected}"); + } + + [Fact] + public void ErfIsOdd() + { + for (var i = -30; i <= 30; i++) + { + var x = i / 10.0f; + Assert.Equal(-math.erf(x), math.erf(-x)); + } + } + + [Fact] + public void ErfApproachesItsLimitsOfPlusMinusOne() + { + Assert.Equal(1.0f, math.erf(6.0f)); + Assert.Equal(1.0f, math.erf(20.0f)); + Assert.Equal(-1.0f, math.erf(-6.0f)); + Assert.Equal(-1.0f, math.erf(-20.0f)); + } + + [Fact] + public void ErfinvInvertsErf() + { + for (var i = -999; i <= 999; i++) + { + var y = i / 1000.0f; + var x = math.erfinv(y); + var roundTrip = math.erf(x); + Assert.True( + MathF.Abs(roundTrip - y) < 1e-5f, + $"erf(erfinv({y})) = {roundTrip}"); + } + } + + // Reference values from bisecting the platform's double-precision erf (Python's math.erf, + // glibc-backed), not this package's own erf, to 200 iterations over [-6, 6] -- effectively + // exact at float precision. This is what ErfinvInvertsErf cannot be: a check against this + // package's own erf only proves the two functions agree with each other, not that either is + // numerically correct. Soul measured the round-trip test alone to be blind to a coefficient + // change that degraded erfinv's worst error 300-400x (5.0e-7 to 2.0e-4). + [Theory] + // Expected values are computed for the actual float32-rounded input (e.g. the literal + // 0.999f is really 0.9990000128746033 as a double), not the decimal literal, because + // erfinv's derivative diverges near +-1: at y = 0.999f that rounding alone moves the + // true answer by ~2.6e-6, larger than the test's own error bar, if ignored. + [InlineData(0.0f, 0.0)] + [InlineData(0.1f, 0.08885599182530649)] + [InlineData(-0.1f, -0.08885599182530649)] + [InlineData(0.3f, 0.2724627261055238)] + [InlineData(-0.3f, -0.2724627261055238)] + [InlineData(0.5f, 0.4769362762044699)] + [InlineData(-0.5f, -0.4769362762044699)] + [InlineData(0.7f, 0.7328690598827587)] + [InlineData(-0.7f, -0.732869059882759)] + [InlineData(0.9f, 1.1630870719457724)] + [InlineData(-0.9f, -1.1630870719457729)] + [InlineData(0.95f, 1.3859037522360764)] + [InlineData(-0.95f, -1.3859037522360773)] + [InlineData(0.99f, 1.8213866009002766)] + [InlineData(-0.99f, -1.8213866009002793)] + [InlineData(0.999f, 2.3267563267961435)] + [InlineData(-0.999f, -2.3267563267961657)] + [InlineData(0.9999f, 2.751035437903192)] + [InlineData(-0.9999f, -2.751035437903383)] + public void ErfinvMatchesReferenceValues(float y, double expected) + { + Assert.True( + Math.Abs(math.erfinv(y) - expected) <= 2e-6, + $"erfinv({y}) = {math.erfinv(y)}, expected {expected}"); + } + + [Fact] + public void ErfinvAtDomainEdgesAndBeyond() + { + // Domain is [-1, 1]. The edges are the correctly-signed infinite limits; anything + // outside, including +-infinity itself, has no real inverse and is NaN. + Assert.Equal(float.PositiveInfinity, math.erfinv(1.0f)); + Assert.Equal(float.NegativeInfinity, math.erfinv(-1.0f)); + Assert.True(float.IsNaN(math.erfinv(1.0001f))); + Assert.True(float.IsNaN(math.erfinv(-1.0001f))); + Assert.True(float.IsNaN(math.erfinv(2.0f))); + Assert.True(float.IsNaN(math.erfinv(-2.0f))); + Assert.True(float.IsNaN(math.erfinv(float.PositiveInfinity))); + Assert.True(float.IsNaN(math.erfinv(float.NegativeInfinity))); + Assert.True(float.IsNaN(math.erfinv(float.NaN))); + } + + // The deleted ErfinvIsMonotonicallyIncreasing asserted a property erfinv does not have: + // Soul measured 9662 backward steps scanning every representable float32 in [0, 0.999999], + // first at y = 0.00022214651, worst drop 5.960464e-8 (one ULP at that scale) -- invisible + // only because that fixture stepped by 0.001. erf has the same shape: 100 backward steps + // over [0, 4.5], worst drop 1.192093e-7. Pin what is actually true: monotone to within a + // tolerance comfortably above that measured noise floor. + [Fact] + public void ErfinvIsMonotonicWithinFloatingPointTolerance() + { + const float tolerance = 1e-6f; + var previous = float.NegativeInfinity; + for (var i = -999; i <= 999; i++) + { + var y = i / 1000.0f; + var x = math.erfinv(y); + Assert.True( + x >= previous - tolerance, + $"erfinv({y}) = {x} dropped more than {tolerance} below previous value {previous}"); + previous = x; + } + } + + // One property the consumer needs, not the whole of correctness: fire control turns + // adjacent erf values into a cell's probability mass, so a backward step in erf would + // show up as a negative mass. An erf that returned a constant would pass this and is + // caught by ErfMatchesReferenceValues instead. + // Soul checked these geometries clean: 16/64/256/1024/4096 cells over + // +-4 sigma, plus a tight 1 sigma spread and a very tight 0.25 sigma spread. + [Theory] + [InlineData(16, 4f)] + [InlineData(64, 4f)] + [InlineData(256, 4f)] + [InlineData(1024, 4f)] + [InlineData(4096, 4f)] + [InlineData(256, 1f)] + [InlineData(64, 0.25f)] + public void ErfCellMassesStayNonNegativeAcrossRealisticGeometries(int cells, float sigmaRange) + { + var lo = -sigmaRange; + var hi = sigmaRange; + var step = (hi - lo) / cells; + var previous = math.erf(lo / MathF.Sqrt(2f)); + for (var i = 1; i <= cells; i++) + { + var edge = lo + step * i; + var current = math.erf(edge / MathF.Sqrt(2f)); + var mass = current - previous; + Assert.True(mass >= 0f, $"cell {i} of {cells} over +-{sigmaRange} sigma has negative mass {mass}"); + previous = current; + } + } } diff --git a/packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs b/packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs new file mode 100644 index 00000000..9d48c5f3 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs @@ -0,0 +1,3009 @@ +using CultMath; +using Xunit; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// The noise bounds (design.md, "Intervals" and "Affine forms"): iv_snoise_ball and iv_fbm_ball enclose +/// their functions over a ball, a domain warp bounded by D is enclosed by enlarging the radius by D, or +/// by the centred warp, SNOISE_LIPSCHITZ, SNOISE2_LIPSCHITZ and SNOISE_HESSIAN have measured provenance, iv_frustum_ball encloses a screen tile's rays over a depth segment, the bound +/// composed from an analytic envelope and the noise ball encloses the density, and a tile march over +/// fields with authored empty space is measured against a dense one for the same transmittance. Lines +/// starting IV-REPORT carry the numbers the cut report quotes. +/// +/// Hand mutations of iv_frustum_ball that TileBallEnclosesEveryRaySegment must kill: z0 for z1 in the +/// lateral term (z0 * footprintPerDepth); |m_c| for |(m_c, 1)| in the depth term; the warp dropped; the +/// rounding widening dropped (which the degenerate family's enclosure check alone must catch). Hand +/// mutations of the test's own fields and marches: w(z0) for w(z1) in VoidField.WeightBound must fail +/// WeightBoundEnclosesOneSignedNoise; CarveRadius for HollowRadius in the lo test of VoidField.Compose +/// and BodyDepth without |dir| must fail AnalyticBodyMatchesFineMarch; the footprint march's pre-body +/// integration dropped, or LodStep doubled, must fail IntervalSkipHalvesEvaluations's depth agreement; LodStep's +/// footprint z theta scaled x2 (or x4) must fail it at LOD-far. +/// +public sealed class NoiseBoundTests +{ + private readonly ITestOutputHelper output; + + public NoiseBoundTests(ITestOutputHelper output) => this.output = output; + + private static float Uniform(System.Random random, float lo, float hi) => lo + (hi - lo) * random.NextSingle(); + + private static float LogUniform(System.Random random, float lo, float hi) => + MathF.Exp(Uniform(random, MathF.Log(lo), MathF.Log(hi))); + + private static float3 UnitVector(System.Random random) + { + float3 v; + do + { + v = new float3(Uniform(random, -1.0f, 1.0f), Uniform(random, -1.0f, 1.0f), Uniform(random, -1.0f, 1.0f)); + } + while (dot(v, v) > 1.0f || dot(v, v) < 1.0e-4f); + + return normalize(v); + } + + // The first eight points of a ball are on its surface, where the bound is closest to binding; the + // rest are uniform in its volume. + private static float3 PointInBall(System.Random random, float3 centre, float radius, int index) => + centre + UnitVector(random) * (index < 8 ? radius : radius * MathF.Cbrt(random.NextSingle())); + + private static float3 RandomCentre(System.Random random) => + new(Uniform(random, -20.0f, 20.0f), Uniform(random, -20.0f, 20.0f), Uniform(random, -20.0f, 20.0f)); + + private static bool Inside(float value, float2 bound) => value >= bound.x && value <= bound.y; + + [Fact] + public void SnoiseBallEnclosesPoints() + { + var random = new System.Random(0xBA11); + for (var b = 0; b < 2000; b++) + { + var centre = RandomCentre(random); + var radius = LogUniform(random, 1.0e-3f, 1.0e3f); + var bound = iv_snoise_ball(centre, radius); + for (var i = 0; i < 64; i++) + { + var x = PointInBall(random, centre, radius, i); + Assert.True(Inside(snoise(x), bound), $"iv_snoise_ball({centre}, {radius:R}) = {bound} misses snoise({x}) = {snoise(x):R}"); + } + } + } + + [Fact] + public void FbmBallEnclosesPoints() + { + var random = new System.Random(0xFB11); + for (var b = 0; b < 2000; b++) + { + var centre = RandomCentre(random); + var radius = LogUniform(random, 1.0e-3f, 1.0e3f); + var octaves = random.Next(0, 7); + var lacunarity = Uniform(random, 1.5f, 2.5f); + var gain = Uniform(random, 0.3f, 0.7f); + var bound = iv_fbm_ball(centre, radius, octaves, lacunarity, gain); + for (var i = 0; i < 64; i++) + { + var x = PointInBall(random, centre, radius, i); + var value = fbm_grad(x, octaves, lacunarity, gain).w; + Assert.True(Inside(value, bound), $"iv_fbm_ball({centre}, {radius:R}, {octaves}, {lacunarity:R}, {gain:R}) = {bound} misses {value:R} at {x}"); + } + } + } + + /// + /// The site's march rests on this: a point x in the ball (c, r), displaced by a flow of length at most + /// D, lies in the ball (c, r + D), so snoise of the warped point lies in iv_snoise_ball(c, r + D). The + /// geometric check allows one part in 1e5 for the rounding of x + flow. + /// + [Fact] + public void WarpedPointsStayEnclosed() + { + var random = new System.Random(0x3A4B); + for (var b = 0; b < 2000; b++) + { + var centre = RandomCentre(random); + var radius = LogUniform(random, 1.0e-3f, 2.0f); + var warp = Uniform(random, 0.0f, 1.0f); + var bound = iv_snoise_ball(centre, radius + warp); + for (var i = 0; i < 64; i++) + { + var x = PointInBall(random, centre, radius, i); + var flow = UnitVector(random) * (warp * MathF.Sqrt(random.NextSingle())); + var warped = x + flow; + Assert.True(length(warped - centre) <= (radius + warp) * (1.0f + 1.0e-5f), $"warped point {warped} leaves the ball ({centre}, {radius + warp:R})"); + Assert.True(Inside(snoise(warped), bound), $"iv_snoise_ball({centre}, {radius + warp:R}) = {bound} misses snoise({warped}) = {snoise(warped):R}"); + } + } + } + + // ---- The tile ball and the composed bound ---- + + // One tile case of TileBallEnclosesEveryRaySegment: the r2 domain, or one of the extreme families + // where float32 rounding of the centre is largest against the radius (Soul's verdict s1). + internal static (int N, float Focal, float2 Slope, float Z0, float Z1, float Warp) DrawBallCase(System.Random random, string family) + { + int[] sizes = { 1, 4, 8, 16 }; + float[] depths = { 12.0f, 1000.0f, 2400.0f }; + var n = sizes[random.Next(sizes.Length)]; + var focal = Uniform(random, 500.0f, 3000.0f); + var slope = new float2(Uniform(random, -0.77f, 0.77f), Uniform(random, -0.77f, 0.77f)); + var depth = depths[random.Next(depths.Length)]; + var z0 = random.Next(4) == 0 ? 0.0f : Uniform(random, 0.0f, depth * 0.9f); + var z1 = z0 + LogUniform(random, 1.0e-3f * depth, depth - z0); + var warp = random.Next(4) == 0 ? 0.0f : LogUniform(random, 1.0e-3f, 60.0f); + float Signed(float magnitude) => random.Next(2) == 0 ? -magnitude : magnitude; + switch (family) + { + case "degenerate": + z0 = z1 = LogUniform(random, 1.0e-3f * depth, depth); + break; + case "thin": + z0 = z1 - 1.0e-6f * z1; + break; + case "wide slope": + slope = new float2(Signed(LogUniform(random, 1.0e-3f, 707.0f)), Signed(LogUniform(random, 1.0e-3f, 707.0f))); + break; + case "far": + z1 = LogUniform(random, 1.0e4f, 1.0e7f); + z0 = z1 - z1 * LogUniform(random, 1.0e-6f, 1.0f); + break; + case "from the camera": + z0 = 0.0f; + z1 = LogUniform(random, 1.0e-3f, 1.0f); + break; + case "tiny focal": + focal = LogUniform(random, 1.0f, 500.0f); + break; + case "huge warp": + warp = LogUniform(random, 60.0f, 1.0e6f); + break; + } + + return (n, focal, slope, z0, z1, warp); + } + + /// + /// iv_frustum_ball encloses every exact point of every ray of an N x N tile over a depth segment, + /// sub-pixel jitter included, each point then moved by a flow of length at most warp, with no + /// tolerance: the distance is taken in double from the float32 ball to the point (m z, z) formed in + /// double from the float32 slope and depth. 2,000 seeded tiles of the r2 domain (N in {1, 4, 8, 16}, + /// f in [500, 3000], |m_c| up to 1.1, segments over the slab's, the fog's and the void's depth ranges, + /// a quarter starting at the camera) x 64 points, and 2,000 tiles of each extreme family (z0 == z1; + /// z1 - z0 = 1e-6 z1; |m_c| up to 1000; z up to 1e7; z0 = 0, z1 down to 1e-3; f down to 1; warp up to + /// 1e6) x the 8 points at the footprint's corners at both depth ends. Every corner point's flow is + /// full-length and points outward from the ball's centre. It also pins the ball to the derivation in + /// double, both ways: the centre within 2^-22 |c|_1, and r <= ball.w <= r + 2^-19 (r + |c|_1), so a + /// ball that forgets its rounding widening fails and one that grows past it fails. Misses and pin + /// failures are counted per family and reported together. Each tile's camera is drawn on its own, as a + /// moving camera's frames are: no ball, mask or probe result is carried from one to the next. + /// + [Fact] + public void TileBallEnclosesEveryRaySegment() + { + var random = new System.Random(0x711E); + string[] families = { "r2 domain", "degenerate", "thin", "wide slope", "far", "from the camera", "tiny focal", "huge warp" }; + var misses = new Dictionary(); + var pins = new Dictionary(); + var witness = new List(); + foreach (var family in families) + { + misses[family] = 0; + pins[family] = 0; + for (var t = 0; t < 2000; t++) + { + var (n, focal, slope, z0, z1, warp) = DrawBallCase(random, family); + var half = n / (2.0f * focal); + var footprint = n / (MathF.Sqrt(2.0f) * focal); + var ball = iv_frustum_ball(slope, z0, z1, footprint, warp); + var (cx, cy, cz, w) = ((double)ball.x, (double)ball.y, (double)ball.z, (double)ball.w); + + var zm = (z0 + (double)z1) / 2.0; + var (ex, ey) = (slope.x * zm, slope.y * zm); + var c1 = Math.Abs(ex) + Math.Abs(ey) + Math.Abs(zm); + var radius = (z1 - (double)z0) / 2.0 * Math.Sqrt((double)slope.x * slope.x + (double)slope.y * slope.y + 1.0) + z1 * (double)footprint + warp; + var centreOff = Math.Abs(cx - ex) + Math.Abs(cy - ey) + Math.Abs(cz - zm); + if (!(centreOff <= Math.ScaleB(c1, -22) && radius <= w && w <= radius + Math.ScaleB(radius + c1, -19))) + { + pins[family]++; + if (witness.Count < 8) + witness.Add($"{family} pin: iv_frustum_ball({slope}, {z0:R}, {z1:R}, {footprint:R}, {warp:R}) = {ball}; derivation centre ({ex:R}, {ey:R}, {zm:R}), radius {radius:R}"); + } + + for (var i = 0; i < (family == "r2 domain" ? 64 : 8); i++) + { + var offset = i < 8 + ? new float2((i & 1) == 0 ? -half : half, (i & 2) == 0 ? -half : half) + : new float2(Uniform(random, -half, half), Uniform(random, -half, half)); + var z = i < 8 ? ((i & 4) == 0 ? z0 : z1) : Uniform(random, z0, z1); + var m = slope + offset; + var (px, py, pz) = (m.x * (double)z, m.y * (double)z, (double)z); + double fx, fy, fz; + if (i < 8) + { + // Outward: along the corner's direction from the centre, full length. + var (dx, dy, dz) = (px - cx, py - cy, pz - cz); + var away = Math.Sqrt(dx * dx + dy * dy + dz * dz); + (fx, fy, fz) = away > 0.0 ? (dx / away * warp, dy / away * warp, dz / away * warp) : (warp, 0.0, 0.0); + } + else + { + var flow = UnitVector(random) * (warp * MathF.Sqrt(random.NextSingle())); + (fx, fy, fz) = (flow.x, flow.y, flow.z); + } + + var (qx, qy, qz) = (px + fx - cx, py + fy - cy, pz + fz - cz); + var distance = Math.Sqrt(qx * qx + qy * qy + qz * qz); + if (!(distance <= w)) + { + misses[family]++; + if (witness.Count < 8) + witness.Add($"{family}: iv_frustum_ball({slope}, {z0:R}, {z1:R}, {footprint:R}, {warp:R}) = {ball} misses slope {m}, depth {z:R} by {(distance - w) / w:R} r"); + } + } + } + } + + Assert.True(misses.Values.Sum() + pins.Values.Sum() == 0, + "misses " + string.Join(", ", families.Select(f => $"{f} {misses[f]}")) + "; pin failures " + string.Join(", ", families.Select(f => $"{f} {pins[f]}")) + + Environment.NewLine + string.Join(Environment.NewLine, witness)); + } + + /// + /// intervals-enclose for the composition the site and Aetheria use: over 2,000 seeded tile slices + /// (the deep well, the shallow wells and inside the fog, each under the centred-warp interval bound + /// and the affine bound; the void at every grid point, the shipped void and LOD-far; N in + /// {1, 4, 8, 16}; a camera drawn per tile) the bound composed from the envelope over the slice's box, + /// its fade, and the noise enclosure encloses the density at 64 points of the slice, each sampled + /// through the field's own warp, with no tolerance. The void's footprint-truncated density (octave weights) is checked + /// against the same bound; a quarter of the slices are LOD-far's, where the weights are strictly + /// between 0 and 1 and at 0, and the test asserts it sampled both. + /// + [Fact] + public void EnvelopeBoundEnclosesDensity() + { + var random = new System.Random(0xE7B0); + int[] sizes = { 1, 4, 8, 16 }; + var fog = new List(); + foreach (var mode in new[] { BoundMode.Interval, BoundMode.Affine }) + { + fog.Add(FogField.DeepWell(FogField.AetheriaWarp, mode)); + fog.Add(FogField.Wells(FogField.AetheriaWarp, mode)); + fog.Add(FogField.InsideFog(FogField.AetheriaWarp, mode)); + } + + var fields = new List(); + foreach (var rh in VoidField.HollowRadii) + foreach (var offset in VoidField.CameraOffsets) + foreach (var ramp in VoidField.Ramps) + fields.Add(new VoidField(rh, ramp, offset.Fraction, offset.Name)); + fields.Add(VoidField.Shipped()); + fields.Add(VoidField.LodFar()); + var counts = new Counts(); + var (partial, zero) = (0, 0); + for (var t = 0; t < 2000; t++) + { + var field = t % 2 == 0 ? fog[(t / 2) % fog.Count] : t % 4 == 1 ? fields[^1] : fields[random.Next(fields.Count)]; + var tile = field.DrawTile(random, sizes[random.Next(sizes.Length)]); + var near = field.Grid[0]; + var far = field.Grid[^1]; + var z0 = Uniform(random, near, far * 0.9f); + var z1 = z0 + LogUniform(random, 1.0e-3f * far, far - z0); + var bound = field.Bound(tile, z0, z1, gated: false, counts); + for (var i = 0; i < 64; i++) + { + var m = tile.PixelSlope(random.Next(tile.N), random.Next(tile.N), random.NextSingle(), random.NextSingle()); + var z = i < 2 ? (i == 0 ? z0 : z1) : Uniform(random, z0, z1); + var density = field.Density(tile, m, z, lod: false, counts); + Assert.True(Inside(density, bound), $"{field.Name}: bound {bound} over [{z0:R}, {z1:R}] misses density {density:R} at slope {m}, depth {z:R}"); + if (field is VoidField voidField) + { + var (wc, wd) = voidField.Weights(z); + partial += (wc > 0.0f && wc < 1.0f) || (wd > 0.0f && wd < 1.0f) ? 1 : 0; + zero += wd == 0.0f ? 1 : 0; + var truncated = field.Density(tile, m, z, lod: true, counts); + Assert.True(Inside(truncated, bound), $"{field.Name}: bound {bound} misses the truncated density {truncated:R} at slope {m}, depth {z:R}"); + } + } + } + + // The truncated check is not vacuous: some samples carry an octave weight strictly inside (0, 1) + // and some a fine weight of 0 (LOD-far reaches both). + Assert.True(partial > 0 && zero > 0, $"octave weights in (0, 1) at {partial} samples and fine weight 0 at {zero}"); + } + + /// + /// VoidField's octave weight bound over [z0, z1] encloses each octave's weight at every depth of the + /// segment, and, for a one-signed noise interval n = [0.25, 1], the weighted noise w(z) n_s lies in + /// iv_mul(bound, n). 2,000 LOD-far segments with z0 ~ U(1460, 0.95 grid end), z1 ~ U(z0, grid end), + /// 16 depths each including both ends. A bound whose lower end is w(z0) misses w(z1) 0.25 wherever the + /// weight falls across the segment. + /// + [Fact] + public void WeightBoundEnclosesOneSignedNoise() + { + var field = VoidField.LodFar(); + var random = new System.Random(0x3B0D); + var end = field.Grid[^1]; + var n = new float2(0.25f, 1.0f); + for (var i = 0; i < 2000; i++) + { + var z0 = Uniform(random, 1460.0f, 0.95f * end); + var z1 = Uniform(random, z0, end); + var (coarseBound, fineBound) = field.WeightBounds(z0, z1); + for (var s = 0; s < 16; s++) + { + var z = s == 0 ? z0 : s == 15 ? z1 : Uniform(random, z0, z1); + var (coarse, fine) = field.Weights(z); + foreach (var (octave, w, bound) in new[] { ("coarse", coarse, coarseBound), ("fine", fine, fineBound) }) + { + Assert.True(Inside(w, bound), $"{octave} weight {w:R} at depth {z:R} lies outside its bound {bound} over [{z0:R}, {z1:R}]"); + var weighted = iv_mul(bound, n); + foreach (var ns in new[] { 0.25f, Uniform(random, 0.25f, 1.0f), 1.0f }) + Assert.True(Inside(w * ns, weighted), $"{octave} weight {w:R} x noise {ns:R} at depth {z:R} lies outside iv_mul({bound}, {n}) = {weighted} over [{z0:R}, {z1:R}]"); + } + } + } + } + + // ---- The Lipschitz constant ---- + + private static float GradientNorm(float3 p) + { + var g = snoise_grad(p); + return MathF.Sqrt(g.x * g.x + g.y * g.y + g.z * g.z); + } + + // Hill-climbs |snoise_grad| from p: the ascent direction is the central difference of |grad|, the + // step grows on success and halves on failure. Returns the largest |grad| it reached. + private static float AscendGradientNorm(float3 p) + { + const float h = 1.0e-3f; + var step = 1.0e-2f; + var best = GradientNorm(p); + for (var k = 0; k < 200 && step > 1.0e-6f; k++) + { + var d = new float3( + GradientNorm(p + new float3(h, 0.0f, 0.0f)) - GradientNorm(p - new float3(h, 0.0f, 0.0f)), + GradientNorm(p + new float3(0.0f, h, 0.0f)) - GradientNorm(p - new float3(0.0f, h, 0.0f)), + GradientNorm(p + new float3(0.0f, 0.0f, h)) - GradientNorm(p - new float3(0.0f, 0.0f, h))); + if (dot(d, d) == 0.0f) + break; + var q = p + normalize(d) * step; + var value = GradientNorm(q); + if (value > best) + { + p = q; + best = value; + step *= 1.5f; + } + else + { + step *= 0.5f; + } + } + + return best; + } + + // Same climb on |snoise|, along the value's own analytic gradient. + private static float AscendAbsValue(float3 p) + { + var step = 1.0e-2f; + var best = MathF.Abs(snoise(p)); + for (var k = 0; k < 200 && step > 1.0e-6f; k++) + { + var g = snoise_grad(p); + var d = new float3(g.x, g.y, g.z) * (g.w < 0.0f ? -1.0f : 1.0f); + if (dot(d, d) == 0.0f) + break; + var q = p + normalize(d) * step; + var value = MathF.Abs(snoise(q)); + if (value > best) + { + p = q; + best = value; + step *= 1.5f; + } + else + { + step *= 0.5f; + } + } + + return best; + } + + // The largest |snoise_grad| over `samples` seeded points in [-256, 256]^3, the largest after refining + // the `refine` largest of them by ascent, and the start whose ascent reached it (the witness). + private static (float Sampled, float Refined, float3 Witness) MeasureGradient(int seed, int samples, int refine) + { + var random = new System.Random(seed); + var points = new float3[samples]; + var norms = new float[samples]; + for (var i = 0; i < samples; i++) + { + points[i] = new float3(Uniform(random, -256.0f, 256.0f), Uniform(random, -256.0f, 256.0f), Uniform(random, -256.0f, 256.0f)); + norms[i] = GradientNorm(points[i]); + } + + var order = Enumerable.Range(0, samples).OrderByDescending(i => norms[i]).Take(Math.Max(refine, 1)).ToArray(); + var refined = norms[order[0]]; + var witness = points[order[0]]; + foreach (var i in order.Take(refine)) + { + var value = AscendGradientNorm(points[i]); + if (value > refined) + { + refined = value; + witness = points[i]; + } + } + + return (norms[order[0]], refined, witness); + } + + /// + /// The provenance of SNOISE_LIPSCHITZ: the largest |snoise_grad| over 1e6 seeded points, the 1e4 + /// largest refined by gradient ascent, times 1.10. Prints the start whose ascent reached the maximum, + /// which LipschitzConstantPinsSampledGradients climbs from again. Also prints the largest |snoise| + /// reached the same way, which is what lets iv_snoise_ball intersect with [-1, 1]. Slow; run + /// explicitly after any change to the snoise kernel and re-pin the constant and the witness. + /// + [Fact(Explicit = true)] + [Trait("Category", "Slow")] + public void MeasureLipschitz() + { + var (sampled, refined, witness) = MeasureGradient(0x11B5, 1_000_000, 10_000); + var random = new System.Random(0xAB5); + var valueStarts = Enumerable.Range(0, 10_000) + .Select(_ => new float3(Uniform(random, -256.0f, 256.0f), Uniform(random, -256.0f, 256.0f), Uniform(random, -256.0f, 256.0f))); + var maxValue = valueStarts.Max(AscendAbsValue); + output.WriteLine($"IV-REPORT lipschitz: max |snoise_grad| sampled {sampled:R}, refined {refined:R}, x 1.10 = {refined * 1.10f:R}, witness ({witness.x:R}, {witness.y:R}, {witness.z:R}); max |snoise| refined {maxValue:R}"); + Assert.True(refined <= SNOISE_LIPSCHITZ, $"measured {refined:R} exceeds SNOISE_LIPSCHITZ {SNOISE_LIPSCHITZ:R}"); + Assert.True(maxValue < 1.0f, $"|snoise| reaches {maxValue:R}; iv_snoise_ball may not intersect with [-1, 1]"); + } + + // The start MeasureLipschitz printed as its witness. + private static readonly float3 LipschitzWitness = new(229.92526f, 73.37927f, -66.14595f); + + /// + /// Pins SNOISE_LIPSCHITZ: no |snoise_grad| over 1e5 seeded points exceeds it, and the ascent from + /// MeasureLipschitz's witness reaches a maximum that, times 1.10, equals the constant bit for bit + /// (the expression MeasureLipschitz prints), so any moved constant fails here. + /// + [Fact] + public void LipschitzConstantPinsSampledGradients() + { + var (sampled, _, _) = MeasureGradient(0x11B6, 100_000, 0); + Assert.True(sampled <= SNOISE_LIPSCHITZ, $"|snoise_grad| reaches {sampled:R}, above SNOISE_LIPSCHITZ {SNOISE_LIPSCHITZ:R}"); + var refined = AscendGradientNorm(LipschitzWitness); + Assert.True(refined <= SNOISE_LIPSCHITZ, $"|snoise_grad| reaches {refined:R}, above SNOISE_LIPSCHITZ {SNOISE_LIPSCHITZ:R}"); + var measured = 1.10f * refined; + Assert.True(SNOISE_LIPSCHITZ == measured, $"SNOISE_LIPSCHITZ is {SNOISE_LIPSCHITZ:R}, the re-measured 1.10 x {refined:R} is {measured:R}; re-run MeasureLipschitz and re-pin"); + } + + // ---- The curvature and 2D Lipschitz constants (math.Affine.cs, math.Interval.cs) ---- + + // Central differences over exact float32 steps: the step actually taken is (p + h) - p in float32, so + // the quotient is not skewed by the rounding of p + h far from the origin. + private static double Step(float x, float h, out double back) { back = x - (double)(x - h); return (x + h) - (double)x; } + + // The spectral norm (largest absolute eigenvalue) of snoise's Hessian at p: the library's own + // snoise_hessian, symmetric bit for bit, then the closed-form eigenvalues of a symmetric 3x3. + private static double HessianNorm(float3 p) + { + var m = snoise_hessian(p); + var (a00, a11, a22) = ((double)m._m00, (double)m._m11, (double)m._m22); + var (a01, a02, a12) = ((double)m._m01, (double)m._m02, (double)m._m12); + var p1 = a01 * a01 + a02 * a02 + a12 * a12; + if (p1 == 0.0) + return Math.Max(Math.Abs(a00), Math.Max(Math.Abs(a11), Math.Abs(a22))); + var q = (a00 + a11 + a22) / 3; + var p2 = (a00 - q) * (a00 - q) + (a11 - q) * (a11 - q) + (a22 - q) * (a22 - q) + 2 * p1; + var s = Math.Sqrt(p2 / 6); + var (b00, b11, b22, b01, b02, b12) = ((a00 - q) / s, (a11 - q) / s, (a22 - q) / s, a01 / s, a02 / s, a12 / s); + var r = Math.Clamp((b00 * (b11 * b22 - b12 * b12) - b01 * (b01 * b22 - b12 * b02) + b02 * (b01 * b12 - b11 * b02)) / 2, -1.0, 1.0); + var phi = Math.Acos(r) / 3; + var largest = q + 2 * s * Math.Cos(phi); + var smallest = q + 2 * s * Math.Cos(phi + 2 * Math.PI / 3); + return Math.Max(Math.Abs(largest), Math.Abs(smallest)); + } + + // The gradient length of snoise(float2) at p, from central differences at h = 1e-3. + private static double Gradient2Norm(float2 p) + { + const float h = 1.0e-3f; + var fx = Step(p.x, h, out var bx); + var fy = Step(p.y, h, out var by); + var gx = (snoise(p + new float2(h, 0.0f)) - (double)snoise(p - new float2(h, 0.0f))) / (fx + bx); + var gy = (snoise(p + new float2(0.0f, h)) - (double)snoise(p - new float2(0.0f, h))) / (fy + by); + return Math.Sqrt(gx * gx + gy * gy); + } + + // Hill-climbs f from p as AscendGradientNorm does: the ascent direction is f's central difference, + // the step grows on success and halves on failure. Returns the largest value reached. + private static double Ascend(Func f, float3 p) => AscendPoint(f, p).Best; + + private static (double Best, float3 At) AscendPoint(Func f, float3 p) + { + const float h = 1.0e-3f; + var step = 1.0e-2f; + var best = f(p); + for (var k = 0; k < 200 && step > 1.0e-6f; k++) + { + var d = new float3( + (float)(f(p + new float3(h, 0.0f, 0.0f)) - f(p - new float3(h, 0.0f, 0.0f))), + (float)(f(p + new float3(0.0f, h, 0.0f)) - f(p - new float3(0.0f, h, 0.0f))), + (float)(f(p + new float3(0.0f, 0.0f, h)) - f(p - new float3(0.0f, 0.0f, h)))); + if (dot(d, d) == 0.0f) + break; + var q = p + normalize(d) * step; + var value = f(q); + if (value > best) + { + p = q; + best = value; + step *= 1.5f; + } + else + { + step *= 0.5f; + } + } + + return (best, p); + } + + private static double Ascend2(Func f, float2 p) => Ascend(q => f(new float2(q.x, q.y)), new float3(p.x, p.y, 0.0f)); + + // The largest f over `samples` seeded points of [-256, 256]^dims, the largest after refining the + // `refine` largest by ascent, and the start whose ascent reached it (the witness). + private static (double Sampled, double Refined, float3 Witness) MeasureMax(Func f, bool planar, int seed, int samples, int refine) + { + var random = new System.Random(seed); + var points = new float3[samples]; + var values = new double[samples]; + for (var i = 0; i < samples; i++) + { + points[i] = new float3(Uniform(random, -256.0f, 256.0f), Uniform(random, -256.0f, 256.0f), planar ? 0.0f : Uniform(random, -256.0f, 256.0f)); + values[i] = f(points[i]); + } + + var order = Enumerable.Range(0, samples).OrderByDescending(i => values[i]).Take(Math.Max(refine, 1)).ToArray(); + var refined = values[order[0]]; + var witness = points[order[0]]; + foreach (var i in order.Take(refine)) + { + var value = planar ? Ascend2(q => f(new float3(q.x, q.y, 0.0f)), new float2(points[i].x, points[i].y)) : Ascend(f, points[i]); + if (value > refined) + { + refined = value; + witness = points[i]; + } + } + + return (values[order[0]], refined, witness); + } + + private static double Gradient2At(float3 p) => Gradient2Norm(new float2(p.x, p.y)); + + /// + /// The provenance of SNOISE_HESSIAN: the largest spectral norm of snoise's Hessian (HessianNorm) over + /// 1e6 seeded points of [-256, 256]^3, the 1e4 largest refined by ascent, times 1.10. Prints the + /// start whose ascent reached the maximum, which HessianConstantPinsSampledCurvature climbs from + /// again. Slow; run explicitly after any change to the snoise kernel and re-pin the constant and the + /// witness. + /// + [Fact(Explicit = true)] + [Trait("Category", "Slow")] + public void MeasureHessian() + { + var (sampled, refined, witness) = MeasureMax(HessianNorm, false, 0x4E55, 1_000_000, 10_000); + output.WriteLine($"IV-REPORT hessian: max |H| sampled {sampled:R}, refined {refined:R}, x 1.10 = {(float)(refined * 1.10):R}, witness ({witness.x:R}, {witness.y:R}, {witness.z:R})"); + Assert.True(refined <= SNOISE_HESSIAN, $"measured {refined:R} exceeds SNOISE_HESSIAN {SNOISE_HESSIAN:R}"); + } + + // The start MeasureHessian printed as its witness. + private static readonly float3 HessianWitness = new(-13.7920685f, -9.672134f, 61.563934f); + + /// + /// Pins SNOISE_HESSIAN: no Hessian norm over 1e5 seeded points exceeds it, and the ascent from + /// MeasureHessian's witness reaches a maximum that, times 1.10, equals the constant bit for bit + /// (the expression MeasureHessian prints), so any moved constant fails here. + /// + [Fact] + public void HessianConstantPinsSampledCurvature() + { + var (sampled, _, _) = MeasureMax(HessianNorm, false, 0x4E56, 100_000, 0); + Assert.True(sampled <= SNOISE_HESSIAN, $"the Hessian norm reaches {sampled:R}, above SNOISE_HESSIAN {SNOISE_HESSIAN:R}"); + var refined = Ascend(HessianNorm, HessianWitness); + Assert.True(refined <= SNOISE_HESSIAN, $"the Hessian norm reaches {refined:R}, above SNOISE_HESSIAN {SNOISE_HESSIAN:R}"); + var measured = (float)(refined * 1.10); + Assert.True(SNOISE_HESSIAN == measured, $"SNOISE_HESSIAN is {SNOISE_HESSIAN:R}, the re-measured 1.10 x {refined:R} is {measured:R}; re-run MeasureHessian and re-pin"); + } + + // ---- The third-derivative constant (math.Span.cs) ---- + + private static float3 CultMod289(float3 v) => v - floor(v * (1.0f / 289.0f)) * 289.0f; + private static float4 CultMod289(float4 v) => v - floor(v * (1.0f / 289.0f)) * 289.0f; + private static float4 CultPermute(float4 v) => CultMod289(((v * 34.0f) + 10.0f) * v); + + // The four simplex corners of snoise at (vx, vy, vz): each corner's offset x_c from the point, and its + // gradient direction p_c, in double, with snoise_hessian's lattice, step() tie order and (float) hash, + // so one corner table serves the Hessian and its derivative. Key names the lattice cell and traversal + // order: two points with the same key are differentiated through the same corners. + internal static (double[][] X, double[][] P, double[] Key) Corners(double vx, double vy, double vz) + { + const double cx = 1.0 / 6.0; + const double cy = 1.0 / 3.0; + var skew = (vx + vy + vz) * cy; + double ix = Math.Floor(vx + skew), iy = Math.Floor(vy + skew), iz = Math.Floor(vz + skew); + var unskew = (ix + iy + iz) * cx; + double x0 = vx - ix + unskew, y0 = vy - iy + unskew, z0 = vz - iz + unskew; + double gx = x0 >= y0 ? 1.0 : 0.0, gy = y0 >= z0 ? 1.0 : 0.0, gz = 1.0 - (x0 >= z0 ? 1.0 : 0.0); + double lx = 1.0 - gx, ly = 1.0 - gy, lz = 1.0 - gz; + double i1x = Math.Min(gx, lz), i1y = Math.Min(gy, lx), i1z = Math.Min(gz, ly); + double i2x = Math.Max(gx, lz), i2y = Math.Max(gy, lx), i2z = Math.Max(gz, ly); + var x = new[] + { + new[] { x0, y0, z0 }, + new[] { x0 - i1x + cx, y0 - i1y + cx, z0 - i1z + cx }, + new[] { x0 - i2x + cy, y0 - i2y + cy, z0 - i2z + cy }, + new[] { x0 - 0.5, y0 - 0.5, z0 - 0.5 }, + }; + + var i = CultMod289(new float3((float)ix, (float)iy, (float)iz)); + var hash = CultPermute(CultPermute(CultPermute( + i.z + new float4(0.0f, (float)i1z, (float)i2z, 1.0f)) + i.y + new float4(0.0f, (float)i1y, (float)i2y, 1.0f)) + i.x + new float4(0.0f, (float)i1x, (float)i2x, 1.0f)); + const float n = 0.142857142857f; + var ns = new float3(2.0f * n, 0.5f * n - 1.0f, n); + var j = hash - 49.0f * floor(hash * ns.z * ns.z); + var xs = floor(j * ns.z); + var ys = floor(j - 7.0f * xs); + var gxs = xs * ns.x + ns.y; + var gys = ys * ns.x + ns.y; + var h = 1.0f - abs(gxs) - abs(gys); + var b0 = new float4(gxs.x, gxs.y, gys.x, gys.y); + var b1 = new float4(gxs.z, gxs.w, gys.z, gys.w); + var s0 = floor(b0) * 2.0f + 1.0f; + var s1 = floor(b1) * 2.0f + 1.0f; + var sh = -step(h, 0.0f); + var a0 = new float4(b0.x, b0.z, b0.y, b0.w) + new float4(s0.x, s0.z, s0.y, s0.w) * new float4(sh.x, sh.x, sh.y, sh.y); + var a1 = new float4(b1.x, b1.z, b1.y, b1.w) + new float4(s1.x, s1.z, s1.y, s1.w) * new float4(sh.z, sh.z, sh.w, sh.w); + var p0 = new float3(a0.x, a0.y, h.x); + var p1 = new float3(a0.z, a0.w, h.y); + var p2 = new float3(a1.x, a1.y, h.z); + var p3 = new float3(a1.z, a1.w, h.w); + var norm = 1.79284291400159f - 0.85373472095314f * new float4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + double[] Of(float3 v) => new double[] { v.x, v.y, v.z }; + return (x, new[] { Of(p0), Of(p1), Of(p2), Of(p3) }, new[] { ix, iy, iz, i1x, i1y, i1z, i2x, i2y, i2z }); + } + + // The Hessian of snoise at v in double, entry i * 3 + j: snoise_hessian's per-corner derivation, summed + // over Corners. A corner with m = 0.5 - |x|^2 <= 0 contributes nothing. + internal static double[] HessianDouble(double vx, double vy, double vz) + { + var (x, p, _) = Corners(vx, vy, vz); + var hessian = new double[9]; + for (var c = 0; c < 4; c++) + { + var m = 0.5 - (x[c][0] * x[c][0] + x[c][1] * x[c][1] + x[c][2] * x[c][2]); + if (m <= 0.0) + continue; + var s = p[c][0] * x[c][0] + p[c][1] * x[c][1] + p[c][2] * x[c][2]; + for (var i = 0; i < 3; i++) + for (var k = 0; k < 3; k++) + hessian[i * 3 + k] += 105.0 * (48.0 * m * m * s * x[c][i] * x[c][k] + - 8.0 * m * m * m * (p[c][k] * x[c][i] + p[c][i] * x[c][k] + (i == k ? s : 0.0))); + } + + return hessian; + } + + // The value of snoise at v in double: 105 sum m^4 s over Corners, the kernel's exact value (the tied + // kernel, as HessianDouble is its exact Hessian). + internal static double ValueDouble(double vx, double vy, double vz) + { + var (x, p, _) = Corners(vx, vy, vz); + var total = 0.0; + for (var c = 0; c < 4; c++) + { + var m = 0.5 - (x[c][0] * x[c][0] + x[c][1] * x[c][1] + x[c][2] * x[c][2]); + if (m <= 0.0) + continue; + total += 105.0 * m * m * m * m * (p[c][0] * x[c][0] + p[c][1] * x[c][1] + p[c][2] * x[c][2]); + } + + return total; + } + + // The gradient of snoise at v in double: 105 sum (m^4 p - 8 m^3 s x) over Corners, the derivative of + // ValueDouble (every corner's x moves one for one with v, dm = -2 x, ds = p). + internal static double[] GradDouble(double vx, double vy, double vz) + { + var (x, p, _) = Corners(vx, vy, vz); + var gradient = new double[3]; + for (var c = 0; c < 4; c++) + { + var m = 0.5 - (x[c][0] * x[c][0] + x[c][1] * x[c][1] + x[c][2] * x[c][2]); + if (m <= 0.0) + continue; + var s = p[c][0] * x[c][0] + p[c][1] * x[c][1] + p[c][2] * x[c][2]; + for (var i = 0; i < 3; i++) + gradient[i] += 105.0 * (m * m * m * m * p[c][i] - 8.0 * m * m * m * s * x[c][i]); + } + + return gradient; + } + + /// + /// GradDouble is the kernel's gradient: within float rounding of snoise_grad (L1 distance at most 2e-4) + /// at 300 seeded points of [-20, 20]^3, the way ExactReferenceIsTheKernel pins ValueDouble. + /// + [Fact] + public void GradDoubleIsTheKernelsGradient() + { + var random = new System.Random(0x6BAD); + double Coordinate() => random.NextDouble() * 40.0 - 20.0; + for (var k = 0; k < 300; k++) + { + var p = new float3((float)Coordinate(), (float)Coordinate(), (float)Coordinate()); + var exact = GradDouble(p.x, p.y, p.z); + var kernel = snoise_grad(p); + var distance = Math.Abs(exact[0] - kernel.x) + Math.Abs(exact[1] - kernel.y) + Math.Abs(exact[2] - kernel.z); + Assert.True(distance <= 2.0e-4, $"GradDouble({p}) is {exact[0]:R}, {exact[1]:R}, {exact[2]:R}, snoise_grad {kernel.x:R}, {kernel.y:R}, {kernel.z:R}"); + } + } + + private static double Delta(int a, int b) => a == b ? 1.0 : 0.0; + + // The symmetric third-derivative tensor of snoise at p, entry (i * 3 + j) * 3 + k, in closed form: + // snoise_hessian's per-corner entry 105 (48 m^2 s x_i x_j - 8 m^3 (p_j x_i + p_i x_j + s delta_ij)) + // differentiated by x_k (dm = -2 x_k, ds = p_k, every corner's x moves one for one with p), which sums + // to 105 (-192 m s x_i x_j x_k + 48 m^2 (p_k x_i x_j + p_j x_i x_k + p_i x_j x_k) + // + 48 m^2 s (delta_ik x_j + delta_jk x_i + delta_ij x_k) - 8 m^3 (p_j delta_ik + p_i delta_jk + p_k delta_ij)). + // Symmetric in i, j and k by construction, so there is no symmetrising pass. + private static double[] ThirdTensor(float3 p) + { + var (x, g, _) = Corners(p.x, p.y, p.z); + var t = new double[27]; + for (var c = 0; c < 4; c++) + { + var m = 0.5 - (x[c][0] * x[c][0] + x[c][1] * x[c][1] + x[c][2] * x[c][2]); + if (m <= 0.0) + continue; + var s = g[c][0] * x[c][0] + g[c][1] * x[c][1] + g[c][2] * x[c][2]; + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + for (var k = 0; k < 3; k++) + t[(i * 3 + j) * 3 + k] += 105.0 * (-192.0 * m * s * x[c][i] * x[c][j] * x[c][k] + + 48.0 * m * m * (g[c][k] * x[c][i] * x[c][j] + g[c][j] * x[c][i] * x[c][k] + g[c][i] * x[c][j] * x[c][k]) + + 48.0 * m * m * s * (Delta(i, k) * x[c][j] + Delta(j, k) * x[c][i] + Delta(i, j) * x[c][k]) + - 8.0 * m * m * m * (g[c][j] * Delta(i, k) + g[c][i] * Delta(j, k) + g[c][k] * Delta(i, j))); + } + + return t; + } + + /// + /// ThirdTensor is the third derivative of snoise: HessianDouble is the kernel's Hessian (within float + /// rounding of snoise_hessian over 200 seeded points, which proves Corners is the kernel's lattice), + /// and the closed form equals central differences of HessianDouble, Richardson-extrapolated from steps + /// h = 1e-3 and 2e-3 (error O(h^4)), at every one of 27 entries of every point whose neighbours share + /// its lattice cell and clear every corner's support edge. Dropping or mis-signing any term of the closed form moves some entry by far more + /// than the tolerance. + /// + [Fact] + public void ThirdTensorMatchesDifferencesOfTheHessian() + { + var random = new System.Random(0x7D1); + var compared = 0; + var largest = 0.0; + var worst = 0.0; + for (var n = 0; n < 400; n++) + { + var p = new float3(Uniform(random, -256.0f, 256.0f), Uniform(random, -256.0f, 256.0f), Uniform(random, -256.0f, 256.0f)); + var hd = HessianDouble(p.x, p.y, p.z); + var kernel = snoise_hessian(p); + if (n < 200) + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + Assert.True(Math.Abs(hd[i * 3 + j] - kernel[i][j]) <= 0.1, $"HessianDouble({p}) entry {i},{j} is {hd[i * 3 + j]:R}, snoise_hessian {kernel[i][j]:R}"); + + double[] At(int axis, double delta) => + HessianDouble(p.x + (axis == 0 ? delta : 0.0), p.y + (axis == 1 ? delta : 0.0), p.z + (axis == 2 ? delta : 0.0)); + var (corner, _, key) = Corners(p.x, p.y, p.z); + // A corner whose support edge (m = 0) lies within the differencing window has a kink in the + // Hessian's second derivative there, which the O(h^4) extrapolation does not cover. + if (corner.Any(c => Math.Abs(0.5 - (c[0] * c[0] + c[1] * c[1] + c[2] * c[2])) < 0.01)) + continue; + var sameCell = true; + for (var axis = 0; axis < 3; axis++) + foreach (var delta in new[] { -2.0e-3, 2.0e-3 }) + sameCell &= Corners(p.x + (axis == 0 ? delta : 0.0), p.y + (axis == 1 ? delta : 0.0), p.z + (axis == 2 ? delta : 0.0)).Key.SequenceEqual(key); + if (!sameCell) + continue; + + var closed = ThirdTensor(p); + compared++; + for (var k = 0; k < 3; k++) + { + var (plus1, minus1, plus2, minus2) = (At(k, 1.0e-3), At(k, -1.0e-3), At(k, 2.0e-3), At(k, -2.0e-3)); + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + { + var d1 = (plus1[i * 3 + j] - minus1[i * 3 + j]) / 2.0e-3; + var d2 = (plus2[i * 3 + j] - minus2[i * 3 + j]) / 4.0e-3; + var richardson = (4.0 * d1 - d2) / 3.0; + var entry = closed[(i * 3 + j) * 3 + k]; + largest = Math.Max(largest, Math.Abs(entry)); + worst = Math.Max(worst, Math.Abs(entry - richardson) / (1.0 + Math.Abs(entry))); + } + } + } + + output.WriteLine($"IV-REPORT third oracle: {compared} points, largest entry {largest:R}, worst relative difference from the Richardson differences {worst:R}"); + Assert.True(compared >= 250, $"only {compared} of 400 points kept their lattice cell and cleared the support edges"); + Assert.True(largest >= 200.0, $"the largest third-derivative entry compared is {largest:R}: the check has no teeth"); + Assert.True(worst <= 1.0e-6, $"the closed-form third tensor differs from the differenced Hessian by {worst:R} (relative)"); + } + + // T(u, u, u) for a symmetric 3-tensor. + private static double Cubic(double[] t, double[] u) + { + var sum = 0.0; + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + for (var k = 0; k < 3; k++) + sum += t[(i * 3 + j) * 3 + k] * u[i] * u[j] * u[k]; + return sum; + } + + // The 26 unit directions of the axes, the edge midpoints and the cube corners. + private static readonly double[][] TensorStarts = Enumerable.Range(0, 27).Select(c => new[] { c % 3 - 1.0, c / 3 % 3 - 1.0, c / 9 - 1.0 }) + .Where(v => v[0] != 0.0 || v[1] != 0.0 || v[2] != 0.0) + .Select(v => { var length = Math.Sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); return new[] { v[0] / length, v[1] / length, v[2] / length }; }).ToArray(); + + // The operator norm of a symmetric 3-tensor, max over unit u of |T(u, u, u)| (for a symmetric tensor + // that is the injective norm). From the six of 26 starts (axes, edge midpoints, cube corners) with + // the largest |T(u, u, u)|, the shifted power ascent u <- normalise(T(u, u, .) +- alpha u), with alpha + // twice the largest absolute row sum, which makes the iteration monotone in the cubic form (Kolda and + // Mayo's SS-HOPM), the sign chosen as the start's. A local maximum, so a lower bound; MeasureThird + // checks it against a dense direction sweep at its witness. + private static double TensorNorm(double[] t) + { + var alpha = 0.0; + for (var i = 0; i < 3; i++) + { + var row = 0.0; + for (var jk = 0; jk < 9; jk++) + row += Math.Abs(t[i * 9 + jk]); + alpha = Math.Max(alpha, 2.0 * row); + } + + var best = 0.0; + var g = new double[3]; + foreach (var start in TensorStarts.OrderByDescending(v => Math.Abs(Cubic(t, v))).Take(6)) + { + var u = (double[])start.Clone(); + var sign = Cubic(t, u) < 0.0 ? -1.0 : 1.0; + for (var iteration = 0; iteration < 40; iteration++) + { + for (var i = 0; i < 3; i++) + { + var sum = 0.0; + for (var j = 0; j < 3; j++) + for (var k = 0; k < 3; k++) + sum += t[(i * 3 + j) * 3 + k] * u[j] * u[k]; + g[i] = sign * sum + alpha * u[i]; + } + + var length = Math.Sqrt(g[0] * g[0] + g[1] * g[1] + g[2] * g[2]); + if (length == 0.0) + break; + var moved = 0.0; + for (var i = 0; i < 3; i++) + { + var next = g[i] / length; + moved += (next - u[i]) * (next - u[i]); + u[i] = next; + } + + if (moved < 1.0e-20) + break; + } + + best = Math.Max(best, Math.Abs(Cubic(t, u))); + } + + return best; + } + + // The operator norm of snoise's third-derivative tensor at p. + private static double ThirdNorm(float3 p) => TensorNorm(ThirdTensor(p)); + + [Fact] + public void TensorNormFindsKnownMaxima() + { + // T = e_x (x) e_x (x) e_x: the cubic form is u_x^3, norm 1. + var single = new double[27]; + single[0] = 1.0; + Assert.InRange(TensorNorm(single), 1.0 - 1.0e-9, 1.0 + 1.0e-9); + + // The six permutations of (0, 1, 2) at 1: the cubic form is 6 u_x u_y u_z, largest on the cube + // diagonal at 6 / (3 sqrt 3) = 2 / sqrt 3. + var permutations = new double[27]; + foreach (var (i, j, k) in new[] { (0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0) }) + permutations[(i * 3 + j) * 3 + k] = 1.0; + Assert.InRange(TensorNorm(permutations), 2.0 / Math.Sqrt(3.0) - 1.0e-9, 2.0 / Math.Sqrt(3.0) + 1.0e-9); + + // A negative extremum counts by its absolute value. + var negative = new double[27]; + negative[13] = -3.0; + Assert.InRange(TensorNorm(negative), 3.0 - 1.0e-9, 3.0 + 1.0e-9); + } + + /// + /// The provenance of SNOISE_THIRD: the largest operator norm of snoise's closed-form third-derivative + /// tensor (ThirdNorm, ThirdTensor) over 1e6 seeded points of [-256, 256]^3, the 1e4 largest refined by ascent over the point, + /// times 1.10, on the tied kernel. Prints the start whose ascent reached the maximum, which + /// ThirdConstantPinsSampled climbs from again, and a sweep of 20,000 directions at the point the + /// ascent ends on (the tensor norm there against the largest cubic form the sweep finds, so the + /// tightness of the inner maximisation is on the record). Slow; run explicitly after any change to the + /// snoise kernel and re-pin the constant and the witness. + /// + [Fact(Explicit = true)] + [Trait("Category", "Slow")] + public void MeasureThird() + { + var (sampled, refined, witness) = MeasureMax(ThirdNorm, false, 0x4E57, 1_000_000, 10_000); + output.WriteLine($"IV-REPORT third: max |D3| sampled {sampled:R}, refined {refined:R}, x 1.10 = {(float)(refined * 1.10):R}, witness ({witness.x:R}, {witness.y:R}, {witness.z:R})"); + var (best, at) = AscendPoint(ThirdNorm, witness); + var tensor = ThirdTensor(at); + var sweep = 0.0; + const int directions = 20_000; + for (var k = 0; k < directions; k++) + { + var z = 1.0 - 2.0 * (k + 0.5) / directions; + var r = Math.Sqrt(1.0 - z * z); + var phi = k * Math.PI * (3.0 - Math.Sqrt(5.0)); + sweep = Math.Max(sweep, Math.Abs(Cubic(tensor, new[] { r * Math.Cos(phi), r * Math.Sin(phi), z }))); + } + + output.WriteLine($"IV-REPORT third witness ascent ends at ({at.x:R}, {at.y:R}, {at.z:R}): tensor norm {best:R}, dense sweep of {directions} directions {sweep:R} ({sweep / best:R} of it)"); + Assert.True(sweep <= best * (1.0 + 1.0e-6), $"a direction sweep finds {sweep:R} over the ascent's {best:R}: the inner maximisation misses a maximum"); + Assert.True(refined <= SNOISE_THIRD, $"measured {refined:R} exceeds SNOISE_THIRD {SNOISE_THIRD:R}"); + } + + // The start MeasureThird printed as its witness. + private static readonly float3 ThirdWitness = new(-184.81363f, -34.250977f, 68.26865f); + + /// + /// Pins SNOISE_THIRD: no third-derivative norm over 1e5 seeded points exceeds it, and the ascent from + /// MeasureThird's witness reaches a maximum that, times 1.10, equals the constant bit for bit + /// (the expression MeasureThird prints), so any moved constant fails here. + /// + [Fact] + public void ThirdConstantPinsSampled() + { + var (sampled, _, _) = MeasureMax(ThirdNorm, false, 0x4E58, 100_000, 0); + Assert.True(sampled <= SNOISE_THIRD, $"the third-derivative norm reaches {sampled:R}, above SNOISE_THIRD {SNOISE_THIRD:R}"); + var refined = Ascend(ThirdNorm, ThirdWitness); + Assert.True(refined <= SNOISE_THIRD, $"the third-derivative norm reaches {refined:R}, above SNOISE_THIRD {SNOISE_THIRD:R}"); + var measured = (float)(refined * 1.10); + Assert.True(SNOISE_THIRD == measured, $"SNOISE_THIRD is {SNOISE_THIRD:R}, the re-measured 1.10 x {refined:R} is {measured:R}; re-run MeasureThird and re-pin"); + } + + /// + /// SNOISE_HESSIAN where the curvature is realised. At the point the ascent from MeasureHessian's witness + /// reaches, the absolute second difference of snoise along 4,000 seeded directions u at step 0.05 has a + /// largest value within 10% of SNOISE_HESSIAN / 1.10 (the realised curvature is there, so the check + /// has teeth), and af_snoise(witness, r u, 0) encloses snoise(witness + eps r u) at eps in + /// {-1, -1/2, 0, 1/2, 1} for r in {0.1, 0.3} and every one of those directions, no tolerance: a constant + /// under the realised curvature (40 against about 50.6) misses on the directions near the top + /// eigenvector. The enclosure tests on random balls cannot see a constant 20% low; this and + /// HessianConstantPinsSampledCurvature are its defence. + /// + [Fact] + public void SnoiseFormEnclosesTheCurvatureWitness() + { + var (_, witness) = AscendPoint(HessianNorm, HessianWitness); + var random = new System.Random(0xCA7E); + var directions = Enumerable.Range(0, 4000).Select(_ => UnitVector(random)).ToArray(); + const float step = 0.05f; + var centreValue = snoise(witness); + var realised = directions.Max(u => Math.Abs(snoise(witness + u * step) + (double)snoise(witness - u * step) - 2.0 * centreValue) / ((double)step * step)); + output.WriteLine($"IV-REPORT curvature witness ({witness.x:R}, {witness.y:R}, {witness.z:R}): largest second difference {realised:R} against SNOISE_HESSIAN {SNOISE_HESSIAN:R}"); + Assert.True(realised >= 0.9 * SNOISE_HESSIAN / 1.10, $"the largest second difference at the witness is {realised:R}, under 0.9 SNOISE_HESSIAN / 1.10 = {0.9 * SNOISE_HESSIAN / 1.10:R}: the check has no teeth, or the constant moved"); + foreach (var u in directions) + foreach (var r in new[] { 0.1f, 0.3f }) + { + var form = af_snoise(witness, u * r, 0.0f); + foreach (var eps in new[] { -1.0f, -0.5f, 0.0f, 0.5f, 1.0f }) + { + var value = snoise(witness + u * (r * eps)); + Assert.True(Math.Abs(value - (form.x + (double)form.y * eps)) <= form.z, $"af_snoise(witness, {u * r}, 0) = {form} misses snoise = {value:R} at eps {eps:R}, direction {u}"); + } + } + } + + /// + /// The provenance of SNOISE2_LIPSCHITZ: the largest gradient length of snoise(float2) (Gradient2Norm) + /// over 1e6 seeded points of [-256, 256]^2, the 1e4 largest refined by ascent, times 1.10; and the + /// largest |snoise(float2)| reached by ascent from 1e4 starts, which is what lets iv_snoise_ball(float2) + /// intersect with [-1, 1]. Slow; run explicitly after any change to the 2D kernel and re-pin. + /// + [Fact(Explicit = true)] + [Trait("Category", "Slow")] + public void MeasureLipschitz2() + { + var (sampled, refined, witness) = MeasureMax(Gradient2At, true, 0x2D15, 1_000_000, 10_000); + var random = new System.Random(0x2D16); + var maxValue = Enumerable.Range(0, 10_000) + .Select(_ => new float2(Uniform(random, -256.0f, 256.0f), Uniform(random, -256.0f, 256.0f))) + .Max(p => Ascend2(q => Math.Abs(snoise(q)), p)); + output.WriteLine($"IV-REPORT lipschitz2: max |grad snoise2| sampled {sampled:R}, refined {refined:R}, x 1.10 = {(float)(refined * 1.10):R}, witness ({witness.x:R}, {witness.y:R}); max |snoise2| refined {maxValue:R}"); + Assert.True(refined <= SNOISE2_LIPSCHITZ, $"measured {refined:R} exceeds SNOISE2_LIPSCHITZ {SNOISE2_LIPSCHITZ:R}"); + Assert.True(maxValue < 1.0, $"|snoise2| reaches {maxValue:R}; iv_snoise_ball(float2) may not intersect with [-1, 1]"); + } + + // The start MeasureLipschitz2 printed as its witness. + private static readonly float2 Lipschitz2Witness = new(-67.12454f, -129.53296f); + + /// + /// Pins SNOISE2_LIPSCHITZ as LipschitzConstantPinsSampledGradients pins SNOISE_LIPSCHITZ: 1e5 seeded + /// points under it, and the ascent from MeasureLipschitz2's witness, times 1.10, equals it bit for bit (the expression MeasureLipschitz2 prints). + /// + [Fact] + public void Lipschitz2ConstantPins() + { + var (sampled, _, _) = MeasureMax(Gradient2At, true, 0x2D17, 100_000, 0); + Assert.True(sampled <= SNOISE2_LIPSCHITZ, $"|grad snoise2| reaches {sampled:R}, above SNOISE2_LIPSCHITZ {SNOISE2_LIPSCHITZ:R}"); + var refined = Ascend2(Gradient2Norm, Lipschitz2Witness); + Assert.True(refined <= SNOISE2_LIPSCHITZ, $"|grad snoise2| reaches {refined:R}, above SNOISE2_LIPSCHITZ {SNOISE2_LIPSCHITZ:R}"); + var measured = (float)(refined * 1.10); + Assert.True(SNOISE2_LIPSCHITZ == measured, $"SNOISE2_LIPSCHITZ is {SNOISE2_LIPSCHITZ:R}, the re-measured 1.10 x {refined:R} is {measured:R}; re-run MeasureLipschitz2 and re-pin"); + } + + /// + /// iv_snoise_ball(float2) encloses snoise(float2) over 2,000 seeded discs of radius log-uniform in + /// [1e-3, 1e3] x 64 points (the first eight on the rim), no tolerance. + /// + [Fact] + public void Snoise2BallEnclosesPoints() + { + var random = new System.Random(0xBA12); + for (var b = 0; b < 2000; b++) + { + var centre = new float2(Uniform(random, -20.0f, 20.0f), Uniform(random, -20.0f, 20.0f)); + var radius = LogUniform(random, 1.0e-3f, 1.0e3f); + var bound = iv_snoise_ball(centre, radius); + for (var i = 0; i < 64; i++) + { + var angle = Uniform(random, 0.0f, 2.0f * MathF.PI); + var x = centre + new float2(MathF.Cos(angle), MathF.Sin(angle)) * (i < 8 ? radius : radius * MathF.Sqrt(random.NextSingle())); + Assert.True(Inside(snoise(x), bound), $"iv_snoise_ball({centre}, {radius:R}) = {bound} misses snoise({x}) = {snoise(x):R}"); + } + } + } + + /// + /// The centred warp (design.md, "Affine forms"): over 2,000 seeded balls of the deep well's flow (warp + /// D = 60, period 8, flow frequency 1/512; centres in [-2000, 2000]^3, radius log-uniform in [1e-3, 500], + /// a time per ball) x 64 points, each phase's warped point p + flow(p) shift_k lies in the ball + /// (c + flow(c) shift_k, r + |shift_k| rho), r the radius widened by (|c|_1 + r) 2^-20 as iv_frustum_ball + /// widens its ball (the float32 point p is inside only up to that, which matters below a radius of 1), + /// geometry allowing one part in 1e5 for the rounding of the warped point, as WarpedPointsStayEnclosed does, and snoise of it, at the coverage frequency, lies + /// in iv_snoise_ball of that ball with no tolerance. Dropping rho fails: some warped points lie + /// farther than r from the moved centre. + /// + [Fact] + public void CentredWarpStaysEnclosed() + { + var noise = new WarpedNoise { F0 = 1.0f / FogField.NoiseScale, Warp = FogField.AetheriaWarp }; + var random = new System.Random(0xCE17); + var beyond = 0; + for (var b = 0; b < 2000; b++) + { + var centre = new float3(Uniform(random, -2000.0f, 2000.0f), Uniform(random, -2000.0f, 2000.0f), Uniform(random, -2000.0f, 2000.0f)); + var radius = LogUniform(random, 1.0e-3f, 500.0f); + var reach = radius + (abs(centre.x) + abs(centre.y) + abs(centre.z) + radius) * 9.5367431640625e-7f; + var time = Uniform(random, 0.0f, 100.0f); + var (_, shift0, shift1) = noise.Phases(time); + var (c0, g0, c1, g1) = noise.CentredWarp(centre, reach, time); + for (var i = 0; i < 64; i++) + { + var p = PointInBall(random, centre, radius, i); + var flow = noise.Flow(p); + foreach (var (shift, moved, grow) in new[] { (shift0, c0, g0), (shift1, c1, g1) }) + { + var warped = p + flow * shift; + var distance = length(warped - moved); + Assert.True(distance <= (reach + grow) * (1.0f + 1.0e-5f), $"warped point {warped} leaves the centred ball ({moved}, {reach + grow:R})"); + beyond += distance > radius ? 1 : 0; + var bound = iv_snoise_ball(moved * noise.F0, (reach + grow) * noise.F0); + var value = snoise(warped * noise.F0); + Assert.True(Inside(value, bound), $"iv_snoise_ball over the centred ball ({moved}, {reach + grow:R}) = {bound} misses snoise = {value:R} at {warped}"); + } + } + } + + output.WriteLine($"IV-REPORT centred warp: {beyond} of {2000 * 64 * 2} warped points lie beyond r from the moved centre"); + Assert.True(beyond > 0, "no warped point needs rho: the check cannot tell a centred warp without it"); + } + + /// + /// FlowVariation's width, pinned both ways: over 2,000 seeded balls (centres in [-2000, 2000]^3, radius + /// log-uniform in [1e-3, 500]) it equals min(sqrt(u^2 + v^2), 2) A, A = FlowAmplitude, with each of u and v + /// the reach of iv_snoise_ball(float2) at the flow plane's argument (plus its offset) plus the float32 + /// allowance 2^-14 + L2 2^-20 (|q|_1 + r FlowFrequency), to 0.3% (the float32 sum n + e rounds at 6e-8, against an allowance of 6e-5). The enclosure test sees the + /// allowance only where a float32 flow differs from the exact one by more than the bound's slack, which + /// on the CPU is rare (CentredWarpStaysEnclosed); this is the test that sees it. + /// + [Fact] + public void FlowVariationCarriesItsAllowance() + { + var noise = new WarpedNoise { F0 = 1.0f / FogField.NoiseScale, Warp = FogField.AetheriaWarp }; + var amplitude = noise.Warp * 2.0 / noise.Period; + var random = new System.Random(0xF10E); + double Reach(float2 q, double r) + { + var n = snoise(q); + var e = SNOISE2_LIPSCHITZ * r; + return Math.Max(Math.Min(e, 1.0 - n), Math.Min(e, n + 1.0)); + } + + for (var b = 0; b < 2000; b++) + { + var centre = new float3(Uniform(random, -2000.0f, 2000.0f), Uniform(random, -2000.0f, 2000.0f), Uniform(random, -2000.0f, 2000.0f)); + var radius = LogUniform(random, 1.0e-3f, 500.0f); + var rq = (double)radius * noise.FlowFrequency; + double Component(float2 offset) + { + var q = new float2(centre.x, centre.z) * noise.FlowFrequency + offset; + return Reach(q, rq) + Math.ScaleB(1.0, -14) + SNOISE2_LIPSCHITZ * Math.ScaleB(Math.Abs((double)q.x) + Math.Abs((double)q.y) + rq, -20); + } + + var (u, v) = (Component(new float2(17.0f, 3.0f)), Component(new float2(-5.0f, 41.0f))); + var expected = Math.Min(Math.Sqrt(u * u + v * v), 2.0) * amplitude; + var observed = noise.FlowVariation(centre, radius); + Assert.True(Math.Abs(observed - expected) <= 3.0e-3 * expected, $"FlowVariation({centre}, {radius:R}) = {observed:R}, the documented rule gives {expected:R}"); + } + } + + /// + /// The centred warp over an affine slice (FogField.Slice, the owner AffineBound reads): over 3,000 + /// seeded tile slices (the deep well, the shallow wells and inside the fog; N in {1, 4, 8, 16}; a + /// slice of length log-uniform in [0.5, 1500] from a drawn depth, so the axis is from far under to far + /// over the ball's radius) x 64 rays each (the first two at the slice's ends), each phase's warped ray + /// point p + flow(p) shift_k lies within radius + growth_k of moved_k + axis eps(z), eps(z) = + /// clamp((z - z_m) / h, -1, 1), no tolerance but one part in 1e5 for the rounding of the warped point. + /// The check sees each term of the slice: a reach of the ball's radius instead of |axis| + radius, a + /// phase's growth dropped, or rho halved leaves rays outside; the report counts the rays that need + /// each phase's growth, and the test asserts both phases have some. + /// + [Fact] + public void AffineWarpStaysEnclosed() + { + var random = new System.Random(0xAF77); + int[] sizes = { 1, 4, 8, 16 }; + var fields = new[] + { + FogField.DeepWell(FogField.AetheriaWarp, BoundMode.Affine), FogField.Wells(FogField.AetheriaWarp, BoundMode.Affine), FogField.InsideFog(FogField.AetheriaWarp, BoundMode.Affine), + }; + var needing = new[] { 0, 0 }; + for (var t = 0; t < 3000; t++) + { + var field = fields[t % fields.Length]; + var tile = field.DrawTile(random, sizes[random.Next(sizes.Length)]); + var z0 = Uniform(random, field.Grid[0], field.Grid[^1] * 0.9f); + var z1 = MathF.Min(z0 + LogUniform(random, 0.5f, 1500.0f), field.Grid[^1]); + var slice = field.Slice(tile, z0, z1); + var (_, shift0, shift1) = field.Noise.Phases(tile.Time); + var (zm, h) = (slice.Ball.z, slice.AxisCamera.z); + + // The arguments are built from the centred warp of the slice's own centre and reach, the detail + // from the unwarped set: no phase takes another's growth, nor the detail a warp. + var (moved0, grow0, moved1, grow1) = field.Noise.CentredWarp(slice.Centre, slice.Reach, tile.Time); + var (coverageFrequency, detailFrequency) = (field.Noise.F0, 4.0f * field.Noise.F0); + var expected = new[] + { + (slice.Coverage0, moved0 * coverageFrequency, (slice.Ball.w + grow0) * coverageFrequency), + (slice.Coverage1, moved1 * coverageFrequency, (slice.Ball.w + grow1) * coverageFrequency), + (slice.Detail, slice.Centre * detailFrequency + 17.0f, slice.Ball.w * detailFrequency), + }; + foreach (var (arg, centre, radius) in expected) + { + Assert.True(length(arg.Centre - centre) <= 1.0e-6f * (1.0f + length(centre)) && Math.Abs(arg.Radius - radius) <= 1.0e-6f * radius, $"{field.Name}: argument ({arg.Centre}, {arg.Radius:R}) is not the documented ({centre}, {radius:R})"); + } + + var reachRule = length(slice.Coverage0.Axis) / coverageFrequency + slice.Ball.w; + Assert.True(Math.Abs(slice.Reach - reachRule) <= 1.0e-5f * reachRule, $"{field.Name}: the reach {slice.Reach:R} is not |axis| + radius = {reachRule:R}"); + var axisTolerance = 1.0e-6f * length(slice.Coverage0.Axis); + Assert.True(length(slice.Coverage1.Axis - slice.Coverage0.Axis) <= axisTolerance && length(slice.Detail.Axis - slice.Coverage0.Axis * (detailFrequency / coverageFrequency)) <= 4.0f * axisTolerance, $"{field.Name}: the arguments do not share one axis"); + + for (var i = 0; i < 64; i++) + { + var m = tile.PixelSlope(random.Next(tile.N), random.Next(tile.N), random.NextSingle(), random.NextSingle()); + var z = i < 2 ? (i == 0 ? z0 : z1) : Uniform(random, z0, z1); + var p = tile.World(new float3(m.x * z, m.y * z, z)); + var flow = field.Noise.Flow(p); + var eps = h == 0.0f ? 0.0f : clamp((z - zm) / h, -1.0f, 1.0f); + var phases = new[] { (shift0, slice.Coverage0, coverageFrequency), (shift1, slice.Coverage1, coverageFrequency) }; + for (var k = 0; k < 2; k++) + { + var (shift, arg, frequency) = phases[k]; + var point = (p + flow * shift) * frequency; + var distance = length(point - (arg.Centre + arg.Axis * eps)); + Assert.True(distance <= arg.Radius * (1.0f + 1.0e-5f) + 1.0e-6f * length(point), $"{field.Name}: phase {k} warped ray point at depth {z:R} is {distance:R} from the argument's centre + axis eps, outside radius {arg.Radius:R} (reach {slice.Reach:R}, slice [{z0:R}, {z1:R}])"); + needing[k] += distance > slice.Ball.w * frequency ? 1 : 0; + } + + var detail = p * detailFrequency + 17.0f; + var detailDistance = length(detail - (slice.Detail.Centre + slice.Detail.Axis * eps)); + Assert.True(detailDistance <= slice.Detail.Radius * (1.0f + 1.0e-5f) + 1.0e-6f * length(detail), $"{field.Name}: the detail ray point at depth {z:R} is {detailDistance:R} from the argument's centre + axis eps, outside radius {slice.Detail.Radius:R} (slice [{z0:R}, {z1:R}])"); + } + } + + output.WriteLine($"IV-REPORT affine warp: rays beyond the unwarped radius, phase 0 {needing[0]}, phase 1 {needing[1]}"); + Assert.True(needing[0] > 0 && needing[1] > 0, $"no ray needs phase growth ({needing[0]}, {needing[1]}): the check cannot tell a slice without it"); + } + + /// + /// The affine composition earns its place: over seeded slices of the deep well and the shallow wells + /// (warp 0 and the Aetheria warp, N = 8, slices of length log-uniform in [0.5, 100] from a drawn + /// depth), AffineBound is exactly the intersection of its two sound pieces (the affine arithmetic's + /// own, and the interval composition over the forms' ranges), and where the interval piece does not + /// already prove the slice empty the affine piece is the narrower of the two in at least 35% of + /// them and the intersection is narrower than the interval piece in total width by at least 0.5% + /// (measured: 43% and 1.1%). The affine piece alone is wider in total (the shared symbol pays where the forms are + /// correlated and loses to the clipped ranges where they are not), so it is the intersection's gain + /// that measures it. The cost contract (IntervalSkipHalvesEvaluations) sees only the sum, in which + /// af_snoise's Hessian forms already beat iv_snoise_ball; this is the test that sees af_add, af_mul and + /// af_range, the shared symbol, break. + /// + [Fact] + public void AffineCompositionTightensItsRanges() + { + var random = new System.Random(0xAC0F); + var (open, wins, intersectionWidth, intervalWidth) = (0, 0, 0.0, 0.0); + foreach (var warp in new[] { 0.0f, FogField.AetheriaWarp }) + foreach (var field in new[] { FogField.DeepWell(warp, BoundMode.Affine), FogField.Wells(warp, BoundMode.Affine) }) + for (var t = 0; t < 1500; t++) + { + var tile = field.DrawTile(random, 8); + var z0 = Uniform(random, field.Grid[0], field.Grid[^1] * 0.9f); + var z1 = MathF.Min(z0 + LogUniform(random, 0.5f, 100.0f), field.Grid[^1]); + var (affine, interval) = field.AffinePieces(tile, z0, z1, new Counts()); + var bound = field.Bound(tile, z0, z1, false, new Counts()); + Assert.True(bound.x == max(affine.x, interval.x) && bound.y == min(affine.y, interval.y), $"{field.Name}: Bound {bound} is not the intersection of the affine piece {affine} and the interval piece {interval}"); + if (!(interval.y > 0.0f)) + continue; + open++; + wins += affine.y - affine.x < interval.y - interval.x ? 1 : 0; + intersectionWidth += bound.y - bound.x; + intervalWidth += interval.y - interval.x; + } + + output.WriteLine($"IV-REPORT affine composition: {open} open slices, affine narrower in {wins} ({(double)wins / open:F3}), intersection width {intersectionWidth:F1} against the interval piece's {intervalWidth:F1} ({intersectionWidth / intervalWidth:F3})"); + Assert.True(open > 0, "no slice is open"); + Assert.True(wins >= 0.35 * open, $"the affine piece is narrower than the interval piece in {wins} of {open} open slices, under 35%"); + Assert.True(intersectionWidth <= 0.995 * intervalWidth, $"the intersection's width {intersectionWidth:F1} is not under 0.995 of the interval piece's {intervalWidth:F1}"); + } + + /// + /// The gate only ever gives up what the probes could not have delivered. Gated, a slice the best + /// conceivable probe cannot prove empty returns the envelope; so a slice the ungated bound proves + /// empty (its upper density 0) must be proved empty gated too. A gate that errs toward giving up + /// (the reach inflated, a gradient or Hessian term overstated) loosens the bound exactly there and + /// costs only culling, which no enclosure test sees; a gate that errs the other way only costs probes, + /// which the cost contract (IntervalSkipHalvesEvaluations) sees. Over seeded slices of both wells and the fog interior at + /// warp 0 and the Aetheria warp, N = 8, in both modes, no slice the ungated bound proves empty is + /// left open by the gated one, and at least 200 are proved empty. + /// + [Fact] + public void GateNeverGivesUpAProvableCull() + { + var random = new System.Random(0x6A7E); + var (proved, lost) = (0, new List()); + foreach (var mode in new[] { BoundMode.Interval, BoundMode.Affine }) + foreach (var warp in new[] { 0.0f, FogField.AetheriaWarp }) + foreach (var field in new[] { FogField.DeepWell(warp, mode), FogField.Wells(warp, mode), FogField.InsideFog(warp, mode) }) + for (var t = 0; t < 1500; t++) + { + var tile = field.DrawTile(random, 8); + var z0 = Uniform(random, field.Grid[0], field.Grid[^1] * 0.9f); + var z1 = MathF.Min(z0 + LogUniform(random, 0.5f, 100.0f), field.Grid[^1]); + if (field.Bound(tile, z0, z1, false, new Counts()).y > 0.0f) + continue; + proved++; + var gated = field.Bound(tile, z0, z1, true, new Counts()); + if (gated.y > 0.0f) + lost.Add($"{field.Name} {mode} warp {warp}: slice [{z0:R}, {z1:R}] is proved empty ungated but the gate leaves it at {gated}"); + } + + output.WriteLine($"IV-REPORT gate: {proved} slices proved empty ungated, {lost.Count} left open by the gate"); + Assert.True(proved >= 200, $"only {proved} slices are proved empty ungated: the check cannot tell a gate that loses them"); + Assert.True(lost.Count == 0, $"{lost.Count} provable culls given up by the gate, first: {lost.FirstOrDefault()}"); + } + + // Why a field is not ten bands deep and wide, or null. The band G is the span of s where only the + // noise decides density: s in [F + A lo, F + A hi] for the free noise range [lo, hi], with the fade at 1. + private static string? TenBandsShortfall(FogField field, int cameras) + { + var band = FogField.Amplitude * (FogField.FreeNoise.y - FogField.FreeNoise.x); + var well = field.Bowls[^1]; + var rim = well.Scale / 2.0f; + float At(float r) => field.HeightAt(well.Centre + new float2(r, 0.0f)); + var depth = At(0.0f) - At(rim); + var half = (At(0.0f) + At(rim)) / 2.0f; + float lo = 0.0f, hi = rim; + for (var k = 0; k < 60; k++) + { + var mid = (lo + hi) / 2.0f; + if (At(mid) > half) + lo = mid; + else + hi = mid; + } + + var problems = new List(); + if (depth < 10.0f * band) + problems.Add($"depth {depth:R} is under 10 G = {10.0f * band:R}"); + if (lo < 10.0f * band) + problems.Add($"half-depth radius {lo:R} is under 10 G = {10.0f * band:R}"); + var random = new System.Random(0xD33B); + for (var c = 0; c < cameras; c++) + { + var origin = field.DrawTile(random, 8).Origin; + var xz = new float2(origin.x, origin.z); + var s = origin.y + field.HeightAt(xz); + if (!(length(xz - well.Centre) < lo && origin.y < FogField.FloorOffset - At(rim) && s >= FogField.FloorOffset + FogField.Amplitude * FogField.FreeNoise.y)) + { + problems.Add($"camera {origin} is not inside the well, below the rim's fog surface, in empty air"); + break; + } + } + + return problems.Count == 0 ? null : $"{field.Name}: G = {band:R}; " + string.Join("; ", problems); + } + + /// + /// Ruling wells-scale-order-of-magnitude: the band G is computed from FogField's FloorOffset, Amplitude + /// and free noise range (60). The deep well's depth, h(centre) - h(rim), and its half-depth radius, + /// found by bisection on the well map, are each at least 10 G, and each of 1,000 drawn cameras sits + /// inside that radius, below the rim's fog surface and in empty air (s above the band). A well of depth + /// 150 fails the same check. + /// + [Fact] + public void DeepWellIsTenBandsDeepAndWide() + { + var deep = FogField.DeepWell(FogField.AetheriaWarp, BoundMode.Interval); + Assert.Null(TenBandsShortfall(deep, 1000)); + Assert.NotNull(TenBandsShortfall(FogField.DeepWell(FogField.AetheriaWarp, BoundMode.Interval, depth: 150.0f), 1000)); + var band = FogField.Amplitude * (FogField.FreeNoise.y - FogField.FreeNoise.x); + output.WriteLine($"IV-REPORT deep well: G = {band:R}, depth {deep.HeightAt(new float2(0.0f, 0.0f)) - deep.HeightAt(new float2(FogField.DeepWellScale / 2.0f, 0.0f)):R}"); + } + + // ---- The cull map ---- + + // An approximation of viridis at nine anchors, interpolated linearly, for t in [0, 1]. + private static readonly (byte R, byte G, byte B)[] Viridis = + { + (68, 1, 84), (72, 40, 120), (62, 74, 137), (49, 104, 142), (38, 130, 142), (31, 158, 137), (53, 183, 121), (110, 206, 88), (253, 231, 37), + }; + + private static (byte, byte, byte) Colour(double t) + { + t = Math.Clamp(t, 0.0, 1.0) * (Viridis.Length - 1); + var i = Math.Min((int)t, Viridis.Length - 2); + var f = t - i; + byte Mix(byte a, byte b) => (byte)Math.Round(a + (b - a) * f); + return (Mix(Viridis[i].R, Viridis[i + 1].R), Mix(Viridis[i].G, Viridis[i + 1].G), Mix(Viridis[i].B, Viridis[i + 1].B)); + } + + private static uint[] CrcTable() => Enumerable.Range(0, 256).Select(n => + { + var c = (uint)n; + for (var k = 0; k < 8; k++) + c = (c & 1) != 0 ? 0xEDB88320u ^ (c >> 1) : c >> 1; + return c; + }).ToArray(); + + // A minimal 8-bit RGB PNG: one IDAT of zlib-compressed rows, filter 0. + private static void WritePng(string path, int width, int height, byte[] rgb) + { + var table = CrcTable(); + using var file = File.Create(path); + void Chunk(string type, byte[] data) + { + var name = System.Text.Encoding.ASCII.GetBytes(type); + var length = new[] { (byte)(data.Length >> 24), (byte)(data.Length >> 16), (byte)(data.Length >> 8), (byte)data.Length }; + file.Write(length); + file.Write(name); + file.Write(data); + var crc = 0xFFFFFFFFu; + foreach (var b in name.Concat(data)) + crc = table[(crc ^ b) & 0xFF] ^ (crc >> 8); + crc ^= 0xFFFFFFFFu; + file.Write(new[] { (byte)(crc >> 24), (byte)(crc >> 16), (byte)(crc >> 8), (byte)crc }); + } + + file.Write(new byte[] { 137, 80, 78, 71, 13, 10, 26, 10 }); + Chunk("IHDR", new byte[] { (byte)(width >> 24), (byte)(width >> 16), (byte)(width >> 8), (byte)width, (byte)(height >> 24), (byte)(height >> 16), (byte)(height >> 8), (byte)height, 8, 2, 0, 0, 0 }); + using var packed = new MemoryStream(); + using (var z = new System.IO.Compression.ZLibStream(packed, System.IO.Compression.CompressionLevel.Optimal, leaveOpen: true)) + { + for (var y = 0; y < height; y++) + { + z.WriteByte(0); + z.Write(rgb, y * width * 3, width * 3); + } + } + + Chunk("IDAT", packed.ToArray()); + Chunk("IEND", Array.Empty()); + } + + /// + /// The cull map of one deep-well frame at warp D, for the operator: a camera inside the well at xz + /// (0, -200), y = F - h / 2, looking along +z across the well, 960 x 540 pixels at a 60 degree vertical + /// field of view, in 8 x 8 tiles (the last row of tiles half off the frame). Each tile runs the + /// pre-pass under the centred-warp interval bound and under the affine bound; each pixel's ray (through + /// the pixel's centre) is marched densely for its transmittance and over each tile mask and the oracle + /// mask (the cells some ray of the tile samples nonzero), with the early-out at 0.02. The PNG is + /// 1920 x 1080 in four panels: top left the cells per ray the interval march integrates, top right the + /// affine march's, bottom left the oracle march's (all three on one viridis scale, logarithmic, + /// log(1 + n) / log(1 + the largest count)), bottom right the transmittance (black opaque, white clear). It is written only when + /// CULTMATH_WRITE_CULLMAP names a directory; the mean cells per ray are printed either way. + /// + [Fact(Explicit = true)] + [Trait("Category", "Slow")] + public void DeepWellCullMap() + { + const int width = 960, height = 540, size = 8; + var interval = FogField.DeepWell(FogField.AetheriaWarp, BoundMode.Interval); + var affine = FogField.DeepWell(FogField.AetheriaWarp, BoundMode.Affine); + var focal = height / 2.0f / MathF.Tan(MathF.PI / 6.0f); + var xz = new float2(0.0f, -200.0f); + var origin = new float3(xz.x, FogField.FloorOffset - 0.5f * interval.HeightAt(xz), xz.y); + var grid = interval.Grid; + var (cellsInterval, cellsAffine, cellsOracle) = (new int[width * height], new int[width * height], new int[width * height]); + var transmittance = new float[width * height]; + var (tilesX, tilesY) = (width / size, (height + size - 1) / size); + var probes = new Counts[tilesX * tilesY]; + var clock = System.Diagnostics.Stopwatch.StartNew(); + Parallel.For(0, tilesX * tilesY, index => + { + var (tx, ty) = (index % tilesX, index / tilesX); + var slope = new float2((tx * size + size / 2.0f - width / 2.0f) / focal, (height / 2.0f - (ty * size + size / 2.0f)) / focal); + var tile = interval.TileAt(origin, 0.0f, slope, size, focal, 3.0f); + probes[index] = new Counts(); + var (maskInterval, _, _) = MarchTile(interval, tile, probes[index]); + var (maskAffine, _, _) = MarchTile(affine, tile, new Counts()); + var scratch = new Counts(); + var rays = new List<(int Pixel, float2 Slope)>(); + for (var j = 0; j < size; j++) + for (var i = 0; i < size; i++) + { + var (px, py) = (tx * size + i, ty * size + (size - 1 - j)); + rays.Add((py < height ? py * width + px : -1, tile.PixelSlope(i, j, 0.5f, 0.5f))); + } + + var oracle = Enumerable.Range(0, grid.Length - 1).Where(c => rays.Any(r => interval.Density(tile, r.Slope, (grid[c] + grid[c + 1]) * 0.5f, false, scratch) > 0.0f)).ToList(); + foreach (var (pixel, ray) in rays) + { + if (pixel < 0) + continue; + int Steps(List mask) + { + var t = 1.0f; + var k = 0; + for (; k < mask.Count && t >= 0.02f; k++) + t *= Integrate(interval, tile, ray, grid[mask[k]], grid[mask[k] + 1], lod: false, scratch); + return k; + } + + var dense = 1.0f; + for (var c = 0; c < grid.Length - 1 && dense >= 0.02f; c++) + dense *= Integrate(interval, tile, ray, grid[c], grid[c + 1], lod: false, scratch); + transmittance[pixel] = dense; + cellsInterval[pixel] = Steps(maskInterval); + cellsAffine[pixel] = Steps(maskAffine); + cellsOracle[pixel] = Steps(oracle); + } + }); + + var most = Math.Max(cellsInterval.Max(), Math.Max(cellsAffine.Max(), cellsOracle.Max())); + output.WriteLine($"IV-REPORT cull map (deep well, warp {FogField.AetheriaWarp:R}, {width}x{height}, {size}x{size} tiles, {clock.Elapsed.TotalSeconds:F0} s): cells per ray interval {cellsInterval.Average():F2}, affine {cellsAffine.Average():F2}, oracle {cellsOracle.Average():F2}; " + + $"largest {most}; interval probes per tile env {probes.Average(p => p.Envelope):F1} snoise {probes.Average(p => p.Snoise):F2}; mean transmittance {transmittance.Average():F3}"); + var directory = Environment.GetEnvironmentVariable("CULTMATH_WRITE_CULLMAP"); + if (string.IsNullOrEmpty(directory)) + return; + var rgb = new byte[2 * width * 2 * height * 3]; + void Put(int x, int y, (byte R, byte G, byte B) c) + { + var o = (y * 2 * width + x) * 3; + (rgb[o], rgb[o + 1], rgb[o + 2]) = c; + } + + for (var y = 0; y < height; y++) + for (var x = 0; x < width; x++) + { + var p = y * width + x; + Put(x, y, Colour(Math.Log(1.0 + cellsInterval[p]) / Math.Log(1.0 + most))); + Put(width + x, y, Colour(Math.Log(1.0 + cellsAffine[p]) / Math.Log(1.0 + most))); + Put(x, height + y, Colour(Math.Log(1.0 + cellsOracle[p]) / Math.Log(1.0 + most))); + var grey = (byte)Math.Round(255.0 * transmittance[p]); + Put(width + x, height + y, (grey, grey, grey)); + } + + for (var k = 0; k < 2 * width; k++) + for (var d = -1; d <= 0; d++) + Put(k, height + d, (255, 255, 255)); + for (var k = 0; k < 2 * height; k++) + for (var d = -1; d <= 0; d++) + Put(width + d, k, (255, 255, 255)); + Directory.CreateDirectory(directory); + var path = Path.Combine(directory, "deep-well-cull-map.png"); + WritePng(path, 2 * width, 2 * height, rgb); + output.WriteLine($"IV-REPORT cull map written to {path}"); + } + + /// + /// Mean of interval width over the true range (max - min of the 64 sampled values) per ball: how + /// loose the Lipschitz bound is, for a later affine cut to beat. Asserts only finiteness. + /// + [Fact] + public void TightnessReport() + { + double Ratio(Func bound, Func f, float radius, int seed) + { + var random = new System.Random(seed); + var sum = 0.0; + for (var b = 0; b < 2000; b++) + { + var centre = RandomCentre(random); + var interval = bound(centre, radius); + float lo = float.MaxValue, hi = float.MinValue; + for (var i = 0; i < 64; i++) + { + var v = f(PointInBall(random, centre, radius, i)); + lo = MathF.Min(lo, v); + hi = MathF.Max(hi, v); + } + + sum += (interval.y - interval.x) / (double)(hi - lo); + } + + return sum / 2000; + } + + var snoiseRatios = new[] { 0.05f, 0.25f, 1.0f }.Select(r => (r, Ratio(iv_snoise_ball, snoise, r, 0x7167))).ToArray(); + var fbmRatios = new[] { 0.05f, 0.25f }.Select(r => (r, Ratio((c, rr) => iv_fbm_ball(c, rr, 4, 2.0f, 0.5f), x => fbm_grad(x, 4, 2.0f, 0.5f).w, r, 0x7168))).ToArray(); + output.WriteLine("IV-REPORT tightness (mean width / sampled range): " + + string.Join(", ", snoiseRatios.Select(t => $"snoise r={t.r:R} {t.Item2:F2}")) + "; " + + string.Join(", ", fbmRatios.Select(t => $"fbm4 r={t.r:R} {t.Item2:F2}"))); + Assert.All(snoiseRatios.Concat(fbmRatios), t => Assert.True(double.IsFinite(t.Item2))); + } + + + // ---- The saving: envelope-then-noise fields, marched over screen tiles ---- + + // Combined cost in snoise units: one envelope evaluation, pointwise or as an interval probe, costs this + // much. An estimate (a handful of pulses or one height-map fetch against ~150 flops of snoise); both + // counts are printed, so any other weight can be applied to them. + internal const double EnvelopeCost = 0.2; + + // One snoise_grad evaluation (af_snoise's one call) costs this much in snoise units: the value and + // three gradient components over the same corners. An estimate, printed beside the count as the + // envelope weight is, and not tuned toward any contract. + internal const double GradCost = 2.0; + + internal sealed class Counts + { + public long Snoise; + public long Envelope; + public long Grad; + + public double Cost => Snoise + EnvelopeCost * Envelope + GradCost * Grad; + } + + /// + /// One screen tile of one frame: a pinhole camera (origin and orthonormal basis; camera space looks + /// down +z and the ray of slope m is the points (m z, z)), the tile's central slope, its size N, the + /// focal length in pixels and the frame time. Every tile draws its own camera, so a probe result is + /// never carried to another frame. + /// + internal class Tile + { + public float3 Origin; + public float3 Right = new(1.0f, 0.0f, 0.0f); + public float3 Up = new(0.0f, 1.0f, 0.0f); + public float3 Forward = new(0.0f, 0.0f, 1.0f); + public float2 Slope; + public int N; + public float Focal; + public float Time; + + public float Half => N / (2.0f * Focal); + public float Footprint => N / (MathF.Sqrt(2.0f) * Focal); + public float2 SlopesX => new(Slope.x - Half, Slope.x + Half); + public float2 SlopesY => new(Slope.y - Half, Slope.y + Half); + + // Pixel (i, j) of the tile at sub-pixel offset (u, v) in [0, 1): its slope lies in SlopesX x SlopesY + // in float32, because (i + u) / f - N / (2f) is at most N / f - N / (2f) = N / (2f) exactly. + public float2 PixelSlope(int i, int j, float u, float v) => + Slope + new float2((i + u) / Focal - Half, (j + v) / Focal - Half); + + public float3 World(float3 c) => Origin + Right * c.x + Up * c.y + Forward * c.z; + + public float3 Camera(float3 w) + { + var d = w - Origin; + return new float3(dot(d, Right), dot(d, Up), dot(d, Forward)); + } + + public void Look(float3 forward) + { + Forward = normalize(forward); + Right = normalize(cross(new float3(0.0f, 1.0f, 0.0f), Forward)); + Up = cross(Forward, Right); + } + } + + /// + /// A field with an analytic envelope and the dense grid it is marched on. Density is the pointwise + /// field, envelope-gated (noise only where the envelope leaves the density undecided), counted. Bound + /// is the one composition of the envelope's interval over a tile slice's box and the noise ball over the + /// slice's iv_frustum_ball: an interval enclosing Density at every point of every ray of the tile in the + /// slice. A slice is provably empty iff Bound(...).y <= 0. gated is the march's form: it returns the + /// envelope's verdict without snoise when the envelope alone proves the slice empty, and attempts the + /// noise ball only when the best outcome any centre value could give would prove it; ungated, the ball + /// is always evaluated. + /// + /// FogField's bound: the centred-warp interval composition, or the affine one (design.md, "Affine forms"). + internal enum BoundMode + { + Interval, + Affine, + } + + internal abstract class Scenario + { + public required string Name { get; init; } + public float[] Grid { get; protected init; } = Array.Empty(); + public float Focal { get; init; } = 935.0f; // 1080 rows at a 60 degree vertical field of view + public float Extinction { get; init; } = 1.0f; + + public abstract Tile DrawTile(System.Random random, int n); + + public abstract float Density(Tile tile, float2 slope, float z, bool lod, Counts counts); + + public abstract float2 Bound(Tile tile, float z0, float z1, bool gated, Counts counts); + + // Cell boundaries near + (j / J)^2 (far - near): Aetheria's quadratic sample spacing + // (Assets/Shaders/Raymarching/CloudShader.shader:116). + protected static float[] Quadratic(float near, float far, int cells) => + Enumerable.Range(0, cells + 1).Select(j => near + (float)j / cells * ((float)j / cells) * (far - near)).ToArray(); + + protected static float[] Cells(float step, float end) => + Enumerable.Range(0, (int)MathF.Ceiling(end / step) + 1).Select(j => j * step).ToArray(); + } + + // iv_snoise_ball, with the snoise skipped where L r >= 2: there the bound is [-1, 1] whatever snoise(c) + // is (|snoise| < 1), so the result is the same and costs nothing. + private static float2 NoiseBall(float3 centre, float radius, Counts counts) + { + if (SNOISE_LIPSCHITZ * radius >= 2.0f) + return new float2(-1.0f, 1.0f); + counts.Snoise++; + return iv_snoise_ball(centre, radius); + } + + // The best interval any centre value could give a ball of this radius, toward low or high values; the + // gate on whether a probe can prove anything. snoise(c) > -1, so a real ball's hi is at least -1 + L r, + // and likewise its lo is at most 1 - L r. + private static float2 BestBall(float radius, bool low) + { + var e = SNOISE_LIPSCHITZ * radius; + if (e >= 2.0f) + return new float2(-1.0f, 1.0f); + return low ? new float2(-1.0f, min(-1.0f + e, 1.0f)) : new float2(max(1.0f - e, -1.0f), 1.0f); + } + + // Least and greatest distance along one axis from a box to a point, exact in float32: a coordinate in + // [lo, hi] is at least `near` and at most `far` from c, and squares, sums and sqrt are monotone. + private static (float Near, float Far) AxisDistance(float2 range, float c) => + (c < range.x ? range.x - c : c > range.y ? c - range.y : 0.0f, max(abs(range.x - c), abs(range.y - c))); + + /// + /// The noise of the fog and the void (r1's field shape): coverage is two snoise of the warped point, + /// cross-faded over two half-period phases; n = coverage + detail / 2, the detail one snoise at four + /// times the frequency. The flow is a unit-bounded 2D field times FlowAmplitude, so a phase moves a point + /// by at most Warp = FlowAmplitude * Period / 2. The flow is not counted: the site reads it from a + /// texture and Aetheria from its flow map. + /// + internal sealed class WarpedNoise + { + public required float F0 { get; init; } + public required float Warp { get; init; } + public float Period { get; init; } = 8.0f; + public float FlowFrequency { get; init; } = 1.0f / 512.0f; + public bool FlowInXY { get; init; } + + private float FlowAmplitude => Warp * 2.0f / Period; + + public float3 Flow(float3 p) + { + var q = (FlowInXY ? new float2(p.x, p.y) : new float2(p.x, p.z)) * FlowFrequency; + var v = new float2(snoise(q + new float2(17.0f, 3.0f)), snoise(q + new float2(-5.0f, 41.0f))); + v = v / max(1.0f, length(v)) * FlowAmplitude; + return FlowInXY ? new float3(v.x, v.y, 0.0f) : new float3(v.x, 0.0f, v.y); + } + + public (float W0, float Shift0, float Shift1) Phases(float time) + { + var phase0 = frac(time / Period); + var phase1 = frac(time / Period + 0.5f); + return (1.0f - abs(2.0f * phase0 - 1.0f), (phase0 - 0.5f) * Period, (phase1 - 0.5f) * Period); + } + + public float Coverage(float3 p, float time, Counts counts) + { + var (w0, shift0, shift1) = Phases(time); + var flow = Flow(p); + counts.Snoise += 2; + return w0 * snoise((p + flow * shift0) * F0) + (1.0f - w0) * snoise((p + flow * shift1) * F0); + } + + public float Detail(float3 p, Counts counts) + { + counts.Snoise++; + return snoise(p * (4.0f * F0) + 17.0f); + } + + // The cross-fade of the two phases' noise enclosures, term by term with the frame's own weights. + // A field whose ball carries the whole warp passes the same enclosure for both phases. + public float2 CoverageBound(float2 phase0, float2 phase1, float time) + { + var w0 = Phases(time).W0; + return iv_add(iv_scale(phase0, w0), iv_scale(phase1, 1.0f - w0)); + } + + /// + /// How far the flow can move across a ball of radius r about c: each flow component is snoise(float2) + /// of the point projected to the flow plane and scaled by FlowFrequency, which varies over the ball by + /// at most iv_snoise_ball(float2)'s reach from its centre value, plus Deviation's float32 allowance; the + /// projection and the clamp to the unit disc are nonexpansive, and two unit-disc vectors differ by at + /// most 2. + /// + public float FlowVariation(float3 centre, float radius) + { + var q = (FlowInXY ? new float2(centre.x, centre.y) : new float2(centre.x, centre.z)) * FlowFrequency; + var u = Deviation(q + new float2(17.0f, 3.0f), radius * FlowFrequency); + var v = Deviation(q + new float2(-5.0f, 41.0f), radius * FlowFrequency); + return min(sqrt(u * u + v * v), 2.0f) * FlowAmplitude; + } + + // How far snoise(float2) can differ from its value at q over radius, in float32: the ball's reach plus + // the allowance of af_snoise's convention for the 2D value, 2^-14 + L2 2^-20 (|q|_1 + r). The point + // q + offset rounds at the magnitude of q + offset (a unit in the last place of 20 is 2^-19), so the + // flow at two points of a ball differs by more than the exact function can, and the iv_snoise_ball + // bound, which is exact for the point it is given, does not carry that. + private static float Deviation(float2 q, float radius) + { + var n = snoise(q); + var ball = iv_snoise_ball(q, radius); + var allowance = 6.103515625e-5f + SNOISE2_LIPSCHITZ * 9.5367431640625e-7f * (abs(q.x) + abs(q.y) + radius); + return max(ball.y - n, n - ball.x) + allowance; + } + + /// + /// The centred warp (design.md, "Affine forms"): phase k moves a point p of a set within reach of c + /// to p + flow(p) shift_k, which lies within |shift_k| rho of (p - c) + c + flow(c) shift_k, rho = + /// FlowVariation(c, reach). So phase k's noise argument is the set moved by flow(c) shift_k and + /// grown by |shift_k| rho, instead of grown by the whole warp. At warp 0 both phases are the set. + /// + public (float3 Centre0, float Grow0, float3 Centre1, float Grow1) CentredWarp(float3 centre, float reach, float time) + { + var (_, shift0, shift1) = Phases(time); + var flow = Flow(centre); + var rho = FlowVariation(centre, reach); + return (centre + flow * shift0, abs(shift0) * rho, centre + flow * shift1, abs(shift1) * rho); + } + + public float2 CoverageBall(float3 centre, float radius, Counts counts) => NoiseBall(centre * F0, radius * F0, counts); + + public float2 DetailBall(float3 centre, float radius, Counts counts) => NoiseBall(centre * (4.0f * F0) + 17.0f, radius * (4.0f * F0), counts); + + public float CoverageRadius(float radius) => radius * F0; + + public float DetailRadius(float radius) => radius * (4.0f * F0); + } + + /// + /// Aetheria's nebula (Assets/Shaders/Volumetric.cginc:165-221, cloudDensity :91-102) over its zone + /// height map (Assets/Scripts/ServerShared/Zone.cs:369-397 GetHeight, :426 PowerPulse), in its units + /// (Assets/Resources/Settings.asset: ZoneDepth :97-98, DefaultEnvironment :386-411). The pre-distortion + /// SDF is s(p) = p.y + h(p.xz), h >= 0 the well map: the zone bowl PowerPulse(|xz| / 2R, 2) * 64 plus, + /// per well, PowerPulse(|xz - c_b| / r_b, 16) * d_b, with r_b = 500 M^0.25, d_b = 30 M^0.175 and + /// PowerPulse(x, e) = (1 - 4x^2)^e on [0, 1/2], 0 beyond. Noise displaces only below the safety distance: + /// fade = 1 - smoothstep(0.75 S, S, s), s' = s + A fade n(warp(p)), density = max(0, (F - s') / B); the + /// patch band and the 1e-9 fill are left out. The warp moves only the noise argument; the height is read + /// at the unwarped xz, as Aetheria reads _NebulaSurfaceHeight at pos.xz. Envelope coordinates are the + /// tile's camera frame (the camera yaws about y, so horizontal distances are the world's). Extinction + /// 0.5 is the environment's (Settings.asset:397, applied at CloudShader.shader:91). + /// + internal sealed class FogField : Scenario + { + public const float Safety = 30.0f; // SafetyDistance, Settings.asset:399 + public const float FloorOffset = -20.0f; // :393 + public const float FloorBlend = 10.0f; // :394 + public const float Amplitude = 20.0f; + public const float NoiseScale = 414.2167f; // :409 + public const float AetheriaWarp = 60.0f; // Flow GlobalAmplitude 15 x Period 8 / 2, :402-405 + public const float ZoneRadius = 2000.0f; + internal static readonly float2 FreeNoise = new(-1.5f, 1.5f); + + public required WarpedNoise Noise { get; init; } + public required BoundMode Mode { get; init; } + public (float2 Centre, float Scale, float Exponent, float Depth)[] Bowls { get; init; } = Array.Empty<(float2, float, float, float)>(); + public required Func CameraAt { get; init; } + public required float2 SlopesY { get; init; } + + public FogField() + { + // Near 0.3 and far 2048: the ARPG scene's Main Camera, which carries the cloud march + // (Aetheria d3075eb0 Assets/Scenes/ARPG.unity:31777 m_Name, :31830 far clip plane; + // Assets/Scripts/Zone Display/VolumeCloudRenderer.cs:36 RequireComponent(Camera)). + Grid = Quadratic(0.3f, 2048.0f, 256); + Extinction = 0.5f; + } + + private static WarpedNoise AetheriaNoise(float warp) => new() { F0 = 1.0f / NoiseScale, Warp = warp }; + + private static string Named(string name, BoundMode mode) => $"{name} [{(mode == BoundMode.Affine ? "affine" : "interval")}]"; + + /// (a) Height fog: no wells, the camera above the safety band at y = S + 30, rays level and up. + public static FogField HeightFog(float warp, BoundMode mode) => new() + { + Name = Named("(a) height fog", mode), Mode = mode, Noise = AetheriaNoise(warp), SlopesY = new float2(0.0f, 0.5f), + CameraAt = (random, _) => new float3(Uniform(random, -1000.0f, 1000.0f), Safety + 30.0f, Uniform(random, -1000.0f, 1000.0f)), + }; + + /// (b) Inside the fog: no wells, the camera at y = F - 10, rays level. + public static FogField InsideFog(float warp, BoundMode mode) => new() + { + Name = Named("(b) inside the fog", mode), Mode = mode, Noise = AetheriaNoise(warp), SlopesY = new float2(-0.05f, 0.05f), + CameraAt = (random, _) => new float3(Uniform(random, -1000.0f, 1000.0f), FloorOffset - 10.0f, Uniform(random, -1000.0f, 1000.0f)), + }; + + // The deep well's geometry (ruling wells-scale-order-of-magnitude): one PowerPulse well of exponent + // 2, scale 2220 and depth 600 at the zone's centre, so its depth and half-depth radius are each + // about 600, ten times the band (DeepWellIsTenBandsDeepAndWide measures both). + public const float DeepWellScale = 2220.0f; + public const float DeepWellDepth = 600.0f; + public const float DeepWellCameraRadius = 300.0f; + + /// + /// (c) The deep well, the case Aetheria plays in: there the camera is always in some gravity well, + /// gazing across a bowl a sun's gravity carves (ruling wells-scale-order-of-magnitude). The zone bowl + /// R = 2000 plus one well at its centre, PowerPulse exponent 2, scale 2220, depth 600, so the well's + /// depth and half-depth radius are each about ten times G = 3 A = 60, the band of s where only the + /// noise decides density (s in [F - 1.5 A, F + 1.5 A] with the fade at 1). The camera's xz is uniform + /// within 300 of the centre, at y = F - h(xz) / 2, halfway between the sunken fog surface and the + /// rim's, in empty air; slopes and yaw as the shallow wells, m_y in [-0.25, 0.1]. A level ray crosses + /// hundreds of units of empty well before the far wall's band. + /// + public static FogField DeepWell(float warp, BoundMode mode, float depth = DeepWellDepth) => new() + { + Name = Named("(c) deep well", mode), Mode = mode, Noise = AetheriaNoise(warp), SlopesY = new float2(-0.25f, 0.1f), + Bowls = new (float2, float, float, float)[] { (new float2(0.0f, 0.0f), 2.0f * ZoneRadius, 2.0f, 64.0f), (new float2(0.0f, 0.0f), DeepWellScale, 2.0f, depth) }, + CameraAt = (r, field) => + { + var angle = Uniform(r, 0.0f, 2.0f * MathF.PI); + var radius = DeepWellCameraRadius * MathF.Sqrt(r.NextSingle()); + var xz = new float2(radius * MathF.Cos(angle), radius * MathF.Sin(angle)); + return new float3(xz.x, FloorOffset - 0.5f * field.HeightAt(xz), xz.y); + }, + }; + + /// + /// (c-band) Shallow wells, the band-dominated row, printed only: the zone bowl R = 2000 (64 deep) and + /// four wells of mass 100, 1000, 10000 and 1000 at seeded positions inside it, 30 M^0.175 deep (67 to + /// 150, 1.1 to 2.5 times G) and 500 M^0.25 wide at exponent 16; the camera at a seeded xz in the bowl, + /// just above the noise band at y = max(0, S + 10 - h), gazing across with m_y in [-0.25, 0.1]. Most + /// of its cost is the band itself, which is where affine noise gains most. + /// + public static FogField Wells(float warp, BoundMode mode) + { + var random = new System.Random(0xA37E); + var bowls = new List<(float2, float, float, float)> { (new float2(0.0f, 0.0f), 2.0f * ZoneRadius, 2.0f, 64.0f) }; + foreach (var mass in new[] { 100.0f, 1000.0f, 10000.0f, 1000.0f }) + { + var angle = Uniform(random, 0.0f, 2.0f * MathF.PI); + var radius = ZoneRadius * MathF.Sqrt(random.NextSingle()); + bowls.Add((new float2(radius * MathF.Cos(angle), radius * MathF.Sin(angle)), 500.0f * MathF.Pow(mass, 0.25f), 16.0f, 30.0f * MathF.Pow(mass, 0.175f))); + } + + return new FogField + { + Name = Named("(c-band) shallow wells", mode), Mode = mode, Noise = AetheriaNoise(warp), Bowls = bowls.ToArray(), SlopesY = new float2(-0.25f, 0.1f), + CameraAt = (r, field) => + { + var angle = Uniform(r, 0.0f, 2.0f * MathF.PI); + var radius = ZoneRadius * MathF.Sqrt(r.NextSingle()); + var xz = new float2(radius * MathF.Cos(angle), radius * MathF.Sin(angle)); + return new float3(xz.x, max(0.0f, Safety + 10.0f - field.HeightAt(xz)), xz.y); + }, + }; + } + + private sealed class FogTile : Tile + { + public float2[] Centres = Array.Empty(); // bowl centres in the camera's (x, z) + } + + public override Tile DrawTile(System.Random random, int n) + { + var origin = CameraAt(random, this); + var yaw = Uniform(random, 0.0f, 2.0f * MathF.PI); + var time = Uniform(random, 0.0f, 100.0f); + var slope = new float2(Uniform(random, -1.0f, 1.0f), Uniform(random, SlopesY.x, SlopesY.y)); + return TileAt(origin, yaw, slope, n, Focal, time); + } + + /// The tile of a camera at origin, yawed about y (0 looks along +z), at the given slope, size, focal length and time. + public Tile TileAt(float3 origin, float yaw, float2 slope, int n, float focal, float time) + { + var tile = new FogTile { Origin = origin, N = n, Focal = focal, Time = time, Slope = slope }; + tile.Look(new float3(MathF.Sin(yaw), 0.0f, MathF.Cos(yaw))); + tile.Centres = Bowls.Select(b => + { + var c = tile.Camera(new float3(b.Centre.x, origin.y, b.Centre.y)); + return new float2(c.x, c.z); + }).ToArray(); + return tile; + } + + private static float Pulse(float distance, float scale, float exponent) + { + var x = distance / scale; + var t = 1.0f - 4.0f * x * x; + return t <= 0.0f ? 0.0f : pow(t, exponent); + } + + // h at the camera-frame point (x, z), bowl centres in the same frame. + private float Height(float2[] centres, float x, float z) + { + var h = 0.0f; + for (var b = 0; b < Bowls.Length; b++) + { + var dx = x - centres[b].x; + var dz = z - centres[b].y; + h += Pulse(sqrt(dx * dx + dz * dz), Bowls[b].Scale, Bowls[b].Exponent) * Bowls[b].Depth; + } + + return h; + } + + /// The well map h at the world point (x, z). + public float HeightAt(float2 xz) => Height(Bowls.Select(b => b.Centre).ToArray(), xz.x, xz.y); + + // Each bowl's term over the box is [pulse(far), pulse(near)], pulse decreasing in distance; pow is + // not required to be correctly rounded, so both ends are widened by one ulp. + private float2 HeightBound(float2[] centres, float2 x, float2 z) + { + var h = iv_point(0.0f); + for (var b = 0; b < Bowls.Length; b++) + { + var (nx, fx) = AxisDistance(x, centres[b].x); + var (nz, fz) = AxisDistance(z, centres[b].y); + var near = Pulse(sqrt(nx * nx + nz * nz), Bowls[b].Scale, Bowls[b].Exponent); + var far = Pulse(sqrt(fx * fx + fz * fz), Bowls[b].Scale, Bowls[b].Exponent); + var pulse = new float2(far > 0.0f ? MathF.BitDecrement(far) : 0.0f, near > 0.0f ? MathF.BitIncrement(near) : 0.0f); + h = iv_add(h, iv_scale(pulse, Bowls[b].Depth)); + } + + return h; + } + + private static float2 Compose(float2 s, float2 fade, float2 n) + { + var displaced = iv_add(s, iv_scale(iv_mul(fade, n), Amplitude)); + return new float2(max(0.0f, (FloorOffset - displaced.y) / FloorBlend), max(0.0f, (FloorOffset - displaced.x) / FloorBlend)); + } + + public override float Density(Tile t, float2 slope, float z, bool lod, Counts counts) + { + var tile = (FogTile)t; + var x = slope.x * z; + var y = slope.y * z; + counts.Envelope++; + var s = tile.Origin.y + y + Height(tile.Centres, x, z); + var fade = 1.0f - smoothstep(0.75f * Safety, Safety, s); + if (Compose(iv_point(s), iv_point(fade), FreeNoise).y <= 0.0f) + return 0.0f; + var p = tile.World(new float3(x, y, z)); + var coverage = Noise.Coverage(p, tile.Time, counts); + if (Compose(iv_point(s), iv_point(fade), iv_add(iv_point(coverage), iv_scale(new float2(-1.0f, 1.0f), 0.5f))).y <= 0.0f) + return 0.0f; + var n = coverage + Noise.Detail(p, counts) * 0.5f; + return max(0.0f, (FloorOffset - (s + fade * n * Amplitude)) / FloorBlend); + } + + /// + /// The envelope first: the height and slope intervals over the slice's box, the fade, and the noise + /// at its free range. Where that already proves the slice empty the envelope is the answer; + /// otherwise Mode's bound, which (gated) returns the envelope when the best any probe could give + /// would not prove the slice either. + /// + public override float2 Bound(Tile t, float z0, float z1, bool gated, Counts counts) + { + var tile = (FogTile)t; + var frame = FrameOf(tile, z0, z1, counts); + if (gated && frame.Envelope.y <= 0.0f) + return frame.Envelope; + return Mode == BoundMode.Affine + ? AffineBound(tile, z0, z1, frame, gated, counts) + : IntervalBound(tile, z0, z1, frame.S, frame.Fade, frame.Envelope, gated, counts); + } + + // The height interval, the density level s over the slice's box, its fade and the envelope. + private readonly record struct Frame(float2 Height, float2 S, float2 Fade, float2 Envelope); + + private Frame FrameOf(FogTile tile, float z0, float z1, Counts counts) + { + var depth = new float2(z0, z1); + counts.Envelope++; + var height = HeightBound(tile.Centres, iv_mul(depth, tile.SlopesX), depth); + var s = iv_add(iv_add(iv_point(tile.Origin.y), iv_mul(depth, tile.SlopesY)), height); + var fade = iv_sub(iv_point(1.0f), iv_smoothstep(0.75f * Safety, Safety, s)); + return new Frame(height, s, fade, Compose(s, fade, FreeNoise)); + } + + /// + /// The two sound bounds AffineBound intersects, ungated: the affine arithmetic's own (the shared + /// symbol through af_add, af_mul and af_range), and the interval composition over the same forms' + /// ranges (NoiseBoundTests.AffineCompositionTightensItsRanges). + /// + internal (float2 Affine, float2 Interval) AffinePieces(Tile t, float z0, float z1, Counts counts) + { + var tile = (FogTile)t; + return AffinePieces(tile, z0, z1, FrameOf(tile, z0, z1, counts), counts); + } + + private static bool Same(float3 a, float3 b, float ga, float gb) => all(a == b) && ga == gb; + + /// + /// The centred-warp interval bound. The slice's ball is iv_frustum_ball with no warp; each phase's + /// coverage ball is that ball moved by the flow at its centre and grown by what the flow can vary + /// across it (WarpedNoise.CentredWarp), one ball when the phases coincide (warp 0). The detail octave + /// reads the unwarped point, so its ball is the unwarped one. + /// + private float2 IntervalBound(FogTile tile, float z0, float z1, float2 s, float2 fade, float2 envelope, bool gated, Counts counts) + { + var ball = iv_frustum_ball(tile.Slope, z0, z1, tile.Footprint, 0.0f); + var centre = tile.World(new float3(ball.x, ball.y, ball.z)); + var (c0, g0, c1, g1) = Noise.CentredWarp(centre, ball.w, tile.Time); + if (gated) + { + var provable = false; + foreach (var low in new[] { true, false }) + { + var coverage = Noise.CoverageBound(BestBall(Noise.CoverageRadius(ball.w + g0), low), BestBall(Noise.CoverageRadius(ball.w + g1), low), tile.Time); + provable |= Compose(s, fade, iv_add(coverage, iv_scale(BestBall(Noise.DetailRadius(ball.w), low), 0.5f))).y <= 0.0f; + } + + if (!provable) + return envelope; + } + + var n0 = Noise.CoverageBall(c0, ball.w + g0, counts); + var n1 = Same(c0, c1, g0, g1) ? n0 : Noise.CoverageBall(c1, ball.w + g1, counts); + var noise = iv_add(Noise.CoverageBound(n0, n1, tile.Time), iv_scale(Noise.DetailBall(centre, ball.w, counts), 0.5f)); + return Compose(s, fade, noise); + } + + /// + /// The affine slice of a tile over [z0, z1] in the world frame, with the centred warp applied: the + /// camera-frame axis and ball (af_frustum_axis, af_frustum_ball with no warp), the ball's world + /// centre, the world axis, and the reach R = |axis| + radius of the whole set from that centre (the + /// distance the flow is varied over). It returns the final af_snoise arguments, so a consumer has no + /// term left to wire: each phase's coverage argument is the set moved by the flow at its centre + /// (WarpedNoise.CentredWarp over R) and grown by what the flow can vary across it, and the detail + /// argument is the unwarped set. The rays at depth z lie within an argument's radius of its centre + /// + axis eps(z), eps(z) = clamp((z - z_m) / h, -1, 1) (NoiseBoundTests.AffineWarpStaysEnclosed). + /// + internal AffineSlice Slice(Tile t, float z0, float z1) + { + var tile = (FogTile)t; + var axisCamera = af_frustum_axis(tile.Slope, z0, z1); + var ball = af_frustum_ball(tile.Slope, z0, z1, tile.Footprint, 0.0f); + var centre = tile.World(new float3(ball.x, ball.y, ball.z)); + var axis = tile.Right * axisCamera.x + tile.Up * axisCamera.y + tile.Forward * axisCamera.z; + var reach = length(axis) + ball.w; + var (c0, g0, c1, g1) = Noise.CentredWarp(centre, reach, tile.Time); + var coverageFrequency = Noise.F0; + var detailFrequency = 4.0f * Noise.F0; + return new AffineSlice( + axisCamera, ball, centre, reach, + new NoiseArg(c0 * coverageFrequency, axis * coverageFrequency, (ball.w + g0) * coverageFrequency), + new NoiseArg(c1 * coverageFrequency, axis * coverageFrequency, (ball.w + g1) * coverageFrequency), + new NoiseArg(centre * detailFrequency + 17.0f, axis * detailFrequency, ball.w * detailFrequency)); + } + + /// One af_snoise argument in noise space: the centre, the axis along eps, and the radius. + internal readonly record struct NoiseArg(float3 Centre, float3 Axis, float Radius) + { + /// The distance of the whole set from its centre: the gate's reach. + public float Reach => length(Axis) + Radius; + + public float3 Snoise() => af_snoise(Centre, Axis, Radius); + } + + internal readonly record struct AffineSlice(float3 AxisCamera, float4 Ball, float3 Centre, float Reach, NoiseArg Coverage0, NoiseArg Coverage1, NoiseArg Detail); + + // The best interval any centre value and gradient could give af_snoise over a set of reach R (the + // gradient 0, the value at the far end), toward low or high values: the affine gate. + private static float2 BestForm(float reach, bool low) + { + var e = min(SNOISE_LIPSCHITZ * reach, 0.5f * SNOISE_HESSIAN * reach * reach); + if (e >= 2.0f) + return new float2(-1.0f, 1.0f); + return low ? new float2(-1.0f, min(-1.0f + e, 1.0f)) : new float2(max(1.0f - e, -1.0f), 1.0f); + } + + private static float2 Clip(float2 range) => new(max(range.x, -1.0f), min(range.y, 1.0f)); + + /// + /// The affine bound, one shared symbol: depth z = z_m + h eps over the slice (af_frustum_axis and + /// af_frustum_ball give the noise argument the same eps). s = O_y + m_c,y z + (m_y - m_c,y) z + h(xz) + /// is affine in eps, with the lateral slope-depth term (at most Half z1, plus the rounding of the + /// pointwise m_y z) and the height interval in e. Each phase's coverage and the unwarped detail are + /// af_snoise over the slice moved and grown by the centred warp, the fade enters as af_from_iv, and + /// s' = s + A fade n is ranged by af_range. The result is intersected with the interval composition + /// over the same forms' ranges, each clipped to [-1, 1] (both sound, no further evaluation). The gate + /// is BestForm's. + /// + private float2 AffineBound(FogTile tile, float z0, float z1, Frame frame, bool gated, Counts counts) + { + if (gated) + { + var slice = Slice(tile, z0, z1); + var (s, fade) = (frame.S, frame.Fade); + var provable = false; + foreach (var low in new[] { true, false }) + { + var coverage = Noise.CoverageBound(BestForm(slice.Coverage0.Reach, low), BestForm(slice.Coverage1.Reach, low), tile.Time); + provable |= Compose(s, fade, iv_add(coverage, iv_scale(BestForm(slice.Detail.Reach, low), 0.5f))).y <= 0.0f; + } + + if (!provable) + return frame.Envelope; + } + + var (affine, interval) = AffinePieces(tile, z0, z1, frame, counts); + return new float2(max(affine.x, interval.x), min(affine.y, interval.y)); + } + + private (float2 Affine, float2 Interval) AffinePieces(FogTile tile, float z0, float z1, Frame frame, Counts counts) + { + var slice = Slice(tile, z0, z1); + var (ball, axisCamera) = (slice.Ball, slice.AxisCamera); + var (height, s, fade) = (frame.Height, frame.S, frame.Fade); + var shared = slice.Coverage0 == slice.Coverage1; + counts.Grad += shared ? 2 : 3; + var n0 = slice.Coverage0.Snoise(); + var n1 = shared ? n0 : slice.Coverage1.Snoise(); + var nd = slice.Detail.Snoise(); + var w0 = Noise.Phases(tile.Time).W0; + var noise = af_add(af_add(af_scale(n0, w0), af_scale(n1, 1.0f - w0)), af_scale(nd, 0.5f)); + + // The clamp residual of z = z_m + h eps(z), 2^-23 (|z_m| + h) (af_frustum_ball). + var residual = (abs(ball.z) + axisCamera.z) * 1.1920928955078125e-7f; + var depth = af_add_iv(af_symbol(ball.z, axisCamera.z), new float2(-residual, residual)); + var lateral = tile.Half * z1 + (abs(tile.Slope.y) + tile.Half) * z1 * 2.384185791015625e-7f; + var level = af_add_iv(af_add_iv(af_add(af_point(tile.Origin.y), af_scale(depth, tile.Slope.y)), new float2(-lateral, lateral)), height); + var displaced = af_range(af_add(level, af_scale(af_mul(af_from_iv(fade), noise), Amplitude))); + var affine = new float2(max(0.0f, (FloorOffset - displaced.y) / FloorBlend), max(0.0f, (FloorOffset - displaced.x) / FloorBlend)); + var interval = Compose(s, fade, iv_add(Noise.CoverageBound(Clip(af_range(n0)), Clip(af_range(n1)), tile.Time), iv_scale(Clip(af_range(nd)), 0.5f))); + return (affine, interval); + } + } + + /// + /// (d) r1's uniform slab, kept as the worst case: the map's warped coverage field (F0 0.35, cutoff 0.25, + /// depth 12, period 4, extinction 2, flow in xy at 0.15, warp 0.05) with no envelope, so every cell is a + /// noise question. The dense sample evaluates the coverage first and the detail only where the coverage + /// passes the cutoff; ungated it would cost three snoise, as r1 counted. + /// + internal sealed class SlabField : Scenario + { + public const float F0 = 0.35f; + public const float Cutoff = 0.25f; + public const float Depth = 12.0f; + public const float SlabExtinction = 2.0f; + public const float SlabWarp = 0.05f; + + public required WarpedNoise Noise { get; init; } + + public SlabField() => Grid = Cells(0.125f, Depth); + + public static SlabField Create(float warp) => new() + { + Name = "(d) uniform slab", Noise = new WarpedNoise { F0 = F0, Warp = warp, Period = 4.0f, FlowFrequency = 0.15f, FlowInXY = true }, + }; + + public override Tile DrawTile(System.Random random, int n) => new() + { + Origin = new float3(Uniform(random, -50.0f, 50.0f), Uniform(random, -50.0f, 50.0f), 0.0f), + Slope = new float2(Uniform(random, -0.5f, 0.5f), Uniform(random, -0.5f, 0.5f)), + N = n, Focal = Focal, Time = Uniform(random, 0.0f, 100.0f), + }; + + public override float Density(Tile tile, float2 slope, float z, bool lod, Counts counts) + { + var p = tile.World(new float3(slope.x * z, slope.y * z, z)); + var coverage = Noise.Coverage(p, tile.Time, counts); + if (coverage <= Cutoff) + return 0.0f; + counts.Snoise++; + var detail = 1.0f - abs(snoise(p * (4.0f * F0) + 17.0f)); + return max(0.0f, coverage - Cutoff) * SlabExtinction * lerp(0.6f, 1.0f, detail); + } + + public override float2 Bound(Tile tile, float z0, float z1, bool gated, Counts counts) + { + var maybe = new float2(0.0f, float.MaxValue); + var ball = iv_frustum_ball(tile.Slope, z0, z1, tile.Footprint, Noise.Warp); + if (gated && Noise.CoverageBound(BestBall(Noise.CoverageRadius(ball.w), low: true), BestBall(Noise.CoverageRadius(ball.w), low: true), tile.Time).y > Cutoff) + return maybe; + var coverageBall = Noise.CoverageBall(tile.World(new float3(ball.x, ball.y, ball.z)), ball.w, counts); + var coverage = Noise.CoverageBound(coverageBall, coverageBall, tile.Time); + return coverage.y <= Cutoff ? new float2(0.0f, 0.0f) : maybe; + } + } + + /// + /// (e) The void: a cloud volume everywhere, carved by one negative pseudo-Gaussian sphere. Authored + /// knobs: hollow radius Rh (density exactly 0 inside) and ramp width S (the density rises to full over + /// [Rh, Rh + S]); everything else is derived from them. The brush (1 - (d / Rc)^2)^e with CARVE = 1.5 + /// reaches full at Rc, so Rc = Rh + S, and Rh = Rc sqrt(1 - CARVE^(-1/e)) gives + /// e = -ln CARVE / ln(1 - (Rh / Rc)^2): density = K max(0, 1 - CARVE (1 - (d' / Rc)^2)^e), exactly 0 for + /// d' <= Rh and K for d' >= Rc, K = 1/30. The noise displaces the wall: fade = + /// smoothstep(Rh - S, Rh, d), d' = d + A fade n(warp(p)), A = 20, F0 = 0.01 (wavelengths 100 and 25), + /// warp D = 10. The sun orbits the origin at radius 175 with period 72 s and rests on the hollow's + /// bottom (c_v = sun + (0, Rh - 12.5, 0)); the camera looks at sun + (0, 60, 0) and, shipped, sits 120 + /// behind the sun along the orbit tangent and 45 above it. + /// + /// The one shipped void (ruling operator-shipped-void) is Shipped(): (Rh, S) = (198, 50), so Rc = 248 + /// and e = -ln 1.5 / ln(1 - (198 / 248)^2), which the constructor derives; no other void is shipped. + /// + /// The footprint-truncated field (lod) weights octave i by w_i(z) = 1 - smoothstep(l_i / 2m, l_i / m, + /// z theta), m = 4, theta = 1 / f. Deviation from the spec's [w_i(z1), w_i(z0)]: the bound takes each + /// weight over [w_i(z1), 1], because one Bound serves the full field (w = 1) and the truncated one + /// (w in [w_i(z1), w_i(z0)], w decreasing in z); [w_i(z1), 1] contains both and iv_mul is monotone in + /// its interval argument, so the composed interval encloses both fields. The slack is only in far + /// tiles, whose step the footprint already sets. At f = 935 every weight is 1 inside every grid; + /// LodFar() (f = 467) reaches weights in (0, 1) and at 0. + /// + /// The dense grid is the fixed-step reference's: cells of min(10, S / 4) out to + /// |camera - c_v| + Rc + 6 / K. The density is provably K only from d >= Rc + A 1.5 (the free noise + /// interval), so 6 / K leaves at least 4.9 of optical depth past it and every ray goes opaque before + /// the grid ends. + /// + internal sealed class VoidField : Scenario + { + public const float Carve = 1.5f; + public const float Amplitude = 20.0f; + public const float K = 1.0f / 30.0f; + public const float StepFootprints = 4.0f; // k + public const float OctaveFootprints = 4.0f; // m + private static readonly float2 FreeNoise = new(-1.5f, 1.5f); + + public static readonly float[] HollowRadii = { 100.0f, 200.0f, 400.0f, 1000.0f }; + public static readonly float[] Ramps = { 10.0f, 50.0f, 150.0f }; + public static readonly (string Name, float Fraction)[] CameraOffsets = { ("centred", 0.0f), ("mid", 0.5f), ("low", 0.94f) }; + + public readonly float HollowRadius; + public readonly float Ramp; + public readonly float CarveRadius; + public readonly float Exponent; + public readonly float RampStart; + public readonly float FixedStep; + public readonly float CameraFraction; // negative: the shipped camera + public readonly WarpedNoise Noise = new() { F0 = 0.01f, Warp = 10.0f }; + + private float CoarseWavelength => 1.0f / Noise.F0; + private float FineWavelength => 1.0f / (4.0f * Noise.F0); + private float Theta => 1.0f / Focal; + + [System.Diagnostics.CodeAnalysis.SetsRequiredMembers] + public VoidField(float hollowRadius, float ramp, float cameraFraction, string camera, float focal = 935.0f) + { + Focal = focal; + HollowRadius = hollowRadius; + Ramp = ramp; + CarveRadius = hollowRadius + ramp; + Exponent = (float)(-Math.Log(Carve) / Math.Log(1.0 - (double)hollowRadius / CarveRadius * hollowRadius / CarveRadius)); + RampStart = hollowRadius - ramp; + FixedStep = min(10.0f, ramp / 4.0f); + CameraFraction = cameraFraction; + Name = $"(e) void Rh={hollowRadius:R} camera={camera} S={ramp:R}" + (focal == 935.0f ? "" : $" f={focal:R}"); + var reach = cameraFraction < 0.0f ? length(new float2(120.0f, 45.0f - (hollowRadius - 12.5f))) : cameraFraction * hollowRadius; + Grid = Cells(FixedStep, reach + CarveRadius + 6.0f / K); + } + + public static VoidField Shipped() => new(198.0f, 50.0f, -1.0f, "shipped"); + + /// + /// The configuration that reaches the octave weights: Rh = 4000, S = 50, the low camera, f = 467 + /// (1080 rows at a 98 degree vertical field of view). The fine weight is below 1 past z = 1460 and 0 + /// past 2920, the coarse below 1 past 5840, and the grid reaches about 7990. Printed, not asserted. + /// + public static VoidField LodFar() => new(4000.0f, 50.0f, 0.94f, "low", 467.0f); + + /// The coarse and fine octave weights at depth z (1 for the full field). + public (float Coarse, float Fine) Weights(float z) => (Weight(CoarseWavelength, z * Theta), Weight(FineWavelength, z * Theta)); + + /// The coarse and fine octave weight bounds Bound uses over [z0, z1]. + public (float2 Coarse, float2 Fine) WeightBounds(float z0, float z1) => (WeightBound(CoarseWavelength, z0, z1), WeightBound(FineWavelength, z0, z1)); + + private sealed class VoidTile : Tile + { + public float3 Cavity; // c_v in the camera frame + } + + public override Tile DrawTile(System.Random random, int n) + { + var time = Uniform(random, 0.0f, 72.0f); + var angle = 2.0f * MathF.PI * time / 72.0f; + var sun = new float3(175.0f * MathF.Cos(angle), 0.0f, 175.0f * MathF.Sin(angle)); + var tangent = new float3(-MathF.Sin(angle), 0.0f, MathF.Cos(angle)); + var cavity = sun + new float3(0.0f, HollowRadius - 12.5f, 0.0f); + var target = sun + new float3(0.0f, 60.0f, 0.0f); + float3 origin; + float3 forward; + if (CameraFraction < 0.0f) + { + origin = sun - tangent * 120.0f + new float3(0.0f, 45.0f, 0.0f); + forward = target - origin; + } + else + { + // The shipped camera's direction from the centre, at a fraction of this hollow's radius; + // centred, it looks along the orbit, slightly down. + origin = cavity + normalize(tangent * -120.0f + new float3(0.0f, 45.0f - (198.0f - 12.5f), 0.0f)) * (CameraFraction * HollowRadius); + forward = CameraFraction == 0.0f ? tangent * -1.0f + new float3(0.0f, -0.2f, 0.0f) : target - origin; + } + + var tile = new VoidTile + { + Origin = origin, N = n, Focal = Focal, Time = time, + Slope = new float2((random.Next(1920 / n) * n + n * 0.5f - 960.0f) / Focal, (random.Next(1080 / n) * n + n * 0.5f - 540.0f) / Focal), + }; + tile.Look(forward); + tile.Cavity = tile.Camera(cavity); + return tile; + } + + private static float Weight(float wavelength, float footprint) => + 1.0f - smoothstep(wavelength / (2.0f * OctaveFootprints), wavelength / OctaveFootprints, footprint); + + private float2 WeightBound(float wavelength, float z0, float z1) => + new(iv_sub(iv_point(1.0f), iv_smoothstep(wavelength / (2.0f * OctaveFootprints), wavelength / OctaveFootprints, new float2(z0 * Theta, z1 * Theta))).x, 1.0f); + + /// The footprint step: max(k z theta, min(S / 4, half the finest live wavelength)). + public float LodStep(float z) + { + var footprint = z * Theta; + var fine = Weight(FineWavelength, footprint) > 0.0f ? FineWavelength : Weight(CoarseWavelength, footprint) > 0.0f ? CoarseWavelength : float.PositiveInfinity; + return max(StepFootprints * footprint, min(Ramp / 4.0f, fine / 2.0f)); + } + + private float Profile(float displaced) + { + if (displaced <= HollowRadius) + return 0.0f; + var x = displaced / CarveRadius; + var g = displaced < CarveRadius ? pow(max(0.0f, 1.0f - x * x), Exponent) : 0.0f; + return K * max(0.0f, 1.0f - Carve * g); + } + + private float2 Compose(float2 d, float2 fade, float2 n) + { + var displaced = iv_add(d, iv_scale(iv_mul(fade, n), Amplitude)); + return new float2(displaced.x >= CarveRadius ? K : 0.0f, displaced.y <= HollowRadius ? 0.0f : K); + } + + public override float Density(Tile t, float2 slope, float z, bool lod, Counts counts) + { + var tile = (VoidTile)t; + var x = slope.x * z; + var y = slope.y * z; + counts.Envelope++; + var dx = x - tile.Cavity.x; + var dy = y - tile.Cavity.y; + var dz = z - tile.Cavity.z; + var d = sqrt(dx * dx + dy * dy + dz * dz); + var fade = smoothstep(RampStart, HollowRadius, d); + var free = Compose(iv_point(d), iv_point(fade), FreeNoise); + if (free.x == free.y) + return free.x; + var p = tile.World(new float3(x, y, z)); + var wc = lod ? Weight(CoarseWavelength, z * Theta) : 1.0f; + var wd = lod ? Weight(FineWavelength, z * Theta) : 1.0f; + var coverage = wc > 0.0f ? Noise.Coverage(p, tile.Time, counts) * wc : 0.0f; + var partial = Compose(iv_point(d), iv_point(fade), iv_add(iv_point(coverage), iv_scale(new float2(-wd, wd), 0.5f))); + if (partial.x == partial.y) + return partial.x; + var detail = wd > 0.0f ? Noise.Detail(p, counts) * 0.5f * wd : 0.0f; + return Profile(d + fade * (coverage + detail) * Amplitude); + } + + /// + /// The field with no envelope gate: both noise terms always evaluated, the profile applied to the + /// displaced distance. Density's shortcuts go through Compose; this does not, so it is the value a + /// wrong Compose cannot also corrupt. Not counted. + /// + public float Exact(Tile t, float2 slope, float z, bool lod) + { + var tile = (VoidTile)t; + var counts = new Counts(); + var (x, y) = (slope.x * z, slope.y * z); + var (dx, dy, dz) = (x - tile.Cavity.x, y - tile.Cavity.y, z - tile.Cavity.z); + var d = sqrt(dx * dx + dy * dy + dz * dz); + var fade = smoothstep(RampStart, HollowRadius, d); + var p = tile.World(new float3(x, y, z)); + var wc = lod ? Weight(CoarseWavelength, z * Theta) : 1.0f; + var wd = lod ? Weight(FineWavelength, z * Theta) : 1.0f; + var n = Noise.Coverage(p, tile.Time, counts) * wc + Noise.Detail(p, counts) * 0.5f * wd; + return Profile(d + fade * n * Amplitude); + } + + public override float2 Bound(Tile t, float z0, float z1, bool gated, Counts counts) + { + var tile = (VoidTile)t; + var depth = new float2(z0, z1); + counts.Envelope++; + var (nx, fx) = AxisDistance(iv_mul(depth, tile.SlopesX), tile.Cavity.x); + var (ny, fy) = AxisDistance(iv_mul(depth, tile.SlopesY), tile.Cavity.y); + var (nz, fz) = AxisDistance(depth, tile.Cavity.z); + var d = new float2(sqrt(nx * nx + ny * ny + nz * nz), sqrt(fx * fx + fy * fy + fz * fz)); + var fade = iv_smoothstep(RampStart, HollowRadius, d); + var envelope = Compose(d, fade, FreeNoise); + if (gated && envelope.y <= 0.0f) + return envelope; + var ball = iv_frustum_ball(tile.Slope, z0, z1, tile.Footprint, Noise.Warp); + var wc = WeightBound(CoarseWavelength, z0, z1); + var wd = WeightBound(FineWavelength, z0, z1); + if (gated) + { + var provable = false; + foreach (var low in new[] { true, false }) + { + var best = iv_add(iv_mul(Noise.CoverageBound(BestBall(Noise.CoverageRadius(ball.w), low), BestBall(Noise.CoverageRadius(ball.w), low), tile.Time), wc), iv_mul(iv_scale(BestBall(Noise.DetailRadius(ball.w), low), 0.5f), wd)); + provable |= Compose(d, fade, best).y <= 0.0f; + } + + if (!provable) + return envelope; + } + + var centre = tile.World(new float3(ball.x, ball.y, ball.z)); + var coverage = Noise.CoverageBall(centre, ball.w, counts); + var noise = iv_add(iv_mul(Noise.CoverageBound(coverage, coverage, tile.Time), wc), iv_mul(iv_scale(Noise.DetailBall(centre, ball.w, counts), 0.5f), wd)); + return Compose(d, fade, noise); + } + } + + // One cell's transmittance: the density at the cell's mid-depth, over the ray's length through it. + private static float Integrate(Scenario field, Tile tile, float2 slope, float z0, float z1, bool lod, Counts counts) => + exp(-(field.Density(tile, slope, (z0 + z1) * 0.5f, lod, counts) * field.Extinction) * ((z1 - z0) * sqrt(slope.x * slope.x + slope.y * slope.y + 1.0f))); + + /// + /// The tile pre-pass on cell-index ranges: probe the slice of the range; provably empty skips it and + /// doubles the next range; otherwise a range of more than one cell halves, and a single cell is dense. + /// It starts with the whole grid, runs to the grid's end (a pre-pass knows no ray's transmittance) and + /// yields the dense cells in order. Its probes are counted once per tile. + /// + /// The body (ruling operator-analytic-wall-body): when a single dense cell's own bound is a positive + /// point (the cell is provably constant), one more probe over [grid[j], grid end]; if that is a + /// positive point too, every point of every ray of the tile over the rest of the grid has exactly that + /// density, so BodyStart = j, BodyDensity = its value, and every remaining cell is appended dense + /// without probing (adding cells is always sound, so the mask keeps its meaning). BodyStart is -1 when + /// no body is proven. + /// + private static (List Dense, int BodyStart, float BodyDensity) MarchTile(Scenario field, Tile tile, Counts probes) + { + var grid = field.Grid; + var cells = grid.Length - 1; + var dense = new List(); + var j = 0; + var span = cells; + while (j < cells) + { + var end = Math.Min(j + span, cells); + var bound = field.Bound(tile, grid[j], grid[end], gated: true, probes); + if (bound.y <= 0.0f) + { + j = end; + span = Math.Min(span * 2, cells); + } + else if (end - j > 1) + { + span = (end - j + 1) / 2; + } + else + { + if (bound.x == bound.y && bound.x > 0.0f) + { + var rest = field.Bound(tile, grid[j], grid[cells], gated: true, probes); + if (rest.x == rest.y && rest.x > 0.0f) + { + dense.AddRange(Enumerable.Range(j, cells - j)); + return (dense, j, rest.x); + } + } + + dense.Add(j); + j++; + } + } + + return (dense, -1, 0.0f); + } + + // The body's optical depth from z to the grid's end, at the density the field's pointwise envelope gives + // at z (one envelope evaluation; no probe in the main pass). MarchLod takes exp(-BodyDepth) as one step. + private static float BodyDepth(Scenario field, Tile tile, float2 slope, float z, bool lod, Counts counts) => + field.Density(tile, slope, z, lod, counts) * field.Extinction * ((field.Grid[^1] - z) * sqrt(slope.x * slope.x + slope.y * slope.y + 1.0f)); + + // The footprint-aware march, the void's shipped one: steps of LodStep(z) inside the unmasked runs only, + // octave weights applied, early-out below cutoff; at the body's start, one analytic step to the grid's + // end, and stop. AtBody is the transmittance when the march reaches the body's start, before that step, + // or the final transmittance when there is no body. + private static (float Transmittance, float AtBody) MarchLod(VoidField field, Tile tile, float2 slope, List cells, int bodyStart, float cutoff, Counts counts, ref long steps, ref long bodySteps) + { + var grid = field.Grid; + var body = bodyStart >= 0 ? grid[bodyStart] : float.PositiveInfinity; + var transmittance = 1.0f; + var k = 0; + while (k < cells.Count && transmittance >= cutoff) + { + var z = grid[cells[k]]; + var end = cells[k] + 1; + for (k++; k < cells.Count && cells[k] == end; k++) + end++; + while (z < grid[end] && transmittance >= cutoff) + { + if (z >= body) + { + var atBody = transmittance; + transmittance *= exp(-BodyDepth(field, tile, slope, z, lod: true, counts)); + steps++; + bodySteps++; + return (transmittance, atBody); + } + + var next = min(min(z + field.LodStep(z), grid[end]), z < body ? body : grid[end]); + transmittance *= Integrate(field, tile, slope, z, next, lod: true, counts); + steps++; + z = next; + } + } + + return (transmittance, transmittance); + } + + // The accuracy oracle before the body: the optical depth over every grid cell below `stop` (never the + // mask's, so it trusts no pre-pass), by midpoint quadrature at step h, accumulated in double. Not counted. + private static double ConvergedDepth(Scenario field, Tile tile, float2 slope, int stop, float h, bool lod) + { + var grid = field.Grid; + var counts = new Counts(); + var dir = Math.Sqrt(slope.x * (double)slope.x + slope.y * (double)slope.y + 1.0); + var tau = 0.0; + for (var c = 0; c < stop; c++) + { + var samples = Math.Max(1, (int)Math.Ceiling((grid[c + 1] - grid[c]) / h)); + var dz = (grid[c + 1] - grid[c]) / (double)samples; + for (var s = 0; s < samples; s++) + tau += field.Density(tile, slope, (float)(grid[c] + (s + 0.5) * dz), lod, counts) * (double)field.Extinction * dz * dir; + } + + return tau; + } + + internal sealed class RunStats + { + public readonly Counts Dense = new(); + public readonly Counts Masked = new(); + public readonly Counts Probes = new(); + public readonly Counts Lod = new(); + public readonly Counts Oracle = new(); + public readonly Counts Range = new(); + public long Rays; + public long Tiles; + public long DenseSteps; + public long MaskedSteps; + public long LodSteps; + public long BodySteps; + public long BodyTiles; + public long Unfinished; + public float MaxDifference; + public float MaxLodDifference; + public float MaxOracleDifference; + public long OracleEmpty; + public long OracleEmptySkipped; + public long RangeEmpty; + public long RangeEmptySkipped; + public long RangeViolations; + public bool Ranged; + public double MaxLodDepthError; + public double MaxRefDepthError; + + public double PerRay(double value) => value / Rays; + + // Dense cost over the tile march's: each ray's own dense cells plus the tile's probes, shared. + public double Ratio => Dense.Cost / (Masked.Cost + Probes.Cost); + + public double LodRatio => Dense.Cost / (Lod.Cost + Probes.Cost); + + // The oracle mask (the cells some ray of the tile samples nonzero) is a ceiling no pre-pass can move. + public double OracleCeiling => Dense.Cost / Oracle.Cost; + + public double Efficiency => Oracle.Cost / (Masked.Cost + Probes.Cost); + + // The tile march over the tile march plus its probes: what the probes cost, not what they cull. + public double ProbeOverhead => Masked.Cost / (Masked.Cost + Probes.Cost); + + // The oracle-empty cells the pre-pass proves empty; a pre-pass that skips nothing scores 0. + public double CullFraction => (double)OracleEmptySkipped / OracleEmpty; + + // The range ceiling: the oracle march's cost over the range mask's, with probes free. The range + // mask is what an exact enclosure of each cell over the tile's whole slice could prove, so no sound + // bound can reach the oracle, only this; it is sampled, so it is an upper estimate. + public double RangeCeiling => Oracle.Cost / Range.Cost; + + // The tile march's efficiency against the range ceiling: the range mask's cost over the tile + // march's with its probes. + public double RangeEfficiency => Range.Cost / (Masked.Cost + Probes.Cost); + + public double RangeCull => (double)RangeEmptySkipped / RangeEmpty; + } + + /// + /// Draws `tiles` tiles, runs the pre-pass once per tile, draws the tile's N^2 ray slopes (one per pixel, + /// jittered inside it), builds the oracle mask (the cells whose mid-depth density is nonzero for at least + /// one of those slopes), and marches each ray densely over every cell, masked over the tile's dense cells + /// and over the oracle cells, all with the early-out at 0.02 and the same Integrate. With lod, the + /// footprint-aware march as well, and the agreement at the body start (or the grid's end): the optical + /// depth of a cutoff-0 footprint march and of the fixed-step cells, each against ConvergedDepth at + /// h = 0.5. The oracle mask and the agreement marches count into throwaway Counts, the oracle march into + /// its own, so the cost rows do not move. With range, the range mask as well: the oracle mask plus + /// every cell where the density is positive at any of 5 x 5 slopes over the tile's slope square + /// (corners included) x 9 depths over the cell; each ray is marched over it into Range, and a cell of + /// it the pre-pass skipped is counted as a range violation (a sampled point a bound failed to enclose). + /// + private static RunStats Run(Scenario field, int n, int tiles, int seed, bool lod = false, bool range = false) + { + var random = new System.Random(seed); + var stats = new RunStats { Ranged = range }; + var scratch = new Counts(); + var grid = field.Grid; + for (var t = 0; t < tiles; t++) + { + var tile = field.DrawTile(random, n); + var (cells, bodyStart, _) = MarchTile(field, tile, stats.Probes); + Assert.True(field is VoidField || bodyStart < 0, $"{field.Name}: a body reported at cell {bodyStart}; only the void's density can be provably constant"); + stats.Tiles++; + stats.BodyTiles += bodyStart >= 0 ? 1 : 0; + var slopes = new List(); + for (var j = 0; j < n; j++) + for (var i = 0; i < n; i++) + slopes.Add(tile.PixelSlope(i, j, random.NextSingle(), random.NextSingle())); + var inMask = new HashSet(cells); + var oracle = new List(); + for (var c = 0; c < grid.Length - 1; c++) + { + var mid = (grid[c] + grid[c + 1]) * 0.5f; + if (slopes.Any(s => field.Density(tile, s, mid, false, scratch) > 0.0f)) + { + oracle.Add(c); + } + else + { + stats.OracleEmpty++; + stats.OracleEmptySkipped += inMask.Contains(c) ? 0 : 1; + } + } + + var ranged = new List(); + if (range) + { + var inOracle = new HashSet(oracle); + for (var c = 0; c < grid.Length - 1; c++) + { + var sampled = inOracle.Contains(c); + for (var a = 0; a < 5 && !sampled; a++) + for (var b = 0; b < 5 && !sampled; b++) + for (var k = 0; k < 9 && !sampled; k++) + { + var slope = new float2(tile.SlopesX.x + (tile.SlopesX.y - tile.SlopesX.x) * a / 4.0f, tile.SlopesY.x + (tile.SlopesY.y - tile.SlopesY.x) * b / 4.0f); + sampled = field.Density(tile, slope, grid[c] + (grid[c + 1] - grid[c]) * k / 8.0f, false, scratch) > 0.0f; + } + + if (sampled) + { + ranged.Add(c); + stats.RangeViolations += inMask.Contains(c) ? 0 : 1; + } + else + { + stats.RangeEmpty++; + stats.RangeEmptySkipped += inMask.Contains(c) ? 0 : 1; + } + } + } + + var stop = bodyStart >= 0 ? bodyStart : grid.Length - 1; + foreach (var slope in slopes) + { + var dense = 1.0f; + for (var c = 0; c < grid.Length - 1 && dense >= 0.02f; c++, stats.DenseSteps++) + dense *= Integrate(field, tile, slope, grid[c], grid[c + 1], lod: false, stats.Dense); + var masked = 1.0f; + for (var c = 0; c < cells.Count && masked >= 0.02f; c++, stats.MaskedSteps++) + masked *= Integrate(field, tile, slope, grid[cells[c]], grid[cells[c] + 1], lod: false, stats.Masked); + var exact = 1.0f; + for (var c = 0; c < oracle.Count && exact >= 0.02f; c++) + exact *= Integrate(field, tile, slope, grid[oracle[c]], grid[oracle[c] + 1], lod: false, stats.Oracle); + var rangedT = 1.0f; + for (var c = 0; c < ranged.Count && rangedT >= 0.02f; c++) + rangedT *= Integrate(field, tile, slope, grid[ranged[c]], grid[ranged[c] + 1], lod: false, stats.Range); + stats.Rays++; + stats.MaxDifference = MathF.Max(stats.MaxDifference, MathF.Abs(dense - masked)); + stats.MaxOracleDifference = MathF.Max(stats.MaxOracleDifference, MathF.Abs(dense - exact)); + if (dense >= 0.02f) + stats.Unfinished++; + if (lod) + { + var (marched, _) = MarchLod((VoidField)field, tile, slope, cells, bodyStart, 0.02f, stats.Lod, ref stats.LodSteps, ref stats.BodySteps); + stats.MaxLodDifference = MathF.Max(stats.MaxLodDifference, MathF.Abs(dense - marched)); + long ignoredSteps = 0, ignoredBody = 0; + var (_, atBody) = MarchLod((VoidField)field, tile, slope, cells, bodyStart, 0.0f, scratch, ref ignoredSteps, ref ignoredBody); + var reference = 1.0; + for (var c = 0; c < stop; c++) + reference *= Integrate(field, tile, slope, grid[c], grid[c + 1], lod: false, scratch); + var tauConv = ConvergedDepth(field, tile, slope, stop, 0.5f, lod: true); + var tauLod = -Math.Log(Math.Max(atBody, 1.0e-30f)); + var tauRef = -Math.Log(Math.Max(reference, 1.0e-300)); + var scale = Math.Max(tauConv, 1.0e-3); + stats.MaxLodDepthError = Math.Max(stats.MaxLodDepthError, Math.Abs(tauLod - tauConv) / scale); + stats.MaxRefDepthError = Math.Max(stats.MaxRefDepthError, Math.Abs(tauRef - tauConv) / scale); + } + } + } + + return stats; + } + + private void Report(string label, RunStats s) => output.WriteLine( + $"IV-REPORT {label}: dense snoise/ray {s.PerRay(s.Dense.Snoise):F2} env/ray {s.PerRay(s.Dense.Envelope):F2} (samples/ray {s.PerRay(s.DenseSteps):F2}); " + + $"tile snoise/ray {s.PerRay(s.Masked.Snoise + (double)s.Probes.Snoise):F2} env/ray {s.PerRay(s.Masked.Envelope + (double)s.Probes.Envelope):F2} grad/ray {s.PerRay(s.Probes.Grad):F2} " + + $"(probes/tile env {(double)s.Probes.Envelope / s.Tiles:F1} snoise {(double)s.Probes.Snoise / s.Tiles:F2} grad {(double)s.Probes.Grad / s.Tiles:F2}; dense cells/ray {s.PerRay(s.MaskedSteps):F2}); " + + $"cost ratio {s.Ratio:F2}x, oracle ceiling {s.OracleCeiling:F2}x, efficiency {s.Efficiency:F3}, cull fraction {s.CullFraction:F3} ({s.OracleEmptySkipped}/{s.OracleEmpty}), " + + $"probe overhead {s.ProbeOverhead:F3}; max |dT| {s.MaxDifference:R}, oracle {s.MaxOracleDifference:R}; unfinished rays {s.Unfinished}" + + (s.Ranged + ? $"; range ceiling {s.RangeCeiling:F3} (oracle cost over the range mask's), efficiency against it {s.RangeEfficiency:F3}, range cull {s.RangeCull:F3} ({s.RangeEmptySkipped}/{s.RangeEmpty}), range violations {s.RangeViolations}" + : "")); + + private void ReportVoid(string label, RunStats s) => output.WriteLine( + $"IV-REPORT {label}: steps/px ref {s.PerRay(s.DenseSteps):F2}, masked {s.PerRay(s.MaskedSteps):F2}, LOD {s.PerRay(s.LodSteps):F2} ({(double)s.DenseSteps / s.LodSteps:F2}x fewer); " + + $"snoise/px ref {s.PerRay(s.Dense.Snoise):F2}, masked {s.PerRay(s.Masked.Snoise):F2}, LOD {s.PerRay(s.Lod.Snoise):F2}; " + + $"cost/px ref {s.PerRay(s.Dense.Cost):F2}, masked {s.PerRay(s.Masked.Cost + s.Probes.Cost):F2}, LOD {s.PerRay(s.Lod.Cost + s.Probes.Cost):F2} incl. probes (ref/LOD {s.LodRatio:F2}x, ref/masked {s.Ratio:F2}x); " + + $"probes/tile env {(double)s.Probes.Envelope / s.Tiles:F1} snoise {(double)s.Probes.Snoise / s.Tiles:F2}; body tiles {s.BodyTiles}/{s.Tiles}, analytic steps/px {s.PerRay(s.BodySteps):F2}; " + + $"depth error at the body start vs converged: LOD {s.MaxLodDepthError:G4}, fixed-step {s.MaxRefDepthError:G4} (ratio {s.MaxLodDepthError / s.MaxRefDepthError:F2}); " + + $"end-of-ray max |dT| masked {s.MaxDifference:R}, LOD {s.MaxLodDifference:R}; unfinished rays {s.Unfinished}"); + + /// + /// The analytic body's soundness pin (ruling operator-analytic-wall-body). Over 2,000 seeded tiles of + /// the (e) grid, the shipped void and LOD-far at N in {1, 4, 8, 16}, wherever the pre-pass reports a + /// body start b: (1) the gated bound over [grid[b], grid end] is a positive point equal to the reported + /// density, every cell from b to the end is in the mask, and at 64 random (pixel, sub-pixel, cell >= b, + /// depth in cell) points the full and the truncated Density and the ungated Exact field all equal it + /// exactly, no tolerance; (2) BodyDepth, the optical depth MarchLod's one closed-form step uses, equals + /// the summed fixed-step depth -ln Integrate of the body cells (no early-out, same cells) within 1e-4 + /// relative, compared in the depth domain so LOD-far's deep bodies do not underflow. (3) No tile of (a)-(d), at either warp, reports a body: their bounds are never a positive + /// point. + /// + [Fact] + public void AnalyticBodyMatchesFineMarch() + { + var random = new System.Random(0xB0D1); + int[] sizes = { 1, 4, 8, 16 }; + var voids = new List(); + foreach (var rh in VoidField.HollowRadii) + foreach (var offset in VoidField.CameraOffsets) + foreach (var ramp in VoidField.Ramps) + voids.Add(new VoidField(rh, ramp, offset.Fraction, offset.Name)); + voids.Add(VoidField.Shipped()); + voids.Add(VoidField.LodFar()); + var counts = new Counts(); + var bodies = new Dictionary(); + for (var t = 0; t < 2000; t++) + { + var field = t % 4 == 0 ? voids[^2] : t % 4 == 1 ? voids[^1] : voids[random.Next(voids.Count)]; + var tile = field.DrawTile(random, sizes[random.Next(sizes.Length)]); + var (cells, b, density) = MarchTile(field, tile, counts); + if (b < 0) + continue; + bodies[field.Name] = bodies.GetValueOrDefault(field.Name) + 1; + var grid = field.Grid; + var last = grid.Length - 1; + var rest = field.Bound(tile, grid[b], grid[last], gated: true, counts); + Assert.True(rest.x == rest.y && rest.x > 0.0f && rest.x == density, $"{field.Name}: body at cell {b} with density {density:R}, but the bound over the rest is {rest}"); + Assert.Equal(Enumerable.Range(b, last - b), cells.Skip(cells.Count - (last - b))); + for (var i = 0; i < 64; i++) + { + var slope = tile.PixelSlope(random.Next(tile.N), random.Next(tile.N), random.NextSingle(), random.NextSingle()); + var c = random.Next(b, last); + var z = Uniform(random, grid[c], grid[c + 1]); + foreach (var lod in new[] { false, true }) + { + var pointwise = field.Density(tile, slope, z, lod, counts); + var exact = field.Exact(tile, slope, z, lod); + Assert.True(pointwise == density && exact == density, $"{field.Name}: body from cell {b} claims {density:R}; at slope {slope}, depth {z:R} (cell {c}, lod {lod}) Density is {pointwise:R} and the ungated field {exact:R}"); + } + } + + var ray = tile.PixelSlope(random.Next(tile.N), random.Next(tile.N), random.NextSingle(), random.NextSingle()); + var depth = BodyDepth(field, tile, ray, grid[b], lod: true, counts); + var sum = 0.0; + for (var c = b; c < last; c++) + sum += -Math.Log(Integrate(field, tile, ray, grid[c], grid[c + 1], lod: true, counts)); + Assert.True(Math.Abs(depth - sum) <= 1.0e-4 * sum, $"{field.Name}: the body's depth from cell {b}, BodyDepth {depth:R}, differs from the fixed-step cells' summed depth {sum:R} over cells {b}..{last}"); + } + + output.WriteLine("IV-REPORT analytic body: tiles with a body " + string.Join(", ", bodies.OrderBy(kv => kv.Key).Select(kv => $"{kv.Key} {kv.Value}"))); + Assert.True(bodies.ContainsKey(VoidField.Shipped().Name) && bodies.ContainsKey(VoidField.LodFar().Name), "no body proven at the shipped void or at LOD-far"); + + var scenarios = new (float Warp, Func Make)[] + { + (FogField.AetheriaWarp, w => FogField.HeightFog(w, BoundMode.Interval)), (FogField.AetheriaWarp, w => FogField.InsideFog(w, BoundMode.Interval)), + (FogField.AetheriaWarp, w => FogField.DeepWell(w, BoundMode.Interval)), (FogField.AetheriaWarp, w => FogField.DeepWell(w, BoundMode.Affine)), + (FogField.AetheriaWarp, w => FogField.Wells(w, BoundMode.Interval)), (FogField.AetheriaWarp, w => FogField.Wells(w, BoundMode.Affine)), + (SlabField.SlabWarp, SlabField.Create), + }; + foreach (var (warp, make) in scenarios) + foreach (var w in new[] { 0.0f, warp }) + { + var field = make(w); + for (var t = 0; t < 250; t++) + { + var (_, b, _) = MarchTile(field, field.DrawTile(random, sizes[random.Next(sizes.Length)]), counts); + Assert.True(b < 0, $"{field.Name} warp {w:R}: a body reported at cell {b}"); + } + } + } + + /// + /// The proving ground (docs/cultmath-interval-ground-cut.md, "Pass 3", "Pass 4" and "Pass 5b"). + /// Scenarios (a) height fog and (b) inside the fog under the centred-warp interval bound, (c) the deep + /// well and (c-band) the shallow wells each under the centred-warp interval bound and the affine bound + /// on the same seeds, and (d) r1's uniform slab, each over 64 tiles at N in {1, 4, 8, 16} and warp in + /// {0, D}; (c) and (c-band) also print the range ceiling at N = 8, and no range-mask cell is skipped: the tile march integrates exactly the dense march's + /// cells, so the transmittance agrees within 1e-3 (a difference would be a skipped cell that was not + /// empty), the oracle march (each ray over the oracle mask: the cells whose mid-depth density is nonzero + /// for at least one of the tile's rays) agrees with the dense march exactly, and no (a)-(d) tile reports + /// a body. (e) the void: the grid over hollow radius, camera offset and ramp width (32 tiles at N = 8), + /// LOD-far (32 tiles) and the one shipped void (200 tiles), three marches each, the footprint-aware one + /// taking the analytic body step. Contracts at N = 8: (a) at least 2x combined cost, the lower of warp + /// 0 and D; (c) (ruling affine-wells-contract-cheaper-than-interval) on the deep well the affine + /// bound's combined cost ratio exceeds the centred interval's at warp 0 and at warp D, and, hard + /// (ruling wells-overhead-plus-floor), the pre-pass proves at least half of the oracle-empty cells + /// empty under both bounds at both warps; probe overhead, the efficiency against the oracle and against + /// the range ceiling, the ceilings and the cull fraction are printed, not asserted; (c-band) is + /// printed only; (e) at the shipped void the masked fixed-step march agrees with the reference exactly, the + /// footprint-aware march's optical depth at the body start is off a converged march (h = 0.5, every + /// cell) by at most twice the fixed-step march's error, and it takes at most half the reference's + /// steps per pixel. A broken (c) contract fails the test; a shortfall of the (a) or (e) saving skips + /// naming saving-2x-scenarios and every such shortfall. The fields, the grids and the envelope cost are + /// not tuned toward either. + /// + [Fact] + public void IntervalSkipHalvesEvaluations() + { + var atEight = new Dictionary<(string Key, float Warp), RunStats>(); + var scenarios = new (string Key, float Warp, Func Make)[] + { + ("a", FogField.AetheriaWarp, w => FogField.HeightFog(w, BoundMode.Interval)), + ("b", FogField.AetheriaWarp, w => FogField.InsideFog(w, BoundMode.Interval)), + ("c interval", FogField.AetheriaWarp, w => FogField.DeepWell(w, BoundMode.Interval)), + ("c affine", FogField.AetheriaWarp, w => FogField.DeepWell(w, BoundMode.Affine)), + ("c-band interval", FogField.AetheriaWarp, w => FogField.Wells(w, BoundMode.Interval)), + ("c-band affine", FogField.AetheriaWarp, w => FogField.Wells(w, BoundMode.Affine)), + ("d", SlabField.SlabWarp, SlabField.Create), + }; + foreach (var (key, warp, make) in scenarios) + foreach (var n in new[] { 1, 4, 8, 16 }) + foreach (var w in new[] { 0.0f, warp }) + { + var field = make(w); + var stats = Run(field, n, 64, 0x5A7E + n, range: n == 8 && key.StartsWith('c')); + Report($"{field.Name} N={n} warp={w:R}", stats); + Assert.True(stats.RangeViolations == 0, $"{field.Name} N={n} warp={w:R}: the pre-pass skipped {stats.RangeViolations} cells where a sampled density is positive"); + Assert.True(stats.MaxDifference <= 1.0e-3f, $"{field.Name} N={n} warp={w:R}: transmittance differs by {stats.MaxDifference:R}"); + Assert.True(stats.MaxOracleDifference == 0.0f, $"{field.Name} N={n} warp={w:R}: the oracle march differs from the dense march by {stats.MaxOracleDifference:R}"); + if (key == "d") + output.WriteLine($"IV-REPORT (d) N={n} warp={w:R}: ungated dense snoise/ray {3.0 * stats.PerRay(stats.DenseSteps):F2} (three per dense sample, as r1 counted)"); + if (n == 8) + atEight[(key, w)] = stats; + } + + var warps = new[] { 0.0f, FogField.AetheriaWarp }; + var costA = warps.Min(w => atEight[("a", w)].Ratio); + var cullFloor = double.MaxValue; + var gains = new List(); + var shortfalls = new List(); + var broken = new List(); + foreach (var w in warps) + { + var interval = atEight[("c interval", w)]; + var affine = atEight[("c affine", w)]; + foreach (var (mode, stats) in new[] { ("interval", interval), ("affine", affine) }) + { + Assert.True(stats.CullFraction >= 0.5, $"(c) {mode} warp={w:R}: the pre-pass proves {stats.CullFraction:F3} of the oracle-empty cells empty, under the 0.5 floor (ruling wells-overhead-plus-floor)"); + cullFloor = Math.Min(cullFloor, stats.CullFraction); + } + + var band = (atEight[("c-band interval", w)], atEight[("c-band affine", w)]); + gains.Add($"warp {w:R}: (c) affine {affine.Ratio:F2}x against centred interval {interval.Ratio:F2}x ({affine.Ratio / interval.Ratio:F2}x), probe overhead {affine.ProbeOverhead:F3} and {interval.ProbeOverhead:F3}, " + + $"efficiency {affine.Efficiency:F3} and {interval.Efficiency:F3} against the oracle, {affine.RangeEfficiency:F3} and {interval.RangeEfficiency:F3} against the range ceiling {affine.RangeCeiling:F3}; " + + $"(c-band) {band.Item2.Ratio:F2}x against {band.Item1.Ratio:F2}x ({band.Item2.Ratio / band.Item1.Ratio:F2}x)"); + if (!(affine.Ratio > interval.Ratio)) + broken.Add($"(c) warp {w:R}: affine {affine.Ratio:F2}x is not cheaper than the centred interval's {interval.Ratio:F2}x"); + } + + foreach (var rh in VoidField.HollowRadii) + foreach (var offset in VoidField.CameraOffsets) + foreach (var ramp in VoidField.Ramps) + { + var field = new VoidField(rh, ramp, offset.Fraction, offset.Name); + ReportVoid($"{field.Name} N=8", Run(field, 8, 32, 0x701D, lod: true)); + } + + var lodFar = VoidField.LodFar(); + var far = Run(lodFar, 8, 32, 0x701D, lod: true); + ReportVoid($"{lodFar.Name} N=8 (LOD far)", far); + Assert.True(far.MaxLodDepthError <= 2.0 * far.MaxRefDepthError, $"at LOD-far, the one field where LodStep's footprint branch bites, the footprint-aware march's optical depth is off the converged march's by {far.MaxLodDepthError:G6} relative, more than twice the fixed-step march's {far.MaxRefDepthError:G6}"); + + var shipped = VoidField.Shipped(); + var headline = Run(shipped, 8, 200, 0x5417, lod: true); + ReportVoid($"{shipped.Name} N=8 (headline, 200 tiles)", headline); + Assert.True(headline.MaxDifference == 0.0f, $"the masked fixed-step march differs from the reference by {headline.MaxDifference:R}"); + Assert.True(headline.MaxLodDepthError <= 2.0 * headline.MaxRefDepthError, $"at the body start the footprint-aware march's optical depth is off the converged march's by {headline.MaxLodDepthError:G6} relative, more than twice the fixed-step march's {headline.MaxRefDepthError:G6}"); + var steps = (double)headline.DenseSteps / headline.LodSteps; + + if (costA < 2.0) + shortfalls.Add($"(a) saves {costA:F2}x combined cost, under 2x"); + if (steps < 2.0) + shortfalls.Add($"(e) takes {steps:F2}x fewer steps per pixel at the shipped void, under 2x"); + output.WriteLine($"IV-REPORT contracts at N=8: (a) {costA:F2}x cost (lower of warp 0 and D, at least 2x); (c) affine cheaper than the centred interval at both warps, cull fraction {cullFloor:F3} (at least 0.5 under both bounds, hard); " + + $"(e) {steps:F2}x fewer steps/px, depth error at the body start LOD {headline.MaxLodDepthError:G4} vs fixed-step {headline.MaxRefDepthError:G4} (at most 2x)"); + foreach (var line in gains) + output.WriteLine($"IV-REPORT (c) at N=8, {line}"); + Assert.True(broken.Count == 0, "ruling affine-wells-contract-cheaper-than-interval: " + string.Join("; ", broken)); + if (shortfalls.Count > 0) + Assert.Skip("saving-2x-scenarios: " + string.Join("; ", shortfalls)); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/NoiseGradTests.cs b/packages/cultmath/tests/CultMath.Tests/NoiseGradTests.cs new file mode 100644 index 00000000..3fe922f9 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/NoiseGradTests.cs @@ -0,0 +1,439 @@ +using System; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +public sealed class NoiseGradTests +{ + // ---- Invariant-8 property harness (shared by snoise_grad, fbm_grad, ridged_grad) ---- + // + // Each test compares a function's analytic gradient with central differences of its own .w at + // random points in [-3, 3]^3. eps trades curvature error (eps too large) against float32 + // rounding noise (eps too small). snoise is continuous across simplex-cell boundaries (the + // continuity test below), so no point needs excluding for a seam; ridged_grad excludes a band + // around its own deliberate crease. Each tolerance is at least 5x the largest error the harness + // itself produces at its seed. + private const float PropertyEps = 0.0001f; + private const float SnoiseGradTolerance = 0.03f; + private const float FbmGradTolerance = 0.05f; + private const float RidgedGradTolerance = 0.05f; + + [Fact] + public void SnoiseGradGradientMatchesCentralDifferencesOfItsOwnValue() + { + var random = new System.Random(0xA11CE); + var tested = 0; + var attempts = 0; + while (tested < 200 && attempts < 20000) + { + attempts++; + var p = RandomPoint(random); + var g = math.snoise_grad(p); + float F(float3 q) => math.snoise_grad(q).w; + var fine = CentralDifference(F, p, PropertyEps); + + tested++; + AssertGradientWithinTolerance(fine, g, SnoiseGradTolerance); + } + + Assert.True(tested >= 150, $"only {tested} of {attempts} points were usable"); + } + + [Fact] + public void FbmGradGradientMatchesCentralDifferencesOfItsOwnValue() + { + const int octaves = 4; + const float lacunarity = 2.0f; + const float gain = 0.5f; + var random = new System.Random(0xA11CF); + var tested = 0; + var attempts = 0; + while (tested < 200 && attempts < 40000) + { + attempts++; + var p = RandomPoint(random); + var g = math.fbm_grad(p, octaves, lacunarity, gain); + float F(float3 q) => math.fbm_grad(q, octaves, lacunarity, gain).w; + var fine = CentralDifference(F, p, PropertyEps); + + tested++; + AssertGradientWithinTolerance(fine, g, FbmGradTolerance); + } + + Assert.True(tested >= 150, $"only {tested} of {attempts} points were usable"); + } + + [Fact] + public void RidgedGradGradientMatchesCentralDifferencesExcludingAnyOctavesZeroBand() + { + // ridged_grad's own crease (any octave's n_i = 0) is a real, deliberate discontinuity + // (design.md, "the operator's dune term"), not a numerical artifact: exclude a band around it + // for every octave, the same way cellular excludes its F1 = F2 seam. + const float zeroBand = 0.1f; + const int octaves = 3; + const float lacunarity = 2.0f; + const float gain = 0.5f; + var random = new System.Random(0xA11D0); + var tested = 0; + var attempts = 0; + while (tested < 200 && attempts < 80000) + { + attempts++; + var p = RandomPoint(random); + if (AnyOctaveNearZero(p, octaves, lacunarity, zeroBand)) + continue; + + var g = math.ridged_grad(p, octaves, lacunarity, gain); + float F(float3 q) => math.ridged_grad(q, octaves, lacunarity, gain).w; + var fine = CentralDifference(F, p, PropertyEps); + + tested++; + AssertGradientWithinTolerance(fine, g, RidgedGradTolerance); + } + + Assert.True(tested >= 150, $"only {tested} of {attempts} points were outside the zero band"); + } + + private static bool AnyOctaveNearZero(float3 p, int octaves, float lacunarity, float band) + { + var frequency = 1.0f; + for (var i = 0; i < octaves; i++) + { + if (MathF.Abs(math.snoise_grad(p * frequency).w) < band) + return true; + frequency *= lacunarity; + } + + return false; + } + + private static float3 RandomPoint(System.Random random) => new( + random.NextSingle() * 6.0f - 3.0f, random.NextSingle() * 6.0f - 3.0f, random.NextSingle() * 6.0f - 3.0f); + + private static float3 CentralDifference(Func f, float3 p, float eps) => new( + (f(p + new float3(eps, 0.0f, 0.0f)) - f(p - new float3(eps, 0.0f, 0.0f))) / (2.0f * eps), + (f(p + new float3(0.0f, eps, 0.0f)) - f(p - new float3(0.0f, eps, 0.0f))) / (2.0f * eps), + (f(p + new float3(0.0f, 0.0f, eps)) - f(p - new float3(0.0f, 0.0f, eps))) / (2.0f * eps)); + + private static void AssertGradientWithinTolerance(float3 numeric, float4 analytic, float tolerance) + { + AssertWithinTolerance(numeric.x, analytic.x, tolerance); + AssertWithinTolerance(numeric.y, analytic.y, tolerance); + AssertWithinTolerance(numeric.z, analytic.z, tolerance); + } + + private static void AssertWithinTolerance(float expected, float actual, float tolerance) => + Assert.True(MathF.Abs(expected - actual) <= tolerance, $"expected {expected}, actual {actual}, tolerance {tolerance}"); + + // ---- snoise is continuous across simplex-cell boundaries ---- + + // The simplex corner set (i, i1, i2) summed by snoise(float3), derived the same way snoise does. + private static (float3 i, float3 i1, float3 i2) SimplexCell(float3 p) + { + var i = math.floor(p + math.dot(p, new float3(1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f))); + var x0 = p - i + math.dot(i, new float3(1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f)); + var g = new float3(math.step(x0.y, x0.x), math.step(x0.z, x0.y), 1.0f - math.step(x0.z, x0.x)); + var l = 1.0f - g; + var lzxy = new float3(l.z, l.x, l.y); + return (i, math.min(g, lzxy), math.max(g, lzxy)); + } + + [Fact] + public void SnoiseAndItsGradientAreContinuousAcrossSimplexCellBoundaries() + { + // March random lines in steps of 1e-3 until the corner set changes, bisect the crossing to + // float precision, and compare the two sides. With a kernel radius^2 above 0.5 a lattice + // vertex outside the four summed corners can lie inside the kernel, which leaves a value + // jump at the boundary (stegu/webgl-noise fixed it in 21d9fe23d7); at 0.5 the jump is float + // noise. A value jump below 1e-5 and a gradient jump below 1e-4 is float noise on both sides. + const int lines = 400; + const int maxSteps = 20000; + const float dt = 1.0e-3f; + var random = new System.Random(0x5EA4); + var crossings = 0; + var maxValueJump = 0.0f; + var maxGradientJump = 0.0f; + for (var line = 0; line < lines; line++) + { + var origin = RandomPoint(random); + var direction = math.normalize(new float3( + random.NextSingle() - 0.5f, random.NextSingle() - 0.5f, random.NextSingle() - 0.5f)); + var start = SimplexCell(origin); + var t = 0.0f; + var found = false; + for (var step = 0; step < maxSteps && !found; step++) + { + t += dt; + found = !SimplexCell(origin + direction * t).Equals(start); + } + + Assert.True(found, $"line {line} never left its simplex cell in {maxSteps} steps"); + + double lo = t - dt; + double hi = t; + for (var bisect = 0; bisect < 60; bisect++) + { + var mid = 0.5 * (lo + hi); + if (SimplexCell(origin + direction * (float)mid).Equals(start)) lo = mid; else hi = mid; + } + + var a = math.snoise_grad(origin + direction * (float)lo); + var b = math.snoise_grad(origin + direction * (float)hi); + crossings++; + maxValueJump = MathF.Max(maxValueJump, MathF.Abs(a.w - b.w)); + maxGradientJump = MathF.Max(maxGradientJump, MathF.Max(MathF.Abs(a.x - b.x), MathF.Max(MathF.Abs(a.y - b.y), MathF.Abs(a.z - b.z)))); + } + + Assert.Equal(lines, crossings); + Assert.True(maxValueJump < 1.0e-5f, $"value jump {maxValueJump} across a simplex boundary"); + Assert.True(maxGradientJump < 1.0e-4f, $"gradient jump {maxGradientJump} across a simplex boundary"); + } + + // The simplex diagonals are where x0's three components compare equal. The tie rule must be a total + // order there (math.snoise): with a cyclic or all-strict compare the four corners stop being a + // simplex and the value jumps wherever x0 has three equal components (inputs whose differences y - x and + // z - x are whole numbers, the line (t, t, t) among them): about 0.77 near the origin, up to 1.56 at + // magnitudes of 64 and above. SnoiseTieScopeTests pins the set against the 0.3.0 values. + [Fact] + public void SnoiseIsContinuousOnTheSimplexDiagonal() + { + const int vertices = 160; + const int perVertex = 8; + var random = new System.Random(0x71E5); + var points = new System.Collections.Generic.List(); + for (var k = 0; k < 400; k++) + { + var t = (float)(random.NextDouble() * 128.0 - 64.0); + points.Add(new float3(t, t, t)); + } + + points.Add(new float3(0.0f, 0.0f, 0.0f)); + for (var k = 0; k < vertices; k++) + { + var lx = random.Next(-64, 65); + var ly = random.Next(-64, 65); + var lz = random.Next(-64, 65); + var shift = (lx + ly + lz) / 6.0f; + var v = new float3(lx - shift, ly - shift, lz - shift); + for (var j = 0; j < perVertex; j++) + { + var s = j == 0 ? 0.0f : random.NextSingle(); + points.Add(new float3(v.x + s, v.y + s, v.z + s)); + } + } + + foreach (var p in points) + { + var value = math.snoise(p); + for (var axis = 0; axis < 3; axis++) + { + for (var direction = -1; direction <= 1; direction += 2) + { + var q = p; + for (var ulp = 1; ulp <= 2; ulp++) + { + var component = axis == 0 ? q.x : axis == 1 ? q.y : q.z; + component = direction < 0 ? MathF.BitDecrement(component) : MathF.BitIncrement(component); + q = axis == 0 ? new float3(component, q.y, q.z) : axis == 1 ? new float3(q.x, component, q.z) : new float3(q.x, q.y, component); + var jump = MathF.Abs(math.snoise(q) - value); + Assert.True(jump <= 1.0e-4f, $"snoise jumps {jump} within {ulp} ulp of {p}"); + } + } + } + + var grad = math.snoise_grad(p); + Assert.Equal(BitConverter.SingleToInt32Bits(value), BitConverter.SingleToInt32Bits(grad.w)); + var slope = math.length(new float3(grad.x, grad.y, grad.z)); + Assert.True(slope <= math.SNOISE_LIPSCHITZ, $"|snoise_grad| {slope} exceeds SNOISE_LIPSCHITZ at {p}"); + } + } + + // ---- snoise_grad.w vs snoise ---- + + [Fact] + public void SnoiseGradValueIsBitEqualToSnoise() + { + // Both compute 105 * dot(m4, px) via the exact same operation order (math.cs comment on + // snoise_grad), so this asserts bit equality over 5,000 random points in [-100, 100]^3. + var random = new System.Random(0x50F2); + for (var i = 0; i < 5000; i++) + { + var p = new float3( + random.NextSingle() * 200.0f - 100.0f, random.NextSingle() * 200.0f - 100.0f, random.NextSingle() * 200.0f - 100.0f); + var expected = math.snoise(p); + var actual = math.snoise_grad(p).w; + Assert.Equal(BitConverter.SingleToInt32Bits(expected), BitConverter.SingleToInt32Bits(actual)); + } + } + + // ---- fbm_grad / ridged_grad: per-octave gain and lacunarity ---- + + [Fact] + public void FbmGradWithOneOctaveEqualsSnoiseGrad() + { + var random = new System.Random(0xF6B10); + for (var i = 0; i < 64; i++) + { + var p = RandomPoint(random); + var lacunarity = 1.0f + random.NextSingle() * 3.0f; + var gain = 0.1f + random.NextSingle() * 0.8f; + + var expected = math.snoise_grad(p); + var actual = math.fbm_grad(p, 1, lacunarity, gain); + + Assert.Equal(expected.x, actual.x); + Assert.Equal(expected.y, actual.y); + Assert.Equal(expected.z, actual.z); + Assert.Equal(expected.w, actual.w); + } + } + + [Fact] + public void FbmGradCompoundsGainAndLacunarityPerOctaveNotOnce() + { + // Falsifies two mutant shapes at once: applying gain/lacunarity once for the whole sum + // instead of compounding per octave, and swapping which argument drives amplitude versus + // frequency. lacunarity != gain and both != 1 so a swap changes the result, and 3 octaves + // gives amplitude/frequency three distinct compounded values (1, gain, gain^2 and + // 1, lacunarity, lacunarity^2) so "applied once" mutants cannot coincidentally match. + // The expected value is built by the same incremental multiply chain fbm_grad itself uses + // (frequency *= lacunarity, amplitude *= gain, one step at a time, not lacunarity*lacunarity + // or MathF.Pow), so this asserts bit-exact equality rather than needing a tolerance. + const float lacunarity = 2.5f; + const float gain = 0.6f; + var random = new System.Random(0xF6B11); + for (var i = 0; i < 32; i++) + { + var p = RandomPoint(random); + + var frequency = 1.0f; + var amplitude = 1.0f; + var n0 = math.snoise_grad(p * frequency); + var expectedValue = amplitude * n0.w; + var expectedGradient = amplitude * frequency * new float3(n0.x, n0.y, n0.z); + frequency *= lacunarity; + amplitude *= gain; + + var n1 = math.snoise_grad(p * frequency); + expectedValue += amplitude * n1.w; + expectedGradient += amplitude * frequency * new float3(n1.x, n1.y, n1.z); + frequency *= lacunarity; + amplitude *= gain; + + var n2 = math.snoise_grad(p * frequency); + expectedValue += amplitude * n2.w; + expectedGradient += amplitude * frequency * new float3(n2.x, n2.y, n2.z); + + var actual = math.fbm_grad(p, 3, lacunarity, gain); + + Assert.Equal(expectedValue, actual.w); + Assert.Equal(expectedGradient.x, actual.x); + Assert.Equal(expectedGradient.y, actual.y); + Assert.Equal(expectedGradient.z, actual.z); + } + } + + [Fact] + public void RidgedGradCompoundsGainAndLacunarityPerOctaveNotOnce() + { + // Same construction as FbmGradCompoundsGainAndLacunarityPerOctaveNotOnce, folded: value is + // Sum a_i*(1-|n_i|), gradient is -Sum a_i*f_i*sign(n_i)*grad(n_i) (math.cs comment on + // ridged_grad). p is offset away from the origin and re-tried on a near-zero octave so no + // octave's n_i lands in the fold's own zero band, which would make the closed form's sign() + // ambiguous between runs. + const float lacunarity = 2.5f; + const float gain = 0.6f; + var random = new System.Random(0xF6B12); + var tested = 0; + var attempts = 0; + while (tested < 32 && attempts < 4000) + { + attempts++; + var p = RandomPoint(random); + if (AnyOctaveNearZero(p, 3, lacunarity, 0.1f)) + continue; + tested++; + + var frequency = 1.0f; + var amplitude = 1.0f; + var n0 = math.snoise_grad(p * frequency); + var s0 = (float)MathF.Sign(n0.w); + var expectedValue = amplitude * (1.0f - MathF.Abs(n0.w)); + var expectedGradient = -amplitude * frequency * s0 * new float3(n0.x, n0.y, n0.z); + frequency *= lacunarity; + amplitude *= gain; + + var n1 = math.snoise_grad(p * frequency); + var s1 = (float)MathF.Sign(n1.w); + expectedValue += amplitude * (1.0f - MathF.Abs(n1.w)); + expectedGradient += -amplitude * frequency * s1 * new float3(n1.x, n1.y, n1.z); + frequency *= lacunarity; + amplitude *= gain; + + var n2 = math.snoise_grad(p * frequency); + var s2 = (float)MathF.Sign(n2.w); + expectedValue += amplitude * (1.0f - MathF.Abs(n2.w)); + expectedGradient += -amplitude * frequency * s2 * new float3(n2.x, n2.y, n2.z); + + var actual = math.ridged_grad(p, 3, lacunarity, gain); + + Assert.Equal(expectedValue, actual.w); + Assert.Equal(expectedGradient.x, actual.x); + Assert.Equal(expectedGradient.y, actual.y); + Assert.Equal(expectedGradient.z, actual.z); + } + + Assert.True(tested == 32, $"only {tested} of {attempts} points were outside the zero band"); + } + + // ---- ridged_grad's deliberate crease at n = 0 ---- + + [Fact] + public void RidgedGradOneSidedGradientsAcrossAZeroCrossingDifferInSign() + { + // 1 octave: ridged_grad(p) = 1 - |snoise(p)|, gradient = -sign(snoise(p)) * grad(snoise)(p). + // Bisect along a fixed direction from a random start point to find a tight straddle of a + // snoise zero crossing, then check the two ridged_grad gradients just either side of it point + // in near-opposite directions (their dot product is negative): the crease is real, not a + // numerical accident (design.md, "the operator's dune term"). + var random = new System.Random(0xC2E55); + for (var attempt = 0; attempt < 200; attempt++) + { + var origin = RandomPoint(random); + var direction = new float3(random.NextSingle() - 0.5f, random.NextSingle() - 0.5f, random.NextSingle() - 0.5f); + if (math.length(direction) < 1.0e-3f) + continue; + + float NoiseAt(float t) => math.snoise(origin + direction * t); + + var lo = -3.0f; + var hi = 3.0f; + if (Math.Sign(NoiseAt(lo)) == Math.Sign(NoiseAt(hi))) + continue; + + for (var step = 0; step < 40; step++) + { + var mid = (lo + hi) * 0.5f; + if (Math.Sign(NoiseAt(lo)) == Math.Sign(NoiseAt(mid))) lo = mid; else hi = mid; + } + + // lo and hi now straddle the crossing within about 3 * 2^-40 of parameter t; step off by + // a small margin either side so each sample is cleanly on one side, not exactly on it. + const float margin = 1.0e-4f; + var minusSide = origin + direction * (lo - margin); + var plusSide = origin + direction * (hi + margin); + if (MathF.Sign(NoiseAt(lo - margin)) == MathF.Sign(NoiseAt(hi + margin))) + continue; // margin stepped back across the crossing; try another direction. + + var gradMinus = math.ridged_grad(minusSide, 1, 2.0f, 0.5f); + var gradPlus = math.ridged_grad(plusSide, 1, 2.0f, 0.5f); + var dot = gradMinus.x * gradPlus.x + gradMinus.y * gradPlus.y + gradMinus.z * gradPlus.z; + + Assert.True(dot < 0.0f, $"one-sided gradients did not differ in sign: minus=({gradMinus.x},{gradMinus.y},{gradMinus.z}) plus=({gradPlus.x},{gradPlus.y},{gradPlus.z}) dot={dot}"); + return; + } + + Assert.Fail("did not find a snoise zero crossing to straddle"); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/PhacelleTests.cs b/packages/cultmath/tests/CultMath.Tests/PhacelleTests.cs new file mode 100644 index 00000000..71f5b452 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/PhacelleTests.cs @@ -0,0 +1,340 @@ +using System; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +public sealed class PhacelleTests +{ + // Every tolerance below is at least 5x the largest error the same test measures at its seed. + private const float GradientEps = 1.0e-3f; + private const float GradientTolerance = 5.0e-3f; + private const double ValueTolerance = 1.6e-5; + private const double ThresholdBand = 0.02; + + private static float3 RandomPoint(System.Random random, float extent = 3.0f) => new( + (random.NextSingle() * 2.0f - 1.0f) * extent, (random.NextSingle() * 2.0f - 1.0f) * extent, (random.NextSingle() * 2.0f - 1.0f) * extent); + + // A wave vector of length 2*pi times a stripe frequency in [0.5, 1.5], in a random direction. + private static float3 RandomSide(System.Random random) + { + float3 direction; + do + { + direction = new float3(random.NextSingle() - 0.5f, random.NextSingle() - 0.5f, random.NextSingle() - 0.5f); + } + while (math.length(direction) < 0.1f); + + return math.normalize(direction) * (math.TAU * (0.5f + random.NextSingle())); + } + + // ---- An independent double-precision evaluation: all 64 cells, no prune, no gradient. ---- + // + // It shares only the hash (pcg3d over the integer cell coordinate, top 24 bits) and the constants + // the function is specified by: weight max(0, exp(-2 d^2) - 0.01111), jitter in [-0.5, 0.5). + + private readonly record struct Reference(double Cos, double Sin, double RawLength, double SupportEdgeGap); + + private static Reference Evaluate(float3 p, float3 side, float offset, float normalization) + { + double fx = Math.Floor(p.x), fy = Math.Floor(p.y), fz = Math.Floor(p.z); + double lx = p.x - fx, ly = p.y - fy, lz = p.z - fz; + double sumW = 0.0, sumCos = 0.0, sumSin = 0.0, edgeGap = double.MaxValue; + var supportRadius = Math.Sqrt(Math.Log(1.0 / 0.01111) / 2.0); + for (var dz = -1; dz <= 2; dz++) + for (var dy = -1; dy <= 2; dy++) + for (var dx = -1; dx <= 2; dx++) + { + var hash = math.pcg3d(new int3((int)fx + dx, (int)fy + dy, (int)fz + dz)); + double vx = lx - dx - (math.cellular_unit(hash.x) - 0.5); + double vy = ly - dy - (math.cellular_unit(hash.y) - 0.5); + double vz = lz - dz - (math.cellular_unit(hash.z) - 0.5); + var d2 = vx * vx + vy * vy + vz * vz; + edgeGap = Math.Min(edgeGap, Math.Abs(Math.Sqrt(d2) - supportRadius)); + var w = Math.Max(0.0, Math.Exp(-2.0 * d2) - 0.01111); + var phase = vx * side.x + vy * side.y + vz * side.z + (double)offset * math.TAU; + sumW += w; + sumCos += w * Math.Cos(phase); + sumSin += w * Math.Sin(phase); + } + + double rawCos = sumCos / sumW, rawSin = sumSin / sumW; + var raw = Math.Sqrt(rawCos * rawCos + rawSin * rawSin); + var length = Math.Max(1.0 - normalization, raw); + return new Reference(rawCos / length, rawSin / length, raw, edgeGap); + } + + private static float3 CentralDifference(Func f, float3 p, float eps) => new( + (f(p + new float3(eps, 0.0f, 0.0f)) - f(p - new float3(eps, 0.0f, 0.0f))) / (2.0f * eps), + (f(p + new float3(0.0f, eps, 0.0f)) - f(p - new float3(0.0f, eps, 0.0f))) / (2.0f * eps), + (f(p + new float3(0.0f, 0.0f, eps)) - f(p - new float3(0.0f, 0.0f, eps))) / (2.0f * eps)); + + private static float MaxComponentError(float3 numeric, float4 analytic) => MathF.Max( + MathF.Abs(numeric.x - analytic.x), MathF.Max(MathF.Abs(numeric.y - analytic.y), MathF.Abs(numeric.z - analytic.z))); + + // ---- Value: the function is Johansen's, on 3D cells ---- + + [Theory] + [InlineData(0.0f)] + [InlineData(0.5f)] + [InlineData(0.9f)] + [InlineData(1.0f)] + public void ValueMatchesTheIndependentReferenceAndNormalizesAboveTheThreshold(float normalization) + { + var random = new System.Random(0x7ACE1 + (int)(normalization * 10.0f)); + var maxError = 0.0; + var above = 0; + var below = 0; + for (var i = 0; i < 3000; i++) + { + var p = RandomPoint(random, 40.0f); + var side = RandomSide(random); + var offset = random.NextSingle(); + var actual = math.phacelle(p, side, offset, normalization); + var expected = Evaluate(p, side, offset, normalization); + + maxError = Math.Max(maxError, Math.Max(Math.Abs(actual.cosine.w - expected.Cos), Math.Abs(actual.sine.w - expected.Sin))); + if (expected.RawLength >= 1.0 - normalization + ThresholdBand) + { + // The output magnitude is 1 wherever the raw magnitude reaches 1 - normalization. + above++; + var magnitude = Math.Sqrt((double)actual.cosine.w * actual.cosine.w + (double)actual.sine.w * actual.sine.w); + Assert.True(Math.Abs(magnitude - 1.0) < ValueTolerance, $"magnitude {magnitude} above the threshold at {p}"); + } + else if (expected.RawLength <= 1.0 - normalization - ThresholdBand) + { + below++; + } + } + + Assert.True(maxError < ValueTolerance, $"max value error against the reference {maxError}"); + if (normalization > 0.0f) + Assert.True(above >= 500, $"only {above} points above the threshold"); + if (normalization is > 0.0f and < 1.0f) + Assert.True(below >= 50, $"only {below} points below the threshold"); + } + + [Fact] + public void ValueIsPeriodicInOffsetAndAQuarterCycleRotatesCosIntoSin() + { + // offset is in cycles: a quarter turn maps cos to -sin and sin to cos, and a whole turn is the + // identity. The weights and the normalization do not depend on the phase, so this is exact + // up to float rounding. + var random = new System.Random(0x7ACE2); + for (var i = 0; i < 200; i++) + { + var p = RandomPoint(random); + var side = RandomSide(random); + var offset = random.NextSingle(); + var basePhasor = math.phacelle(p, side, offset, 0.5f); + var quarter = math.phacelle(p, side, offset + 0.25f, 0.5f); + var whole = math.phacelle(p, side, offset + 1.0f, 0.5f); + + Assert.True(MathF.Abs(quarter.cosine.w + basePhasor.sine.w) < 2.0e-5f); + Assert.True(MathF.Abs(quarter.sine.w - basePhasor.cosine.w) < 2.0e-5f); + Assert.True(MathF.Abs(whole.cosine.w - basePhasor.cosine.w) < 2.0e-5f); + Assert.True(MathF.Abs(whole.sine.w - basePhasor.sine.w) < 2.0e-5f); + } + } + + // ---- Invariant 8: the gradient is exact ---- + + [Fact] + public void GradientOfCosAndSinMatchesCentralDifferencesOnBothSidesOfTheNormalizationThreshold() + { + // Above the threshold the output is I / |I|; below it, I / (1 - normalization). The gradient + // is discontinuous where |I| crosses the threshold, and at the edge of each cell's weight support + // (distance 1.49998, where max(0, ...) starts: a jump of 4 d 0.01111 in grad w), so a band + // around each is excluded (by the + // reference's raw length, since the output alone cannot say how close it is). + const float normalization = 0.5f; + var random = new System.Random(0x7ACE3); + var above = 0; + var below = 0; + var maxError = 0.0f; + for (var attempts = 0; attempts < 20000 && (above < 150 || below < 150); attempts++) + { + var p = RandomPoint(random); + var side = RandomSide(random); + var offset = random.NextSingle(); + var reference = Evaluate(p, side, offset, normalization); + var distance = reference.RawLength - (1.0 - normalization); + if (Math.Abs(distance) < ThresholdBand || reference.SupportEdgeGap < 3.0 * GradientEps) + continue; + if (distance > 0.0 ? above >= 150 : below >= 150) + continue; + if (distance > 0.0) above++; else below++; + + var analytic = math.phacelle(p, side, offset, normalization); + var numericCos = CentralDifference(q => math.phacelle(q, side, offset, normalization).cosine.w, p, GradientEps); + var numericSin = CentralDifference(q => math.phacelle(q, side, offset, normalization).sine.w, p, GradientEps); + maxError = MathF.Max(maxError, MathF.Max(MaxComponentError(numericCos, analytic.cosine), MaxComponentError(numericSin, analytic.sine))); + } + + Assert.True(above >= 150 && below >= 150, $"{above} points above and {below} below the threshold"); + Assert.True(maxError < GradientTolerance, $"max gradient error against central differences {maxError}"); + } + + // ---- Stripes run along the flow ---- + + [Fact] + public void OnTheUnitSphereStripesRunAlongTheFlow() + { + // side = cross(p_hat, flow) * 2*pi is tangent to the sphere and perpendicular to the flow, so the + // cosine should change across the stripes (along side) and hardly at all along them (along + // flow). Asura's probe measured 0.212 for this ratio, against 0.202 for the planar upstream. + const float radiusInCells = 10.0f; + var random = new System.Random(0x7ACE4); + var reference = math.normalize(new float3(0.3f, 0.5f, 0.8f)); + var alongFlow = 0.0; + var acrossFlow = 0.0; + var used = 0; + while (used < 2000) + { + var hat = math.normalize(new float3(random.NextSingle() - 0.5f, random.NextSingle() - 0.5f, random.NextSingle() - 0.5f)); + var tangent = reference - hat * math.dot(hat, reference); + if (math.length(tangent) < 0.2f) + continue; + + var flow = math.normalize(tangent); + var sideDirection = math.cross(hat, flow); + var phasor = math.phacelle(hat * radiusInCells, sideDirection * math.TAU, 0.25f, 0.5f); + var gradient = new float3(phasor.cosine.x, phasor.cosine.y, phasor.cosine.z); + alongFlow += Math.Abs(math.dot(gradient, flow)); + acrossFlow += Math.Abs(math.dot(gradient, sideDirection)); + used++; + } + + var ratio = alongFlow / acrossFlow; + Assert.True(ratio <= 0.25, $"mean|d cos/d flow| / mean|d cos/d side| = {ratio}"); + } + + // ---- Continuity ---- + + [Fact] + public void ValueStepDifferenceShrinksTenfoldPerTenfoldStepIncludingAcrossCellPlanes() + { + // Pairs straddle an integer plane on each axis (where the 4x4x4 window moves by one cell and a + // weight that did not vanish at the window edge would jump) and also start at random points. + // Lipschitz continuity means the largest difference over a step scales with the step. + var random = new System.Random(0x7ACE5); + var steps = new[] { 1.0e-3f, 1.0e-4f, 1.0e-5f }; + var maxDifference = new float[steps.Length]; + for (var i = 0; i < 3000; i++) + { + var p = RandomPoint(random); + var side = RandomSide(random); + var offset = random.NextSingle(); + var axis = i % 3; + if (i % 2 == 0) + p = SetAxis(p, axis, MathF.Round(GetAxis(p, axis))); + for (var k = 0; k < steps.Length; k++) + { + var low = math.phacelle(SetAxis(p, axis, GetAxis(p, axis) - steps[k] * 0.5f), side, offset, 0.5f); + var high = math.phacelle(SetAxis(p, axis, GetAxis(p, axis) + steps[k] * 0.5f), side, offset, 0.5f); + maxDifference[k] = MathF.Max(maxDifference[k], MathF.Max(MathF.Abs(low.cosine.w - high.cosine.w), MathF.Abs(low.sine.w - high.sine.w))); + } + } + + Assert.True(maxDifference[1] * 8.0f <= maxDifference[0], $"1e-3: {maxDifference[0]}, 1e-4: {maxDifference[1]}"); + Assert.True(maxDifference[2] * 8.0f <= maxDifference[1], $"1e-4: {maxDifference[1]}, 1e-5: {maxDifference[2]}"); + } + + private static float GetAxis(float3 v, int axis) => axis == 0 ? v.x : axis == 1 ? v.y : v.z; + + private static float3 SetAxis(float3 v, int axis, float value) => + axis == 0 ? new float3(value, v.y, v.z) : axis == 1 ? new float3(v.x, value, v.z) : new float3(v.x, v.y, value); + + // ---- Exact pruning ---- + + [Fact] + public void PrunedOutputIsBitEqualToTheUnprunedSum() + { + var random = new System.Random(0x7ACE6); + for (var i = 0; i < 20000; i++) + { + var p = RandomPoint(random, 50.0f); + var side = RandomSide(random); + var offset = random.NextSingle(); + var normalization = random.NextSingle(); + var pruned = math.phacelle(p, side, offset, normalization); + var unpruned = math.phacelle(p, side, offset, normalization, false); + + AssertBitEqual(unpruned.cosine, pruned.cosine); + AssertBitEqual(unpruned.sine, pruned.sine); + } + } + + // Points next to a cell whose jitter sits at the far corner of its cube: the cell's box bound is + // just under the 2.25 cut (2.2451 to 2.25) while its real distance is still under the support + // radius (d^2 < 2.24995), so its weight is small but nonzero and a prune that cuts even slightly + // low (2.245, 2.24, 2.2) drops a contribution and changes output bits. Random points meet such + // a cell about once in 10^4 evaluations, which is why the random sweep above let those cuts + // through. Each was found once by an offline search (cells K in [-12, 12]^3 whose jitter on one + // axis lies within 0.0008 of the cube face; p is the feature moved 1.4996 out along that axis, + // so |p - feature| = 1.4996 and the bound is about 1.4988). The witness check below re-derives + // that property from the hash, so a change to pcg3d fails loudly instead of degenerating. + // Shared with the HLSL mirror test. + internal static readonly float3[] PruneCutPoints = + { + new(1.77850008f, -2.16020727f, -0.9991166f), + new(1.09346282f, -2.37882328f, -3.00082445f), + new(-6.39144945f, -3.99953747f, -0.610023975f), + new(-0.99940908f, 4.16302729f, 4.07277536f), + new(3.99912024f, 7.21890545f, 1.09053993f), + new(5.43959713f, 1.99937367f, -6.14929914f), + }; + + internal static readonly float3 PruneCutSide = new(2.1f, -3.7f, 1.3f); + internal const float PruneCutOffset = 0.3f; + internal const float PruneCutNormalization = 0.5f; + + // True when some cell of the 4x4x4 window has a box bound in [2.2451, 2.25) and a positive weight. + internal static bool HasCellJustInsideTheCut(float3 p) + { + double fx = Math.Floor(p.x), fy = Math.Floor(p.y), fz = Math.Floor(p.z); + double lx = p.x - fx, ly = p.y - fy, lz = p.z - fz; + for (var dz = -1; dz <= 2; dz++) + for (var dy = -1; dy <= 2; dy++) + for (var dx = -1; dx <= 2; dx++) + { + var gx = Math.Max(0.0, Math.Abs(lx - dx) - 0.5); + var gy = Math.Max(0.0, Math.Abs(ly - dy) - 0.5); + var gz = Math.Max(0.0, Math.Abs(lz - dz) - 0.5); + var bound = gx * gx + gy * gy + gz * gz; + if (bound < 2.2451 || bound >= 2.25) + continue; + + var hash = math.pcg3d(new int3((int)fx + dx, (int)fy + dy, (int)fz + dz)); + double vx = lx - dx - (math.cellular_unit(hash.x) - 0.5); + double vy = ly - dy - (math.cellular_unit(hash.y) - 0.5); + double vz = lz - dz - (math.cellular_unit(hash.z) - 0.5); + if (Math.Exp(-2.0 * (vx * vx + vy * vy + vz * vz)) > 0.01111) + return true; + } + + return false; + } + + [Fact] + public void PrunedOutputIsBitEqualToTheUnprunedSumNextToCellsJustInsideTheCut() + { + foreach (var p in PruneCutPoints) + { + Assert.True(HasCellJustInsideTheCut(p), $"no cell just inside the cut at {p}: the fixture no longer exercises the prune"); + var pruned = math.phacelle(p, PruneCutSide, PruneCutOffset, PruneCutNormalization); + var unpruned = math.phacelle(p, PruneCutSide, PruneCutOffset, PruneCutNormalization, false); + + AssertBitEqual(unpruned.cosine, pruned.cosine); + AssertBitEqual(unpruned.sine, pruned.sine); + } + } + + private static void AssertBitEqual(float4 expected, float4 actual) + { + Assert.Equal(BitConverter.SingleToInt32Bits(expected.x), BitConverter.SingleToInt32Bits(actual.x)); + Assert.Equal(BitConverter.SingleToInt32Bits(expected.y), BitConverter.SingleToInt32Bits(actual.y)); + Assert.Equal(BitConverter.SingleToInt32Bits(expected.z), BitConverter.SingleToInt32Bits(actual.z)); + Assert.Equal(BitConverter.SingleToInt32Bits(expected.w), BitConverter.SingleToInt32Bits(actual.w)); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/SiteArrays.cs b/packages/cultmath/tests/CultMath.Tests/SiteArrays.cs new file mode 100644 index 00000000..b656a874 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/SiteArrays.cs @@ -0,0 +1,160 @@ +using CultMath; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// The shader's site-array functions as C# twins. A shader function cannot take a span, so +/// cultmath_power_border, cultmath_lattice_cell_distance and cultmath_weighted_lattice_cells take +/// float4 sites[CULTMATH_MAX_SITES] and a count; reflection cannot pass a , so each +/// twin takes the array and the count and calls the span function on sites[..count]. This table is the one +/// place that maps them, read by the mirror test and by the GLSL fixture. The draws are the cases both run. +/// +internal static class SiteArrays +{ + /// The shader's default CULTMATH_MAX_SITES; the device families spell their array with it. + internal const int Capacity = 128; + + internal static float4 power_border(float3 p, float4[] sites, int count) => math.power_border(p, sites.AsSpan(0, count)); + + internal static float lattice_cell_distance( + float2 q, float2 cell, float time, float drift, float4[] bodies, int count, float cellSize, float boost, float falloff, + float2 normal, float stretch) => + math.lattice_cell_distance(q, cell, time, drift, bodies.AsSpan(0, count), cellSize, boost, falloff, normal, stretch); + + internal static float4 weighted_lattice_cells( + float2 p, float time, float4[] bodies, int count, float cellSize, float drift, float boost, float falloff, + float smoothing, float2 stretchNormal, float stretch) => + math.weighted_lattice_cells(p, time, bodies.AsSpan(0, count), cellSize, drift, boost, falloff, smoothing, stretchNormal, stretch); + + // The array the shader receives: the sites, then filler a loop running past the count would read. The filler is + // finite and large, so a loop bound that ignores the count changes the result. + private static float4[] Padded(IReadOnlyList sites) + { + var array = new float4[Capacity]; + for (var i = 0; i < Capacity; i++) + array[i] = i < sites.Count ? sites[i] : new float4(40.0f * (i + 1), -30.0f * (i + 1), 7.0f, 90.0f + i); + return array; + } + + private static float Uniform(System.Random r, float lo, float hi) => lo + (hi - lo) * r.NextSingle(); + + // Counts 0, 1, 6, 16 and the capacity are drawn often; the rest of [0, Capacity] fills between. + private static int Count(System.Random r) => r.Next(3) == 0 ? r.Next(Capacity + 1) : new[] { 0, 1, 6, 16, Capacity }[r.Next(5)]; + + // Bodies on slow orbits (float4(position.xy, 0, sigma)), spread over the plane the lattice cells cover. + private static float4[] Orbit(System.Random r, int count, float time) + { + var bodies = new List(); + for (var i = 0; i < count; i++) + { + var angle = 0.001f * (i + 1) * time + i; + var radius = 100.0f + 2400.0f * r.NextSingle(); + bodies.Add(new float4(radius * MathF.Cos(angle), radius * MathF.Sin(angle), 0.0f, Uniform(r, 20.0f, 300.0f))); + } + + return Padded(bodies); + } + + internal static object[] PowerBorderArguments(System.Random r) + { + var count = Count(r); + var sites = new List(); + for (var i = 0; i < count; i++) + sites.Add(new float4(Uniform(r, -1500.0f, 1500.0f), Uniform(r, -1500.0f, 1500.0f), Uniform(r, -200.0f, 200.0f), Uniform(r, 10.0f, 300.0f))); + return new object[] { new float3(Uniform(r, -1500.0f, 1500.0f), Uniform(r, -1500.0f, 1500.0f), Uniform(r, -200.0f, 200.0f)), Padded(sites), count }; + } + + internal static object[] LatticeCellDistanceArguments(System.Random r) + { + var angle = Uniform(r, 0.0f, 6.2831855f); + var look = LatticeCellsTests.Looks[r.Next(LatticeCellsTests.Looks.Length)]; + var cell = new float2(r.Next(-300, 300), r.Next(-300, 300)); + var count = Count(r); + return new object[] + { + new float2(Uniform(r, -1500.0f, 1500.0f), Uniform(r, -1500.0f, 1500.0f)) / LatticeCellsTests.Cell, cell, Uniform(r, 0.0f, 200.0f), LatticeCellsTests.Drift, + Orbit(r, count, Uniform(r, 0.0f, 200.0f)), count, LatticeCellsTests.Cell, look.Boost, look.Falloff, new float2(MathF.Cos(angle), MathF.Sin(angle)), look.Stretch, + }; + } + + // The unit-less normals the function normalises itself: ordinary, 3-4-5, tiny, huge, and zero (stretch 1 only). + private static readonly float2[] Normals = { LatticeCellsTests.Normal, new(3.0f, 4.0f), new(3.0e-30f, -4.0e-30f), new(1.0e30f, 2.0e30f), new(0.0f, 0.0f) }; + + internal static readonly LatticeCellsTests.Look WidestLook = new(LatticeMaxBoost, LatticeMaxStretch, LatticeMaxSmoothing, 1.0e6f); + + /// + /// Points whose ring search runs to ring 8 or past it under the widest look (boost, stretch and smoothing at their + /// maxima, falloff so wide that every cell is boosted), found once by the radius the exit rule visits, and the + /// ring-17 point of LatticeCellsTests.TheCapIsReachedAndMatchesTheFullBox first. Each is (p, time). + /// + internal static readonly IReadOnlyList<(float2 P, float Time, int Ring)> FarPoints = FindFarPoints(); + + private static List<(float2, float, int)> FindFarPoints() + { + var found = new List<(float2, float, int)>(); + var cap = (new float2(1446.7345f, -680.7637f), 97.69269f); + found.Add((cap.Item1, cap.Item2, LatticeCellsTests.Radius(cap.Item1, cap.Item2, LatticeCellsTests.Bodies(cap.Item2), WidestLook, LatticeCellsTests.Rules[0].stop, new Dictionary<(int, int), float>()))); + var r = new System.Random(0x1A77); + while (found.Count < 12) + { + var p = LatticeCellsTests.RandomPoint(r); + var time = 13.0f * r.Next(20); + var ring = LatticeCellsTests.Radius(p, time, LatticeCellsTests.Bodies(time), WidestLook, LatticeCellsTests.Rules[0].stop, new Dictionary<(int, int), float>()); + if (ring >= 8) + found.Add((p, time, ring)); + } + + return found; + } + + /// + /// Points where an exit one ring early (the rule "bound 0.5*k") returns another result than the exact search, found once by + /// running both on the six orbiting bodies under each look: the cases that pin the ring exit to the bit. + /// + internal static readonly IReadOnlyList<(float2 P, float Time, LatticeCellsTests.Look Look)> ExitBoundPoints = FindExitBoundPoints(); + + private static List<(float2, float, LatticeCellsTests.Look)> FindExitBoundPoints() + { + var found = new List<(float2, float, LatticeCellsTests.Look)>(); + var looks = LatticeCellsTests.Looks.Append(WidestLook).ToArray(); + var r = new System.Random(0xE517); + while (found.Count < 24) + { + var p = LatticeCellsTests.RandomPoint(r); + var time = 13.0f * r.Next(20); + var look = looks[r.Next(looks.Length)]; + var bodies = LatticeCellsTests.Bodies(time); + var early = LatticeCellsTests.Radius(p, time, bodies, look, LatticeCellsTests.Rules[2].stop, new Dictionary<(int, int), float>()); + if (early >= LatticeCellsTests.Radius(p, time, bodies, look, LatticeCellsTests.Rules[0].stop, new Dictionary<(int, int), float>())) + continue; + if (!LatticeCellsTests.BoxFold(p, time, bodies, look, Math.Max(0, early), new Dictionary<(int, int), float>()).Equals(LatticeCellsTests.Call(p, time, bodies, look))) + found.Add((p, time, look)); + } + + return found; + } + + internal static object[] LatticeArguments(System.Random r) + { + switch (r.Next(4)) + { + case 0: + var far = FarPoints[r.Next(FarPoints.Count)]; + return Lattice(far.P, far.Time, Padded(LatticeCellsTests.Bodies(far.Time)), 6, WidestLook, LatticeCellsTests.Normal); + case 1: + var tight = ExitBoundPoints[r.Next(ExitBoundPoints.Count)]; + return Lattice(tight.P, tight.Time, Padded(LatticeCellsTests.Bodies(tight.Time)), 6, tight.Look, LatticeCellsTests.Normal); + } + + var time = 13.0f * r.Next(20); + var normal = Normals[r.Next(Normals.Length)]; + var look = normal.x == 0.0f ? LatticeCellsTests.Looks[0] : LatticeCellsTests.Looks[r.Next(LatticeCellsTests.Looks.Length)]; + var count = Count(r); + return Lattice(LatticeCellsTests.RandomPoint(r), time, Orbit(r, count, time), count, look, normal); + } + + private static object[] Lattice(float2 p, float time, float4[] bodies, int count, LatticeCellsTests.Look look, float2 normal) => + new object[] { p, time, bodies, count, LatticeCellsTests.Cell, LatticeCellsTests.Drift, + look.Boost, look.Falloff, look.Smoothing, normal, look.Stretch }; +} diff --git a/packages/cultmath/tests/CultMath.Tests/SiteCellsTests.cs b/packages/cultmath/tests/CultMath.Tests/SiteCellsTests.cs new file mode 100644 index 00000000..432d669f --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/SiteCellsTests.cs @@ -0,0 +1,517 @@ +using Xunit; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// The site cells (power and multiplicative scores, the fold, the border), the Gabriel margin and gate, and the +/// out-free segment distance. Every reference is written here in double from the site data, never by calling the +/// function under test. +/// +public sealed class SiteCellsTests +{ + private static float4[] RandomSites(System.Random r, int max) + { + var count = r.Next(max + 1); + var sites = new float4[count]; + for (var i = 0; i < count; i++) + { + sites[i] = i > 0 && r.Next(4) == 0 + ? sites[r.Next(i)] + : new float4(Span(r, 10.0f), Span(r, 10.0f), Span(r, 10.0f), 0.5f + 2.5f * r.NextSingle()); + } + + return sites; + } + + private static float Span(System.Random r, float extent) => (r.NextSingle() * 2.0f - 1.0f) * extent; + + private static float3 Point(System.Random r) => new(Span(r, 10.0f), Span(r, 10.0f), Span(r, 10.0f)); + + private static double PowerReference(float3 p, float4 s) + { + double dx = (double)p.x - s.x, dy = (double)p.y - s.y, dz = (double)p.z - s.z; + return dx * dx + dy * dy + dz * dz - (double)s.w * s.w; + } + + private static double MultiplicativeReference(float3 p, float4 s) + { + double dx = (double)p.x - s.x, dy = (double)p.y - s.y, dz = (double)p.z - s.z; + return Math.Sqrt(dx * dx + dy * dy + dz * dz) / s.w; + } + + // Checks cells against the stable (score, index) order of a double reference. A pair whose reference scores + // differ by less than a float's resolution may legitimately order either way, so such a pair is skipped; an + // exact tie (a duplicated site) is compared. + private static int CheckFold(CultSiteCells cells, double[] reference) + { + var order = Enumerable.Range(0, reference.Length).OrderBy(i => reference[i]).ThenBy(i => i).ToArray(); + if (order.Length < 2) + { + Assert.Equal(-1.0f, cells.secondSite); + Assert.Equal(1.0e30f, cells.second.w); + } + + if (order.Length < 1) + { + Assert.Equal(-1.0f, cells.nearestSite); + Assert.Equal(1.0e30f, cells.nearest.w); + return 0; + } + + bool Clear(int a, int b) => reference[a] == reference[b] || Math.Abs(reference[b] - reference[a]) > 1.0e-4 * (1.0 + Math.Abs(reference[b])); + if (order.Length >= 2 && !Clear(order[0], order[1])) + return 0; + Assert.Equal((float)order[0], cells.nearestSite); + if (order.Length < 2 || (order.Length > 2 && !Clear(order[1], order[2]))) + return 1; + Assert.Equal((float)order[1], cells.secondSite); + return 1; + } + + [Fact] + public void PowerAndMultiplicativeCellsAreTheTwoSmallestScoresInIndexOrder() + { + var r = new System.Random(0x517E); + var checkedSpans = 0; + for (var n = 0; n < 4000; n++) + { + var sites = RandomSites(r, 12); + var p = Point(r); + checkedSpans += CheckFold(power_cells(p, sites), sites.Select(s => PowerReference(p, s)).ToArray()); + checkedSpans += CheckFold(multiplicative_cells(p, sites), sites.Select(s => MultiplicativeReference(p, s)).ToArray()); + } + + Assert.True(checkedSpans > 5000, $"only {checkedSpans} spans were comparable"); + } + + [Fact] + public void ExactTiesKeepTheLowerIndexFirst() + { + var site = new float4(1.0f, 2.0f, 3.0f, 1.5f); + var sites = new[] { site, site, site }; + var cells = power_cells(new float3(0.0f, 0.0f, 0.0f), sites); + Assert.Equal(0.0f, cells.nearestSite); + Assert.Equal(1.0f, cells.secondSite); + } + + // TN2: for power scores F2 - F1 is affine, so site_cells_border is the distance to the bisector plane of the + // two winners {x : |x - s1|^2 - w1^2 = |x - s2|^2 - w2^2}, computed here in double. That is not the distance + // to the nearest site's cell boundary (PowerBorderIsTheLeastRadicalPlaneDistance). + [Fact] + public void SiteCellsBorderIsTheDistanceToTheWinnersBisector() + { + var r = new System.Random(0xB0DE); + var compared = 0; + for (var n = 0; n < 3000; n++) + { + var sites = RandomSites(r, 8); + if (sites.Length < 3) + continue; + var p = Point(r); + var reference = sites.Select(s => PowerReference(p, s)).ToArray(); + var order = Enumerable.Range(0, sites.Length).OrderBy(i => reference[i]).ThenBy(i => i).ToArray(); + if (reference[order[1]] - reference[order[0]] < 1.0e-2 || reference[order[2]] - reference[order[1]] < 1.0e-2) + continue; + var (a, b) = (sites[order[0]], sites[order[1]]); + double nx = 2.0 * ((double)a.x - b.x), ny = 2.0 * ((double)a.y - b.y), nz = 2.0 * ((double)a.z - b.z); + var norm = Math.Sqrt(nx * nx + ny * ny + nz * nz); + if (norm < 1.0e-2) + continue; + var expected = (reference[order[1]] - reference[order[0]]) / norm; + + var border = site_cells_border(power_cells(p, sites)); + Assert.InRange(border.w, expected - 1.0e-4 * expected - 1.0e-3, expected + 1.0e-4 * expected + 1.0e-3); + // F2 - F1 grows toward the nearest site: the normal is (s1 - s2) / |s1 - s2|. + Assert.InRange(border.x, nx / norm - 1.0e-3, nx / norm + 1.0e-3); + Assert.InRange(border.y, ny / norm - 1.0e-3, ny / norm + 1.0e-3); + Assert.InRange(border.z, nz / norm - 1.0e-3, nz / norm + 1.0e-3); + compared++; + } + + Assert.True(compared > 1000, $"only {compared} borders were comparable"); + } + + [Fact] + public void BorderIsEmptyWithoutASecondSite() + { + var one = power_cells(new float3(1.0f, 2.0f, 3.0f), new[] { new float4(0.0f, 0.0f, 0.0f, 1.0f) }); + Assert.Equal(new float4(0.0f, 0.0f, 0.0f, 1.0e30f), site_cells_border(one)); + Assert.Equal(new float4(0.0f, 0.0f, 0.0f, 1.0e30f), site_cells_border(site_cells_empty())); + } + + // Two sites with weights w1 != w2: the border |p - s1| / w1 = |p - s2| / w2 is the Apollonius circle, centre + // (w1^2 s2 - w2^2 s1) / (w1^2 - w2^2), radius w1 w2 |s1 - s2| / |w1^2 - w2^2| (built in double). On it the + // multiplicative border distance vanishes; off it the distance is nonzero. + [Fact] + public void MultiplicativeBorderVanishesOnTheApolloniusCircle() + { + var r = new System.Random(0xA9011); + for (var n = 0; n < 300; n++) + { + var s1 = new float4(Span(r, 5.0f), Span(r, 5.0f), 0.0f, 1.0f + 2.0f * r.NextSingle()); + var s2 = new float4(Span(r, 5.0f), Span(r, 5.0f), 0.0f, 1.0f + 2.0f * r.NextSingle()); + double w1 = s1.w, w2 = s2.w, k = w1 * w1 - w2 * w2; + double sep = Math.Sqrt(Math.Pow((double)s1.x - s2.x, 2) + Math.Pow((double)s1.y - s2.y, 2)); + if (Math.Abs(k) < 0.5 || sep < 1.0) + continue; + double cx = (w1 * w1 * s2.x - w2 * w2 * s1.x) / k, cy = (w1 * w1 * s2.y - w2 * w2 * s1.y) / k; + var radius = w1 * w2 * sep / Math.Abs(k); + if (radius > 50.0) + continue; + + var sites = new[] { s1, s2 }; + var angle = r.NextDouble() * 2.0 * Math.PI; + var on = new float3((float)(cx + radius * Math.Cos(angle)), (float)(cy + radius * Math.Sin(angle)), 0.0f); + var onBorder = site_cells_border(multiplicative_cells(on, sites)); + Assert.True(Math.Abs(onBorder.w) < 1.0e-3 * radius + 1.0e-3, $"on the circle: {onBorder.w}"); + + var off = new float3((float)(cx + 1.5 * radius * Math.Cos(angle)), (float)(cy + 1.5 * radius * Math.Sin(angle)), 0.0f); + var offBorder = site_cells_border(multiplicative_cells(off, sites)); + Assert.True(Math.Abs(offBorder.w) > 1.0e-2 * radius, $"off the circle: {offBorder.w}"); + } + } + + // Central differences in double of each score's value against the returned gradient. + [Fact] + public void ScoreGradientsAreAnalytic() + { + var r = new System.Random(0x6AAD); + const double h = 1.0e-3; + for (var n = 0; n < 500; n++) + { + var site = RandomSites(r, 1).FirstOrDefault(new float4(1.0f, -2.0f, 0.5f, 1.5f)); + var p = Point(r); + if (Math.Abs(p.x - site.x) + Math.Abs(p.y - site.y) + Math.Abs(p.z - site.z) < 1.0f) + continue; + foreach (var (score, reference) in new (Func, Func)[] { (power_score, PowerReference), (multiplicative_score, MultiplicativeReference) }) + { + var got = score(p, site); + var axes = new[] { new float3((float)h, 0.0f, 0.0f), new float3(0.0f, (float)h, 0.0f), new float3(0.0f, 0.0f, (float)h) }; + var expected = axes.Select(a => (reference(p + a, site) - reference(p - a, site)) / (2.0 * h)).ToArray(); + var scale = 1.0 + Math.Abs(expected[0]) + Math.Abs(expected[1]) + Math.Abs(expected[2]); + Assert.True(Math.Abs(got.x - expected[0]) < 2.0e-3 * scale, "x"); + Assert.True(Math.Abs(got.y - expected[1]) < 2.0e-3 * scale, "y"); + Assert.True(Math.Abs(got.z - expected[2]) < 2.0e-3 * scale, "z"); + Assert.Equal(reference(p, site), got.w, 1.0e-3 * (1.0 + Math.Abs(got.w))); + } + } + } + + [Fact] + public void MultiplicativeGradientIsZeroAtTheSite() + { + var site = new float4(1.0f, 2.0f, 3.0f, 2.0f); + var score = multiplicative_score(new float3(1.0f, 2.0f, 3.0f), site); + Assert.Equal(new float4(0.0f, 0.0f, 0.0f, 0.0f), score); + } + + private static double MarginReference(float4 a, float4 b, float4 o) + { + double mx = ((double)a.x + b.x) / 2, my = ((double)a.y + b.y) / 2, mz = ((double)a.z + b.z) / 2; + var rr = Math.Sqrt(Math.Pow((double)a.x - b.x, 2) + Math.Pow((double)a.y - b.y, 2) + Math.Pow((double)a.z - b.z, 2)) / 2; + var d = Math.Sqrt(Math.Pow(o.x - mx, 2) + Math.Pow(o.y - my, 2) + Math.Pow(o.z - mz, 2)); + return (d - rr) / rr; + } + + private static double SmoothstepReference(double lo, double hi, double x) + { + var t = Math.Clamp((x - lo) / (hi - lo), 0.0, 1.0); + return t * t * (3.0 - 2.0 * t); + } + + [Fact] + public void SoftGabrielGateFollowsTheEmptyDiscMargin() + { + var a = new float4(-2.0f, 0.0f, 0.0f, 1.0f); + var b = new float4(2.0f, 0.0f, 0.0f, 1.0f); + // On the diameter circle (radius 2 about the origin): margin 0, gate 0.5. At half radius: margin -0.5, gate 0. + Assert.Equal(0.5f, soft_gabriel_gate(new[] { a, b, new float4(0.0f, 2.0f, 0.0f, 1.0f) }, 0, 1, 0.15f), 6); + Assert.Equal(0.0f, soft_gabriel_gate(new[] { a, b, new float4(0.0f, 1.0f, 0.0f, 1.0f) }, 0, 1, 0.15f)); + Assert.Equal(1.0f, soft_gabriel_gate(new[] { a, b }, 0, 1, 0.15f)); + + var r = new System.Random(0x6ABE); + for (var n = 0; n < 500; n++) + { + var sites = RandomSites(r, 9); + if (sites.Length < 3 || sites[0].Equals(sites[1])) + continue; + var first = r.Next(sites.Length); + var second = (first + 1 + r.Next(sites.Length - 1)) % sites.Length; + var softness = 0.05f + 0.5f * r.NextSingle(); + var margin = Enumerable.Range(0, sites.Length).Where(k => k != first && k != second).Min(k => MarginReference(sites[first], sites[second], sites[k])); + if (!double.IsFinite(margin)) + continue; + Assert.Equal(SmoothstepReference(-softness, softness, margin), soft_gabriel_gate(sites, first, second, softness), 1.0e-3); + } + + // Continuity: a tiny radial step of a third site moves the gate by a small share of the softness band. + var prev = soft_gabriel_gate(new[] { a, b, new float4(0.0f, 1.8f, 0.0f, 1.0f) }, 0, 1, 0.3f); + for (var y = 1.8f; y < 2.2f; y += 0.001f) + { + var gate = soft_gabriel_gate(new[] { a, b, new float4(0.0f, y, 0.0f, 1.0f) }, 0, 1, 0.3f); + Assert.True(Math.Abs(gate - prev) < 0.01f, $"step at y={y}"); + prev = gate; + } + } + + [Fact] + public void SpanFunctionsRefuseBadInputsWithoutEchoingThem() + { + var good = new float4(0.0f, 0.0f, 0.0f, 1.0f); + var marker = 12345.678f; + foreach (var weight in new[] { 0.0f, -marker, float.NaN, float.PositiveInfinity }) + { + var e = Assert.Throws(() => multiplicative_cells(default, new[] { good, new float4(1.0f, 1.0f, 1.0f, weight) })); + Assert.Equal("sites", e.ParamName); + Assert.DoesNotContain("12345", e.Message); + } + + foreach (var weight in new[] { float.NaN, float.PositiveInfinity, float.NegativeInfinity }) + Assert.Equal("sites", Assert.Throws(() => power_cells(default, new[] { good, new float4(1.0f, 1.0f, 1.0f, weight) })).ParamName); + + var three = new[] { good, new float4(1.0f, 0.0f, 0.0f, 1.0f), new float4(0.0f, 1.0f, 0.0f, 1.0f) }; + Assert.Equal("second", Assert.Throws(() => soft_gabriel_gate(three, 1, 1, 0.1f)).ParamName); + Assert.Equal("first", Assert.Throws(() => soft_gabriel_gate(three, -1, 1, 0.1f)).ParamName); + Assert.Equal("second", Assert.Throws(() => soft_gabriel_gate(three, 0, 3, 0.1f)).ParamName); + foreach (var softness in new[] { 0.0f, -marker, float.NaN, float.PositiveInfinity }) + { + var e = Assert.Throws(() => soft_gabriel_gate(three, 0, 1, softness)); + Assert.Equal("softness", e.ParamName); + Assert.DoesNotContain("12345", e.Message); + } + } + + [Fact] + public void OutFreeDistanceToSegmentEqualsTheOutForm() + { + var r = new System.Random(0x5E61); + for (var n = 0; n < 2000; n++) + { + var p = new float2(Span(r, 5.0f), Span(r, 5.0f)); + var start = new float2(Span(r, 5.0f), Span(r, 5.0f)); + var end = r.Next(8) == 0 ? start : new float2(Span(r, 5.0f), Span(r, 5.0f)); + var outForm = distance_to_segment(p, start, end, out var closest); + Assert.Equal(BitConverter.SingleToInt32Bits(outForm), BitConverter.SingleToInt32Bits(distance_to_segment(p, start, end))); + Assert.Equal(distance(p, closest), outForm); + double sx = (double)end.x - start.x, sy = (double)end.y - start.y, qx = (double)p.x - start.x, qy = (double)p.y - start.y; + var t2 = sx * sx + sy * sy > 0.0 ? Math.Clamp((qx * sx + qy * sy) / (sx * sx + sy * sy), 0.0, 1.0) : 0.0; + var expected2 = Math.Sqrt(Math.Pow(qx - t2 * sx, 2) + Math.Pow(qy - t2 * sy, 2)); + Assert.Equal(expected2, outForm, 1.0e-4 * (1.0 + expected2)); + + var p3 = new float3(Span(r, 5.0f), Span(r, 5.0f), Span(r, 5.0f)); + var a3 = new float3(Span(r, 5.0f), Span(r, 5.0f), Span(r, 5.0f)); + var b3 = r.Next(8) == 0 ? a3 : new float3(Span(r, 5.0f), Span(r, 5.0f), Span(r, 5.0f)); + var got = distance_to_segment(p3, a3, b3); + if (a3.Equals(b3)) + { + Assert.Equal(distance(p3, a3), got); + continue; + } + + double ex = (double)b3.x - a3.x, ey = (double)b3.y - a3.y, ez = (double)b3.z - a3.z; + double px = (double)p3.x - a3.x, py = (double)p3.y - a3.y, pz = (double)p3.z - a3.z; + var t = Math.Clamp((px * ex + py * ey + pz * ez) / (ex * ex + ey * ey + ez * ez), 0.0, 1.0); + var expected = Math.Sqrt(Math.Pow(px - t * ex, 2) + Math.Pow(py - t * ey, 2) + Math.Pow(pz - t * ez, 2)); + Assert.Equal(expected, got, 1.0e-4 * (1.0 + expected)); + } + } + + // The cell of the owner is the intersection of the half-spaces of its radical planes. Reference in double, + // written here: x.d = c with d = s2 - s1, c = (|s2|^2 - |s1|^2 + w1^2 - w2^2) / 2, signed distance (c - p.d) / |d|. + private static (double Distance, double[] Normal) CellBoundary(float3 p, float4[] sites, int owner) + { + var best = double.PositiveInfinity; + var normal = new double[3]; + var s1 = new[] { (double)sites[owner].x, sites[owner].y, sites[owner].z }; + var q = new[] { (double)p.x, p.y, p.z }; + for (var k = 0; k < sites.Length; k++) + { + var s2 = new[] { (double)sites[k].x, sites[k].y, sites[k].z }; + var d = new[] { s2[0] - s1[0], s2[1] - s1[1], s2[2] - s1[2] }; + var dd = d[0] * d[0] + d[1] * d[1] + d[2] * d[2]; + if (k == owner || dd == 0.0) + continue; + double w1 = sites[owner].w, w2 = sites[k].w; + var c = (s2.Sum(v => v * v) - s1.Sum(v => v * v) + w1 * w1 - w2 * w2) / 2.0; + var distance = (c - (q[0] * d[0] + q[1] * d[1] + q[2] * d[2])) / Math.Sqrt(dd); + if (distance < best) + { + best = distance; + normal = new[] { -d[0] / Math.Sqrt(dd), -d[1] / Math.Sqrt(dd), -d[2] / Math.Sqrt(dd) }; + } + } + + return (best, normal); + } + + // Spans with duplicated sites, zero weights, collinear sites and single-site spans. + private static float4[] AwkwardSites(System.Random r) + { + var count = 1 + r.Next(9); + var collinear = r.Next(5) == 0; + var sites = new float4[count]; + for (var i = 0; i < count; i++) + { + var weight = r.Next(5) == 0 ? 0.0f : 0.5f + 2.5f * r.NextSingle(); + sites[i] = i > 0 && r.Next(4) == 0 ? sites[r.Next(i)] + : collinear ? new float4(Span(r, 10.0f), 0.0f, 0.0f, weight) + : new float4(Span(r, 10.0f), Span(r, 10.0f), Span(r, 10.0f), weight); + } + + return sites; + } + + [Fact] + public void PowerBorderIsTheLeastRadicalPlaneDistance() + { + var r = new System.Random(0xCE11); + var finite = 0; + var unbounded = 0; + for (var n = 0; n < 6000; n++) + { + var sites = AwkwardSites(r); + var p = Point(r); + var reference = sites.Select(s => PowerReference(p, s)).ToArray(); + var order = Enumerable.Range(0, sites.Length).OrderBy(i => reference[i]).ThenBy(i => i).ToArray(); + if (order.Length > 1 && reference[order[1]] - reference[order[0]] < 1.0e-2 && reference[order[1]] != reference[order[0]]) + continue; + var (distance, normal) = CellBoundary(p, sites, order[0]); + var border = power_border(p, sites); + if (double.IsPositiveInfinity(distance)) + { + Assert.Equal(1.0e30f, border.w); + unbounded++; + continue; + } + + Assert.InRange(border.w, distance - 1.0e-4 * Math.Abs(distance) - 1.0e-4, distance + 1.0e-4 * Math.Abs(distance) + 1.0e-4); + finite++; + // The normal is the minimising plane's, pointing into the cell, when that plane is clear of the rest. + var others = Enumerable.Range(0, sites.Length).Where(k => k != order[0]).Select(k => CellBoundary(p, new[] { sites[order[0]], sites[k] }, 0).Distance).Where(v => !double.IsPositiveInfinity(v)).OrderBy(v => v).ToArray(); + if (others.Length > 1 && others[1] - others[0] > 1.0e-2) + { + Assert.InRange(border.x, normal[0] - 1.0e-3, normal[0] + 1.0e-3); + Assert.InRange(border.y, normal[1] - 1.0e-3, normal[1] + 1.0e-3); + Assert.InRange(border.z, normal[2] - 1.0e-3, normal[2] + 1.0e-3); + } + } + + Assert.True(finite > 2500 && unbounded > 50, $"{finite} bounded and {unbounded} unbounded cells were compared"); + } + + [Fact] + public void ADuplicateOfTheOwnerLeavesTheCellBorderToTheOtherSites() + { + var a = new float4(0.0f, 0.0f, 0.0f, 1.0f); + var far = new float4(10.0f, 0.0f, 0.0f, 1.0f); + // p is nearer the owner's duplicate than anything else: the duplicate is the second-nearest site. + var border = power_border(new float3(1.0f, 0.0f, 0.0f), new[] { a, a, far }); + Assert.Equal(4.0f, border.w, 1.0e-4f); + Assert.Equal(-1.0f, border.x, 1.0e-5f); + // Only coincident sites: the cell has no bounding plane. + Assert.Equal(1.0e30f, power_border(new float3(1.0f, 0.0f, 0.0f), new[] { a, a }).w); + Assert.Equal(1.0e30f, power_border(new float3(1.0f, 0.0f, 0.0f), new[] { a }).w); + Assert.Equal(1.0e30f, power_border(new float3(1.0f, 0.0f, 0.0f), ReadOnlySpan.Empty).w); + } + + // Close sites seen from a far query: the plane distance must not cancel (the old gradient-difference form + // had 1.5e-4 relative error at this geometry and 3.5e-3 at coordinates near 1e4). + [Theory] + [InlineData(0.0f)] + [InlineData(10000.0f)] + public void PowerBorderKeepsItsPrecisionForCloseSitesAndAFarQuery(float shift) + { + var sites = new[] { new float4(shift - 1.453f, shift + 1.986f, 0.0f, 13.085f), new float4(shift - 1.539f, shift + 2.103f, 0.0f, 5.113f) }; + var p = new float3(shift - 154.2f, shift + 188.9f, 0.0f); + var expected = CellBoundary(p, sites, (int)power_cells(p, sites).nearestSite).Distance; + Assert.True(expected > 100.0); + Assert.InRange(power_border(p, sites).w, expected * (1.0 - 1.0e-5), expected * (1.0 + 1.0e-5)); + } + + [Fact] + public void CoincidentGabrielPairHasMarginMinusOne() + { + var a = new float3(1.0f, 2.0f, 3.0f); + foreach (var other in new[] { a, new float3(0.0f, 0.0f, 0.0f), new float3(9.0f, -4.0f, 2.0f) }) + Assert.Equal(-1.0f, gabriel_margin(a, a, other)); + + var pair = new[] { new float4(a, 1.0f), new float4(a, 1.0f), new float4(5.0f, 5.0f, 5.0f, 1.0f) }; + Assert.Equal(0.0f, soft_gabriel_gate(pair, 0, 1, 0.15f)); + // smoothstep(-3, 3, -1) = 3t^2 - 2t^3 at t = 1/3. + Assert.Equal(7.0 / 27.0, soft_gabriel_gate(pair, 0, 1, 3.0f), 1.0e-5); + Assert.Equal(1.0f, soft_gabriel_gate(pair[..2], 0, 1, 0.15f)); + } + + [Fact] + public void CellSpansRefuseNonFinitePositionsAndQueriesAndOverlongSpans() + { + var good = new float4(0.0f, 0.0f, 0.0f, 1.0f); + var origin = new float3(0.0f, 0.0f, 0.0f); + foreach (var bad in new[] { float.NaN, float.PositiveInfinity, float.NegativeInfinity }) + { + var site = new[] { new float4(bad, 0.0f, 0.0f, 1.0f), good, new float4(2.0f, 0.0f, 0.0f, 1.0f) }; + Assert.Equal("sites", Assert.Throws(() => power_cells(origin, site)).ParamName); + Assert.Equal("sites", Assert.Throws(() => multiplicative_cells(origin, site)).ParamName); + Assert.Equal("sites", Assert.Throws(() => power_border(origin, site)).ParamName); + Assert.Equal("sites", Assert.Throws(() => soft_gabriel_gate(site, 1, 2, 0.1f)).ParamName); + var query = new float3(0.0f, bad, 0.0f); + Assert.Equal("p", Assert.Throws(() => power_cells(query, new[] { good })).ParamName); + Assert.Equal("p", Assert.Throws(() => multiplicative_cells(query, new[] { good })).ParamName); + Assert.Equal("p", Assert.Throws(() => power_border(query, new[] { good })).ParamName); + } + + // Indices are floats, exact only to 2^24: a span of 2^24 + 1 real sites is refused for its length. + var overlong = new float4[(1 << 24) + 1]; + foreach (var call in new Func[] + { + () => Assert.Throws(() => power_cells(origin, overlong)), + () => Assert.Throws(() => multiplicative_cells(origin, overlong)), + () => Assert.Throws(() => power_border(origin, overlong)), + }) + { + var e = call(); + Assert.Equal("sites", e.ParamName); + Assert.Contains("2^24", e.Message); + } + } + + [Fact] + public void SegmentClosestIsTheClampedFootOfThePerpendicular() + { + var start = new float3(0.0f, 0.0f, 0.0f); + var end = new float3(4.0f, 0.0f, 0.0f); + Assert.Equal(new float3(2.0f, 0.0f, 0.0f), segment_closest(new float3(2.0f, 3.0f, 1.0f), start, end)); + Assert.Equal(end, segment_closest(new float3(9.0f, 3.0f, 1.0f), start, end)); + Assert.Equal(start, segment_closest(new float3(-9.0f, 3.0f, 1.0f), start, end)); + Assert.Equal(start, segment_closest(new float3(2.0f, 3.0f, 1.0f), start, start)); + Assert.Equal(new float2(4.0f, 0.0f), segment_closest(new float2(9.0f, 3.0f), new float2(0.0f, 0.0f), new float2(4.0f, 0.0f))); + } + + [Fact] + public void PowerBorderStepOutsideTheOwnersCellReportsDistanceZeroWithThatPlanesNormal() + { + var left = new float4(0.0f, 0.0f, 0.0f, 1.0f); + var right = new float4(4.0f, 0.0f, 0.0f, 1.0f); + var empty = new float4(0.0f, 0.0f, 0.0f, 1.0e30f); + var inside = power_border_step(new float3(1.0f, 0.0f, 0.0f), left, right, empty); + Assert.Equal(new float4(-1.0f, 0.0f, 0.0f, 1.0f), inside); + var outside = power_border_step(new float3(3.5f, 0.0f, 0.0f), left, right, empty); + Assert.Equal(new float4(-1.0f, 0.0f, 0.0f, 0.0f), outside); + } + + [Fact] + public void PowerBorderStepLeavesTheBorderAloneForASiteCoincidentWithTheOwner() + { + var owner = new float4(1.0f, 2.0f, 3.0f, 1.0f); + var heavier = new float4(1.0f, 2.0f, 3.0f, 2.0f); + var running = new float4(1.0f, 0.0f, 0.0f, 5.0f); + foreach (var other in new[] { owner, heavier }) + foreach (var border in new[] { running, new float4(0.0f, 0.0f, 0.0f, 1.0e30f) }) + { + var result = power_border_step(new float3(4.0f, 4.0f, 4.0f), owner, other, border); + Assert.Equal(border.x, result.x); + Assert.Equal(border.w, result.w); + } + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/SnoiseTieScopeTests.cs b/packages/cultmath/tests/CultMath.Tests/SnoiseTieScopeTests.cs new file mode 100644 index 00000000..8bf7c895 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/SnoiseTieScopeTests.cs @@ -0,0 +1,177 @@ +using System; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +// The 0.4.0 tie rule (math.snoise(float3), math.snoise_grad) changes values exactly where the cell +// offset x0 has three equal components, which is every input whose coordinate differences y - x and +// z - x are whole numbers (every integer point, and the whole (1, 1, 1) line through each). Off that +// set and its float32 band (below) the results are bit-identical to 0.3.0. The goldens below were computed by the +// cultmath-unity-v0.3.0 tag's CultMath.dll (Runtime/Plugins), not by this code. Float32 rounding +// decides whether a given integer-difference input ties, because x0 is computed in float32: an +// input whose differences round onto whole numbers can tie too and move, within a few float32 +// ulps of the largest coordinate (a probe found up to about two; the band widens with the magnitude), and some inputs on +// the set keep their value (about 3% of random integer points). Every input below ties and moves +// all five outputs (value and the four gradient words). +// TieSetNow pins what this code returns on the same inputs, so that each of the two tie-rule sites +// (the step in snoise, the step in snoise_grad) is pinned on its own. +public sealed class SnoiseTieScopeTests +{ + // (input, snoise bits, snoise_grad x y z w bits) from 0.3.0, each on the tie set and moved by the new rule. + private static readonly (float3 P, uint Value, uint[] Grad)[] TieSet = + { + (new float3(8f, -9f, 1f), 0xBDD82D0D, new uint[] { 0x3FA7D14B, 0x40A68968, 0xC0EE5B16, 0xBDD82D0D }), + (new float3(-15f, 1f, -3f), 0xBF29AEDB, new uint[] { 0x3ECABF0C, 0x40482713, 0x3F444FED, 0xBF29AEDB }), + (new float3(9f, -14f, 7f), 0x3F3F28F4, new uint[] { 0x3F5FB228, 0x3F471A21, 0x40454A1F, 0x3F3F28F4 }), + (new float3(15f, 8f, 17f), 0xBDEE4FE2, new uint[] { 0x3F1F3C06, 0x3FFA0CCF, 0xC00C8395, 0xBDEE4FE2 }), + (new float3(3f, -12f, 10f), 0xBF3A1373, new uint[] { 0x3FC00B62, 0x3E28F20F, 0x403F02DA, 0xBF3A1373 }), + (new float3(2f, -8f, 15f), 0x3F180CA2, new uint[] { 0x3F567351, 0xC0340E87, 0x40E74458, 0x3F180CA2 }), + (new float3(-6.1645937f, -6.1645937f, -6.1645937f), 0xBF1C7CA6, new uint[] { 0xC04341A7, 0xBFE7241A, 0x3EE7511A, 0xBF1C7CA6 }), + (new float3(22.580343f, 22.580343f, 22.580343f), 0x3F5D9075, new uint[] { 0x400096F0, 0xC0590215, 0x3FAAC79D, 0x3F5D9075 }), + (new float3(-25.630196f, -25.630196f, -25.630196f), 0x3F4C7BDB, new uint[] { 0xBFCE54B7, 0x3FCD63EC, 0x403492AC, 0x3F4C7BDB }), + (new float3(-26.818033f, -26.818033f, -26.818033f), 0x3DE34495, new uint[] { 0xBEF368D6, 0xBFD14FED, 0x3FE503E7, 0x3DE34495 }), + (new float3(8.4097805f, -2.5902195f, -0.5902195f), 0xBF85F631, new uint[] { 0xBFE0D093, 0x3F8E6022, 0x3ECA4F57, 0xBF85F631 }), + (new float3(8.618587f, 1.6185865f, 0.61858654f), 0xBE8FB513, new uint[] { 0xC02F9DDD, 0x4063CEA5, 0xBDF0BFBB, 0xBE8FB513 }), + (new float3(-13.692368f, -9.692368f, -20.692368f), 0xBF28A1E3, new uint[] { 0xC012A224, 0xC0187F57, 0xBF57F2CB, 0xBF28A1E3 }), + (new float3(9.495648f, 11.495648f, 15.495648f), 0x3E4FC9B5, new uint[] { 0x3EA26E55, 0x403CE620, 0xBF46F425, 0x3E4FC9B5 }), + (new float3(-12.66157f, -19.66157f, -9.66157f), 0xBF179BF9, new uint[] { 0x3FD03786, 0x403A1C1E, 0xBEAD7581, 0xBF179BF9 }), + (new float3(-8.801376f, -1.8013763f, -19.801376f), 0xBE82F2EE, new uint[] { 0xC0DCFC55, 0x405501DB, 0x401E6CF8, 0xBE82F2EE }), + }; + + // The values this code returns on TieSet's inputs, in the same order (the value, then the four + // snoise_grad components). + private static readonly (uint Value, uint[] Grad)[] TieSetNow = + { + (0xB37C25C6, new uint[] { 0x3F281943, 0x40521F92, 0xC0A8193D, 0xB37C25C6 }), + (0xBF214750, new uint[] { 0xBD931F34, 0x40260272, 0x3E94E53D, 0xBF214750 }), + (0x3F35B75A, new uint[] { 0x3EAD85CB, 0x3E78AB7B, 0x401F83B4, 0x3F35B75A }), + (0xBDE33E78, new uint[] { 0x3F0705E4, 0x3FE9CB38, 0xC00DE5C4, 0xBDE33E78 }), + (0xBF30DF87, new uint[] { 0x3F76B426, 0xBEAE857A, 0x401A3325, 0xBF30DF87 }), + (0x00000000, new uint[] { 0x3FEC7798, 0xBF1DA4FF, 0x40C50E50, 0x00000000 }), + (0xBF13F436, new uint[] { 0xC0219F00, 0xBFA829D9, 0x3F629666, 0xBF13F436 }), + (0x3F0C1A1C, new uint[] { 0x404F76CC, 0xBFA6560B, 0x402B2291, 0x3F0C1A1C }), + (0x3F2E5150, new uint[] { 0xC01F3830, 0x3F007F73, 0x3FD11DF1, 0x3F2E5150 }), + (0x3DDE3B0E, new uint[] { 0xBED7A81C, 0xBFC89166, 0x3FE7E3CC, 0x3DDE3B0E }), + (0xBF23BB4A, new uint[] { 0xC057D547, 0xBF7B66AE, 0xBFCA313F, 0xBF23BB4A }), + (0xBE68D15B, new uint[] { 0xC0391D00, 0x40366C69, 0xBEFFC8AD, 0xBE68D15B }), + (0xBF2659BE, new uint[] { 0xC0048291, 0xC00A5FC3, 0xBF21B992, 0xBF2659BE }), + (0x3E4630E4, new uint[] { 0x3E35FE51, 0x40306ACC, 0xBF655794, 0x3E4630E4 }), + (0xBF117B1D, new uint[] { 0x3F9D6F53, 0x401F35B7, 0xBF31BAFE, 0xBF117B1D }), + (0xBDA5A39E, new uint[] { 0xC0B4E453, 0x3FF84A5D, 0x3FA74D5F, 0xBDA5A39E }), + }; + + // The same, off the tie set: coordinate differences that are not whole numbers. + private static readonly (float3 P, uint Value, uint[] Grad)[] OffSet = + { + (new float3(-3.7841978f, -12.899288f, 1.5972604f), 0x3EA04649, new uint[] { 0xBF74444B, 0x3F87A8A7, 0xC021229C, 0x3EA04649 }), + (new float3(8.898657f, 12.611845f, 4.790286f), 0xBEC97F79, new uint[] { 0xBD25992C, 0xC02EF328, 0xBF17ECAB, 0xBEC97F79 }), + (new float3(0.7057237f, 11.097378f, 13.493794f), 0xBE00B70D, new uint[] { 0xBEDBFFF7, 0xBFDA79F7, 0xBF07EA57, 0xBE00B70D }), + (new float3(-15.702414f, 3.5919724f, -7.0502086f), 0xBDC6607C, new uint[] { 0xBF113459, 0x3EB74352, 0xBF4D2C56, 0xBDC6607C }), + (new float3(-13.623555f, -10.574037f, -15.697628f), 0x3E823717, new uint[] { 0xBF4926AE, 0x4076E757, 0x40710AFC, 0x3E823717 }), + (new float3(-10.028356f, 5.4002185f, -13.579105f), 0x3EF1651D, new uint[] { 0x3FF0CA03, 0xC004B90C, 0xBFAF91DA, 0x3EF1651D }), + (new float3(12.788626f, 14.914132f, -0.39256755f), 0x3DB39ABE, new uint[] { 0xC06D6427, 0xBF941974, 0x3E8B556D, 0x3DB39ABE }), + (new float3(-2.4998372f, 10.696207f, 15.391607f), 0xBF0D1821, new uint[] { 0x3FAB00CF, 0x4044DAE4, 0x3F1E2E21, 0xBF0D1821 }), + (new float3(10.437524f, -3.4692447f, 15.652484f), 0x3EFCC588, new uint[] { 0xC083735E, 0x3FA4A10F, 0xBE7D19D2, 0x3EFCC588 }), + (new float3(-4.4040494f, 14.969201f, -2.2152362f), 0xBD4192BF, new uint[] { 0xBF3F69AE, 0xBF843396, 0xBFF88079, 0xBD4192BF }), + (new float3(2.7095387f, 13.3163395f, -0.28273603f), 0x3EF0704A, new uint[] { 0xBF75C892, 0x3F0C95B0, 0x3F7401B5, 0x3EF0704A }), + (new float3(-10.564334f, -5.6527104f, -6.6908674f), 0x3EA35AEA, new uint[] { 0xC05CB149, 0x3F928B08, 0x3EB68FCB, 0x3EA35AEA }), + (new float3(-13.572381f, -2.2560256f, -12.702176f), 0x3D2013BE, new uint[] { 0xC0236256, 0x3D02D65C, 0x3DB57CBC, 0x3D2013BE }), + (new float3(0.11813756f, -7.2100754f, 7.144552f), 0xBF244AB4, new uint[] { 0xBF6B4A5E, 0xBFFC1BFA, 0xBE868270, 0xBF244AB4 }), + (new float3(9.668022f, -0.32686335f, 2.333893f), 0xBDE9567A, new uint[] { 0x3F359CBB, 0x3F2B104D, 0x3FEFAB81, 0xBDE9567A }), + (new float3(-6.9417686f, -6.2886133f, -13.874224f), 0x3CC28786, new uint[] { 0xC0291AB6, 0x3E57B89E, 0xBE884AF7, 0x3CC28786 }), + (new float3(9.9228945f, 13.366786f, 1.9626095f), 0x3DDCC7CA, new uint[] { 0xBFA57791, 0x40277CF0, 0xBF816FCF, 0x3DDCC7CA }), + (new float3(1.3210233f, -5.5900016f, 9.691286f), 0x3D140957, new uint[] { 0x4003DBED, 0x3E35DCDD, 0xBF9CFAAE, 0x3D140957 }), + (new float3(2.5023124f, 14.715639f, -7.5954947f), 0x3EB522F9, new uint[] { 0x3FB54F05, 0x4003D90A, 0x3F4CCE6D, 0x3EB522F9 }), + (new float3(2.2056534f, 14.461132f, 0.081089176f), 0xBE0FBF83, new uint[] { 0xBF2E2FDB, 0x4014B7C5, 0x3F8C8EC2, 0xBE0FBF83 }), + (new float3(5.137802f, -10.890227f, 12.128177f), 0xBEAEF52F, new uint[] { 0xBFBC5CA4, 0xBFD159C2, 0x402EBCD4, 0xBEAEF52F }), + (new float3(-0.290969f, -2.4119518f, 6.2756324f), 0x3EE30F7E, new uint[] { 0x3E94AD2B, 0x3F8DCBA0, 0x4055B8BB, 0x3EE30F7E }), + (new float3(9.232528f, 12.940779f, 11.078674f), 0x3E380DF3, new uint[] { 0x3F8B7DBE, 0x3F1596ED, 0xC0527328, 0x3E380DF3 }), + (new float3(6.9932394f, -12.455975f, -8.343756f), 0x3E929F5A, new uint[] { 0x3E5564B6, 0x3FF1BE81, 0xBF77638A, 0x3E929F5A }), + (new float3(15.123071f, 12.623071f, 20.12307f), 0x3E9527A3, new uint[] { 0x3D084582, 0xC07DE925, 0xBECA2112, 0x3E9527A3 }), + (new float3(8.46288f, 11.96288f, 4.46288f), 0x3E8C0F92, new uint[] { 0x3FD2DFD3, 0x3FB49817, 0x3F023648, 0x3E8C0F92 }), + (new float3(-2.9422863f, -1.4422863f, -12.9422865f), 0xBEBAEE39, new uint[] { 0x3FECB31B, 0xBFD33138, 0x3F9A17A8, 0xBEBAEE39 }), + (new float3(13.526707f, 15.026707f, 2.5267067f), 0x3EF22701, new uint[] { 0x3F1D389B, 0x3FCABBBE, 0xBF66EE93, 0x3EF22701 }), + (new float3(11.822154f, 1.322154f, 13.822154f), 0x3E85ACC7, new uint[] { 0x3FA7C0C7, 0xC067C262, 0x3FF35925, 0x3E85ACC7 }), + (new float3(6.025978f, 8.525978f, 3.025978f), 0x3E9964B0, new uint[] { 0xBEE7F346, 0x3F1918E9, 0x3EF3DA8A, 0x3E9964B0 }), + (new float3(-15.095373f, -14.595373f, -16.095373f), 0xBE6EF82D, new uint[] { 0xC01F9511, 0x3FEDB679, 0xBFDA5058, 0xBE6EF82D }), + (new float3(3.2167344f, 12.716734f, -6.7832656f), 0x3EA3C041, new uint[] { 0xBFFA5E11, 0xBF41778D, 0xBFCFD96A, 0x3EA3C041 }), + (new float3(12.25f, -0.25f, -3.25f), 0x3EB8C88C, new uint[] { 0xBFA0E2A2, 0x40101407, 0x402D2F5B, 0x3EB8C88C }), + (new float3(-9f, -13.25f, 10f), 0x3F032C5D, new uint[] { 0x3F9FFBCB, 0x3E6ED505, 0x401D75F4, 0x3F032C5D }), + (new float3(-5.75f, 2.25f, 13.75f), 0x3E62496B, new uint[] { 0x3FC789CA, 0x3EE63ACD, 0xBEE57812, 0x3E62496B }), + (new float3(-12.5f, 10f, -5.25f), 0x3EEA194F, new uint[] { 0x3F182206, 0xC0282BDE, 0xBFA51540, 0x3EEA194F }), + (new float3(13.5f, -11f, -3f), 0x3E6B5E9A, new uint[] { 0xBF2F5213, 0x3FE97BC2, 0x3F072FB4, 0x3E6B5E9A }), + (new float3(-2.75f, 7.75f, 3.5f), 0x3E91F33E, new uint[] { 0x3E2546E0, 0xBF63D038, 0xBFC3C500, 0x3E91F33E }), + (new float3(10.5f, 4f, -3.75f), 0x3EBCDE1F, new uint[] { 0xBFDC4426, 0x400DCD14, 0x3F7CACF6, 0x3EBCDE1F }), + (new float3(-12.75f, -13f, -6f), 0x3D5F6FB0, new uint[] { 0xBFBF0ED8, 0xC0109EED, 0xC007C568, 0x3D5F6FB0 }), + (new float3(-0.069121994f, 0.76107657f, 0.41525742f), 0x3DA72363, new uint[] { 0x3E5DF1FF, 0x3F7E17BE, 0x3FA89CB3, 0x3DA72363 }), + (new float3(1.0466753f, -0.51170796f, 0.21126905f), 0xBDD1FE81, new uint[] { 0x3DFD066D, 0x3E5E0061, 0x3FDBADAF, 0xBDD1FE81 }), + (new float3(0.30550694f, 1.6808131f, -0.76585627f), 0x3F0F3AB5, new uint[] { 0x3FF9EAC8, 0xC001ADBF, 0x3FD97B97, 0x3F0F3AB5 }), + (new float3(-0.8827523f, 0.12493165f, -1.8058014f), 0x3EC3BE7E, new uint[] { 0xC02395D6, 0x3F00EEB9, 0x3F976926, 0x3EC3BE7E }), + }; + + private static bool OnTieSet(float3 p) + { + var a = (double)p.y - p.x; + var b = (double)p.z - p.x; + return a == Math.Floor(a) && b == Math.Floor(b); + } + + // Each output is asserted on its own: a tie rule reverted at one site must fail here by itself, + // whatever the other site returns. A given input moves some outputs and not others, so each + // output must differ from 0.3.0 on at least one tie-set input. + [Fact] + public void EachOutputDiffersFromZeroPointThreeSomewhereOnTheTieSet() + { + Assert.NotEmpty(TieSet); + var moved = new bool[5]; + foreach (var (p, value, grad) in TieSet) + { + Assert.True(OnTieSet(p)); + var g = math.snoise_grad(p); + moved[0] |= BitConverter.SingleToUInt32Bits(math.snoise(p)) != value; + moved[1] |= BitConverter.SingleToUInt32Bits(g.x) != grad[0]; + moved[2] |= BitConverter.SingleToUInt32Bits(g.y) != grad[1]; + moved[3] |= BitConverter.SingleToUInt32Bits(g.z) != grad[2]; + moved[4] |= BitConverter.SingleToUInt32Bits(g.w) != grad[3]; + } + Assert.True(moved[0], "snoise(float3) still reads its 0.3.0 value on the tie set"); + Assert.True(moved[1], "snoise_grad.x still reads its 0.3.0 value on the tie set"); + Assert.True(moved[2], "snoise_grad.y still reads its 0.3.0 value on the tie set"); + Assert.True(moved[3], "snoise_grad.z still reads its 0.3.0 value on the tie set"); + Assert.True(moved[4], "snoise_grad.w still reads its 0.3.0 value on the tie set"); + } + + [Fact] + public void TieSetInputsReturnTheirZeroPointFourGoldens() + { + Assert.Equal(TieSet.Length, TieSetNow.Length); + for (var k = 0; k < TieSet.Length; k++) + { + var p = TieSet[k].P; + var (value, grad) = TieSetNow[k]; + var g = math.snoise_grad(p); + Assert.Equal(value, BitConverter.SingleToUInt32Bits(math.snoise(p))); + Assert.Equal(grad[0], BitConverter.SingleToUInt32Bits(g.x)); + Assert.Equal(grad[1], BitConverter.SingleToUInt32Bits(g.y)); + Assert.Equal(grad[2], BitConverter.SingleToUInt32Bits(g.z)); + Assert.Equal(grad[3], BitConverter.SingleToUInt32Bits(g.w)); + } + } + + [Fact] + public void InputsOffTheTieSetKeepTheirZeroPointThreeBits() + { + Assert.NotEmpty(OffSet); + foreach (var (p, value, grad) in OffSet) + { + Assert.False(OnTieSet(p)); + var g = math.snoise_grad(p); + Assert.Equal(value, BitConverter.SingleToUInt32Bits(math.snoise(p))); + Assert.Equal(grad[0], BitConverter.SingleToUInt32Bits(g.x)); + Assert.Equal(grad[1], BitConverter.SingleToUInt32Bits(g.y)); + Assert.Equal(grad[2], BitConverter.SingleToUInt32Bits(g.z)); + Assert.Equal(grad[3], BitConverter.SingleToUInt32Bits(g.w)); + } + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/SpanPrimitiveTests.cs b/packages/cultmath/tests/CultMath.Tests/SpanPrimitiveTests.cs new file mode 100644 index 00000000..dea5ab0c --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/SpanPrimitiveTests.cs @@ -0,0 +1,398 @@ +using CultMath; +using Xunit; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// The span primitives (math.Span.cs): snoise_hessian against the finite differences of snoise_grad and of +/// snoise, with each tolerance measured by Richardson's two step sizes rather than assumed; its symmetry and +/// its continuity across the simplex diagonal; and integral_clamp_linear against adaptive quadrature in +/// double. SNOISE_THIRD is measured and pinned in NoiseBoundTests (MeasureThird, ThirdConstantPinsSampled). +/// +/// Hand mutations these must kill: any term of the per-corner second derivative dropped or mis-signed +/// (48 m^2 s x_i x_j, 8 m^3 p_j x_i, 8 m^3 p_i x_j, 8 m^3 s delta_ij) fails +/// SnoiseHessianMatchesCentralDifferences; the 0.3.0 cyclic tie order fails +/// SnoiseHessianContinuousOnSimplexDiagonal; a crossing of integral_clamp_linear moved, a clamp piece +/// dropped or the reversed-span sign lost fails IntegralClampLinearMatchesQuadrature. +/// +public sealed class SpanPrimitiveTests +{ + private readonly ITestOutputHelper output; + + public SpanPrimitiveTests(ITestOutputHelper output) => this.output = output; + + private const double Unit = 1.0 / 16777216.0; + + // A point of [-50, 50]^3 on the 2^-10 lattice, so that p +- h is exact in float32 for h a power of two + // up to 2^-4 and the finite-difference quotients carry no step rounding. + private static float3 LatticePoint(System.Random random) + { + float Axis() => MathF.Round((random.NextSingle() * 100.0f - 50.0f) * 1024.0f) / 1024.0f; + return new float3(Axis(), Axis(), Axis()); + } + + // The simplex tie set of NoiseGradTests.SnoiseIsContinuousOnTheSimplexDiagonal: the line (t, t, t) and + // the lattice diagonals v + s (1, 1, 1), v = L - sum(L) / 6. + private static List TiePoints() + { + const int vertices = 160; + const int perVertex = 8; + var random = new System.Random(0x71E5); + var points = new List(); + for (var k = 0; k < 400; k++) + { + var t = (float)(random.NextDouble() * 128.0 - 64.0); + points.Add(new float3(t, t, t)); + } + + points.Add(new float3(0.0f, 0.0f, 0.0f)); + for (var k = 0; k < vertices; k++) + { + var lx = random.Next(-64, 65); + var ly = random.Next(-64, 65); + var lz = random.Next(-64, 65); + var shift = (lx + ly + lz) / 6.0f; + for (var j = 0; j < perVertex; j++) + { + var s = j == 0 ? 0.0f : random.NextSingle(); + points.Add(new float3(lx - shift + s, ly - shift + s, lz - shift + s)); + } + } + + return points; + } + + private static float3 Axis(int a, float h) => new(a == 0 ? h : 0.0f, a == 1 ? h : 0.0f, a == 2 ? h : 0.0f); + + // Column a of the Hessian by the central difference of snoise_grad at step h, in double. + private static double[] GradientDifference(float3 p, int a, float h) + { + var plus = snoise_grad(p + Axis(a, h)); + var minus = snoise_grad(p - Axis(a, h)); + return new[] { (plus.x - (double)minus.x) / (2.0 * h), (plus.y - (double)minus.y) / (2.0 * h), (plus.z - (double)minus.z) / (2.0 * h) }; + } + + // Worst ratio of |H - D(h/2)| to its tolerance, the number of entries compared and the largest |H| met. + private (double Worst, int Compared, double LargestEntry, double LargestTolerance) CompareToGradientDifferences(IEnumerable points) + { + const float h = 1.0f / 256.0f; + double worst = 0.0, largest = 0.0, largestTolerance = 0.0; + var compared = 0; + foreach (var p in points) + { + var hessian = snoise_hessian(p); + var gradient = snoise_grad(p); + var scale = Math.Max(Math.Max(Math.Abs(gradient.x), Math.Abs(gradient.y)), Math.Max(Math.Abs(gradient.z), 1.0)); + for (var a = 0; a < 3; a++) + { + var coarse = GradientDifference(p, a, h); + var fine = GradientDifference(p, a, h / 2.0f); + for (var i = 0; i < 3; i++) + { + // The truncation of the finer quotient is a third of the gap between the two, as the + // error is O(h^2); the roundoff is a few ulp of the gradient over the step. Both are + // measured per entry and tripled, so the tolerance follows the point's own roughness. + var tolerance = 3.0 * (Math.Abs(coarse[i] - fine[i]) + 64.0 * Unit * scale / (h / 2.0)); + var error = Math.Abs(hessian[i][a] - fine[i]); + worst = Math.Max(worst, error / tolerance); + largest = Math.Max(largest, Math.Abs(hessian[i][a])); + largestTolerance = Math.Max(largestTolerance, tolerance); + Assert.True(error <= tolerance, $"snoise_hessian({p})[{i}][{a}] = {hessian[i][a]:R} differs from the central difference of snoise_grad {fine[i]:R} by {error:R}, over the measured tolerance {tolerance:R}"); + compared++; + } + } + } + + return (worst, compared, largest, largestTolerance); + } + + [Fact] + public void SnoiseHessianMatchesCentralDifferences() + { + var random = new System.Random(0x5A11); + var points = Enumerable.Range(0, 10_000).Select(_ => LatticePoint(random)).ToList(); + var (worst, compared, largest, largestTolerance) = CompareToGradientDifferences(points); + output.WriteLine($"snoise_hessian vs central differences of snoise_grad over {points.Count} seeded points: {compared} entries, worst error {worst:F3} of its Richardson tolerance, largest |H| {largest:R}, largest tolerance {largestTolerance:R}"); + + // The comparison has teeth: curvature of the size the constant claims is present, and the tolerance + // is far under it, so a dropped term of the second derivative cannot hide in it. + Assert.True(largest > 10.0, $"the sample never meets curvature above 10 (largest {largest:R})"); + Assert.True(largestTolerance < 0.5, $"the tolerance reaches {largestTolerance:R}, too wide to see a dropped term"); + + var (tieWorst, tieCompared, tieLargest, tieTolerance) = CompareToGradientDifferences(TiePoints()); + output.WriteLine($"snoise_hessian vs central differences of snoise_grad on the simplex tie set: {tieCompared} entries, worst error {tieWorst:F3} of its Richardson tolerance, largest |H| {tieLargest:R}, largest tolerance {tieTolerance:R}"); + Assert.True(tieLargest > 1.0, $"the tie set never meets curvature above 1 (largest {tieLargest:R})"); + } + + // The second difference of snoise in double, h apart, for the entry (i, j): the three-point stencil + // for i = j, the four-point mixed stencil otherwise. + private static double SecondDifference(float3 p, int i, int j, float h) + { + if (i == j) + return (snoise(p + Axis(i, h)) - 2.0 * (double)snoise(p) + snoise(p - Axis(i, h))) / ((double)h * h); + var pp = snoise(p + Axis(i, h) + Axis(j, h)); + var pm = snoise(p + Axis(i, h) - Axis(j, h)); + var mp = snoise(p - Axis(i, h) + Axis(j, h)); + var mm = snoise(p - Axis(i, h) - Axis(j, h)); + return ((double)pp - pm - mp + mm) / (4.0 * h * h); + } + + [Fact] + public void SnoiseHessianMatchesSecondDifferencesOfSnoise() + { + var random = new System.Random(0x5A12); + double worst = 0.0, largest = 0.0; + var compared = 0; + var outside = 0; + for (var k = 0; k < 4000; k++) + { + var p = LatticePoint(random); + var hessian = snoise_hessian(p); + for (var i = 0; i < 3; i++) + for (var j = i; j < 3; j++) + { + // Richardson on the O(h^2) second difference: (4 S(h/2) - S(h)) / 3 is O(h^4). Two such + // extrapolations, from (h, h/2) and from (h/2, h/4), differ by about fifteen times the + // error of the finer one, so the comparison is against the finer and its tolerance is + // four times that gap, plus the roundoff of snoise (a few ulp) over (h/4)^2. Near a + // kernel's edge (m = 0) snoise's fourth derivative jumps and the extrapolation loses its + // order: such an entry may exceed the tight tolerance, but never by more than the gap + // between the last two second differences (an error that shrinks at least linearly in h + // is at most that gap), and the tight tolerance must hold for all but a fraction. + const float h = 1.0f / 16.0f; + var s0 = SecondDifference(p, i, j, h); + var s1 = SecondDifference(p, i, j, h / 2.0f); + var s2 = SecondDifference(p, i, j, h / 4.0f); + var coarseExtrapolation = (4.0 * s1 - s0) / 3.0; + var extrapolated = (4.0 * s2 - s1) / 3.0; + var tolerance = 4.0 * Math.Abs(extrapolated - coarseExtrapolation) + 64.0 * Unit / ((h / 4.0) * (h / 4.0)); + var loose = tolerance + 2.0 * Math.Abs(s1 - s2); + var error = Math.Abs(hessian[i][j] - extrapolated); + worst = Math.Max(worst, error / tolerance); + largest = Math.Max(largest, Math.Abs(hessian[i][j])); + compared++; + if (error > tolerance) + outside++; + Assert.True(error <= loose, $"snoise_hessian({p})[{i}][{j}] = {hessian[i][j]:R} differs from the extrapolated second difference of snoise {extrapolated:R} by {error:R}, over the measured tolerance {loose:R}"); + } + } + + output.WriteLine($"snoise_hessian vs Richardson second differences of snoise over 4000 seeded points: {compared} entries, {outside} over the tight tolerance, worst error {worst:F3} of it, largest |H| {largest:R}"); + Assert.True(largest > 10.0, $"the sample never meets curvature above 10 (largest {largest:R})"); + Assert.True(outside <= compared / 200, $"{outside} of {compared} entries are over the tight Richardson tolerance, more than 0.5%"); + } + + [Fact] + public void SnoiseHessianIsSymmetric() + { + var random = new System.Random(0x5A13); + var points = Enumerable.Range(0, 20_000).Select(_ => new float3(random.NextSingle() * 512.0f - 256.0f, random.NextSingle() * 512.0f - 256.0f, random.NextSingle() * 512.0f - 256.0f)) + .Concat(TiePoints()).Append(new float3(0.0f, 0.0f, 0.0f)).ToList(); + foreach (var p in points) + { + var h = snoise_hessian(p); + Assert.True(BitConverter.SingleToInt32Bits(h._m01) == BitConverter.SingleToInt32Bits(h._m10) + && BitConverter.SingleToInt32Bits(h._m02) == BitConverter.SingleToInt32Bits(h._m20) + && BitConverter.SingleToInt32Bits(h._m12) == BitConverter.SingleToInt32Bits(h._m21), $"snoise_hessian({p}) is not its own transpose: {h}"); + } + } + + [Fact] + public void SnoiseHessianContinuousOnSimplexDiagonal() + { + // Within 1 or 2 ulp of a tie point along each axis the Hessian moves by at most the third derivative + // bound times the distance: SNOISE_THIRD x 2 sqrt 3 x 1e-4 covers a 1e-4 ball, and the points are + // far closer than that. The 0.3.0 cyclic tie order is a jump of order one here. + var bound = SNOISE_THIRD * 2.0 * Math.Sqrt(3.0) * 1.0e-4; + var worst = 0.0; + foreach (var p in TiePoints()) + { + var centre = snoise_hessian(p); + for (var axis = 0; axis < 3; axis++) + { + for (var direction = -1; direction <= 1; direction += 2) + { + var q = p; + for (var ulp = 1; ulp <= 2; ulp++) + { + var component = axis == 0 ? q.x : axis == 1 ? q.y : q.z; + component = direction < 0 ? MathF.BitDecrement(component) : MathF.BitIncrement(component); + q = axis == 0 ? new float3(component, q.y, q.z) : axis == 1 ? new float3(q.x, component, q.z) : new float3(q.x, q.y, component); + var moved = snoise_hessian(q); + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + { + var jump = Math.Abs(moved[i][j] - (double)centre[i][j]); + worst = Math.Max(worst, jump); + Assert.True(jump <= bound, $"snoise_hessian jumps {jump:R} in entry [{i}][{j}] within {ulp} ulp of {p}, over {bound:R}"); + } + } + } + } + } + + output.WriteLine($"largest Hessian jump within 2 ulp of the simplex tie set: {worst:R} against the bound {bound:R}"); + } + + // Adaptive Simpson of f over [a, b] in double, to an absolute tolerance, with a depth cap. + private static double Quadrature(Func f, double a, double b, double tolerance) + { + double Simpson(double fa, double fm, double fb, double width) => width / 6.0 * (fa + 4.0 * fm + fb); + + double Recurse(double x0, double x1, double f0, double fm, double f1, double whole, double eps, int depth) + { + var mid = 0.5 * (x0 + x1); + var lm = 0.5 * (x0 + mid); + var rm = 0.5 * (mid + x1); + var flm = f(lm); + var frm = f(rm); + var left = Simpson(f0, flm, fm, mid - x0); + var right = Simpson(fm, frm, f1, x1 - mid); + if (depth <= 0 || Math.Abs(left + right - whole) <= 15.0 * eps) + return left + right + (left + right - whole) / 15.0; + return Recurse(x0, mid, f0, flm, fm, left, eps / 2.0, depth - 1) + Recurse(mid, x1, fm, frm, f1, right, eps / 2.0, depth - 1); + } + + if (a == b) + return 0.0; + var fa = f(a); + var fb = f(b); + var fmid = f(0.5 * (a + b)); + return Recurse(a, b, fa, fmid, fb, Simpson(fa, fmid, fb, b - a), tolerance, 40); + } + + private static double ClampedLine(double a, double b, double lo, double hi, double t) => Math.Min(Math.Max(a + b * t, lo), hi); + + // The reference integral in double: the adaptive quadrature of the clamped line, sign for a reversed span. + private static double ReferenceIntegral(float a, float b, float lo, float hi, float t0, float t1) + { + double low = Math.Min(lo, hi); + var integral = t0 <= t1 + ? Quadrature(t => ClampedLine(a, b, low, hi, t), t0, t1, 1.0e-12) + : -Quadrature(t => ClampedLine(a, b, low, hi, t), t1, t0, 1.0e-12); + return integral; + } + + [Fact] + public void IntegralClampLinearMatchesQuadrature() + { + var random = new System.Random(0x1A7E); + float Uniform(float lo, float hi) => lo + (hi - lo) * random.NextSingle(); + double worstRatio = 0.0; + int zeroSlopes = 0, reversed = 0, both = 0, neither = 0, ramps = 0; + for (var k = 0; k < 100_000; k++) + { + var a = Uniform(-4.0f, 4.0f); + // One in eight slopes is zero, one in sixteen is tiny (a crossing far outside any span). + var b = (k % 8) switch { 0 => 0.0f, 1 => 1.0e-30f * (k % 16 == 1 ? 1.0f : -1.0f), _ => Uniform(-4.0f, 4.0f) }; + var lo = Uniform(-2.0f, 0.5f); + var hi = lo + Uniform(0.0f, 3.0f); + var t0 = Uniform(-3.0f, 3.0f); + var t1 = Uniform(-3.0f, 3.0f); + var got = integral_clamp_linear(a, b, lo, hi, t0, t1); + var want = ReferenceIntegral(a, b, lo, hi, t0, t1); + var span = Math.Abs((double)t1 - t0); + var error = Math.Abs(got - want); + worstRatio = Math.Max(worstRatio, error / Math.Max(1.0e-5 * Math.Abs(want), 1.0e-6 * span)); + Assert.True(error <= 1.0e-5 * Math.Abs(want) || error <= 1.0e-6 * span, $"integral_clamp_linear({a:R}, {b:R}, {lo:R}, {hi:R}, {t0:R}, {t1:R}) = {got:R}, quadrature {want:R}"); + if (b == 0.0f) + zeroSlopes++; + if (t1 < t0) + reversed++; + if (b != 0.0f) + { + double atLo = (lo - (double)a) / b, atHi = (hi - (double)a) / b; + double from = Math.Min(t0, t1), to = Math.Max(t0, t1); + var crossesLo = atLo > from && atLo < to; + var crossesHi = atHi > from && atHi < to; + if (crossesLo && crossesHi) + both++; + else if (!crossesLo && !crossesHi) + neither++; + if (hi > lo && (crossesLo || crossesHi)) + ramps++; + } + } + + output.WriteLine($"integral_clamp_linear vs adaptive quadrature over 100000 cases: {zeroSlopes} flat, {reversed} reversed, {both} crossing both bounds, {neither} crossing neither, {ramps} on a ramp; worst error {worstRatio:F3} of its tolerance"); + Assert.True(zeroSlopes > 10_000 && reversed > 40_000 && both > 2_000 && neither > 2_000, $"the sample meets a branch too rarely: {zeroSlopes} flat, {reversed} reversed, {both} both, {neither} neither"); + } + + /// + /// An infinite bound never reached by the line contributes nothing, not infinity times zero: relu + /// (hi = +inf) and its mirror (lo = -inf) give the finite integral, whether the line crosses the finite + /// bound inside the span or not. Both branches give +0 for a zero-length span. + /// + [Fact] + public void IntegralClampLinearIsFiniteForInfiniteBounds() + { + var inf = float.PositiveInfinity; + // t over [0, 1] clamped below at 0: all ramp, 1/2. + Assert.Equal(0.5f, integral_clamp_linear(0.0f, 1.0f, 0.0f, inf, 0.0f, 1.0f)); + // t - 1/2 over [0, 1] clamped below at 0: 0 until 1/2, then the ramp's 1/8. + Assert.Equal(0.125f, integral_clamp_linear(-0.5f, 1.0f, 0.0f, inf, 0.0f, 1.0f)); + // The falling line 1/2 - t clamped below at 0 is the mirror: 1/8 over [0, 1]. + Assert.Equal(0.125f, integral_clamp_linear(0.5f, -1.0f, 0.0f, inf, 0.0f, 1.0f)); + // lo = -inf: clamp(t, -inf, 1/2) over [0, 1] is t up to 1/2 then 1/2 (1/8 + 1/4), and 1 - t clamped + // above at 1/2 is 1/2 until t = 1/2 and then falls (1/4 + 1/8). + Assert.Equal(0.375f, integral_clamp_linear(0.0f, 1.0f, -inf, 0.5f, 0.0f, 1.0f)); + Assert.Equal(0.375f, integral_clamp_linear(1.0f, -1.0f, -inf, 0.5f, 0.0f, 1.0f)); + // Both infinite: the line itself, the trapezoid, in either direction. + Assert.Equal(7.5f, integral_clamp_linear(0.0f, 1.0f, -inf, inf, 1.0f, 4.0f)); + Assert.Equal(-7.5f, integral_clamp_linear(0.0f, 1.0f, -inf, inf, 4.0f, 1.0f)); + // A line starting on the finite bound and rising into the infinite one: all ramp, the integral of t over [2, 4]. + Assert.Equal(6.0f, integral_clamp_linear(0.0f, 1.0f, 2.0f, inf, 2.0f, 4.0f)); + + // The flat branch obeys the same zero-length rule: a stretch of zero length contributes +0 however + // infinite the bound it would be clamped to, and a nonzero length of an infinite constant is infinite. + // The bit patterns are compared because Assert.Equal treats -0 as 0. + Assert.Equal(0, BitConverter.SingleToInt32Bits(integral_clamp_linear(-2.3244874f, -0.0f, 0.0f, -inf, 1.429815f, 1.429815f))); + Assert.Equal(0, BitConverter.SingleToInt32Bits(integral_clamp_linear(1.5f, 0.0f, inf, inf, 2.0f, 2.0f))); + Assert.Equal(0, BitConverter.SingleToInt32Bits(integral_clamp_linear(1.5f, -0.0f, -inf, -inf, 0.0f, 0.0f))); + Assert.Equal(inf, integral_clamp_linear(1.5f, 0.0f, inf, inf, 0.0f, 2.0f)); + Assert.Equal(inf, integral_clamp_linear(1.5f, 0.0f, -inf, -inf, 2.0f, 0.0f)); + + // The sloped branch gives +0 for a zero-length span too, not -0: the direction sign never meets a + // zero total, whichever way the line leans and whatever the bounds. + Assert.Equal(0, BitConverter.SingleToInt32Bits(integral_clamp_linear(1.0f, 2.0f, -inf, inf, 1.0f, 1.0f))); + Assert.Equal(0, BitConverter.SingleToInt32Bits(integral_clamp_linear(-3.0f, -2.0f, 0.0f, 5.0f, 1.0f, 1.0f))); + Assert.Equal(0, BitConverter.SingleToInt32Bits(integral_clamp_linear(0.5f, 1.0f, 0.0f, inf, 0.0f, 0.0f))); + } + + /// + /// lo above hi is normalised before the flat branch reads it: with b = 0 the answer is hi times the + /// span (what clamp(a, lo, hi) gives with lo = min(lo, hi)), and with b != 0 the same. The GLSL + /// lowering would otherwise call clamp with minVal above maxVal, which is undefined there. + /// + [Fact] + public void IntegralClampLinearNormalisesBeforeTheFlatBranch() + { + // b = 0: a above both, below both and between them all give hi. + foreach (var a in new[] { 9.0f, -9.0f, 3.5f }) + Assert.Equal(2.0f * 3.0f, integral_clamp_linear(a, 0.0f, 5.0f, 2.0f, 0.0f, 3.0f)); + // b != 0: hi everywhere, whichever way the line runs. + Assert.Equal(2.0f * 3.0f, integral_clamp_linear(0.0f, 1.0f, 5.0f, 2.0f, 0.0f, 3.0f)); + Assert.Equal(2.0f * 3.0f, integral_clamp_linear(9.0f, -1.0f, 5.0f, 2.0f, 0.0f, 3.0f)); + } + + [Fact] + public void IntegralClampLinearHasExactValuesOnTheBinaryFloats() + { + // The ramp t from 0 to 1 clamped to [0.25, 0.75] over [0, 1]: 0.25 x 0.25 below, 0.5 x 0.5 on the ramp, 0.75 x 0.25 above. + Assert.Equal(0.0625f + 0.25f + 0.1875f, integral_clamp_linear(0.0f, 1.0f, 0.25f, 0.75f, 0.0f, 1.0f)); + // A reversed span is the negative of the span. + Assert.Equal(-0.5f, integral_clamp_linear(0.0f, 1.0f, 0.25f, 0.75f, 1.0f, 0.0f)); + Assert.Equal(integral_clamp_linear(0.3f, -0.7f, -0.5f, 0.9f, -2.0f, 1.5f), -integral_clamp_linear(0.3f, -0.7f, -0.5f, 0.9f, 1.5f, -2.0f)); + // b = 0 is the constant, clamped. + Assert.Equal(2.0f * 3.0f, integral_clamp_linear(5.0f, 0.0f, 0.0f, 2.0f, 1.0f, 4.0f)); + Assert.Equal(-1.0f * 3.0f, integral_clamp_linear(-5.0f, 0.0f, -1.0f, 2.0f, 1.0f, 4.0f)); + // An empty span, and a span that never leaves the ramp (the trapezoid: 3 x mean of 1 and 4). + Assert.Equal(0.0f, integral_clamp_linear(0.0f, 1.0f, -9.0f, 9.0f, 2.0f, 2.0f)); + Assert.Equal(7.5f, integral_clamp_linear(0.0f, 1.0f, -9.0f, 9.0f, 1.0f, 4.0f)); + // A falling line starts at the upper bound: 1 for t in [0, 1], the ramp 1 to 0 over [1, 2], 0 after. + Assert.Equal(1.0f + 0.5f, integral_clamp_linear(2.0f, -1.0f, 0.0f, 1.0f, 0.0f, 3.0f)); + // lo above hi clamps to hi everywhere. + Assert.Equal(2.0f * 3.0f, integral_clamp_linear(0.0f, 1.0f, 5.0f, 2.0f, 0.0f, 3.0f)); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/SpanStageTests.cs b/packages/cultmath/tests/CultMath.Tests/SpanStageTests.cs new file mode 100644 index 00000000..dc1784f9 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/SpanStageTests.cs @@ -0,0 +1,941 @@ +using Xunit; +using static CultMath.math; + +namespace CultMath.Tests; + +/// +/// span_fbm and span_ridged (math.Span.cs): the octave stages of a warp chain over a span. At the identity +/// transform they are fbm_grad and ridged_grad; their gradient is the derivative of their value through the +/// stretch and the per-octave scaling; curvature bounds the Hessian of the field in q and fold the departure +/// of a ridged sum from its midpoint branch, at every point of every span the tests draw, in the regime +/// where the local third-derivative term is what holds the bound and in the one where the global pin is. +/// Lines starting IV-REPORT carry the numbers the cut report quotes. +/// +public sealed class SpanStageTests +{ + private readonly ITestOutputHelper output; + + public SpanStageTests(ITestOutputHelper output) => this.output = output; + + private static float Uniform(System.Random random, float lo, float hi) => lo + (hi - lo) * random.NextSingle(); + + private static float3 Vector(System.Random random, float lo, float hi) => new(Uniform(random, lo, hi), Uniform(random, lo, hi), Uniform(random, lo, hi)); + + private static float3 UnitVector(System.Random random) + { + float3 v; + do + { + v = Vector(random, -1.0f, 1.0f); + } + while (dot(v, v) is > 1.0f or < 0.01f); + return normalize(v); + } + + private static float LogUniform(System.Random random, float lo, float hi) => MathF.Exp(Uniform(random, MathF.Log(lo), MathF.Log(hi))); + + private static float Signed(System.Random random, float magnitude) => random.Next(2) == 0 ? magnitude : -magnitude; + + private static readonly float3 None = new(0.0f, 0.0f, 0.0f); + + private static double L1(double[] v) => Math.Abs(v[0]) + Math.Abs(v[1]) + Math.Abs(v[2]); + + // One draw of the stage parameters: every one of them off its identity value, over the ranges the stage + // takes in use (stage-parameter-range): |frequency| 1e-3..10, stretch 1e-2..1e2, |lacunarity| 0.5..3, + // |gain| 0.1..1.2, the last three and frequency with random signs where a sign is meaningful, + // octaveStep nonzero in every component. + internal readonly record struct Stage(SpanStage S, int Octaves, float Lacunarity, float Gain) + { + public static Stage Draw(System.Random random, int maxOctaves = 8, int minOctaves = 1) => new( + new SpanStage + { + frequency = Signed(random, LogUniform(random, 1.0e-3f, 10.0f)), + stretch = LogUniform(random, 1.0e-2f, 1.0e2f), + axis = UnitVector(random) * Uniform(random, 0.5f, 3.0f), + shift = Vector(random, -8.0f, 8.0f), + offset = Vector(random, -8.0f, 8.0f), + octaveStep = new float3(Signed(random, Uniform(random, 0.1f, 3.0f)), Signed(random, Uniform(random, 0.1f, 3.0f)), Signed(random, Uniform(random, 0.1f, 3.0f))), + }, + random.Next(minOctaves, maxOctaves + 1), + Signed(random, Uniform(random, 0.5f, 3.0f)), + Signed(random, Uniform(random, 0.1f, 1.2f))); + + // A draw whose octave coordinates stay under `limit` for every q with |q|_1 <= qL1: the fastest + // octave's |f_o| |M| is capped by rejection. For the derivative checks, where float rounding of the + // coordinate must not swamp a difference quotient. + public static Stage DrawSmooth(System.Random random, float limit, float qL1, int maxOctaves = 8, int minOctaves = 1) + { + while (true) + { + var stage = Draw(random, maxOctaves, minOctaves); + var worst = 0.0; + for (var o = 0; o < stage.Octaves; o++) + worst = Math.Max(worst, Math.Abs(stage.Scale(o)) * (stage.Norm() * qL1 + L1(Components(stage.S.shift))) + L1(Components(stage.S.offset)) + o * L1(Components(stage.S.octaveStep))); + if (worst < limit) + return stage; + } + } + + public SpanNoise Fbm(SpanPath path) => span_fbm(path, S, Octaves, Lacunarity, Gain); + + public SpanNoise Ridged(SpanPath path) => span_ridged(path, S, Octaves, Lacunarity, Gain); + + public SpanNoise Fbm(SpanPath path, int octaves) => span_fbm(path, S, octaves, Lacunarity, Gain); + + public SpanNoise Ridged(SpanPath path, int octaves) => span_ridged(path, S, octaves, Lacunarity, Gain); + + // M = frequency (I + (1/stretch - 1) a a^T) in double, a the normalised axis (none for a zero axis). + public double[,] Matrix() + { + var m = new double[3, 3]; + var a = Components(S.axis); + var length = Math.Sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + m[i, j] = S.frequency * ((i == j ? 1.0 : 0.0) + (length > 0.0 && S.stretch != 1.0f ? (1.0 / S.stretch - 1.0) * a[i] * a[j] / (length * length) : 0.0)); + return m; + } + + // Octave o's noise-space point for the span point q, in double from the same inputs. + public double[] PointD(float3 q, int octave) + { + var m = Matrix(); + var scale = Math.Pow(Lacunarity, octave); + var x = new double[3]; + var qv = Components(q); + var shift = Components(S.shift); + var offset = Components(S.offset); + var step = Components(S.octaveStep); + for (var i = 0; i < 3; i++) + { + var mq = 0.0; + for (var j = 0; j < 3; j++) + mq += m[i, j] * qv[j]; + x[i] = scale * (mq + shift[i]) + offset[i] + octave * step[i]; + } + + return x; + } + + public float3 Point(float3 q, int octave) + { + var x = PointD(q, octave); + return new float3((float)x[0], (float)x[1], (float)x[2]); + } + + // S_o: the magnitudes octave o's coordinate roundings are relative to, plus the span's reach. + public double Magnitude(SpanPath path, int octave) + { + var m = Matrix(); + var qv = Components(path.midpoint); + var mq = new double[3]; + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + mq[i] += m[i, j] * qv[j]; + var scale = Math.Abs(Scale(octave)); + return scale * (L1(mq) + L1(Components(S.shift))) + L1(Components(S.offset)) + octave * L1(Components(S.octaveStep)) + + Math.Sqrt(3.0) * scale * Norm() * path.speed * path.halfLength; + } + + public double MaxMagnitude(SpanPath path) + { + var largest = 0.0; + for (var o = 0; o < Octaves; o++) + largest = Math.Max(largest, Magnitude(path, o)); + return largest; + } + + // Octave o as a stage of its own: one octave at the scaled frequency, shift and offset. + public Stage OneOctave(int octave) => new( + new SpanStage { frequency = S.frequency * (float)Scale(octave), stretch = S.stretch, axis = S.axis, shift = S.shift * (float)Scale(octave), offset = S.offset + (float)octave * S.octaveStep, octaveStep = None }, + 1, 1.0f, 1.0f); + + public double Amplitude(int octave) => Math.Pow(Gain, octave); + + public double Scale(int octave) => Math.Pow(Lacunarity, octave); + + // The spectral norm of M: frequency times the larger of 1 and 1/stretch. + public double Norm() => Math.Abs(S.frequency) * Math.Max(1.0, 1.0 / S.stretch); + } + + private static double[] Components(float3 v) => new double[] { v.x, v.y, v.z }; + + private static SpanPath PathAt(float3 q) => new() { midpoint = q, velocity = None, speed = 0.0f, acceleration = 0.0f, halfLength = 0.0f }; + + // A span through q: velocity v, constant acceleration c of norm `acceleration`, so q(t) = q + v t + c t^2 / 2; + // the speed bound is |v| plus what c can add over halfLength. + internal readonly record struct Span(SpanPath Path, float3 Acceleration) + { + public static Span Draw(System.Random random, float3 q, float halfLength, float acceleration) + { + var velocity = UnitVector(random) * Uniform(random, 0.2f, 3.0f); + return new Span(new SpanPath { midpoint = q, velocity = velocity, speed = length(velocity) + acceleration * halfLength, acceleration = acceleration, halfLength = halfLength }, UnitVector(random) * acceleration); + } + + public float3 At(float t) => Path.midpoint + Path.velocity * t + Acceleration * (0.5f * t * t); + } + + // The operator norm of a symmetric 3x3 matrix (entries in row-major order): the larger |eigenvalue|. + private static double SymmetricNorm(double[] a) + { + var p1 = a[1] * a[1] + a[2] * a[2] + a[5] * a[5]; + var q = (a[0] + a[4] + a[8]) / 3.0; + if (p1 == 0.0) + return Math.Max(Math.Abs(a[0]), Math.Max(Math.Abs(a[4]), Math.Abs(a[8]))); + var p2 = (a[0] - q) * (a[0] - q) + (a[4] - q) * (a[4] - q) + (a[8] - q) * (a[8] - q) + 2.0 * p1; + var s = Math.Sqrt(p2 / 6.0); + var b = new[] { (a[0] - q) / s, a[1] / s, a[2] / s, a[3] / s, (a[4] - q) / s, a[5] / s, a[6] / s, a[7] / s, (a[8] - q) / s }; + var r = Math.Clamp((b[0] * (b[4] * b[8] - b[5] * b[7]) - b[1] * (b[3] * b[8] - b[5] * b[6]) + b[2] * (b[3] * b[7] - b[4] * b[6])) / 2.0, -1.0, 1.0); + var phi = Math.Acos(r) / 3.0; + return Math.Max(Math.Abs(q + 2.0 * s * Math.Cos(phi)), Math.Abs(q + 2.0 * s * Math.Cos(phi + 2.0 * Math.PI / 3.0))); + } + + // The exact Hessian in q of the stage field at span point q (signed per octave for a ridged sum), by the + // chain rule from the double kernel's Hessian: sum over octaves of weight_o f_o^2 M H_o M, with every + // octave point computed in double from the same SpanStage. + private static double[] FieldHessian(Stage stage, float3 q, bool ridged) + { + var m = stage.Matrix(); + var total = new double[9]; + for (var o = 0; o < stage.Octaves; o++) + { + var x = stage.PointD(q, o); + var h = NoiseBoundTests.HessianDouble(x[0], x[1], x[2]); + var weight = stage.Amplitude(o) * stage.Scale(o) * stage.Scale(o) * (ridged ? -Math.Sign(NoiseBoundTests.ValueDouble(x[0], x[1], x[2])) : 1.0); + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + { + var sum = 0.0; + for (var k = 0; k < 3; k++) + for (var l = 0; l < 3; l++) + sum += m[i, k] * h[k * 3 + l] * m[l, j]; + total[i * 3 + j] += weight * sum; + } + } + + return total; + } + + private static bool SameBits(float4 a, float4 b) => + BitConverter.SingleToInt32Bits(a.x) == BitConverter.SingleToInt32Bits(b.x) && BitConverter.SingleToInt32Bits(a.y) == BitConverter.SingleToInt32Bits(b.y) + && BitConverter.SingleToInt32Bits(a.z) == BitConverter.SingleToInt32Bits(b.z) && BitConverter.SingleToInt32Bits(a.w) == BitConverter.SingleToInt32Bits(b.w); + + internal static IEnumerable Points(System.Random random) + { + for (var k = 0; k < 200; k++) + yield return Vector(random, -60.0f, 60.0f); + // The simplex tie set: x = y = z, and integer lattice points. + for (var k = 0; k < 30; k++) + { + var t = Uniform(random, -50.0f, 50.0f); + yield return new float3(t, t, t); + yield return new float3(random.Next(-40, 41), random.Next(-40, 41), random.Next(-40, 41)); + } + } + + /// + /// The exact reference the enclosure tests lean on is the kernel: the double ValueDouble is snoise to + /// within float rounding at small coordinates, so a sign taken from it is the kernel's sign. + /// + [Fact] + public void ExactReferenceIsTheKernel() + { + var random = new System.Random(0xE4AC7); + for (var k = 0; k < 300; k++) + { + var p = Vector(random, -20.0f, 20.0f); + Assert.InRange(NoiseBoundTests.ValueDouble(p.x, p.y, p.z) - snoise(p), -2.0e-4, 2.0e-4); + } + } + + /// + /// At SpanStage.Identity (also with an axis, stretch 1) and zero shift, offset and octaveStep, the field of + /// span_fbm and span_ridged is fbm_grad's and ridged_grad's, bit for bit, for 0 to 20 octaves (the clamp + /// included), every lacunarity and gain drawn, over random and simplex-tie points: any change to the octave + /// loop's order, scaling or accumulation, and any bit the rounding allowances put in the field, fails. + /// + [Fact] + public void SpanStagesAtIdentityAreFbmAndRidged() + { + var random = new System.Random(0x57A6E1); + foreach (var p in Points(random)) + { + var octaves = random.Next(0, 21); + var lacunarity = Uniform(random, 1.4f, 2.6f); + var gain = Uniform(random, 0.3f, 0.8f); + var stage = SpanStage.Identity; + if (random.Next(2) == 1) + stage.axis = UnitVector(random) * 2.0f; + var path = new SpanPath { midpoint = p, velocity = UnitVector(random), speed = 1.0f, acceleration = 0.5f, halfLength = 0.25f }; + var fbm = span_fbm(path, stage, octaves, lacunarity, gain); + var ridged = span_ridged(path, stage, octaves, lacunarity, gain); + Assert.True(SameBits(fbm.field, fbm_grad(p, octaves, lacunarity, gain)), $"span_fbm at {p}, {octaves} octaves: {fbm.field} is not fbm_grad {fbm_grad(p, octaves, lacunarity, gain)}"); + Assert.True(SameBits(ridged.field, ridged_grad(p, octaves, lacunarity, gain)), $"span_ridged at {p}, {octaves} octaves: {ridged.field} is not ridged_grad {ridged_grad(p, octaves, lacunarity, gain)}"); + Assert.Equal(0.0f, fbm.fold); + } + } + + /// + /// The gradient is the derivative of the value through the whole transform: with every parameter off its + /// identity (frequency of either sign, stretch both ways, axis, shift, offset, octaveStep, lacunarity and + /// gain of either sign, 4 to 8 octaves) field.xyz equals the fourth-order central difference of field.w + /// along each axis, within a tolerance built from the third-derivative pin (truncation) and float32 + /// rounding of the coordinates, and both agree with an independent octave sum. A dropped M or lacunarity + /// factor, M applied to the wrong side, a clamp on frequency, stretch or the octaveStep index, or a dropped + /// sign (abs of the scale or the amplitude) moves the field by the gradient itself. + /// + [Theory] + [InlineData(false)] + [InlineData(true)] + public void SpanStageGradientMatchesDifferences(bool ridged) + { + var random = new System.Random(ridged ? 0x6A1D : 0x6A1C); + var worst = 0.0; + var checkedCases = 0; + var spans = 0; + for (var k = 0; k < 6000 && spans < 80; k++) + { + var stage = Stage.DrawSmooth(random, 300.0f, 9.0f, 8, 4); + var q = Vector(random, -3.0f, 3.0f); + // The fold's crease at n = 0 is not differentiable: keep every octave's stencil clear of it. + if (ridged && Enumerable.Range(0, stage.Octaves).Any(o => abs(snoise(stage.Point(q, o))) < 0.15f)) + continue; + spans++; + var span = Span.Draw(random, q, 0.1f, 0.1f); + SpanNoise At(float3 p) + { + var path = span.Path; + path.midpoint = p; + return ridged ? stage.Ridged(path) : stage.Fbm(path); + } + + var centre = At(q); + // The value and gradient from an independent assembly of the octaves: pins shift, offset, octaveStep, + // M, lacunarity and gain themselves, which a value/gradient self-consistency check cannot see. + var matrix = stage.Matrix(); + var referenceValue = 0.0; + var referenceGradient = new double[3]; + for (var o = 0; o < stage.Octaves; o++) + { + var n = snoise_grad(stage.Point(q, o)); + var sign = ridged ? -Math.Sign(n.w) : 1.0; + referenceValue += stage.Amplitude(o) * (ridged ? 1.0 - Math.Abs(n.w) : n.w); + var g = new double[] { n.x, n.y, n.z }; + for (var i = 0; i < 3; i++) + for (var j = 0; j < 3; j++) + referenceGradient[i] += sign * stage.Amplitude(o) * stage.Scale(o) * matrix[i, j] * g[j]; + } + + var scale = 0.0; + for (var o = 0; o < stage.Octaves; o++) + scale += Math.Abs(stage.Amplitude(o) * stage.Scale(o)) * stage.Norm(); + var amplitudes = Enumerable.Range(0, stage.Octaves).Sum(o => Math.Abs(stage.Amplitude(o))); + Assert.True(Math.Abs(referenceValue - centre.field.w) <= 2.0e-3 * (1.0 + amplitudes), $"stage {stage}: the value is {centre.field.w:R}, an independent octave sum gives {referenceValue:R}"); + for (var i = 0; i < 3; i++) + Assert.True(Math.Abs(referenceGradient[i] - centre.field[i]) <= 1.0e-2 * (1.0 + scale), $"stage {stage}: gradient {"xyz"[i]} is {centre.field[i]:R}, an independent octave sum gives {referenceGradient[i]:R}"); + // A step of 0.02 in the noise space of the fastest octave. + var fastest = stage.Norm() * Enumerable.Range(0, stage.Octaves).Max(o => Math.Abs(stage.Scale(o))); + var h = (float)(0.02 / fastest); + for (var axis = 0; axis < 3; axis++) + { + var e = new float3(axis == 0 ? h : 0.0f, axis == 1 ? h : 0.0f, axis == 2 ? h : 0.0f); + double F(float3 p) => At(p).field.w; + var step = (double)(q + e)[axis] - (q - e)[axis]; + var d1 = (F(q + e) - F(q - e)) / step; + var d2 = (F(q + e * 2.0f) - F(q - e * 2.0f)) / ((double)(q + e * 2.0f)[axis] - (q - e * 2.0f)[axis]); + var estimate = (4.0 * d1 - d2) / 3.0; + var tolerance = 4.0e-2 * scale; + var error = Math.Abs(estimate - centre.field[axis]); + worst = Math.Max(worst, error / scale); + Assert.True(error <= tolerance, $"stage {stage}: d/d{"xyz"[axis]} of the value is {estimate:R} by differences and {centre.field[axis]:R} by span_{(ridged ? "ridged" : "fbm")} (tolerance {tolerance:R})"); + checkedCases++; + } + } + + Assert.True(checkedCases >= 120, $"only {checkedCases} derivatives were compared"); + output.WriteLine($"IV-REPORT span gradient ({(ridged ? "ridged" : "fbm")}): {checkedCases} derivatives, worst error {worst:R} of the summed octave gain"); + } + + /// + /// stretch 1, or a zero axis, is the isotropic stage bit for bit whatever the other of the two is; a non-unit + /// axis is its normalisation (the tested axes normalise exactly); a stretch that does apply changes the + /// result. + /// + [Fact] + public void SpanStageStretchAndAxis() + { + var random = new System.Random(0x57E7C4); + for (var k = 0; k < 60; k++) + { + var stage = Stage.DrawSmooth(random, 300.0f, 15.0f, 3, 3); + var q = Vector(random, -5.0f, 5.0f); + var span = Span.Draw(random, q, 0.2f, 0.3f); + var plain = stage with { S = stage.S with { stretch = 1.0f } }; + var noAxis = stage with { S = stage.S with { axis = None, stretch = 3.0f } }; + var reference = plain.Ridged(span.Path); + var isotropic = (plain with { S = plain.S with { axis = None } }).Ridged(span.Path); + var viaNoAxis = noAxis.Ridged(span.Path); + var narrow = (stage with { S = stage.S with { axis = None, stretch = 0.25f } }).Ridged(span.Path); + Assert.True(SameBits(reference.field, isotropic.field) && reference.curvature == isotropic.curvature && reference.fold == isotropic.fold, "stretch 1 with an axis differs from no axis"); + Assert.True(SameBits(isotropic.field, viaNoAxis.field) && isotropic.curvature == viaNoAxis.curvature && isotropic.fold == viaNoAxis.fold, "a zero axis with stretch 3 differs from the isotropic stage"); + Assert.True(SameBits(isotropic.field, narrow.field) && isotropic.curvature == narrow.curvature && isotropic.fold == narrow.fold, "a zero axis with stretch 0.25 differs from the isotropic stage"); + + var unit = stage with { S = stage.S with { axis = new float3(0.0f, 1.0f, 0.0f) } }; + var scaled = stage with { S = stage.S with { axis = new float3(0.0f, 2.0f, 0.0f) } }; + var a = unit.Fbm(span.Path); + var b = scaled.Fbm(span.Path); + Assert.True(SameBits(a.field, b.field) && a.curvature == b.curvature, "a non-unit axis differs from its normalisation"); + var stretched = unit.Fbm(span.Path); + Assert.False(SameBits(stretched.field, (unit with { S = unit.S with { stretch = 1.0f } }).Fbm(span.Path).field), "a stretch of " + unit.S.stretch + " did not change the field"); + } + } + + // The coordinate bands the enclosure tests draw: a large offset (0 keeps the drawn one) lifts S_o through + // the decades; Bucket names the decade a span's largest S_o is in. + private static readonly float[] OffsetScales = { 0.0f, 40.0f, 400.0f, 4.0e3f, 4.0e4f, 4.0e5f, 4.0e6f }; + + private static int Bucket(double magnitude) => magnitude < 1.0e2 ? 0 : magnitude < 1.0e3 ? 1 : magnitude < 1.0e4 ? 2 : magnitude < 1.0e5 ? 3 : magnitude < 1.0e6 ? 4 : 5; + + // byStep lifts the coordinate through octaveStep (octave o adds o octaveStep) instead of offset. + private static Stage Banded(System.Random random, float offsetScale, int octaves, bool byStep) + { + var stage = Stage.Draw(random, octaves); + if (offsetScale > 0.0f) + stage = stage with { S = byStep ? stage.S with { octaveStep = Vector(random, -offsetScale, offsetScale) } : stage.S with { offset = Vector(random, -offsetScale, offsetScale) } }; + return stage; + } + + private static void CheckCurvature(Stage stage, bool ridged, Span span, SpanNoise result, int samples, ref double tightest, ref int checkedPoints) + { + for (var s = 0; s < samples; s++) + { + var t = span.Path.halfLength * (2.0f * s / (samples - 1) - 1.0f); + var norm = SymmetricNorm(FieldHessian(stage, span.At(t), ridged)); + Assert.True(norm <= result.curvature * (1.0 + 1.0e-3), $"stage {stage}, span {span}: the Hessian norm at t = {t:R} is {norm:R}, above curvature {result.curvature:R}"); + tightest = Math.Min(tightest, result.curvature > 0.0 ? 1.0 - norm / result.curvature : 1.0); + checkedPoints++; + } + } + + /// + /// span-bounds-enclose, curvature: over seeded spans the operator norm of the exact field q-Hessian (chain + /// rule from the double kernel's Hessian, every octave point in double, M and the octave scales) at 64 + /// points per span never exceeds curvature, in the local regime (short spans, where the third-derivative + /// term is the bound) and the global one (long spans, where SNOISE_HESSIAN is), and in every coordinate + /// band from S_o under 1e2 to over 1e6, where the float32 kernel is no longer the exact one; at + /// halfLength 0 curvature is the widened local tier, the Frobenius norm of the midpoint Hessians plus + /// e_h, capped at the pin, scaled by amplitude, f_o^2 and |M|^2; and a span through MeasureHessian's + /// witness stays enclosed in 200 directions, which the Frobenius norm at the midpoint alone does not + /// guarantee. + /// + [Theory] + [InlineData(false)] + [InlineData(true)] + public void SpanCurvatureEnclosesTheHessianAlongTheSpan(bool ridged) + { + var random = new System.Random(ridged ? 0xC0DE2 : 0xC0DE1); + var tightest = 1.0; + var checkedPoints = 0; + var buckets = new int[6]; + foreach (var offsetScale in OffsetScales) + foreach (var halfLength in new[] { 0.02f, 0.5f, 8.0f }) + for (var k = 0; k < 8; k++) + { + var stage = Banded(random, offsetScale, 3, k % 2 == 1); + var span = Span.Draw(random, Vector(random, -30.0f, 30.0f), halfLength, Uniform(random, 0.0f, 2.0f)); + var result = ridged ? stage.Ridged(span.Path) : stage.Fbm(span.Path); + buckets[Bucket(stage.MaxMagnitude(span.Path))]++; + CheckCurvature(stage, ridged, span, result, 64, ref tightest, ref checkedPoints); + } + + Assert.True(buckets.All(count => count >= 3), $"the coordinate bands drawn are {string.Join(", ", buckets)} spans: a band is not reached"); + + // halfLength 0: the widened local tier. + for (var k = 0; k < 40; k++) + { + var stage = Stage.DrawSmooth(random, 100.0f, 90.0f, 3); + var q = Vector(random, -30.0f, 30.0f); + var span = Span.Draw(random, q, 0.0f, 1.0f); + var result = ridged ? stage.Ridged(span.Path) : stage.Fbm(span.Path); + var expected = 0.0; + for (var o = 0; o < stage.Octaves; o++) + { + var h = snoise_hessian(stage.Point(q, o)); + var frobenius = Math.Sqrt(Enumerable.Range(0, 9).Sum(i => (double)h[i / 3][i % 3] * h[i / 3][i % 3])); + var slack = Math.Pow(2.0, -10) + SNOISE_THIRD * Math.Pow(2.0, -20) * stage.Magnitude(span.Path, o); + expected += Math.Abs(stage.Amplitude(o)) * stage.Scale(o) * stage.Scale(o) * stage.Norm() * stage.Norm() * Math.Min(SNOISE_HESSIAN, frobenius + slack); + } + + Assert.InRange(result.curvature, expected * (1.0 - 1.0e-3), expected * (1.0 + 1.0e-3)); + } + + // Through the Hessian witness: one octave at the identity transform, the span's midpoint 0.1 to 0.5 away, + // moving toward the witness at speed 1, so the witness lies on the span. + var witness = new float3(-13.7920685f, -9.672134f, 61.563934f); + var identity = new Stage(SpanStage.Identity, 1, 2.0f, 0.5f); + var through = 0.0; + for (var k = 0; k < 200; k++) + { + var u = UnitVector(random); + var distance = Uniform(random, 0.1f, 0.5f); + var span = new Span(new SpanPath { midpoint = witness + u * distance, velocity = -u, speed = 1.0f, acceleration = 0.0f, halfLength = 0.6f }, None); + var result = ridged ? identity.Ridged(span.Path) : identity.Fbm(span.Path); + CheckCurvature(identity, ridged, span, result, 64, ref tightest, ref checkedPoints); + through = Math.Max(through, SymmetricNorm(FieldHessian(identity, witness, ridged))); + } + + Assert.True(through > 40.0, $"the witness Hessian norm is {through:R}: the through-the-witness spans do not reach the curvature"); + output.WriteLine($"IV-REPORT span curvature ({(ridged ? "ridged" : "fbm")}): {checkedPoints} points enclosed, bands {string.Join("/", buckets)}, least relative slack {tightest:R}, witness norm {through:R}"); + } + + /// + /// local-tier-coefficients-unpinned: a fixed span (found by an audit, kept) at SpanStage.Identity, one + /// octave, where the Hessian's operator norm at the end of the span (11.768) exceeds the local tier built + /// with half of SNOISE_THIRD's term (about 10.1) and the exact norm along the 64 sampled points stays + /// under curvature (12.526 before the allowance). + /// + [Theory] + [InlineData(false)] + [InlineData(true)] + public void SpanCurvatureEnclosesThePinnedRankOneSpan(bool ridged) + { + var stage = new Stage(SpanStage.Identity, 1, 2.0f, 0.5f); + var span = new Span(new SpanPath { midpoint = new float3(144.93297f, -286.08800f, -53.59360f), velocity = new float3(-0.02139f, 0.17122f, -0.98500f), speed = 1.0f, acceleration = 0.0f, halfLength = 0.01f }, None); + var result = ridged ? stage.Ridged(span.Path) : stage.Fbm(span.Path); + var tightest = 1.0; + var points = 0; + CheckCurvature(stage, ridged, span, result, 64, ref tightest, ref points); + var end = SymmetricNorm(FieldHessian(stage, span.At(span.Path.halfLength), ridged)); + Assert.True(end > 10.5 && result.curvature >= end, $"the end-of-span norm is {end:R} and curvature {result.curvature:R}: the span no longer pins the local tier"); + } + + // Octave o's amplitude-weighted value (n_o gain^o, or gain^o (1 - |n_o|) for ridged) at `point`, read from + // production: the difference of span_fbm's (span_ridged's) field at o + 1 and at o octaves. + private static double[] OctaveValues(Stage stage, float3 point, bool ridged) + { + var path = PathAt(point); + var values = new double[stage.Octaves]; + var previous = 0.0; + for (var k = 1; k <= stage.Octaves; k++) + { + var total = ridged ? stage.Ridged(path, k).field.w : stage.Fbm(path, k).field.w; + values[k - 1] = total - previous; + previous = total; + } + + return values; + } + + // The departure of the octave sum from its midpoint branch, sum_o gain^o (s_o n_o - |n_o|) with s_o the + // sign of n_o at the midpoint, peaked over `samples` points of the span: Float for the field span_ridged + // and span_fbm themselves evaluate (read octave by octave through OctaveValues), Exact for the double + // kernel. Rounding bounds what the float differences of the accumulating sums can lose. + private static (double Float, double Exact, double Rounding) BranchDeparture(Stage stage, Span span, int samples) + { + var amplitudes = new float[stage.Octaves]; + var weight = 1.0f; + var sum = 0.0; + for (var o = 0; o < stage.Octaves; o++) + { + amplitudes[o] = weight; + sum += Math.Abs(weight); + weight *= stage.Gain; + } + + var middle = OctaveValues(stage, span.Path.midpoint, false); + var signs = Enumerable.Range(0, stage.Octaves).Select(o => Math.Sign(middle[o]) * Math.Sign(amplitudes[o])).ToArray(); + var peakFloat = 0.0; + var peakExact = 0.0; + for (var s = 0; s < samples; s++) + { + var t = span.Path.halfLength * (2.0f * s / (samples - 1) - 1.0f); + var point = span.At(t); + var n = OctaveValues(stage, point, false); + var r = OctaveValues(stage, point, true); + var departureFloat = 0.0; + var departureExact = 0.0; + for (var o = 0; o < stage.Octaves; o++) + { + departureFloat += signs[o] * n[o] - (amplitudes[o] - r[o]); + var x = stage.PointD(point, o); + var exact = NoiseBoundTests.ValueDouble(x[0], x[1], x[2]); + departureExact += stage.Amplitude(o) * (signs[o] * exact - Math.Abs(exact)); + } + + peakFloat = Math.Max(peakFloat, Math.Abs(departureFloat)); + peakExact = Math.Max(peakExact, Math.Abs(departureExact)); + } + + return (peakFloat, peakExact, stage.Octaves * Math.Pow(2.0, -22) * sum); + } + + // Newton steps from q to the exact kernel's n = 0 (the float gradient steers, the double value decides). + private static float3 ProjectToZero(float3 q) + { + for (var iteration = 0; iteration < 4; iteration++) + { + var n = snoise_grad(q); + var gg = (double)n.x * n.x + (double)n.y * n.y + (double)n.z * n.z; + if (gg < 1.0e-12) + break; + var v = NoiseBoundTests.ValueDouble(q.x, q.y, q.z); + q = new float3((float)(q.x - v * n.x / gg), (float)(q.y - v * n.y / gg), (float)(q.z - v * n.z / gg)); + } + + return q; + } + + /// + /// span-bounds-enclose, fold: for span_ridged, the value's departure from the midpoint branch (each + /// octave's gain^o (s n - |n|), s the sign of n at the midpoint, summed) never exceeds fold at 64 points of + /// every span, measured twice: for the float field span_ridged itself evaluates at the path point, and for + /// the exact octave sum (double kernel); in every coordinate band from S_o under 1e2 to over 1e6. fold is + /// positive on spans that do cross zero (and the departure there is not trivially zero), exactly 0 for + /// span_fbm and when no octave can reach zero. + /// + [Fact] + public void SpanFoldEnclosesTheBranchDeviation() + { + var random = new System.Random(0xF01D); + var crossing = 0; + var largest = 0.0; + var tightestFloat = 1.0; + var tightestExact = 1.0; + var buckets = new int[6]; + foreach (var offsetScale in OffsetScales) + for (var k = 0; k < 60; k++) + { + var stage = Banded(random, offsetScale, 3, k / 2 % 2 == 1); + var halfLength = new[] { 0.02f, 0.1f, 0.5f, 2.0f }[random.Next(4)]; + // Draw midpoints with small noise values so spans cross zero, as well as arbitrary ones. + var q = Vector(random, -30.0f, 30.0f); + if (k % 2 == 0) + { + var best = q; + var smallest = float.MaxValue; + for (var trial = 0; trial < 40; trial++) + { + var candidate = Vector(random, -30.0f, 30.0f); + var value = abs(snoise(stage.Point(candidate, 0))); + if (value < smallest) + (smallest, best) = (value, candidate); + } + + q = best; + } + + var span = Span.Draw(random, q, halfLength, Uniform(random, 0.0f, 2.0f)); + buckets[Bucket(stage.MaxMagnitude(span.Path))]++; + var fold = stage.Ridged(span.Path).fold; + Assert.Equal(0.0f, stage.Fbm(span.Path).fold); + var (peakFloat, peakExact, rounding) = BranchDeparture(stage, span, 64); + Assert.True(peakFloat <= fold * (1.0 + 1.0e-3) + 1.0e-6 + rounding, $"stage {stage}, span {span}: the float branch departure is {peakFloat:R}, above fold {fold:R}"); + Assert.True(peakExact <= fold * (1.0 + 1.0e-3) + 1.0e-6, $"stage {stage}, span {span}: the exact branch departure is {peakExact:R}, above fold {fold:R}"); + if (fold > 0.0) + crossing++; + largest = Math.Max(largest, Math.Max(peakFloat, peakExact)); + if (fold > 0.0 && peakFloat > 0.0) + tightestFloat = Math.Min(tightestFloat, peakFloat / fold); + if (fold > 0.0 && peakExact > 0.0) + tightestExact = Math.Min(tightestExact, peakExact / fold); + } + + Assert.True(buckets.All(count => count >= 3), $"the coordinate bands drawn are {string.Join(", ", buckets)} spans: a band is not reached"); + Assert.True(crossing >= 100, $"only {crossing} of {OffsetScales.Length * 60} spans had a positive fold"); + Assert.True(largest > 0.1, $"the largest branch departure drawn is {largest:R}: the check has no teeth"); + output.WriteLine($"IV-REPORT span fold: {crossing} spans with fold > 0, bands {string.Join("/", buckets)}, largest departure {largest:R}, tightest departure / fold {tightestFloat:R} (float) {tightestExact:R} (exact)"); + + // An octave that cannot reach zero: a midpoint where |n| is large and a short span give fold exactly 0. + var calm = new Stage(SpanStage.Identity, 1, 2.0f, 0.5f); + var found = 0; + for (var k = 0; k < 400 && found < 20; k++) + { + var q = Vector(random, -30.0f, 30.0f); + if (abs(snoise(q)) < 0.6f) + continue; + found++; + Assert.Equal(0.0f, calm.Ridged(new SpanPath { midpoint = q, velocity = new float3(1.0f, 0.0f, 0.0f), speed = 1.0f, acceleration = 0.0f, halfLength = 0.01f }).fold); + } + + Assert.True(found >= 5, $"only {found} calm midpoints found"); + } + + /// + /// The Gl reach term over a long span: a straight path from rest along -s grad n (s the sign of n at the + /// midpoint), identity stage, one octave, half-length 6, found by an audit and kept. The path reaches + /// n = 0 and the branch departure (about 0.387) is covered only if the gradient bound grows by + /// Hl nu halfLength over the span; a reach that shrinks with halfLength (nu / halfLength) puts fold at + /// 0.384 and fails here, as does any reach right only for half-lengths up to sqrt 2. + /// + [Fact] + public void SpanFoldEnclosesTheLongPathFromRest() + { + var stage = new Stage(SpanStage.Identity, 1, 2.0f, 0.5f); + const float halfLength = 6.0f; + const float acceleration = 0.0055555557f; + var span = new Span(new SpanPath { midpoint = new float3(7.634474f, 24.228996f, -3.7595012f), velocity = None, speed = acceleration * halfLength, acceleration = acceleration, halfLength = halfLength }, new float3(-0.9375727f, -0.07116994f, 0.3404294f) * acceleration); + var fold = stage.Ridged(span.Path).fold; + var (departureFloat, departureExact, rounding) = BranchDeparture(stage, span, 129); + Assert.True(Math.Max(departureFloat, departureExact) > 0.3, $"the branch departure is {Math.Max(departureFloat, departureExact):R}: the span no longer crosses zero"); + Assert.True(departureFloat <= fold * (1.0 + 1.0e-3) + 1.0e-6 + rounding, $"the float branch departure is {departureFloat:R}, above fold {fold:R}"); + Assert.True(departureExact <= fold * (1.0 + 1.0e-3) + 1.0e-6, $"the exact branch departure is {departureExact:R}, above fold {fold:R}"); + } + + /// + /// A midpoint within float noise of n = 0, on a path that does not move: halfLength 0 (a point), and + /// halfLength 1 under a speed bound far above the path's motion (speed is an upper bound, so that is a + /// legal SpanPath, and composed chains pass loose ones). The exact kernel's sign at such a midpoint is + /// opposite to the float one in about a fifth of the draws, so fold must still cover the exact + /// departure there: a fold forced to 0 at halfLength 0, or an S_o whose reach term drives e_n below + /// zero under the loose bound, leaves it 0 and fails. span_fbm's fold is 0 throughout. + /// Near the origin S_o is tiny (scales 1e-4 and 1e-2 of the coordinate), and only the value allowance's + /// absolute term 2^-14 carries the kernel's own rounding: the exact departure there is the coordinate's + /// rounding times the gradient (1e-11 to 1e-9), so the exact check's additive tolerance is 1e-13, under it. + /// A larger tolerance absorbs a dropped absolute term whole. + /// + [Theory] + [InlineData(false)] + [InlineData(true)] + public void SpanFoldEnclosesTheExactBranchAtANearZeroMidpoint(bool loose) + { + var random = new System.Random(loose ? 0x100E : 0x4A11); + var stage = new Stage(SpanStage.Identity, 1, 2.0f, 0.5f); + var crossing = 0; + foreach (var scale in new[] { 1.0e-4f, 1.0e-2f, 30.0f, 300.0f, 3000.0f }) + for (var k = 0; k < 300; k++) + { + var q = ProjectToZero(Vector(random, -scale, scale)); + var speed = loose ? 4.0f * (abs(q.x) + abs(q.y) + abs(q.z) + 20.0f) : 0.0f; + var span = new Span(new SpanPath { midpoint = q, velocity = None, speed = speed, acceleration = 0.0f, halfLength = loose ? 1.0f : 0.0f }, None); + var fold = stage.Ridged(span.Path).fold; + var (departureFloat, departureExact, rounding) = BranchDeparture(stage, span, 2); + Assert.Equal(0.0f, stage.Fbm(span.Path).fold); + Assert.True(departureExact <= fold * (1.0 + 1.0e-3) + 1.0e-13, $"midpoint {q}, speed {speed:R}: the exact branch departure is {departureExact:R}, above fold {fold:R}"); + Assert.True(departureFloat <= fold * (1.0 + 1.0e-3) + 1.0e-9 + rounding, $"midpoint {q}, speed {speed:R}: the float branch departure is {departureFloat:R}, above fold {fold:R}"); + if (departureExact > 0.0) + crossing++; + } + + Assert.True(crossing >= 80, $"only {crossing} of 1500 midpoints had an exact sign opposite to the float one: the check has no teeth"); + } + + /// + /// The step term of S_o, alone: an octaveStep of random direction and magnitude 1e3 to 1e5 (log-uniform) at + /// the identity stage, two octaves, the midpoint moved until octave 1's coordinate (2 q + step) sits on + /// the kernel's n = 0 (a Newton projection of that coordinate, then q = (x - step) / 2). There the + /// coordinate's float rounding (ulp 0.004 to 0.008) is what separates the float kernel from the exact one, + /// and only |o octaveStep|_1 in S_o carries it: the exact branch departure stays within fold, span_fbm's + /// fold is 0, and at least 100 draws have an exact sign opposite to the float one. Without the step term + /// fold is the 2^-14 and the small-coordinate rounding alone, and the departure passes it. + /// + [Fact] + public void SpanFoldEnclosesTheExactBranchAtLargeOctaveSteps() + { + var random = new System.Random(0x57E9); + var crossing = 0; + for (var k = 0; k < 600; k++) + { + var step = UnitVector(random) * LogUniform(random, 1.0e3f, 1.0e5f); + var transform = SpanStage.Identity; + transform.octaveStep = step; + var stage = new Stage(transform, 2, 2.0f, 0.5f); + var q = (ProjectToZero(Vector(random, -30.0f, 30.0f) + step) - step) * 0.5f; + var span = new Span(new SpanPath { midpoint = q, velocity = None, speed = 0.0f, acceleration = 0.0f, halfLength = 0.0f }, None); + var fold = stage.Ridged(span.Path).fold; + var (_, departureExact, _) = BranchDeparture(stage, span, 2); + Assert.Equal(0.0f, stage.Fbm(span.Path).fold); + Assert.True(departureExact <= fold * (1.0 + 1.0e-3) + 1.0e-9, $"octaveStep {step}, midpoint {q}: the exact branch departure is {departureExact:R}, above fold {fold:R}"); + if (departureExact > 0.0) + crossing++; + } + + Assert.True(crossing >= 100, $"only {crossing} of 600 midpoints had an exact sign opposite to the float one: the check has no teeth"); + } + + /// + /// The allowance a span computes covers the float kernel's read at every point of its path: the identity + /// stage, the midpoint within |q|_inf 1, a velocity of random direction and speed 1 to 1e3 (log-uniform), + /// a halfLength 1 to 1e3, so path points lie out to about 1e6. At 16 points of the straight path + /// q + v t the value, the gradient's length and the Hessian's Frobenius norm of the float kernel are + /// within math.span_slack(math.span_rounding(...)) of the exact kernel's, the reach term of S_o included. + /// Teeth: the largest value error exceeds the allowance computed with nu = 0 by more than 10 times. + /// + [Fact] + public void SpanAllowanceCoversReadsAlongTheSpan() + { + var random = new System.Random(0x5EA4); + double worstValue = 0.0, worstGradient = 0.0, worstHessian = 0.0, teeth = 0.0; + for (var k = 0; k < 200; k++) + { + var q = Vector(random, -1.0f, 1.0f); + var speed = LogUniform(random, 1.0f, 1.0e3f); + var velocity = UnitVector(random) * speed; + var halfLength = LogUniform(random, 1.0f, 1.0e3f); + var slack = span_slack(span_rounding(1.0f, q, SpanStage.Identity, None, speed, halfLength)); + var midpointSlack = span_slack(span_rounding(1.0f, q, SpanStage.Identity, None, 0.0f, halfLength)); + for (var j = 0; j < 16; j++) + { + var x = q + velocity * (halfLength * (j / 7.5f - 1.0f)); + var value = NoiseBoundTests.ValueDouble(x.x, x.y, x.z); + var gradient = NoiseBoundTests.GradDouble(x.x, x.y, x.z); + var hessian = NoiseBoundTests.HessianDouble(x.x, x.y, x.z); + var read = snoise_grad(x); + var h = snoise_hessian(x); + var valueError = Math.Abs(read.w - value); + var gradientError = Math.Sqrt(Math.Pow(read.x - gradient[0], 2) + Math.Pow(read.y - gradient[1], 2) + Math.Pow(read.z - gradient[2], 2)); + var hessianError = Math.Sqrt(Math.Pow(h._m00 - hessian[0], 2) + Math.Pow(h._m01 - hessian[1], 2) + Math.Pow(h._m02 - hessian[2], 2) + + Math.Pow(h._m10 - hessian[3], 2) + Math.Pow(h._m11 - hessian[4], 2) + Math.Pow(h._m12 - hessian[5], 2) + + Math.Pow(h._m20 - hessian[6], 2) + Math.Pow(h._m21 - hessian[7], 2) + Math.Pow(h._m22 - hessian[8], 2)); + Assert.True(valueError <= slack.x, $"midpoint {q}, speed {speed:R}, halfLength {halfLength:R}, point {x}: the value error {valueError:R} is past the allowance {slack.x:R}"); + Assert.True(gradientError <= slack.y, $"midpoint {q}, speed {speed:R}, halfLength {halfLength:R}, point {x}: the gradient error {gradientError:R} is past the allowance {slack.y:R}"); + Assert.True(hessianError <= slack.z, $"midpoint {q}, speed {speed:R}, halfLength {halfLength:R}, point {x}: the Hessian error {hessianError:R} is past the allowance {slack.z:R}"); + worstValue = Math.Max(worstValue, valueError / slack.x); + worstGradient = Math.Max(worstGradient, gradientError / slack.y); + worstHessian = Math.Max(worstHessian, hessianError / slack.z); + teeth = Math.Max(teeth, valueError / midpointSlack.x); + } + } + + output.WriteLine($"IV-REPORT span allowance: largest fraction of e_n {worstValue:F3}, e_g {worstGradient:F3}, e_h {worstHessian:F3}; largest value error over the allowance without the reach {teeth:F1}"); + Assert.True(teeth > 10.0, $"the largest value error is only {teeth:F1} times the allowance without the reach: the check has no teeth"); + } + + /// + /// The fold's acceleration term, alone, at the identity stage and under a transform (frequency 2.5, stretch + /// 0.5, shift and offset): the midpoint velocity is zero and the acceleration points along the gradient + /// (in q), against the sign of n, so n reaches zero and crosses it on the way to the span's ends by + /// acceleration only. Without the acceleration term, with the gradient bound under the gradient the path + /// reaches, or with the transform's norm f_o |M| misplaced in it, the departure from the midpoint branch + /// exceeds fold. + /// + [Theory] + [InlineData(false)] + [InlineData(true)] + public void SpanFoldCoversAccelerationAlone(bool transformed) + { + var random = new System.Random(transformed ? 0xACCE2 : 0xACCE1); + var stage = transformed + ? new Stage(new SpanStage { frequency = 2.5f, stretch = 0.5f, axis = new float3(0.0f, 1.0f, 0.0f), shift = new float3(0.3f, -1.2f, 2.1f), offset = new float3(5.0f, -3.0f, 7.0f), octaveStep = None }, 1, 2.0f, 0.5f) + : new Stage(SpanStage.Identity, 1, 2.0f, 0.5f); + var m = stage.Matrix(); + var cases = 0; + var crossings = 0; + var tightest = double.MaxValue; + for (var trial = 0; trial < 400_000 && cases < 150; trial++) + { + var q = Vector(random, -60.0f, 60.0f); + var n = snoise_grad(stage.Point(q, 0)); + var gradient = new float3((float)(m[0, 0] * n.x + m[0, 1] * n.y + m[0, 2] * n.z), (float)(m[1, 0] * n.x + m[1, 1] * n.y + m[1, 2] * n.z), (float)(m[2, 0] * n.x + m[2, 1] * n.y + m[2, 2] * n.z)); + var halfLength = Uniform(random, 0.05f, 0.15f); + var acceleration = Uniform(random, 4.0f, 12.0f); + // n at the midpoint close enough to zero that the acceleration alone carries it across. + if (length(gradient) < 1.5f || abs(n.w) > 0.4f * length(gradient) * acceleration * halfLength * halfLength * 0.5f) + continue; + var c = -(float)Math.Sign(n.w) * acceleration * normalize(gradient); + var span = new Span(new SpanPath { midpoint = q, velocity = None, speed = acceleration * halfLength, acceleration = acceleration, halfLength = halfLength }, c); + var fold = stage.Ridged(span.Path).fold; + var departure = 0.0; + for (var s = 0; s < 64; s++) + { + var value = (double)snoise(stage.Point(span.At(halfLength * (2.0f * s / 63 - 1.0f)), 0)); + departure = Math.Max(departure, Math.Abs(Math.Sign(n.w) * value - Math.Abs(value))); + } + + if (departure > 0.0) + crossings++; + Assert.True(departure <= fold * (1.0 + 1.0e-3), $"q {q}, acceleration {acceleration:R}, half-length {halfLength:R}: the branch departure is {departure:R}, above fold {fold:R}"); + if (departure > 0.0) + tightest = Math.Min(tightest, departure / fold); + cases++; + } + + Assert.True(crossings >= 100, $"only {crossings} of {cases} paths crossed zero by acceleration alone"); + output.WriteLine($"IV-REPORT span fold, acceleration only ({(transformed ? "transformed" : "identity")}): {crossings} of {cases} paths cross zero, tightest departure / fold {tightest:R}"); + } + + /// + /// The fold's velocity term under a stretch: the velocity runs along the stretched axis (M scales it by + /// 1/stretch), the midpoint is where n reaches zero inside the span, so the departure is about twice + /// |grad n . w| halfLength and a velocity stretched the wrong way (or not at all) puts fold under it. + /// + [Theory] + [InlineData(0.25f)] + [InlineData(0.5f)] + [InlineData(4.0f)] + public void SpanFoldCoversTheStretchedVelocity(float stretch) + { + var random = new System.Random(0x57E1C + (int)(stretch * 8.0f)); + var cases = 0; + var crossings = 0; + var tightest = double.MaxValue; + for (var trial = 0; trial < 400_000 && cases < 60; trial++) + { + var axis = UnitVector(random); + var stage = new Stage(new SpanStage { frequency = Uniform(random, 0.5f, 2.0f), stretch = stretch, axis = axis, shift = Vector(random, -4.0f, 4.0f), offset = Vector(random, -4.0f, 4.0f), octaveStep = None }, 1, 2.0f, 0.5f); + var q = Vector(random, -30.0f, 30.0f); + var velocity = axis * Uniform(random, 0.5f, 2.0f); + var halfLength = 0.05f; + var path = new SpanPath { midpoint = q, velocity = velocity, speed = length(velocity), acceleration = 0.0f, halfLength = halfLength }; + var n = snoise_grad(stage.Point(q, 0)); + var m = stage.Matrix(); + var w = new double[3]; + for (var i = 0; i < 3; i++) + w[i] = m[i, 0] * velocity.x + m[i, 1] * velocity.y + m[i, 2] * velocity.z; + var along = Math.Abs(n.x * w[0] + n.y * w[1] + n.z * w[2]); + if (along < 2.0 || Math.Abs(n.w) > 0.5 * along * halfLength) + continue; + var fold = stage.Ridged(path).fold; + var departure = 0.0; + for (var s = 0; s < 64; s++) + { + var t = halfLength * (2.0f * s / 63 - 1.0f); + var value = (double)snoise(stage.Point(q + velocity * t, 0)); + departure = Math.Max(departure, Math.Abs(Math.Sign(n.w) * value - Math.Abs(value))); + } + + if (departure > 0.0) + crossings++; + Assert.True(departure <= fold * (1.0 + 1.0e-3), $"stage {stage}, q {q}: the branch departure is {departure:R}, above fold {fold:R}"); + if (departure > 0.0) + tightest = Math.Min(tightest, departure / fold); + cases++; + } + + Assert.True(crossings >= 30, $"only {crossings} of {cases} paths crossed zero along the stretched velocity"); + output.WriteLine($"IV-REPORT span fold, stretched velocity {stretch}: {crossings} of {cases} paths cross zero, tightest departure / fold {tightest:R}"); + } + + /// + /// Both bounds are sums over the octaves, weighted by |gain|^o: for a stage of several octaves, + /// curvature and fold equal the weighted sum of the bounds of each octave taken as a stage of its own, + /// to within the rounding of forming the octave's coordinate another way. A weight misplaced (gain + /// instead of |gain|, a division for a product), a dropped octave or a mis-scaled octave fails. + /// + [Fact] + public void SpanBoundsAreSumsOverTheOctaves() + { + var random = new System.Random(0x0C7A5); + var compared = 0; + for (var k = 0; k < 80; k++) + { + var stage = Stage.DrawSmooth(random, 300.0f, 90.0f, 5, 2); + var span = Span.Draw(random, Vector(random, -30.0f, 30.0f), new[] { 0.02f, 0.1f, 0.5f }[k % 3], Uniform(random, 0.0f, 2.0f)); + var whole = stage.Ridged(span.Path); + double curvature = 0.0, fold = 0.0; + for (var o = 0; o < stage.Octaves; o++) + { + var one = stage.OneOctave(o).Ridged(span.Path); + var weight = Math.Abs(stage.Amplitude(o)); + curvature += weight * one.curvature; + fold += weight * one.fold; + } + + Assert.InRange(whole.curvature, curvature * (1.0 - 5.0e-3) - 1.0e-4, curvature * (1.0 + 5.0e-3) + 1.0e-4); + Assert.InRange(whole.fold, fold * (1.0 - 5.0e-3) - 1.0e-4, fold * (1.0 + 5.0e-3) + 1.0e-4); + if (fold > 1.0e-3) + compared++; + } + + Assert.True(compared >= 20, $"only {compared} of 80 stages had a fold to compare"); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/VectorEqualityTests.cs b/packages/cultmath/tests/CultMath.Tests/VectorEqualityTests.cs new file mode 100644 index 00000000..9335784d --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/VectorEqualityTests.cs @@ -0,0 +1,583 @@ +using System; +using CultMath; +using Xunit; + +namespace CultMath.Tests; + +// Hand-verified on hands/adopt-stryker: weakening float3.Equals from `&&` to `||` passes the +// whole existing suite. The same shape of Equals/GetHashCode, ==/!=, and /<=/>= exists (with +// no shared base type) across float2/3/4, double2/3, int2/3/4, bool2/3/4, quaternion, +// float2x2 and float3x3. These tests are data-driven per component position rather than one +// method per type: each type supplies a base value and, per component index, a value that +// differs at exactly that index and agrees everywhere else, plus (for the four ordered numeric +// families) a left/right pair whose relational result differs per component. bool2/3/4 and +// quaternion have no ordering operators and are not included in the comparison-operator cases. +// float2x2/float3x3 have no == / != operators (Equals and GetHashCode only) and are covered +// separately, at row granularity. +public sealed class VectorEqualityTests +{ + // ---- shared, type-agnostic assertions ------------------------------------------------- + + private static void AssertEqualsAndHashCodeContract(T a, T b, bool expectedEqual, string label) + where T : IEquatable + { + Assert.True(a.Equals(b) == expectedEqual, $"{label}: a.Equals(b) expected {expectedEqual}"); + Assert.True(b.Equals(a) == expectedEqual, $"{label}: b.Equals(a) expected {expectedEqual} (symmetry)"); + if (expectedEqual) + { + Assert.True(a.GetHashCode() == b.GetHashCode(), $"{label}: equal values must share a hash code"); + } + } + + private static void AssertElementwiseEqualityOperators( + TLeft a, + TRight b, + int count, + Func expectedEqualAt, + Func eq, + Func neq, + Func at, + string label) + { + var eqResult = eq(a, b); + var neqResult = neq(a, b); + for (var i = 0; i < count; i++) + { + var expectedEqual = expectedEqualAt(i); + Assert.True(at(eqResult, i) == expectedEqual, $"{label}: == component {i} expected {expectedEqual}"); + Assert.True(at(neqResult, i) == !expectedEqual, $"{label}: != component {i} expected {!expectedEqual}"); + } + } + + private static void AssertElementwiseComparisonOperators( + TLeft left, + TRight right, + double[] leftVals, + double[] rightVals, + Func lt, + Func gt, + Func le, + Func ge, + Func at, + string label) + { + var ltResult = lt(left, right); + var gtResult = gt(left, right); + var leResult = le(left, right); + var geResult = ge(left, right); + for (var i = 0; i < leftVals.Length; i++) + { + var less = leftVals[i] < rightVals[i]; + var greater = leftVals[i] > rightVals[i]; + Assert.True(at(ltResult, i) == less, $"{label}: < component {i} (left={leftVals[i]}, right={rightVals[i]})"); + Assert.True(at(gtResult, i) == greater, $"{label}: > component {i} (left={leftVals[i]}, right={rightVals[i]})"); + Assert.True(at(leResult, i) == !greater, $"{label}: <= component {i} (left={leftVals[i]}, right={rightVals[i]})"); + Assert.True(at(geResult, i) == !less, $"{label}: >= component {i} (left={leftVals[i]}, right={rightVals[i]})"); + } + } + + // ---- float2 ----------------------------------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + public void Float2EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new float2(3.0f, -7.0f); + var b = a; + b[index] += 5.0f; + + AssertEqualsAndHashCodeContract(a, a, true, "float2 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"float2 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 2, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float2 vector==vector"); + + // Scalar overloads: a scalar equal to exactly one component, on both operand sides. + var scalar = a[index]; + AssertElementwiseEqualityOperators( + a, scalar, 2, i => a[i] == scalar, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float2 vector==scalar"); + AssertElementwiseEqualityOperators( + scalar, a, 2, i => a[i] == scalar, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float2 scalar==vector"); + } + + [Fact] + public void Float2ComparisonOperatorsDifferPerComponent() + { + var left = new float2(1.0f, 5.0f); + var right = new float2(2.0f, 3.0f); + var leftVals = new double[] { 1.0, 5.0 }; + var rightVals = new double[] { 2.0, 3.0 }; + + AssertElementwiseComparisonOperators( + left, right, leftVals, rightVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float2 vector-vector"); + + const float scalar = 2.0f; + AssertElementwiseComparisonOperators( + left, scalar, leftVals, new double[] { scalar, scalar }, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float2 vector-scalar"); + AssertElementwiseComparisonOperators( + scalar, left, new double[] { scalar, scalar }, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float2 scalar-vector"); + + // A value compared against an exact copy of itself: every component ties. This is the + // complementary fixture to the no-tie one above. A tie is where < and <= (or > and >=) + // actually disagree, so it catches a strict/non-strict boundary swap (e.g. < mutated to + // <=) that a fixture with no equal components cannot: unlike a threshold compared against + // an arbitrary float, an exact self-tie is neither rare nor equivalent here, since these + // are general-purpose comparison operators (bounds/containment checks compare against + // literal endpoints routinely, as CultMath's own touching-edges rect test does). + AssertElementwiseComparisonOperators( + left, left, leftVals, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float2 tied vector-vector"); + + // The scalar overloads need their own tie: a uniform vector against a scalar equal to + // every component, so every component of the vector-scalar and scalar-vector overloads + // ties too (the vector-vector tie above does not cover them). + var uniform = new float2(4.0f, 4.0f); + var uniformVals = new double[] { 4.0, 4.0 }; + AssertElementwiseComparisonOperators( + uniform, 4.0f, uniformVals, uniformVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float2 tied vector-scalar"); + AssertElementwiseComparisonOperators( + 4.0f, uniform, uniformVals, uniformVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float2 tied scalar-vector"); + } + + // ---- float3 ----------------------------------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + public void Float3EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new float3(3.0f, -7.0f, 4.5f); + var b = a; + b[index] += 5.0f; + + AssertEqualsAndHashCodeContract(a, a, true, "float3 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"float3 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 3, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float3 vector==vector"); + + var scalar = a[index]; + AssertElementwiseEqualityOperators( + a, scalar, 3, i => a[i] == scalar, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float3 vector==scalar"); + AssertElementwiseEqualityOperators( + scalar, a, 3, i => a[i] == scalar, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float3 scalar==vector"); + } + + [Fact] + public void Float3ComparisonOperatorsDifferPerComponent() + { + // No component is tied: a tie makes strict < and strict > agree (both false), which + // would hide a direction-flip mutation (< swapped for >) at that component. + var left = new float3(1.0f, 5.0f, 7.0f); + var right = new float3(2.0f, 3.0f, 4.0f); + var leftVals = new double[] { 1.0, 5.0, 7.0 }; + var rightVals = new double[] { 2.0, 3.0, 4.0 }; + + AssertElementwiseComparisonOperators( + left, right, leftVals, rightVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float3 vector-vector"); + + const float scalar = 4.0f; + AssertElementwiseComparisonOperators( + left, scalar, leftVals, new double[] { scalar, scalar, scalar }, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float3 vector-scalar"); + AssertElementwiseComparisonOperators( + scalar, left, new double[] { scalar, scalar, scalar }, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float3 scalar-vector"); + + // Tied against itself (see the float2 tied-fixture comment above). + AssertElementwiseComparisonOperators( + left, left, leftVals, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float3 tied vector-vector"); + + // The scalar overloads need their own tie (see the float2 uniform-vector comment above). + var uniform = new float3(4.0f, 4.0f, 4.0f); + var uniformVals = new double[] { 4.0, 4.0, 4.0 }; + AssertElementwiseComparisonOperators( + uniform, 4.0f, uniformVals, uniformVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float3 tied vector-scalar"); + AssertElementwiseComparisonOperators( + 4.0f, uniform, uniformVals, uniformVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float3 tied scalar-vector"); + } + + // ---- float4 ----------------------------------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + public void Float4EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new float4(3.0f, -7.0f, 4.5f, 9.0f); + var b = a; + b[index] += 5.0f; + + AssertEqualsAndHashCodeContract(a, a, true, "float4 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"float4 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 4, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float4 vector==vector"); + + var scalar = a[index]; + AssertElementwiseEqualityOperators( + a, scalar, 4, i => a[i] == scalar, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float4 vector==scalar"); + AssertElementwiseEqualityOperators( + scalar, a, 4, i => a[i] == scalar, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "float4 scalar==vector"); + } + + [Fact] + public void Float4ComparisonOperatorsDifferPerComponent() + { + // No component is tied (see the float3 comment above for why a tie hides a + // direction-flip mutation at that component). + var left = new float4(1.0f, 5.0f, 7.0f, 2.0f); + var right = new float4(2.0f, 3.0f, 4.0f, 9.0f); + var leftVals = new double[] { 1.0, 5.0, 7.0, 2.0 }; + var rightVals = new double[] { 2.0, 3.0, 4.0, 9.0 }; + + AssertElementwiseComparisonOperators( + left, right, leftVals, rightVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float4 vector-vector"); + + const float scalar = 4.0f; + AssertElementwiseComparisonOperators( + left, scalar, leftVals, new double[] { scalar, scalar, scalar, scalar }, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float4 vector-scalar"); + AssertElementwiseComparisonOperators( + scalar, left, new double[] { scalar, scalar, scalar, scalar }, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float4 scalar-vector"); + + // Tied against itself (see the float2 tied-fixture comment above). + AssertElementwiseComparisonOperators( + left, left, leftVals, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float4 tied vector-vector"); + + // The scalar overloads need their own tie (see the float2 uniform-vector comment above). + var uniform = new float4(4.0f, 4.0f, 4.0f, 4.0f); + var uniformVals = new double[] { 4.0, 4.0, 4.0, 4.0 }; + AssertElementwiseComparisonOperators( + uniform, 4.0f, uniformVals, uniformVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float4 tied vector-scalar"); + AssertElementwiseComparisonOperators( + 4.0f, uniform, uniformVals, uniformVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "float4 tied scalar-vector"); + } + + // ---- double2 ---------------------------------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + public void Double2EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new double2(3.0, -7.0); + var b = a; + b[index] += 5.0; + + AssertEqualsAndHashCodeContract(a, a, true, "double2 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"double2 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 2, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "double2 =="); + } + + [Fact] + public void Double2ComparisonOperatorsDifferPerComponent() + { + var left = new double2(1.0, 5.0); + var right = new double2(2.0, 3.0); + var leftVals = new double[] { 1.0, 5.0 }; + var rightVals = new double[] { 2.0, 3.0 }; + + AssertElementwiseComparisonOperators( + left, right, leftVals, rightVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "double2 vector-vector"); + + // Tied against itself (see the float2 tied-fixture comment above). + AssertElementwiseComparisonOperators( + left, left, leftVals, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "double2 tied vector-vector"); + } + + // ---- double3 ---------------------------------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + public void Double3EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new double3(3.0, -7.0, 4.5); + var b = a; + b[index] += 5.0; + + AssertEqualsAndHashCodeContract(a, a, true, "double3 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"double3 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 3, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "double3 =="); + } + + [Fact] + public void Double3ComparisonOperatorsDifferPerComponent() + { + // No component is tied (see the float3 comment above). + var left = new double3(1.0, 5.0, 7.0); + var right = new double3(2.0, 3.0, 4.0); + var leftVals = new double[] { 1.0, 5.0, 7.0 }; + var rightVals = new double[] { 2.0, 3.0, 4.0 }; + + AssertElementwiseComparisonOperators( + left, right, leftVals, rightVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "double3 vector-vector"); + + // Tied against itself (see the float2 tied-fixture comment above). + AssertElementwiseComparisonOperators( + left, left, leftVals, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "double3 tied vector-vector"); + } + + // ---- int2 ------------------------------------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + public void Int2EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new int2(3, -7); + var b = a; + b[index] += 5; + + AssertEqualsAndHashCodeContract(a, a, true, "int2 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"int2 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 2, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "int2 =="); + } + + [Fact] + public void Int2ComparisonOperatorsDifferPerComponent() + { + var left = new int2(1, 5); + var right = new int2(2, 3); + var leftVals = new double[] { 1, 5 }; + var rightVals = new double[] { 2, 3 }; + + AssertElementwiseComparisonOperators( + left, right, leftVals, rightVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "int2 vector-vector"); + + // Tied against itself (see the float2 tied-fixture comment above); integers make an + // exact tie the routine case, not the rare one. + AssertElementwiseComparisonOperators( + left, left, leftVals, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "int2 tied vector-vector"); + } + + // ---- int3 ------------------------------------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + public void Int3EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new int3(3, -7, 4); + var b = a; + b[index] += 5; + + AssertEqualsAndHashCodeContract(a, a, true, "int3 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"int3 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 3, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "int3 =="); + } + + [Fact] + public void Int3ComparisonOperatorsDifferPerComponent() + { + // No component is tied (see the float3 comment above). + var left = new int3(1, 5, 7); + var right = new int3(2, 3, 4); + var leftVals = new double[] { 1, 5, 7 }; + var rightVals = new double[] { 2, 3, 4 }; + + AssertElementwiseComparisonOperators( + left, right, leftVals, rightVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "int3 vector-vector"); + + // Tied against itself (see the int2 tied-fixture comment above). + AssertElementwiseComparisonOperators( + left, left, leftVals, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "int3 tied vector-vector"); + } + + // ---- int4 ------------------------------------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + public void Int4EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new int4(3, -7, 4, 9); + var b = a; + b[index] += 5; + + AssertEqualsAndHashCodeContract(a, a, true, "int4 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"int4 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 4, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "int4 =="); + } + + [Fact] + public void Int4ComparisonOperatorsDifferPerComponent() + { + // No component is tied (see the float3 comment above). + var left = new int4(1, 5, 7, 2); + var right = new int4(2, 3, 4, 9); + var leftVals = new double[] { 1, 5, 7, 2 }; + var rightVals = new double[] { 2, 3, 4, 9 }; + + AssertElementwiseComparisonOperators( + left, right, leftVals, rightVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "int4 vector-vector"); + + // Tied against itself (see the int2 tied-fixture comment above). + AssertElementwiseComparisonOperators( + left, left, leftVals, leftVals, + (x, y) => x < y, (x, y) => x > y, (x, y) => x <= y, (x, y) => x >= y, (v, i) => v[i], "int4 tied vector-vector"); + } + + // ---- bool2/3/4 (no ordering operators) --------------------------------------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + public void Bool2EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new bool2(true, false); + var b = a; + b[index] = !b[index]; + + AssertEqualsAndHashCodeContract(a, a, true, "bool2 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"bool2 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 2, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "bool2 =="); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + public void Bool3EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new bool3(true, false, true); + var b = a; + b[index] = !b[index]; + + AssertEqualsAndHashCodeContract(a, a, true, "bool3 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"bool3 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 3, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "bool3 =="); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + public void Bool4EqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new bool4(true, false, true, false); + var b = a; + b[index] = !b[index]; + + AssertEqualsAndHashCodeContract(a, a, true, "bool4 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"bool4 differing at {index}"); + AssertElementwiseEqualityOperators( + a, b, 4, i => i != index, (x, y) => x == y, (x, y) => x != y, (v, i) => v[i], "bool4 =="); + } + + [Fact] + public void BoolVectorFalseAndTrueConstantsHaveEveryComponentSet() + { + // bool2.@false/@true and bool4.@false/bool3.@true have no other consumer in this suite + // (bool3.@false and bool4.@true are read by HlslSemanticsTests), so a wrong component in + // their field initializers would otherwise go unnoticed. + Assert.Equal(new bool2(false, false), bool2.@false); + Assert.Equal(new bool2(true, true), bool2.@true); + Assert.Equal(new bool3(false, false, false), bool3.@false); + Assert.Equal(new bool3(true, true, true), bool3.@true); + Assert.Equal(new bool4(false, false, false, false), bool4.@false); + Assert.Equal(new bool4(true, true, true, true), bool4.@true); + } + + // ---- quaternion (== and != return a plain bool, not a component vector) ----------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + public void QuaternionEqualsHashCodeAndOperatorsDetectSingleComponentDifference(int index) + { + var a = new quaternion(1.0f, 2.0f, 3.0f, 4.0f); + float4 asFloat4 = a; + asFloat4[index] += 5.0f; + quaternion b = asFloat4; + + AssertEqualsAndHashCodeContract(a, a, true, "quaternion self"); + AssertEqualsAndHashCodeContract(a, b, false, $"quaternion differing at {index}"); + + // quaternion's == / != are scalar bool, defined in terms of Equals: confirm they + // actually delegate rather than reimplementing (and weakening) the comparison. + var aCopy = new quaternion(a.x, a.y, a.z, a.w); + Assert.Equal(a.Equals(aCopy), a == aCopy); + Assert.Equal(!a.Equals(aCopy), a != aCopy); + Assert.Equal(a.Equals(b), a == b); + Assert.Equal(!a.Equals(b), a != b); + } + + // ---- float2x2 / float3x3 (Equals/GetHashCode only, row granularity) --------------------- + + [Theory] + [InlineData(0)] + [InlineData(1)] + public void Float2x2EqualsAndHashCodeDetectSingleRowDifference(int row) + { + var row0 = new float2(1.0f, 2.0f); + var row1 = new float2(3.0f, 4.0f); + var a = new float2x2(row0, row1); + + var differingRow0 = row == 0 ? row0 + new float2(10.0f, 0.0f) : row0; + var differingRow1 = row == 1 ? row1 + new float2(0.0f, 10.0f) : row1; + var b = new float2x2(differingRow0, differingRow1); + + AssertEqualsAndHashCodeContract(a, a, true, "float2x2 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"float2x2 differing at row {row}"); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + public void Float3x3EqualsAndHashCodeDetectSingleRowDifference(int row) + { + var row0 = new float3(1.0f, 2.0f, 3.0f); + var row1 = new float3(4.0f, 5.0f, 6.0f); + var row2 = new float3(7.0f, 8.0f, 9.0f); + var a = new float3x3(row0, row1, row2); + + var differingRow0 = row == 0 ? row0 + new float3(10.0f, 0.0f, 0.0f) : row0; + var differingRow1 = row == 1 ? row1 + new float3(0.0f, 10.0f, 0.0f) : row1; + var differingRow2 = row == 2 ? row2 + new float3(0.0f, 0.0f, 10.0f) : row2; + var b = new float3x3(differingRow0, differingRow1, differingRow2); + + AssertEqualsAndHashCodeContract(a, a, true, "float3x3 self"); + AssertEqualsAndHashCodeContract(a, b, false, $"float3x3 differing at row {row}"); + } +} diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/clamp.json b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/clamp.json new file mode 100644 index 00000000..365da9f3 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/clamp.json @@ -0,0 +1,2070 @@ +{ + "oracle": "tools/cycles-oracle/oracle.py (Blender 5.2.2 LTS, build d13f752e3b9c, Cycles CPU, 1 sample, Emit bake, float Non-Color images)", + "blender": "5.2.2 LTS", + "build_hash": "d13f752e3b9c", + "platform": "Linux", + "encoding": "each case is 'operands -> results', every scalar a float32 bit pattern in hex, colours flattened as r g b", + "family": "clamp", + "functions": [ + { + "function": "cycles_clamp_minmax", + "node": "ShaderNodeClamp MINMAX", + "cases": [ + "00000000 00000000 00000000 -> 00000000", + "00000000 00000000 3f800000 -> 00000000", + "00000000 00000000 bf800000 -> bf800000", + "00000000 00000000 3f000000 -> 00000000", + "00000000 00000000 bf000000 -> bf000000", + "00000000 00000000 40000000 -> 00000000", + "00000000 00000000 c0000000 -> c0000000", + "00000000 00000000 40400000 -> 00000000", + "00000000 00000000 c0300000 -> c0300000", + "00000000 00000000 3dcccccd -> 00000000", + "00000000 3f800000 00000000 -> 00000000", + "00000000 3f800000 3f800000 -> 3f800000", + "00000000 3f800000 bf800000 -> bf800000", + "00000000 3f800000 3f000000 -> 3f000000", + "00000000 3f800000 bf000000 -> bf000000", + "00000000 3f800000 40000000 -> 3f800000", + "00000000 3f800000 c0000000 -> c0000000", + "00000000 3f800000 40400000 -> 3f800000", + "00000000 3f800000 c0300000 -> c0300000", + "00000000 3f800000 3dcccccd -> 3dcccccd", + "00000000 bf800000 00000000 -> 00000000", + "00000000 bf800000 3f800000 -> 00000000", + "00000000 bf800000 bf800000 -> bf800000", + "00000000 bf800000 3f000000 -> 00000000", + "00000000 bf800000 bf000000 -> bf000000", + "00000000 bf800000 40000000 -> 00000000", + "00000000 bf800000 c0000000 -> c0000000", + "00000000 bf800000 40400000 -> 00000000", + "00000000 bf800000 c0300000 -> c0300000", + "00000000 bf800000 3dcccccd -> 00000000", + "00000000 3f000000 00000000 -> 00000000", + "00000000 3f000000 3f800000 -> 3f000000", + "00000000 3f000000 bf800000 -> bf800000", + "00000000 3f000000 3f000000 -> 3f000000", + "00000000 3f000000 bf000000 -> bf000000", + "00000000 3f000000 40000000 -> 3f000000", + "00000000 3f000000 c0000000 -> c0000000", + "00000000 3f000000 40400000 -> 3f000000", + "00000000 3f000000 c0300000 -> c0300000", + "00000000 3f000000 3dcccccd -> 3dcccccd", + "00000000 bf000000 00000000 -> 00000000", + "00000000 bf000000 3f800000 -> 00000000", + "00000000 bf000000 bf800000 -> bf800000", + "00000000 bf000000 3f000000 -> 00000000", + "00000000 bf000000 bf000000 -> bf000000", + "00000000 bf000000 40000000 -> 00000000", + "00000000 bf000000 c0000000 -> c0000000", + "00000000 bf000000 40400000 -> 00000000", + "00000000 bf000000 c0300000 -> c0300000", + "00000000 bf000000 3dcccccd -> 00000000", + "00000000 40000000 00000000 -> 00000000", + "00000000 40000000 3f800000 -> 3f800000", + "00000000 40000000 bf800000 -> bf800000", + "00000000 40000000 3f000000 -> 3f000000", + "00000000 40000000 bf000000 -> bf000000", + "00000000 40000000 40000000 -> 40000000", + "00000000 40000000 c0000000 -> c0000000", + "00000000 40000000 40400000 -> 40000000", + "00000000 40000000 c0300000 -> c0300000", + "00000000 40000000 3dcccccd -> 3dcccccd", + "00000000 c0000000 00000000 -> 00000000", + "00000000 c0000000 3f800000 -> 00000000", + "00000000 c0000000 bf800000 -> bf800000", + "00000000 c0000000 3f000000 -> 00000000", + "00000000 c0000000 bf000000 -> bf000000", + "00000000 c0000000 40000000 -> 00000000", + "00000000 c0000000 c0000000 -> c0000000", + "00000000 c0000000 40400000 -> 00000000", + "00000000 c0000000 c0300000 -> c0300000", + "00000000 c0000000 3dcccccd -> 00000000", + "00000000 40400000 00000000 -> 00000000", + "00000000 40400000 3f800000 -> 3f800000", + "00000000 40400000 bf800000 -> bf800000", + "00000000 40400000 3f000000 -> 3f000000", + "00000000 40400000 bf000000 -> bf000000", + "00000000 40400000 40000000 -> 40000000", + "00000000 40400000 c0000000 -> c0000000", + "00000000 40400000 40400000 -> 40400000", + "00000000 40400000 c0300000 -> c0300000", + "00000000 40400000 3dcccccd -> 3dcccccd", + "00000000 c0300000 00000000 -> 00000000", + "00000000 c0300000 3f800000 -> 00000000", + "00000000 c0300000 bf800000 -> bf800000", + "00000000 c0300000 3f000000 -> 00000000", + "00000000 c0300000 bf000000 -> bf000000", + "00000000 c0300000 40000000 -> 00000000", + "00000000 c0300000 c0000000 -> c0000000", + "00000000 c0300000 40400000 -> 00000000", + "00000000 c0300000 c0300000 -> c0300000", + "00000000 c0300000 3dcccccd -> 00000000", + "00000000 3dcccccd 00000000 -> 00000000", + "00000000 3dcccccd 3f800000 -> 3dcccccd", + "00000000 3dcccccd bf800000 -> bf800000", + "00000000 3dcccccd 3f000000 -> 3dcccccd", + "00000000 3dcccccd bf000000 -> bf000000", + "00000000 3dcccccd 40000000 -> 3dcccccd", + "00000000 3dcccccd c0000000 -> c0000000", + "00000000 3dcccccd 40400000 -> 3dcccccd", + "00000000 3dcccccd c0300000 -> c0300000", + "00000000 3dcccccd 3dcccccd -> 3dcccccd", + "3f800000 00000000 00000000 -> 00000000", + "3f800000 00000000 3f800000 -> 3f800000", + "3f800000 00000000 bf800000 -> bf800000", + "3f800000 00000000 3f000000 -> 3f000000", + "3f800000 00000000 bf000000 -> bf000000", + "3f800000 00000000 40000000 -> 3f800000", + "3f800000 00000000 c0000000 -> c0000000", + "3f800000 00000000 40400000 -> 3f800000", + "3f800000 00000000 c0300000 -> c0300000", + "3f800000 00000000 3dcccccd -> 3dcccccd", + "3f800000 3f800000 00000000 -> 00000000", + "3f800000 3f800000 3f800000 -> 3f800000", + "3f800000 3f800000 bf800000 -> bf800000", + "3f800000 3f800000 3f000000 -> 3f000000", + "3f800000 3f800000 bf000000 -> bf000000", + "3f800000 3f800000 40000000 -> 3f800000", + "3f800000 3f800000 c0000000 -> c0000000", + "3f800000 3f800000 40400000 -> 3f800000", + "3f800000 3f800000 c0300000 -> c0300000", + "3f800000 3f800000 3dcccccd -> 3dcccccd", + "3f800000 bf800000 00000000 -> 00000000", + "3f800000 bf800000 3f800000 -> 3f800000", + "3f800000 bf800000 bf800000 -> bf800000", + "3f800000 bf800000 3f000000 -> 3f000000", + "3f800000 bf800000 bf000000 -> bf000000", + "3f800000 bf800000 40000000 -> 3f800000", + "3f800000 bf800000 c0000000 -> c0000000", + "3f800000 bf800000 40400000 -> 3f800000", + "3f800000 bf800000 c0300000 -> c0300000", + "3f800000 bf800000 3dcccccd -> 3dcccccd", + "3f800000 3f000000 00000000 -> 00000000", + "3f800000 3f000000 3f800000 -> 3f800000", + "3f800000 3f000000 bf800000 -> bf800000", + "3f800000 3f000000 3f000000 -> 3f000000", + "3f800000 3f000000 bf000000 -> bf000000", + "3f800000 3f000000 40000000 -> 3f800000", + "3f800000 3f000000 c0000000 -> c0000000", + "3f800000 3f000000 40400000 -> 3f800000", + "3f800000 3f000000 c0300000 -> c0300000", + "3f800000 3f000000 3dcccccd -> 3dcccccd", + "3f800000 bf000000 00000000 -> 00000000", + "3f800000 bf000000 3f800000 -> 3f800000", + "3f800000 bf000000 bf800000 -> bf800000", + "3f800000 bf000000 3f000000 -> 3f000000", + "3f800000 bf000000 bf000000 -> bf000000", + "3f800000 bf000000 40000000 -> 3f800000", + "3f800000 bf000000 c0000000 -> c0000000", + "3f800000 bf000000 40400000 -> 3f800000", + "3f800000 bf000000 c0300000 -> c0300000", + "3f800000 bf000000 3dcccccd -> 3dcccccd", + "3f800000 40000000 00000000 -> 00000000", + "3f800000 40000000 3f800000 -> 3f800000", + "3f800000 40000000 bf800000 -> bf800000", + "3f800000 40000000 3f000000 -> 3f000000", + "3f800000 40000000 bf000000 -> bf000000", + "3f800000 40000000 40000000 -> 40000000", + "3f800000 40000000 c0000000 -> c0000000", + "3f800000 40000000 40400000 -> 40000000", + "3f800000 40000000 c0300000 -> c0300000", + "3f800000 40000000 3dcccccd -> 3dcccccd", + "3f800000 c0000000 00000000 -> 00000000", + "3f800000 c0000000 3f800000 -> 3f800000", + "3f800000 c0000000 bf800000 -> bf800000", + "3f800000 c0000000 3f000000 -> 3f000000", + "3f800000 c0000000 bf000000 -> bf000000", + "3f800000 c0000000 40000000 -> 3f800000", + "3f800000 c0000000 c0000000 -> c0000000", + "3f800000 c0000000 40400000 -> 3f800000", + "3f800000 c0000000 c0300000 -> c0300000", + "3f800000 c0000000 3dcccccd -> 3dcccccd", + "3f800000 40400000 00000000 -> 00000000", + "3f800000 40400000 3f800000 -> 3f800000", + "3f800000 40400000 bf800000 -> bf800000", + "3f800000 40400000 3f000000 -> 3f000000", + "3f800000 40400000 bf000000 -> bf000000", + "3f800000 40400000 40000000 -> 40000000", + "3f800000 40400000 c0000000 -> c0000000", + "3f800000 40400000 40400000 -> 40400000", + "3f800000 40400000 c0300000 -> c0300000", + "3f800000 40400000 3dcccccd -> 3dcccccd", + "3f800000 c0300000 00000000 -> 00000000", + "3f800000 c0300000 3f800000 -> 3f800000", + "3f800000 c0300000 bf800000 -> bf800000", + "3f800000 c0300000 3f000000 -> 3f000000", + "3f800000 c0300000 bf000000 -> bf000000", + "3f800000 c0300000 40000000 -> 3f800000", + "3f800000 c0300000 c0000000 -> c0000000", + "3f800000 c0300000 40400000 -> 3f800000", + "3f800000 c0300000 c0300000 -> c0300000", + "3f800000 c0300000 3dcccccd -> 3dcccccd", + "3f800000 3dcccccd 00000000 -> 00000000", + "3f800000 3dcccccd 3f800000 -> 3f800000", + "3f800000 3dcccccd bf800000 -> bf800000", + "3f800000 3dcccccd 3f000000 -> 3f000000", + "3f800000 3dcccccd bf000000 -> bf000000", + "3f800000 3dcccccd 40000000 -> 3f800000", + "3f800000 3dcccccd c0000000 -> c0000000", + "3f800000 3dcccccd 40400000 -> 3f800000", + "3f800000 3dcccccd c0300000 -> c0300000", + "3f800000 3dcccccd 3dcccccd -> 3dcccccd", + "bf800000 00000000 00000000 -> 00000000", + "bf800000 00000000 3f800000 -> 00000000", + "bf800000 00000000 bf800000 -> bf800000", + "bf800000 00000000 3f000000 -> 00000000", + "bf800000 00000000 bf000000 -> bf000000", + "bf800000 00000000 40000000 -> 00000000", + "bf800000 00000000 c0000000 -> c0000000", + "bf800000 00000000 40400000 -> 00000000", + "bf800000 00000000 c0300000 -> c0300000", + "bf800000 00000000 3dcccccd -> 00000000", + "bf800000 3f800000 00000000 -> 00000000", + "bf800000 3f800000 3f800000 -> 3f800000", + "bf800000 3f800000 bf800000 -> bf800000", + "bf800000 3f800000 3f000000 -> 3f000000", + "bf800000 3f800000 bf000000 -> bf000000", + "bf800000 3f800000 40000000 -> 3f800000", + "bf800000 3f800000 c0000000 -> c0000000", + "bf800000 3f800000 40400000 -> 3f800000", + "bf800000 3f800000 c0300000 -> c0300000", + "bf800000 3f800000 3dcccccd -> 3dcccccd", + "bf800000 bf800000 00000000 -> bf800000", + "bf800000 bf800000 3f800000 -> bf800000", + "bf800000 bf800000 bf800000 -> bf800000", + "bf800000 bf800000 3f000000 -> bf800000", + "bf800000 bf800000 bf000000 -> bf800000", + "bf800000 bf800000 40000000 -> bf800000", + "bf800000 bf800000 c0000000 -> c0000000", + "bf800000 bf800000 40400000 -> bf800000", + "bf800000 bf800000 c0300000 -> c0300000", + "bf800000 bf800000 3dcccccd -> bf800000", + "bf800000 3f000000 00000000 -> 00000000", + "bf800000 3f000000 3f800000 -> 3f000000", + "bf800000 3f000000 bf800000 -> bf800000", + "bf800000 3f000000 3f000000 -> 3f000000", + "bf800000 3f000000 bf000000 -> bf000000", + "bf800000 3f000000 40000000 -> 3f000000", + "bf800000 3f000000 c0000000 -> c0000000", + "bf800000 3f000000 40400000 -> 3f000000", + "bf800000 3f000000 c0300000 -> c0300000", + "bf800000 3f000000 3dcccccd -> 3dcccccd", + "bf800000 bf000000 00000000 -> bf000000", + "bf800000 bf000000 3f800000 -> bf000000", + "bf800000 bf000000 bf800000 -> bf800000", + "bf800000 bf000000 3f000000 -> bf000000", + "bf800000 bf000000 bf000000 -> bf000000", + "bf800000 bf000000 40000000 -> bf000000", + "bf800000 bf000000 c0000000 -> c0000000", + "bf800000 bf000000 40400000 -> bf000000", + "bf800000 bf000000 c0300000 -> c0300000", + "bf800000 bf000000 3dcccccd -> bf000000", + "bf800000 40000000 00000000 -> 00000000", + "bf800000 40000000 3f800000 -> 3f800000", + "bf800000 40000000 bf800000 -> bf800000", + "bf800000 40000000 3f000000 -> 3f000000", + "bf800000 40000000 bf000000 -> bf000000", + "bf800000 40000000 40000000 -> 40000000", + "bf800000 40000000 c0000000 -> c0000000", + "bf800000 40000000 40400000 -> 40000000", + "bf800000 40000000 c0300000 -> c0300000", + "bf800000 40000000 3dcccccd -> 3dcccccd", + "bf800000 c0000000 00000000 -> bf800000", + "bf800000 c0000000 3f800000 -> bf800000", + "bf800000 c0000000 bf800000 -> bf800000", + "bf800000 c0000000 3f000000 -> bf800000", + "bf800000 c0000000 bf000000 -> bf800000", + "bf800000 c0000000 40000000 -> bf800000", + "bf800000 c0000000 c0000000 -> c0000000", + "bf800000 c0000000 40400000 -> bf800000", + "bf800000 c0000000 c0300000 -> c0300000", + "bf800000 c0000000 3dcccccd -> bf800000", + "bf800000 40400000 00000000 -> 00000000", + "bf800000 40400000 3f800000 -> 3f800000", + "bf800000 40400000 bf800000 -> bf800000", + "bf800000 40400000 3f000000 -> 3f000000", + "bf800000 40400000 bf000000 -> bf000000", + "bf800000 40400000 40000000 -> 40000000", + "bf800000 40400000 c0000000 -> c0000000", + "bf800000 40400000 40400000 -> 40400000", + "bf800000 40400000 c0300000 -> c0300000", + "bf800000 40400000 3dcccccd -> 3dcccccd", + "bf800000 c0300000 00000000 -> bf800000", + "bf800000 c0300000 3f800000 -> bf800000", + "bf800000 c0300000 bf800000 -> bf800000", + "bf800000 c0300000 3f000000 -> bf800000", + "bf800000 c0300000 bf000000 -> bf800000", + "bf800000 c0300000 40000000 -> bf800000", + "bf800000 c0300000 c0000000 -> c0000000", + "bf800000 c0300000 40400000 -> bf800000", + "bf800000 c0300000 c0300000 -> c0300000", + "bf800000 c0300000 3dcccccd -> bf800000", + "bf800000 3dcccccd 00000000 -> 00000000", + "bf800000 3dcccccd 3f800000 -> 3dcccccd", + "bf800000 3dcccccd bf800000 -> bf800000", + "bf800000 3dcccccd 3f000000 -> 3dcccccd", + "bf800000 3dcccccd bf000000 -> bf000000", + "bf800000 3dcccccd 40000000 -> 3dcccccd", + "bf800000 3dcccccd c0000000 -> c0000000", + "bf800000 3dcccccd 40400000 -> 3dcccccd", + "bf800000 3dcccccd c0300000 -> c0300000", + "bf800000 3dcccccd 3dcccccd -> 3dcccccd", + "3f000000 00000000 00000000 -> 00000000", + "3f000000 00000000 3f800000 -> 3f000000", + "3f000000 00000000 bf800000 -> bf800000", + "3f000000 00000000 3f000000 -> 3f000000", + "3f000000 00000000 bf000000 -> bf000000", + "3f000000 00000000 40000000 -> 3f000000", + "3f000000 00000000 c0000000 -> c0000000", + "3f000000 00000000 40400000 -> 3f000000", + "3f000000 00000000 c0300000 -> c0300000", + "3f000000 00000000 3dcccccd -> 3dcccccd", + "3f000000 3f800000 00000000 -> 00000000", + "3f000000 3f800000 3f800000 -> 3f800000", + "3f000000 3f800000 bf800000 -> bf800000", + "3f000000 3f800000 3f000000 -> 3f000000", + "3f000000 3f800000 bf000000 -> bf000000", + "3f000000 3f800000 40000000 -> 3f800000", + "3f000000 3f800000 c0000000 -> c0000000", + "3f000000 3f800000 40400000 -> 3f800000", + "3f000000 3f800000 c0300000 -> c0300000", + "3f000000 3f800000 3dcccccd -> 3dcccccd", + "3f000000 bf800000 00000000 -> 00000000", + "3f000000 bf800000 3f800000 -> 3f000000", + "3f000000 bf800000 bf800000 -> bf800000", + "3f000000 bf800000 3f000000 -> 3f000000", + "3f000000 bf800000 bf000000 -> bf000000", + "3f000000 bf800000 40000000 -> 3f000000", + "3f000000 bf800000 c0000000 -> c0000000", + "3f000000 bf800000 40400000 -> 3f000000", + "3f000000 bf800000 c0300000 -> c0300000", + "3f000000 bf800000 3dcccccd -> 3dcccccd", + "3f000000 3f000000 00000000 -> 00000000", + "3f000000 3f000000 3f800000 -> 3f000000", + "3f000000 3f000000 bf800000 -> bf800000", + "3f000000 3f000000 3f000000 -> 3f000000", + "3f000000 3f000000 bf000000 -> bf000000", + "3f000000 3f000000 40000000 -> 3f000000", + "3f000000 3f000000 c0000000 -> c0000000", + "3f000000 3f000000 40400000 -> 3f000000", + "3f000000 3f000000 c0300000 -> c0300000", + "3f000000 3f000000 3dcccccd -> 3dcccccd", + "3f000000 bf000000 00000000 -> 00000000", + "3f000000 bf000000 3f800000 -> 3f000000", + "3f000000 bf000000 bf800000 -> bf800000", + "3f000000 bf000000 3f000000 -> 3f000000", + "3f000000 bf000000 bf000000 -> bf000000", + "3f000000 bf000000 40000000 -> 3f000000", + "3f000000 bf000000 c0000000 -> c0000000", + "3f000000 bf000000 40400000 -> 3f000000", + "3f000000 bf000000 c0300000 -> c0300000", + "3f000000 bf000000 3dcccccd -> 3dcccccd", + "3f000000 40000000 00000000 -> 00000000", + "3f000000 40000000 3f800000 -> 3f800000", + "3f000000 40000000 bf800000 -> bf800000", + "3f000000 40000000 3f000000 -> 3f000000", + "3f000000 40000000 bf000000 -> bf000000", + "3f000000 40000000 40000000 -> 40000000", + "3f000000 40000000 c0000000 -> c0000000", + "3f000000 40000000 40400000 -> 40000000", + "3f000000 40000000 c0300000 -> c0300000", + "3f000000 40000000 3dcccccd -> 3dcccccd", + "3f000000 c0000000 00000000 -> 00000000", + "3f000000 c0000000 3f800000 -> 3f000000", + "3f000000 c0000000 bf800000 -> bf800000", + "3f000000 c0000000 3f000000 -> 3f000000", + "3f000000 c0000000 bf000000 -> bf000000", + "3f000000 c0000000 40000000 -> 3f000000", + "3f000000 c0000000 c0000000 -> c0000000", + "3f000000 c0000000 40400000 -> 3f000000", + "3f000000 c0000000 c0300000 -> c0300000", + "3f000000 c0000000 3dcccccd -> 3dcccccd", + "3f000000 40400000 00000000 -> 00000000", + "3f000000 40400000 3f800000 -> 3f800000", + "3f000000 40400000 bf800000 -> bf800000", + "3f000000 40400000 3f000000 -> 3f000000", + "3f000000 40400000 bf000000 -> bf000000", + "3f000000 40400000 40000000 -> 40000000", + "3f000000 40400000 c0000000 -> c0000000", + "3f000000 40400000 40400000 -> 40400000", + "3f000000 40400000 c0300000 -> c0300000", + "3f000000 40400000 3dcccccd -> 3dcccccd", + "3f000000 c0300000 00000000 -> 00000000", + "3f000000 c0300000 3f800000 -> 3f000000", + "3f000000 c0300000 bf800000 -> bf800000", + "3f000000 c0300000 3f000000 -> 3f000000", + "3f000000 c0300000 bf000000 -> bf000000", + "3f000000 c0300000 40000000 -> 3f000000", + "3f000000 c0300000 c0000000 -> c0000000", + "3f000000 c0300000 40400000 -> 3f000000", + "3f000000 c0300000 c0300000 -> c0300000", + "3f000000 c0300000 3dcccccd -> 3dcccccd", + "3f000000 3dcccccd 00000000 -> 00000000", + "3f000000 3dcccccd 3f800000 -> 3f000000", + "3f000000 3dcccccd bf800000 -> bf800000", + "3f000000 3dcccccd 3f000000 -> 3f000000", + "3f000000 3dcccccd bf000000 -> bf000000", + "3f000000 3dcccccd 40000000 -> 3f000000", + "3f000000 3dcccccd c0000000 -> c0000000", + "3f000000 3dcccccd 40400000 -> 3f000000", + "3f000000 3dcccccd c0300000 -> c0300000", + "3f000000 3dcccccd 3dcccccd -> 3dcccccd", + "bf000000 00000000 00000000 -> 00000000", + "bf000000 00000000 3f800000 -> 00000000", + "bf000000 00000000 bf800000 -> bf800000", + "bf000000 00000000 3f000000 -> 00000000", + "bf000000 00000000 bf000000 -> bf000000", + "bf000000 00000000 40000000 -> 00000000", + "bf000000 00000000 c0000000 -> c0000000", + "bf000000 00000000 40400000 -> 00000000", + "bf000000 00000000 c0300000 -> c0300000", + "bf000000 00000000 3dcccccd -> 00000000", + "bf000000 3f800000 00000000 -> 00000000", + "bf000000 3f800000 3f800000 -> 3f800000", + "bf000000 3f800000 bf800000 -> bf800000", + "bf000000 3f800000 3f000000 -> 3f000000", + "bf000000 3f800000 bf000000 -> bf000000", + "bf000000 3f800000 40000000 -> 3f800000", + "bf000000 3f800000 c0000000 -> c0000000", + "bf000000 3f800000 40400000 -> 3f800000", + "bf000000 3f800000 c0300000 -> c0300000", + "bf000000 3f800000 3dcccccd -> 3dcccccd", + "bf000000 bf800000 00000000 -> bf000000", + "bf000000 bf800000 3f800000 -> bf000000", + "bf000000 bf800000 bf800000 -> bf800000", + "bf000000 bf800000 3f000000 -> bf000000", + "bf000000 bf800000 bf000000 -> bf000000", + "bf000000 bf800000 40000000 -> bf000000", + "bf000000 bf800000 c0000000 -> c0000000", + "bf000000 bf800000 40400000 -> bf000000", + "bf000000 bf800000 c0300000 -> c0300000", + "bf000000 bf800000 3dcccccd -> bf000000", + "bf000000 3f000000 00000000 -> 00000000", + "bf000000 3f000000 3f800000 -> 3f000000", + "bf000000 3f000000 bf800000 -> bf800000", + "bf000000 3f000000 3f000000 -> 3f000000", + "bf000000 3f000000 bf000000 -> bf000000", + "bf000000 3f000000 40000000 -> 3f000000", + "bf000000 3f000000 c0000000 -> c0000000", + "bf000000 3f000000 40400000 -> 3f000000", + "bf000000 3f000000 c0300000 -> c0300000", + "bf000000 3f000000 3dcccccd -> 3dcccccd", + "bf000000 bf000000 00000000 -> bf000000", + "bf000000 bf000000 3f800000 -> bf000000", + "bf000000 bf000000 bf800000 -> bf800000", + "bf000000 bf000000 3f000000 -> bf000000", + "bf000000 bf000000 bf000000 -> bf000000", + "bf000000 bf000000 40000000 -> bf000000", + "bf000000 bf000000 c0000000 -> c0000000", + "bf000000 bf000000 40400000 -> bf000000", + "bf000000 bf000000 c0300000 -> c0300000", + "bf000000 bf000000 3dcccccd -> bf000000", + "bf000000 40000000 00000000 -> 00000000", + "bf000000 40000000 3f800000 -> 3f800000", + "bf000000 40000000 bf800000 -> bf800000", + "bf000000 40000000 3f000000 -> 3f000000", + "bf000000 40000000 bf000000 -> bf000000", + "bf000000 40000000 40000000 -> 40000000", + "bf000000 40000000 c0000000 -> c0000000", + "bf000000 40000000 40400000 -> 40000000", + "bf000000 40000000 c0300000 -> c0300000", + "bf000000 40000000 3dcccccd -> 3dcccccd", + "bf000000 c0000000 00000000 -> bf000000", + "bf000000 c0000000 3f800000 -> bf000000", + "bf000000 c0000000 bf800000 -> bf800000", + "bf000000 c0000000 3f000000 -> bf000000", + "bf000000 c0000000 bf000000 -> bf000000", + "bf000000 c0000000 40000000 -> bf000000", + "bf000000 c0000000 c0000000 -> c0000000", + "bf000000 c0000000 40400000 -> bf000000", + "bf000000 c0000000 c0300000 -> c0300000", + "bf000000 c0000000 3dcccccd -> bf000000", + "bf000000 40400000 00000000 -> 00000000", + "bf000000 40400000 3f800000 -> 3f800000", + "bf000000 40400000 bf800000 -> bf800000", + "bf000000 40400000 3f000000 -> 3f000000", + "bf000000 40400000 bf000000 -> bf000000", + "bf000000 40400000 40000000 -> 40000000", + "bf000000 40400000 c0000000 -> c0000000", + "bf000000 40400000 40400000 -> 40400000", + "bf000000 40400000 c0300000 -> c0300000", + "bf000000 40400000 3dcccccd -> 3dcccccd", + "bf000000 c0300000 00000000 -> bf000000", + "bf000000 c0300000 3f800000 -> bf000000", + "bf000000 c0300000 bf800000 -> bf800000", + "bf000000 c0300000 3f000000 -> bf000000", + "bf000000 c0300000 bf000000 -> bf000000", + "bf000000 c0300000 40000000 -> bf000000", + "bf000000 c0300000 c0000000 -> c0000000", + "bf000000 c0300000 40400000 -> bf000000", + "bf000000 c0300000 c0300000 -> c0300000", + "bf000000 c0300000 3dcccccd -> bf000000", + "bf000000 3dcccccd 00000000 -> 00000000", + "bf000000 3dcccccd 3f800000 -> 3dcccccd", + "bf000000 3dcccccd bf800000 -> bf800000", + "bf000000 3dcccccd 3f000000 -> 3dcccccd", + "bf000000 3dcccccd bf000000 -> bf000000", + "bf000000 3dcccccd 40000000 -> 3dcccccd", + "bf000000 3dcccccd c0000000 -> c0000000", + "bf000000 3dcccccd 40400000 -> 3dcccccd", + "bf000000 3dcccccd c0300000 -> c0300000", + "bf000000 3dcccccd 3dcccccd -> 3dcccccd", + "40000000 00000000 00000000 -> 00000000", + "40000000 00000000 3f800000 -> 3f800000", + "40000000 00000000 bf800000 -> bf800000", + "40000000 00000000 3f000000 -> 3f000000", + "40000000 00000000 bf000000 -> bf000000", + "40000000 00000000 40000000 -> 40000000", + "40000000 00000000 c0000000 -> c0000000", + "40000000 00000000 40400000 -> 40000000", + "40000000 00000000 c0300000 -> c0300000", + "40000000 00000000 3dcccccd -> 3dcccccd", + "40000000 3f800000 00000000 -> 00000000", + "40000000 3f800000 3f800000 -> 3f800000", + "40000000 3f800000 bf800000 -> bf800000", + "40000000 3f800000 3f000000 -> 3f000000", + "40000000 3f800000 bf000000 -> bf000000", + "40000000 3f800000 40000000 -> 40000000", + "40000000 3f800000 c0000000 -> c0000000", + "40000000 3f800000 40400000 -> 40000000", + "40000000 3f800000 c0300000 -> c0300000", + "40000000 3f800000 3dcccccd -> 3dcccccd", + "40000000 bf800000 00000000 -> 00000000", + "40000000 bf800000 3f800000 -> 3f800000", + "40000000 bf800000 bf800000 -> bf800000", + "40000000 bf800000 3f000000 -> 3f000000", + "40000000 bf800000 bf000000 -> bf000000", + "40000000 bf800000 40000000 -> 40000000", + "40000000 bf800000 c0000000 -> c0000000", + "40000000 bf800000 40400000 -> 40000000", + "40000000 bf800000 c0300000 -> c0300000", + "40000000 bf800000 3dcccccd -> 3dcccccd", + "40000000 3f000000 00000000 -> 00000000", + "40000000 3f000000 3f800000 -> 3f800000", + "40000000 3f000000 bf800000 -> bf800000", + "40000000 3f000000 3f000000 -> 3f000000", + "40000000 3f000000 bf000000 -> bf000000", + "40000000 3f000000 40000000 -> 40000000", + "40000000 3f000000 c0000000 -> c0000000", + "40000000 3f000000 40400000 -> 40000000", + "40000000 3f000000 c0300000 -> c0300000", + "40000000 3f000000 3dcccccd -> 3dcccccd", + "40000000 bf000000 00000000 -> 00000000", + "40000000 bf000000 3f800000 -> 3f800000", + "40000000 bf000000 bf800000 -> bf800000", + "40000000 bf000000 3f000000 -> 3f000000", + "40000000 bf000000 bf000000 -> bf000000", + "40000000 bf000000 40000000 -> 40000000", + "40000000 bf000000 c0000000 -> c0000000", + "40000000 bf000000 40400000 -> 40000000", + "40000000 bf000000 c0300000 -> c0300000", + "40000000 bf000000 3dcccccd -> 3dcccccd", + "40000000 40000000 00000000 -> 00000000", + "40000000 40000000 3f800000 -> 3f800000", + "40000000 40000000 bf800000 -> bf800000", + "40000000 40000000 3f000000 -> 3f000000", + "40000000 40000000 bf000000 -> bf000000", + "40000000 40000000 40000000 -> 40000000", + "40000000 40000000 c0000000 -> c0000000", + "40000000 40000000 40400000 -> 40000000", + "40000000 40000000 c0300000 -> c0300000", + "40000000 40000000 3dcccccd -> 3dcccccd", + "40000000 c0000000 00000000 -> 00000000", + "40000000 c0000000 3f800000 -> 3f800000", + "40000000 c0000000 bf800000 -> bf800000", + "40000000 c0000000 3f000000 -> 3f000000", + "40000000 c0000000 bf000000 -> bf000000", + "40000000 c0000000 40000000 -> 40000000", + "40000000 c0000000 c0000000 -> c0000000", + "40000000 c0000000 40400000 -> 40000000", + "40000000 c0000000 c0300000 -> c0300000", + "40000000 c0000000 3dcccccd -> 3dcccccd", + "40000000 40400000 00000000 -> 00000000", + "40000000 40400000 3f800000 -> 3f800000", + "40000000 40400000 bf800000 -> bf800000", + "40000000 40400000 3f000000 -> 3f000000", + "40000000 40400000 bf000000 -> bf000000", + "40000000 40400000 40000000 -> 40000000", + "40000000 40400000 c0000000 -> c0000000", + "40000000 40400000 40400000 -> 40400000", + "40000000 40400000 c0300000 -> c0300000", + "40000000 40400000 3dcccccd -> 3dcccccd", + "40000000 c0300000 00000000 -> 00000000", + "40000000 c0300000 3f800000 -> 3f800000", + "40000000 c0300000 bf800000 -> bf800000", + "40000000 c0300000 3f000000 -> 3f000000", + "40000000 c0300000 bf000000 -> bf000000", + "40000000 c0300000 40000000 -> 40000000", + "40000000 c0300000 c0000000 -> c0000000", + "40000000 c0300000 40400000 -> 40000000", + "40000000 c0300000 c0300000 -> c0300000", + "40000000 c0300000 3dcccccd -> 3dcccccd", + "40000000 3dcccccd 00000000 -> 00000000", + "40000000 3dcccccd 3f800000 -> 3f800000", + "40000000 3dcccccd bf800000 -> bf800000", + "40000000 3dcccccd 3f000000 -> 3f000000", + "40000000 3dcccccd bf000000 -> bf000000", + "40000000 3dcccccd 40000000 -> 40000000", + "40000000 3dcccccd c0000000 -> c0000000", + "40000000 3dcccccd 40400000 -> 40000000", + "40000000 3dcccccd c0300000 -> c0300000", + "40000000 3dcccccd 3dcccccd -> 3dcccccd", + "c0000000 00000000 00000000 -> 00000000", + "c0000000 00000000 3f800000 -> 00000000", + "c0000000 00000000 bf800000 -> bf800000", + "c0000000 00000000 3f000000 -> 00000000", + "c0000000 00000000 bf000000 -> bf000000", + "c0000000 00000000 40000000 -> 00000000", + "c0000000 00000000 c0000000 -> c0000000", + "c0000000 00000000 40400000 -> 00000000", + "c0000000 00000000 c0300000 -> c0300000", + "c0000000 00000000 3dcccccd -> 00000000", + "c0000000 3f800000 00000000 -> 00000000", + "c0000000 3f800000 3f800000 -> 3f800000", + "c0000000 3f800000 bf800000 -> bf800000", + "c0000000 3f800000 3f000000 -> 3f000000", + "c0000000 3f800000 bf000000 -> bf000000", + "c0000000 3f800000 40000000 -> 3f800000", + "c0000000 3f800000 c0000000 -> c0000000", + "c0000000 3f800000 40400000 -> 3f800000", + "c0000000 3f800000 c0300000 -> c0300000", + "c0000000 3f800000 3dcccccd -> 3dcccccd", + "c0000000 bf800000 00000000 -> bf800000", + "c0000000 bf800000 3f800000 -> bf800000", + "c0000000 bf800000 bf800000 -> bf800000", + "c0000000 bf800000 3f000000 -> bf800000", + "c0000000 bf800000 bf000000 -> bf800000", + "c0000000 bf800000 40000000 -> bf800000", + "c0000000 bf800000 c0000000 -> c0000000", + "c0000000 bf800000 40400000 -> bf800000", + "c0000000 bf800000 c0300000 -> c0300000", + "c0000000 bf800000 3dcccccd -> bf800000", + "c0000000 3f000000 00000000 -> 00000000", + "c0000000 3f000000 3f800000 -> 3f000000", + "c0000000 3f000000 bf800000 -> bf800000", + "c0000000 3f000000 3f000000 -> 3f000000", + "c0000000 3f000000 bf000000 -> bf000000", + "c0000000 3f000000 40000000 -> 3f000000", + "c0000000 3f000000 c0000000 -> c0000000", + "c0000000 3f000000 40400000 -> 3f000000", + "c0000000 3f000000 c0300000 -> c0300000", + "c0000000 3f000000 3dcccccd -> 3dcccccd", + "c0000000 bf000000 00000000 -> bf000000", + "c0000000 bf000000 3f800000 -> bf000000", + "c0000000 bf000000 bf800000 -> bf800000", + "c0000000 bf000000 3f000000 -> bf000000", + "c0000000 bf000000 bf000000 -> bf000000", + "c0000000 bf000000 40000000 -> bf000000", + "c0000000 bf000000 c0000000 -> c0000000", + "c0000000 bf000000 40400000 -> bf000000", + "c0000000 bf000000 c0300000 -> c0300000", + "c0000000 bf000000 3dcccccd -> bf000000", + "c0000000 40000000 00000000 -> 00000000", + "c0000000 40000000 3f800000 -> 3f800000", + "c0000000 40000000 bf800000 -> bf800000", + "c0000000 40000000 3f000000 -> 3f000000", + "c0000000 40000000 bf000000 -> bf000000", + "c0000000 40000000 40000000 -> 40000000", + "c0000000 40000000 c0000000 -> c0000000", + "c0000000 40000000 40400000 -> 40000000", + "c0000000 40000000 c0300000 -> c0300000", + "c0000000 40000000 3dcccccd -> 3dcccccd", + "c0000000 c0000000 00000000 -> c0000000", + "c0000000 c0000000 3f800000 -> c0000000", + "c0000000 c0000000 bf800000 -> c0000000", + "c0000000 c0000000 3f000000 -> c0000000", + "c0000000 c0000000 bf000000 -> c0000000", + "c0000000 c0000000 40000000 -> c0000000", + "c0000000 c0000000 c0000000 -> c0000000", + "c0000000 c0000000 40400000 -> c0000000", + "c0000000 c0000000 c0300000 -> c0300000", + "c0000000 c0000000 3dcccccd -> c0000000", + "c0000000 40400000 00000000 -> 00000000", + "c0000000 40400000 3f800000 -> 3f800000", + "c0000000 40400000 bf800000 -> bf800000", + "c0000000 40400000 3f000000 -> 3f000000", + "c0000000 40400000 bf000000 -> bf000000", + "c0000000 40400000 40000000 -> 40000000", + "c0000000 40400000 c0000000 -> c0000000", + "c0000000 40400000 40400000 -> 40400000", + "c0000000 40400000 c0300000 -> c0300000", + "c0000000 40400000 3dcccccd -> 3dcccccd", + "c0000000 c0300000 00000000 -> c0000000", + "c0000000 c0300000 3f800000 -> c0000000", + "c0000000 c0300000 bf800000 -> c0000000", + "c0000000 c0300000 3f000000 -> c0000000", + "c0000000 c0300000 bf000000 -> c0000000", + "c0000000 c0300000 40000000 -> c0000000", + "c0000000 c0300000 c0000000 -> c0000000", + "c0000000 c0300000 40400000 -> c0000000", + "c0000000 c0300000 c0300000 -> c0300000", + "c0000000 c0300000 3dcccccd -> c0000000", + "c0000000 3dcccccd 00000000 -> 00000000", + "c0000000 3dcccccd 3f800000 -> 3dcccccd", + "c0000000 3dcccccd bf800000 -> bf800000", + "c0000000 3dcccccd 3f000000 -> 3dcccccd", + "c0000000 3dcccccd bf000000 -> bf000000", + "c0000000 3dcccccd 40000000 -> 3dcccccd", + "c0000000 3dcccccd c0000000 -> c0000000", + "c0000000 3dcccccd 40400000 -> 3dcccccd", + "c0000000 3dcccccd c0300000 -> c0300000", + "c0000000 3dcccccd 3dcccccd -> 3dcccccd", + "40400000 00000000 00000000 -> 00000000", + "40400000 00000000 3f800000 -> 3f800000", + "40400000 00000000 bf800000 -> bf800000", + "40400000 00000000 3f000000 -> 3f000000", + "40400000 00000000 bf000000 -> bf000000", + "40400000 00000000 40000000 -> 40000000", + "40400000 00000000 c0000000 -> c0000000", + "40400000 00000000 40400000 -> 40400000", + "40400000 00000000 c0300000 -> c0300000", + "40400000 00000000 3dcccccd -> 3dcccccd", + "40400000 3f800000 00000000 -> 00000000", + "40400000 3f800000 3f800000 -> 3f800000", + "40400000 3f800000 bf800000 -> bf800000", + "40400000 3f800000 3f000000 -> 3f000000", + "40400000 3f800000 bf000000 -> bf000000", + "40400000 3f800000 40000000 -> 40000000", + "40400000 3f800000 c0000000 -> c0000000", + "40400000 3f800000 40400000 -> 40400000", + "40400000 3f800000 c0300000 -> c0300000", + "40400000 3f800000 3dcccccd -> 3dcccccd", + "40400000 bf800000 00000000 -> 00000000", + "40400000 bf800000 3f800000 -> 3f800000", + "40400000 bf800000 bf800000 -> bf800000", + "40400000 bf800000 3f000000 -> 3f000000", + "40400000 bf800000 bf000000 -> bf000000", + "40400000 bf800000 40000000 -> 40000000", + "40400000 bf800000 c0000000 -> c0000000", + "40400000 bf800000 40400000 -> 40400000", + "40400000 bf800000 c0300000 -> c0300000", + "40400000 bf800000 3dcccccd -> 3dcccccd", + "40400000 3f000000 00000000 -> 00000000", + "40400000 3f000000 3f800000 -> 3f800000", + "40400000 3f000000 bf800000 -> bf800000", + "40400000 3f000000 3f000000 -> 3f000000", + "40400000 3f000000 bf000000 -> bf000000", + "40400000 3f000000 40000000 -> 40000000", + "40400000 3f000000 c0000000 -> c0000000", + "40400000 3f000000 40400000 -> 40400000", + "40400000 3f000000 c0300000 -> c0300000", + "40400000 3f000000 3dcccccd -> 3dcccccd", + "40400000 bf000000 00000000 -> 00000000", + "40400000 bf000000 3f800000 -> 3f800000", + "40400000 bf000000 bf800000 -> bf800000", + "40400000 bf000000 3f000000 -> 3f000000", + "40400000 bf000000 bf000000 -> bf000000", + "40400000 bf000000 40000000 -> 40000000", + "40400000 bf000000 c0000000 -> c0000000", + "40400000 bf000000 40400000 -> 40400000", + "40400000 bf000000 c0300000 -> c0300000", + "40400000 bf000000 3dcccccd -> 3dcccccd", + "40400000 40000000 00000000 -> 00000000", + "40400000 40000000 3f800000 -> 3f800000", + "40400000 40000000 bf800000 -> bf800000", + "40400000 40000000 3f000000 -> 3f000000", + "40400000 40000000 bf000000 -> bf000000", + "40400000 40000000 40000000 -> 40000000", + "40400000 40000000 c0000000 -> c0000000", + "40400000 40000000 40400000 -> 40400000", + "40400000 40000000 c0300000 -> c0300000", + "40400000 40000000 3dcccccd -> 3dcccccd", + "40400000 c0000000 00000000 -> 00000000", + "40400000 c0000000 3f800000 -> 3f800000", + "40400000 c0000000 bf800000 -> bf800000", + "40400000 c0000000 3f000000 -> 3f000000", + "40400000 c0000000 bf000000 -> bf000000", + "40400000 c0000000 40000000 -> 40000000", + "40400000 c0000000 c0000000 -> c0000000", + "40400000 c0000000 40400000 -> 40400000", + "40400000 c0000000 c0300000 -> c0300000", + "40400000 c0000000 3dcccccd -> 3dcccccd", + "40400000 40400000 00000000 -> 00000000", + "40400000 40400000 3f800000 -> 3f800000", + "40400000 40400000 bf800000 -> bf800000", + "40400000 40400000 3f000000 -> 3f000000", + "40400000 40400000 bf000000 -> bf000000", + "40400000 40400000 40000000 -> 40000000", + "40400000 40400000 c0000000 -> c0000000", + "40400000 40400000 40400000 -> 40400000", + "40400000 40400000 c0300000 -> c0300000", + "40400000 40400000 3dcccccd -> 3dcccccd", + "40400000 c0300000 00000000 -> 00000000", + "40400000 c0300000 3f800000 -> 3f800000", + "40400000 c0300000 bf800000 -> bf800000", + "40400000 c0300000 3f000000 -> 3f000000", + "40400000 c0300000 bf000000 -> bf000000", + "40400000 c0300000 40000000 -> 40000000", + "40400000 c0300000 c0000000 -> c0000000", + "40400000 c0300000 40400000 -> 40400000", + "40400000 c0300000 c0300000 -> c0300000", + "40400000 c0300000 3dcccccd -> 3dcccccd", + "40400000 3dcccccd 00000000 -> 00000000", + "40400000 3dcccccd 3f800000 -> 3f800000", + "40400000 3dcccccd bf800000 -> bf800000", + "40400000 3dcccccd 3f000000 -> 3f000000", + "40400000 3dcccccd bf000000 -> bf000000", + "40400000 3dcccccd 40000000 -> 40000000", + "40400000 3dcccccd c0000000 -> c0000000", + "40400000 3dcccccd 40400000 -> 40400000", + "40400000 3dcccccd c0300000 -> c0300000", + "40400000 3dcccccd 3dcccccd -> 3dcccccd", + "c0300000 00000000 00000000 -> 00000000", + "c0300000 00000000 3f800000 -> 00000000", + "c0300000 00000000 bf800000 -> bf800000", + "c0300000 00000000 3f000000 -> 00000000", + "c0300000 00000000 bf000000 -> bf000000", + "c0300000 00000000 40000000 -> 00000000", + "c0300000 00000000 c0000000 -> c0000000", + "c0300000 00000000 40400000 -> 00000000", + "c0300000 00000000 c0300000 -> c0300000", + "c0300000 00000000 3dcccccd -> 00000000", + "c0300000 3f800000 00000000 -> 00000000", + "c0300000 3f800000 3f800000 -> 3f800000", + "c0300000 3f800000 bf800000 -> bf800000", + "c0300000 3f800000 3f000000 -> 3f000000", + "c0300000 3f800000 bf000000 -> bf000000", + "c0300000 3f800000 40000000 -> 3f800000", + "c0300000 3f800000 c0000000 -> c0000000", + "c0300000 3f800000 40400000 -> 3f800000", + "c0300000 3f800000 c0300000 -> c0300000", + "c0300000 3f800000 3dcccccd -> 3dcccccd", + "c0300000 bf800000 00000000 -> bf800000", + "c0300000 bf800000 3f800000 -> bf800000", + "c0300000 bf800000 bf800000 -> bf800000", + "c0300000 bf800000 3f000000 -> bf800000", + "c0300000 bf800000 bf000000 -> bf800000", + "c0300000 bf800000 40000000 -> bf800000", + "c0300000 bf800000 c0000000 -> c0000000", + "c0300000 bf800000 40400000 -> bf800000", + "c0300000 bf800000 c0300000 -> c0300000", + "c0300000 bf800000 3dcccccd -> bf800000", + "c0300000 3f000000 00000000 -> 00000000", + "c0300000 3f000000 3f800000 -> 3f000000", + "c0300000 3f000000 bf800000 -> bf800000", + "c0300000 3f000000 3f000000 -> 3f000000", + "c0300000 3f000000 bf000000 -> bf000000", + "c0300000 3f000000 40000000 -> 3f000000", + "c0300000 3f000000 c0000000 -> c0000000", + "c0300000 3f000000 40400000 -> 3f000000", + "c0300000 3f000000 c0300000 -> c0300000", + "c0300000 3f000000 3dcccccd -> 3dcccccd", + "c0300000 bf000000 00000000 -> bf000000", + "c0300000 bf000000 3f800000 -> bf000000", + "c0300000 bf000000 bf800000 -> bf800000", + "c0300000 bf000000 3f000000 -> bf000000", + "c0300000 bf000000 bf000000 -> bf000000", + "c0300000 bf000000 40000000 -> bf000000", + "c0300000 bf000000 c0000000 -> c0000000", + "c0300000 bf000000 40400000 -> bf000000", + "c0300000 bf000000 c0300000 -> c0300000", + "c0300000 bf000000 3dcccccd -> bf000000", + "c0300000 40000000 00000000 -> 00000000", + "c0300000 40000000 3f800000 -> 3f800000", + "c0300000 40000000 bf800000 -> bf800000", + "c0300000 40000000 3f000000 -> 3f000000", + "c0300000 40000000 bf000000 -> bf000000", + "c0300000 40000000 40000000 -> 40000000", + "c0300000 40000000 c0000000 -> c0000000", + "c0300000 40000000 40400000 -> 40000000", + "c0300000 40000000 c0300000 -> c0300000", + "c0300000 40000000 3dcccccd -> 3dcccccd", + "c0300000 c0000000 00000000 -> c0000000", + "c0300000 c0000000 3f800000 -> c0000000", + "c0300000 c0000000 bf800000 -> c0000000", + "c0300000 c0000000 3f000000 -> c0000000", + "c0300000 c0000000 bf000000 -> c0000000", + "c0300000 c0000000 40000000 -> c0000000", + "c0300000 c0000000 c0000000 -> c0000000", + "c0300000 c0000000 40400000 -> c0000000", + "c0300000 c0000000 c0300000 -> c0300000", + "c0300000 c0000000 3dcccccd -> c0000000", + "c0300000 40400000 00000000 -> 00000000", + "c0300000 40400000 3f800000 -> 3f800000", + "c0300000 40400000 bf800000 -> bf800000", + "c0300000 40400000 3f000000 -> 3f000000", + "c0300000 40400000 bf000000 -> bf000000", + "c0300000 40400000 40000000 -> 40000000", + "c0300000 40400000 c0000000 -> c0000000", + "c0300000 40400000 40400000 -> 40400000", + "c0300000 40400000 c0300000 -> c0300000", + "c0300000 40400000 3dcccccd -> 3dcccccd", + "c0300000 c0300000 00000000 -> c0300000", + "c0300000 c0300000 3f800000 -> c0300000", + "c0300000 c0300000 bf800000 -> c0300000", + "c0300000 c0300000 3f000000 -> c0300000", + "c0300000 c0300000 bf000000 -> c0300000", + "c0300000 c0300000 40000000 -> c0300000", + "c0300000 c0300000 c0000000 -> c0300000", + "c0300000 c0300000 40400000 -> c0300000", + "c0300000 c0300000 c0300000 -> c0300000", + "c0300000 c0300000 3dcccccd -> c0300000", + "c0300000 3dcccccd 00000000 -> 00000000", + "c0300000 3dcccccd 3f800000 -> 3dcccccd", + "c0300000 3dcccccd bf800000 -> bf800000", + "c0300000 3dcccccd 3f000000 -> 3dcccccd", + "c0300000 3dcccccd bf000000 -> bf000000", + "c0300000 3dcccccd 40000000 -> 3dcccccd", + "c0300000 3dcccccd c0000000 -> c0000000", + "c0300000 3dcccccd 40400000 -> 3dcccccd", + "c0300000 3dcccccd c0300000 -> c0300000", + "c0300000 3dcccccd 3dcccccd -> 3dcccccd", + "3dcccccd 00000000 00000000 -> 00000000", + "3dcccccd 00000000 3f800000 -> 3dcccccd", + "3dcccccd 00000000 bf800000 -> bf800000", + "3dcccccd 00000000 3f000000 -> 3dcccccd", + "3dcccccd 00000000 bf000000 -> bf000000", + "3dcccccd 00000000 40000000 -> 3dcccccd", + "3dcccccd 00000000 c0000000 -> c0000000", + "3dcccccd 00000000 40400000 -> 3dcccccd", + "3dcccccd 00000000 c0300000 -> c0300000", + "3dcccccd 00000000 3dcccccd -> 3dcccccd", + "3dcccccd 3f800000 00000000 -> 00000000", + "3dcccccd 3f800000 3f800000 -> 3f800000", + "3dcccccd 3f800000 bf800000 -> bf800000", + "3dcccccd 3f800000 3f000000 -> 3f000000", + "3dcccccd 3f800000 bf000000 -> bf000000", + "3dcccccd 3f800000 40000000 -> 3f800000", + "3dcccccd 3f800000 c0000000 -> c0000000", + "3dcccccd 3f800000 40400000 -> 3f800000", + "3dcccccd 3f800000 c0300000 -> c0300000", + "3dcccccd 3f800000 3dcccccd -> 3dcccccd", + "3dcccccd bf800000 00000000 -> 00000000", + "3dcccccd bf800000 3f800000 -> 3dcccccd", + "3dcccccd bf800000 bf800000 -> bf800000", + "3dcccccd bf800000 3f000000 -> 3dcccccd", + "3dcccccd bf800000 bf000000 -> bf000000", + "3dcccccd bf800000 40000000 -> 3dcccccd", + "3dcccccd bf800000 c0000000 -> c0000000", + "3dcccccd bf800000 40400000 -> 3dcccccd", + "3dcccccd bf800000 c0300000 -> c0300000", + "3dcccccd bf800000 3dcccccd -> 3dcccccd", + "3dcccccd 3f000000 00000000 -> 00000000", + "3dcccccd 3f000000 3f800000 -> 3f000000", + "3dcccccd 3f000000 bf800000 -> bf800000", + "3dcccccd 3f000000 3f000000 -> 3f000000", + "3dcccccd 3f000000 bf000000 -> bf000000", + "3dcccccd 3f000000 40000000 -> 3f000000", + "3dcccccd 3f000000 c0000000 -> c0000000", + "3dcccccd 3f000000 40400000 -> 3f000000", + "3dcccccd 3f000000 c0300000 -> c0300000", + "3dcccccd 3f000000 3dcccccd -> 3dcccccd", + "3dcccccd bf000000 00000000 -> 00000000", + "3dcccccd bf000000 3f800000 -> 3dcccccd", + "3dcccccd bf000000 bf800000 -> bf800000", + "3dcccccd bf000000 3f000000 -> 3dcccccd", + "3dcccccd bf000000 bf000000 -> bf000000", + "3dcccccd bf000000 40000000 -> 3dcccccd", + "3dcccccd bf000000 c0000000 -> c0000000", + "3dcccccd bf000000 40400000 -> 3dcccccd", + "3dcccccd bf000000 c0300000 -> c0300000", + "3dcccccd bf000000 3dcccccd -> 3dcccccd", + "3dcccccd 40000000 00000000 -> 00000000", + "3dcccccd 40000000 3f800000 -> 3f800000", + "3dcccccd 40000000 bf800000 -> bf800000", + "3dcccccd 40000000 3f000000 -> 3f000000", + "3dcccccd 40000000 bf000000 -> bf000000", + "3dcccccd 40000000 40000000 -> 40000000", + "3dcccccd 40000000 c0000000 -> c0000000", + "3dcccccd 40000000 40400000 -> 40000000", + "3dcccccd 40000000 c0300000 -> c0300000", + "3dcccccd 40000000 3dcccccd -> 3dcccccd", + "3dcccccd c0000000 00000000 -> 00000000", + "3dcccccd c0000000 3f800000 -> 3dcccccd", + "3dcccccd c0000000 bf800000 -> bf800000", + "3dcccccd c0000000 3f000000 -> 3dcccccd", + "3dcccccd c0000000 bf000000 -> bf000000", + "3dcccccd c0000000 40000000 -> 3dcccccd", + "3dcccccd c0000000 c0000000 -> c0000000", + "3dcccccd c0000000 40400000 -> 3dcccccd", + "3dcccccd c0000000 c0300000 -> c0300000", + "3dcccccd c0000000 3dcccccd -> 3dcccccd", + "3dcccccd 40400000 00000000 -> 00000000", + "3dcccccd 40400000 3f800000 -> 3f800000", + "3dcccccd 40400000 bf800000 -> bf800000", + "3dcccccd 40400000 3f000000 -> 3f000000", + "3dcccccd 40400000 bf000000 -> bf000000", + "3dcccccd 40400000 40000000 -> 40000000", + "3dcccccd 40400000 c0000000 -> c0000000", + "3dcccccd 40400000 40400000 -> 40400000", + "3dcccccd 40400000 c0300000 -> c0300000", + "3dcccccd 40400000 3dcccccd -> 3dcccccd", + "3dcccccd c0300000 00000000 -> 00000000", + "3dcccccd c0300000 3f800000 -> 3dcccccd", + "3dcccccd c0300000 bf800000 -> bf800000", + "3dcccccd c0300000 3f000000 -> 3dcccccd", + "3dcccccd c0300000 bf000000 -> bf000000", + "3dcccccd c0300000 40000000 -> 3dcccccd", + "3dcccccd c0300000 c0000000 -> c0000000", + "3dcccccd c0300000 40400000 -> 3dcccccd", + "3dcccccd c0300000 c0300000 -> c0300000", + "3dcccccd c0300000 3dcccccd -> 3dcccccd", + "3dcccccd 3dcccccd 00000000 -> 00000000", + "3dcccccd 3dcccccd 3f800000 -> 3dcccccd", + "3dcccccd 3dcccccd bf800000 -> bf800000", + "3dcccccd 3dcccccd 3f000000 -> 3dcccccd", + "3dcccccd 3dcccccd bf000000 -> bf000000", + "3dcccccd 3dcccccd 40000000 -> 3dcccccd", + "3dcccccd 3dcccccd c0000000 -> c0000000", + "3dcccccd 3dcccccd 40400000 -> 3dcccccd", + "3dcccccd 3dcccccd c0300000 -> c0300000", + "3dcccccd 3dcccccd 3dcccccd -> 3dcccccd", + "bd9da4e8 4168ba7c c003bb23 -> c003bb23", + "413776c7 c19787d6 3fe8e933 -> 3fe8e933", + "c0dece5a 4176ebea 40c3f4ad -> 40c3f4ad", + "40bbfb93 c0a09a03 c18c0651 -> c18c0651", + "c0ceb239 4148e3b8 c063556a -> c063556a", + "4156c948 4110700b 416fac80 -> 4156c948", + "4151ff37 c151db80 c0b216b9 -> c0b216b9", + "c1995569 c0a441d5 40a4cff7 -> c0a441d5", + "c19234fa 418efbfe c141929c -> c141929c", + "4170a684 409d0a49 c0e1357f -> c0e1357f", + "3fd654b4 41605aa0 c19b31f2 -> c19b31f2", + "c16d372e c193b4b3 404e4a63 -> c16d372e", + "c0a17919 c14763de bf9d23d7 -> c0a17919", + "c0c51aff 417c5236 41936eff -> 417c5236", + "415be60d 418a6630 401d0a26 -> 401d0a26", + "c0cec97c 3f994720 416b5d54 -> 3f994720", + "40ce3a8c c052c440 4162720e -> 40ce3a8c", + "c18d52d7 41572d3b 4145d9ad -> 4145d9ad", + "413f6c19 4148c982 c169b4ca -> c169b4ca", + "c1969a4b bf516809 c0b9abcf -> c0b9abcf", + "41843cc8 418a6759 4195995c -> 418a6759", + "beb3fc51 41845a52 c12bdec8 -> c12bdec8", + "41065497 c19db44d 41165fd1 -> 41065497", + "c1022786 c0fb5baa c12457b3 -> c12457b3" + ] + }, + { + "function": "cycles_clamp_range", + "node": "ShaderNodeClamp RANGE", + "cases": [ + "00000000 00000000 00000000 -> 00000000", + "00000000 00000000 3f800000 -> 00000000", + "00000000 00000000 bf800000 -> 00000000", + "00000000 00000000 3f000000 -> 00000000", + "00000000 00000000 bf000000 -> 00000000", + "00000000 00000000 40000000 -> 00000000", + "00000000 00000000 c0000000 -> 00000000", + "00000000 00000000 40400000 -> 00000000", + "00000000 00000000 c0300000 -> 00000000", + "00000000 00000000 3dcccccd -> 00000000", + "00000000 3f800000 00000000 -> 00000000", + "00000000 3f800000 3f800000 -> 3f800000", + "00000000 3f800000 bf800000 -> 00000000", + "00000000 3f800000 3f000000 -> 3f000000", + "00000000 3f800000 bf000000 -> 00000000", + "00000000 3f800000 40000000 -> 3f800000", + "00000000 3f800000 c0000000 -> 00000000", + "00000000 3f800000 40400000 -> 3f800000", + "00000000 3f800000 c0300000 -> 00000000", + "00000000 3f800000 3dcccccd -> 3dcccccd", + "00000000 bf800000 00000000 -> 00000000", + "00000000 bf800000 3f800000 -> 00000000", + "00000000 bf800000 bf800000 -> bf800000", + "00000000 bf800000 3f000000 -> 00000000", + "00000000 bf800000 bf000000 -> bf000000", + "00000000 bf800000 40000000 -> 00000000", + "00000000 bf800000 c0000000 -> bf800000", + "00000000 bf800000 40400000 -> 00000000", + "00000000 bf800000 c0300000 -> bf800000", + "00000000 bf800000 3dcccccd -> 00000000", + "00000000 3f000000 00000000 -> 00000000", + "00000000 3f000000 3f800000 -> 3f000000", + "00000000 3f000000 bf800000 -> 00000000", + "00000000 3f000000 3f000000 -> 3f000000", + "00000000 3f000000 bf000000 -> 00000000", + "00000000 3f000000 40000000 -> 3f000000", + "00000000 3f000000 c0000000 -> 00000000", + "00000000 3f000000 40400000 -> 3f000000", + "00000000 3f000000 c0300000 -> 00000000", + "00000000 3f000000 3dcccccd -> 3dcccccd", + "00000000 bf000000 00000000 -> 00000000", + "00000000 bf000000 3f800000 -> 00000000", + "00000000 bf000000 bf800000 -> bf000000", + "00000000 bf000000 3f000000 -> 00000000", + "00000000 bf000000 bf000000 -> bf000000", + "00000000 bf000000 40000000 -> 00000000", + "00000000 bf000000 c0000000 -> bf000000", + "00000000 bf000000 40400000 -> 00000000", + "00000000 bf000000 c0300000 -> bf000000", + "00000000 bf000000 3dcccccd -> 00000000", + "00000000 40000000 00000000 -> 00000000", + "00000000 40000000 3f800000 -> 3f800000", + "00000000 40000000 bf800000 -> 00000000", + "00000000 40000000 3f000000 -> 3f000000", + "00000000 40000000 bf000000 -> 00000000", + "00000000 40000000 40000000 -> 40000000", + "00000000 40000000 c0000000 -> 00000000", + "00000000 40000000 40400000 -> 40000000", + "00000000 40000000 c0300000 -> 00000000", + "00000000 40000000 3dcccccd -> 3dcccccd", + "00000000 c0000000 00000000 -> 00000000", + "00000000 c0000000 3f800000 -> 00000000", + "00000000 c0000000 bf800000 -> bf800000", + "00000000 c0000000 3f000000 -> 00000000", + "00000000 c0000000 bf000000 -> bf000000", + "00000000 c0000000 40000000 -> 00000000", + "00000000 c0000000 c0000000 -> c0000000", + "00000000 c0000000 40400000 -> 00000000", + "00000000 c0000000 c0300000 -> c0000000", + "00000000 c0000000 3dcccccd -> 00000000", + "00000000 40400000 00000000 -> 00000000", + "00000000 40400000 3f800000 -> 3f800000", + "00000000 40400000 bf800000 -> 00000000", + "00000000 40400000 3f000000 -> 3f000000", + "00000000 40400000 bf000000 -> 00000000", + "00000000 40400000 40000000 -> 40000000", + "00000000 40400000 c0000000 -> 00000000", + "00000000 40400000 40400000 -> 40400000", + "00000000 40400000 c0300000 -> 00000000", + "00000000 40400000 3dcccccd -> 3dcccccd", + "00000000 c0300000 00000000 -> 00000000", + "00000000 c0300000 3f800000 -> 00000000", + "00000000 c0300000 bf800000 -> bf800000", + "00000000 c0300000 3f000000 -> 00000000", + "00000000 c0300000 bf000000 -> bf000000", + "00000000 c0300000 40000000 -> 00000000", + "00000000 c0300000 c0000000 -> c0000000", + "00000000 c0300000 40400000 -> 00000000", + "00000000 c0300000 c0300000 -> c0300000", + "00000000 c0300000 3dcccccd -> 00000000", + "00000000 3dcccccd 00000000 -> 00000000", + "00000000 3dcccccd 3f800000 -> 3dcccccd", + "00000000 3dcccccd bf800000 -> 00000000", + "00000000 3dcccccd 3f000000 -> 3dcccccd", + "00000000 3dcccccd bf000000 -> 00000000", + "00000000 3dcccccd 40000000 -> 3dcccccd", + "00000000 3dcccccd c0000000 -> 00000000", + "00000000 3dcccccd 40400000 -> 3dcccccd", + "00000000 3dcccccd c0300000 -> 00000000", + "00000000 3dcccccd 3dcccccd -> 3dcccccd", + "3f800000 00000000 00000000 -> 00000000", + "3f800000 00000000 3f800000 -> 3f800000", + "3f800000 00000000 bf800000 -> 00000000", + "3f800000 00000000 3f000000 -> 3f000000", + "3f800000 00000000 bf000000 -> 00000000", + "3f800000 00000000 40000000 -> 3f800000", + "3f800000 00000000 c0000000 -> 00000000", + "3f800000 00000000 40400000 -> 3f800000", + "3f800000 00000000 c0300000 -> 00000000", + "3f800000 00000000 3dcccccd -> 3dcccccd", + "3f800000 3f800000 00000000 -> 3f800000", + "3f800000 3f800000 3f800000 -> 3f800000", + "3f800000 3f800000 bf800000 -> 3f800000", + "3f800000 3f800000 3f000000 -> 3f800000", + "3f800000 3f800000 bf000000 -> 3f800000", + "3f800000 3f800000 40000000 -> 3f800000", + "3f800000 3f800000 c0000000 -> 3f800000", + "3f800000 3f800000 40400000 -> 3f800000", + "3f800000 3f800000 c0300000 -> 3f800000", + "3f800000 3f800000 3dcccccd -> 3f800000", + "3f800000 bf800000 00000000 -> 00000000", + "3f800000 bf800000 3f800000 -> 3f800000", + "3f800000 bf800000 bf800000 -> bf800000", + "3f800000 bf800000 3f000000 -> 3f000000", + "3f800000 bf800000 bf000000 -> bf000000", + "3f800000 bf800000 40000000 -> 3f800000", + "3f800000 bf800000 c0000000 -> bf800000", + "3f800000 bf800000 40400000 -> 3f800000", + "3f800000 bf800000 c0300000 -> bf800000", + "3f800000 bf800000 3dcccccd -> 3dcccccd", + "3f800000 3f000000 00000000 -> 3f000000", + "3f800000 3f000000 3f800000 -> 3f800000", + "3f800000 3f000000 bf800000 -> 3f000000", + "3f800000 3f000000 3f000000 -> 3f000000", + "3f800000 3f000000 bf000000 -> 3f000000", + "3f800000 3f000000 40000000 -> 3f800000", + "3f800000 3f000000 c0000000 -> 3f000000", + "3f800000 3f000000 40400000 -> 3f800000", + "3f800000 3f000000 c0300000 -> 3f000000", + "3f800000 3f000000 3dcccccd -> 3f000000", + "3f800000 bf000000 00000000 -> 00000000", + "3f800000 bf000000 3f800000 -> 3f800000", + "3f800000 bf000000 bf800000 -> bf000000", + "3f800000 bf000000 3f000000 -> 3f000000", + "3f800000 bf000000 bf000000 -> bf000000", + "3f800000 bf000000 40000000 -> 3f800000", + "3f800000 bf000000 c0000000 -> bf000000", + "3f800000 bf000000 40400000 -> 3f800000", + "3f800000 bf000000 c0300000 -> bf000000", + "3f800000 bf000000 3dcccccd -> 3dcccccd", + "3f800000 40000000 00000000 -> 3f800000", + "3f800000 40000000 3f800000 -> 3f800000", + "3f800000 40000000 bf800000 -> 3f800000", + "3f800000 40000000 3f000000 -> 3f800000", + "3f800000 40000000 bf000000 -> 3f800000", + "3f800000 40000000 40000000 -> 40000000", + "3f800000 40000000 c0000000 -> 3f800000", + "3f800000 40000000 40400000 -> 40000000", + "3f800000 40000000 c0300000 -> 3f800000", + "3f800000 40000000 3dcccccd -> 3f800000", + "3f800000 c0000000 00000000 -> 00000000", + "3f800000 c0000000 3f800000 -> 3f800000", + "3f800000 c0000000 bf800000 -> bf800000", + "3f800000 c0000000 3f000000 -> 3f000000", + "3f800000 c0000000 bf000000 -> bf000000", + "3f800000 c0000000 40000000 -> 3f800000", + "3f800000 c0000000 c0000000 -> c0000000", + "3f800000 c0000000 40400000 -> 3f800000", + "3f800000 c0000000 c0300000 -> c0000000", + "3f800000 c0000000 3dcccccd -> 3dcccccd", + "3f800000 40400000 00000000 -> 3f800000", + "3f800000 40400000 3f800000 -> 3f800000", + "3f800000 40400000 bf800000 -> 3f800000", + "3f800000 40400000 3f000000 -> 3f800000", + "3f800000 40400000 bf000000 -> 3f800000", + "3f800000 40400000 40000000 -> 40000000", + "3f800000 40400000 c0000000 -> 3f800000", + "3f800000 40400000 40400000 -> 40400000", + "3f800000 40400000 c0300000 -> 3f800000", + "3f800000 40400000 3dcccccd -> 3f800000", + "3f800000 c0300000 00000000 -> 00000000", + "3f800000 c0300000 3f800000 -> 3f800000", + "3f800000 c0300000 bf800000 -> bf800000", + "3f800000 c0300000 3f000000 -> 3f000000", + "3f800000 c0300000 bf000000 -> bf000000", + "3f800000 c0300000 40000000 -> 3f800000", + "3f800000 c0300000 c0000000 -> c0000000", + "3f800000 c0300000 40400000 -> 3f800000", + "3f800000 c0300000 c0300000 -> c0300000", + "3f800000 c0300000 3dcccccd -> 3dcccccd", + "3f800000 3dcccccd 00000000 -> 3dcccccd", + "3f800000 3dcccccd 3f800000 -> 3f800000", + "3f800000 3dcccccd bf800000 -> 3dcccccd", + "3f800000 3dcccccd 3f000000 -> 3f000000", + "3f800000 3dcccccd bf000000 -> 3dcccccd", + "3f800000 3dcccccd 40000000 -> 3f800000", + "3f800000 3dcccccd c0000000 -> 3dcccccd", + "3f800000 3dcccccd 40400000 -> 3f800000", + "3f800000 3dcccccd c0300000 -> 3dcccccd", + "3f800000 3dcccccd 3dcccccd -> 3dcccccd", + "bf800000 00000000 00000000 -> 00000000", + "bf800000 00000000 3f800000 -> 00000000", + "bf800000 00000000 bf800000 -> bf800000", + "bf800000 00000000 3f000000 -> 00000000", + "bf800000 00000000 bf000000 -> bf000000", + "bf800000 00000000 40000000 -> 00000000", + "bf800000 00000000 c0000000 -> bf800000", + "bf800000 00000000 40400000 -> 00000000", + "bf800000 00000000 c0300000 -> bf800000", + "bf800000 00000000 3dcccccd -> 00000000", + "bf800000 3f800000 00000000 -> 00000000", + "bf800000 3f800000 3f800000 -> 3f800000", + "bf800000 3f800000 bf800000 -> bf800000", + "bf800000 3f800000 3f000000 -> 3f000000", + "bf800000 3f800000 bf000000 -> bf000000", + "bf800000 3f800000 40000000 -> 3f800000", + "bf800000 3f800000 c0000000 -> bf800000", + "bf800000 3f800000 40400000 -> 3f800000", + "bf800000 3f800000 c0300000 -> bf800000", + "bf800000 3f800000 3dcccccd -> 3dcccccd", + "bf800000 bf800000 00000000 -> bf800000", + "bf800000 bf800000 3f800000 -> bf800000", + "bf800000 bf800000 bf800000 -> bf800000", + "bf800000 bf800000 3f000000 -> bf800000", + "bf800000 bf800000 bf000000 -> bf800000", + "bf800000 bf800000 40000000 -> bf800000", + "bf800000 bf800000 c0000000 -> bf800000", + "bf800000 bf800000 40400000 -> bf800000", + "bf800000 bf800000 c0300000 -> bf800000", + "bf800000 bf800000 3dcccccd -> bf800000", + "bf800000 3f000000 00000000 -> 00000000", + "bf800000 3f000000 3f800000 -> 3f000000", + "bf800000 3f000000 bf800000 -> bf800000", + "bf800000 3f000000 3f000000 -> 3f000000", + "bf800000 3f000000 bf000000 -> bf000000", + "bf800000 3f000000 40000000 -> 3f000000", + "bf800000 3f000000 c0000000 -> bf800000", + "bf800000 3f000000 40400000 -> 3f000000", + "bf800000 3f000000 c0300000 -> bf800000", + "bf800000 3f000000 3dcccccd -> 3dcccccd", + "bf800000 bf000000 00000000 -> bf000000", + "bf800000 bf000000 3f800000 -> bf000000", + "bf800000 bf000000 bf800000 -> bf800000", + "bf800000 bf000000 3f000000 -> bf000000", + "bf800000 bf000000 bf000000 -> bf000000", + "bf800000 bf000000 40000000 -> bf000000", + "bf800000 bf000000 c0000000 -> bf800000", + "bf800000 bf000000 40400000 -> bf000000", + "bf800000 bf000000 c0300000 -> bf800000", + "bf800000 bf000000 3dcccccd -> bf000000", + "bf800000 40000000 00000000 -> 00000000", + "bf800000 40000000 3f800000 -> 3f800000", + "bf800000 40000000 bf800000 -> bf800000", + "bf800000 40000000 3f000000 -> 3f000000", + "bf800000 40000000 bf000000 -> bf000000", + "bf800000 40000000 40000000 -> 40000000", + "bf800000 40000000 c0000000 -> bf800000", + "bf800000 40000000 40400000 -> 40000000", + "bf800000 40000000 c0300000 -> bf800000", + "bf800000 40000000 3dcccccd -> 3dcccccd", + "bf800000 c0000000 00000000 -> bf800000", + "bf800000 c0000000 3f800000 -> bf800000", + "bf800000 c0000000 bf800000 -> bf800000", + "bf800000 c0000000 3f000000 -> bf800000", + "bf800000 c0000000 bf000000 -> bf800000", + "bf800000 c0000000 40000000 -> bf800000", + "bf800000 c0000000 c0000000 -> c0000000", + "bf800000 c0000000 40400000 -> bf800000", + "bf800000 c0000000 c0300000 -> c0000000", + "bf800000 c0000000 3dcccccd -> bf800000", + "bf800000 40400000 00000000 -> 00000000", + "bf800000 40400000 3f800000 -> 3f800000", + "bf800000 40400000 bf800000 -> bf800000", + "bf800000 40400000 3f000000 -> 3f000000", + "bf800000 40400000 bf000000 -> bf000000", + "bf800000 40400000 40000000 -> 40000000", + "bf800000 40400000 c0000000 -> bf800000", + "bf800000 40400000 40400000 -> 40400000", + "bf800000 40400000 c0300000 -> bf800000", + "bf800000 40400000 3dcccccd -> 3dcccccd", + "bf800000 c0300000 00000000 -> bf800000", + "bf800000 c0300000 3f800000 -> bf800000", + "bf800000 c0300000 bf800000 -> bf800000", + "bf800000 c0300000 3f000000 -> bf800000", + "bf800000 c0300000 bf000000 -> bf800000", + "bf800000 c0300000 40000000 -> bf800000", + "bf800000 c0300000 c0000000 -> c0000000", + "bf800000 c0300000 40400000 -> bf800000", + "bf800000 c0300000 c0300000 -> c0300000", + "bf800000 c0300000 3dcccccd -> bf800000", + "bf800000 3dcccccd 00000000 -> 00000000", + "bf800000 3dcccccd 3f800000 -> 3dcccccd", + "bf800000 3dcccccd bf800000 -> bf800000", + "bf800000 3dcccccd 3f000000 -> 3dcccccd", + "bf800000 3dcccccd bf000000 -> bf000000", + "bf800000 3dcccccd 40000000 -> 3dcccccd", + "bf800000 3dcccccd c0000000 -> bf800000", + "bf800000 3dcccccd 40400000 -> 3dcccccd", + "bf800000 3dcccccd c0300000 -> bf800000", + "bf800000 3dcccccd 3dcccccd -> 3dcccccd", + "3f000000 00000000 00000000 -> 00000000", + "3f000000 00000000 3f800000 -> 3f000000", + "3f000000 00000000 bf800000 -> 00000000", + "3f000000 00000000 3f000000 -> 3f000000", + "3f000000 00000000 bf000000 -> 00000000", + "3f000000 00000000 40000000 -> 3f000000", + "3f000000 00000000 c0000000 -> 00000000", + "3f000000 00000000 40400000 -> 3f000000", + "3f000000 00000000 c0300000 -> 00000000", + "3f000000 00000000 3dcccccd -> 3dcccccd", + "3f000000 3f800000 00000000 -> 3f000000", + "3f000000 3f800000 3f800000 -> 3f800000", + "3f000000 3f800000 bf800000 -> 3f000000", + "3f000000 3f800000 3f000000 -> 3f000000", + "3f000000 3f800000 bf000000 -> 3f000000", + "3f000000 3f800000 40000000 -> 3f800000", + "3f000000 3f800000 c0000000 -> 3f000000", + "3f000000 3f800000 40400000 -> 3f800000", + "3f000000 3f800000 c0300000 -> 3f000000", + "3f000000 3f800000 3dcccccd -> 3f000000", + "3f000000 bf800000 00000000 -> 00000000", + "3f000000 bf800000 3f800000 -> 3f000000", + "3f000000 bf800000 bf800000 -> bf800000", + "3f000000 bf800000 3f000000 -> 3f000000", + "3f000000 bf800000 bf000000 -> bf000000", + "3f000000 bf800000 40000000 -> 3f000000", + "3f000000 bf800000 c0000000 -> bf800000", + "3f000000 bf800000 40400000 -> 3f000000", + "3f000000 bf800000 c0300000 -> bf800000", + "3f000000 bf800000 3dcccccd -> 3dcccccd", + "3f000000 3f000000 00000000 -> 3f000000", + "3f000000 3f000000 3f800000 -> 3f000000", + "3f000000 3f000000 bf800000 -> 3f000000", + "3f000000 3f000000 3f000000 -> 3f000000", + "3f000000 3f000000 bf000000 -> 3f000000", + "3f000000 3f000000 40000000 -> 3f000000", + "3f000000 3f000000 c0000000 -> 3f000000", + "3f000000 3f000000 40400000 -> 3f000000", + "3f000000 3f000000 c0300000 -> 3f000000", + "3f000000 3f000000 3dcccccd -> 3f000000", + "3f000000 bf000000 00000000 -> 00000000", + "3f000000 bf000000 3f800000 -> 3f000000", + "3f000000 bf000000 bf800000 -> bf000000", + "3f000000 bf000000 3f000000 -> 3f000000", + "3f000000 bf000000 bf000000 -> bf000000", + "3f000000 bf000000 40000000 -> 3f000000", + "3f000000 bf000000 c0000000 -> bf000000", + "3f000000 bf000000 40400000 -> 3f000000", + "3f000000 bf000000 c0300000 -> bf000000", + "3f000000 bf000000 3dcccccd -> 3dcccccd", + "3f000000 40000000 00000000 -> 3f000000", + "3f000000 40000000 3f800000 -> 3f800000", + "3f000000 40000000 bf800000 -> 3f000000", + "3f000000 40000000 3f000000 -> 3f000000", + "3f000000 40000000 bf000000 -> 3f000000", + "3f000000 40000000 40000000 -> 40000000", + "3f000000 40000000 c0000000 -> 3f000000", + "3f000000 40000000 40400000 -> 40000000", + "3f000000 40000000 c0300000 -> 3f000000", + "3f000000 40000000 3dcccccd -> 3f000000", + "3f000000 c0000000 00000000 -> 00000000", + "3f000000 c0000000 3f800000 -> 3f000000", + "3f000000 c0000000 bf800000 -> bf800000", + "3f000000 c0000000 3f000000 -> 3f000000", + "3f000000 c0000000 bf000000 -> bf000000", + "3f000000 c0000000 40000000 -> 3f000000", + "3f000000 c0000000 c0000000 -> c0000000", + "3f000000 c0000000 40400000 -> 3f000000", + "3f000000 c0000000 c0300000 -> c0000000", + "3f000000 c0000000 3dcccccd -> 3dcccccd", + "3f000000 40400000 00000000 -> 3f000000", + "3f000000 40400000 3f800000 -> 3f800000", + "3f000000 40400000 bf800000 -> 3f000000", + "3f000000 40400000 3f000000 -> 3f000000", + "3f000000 40400000 bf000000 -> 3f000000", + "3f000000 40400000 40000000 -> 40000000", + "3f000000 40400000 c0000000 -> 3f000000", + "3f000000 40400000 40400000 -> 40400000", + "3f000000 40400000 c0300000 -> 3f000000", + "3f000000 40400000 3dcccccd -> 3f000000", + "3f000000 c0300000 00000000 -> 00000000", + "3f000000 c0300000 3f800000 -> 3f000000", + "3f000000 c0300000 bf800000 -> bf800000", + "3f000000 c0300000 3f000000 -> 3f000000", + "3f000000 c0300000 bf000000 -> bf000000", + "3f000000 c0300000 40000000 -> 3f000000", + "3f000000 c0300000 c0000000 -> c0000000", + "3f000000 c0300000 40400000 -> 3f000000", + "3f000000 c0300000 c0300000 -> c0300000", + "3f000000 c0300000 3dcccccd -> 3dcccccd", + "3f000000 3dcccccd 00000000 -> 3dcccccd", + "3f000000 3dcccccd 3f800000 -> 3f000000", + "3f000000 3dcccccd bf800000 -> 3dcccccd", + "3f000000 3dcccccd 3f000000 -> 3f000000", + "3f000000 3dcccccd bf000000 -> 3dcccccd", + "3f000000 3dcccccd 40000000 -> 3f000000", + "3f000000 3dcccccd c0000000 -> 3dcccccd", + "3f000000 3dcccccd 40400000 -> 3f000000", + "3f000000 3dcccccd c0300000 -> 3dcccccd", + "3f000000 3dcccccd 3dcccccd -> 3dcccccd", + "bf000000 00000000 00000000 -> 00000000", + "bf000000 00000000 3f800000 -> 00000000", + "bf000000 00000000 bf800000 -> bf000000", + "bf000000 00000000 3f000000 -> 00000000", + "bf000000 00000000 bf000000 -> bf000000", + "bf000000 00000000 40000000 -> 00000000", + "bf000000 00000000 c0000000 -> bf000000", + "bf000000 00000000 40400000 -> 00000000", + "bf000000 00000000 c0300000 -> bf000000", + "bf000000 00000000 3dcccccd -> 00000000", + "bf000000 3f800000 00000000 -> 00000000", + "bf000000 3f800000 3f800000 -> 3f800000", + "bf000000 3f800000 bf800000 -> bf000000", + "bf000000 3f800000 3f000000 -> 3f000000", + "bf000000 3f800000 bf000000 -> bf000000", + "bf000000 3f800000 40000000 -> 3f800000", + "bf000000 3f800000 c0000000 -> bf000000", + "bf000000 3f800000 40400000 -> 3f800000", + "bf000000 3f800000 c0300000 -> bf000000", + "bf000000 3f800000 3dcccccd -> 3dcccccd", + "bf000000 bf800000 00000000 -> bf000000", + "bf000000 bf800000 3f800000 -> bf000000", + "bf000000 bf800000 bf800000 -> bf800000", + "bf000000 bf800000 3f000000 -> bf000000", + "bf000000 bf800000 bf000000 -> bf000000", + "bf000000 bf800000 40000000 -> bf000000", + "bf000000 bf800000 c0000000 -> bf800000", + "bf000000 bf800000 40400000 -> bf000000", + "bf000000 bf800000 c0300000 -> bf800000", + "bf000000 bf800000 3dcccccd -> bf000000", + "bf000000 3f000000 00000000 -> 00000000", + "bf000000 3f000000 3f800000 -> 3f000000", + "bf000000 3f000000 bf800000 -> bf000000", + "bf000000 3f000000 3f000000 -> 3f000000", + "bf000000 3f000000 bf000000 -> bf000000", + "bf000000 3f000000 40000000 -> 3f000000", + "bf000000 3f000000 c0000000 -> bf000000", + "bf000000 3f000000 40400000 -> 3f000000", + "bf000000 3f000000 c0300000 -> bf000000", + "bf000000 3f000000 3dcccccd -> 3dcccccd", + "bf000000 bf000000 00000000 -> bf000000", + "bf000000 bf000000 3f800000 -> bf000000", + "bf000000 bf000000 bf800000 -> bf000000", + "bf000000 bf000000 3f000000 -> bf000000", + "bf000000 bf000000 bf000000 -> bf000000", + "bf000000 bf000000 40000000 -> bf000000", + "bf000000 bf000000 c0000000 -> bf000000", + "bf000000 bf000000 40400000 -> bf000000", + "bf000000 bf000000 c0300000 -> bf000000", + "bf000000 bf000000 3dcccccd -> bf000000", + "bf000000 40000000 00000000 -> 00000000", + "bf000000 40000000 3f800000 -> 3f800000", + "bf000000 40000000 bf800000 -> bf000000", + "bf000000 40000000 3f000000 -> 3f000000", + "bf000000 40000000 bf000000 -> bf000000", + "bf000000 40000000 40000000 -> 40000000", + "bf000000 40000000 c0000000 -> bf000000", + "bf000000 40000000 40400000 -> 40000000", + "bf000000 40000000 c0300000 -> bf000000", + "bf000000 40000000 3dcccccd -> 3dcccccd", + "bf000000 c0000000 00000000 -> bf000000", + "bf000000 c0000000 3f800000 -> bf000000", + "bf000000 c0000000 bf800000 -> bf800000", + "bf000000 c0000000 3f000000 -> bf000000", + "bf000000 c0000000 bf000000 -> bf000000", + "bf000000 c0000000 40000000 -> bf000000", + "bf000000 c0000000 c0000000 -> c0000000", + "bf000000 c0000000 40400000 -> bf000000", + "bf000000 c0000000 c0300000 -> c0000000", + "bf000000 c0000000 3dcccccd -> bf000000", + "bf000000 40400000 00000000 -> 00000000", + "bf000000 40400000 3f800000 -> 3f800000", + "bf000000 40400000 bf800000 -> bf000000", + "bf000000 40400000 3f000000 -> 3f000000", + "bf000000 40400000 bf000000 -> bf000000", + "bf000000 40400000 40000000 -> 40000000", + "bf000000 40400000 c0000000 -> bf000000", + "bf000000 40400000 40400000 -> 40400000", + "bf000000 40400000 c0300000 -> bf000000", + "bf000000 40400000 3dcccccd -> 3dcccccd", + "bf000000 c0300000 00000000 -> bf000000", + "bf000000 c0300000 3f800000 -> bf000000", + "bf000000 c0300000 bf800000 -> bf800000", + "bf000000 c0300000 3f000000 -> bf000000", + "bf000000 c0300000 bf000000 -> bf000000", + "bf000000 c0300000 40000000 -> bf000000", + "bf000000 c0300000 c0000000 -> c0000000", + "bf000000 c0300000 40400000 -> bf000000", + "bf000000 c0300000 c0300000 -> c0300000", + "bf000000 c0300000 3dcccccd -> bf000000", + "bf000000 3dcccccd 00000000 -> 00000000", + "bf000000 3dcccccd 3f800000 -> 3dcccccd", + "bf000000 3dcccccd bf800000 -> bf000000", + "bf000000 3dcccccd 3f000000 -> 3dcccccd", + "bf000000 3dcccccd bf000000 -> bf000000", + "bf000000 3dcccccd 40000000 -> 3dcccccd", + "bf000000 3dcccccd c0000000 -> bf000000", + "bf000000 3dcccccd 40400000 -> 3dcccccd", + "bf000000 3dcccccd c0300000 -> bf000000", + "bf000000 3dcccccd 3dcccccd -> 3dcccccd", + "40000000 00000000 00000000 -> 00000000", + "40000000 00000000 3f800000 -> 3f800000", + "40000000 00000000 bf800000 -> 00000000", + "40000000 00000000 3f000000 -> 3f000000", + "40000000 00000000 bf000000 -> 00000000", + "40000000 00000000 40000000 -> 40000000", + "40000000 00000000 c0000000 -> 00000000", + "40000000 00000000 40400000 -> 40000000", + "40000000 00000000 c0300000 -> 00000000", + "40000000 00000000 3dcccccd -> 3dcccccd", + "40000000 3f800000 00000000 -> 3f800000", + "40000000 3f800000 3f800000 -> 3f800000", + "40000000 3f800000 bf800000 -> 3f800000", + "40000000 3f800000 3f000000 -> 3f800000", + "40000000 3f800000 bf000000 -> 3f800000", + "40000000 3f800000 40000000 -> 40000000", + "40000000 3f800000 c0000000 -> 3f800000", + "40000000 3f800000 40400000 -> 40000000", + "40000000 3f800000 c0300000 -> 3f800000", + "40000000 3f800000 3dcccccd -> 3f800000", + "40000000 bf800000 00000000 -> 00000000", + "40000000 bf800000 3f800000 -> 3f800000", + "40000000 bf800000 bf800000 -> bf800000", + "40000000 bf800000 3f000000 -> 3f000000", + "40000000 bf800000 bf000000 -> bf000000", + "40000000 bf800000 40000000 -> 40000000", + "40000000 bf800000 c0000000 -> bf800000", + "40000000 bf800000 40400000 -> 40000000", + "40000000 bf800000 c0300000 -> bf800000", + "40000000 bf800000 3dcccccd -> 3dcccccd", + "40000000 3f000000 00000000 -> 3f000000", + "40000000 3f000000 3f800000 -> 3f800000", + "40000000 3f000000 bf800000 -> 3f000000", + "40000000 3f000000 3f000000 -> 3f000000", + "40000000 3f000000 bf000000 -> 3f000000", + "40000000 3f000000 40000000 -> 40000000", + "40000000 3f000000 c0000000 -> 3f000000", + "40000000 3f000000 40400000 -> 40000000", + "40000000 3f000000 c0300000 -> 3f000000", + "40000000 3f000000 3dcccccd -> 3f000000", + "40000000 bf000000 00000000 -> 00000000", + "40000000 bf000000 3f800000 -> 3f800000", + "40000000 bf000000 bf800000 -> bf000000", + "40000000 bf000000 3f000000 -> 3f000000", + "40000000 bf000000 bf000000 -> bf000000", + "40000000 bf000000 40000000 -> 40000000", + "40000000 bf000000 c0000000 -> bf000000", + "40000000 bf000000 40400000 -> 40000000", + "40000000 bf000000 c0300000 -> bf000000", + "40000000 bf000000 3dcccccd -> 3dcccccd", + "40000000 40000000 00000000 -> 40000000", + "40000000 40000000 3f800000 -> 40000000", + "40000000 40000000 bf800000 -> 40000000", + "40000000 40000000 3f000000 -> 40000000", + "40000000 40000000 bf000000 -> 40000000", + "40000000 40000000 40000000 -> 40000000", + "40000000 40000000 c0000000 -> 40000000", + "40000000 40000000 40400000 -> 40000000", + "40000000 40000000 c0300000 -> 40000000", + "40000000 40000000 3dcccccd -> 40000000", + "40000000 c0000000 00000000 -> 00000000", + "40000000 c0000000 3f800000 -> 3f800000", + "40000000 c0000000 bf800000 -> bf800000", + "40000000 c0000000 3f000000 -> 3f000000", + "40000000 c0000000 bf000000 -> bf000000", + "40000000 c0000000 40000000 -> 40000000", + "40000000 c0000000 c0000000 -> c0000000", + "40000000 c0000000 40400000 -> 40000000", + "40000000 c0000000 c0300000 -> c0000000", + "40000000 c0000000 3dcccccd -> 3dcccccd", + "40000000 40400000 00000000 -> 40000000", + "40000000 40400000 3f800000 -> 40000000", + "40000000 40400000 bf800000 -> 40000000", + "40000000 40400000 3f000000 -> 40000000", + "40000000 40400000 bf000000 -> 40000000", + "40000000 40400000 40000000 -> 40000000", + "40000000 40400000 c0000000 -> 40000000", + "40000000 40400000 40400000 -> 40400000", + "40000000 40400000 c0300000 -> 40000000", + "40000000 40400000 3dcccccd -> 40000000", + "40000000 c0300000 00000000 -> 00000000", + "40000000 c0300000 3f800000 -> 3f800000", + "40000000 c0300000 bf800000 -> bf800000", + "40000000 c0300000 3f000000 -> 3f000000", + "40000000 c0300000 bf000000 -> bf000000", + "40000000 c0300000 40000000 -> 40000000", + "40000000 c0300000 c0000000 -> c0000000", + "40000000 c0300000 40400000 -> 40000000", + "40000000 c0300000 c0300000 -> c0300000", + "40000000 c0300000 3dcccccd -> 3dcccccd", + "40000000 3dcccccd 00000000 -> 3dcccccd", + "40000000 3dcccccd 3f800000 -> 3f800000", + "40000000 3dcccccd bf800000 -> 3dcccccd", + "40000000 3dcccccd 3f000000 -> 3f000000", + "40000000 3dcccccd bf000000 -> 3dcccccd", + "40000000 3dcccccd 40000000 -> 40000000", + "40000000 3dcccccd c0000000 -> 3dcccccd", + "40000000 3dcccccd 40400000 -> 40000000", + "40000000 3dcccccd c0300000 -> 3dcccccd", + "40000000 3dcccccd 3dcccccd -> 3dcccccd", + "c0000000 00000000 00000000 -> 00000000", + "c0000000 00000000 3f800000 -> 00000000", + "c0000000 00000000 bf800000 -> bf800000", + "c0000000 00000000 3f000000 -> 00000000", + "c0000000 00000000 bf000000 -> bf000000", + "c0000000 00000000 40000000 -> 00000000", + "c0000000 00000000 c0000000 -> c0000000", + "c0000000 00000000 40400000 -> 00000000", + "c0000000 00000000 c0300000 -> c0000000", + "c0000000 00000000 3dcccccd -> 00000000", + "c0000000 3f800000 00000000 -> 00000000", + "c0000000 3f800000 3f800000 -> 3f800000", + "c0000000 3f800000 bf800000 -> bf800000", + "c0000000 3f800000 3f000000 -> 3f000000", + "c0000000 3f800000 bf000000 -> bf000000", + "c0000000 3f800000 40000000 -> 3f800000", + "c0000000 3f800000 c0000000 -> c0000000", + "c0000000 3f800000 40400000 -> 3f800000", + "c0000000 3f800000 c0300000 -> c0000000", + "c0000000 3f800000 3dcccccd -> 3dcccccd", + "c0000000 bf800000 00000000 -> bf800000", + "c0000000 bf800000 3f800000 -> bf800000", + "c0000000 bf800000 bf800000 -> bf800000", + "c0000000 bf800000 3f000000 -> bf800000", + "c0000000 bf800000 bf000000 -> bf800000", + "c0000000 bf800000 40000000 -> bf800000", + "c0000000 bf800000 c0000000 -> c0000000", + "c0000000 bf800000 40400000 -> bf800000", + "c0000000 bf800000 c0300000 -> c0000000", + "c0000000 bf800000 3dcccccd -> bf800000", + "c0000000 3f000000 00000000 -> 00000000", + "c0000000 3f000000 3f800000 -> 3f000000", + "c0000000 3f000000 bf800000 -> bf800000", + "c0000000 3f000000 3f000000 -> 3f000000", + "c0000000 3f000000 bf000000 -> bf000000", + "c0000000 3f000000 40000000 -> 3f000000", + "c0000000 3f000000 c0000000 -> c0000000", + "c0000000 3f000000 40400000 -> 3f000000", + "c0000000 3f000000 c0300000 -> c0000000", + "c0000000 3f000000 3dcccccd -> 3dcccccd", + "c0000000 bf000000 00000000 -> bf000000", + "c0000000 bf000000 3f800000 -> bf000000", + "c0000000 bf000000 bf800000 -> bf800000", + "c0000000 bf000000 3f000000 -> bf000000", + "c0000000 bf000000 bf000000 -> bf000000", + "c0000000 bf000000 40000000 -> bf000000", + "c0000000 bf000000 c0000000 -> c0000000", + "c0000000 bf000000 40400000 -> bf000000", + "c0000000 bf000000 c0300000 -> c0000000", + "c0000000 bf000000 3dcccccd -> bf000000", + "c0000000 40000000 00000000 -> 00000000", + "c0000000 40000000 3f800000 -> 3f800000", + "c0000000 40000000 bf800000 -> bf800000", + "c0000000 40000000 3f000000 -> 3f000000", + "c0000000 40000000 bf000000 -> bf000000", + "c0000000 40000000 40000000 -> 40000000", + "c0000000 40000000 c0000000 -> c0000000", + "c0000000 40000000 40400000 -> 40000000", + "c0000000 40000000 c0300000 -> c0000000", + "c0000000 40000000 3dcccccd -> 3dcccccd", + "c0000000 c0000000 00000000 -> c0000000", + "c0000000 c0000000 3f800000 -> c0000000", + "c0000000 c0000000 bf800000 -> c0000000", + "c0000000 c0000000 3f000000 -> c0000000", + "c0000000 c0000000 bf000000 -> c0000000", + "c0000000 c0000000 40000000 -> c0000000", + "c0000000 c0000000 c0000000 -> c0000000", + "c0000000 c0000000 40400000 -> c0000000", + "c0000000 c0000000 c0300000 -> c0000000", + "c0000000 c0000000 3dcccccd -> c0000000", + "c0000000 40400000 00000000 -> 00000000", + "c0000000 40400000 3f800000 -> 3f800000", + "c0000000 40400000 bf800000 -> bf800000", + "c0000000 40400000 3f000000 -> 3f000000", + "c0000000 40400000 bf000000 -> bf000000", + "c0000000 40400000 40000000 -> 40000000", + "c0000000 40400000 c0000000 -> c0000000", + "c0000000 40400000 40400000 -> 40400000", + "c0000000 40400000 c0300000 -> c0000000", + "c0000000 40400000 3dcccccd -> 3dcccccd", + "c0000000 c0300000 00000000 -> c0000000", + "c0000000 c0300000 3f800000 -> c0000000", + "c0000000 c0300000 bf800000 -> c0000000", + "c0000000 c0300000 3f000000 -> c0000000", + "c0000000 c0300000 bf000000 -> c0000000", + "c0000000 c0300000 40000000 -> c0000000", + "c0000000 c0300000 c0000000 -> c0000000", + "c0000000 c0300000 40400000 -> c0000000", + "c0000000 c0300000 c0300000 -> c0300000", + "c0000000 c0300000 3dcccccd -> c0000000", + "c0000000 3dcccccd 00000000 -> 00000000", + "c0000000 3dcccccd 3f800000 -> 3dcccccd", + "c0000000 3dcccccd bf800000 -> bf800000", + "c0000000 3dcccccd 3f000000 -> 3dcccccd", + "c0000000 3dcccccd bf000000 -> bf000000", + "c0000000 3dcccccd 40000000 -> 3dcccccd", + "c0000000 3dcccccd c0000000 -> c0000000", + "c0000000 3dcccccd 40400000 -> 3dcccccd", + "c0000000 3dcccccd c0300000 -> c0000000", + "c0000000 3dcccccd 3dcccccd -> 3dcccccd", + "40400000 00000000 00000000 -> 00000000", + "40400000 00000000 3f800000 -> 3f800000", + "40400000 00000000 bf800000 -> 00000000", + "40400000 00000000 3f000000 -> 3f000000", + "40400000 00000000 bf000000 -> 00000000", + "40400000 00000000 40000000 -> 40000000", + "40400000 00000000 c0000000 -> 00000000", + "40400000 00000000 40400000 -> 40400000", + "40400000 00000000 c0300000 -> 00000000", + "40400000 00000000 3dcccccd -> 3dcccccd", + "40400000 3f800000 00000000 -> 3f800000", + "40400000 3f800000 3f800000 -> 3f800000", + "40400000 3f800000 bf800000 -> 3f800000", + "40400000 3f800000 3f000000 -> 3f800000", + "40400000 3f800000 bf000000 -> 3f800000", + "40400000 3f800000 40000000 -> 40000000", + "40400000 3f800000 c0000000 -> 3f800000", + "40400000 3f800000 40400000 -> 40400000", + "40400000 3f800000 c0300000 -> 3f800000", + "40400000 3f800000 3dcccccd -> 3f800000", + "40400000 bf800000 00000000 -> 00000000", + "40400000 bf800000 3f800000 -> 3f800000", + "40400000 bf800000 bf800000 -> bf800000", + "40400000 bf800000 3f000000 -> 3f000000", + "40400000 bf800000 bf000000 -> bf000000", + "40400000 bf800000 40000000 -> 40000000", + "40400000 bf800000 c0000000 -> bf800000", + "40400000 bf800000 40400000 -> 40400000", + "40400000 bf800000 c0300000 -> bf800000", + "40400000 bf800000 3dcccccd -> 3dcccccd", + "40400000 3f000000 00000000 -> 3f000000", + "40400000 3f000000 3f800000 -> 3f800000", + "40400000 3f000000 bf800000 -> 3f000000", + "40400000 3f000000 3f000000 -> 3f000000", + "40400000 3f000000 bf000000 -> 3f000000", + "40400000 3f000000 40000000 -> 40000000", + "40400000 3f000000 c0000000 -> 3f000000", + "40400000 3f000000 40400000 -> 40400000", + "40400000 3f000000 c0300000 -> 3f000000", + "40400000 3f000000 3dcccccd -> 3f000000", + "40400000 bf000000 00000000 -> 00000000", + "40400000 bf000000 3f800000 -> 3f800000", + "40400000 bf000000 bf800000 -> bf000000", + "40400000 bf000000 3f000000 -> 3f000000", + "40400000 bf000000 bf000000 -> bf000000", + "40400000 bf000000 40000000 -> 40000000", + "40400000 bf000000 c0000000 -> bf000000", + "40400000 bf000000 40400000 -> 40400000", + "40400000 bf000000 c0300000 -> bf000000", + "40400000 bf000000 3dcccccd -> 3dcccccd", + "40400000 40000000 00000000 -> 40000000", + "40400000 40000000 3f800000 -> 40000000", + "40400000 40000000 bf800000 -> 40000000", + "40400000 40000000 3f000000 -> 40000000", + "40400000 40000000 bf000000 -> 40000000", + "40400000 40000000 40000000 -> 40000000", + "40400000 40000000 c0000000 -> 40000000", + "40400000 40000000 40400000 -> 40400000", + "40400000 40000000 c0300000 -> 40000000", + "40400000 40000000 3dcccccd -> 40000000", + "40400000 c0000000 00000000 -> 00000000", + "40400000 c0000000 3f800000 -> 3f800000", + "40400000 c0000000 bf800000 -> bf800000", + "40400000 c0000000 3f000000 -> 3f000000", + "40400000 c0000000 bf000000 -> bf000000", + "40400000 c0000000 40000000 -> 40000000", + "40400000 c0000000 c0000000 -> c0000000", + "40400000 c0000000 40400000 -> 40400000", + "40400000 c0000000 c0300000 -> c0000000", + "40400000 c0000000 3dcccccd -> 3dcccccd", + "40400000 40400000 00000000 -> 40400000", + "40400000 40400000 3f800000 -> 40400000", + "40400000 40400000 bf800000 -> 40400000", + "40400000 40400000 3f000000 -> 40400000", + "40400000 40400000 bf000000 -> 40400000", + "40400000 40400000 40000000 -> 40400000", + "40400000 40400000 c0000000 -> 40400000", + "40400000 40400000 40400000 -> 40400000", + "40400000 40400000 c0300000 -> 40400000", + "40400000 40400000 3dcccccd -> 40400000", + "40400000 c0300000 00000000 -> 00000000", + "40400000 c0300000 3f800000 -> 3f800000", + "40400000 c0300000 bf800000 -> bf800000", + "40400000 c0300000 3f000000 -> 3f000000", + "40400000 c0300000 bf000000 -> bf000000", + "40400000 c0300000 40000000 -> 40000000", + "40400000 c0300000 c0000000 -> c0000000", + "40400000 c0300000 40400000 -> 40400000", + "40400000 c0300000 c0300000 -> c0300000", + "40400000 c0300000 3dcccccd -> 3dcccccd", + "40400000 3dcccccd 00000000 -> 3dcccccd", + "40400000 3dcccccd 3f800000 -> 3f800000", + "40400000 3dcccccd bf800000 -> 3dcccccd", + "40400000 3dcccccd 3f000000 -> 3f000000", + "40400000 3dcccccd bf000000 -> 3dcccccd", + "40400000 3dcccccd 40000000 -> 40000000", + "40400000 3dcccccd c0000000 -> 3dcccccd", + "40400000 3dcccccd 40400000 -> 40400000", + "40400000 3dcccccd c0300000 -> 3dcccccd", + "40400000 3dcccccd 3dcccccd -> 3dcccccd", + "c0300000 00000000 00000000 -> 00000000", + "c0300000 00000000 3f800000 -> 00000000", + "c0300000 00000000 bf800000 -> bf800000", + "c0300000 00000000 3f000000 -> 00000000", + "c0300000 00000000 bf000000 -> bf000000", + "c0300000 00000000 40000000 -> 00000000", + "c0300000 00000000 c0000000 -> c0000000", + "c0300000 00000000 40400000 -> 00000000", + "c0300000 00000000 c0300000 -> c0300000", + "c0300000 00000000 3dcccccd -> 00000000", + "c0300000 3f800000 00000000 -> 00000000", + "c0300000 3f800000 3f800000 -> 3f800000", + "c0300000 3f800000 bf800000 -> bf800000", + "c0300000 3f800000 3f000000 -> 3f000000", + "c0300000 3f800000 bf000000 -> bf000000", + "c0300000 3f800000 40000000 -> 3f800000", + "c0300000 3f800000 c0000000 -> c0000000", + "c0300000 3f800000 40400000 -> 3f800000", + "c0300000 3f800000 c0300000 -> c0300000", + "c0300000 3f800000 3dcccccd -> 3dcccccd", + "c0300000 bf800000 00000000 -> bf800000", + "c0300000 bf800000 3f800000 -> bf800000", + "c0300000 bf800000 bf800000 -> bf800000", + "c0300000 bf800000 3f000000 -> bf800000", + "c0300000 bf800000 bf000000 -> bf800000", + "c0300000 bf800000 40000000 -> bf800000", + "c0300000 bf800000 c0000000 -> c0000000", + "c0300000 bf800000 40400000 -> bf800000", + "c0300000 bf800000 c0300000 -> c0300000", + "c0300000 bf800000 3dcccccd -> bf800000", + "c0300000 3f000000 00000000 -> 00000000", + "c0300000 3f000000 3f800000 -> 3f000000", + "c0300000 3f000000 bf800000 -> bf800000", + "c0300000 3f000000 3f000000 -> 3f000000", + "c0300000 3f000000 bf000000 -> bf000000", + "c0300000 3f000000 40000000 -> 3f000000", + "c0300000 3f000000 c0000000 -> c0000000", + "c0300000 3f000000 40400000 -> 3f000000", + "c0300000 3f000000 c0300000 -> c0300000", + "c0300000 3f000000 3dcccccd -> 3dcccccd", + "c0300000 bf000000 00000000 -> bf000000", + "c0300000 bf000000 3f800000 -> bf000000", + "c0300000 bf000000 bf800000 -> bf800000", + "c0300000 bf000000 3f000000 -> bf000000", + "c0300000 bf000000 bf000000 -> bf000000", + "c0300000 bf000000 40000000 -> bf000000", + "c0300000 bf000000 c0000000 -> c0000000", + "c0300000 bf000000 40400000 -> bf000000", + "c0300000 bf000000 c0300000 -> c0300000", + "c0300000 bf000000 3dcccccd -> bf000000", + "c0300000 40000000 00000000 -> 00000000", + "c0300000 40000000 3f800000 -> 3f800000", + "c0300000 40000000 bf800000 -> bf800000", + "c0300000 40000000 3f000000 -> 3f000000", + "c0300000 40000000 bf000000 -> bf000000", + "c0300000 40000000 40000000 -> 40000000", + "c0300000 40000000 c0000000 -> c0000000", + "c0300000 40000000 40400000 -> 40000000", + "c0300000 40000000 c0300000 -> c0300000", + "c0300000 40000000 3dcccccd -> 3dcccccd", + "c0300000 c0000000 00000000 -> c0000000", + "c0300000 c0000000 3f800000 -> c0000000", + "c0300000 c0000000 bf800000 -> c0000000", + "c0300000 c0000000 3f000000 -> c0000000", + "c0300000 c0000000 bf000000 -> c0000000", + "c0300000 c0000000 40000000 -> c0000000", + "c0300000 c0000000 c0000000 -> c0000000", + "c0300000 c0000000 40400000 -> c0000000", + "c0300000 c0000000 c0300000 -> c0300000", + "c0300000 c0000000 3dcccccd -> c0000000", + "c0300000 40400000 00000000 -> 00000000", + "c0300000 40400000 3f800000 -> 3f800000", + "c0300000 40400000 bf800000 -> bf800000", + "c0300000 40400000 3f000000 -> 3f000000", + "c0300000 40400000 bf000000 -> bf000000", + "c0300000 40400000 40000000 -> 40000000", + "c0300000 40400000 c0000000 -> c0000000", + "c0300000 40400000 40400000 -> 40400000", + "c0300000 40400000 c0300000 -> c0300000", + "c0300000 40400000 3dcccccd -> 3dcccccd", + "c0300000 c0300000 00000000 -> c0300000", + "c0300000 c0300000 3f800000 -> c0300000", + "c0300000 c0300000 bf800000 -> c0300000", + "c0300000 c0300000 3f000000 -> c0300000", + "c0300000 c0300000 bf000000 -> c0300000", + "c0300000 c0300000 40000000 -> c0300000", + "c0300000 c0300000 c0000000 -> c0300000", + "c0300000 c0300000 40400000 -> c0300000", + "c0300000 c0300000 c0300000 -> c0300000", + "c0300000 c0300000 3dcccccd -> c0300000", + "c0300000 3dcccccd 00000000 -> 00000000", + "c0300000 3dcccccd 3f800000 -> 3dcccccd", + "c0300000 3dcccccd bf800000 -> bf800000", + "c0300000 3dcccccd 3f000000 -> 3dcccccd", + "c0300000 3dcccccd bf000000 -> bf000000", + "c0300000 3dcccccd 40000000 -> 3dcccccd", + "c0300000 3dcccccd c0000000 -> c0000000", + "c0300000 3dcccccd 40400000 -> 3dcccccd", + "c0300000 3dcccccd c0300000 -> c0300000", + "c0300000 3dcccccd 3dcccccd -> 3dcccccd", + "3dcccccd 00000000 00000000 -> 00000000", + "3dcccccd 00000000 3f800000 -> 3dcccccd", + "3dcccccd 00000000 bf800000 -> 00000000", + "3dcccccd 00000000 3f000000 -> 3dcccccd", + "3dcccccd 00000000 bf000000 -> 00000000", + "3dcccccd 00000000 40000000 -> 3dcccccd", + "3dcccccd 00000000 c0000000 -> 00000000", + "3dcccccd 00000000 40400000 -> 3dcccccd", + "3dcccccd 00000000 c0300000 -> 00000000", + "3dcccccd 00000000 3dcccccd -> 3dcccccd", + "3dcccccd 3f800000 00000000 -> 3dcccccd", + "3dcccccd 3f800000 3f800000 -> 3f800000", + "3dcccccd 3f800000 bf800000 -> 3dcccccd", + "3dcccccd 3f800000 3f000000 -> 3f000000", + "3dcccccd 3f800000 bf000000 -> 3dcccccd", + "3dcccccd 3f800000 40000000 -> 3f800000", + "3dcccccd 3f800000 c0000000 -> 3dcccccd", + "3dcccccd 3f800000 40400000 -> 3f800000", + "3dcccccd 3f800000 c0300000 -> 3dcccccd", + "3dcccccd 3f800000 3dcccccd -> 3dcccccd", + "3dcccccd bf800000 00000000 -> 00000000", + "3dcccccd bf800000 3f800000 -> 3dcccccd", + "3dcccccd bf800000 bf800000 -> bf800000", + "3dcccccd bf800000 3f000000 -> 3dcccccd", + "3dcccccd bf800000 bf000000 -> bf000000", + "3dcccccd bf800000 40000000 -> 3dcccccd", + "3dcccccd bf800000 c0000000 -> bf800000", + "3dcccccd bf800000 40400000 -> 3dcccccd", + "3dcccccd bf800000 c0300000 -> bf800000", + "3dcccccd bf800000 3dcccccd -> 3dcccccd", + "3dcccccd 3f000000 00000000 -> 3dcccccd", + "3dcccccd 3f000000 3f800000 -> 3f000000", + "3dcccccd 3f000000 bf800000 -> 3dcccccd", + "3dcccccd 3f000000 3f000000 -> 3f000000", + "3dcccccd 3f000000 bf000000 -> 3dcccccd", + "3dcccccd 3f000000 40000000 -> 3f000000", + "3dcccccd 3f000000 c0000000 -> 3dcccccd", + "3dcccccd 3f000000 40400000 -> 3f000000", + "3dcccccd 3f000000 c0300000 -> 3dcccccd", + "3dcccccd 3f000000 3dcccccd -> 3dcccccd", + "3dcccccd bf000000 00000000 -> 00000000", + "3dcccccd bf000000 3f800000 -> 3dcccccd", + "3dcccccd bf000000 bf800000 -> bf000000", + "3dcccccd bf000000 3f000000 -> 3dcccccd", + "3dcccccd bf000000 bf000000 -> bf000000", + "3dcccccd bf000000 40000000 -> 3dcccccd", + "3dcccccd bf000000 c0000000 -> bf000000", + "3dcccccd bf000000 40400000 -> 3dcccccd", + "3dcccccd bf000000 c0300000 -> bf000000", + "3dcccccd bf000000 3dcccccd -> 3dcccccd", + "3dcccccd 40000000 00000000 -> 3dcccccd", + "3dcccccd 40000000 3f800000 -> 3f800000", + "3dcccccd 40000000 bf800000 -> 3dcccccd", + "3dcccccd 40000000 3f000000 -> 3f000000", + "3dcccccd 40000000 bf000000 -> 3dcccccd", + "3dcccccd 40000000 40000000 -> 40000000", + "3dcccccd 40000000 c0000000 -> 3dcccccd", + "3dcccccd 40000000 40400000 -> 40000000", + "3dcccccd 40000000 c0300000 -> 3dcccccd", + "3dcccccd 40000000 3dcccccd -> 3dcccccd", + "3dcccccd c0000000 00000000 -> 00000000", + "3dcccccd c0000000 3f800000 -> 3dcccccd", + "3dcccccd c0000000 bf800000 -> bf800000", + "3dcccccd c0000000 3f000000 -> 3dcccccd", + "3dcccccd c0000000 bf000000 -> bf000000", + "3dcccccd c0000000 40000000 -> 3dcccccd", + "3dcccccd c0000000 c0000000 -> c0000000", + "3dcccccd c0000000 40400000 -> 3dcccccd", + "3dcccccd c0000000 c0300000 -> c0000000", + "3dcccccd c0000000 3dcccccd -> 3dcccccd", + "3dcccccd 40400000 00000000 -> 3dcccccd", + "3dcccccd 40400000 3f800000 -> 3f800000", + "3dcccccd 40400000 bf800000 -> 3dcccccd", + "3dcccccd 40400000 3f000000 -> 3f000000", + "3dcccccd 40400000 bf000000 -> 3dcccccd", + "3dcccccd 40400000 40000000 -> 40000000", + "3dcccccd 40400000 c0000000 -> 3dcccccd", + "3dcccccd 40400000 40400000 -> 40400000", + "3dcccccd 40400000 c0300000 -> 3dcccccd", + "3dcccccd 40400000 3dcccccd -> 3dcccccd", + "3dcccccd c0300000 00000000 -> 00000000", + "3dcccccd c0300000 3f800000 -> 3dcccccd", + "3dcccccd c0300000 bf800000 -> bf800000", + "3dcccccd c0300000 3f000000 -> 3dcccccd", + "3dcccccd c0300000 bf000000 -> bf000000", + "3dcccccd c0300000 40000000 -> 3dcccccd", + "3dcccccd c0300000 c0000000 -> c0000000", + "3dcccccd c0300000 40400000 -> 3dcccccd", + "3dcccccd c0300000 c0300000 -> c0300000", + "3dcccccd c0300000 3dcccccd -> 3dcccccd", + "3dcccccd 3dcccccd 00000000 -> 3dcccccd", + "3dcccccd 3dcccccd 3f800000 -> 3dcccccd", + "3dcccccd 3dcccccd bf800000 -> 3dcccccd", + "3dcccccd 3dcccccd 3f000000 -> 3dcccccd", + "3dcccccd 3dcccccd bf000000 -> 3dcccccd", + "3dcccccd 3dcccccd 40000000 -> 3dcccccd", + "3dcccccd 3dcccccd c0000000 -> 3dcccccd", + "3dcccccd 3dcccccd 40400000 -> 3dcccccd", + "3dcccccd 3dcccccd c0300000 -> 3dcccccd", + "3dcccccd 3dcccccd 3dcccccd -> 3dcccccd", + "c10d7704 40b17135 c160680c -> c10d7704", + "407db410 c076bf3b 3f7c551b -> 3f7c551b", + "408a4a37 40e67460 c04f1172 -> 408a4a37", + "41836b86 c029fd3d c18e8080 -> c029fd3d", + "410287ab c193b748 408570a6 -> 408570a6", + "409deef4 c1912e09 c16a3263 -> c16a3263", + "40bf6080 c17f4ea0 41455701 -> 40bf6080", + "404a397f c15c9389 413c3d6d -> 404a397f", + "bea7f63a c1028477 c1388bef -> c1028477", + "4099ef38 400182be c0dc0bea -> 400182be", + "41861e96 40e5331d c04850e2 -> 40e5331d", + "c158c19b c073a9bb c084ab02 -> c084ab02", + "4102e54a 410478d2 c158f9f5 -> 4102e54a", + "41722bef c14cc076 40973723 -> 40973723", + "c08cf304 3f4a27b7 4128c005 -> 3f4a27b7", + "413b22c3 410d20b0 40baf00f -> 410d20b0", + "417d8a64 c0ab9265 c0a21922 -> c0a21922", + "3f119aa4 4192d03a c13b5603 -> 3f119aa4", + "41980e80 412a87cc c13ca53c -> 412a87cc", + "c05717ce 41119267 4155321c -> 41119267", + "3fe06a3a 410f4119 c1884edf -> 3fe06a3a", + "414746a8 40af3b9f c0e13645 -> 40af3b9f", + "c0eea659 c1594a4b c08977a1 -> c0eea659", + "c19121cb bfc53f56 c100646f -> c100646f" + ] + } + ] +} diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/infinite.json b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/infinite.json new file mode 100644 index 00000000..fef190a9 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/infinite.json @@ -0,0 +1,75 @@ +{ + "oracle": "tools/cycles-oracle/oracle.py (Blender 5.2.2 LTS, build d13f752e3b9c, Cycles CPU, 1 sample, Emit bake, float Non-Color images)", + "blender": "5.2.2 LTS", + "build_hash": "d13f752e3b9c", + "platform": "Linux", + "encoding": "each case is 'operands -> results', every scalar a float32 bit pattern in hex, colours flattened as r g b", + "family": "infinite", + "functions": [ + { + "function": "cycles_power", + "node": "ShaderNodeMath POWER", + "cases": [ + "bf800000 inf -> 3f800000", + "bf800000 -inf -> 3f800000", + "c0000000 inf -> inf", + "c0000000 -inf -> 00000000", + "bf000000 inf -> 00000000", + "bf000000 -inf -> inf", + "80000000 inf -> 00000000", + "80000000 -inf -> 00000000", + "3f000000 inf -> 00000000", + "3f000000 -inf -> inf", + "40000000 inf -> inf", + "40000000 -inf -> 00000000", + "3f800000 inf -> 3f800000", + "00000000 inf -> 00000000", + "00000000 -inf -> 00000000", + "inf 40400000 -> inf", + "-inf 40400000 -> -inf", + "-inf 40000000 -> inf", + "inf bf800000 -> 00000000", + "-inf bf800000 -> 00000000", + "-inf inf -> inf", + "inf inf -> inf" + ] + }, + { + "function": "cycles_modulo", + "node": "ShaderNodeMath MODULO", + "cases": [ + "inf 3f800000 -> nan", + "-inf 3f800000 -> nan", + "inf 40400000 -> nan", + "-inf 40400000 -> nan", + "inf 3dcccccd -> nan", + "-inf 3dcccccd -> nan", + "inf c0000000 -> nan", + "40a00000 inf -> 40a00000", + "c0a00000 inf -> c0a00000", + "40a00000 -inf -> 40a00000", + "inf inf -> nan", + "-inf inf -> nan", + "00000000 inf -> 00000000", + "inf 00000000 -> 00000000" + ] + }, + { + "function": "cycles_map_range_smoothstep", + "node": "ShaderNodeMapRange SMOOTHSTEP", + "cases": [ + "-inf -inf 3f800000 40000000 40400000 -> nan", + "-inf 3f800000 -inf 40000000 40400000 -> nan", + "-inf 3f800000 40a00000 40000000 40400000 -> 40000000", + "-inf c0a00000 3f800000 40000000 40400000 -> 40000000", + "inf c0a00000 3f800000 40000000 40400000 -> 40400000", + "inf 3f800000 c0a00000 40000000 40400000 -> 40000000", + "inf inf 3f800000 40000000 40400000 -> 40000000", + "inf 3f800000 inf 40000000 40400000 -> 40400000", + "-inf inf 3f800000 40000000 40400000 -> 40400000", + "-inf 3f800000 inf 40000000 40400000 -> 40000000", + "3f800000 -inf inf 40000000 40400000 -> nan" + ] + } + ] +} diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/map-range.json b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/map-range.json new file mode 100644 index 00000000..7c96c115 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/map-range.json @@ -0,0 +1,8254 @@ +{ + "oracle": "tools/cycles-oracle/oracle.py (Blender 5.2.2 LTS, build d13f752e3b9c, Cycles CPU, 1 sample, Emit bake, float Non-Color images)", + "blender": "5.2.2 LTS", + "build_hash": "d13f752e3b9c", + "platform": "Linux", + "encoding": "each case is 'operands -> results', every scalar a float32 bit pattern in hex, colours flattened as r g b", + "family": "map-range", + "functions": [ + { + "function": "cycles_map_range_linear", + "node": "ShaderNodeMapRange LINEAR", + "cases": [ + "00000000 00000000 00000000 4075fad0 c10756fe 40a08322 -> 00000000", + "00000000 00000000 3f800000 c198bae5 c097d24e 40a69c6a -> c198bae5", + "00000000 00000000 bf800000 be5e211b bf7e28ef 40fbe0b4 -> be5e211b", + "00000000 00000000 3f000000 bf294f5b c15addc6 3f80baf6 -> bf294f5b", + "00000000 00000000 bf000000 419e9372 4134bfbf 40b28438 -> 419e9372", + "00000000 3f800000 00000000 416050fc 41731569 40920e1a -> 41731569", + "00000000 3f800000 3f800000 4084eb5d be8b01d8 40ca6e2f -> 00000000", + "00000000 3f800000 bf800000 41067c70 c167e60e 405a1fa2 -> c042d33c", + "00000000 3f800000 3f000000 409bc84c 41051990 3f9883dd -> 413c4efa", + "00000000 3f800000 bf000000 c0bc1bdf 40af134e 40e36d7c -> 3fd80e50", + "00000000 bf800000 00000000 40992dfe 418a5018 405c151d -> 418a5018", + "00000000 bf800000 3f800000 c1489d3e 4000fe50 406eac43 -> c0a85daa", + "00000000 bf800000 bf800000 406bb868 c161b8aa 40b444c4 -> 00000000", + "00000000 bf800000 3f000000 419484d9 412170c0 4030f854 -> 414ea3bb", + "00000000 bf800000 bf000000 c120c5c3 4187f9af 409db239 -> 42302b1f", + "00000000 3f000000 00000000 c184294f 414d0ad8 3d225aea -> 414d0ad8", + "00000000 3f000000 3f800000 c18839f1 c129a25e 403edbc6 -> c1bba2b3", + "00000000 3f000000 bf800000 41913efb 40af096c 40fe6abc -> 415ed58b", + "00000000 3f000000 3f000000 be9e4767 c031d4b1 3f92822f -> 00000000", + "00000000 3f000000 bf000000 4092e0c3 c153c6ab 40e24741 -> c08a5649", + "00000000 bf000000 00000000 c0deec51 c189b55a 40448436 -> c189b55a", + "00000000 bf000000 3f800000 c01d4079 4177be49 40c0783c -> 40617d67", + "00000000 bf000000 bf800000 bf4a4759 c16e5b7e 40a2c4a5 -> 41551292", + "00000000 bf000000 3f000000 40bee434 40e8f5ad bee9478f -> 40d3ecf0", + "00000000 bf000000 bf000000 4040e1a5 40b43682 40993eb2 -> 00000000", + "3f800000 00000000 00000000 bf8713a8 3fb6ea75 400ce368 -> 00000000", + "3f800000 00000000 3f800000 c0d77f98 c1600cad 40fd258b -> c1600cad", + "3f800000 00000000 bf800000 c181ea97 419ac96f 40addfc2 -> c24f4f4e", + "3f800000 00000000 3f000000 c101e01e c18a6f3b be9e7cf5 -> c1d3ee67", + "3f800000 00000000 bf000000 c0c37bca c103e79f 405d429d -> bfeb5388", + "3f800000 3f800000 00000000 40f0642d c14498bd 40b252d8 -> 40f0642d", + "3f800000 3f800000 3f800000 c106166f bfe41440 40df3a76 -> 00000000", + "3f800000 3f800000 bf800000 410d3008 c15920f0 40f434d8 -> 410d3008", + "3f800000 3f800000 3f000000 4051c9ea 413f6597 40813d24 -> 4051c9ea", + "3f800000 3f800000 bf000000 417729c4 419ac141 40e35feb -> 417729c4", + "3f800000 bf800000 00000000 c0b1167e c16d385d 3e045c5c -> c1c0f2be", + "3f800000 bf800000 3f800000 c168ff32 be4b284a 40cafd03 -> be4b2840", + "3f800000 bf800000 bf800000 4094ffdf 413d1196 4066bfc8 -> 00000000", + "3f800000 bf800000 3f000000 40e65b7e c12a4402 40edc9f2 -> c184b4f6", + "3f800000 bf800000 bf000000 4199e2c8 bfaf4cac 405181bb -> c27cbdc2", + "3f800000 3f000000 00000000 40cfd4c3 c170435b 40b6b075 -> 41e00c0f", + "3f800000 3f000000 3f800000 c087a843 c052ebff 3f41c4d5 -> c052ebff", + "3f800000 3f000000 bf800000 c19f9240 c0f91a00 3fe121d6 -> c1c000d6", + "3f800000 3f000000 3f000000 c15fe90f 4192de2e bede1520 -> 00000000", + "3f800000 3f000000 bf000000 4180f878 bf2bb13b 4073980f -> 41c42379", + "3f800000 bf000000 00000000 c1377424 419520b8 3e80bf1c -> 429db594", + "3f800000 bf000000 3f800000 40e2c16d c121a26c 3fefd849 -> c121a26c", + "3f800000 bf000000 bf800000 40a716e0 413d6004 40b38523 -> c169f24c", + "3f800000 bf000000 3f000000 c0a01a94 3fa86414 404b4105 -> 408f32d2", + "3f800000 bf000000 bf000000 c19bf363 c1828e7e 40a02385 -> 00000000", + "bf800000 00000000 00000000 c05770bc 415c90f0 3f39d70c -> 00000000", + "bf800000 00000000 3f800000 3eda8a79 4188f3b1 40d558b2 -> c1821f5d", + "bf800000 00000000 bf800000 c1483479 40fa19c8 bf4a48ff -> 40fa19c6", + "bf800000 00000000 3f000000 406beb4a 3fb250f1 bf4baa1f -> 41045c3c", + "bf800000 00000000 bf000000 c0ba4a05 c18fdeb2 4012120d -> c1f12ae3", + "bf800000 3f800000 00000000 41943fdb c0e701e3 408119c3 -> c203e066", + "bf800000 3f800000 3f800000 4130d11b 410ecdfe 40a66994 -> 00000000", + "bf800000 3f800000 bf800000 c165eae2 c189f4d6 40b0b494 -> c189f4d6", + "bf800000 3f800000 3f000000 416fb594 40c988c0 40cc0ecf -> c19e079e", + "bf800000 3f800000 bf000000 c0709bad 412eeda0 409a4e11 -> 417d49cf", + "bf800000 bf800000 00000000 417df807 416c8553 40d7a0de -> 417df807", + "bf800000 bf800000 3f800000 412c000e 4140967b bda47821 -> 412c000e", + "bf800000 bf800000 bf800000 41884a99 4116d7a9 4013c9b3 -> 00000000", + "bf800000 bf800000 3f000000 40155b3f c1930270 40ed77d8 -> 40155b3f", + "bf800000 bf800000 bf000000 c14eae3d 41461867 40807b12 -> c14eae3d", + "bf800000 3f000000 00000000 4139f70a 410d1379 40dd9ab1 -> 404d315c", + "bf800000 3f000000 3f800000 4110deec c13dbadd 40c97bd3 -> 428f9588", + "bf800000 3f000000 bf800000 c06b9544 c057cf37 bf42bfd5 -> c057cf37", + "bf800000 3f000000 3f000000 c081639e c1014f80 40a728a8 -> 00000000", + "bf800000 3f000000 bf000000 40f37590 c0d7a0b5 40604e19 -> c15e95ec", + "bf800000 bf000000 00000000 c0caef0c c1538e13 4081ca1c -> 3f09f070", + "bf800000 bf000000 3f800000 41577b5b 41586e15 3fa7f526 -> 41572a72", + "bf800000 bf000000 bf800000 4044e395 c18cdfa3 40bf08a7 -> c18cdfa3", + "bf800000 bf000000 3f000000 c15492ae c19f4d7d 4096c8e6 -> c11f8e88", + "bf800000 bf000000 bf000000 40d60913 411224cc 409cff02 -> 00000000", + "3f000000 00000000 00000000 c0ba7552 419d52ac 4083da21 -> 00000000", + "3f000000 00000000 3f800000 c1997e14 405224fa 405d65e3 -> c0fe72ea", + "3f000000 00000000 bf800000 41523af6 4197d673 3ffe3f9f -> 412381fe", + "3f000000 00000000 3f000000 40bd12e2 c18a8ea3 40d7b93e -> c18a8ea4", + "3f000000 00000000 bf000000 c0f9221f 410af09e 3f5df69a -> c1c2095f", + "3f000000 3f800000 00000000 c17506f7 41979ba3 3ff05db4 -> 3fe8c138", + "3f000000 3f800000 3f800000 c15f8d4a bfacc1bf 40d593f4 -> 00000000", + "3f000000 3f800000 bf800000 c1686733 c169a843 bf4dd3d3 -> c168b777", + "3f000000 3f800000 3f000000 c192b65e 3eb21514 3f1810c9 -> 3eb21500", + "3f000000 3f800000 bf000000 402ab655 c0ad0319 40c96d37 -> bcc44180", + "3f000000 bf800000 00000000 40d8e914 bf59cf8b 3f48b939 -> c0954b74", + "3f000000 bf800000 3f800000 41922072 40bef574 40963da3 -> 4110ac44", + "3f000000 bf800000 bf800000 4144f5e9 c11f6a26 40d0fc3e -> 00000000", + "3f000000 bf800000 3f000000 bfb002da 418138f3 40a31405 -> 418138f3", + "3f000000 bf800000 bf000000 c0d151a7 40e8974c 4081c373 -> 420b8d27", + "3f000000 3f000000 00000000 410c3050 c17ad42f 40bbabbd -> 410c3050", + "3f000000 3f000000 3f800000 c18a741e bff749cb 409a9895 -> c18a741e", + "3f000000 3f000000 bf800000 c1948982 418b11e8 4041e98c -> c1948982", + "3f000000 3f000000 3f000000 c18a8170 4194a2d5 bf0ef8aa -> 00000000", + "3f000000 3f000000 bf000000 c020d7ed 3f592307 40fdf5ee -> c020d7ed", + "3f000000 bf000000 00000000 c0eb9835 3f63c8a9 3f1a1aa8 -> 41124530", + "3f000000 bf000000 3f800000 c19efbca c18aed67 40e90616 -> c1919cdd", + "3f000000 bf000000 bf800000 3f4ae438 bfa282d1 40d60aaf -> 409d56fd", + "3f000000 bf000000 3f000000 c1377820 419318dc 40e00fca -> 419318dc", + "3f000000 bf000000 bf000000 3fad7b7f 4137ba57 4052c52d -> 00000000", + "bf000000 00000000 00000000 41322abc c0e259b7 bf5d59ab -> 00000000", + "bf000000 00000000 3f800000 3eb3ae3b c0a14e38 40533fd7 -> 4042fee3", + "bf000000 00000000 bf800000 c07f4fdb c0515054 408b0244 -> c0685018", + "bf000000 00000000 3f000000 c15380f2 411dbcf6 40887878 -> c2112fb6", + "bf000000 00000000 bf000000 c12aa33b 408ea2d0 40208146 -> 408ea2d0", + "bf000000 3f800000 00000000 4139f69a 416c1dcc 406a4c44 -> 418298b2", + "bf000000 3f800000 3f800000 41905654 3f103a2b 3ebb9136 -> 00000000", + "bf000000 3f800000 bf800000 415563d6 c14eb9c7 3df7561c -> c0cb64bc", + "bf000000 3f800000 3f000000 c14a7c2f 4105915b 407fa257 -> 42496b1c", + "bf000000 3f800000 bf000000 4112fd04 415f5ebb 3f9b78b7 -> 415f5ebb", + "bf000000 bf800000 00000000 c07e6254 c1101c2f 401c7409 -> c0cfb4c4", + "bf000000 bf800000 3f800000 41305e31 418688c3 40a695db -> 41478b06", + "bf000000 bf800000 bf800000 bd4e84c7 bfafccf5 40df9b00 -> 00000000", + "bf000000 bf800000 3f000000 c0189e7a c162b54c 3f87cb55 -> c0ca0306", + "bf000000 bf800000 bf000000 40d83b60 40e00c81 4010600c -> 40e00c81", + "bf000000 3f000000 00000000 c09f34ad 411799ce 40fa60a0 -> 41bf66f9", + "bf000000 3f000000 3f800000 c172c10a c17d1443 bed3ad27 -> c15e1a98", + "bf000000 3f000000 bf800000 c10e15e3 41355d6d 4089199a -> 409318a6", + "bf000000 3f000000 3f000000 419606a7 41134bcf 3fd39d3a -> 00000000", + "bf000000 3f000000 bf000000 40cc230e c11de303 4048bd76 -> c11de303", + "bf000000 bf000000 00000000 c050e5a7 3fe9f19e 3e292cc9 -> c050e5a7", + "bf000000 bf000000 3f800000 c1700287 c1759fcd 40eaa309 -> c1700287", + "bf000000 bf000000 bf800000 c17ca312 c1759bac 401f5912 -> c17ca312", + "bf000000 bf000000 3f000000 c1019d74 c1813ab2 4043a06a -> c1019d74", + "bf000000 bf000000 bf000000 c0f1297e c03dbbcd 4089c69b -> 00000000", + "40000000 00000000 00000000 c0d8ddaa c16d5ea2 40ff4b25 -> 00000000", + "40000000 00000000 3f800000 413e457c 3f26bd0d 400d524b -> c1296dda", + "40000000 00000000 bf800000 c1322c0d 3e03c8a4 3fa43a56 -> c206a89b", + "40000000 00000000 3f000000 c110267e c18d7659 3fd2a2fc -> c22ecfd4", + "40000000 00000000 bf000000 3e0b26e4 be41a222 4055c2e0 -> 3fb7c960", + "40000000 3f800000 00000000 40b998e3 4192a51f 40d0b3e1 -> c0d762b5", + "40000000 3f800000 3f800000 40b59229 c033abfa 40680c65 -> 00000000", + "40000000 3f800000 bf800000 417cd408 c08a851b 40f187b6 -> 41ceefaa", + "40000000 3f800000 3f000000 41468b62 4167efd9 40cf3ace -> 4103c274", + "40000000 3f800000 bf000000 414632be 407f58c3 40eb09b0 -> 418fe2e4", + "40000000 bf800000 00000000 c191ecbd 4036cb4e 40f793b9 -> 423432dc", + "40000000 bf800000 3f800000 c016efb2 c18ea7c3 3d2c2215 -> c1cc8caa", + "40000000 bf800000 bf800000 c10cc035 405dc837 40a04e59 -> 00000000", + "40000000 bf800000 3f000000 400a83fd c13b3827 4069ffa0 -> c1cc88a6", + "40000000 bf800000 bf000000 41938c9e 3ff1e847 40a15b03 -> c2a1c200", + "40000000 3f000000 00000000 c019a76b 40e14178 40b614b1 -> c1f5c4cf", + "40000000 3f000000 3f800000 c1847782 419aba27 3f434fc6 -> 42b6475e", + "40000000 3f000000 bf800000 417fffe0 4182f0ca 3fe4ce1e -> 417a1e2c", + "40000000 3f000000 3f000000 c15b983e c138dc28 3f8e5ceb -> 00000000", + "40000000 3f000000 bf000000 c06fe847 418b782d 3f3a58eb -> c20e166d", + "40000000 bf000000 00000000 411d2c99 c1160410 3f43803d -> c2ac58d6", + "40000000 bf000000 3f800000 c13953f0 405365d2 bed9ec0d -> 4153a260", + "40000000 bf000000 bf800000 c12ef7f2 c0c2a260 400ae45a -> c20cce6f", + "40000000 bf000000 3f000000 c0f6ac49 be53da3e 408788a2 -> 4130bab0", + "40000000 bf000000 bf000000 c18dfdbe 4185282d be7389cd -> 00000000", + "c0000000 00000000 00000000 c03eebc9 40598ab1 40ce388f -> 00000000", + "c0000000 00000000 3f800000 c10c6542 4137f6da 402c2610 -> c245475e", + "c0000000 00000000 bf800000 412fe06e 4083444f 40b09772 -> c032707c", + "c0000000 00000000 3f000000 c1826ce9 c11e98bd 402621f5 -> c227778a", + "c0000000 00000000 bf000000 3f781b80 418e7647 40d92918 -> 4288a5a2", + "c0000000 3f800000 00000000 c1188e99 bf4e79df 3f9d6696 -> 4185332c", + "c0000000 3f800000 3f800000 4113f56c 411539b5 4031f5f8 -> 00000000", + "c0000000 3f800000 bf800000 418018d3 40bb50af 40ecbda3 -> 3f463b10", + "c0000000 3f800000 3f000000 401bf849 41353f56 40f07590 -> 425f216b", + "c0000000 3f800000 bf000000 40f7f57a c0ac6b7c 402241be -> c194331c", + "c0000000 bf800000 00000000 c0d32660 c0f97c25 3f8ce862 -> c0acd09b", + "c0000000 bf800000 3f800000 c1704621 c0b03e58 400cd9d7 -> c19e2cce", + "c0000000 bf800000 bf800000 c13f7d67 c0df7941 409f825f -> 00000000", + "c0000000 bf800000 3f000000 be8c96ab 41209325 40dd3164 -> c0e4be8e", + "c0000000 bf800000 bf000000 403129dc 4154284a 40c296c8 -> c191b898", + "c0000000 3f000000 00000000 410212f7 bfd8ce9d 3fb5acfb -> c223f340", + "c0000000 3f000000 3f800000 c07d03cb 40e29483 3ea77df7 -> c26c7e3e", + "c0000000 3f000000 bf800000 4125e416 c065c332 3f15fb5b -> c14e540c", + "c0000000 3f000000 3f000000 c186ba64 40966814 3fd5e3c8 -> 00000000", + "c0000000 3f000000 bf000000 c1857790 41561677 be37e05d -> 4269e7b8", + "c0000000 bf000000 00000000 40919db9 40dafbf5 40b22a30 -> c014f9f6", + "c0000000 bf000000 3f800000 40fa67f0 409b1ea0 4028517c -> 412cd8a0", + "c0000000 bf000000 bf800000 40298e48 c0a2bb4d 3fb27e43 -> c1a4700c", + "c0000000 bf000000 3f000000 41895698 c19f23a5 3fa22b9f -> 4291837c", + "c0000000 bf000000 bf000000 419df487 419bb6ae 4085347f -> 00000000", + "40400000 00000000 00000000 bf645e63 3fc9c7b5 40ba33b4 -> 00000000", + "40400000 00000000 3f800000 41000fdb c0724c13 3ffc5273 -> c1daec62", + "40400000 00000000 bf800000 412ac8b1 c1901e5c 4085ff82 -> 42c17b1d", + "40400000 00000000 3f000000 4146d138 bf56fab2 40f5a325 -> c2865683", + "40400000 00000000 bf000000 3fcadd6b c129e04a bf37dcc6 -> 4295986f", + "40400000 3f800000 00000000 c175994e c186e953 3f8c94f0 -> c145269e", + "40400000 3f800000 3f800000 3ea174fe c19fbb2a 40e96338 -> 00000000", + "40400000 3f800000 bf800000 402c3235 c0e28c59 40f673f7 -> 41475f47", + "40400000 3f800000 3f000000 c105c95f 40350be3 3f171f75 -> c2547eb0", + "40400000 3f800000 bf000000 418c5e37 c0821730 40998be4 -> 423971c8", + "40400000 bf800000 00000000 c14894e7 40b2593f 40e909f2 -> 426f9c4c", + "40400000 bf800000 3f800000 c0c75ba8 412dc311 404ec19b -> 41df99fa", + "40400000 bf800000 bf800000 41041245 c0f0aef3 bca31b4b -> 00000000", + "40400000 bf800000 3f000000 c182918f 4197ce66 409361a3 -> 429b9b94", + "40400000 bf800000 bf000000 c198e5a0 4188ec9a 40c09d16 -> 43875ac3", + "40400000 3f000000 00000000 c15c7270 bfd0169b 40e0c721 -> c2951410", + "40400000 3f000000 3f800000 c1830a89 417863e0 40a3aac9 -> 430f247b", + "40400000 3f000000 bf800000 c146eab1 c040624d bec5adfa -> c1e12472", + "40400000 3f000000 3f000000 418bc417 412d399b 40b849ee -> 00000000", + "40400000 3f000000 bf000000 4127f4b9 c102beb0 4081c575 -> 4264ad4f", + "40400000 bf000000 00000000 41981135 c16cefce 40ffa5aa -> c359b5d1", + "40400000 bf000000 3f800000 41539d95 41763eb8 40f32c8a -> 41923573", + "40400000 bf000000 bf800000 c185b33d 4185de81 3ef3a3ce -> c37ad5ee", + "40400000 bf000000 3f000000 413eef26 c10ab370 405ded83 -> c270b27a", + "40400000 bf000000 bf000000 c192c361 412f1e31 4038d2ef -> 00000000", + "c0300000 00000000 00000000 c17f34af 4195f642 4085fedf -> 00000000", + "c0300000 00000000 3f800000 c0d39cd7 411b5808 3e030fbe -> c24dfe0b", + "c0300000 00000000 bf800000 40e1449b c199f688 40eb19b6 -> c2827cfe", + "c0300000 00000000 3f000000 c114c831 c15111c1 3f6bfa8c -> 4136cc67", + "c0300000 00000000 bf000000 41559d6e c0c2f05a 405c7474 -> c2bb2b2d", + "c0300000 3f800000 00000000 c16a775c c16d0707 40cab992 -> c174121d", + "c0300000 3f800000 3f800000 bf9746d4 c01b0d09 40d90fb5 -> 00000000", + "c0300000 3f800000 bf800000 41006c0f c1201d18 40dcf3a3 -> c1ce4a8e", + "c0300000 3f800000 3f000000 c163fea3 40a43ed2 4057e450 -> 43031e2c", + "c0300000 3f800000 bf000000 c17ebd70 c18e9d8b 4012705d -> c1a57bc8", + "c0300000 bf800000 00000000 c0c50e13 4084498b 40b5531b -> c1c159da", + "c0300000 bf800000 3f800000 40147048 4186381a 4008abdf -> c1254d8c", + "c0300000 bf800000 bf800000 c18ef5fa c0cf0dd6 40e73fb3 -> 00000000", + "c0300000 bf800000 3f000000 4144955e c180ee85 3f9a98eb -> 4235b160", + "c0300000 bf800000 bf000000 41294edf 41949b54 3ff26fc2 -> c18b2e30", + "c0300000 3f000000 00000000 419aa0db c0a243e1 40b69040 -> c30b4460", + "c0300000 3f000000 3f800000 c196b785 414a37fa 3e526c7a -> c35f72cb", + "c0300000 3f000000 bf800000 bf081a9c c10a544b 40bb9b9f -> c190e504", + "c0300000 3f000000 3f000000 c10c18a5 c0f3b9b5 3f33ac85 -> 00000000", + "c0300000 3f000000 bf000000 3f9483c6 c0932a2f 40cca691 -> c18c74ce", + "c0300000 bf000000 00000000 40f7eabe c049b6ad 4043ecae -> 42632cc3", + "c0300000 bf000000 3f800000 c13ac4fe c19b874d 40dc24de -> bcad2800", + "c0300000 bf000000 bf800000 c1529892 4143697f 401202a4 -> 42ca0e17", + "c0300000 bf000000 3f000000 40c777b6 c170ebe5 40995316 -> 42588d53", + "c0300000 bf000000 bf000000 41419c6a c189b96b 40f0b996 -> 00000000", + "3dcccccd 00000000 00000000 4159839a bf5a6344 40b7fc3b -> 00000000", + "3dcccccd 00000000 3f800000 c0e83250 c03f19c1 4085fe74 -> c0da882b", + "3dcccccd 00000000 bf800000 c05e7c49 c12d0e6e 3f37cdd1 -> c02f82f1", + "3dcccccd 00000000 3f000000 c10af753 c0907a33 3fa29aad -> c0fb3dc2", + "3dcccccd 00000000 bf000000 411750ef 413cf66d 40df4717 -> 410fc96f", + "3dcccccd 3f800000 00000000 41468f5b c13786bd 3fc64987 -> c1115153", + "3dcccccd 3f800000 3f800000 bfe89341 c1257803 40ded285 -> 00000000", + "3dcccccd 3f800000 bf800000 40a04a23 c179864b 403aa3fc -> c08869af", + "3dcccccd 3f800000 3f000000 c10fdd5c 4127a9ef bf7e604b -> 41d0717c", + "3dcccccd 3f800000 bf000000 41728e22 4182ea3d 40a5853a -> 417e1ebd", + "3dcccccd bf800000 00000000 4182379c c1103e21 40adace5 -> c138b5dc", + "3dcccccd bf800000 3f800000 c024bd8b 41919158 4050a96d -> 410d975a", + "3dcccccd bf800000 bf800000 bd84345a c0dae62d 40c438a4 -> 00000000", + "3dcccccd bf800000 3f000000 c18501d9 418aafb9 3fbc35ee -> 41047836", + "3dcccccd bf800000 bf000000 4193907e c12266a9 40f32757 -> c231dbf5", + "3dcccccd 3f000000 00000000 410facd2 c1891ea8 bf224ffe -> c13ea816", + "3dcccccd 3f000000 3f800000 c19789b8 40d47410 3f9a44b8 -> c21da128", + "3dcccccd 3f000000 bf800000 4137c786 c142f580 3fc734c0 -> 40a590a2", + "3dcccccd 3f000000 3f000000 417df931 c1137cf2 3ee20e69 -> 00000000", + "3dcccccd 3f000000 bf000000 415c2137 419fa182 4058ca5d -> 4181e42b", + "3dcccccd bf000000 00000000 4179aaff c12c4ff5 40817a64 -> c1805aae", + "3dcccccd bf000000 3f800000 c1951fbc 4193cd2c bb5cdb93 -> c072d494", + "3dcccccd bf000000 bf800000 c00dfc86 40a3dc4d bf79a9d6 -> c13068ac", + "3dcccccd bf000000 3f000000 4195a648 4184c089 be7e3980 -> 418b82d5", + "3dcccccd bf000000 bf000000 c01523d2 c06bbe60 40354e65 -> 00000000", + "415ce74a bf5a2a25 40bdfbaf 4146d42c c0deee76 402e7aea -> c1eb9152", + "c099dca9 40bece6d c043593f c1847eca 417684cd 403b5e1b -> 41ad12ac", + "c050f206 c118007b 40c54340 c18a91e5 4087463c bef812c4 -> c10be665", + "4142c095 4103b07b 4107a2dc 40ed76cd 40c3fbb8 3f2cb624 -> c154a9da", + "c18a994d c027ba53 40e1f287 40e63c15 c14f5013 4095eb02 -> 42173417", + "40bd87c0 c118ef81 c0af0f9a 4060e08f c17e510e bec31bcb -> c28bfabc", + "40a566d2 3f9acdcf 3fd6ac01 c09a1318 4164fbb0 4096bcd0 -> 431d187b", + "c136550f c0962a4f c0d5a3d3 4112fd15 bfd56594 40bc175f -> c1dbef4e", + "c1567049 40a9e57c 40d5b269 c10226e9 40f593a9 405dea97 -> c3603f7f", + "4105410b c0818bbc bdef573e c17448cb c1988b80 40b3de73 -> c1d9da9c", + "c16b11e5 411d10d6 c037579f c018b197 40f7c93d bf28557c -> 41898583", + "40c11989 bf223e3f c0b341ea 41343b66 4039faca 3fad4521 -> 41b3de12", + "413dcc17 4091f6f5 3fb12089 417aba9b 4046ec41 40d7f898 -> 4232231c", + "4180a0b7 c00fcb6d 4109924a c136b61d c0ffbe83 40265302 -> c0b41820", + "c168f2b5 c1001626 c10becdf c160dbb0 c1856761 402f3004 -> c2151b31", + "c0a93203 40216028 41076e84 40dfb31a c187cd00 3f69a442 -> 4219ec23", + "c0d63cc2 c0cd6a2f 411bcada c17104a5 418b5379 40386458 -> c179e2e3", + "414e8a6c 4087ff0d 40f2b1ad 3f420fc5 408f584a 402ef932 -> 4126c232", + "bf963863 c0c9129e bfb00f64 c1388095 413c980b 40daabff -> 414bf097", + "c135ece8 c0ce4cc7 3f3da0e8 c18dafdf 3f90cf1a 409c2048 -> c1f4f0f7", + "4106a882 4067a36a 40984645 c0f2429c bf083dd4 40867832 -> 41b08563", + "418746dc c01671f4 4067186d c141296b c19a8fa1 40d7252c -> c20df330", + "418ba4d6 4005a044 3e8c0d23 419ff636 3f711a93 40d480dc -> 43356053", + "3f8b60b3 4018c2d6 c0b2f94e be81b047 41377f24 40a3a87f -> 3fd3a212", + "c080bdd1 c0659a7a 3f4ffdb9 c179f90c c198560e 3fa11362 -> c1748eb2", + "c19a1e4d c04af6f4 c104ce49 404a0d78 4183e687 40873fa6 -> 4233effe", + "c1548074 40a10f9a 3ff55fa4 c0386423 c12fb47f 40bbbcdb -> c249f536", + "40484240 40575bdb c0007e26 c19cb832 bf9d5401 40945d7a -> c19644e3", + "c15140b4 c1003d6f bfd52f65 40efe3ba c19974f1 40eda9b2 -> 41e62b06", + "416e809c c0b2f267 c11b6459 c1834807 4112923d 3ffc05e8 -> c30fa327", + "4021f527 c01dfcdd c02bab3d bfe9ed82 3f4e10e3 40482c61 -> c27d9054", + "4185087b 40e049e2 be742c1e 3ff1aceb 403de022 be80f415 -> 3ee996ac", + "41845faf c0485fea c0fff12d bfe42439 418c4de6 3f1c0277 -> c29fc7ec", + "c16bea10 c0e60f98 c10ffba5 40b83803 c0a423f4 40d98e35 -> c21ec881", + "c189c154 405886ad 40dd19b5 c181fc21 419d718a 40b8b0f9 -> c3622bb2", + "c0af8ac5 4033ed22 407d227f c150e656 c1888aed bf3376c0 -> 4180550a", + "40abf342 c114e9c0 c11f2012 40d337af c0610b20 40217b69 -> 436f4bc1", + "4084a316 bfdcd9a7 c0f52971 40e14f1d c15f5ed4 40cdc8c0 -> 41de7b85", + "c135b3be c0a43670 4085b8eb 41269b2d c07cb323 409aa35f -> 41a01dac", + "c0d79a67 3faf3004 40a52e69 40db287b 417ad904 40b60028 -> c1405058", + "c06c60d8 4106a623 c0a67095 c18f5f6e c0aa34c9 40951617 -> c0d6dcfc", + "be5ee8b4 c10b4735 40626c24 c11b3a77 bff1137f 40536256 -> c0890403", + "419ad01b c0564ae0 4074b1f1 3ef1f7ed c186eedb 40b648bd -> c259a3ac", + "c0b9dd3b 4114e214 40b4b5e3 4101a30f 4147bb69 3ffcfc9f -> 41d19f32", + "41847506 40eb7b19 4112e337 c1962d73 c0feb2ff 3ff29653 -> 420f4d5a", + "c18174e5 c04f07d5 c0c03475 419a14bf 407722a7 40b4c466 -> c252b262", + "c15ab6b1 40d2ed10 c1050c3e c1951883 c0b82331 4037509c -> bf904920", + "411291b3 c11a7f05 c0c9e83f 40264654 41047f96 3d986513 -> 420a36f5", + "c1734e7f 40ad771e 403566c8 4192a4e6 c11406e2 40c94211 -> c349a5dd", + "4159a91d 4117ac85 4016bd3d 418cc01f 3f0cc59d 401e4365 -> 41dbaeaf", + "410b86b5 40d22433 c0d4554c bdb538a7 bf2324fa bf5ed864 -> 3a86d400", + "c0b512d1 40de972e 40fb8a8c 3fd26a88 c0e7d7c7 407ec1fd -> 42fb2b28", + "c07e2499 3feeba0a 40961faf 400342c7 40b33f34 408bf35a -> c0a8f9b0", + "41840397 3eeec7af c10107be bf851e80 c155dfaa 403d1586 -> 41b10d38", + "41891868 bfbe9869 40b0d8cb 4059a10f 410c354a 40f3b14c -> 418d1a6a", + "c0dca892 404c5740 c11c1444 414dd66b c0dd4b4c 40f741f9 -> c0230518", + "410563ad 40d93557 bf1090ff c00f88e7 c183ba69 40c533c6 -> 3f410208", + "3fcd165c 40339a4a 40fa8f8f c13bec1e 41993a36 40fc998b -> c199348f", + "3fe07a8c 4100b931 4043a900 418ed536 4192f001 bf782e09 -> 41940298", + "c07b67a4 bfb6b66d bfab5c81 4192d364 40afcc0b 40027e59 -> 43be7dde", + "418c9d6e 4116cd39 40d12972 c0a8a746 c1332994 4067a6cc -> 41374945", + "4192c4fa 400730b5 41073e92 c112d02e bfd775dd beb241fc -> 4120201c", + "412ddaf1 c1093eb5 40f2441a c11c8658 c0acf853 40b64c4f -> c09062fd", + "416a5aab 4109785c bf3482c6 c100bf1e c13f7735 3f84a532 -> c0afcb30", + "408f78d9 c0bc778d c1077edd bfb38cc0 c183a60a 40552c67 -> 426c9641", + "c12f6d6a 3f305654 c112a917 4169f139 c169ad23 40ca9287 -> c19f7e58", + "41247f6a c09ca135 c029f8dc 41919f2b 40525a53 3f523272 -> c2a5ce2f", + "c132c165 c11b0264 bf7aa6fa c1487a86 c0690e46 40db5a79 -> c160b6c8", + "c1313f08 4068010f c0022bbf c0484b16 40fd1883 bf2feb0d -> 41cc6893", + "c0816fee 40a24fc5 4115e793 c157d84a 4134dae6 40908d37 -> c284329c", + "4031b767 40c0a214 c101ffcf c0422dfc 41518ee2 402de2f3 -> 3f2a1628", + "409555d2 40bf13cb 4089bf44 3f21d4cc 40b660cd 40b27fff -> 4093250f", + "3e98617e c01500bc 3f0d2189 414dac4b c131038b 40815ef1 -> c10f4ccd", + "c148ffb4 c049211d 3fe56737 c0fbb72e c00ac065 408ff2b8 -> c195f14d", + "3ea90bf7 c09d4549 c0f6d280 409abf10 c10f7d45 bf5de87d -> 41f5a7a6", + "c13e459a c00d7be2 4100b72b 41762923 c0cc8635 4015ca36 -> 420fc50b", + "c13ff2ce c0f8a7c4 3e8123da 402c8bf2 417383a0 bf6a8b1b -> c079aebe", + "417db413 40a22557 c1032331 c018d6b2 40d80565 4047a037 -> c11d2870", + "41812e45 c0b24b56 c11100eb c0a33b12 c124ba36 bf71a3e0 -> 41d9bb38", + "4184d39d 40b7ed2c c0c6a76e 40b2a11a c18da5df bf0a10c5 -> 41d5d22e", + "400d0431 40d80a54 402cad09 415635eb c111350d 40ff9c26 -> c13d12b3", + "4190250d 3e00524c 40a17a8c c131d312 c178c7e9 407b7b45 -> c1d9e9f4", + "c0f465ca bf03e561 40a757d2 4194da1f c103d642 3f34b3a9 -> 424f8fa8", + "3fbffc50 bf342c1f 40b6ed81 c15ebb36 c1899459 40f3131f -> c170b9f8", + "c08193b8 4090f893 c11dc9c0 bd1d9ea3 c1809bab 408828b7 -> c1199586", + "408af58d bf3424a9 c0a5e771 3eb5ed49 c1681bbf 40c19f16 -> 4188bd93", + "c18641db c00acad9 40b30557 40f4239e 41931aa0 40b4ffdd -> c149f8f9", + "410e2543 40f79f0b 411e4428 c18c1534 40e3bd08 40bcc337 -> c08cf970", + "c123e9b0 3e2df59b bdf13ccf 40d0372c c181783f 4073f0a6 -> c44bbc04", + "418150ea c0c33ba2 c105686a c1182a0f c126a1bf 3f04a1f5 -> bf029840", + "419a2a2e bfa162b6 3fc95fdb c182276a c055b932 bf2ff13f -> 429acd58", + "3f658c01 40cc6037 410d3a41 40e996e1 412f6a03 4001c250 -> bf71a248", + "c19a60b6 40f7c18a 401c63a3 406b0a8f c09ecdf8 40cbed92 -> c22191e4", + "418db0a9 c0f49b8a 40b91a4d 3f88709f c0945fc0 bdb2188b -> c11b39ce", + "41525ba1 c0c29af6 c105f98e c108b049 4123f863 4090ad4b -> c32630fe", + "c0bf6ae8 40b10ad0 c101c95e 417ba37c 410547c5 40e26ad1 -> 4117c18c", + "4123970b c1090833 40c6cde2 416c95dd 410dd56a 3f50e82b -> 40e83864", + "416bf9e9 bf33fafb 40137993 c0bec89c 3fd69cb7 4045e408 -> 420523c8", + "c14ee1a4 3f9fe7dc c1079917 40fa4aab 401b2bad 40bf470e -> bd455c80", + "415e27b4 40670be7 3fde273f c184e386 c181e496 3f3542b1 -> c1954f3b", + "c199a866 409e16d1 bfd02bfe c0c13912 40a5d329 40e1d728 -> 420ce367", + "c18863a3 40a4c6cb 409f405e 40ce7e2c 412a06ae 40c1a7bd -> 4407c30a", + "415b264c 40d702ab c116027d 4119faa4 c10bf5b4 3fbcf3b9 -> 418cb51a", + "407b89fa bf13e211 40f0a0ef 418927b5 3f1e4ade 3f88bf3f -> 40fe34ca", + "41071786 40fe2a2a c0e7b932 c04814d0 4099bebe 4065e09f -> c058d0b4", + "c19c58c7 40b69679 c11d196c 4186f3fe c16c2e5e 4081e2a6 -> c20a4c88", + "c18e3d8c bf01a444 c0cac87f 40190072 411449c5 3e161d45 -> 41b61fd0", + "c17ef524 c10667a0 c0b801ba 414b1d12 417af3d8 40c1b0ca -> 408633c4", + "414e7009 40e029a3 3f1d4524 419d67e0 418059fb 401c90e6 -> 41b8376f", + "c120977f c01fb9b5 40b2ff78 40e7474c 40ffa6f0 40cc8ce1 -> 40d08e70", + "c0eb9a67 c102eb06 c08c96b8 41938335 c1966c32 40f1b7cd -> 41261a5f", + "c115646c 40fdfe89 c1096cea 41168e2f 41493aa3 3fa59a37 -> 414b85ba", + "40b85527 40c44934 c0508e63 c155cf3b c0e29fdb 40ded483 -> c151d011", + "411845b9 c08ea2da 3f28605b 4199c6d4 3ed40cfe 3d143f9d -> c200a4d6", + "c177d684 c10fbcf0 3f5a387c c11ce993 4196393d 409b124f -> c1e5b886", + "40a93e0a c05ed4d5 40fa1679 413020d6 416935c5 408e2537 -> 415c71c8", + "4107dccb 4099907c beb4231b 3ff67c3d 3ea72b2d be0d139c -> 40449d41", + "3fb875ee 3e5d7669 c0f7f371 40641a46 418b0f24 40b80f09 -> 3fb834ca", + "40a796dd 40949df0 403dceea be581918 c15e3485 4080a636 -> 4093d5eb", + "40224114 40b8cd21 c0a38383 40881911 410162d4 404920d8 -> 40ac9c7b", + "c09276d4 c09faeed c09fab49 403b0026 c09c5be6 40a93725 -> c5e2b804", + "c0ef6521 c097e010 c0ed4184 c13ee21e 409041cf 40acc872 -> 409d6f9c", + "c0633286 410fccbb c08e3c01 c1086836 c0857c80 bf406169 -> c08ec4b7", + "410df842 40cde6bb 40d50c47 3d02765f c0cc3d35 40ceb475 -> c28c04df", + "bde9b692 c0b09a2c c080d9d8 c184faa6 c194d040 bf18741b -> c1be5466", + "c0d58d2c c103a853 c097e311 41359922 40ef8941 3ef9bf6b -> 4119fc26", + "c06b6ff5 c027f9bd c11f3e97 c1314928 40324152 bf2c849f -> c1115fec", + "c0d32bd6 40b78ea7 c0f8aa23 4103d691 be972ed8 405612fa -> 3ee3e550", + "c157ee99 3fc312b1 407a4ffa 417f8e61 bff3c39c 3fd65766 -> 430073bc", + "418ab270 40c52a73 40acb59c c15a4957 c174180e bf58a29d -> 411f17a1", + "40acd49d 410b6d47 c0ffdf99 c136b60d 40a418e9 3f0f19f1 -> c102373f", + "40c9886a 411fd283 c1080d29 3d975d00 418cb97b 4055288d -> 40647e32", + "c0ed1121 c1060120 411918ca 40b7e368 c195e218 40830806 -> 408dac1e", + "3f277e5b 3f9706b3 3d650a24 c1417896 4003bdb9 be99416b -> c0af2fd2", + "c118a228 4006faae 402c6c76 c0bb43ca 3f1c71c3 40a8e8e9 -> c3068830", + "411bac46 c07a57d4 3f4e0d17 c19e1bce 4148046b bf4a0983 -> 42931b28", + "c184c51b c00ef5ee c1143b99 40491766 c18bcdc1 40f43990 -> c21be6c8", + "40a618e4 41037885 c0cf1048 4105a533 408c4950 3ff5e736 -> 40f11f18", + "c114b7c0 c0e3a600 c02f2b59 40c826c3 3f38b8fa 4080f4b9 -> 41102faf", + "c18ade63 410531d6 c0f39436 c136120f 4194e498 40a58546 -> 4213d0fc", + "41663435 40b0c016 411e4e80 c164d438 c11beb86 40c5170a -> c0a1ec4c", + "c122c020 c0acd60f c0d9641f bfe168e7 3f87d544 3f807fce -> 40fd1782", + "4197e277 c0c3b6e4 c04be4a5 c0bccee1 c059240d 406c0212 -> 41794526", + "4043d0ea c11a463f c0ab801f 4094c6a0 c08a086d 40cea7cc -> c1af75b8", + "4013c26e c0bd2df4 402c185f c120c347 413b14ff 40de9dd6 -> 412bb427", + "bf7f93c5 c1118e87 c111a428 c19c5e88 c18d35ee 3fcfe766 -> c536dbaf", + "40b7760b 406e7d4d c0896669 410d9d77 3ee3dc1b bdde89ea -> 412f4484", + "c0fb95e8 c0fc5880 bfaa64a8 3db030e4 41524de9 3f31522e -> 3e088dc8", + "c182d905 c0ea40cd 4034fa8a 40aa2e8e c15df635 406a2e26 -> 41b33d3e", + "412056a5 c05ba421 c0a2194d 3f61c1d5 3f2d1875 402d077c -> 4024da55", + "c173e016 c0e5031e c108ca9c 40c10e2a bfac77fe 40cdc163 -> c2133e93", + "416b148f c063f10e 3fc39303 c19d5185 c15480e2 406868dc -> 404eb460", + "c13e8115 404a3273 4115c918 411b01fe c03bbf41 406cfb60 -> 4221631e", + "405e9b07 c04400b1 c0e1642b c14a0bc7 4090afff 40589692 -> c22337ea", + "3e8b5f1a 402e575f 3fea5e28 c120302a 3ff6ff51 401545d1 -> 41b62d83", + "4190f374 c044b246 c11ef275 c17d144d 4145aa3c 407d4012 -> c2cdac09", + "bf45e0ca 41000bda 40df5b00 3f2160ba c08056ba 408658a1 -> c21cb960", + "c044a836 3f3d66b6 c005946a c15a9cf6 4185410f 40058a20 -> 41d9d151", + "4171ff6c 4105c5ff 3f324667 419ea302 c12fda40 3fe3641b -> 423c1dd8", + "c11261b7 3f87f005 c01db914 4130f6ee 4154205d 40c897d5 -> 418b6365", + "c06c2cf1 c0b44010 c101e93b 4080f2ec c184a678 40ae5922 -> 41a10c9c", + "c031f8fe 40928c65 bf875676 41004475 c19f501a 40c13fe3 -> c1e3a1a8", + "c10da61b 410bd6ae 40847054 c1870efe c06be6f7 3fcaa826 -> 42064c80", + "c19dfa38 c0647bb0 c03049e2 c0bcdcc7 bf1fe00d 403a3065 -> c2dd2be3", + "4111cf57 410dfa4d 3ff87144 c1916fd2 4188f5c0 400dc6be -> c19b3171", + "c011c258 c08ee2c9 40cf379d 4160cf0d c128ce28 40234756 -> 41121a22", + "c0a36c31 c113cc42 40cecc6a 40e98092 416d2bdf bc610461 -> 41146e9b", + "c155634f c09d6b2a c1123446 c0fe0571 3f6689ec 40b7d538 -> 411b2d10", + "c14a2886 c04f3222 40dbee69 408cedb6 419e245d 4091a2ac -> c11e0621", + "c13be96e 409adb08 40cab89c 3f62c292 c161f1a6 befe62b7 -> 43274504", + "bf9e31ef c0ceb5b5 40b5a375 3f16f904 c1734fb7 403f33d5 -> c0c6b6c2", + "c0dd8283 40af9e88 40bab3b6 bfb11558 c1122bb5 3eb8b583 -> 438a3383", + "c19d038e c0a40dce c06593f2 416f1844 c071d771 404534ec -> 433f473d", + "418e30c6 c059cc66 c00fd5c6 419dd084 419cd533 40b1cf1c -> 418bd355", + "3f919f7e be5a58e0 3fa6642c 4196311b 40c6ce13 409e8a20 -> 40f1e804", + "c193c8f4 c108550f c0befa3d c0d95244 c102314b 40f5c967 -> bfc5b5d4", + "c0e2c70a 411348f1 c0ecb8cc c192f337 4098cc31 3ff1b23e -> 408aef80", + "410a30be 40a8087f c0917a47 c0c9fb9e c12db55b 3fa4894d -> c097b8c2", + "bf4578d8 c075faf4 40d85fe1 c11bc6a3 404a288a 4088d4a2 -> c0c005aa", + "401268be c048f06d c0b65674 41582e58 41679b14 402250fe -> 4137758a", + "40a71817 410fae59 4119ad21 4190dd8a 3e2a1b60 409811c6 -> 42fc1ac6", + "c0947bb9 c0f47ee7 c117d530 4104f5d0 41423bb3 40c93037 -> 400623e0", + "4191bbc6 41182f6f bfed3efe 40b13aca c162fbc5 bd63efe8 -> 41a52c94", + "3f1ee5ef c0fa2307 c1085e11 415dbc04 40feb0d4 40849481 -> 42a8af7e", + "40e6b48a bf98c5fb 3fcf1592 4159e269 41571911 40e1fbd1 -> 41518e44", + "4114eca5 becfad76 bef059be bf9fbf5d 415651d2 40aaed1c -> c50b61b5", + "c143efb7 bfe490a8 c119ad51 419d9e45 c0aec534 3fe92d20 -> c15f62be", + "4148aa95 c108198c 4019f50b 40172dd8 c19fdc60 40a97ccd -> c222f48e", + "40d16c2b c0875bc7 410d6366 409d95e8 4188028f bf0a2cc2 -> 416e1f33", + "40d0476a 40c28de7 c008dda7 c04df937 419e3d0c 3e997c5f -> c08d64c8", + "c045016d 409f04e0 bfbae28c 418119ee c1709de7 403c3795 -> c1b714b4", + "3f742c1f 40727080 c0c71bee 41765bb2 41442009 40afdf92 -> 4168229a", + "410286c9 40946682 c06dd78c 4168d47c c173b912 40059c79 -> 41d8d3e4", + "41126155 411ad4be c0962a4f 3f5ec10f 417fb60d 409996b6 -> 3fb679c1", + "c12b2b19 c11f2db9 3fbab133 40d10311 41871d41 40d09fa2 -> 40bb3d1f", + "c168429f c102dc8b c0e66236 4146d390 be4c21f7 3ec40194 -> 42bc4268", + "c1811b3e 4071728e bff3ac1a 40d0cce9 411e92ac 40c9970e -> 4193362b", + "4142d0fc c07128b6 410cad1c c19df0bb 4105ab1f 4060d14b -> 417ec6da", + "3f4b315f 40d96783 c0013900 c191e652 410b4244 3e510c9b -> 3dd6e100", + "bd8f5c4d 404b5a7e c0e63fc7 bf39b73b 4155b333 40bd24bf -> 406bb883", + "4174d99e 40503f28 410d4a8d 419a93ab 40e95621 bf453789 -> c0d574ec", + "c1165efe 40a98c13 3fa29196 c19a491c c17052af 402d6b26 -> c06e5074", + "400bf031 c089d71e 40e1b2ae c09d2980 c0ec150d 40476748 -> c0ca4675", + "c11291d3 407effcf 40ae14d3 41526ca8 3eed57dd 4050c607 -> 42ff7374", + "419196be c0895299 3f33eb02 c105526b c18b8c98 40cfad96 -> c24572b5", + "c0f03bf4 c07128df c06d0b22 418c7956 40e55691 3da09d1f -> 441b70c8", + "c1994814 411ebd0d 4100869b c12990a8 41459645 40fa6b30 -> 43ab672c", + "41227675 c0a0a3dd 408ad323 c17bc87a 40f7534a 406d45fb -> 41b27d9b", + "411e0ac9 c04f1713 40373de4 412d1a70 c184e1a1 bc30724a -> c240a098", + "414841f5 bfa89d68 c0d23397 409e84b9 4078fc64 40362319 -> 40f825dd", + "4117adf3 bffc7a44 411db5a8 41747bc2 4113a0b1 40d29cb8 -> 4116b6a8", + "3f81fdbc c0861b27 c0845d4a c18a693d c08456f9 400ecd7a -> 449b43b3", + "4111f4f6 409d3e56 bff204db c17b28cb 41085940 40230f25 -> c1f56907", + "4175125d c005143f c00cc920 412d93b0 c18898e1 bf535254 -> 457cce99", + "c0fa0e5c 40cfa64b 3fa5c1c0 c161f2d9 c18c866e 40ee5350 -> c1bcd7ce", + "c10d7db8 40ee511d 40afdf59 c0adc750 c12af5ac 40a3e86f -> c2452e7f", + "41153f63 bf399fbd 411af0dd 411f04f1 c1457227 40f26b7d -> c1394297", + "3fa498e3 c0d582a8 c0c82881 c0f0d998 40961042 3f5c9791 -> 436176ef", + "c184d8a9 c0f8d69e c0c4e125 c0d87137 c18cb924 bf5c74ee -> 425070a2", + "4191e07d 4109833d 3fb884f7 c195bf0c c00c42ba be54779c -> c223f720", + "c14d8356 c07133c8 3fadf337 c0f22fbd 41911409 402e6ab8 -> c2543e6b", + "4147722c c08c9d75 4110335c 3ff8bc50 40a24e85 3f994709 -> 40bc17c1", + "4143fd46 40c00997 4116974c c16648fe c0a907e6 40a9779e -> 4012ff80", + "3faa8adb 40370069 c0922deb 40c780ed 3f7c84ec 407c6e25 -> 40a4fa0a", + "c1359361 c0563b6f 40f5411e c0b89f7f c16bd89e 40c09983 -> 3f3fb610", + "c03b5c13 3fc27ec1 c03efd93 c170ab75 40bda1cb 40532bcb -> 40b52e12", + "4188a77c 40e4061a 40fece26 c13f85f3 c0625ce9 40c95534 -> 42b0b47a", + "bde8da74 407f173e 40fe5c46 c1267e3c 4195afe9 40dae3f8 -> c2221a32", + "c0eaea20 c1035137 c0d87493 c15754c0 419e34b9 3fb9d0cc -> 40cfb76c", + "c19a610a 40af40da 410be00a 410616eb 40a5a0d0 40a4d361 -> 4202c5e7", + "c184363f c02ae4e3 c11968e4 4098af65 c0f8695f 40cdc758 -> c1a2ac93", + "c12d0e20 3fb259f4 3f84b37b c1105a4a 40c5a2cf bf7da651 -> 43ffa2dc", + "41753e9c c0fee555 40744663 40256a98 c17c3a09 3f97c27b -> c206c30a", + "c07fb5bc 40ef87b5 c116a068 41858d16 3fe13b74 4015c213 -> 40d18ac2", + "414cc064 4077d6d7 c0011b32 c19c8f7a 418eb212 bf0aef57 -> c298808a", + "40d7552d c10fc78d 407e8398 c17e32e1 c19346cc 3feee3ae -> c1978f88", + "40da9d8b 40bb8c0a c1178888 c0412e4c c100d76b 3fe8ff50 -> c02cc73f", + "40ec0867 4050d51f 4058fb24 3f521dfc 3fabf4ff 40efa1f2 -> 418da2ce", + "c08ed5d8 411a9b12 3fd93edb c087a436 413a704a bee6eae1 -> 41bf8b7e", + "c13c6aef 40bdfc8c 3fcacfd5 41217e6d 419b82b0 401250ea -> 4240802b", + "c039a797 c0c93ed7 40dcfeb3 c19e90b5 41096d94 40d0a045 -> c1486a02", + "40b5c8de c05f45d5 40b837ff c1945c65 c1911989 40bf74a9 -> c1912067", + "c13eff0e bfee7477 c0902c4d 4081d109 bfd39841 3f54869c -> c18db1c6", + "bddb0053 40f853c3 c10ba7c4 c0051a27 40d2c85b 407b6e53 -> 40038b1d", + "4114d007 408572da c10e8005 c1509dcd 40777b0a beb6a4ef -> c19d5ece", + "414dfc08 410e2d36 c0f27786 c125dddc c002d377 408274e7 -> c1461f81", + "41972a73 40ea7e73 3f4607b2 4134df8a c0f5483a 3ffd11b2 -> 423322ce", + "c0a2f951 be26d2b8 40011a00 403aea14 c19609c4 40a3d281 -> 424fbe65", + "412130ae 410f9b4e c0dce5f8 413a59a5 c181eb89 40a56c38 -> 41593b45", + "4193570b 4108016b 4014ff14 c129a3c3 c117b669 3ee06b36 -> c1467197", + "40f4de18 4119235d bfb4a9a2 3ed567d5 c04c1b71 40a6648a -> be5a65b6", + "c13a0880 bff4e084 c107b779 c192dd0a 40f534dd 40bc0e34 -> 41a0f428", + "c10e0bed c10ef7d8 40e18dba 4138c77a c15a16c5 3ed421ed -> 413753d7", + "c15054be c0bbaf9f 40b67e52 bdf278a5 c192ba03 3dcf7f7d -> 4132735e", + "4040436d c0876043 3fb44197 4141239f bfb8032e 402759dd -> c0a8589e", + "40a0f4e4 400ea9f3 c02372eb 41969415 3f2899f2 402ef052 -> 41ebaaba", + "41053e3f c0cf6617 c0bc634b c19372b4 413ba306 40365032 -> 443754c8", + "c0caa315 40179302 410f6d67 c18b6791 c15b10b9 40a95b7b -> c1b2cf2c", + "c12f5cf9 c05c5ab1 c0fbe939 41869128 c0f84b97 3cc49250 -> c1c72b72", + "4188b08b c106cff0 c0a6ec93 c12c982e 414d3de0 409afc7c -> 4330ee3c", + "4116f443 3f90a382 4109f218 c0025c2c 41801f58 3eca4f07 -> 418fcb9e", + "bfc03183 40aa9516 3e7882b0 416bec1d 410acd36 407a599b -> 40d30428", + "c18b5705 c11cfbcb bf4c8e05 3f803866 bfbc6447 40da1640 -> 4045b64a", + "c1535940 411b182f c0b08c39 3f8ee261 c1249b10 3ecd9290 -> c18070d3", + "414e953d 40c35b8d 401acac9 c032e519 c0afb2f1 4096a916 -> 400b9ee9", + "c164e12f 40abcce8 c09f77e6 417d9f36 3f9f034c 402a0aed -> c13e996c", + "414dbf66 c051e31e 4096ce9a 416b0331 c0fd86e8 bf644099 -> c1f7c314", + "c10b1e59 bfd9bdfb bf635ef2 c16bc29e 40866f75 40a99d07 -> c331a4c8", + "41523e7e 4082f109 c101e0c6 c027e406 c193623d 407d4e86 -> 41115fc0", + "4194a53e c0fa6ba2 3f78c734 c1955b90 c1827e0c 401749b2 -> c139769e", + "c0cccda5 be720546 40799911 c1802fc5 c0c21687 40f9277d -> c1f6e636", + "4170a897 c0a73cc6 c05dd862 c17791f6 c1191072 4084c2e9 -> 4252343e", + "414038be 40d88f3d 40f4e0d7 419e2e0b 4162a68d 40c91044 -> c15777de", + "3e4a496f 3f80fcd0 c11ce05d 40d6792e c190d189 bf72b35d -> 409affa7", + "c0117b06 40c1877f c094c8ab 3fd7c6cb c12fee32 4063088f -> c102db3e", + "41081f7d c0b0f4b4 c0403d6d 4039b7a5 c0af7c07 bf20f619 -> c22eca09", + "41932fb1 41197fb5 4106b5cc c13b1555 c1298fa8 3fa7d3af -> c19f3afc", + "c0df446f 40f3a266 c0e76972 40bb7ccb bfd73f4e 40dc2571 -> bfc6b2f8", + "4114edad 403e6830 40de9830 c16037f6 413915cf 4057930d -> 41d57357", + "41746521 c041ecea 3e04a5e5 3f9980bb bf8a981f 408583dd -> c14056e0", + "3f864eee bf82e6e0 411b427e 4155696e 418490c8 bd0f29cd -> 415f66f2", + "4170281a 4004cc4e c0efac6b 419f6e59 c130a34e 40bd6494 -> 42773c98", + "c02c37b7 41040760 40a14d7d 405476b2 3f8ea3df bf1ea598 -> c08642f1", + "41150f4a 40704c38 40ef16fe 417c9476 4062bd49 be8e50ca -> c0222588", + "c16a4c23 beb6fbbb 406c7e72 c19278a7 40ec596b 4003177c -> c2d9c6a7", + "3fd5746e 40c547ca 3f465848 40275054 c01c962a 3fd47ccc -> bfcddf48", + "40f60966 4086bedc c0a77b31 413b0b65 411d95fb 40e6ab9b -> 4145e46d", + "3fadbdd7 c0b3f251 c098d6f1 c12f5089 c1433e5b 400084fb -> c1a9c5ba", + "3e83e16b c0e5924e 4044543b c18b719b c19f0dec 3f390fdc -> c199ac7b", + "c124160e c0758696 40fdda7f c14e9bd3 c0a1609d 40a89a3e -> c189a4a9", + "c0e5b024 c112937b 411b7bbf 40fadfc4 418f5194 40841784 -> 410e5f1c", + "40da43e5 40ecbb03 c1196ebe bff1e059 bf208340 40a2e7db -> bfec62e6", + "c19049c5 401eda57 4009dbf5 c19851b7 417cc962 40c4d816 -> 45070264", + "417d5d15 41091684 3f0e2f4c 417cc2c4 40e21187 40505a7a -> 41bdbea8", + "be517169 c0e6d38b c11fe431 c0fe031f c0faf7d0 be6a9d3b -> c102d7fa", + "4161c768 40c304a9 c00e879c 4175186b 411177d0 40e42f72 -> 41aa89e6", + "40fee703 c09c3af8 c117dbc9 408076ad 41926f20 40698467 -> c20f473c", + "c187629f c0e264e6 411cba63 4078a964 c181b0ec 40247861 -> 4179dfd3", + "c011e6e6 bff1b8ea 4095abb3 4184b4cb 413d1833 40b796ff -> 4186faee", + "410e8c62 40604022 3f2840be 3fc7a3f2 bf49299f 3fd0a7d3 -> 40c06d7e", + "c17ec98a c0fc84e8 41148482 4030a6a7 c06fb5db 40d0ba84 -> 40b9b3d7", + "c14a07ad 40a86d03 c0778cb9 c012798a c19062c8 40e23b9d -> c204a91b", + "c0a74cf3 c02fc5cc 40fa6d8f 413459b8 3f8fe9a3 405a5182 -> 415a7660", + "c103b758 406125e3 c09c6dc9 412abaef 41860cd9 40b8e4fb -> 41996a84", + "c19c3a2c bf9d045c 40018d01 c195e0f5 c1939dc0 bee734c4 -> c1a29db6", + "c11f89f2 c1025e2d 3f8b421c 4087469a 4173c8a4 3f6f8fc5 -> 4003774e", + "c0a755cb c0d44669 c0bcb820 402bd24b c0e15f94 40995bef -> c17dfac3", + "3eaad2e8 c1126c59 c0839c38 40bb22e3 410a6cd1 40de1bd3 -> 41320297", + "c1929786 40bccb4c c03aabce c0cb0d2b c074233f 409ffe7f -> 3f1b9c18", + "413b99f5 c1091e5c c08bd7d4 c1408efb 3f9cc5ef bef8f12c -> 425029a1", + "c191959f 404bb6c4 c0c21024 c1106d75 4137c49b bd1aee6c -> 4219990c", + "c0cd2840 40ddbb09 bf873f6c 4191fdb8 41151711 404f9bff -> 40551d6c", + "c163280f 3e7f68ad c08465c8 4189009a 4136acb9 40fbea1b -> bfd61890", + "c1657cca bdd51e34 c0d3cdeb 40b40967 c0717525 3d8fa353 -> c16ea91e", + "c19f7c3a c115536a 40bc00eb 415bc4d5 c0b4be72 3f5382f2 -> 41d9ff56", + "c19c76e3 40bcf19d 40a6cf70 40e375f5 c13fc96c be93bf6b -> c42df525", + "c0a44e2d 40c54fb6 c1043bfd c1055b4a 3f54311d 3ed49e04 -> bf945320", + "3fabca61 405477eb 411ac7d6 402256d5 c1377bb9 3ce52c9a -> 40dca780", + "3fab6cbc c10ffbc0 c03cf704 41927bd4 c1716628 3ffb4144 -> c21b2cec", + "c16bce92 be6ad973 c0ab4972 4191c1c7 c121b0c8 40031587 -> c277f8fe", + "416181e2 40f32f7c c0b7163e 4138b780 40f06fcb 3f6913fe -> 415829bd", + "412e4b8a 4021d648 4105355c 417e30ca 418ed26e 40f01af1 -> 4195c9e9", + "c17d0919 c0def913 be29ec02 4132c73f c0c89f0b 40166d39 -> 42077134", + "c1569d03 40a4cec5 c0ed3d9f 41464e13 4103b6af 3ffdff48 -> 40c7d472", + "c1985a9a bf289e45 4092bd9c 412a7e98 c0c4b08e 407a10a6 -> 428b1fd8", + "c129f513 40c5dc95 c0f9c998 bf655f50 3f31f691 bf2e77e4 -> 3f81fca6", + "414b3739 c0d35672 c0f81bd6 c189abe0 c1043767 3e4db6fc -> c3277ece", + "414c59f1 c03a0bf4 c0d9d444 c08175be 4057a902 40992e0b -> c2076c1c", + "40503f29 c080eb54 c107b4d2 c17f191c 4144adcc 40f52d5a -> c2787d96", + "417dac0e c099b7ad 40d9f758 41108cd4 4139d376 40df08b4 -> 4159f638", + "4181eceb c064cac0 410df5cb c1527146 c09d5d0b 3f8c51c9 -> bd2fc100", + "c176df84 c0fdb426 40391e23 c18f535c c1394a14 40bec6de -> c1b275a8", + "40a186d3 410b33a0 c09754c5 41696f38 c12d528d 40833fa0 -> 40f59d39", + "4172a2d7 bd560adf c1098cba bd0972e9 c11238b4 408a3086 -> 418174b1", + "409ae942 bed169fb 40d148d1 c08a1f9b c145f004 40370e05 -> c1266cf4", + "c1170b17 3ffc5ea1 4119f78f bff04dac 4169556c 405a3c7f -> c1d36d58", + "4149f598 c065bef9 c06a5625 c07a356d 4187fb14 40e3308a -> c593cbf4", + "408949a2 40a61479 40d15d8b bf7a2adb 41267a5f 4049331e -> c108c5ca", + "418fe1e5 c11bfad9 3f59bfd9 414a8a2e bf5fa530 408505e1 -> c1b5ff9f", + "c1298d33 40158bcf 3ed17de7 415bda22 c17b107d 3fc3e91e -> c337c085", + "c159b015 bfd5981e 40b6f8a6 40ce60e9 4097cd64 40c6140e -> 4113498b", + "40b95dc9 c10760ff 40263009 3fcb6e4c 41901400 40dc4f72 -> 41b60bb6", + "418db22d 409d02fd 40ee20ae 40b474b6 c0f2d913 40ba7d0a -> c274be21", + "c13145f9 408a98d0 c0220a40 c19d9dfc 40237ef6 3ea49fbc -> 41f232c6", + "c0fa1679 c0901b80 c08bb092 c106de51 c03ea62b 3ee740f7 -> c30b2f10", + "415c3307 411159a8 4114801b c0f7f8b4 4172ce33 beeddc0f -> 44063c25", + "4123255b 40a455c3 c105f6ae 40993b4a c18e08e2 40dcbb6e -> 4153c132", + "c170dc58 3ddf2258 41083e16 400e13c2 c1828666 3fb3a8db -> 420e9d50", + "4036a320 3fd462fd c1146921 c183ea0f bf24da45 400f8906 -> c191c2be", + "40a80b77 c06d02dc c0910c3d c11cccab 3f942d46 3f561795 -> c3001933", + "414c6d13 40ab9777 40bec67d 40f4db36 41277cff 40f3df81 -> 4229ee54", + "c0fd9181 c0e42837 40b838f4 c160aba4 3fe8a5bd 4069613d -> c1704e92", + "c0006599 40bbf0b9 40cfdad9 c0efdbd7 c19986be 3ef698b6 -> 430c93e9", + "c17c37a0 c0cc6983 c06d2ef3 41820084 419bee2c 4094a4f1 -> 409d6eea", + "406a1762 c06092ce 3f61e5de c16f07f5 bf9d66ad be3c8ace -> 40ede83a", + "c195f09c c0ffe8c7 c11e785c 3fddd725 bf9e5e53 408a9296 -> c170087d", + "c186b3fd 411e5498 40f4a405 413367cf c0c55f15 409ade35 -> c3433d44", + "419179bd c061d093 405a5ed2 c16bb5aa c108d927 40b96333 -> 4093266c", + "417f352e 40c6f2ef bf90696c c100a669 4184e382 407ab3f7 -> c222d37c", + "c0ea7164 40153589 40383923 4136e8d3 c159177b 3fc0c098 -> 43e26048", + "419cfe26 c0c3cb1f c0aa2a8e 412a3501 c16e2d5e 404894c5 -> c44a73cf", + "c0881f3e 40f0f921 c0a192d2 40b7dd8b 414cd062 40339fa0 -> 4145ad4c", + "bf81d323 40511dee bf407ca3 4182fa53 c1012344 401d1e0c -> c11aaa60", + "c1946870 40dacff1 4077b6a8 c149c131 408f1898 40ba0228 -> 43058a2f", + "4114a74d 4020fbe5 c0cfc4f2 418f521e c1709b4e 406aa9d4 -> 422acd71", + "c1076533 407a4e90 40830308 41404b08 c0bfc6f7 40bcf626 -> 4499aa85", + "413e258d c0f5d8e3 41146962 410ebb63 40d4b361 40da126d -> 40c9823c", + "414c51e7 c087257c c08daf07 c13cf6d6 c16d7356 3f01cd34 -> 437043e6", + "412482ef c1187011 3f7e5518 c18c1a9c c0b3a811 4010fb8d -> 409c8098", + "40b0dde4 be64d458 3fc30921 bff39d7e 40d48974 bea3f4db -> 41d1c51a", + "c0a7dfca 4118021e bfbb76fa c164526e bf52756c 3fb7793f -> 40743410", + "c0e1e30e bf9b57be 40eb4b44 c190a3e7 407e368c 40aac08b -> c204823f", + "c192a95f 4115a0e6 3f7587e9 c18a6e49 c178b7ef 406e1917 -> c1380703", + "c13a39fa bc57495e c11a305f c13b3b65 c182402b bf6bd320 -> c189df7f", + "414d25cd c0cf0dfb c11bf9eb 41935e42 c13da8d0 3f496a33 -> 43449868", + "c193b2a9 40c442c5 c0f3068c bff55279 bf161905 40859d63 -> 3eeeffe4", + "c152bfba 3ff3d1aa bfde3aa7 bfabcfc8 40a1c79b bed4ea03 -> 41c93368", + "c0dd3872 402e4b48 411c21af c18665da 3dc893d2 3ee1f219 -> c21fc922", + "3fa370be 3e010e90 c0a8d718 3f23fcf6 c18389a6 3fd0d979 -> 4088f36c", + "c08786d0 c0fa8179 40aecb2c c14ebe10 418a5dc4 3fd2d276 -> c0981238", + "c19b1905 40ea636d c087ad52 c113fc89 c11752a7 40941cb4 -> c11bb161", + "413f4e49 c05f5b65 4089832e c19cef8f 418ea6b4 40273909 -> 425aa8d2", + "c1104392 c07fa032 40891ea2 c13efab2 c17cda09 40d91c8b -> c1197223", + "41726cce 40fb90f3 c10e5943 c1387a5b bf618b8e 3f9f3826 -> c1814c63", + "c1211fcd 410d59f2 c0a1dd88 c09ef3b3 c0c723aa 409ac123 -> c0d5a32b", + "408fc3f2 41025265 bf8d2921 c11e56d1 c0cb26d3 4047b764 -> c107ebad", + "c15f724c c1036c44 c08e98d4 3fd38437 410264c8 40683257 -> c104aaea", + "4199ef9d c0431763 40d1c238 4152d3b2 bd66fe9e 40cc5f1b -> c18c4f92", + "c17912c2 4091b4e1 c053c53b 409a26bc c03dabc5 4089e328 -> c1718486", + "41750fe2 40fd32e0 c1182c27 41840898 4177e6f0 405747be -> 418777dc", + "412f8144 c02c7fd6 40dc40b0 40ef777c c132bfe2 40a47518 -> c1990af3", + "c08742a6 c0e774fa 4116cbaa c0fb2906 c16de644 4098b815 -> c111d990", + "3fb76a57 bff6d7b1 c0d21f58 3fec1905 c121a691 404cba23 -> 41280fb9", + "c12a80c1 c053f640 410d52f9 c0914da9 c00515f1 3fcf780f -> c0c0ef1f", + "4107028b 401a7ce7 40020fe2 c08379d9 c04c6afa bec8b619 -> c1945c64", + "412d28d0 c091a4f6 402cc168 40f2f695 c12717c9 40eeba41 -> c1f53217", + "4182d199 c0eacc34 4001feec 40f79d8c 4152ee0f 40f92d20 -> 41ac0dca", + "c048d64a 4109b359 40ee429e c17ce7b8 c18f3099 40e8bd10 -> c213e806", + "419d5b9e 40b23784 c05f3c4b bfcbf981 c14f16eb 40f8ff3e -> 41809a77", + "419c5537 c0e777d8 bfb5faca bf93ff7a bf4c316d 40840d0a -> 3efde674", + "c1526f99 c1053ba5 4093c715 4009a57a 418817c0 40f530e3 -> c058ddde", + "bdaaa6ff 4114d2d5 c057c481 c18ae687 40d7da13 40b05921 -> 3efb1940", + "c0feeacd 40bfca24 403a6659 c162b732 c1814ba2 3fdd2181 -> c1b9921a", + "410c6e42 c02e6c83 4114acd6 c13ea33d 410666f4 3f404abb -> 40f0ee4a", + "419f43ce c098f1ff c035ca2c c160cecf 417e00a3 409577dc -> 43b779ed", + "405cbf9d 411067f5 40228916 c10dc854 be54d775 bf115e4a -> bfb5f1fc", + "4080aae5 4016a141 40a64c51 407e528b c125ced7 4049e813 -> c08dddba", + "c17bc68b c11d5829 c0c7a8af 40b59cf7 41872ac9 40bf043d -> c14bf3b2", + "3fa0ec4a be1bc89d be9917d3 c0af555d 40b8b773 40d348aa -> c2e2e25d", + "c07cd89e 411ab556 c0fc6084 415bb20c c16410e0 40a1f01c -> c0ff5b20", + "415a31ea c10fae1e c0b28d17 419a41b3 c0d0c208 40ca8de8 -> c3185dce", + "41306742 40cd6da5 4110b239 c179278f be9ec1b8 be949346 -> 413377a1", + "c06edc33 40e1c594 404d0030 40aa9eed c129fbbc 3e64f58e -> c21d6652", + "41700cc7 40af84b3 3f82af9a c129189a 4136ad97 3e848dc2 -> c265ca12", + "418f948e 3f9e3336 40a638d3 c064a4bf c183f7ec 40ef8ac2 -> c26886df", + "c1947513 411f73d7 40b3944c 416abef5 c128d89c 4060c29d -> c3169381", + "41902633 c037639b 40572ca5 c1574b8b c18ea6ab 40c935a5 -> c1e10824", + "c196ef09 c0df4919 c0a14330 c183b859 419ad475 40a69cc2 -> c36c2d57", + "402e1ed9 c0796cdf 40daa70b 3fc14cc6 c14d5e24 4019ac5f -> c0eacdc6", + "c0c20cc8 c11a35ed bf6f2051 bf6f272d c1824f86 4013912f -> c0e7a757", + "c0b49368 408c2d56 3fb17a9f 411394f2 c151b92c 3f5fccbd -> c283146c", + "412ca7e6 c022ba08 411ef0c6 c195c681 4164b65d 40082465 -> 418480f3", + "c1913cc9 c0fbb3b7 c0fed697 40314f26 419c497a 40feda6e -> 44dc5ad0", + "4038e152 c0959b31 4076ed73 41521058 40888682 3e8a2e97 -> 40a8bee5", + "4167ccf9 c102eb0d 41179728 40f0bd1d c1995c11 3f112dba -> c1d5fd4b", + "c108588a 3ee6b94d bf53cd4e c15c3fa1 40649f4e 401913ea -> 42d7e9ac", + "419d0a13 40924b51 bf9b5f35 c09637bf bfe1f8da 3ef1aa35 -> c145144b", + "40fcfa7e 3e654020 40d4f9e6 c166bc7a c16e2352 3f308c7d -> c16f939c", + "411d5102 c00e1b1f c001a72b 40b5bac8 418fad7f bf642a5a -> 443f9848", + "c0af385c c11fd1de 40b9c442 c1892e1f 3f08951b 409cedb9 -> c14185d6", + "41861258 3f34d602 c068f224 c16e8189 c103e091 3e4f259a -> c21e15b5", + "415bf937 c0f303bd 411cb4fe c1751712 c1219f85 40fe2e82 -> c10ea47e", + "41086145 4035d735 40529c7a 416efae1 41971f48 3f2578dc -> 4281d5e1", + "41152a29 40fe3599 c03ff697 417f7427 419f3ca3 400993f3 -> 41778391", + "3fe06e6a 3fce9d86 c001e631 41841654 bfcaa440 40c67c3b -> 41899dcf", + "c1967156 406d1252 3f97e938 bfcb06f3 c13d1f2c 3fce4559 -> c2ba2f7c", + "c19ea6bf 40a71b9e bfd59ce6 40ffc122 c0140395 40e2317a -> c1ebca48", + "c104b2f5 c1139767 406a432e 405d3c96 408308e3 bdf87eb0 -> 40602fb4", + "41998a10 410e7d70 bfa82ca3 40ea25f4 40ad887b 407ec676 -> 411394cf", + "416cf952 c07d4395 40c8a492 419444b0 41139d58 3f92ff3e -> 3fba01d0", + "411cf57b 40080cd6 bf9c69b9 3ef881e5 3fccb24d 3c454d2c -> c0048eb0", + "3fef81ed c0965392 c110c0e4 3d3b6465 41248ab4 bf1a7540 -> c176ab35", + "c0c7e2ee 3ff6833d bf8c373a 40875305 416219e5 3ec539c6 -> 41f81c7b", + "bf9defd8 411a0060 c105d6f0 40734b53 c10f817f 40d60c35 -> c07a0be1", + "4106947c bed5fbdc c1170c48 41833fbe 40f9f0fb bf298b96 -> 41c689f5", + "40cf2239 3fd23f57 bfa45477 c19d7b94 c0807fcf 403acdd7 -> c236336e", + "c0cc751c c0cf3c99 4106af64 415f37ae 41805dfd 40064599 -> 415f69b7", + "c0f9ea39 40e21875 bfc333a5 c0d00198 4030a5f5 3fc1a185 -> 41188f5e", + "40b03d44 41117d3c 408c82ef 40e67400 c150b0df 4016d899 -> c103c71f", + "41365753 c09c0360 3f8af859 c12b2c95 bf3a51d0 3fc8bb6b -> 41842458", + "c063a5c5 bf8cf480 c0412eb1 c1762298 4154c3b8 3f0f1c95 -> 41aad46c", + "4102ce82 c02408b2 3f69eb86 c0a85b08 bec15f78 40563d19 -> 411d26a9", + "c19efd7f c0d8c478 4116a0b8 4133561f c1156ece 40a484e5 -> 41deb0ee", + "c022d4e8 410ef07c 4103632e c124c330 4135d6b5 40139e57 -> 43a70a98", + "c0b64ebb c11bc5ef c055785d 3ee78102 c169cf64 4063ad8d -> c110de3a", + "c19854d8 c0f3ad05 401534eb 4159b521 407e88e3 40d5fa1d -> 41c55b3c", + "40ecbe8b bf28a0e4 c096df4d bea153ce c19d924b 40a25261 -> 4218bc85", + "c01d7cc5 bfe3da05 c00b3a0d c14a077c c17bd8ff 409483d7 -> c18fe6d6", + "c186c0e8 404f9c01 c09ef947 c18a1492 409d5eaf 40f93719 -> 4213f819", + "40371c1e c10322ac bfea0f3a c163014b c0f96584 401c698f -> c04563e8", + "40cd53b5 c119ae27 40a5faaf c183f5b2 40a4068d 4087ef81 -> 40dd89f4", + "bf94a562 40a0faaf 404a018c c0be7b6e 41228b66 3dc65af9 -> 423d1932", + "beced54e c0e24a55 3f6a1cc4 c149449f 411aa931 3f4afb4d -> 40bfcbee", + "41245039 c11f31b4 c0aa9282 c10d5e03 c1975566 40d3a945 -> c253d9d6", + "c041f69d 4053f36f c05535a1 4150f827 c0b65a91 404eb0f3 -> c09b2e06", + "c065496f 41051383 3efddd68 c198d765 c185977b bf1027fb -> c1771bb4", + "40c2b614 c0d678e6 c0b5ea6b c1823a6f 40e89859 40ede13d -> 438bd5e0", + "419ff945 c0d2a717 4084d83c c12a77bc 41841543 3e5fe5cb -> 42626fc5", + "40a9c617 c0c50575 3e1c0b1e c01cc082 c08318c2 4060b36d -> c0ae27dc", + "41637a03 411695ef 3fe4866d c10d9463 c01dc177 402f5848 -> c14df190", + "c15fd9e8 c114074c 3ffb78b3 bf2c009b c0bbb858 3ff6f200 -> 3fc2e8dc", + "bf0d566d 40a07c84 c0aff2c7 c17d1e78 41531d5e bf481696 -> bee95440", + "bf81c5a9 402fe6be c107ab14 419bea43 4100e7c2 3f0164fe -> 417a88a8", + "c0df3d3f 3cd588dd 41128774 be888e31 419e84aa 40bcd46d -> c17aa37c", + "41404b6a 403fbdea bfe7b081 c12715b1 4196ad4b 40ef20e0 -> c282cfb6", + "3f673474 40d5793d c0fb674b c11c87d5 c120e6e0 40e77b06 -> c11e4422", + "be7c1abd 3f23e7ab 4091f5e0 c1650ed6 c109f107 402439c7 -> c179a843", + "c10a68cc 40fb14ea c0cf8233 40204297 c1746048 40f6049c -> c18faed2", + "412baae8 c0cda716 c11b68ca c1258fb9 414d6a25 40c1215d -> c303621e", + "414f5cdd c01dec13 400f6ec0 c18ae5ca c11fe4e6 40e9061f -> 40d900c8", + "c0b5905f bde2861c c041dd94 bfb257e2 c0aa0f47 40c32c7b -> c10de17c", + "bfc28c9e 40d2800c c01f0e71 c130a9c9 40677752 4084b1e2 -> 40038c18", + "c169a1df 40cb8d72 c03474ac c10eb5ae c1838414 40bd0f80 -> c1d0b9f9", + "c1105ec1 4079cbed 409d03ab c1235cb9 416d6ce0 bf6b5379 -> c3a66a72", + "c050c4e1 be8e8aac 400f51b0 bfce8d66 c0a8edf7 40ea0c96 -> 402eb5f5", + "c11999d8 4046e387 c0c3dc2b c00bd1d1 414858c8 40db381b -> 41908859", + "4189ceb9 41188aad 411856e2 c07336f8 418132bc 40c1ebbb -> c63daf40", + "40659e0e 41194717 c0a7d1eb 4097e9d8 c0ffdf39 3ff96e4c -> beceac00", + "40fe1d5c c046c8ae 3e8ad96b c13179c3 c15fae00 3c802a1c -> c1a44e7d", + "4124af8a c0d6056f bf4b390f 41099026 c082c33f 40a1a76a -> c1df8d03", + "4147c88a 4116cbc6 c10cc0c8 40755d27 c13e66f8 4067beb8 -> 40cf47ac", + "40b5f4b1 be8e727e 3ff2531f c17121a6 40f8b856 40ca4754 -> 423eb32a", + "c058e20c 40b4fc9d c0f08f65 4039f81a 40de3ae3 3dd042e4 -> 40b5b904", + "413ddffe c0cebc5a 4051e2b7 c13db100 419dfa78 40d4bbb3 -> 423e725f", + "c18a3bf2 bfd39d42 bd315005 4003cd89 bfb9e33d 40a6a7d8 -> 421092da", + "c1601057 405f172e 401ea7e7 c0dc8938 3f4722c2 bf668055 -> 42fcafce", + "419cf3f0 bef373ce 4067a46e c195d7ba 40d6a306 3e8b34af -> 42d43252", + "416fab11 c0f71667 bf8f4bf9 418217a8 41123627 3feb63ea -> c103b5aa", + "40e072fd 40bbe84b c0d9029c c1975b9d 418fd2ac 3f6c4418 -> c1b1ff17", + "c1417701 4109b56e 3fb1e2b4 413e2910 406e0f9a 40fab410 -> c13886ca", + "c14c31f3 410b5d3c 3ec168c1 c198d92b c13e8e78 4037c300 -> bf0fc840", + "bffc1896 c0cf39e1 409d47d6 41933789 4177e486 40fb2d76 -> 418a02c9", + "41634841 410adc46 c0457fbc c00595a3 c14ccf84 40813aaf -> 403c7f45", + "41727009 40b4ceac 3f2947a1 416c4192 c189c2a2 40adfc00 -> 42975fed", + "419830b4 c0e86fc8 411c374b 40b0836a c1980d37 40c847ee -> c2015f59", + "c020ae7e 407d3a17 c1183555 41948bd1 40cc2e23 408e7609 -> 414b76d6", + "c131f162 40bb1426 c0db0147 41793eab c110c975 40e857ea -> c18acd7a", + "40c341e8 c08d0d3f 3ed984ba 419ac38b 41045042 40822a0b -> c097b7cc", + "414287a9 c08c7ca2 c0fbe70b c18a05b6 c0fbc8cb 40eb07d7 -> c2776cfe", + "c08f626c 40a96eee c0f16730 418b2abf c121149f 40bbe149 -> c060f988", + "4192f17d 40a97061 40a98944 c19ec494 c140cc54 3b9972f7 -> 4702f8a9", + "3fa63596 4061ec08 c061b288 41910431 41088c61 40f44691 -> 41717eec", + "41058238 bec02e34 c10894c2 4080f10d 419f131e 405ae328 -> c14e92f0", + "41895a16 c03a28e5 c1131f9e bf40194d c070c631 3f1e0e91 -> 410de505", + "415bb915 c09d64aa c0bdf005 bff3c3fe 4130ecc1 40c0d1dd -> c36f9f31", + "409d2f04 bfa15dde c0d675cf c12d0640 c1353524 40f11946 -> c123bdbe", + "c19b70d5 c1189104 411392fe c15c3d8c 40aa109e 3fb3ecb7 -> c1bea19b", + "c093435b 404dd69b bff5e3f2 410d619f c195a5e8 be43fc6c -> c2045155", + "c15244eb c0009848 bfee2620 bfe3bd09 c1971899 40918eac -> 449fd0d8", + "c1936171 41127886 407766f0 c15037e4 3ff78bef bef2486b -> 4281daa4", + "bcce7ecf 4003238f 405efe31 bffbf6d2 c18d6fe6 40c76059 -> 41a5e7a9", + "418cf2ff c03d0299 c044c8ee 4172ffe8 c14909cf 40fbd80e -> 4593570f", + "41648098 c0f930f1 3f0d07e7 beb56d4d 40bb1270 40ca0f72 -> 41807315", + "c10a799a 40af911d 3f4afae7 c124a36f c19fce92 40b64373 -> c21de3d8", + "4109593f bfeb8d7e 40ed1041 419ba36f 419f70ca 3ee7a1b4 -> 419fec90", + "c1933080 bedf6cc8 c02db4b6 bf6c88bd 417b3607 3f67a15e -> 43022d1b", + "c18ea612 bff808d3 3fcf0bc0 3f7d5cb1 419edac8 40b7e7ab -> c2a6b43a", + "3f92f19d 40e414b0 405c7594 c0ccd239 bf24fc81 3fe8aac5 -> 403c7d8a", + "c147b27a 40b93e4d c0d6c28d 401de142 c133c18b 3f163351 -> c18c7932", + "418295f7 c0ec36e1 3f4366be c1393eb1 c0127261 406c2592 -> 4177552f", + "412879cf 3e10a5ca 40b76eee 419d9f1d 419d6de2 4061dd50 -> 419d43a4", + "3efbf68d 40a6aa47 40e905db c0329676 bfe256fc 3f89a539 -> c0a3af0e", + "c1938291 3ee766c9 bf00c96f c0dcce5b c13bb2c9 409d2d17 -> c2ccea55", + "412d9a0c bfea1ba2 40233afb 40d0a914 c0f9b9db 400c5907 -> c20bcdc2", + "c102739b c0250f6a 410bb9cc 4075cec2 c0dc3209 40e7a1b8 -> 4111fc73", + "402342a3 3f8ea912 c012bd79 c191f8ae c1478b47 406332d5 -> c1a57282", + "c0fd38f8 c0a5494d 411aa7ab 40473626 bf5de2b6 3f0c4527 -> 4076669a", + "c1038fa3 c0077b62 bec4b6e1 c1979552 40117790 402fabde -> c2bb7388", + "41922962 40b9899f 40e227c6 4192d5c2 41514074 3faeff6b -> c205f486", + "40e89037 c0081988 c026b316 c199c7a5 4192b1d6 409ba124 -> c43d4c1e", + "c18f9f4b 4111eac3 c0d1a1e7 41336134 c15c68f6 4039915b -> c1ffa4f0", + "c146845b 411fa2ad 4075ee5e 40bcf31c 418494db 406d354a -> 42335378", + "c1680e56 c0c68c1f 40cfd136 407085fe 4187322f 4017c181 -> c09a8e25", + "4133b055 408b1a50 3fa774ee c093c64d 41854894 3d6ffaf5 -> c25347a1", + "401474e8 411fb4dd 40bd7047 c1342a0d c19bfaea bdd4cb25 -> c1d66481", + "c0fdf3b6 411bce73 40c4f663 c0dd90ab 41935b30 4013305b -> 42ec301f", + "4093c920 bceb4753 3e6a2ce3 c17fbdc7 c18a8257 bf19b935 -> c21ff6eb", + "c06ab73e 3f36d97e c036952d c158328d c04ceb3a 4095f6ea -> bf58ed70", + "c15bb55e 40d6a01b c002b274 c144196c 3fc7de99 3fbe4f66 -> 41a02f38", + "c128a2fc bf9bdf6e 40ec3724 c14f35ae 412957be bf77d40b -> c219d9a8", + "c18745b1 c0263f13 bff0c823 417073b1 c18f428e 3fab96dc -> 44283964", + "406b46a9 3ee8f7e7 c082de7a 40879b8c 40e2976c bf55e5d5 -> 400e3d7d", + "c03ff58a 401615f4 3f387833 404107d9 c071c652 40a46ef8 -> c19aadda", + "c14ae066 c110cea0 40852b26 4183a194 c18ee570 40cff09d -> 41cf0b4b", + "c109cd90 408a4af5 c1174fa4 418af297 40d98389 bf68389f -> 40ee3db6", + "c150424d c0ce9493 c1101a42 419b6671 41818f53 40eb373b -> 4131e0ee", + "c17e8dfa 3ff768ec 3f786a43 4145f28c c17511ba 4057b0a0 -> c3fa7356", + "c17c56b9 40cd3d87 c10450e4 419c2aca c190a36f 4049d7f8 -> c21527f3", + "3f2ab5d7 3f911a0d 4062956d 40dd9277 c0549249 40ef4a55 -> 410e9421", + "416d8a73 40da2c1a c0b6e6be 3f82f8ac 4195b7dd 40e4574c -> c124f270", + "417f7618 411d8fc4 40741b9f c18492ae 4100e2fc 3f4b9dbc -> c226300a", + "c16cc89b c0538ff7 40f0cf94 40a2f91b be81f173 40e1d4ff -> 412c43d6", + "4083111d c0d5a2e8 3fb05f8e c19e6865 c111ab18 3fa6985b -> c0afd370", + "c1911157 40c2301a c07b1f74 4031276b 3fe861b5 3f265fec -> 3eebf868", + "3f933962 40c9e054 401d1ad3 412694ec 40264c79 409a7c6e -> bd3dd000", + "bf923451 bea6b298 401ebcd7 c1751ec6 c0e3e5ca 3fd086bc -> c18da612", + "411332d7 3e8c1cb7 4119a53f c10e575b 411cefa5 40300504 -> 4110029d", + "c093152d 402ea254 c0009ce0 4157fa4b 413b3846 3f065f48 -> 412b851a", + "c0fb2e14 4093f3bc bfd759b7 c19d7c02 40d10c53 3f9726b4 -> 4200b162", + "bfd9809e c043bc8a bfd8fa56 4184923a 413a1beb 3dff923c -> 413a58bd", + "c0ff1e35 c0dff703 40a74944 c0a2b0f9 c029154c 408d9cdc -> c0a8e9f6", + "c197ae49 3f9679cd c10e3eb9 404dbcea c114c3bf 3fddcd80 -> c1ae853e", + "c0e610b1 4007bf98 c085c31a 4017c154 419caa37 40801ee3 -> 41de6de8", + "c11d5a23 410577b5 c1117b65 40991ed3 41663260 bf435ffc -> 416cbc04", + "c179bb95 4057adb9 40ac8551 c191dc27 bf469de6 40abbcd9 -> c33622c6", + "c049116b bfb19d0a 40468773 c03e7604 c1562ffb 40a671e9 -> 3f8bb65c", + "c1167364 40372dca 40ccc364 c108220b c12c50b0 3fe01c27 -> bf2a6da8", + "4188724f 40831d00 41086e48 c1274e91 c01f1452 40583705 -> 414dcac7", + "c13ae16d c0a67a7c c0ab9ef6 c15e89ae c02d9153 40d38a86 -> 43dab39d", + "c19bcb81 4082d989 40ab842a c0cee501 c0ab0650 407c5f77 -> c1d9ff1a", + "c0b2ed30 40b13fcf bfb60524 c1388dfb c157d4f0 40e16658 -> c16a90ce", + "c1064a64 c06cdaa8 c115e82b c11aae21 be696930 3fddd1f1 -> bfed39ac", + "3fd63d58 3e3de8e0 3eb851f5 c17cf441 c12f6a98 40fda021 -> 41cc194e", + "4160d998 40363b6e 4085284a c020a753 bfc14a22 40194254 -> 40c0a62c", + "3e9ba9c9 c1063425 3e6ffd17 418dac4d 4098cf7f bdcdf040 -> 40957768", + "4106c5a9 c0538d88 c058d5fa 40e79274 413b6499 3fe3a2e3 -> c41d2a59", + "c04f5b31 40df38b3 c0458dcc c15a9c37 c170f581 3ff3c258 -> c1714c97", + "40846260 c0e437d1 41188e9d c10f91e3 c107d0cf 40a160f8 -> c10a53b7", + "c196748d bfb5ac05 411327da c12c9814 40aec4e3 40b35d29 -> c215987f", + "c11663c4 40d2d4fe 40b008b1 413319ee 41913ad2 403395e5 -> 42e30a5c", + "c14c24b7 c09f4f0f c0b9d451 417d6808 41223be4 401bcef0 -> c216a202", + "4190e408 40ff0f3c c05aeea1 c14c3f01 4193ec73 40c85d86 -> c2225bb8", + "c0ce3a78 40c71f72 c0975856 40bd64c3 c167e80a 40b7b8d9 -> c18d86b8", + "c189aad1 40d89b3c c0ab89e5 40e2a3cd c186caf8 408b9739 -> c220e64b", + "c18d51ac 4114005d c0f66996 c12ec47c c144878d 40b8939c -> c151528d", + "3fb5f8e5 be8a0635 bf943d2f c0aeb7cb 417833a6 407722ed -> c23583fd", + "410fb0da 40b96f07 40a16313 416e50cc c07ca435 40baad96 -> 42bd8e58", + "41229c75 4109439f 40126631 419aaebb 41363b8b 40aa4bde -> 41aab038", + "c15f7a52 40048574 c0212d96 4183f911 404cef1b 408aefeb -> c1efb997", + "41624eaa 3eaaa878 4113e085 409d6068 419b7f7d 40fc207a -> 41db686f", + "41717572 4083564a 3eb32198 40cf9477 c163f49d 40d5de2a -> 42865369", + "c1856e90 3eda5a0b c0d19d4f be4ca487 c0ec0ae6 3f86c821 -> c18e5b49", + "c110d5d0 bf53fc6c 3f02788b c14c3f40 401b0ca2 401bdf24 -> c2d44784", + "c19279f3 40429a58 411dd994 c1072def 4186b0ea bf7d3cc8 -> c2af181b", + "c107c09c 40b4c7ca 401b2849 c160279e 4006f666 3fa9321c -> 4262852a", + "c185bbba 409576ed c0628df2 c13f4047 40ad3ec2 40a04417 -> 42052402", + "3f9fa583 c02fc664 c04b4cab c190381b c190f81c 3ffc7992 -> c189411e", + "c115ebe4 41083ae5 3efd6a98 3edf846a c1335288 be3df8b5 -> c1cc40e8", + "c19abcad c01930b9 4049325d 41341b37 41558fe4 404b0a40 -> 409b6903", + "c16730db c08b9518 3da13459 c100b063 412de711 40f4c0d7 -> c24c03e3", + "409cf51f 40b2a622 4101d20d c17446f0 4197bb64 40740d80 -> c1c37cb2", + "c1635806 c060095f bf5eb7bc 40d99fb4 c0ebb1cb 40359732 -> 4280ef76", + "40bd8f66 3ff16ab9 c0df1167 41310519 c14adb52 4043efff -> 41af1941", + "c1313c82 c07b3c01 3f83f816 c071444c 4172ef9e 40d0f173 -> c1f8f022", + "41712b01 40d70b32 3e7730d3 c0501590 4179617b 3f50fb9b -> c1dc4e64", + "4102926d 408daf97 bf9c87a7 416306a4 c13ee417 3e76e8cb -> 41fb8fd4", + "c170da3a 40970d6e c086cc0e 4125afc4 412cb65e 3fc09c8b -> 41353d28", + "416243b1 40191ec7 c0ba5b75 4052e1ac 402b6965 40ef0ad9 -> 4085a956", + "3c2d5528 40fbb9ae bebb75a3 4074cd20 c108927b 40c7a835 -> c0ff0b72", + "c16bdaf3 c0d9d26d 4034696b 404a5290 c11d39ec 40a6826b -> 415ddcf8", + "416a456c 4102f958 c06ff4cd c10bd88e c07c84f5 40c67ff3 -> c1355800", + "3f756e70 40a4e70d c0c48010 c1348ee5 c18164bc 40f9310a -> c1519cb0", + "417cb33e 40572bb6 c09c8022 c184956e 40b1b638 bd97395a -> c2479d9d", + "c1961517 c0bf11f2 c0e54e91 40fa627a c0ada4ee 40ff4875 -> c30600f2", + "41815670 40683890 404f9bf7 411d5640 c1868327 4011e4aa -> 445bac7e", + "41189b14 400eb8b6 c0fa57fa c1923f86 414e9938 40286b1e -> c223d2d5", + "419b53e1 bf45118b 40d24449 3fe43a1b 415ae5cf 3e80f92f -> 420a012d", + "c01c87cc 40a7ac54 c0368965 c181d6b0 3f57e8d7 3faae185 -> bc64b800", + "4035dc8e 4084a2f3 c0c67ea2 c0ec695c bfd8b1ac 3feb8cc6 -> c0d57574", + "40743392 c0cebb5e c0d16430 4114b081 416cb65f bf27c826 -> c427bc34", + "41983674 be6c86c9 4110bbbd c0a667f8 4127abc9 3f557a74 -> 41daca78", + "40b8985a c0bab690 c1064aec 418a34fd c0ed8f47 3f889982 -> 43014b44", + "41453df4 3f069901 c10b4b9a 40e45fb5 c14d04f0 3fd972ca -> 420290ac", + "c12c3fbc 4011fc93 c0ecfeef 4136ffa3 412b6b24 4041b496 -> 41276713", + "3f9a0cf8 bf840f99 c0a61237 4190156a 4168836d 40d21d69 -> 419f0af5", + "40822e41 404d006a c021167b c19abeb3 c0bcbd60 40bde8c3 -> c1ab0293", + "414da901 c01ae0ee 40d314ab c0968a16 c140de5f 40ba6e4a -> c1893e15", + "40ca9beb c0f45963 40e78615 c186e3cd c15aa169 3e3d3ae6 -> c15dbd08", + "bfe2b36a 411c7f22 c0ca20ef 41349e9d c15d5c4c 400f64de -> c0d7b58a", + "419c2917 c0171b39 40877fa8 c18089a6 c14ad990 40c55035 -> c09a593e", + "c13df848 408b47a3 409682da 4166dc15 414c3262 40ed5af9 -> 42b6ef3b", + "c17058c6 c0f42ec6 40da4d2c c0150fcc 41504522 40029387 -> c122d494", + "c1868d8a 400cbf3b bf843a70 412aeb75 bf43ce86 407424b5 -> c262b1df", + "4125e218 40810ee2 40f9c734 bfb8c1b0 c09ab74d 40ccd519 -> c0e46c54", + "bfa8e550 411cfea8 410119c0 3d5413d4 c14c05ad 40699a24 -> c2a36526", + "40c187e5 408261c7 3f10e4c4 c187cbd3 41335f32 4047c6ac -> c2034fd3", + "c13a5b31 408c6538 4091750a c0f09a76 c045de03 409e6eb9 -> c3e425ea", + "c15a72f4 410b7397 c03b9985 c0d4a35f 40e8255d 3ff891ff -> 41a06664", + "c0501806 c103fad9 c058e1a3 c0cd0c0c 4187a65a 409f4059 -> 418cee36", + "c0d96d73 3ff01500 c01e1a6d 41724e71 c1441e03 40bcf9a3 -> c21e1628", + "3f71785e c0b3c2ab 40c44617 400a60ef c19c4bca 40322281 -> c11f3e62", + "c103d8ca 408eea19 c0f3388c c15ed2cc 413cf964 40bcd42a -> 4152cebc", + "403287cd 40d951ce bff7b63c c1356d69 c16f6752 403ba217 -> c1500374", + "c10c5c8a bf6a44b0 40c1d750 bd5574af 41241f3b 3ef82be2 -> c13ab906", + "c174874e 409b57ae 409cbab7 41934543 c09c66f7 40b18b6d -> 46296c18", + "c10e270d 3e802cf3 40f334c0 40db9db0 c00cd97f 3e16377d -> 41910644", + "408fe85c c0ce63b3 c0a80d3a 41267bcc c10c98a2 40cb4b78 -> c324f57d", + "418f5f9a 40443ecb 40a1c252 c155a64a 41203c77 40e8abd6 -> 43213518", + "c0b26e84 bfb0f8c1 c043f1cb c181022f bf016bfd 40e1dc5c -> 41b716bb", + "412f503a c0b82298 c0b250e5 410aac3c c016e18a 40ac071d -> c47b1d58", + "417b5c76 c02c21ca c0b79b25 4170e597 c1976f07 bed256db -> 435c3431", + "c111c0ea c0afffe1 40e56436 c1382a9f c13728dd 3c314be4 -> c1387410", + "c135fa0e c0e267a3 3f9674fc 40f3b653 40d786fc 4087ba74 -> 410132b0", + "c1737ee9 4001881e 3f2eb6ac 40784907 c0e2c4c0 40d74e3f -> c3091253", + "c0e57a09 bff728f9 c104b8b4 411f6e08 3fba8d6b 408c9863 -> 403d6d90", + "40acd4d3 bddec53f 406b29f9 bef6e441 c04b6d69 40d2b873 -> c08d1733", + "c1254173 c0a36024 40e4383b 41292f36 41709b3f 40e146d9 -> 410ab373", + "415ed926 411ba273 c05e0fe9 c0d856b5 4199f965 40e7cacf -> c170a0f0", + "c0ad6d90 406baec3 c0efec06 41073126 3f819a45 40948ebf -> 401943bc", + "c0df54c6 40fb4e45 c0893f09 4173d7ba 412a0822 40b2db09 -> 4119adc1", + "c08f2185 400fad8f bec2b267 40f40c81 3f35f0f2 407602aa -> c1212138", + "40306c42 c106b1f8 41144903 c1208f01 bfe13533 40738388 -> c099cb3f", + "bf16efaa 3f843499 c0c0fa5f c01d25f6 408783da 3f6488d9 -> bf6b2fe4", + "c1855a5e c080c67c 41108a33 bd6f1c87 40af5d9f 403febd5 -> c0ad7ec8", + "4120732d 3f935ffa c04c00e1 c0d0dc6f 419359e6 bf002c95 -> c2663f9f", + "c17af693 403e0690 c02038d1 40b82815 40a267e3 40ae1796 -> 405c07e2", + "40685356 c051e13b 4016174c 414df8bf 4194a6aa 4052a2ff -> 419f1549", + "41868358 c060367a c0da10d5 c0a5e17f c03da032 3ebc1086 -> c1967cb5", + "4149bf89 40cce406 4046475c c1598e08 40914e72 40b17893 -> c23ea500", + "4188b1a5 41164d1d 41129b1f c106699a c0baf7e1 40f4fd07 -> c2bb366c", + "418582a8 40f3449b c10f7815 3f97137b c0de6570 40b435eb -> 40b472a3", + "40168567 c0673aa8 c09f63f3 40e30900 40e6bf98 3e98fdfa -> 40d2d824", + "bf22c467 410fdd57 bfd3d6ed 40d20888 c06f9ac0 40cb5b9f -> c0307458", + "c118e19c 40fd20f6 408529b8 c0dd1219 41801e1a 409f84cf -> 42c7c517", + "4076f3f7 c0e08f84 c02bcd60 c09520a9 c18a5cc3 bee91f17 -> c2117f62", + "c1173fc8 c079e5b4 40af94cc 41827450 bed5e339 3f3c308b -> 41d17fed", + "c1530423 c0c4559b c112002e c13eb548 3fe268d2 bf637af3 -> 41a2fd5c", + "415362a8 40b16a1c c0b73a30 401ec5a4 c1830afa 40c3077b -> 417500ba", + "c16e6d01 410f1344 c0f781e2 41762276 3f1c20c0 3f63089c -> c0b7a768", + "4126783c c1199d4f becdaee8 4131e7ef c1451a2a 40beb97e -> c21f6771", + "c19d1fcf c0c47a8d c0f2c4be c16e4a87 c0776cc3 40c21046 -> 42b00b7b", + "41716f2f c02873e1 c1182593 4004dc79 c06dc707 408076f5 -> 4187feec", + "4191dca8 411bdedb 409007dc 4191b06b c0d0a4fe 40f8ca30 -> 42691cd8", + "415590ba c1190167 c097d7d1 c17da9bd c16dc1f8 409f914c -> c132068a", + "4045dd8c c11b44a9 40b94230 410105fc c0c71643 40272d48 -> c06efc40", + "40b05e39 411cc66f c0ed0c22 41922f55 403df7b8 40a655fb -> 41675bad", + "c19ef809 40c60880 c11cc591 419ea3b7 c182443d 3ffa9a0a -> c21c264e", + "40c144c7 c0612e8a c0cf68ae c163b817 410b8991 40b72b7d -> c2b08cbd", + "c0966d65 40db7667 40d6b010 415265d1 c17bdc65 3fa9bd5d -> c50b0fb1", + "41134281 3fc171f6 c08d9e66 3fd92d5d 41434098 3fc90101 -> c13eaaee", + "c1196ac1 410123f0 3fcd22ad c18ae6cf 41282587 40d812f7 -> 426aeac2", + "417c67be 40bbaf04 40984989 c0d72128 c168793a 409d4400 -> 427ce1e9", + "c0507d54 40679c08 411e2367 418d224e c16cb393 4032d038 -> 4254fad1", + "c14d492d c04cd7ed 3fb95938 c1056dbc 4130f5f9 40d522ad -> c2421918", + "c08918f8 408046be c0bcf6be c18d08d1 c19bf213 40c64b35 -> c19981fc", + "c14589e7 c117e561 c112ea51 c12fba13 c16f78ae 3fa24070 -> 41cc35dc", + "c16bd6fa 40c3f396 41057415 40474d08 c190eb35 3eb3a64e -> 434adc4d", + "c00416e5 402e3224 c0f9983a c17ac291 c1220f5a 40e807ad -> c1526a52", + "40118cf9 c0889179 40cc2b9a c110d30c c13898a0 409238f9 -> c129426c", + "4155e900 c1156f6c 40183d64 40eb3844 3ff54b33 40b0ac2d -> c04b8b88", + "c1886483 c0be00bd c026d85d 415ac007 c11405cf 40ef2771 -> 42b44b78", + "415827d6 40bf4225 409d5cbb c12fdc97 41156c4c 3fbc44fd -> c31b920b", + "418b98b1 c0b52e81 411557c1 4174ba68 4007a787 40d1f2c5 -> c0a05ae0", + "410172ee c11b91b5 c08328f4 41903221 bf7a7778 40762bf3 -> c228a636", + "c182eb6f 409e5cd0 c11acb92 c146568b 4092f96a 3faa9a24 -> 4145d8d7", + "404df9be c1182bb6 c1161df3 4141418a 41904344 40ec941d -> 4416a357", + "c0feef13 c11aacd4 41037c72 c0efbc19 411af66e 3febc56f -> c0bb7922", + "c097e437 4109eb5b c102fd0c 409a5efc c10f185a 400ed3f9 -> c0c40302", + "4162ac78 40089fdd 3d20382a 3feb58ae c18330b6 4006c1f2 -> 42d51a03", + "c0a2fd1b c0b0c551 3f8145ab 4100fb21 c0b224fd 3eb80abc -> 40e5374d", + "4182ffa3 c036ac14 bf98c002 c0b7518b c11a78bc 4060d7be -> c24cb7d8", + "c0b3032b 410996ab 400f3d51 41337541 3fac03c1 40410f33 -> c12cfbbf", + "c13761a3 c0e40ada c019de66 41088bc5 c182ac82 40d66f10 -> 41fae914", + "4091fecf 40b0feb5 c0564bdf c1722b9b 415e4df3 40f68754 -> c13f7f2e", + "3ff31bb6 bfdebf7e 40246982 bf3b0510 411af173 40c598c2 -> 41010c4e", + "40f45afe c008bde1 c0bef412 403dc420 c0f79bb5 3ffce377 -> 41f22845", + "41522476 40e1aebe bfc3400b bffade47 418cf11d 4094947a -> c17d6e2f", + "419319bf 401cb488 41176c45 4181817b 418fdbc8 bf159c6e -> 41a21d82", + "418bb571 c0e082f2 40bfa8ff c13edc56 4189398e 40ec7da7 -> 422b3e9a", + "c11df9ea c08558f9 3fd8ed2f bfe51fd7 4138f498 be3b7096 -> c16c9285", + "4183e125 c066bccf 4075604f 408b04b8 c177321e 4083e78d -> c244715d", + "40b14b0d c0401234 4090b945 c181da91 40e999cc 4090766c -> 4127bbd4", + "409b1c51 c10789b9 4094a73f 411c0573 416924c6 40a87dcd -> 416a5484", + "c0c0841f 4014e747 40f27306 414055cb 4174824f 4011f703 -> 40dad975", + "419515b1 befb3f54 40fa4c08 c15bc99c c0884224 408cafcd -> 41012a24", + "c17ffc96 4102be7c c1195064 4178fa73 c002b200 3f95c2c1 -> c1067a15", + "416783b4 40cdb20b 408aae02 c0ce7dc2 4155349e 40c1259d -> c2a4cc4e", + "c19f2fb2 3fa9a878 c0392dc8 c0add541 4176cb0e 40ece893 -> 42c6fbb3", + "c0fc09e5 41049778 4117123d 403e4ab8 c0985efa bf6bc704 -> 42de7010", + "c181272e c0e8b82b 40ac700f c16bf613 41669a75 405b2bf2 -> c20cb873", + "419ed174 c025a776 c022ba71 40d5b914 4178eabb 40893cce -> 4588666a", + "418276b2 bf81b7a6 be1f6451 413db6fc c14243ef 40b6bef1 -> c3ec6226", + "c19bcfaa c0d65e48 c0f9e7de 4176a524 c07dd037 404eca48 -> c34f9322", + "c18fc249 c0ca6671 c01c4e72 40bf01e7 c182a61e 404f29e4 -> 4291b363", + "3f74f7b8 c0e34bdd 40bfc8fb bf45e97b 4183a5db 40fa4c1a -> 411d48d4", + "c10df8df 406cfe4b c0415506 40e64d94 c184ba92 40d62a49 -> c2152f6a", + "4105fd30 40da7028 c0eb495e 411aef3c c1944df1 be425ee7 -> 414c3c7c", + "c18b3bd4 bff67e52 c05ea1d7 c14249bc c1428bae bef47712 -> c144db0b", + "c18ff24f 411d4df6 3fac0254 41142b92 40521ab6 3fa8a85e -> c125600a", + "418bf378 bf31c608 c0c0ff49 c1400dbd 3e22206e 3fa5a535 -> c255ced8", + "c0d8b5ba c0e52648 40956543 408802c9 412a74dd 40a00000 -> 408ebe8c", + "c1020f08 4117eab5 40c61366 40b7a1be 40fdeca0 40800000 -> 418b9dbe", + "c14e9815 3fe7ba6a 3f8e4562 414b7f7e c0df85a5 40400000 -> c3c92d52", + "41848cf9 3fc4516f 3fa6dd05 3fdce27d 40b07bdb 40000000 -> c375ddff", + "c160e589 411cf8fa c00920d9 4140cd05 c15db0c6 3f800000 -> c21eb2de", + "40b17031 c104d8f6 3ff3a886 418c5a11 c0852a90 00000000 -> c13e7bd6", + "414bf8de 40752b2c 40cfbf38 c1437a6c 3da2b005 bf800000 -> 41e7e41e", + "40e83e46 c00eb0ee c0f3daec c165ff13 418c2a30 c0000000 -> c28d02c9", + "c194009a 40fea0d2 bfc3ffe7 403c6ab9 bdbcd9f2 40bfab56 -> c0b0b5f0", + "c0cd4d14 c04649ce c0658e2a 4008bf01 40e0ad26 40482368 -> 420d373e", + "41976356 40c1b0cc c0ce8876 c15e82a4 bf990202 40935270 -> c1d7e784", + "416ce6cf 410288c5 40ba3d25 c07006e2 c009f023 3f25c822 -> c1049076", + "403e5068 40a06541 c1064f97 41878d02 c0a84fbd 40c9437e -> 41591457", + "4138c1d3 4119d363 4022a699 c18ebb8a 4185f9f5 40b6a034 -> c1da5de4", + "4199d6b7 c0d68154 c1079cd6 c1878f10 c1392b11 401101a0 -> c2bf140d", + "41968346 410c0f4e 40890593 40dd27b5 c13d1e27 40825514 -> 424433f1", + "c09a730c 40b4dd89 40b4dd89 40faf2e9 41995335 40011af2 -> 00000000", + "4181d7f3 3faa0a7b 3faa0a7b 417c1885 414c3d93 40babb41 -> 00000000", + "bf05b647 c05ce5d8 c05ce5d8 c128caab 41933fe5 40a56c68 -> 00000000", + "40a29076 c0ab3de2 c0ab3de2 be6915ef c1092708 409d66f8 -> 00000000", + "c158a866 40b4de0c 40b4de0c c0de8295 419e062d 400ed592 -> 00000000", + "c1696e01 3fa7577a 3fa7577a 419fbce5 c0c34995 3fed3206 -> 00000000", + "4178fbe2 bea1992c bea1992c 4004677a 4180f056 3ff992e6 -> 00000000", + "4190db99 bffa5215 bffa5215 c15b2d22 41987fba 402e5b2d -> 00000000" + ] + }, + { + "function": "cycles_map_range_linear", + "node": "ShaderNodeMapRange LINEAR with Clamp", + "then": "cycles_clamp_range(result, to_min, to_max)", + "cases": [ + "00000000 00000000 00000000 4075fad0 c10756fe 40a08322 -> 00000000", + "00000000 00000000 3f800000 c198bae5 c097d24e 40a69c6a -> c198bae5", + "00000000 00000000 bf800000 be5e211b bf7e28ef 40fbe0b4 -> be5e211b", + "00000000 00000000 3f000000 bf294f5b c15addc6 3f80baf6 -> bf294f5b", + "00000000 00000000 bf000000 419e9372 4134bfbf 40b28438 -> 419e9372", + "00000000 3f800000 00000000 416050fc 41731569 40920e1a -> 41731569", + "00000000 3f800000 3f800000 4084eb5d be8b01d8 40ca6e2f -> 00000000", + "00000000 3f800000 bf800000 41067c70 c167e60e 405a1fa2 -> c042d33c", + "00000000 3f800000 3f000000 409bc84c 41051990 3f9883dd -> 41051990", + "00000000 3f800000 bf000000 c0bc1bdf 40af134e 40e36d7c -> 3fd80e50", + "00000000 bf800000 00000000 40992dfe 418a5018 405c151d -> 418a5018", + "00000000 bf800000 3f800000 c1489d3e 4000fe50 406eac43 -> c0a85daa", + "00000000 bf800000 bf800000 406bb868 c161b8aa 40b444c4 -> 00000000", + "00000000 bf800000 3f000000 419484d9 412170c0 4030f854 -> 414ea3bb", + "00000000 bf800000 bf000000 c120c5c3 4187f9af 409db239 -> 4187f9af", + "00000000 3f000000 00000000 c184294f 414d0ad8 3d225aea -> 414d0ad8", + "00000000 3f000000 3f800000 c18839f1 c129a25e 403edbc6 -> c18839f1", + "00000000 3f000000 bf800000 41913efb 40af096c 40fe6abc -> 415ed58b", + "00000000 3f000000 3f000000 be9e4767 c031d4b1 3f92822f -> be9e4767", + "00000000 3f000000 bf000000 4092e0c3 c153c6ab 40e24741 -> c08a5649", + "00000000 bf000000 00000000 c0deec51 c189b55a 40448436 -> c189b55a", + "00000000 bf000000 3f800000 c01d4079 4177be49 40c0783c -> 40617d67", + "00000000 bf000000 bf800000 bf4a4759 c16e5b7e 40a2c4a5 -> bf4a4759", + "00000000 bf000000 3f000000 40bee434 40e8f5ad bee9478f -> 40d3ecf0", + "00000000 bf000000 bf000000 4040e1a5 40b43682 40993eb2 -> 4040e1a5", + "3f800000 00000000 00000000 bf8713a8 3fb6ea75 400ce368 -> 00000000", + "3f800000 00000000 3f800000 c0d77f98 c1600cad 40fd258b -> c1600cad", + "3f800000 00000000 bf800000 c181ea97 419ac96f 40addfc2 -> c181ea97", + "3f800000 00000000 3f000000 c101e01e c18a6f3b be9e7cf5 -> c18a6f3b", + "3f800000 00000000 bf000000 c0c37bca c103e79f 405d429d -> c0c37bca", + "3f800000 3f800000 00000000 40f0642d c14498bd 40b252d8 -> 40f0642d", + "3f800000 3f800000 3f800000 c106166f bfe41440 40df3a76 -> bfe41440", + "3f800000 3f800000 bf800000 410d3008 c15920f0 40f434d8 -> 410d3008", + "3f800000 3f800000 3f000000 4051c9ea 413f6597 40813d24 -> 4051c9ea", + "3f800000 3f800000 bf000000 417729c4 419ac141 40e35feb -> 417729c4", + "3f800000 bf800000 00000000 c0b1167e c16d385d 3e045c5c -> c16d385d", + "3f800000 bf800000 3f800000 c168ff32 be4b284a 40cafd03 -> be4b284a", + "3f800000 bf800000 bf800000 4094ffdf 413d1196 4066bfc8 -> 4094ffdf", + "3f800000 bf800000 3f000000 40e65b7e c12a4402 40edc9f2 -> c12a4402", + "3f800000 bf800000 bf000000 4199e2c8 bfaf4cac 405181bb -> bfaf4cac", + "3f800000 3f000000 00000000 40cfd4c3 c170435b 40b6b075 -> 40cfd4c3", + "3f800000 3f000000 3f800000 c087a843 c052ebff 3f41c4d5 -> c052ebff", + "3f800000 3f000000 bf800000 c19f9240 c0f91a00 3fe121d6 -> c19f9240", + "3f800000 3f000000 3f000000 c15fe90f 4192de2e bede1520 -> 00000000", + "3f800000 3f000000 bf000000 4180f878 bf2bb13b 4073980f -> 4180f878", + "3f800000 bf000000 00000000 c1377424 419520b8 3e80bf1c -> 419520b8", + "3f800000 bf000000 3f800000 40e2c16d c121a26c 3fefd849 -> c121a26c", + "3f800000 bf000000 bf800000 40a716e0 413d6004 40b38523 -> 40a716e0", + "3f800000 bf000000 3f000000 c0a01a94 3fa86414 404b4105 -> 3fa86414", + "3f800000 bf000000 bf000000 c19bf363 c1828e7e 40a02385 -> c1828e7e", + "bf800000 00000000 00000000 c05770bc 415c90f0 3f39d70c -> 00000000", + "bf800000 00000000 3f800000 3eda8a79 4188f3b1 40d558b2 -> 3eda8a79", + "bf800000 00000000 bf800000 c1483479 40fa19c8 bf4a48ff -> 40fa19c6", + "bf800000 00000000 3f000000 406beb4a 3fb250f1 bf4baa1f -> 406beb4a", + "bf800000 00000000 bf000000 c0ba4a05 c18fdeb2 4012120d -> c18fdeb2", + "bf800000 3f800000 00000000 41943fdb c0e701e3 408119c3 -> c0e701e3", + "bf800000 3f800000 3f800000 4130d11b 410ecdfe 40a66994 -> 410ecdfe", + "bf800000 3f800000 bf800000 c165eae2 c189f4d6 40b0b494 -> c189f4d6", + "bf800000 3f800000 3f000000 416fb594 40c988c0 40cc0ecf -> 40c988c0", + "bf800000 3f800000 bf000000 c0709bad 412eeda0 409a4e11 -> 412eeda0", + "bf800000 bf800000 00000000 417df807 416c8553 40d7a0de -> 417df807", + "bf800000 bf800000 3f800000 412c000e 4140967b bda47821 -> 412c000e", + "bf800000 bf800000 bf800000 41884a99 4116d7a9 4013c9b3 -> 4116d7a9", + "bf800000 bf800000 3f000000 40155b3f c1930270 40ed77d8 -> 40155b3f", + "bf800000 bf800000 bf000000 c14eae3d 41461867 40807b12 -> c14eae3d", + "bf800000 3f000000 00000000 4139f70a 410d1379 40dd9ab1 -> 410d1379", + "bf800000 3f000000 3f800000 4110deec c13dbadd 40c97bd3 -> 4110deec", + "bf800000 3f000000 bf800000 c06b9544 c057cf37 bf42bfd5 -> c057cf37", + "bf800000 3f000000 3f000000 c081639e c1014f80 40a728a8 -> c081639e", + "bf800000 3f000000 bf000000 40f37590 c0d7a0b5 40604e19 -> c0d7a0b5", + "bf800000 bf000000 00000000 c0caef0c c1538e13 4081ca1c -> c0caef0c", + "bf800000 bf000000 3f800000 41577b5b 41586e15 3fa7f526 -> 41577b5b", + "bf800000 bf000000 bf800000 4044e395 c18cdfa3 40bf08a7 -> c18cdfa3", + "bf800000 bf000000 3f000000 c15492ae c19f4d7d 4096c8e6 -> c15492ae", + "bf800000 bf000000 bf000000 40d60913 411224cc 409cff02 -> 40d60913", + "3f000000 00000000 00000000 c0ba7552 419d52ac 4083da21 -> 00000000", + "3f000000 00000000 3f800000 c1997e14 405224fa 405d65e3 -> c0fe72ea", + "3f000000 00000000 bf800000 41523af6 4197d673 3ffe3f9f -> 41523af6", + "3f000000 00000000 3f000000 40bd12e2 c18a8ea3 40d7b93e -> c18a8ea3", + "3f000000 00000000 bf000000 c0f9221f 410af09e 3f5df69a -> c0f9221f", + "3f000000 3f800000 00000000 c17506f7 41979ba3 3ff05db4 -> 3fe8c138", + "3f000000 3f800000 3f800000 c15f8d4a bfacc1bf 40d593f4 -> bfacc1bf", + "3f000000 3f800000 bf800000 c1686733 c169a843 bf4dd3d3 -> c168b777", + "3f000000 3f800000 3f000000 c192b65e 3eb21514 3f1810c9 -> 3eb21500", + "3f000000 3f800000 bf000000 402ab655 c0ad0319 40c96d37 -> bcc44180", + "3f000000 bf800000 00000000 40d8e914 bf59cf8b 3f48b939 -> bf59cf8b", + "3f000000 bf800000 3f800000 41922072 40bef574 40963da3 -> 4110ac44", + "3f000000 bf800000 bf800000 4144f5e9 c11f6a26 40d0fc3e -> 00000000", + "3f000000 bf800000 3f000000 bfb002da 418138f3 40a31405 -> 418138f3", + "3f000000 bf800000 bf000000 c0d151a7 40e8974c 4081c373 -> 40e8974c", + "3f000000 3f000000 00000000 410c3050 c17ad42f 40bbabbd -> 410c3050", + "3f000000 3f000000 3f800000 c18a741e bff749cb 409a9895 -> c18a741e", + "3f000000 3f000000 bf800000 c1948982 418b11e8 4041e98c -> c1948982", + "3f000000 3f000000 3f000000 c18a8170 4194a2d5 bf0ef8aa -> 00000000", + "3f000000 3f000000 bf000000 c020d7ed 3f592307 40fdf5ee -> c020d7ed", + "3f000000 bf000000 00000000 c0eb9835 3f63c8a9 3f1a1aa8 -> 3f63c8a9", + "3f000000 bf000000 3f800000 c19efbca c18aed67 40e90616 -> c1919cdd", + "3f000000 bf000000 bf800000 3f4ae438 bfa282d1 40d60aaf -> 3f4ae438", + "3f000000 bf000000 3f000000 c1377820 419318dc 40e00fca -> 419318dc", + "3f000000 bf000000 bf000000 3fad7b7f 4137ba57 4052c52d -> 3fad7b7f", + "bf000000 00000000 00000000 41322abc c0e259b7 bf5d59ab -> 00000000", + "bf000000 00000000 3f800000 3eb3ae3b c0a14e38 40533fd7 -> 3eb3ae3b", + "bf000000 00000000 bf800000 c07f4fdb c0515054 408b0244 -> c0685018", + "bf000000 00000000 3f000000 c15380f2 411dbcf6 40887878 -> c15380f2", + "bf000000 00000000 bf000000 c12aa33b 408ea2d0 40208146 -> 408ea2d0", + "bf000000 3f800000 00000000 4139f69a 416c1dcc 406a4c44 -> 416c1dcc", + "bf000000 3f800000 3f800000 41905654 3f103a2b 3ebb9136 -> 3f103a2b", + "bf000000 3f800000 bf800000 415563d6 c14eb9c7 3df7561c -> c0cb64bc", + "bf000000 3f800000 3f000000 c14a7c2f 4105915b 407fa257 -> 4105915b", + "bf000000 3f800000 bf000000 4112fd04 415f5ebb 3f9b78b7 -> 415f5ebb", + "bf000000 bf800000 00000000 c07e6254 c1101c2f 401c7409 -> c0cfb4c4", + "bf000000 bf800000 3f800000 41305e31 418688c3 40a695db -> 41478b06", + "bf000000 bf800000 bf800000 bd4e84c7 bfafccf5 40df9b00 -> bd4e84c7", + "bf000000 bf800000 3f000000 c0189e7a c162b54c 3f87cb55 -> c0ca0306", + "bf000000 bf800000 bf000000 40d83b60 40e00c81 4010600c -> 40e00c81", + "bf000000 3f000000 00000000 c09f34ad 411799ce 40fa60a0 -> 411799ce", + "bf000000 3f000000 3f800000 c172c10a c17d1443 bed3ad27 -> c172c10a", + "bf000000 3f000000 bf800000 c10e15e3 41355d6d 4089199a -> 409318a6", + "bf000000 3f000000 3f000000 419606a7 41134bcf 3fd39d3a -> 41134bcf", + "bf000000 3f000000 bf000000 40cc230e c11de303 4048bd76 -> c11de303", + "bf000000 bf000000 00000000 c050e5a7 3fe9f19e 3e292cc9 -> c050e5a7", + "bf000000 bf000000 3f800000 c1700287 c1759fcd 40eaa309 -> c1700287", + "bf000000 bf000000 bf800000 c17ca312 c1759bac 401f5912 -> c17ca312", + "bf000000 bf000000 3f000000 c1019d74 c1813ab2 4043a06a -> c1019d74", + "bf000000 bf000000 bf000000 c0f1297e c03dbbcd 4089c69b -> c03dbbcd", + "40000000 00000000 00000000 c0d8ddaa c16d5ea2 40ff4b25 -> c0d8ddaa", + "40000000 00000000 3f800000 413e457c 3f26bd0d 400d524b -> 3f26bd0d", + "40000000 00000000 bf800000 c1322c0d 3e03c8a4 3fa43a56 -> c1322c0d", + "40000000 00000000 3f000000 c110267e c18d7659 3fd2a2fc -> c18d7659", + "40000000 00000000 bf000000 3e0b26e4 be41a222 4055c2e0 -> 3e0b26e4", + "40000000 3f800000 00000000 40b998e3 4192a51f 40d0b3e1 -> 40b998e3", + "40000000 3f800000 3f800000 40b59229 c033abfa 40680c65 -> 00000000", + "40000000 3f800000 bf800000 417cd408 c08a851b 40f187b6 -> 417cd408", + "40000000 3f800000 3f000000 41468b62 4167efd9 40cf3ace -> 41468b62", + "40000000 3f800000 bf000000 414632be 407f58c3 40eb09b0 -> 414632be", + "40000000 bf800000 00000000 c191ecbd 4036cb4e 40f793b9 -> 4036cb4e", + "40000000 bf800000 3f800000 c016efb2 c18ea7c3 3d2c2215 -> c18ea7c3", + "40000000 bf800000 bf800000 c10cc035 405dc837 40a04e59 -> 00000000", + "40000000 bf800000 3f000000 400a83fd c13b3827 4069ffa0 -> c13b3827", + "40000000 bf800000 bf000000 41938c9e 3ff1e847 40a15b03 -> 3ff1e847", + "40000000 3f000000 00000000 c019a76b 40e14178 40b614b1 -> c019a76b", + "40000000 3f000000 3f800000 c1847782 419aba27 3f434fc6 -> 419aba27", + "40000000 3f000000 bf800000 417fffe0 4182f0ca 3fe4ce1e -> 417fffe0", + "40000000 3f000000 3f000000 c15b983e c138dc28 3f8e5ceb -> c138dc28", + "40000000 3f000000 bf000000 c06fe847 418b782d 3f3a58eb -> c06fe847", + "40000000 bf000000 00000000 411d2c99 c1160410 3f43803d -> c1160410", + "40000000 bf000000 3f800000 c13953f0 405365d2 bed9ec0d -> 405365d2", + "40000000 bf000000 bf800000 c12ef7f2 c0c2a260 400ae45a -> c12ef7f2", + "40000000 bf000000 3f000000 c0f6ac49 be53da3e 408788a2 -> be53da3e", + "40000000 bf000000 bf000000 c18dfdbe 4185282d be7389cd -> 00000000", + "c0000000 00000000 00000000 c03eebc9 40598ab1 40ce388f -> 00000000", + "c0000000 00000000 3f800000 c10c6542 4137f6da 402c2610 -> c10c6542", + "c0000000 00000000 bf800000 412fe06e 4083444f 40b09772 -> 4083444f", + "c0000000 00000000 3f000000 c1826ce9 c11e98bd 402621f5 -> c1826ce9", + "c0000000 00000000 bf000000 3f781b80 418e7647 40d92918 -> 418e7647", + "c0000000 3f800000 00000000 c1188e99 bf4e79df 3f9d6696 -> bf4e79df", + "c0000000 3f800000 3f800000 4113f56c 411539b5 4031f5f8 -> 4113f56c", + "c0000000 3f800000 bf800000 418018d3 40bb50af 40ecbda3 -> 40bb50af", + "c0000000 3f800000 3f000000 401bf849 41353f56 40f07590 -> 41353f56", + "c0000000 3f800000 bf000000 40f7f57a c0ac6b7c 402241be -> c0ac6b7c", + "c0000000 bf800000 00000000 c0d32660 c0f97c25 3f8ce862 -> c0d32660", + "c0000000 bf800000 3f800000 c1704621 c0b03e58 400cd9d7 -> c1704621", + "c0000000 bf800000 bf800000 c13f7d67 c0df7941 409f825f -> c0df7941", + "c0000000 bf800000 3f000000 be8c96ab 41209325 40dd3164 -> be8c96ab", + "c0000000 bf800000 bf000000 403129dc 4154284a 40c296c8 -> 403129dc", + "c0000000 3f000000 00000000 410212f7 bfd8ce9d 3fb5acfb -> bfd8ce9d", + "c0000000 3f000000 3f800000 c07d03cb 40e29483 3ea77df7 -> c07d03cb", + "c0000000 3f000000 bf800000 4125e416 c065c332 3f15fb5b -> c065c332", + "c0000000 3f000000 3f000000 c186ba64 40966814 3fd5e3c8 -> 00000000", + "c0000000 3f000000 bf000000 c1857790 41561677 be37e05d -> 41561677", + "c0000000 bf000000 00000000 40919db9 40dafbf5 40b22a30 -> 40919db9", + "c0000000 bf000000 3f800000 40fa67f0 409b1ea0 4028517c -> 40fa67f0", + "c0000000 bf000000 bf800000 40298e48 c0a2bb4d 3fb27e43 -> c0a2bb4d", + "c0000000 bf000000 3f000000 41895698 c19f23a5 3fa22b9f -> 41895698", + "c0000000 bf000000 bf000000 419df487 419bb6ae 4085347f -> 419bb6ae", + "40400000 00000000 00000000 bf645e63 3fc9c7b5 40ba33b4 -> 00000000", + "40400000 00000000 3f800000 41000fdb c0724c13 3ffc5273 -> c0724c13", + "40400000 00000000 bf800000 412ac8b1 c1901e5c 4085ff82 -> 412ac8b1", + "40400000 00000000 3f000000 4146d138 bf56fab2 40f5a325 -> bf56fab2", + "40400000 00000000 bf000000 3fcadd6b c129e04a bf37dcc6 -> 3fcadd6b", + "40400000 3f800000 00000000 c175994e c186e953 3f8c94f0 -> c175994e", + "40400000 3f800000 3f800000 3ea174fe c19fbb2a 40e96338 -> 00000000", + "40400000 3f800000 bf800000 402c3235 c0e28c59 40f673f7 -> 402c3235", + "40400000 3f800000 3f000000 c105c95f 40350be3 3f171f75 -> c105c95f", + "40400000 3f800000 bf000000 418c5e37 c0821730 40998be4 -> 418c5e37", + "40400000 bf800000 00000000 c14894e7 40b2593f 40e909f2 -> 40b2593f", + "40400000 bf800000 3f800000 c0c75ba8 412dc311 404ec19b -> 412dc311", + "40400000 bf800000 bf800000 41041245 c0f0aef3 bca31b4b -> 00000000", + "40400000 bf800000 3f000000 c182918f 4197ce66 409361a3 -> 4197ce66", + "40400000 bf800000 bf000000 c198e5a0 4188ec9a 40c09d16 -> 4188ec9a", + "40400000 3f000000 00000000 c15c7270 bfd0169b 40e0c721 -> c15c7270", + "40400000 3f000000 3f800000 c1830a89 417863e0 40a3aac9 -> 417863e0", + "40400000 3f000000 bf800000 c146eab1 c040624d bec5adfa -> c146eab1", + "40400000 3f000000 3f000000 418bc417 412d399b 40b849ee -> 412d399b", + "40400000 3f000000 bf000000 4127f4b9 c102beb0 4081c575 -> 4127f4b9", + "40400000 bf000000 00000000 41981135 c16cefce 40ffa5aa -> c16cefce", + "40400000 bf000000 3f800000 41539d95 41763eb8 40f32c8a -> 41763eb8", + "40400000 bf000000 bf800000 c185b33d 4185de81 3ef3a3ce -> c185b33d", + "40400000 bf000000 3f000000 413eef26 c10ab370 405ded83 -> c10ab370", + "40400000 bf000000 bf000000 c192c361 412f1e31 4038d2ef -> 00000000", + "c0300000 00000000 00000000 c17f34af 4195f642 4085fedf -> 00000000", + "c0300000 00000000 3f800000 c0d39cd7 411b5808 3e030fbe -> c0d39cd7", + "c0300000 00000000 bf800000 40e1449b c199f688 40eb19b6 -> c199f688", + "c0300000 00000000 3f000000 c114c831 c15111c1 3f6bfa8c -> c114c831", + "c0300000 00000000 bf000000 41559d6e c0c2f05a 405c7474 -> c0c2f05a", + "c0300000 3f800000 00000000 c16a775c c16d0707 40cab992 -> c16d0707", + "c0300000 3f800000 3f800000 bf9746d4 c01b0d09 40d90fb5 -> bf9746d4", + "c0300000 3f800000 bf800000 41006c0f c1201d18 40dcf3a3 -> c1201d18", + "c0300000 3f800000 3f000000 c163fea3 40a43ed2 4057e450 -> 40a43ed2", + "c0300000 3f800000 bf000000 c17ebd70 c18e9d8b 4012705d -> c18e9d8b", + "c0300000 bf800000 00000000 c0c50e13 4084498b 40b5531b -> c0c50e13", + "c0300000 bf800000 3f800000 40147048 4186381a 4008abdf -> 40147048", + "c0300000 bf800000 bf800000 c18ef5fa c0cf0dd6 40e73fb3 -> c0cf0dd6", + "c0300000 bf800000 3f000000 4144955e c180ee85 3f9a98eb -> 4144955e", + "c0300000 bf800000 bf000000 41294edf 41949b54 3ff26fc2 -> 41294edf", + "c0300000 3f000000 00000000 419aa0db c0a243e1 40b69040 -> c0a243e1", + "c0300000 3f000000 3f800000 c196b785 414a37fa 3e526c7a -> c196b785", + "c0300000 3f000000 bf800000 bf081a9c c10a544b 40bb9b9f -> c10a544b", + "c0300000 3f000000 3f000000 c10c18a5 c0f3b9b5 3f33ac85 -> c0f3b9b5", + "c0300000 3f000000 bf000000 3f9483c6 c0932a2f 40cca691 -> c0932a2f", + "c0300000 bf000000 00000000 40f7eabe c049b6ad 4043ecae -> 40f7eabe", + "c0300000 bf000000 3f800000 c13ac4fe c19b874d 40dc24de -> c13ac4fe", + "c0300000 bf000000 bf800000 c1529892 4143697f 401202a4 -> 4143697f", + "c0300000 bf000000 3f000000 40c777b6 c170ebe5 40995316 -> 40c777b6", + "c0300000 bf000000 bf000000 41419c6a c189b96b 40f0b996 -> 00000000", + "3dcccccd 00000000 00000000 4159839a bf5a6344 40b7fc3b -> 00000000", + "3dcccccd 00000000 3f800000 c0e83250 c03f19c1 4085fe74 -> c0da882b", + "3dcccccd 00000000 bf800000 c05e7c49 c12d0e6e 3f37cdd1 -> c05e7c49", + "3dcccccd 00000000 3f000000 c10af753 c0907a33 3fa29aad -> c0fb3dc2", + "3dcccccd 00000000 bf000000 411750ef 413cf66d 40df4717 -> 411750ef", + "3dcccccd 3f800000 00000000 41468f5b c13786bd 3fc64987 -> c1115153", + "3dcccccd 3f800000 3f800000 bfe89341 c1257803 40ded285 -> bfe89341", + "3dcccccd 3f800000 bf800000 40a04a23 c179864b 403aa3fc -> c08869af", + "3dcccccd 3f800000 3f000000 c10fdd5c 4127a9ef bf7e604b -> 4127a9ef", + "3dcccccd 3f800000 bf000000 41728e22 4182ea3d 40a5853a -> 417e1ebd", + "3dcccccd bf800000 00000000 4182379c c1103e21 40adace5 -> c1103e21", + "3dcccccd bf800000 3f800000 c024bd8b 41919158 4050a96d -> 410d975a", + "3dcccccd bf800000 bf800000 bd84345a c0dae62d 40c438a4 -> bd84345a", + "3dcccccd bf800000 3f000000 c18501d9 418aafb9 3fbc35ee -> 41047836", + "3dcccccd bf800000 bf000000 4193907e c12266a9 40f32757 -> c12266a9", + "3dcccccd 3f000000 00000000 410facd2 c1891ea8 bf224ffe -> c13ea816", + "3dcccccd 3f000000 3f800000 c19789b8 40d47410 3f9a44b8 -> c19789b8", + "3dcccccd 3f000000 bf800000 4137c786 c142f580 3fc734c0 -> 40a590a2", + "3dcccccd 3f000000 3f000000 417df931 c1137cf2 3ee20e69 -> 00000000", + "3dcccccd 3f000000 bf000000 415c2137 419fa182 4058ca5d -> 4181e42b", + "3dcccccd bf000000 00000000 4179aaff c12c4ff5 40817a64 -> c12c4ff5", + "3dcccccd bf000000 3f800000 c1951fbc 4193cd2c bb5cdb93 -> c072d494", + "3dcccccd bf000000 bf800000 c00dfc86 40a3dc4d bf79a9d6 -> c00dfc86", + "3dcccccd bf000000 3f000000 4195a648 4184c089 be7e3980 -> 418b82d5", + "3dcccccd bf000000 bf000000 c01523d2 c06bbe60 40354e65 -> c01523d2", + "415ce74a bf5a2a25 40bdfbaf 4146d42c c0deee76 402e7aea -> c0deee76", + "c099dca9 40bece6d c043593f c1847eca 417684cd 403b5e1b -> 417684cd", + "c050f206 c118007b 40c54340 c18a91e5 4087463c bef812c4 -> c10be665", + "4142c095 4103b07b 4107a2dc 40ed76cd 40c3fbb8 3f2cb624 -> 40c3fbb8", + "c18a994d c027ba53 40e1f287 40e63c15 c14f5013 4095eb02 -> 40e63c15", + "40bd87c0 c118ef81 c0af0f9a 4060e08f c17e510e bec31bcb -> c17e510e", + "40a566d2 3f9acdcf 3fd6ac01 c09a1318 4164fbb0 4096bcd0 -> 4164fbb0", + "c136550f c0962a4f c0d5a3d3 4112fd15 bfd56594 40bc175f -> bfd56594", + "c1567049 40a9e57c 40d5b269 c10226e9 40f593a9 405dea97 -> c10226e9", + "4105410b c0818bbc bdef573e c17448cb c1988b80 40b3de73 -> c1988b80", + "c16b11e5 411d10d6 c037579f c018b197 40f7c93d bf28557c -> 40f7c93d", + "40c11989 bf223e3f c0b341ea 41343b66 4039faca 3fad4521 -> 41343b66", + "413dcc17 4091f6f5 3fb12089 417aba9b 4046ec41 40d7f898 -> 417aba9b", + "4180a0b7 c00fcb6d 4109924a c136b61d c0ffbe83 40265302 -> c0ffbe83", + "c168f2b5 c1001626 c10becdf c160dbb0 c1856761 402f3004 -> c1856761", + "c0a93203 40216028 41076e84 40dfb31a c187cd00 3f69a442 -> 40dfb31a", + "c0d63cc2 c0cd6a2f 411bcada c17104a5 418b5379 40386458 -> c17104a5", + "414e8a6c 4087ff0d 40f2b1ad 3f420fc5 408f584a 402ef932 -> 408f584a", + "bf963863 c0c9129e bfb00f64 c1388095 413c980b 40daabff -> 413c980b", + "c135ece8 c0ce4cc7 3f3da0e8 c18dafdf 3f90cf1a 409c2048 -> c18dafdf", + "4106a882 4067a36a 40984645 c0f2429c bf083dd4 40867832 -> bf083dd4", + "418746dc c01671f4 4067186d c141296b c19a8fa1 40d7252c -> c19a8fa1", + "418ba4d6 4005a044 3e8c0d23 419ff636 3f711a93 40d480dc -> 419ff636", + "3f8b60b3 4018c2d6 c0b2f94e be81b047 41377f24 40a3a87f -> 3fd3a212", + "c080bdd1 c0659a7a 3f4ffdb9 c179f90c c198560e 3fa11362 -> c179f90c", + "c19a1e4d c04af6f4 c104ce49 404a0d78 4183e687 40873fa6 -> 4183e687", + "c1548074 40a10f9a 3ff55fa4 c0386423 c12fb47f 40bbbcdb -> c12fb47f", + "40484240 40575bdb c0007e26 c19cb832 bf9d5401 40945d7a -> c19644e3", + "c15140b4 c1003d6f bfd52f65 40efe3ba c19974f1 40eda9b2 -> 40efe3ba", + "416e809c c0b2f267 c11b6459 c1834807 4112923d 3ffc05e8 -> c1834807", + "4021f527 c01dfcdd c02bab3d bfe9ed82 3f4e10e3 40482c61 -> bfe9ed82", + "4185087b 40e049e2 be742c1e 3ff1aceb 403de022 be80f415 -> 3ff1aceb", + "41845faf c0485fea c0fff12d bfe42439 418c4de6 3f1c0277 -> bfe42439", + "c16bea10 c0e60f98 c10ffba5 40b83803 c0a423f4 40d98e35 -> c0a423f4", + "c189c154 405886ad 40dd19b5 c181fc21 419d718a 40b8b0f9 -> c181fc21", + "c0af8ac5 4033ed22 407d227f c150e656 c1888aed bf3376c0 -> c150e656", + "40abf342 c114e9c0 c11f2012 40d337af c0610b20 40217b69 -> 40d337af", + "4084a316 bfdcd9a7 c0f52971 40e14f1d c15f5ed4 40cdc8c0 -> 40e14f1d", + "c135b3be c0a43670 4085b8eb 41269b2d c07cb323 409aa35f -> 41269b2d", + "c0d79a67 3faf3004 40a52e69 40db287b 417ad904 40b60028 -> 40db287b", + "c06c60d8 4106a623 c0a67095 c18f5f6e c0aa34c9 40951617 -> c0d6dcfc", + "be5ee8b4 c10b4735 40626c24 c11b3a77 bff1137f 40536256 -> c0890403", + "419ad01b c0564ae0 4074b1f1 3ef1f7ed c186eedb 40b648bd -> c186eedb", + "c0b9dd3b 4114e214 40b4b5e3 4101a30f 4147bb69 3ffcfc9f -> 4147bb69", + "41847506 40eb7b19 4112e337 c1962d73 c0feb2ff 3ff29653 -> c0feb2ff", + "c18174e5 c04f07d5 c0c03475 419a14bf 407722a7 40b4c466 -> 407722a7", + "c15ab6b1 40d2ed10 c1050c3e c1951883 c0b82331 4037509c -> c0b82331", + "411291b3 c11a7f05 c0c9e83f 40264654 41047f96 3d986513 -> 41047f96", + "c1734e7f 40ad771e 403566c8 4192a4e6 c11406e2 40c94211 -> c11406e2", + "4159a91d 4117ac85 4016bd3d 418cc01f 3f0cc59d 401e4365 -> 418cc01f", + "410b86b5 40d22433 c0d4554c bdb538a7 bf2324fa bf5ed864 -> bdb538a7", + "c0b512d1 40de972e 40fb8a8c 3fd26a88 c0e7d7c7 407ec1fd -> 3fd26a88", + "c07e2499 3feeba0a 40961faf 400342c7 40b33f34 408bf35a -> 400342c7", + "41840397 3eeec7af c10107be bf851e80 c155dfaa 403d1586 -> bf851e80", + "41891868 bfbe9869 40b0d8cb 4059a10f 410c354a 40f3b14c -> 410c354a", + "c0dca892 404c5740 c11c1444 414dd66b c0dd4b4c 40f741f9 -> c0230518", + "410563ad 40d93557 bf1090ff c00f88e7 c183ba69 40c533c6 -> c00f88e7", + "3fcd165c 40339a4a 40fa8f8f c13bec1e 41993a36 40fc998b -> c13bec1e", + "3fe07a8c 4100b931 4043a900 418ed536 4192f001 bf782e09 -> 4192f001", + "c07b67a4 bfb6b66d bfab5c81 4192d364 40afcc0b 40027e59 -> 4192d364", + "418c9d6e 4116cd39 40d12972 c0a8a746 c1332994 4067a6cc -> c0a8a746", + "4192c4fa 400730b5 41073e92 c112d02e bfd775dd beb241fc -> bfd775dd", + "412ddaf1 c1093eb5 40f2441a c11c8658 c0acf853 40b64c4f -> c0acf853", + "416a5aab 4109785c bf3482c6 c100bf1e c13f7735 3f84a532 -> c100bf1e", + "408f78d9 c0bc778d c1077edd bfb38cc0 c183a60a 40552c67 -> bfb38cc0", + "c12f6d6a 3f305654 c112a917 4169f139 c169ad23 40ca9287 -> c169ad23", + "41247f6a c09ca135 c029f8dc 41919f2b 40525a53 3f523272 -> 40525a53", + "c132c165 c11b0264 bf7aa6fa c1487a86 c0690e46 40db5a79 -> c1487a86", + "c1313f08 4068010f c0022bbf c0484b16 40fd1883 bf2feb0d -> 40fd1883", + "c0816fee 40a24fc5 4115e793 c157d84a 4134dae6 40908d37 -> c157d84a", + "4031b767 40c0a214 c101ffcf c0422dfc 41518ee2 402de2f3 -> 3f2a1628", + "409555d2 40bf13cb 4089bf44 3f21d4cc 40b660cd 40b27fff -> 4093250f", + "3e98617e c01500bc 3f0d2189 414dac4b c131038b 40815ef1 -> c10f4ccd", + "c148ffb4 c049211d 3fe56737 c0fbb72e c00ac065 408ff2b8 -> c0fbb72e", + "3ea90bf7 c09d4549 c0f6d280 409abf10 c10f7d45 bf5de87d -> 409abf10", + "c13e459a c00d7be2 4100b72b 41762923 c0cc8635 4015ca36 -> 41762923", + "c13ff2ce c0f8a7c4 3e8123da 402c8bf2 417383a0 bf6a8b1b -> 402c8bf2", + "417db413 40a22557 c1032331 c018d6b2 40d80565 4047a037 -> c018d6b2", + "41812e45 c0b24b56 c11100eb c0a33b12 c124ba36 bf71a3e0 -> c0a33b12", + "4184d39d 40b7ed2c c0c6a76e 40b2a11a c18da5df bf0a10c5 -> 40b2a11a", + "400d0431 40d80a54 402cad09 415635eb c111350d 40ff9c26 -> c111350d", + "4190250d 3e00524c 40a17a8c c131d312 c178c7e9 407b7b45 -> c178c7e9", + "c0f465ca bf03e561 40a757d2 4194da1f c103d642 3f34b3a9 -> 4194da1f", + "3fbffc50 bf342c1f 40b6ed81 c15ebb36 c1899459 40f3131f -> c170b9f8", + "c08193b8 4090f893 c11dc9c0 bd1d9ea3 c1809bab 408828b7 -> c1199586", + "408af58d bf3424a9 c0a5e771 3eb5ed49 c1681bbf 40c19f16 -> 3eb5ed49", + "c18641db c00acad9 40b30557 40f4239e 41931aa0 40b4ffdd -> 40f4239e", + "410e2543 40f79f0b 411e4428 c18c1534 40e3bd08 40bcc337 -> c08cf970", + "c123e9b0 3e2df59b bdf13ccf 40d0372c c181783f 4073f0a6 -> c181783f", + "418150ea c0c33ba2 c105686a c1182a0f c126a1bf 3f04a1f5 -> c1182a0f", + "419a2a2e bfa162b6 3fc95fdb c182276a c055b932 bf2ff13f -> c055b932", + "3f658c01 40cc6037 410d3a41 40e996e1 412f6a03 4001c250 -> 40e996e1", + "c19a60b6 40f7c18a 401c63a3 406b0a8f c09ecdf8 40cbed92 -> c09ecdf8", + "418db0a9 c0f49b8a 40b91a4d 3f88709f c0945fc0 bdb2188b -> c0945fc0", + "41525ba1 c0c29af6 c105f98e c108b049 4123f863 4090ad4b -> c108b049", + "c0bf6ae8 40b10ad0 c101c95e 417ba37c 410547c5 40e26ad1 -> 4117c18c", + "4123970b c1090833 40c6cde2 416c95dd 410dd56a 3f50e82b -> 410dd56a", + "416bf9e9 bf33fafb 40137993 c0bec89c 3fd69cb7 4045e408 -> 3fd69cb7", + "c14ee1a4 3f9fe7dc c1079917 40fa4aab 401b2bad 40bf470e -> 401b2bad", + "415e27b4 40670be7 3fde273f c184e386 c181e496 3f3542b1 -> c184e386", + "c199a866 409e16d1 bfd02bfe c0c13912 40a5d329 40e1d728 -> 40a5d329", + "c18863a3 40a4c6cb 409f405e 40ce7e2c 412a06ae 40c1a7bd -> 412a06ae", + "415b264c 40d702ab c116027d 4119faa4 c10bf5b4 3fbcf3b9 -> 4119faa4", + "407b89fa bf13e211 40f0a0ef 418927b5 3f1e4ade 3f88bf3f -> 40fe34ca", + "41071786 40fe2a2a c0e7b932 c04814d0 4099bebe 4065e09f -> c04814d0", + "c19c58c7 40b69679 c11d196c 4186f3fe c16c2e5e 4081e2a6 -> c16c2e5e", + "c18e3d8c bf01a444 c0cac87f 40190072 411449c5 3e161d45 -> 411449c5", + "c17ef524 c10667a0 c0b801ba 414b1d12 417af3d8 40c1b0ca -> 414b1d12", + "414e7009 40e029a3 3f1d4524 419d67e0 418059fb 401c90e6 -> 419d67e0", + "c120977f c01fb9b5 40b2ff78 40e7474c 40ffa6f0 40cc8ce1 -> 40e7474c", + "c0eb9a67 c102eb06 c08c96b8 41938335 c1966c32 40f1b7cd -> 41261a5f", + "c115646c 40fdfe89 c1096cea 41168e2f 41493aa3 3fa59a37 -> 41493aa3", + "40b85527 40c44934 c0508e63 c155cf3b c0e29fdb 40ded483 -> c151d011", + "411845b9 c08ea2da 3f28605b 4199c6d4 3ed40cfe 3d143f9d -> 3ed40cfe", + "c177d684 c10fbcf0 3f5a387c c11ce993 4196393d 409b124f -> c11ce993", + "40a93e0a c05ed4d5 40fa1679 413020d6 416935c5 408e2537 -> 415c71c8", + "4107dccb 4099907c beb4231b 3ff67c3d 3ea72b2d be0d139c -> 3ff67c3d", + "3fb875ee 3e5d7669 c0f7f371 40641a46 418b0f24 40b80f09 -> 40641a46", + "40a796dd 40949df0 403dceea be581918 c15e3485 4080a636 -> be581918", + "40224114 40b8cd21 c0a38383 40881911 410162d4 404920d8 -> 40ac9c7b", + "c09276d4 c09faeed c09fab49 403b0026 c09c5be6 40a93725 -> c09c5be6", + "c0ef6521 c097e010 c0ed4184 c13ee21e 409041cf 40acc872 -> 409041cf", + "c0633286 410fccbb c08e3c01 c1086836 c0857c80 bf406169 -> c08ec4b7", + "410df842 40cde6bb 40d50c47 3d02765f c0cc3d35 40ceb475 -> c0cc3d35", + "bde9b692 c0b09a2c c080d9d8 c184faa6 c194d040 bf18741b -> c194d040", + "c0d58d2c c103a853 c097e311 41359922 40ef8941 3ef9bf6b -> 4119fc26", + "c06b6ff5 c027f9bd c11f3e97 c1314928 40324152 bf2c849f -> c1115fec", + "c0d32bd6 40b78ea7 c0f8aa23 4103d691 be972ed8 405612fa -> 3ee3e550", + "c157ee99 3fc312b1 407a4ffa 417f8e61 bff3c39c 3fd65766 -> 417f8e61", + "418ab270 40c52a73 40acb59c c15a4957 c174180e bf58a29d -> c15a4957", + "40acd49d 410b6d47 c0ffdf99 c136b60d 40a418e9 3f0f19f1 -> c102373f", + "40c9886a 411fd283 c1080d29 3d975d00 418cb97b 4055288d -> 40647e32", + "c0ed1121 c1060120 411918ca 40b7e368 c195e218 40830806 -> 408dac1e", + "3f277e5b 3f9706b3 3d650a24 c1417896 4003bdb9 be99416b -> c0af2fd2", + "c118a228 4006faae 402c6c76 c0bb43ca 3f1c71c3 40a8e8e9 -> c0bb43ca", + "411bac46 c07a57d4 3f4e0d17 c19e1bce 4148046b bf4a0983 -> 4148046b", + "c184c51b c00ef5ee c1143b99 40491766 c18bcdc1 40f43990 -> c18bcdc1", + "40a618e4 41037885 c0cf1048 4105a533 408c4950 3ff5e736 -> 40f11f18", + "c114b7c0 c0e3a600 c02f2b59 40c826c3 3f38b8fa 4080f4b9 -> 40c826c3", + "c18ade63 410531d6 c0f39436 c136120f 4194e498 40a58546 -> 4194e498", + "41663435 40b0c016 411e4e80 c164d438 c11beb86 40c5170a -> c11beb86", + "c122c020 c0acd60f c0d9641f bfe168e7 3f87d544 3f807fce -> 3f87d544", + "4197e277 c0c3b6e4 c04be4a5 c0bccee1 c059240d 406c0212 -> c059240d", + "4043d0ea c11a463f c0ab801f 4094c6a0 c08a086d 40cea7cc -> c08a086d", + "4013c26e c0bd2df4 402c185f c120c347 413b14ff 40de9dd6 -> 412bb427", + "bf7f93c5 c1118e87 c111a428 c19c5e88 c18d35ee 3fcfe766 -> c19c5e88", + "40b7760b 406e7d4d c0896669 410d9d77 3ee3dc1b bdde89ea -> 410d9d77", + "c0fb95e8 c0fc5880 bfaa64a8 3db030e4 41524de9 3f31522e -> 3e088dc8", + "c182d905 c0ea40cd 4034fa8a 40aa2e8e c15df635 406a2e26 -> 40aa2e8e", + "412056a5 c05ba421 c0a2194d 3f61c1d5 3f2d1875 402d077c -> 3f61c1d5", + "c173e016 c0e5031e c108ca9c 40c10e2a bfac77fe 40cdc163 -> bfac77fe", + "416b148f c063f10e 3fc39303 c19d5185 c15480e2 406868dc -> c15480e2", + "c13e8115 404a3273 4115c918 411b01fe c03bbf41 406cfb60 -> 411b01fe", + "405e9b07 c04400b1 c0e1642b c14a0bc7 4090afff 40589692 -> c14a0bc7", + "3e8b5f1a 402e575f 3fea5e28 c120302a 3ff6ff51 401545d1 -> 3ff6ff51", + "4190f374 c044b246 c11ef275 c17d144d 4145aa3c 407d4012 -> c17d144d", + "bf45e0ca 41000bda 40df5b00 3f2160ba c08056ba 408658a1 -> c08056ba", + "c044a836 3f3d66b6 c005946a c15a9cf6 4185410f 40058a20 -> 4185410f", + "4171ff6c 4105c5ff 3f324667 419ea302 c12fda40 3fe3641b -> 419ea302", + "c11261b7 3f87f005 c01db914 4130f6ee 4154205d 40c897d5 -> 4154205d", + "c06c2cf1 c0b44010 c101e93b 4080f2ec c184a678 40ae5922 -> 4080f2ec", + "c031f8fe 40928c65 bf875676 41004475 c19f501a 40c13fe3 -> c19f501a", + "c10da61b 410bd6ae 40847054 c1870efe c06be6f7 3fcaa826 -> c06be6f7", + "c19dfa38 c0647bb0 c03049e2 c0bcdcc7 bf1fe00d 403a3065 -> c0bcdcc7", + "4111cf57 410dfa4d 3ff87144 c1916fd2 4188f5c0 400dc6be -> c1916fd2", + "c011c258 c08ee2c9 40cf379d 4160cf0d c128ce28 40234756 -> 41121a22", + "c0a36c31 c113cc42 40cecc6a 40e98092 416d2bdf bc610461 -> 41146e9b", + "c155634f c09d6b2a c1123446 c0fe0571 3f6689ec 40b7d538 -> 3f6689ec", + "c14a2886 c04f3222 40dbee69 408cedb6 419e245d 4091a2ac -> 408cedb6", + "c13be96e 409adb08 40cab89c 3f62c292 c161f1a6 befe62b7 -> 3f62c292", + "bf9e31ef c0ceb5b5 40b5a375 3f16f904 c1734fb7 403f33d5 -> c0c6b6c2", + "c0dd8283 40af9e88 40bab3b6 bfb11558 c1122bb5 3eb8b583 -> bfb11558", + "c19d038e c0a40dce c06593f2 416f1844 c071d771 404534ec -> 416f1844", + "418e30c6 c059cc66 c00fd5c6 419dd084 419cd533 40b1cf1c -> 419cd533", + "3f919f7e be5a58e0 3fa6642c 4196311b 40c6ce13 409e8a20 -> 40f1e804", + "c193c8f4 c108550f c0befa3d c0d95244 c102314b 40f5c967 -> c0d95244", + "c0e2c70a 411348f1 c0ecb8cc c192f337 4098cc31 3ff1b23e -> 408aef80", + "410a30be 40a8087f c0917a47 c0c9fb9e c12db55b 3fa4894d -> c0c9fb9e", + "bf4578d8 c075faf4 40d85fe1 c11bc6a3 404a288a 4088d4a2 -> c0c005aa", + "401268be c048f06d c0b65674 41582e58 41679b14 402250fe -> 41582e58", + "40a71817 410fae59 4119ad21 4190dd8a 3e2a1b60 409811c6 -> 4190dd8a", + "c0947bb9 c0f47ee7 c117d530 4104f5d0 41423bb3 40c93037 -> 4104f5d0", + "4191bbc6 41182f6f bfed3efe 40b13aca c162fbc5 bd63efe8 -> 40b13aca", + "3f1ee5ef c0fa2307 c1085e11 415dbc04 40feb0d4 40849481 -> 415dbc04", + "40e6b48a bf98c5fb 3fcf1592 4159e269 41571911 40e1fbd1 -> 41571911", + "4114eca5 becfad76 bef059be bf9fbf5d 415651d2 40aaed1c -> bf9fbf5d", + "c143efb7 bfe490a8 c119ad51 419d9e45 c0aec534 3fe92d20 -> c0aec534", + "4148aa95 c108198c 4019f50b 40172dd8 c19fdc60 40a97ccd -> c19fdc60", + "40d16c2b c0875bc7 410d6366 409d95e8 4188028f bf0a2cc2 -> 416e1f33", + "40d0476a 40c28de7 c008dda7 c04df937 419e3d0c 3e997c5f -> c04df937", + "c045016d 409f04e0 bfbae28c 418119ee c1709de7 403c3795 -> c1709de7", + "3f742c1f 40727080 c0c71bee 41765bb2 41442009 40afdf92 -> 4168229a", + "410286c9 40946682 c06dd78c 4168d47c c173b912 40059c79 -> 4168d47c", + "41126155 411ad4be c0962a4f 3f5ec10f 417fb60d 409996b6 -> 3fb679c1", + "c12b2b19 c11f2db9 3fbab133 40d10311 41871d41 40d09fa2 -> 40d10311", + "c168429f c102dc8b c0e66236 4146d390 be4c21f7 3ec40194 -> 4146d390", + "c1811b3e 4071728e bff3ac1a 40d0cce9 411e92ac 40c9970e -> 411e92ac", + "4142d0fc c07128b6 410cad1c c19df0bb 4105ab1f 4060d14b -> 4105ab1f", + "3f4b315f 40d96783 c0013900 c191e652 410b4244 3e510c9b -> 3dd6e100", + "bd8f5c4d 404b5a7e c0e63fc7 bf39b73b 4155b333 40bd24bf -> 406bb883", + "4174d99e 40503f28 410d4a8d 419a93ab 40e95621 bf453789 -> 40e95621", + "c1165efe 40a98c13 3fa29196 c19a491c c17052af 402d6b26 -> c17052af", + "400bf031 c089d71e 40e1b2ae c09d2980 c0ec150d 40476748 -> c0ca4675", + "c11291d3 407effcf 40ae14d3 41526ca8 3eed57dd 4050c607 -> 41526ca8", + "419196be c0895299 3f33eb02 c105526b c18b8c98 40cfad96 -> c18b8c98", + "c0f03bf4 c07128df c06d0b22 418c7956 40e55691 3da09d1f -> 418c7956", + "c1994814 411ebd0d 4100869b c12990a8 41459645 40fa6b30 -> 41459645", + "41227675 c0a0a3dd 408ad323 c17bc87a 40f7534a 406d45fb -> 40f7534a", + "411e0ac9 c04f1713 40373de4 412d1a70 c184e1a1 bc30724a -> c184e1a1", + "414841f5 bfa89d68 c0d23397 409e84b9 4078fc64 40362319 -> 409e84b9", + "4117adf3 bffc7a44 411db5a8 41747bc2 4113a0b1 40d29cb8 -> 4116b6a8", + "3f81fdbc c0861b27 c0845d4a c18a693d c08456f9 400ecd7a -> c08456f9", + "4111f4f6 409d3e56 bff204db c17b28cb 41085940 40230f25 -> c17b28cb", + "4175125d c005143f c00cc920 412d93b0 c18898e1 bf535254 -> 412d93b0", + "c0fa0e5c 40cfa64b 3fa5c1c0 c161f2d9 c18c866e 40ee5350 -> c18c866e", + "c10d7db8 40ee511d 40afdf59 c0adc750 c12af5ac 40a3e86f -> c12af5ac", + "41153f63 bf399fbd 411af0dd 411f04f1 c1457227 40f26b7d -> c1394297", + "3fa498e3 c0d582a8 c0c82881 c0f0d998 40961042 3f5c9791 -> 40961042", + "c184d8a9 c0f8d69e c0c4e125 c0d87137 c18cb924 bf5c74ee -> c0d87137", + "4191e07d 4109833d 3fb884f7 c195bf0c c00c42ba be54779c -> c195bf0c", + "c14d8356 c07133c8 3fadf337 c0f22fbd 41911409 402e6ab8 -> c0f22fbd", + "4147722c c08c9d75 4110335c 3ff8bc50 40a24e85 3f994709 -> 40a24e85", + "4143fd46 40c00997 4116974c c16648fe c0a907e6 40a9779e -> c0a907e6", + "3faa8adb 40370069 c0922deb 40c780ed 3f7c84ec 407c6e25 -> 40a4fa0a", + "c1359361 c0563b6f 40f5411e c0b89f7f c16bd89e 40c09983 -> c0b89f7f", + "c03b5c13 3fc27ec1 c03efd93 c170ab75 40bda1cb 40532bcb -> 40b52e12", + "4188a77c 40e4061a 40fece26 c13f85f3 c0625ce9 40c95534 -> c0625ce9", + "bde8da74 407f173e 40fe5c46 c1267e3c 4195afe9 40dae3f8 -> c1267e3c", + "c0eaea20 c1035137 c0d87493 c15754c0 419e34b9 3fb9d0cc -> 40cfb76c", + "c19a610a 40af40da 410be00a 410616eb 40a5a0d0 40a4d361 -> 410616eb", + "c184363f c02ae4e3 c11968e4 4098af65 c0f8695f 40cdc758 -> c0f8695f", + "c12d0e20 3fb259f4 3f84b37b c1105a4a 40c5a2cf bf7da651 -> 40c5a2cf", + "41753e9c c0fee555 40744663 40256a98 c17c3a09 3f97c27b -> c17c3a09", + "c07fb5bc 40ef87b5 c116a068 41858d16 3fe13b74 4015c213 -> 40d18ac2", + "414cc064 4077d6d7 c0011b32 c19c8f7a 418eb212 bf0aef57 -> c19c8f7a", + "40d7552d c10fc78d 407e8398 c17e32e1 c19346cc 3feee3ae -> c19346cc", + "40da9d8b 40bb8c0a c1178888 c0412e4c c100d76b 3fe8ff50 -> c0412e4c", + "40ec0867 4050d51f 4058fb24 3f521dfc 3fabf4ff 40efa1f2 -> 3fabf4ff", + "c08ed5d8 411a9b12 3fd93edb c087a436 413a704a bee6eae1 -> 413a704a", + "c13c6aef 40bdfc8c 3fcacfd5 41217e6d 419b82b0 401250ea -> 419b82b0", + "c039a797 c0c93ed7 40dcfeb3 c19e90b5 41096d94 40d0a045 -> c1486a02", + "40b5c8de c05f45d5 40b837ff c1945c65 c1911989 40bf74a9 -> c1912067", + "c13eff0e bfee7477 c0902c4d 4081d109 bfd39841 3f54869c -> bfd39841", + "bddb0053 40f853c3 c10ba7c4 c0051a27 40d2c85b 407b6e53 -> 40038b1d", + "4114d007 408572da c10e8005 c1509dcd 40777b0a beb6a4ef -> c1509dcd", + "414dfc08 410e2d36 c0f27786 c125dddc c002d377 408274e7 -> c125dddc", + "41972a73 40ea7e73 3f4607b2 4134df8a c0f5483a 3ffd11b2 -> 4134df8a", + "c0a2f951 be26d2b8 40011a00 403aea14 c19609c4 40a3d281 -> 403aea14", + "412130ae 410f9b4e c0dce5f8 413a59a5 c181eb89 40a56c38 -> 413a59a5", + "4193570b 4108016b 4014ff14 c129a3c3 c117b669 3ee06b36 -> c129a3c3", + "40f4de18 4119235d bfb4a9a2 3ed567d5 c04c1b71 40a6648a -> be5a65b6", + "c13a0880 bff4e084 c107b779 c192dd0a 40f534dd 40bc0e34 -> 40f534dd", + "c10e0bed c10ef7d8 40e18dba 4138c77a c15a16c5 3ed421ed -> 413753d7", + "c15054be c0bbaf9f 40b67e52 bdf278a5 c192ba03 3dcf7f7d -> bdf278a5", + "4040436d c0876043 3fb44197 4141239f bfb8032e 402759dd -> bfb8032e", + "40a0f4e4 400ea9f3 c02372eb 41969415 3f2899f2 402ef052 -> 41969415", + "41053e3f c0cf6617 c0bc634b c19372b4 413ba306 40365032 -> 413ba306", + "c0caa315 40179302 410f6d67 c18b6791 c15b10b9 40a95b7b -> c18b6791", + "c12f5cf9 c05c5ab1 c0fbe939 41869128 c0f84b97 3cc49250 -> c0f84b97", + "4188b08b c106cff0 c0a6ec93 c12c982e 414d3de0 409afc7c -> 414d3de0", + "4116f443 3f90a382 4109f218 c0025c2c 41801f58 3eca4f07 -> 41801f58", + "bfc03183 40aa9516 3e7882b0 416bec1d 410acd36 407a599b -> 410acd36", + "c18b5705 c11cfbcb bf4c8e05 3f803866 bfbc6447 40da1640 -> 3f803866", + "c1535940 411b182f c0b08c39 3f8ee261 c1249b10 3ecd9290 -> c1249b10", + "414e953d 40c35b8d 401acac9 c032e519 c0afb2f1 4096a916 -> c032e519", + "c164e12f 40abcce8 c09f77e6 417d9f36 3f9f034c 402a0aed -> 3f9f034c", + "414dbf66 c051e31e 4096ce9a 416b0331 c0fd86e8 bf644099 -> c0fd86e8", + "c10b1e59 bfd9bdfb bf635ef2 c16bc29e 40866f75 40a99d07 -> c16bc29e", + "41523e7e 4082f109 c101e0c6 c027e406 c193623d 407d4e86 -> c027e406", + "4194a53e c0fa6ba2 3f78c734 c1955b90 c1827e0c 401749b2 -> c1827e0c", + "c0cccda5 be720546 40799911 c1802fc5 c0c21687 40f9277d -> c1802fc5", + "4170a897 c0a73cc6 c05dd862 c17791f6 c1191072 4084c2e9 -> c1191072", + "414038be 40d88f3d 40f4e0d7 419e2e0b 4162a68d 40c91044 -> 4162a68d", + "3e4a496f 3f80fcd0 c11ce05d 40d6792e c190d189 bf72b35d -> 409affa7", + "c0117b06 40c1877f c094c8ab 3fd7c6cb c12fee32 4063088f -> c102db3e", + "41081f7d c0b0f4b4 c0403d6d 4039b7a5 c0af7c07 bf20f619 -> c0af7c07", + "41932fb1 41197fb5 4106b5cc c13b1555 c1298fa8 3fa7d3af -> c13b1555", + "c0df446f 40f3a266 c0e76972 40bb7ccb bfd73f4e 40dc2571 -> bfc6b2f8", + "4114edad 403e6830 40de9830 c16037f6 413915cf 4057930d -> 413915cf", + "41746521 c041ecea 3e04a5e5 3f9980bb bf8a981f 408583dd -> bf8a981f", + "3f864eee bf82e6e0 411b427e 4155696e 418490c8 bd0f29cd -> 415f66f2", + "4170281a 4004cc4e c0efac6b 419f6e59 c130a34e 40bd6494 -> 419f6e59", + "c02c37b7 41040760 40a14d7d 405476b2 3f8ea3df bf1ea598 -> 3f8ea3df", + "41150f4a 40704c38 40ef16fe 417c9476 4062bd49 be8e50ca -> 4062bd49", + "c16a4c23 beb6fbbb 406c7e72 c19278a7 40ec596b 4003177c -> c19278a7", + "3fd5746e 40c547ca 3f465848 40275054 c01c962a 3fd47ccc -> bfcddf48", + "40f60966 4086bedc c0a77b31 413b0b65 411d95fb 40e6ab9b -> 413b0b65", + "3fadbdd7 c0b3f251 c098d6f1 c12f5089 c1433e5b 400084fb -> c1433e5b", + "3e83e16b c0e5924e 4044543b c18b719b c19f0dec 3f390fdc -> c199ac7b", + "c124160e c0758696 40fdda7f c14e9bd3 c0a1609d 40a89a3e -> c14e9bd3", + "c0e5b024 c112937b 411b7bbf 40fadfc4 418f5194 40841784 -> 410e5f1c", + "40da43e5 40ecbb03 c1196ebe bff1e059 bf208340 40a2e7db -> bfec62e6", + "c19049c5 401eda57 4009dbf5 c19851b7 417cc962 40c4d816 -> 417cc962", + "417d5d15 41091684 3f0e2f4c 417cc2c4 40e21187 40505a7a -> 417cc2c4", + "be517169 c0e6d38b c11fe431 c0fe031f c0faf7d0 be6a9d3b -> c0fe031f", + "4161c768 40c304a9 c00e879c 4175186b 411177d0 40e42f72 -> 4175186b", + "40fee703 c09c3af8 c117dbc9 408076ad 41926f20 40698467 -> 408076ad", + "c187629f c0e264e6 411cba63 4078a964 c181b0ec 40247861 -> 4078a964", + "c011e6e6 bff1b8ea 4095abb3 4184b4cb 413d1833 40b796ff -> 4184b4cb", + "410e8c62 40604022 3f2840be 3fc7a3f2 bf49299f 3fd0a7d3 -> 3fc7a3f2", + "c17ec98a c0fc84e8 41148482 4030a6a7 c06fb5db 40d0ba84 -> 4030a6a7", + "c14a07ad 40a86d03 c0778cb9 c012798a c19062c8 40e23b9d -> c19062c8", + "c0a74cf3 c02fc5cc 40fa6d8f 413459b8 3f8fe9a3 405a5182 -> 413459b8", + "c103b758 406125e3 c09c6dc9 412abaef 41860cd9 40b8e4fb -> 41860cd9", + "c19c3a2c bf9d045c 40018d01 c195e0f5 c1939dc0 bee734c4 -> c195e0f5", + "c11f89f2 c1025e2d 3f8b421c 4087469a 4173c8a4 3f6f8fc5 -> 4087469a", + "c0a755cb c0d44669 c0bcb820 402bd24b c0e15f94 40995bef -> c0e15f94", + "3eaad2e8 c1126c59 c0839c38 40bb22e3 410a6cd1 40de1bd3 -> 410a6cd1", + "c1929786 40bccb4c c03aabce c0cb0d2b c074233f 409ffe7f -> c074233f", + "413b99f5 c1091e5c c08bd7d4 c1408efb 3f9cc5ef bef8f12c -> 3f9cc5ef", + "c191959f 404bb6c4 c0c21024 c1106d75 4137c49b bd1aee6c -> 4137c49b", + "c0cd2840 40ddbb09 bf873f6c 4191fdb8 41151711 404f9bff -> 41151711", + "c163280f 3e7f68ad c08465c8 4189009a 4136acb9 40fbea1b -> 4136acb9", + "c1657cca bdd51e34 c0d3cdeb 40b40967 c0717525 3d8fa353 -> c0717525", + "c19f7c3a c115536a 40bc00eb 415bc4d5 c0b4be72 3f5382f2 -> 415bc4d5", + "c19c76e3 40bcf19d 40a6cf70 40e375f5 c13fc96c be93bf6b -> c13fc96c", + "c0a44e2d 40c54fb6 c1043bfd c1055b4a 3f54311d 3ed49e04 -> bf945320", + "3fabca61 405477eb 411ac7d6 402256d5 c1377bb9 3ce52c9a -> 402256d5", + "3fab6cbc c10ffbc0 c03cf704 41927bd4 c1716628 3ffb4144 -> c1716628", + "c16bce92 be6ad973 c0ab4972 4191c1c7 c121b0c8 40031587 -> c121b0c8", + "416181e2 40f32f7c c0b7163e 4138b780 40f06fcb 3f6913fe -> 4138b780", + "412e4b8a 4021d648 4105355c 417e30ca 418ed26e 40f01af1 -> 418ed26e", + "c17d0919 c0def913 be29ec02 4132c73f c0c89f0b 40166d39 -> 4132c73f", + "c1569d03 40a4cec5 c0ed3d9f 41464e13 4103b6af 3ffdff48 -> 4103b6af", + "c1985a9a bf289e45 4092bd9c 412a7e98 c0c4b08e 407a10a6 -> 412a7e98", + "c129f513 40c5dc95 c0f9c998 bf655f50 3f31f691 bf2e77e4 -> 3f31f691", + "414b3739 c0d35672 c0f81bd6 c189abe0 c1043767 3e4db6fc -> c189abe0", + "414c59f1 c03a0bf4 c0d9d444 c08175be 4057a902 40992e0b -> c08175be", + "40503f29 c080eb54 c107b4d2 c17f191c 4144adcc 40f52d5a -> c17f191c", + "417dac0e c099b7ad 40d9f758 41108cd4 4139d376 40df08b4 -> 4139d376", + "4181eceb c064cac0 410df5cb c1527146 c09d5d0b 3f8c51c9 -> c09d5d0b", + "c176df84 c0fdb426 40391e23 c18f535c c1394a14 40bec6de -> c18f535c", + "40a186d3 410b33a0 c09754c5 41696f38 c12d528d 40833fa0 -> 40f59d39", + "4172a2d7 bd560adf c1098cba bd0972e9 c11238b4 408a3086 -> bd0972e9", + "409ae942 bed169fb 40d148d1 c08a1f9b c145f004 40370e05 -> c1266cf4", + "c1170b17 3ffc5ea1 4119f78f bff04dac 4169556c 405a3c7f -> bff04dac", + "4149f598 c065bef9 c06a5625 c07a356d 4187fb14 40e3308a -> c07a356d", + "408949a2 40a61479 40d15d8b bf7a2adb 41267a5f 4049331e -> bf7a2adb", + "418fe1e5 c11bfad9 3f59bfd9 414a8a2e bf5fa530 408505e1 -> bf5fa530", + "c1298d33 40158bcf 3ed17de7 415bda22 c17b107d 3fc3e91e -> c17b107d", + "c159b015 bfd5981e 40b6f8a6 40ce60e9 4097cd64 40c6140e -> 40ce60e9", + "40b95dc9 c10760ff 40263009 3fcb6e4c 41901400 40dc4f72 -> 41901400", + "418db22d 409d02fd 40ee20ae 40b474b6 c0f2d913 40ba7d0a -> c0f2d913", + "c13145f9 408a98d0 c0220a40 c19d9dfc 40237ef6 3ea49fbc -> 40237ef6", + "c0fa1679 c0901b80 c08bb092 c106de51 c03ea62b 3ee740f7 -> c106de51", + "415c3307 411159a8 4114801b c0f7f8b4 4172ce33 beeddc0f -> 4172ce33", + "4123255b 40a455c3 c105f6ae 40993b4a c18e08e2 40dcbb6e -> 40993b4a", + "c170dc58 3ddf2258 41083e16 400e13c2 c1828666 3fb3a8db -> 400e13c2", + "4036a320 3fd462fd c1146921 c183ea0f bf24da45 400f8906 -> c183ea0f", + "40a80b77 c06d02dc c0910c3d c11cccab 3f942d46 3f561795 -> c11cccab", + "414c6d13 40ab9777 40bec67d 40f4db36 41277cff 40f3df81 -> 41277cff", + "c0fd9181 c0e42837 40b838f4 c160aba4 3fe8a5bd 4069613d -> c160aba4", + "c0006599 40bbf0b9 40cfdad9 c0efdbd7 c19986be 3ef698b6 -> c0efdbd7", + "c17c37a0 c0cc6983 c06d2ef3 41820084 419bee2c 4094a4f1 -> 41820084", + "406a1762 c06092ce 3f61e5de c16f07f5 bf9d66ad be3c8ace -> bf9d66ad", + "c195f09c c0ffe8c7 c11e785c 3fddd725 bf9e5e53 408a9296 -> bf9e5e53", + "c186b3fd 411e5498 40f4a405 413367cf c0c55f15 409ade35 -> c0c55f15", + "419179bd c061d093 405a5ed2 c16bb5aa c108d927 40b96333 -> c108d927", + "417f352e 40c6f2ef bf90696c c100a669 4184e382 407ab3f7 -> c100a669", + "c0ea7164 40153589 40383923 4136e8d3 c159177b 3fc0c098 -> 4136e8d3", + "419cfe26 c0c3cb1f c0aa2a8e 412a3501 c16e2d5e 404894c5 -> c16e2d5e", + "c0881f3e 40f0f921 c0a192d2 40b7dd8b 414cd062 40339fa0 -> 4145ad4c", + "bf81d323 40511dee bf407ca3 4182fa53 c1012344 401d1e0c -> c1012344", + "c1946870 40dacff1 4077b6a8 c149c131 408f1898 40ba0228 -> 408f1898", + "4114a74d 4020fbe5 c0cfc4f2 418f521e c1709b4e 406aa9d4 -> 418f521e", + "c1076533 407a4e90 40830308 41404b08 c0bfc6f7 40bcf626 -> 41404b08", + "413e258d c0f5d8e3 41146962 410ebb63 40d4b361 40da126d -> 40d4b361", + "414c51e7 c087257c c08daf07 c13cf6d6 c16d7356 3f01cd34 -> c13cf6d6", + "412482ef c1187011 3f7e5518 c18c1a9c c0b3a811 4010fb8d -> c0b3a811", + "40b0dde4 be64d458 3fc30921 bff39d7e 40d48974 bea3f4db -> 40d48974", + "c0a7dfca 4118021e bfbb76fa c164526e bf52756c 3fb7793f -> bf52756c", + "c0e1e30e bf9b57be 40eb4b44 c190a3e7 407e368c 40aac08b -> c190a3e7", + "c192a95f 4115a0e6 3f7587e9 c18a6e49 c178b7ef 406e1917 -> c178b7ef", + "c13a39fa bc57495e c11a305f c13b3b65 c182402b bf6bd320 -> c182402b", + "414d25cd c0cf0dfb c11bf9eb 41935e42 c13da8d0 3f496a33 -> 41935e42", + "c193b2a9 40c442c5 c0f3068c bff55279 bf161905 40859d63 -> bf161905", + "c152bfba 3ff3d1aa bfde3aa7 bfabcfc8 40a1c79b bed4ea03 -> 40a1c79b", + "c0dd3872 402e4b48 411c21af c18665da 3dc893d2 3ee1f219 -> c18665da", + "3fa370be 3e010e90 c0a8d718 3f23fcf6 c18389a6 3fd0d979 -> 3f23fcf6", + "c08786d0 c0fa8179 40aecb2c c14ebe10 418a5dc4 3fd2d276 -> c0981238", + "c19b1905 40ea636d c087ad52 c113fc89 c11752a7 40941cb4 -> c11752a7", + "413f4e49 c05f5b65 4089832e c19cef8f 418ea6b4 40273909 -> 418ea6b4", + "c1104392 c07fa032 40891ea2 c13efab2 c17cda09 40d91c8b -> c13efab2", + "41726cce 40fb90f3 c10e5943 c1387a5b bf618b8e 3f9f3826 -> c1387a5b", + "c1211fcd 410d59f2 c0a1dd88 c09ef3b3 c0c723aa 409ac123 -> c0c723aa", + "408fc3f2 41025265 bf8d2921 c11e56d1 c0cb26d3 4047b764 -> c107ebad", + "c15f724c c1036c44 c08e98d4 3fd38437 410264c8 40683257 -> 3fd38437", + "4199ef9d c0431763 40d1c238 4152d3b2 bd66fe9e 40cc5f1b -> bd66fe9e", + "c17912c2 4091b4e1 c053c53b 409a26bc c03dabc5 4089e328 -> c03dabc5", + "41750fe2 40fd32e0 c1182c27 41840898 4177e6f0 405747be -> 41840898", + "412f8144 c02c7fd6 40dc40b0 40ef777c c132bfe2 40a47518 -> c132bfe2", + "c08742a6 c0e774fa 4116cbaa c0fb2906 c16de644 4098b815 -> c111d990", + "3fb76a57 bff6d7b1 c0d21f58 3fec1905 c121a691 404cba23 -> 3fec1905", + "c12a80c1 c053f640 410d52f9 c0914da9 c00515f1 3fcf780f -> c0914da9", + "4107028b 401a7ce7 40020fe2 c08379d9 c04c6afa bec8b619 -> c08379d9", + "412d28d0 c091a4f6 402cc168 40f2f695 c12717c9 40eeba41 -> c12717c9", + "4182d199 c0eacc34 4001feec 40f79d8c 4152ee0f 40f92d20 -> 4152ee0f", + "c048d64a 4109b359 40ee429e c17ce7b8 c18f3099 40e8bd10 -> c18f3099", + "419d5b9e 40b23784 c05f3c4b bfcbf981 c14f16eb 40f8ff3e -> bfcbf981", + "419c5537 c0e777d8 bfb5faca bf93ff7a bf4c316d 40840d0a -> bf4c316d", + "c1526f99 c1053ba5 4093c715 4009a57a 418817c0 40f530e3 -> 4009a57a", + "bdaaa6ff 4114d2d5 c057c481 c18ae687 40d7da13 40b05921 -> 3efb1940", + "c0feeacd 40bfca24 403a6659 c162b732 c1814ba2 3fdd2181 -> c1814ba2", + "410c6e42 c02e6c83 4114acd6 c13ea33d 410666f4 3f404abb -> 40f0ee4a", + "419f43ce c098f1ff c035ca2c c160cecf 417e00a3 409577dc -> 417e00a3", + "405cbf9d 411067f5 40228916 c10dc854 be54d775 bf115e4a -> bfb5f1fc", + "4080aae5 4016a141 40a64c51 407e528b c125ced7 4049e813 -> c08dddba", + "c17bc68b c11d5829 c0c7a8af 40b59cf7 41872ac9 40bf043d -> 40b59cf7", + "3fa0ec4a be1bc89d be9917d3 c0af555d 40b8b773 40d348aa -> c0af555d", + "c07cd89e 411ab556 c0fc6084 415bb20c c16410e0 40a1f01c -> c0ff5b20", + "415a31ea c10fae1e c0b28d17 419a41b3 c0d0c208 40ca8de8 -> c0d0c208", + "41306742 40cd6da5 4110b239 c179278f be9ec1b8 be949346 -> be9ec1b8", + "c06edc33 40e1c594 404d0030 40aa9eed c129fbbc 3e64f58e -> c129fbbc", + "41700cc7 40af84b3 3f82af9a c129189a 4136ad97 3e848dc2 -> c129189a", + "418f948e 3f9e3336 40a638d3 c064a4bf c183f7ec 40ef8ac2 -> c183f7ec", + "c1947513 411f73d7 40b3944c 416abef5 c128d89c 4060c29d -> c128d89c", + "41902633 c037639b 40572ca5 c1574b8b c18ea6ab 40c935a5 -> c18ea6ab", + "c196ef09 c0df4919 c0a14330 c183b859 419ad475 40a69cc2 -> c183b859", + "402e1ed9 c0796cdf 40daa70b 3fc14cc6 c14d5e24 4019ac5f -> c0eacdc6", + "c0c20cc8 c11a35ed bf6f2051 bf6f272d c1824f86 4013912f -> c0e7a757", + "c0b49368 408c2d56 3fb17a9f 411394f2 c151b92c 3f5fccbd -> c151b92c", + "412ca7e6 c022ba08 411ef0c6 c195c681 4164b65d 40082465 -> 4164b65d", + "c1913cc9 c0fbb3b7 c0fed697 40314f26 419c497a 40feda6e -> 419c497a", + "4038e152 c0959b31 4076ed73 41521058 40888682 3e8a2e97 -> 40a8bee5", + "4167ccf9 c102eb0d 41179728 40f0bd1d c1995c11 3f112dba -> c1995c11", + "c108588a 3ee6b94d bf53cd4e c15c3fa1 40649f4e 401913ea -> 40649f4e", + "419d0a13 40924b51 bf9b5f35 c09637bf bfe1f8da 3ef1aa35 -> c09637bf", + "40fcfa7e 3e654020 40d4f9e6 c166bc7a c16e2352 3f308c7d -> c16e2352", + "411d5102 c00e1b1f c001a72b 40b5bac8 418fad7f bf642a5a -> 418fad7f", + "c0af385c c11fd1de 40b9c442 c1892e1f 3f08951b 409cedb9 -> c14185d6", + "41861258 3f34d602 c068f224 c16e8189 c103e091 3e4f259a -> c16e8189", + "415bf937 c0f303bd 411cb4fe c1751712 c1219f85 40fe2e82 -> c1219f85", + "41086145 4035d735 40529c7a 416efae1 41971f48 3f2578dc -> 41971f48", + "41152a29 40fe3599 c03ff697 417f7427 419f3ca3 400993f3 -> 417f7427", + "3fe06e6a 3fce9d86 c001e631 41841654 bfcaa440 40c67c3b -> 41841654", + "c1967156 406d1252 3f97e938 bfcb06f3 c13d1f2c 3fce4559 -> c13d1f2c", + "c19ea6bf 40a71b9e bfd59ce6 40ffc122 c0140395 40e2317a -> c0140395", + "c104b2f5 c1139767 406a432e 405d3c96 408308e3 bdf87eb0 -> 40602fb4", + "41998a10 410e7d70 bfa82ca3 40ea25f4 40ad887b 407ec676 -> 40ea25f4", + "416cf952 c07d4395 40c8a492 419444b0 41139d58 3f92ff3e -> 41139d58", + "411cf57b 40080cd6 bf9c69b9 3ef881e5 3fccb24d 3c454d2c -> 3ef881e5", + "3fef81ed c0965392 c110c0e4 3d3b6465 41248ab4 bf1a7540 -> 3d3b6465", + "c0c7e2ee 3ff6833d bf8c373a 40875305 416219e5 3ec539c6 -> 416219e5", + "bf9defd8 411a0060 c105d6f0 40734b53 c10f817f 40d60c35 -> c07a0be1", + "4106947c bed5fbdc c1170c48 41833fbe 40f9f0fb bf298b96 -> 41833fbe", + "40cf2239 3fd23f57 bfa45477 c19d7b94 c0807fcf 403acdd7 -> c19d7b94", + "c0cc751c c0cf3c99 4106af64 415f37ae 41805dfd 40064599 -> 415f69b7", + "c0f9ea39 40e21875 bfc333a5 c0d00198 4030a5f5 3fc1a185 -> 4030a5f5", + "40b03d44 41117d3c 408c82ef 40e67400 c150b0df 4016d899 -> c103c71f", + "41365753 c09c0360 3f8af859 c12b2c95 bf3a51d0 3fc8bb6b -> bf3a51d0", + "c063a5c5 bf8cf480 c0412eb1 c1762298 4154c3b8 3f0f1c95 -> 4154c3b8", + "4102ce82 c02408b2 3f69eb86 c0a85b08 bec15f78 40563d19 -> bec15f78", + "c19efd7f c0d8c478 4116a0b8 4133561f c1156ece 40a484e5 -> 4133561f", + "c022d4e8 410ef07c 4103632e c124c330 4135d6b5 40139e57 -> 4135d6b5", + "c0b64ebb c11bc5ef c055785d 3ee78102 c169cf64 4063ad8d -> c110de3a", + "c19854d8 c0f3ad05 401534eb 4159b521 407e88e3 40d5fa1d -> 4159b521", + "40ecbe8b bf28a0e4 c096df4d bea153ce c19d924b 40a25261 -> bea153ce", + "c01d7cc5 bfe3da05 c00b3a0d c14a077c c17bd8ff 409483d7 -> c17bd8ff", + "c186c0e8 404f9c01 c09ef947 c18a1492 409d5eaf 40f93719 -> 409d5eaf", + "40371c1e c10322ac bfea0f3a c163014b c0f96584 401c698f -> c0f96584", + "40cd53b5 c119ae27 40a5faaf c183f5b2 40a4068d 4087ef81 -> 40a4068d", + "bf94a562 40a0faaf 404a018c c0be7b6e 41228b66 3dc65af9 -> 41228b66", + "beced54e c0e24a55 3f6a1cc4 c149449f 411aa931 3f4afb4d -> 40bfcbee", + "41245039 c11f31b4 c0aa9282 c10d5e03 c1975566 40d3a945 -> c1975566", + "c041f69d 4053f36f c05535a1 4150f827 c0b65a91 404eb0f3 -> c09b2e06", + "c065496f 41051383 3efddd68 c198d765 c185977b bf1027fb -> c185977b", + "40c2b614 c0d678e6 c0b5ea6b c1823a6f 40e89859 40ede13d -> 40e89859", + "419ff945 c0d2a717 4084d83c c12a77bc 41841543 3e5fe5cb -> 41841543", + "40a9c617 c0c50575 3e1c0b1e c01cc082 c08318c2 4060b36d -> c08318c2", + "41637a03 411695ef 3fe4866d c10d9463 c01dc177 402f5848 -> c10d9463", + "c15fd9e8 c114074c 3ffb78b3 bf2c009b c0bbb858 3ff6f200 -> bf2c009b", + "bf0d566d 40a07c84 c0aff2c7 c17d1e78 41531d5e bf481696 -> bee95440", + "bf81c5a9 402fe6be c107ab14 419bea43 4100e7c2 3f0164fe -> 417a88a8", + "c0df3d3f 3cd588dd 41128774 be888e31 419e84aa 40bcd46d -> be888e31", + "41404b6a 403fbdea bfe7b081 c12715b1 4196ad4b 40ef20e0 -> c12715b1", + "3f673474 40d5793d c0fb674b c11c87d5 c120e6e0 40e77b06 -> c11e4422", + "be7c1abd 3f23e7ab 4091f5e0 c1650ed6 c109f107 402439c7 -> c1650ed6", + "c10a68cc 40fb14ea c0cf8233 40204297 c1746048 40f6049c -> c1746048", + "412baae8 c0cda716 c11b68ca c1258fb9 414d6a25 40c1215d -> c1258fb9", + "414f5cdd c01dec13 400f6ec0 c18ae5ca c11fe4e6 40e9061f -> c11fe4e6", + "c0b5905f bde2861c c041dd94 bfb257e2 c0aa0f47 40c32c7b -> c0aa0f47", + "bfc28c9e 40d2800c c01f0e71 c130a9c9 40677752 4084b1e2 -> 40038c18", + "c169a1df 40cb8d72 c03474ac c10eb5ae c1838414 40bd0f80 -> c1838414", + "c1105ec1 4079cbed 409d03ab c1235cb9 416d6ce0 bf6b5379 -> c1235cb9", + "c050c4e1 be8e8aac 400f51b0 bfce8d66 c0a8edf7 40ea0c96 -> bfce8d66", + "c11999d8 4046e387 c0c3dc2b c00bd1d1 414858c8 40db381b -> 414858c8", + "4189ceb9 41188aad 411856e2 c07336f8 418132bc 40c1ebbb -> c07336f8", + "40659e0e 41194717 c0a7d1eb 4097e9d8 c0ffdf39 3ff96e4c -> beceac00", + "40fe1d5c c046c8ae 3e8ad96b c13179c3 c15fae00 3c802a1c -> c15fae00", + "4124af8a c0d6056f bf4b390f 41099026 c082c33f 40a1a76a -> c082c33f", + "4147c88a 4116cbc6 c10cc0c8 40755d27 c13e66f8 4067beb8 -> 40755d27", + "40b5f4b1 be8e727e 3ff2531f c17121a6 40f8b856 40ca4754 -> 40f8b856", + "c058e20c 40b4fc9d c0f08f65 4039f81a 40de3ae3 3dd042e4 -> 40b5b904", + "413ddffe c0cebc5a 4051e2b7 c13db100 419dfa78 40d4bbb3 -> 419dfa78", + "c18a3bf2 bfd39d42 bd315005 4003cd89 bfb9e33d 40a6a7d8 -> 4003cd89", + "c1601057 405f172e 401ea7e7 c0dc8938 3f4722c2 bf668055 -> 3f4722c2", + "419cf3f0 bef373ce 4067a46e c195d7ba 40d6a306 3e8b34af -> 40d6a306", + "416fab11 c0f71667 bf8f4bf9 418217a8 41123627 3feb63ea -> 41123627", + "40e072fd 40bbe84b c0d9029c c1975b9d 418fd2ac 3f6c4418 -> c1975b9d", + "c1417701 4109b56e 3fb1e2b4 413e2910 406e0f9a 40fab410 -> 406e0f9a", + "c14c31f3 410b5d3c 3ec168c1 c198d92b c13e8e78 4037c300 -> c13e8e78", + "bffc1896 c0cf39e1 409d47d6 41933789 4177e486 40fb2d76 -> 418a02c9", + "41634841 410adc46 c0457fbc c00595a3 c14ccf84 40813aaf -> c00595a3", + "41727009 40b4ceac 3f2947a1 416c4192 c189c2a2 40adfc00 -> 416c4192", + "419830b4 c0e86fc8 411c374b 40b0836a c1980d37 40c847ee -> c1980d37", + "c020ae7e 407d3a17 c1183555 41948bd1 40cc2e23 408e7609 -> 414b76d6", + "c131f162 40bb1426 c0db0147 41793eab c110c975 40e857ea -> c110c975", + "40c341e8 c08d0d3f 3ed984ba 419ac38b 41045042 40822a0b -> 41045042", + "414287a9 c08c7ca2 c0fbe70b c18a05b6 c0fbc8cb 40eb07d7 -> c18a05b6", + "c08f626c 40a96eee c0f16730 418b2abf c121149f 40bbe149 -> c060f988", + "4192f17d 40a97061 40a98944 c19ec494 c140cc54 3b9972f7 -> c140cc54", + "3fa63596 4061ec08 c061b288 41910431 41088c61 40f44691 -> 41717eec", + "41058238 bec02e34 c10894c2 4080f10d 419f131e 405ae328 -> 4080f10d", + "41895a16 c03a28e5 c1131f9e bf40194d c070c631 3f1e0e91 -> bf40194d", + "415bb915 c09d64aa c0bdf005 bff3c3fe 4130ecc1 40c0d1dd -> bff3c3fe", + "409d2f04 bfa15dde c0d675cf c12d0640 c1353524 40f11946 -> c12d0640", + "c19b70d5 c1189104 411392fe c15c3d8c 40aa109e 3fb3ecb7 -> c15c3d8c", + "c093435b 404dd69b bff5e3f2 410d619f c195a5e8 be43fc6c -> c195a5e8", + "c15244eb c0009848 bfee2620 bfe3bd09 c1971899 40918eac -> bfe3bd09", + "c1936171 41127886 407766f0 c15037e4 3ff78bef bef2486b -> 3ff78bef", + "bcce7ecf 4003238f 405efe31 bffbf6d2 c18d6fe6 40c76059 -> bffbf6d2", + "418cf2ff c03d0299 c044c8ee 4172ffe8 c14909cf 40fbd80e -> 4172ffe8", + "41648098 c0f930f1 3f0d07e7 beb56d4d 40bb1270 40ca0f72 -> 40bb1270", + "c10a799a 40af911d 3f4afae7 c124a36f c19fce92 40b64373 -> c19fce92", + "4109593f bfeb8d7e 40ed1041 419ba36f 419f70ca 3ee7a1b4 -> 419f70ca", + "c1933080 bedf6cc8 c02db4b6 bf6c88bd 417b3607 3f67a15e -> 417b3607", + "c18ea612 bff808d3 3fcf0bc0 3f7d5cb1 419edac8 40b7e7ab -> 3f7d5cb1", + "3f92f19d 40e414b0 405c7594 c0ccd239 bf24fc81 3fe8aac5 -> bf24fc81", + "c147b27a 40b93e4d c0d6c28d 401de142 c133c18b 3f163351 -> c133c18b", + "418295f7 c0ec36e1 3f4366be c1393eb1 c0127261 406c2592 -> c0127261", + "412879cf 3e10a5ca 40b76eee 419d9f1d 419d6de2 4061dd50 -> 419d6de2", + "3efbf68d 40a6aa47 40e905db c0329676 bfe256fc 3f89a539 -> c0329676", + "c1938291 3ee766c9 bf00c96f c0dcce5b c13bb2c9 409d2d17 -> c13bb2c9", + "412d9a0c bfea1ba2 40233afb 40d0a914 c0f9b9db 400c5907 -> c0f9b9db", + "c102739b c0250f6a 410bb9cc 4075cec2 c0dc3209 40e7a1b8 -> 4075cec2", + "402342a3 3f8ea912 c012bd79 c191f8ae c1478b47 406332d5 -> c191f8ae", + "c0fd38f8 c0a5494d 411aa7ab 40473626 bf5de2b6 3f0c4527 -> 40473626", + "c1038fa3 c0077b62 bec4b6e1 c1979552 40117790 402fabde -> c1979552", + "41922962 40b9899f 40e227c6 4192d5c2 41514074 3faeff6b -> 41514074", + "40e89037 c0081988 c026b316 c199c7a5 4192b1d6 409ba124 -> c199c7a5", + "c18f9f4b 4111eac3 c0d1a1e7 41336134 c15c68f6 4039915b -> c15c68f6", + "c146845b 411fa2ad 4075ee5e 40bcf31c 418494db 406d354a -> 418494db", + "c1680e56 c0c68c1f 40cfd136 407085fe 4187322f 4017c181 -> 407085fe", + "4133b055 408b1a50 3fa774ee c093c64d 41854894 3d6ffaf5 -> c093c64d", + "401474e8 411fb4dd 40bd7047 c1342a0d c19bfaea bdd4cb25 -> c19bfaea", + "c0fdf3b6 411bce73 40c4f663 c0dd90ab 41935b30 4013305b -> 41935b30", + "4093c920 bceb4753 3e6a2ce3 c17fbdc7 c18a8257 bf19b935 -> c18a8257", + "c06ab73e 3f36d97e c036952d c158328d c04ceb3a 4095f6ea -> c04ceb3a", + "c15bb55e 40d6a01b c002b274 c144196c 3fc7de99 3fbe4f66 -> 3fc7de99", + "c128a2fc bf9bdf6e 40ec3724 c14f35ae 412957be bf77d40b -> c14f35ae", + "c18745b1 c0263f13 bff0c823 417073b1 c18f428e 3fab96dc -> 417073b1", + "406b46a9 3ee8f7e7 c082de7a 40879b8c 40e2976c bf55e5d5 -> 40879b8c", + "c03ff58a 401615f4 3f387833 404107d9 c071c652 40a46ef8 -> c071c652", + "c14ae066 c110cea0 40852b26 4183a194 c18ee570 40cff09d -> 4183a194", + "c109cd90 408a4af5 c1174fa4 418af297 40d98389 bf68389f -> 40ee3db6", + "c150424d c0ce9493 c1101a42 419b6671 41818f53 40eb373b -> 41818f53", + "c17e8dfa 3ff768ec 3f786a43 4145f28c c17511ba 4057b0a0 -> c17511ba", + "c17c56b9 40cd3d87 c10450e4 419c2aca c190a36f 4049d7f8 -> c190a36f", + "3f2ab5d7 3f911a0d 4062956d 40dd9277 c0549249 40ef4a55 -> 40dd9277", + "416d8a73 40da2c1a c0b6e6be 3f82f8ac 4195b7dd 40e4574c -> 3f82f8ac", + "417f7618 411d8fc4 40741b9f c18492ae 4100e2fc 3f4b9dbc -> c18492ae", + "c16cc89b c0538ff7 40f0cf94 40a2f91b be81f173 40e1d4ff -> 40a2f91b", + "4083111d c0d5a2e8 3fb05f8e c19e6865 c111ab18 3fa6985b -> c111ab18", + "c1911157 40c2301a c07b1f74 4031276b 3fe861b5 3f265fec -> 3fe861b5", + "3f933962 40c9e054 401d1ad3 412694ec 40264c79 409a7c6e -> 40264c79", + "bf923451 bea6b298 401ebcd7 c1751ec6 c0e3e5ca 3fd086bc -> c1751ec6", + "411332d7 3e8c1cb7 4119a53f c10e575b 411cefa5 40300504 -> 4110029d", + "c093152d 402ea254 c0009ce0 4157fa4b 413b3846 3f065f48 -> 413b3846", + "c0fb2e14 4093f3bc bfd759b7 c19d7c02 40d10c53 3f9726b4 -> 40d10c53", + "bfd9809e c043bc8a bfd8fa56 4184923a 413a1beb 3dff923c -> 413a58bd", + "c0ff1e35 c0dff703 40a74944 c0a2b0f9 c029154c 408d9cdc -> c0a2b0f9", + "c197ae49 3f9679cd c10e3eb9 404dbcea c114c3bf 3fddcd80 -> c114c3bf", + "c0e610b1 4007bf98 c085c31a 4017c154 419caa37 40801ee3 -> 419caa37", + "c11d5a23 410577b5 c1117b65 40991ed3 41663260 bf435ffc -> 41663260", + "c179bb95 4057adb9 40ac8551 c191dc27 bf469de6 40abbcd9 -> c191dc27", + "c049116b bfb19d0a 40468773 c03e7604 c1562ffb 40a671e9 -> c03e7604", + "c1167364 40372dca 40ccc364 c108220b c12c50b0 3fe01c27 -> c108220b", + "4188724f 40831d00 41086e48 c1274e91 c01f1452 40583705 -> c01f1452", + "c13ae16d c0a67a7c c0ab9ef6 c15e89ae c02d9153 40d38a86 -> c02d9153", + "c19bcb81 4082d989 40ab842a c0cee501 c0ab0650 407c5f77 -> c0cee501", + "c0b2ed30 40b13fcf bfb60524 c1388dfb c157d4f0 40e16658 -> c157d4f0", + "c1064a64 c06cdaa8 c115e82b c11aae21 be696930 3fddd1f1 -> bfed39ac", + "3fd63d58 3e3de8e0 3eb851f5 c17cf441 c12f6a98 40fda021 -> c12f6a98", + "4160d998 40363b6e 4085284a c020a753 bfc14a22 40194254 -> bfc14a22", + "3e9ba9c9 c1063425 3e6ffd17 418dac4d 4098cf7f bdcdf040 -> 4098cf7f", + "4106c5a9 c0538d88 c058d5fa 40e79274 413b6499 3fe3a2e3 -> 40e79274", + "c04f5b31 40df38b3 c0458dcc c15a9c37 c170f581 3ff3c258 -> c170f581", + "40846260 c0e437d1 41188e9d c10f91e3 c107d0cf 40a160f8 -> c10a53b7", + "c196748d bfb5ac05 411327da c12c9814 40aec4e3 40b35d29 -> c12c9814", + "c11663c4 40d2d4fe 40b008b1 413319ee 41913ad2 403395e5 -> 41913ad2", + "c14c24b7 c09f4f0f c0b9d451 417d6808 41223be4 401bcef0 -> 41223be4", + "4190e408 40ff0f3c c05aeea1 c14c3f01 4193ec73 40c85d86 -> c14c3f01", + "c0ce3a78 40c71f72 c0975856 40bd64c3 c167e80a 40b7b8d9 -> c167e80a", + "c189aad1 40d89b3c c0ab89e5 40e2a3cd c186caf8 408b9739 -> c186caf8", + "c18d51ac 4114005d c0f66996 c12ec47c c144878d 40b8939c -> c144878d", + "3fb5f8e5 be8a0635 bf943d2f c0aeb7cb 417833a6 407722ed -> c0aeb7cb", + "410fb0da 40b96f07 40a16313 416e50cc c07ca435 40baad96 -> 416e50cc", + "41229c75 4109439f 40126631 419aaebb 41363b8b 40aa4bde -> 419aaebb", + "c15f7a52 40048574 c0212d96 4183f911 404cef1b 408aefeb -> 404cef1b", + "41624eaa 3eaaa878 4113e085 409d6068 419b7f7d 40fc207a -> 419b7f7d", + "41717572 4083564a 3eb32198 40cf9477 c163f49d 40d5de2a -> 40cf9477", + "c1856e90 3eda5a0b c0d19d4f be4ca487 c0ec0ae6 3f86c821 -> c0ec0ae6", + "c110d5d0 bf53fc6c 3f02788b c14c3f40 401b0ca2 401bdf24 -> c14c3f40", + "c19279f3 40429a58 411dd994 c1072def 4186b0ea bf7d3cc8 -> c1072def", + "c107c09c 40b4c7ca 401b2849 c160279e 4006f666 3fa9321c -> 4006f666", + "c185bbba 409576ed c0628df2 c13f4047 40ad3ec2 40a04417 -> 40ad3ec2", + "3f9fa583 c02fc664 c04b4cab c190381b c190f81c 3ffc7992 -> c190381b", + "c115ebe4 41083ae5 3efd6a98 3edf846a c1335288 be3df8b5 -> c1335288", + "c19abcad c01930b9 4049325d 41341b37 41558fe4 404b0a40 -> 41341b37", + "c16730db c08b9518 3da13459 c100b063 412de711 40f4c0d7 -> c100b063", + "409cf51f 40b2a622 4101d20d c17446f0 4197bb64 40740d80 -> c17446f0", + "c1635806 c060095f bf5eb7bc 40d99fb4 c0ebb1cb 40359732 -> 40d99fb4", + "40bd8f66 3ff16ab9 c0df1167 41310519 c14adb52 4043efff -> 41310519", + "c1313c82 c07b3c01 3f83f816 c071444c 4172ef9e 40d0f173 -> c071444c", + "41712b01 40d70b32 3e7730d3 c0501590 4179617b 3f50fb9b -> c0501590", + "4102926d 408daf97 bf9c87a7 416306a4 c13ee417 3e76e8cb -> 416306a4", + "c170da3a 40970d6e c086cc0e 4125afc4 412cb65e 3fc09c8b -> 412cb65e", + "416243b1 40191ec7 c0ba5b75 4052e1ac 402b6965 40ef0ad9 -> 4052e1ac", + "3c2d5528 40fbb9ae bebb75a3 4074cd20 c108927b 40c7a835 -> c0ff0b72", + "c16bdaf3 c0d9d26d 4034696b 404a5290 c11d39ec 40a6826b -> 404a5290", + "416a456c 4102f958 c06ff4cd c10bd88e c07c84f5 40c67ff3 -> c10bd88e", + "3f756e70 40a4e70d c0c48010 c1348ee5 c18164bc 40f9310a -> c1519cb0", + "417cb33e 40572bb6 c09c8022 c184956e 40b1b638 bd97395a -> c184956e", + "c1961517 c0bf11f2 c0e54e91 40fa627a c0ada4ee 40ff4875 -> c0ada4ee", + "41815670 40683890 404f9bf7 411d5640 c1868327 4011e4aa -> 411d5640", + "41189b14 400eb8b6 c0fa57fa c1923f86 414e9938 40286b1e -> c1923f86", + "419b53e1 bf45118b 40d24449 3fe43a1b 415ae5cf 3e80f92f -> 415ae5cf", + "c01c87cc 40a7ac54 c0368965 c181d6b0 3f57e8d7 3faae185 -> bc64b800", + "4035dc8e 4084a2f3 c0c67ea2 c0ec695c bfd8b1ac 3feb8cc6 -> c0d57574", + "40743392 c0cebb5e c0d16430 4114b081 416cb65f bf27c826 -> 4114b081", + "41983674 be6c86c9 4110bbbd c0a667f8 4127abc9 3f557a74 -> 4127abc9", + "40b8985a c0bab690 c1064aec 418a34fd c0ed8f47 3f889982 -> 418a34fd", + "41453df4 3f069901 c10b4b9a 40e45fb5 c14d04f0 3fd972ca -> 40e45fb5", + "c12c3fbc 4011fc93 c0ecfeef 4136ffa3 412b6b24 4041b496 -> 412b6b24", + "3f9a0cf8 bf840f99 c0a61237 4190156a 4168836d 40d21d69 -> 4190156a", + "40822e41 404d006a c021167b c19abeb3 c0bcbd60 40bde8c3 -> c19abeb3", + "414da901 c01ae0ee 40d314ab c0968a16 c140de5f 40ba6e4a -> c140de5f", + "40ca9beb c0f45963 40e78615 c186e3cd c15aa169 3e3d3ae6 -> c15dbd08", + "bfe2b36a 411c7f22 c0ca20ef 41349e9d c15d5c4c 400f64de -> c0d7b58a", + "419c2917 c0171b39 40877fa8 c18089a6 c14ad990 40c55035 -> c14ad990", + "c13df848 408b47a3 409682da 4166dc15 414c3262 40ed5af9 -> 4166dc15", + "c17058c6 c0f42ec6 40da4d2c c0150fcc 41504522 40029387 -> c0150fcc", + "c1868d8a 400cbf3b bf843a70 412aeb75 bf43ce86 407424b5 -> bf43ce86", + "4125e218 40810ee2 40f9c734 bfb8c1b0 c09ab74d 40ccd519 -> c09ab74d", + "bfa8e550 411cfea8 410119c0 3d5413d4 c14c05ad 40699a24 -> c14c05ad", + "40c187e5 408261c7 3f10e4c4 c187cbd3 41335f32 4047c6ac -> c187cbd3", + "c13a5b31 408c6538 4091750a c0f09a76 c045de03 409e6eb9 -> c0f09a76", + "c15a72f4 410b7397 c03b9985 c0d4a35f 40e8255d 3ff891ff -> 40e8255d", + "c0501806 c103fad9 c058e1a3 c0cd0c0c 4187a65a 409f4059 -> 4187a65a", + "c0d96d73 3ff01500 c01e1a6d 41724e71 c1441e03 40bcf9a3 -> c1441e03", + "3f71785e c0b3c2ab 40c44617 400a60ef c19c4bca 40322281 -> c11f3e62", + "c103d8ca 408eea19 c0f3388c c15ed2cc 413cf964 40bcd42a -> 413cf964", + "403287cd 40d951ce bff7b63c c1356d69 c16f6752 403ba217 -> c1500374", + "c10c5c8a bf6a44b0 40c1d750 bd5574af 41241f3b 3ef82be2 -> bd5574af", + "c174874e 409b57ae 409cbab7 41934543 c09c66f7 40b18b6d -> 41934543", + "c10e270d 3e802cf3 40f334c0 40db9db0 c00cd97f 3e16377d -> 40db9db0", + "408fe85c c0ce63b3 c0a80d3a 41267bcc c10c98a2 40cb4b78 -> c10c98a2", + "418f5f9a 40443ecb 40a1c252 c155a64a 41203c77 40e8abd6 -> 41203c77", + "c0b26e84 bfb0f8c1 c043f1cb c181022f bf016bfd 40e1dc5c -> bf016bfd", + "412f503a c0b82298 c0b250e5 410aac3c c016e18a 40ac071d -> c016e18a", + "417b5c76 c02c21ca c0b79b25 4170e597 c1976f07 bed256db -> 4170e597", + "c111c0ea c0afffe1 40e56436 c1382a9f c13728dd 3c314be4 -> c1382a9f", + "c135fa0e c0e267a3 3f9674fc 40f3b653 40d786fc 4087ba74 -> 40f3b653", + "c1737ee9 4001881e 3f2eb6ac 40784907 c0e2c4c0 40d74e3f -> c0e2c4c0", + "c0e57a09 bff728f9 c104b8b4 411f6e08 3fba8d6b 408c9863 -> 403d6d90", + "40acd4d3 bddec53f 406b29f9 bef6e441 c04b6d69 40d2b873 -> c04b6d69", + "c1254173 c0a36024 40e4383b 41292f36 41709b3f 40e146d9 -> 41292f36", + "415ed926 411ba273 c05e0fe9 c0d856b5 4199f965 40e7cacf -> c0d856b5", + "c0ad6d90 406baec3 c0efec06 41073126 3f819a45 40948ebf -> 401943bc", + "c0df54c6 40fb4e45 c0893f09 4173d7ba 412a0822 40b2db09 -> 412a0822", + "c08f2185 400fad8f bec2b267 40f40c81 3f35f0f2 407602aa -> 3f35f0f2", + "40306c42 c106b1f8 41144903 c1208f01 bfe13533 40738388 -> c099cb3f", + "bf16efaa 3f843499 c0c0fa5f c01d25f6 408783da 3f6488d9 -> bf6b2fe4", + "c1855a5e c080c67c 41108a33 bd6f1c87 40af5d9f 403febd5 -> bd6f1c87", + "4120732d 3f935ffa c04c00e1 c0d0dc6f 419359e6 bf002c95 -> c0d0dc6f", + "c17af693 403e0690 c02038d1 40b82815 40a267e3 40ae1796 -> 40a267e3", + "40685356 c051e13b 4016174c 414df8bf 4194a6aa 4052a2ff -> 4194a6aa", + "41868358 c060367a c0da10d5 c0a5e17f c03da032 3ebc1086 -> c0a5e17f", + "4149bf89 40cce406 4046475c c1598e08 40914e72 40b17893 -> c1598e08", + "4188b1a5 41164d1d 41129b1f c106699a c0baf7e1 40f4fd07 -> c106699a", + "418582a8 40f3449b c10f7815 3f97137b c0de6570 40b435eb -> 3f97137b", + "40168567 c0673aa8 c09f63f3 40e30900 40e6bf98 3e98fdfa -> 40e30900", + "bf22c467 410fdd57 bfd3d6ed 40d20888 c06f9ac0 40cb5b9f -> c0307458", + "c118e19c 40fd20f6 408529b8 c0dd1219 41801e1a 409f84cf -> 41801e1a", + "4076f3f7 c0e08f84 c02bcd60 c09520a9 c18a5cc3 bee91f17 -> c18a5cc3", + "c1173fc8 c079e5b4 40af94cc 41827450 bed5e339 3f3c308b -> 41827450", + "c1530423 c0c4559b c112002e c13eb548 3fe268d2 bf637af3 -> 3fe268d2", + "415362a8 40b16a1c c0b73a30 401ec5a4 c1830afa 40c3077b -> 401ec5a4", + "c16e6d01 410f1344 c0f781e2 41762276 3f1c20c0 3f63089c -> 3f1c20c0", + "4126783c c1199d4f becdaee8 4131e7ef c1451a2a 40beb97e -> c1451a2a", + "c19d1fcf c0c47a8d c0f2c4be c16e4a87 c0776cc3 40c21046 -> c0776cc3", + "41716f2f c02873e1 c1182593 4004dc79 c06dc707 408076f5 -> 4004dc79", + "4191dca8 411bdedb 409007dc 4191b06b c0d0a4fe 40f8ca30 -> 4191b06b", + "415590ba c1190167 c097d7d1 c17da9bd c16dc1f8 409f914c -> c16dc1f8", + "4045dd8c c11b44a9 40b94230 410105fc c0c71643 40272d48 -> c06efc40", + "40b05e39 411cc66f c0ed0c22 41922f55 403df7b8 40a655fb -> 41675bad", + "c19ef809 40c60880 c11cc591 419ea3b7 c182443d 3ffa9a0a -> c182443d", + "40c144c7 c0612e8a c0cf68ae c163b817 410b8991 40b72b7d -> c163b817", + "c0966d65 40db7667 40d6b010 415265d1 c17bdc65 3fa9bd5d -> c17bdc65", + "41134281 3fc171f6 c08d9e66 3fd92d5d 41434098 3fc90101 -> 3fd92d5d", + "c1196ac1 410123f0 3fcd22ad c18ae6cf 41282587 40d812f7 -> 41282587", + "417c67be 40bbaf04 40984989 c0d72128 c168793a 409d4400 -> c0d72128", + "c0507d54 40679c08 411e2367 418d224e c16cb393 4032d038 -> 418d224e", + "c14d492d c04cd7ed 3fb95938 c1056dbc 4130f5f9 40d522ad -> c1056dbc", + "c08918f8 408046be c0bcf6be c18d08d1 c19bf213 40c64b35 -> c19981fc", + "c14589e7 c117e561 c112ea51 c12fba13 c16f78ae 3fa24070 -> c12fba13", + "c16bd6fa 40c3f396 41057415 40474d08 c190eb35 3eb3a64e -> 40474d08", + "c00416e5 402e3224 c0f9983a c17ac291 c1220f5a 40e807ad -> c1526a52", + "40118cf9 c0889179 40cc2b9a c110d30c c13898a0 409238f9 -> c129426c", + "4155e900 c1156f6c 40183d64 40eb3844 3ff54b33 40b0ac2d -> 3ff54b33", + "c1886483 c0be00bd c026d85d 415ac007 c11405cf 40ef2771 -> 415ac007", + "415827d6 40bf4225 409d5cbb c12fdc97 41156c4c 3fbc44fd -> c12fdc97", + "418b98b1 c0b52e81 411557c1 4174ba68 4007a787 40d1f2c5 -> 4007a787", + "410172ee c11b91b5 c08328f4 41903221 bf7a7778 40762bf3 -> bf7a7778", + "c182eb6f 409e5cd0 c11acb92 c146568b 4092f96a 3faa9a24 -> 4092f96a", + "404df9be c1182bb6 c1161df3 4141418a 41904344 40ec941d -> 41904344", + "c0feef13 c11aacd4 41037c72 c0efbc19 411af66e 3febc56f -> c0bb7922", + "c097e437 4109eb5b c102fd0c 409a5efc c10f185a 400ed3f9 -> c0c40302", + "4162ac78 40089fdd 3d20382a 3feb58ae c18330b6 4006c1f2 -> 3feb58ae", + "c0a2fd1b c0b0c551 3f8145ab 4100fb21 c0b224fd 3eb80abc -> 40e5374d", + "4182ffa3 c036ac14 bf98c002 c0b7518b c11a78bc 4060d7be -> c11a78bc", + "c0b3032b 410996ab 400f3d51 41337541 3fac03c1 40410f33 -> 3fac03c1", + "c13761a3 c0e40ada c019de66 41088bc5 c182ac82 40d66f10 -> 41088bc5", + "4091fecf 40b0feb5 c0564bdf c1722b9b 415e4df3 40f68754 -> c13f7f2e", + "3ff31bb6 bfdebf7e 40246982 bf3b0510 411af173 40c598c2 -> 41010c4e", + "40f45afe c008bde1 c0bef412 403dc420 c0f79bb5 3ffce377 -> 403dc420", + "41522476 40e1aebe bfc3400b bffade47 418cf11d 4094947a -> bffade47", + "419319bf 401cb488 41176c45 4181817b 418fdbc8 bf159c6e -> 418fdbc8", + "418bb571 c0e082f2 40bfa8ff c13edc56 4189398e 40ec7da7 -> 4189398e", + "c11df9ea c08558f9 3fd8ed2f bfe51fd7 4138f498 be3b7096 -> bfe51fd7", + "4183e125 c066bccf 4075604f 408b04b8 c177321e 4083e78d -> c177321e", + "40b14b0d c0401234 4090b945 c181da91 40e999cc 4090766c -> 40e999cc", + "409b1c51 c10789b9 4094a73f 411c0573 416924c6 40a87dcd -> 416924c6", + "c0c0841f 4014e747 40f27306 414055cb 4174824f 4011f703 -> 414055cb", + "419515b1 befb3f54 40fa4c08 c15bc99c c0884224 408cafcd -> c0884224", + "c17ffc96 4102be7c c1195064 4178fa73 c002b200 3f95c2c1 -> c002b200", + "416783b4 40cdb20b 408aae02 c0ce7dc2 4155349e 40c1259d -> c0ce7dc2", + "c19f2fb2 3fa9a878 c0392dc8 c0add541 4176cb0e 40ece893 -> 4176cb0e", + "c0fc09e5 41049778 4117123d 403e4ab8 c0985efa bf6bc704 -> 403e4ab8", + "c181272e c0e8b82b 40ac700f c16bf613 41669a75 405b2bf2 -> c16bf613", + "419ed174 c025a776 c022ba71 40d5b914 4178eabb 40893cce -> 4178eabb", + "418276b2 bf81b7a6 be1f6451 413db6fc c14243ef 40b6bef1 -> c14243ef", + "c19bcfaa c0d65e48 c0f9e7de 4176a524 c07dd037 404eca48 -> c07dd037", + "c18fc249 c0ca6671 c01c4e72 40bf01e7 c182a61e 404f29e4 -> 40bf01e7", + "3f74f7b8 c0e34bdd 40bfc8fb bf45e97b 4183a5db 40fa4c1a -> 411d48d4", + "c10df8df 406cfe4b c0415506 40e64d94 c184ba92 40d62a49 -> c184ba92", + "4105fd30 40da7028 c0eb495e 411aef3c c1944df1 be425ee7 -> 411aef3c", + "c18b3bd4 bff67e52 c05ea1d7 c14249bc c1428bae bef47712 -> c1428bae", + "c18ff24f 411d4df6 3fac0254 41142b92 40521ab6 3fa8a85e -> 40521ab6", + "418bf378 bf31c608 c0c0ff49 c1400dbd 3e22206e 3fa5a535 -> c1400dbd", + "c0d8b5ba c0e52648 40956543 408802c9 412a74dd 40a00000 -> 408ebe8c", + "c1020f08 4117eab5 40c61366 40b7a1be 40fdeca0 40800000 -> 40fdeca0", + "c14e9815 3fe7ba6a 3f8e4562 414b7f7e c0df85a5 40400000 -> c0df85a5", + "41848cf9 3fc4516f 3fa6dd05 3fdce27d 40b07bdb 40000000 -> 3fdce27d", + "c160e589 411cf8fa c00920d9 4140cd05 c15db0c6 3f800000 -> c15db0c6", + "40b17031 c104d8f6 3ff3a886 418c5a11 c0852a90 00000000 -> c0852a90", + "414bf8de 40752b2c 40cfbf38 c1437a6c 3da2b005 bf800000 -> 3da2b005", + "40e83e46 c00eb0ee c0f3daec c165ff13 418c2a30 c0000000 -> c165ff13", + "c194009a 40fea0d2 bfc3ffe7 403c6ab9 bdbcd9f2 40bfab56 -> bdbcd9f2", + "c0cd4d14 c04649ce c0658e2a 4008bf01 40e0ad26 40482368 -> 40e0ad26", + "41976356 40c1b0cc c0ce8876 c15e82a4 bf990202 40935270 -> c15e82a4", + "416ce6cf 410288c5 40ba3d25 c07006e2 c009f023 3f25c822 -> c07006e2", + "403e5068 40a06541 c1064f97 41878d02 c0a84fbd 40c9437e -> 41591457", + "4138c1d3 4119d363 4022a699 c18ebb8a 4185f9f5 40b6a034 -> c18ebb8a", + "4199d6b7 c0d68154 c1079cd6 c1878f10 c1392b11 401101a0 -> c1878f10", + "41968346 410c0f4e 40890593 40dd27b5 c13d1e27 40825514 -> 40dd27b5", + "c09a730c 40b4dd89 40b4dd89 40faf2e9 41995335 40011af2 -> 40faf2e9", + "4181d7f3 3faa0a7b 3faa0a7b 417c1885 414c3d93 40babb41 -> 414c3d93", + "bf05b647 c05ce5d8 c05ce5d8 c128caab 41933fe5 40a56c68 -> 00000000", + "40a29076 c0ab3de2 c0ab3de2 be6915ef c1092708 409d66f8 -> be6915ef", + "c158a866 40b4de0c 40b4de0c c0de8295 419e062d 400ed592 -> 00000000", + "c1696e01 3fa7577a 3fa7577a 419fbce5 c0c34995 3fed3206 -> 00000000", + "4178fbe2 bea1992c bea1992c 4004677a 4180f056 3ff992e6 -> 4004677a", + "4190db99 bffa5215 bffa5215 c15b2d22 41987fba 402e5b2d -> 00000000" + ] + }, + { + "function": "cycles_map_range_stepped", + "node": "ShaderNodeMapRange STEPPED", + "cases": [ + "00000000 00000000 00000000 c01129cc c1107059 4081556c -> 00000000", + "00000000 00000000 3f800000 41964412 c0b9a337 40d688d6 -> 41964412", + "00000000 00000000 bf800000 c08c03c0 c16ab108 40d172bb -> c08c03c0", + "00000000 00000000 3f000000 c1917122 c0e181c1 40b21b78 -> c1917122", + "00000000 00000000 bf000000 4092751c c1176c3b 40e661d8 -> 4092751c", + "00000000 3f800000 00000000 c0fce512 4184ce01 3f9d4a46 -> 41ffd34e", + "00000000 3f800000 3f800000 c18443d7 c18603e8 4087b19a -> 00000000", + "00000000 3f800000 bf800000 c0cbf019 c0d88265 be0e8e80 -> c0cbf019", + "00000000 3f800000 3f000000 c0a25dd6 c099aea2 40642325 -> c08c70b4", + "00000000 3f800000 bf000000 4188d270 bfb71444 40295bc2 -> 40461e1c", + "00000000 bf800000 00000000 3f1c315f 419d95e0 3facb66f -> 41e73968", + "00000000 bf800000 3f800000 418e84c1 c18decf5 4056ccf5 -> c057db70", + "00000000 bf800000 bf800000 3fd72192 c154ccaa 40ec718b -> 00000000", + "00000000 bf800000 3f000000 40fad013 4187b186 3f9b54fc -> 4175b34d", + "00000000 bf800000 bf000000 3edd9833 c0838e24 3e82c10e -> c20c9c69", + "00000000 3f000000 00000000 c149dfc7 c166b3ac 3fe2598f -> c16a7a62", + "00000000 3f000000 3f800000 419f51e8 41005f4f 401f8716 -> 421bfe0a", + "00000000 3f000000 bf800000 c1269c91 c0ee5a68 40c532f6 -> c117377f", + "00000000 3f000000 3f000000 418f348c c09680fa bd6a9d24 -> 00000000", + "00000000 3f000000 bf000000 4150fd43 c14e1c1b bef76c49 -> 4150fd43", + "00000000 bf000000 00000000 408c25cc c00cc5fa 403f80d6 -> c00ddd94", + "00000000 bf000000 3f800000 c01fb202 41891ff1 40469aac -> 407545da", + "00000000 bf000000 bf800000 40a73dc1 c18dcfdc bebbe3c9 -> 40a73dc1", + "00000000 bf000000 3f000000 c132d848 c179633e 3df64825 -> c132d848", + "00000000 bf000000 bf000000 40fb7ff1 3fe7ad9e 3fab8043 -> 00000000", + "3f800000 00000000 00000000 4189ceea 418ee84d 3ec12570 -> 00000000", + "3f800000 00000000 3f800000 c0eb25f2 c13df8ba 40de2166 -> c13e94b7", + "3f800000 00000000 bf800000 40903b35 418939e1 407e4071 -> c1368b50", + "3f800000 00000000 3f000000 c0a6e552 419376d1 40320485 -> 4259319e", + "3f800000 00000000 bf000000 40bb6a6b c1823786 3fc1eaf4 -> 42bb087b", + "3f800000 3f800000 00000000 c0dd8dd2 c186593f 3fd887e0 -> c0dd8dd2", + "3f800000 3f800000 3f800000 419f1020 c1546d61 4099a129 -> 00000000", + "3f800000 3f800000 bf800000 c09c1081 c19c618e 3f5527b6 -> c09c1081", + "3f800000 3f800000 3f000000 c110af8a c180900a bf01b536 -> c110af8a", + "3f800000 3f800000 bf000000 40693a29 c134dd4a bf5c72ac -> 40693a29", + "3f800000 bf800000 00000000 3f9550b7 41953485 3fb6bf65 -> 42489b08", + "3f800000 bf800000 3f800000 41321126 bef478b9 408112ef -> c0508a30", + "3f800000 bf800000 bf800000 40fa788e c08ea071 40edd493 -> 00000000", + "3f800000 bf800000 3f000000 3ffe5db6 400a306e 40681b52 -> 40116448", + "3f800000 bf800000 bf000000 bfa4a853 4199f31f 40d4a7eb -> 42b6c965", + "3f800000 3f000000 00000000 40673ea9 c164e2a9 40b6fc1e -> 41cc627d", + "3f800000 3f000000 3f800000 bf9f7c16 3f734594 bf3645c5 -> bf9f7c16", + "3f800000 3f000000 bf800000 c0b61386 4147db34 4013adaa -> c1ab95d0", + "3f800000 3f000000 3f000000 406a644e bf018a06 3f9e1c97 -> 00000000", + "3f800000 3f000000 bf000000 c02cdcdb c12c25f2 40c54a5e -> 4021bcd3", + "3f800000 bf000000 00000000 41045eed c167a2cc bf2b3d95 -> 41045eed", + "3f800000 bf000000 3f800000 c1684b5b 4156bbec 400d8b01 -> 41bb0b88", + "3f800000 bf000000 bf800000 3e80a80e 418fa7c7 3e6dda03 -> c39853c3", + "3f800000 bf000000 3f000000 c128cd54 40c8e1da 40c9dc90 -> 418101d3", + "3f800000 bf000000 bf000000 40097e12 c19e9e7e 3f60fe71 -> 00000000", + "bf800000 00000000 00000000 c186c5d2 c1297fe4 40d53554 -> 00000000", + "bf800000 00000000 3f800000 41613cba 3f9e1ad0 bdd483f8 -> 41613cba", + "bf800000 00000000 bf800000 4134a418 c177e3c9 bf251c0f -> 4134a418", + "bf800000 00000000 3f000000 c108b239 c0f20196 40168788 -> c13766bf", + "bf800000 00000000 bf000000 c121145d c0d463b0 3e62c1e0 -> 41a74fbc", + "bf800000 3f800000 00000000 4025df2a c1628d48 40cecba0 -> c206cac2", + "bf800000 3f800000 3f800000 c08488f1 4170d7eb 408f42a5 -> 00000000", + "bf800000 3f800000 bf800000 4154b30e c1777fe2 40dfaa85 -> c1782fc2", + "bf800000 3f800000 3f000000 c0574eda 4146e955 40033929 -> 42b22b5e", + "bf800000 3f800000 bf000000 41564636 c115bf1c 3e1ff4bb -> c304419a", + "bf800000 bf800000 00000000 c1816a12 c0a7e1b9 40bb30ea -> c1816a12", + "bf800000 bf800000 3f800000 c12f7d05 40f74399 40cf5bd0 -> c12f7d05", + "bf800000 bf800000 bf800000 c072a909 c148bb44 404341af -> 00000000", + "bf800000 bf800000 3f000000 c1338a74 c18e6b85 40f06beb -> c1338a74", + "bf800000 bf800000 bf000000 c19900f9 c11c7611 40a2a663 -> c19900f9", + "bf800000 3f000000 00000000 c149b384 40bf0c85 4045e836 -> 426dedc9", + "bf800000 3f000000 3f800000 41087eb2 c0508f15 40c7f723 -> 424826a4", + "bf800000 3f000000 bf800000 4149b553 c17a615e 40524e62 -> c1ae4db0", + "bf800000 3f000000 3f000000 418a64d2 419b27a8 40e6ff90 -> 00000000", + "bf800000 3f000000 bf000000 c16cefc6 c1544a84 40816481 -> c1424567", + "bf800000 bf000000 00000000 40c42ad3 41379243 40bbc8e5 -> be7902c0", + "bf800000 bf000000 3f800000 c18f19a3 41739ef1 3fd44d01 -> c21768e6", + "bf800000 bf000000 bf800000 40b96034 c13dcccd 40cc0246 -> c1597b3e", + "bf800000 bf000000 3f000000 4190464a 3fed65bb 409caed8 -> 41df94be", + "bf800000 bf000000 bf000000 c16c9faf 401262d9 400fa50c -> 00000000", + "3f000000 00000000 00000000 3fc973ab c16a0b2a 3febb658 -> 00000000", + "3f000000 00000000 3f800000 bde2c2ec c1228dbd be334f80 -> bde2c2ec", + "3f000000 00000000 bf800000 bfee4049 c1244f8e 3f7d6b32 -> 40d43c90", + "3f000000 00000000 3f000000 4112b9df c125a865 407e4372 -> c127ca93", + "3f000000 00000000 bf000000 410424e4 c19ada18 4090730b -> 4233dc48", + "3f000000 3f800000 00000000 413966e3 c1909c13 3fc53210 -> c0f559ea", + "3f000000 3f800000 3f800000 c177e581 413e50b3 4064852b -> 00000000", + "3f000000 3f800000 bf800000 c18268cd 41822d2a 40ab2d73 -> c1236406", + "3f000000 3f800000 3f000000 417e7bdb c1076dd5 40a3f27d -> c14a257f", + "3f000000 3f800000 bf000000 c15a2f00 c03a8471 402948f5 -> c119535f", + "3f000000 bf800000 00000000 40ebfaed c18e279f 402291ac -> c228793c", + "3f000000 bf800000 3f800000 c1181b2a 40e52245 40b8978d -> 409e1460", + "3f000000 bf800000 bf800000 4083c17e 4054034e 401ef9df -> 00000000", + "3f000000 bf800000 3f000000 4123a2f8 41114b83 40f41a6c -> 411066ac", + "3f000000 bf800000 bf000000 c18a5a45 c1985b37 3ede6c02 -> c205a5bc", + "3f000000 3f000000 00000000 c19399d3 40be806b 40b6df77 -> c19399d3", + "3f000000 3f000000 3f800000 c18ca58a c13c0303 bf555d29 -> c18ca58a", + "3f000000 3f000000 bf800000 c168f7c6 c0f22b8d 40ffd2e4 -> c168f7c6", + "3f000000 3f000000 3f000000 c18ecf69 c16ace91 3f5a2a63 -> 00000000", + "3f000000 3f000000 bf000000 c0b0bd22 bf9f3484 409f8343 -> c0b0bd22", + "3f000000 bf000000 00000000 c0557cdd bdea736c bf308892 -> c0557cdd", + "3f000000 bf000000 3f800000 408f1409 be30e0d9 40a4528e -> 3f5a9144", + "3f000000 bf000000 bf800000 410574b3 c186e728 409d2316 -> 428bdd5b", + "3f000000 bf000000 3f000000 c197aeb6 c15bc104 40c56242 -> c1507abe", + "3f000000 bf000000 bf000000 c18a688f 41530ef3 40ff59b6 -> 00000000", + "bf000000 00000000 00000000 c130cf2c 40c722e9 40305d80 -> 00000000", + "bf000000 00000000 3f800000 4110d8e8 c16df93a 40ccb6e0 -> 41c01aef", + "bf000000 00000000 bf800000 4157aec4 c06a654a bedf3c3b -> 4157aec4", + "bf000000 00000000 3f000000 407433b9 3faf666f befcb3dc -> 407433b9", + "bf000000 00000000 bf000000 41965e7f 41931704 40c0cc25 -> 41928f27", + "bf000000 3f800000 00000000 c097b1f3 c19051f9 40babb14 -> c1dc414a", + "bf000000 3f800000 3f800000 417ab694 c10f1169 3f72a802 -> 00000000", + "bf000000 3f800000 bf800000 c10fcc5d 4184a617 3f6557c7 -> 419c6c88", + "bf000000 3f800000 3f000000 41882009 419305a0 be80f127 -> 41882009", + "bf000000 3f800000 bf000000 4187c6bc c176ce6d 3f7cab8f -> c17da338", + "bf000000 bf800000 00000000 c18f5ab3 c093ba7c 40c0ed57 -> c134cc3e", + "bf000000 bf800000 3f800000 41939448 410d72c8 40de6dde -> 418885bc", + "bf000000 bf800000 bf800000 c18f976a c19735f7 bf78b4fe -> 00000000", + "bf000000 bf800000 3f000000 bfbd7db1 40ca0fb5 3f9e7621 -> bfbd7db1", + "bf000000 bf800000 bf000000 415ee081 be1359a0 40618798 -> c002e6c8", + "bf000000 3f000000 00000000 4168c312 c14f1a57 408c9463 -> c2401fde", + "bf000000 3f000000 3f800000 40d57b76 415a2637 404ccac1 -> c14e9b43", + "bf000000 3f000000 bf800000 40d02d79 c1033607 40a6591f -> c099ef5f", + "bf000000 3f000000 3f000000 bfa5b48f bffadee3 40cb16be -> 00000000", + "bf000000 3f000000 bf000000 4068d6b1 c19faf9e 40995bc4 -> c1a7dcae", + "bf000000 bf000000 00000000 40c9ac1f bf663181 bf0bbc38 -> 40c9ac1f", + "bf000000 bf000000 3f800000 419dd242 4101585c 406fec94 -> 419dd242", + "bf000000 bf000000 bf800000 c0914629 be02cdc1 406c55b7 -> c0914629", + "bf000000 bf000000 3f000000 bcaa15d3 c0c06f33 40e66c18 -> bcaa15d3", + "bf000000 bf000000 bf000000 c14262b5 4182e469 3f07a567 -> 00000000", + "40000000 00000000 00000000 415b9a25 c1264e45 3e3fa371 -> 00000000", + "40000000 00000000 3f800000 c09c1528 40d320a5 40cef167 -> 419fb7c4", + "40000000 00000000 bf800000 bfb0f05e c1596a6b 40ac131b -> 41e1037b", + "40000000 00000000 3f000000 c1536b3a c05abf4b 40a03a5c -> 4206f4c6", + "40000000 00000000 bf000000 c17c0801 bf4cba60 40a77e69 -> c2ae5627", + "40000000 3f800000 00000000 c150f484 c09825ed 4036de6d -> c1c57d06", + "40000000 3f800000 3f800000 412a8111 414366a8 3f9929ac -> 00000000", + "40000000 3f800000 bf800000 4180aa4a c132a812 3d5f4b2c -> 4400fb87", + "40000000 3f800000 3f000000 3eefcd8d c183c340 3fe46ac3 -> 4265aef9", + "40000000 3f800000 bf000000 c13fe162 40d66a7b 405e6d04 -> c1e10732", + "40000000 bf800000 00000000 c163ddb6 bffb0bd9 40150cc8 -> 4204dc98", + "40000000 bf800000 3f800000 4087bb0f 411ff8ea 40b7cd5a -> 4164394c", + "40000000 bf800000 bf800000 4133f5b5 40ec5ee0 40262223 -> 00000000", + "40000000 bf800000 3f000000 3fbbf6d1 3ec5d90c 40c2a1dc -> bf82d641", + "40000000 bf800000 bf000000 c0e76b14 41883238 3dcb1519 -> 44b68ea5", + "40000000 3f000000 00000000 4196c88b 40913905 be60affe -> 4196c88b", + "40000000 3f000000 3f800000 3f215147 c0841406 3fc287f0 -> c1aa43be", + "40000000 3f000000 bf800000 41186ff4 c0e06daf 40a0e0d6 -> 42023b50", + "40000000 3f000000 3f000000 40f3f5c3 4197b128 408c8f16 -> 00000000", + "40000000 3f000000 bf000000 3f1ca914 bfeeaf6e 3fda806a -> 40fbb868", + "40000000 bf000000 00000000 4098693c 4037ca34 40e2e8c4 -> c0bcf63a", + "40000000 bf000000 3f800000 419d80c1 c1762b87 40b6c169 -> c23f76f2", + "40000000 bf000000 bf800000 40e32d6d 4184770d 40120f22 -> c27d7094", + "40000000 bf000000 3f000000 40cee5fe c0d7bc5c 403103f9 -> c2120aa7", + "40000000 bf000000 bf000000 bf23af93 bf2ab3f4 40db0f4a -> 00000000", + "c0000000 00000000 00000000 40acb295 bff94908 40ca7d1a -> 00000000", + "c0000000 00000000 3f800000 4099a1fb c19826e5 3fca8773 -> 42be415d", + "c0000000 00000000 bf800000 bf83e94d c1617e3a 40f2b11c -> c1f27d13", + "c0000000 00000000 3f000000 c127b62d c102aca4 3f907499 -> c1e789a6", + "c0000000 00000000 bf000000 c1031892 c071489c 402fbb86 -> 4165c30c", + "c0000000 3f800000 00000000 40c948f9 4187a928 3facda07 -> 42765856", + "c0000000 3f800000 3f800000 408b55d0 c1286d32 40f28e7b -> 00000000", + "c0000000 3f800000 bf800000 c04d274e c00186a2 403fa0d0 -> bf9db9d1", + "c0000000 3f800000 3f000000 c139fe9e c15649b1 408ed1e3 -> c1c26d43", + "c0000000 3f800000 bf000000 c10f3447 414adfd5 3e9cbd5d -> 43045c53", + "c0000000 bf800000 00000000 414cebc9 c1044367 3e8de1a8 -> 4324e7a9", + "c0000000 bf800000 3f800000 40f33094 40eb1528 bef5b591 -> 40f33094", + "c0000000 bf800000 bf800000 c12f07be 417a758c 4045791a -> 00000000", + "c0000000 bf800000 3f000000 40716371 c1516cd8 4070339f -> 41adee6b", + "c0000000 bf800000 bf000000 414d0ab8 4183ced6 4051bb7a -> 4030b4dc", + "c0000000 3f000000 00000000 40de68c5 4117bbb4 3ff18727 -> 41cdf3ad", + "c0000000 3f000000 3f800000 418581e0 416609f6 40f3caf0 -> 41f04839", + "c0000000 3f000000 bf800000 c0eff096 412a99a9 40364354 -> 41f61bb6", + "c0000000 3f000000 3f000000 41457cfe c18aa1f7 3f1f20fd -> 00000000", + "c0000000 3f000000 bf000000 3ff19e17 415e4a5a 3f943289 -> 4256efda", + "c0000000 bf000000 00000000 4129622c c17d5c18 3f3bdaf7 -> 43629f21", + "c0000000 bf000000 3f800000 c0f06844 c0cfe74e 40f431f5 -> c10b5ef0", + "c0000000 bf000000 bf800000 40c3f39c c11a6e1d 40edf36c -> c23ba7da", + "c0000000 bf000000 3f000000 c1032f60 c17a1a86 40be2725 -> 40b1e66c", + "c0000000 bf000000 bf000000 415f3d2e c10d1ce8 406294fa -> 00000000", + "40400000 00000000 00000000 3e2fc99b c014c852 3fc86797 -> 00000000", + "40400000 00000000 3f800000 c138bf06 3f31e501 401b46fa -> 421ba2a0", + "40400000 00000000 bf800000 4195d403 c0d48fd5 40bcafec -> 42da2c36", + "40400000 00000000 3f000000 bf85615c c0a8e9bc bf7b7d6c -> bf85615c", + "40400000 00000000 bf000000 c0572ff3 c180f231 3f9d1c1a -> 430e21f3", + "40400000 3f800000 00000000 41935aef 40a4651b 4091a9a3 -> 4255bc5a", + "40400000 3f800000 3f800000 c0f33e60 c1889097 4013adef -> 00000000", + "40400000 3f800000 bf800000 41377db6 c0e67fec 40673c69 -> 42153a2c", + "40400000 3f800000 3f000000 4197924b c190650c be4f65da -> 4197924b", + "40400000 3f800000 bf000000 c146016f 41048a78 40ad4053 -> c23aded1", + "40400000 bf800000 00000000 3f74f8a1 c17c0b41 40e64f07 -> c292ace8", + "40400000 bf800000 3f800000 c108d38a c161e348 404f94ce -> c1b23f98", + "40400000 bf800000 bf800000 4175e585 407b1b53 402e378d -> 00000000", + "40400000 bf800000 3f000000 3fe275e5 c137ca87 40d860e1 -> c215c22b", + "40400000 bf800000 bf000000 4187c65a 4194e950 40c2f36e -> 42004371", + "40400000 3f000000 00000000 c197f9c0 40f40b7b 408a0b22 -> c339a138", + "40400000 3f000000 3f800000 c17d682b 40f17250 3f9aa8b8 -> 43450a2b", + "40400000 3f000000 bf800000 c0c10259 c1308d67 4047ad5e -> 40a62f3f", + "40400000 3f000000 3f000000 c1287890 41494b99 401ec372 -> 00000000", + "40400000 3f000000 bf000000 41904b55 c0d74abe 40bd0df6 -> 42baf9fb", + "40400000 bf000000 00000000 bfc4a995 c1224a13 3f75df09 -> c2ec107d", + "40400000 bf000000 3f800000 41637904 4162089b 40ca90ca -> 415f9ba2", + "40400000 bf000000 bf800000 c197ce9c bfd41c86 4052df0e -> c335ebc0", + "40400000 bf000000 3f000000 40c0088f 41769037 40ebfedc -> 422c0081", + "40400000 bf000000 bf000000 c1451780 c095d06e 40962552 -> 00000000", + "c0300000 00000000 00000000 c19daad3 40815b49 bf654633 -> 00000000", + "c0300000 00000000 3f800000 bfd931c2 3f6374c4 40214ce5 -> c13f46cf", + "c0300000 00000000 bf800000 3ff66d4d 4132952b 40bd5d74 -> 41fca434", + "c0300000 00000000 3f000000 418d7d4b c10b61db 40339e78 -> 435734c1", + "c0300000 00000000 bf000000 c064633e c12a11bb 409e0c49 -> c2454330", + "c0300000 3f800000 00000000 c18ed791 419932b0 3fc93184 -> 4342077c", + "c0300000 3f800000 3f800000 c183abed 4125dd09 3ffdc5ed -> 00000000", + "c0300000 3f800000 bf800000 3f2aab72 c0e1da44 40d26743 -> c17c7e3b", + "c0300000 3f800000 3f000000 c0843392 40482647 3fb39ac4 -> 42b1f7af", + "c0300000 3f800000 bf000000 bfa4e0a6 bfec65bc 40a693b5 -> c0397b9a", + "c0300000 bf800000 00000000 409269aa 4189988d 4078ff6c -> c1c50548", + "c0300000 bf800000 3f800000 c1597230 c0a8e186 bf351434 -> c1597230", + "c0300000 bf800000 bf800000 c171a508 3f9b7bb8 40dfad7f -> 00000000", + "c0300000 bf800000 3f000000 c19ef0e8 c0e96dcb 3d2da27b -> c419437e", + "c0300000 bf800000 bf000000 415693e8 c0b3ac6e 3f946310 -> 4310b4e0", + "c0300000 3f000000 00000000 3e986bfb c0bc57e3 407e5a32 -> c245f5ee", + "c0300000 3f000000 3f800000 c18be9e4 c1913724 3fa71fe6 -> c11e026e", + "c0300000 3f000000 bf800000 c14edcdf 412b2d9c 40cfa1d6 -> 42355647", + "c0300000 3f000000 3f000000 40258c73 4140cae4 bf6d1843 -> 00000000", + "c0300000 3f000000 bf000000 415fd385 41573158 3fc890ea -> 4133bf5c", + "c0300000 bf000000 00000000 c183f71e 40917d13 40f6fc0f -> c2fb180c", + "c0300000 bf000000 3f800000 40e95b23 403aa7df 3e24433d -> 42776687", + "c0300000 bf000000 bf800000 40d3eddb c184b120 be391696 -> 40d3eddb", + "c0300000 bf000000 3f000000 c0cd661f c15bc987 befec0a1 -> c0cd661f", + "c0300000 bf000000 bf000000 410c59fc c03e19a7 bf7871a1 -> 00000000", + "3dcccccd 00000000 00000000 3fd076d2 c0f6397a 406f6c5b -> 00000000", + "3dcccccd 00000000 3f800000 c1780959 c00cf1ad 4043ddba -> c1780959", + "3dcccccd 00000000 bf800000 408e7e68 c11f86b3 bf5016a0 -> 408e7e68", + "3dcccccd 00000000 3f000000 405dc561 41281819 3efcc7c7 -> 405dc561", + "3dcccccd 00000000 bf000000 418d57c7 3fce4519 403d63f7 -> 41b8bff5", + "3dcccccd 3f800000 00000000 4057f9e0 40316be5 40a32b1b -> 40322b8c", + "3dcccccd 3f800000 3f800000 c0a33536 413a4ab4 40d4ac8b -> 00000000", + "3dcccccd 3f800000 bf800000 4157f432 c1337389 40a57d9f -> 407c284c", + "3dcccccd 3f800000 3f000000 c0eea85c c108f7a0 3f5dfdd6 -> c13459c6", + "3dcccccd 3f800000 bf000000 c19d136f 40c494ab 40b6c19d -> bfca4390", + "3dcccccd bf800000 00000000 3f9b18fd bfbde004 407134a3 -> c0174890", + "3dcccccd bf800000 3f800000 c1691aae c1953793 4012733e -> c182d3b6", + "3dcccccd bf800000 bf800000 c12f033c 416b20ab 3fdb3384 -> 00000000", + "3dcccccd bf800000 3f000000 c19464e6 4169b856 40790969 -> 40e06f9c", + "3dcccccd bf800000 bf000000 c1366980 4118161d 401d7da0 -> 424046ce", + "3dcccccd 3f000000 00000000 c19f619b c1077268 40cc2748 -> c12f17f8", + "3dcccccd 3f000000 3f800000 41929a22 3f88c9a8 3f1fff83 -> 42931818", + "3dcccccd 3f000000 bf800000 c1903f1c 4196fb7f bd95c3e1 -> c1903f1c", + "3dcccccd 3f000000 3f000000 c1787cf7 c1789994 40be0b42 -> 00000000", + "3dcccccd 3f000000 bf000000 41890311 c186a716 3fee9708 -> bf8bb6c0", + "3dcccccd bf000000 00000000 409d5ca7 40dbbfd7 3db65c77 -> 41d6801b", + "3dcccccd bf000000 3f800000 403571c7 3ef3cd0b 4089eede -> 3fdeca9b", + "3dcccccd bf000000 bf800000 3ee91a8f 41400bda 40ffa95c -> c177196c", + "3dcccccd bf000000 3f000000 c1108af3 40bb68f4 40b581d0 -> 3fbbc4e0", + "3dcccccd bf000000 bf000000 bf73a91c bfbd6065 40827f79 -> 00000000", + "c123e72e 3ff83c40 bfef615d bff6dc59 418b73d5 be82d35a -> bff6dc59", + "c181ee28 c11f080a 40ea4495 40f83ef3 413db6ca 3ff7c3e5 -> 40616852", + "410a2e6f c1011edb 40f2e7b9 411beda4 c189e4ef 403467f0 -> c1e457f6", + "c19ea7b4 c09ee11e c0ed6901 418b54dc bfbb520a 40dbb0aa -> c2dfabb1", + "41708337 c062b9c6 c1017d8a 4191e3db 4154491f 3fe18601 -> 42504cfc", + "c01e7a84 bf09958e 3f8eeab5 c08dc0a8 417f0083 3f7ffd67 -> c2831199", + "c184a2fb 41120a8e c10456fc c065b5a9 41800f71 4020fda5 -> 420d73cb", + "4062f130 40809220 c115bb04 4165dadf bfc9760e 40cd5160 -> 4165dadf", + "c0c0c41f be553b2b c0a35082 c169a285 3fa11060 3f574a4d -> 41b8efa0", + "41316f36 4048ac1e 40fdb1c3 3fee0a77 c10eb98b 40b4e2ad -> c198f1a4", + "c07a0f1f 40d058f7 c0207c76 c19a9e8c 4124e1b8 3f850523 -> 4216cdd7", + "41197871 c0fb217a 407c9be1 40816126 418f043e 3fda8132 -> 4211d5da", + "413a1a6f 40ae3f18 411ffc7d 40a1a1e3 c119078f 3fe83771 -> c198f05c", + "419b5ecf 3fc3280d c05092d6 4190a410 c15ae667 3fb9ecbc -> 436cbdcb", + "40844842 3fdd4c75 c0c6fe5f c19bca73 c12ced9d 3df6fb9e -> c2b6a9cc", + "3f91bf4b c10937f2 c09f2ef6 bfc3ab36 412bad7f 40bb6c2d -> 4210948d", + "402c2908 3fe46cac 4074b2c1 40c1ac4b 4183a264 be2ed6d1 -> 40c1ac4b", + "c10a5c85 3f718841 bfca1077 413bc9b9 c1443619 40edd74c -> c2b72f68", + "417808a5 406671f8 c0d3d1cd 40bce084 40001563 40eeb3d6 -> 41321d48", + "c1978e60 c119d058 40623925 c1800e9b 4175c58d 40c12513 -> c227f7e4", + "c0c279da c0a63e23 41077e61 c10530fc 4060305d 409ef546 -> c12b4982", + "415f1d79 c08f2298 c1069412 4071c7fb c123f85c 40fccca8 -> 429cb15e", + "3ff5ad1b 40a5f3b4 3fbe5a59 c17a6f9e 410ff7e7 40f790da -> 40d4d990", + "bff4114a c0272b41 409e2d95 c117c791 c0a72320 bef47124 -> c117c791", + "c19a5c3f 40d3177f bf63a736 40f99bdd 4023c4a3 bf4b5820 -> 40f99bdd", + "c0271449 c0a6b52d 3f197c06 c1712cf0 4021b0c3 401d1fd3 -> c0fcf313", + "3d08f4d3 40a14e52 408fcb9c c01a6043 c1891dda 406a6f9f -> c32b463b", + "c097438c bea14e6b 3f557b9f 409fde38 41975f13 3e50f995 -> c3a81804", + "c1787ba2 403d98e7 401c7b64 40d8ee4c c1279f70 40305dcf -> c450126f", + "40a0aaa3 40072601 4107a613 c0ee673b c1046822 3ffb0368 -> c0fbdee8", + "40ac12ed c0f1b2e4 c00f4e35 c166f086 418d365e 40e812ac -> 4294195d", + "40f674fa 4108d853 c0ec3e94 40323d0a c1195c6f 3fc8f916 -> 40323d0a", + "41329ea1 c03f8078 406638d6 c19ae164 c18e607b 3e5d5dee -> c09ccf4a", + "c092ec27 40b16e5a c10fa27a c1566ae7 418055e6 40ec5903 -> 40d0fd4a", + "3e446c0a 41151591 c11c8173 412ccd9b c11a296d 3feddd0a -> be493fc0", + "419f0cb0 c09db9a9 4085c406 c0bf98b3 c0abf64b be679527 -> c0bf98b3", + "c19dc5f4 c0900b5b c0e94c35 bf979abf c14f9a65 409e9986 -> c29a9f95", + "419abf4c c0d45ed4 c10f13a9 c190ee35 c0fc8c35 40b49f3b -> c319f832", + "411e6899 3fa6820e 40f3a0d0 3ececaa7 bfe1fd30 40a19481 -> c04220d0", + "c1111ba2 c0e5e613 3fe94a4c c181d4d4 c189c205 bf4fc2ea -> c181d4d4", + "412ab862 c114e65c c01e3390 c12e327d c1072253 bf5cc5e2 -> c12e327d", + "40a23041 41032dda c1188aef 401cb454 4102dca1 406598b5 -> 401cb454", + "c0beed1a 4117287b 41100b3c 41830e31 4110ab35 40051402 -> c3b2e668", + "40e83702 c0cb27c7 409d2a79 417835d8 419e0e04 3f83c435 -> 41be1041", + "41962893 c0de8053 40f29b0a c15ded7f 4152ede7 3fc1265b -> 42675f1e", + "c0b5178e 40883c83 c0c511cb 4104ba4f c0707ed5 4027f06f -> c0af81fe", + "419f1c3e c0430cb2 bf912d25 c0c7f027 bfecf269 403a2d86 -> 427d1e67", + "41369e8a 404bfb44 40ad2439 c18ce206 3f9530e9 4083cf0e -> 4280e128", + "4160973b c0d4c476 3f577b4c 4176fb38 41570604 bf6389b0 -> 4176fb38", + "4069e3d9 3ebfecf7 c0b9cd94 c0fcab0d c19a814e 40f46af8 -> bed80a50", + "c192ed66 3f279d8d 406c4f8e c01823e1 413e67e9 4099afce -> c2e0be15", + "4142553f bf7cfea8 c0d06f06 4152ae40 c186d5bb 40e5620a -> 42c1dce9", + "c158bdca 40c08070 40696ae9 409318a4 c119c6ef 409891a1 -> c3077636", + "4109096d c00353b6 4117d7b9 c12a023d 40f7657a 404dbe12 -> 40d0290e", + "c18064ef 4118a1ab c0b565c6 415abdda 3e7ffb3a 40c4d47e -> c14833f8", + "40d1edd3 40840c71 4081de4e 41204b5e 40d682b9 40a4bc57 -> 4317aed1", + "40d49f5e c05f53c0 c119f3a9 40c120be bfa4e88f 40f67a53 -> 41a2613f", + "c09a635b c0e40d40 4104a8a5 41639974 412e7db4 3f10ff91 -> 41639974", + "c1937e6c 40d94643 40cb9507 418d1e3a 414151fd 400a8261 -> c3e5fc2f", + "411a7327 405b1752 40130cf8 4153889c 41428b39 3f805000 -> 41cf7512", + "4123e75f c1073e8c c0d4a4a6 c13b2b45 c15a4730 4056de7b -> c21708ef", + "c13f38ba 3eccb5be 40ad0480 4191a10c c15ba525 40d8d2aa -> 42e0e99c", + "418bb856 c111c6c6 c0095b07 c0cab3cd c1108044 40d21f38 -> c18eacda", + "bf3302d0 c0d7442f 40ab75fd c012ffba 4179ac2f 3f79ced2 -> c012ffba", + "c183e065 c0bf72af 408a1e0d c15801d4 3fb7b46b 4081e236 -> c20e50e5", + "c197d7bb bff7e463 40a2d69b c00b0cfa c199fd91 407e9cec -> 4256822f", + "40d71c6b c0bf105f 406343c2 4055eb2b 418288c4 40bfe859 -> 41b681a3", + "3ebde0e2 41135529 3f894ca7 416f700f c147eb11 402f7bbb -> c1c8c0e8", + "419bac44 40eb9800 4098ee91 419c9fd7 418a38c3 3f8ae532 -> 42231b91", + "418ef304 c0201ff2 3fd51162 41349578 c0839a9a 407cd77a -> c2a4864e", + "c1942559 40dcc945 3f0e0150 c1442a94 c06e9412 3fd9d1ae -> 42178615", + "bf6cf2ef 41149e91 c0385575 bf2052f4 c1275574 bcc1e8ef -> bf2052f4", + "417c29ea 4089b3b8 c0f05f0c 3fbe3f35 c052509a 40e917f8 -> 40ec4130", + "c16cf157 c02f81c4 c117ef07 c1122f5d c19b0ba4 40ba99b4 -> c1f1bdc8", + "c1972bd7 c111578a c0d5b933 416a0b5b 4018da94 3ff5062d -> 42b6b53a", + "4198da52 c0ae2e69 c0838750 bfdb349d 400a719c 4080068d -> 42aed29f", + "416b546a 404f287b 3dafa32e c192576e 413570a9 40ae2387 -> c314fb25", + "416e5dad 40f4dd57 bf323c80 412b00de 410800b8 40a657cf -> 4153670b", + "4002b7a6 4088ab64 c09265bb c0e75cc3 c18a2957 40969224 -> c115d24d", + "418ddc57 c0f6b528 c119f487 41584a2f c19a37e2 40baccff -> 44033095", + "c14f47f5 c0f14c7f 40b0892e 414b8d81 c1261c20 400b0cfa -> 4207f598", + "417dbfe0 40308f05 c0997ee1 41984685 4147966f 40b486e7 -> 4203f46b", + "4184e124 c11a652a c03ce6b6 4153aa28 bf8b1cf5 40db6c20 -> c2459e59", + "c09d788f c0a56207 c05b65e3 c176a78e 4106e6ca bf5874f3 -> c176a78e", + "40d6906a c0057ffc c113f630 41771c2f 4135d6d2 40738bc5 -> 41af02f4", + "4132e0dc c08d4fd4 c01b0e7e 41882c7d 41987e03 40ba68a4 -> 420e5265", + "c1728b62 40532e59 40a5c92b c1720020 417f7100 bf56038a -> c1720020", + "c03825f9 4119be0c c06e734b c1824e3f 41860074 40aa7947 -> 416b86a6", + "41722176 c094c354 c0c2bd88 410ada22 4099d695 409c7b27 -> 42932c9b", + "412fb3b7 c0739691 c07d3497 c18ee3aa c118a6b8 406503ad -> c485512e", + "418aebd5 4081db0c 405dfedf 4190e420 411ab540 40996590 -> 4378d115", + "40583619 40bfc343 40f9ae74 c0b6956d 414ca2c2 3f5711dd -> c28f80f5", + "40da8fc3 c0b3595e c0d0ee9d bf6cecf9 c19784b0 3f1a3a42 -> 44243a4f", + "c087f138 3fa6c067 41074474 c18daf2a c0214b7f 3fe672ea -> c22c16db", + "3f409334 400c2389 c10a2453 41880fda c1685f38 3fb13e47 -> 41880fda", + "c190962c 4105f6c3 40f3de45 c192629c 40de2acd 408c3993 -> 4485cb7b", + "c18787d8 400159af 3f88bca3 bfce58eb c0b57d11 4096beef -> c2c5f973", + "408058cd 41109e84 c081bbd3 c098d80a c11896a0 3fd3a158 -> c0f4faaa", + "40a359c9 c0bc293f 40d7f319 c11ee0d3 c154f001 40f5e62a -> c1501f86", + "c16f30e7 3f1d1a73 c031baee c18e1e56 c0a05782 40704787 -> 42564d13", + "c183476c c0db1c8d c07fbe01 4193c95c c1593350 40a528c8 -> 4314df22", + "4192e4b1 c0c51bc6 3f847372 c1380d19 416ccefe 40bbe755 -> 42b70d46", + "412310a3 3f5dbacc 409c1478 c088342c bf2434d7 407208a3 -> 40c84460", + "c0a752cc bfbaee33 3f8b4526 c1653e54 c19800f8 40b84460 -> c0c6d09a", + "c04e2f84 c03bebc5 c0ef78d1 4184b5d0 41575a8b 3fe5285d -> 4184b5d0", + "415cc176 405ba2ca 41105915 4081cb43 c08243d9 40947ea6 -> c1574fac", + "c1341144 c0c54544 40f752a2 c018f5cf c153c4ac 40b4cc92 -> 405798db", + "3ff9a8db 40bb8095 4103d6bc 4112fa6e 419c4031 405226bb -> c1802577", + "c15705fe 40d5fb8e c094edd4 c061ff5f 417fb12f be09d130 -> c061ff5f", + "419fb1dd bd840f3b c11148c3 409f0f85 4169600d 3ebb53e1 -> c2c84d30", + "c1895543 c0a32d0c bfb717b8 4104495b 4180d18e 4084f498 -> c1be4c7a", + "c192af53 411af67e c116f40d c1396738 41448c5f 40407543 -> 41e0d574", + "4067c9e1 3fe52ff9 bf378357 40807a74 c19bb9b3 40e75682 -> 41d60197", + "4182ee1e c0441d3e c10fd915 c12375b4 411f9784 40b991be -> c2b497a2", + "c1295ee3 c0239259 bf921174 bfa00dc4 3faf38ce 40c8e67a -> c1963027", + "c01582e7 c10b564f 41112e1c c0bf15d1 c1467caa 3f88d8a6 -> c0bf15d1", + "c0ad6948 411d8537 41109ace 40a9bca4 c15f8155 40bda4ea -> c3d0bc79", + "4014ccf2 c0dc1a16 41014106 c10182cb c03aa9f2 3f084c2b -> c10182cb", + "40a6b6bf 4103c12c 3f94f407 4187692a 414cfe63 40d2c0f3 -> 4170d622", + "400f6cda c0adc154 40f1ac5a c0a463e4 419371b9 40dd122a -> 410822da", + "41503caa bfade438 408cf904 be90f851 bf88698d 403211cc -> c0342167", + "3f207b4c c0c26641 4118f155 c15b012f 40cb2c29 40388da3 -> c0d7a879", + "3ef707fd 4071f3de 4111274a 417c24c7 410b86af 402803a6 -> 41be6b54", + "40ba8bd0 410607ab 411769d1 c147b4a0 41864a65 40ba81c7 -> c2c3b310", + "c064fee6 bf85ad4e 40f05b11 c16c6cba c14fb3fa 3ed43a46 -> c198dba2", + "419b5b62 40f3ab34 c02ebaf1 c18be115 c0cd2269 3ff8d4d2 -> c221166e", + "415b0488 4029f87a c016fc38 405de869 416f7331 3fecc36e -> c2202fa9", + "418f0e0a bfbd4a75 40587544 c177836d 4159c6b1 40adcecb -> 42ecc3aa", + "c0cd9569 bf35bbba c073d592 c18e37ab c13b1498 4093f2f7 -> c093bb8e", + "c196c074 c0945e9c 4089e732 c18ceeaa 418569ee 4018ef51 -> c2cf71f4", + "41835e4f c06c6779 40093280 c0c300e5 40efc0c6 40e94cba -> 42385677", + "c0d7a99b bf0baaa7 4096e498 3fee4323 412f41c9 3e955758 -> c271ecf0", + "c183f587 3fa0066f c0d16410 414fb5bb 4195af7d 40abed2b -> 41df4754", + "4163cbaa c10b74ba 40a15381 3ee825b7 4199454c 3db29ca1 -> 4356ef03", + "417839c6 3f1167b2 4093dca5 4178560c 40957569 40ec5124 -> c1e474fa", + "c11c101b c012b8b6 c093ec77 c19daa9d c1784970 3e8ff601 -> 421f9e0e", + "4198782e 40c2223b 40fe3db4 c02acaf2 c0acb2af 400f5c80 -> c1ebb427", + "bf9f82f3 c0277d2a c0b306ef c0ea5e02 3fbe5e19 3f4dca06 -> c19247cf", + "c090bfd1 407eb620 406783ce c17b03de c0fa57b9 3e323a78 -> 44968d74", + "41033b01 c094fd73 bd630111 c14ca47e c0b90131 407a1547 -> 41286fa4", + "c18e5210 3eed6ee7 4076fa16 419f5753 bfaed75a 40158361 -> 4337e864", + "c178cd26 40f0a5be 40d88aaf 41418963 41469d57 3f77612b -> 41fe6a46", + "40cb9c83 402e75a0 c0b1dd61 c141db7d 40f285ce 3f0d7330 -> c23f0abe", + "c1157c0a c08adef1 beb45251 40db4b33 bfb552a9 40ef0fd6 -> 41983bb2", + "4188a153 411aede4 c109a5e0 c0044c7a c10bac41 40a040c2 -> 3ff64422", + "c0a576da 4038f5c3 3f386785 c15bd785 40c5c237 40892698 -> 4295225e", + "416ba70a c02b6ea6 c0613c29 c125173a c1167aa1 40e7c9a0 -> c1ff054b", + "c15397db c0d3c96e 3f76b6c8 400a6445 c08fa34e 40c5b8a1 -> 411b2892", + "417863bc c0c88b6c 3fff3063 416acf74 c0a8771b 3f36eb3d -> c2c1e746", + "c15f4abe 411f195e beed433a 402e1360 c192f4bb 404d6e11 -> c261a618", + "c1551ac1 411d1306 c0a67270 c19135f9 c15fd7c3 bc980d7e -> c19135f9", + "4193a363 3f3e2eaa 40985960 40942db0 41879b37 40d7e6ad -> 42856ec8", + "c191c6ac bfca49f8 4008a0ba 4107a7f8 c19d408d 4058be73 -> 432ea1e0", + "bf9b6d81 c000a3fd 410b088e c151da71 c1810cc0 40a1bcfb -> c151da71", + "c19b7487 bf86f001 40643290 3e105aec c0ae35b4 40e1a8bb -> 41d236e6", + "c19bbda7 c0317ff3 410c7f77 c1429ab3 4074db52 3fd7646d -> c248acc9", + "c16c838d 40a4c079 be77a5cc 40f23aca c12c7e60 3fe9e672 -> c2b9b449", + "bfc8e1ac c1000a3b c0c4f881 409f54cb 3f98c013 40c27a5d -> c11f88d8", + "c184399b c0a92143 c0f13b43 40b84e9f 3fd0180c 40b970dd -> c18e3f2b", + "40536a53 c08fc9c3 3f11ff65 41838774 c179f7ee 40384d69 -> c21cecb2", + "c1429324 c105f5bd 3ede9e90 c18490ae 4081b20d 40cf076c -> c1ea92b4", + "40f04aa9 c1183989 c0767b4b 4067a7f7 c103457d 3e04efe7 -> c386cf49", + "415bc9cf 411183d6 40fad3d3 418dc398 410fb70e 40bc497e -> 42615539", + "c0932033 3fe9e13a c0001e85 41977f14 c11a151d 408a606a -> c207a6dc", + "c0b5199f c09a777d 4021a4d9 c1029f60 c199d588 40f2c7ea -> c0d692e0", + "419a94e9 c08ed5c6 c041eff8 4053e116 4028495b 4080598f -> c12c8d0a", + "bfa1bbbc c0bd5afd 40272d1a c0d93ab0 bfdcc08d 404fa22e -> c06aabd0", + "403b3c30 3f819783 c0810ed2 4170d101 404a339f bf6de4bc -> 4170d101", + "c1538d44 410ea5df c1038115 c15d50d3 4127c4c0 bf3f4cf5 -> c15d50d3", + "41628f0a c06b5a86 4069d6fb c12edd51 417b7f46 3e9383e2 -> 438544f9", + "c1382c12 40bbecbc c0f04d85 4125cb03 410daad4 401c9ab9 -> 40fcb5b4", + "c0773703 c0d16321 c0e95d1d c16ae362 4183271e 407d9754 -> c31bd836", + "419a3bc5 bf92cea5 40b65319 4194ebc2 4188ee0b 3f5e6a85 -> 411fd33a", + "c19d3808 c0cee0c8 c11f5d6f 40836382 4138c9aa bebea046 -> 40836382", + "bf92907e c0969a1b 3f1d6d39 c17d32d3 c137de28 3fb71b6e -> c14cbbb8", + "c031be2a 40f60128 409964a4 c11128d4 4188595c 3f1cae6b -> 434c481c", + "412d56a5 411839d7 c116fa56 c156d0a3 413088cc bef7e820 -> c156d0a3", + "c1964f1d 4070584b 3f6b3af1 c1831080 c1906268 becf0779 -> c1831080", + "c0b7c1f2 bf8cbdc3 40ca18a0 40ed7fd8 40185336 3fc1c215 -> 416154e6", + "41373ece 4098f23e c0e7c347 416ba5d4 c11a0a5e 4007a952 -> 4216d508", + "410b81a9 410bbb35 410f0e10 c032fd68 415b424e 40b8d2f3 -> c0b4e9f3", + "41925148 c0b8ea8f c09ae4b6 40e57460 c181c192 409cdf42 -> c43252a4", + "410fb352 c047d33a c088357d c168c4ea c113ccaa 4023d7b2 -> c2bac09a", + "c0fef3bb bf80390d 3f4c6e5d 40ac036b c063cee7 409c8d25 -> 423d869b", + "400ac498 3f96f769 c055194a 418910ab 41104196 bf40d77f -> 418910ab", + "4193f910 c08f5ff7 40e4386e c117eb27 416c1f1a bd1c37c7 -> c117eb27", + "c02d7910 c0c9c795 c112081f bf930144 418c041f bf179cd2 -> bf930144", + "c0b74162 40f5e59f 40f19f99 bec67e5a c0fb6cf3 406684e1 -> c46f9d87", + "c048ac72 40f3ca52 4095d9b3 bf7ecfc8 be374cf5 400d1acf -> 4044f750", + "c1858791 40c5aad2 c064e78f 410515cb c0a295c1 4070a78a -> c1f705dc", + "416db735 3fc1a156 40589023 bf8617a4 41888bff 40f45a4a -> 430fabbd", + "40adfdaa bec93f13 4008d3e6 408f253b c12a27d0 4039964d -> c214d3d9", + "c198a966 40383183 41198062 419754b8 c184292a 3dbbc118 -> 44c3a1ff", + "c19602e1 c0c499bd 409d1cd2 c0a8f517 c035fb98 3f283a2c -> c14b1fa0", + "c109205d 408ae1a0 c0ff508d c0f7a67a c1769760 3f966aab -> c1a66201", + "c18e49dd c0a4f6b3 c0f81cc8 c0fd1eca 401d387c 40f05d7a -> 4242b2bc", + "c13962f5 c0d8de1d 401e9bb2 c169433c c1898449 40fcc52b -> c14ed280", + "4121abfa c07756d5 408ede25 409d0f12 40fedbc1 40617dd9 -> 412fae9b", + "c0137cfb c0f319ad c006d07e c11a4a25 be5d9099 3fc151c6 -> 4035c3fc", + "41073ff3 407dce02 bf39fd79 4194c641 bfed2115 bf0a623c -> 4194c641", + "c17962a3 40ce2d4f 408c6e01 c1817fbf 41676e9e 4014226e -> 43dfa7ea", + "c112ab58 c0284990 c0f2ff42 be6ae929 41142ca8 4096e2db -> 415dc0bc", + "c177fd64 be1e9332 3f5d99f7 40deaeb7 40328890 408a980d -> 42a9dd6e", + "413933a1 c063f927 c10fafea 4108ac55 c1416ac8 402e6349 -> 42b7a7b3", + "c0b30ace 3f455f34 bf05c8ea c0584553 416d9a4e bedea771 -> c0584553", + "40d9f92a 40ccc3ee 40dacb38 4199d0eb 4156242c 4097383b -> 4150b680", + "c186ea19 c0c34743 bfc7b84d 40d22ab5 c1642c91 3ef47ea6 -> 4335099f", + "40a709f1 4119d441 3f4f99cd bf9cff69 4177a7d7 4073c36f -> 40f172b2", + "4115c116 c103f9cb c04ff4c9 bff8c9fc c143c6b0 40c6b330 -> c22d8794", + "41832e2e 40b5d1e8 c0f5797e bf48b215 4185b904 4025650d -> c1a8c91d", + "c1615d2b c098500e c10e77d0 c18dfd22 419805da 3f8e137e -> 42e562a8", + "402922a6 3f856ff9 c0b286b0 bfc80ab9 c10570b3 40cc39a6 -> 3f0f9e02", + "40e96f20 3f8db792 c0aad0a5 41892d6f 418bb48e 40c427d3 -> 41864a74", + "40687263 c0fccfe8 410dd331 c1392a91 3fcab87c 3f990412 -> bf1131f0", + "c00e975a c08fa56f 3fe37edd 417d9e2b c176072b 4052a670 -> 40cba12c", + "41330780 c0a686e5 4116fbda c0ab6596 c0dd5693 40fc379f -> c0e46c6a", + "c0a53ac2 41143a2e c0b61cf3 414e2f73 bfceda1d 40337f1f -> c02814a8", + "c162c1f0 c0e82c11 c0d2603f 4171d8b3 bf9afb2d 40810cbc -> 4361a126", + "41873683 c0e0937a c115b89f c166cf2d 4090456f 3f1eb208 -> c4056a98", + "41889f70 c075a50d 40c15e44 bf015ab1 c190309f 40b872df -> c22c3878", + "c1200f76 c05282ef c0d5703d bf9e7e7e c18ee641 40a533ef -> c21f84e0", + "c046e6ec c0ce49f4 c1190b9d c137eb6e bf9331d7 bf14bd57 -> c137eb6e", + "bfe0d620 3fb3bce1 3fc4edef 4184ef87 411f4aea 3fbcdece -> 438d7b72", + "419c4b86 411019e0 4109bb6c c119b4eb 40b71760 405fcc9f -> c404cf10", + "c062331c c10c457c c0234a8f c19c1518 414bb1e0 401cf760 -> 40d8ff74", + "40c89a1c bfb75575 c0dc940e c18edf38 be85cc0d bf16a990 -> c18edf38", + "41578159 c11d663c c0fe9538 c11eae0f 41765d33 4082558e -> 43bbb883", + "c014598e 4061096d 40bfa532 4079d7c5 4136d648 4075793f -> c19d13bc", + "4195182d c1138938 3fc0774b c109091b c0ff8b8e 3f15e584 -> c0938355", + "417f72dd c117d7ca bfba12f3 c157eee8 c006cbc9 40c32136 -> 41dcc554", + "40fb6b0b 40e79260 4079d6d5 406a7764 c134f5d5 40ace7fd -> 41134b55", + "4118c1eb 40112fc7 c1036f9d c1951f8d c18b1e3d 4015331e -> c1a1ff9e", + "4185ffb1 c00cd639 c11872fb c10c6902 408f279a 3ec36a6a -> c313a164", + "4149363f 40bd678d c08e828a 4072cabf 41587f4e 4045f328 -> c0b4d638", + "419241f0 c0e1eb84 bf14b22d 4188d248 c1289263 3ee4c73b -> c392157a", + "405f97a3 c0ee6f5f 40ba33b2 412ba124 c1026a7b 40839e7f -> c0f438a4", + "c14b836a 4077629c c05d06d8 c1437532 41079adf 3f38c4b4 -> 429393ef", + "3f01a55b 401a7ef8 c0fe7efc c0d58c97 4047c715 408deee2 -> c08ee1ca", + "3db79cf5 40b3a470 c0f98852 c17e6d5b 3ed30e61 40932743 -> c10ce730", + "c137d712 c0c684da c0c3cd57 c040827f c18538ab 3f1e8c02 -> 450ae2f6", + "4041a68a 3f4766b5 4056278e c111706e 41932ee9 40b3ae27 -> 417631e0", + "c0900fc8 40f7f744 c0e2cbe5 418f401e be07e652 40850f4f -> 3f0da180", + "c1943e2e 40bd369d bfc37640 419d018d bf2a2df9 4075dc68 -> c26e67fc", + "c18a35a9 3e97483c 40fa17d0 417bb44e 41966712 40abe77a -> 40e5344a", + "41805b76 41027632 41124265 41248dac c1662242 becffc18 -> 41248dac", + "c17a3bb3 c0c85311 40a32480 c0bf459d 4167f70c 40e27098 -> c1d1da84", + "419ff7a5 40fa12a9 c0f22da2 c00ac833 41255d2e 40ada994 -> c17fe145", + "c1354ec2 c063d161 40c70f51 c1059d98 40359374 be12034b -> c1059d98", + "416081ba 3f9bf926 bf3320e3 c07bdfbe bfe1dd24 408f5942 -> c1aeef47", + "c07fb272 c107f286 bfb71487 c11d5431 c0b64494 40d9f505 -> c0ece8b1", + "c154f5e5 40b55184 4035c83c c1714484 41280dff bf093958 -> c1714484", + "40f488fe c03de281 c115f162 4121931e c0f24ae4 3e9b5aba -> 4338cdb5", + "414d5f7d 4007981e bfdc3565 416e7e45 c16b96ac 3e56cc48 -> 4410fb30", + "41865104 40313138 c0aed66a 413ac2b6 c0ff2ee0 3fd4a5d4 -> 428d9b70", + "3fc7faff 40f32713 c0c2ca42 c154852f bffc8100 4011ef25 -> c1052926", + "c154cf72 c0d4c2a5 bf52f051 c192f895 416fd6a7 40dca221 -> c28583e3", + "bf7d6ca2 40f6ba5e 411e2733 41000d24 4118a7b4 40992a34 -> 3e95db70", + "c081d363 c0be1861 c0c9af1e bf3c3e39 c19cd102 40f565a7 -> 42e0df0d", + "4139da93 c0b358ac 40eff88e c0aaf923 c194c416 40b3d110 -> c1c1af52", + "c182a0db c0e2a4b4 40fca945 c1980938 c0f0ba06 40b8bf8a -> c1e795fc", + "c11e1c6d c089dad5 3fd24dec 411f900b c077799a 40661b82 -> 41e9bfa8", + "4080008a c0eb7f13 40b2d66b c016dac2 414538bb bf135f23 -> c016dac2", + "40d996e1 c0c70d46 4065a60c c13b9f3a 415fac09 bf37032c -> c13b9f3a", + "4109dab1 3f076124 bf99eeff 4184f442 c102ee67 40cc2cce -> 4318ac48", + "c1851cde 400a20a5 c0858329 beca59b3 416bdcdc 3fca8897 -> 42852324", + "c10b317d c11f979b bfbb0e05 c176aec4 c182fcab 403ef45e -> c176aec4", + "4159d8cd 3f5bd0d7 40c3bd9d 40cb0d7a 41559729 40b0f7e6 -> 41cabde2", + "4146b57f 3f5cf7cc 40a5778f 3f6df7d6 c035e412 3fe1b398 -> c160b0af", + "416cd450 3f991c3f c0e584fb bf14bb04 c034f416 4003960b -> 409c3978", + "c10227ba 40795c62 410912a0 412ab3d8 c09a7782 40f08858 -> 426017bd", + "401d4dd9 c11c71de c031fd9a 4054ae8a 3f09bf52 407abed4 -> c0174756", + "416a2d25 bf98b663 c0a9e8ea 411713b7 c183463d 40ebe1a3 -> 42fa59d7", + "c1861366 3eb35c40 40163ef8 4104a4ef c11044ed 4084139b -> 4340cacf", + "411527b2 41159d8e bf6ae6ff c181cf22 4183631c 3f076776 -> c181cf22", + "c0f576b8 40afabb1 c0acd044 bff3f805 c0af0037 40af734b -> c0ce8c75", + "bff0198f 40e21a27 41078845 41678d5b bfc2d55d 402948a8 -> 431f9861", + "c15b3476 40bde615 40305b09 c196e55f 419d7f50 3f77cdfc -> 43e5836b", + "40e0fa1d c11c4ebc c0be9c37 bfd60d8d c0ee20c7 4026fcf5 -> c20b5b1f", + "41161a8a 40e494c4 410f30ae c09663c2 41857fcc 40d4b0bb -> 41c214d0", + "413ab12f c0d28823 c04ccd31 3f5bfe32 bfec74f7 3fcb5433 -> c1aa54da", + "c04e2936 40ea7935 c0955d3f c1001ac7 c1910d15 3fa4c7e8 -> c1bde3e9", + "4172ad8e 411bcca2 409c035b 3f9fdca4 3f90a4b6 3f5276b7 -> 3fd76538", + "418e2cf8 3fa34c5e 40331a40 c19a0bcd 41738ded 40139e9f -> 43fbf557", + "417730a6 c0b8b0ee c0cf4ea8 41792edd 418fde9a 40b7430f -> c28ad85d", + "414f84df 40870be7 3fa8eb0a bd01b4fe c023febe 4032e880 -> 412d505f", + "c1594cef c0f777d5 bf72aeb3 41106788 bfb4e22d 40377257 -> 41bcbca7", + "419d987b 4036cc09 c0e00348 40b5de31 c014f3da 40d1f782 -> 41ac703f", + "400ab3d8 c1114242 c10b2a6f c03a5cd0 c030b894 40e16bfd -> 400a0376", + "c16fb72b c117e6eb 410f99b9 4183cf14 c09a8fb7 40098e85 -> 41d31cd1", + "c127a60a c11b36eb 410f7a77 4137364b c14d1beb be254892 -> 4137364b", + "41012c33 c0155314 405b5f40 417a9b1b 41283536 bde9ba82 -> 417a9b1b", + "c15508a4 c112a74f c1100d1d 415b3a2d c18662c5 40d74eaf -> 4463cfa6", + "415fe545 411953e3 40d94c20 410d2a63 411087a5 3f4bd10f -> 41007d16", + "c0a772a7 bebdebe4 411a0547 418c365c c18c0ff8 40eb11db -> 42257d94", + "c0e06006 40c0f086 40694b4b 4173e5e0 c0c68ed6 40ebf913 -> c2e749b4", + "c1287049 c0dc5130 404add12 412c2c78 bfdec8fe bf3e4668 -> 412c2c78", + "4165d405 40a6de6b c0b5e210 415301a0 c16e954f bf3bec3b -> 415301a0", + "c125cf7c 4099c4a9 c107fe21 4193fdf0 412f8a7d 400da8ba -> 4104bd55", + "c0c84680 c0042ae1 40a810a5 41514e65 419cdbd8 40e7fb3d -> 41094aec", + "41087a47 c0b980d5 406cc3b8 414b2a69 4191ff54 bf0ee6f5 -> 414b2a69", + "c1987609 408b7a4a 404dca2b c16d7a39 40ac3e6a 402203ed -> 440c1904", + "c11e5c8d c08a2e49 c09f0881 417a1c77 419b9370 bf4858c9 -> 417a1c77", + "c1098f0c 3e8275cf c111a747 c02c9f0e 4176f95d 3f46f3c8 -> 41a5153f", + "c0c57d4b 3f286ea2 c1163a49 41937e70 c150a3c5 bf653323 -> 41937e70", + "c113e3f5 beaf5c9f 410b2870 c16fb265 c16fd011 402337a2 -> c16f83db", + "c1854c6a 3faf2a2f 4086baf3 41142323 c16e1521 bf3fdbbd -> 41142323", + "c022a93d 40dfd599 3fac66db 40ee4497 bf54232a 3fa42406 -> c13e97b4", + "c07d2222 41170059 40dc3e03 3e33d9fd 418aa0e6 404b861a -> 42e2e525", + "4116801a 3f01bf08 c11e62bf 41244a2e c0d41a8b 40ddd61c -> 41daa252", + "413b6a88 40d6705a c05df913 40c904d5 bfb81d7e 402b66d3 -> 4140c14b", + "417cd2f8 411e2ca9 40e9cf22 c1525d0e c192a911 3f9a7138 -> 414a293e", + "c19f8556 c0644a2f 40d46cb1 c1995cbd 4186fa65 3fd7cea6 -> c2fc1de7", + "410bd6b7 40ef304b 4116df41 c17292c3 412cb26e 405187ee -> 3f31c440", + "41326cc9 c0b2e952 c0868984 c185f0e1 c167e3e6 40c84962 -> 4168679a", + "bfb1587c c097df56 c0acbc02 c0a8b77e 410a9d07 400e7aef -> c2df6020", + "c169eadd c0572ae5 410b1035 3f7eacd3 c192f706 be136b31 -> 3f7eacd3", + "c0db009b 40dd623f bfc33a67 4194edd8 bda8fc11 bf605f17 -> 4194edd8", + "bf43699c c0adbc86 3fc6f489 c1666b61 40ec7357 3d2422d7 -> c1666b61", + "c18ebd45 411ec15b c0a1007d c0e81641 bece71b2 bf684ebb -> c0e81641", + "c18da011 c1060120 c003d389 415a46dc c19cac78 bf574014 -> 415a46dc", + "412a0276 411c2f4d c1105cac c0b6f44c 3fcbf163 3fb95879 -> c12c41c0", + "418653df bea4fa97 40b52eea c17a4489 c1577600 3b6927a7 -> 4496e9ea", + "c076a39b c023c493 c0b25db1 418f0cd8 c16aca4c 40d57146 -> 404f4720", + "c187269c bf97c0f7 bfbb1c80 40823cee 41129c7a be07757b -> 40823cee", + "c0ee5ff6 403b3707 c0f69655 40adc879 417fc6eb 40e4f3b2 -> 417c1fce", + "4140d082 3ea2391f bfbe04eb c0ca4d1d c1694536 3f6eb8e7 -> 42d996e7", + "c19ff4bf c0e055e5 408eae8a 40e6c195 bf4dc576 40acc74f -> 4198b14a", + "3f97f6a9 40b8fc6b bfaecd2f 4128ba25 4198dfbc 3f16ddc8 -> 41c89dd6", + "419ebc18 bf3b5263 c08258fa c106661e 40be1086 4024d6fa -> c3087316", + "c0e1b1ad 4004f528 40e356aa c0f3d80f 40f7b88e 4086799e -> c230b2a9", + "40d09500 410f5ec9 c067ef51 4101f25a 413816e8 40b7cad8 -> 410b5f9b", + "4131dd8f c00bb974 bf3fff89 3fe40255 c1961984 40db99f7 -> c355c232", + "c0aeae99 4101f76d 3f2ab6fe c16ff263 40effd63 3fc309ce -> 42303c80", + "c181718a 407c7e48 c11faa17 c1781914 41686c4a 40e2aef9 -> 41f908a2", + "410934a3 bf0dd0cb 4104fe4a c02d3b1a 411937b1 408a7d96 -> 4137bd94", + "c1014211 c0c0046d c0be1c1e beaf2a15 41607fad 3f9c8e00 -> c4653e4c", + "c19a9039 40dc19d2 40a6f153 419a0c1e c0848762 40d92088 -> c3c8b7d1", + "beecd155 4092314e c118be02 41113a3d 3f7be33f 401f86c6 -> 40ba8f55", + "413a39c0 41186bb2 bff1dc62 40ab360f c185aa52 4059a356 -> 413d6468", + "4198b011 c09f94b3 40e7f5d3 c0f3ee07 409fdc79 3fdf1570 -> 41e49fd4", + "40907aef 40d6db9d 3fc7ee97 c0f79681 411796fa 40082e85 -> 3eb403b0", + "c160edc1 c0851299 41176386 c04056a0 41482688 3ed01d77 -> c29eafa8", + "c194a48d 40fdd3c3 41023b47 c190d82f 4092ef8c 40fc669d -> c54d9f58", + "bed5ce7f 40d22473 40858eaa 41865b3f 4041efc9 40e061e3 -> c1e2d4d1", + "c0f7f032 40a9ffa4 4115c76d 4119fc72 c1427ecf 3f1f59b6 -> 435b90b8", + "c14663cb c09197e4 c0d89bdf 4196a018 4148d505 406d6132 -> c103ee7c", + "bdc006e5 40572c93 c0d4fe67 41177728 c18a706c 40321420 -> be1e9440", + "411e7302 c026e9c0 3e0758d6 c126e51c c0f68ef7 3f8c8732 -> 413ea6c6", + "c196ec24 40211060 c0d7d942 419fa712 418dc1d1 3f3bac72 -> 40f809d8", + "c0abfc1c c0ca9f06 4037f0d8 c1963734 c158b692 409f93a3 -> c1963734", + "4022e3ab c0cbbabb 3edcc712 411e7c73 411d71b6 3ef34c2d -> 411c4b1f", + "40a55c50 4030ce3f 410930bf 3f25f5f6 4124d393 4092884f -> 409baa2b", + "c0721792 c075f0b2 bf263653 c17971c9 41339c7a 40b7ce8a -> c17971c9", + "c0954aaa 4112fb77 c1029003 c1407f7e 40fe1ca3 40d0b85c -> 40caea0c", + "417745a5 bf9abf6d 410f4073 417d80bd 40b99b15 40ba86a1 -> c0470a4c", + "bec52b77 c08b2732 40f314af 403106ef bfbcef9d 3f83289c -> 403106ef", + "4128f060 bd831d68 c0b60314 bff6a829 413f26fd 40bde3e2 -> c20aa33f", + "418aaf7f 40fd0e40 411657a2 40abe9ad c052c703 40b0c14b -> c26bcd3a", + "c0a97ec2 c032afbb 4085b922 3fc3fa4e 411cf037 40ad51ac -> c043717f", + "c12922fa 3edfb139 bf6536ce 41245aa1 c1748373 40c2ef70 -> c3690847", + "4197ea94 c0925c41 c0fc1b94 c16ea09c 3e5a4bbe bf463452 -> c16ea09c", + "415ea051 3fb9522f 4018cd2b 41627572 c1399c7e 40f8b5f9 -> c3b91d5f", + "418e25c7 c02ef071 c0264814 410f1a9a 3fc64fa2 3ffc937f -> c4d1ad4a", + "4195eb10 40872f5c 40f7383f 40653419 41087835 40aac3ed -> 41dd833b", + "410d341c c115122f c0c308c9 3fa3230c 40cf3a33 3fbcc560 -> 423c7ee9", + "4189d441 c07c4861 c04dcdba 411eb3f0 40e40d25 40f116f9 -> c2a3fe44", + "41521521 40fd1d9c c02db184 c1054987 c0402b4f 40a8283f -> c1462ccd", + "40290024 404d4b0d c0c3e751 c174ea06 412a9e22 3fd3c6eb -> c174ea06", + "c18522c5 c0eedaca 40f3bc22 4021db35 c07dd60f 40d84494 -> 40eab296", + "c11178e7 c08024f3 c0a2375c c185c183 c142d54e 4063f4ad -> 4120fe14", + "4194973d c109b240 be887716 c0f0f314 c046c788 be29f4cb -> c0f0f314", + "410756f5 401497e1 410b033b c179fd5a c14141b3 bf48d4a7 -> c179fd5a", + "4059c39b c0e0f9a3 c10a1fcc c09e234b c15bdd36 40f23da7 -> 42709e87", + "419a02b9 bfd6b7c3 3e3e72f8 c1374316 c101671d 3ea95819 -> 430307e6", + "c191134b c0b9332b c0f99dfd 40a34727 41897424 3f49643c -> 431ea617", + "416ffa8f c0cd1544 409054e1 4118ddda c11eff8e 4029db56 -> c2276ba6", + "404f1cca c07c8895 3ea107ca c038e60f c11bca61 40a72058 -> c180019b", + "c0cd9e67 41062482 c082cc8e 410b3c24 4089a453 40480e58 -> 40448566", + "418f5d6e c0d0c7b7 c097833f c14a1be7 c01c9188 40f114de -> 43103235", + "c0d18fcb 4015757a c08e47d3 c1920a51 c0b88638 4024c3f5 -> 3f930e70", + "419fbd89 befdc316 c0c5d287 bf72d9d9 c16441cb 402fe33d -> 4285c8f2", + "c115b508 bd6dec18 c0ecef9d c17390c0 408393c5 40aae977 -> 415bccb4", + "c029699d c057db25 3fa404e3 3ed75f73 bf07c9a9 40f762d3 -> 3e986287", + "c1653baf 3e99d573 bf65dacc c19401c1 40b3301c 40dda430 -> 439dc4c7", + "418c6d0e c0d54b16 408f85cc 40c99a79 c0596b66 bddf5c52 -> 40c99a79", + "c121a3a4 408d15a5 c100798c 410a5d1f 40bbf3df 3f53d76e -> 3ff8ab68", + "413300e4 c104d034 410e1241 c0bebda2 4167c456 4036240d -> 41b63628", + "c0c4e2cf c075d29a 3fcde9a7 c0838153 4188204e 3fd90df5 -> c1e833d2", + "c12f098d 410f1144 c0c23f78 c16dd4bf 403a41cf 40a1d575 -> 41540b95", + "4138a8d6 40a901dd c048cad0 c126e34b c102738d 403aec5c -> c14c505f", + "c0cfd862 c0ffd097 c0e323cb c19a62b3 c125e89b 3ff5d6ad -> bf33c700", + "c0fcec91 c0d64188 409ceb15 c0d2bab2 c08f2baa 408490a5 -> c0e3098f", + "c102ac93 40a1972c 4093fdee c17deceb c04a6768 401d173c -> 44068618", + "4084c6cb 4116e136 bf815fcc be7f3cd7 c171a77f ba0fad06 -> be7f3cd7", + "c121df3f c0f4beb4 407f83ae 4154cce5 c18a03cf 40771bf1 -> 41e90133", + "418163ec 3fd33349 409992e7 c182334e c05d35dd bf6c69e6 -> c182334e", + "405eb558 3e71cfbf 40cfb63f 3d8f7d21 41951133 3f094487 -> 3d8f7d21", + "c18f1207 c0a40603 402deb65 c153ef8e c188e6a4 40f592b1 -> c0b605e2", + "c107b522 c08f9e26 c0f474e9 419388c7 416567e8 4045087c -> 413c6d22", + "405f9b02 c0e2c200 41199fde c180f41f c10fb86e 400ec1c5 -> c11b8626", + "4141d1c4 4103ef87 c11aeb29 c0125b2c 40fdbd35 40e934e6 -> c0a2e540", + "41118616 c0ec2f32 c0cc180a bfd1efcf c00ebcfe 409fa483 -> c153ba92", + "41083cb0 409b2bd1 c106197f 401c03d5 419687f5 3f8b6311 -> c149a571", + "c00f57be c0993cc4 c0980968 c04b5825 becf0900 40f91f6f -> 43511b15", + "c11642ed 40714c88 c108bc54 403063a0 4027d6e5 40fb396f -> 4026967f", + "40e1052b 40ee4094 be3b26d1 4182c358 c195c70a bf54ba3a -> 4182c358", + "c19c5bc8 c022a299 bfa3ddd1 c0d6777f c12dd9d2 403347a3 -> 428d2cb6", + "c0b900e5 3e9fcba6 409d4b36 c1109651 c16370e5 3fad81c3 -> 40c7cf98", + "c195577c 3fdc43cd bd98773e c0c35e29 405f14e0 bf60f5d0 -> c0c35e29", + "bf4a30b2 c0ba8059 411dd7ea c0890a63 41457763 409c85d3 -> bf624224", + "414ca908 c0574d8b 3f7bbc2d c0e2a574 40e6baa4 3f903ec8 -> 42a36681", + "c08185c5 40c0bc39 3fbb182b 4187dda6 c0ff209e 4037d194 -> c2521c9d", + "c0e2e7ec c004d13a c11f5f8f 409ed24d 40557eee 3ff29591 -> 40835843", + "40f8da26 4084513a 4058a47f c13008da c19ff906 40568090 -> 42402684", + "c096603f 40c35948 40b4291e 4170dcca 4181d621 403b4ec1 -> 424b38a4", + "41384dfe 40da29b9 c0c70512 c15031c7 3ecc607b 3f51c427 -> c1eb090c", + "40e7c664 40b90050 c114814d 40879f30 c11ff696 40e8570a -> 40c65d37", + "409ca5a7 c0dd8d12 3fc2a88e 412ed1a3 c199f238 3f079afb -> c2cdf786", + "c1728405 4115a502 40af0ae0 c178c55d 41587383 3f23a2d7 -> 43dbab11", + "c13aa05a 41057aae c036c7d1 c1536e3d 40dc8edd 3d86f4df -> 4391f4c5", + "c085e283 c0c182c2 411bb36b c07b6bcd c19c7796 4019519f -> c07b6bcd", + "3d01258c c0ee6864 4100aed5 c15568eb bfc52043 40f36d24 -> c0e44cd4", + "bf8844bd c10c6273 40bcd0f2 c0e96101 c0923aed 40042e24 -> c0bf2ebf", + "3f94a7ed c0c80c36 40b0aebf 4151e42c c188efb7 bf50ee3f -> 4151e42c", + "3ec55ace 411e9131 3ea05458 c1820e1e 414431d5 40b7ed83 -> 41583890", + "3f4eaee7 bfd7cead c0c7e6c5 411f7acf bffae60e bf6552bd -> 411f7acf", + "c0c2afd6 bf9b3413 4002623c c18ed93b 40f3c66f 40818b13 -> c28864f8", + "4112c941 40e55e3b 40e4151c c087e9a8 41966798 40ef0185 -> c4a3b1b1", + "410aa355 40829780 c05db898 c1827475 c12e4cb7 40a5afd3 -> c1a3e8ef", + "3ee84b9e c10a2e8e c0243a66 4003edc6 4126a5fa 408dbd75 -> 41893329", + "c101e852 c0c29c31 c09a3e85 c1669f80 c17a6af0 40c0133a -> c13f0c96", + "bf91f0c2 c11df6ab 40da4aa0 419fd755 c1972643 3f65fe21 -> 419fd755", + "c18f4814 3fd32314 c07ef6d0 41690db8 4137ba3c 408302f4 -> 3fe1e450", + "41150c6e c0ba186b 40b4dd4c 3fc5d478 4181168c 40cc8497 -> 41b0bbc4", + "418380d7 be00ff64 c1134f56 c18b05e5 c177108a 3fb7c355 -> c1c0f929", + "41097dfe 409ed0b4 c0f29c7d bfc90907 4152ce9c 409c9793 -> c0f31da2", + "c0d57156 c00bc5f6 bfe50ad6 bfab7de3 c162fdbf 3fa32924 -> 43825a38", + "40bbfa7d c059ace7 40e05aba c10cf7ba bf93c8af beaed9a4 -> c10cf7ba", + "4167fec4 c100b846 c0e63e00 c192f26f bfeb063a 3f426d2b -> 4475bd20", + "3ff3bfc0 3f7158b4 40f8e2e5 c1946ba8 c15d6270 3f948516 -> c1946ba8", + "c198b3db 3fefc89f 3f94333b c01bb391 c10c9bba 4003fccb -> c38a58ec", + "c1180170 c107fe5b 41170be2 c124038c 41114cca 40000759 -> c19f516c", + "410453b8 3fbbd6d2 c0ebf65d 412676d3 412044fa 40a11ab3 -> 412c9dcd", + "c19b9d05 c102f4b9 3fb2ed52 41237e4d 3f5ae523 3e8c515a -> 429d190c", + "c13c7595 c092d839 40782f9d c1513e53 406870fc 407aab90 -> c209a2a6", + "3f606eb9 40fadc2a c11bb19e c0485f8d c0744818 40b738a0 -> c057b5ed", + "4140b2b3 410b034f 40cf45a0 3d9474b3 bf63fc92 3fa1bf80 -> 4047be18", + "c0bd134a c0f68218 41094740 c18abfe1 40fdd38d 40bbcb42 -> c18abfe1", + "40f96ca9 c0fffa8e bffc7e3e 411441d9 c15b1e8a 40d5fc02 -> c26da138", + "417988d0 4002c398 401dea54 c08eb74e c15c9a12 40a6350c -> c3b31fb0", + "418aed86 402c479f 403f62dc c08494da bf11b18c 40c4f067 -> 4347b208", + "bfb016de 40a0e541 3fb157e2 bfdf5b26 c0e1edb9 3fd27f38 -> c16ac6fe", + "c0b6c99d c01d24c0 c043bb8a c1725d6d 418d380a 3f803743 -> 439c269e", + "4124398d c1021589 3f987ed5 c16309e7 c11a8e31 40b25416 -> c08deaac", + "c145157f c0f7bd95 40c8009e c0de0d1b c0996618 3d4be1c3 -> c2482906", + "3feed484 40dd1c61 c0b9f852 c156ceae c06fc6a8 bf01b8ee -> c156ceae", + "bfbb431e 4046aac0 40e59814 c174bb1c c0f68545 3eb04a45 -> c26d9394", + "c174d6a1 3f8e141e c0b7a15d 4190a9f0 bf3ae1c2 40d50996 -> c203216a", + "c09d7dbb c09683f0 c023893b 41460dab c199397b 3ec4bdc3 -> 42bcdf1a", + "c19cbe87 400a6e3b c08b3923 c049c2e0 40bd0741 40fc0c76 -> 41f1a0ec", + "417e9b70 c0a62af0 40bea5b6 40ed9749 3fc8116e 40f7a02f -> c0963e6b", + "3f9d6df3 c10cf12d 404119d0 40c27817 4163e0ce be84a2ab -> 40c27817", + "407a9a71 c118a325 3ff08054 c113ab67 419072f0 be19b243 -> c113ab67", + "c04b651e c0d2ba9f 3fbc5359 3f0f48b5 bfc77e9c bcc4416b -> 3f0f48b5", + "c06a4177 40133598 4099ebbf c12b6dec c076cad8 40d161d7 -> c1eca5b9", + "be9cd153 c10f8356 c0a09066 c0b4d826 4195e48b 4052209e -> 4274cd9d", + "c07b1413 4033b11c c028c9e4 c13b7eb7 c160c039 40380675 -> c16f5279", + "419809aa bf422d70 c0964486 419cd8fc bf687ddf bf525b75 -> 419cd8fc", + "c14bdd9e c0a752d8 c0af9afa 4142d9f4 41995090 3f2959c7 -> 4401c5a1", + "c148a8ce 410a3041 4113cdb6 c0c94553 c0226d99 40df05e6 -> c31d8e6d", + "becf62d5 c0b029c0 c0de56b6 c150df06 4118445a 3e178b7d -> c441e83d", + "3ecc89d6 bc753b35 3b3f8e28 c184a195 c0baa69c 40449057 -> 439c2818", + "bf253da2 40de3710 c0e2314f 41457641 c1703305 40e5c7f0 -> c0395a50", + "413db998 40dc0c97 c07abe38 4108ac8d c1875e04 40b9e987 -> 41d09638", + "bdb8dfaf c0929d38 c103fe33 3f310238 c0b63e99 4082711e -> 413a8a2c", + "418a3a72 c0c9105f 411356a7 c15da88d bff6592f 40fca93f -> 40b930f6", + "c0b4e0c1 410ca197 4116dbc9 c10c057a 3f1cc76c bebc1282 -> c10c057a", + "bf1a1f41 411d8760 41109e92 c1172fbe 41023bc6 3db540a2 -> 452d4e21", + "c0cca1dd c11569f9 40a5062a c10b5958 c184ba2b 40220c7b -> c10b5958", + "c0c5ae83 41137b0d c105257e 410f502e c0846417 40fff656 -> c02022c4", + "3fa280c4 c100105b 3f8b14f7 c09bae88 c15a2f66 40d4bd36 -> c1619d2d", + "406d8f57 3f9dd850 40a7f76f 418ece42 c150d6d2 4014d313 -> c10ba700", + "3e12d3ae c107bff5 bf499b10 405f0e0a 4061c496 40d426cb -> 40625423", + "c0e78fdf c0ac01cd c0b07519 411fa9ee 418b6486 40e5b577 -> 42f60ea6", + "415bbe7d 40912c58 40e41042 4080e08b 4105a9c3 40c78d88 -> 41aafa89", + "412e7bb1 3faa9f66 c02d4609 c190e3ea c0acfd97 40aa6bc5 -> c2579610", + "4149b1a7 40d19d93 c095b2d6 c0a24946 c0fdc92d 40c95a47 -> c0503d5e", + "c153e79e 40d71b1d 40e2742f c10a09a9 c1698538 be23b5f6 -> c10a09a9", + "c04e1b4f c08f6fa8 40ea1dc3 3fd44c4c c1711fd5 405bde72 -> 3fd44c4c", + "41889eb6 c1074040 410f310f bfe55ea4 c19b11fa 4048b327 -> c20dcd4c", + "408dd6dd c108af59 404ff5ef c0658afd 418e312f 4016a590 -> 41bd19d4", + "c19bb009 bfbf4e14 bd4dee87 c1345d7e c177c7c5 409024ba -> 42551382", + "40beba44 c11e57f0 c0bbbc24 410fac9b c0b13d95 3fa0c161 -> c2a700cc", + "c147e6c5 3f893fdd c0dd3186 c165308a 415655e1 bf54cf60 -> c165308a", + "c0ebb876 3fe8c3ab 40735c22 4128a30e 3e854092 3df71407 -> 4402719b", + "c1481c43 bf1089f8 40e1f961 40ddb9d5 40e98010 40f8ae54 -> 40c883ae", + "418287e2 bf2c536a c05a2157 40b82e82 c12a2529 40baf449 -> 42fcc57b", + "41857ed5 c0d6b596 c0822809 c1123a58 c16af48f 404ac84c -> c2904af6", + "4171db6d c0e6a329 bfbe622c c1073cb3 c0a16640 3fd458df -> 414181c9", + "41413768 c082b519 409161c5 c177accd c1393db3 40996acc -> c0eae5fc", + "c0510c68 c077870f 40a5ec1e 40cd5725 c102f5f5 40dd0584 -> 40cd5725", + "40edd7c2 c097f2c6 40e8a7a2 c18dcecc 40c48922 3d38f271 -> 43ff6f49", + "40c44aea c0f56d6b 411f03d0 418c2379 c119ffb1 40808ce2 -> c0302458", + "c147a592 410a68a9 bfe85ac5 bfbe81f5 3fbc0525 4061d1c8 -> 40c1c072", + "c0d1f0a1 c090bdcd c10a1707 c13b9fac 419ef9e0 40913100 -> 400cee6c", + "40a4cd6c 401d0ee0 40e8e6eb 40a11b82 c0b98102 40cd4b52 -> bfdc033c", + "3fb9ba03 c1152ac5 c033130f c180af24 418a90f9 40430e57 -> 4246b8a4", + "c117eca6 c104f2f6 c0bbc54e 407412fa 4191dc33 40adc78e -> c0d9d121", + "4152c225 41134872 c0e11e2e 41951b58 416a066c 40a0c1cb -> 41a1e252", + "3ed28e89 409d867e c0b620f9 c13cc262 414e0477 40b76432 -> c04bf5b8", + "409c8778 c016da42 409703b9 c19bf775 3f4d25ee 40a1408f -> 40957e3c", + "4124adf6 c0c1a338 3f2a9e2a c139f9e9 4183fe68 3f13f995 -> 430655dc", + "c15a7fb8 c0e25130 40ea4860 416f2c87 3e08c3bc 40baeca7 -> 41c8bea6", + "c108f0c7 c0ee4d50 c0e6f1c1 4098d259 4199c613 40e4b644 -> c2982515", + "41835ee1 40342306 beeb9567 4138f815 bf9a49d4 40e5079a -> 429068e7", + "40425ceb 407f9bbd c10352a1 c1376a9e c16ccb4c 40f10362 -> c1376a9e", + "c16395c6 c0eab266 c0f05b72 40efd500 c16fdfa3 be8f3119 -> 40efd500", + "c187d1ce c0829803 4084b738 4189752f c14aaee4 3f151596 -> 432af3d7", + "4170c260 c0e1bb3f 409acdce 3ebe9511 c12f8a06 bf1c8741 -> 3ebe9511", + "c0b47afe 40b1c28e c11531c7 c14b9ca7 c0e568ce 400f0765 -> c0f817e9", + "41882556 3fc0c6f2 40323591 411efc2a 3fba41f9 40fe22da -> c2d2ce0b", + "417f9bb4 40850083 c0fda557 40077940 c01deac6 4016c54c -> 411e6898", + "c160cc51 c0b6e6fe 3fbb965f c18c369c 412edd24 40f6552e -> c268c13a", + "c1795be5 c115b536 4104adb5 41098aaa 41543667 3e8d0d67 -> c10580c0", + "413ab627 c061b89c 41109b5d c174f027 befd48fe 40879abc -> 40b5513a", + "c01c3c56 402623cf c0eb6fa7 404b5161 c1052e0e bf020590 -> 404b5161", + "418b641f c05b4fd6 40078d0e 41547f36 c10cdbb6 40b19dc7 -> c2a46c52", + "c10d939a c086dde3 c1108859 c080afd0 c191c3e5 40ccb362 -> c19c7990", + "bfbc7a09 3fc2b942 c0f382f8 be651c25 c0d2a241 4092e1f8 -> bfcdf47b", + "4188d326 4020e023 41124c03 c177ad1f 408b9e8e 40ecd557 -> 42031e98", + "417e9a56 4061da63 c0cf51aa c05a8ff8 c14e09d9 400f0004 -> 418e136b", + "4183ec34 3de1fa51 c0dd8820 4101b574 412b36dd 40bd26a3 -> 3f256aa8", + "c11dabcc c112516e bf2e39b7 bf06ae0b c135e649 400cd5fe -> 408cd5f5", + "403e3c86 40129dce bf21a5fa 3f031f24 400cf821 3f584ff3 -> bfbe843e", + "418d5e22 c0f15e9f c02627d5 4107b0d2 c0df2a52 40a0b441 -> c2a7ae5f", + "4116fe1f c10e1e0f 41045088 c18f6af7 417786dc 40ecfbbc -> 4191340b", + "c155d38f bf4d5300 4100adf7 c0b3f69c c1441fc3 3f8553d6 -> 4157b8ce", + "bffc479e 3f871dcb 40b12857 41641c29 c193e08d 40b1a63a -> 422efb72", + "4066ec9a 407a02e6 c02ec880 40e553f2 3fb3b5aa 40dd1bfd -> 40e553f2", + "3fa7583a 4010d4a3 3e0d3fa9 c105c19f c08092fb 40e1a402 -> c0d0668a", + "c0c28747 bc4e5be6 41076855 416683eb 40f87284 40bc104a -> 41a0790c", + "4195937f 400f446d 40fd699b 400b0e13 40829681 4008fa1e -> 41232557", + "c0b343a8 c0a0c405 3fe3d9c3 c018aa2d 408227e7 40f2b944 -> c04f1c43", + "c1061825 3ff69208 411f78bb c05f9996 c05b5cdc 409c24d6 -> c0668c02", + "c05e671f 3fe058a5 bf986fa0 c1547672 c151549e 40883ca4 -> c14dd769", + "c172d0e3 40442c14 c01b60ae c1501d28 c0c4e001 402df146 -> 418a114a", + "c15d37c9 c09f005d 40efe936 416f10f6 4176bc58 40b27a26 -> 416830d7", + "4126c918 c02abce9 c07f53ff c15d9024 c10f95eb 3fcc1d7e -> c2ba9e52", + "c19133dd c04f47e2 3e8e8b88 402302ac 41263b14 3f03c06b -> c2d03d6f", + "c16234f9 c069ce58 40a53e91 4182cfda 41135ed9 4089bf2e -> 41dfb5b0", + "c1642a2b 41041d3f 404e68d3 408aa334 c159f634 3fd81570 -> c2f698bd", + "41721881 c0ba978b c0492729 bfd8c801 c19ee47f 40865a73 -> c32ec830", + "413e485b 411058cf c0f11c3f c15988bb c0c7fc9d 40acf6b1 -> c1828365", + "40063e6c 411388fd 4091939f 419d64d4 c149ddef 3f8f49b3 -> c285b9c4", + "c19b4cd8 3fc2da9f 4090f686 c19cb2fe c05cb9ab 400d01ad -> c33c0fc8", + "409925e7 c0dd103e c0db5ec9 bf2cc647 4185ecb6 40cc4479 -> 458b08fb", + "c118e1b8 4106544f c0caa82c c074657d c0d3a637 be627aa5 -> c074657d", + "c1106533 bfb3635c c0ada9de 4076bc9d 41808ea1 400d5c79 -> 421423cd", + "419c2f14 40154521 3fdccf13 c0f655f1 417e1e92 3e1fd48a -> c59c0970", + "41484441 c11ec31b 4115a217 41722ca8 40e8c02f 40b02eab -> 40a476e2", + "40f5c651 c0f2e8c6 c0d7d3fc c08badf9 bfcb7ab9 bf10198b -> c08badf9", + "c14c2ca9 c07019a6 3ffa2503 c15c807d 40e695bf 40f3bd81 -> c2516cc3", + "4117b56e c1060753 c10147b7 4132ae62 40ddbec8 408eaf04 -> c3964b42", + "41968b5d 40031857 40c45a98 c16f4f01 4104cf21 40939746 -> 42ca0b43", + "3f9375e3 c09ca62f 3f5dd228 c10dc42b 417bc77f 3fadaa3b -> 41db2e1e", + "40c9576b 40d867c4 40f6c5f0 c11a8e60 c16acab8 4079af34 -> c0b9b6e7", + "c0d6a5cc c113ce9e 3e56ab6e 3f8875cf c15b07ef 3fdaa3b8 -> 3f8875cf", + "c146da74 c0b30914 3fa93d39 4165b382 bda392d2 3e744a92 -> 43076198", + "c1329d4d 401a994d c102ed4a c1950e7e bf83062e 40c2b8ab -> 40ed2ab8", + "c0935191 c116bb04 c0e9e8e2 41890769 418da36c bf401c55 -> 41890769", + "c1893080 410caaf1 40a629f0 c16020c2 be94a057 40771757 -> 42dcb303", + "c18e6976 40c9ca94 41111109 41825260 4198c80b 4090ca7c -> c161ce3a", + "40e6cb3a 40b3f7f5 c0ecda3b 4106637b c173e4d3 3d904b59 -> 43abfb74", + "bf92d4c9 bfb9fab5 c0015a0b c10c01bf c1850068 4070c4c0 -> c01e2040", + "3f3e5874 c0a684f4 c063aa07 c10f87e0 c16e2e98 40f1a4dc -> c201e3d6", + "406f19b8 40c7f4be 4060cf79 41941fd0 411d748d be4fd511 -> 41941fd0", + "4106a813 bfacd7dc 40f7a65b c13ee16d bf1e6b6a 3fae901a -> 40950efa", + "c0fca232 bdeb06f0 c0eee505 41898b89 c0e77df2 40b08a21 -> c115f932", + "bf3d8589 c103d69b 40532518 40b4fc79 c0d6ae05 40caeb5f -> c0093192", + "c18181c6 405a9ee9 c09430b9 c1830724 be97e831 3ff59ace -> 42292916", + "3f95b4aa 4050a192 408925fc c18ab6a8 3fba9a8c bed905e3 -> c18ab6a8", + "c13231d3 c08bc2ed c09b77bb 418f0465 c0ce76cf 40d9f83e -> c3b62662", + "c117ccad c027a8e9 40803bfc 40dfaeec 40c0f9a9 3f138e16 -> 41251e53", + "40ab20d0 40aa3d14 410f3678 c18130ed 4099b7b7 bf4ef5b5 -> c18130ed", + "418ff556 c0ab6d34 40d8e1c3 c121f310 c194b991 404a2c2c -> c1fc8d22", + "3dd169ee 40f8fb33 40f44e1c c12b09d3 c00fc293 40ca7609 -> 43fae40d", + "40c61e62 4004b855 40d15ac3 c19b94da 404c73eb 40c87659 -> 400f47c8", + "3b92ba01 c11b457b 3f8e7938 409b0b80 c189621a 3f7ad99b -> c18cffdd", + "40b600b4 be92ebc9 bf56b784 c10ac269 c1050b0f beb2945d -> c10ac269", + "40570770 c0fb51ca 40866ebf 3fb940d0 411e0c9c 406dcc05 -> 41286007", + "c1996e95 beef6729 4046e224 4169d7c9 418f72be 40dcd199 -> c0b220d2", + "c014efa2 bece6273 c0ea2a9d 4128be3e c14a5cbf befdd6f8 -> 4128be3e", + "41680b56 40b7cfd6 c05e93a4 c185cd1f 410ecacc 4070d97c -> c24b3760", + "c19fe243 c08a0d42 c1001a4e 40c18737 4155f60d 4029a904 -> 423dfa1f", + "c1576b0b c01bcf92 4116f0af c19bd2b0 bfa45f8e 40603b73 -> c235c494", + "40a81c35 40f2c8f6 401e459a c0bbc38b 415b2a87 beb99504 -> c0bbc38b", + "c10cbd1d c1082080 c099cdbf 41678f70 41752589 3fb0a871 -> 415db755", + "3fd8ad08 c06db2a3 40d9cd33 40962bcb c0905701 bf47017e -> 40962bcb", + "416cc807 c0d21bb2 4053bf49 40d7506c 41728096 3f9316d1 -> 42104266", + "c194e1c1 3fd29cb3 c07b362a c14a96a6 c14a1192 3f827030 -> c1470484", + "416fe2b6 4010c808 40d617f2 3f5997ec 40e7a874 3fbe346a -> 41f79627", + "416c61a7 c075530a 40e5ffa9 c1814401 3fcae297 40bab655 -> 418a56ab", + "c15e7b20 4113a197 c08c5ce7 4143ad23 40f84f53 bf63ff19 -> 4143ad23", + "c1987aca c1027bed c0f7c811 405d991d 411253eb 4034678a -> c34a2df9", + "c0675925 bf6d5cd2 bfd5c2ab c0d3b6b9 4182e192 be7cb81d -> c0d3b6b9", + "bfc38f74 40e2a121 40d5e9d9 41899e21 c103b341 3ff61142 -> c44c12a2", + "c03cdc29 bfdb372d 407401d7 404cfbf3 4127957a 40c93668 -> 3f63e058", + "c10a37a9 409859b1 40b88f35 4024d853 41075e93 3fbaa518 -> c3029b3c", + "419b0bbc c10bc05b 3f0f0e40 c0890e0a 411b7d21 40f8f1fa -> 422a0a11", + "4105e3cf c039583c 410a59ca 409374d6 418bd85b 40e6cb38 -> 4197179c", + "c1351a30 c0da3442 bfcf0278 c12b957c 4170e99e 40fccfae -> c2135222", + "c146d35f c0edbe37 407776cc c18d1c7e 413190b2 409d32ab -> c20cc0d1", + "4120c02e 411198de c0590f4d 41280b28 4150007d bd607952 -> 41280b28", + "c0e4da13 c0a01907 410b6d5e c135d871 c123dc7a 40a2d028 -> c1396153", + "4092ca27 c0afd95f c0ca7a86 c1758a4d 40f67000 3fccc776 -> c3ee2bc4", + "c132799d bebf8a07 3f820a2a c15cd141 c12e0b4b 3fde2528 -> c24b6efc", + "419f048b 40d04702 40eb1c40 c0228361 40df2fd3 40ca13ce -> 432c3902", + "c1573981 bfb22d25 40b550d1 40910797 c08b1d24 bf6d5a28 -> 40910797", + "c1920918 c0308541 40e785dc c145448c 3fb0328b 4058fbf2 -> c2228226", + "40a07d97 be6e6e85 410b9533 4135de63 418c2980 40747b68 -> 41696a68", + "c19f26ee c0ab6dff 40b8f55f c1815230 c18282d4 3f79ea03 -> c17b5405", + "4122bdb9 408ac61d c0dd3add c028714f c18982a2 40dd1e34 -> 40fcd808", + "c19b6001 bfbe2f42 c07990c8 c117b352 41633f28 40c19752 -> 43421842", + "c133fbef c0b0584b 410d7ecf 40ee3909 406efb5f 4040b08c -> 411e8c0a", + "c15581fd 40805051 bfdce09e 419bb89f 40e87304 40a8d529 -> c1b1498b", + "c0dab912 c05f311d c10e7fb5 c114bf48 40d7462e bf7e4520 -> c114bf48", + "40984ac6 40178985 3dc1d918 c15a2d2a 40cc8808 400cdbbd -> c24823a8", + "c13e7ada 403552b7 3ff9e6e6 41788e80 40d7f58f 40f9043e -> c3154ec0", + "41379bc2 c11e076f c0cb0a17 40da5f4b c0f245cc 40bb2dd7 -> c2bc270c", + "bf1c9e34 40838cb4 bfcbadc8 41465f60 409a4a17 3fc0a029 -> 40150aa4", + "4188d9dd be8905dd 404103c8 c1677e11 c1644899 40b69274 -> c153ceb7", + "41824d9e c0331044 c1097af4 40f0edde 411264d2 40b22dd9 -> 3f9020dc", + "4131db28 40734811 c093d8fa c101885c c11d686d 40e82330 -> c0c5957c", + "4041e05d 40b7ddd5 4072656b c1110810 c0a14b89 3fd468b6 -> bfe516a4", + "c10f678c 3edc6470 411acd93 3fd78a2d 4170e78b 40e1f6ff -> c175c26e", + "4194bde6 c108e813 bfbaefb2 c095c6e0 40bfc466 3f371876 -> 42a9b752", + "c0d30511 4044a023 404a46b2 c19727b5 c19e3275 4097eddf -> 42c3d155", + "408da4c0 409f823d 41124e12 40a4328f 3f5a11d8 4029b226 -> 40d7d7e3", + "3f06048a 400fd075 c10e40b1 c039354a c02183b2 40db1b13 -> c035bf6c", + "c07d17e5 410f269a c0c3ec6d 3fa610aa c127c430 40e7ab85 -> c1218659", + "c162a29f 40724505 40a1c845 4184b103 c0c9be19 40dcf9b0 -> 43c1ed49", + "c13b0b3e 4086a9a0 3fa4d886 40a834a4 4011ec82 40e3b383 -> c1525e6e", + "bfd71bba 40b8de6d 3ff32ab8 41177ed1 40eaae1a 40bb59df -> 40974fca", + "bf4dcc33 40f49ebb bf9a8abd 40b15fad c12a0ee6 40f009a4 -> c13b43bc", + "c14b8f9f 4084df0a c0290f4e 4191d1e3 c0bd2e50 beb985a3 -> 4191d1e3", + "419da0f3 c0b15a5e c111064b 3f3ebb6d 403b6457 408653ee -> c19820ee", + "41982aa0 c114f71b c0fb44d3 c10eb2dd c10f7a4b 405c3f85 -> c1222a9c", + "3eb02bd4 c09c1be2 3fa55a36 c15d9dfd bf24f7c2 40f11b2c -> bfca6b50", + "bffd1c70 c0e4bc48 40b58b41 c19b06d1 41829123 405fb7f9 -> c112a6d4", + "41956254 40b8a24d c0054855 bfb1bdf4 3f937cad 406455d7 -> c0e2c088", + "41914bbf c11c9a5f 3f8da243 41783e0f c0ff61b6 40d81e11 -> c24a575c", + "c10d1964 3fbef62c bf92edff c0e2721f 410a764f 40a24bb9 -> 428084d5", + "c0a60861 40cc9f69 c0751723 419811b2 bf3f9eda 40e59b62 -> c0b8bd4c", + "c14d5e0d 410669ba 40a9c457 c0d661fb 41110564 40a3214e -> 42f02890", + "c1916485 40d9ffa1 3e681e3a c0d3eef7 c08e0452 409d8755 -> 40490d2e", + "416ac99f 4021ec54 c0d58c48 c0bbf81e 407f0bab 3f667122 -> c21aed60", + "c14c9467 4100ea72 3e8a85de 40d1f18d bfe6c227 403ad53e -> c1b0b5b2", + "c18bdd57 c11aa34d c05fe62d c15e5cb3 41222eef 40dfbabd -> c24ed83a", + "419d9ab8 c0abd939 c07a0511 415fb146 4155bf5d bf56cdf1 -> 415fb146", + "c1926190 c10e1236 bf02f577 4028c190 c1956396 40c6a0ef -> 42062492", + "412c2b5e 40ddbea7 c11a76ee 3fbb5e3f c1095eb7 3f9fba8b -> 411845b7", + "3f659414 411ce4c3 c0c95851 3e4d0080 40184c5c 40815a25 -> 3fa3a721", + "41971c6e c0c6152d c052fd38 41782563 c188e8df 40e154b3 -> c398146c", + "c163e7e7 403816db c0c30826 c157fe7d 40582ca7 40eab6ff -> 41a81f08", + "c120527f c0acd279 3fa2b63a c0285324 403f2026 bf61a22c -> c0285324", + "41963b38 4016aa41 c1111004 c147fd59 4025eb7f 4065f80a -> c2279938", + "c176c606 4054b1b2 4114f617 411f365c c19db1f4 4009392b -> 43144b9d", + "c156a478 40bfa4f8 bf09841f c10f0c40 c107bfe3 3f127137 -> c0b80760", + "4135400d c094148a c079f296 c065766b 41172102 40ce79a3 -> 43a3cfb3", + "40752e4e c0b26485 40e2bb50 c148f092 3da1b964 40e50930 -> bffb77c0", + "c120a221 4110e9f5 409fae84 c18f2a91 c111ebef 40cf2197 -> 41ec72e3", + "bfda8b76 410730b2 410909ff c0db1066 c0f28804 408cbd43 -> 4290b6cf", + "4151e7fe 3f1d1763 40d99fd7 40e4e64a 40231500 40ba3c0e -> c04885d4", + "3fa66577 40c32559 c05237ae c15b0741 c197ae5a 40b6c6ef -> c183a957", + "c0d99b55 3efd880f c0971616 c0d46479 c01867af 40d1891d -> be0cf560", + "c14d02af 40da655d c10c9bc6 4184047f c00c86a9 3daed4ff -> c34a86ee", + "41362e48 404de125 402cf9ba c041ce7a bfa18dc4 3fed9642 -> c23b2f71", + "411b42ab c10c50cd 4077fb68 c0aaa8df c0a10cbf 408717cb -> c09ab9b2", + "bfc50d65 3f9d6190 40e23a5c 4196aab7 40a311ab 406d7e74 -> 41ef83a7", + "40f5b489 c11db527 408e1143 3fa2c1eb 41978029 409fbde9 -> 41d05a09", + "c125169a 40507cbf 4018f29c 41205ebe c1397832 407c2607 -> c3ce35d9", + "c18c6280 40c417e1 3ff36163 c181ea81 41402af1 3f8a7df8 -> 43877bed", + "4121c453 c0a6c0f5 c0c148cd 40ebb130 418034bf 3ed4b2bd -> c40ae02d", + "c0523916 40396667 40e1ad4c c162ab7a c15a1c7f 40f05602 -> c1717bde", + "c17847f0 4116f523 c0bc76c7 c19fcb75 41104d2a 40714652 -> 420770fc", + "c149420c c0839631 c098db17 419a3446 c18c56de 405a2f81 -> c41260a6", + "c140259b 40350f58 40c13f79 40c660a8 41819777 40b7ffa7 -> c245ce38", + "408d7f5b c11c9b9a 40dd3855 bfe6e419 419cf289 405afc84 -> 4187d3f3", + "c12b5192 407f3ef2 40c8ac1a bce8581d 40fb0453 40507c05 -> c28764a7", + "418730f6 408feca8 4087dbb6 c16b6754 41311f5d 3fc97301 -> c502f44f", + "40c34230 40de1ec7 41175329 c1403adb 414218cb 3f78de54 -> c2136823", + "3ff00eb8 40c562a1 40a99fd9 4195fd3d c191613d 40ad05da -> c340eed8", + "c0b4fbbf 410a0a70 3f229781 bd1bb92b c194050b 403b07a7 -> c2311104", + "c120da4f c11ff5b0 40232e71 40f8bef2 c16fabff 40e9d2e9 -> 412e31c1", + "3f989de6 40937beb c0afbdc5 40e40fba bf21d07e 40f37aae -> 40a2cc20", + "c15a127b 40f75b5e c105f470 3fefe3e0 c155d77f 3f27f5f5 -> c2325211", + "40a37f22 3fe92ae4 c11b61df c19f4971 bfabcab9 4098d263 -> c1dd7f72", + "c1096461 bf442b13 3e1f5609 4143b9f2 411b565d 40ec3e58 -> 42136810", + "412771e0 411c2440 c06b839e c13a15a7 40efde6a 4079ba0d -> c184416e", + "40304de4 40b9f365 c02a8727 c18d93c8 c11d25ab 40c485be -> c1721e60", + "4183290c 400a6f2f bfc4ad70 3d31d50c bf9d003f 402009e1 -> 40e4ea7a", + "c1284557 40d2770f 40fb69b3 3fa2ce79 c01debfd 3f0d8b8c -> 430f4cad", + "3eaa7d2d 40e61adf 40e7f97c c1601d42 c0ce23de 40e3ea3e -> c4806ab1", + "418a839a c044ffa1 bf449992 c0daa1c5 c004ed4f 40099b38 -> 42538772", + "3fe87152 c0448086 40d79e5e 4160f5a6 414b4e7c 40a0d74a -> 41540924", + "40922e3f c109e6b1 40f0f372 c0d51de2 c1806dd3 3fbe87bb -> c19a407d", + "401b0063 40fb6df4 40b28037 bf2ea72d c134c945 407c3d05 -> c1f28351", + "40fbdba1 40095669 c0a5e84e 419b9fe0 41382ad3 3f97f7b4 -> 420354ef", + "410e9d51 4077af7b 409b930f 41654100 c1939cdb 40e35cbf -> c32ed449", + "3fc59ee1 bfd55018 c09c3663 3fea7af6 c0b30618 4031986a -> 414896e2", + "4144432f c01487c7 41039c7c 419dc704 c1350638 bf3d405b -> 419dc704", + "c1184ae8 408dc1be c0b5644b c122ef23 40c5d0e6 3fb2abaa -> 41c7e8ce", + "40a54919 bf203554 40a3d0ed bfd5fc62 408fa017 bf60a8b7 -> bfd5fc62", + "c0c15cbb c11c14e4 c1024de4 c18ed9b1 c172bd02 40259ce4 -> c118e162", + "bf7e6772 c106a8ba c02f8e0a 41794425 3fcc8735 40ccc6e0 -> c082b206", + "c0e57958 40e9bfd7 c0fafd38 40fc3643 3e0f8862 40dc993e -> 3caa6d00", + "41097495 c075aabc 400c53d2 c117c4c4 c1837ce1 4023dd8b -> c1e3e6cd", + "c190e94f 4115e907 3fd2da9b c0a1034b 4125db80 409bcfae -> 4268dc42", + "c0a8b70c c0ead518 bff89230 bf883720 c0bcff64 3f4d1f8f -> bf883720", + "4199d960 4002eb5f c08c92f0 414863af c16cdf02 400f632d -> 42f49ced", + "c1037c98 c11c57e1 40eb3cdc 3fddf2e0 c1722cdd 4025c574 -> 3fddf2e0", + "41783520 bf148e1a c0d23ec9 419a2e53 418ea4ab 3fa0e1a6 -> 41da702e", + "4157e7b1 c0ba7e96 bf21d39d c160e5f7 c1827151 403ec4ba -> c1c4f5fb", + "3fcd8642 c11b8c8d bf6736ba c01385e8 40483007 3ec427de -> 413e03ed", + "c15dc37a bfdf5762 4028563a 4168a359 c100edc6 3e61dcc5 -> 43d42d0d", + "3f1483e0 40bca88a 410951ec c0bff088 c198e06e 40d20510 -> 41bfbec4", + "3f693c0e c0d0be5f c0307417 c16cbbaa 40fe0251 40de66f1 -> 42091380", + "c13b2227 c0ad42b5 c07c0b30 411a732f c11e287c 40b88795 -> 42d7d1d3", + "41712237 40451ab0 41029b23 c1795b94 4103f5fb bf6b7d0b -> c1795b94", + "c0058d1c 3f79e6b3 40349226 410da62e c10f0607 3f0a237c -> 42d78a65", + "c0e7fe80 c106d467 c04fcc2d 3f58443a 4192f3da bf29daec -> 3f58443a", + "3f8af49e 40e6e1f0 40082da9 c0992a2a c16e3fa2 401de9ed -> c1a95532", + "3f7c75c5 bfad0e16 40c7aba6 c02197ea 3f3b3e52 bf6da8df -> c02197ea", + "c0a07e8f 410cea91 c10c6e77 c16e7215 c195d3b6 40aa73d2 -> c18e346e", + "413be42f 40e886e3 3fb7047a bee5b544 bee87c50 3e8f4fa2 -> bedbc8f2", + "bf6f3a09 40ac617d 411d9af7 411d9c24 41618476 bedd2638 -> 411d9c24", + "c0e97cd6 411fc720 40e4918f 417a439a 416af6a7 40656332 -> 410700d0", + "4196e38d 40ff7fe6 40413f5a 40a3e367 c17bff92 404b5382 -> 428da284", + "bf7f204c 411d3d78 c0893fa9 4094a899 c0a117d6 4083bd49 -> c01a1f3e", + "c1833ac4 c01350a5 4101e260 40e17e1e bf91b7d2 40d9482e -> 41a273de", + "4108045e c0238141 40d12735 3f90e69b bf86bcd7 408177f4 -> c006e644", + "c0ddb1a7 3f19c1e7 bfee6bc0 412e3433 411a57f5 bd9a7e67 -> 412e3433", + "4112d756 c0758acb 40758a01 c194465f bf40e145 403d05c6 -> 418cb383", + "c11f72df 406dc571 404a8bc9 3f917443 4129e0a1 404abd02 -> 439ab452", + "4067fcde c00e178b c001d02a c1931d94 418aba34 3fce164d -> 44d8d8ee", + "c1923e39 3ec98776 3cd248cc c06e6ec9 419a9ad4 3fea4c62 -> 44e0a2cd", + "4163f62c 40083db9 c114e143 413a99a4 415a378e 409a3ae2 -> 410cae3c", + "c19a6312 c097c340 c08d4cf5 c0fae59f bfedf68d 40d5ddfb -> c39d68ab", + "c0c21d1e 410f6d96 beddb68c 418f144b 40423b60 40ce096a -> c0ef883c", + "c116c285 c0558de6 408fa594 c14e6451 c100e8d9 be875948 -> c14e6451", + "c197361f c0671bfe 40923fc3 418dc534 c1999263 40a00000 -> 42d4a5dc", + "40f7ec9d 3f15b9a7 40c9cc7f 41542a44 c1778458 40800000 -> c1eeadd2", + "c1444d51 4101df70 3f02f80b 4159b1cd bf15680c 40400000 -> c206c523", + "c164e608 40e951bb 40fff24f 3e2b2817 c094907c 40000000 -> 435d6aca", + "c1896c6a 3fea10a5 c09e2721 c007c8bc 411858f2 3f800000 -> 4260615d", + "40a499b3 40a4eebb befec310 c1886c49 419b6a69 00000000 -> c1886c49", + "4195d971 407bd90b c0d7761f 41966962 40f9acbd bf800000 -> 41966962", + "bfc0aff0 c0a9129d bfbca3b5 c0415e12 4176248a c0000000 -> c0415e12", + "c14ca8d4 400e35b0 c11b4f21 40f182b9 40f248bd 3fe50d1e -> 40f2ceb1", + "41503c2b 40cfb849 40178094 c1802228 40c9561e 40b53e09 -> c26d5f47", + "413da5ef c0d6b30a c0e343af 3f0a4acd c0e602b8 405b203f -> 43ed449e", + "417dcb27 404a6b6a c0f8f462 c00891f8 41661bb4 4052cc43 -> c1d9a4a3", + "40a051c7 4034fb15 c08cd6b3 c12aac95 c10eb1f9 3fbb3b05 -> c13dcd4b", + "3f939f69 bf0fe33c c0982b83 4170187b 4140f8d0 bf607d63 -> 4170187b", + "c11ce603 4059f2f1 c06eef2d 41791b58 40e31149 40e95a5c -> bfee1a60", + "40d17fe0 40a0655e c0b00e03 c1826b6a 4190c345 40a6594a -> c1b75b06", + "c15b53ab 40cf010c 40cf010c bfdf923c 4175e157 be97561f -> 00000000", + "c1189df3 c0f01e7a c0f01e7a 40e5a5c8 c15c6fc2 3fa22941 -> 00000000", + "3e22acfd 3dd0788f 3dd0788f 419ad962 3f28cbee bf309db8 -> 00000000", + "4151fedc 4040ebb9 4040ebb9 3eb67a48 c1429440 bf3527ab -> 00000000", + "c11b4baf 40c51219 40c51219 c10932a3 bf8526e3 3fdae9c6 -> 00000000", + "40c98792 c09fd6c7 c09fd6c7 41173788 c190ca21 4066740e -> 00000000", + "41596fca c034834f c034834f c0228d0d 40c9f444 406766bd -> 00000000", + "41902c2b c11f470c c11f470c 3fbc9f1b c04694c3 40f56d81 -> 00000000" + ] + }, + { + "function": "cycles_map_range_stepped", + "node": "ShaderNodeMapRange STEPPED with Clamp", + "then": "cycles_clamp_range(result, to_min, to_max)", + "cases": [ + "00000000 00000000 00000000 c01129cc c1107059 4081556c -> c01129cc", + "00000000 00000000 3f800000 41964412 c0b9a337 40d688d6 -> 41964412", + "00000000 00000000 bf800000 c08c03c0 c16ab108 40d172bb -> c08c03c0", + "00000000 00000000 3f000000 c1917122 c0e181c1 40b21b78 -> c1917122", + "00000000 00000000 bf000000 4092751c c1176c3b 40e661d8 -> 4092751c", + "00000000 3f800000 00000000 c0fce512 4184ce01 3f9d4a46 -> 4184ce01", + "00000000 3f800000 3f800000 c18443d7 c18603e8 4087b19a -> c18443d7", + "00000000 3f800000 bf800000 c0cbf019 c0d88265 be0e8e80 -> c0cbf019", + "00000000 3f800000 3f000000 c0a25dd6 c099aea2 40642325 -> c099aea2", + "00000000 3f800000 bf000000 4188d270 bfb71444 40295bc2 -> 40461e1c", + "00000000 bf800000 00000000 3f1c315f 419d95e0 3facb66f -> 419d95e0", + "00000000 bf800000 3f800000 418e84c1 c18decf5 4056ccf5 -> c057db70", + "00000000 bf800000 bf800000 3fd72192 c154ccaa 40ec718b -> 00000000", + "00000000 bf800000 3f000000 40fad013 4187b186 3f9b54fc -> 4175b34d", + "00000000 bf800000 bf000000 3edd9833 c0838e24 3e82c10e -> c0838e24", + "00000000 3f000000 00000000 c149dfc7 c166b3ac 3fe2598f -> c166b3ac", + "00000000 3f000000 3f800000 419f51e8 41005f4f 401f8716 -> 419f51e8", + "00000000 3f000000 bf800000 c1269c91 c0ee5a68 40c532f6 -> c117377f", + "00000000 3f000000 3f000000 418f348c c09680fa bd6a9d24 -> 00000000", + "00000000 3f000000 bf000000 4150fd43 c14e1c1b bef76c49 -> 4150fd43", + "00000000 bf000000 00000000 408c25cc c00cc5fa 403f80d6 -> c00cc5fa", + "00000000 bf000000 3f800000 c01fb202 41891ff1 40469aac -> 407545da", + "00000000 bf000000 bf800000 40a73dc1 c18dcfdc bebbe3c9 -> 40a73dc1", + "00000000 bf000000 3f000000 c132d848 c179633e 3df64825 -> c132d848", + "00000000 bf000000 bf000000 40fb7ff1 3fe7ad9e 3fab8043 -> 3fe7ad9e", + "3f800000 00000000 00000000 4189ceea 418ee84d 3ec12570 -> 4189ceea", + "3f800000 00000000 3f800000 c0eb25f2 c13df8ba 40de2166 -> c13df8ba", + "3f800000 00000000 bf800000 40903b35 418939e1 407e4071 -> 40903b35", + "3f800000 00000000 3f000000 c0a6e552 419376d1 40320485 -> 419376d1", + "3f800000 00000000 bf000000 40bb6a6b c1823786 3fc1eaf4 -> 40bb6a6b", + "3f800000 3f800000 00000000 c0dd8dd2 c186593f 3fd887e0 -> c0dd8dd2", + "3f800000 3f800000 3f800000 419f1020 c1546d61 4099a129 -> 00000000", + "3f800000 3f800000 bf800000 c09c1081 c19c618e 3f5527b6 -> c09c1081", + "3f800000 3f800000 3f000000 c110af8a c180900a bf01b536 -> c110af8a", + "3f800000 3f800000 bf000000 40693a29 c134dd4a bf5c72ac -> 40693a29", + "3f800000 bf800000 00000000 3f9550b7 41953485 3fb6bf65 -> 41953485", + "3f800000 bf800000 3f800000 41321126 bef478b9 408112ef -> bef478b9", + "3f800000 bf800000 bf800000 40fa788e c08ea071 40edd493 -> 00000000", + "3f800000 bf800000 3f000000 3ffe5db6 400a306e 40681b52 -> 400a306e", + "3f800000 bf800000 bf000000 bfa4a853 4199f31f 40d4a7eb -> 4199f31f", + "3f800000 3f000000 00000000 40673ea9 c164e2a9 40b6fc1e -> 40673ea9", + "3f800000 3f000000 3f800000 bf9f7c16 3f734594 bf3645c5 -> bf9f7c16", + "3f800000 3f000000 bf800000 c0b61386 4147db34 4013adaa -> c0b61386", + "3f800000 3f000000 3f000000 406a644e bf018a06 3f9e1c97 -> 00000000", + "3f800000 3f000000 bf000000 c02cdcdb c12c25f2 40c54a5e -> c02cdcdb", + "3f800000 bf000000 00000000 41045eed c167a2cc bf2b3d95 -> 41045eed", + "3f800000 bf000000 3f800000 c1684b5b 4156bbec 400d8b01 -> 4156bbec", + "3f800000 bf000000 bf800000 3e80a80e 418fa7c7 3e6dda03 -> 3e80a80e", + "3f800000 bf000000 3f000000 c128cd54 40c8e1da 40c9dc90 -> 40c8e1da", + "3f800000 bf000000 bf000000 40097e12 c19e9e7e 3f60fe71 -> 00000000", + "bf800000 00000000 00000000 c186c5d2 c1297fe4 40d53554 -> c1297fe4", + "bf800000 00000000 3f800000 41613cba 3f9e1ad0 bdd483f8 -> 41613cba", + "bf800000 00000000 bf800000 4134a418 c177e3c9 bf251c0f -> 4134a418", + "bf800000 00000000 3f000000 c108b239 c0f20196 40168788 -> c108b239", + "bf800000 00000000 bf000000 c121145d c0d463b0 3e62c1e0 -> c0d463b0", + "bf800000 3f800000 00000000 4025df2a c1628d48 40cecba0 -> c1628d48", + "bf800000 3f800000 3f800000 c08488f1 4170d7eb 408f42a5 -> 00000000", + "bf800000 3f800000 bf800000 4154b30e c1777fe2 40dfaa85 -> c1777fe2", + "bf800000 3f800000 3f000000 c0574eda 4146e955 40033929 -> 4146e955", + "bf800000 3f800000 bf000000 41564636 c115bf1c 3e1ff4bb -> c115bf1c", + "bf800000 bf800000 00000000 c1816a12 c0a7e1b9 40bb30ea -> c1816a12", + "bf800000 bf800000 3f800000 c12f7d05 40f74399 40cf5bd0 -> c12f7d05", + "bf800000 bf800000 bf800000 c072a909 c148bb44 404341af -> c072a909", + "bf800000 bf800000 3f000000 c1338a74 c18e6b85 40f06beb -> c1338a74", + "bf800000 bf800000 bf000000 c19900f9 c11c7611 40a2a663 -> c19900f9", + "bf800000 3f000000 00000000 c149b384 40bf0c85 4045e836 -> 40bf0c85", + "bf800000 3f000000 3f800000 41087eb2 c0508f15 40c7f723 -> 41087eb2", + "bf800000 3f000000 bf800000 4149b553 c17a615e 40524e62 -> c17a615e", + "bf800000 3f000000 3f000000 418a64d2 419b27a8 40e6ff90 -> 418a64d2", + "bf800000 3f000000 bf000000 c16cefc6 c1544a84 40816481 -> c1544a84", + "bf800000 bf000000 00000000 40c42ad3 41379243 40bbc8e5 -> 40c42ad3", + "bf800000 bf000000 3f800000 c18f19a3 41739ef1 3fd44d01 -> c18f19a3", + "bf800000 bf000000 bf800000 40b96034 c13dcccd 40cc0246 -> c13dcccd", + "bf800000 bf000000 3f000000 4190464a 3fed65bb 409caed8 -> 4190464a", + "bf800000 bf000000 bf000000 c16c9faf 401262d9 400fa50c -> 00000000", + "3f000000 00000000 00000000 3fc973ab c16a0b2a 3febb658 -> 00000000", + "3f000000 00000000 3f800000 bde2c2ec c1228dbd be334f80 -> bde2c2ec", + "3f000000 00000000 bf800000 bfee4049 c1244f8e 3f7d6b32 -> bfee4049", + "3f000000 00000000 3f000000 4112b9df c125a865 407e4372 -> c125a865", + "3f000000 00000000 bf000000 410424e4 c19ada18 4090730b -> 410424e4", + "3f000000 3f800000 00000000 413966e3 c1909c13 3fc53210 -> c0f559ea", + "3f000000 3f800000 3f800000 c177e581 413e50b3 4064852b -> 00000000", + "3f000000 3f800000 bf800000 c18268cd 41822d2a 40ab2d73 -> c1236406", + "3f000000 3f800000 3f000000 417e7bdb c1076dd5 40a3f27d -> c1076dd5", + "3f000000 3f800000 bf000000 c15a2f00 c03a8471 402948f5 -> c119535f", + "3f000000 bf800000 00000000 40ebfaed c18e279f 402291ac -> c18e279f", + "3f000000 bf800000 3f800000 c1181b2a 40e52245 40b8978d -> 409e1460", + "3f000000 bf800000 bf800000 4083c17e 4054034e 401ef9df -> 4054034e", + "3f000000 bf800000 3f000000 4123a2f8 41114b83 40f41a6c -> 41114b83", + "3f000000 bf800000 bf000000 c18a5a45 c1985b37 3ede6c02 -> c1985b37", + "3f000000 3f000000 00000000 c19399d3 40be806b 40b6df77 -> c19399d3", + "3f000000 3f000000 3f800000 c18ca58a c13c0303 bf555d29 -> c18ca58a", + "3f000000 3f000000 bf800000 c168f7c6 c0f22b8d 40ffd2e4 -> c168f7c6", + "3f000000 3f000000 3f000000 c18ecf69 c16ace91 3f5a2a63 -> c16ace91", + "3f000000 3f000000 bf000000 c0b0bd22 bf9f3484 409f8343 -> c0b0bd22", + "3f000000 bf000000 00000000 c0557cdd bdea736c bf308892 -> c0557cdd", + "3f000000 bf000000 3f800000 408f1409 be30e0d9 40a4528e -> 3f5a9144", + "3f000000 bf000000 bf800000 410574b3 c186e728 409d2316 -> 410574b3", + "3f000000 bf000000 3f000000 c197aeb6 c15bc104 40c56242 -> c15bc104", + "3f000000 bf000000 bf000000 c18a688f 41530ef3 40ff59b6 -> 00000000", + "bf000000 00000000 00000000 c130cf2c 40c722e9 40305d80 -> 00000000", + "bf000000 00000000 3f800000 4110d8e8 c16df93a 40ccb6e0 -> 4110d8e8", + "bf000000 00000000 bf800000 4157aec4 c06a654a bedf3c3b -> 4157aec4", + "bf000000 00000000 3f000000 407433b9 3faf666f befcb3dc -> 407433b9", + "bf000000 00000000 bf000000 41965e7f 41931704 40c0cc25 -> 41931704", + "bf000000 3f800000 00000000 c097b1f3 c19051f9 40babb14 -> c19051f9", + "bf000000 3f800000 3f800000 417ab694 c10f1169 3f72a802 -> 00000000", + "bf000000 3f800000 bf800000 c10fcc5d 4184a617 3f6557c7 -> 4184a617", + "bf000000 3f800000 3f000000 41882009 419305a0 be80f127 -> 41882009", + "bf000000 3f800000 bf000000 4187c6bc c176ce6d 3f7cab8f -> c176ce6d", + "bf000000 bf800000 00000000 c18f5ab3 c093ba7c 40c0ed57 -> c134cc3e", + "bf000000 bf800000 3f800000 41939448 410d72c8 40de6dde -> 418885bc", + "bf000000 bf800000 bf800000 c18f976a c19735f7 bf78b4fe -> c18f976a", + "bf000000 bf800000 3f000000 bfbd7db1 40ca0fb5 3f9e7621 -> bfbd7db1", + "bf000000 bf800000 bf000000 415ee081 be1359a0 40618798 -> be1359a0", + "bf000000 3f000000 00000000 4168c312 c14f1a57 408c9463 -> c14f1a57", + "bf000000 3f000000 3f800000 40d57b76 415a2637 404ccac1 -> 40d57b76", + "bf000000 3f000000 bf800000 40d02d79 c1033607 40a6591f -> c099ef5f", + "bf000000 3f000000 3f000000 bfa5b48f bffadee3 40cb16be -> bfa5b48f", + "bf000000 3f000000 bf000000 4068d6b1 c19faf9e 40995bc4 -> c19faf9e", + "bf000000 bf000000 00000000 40c9ac1f bf663181 bf0bbc38 -> 40c9ac1f", + "bf000000 bf000000 3f800000 419dd242 4101585c 406fec94 -> 419dd242", + "bf000000 bf000000 bf800000 c0914629 be02cdc1 406c55b7 -> c0914629", + "bf000000 bf000000 3f000000 bcaa15d3 c0c06f33 40e66c18 -> bcaa15d3", + "bf000000 bf000000 bf000000 c14262b5 4182e469 3f07a567 -> 00000000", + "40000000 00000000 00000000 415b9a25 c1264e45 3e3fa371 -> 00000000", + "40000000 00000000 3f800000 c09c1528 40d320a5 40cef167 -> 40d320a5", + "40000000 00000000 bf800000 bfb0f05e c1596a6b 40ac131b -> bfb0f05e", + "40000000 00000000 3f000000 c1536b3a c05abf4b 40a03a5c -> c05abf4b", + "40000000 00000000 bf000000 c17c0801 bf4cba60 40a77e69 -> c17c0801", + "40000000 3f800000 00000000 c150f484 c09825ed 4036de6d -> c150f484", + "40000000 3f800000 3f800000 412a8111 414366a8 3f9929ac -> 412a8111", + "40000000 3f800000 bf800000 4180aa4a c132a812 3d5f4b2c -> 4180aa4a", + "40000000 3f800000 3f000000 3eefcd8d c183c340 3fe46ac3 -> 3eefcd8d", + "40000000 3f800000 bf000000 c13fe162 40d66a7b 405e6d04 -> c13fe162", + "40000000 bf800000 00000000 c163ddb6 bffb0bd9 40150cc8 -> bffb0bd9", + "40000000 bf800000 3f800000 4087bb0f 411ff8ea 40b7cd5a -> 411ff8ea", + "40000000 bf800000 bf800000 4133f5b5 40ec5ee0 40262223 -> 40ec5ee0", + "40000000 bf800000 3f000000 3fbbf6d1 3ec5d90c 40c2a1dc -> 3ec5d90c", + "40000000 bf800000 bf000000 c0e76b14 41883238 3dcb1519 -> 41883238", + "40000000 3f000000 00000000 4196c88b 40913905 be60affe -> 4196c88b", + "40000000 3f000000 3f800000 3f215147 c0841406 3fc287f0 -> c0841406", + "40000000 3f000000 bf800000 41186ff4 c0e06daf 40a0e0d6 -> 41186ff4", + "40000000 3f000000 3f000000 40f3f5c3 4197b128 408c8f16 -> 40f3f5c3", + "40000000 3f000000 bf000000 3f1ca914 bfeeaf6e 3fda806a -> 3f1ca914", + "40000000 bf000000 00000000 4098693c 4037ca34 40e2e8c4 -> 4037ca34", + "40000000 bf000000 3f800000 419d80c1 c1762b87 40b6c169 -> c1762b87", + "40000000 bf000000 bf800000 40e32d6d 4184770d 40120f22 -> 40e32d6d", + "40000000 bf000000 3f000000 40cee5fe c0d7bc5c 403103f9 -> c0d7bc5c", + "40000000 bf000000 bf000000 bf23af93 bf2ab3f4 40db0f4a -> bf23af93", + "c0000000 00000000 00000000 40acb295 bff94908 40ca7d1a -> 00000000", + "c0000000 00000000 3f800000 4099a1fb c19826e5 3fca8773 -> 4099a1fb", + "c0000000 00000000 bf800000 bf83e94d c1617e3a 40f2b11c -> c1617e3a", + "c0000000 00000000 3f000000 c127b62d c102aca4 3f907499 -> c127b62d", + "c0000000 00000000 bf000000 c1031892 c071489c 402fbb86 -> c071489c", + "c0000000 3f800000 00000000 40c948f9 4187a928 3facda07 -> 4187a928", + "c0000000 3f800000 3f800000 408b55d0 c1286d32 40f28e7b -> 00000000", + "c0000000 3f800000 bf800000 c04d274e c00186a2 403fa0d0 -> c00186a2", + "c0000000 3f800000 3f000000 c139fe9e c15649b1 408ed1e3 -> c15649b1", + "c0000000 3f800000 bf000000 c10f3447 414adfd5 3e9cbd5d -> 414adfd5", + "c0000000 bf800000 00000000 414cebc9 c1044367 3e8de1a8 -> 414cebc9", + "c0000000 bf800000 3f800000 40f33094 40eb1528 bef5b591 -> 40f33094", + "c0000000 bf800000 bf800000 c12f07be 417a758c 4045791a -> 00000000", + "c0000000 bf800000 3f000000 40716371 c1516cd8 4070339f -> 40716371", + "c0000000 bf800000 bf000000 414d0ab8 4183ced6 4051bb7a -> 414d0ab8", + "c0000000 3f000000 00000000 40de68c5 4117bbb4 3ff18727 -> 4117bbb4", + "c0000000 3f000000 3f800000 418581e0 416609f6 40f3caf0 -> 418581e0", + "c0000000 3f000000 bf800000 c0eff096 412a99a9 40364354 -> 412a99a9", + "c0000000 3f000000 3f000000 41457cfe c18aa1f7 3f1f20fd -> 00000000", + "c0000000 3f000000 bf000000 3ff19e17 415e4a5a 3f943289 -> 415e4a5a", + "c0000000 bf000000 00000000 4129622c c17d5c18 3f3bdaf7 -> 4129622c", + "c0000000 bf000000 3f800000 c0f06844 c0cfe74e 40f431f5 -> c0f06844", + "c0000000 bf000000 bf800000 40c3f39c c11a6e1d 40edf36c -> c11a6e1d", + "c0000000 bf000000 3f000000 c1032f60 c17a1a86 40be2725 -> c1032f60", + "c0000000 bf000000 bf000000 415f3d2e c10d1ce8 406294fa -> 00000000", + "40400000 00000000 00000000 3e2fc99b c014c852 3fc86797 -> 00000000", + "40400000 00000000 3f800000 c138bf06 3f31e501 401b46fa -> 3f31e501", + "40400000 00000000 bf800000 4195d403 c0d48fd5 40bcafec -> 4195d403", + "40400000 00000000 3f000000 bf85615c c0a8e9bc bf7b7d6c -> bf85615c", + "40400000 00000000 bf000000 c0572ff3 c180f231 3f9d1c1a -> c0572ff3", + "40400000 3f800000 00000000 41935aef 40a4651b 4091a9a3 -> 41935aef", + "40400000 3f800000 3f800000 c0f33e60 c1889097 4013adef -> c0f33e60", + "40400000 3f800000 bf800000 41377db6 c0e67fec 40673c69 -> 41377db6", + "40400000 3f800000 3f000000 4197924b c190650c be4f65da -> 4197924b", + "40400000 3f800000 bf000000 c146016f 41048a78 40ad4053 -> c146016f", + "40400000 bf800000 00000000 3f74f8a1 c17c0b41 40e64f07 -> c17c0b41", + "40400000 bf800000 3f800000 c108d38a c161e348 404f94ce -> c161e348", + "40400000 bf800000 bf800000 4175e585 407b1b53 402e378d -> 407b1b53", + "40400000 bf800000 3f000000 3fe275e5 c137ca87 40d860e1 -> c137ca87", + "40400000 bf800000 bf000000 4187c65a 4194e950 40c2f36e -> 4194e950", + "40400000 3f000000 00000000 c197f9c0 40f40b7b 408a0b22 -> c197f9c0", + "40400000 3f000000 3f800000 c17d682b 40f17250 3f9aa8b8 -> 40f17250", + "40400000 3f000000 bf800000 c0c10259 c1308d67 4047ad5e -> c0c10259", + "40400000 3f000000 3f000000 c1287890 41494b99 401ec372 -> 00000000", + "40400000 3f000000 bf000000 41904b55 c0d74abe 40bd0df6 -> 41904b55", + "40400000 bf000000 00000000 bfc4a995 c1224a13 3f75df09 -> c1224a13", + "40400000 bf000000 3f800000 41637904 4162089b 40ca90ca -> 4162089b", + "40400000 bf000000 bf800000 c197ce9c bfd41c86 4052df0e -> c197ce9c", + "40400000 bf000000 3f000000 40c0088f 41769037 40ebfedc -> 41769037", + "40400000 bf000000 bf000000 c1451780 c095d06e 40962552 -> c095d06e", + "c0300000 00000000 00000000 c19daad3 40815b49 bf654633 -> 00000000", + "c0300000 00000000 3f800000 bfd931c2 3f6374c4 40214ce5 -> bfd931c2", + "c0300000 00000000 bf800000 3ff66d4d 4132952b 40bd5d74 -> 4132952b", + "c0300000 00000000 3f000000 418d7d4b c10b61db 40339e78 -> 418d7d4b", + "c0300000 00000000 bf000000 c064633e c12a11bb 409e0c49 -> c12a11bb", + "c0300000 3f800000 00000000 c18ed791 419932b0 3fc93184 -> 419932b0", + "c0300000 3f800000 3f800000 c183abed 4125dd09 3ffdc5ed -> 00000000", + "c0300000 3f800000 bf800000 3f2aab72 c0e1da44 40d26743 -> c0e1da44", + "c0300000 3f800000 3f000000 c0843392 40482647 3fb39ac4 -> 40482647", + "c0300000 3f800000 bf000000 bfa4e0a6 bfec65bc 40a693b5 -> bfec65bc", + "c0300000 bf800000 00000000 409269aa 4189988d 4078ff6c -> 409269aa", + "c0300000 bf800000 3f800000 c1597230 c0a8e186 bf351434 -> c1597230", + "c0300000 bf800000 bf800000 c171a508 3f9b7bb8 40dfad7f -> 00000000", + "c0300000 bf800000 3f000000 c19ef0e8 c0e96dcb 3d2da27b -> c19ef0e8", + "c0300000 bf800000 bf000000 415693e8 c0b3ac6e 3f946310 -> 415693e8", + "c0300000 3f000000 00000000 3e986bfb c0bc57e3 407e5a32 -> c0bc57e3", + "c0300000 3f000000 3f800000 c18be9e4 c1913724 3fa71fe6 -> c18be9e4", + "c0300000 3f000000 bf800000 c14edcdf 412b2d9c 40cfa1d6 -> 412b2d9c", + "c0300000 3f000000 3f000000 40258c73 4140cae4 bf6d1843 -> 40258c73", + "c0300000 3f000000 bf000000 415fd385 41573158 3fc890ea -> 41573158", + "c0300000 bf000000 00000000 c183f71e 40917d13 40f6fc0f -> c183f71e", + "c0300000 bf000000 3f800000 40e95b23 403aa7df 3e24433d -> 40e95b23", + "c0300000 bf000000 bf800000 40d3eddb c184b120 be391696 -> 40d3eddb", + "c0300000 bf000000 3f000000 c0cd661f c15bc987 befec0a1 -> c0cd661f", + "c0300000 bf000000 bf000000 410c59fc c03e19a7 bf7871a1 -> 00000000", + "3dcccccd 00000000 00000000 3fd076d2 c0f6397a 406f6c5b -> 00000000", + "3dcccccd 00000000 3f800000 c1780959 c00cf1ad 4043ddba -> c1780959", + "3dcccccd 00000000 bf800000 408e7e68 c11f86b3 bf5016a0 -> 408e7e68", + "3dcccccd 00000000 3f000000 405dc561 41281819 3efcc7c7 -> 405dc561", + "3dcccccd 00000000 bf000000 418d57c7 3fce4519 403d63f7 -> 418d57c7", + "3dcccccd 3f800000 00000000 4057f9e0 40316be5 40a32b1b -> 40322b8c", + "3dcccccd 3f800000 3f800000 c0a33536 413a4ab4 40d4ac8b -> 00000000", + "3dcccccd 3f800000 bf800000 4157f432 c1337389 40a57d9f -> 407c284c", + "3dcccccd 3f800000 3f000000 c0eea85c c108f7a0 3f5dfdd6 -> c108f7a0", + "3dcccccd 3f800000 bf000000 c19d136f 40c494ab 40b6c19d -> bfca4390", + "3dcccccd bf800000 00000000 3f9b18fd bfbde004 407134a3 -> bfbde004", + "3dcccccd bf800000 3f800000 c1691aae c1953793 4012733e -> c182d3b6", + "3dcccccd bf800000 bf800000 c12f033c 416b20ab 3fdb3384 -> 00000000", + "3dcccccd bf800000 3f000000 c19464e6 4169b856 40790969 -> 40e06f9c", + "3dcccccd bf800000 bf000000 c1366980 4118161d 401d7da0 -> 4118161d", + "3dcccccd 3f000000 00000000 c19f619b c1077268 40cc2748 -> c12f17f8", + "3dcccccd 3f000000 3f800000 41929a22 3f88c9a8 3f1fff83 -> 41929a22", + "3dcccccd 3f000000 bf800000 c1903f1c 4196fb7f bd95c3e1 -> c1903f1c", + "3dcccccd 3f000000 3f000000 c1787cf7 c1789994 40be0b42 -> c1787cf7", + "3dcccccd 3f000000 bf000000 41890311 c186a716 3fee9708 -> bf8bb6c0", + "3dcccccd bf000000 00000000 409d5ca7 40dbbfd7 3db65c77 -> 40dbbfd7", + "3dcccccd bf000000 3f800000 403571c7 3ef3cd0b 4089eede -> 3fdeca9b", + "3dcccccd bf000000 bf800000 3ee91a8f 41400bda 40ffa95c -> 3ee91a8f", + "3dcccccd bf000000 3f000000 c1108af3 40bb68f4 40b581d0 -> 3fbbc4e0", + "3dcccccd bf000000 bf000000 bf73a91c bfbd6065 40827f79 -> bf73a91c", + "c123e72e 3ff83c40 bfef615d bff6dc59 418b73d5 be82d35a -> bff6dc59", + "c181ee28 c11f080a 40ea4495 40f83ef3 413db6ca 3ff7c3e5 -> 40f83ef3", + "410a2e6f c1011edb 40f2e7b9 411beda4 c189e4ef 403467f0 -> c189e4ef", + "c19ea7b4 c09ee11e c0ed6901 418b54dc bfbb520a 40dbb0aa -> bfbb520a", + "41708337 c062b9c6 c1017d8a 4191e3db 4154491f 3fe18601 -> 4191e3db", + "c01e7a84 bf09958e 3f8eeab5 c08dc0a8 417f0083 3f7ffd67 -> c08dc0a8", + "c184a2fb 41120a8e c10456fc c065b5a9 41800f71 4020fda5 -> 41800f71", + "4062f130 40809220 c115bb04 4165dadf bfc9760e 40cd5160 -> 4165dadf", + "c0c0c41f be553b2b c0a35082 c169a285 3fa11060 3f574a4d -> 3fa11060", + "41316f36 4048ac1e 40fdb1c3 3fee0a77 c10eb98b 40b4e2ad -> c10eb98b", + "c07a0f1f 40d058f7 c0207c76 c19a9e8c 4124e1b8 3f850523 -> 4124e1b8", + "41197871 c0fb217a 407c9be1 40816126 418f043e 3fda8132 -> 418f043e", + "413a1a6f 40ae3f18 411ffc7d 40a1a1e3 c119078f 3fe83771 -> c119078f", + "419b5ecf 3fc3280d c05092d6 4190a410 c15ae667 3fb9ecbc -> 4190a410", + "40844842 3fdd4c75 c0c6fe5f c19bca73 c12ced9d 3df6fb9e -> c19bca73", + "3f91bf4b c10937f2 c09f2ef6 bfc3ab36 412bad7f 40bb6c2d -> 412bad7f", + "402c2908 3fe46cac 4074b2c1 40c1ac4b 4183a264 be2ed6d1 -> 40c1ac4b", + "c10a5c85 3f718841 bfca1077 413bc9b9 c1443619 40edd74c -> c1443619", + "417808a5 406671f8 c0d3d1cd 40bce084 40001563 40eeb3d6 -> 40bce084", + "c1978e60 c119d058 40623925 c1800e9b 4175c58d 40c12513 -> c1800e9b", + "c0c279da c0a63e23 41077e61 c10530fc 4060305d 409ef546 -> c10530fc", + "415f1d79 c08f2298 c1069412 4071c7fb c123f85c 40fccca8 -> 4071c7fb", + "3ff5ad1b 40a5f3b4 3fbe5a59 c17a6f9e 410ff7e7 40f790da -> 40d4d990", + "bff4114a c0272b41 409e2d95 c117c791 c0a72320 bef47124 -> c117c791", + "c19a5c3f 40d3177f bf63a736 40f99bdd 4023c4a3 bf4b5820 -> 40f99bdd", + "c0271449 c0a6b52d 3f197c06 c1712cf0 4021b0c3 401d1fd3 -> c0fcf313", + "3d08f4d3 40a14e52 408fcb9c c01a6043 c1891dda 406a6f9f -> c1891dda", + "c097438c bea14e6b 3f557b9f 409fde38 41975f13 3e50f995 -> 409fde38", + "c1787ba2 403d98e7 401c7b64 40d8ee4c c1279f70 40305dcf -> c1279f70", + "40a0aaa3 40072601 4107a613 c0ee673b c1046822 3ffb0368 -> c0fbdee8", + "40ac12ed c0f1b2e4 c00f4e35 c166f086 418d365e 40e812ac -> 418d365e", + "40f674fa 4108d853 c0ec3e94 40323d0a c1195c6f 3fc8f916 -> 40323d0a", + "41329ea1 c03f8078 406638d6 c19ae164 c18e607b 3e5d5dee -> c18e607b", + "c092ec27 40b16e5a c10fa27a c1566ae7 418055e6 40ec5903 -> 40d0fd4a", + "3e446c0a 41151591 c11c8173 412ccd9b c11a296d 3feddd0a -> be493fc0", + "419f0cb0 c09db9a9 4085c406 c0bf98b3 c0abf64b be679527 -> c0bf98b3", + "c19dc5f4 c0900b5b c0e94c35 bf979abf c14f9a65 409e9986 -> c14f9a65", + "419abf4c c0d45ed4 c10f13a9 c190ee35 c0fc8c35 40b49f3b -> c190ee35", + "411e6899 3fa6820e 40f3a0d0 3ececaa7 bfe1fd30 40a19481 -> bfe1fd30", + "c1111ba2 c0e5e613 3fe94a4c c181d4d4 c189c205 bf4fc2ea -> c181d4d4", + "412ab862 c114e65c c01e3390 c12e327d c1072253 bf5cc5e2 -> c12e327d", + "40a23041 41032dda c1188aef 401cb454 4102dca1 406598b5 -> 401cb454", + "c0beed1a 4117287b 41100b3c 41830e31 4110ab35 40051402 -> 4110ab35", + "40e83702 c0cb27c7 409d2a79 417835d8 419e0e04 3f83c435 -> 419e0e04", + "41962893 c0de8053 40f29b0a c15ded7f 4152ede7 3fc1265b -> 4152ede7", + "c0b5178e 40883c83 c0c511cb 4104ba4f c0707ed5 4027f06f -> c0707ed5", + "419f1c3e c0430cb2 bf912d25 c0c7f027 bfecf269 403a2d86 -> bfecf269", + "41369e8a 404bfb44 40ad2439 c18ce206 3f9530e9 4083cf0e -> 3f9530e9", + "4160973b c0d4c476 3f577b4c 4176fb38 41570604 bf6389b0 -> 4176fb38", + "4069e3d9 3ebfecf7 c0b9cd94 c0fcab0d c19a814e 40f46af8 -> c0fcab0d", + "c192ed66 3f279d8d 406c4f8e c01823e1 413e67e9 4099afce -> c01823e1", + "4142553f bf7cfea8 c0d06f06 4152ae40 c186d5bb 40e5620a -> 4152ae40", + "c158bdca 40c08070 40696ae9 409318a4 c119c6ef 409891a1 -> c119c6ef", + "4109096d c00353b6 4117d7b9 c12a023d 40f7657a 404dbe12 -> 40d0290e", + "c18064ef 4118a1ab c0b565c6 415abdda 3e7ffb3a 40c4d47e -> 3e7ffb3a", + "40d1edd3 40840c71 4081de4e 41204b5e 40d682b9 40a4bc57 -> 41204b5e", + "40d49f5e c05f53c0 c119f3a9 40c120be bfa4e88f 40f67a53 -> 40c120be", + "c09a635b c0e40d40 4104a8a5 41639974 412e7db4 3f10ff91 -> 41639974", + "c1937e6c 40d94643 40cb9507 418d1e3a 414151fd 400a8261 -> 414151fd", + "411a7327 405b1752 40130cf8 4153889c 41428b39 3f805000 -> 4153889c", + "4123e75f c1073e8c c0d4a4a6 c13b2b45 c15a4730 4056de7b -> c15a4730", + "c13f38ba 3eccb5be 40ad0480 4191a10c c15ba525 40d8d2aa -> 4191a10c", + "418bb856 c111c6c6 c0095b07 c0cab3cd c1108044 40d21f38 -> c1108044", + "bf3302d0 c0d7442f 40ab75fd c012ffba 4179ac2f 3f79ced2 -> c012ffba", + "c183e065 c0bf72af 408a1e0d c15801d4 3fb7b46b 4081e236 -> c15801d4", + "c197d7bb bff7e463 40a2d69b c00b0cfa c199fd91 407e9cec -> c00b0cfa", + "40d71c6b c0bf105f 406343c2 4055eb2b 418288c4 40bfe859 -> 418288c4", + "3ebde0e2 41135529 3f894ca7 416f700f c147eb11 402f7bbb -> c147eb11", + "419bac44 40eb9800 4098ee91 419c9fd7 418a38c3 3f8ae532 -> 419c9fd7", + "418ef304 c0201ff2 3fd51162 41349578 c0839a9a 407cd77a -> c0839a9a", + "c1942559 40dcc945 3f0e0150 c1442a94 c06e9412 3fd9d1ae -> c06e9412", + "bf6cf2ef 41149e91 c0385575 bf2052f4 c1275574 bcc1e8ef -> bf2052f4", + "417c29ea 4089b3b8 c0f05f0c 3fbe3f35 c052509a 40e917f8 -> 3fbe3f35", + "c16cf157 c02f81c4 c117ef07 c1122f5d c19b0ba4 40ba99b4 -> c19b0ba4", + "c1972bd7 c111578a c0d5b933 416a0b5b 4018da94 3ff5062d -> 416a0b5b", + "4198da52 c0ae2e69 c0838750 bfdb349d 400a719c 4080068d -> 400a719c", + "416b546a 404f287b 3dafa32e c192576e 413570a9 40ae2387 -> c192576e", + "416e5dad 40f4dd57 bf323c80 412b00de 410800b8 40a657cf -> 412b00de", + "4002b7a6 4088ab64 c09265bb c0e75cc3 c18a2957 40969224 -> c115d24d", + "418ddc57 c0f6b528 c119f487 41584a2f c19a37e2 40baccff -> 41584a2f", + "c14f47f5 c0f14c7f 40b0892e 414b8d81 c1261c20 400b0cfa -> 414b8d81", + "417dbfe0 40308f05 c0997ee1 41984685 4147966f 40b486e7 -> 41984685", + "4184e124 c11a652a c03ce6b6 4153aa28 bf8b1cf5 40db6c20 -> bf8b1cf5", + "c09d788f c0a56207 c05b65e3 c176a78e 4106e6ca bf5874f3 -> c176a78e", + "40d6906a c0057ffc c113f630 41771c2f 4135d6d2 40738bc5 -> 41771c2f", + "4132e0dc c08d4fd4 c01b0e7e 41882c7d 41987e03 40ba68a4 -> 41987e03", + "c1728b62 40532e59 40a5c92b c1720020 417f7100 bf56038a -> c1720020", + "c03825f9 4119be0c c06e734b c1824e3f 41860074 40aa7947 -> 416b86a6", + "41722176 c094c354 c0c2bd88 410ada22 4099d695 409c7b27 -> 410ada22", + "412fb3b7 c0739691 c07d3497 c18ee3aa c118a6b8 406503ad -> c18ee3aa", + "418aebd5 4081db0c 405dfedf 4190e420 411ab540 40996590 -> 4190e420", + "40583619 40bfc343 40f9ae74 c0b6956d 414ca2c2 3f5711dd -> c0b6956d", + "40da8fc3 c0b3595e c0d0ee9d bf6cecf9 c19784b0 3f1a3a42 -> bf6cecf9", + "c087f138 3fa6c067 41074474 c18daf2a c0214b7f 3fe672ea -> c18daf2a", + "3f409334 400c2389 c10a2453 41880fda c1685f38 3fb13e47 -> 41880fda", + "c190962c 4105f6c3 40f3de45 c192629c 40de2acd 408c3993 -> 40de2acd", + "c18787d8 400159af 3f88bca3 bfce58eb c0b57d11 4096beef -> c0b57d11", + "408058cd 41109e84 c081bbd3 c098d80a c11896a0 3fd3a158 -> c0f4faaa", + "40a359c9 c0bc293f 40d7f319 c11ee0d3 c154f001 40f5e62a -> c1501f86", + "c16f30e7 3f1d1a73 c031baee c18e1e56 c0a05782 40704787 -> c0a05782", + "c183476c c0db1c8d c07fbe01 4193c95c c1593350 40a528c8 -> 4193c95c", + "4192e4b1 c0c51bc6 3f847372 c1380d19 416ccefe 40bbe755 -> 416ccefe", + "412310a3 3f5dbacc 409c1478 c088342c bf2434d7 407208a3 -> bf2434d7", + "c0a752cc bfbaee33 3f8b4526 c1653e54 c19800f8 40b84460 -> c1653e54", + "c04e2f84 c03bebc5 c0ef78d1 4184b5d0 41575a8b 3fe5285d -> 4184b5d0", + "415cc176 405ba2ca 41105915 4081cb43 c08243d9 40947ea6 -> c08243d9", + "c1341144 c0c54544 40f752a2 c018f5cf c153c4ac 40b4cc92 -> c018f5cf", + "3ff9a8db 40bb8095 4103d6bc 4112fa6e 419c4031 405226bb -> 4112fa6e", + "c15705fe 40d5fb8e c094edd4 c061ff5f 417fb12f be09d130 -> c061ff5f", + "419fb1dd bd840f3b c11148c3 409f0f85 4169600d 3ebb53e1 -> 409f0f85", + "c1895543 c0a32d0c bfb717b8 4104495b 4180d18e 4084f498 -> 4104495b", + "c192af53 411af67e c116f40d c1396738 41448c5f 40407543 -> 41448c5f", + "4067c9e1 3fe52ff9 bf378357 40807a74 c19bb9b3 40e75682 -> 40807a74", + "4182ee1e c0441d3e c10fd915 c12375b4 411f9784 40b991be -> c12375b4", + "c1295ee3 c0239259 bf921174 bfa00dc4 3faf38ce 40c8e67a -> bfa00dc4", + "c01582e7 c10b564f 41112e1c c0bf15d1 c1467caa 3f88d8a6 -> c0bf15d1", + "c0ad6948 411d8537 41109ace 40a9bca4 c15f8155 40bda4ea -> c15f8155", + "4014ccf2 c0dc1a16 41014106 c10182cb c03aa9f2 3f084c2b -> c10182cb", + "40a6b6bf 4103c12c 3f94f407 4187692a 414cfe63 40d2c0f3 -> 4170d622", + "400f6cda c0adc154 40f1ac5a c0a463e4 419371b9 40dd122a -> 410822da", + "41503caa bfade438 408cf904 be90f851 bf88698d 403211cc -> bf88698d", + "3f207b4c c0c26641 4118f155 c15b012f 40cb2c29 40388da3 -> c0d7a879", + "3ef707fd 4071f3de 4111274a 417c24c7 410b86af 402803a6 -> 417c24c7", + "40ba8bd0 410607ab 411769d1 c147b4a0 41864a65 40ba81c7 -> c147b4a0", + "c064fee6 bf85ad4e 40f05b11 c16c6cba c14fb3fa 3ed43a46 -> c16c6cba", + "419b5b62 40f3ab34 c02ebaf1 c18be115 c0cd2269 3ff8d4d2 -> c18be115", + "415b0488 4029f87a c016fc38 405de869 416f7331 3fecc36e -> 405de869", + "418f0e0a bfbd4a75 40587544 c177836d 4159c6b1 40adcecb -> 4159c6b1", + "c0cd9569 bf35bbba c073d592 c18e37ab c13b1498 4093f2f7 -> c13b1498", + "c196c074 c0945e9c 4089e732 c18ceeaa 418569ee 4018ef51 -> c18ceeaa", + "41835e4f c06c6779 40093280 c0c300e5 40efc0c6 40e94cba -> 40efc0c6", + "c0d7a99b bf0baaa7 4096e498 3fee4323 412f41c9 3e955758 -> 3fee4323", + "c183f587 3fa0066f c0d16410 414fb5bb 4195af7d 40abed2b -> 4195af7d", + "4163cbaa c10b74ba 40a15381 3ee825b7 4199454c 3db29ca1 -> 4199454c", + "417839c6 3f1167b2 4093dca5 4178560c 40957569 40ec5124 -> 40957569", + "c11c101b c012b8b6 c093ec77 c19daa9d c1784970 3e8ff601 -> c1784970", + "4198782e 40c2223b 40fe3db4 c02acaf2 c0acb2af 400f5c80 -> c0acb2af", + "bf9f82f3 c0277d2a c0b306ef c0ea5e02 3fbe5e19 3f4dca06 -> c0ea5e02", + "c090bfd1 407eb620 406783ce c17b03de c0fa57b9 3e323a78 -> c0fa57b9", + "41033b01 c094fd73 bd630111 c14ca47e c0b90131 407a1547 -> c0b90131", + "c18e5210 3eed6ee7 4076fa16 419f5753 bfaed75a 40158361 -> 419f5753", + "c178cd26 40f0a5be 40d88aaf 41418963 41469d57 3f77612b -> 41469d57", + "40cb9c83 402e75a0 c0b1dd61 c141db7d 40f285ce 3f0d7330 -> c141db7d", + "c1157c0a c08adef1 beb45251 40db4b33 bfb552a9 40ef0fd6 -> 40db4b33", + "4188a153 411aede4 c109a5e0 c0044c7a c10bac41 40a040c2 -> c0044c7a", + "c0a576da 4038f5c3 3f386785 c15bd785 40c5c237 40892698 -> 40c5c237", + "416ba70a c02b6ea6 c0613c29 c125173a c1167aa1 40e7c9a0 -> c125173a", + "c15397db c0d3c96e 3f76b6c8 400a6445 c08fa34e 40c5b8a1 -> 400a6445", + "417863bc c0c88b6c 3fff3063 416acf74 c0a8771b 3f36eb3d -> c0a8771b", + "c15f4abe 411f195e beed433a 402e1360 c192f4bb 404d6e11 -> c192f4bb", + "c1551ac1 411d1306 c0a67270 c19135f9 c15fd7c3 bc980d7e -> c19135f9", + "4193a363 3f3e2eaa 40985960 40942db0 41879b37 40d7e6ad -> 41879b37", + "c191c6ac bfca49f8 4008a0ba 4107a7f8 c19d408d 4058be73 -> 4107a7f8", + "bf9b6d81 c000a3fd 410b088e c151da71 c1810cc0 40a1bcfb -> c151da71", + "c19b7487 bf86f001 40643290 3e105aec c0ae35b4 40e1a8bb -> 3e105aec", + "c19bbda7 c0317ff3 410c7f77 c1429ab3 4074db52 3fd7646d -> c1429ab3", + "c16c838d 40a4c079 be77a5cc 40f23aca c12c7e60 3fe9e672 -> c12c7e60", + "bfc8e1ac c1000a3b c0c4f881 409f54cb 3f98c013 40c27a5d -> 3f98c013", + "c184399b c0a92143 c0f13b43 40b84e9f 3fd0180c 40b970dd -> 3fd0180c", + "40536a53 c08fc9c3 3f11ff65 41838774 c179f7ee 40384d69 -> c179f7ee", + "c1429324 c105f5bd 3ede9e90 c18490ae 4081b20d 40cf076c -> c18490ae", + "40f04aa9 c1183989 c0767b4b 4067a7f7 c103457d 3e04efe7 -> c103457d", + "415bc9cf 411183d6 40fad3d3 418dc398 410fb70e 40bc497e -> 418dc398", + "c0932033 3fe9e13a c0001e85 41977f14 c11a151d 408a606a -> c11a151d", + "c0b5199f c09a777d 4021a4d9 c1029f60 c199d588 40f2c7ea -> c1029f60", + "419a94e9 c08ed5c6 c041eff8 4053e116 4028495b 4080598f -> 4028495b", + "bfa1bbbc c0bd5afd 40272d1a c0d93ab0 bfdcc08d 404fa22e -> c06aabd0", + "403b3c30 3f819783 c0810ed2 4170d101 404a339f bf6de4bc -> 4170d101", + "c1538d44 410ea5df c1038115 c15d50d3 4127c4c0 bf3f4cf5 -> c15d50d3", + "41628f0a c06b5a86 4069d6fb c12edd51 417b7f46 3e9383e2 -> 417b7f46", + "c1382c12 40bbecbc c0f04d85 4125cb03 410daad4 401c9ab9 -> 410daad4", + "c0773703 c0d16321 c0e95d1d c16ae362 4183271e 407d9754 -> c16ae362", + "419a3bc5 bf92cea5 40b65319 4194ebc2 4188ee0b 3f5e6a85 -> 4188ee0b", + "c19d3808 c0cee0c8 c11f5d6f 40836382 4138c9aa bebea046 -> 40836382", + "bf92907e c0969a1b 3f1d6d39 c17d32d3 c137de28 3fb71b6e -> c14cbbb8", + "c031be2a 40f60128 409964a4 c11128d4 4188595c 3f1cae6b -> 4188595c", + "412d56a5 411839d7 c116fa56 c156d0a3 413088cc bef7e820 -> c156d0a3", + "c1964f1d 4070584b 3f6b3af1 c1831080 c1906268 becf0779 -> c1831080", + "c0b7c1f2 bf8cbdc3 40ca18a0 40ed7fd8 40185336 3fc1c215 -> 40ed7fd8", + "41373ece 4098f23e c0e7c347 416ba5d4 c11a0a5e 4007a952 -> 416ba5d4", + "410b81a9 410bbb35 410f0e10 c032fd68 415b424e 40b8d2f3 -> c032fd68", + "41925148 c0b8ea8f c09ae4b6 40e57460 c181c192 409cdf42 -> c181c192", + "410fb352 c047d33a c088357d c168c4ea c113ccaa 4023d7b2 -> c168c4ea", + "c0fef3bb bf80390d 3f4c6e5d 40ac036b c063cee7 409c8d25 -> 40ac036b", + "400ac498 3f96f769 c055194a 418910ab 41104196 bf40d77f -> 418910ab", + "4193f910 c08f5ff7 40e4386e c117eb27 416c1f1a bd1c37c7 -> c117eb27", + "c02d7910 c0c9c795 c112081f bf930144 418c041f bf179cd2 -> bf930144", + "c0b74162 40f5e59f 40f19f99 bec67e5a c0fb6cf3 406684e1 -> c0fb6cf3", + "c048ac72 40f3ca52 4095d9b3 bf7ecfc8 be374cf5 400d1acf -> be374cf5", + "c1858791 40c5aad2 c064e78f 410515cb c0a295c1 4070a78a -> c0a295c1", + "416db735 3fc1a156 40589023 bf8617a4 41888bff 40f45a4a -> 41888bff", + "40adfdaa bec93f13 4008d3e6 408f253b c12a27d0 4039964d -> c12a27d0", + "c198a966 40383183 41198062 419754b8 c184292a 3dbbc118 -> 419754b8", + "c19602e1 c0c499bd 409d1cd2 c0a8f517 c035fb98 3f283a2c -> c0a8f517", + "c109205d 408ae1a0 c0ff508d c0f7a67a c1769760 3f966aab -> c1769760", + "c18e49dd c0a4f6b3 c0f81cc8 c0fd1eca 401d387c 40f05d7a -> 401d387c", + "c13962f5 c0d8de1d 401e9bb2 c169433c c1898449 40fcc52b -> c169433c", + "4121abfa c07756d5 408ede25 409d0f12 40fedbc1 40617dd9 -> 40fedbc1", + "c0137cfb c0f319ad c006d07e c11a4a25 be5d9099 3fc151c6 -> be5d9099", + "41073ff3 407dce02 bf39fd79 4194c641 bfed2115 bf0a623c -> 4194c641", + "c17962a3 40ce2d4f 408c6e01 c1817fbf 41676e9e 4014226e -> 41676e9e", + "c112ab58 c0284990 c0f2ff42 be6ae929 41142ca8 4096e2db -> 41142ca8", + "c177fd64 be1e9332 3f5d99f7 40deaeb7 40328890 408a980d -> 40deaeb7", + "413933a1 c063f927 c10fafea 4108ac55 c1416ac8 402e6349 -> 4108ac55", + "c0b30ace 3f455f34 bf05c8ea c0584553 416d9a4e bedea771 -> c0584553", + "40d9f92a 40ccc3ee 40dacb38 4199d0eb 4156242c 4097383b -> 4156242c", + "c186ea19 c0c34743 bfc7b84d 40d22ab5 c1642c91 3ef47ea6 -> 40d22ab5", + "40a709f1 4119d441 3f4f99cd bf9cff69 4177a7d7 4073c36f -> 40f172b2", + "4115c116 c103f9cb c04ff4c9 bff8c9fc c143c6b0 40c6b330 -> c143c6b0", + "41832e2e 40b5d1e8 c0f5797e bf48b215 4185b904 4025650d -> bf48b215", + "c1615d2b c098500e c10e77d0 c18dfd22 419805da 3f8e137e -> 419805da", + "402922a6 3f856ff9 c0b286b0 bfc80ab9 c10570b3 40cc39a6 -> bfc80ab9", + "40e96f20 3f8db792 c0aad0a5 41892d6f 418bb48e 40c427d3 -> 41892d6f", + "40687263 c0fccfe8 410dd331 c1392a91 3fcab87c 3f990412 -> bf1131f0", + "c00e975a c08fa56f 3fe37edd 417d9e2b c176072b 4052a670 -> 40cba12c", + "41330780 c0a686e5 4116fbda c0ab6596 c0dd5693 40fc379f -> c0dd5693", + "c0a53ac2 41143a2e c0b61cf3 414e2f73 bfceda1d 40337f1f -> bfceda1d", + "c162c1f0 c0e82c11 c0d2603f 4171d8b3 bf9afb2d 40810cbc -> 4171d8b3", + "41873683 c0e0937a c115b89f c166cf2d 4090456f 3f1eb208 -> c166cf2d", + "41889f70 c075a50d 40c15e44 bf015ab1 c190309f 40b872df -> c190309f", + "c1200f76 c05282ef c0d5703d bf9e7e7e c18ee641 40a533ef -> c18ee641", + "c046e6ec c0ce49f4 c1190b9d c137eb6e bf9331d7 bf14bd57 -> c137eb6e", + "bfe0d620 3fb3bce1 3fc4edef 4184ef87 411f4aea 3fbcdece -> 4184ef87", + "419c4b86 411019e0 4109bb6c c119b4eb 40b71760 405fcc9f -> c119b4eb", + "c062331c c10c457c c0234a8f c19c1518 414bb1e0 401cf760 -> 40d8ff74", + "40c89a1c bfb75575 c0dc940e c18edf38 be85cc0d bf16a990 -> c18edf38", + "41578159 c11d663c c0fe9538 c11eae0f 41765d33 4082558e -> 41765d33", + "c014598e 4061096d 40bfa532 4079d7c5 4136d648 4075793f -> 4079d7c5", + "4195182d c1138938 3fc0774b c109091b c0ff8b8e 3f15e584 -> c0ff8b8e", + "417f72dd c117d7ca bfba12f3 c157eee8 c006cbc9 40c32136 -> c006cbc9", + "40fb6b0b 40e79260 4079d6d5 406a7764 c134f5d5 40ace7fd -> 406a7764", + "4118c1eb 40112fc7 c1036f9d c1951f8d c18b1e3d 4015331e -> c1951f8d", + "4185ffb1 c00cd639 c11872fb c10c6902 408f279a 3ec36a6a -> c10c6902", + "4149363f 40bd678d c08e828a 4072cabf 41587f4e 4045f328 -> 4072cabf", + "419241f0 c0e1eb84 bf14b22d 4188d248 c1289263 3ee4c73b -> c1289263", + "405f97a3 c0ee6f5f 40ba33b2 412ba124 c1026a7b 40839e7f -> c0f438a4", + "c14b836a 4077629c c05d06d8 c1437532 41079adf 3f38c4b4 -> 41079adf", + "3f01a55b 401a7ef8 c0fe7efc c0d58c97 4047c715 408deee2 -> c08ee1ca", + "3db79cf5 40b3a470 c0f98852 c17e6d5b 3ed30e61 40932743 -> c10ce730", + "c137d712 c0c684da c0c3cd57 c040827f c18538ab 3f1e8c02 -> c040827f", + "4041a68a 3f4766b5 4056278e c111706e 41932ee9 40b3ae27 -> 417631e0", + "c0900fc8 40f7f744 c0e2cbe5 418f401e be07e652 40850f4f -> 3f0da180", + "c1943e2e 40bd369d bfc37640 419d018d bf2a2df9 4075dc68 -> bf2a2df9", + "c18a35a9 3e97483c 40fa17d0 417bb44e 41966712 40abe77a -> 417bb44e", + "41805b76 41027632 41124265 41248dac c1662242 becffc18 -> 41248dac", + "c17a3bb3 c0c85311 40a32480 c0bf459d 4167f70c 40e27098 -> c0bf459d", + "419ff7a5 40fa12a9 c0f22da2 c00ac833 41255d2e 40ada994 -> c00ac833", + "c1354ec2 c063d161 40c70f51 c1059d98 40359374 be12034b -> c1059d98", + "416081ba 3f9bf926 bf3320e3 c07bdfbe bfe1dd24 408f5942 -> c07bdfbe", + "c07fb272 c107f286 bfb71487 c11d5431 c0b64494 40d9f505 -> c0ece8b1", + "c154f5e5 40b55184 4035c83c c1714484 41280dff bf093958 -> c1714484", + "40f488fe c03de281 c115f162 4121931e c0f24ae4 3e9b5aba -> 4121931e", + "414d5f7d 4007981e bfdc3565 416e7e45 c16b96ac 3e56cc48 -> 416e7e45", + "41865104 40313138 c0aed66a 413ac2b6 c0ff2ee0 3fd4a5d4 -> 413ac2b6", + "3fc7faff 40f32713 c0c2ca42 c154852f bffc8100 4011ef25 -> c1052926", + "c154cf72 c0d4c2a5 bf52f051 c192f895 416fd6a7 40dca221 -> c192f895", + "bf7d6ca2 40f6ba5e 411e2733 41000d24 4118a7b4 40992a34 -> 41000d24", + "c081d363 c0be1861 c0c9af1e bf3c3e39 c19cd102 40f565a7 -> bf3c3e39", + "4139da93 c0b358ac 40eff88e c0aaf923 c194c416 40b3d110 -> c194c416", + "c182a0db c0e2a4b4 40fca945 c1980938 c0f0ba06 40b8bf8a -> c1980938", + "c11e1c6d c089dad5 3fd24dec 411f900b c077799a 40661b82 -> 411f900b", + "4080008a c0eb7f13 40b2d66b c016dac2 414538bb bf135f23 -> c016dac2", + "40d996e1 c0c70d46 4065a60c c13b9f3a 415fac09 bf37032c -> c13b9f3a", + "4109dab1 3f076124 bf99eeff 4184f442 c102ee67 40cc2cce -> 4184f442", + "c1851cde 400a20a5 c0858329 beca59b3 416bdcdc 3fca8897 -> 416bdcdc", + "c10b317d c11f979b bfbb0e05 c176aec4 c182fcab 403ef45e -> c176aec4", + "4159d8cd 3f5bd0d7 40c3bd9d 40cb0d7a 41559729 40b0f7e6 -> 41559729", + "4146b57f 3f5cf7cc 40a5778f 3f6df7d6 c035e412 3fe1b398 -> c035e412", + "416cd450 3f991c3f c0e584fb bf14bb04 c034f416 4003960b -> bf14bb04", + "c10227ba 40795c62 410912a0 412ab3d8 c09a7782 40f08858 -> 412ab3d8", + "401d4dd9 c11c71de c031fd9a 4054ae8a 3f09bf52 407abed4 -> 3f09bf52", + "416a2d25 bf98b663 c0a9e8ea 411713b7 c183463d 40ebe1a3 -> 411713b7", + "c1861366 3eb35c40 40163ef8 4104a4ef c11044ed 4084139b -> 4104a4ef", + "411527b2 41159d8e bf6ae6ff c181cf22 4183631c 3f076776 -> c181cf22", + "c0f576b8 40afabb1 c0acd044 bff3f805 c0af0037 40af734b -> c0af0037", + "bff0198f 40e21a27 41078845 41678d5b bfc2d55d 402948a8 -> 41678d5b", + "c15b3476 40bde615 40305b09 c196e55f 419d7f50 3f77cdfc -> 419d7f50", + "40e0fa1d c11c4ebc c0be9c37 bfd60d8d c0ee20c7 4026fcf5 -> c0ee20c7", + "41161a8a 40e494c4 410f30ae c09663c2 41857fcc 40d4b0bb -> 41857fcc", + "413ab12f c0d28823 c04ccd31 3f5bfe32 bfec74f7 3fcb5433 -> bfec74f7", + "c04e2936 40ea7935 c0955d3f c1001ac7 c1910d15 3fa4c7e8 -> c1910d15", + "4172ad8e 411bcca2 409c035b 3f9fdca4 3f90a4b6 3f5276b7 -> 3f9fdca4", + "418e2cf8 3fa34c5e 40331a40 c19a0bcd 41738ded 40139e9f -> 41738ded", + "417730a6 c0b8b0ee c0cf4ea8 41792edd 418fde9a 40b7430f -> 41792edd", + "414f84df 40870be7 3fa8eb0a bd01b4fe c023febe 4032e880 -> bd01b4fe", + "c1594cef c0f777d5 bf72aeb3 41106788 bfb4e22d 40377257 -> 41106788", + "419d987b 4036cc09 c0e00348 40b5de31 c014f3da 40d1f782 -> 40b5de31", + "400ab3d8 c1114242 c10b2a6f c03a5cd0 c030b894 40e16bfd -> c030b894", + "c16fb72b c117e6eb 410f99b9 4183cf14 c09a8fb7 40098e85 -> 4183cf14", + "c127a60a c11b36eb 410f7a77 4137364b c14d1beb be254892 -> 4137364b", + "41012c33 c0155314 405b5f40 417a9b1b 41283536 bde9ba82 -> 417a9b1b", + "c15508a4 c112a74f c1100d1d 415b3a2d c18662c5 40d74eaf -> 415b3a2d", + "415fe545 411953e3 40d94c20 410d2a63 411087a5 3f4bd10f -> 410d2a63", + "c0a772a7 bebdebe4 411a0547 418c365c c18c0ff8 40eb11db -> 418c365c", + "c0e06006 40c0f086 40694b4b 4173e5e0 c0c68ed6 40ebf913 -> c0c68ed6", + "c1287049 c0dc5130 404add12 412c2c78 bfdec8fe bf3e4668 -> 412c2c78", + "4165d405 40a6de6b c0b5e210 415301a0 c16e954f bf3bec3b -> 415301a0", + "c125cf7c 4099c4a9 c107fe21 4193fdf0 412f8a7d 400da8ba -> 412f8a7d", + "c0c84680 c0042ae1 40a810a5 41514e65 419cdbd8 40e7fb3d -> 41514e65", + "41087a47 c0b980d5 406cc3b8 414b2a69 4191ff54 bf0ee6f5 -> 414b2a69", + "c1987609 408b7a4a 404dca2b c16d7a39 40ac3e6a 402203ed -> 40ac3e6a", + "c11e5c8d c08a2e49 c09f0881 417a1c77 419b9370 bf4858c9 -> 417a1c77", + "c1098f0c 3e8275cf c111a747 c02c9f0e 4176f95d 3f46f3c8 -> 4176f95d", + "c0c57d4b 3f286ea2 c1163a49 41937e70 c150a3c5 bf653323 -> 41937e70", + "c113e3f5 beaf5c9f 410b2870 c16fb265 c16fd011 402337a2 -> c16fb265", + "c1854c6a 3faf2a2f 4086baf3 41142323 c16e1521 bf3fdbbd -> 41142323", + "c022a93d 40dfd599 3fac66db 40ee4497 bf54232a 3fa42406 -> bf54232a", + "c07d2222 41170059 40dc3e03 3e33d9fd 418aa0e6 404b861a -> 418aa0e6", + "4116801a 3f01bf08 c11e62bf 41244a2e c0d41a8b 40ddd61c -> 41244a2e", + "413b6a88 40d6705a c05df913 40c904d5 bfb81d7e 402b66d3 -> 40c904d5", + "417cd2f8 411e2ca9 40e9cf22 c1525d0e c192a911 3f9a7138 -> c1525d0e", + "c19f8556 c0644a2f 40d46cb1 c1995cbd 4186fa65 3fd7cea6 -> c1995cbd", + "410bd6b7 40ef304b 4116df41 c17292c3 412cb26e 405187ee -> 3f31c440", + "41326cc9 c0b2e952 c0868984 c185f0e1 c167e3e6 40c84962 -> c167e3e6", + "bfb1587c c097df56 c0acbc02 c0a8b77e 410a9d07 400e7aef -> c0a8b77e", + "c169eadd c0572ae5 410b1035 3f7eacd3 c192f706 be136b31 -> 3f7eacd3", + "c0db009b 40dd623f bfc33a67 4194edd8 bda8fc11 bf605f17 -> 4194edd8", + "bf43699c c0adbc86 3fc6f489 c1666b61 40ec7357 3d2422d7 -> c1666b61", + "c18ebd45 411ec15b c0a1007d c0e81641 bece71b2 bf684ebb -> c0e81641", + "c18da011 c1060120 c003d389 415a46dc c19cac78 bf574014 -> 415a46dc", + "412a0276 411c2f4d c1105cac c0b6f44c 3fcbf163 3fb95879 -> c0b6f44c", + "418653df bea4fa97 40b52eea c17a4489 c1577600 3b6927a7 -> c1577600", + "c076a39b c023c493 c0b25db1 418f0cd8 c16aca4c 40d57146 -> 404f4720", + "c187269c bf97c0f7 bfbb1c80 40823cee 41129c7a be07757b -> 40823cee", + "c0ee5ff6 403b3707 c0f69655 40adc879 417fc6eb 40e4f3b2 -> 417c1fce", + "4140d082 3ea2391f bfbe04eb c0ca4d1d c1694536 3f6eb8e7 -> c0ca4d1d", + "c19ff4bf c0e055e5 408eae8a 40e6c195 bf4dc576 40acc74f -> 40e6c195", + "3f97f6a9 40b8fc6b bfaecd2f 4128ba25 4198dfbc 3f16ddc8 -> 4198dfbc", + "419ebc18 bf3b5263 c08258fa c106661e 40be1086 4024d6fa -> c106661e", + "c0e1b1ad 4004f528 40e356aa c0f3d80f 40f7b88e 4086799e -> c0f3d80f", + "40d09500 410f5ec9 c067ef51 4101f25a 413816e8 40b7cad8 -> 410b5f9b", + "4131dd8f c00bb974 bf3fff89 3fe40255 c1961984 40db99f7 -> c1961984", + "c0aeae99 4101f76d 3f2ab6fe c16ff263 40effd63 3fc309ce -> 40effd63", + "c181718a 407c7e48 c11faa17 c1781914 41686c4a 40e2aef9 -> 41686c4a", + "410934a3 bf0dd0cb 4104fe4a c02d3b1a 411937b1 408a7d96 -> 411937b1", + "c1014211 c0c0046d c0be1c1e beaf2a15 41607fad 3f9c8e00 -> beaf2a15", + "c19a9039 40dc19d2 40a6f153 419a0c1e c0848762 40d92088 -> c0848762", + "beecd155 4092314e c118be02 41113a3d 3f7be33f 401f86c6 -> 40ba8f55", + "413a39c0 41186bb2 bff1dc62 40ab360f c185aa52 4059a356 -> 40ab360f", + "4198b011 c09f94b3 40e7f5d3 c0f3ee07 409fdc79 3fdf1570 -> 409fdc79", + "40907aef 40d6db9d 3fc7ee97 c0f79681 411796fa 40082e85 -> 3eb403b0", + "c160edc1 c0851299 41176386 c04056a0 41482688 3ed01d77 -> c04056a0", + "c194a48d 40fdd3c3 41023b47 c190d82f 4092ef8c 40fc669d -> c190d82f", + "bed5ce7f 40d22473 40858eaa 41865b3f 4041efc9 40e061e3 -> 4041efc9", + "c0f7f032 40a9ffa4 4115c76d 4119fc72 c1427ecf 3f1f59b6 -> 4119fc72", + "c14663cb c09197e4 c0d89bdf 4196a018 4148d505 406d6132 -> 4148d505", + "bdc006e5 40572c93 c0d4fe67 41177728 c18a706c 40321420 -> be1e9440", + "411e7302 c026e9c0 3e0758d6 c126e51c c0f68ef7 3f8c8732 -> c0f68ef7", + "c196ec24 40211060 c0d7d942 419fa712 418dc1d1 3f3bac72 -> 418dc1d1", + "c0abfc1c c0ca9f06 4037f0d8 c1963734 c158b692 409f93a3 -> c1963734", + "4022e3ab c0cbbabb 3edcc712 411e7c73 411d71b6 3ef34c2d -> 411d71b6", + "40a55c50 4030ce3f 410930bf 3f25f5f6 4124d393 4092884f -> 409baa2b", + "c0721792 c075f0b2 bf263653 c17971c9 41339c7a 40b7ce8a -> c17971c9", + "c0954aaa 4112fb77 c1029003 c1407f7e 40fe1ca3 40d0b85c -> 40caea0c", + "417745a5 bf9abf6d 410f4073 417d80bd 40b99b15 40ba86a1 -> 40b99b15", + "bec52b77 c08b2732 40f314af 403106ef bfbcef9d 3f83289c -> 403106ef", + "4128f060 bd831d68 c0b60314 bff6a829 413f26fd 40bde3e2 -> bff6a829", + "418aaf7f 40fd0e40 411657a2 40abe9ad c052c703 40b0c14b -> c052c703", + "c0a97ec2 c032afbb 4085b922 3fc3fa4e 411cf037 40ad51ac -> 3fc3fa4e", + "c12922fa 3edfb139 bf6536ce 41245aa1 c1748373 40c2ef70 -> c1748373", + "4197ea94 c0925c41 c0fc1b94 c16ea09c 3e5a4bbe bf463452 -> c16ea09c", + "415ea051 3fb9522f 4018cd2b 41627572 c1399c7e 40f8b5f9 -> c1399c7e", + "418e25c7 c02ef071 c0264814 410f1a9a 3fc64fa2 3ffc937f -> 3fc64fa2", + "4195eb10 40872f5c 40f7383f 40653419 41087835 40aac3ed -> 41087835", + "410d341c c115122f c0c308c9 3fa3230c 40cf3a33 3fbcc560 -> 40cf3a33", + "4189d441 c07c4861 c04dcdba 411eb3f0 40e40d25 40f116f9 -> 40e40d25", + "41521521 40fd1d9c c02db184 c1054987 c0402b4f 40a8283f -> c1054987", + "40290024 404d4b0d c0c3e751 c174ea06 412a9e22 3fd3c6eb -> c174ea06", + "c18522c5 c0eedaca 40f3bc22 4021db35 c07dd60f 40d84494 -> 4021db35", + "c11178e7 c08024f3 c0a2375c c185c183 c142d54e 4063f4ad -> c142d54e", + "4194973d c109b240 be887716 c0f0f314 c046c788 be29f4cb -> c0f0f314", + "410756f5 401497e1 410b033b c179fd5a c14141b3 bf48d4a7 -> c179fd5a", + "4059c39b c0e0f9a3 c10a1fcc c09e234b c15bdd36 40f23da7 -> c09e234b", + "419a02b9 bfd6b7c3 3e3e72f8 c1374316 c101671d 3ea95819 -> c101671d", + "c191134b c0b9332b c0f99dfd 40a34727 41897424 3f49643c -> 41897424", + "416ffa8f c0cd1544 409054e1 4118ddda c11eff8e 4029db56 -> c11eff8e", + "404f1cca c07c8895 3ea107ca c038e60f c11bca61 40a72058 -> c11bca61", + "c0cd9e67 41062482 c082cc8e 410b3c24 4089a453 40480e58 -> 4089a453", + "418f5d6e c0d0c7b7 c097833f c14a1be7 c01c9188 40f114de -> c01c9188", + "c0d18fcb 4015757a c08e47d3 c1920a51 c0b88638 4024c3f5 -> c0b88638", + "419fbd89 befdc316 c0c5d287 bf72d9d9 c16441cb 402fe33d -> bf72d9d9", + "c115b508 bd6dec18 c0ecef9d c17390c0 408393c5 40aae977 -> 408393c5", + "c029699d c057db25 3fa404e3 3ed75f73 bf07c9a9 40f762d3 -> 3e986287", + "c1653baf 3e99d573 bf65dacc c19401c1 40b3301c 40dda430 -> 40b3301c", + "418c6d0e c0d54b16 408f85cc 40c99a79 c0596b66 bddf5c52 -> 40c99a79", + "c121a3a4 408d15a5 c100798c 410a5d1f 40bbf3df 3f53d76e -> 40bbf3df", + "413300e4 c104d034 410e1241 c0bebda2 4167c456 4036240d -> 4167c456", + "c0c4e2cf c075d29a 3fcde9a7 c0838153 4188204e 3fd90df5 -> c0838153", + "c12f098d 410f1144 c0c23f78 c16dd4bf 403a41cf 40a1d575 -> 403a41cf", + "4138a8d6 40a901dd c048cad0 c126e34b c102738d 403aec5c -> c126e34b", + "c0cfd862 c0ffd097 c0e323cb c19a62b3 c125e89b 3ff5d6ad -> c125e89b", + "c0fcec91 c0d64188 409ceb15 c0d2bab2 c08f2baa 408490a5 -> c0d2bab2", + "c102ac93 40a1972c 4093fdee c17deceb c04a6768 401d173c -> c04a6768", + "4084c6cb 4116e136 bf815fcc be7f3cd7 c171a77f ba0fad06 -> be7f3cd7", + "c121df3f c0f4beb4 407f83ae 4154cce5 c18a03cf 40771bf1 -> 4154cce5", + "418163ec 3fd33349 409992e7 c182334e c05d35dd bf6c69e6 -> c182334e", + "405eb558 3e71cfbf 40cfb63f 3d8f7d21 41951133 3f094487 -> 3d8f7d21", + "c18f1207 c0a40603 402deb65 c153ef8e c188e6a4 40f592b1 -> c153ef8e", + "c107b522 c08f9e26 c0f474e9 419388c7 416567e8 4045087c -> 416567e8", + "405f9b02 c0e2c200 41199fde c180f41f c10fb86e 400ec1c5 -> c11b8626", + "4141d1c4 4103ef87 c11aeb29 c0125b2c 40fdbd35 40e934e6 -> c0125b2c", + "41118616 c0ec2f32 c0cc180a bfd1efcf c00ebcfe 409fa483 -> c00ebcfe", + "41083cb0 409b2bd1 c106197f 401c03d5 419687f5 3f8b6311 -> 401c03d5", + "c00f57be c0993cc4 c0980968 c04b5825 becf0900 40f91f6f -> becf0900", + "c11642ed 40714c88 c108bc54 403063a0 4027d6e5 40fb396f -> 4027d6e5", + "40e1052b 40ee4094 be3b26d1 4182c358 c195c70a bf54ba3a -> 4182c358", + "c19c5bc8 c022a299 bfa3ddd1 c0d6777f c12dd9d2 403347a3 -> c0d6777f", + "c0b900e5 3e9fcba6 409d4b36 c1109651 c16370e5 3fad81c3 -> c1109651", + "c195577c 3fdc43cd bd98773e c0c35e29 405f14e0 bf60f5d0 -> c0c35e29", + "bf4a30b2 c0ba8059 411dd7ea c0890a63 41457763 409c85d3 -> bf624224", + "414ca908 c0574d8b 3f7bbc2d c0e2a574 40e6baa4 3f903ec8 -> 40e6baa4", + "c08185c5 40c0bc39 3fbb182b 4187dda6 c0ff209e 4037d194 -> c0ff209e", + "c0e2e7ec c004d13a c11f5f8f 409ed24d 40557eee 3ff29591 -> 40835843", + "40f8da26 4084513a 4058a47f c13008da c19ff906 40568090 -> c13008da", + "c096603f 40c35948 40b4291e 4170dcca 4181d621 403b4ec1 -> 4181d621", + "41384dfe 40da29b9 c0c70512 c15031c7 3ecc607b 3f51c427 -> c15031c7", + "40e7c664 40b90050 c114814d 40879f30 c11ff696 40e8570a -> 40879f30", + "409ca5a7 c0dd8d12 3fc2a88e 412ed1a3 c199f238 3f079afb -> c199f238", + "c1728405 4115a502 40af0ae0 c178c55d 41587383 3f23a2d7 -> 41587383", + "c13aa05a 41057aae c036c7d1 c1536e3d 40dc8edd 3d86f4df -> 40dc8edd", + "c085e283 c0c182c2 411bb36b c07b6bcd c19c7796 4019519f -> c07b6bcd", + "3d01258c c0ee6864 4100aed5 c15568eb bfc52043 40f36d24 -> c0e44cd4", + "bf8844bd c10c6273 40bcd0f2 c0e96101 c0923aed 40042e24 -> c0bf2ebf", + "3f94a7ed c0c80c36 40b0aebf 4151e42c c188efb7 bf50ee3f -> 4151e42c", + "3ec55ace 411e9131 3ea05458 c1820e1e 414431d5 40b7ed83 -> 414431d5", + "3f4eaee7 bfd7cead c0c7e6c5 411f7acf bffae60e bf6552bd -> 411f7acf", + "c0c2afd6 bf9b3413 4002623c c18ed93b 40f3c66f 40818b13 -> c18ed93b", + "4112c941 40e55e3b 40e4151c c087e9a8 41966798 40ef0185 -> c087e9a8", + "410aa355 40829780 c05db898 c1827475 c12e4cb7 40a5afd3 -> c1827475", + "3ee84b9e c10a2e8e c0243a66 4003edc6 4126a5fa 408dbd75 -> 4126a5fa", + "c101e852 c0c29c31 c09a3e85 c1669f80 c17a6af0 40c0133a -> c1669f80", + "bf91f0c2 c11df6ab 40da4aa0 419fd755 c1972643 3f65fe21 -> 419fd755", + "c18f4814 3fd32314 c07ef6d0 41690db8 4137ba3c 408302f4 -> 4137ba3c", + "41150c6e c0ba186b 40b4dd4c 3fc5d478 4181168c 40cc8497 -> 4181168c", + "418380d7 be00ff64 c1134f56 c18b05e5 c177108a 3fb7c355 -> c18b05e5", + "41097dfe 409ed0b4 c0f29c7d bfc90907 4152ce9c 409c9793 -> bfc90907", + "c0d57156 c00bc5f6 bfe50ad6 bfab7de3 c162fdbf 3fa32924 -> bfab7de3", + "40bbfa7d c059ace7 40e05aba c10cf7ba bf93c8af beaed9a4 -> c10cf7ba", + "4167fec4 c100b846 c0e63e00 c192f26f bfeb063a 3f426d2b -> bfeb063a", + "3ff3bfc0 3f7158b4 40f8e2e5 c1946ba8 c15d6270 3f948516 -> c1946ba8", + "c198b3db 3fefc89f 3f94333b c01bb391 c10c9bba 4003fccb -> c10c9bba", + "c1180170 c107fe5b 41170be2 c124038c 41114cca 40000759 -> c124038c", + "410453b8 3fbbd6d2 c0ebf65d 412676d3 412044fa 40a11ab3 -> 412676d3", + "c19b9d05 c102f4b9 3fb2ed52 41237e4d 3f5ae523 3e8c515a -> 41237e4d", + "c13c7595 c092d839 40782f9d c1513e53 406870fc 407aab90 -> c1513e53", + "3f606eb9 40fadc2a c11bb19e c0485f8d c0744818 40b738a0 -> c057b5ed", + "4140b2b3 410b034f 40cf45a0 3d9474b3 bf63fc92 3fa1bf80 -> 3d9474b3", + "c0bd134a c0f68218 41094740 c18abfe1 40fdd38d 40bbcb42 -> c18abfe1", + "40f96ca9 c0fffa8e bffc7e3e 411441d9 c15b1e8a 40d5fc02 -> c15b1e8a", + "417988d0 4002c398 401dea54 c08eb74e c15c9a12 40a6350c -> c15c9a12", + "418aed86 402c479f 403f62dc c08494da bf11b18c 40c4f067 -> bf11b18c", + "bfb016de 40a0e541 3fb157e2 bfdf5b26 c0e1edb9 3fd27f38 -> c0e1edb9", + "c0b6c99d c01d24c0 c043bb8a c1725d6d 418d380a 3f803743 -> 418d380a", + "4124398d c1021589 3f987ed5 c16309e7 c11a8e31 40b25416 -> c11a8e31", + "c145157f c0f7bd95 40c8009e c0de0d1b c0996618 3d4be1c3 -> c0de0d1b", + "3feed484 40dd1c61 c0b9f852 c156ceae c06fc6a8 bf01b8ee -> c156ceae", + "bfbb431e 4046aac0 40e59814 c174bb1c c0f68545 3eb04a45 -> c174bb1c", + "c174d6a1 3f8e141e c0b7a15d 4190a9f0 bf3ae1c2 40d50996 -> bf3ae1c2", + "c09d7dbb c09683f0 c023893b 41460dab c199397b 3ec4bdc3 -> 41460dab", + "c19cbe87 400a6e3b c08b3923 c049c2e0 40bd0741 40fc0c76 -> 40bd0741", + "417e9b70 c0a62af0 40bea5b6 40ed9749 3fc8116e 40f7a02f -> 3fc8116e", + "3f9d6df3 c10cf12d 404119d0 40c27817 4163e0ce be84a2ab -> 40c27817", + "407a9a71 c118a325 3ff08054 c113ab67 419072f0 be19b243 -> c113ab67", + "c04b651e c0d2ba9f 3fbc5359 3f0f48b5 bfc77e9c bcc4416b -> 3f0f48b5", + "c06a4177 40133598 4099ebbf c12b6dec c076cad8 40d161d7 -> c12b6dec", + "be9cd153 c10f8356 c0a09066 c0b4d826 4195e48b 4052209e -> 4195e48b", + "c07b1413 4033b11c c028c9e4 c13b7eb7 c160c039 40380675 -> c160c039", + "419809aa bf422d70 c0964486 419cd8fc bf687ddf bf525b75 -> 419cd8fc", + "c14bdd9e c0a752d8 c0af9afa 4142d9f4 41995090 3f2959c7 -> 41995090", + "c148a8ce 410a3041 4113cdb6 c0c94553 c0226d99 40df05e6 -> c0c94553", + "becf62d5 c0b029c0 c0de56b6 c150df06 4118445a 3e178b7d -> c150df06", + "3ecc89d6 bc753b35 3b3f8e28 c184a195 c0baa69c 40449057 -> c0baa69c", + "bf253da2 40de3710 c0e2314f 41457641 c1703305 40e5c7f0 -> c0395a50", + "413db998 40dc0c97 c07abe38 4108ac8d c1875e04 40b9e987 -> 4108ac8d", + "bdb8dfaf c0929d38 c103fe33 3f310238 c0b63e99 4082711e -> 3f310238", + "418a3a72 c0c9105f 411356a7 c15da88d bff6592f 40fca93f -> bff6592f", + "c0b4e0c1 410ca197 4116dbc9 c10c057a 3f1cc76c bebc1282 -> c10c057a", + "bf1a1f41 411d8760 41109e92 c1172fbe 41023bc6 3db540a2 -> 41023bc6", + "c0cca1dd c11569f9 40a5062a c10b5958 c184ba2b 40220c7b -> c10b5958", + "c0c5ae83 41137b0d c105257e 410f502e c0846417 40fff656 -> c02022c4", + "3fa280c4 c100105b 3f8b14f7 c09bae88 c15a2f66 40d4bd36 -> c15a2f66", + "406d8f57 3f9dd850 40a7f76f 418ece42 c150d6d2 4014d313 -> c10ba700", + "3e12d3ae c107bff5 bf499b10 405f0e0a 4061c496 40d426cb -> 4061c496", + "c0e78fdf c0ac01cd c0b07519 411fa9ee 418b6486 40e5b577 -> 418b6486", + "415bbe7d 40912c58 40e41042 4080e08b 4105a9c3 40c78d88 -> 4105a9c3", + "412e7bb1 3faa9f66 c02d4609 c190e3ea c0acfd97 40aa6bc5 -> c190e3ea", + "4149b1a7 40d19d93 c095b2d6 c0a24946 c0fdc92d 40c95a47 -> c0a24946", + "c153e79e 40d71b1d 40e2742f c10a09a9 c1698538 be23b5f6 -> c10a09a9", + "c04e1b4f c08f6fa8 40ea1dc3 3fd44c4c c1711fd5 405bde72 -> 3fd44c4c", + "41889eb6 c1074040 410f310f bfe55ea4 c19b11fa 4048b327 -> c19b11fa", + "408dd6dd c108af59 404ff5ef c0658afd 418e312f 4016a590 -> 418e312f", + "c19bb009 bfbf4e14 bd4dee87 c1345d7e c177c7c5 409024ba -> c1345d7e", + "40beba44 c11e57f0 c0bbbc24 410fac9b c0b13d95 3fa0c161 -> c0b13d95", + "c147e6c5 3f893fdd c0dd3186 c165308a 415655e1 bf54cf60 -> c165308a", + "c0ebb876 3fe8c3ab 40735c22 4128a30e 3e854092 3df71407 -> 4128a30e", + "c1481c43 bf1089f8 40e1f961 40ddb9d5 40e98010 40f8ae54 -> 40ddb9d5", + "418287e2 bf2c536a c05a2157 40b82e82 c12a2529 40baf449 -> 40b82e82", + "41857ed5 c0d6b596 c0822809 c1123a58 c16af48f 404ac84c -> c16af48f", + "4171db6d c0e6a329 bfbe622c c1073cb3 c0a16640 3fd458df -> c0a16640", + "41413768 c082b519 409161c5 c177accd c1393db3 40996acc -> c1393db3", + "c0510c68 c077870f 40a5ec1e 40cd5725 c102f5f5 40dd0584 -> 40cd5725", + "40edd7c2 c097f2c6 40e8a7a2 c18dcecc 40c48922 3d38f271 -> 40c48922", + "40c44aea c0f56d6b 411f03d0 418c2379 c119ffb1 40808ce2 -> c0302458", + "c147a592 410a68a9 bfe85ac5 bfbe81f5 3fbc0525 4061d1c8 -> 3fbc0525", + "c0d1f0a1 c090bdcd c10a1707 c13b9fac 419ef9e0 40913100 -> 400cee6c", + "40a4cd6c 401d0ee0 40e8e6eb 40a11b82 c0b98102 40cd4b52 -> bfdc033c", + "3fb9ba03 c1152ac5 c033130f c180af24 418a90f9 40430e57 -> 418a90f9", + "c117eca6 c104f2f6 c0bbc54e 407412fa 4191dc33 40adc78e -> 407412fa", + "4152c225 41134872 c0e11e2e 41951b58 416a066c 40a0c1cb -> 41951b58", + "3ed28e89 409d867e c0b620f9 c13cc262 414e0477 40b76432 -> c04bf5b8", + "409c8778 c016da42 409703b9 c19bf775 3f4d25ee 40a1408f -> 3f4d25ee", + "4124adf6 c0c1a338 3f2a9e2a c139f9e9 4183fe68 3f13f995 -> 4183fe68", + "c15a7fb8 c0e25130 40ea4860 416f2c87 3e08c3bc 40baeca7 -> 416f2c87", + "c108f0c7 c0ee4d50 c0e6f1c1 4098d259 4199c613 40e4b644 -> 4098d259", + "41835ee1 40342306 beeb9567 4138f815 bf9a49d4 40e5079a -> 4138f815", + "40425ceb 407f9bbd c10352a1 c1376a9e c16ccb4c 40f10362 -> c1376a9e", + "c16395c6 c0eab266 c0f05b72 40efd500 c16fdfa3 be8f3119 -> 40efd500", + "c187d1ce c0829803 4084b738 4189752f c14aaee4 3f151596 -> 4189752f", + "4170c260 c0e1bb3f 409acdce 3ebe9511 c12f8a06 bf1c8741 -> 3ebe9511", + "c0b47afe 40b1c28e c11531c7 c14b9ca7 c0e568ce 400f0765 -> c0f817e9", + "41882556 3fc0c6f2 40323591 411efc2a 3fba41f9 40fe22da -> 3fba41f9", + "417f9bb4 40850083 c0fda557 40077940 c01deac6 4016c54c -> 40077940", + "c160cc51 c0b6e6fe 3fbb965f c18c369c 412edd24 40f6552e -> c18c369c", + "c1795be5 c115b536 4104adb5 41098aaa 41543667 3e8d0d67 -> 41098aaa", + "413ab627 c061b89c 41109b5d c174f027 befd48fe 40879abc -> befd48fe", + "c01c3c56 402623cf c0eb6fa7 404b5161 c1052e0e bf020590 -> 404b5161", + "418b641f c05b4fd6 40078d0e 41547f36 c10cdbb6 40b19dc7 -> c10cdbb6", + "c10d939a c086dde3 c1108859 c080afd0 c191c3e5 40ccb362 -> c191c3e5", + "bfbc7a09 3fc2b942 c0f382f8 be651c25 c0d2a241 4092e1f8 -> bfcdf47b", + "4188d326 4020e023 41124c03 c177ad1f 408b9e8e 40ecd557 -> 408b9e8e", + "417e9a56 4061da63 c0cf51aa c05a8ff8 c14e09d9 400f0004 -> c05a8ff8", + "4183ec34 3de1fa51 c0dd8820 4101b574 412b36dd 40bd26a3 -> 4101b574", + "c11dabcc c112516e bf2e39b7 bf06ae0b c135e649 400cd5fe -> bf06ae0b", + "403e3c86 40129dce bf21a5fa 3f031f24 400cf821 3f584ff3 -> 3f031f24", + "418d5e22 c0f15e9f c02627d5 4107b0d2 c0df2a52 40a0b441 -> c0df2a52", + "4116fe1f c10e1e0f 41045088 c18f6af7 417786dc 40ecfbbc -> 417786dc", + "c155d38f bf4d5300 4100adf7 c0b3f69c c1441fc3 3f8553d6 -> c0b3f69c", + "bffc479e 3f871dcb 40b12857 41641c29 c193e08d 40b1a63a -> 41641c29", + "4066ec9a 407a02e6 c02ec880 40e553f2 3fb3b5aa 40dd1bfd -> 40e553f2", + "3fa7583a 4010d4a3 3e0d3fa9 c105c19f c08092fb 40e1a402 -> c0d0668a", + "c0c28747 bc4e5be6 41076855 416683eb 40f87284 40bc104a -> 416683eb", + "4195937f 400f446d 40fd699b 400b0e13 40829681 4008fa1e -> 40829681", + "c0b343a8 c0a0c405 3fe3d9c3 c018aa2d 408227e7 40f2b944 -> c018aa2d", + "c1061825 3ff69208 411f78bb c05f9996 c05b5cdc 409c24d6 -> c05f9996", + "c05e671f 3fe058a5 bf986fa0 c1547672 c151549e 40883ca4 -> c151549e", + "c172d0e3 40442c14 c01b60ae c1501d28 c0c4e001 402df146 -> c0c4e001", + "c15d37c9 c09f005d 40efe936 416f10f6 4176bc58 40b27a26 -> 416f10f6", + "4126c918 c02abce9 c07f53ff c15d9024 c10f95eb 3fcc1d7e -> c15d9024", + "c19133dd c04f47e2 3e8e8b88 402302ac 41263b14 3f03c06b -> 402302ac", + "c16234f9 c069ce58 40a53e91 4182cfda 41135ed9 4089bf2e -> 4182cfda", + "c1642a2b 41041d3f 404e68d3 408aa334 c159f634 3fd81570 -> c159f634", + "41721881 c0ba978b c0492729 bfd8c801 c19ee47f 40865a73 -> c19ee47f", + "413e485b 411058cf c0f11c3f c15988bb c0c7fc9d 40acf6b1 -> c15988bb", + "40063e6c 411388fd 4091939f 419d64d4 c149ddef 3f8f49b3 -> c149ddef", + "c19b4cd8 3fc2da9f 4090f686 c19cb2fe c05cb9ab 400d01ad -> c19cb2fe", + "409925e7 c0dd103e c0db5ec9 bf2cc647 4185ecb6 40cc4479 -> 4185ecb6", + "c118e1b8 4106544f c0caa82c c074657d c0d3a637 be627aa5 -> c074657d", + "c1106533 bfb3635c c0ada9de 4076bc9d 41808ea1 400d5c79 -> 41808ea1", + "419c2f14 40154521 3fdccf13 c0f655f1 417e1e92 3e1fd48a -> c0f655f1", + "41484441 c11ec31b 4115a217 41722ca8 40e8c02f 40b02eab -> 40e8c02f", + "40f5c651 c0f2e8c6 c0d7d3fc c08badf9 bfcb7ab9 bf10198b -> c08badf9", + "c14c2ca9 c07019a6 3ffa2503 c15c807d 40e695bf 40f3bd81 -> c15c807d", + "4117b56e c1060753 c10147b7 4132ae62 40ddbec8 408eaf04 -> 40ddbec8", + "41968b5d 40031857 40c45a98 c16f4f01 4104cf21 40939746 -> 4104cf21", + "3f9375e3 c09ca62f 3f5dd228 c10dc42b 417bc77f 3fadaa3b -> 417bc77f", + "40c9576b 40d867c4 40f6c5f0 c11a8e60 c16acab8 4079af34 -> c11a8e60", + "c0d6a5cc c113ce9e 3e56ab6e 3f8875cf c15b07ef 3fdaa3b8 -> 3f8875cf", + "c146da74 c0b30914 3fa93d39 4165b382 bda392d2 3e744a92 -> 4165b382", + "c1329d4d 401a994d c102ed4a c1950e7e bf83062e 40c2b8ab -> bf83062e", + "c0935191 c116bb04 c0e9e8e2 41890769 418da36c bf401c55 -> 41890769", + "c1893080 410caaf1 40a629f0 c16020c2 be94a057 40771757 -> be94a057", + "c18e6976 40c9ca94 41111109 41825260 4198c80b 4090ca7c -> 41825260", + "40e6cb3a 40b3f7f5 c0ecda3b 4106637b c173e4d3 3d904b59 -> 4106637b", + "bf92d4c9 bfb9fab5 c0015a0b c10c01bf c1850068 4070c4c0 -> c10c01bf", + "3f3e5874 c0a684f4 c063aa07 c10f87e0 c16e2e98 40f1a4dc -> c16e2e98", + "406f19b8 40c7f4be 4060cf79 41941fd0 411d748d be4fd511 -> 41941fd0", + "4106a813 bfacd7dc 40f7a65b c13ee16d bf1e6b6a 3fae901a -> bf1e6b6a", + "c0fca232 bdeb06f0 c0eee505 41898b89 c0e77df2 40b08a21 -> c0e77df2", + "bf3d8589 c103d69b 40532518 40b4fc79 c0d6ae05 40caeb5f -> c0093192", + "c18181c6 405a9ee9 c09430b9 c1830724 be97e831 3ff59ace -> be97e831", + "3f95b4aa 4050a192 408925fc c18ab6a8 3fba9a8c bed905e3 -> c18ab6a8", + "c13231d3 c08bc2ed c09b77bb 418f0465 c0ce76cf 40d9f83e -> c0ce76cf", + "c117ccad c027a8e9 40803bfc 40dfaeec 40c0f9a9 3f138e16 -> 40dfaeec", + "40ab20d0 40aa3d14 410f3678 c18130ed 4099b7b7 bf4ef5b5 -> c18130ed", + "418ff556 c0ab6d34 40d8e1c3 c121f310 c194b991 404a2c2c -> c194b991", + "3dd169ee 40f8fb33 40f44e1c c12b09d3 c00fc293 40ca7609 -> c00fc293", + "40c61e62 4004b855 40d15ac3 c19b94da 404c73eb 40c87659 -> 400f47c8", + "3b92ba01 c11b457b 3f8e7938 409b0b80 c189621a 3f7ad99b -> c189621a", + "40b600b4 be92ebc9 bf56b784 c10ac269 c1050b0f beb2945d -> c10ac269", + "40570770 c0fb51ca 40866ebf 3fb940d0 411e0c9c 406dcc05 -> 411e0c9c", + "c1996e95 beef6729 4046e224 4169d7c9 418f72be 40dcd199 -> 4169d7c9", + "c014efa2 bece6273 c0ea2a9d 4128be3e c14a5cbf befdd6f8 -> 4128be3e", + "41680b56 40b7cfd6 c05e93a4 c185cd1f 410ecacc 4070d97c -> c185cd1f", + "c19fe243 c08a0d42 c1001a4e 40c18737 4155f60d 4029a904 -> 4155f60d", + "c1576b0b c01bcf92 4116f0af c19bd2b0 bfa45f8e 40603b73 -> c19bd2b0", + "40a81c35 40f2c8f6 401e459a c0bbc38b 415b2a87 beb99504 -> c0bbc38b", + "c10cbd1d c1082080 c099cdbf 41678f70 41752589 3fb0a871 -> 41678f70", + "3fd8ad08 c06db2a3 40d9cd33 40962bcb c0905701 bf47017e -> 40962bcb", + "416cc807 c0d21bb2 4053bf49 40d7506c 41728096 3f9316d1 -> 41728096", + "c194e1c1 3fd29cb3 c07b362a c14a96a6 c14a1192 3f827030 -> c14a1192", + "416fe2b6 4010c808 40d617f2 3f5997ec 40e7a874 3fbe346a -> 40e7a874", + "416c61a7 c075530a 40e5ffa9 c1814401 3fcae297 40bab655 -> 3fcae297", + "c15e7b20 4113a197 c08c5ce7 4143ad23 40f84f53 bf63ff19 -> 4143ad23", + "c1987aca c1027bed c0f7c811 405d991d 411253eb 4034678a -> 405d991d", + "c0675925 bf6d5cd2 bfd5c2ab c0d3b6b9 4182e192 be7cb81d -> c0d3b6b9", + "bfc38f74 40e2a121 40d5e9d9 41899e21 c103b341 3ff61142 -> c103b341", + "c03cdc29 bfdb372d 407401d7 404cfbf3 4127957a 40c93668 -> 404cfbf3", + "c10a37a9 409859b1 40b88f35 4024d853 41075e93 3fbaa518 -> 4024d853", + "419b0bbc c10bc05b 3f0f0e40 c0890e0a 411b7d21 40f8f1fa -> 411b7d21", + "4105e3cf c039583c 410a59ca 409374d6 418bd85b 40e6cb38 -> 418bd85b", + "c1351a30 c0da3442 bfcf0278 c12b957c 4170e99e 40fccfae -> c12b957c", + "c146d35f c0edbe37 407776cc c18d1c7e 413190b2 409d32ab -> c18d1c7e", + "4120c02e 411198de c0590f4d 41280b28 4150007d bd607952 -> 41280b28", + "c0e4da13 c0a01907 410b6d5e c135d871 c123dc7a 40a2d028 -> c135d871", + "4092ca27 c0afd95f c0ca7a86 c1758a4d 40f67000 3fccc776 -> c1758a4d", + "c132799d bebf8a07 3f820a2a c15cd141 c12e0b4b 3fde2528 -> c15cd141", + "419f048b 40d04702 40eb1c40 c0228361 40df2fd3 40ca13ce -> 40df2fd3", + "c1573981 bfb22d25 40b550d1 40910797 c08b1d24 bf6d5a28 -> 40910797", + "c1920918 c0308541 40e785dc c145448c 3fb0328b 4058fbf2 -> c145448c", + "40a07d97 be6e6e85 410b9533 4135de63 418c2980 40747b68 -> 41696a68", + "c19f26ee c0ab6dff 40b8f55f c1815230 c18282d4 3f79ea03 -> c1815230", + "4122bdb9 408ac61d c0dd3add c028714f c18982a2 40dd1e34 -> c028714f", + "c19b6001 bfbe2f42 c07990c8 c117b352 41633f28 40c19752 -> 41633f28", + "c133fbef c0b0584b 410d7ecf 40ee3909 406efb5f 4040b08c -> 40ee3909", + "c15581fd 40805051 bfdce09e 419bb89f 40e87304 40a8d529 -> 40e87304", + "c0dab912 c05f311d c10e7fb5 c114bf48 40d7462e bf7e4520 -> c114bf48", + "40984ac6 40178985 3dc1d918 c15a2d2a 40cc8808 400cdbbd -> c15a2d2a", + "c13e7ada 403552b7 3ff9e6e6 41788e80 40d7f58f 40f9043e -> 40d7f58f", + "41379bc2 c11e076f c0cb0a17 40da5f4b c0f245cc 40bb2dd7 -> c0f245cc", + "bf1c9e34 40838cb4 bfcbadc8 41465f60 409a4a17 3fc0a029 -> 409a4a17", + "4188d9dd be8905dd 404103c8 c1677e11 c1644899 40b69274 -> c1644899", + "41824d9e c0331044 c1097af4 40f0edde 411264d2 40b22dd9 -> 40f0edde", + "4131db28 40734811 c093d8fa c101885c c11d686d 40e82330 -> c101885c", + "4041e05d 40b7ddd5 4072656b c1110810 c0a14b89 3fd468b6 -> c0a14b89", + "c10f678c 3edc6470 411acd93 3fd78a2d 4170e78b 40e1f6ff -> 3fd78a2d", + "4194bde6 c108e813 bfbaefb2 c095c6e0 40bfc466 3f371876 -> 40bfc466", + "c0d30511 4044a023 404a46b2 c19727b5 c19e3275 4097eddf -> c19727b5", + "408da4c0 409f823d 41124e12 40a4328f 3f5a11d8 4029b226 -> 40a4328f", + "3f06048a 400fd075 c10e40b1 c039354a c02183b2 40db1b13 -> c035bf6c", + "c07d17e5 410f269a c0c3ec6d 3fa610aa c127c430 40e7ab85 -> c1218659", + "c162a29f 40724505 40a1c845 4184b103 c0c9be19 40dcf9b0 -> 4184b103", + "c13b0b3e 4086a9a0 3fa4d886 40a834a4 4011ec82 40e3b383 -> 4011ec82", + "bfd71bba 40b8de6d 3ff32ab8 41177ed1 40eaae1a 40bb59df -> 40eaae1a", + "bf4dcc33 40f49ebb bf9a8abd 40b15fad c12a0ee6 40f009a4 -> c12a0ee6", + "c14b8f9f 4084df0a c0290f4e 4191d1e3 c0bd2e50 beb985a3 -> 4191d1e3", + "419da0f3 c0b15a5e c111064b 3f3ebb6d 403b6457 408653ee -> 3f3ebb6d", + "41982aa0 c114f71b c0fb44d3 c10eb2dd c10f7a4b 405c3f85 -> c10f7a4b", + "3eb02bd4 c09c1be2 3fa55a36 c15d9dfd bf24f7c2 40f11b2c -> bfca6b50", + "bffd1c70 c0e4bc48 40b58b41 c19b06d1 41829123 405fb7f9 -> c112a6d4", + "41956254 40b8a24d c0054855 bfb1bdf4 3f937cad 406455d7 -> bfb1bdf4", + "41914bbf c11c9a5f 3f8da243 41783e0f c0ff61b6 40d81e11 -> c0ff61b6", + "c10d1964 3fbef62c bf92edff c0e2721f 410a764f 40a24bb9 -> 410a764f", + "c0a60861 40cc9f69 c0751723 419811b2 bf3f9eda 40e59b62 -> bf3f9eda", + "c14d5e0d 410669ba 40a9c457 c0d661fb 41110564 40a3214e -> 41110564", + "c1916485 40d9ffa1 3e681e3a c0d3eef7 c08e0452 409d8755 -> c08e0452", + "416ac99f 4021ec54 c0d58c48 c0bbf81e 407f0bab 3f667122 -> c0bbf81e", + "c14c9467 4100ea72 3e8a85de 40d1f18d bfe6c227 403ad53e -> bfe6c227", + "c18bdd57 c11aa34d c05fe62d c15e5cb3 41222eef 40dfbabd -> c15e5cb3", + "419d9ab8 c0abd939 c07a0511 415fb146 4155bf5d bf56cdf1 -> 415fb146", + "c1926190 c10e1236 bf02f577 4028c190 c1956396 40c6a0ef -> 4028c190", + "412c2b5e 40ddbea7 c11a76ee 3fbb5e3f c1095eb7 3f9fba8b -> 3fbb5e3f", + "3f659414 411ce4c3 c0c95851 3e4d0080 40184c5c 40815a25 -> 3fa3a721", + "41971c6e c0c6152d c052fd38 41782563 c188e8df 40e154b3 -> c188e8df", + "c163e7e7 403816db c0c30826 c157fe7d 40582ca7 40eab6ff -> 40582ca7", + "c120527f c0acd279 3fa2b63a c0285324 403f2026 bf61a22c -> c0285324", + "41963b38 4016aa41 c1111004 c147fd59 4025eb7f 4065f80a -> c147fd59", + "c176c606 4054b1b2 4114f617 411f365c c19db1f4 4009392b -> 411f365c", + "c156a478 40bfa4f8 bf09841f c10f0c40 c107bfe3 3f127137 -> c107bfe3", + "4135400d c094148a c079f296 c065766b 41172102 40ce79a3 -> 41172102", + "40752e4e c0b26485 40e2bb50 c148f092 3da1b964 40e50930 -> bffb77c0", + "c120a221 4110e9f5 409fae84 c18f2a91 c111ebef 40cf2197 -> c111ebef", + "bfda8b76 410730b2 410909ff c0db1066 c0f28804 408cbd43 -> c0db1066", + "4151e7fe 3f1d1763 40d99fd7 40e4e64a 40231500 40ba3c0e -> 40231500", + "3fa66577 40c32559 c05237ae c15b0741 c197ae5a 40b6c6ef -> c183a957", + "c0d99b55 3efd880f c0971616 c0d46479 c01867af 40d1891d -> c01867af", + "c14d02af 40da655d c10c9bc6 4184047f c00c86a9 3daed4ff -> c00c86a9", + "41362e48 404de125 402cf9ba c041ce7a bfa18dc4 3fed9642 -> c041ce7a", + "411b42ab c10c50cd 4077fb68 c0aaa8df c0a10cbf 408717cb -> c0a10cbf", + "bfc50d65 3f9d6190 40e23a5c 4196aab7 40a311ab 406d7e74 -> 4196aab7", + "40f5b489 c11db527 408e1143 3fa2c1eb 41978029 409fbde9 -> 41978029", + "c125169a 40507cbf 4018f29c 41205ebe c1397832 407c2607 -> c1397832", + "c18c6280 40c417e1 3ff36163 c181ea81 41402af1 3f8a7df8 -> 41402af1", + "4121c453 c0a6c0f5 c0c148cd 40ebb130 418034bf 3ed4b2bd -> 40ebb130", + "c0523916 40396667 40e1ad4c c162ab7a c15a1c7f 40f05602 -> c162ab7a", + "c17847f0 4116f523 c0bc76c7 c19fcb75 41104d2a 40714652 -> 41104d2a", + "c149420c c0839631 c098db17 419a3446 c18c56de 405a2f81 -> c18c56de", + "c140259b 40350f58 40c13f79 40c660a8 41819777 40b7ffa7 -> 40c660a8", + "408d7f5b c11c9b9a 40dd3855 bfe6e419 419cf289 405afc84 -> 4187d3f3", + "c12b5192 407f3ef2 40c8ac1a bce8581d 40fb0453 40507c05 -> bce8581d", + "418730f6 408feca8 4087dbb6 c16b6754 41311f5d 3fc97301 -> c16b6754", + "40c34230 40de1ec7 41175329 c1403adb 414218cb 3f78de54 -> c1403adb", + "3ff00eb8 40c562a1 40a99fd9 4195fd3d c191613d 40ad05da -> c191613d", + "c0b4fbbf 410a0a70 3f229781 bd1bb92b c194050b 403b07a7 -> c194050b", + "c120da4f c11ff5b0 40232e71 40f8bef2 c16fabff 40e9d2e9 -> 40f8bef2", + "3f989de6 40937beb c0afbdc5 40e40fba bf21d07e 40f37aae -> 40a2cc20", + "c15a127b 40f75b5e c105f470 3fefe3e0 c155d77f 3f27f5f5 -> c155d77f", + "40a37f22 3fe92ae4 c11b61df c19f4971 bfabcab9 4098d263 -> c19f4971", + "c1096461 bf442b13 3e1f5609 4143b9f2 411b565d 40ec3e58 -> 4143b9f2", + "412771e0 411c2440 c06b839e c13a15a7 40efde6a 4079ba0d -> c13a15a7", + "40304de4 40b9f365 c02a8727 c18d93c8 c11d25ab 40c485be -> c1721e60", + "4183290c 400a6f2f bfc4ad70 3d31d50c bf9d003f 402009e1 -> 3d31d50c", + "c1284557 40d2770f 40fb69b3 3fa2ce79 c01debfd 3f0d8b8c -> 3fa2ce79", + "3eaa7d2d 40e61adf 40e7f97c c1601d42 c0ce23de 40e3ea3e -> c1601d42", + "418a839a c044ffa1 bf449992 c0daa1c5 c004ed4f 40099b38 -> c004ed4f", + "3fe87152 c0448086 40d79e5e 4160f5a6 414b4e7c 40a0d74a -> 41540924", + "40922e3f c109e6b1 40f0f372 c0d51de2 c1806dd3 3fbe87bb -> c1806dd3", + "401b0063 40fb6df4 40b28037 bf2ea72d c134c945 407c3d05 -> c134c945", + "40fbdba1 40095669 c0a5e84e 419b9fe0 41382ad3 3f97f7b4 -> 419b9fe0", + "410e9d51 4077af7b 409b930f 41654100 c1939cdb 40e35cbf -> c1939cdb", + "3fc59ee1 bfd55018 c09c3663 3fea7af6 c0b30618 4031986a -> 3fea7af6", + "4144432f c01487c7 41039c7c 419dc704 c1350638 bf3d405b -> 419dc704", + "c1184ae8 408dc1be c0b5644b c122ef23 40c5d0e6 3fb2abaa -> 40c5d0e6", + "40a54919 bf203554 40a3d0ed bfd5fc62 408fa017 bf60a8b7 -> bfd5fc62", + "c0c15cbb c11c14e4 c1024de4 c18ed9b1 c172bd02 40259ce4 -> c172bd02", + "bf7e6772 c106a8ba c02f8e0a 41794425 3fcc8735 40ccc6e0 -> 3fcc8735", + "c0e57958 40e9bfd7 c0fafd38 40fc3643 3e0f8862 40dc993e -> 3e0f8862", + "41097495 c075aabc 400c53d2 c117c4c4 c1837ce1 4023dd8b -> c1837ce1", + "c190e94f 4115e907 3fd2da9b c0a1034b 4125db80 409bcfae -> 4125db80", + "c0a8b70c c0ead518 bff89230 bf883720 c0bcff64 3f4d1f8f -> bf883720", + "4199d960 4002eb5f c08c92f0 414863af c16cdf02 400f632d -> 414863af", + "c1037c98 c11c57e1 40eb3cdc 3fddf2e0 c1722cdd 4025c574 -> 3fddf2e0", + "41783520 bf148e1a c0d23ec9 419a2e53 418ea4ab 3fa0e1a6 -> 419a2e53", + "4157e7b1 c0ba7e96 bf21d39d c160e5f7 c1827151 403ec4ba -> c1827151", + "3fcd8642 c11b8c8d bf6736ba c01385e8 40483007 3ec427de -> 40483007", + "c15dc37a bfdf5762 4028563a 4168a359 c100edc6 3e61dcc5 -> 4168a359", + "3f1483e0 40bca88a 410951ec c0bff088 c198e06e 40d20510 -> c0bff088", + "3f693c0e c0d0be5f c0307417 c16cbbaa 40fe0251 40de66f1 -> 40fe0251", + "c13b2227 c0ad42b5 c07c0b30 411a732f c11e287c 40b88795 -> 411a732f", + "41712237 40451ab0 41029b23 c1795b94 4103f5fb bf6b7d0b -> c1795b94", + "c0058d1c 3f79e6b3 40349226 410da62e c10f0607 3f0a237c -> 410da62e", + "c0e7fe80 c106d467 c04fcc2d 3f58443a 4192f3da bf29daec -> 3f58443a", + "3f8af49e 40e6e1f0 40082da9 c0992a2a c16e3fa2 401de9ed -> c16e3fa2", + "3f7c75c5 bfad0e16 40c7aba6 c02197ea 3f3b3e52 bf6da8df -> c02197ea", + "c0a07e8f 410cea91 c10c6e77 c16e7215 c195d3b6 40aa73d2 -> c18e346e", + "413be42f 40e886e3 3fb7047a bee5b544 bee87c50 3e8f4fa2 -> bee5b544", + "bf6f3a09 40ac617d 411d9af7 411d9c24 41618476 bedd2638 -> 411d9c24", + "c0e97cd6 411fc720 40e4918f 417a439a 416af6a7 40656332 -> 416af6a7", + "4196e38d 40ff7fe6 40413f5a 40a3e367 c17bff92 404b5382 -> 40a3e367", + "bf7f204c 411d3d78 c0893fa9 4094a899 c0a117d6 4083bd49 -> c01a1f3e", + "c1833ac4 c01350a5 4101e260 40e17e1e bf91b7d2 40d9482e -> 40e17e1e", + "4108045e c0238141 40d12735 3f90e69b bf86bcd7 408177f4 -> bf86bcd7", + "c0ddb1a7 3f19c1e7 bfee6bc0 412e3433 411a57f5 bd9a7e67 -> 412e3433", + "4112d756 c0758acb 40758a01 c194465f bf40e145 403d05c6 -> bf40e145", + "c11f72df 406dc571 404a8bc9 3f917443 4129e0a1 404abd02 -> 4129e0a1", + "4067fcde c00e178b c001d02a c1931d94 418aba34 3fce164d -> 418aba34", + "c1923e39 3ec98776 3cd248cc c06e6ec9 419a9ad4 3fea4c62 -> 419a9ad4", + "4163f62c 40083db9 c114e143 413a99a4 415a378e 409a3ae2 -> 413a99a4", + "c19a6312 c097c340 c08d4cf5 c0fae59f bfedf68d 40d5ddfb -> c0fae59f", + "c0c21d1e 410f6d96 beddb68c 418f144b 40423b60 40ce096a -> 40423b60", + "c116c285 c0558de6 408fa594 c14e6451 c100e8d9 be875948 -> c14e6451", + "c197361f c0671bfe 40923fc3 418dc534 c1999263 40a00000 -> 418dc534", + "40f7ec9d 3f15b9a7 40c9cc7f 41542a44 c1778458 40800000 -> c1778458", + "c1444d51 4101df70 3f02f80b 4159b1cd bf15680c 40400000 -> bf15680c", + "c164e608 40e951bb 40fff24f 3e2b2817 c094907c 40000000 -> 3e2b2817", + "c1896c6a 3fea10a5 c09e2721 c007c8bc 411858f2 3f800000 -> 411858f2", + "40a499b3 40a4eebb befec310 c1886c49 419b6a69 00000000 -> c1886c49", + "4195d971 407bd90b c0d7761f 41966962 40f9acbd bf800000 -> 41966962", + "bfc0aff0 c0a9129d bfbca3b5 c0415e12 4176248a c0000000 -> c0415e12", + "c14ca8d4 400e35b0 c11b4f21 40f182b9 40f248bd 3fe50d1e -> 40f248bd", + "41503c2b 40cfb849 40178094 c1802228 40c9561e 40b53e09 -> c1802228", + "413da5ef c0d6b30a c0e343af 3f0a4acd c0e602b8 405b203f -> 3f0a4acd", + "417dcb27 404a6b6a c0f8f462 c00891f8 41661bb4 4052cc43 -> c00891f8", + "40a051c7 4034fb15 c08cd6b3 c12aac95 c10eb1f9 3fbb3b05 -> c12aac95", + "3f939f69 bf0fe33c c0982b83 4170187b 4140f8d0 bf607d63 -> 4170187b", + "c11ce603 4059f2f1 c06eef2d 41791b58 40e31149 40e95a5c -> 40e31149", + "40d17fe0 40a0655e c0b00e03 c1826b6a 4190c345 40a6594a -> c1826b6a", + "c15b53ab 40cf010c 40cf010c bfdf923c 4175e157 be97561f -> 00000000", + "c1189df3 c0f01e7a c0f01e7a 40e5a5c8 c15c6fc2 3fa22941 -> 00000000", + "3e22acfd 3dd0788f 3dd0788f 419ad962 3f28cbee bf309db8 -> 3f28cbee", + "4151fedc 4040ebb9 4040ebb9 3eb67a48 c1429440 bf3527ab -> 00000000", + "c11b4baf 40c51219 40c51219 c10932a3 bf8526e3 3fdae9c6 -> bf8526e3", + "40c98792 c09fd6c7 c09fd6c7 41173788 c190ca21 4066740e -> 00000000", + "41596fca c034834f c034834f c0228d0d 40c9f444 406766bd -> 00000000", + "41902c2b c11f470c c11f470c 3fbc9f1b c04694c3 40f56d81 -> 00000000" + ] + }, + { + "function": "cycles_map_range_smoothstep", + "node": "ShaderNodeMapRange SMOOTHSTEP", + "cases": [ + "00000000 00000000 00000000 c0ee234b c153002b 40c9bb68 -> 00000000", + "00000000 00000000 3f800000 bf9b62ec c0aecf4b 405bf568 -> bf9b62ec", + "00000000 00000000 bf800000 404ce478 3ef3fec7 408d00da -> 404ce478", + "00000000 00000000 3f000000 c18114ed 3fd29165 408efedd -> c18114ed", + "00000000 00000000 bf000000 c18b515d c19f785b 4047f103 -> c18b515d", + "00000000 3f800000 00000000 41821f1e 3f626bfb 40685f11 -> 3f626c00", + "00000000 3f800000 3f800000 41870db5 c0ce812e 40ff4dfd -> 00000000", + "00000000 3f800000 bf800000 41571fe1 411570fc 400cd371 -> 4136486e", + "00000000 3f800000 3f000000 3eef5461 40bb5d89 40b1421b -> 40bb5d89", + "00000000 3f800000 bf000000 40459aef 418fe4ba 40913dff -> 4161fbb6", + "00000000 bf800000 00000000 c0ea3202 c0cb08fe 4041e6bd -> c0cb08fe", + "00000000 bf800000 3f800000 c12f2de1 40ad8fd6 40d40a69 -> c030cbec", + "00000000 bf800000 bf800000 41241e0c 3ffa19a9 3f9a8952 -> 00000000", + "00000000 bf800000 3f000000 41769e16 40620d1e 40ad8b88 -> 40d39932", + "00000000 bf800000 bf000000 3fa916a4 40df8422 40ecdee1 -> 40df8422", + "00000000 3f000000 00000000 410cd732 4102bde5 3ffb9e6c -> 4102bde5", + "00000000 3f000000 3f800000 401e6dfd 40d3bf94 406da4d5 -> 401e6dfd", + "00000000 3f000000 bf800000 3f11e893 4199da1b 40ea9124 -> 40ad0f6a", + "00000000 3f000000 3f000000 411cb8d0 c0803a9c be7f2dd4 -> 00000000", + "00000000 3f000000 bf000000 c02f4f72 c0bcfe88 40bbdbe5 -> c08a5320", + "00000000 bf000000 00000000 c19a3edf 40d4838f 400b96f4 -> 40d48390", + "00000000 bf000000 3f800000 be81f1e5 4100200b 3c14d6de -> 3ff1ad5f", + "00000000 bf000000 bf800000 415c14cf 3f09aa98 bf677a02 -> 415c14cf", + "00000000 bf000000 3f000000 c18b2c3e 413e593f 404c572a -> c02ffe78", + "00000000 bf000000 bf000000 c18cdfbd 414d58bc bea711d6 -> 00000000", + "3f800000 00000000 00000000 c17108e4 40ef862f 40d6cb0d -> 00000000", + "3f800000 00000000 3f800000 c14ab45d 418d5837 40b19a88 -> 418d5838", + "3f800000 00000000 bf800000 3fb87099 c1095087 400b9c27 -> 3fb87099", + "3f800000 00000000 3f000000 414f2236 c0a7f600 40b41ae9 -> c0a7f600", + "3f800000 00000000 bf000000 41972c61 bf4ea154 40aa67ec -> 41972c61", + "3f800000 3f800000 00000000 412f6835 40e777eb 3fdc2805 -> 412f6835", + "3f800000 3f800000 3f800000 bfa9bd2a c18263c5 3e682b1b -> 00000000", + "3f800000 3f800000 bf800000 c1615d59 4045fa8c 3ff265c7 -> c1615d59", + "3f800000 3f800000 3f000000 41427d5d c0e611f4 40d52658 -> 41427d5d", + "3f800000 3f800000 bf000000 c15fb0c3 4116ac78 402ad2ff -> c15fb0c3", + "3f800000 bf800000 00000000 c11f1524 c167a28c 40b834a1 -> c167a28c", + "3f800000 bf800000 3f800000 3f76f984 c039f2d0 400deaf3 -> c039f2d0", + "3f800000 bf800000 bf800000 c14b9afb bea58e3c 40c9417c -> 00000000", + "3f800000 bf800000 3f000000 40d1f06b c1535e20 3f942f3c -> c1535e20", + "3f800000 bf800000 bf000000 c1037ce4 c1882de4 3f96575a -> c1882de4", + "3f800000 3f000000 00000000 c06c8b52 c19841fc 40a61056 -> c06c8b52", + "3f800000 3f000000 3f800000 40eefdbb 40723777 bf56a5c7 -> 40723777", + "3f800000 3f000000 bf800000 418a4954 c10794d7 408de707 -> 418a4954", + "3f800000 3f000000 3f000000 c15ad87d 40287261 409d8a56 -> 00000000", + "3f800000 3f000000 bf000000 40445f53 c0cd4b4c 40297d6c -> 40445f53", + "3f800000 bf000000 00000000 c183a547 406bcbdd bf0bb516 -> 406bcbe0", + "3f800000 bf000000 3f800000 408f04fe 41378753 3fe2708a -> 41378753", + "3f800000 bf000000 bf800000 409cc9d6 3f384e1d 40a080e0 -> 409cc9d6", + "3f800000 bf000000 3f000000 40b80f53 4189ae3f 3f70f250 -> 4189ae3f", + "3f800000 bf000000 bf000000 c0ddd32f 41848ee4 40b86eae -> 00000000", + "bf800000 00000000 00000000 40011529 407e5b68 40251372 -> 00000000", + "bf800000 00000000 3f800000 c030df56 41598429 3e6feab3 -> c030df56", + "bf800000 00000000 bf800000 c19f25fd 40d020a5 3fa6d0ae -> 40d020a4", + "bf800000 00000000 3f000000 41181d4d 40c65b57 40c9c5c6 -> 41181d4d", + "bf800000 00000000 bf000000 c0929b66 41058c76 40f464e6 -> 41058c76", + "bf800000 3f800000 00000000 3fc0e1fb c06efeda 3f8b9a3a -> c06efeda", + "bf800000 3f800000 3f800000 3eafd4df c183c6c8 407a1a50 -> 00000000", + "bf800000 3f800000 bf800000 c14d7b3e 41802dc0 406b6902 -> 41802dc0", + "bf800000 3f800000 3f000000 c0b2f591 410d25d7 3f5debc6 -> 410d25d8", + "bf800000 3f800000 bf000000 418340f1 412231a3 40828ff4 -> 412231a3", + "bf800000 bf800000 00000000 c16d7b71 418e3ecd 40dffe11 -> c16d7b71", + "bf800000 bf800000 3f800000 c18de77c c0bb85a0 402566de -> c18de77c", + "bf800000 bf800000 bf800000 41074f79 c16283e4 3fefeb08 -> 00000000", + "bf800000 bf800000 3f000000 3fd5fdf0 40eb72cb 3f966efb -> 3fd5fdf0", + "bf800000 bf800000 bf000000 4103e42b c0001989 40d8d644 -> 4103e42b", + "bf800000 3f000000 00000000 c14e625c 40d4c94d 408a9354 -> 40d4c94c", + "bf800000 3f000000 3f800000 419a4855 401f79b7 40199e3b -> 419a4855", + "bf800000 3f000000 bf800000 c0d5e4d1 c0293f82 3edb71ef -> c0293f82", + "bf800000 3f000000 3f000000 41780a8a c18eab55 40b97217 -> 00000000", + "bf800000 3f000000 bf000000 41704621 4102fdc4 bf113c1c -> 4102fdc4", + "bf800000 bf000000 00000000 c1173ab5 403b5e7a 40bf055e -> c1173ab5", + "bf800000 bf000000 3f800000 beaa1aac 41986421 3f98574a -> beaa1aac", + "bf800000 bf000000 bf800000 c0dbd367 c0fa7a4e 4042b7fe -> c0fa7a4e", + "bf800000 bf000000 3f000000 c12d48b0 bd4b4eb6 4001a2d2 -> c12d48b0", + "bf800000 bf000000 bf000000 bfc9828c 3fe24841 40a15120 -> 00000000", + "3f000000 00000000 00000000 c1992a93 c107642c 40aad0f3 -> 00000000", + "3f000000 00000000 3f800000 c0f5faad 40b29256 408ed63d -> bf86d0ac", + "3f000000 00000000 bf800000 415e989d c0f03161 40d3e5f9 -> 415e989d", + "3f000000 00000000 3f000000 bfa816ad 417b6d64 3fbed0a1 -> 417b6d64", + "3f000000 00000000 bf000000 c193f371 3fffd39f 4072bb35 -> c193f371", + "3f000000 3f800000 00000000 416b6704 4180fe51 40ed9a61 -> 4176b1d3", + "3f000000 3f800000 3f800000 c167a66a c065651e 3d378a73 -> 00000000", + "3f000000 3f800000 bf800000 c07f58a3 418af85b 40f503b3 -> bf26f160", + "3f000000 3f800000 3f000000 c0114b53 410653c6 bf6d4e89 -> 410653c6", + "3f000000 3f800000 bf000000 c0e25ccd 40185ec6 408d0bbe -> c093ec9c", + "3f000000 bf800000 00000000 c11846af 404b3958 3dd6d82a -> 404b3958", + "3f000000 bf800000 3f800000 419f23c3 c199ebd5 3fdce736 -> c15202ca", + "3f000000 bf800000 bf800000 c1905642 4165c743 40b901bd -> 00000000", + "3f000000 bf800000 3f000000 40db5993 4189365e 40604155 -> 4189365e", + "3f000000 bf800000 bf000000 4163f98c 3ff7ca48 40e58183 -> 3ff7ca48", + "3f000000 3f000000 00000000 c16ca5d4 3fddfabe 4090f818 -> c16ca5d4", + "3f000000 3f000000 3f800000 c0d948d2 3e9d5d5c 40d34d39 -> c0d948d2", + "3f000000 3f000000 bf800000 41112131 c1494d75 40d0ccef -> 41112131", + "3f000000 3f000000 3f000000 40eb0f95 40fe92cb 400267f7 -> 00000000", + "3f000000 3f000000 bf000000 c16694d7 c1987c8c 40e76bd3 -> c16694d7", + "3f000000 bf000000 00000000 4055464e 4097059d bf707729 -> 4097059d", + "3f000000 bf000000 3f800000 c14d6c57 c1833ea1 3f09ab9d -> c177b1c3", + "3f000000 bf000000 bf800000 418c6c92 411b9d5d 40eee7f0 -> 418c6c92", + "3f000000 bf000000 3f000000 412fb8a5 c161594e 4085f1f6 -> c161594f", + "3f000000 bf000000 bf000000 c1843e9c c0c93618 40d5c22f -> 00000000", + "bf000000 00000000 00000000 c1205885 bf1647bd 40b2b515 -> 00000000", + "bf000000 00000000 3f800000 c116b21e 4134ac4c bf7961ed -> c116b21e", + "bf000000 00000000 bf800000 40f5b68a c023e9ed 3f62765f -> 4023c194", + "bf000000 00000000 3f000000 c197c0a0 40a9113d 40b6eecc -> c197c0a0", + "bf000000 00000000 bf000000 40ac05e5 40fad094 40011f55 -> 40fad094", + "bf000000 3f800000 00000000 c14c5dd3 41924e10 3fb1d23e -> 41924e10", + "bf000000 3f800000 3f800000 c06296cb c14bf496 4076c551 -> 00000000", + "bf000000 3f800000 bf800000 c0d45028 c10b6f6f 40879d08 -> c1063c49", + "bf000000 3f800000 3f000000 bf2127e4 c10e02fe 404d63a3 -> c10e02fe", + "bf000000 3f800000 bf000000 c16e448d c161c41a beefda5f -> c161c41a", + "bf000000 bf800000 00000000 419095a7 4133031a 3d0b575c -> 416a1734", + "bf000000 bf800000 3f800000 419855ad c179ce17 40434fc9 -> 415a0860", + "bf000000 bf800000 bf800000 c1570a22 c14562de 3d0f1e50 -> 00000000", + "bf000000 bf800000 3f000000 c10c500f c1797ce4 40872303 -> c1289e0e", + "bf000000 bf800000 bf000000 c18c9ca7 41211186 bef2f46d -> 41211186", + "bf000000 3f000000 00000000 c169a0e9 4183f38c 3ea9e322 -> 4183f38c", + "bf000000 3f000000 3f800000 4167fdf4 c0396369 409b6fb5 -> 4167fdf4", + "bf000000 3f000000 bf800000 41386839 c09cb0e8 4044ac4a -> bf239750", + "bf000000 3f000000 3f000000 c1723490 40fb2760 3f1262fb -> 00000000", + "bf000000 3f000000 bf000000 c19c5e6e 4106d9c8 40f45fc8 -> 4106d9c8", + "bf000000 bf000000 00000000 c188c6bc c10096c1 403319c2 -> c188c6bc", + "bf000000 bf000000 3f800000 c0505789 3f16f15b 40da751a -> c0505789", + "bf000000 bf000000 bf800000 c03bb145 c16f2a37 408f2089 -> c03bb145", + "bf000000 bf000000 3f000000 414760cc 40818b51 40b9ebef -> 414760cc", + "bf000000 bf000000 bf000000 416b5188 415b9e63 40b51bb5 -> 00000000", + "40000000 00000000 00000000 c1811c6c c1991040 bf04293e -> 00000000", + "40000000 00000000 3f800000 c11aad31 bfefdc36 40b785f2 -> bfefdc38", + "40000000 00000000 bf800000 c16aa9bf 40e847ba 40d031f5 -> c16aa9bf", + "40000000 00000000 3f000000 c1583587 411485b1 40efa722 -> 411485b1", + "40000000 00000000 bf000000 c0972b48 3ec3e415 40da5805 -> c0972b48", + "40000000 3f800000 00000000 40d9514c 4183bcb4 40dab8e6 -> 40d9514c", + "40000000 3f800000 3f800000 4139ca5f 408c2c12 40ebdd9a -> 00000000", + "40000000 3f800000 bf800000 c0b8c763 412dc9eb 40fbc92b -> c0b8c763", + "40000000 3f800000 3f000000 c0fb0e6d 419fe1f2 3f7fca1e -> c0fb0e6d", + "40000000 3f800000 bf000000 4125fe72 c10b91d2 3f48fb1b -> 4125fe72", + "40000000 bf800000 00000000 c181635d c18217ca 4039d2ca -> c18217ca", + "40000000 bf800000 3f800000 419d3ef9 c0d18062 4071ae2c -> c0d18064", + "40000000 bf800000 bf800000 4111b2f5 412f0e99 4042fdd5 -> 00000000", + "40000000 bf800000 3f000000 3f90cd54 416f6269 40c97a36 -> 416f6268", + "40000000 bf800000 bf000000 c13ff147 41233fc3 3fc1f7bd -> 41233fc3", + "40000000 3f000000 00000000 c07dc551 c135fe01 401d3eb5 -> c07dc551", + "40000000 3f000000 3f800000 405e7b77 418045b5 40891da2 -> 418045b5", + "40000000 3f000000 bf800000 41816750 4197a7e3 40c566a1 -> 41816750", + "40000000 3f000000 3f000000 c15b64b1 c165e42c 400b4252 -> 00000000", + "40000000 3f000000 bf000000 c19e0b3e 41052c89 bdc80a10 -> c19e0b3e", + "40000000 bf000000 00000000 41110e7e 40f32fd2 40cd844a -> 40f32fd2", + "40000000 bf000000 3f800000 c1612ac7 3cd6d230 40c5c1e9 -> 3cd6d200", + "40000000 bf000000 bf800000 4189ca6b c12819d8 4006b4a0 -> 4189ca6b", + "40000000 bf000000 3f000000 c1685d5e c0982334 3fa64937 -> c0982334", + "40000000 bf000000 bf000000 bd4a2551 c10e42f7 40dd8518 -> 00000000", + "c0000000 00000000 00000000 41665cf4 4124f3f2 40c2952b -> 00000000", + "c0000000 00000000 3f800000 418f2e31 c190b9aa 40df3afc -> 418f2e31", + "c0000000 00000000 bf800000 c011286f 4103e0b2 408b8617 -> 4103e0b2", + "c0000000 00000000 3f000000 c0bf1636 c153dc35 408f3f7e -> c0bf1636", + "c0000000 00000000 bf000000 c0b0efad 4106ccc0 40e3c6d2 -> 4106ccc0", + "c0000000 3f800000 00000000 bff19767 40664df0 409a045f -> 40664df0", + "c0000000 3f800000 3f800000 41470b95 418b7434 40434365 -> 00000000", + "c0000000 3f800000 bf800000 4167b5f0 418bc354 4091ad34 -> 418bc354", + "c0000000 3f800000 3f000000 3f435c6f c190fbfc bf339684 -> c190fbfc", + "c0000000 3f800000 bf000000 c007b407 418ebde6 40f20ce4 -> 418ebde6", + "c0000000 bf800000 00000000 3ec27fbe 414acf73 3fdfe667 -> 3ec27fbe", + "c0000000 bf800000 3f800000 416853cd c182d7d7 408b03ec -> 416853cd", + "c0000000 bf800000 bf800000 411b00f3 3f4b4040 4069b780 -> 00000000", + "c0000000 bf800000 3f000000 40e084bd 4011f876 bf1a07eb -> 40e084bd", + "c0000000 bf800000 bf000000 c14f1ca2 bfeed236 bf74753c -> c14f1ca2", + "c0000000 3f000000 00000000 c12a9637 c14df3f2 3fc3979f -> c14df3f2", + "c0000000 3f000000 3f800000 41401a93 3f5e38ff 40e1144c -> 41401a93", + "c0000000 3f000000 bf800000 c00aa939 4063de67 40b2571d -> 4063de67", + "c0000000 3f000000 3f000000 c077c278 c11c099b 400bb592 -> 00000000", + "c0000000 3f000000 bf000000 4046c94f c00d45ad 40fc3608 -> c00d45ad", + "c0000000 bf000000 00000000 4094e016 c176e7ab 40e4f3f3 -> 4094e016", + "c0000000 bf000000 3f800000 414cf126 c13f861e 40cbb696 -> 414cf126", + "c0000000 bf000000 bf800000 409630b7 41392784 4074d2c1 -> 41392784", + "c0000000 bf000000 3f000000 3fdf0ea0 419e4e16 40cdf0f6 -> 3fdf0ea0", + "c0000000 bf000000 bf000000 c104d55a c1915e32 402d6324 -> 00000000", + "40400000 00000000 00000000 c099ebff 404f46de 4036f67b -> 00000000", + "40400000 00000000 3f800000 c070f1b4 c19f79e1 3f2a1f24 -> c19f79e0", + "40400000 00000000 bf800000 40cd240a c0779c87 40d7ca1e -> 40cd240a", + "40400000 00000000 3f000000 c19843bf c09c3b6e 40abe3e0 -> c09c3b6e", + "40400000 00000000 bf000000 412ac087 bf9bf3ba be576858 -> 412ac087", + "40400000 3f800000 00000000 c093f02b c1167809 40f4a5ba -> c093f02b", + "40400000 3f800000 3f800000 c10ddff7 c18331f9 3eef1c3c -> 00000000", + "40400000 3f800000 bf800000 c185cde3 418d5a07 40fa6093 -> c185cde3", + "40400000 3f800000 3f000000 c194de58 c1168ec4 403f6583 -> c194de58", + "40400000 3f800000 bf000000 41784049 c198fa99 407dc536 -> 41784049", + "40400000 bf800000 00000000 4036c4f8 414812e0 40b1090b -> 414812e0", + "40400000 bf800000 3f800000 c095a4a9 c15a5b95 3fa14780 -> c15a5b94", + "40400000 bf800000 bf800000 c12f929a bf8b6f49 405bb855 -> 00000000", + "40400000 bf800000 3f000000 4170e90c 414c27ce bf54f56f -> 414c27ce", + "40400000 bf800000 bf000000 41281ab2 4086a4dc 40a96d48 -> 4086a4dc", + "40400000 3f000000 00000000 c1888851 417bc028 40974d78 -> c1888851", + "40400000 3f000000 3f800000 4112e7b4 41973052 401fbe1f -> 41973052", + "40400000 3f000000 bf800000 c04c0e41 c0f8b259 bddb6452 -> c04c0e41", + "40400000 3f000000 3f000000 c0460dd7 c15baaf1 40bb8199 -> 00000000", + "40400000 3f000000 bf000000 40c7222b 3ffd45c1 4062270c -> 40c7222b", + "40400000 bf000000 00000000 c0b4199d c157f281 406244a9 -> c157f281", + "40400000 bf000000 3f800000 c15b3a0f c0e9253c 40d4b0f8 -> c0e9253c", + "40400000 bf000000 bf800000 417bd2e8 bfaaf505 4066f6b1 -> 417bd2e8", + "40400000 bf000000 3f000000 417633fd 415b6759 3ec39efc -> 415b6759", + "40400000 bf000000 bf000000 413a7b8f 418aad65 40b7f264 -> 00000000", + "c0300000 00000000 00000000 c10e2ddc c008cefb 4099b1c3 -> 00000000", + "c0300000 00000000 3f800000 3ffe9828 c1392717 40eb8182 -> 3ffe9828", + "c0300000 00000000 bf800000 4080eaf3 4107bd5c 40e1b672 -> 4107bd5c", + "c0300000 00000000 3f000000 c076776d c078ab2d 4096d7c4 -> c076776d", + "c0300000 00000000 bf000000 c0e00d4b c1244082 3fc010b5 -> c1244082", + "c0300000 3f800000 00000000 c185df06 c19336f0 403fc16c -> c19336f0", + "c0300000 3f800000 3f800000 412b4115 c1805dee 3f64a1a4 -> 00000000", + "c0300000 3f800000 bf800000 412643bb c1087295 3f92980f -> c1087295", + "c0300000 3f800000 3f000000 40ce327f 40b07b53 3e9a7d3e -> 40b07b53", + "c0300000 3f800000 bf000000 41092e78 405d3de7 40a928c2 -> 405d3de8", + "c0300000 bf800000 00000000 416b91ed 401dee98 3fdebc31 -> 416b91ed", + "c0300000 bf800000 3f800000 418200dd c143b541 40d59c04 -> 418200dd", + "c0300000 bf800000 bf800000 4198b7e4 4199d163 400ca022 -> 00000000", + "c0300000 bf800000 3f000000 c16b5361 40d062d2 3ff97081 -> c16b5361", + "c0300000 bf800000 bf000000 c135c8e3 c120075e 3fa07c5e -> c135c8e3", + "c0300000 3f000000 00000000 c0afe6d8 4134543d 40f091df -> 4134543c", + "c0300000 3f000000 3f800000 c0c8eff7 c144739f 40ba903c -> c0c8eff7", + "c0300000 3f000000 bf800000 c19053b3 c13f2837 3fd00652 -> c13f2837", + "c0300000 3f000000 3f000000 c11ffbe7 c13f40fc bed93667 -> 00000000", + "c0300000 3f000000 bf000000 4146d401 415688a8 402b0e81 -> 415688a8", + "c0300000 bf000000 00000000 c13cfba6 c08e4845 be04ca22 -> c13cfba6", + "c0300000 bf000000 3f800000 40609611 c11072df 40b9d9f6 -> 40609611", + "c0300000 bf000000 bf800000 c10171d9 c0e6eb81 40060d44 -> c0e6eb81", + "c0300000 bf000000 3f000000 41910954 413dccc3 40bb953a -> 41910954", + "c0300000 bf000000 bf000000 41710982 c15dbd9a 409a3836 -> 00000000", + "3dcccccd 00000000 00000000 418b19e6 40906192 4061cd83 -> 00000000", + "3dcccccd 00000000 3f800000 40743565 40c7ea7c 40c99ec6 -> 407890e7", + "3dcccccd 00000000 bf800000 c15f90ea c0eddfa4 401f6613 -> c15f90ea", + "3dcccccd 00000000 3f000000 40ee60f8 c167358b 40b47ee0 -> 40a57ef2", + "3dcccccd 00000000 bf000000 c15f9dfc 41746e02 40c1c311 -> c15f9dfc", + "3dcccccd 3f800000 00000000 4143a55d 407c1bbd 3f108b30 -> 40857b18", + "3dcccccd 3f800000 3f800000 40ec0d81 41278ddf bd913ac8 -> 00000000", + "3dcccccd 3f800000 bf800000 419b4bd4 bfb4c149 bf5f5493 -> 4128e79c", + "3dcccccd 3f800000 3f000000 c0d70e21 c11a697d 40ff2079 -> c11a697d", + "3dcccccd 3f800000 bf000000 3fff381a 41379ea3 40e0bac7 -> 41023717", + "3dcccccd bf800000 00000000 c143f45c c051619e 40d7a274 -> c05161a0", + "3dcccccd bf800000 3f800000 41299c19 416b77d9 40acc310 -> 414f763d", + "3dcccccd bf800000 bf800000 4118ba9e c11426ed 40d56a9e -> 00000000", + "3dcccccd bf800000 3f000000 418d02f6 418055f9 be907a5e -> 41828f2b", + "3dcccccd bf800000 bf000000 4199189e c0ba76a8 40965677 -> c0ba76a8", + "3dcccccd 3f000000 00000000 c106a459 3fd5d36f bf23e1e1 -> 3f1f21c0", + "3dcccccd 3f000000 3f800000 c07734f7 c186f9e2 40e1054f -> c07734f7", + "3dcccccd 3f000000 bf800000 419b6953 410d6373 3e548f84 -> 418c8d29", + "3dcccccd 3f000000 3f000000 414ce04b 40097e76 40954857 -> 00000000", + "3dcccccd 3f000000 bf000000 419e3e12 c13c0daf 405b0cfb -> 410ae32d", + "3dcccccd bf000000 00000000 4187f31c 418a1d88 402c30ca -> 418a1d88", + "3dcccccd bf000000 3f800000 c17c1aac 419eb335 4088716a -> c04e8e00", + "3dcccccd bf000000 bf800000 c0173274 c19d1781 40c73379 -> c0173274", + "3dcccccd bf000000 3f000000 c0c1f797 c10c7669 40bfec5b -> c0fa50de", + "3dcccccd bf000000 bf000000 c1836d0a 41941258 40b3541d -> 00000000", + "4016267e 410185cc 40fa7c71 40d6bd1b 40e69313 40c37b46 -> 40e69313", + "418bf4b3 40b04855 4113b945 c186d85c c0f817f5 be0ac3fe -> c0f817f4", + "4158f448 c112ceb5 c10fb637 40f23319 c0228561 3f905073 -> c0228562", + "3bb52142 4016e7a2 c1122a54 40dfd1c9 c0d5759a 40cfb7a7 -> 40b05d08", + "c0767b93 3e1d1b9b c0a7e70d c1107433 c1110d39 3f683c8f -> c110f3d8", + "c19bfe5c c0c4a89b 408643b1 c18e22f4 41114325 4089795c -> c18e22f4", + "4103cfa8 41110a65 40c8a59e c02d727c be285246 40c455f2 -> c00b1aa2", + "c1523117 409ee033 40adb27f 3dde34ac 41751273 40c02cdf -> 3dde34ac", + "4195ce8b 4056c8d7 40ee1df7 c13112c7 413b6247 400f6b86 -> 413b6247", + "416c8d94 c108ce06 410587ff 40cf9e23 416ddd8d 4091f973 -> 416ddd8e", + "c11c1792 c105a2a6 4115b891 c0e4e9d3 c111cce6 40850099 -> c0e4e9d3", + "bfc5b98b 409d8142 40123355 41958baa 407e2ddd 3f91dc7d -> 407e2ddc", + "413d2558 bfb90fff c0a3d316 c15d47a3 415ff4b3 4021e36d -> c15d47a3", + "c196b6fb c0f0beb5 c06f3a0f c14f9eda 417436f2 bea30613 -> c14f9eda", + "4163da24 405370ee 40ae5498 410094dd bfe43311 409fcb93 -> bfe43310", + "c19c0e81 40d57635 c0f3e009 c1377f45 c07c32e1 40a86c5f -> c07c32e0", + "41908bfc bf5b6225 c11b2a0b c0b49609 c112264d 4065b31b -> c0b49609", + "40ebb12d 411fda76 40ce1d2d 40e033f3 c1816dfd 40a0aec3 -> c14480a2", + "bf7405d0 c081e72c c04a290c c14b8bd8 413679e9 4026f353 -> 413679e8", + "4191499b bfaa6ef2 c0ebe29d 417f333f 3fb37b25 40fa3cf6 -> 417f333f", + "3f22c47a 40800120 403bb317 c0c2f445 419c01e6 404cd473 -> 419c01e6", + "4128606b c0912944 c07d4495 41841272 4155d4b8 40b02cbc -> 4155d4b8", + "416e68fc 40adc96b 4087c0df 417c8480 c19c589b 4097b35b -> 417c8480", + "4150616a 3fd01c68 411657a3 c089f323 419ce0db 40caec63 -> 419ce0db", + "4068efb0 40d6633d beca4ac3 c134c594 c0af19f0 40164710 -> c10fb4e1", + "bdbb2719 3f87b28f 409e1ab6 c15f99c2 419eca58 4021e74e -> c15f99c2", + "418ea3f6 c100b72d 40b3fd58 c18ea96c c11e26b8 402bcdd7 -> c11e26b8", + "4130f426 c1193fef 40b565df 414f8599 c0ad6a93 3fca1d92 -> c0ad6a92", + "c01bac61 40116795 409febb1 40ea4ab3 c09ef83e 3fe80791 -> 40ea4ab3", + "c0dc9bfb 405ed7ba 40a0e226 c12d8b6f c125bb14 4055e7bd -> c12d8b6f", + "c1407ce5 c011691e 4094529c 41232468 40db8b7a 3f2282df -> 41232468", + "c19be722 c001fa5c 40e5f55e c00a29dc 40a6cf3c 401f2efc -> c00a29dc", + "c140b1a3 40dc5413 c08824c0 407f18e7 c150f904 40c14b69 -> c150f904", + "410bf35d c0857c16 3f2907ce 40e00c3b c18858a7 406096f6 -> c18858a7", + "3f5228c8 c09515db 409ca865 c0dca1db c00ce307 bdd06087 -> c0811726", + "3d845ef2 409ca57e 3f3992a2 40a3f5ee 4148a53c 40292e5b -> 4148a53c", + "4177fd20 c01748eb c00129e1 c16a0edd 40c30dd9 3f8677ef -> 40c30dda", + "41980c5b c0352875 40544ebd 40e0f274 40c56e4b 409b543b -> 40c56e4b", + "c169e3c7 40fabe89 c1027779 40b030f1 c12a3565 bf5654de -> c12a3566", + "4181ae23 c0cc5e5f 403da4b8 c14ed13d 419f39af 3f2976c4 -> 419f39b0", + "be4a6660 40fd9174 40da34d9 40c803c4 c13358c8 3f8b69de -> c13358c8", + "c0cfd062 3d7b3aaf c00fdac5 c16a35c3 419a602d 3e59c3fb -> 419a602c", + "c03e6917 c0204e1b c09e9754 3e944cbf c153eb8f 40efbd6c -> bf81d72e", + "c140ea97 c0b99c0a 4027c823 c17dbba7 4133ad88 40f8ad47 -> c17dbba7", + "4117c120 c0fe0964 c0cc6358 418cf26a c136f1a2 40285ef8 -> c136f1a2", + "419bd5dc 411f873d c0020384 bfb7b5ef c1273497 40f70b14 -> bfb7b5ef", + "40ab6353 c0e0e599 bf1b8fdc 40a0258a 3fde3536 3fe78388 -> 3fde3536", + "c19bd4a8 bff96fe2 c1070147 416769c0 4114a7a7 40807be2 -> 4114a7a7", + "41611a43 40131101 4002dfdb 41323a61 c13b442e 3fb22043 -> 41323a61", + "4197273e c0411c27 bfcfffb1 4151e80f c1862318 3face61e -> c1862318", + "c1771bd4 c01a3ecd 3f80edfc 410ec7db c174e5f8 3fa30644 -> 410ec7db", + "c0e35309 c10914a9 c0b29362 41009faf 418928ac 4072834e -> 41474929", + "c148d126 4091cbaf 3ff9dffc c15442bc 4141e06b 3fc74473 -> 4141e06c", + "419e5353 c09c0f7d 4119066c c03441f5 c01b132a 40d84805 -> c01b132a", + "c0bd7d59 c116dff0 c0e3283a c0b8321a c119d2e0 bf784e2a -> c119d2e0", + "c07da8b6 410365d2 c0c9cb5e 418456e4 c151a6e4 40cb7ba0 -> c1309690", + "4065ff2e c112d2d2 40aea1ae c164d9d1 c196bcf6 40c578c7 -> c1951f19", + "4106fe30 c0f16a91 40d03728 406382a6 c1836890 3fdc0c1b -> c1836890", + "bf9dc410 3ec0923f 40be5f03 bfc170a5 c097bed2 beb40e34 -> bfc170a5", + "4108286a 40c64c63 409e6033 c13cc21f 40c84c10 40bfc779 -> c13cc21f", + "c08a326f 40f710e1 bfc6a979 41095043 41772b2a 4030f593 -> 41772b2a", + "c09bb89b c0ce3c59 c0b0b68a c1980978 c1840b1b bf506a69 -> c1840b1b", + "416dd3c9 c1019c89 40df93f3 402808b6 419dea9d 3f600c57 -> 419dea9d", + "c0a6a1da c09b457d c0dfa56b c06cd9a8 416a7c76 40425bc6 -> c016542d", + "c18fcf78 40bdd7e4 40cd00f4 c1156054 c19da431 408ee6e6 -> c1156054", + "418400e3 404d01bf c0de1e5f c186467a bf353156 3f393fe9 -> c186467a", + "c1584f61 c0c698bc 40e32bc9 c10c21c3 be4125aa bf266a51 -> c10c21c3", + "c18fcfee c0fb4781 3f8f6b55 406716aa c1429ad1 3fbbc206 -> 406716aa", + "c194a7d3 c08df220 400a00df 41625c0c 413eada0 4098472a -> 41625c0c", + "c095d246 3dc8cbae 410fa4d3 41335078 c04616ba 40a3529a -> 41335078", + "c15b3e55 c1142380 4027ace0 c0c8b894 c036ead5 40e3beb0 -> c0c8b894", + "40bfeadf c0ee8b40 40ea86f1 41387067 c016f17c 4021669c -> c0029cec", + "c19eacaa 4088b397 c1181b58 416bac3d c0957634 bf1bb340 -> c0957636", + "c12e3a3a c1056be6 40423c24 c08548eb c0b870e2 40957d93 -> c08548eb", + "c0aa992b c0ea0aa4 c11a2bd0 c1094b3c 4125e85f 3dcb17b2 -> c1094b3c", + "41938682 c0db9fb5 c0f33e92 c0e13d0c 41711dee 3ff3a0d9 -> c0e13d0c", + "4192266a 40860c2f c0487e4f c06bebf1 c041c408 40e846ac -> c06bebf1", + "4131ac38 c0fc3635 405e2dcb bdc4ebfb c0691208 3f724527 -> c0691208", + "c153c2f1 41092dd6 40472358 c1993c3d 419d5ac6 404cc126 -> 419d5ac7", + "c113b140 409080a9 c08e2095 416df5a5 4184a9ea 40f4f398 -> 4184a9ea", + "4094f0c1 40f26b72 40dad43d 413566d6 c187e5cd 4053049c -> c187e5cd", + "c1486b39 c025818a 41173226 416b3215 40e3a1da 40da94ca -> 416b3215", + "c18a5a1c c0d362df c06ed889 c18e7527 c04f9c9a 40c53ff3 -> c18e7527", + "c0bcfa2e 40169f19 40a92cbf 418a3ce0 c0abefb3 40bdc299 -> 418a3ce0", + "419cb09d 4067b97f c08faa20 419e6e79 c179580c 40b2a2b4 -> 419e6e79", + "4157bb09 c0a64713 4100628c c04edbe1 41218b0e 402cd97f -> 41218b0e", + "c152d1bf 406ec23f 3fa09947 bf6eff6d 40c02610 40aab124 -> 40c02610", + "c0edc8f7 40ee9278 40a99427 c0ffca9f c107b44d 4014e990 -> c107b44d", + "bfd51d42 40ac113c c0dfb73c 413cd455 c1955d0a 409372ff -> c0d2b52a", + "403c0174 c00d4f2a bfda1cf2 c09b4c7b c12258ee 40d2f559 -> c12258ee", + "419011d1 401c1005 c11c32a1 40caf6d5 41281777 40d46636 -> 40caf6d5", + "4105e140 40ef41ed 3f9cf00e c0f77960 3f2fcc26 3fbf74a3 -> c0f77960", + "41605acb 40e0c311 c0f232a2 c0a3b533 414cc74b 4001a177 -> c0a3b533", + "40c8b9bb 3f855dca 41038975 c19e149b c13888c1 4065c79a -> c1505b63", + "bfbc2b38 c113ec46 40062a13 415d9b70 c11d2c9f 409f3175 -> c088bb7c", + "c01cf781 405e6876 4072319b 40b4ac2d c076bf2a 40a2dbb0 -> 40b4ac2d", + "c016fbb9 40c99d14 40df98e4 c02bbba0 3f925e0c 3fa0e25d -> c02bbba0", + "40da1a2f c10b16e4 3d944799 416ec711 41129553 40ee545a -> 41129553", + "c18bd904 40df05e5 3f15a6a7 4170966f c14555ad 3f158f09 -> c14555ad", + "c08a86cf c111d0a5 40900d16 bd5c233c 4149eb91 40357ad6 -> 4062a86e", + "c190fdcc c0ba2236 c10ffac1 c09eade3 c00966da bdd3069e -> c00966da", + "c17e1159 c11ab553 bfa9a0ea 40a16388 4137ba83 405951c9 -> 40a16388", + "4166ae15 c10e19eb 40daa35c 40b2b51e c19889d3 40a6857c -> c19889d2", + "40715226 c1000c13 40f1e93d c19d502a 40252c56 bee64f5f -> bf3ba7a0", + "417e0eef bfd8b296 c07191d4 41652a1c c195533f bdca1615 -> 41652a1c", + "c12ccd26 409930eb 4089fca1 c143e02f 40ffdee1 bf60beb9 -> 40ffdee2", + "41890fce 410b7b68 bf9b61bf c11a34c2 41980481 40f7724d -> c11a34c2", + "c1958dfe c0e583ad c05f0b56 c0706336 c1373511 4028f98c -> c0706336", + "40d7c6eb c0b017b9 bfc87c91 c15dc902 4143ebaf 3ffc373c -> 4143ebae", + "c0a646ac 40e01c4d c0cd488e 419b293b c104c017 3eb1b8b2 -> c0f4e40c", + "c14fd587 c0aa1e1a 40fad904 4174afbb c110d741 40372340 -> 4174afbb", + "c0b7113f 410fe424 c03bb4e8 bfc8ef63 4176db5e 3fd026c9 -> 4176db5e", + "412c94fc 4095f44f c0305fe6 c0d2f626 c031dad9 408ff1c5 -> c0d2f626", + "c11bc4bc c1004979 c0fc55f5 c0367081 40926da5 3fc9659e -> c0367081", + "4115bd7c bf8e6c6f c099f8a4 418517c3 c1635524 3e569a89 -> 418517c3", + "3e6d6381 401a0901 c0279d0b 4066d93a 410e1562 3eb59fdc -> 40b6e154", + "c118f477 c08e7e3a c097c15e c137c369 411cf322 bf23f570 -> 411cf323", + "c01cf702 3e76fb38 40c93316 c0c94172 c10b5d55 40b5d26c -> c0c94172", + "413fccd8 c0ed312e c0e23134 c179ba2e 40b8aa10 405e796b -> 40b8aa10", + "418d4e73 c041ff27 406bfa0a 41474e78 c1817dcf 4051ecea -> c1817dcf", + "c04b3118 c08f7551 3fe8265f 40c008ee 414f83f6 bedb12e7 -> 40d8e948", + "41446005 4041336a c02015b5 c10bbcca c1067bb2 404530b8 -> c10bbcca", + "c17b6722 40b08015 3d9c863d 41951309 3f577a9e 40bc9806 -> 3f577aa0", + "c0635507 bf98e63b 40d7d667 c05e59b6 40efa9a7 3f9971a1 -> c05e59b6", + "bf821726 3f9ea134 3f52225d c164d9a1 bfec082a 40dfa5e9 -> bfec0828", + "c122746e 4101fd78 410864e4 bf09c35d c003e61a bf1102d1 -> bf09c35d", + "c17d8b6a bfef1094 c0eb181f c0d3a9c2 412aac30 3dd64bd2 -> 412aac2f", + "4172b499 bf80bbe2 409c59cb 410e1d70 bfec874a 40bd14e0 -> bfec8748", + "c19ef8e3 c055d44c 408ad141 c0c094f6 c0cc214d 40d36c06 -> c0c094f6", + "4050f9f5 bf307ed7 400ba978 40bb7c1b c0a36a1e 40b8d9c3 -> c0a36a1d", + "418d1838 bf91f74e bffa79c2 c00678eb 406dca8e 40abe4df -> c00678eb", + "409dbbb9 bf99f4be 411bfa0d c08a6cce 4180d979 408ba1af -> 40f6fa4a", + "c0d40c9a c0a87645 c0b338ba c182c7b8 bf3e0f05 4083593e -> bf3e0f00", + "405b73b9 403b5c3b c03607f9 40d1f983 419c9af7 3d4e002c -> 40d1f983", + "c1867fb0 40dd6046 c0e35036 41821c6f c0d4e913 40da8f68 -> c0d4e914", + "4154f2f9 407d2597 c0cf1b92 4136ab6e 4193aed9 4094c332 -> 4136ab6e", + "c080e678 bfd44090 c038ddc3 419d46f9 4107dd62 3fd5fc5c -> 4107dd62", + "40bac510 40f8e070 c1011d70 c1592838 4123cb47 3e9cfb83 -> c1496a13", + "bde24a58 c09f7cae 407e0787 412f4509 40d4d95f 3fd8b018 -> 41084806", + "c031dba1 bed8c7c7 411a969d c105590c 41016187 40d91a17 -> c105590c", + "413e6bc0 40783832 c0275f4a 40ca268f 419dba95 40c79d9c -> 40ca268f", + "c16e2c39 41098139 c0677f5c 40bca61c 411461aa 3ef4048a -> 411461aa", + "c0af5958 c09d06ed 404fcb0e 403d40e3 c194337d 403697be -> 403d40e3", + "c1978f8e 40b3cc8e 40fd52df 4141c8e2 408de925 3f7cd9b2 -> 4141c8e2", + "c138ef55 3f0dc9de c0e268b7 4185228d c01d80bb 3f3a6639 -> c01d80b8", + "408321e5 bfec9199 c108a7e4 417e2f67 4183ff35 3e55d283 -> 417e2f67", + "c1377af2 c0793362 c023cc12 c169d8fa c15a7654 40c00beb -> c169d8fa", + "41905835 c0d09883 c0cbc272 409cde1a 40f6904a 3fc800da -> 40f6904a", + "4041d652 3f36c058 3fc2ef96 bf80a4e7 40038b0e 4018d75f -> 40038b0e", + "c17bc338 410f0412 bfd48cf3 419c30b2 40089f8a 4042b3a8 -> 40089f88", + "bf430c1f 402634b9 3fb5e881 40cc928d c18f0216 40a37b0b -> c18f0216", + "3e95f202 3faa296c c10d436a c112241c 41740741 3fee1231 -> c106c884", + "415e24aa 407f9b30 c0f06f34 c0c64c43 41710781 40a855d2 -> c0c64c43", + "40c2a633 c03f4ad0 c101c65e 40d406fd 4165c1f3 4052cc5b -> 40d406fd", + "4083b48d c0b56cb1 3d01ac48 4182cbc8 c18a9010 40dcf005 -> c18a9010", + "40eb3a8a 3fa1ca1b c02cdbb4 c0fc438c c013aaa8 40514367 -> c0fc438c", + "c0222ff2 3f88a696 4040436d c19458fb 4100e068 404087f5 -> c19458fb", + "3fef8b6e c0ee9a0a 40cdf3de c19bb397 40aa055a 3fc69b7a -> bf741000", + "40fac944 400e29a7 3f873842 c191e193 40cb193d 40af4268 -> c191e193", + "c0554072 3ffcdc3d 401070ee 418d6acd 40c8b760 40c05a18 -> 418d6acd", + "c0ebc8dc 40d6e459 c0cca0ce 40ef7ee6 402083ad 40ed8539 -> 402083ac", + "412a303b 4108c716 4114ad49 3e423140 c1201e3b bebf1fb2 -> c1201e3b", + "41038ba0 c016e195 408b0276 c046e432 4029af6b bf32c6aa -> 4029af6a", + "c0cd6c66 c109ffc9 c0ab0e81 412f10d1 41539278 40dd47ce -> 414a6414", + "403a2c94 3fa6ad8d c0360773 41168220 c190be90 3fc9eb47 -> 41168220", + "c1358d9b 4111766e 40b83079 416bcb5d 4073ca8c 40b32402 -> 4073ca8c", + "c1650bd3 40b7cd1c 405a72cc 403e886f c037639f 40e09e3c -> c037639f", + "4123503d 40dbcbdb c0cae6a1 406bcc2c c18aa1b1 40145135 -> 406bcc2c", + "41139822 bc10e8a6 40cda113 c1090a12 c0bb918d 40bdd830 -> c0bb918d", + "c1158fd8 3f90461d c1079529 40d408fd c105008a 4057115b -> c105008a", + "c174d1b2 411776e1 c0a3c623 412141d5 c107dc40 402cbf13 -> c107dc3f", + "bf836ccf 4110943b 411acf8e c12c5815 c0fd59ce 40eb3541 -> c12c5815", + "c16cf359 409235ca c0682755 4188c4b7 4189dd1a 3c40a089 -> 4189dd1a", + "c1928257 bfecdff1 c10b4261 418da28d c1987f3a 40f74b1f -> c1987f3b", + "c14af786 407aaeab 410c784a c19c06d3 3fdf5e6f 40fb1631 -> c19c06d3", + "41358ec5 40812a1a c05b8058 418b1339 c19c1544 bf3ae59e -> 418b1339", + "c11d1233 41111453 c048c2a9 c199ab77 418fa608 40daf712 -> 418fa609", + "c0a371dc c0e0d764 4068d7d5 c11270c0 c13cffcc 40ea498d -> c11613cd", + "400a95fc be55ce2e c09bcf13 c16502de 40f501c5 407f6386 -> c16502de", + "c11228dd 40f39aa9 c081a002 c19cdef2 4134c6c5 bea2f757 -> 4134c6c4", + "c0a612c2 c06f3dcd c0edfc6d c11e4dee 40e30b65 3e5ca491 -> c083223e", + "c1647760 c10c085f 40612912 412894b6 3d81edb0 4042345d -> 412894b6", + "bfa391f6 c0d94e9b c0de2136 41616655 4180c1a1 3f5aa9a7 -> 41616655", + "40e7f6db c0a50020 bf70bbe8 c11601fc 407af36e 40c48afc -> 407af370", + "c162f02f c11dc38c 4082c70b 4199cecf c1363068 40ad300f -> 4199cecf", + "41945781 40c5d948 c11308be c141e06d 41070c6e 40df1ea8 -> c141e06d", + "c19c2995 40ed390d bff0eb31 c0dc5bb6 c14f4745 bf0e46ee -> c14f4745", + "c09777e4 c005d4a0 c0b06070 c09a675e c0e3ff28 40ac95f2 -> c0da4c83", + "4176332a c0e25a7d 3fd5f907 418f7236 40dde6bf 3fb6ef07 -> 40dde6c0", + "41017fc4 3f340202 408a01eb c15ad448 c1326ee4 40d3f27d -> c1326ee4", + "411734b8 c10964a7 bfd0ea3e c13e5845 4115cce1 bf11d0b5 -> 4115cce1", + "c11be337 40265fda c11131d1 4004febe 418315d5 40140f5e -> 418315d5", + "c09a1b0f bda5cb89 c07ce1bf 411bd325 c193a0bf 4082d75b -> c193a0c0", + "c0a9e9ee 411323af 40cba867 bf9b938f 409b3b2b 3ed9813a -> 409b3b2b", + "c16d174f 41143f4b c11af7b9 c095cb52 c195b394 4036706a -> c195b394", + "419e49ca c080f2c9 c1179faa c1928474 c0e305bd bf5fc9d4 -> c1928474", + "bdc77959 c0ed0b97 c0d567ca 41666e5c 40dc3308 3f0af881 -> 40dc3308", + "417777c2 be4fec99 c0ca30c0 418dff98 416db69d 3fe7ffc2 -> 418dff98", + "c13f2987 c0b3cb99 406b8953 c19d5b3b c02bc746 40e139ab -> c19d5b3b", + "c0bc78f5 c0429891 41132f6d 416e09a9 41924713 40841d58 -> 416e09a9", + "3f0e4d89 c0d67472 c1108b30 c0a52b5e c0c89fcd 4073498e -> c0a52b5e", + "c160bb2d c0d2cfa7 40f74b12 411828c5 3ea15355 40f48c52 -> 411828c5", + "c000569b 4113b8af c0a0b222 412ea6b2 c0faf626 4044c75e -> c0b5b220", + "41000c95 3eaab6ab 4091b08d c0056b16 c10c95e7 3fdf0976 -> c10c95e7", + "c13d1b41 410e78a1 bf2f576d 41693932 c0dd64bc 40a32176 -> c0dd64bc", + "c19caaa2 c0301bc4 40c7fda2 c12972d6 410675bc 3fffc07c -> c12972d6", + "405d5767 c001909d 40946f5e c122e0cd 417c2729 40bc746b -> 4159b4c3", + "c191b96e c0bef661 c01b41fc 4156c64a 40e6766f 409e65e7 -> 4156c64a", + "408bbbc6 bf59b9dd c10db859 c121b997 c1775238 40d1c916 -> c121b997", + "416beac6 40e996b8 407db450 c1661e92 c0a8a438 40f6ccc9 -> c1661e92", + "41727c61 c06bf65d c1013357 4146b466 40fb2fc7 40d93f1d -> 4146b466", + "3fa94c89 405456fb c0e61e7a be411b78 413d486e 40938040 -> 3f72502a", + "4167c3a8 c05631f7 409e3ee6 c18aa4fc c0f8d117 40b2e753 -> c0f8d118", + "4065e5a3 3fbe7092 c07beb90 4139e419 416ecb91 407495b5 -> 4139e419", + "c15e7908 400230fd c0fdced2 c0c9abc5 3f964a8f 40bdcdb0 -> 3f964a90", + "41396791 40899719 c04df780 4110bbe3 c0a6ab3f 40c3dda4 -> 4110bbe3", + "4184a022 40c68d2d 40d3afba c15b316f c180f6c2 40f39137 -> c180f6c2", + "414331ac 41031973 409c15e2 41860b64 418f6929 4093550e -> 41860b64", + "c17dd1f5 c1044aea c0239e93 bff0a46d 40a95543 401909b0 -> bff0a46d", + "40b87c2b c109b93a 410944e5 40baf29f 417f8114 40c33bc7 -> 4173e50a", + "c055e3b1 40b76e26 c0ab0a16 411e3629 4187fee2 bf549925 -> 41831694", + "bffb2dc8 c0936f7a 406ef577 c10b676a c01cb40d 40dc020d -> c0e71eba", + "4106e192 c11769f9 c0fb8288 40d86486 c0b36a62 4001611a -> c0b36a62", + "c0711b28 c101a4f2 bfc0e33c c0d68375 c062246a 402de338 -> c08ca54d", + "c13cb7c7 c0c0cfdd 40a5cbe9 c14e97e4 417e910d 3f3836e1 -> c14e97e4", + "c003134f 4084c472 c110839a c138a60c 41932f1b 40276991 -> 4005bc14", + "c18e98e9 c10a6999 c0f228d3 c153b746 c04b4094 40bcda96 -> c153b746", + "c188883c 40a039aa 40865661 4166d5e1 413fbd6b 40a49b4f -> 413fbd6b", + "416b8c07 c0aca7bc 410357ff 40f34316 417967ec 3ff2c3e7 -> 417967ec", + "4174d80f 40f46763 411e58a9 411c029f 40ef9e0a 3fd36c94 -> 40ef9e0a", + "c18e432d 411ba02e c107a72a c11a132a c0d8a86b 40d2110a -> c0d8a86b", + "4171ad28 c098381b bfed1d36 c0b46693 412ac1c1 405c1d18 -> 412ac1c0", + "4037cf66 c0879341 3f933ad2 c11cf7ac bf04d448 40d22912 -> bf04d440", + "4157bfcf c11d9e39 40f8957f c09353e6 c034361f 403e01bf -> c034361f", + "c175cdd4 40891fc3 c0e4d04a 411860ec 411cfcc6 40e16634 -> 411cfcc6", + "c12bf9a9 bde95a5c c11ad9c1 bfb8de29 c1474af9 40cd8a31 -> c1474af9", + "3f42beda 3fd1ec09 c05697e2 4110ee0b 40db632a 40fc1e59 -> 410e0955", + "c17c76af 409a09d4 40be2859 41375b51 c06a7130 40238db8 -> 41375b51", + "bf9a061e 3ca5b87f 4092e419 c0bcea82 41170426 40e594a4 -> c0bcea82", + "4118c815 c07097ae c11bc6a4 40d6aa1e 419e09e1 be8ba1d3 -> 40d6aa1e", + "3d0dd975 3fd621ab 4096496f 418b3ff6 417d6849 401c68cb -> 418b3ff6", + "bf1d2e77 4086c1b7 3f84ce8a c0f0ed57 c0a6c491 4004c3bd -> c0a6c491", + "c19d666f 409919db c1034a58 c08e45a4 4194cc9e 3fb8fef5 -> 4194cc9e", + "413e96c6 40874b8b c11fa28d 4172f5ec 40d3e9cd 40f81dcf -> 4172f5ec", + "bf7c6f8d bf140376 c0c9a91f c196fd6e 41725ead 40be5e97 -> c1930a45", + "c1999602 411c6d36 c0ccbdcf bff78f61 c197d4e9 40cfba66 -> c197d4e9", + "c0989154 3fd5099c 4110384c 4156774a c1477a3e 40f1e1c0 -> 4156774a", + "c190aa6f c0ac5756 40ba37d0 c129b4b9 4152d722 40bd60b9 -> c129b4b9", + "bddcf312 c01f97a6 3f6482bb 4109c9ed c1254f61 4000047a -> c0cb2218", + "412f5940 40ac9ee5 3fb87499 c0858c07 4108a6dd 409a3d21 -> c0858c07", + "c15b1652 40582158 3fbc2f50 4118c0ee c0dbdb35 40b65e41 -> c0dbdb34", + "40faafe8 bff9ac70 bfec1c01 c1120189 c195981c 40a13659 -> c195981c", + "40c76322 c0234f09 4109651a 4189538e c19105f5 40e74c72 -> c160ed76", + "c0363052 3ec6adb4 c11b3fd8 be3540b8 40bbf708 40e22bac -> 3fa51365", + "c0637ee5 40b70f49 c09fc600 3ebcdf4a 40417a58 bec92c48 -> 40391d7c", + "419b8fd7 bed5bb87 40094438 c1185aa1 410e2527 3f9ef9b2 -> 410e2527", + "c0ac27a1 c087df25 c05dad51 c0c83d79 c120d435 bed36e93 -> c0c83d79", + "3fa153ec 4109bbc5 c0502980 c13d1f15 4121d602 40ac9d52 -> 40404cec", + "c198e923 40cd9857 40c0fad4 3ec53eb4 415c6ecb 3fc53ff6 -> 415c6ecb", + "410ac6b3 c0881284 c0166019 c10de5e7 c0c8c7c1 4006b4a9 -> c0c8c7c1", + "419c1be2 bfc5c351 3f7eae4f 406527cd 40bcad17 405f1a57 -> 40bcad17", + "c126bb33 404d2f44 c0acd966 c104b171 4147a1b8 40b50aa2 -> 4147a1b7", + "c00af130 c10bfc46 4107344d c15ebab6 4184eb5f 3f36aa27 -> c07bfbb8", + "c09f12ae 407342b7 c0be99e0 c186c4d0 40bf95a5 4051da39 -> 40aabd30", + "4109faa2 be4d1cf1 c0b0fc8d 40df6fb6 c0a418a3 4088db36 -> 40df6fb6", + "4110523f 407aa573 c026da2f c1581c29 3f15f90b 401c6f55 -> c1581c29", + "c09c82f1 4062052d c081018c c179d195 bfcb773b 4044984e -> bfcb7738", + "4090bed6 beeaf165 41197c94 c0d64e50 c0a89eec 3fea6b92 -> c0bfc2ee", + "c091d7db c012c5f5 3ffdd939 c00f88fd 404e3788 3e0a7c72 -> c00f88fd", + "41918337 be8d67a1 c09a176a c0a342f2 c164fc9e 40b7bf43 -> c0a342f2", + "c0e6c6b2 c11ec279 3fbb879f c14029d7 3f0fe38d 40baf6a2 -> c1236516", + "c184475d 40654ff8 40ab3f66 4139dd7d c033a5af bf7b66c0 -> 4139dd7d", + "4181f067 c0ddf118 40e977cc c153d0ad c0dad886 bf55f8ae -> c0dad886", + "c002a089 408493e5 c10e6ec6 c1826ff1 4111e74a 3fc29f0d -> c0929a80", + "418b204e 41140bb9 c08421b2 40746a0f 4190470f 40273f72 -> 40746a0f", + "414c94b1 3f57ac4a c1174ae4 c0cfd9fd c090848b 3ff88492 -> c0cfd9fd", + "4180f39f 40882f38 c0e122c2 bfaa2353 c19ab7f6 408fed2d -> bfaa2353", + "c184ca9f 40fdb1d2 c08e64cb c1492c6a 40fb2b39 409e7b5f -> 40fb2b38", + "c122b849 40fe9dd4 411cb44d 41411bd8 417d7f04 bf4946a7 -> 41411bd8", + "c06f2806 c052091c c07c2bd1 4140b5a5 4135eb50 3ea76874 -> 41385f24", + "c1133788 4107b3df c105059e c1664a25 c06dcbb1 40a08c9e -> c06dcbb0", + "c10418d9 411cfc8b 410664f1 c184015d c1877140 40a4cc0a -> c1877140", + "41861a47 c0cd60d0 40a38e04 c148f019 c19e3107 40ada352 -> c19e3107", + "c1212e08 c1148e7c 4017872c 4120795b 40ad5ca9 3f6f76ce -> 4120795b", + "c0237160 c0b826b2 c0819958 c02b209a c12db6f9 40f11d84 -> c12db6f8", + "415d35e7 403b32c8 c1190a96 c0498afa 410e33f0 3fd1b96a -> c0498afa", + "c191cc23 c11b490e c1177ecb 402f9085 419c6667 4043b15d -> 402f9085", + "4161e197 c0c45fd8 41096668 c11801f3 4084a537 40e022fd -> 4084a536", + "41384ba1 c0868e09 3f9fbe48 bfdb7375 40ab208e 3fe2b4d4 -> 40ab208e", + "c0d4df3c 410d44f6 c0a84a0e c0ad50ed bfc2519e bf178fa4 -> bfc2519e", + "4111da92 c04ef8bc bfc8216b 4127112a 4105785f bf631592 -> 4105785f", + "41903835 c11bcc38 c10bfe53 417b89f7 c03e4ffd 409aa832 -> c03e4ffc", + "c10fcbfb c0f01d68 bffdb2fd bdac7774 c1461bf4 40fdf71f -> bdac7774", + "bfb17727 410fdfe9 c092dabd c192f708 c195b3f7 40155790 -> c1955169", + "c12e444e c063b2c4 3f02dd54 4194fee2 40028e08 40997220 -> 4194fee2", + "c115de05 c0e0e2aa c046e12e c15a2cbe 41306bf0 3f3c998d -> c15a2cbe", + "c0289e05 4014e496 40860e48 4192b7ca 40ea4f9e 40bc61ee -> 4192b7ca", + "3e3569d3 4071ba89 c0b65cdc c10c9284 40dbeaf6 409e62c7 -> c06e4a9c", + "c12ed4ac 3f31b50b c0a69bfc c12ae8e7 c199c145 3fa08026 -> c199c145", + "3f125f18 c0e55dc8 c1076c52 3ff2a064 408a0880 be93b921 -> 3ff2a064", + "c126c796 c09d014d c0a1887a 416f4c4b 412c47db 40e6713c -> 412c47db", + "40c8d825 411e31a1 c0cee696 419d4f95 4112a208 bd5a321b -> 4192d58a", + "c02bae02 41150628 410684ab c02ea1e7 41902a3f 40110b5c -> 41902a3f", + "c13b583a c1158cea 404754a7 c0edd144 c0455238 3e53bc7f -> c0edd144", + "410f6848 c07c5cc0 c06c076c 41283063 41401736 408e2530 -> 41401736", + "c17c86f3 c0d94a92 40c8ca69 4182a72a c15c4eeb 4054c13f -> 4182a72a", + "c14dc876 c01ab50f 40bbbf7f bf1052a9 c12fcd5f 40bb4759 -> bf1052a9", + "4182d111 40e40439 4106d5f5 bf22d706 3e322a3c 40811324 -> 3e322a3c", + "bf6ca52e 4013f84b c03091d3 417f4dc9 bf2033f6 3f86e555 -> 408a11be", + "c14a5626 c1040e3d c09d7dca c11170e6 40cf16c6 40f3a33d -> c11170e6", + "c1207587 40836742 c0bdf824 3f90514d c055169f 3ffd0537 -> c05516a0", + "40f9d392 c0af5442 c0f620c3 c10a2eed c134bf23 40ec0284 -> c10a2eed", + "40d15739 c0b26057 c0526718 c11bf739 c11134fc 40a561dc -> c11134fc", + "c0b712c2 4095630d 408c4f2a c0d42592 417a34e5 40a89284 -> 417a34e5", + "40867acf 3fa58873 40cffb45 c150f180 c18f6d85 40cb1ddc -> c17ebd99", + "407b91dd 408b6c44 c0196f54 c194efc9 3f9de38e 40e50f64 -> c1931ea3", + "40e85a00 4057502e 4113a5de 40edb256 c17c5ac8 4014bff2 -> c11b10d3", + "4055b5b8 40568c9d 40060b42 c19bfc4d c0cba14b 408978b6 -> c19bf397", + "c1545503 40a48bd1 3ed17117 c10b6970 4194a4ea 40843f2d -> 4194a4ea", + "bf192902 c106d808 bed0ff11 c11947fc c132988e 3f918dbd -> c1328dce", + "c158b256 3fc83595 c0052b61 415f9494 41597609 40636501 -> 41597609", + "c19666ad 40eed32f 40d0a64c c1591af2 c004b15c 3e27e969 -> c004b15c", + "40caf151 c1098368 40bb910b 40f0be7a c18ad19a 40334ebc -> c18ad19a", + "416927fe 411e423e c0bc61d2 c0abe32d bd46bd71 40a667e3 -> c0abe32d", + "c0e0555d c066f64d c0f5e705 c170f0eb c0c520f6 bf0913a5 -> c0d9eac2", + "c110a8e8 c0c3f321 40342e63 415df551 c186a7f4 bc69fd6f -> 415df551", + "c157f9a2 411f3171 3f691867 c1998924 41674ba6 40a53971 -> 41674ba8", + "c178b0fb 4108ad52 40201aca 4108328f c18c6ebc 40a9f0aa -> c18c6ebc", + "417c55e9 4058070d 4000f981 40cb494d 4188ef48 406476ac -> 40cb494d", + "c173e83b c0c8f961 be4cd365 417f0140 41545dc8 40b6d899 -> 417f0140", + "c19f7075 c057e0ff 3fc3f49e c15a0b06 41977ceb 3f6a343f -> c15a0b06", + "c1134cf6 405f5bc8 408608d9 c150e670 41221a23 3fa7f13e -> c150e670", + "bf1a0e2a bf63879f 40cc2cce 4147ac1d 3f3652a5 40105209 -> 4146d0a3", + "c09434a0 4086abe3 c0f45577 c0e7a383 c15246f7 4094d60f -> c1432157", + "3f5e1114 c0688285 c01a0a63 bfe3bda7 c04990f0 bf4e5b3a -> c04990f0", + "3fddd8d5 4077f082 c11fc82a bf6be690 c0bd0e93 40c552c8 -> bf9eee00", + "41325ca0 4048da65 40ec7031 c1139cf2 40e06f37 40a6b744 -> 40e06f38", + "4159f395 c0930fe5 c0875646 c0a3d1a6 3f62d299 4041e030 -> 3f62d298", + "c0ac5e90 bf1a3b3c c07ad829 41736d03 3ea6d263 403fbb6a -> 3ea6d260", + "bf20fbf5 40dc22b7 c1162986 c19a5eda 40bb049b 4028593b -> c102b93c", + "c18a96c9 c029b936 40f7a46b c0955cc4 416f307f 40de4ea0 -> c0955cc4", + "c11cd907 c0fd5ccb 40b0d0fe c0fb9f9c 40a156ff 40840bd7 -> c0fb9f9c", + "bf61892d 411b11d6 bfe5e5ca c17ebfc7 4190cab8 409d08f0 -> 418be2e4", + "419e0a24 410a0c60 c104b113 40094824 3f5c7ca7 409781fe -> 40094824", + "c10f7e29 c009c974 40d7cbba 4155b328 bfbf72af 40a91925 -> 4155b328", + "409a0075 c0d91724 c105b337 c0d7c917 419b3e0b 40e5c184 -> c0d7c917", + "418938f0 c0a7158b 40d3d8cb c144a73e c0739601 4062a652 -> c0739600", + "401ad5e5 40f2caac 4068746c c06ac7d4 417dcec8 3fe2b2d4 -> 417dcec7", + "418cfaae 3d9495d0 3f889d4d 407c5e16 418049f6 40f060e3 -> 418049f6", + "40ea81d7 bef0610e c1022758 bf58e554 410c259d 3fbac366 -> bf58e554", + "4140091e 40feb508 4114f767 415e4d0c 4197154e 4019ea26 -> 4197154e", + "c0ce7e87 40f103c5 40adf362 414893d9 bfd61d54 40d4319a -> bfd61d58", + "c0e4f3bc 40dce19f c117a43b 41089e88 4190ae27 400b71c5 -> 418c822d", + "40991a52 408f99bd be6dc10f 3ff4362f 405b5010 401a22e9 -> 3ff4362f", + "c199c8e9 c085242e c024e705 403d717e c19bbf18 bd89337a -> 403d717e", + "40d50992 c0216670 4081ec53 c0bb96d5 409eafdb 3fdc6a42 -> 409eafdb", + "3f917896 c0e15150 404384fc c0472f79 41956942 bdc06b8b -> 4184ebc7", + "c167deb9 c02e52de 3f7abad1 419bbf3a c133c5f1 40e2a9b3 -> 419bbf3a", + "4193d25a 4103938c c025e1cd 416f804c c1713f01 4047b705 -> 416f804c", + "c18fb66e bf6950e7 410af698 c1170caa c0ebfb05 4007b420 -> c1170caa", + "40f0b929 41004112 c11fd3e5 4186fc0b 40a89d33 4061bc09 -> 4186c782", + "c1822524 c0ef639b c0cb9fbe c194cf73 419b9306 40bbd902 -> c194cf73", + "41694a23 40b87598 c089a2b4 c18395c2 c15b79f8 40a7b63a -> c18395c2", + "c147523f c062a10f 3fdb7be8 c17ee5f4 c17149df 408f2430 -> c17ee5f4", + "400fe1e1 c10be1f1 c10104cc 410ad31e bf5d20dd 409a9aef -> bf5d20e0", + "c19ce179 c0c63c26 c0e427c6 c0bcfbf6 c10a37f7 3febf651 -> c10a37f7", + "40bc1d8f 400a01d2 c047cae3 c020ec84 40fb5097 3f79c784 -> c020ec84", + "416ed681 bf4301d8 3fa29fc3 c19dc990 4136794a 40e17871 -> 4136794a", + "bdfc92f7 c0442eec 4119c594 407557c0 c15dded5 4097224a -> 3fb5343c", + "410b62b6 c00f6702 bfd107bf 3f30eb07 4127fecc 40d7e8b8 -> 4127fecc", + "40afeba3 3ca8e776 bfcee37f c1354717 c1020fc8 40c5517c -> c1354717", + "419d2a3d 410f6d72 c0d23a09 c05c21b0 412de8d7 40cc087f -> c05c21b0", + "c11a4669 c01daf69 405e6c32 41961b03 c1436b74 409da534 -> 41961b03", + "408096fe 40736886 c107e8e6 41234d26 419bfae4 40370a0a -> 41234d26", + "418916ba 40ace20b c0a48f36 4198e589 40d2b913 4058f9e9 -> 4198e589", + "4138cce4 3fa77703 408cde82 412bdf6e 415497fc 40b1a6ff -> 415497fc", + "40a59ec8 c0b48e33 40afcf05 c19c7edb c132a766 4091036e -> c132fa20", + "c129e27b c07522e0 c1086b9b 413a2ab7 418d747f bed6a869 -> 418d747f", + "c0867c0b 3f8a95c7 3ffd234b 40b5b863 bfb5cff1 bd5b51c3 -> 40b5b863", + "410c1e04 c11588f5 c0f5dc5f 4087566c c09c487d 402cbe40 -> c09c487c", + "c0b706f0 c0e920ae 408eac70 c0f93501 414dbf7c 400524dd -> c0d91c03", + "c0a86560 c0e3465f 411aa782 4122ce10 41779f40 40eb3505 -> 4125a500", + "40f56736 3fce6a5b 40a309d6 40ffef3a 40fe3a0c 40b184bf -> 40fe3a0c", + "415e08c2 4116aafc 3f503e8d 418ec241 414fb84c 40d3d6f1 -> 418ec241", + "418c264d c0c41a4d c0d2d8b2 c178309b 4163072b 40f94c08 -> c178309b", + "414d1404 3fdf7908 3fb75eb9 c0a8dbe1 c1375715 408d23e6 -> c0a8dbe1", + "c091fce2 40af6f61 411088a8 c11049ec c18e6b0e bf3058e9 -> c11049ec", + "c15b4541 bf921f1a 3fc071cf c127c0c1 c08a5192 3cd0dfd6 -> c127c0c1", + "4195fe65 3ff22864 c01456a3 c1932f27 40d41e7d 40dd9906 -> c1932f27", + "c13717da c02e4b17 c0b97715 40ad50fe c09b2dbe 40531d19 -> c09b2dbe", + "c1656529 3f0d1f97 c09bc501 c140500a 4195c21e 40391e40 -> 4195c21e", + "3f26e617 c1050496 c0ef4a82 c152c27f c184660d bea12c70 -> c184660d", + "c005af81 4050f98c c0de2ce4 41838053 c1040c51 40f41545 -> 404bea3c", + "3f0139e3 40f2e06e 407bba27 411ccd49 c10ac671 408afe69 -> c10ac671", + "c169c28e 40b303d3 4076c7c3 c0efc7f6 c04c00f8 408b7b58 -> c04c00f8", + "4096c329 4103a8b9 40ab1734 4109ec58 4118e55e 40009793 -> 4118e55e", + "c1390d71 4105a3fe 40a54009 bf5bb40e 41492da3 3dd827d9 -> 41492da3", + "c0e51f4d c00fab2c c0a28b1c c179fbfb 40159b0e bf26c515 -> 40159b0c", + "417c53b4 409eb338 bf999e8b c03895e3 4144aba3 bf368bbb -> c03895e3", + "40dbc4b6 4034ef84 3f022602 c02b0d9b 40a031e1 3f8d0228 -> c02b0d9b", + "c00fdfb8 40fdad00 4116ae51 c06c9b4d be839f65 3ff2d156 -> c06c9b4d", + "c1107a0b c035fe5f c0233f14 40d2560d 413d7f34 40fbc964 -> 40d2560d", + "c17d9c6f c0819e01 c0f243f5 c12da4b2 40fde2c2 409067cb -> 40fde2c4", + "410e2bbc 4020b4f8 c07061ae 41864a8d 3fd2a164 40e916af -> 41864a8d", + "419d56b5 40f2a86f c0854987 418386cc 41838cb8 40816eb3 -> 418386cc", + "c0f8b8e2 c0f92261 411e1a05 c11cbacd c1671d55 bd3d1a53 -> c11cbad5", + "c1177b28 c0146a00 c10609e7 be5cb20b 4113ddc4 bf6fd2ab -> 4113ddc4", + "4199bb79 c1192ee7 400a8165 c177842f 412b2d22 40f7892d -> 412b2d21", + "3ecad46b bf87a9a8 c0b4a8fb c12e7d78 c17b9b50 3f99489d -> c12e7d78", + "c154c22b 40a2ea01 41194f00 40c352ec c132088f 403e287a -> 40c352ec", + "402a6c77 3f770087 40a40908 3fe6e342 40f3baca 4067c819 -> 407ab8ed", + "c11b9bee c0773e09 bf33ebe6 40f4ab34 c15e2308 408117fd -> 40f4ab34", + "c19fd8a7 40c601aa c0df3bd7 417c92df 418e9626 4089894b -> 418e9626", + "41919492 bd84b0c7 c1194524 418eb063 c0c86c64 409dc19a -> 418eb063", + "c1879a83 40fd96f6 bf160ab0 c0010418 414e1a19 bf6682cf -> 414e1a19", + "c02df39a bfff6a47 40f2dd5e c1354120 c17dfbd9 409b5b21 -> c1354120", + "c1417255 c016b609 3ff01b52 c1330094 3df59f74 40c9d969 -> c1330094", + "c0ccac58 c084b72f bffbb630 c18a3d85 c16a3792 3e7d97d2 -> c18a3d85", + "c19639f1 3fd413de 3ff71853 c181ded5 c16edaca 40f62d5c -> c181ded5", + "3faa7a84 4110f125 bf95c2ae c192a11b c18fae22 409fca92 -> c1901f89", + "c13ec25e 40eb8eac c086dafc c1527b07 40b7b807 40cf7f68 -> 40b7b806", + "c139b391 c0016461 c0ec4b76 3fde0f5c c07594bb 401d072a -> c07594ba", + "bf926fb4 3ffd2fa9 c0dc30d6 c184234a c15a56b5 40dbda2a -> c17b2e62", + "c04e4c65 410df95b bfd0a295 411694c1 c11e72d9 4096b35f -> c11e72d9", + "41512a8e c10763a2 40814e0a c0a8e23b 4197e7c1 becd0554 -> 4197e7c1", + "40036994 3e0abd84 c109b0c8 c0f6cb83 418fd7ac beb99b72 -> c0f6cb83", + "40c1ea9d 3ffdf975 4085b829 c147ac1e 41428881 40eb3d67 -> 41428882", + "c0f88ff8 c100510b 40f000cb 414361a5 404acb5a 40fec74d -> 4143449e", + "c0a00c9f 3fe72abf 3f03830b 41805d76 c1844e5f 40ecffea -> c1844e5e", + "c0a8798a 409e8638 3f904c54 414bf7d5 409ebbe3 409d94ce -> 409ebbe3", + "bfa8fdec c0c7866b c03af4a5 3f95d5f7 418b2a12 40c10789 -> 418b2a12", + "40d826a4 410cb62f bff32265 419357dd 41490b54 401d9879 -> 418ee1fd", + "c05b8959 40ee4374 3f819d54 40975142 c14a944b 3f1dfb54 -> c14a944b", + "412cce97 c08aaea3 c0fb7cf1 c1411c3c 411cd8ba 40196ea7 -> c1411c3c", + "41977e83 411293e0 c0f11bb0 bfda46bd 410f118c 4000d691 -> bfda46bd", + "c14aa469 c105e959 c064fecd c1041ae3 c1532962 40024262 -> c1041ae3", + "402f846f c11d2f48 c040739d c1926ebc c194cbb7 40b80112 -> c194cbb7", + "c17fbced 4104e5b8 40da820f 41144f7f 418a40eb 3ff77c0f -> 418a40eb", + "c152ea5a c0e05640 c0345111 c120f85e 4194d1a5 40f348cf -> c120f85e", + "c17e7b8f 40c9afc2 c00c7da4 c04d922c 415423eb 3fc39730 -> 415423eb", + "3ece6fd8 4067b6a1 c02dcc23 c0a9c885 40139536 406f20d4 -> bfb49eb2", + "c07985c6 402f8706 40cad4ab c0e695ec 416fa50a 4013e6aa -> c0e695ec", + "40ff3b9c 3f159c21 4111a53f 413aa91a 4193e019 40c2f8c2 -> 419143bd", + "c189aec6 c0957d45 c110c8de c186e53b bf77bb8e 40c218c5 -> bf77bb90", + "411f8f00 3fef10ff 401b5b96 4135e106 c12f3ae4 bdd7ca85 -> c12f3ae4", + "bff0186c 40c5d6f1 bfc6abb2 406ca294 40939489 40ec7b52 -> 40939489", + "40301244 40f67293 c0afc703 c0852bb2 bfd971ec 3ff32469 -> c0586dd7", + "418ff565 c10e14f7 3da67e92 c1969d8d 41214203 409e81ea -> 41214202", + "4097a9c6 c0a363df c0e427d0 3f97b1d1 419e2453 40b8b163 -> 3f97b1d1", + "c11be29c 40e5dfbc 4013d089 c089f24e 415f696d 40ac6bd9 -> 415f696d", + "418e2ae8 407a26de 3fbbbdd5 c0842603 c1365a53 3ff4100b -> c0842603", + "bff3bbe2 4072fbc4 c04ec5a1 c139b7c3 c09ed4dd 40cf8c6f -> c0b2b381", + "c16439cd 40cb1823 c08844f2 411b42c9 c18e0cb7 40872d0c -> c18e0cb8", + "c052d4e0 c0054a0b c00ba443 c18aa5c8 c19d0665 40a25a27 -> c19d0665", + "c1383d03 c0dbbb06 be23030d c11df93e 41506161 40fb3e52 -> c11df93e", + "c184e8c5 3eb31427 bfb6d676 c01e5ee1 c1942a1e 40d83d5f -> c1942a1e", + "c197632a bfd71fc5 40bed247 416c7e81 4150b496 40f43308 -> 416c7e81", + "c00138b8 c0afad27 c0871cd4 c01a6ec2 40c0f883 40e723cf -> 40c0f883", + "415f5b2b c013c48b c06a9263 c1882f3c c0e0a4ab 40a4abfc -> c1882f3c", + "c046273b c102f7ac c0e00e53 c0b2e64e 3f958bdf 3f9724ba -> 3f958be0", + "c0be0c34 40499be7 40f2a273 40a8dcb6 c1032e78 40e3dd87 -> 40a8dcb6", + "404c7d3f c076161f 40a1a2d6 c122df2b c188c472 bf31b35a -> c1828c20", + "41846e5f c0fe7b8b 40a0b837 c167456d 419fc402 404939bd -> 419fc402", + "417ff15e 3db4e03d 40234962 c06da372 40aece3b 407f591e -> 40aece3b", + "c17c4425 c1192e19 4018ae0d c160cb95 41547dbf 40eb588c -> c160cb95", + "c0cdb180 c0bef67a 3fde3092 c16128a6 c011348c 40ea031a -> c16128a6", + "416680b0 406616fc bf6f7393 c18875b9 bfd765a3 40caf2de -> c18875b9", + "40c91c42 40a8897e c09aedd6 40ded4d9 41367fbc 3fcbe2f7 -> 40ded4d9", + "c14cfc96 40c8758f 3eda9f9c c1819bcc c05aec49 40f72997 -> c05aec48", + "c12f0f7e c01c4b13 bfc1fa5d c0cf5af2 c1925759 40b48ffb -> c0cf5af2", + "bd0f98d7 40b6e193 40356b58 418ee3f1 c1991471 409a35fb -> c1991471", + "c18cdc29 410cf0de 4059856f 40593800 c04f941b 3fed07ff -> c04f941c", + "c183222d bf199c7a 404c6dd2 bf5239c9 40063b20 4077638f -> bf5239c9", + "3f8bf203 3fb62616 4091df2a 41377f85 4134f388 403a80eb -> 41377f85", + "c05e18c6 40dbe1ca c10a2a65 416ccdf7 4106eedf 4083a18c -> 41214f9a", + "419540b6 c0504475 c104045b 4196120f c13d2177 409d5882 -> 4196120f", + "4001f671 c11f96cd 408d4a22 c1891079 4040009b 40a90c5c -> 3fc324c0", + "c14f84c1 40a0632d 3f30633f 41038e36 c18f3f8b 400218ed -> c18f3f8b", + "41239f57 4094c5df 3e83dd6b bf29be40 41078e69 40e1c96f -> bf29be40", + "c0f112f6 c0d26f51 4102275a 41918ef1 c1606163 40a591ea -> 41918ef1", + "40a18ffd 40e78ea4 4016a38e 4184054f 40d100bd 3ea3d627 -> 4144ab9e", + "4182d8e0 c093819d 40dd6578 4171c39b 40994739 bf0649d1 -> 4099473a", + "40f28861 c09fbcd7 c0a9cee0 bf38db64 40da15ad 3fc988e2 -> bf38db64", + "409c72b2 40b5d9c0 40889a32 c0a0482c 401ad2ca 40c67fd7 -> bf1d3790", + "4184ab09 bf1a9665 c0143021 418d0fd7 419dd54f 3f601367 -> 418d0fd7", + "419996b2 40386ea7 409db4fc 412bd586 41181cbd 401358a8 -> 41181cbd", + "4112da55 3fd896db c0b45000 40e4cd17 c152a30d be2e0d54 -> 40e4cd17", + "4111759c c0c912cf c10f9dfa 40e07cfb c16bec52 40f61fc2 -> 40e07cfb", + "c17aedb7 408a733a 4082f41d c1165489 40ba4c46 401d946e -> 40ba4c46", + "c0f44702 c081304d c0baf3b4 c0d764c9 c10af894 bcee7772 -> c10af894", + "c0d68d0f c05718d6 405dfd08 c17487de 4114b37f 4025ed13 -> c17487de", + "c068e7d1 c0a82106 bfd7b7ae c0bd6be3 c13f4519 bf7c3818 -> c10821de", + "c05cee75 c11c0380 bf2b27bb c0959390 c183677d 4003b618 -> c15ca733", + "40cbc548 c0cd667d c0db122d c1701ef7 413aeb2d 4057e387 -> c1701ef7", + "4027a204 c11ba628 40ffc61b c095fd18 c1916428 40c45998 -> c1734a11", + "c12f4350 40bd9ec0 410eb1ab c1565fd7 c17e186d 401bca84 -> c1565fd7", + "c03879ca 3d704cd0 3f1b9bc0 414e658b c13ca0a2 40724486 -> 414e658b", + "3f2d331a c08f2a40 40b6cb15 40be5866 c1266842 40df0856 -> c0174ee8", + "4132fcc4 c005f51a 3f559f19 c04ab8b9 41163ba5 3f94152a -> 41163ba5", + "c10451ac 40eeceee c00f72b8 c0dc6c4f c0c065cc 40638f3d -> c0c065cc", + "4175618b 40ade1c2 4085da2b 3f072c8c 4052ffdd 40c004a1 -> 3f072c8c", + "c190fca7 411153c2 c104c170 415bac35 40b0bb10 408f9f68 -> 40b0bb10", + "c15622bd 40e713b5 3fc1b2b3 c1861e35 bfb895fe bf6255d4 -> bfb89600", + "c11cf7d7 c11f3007 4083df27 c193c8dd 417f527b 403862b9 -> c193b470", + "c19b9821 3f7a2ad9 40af4e84 c08ab15d c135bb72 3fdaaa9f -> c08ab15d", + "c1198f03 c11cac2a c093592b 40797a83 c026b511 406eedb5 -> 4077c3de", + "41870a16 c0e5e369 3f76b238 c158c17b c1420d18 40a288c9 -> c1420d18", + "40cf42d8 c0d1e703 4078ce71 c137357f 414408d0 40f0d02b -> 414408d1", + "4050cd60 c0c96525 c0f3cdce 410e2006 c1943293 3fe013df -> 410e2006", + "3f46bd65 411f0665 c004e384 4133cf9c 413c26b4 404fa068 -> 413af6cc", + "410c23f0 40ca8e9c c0de02fa c0b1c68f 41896e63 bf351025 -> c0b1c68f", + "4185f5c0 c09f737b c0b4461b c18fd7d9 418f622c 40b1042d -> c18fd7d9", + "bf6b1d8b bef5d9e4 c04875a3 c0850709 40efbbf4 bf5da30e -> c053b566", + "c17eb6b2 c0f9b26b bfc99adb c0c0bbea 413e5860 3ff27fd1 -> c0c0bbea", + "4196b0ac c0e690cb bff3a8f7 bf13057d 4188c557 40fcbe1b -> 4188c557", + "3fd0e159 40c7621e 3fdbc57a c0c751f5 3fca7749 40bfeefd -> 3fca7748", + "419d7260 40bec99b 4099764f c1964062 c0d3d475 40a5f412 -> c1964062", + "4162f35a c1132f92 3f557091 4080cd3d 4162935e 403f4bc5 -> 4162935e", + "3ede51b9 bfd177d3 c10e08c2 41451f2b 41831ca7 4079a9bd -> 41451f2b", + "40a00c46 c104a756 403745f7 407b34e1 c00745d1 3fc4c81e -> c00745d1", + "40fa4af9 bf5ccd07 c11c5e3a 403b5244 c03593de 4010de9a -> 403b5244", + "40ec4b6d 4074f9cf c0c49485 418e2d7e 4181ba71 40c57d2c -> 418e2d7e", + "419c6860 c0f6286e c117cb0e c123a045 41817763 40e3aa98 -> c123a045", + "40bfdd7a bfd0c748 c0d87756 40bb0187 c088c706 407f9239 -> 40bb0187", + "bc564a58 3fceab61 3efdc37c 402b30bd c1771f22 bd902cb6 -> c1771f23", + "c0ce9f32 c0960d56 c0c2527d c0db2f2e c0a16c0c 40be9663 -> c0a16c0c", + "408c6ec9 409c7435 4113174b bf97c76c 419febc8 40dbaf3e -> bf97c76c", + "c10b1401 bf426b2f 4034a4ec 416d35f3 411f330d 408a97a0 -> 416d35f3", + "4180103d 408daaca c0f89eaf 417a744b 40410346 bef02c0a -> 417a744b", + "c19d4ffd c0aac3e0 bfdaa53d c05af8e7 c17adcb9 40aefead -> c05af8e7", + "3f9ef1b7 411b7f15 40f94938 c00bfe81 40c81a14 407be596 -> 40c81a14", + "4174602b 408ba452 410f7771 40d1a6d8 c13dcc06 40338f9c -> c13dcc06", + "415fe989 40f22ca1 be2a237b 416312b5 4156de9e 3e22f7a6 -> 416312b5", + "c0fb85a6 c0ac43cc c0cbd042 bef0590c 40bb20ac 40682808 -> 40bb20ac", + "c0690efe c103fb88 c0b8cbac 4045b425 418bd46a 40228e33 -> 418bd46a", + "bfa99df2 41182da6 c0559740 4116d7e0 4118c8e5 3ff312a9 -> 4118a824", + "4178fc6d 3fc19158 408b0bfd c1817b14 c173ef38 40bcbce2 -> c173ef38", + "c1220dcc 40c06eec bfa64ac4 c183edf9 4163cf8b 407a5b33 -> 4163cf8a", + "c1040107 40e46c6f 40bb18ea c15d73c8 41916f51 40ab4ddd -> 41916f50", + "c19c36f3 c0ff4484 c02c6ecd 401e1a2f c111968e 3fb6cabf -> 401e1a2f", + "c190e3e3 3f95a22e c064defb c1884ad9 bffed5f1 bf33d394 -> bffed5f0", + "c12e9958 4113fe29 40d86abb 4092e209 41404d08 408a88eb -> 41404d08", + "40b7c71e 4101d1d0 c09ecd08 414dcacb 40c15233 40313f12 -> 414454f8", + "c00f840b c0a6c320 40d221ee c091e51e 4187f8e3 bdbb6b9d -> bf9204ae", + "4163905f 410db786 4102c08b c1612164 c17183c0 40dd864b -> c1612164", + "c161498e c093f546 bf80b77b c18faa77 4187263a 40be58e9 -> c18faa77", + "419c1b87 40bbeb7d c0a656cc 40aaf697 c12433f6 3fbdf4a7 -> 40aaf697", + "c171c081 c0bbd3db c1099aa7 c1972f34 c193078f 40cd5359 -> c193078f", + "c1239331 c0c17413 c0ae68fd 4127d3c9 c189ec7e 408b8de9 -> 4127d3c9", + "415da056 c10f1eed 411bebe8 40f550a1 c08b071a bf7d4874 -> c08b071b", + "c176e40b c09f5db0 40aeaf8a c1093307 40cdba66 40e9264c -> c1093307", + "c113cb36 c0ade535 bfcc375f 419e83fb 418076a0 3f8009ee -> 419e83fb", + "41854525 c1198f6a c0b2f054 3f26195e c1681761 3f8d65b6 -> c1681761", + "4151f95c 410531d9 40070057 c08479c6 3fa1c37b be5b0e91 -> c08479c6", + "c1174f1e c11f9817 c0889bdc c123bc0d 40f6b1cf 40893407 -> c11d11ef", + "c195da2c 40f4fb83 bf86776b 4147609d 4080082c 40c9407b -> 4080082c", + "c094e19c 4052567f 40b5891c 3f973587 3f8828fc 40cce1f6 -> 3f973587", + "c1124b39 c0890b38 bf48c96c 3eab2c64 c11cdd69 40cb1bf3 -> 3eab2c64", + "c0aa78f8 40ff4868 3f396913 418aa32f c0caa6da 408e0a63 -> c0caa6dc", + "40e42081 bfe1e560 c05f17af c14446d6 40199a9b 3f23f4a2 -> c14446d6", + "c1638d39 408ef2a2 40fcb023 c1772cba 417c4504 40bdefe8 -> c1772cba", + "c12d64b4 40b01beb 40a216f0 c08eeb95 41141e3b 40cc0ed4 -> 41141e3c", + "40c6bffd 40d72f45 c046a597 c15dca0d c1963341 40c40acd -> c15e692a", + "c146254b 4114f4a5 c0b40ec2 40532058 41535ef7 40885229 -> 41535ef7", + "c0d8680b 40cfc8e5 bde41bae c16b7f9b 40c1a0d6 40bc9eef -> 40c1a0d6", + "41759376 40cdb84b 40732b1b 417de585 411ebc10 bdc63a47 -> 417de585", + "40835c06 3fcee204 c10b631e 40ab13dd c0450879 403d1dbc -> 40ab13dd", + "c0d77e74 c0ca7b44 c0854b5f c15d96aa c18203cc bf3e0b33 -> c15d96aa", + "c178fd74 c04dd4fd 409241e7 405b5651 419a2d1e 406ae936 -> 405b5651", + "4161e109 406fdaf6 3ffdadc5 40482858 c06d3cb3 3f0e11fb -> 40482858", + "c0d20339 403e4f30 40dc2498 c08af77d c126774b beffdaa6 -> c08af77d", + "4146c959 c0eb24c0 408ec4ee 414a6f6a c1061281 40de4c22 -> c1061282", + "411f1e8a 4090fda9 3ff37f85 4101df21 c1890d66 40c8f8ea -> 4101df21", + "c09e7826 40815dbc c0b76663 415924a2 408b147e 40db1633 -> 40906872", + "c10a56ca 40c49b5e 3fa06961 c1848c97 40b9257f bedff280 -> 40b92580", + "c0ee6bcc c0eb62b2 411fac0d 418d55e8 c1193584 40a4ba5d -> 418d55e8", + "c13bec87 c100a25d c043d11d 3fe47b04 c187e093 405e5649 -> 3fe47b04", + "40cab131 c001b78c c0f06a8e c18739dd 418d0adc 401132af -> c18739dd", + "c1384910 40301a7f 408e9e61 c19e75d6 4186ec9e 3fdaaf29 -> c19e75d6", + "c04500c2 3eef88fd c0d56147 413bf528 c1882d55 40d070db -> c0204a40", + "c1162bd4 40809c26 3fdf86a1 c13682bc 40fe960f 40d5fb0b -> 40fe9610", + "bf73b9f4 c00dbb2d 401aa60a c031f78a 414839d9 40dcb93b -> 3c1f3f00", + "411fbec9 bf7b0342 4005b7a0 4162ed1c c02bbe40 bf7ba5e2 -> c02bbe40", + "c119e5cc c09892a3 3ea95a16 be1ce4c2 3ffec85e 403efb4f -> be1ce4c2", + "3fdd2cec c0b334a7 c0750b28 4100f057 c097b619 40621d05 -> c097b61a", + "c18f2b6d 4111e3c2 c0aded8e 3e0264fd c0c33015 40f74c0c -> c0c33015", + "c0c19fa1 3fddf070 40d038b2 41287165 41557620 40ba80ad -> 41287165", + "40a845a7 408bf53c 400fe306 c0b8c66b 41411073 40a9f766 -> c0b8c66b", + "c0c66d15 409f04a4 bdf53f4e 416b3d91 c084ff94 3faac432 -> c084ff96", + "c0b4b4c0 40df3380 40948582 c18e7ab3 40d7ba49 40ef7c55 -> 40d7ba48", + "c0a882fb c0c496c1 40e7bc39 c10ad383 c0faa96b 40b38e83 -> c10aa8ec", + "41888d5c 410d8a14 40fe2611 c151fda9 c11e5ba2 3ff97fe5 -> c151fda9", + "40de4704 4008f2d5 4100d12e 41497b5c 40b41f5d 40e98a53 -> 40c89184", + "417c9063 c01d4b34 c0e53266 413534f7 410479ff 3f3c2787 -> 413534f7", + "c18760e0 c0889978 3ec02234 c125b2ec 413adf80 3ffe2849 -> c125b2ec", + "3d10d103 4112ca1d 40967fc2 4185da6e c0a4c96a 409c42c5 -> c0a4c968", + "c1219d5b c0ebdd1b 40ab4779 40ea4d18 c1177e87 3f744c52 -> 40ea4d18", + "bf90bed2 c03d9dd2 c0b068f0 410d75da 4042a34a 401eec52 -> 410d75da", + "418b9002 409147df 4115145b 41437bd6 c12a8c03 40b4a3c3 -> c12a8c02", + "41047946 c09e4857 4004e89b c0e55639 40319baf 406ac630 -> 40319bae", + "3d9d61a6 c0dda6e9 40db2f33 4093568c c19f49c6 40e7098d -> c0fec392", + "40d1b4f3 4097f7f1 c10aab47 c15d05f6 4197fbbb 3d7a3b1b -> c15d05f6", + "c018956a c015dd27 40b3f5c7 418434db c18c53a0 40cf7e4b -> 418434db", + "c12004ad c0e803f6 4117168a 402f25c6 40d97964 3ca30191 -> 402f25c6", + "c0afb628 3f94161e 40f596c7 bf8db569 c10643f7 40b1912f -> bf8db569", + "415c31e3 403ce3b6 bfc6dfe2 410dd0c4 c0ed8488 40d856bc -> 410dd0c4", + "c018bb94 40a5250c 40d9e49c 4118d3c4 c0504f82 3fa0e1c6 -> 4118d3c4", + "413719f7 40f8e8c6 4105f1a1 419667b7 c0e4c67e bf55896d -> c0e4c67c", + "40d076dd c0cbe1e6 40e83501 c152ce0f c1035129 408493eb -> c103ff8c", + "c1890250 3e85cc8e 40b13987 c05dcb24 c153e175 bf0e240c -> c05dcb24", + "c0c1086d 40e73b94 c0a41839 c1748655 3c017ad6 3e0a4925 -> 3c017c00", + "40815436 c1007b39 4081ffd1 4137cf02 c175c43e 4089a8eb -> c175c340", + "c14d05ee bff394a4 40f2cc8a 413e0f9d 40549513 40c9a4c3 -> 413e0f9d", + "c19655da 40b5e407 4081b18e c185a8a2 418f594a bf07602b -> 418f594a", + "4030e530 c032d759 40b6ec3b c10399d6 c14a743e 40a9da75 -> c136ca69", + "411d4428 c0b924ff c0e587ba 407d593a c0252c2c 40cbfb78 -> 407d593a", + "410bfa69 c0961e21 bfa94828 c14c7bbe 4174c70b 4054fdb5 -> 4174c70a", + "40a17d1a c0b5f4d6 c10ed1e1 40b2d0c0 41886c13 3ff00e04 -> 40b2d0c0", + "c0fe148a 40cd23dd 411bcbe0 c1360a16 40a9a740 408d027f -> c1360a16", + "c142d748 4004da1a c03c5f40 c14e1a99 3fe6213b 40868f65 -> 3fe62138", + "bf76b28b 40595a0e c07f0544 c122399d 40decfd8 403f2dd6 -> 3f367f40", + "c0d75208 408c5727 c095053c c0894494 c16b6dd4 405ec390 -> c16b6dd4", + "c1757893 c118f6fa 40e75ff5 40dcc863 c144b987 4094a739 -> 40dcc863", + "c18e9ad5 c04535bb 400c3d49 c1936129 3f3eb4d9 3fbd2c5f -> c1936129", + "418d7162 c11ac123 3f8bce48 41960b9c 400d79fe 3f691952 -> 400d7a00", + "c15b3183 40cc58d1 411f74b5 c0bd2373 41978522 409f7b55 -> c0bd2373", + "c16bd95b c0de3127 bff2ab58 409af61d 40dc2d96 4008ecb5 -> 409af61d", + "c132eee8 410f3443 c00991ef 408a2516 40da7563 40c266f6 -> 40da7563", + "4199f301 410d6b74 3ffd8d80 c17fa304 415026d0 40cd210b -> c17fa304", + "c0683bc5 c0fa07b9 410c9cbf 419b701a c0b8ef31 3fc291b8 -> 4176e95c", + "c0a46654 c0653447 404bddd5 c144d56f 41482cdd 40ffcbe0 -> c144d56f", + "c143ca8c 4110d0bd c11aac6a c0bce7c9 c13a7034 40cef432 -> c13a7034", + "4134acff 40150a2b bf134cc1 c18f61d0 c066529c 3f463eaa -> c18f61d0", + "412d4193 c0840187 bf306762 c09b6b9d c13ac17a bf1f2b50 -> c13ac17a", + "4086ae23 c1024c86 c06f01d2 c1174fc7 c0dd619c 40572898 -> c0dd619c", + "410679e7 3fd337c0 be730041 c1331dbb c174c043 3e48a77f -> c1331dbb", + "419237d4 40288e38 406c015d c16e1f6d c0fa185d 405cdee6 -> c0fa185d", + "c1982971 4113ec3f be31afd5 be8bc6cc 40e49216 409f82e2 -> 40e49216", + "bed29ad9 3f332ea8 40cbdabb c15180cf 41419382 40f42336 -> c15180cf", + "4131232d c0dcf1e6 3fffbe1e 410b5293 3f9ac0e6 4088cc4c -> 3f9ac0e8", + "bfa3fed8 403adb97 40f18169 c149f871 bebf83a3 40b54147 -> c149f871", + "c19cce25 40d2c7a0 3fe8a15a c0ffe340 c0a4312b bf22428c -> c0a4312b", + "40459f5e 40adb228 40d4d912 c16d8357 415a8b15 3f1e349e -> c16d8357", + "417a04f4 400b9ff0 c103d447 4162ccac c19c8729 40963f63 -> 4162ccac", + "c184147d bfe0871a 3feabb23 c11ed451 c1455c32 3fb4890c -> c11ed451", + "c1926b52 40da4df2 40b73e0d 41618f6c 41155c04 40288122 -> 41155c04", + "c0308aee 41016fab 3fda4ba4 c042391f c17e9f06 4082b38e -> c17e9f06", + "412fd9dd c0798117 402d86cb c182745f 41718189 409cfb75 -> 4171818a", + "405a0f30 c11a5cbf 40cd00f3 41344364 c141430e 3e393923 -> c11f05fe", + "c180720b c102ad33 4007ab51 bfcadfca c086da74 be4a29d1 -> bfcadfca", + "4087c92e 40a437d5 bf98b43a 40f145b2 c182d39e 403f269d -> 40c83ee6", + "41859084 c00f64d5 bf01cd02 41920e56 c12edecf 3fa0deda -> c12eded0", + "40a1244f 40ec2210 3fe23826 c175bbcb c133024e 40964c4f -> c15c8b4c", + "410ad255 c0187734 4107c7aa 41815f6b 40a136d3 40f4879c -> 40a136d4", + "c1046406 40a89ac0 c002eb97 417c8be5 418362b8 40a8192b -> 418362b8", + "4167e5da 40a2fc0b 3f335932 c18485d1 c089f8c4 40c0e0af -> c18485d1", + "41016991 bfc3c88d c0d100e7 c0c67eca 411f128b 407fe78d -> c0c67eca", + "c0c0dfd3 4116eaae c0abf05b c1790922 be02e098 3f87724b -> be02e080", + "c0e194f2 c02daa8f c0e06eac 413c8d6a c180b289 40c3b63c -> c180b289", + "40f1abeb c101eb56 c1070608 414cca5e 411019d3 40db6b19 -> 414cca5e", + "41722383 bf1b1198 411f9041 40959edc c0fe70fa 40c07ec2 -> c0fe70fa", + "4058938a 410e30bd c10abe5d 4103832e bf8ce9b3 40838987 -> 40c18062", + "c189d2a6 3f93df20 bde1561b 4143e49e c12d13bb 3fdd6e22 -> c12d13ba", + "c0ee62a7 40d8e66d c08809b5 c197e846 c11db518 40fc61a4 -> c11db518", + "c105ead0 c068f502 c0539bd6 41044d26 41721f60 40fea11a -> 41044d26", + "be2ae593 c0955b5a 410f6b6a 41895ad7 c01b70d8 3ed97acb -> 4142bc52", + "417e5867 bf523d97 411f8c42 c0b61226 419d24ab 3ea2793b -> 419d24aa", + "41296e35 40fd3b81 40fa0fe5 c0256e6f c14a1e40 40b46f15 -> c0256e6f", + "c19732ae 40add266 c101efee 40747063 c1795e40 40893c6f -> c1795e3f", + "bee8ff27 c0c63712 40730479 416ed2c9 407ad100 4081c602 -> 41034048", + "c16e8bbf bfeded36 c0c36db4 c1915730 4003b700 40fc6f8b -> 4003b700", + "3ef1aa17 c11ee929 c0022d0a 418dc6b7 c0255b3c bdb1c826 -> c0255b38", + "40963fa2 40425c7b 410ea49b c1000cde 41840949 40a3c264 -> c0502080", + "416ab896 411018bd c0daae71 c080c388 c183bbdd 40bcdc5e -> c080c388", + "4125516e 407899a0 4081df72 c19795e6 40a2ad30 40d53f17 -> 40a2ad30", + "c188f439 3f638e9d 40b14c3c c18df24e c159c9dd 3fb2f674 -> c18df24e", + "c185326f c11a8ae8 40561f55 403fdea0 4141cea5 40bc1c35 -> 403fdea0", + "403e55f7 3ffd3b78 41177932 c119db89 3f08cd1b 40a4de14 -> c1120249", + "4133a990 c0ef0f01 40d928a5 c02ddb62 40970228 bef8c520 -> 40970228", + "40407018 3fadde1a 3fb4a4e8 c0e7cd02 c13cfaba 408e455a -> c13cfaba", + "c09ed7c3 4119ec6a 406f9cca 40f72f03 c148cf6e 40076f34 -> c148cf6e", + "c19021a9 bfe6c61f c11df4fe c17985df 40fe46bd 409ac024 -> 40fe46be", + "3e975862 402b0784 40e0fbbf 4169c8f3 c14fe19a 40f1ad48 -> 4169c8f3", + "41252ad6 40998f2d 3f5e16b9 418229a5 40d13999 40efb6fd -> 418229a5", + "c082f5d9 c1017a3c 3eb6712d c07b8ef2 418473d6 3ec2e0c2 -> 40afe89f", + "c1856300 c0eb54b8 c0db6745 c186921a c19278c8 4091e76d -> c186921a", + "410b8521 c0a03515 3e603cea be7cf2f0 c19e4903 408c1218 -> c19e4903", + "41155eaa c0e5cdbf c0c5e346 40a646d3 c190caa1 bf41d0b5 -> c190caa1", + "c1933d07 404e24ef c0f45e3e c0b1fe40 414044f0 be940c7d -> 414044f0", + "41893758 bfe7491a c0399e70 c0e588cb 40f83089 408a245e -> c0e588cb", + "bf8d09bf c030a9ec c0af0f80 c026146a c160a342 bf7f0dde -> c026146a", + "4010a84e c0b32053 bf2c2615 4126b0d4 c11c3bda 40dcc69b -> c11c3bda", + "c14780a5 407f0035 c016795c c1902b2f 3e173218 40a332d1 -> 3e173200", + "41822d47 408c138c 3fb69f06 419bc18d 4004a6f1 3e91e980 -> 419bc18d", + "c15e80c3 c03829e0 c0f76bee c1918e7f c002b79b bed09849 -> c002b798", + "41269a93 c0bc1cb5 410dd57b 4086f125 beb71310 40e86c88 -> beb71310", + "c15807a1 40c7c762 c0ed6158 40e82428 41389df6 40ad924c -> 41389df6", + "412f9052 c0857bf0 41128ba4 c0381c20 3ec2598a be732df9 -> 3ec25988", + "4197329e c06681f4 41102904 41500d61 4046a0d3 bf36f9bb -> 4046a0d4", + "be8d31a1 3e9e5dc6 c11e942e c1286af1 c050b597 bf0291b7 -> c127518e", + "c14598b4 c0d7fcfd c0c74c64 40c2ae70 411516df bf3c44d5 -> 40c2ae70", + "c14059fc c0e0e3a0 410f1549 c18d737e c15c5e14 40d195be -> c18d737e", + "3fdc48f8 c0cd9bb9 407c90d4 415e480e c184096c be04f454 -> c14e82ae", + "41905bf0 c017ede6 c044c9f9 40dd5efd c19a959c 40883fea -> 40dd5efd", + "403be0cb 40b27b32 40884449 408602e0 c0c7b76a 3df0869b -> c0c7b76a", + "bfb92731 4101a00a c0c0648e 414c0276 c08c7e3d bf739553 -> be2da980", + "415d8455 c081ece8 c0d6a6bf c19404e1 40ee67f5 401620fa -> c19404e1", + "c1632c4a c02e6c15 409650e9 4183c15f c183841a 40dc3d5e -> 4183c15f", + "c1071eed c0fd1a5d 407a70b9 c13ea40b c0cd33d3 3f5b5567 -> c13ea40b", + "c117eabc 410b23d1 4109bdb5 414d47e9 c175bdb8 40b98ef4 -> c175bdb7", + "4137d89a c0617bd9 c08dcec4 c0a68df5 c161d257 404a83f5 -> c0a68df5", + "c0ac112a 410432e7 3fa63330 c0c44887 415638d9 40cf4f5d -> 415638d8", + "409e5622 c0862d0b 3fb4519c 3c632342 c11f6c1c 40f3a0ed -> c11f6c1c", + "4125dda6 c0f9a2d6 40a5c743 40df3af1 c16c489a 40b58052 -> c16c489a", + "c19a13a3 c11985b0 c027bdb5 c126b1ef c19be56e 4053b0ea -> c126b1ef", + "c0495f16 c112a9e3 c0bb917f c008d73e 411149ed 4041a8b4 -> 411149ec", + "40d7bebb 40eca274 3d3b48bf 418039f4 409787b4 3e5bff71 -> 417c6dd6", + "3f06c77b bfadbf5e 40df4318 c1708d61 419ae586 40d40a40 -> c128e834", + "c09dada5 c0061b36 c116e862 bffb37a7 c0f26ec5 40c9d855 -> c074e237", + "c0eb5767 c0d1c5e4 406cc932 413c70f2 40b9f066 403d8988 -> 413c70f2", + "4129331e c076023f 4033e30e bf80394d 4134a29c 40e340e1 -> 4134a29c", + "4186f2f6 c11d6a49 40dc4749 c1855078 c18e1d09 403d52f7 -> c18e1d09", + "c0d5c772 40220aca 4115aea6 c1424647 413879ac 405e2652 -> c1424647", + "41248b18 405f2aa6 40f60ed4 c0897adb 3e4549a1 40d7e546 -> 3e4549a0", + "4124cc2b 41051ab2 c10b3030 c0c0280b c06cfcec 3f0b51d1 -> c0c0280b", + "c173e952 c0fe1e80 3ed26398 c17786c8 c1983bbd bf1385be -> c17786c8", + "c090caec 406b7dbb bfe80858 412cd02a c109c949 3fe6e6a4 -> c109c94a", + "41054dae be32f259 41195d35 411ac397 416921d0 bec108e6 -> 416595a4", + "40fcd430 bf404fc9 c117af0d c1093a6b 4196a864 3eae2e62 -> c1093a6b", + "c17b71f3 bdca4836 c0395d30 4007cc25 41249710 40ac9f7d -> 41249710", + "419a4499 40f72bec 3f4743b7 4049d630 4186d27a 40e69d7f -> 4049d630", + "419f9cfd c0d94fb2 bf8a9a19 413321a1 414a93b7 40fb2dbf -> 414a93b7", + "c1370f74 403f8998 4036f63a c12ef132 40fd0411 3eb5c1aa -> 40fd0410", + "c10564e3 c0fd667d 4109be90 c1265530 c0c15eb1 3fe35fa3 -> c1265530", + "be6267b2 41188a7e bfc0391f 414ce558 419ccfce 400575cc -> 419ac90a", + "c0bb5bd2 c11e3f16 bfd5e108 412feea8 40acc0f7 bedf606a -> 41045e5e", + "415e06e8 c0fc2ede c05cbed2 4090d760 419da163 3f902a72 -> 419da163", + "c17227a5 40b80724 c1056239 c0b8c498 40aaefca 404e8bba -> 40aaefca", + "3e9d9881 40dae5b8 c109931c c086a9dc 416f1cee 403485ce -> 404b57f8", + "c115e57c c0eb7bf3 407bd368 c00a4b6d 419ab8a8 3f9efa7e -> c00a4b6d", + "c06e00e6 409a602e 411dd12f 418cfaf7 418fe2f0 bd16bd3e -> 418cfaf7", + "c18e3c96 40e71cc0 4035b58b c0a90c8a 4112916f bdff2140 -> 4112916f", + "4126e268 befe2cf6 c0a6700f 3feeb64b c10ba8cd 4053677e -> 3feeb64b", + "c12049d2 c1038a23 c1017b5e c1885d0f c11f0abb 408892db -> c1885d0f", + "c0e9e7a2 411d27f1 3fee393d c1255ec3 40b740ff 40c56773 -> 40b740fe", + "c15ce2a4 409fee29 bf9ca17f 3f9362aa c197768e bf16e59e -> c197768e", + "c08d5b73 c0b61f00 bfd8e3f3 c199ba2b 41971154 40d79ada -> c12127df", + "c12efc84 3f7ec5de c0bf0299 412258fa c13695e6 40b46f7c -> c13695e6", + "7f61b1e6 7f61b1e6 ff61b1e6 00000000 3f800000 40800000 -> 00000000", + "7f61b1e6 ff61b1e6 7f61b1e6 00000000 3f800000 40800000 -> 3f800000", + "4109cb5c c106dcd2 c0f083bb 3f17ffe1 419d461d 40a00000 -> 419d461d", + "c161a920 c1031c9c 40498e9e c08f2c1a c11690a7 40800000 -> c08f2c1a", + "40bf329f 410ee709 40a511dc 3f9934b0 418594fd 40400000 -> 416d589e", + "40d2d558 410defb7 40d73ef1 415effc7 412729b1 40000000 -> 412729b1", + "413f59fe 40c2f7ad c0b9963e 418df2f8 40766576 3f800000 -> 418df2f8", + "bea6a59f c083b40b 3df3a697 417341f7 c0c8f1f4 00000000 -> c0b3d106", + "c0861533 40544f60 3f8cdfad c125223c 415d0dbf bf800000 -> 415d0dc0", + "401af2b3 c11d51c1 40d7c0dd c1908ed8 405fcb99 c0000000 -> be0bcb80", + "411c9bee 3f612cc9 c106ed43 40b8b4ac 41832c78 40b3291f -> 40b8b4ac", + "c02fd332 c0c92fd8 c0d8b4cd 408a5dac 40190c69 3fd75cf0 -> 408a5dac", + "c092ab40 40fc6639 bfcda982 c0d0e479 4107aa86 401338db -> 4107aa86", + "c199ac1c 411a64aa 40f1a477 c1530825 413ba6d2 4002b61a -> 413ba6d3", + "4199ab11 3f3fcf94 c0b0b9e1 3fba7fed c165371a 40998ea8 -> 3fba7fed", + "c101ccd4 40ec2892 40db2669 c070c4e8 c1456f8c 400ab114 -> c1456f8c", + "c19e3852 c099cf29 c11acc7f c1845f6f 41247653 3fcdceca -> 41247652", + "40900b80 401b3f79 c0b23b8c c121f5a2 c13bc426 bee89d5c -> c121f5a2", + "c11b0290 c0ae8364 c0ae8364 c10f864d c12c42de 40ed418c -> 00000000", + "c184c222 c0b2959c c0b2959c 41890e89 417b03ba 4014730f -> 00000000", + "40f0cb6a c0835505 c0835505 408d5808 c18394e5 3f833b5e -> 00000000", + "41236564 409aebca 409aebca c08cd510 40c19535 40d1e8e9 -> 00000000", + "3fcdd5ed 40121319 40121319 c18ce964 bfb2cddb 4087ae3a -> 00000000", + "4170db61 40ab054b 40ab054b 40a13160 413846f6 408ddf42 -> 00000000", + "c18adbd8 bfdf3297 bfdf3297 bf7dd069 c15956ef 4051a02b -> 00000000", + "c0b48457 40934faf 40934faf 40908d6a 413428da 40b9229e -> 00000000" + ] + }, + { + "function": "cycles_map_range_smoothstep", + "node": "ShaderNodeMapRange SMOOTHSTEP with Clamp", + "then": "cycles_clamp_range(result, to_min, to_max)", + "cases": [ + "00000000 00000000 00000000 c0ee234b c153002b 40c9bb68 -> c0ee234b", + "00000000 00000000 3f800000 bf9b62ec c0aecf4b 405bf568 -> bf9b62ec", + "00000000 00000000 bf800000 404ce478 3ef3fec7 408d00da -> 404ce478", + "00000000 00000000 3f000000 c18114ed 3fd29165 408efedd -> c18114ed", + "00000000 00000000 bf000000 c18b515d c19f785b 4047f103 -> c18b515d", + "00000000 3f800000 00000000 41821f1e 3f626bfb 40685f11 -> 3f626c00", + "00000000 3f800000 3f800000 41870db5 c0ce812e 40ff4dfd -> 00000000", + "00000000 3f800000 bf800000 41571fe1 411570fc 400cd371 -> 4136486e", + "00000000 3f800000 3f000000 3eef5461 40bb5d89 40b1421b -> 40bb5d89", + "00000000 3f800000 bf000000 40459aef 418fe4ba 40913dff -> 4161fbb6", + "00000000 bf800000 00000000 c0ea3202 c0cb08fe 4041e6bd -> c0cb08fe", + "00000000 bf800000 3f800000 c12f2de1 40ad8fd6 40d40a69 -> c030cbec", + "00000000 bf800000 bf800000 41241e0c 3ffa19a9 3f9a8952 -> 3ffa19a9", + "00000000 bf800000 3f000000 41769e16 40620d1e 40ad8b88 -> 40d39932", + "00000000 bf800000 bf000000 3fa916a4 40df8422 40ecdee1 -> 40df8422", + "00000000 3f000000 00000000 410cd732 4102bde5 3ffb9e6c -> 4102bde5", + "00000000 3f000000 3f800000 401e6dfd 40d3bf94 406da4d5 -> 401e6dfd", + "00000000 3f000000 bf800000 3f11e893 4199da1b 40ea9124 -> 40ad0f6a", + "00000000 3f000000 3f000000 411cb8d0 c0803a9c be7f2dd4 -> 00000000", + "00000000 3f000000 bf000000 c02f4f72 c0bcfe88 40bbdbe5 -> c08a5320", + "00000000 bf000000 00000000 c19a3edf 40d4838f 400b96f4 -> 40d4838f", + "00000000 bf000000 3f800000 be81f1e5 4100200b 3c14d6de -> 3ff1ad5f", + "00000000 bf000000 bf800000 415c14cf 3f09aa98 bf677a02 -> 415c14cf", + "00000000 bf000000 3f000000 c18b2c3e 413e593f 404c572a -> c02ffe78", + "00000000 bf000000 bf000000 c18cdfbd 414d58bc bea711d6 -> 00000000", + "3f800000 00000000 00000000 c17108e4 40ef862f 40d6cb0d -> 00000000", + "3f800000 00000000 3f800000 c14ab45d 418d5837 40b19a88 -> 418d5837", + "3f800000 00000000 bf800000 3fb87099 c1095087 400b9c27 -> 3fb87099", + "3f800000 00000000 3f000000 414f2236 c0a7f600 40b41ae9 -> c0a7f600", + "3f800000 00000000 bf000000 41972c61 bf4ea154 40aa67ec -> 41972c61", + "3f800000 3f800000 00000000 412f6835 40e777eb 3fdc2805 -> 412f6835", + "3f800000 3f800000 3f800000 bfa9bd2a c18263c5 3e682b1b -> bfa9bd2a", + "3f800000 3f800000 bf800000 c1615d59 4045fa8c 3ff265c7 -> c1615d59", + "3f800000 3f800000 3f000000 41427d5d c0e611f4 40d52658 -> 41427d5d", + "3f800000 3f800000 bf000000 c15fb0c3 4116ac78 402ad2ff -> c15fb0c3", + "3f800000 bf800000 00000000 c11f1524 c167a28c 40b834a1 -> c167a28c", + "3f800000 bf800000 3f800000 3f76f984 c039f2d0 400deaf3 -> c039f2d0", + "3f800000 bf800000 bf800000 c14b9afb bea58e3c 40c9417c -> bea58e3c", + "3f800000 bf800000 3f000000 40d1f06b c1535e20 3f942f3c -> c1535e20", + "3f800000 bf800000 bf000000 c1037ce4 c1882de4 3f96575a -> c1882de4", + "3f800000 3f000000 00000000 c06c8b52 c19841fc 40a61056 -> c06c8b52", + "3f800000 3f000000 3f800000 40eefdbb 40723777 bf56a5c7 -> 40723777", + "3f800000 3f000000 bf800000 418a4954 c10794d7 408de707 -> 418a4954", + "3f800000 3f000000 3f000000 c15ad87d 40287261 409d8a56 -> 00000000", + "3f800000 3f000000 bf000000 40445f53 c0cd4b4c 40297d6c -> 40445f53", + "3f800000 bf000000 00000000 c183a547 406bcbdd bf0bb516 -> 406bcbdd", + "3f800000 bf000000 3f800000 408f04fe 41378753 3fe2708a -> 41378753", + "3f800000 bf000000 bf800000 409cc9d6 3f384e1d 40a080e0 -> 409cc9d6", + "3f800000 bf000000 3f000000 40b80f53 4189ae3f 3f70f250 -> 4189ae3f", + "3f800000 bf000000 bf000000 c0ddd32f 41848ee4 40b86eae -> 00000000", + "bf800000 00000000 00000000 40011529 407e5b68 40251372 -> 40011529", + "bf800000 00000000 3f800000 c030df56 41598429 3e6feab3 -> c030df56", + "bf800000 00000000 bf800000 c19f25fd 40d020a5 3fa6d0ae -> 40d020a4", + "bf800000 00000000 3f000000 41181d4d 40c65b57 40c9c5c6 -> 41181d4d", + "bf800000 00000000 bf000000 c0929b66 41058c76 40f464e6 -> 41058c76", + "bf800000 3f800000 00000000 3fc0e1fb c06efeda 3f8b9a3a -> c06efeda", + "bf800000 3f800000 3f800000 3eafd4df c183c6c8 407a1a50 -> 00000000", + "bf800000 3f800000 bf800000 c14d7b3e 41802dc0 406b6902 -> 41802dc0", + "bf800000 3f800000 3f000000 c0b2f591 410d25d7 3f5debc6 -> 410d25d7", + "bf800000 3f800000 bf000000 418340f1 412231a3 40828ff4 -> 412231a3", + "bf800000 bf800000 00000000 c16d7b71 418e3ecd 40dffe11 -> c16d7b71", + "bf800000 bf800000 3f800000 c18de77c c0bb85a0 402566de -> c18de77c", + "bf800000 bf800000 bf800000 41074f79 c16283e4 3fefeb08 -> 00000000", + "bf800000 bf800000 3f000000 3fd5fdf0 40eb72cb 3f966efb -> 3fd5fdf0", + "bf800000 bf800000 bf000000 4103e42b c0001989 40d8d644 -> 4103e42b", + "bf800000 3f000000 00000000 c14e625c 40d4c94d 408a9354 -> 40d4c94c", + "bf800000 3f000000 3f800000 419a4855 401f79b7 40199e3b -> 419a4855", + "bf800000 3f000000 bf800000 c0d5e4d1 c0293f82 3edb71ef -> c0293f82", + "bf800000 3f000000 3f000000 41780a8a c18eab55 40b97217 -> 00000000", + "bf800000 3f000000 bf000000 41704621 4102fdc4 bf113c1c -> 4102fdc4", + "bf800000 bf000000 00000000 c1173ab5 403b5e7a 40bf055e -> c1173ab5", + "bf800000 bf000000 3f800000 beaa1aac 41986421 3f98574a -> beaa1aac", + "bf800000 bf000000 bf800000 c0dbd367 c0fa7a4e 4042b7fe -> c0fa7a4e", + "bf800000 bf000000 3f000000 c12d48b0 bd4b4eb6 4001a2d2 -> c12d48b0", + "bf800000 bf000000 bf000000 bfc9828c 3fe24841 40a15120 -> 00000000", + "3f000000 00000000 00000000 c1992a93 c107642c 40aad0f3 -> c107642c", + "3f000000 00000000 3f800000 c0f5faad 40b29256 408ed63d -> bf86d0ac", + "3f000000 00000000 bf800000 415e989d c0f03161 40d3e5f9 -> 415e989d", + "3f000000 00000000 3f000000 bfa816ad 417b6d64 3fbed0a1 -> 417b6d64", + "3f000000 00000000 bf000000 c193f371 3fffd39f 4072bb35 -> c193f371", + "3f000000 3f800000 00000000 416b6704 4180fe51 40ed9a61 -> 4176b1d3", + "3f000000 3f800000 3f800000 c167a66a c065651e 3d378a73 -> c065651e", + "3f000000 3f800000 bf800000 c07f58a3 418af85b 40f503b3 -> bf26f160", + "3f000000 3f800000 3f000000 c0114b53 410653c6 bf6d4e89 -> 410653c6", + "3f000000 3f800000 bf000000 c0e25ccd 40185ec6 408d0bbe -> c093ec9c", + "3f000000 bf800000 00000000 c11846af 404b3958 3dd6d82a -> 404b3958", + "3f000000 bf800000 3f800000 419f23c3 c199ebd5 3fdce736 -> c15202ca", + "3f000000 bf800000 bf800000 c1905642 4165c743 40b901bd -> 00000000", + "3f000000 bf800000 3f000000 40db5993 4189365e 40604155 -> 4189365e", + "3f000000 bf800000 bf000000 4163f98c 3ff7ca48 40e58183 -> 3ff7ca48", + "3f000000 3f000000 00000000 c16ca5d4 3fddfabe 4090f818 -> c16ca5d4", + "3f000000 3f000000 3f800000 c0d948d2 3e9d5d5c 40d34d39 -> c0d948d2", + "3f000000 3f000000 bf800000 41112131 c1494d75 40d0ccef -> 41112131", + "3f000000 3f000000 3f000000 40eb0f95 40fe92cb 400267f7 -> 40eb0f95", + "3f000000 3f000000 bf000000 c16694d7 c1987c8c 40e76bd3 -> c16694d7", + "3f000000 bf000000 00000000 4055464e 4097059d bf707729 -> 4097059d", + "3f000000 bf000000 3f800000 c14d6c57 c1833ea1 3f09ab9d -> c177b1c3", + "3f000000 bf000000 bf800000 418c6c92 411b9d5d 40eee7f0 -> 418c6c92", + "3f000000 bf000000 3f000000 412fb8a5 c161594e 4085f1f6 -> c161594e", + "3f000000 bf000000 bf000000 c1843e9c c0c93618 40d5c22f -> c0c93618", + "bf000000 00000000 00000000 c1205885 bf1647bd 40b2b515 -> bf1647bd", + "bf000000 00000000 3f800000 c116b21e 4134ac4c bf7961ed -> c116b21e", + "bf000000 00000000 bf800000 40f5b68a c023e9ed 3f62765f -> 4023c194", + "bf000000 00000000 3f000000 c197c0a0 40a9113d 40b6eecc -> c197c0a0", + "bf000000 00000000 bf000000 40ac05e5 40fad094 40011f55 -> 40fad094", + "bf000000 3f800000 00000000 c14c5dd3 41924e10 3fb1d23e -> 41924e10", + "bf000000 3f800000 3f800000 c06296cb c14bf496 4076c551 -> c06296cb", + "bf000000 3f800000 bf800000 c0d45028 c10b6f6f 40879d08 -> c1063c49", + "bf000000 3f800000 3f000000 bf2127e4 c10e02fe 404d63a3 -> c10e02fe", + "bf000000 3f800000 bf000000 c16e448d c161c41a beefda5f -> c161c41a", + "bf000000 bf800000 00000000 419095a7 4133031a 3d0b575c -> 416a1734", + "bf000000 bf800000 3f800000 419855ad c179ce17 40434fc9 -> 415a0860", + "bf000000 bf800000 bf800000 c1570a22 c14562de 3d0f1e50 -> c14562de", + "bf000000 bf800000 3f000000 c10c500f c1797ce4 40872303 -> c1289e0e", + "bf000000 bf800000 bf000000 c18c9ca7 41211186 bef2f46d -> 41211186", + "bf000000 3f000000 00000000 c169a0e9 4183f38c 3ea9e322 -> 4183f38c", + "bf000000 3f000000 3f800000 4167fdf4 c0396369 409b6fb5 -> 4167fdf4", + "bf000000 3f000000 bf800000 41386839 c09cb0e8 4044ac4a -> bf239750", + "bf000000 3f000000 3f000000 c1723490 40fb2760 3f1262fb -> 00000000", + "bf000000 3f000000 bf000000 c19c5e6e 4106d9c8 40f45fc8 -> 4106d9c8", + "bf000000 bf000000 00000000 c188c6bc c10096c1 403319c2 -> c188c6bc", + "bf000000 bf000000 3f800000 c0505789 3f16f15b 40da751a -> c0505789", + "bf000000 bf000000 bf800000 c03bb145 c16f2a37 408f2089 -> c03bb145", + "bf000000 bf000000 3f000000 414760cc 40818b51 40b9ebef -> 414760cc", + "bf000000 bf000000 bf000000 416b5188 415b9e63 40b51bb5 -> 415b9e63", + "40000000 00000000 00000000 c1811c6c c1991040 bf04293e -> c1811c6c", + "40000000 00000000 3f800000 c11aad31 bfefdc36 40b785f2 -> bfefdc38", + "40000000 00000000 bf800000 c16aa9bf 40e847ba 40d031f5 -> c16aa9bf", + "40000000 00000000 3f000000 c1583587 411485b1 40efa722 -> 411485b1", + "40000000 00000000 bf000000 c0972b48 3ec3e415 40da5805 -> c0972b48", + "40000000 3f800000 00000000 40d9514c 4183bcb4 40dab8e6 -> 40d9514c", + "40000000 3f800000 3f800000 4139ca5f 408c2c12 40ebdd9a -> 408c2c12", + "40000000 3f800000 bf800000 c0b8c763 412dc9eb 40fbc92b -> c0b8c763", + "40000000 3f800000 3f000000 c0fb0e6d 419fe1f2 3f7fca1e -> c0fb0e6d", + "40000000 3f800000 bf000000 4125fe72 c10b91d2 3f48fb1b -> 4125fe72", + "40000000 bf800000 00000000 c181635d c18217ca 4039d2ca -> c18217ca", + "40000000 bf800000 3f800000 419d3ef9 c0d18062 4071ae2c -> c0d18062", + "40000000 bf800000 bf800000 4111b2f5 412f0e99 4042fdd5 -> 4111b2f5", + "40000000 bf800000 3f000000 3f90cd54 416f6269 40c97a36 -> 416f6268", + "40000000 bf800000 bf000000 c13ff147 41233fc3 3fc1f7bd -> 41233fc3", + "40000000 3f000000 00000000 c07dc551 c135fe01 401d3eb5 -> c07dc551", + "40000000 3f000000 3f800000 405e7b77 418045b5 40891da2 -> 418045b5", + "40000000 3f000000 bf800000 41816750 4197a7e3 40c566a1 -> 41816750", + "40000000 3f000000 3f000000 c15b64b1 c165e42c 400b4252 -> c15b64b1", + "40000000 3f000000 bf000000 c19e0b3e 41052c89 bdc80a10 -> c19e0b3e", + "40000000 bf000000 00000000 41110e7e 40f32fd2 40cd844a -> 40f32fd2", + "40000000 bf000000 3f800000 c1612ac7 3cd6d230 40c5c1e9 -> 3cd6d200", + "40000000 bf000000 bf800000 4189ca6b c12819d8 4006b4a0 -> 4189ca6b", + "40000000 bf000000 3f000000 c1685d5e c0982334 3fa64937 -> c0982334", + "40000000 bf000000 bf000000 bd4a2551 c10e42f7 40dd8518 -> bd4a2551", + "c0000000 00000000 00000000 41665cf4 4124f3f2 40c2952b -> 4124f3f2", + "c0000000 00000000 3f800000 418f2e31 c190b9aa 40df3afc -> 418f2e31", + "c0000000 00000000 bf800000 c011286f 4103e0b2 408b8617 -> 4103e0b2", + "c0000000 00000000 3f000000 c0bf1636 c153dc35 408f3f7e -> c0bf1636", + "c0000000 00000000 bf000000 c0b0efad 4106ccc0 40e3c6d2 -> 4106ccc0", + "c0000000 3f800000 00000000 bff19767 40664df0 409a045f -> 40664df0", + "c0000000 3f800000 3f800000 41470b95 418b7434 40434365 -> 41470b95", + "c0000000 3f800000 bf800000 4167b5f0 418bc354 4091ad34 -> 418bc354", + "c0000000 3f800000 3f000000 3f435c6f c190fbfc bf339684 -> c190fbfc", + "c0000000 3f800000 bf000000 c007b407 418ebde6 40f20ce4 -> 418ebde6", + "c0000000 bf800000 00000000 3ec27fbe 414acf73 3fdfe667 -> 3ec27fbe", + "c0000000 bf800000 3f800000 416853cd c182d7d7 408b03ec -> 416853cd", + "c0000000 bf800000 bf800000 411b00f3 3f4b4040 4069b780 -> 3f4b4040", + "c0000000 bf800000 3f000000 40e084bd 4011f876 bf1a07eb -> 40e084bd", + "c0000000 bf800000 bf000000 c14f1ca2 bfeed236 bf74753c -> c14f1ca2", + "c0000000 3f000000 00000000 c12a9637 c14df3f2 3fc3979f -> c14df3f2", + "c0000000 3f000000 3f800000 41401a93 3f5e38ff 40e1144c -> 41401a93", + "c0000000 3f000000 bf800000 c00aa939 4063de67 40b2571d -> 4063de67", + "c0000000 3f000000 3f000000 c077c278 c11c099b 400bb592 -> c077c278", + "c0000000 3f000000 bf000000 4046c94f c00d45ad 40fc3608 -> c00d45ad", + "c0000000 bf000000 00000000 4094e016 c176e7ab 40e4f3f3 -> 4094e016", + "c0000000 bf000000 3f800000 414cf126 c13f861e 40cbb696 -> 414cf126", + "c0000000 bf000000 bf800000 409630b7 41392784 4074d2c1 -> 41392784", + "c0000000 bf000000 3f000000 3fdf0ea0 419e4e16 40cdf0f6 -> 3fdf0ea0", + "c0000000 bf000000 bf000000 c104d55a c1915e32 402d6324 -> c104d55a", + "40400000 00000000 00000000 c099ebff 404f46de 4036f67b -> 00000000", + "40400000 00000000 3f800000 c070f1b4 c19f79e1 3f2a1f24 -> c19f79e0", + "40400000 00000000 bf800000 40cd240a c0779c87 40d7ca1e -> 40cd240a", + "40400000 00000000 3f000000 c19843bf c09c3b6e 40abe3e0 -> c09c3b6e", + "40400000 00000000 bf000000 412ac087 bf9bf3ba be576858 -> 412ac087", + "40400000 3f800000 00000000 c093f02b c1167809 40f4a5ba -> c093f02b", + "40400000 3f800000 3f800000 c10ddff7 c18331f9 3eef1c3c -> c10ddff7", + "40400000 3f800000 bf800000 c185cde3 418d5a07 40fa6093 -> c185cde3", + "40400000 3f800000 3f000000 c194de58 c1168ec4 403f6583 -> c194de58", + "40400000 3f800000 bf000000 41784049 c198fa99 407dc536 -> 41784049", + "40400000 bf800000 00000000 4036c4f8 414812e0 40b1090b -> 414812e0", + "40400000 bf800000 3f800000 c095a4a9 c15a5b95 3fa14780 -> c15a5b94", + "40400000 bf800000 bf800000 c12f929a bf8b6f49 405bb855 -> bf8b6f49", + "40400000 bf800000 3f000000 4170e90c 414c27ce bf54f56f -> 414c27ce", + "40400000 bf800000 bf000000 41281ab2 4086a4dc 40a96d48 -> 4086a4dc", + "40400000 3f000000 00000000 c1888851 417bc028 40974d78 -> c1888851", + "40400000 3f000000 3f800000 4112e7b4 41973052 401fbe1f -> 41973052", + "40400000 3f000000 bf800000 c04c0e41 c0f8b259 bddb6452 -> c04c0e41", + "40400000 3f000000 3f000000 c0460dd7 c15baaf1 40bb8199 -> c0460dd7", + "40400000 3f000000 bf000000 40c7222b 3ffd45c1 4062270c -> 40c7222b", + "40400000 bf000000 00000000 c0b4199d c157f281 406244a9 -> c157f281", + "40400000 bf000000 3f800000 c15b3a0f c0e9253c 40d4b0f8 -> c0e9253c", + "40400000 bf000000 bf800000 417bd2e8 bfaaf505 4066f6b1 -> 417bd2e8", + "40400000 bf000000 3f000000 417633fd 415b6759 3ec39efc -> 415b6759", + "40400000 bf000000 bf000000 413a7b8f 418aad65 40b7f264 -> 413a7b8f", + "c0300000 00000000 00000000 c10e2ddc c008cefb 4099b1c3 -> c008cefb", + "c0300000 00000000 3f800000 3ffe9828 c1392717 40eb8182 -> 3ffe9828", + "c0300000 00000000 bf800000 4080eaf3 4107bd5c 40e1b672 -> 4107bd5c", + "c0300000 00000000 3f000000 c076776d c078ab2d 4096d7c4 -> c076776d", + "c0300000 00000000 bf000000 c0e00d4b c1244082 3fc010b5 -> c1244082", + "c0300000 3f800000 00000000 c185df06 c19336f0 403fc16c -> c19336f0", + "c0300000 3f800000 3f800000 412b4115 c1805dee 3f64a1a4 -> 00000000", + "c0300000 3f800000 bf800000 412643bb c1087295 3f92980f -> c1087295", + "c0300000 3f800000 3f000000 40ce327f 40b07b53 3e9a7d3e -> 40b07b53", + "c0300000 3f800000 bf000000 41092e78 405d3de7 40a928c2 -> 405d3de8", + "c0300000 bf800000 00000000 416b91ed 401dee98 3fdebc31 -> 416b91ed", + "c0300000 bf800000 3f800000 418200dd c143b541 40d59c04 -> 418200dd", + "c0300000 bf800000 bf800000 4198b7e4 4199d163 400ca022 -> 4198b7e4", + "c0300000 bf800000 3f000000 c16b5361 40d062d2 3ff97081 -> c16b5361", + "c0300000 bf800000 bf000000 c135c8e3 c120075e 3fa07c5e -> c135c8e3", + "c0300000 3f000000 00000000 c0afe6d8 4134543d 40f091df -> 4134543c", + "c0300000 3f000000 3f800000 c0c8eff7 c144739f 40ba903c -> c0c8eff7", + "c0300000 3f000000 bf800000 c19053b3 c13f2837 3fd00652 -> c13f2837", + "c0300000 3f000000 3f000000 c11ffbe7 c13f40fc bed93667 -> c11ffbe7", + "c0300000 3f000000 bf000000 4146d401 415688a8 402b0e81 -> 415688a8", + "c0300000 bf000000 00000000 c13cfba6 c08e4845 be04ca22 -> c13cfba6", + "c0300000 bf000000 3f800000 40609611 c11072df 40b9d9f6 -> 40609611", + "c0300000 bf000000 bf800000 c10171d9 c0e6eb81 40060d44 -> c0e6eb81", + "c0300000 bf000000 3f000000 41910954 413dccc3 40bb953a -> 41910954", + "c0300000 bf000000 bf000000 41710982 c15dbd9a 409a3836 -> 00000000", + "3dcccccd 00000000 00000000 418b19e6 40906192 4061cd83 -> 40906192", + "3dcccccd 00000000 3f800000 40743565 40c7ea7c 40c99ec6 -> 407890e7", + "3dcccccd 00000000 bf800000 c15f90ea c0eddfa4 401f6613 -> c15f90ea", + "3dcccccd 00000000 3f000000 40ee60f8 c167358b 40b47ee0 -> 40a57ef2", + "3dcccccd 00000000 bf000000 c15f9dfc 41746e02 40c1c311 -> c15f9dfc", + "3dcccccd 3f800000 00000000 4143a55d 407c1bbd 3f108b30 -> 40857b18", + "3dcccccd 3f800000 3f800000 40ec0d81 41278ddf bd913ac8 -> 40ec0d81", + "3dcccccd 3f800000 bf800000 419b4bd4 bfb4c149 bf5f5493 -> 4128e79c", + "3dcccccd 3f800000 3f000000 c0d70e21 c11a697d 40ff2079 -> c11a697d", + "3dcccccd 3f800000 bf000000 3fff381a 41379ea3 40e0bac7 -> 41023717", + "3dcccccd bf800000 00000000 c143f45c c051619e 40d7a274 -> c05161a0", + "3dcccccd bf800000 3f800000 41299c19 416b77d9 40acc310 -> 414f763d", + "3dcccccd bf800000 bf800000 4118ba9e c11426ed 40d56a9e -> 00000000", + "3dcccccd bf800000 3f000000 418d02f6 418055f9 be907a5e -> 41828f2b", + "3dcccccd bf800000 bf000000 4199189e c0ba76a8 40965677 -> c0ba76a8", + "3dcccccd 3f000000 00000000 c106a459 3fd5d36f bf23e1e1 -> 3f1f21c0", + "3dcccccd 3f000000 3f800000 c07734f7 c186f9e2 40e1054f -> c07734f7", + "3dcccccd 3f000000 bf800000 419b6953 410d6373 3e548f84 -> 418c8d29", + "3dcccccd 3f000000 3f000000 414ce04b 40097e76 40954857 -> 40097e76", + "3dcccccd 3f000000 bf000000 419e3e12 c13c0daf 405b0cfb -> 410ae32d", + "3dcccccd bf000000 00000000 4187f31c 418a1d88 402c30ca -> 418a1d88", + "3dcccccd bf000000 3f800000 c17c1aac 419eb335 4088716a -> c04e8e00", + "3dcccccd bf000000 bf800000 c0173274 c19d1781 40c73379 -> c0173274", + "3dcccccd bf000000 3f000000 c0c1f797 c10c7669 40bfec5b -> c0fa50de", + "3dcccccd bf000000 bf000000 c1836d0a 41941258 40b3541d -> 00000000", + "4016267e 410185cc 40fa7c71 40d6bd1b 40e69313 40c37b46 -> 40e69313", + "418bf4b3 40b04855 4113b945 c186d85c c0f817f5 be0ac3fe -> c0f817f5", + "4158f448 c112ceb5 c10fb637 40f23319 c0228561 3f905073 -> c0228561", + "3bb52142 4016e7a2 c1122a54 40dfd1c9 c0d5759a 40cfb7a7 -> 40b05d08", + "c0767b93 3e1d1b9b c0a7e70d c1107433 c1110d39 3f683c8f -> c110f3d8", + "c19bfe5c c0c4a89b 408643b1 c18e22f4 41114325 4089795c -> c18e22f4", + "4103cfa8 41110a65 40c8a59e c02d727c be285246 40c455f2 -> c00b1aa2", + "c1523117 409ee033 40adb27f 3dde34ac 41751273 40c02cdf -> 3dde34ac", + "4195ce8b 4056c8d7 40ee1df7 c13112c7 413b6247 400f6b86 -> 413b6247", + "416c8d94 c108ce06 410587ff 40cf9e23 416ddd8d 4091f973 -> 416ddd8d", + "c11c1792 c105a2a6 4115b891 c0e4e9d3 c111cce6 40850099 -> c0e4e9d3", + "bfc5b98b 409d8142 40123355 41958baa 407e2ddd 3f91dc7d -> 407e2ddd", + "413d2558 bfb90fff c0a3d316 c15d47a3 415ff4b3 4021e36d -> c15d47a3", + "c196b6fb c0f0beb5 c06f3a0f c14f9eda 417436f2 bea30613 -> c14f9eda", + "4163da24 405370ee 40ae5498 410094dd bfe43311 409fcb93 -> bfe43310", + "c19c0e81 40d57635 c0f3e009 c1377f45 c07c32e1 40a86c5f -> c07c32e1", + "41908bfc bf5b6225 c11b2a0b c0b49609 c112264d 4065b31b -> c0b49609", + "40ebb12d 411fda76 40ce1d2d 40e033f3 c1816dfd 40a0aec3 -> c14480a2", + "bf7405d0 c081e72c c04a290c c14b8bd8 413679e9 4026f353 -> 413679e8", + "4191499b bfaa6ef2 c0ebe29d 417f333f 3fb37b25 40fa3cf6 -> 417f333f", + "3f22c47a 40800120 403bb317 c0c2f445 419c01e6 404cd473 -> 419c01e6", + "4128606b c0912944 c07d4495 41841272 4155d4b8 40b02cbc -> 4155d4b8", + "416e68fc 40adc96b 4087c0df 417c8480 c19c589b 4097b35b -> 417c8480", + "4150616a 3fd01c68 411657a3 c089f323 419ce0db 40caec63 -> 419ce0db", + "4068efb0 40d6633d beca4ac3 c134c594 c0af19f0 40164710 -> c10fb4e1", + "bdbb2719 3f87b28f 409e1ab6 c15f99c2 419eca58 4021e74e -> c15f99c2", + "418ea3f6 c100b72d 40b3fd58 c18ea96c c11e26b8 402bcdd7 -> c11e26b8", + "4130f426 c1193fef 40b565df 414f8599 c0ad6a93 3fca1d92 -> c0ad6a92", + "c01bac61 40116795 409febb1 40ea4ab3 c09ef83e 3fe80791 -> 40ea4ab3", + "c0dc9bfb 405ed7ba 40a0e226 c12d8b6f c125bb14 4055e7bd -> c12d8b6f", + "c1407ce5 c011691e 4094529c 41232468 40db8b7a 3f2282df -> 41232468", + "c19be722 c001fa5c 40e5f55e c00a29dc 40a6cf3c 401f2efc -> c00a29dc", + "c140b1a3 40dc5413 c08824c0 407f18e7 c150f904 40c14b69 -> c150f904", + "410bf35d c0857c16 3f2907ce 40e00c3b c18858a7 406096f6 -> c18858a7", + "3f5228c8 c09515db 409ca865 c0dca1db c00ce307 bdd06087 -> c0811726", + "3d845ef2 409ca57e 3f3992a2 40a3f5ee 4148a53c 40292e5b -> 4148a53c", + "4177fd20 c01748eb c00129e1 c16a0edd 40c30dd9 3f8677ef -> 40c30dd9", + "41980c5b c0352875 40544ebd 40e0f274 40c56e4b 409b543b -> 40c56e4b", + "c169e3c7 40fabe89 c1027779 40b030f1 c12a3565 bf5654de -> c12a3565", + "4181ae23 c0cc5e5f 403da4b8 c14ed13d 419f39af 3f2976c4 -> 419f39af", + "be4a6660 40fd9174 40da34d9 40c803c4 c13358c8 3f8b69de -> c13358c8", + "c0cfd062 3d7b3aaf c00fdac5 c16a35c3 419a602d 3e59c3fb -> 419a602c", + "c03e6917 c0204e1b c09e9754 3e944cbf c153eb8f 40efbd6c -> bf81d72e", + "c140ea97 c0b99c0a 4027c823 c17dbba7 4133ad88 40f8ad47 -> c17dbba7", + "4117c120 c0fe0964 c0cc6358 418cf26a c136f1a2 40285ef8 -> c136f1a2", + "419bd5dc 411f873d c0020384 bfb7b5ef c1273497 40f70b14 -> bfb7b5ef", + "40ab6353 c0e0e599 bf1b8fdc 40a0258a 3fde3536 3fe78388 -> 3fde3536", + "c19bd4a8 bff96fe2 c1070147 416769c0 4114a7a7 40807be2 -> 4114a7a7", + "41611a43 40131101 4002dfdb 41323a61 c13b442e 3fb22043 -> 41323a61", + "4197273e c0411c27 bfcfffb1 4151e80f c1862318 3face61e -> c1862318", + "c1771bd4 c01a3ecd 3f80edfc 410ec7db c174e5f8 3fa30644 -> 410ec7db", + "c0e35309 c10914a9 c0b29362 41009faf 418928ac 4072834e -> 41474929", + "c148d126 4091cbaf 3ff9dffc c15442bc 4141e06b 3fc74473 -> 4141e06b", + "419e5353 c09c0f7d 4119066c c03441f5 c01b132a 40d84805 -> c01b132a", + "c0bd7d59 c116dff0 c0e3283a c0b8321a c119d2e0 bf784e2a -> c119d2e0", + "c07da8b6 410365d2 c0c9cb5e 418456e4 c151a6e4 40cb7ba0 -> c1309690", + "4065ff2e c112d2d2 40aea1ae c164d9d1 c196bcf6 40c578c7 -> c1951f19", + "4106fe30 c0f16a91 40d03728 406382a6 c1836890 3fdc0c1b -> c1836890", + "bf9dc410 3ec0923f 40be5f03 bfc170a5 c097bed2 beb40e34 -> bfc170a5", + "4108286a 40c64c63 409e6033 c13cc21f 40c84c10 40bfc779 -> c13cc21f", + "c08a326f 40f710e1 bfc6a979 41095043 41772b2a 4030f593 -> 41772b2a", + "c09bb89b c0ce3c59 c0b0b68a c1980978 c1840b1b bf506a69 -> c1840b1b", + "416dd3c9 c1019c89 40df93f3 402808b6 419dea9d 3f600c57 -> 419dea9d", + "c0a6a1da c09b457d c0dfa56b c06cd9a8 416a7c76 40425bc6 -> c016542d", + "c18fcf78 40bdd7e4 40cd00f4 c1156054 c19da431 408ee6e6 -> c1156054", + "418400e3 404d01bf c0de1e5f c186467a bf353156 3f393fe9 -> c186467a", + "c1584f61 c0c698bc 40e32bc9 c10c21c3 be4125aa bf266a51 -> c10c21c3", + "c18fcfee c0fb4781 3f8f6b55 406716aa c1429ad1 3fbbc206 -> 406716aa", + "c194a7d3 c08df220 400a00df 41625c0c 413eada0 4098472a -> 41625c0c", + "c095d246 3dc8cbae 410fa4d3 41335078 c04616ba 40a3529a -> 41335078", + "c15b3e55 c1142380 4027ace0 c0c8b894 c036ead5 40e3beb0 -> c0c8b894", + "40bfeadf c0ee8b40 40ea86f1 41387067 c016f17c 4021669c -> c0029cec", + "c19eacaa 4088b397 c1181b58 416bac3d c0957634 bf1bb340 -> c0957634", + "c12e3a3a c1056be6 40423c24 c08548eb c0b870e2 40957d93 -> c08548eb", + "c0aa992b c0ea0aa4 c11a2bd0 c1094b3c 4125e85f 3dcb17b2 -> c1094b3c", + "41938682 c0db9fb5 c0f33e92 c0e13d0c 41711dee 3ff3a0d9 -> c0e13d0c", + "4192266a 40860c2f c0487e4f c06bebf1 c041c408 40e846ac -> c06bebf1", + "4131ac38 c0fc3635 405e2dcb bdc4ebfb c0691208 3f724527 -> c0691208", + "c153c2f1 41092dd6 40472358 c1993c3d 419d5ac6 404cc126 -> 419d5ac6", + "c113b140 409080a9 c08e2095 416df5a5 4184a9ea 40f4f398 -> 4184a9ea", + "4094f0c1 40f26b72 40dad43d 413566d6 c187e5cd 4053049c -> c187e5cd", + "c1486b39 c025818a 41173226 416b3215 40e3a1da 40da94ca -> 416b3215", + "c18a5a1c c0d362df c06ed889 c18e7527 c04f9c9a 40c53ff3 -> c18e7527", + "c0bcfa2e 40169f19 40a92cbf 418a3ce0 c0abefb3 40bdc299 -> 418a3ce0", + "419cb09d 4067b97f c08faa20 419e6e79 c179580c 40b2a2b4 -> 419e6e79", + "4157bb09 c0a64713 4100628c c04edbe1 41218b0e 402cd97f -> 41218b0e", + "c152d1bf 406ec23f 3fa09947 bf6eff6d 40c02610 40aab124 -> 40c02610", + "c0edc8f7 40ee9278 40a99427 c0ffca9f c107b44d 4014e990 -> c107b44d", + "bfd51d42 40ac113c c0dfb73c 413cd455 c1955d0a 409372ff -> c0d2b52a", + "403c0174 c00d4f2a bfda1cf2 c09b4c7b c12258ee 40d2f559 -> c12258ee", + "419011d1 401c1005 c11c32a1 40caf6d5 41281777 40d46636 -> 40caf6d5", + "4105e140 40ef41ed 3f9cf00e c0f77960 3f2fcc26 3fbf74a3 -> c0f77960", + "41605acb 40e0c311 c0f232a2 c0a3b533 414cc74b 4001a177 -> c0a3b533", + "40c8b9bb 3f855dca 41038975 c19e149b c13888c1 4065c79a -> c1505b63", + "bfbc2b38 c113ec46 40062a13 415d9b70 c11d2c9f 409f3175 -> c088bb7c", + "c01cf781 405e6876 4072319b 40b4ac2d c076bf2a 40a2dbb0 -> 40b4ac2d", + "c016fbb9 40c99d14 40df98e4 c02bbba0 3f925e0c 3fa0e25d -> c02bbba0", + "40da1a2f c10b16e4 3d944799 416ec711 41129553 40ee545a -> 41129553", + "c18bd904 40df05e5 3f15a6a7 4170966f c14555ad 3f158f09 -> c14555ad", + "c08a86cf c111d0a5 40900d16 bd5c233c 4149eb91 40357ad6 -> 4062a86e", + "c190fdcc c0ba2236 c10ffac1 c09eade3 c00966da bdd3069e -> c00966da", + "c17e1159 c11ab553 bfa9a0ea 40a16388 4137ba83 405951c9 -> 40a16388", + "4166ae15 c10e19eb 40daa35c 40b2b51e c19889d3 40a6857c -> c19889d2", + "40715226 c1000c13 40f1e93d c19d502a 40252c56 bee64f5f -> bf3ba7a0", + "417e0eef bfd8b296 c07191d4 41652a1c c195533f bdca1615 -> 41652a1c", + "c12ccd26 409930eb 4089fca1 c143e02f 40ffdee1 bf60beb9 -> 40ffdee1", + "41890fce 410b7b68 bf9b61bf c11a34c2 41980481 40f7724d -> c11a34c2", + "c1958dfe c0e583ad c05f0b56 c0706336 c1373511 4028f98c -> c0706336", + "40d7c6eb c0b017b9 bfc87c91 c15dc902 4143ebaf 3ffc373c -> 4143ebae", + "c0a646ac 40e01c4d c0cd488e 419b293b c104c017 3eb1b8b2 -> c0f4e40c", + "c14fd587 c0aa1e1a 40fad904 4174afbb c110d741 40372340 -> 4174afbb", + "c0b7113f 410fe424 c03bb4e8 bfc8ef63 4176db5e 3fd026c9 -> 4176db5e", + "412c94fc 4095f44f c0305fe6 c0d2f626 c031dad9 408ff1c5 -> c0d2f626", + "c11bc4bc c1004979 c0fc55f5 c0367081 40926da5 3fc9659e -> c0367081", + "4115bd7c bf8e6c6f c099f8a4 418517c3 c1635524 3e569a89 -> 418517c3", + "3e6d6381 401a0901 c0279d0b 4066d93a 410e1562 3eb59fdc -> 40b6e154", + "c118f477 c08e7e3a c097c15e c137c369 411cf322 bf23f570 -> 411cf322", + "c01cf702 3e76fb38 40c93316 c0c94172 c10b5d55 40b5d26c -> c0c94172", + "413fccd8 c0ed312e c0e23134 c179ba2e 40b8aa10 405e796b -> 40b8aa10", + "418d4e73 c041ff27 406bfa0a 41474e78 c1817dcf 4051ecea -> c1817dcf", + "c04b3118 c08f7551 3fe8265f 40c008ee 414f83f6 bedb12e7 -> 40d8e948", + "41446005 4041336a c02015b5 c10bbcca c1067bb2 404530b8 -> c10bbcca", + "c17b6722 40b08015 3d9c863d 41951309 3f577a9e 40bc9806 -> 3f577aa0", + "c0635507 bf98e63b 40d7d667 c05e59b6 40efa9a7 3f9971a1 -> c05e59b6", + "bf821726 3f9ea134 3f52225d c164d9a1 bfec082a 40dfa5e9 -> bfec082a", + "c122746e 4101fd78 410864e4 bf09c35d c003e61a bf1102d1 -> bf09c35d", + "c17d8b6a bfef1094 c0eb181f c0d3a9c2 412aac30 3dd64bd2 -> 412aac2f", + "4172b499 bf80bbe2 409c59cb 410e1d70 bfec874a 40bd14e0 -> bfec8748", + "c19ef8e3 c055d44c 408ad141 c0c094f6 c0cc214d 40d36c06 -> c0c094f6", + "4050f9f5 bf307ed7 400ba978 40bb7c1b c0a36a1e 40b8d9c3 -> c0a36a1d", + "418d1838 bf91f74e bffa79c2 c00678eb 406dca8e 40abe4df -> c00678eb", + "409dbbb9 bf99f4be 411bfa0d c08a6cce 4180d979 408ba1af -> 40f6fa4a", + "c0d40c9a c0a87645 c0b338ba c182c7b8 bf3e0f05 4083593e -> bf3e0f05", + "405b73b9 403b5c3b c03607f9 40d1f983 419c9af7 3d4e002c -> 40d1f983", + "c1867fb0 40dd6046 c0e35036 41821c6f c0d4e913 40da8f68 -> c0d4e913", + "4154f2f9 407d2597 c0cf1b92 4136ab6e 4193aed9 4094c332 -> 4136ab6e", + "c080e678 bfd44090 c038ddc3 419d46f9 4107dd62 3fd5fc5c -> 4107dd62", + "40bac510 40f8e070 c1011d70 c1592838 4123cb47 3e9cfb83 -> c1496a13", + "bde24a58 c09f7cae 407e0787 412f4509 40d4d95f 3fd8b018 -> 41084806", + "c031dba1 bed8c7c7 411a969d c105590c 41016187 40d91a17 -> c105590c", + "413e6bc0 40783832 c0275f4a 40ca268f 419dba95 40c79d9c -> 40ca268f", + "c16e2c39 41098139 c0677f5c 40bca61c 411461aa 3ef4048a -> 411461aa", + "c0af5958 c09d06ed 404fcb0e 403d40e3 c194337d 403697be -> 403d40e3", + "c1978f8e 40b3cc8e 40fd52df 4141c8e2 408de925 3f7cd9b2 -> 4141c8e2", + "c138ef55 3f0dc9de c0e268b7 4185228d c01d80bb 3f3a6639 -> c01d80b8", + "408321e5 bfec9199 c108a7e4 417e2f67 4183ff35 3e55d283 -> 417e2f67", + "c1377af2 c0793362 c023cc12 c169d8fa c15a7654 40c00beb -> c169d8fa", + "41905835 c0d09883 c0cbc272 409cde1a 40f6904a 3fc800da -> 40f6904a", + "4041d652 3f36c058 3fc2ef96 bf80a4e7 40038b0e 4018d75f -> 40038b0e", + "c17bc338 410f0412 bfd48cf3 419c30b2 40089f8a 4042b3a8 -> 40089f8a", + "bf430c1f 402634b9 3fb5e881 40cc928d c18f0216 40a37b0b -> c18f0216", + "3e95f202 3faa296c c10d436a c112241c 41740741 3fee1231 -> c106c884", + "415e24aa 407f9b30 c0f06f34 c0c64c43 41710781 40a855d2 -> c0c64c43", + "40c2a633 c03f4ad0 c101c65e 40d406fd 4165c1f3 4052cc5b -> 40d406fd", + "4083b48d c0b56cb1 3d01ac48 4182cbc8 c18a9010 40dcf005 -> c18a9010", + "40eb3a8a 3fa1ca1b c02cdbb4 c0fc438c c013aaa8 40514367 -> c0fc438c", + "c0222ff2 3f88a696 4040436d c19458fb 4100e068 404087f5 -> c19458fb", + "3fef8b6e c0ee9a0a 40cdf3de c19bb397 40aa055a 3fc69b7a -> bf741000", + "40fac944 400e29a7 3f873842 c191e193 40cb193d 40af4268 -> c191e193", + "c0554072 3ffcdc3d 401070ee 418d6acd 40c8b760 40c05a18 -> 418d6acd", + "c0ebc8dc 40d6e459 c0cca0ce 40ef7ee6 402083ad 40ed8539 -> 402083ad", + "412a303b 4108c716 4114ad49 3e423140 c1201e3b bebf1fb2 -> c1201e3b", + "41038ba0 c016e195 408b0276 c046e432 4029af6b bf32c6aa -> 4029af6a", + "c0cd6c66 c109ffc9 c0ab0e81 412f10d1 41539278 40dd47ce -> 414a6414", + "403a2c94 3fa6ad8d c0360773 41168220 c190be90 3fc9eb47 -> 41168220", + "c1358d9b 4111766e 40b83079 416bcb5d 4073ca8c 40b32402 -> 4073ca8c", + "c1650bd3 40b7cd1c 405a72cc 403e886f c037639f 40e09e3c -> c037639f", + "4123503d 40dbcbdb c0cae6a1 406bcc2c c18aa1b1 40145135 -> 406bcc2c", + "41139822 bc10e8a6 40cda113 c1090a12 c0bb918d 40bdd830 -> c0bb918d", + "c1158fd8 3f90461d c1079529 40d408fd c105008a 4057115b -> c105008a", + "c174d1b2 411776e1 c0a3c623 412141d5 c107dc40 402cbf13 -> c107dc3f", + "bf836ccf 4110943b 411acf8e c12c5815 c0fd59ce 40eb3541 -> c12c5815", + "c16cf359 409235ca c0682755 4188c4b7 4189dd1a 3c40a089 -> 4189dd1a", + "c1928257 bfecdff1 c10b4261 418da28d c1987f3a 40f74b1f -> c1987f3a", + "c14af786 407aaeab 410c784a c19c06d3 3fdf5e6f 40fb1631 -> c19c06d3", + "41358ec5 40812a1a c05b8058 418b1339 c19c1544 bf3ae59e -> 418b1339", + "c11d1233 41111453 c048c2a9 c199ab77 418fa608 40daf712 -> 418fa608", + "c0a371dc c0e0d764 4068d7d5 c11270c0 c13cffcc 40ea498d -> c11613cd", + "400a95fc be55ce2e c09bcf13 c16502de 40f501c5 407f6386 -> c16502de", + "c11228dd 40f39aa9 c081a002 c19cdef2 4134c6c5 bea2f757 -> 4134c6c4", + "c0a612c2 c06f3dcd c0edfc6d c11e4dee 40e30b65 3e5ca491 -> c083223e", + "c1647760 c10c085f 40612912 412894b6 3d81edb0 4042345d -> 412894b6", + "bfa391f6 c0d94e9b c0de2136 41616655 4180c1a1 3f5aa9a7 -> 41616655", + "40e7f6db c0a50020 bf70bbe8 c11601fc 407af36e 40c48afc -> 407af36e", + "c162f02f c11dc38c 4082c70b 4199cecf c1363068 40ad300f -> 4199cecf", + "41945781 40c5d948 c11308be c141e06d 41070c6e 40df1ea8 -> c141e06d", + "c19c2995 40ed390d bff0eb31 c0dc5bb6 c14f4745 bf0e46ee -> c14f4745", + "c09777e4 c005d4a0 c0b06070 c09a675e c0e3ff28 40ac95f2 -> c0da4c83", + "4176332a c0e25a7d 3fd5f907 418f7236 40dde6bf 3fb6ef07 -> 40dde6c0", + "41017fc4 3f340202 408a01eb c15ad448 c1326ee4 40d3f27d -> c1326ee4", + "411734b8 c10964a7 bfd0ea3e c13e5845 4115cce1 bf11d0b5 -> 4115cce1", + "c11be337 40265fda c11131d1 4004febe 418315d5 40140f5e -> 418315d5", + "c09a1b0f bda5cb89 c07ce1bf 411bd325 c193a0bf 4082d75b -> c193a0bf", + "c0a9e9ee 411323af 40cba867 bf9b938f 409b3b2b 3ed9813a -> 409b3b2b", + "c16d174f 41143f4b c11af7b9 c095cb52 c195b394 4036706a -> c195b394", + "419e49ca c080f2c9 c1179faa c1928474 c0e305bd bf5fc9d4 -> c1928474", + "bdc77959 c0ed0b97 c0d567ca 41666e5c 40dc3308 3f0af881 -> 40dc3308", + "417777c2 be4fec99 c0ca30c0 418dff98 416db69d 3fe7ffc2 -> 418dff98", + "c13f2987 c0b3cb99 406b8953 c19d5b3b c02bc746 40e139ab -> c19d5b3b", + "c0bc78f5 c0429891 41132f6d 416e09a9 41924713 40841d58 -> 416e09a9", + "3f0e4d89 c0d67472 c1108b30 c0a52b5e c0c89fcd 4073498e -> c0a52b5e", + "c160bb2d c0d2cfa7 40f74b12 411828c5 3ea15355 40f48c52 -> 411828c5", + "c000569b 4113b8af c0a0b222 412ea6b2 c0faf626 4044c75e -> c0b5b220", + "41000c95 3eaab6ab 4091b08d c0056b16 c10c95e7 3fdf0976 -> c10c95e7", + "c13d1b41 410e78a1 bf2f576d 41693932 c0dd64bc 40a32176 -> c0dd64bc", + "c19caaa2 c0301bc4 40c7fda2 c12972d6 410675bc 3fffc07c -> c12972d6", + "405d5767 c001909d 40946f5e c122e0cd 417c2729 40bc746b -> 4159b4c3", + "c191b96e c0bef661 c01b41fc 4156c64a 40e6766f 409e65e7 -> 4156c64a", + "408bbbc6 bf59b9dd c10db859 c121b997 c1775238 40d1c916 -> c121b997", + "416beac6 40e996b8 407db450 c1661e92 c0a8a438 40f6ccc9 -> c1661e92", + "41727c61 c06bf65d c1013357 4146b466 40fb2fc7 40d93f1d -> 4146b466", + "3fa94c89 405456fb c0e61e7a be411b78 413d486e 40938040 -> 3f72502a", + "4167c3a8 c05631f7 409e3ee6 c18aa4fc c0f8d117 40b2e753 -> c0f8d118", + "4065e5a3 3fbe7092 c07beb90 4139e419 416ecb91 407495b5 -> 4139e419", + "c15e7908 400230fd c0fdced2 c0c9abc5 3f964a8f 40bdcdb0 -> 3f964a8f", + "41396791 40899719 c04df780 4110bbe3 c0a6ab3f 40c3dda4 -> 4110bbe3", + "4184a022 40c68d2d 40d3afba c15b316f c180f6c2 40f39137 -> c180f6c2", + "414331ac 41031973 409c15e2 41860b64 418f6929 4093550e -> 41860b64", + "c17dd1f5 c1044aea c0239e93 bff0a46d 40a95543 401909b0 -> bff0a46d", + "40b87c2b c109b93a 410944e5 40baf29f 417f8114 40c33bc7 -> 4173e50a", + "c055e3b1 40b76e26 c0ab0a16 411e3629 4187fee2 bf549925 -> 41831694", + "bffb2dc8 c0936f7a 406ef577 c10b676a c01cb40d 40dc020d -> c0e71eba", + "4106e192 c11769f9 c0fb8288 40d86486 c0b36a62 4001611a -> c0b36a62", + "c0711b28 c101a4f2 bfc0e33c c0d68375 c062246a 402de338 -> c08ca54d", + "c13cb7c7 c0c0cfdd 40a5cbe9 c14e97e4 417e910d 3f3836e1 -> c14e97e4", + "c003134f 4084c472 c110839a c138a60c 41932f1b 40276991 -> 4005bc14", + "c18e98e9 c10a6999 c0f228d3 c153b746 c04b4094 40bcda96 -> c153b746", + "c188883c 40a039aa 40865661 4166d5e1 413fbd6b 40a49b4f -> 413fbd6b", + "416b8c07 c0aca7bc 410357ff 40f34316 417967ec 3ff2c3e7 -> 417967ec", + "4174d80f 40f46763 411e58a9 411c029f 40ef9e0a 3fd36c94 -> 40ef9e0a", + "c18e432d 411ba02e c107a72a c11a132a c0d8a86b 40d2110a -> c0d8a86b", + "4171ad28 c098381b bfed1d36 c0b46693 412ac1c1 405c1d18 -> 412ac1c0", + "4037cf66 c0879341 3f933ad2 c11cf7ac bf04d448 40d22912 -> bf04d448", + "4157bfcf c11d9e39 40f8957f c09353e6 c034361f 403e01bf -> c034361f", + "c175cdd4 40891fc3 c0e4d04a 411860ec 411cfcc6 40e16634 -> 411cfcc6", + "c12bf9a9 bde95a5c c11ad9c1 bfb8de29 c1474af9 40cd8a31 -> c1474af9", + "3f42beda 3fd1ec09 c05697e2 4110ee0b 40db632a 40fc1e59 -> 410e0955", + "c17c76af 409a09d4 40be2859 41375b51 c06a7130 40238db8 -> 41375b51", + "bf9a061e 3ca5b87f 4092e419 c0bcea82 41170426 40e594a4 -> c0bcea82", + "4118c815 c07097ae c11bc6a4 40d6aa1e 419e09e1 be8ba1d3 -> 40d6aa1e", + "3d0dd975 3fd621ab 4096496f 418b3ff6 417d6849 401c68cb -> 418b3ff6", + "bf1d2e77 4086c1b7 3f84ce8a c0f0ed57 c0a6c491 4004c3bd -> c0a6c491", + "c19d666f 409919db c1034a58 c08e45a4 4194cc9e 3fb8fef5 -> 4194cc9e", + "413e96c6 40874b8b c11fa28d 4172f5ec 40d3e9cd 40f81dcf -> 4172f5ec", + "bf7c6f8d bf140376 c0c9a91f c196fd6e 41725ead 40be5e97 -> c1930a45", + "c1999602 411c6d36 c0ccbdcf bff78f61 c197d4e9 40cfba66 -> c197d4e9", + "c0989154 3fd5099c 4110384c 4156774a c1477a3e 40f1e1c0 -> 4156774a", + "c190aa6f c0ac5756 40ba37d0 c129b4b9 4152d722 40bd60b9 -> c129b4b9", + "bddcf312 c01f97a6 3f6482bb 4109c9ed c1254f61 4000047a -> c0cb2218", + "412f5940 40ac9ee5 3fb87499 c0858c07 4108a6dd 409a3d21 -> c0858c07", + "c15b1652 40582158 3fbc2f50 4118c0ee c0dbdb35 40b65e41 -> c0dbdb34", + "40faafe8 bff9ac70 bfec1c01 c1120189 c195981c 40a13659 -> c195981c", + "40c76322 c0234f09 4109651a 4189538e c19105f5 40e74c72 -> c160ed76", + "c0363052 3ec6adb4 c11b3fd8 be3540b8 40bbf708 40e22bac -> 3fa51365", + "c0637ee5 40b70f49 c09fc600 3ebcdf4a 40417a58 bec92c48 -> 40391d7c", + "419b8fd7 bed5bb87 40094438 c1185aa1 410e2527 3f9ef9b2 -> 410e2527", + "c0ac27a1 c087df25 c05dad51 c0c83d79 c120d435 bed36e93 -> c0c83d79", + "3fa153ec 4109bbc5 c0502980 c13d1f15 4121d602 40ac9d52 -> 40404cec", + "c198e923 40cd9857 40c0fad4 3ec53eb4 415c6ecb 3fc53ff6 -> 415c6ecb", + "410ac6b3 c0881284 c0166019 c10de5e7 c0c8c7c1 4006b4a9 -> c0c8c7c1", + "419c1be2 bfc5c351 3f7eae4f 406527cd 40bcad17 405f1a57 -> 40bcad17", + "c126bb33 404d2f44 c0acd966 c104b171 4147a1b8 40b50aa2 -> 4147a1b7", + "c00af130 c10bfc46 4107344d c15ebab6 4184eb5f 3f36aa27 -> c07bfbb8", + "c09f12ae 407342b7 c0be99e0 c186c4d0 40bf95a5 4051da39 -> 40aabd30", + "4109faa2 be4d1cf1 c0b0fc8d 40df6fb6 c0a418a3 4088db36 -> 40df6fb6", + "4110523f 407aa573 c026da2f c1581c29 3f15f90b 401c6f55 -> c1581c29", + "c09c82f1 4062052d c081018c c179d195 bfcb773b 4044984e -> bfcb773b", + "4090bed6 beeaf165 41197c94 c0d64e50 c0a89eec 3fea6b92 -> c0bfc2ee", + "c091d7db c012c5f5 3ffdd939 c00f88fd 404e3788 3e0a7c72 -> c00f88fd", + "41918337 be8d67a1 c09a176a c0a342f2 c164fc9e 40b7bf43 -> c0a342f2", + "c0e6c6b2 c11ec279 3fbb879f c14029d7 3f0fe38d 40baf6a2 -> c1236516", + "c184475d 40654ff8 40ab3f66 4139dd7d c033a5af bf7b66c0 -> 4139dd7d", + "4181f067 c0ddf118 40e977cc c153d0ad c0dad886 bf55f8ae -> c0dad886", + "c002a089 408493e5 c10e6ec6 c1826ff1 4111e74a 3fc29f0d -> c0929a80", + "418b204e 41140bb9 c08421b2 40746a0f 4190470f 40273f72 -> 40746a0f", + "414c94b1 3f57ac4a c1174ae4 c0cfd9fd c090848b 3ff88492 -> c0cfd9fd", + "4180f39f 40882f38 c0e122c2 bfaa2353 c19ab7f6 408fed2d -> bfaa2353", + "c184ca9f 40fdb1d2 c08e64cb c1492c6a 40fb2b39 409e7b5f -> 40fb2b38", + "c122b849 40fe9dd4 411cb44d 41411bd8 417d7f04 bf4946a7 -> 41411bd8", + "c06f2806 c052091c c07c2bd1 4140b5a5 4135eb50 3ea76874 -> 41385f24", + "c1133788 4107b3df c105059e c1664a25 c06dcbb1 40a08c9e -> c06dcbb1", + "c10418d9 411cfc8b 410664f1 c184015d c1877140 40a4cc0a -> c1877140", + "41861a47 c0cd60d0 40a38e04 c148f019 c19e3107 40ada352 -> c19e3107", + "c1212e08 c1148e7c 4017872c 4120795b 40ad5ca9 3f6f76ce -> 4120795b", + "c0237160 c0b826b2 c0819958 c02b209a c12db6f9 40f11d84 -> c12db6f8", + "415d35e7 403b32c8 c1190a96 c0498afa 410e33f0 3fd1b96a -> c0498afa", + "c191cc23 c11b490e c1177ecb 402f9085 419c6667 4043b15d -> 402f9085", + "4161e197 c0c45fd8 41096668 c11801f3 4084a537 40e022fd -> 4084a536", + "41384ba1 c0868e09 3f9fbe48 bfdb7375 40ab208e 3fe2b4d4 -> 40ab208e", + "c0d4df3c 410d44f6 c0a84a0e c0ad50ed bfc2519e bf178fa4 -> bfc2519e", + "4111da92 c04ef8bc bfc8216b 4127112a 4105785f bf631592 -> 4105785f", + "41903835 c11bcc38 c10bfe53 417b89f7 c03e4ffd 409aa832 -> c03e4ffc", + "c10fcbfb c0f01d68 bffdb2fd bdac7774 c1461bf4 40fdf71f -> bdac7774", + "bfb17727 410fdfe9 c092dabd c192f708 c195b3f7 40155790 -> c1955169", + "c12e444e c063b2c4 3f02dd54 4194fee2 40028e08 40997220 -> 4194fee2", + "c115de05 c0e0e2aa c046e12e c15a2cbe 41306bf0 3f3c998d -> c15a2cbe", + "c0289e05 4014e496 40860e48 4192b7ca 40ea4f9e 40bc61ee -> 4192b7ca", + "3e3569d3 4071ba89 c0b65cdc c10c9284 40dbeaf6 409e62c7 -> c06e4a9c", + "c12ed4ac 3f31b50b c0a69bfc c12ae8e7 c199c145 3fa08026 -> c199c145", + "3f125f18 c0e55dc8 c1076c52 3ff2a064 408a0880 be93b921 -> 3ff2a064", + "c126c796 c09d014d c0a1887a 416f4c4b 412c47db 40e6713c -> 412c47db", + "40c8d825 411e31a1 c0cee696 419d4f95 4112a208 bd5a321b -> 4192d58a", + "c02bae02 41150628 410684ab c02ea1e7 41902a3f 40110b5c -> 41902a3f", + "c13b583a c1158cea 404754a7 c0edd144 c0455238 3e53bc7f -> c0edd144", + "410f6848 c07c5cc0 c06c076c 41283063 41401736 408e2530 -> 41401736", + "c17c86f3 c0d94a92 40c8ca69 4182a72a c15c4eeb 4054c13f -> 4182a72a", + "c14dc876 c01ab50f 40bbbf7f bf1052a9 c12fcd5f 40bb4759 -> bf1052a9", + "4182d111 40e40439 4106d5f5 bf22d706 3e322a3c 40811324 -> 3e322a3c", + "bf6ca52e 4013f84b c03091d3 417f4dc9 bf2033f6 3f86e555 -> 408a11be", + "c14a5626 c1040e3d c09d7dca c11170e6 40cf16c6 40f3a33d -> c11170e6", + "c1207587 40836742 c0bdf824 3f90514d c055169f 3ffd0537 -> c055169f", + "40f9d392 c0af5442 c0f620c3 c10a2eed c134bf23 40ec0284 -> c10a2eed", + "40d15739 c0b26057 c0526718 c11bf739 c11134fc 40a561dc -> c11134fc", + "c0b712c2 4095630d 408c4f2a c0d42592 417a34e5 40a89284 -> 417a34e5", + "40867acf 3fa58873 40cffb45 c150f180 c18f6d85 40cb1ddc -> c17ebd99", + "407b91dd 408b6c44 c0196f54 c194efc9 3f9de38e 40e50f64 -> c1931ea3", + "40e85a00 4057502e 4113a5de 40edb256 c17c5ac8 4014bff2 -> c11b10d3", + "4055b5b8 40568c9d 40060b42 c19bfc4d c0cba14b 408978b6 -> c19bf397", + "c1545503 40a48bd1 3ed17117 c10b6970 4194a4ea 40843f2d -> 4194a4ea", + "bf192902 c106d808 bed0ff11 c11947fc c132988e 3f918dbd -> c1328dce", + "c158b256 3fc83595 c0052b61 415f9494 41597609 40636501 -> 41597609", + "c19666ad 40eed32f 40d0a64c c1591af2 c004b15c 3e27e969 -> c004b15c", + "40caf151 c1098368 40bb910b 40f0be7a c18ad19a 40334ebc -> c18ad19a", + "416927fe 411e423e c0bc61d2 c0abe32d bd46bd71 40a667e3 -> c0abe32d", + "c0e0555d c066f64d c0f5e705 c170f0eb c0c520f6 bf0913a5 -> c0d9eac2", + "c110a8e8 c0c3f321 40342e63 415df551 c186a7f4 bc69fd6f -> 415df551", + "c157f9a2 411f3171 3f691867 c1998924 41674ba6 40a53971 -> 41674ba6", + "c178b0fb 4108ad52 40201aca 4108328f c18c6ebc 40a9f0aa -> c18c6ebc", + "417c55e9 4058070d 4000f981 40cb494d 4188ef48 406476ac -> 40cb494d", + "c173e83b c0c8f961 be4cd365 417f0140 41545dc8 40b6d899 -> 417f0140", + "c19f7075 c057e0ff 3fc3f49e c15a0b06 41977ceb 3f6a343f -> c15a0b06", + "c1134cf6 405f5bc8 408608d9 c150e670 41221a23 3fa7f13e -> c150e670", + "bf1a0e2a bf63879f 40cc2cce 4147ac1d 3f3652a5 40105209 -> 4146d0a3", + "c09434a0 4086abe3 c0f45577 c0e7a383 c15246f7 4094d60f -> c1432157", + "3f5e1114 c0688285 c01a0a63 bfe3bda7 c04990f0 bf4e5b3a -> c04990f0", + "3fddd8d5 4077f082 c11fc82a bf6be690 c0bd0e93 40c552c8 -> bf9eee00", + "41325ca0 4048da65 40ec7031 c1139cf2 40e06f37 40a6b744 -> 40e06f37", + "4159f395 c0930fe5 c0875646 c0a3d1a6 3f62d299 4041e030 -> 3f62d298", + "c0ac5e90 bf1a3b3c c07ad829 41736d03 3ea6d263 403fbb6a -> 3ea6d263", + "bf20fbf5 40dc22b7 c1162986 c19a5eda 40bb049b 4028593b -> c102b93c", + "c18a96c9 c029b936 40f7a46b c0955cc4 416f307f 40de4ea0 -> c0955cc4", + "c11cd907 c0fd5ccb 40b0d0fe c0fb9f9c 40a156ff 40840bd7 -> c0fb9f9c", + "bf61892d 411b11d6 bfe5e5ca c17ebfc7 4190cab8 409d08f0 -> 418be2e4", + "419e0a24 410a0c60 c104b113 40094824 3f5c7ca7 409781fe -> 40094824", + "c10f7e29 c009c974 40d7cbba 4155b328 bfbf72af 40a91925 -> 4155b328", + "409a0075 c0d91724 c105b337 c0d7c917 419b3e0b 40e5c184 -> c0d7c917", + "418938f0 c0a7158b 40d3d8cb c144a73e c0739601 4062a652 -> c0739601", + "401ad5e5 40f2caac 4068746c c06ac7d4 417dcec8 3fe2b2d4 -> 417dcec7", + "418cfaae 3d9495d0 3f889d4d 407c5e16 418049f6 40f060e3 -> 418049f6", + "40ea81d7 bef0610e c1022758 bf58e554 410c259d 3fbac366 -> bf58e554", + "4140091e 40feb508 4114f767 415e4d0c 4197154e 4019ea26 -> 4197154e", + "c0ce7e87 40f103c5 40adf362 414893d9 bfd61d54 40d4319a -> bfd61d54", + "c0e4f3bc 40dce19f c117a43b 41089e88 4190ae27 400b71c5 -> 418c822d", + "40991a52 408f99bd be6dc10f 3ff4362f 405b5010 401a22e9 -> 3ff4362f", + "c199c8e9 c085242e c024e705 403d717e c19bbf18 bd89337a -> 403d717e", + "40d50992 c0216670 4081ec53 c0bb96d5 409eafdb 3fdc6a42 -> 409eafdb", + "3f917896 c0e15150 404384fc c0472f79 41956942 bdc06b8b -> 4184ebc7", + "c167deb9 c02e52de 3f7abad1 419bbf3a c133c5f1 40e2a9b3 -> 419bbf3a", + "4193d25a 4103938c c025e1cd 416f804c c1713f01 4047b705 -> 416f804c", + "c18fb66e bf6950e7 410af698 c1170caa c0ebfb05 4007b420 -> c1170caa", + "40f0b929 41004112 c11fd3e5 4186fc0b 40a89d33 4061bc09 -> 4186c782", + "c1822524 c0ef639b c0cb9fbe c194cf73 419b9306 40bbd902 -> c194cf73", + "41694a23 40b87598 c089a2b4 c18395c2 c15b79f8 40a7b63a -> c18395c2", + "c147523f c062a10f 3fdb7be8 c17ee5f4 c17149df 408f2430 -> c17ee5f4", + "400fe1e1 c10be1f1 c10104cc 410ad31e bf5d20dd 409a9aef -> bf5d20dd", + "c19ce179 c0c63c26 c0e427c6 c0bcfbf6 c10a37f7 3febf651 -> c10a37f7", + "40bc1d8f 400a01d2 c047cae3 c020ec84 40fb5097 3f79c784 -> c020ec84", + "416ed681 bf4301d8 3fa29fc3 c19dc990 4136794a 40e17871 -> 4136794a", + "bdfc92f7 c0442eec 4119c594 407557c0 c15dded5 4097224a -> 3fb5343c", + "410b62b6 c00f6702 bfd107bf 3f30eb07 4127fecc 40d7e8b8 -> 4127fecc", + "40afeba3 3ca8e776 bfcee37f c1354717 c1020fc8 40c5517c -> c1354717", + "419d2a3d 410f6d72 c0d23a09 c05c21b0 412de8d7 40cc087f -> c05c21b0", + "c11a4669 c01daf69 405e6c32 41961b03 c1436b74 409da534 -> 41961b03", + "408096fe 40736886 c107e8e6 41234d26 419bfae4 40370a0a -> 41234d26", + "418916ba 40ace20b c0a48f36 4198e589 40d2b913 4058f9e9 -> 4198e589", + "4138cce4 3fa77703 408cde82 412bdf6e 415497fc 40b1a6ff -> 415497fc", + "40a59ec8 c0b48e33 40afcf05 c19c7edb c132a766 4091036e -> c132fa20", + "c129e27b c07522e0 c1086b9b 413a2ab7 418d747f bed6a869 -> 418d747f", + "c0867c0b 3f8a95c7 3ffd234b 40b5b863 bfb5cff1 bd5b51c3 -> 40b5b863", + "410c1e04 c11588f5 c0f5dc5f 4087566c c09c487d 402cbe40 -> c09c487c", + "c0b706f0 c0e920ae 408eac70 c0f93501 414dbf7c 400524dd -> c0d91c03", + "c0a86560 c0e3465f 411aa782 4122ce10 41779f40 40eb3505 -> 4125a500", + "40f56736 3fce6a5b 40a309d6 40ffef3a 40fe3a0c 40b184bf -> 40fe3a0c", + "415e08c2 4116aafc 3f503e8d 418ec241 414fb84c 40d3d6f1 -> 418ec241", + "418c264d c0c41a4d c0d2d8b2 c178309b 4163072b 40f94c08 -> c178309b", + "414d1404 3fdf7908 3fb75eb9 c0a8dbe1 c1375715 408d23e6 -> c0a8dbe1", + "c091fce2 40af6f61 411088a8 c11049ec c18e6b0e bf3058e9 -> c11049ec", + "c15b4541 bf921f1a 3fc071cf c127c0c1 c08a5192 3cd0dfd6 -> c127c0c1", + "4195fe65 3ff22864 c01456a3 c1932f27 40d41e7d 40dd9906 -> c1932f27", + "c13717da c02e4b17 c0b97715 40ad50fe c09b2dbe 40531d19 -> c09b2dbe", + "c1656529 3f0d1f97 c09bc501 c140500a 4195c21e 40391e40 -> 4195c21e", + "3f26e617 c1050496 c0ef4a82 c152c27f c184660d bea12c70 -> c184660d", + "c005af81 4050f98c c0de2ce4 41838053 c1040c51 40f41545 -> 404bea3c", + "3f0139e3 40f2e06e 407bba27 411ccd49 c10ac671 408afe69 -> c10ac671", + "c169c28e 40b303d3 4076c7c3 c0efc7f6 c04c00f8 408b7b58 -> c04c00f8", + "4096c329 4103a8b9 40ab1734 4109ec58 4118e55e 40009793 -> 4118e55e", + "c1390d71 4105a3fe 40a54009 bf5bb40e 41492da3 3dd827d9 -> 41492da3", + "c0e51f4d c00fab2c c0a28b1c c179fbfb 40159b0e bf26c515 -> 40159b0c", + "417c53b4 409eb338 bf999e8b c03895e3 4144aba3 bf368bbb -> c03895e3", + "40dbc4b6 4034ef84 3f022602 c02b0d9b 40a031e1 3f8d0228 -> c02b0d9b", + "c00fdfb8 40fdad00 4116ae51 c06c9b4d be839f65 3ff2d156 -> c06c9b4d", + "c1107a0b c035fe5f c0233f14 40d2560d 413d7f34 40fbc964 -> 40d2560d", + "c17d9c6f c0819e01 c0f243f5 c12da4b2 40fde2c2 409067cb -> 40fde2c2", + "410e2bbc 4020b4f8 c07061ae 41864a8d 3fd2a164 40e916af -> 41864a8d", + "419d56b5 40f2a86f c0854987 418386cc 41838cb8 40816eb3 -> 418386cc", + "c0f8b8e2 c0f92261 411e1a05 c11cbacd c1671d55 bd3d1a53 -> c11cbad5", + "c1177b28 c0146a00 c10609e7 be5cb20b 4113ddc4 bf6fd2ab -> 4113ddc4", + "4199bb79 c1192ee7 400a8165 c177842f 412b2d22 40f7892d -> 412b2d21", + "3ecad46b bf87a9a8 c0b4a8fb c12e7d78 c17b9b50 3f99489d -> c12e7d78", + "c154c22b 40a2ea01 41194f00 40c352ec c132088f 403e287a -> 40c352ec", + "402a6c77 3f770087 40a40908 3fe6e342 40f3baca 4067c819 -> 407ab8ed", + "c11b9bee c0773e09 bf33ebe6 40f4ab34 c15e2308 408117fd -> 40f4ab34", + "c19fd8a7 40c601aa c0df3bd7 417c92df 418e9626 4089894b -> 418e9626", + "41919492 bd84b0c7 c1194524 418eb063 c0c86c64 409dc19a -> 418eb063", + "c1879a83 40fd96f6 bf160ab0 c0010418 414e1a19 bf6682cf -> 414e1a19", + "c02df39a bfff6a47 40f2dd5e c1354120 c17dfbd9 409b5b21 -> c1354120", + "c1417255 c016b609 3ff01b52 c1330094 3df59f74 40c9d969 -> c1330094", + "c0ccac58 c084b72f bffbb630 c18a3d85 c16a3792 3e7d97d2 -> c18a3d85", + "c19639f1 3fd413de 3ff71853 c181ded5 c16edaca 40f62d5c -> c181ded5", + "3faa7a84 4110f125 bf95c2ae c192a11b c18fae22 409fca92 -> c1901f89", + "c13ec25e 40eb8eac c086dafc c1527b07 40b7b807 40cf7f68 -> 40b7b806", + "c139b391 c0016461 c0ec4b76 3fde0f5c c07594bb 401d072a -> c07594ba", + "bf926fb4 3ffd2fa9 c0dc30d6 c184234a c15a56b5 40dbda2a -> c17b2e62", + "c04e4c65 410df95b bfd0a295 411694c1 c11e72d9 4096b35f -> c11e72d9", + "41512a8e c10763a2 40814e0a c0a8e23b 4197e7c1 becd0554 -> 4197e7c1", + "40036994 3e0abd84 c109b0c8 c0f6cb83 418fd7ac beb99b72 -> c0f6cb83", + "40c1ea9d 3ffdf975 4085b829 c147ac1e 41428881 40eb3d67 -> 41428881", + "c0f88ff8 c100510b 40f000cb 414361a5 404acb5a 40fec74d -> 4143449e", + "c0a00c9f 3fe72abf 3f03830b 41805d76 c1844e5f 40ecffea -> c1844e5e", + "c0a8798a 409e8638 3f904c54 414bf7d5 409ebbe3 409d94ce -> 409ebbe3", + "bfa8fdec c0c7866b c03af4a5 3f95d5f7 418b2a12 40c10789 -> 418b2a12", + "40d826a4 410cb62f bff32265 419357dd 41490b54 401d9879 -> 418ee1fd", + "c05b8959 40ee4374 3f819d54 40975142 c14a944b 3f1dfb54 -> c14a944b", + "412cce97 c08aaea3 c0fb7cf1 c1411c3c 411cd8ba 40196ea7 -> c1411c3c", + "41977e83 411293e0 c0f11bb0 bfda46bd 410f118c 4000d691 -> bfda46bd", + "c14aa469 c105e959 c064fecd c1041ae3 c1532962 40024262 -> c1041ae3", + "402f846f c11d2f48 c040739d c1926ebc c194cbb7 40b80112 -> c194cbb7", + "c17fbced 4104e5b8 40da820f 41144f7f 418a40eb 3ff77c0f -> 418a40eb", + "c152ea5a c0e05640 c0345111 c120f85e 4194d1a5 40f348cf -> c120f85e", + "c17e7b8f 40c9afc2 c00c7da4 c04d922c 415423eb 3fc39730 -> 415423eb", + "3ece6fd8 4067b6a1 c02dcc23 c0a9c885 40139536 406f20d4 -> bfb49eb2", + "c07985c6 402f8706 40cad4ab c0e695ec 416fa50a 4013e6aa -> c0e695ec", + "40ff3b9c 3f159c21 4111a53f 413aa91a 4193e019 40c2f8c2 -> 419143bd", + "c189aec6 c0957d45 c110c8de c186e53b bf77bb8e 40c218c5 -> bf77bb90", + "411f8f00 3fef10ff 401b5b96 4135e106 c12f3ae4 bdd7ca85 -> c12f3ae4", + "bff0186c 40c5d6f1 bfc6abb2 406ca294 40939489 40ec7b52 -> 40939489", + "40301244 40f67293 c0afc703 c0852bb2 bfd971ec 3ff32469 -> c0586dd7", + "418ff565 c10e14f7 3da67e92 c1969d8d 41214203 409e81ea -> 41214202", + "4097a9c6 c0a363df c0e427d0 3f97b1d1 419e2453 40b8b163 -> 3f97b1d1", + "c11be29c 40e5dfbc 4013d089 c089f24e 415f696d 40ac6bd9 -> 415f696d", + "418e2ae8 407a26de 3fbbbdd5 c0842603 c1365a53 3ff4100b -> c0842603", + "bff3bbe2 4072fbc4 c04ec5a1 c139b7c3 c09ed4dd 40cf8c6f -> c0b2b381", + "c16439cd 40cb1823 c08844f2 411b42c9 c18e0cb7 40872d0c -> c18e0cb7", + "c052d4e0 c0054a0b c00ba443 c18aa5c8 c19d0665 40a25a27 -> c19d0665", + "c1383d03 c0dbbb06 be23030d c11df93e 41506161 40fb3e52 -> c11df93e", + "c184e8c5 3eb31427 bfb6d676 c01e5ee1 c1942a1e 40d83d5f -> c1942a1e", + "c197632a bfd71fc5 40bed247 416c7e81 4150b496 40f43308 -> 416c7e81", + "c00138b8 c0afad27 c0871cd4 c01a6ec2 40c0f883 40e723cf -> 40c0f883", + "415f5b2b c013c48b c06a9263 c1882f3c c0e0a4ab 40a4abfc -> c1882f3c", + "c046273b c102f7ac c0e00e53 c0b2e64e 3f958bdf 3f9724ba -> 3f958bdf", + "c0be0c34 40499be7 40f2a273 40a8dcb6 c1032e78 40e3dd87 -> 40a8dcb6", + "404c7d3f c076161f 40a1a2d6 c122df2b c188c472 bf31b35a -> c1828c20", + "41846e5f c0fe7b8b 40a0b837 c167456d 419fc402 404939bd -> 419fc402", + "417ff15e 3db4e03d 40234962 c06da372 40aece3b 407f591e -> 40aece3b", + "c17c4425 c1192e19 4018ae0d c160cb95 41547dbf 40eb588c -> c160cb95", + "c0cdb180 c0bef67a 3fde3092 c16128a6 c011348c 40ea031a -> c16128a6", + "416680b0 406616fc bf6f7393 c18875b9 bfd765a3 40caf2de -> c18875b9", + "40c91c42 40a8897e c09aedd6 40ded4d9 41367fbc 3fcbe2f7 -> 40ded4d9", + "c14cfc96 40c8758f 3eda9f9c c1819bcc c05aec49 40f72997 -> c05aec49", + "c12f0f7e c01c4b13 bfc1fa5d c0cf5af2 c1925759 40b48ffb -> c0cf5af2", + "bd0f98d7 40b6e193 40356b58 418ee3f1 c1991471 409a35fb -> c1991471", + "c18cdc29 410cf0de 4059856f 40593800 c04f941b 3fed07ff -> c04f941b", + "c183222d bf199c7a 404c6dd2 bf5239c9 40063b20 4077638f -> bf5239c9", + "3f8bf203 3fb62616 4091df2a 41377f85 4134f388 403a80eb -> 41377f85", + "c05e18c6 40dbe1ca c10a2a65 416ccdf7 4106eedf 4083a18c -> 41214f9a", + "419540b6 c0504475 c104045b 4196120f c13d2177 409d5882 -> 4196120f", + "4001f671 c11f96cd 408d4a22 c1891079 4040009b 40a90c5c -> 3fc324c0", + "c14f84c1 40a0632d 3f30633f 41038e36 c18f3f8b 400218ed -> c18f3f8b", + "41239f57 4094c5df 3e83dd6b bf29be40 41078e69 40e1c96f -> bf29be40", + "c0f112f6 c0d26f51 4102275a 41918ef1 c1606163 40a591ea -> 41918ef1", + "40a18ffd 40e78ea4 4016a38e 4184054f 40d100bd 3ea3d627 -> 4144ab9e", + "4182d8e0 c093819d 40dd6578 4171c39b 40994739 bf0649d1 -> 4099473a", + "40f28861 c09fbcd7 c0a9cee0 bf38db64 40da15ad 3fc988e2 -> bf38db64", + "409c72b2 40b5d9c0 40889a32 c0a0482c 401ad2ca 40c67fd7 -> bf1d3790", + "4184ab09 bf1a9665 c0143021 418d0fd7 419dd54f 3f601367 -> 418d0fd7", + "419996b2 40386ea7 409db4fc 412bd586 41181cbd 401358a8 -> 41181cbd", + "4112da55 3fd896db c0b45000 40e4cd17 c152a30d be2e0d54 -> 40e4cd17", + "4111759c c0c912cf c10f9dfa 40e07cfb c16bec52 40f61fc2 -> 40e07cfb", + "c17aedb7 408a733a 4082f41d c1165489 40ba4c46 401d946e -> 40ba4c46", + "c0f44702 c081304d c0baf3b4 c0d764c9 c10af894 bcee7772 -> c10af894", + "c0d68d0f c05718d6 405dfd08 c17487de 4114b37f 4025ed13 -> c17487de", + "c068e7d1 c0a82106 bfd7b7ae c0bd6be3 c13f4519 bf7c3818 -> c10821de", + "c05cee75 c11c0380 bf2b27bb c0959390 c183677d 4003b618 -> c15ca733", + "40cbc548 c0cd667d c0db122d c1701ef7 413aeb2d 4057e387 -> c1701ef7", + "4027a204 c11ba628 40ffc61b c095fd18 c1916428 40c45998 -> c1734a11", + "c12f4350 40bd9ec0 410eb1ab c1565fd7 c17e186d 401bca84 -> c1565fd7", + "c03879ca 3d704cd0 3f1b9bc0 414e658b c13ca0a2 40724486 -> 414e658b", + "3f2d331a c08f2a40 40b6cb15 40be5866 c1266842 40df0856 -> c0174ee8", + "4132fcc4 c005f51a 3f559f19 c04ab8b9 41163ba5 3f94152a -> 41163ba5", + "c10451ac 40eeceee c00f72b8 c0dc6c4f c0c065cc 40638f3d -> c0c065cc", + "4175618b 40ade1c2 4085da2b 3f072c8c 4052ffdd 40c004a1 -> 3f072c8c", + "c190fca7 411153c2 c104c170 415bac35 40b0bb10 408f9f68 -> 40b0bb10", + "c15622bd 40e713b5 3fc1b2b3 c1861e35 bfb895fe bf6255d4 -> bfb89600", + "c11cf7d7 c11f3007 4083df27 c193c8dd 417f527b 403862b9 -> c193b470", + "c19b9821 3f7a2ad9 40af4e84 c08ab15d c135bb72 3fdaaa9f -> c08ab15d", + "c1198f03 c11cac2a c093592b 40797a83 c026b511 406eedb5 -> 4077c3de", + "41870a16 c0e5e369 3f76b238 c158c17b c1420d18 40a288c9 -> c1420d18", + "40cf42d8 c0d1e703 4078ce71 c137357f 414408d0 40f0d02b -> 414408d0", + "4050cd60 c0c96525 c0f3cdce 410e2006 c1943293 3fe013df -> 410e2006", + "3f46bd65 411f0665 c004e384 4133cf9c 413c26b4 404fa068 -> 413af6cc", + "410c23f0 40ca8e9c c0de02fa c0b1c68f 41896e63 bf351025 -> c0b1c68f", + "4185f5c0 c09f737b c0b4461b c18fd7d9 418f622c 40b1042d -> c18fd7d9", + "bf6b1d8b bef5d9e4 c04875a3 c0850709 40efbbf4 bf5da30e -> c053b566", + "c17eb6b2 c0f9b26b bfc99adb c0c0bbea 413e5860 3ff27fd1 -> c0c0bbea", + "4196b0ac c0e690cb bff3a8f7 bf13057d 4188c557 40fcbe1b -> 4188c557", + "3fd0e159 40c7621e 3fdbc57a c0c751f5 3fca7749 40bfeefd -> 3fca7748", + "419d7260 40bec99b 4099764f c1964062 c0d3d475 40a5f412 -> c1964062", + "4162f35a c1132f92 3f557091 4080cd3d 4162935e 403f4bc5 -> 4162935e", + "3ede51b9 bfd177d3 c10e08c2 41451f2b 41831ca7 4079a9bd -> 41451f2b", + "40a00c46 c104a756 403745f7 407b34e1 c00745d1 3fc4c81e -> c00745d1", + "40fa4af9 bf5ccd07 c11c5e3a 403b5244 c03593de 4010de9a -> 403b5244", + "40ec4b6d 4074f9cf c0c49485 418e2d7e 4181ba71 40c57d2c -> 418e2d7e", + "419c6860 c0f6286e c117cb0e c123a045 41817763 40e3aa98 -> c123a045", + "40bfdd7a bfd0c748 c0d87756 40bb0187 c088c706 407f9239 -> 40bb0187", + "bc564a58 3fceab61 3efdc37c 402b30bd c1771f22 bd902cb6 -> c1771f22", + "c0ce9f32 c0960d56 c0c2527d c0db2f2e c0a16c0c 40be9663 -> c0a16c0c", + "408c6ec9 409c7435 4113174b bf97c76c 419febc8 40dbaf3e -> bf97c76c", + "c10b1401 bf426b2f 4034a4ec 416d35f3 411f330d 408a97a0 -> 416d35f3", + "4180103d 408daaca c0f89eaf 417a744b 40410346 bef02c0a -> 417a744b", + "c19d4ffd c0aac3e0 bfdaa53d c05af8e7 c17adcb9 40aefead -> c05af8e7", + "3f9ef1b7 411b7f15 40f94938 c00bfe81 40c81a14 407be596 -> 40c81a14", + "4174602b 408ba452 410f7771 40d1a6d8 c13dcc06 40338f9c -> c13dcc06", + "415fe989 40f22ca1 be2a237b 416312b5 4156de9e 3e22f7a6 -> 416312b5", + "c0fb85a6 c0ac43cc c0cbd042 bef0590c 40bb20ac 40682808 -> 40bb20ac", + "c0690efe c103fb88 c0b8cbac 4045b425 418bd46a 40228e33 -> 418bd46a", + "bfa99df2 41182da6 c0559740 4116d7e0 4118c8e5 3ff312a9 -> 4118a824", + "4178fc6d 3fc19158 408b0bfd c1817b14 c173ef38 40bcbce2 -> c173ef38", + "c1220dcc 40c06eec bfa64ac4 c183edf9 4163cf8b 407a5b33 -> 4163cf8a", + "c1040107 40e46c6f 40bb18ea c15d73c8 41916f51 40ab4ddd -> 41916f50", + "c19c36f3 c0ff4484 c02c6ecd 401e1a2f c111968e 3fb6cabf -> 401e1a2f", + "c190e3e3 3f95a22e c064defb c1884ad9 bffed5f1 bf33d394 -> bffed5f1", + "c12e9958 4113fe29 40d86abb 4092e209 41404d08 408a88eb -> 41404d08", + "40b7c71e 4101d1d0 c09ecd08 414dcacb 40c15233 40313f12 -> 414454f8", + "c00f840b c0a6c320 40d221ee c091e51e 4187f8e3 bdbb6b9d -> bf9204ae", + "4163905f 410db786 4102c08b c1612164 c17183c0 40dd864b -> c1612164", + "c161498e c093f546 bf80b77b c18faa77 4187263a 40be58e9 -> c18faa77", + "419c1b87 40bbeb7d c0a656cc 40aaf697 c12433f6 3fbdf4a7 -> 40aaf697", + "c171c081 c0bbd3db c1099aa7 c1972f34 c193078f 40cd5359 -> c193078f", + "c1239331 c0c17413 c0ae68fd 4127d3c9 c189ec7e 408b8de9 -> 4127d3c9", + "415da056 c10f1eed 411bebe8 40f550a1 c08b071a bf7d4874 -> c08b071a", + "c176e40b c09f5db0 40aeaf8a c1093307 40cdba66 40e9264c -> c1093307", + "c113cb36 c0ade535 bfcc375f 419e83fb 418076a0 3f8009ee -> 419e83fb", + "41854525 c1198f6a c0b2f054 3f26195e c1681761 3f8d65b6 -> c1681761", + "4151f95c 410531d9 40070057 c08479c6 3fa1c37b be5b0e91 -> c08479c6", + "c1174f1e c11f9817 c0889bdc c123bc0d 40f6b1cf 40893407 -> c11d11ef", + "c195da2c 40f4fb83 bf86776b 4147609d 4080082c 40c9407b -> 4080082c", + "c094e19c 4052567f 40b5891c 3f973587 3f8828fc 40cce1f6 -> 3f973587", + "c1124b39 c0890b38 bf48c96c 3eab2c64 c11cdd69 40cb1bf3 -> 3eab2c64", + "c0aa78f8 40ff4868 3f396913 418aa32f c0caa6da 408e0a63 -> c0caa6da", + "40e42081 bfe1e560 c05f17af c14446d6 40199a9b 3f23f4a2 -> c14446d6", + "c1638d39 408ef2a2 40fcb023 c1772cba 417c4504 40bdefe8 -> c1772cba", + "c12d64b4 40b01beb 40a216f0 c08eeb95 41141e3b 40cc0ed4 -> 41141e3b", + "40c6bffd 40d72f45 c046a597 c15dca0d c1963341 40c40acd -> c15e692a", + "c146254b 4114f4a5 c0b40ec2 40532058 41535ef7 40885229 -> 41535ef7", + "c0d8680b 40cfc8e5 bde41bae c16b7f9b 40c1a0d6 40bc9eef -> 40c1a0d6", + "41759376 40cdb84b 40732b1b 417de585 411ebc10 bdc63a47 -> 417de585", + "40835c06 3fcee204 c10b631e 40ab13dd c0450879 403d1dbc -> 40ab13dd", + "c0d77e74 c0ca7b44 c0854b5f c15d96aa c18203cc bf3e0b33 -> c15d96aa", + "c178fd74 c04dd4fd 409241e7 405b5651 419a2d1e 406ae936 -> 405b5651", + "4161e109 406fdaf6 3ffdadc5 40482858 c06d3cb3 3f0e11fb -> 40482858", + "c0d20339 403e4f30 40dc2498 c08af77d c126774b beffdaa6 -> c08af77d", + "4146c959 c0eb24c0 408ec4ee 414a6f6a c1061281 40de4c22 -> c1061281", + "411f1e8a 4090fda9 3ff37f85 4101df21 c1890d66 40c8f8ea -> 4101df21", + "c09e7826 40815dbc c0b76663 415924a2 408b147e 40db1633 -> 40906872", + "c10a56ca 40c49b5e 3fa06961 c1848c97 40b9257f bedff280 -> 40b9257f", + "c0ee6bcc c0eb62b2 411fac0d 418d55e8 c1193584 40a4ba5d -> 418d55e8", + "c13bec87 c100a25d c043d11d 3fe47b04 c187e093 405e5649 -> 3fe47b04", + "40cab131 c001b78c c0f06a8e c18739dd 418d0adc 401132af -> c18739dd", + "c1384910 40301a7f 408e9e61 c19e75d6 4186ec9e 3fdaaf29 -> c19e75d6", + "c04500c2 3eef88fd c0d56147 413bf528 c1882d55 40d070db -> c0204a40", + "c1162bd4 40809c26 3fdf86a1 c13682bc 40fe960f 40d5fb0b -> 40fe960f", + "bf73b9f4 c00dbb2d 401aa60a c031f78a 414839d9 40dcb93b -> 3c1f3f00", + "411fbec9 bf7b0342 4005b7a0 4162ed1c c02bbe40 bf7ba5e2 -> c02bbe40", + "c119e5cc c09892a3 3ea95a16 be1ce4c2 3ffec85e 403efb4f -> be1ce4c2", + "3fdd2cec c0b334a7 c0750b28 4100f057 c097b619 40621d05 -> c097b619", + "c18f2b6d 4111e3c2 c0aded8e 3e0264fd c0c33015 40f74c0c -> c0c33015", + "c0c19fa1 3fddf070 40d038b2 41287165 41557620 40ba80ad -> 41287165", + "40a845a7 408bf53c 400fe306 c0b8c66b 41411073 40a9f766 -> c0b8c66b", + "c0c66d15 409f04a4 bdf53f4e 416b3d91 c084ff94 3faac432 -> c084ff94", + "c0b4b4c0 40df3380 40948582 c18e7ab3 40d7ba49 40ef7c55 -> 40d7ba48", + "c0a882fb c0c496c1 40e7bc39 c10ad383 c0faa96b 40b38e83 -> c10aa8ec", + "41888d5c 410d8a14 40fe2611 c151fda9 c11e5ba2 3ff97fe5 -> c151fda9", + "40de4704 4008f2d5 4100d12e 41497b5c 40b41f5d 40e98a53 -> 40c89184", + "417c9063 c01d4b34 c0e53266 413534f7 410479ff 3f3c2787 -> 413534f7", + "c18760e0 c0889978 3ec02234 c125b2ec 413adf80 3ffe2849 -> c125b2ec", + "3d10d103 4112ca1d 40967fc2 4185da6e c0a4c96a 409c42c5 -> c0a4c968", + "c1219d5b c0ebdd1b 40ab4779 40ea4d18 c1177e87 3f744c52 -> 40ea4d18", + "bf90bed2 c03d9dd2 c0b068f0 410d75da 4042a34a 401eec52 -> 410d75da", + "418b9002 409147df 4115145b 41437bd6 c12a8c03 40b4a3c3 -> c12a8c02", + "41047946 c09e4857 4004e89b c0e55639 40319baf 406ac630 -> 40319bae", + "3d9d61a6 c0dda6e9 40db2f33 4093568c c19f49c6 40e7098d -> c0fec392", + "40d1b4f3 4097f7f1 c10aab47 c15d05f6 4197fbbb 3d7a3b1b -> c15d05f6", + "c018956a c015dd27 40b3f5c7 418434db c18c53a0 40cf7e4b -> 418434db", + "c12004ad c0e803f6 4117168a 402f25c6 40d97964 3ca30191 -> 402f25c6", + "c0afb628 3f94161e 40f596c7 bf8db569 c10643f7 40b1912f -> bf8db569", + "415c31e3 403ce3b6 bfc6dfe2 410dd0c4 c0ed8488 40d856bc -> 410dd0c4", + "c018bb94 40a5250c 40d9e49c 4118d3c4 c0504f82 3fa0e1c6 -> 4118d3c4", + "413719f7 40f8e8c6 4105f1a1 419667b7 c0e4c67e bf55896d -> c0e4c67c", + "40d076dd c0cbe1e6 40e83501 c152ce0f c1035129 408493eb -> c103ff8c", + "c1890250 3e85cc8e 40b13987 c05dcb24 c153e175 bf0e240c -> c05dcb24", + "c0c1086d 40e73b94 c0a41839 c1748655 3c017ad6 3e0a4925 -> 3c017ad6", + "40815436 c1007b39 4081ffd1 4137cf02 c175c43e 4089a8eb -> c175c340", + "c14d05ee bff394a4 40f2cc8a 413e0f9d 40549513 40c9a4c3 -> 413e0f9d", + "c19655da 40b5e407 4081b18e c185a8a2 418f594a bf07602b -> 418f594a", + "4030e530 c032d759 40b6ec3b c10399d6 c14a743e 40a9da75 -> c136ca69", + "411d4428 c0b924ff c0e587ba 407d593a c0252c2c 40cbfb78 -> 407d593a", + "410bfa69 c0961e21 bfa94828 c14c7bbe 4174c70b 4054fdb5 -> 4174c70a", + "40a17d1a c0b5f4d6 c10ed1e1 40b2d0c0 41886c13 3ff00e04 -> 40b2d0c0", + "c0fe148a 40cd23dd 411bcbe0 c1360a16 40a9a740 408d027f -> c1360a16", + "c142d748 4004da1a c03c5f40 c14e1a99 3fe6213b 40868f65 -> 3fe62138", + "bf76b28b 40595a0e c07f0544 c122399d 40decfd8 403f2dd6 -> 3f367f40", + "c0d75208 408c5727 c095053c c0894494 c16b6dd4 405ec390 -> c16b6dd4", + "c1757893 c118f6fa 40e75ff5 40dcc863 c144b987 4094a739 -> 40dcc863", + "c18e9ad5 c04535bb 400c3d49 c1936129 3f3eb4d9 3fbd2c5f -> c1936129", + "418d7162 c11ac123 3f8bce48 41960b9c 400d79fe 3f691952 -> 400d7a00", + "c15b3183 40cc58d1 411f74b5 c0bd2373 41978522 409f7b55 -> c0bd2373", + "c16bd95b c0de3127 bff2ab58 409af61d 40dc2d96 4008ecb5 -> 409af61d", + "c132eee8 410f3443 c00991ef 408a2516 40da7563 40c266f6 -> 40da7563", + "4199f301 410d6b74 3ffd8d80 c17fa304 415026d0 40cd210b -> c17fa304", + "c0683bc5 c0fa07b9 410c9cbf 419b701a c0b8ef31 3fc291b8 -> 4176e95c", + "c0a46654 c0653447 404bddd5 c144d56f 41482cdd 40ffcbe0 -> c144d56f", + "c143ca8c 4110d0bd c11aac6a c0bce7c9 c13a7034 40cef432 -> c13a7034", + "4134acff 40150a2b bf134cc1 c18f61d0 c066529c 3f463eaa -> c18f61d0", + "412d4193 c0840187 bf306762 c09b6b9d c13ac17a bf1f2b50 -> c13ac17a", + "4086ae23 c1024c86 c06f01d2 c1174fc7 c0dd619c 40572898 -> c0dd619c", + "410679e7 3fd337c0 be730041 c1331dbb c174c043 3e48a77f -> c1331dbb", + "419237d4 40288e38 406c015d c16e1f6d c0fa185d 405cdee6 -> c0fa185d", + "c1982971 4113ec3f be31afd5 be8bc6cc 40e49216 409f82e2 -> 40e49216", + "bed29ad9 3f332ea8 40cbdabb c15180cf 41419382 40f42336 -> c15180cf", + "4131232d c0dcf1e6 3fffbe1e 410b5293 3f9ac0e6 4088cc4c -> 3f9ac0e8", + "bfa3fed8 403adb97 40f18169 c149f871 bebf83a3 40b54147 -> c149f871", + "c19cce25 40d2c7a0 3fe8a15a c0ffe340 c0a4312b bf22428c -> c0a4312b", + "40459f5e 40adb228 40d4d912 c16d8357 415a8b15 3f1e349e -> c16d8357", + "417a04f4 400b9ff0 c103d447 4162ccac c19c8729 40963f63 -> 4162ccac", + "c184147d bfe0871a 3feabb23 c11ed451 c1455c32 3fb4890c -> c11ed451", + "c1926b52 40da4df2 40b73e0d 41618f6c 41155c04 40288122 -> 41155c04", + "c0308aee 41016fab 3fda4ba4 c042391f c17e9f06 4082b38e -> c17e9f06", + "412fd9dd c0798117 402d86cb c182745f 41718189 409cfb75 -> 41718189", + "405a0f30 c11a5cbf 40cd00f3 41344364 c141430e 3e393923 -> c11f05fe", + "c180720b c102ad33 4007ab51 bfcadfca c086da74 be4a29d1 -> bfcadfca", + "4087c92e 40a437d5 bf98b43a 40f145b2 c182d39e 403f269d -> 40c83ee6", + "41859084 c00f64d5 bf01cd02 41920e56 c12edecf 3fa0deda -> c12edecf", + "40a1244f 40ec2210 3fe23826 c175bbcb c133024e 40964c4f -> c15c8b4c", + "410ad255 c0187734 4107c7aa 41815f6b 40a136d3 40f4879c -> 40a136d4", + "c1046406 40a89ac0 c002eb97 417c8be5 418362b8 40a8192b -> 418362b8", + "4167e5da 40a2fc0b 3f335932 c18485d1 c089f8c4 40c0e0af -> c18485d1", + "41016991 bfc3c88d c0d100e7 c0c67eca 411f128b 407fe78d -> c0c67eca", + "c0c0dfd3 4116eaae c0abf05b c1790922 be02e098 3f87724b -> be02e098", + "c0e194f2 c02daa8f c0e06eac 413c8d6a c180b289 40c3b63c -> c180b289", + "40f1abeb c101eb56 c1070608 414cca5e 411019d3 40db6b19 -> 414cca5e", + "41722383 bf1b1198 411f9041 40959edc c0fe70fa 40c07ec2 -> c0fe70fa", + "4058938a 410e30bd c10abe5d 4103832e bf8ce9b3 40838987 -> 40c18062", + "c189d2a6 3f93df20 bde1561b 4143e49e c12d13bb 3fdd6e22 -> c12d13ba", + "c0ee62a7 40d8e66d c08809b5 c197e846 c11db518 40fc61a4 -> c11db518", + "c105ead0 c068f502 c0539bd6 41044d26 41721f60 40fea11a -> 41044d26", + "be2ae593 c0955b5a 410f6b6a 41895ad7 c01b70d8 3ed97acb -> 4142bc52", + "417e5867 bf523d97 411f8c42 c0b61226 419d24ab 3ea2793b -> 419d24aa", + "41296e35 40fd3b81 40fa0fe5 c0256e6f c14a1e40 40b46f15 -> c0256e6f", + "c19732ae 40add266 c101efee 40747063 c1795e40 40893c6f -> c1795e3f", + "bee8ff27 c0c63712 40730479 416ed2c9 407ad100 4081c602 -> 41034048", + "c16e8bbf bfeded36 c0c36db4 c1915730 4003b700 40fc6f8b -> 4003b700", + "3ef1aa17 c11ee929 c0022d0a 418dc6b7 c0255b3c bdb1c826 -> c0255b38", + "40963fa2 40425c7b 410ea49b c1000cde 41840949 40a3c264 -> c0502080", + "416ab896 411018bd c0daae71 c080c388 c183bbdd 40bcdc5e -> c080c388", + "4125516e 407899a0 4081df72 c19795e6 40a2ad30 40d53f17 -> 40a2ad30", + "c188f439 3f638e9d 40b14c3c c18df24e c159c9dd 3fb2f674 -> c18df24e", + "c185326f c11a8ae8 40561f55 403fdea0 4141cea5 40bc1c35 -> 403fdea0", + "403e55f7 3ffd3b78 41177932 c119db89 3f08cd1b 40a4de14 -> c1120249", + "4133a990 c0ef0f01 40d928a5 c02ddb62 40970228 bef8c520 -> 40970228", + "40407018 3fadde1a 3fb4a4e8 c0e7cd02 c13cfaba 408e455a -> c13cfaba", + "c09ed7c3 4119ec6a 406f9cca 40f72f03 c148cf6e 40076f34 -> c148cf6e", + "c19021a9 bfe6c61f c11df4fe c17985df 40fe46bd 409ac024 -> 40fe46bd", + "3e975862 402b0784 40e0fbbf 4169c8f3 c14fe19a 40f1ad48 -> 4169c8f3", + "41252ad6 40998f2d 3f5e16b9 418229a5 40d13999 40efb6fd -> 418229a5", + "c082f5d9 c1017a3c 3eb6712d c07b8ef2 418473d6 3ec2e0c2 -> 40afe89f", + "c1856300 c0eb54b8 c0db6745 c186921a c19278c8 4091e76d -> c186921a", + "410b8521 c0a03515 3e603cea be7cf2f0 c19e4903 408c1218 -> c19e4903", + "41155eaa c0e5cdbf c0c5e346 40a646d3 c190caa1 bf41d0b5 -> c190caa1", + "c1933d07 404e24ef c0f45e3e c0b1fe40 414044f0 be940c7d -> 414044f0", + "41893758 bfe7491a c0399e70 c0e588cb 40f83089 408a245e -> c0e588cb", + "bf8d09bf c030a9ec c0af0f80 c026146a c160a342 bf7f0dde -> c026146a", + "4010a84e c0b32053 bf2c2615 4126b0d4 c11c3bda 40dcc69b -> c11c3bda", + "c14780a5 407f0035 c016795c c1902b2f 3e173218 40a332d1 -> 3e173200", + "41822d47 408c138c 3fb69f06 419bc18d 4004a6f1 3e91e980 -> 419bc18d", + "c15e80c3 c03829e0 c0f76bee c1918e7f c002b79b bed09849 -> c002b79b", + "41269a93 c0bc1cb5 410dd57b 4086f125 beb71310 40e86c88 -> beb71310", + "c15807a1 40c7c762 c0ed6158 40e82428 41389df6 40ad924c -> 41389df6", + "412f9052 c0857bf0 41128ba4 c0381c20 3ec2598a be732df9 -> 3ec25988", + "4197329e c06681f4 41102904 41500d61 4046a0d3 bf36f9bb -> 4046a0d4", + "be8d31a1 3e9e5dc6 c11e942e c1286af1 c050b597 bf0291b7 -> c127518e", + "c14598b4 c0d7fcfd c0c74c64 40c2ae70 411516df bf3c44d5 -> 40c2ae70", + "c14059fc c0e0e3a0 410f1549 c18d737e c15c5e14 40d195be -> c18d737e", + "3fdc48f8 c0cd9bb9 407c90d4 415e480e c184096c be04f454 -> c14e82ae", + "41905bf0 c017ede6 c044c9f9 40dd5efd c19a959c 40883fea -> 40dd5efd", + "403be0cb 40b27b32 40884449 408602e0 c0c7b76a 3df0869b -> c0c7b76a", + "bfb92731 4101a00a c0c0648e 414c0276 c08c7e3d bf739553 -> be2da980", + "415d8455 c081ece8 c0d6a6bf c19404e1 40ee67f5 401620fa -> c19404e1", + "c1632c4a c02e6c15 409650e9 4183c15f c183841a 40dc3d5e -> 4183c15f", + "c1071eed c0fd1a5d 407a70b9 c13ea40b c0cd33d3 3f5b5567 -> c13ea40b", + "c117eabc 410b23d1 4109bdb5 414d47e9 c175bdb8 40b98ef4 -> c175bdb7", + "4137d89a c0617bd9 c08dcec4 c0a68df5 c161d257 404a83f5 -> c0a68df5", + "c0ac112a 410432e7 3fa63330 c0c44887 415638d9 40cf4f5d -> 415638d8", + "409e5622 c0862d0b 3fb4519c 3c632342 c11f6c1c 40f3a0ed -> c11f6c1c", + "4125dda6 c0f9a2d6 40a5c743 40df3af1 c16c489a 40b58052 -> c16c489a", + "c19a13a3 c11985b0 c027bdb5 c126b1ef c19be56e 4053b0ea -> c126b1ef", + "c0495f16 c112a9e3 c0bb917f c008d73e 411149ed 4041a8b4 -> 411149ec", + "40d7bebb 40eca274 3d3b48bf 418039f4 409787b4 3e5bff71 -> 417c6dd6", + "3f06c77b bfadbf5e 40df4318 c1708d61 419ae586 40d40a40 -> c128e834", + "c09dada5 c0061b36 c116e862 bffb37a7 c0f26ec5 40c9d855 -> c074e237", + "c0eb5767 c0d1c5e4 406cc932 413c70f2 40b9f066 403d8988 -> 413c70f2", + "4129331e c076023f 4033e30e bf80394d 4134a29c 40e340e1 -> 4134a29c", + "4186f2f6 c11d6a49 40dc4749 c1855078 c18e1d09 403d52f7 -> c18e1d09", + "c0d5c772 40220aca 4115aea6 c1424647 413879ac 405e2652 -> c1424647", + "41248b18 405f2aa6 40f60ed4 c0897adb 3e4549a1 40d7e546 -> 3e4549a0", + "4124cc2b 41051ab2 c10b3030 c0c0280b c06cfcec 3f0b51d1 -> c0c0280b", + "c173e952 c0fe1e80 3ed26398 c17786c8 c1983bbd bf1385be -> c17786c8", + "c090caec 406b7dbb bfe80858 412cd02a c109c949 3fe6e6a4 -> c109c949", + "41054dae be32f259 41195d35 411ac397 416921d0 bec108e6 -> 416595a4", + "40fcd430 bf404fc9 c117af0d c1093a6b 4196a864 3eae2e62 -> c1093a6b", + "c17b71f3 bdca4836 c0395d30 4007cc25 41249710 40ac9f7d -> 41249710", + "419a4499 40f72bec 3f4743b7 4049d630 4186d27a 40e69d7f -> 4049d630", + "419f9cfd c0d94fb2 bf8a9a19 413321a1 414a93b7 40fb2dbf -> 414a93b7", + "c1370f74 403f8998 4036f63a c12ef132 40fd0411 3eb5c1aa -> 40fd0410", + "c10564e3 c0fd667d 4109be90 c1265530 c0c15eb1 3fe35fa3 -> c1265530", + "be6267b2 41188a7e bfc0391f 414ce558 419ccfce 400575cc -> 419ac90a", + "c0bb5bd2 c11e3f16 bfd5e108 412feea8 40acc0f7 bedf606a -> 41045e5e", + "415e06e8 c0fc2ede c05cbed2 4090d760 419da163 3f902a72 -> 419da163", + "c17227a5 40b80724 c1056239 c0b8c498 40aaefca 404e8bba -> 40aaefca", + "3e9d9881 40dae5b8 c109931c c086a9dc 416f1cee 403485ce -> 404b57f8", + "c115e57c c0eb7bf3 407bd368 c00a4b6d 419ab8a8 3f9efa7e -> c00a4b6d", + "c06e00e6 409a602e 411dd12f 418cfaf7 418fe2f0 bd16bd3e -> 418cfaf7", + "c18e3c96 40e71cc0 4035b58b c0a90c8a 4112916f bdff2140 -> 4112916f", + "4126e268 befe2cf6 c0a6700f 3feeb64b c10ba8cd 4053677e -> 3feeb64b", + "c12049d2 c1038a23 c1017b5e c1885d0f c11f0abb 408892db -> c1885d0f", + "c0e9e7a2 411d27f1 3fee393d c1255ec3 40b740ff 40c56773 -> 40b740fe", + "c15ce2a4 409fee29 bf9ca17f 3f9362aa c197768e bf16e59e -> c197768e", + "c08d5b73 c0b61f00 bfd8e3f3 c199ba2b 41971154 40d79ada -> c12127df", + "c12efc84 3f7ec5de c0bf0299 412258fa c13695e6 40b46f7c -> c13695e6", + "7f61b1e6 7f61b1e6 ff61b1e6 00000000 3f800000 40800000 -> 00000000", + "7f61b1e6 ff61b1e6 7f61b1e6 00000000 3f800000 40800000 -> 3f800000", + "4109cb5c c106dcd2 c0f083bb 3f17ffe1 419d461d 40a00000 -> 419d461d", + "c161a920 c1031c9c 40498e9e c08f2c1a c11690a7 40800000 -> c08f2c1a", + "40bf329f 410ee709 40a511dc 3f9934b0 418594fd 40400000 -> 416d589e", + "40d2d558 410defb7 40d73ef1 415effc7 412729b1 40000000 -> 412729b1", + "413f59fe 40c2f7ad c0b9963e 418df2f8 40766576 3f800000 -> 418df2f8", + "bea6a59f c083b40b 3df3a697 417341f7 c0c8f1f4 00000000 -> c0b3d106", + "c0861533 40544f60 3f8cdfad c125223c 415d0dbf bf800000 -> 415d0dbf", + "401af2b3 c11d51c1 40d7c0dd c1908ed8 405fcb99 c0000000 -> be0bcb80", + "411c9bee 3f612cc9 c106ed43 40b8b4ac 41832c78 40b3291f -> 40b8b4ac", + "c02fd332 c0c92fd8 c0d8b4cd 408a5dac 40190c69 3fd75cf0 -> 408a5dac", + "c092ab40 40fc6639 bfcda982 c0d0e479 4107aa86 401338db -> 4107aa86", + "c199ac1c 411a64aa 40f1a477 c1530825 413ba6d2 4002b61a -> 413ba6d2", + "4199ab11 3f3fcf94 c0b0b9e1 3fba7fed c165371a 40998ea8 -> 3fba7fed", + "c101ccd4 40ec2892 40db2669 c070c4e8 c1456f8c 400ab114 -> c1456f8c", + "c19e3852 c099cf29 c11acc7f c1845f6f 41247653 3fcdceca -> 41247652", + "40900b80 401b3f79 c0b23b8c c121f5a2 c13bc426 bee89d5c -> c121f5a2", + "c11b0290 c0ae8364 c0ae8364 c10f864d c12c42de 40ed418c -> c10f864d", + "c184c222 c0b2959c c0b2959c 41890e89 417b03ba 4014730f -> 417b03ba", + "40f0cb6a c0835505 c0835505 408d5808 c18394e5 3f833b5e -> 00000000", + "41236564 409aebca 409aebca c08cd510 40c19535 40d1e8e9 -> 00000000", + "3fcdd5ed 40121319 40121319 c18ce964 bfb2cddb 4087ae3a -> bfb2cddb", + "4170db61 40ab054b 40ab054b 40a13160 413846f6 408ddf42 -> 40a13160", + "c18adbd8 bfdf3297 bfdf3297 bf7dd069 c15956ef 4051a02b -> bf7dd069", + "c0b48457 40934faf 40934faf 40908d6a 413428da 40b9229e -> 40908d6a" + ] + }, + { + "function": "cycles_map_range_smootherstep", + "node": "ShaderNodeMapRange SMOOTHERSTEP", + "cases": [ + "00000000 00000000 00000000 bf195336 c119b4cb 40ac8b5c -> 00000000", + "00000000 00000000 3f800000 407f51e6 418c2deb 40a9f449 -> 407f51e6", + "00000000 00000000 bf800000 c18aa670 4130926a 4010497a -> c18aa670", + "00000000 00000000 3f000000 415e0d65 4170a455 3f389a8c -> 415e0d65", + "00000000 00000000 bf000000 414094fd 40eb88f5 bf1fea85 -> 414094fd", + "00000000 3f800000 00000000 40ee70d5 41232fe8 40c26996 -> 41232fe8", + "00000000 3f800000 3f800000 c18c7804 41995da2 404b3b85 -> 00000000", + "00000000 3f800000 bf800000 40cd1ffa 3f319e98 40d2884f -> 406353cd", + "00000000 3f800000 3f000000 4159fae8 bff8676b 40e8f5f2 -> bff86768", + "00000000 3f800000 bf000000 410d8dc9 c13bf272 bf183625 -> c0ed95ca", + "00000000 bf800000 00000000 416046a7 40734764 3fd68a45 -> 40734764", + "00000000 bf800000 3f800000 40ac1bad 41321ec1 4056a441 -> 4104164c", + "00000000 bf800000 bf800000 c0354aa3 c0b133da 403ea084 -> 00000000", + "00000000 bf800000 3f000000 41443fd1 c107e48e bf35e761 -> c0845e36", + "00000000 bf800000 bf000000 41562b10 bef01474 40a33e4b -> bef01480", + "00000000 3f000000 00000000 4166c1b9 414eb94e bef5128b -> 414eb94e", + "00000000 3f000000 3f800000 c13ecd82 c08ef5d8 3f7d7e04 -> c13ecd82", + "00000000 3f000000 bf800000 402450c8 c12547a0 3ffbd309 -> be0ec7c0", + "00000000 3f000000 3f000000 413fd659 410a110e 40a4e53b -> 00000000", + "00000000 3f000000 bf000000 c0656ece 416e63db 40ca5b26 -> 40b50827", + "00000000 bf000000 00000000 c16f2508 4039e927 befd09e2 -> 4039e928", + "00000000 bf000000 3f800000 400043b8 c126b7e8 3f6b54af -> bf1a771c", + "00000000 bf000000 bf800000 4122c809 40976a69 40d91a18 -> 4122c809", + "00000000 bf000000 3f000000 4191bfdb c0766d8a be8364e3 -> 40e5e454", + "00000000 bf000000 bf000000 4044694e 4190e80c 40d54928 -> 00000000", + "3f800000 00000000 00000000 c195827c 40ec3cc7 40053582 -> 00000000", + "3f800000 00000000 3f800000 41926591 3f7068b4 40d0ff2e -> 3f7068c0", + "3f800000 00000000 bf800000 c1006519 410642a6 40f794fa -> c1006519", + "3f800000 00000000 3f000000 c152a6e9 c17b9382 3f36d683 -> c17b9382", + "3f800000 00000000 bf000000 4105b810 4156d22b 3fb941c7 -> 4105b810", + "3f800000 3f800000 00000000 c18b2242 4139215f 40cb8ec6 -> c18b2242", + "3f800000 3f800000 3f800000 c109d27d c172467d 40aec57a -> 00000000", + "3f800000 3f800000 bf800000 c178fff1 bfd60877 3ff22233 -> c178fff1", + "3f800000 3f800000 3f000000 be4d1aef c106749a 3faf8163 -> be4d1aef", + "3f800000 3f800000 bf000000 419b0651 c1784d4e 3fc14abf -> 419b0651", + "3f800000 bf800000 00000000 c086db3c 41478206 40258106 -> 41478206", + "3f800000 bf800000 3f800000 c1885d59 40b42f9f 3da8bbb5 -> 40b42fa0", + "3f800000 bf800000 bf800000 c0cc21d3 418e98aa 3ec7c063 -> 00000000", + "3f800000 bf800000 3f000000 3f460c80 41078840 3fcc5e4f -> 41078840", + "3f800000 bf800000 bf000000 3dfa9a5b 417e5d77 40871b3c -> 417e5d77", + "3f800000 3f000000 00000000 4027f054 c10c8ff4 3ec9592a -> 4027f054", + "3f800000 3f000000 3f800000 c162d0f2 4142f0f6 40e2562f -> 4142f0f6", + "3f800000 3f000000 bf800000 c0f18ebf 40bbf0e0 4090ab0e -> c0f18ebf", + "3f800000 3f000000 3f000000 405f24e0 418d335b bf296379 -> 00000000", + "3f800000 3f000000 bf000000 4144baaf 41859d7e 40748cbe -> 4144baaf", + "3f800000 bf000000 00000000 c13db05e c17b304b 40a935f6 -> c17b304b", + "3f800000 bf000000 3f800000 4079e3bc c154c9d1 40fb8b2b -> c154c9d1", + "3f800000 bf000000 bf800000 41381e15 41888799 40b119ce -> 41381e15", + "3f800000 bf000000 3f000000 c0a4bd85 c14be31b 40e7265f -> c14be31b", + "3f800000 bf000000 bf000000 c19f65e6 c16a9d1f 4081d4d1 -> 00000000", + "bf800000 00000000 00000000 41223df3 4176f765 409daa14 -> 00000000", + "bf800000 00000000 3f800000 c112614d 413e2690 40725235 -> c112614d", + "bf800000 00000000 bf800000 c19b6807 3e3d720f 40cf6047 -> 3e3d7200", + "bf800000 00000000 3f000000 4147e39a 4087ff78 3f1397c0 -> 4147e39a", + "bf800000 00000000 bf000000 4140ca15 41673c3a 402c4c36 -> 41673c3a", + "bf800000 3f800000 00000000 407ae149 417f7e48 40de7b9b -> 417f7e48", + "bf800000 3f800000 3f800000 409b12ce 415a3ddd beb7abbb -> 00000000", + "bf800000 3f800000 bf800000 410002bf c0b7223c 40369b38 -> c0b7223c", + "bf800000 3f800000 3f000000 c146186a c14845f7 409ff092 -> c14845f7", + "bf800000 3f800000 bf000000 41964e4b 40480af6 403cdff4 -> 40480af8", + "bf800000 bf800000 00000000 c124b64c 410d881b 402652ce -> c124b64c", + "bf800000 bf800000 3f800000 4174ddbd c1180b85 40d102dc -> 4174ddbd", + "bf800000 bf800000 bf800000 c10d14aa 409a294a 40dacd58 -> 00000000", + "bf800000 bf800000 3f000000 410ec51a c119f89d 40a28b8f -> 410ec51a", + "bf800000 bf800000 bf000000 c19d644a 412819da bf596ea9 -> c19d644a", + "bf800000 3f000000 00000000 3f46edad c152c624 be8da0be -> c152c624", + "bf800000 3f000000 3f800000 40aa7876 c1873e2b 3f1a9d10 -> 40aa7876", + "bf800000 3f000000 bf800000 c1446399 415a99db 4025ed1f -> 415a99db", + "bf800000 3f000000 3f000000 3c06a168 40e17a20 40f0f6b2 -> 00000000", + "bf800000 3f000000 bf000000 4184f102 41845873 40dc6b23 -> 41845873", + "bf800000 bf000000 00000000 4180aec1 c1464956 3f18c607 -> 4180aec1", + "bf800000 bf000000 3f800000 c110b474 3f483c08 40dd2300 -> c110b474", + "bf800000 bf000000 bf800000 4061581f 416c16cc 3fffc760 -> 416c16cc", + "bf800000 bf000000 3f000000 413672c8 c10ed29b 40c91798 -> 413672c8", + "bf800000 bf000000 bf000000 418576c2 c0ca1d1c 3f25c81a -> 00000000", + "3f000000 00000000 00000000 4100073d 41279cdb 4098c35a -> 00000000", + "3f000000 00000000 3f800000 4005b1be c188d7bb 3e121fb9 -> c0f04307", + "3f000000 00000000 bf800000 41542e7c c0c552ec 40fd4e5c -> 41542e7c", + "3f000000 00000000 3f000000 c0d7d683 4199dc58 40e626e4 -> 4199dc58", + "3f000000 00000000 bf000000 c146b9b3 414d9b60 408ab7bd -> c146b9b3", + "3f000000 3f800000 00000000 c185efb5 c0c89536 40d93918 -> c1381502", + "3f000000 3f800000 3f800000 40f6e8da c08f392a 401de358 -> 00000000", + "3f000000 3f800000 bf800000 4190896d 41973dbf 40f6efef -> 41913b17", + "3f000000 3f800000 3f000000 41792e11 c13a3967 403de1ed -> c13a3967", + "3f000000 3f800000 bf000000 4177f6cd c127ab5f 3feadbba -> 4120bb7d", + "3f000000 bf800000 00000000 c0c2234b c19e960d 3f86792f -> c19e960d", + "3f000000 bf800000 3f800000 c05f9234 c0aabd9f 40da88f3 -> c0a4a34f", + "3f000000 bf800000 bf800000 416049e2 c15a6499 409527b0 -> 00000000", + "3f000000 bf800000 3f000000 409b731c 40f262f0 bf605be1 -> 40f262f0", + "3f000000 bf800000 bf000000 c16b5788 c187f8fb 40fa68c0 -> c187f8fb", + "3f000000 3f000000 00000000 40d741f1 416c1283 40e51701 -> 40d741f1", + "3f000000 3f000000 3f800000 c0a22c9c 4185c6b3 406fc81a -> c0a22c9c", + "3f000000 3f000000 bf800000 4062c6f0 c19f6e03 be94ebbb -> 4062c6f0", + "3f000000 3f000000 3f000000 c02014c8 c0c45daa 4097fd46 -> 00000000", + "3f000000 3f000000 bf000000 411212bb c18cc3a6 40cd4479 -> 411212bb", + "3f000000 bf000000 00000000 c19d0ee7 413a1d20 3fe7d805 -> 413a1d20", + "3f000000 bf000000 3f800000 c0c0ccdd 40eee469 bf61f3b4 -> 40944a47", + "3f000000 bf000000 bf800000 3ffe7f16 c154bcc9 40b48da5 -> 3ffe7f16", + "3f000000 bf000000 3f000000 c1902845 3e8e3535 40ab3f5b -> 3e8e3540", + "3f000000 bf000000 bf000000 c1743b7f c102d493 bf42c08a -> 00000000", + "bf000000 00000000 00000000 c1121f62 41891aea 40ebd3ff -> 00000000", + "bf000000 00000000 3f800000 41929a31 415b9e15 40bbb2a5 -> 41929a31", + "bf000000 00000000 bf800000 be2cf1d1 c185cd74 409c20aa -> c1072757", + "bf000000 00000000 3f000000 406fb07c c0184d95 4075ef2e -> 406fb07c", + "bf000000 00000000 bf000000 4140719d c15ae52f 3d60cb24 -> c15ae52f", + "bf000000 3f800000 00000000 4160a9e4 4190e5d5 3ea8d02d -> 4190e5d5", + "bf000000 3f800000 3f800000 c13a71f3 419d6ae1 40949f9d -> 00000000", + "bf000000 3f800000 bf800000 3f8e8f6e 40a68a71 3fe784fd -> 4098fd93", + "bf000000 3f800000 3f000000 bfe89628 40f640e5 4020287a -> 40f640e6", + "bf000000 3f800000 bf000000 410ef3d8 41639953 40e7ee62 -> 41639953", + "bf000000 bf800000 00000000 c064ab7d c0e0342d 3f3d9051 -> c0a944f6", + "bf000000 bf800000 3f800000 40279515 418a1fa0 40d54b96 -> 40844f2c", + "bf000000 bf800000 bf800000 413c6b0f 40e6b47a 401d0e73 -> 00000000", + "bf000000 bf800000 3f000000 4198d346 419c54db 40c19047 -> 41998fa8", + "bf000000 bf800000 bf000000 4054ccc9 3fcc1030 40b9002a -> 3fcc1030", + "bf000000 3f000000 00000000 c0a7a6f1 c181e8d3 be3e92a0 -> c181e8d3", + "bf000000 3f000000 3f800000 c19b87e1 4166b6c0 4086671f -> c19b87e1", + "bf000000 3f000000 bf800000 bf8a2e7b 403547a6 4084aa2c -> 4000bba2", + "bf000000 3f000000 3f000000 40e898a3 416527b3 402c8fd5 -> 00000000", + "bf000000 3f000000 bf000000 414a5594 c0b3b3fe 40dd5301 -> c0b3b400", + "bf000000 bf000000 00000000 419565d8 c157cca8 40cf6aea -> 419565d8", + "bf000000 bf000000 3f800000 3f85fe4b 413e4b0b 3f97e2b6 -> 3f85fe4b", + "bf000000 bf000000 bf800000 c150a1f7 404f5a39 40e53fa5 -> c150a1f7", + "bf000000 bf000000 3f000000 415ad565 c148d290 40e57207 -> 415ad565", + "bf000000 bf000000 bf000000 c09ea224 41882aa0 40322274 -> 00000000", + "40000000 00000000 00000000 41126806 412ff472 40a2b1af -> 00000000", + "40000000 00000000 3f800000 c164d483 419fcd22 40d5bae3 -> 419fcd22", + "40000000 00000000 bf800000 c15feafc 410db0b8 40b8ae79 -> c15feafc", + "40000000 00000000 3f000000 c16b12d5 40c19e8e 3ff1d2ea -> 40c19e8e", + "40000000 00000000 bf000000 c111973b 40df27a4 40d5e098 -> c111973b", + "40000000 3f800000 00000000 413a1cc6 413de53e 407a599f -> 413a1cc6", + "40000000 3f800000 3f800000 4189a94e 419c18b1 40d79f9a -> 00000000", + "40000000 3f800000 bf800000 412b497e c1504bee 3f908761 -> 412b497e", + "40000000 3f800000 3f000000 c15f7aa8 c16b409e 40540ba4 -> c15f7aa8", + "40000000 3f800000 bf000000 c1432228 410ff935 40d46688 -> c1432228", + "40000000 bf800000 00000000 c0388ace 411def19 408e0da4 -> 411def18", + "40000000 bf800000 3f800000 c178dd18 c1093cfe 409b742d -> c1093cfe", + "40000000 bf800000 bf800000 c00b9963 c09eaed6 40ae4f61 -> 00000000", + "40000000 bf800000 3f000000 3eb8bd95 4098118c 3f9058c0 -> 4098118c", + "40000000 bf800000 bf000000 c16ada58 c13273bd 3fd051be -> c13273bd", + "40000000 3f000000 00000000 bf950db5 41763088 3fddc042 -> bf950db5", + "40000000 3f000000 3f800000 40cef7fe c0bddbe9 40f15f9d -> c0bddbea", + "40000000 3f000000 bf800000 c1188806 411f4d28 4097b514 -> c1188806", + "40000000 3f000000 3f000000 40ee7482 be6265c1 3fcbedb0 -> 00000000", + "40000000 3f000000 bf000000 415f42e0 411d7952 40c6ec0d -> 415f42e0", + "40000000 bf000000 00000000 419c2bac 402063d0 3f5cf678 -> 402063d0", + "40000000 bf000000 3f800000 c101bec6 c0d7f191 3f66c56c -> c0d7f191", + "40000000 bf000000 bf800000 c10809bc 406d57dc 40e4d80f -> c10809bc", + "40000000 bf000000 3f000000 c1304174 419d744d bf2b46f3 -> 419d744d", + "40000000 bf000000 bf000000 40d2d2fe 419d0859 408105f6 -> 00000000", + "c0000000 00000000 00000000 c009cd5d 4184a37a 40c2e350 -> 00000000", + "c0000000 00000000 3f800000 3f9e1e87 408068b3 40388d79 -> 3f9e1e87", + "c0000000 00000000 bf800000 4131a13f c1964f26 40f468c0 -> c1964f26", + "c0000000 00000000 3f000000 40cb755d c149706c 3fd69a3b -> 40cb755d", + "c0000000 00000000 bf000000 c10e778c c15400d1 3f2936a7 -> c15400d1", + "c0000000 3f800000 00000000 bdfd8a60 417fc8dd 40d6e601 -> 417fc8dd", + "c0000000 3f800000 3f800000 c003cd13 c13f2318 40e1823c -> 00000000", + "c0000000 3f800000 bf800000 417af633 c0e9748c 3d5ec6ea -> c0e9748a", + "c0000000 3f800000 3f000000 41692f21 413823a3 407fcf68 -> 413823a3", + "c0000000 3f800000 bf000000 c11b55e0 c183e0eb 40939963 -> c183e0eb", + "c0000000 bf800000 00000000 3e9e6bbe c13fc6b6 3fe1f0c3 -> 3e9e6bbe", + "c0000000 bf800000 3f800000 c16e8e20 c112c69b 3f18a846 -> c16e8e20", + "c0000000 bf800000 bf800000 c19a2914 bfdd55c2 3f67ef88 -> 00000000", + "c0000000 bf800000 3f000000 40de9002 c1579870 beeebd3a -> 40de9002", + "c0000000 bf800000 bf000000 4151fb8f 40d25fec 3e023b98 -> 4151fb8f", + "c0000000 3f000000 00000000 c1103cc9 4084364e 40c240ee -> 4084364e", + "c0000000 3f000000 3f800000 c0da099b 412eb562 bec3269c -> c0da099b", + "c0000000 3f000000 bf800000 bfb3c0b7 c191b360 40e6f830 -> c191b360", + "c0000000 3f000000 3f000000 c120a9ac 416a0714 40f883dc -> 00000000", + "c0000000 3f000000 bf000000 40e3b304 c0b9162d 3f668dae -> c0b9162c", + "c0000000 bf000000 00000000 c03229cb 40d21b56 4081f899 -> c03229cb", + "c0000000 bf000000 3f800000 4155b3b3 c194fde9 408d1105 -> 4155b3b3", + "c0000000 bf000000 bf800000 c177af4f 41848c31 40f6ae0a -> 41848c30", + "c0000000 bf000000 3f000000 c194ce91 c0806a1e 3dda7f35 -> c194ce91", + "c0000000 bf000000 bf000000 c19cb965 c16bafe0 4033aa6d -> 00000000", + "40400000 00000000 00000000 c11ff884 4128a4b4 40f337b8 -> 00000000", + "40400000 00000000 3f800000 c009f917 41737bb3 3fe3e11d -> 41737bb2", + "40400000 00000000 bf800000 3fb22b93 c13096b2 400aea5a -> 3fb22b93", + "40400000 00000000 3f000000 c1066bc8 3fb17731 40a13b5f -> 3fb17730", + "40400000 00000000 bf000000 c0dab482 419b1642 40c8a7e4 -> c0dab482", + "40400000 3f800000 00000000 c0a463cb 3e278cbb 40cb7a90 -> c0a463cb", + "40400000 3f800000 3f800000 c18c7d98 bff90d1a 3f5d2946 -> 00000000", + "40400000 3f800000 bf800000 c173ecfa c03ef283 40436e92 -> c173ecfa", + "40400000 3f800000 3f000000 c189d7f4 c1261106 40ae6c75 -> c189d7f4", + "40400000 3f800000 bf000000 c10f4f36 c13d5289 40cf3fcb -> c10f4f36", + "40400000 bf800000 00000000 415286cb c17c6e4b 403744bc -> c17c6e4b", + "40400000 bf800000 3f800000 c168f85e 41870370 404328bb -> 41870370", + "40400000 bf800000 bf800000 40bedb84 41462a50 bf28e865 -> 00000000", + "40400000 bf800000 3f000000 c122f8c4 41012c4c 40a43093 -> 41012c4c", + "40400000 bf800000 bf000000 419ceda7 c16c341a bebf0871 -> c16c341a", + "40400000 3f000000 00000000 c148470e c0b45652 be7d9749 -> c148470e", + "40400000 3f000000 3f800000 c145b7dd 41109090 bf035eb8 -> 4110908f", + "40400000 3f000000 bf800000 c0b13a7e 41472a3c 3ff1f0e6 -> c0b13a7e", + "40400000 3f000000 3f000000 c1808b8f 4183d664 40a49e73 -> 00000000", + "40400000 3f000000 bf000000 beeb8d9a 41768fd9 40fbd749 -> beeb8d9a", + "40400000 bf000000 00000000 3e8c397c 417ae2c0 404c8a99 -> 417ae2c0", + "40400000 bf000000 3f800000 bf9c006a c0ca9575 beef3e94 -> c0ca9574", + "40400000 bf000000 bf800000 411e8be8 40abb18a 40678751 -> 411e8be8", + "40400000 bf000000 3f000000 beb1b849 bf7449eb 3f339977 -> bf7449ea", + "40400000 bf000000 bf000000 409663fb c18f2e83 40441150 -> 00000000", + "c0300000 00000000 00000000 411af4fd 40d47997 40f573cf -> 00000000", + "c0300000 00000000 3f800000 c17aa662 c0c87835 40369144 -> c17aa662", + "c0300000 00000000 bf800000 40f18a4b 405e4f56 3f8a4ffa -> 405e4f56", + "c0300000 00000000 3f000000 c1794189 c1984ccd 3ece02ae -> c1794189", + "c0300000 00000000 bf000000 4107863d 40c55b53 bf6fef5c -> 40c55b53", + "c0300000 3f800000 00000000 40f55e08 c197d54b 3f957444 -> c197d54b", + "c0300000 3f800000 3f800000 c0c1bd29 c04d68bc 40faf1a7 -> 00000000", + "c0300000 3f800000 bf800000 419cc03b c0e27a21 40c73c97 -> c0e27a20", + "c0300000 3f800000 3f000000 c0c72560 c18a64f1 405ed5f2 -> c18a64f1", + "c0300000 3f800000 bf000000 40b438b3 41608a19 3f0f5028 -> 41608a1a", + "c0300000 bf800000 00000000 418901ce 412f80f2 40349c08 -> 418901ce", + "c0300000 bf800000 3f800000 4041648a 4187e823 4081cbdf -> 4041648a", + "c0300000 bf800000 bf800000 bde41524 40841b73 40c1702e -> 00000000", + "c0300000 bf800000 3f000000 c154bc6e 412abbf7 3e3fd948 -> c154bc6e", + "c0300000 bf800000 bf000000 414e77f7 c0014131 3f2e8283 -> 414e77f7", + "c0300000 3f000000 00000000 c1363544 3f51f51b 405bd677 -> 3f51f520", + "c0300000 3f000000 3f800000 c19de104 416ba647 40e7573b -> c19de104", + "c0300000 3f000000 bf800000 403bd1ca c0c405e8 408ecdcd -> c0c405e7", + "c0300000 3f000000 3f000000 bee548d0 40bb8314 40b46e15 -> 00000000", + "c0300000 3f000000 bf000000 c099ffca c18d0081 3fa66ac7 -> c18d0081", + "c0300000 bf000000 00000000 c199c442 41871077 40bb342a -> c199c442", + "c0300000 bf000000 3f800000 c076791b c0999a58 401132db -> c076791b", + "c0300000 bf000000 bf800000 4161f388 4180de3c 408c5153 -> 4180de3c", + "c0300000 bf000000 3f000000 418ff994 40411dd0 bf461718 -> 418ff994", + "c0300000 bf000000 bf000000 c139dd54 41650b61 403d8106 -> 00000000", + "3dcccccd 00000000 00000000 c0826ca2 41927522 40a22f3d -> 00000000", + "3dcccccd 00000000 3f800000 c195e23c c1850488 3fca881f -> c195bd46", + "3dcccccd 00000000 bf800000 4191b414 bf46a638 40d1d4a2 -> 4191b414", + "3dcccccd 00000000 3f000000 bf52d33a c01c7c3f 40e14901 -> bf6ade5f", + "3dcccccd 00000000 bf000000 410f0eed 40c81bb1 40e98882 -> 410f0eed", + "3dcccccd 3f800000 00000000 418e4fe8 3f3d8bfe 40ce51f5 -> 3f62e820", + "3dcccccd 3f800000 3f800000 4185c9b3 c1820d7a 40e8f50e -> 00000000", + "3dcccccd 3f800000 bf800000 4139008a 40484b51 4009ca68 -> 41021a73", + "3dcccccd 3f800000 3f000000 418045de 3fb43d29 40d94699 -> 3fb43d28", + "3dcccccd 3f800000 bf000000 c0ca3d89 c0e36373 40863b73 -> c0db67cc", + "3dcccccd bf800000 00000000 c0744056 411e83e1 40a2e879 -> 411e83e0", + "3dcccccd bf800000 3f800000 c16cc215 40c93409 4062b0df -> c012a4d4", + "3dcccccd bf800000 bf800000 41297e0a 40b020e4 404c4958 -> 00000000", + "3dcccccd bf800000 3f000000 419e61cc c165f6b1 40832a50 -> c12355aa", + "3dcccccd bf800000 bf000000 411caf03 c08e078c 400d4473 -> c08e078c", + "3dcccccd 3f000000 00000000 416a252e c17bc24c 40d06d7b -> c15f9d8c", + "3dcccccd 3f000000 3f800000 c1967a41 c0db52b7 4086dc50 -> c1967a41", + "3dcccccd 3f000000 bf800000 4164c24a 412cb0f1 40c0246f -> 415ded11", + "3dcccccd 3f000000 3f000000 c187f6cb c11fdae3 3f32be1a -> 00000000", + "3dcccccd 3f000000 bf000000 c13466b8 c016e2c9 40206855 -> c1071be6", + "3dcccccd bf000000 00000000 3f99f1ba c1823025 40d176bc -> c1823025", + "3dcccccd bf000000 3f800000 402874bf c098c9d3 bf32b117 -> 3e8fd528", + "3dcccccd bf000000 bf800000 419aa900 3f33e92d bf3cb1e0 -> 419aa900", + "3dcccccd bf000000 3f000000 41880ea1 41702926 3ff973e1 -> 417a4dd8", + "3dcccccd bf000000 bf000000 3f697d9d 40f7b903 3fcd4c3b -> 00000000", + "c00e6663 c08c124d 40d956e8 c06b5b16 410852dc 400ccd4f -> c0426666", + "c19afabe bf8877c9 40b448b2 c03a788a 419d5dea 40d1ed6d -> c03a788a", + "40b14236 c0da6536 3f7add44 41181534 410d1b1e 408e8aed -> 410d1b1e", + "410e58eb 40be16f5 4044150e c132cadf 4121e20c bf28a7a0 -> c132cadf", + "409412bc 403250f0 c01bc1e4 41020d23 c1648d12 bf6f22ba -> 41020d23", + "416072a4 3f35d1a4 bfb13cc1 c17a2e44 c19b7c7b 40834a70 -> c17a2e44", + "c1331820 408a1cc1 c103a2ce 410b2425 415e42ce 3f39c75f -> 415e42ce", + "c056aa6d c0efd014 3f2571ac 412346b7 c199fa1f bf700a3f -> c09fd326", + "c0ab08ce 409ab724 bfbe0f10 bef6614b c0b6baf5 40647772 -> c0b6baf5", + "bf71a7d0 c11a6e91 40bb62ac c1318678 c1305cb1 408ddb70 -> c130cf93", + "4032f548 c05c2848 40a7bac2 c15e8a99 40c50826 40148e63 -> 4056aa8c", + "418c6029 40fc8d22 c07d418b 4141faa3 c188eda2 4042c4e1 -> 4141faa3", + "c060a6b8 c0128bb6 c1151b3d bfbfd5d9 3fbae2db 40f20a06 -> bfb0d1c5", + "418b230c c11c4d7c c110d36d 4194a915 411fd6d3 bc19e510 -> 411fd6d3", + "410db7b4 3f317d8d 40b5a6aa 4199ce05 c075b4bd 40ea239a -> c075b4c0", + "c12074f2 40f1bb9a c10141dd 3fe5f18f c171a960 40e4a8d6 -> c171a960", + "c13f80fc c106ec2f c09c1794 415c3e2b bf714486 3e03c2f1 -> 415c3e2b", + "c14b9dc4 c11681f5 409b373f c17645ff c09f13f5 40aed8be -> c17645ff", + "c14ef663 408e856a bffb2647 c1668c47 c12fcb9f 3f82f329 -> c12fcb9f", + "3f2b1272 406a3827 befe386e c19740e7 c17ec2d1 40ef0c31 -> c182ac81", + "4145b1ab 41051832 411a2cc5 41478d44 c0ee46b0 40f41fb4 -> c0ee46b0", + "c0112403 3ed0020d c11167b9 4185d80b c1625ed9 40aa4893 -> 4146adde", + "40158401 41009772 40227d2c c189c96a 41870b96 4033d795 -> 41870b96", + "be986e8e 3f21e2cb bffc14c9 415bc0c6 bf63540f 3f6c44dd -> 4121fcc0", + "41667f18 c08e3b07 3ff1a578 c10e90a8 40c80e50 bed22d61 -> 40c80e50", + "c180a544 3eb1a8ec befd18ff c0e79b74 c1320286 3f9b7f5e -> c1320286", + "40a88a2a c11672fe 4108c8b3 c1344aea bf387b89 409f3d81 -> bf99c6b0", + "bff5f26e c003a1ee 40485cab c14c0eb9 4016ba19 408127aa -> c14c042b", + "411b7a20 c0dbce9a 411a691e c1982272 c028d9ef bed9a212 -> c028d9f0", + "3f3cb515 40be9bae bedf81a9 3fbf9c9b 40e740f9 bf501ead -> 40decdb7", + "410f8ecf bfea0086 40b4d5d8 40625063 4047edaf bf276f22 -> 4047edaf", + "c15b1f27 c014b120 41056113 bee3d0c9 c0d299ca 40ae82d2 -> bee3d0c9", + "c0805761 40a0436f 3fa1f428 c1643bd2 c18cdfaa 40e8b9c3 -> c18cdfaa", + "c17cb7c3 401aa256 40a119ca 414ab1f9 bf74dabb 40297495 -> 414ab1f9", + "4104f246 3f6d1590 c09b951d 3e3bb1c9 4146dbf2 403f16e9 -> 3e3bb1c9", + "41017be0 c0c713a5 40f565cb c156b6b0 c0bcf6dc be59058f -> c0bcf6dc", + "414d5246 3dc9f120 3f4f6a67 4129099b c19b068f bf4d9daf -> c19b068e", + "c14e3c16 c0d5a3eb c0e51be7 3fd51d91 c10b86cd 4069832e -> c10b86cd", + "4105abd7 c0e80b1d 40bdc599 c04604d4 40a41275 3fda5480 -> 40a41276", + "4130c023 c089e1bb 3e903828 419dad9f c1720939 40e5fd5b -> c172093a", + "40b744c7 c0eb62c3 408837c8 3f47b49d 40690bf5 409c3db9 -> 40690bf5", + "c056918e bf9fc4ec 40941723 c18ad30c 3f54f73c 40725eb8 -> c18ad30c", + "413a0b89 bfa2f336 3fa62821 3fe0b720 41550992 40fdf4fb -> 41550992", + "c09dbd27 c0ccb97e c1155735 c17833d2 c0680e47 bf1180e9 -> c17833d2", + "41886091 c00b122f 40d4b189 409f2eeb c01ff7e0 4070509f -> c01ff7e0", + "410b38b6 3fbe38f4 40ba52f6 4199dbb5 417a9b77 40981047 -> 417a9b77", + "bf2a6051 c0840b20 411f98f9 c11063ca 41152f93 409ad285 -> c0e6cc12", + "40da3f41 bff5d520 4068797f 416d0605 be861454 40b89ea9 -> be861460", + "c0452a3c c1105558 411c2fe9 405b25b2 4101db3c 40d7a240 -> 408962d4", + "413117d3 c11fe3c7 c1001f31 40bad185 c1018971 40951e17 -> c1018972", + "4196a800 c0a98e34 bfd563c8 c0efe6c7 41561adc 4078b2fa -> 41561adc", + "40d8d78e 40f359ad 40688a36 c17f311f c01bb612 40f93c34 -> c1713140", + "40c9239f c0d093b7 c0990b74 c1856fb6 40d81d7f 40d071b5 -> 40d81d80", + "bf2ce82a c09d0f79 c1001b9a c0965dd6 c17f12ca 3f6c3590 -> c0965dd6", + "3fd6ca5c c0327356 c0dba3f0 415f7998 40f18731 40a37c62 -> 415f7998", + "c14020a8 410c3cd3 bf6ae5a6 c18813c8 c13d3e7e 3fb01add -> c13d3e7e", + "c1589a07 3facba2d c0e1ffc4 41449068 417255c5 40d45e51 -> 417255c5", + "4165d0b5 3fa1a19a c0e9ee80 c11dab78 417a2008 40f8ce3b -> c11dab78", + "c125f371 c09dac68 40b8632c 41098da4 4104205c 40de0a11 -> 41098da4", + "c1317a2d 411db928 3fd306d2 c1973bc6 414f3e08 40068ec6 -> 414f3e08", + "c141a32e 40545cd0 40fb7317 bfed7fb2 c158b8f0 40f72c3d -> bfed7fb2", + "416020f2 c0641295 400147d6 4109ad52 c188525a 3fe1c065 -> c188525a", + "bffca434 c0e05098 410b42ec 40541294 40db94af 40af9c43 -> 407f7f49", + "4198fe16 c0d2fff0 40df85e8 c0fe36de bf31f33f 4096794d -> bf31f340", + "404b7778 3e12a832 c0981e59 4073d6ac c1553daa 3cb48191 -> 4073d6ac", + "415144f2 c1144186 c11c9816 c16199e0 40ed9ee4 3fa7aa4e -> c16199e0", + "41942e9e 3fb4e738 411743e3 406eabb0 c0d13617 3f63c26f -> c0d13618", + "c1968a7a bfb537c8 405d1031 bf37a9ea c192bcba 40259e41 -> bf37a9ea", + "41981626 40a69482 c1092955 4192f691 c01e90bb beb1dea1 -> 4192f691", + "c05b4f01 3e8fc8b1 3f9aeca6 41934999 c1619880 407f7a1c -> 41934999", + "c166b35b bfda53e6 3e23c170 40b7e073 41291482 40dc449e -> 40b7e073", + "41158f8c 40bb3ad2 c0f6ead9 40d5918f 413f2864 405bffe5 -> 40d5918f", + "40c7dce4 4098483d c08b1223 c1060815 c141b945 bf71d7df -> c1060815", + "4184f51e 4091316d 408ba1f4 4189feda c106a5db 40cfb8ee -> 4189feda", + "c0a4ee30 c0d27b8d 40df90bb 413b9b9f 4167b1a2 bdbfba5d -> 413c0a67", + "410c885e 40a43bae 409c1ca2 c110c4ee c19e0271 4044d9f6 -> c110c4ee", + "40643896 c117e1a5 410d941a c0702c08 41998da4 40433dbf -> 417cea40", + "c161e1a9 c1067627 be0a23c7 4120910c 411f5541 40bc1aea -> 4120910c", + "c17eda9c c10e3927 c11c5e97 407d8861 c0ddc17a bd4ffd6d -> c0ddc17a", + "417d2a9a 4086a9cf 3f9e904f 3fe1ee8c 410118b3 4035f489 -> 3fe1ee8c", + "c151c8a7 3ee1eadb 404db1c5 418da926 be44f033 40b3d852 -> 418da926", + "4127c0b4 bf1eeb65 41063e19 4162c01d 41877300 408087d5 -> 41877300", + "bf902231 411ddff5 3ff6ccb0 40604ef6 c03b4355 4008b2e1 -> c03b4356", + "c12ff947 bee07cc0 bfdf4bcb c0d4a426 40c6429a 4004bccc -> 40c6429a", + "405c73af c081a0ce 403e00e9 416a07f8 bf32e509 40009fce -> bf32e510", + "40eeab4e c0b4b3ca c0832f9d 413d1fe0 c1964ba0 bf027b04 -> c1964ba0", + "c1369a6d c0dcf04a c0984fe1 3d24c29c 411a562d 406e4d6d -> 3d24c29c", + "c188d4c2 c0e08886 4000aa21 4147d049 c125221e 3fea6717 -> 4147d049", + "4097487a 3ea4dc49 400e55f7 4176a094 40a7d668 40baad39 -> 40a7d668", + "c1640a39 40f6d3f6 c0b8088c 40a3f6cb 3fcc1db5 3feaf58d -> 3fcc1db4", + "4027dbde c10497bb 4064dcc4 41817984 414ddaf7 4094ee30 -> 414e193f", + "40f29f13 40865ee3 3e06a3e6 c1819094 bf997218 4031f2e6 -> c1819094", + "bf86e06b 4082308a 3f780ffc be961053 4167985b 40fd4e3d -> 4167985b", + "4008315c c0d63f2c 40d1babb c1346c78 bf16216e 3fc44e94 -> c035dbc0", + "412ad089 c06f657f 40f33e9c 4118da59 40f11ae4 4006429a -> 40f11ae4", + "41565c50 c0841d5f c0a3d4c9 417898a2 c0ec43fb 406a31a0 -> 417898a2", + "c008e39f c11f409f 408f74c9 40125a30 c195d2d5 40e329ce -> c11d7315", + "c0ad7f21 c02e427f c0fa323a 4144f400 c107c692 4090d24b -> 3f423bb0", + "40f1fc2a c10441d3 c07f8b18 c0d326f2 c17a9cee 40113ad3 -> c17a9cee", + "416f4685 4089b7b0 3f5dded1 3e9089eb c0300a0f bf15689b -> 3e9089eb", + "4192f023 40a4f329 40ce7def c12504c5 40fb1c4a 40cfd376 -> 40fb1c4a", + "c182a2d5 bf84c949 40b51ca6 beee0d08 c0fbf259 3f7d948c -> beee0d08", + "c19cf807 c05f6e27 40ab1846 c0c960a5 40ab4962 bf10bde2 -> c0c960a5", + "4091e6cb 3f81f828 c07ac587 c07fb689 c17758d3 40b42a94 -> c07fb689", + "4192c730 411ae7ae 3f96693b c1964a7f 414ed6fb 40aa0aa9 -> c1964a7f", + "c11443bf 3fd20501 41165ddd 40d65d36 c02efeb7 4043b3af -> 40d65d36", + "c199d7cd 407971cd 40abbd27 3fe6e499 c151b85f 40d19018 -> 3fe6e499", + "414ea98c c0e4ec39 c1046983 c171e27b 4125d37d beb67aa3 -> c171e27b", + "bf953b77 c080aae5 c07d9434 4183045f 406578ea be7ae676 -> 406578e8", + "c1856ab2 c03581b9 c0b26ccf c18b6cda c15f38f0 40cf84b0 -> c15f38f0", + "c16e488e 40904de8 c11dca6e 41491d27 bf52d56b 400e2a8b -> bf52d570", + "410d4a1b 40f92f3f c08e0f4e 419a11cd 415352e8 3f127935 -> 419a11cd", + "c18255bc 404fadb0 3fa9b24f 40d8e279 c18c8483 4084d6c9 -> c18c8483", + "4134a7cc 40529bfa c05e4318 412f4328 40ce51ac 3e8e9c9f -> 412f4328", + "41601371 c0e50e7b 40a65bf1 409fe5c8 40a7bf71 40fed7fe -> 40a7bf71", + "c19a610f 4089c8b4 40995267 40c98642 bfe18d1e 40b346e9 -> 40c98642", + "41964e34 40d074f2 409dd666 40de6295 4148b5f1 40d4a50e -> 40de6295", + "c0569f1b bfaa0632 3f251759 4048330a c0326a52 4075b096 -> 4048330a", + "40dd2da7 c0ce73b8 400040f8 419fb4d8 c0f0921a 402104d8 -> c0f09218", + "419c228c 3fb86e33 3ff60be9 c16b511e 40fcfc43 bf21ad51 -> 40fcfc44", + "4196fcdc 40c00138 bf716ee0 c1968c83 41846870 409c5caa -> c1968c83", + "c19a3055 c11886b0 bf00a398 413c713c 4088bcd3 3f49f8cf -> 413c713c", + "4198b49a 40a1cd0b c081f036 40992cca c142dacf 40da341f -> 40992cca", + "414160e3 410e520c bfa18aaf c155199d c127ed9b 40fe3593 -> c155199d", + "413b099a 40833970 410ba6c5 c13b5cfc 4115033e 403fa541 -> 4115033e", + "4175c8c8 40fd404c c0bfd2b8 40f73846 c19ab666 40e5ceaf -> 40f73846", + "c19d4ba7 c100c123 403e6813 413c94aa 4102e873 40dfa053 -> 413c94aa", + "4074b653 40eb6978 c100b828 415b1fb1 408c8460 40f1da75 -> 414ec533", + "418488e4 40d3c3ee c107dbcb 40857d45 c0b3e86c 3d277865 -> 40857d45", + "4194b858 40af21a1 bfe2811e 3f9f333c c148a01a 3f000745 -> 3f9f333c", + "c19f62b5 3ffd3690 4105e985 41709113 c1472a0b 4079cacd -> 41709113", + "c15574e9 c01850bd 41178e10 4191ab07 c16697f7 40cda7e7 -> 4191ab07", + "c18943a7 c08cc061 c0fb87c2 3e98c61f c150afed 40d99ffb -> c150afed", + "410ee732 40f547c0 4039e72e c0b66947 40cbf1de 40c4566e -> c0b66947", + "41145ebd c0b4660f 3fc146f5 413209b1 c0fea5c0 3f27bf8e -> c0fea5be", + "c110d3ef 408ae018 41095061 c13a76a9 404057bc 3ee0ef8a -> c13a76a9", + "413f22b3 bf9a93b3 40d2fe23 c13795fd 418e0bb6 4077c0ff -> 418e0bb6", + "41410649 40a36451 40ee53e9 c1293333 c084dbbb 3c635f24 -> c084dbbb", + "40858ffd c07ec3a1 3fd291a9 3e4eeca8 40e56e17 40fd6507 -> 40e56e17", + "c131b5a6 bf20068e 41000ff9 c0a00d69 411061dc 404a90b1 -> c0a00d69", + "40f2a3de c017692c 41093b74 c15629db 410b2c1e 40f6c33e -> 4108de59", + "c19028e5 c0111b92 bfca31b2 41446897 c0cc01f7 3fd9a94a -> 41446897", + "c091168d 40602d68 403f9d73 c0842716 41804afd 3ea19453 -> 41804afc", + "417fd2ab c0af89e0 be6df6fb c118b91b 41578618 403b7fe4 -> 41578619", + "bf469472 c04780cd 40aa813f c171b455 c12d5495 befb3d85 -> c1688547", + "419039fd 4067669f 40b094b3 41061866 c18677f9 406f02cb -> c18677f9", + "bdabaf6d 40362aaa c10d8d01 418c68aa c10e3b5c 40f55120 -> 416cc356", + "bf47fc04 c11a5d3e c10bbfc1 c17bec0c 419ae91f 4021984e -> 419ae91e", + "c168ba2d 40fb16cc c09184c9 c1566a30 411c4b1b 4096eba3 -> 411c4b1c", + "419691a4 c0c02bc7 c09474af c08b9c8b bf9b4288 40144b7e -> bf9b4288", + "c13e5a25 40b24858 bf40d15c c1188b9f c12dd558 be9ea6ed -> c12dd558", + "4167949a 3f8fc3f8 c0a4121e c0d453d7 c12ea212 40361024 -> c0d453d7", + "406aaf82 3fdbed01 402c1cf7 bfa14baa c1974df3 bf72ae7d -> c1974df3", + "40a084b2 bfa2ed0b 4091459d c10f9fb3 c19673b0 3fb28782 -> c19673b0", + "4181ef4b 40e47d04 c1003f03 418c6eb5 c199d852 408983db -> 418c6eb5", + "3fcbd9f5 410d3f93 40ad9756 40276e74 41856148 bed7baaa -> 41856148", + "c151afd2 4092e5f5 4060d36c 4123136c 4147c68e 4045b0b4 -> 4147c68e", + "be7d9cc5 c1136dd7 40ea3627 4156bf67 418e639c 40e6dd69 -> 417f4b96", + "4171cb15 41168bf3 c0bbdea6 c129f4e9 c0b72803 40beb995 -> c129f4e9", + "417376aa 40e49fd6 3fb3bb5b 410fe934 418b4a89 40478783 -> 410fe934", + "c09fff17 c11c36cc c0ccc313 be73d0fd 412aaa4d 40005d7b -> 412aaa4d", + "41130086 41179f29 40e4684d 4163a4f7 c0933246 40d65e77 -> 415ef92f", + "40399cd4 4080be4a 40d63a00 c0d27a94 3f7c7d7e 400a9a86 -> c0d27a94", + "4141bda4 3fb3daa4 c0d2d57d c196b988 4084d30b bef724c7 -> c196b988", + "41659485 c06ff7db bfeca30c c19dab1b c17a261d 40c13f1e -> c17a261d", + "41250039 bf90ccbc 4027438e c170eacd c0a64e5d 400454c0 -> c0a64e5e", + "410fd7b9 410118ff be68d725 c187980c c190e3a4 40a054e2 -> c187980c", + "410dadd3 c006b923 c09b3b86 40967c6a 412205d0 3ff803ef -> 40967c6a", + "c14f015c 3e9a5b65 4109dd92 c1036652 41552fa8 40817b33 -> c1036652", + "c16eadf0 3f252189 c05792f7 c11f0c6f c1886025 40fbb169 -> c1886025", + "418ec2a5 c09b5f72 c0da257c 4150492e 419deb0e 4055787d -> 4150492e", + "c154f2e1 c0a7b5ef 4101092c 41196f66 40c04c91 40d39e8c -> 41196f66", + "4113ccae c06d65df 3f7c8d46 c0829518 bfbca62f 40de3aca -> bfbca630", + "4017912f 41192093 403bad8f 406e6570 c02454b8 40cb38d4 -> c02454b8", + "c116a535 c06ae0eb c091bdb6 407b547a 40ab4595 40ebde92 -> 40ab4595", + "40e0d219 bfdba4d7 c11d8f52 c15eedfb c11dfcfb 3e96c4b8 -> c15eedfb", + "4127047f 3f8cae12 4019a389 c173930c c092b9f6 3ef309f4 -> c092b9f6", + "c03fdb9c c0d186f9 c0be2b8e 4182d0fb 400f9d84 40bd2314 -> 400f9d84", + "c080cbf4 c0c59e36 c0b03ed2 4070430a 419514b5 3f6c483a -> 419514b5", + "c1995582 40bfc0ae 3cf540c7 3f342158 40201e69 40cca333 -> 40201e69", + "40cbc8b8 be693a76 c11cfb2d c0928962 c17809d2 40ce42ff -> c0928962", + "40143e4a c0abda42 40af221a bfaca7aa 40e3d23d 409beb1f -> 40bac2dc", + "415b74e2 4088847e 3fedf127 417ca7c6 c12759d3 40e88a61 -> 417ca7c6", + "c18611a6 3ebfea29 c0c6e2f0 4054decd c19b4551 40b557f5 -> c19b4551", + "41287c73 bf6ab340 4104f86d c1233c8b c1923273 3f9f5af5 -> c1923273", + "414c0c5d 3f4527e6 400e0731 c1853db8 c00b70e0 3f9bc1ae -> c00b70e0", + "be83fced 406aa788 c10683fb c12f3112 415003a3 401e0edc -> c0c6d853", + "c103d308 c08a5f7d bde351fc 4098170d 408b7441 40f853e6 -> 4098170d", + "c0caf886 c00a3d5f beccdf4d bfcb6bcb 40b35172 3fb7920f -> bfcb6bcb", + "416748cd c11f3cf1 40ea0919 c1888eb7 41524c31 3fdbbfe7 -> 41524c32", + "c13f5308 411fd61e c0f2b9c9 c197df06 c0eeab26 3f9aee61 -> c0eeab26", + "41020962 40840807 bfb661b1 c157205b 3eb96e4c 3e168fb7 -> c157205b", + "c13f2038 c087649e c0f181ac be8f6dcb 419cbf1e 40666a6c -> 419cbf1e", + "41906851 c012d007 c0e8e318 4186303d c16cc5d5 40ad26b7 -> 4186303d", + "412434f3 c0fd2128 40b7ee42 bed1d6d1 c147260b 40a8f9fb -> c147260b", + "c0e7e965 40b21534 400dd9de 410f9c6e c04edcfd 40483837 -> c04edcfc", + "417f4637 c0866767 410913c0 3f5a25d1 c1398eb1 3f78a176 -> c1398eb1", + "414c3f78 c0373033 3fbae644 c18e72ad 4191b27b 40a01ac8 -> 4191b27b", + "c17b7a1b c11e66e1 bfadb93e c112011f c146f07b 40f64a36 -> c112011f", + "c1350f0b 4093d7bb c0d8fe00 c1759861 419ff48c 408e0618 -> 419ff48c", + "415a34d0 409d0f3a 40c273fe 40a9c669 c14da988 3f3adfad -> c14da988", + "410bff06 c1165564 41134656 bfc97a3e c14f3338 40c0a839 -> c14f2ca9", + "4096ff9b 411354c1 4116c2a9 402019cb 4155b7f4 40f7bac5 -> 402019cb", + "c1987bee 41043e38 c0e4e080 c14995bf 418ddec6 40bbe55b -> 418ddec6", + "402d2450 40979c02 c094fa1f c0acac6a c0af513c 406c818a -> c0acdca6", + "c192e31d c0e0d754 c0284905 bf4c8446 40413d26 3f0aded7 -> bf4c8446", + "41489a75 c104dc4e 4016eb41 4184e8c8 415c9607 40a660b1 -> 415c9607", + "413171f7 4033f3f6 403d90ad c0b11f97 c06e3491 40c77eb9 -> c06e3491", + "41925ede c00c0cde bff58d34 419b11e2 417981a7 bf472300 -> 417981a7", + "c13a119c c0010e20 40905e96 4194ea21 419d84eb 40bda34a -> 4194ea21", + "c10fb9ae c05a800c c0e9c635 c17740ca c15d2d78 40149a71 -> c15d2d78", + "4191f5a2 40ff5a61 c03d2d8b c15c4955 c00fe8b4 40f1a9c0 -> c15c4955", + "c0747a05 408f1123 bedccc9d c04ec3da 3d3d591a 3f4011e9 -> 3d3d5900", + "41266f6a c10a2c3f 40143691 c18aeb4f 41146cdd 3fe1bc78 -> 41146cde", + "c16cec98 3f419d2a 40ee0bad c14c542b c038eb00 408d6ad8 -> c14c542b", + "4185237d 4080130a 410ee8bb 40ccdd13 41316a12 401b0276 -> 41316a12", + "c14ff9fc 41126eaa bfe8308c 40b8ec34 c04e95ce 401e2103 -> c04e95d0", + "c066be80 4087b77c 40076d29 bf9345a0 c04a4a56 3fee3d0c -> c04a4a56", + "41972186 c0f10c2d 41066ce1 41865b37 c0dc0077 3f8a0aa1 -> c0dc0078", + "3f48ae3e 402d8660 409d247e c0f0a7fa 40ad2e27 40f00eb1 -> c0f0a7fa", + "c046d25b 40bcaa62 40a9c010 c18b08f5 419cc9fb 40f01122 -> 419cc9fb", + "418b02e6 406a26f6 3ff7401a c082de1c 3f18b503 40365d1a -> c082de1c", + "4116941d c0d8527d c036e8c9 c185feee c0c3e424 3f655509 -> c0c3e424", + "c16cced9 be9cf330 c114d7b5 c0b1c73c 4040eaec 3ff2fe8c -> 4040eaec", + "4184bf9e be60269d 3fa2cb97 416d0a6c 3f511014 3f90900a -> 3f511010", + "c1300f48 c06c551b c04c12d4 412e060f c19501e0 40c68cb2 -> 412e060f", + "3f26938e 408f6170 3de5b9c1 4110ddfd 413ffadc bf2bb30e -> 413f40a4", + "c012b4f2 40b82b0e c0e6a696 c155d021 c138be0d 40eaec9e -> c140f1d8", + "c1031156 bfbd2369 c06d1934 beb16f07 41351b31 40f44251 -> 41351b31", + "4134f5a5 bfb1a28b 4057bcaa 3f1b6b96 416dd6e5 40289fcc -> 416dd6e5", + "40bc9837 c0c84a33 c0891392 c13ceb53 3f8d5ac4 bd069078 -> 3f8d5ac8", + "c1766791 c04a2071 c01c41bb 4191ad87 4076ddee 4057854d -> 4191ad87", + "3f00c79b bf2a7690 c0af7a1d 40c4ed2b 419275b3 4092b337 -> 40c4ed2b", + "4186cb13 c001c095 bf9ce6b0 41940a06 bf1e09d3 3fcffc07 -> bf1e09e0", + "c12869db 40bcefaa c10178b0 c06241ed 415b96af 40a55500 -> 415b96af", + "c18cb15a bf9d1296 c11025bf c18959d3 40a28539 40b296b4 -> 40a28538", + "c115451f 408703ce 40b1d639 bf4f6255 c11014c6 40def411 -> bf4f6255", + "c184ad81 40f56ce5 410b0bc6 c10ca15b c117768c 3fdc47cd -> c10ca15b", + "40ddf3c7 410865e3 c0d216fa 4181bfe3 408f97aa 3ef3f33d -> 4180d1db", + "4017c2a8 410960be 40c448a7 41281025 415af54e 40723c32 -> 415af54e", + "3fbf60f0 bfb1182d c0670a2e 41927620 c19216d0 40f45f7a -> 41927620", + "401c6bff 4086c9cb c10a91b8 c0e23867 bff42ae5 40981be6 -> c0dec61c", + "bfd5573a 40c8759b 3fbd7c85 4170ed87 c19bf23d 40c75bec -> c19bf23c", + "c0e4b10a c08692cf c0d19d3e c0a1f4c1 c1598135 40cb69b7 -> c1598134", + "c16e4633 c0d77adb 3ce1e17b c10355bb 414599dd 40bd54a1 -> c10355bb", + "c1322595 c09892a1 4110e0f4 403ac20c 415b8da5 40441ee3 -> 403ac20c", + "40996796 41103005 c040fd1f c1060cce 417d2fb3 4038a0a6 -> c02a4548", + "40d1225e 411834d5 c0e9faa7 41243cce 3e942306 4013c117 -> 411d92ce", + "411cae17 bfecc521 bf9834f2 c13e0233 3fe791e3 40e172fd -> 3fe791e0", + "c13156dd c11a2400 c0345bf4 c01c8f6a c19669cb 4072d059 -> c01c8f6a", + "c093b08d c03fabbb 40f80274 c15ffcad c169fb4f 40b71c6a -> c15ffcad", + "415ca769 405b033b bdf28d26 c1740120 4186714e 40ab103d -> c1740120", + "3f2e6adb 40ad137f 410a4d78 bf3f41e0 c14c0813 3ff5357a -> bf3f41e0", + "41228262 40c1ff19 410328a8 415923f5 c096bb71 407acc7c -> c096bb72", + "c03b27c3 3fddd86a 3f5a5ea9 c047306b c1471d04 3e54af62 -> c1471d04", + "c195f72a 4084257b 40b8cd6b c12c1493 c19249f9 4010359b -> c12c1493", + "c176812d bfea63d4 c0ff49f9 c15e5a50 c10e90c9 3fedc52b -> c10e90c9", + "c0f616f9 4113fb88 bfb4064a 4098da0e bd8d1805 4091e2ff -> bd8d1800", + "418de34e 40c668cf c10ca274 4188882f bf43f94c 409a7583 -> 4188882f", + "419be948 4110c9e0 40e1991c 40ae6269 41836a3b bf67e8c7 -> 40ae6269", + "c147ff25 c0a2af95 c0ef673d c03acf54 c1575300 40d3a23f -> c1575300", + "41492096 c0f9edb0 407c0c2c 41252d7f c05ac348 40fd18d1 -> c05ac348", + "410a9f1a 40ec64da c0e402bd 3f8e35a4 c087320a 3fbd8ba5 -> 3f8e35a4", + "c1811189 c1034c49 40f6d965 40bc4e15 410fcaec 40ea80ca -> 40bc4e15", + "c1290f85 c0d0c733 bf9d0572 c0b91afd c0b9193c 40afe59e -> c0b91afd", + "c0dc827f 41190346 41081d03 4093d682 419b7678 3fe283c6 -> 419b7678", + "4096abd4 bf257570 402c1f24 40be9abb 3fa4d536 40df2b6c -> 3fa4d534", + "40b0c96b 40bc14de c106cd3c 3f81c557 c1943019 40d55f5d -> 3f8168eb", + "c173e853 3e0acdfb bf0b7d45 c11ef39b c16ee30a 40901648 -> c16ee30a", + "c14c3620 41007b50 c10193fa 3fc5e79f 40f44a8f 40bfacde -> 40f44a8f", + "be9c4353 c0acafcc c03cd6c2 c14d3ade c16e23a6 bddd39b8 -> c16e23a6", + "4135e9fd c012344f 408ebf9e 418db7ab 4184541e 3e95b4a0 -> 4184541e", + "c19db0af c0c86e56 c0303a8c 4110e16d c023f421 bebfcdec -> 4110e16d", + "c188be8c c0e6abe6 c046f93b 4147afd1 c0051b87 402a0173 -> 4147afd1", + "40bda773 c06d9e9d 3d97526d 40248a51 412297b3 40f586a7 -> 412297b3", + "c16c029a be263904 408f068e bfbbfeff 415c124e 40776275 -> bfbbfeff", + "c173b857 bfb301c5 40a5d022 c0aa4778 c18778be 40ab5b73 -> c0aa4778", + "c0e9e8d8 be3a3f36 c0dcf387 c08bb436 bf1b6718 3fd55a0d -> bf1b6718", + "419f0923 bf8a0671 4036d73e 400729dc 41476e75 bf2eb3dd -> 41476e75", + "c1678b9e bb9c9e5e c0cb18b2 4184be86 c14a5ac0 402476ff -> c14a5ac0", + "c157afe5 c0db1769 c0b3aaf2 4180f9d2 419dd0fa 4042edce -> 4180f9d2", + "c195d491 c1071040 c0b23e2c 418e77cb c1367ddd 40d1d975 -> 418e77cb", + "c0009141 4092c41c bd77fa2e c0df4fda 409acbbd 40c2dcfc -> 409acbbe", + "bf6587f9 40470788 c08d4434 c0806474 3f692d54 40e817b5 -> bfa03f0a", + "c073ebf7 40b64df4 411b8af7 c0e13ebd c0ef6b15 4050356f -> c0e13ebd", + "c09b5a0e bfdab5d6 c08dda83 c1856b9f c0201f0d 40f6f9c9 -> c0201f0c", + "41756265 c08febb9 4050dec2 4089e7f5 c152fe9b 402b08c2 -> c152fe9c", + "c118cb42 40da266b c112d812 410057d7 c08b0894 40e1f719 -> c08b0894", + "c17b72aa 41137bbd c0d93d5b 403a487e c1769338 40ab19fd -> c1769338", + "4186ef8a 411f8856 c10f9ea2 40cc02fd 417d7821 bf59dfe5 -> 40cc02fd", + "c02e1e6a c018de56 40c833c8 40a80921 c1412ee2 40abf598 -> 40a80921", + "c1221f70 c1156ded c03166bd 4010e76d 418204be 40aaa9a4 -> 4010e76d", + "c075c1b3 4079676d c031925b 4186391f c17a3cc3 406fb51a -> c17a3cc2", + "c19b98df 40813142 c1006dd9 40af6d2e c0ce29a1 40851416 -> c0ce29a2", + "41575371 c0eb6885 c004b5ec bfe5fd45 c0beac94 40d45554 -> c0beac94", + "c18db918 40c2ea36 c056d449 c0812545 40a0d106 40635671 -> 40a0d107", + "415fdcaa 3feb108d 40bb8ff8 c138c0c6 c14fda24 40db67ff -> c14fda24", + "c1867900 c0c30308 40dfb1fe c16370e1 4131f2d9 3f3a3e2e -> c16370e1", + "c12a4500 c0604d1f 408ef8e1 419eaac7 41384380 40bf7f22 -> 419eaac7", + "419e0a4a c0dd2c01 4089d732 c092dc57 c1150185 404c9b21 -> c1150185", + "413d6de5 410cb395 c064a2db c1285301 3ff6ce29 3de32f75 -> c1285301", + "4138b545 40328cde 3f87d346 3fbda87b c1934b09 3f851c99 -> 3fbda87b", + "c18ddc99 411d4d38 410e1c6b 409b8581 4187d064 3fddd6de -> 4187d064", + "c10a978c 3f6aebb6 c0c85497 410f065a 3de987a2 4086e689 -> 3de98780", + "c18cd03f c0ded8d9 bd44a35b c0b8a77d bf9adfec 40185744 -> c0b8a77d", + "c05a3b6e bf0d4085 c064e061 c059dabc 409c3a1a 3f925349 -> 409bd254", + "c0200132 40e9d65a c1144232 41119b68 402b04d3 3fd70430 -> 4099c245", + "c106cc4b 3fa2ad01 c098287d c15a3e4c 4147ab7c 40afc7c2 -> 4147ab7c", + "c07bce7f c1113920 c0120abe c16aad86 4090ddf9 40e2df38 -> 402b31f0", + "412ce991 c11c632e c0a06e8f 4116afd5 412a196d 40ba31f3 -> 412a196d", + "4168af92 bf6b3344 c115bb2e c19d52c1 419092ff 3f9e42be -> c19d52c1", + "bfbad1e5 40eef9b7 3ee9138e 40d29f8b c0b4dfbe 40772cc1 -> c0b4dfbd", + "3ecc609c 4072c674 c01bd0d2 40bee758 c18f757a 3ffefbc9 -> c0ffa106", + "4198a54d 40224055 4047bc80 c14236fc 41203ab5 40c320cb -> 41203ab4", + "c09e679a 4065ac96 bdca7546 40b48f5f c13774e4 409c4a73 -> c13774e4", + "419d893e c03f0acd bfc3ced7 3f8a7ddf bf38977c 3eb01022 -> bf38977c", + "41039597 4093d509 c0b1c175 40e97617 4058ec23 bf3df41a -> 40e97617", + "419d5895 3ef53182 c108487e c05c1355 40f4b034 40f72f06 -> c05c1355", + "418fe31c 40abf3e0 40d4f531 41781db8 c187c3ba be359672 -> c187c3ba", + "3ff9485c 40d4e41e 411d2997 c1690461 4184d633 403a47fc -> c1690461", + "40d4458e 3e8fb92c c0868232 c013d1f4 c13e11f2 3f02a6a9 -> c013d1f4", + "41564fac c094749a c0d85d0c c1865d83 41262f61 40f908d2 -> c1865d83", + "c183be3b 3d0c7faa bfb31efb 4081ec73 be0bb38c 3f57611d -> be0bb380", + "41869c28 c117112d 409842ef c1030592 4190e147 bf280d81 -> 4190e147", + "404e2396 408ec2c3 bfb02056 bf43dc6b c160fb12 3fcbf82f -> bfd5982d", + "bf17b27e c00b16a5 c0c424d1 4159626e c0ec4e76 40c0dc08 -> 4159626e", + "41034151 c061364e 3eae6349 410ddb6b c14d2098 3ec778b9 -> c14d2099", + "409c7b8a 40fb7808 c0473700 409b04a4 c100f68e 40589651 -> 404daa6e", + "bfa8d60b c0a3f232 3fcafdf2 40568a4f c0ae5196 4098d747 -> c008fb47", + "41916072 40dcc618 409a5ee2 41302343 c170dc34 3fc155a1 -> 41302343", + "c140f313 c0e6b4d5 c0b86fb0 c18918dc c19959a8 40ceef7f -> c18918dc", + "3feab422 40b37b85 be3dbf78 c119fdc8 c1092532 3f565b7b -> c10d10fa", + "c1402460 c04d3fb2 40a9f760 413f7967 41950987 3fd9dbce -> 413f7967", + "415d1413 c031a025 4105c623 40a77cd3 40ddc5b8 409ae5e5 -> 40ddc5b8", + "415c9b71 c10fca18 3ff4f0a7 c0d277d2 403aaa95 bf6ffcd9 -> 403aaa94", + "41982e46 411d96e9 408a2b5c c08772b9 c161d606 3fe78992 -> c08772b9", + "c0b6abac 40374bd9 40b30f8c 41670b19 416172d2 40879ddb -> 41670b19", + "c0876227 40f64cf7 c119659b 4118ced4 c1397026 3e67fe4b -> c0fb8468", + "40c6041a 40fe7e22 401d0fac 3f57da3d 418ae930 40d5936e -> 40806d5f", + "4149d0a2 405b077e c0c17c1e 418371f2 415f48b1 404818fb -> 418371f2", + "c1051909 c1182e9e 40c69677 4156ffcf c140fdd9 40445e96 -> 415569b5", + "bf63c264 40b232b4 3f6d6ab5 4161fe6a 4170196a 3ff09f28 -> 4170196a", + "c1973155 bee78660 c07ff555 4182a60a 3f796dc6 4093f0d5 -> 3f796dc0", + "416d967c 40c15201 410867e0 c164f0f9 c01f8f67 40c11530 -> c01f8f68", + "c1158561 c1028780 c09e0657 40b7d40f c1058f65 40f82c07 -> 40b7d40f", + "41593f45 c0def968 3fc59235 4112f564 c0a7fe7f 40c94ec0 -> c0a7fe80", + "c191dad0 3f5c897e c10a0598 bf383794 c188d43e 3f2a2ef3 -> c188d43e", + "c1064c25 400e020a 40a260d2 3f98f2f5 c15fe126 40ae9ea0 -> 3f98f2f5", + "4112edbc c102f68e c1000d87 402ab912 411df4a9 bedade3e -> 411df4a9", + "3f7febd9 40c11727 c0bbc11e 4001a045 c17106e8 4075c57c -> c082e9d6", + "c14de07f 407dcab4 bfec98ce c193d063 41570739 40df3225 -> 4157073a", + "409017e0 bf600297 c0930203 c0b28a4f 419597d7 40ddb674 -> c0b28a4f", + "3e069457 c09a26b3 410ef81d c03dea86 418a6ff3 be8d07e7 -> 40073f60", + "c13cc535 c0d3cac1 40de9512 c0480f76 3eae1bbc 3f0e9786 -> c0480f76", + "4188efd6 3ff7e35f 40641cad c10e5e49 c129e940 40d8f30a -> c129e940", + "411abe9b c03fe666 bfc038ee bf573420 c199a164 3f8f0e2f -> c199a164", + "c135a14e c0c7469e bef9b861 415e9e6e 41175dc8 3f75c3d2 -> 415e9e6e", + "3f9453a1 c0d90d21 409bc609 c138e877 4134d655 406e1520 -> 40e001e2", + "4105a540 40c25b38 3fa5e310 4094cada c1194468 4023f0a4 -> 4094cada", + "417452cc 40f5b751 c0cac2da c197f89e 40a7fd74 3ede0ef8 -> c197f89e", + "3fdbee99 4039be64 409648f8 c11b6139 40b6e7b1 bf67fa50 -> c11b6139", + "402360a8 40b9096d c05b99a6 410788e6 401ac564 bf3d11ba -> 40e15cd6", + "414e1a94 40b98fae 3ccf2b30 407eb3c3 c0e18777 3fe4e314 -> 407eb3c3", + "c187c172 c0866759 c0e0c5b5 c17f46c8 c13d10a7 3f36bd64 -> c13d10a7", + "40b67abe 4004503b c0da4753 c08baef9 417aa2cf bf6dc026 -> c08baef9", + "c10c17b6 4101a373 3f835bfa c15ff7f4 41292f58 3d94e2b6 -> 41292f58", + "418dfa76 40a9be5b c07c2d3b bfa1ae26 c054de43 3f1107de -> bfa1ae26", + "40e0d1f0 c02405fc c0e0e6b8 bef22e0c 3d9c697e 409e5735 -> bef22e0c", + "40a98a44 400e258c c03e7d0d c0646fb8 4195d0e1 40d25363 -> c0646fb8", + "4115c10f 4041b3b7 3d8ff11c 40c1f940 411e2eae 4061bfb2 -> 40c1f940", + "bf43e912 c0db7724 3e64f17f c1323b6e c19df09d 405920ab -> c19c6fd0", + "c0c581ac c10500fe c0de6b0d 417094ca c180df2f 40971519 -> c180df2f", + "c1688079 c02d878c c11b32ba c1557bc5 c1862a9a 40c6f867 -> c1862a9a", + "40efeb18 c11864cb 40c10da0 c159dd09 c10567e5 40050160 -> c10567e5", + "40598d32 4031fd94 40d263c6 41102892 412d51f3 40d42151 -> 411121c0", + "c14bd655 4116fde6 40ce226c bf9d172e 40921c09 40dcc39f -> 40921c08", + "4075da43 bf33d42b 40affe90 bf922ebe 41938884 3e933e06 -> 41804fb5", + "bf8da462 c0d14912 c107319a 41108499 c198cd9a 40c3dd19 -> 41108499", + "3fe8b238 3eba14b7 c0ac0e58 c1154b63 40d9081e 406d06c8 -> c1154b63", + "c1313dcc bf903ee9 4028a042 c184f291 c0ddb18d 408a1353 -> c184f291", + "c186a4e8 40c65018 3fdee113 415bf1c5 41519037 3e3f66cd -> 41519037", + "c15ed793 c094a4a4 411d18b9 4161b68a c1751481 3c57340e -> 4161b68a", + "c17574de c071cd48 c1084ac0 bfc470e3 be908312 40b0536e -> be908314", + "bf3ddb58 40d76d46 4071d2fc bf375678 3f5c68c6 bec65173 -> 3f5c68c6", + "c19c816f 40cd46de 411f90ea c100edd9 c022dc4a 404795c4 -> c100edd9", + "c16b2ac8 c0b4af2c c0bf4378 c02e91b0 c0e149ad 3fa77199 -> c0e149ad", + "c1893540 c05fb129 40a22e4f 40ed311a 419e498d 40d7a45e -> 40ed311a", + "c132c200 bfb9332f c0c7a03e 402abdf4 c13ea2f3 be133084 -> c13ea2f3", + "bf92e22a c030991b c107eeb2 41600398 4180ab7e 40bd65bb -> 41600398", + "4170df2d 405c09da c0b1598c c16d5420 4102f257 408fed2d -> c16d5420", + "40d9a650 411a1f23 3f7c9c4d 3ed148d7 c1947317 405c3b36 -> c05a1642", + "c0b73075 402d7a04 c094ba0f c09fb28c 40d580f7 40bd2b40 -> 40d580f8", + "418f84ed 4117f48c c0abb381 c17d2376 419e9d1a 40130cc0 -> c17d2376", + "c16cdf5f 3fd82913 4093fcc1 418f9b5d c19670e1 40d2f28f -> 418f9b5d", + "bf41c9ac 4009b0f2 3f5c2063 40c1a665 4034f4d4 40937d49 -> 4034f4d4", + "412ea703 4105757e 4106a57c c0b6418e c17c8af4 3ebe4d97 -> c17c8af4", + "c19780d6 c11df163 c0b1fedb 40a234d0 405cd846 4066b36e -> 40a234d0", + "c18c4e75 c04254e4 c0881fe6 bfb35596 4055f38c 3f82e2c5 -> 4055f38d", + "c054caa5 c1137f90 40d3c249 414d23bb 41973eb0 40688967 -> 41677a9c", + "418bb9e2 3ebbb170 c0c5ef92 413fd2bd 419aa5bc 3fc7118c -> 413fd2bd", + "404e97a1 c0966fa3 bee3bd84 404f57e7 c03f2302 400cab6d -> c03f2301", + "c156144e 3fbfd7eb c0b66ff3 c157848a 418d71f3 40b2bc86 -> 418d71f3", + "c033614a 40b071a9 3fa5ce9b 4005ed6b 41748db6 3f12b918 -> 41748db6", + "c08e87a1 bff67c75 c010a7e7 41839a3a 41159736 408c70e0 -> 41159736", + "c11936a6 c0a0a132 c11735ce c102f011 c12e2bc3 40bf1a02 -> c12e2bc3", + "c121c2f9 bef194e0 4106ecb6 c0eb2a9b 40db5e0c 40138765 -> c0eb2a9b", + "c06e604a 409fc7f5 40b07a7f 41527bb2 417c87af 40a90093 -> 41527bb2", + "41537e04 bf7b6c96 c0fb564f c034efad 418ba5b4 40c71ee1 -> c034efad", + "40625ebc 3feb6957 c105cd12 be8501c6 c0c2c087 3fe1b6d2 -> be8501c6", + "40a51c66 40042941 40841404 c14542d5 c17bfe3e 40cf1d8f -> c17bfe3e", + "41797cb2 40ac9aae c101c850 415f6a87 4196e1f3 3f5d3470 -> 415f6a87", + "c1922d2c 4116779f c04c23a4 bf81d8a6 419a43ca 4030ef4f -> 419a43ca", + "bf66ae5b 4112678f c0b1d643 c19ed6a2 c0a8933e 3f80a9a3 -> c0ff42b4", + "41359c43 c02e46e0 c0bf66ff c10a0561 c182ed8a 40a18275 -> c10a0561", + "40afbd9f c0ec6ffa c0181b31 41491aed c18e6521 3ca2833c -> c18e6522", + "4175810e c11f3568 c0aa611c 4178b696 3e2b5d85 3f6041f7 -> 3e2b5d80", + "c06a3e0e c0b23d80 c103a4ba 416ca0e4 41984247 40e9f0f3 -> 416ca0e4", + "c1485c02 c1017096 4025487d 412df2b0 c06763b7 3fdec872 -> 412df2b0", + "be52474b 408432e5 40f785c8 413e2ac3 414a93bc bf70acfb -> 413e2ac3", + "40b4217c 3fffe5e7 c009385d c18f97ba 405e43a8 40e5b3c9 -> c18f97ba", + "c18ea50a 40adddde c11bac12 419381c3 4091901b 40a1e851 -> 4091901c", + "4115f1de c0ef009b 41136e78 c00d0f00 c19ed63a 407209d2 -> c19ed63a", + "c18bf500 3e2ac91f 40f6ef80 41863f78 c1497174 3f8a37d6 -> 41863f78", + "c0b3e32a bfad0070 40b68fe7 c19f9609 40ec906c 40c0e185 -> c19f9609", + "4186f78e 4106bf5a c10b7203 c11716f6 c0bddc84 4035cf69 -> c11716f6", + "413bdb50 3ff4648d c03a36be 40009b88 41292ee7 40dec570 -> 40009b88", + "40b5aab4 3dbafe0a c09d480e 41534715 c195e946 406b86ec -> 41534715", + "c10c9a51 409036a1 c104da52 40e5afb9 418a1707 40b1907c -> 418a1707", + "bfd6b200 410e52ee 41118100 c1432c78 c0ff540d 40de72dc -> c1432c78", + "c13fbce8 40c5ad22 c00f2463 4114f633 3f856850 3fb1427d -> 3f856850", + "c160ffb6 c1168a06 408a600d 418419e9 c1052e55 be7feed0 -> 418419e9", + "40d69aea 40ec8243 40c390f6 c0f81cf8 40a7cd51 3fa22697 -> becf60c0", + "41320853 410db51b c007ca72 4097e8e1 419a55cf 40ed908a -> 4097e8e1", + "c12f212f c1030e3c c0e89f59 408f4b4e c0cdabec 400bea6b -> 408f4b4e", + "415164f4 c0d2aded 409208b7 c0188f4d c134d9e7 40cac83e -> c134d9e7", + "c13a5f81 3f64657c 40ed0cf6 c0b30a64 40961476 40418c29 -> c0b30a64", + "41880072 40507d19 3fb05e6c c05322e8 40d4c206 3f7f040f -> c05322e8", + "c19f0540 c041cad9 3ffa1079 bdcec2b1 c0ec7b7e be87becb -> bdcec2b1", + "c143a8f5 c0df81ad c087472b 4037da73 c1148ee6 3f06d421 -> 4037da73", + "c108499e c0e55ac8 c0fac6a7 4124b427 c1918dd4 3f850e38 -> c1918dd4", + "c19c9c43 40f93b7c c10d50d5 3eec1610 4167b52a bea1b80d -> 4167b52a", + "40e400b2 40dbe991 c0a337b6 412bf424 c11e8728 40ae5712 -> 412bf424", + "40dedbf6 be7cc1c5 3fbdc47f 40fe038c 4124e106 409885d8 -> 4124e106", + "c1971583 c0943f82 40ab47e2 c0eacc4d 417ce1a2 40b86d0d -> c0eacc4d", + "40cbe5a4 3fb2af61 c1073361 c0b6f407 4119f829 4091b085 -> c0b6f407", + "c177b5b2 bfe30351 c105536f 40e0ee09 c1427339 3eb50a68 -> c142733a", + "418a6d80 c02ca084 c0f6b813 c0f0c11b c18f9118 3fca6805 -> c0f0c11b", + "405753be 40dfd79c c11131f6 415d8166 be00fa30 4048b51b -> 414bacdb", + "c188f356 3fce9d39 3e109af6 4135c6b9 c18de291 40c2a299 -> c18de292", + "c02f9f06 40f9ae7a 405da5e5 416b0810 418d974c 3f58f1d9 -> 418d974c", + "40ea0f04 c1105c90 4081540f c19e6289 4139c391 40ffc8a7 -> 4139c392", + "41352175 40386d80 c0936dd8 c1547813 c0cad26a 40bf4c69 -> c1547813", + "40d4b81e c04ee272 c0b9e293 c0fab4d5 c13a543b 40e6d44e -> c0fab4d5", + "c08b8f08 c0a85eaa 40df20ce 412d7226 41448d83 40ec8664 -> 412d8733", + "40dc820d c09e3f99 410db09a c1217757 c0fbd81f 3fb3ca60 -> c0fd7b78", + "c17cd7c5 c11a7ff2 c1014a9a c19b7045 4185b88e 40c049bb -> c19b7045", + "c04dab4d 3f4168ca 3fc29978 c022c6e3 4183749d 40e9cd9b -> c022c6e3", + "4061afbe c10e5763 c09181fc 40c43be7 c19ab09b 408dbffc -> c19ab09b", + "402b5c07 406c9943 c018c1c2 40cca1bb c15fdcd4 40094a2a -> 40b523bf", + "3fcea986 410eb88f c0c67fb4 40a00a58 c0cd28db 40eeb5a3 -> beaf96e0", + "c0ceb2f7 40c630dc 41026cbd c15f05e6 4175f3f6 bf24cfa5 -> c15f05e6", + "c15cc9d3 c11c2fd9 c115c2f0 c10865ca 4127c479 40d5859c -> c10865ca", + "418c52d6 be31600d c0a57f17 4107f100 c1448f98 40cfd039 -> 4107f100", + "4189b851 c0f52952 40da4c8d 40a77be7 410a5a2d 3f403248 -> 410a5a2d", + "4185e5cb 3e8e12ff c0bba932 c11472f2 414a2a37 bd9842f9 -> c11472f2", + "40beeba3 3ecfc226 c11bcb81 bfde52fe c193ef26 bf30c107 -> bfde52fe", + "c01f8a50 c0a2c592 bf95e30a c1962820 40eb8f21 40f02770 -> 3fdb1750", + "419f683f c10309e3 c078b913 bdd9a2e9 bf86d083 4092dcb8 -> bf86d083", + "4198ba66 40082af2 c03f3a48 4001d461 41253e41 40ac75af -> 4001d461", + "c12b5e4b 40977a96 c082a9c1 41403fdc c18dfeee 404ab786 -> c18dfeee", + "c1705676 40a06102 4106d329 40903403 411baae3 4074986d -> 40903403", + "c19fcaa3 411521f1 40631dd9 41942dbd bfcd38ca 40b3b4c5 -> bfcd38d0", + "40f42cad c0ab0850 bf994c0d c146f423 3e94ff68 bf6b59e9 -> 3e94ff60", + "3ecfbaf9 40ff6673 c0fcaef9 c0fc53ab 3fa2444c 40b16e0e -> c06cdade", + "c01eab2c c114ef8b 41049345 c15a1f4a 419d87a1 3d61c0ee -> c06eb324", + "414c083d 404058cd 3f2bc765 c165dda8 c0f4272f 40d11046 -> c165dda8", + "c186e237 3fcc9e7f 410fbcff 4164af99 bf890f58 3f605f58 -> 4164af99", + "c1887041 c040a6cb 4061a191 c0f245d0 413982d9 3c6d056e -> c0f245d0", + "4185ef92 3eb936cf 4104b4db c0585029 c16896bf bc6f4b68 -> c16896bf", + "c19f37b1 41132821 c0b573cc 410ed02b c1200233 40fc4f09 -> c1200233", + "4165b6bc c07e5a2e c08e1bbc c16f5310 41131431 40f24dc5 -> c16f5310", + "415ee682 4118d7d4 bf4088f0 418528bc c1808982 40ac5331 -> 418528bc", + "c11107d9 c0bbefcc bf71c62d c16083da 414e3dbf bf2187c8 -> c16083da", + "c0ecd926 40f6514f c0b3f605 412e5070 c18348a9 40ddcad8 -> c18348a9", + "be707056 411740b4 bfd22465 415288af c1488007 40cb1da2 -> c141a1d5", + "c117488a 3fb3da17 40fc2764 4186a54f c13c85ab 408bd642 -> 4186a54f", + "c0e38ee8 bf1e4206 41189ddd 410d5267 c13f9b2d 40190cad -> 410d5267", + "3f70fa42 410778cf 40503468 c08b9bae c15b1ee2 40d70bf7 -> c15b1ee2", + "c0212119 410cf29c c0dd9bc9 414db62c 4120ee25 40a09a26 -> 412719e3", + "40d9a158 bfd61092 c10288be 41439fd3 c158e4cb 409b8b08 -> 41439fd3", + "4138b173 c041e634 c0deab21 417c2a00 c1818d37 405408d2 -> 417c2a00", + "40c5b87e 4052a4af c109e764 412a0c29 c14cd754 40b38017 -> 412a0c29", + "c0ce0600 c0ad2343 c1065b55 41507c52 c1914c6b 3f9ec5ee -> 40bf561a", + "4186509d bff8bf87 3faf9c16 c170b364 c1122114 40957f64 -> c1122114", + "c1954582 405ee511 c0bd7e9b 404edee6 c11fdd8c 402ac05b -> c11fdd8c", + "c03a91ca 402db399 c0aeffd0 c121816b c00049e1 402ea3df -> c05d2c44", + "410de6bf c0234527 4117245c 419c14f7 c180c071 3fcb4456 -> c18074e1", + "c186e8f4 4090d4fa 410adfd5 bfa4f73b 416f973f 40f7b612 -> bfa4f73b", + "415895b8 40c80d3e 411b0b63 c193d9aa c18d4ce0 4024bdc2 -> c18d4ce0", + "c18a2140 c097cd57 40ba39d4 40e1680f bf54c143 40c1707f -> 40e1680f", + "41860fc3 be918fc2 40fc61b0 4160a41c 41148b3d 3e88cc90 -> 41148b3d", + "c0db74e6 40c68bb2 c0b46403 c04cdb0e bf427cdd 40e8c928 -> bf427cdc", + "c138e2d3 3f66a8e3 3f15b821 c15e1c5e 4172b0a3 40d6083d -> 4172b0a2", + "c0ca938a 409721f9 4028ad62 408dc2bd c09da643 407f88ef -> c09da643", + "c12dff34 4107e5df 402f9432 bf6381c5 c0ebba73 40c2e129 -> c0ebba73", + "40af795e c10c6445 410ca2b3 c0761b32 419327f5 40c20dcc -> 418a6356", + "c14934eb 4084f039 c0515f1a c13ee15c c1055d33 40210e9b -> c1055d33", + "415012d8 c0ab21f4 411bd59e c1047a54 418dca74 3f0e909e -> 418dca74", + "bf2830e4 c0305004 40d4eb34 c0d88333 c1640925 3e48f060 -> c0eafac8", + "c1315ecd 40976c17 c0ee6494 41019080 3f6624f5 4044641d -> 3f6624f8", + "40c966c5 c0af4386 40937915 415fabd3 c1380a89 3fe240c2 -> c1380a89", + "4086a910 40c1e88e 41033640 c13c1cf6 3fc96d65 3f154cf8 -> c13c1cf6", + "c159b91b c0d7cf69 40be61fa 419b3fbb 40c4a164 40976b52 -> 419b3fbb", + "c11bc8a7 3e3290f6 40e288fe 4197990b c112e73c 400c8a3a -> 4197990b", + "418a348c 40e01a48 c0a48f79 415e7934 c0d191f4 4096673b -> 415e7934", + "3fac2f75 407084eb c0f78cc7 c08e9065 4164794d 3fd4585c -> c04e32dc", + "419c0bbe 410e32cc bd88de6c 4055d777 417a4b5b 401c74ac -> 4055d777", + "4129acf2 40813f6e c0754d67 41300dfd c042f0c8 40018105 -> 41300dfd", + "3ed2035b c0972155 400018be c0b25a13 41703d19 bf4161da -> 41529c48", + "c186adb9 bf7ad6cb c0e71ac8 41942b0a c105faca 40b85572 -> c105faca", + "c1996b04 c03f7e60 bf6a702a 414feec2 419732db 400a6a29 -> 414feec2", + "41719536 41052577 401ae4db 40124138 c19ee482 40f8097a -> 40124138", + "3fada298 c0bb3b8b 3ff79404 be5fe051 c12cc35b be396f9b -> c12c2570", + "c082f2ad 4112edad c0c975a7 40104ceb 419c3689 4003e5b5 -> 4199078e", + "c1469507 bfc082e4 c0cd512e 414e6e57 4106cdea 40503ced -> 4106cdea", + "4107109e 40fb311a 400bb49c c19ad9cc 403ed43b 3fb265b2 -> c19ad9cc", + "414edd2c 40c9aaca 3fb64b21 410efff0 c0322747 bf06eac1 -> 410efff0", + "c137edd4 c0d14057 402eb23a 419f40fe 4104bf42 4087ce46 -> 419f40fe", + "4114f50f c108deaa c10505fe 3fcab605 c1458b6c 40130e18 -> c1458b6c", + "c194caad c10cfc78 c001b749 c12e93eb 4195f8d2 40824b35 -> c12e93eb", + "413a572e 3ffb04bb bf94a42b 417e86bc 4176fe1c 3f18088a -> 417e86bc", + "405d4f8c bf178dde 40bf7d53 418b3171 3e00d024 3fa54fed -> 40a48ada", + "412aadef bf48e8ee 3c0c8b40 3fa02557 4187dda1 3fa59940 -> 4187dda1", + "c15d343b c0701533 c08aad87 40e1bb3c 40c90312 40445ad8 -> 40c90312", + "413ba168 c0b44ac3 c1014086 41747461 c0e31c14 4003cfb3 -> 41747461", + "bfefc4a5 c0a84dde c11f26b2 417505e7 401d0013 3fbf235c -> 417505e7", + "4092966e c0cc0d0c 409fb5ce 40be5d41 c1837c85 4069df0f -> c183682a", + "c14cb309 408aeb7c c0def062 4127879d 3f756de6 3f76ba20 -> 3f756de0", + "3feed891 c0242dc0 407474dc bf0a21a1 c09c787d 40ebd617 -> c084a7e0", + "c07871d9 c107c9ff c050cfe1 c178c7e8 c1596292 bf4097b4 -> c159d1c5", + "40a24b76 c0cd4d12 40fe6a28 41974583 c156a2a5 405d1027 -> c1388708", + "4174bd10 bf1e8f36 41174318 c166c5c5 4097ad2c 4097cf50 -> 4097ad2e", + "412250c6 c0e5a069 4006ae6d 4091eadb c12166e9 3f101466 -> c12166e8", + "401f092b bf83ef99 bf2c8193 c159ca07 c199eb84 4087f294 -> c199eb84", + "bf9033cd c0b4ccdd c0df307f 41361c16 417af88c 40cc7073 -> 41361c16", + "c192b0af c0e82ed4 c10c9c05 416fc7cc c100a495 bea0f398 -> c100a494", + "41981867 4013d6f2 c11164ba 41053107 4190bb33 40b3a9ae -> 41053107", + "411a0dc2 c115177a c0948da5 40be84b8 416a1d4a 40f8ba9a -> 416a1d4a", + "40df2170 c09daede 41117353 c08c84ae 3fb628ad 40af37d6 -> 3fa1f5f0", + "c1705f9e 405b1d30 40749b7d c0653de9 c1414f04 3fc70141 -> c0653de9", + "40cc7394 bf404ef8 c05ba7fd c11dfeda 40d78c68 400b6aa5 -> c11dfeda", + "c0b70d24 4058cbac c119bc56 c0bad7dd 4148e3ad 403d86da -> 4119362e", + "4086f67c c10fc1c1 c0b115c1 414cd622 c020a685 3fefb3c4 -> c020a684", + "c1459b9d c0b19657 3fe5242c 40dce91b 41834287 4030ae43 -> 40dce91b", + "4137eea4 c11c2734 411aa657 c1908253 c18dd8e3 3f957091 -> c18dd8e3", + "c15069c0 3ffc9071 c11431d4 4114b8ea 41661b80 40ebbefc -> 41661b80", + "c15c2d4c 40da8350 c08a5f3b 40b92a13 c1133015 40e214ce -> c1133014", + "415207ae 410dc575 40d7926f 3f048aeb c19d75c3 3fc33728 -> 3f048aeb", + "c15b7205 40ea6be2 c10b4e71 40f81be8 c1515a93 bf1f6108 -> c1515a94", + "c056ac8f c0bd25c5 c0cc8a6b 416e0ae3 415464a6 408beb8a -> 416e0ae3", + "c186ad4f c04f1e66 410b0459 40dedde8 c0dc9234 40e97f2e -> 40dedde8", + "419b4118 3fef1daa c019aa70 c08fc1ff c185a2f0 40b72b33 -> c08fc1ff", + "40f1786b bfaa0c1a c0743e74 c14adc4d c0b35b3d 409026ca -> c14adc4d", + "41861d9a 40975141 40eccf07 c0dfa2c4 41190eba 406443da -> 41190eba", + "c19ac0f0 c01686a3 3fe2a336 41196c68 415a9e9a 4018811c -> 41196c68", + "c19e18b4 c0573b9a c0c728ba c1847928 415c25f8 40a78e46 -> 415c25f8", + "41944ec0 c0bc8803 c10d050c c186d964 412b2fa6 3f6841e2 -> c186d964", + "418aea6f bef74023 3f8abab2 c0cd07fc 4134070e 40573291 -> 4134070e", + "4125250f c063992e c07ee5dd c029a7a7 40c95d00 3e926a6f -> c029a7a7", + "c0fa402c 411fc783 c0f3e241 419a7e0a 413deb88 40ac6e78 -> 413deb88", + "3fc37e2e c11c7c8f bfb49fbc c129558a bfb06bda bf1aa969 -> bfb06bd8", + "418c566a 408a1ebc c01f74b6 c1108970 c04b8753 3de1e6ae -> c1108970", + "c0ff77e5 c105f75c 4081fee6 3f46eb25 415d5198 40f400f3 -> 3f47e5e1", + "40f84797 c07b74d6 c11deddd c19a92bc bfddadfc 40b67c64 -> c19a92bc", + "bf65afad 4037c547 3ff32027 3fbd0752 416d4f9c 409e59a7 -> 416d4f9c", + "c15cddb5 c049b157 c11113bf bfd9847b 41968bfc 40b94b98 -> 41968bfc", + "40bb9297 be8824ee 40effc22 40b1d7e5 c15ad80f 3e043fd0 -> c14654d4", + "c0b8a7b1 40f5c494 40033d8a 413f29e0 41949fa1 40d35add -> 41949fa1", + "c17432c9 bffee03d 40514813 4115d72b c1482aaf 40906bbc -> 4115d72b", + "419489a1 c0f35574 40cd7b47 41426a86 c168787f 40766dbd -> c168787e", + "c0d760e5 c0c3ec1e c104512c 4159f85d 4041d3dd 40b293ab -> 4141faf0", + "4106b470 c01cf94a 404ab1a7 c12f5a6b 414cc95e bee2574f -> 414cc95d", + "c167eac9 3f85a6cb 4109b3ae c17f419e c1925a7e 409570c6 -> c17f419e", + "c1924089 3f3f8ee6 40ffe056 be318a55 c0cd214a 3f902e99 -> be318a55", + "40717f83 40e30d0e 40d6ce4c 4102807b c0a84f02 3f44d520 -> c0a84f02", + "3fd99c6e 4111d558 40150e2a 3f4f6a20 bfed1393 3fe4d39e -> bfed1394", + "4115b12a 4106ae4d bf951c26 c17e68c9 411dd9c2 40d75600 -> c17e68c9", + "40d41aaa c0bea73f c098893a c198b3ec 418c6e0d 40bca401 -> 418c6e0c", + "40f11436 3f2fa705 40612de4 c12d3c77 c048b9c5 be06af4e -> c048b9c4", + "c18dde2f c0e06b5b bf33fd14 419a75bd 41405085 40774429 -> 419a75bd", + "40f8c19f bfb4cffe 407492f4 4182c10b 40be46f1 bf114b93 -> 40be46f0", + "41580640 404fb2c0 c00e6eb4 404fb1ba c1192f2f 40ccc3ee -> 404fb1ba", + "4115b55d bfa93c2e 3f1c7b4e c118d857 bfd033d3 40d0022e -> bfd033d4", + "4190ece8 411511bb 4082910e 3fe0e300 411b367a 40696d30 -> 3fe0e300", + "4120ef74 c0551a8b 3fc3f3f8 c104adaf 41027ef3 40be89db -> 41027ef3", + "c0a2daa1 bff36e4d c002bae2 c134ea16 c19ef806 beb6ef45 -> c19ef806", + "c19fd38a c0c66d2d 40b1e56c 4182d7d8 40c2f276 40fa5b50 -> 4182d7d8", + "414ab6ea c0ae9a14 3f70c5d5 c10132b6 3fff4a2f 3f4c56b5 -> 3fff4a30", + "418cce78 4117aa51 403f0411 c1834e1e c19d158e bf5b530c -> c1834e1e", + "415e82a4 c08472c9 410e837a 416cca70 40cd5d45 40f82998 -> 40cd5d44", + "c1067c02 40f3d8c9 410bf1e4 c0868209 bfd93d9e 40bef618 -> c0868209", + "40abd357 40d6637d 3eb770d6 c19e3466 4128bfc4 40ec15f5 -> c18e4595", + "c062e992 c01e78bc 4101e08e 40a1e9fe c1877f6b 40ef09fa -> 40a1e9fe", + "c160aa61 c0d5688c 4018f5cc 3fcf8bc5 c08e27f7 401edf6c -> 3fcf8bc5", + "c10312ae bfcec7c6 bfa003fd c1541385 418c0c6b 40a803f2 -> c1541385", + "4084aeaf 411e57b7 c0f25a20 4169cb67 c188b491 4086008c -> 41027926", + "c1463011 3fcc0c8e 40fcbc72 4104b13d 40b3e2db 40f4c2df -> 4104b13d", + "c103c04d c01c3445 c0f34e0b 40cf38df c0d6e177 4078b76a -> c0d6e177", + "c181f1e5 3f128fe0 4033e983 40d60ff4 c0fff996 407dd21c -> 40d60ff4", + "c17fce0e 4112fab3 40dc6b20 412af939 419afcf2 3f7adb42 -> 419afcf2", + "413490c3 c109ce49 c100227e 40069ec1 41428193 40c5835f -> 41428193", + "bfbafc39 41017596 4115d1e9 41855ea4 c138f78f 402aa00d -> 41855ea4", + "404a3dc5 40b3181d beeb2ca7 c1878f95 c084ff5b 3f604d19 -> c14d54e8", + "407808e9 40ece617 c0e775ec 4192ec2c 4189e3bb 407b893e -> 41921230", + "c0943a65 c011df10 40fc5253 c070a43a c160c3e1 40bb4529 -> c070a43a", + "c0233104 41188d60 3f2f50be c1129a0c 4176a575 40fbd2cc -> 4176a574", + "415cb3db c1010242 c066fdfc 4191e39d c11ee5ca 40a58c68 -> c11ee5ca", + "c179fb5c c0f4636a c0d6a0ad c198bffd 4016ea7a 404bf9c1 -> c198bffd", + "40db6de2 3da894fb c08f406c 3dbb0dbe c020adfd 4093f3e5 -> 3dbb0dbe", + "406013b1 c0a64642 c08c9086 c1889e01 3fd53eb8 4087673a -> 3fd53eb0", + "c07d71c1 be9563e9 40b7850c 3f7307ee c1242bc2 3fb92074 -> 3f7307ee", + "c0567eec 40aa10aa c0da018a c18d3dba c0ac7611 40a801da -> c0e51b38", + "c188e938 c0947acc 40a87da6 c11325a1 418780ed 40a1f1bd -> c11325a1", + "c15f6212 406d7250 411b968d c1825ddd 416a53f8 40f93f6c -> c1825ddd", + "c16258ac 40a7a7c3 bfdc7eda 418f5583 c09a4655 3f806d9e -> c09a4654", + "c185bd82 3f08ac96 4097e04e 4183fb00 407d7650 40d4f897 -> 4183fb00", + "41536f0e c11dce57 bf63e534 c1966f4e 4189a8e0 40411bae -> 4189a8e0", + "c0696d12 c10296a1 c09489a3 40bc08cb 4054ce56 3ff8e895 -> 4054ce56", + "c10eada5 40f2d8e1 c0cc034a c04bb9ff c178c642 4097101f -> c178c642", + "409857fa c0c79fb1 c0dcbb8d c16fbbbd 418536ba 40c7b320 -> c16fbbbd", + "40f734fc c099e983 3ffef73a c04cf780 c0e599a4 40468bc5 -> c0e599a4", + "418d130f bfdaa6ae 3fe1ce68 bf5242c8 c18bfb54 40092b09 -> c18bfb54", + "411d7167 bf457f20 c01e8fb7 c19b71fa 3f883a76 408ab82e -> c19b71fa", + "bfa1ad58 40b8fa0b c0a14cbf 400e189d 4148e306 4069e943 -> 41223b98", + "41000e8f 40ac2ecf 41154117 41456144 c05e2de3 408067f9 -> bdce1400", + "c15d90ae c025158c 40b3dbcc c1362546 4137b85e 40d5901d -> c1362546", + "bfab71b7 c0a2662d be16660c 404f472a c11ada1f 408ff363 -> c1072ae6", + "41097a0b 401e4641 c0c86c52 c06f1a7b c0271cce 3ee7c1c5 -> c06f1a7b", + "c0556ba9 bfeef9f2 40c1ec27 c0c46084 c187f49a 408a1ca1 -> c0c46084", + "41249086 40c98091 c0bae60c 40ffc2b5 40b9bacd 3fddf677 -> 40ffc2b5", + "c1050932 c0b99d22 c081722a c125f389 c149c058 40dad0cd -> c125f389", + "c0a8b0a4 3f4de8c3 4023b82c 407d0215 4102120f 40d0fac6 -> 407d0215", + "c0fc4b7c c0c244fe 410f16cd c18e86e3 415eccff bf7f92a7 -> c18e86e3", + "40bc8376 c0303782 40c136e4 c0c66802 40f33e05 40e49fb2 -> 40f338da", + "c0652bb4 c10ca3e6 c10ce3d0 4081faf9 419b328c 40cfeea0 -> 4081faf9", + "c100c5fe bf99417a 40702e3f c187198b 414ad810 403c69cb -> c187198b", + "40e8c54f 40c63207 41113091 40c06375 41879f1d 3f37ce1a -> 41106386", + "c0f3b62f c0f411f2 c1112107 407b959c c10e0101 40ca7d8d -> 407b959c", + "40711579 c0ae9f37 c0ed4b33 c06aefa1 c1414abe 40d52bc0 -> c06aefa1", + "c183d4e4 408b6e58 410583d3 4166b5fb 418fd8cc 40881b08 -> 4166b5fb", + "c183d59c bfa20955 c0559fa4 4168383c 4162ea26 4097f11d -> 4162ea26", + "40e5f9ee 40cf605f c0aaafaf c18b759e 4183d092 404625bd -> c18b759e", + "c15b29fa 4023b5fa c0ebdfa9 bd94a43d 41856bee 40d6879c -> 41856bee", + "40a3f2c4 c09b877b c11b5ec8 c121fe5d c186fa69 4092e94b -> c121fe5d", + "c10e57bf 41039d9f c0e42b98 c0f0f972 4059ac44 3fe63417 -> 4059ac44", + "41393122 c0060106 bfb948dd 40b0a654 c1446674 3e92763f -> c1446674", + "c0c2c82f 410ccb13 c1188a61 c12ac5c2 c095ba6b 4049b03a -> c09f26af", + "c18c35ce c04a0221 4069ef70 c0016c1d 40351bc4 4008e3a0 -> c0016c1d", + "c08b8430 c0264707 bf971500 3fa3e2cc c072d328 3feaa87d -> 3fa3e2cc", + "c120031e c0cc1ad5 40849899 c1153c97 c1248018 bf7d82ef -> c1153c97", + "c1626d49 40506f31 bd96fcbf c1522407 416c4be8 401776e4 -> 416c4be9", + "c0d1fe94 c05f9b15 40baf8d1 409a3f65 41168700 40817900 -> 409a3f65", + "3fa7ba3f 4018ce0f 40d1a1e9 c074e103 3d9be840 40f67a41 -> c074e103", + "413f91bb 3fdec400 40d23d83 c1094c3b 412c526d 4057dbab -> 412c526d", + "c195fba1 3e09f0ac 4116ad19 3f415763 413c4147 4010e43a -> 3f415763", + "40994c2e 41088a29 40e70144 409bf1e6 418e1faf 40e7973c -> 418e1faf", + "c19e3816 408c9668 bfda7f41 4130523a c146ead7 404c3927 -> c146ead6", + "bf649706 c0d5562e 40de9a1b c1597e58 c17f1504 3fae16ac -> c1670075", + "3ebf22d9 c031f90f 4028ed76 c083fff0 c13dac1f 40b103fa -> c1127e2a", + "416aa941 c0f176dc c11892f0 c1267e3b c181540f 408422a2 -> c1267e3b", + "41538fbb 40d61985 c084e540 c13e827a c146fb4b 40c4cbfa -> c13e827a", + "4142da76 c08c8ffb 40e576d8 c16324f0 c0d607d4 40b2c882 -> c0d607d4", + "4068cc9b c024f0b8 406aa07f 4151a6c0 c12f1672 40170bfa -> c12f165e", + "3ea5665c 403edcae 404f51ee 416b678d 409b1900 be50a19a -> 416b678d", + "4171e4bd 410a02ff bf06ab7a c196a7be 415b77a4 40b0ec6c -> c196a7be", + "4176c2b7 40e106ed c10f9fdd c0e76aed 4124f814 4048cd5e -> c0e76aed", + "40bc68fa 40eb58ec 407f84a7 c0d851c7 41667c17 40a67d59 -> 3fa90d04", + "c0ca0be6 c10d6819 4087ad4c c0d20088 409d2b26 40bea0ba -> c0bea8ac", + "bf9d1483 c0bd586c 4115ddca c15e0fb9 40b6c4bc 40204e11 -> c12810d6", + "c187304e 40d748d9 4100f3af 4183d28f 40f77239 40bed51a -> 4183d28f", + "404538c7 40d3bd3c 40ee0406 418fd6be c0793ab0 beb88849 -> 418fd6be", + "c025eca8 bf79c968 411b68fb 41529256 40ee031f bdb18d54 -> 41529256", + "c186fef1 c0ff97ae 411511d1 c076024d c0d473a4 40ebd6e3 -> c076024d", + "416387a6 c0c1efe3 bfb93333 416ff0d9 c19716b6 40bf650a -> c19716b6", + "4155921e 3fd249a4 4084f74f c18b1899 c10e583a 405f300f -> c10e583a", + "c00a5a5d c10f018c 40eabead 406d01f1 402ec0a4 401fe262 -> 405775b4", + "4117b548 3f20ab3f 3f6128b7 c161a0eb c0850899 3fdd79b9 -> c085089a", + "c119f2de 40dbfa9b c0ec2d0a 4150c4d9 401591e4 40e34649 -> 401591e4", + "413bf796 4089b1b4 4114c620 c13bdce1 4132659a 4043aef3 -> 4132659b", + "4144367b c0c9e419 be41b4e6 c118891c c09f46bf 4085719b -> c09f46bf", + "405eb3f6 40e2cc73 c0de2048 c0185083 c1359fdd 408ace7b -> c0582c1c", + "c18e53e4 c0ea6cac bf99c250 4155c2dd 40689b51 40624021 -> 4155c2dd", + "416ded3e 40bbb363 410f642f 412dd418 41057f49 be656a4e -> 41057f49", + "c0d3432b 40c5907b bfe8de6e c126f596 c1833f26 40a6e3ae -> c1833f26", + "c0d8e09c 4116530c c11fa63f c172a6d1 c180c887 4099c86f -> c180865d", + "c0f865a5 c10292c4 3faedc0e 41208f6a c1937583 40cd7fa2 -> 41203f63", + "41475746 c0ba3420 c0cd6a86 c13a4d6e 413a7b15 3ae31bd2 -> c13a4d6e", + "bfecc79b c113c3ea c08d1af5 c1350e5c c1304180 3f4bd0d5 -> c1304180", + "412b6c13 408a33ba 407f1ff2 c198d1ec c17c51a6 4040e68c -> c198d1ec", + "c127099d 40d23fba 4086f72c bf9d9e49 c132b092 407cb6a5 -> c132b092", + "414c436d 4092e536 4058f2e0 c0c10b3f c09ea98a 40e00d4f -> c0c10b3f", + "4169f46c c0bb9ec9 41014939 c13bd9cc 413ed114 40f12584 -> 413ed114", + "403ae71e 40f4e092 403efe33 409c3ea5 418f7c88 bf71ebf4 -> 418f7c88", + "417fcbb3 400b4828 bf04c1fb c168673f c1491b5b 3fa8b12d -> c168673f", + "413fc980 c0ac9aae 401f042a c01d0c06 c0ae1f93 4086b800 -> c0ae1f93", + "c101aa94 40b9c36d 410276f4 bfda3551 c12cdc46 406471a6 -> bfda3551", + "c0472b71 3f14c1be 40b01d4b c1355672 c00aa32e 3fa6dacc -> c1355672", + "413a9251 bfd5fe72 bf80d70a 4189782f 3ede7aa9 4045e0a8 -> 3ede7ac0", + "c15f33bb 410a066b c10cf3ae 411e9266 3e7f9539 3f8415af -> 3e7f9540", + "c089153e bedc593e 40bc5c9a 41581674 4116b2c1 40f8854c -> 41581674", + "41511d9a c0c736c3 c11adf47 c193d0b2 4111e265 407088bb -> c193d0b2", + "c0b54789 c0f05108 c09e444a c16b8478 3f057e9a 40d5ddba -> bfcae988", + "40e55b11 40dec741 c0e817d0 c113c0c1 405afc1b 4094c8c2 -> c113c0c1", + "c152ead6 c0c8efb4 c0e30a6f c0e0b90c c0810631 403cb65d -> c0810631", + "419d1ae2 3f3fab58 c0ffa66a c18658bb 4133bd64 40b836b5 -> c18658bb", + "bf5e3874 c1107040 c0d09352 bfb4bf34 40cc69ae 3f8ac8c2 -> 40cc69ae", + "c194f6dd 3f31ba93 c03361b0 3fff747c 419e44c9 4085e300 -> 419e44c9", + "40c35ac3 c0f76221 41027311 c0fb5dc1 c16884b9 40b4e7af -> c166a5d7", + "c077e520 40f5f0ef bfd22316 c09e935a c069b553 40c73789 -> c069b553", + "c03e7541 3e50b201 3f4eb96f bd98379b 417446fd 3fa1292d -> bd98379b", + "418fb32d c0fbd618 40d30fbd 414f62f1 417eb102 40cafeec -> 417eb102", + "411bed32 bf9291a1 3f97810c c162f3f6 c1930431 40ddda9f -> c1930431", + "40402bc6 c0ddc43e c116cd60 415e1306 c198489c 40dcb7da -> 415e1306", + "40cb8200 beec9fa7 40003fd0 c1115ebd c164df05 3f78e621 -> c164df05", + "40afb3d0 40c68767 3f4ba90e c03be0de 4192e3ca 40657f8c -> c0227790", + "c142c05d 410d28d3 c0c4c7f5 c19bb385 c1458dc5 4040d2ab -> c1458dc5", + "419d0144 c0e6fe6f c03ff606 c17cb948 412db2ab bee9dd69 -> 412db2ac", + "3fbe57b2 c1116a68 410b980d 413b91e0 c1848142 40315017 -> c0e8c590", + "415db393 3fd45789 c0170131 3ff9da8d c0b7b5ba 408a54a4 -> 3ff9da8d", + "c01fb4de 3f2ae859 c110df13 41288437 c15d6446 406c2a01 -> 40b67c39", + "4145d12b 40a8f0c6 c0b4524c 415d7850 413be4fc 3fc81351 -> 415d7850", + "c13e6e38 3ea584f7 bf67e1b3 c0ec3955 c0ca2421 40e1d279 -> c0ca2421", + "405cd4e8 c087f97a c08ff7bc c0fc1960 40ff1607 403815b7 -> c0fc1960", + "c01356d6 40a16f6d 3f9e7f4d c1349019 414cb257 40e8ea37 -> 414cb257", + "41186ad1 40957f3b 405d9d39 4101d286 401b310a 3ff5a2d0 -> 4101d286", + "c02d52df 4083dd22 c0503a9a 3fb45c82 c18fb599 3f9638c7 -> c18f2660", + "414e07c7 40d0ee59 3fc77bf6 417836f1 40f2c30f 40984b45 -> 417836f1", + "3fb55789 3f4f815b 40da9cd7 4177e953 41659309 40154873 -> 4177c05e", + "40a937ac 4062aea9 3fb989a3 41425451 4001db7e 40188381 -> 41425451", + "c134ec89 40f5c07c c0354300 c118f751 c10333ce 4009105d -> c10333ce", + "c18ca76d c0cfbb29 c009df88 419aebcd 3fca6390 40094104 -> 419aebcd", + "418b334b 4086c219 40c2e4e9 4183907b 415e0bf2 3e8707b4 -> 415e0bf2", + "3fec000b c0686260 bf6c8859 414eff8d 41930f0a 40f81aad -> 41930f0a", + "c196d750 40867003 c015df15 c121a8cd c03783f5 40b2957e -> c03783f4", + "40e85b5d 40a4316e 405cd2fe c162d9c3 bdb54615 40995291 -> c162d9c3", + "411a6374 40c614f9 3f67b312 410e03b5 4127297d 401da4c6 -> 410e03b5", + "c1573f0d bf768017 c09aaa0e 40cdd31f c11bd2a8 4096189b -> c11bd2a8", + "4008fbe3 bf3f07a7 3d625435 4132a1d1 c084143e 4097ba02 -> c084143e", + "bfd92287 4049b3ee c0b224d5 c1757a02 c10839d1 bf0b6c90 -> c1337732", + "4129680b 405bfbb7 3f74014d c191e586 c1087f6f bd83098f -> c191e586", + "40c53db6 40209067 c1179708 c191b6f5 c179fbf8 40a00000 -> c191b6f5", + "3fca3125 c04ad41b c0b847e7 c0cb8e4d bf6d477a 40800000 -> c0cb8e4d", + "c131aa4f c07c8f8d 40d4af33 4150a780 4196618f 40400000 -> 4150a780", + "c156c168 40a787f2 40b6aeeb c01b47c8 41846f08 40000000 -> c01b47c8", + "c11b10bb c0795606 c0f07677 c11b5040 c12ab0a7 3f800000 -> c12ab0a7", + "40026380 410267ca 40be39fa 4142a4e2 c1167a63 00000000 -> c1167a62", + "c0650c95 c099560b bef376a4 c134b7ef c0539bbf bf800000 -> c122f801", + "41883c02 c0eb33be c0a09195 c17a67d8 41640050 c0000000 -> 41640050", + "41641ca4 40d0c876 c116ee3e 4185a54b c166dfcf 409fb5cd -> 4185a54b", + "c0aab977 40ceff93 3fcfe717 414b5b04 41462697 40d8f9cf -> 41462697", + "41414819 40c747ba c0f0c8ae 415a65fc 413d6145 3f1246be -> 415a65fc", + "415ba556 40a3c6af c1095fc8 c09d979a c189bd27 4083abdf -> c09d979a", + "414d8095 4106e794 405d2c9c 419532d9 bf936409 40c06d5e -> 419532d9", + "c1917c6e 3f63625c c0887329 419e21ef 4185d383 4026808e -> 4185d383", + "4029e43a 3e8b0870 bff18804 c12d3f55 bf841b7b 40b68a57 -> c12d3f55", + "c1708610 3f6c153b c118aa07 c032ac64 40fa8b30 401d1db7 -> 40fa8b30", + "418e9269 c0f03f26 c0f03f26 40d4f274 c0b69976 4055a0a7 -> 00000000", + "4027a4ac c11845f1 c11845f1 4118fdd9 c0baf92d 40c75adf -> 00000000", + "c1253e4b c1165e48 c1165e48 41998ce4 3dcfa597 bd5546e4 -> 00000000", + "410fe2c4 40d70e24 40d70e24 c11966af c10b0f47 4089e69c -> 00000000", + "c1809794 c05145dd c05145dd 416346ae 412b3819 40e32d4e -> 00000000", + "418149a9 c082a2a4 c082a2a4 c0b5234d c1629890 403fcb10 -> 00000000", + "c0bf9063 41077b4a 41077b4a 3ff6caa7 419f881c be46405f -> 00000000", + "c19a91f5 40df0e8c 40df0e8c c04744ec 40fe8948 40f22358 -> 00000000" + ] + }, + { + "function": "cycles_map_range_smootherstep", + "node": "ShaderNodeMapRange SMOOTHERSTEP with Clamp", + "then": "cycles_clamp_range(result, to_min, to_max)", + "cases": [ + "00000000 00000000 00000000 bf195336 c119b4cb 40ac8b5c -> bf195336", + "00000000 00000000 3f800000 407f51e6 418c2deb 40a9f449 -> 407f51e6", + "00000000 00000000 bf800000 c18aa670 4130926a 4010497a -> c18aa670", + "00000000 00000000 3f000000 415e0d65 4170a455 3f389a8c -> 415e0d65", + "00000000 00000000 bf000000 414094fd 40eb88f5 bf1fea85 -> 414094fd", + "00000000 3f800000 00000000 40ee70d5 41232fe8 40c26996 -> 41232fe8", + "00000000 3f800000 3f800000 c18c7804 41995da2 404b3b85 -> 00000000", + "00000000 3f800000 bf800000 40cd1ffa 3f319e98 40d2884f -> 406353cd", + "00000000 3f800000 3f000000 4159fae8 bff8676b 40e8f5f2 -> bff86768", + "00000000 3f800000 bf000000 410d8dc9 c13bf272 bf183625 -> c0ed95ca", + "00000000 bf800000 00000000 416046a7 40734764 3fd68a45 -> 40734764", + "00000000 bf800000 3f800000 40ac1bad 41321ec1 4056a441 -> 4104164c", + "00000000 bf800000 bf800000 c0354aa3 c0b133da 403ea084 -> c0354aa3", + "00000000 bf800000 3f000000 41443fd1 c107e48e bf35e761 -> c0845e36", + "00000000 bf800000 bf000000 41562b10 bef01474 40a33e4b -> bef01474", + "00000000 3f000000 00000000 4166c1b9 414eb94e bef5128b -> 414eb94e", + "00000000 3f000000 3f800000 c13ecd82 c08ef5d8 3f7d7e04 -> c13ecd82", + "00000000 3f000000 bf800000 402450c8 c12547a0 3ffbd309 -> be0ec7c0", + "00000000 3f000000 3f000000 413fd659 410a110e 40a4e53b -> 410a110e", + "00000000 3f000000 bf000000 c0656ece 416e63db 40ca5b26 -> 40b50827", + "00000000 bf000000 00000000 c16f2508 4039e927 befd09e2 -> 4039e927", + "00000000 bf000000 3f800000 400043b8 c126b7e8 3f6b54af -> bf1a771c", + "00000000 bf000000 bf800000 4122c809 40976a69 40d91a18 -> 4122c809", + "00000000 bf000000 3f000000 4191bfdb c0766d8a be8364e3 -> 40e5e454", + "00000000 bf000000 bf000000 4044694e 4190e80c 40d54928 -> 4044694e", + "3f800000 00000000 00000000 c195827c 40ec3cc7 40053582 -> 00000000", + "3f800000 00000000 3f800000 41926591 3f7068b4 40d0ff2e -> 3f7068c0", + "3f800000 00000000 bf800000 c1006519 410642a6 40f794fa -> c1006519", + "3f800000 00000000 3f000000 c152a6e9 c17b9382 3f36d683 -> c17b9382", + "3f800000 00000000 bf000000 4105b810 4156d22b 3fb941c7 -> 4105b810", + "3f800000 3f800000 00000000 c18b2242 4139215f 40cb8ec6 -> c18b2242", + "3f800000 3f800000 3f800000 c109d27d c172467d 40aec57a -> c109d27d", + "3f800000 3f800000 bf800000 c178fff1 bfd60877 3ff22233 -> c178fff1", + "3f800000 3f800000 3f000000 be4d1aef c106749a 3faf8163 -> be4d1aef", + "3f800000 3f800000 bf000000 419b0651 c1784d4e 3fc14abf -> 419b0651", + "3f800000 bf800000 00000000 c086db3c 41478206 40258106 -> 41478206", + "3f800000 bf800000 3f800000 c1885d59 40b42f9f 3da8bbb5 -> 40b42f9f", + "3f800000 bf800000 bf800000 c0cc21d3 418e98aa 3ec7c063 -> 00000000", + "3f800000 bf800000 3f000000 3f460c80 41078840 3fcc5e4f -> 41078840", + "3f800000 bf800000 bf000000 3dfa9a5b 417e5d77 40871b3c -> 417e5d77", + "3f800000 3f000000 00000000 4027f054 c10c8ff4 3ec9592a -> 4027f054", + "3f800000 3f000000 3f800000 c162d0f2 4142f0f6 40e2562f -> 4142f0f6", + "3f800000 3f000000 bf800000 c0f18ebf 40bbf0e0 4090ab0e -> c0f18ebf", + "3f800000 3f000000 3f000000 405f24e0 418d335b bf296379 -> 405f24e0", + "3f800000 3f000000 bf000000 4144baaf 41859d7e 40748cbe -> 4144baaf", + "3f800000 bf000000 00000000 c13db05e c17b304b 40a935f6 -> c17b304b", + "3f800000 bf000000 3f800000 4079e3bc c154c9d1 40fb8b2b -> c154c9d1", + "3f800000 bf000000 bf800000 41381e15 41888799 40b119ce -> 41381e15", + "3f800000 bf000000 3f000000 c0a4bd85 c14be31b 40e7265f -> c14be31b", + "3f800000 bf000000 bf000000 c19f65e6 c16a9d1f 4081d4d1 -> c16a9d1f", + "bf800000 00000000 00000000 41223df3 4176f765 409daa14 -> 41223df3", + "bf800000 00000000 3f800000 c112614d 413e2690 40725235 -> c112614d", + "bf800000 00000000 bf800000 c19b6807 3e3d720f 40cf6047 -> 3e3d7200", + "bf800000 00000000 3f000000 4147e39a 4087ff78 3f1397c0 -> 4147e39a", + "bf800000 00000000 bf000000 4140ca15 41673c3a 402c4c36 -> 41673c3a", + "bf800000 3f800000 00000000 407ae149 417f7e48 40de7b9b -> 417f7e48", + "bf800000 3f800000 3f800000 409b12ce 415a3ddd beb7abbb -> 409b12ce", + "bf800000 3f800000 bf800000 410002bf c0b7223c 40369b38 -> c0b7223c", + "bf800000 3f800000 3f000000 c146186a c14845f7 409ff092 -> c14845f7", + "bf800000 3f800000 bf000000 41964e4b 40480af6 403cdff4 -> 40480af8", + "bf800000 bf800000 00000000 c124b64c 410d881b 402652ce -> c124b64c", + "bf800000 bf800000 3f800000 4174ddbd c1180b85 40d102dc -> 4174ddbd", + "bf800000 bf800000 bf800000 c10d14aa 409a294a 40dacd58 -> 00000000", + "bf800000 bf800000 3f000000 410ec51a c119f89d 40a28b8f -> 410ec51a", + "bf800000 bf800000 bf000000 c19d644a 412819da bf596ea9 -> c19d644a", + "bf800000 3f000000 00000000 3f46edad c152c624 be8da0be -> c152c624", + "bf800000 3f000000 3f800000 40aa7876 c1873e2b 3f1a9d10 -> 40aa7876", + "bf800000 3f000000 bf800000 c1446399 415a99db 4025ed1f -> 415a99db", + "bf800000 3f000000 3f000000 3c06a168 40e17a20 40f0f6b2 -> 3c06a168", + "bf800000 3f000000 bf000000 4184f102 41845873 40dc6b23 -> 41845873", + "bf800000 bf000000 00000000 4180aec1 c1464956 3f18c607 -> 4180aec1", + "bf800000 bf000000 3f800000 c110b474 3f483c08 40dd2300 -> c110b474", + "bf800000 bf000000 bf800000 4061581f 416c16cc 3fffc760 -> 416c16cc", + "bf800000 bf000000 3f000000 413672c8 c10ed29b 40c91798 -> 413672c8", + "bf800000 bf000000 bf000000 418576c2 c0ca1d1c 3f25c81a -> 00000000", + "3f000000 00000000 00000000 4100073d 41279cdb 4098c35a -> 4100073d", + "3f000000 00000000 3f800000 4005b1be c188d7bb 3e121fb9 -> c0f04307", + "3f000000 00000000 bf800000 41542e7c c0c552ec 40fd4e5c -> 41542e7c", + "3f000000 00000000 3f000000 c0d7d683 4199dc58 40e626e4 -> 4199dc58", + "3f000000 00000000 bf000000 c146b9b3 414d9b60 408ab7bd -> c146b9b3", + "3f000000 3f800000 00000000 c185efb5 c0c89536 40d93918 -> c1381502", + "3f000000 3f800000 3f800000 40f6e8da c08f392a 401de358 -> 00000000", + "3f000000 3f800000 bf800000 4190896d 41973dbf 40f6efef -> 41913b17", + "3f000000 3f800000 3f000000 41792e11 c13a3967 403de1ed -> c13a3967", + "3f000000 3f800000 bf000000 4177f6cd c127ab5f 3feadbba -> 4120bb7d", + "3f000000 bf800000 00000000 c0c2234b c19e960d 3f86792f -> c19e960d", + "3f000000 bf800000 3f800000 c05f9234 c0aabd9f 40da88f3 -> c0a4a34f", + "3f000000 bf800000 bf800000 416049e2 c15a6499 409527b0 -> 00000000", + "3f000000 bf800000 3f000000 409b731c 40f262f0 bf605be1 -> 40f262f0", + "3f000000 bf800000 bf000000 c16b5788 c187f8fb 40fa68c0 -> c187f8fb", + "3f000000 3f000000 00000000 40d741f1 416c1283 40e51701 -> 40d741f1", + "3f000000 3f000000 3f800000 c0a22c9c 4185c6b3 406fc81a -> c0a22c9c", + "3f000000 3f000000 bf800000 4062c6f0 c19f6e03 be94ebbb -> 4062c6f0", + "3f000000 3f000000 3f000000 c02014c8 c0c45daa 4097fd46 -> c02014c8", + "3f000000 3f000000 bf000000 411212bb c18cc3a6 40cd4479 -> 411212bb", + "3f000000 bf000000 00000000 c19d0ee7 413a1d20 3fe7d805 -> 413a1d20", + "3f000000 bf000000 3f800000 c0c0ccdd 40eee469 bf61f3b4 -> 40944a47", + "3f000000 bf000000 bf800000 3ffe7f16 c154bcc9 40b48da5 -> 3ffe7f16", + "3f000000 bf000000 3f000000 c1902845 3e8e3535 40ab3f5b -> 3e8e3535", + "3f000000 bf000000 bf000000 c1743b7f c102d493 bf42c08a -> c102d493", + "bf000000 00000000 00000000 c1121f62 41891aea 40ebd3ff -> 00000000", + "bf000000 00000000 3f800000 41929a31 415b9e15 40bbb2a5 -> 41929a31", + "bf000000 00000000 bf800000 be2cf1d1 c185cd74 409c20aa -> c1072757", + "bf000000 00000000 3f000000 406fb07c c0184d95 4075ef2e -> 406fb07c", + "bf000000 00000000 bf000000 4140719d c15ae52f 3d60cb24 -> c15ae52f", + "bf000000 3f800000 00000000 4160a9e4 4190e5d5 3ea8d02d -> 4190e5d5", + "bf000000 3f800000 3f800000 c13a71f3 419d6ae1 40949f9d -> 00000000", + "bf000000 3f800000 bf800000 3f8e8f6e 40a68a71 3fe784fd -> 4098fd93", + "bf000000 3f800000 3f000000 bfe89628 40f640e5 4020287a -> 40f640e5", + "bf000000 3f800000 bf000000 410ef3d8 41639953 40e7ee62 -> 41639953", + "bf000000 bf800000 00000000 c064ab7d c0e0342d 3f3d9051 -> c0a944f6", + "bf000000 bf800000 3f800000 40279515 418a1fa0 40d54b96 -> 40844f2c", + "bf000000 bf800000 bf800000 413c6b0f 40e6b47a 401d0e73 -> 40e6b47a", + "bf000000 bf800000 3f000000 4198d346 419c54db 40c19047 -> 41998fa8", + "bf000000 bf800000 bf000000 4054ccc9 3fcc1030 40b9002a -> 3fcc1030", + "bf000000 3f000000 00000000 c0a7a6f1 c181e8d3 be3e92a0 -> c181e8d3", + "bf000000 3f000000 3f800000 c19b87e1 4166b6c0 4086671f -> c19b87e1", + "bf000000 3f000000 bf800000 bf8a2e7b 403547a6 4084aa2c -> 4000bba2", + "bf000000 3f000000 3f000000 40e898a3 416527b3 402c8fd5 -> 40e898a3", + "bf000000 3f000000 bf000000 414a5594 c0b3b3fe 40dd5301 -> c0b3b3fe", + "bf000000 bf000000 00000000 419565d8 c157cca8 40cf6aea -> 419565d8", + "bf000000 bf000000 3f800000 3f85fe4b 413e4b0b 3f97e2b6 -> 3f85fe4b", + "bf000000 bf000000 bf800000 c150a1f7 404f5a39 40e53fa5 -> c150a1f7", + "bf000000 bf000000 3f000000 415ad565 c148d290 40e57207 -> 415ad565", + "bf000000 bf000000 bf000000 c09ea224 41882aa0 40322274 -> 00000000", + "40000000 00000000 00000000 41126806 412ff472 40a2b1af -> 41126806", + "40000000 00000000 3f800000 c164d483 419fcd22 40d5bae3 -> 419fcd22", + "40000000 00000000 bf800000 c15feafc 410db0b8 40b8ae79 -> c15feafc", + "40000000 00000000 3f000000 c16b12d5 40c19e8e 3ff1d2ea -> 40c19e8e", + "40000000 00000000 bf000000 c111973b 40df27a4 40d5e098 -> c111973b", + "40000000 3f800000 00000000 413a1cc6 413de53e 407a599f -> 413a1cc6", + "40000000 3f800000 3f800000 4189a94e 419c18b1 40d79f9a -> 4189a94e", + "40000000 3f800000 bf800000 412b497e c1504bee 3f908761 -> 412b497e", + "40000000 3f800000 3f000000 c15f7aa8 c16b409e 40540ba4 -> c15f7aa8", + "40000000 3f800000 bf000000 c1432228 410ff935 40d46688 -> c1432228", + "40000000 bf800000 00000000 c0388ace 411def19 408e0da4 -> 411def18", + "40000000 bf800000 3f800000 c178dd18 c1093cfe 409b742d -> c1093cfe", + "40000000 bf800000 bf800000 c00b9963 c09eaed6 40ae4f61 -> c00b9963", + "40000000 bf800000 3f000000 3eb8bd95 4098118c 3f9058c0 -> 4098118c", + "40000000 bf800000 bf000000 c16ada58 c13273bd 3fd051be -> c13273bd", + "40000000 3f000000 00000000 bf950db5 41763088 3fddc042 -> bf950db5", + "40000000 3f000000 3f800000 40cef7fe c0bddbe9 40f15f9d -> c0bddbe9", + "40000000 3f000000 bf800000 c1188806 411f4d28 4097b514 -> c1188806", + "40000000 3f000000 3f000000 40ee7482 be6265c1 3fcbedb0 -> 00000000", + "40000000 3f000000 bf000000 415f42e0 411d7952 40c6ec0d -> 415f42e0", + "40000000 bf000000 00000000 419c2bac 402063d0 3f5cf678 -> 402063d0", + "40000000 bf000000 3f800000 c101bec6 c0d7f191 3f66c56c -> c0d7f191", + "40000000 bf000000 bf800000 c10809bc 406d57dc 40e4d80f -> c10809bc", + "40000000 bf000000 3f000000 c1304174 419d744d bf2b46f3 -> 419d744d", + "40000000 bf000000 bf000000 40d2d2fe 419d0859 408105f6 -> 40d2d2fe", + "c0000000 00000000 00000000 c009cd5d 4184a37a 40c2e350 -> 00000000", + "c0000000 00000000 3f800000 3f9e1e87 408068b3 40388d79 -> 3f9e1e87", + "c0000000 00000000 bf800000 4131a13f c1964f26 40f468c0 -> c1964f26", + "c0000000 00000000 3f000000 40cb755d c149706c 3fd69a3b -> 40cb755d", + "c0000000 00000000 bf000000 c10e778c c15400d1 3f2936a7 -> c15400d1", + "c0000000 3f800000 00000000 bdfd8a60 417fc8dd 40d6e601 -> 417fc8dd", + "c0000000 3f800000 3f800000 c003cd13 c13f2318 40e1823c -> c003cd13", + "c0000000 3f800000 bf800000 417af633 c0e9748c 3d5ec6ea -> c0e9748a", + "c0000000 3f800000 3f000000 41692f21 413823a3 407fcf68 -> 413823a3", + "c0000000 3f800000 bf000000 c11b55e0 c183e0eb 40939963 -> c183e0eb", + "c0000000 bf800000 00000000 3e9e6bbe c13fc6b6 3fe1f0c3 -> 3e9e6bbe", + "c0000000 bf800000 3f800000 c16e8e20 c112c69b 3f18a846 -> c16e8e20", + "c0000000 bf800000 bf800000 c19a2914 bfdd55c2 3f67ef88 -> bfdd55c2", + "c0000000 bf800000 3f000000 40de9002 c1579870 beeebd3a -> 40de9002", + "c0000000 bf800000 bf000000 4151fb8f 40d25fec 3e023b98 -> 4151fb8f", + "c0000000 3f000000 00000000 c1103cc9 4084364e 40c240ee -> 4084364e", + "c0000000 3f000000 3f800000 c0da099b 412eb562 bec3269c -> c0da099b", + "c0000000 3f000000 bf800000 bfb3c0b7 c191b360 40e6f830 -> c191b360", + "c0000000 3f000000 3f000000 c120a9ac 416a0714 40f883dc -> 00000000", + "c0000000 3f000000 bf000000 40e3b304 c0b9162d 3f668dae -> c0b9162c", + "c0000000 bf000000 00000000 c03229cb 40d21b56 4081f899 -> c03229cb", + "c0000000 bf000000 3f800000 4155b3b3 c194fde9 408d1105 -> 4155b3b3", + "c0000000 bf000000 bf800000 c177af4f 41848c31 40f6ae0a -> 41848c30", + "c0000000 bf000000 3f000000 c194ce91 c0806a1e 3dda7f35 -> c194ce91", + "c0000000 bf000000 bf000000 c19cb965 c16bafe0 4033aa6d -> c16bafe0", + "40400000 00000000 00000000 c11ff884 4128a4b4 40f337b8 -> 00000000", + "40400000 00000000 3f800000 c009f917 41737bb3 3fe3e11d -> 41737bb2", + "40400000 00000000 bf800000 3fb22b93 c13096b2 400aea5a -> 3fb22b93", + "40400000 00000000 3f000000 c1066bc8 3fb17731 40a13b5f -> 3fb17730", + "40400000 00000000 bf000000 c0dab482 419b1642 40c8a7e4 -> c0dab482", + "40400000 3f800000 00000000 c0a463cb 3e278cbb 40cb7a90 -> c0a463cb", + "40400000 3f800000 3f800000 c18c7d98 bff90d1a 3f5d2946 -> bff90d1a", + "40400000 3f800000 bf800000 c173ecfa c03ef283 40436e92 -> c173ecfa", + "40400000 3f800000 3f000000 c189d7f4 c1261106 40ae6c75 -> c189d7f4", + "40400000 3f800000 bf000000 c10f4f36 c13d5289 40cf3fcb -> c10f4f36", + "40400000 bf800000 00000000 415286cb c17c6e4b 403744bc -> c17c6e4b", + "40400000 bf800000 3f800000 c168f85e 41870370 404328bb -> 41870370", + "40400000 bf800000 bf800000 40bedb84 41462a50 bf28e865 -> 40bedb84", + "40400000 bf800000 3f000000 c122f8c4 41012c4c 40a43093 -> 41012c4c", + "40400000 bf800000 bf000000 419ceda7 c16c341a bebf0871 -> c16c341a", + "40400000 3f000000 00000000 c148470e c0b45652 be7d9749 -> c148470e", + "40400000 3f000000 3f800000 c145b7dd 41109090 bf035eb8 -> 4110908f", + "40400000 3f000000 bf800000 c0b13a7e 41472a3c 3ff1f0e6 -> c0b13a7e", + "40400000 3f000000 3f000000 c1808b8f 4183d664 40a49e73 -> 00000000", + "40400000 3f000000 bf000000 beeb8d9a 41768fd9 40fbd749 -> beeb8d9a", + "40400000 bf000000 00000000 3e8c397c 417ae2c0 404c8a99 -> 417ae2c0", + "40400000 bf000000 3f800000 bf9c006a c0ca9575 beef3e94 -> c0ca9574", + "40400000 bf000000 bf800000 411e8be8 40abb18a 40678751 -> 411e8be8", + "40400000 bf000000 3f000000 beb1b849 bf7449eb 3f339977 -> bf7449ea", + "40400000 bf000000 bf000000 409663fb c18f2e83 40441150 -> 00000000", + "c0300000 00000000 00000000 411af4fd 40d47997 40f573cf -> 40d47997", + "c0300000 00000000 3f800000 c17aa662 c0c87835 40369144 -> c17aa662", + "c0300000 00000000 bf800000 40f18a4b 405e4f56 3f8a4ffa -> 405e4f56", + "c0300000 00000000 3f000000 c1794189 c1984ccd 3ece02ae -> c1794189", + "c0300000 00000000 bf000000 4107863d 40c55b53 bf6fef5c -> 40c55b53", + "c0300000 3f800000 00000000 40f55e08 c197d54b 3f957444 -> c197d54b", + "c0300000 3f800000 3f800000 c0c1bd29 c04d68bc 40faf1a7 -> c04d68bc", + "c0300000 3f800000 bf800000 419cc03b c0e27a21 40c73c97 -> c0e27a20", + "c0300000 3f800000 3f000000 c0c72560 c18a64f1 405ed5f2 -> c18a64f1", + "c0300000 3f800000 bf000000 40b438b3 41608a19 3f0f5028 -> 41608a19", + "c0300000 bf800000 00000000 418901ce 412f80f2 40349c08 -> 418901ce", + "c0300000 bf800000 3f800000 4041648a 4187e823 4081cbdf -> 4041648a", + "c0300000 bf800000 bf800000 bde41524 40841b73 40c1702e -> 00000000", + "c0300000 bf800000 3f000000 c154bc6e 412abbf7 3e3fd948 -> c154bc6e", + "c0300000 bf800000 bf000000 414e77f7 c0014131 3f2e8283 -> 414e77f7", + "c0300000 3f000000 00000000 c1363544 3f51f51b 405bd677 -> 3f51f51b", + "c0300000 3f000000 3f800000 c19de104 416ba647 40e7573b -> c19de104", + "c0300000 3f000000 bf800000 403bd1ca c0c405e8 408ecdcd -> c0c405e7", + "c0300000 3f000000 3f000000 bee548d0 40bb8314 40b46e15 -> 00000000", + "c0300000 3f000000 bf000000 c099ffca c18d0081 3fa66ac7 -> c18d0081", + "c0300000 bf000000 00000000 c199c442 41871077 40bb342a -> c199c442", + "c0300000 bf000000 3f800000 c076791b c0999a58 401132db -> c076791b", + "c0300000 bf000000 bf800000 4161f388 4180de3c 408c5153 -> 4180de3c", + "c0300000 bf000000 3f000000 418ff994 40411dd0 bf461718 -> 418ff994", + "c0300000 bf000000 bf000000 c139dd54 41650b61 403d8106 -> 00000000", + "3dcccccd 00000000 00000000 c0826ca2 41927522 40a22f3d -> 00000000", + "3dcccccd 00000000 3f800000 c195e23c c1850488 3fca881f -> c195bd46", + "3dcccccd 00000000 bf800000 4191b414 bf46a638 40d1d4a2 -> 4191b414", + "3dcccccd 00000000 3f000000 bf52d33a c01c7c3f 40e14901 -> bf6ade5f", + "3dcccccd 00000000 bf000000 410f0eed 40c81bb1 40e98882 -> 410f0eed", + "3dcccccd 3f800000 00000000 418e4fe8 3f3d8bfe 40ce51f5 -> 3f62e820", + "3dcccccd 3f800000 3f800000 4185c9b3 c1820d7a 40e8f50e -> 00000000", + "3dcccccd 3f800000 bf800000 4139008a 40484b51 4009ca68 -> 41021a73", + "3dcccccd 3f800000 3f000000 418045de 3fb43d29 40d94699 -> 3fb43d29", + "3dcccccd 3f800000 bf000000 c0ca3d89 c0e36373 40863b73 -> c0db67cc", + "3dcccccd bf800000 00000000 c0744056 411e83e1 40a2e879 -> 411e83e0", + "3dcccccd bf800000 3f800000 c16cc215 40c93409 4062b0df -> c012a4d4", + "3dcccccd bf800000 bf800000 41297e0a 40b020e4 404c4958 -> 40b020e4", + "3dcccccd bf800000 3f000000 419e61cc c165f6b1 40832a50 -> c12355aa", + "3dcccccd bf800000 bf000000 411caf03 c08e078c 400d4473 -> c08e078c", + "3dcccccd 3f000000 00000000 416a252e c17bc24c 40d06d7b -> c15f9d8c", + "3dcccccd 3f000000 3f800000 c1967a41 c0db52b7 4086dc50 -> c1967a41", + "3dcccccd 3f000000 bf800000 4164c24a 412cb0f1 40c0246f -> 415ded11", + "3dcccccd 3f000000 3f000000 c187f6cb c11fdae3 3f32be1a -> c11fdae3", + "3dcccccd 3f000000 bf000000 c13466b8 c016e2c9 40206855 -> c1071be6", + "3dcccccd bf000000 00000000 3f99f1ba c1823025 40d176bc -> c1823025", + "3dcccccd bf000000 3f800000 402874bf c098c9d3 bf32b117 -> 3e8fd528", + "3dcccccd bf000000 bf800000 419aa900 3f33e92d bf3cb1e0 -> 419aa900", + "3dcccccd bf000000 3f000000 41880ea1 41702926 3ff973e1 -> 417a4dd8", + "3dcccccd bf000000 bf000000 3f697d9d 40f7b903 3fcd4c3b -> 3f697d9d", + "c00e6663 c08c124d 40d956e8 c06b5b16 410852dc 400ccd4f -> c0426666", + "c19afabe bf8877c9 40b448b2 c03a788a 419d5dea 40d1ed6d -> c03a788a", + "40b14236 c0da6536 3f7add44 41181534 410d1b1e 408e8aed -> 410d1b1e", + "410e58eb 40be16f5 4044150e c132cadf 4121e20c bf28a7a0 -> c132cadf", + "409412bc 403250f0 c01bc1e4 41020d23 c1648d12 bf6f22ba -> 41020d23", + "416072a4 3f35d1a4 bfb13cc1 c17a2e44 c19b7c7b 40834a70 -> c17a2e44", + "c1331820 408a1cc1 c103a2ce 410b2425 415e42ce 3f39c75f -> 415e42ce", + "c056aa6d c0efd014 3f2571ac 412346b7 c199fa1f bf700a3f -> c09fd326", + "c0ab08ce 409ab724 bfbe0f10 bef6614b c0b6baf5 40647772 -> c0b6baf5", + "bf71a7d0 c11a6e91 40bb62ac c1318678 c1305cb1 408ddb70 -> c130cf93", + "4032f548 c05c2848 40a7bac2 c15e8a99 40c50826 40148e63 -> 4056aa8c", + "418c6029 40fc8d22 c07d418b 4141faa3 c188eda2 4042c4e1 -> 4141faa3", + "c060a6b8 c0128bb6 c1151b3d bfbfd5d9 3fbae2db 40f20a06 -> bfb0d1c5", + "418b230c c11c4d7c c110d36d 4194a915 411fd6d3 bc19e510 -> 411fd6d3", + "410db7b4 3f317d8d 40b5a6aa 4199ce05 c075b4bd 40ea239a -> c075b4bd", + "c12074f2 40f1bb9a c10141dd 3fe5f18f c171a960 40e4a8d6 -> c171a960", + "c13f80fc c106ec2f c09c1794 415c3e2b bf714486 3e03c2f1 -> 415c3e2b", + "c14b9dc4 c11681f5 409b373f c17645ff c09f13f5 40aed8be -> c17645ff", + "c14ef663 408e856a bffb2647 c1668c47 c12fcb9f 3f82f329 -> c12fcb9f", + "3f2b1272 406a3827 befe386e c19740e7 c17ec2d1 40ef0c31 -> c182ac81", + "4145b1ab 41051832 411a2cc5 41478d44 c0ee46b0 40f41fb4 -> c0ee46b0", + "c0112403 3ed0020d c11167b9 4185d80b c1625ed9 40aa4893 -> 4146adde", + "40158401 41009772 40227d2c c189c96a 41870b96 4033d795 -> 41870b96", + "be986e8e 3f21e2cb bffc14c9 415bc0c6 bf63540f 3f6c44dd -> 4121fcc0", + "41667f18 c08e3b07 3ff1a578 c10e90a8 40c80e50 bed22d61 -> 40c80e50", + "c180a544 3eb1a8ec befd18ff c0e79b74 c1320286 3f9b7f5e -> c1320286", + "40a88a2a c11672fe 4108c8b3 c1344aea bf387b89 409f3d81 -> bf99c6b0", + "bff5f26e c003a1ee 40485cab c14c0eb9 4016ba19 408127aa -> c14c042b", + "411b7a20 c0dbce9a 411a691e c1982272 c028d9ef bed9a212 -> c028d9f0", + "3f3cb515 40be9bae bedf81a9 3fbf9c9b 40e740f9 bf501ead -> 40decdb7", + "410f8ecf bfea0086 40b4d5d8 40625063 4047edaf bf276f22 -> 4047edaf", + "c15b1f27 c014b120 41056113 bee3d0c9 c0d299ca 40ae82d2 -> bee3d0c9", + "c0805761 40a0436f 3fa1f428 c1643bd2 c18cdfaa 40e8b9c3 -> c18cdfaa", + "c17cb7c3 401aa256 40a119ca 414ab1f9 bf74dabb 40297495 -> 414ab1f9", + "4104f246 3f6d1590 c09b951d 3e3bb1c9 4146dbf2 403f16e9 -> 3e3bb1c9", + "41017be0 c0c713a5 40f565cb c156b6b0 c0bcf6dc be59058f -> c0bcf6dc", + "414d5246 3dc9f120 3f4f6a67 4129099b c19b068f bf4d9daf -> c19b068e", + "c14e3c16 c0d5a3eb c0e51be7 3fd51d91 c10b86cd 4069832e -> c10b86cd", + "4105abd7 c0e80b1d 40bdc599 c04604d4 40a41275 3fda5480 -> 40a41275", + "4130c023 c089e1bb 3e903828 419dad9f c1720939 40e5fd5b -> c1720939", + "40b744c7 c0eb62c3 408837c8 3f47b49d 40690bf5 409c3db9 -> 40690bf5", + "c056918e bf9fc4ec 40941723 c18ad30c 3f54f73c 40725eb8 -> c18ad30c", + "413a0b89 bfa2f336 3fa62821 3fe0b720 41550992 40fdf4fb -> 41550992", + "c09dbd27 c0ccb97e c1155735 c17833d2 c0680e47 bf1180e9 -> c17833d2", + "41886091 c00b122f 40d4b189 409f2eeb c01ff7e0 4070509f -> c01ff7e0", + "410b38b6 3fbe38f4 40ba52f6 4199dbb5 417a9b77 40981047 -> 417a9b77", + "bf2a6051 c0840b20 411f98f9 c11063ca 41152f93 409ad285 -> c0e6cc12", + "40da3f41 bff5d520 4068797f 416d0605 be861454 40b89ea9 -> be861454", + "c0452a3c c1105558 411c2fe9 405b25b2 4101db3c 40d7a240 -> 408962d4", + "413117d3 c11fe3c7 c1001f31 40bad185 c1018971 40951e17 -> c1018971", + "4196a800 c0a98e34 bfd563c8 c0efe6c7 41561adc 4078b2fa -> 41561adc", + "40d8d78e 40f359ad 40688a36 c17f311f c01bb612 40f93c34 -> c1713140", + "40c9239f c0d093b7 c0990b74 c1856fb6 40d81d7f 40d071b5 -> 40d81d7f", + "bf2ce82a c09d0f79 c1001b9a c0965dd6 c17f12ca 3f6c3590 -> c0965dd6", + "3fd6ca5c c0327356 c0dba3f0 415f7998 40f18731 40a37c62 -> 415f7998", + "c14020a8 410c3cd3 bf6ae5a6 c18813c8 c13d3e7e 3fb01add -> c13d3e7e", + "c1589a07 3facba2d c0e1ffc4 41449068 417255c5 40d45e51 -> 417255c5", + "4165d0b5 3fa1a19a c0e9ee80 c11dab78 417a2008 40f8ce3b -> c11dab78", + "c125f371 c09dac68 40b8632c 41098da4 4104205c 40de0a11 -> 41098da4", + "c1317a2d 411db928 3fd306d2 c1973bc6 414f3e08 40068ec6 -> 414f3e08", + "c141a32e 40545cd0 40fb7317 bfed7fb2 c158b8f0 40f72c3d -> bfed7fb2", + "416020f2 c0641295 400147d6 4109ad52 c188525a 3fe1c065 -> c188525a", + "bffca434 c0e05098 410b42ec 40541294 40db94af 40af9c43 -> 407f7f49", + "4198fe16 c0d2fff0 40df85e8 c0fe36de bf31f33f 4096794d -> bf31f340", + "404b7778 3e12a832 c0981e59 4073d6ac c1553daa 3cb48191 -> 4073d6ac", + "415144f2 c1144186 c11c9816 c16199e0 40ed9ee4 3fa7aa4e -> c16199e0", + "41942e9e 3fb4e738 411743e3 406eabb0 c0d13617 3f63c26f -> c0d13617", + "c1968a7a bfb537c8 405d1031 bf37a9ea c192bcba 40259e41 -> bf37a9ea", + "41981626 40a69482 c1092955 4192f691 c01e90bb beb1dea1 -> 4192f691", + "c05b4f01 3e8fc8b1 3f9aeca6 41934999 c1619880 407f7a1c -> 41934999", + "c166b35b bfda53e6 3e23c170 40b7e073 41291482 40dc449e -> 40b7e073", + "41158f8c 40bb3ad2 c0f6ead9 40d5918f 413f2864 405bffe5 -> 40d5918f", + "40c7dce4 4098483d c08b1223 c1060815 c141b945 bf71d7df -> c1060815", + "4184f51e 4091316d 408ba1f4 4189feda c106a5db 40cfb8ee -> 4189feda", + "c0a4ee30 c0d27b8d 40df90bb 413b9b9f 4167b1a2 bdbfba5d -> 413c0a67", + "410c885e 40a43bae 409c1ca2 c110c4ee c19e0271 4044d9f6 -> c110c4ee", + "40643896 c117e1a5 410d941a c0702c08 41998da4 40433dbf -> 417cea40", + "c161e1a9 c1067627 be0a23c7 4120910c 411f5541 40bc1aea -> 4120910c", + "c17eda9c c10e3927 c11c5e97 407d8861 c0ddc17a bd4ffd6d -> c0ddc17a", + "417d2a9a 4086a9cf 3f9e904f 3fe1ee8c 410118b3 4035f489 -> 3fe1ee8c", + "c151c8a7 3ee1eadb 404db1c5 418da926 be44f033 40b3d852 -> 418da926", + "4127c0b4 bf1eeb65 41063e19 4162c01d 41877300 408087d5 -> 41877300", + "bf902231 411ddff5 3ff6ccb0 40604ef6 c03b4355 4008b2e1 -> c03b4355", + "c12ff947 bee07cc0 bfdf4bcb c0d4a426 40c6429a 4004bccc -> 40c6429a", + "405c73af c081a0ce 403e00e9 416a07f8 bf32e509 40009fce -> bf32e509", + "40eeab4e c0b4b3ca c0832f9d 413d1fe0 c1964ba0 bf027b04 -> c1964ba0", + "c1369a6d c0dcf04a c0984fe1 3d24c29c 411a562d 406e4d6d -> 3d24c29c", + "c188d4c2 c0e08886 4000aa21 4147d049 c125221e 3fea6717 -> 4147d049", + "4097487a 3ea4dc49 400e55f7 4176a094 40a7d668 40baad39 -> 40a7d668", + "c1640a39 40f6d3f6 c0b8088c 40a3f6cb 3fcc1db5 3feaf58d -> 3fcc1db5", + "4027dbde c10497bb 4064dcc4 41817984 414ddaf7 4094ee30 -> 414e193f", + "40f29f13 40865ee3 3e06a3e6 c1819094 bf997218 4031f2e6 -> c1819094", + "bf86e06b 4082308a 3f780ffc be961053 4167985b 40fd4e3d -> 4167985b", + "4008315c c0d63f2c 40d1babb c1346c78 bf16216e 3fc44e94 -> c035dbc0", + "412ad089 c06f657f 40f33e9c 4118da59 40f11ae4 4006429a -> 40f11ae4", + "41565c50 c0841d5f c0a3d4c9 417898a2 c0ec43fb 406a31a0 -> 417898a2", + "c008e39f c11f409f 408f74c9 40125a30 c195d2d5 40e329ce -> c11d7315", + "c0ad7f21 c02e427f c0fa323a 4144f400 c107c692 4090d24b -> 3f423bb0", + "40f1fc2a c10441d3 c07f8b18 c0d326f2 c17a9cee 40113ad3 -> c17a9cee", + "416f4685 4089b7b0 3f5dded1 3e9089eb c0300a0f bf15689b -> 3e9089eb", + "4192f023 40a4f329 40ce7def c12504c5 40fb1c4a 40cfd376 -> 40fb1c4a", + "c182a2d5 bf84c949 40b51ca6 beee0d08 c0fbf259 3f7d948c -> beee0d08", + "c19cf807 c05f6e27 40ab1846 c0c960a5 40ab4962 bf10bde2 -> c0c960a5", + "4091e6cb 3f81f828 c07ac587 c07fb689 c17758d3 40b42a94 -> c07fb689", + "4192c730 411ae7ae 3f96693b c1964a7f 414ed6fb 40aa0aa9 -> c1964a7f", + "c11443bf 3fd20501 41165ddd 40d65d36 c02efeb7 4043b3af -> 40d65d36", + "c199d7cd 407971cd 40abbd27 3fe6e499 c151b85f 40d19018 -> 3fe6e499", + "414ea98c c0e4ec39 c1046983 c171e27b 4125d37d beb67aa3 -> c171e27b", + "bf953b77 c080aae5 c07d9434 4183045f 406578ea be7ae676 -> 406578ea", + "c1856ab2 c03581b9 c0b26ccf c18b6cda c15f38f0 40cf84b0 -> c15f38f0", + "c16e488e 40904de8 c11dca6e 41491d27 bf52d56b 400e2a8b -> bf52d56b", + "410d4a1b 40f92f3f c08e0f4e 419a11cd 415352e8 3f127935 -> 419a11cd", + "c18255bc 404fadb0 3fa9b24f 40d8e279 c18c8483 4084d6c9 -> c18c8483", + "4134a7cc 40529bfa c05e4318 412f4328 40ce51ac 3e8e9c9f -> 412f4328", + "41601371 c0e50e7b 40a65bf1 409fe5c8 40a7bf71 40fed7fe -> 40a7bf71", + "c19a610f 4089c8b4 40995267 40c98642 bfe18d1e 40b346e9 -> 40c98642", + "41964e34 40d074f2 409dd666 40de6295 4148b5f1 40d4a50e -> 40de6295", + "c0569f1b bfaa0632 3f251759 4048330a c0326a52 4075b096 -> 4048330a", + "40dd2da7 c0ce73b8 400040f8 419fb4d8 c0f0921a 402104d8 -> c0f09218", + "419c228c 3fb86e33 3ff60be9 c16b511e 40fcfc43 bf21ad51 -> 40fcfc43", + "4196fcdc 40c00138 bf716ee0 c1968c83 41846870 409c5caa -> c1968c83", + "c19a3055 c11886b0 bf00a398 413c713c 4088bcd3 3f49f8cf -> 413c713c", + "4198b49a 40a1cd0b c081f036 40992cca c142dacf 40da341f -> 40992cca", + "414160e3 410e520c bfa18aaf c155199d c127ed9b 40fe3593 -> c155199d", + "413b099a 40833970 410ba6c5 c13b5cfc 4115033e 403fa541 -> 4115033e", + "4175c8c8 40fd404c c0bfd2b8 40f73846 c19ab666 40e5ceaf -> 40f73846", + "c19d4ba7 c100c123 403e6813 413c94aa 4102e873 40dfa053 -> 413c94aa", + "4074b653 40eb6978 c100b828 415b1fb1 408c8460 40f1da75 -> 414ec533", + "418488e4 40d3c3ee c107dbcb 40857d45 c0b3e86c 3d277865 -> 40857d45", + "4194b858 40af21a1 bfe2811e 3f9f333c c148a01a 3f000745 -> 3f9f333c", + "c19f62b5 3ffd3690 4105e985 41709113 c1472a0b 4079cacd -> 41709113", + "c15574e9 c01850bd 41178e10 4191ab07 c16697f7 40cda7e7 -> 4191ab07", + "c18943a7 c08cc061 c0fb87c2 3e98c61f c150afed 40d99ffb -> c150afed", + "410ee732 40f547c0 4039e72e c0b66947 40cbf1de 40c4566e -> c0b66947", + "41145ebd c0b4660f 3fc146f5 413209b1 c0fea5c0 3f27bf8e -> c0fea5be", + "c110d3ef 408ae018 41095061 c13a76a9 404057bc 3ee0ef8a -> c13a76a9", + "413f22b3 bf9a93b3 40d2fe23 c13795fd 418e0bb6 4077c0ff -> 418e0bb6", + "41410649 40a36451 40ee53e9 c1293333 c084dbbb 3c635f24 -> c084dbbb", + "40858ffd c07ec3a1 3fd291a9 3e4eeca8 40e56e17 40fd6507 -> 40e56e17", + "c131b5a6 bf20068e 41000ff9 c0a00d69 411061dc 404a90b1 -> c0a00d69", + "40f2a3de c017692c 41093b74 c15629db 410b2c1e 40f6c33e -> 4108de59", + "c19028e5 c0111b92 bfca31b2 41446897 c0cc01f7 3fd9a94a -> 41446897", + "c091168d 40602d68 403f9d73 c0842716 41804afd 3ea19453 -> 41804afc", + "417fd2ab c0af89e0 be6df6fb c118b91b 41578618 403b7fe4 -> 41578618", + "bf469472 c04780cd 40aa813f c171b455 c12d5495 befb3d85 -> c1688547", + "419039fd 4067669f 40b094b3 41061866 c18677f9 406f02cb -> c18677f9", + "bdabaf6d 40362aaa c10d8d01 418c68aa c10e3b5c 40f55120 -> 416cc356", + "bf47fc04 c11a5d3e c10bbfc1 c17bec0c 419ae91f 4021984e -> 419ae91e", + "c168ba2d 40fb16cc c09184c9 c1566a30 411c4b1b 4096eba3 -> 411c4b1b", + "419691a4 c0c02bc7 c09474af c08b9c8b bf9b4288 40144b7e -> bf9b4288", + "c13e5a25 40b24858 bf40d15c c1188b9f c12dd558 be9ea6ed -> c12dd558", + "4167949a 3f8fc3f8 c0a4121e c0d453d7 c12ea212 40361024 -> c0d453d7", + "406aaf82 3fdbed01 402c1cf7 bfa14baa c1974df3 bf72ae7d -> c1974df3", + "40a084b2 bfa2ed0b 4091459d c10f9fb3 c19673b0 3fb28782 -> c19673b0", + "4181ef4b 40e47d04 c1003f03 418c6eb5 c199d852 408983db -> 418c6eb5", + "3fcbd9f5 410d3f93 40ad9756 40276e74 41856148 bed7baaa -> 41856148", + "c151afd2 4092e5f5 4060d36c 4123136c 4147c68e 4045b0b4 -> 4147c68e", + "be7d9cc5 c1136dd7 40ea3627 4156bf67 418e639c 40e6dd69 -> 417f4b96", + "4171cb15 41168bf3 c0bbdea6 c129f4e9 c0b72803 40beb995 -> c129f4e9", + "417376aa 40e49fd6 3fb3bb5b 410fe934 418b4a89 40478783 -> 410fe934", + "c09fff17 c11c36cc c0ccc313 be73d0fd 412aaa4d 40005d7b -> 412aaa4d", + "41130086 41179f29 40e4684d 4163a4f7 c0933246 40d65e77 -> 415ef92f", + "40399cd4 4080be4a 40d63a00 c0d27a94 3f7c7d7e 400a9a86 -> c0d27a94", + "4141bda4 3fb3daa4 c0d2d57d c196b988 4084d30b bef724c7 -> c196b988", + "41659485 c06ff7db bfeca30c c19dab1b c17a261d 40c13f1e -> c17a261d", + "41250039 bf90ccbc 4027438e c170eacd c0a64e5d 400454c0 -> c0a64e5e", + "410fd7b9 410118ff be68d725 c187980c c190e3a4 40a054e2 -> c187980c", + "410dadd3 c006b923 c09b3b86 40967c6a 412205d0 3ff803ef -> 40967c6a", + "c14f015c 3e9a5b65 4109dd92 c1036652 41552fa8 40817b33 -> c1036652", + "c16eadf0 3f252189 c05792f7 c11f0c6f c1886025 40fbb169 -> c1886025", + "418ec2a5 c09b5f72 c0da257c 4150492e 419deb0e 4055787d -> 4150492e", + "c154f2e1 c0a7b5ef 4101092c 41196f66 40c04c91 40d39e8c -> 41196f66", + "4113ccae c06d65df 3f7c8d46 c0829518 bfbca62f 40de3aca -> bfbca630", + "4017912f 41192093 403bad8f 406e6570 c02454b8 40cb38d4 -> c02454b8", + "c116a535 c06ae0eb c091bdb6 407b547a 40ab4595 40ebde92 -> 40ab4595", + "40e0d219 bfdba4d7 c11d8f52 c15eedfb c11dfcfb 3e96c4b8 -> c15eedfb", + "4127047f 3f8cae12 4019a389 c173930c c092b9f6 3ef309f4 -> c092b9f6", + "c03fdb9c c0d186f9 c0be2b8e 4182d0fb 400f9d84 40bd2314 -> 400f9d84", + "c080cbf4 c0c59e36 c0b03ed2 4070430a 419514b5 3f6c483a -> 419514b5", + "c1995582 40bfc0ae 3cf540c7 3f342158 40201e69 40cca333 -> 40201e69", + "40cbc8b8 be693a76 c11cfb2d c0928962 c17809d2 40ce42ff -> c0928962", + "40143e4a c0abda42 40af221a bfaca7aa 40e3d23d 409beb1f -> 40bac2dc", + "415b74e2 4088847e 3fedf127 417ca7c6 c12759d3 40e88a61 -> 417ca7c6", + "c18611a6 3ebfea29 c0c6e2f0 4054decd c19b4551 40b557f5 -> c19b4551", + "41287c73 bf6ab340 4104f86d c1233c8b c1923273 3f9f5af5 -> c1923273", + "414c0c5d 3f4527e6 400e0731 c1853db8 c00b70e0 3f9bc1ae -> c00b70e0", + "be83fced 406aa788 c10683fb c12f3112 415003a3 401e0edc -> c0c6d853", + "c103d308 c08a5f7d bde351fc 4098170d 408b7441 40f853e6 -> 4098170d", + "c0caf886 c00a3d5f beccdf4d bfcb6bcb 40b35172 3fb7920f -> bfcb6bcb", + "416748cd c11f3cf1 40ea0919 c1888eb7 41524c31 3fdbbfe7 -> 41524c31", + "c13f5308 411fd61e c0f2b9c9 c197df06 c0eeab26 3f9aee61 -> c0eeab26", + "41020962 40840807 bfb661b1 c157205b 3eb96e4c 3e168fb7 -> c157205b", + "c13f2038 c087649e c0f181ac be8f6dcb 419cbf1e 40666a6c -> 419cbf1e", + "41906851 c012d007 c0e8e318 4186303d c16cc5d5 40ad26b7 -> 4186303d", + "412434f3 c0fd2128 40b7ee42 bed1d6d1 c147260b 40a8f9fb -> c147260b", + "c0e7e965 40b21534 400dd9de 410f9c6e c04edcfd 40483837 -> c04edcfc", + "417f4637 c0866767 410913c0 3f5a25d1 c1398eb1 3f78a176 -> c1398eb1", + "414c3f78 c0373033 3fbae644 c18e72ad 4191b27b 40a01ac8 -> 4191b27b", + "c17b7a1b c11e66e1 bfadb93e c112011f c146f07b 40f64a36 -> c112011f", + "c1350f0b 4093d7bb c0d8fe00 c1759861 419ff48c 408e0618 -> 419ff48c", + "415a34d0 409d0f3a 40c273fe 40a9c669 c14da988 3f3adfad -> c14da988", + "410bff06 c1165564 41134656 bfc97a3e c14f3338 40c0a839 -> c14f2ca9", + "4096ff9b 411354c1 4116c2a9 402019cb 4155b7f4 40f7bac5 -> 402019cb", + "c1987bee 41043e38 c0e4e080 c14995bf 418ddec6 40bbe55b -> 418ddec6", + "402d2450 40979c02 c094fa1f c0acac6a c0af513c 406c818a -> c0acdca6", + "c192e31d c0e0d754 c0284905 bf4c8446 40413d26 3f0aded7 -> bf4c8446", + "41489a75 c104dc4e 4016eb41 4184e8c8 415c9607 40a660b1 -> 415c9607", + "413171f7 4033f3f6 403d90ad c0b11f97 c06e3491 40c77eb9 -> c06e3491", + "41925ede c00c0cde bff58d34 419b11e2 417981a7 bf472300 -> 417981a7", + "c13a119c c0010e20 40905e96 4194ea21 419d84eb 40bda34a -> 4194ea21", + "c10fb9ae c05a800c c0e9c635 c17740ca c15d2d78 40149a71 -> c15d2d78", + "4191f5a2 40ff5a61 c03d2d8b c15c4955 c00fe8b4 40f1a9c0 -> c15c4955", + "c0747a05 408f1123 bedccc9d c04ec3da 3d3d591a 3f4011e9 -> 3d3d5900", + "41266f6a c10a2c3f 40143691 c18aeb4f 41146cdd 3fe1bc78 -> 41146cdd", + "c16cec98 3f419d2a 40ee0bad c14c542b c038eb00 408d6ad8 -> c14c542b", + "4185237d 4080130a 410ee8bb 40ccdd13 41316a12 401b0276 -> 41316a12", + "c14ff9fc 41126eaa bfe8308c 40b8ec34 c04e95ce 401e2103 -> c04e95ce", + "c066be80 4087b77c 40076d29 bf9345a0 c04a4a56 3fee3d0c -> c04a4a56", + "41972186 c0f10c2d 41066ce1 41865b37 c0dc0077 3f8a0aa1 -> c0dc0077", + "3f48ae3e 402d8660 409d247e c0f0a7fa 40ad2e27 40f00eb1 -> c0f0a7fa", + "c046d25b 40bcaa62 40a9c010 c18b08f5 419cc9fb 40f01122 -> 419cc9fb", + "418b02e6 406a26f6 3ff7401a c082de1c 3f18b503 40365d1a -> c082de1c", + "4116941d c0d8527d c036e8c9 c185feee c0c3e424 3f655509 -> c0c3e424", + "c16cced9 be9cf330 c114d7b5 c0b1c73c 4040eaec 3ff2fe8c -> 4040eaec", + "4184bf9e be60269d 3fa2cb97 416d0a6c 3f511014 3f90900a -> 3f511014", + "c1300f48 c06c551b c04c12d4 412e060f c19501e0 40c68cb2 -> 412e060f", + "3f26938e 408f6170 3de5b9c1 4110ddfd 413ffadc bf2bb30e -> 413f40a4", + "c012b4f2 40b82b0e c0e6a696 c155d021 c138be0d 40eaec9e -> c140f1d8", + "c1031156 bfbd2369 c06d1934 beb16f07 41351b31 40f44251 -> 41351b31", + "4134f5a5 bfb1a28b 4057bcaa 3f1b6b96 416dd6e5 40289fcc -> 416dd6e5", + "40bc9837 c0c84a33 c0891392 c13ceb53 3f8d5ac4 bd069078 -> 3f8d5ac4", + "c1766791 c04a2071 c01c41bb 4191ad87 4076ddee 4057854d -> 4191ad87", + "3f00c79b bf2a7690 c0af7a1d 40c4ed2b 419275b3 4092b337 -> 40c4ed2b", + "4186cb13 c001c095 bf9ce6b0 41940a06 bf1e09d3 3fcffc07 -> bf1e09d3", + "c12869db 40bcefaa c10178b0 c06241ed 415b96af 40a55500 -> 415b96af", + "c18cb15a bf9d1296 c11025bf c18959d3 40a28539 40b296b4 -> 40a28538", + "c115451f 408703ce 40b1d639 bf4f6255 c11014c6 40def411 -> bf4f6255", + "c184ad81 40f56ce5 410b0bc6 c10ca15b c117768c 3fdc47cd -> c10ca15b", + "40ddf3c7 410865e3 c0d216fa 4181bfe3 408f97aa 3ef3f33d -> 4180d1db", + "4017c2a8 410960be 40c448a7 41281025 415af54e 40723c32 -> 415af54e", + "3fbf60f0 bfb1182d c0670a2e 41927620 c19216d0 40f45f7a -> 41927620", + "401c6bff 4086c9cb c10a91b8 c0e23867 bff42ae5 40981be6 -> c0dec61c", + "bfd5573a 40c8759b 3fbd7c85 4170ed87 c19bf23d 40c75bec -> c19bf23c", + "c0e4b10a c08692cf c0d19d3e c0a1f4c1 c1598135 40cb69b7 -> c1598134", + "c16e4633 c0d77adb 3ce1e17b c10355bb 414599dd 40bd54a1 -> c10355bb", + "c1322595 c09892a1 4110e0f4 403ac20c 415b8da5 40441ee3 -> 403ac20c", + "40996796 41103005 c040fd1f c1060cce 417d2fb3 4038a0a6 -> c02a4548", + "40d1225e 411834d5 c0e9faa7 41243cce 3e942306 4013c117 -> 411d92ce", + "411cae17 bfecc521 bf9834f2 c13e0233 3fe791e3 40e172fd -> 3fe791e0", + "c13156dd c11a2400 c0345bf4 c01c8f6a c19669cb 4072d059 -> c01c8f6a", + "c093b08d c03fabbb 40f80274 c15ffcad c169fb4f 40b71c6a -> c15ffcad", + "415ca769 405b033b bdf28d26 c1740120 4186714e 40ab103d -> c1740120", + "3f2e6adb 40ad137f 410a4d78 bf3f41e0 c14c0813 3ff5357a -> bf3f41e0", + "41228262 40c1ff19 410328a8 415923f5 c096bb71 407acc7c -> c096bb71", + "c03b27c3 3fddd86a 3f5a5ea9 c047306b c1471d04 3e54af62 -> c1471d04", + "c195f72a 4084257b 40b8cd6b c12c1493 c19249f9 4010359b -> c12c1493", + "c176812d bfea63d4 c0ff49f9 c15e5a50 c10e90c9 3fedc52b -> c10e90c9", + "c0f616f9 4113fb88 bfb4064a 4098da0e bd8d1805 4091e2ff -> bd8d1800", + "418de34e 40c668cf c10ca274 4188882f bf43f94c 409a7583 -> 4188882f", + "419be948 4110c9e0 40e1991c 40ae6269 41836a3b bf67e8c7 -> 40ae6269", + "c147ff25 c0a2af95 c0ef673d c03acf54 c1575300 40d3a23f -> c1575300", + "41492096 c0f9edb0 407c0c2c 41252d7f c05ac348 40fd18d1 -> c05ac348", + "410a9f1a 40ec64da c0e402bd 3f8e35a4 c087320a 3fbd8ba5 -> 3f8e35a4", + "c1811189 c1034c49 40f6d965 40bc4e15 410fcaec 40ea80ca -> 40bc4e15", + "c1290f85 c0d0c733 bf9d0572 c0b91afd c0b9193c 40afe59e -> c0b91afd", + "c0dc827f 41190346 41081d03 4093d682 419b7678 3fe283c6 -> 419b7678", + "4096abd4 bf257570 402c1f24 40be9abb 3fa4d536 40df2b6c -> 3fa4d536", + "40b0c96b 40bc14de c106cd3c 3f81c557 c1943019 40d55f5d -> 3f8168eb", + "c173e853 3e0acdfb bf0b7d45 c11ef39b c16ee30a 40901648 -> c16ee30a", + "c14c3620 41007b50 c10193fa 3fc5e79f 40f44a8f 40bfacde -> 40f44a8f", + "be9c4353 c0acafcc c03cd6c2 c14d3ade c16e23a6 bddd39b8 -> c16e23a6", + "4135e9fd c012344f 408ebf9e 418db7ab 4184541e 3e95b4a0 -> 4184541e", + "c19db0af c0c86e56 c0303a8c 4110e16d c023f421 bebfcdec -> 4110e16d", + "c188be8c c0e6abe6 c046f93b 4147afd1 c0051b87 402a0173 -> 4147afd1", + "40bda773 c06d9e9d 3d97526d 40248a51 412297b3 40f586a7 -> 412297b3", + "c16c029a be263904 408f068e bfbbfeff 415c124e 40776275 -> bfbbfeff", + "c173b857 bfb301c5 40a5d022 c0aa4778 c18778be 40ab5b73 -> c0aa4778", + "c0e9e8d8 be3a3f36 c0dcf387 c08bb436 bf1b6718 3fd55a0d -> bf1b6718", + "419f0923 bf8a0671 4036d73e 400729dc 41476e75 bf2eb3dd -> 41476e75", + "c1678b9e bb9c9e5e c0cb18b2 4184be86 c14a5ac0 402476ff -> c14a5ac0", + "c157afe5 c0db1769 c0b3aaf2 4180f9d2 419dd0fa 4042edce -> 4180f9d2", + "c195d491 c1071040 c0b23e2c 418e77cb c1367ddd 40d1d975 -> 418e77cb", + "c0009141 4092c41c bd77fa2e c0df4fda 409acbbd 40c2dcfc -> 409acbbd", + "bf6587f9 40470788 c08d4434 c0806474 3f692d54 40e817b5 -> bfa03f0a", + "c073ebf7 40b64df4 411b8af7 c0e13ebd c0ef6b15 4050356f -> c0e13ebd", + "c09b5a0e bfdab5d6 c08dda83 c1856b9f c0201f0d 40f6f9c9 -> c0201f0d", + "41756265 c08febb9 4050dec2 4089e7f5 c152fe9b 402b08c2 -> c152fe9b", + "c118cb42 40da266b c112d812 410057d7 c08b0894 40e1f719 -> c08b0894", + "c17b72aa 41137bbd c0d93d5b 403a487e c1769338 40ab19fd -> c1769338", + "4186ef8a 411f8856 c10f9ea2 40cc02fd 417d7821 bf59dfe5 -> 40cc02fd", + "c02e1e6a c018de56 40c833c8 40a80921 c1412ee2 40abf598 -> 40a80921", + "c1221f70 c1156ded c03166bd 4010e76d 418204be 40aaa9a4 -> 4010e76d", + "c075c1b3 4079676d c031925b 4186391f c17a3cc3 406fb51a -> c17a3cc2", + "c19b98df 40813142 c1006dd9 40af6d2e c0ce29a1 40851416 -> c0ce29a1", + "41575371 c0eb6885 c004b5ec bfe5fd45 c0beac94 40d45554 -> c0beac94", + "c18db918 40c2ea36 c056d449 c0812545 40a0d106 40635671 -> 40a0d106", + "415fdcaa 3feb108d 40bb8ff8 c138c0c6 c14fda24 40db67ff -> c14fda24", + "c1867900 c0c30308 40dfb1fe c16370e1 4131f2d9 3f3a3e2e -> c16370e1", + "c12a4500 c0604d1f 408ef8e1 419eaac7 41384380 40bf7f22 -> 419eaac7", + "419e0a4a c0dd2c01 4089d732 c092dc57 c1150185 404c9b21 -> c1150185", + "413d6de5 410cb395 c064a2db c1285301 3ff6ce29 3de32f75 -> c1285301", + "4138b545 40328cde 3f87d346 3fbda87b c1934b09 3f851c99 -> 3fbda87b", + "c18ddc99 411d4d38 410e1c6b 409b8581 4187d064 3fddd6de -> 4187d064", + "c10a978c 3f6aebb6 c0c85497 410f065a 3de987a2 4086e689 -> 3de987a2", + "c18cd03f c0ded8d9 bd44a35b c0b8a77d bf9adfec 40185744 -> c0b8a77d", + "c05a3b6e bf0d4085 c064e061 c059dabc 409c3a1a 3f925349 -> 409bd254", + "c0200132 40e9d65a c1144232 41119b68 402b04d3 3fd70430 -> 4099c245", + "c106cc4b 3fa2ad01 c098287d c15a3e4c 4147ab7c 40afc7c2 -> 4147ab7c", + "c07bce7f c1113920 c0120abe c16aad86 4090ddf9 40e2df38 -> 402b31f0", + "412ce991 c11c632e c0a06e8f 4116afd5 412a196d 40ba31f3 -> 412a196d", + "4168af92 bf6b3344 c115bb2e c19d52c1 419092ff 3f9e42be -> c19d52c1", + "bfbad1e5 40eef9b7 3ee9138e 40d29f8b c0b4dfbe 40772cc1 -> c0b4dfbd", + "3ecc609c 4072c674 c01bd0d2 40bee758 c18f757a 3ffefbc9 -> c0ffa106", + "4198a54d 40224055 4047bc80 c14236fc 41203ab5 40c320cb -> 41203ab4", + "c09e679a 4065ac96 bdca7546 40b48f5f c13774e4 409c4a73 -> c13774e4", + "419d893e c03f0acd bfc3ced7 3f8a7ddf bf38977c 3eb01022 -> bf38977c", + "41039597 4093d509 c0b1c175 40e97617 4058ec23 bf3df41a -> 40e97617", + "419d5895 3ef53182 c108487e c05c1355 40f4b034 40f72f06 -> c05c1355", + "418fe31c 40abf3e0 40d4f531 41781db8 c187c3ba be359672 -> c187c3ba", + "3ff9485c 40d4e41e 411d2997 c1690461 4184d633 403a47fc -> c1690461", + "40d4458e 3e8fb92c c0868232 c013d1f4 c13e11f2 3f02a6a9 -> c013d1f4", + "41564fac c094749a c0d85d0c c1865d83 41262f61 40f908d2 -> c1865d83", + "c183be3b 3d0c7faa bfb31efb 4081ec73 be0bb38c 3f57611d -> be0bb380", + "41869c28 c117112d 409842ef c1030592 4190e147 bf280d81 -> 4190e147", + "404e2396 408ec2c3 bfb02056 bf43dc6b c160fb12 3fcbf82f -> bfd5982d", + "bf17b27e c00b16a5 c0c424d1 4159626e c0ec4e76 40c0dc08 -> 4159626e", + "41034151 c061364e 3eae6349 410ddb6b c14d2098 3ec778b9 -> c14d2098", + "409c7b8a 40fb7808 c0473700 409b04a4 c100f68e 40589651 -> 404daa6e", + "bfa8d60b c0a3f232 3fcafdf2 40568a4f c0ae5196 4098d747 -> c008fb47", + "41916072 40dcc618 409a5ee2 41302343 c170dc34 3fc155a1 -> 41302343", + "c140f313 c0e6b4d5 c0b86fb0 c18918dc c19959a8 40ceef7f -> c18918dc", + "3feab422 40b37b85 be3dbf78 c119fdc8 c1092532 3f565b7b -> c10d10fa", + "c1402460 c04d3fb2 40a9f760 413f7967 41950987 3fd9dbce -> 413f7967", + "415d1413 c031a025 4105c623 40a77cd3 40ddc5b8 409ae5e5 -> 40ddc5b8", + "415c9b71 c10fca18 3ff4f0a7 c0d277d2 403aaa95 bf6ffcd9 -> 403aaa94", + "41982e46 411d96e9 408a2b5c c08772b9 c161d606 3fe78992 -> c08772b9", + "c0b6abac 40374bd9 40b30f8c 41670b19 416172d2 40879ddb -> 41670b19", + "c0876227 40f64cf7 c119659b 4118ced4 c1397026 3e67fe4b -> c0fb8468", + "40c6041a 40fe7e22 401d0fac 3f57da3d 418ae930 40d5936e -> 40806d5f", + "4149d0a2 405b077e c0c17c1e 418371f2 415f48b1 404818fb -> 418371f2", + "c1051909 c1182e9e 40c69677 4156ffcf c140fdd9 40445e96 -> 415569b5", + "bf63c264 40b232b4 3f6d6ab5 4161fe6a 4170196a 3ff09f28 -> 4170196a", + "c1973155 bee78660 c07ff555 4182a60a 3f796dc6 4093f0d5 -> 3f796dc6", + "416d967c 40c15201 410867e0 c164f0f9 c01f8f67 40c11530 -> c01f8f68", + "c1158561 c1028780 c09e0657 40b7d40f c1058f65 40f82c07 -> 40b7d40f", + "41593f45 c0def968 3fc59235 4112f564 c0a7fe7f 40c94ec0 -> c0a7fe7f", + "c191dad0 3f5c897e c10a0598 bf383794 c188d43e 3f2a2ef3 -> c188d43e", + "c1064c25 400e020a 40a260d2 3f98f2f5 c15fe126 40ae9ea0 -> 3f98f2f5", + "4112edbc c102f68e c1000d87 402ab912 411df4a9 bedade3e -> 411df4a9", + "3f7febd9 40c11727 c0bbc11e 4001a045 c17106e8 4075c57c -> c082e9d6", + "c14de07f 407dcab4 bfec98ce c193d063 41570739 40df3225 -> 41570739", + "409017e0 bf600297 c0930203 c0b28a4f 419597d7 40ddb674 -> c0b28a4f", + "3e069457 c09a26b3 410ef81d c03dea86 418a6ff3 be8d07e7 -> 40073f60", + "c13cc535 c0d3cac1 40de9512 c0480f76 3eae1bbc 3f0e9786 -> c0480f76", + "4188efd6 3ff7e35f 40641cad c10e5e49 c129e940 40d8f30a -> c129e940", + "411abe9b c03fe666 bfc038ee bf573420 c199a164 3f8f0e2f -> c199a164", + "c135a14e c0c7469e bef9b861 415e9e6e 41175dc8 3f75c3d2 -> 415e9e6e", + "3f9453a1 c0d90d21 409bc609 c138e877 4134d655 406e1520 -> 40e001e2", + "4105a540 40c25b38 3fa5e310 4094cada c1194468 4023f0a4 -> 4094cada", + "417452cc 40f5b751 c0cac2da c197f89e 40a7fd74 3ede0ef8 -> c197f89e", + "3fdbee99 4039be64 409648f8 c11b6139 40b6e7b1 bf67fa50 -> c11b6139", + "402360a8 40b9096d c05b99a6 410788e6 401ac564 bf3d11ba -> 40e15cd6", + "414e1a94 40b98fae 3ccf2b30 407eb3c3 c0e18777 3fe4e314 -> 407eb3c3", + "c187c172 c0866759 c0e0c5b5 c17f46c8 c13d10a7 3f36bd64 -> c13d10a7", + "40b67abe 4004503b c0da4753 c08baef9 417aa2cf bf6dc026 -> c08baef9", + "c10c17b6 4101a373 3f835bfa c15ff7f4 41292f58 3d94e2b6 -> 41292f58", + "418dfa76 40a9be5b c07c2d3b bfa1ae26 c054de43 3f1107de -> bfa1ae26", + "40e0d1f0 c02405fc c0e0e6b8 bef22e0c 3d9c697e 409e5735 -> bef22e0c", + "40a98a44 400e258c c03e7d0d c0646fb8 4195d0e1 40d25363 -> c0646fb8", + "4115c10f 4041b3b7 3d8ff11c 40c1f940 411e2eae 4061bfb2 -> 40c1f940", + "bf43e912 c0db7724 3e64f17f c1323b6e c19df09d 405920ab -> c19c6fd0", + "c0c581ac c10500fe c0de6b0d 417094ca c180df2f 40971519 -> c180df2f", + "c1688079 c02d878c c11b32ba c1557bc5 c1862a9a 40c6f867 -> c1862a9a", + "40efeb18 c11864cb 40c10da0 c159dd09 c10567e5 40050160 -> c10567e5", + "40598d32 4031fd94 40d263c6 41102892 412d51f3 40d42151 -> 411121c0", + "c14bd655 4116fde6 40ce226c bf9d172e 40921c09 40dcc39f -> 40921c08", + "4075da43 bf33d42b 40affe90 bf922ebe 41938884 3e933e06 -> 41804fb5", + "bf8da462 c0d14912 c107319a 41108499 c198cd9a 40c3dd19 -> 41108499", + "3fe8b238 3eba14b7 c0ac0e58 c1154b63 40d9081e 406d06c8 -> c1154b63", + "c1313dcc bf903ee9 4028a042 c184f291 c0ddb18d 408a1353 -> c184f291", + "c186a4e8 40c65018 3fdee113 415bf1c5 41519037 3e3f66cd -> 41519037", + "c15ed793 c094a4a4 411d18b9 4161b68a c1751481 3c57340e -> 4161b68a", + "c17574de c071cd48 c1084ac0 bfc470e3 be908312 40b0536e -> be908314", + "bf3ddb58 40d76d46 4071d2fc bf375678 3f5c68c6 bec65173 -> 3f5c68c6", + "c19c816f 40cd46de 411f90ea c100edd9 c022dc4a 404795c4 -> c100edd9", + "c16b2ac8 c0b4af2c c0bf4378 c02e91b0 c0e149ad 3fa77199 -> c0e149ad", + "c1893540 c05fb129 40a22e4f 40ed311a 419e498d 40d7a45e -> 40ed311a", + "c132c200 bfb9332f c0c7a03e 402abdf4 c13ea2f3 be133084 -> c13ea2f3", + "bf92e22a c030991b c107eeb2 41600398 4180ab7e 40bd65bb -> 41600398", + "4170df2d 405c09da c0b1598c c16d5420 4102f257 408fed2d -> c16d5420", + "40d9a650 411a1f23 3f7c9c4d 3ed148d7 c1947317 405c3b36 -> c05a1642", + "c0b73075 402d7a04 c094ba0f c09fb28c 40d580f7 40bd2b40 -> 40d580f7", + "418f84ed 4117f48c c0abb381 c17d2376 419e9d1a 40130cc0 -> c17d2376", + "c16cdf5f 3fd82913 4093fcc1 418f9b5d c19670e1 40d2f28f -> 418f9b5d", + "bf41c9ac 4009b0f2 3f5c2063 40c1a665 4034f4d4 40937d49 -> 4034f4d4", + "412ea703 4105757e 4106a57c c0b6418e c17c8af4 3ebe4d97 -> c17c8af4", + "c19780d6 c11df163 c0b1fedb 40a234d0 405cd846 4066b36e -> 40a234d0", + "c18c4e75 c04254e4 c0881fe6 bfb35596 4055f38c 3f82e2c5 -> 4055f38c", + "c054caa5 c1137f90 40d3c249 414d23bb 41973eb0 40688967 -> 41677a9c", + "418bb9e2 3ebbb170 c0c5ef92 413fd2bd 419aa5bc 3fc7118c -> 413fd2bd", + "404e97a1 c0966fa3 bee3bd84 404f57e7 c03f2302 400cab6d -> c03f2301", + "c156144e 3fbfd7eb c0b66ff3 c157848a 418d71f3 40b2bc86 -> 418d71f3", + "c033614a 40b071a9 3fa5ce9b 4005ed6b 41748db6 3f12b918 -> 41748db6", + "c08e87a1 bff67c75 c010a7e7 41839a3a 41159736 408c70e0 -> 41159736", + "c11936a6 c0a0a132 c11735ce c102f011 c12e2bc3 40bf1a02 -> c12e2bc3", + "c121c2f9 bef194e0 4106ecb6 c0eb2a9b 40db5e0c 40138765 -> c0eb2a9b", + "c06e604a 409fc7f5 40b07a7f 41527bb2 417c87af 40a90093 -> 41527bb2", + "41537e04 bf7b6c96 c0fb564f c034efad 418ba5b4 40c71ee1 -> c034efad", + "40625ebc 3feb6957 c105cd12 be8501c6 c0c2c087 3fe1b6d2 -> be8501c6", + "40a51c66 40042941 40841404 c14542d5 c17bfe3e 40cf1d8f -> c17bfe3e", + "41797cb2 40ac9aae c101c850 415f6a87 4196e1f3 3f5d3470 -> 415f6a87", + "c1922d2c 4116779f c04c23a4 bf81d8a6 419a43ca 4030ef4f -> 419a43ca", + "bf66ae5b 4112678f c0b1d643 c19ed6a2 c0a8933e 3f80a9a3 -> c0ff42b4", + "41359c43 c02e46e0 c0bf66ff c10a0561 c182ed8a 40a18275 -> c10a0561", + "40afbd9f c0ec6ffa c0181b31 41491aed c18e6521 3ca2833c -> c18e6521", + "4175810e c11f3568 c0aa611c 4178b696 3e2b5d85 3f6041f7 -> 3e2b5d85", + "c06a3e0e c0b23d80 c103a4ba 416ca0e4 41984247 40e9f0f3 -> 416ca0e4", + "c1485c02 c1017096 4025487d 412df2b0 c06763b7 3fdec872 -> 412df2b0", + "be52474b 408432e5 40f785c8 413e2ac3 414a93bc bf70acfb -> 413e2ac3", + "40b4217c 3fffe5e7 c009385d c18f97ba 405e43a8 40e5b3c9 -> c18f97ba", + "c18ea50a 40adddde c11bac12 419381c3 4091901b 40a1e851 -> 4091901c", + "4115f1de c0ef009b 41136e78 c00d0f00 c19ed63a 407209d2 -> c19ed63a", + "c18bf500 3e2ac91f 40f6ef80 41863f78 c1497174 3f8a37d6 -> 41863f78", + "c0b3e32a bfad0070 40b68fe7 c19f9609 40ec906c 40c0e185 -> c19f9609", + "4186f78e 4106bf5a c10b7203 c11716f6 c0bddc84 4035cf69 -> c11716f6", + "413bdb50 3ff4648d c03a36be 40009b88 41292ee7 40dec570 -> 40009b88", + "40b5aab4 3dbafe0a c09d480e 41534715 c195e946 406b86ec -> 41534715", + "c10c9a51 409036a1 c104da52 40e5afb9 418a1707 40b1907c -> 418a1707", + "bfd6b200 410e52ee 41118100 c1432c78 c0ff540d 40de72dc -> c1432c78", + "c13fbce8 40c5ad22 c00f2463 4114f633 3f856850 3fb1427d -> 3f856850", + "c160ffb6 c1168a06 408a600d 418419e9 c1052e55 be7feed0 -> 418419e9", + "40d69aea 40ec8243 40c390f6 c0f81cf8 40a7cd51 3fa22697 -> becf60c0", + "41320853 410db51b c007ca72 4097e8e1 419a55cf 40ed908a -> 4097e8e1", + "c12f212f c1030e3c c0e89f59 408f4b4e c0cdabec 400bea6b -> 408f4b4e", + "415164f4 c0d2aded 409208b7 c0188f4d c134d9e7 40cac83e -> c134d9e7", + "c13a5f81 3f64657c 40ed0cf6 c0b30a64 40961476 40418c29 -> c0b30a64", + "41880072 40507d19 3fb05e6c c05322e8 40d4c206 3f7f040f -> c05322e8", + "c19f0540 c041cad9 3ffa1079 bdcec2b1 c0ec7b7e be87becb -> bdcec2b1", + "c143a8f5 c0df81ad c087472b 4037da73 c1148ee6 3f06d421 -> 4037da73", + "c108499e c0e55ac8 c0fac6a7 4124b427 c1918dd4 3f850e38 -> c1918dd4", + "c19c9c43 40f93b7c c10d50d5 3eec1610 4167b52a bea1b80d -> 4167b52a", + "40e400b2 40dbe991 c0a337b6 412bf424 c11e8728 40ae5712 -> 412bf424", + "40dedbf6 be7cc1c5 3fbdc47f 40fe038c 4124e106 409885d8 -> 4124e106", + "c1971583 c0943f82 40ab47e2 c0eacc4d 417ce1a2 40b86d0d -> c0eacc4d", + "40cbe5a4 3fb2af61 c1073361 c0b6f407 4119f829 4091b085 -> c0b6f407", + "c177b5b2 bfe30351 c105536f 40e0ee09 c1427339 3eb50a68 -> c1427339", + "418a6d80 c02ca084 c0f6b813 c0f0c11b c18f9118 3fca6805 -> c0f0c11b", + "405753be 40dfd79c c11131f6 415d8166 be00fa30 4048b51b -> 414bacdb", + "c188f356 3fce9d39 3e109af6 4135c6b9 c18de291 40c2a299 -> c18de291", + "c02f9f06 40f9ae7a 405da5e5 416b0810 418d974c 3f58f1d9 -> 418d974c", + "40ea0f04 c1105c90 4081540f c19e6289 4139c391 40ffc8a7 -> 4139c391", + "41352175 40386d80 c0936dd8 c1547813 c0cad26a 40bf4c69 -> c1547813", + "40d4b81e c04ee272 c0b9e293 c0fab4d5 c13a543b 40e6d44e -> c0fab4d5", + "c08b8f08 c0a85eaa 40df20ce 412d7226 41448d83 40ec8664 -> 412d8733", + "40dc820d c09e3f99 410db09a c1217757 c0fbd81f 3fb3ca60 -> c0fd7b78", + "c17cd7c5 c11a7ff2 c1014a9a c19b7045 4185b88e 40c049bb -> c19b7045", + "c04dab4d 3f4168ca 3fc29978 c022c6e3 4183749d 40e9cd9b -> c022c6e3", + "4061afbe c10e5763 c09181fc 40c43be7 c19ab09b 408dbffc -> c19ab09b", + "402b5c07 406c9943 c018c1c2 40cca1bb c15fdcd4 40094a2a -> 40b523bf", + "3fcea986 410eb88f c0c67fb4 40a00a58 c0cd28db 40eeb5a3 -> beaf96e0", + "c0ceb2f7 40c630dc 41026cbd c15f05e6 4175f3f6 bf24cfa5 -> c15f05e6", + "c15cc9d3 c11c2fd9 c115c2f0 c10865ca 4127c479 40d5859c -> c10865ca", + "418c52d6 be31600d c0a57f17 4107f100 c1448f98 40cfd039 -> 4107f100", + "4189b851 c0f52952 40da4c8d 40a77be7 410a5a2d 3f403248 -> 410a5a2d", + "4185e5cb 3e8e12ff c0bba932 c11472f2 414a2a37 bd9842f9 -> c11472f2", + "40beeba3 3ecfc226 c11bcb81 bfde52fe c193ef26 bf30c107 -> bfde52fe", + "c01f8a50 c0a2c592 bf95e30a c1962820 40eb8f21 40f02770 -> 3fdb1750", + "419f683f c10309e3 c078b913 bdd9a2e9 bf86d083 4092dcb8 -> bf86d083", + "4198ba66 40082af2 c03f3a48 4001d461 41253e41 40ac75af -> 4001d461", + "c12b5e4b 40977a96 c082a9c1 41403fdc c18dfeee 404ab786 -> c18dfeee", + "c1705676 40a06102 4106d329 40903403 411baae3 4074986d -> 40903403", + "c19fcaa3 411521f1 40631dd9 41942dbd bfcd38ca 40b3b4c5 -> bfcd38ca", + "40f42cad c0ab0850 bf994c0d c146f423 3e94ff68 bf6b59e9 -> 3e94ff60", + "3ecfbaf9 40ff6673 c0fcaef9 c0fc53ab 3fa2444c 40b16e0e -> c06cdade", + "c01eab2c c114ef8b 41049345 c15a1f4a 419d87a1 3d61c0ee -> c06eb324", + "414c083d 404058cd 3f2bc765 c165dda8 c0f4272f 40d11046 -> c165dda8", + "c186e237 3fcc9e7f 410fbcff 4164af99 bf890f58 3f605f58 -> 4164af99", + "c1887041 c040a6cb 4061a191 c0f245d0 413982d9 3c6d056e -> c0f245d0", + "4185ef92 3eb936cf 4104b4db c0585029 c16896bf bc6f4b68 -> c16896bf", + "c19f37b1 41132821 c0b573cc 410ed02b c1200233 40fc4f09 -> c1200233", + "4165b6bc c07e5a2e c08e1bbc c16f5310 41131431 40f24dc5 -> c16f5310", + "415ee682 4118d7d4 bf4088f0 418528bc c1808982 40ac5331 -> 418528bc", + "c11107d9 c0bbefcc bf71c62d c16083da 414e3dbf bf2187c8 -> c16083da", + "c0ecd926 40f6514f c0b3f605 412e5070 c18348a9 40ddcad8 -> c18348a9", + "be707056 411740b4 bfd22465 415288af c1488007 40cb1da2 -> c141a1d5", + "c117488a 3fb3da17 40fc2764 4186a54f c13c85ab 408bd642 -> 4186a54f", + "c0e38ee8 bf1e4206 41189ddd 410d5267 c13f9b2d 40190cad -> 410d5267", + "3f70fa42 410778cf 40503468 c08b9bae c15b1ee2 40d70bf7 -> c15b1ee2", + "c0212119 410cf29c c0dd9bc9 414db62c 4120ee25 40a09a26 -> 412719e3", + "40d9a158 bfd61092 c10288be 41439fd3 c158e4cb 409b8b08 -> 41439fd3", + "4138b173 c041e634 c0deab21 417c2a00 c1818d37 405408d2 -> 417c2a00", + "40c5b87e 4052a4af c109e764 412a0c29 c14cd754 40b38017 -> 412a0c29", + "c0ce0600 c0ad2343 c1065b55 41507c52 c1914c6b 3f9ec5ee -> 40bf561a", + "4186509d bff8bf87 3faf9c16 c170b364 c1122114 40957f64 -> c1122114", + "c1954582 405ee511 c0bd7e9b 404edee6 c11fdd8c 402ac05b -> c11fdd8c", + "c03a91ca 402db399 c0aeffd0 c121816b c00049e1 402ea3df -> c05d2c44", + "410de6bf c0234527 4117245c 419c14f7 c180c071 3fcb4456 -> c18074e1", + "c186e8f4 4090d4fa 410adfd5 bfa4f73b 416f973f 40f7b612 -> bfa4f73b", + "415895b8 40c80d3e 411b0b63 c193d9aa c18d4ce0 4024bdc2 -> c18d4ce0", + "c18a2140 c097cd57 40ba39d4 40e1680f bf54c143 40c1707f -> 40e1680f", + "41860fc3 be918fc2 40fc61b0 4160a41c 41148b3d 3e88cc90 -> 41148b3d", + "c0db74e6 40c68bb2 c0b46403 c04cdb0e bf427cdd 40e8c928 -> bf427cdd", + "c138e2d3 3f66a8e3 3f15b821 c15e1c5e 4172b0a3 40d6083d -> 4172b0a2", + "c0ca938a 409721f9 4028ad62 408dc2bd c09da643 407f88ef -> c09da643", + "c12dff34 4107e5df 402f9432 bf6381c5 c0ebba73 40c2e129 -> c0ebba73", + "40af795e c10c6445 410ca2b3 c0761b32 419327f5 40c20dcc -> 418a6356", + "c14934eb 4084f039 c0515f1a c13ee15c c1055d33 40210e9b -> c1055d33", + "415012d8 c0ab21f4 411bd59e c1047a54 418dca74 3f0e909e -> 418dca74", + "bf2830e4 c0305004 40d4eb34 c0d88333 c1640925 3e48f060 -> c0eafac8", + "c1315ecd 40976c17 c0ee6494 41019080 3f6624f5 4044641d -> 3f6624f8", + "40c966c5 c0af4386 40937915 415fabd3 c1380a89 3fe240c2 -> c1380a89", + "4086a910 40c1e88e 41033640 c13c1cf6 3fc96d65 3f154cf8 -> c13c1cf6", + "c159b91b c0d7cf69 40be61fa 419b3fbb 40c4a164 40976b52 -> 419b3fbb", + "c11bc8a7 3e3290f6 40e288fe 4197990b c112e73c 400c8a3a -> 4197990b", + "418a348c 40e01a48 c0a48f79 415e7934 c0d191f4 4096673b -> 415e7934", + "3fac2f75 407084eb c0f78cc7 c08e9065 4164794d 3fd4585c -> c04e32dc", + "419c0bbe 410e32cc bd88de6c 4055d777 417a4b5b 401c74ac -> 4055d777", + "4129acf2 40813f6e c0754d67 41300dfd c042f0c8 40018105 -> 41300dfd", + "3ed2035b c0972155 400018be c0b25a13 41703d19 bf4161da -> 41529c48", + "c186adb9 bf7ad6cb c0e71ac8 41942b0a c105faca 40b85572 -> c105faca", + "c1996b04 c03f7e60 bf6a702a 414feec2 419732db 400a6a29 -> 414feec2", + "41719536 41052577 401ae4db 40124138 c19ee482 40f8097a -> 40124138", + "3fada298 c0bb3b8b 3ff79404 be5fe051 c12cc35b be396f9b -> c12c2570", + "c082f2ad 4112edad c0c975a7 40104ceb 419c3689 4003e5b5 -> 4199078e", + "c1469507 bfc082e4 c0cd512e 414e6e57 4106cdea 40503ced -> 4106cdea", + "4107109e 40fb311a 400bb49c c19ad9cc 403ed43b 3fb265b2 -> c19ad9cc", + "414edd2c 40c9aaca 3fb64b21 410efff0 c0322747 bf06eac1 -> 410efff0", + "c137edd4 c0d14057 402eb23a 419f40fe 4104bf42 4087ce46 -> 419f40fe", + "4114f50f c108deaa c10505fe 3fcab605 c1458b6c 40130e18 -> c1458b6c", + "c194caad c10cfc78 c001b749 c12e93eb 4195f8d2 40824b35 -> c12e93eb", + "413a572e 3ffb04bb bf94a42b 417e86bc 4176fe1c 3f18088a -> 417e86bc", + "405d4f8c bf178dde 40bf7d53 418b3171 3e00d024 3fa54fed -> 40a48ada", + "412aadef bf48e8ee 3c0c8b40 3fa02557 4187dda1 3fa59940 -> 4187dda1", + "c15d343b c0701533 c08aad87 40e1bb3c 40c90312 40445ad8 -> 40c90312", + "413ba168 c0b44ac3 c1014086 41747461 c0e31c14 4003cfb3 -> 41747461", + "bfefc4a5 c0a84dde c11f26b2 417505e7 401d0013 3fbf235c -> 417505e7", + "4092966e c0cc0d0c 409fb5ce 40be5d41 c1837c85 4069df0f -> c183682a", + "c14cb309 408aeb7c c0def062 4127879d 3f756de6 3f76ba20 -> 3f756de6", + "3feed891 c0242dc0 407474dc bf0a21a1 c09c787d 40ebd617 -> c084a7e0", + "c07871d9 c107c9ff c050cfe1 c178c7e8 c1596292 bf4097b4 -> c159d1c5", + "40a24b76 c0cd4d12 40fe6a28 41974583 c156a2a5 405d1027 -> c1388708", + "4174bd10 bf1e8f36 41174318 c166c5c5 4097ad2c 4097cf50 -> 4097ad2c", + "412250c6 c0e5a069 4006ae6d 4091eadb c12166e9 3f101466 -> c12166e8", + "401f092b bf83ef99 bf2c8193 c159ca07 c199eb84 4087f294 -> c199eb84", + "bf9033cd c0b4ccdd c0df307f 41361c16 417af88c 40cc7073 -> 41361c16", + "c192b0af c0e82ed4 c10c9c05 416fc7cc c100a495 bea0f398 -> c100a494", + "41981867 4013d6f2 c11164ba 41053107 4190bb33 40b3a9ae -> 41053107", + "411a0dc2 c115177a c0948da5 40be84b8 416a1d4a 40f8ba9a -> 416a1d4a", + "40df2170 c09daede 41117353 c08c84ae 3fb628ad 40af37d6 -> 3fa1f5f0", + "c1705f9e 405b1d30 40749b7d c0653de9 c1414f04 3fc70141 -> c0653de9", + "40cc7394 bf404ef8 c05ba7fd c11dfeda 40d78c68 400b6aa5 -> c11dfeda", + "c0b70d24 4058cbac c119bc56 c0bad7dd 4148e3ad 403d86da -> 4119362e", + "4086f67c c10fc1c1 c0b115c1 414cd622 c020a685 3fefb3c4 -> c020a684", + "c1459b9d c0b19657 3fe5242c 40dce91b 41834287 4030ae43 -> 40dce91b", + "4137eea4 c11c2734 411aa657 c1908253 c18dd8e3 3f957091 -> c18dd8e3", + "c15069c0 3ffc9071 c11431d4 4114b8ea 41661b80 40ebbefc -> 41661b80", + "c15c2d4c 40da8350 c08a5f3b 40b92a13 c1133015 40e214ce -> c1133014", + "415207ae 410dc575 40d7926f 3f048aeb c19d75c3 3fc33728 -> 3f048aeb", + "c15b7205 40ea6be2 c10b4e71 40f81be8 c1515a93 bf1f6108 -> c1515a93", + "c056ac8f c0bd25c5 c0cc8a6b 416e0ae3 415464a6 408beb8a -> 416e0ae3", + "c186ad4f c04f1e66 410b0459 40dedde8 c0dc9234 40e97f2e -> 40dedde8", + "419b4118 3fef1daa c019aa70 c08fc1ff c185a2f0 40b72b33 -> c08fc1ff", + "40f1786b bfaa0c1a c0743e74 c14adc4d c0b35b3d 409026ca -> c14adc4d", + "41861d9a 40975141 40eccf07 c0dfa2c4 41190eba 406443da -> 41190eba", + "c19ac0f0 c01686a3 3fe2a336 41196c68 415a9e9a 4018811c -> 41196c68", + "c19e18b4 c0573b9a c0c728ba c1847928 415c25f8 40a78e46 -> 415c25f8", + "41944ec0 c0bc8803 c10d050c c186d964 412b2fa6 3f6841e2 -> c186d964", + "418aea6f bef74023 3f8abab2 c0cd07fc 4134070e 40573291 -> 4134070e", + "4125250f c063992e c07ee5dd c029a7a7 40c95d00 3e926a6f -> c029a7a7", + "c0fa402c 411fc783 c0f3e241 419a7e0a 413deb88 40ac6e78 -> 413deb88", + "3fc37e2e c11c7c8f bfb49fbc c129558a bfb06bda bf1aa969 -> bfb06bda", + "418c566a 408a1ebc c01f74b6 c1108970 c04b8753 3de1e6ae -> c1108970", + "c0ff77e5 c105f75c 4081fee6 3f46eb25 415d5198 40f400f3 -> 3f47e5e1", + "40f84797 c07b74d6 c11deddd c19a92bc bfddadfc 40b67c64 -> c19a92bc", + "bf65afad 4037c547 3ff32027 3fbd0752 416d4f9c 409e59a7 -> 416d4f9c", + "c15cddb5 c049b157 c11113bf bfd9847b 41968bfc 40b94b98 -> 41968bfc", + "40bb9297 be8824ee 40effc22 40b1d7e5 c15ad80f 3e043fd0 -> c14654d4", + "c0b8a7b1 40f5c494 40033d8a 413f29e0 41949fa1 40d35add -> 41949fa1", + "c17432c9 bffee03d 40514813 4115d72b c1482aaf 40906bbc -> 4115d72b", + "419489a1 c0f35574 40cd7b47 41426a86 c168787f 40766dbd -> c168787e", + "c0d760e5 c0c3ec1e c104512c 4159f85d 4041d3dd 40b293ab -> 4141faf0", + "4106b470 c01cf94a 404ab1a7 c12f5a6b 414cc95e bee2574f -> 414cc95d", + "c167eac9 3f85a6cb 4109b3ae c17f419e c1925a7e 409570c6 -> c17f419e", + "c1924089 3f3f8ee6 40ffe056 be318a55 c0cd214a 3f902e99 -> be318a55", + "40717f83 40e30d0e 40d6ce4c 4102807b c0a84f02 3f44d520 -> c0a84f02", + "3fd99c6e 4111d558 40150e2a 3f4f6a20 bfed1393 3fe4d39e -> bfed1393", + "4115b12a 4106ae4d bf951c26 c17e68c9 411dd9c2 40d75600 -> c17e68c9", + "40d41aaa c0bea73f c098893a c198b3ec 418c6e0d 40bca401 -> 418c6e0c", + "40f11436 3f2fa705 40612de4 c12d3c77 c048b9c5 be06af4e -> c048b9c5", + "c18dde2f c0e06b5b bf33fd14 419a75bd 41405085 40774429 -> 419a75bd", + "40f8c19f bfb4cffe 407492f4 4182c10b 40be46f1 bf114b93 -> 40be46f1", + "41580640 404fb2c0 c00e6eb4 404fb1ba c1192f2f 40ccc3ee -> 404fb1ba", + "4115b55d bfa93c2e 3f1c7b4e c118d857 bfd033d3 40d0022e -> bfd033d4", + "4190ece8 411511bb 4082910e 3fe0e300 411b367a 40696d30 -> 3fe0e300", + "4120ef74 c0551a8b 3fc3f3f8 c104adaf 41027ef3 40be89db -> 41027ef3", + "c0a2daa1 bff36e4d c002bae2 c134ea16 c19ef806 beb6ef45 -> c19ef806", + "c19fd38a c0c66d2d 40b1e56c 4182d7d8 40c2f276 40fa5b50 -> 4182d7d8", + "414ab6ea c0ae9a14 3f70c5d5 c10132b6 3fff4a2f 3f4c56b5 -> 3fff4a2f", + "418cce78 4117aa51 403f0411 c1834e1e c19d158e bf5b530c -> c1834e1e", + "415e82a4 c08472c9 410e837a 416cca70 40cd5d45 40f82998 -> 40cd5d45", + "c1067c02 40f3d8c9 410bf1e4 c0868209 bfd93d9e 40bef618 -> c0868209", + "40abd357 40d6637d 3eb770d6 c19e3466 4128bfc4 40ec15f5 -> c18e4595", + "c062e992 c01e78bc 4101e08e 40a1e9fe c1877f6b 40ef09fa -> 40a1e9fe", + "c160aa61 c0d5688c 4018f5cc 3fcf8bc5 c08e27f7 401edf6c -> 3fcf8bc5", + "c10312ae bfcec7c6 bfa003fd c1541385 418c0c6b 40a803f2 -> c1541385", + "4084aeaf 411e57b7 c0f25a20 4169cb67 c188b491 4086008c -> 41027926", + "c1463011 3fcc0c8e 40fcbc72 4104b13d 40b3e2db 40f4c2df -> 4104b13d", + "c103c04d c01c3445 c0f34e0b 40cf38df c0d6e177 4078b76a -> c0d6e177", + "c181f1e5 3f128fe0 4033e983 40d60ff4 c0fff996 407dd21c -> 40d60ff4", + "c17fce0e 4112fab3 40dc6b20 412af939 419afcf2 3f7adb42 -> 419afcf2", + "413490c3 c109ce49 c100227e 40069ec1 41428193 40c5835f -> 41428193", + "bfbafc39 41017596 4115d1e9 41855ea4 c138f78f 402aa00d -> 41855ea4", + "404a3dc5 40b3181d beeb2ca7 c1878f95 c084ff5b 3f604d19 -> c14d54e8", + "407808e9 40ece617 c0e775ec 4192ec2c 4189e3bb 407b893e -> 41921230", + "c0943a65 c011df10 40fc5253 c070a43a c160c3e1 40bb4529 -> c070a43a", + "c0233104 41188d60 3f2f50be c1129a0c 4176a575 40fbd2cc -> 4176a574", + "415cb3db c1010242 c066fdfc 4191e39d c11ee5ca 40a58c68 -> c11ee5ca", + "c179fb5c c0f4636a c0d6a0ad c198bffd 4016ea7a 404bf9c1 -> c198bffd", + "40db6de2 3da894fb c08f406c 3dbb0dbe c020adfd 4093f3e5 -> 3dbb0dbe", + "406013b1 c0a64642 c08c9086 c1889e01 3fd53eb8 4087673a -> 3fd53eb0", + "c07d71c1 be9563e9 40b7850c 3f7307ee c1242bc2 3fb92074 -> 3f7307ee", + "c0567eec 40aa10aa c0da018a c18d3dba c0ac7611 40a801da -> c0e51b38", + "c188e938 c0947acc 40a87da6 c11325a1 418780ed 40a1f1bd -> c11325a1", + "c15f6212 406d7250 411b968d c1825ddd 416a53f8 40f93f6c -> c1825ddd", + "c16258ac 40a7a7c3 bfdc7eda 418f5583 c09a4655 3f806d9e -> c09a4654", + "c185bd82 3f08ac96 4097e04e 4183fb00 407d7650 40d4f897 -> 4183fb00", + "41536f0e c11dce57 bf63e534 c1966f4e 4189a8e0 40411bae -> 4189a8e0", + "c0696d12 c10296a1 c09489a3 40bc08cb 4054ce56 3ff8e895 -> 4054ce56", + "c10eada5 40f2d8e1 c0cc034a c04bb9ff c178c642 4097101f -> c178c642", + "409857fa c0c79fb1 c0dcbb8d c16fbbbd 418536ba 40c7b320 -> c16fbbbd", + "40f734fc c099e983 3ffef73a c04cf780 c0e599a4 40468bc5 -> c0e599a4", + "418d130f bfdaa6ae 3fe1ce68 bf5242c8 c18bfb54 40092b09 -> c18bfb54", + "411d7167 bf457f20 c01e8fb7 c19b71fa 3f883a76 408ab82e -> c19b71fa", + "bfa1ad58 40b8fa0b c0a14cbf 400e189d 4148e306 4069e943 -> 41223b98", + "41000e8f 40ac2ecf 41154117 41456144 c05e2de3 408067f9 -> bdce1400", + "c15d90ae c025158c 40b3dbcc c1362546 4137b85e 40d5901d -> c1362546", + "bfab71b7 c0a2662d be16660c 404f472a c11ada1f 408ff363 -> c1072ae6", + "41097a0b 401e4641 c0c86c52 c06f1a7b c0271cce 3ee7c1c5 -> c06f1a7b", + "c0556ba9 bfeef9f2 40c1ec27 c0c46084 c187f49a 408a1ca1 -> c0c46084", + "41249086 40c98091 c0bae60c 40ffc2b5 40b9bacd 3fddf677 -> 40ffc2b5", + "c1050932 c0b99d22 c081722a c125f389 c149c058 40dad0cd -> c125f389", + "c0a8b0a4 3f4de8c3 4023b82c 407d0215 4102120f 40d0fac6 -> 407d0215", + "c0fc4b7c c0c244fe 410f16cd c18e86e3 415eccff bf7f92a7 -> c18e86e3", + "40bc8376 c0303782 40c136e4 c0c66802 40f33e05 40e49fb2 -> 40f338da", + "c0652bb4 c10ca3e6 c10ce3d0 4081faf9 419b328c 40cfeea0 -> 4081faf9", + "c100c5fe bf99417a 40702e3f c187198b 414ad810 403c69cb -> c187198b", + "40e8c54f 40c63207 41113091 40c06375 41879f1d 3f37ce1a -> 41106386", + "c0f3b62f c0f411f2 c1112107 407b959c c10e0101 40ca7d8d -> 407b959c", + "40711579 c0ae9f37 c0ed4b33 c06aefa1 c1414abe 40d52bc0 -> c06aefa1", + "c183d4e4 408b6e58 410583d3 4166b5fb 418fd8cc 40881b08 -> 4166b5fb", + "c183d59c bfa20955 c0559fa4 4168383c 4162ea26 4097f11d -> 4162ea26", + "40e5f9ee 40cf605f c0aaafaf c18b759e 4183d092 404625bd -> c18b759e", + "c15b29fa 4023b5fa c0ebdfa9 bd94a43d 41856bee 40d6879c -> 41856bee", + "40a3f2c4 c09b877b c11b5ec8 c121fe5d c186fa69 4092e94b -> c121fe5d", + "c10e57bf 41039d9f c0e42b98 c0f0f972 4059ac44 3fe63417 -> 4059ac44", + "41393122 c0060106 bfb948dd 40b0a654 c1446674 3e92763f -> c1446674", + "c0c2c82f 410ccb13 c1188a61 c12ac5c2 c095ba6b 4049b03a -> c09f26af", + "c18c35ce c04a0221 4069ef70 c0016c1d 40351bc4 4008e3a0 -> c0016c1d", + "c08b8430 c0264707 bf971500 3fa3e2cc c072d328 3feaa87d -> 3fa3e2cc", + "c120031e c0cc1ad5 40849899 c1153c97 c1248018 bf7d82ef -> c1153c97", + "c1626d49 40506f31 bd96fcbf c1522407 416c4be8 401776e4 -> 416c4be8", + "c0d1fe94 c05f9b15 40baf8d1 409a3f65 41168700 40817900 -> 409a3f65", + "3fa7ba3f 4018ce0f 40d1a1e9 c074e103 3d9be840 40f67a41 -> c074e103", + "413f91bb 3fdec400 40d23d83 c1094c3b 412c526d 4057dbab -> 412c526d", + "c195fba1 3e09f0ac 4116ad19 3f415763 413c4147 4010e43a -> 3f415763", + "40994c2e 41088a29 40e70144 409bf1e6 418e1faf 40e7973c -> 418e1faf", + "c19e3816 408c9668 bfda7f41 4130523a c146ead7 404c3927 -> c146ead6", + "bf649706 c0d5562e 40de9a1b c1597e58 c17f1504 3fae16ac -> c1670075", + "3ebf22d9 c031f90f 4028ed76 c083fff0 c13dac1f 40b103fa -> c1127e2a", + "416aa941 c0f176dc c11892f0 c1267e3b c181540f 408422a2 -> c1267e3b", + "41538fbb 40d61985 c084e540 c13e827a c146fb4b 40c4cbfa -> c13e827a", + "4142da76 c08c8ffb 40e576d8 c16324f0 c0d607d4 40b2c882 -> c0d607d4", + "4068cc9b c024f0b8 406aa07f 4151a6c0 c12f1672 40170bfa -> c12f165e", + "3ea5665c 403edcae 404f51ee 416b678d 409b1900 be50a19a -> 416b678d", + "4171e4bd 410a02ff bf06ab7a c196a7be 415b77a4 40b0ec6c -> c196a7be", + "4176c2b7 40e106ed c10f9fdd c0e76aed 4124f814 4048cd5e -> c0e76aed", + "40bc68fa 40eb58ec 407f84a7 c0d851c7 41667c17 40a67d59 -> 3fa90d04", + "c0ca0be6 c10d6819 4087ad4c c0d20088 409d2b26 40bea0ba -> c0bea8ac", + "bf9d1483 c0bd586c 4115ddca c15e0fb9 40b6c4bc 40204e11 -> c12810d6", + "c187304e 40d748d9 4100f3af 4183d28f 40f77239 40bed51a -> 4183d28f", + "404538c7 40d3bd3c 40ee0406 418fd6be c0793ab0 beb88849 -> 418fd6be", + "c025eca8 bf79c968 411b68fb 41529256 40ee031f bdb18d54 -> 41529256", + "c186fef1 c0ff97ae 411511d1 c076024d c0d473a4 40ebd6e3 -> c076024d", + "416387a6 c0c1efe3 bfb93333 416ff0d9 c19716b6 40bf650a -> c19716b6", + "4155921e 3fd249a4 4084f74f c18b1899 c10e583a 405f300f -> c10e583a", + "c00a5a5d c10f018c 40eabead 406d01f1 402ec0a4 401fe262 -> 405775b4", + "4117b548 3f20ab3f 3f6128b7 c161a0eb c0850899 3fdd79b9 -> c085089a", + "c119f2de 40dbfa9b c0ec2d0a 4150c4d9 401591e4 40e34649 -> 401591e4", + "413bf796 4089b1b4 4114c620 c13bdce1 4132659a 4043aef3 -> 4132659a", + "4144367b c0c9e419 be41b4e6 c118891c c09f46bf 4085719b -> c09f46bf", + "405eb3f6 40e2cc73 c0de2048 c0185083 c1359fdd 408ace7b -> c0582c1c", + "c18e53e4 c0ea6cac bf99c250 4155c2dd 40689b51 40624021 -> 4155c2dd", + "416ded3e 40bbb363 410f642f 412dd418 41057f49 be656a4e -> 41057f49", + "c0d3432b 40c5907b bfe8de6e c126f596 c1833f26 40a6e3ae -> c1833f26", + "c0d8e09c 4116530c c11fa63f c172a6d1 c180c887 4099c86f -> c180865d", + "c0f865a5 c10292c4 3faedc0e 41208f6a c1937583 40cd7fa2 -> 41203f63", + "41475746 c0ba3420 c0cd6a86 c13a4d6e 413a7b15 3ae31bd2 -> c13a4d6e", + "bfecc79b c113c3ea c08d1af5 c1350e5c c1304180 3f4bd0d5 -> c1304180", + "412b6c13 408a33ba 407f1ff2 c198d1ec c17c51a6 4040e68c -> c198d1ec", + "c127099d 40d23fba 4086f72c bf9d9e49 c132b092 407cb6a5 -> c132b092", + "414c436d 4092e536 4058f2e0 c0c10b3f c09ea98a 40e00d4f -> c0c10b3f", + "4169f46c c0bb9ec9 41014939 c13bd9cc 413ed114 40f12584 -> 413ed114", + "403ae71e 40f4e092 403efe33 409c3ea5 418f7c88 bf71ebf4 -> 418f7c88", + "417fcbb3 400b4828 bf04c1fb c168673f c1491b5b 3fa8b12d -> c168673f", + "413fc980 c0ac9aae 401f042a c01d0c06 c0ae1f93 4086b800 -> c0ae1f93", + "c101aa94 40b9c36d 410276f4 bfda3551 c12cdc46 406471a6 -> bfda3551", + "c0472b71 3f14c1be 40b01d4b c1355672 c00aa32e 3fa6dacc -> c1355672", + "413a9251 bfd5fe72 bf80d70a 4189782f 3ede7aa9 4045e0a8 -> 3ede7ac0", + "c15f33bb 410a066b c10cf3ae 411e9266 3e7f9539 3f8415af -> 3e7f9540", + "c089153e bedc593e 40bc5c9a 41581674 4116b2c1 40f8854c -> 41581674", + "41511d9a c0c736c3 c11adf47 c193d0b2 4111e265 407088bb -> c193d0b2", + "c0b54789 c0f05108 c09e444a c16b8478 3f057e9a 40d5ddba -> bfcae988", + "40e55b11 40dec741 c0e817d0 c113c0c1 405afc1b 4094c8c2 -> c113c0c1", + "c152ead6 c0c8efb4 c0e30a6f c0e0b90c c0810631 403cb65d -> c0810631", + "419d1ae2 3f3fab58 c0ffa66a c18658bb 4133bd64 40b836b5 -> c18658bb", + "bf5e3874 c1107040 c0d09352 bfb4bf34 40cc69ae 3f8ac8c2 -> 40cc69ae", + "c194f6dd 3f31ba93 c03361b0 3fff747c 419e44c9 4085e300 -> 419e44c9", + "40c35ac3 c0f76221 41027311 c0fb5dc1 c16884b9 40b4e7af -> c166a5d7", + "c077e520 40f5f0ef bfd22316 c09e935a c069b553 40c73789 -> c069b553", + "c03e7541 3e50b201 3f4eb96f bd98379b 417446fd 3fa1292d -> bd98379b", + "418fb32d c0fbd618 40d30fbd 414f62f1 417eb102 40cafeec -> 417eb102", + "411bed32 bf9291a1 3f97810c c162f3f6 c1930431 40ddda9f -> c1930431", + "40402bc6 c0ddc43e c116cd60 415e1306 c198489c 40dcb7da -> 415e1306", + "40cb8200 beec9fa7 40003fd0 c1115ebd c164df05 3f78e621 -> c164df05", + "40afb3d0 40c68767 3f4ba90e c03be0de 4192e3ca 40657f8c -> c0227790", + "c142c05d 410d28d3 c0c4c7f5 c19bb385 c1458dc5 4040d2ab -> c1458dc5", + "419d0144 c0e6fe6f c03ff606 c17cb948 412db2ab bee9dd69 -> 412db2ab", + "3fbe57b2 c1116a68 410b980d 413b91e0 c1848142 40315017 -> c0e8c590", + "415db393 3fd45789 c0170131 3ff9da8d c0b7b5ba 408a54a4 -> 3ff9da8d", + "c01fb4de 3f2ae859 c110df13 41288437 c15d6446 406c2a01 -> 40b67c39", + "4145d12b 40a8f0c6 c0b4524c 415d7850 413be4fc 3fc81351 -> 415d7850", + "c13e6e38 3ea584f7 bf67e1b3 c0ec3955 c0ca2421 40e1d279 -> c0ca2421", + "405cd4e8 c087f97a c08ff7bc c0fc1960 40ff1607 403815b7 -> c0fc1960", + "c01356d6 40a16f6d 3f9e7f4d c1349019 414cb257 40e8ea37 -> 414cb257", + "41186ad1 40957f3b 405d9d39 4101d286 401b310a 3ff5a2d0 -> 4101d286", + "c02d52df 4083dd22 c0503a9a 3fb45c82 c18fb599 3f9638c7 -> c18f2660", + "414e07c7 40d0ee59 3fc77bf6 417836f1 40f2c30f 40984b45 -> 417836f1", + "3fb55789 3f4f815b 40da9cd7 4177e953 41659309 40154873 -> 4177c05e", + "40a937ac 4062aea9 3fb989a3 41425451 4001db7e 40188381 -> 41425451", + "c134ec89 40f5c07c c0354300 c118f751 c10333ce 4009105d -> c10333ce", + "c18ca76d c0cfbb29 c009df88 419aebcd 3fca6390 40094104 -> 419aebcd", + "418b334b 4086c219 40c2e4e9 4183907b 415e0bf2 3e8707b4 -> 415e0bf2", + "3fec000b c0686260 bf6c8859 414eff8d 41930f0a 40f81aad -> 41930f0a", + "c196d750 40867003 c015df15 c121a8cd c03783f5 40b2957e -> c03783f5", + "40e85b5d 40a4316e 405cd2fe c162d9c3 bdb54615 40995291 -> c162d9c3", + "411a6374 40c614f9 3f67b312 410e03b5 4127297d 401da4c6 -> 410e03b5", + "c1573f0d bf768017 c09aaa0e 40cdd31f c11bd2a8 4096189b -> c11bd2a8", + "4008fbe3 bf3f07a7 3d625435 4132a1d1 c084143e 4097ba02 -> c084143e", + "bfd92287 4049b3ee c0b224d5 c1757a02 c10839d1 bf0b6c90 -> c1337732", + "4129680b 405bfbb7 3f74014d c191e586 c1087f6f bd83098f -> c191e586", + "40c53db6 40209067 c1179708 c191b6f5 c179fbf8 40a00000 -> c191b6f5", + "3fca3125 c04ad41b c0b847e7 c0cb8e4d bf6d477a 40800000 -> c0cb8e4d", + "c131aa4f c07c8f8d 40d4af33 4150a780 4196618f 40400000 -> 4150a780", + "c156c168 40a787f2 40b6aeeb c01b47c8 41846f08 40000000 -> c01b47c8", + "c11b10bb c0795606 c0f07677 c11b5040 c12ab0a7 3f800000 -> c12ab0a7", + "40026380 410267ca 40be39fa 4142a4e2 c1167a63 00000000 -> c1167a62", + "c0650c95 c099560b bef376a4 c134b7ef c0539bbf bf800000 -> c122f801", + "41883c02 c0eb33be c0a09195 c17a67d8 41640050 c0000000 -> 41640050", + "41641ca4 40d0c876 c116ee3e 4185a54b c166dfcf 409fb5cd -> 4185a54b", + "c0aab977 40ceff93 3fcfe717 414b5b04 41462697 40d8f9cf -> 41462697", + "41414819 40c747ba c0f0c8ae 415a65fc 413d6145 3f1246be -> 415a65fc", + "415ba556 40a3c6af c1095fc8 c09d979a c189bd27 4083abdf -> c09d979a", + "414d8095 4106e794 405d2c9c 419532d9 bf936409 40c06d5e -> 419532d9", + "c1917c6e 3f63625c c0887329 419e21ef 4185d383 4026808e -> 4185d383", + "4029e43a 3e8b0870 bff18804 c12d3f55 bf841b7b 40b68a57 -> c12d3f55", + "c1708610 3f6c153b c118aa07 c032ac64 40fa8b30 401d1db7 -> 40fa8b30", + "418e9269 c0f03f26 c0f03f26 40d4f274 c0b69976 4055a0a7 -> 00000000", + "4027a4ac c11845f1 c11845f1 4118fdd9 c0baf92d 40c75adf -> 00000000", + "c1253e4b c1165e48 c1165e48 41998ce4 3dcfa597 bd5546e4 -> 3dcfa597", + "410fe2c4 40d70e24 40d70e24 c11966af c10b0f47 4089e69c -> c10b0f47", + "c1809794 c05145dd c05145dd 416346ae 412b3819 40e32d4e -> 412b3819", + "418149a9 c082a2a4 c082a2a4 c0b5234d c1629890 403fcb10 -> c0b5234d", + "c0bf9063 41077b4a 41077b4a 3ff6caa7 419f881c be46405f -> 3ff6caa7", + "c19a91f5 40df0e8c 40df0e8c c04744ec 40fe8948 40f22358 -> 00000000" + ] + } + ] +} diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/math.json b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/math.json new file mode 100644 index 00000000..859bacb0 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/math.json @@ -0,0 +1,20610 @@ +{ + "oracle": "tools/cycles-oracle/oracle.py (Blender 5.2.2 LTS, build d13f752e3b9c, Cycles CPU, 1 sample, Emit bake, float Non-Color images)", + "blender": "5.2.2 LTS", + "build_hash": "d13f752e3b9c", + "platform": "Linux", + "encoding": "each case is 'operands -> results', every scalar a float32 bit pattern in hex, colours flattened as r g b", + "family": "math", + "functions": [ + { + "function": "cycles_divide", + "node": "ShaderNodeMath DIVIDE", + "cases": [ + "00000000 00000000 -> 00000000", + "00000000 3f800000 -> 00000000", + "00000000 bf800000 -> 00000000", + "00000000 3f000000 -> 00000000", + "00000000 bf000000 -> 00000000", + "00000000 40000000 -> 00000000", + "00000000 c0000000 -> 00000000", + "00000000 40400000 -> 00000000", + "00000000 c0300000 -> 00000000", + "00000000 3dcccccd -> 00000000", + "00000000 bdcccccd -> 00000000", + "00000000 40f00000 -> 00000000", + "00000000 c0f00000 -> 00000000", + "00000000 33d6bf95 -> 00000000", + "00000000 b3d6bf95 -> 00000000", + "00000000 42c80000 -> 00000000", + "00000000 c2c80000 -> 00000000", + "00000000 461c4000 -> 00000000", + "00000000 3e99999a -> 00000000", + "00000000 3f333333 -> 00000000", + "3f800000 00000000 -> 00000000", + "3f800000 3f800000 -> 3f800000", + "3f800000 bf800000 -> bf800000", + "3f800000 3f000000 -> 40000000", + "3f800000 bf000000 -> c0000000", + "3f800000 40000000 -> 3f000000", + "3f800000 c0000000 -> bf000000", + "3f800000 40400000 -> 3eaaaaab", + "3f800000 c0300000 -> beba2e8c", + "3f800000 3dcccccd -> 41200000", + "3f800000 bdcccccd -> c1200000", + "3f800000 40f00000 -> 3e088889", + "3f800000 c0f00000 -> be088889", + "3f800000 33d6bf95 -> 4b189680", + "3f800000 b3d6bf95 -> cb189680", + "3f800000 42c80000 -> 3c23d70a", + "3f800000 c2c80000 -> bc23d70a", + "3f800000 461c4000 -> 38d1b717", + "3f800000 3e99999a -> 40555555", + "3f800000 3f333333 -> 3fb6db6e", + "bf800000 00000000 -> 00000000", + "bf800000 3f800000 -> bf800000", + "bf800000 bf800000 -> 3f800000", + "bf800000 3f000000 -> c0000000", + "bf800000 bf000000 -> 40000000", + "bf800000 40000000 -> bf000000", + "bf800000 c0000000 -> 3f000000", + "bf800000 40400000 -> beaaaaab", + "bf800000 c0300000 -> 3eba2e8c", + "bf800000 3dcccccd -> c1200000", + "bf800000 bdcccccd -> 41200000", + "bf800000 40f00000 -> be088889", + "bf800000 c0f00000 -> 3e088889", + "bf800000 33d6bf95 -> cb189680", + "bf800000 b3d6bf95 -> 4b189680", + "bf800000 42c80000 -> bc23d70a", + "bf800000 c2c80000 -> 3c23d70a", + "bf800000 461c4000 -> b8d1b717", + "bf800000 3e99999a -> c0555555", + "bf800000 3f333333 -> bfb6db6e", + "3f000000 00000000 -> 00000000", + "3f000000 3f800000 -> 3f000000", + "3f000000 bf800000 -> bf000000", + "3f000000 3f000000 -> 3f800000", + "3f000000 bf000000 -> bf800000", + "3f000000 40000000 -> 3e800000", + "3f000000 c0000000 -> be800000", + "3f000000 40400000 -> 3e2aaaab", + "3f000000 c0300000 -> be3a2e8c", + "3f000000 3dcccccd -> 40a00000", + "3f000000 bdcccccd -> c0a00000", + "3f000000 40f00000 -> 3d888889", + "3f000000 c0f00000 -> bd888889", + "3f000000 33d6bf95 -> 4a989680", + "3f000000 b3d6bf95 -> ca989680", + "3f000000 42c80000 -> 3ba3d70a", + "3f000000 c2c80000 -> bba3d70a", + "3f000000 461c4000 -> 3851b717", + "3f000000 3e99999a -> 3fd55555", + "3f000000 3f333333 -> 3f36db6e", + "bf000000 00000000 -> 00000000", + "bf000000 3f800000 -> bf000000", + "bf000000 bf800000 -> 3f000000", + "bf000000 3f000000 -> bf800000", + "bf000000 bf000000 -> 3f800000", + "bf000000 40000000 -> be800000", + "bf000000 c0000000 -> 3e800000", + "bf000000 40400000 -> be2aaaab", + "bf000000 c0300000 -> 3e3a2e8c", + "bf000000 3dcccccd -> c0a00000", + "bf000000 bdcccccd -> 40a00000", + "bf000000 40f00000 -> bd888889", + "bf000000 c0f00000 -> 3d888889", + "bf000000 33d6bf95 -> ca989680", + "bf000000 b3d6bf95 -> 4a989680", + "bf000000 42c80000 -> bba3d70a", + "bf000000 c2c80000 -> 3ba3d70a", + "bf000000 461c4000 -> b851b717", + "bf000000 3e99999a -> bfd55555", + "bf000000 3f333333 -> bf36db6e", + "40000000 00000000 -> 00000000", + "40000000 3f800000 -> 40000000", + "40000000 bf800000 -> c0000000", + "40000000 3f000000 -> 40800000", + "40000000 bf000000 -> c0800000", + "40000000 40000000 -> 3f800000", + "40000000 c0000000 -> bf800000", + "40000000 40400000 -> 3f2aaaab", + "40000000 c0300000 -> bf3a2e8c", + "40000000 3dcccccd -> 41a00000", + "40000000 bdcccccd -> c1a00000", + "40000000 40f00000 -> 3e888889", + "40000000 c0f00000 -> be888889", + "40000000 33d6bf95 -> 4b989680", + "40000000 b3d6bf95 -> cb989680", + "40000000 42c80000 -> 3ca3d70a", + "40000000 c2c80000 -> bca3d70a", + "40000000 461c4000 -> 3951b717", + "40000000 3e99999a -> 40d55555", + "40000000 3f333333 -> 4036db6e", + "c0000000 00000000 -> 00000000", + "c0000000 3f800000 -> c0000000", + "c0000000 bf800000 -> 40000000", + "c0000000 3f000000 -> c0800000", + "c0000000 bf000000 -> 40800000", + "c0000000 40000000 -> bf800000", + "c0000000 c0000000 -> 3f800000", + "c0000000 40400000 -> bf2aaaab", + "c0000000 c0300000 -> 3f3a2e8c", + "c0000000 3dcccccd -> c1a00000", + "c0000000 bdcccccd -> 41a00000", + "c0000000 40f00000 -> be888889", + "c0000000 c0f00000 -> 3e888889", + "c0000000 33d6bf95 -> cb989680", + "c0000000 b3d6bf95 -> 4b989680", + "c0000000 42c80000 -> bca3d70a", + "c0000000 c2c80000 -> 3ca3d70a", + "c0000000 461c4000 -> b951b717", + "c0000000 3e99999a -> c0d55555", + "c0000000 3f333333 -> c036db6e", + "40400000 00000000 -> 00000000", + "40400000 3f800000 -> 40400000", + "40400000 bf800000 -> c0400000", + "40400000 3f000000 -> 40c00000", + "40400000 bf000000 -> c0c00000", + "40400000 40000000 -> 3fc00000", + "40400000 c0000000 -> bfc00000", + "40400000 40400000 -> 3f800000", + "40400000 c0300000 -> bf8ba2e9", + "40400000 3dcccccd -> 41f00000", + "40400000 bdcccccd -> c1f00000", + "40400000 40f00000 -> 3ecccccd", + "40400000 c0f00000 -> becccccd", + "40400000 33d6bf95 -> 4be4e1c0", + "40400000 b3d6bf95 -> cbe4e1c0", + "40400000 42c80000 -> 3cf5c28f", + "40400000 c2c80000 -> bcf5c28f", + "40400000 461c4000 -> 399d4952", + "40400000 3e99999a -> 41200000", + "40400000 3f333333 -> 40892492", + "c0300000 00000000 -> 00000000", + "c0300000 3f800000 -> c0300000", + "c0300000 bf800000 -> 40300000", + "c0300000 3f000000 -> c0b00000", + "c0300000 bf000000 -> 40b00000", + "c0300000 40000000 -> bfb00000", + "c0300000 c0000000 -> 3fb00000", + "c0300000 40400000 -> bf6aaaab", + "c0300000 c0300000 -> 3f800000", + "c0300000 3dcccccd -> c1dc0000", + "c0300000 bdcccccd -> 41dc0000", + "c0300000 40f00000 -> bebbbbbc", + "c0300000 c0f00000 -> 3ebbbbbc", + "c0300000 33d6bf95 -> cbd1cef0", + "c0300000 b3d6bf95 -> 4bd1cef0", + "c0300000 42c80000 -> bce147ae", + "c0300000 c2c80000 -> 3ce147ae", + "c0300000 461c4000 -> b9902de0", + "c0300000 3e99999a -> c112aaaa", + "c0300000 3f333333 -> c07b6db7", + "3dcccccd 00000000 -> 00000000", + "3dcccccd 3f800000 -> 3dcccccd", + "3dcccccd bf800000 -> bdcccccd", + "3dcccccd 3f000000 -> 3e4ccccd", + "3dcccccd bf000000 -> be4ccccd", + "3dcccccd 40000000 -> 3d4ccccd", + "3dcccccd c0000000 -> bd4ccccd", + "3dcccccd 40400000 -> 3d088889", + "3dcccccd c0300000 -> bd14f209", + "3dcccccd 3dcccccd -> 3f800000", + "3dcccccd bdcccccd -> bf800000", + "3dcccccd 40f00000 -> 3c5a740e", + "3dcccccd c0f00000 -> bc5a740e", + "3dcccccd 33d6bf95 -> 49742400", + "3dcccccd b3d6bf95 -> c9742400", + "3dcccccd 42c80000 -> 3a83126f", + "3dcccccd c2c80000 -> ba83126f", + "3dcccccd 461c4000 -> 3727c5ac", + "3dcccccd 3e99999a -> 3eaaaaaa", + "3dcccccd 3f333333 -> 3e124925", + "bdcccccd 00000000 -> 00000000", + "bdcccccd 3f800000 -> bdcccccd", + "bdcccccd bf800000 -> 3dcccccd", + "bdcccccd 3f000000 -> be4ccccd", + "bdcccccd bf000000 -> 3e4ccccd", + "bdcccccd 40000000 -> bd4ccccd", + "bdcccccd c0000000 -> 3d4ccccd", + "bdcccccd 40400000 -> bd088889", + "bdcccccd c0300000 -> 3d14f209", + "bdcccccd 3dcccccd -> bf800000", + "bdcccccd bdcccccd -> 3f800000", + "bdcccccd 40f00000 -> bc5a740e", + "bdcccccd c0f00000 -> 3c5a740e", + "bdcccccd 33d6bf95 -> c9742400", + "bdcccccd b3d6bf95 -> 49742400", + "bdcccccd 42c80000 -> ba83126f", + "bdcccccd c2c80000 -> 3a83126f", + "bdcccccd 461c4000 -> b727c5ac", + "bdcccccd 3e99999a -> beaaaaaa", + "bdcccccd 3f333333 -> be124925", + "40f00000 00000000 -> 00000000", + "40f00000 3f800000 -> 40f00000", + "40f00000 bf800000 -> c0f00000", + "40f00000 3f000000 -> 41700000", + "40f00000 bf000000 -> c1700000", + "40f00000 40000000 -> 40700000", + "40f00000 c0000000 -> c0700000", + "40f00000 40400000 -> 40200000", + "40f00000 c0300000 -> c02e8ba3", + "40f00000 3dcccccd -> 42960000", + "40f00000 bdcccccd -> c2960000", + "40f00000 40f00000 -> 3f800000", + "40f00000 c0f00000 -> bf800000", + "40f00000 33d6bf95 -> 4c8f0d18", + "40f00000 b3d6bf95 -> cc8f0d18", + "40f00000 42c80000 -> 3d99999a", + "40f00000 c2c80000 -> bd99999a", + "40f00000 461c4000 -> 3a449ba6", + "40f00000 3e99999a -> 41c7ffff", + "40f00000 3f333333 -> 412b6db7", + "c0f00000 00000000 -> 00000000", + "c0f00000 3f800000 -> c0f00000", + "c0f00000 bf800000 -> 40f00000", + "c0f00000 3f000000 -> c1700000", + "c0f00000 bf000000 -> 41700000", + "c0f00000 40000000 -> c0700000", + "c0f00000 c0000000 -> 40700000", + "c0f00000 40400000 -> c0200000", + "c0f00000 c0300000 -> 402e8ba3", + "c0f00000 3dcccccd -> c2960000", + "c0f00000 bdcccccd -> 42960000", + "c0f00000 40f00000 -> bf800000", + "c0f00000 c0f00000 -> 3f800000", + "c0f00000 33d6bf95 -> cc8f0d18", + "c0f00000 b3d6bf95 -> 4c8f0d18", + "c0f00000 42c80000 -> bd99999a", + "c0f00000 c2c80000 -> 3d99999a", + "c0f00000 461c4000 -> ba449ba6", + "c0f00000 3e99999a -> c1c7ffff", + "c0f00000 3f333333 -> c12b6db7", + "33d6bf95 00000000 -> 00000000", + "33d6bf95 3f800000 -> 33d6bf95", + "33d6bf95 bf800000 -> b3d6bf95", + "33d6bf95 3f000000 -> 3456bf95", + "33d6bf95 bf000000 -> b456bf95", + "33d6bf95 40000000 -> 3356bf95", + "33d6bf95 c0000000 -> b356bf95", + "33d6bf95 40400000 -> 330f2a63", + "33d6bf95 c0300000 -> b31c2e3e", + "33d6bf95 3dcccccd -> 358637bd", + "33d6bf95 bdcccccd -> b58637bd", + "33d6bf95 40f00000 -> 3265109f", + "33d6bf95 c0f00000 -> b265109f", + "33d6bf95 33d6bf95 -> 3f800000", + "33d6bf95 b3d6bf95 -> bf800000", + "33d6bf95 42c80000 -> 3089705f", + "33d6bf95 c2c80000 -> b089705f", + "33d6bf95 461c4000 -> 2d2febff", + "33d6bf95 3e99999a -> 34b2f4fc", + "33d6bf95 3f333333 -> 34196446", + "b3d6bf95 00000000 -> 00000000", + "b3d6bf95 3f800000 -> b3d6bf95", + "b3d6bf95 bf800000 -> 33d6bf95", + "b3d6bf95 3f000000 -> b456bf95", + "b3d6bf95 bf000000 -> 3456bf95", + "b3d6bf95 40000000 -> b356bf95", + "b3d6bf95 c0000000 -> 3356bf95", + "b3d6bf95 40400000 -> b30f2a63", + "b3d6bf95 c0300000 -> 331c2e3e", + "b3d6bf95 3dcccccd -> b58637bd", + "b3d6bf95 bdcccccd -> 358637bd", + "b3d6bf95 40f00000 -> b265109f", + "b3d6bf95 c0f00000 -> 3265109f", + "b3d6bf95 33d6bf95 -> bf800000", + "b3d6bf95 b3d6bf95 -> 3f800000", + "b3d6bf95 42c80000 -> b089705f", + "b3d6bf95 c2c80000 -> 3089705f", + "b3d6bf95 461c4000 -> ad2febff", + "b3d6bf95 3e99999a -> b4b2f4fc", + "b3d6bf95 3f333333 -> b4196446", + "42c80000 00000000 -> 00000000", + "42c80000 3f800000 -> 42c80000", + "42c80000 bf800000 -> c2c80000", + "42c80000 3f000000 -> 43480000", + "42c80000 bf000000 -> c3480000", + "42c80000 40000000 -> 42480000", + "42c80000 c0000000 -> c2480000", + "42c80000 40400000 -> 42055555", + "42c80000 c0300000 -> c211745d", + "42c80000 3dcccccd -> 447a0000", + "42c80000 bdcccccd -> c47a0000", + "42c80000 40f00000 -> 41555555", + "42c80000 c0f00000 -> c1555555", + "42c80000 33d6bf95 -> 4e6e6b28", + "42c80000 b3d6bf95 -> ce6e6b28", + "42c80000 42c80000 -> 3f800000", + "42c80000 c2c80000 -> bf800000", + "42c80000 461c4000 -> 3c23d70a", + "42c80000 3e99999a -> 43a6aaaa", + "42c80000 3f333333 -> 430edb6e", + "c2c80000 00000000 -> 00000000", + "c2c80000 3f800000 -> c2c80000", + "c2c80000 bf800000 -> 42c80000", + "c2c80000 3f000000 -> c3480000", + "c2c80000 bf000000 -> 43480000", + "c2c80000 40000000 -> c2480000", + "c2c80000 c0000000 -> 42480000", + "c2c80000 40400000 -> c2055555", + "c2c80000 c0300000 -> 4211745d", + "c2c80000 3dcccccd -> c47a0000", + "c2c80000 bdcccccd -> 447a0000", + "c2c80000 40f00000 -> c1555555", + "c2c80000 c0f00000 -> 41555555", + "c2c80000 33d6bf95 -> ce6e6b28", + "c2c80000 b3d6bf95 -> 4e6e6b28", + "c2c80000 42c80000 -> bf800000", + "c2c80000 c2c80000 -> 3f800000", + "c2c80000 461c4000 -> bc23d70a", + "c2c80000 3e99999a -> c3a6aaaa", + "c2c80000 3f333333 -> c30edb6e", + "461c4000 00000000 -> 00000000", + "461c4000 3f800000 -> 461c4000", + "461c4000 bf800000 -> c61c4000", + "461c4000 3f000000 -> 469c4000", + "461c4000 bf000000 -> c69c4000", + "461c4000 40000000 -> 459c4000", + "461c4000 c0000000 -> c59c4000", + "461c4000 40400000 -> 45505555", + "461c4000 c0300000 -> c56345d1", + "461c4000 3dcccccd -> 47c35000", + "461c4000 bdcccccd -> c7c35000", + "461c4000 40f00000 -> 44a6aaab", + "461c4000 c0f00000 -> c4a6aaab", + "461c4000 33d6bf95 -> 51ba43b7", + "461c4000 b3d6bf95 -> d1ba43b7", + "461c4000 42c80000 -> 42c80000", + "461c4000 c2c80000 -> c2c80000", + "461c4000 461c4000 -> 3f800000", + "461c4000 3e99999a -> 47023555", + "461c4000 3f333333 -> 465f36dc", + "3e99999a 00000000 -> 00000000", + "3e99999a 3f800000 -> 3e99999a", + "3e99999a bf800000 -> be99999a", + "3e99999a 3f000000 -> 3f19999a", + "3e99999a bf000000 -> bf19999a", + "3e99999a 40000000 -> 3e19999a", + "3e99999a c0000000 -> be19999a", + "3e99999a 40400000 -> 3dcccccd", + "3e99999a c0300000 -> bddf6b0f", + "3e99999a 3dcccccd -> 40400000", + "3e99999a bdcccccd -> c0400000", + "3e99999a 40f00000 -> 3d23d70b", + "3e99999a c0f00000 -> bd23d70b", + "3e99999a 33d6bf95 -> 4a371b00", + "3e99999a b3d6bf95 -> ca371b00", + "3e99999a 42c80000 -> 3b449ba6", + "3e99999a c2c80000 -> bb449ba6", + "3e99999a 461c4000 -> 37fba883", + "3e99999a 3e99999a -> 3f800000", + "3e99999a 3f333333 -> 3edb6db8", + "3f333333 00000000 -> 00000000", + "3f333333 3f800000 -> 3f333333", + "3f333333 bf800000 -> bf333333", + "3f333333 3f000000 -> 3fb33333", + "3f333333 bf000000 -> bfb33333", + "3f333333 40000000 -> 3eb33333", + "3f333333 c0000000 -> beb33333", + "3f333333 40400000 -> 3e6eeeef", + "3f333333 c0300000 -> be8253c8", + "3f333333 3dcccccd -> 40e00000", + "3f333333 bdcccccd -> c0e00000", + "3f333333 40f00000 -> 3dbf258c", + "3f333333 c0f00000 -> bdbf258c", + "3f333333 33d6bf95 -> 4ad59f80", + "3f333333 b3d6bf95 -> cad59f80", + "3f333333 42c80000 -> 3be56041", + "3f333333 c2c80000 -> bbe56041", + "3f333333 461c4000 -> 3892ccf7", + "3f333333 3e99999a -> 40155555", + "3f333333 3f333333 -> 3f800000", + "4111d819 c0e207c6 -> bfa52e89", + "c0d48795 408d016f -> bfc0ed52", + "bfeec0e1 c157c6d7 -> 3e0da142", + "c198efd8 410a6d58 -> c00d6ab4", + "c14be820 4154b870 -> bf7564a0", + "400241bb c0b1f46a -> bebb621a", + "bdc7141f c079768a -> 3ccc4b97", + "bf8785ec c0c8bb53 -> 3e2cd656", + "40fa6a79 bfbd750a -> c0a92f41", + "c0b2e7fe 41953723 -> be99782b", + "c08d5c12 c18f856e -> 3e7c24f8", + "bf440ce9 416e8cb6 -> bd526452", + "c0acb83c 415e6749 -> bec6cf98", + "c0f3c10b 402ca999 -> c034b3cf", + "c0d21f1f 3fd0fd34 -> c080b191", + "c09ace1a 41902a2f -> be89727e", + "c0af66a6 418977a1 -> bea3523a", + "c179aefd c130e1ae -> 3fb4aeda", + "c0759fc7 c1428cdb -> 3ea19a5b", + "c1589345 c19da76b -> 3f2fd6a6", + "c0924ed2 c16fa2e3 -> 3e9c4c73", + "c1930544 c0bef6d7 -> 40451736", + "c19a676a 4178fda9 -> bf9ec01e", + "c0918ed7 c131000a -> 3ed2863b", + "40ca56e6 3fbce526 -> 40891c37", + "3fc6800e c175d027 -> bdceb9f5", + "41132632 4115911f -> 3f7bdca4", + "411ae564 c07e5d8e -> c01be434", + "40434b56 c17f80d4 -> be43ac8a", + "411370ba 4118bd3f -> 3f771e65", + "40f02d1d 410265f3 -> 3f6bc24d", + "c10d697e 413031ed -> bf4d766f", + "c1974fe5 c159ee16 -> 3fb1bea1", + "40ef0107 419f1641 -> 3ec04cf5", + "4061be4b c004a030 -> bfd9deae", + "41123baf c103dadb -> bf8df537", + "416de17d 41815748 -> 3f6b6a22", + "4192ae5f c1424a0b -> bfc1453e", + "c1530759 bff02a90 -> 40e0f103", + "c10cecbc c0ec823f -> 3f9889e6", + "41934280 418ac06b -> 3f87d94e", + "c13bc0fd 4187f93d -> bf30be6c", + "4144d195 c129e172 -> bf944c09", + "c16ad898 41529e24 -> bf8eb974", + "c09b39a0 40333b80 -> bfddb5c4", + "c0df95d4 c07cffd3 -> 3fe23cb2", + "409c8ab2 41613fb0 -> 3eb1e9bd", + "c023f58a bf8d41f1 -> 40149228", + "c1613ed7 c15f9e1c -> 3f80ee8a", + "c1069e47 41934fb5 -> bee9f117", + "c19d3a60 c17eaec5 -> 3f9e0a90", + "41603f58 417df247 -> 3f620f95", + "c0a50829 c0057ddc -> 401e3e23", + "c0f94ee4 40ae583c -> bfb7095b", + "40e3131f 416e5a11 -> 3ef3e34c", + "4130f85e 40487458 -> 4062021e", + "40b791b5 40a116b6 -> 3f91dce2", + "40a29839 c125c914 -> befb12a4", + "c1810991 bebcc829 -> 422efb94", + "40443b7c c1921fdb -> be2be490", + "4143ca3e c116200e -> bfa6ef4e", + "c01ab04c c1572a9c -> 3e380b82", + "c0bce905 40b28f64 -> bf876b60", + "418a13c4 4197f5a4 -> 3f689cef", + "bf8b4f6c c0e0f140 -> 3e1e8b71", + "4177a2aa 41176678 -> 3fd15c73", + "bfc6c2fd 3e28f27b -> c11696a4", + "41416ddc 405623cc -> 40673da3", + "c149338d 4100bc63 -> bfc80d1f", + "c0cb8ae6 418e33d0 -> beb736c0", + "4165836e c19434e3 -> bf4638ac", + "c07da3dd c15d584b -> 3e92acff", + "c11698c4 c1512a7f -> 3f38510d", + "41573d96 c16aff2a -> bf6a7a64", + "40efe026 c1560785 -> bf0f7511", + "3f1ddd68 40e50c78 -> 3db070b3", + "c17dc268 413233d7 -> bfb64575", + "c10ec1e0 40f137e0 -> bf978163", + "c19eba5e c0e87dff -> 402ec701", + "c13fbc8a c183e056 -> 3f3a19c5", + "407a69df c175f55c -> be82518a", + "c0e90acd 411e56a2 -> bf3c63e2", + "c0ee1f1e c197dec0 -> 3ec8b1e5", + "c19c385f 4124900e -> bff305a6", + "c16a5647 c17ffee1 -> 3f6a574e", + "c04e708b c1304cea -> 3e95e1ce", + "3eb16db4 418a7e23 -> 3ca3fc63", + "bfef86f6 c19a3152 -> 3dc6d6bb", + "40fd8224 c1873a4f -> beeff569", + "4146dc2f 414a373c -> 3f7bc077", + "c14bd724 3ef7c212 -> c1d29f10", + "413d5a04 3e97d4d4 -> 421fa190", + "416428e7 418f395a -> 3f4be851", + "419d008b c1346f0c -> bfdec14e", + "c15012a8 41354ba3 -> bf92e7d9", + "40e27f07 41748f2b -> 3eed1789", + "4184e8e8 3eac3bb2 -> 42458d28", + "c1169e4e c03b27b9 -> 404e05f0", + "bf9eb58e 41935007 -> bd89e70a", + "c144634f 40aa4a71 -> c0139db6", + "415d2e3b 418e3a2d -> 3f470e35", + "c19eacbb 410ac9ad -> c0125755", + "be704e45 409c5346 -> bd44c37f", + "4164d4bd c055844c -> c0892e3e", + "c149b94b c185e968 -> 3f40d182", + "c1254664 4144a189 -> bf572d36", + "c18ad472 c166114d -> 3f9a7a71", + "c15be178 c0fe2774 -> 3fdd7a4b", + "c174ee5f 4185cf03 -> bf6a4c75", + "c1425d77 3f1aef3b -> c1a09369", + "3f428b2e c176756f -> bd4a133c", + "40edc9a1 be8f05ea -> c1d4cf7b", + "3e27fb93 c0cb2632 -> bcd3af47", + "c1462f7f c191a180 -> 3f2e312f", + "c15740b0 c06df6eb -> 4067911b", + "c171dc01 4133477f -> bfacae29", + "c189226a 41905bd9 -> bf73304a", + "c12e6dec c16d785b -> 3f3c0a48", + "c121e68b c0f27b93 -> 3faaecff", + "bfed2da1 c0fb21a2 -> 3e71c6bf", + "417f7a17 415e9868 -> 3f92e875", + "c13af576 40e70fd8 -> bfcf2311", + "c188f465 c197f268 -> 3f66bdb9", + "418140dc bf87b0ae -> c173db23", + "418b22e1 410eb0a5 -> 3ff99fca", + "414654d0 403e2d8e -> 40857cd6", + "c13afd58 c180ea0b -> 3f39a9de", + "bffd23d2 41958ffc -> bdd8a50b", + "c116657c c19c5e2f -> 3ef63945", + "c046a327 c11f9cdf -> 3e9f4b9d", + "c0e7f024 416bee3c -> befbaaf6", + "418a1d16 c02ae1d7 -> c0cee8bd", + "c0bf01f4 411abbcf -> bf1e01c2", + "4168a2cc 4149cccf -> 3f938f16", + "40dd53f0 40471600 -> 400e4cda", + "412b6d67 c0172484 -> c0912dc3", + "c09c2ab8 c113b2b2 -> 3f0756e2", + "c17642b9 41420532 -> bfa276d9", + "410e3775 41885e28 -> 3f057d6c", + "3fb7ba47 416c137d -> 3dc73bc8", + "c0dedbfd 4162b58e -> befba719", + "40991ed0 c089fec2 -> bf8e0799", + "402d0c47 4195fd1f -> 3e13adbd", + "c12825d4 c0b60917 -> 3fec782b", + "c18c903b c0e0547b -> 40206857", + "c1852597 c09422a3 -> 40661902", + "c113d578 c13ff4c1 -> 3f45282c", + "419f7074 3f58e210 -> 41bc3218", + "3f8139ea 4187647d -> 3d74573c", + "414b7f23 bf87c131 -> c13fdf54", + "c16dd186 c014e1fe -> 40cc7615", + "4004c985 4137de6b -> 3e38e113", + "c118da74 c12079a4 -> 3f73d758", + "c196952e 40a11777 -> c06f4cb7", + "c005e16d c19398c1 -> 3de835c1", + "414be7bf 41927419 -> 3f323673", + "4132b530 c1210f6e -> bf8e066a", + "c1055457 c138f061 -> 3f388f5d", + "411590ad 40738d2b -> 401d35b6", + "c10bb107 4086531f -> c0051d37", + "c1679904 409aa9fe -> c03fab9b", + "c19924a1 40ba1a4d -> c052a945", + "c051fab5 c15ddbb1 -> 3e724b0a", + "c1040f44 c0d99a9a -> 3f9b5c8a", + "41268d72 c18cf6a1 -> bf173c62", + "c16ebef7 bfeaca34 -> 41022820", + "c0a5ebe5 416a39df -> beb55881", + "c0df5482 402239e6 -> c030365d", + "419c7b31 c00c281f -> c10ee898", + "4115f4d0 41282462 -> 3f644fcb", + "401e9150 c10dc94e -> be8f264b", + "419b85f3 41336703 -> 3fddece8", + "c19f6f14 3faa2ef9 -> c16fd470", + "4143b17d 40f51521 -> 3fcc6923", + "bf2b7ecb c09b3930 -> 3e0d6b09", + "3fc1c763 40a82157 -> 3e9386d4", + "41349935 401ebc4f -> 4091a12f", + "c0e60c1c 417f9395 -> bee66db3", + "411e21bd 415298ba -> 3f40395e", + "415b7c41 403dde8b -> 4093f732", + "41943fd4 c1915d48 -> bf828a53", + "40451cf3 4191ba03 -> 3e2d22bc", + "4181cca1 418a0eb4 -> 3f70afdf", + "418e2b13 40da4030 -> 4026c212", + "3feda3d6 c161478f -> be0705e3", + "40f5f463 c016f693 -> c0508acd", + "4180e0d4 4117110b -> 3fda6636", + "4020a06a c13acc6f -> be5c21e4", + "4148355c 412a97b6 -> 3f9638b4", + "4178fd0e c11f7051 -> bfc7e45a", + "41655f77 c1975533 -> bf4201fa", + "c0a56935 40a93485 -> bf7a4272", + "410b20ae c19a766c -> bee695a2", + "3ef267ea 4037aa6b -> 3e28efe8", + "41804ed4 c19c86d8 -> bf51d919", + "c17dc7ab 41101136 -> bfe17a17", + "4103d628 407fd51a -> 4003ec43", + "414b4936 c181f436 -> bf483abc", + "c1505314 c120d0c4 -> 3fa5d083", + "41981bdf c0e040a7 -> c02da498", + "c1243942 4151a5cd -> bf48886e", + "bfd47938 4161980a -> bdf11c78", + "40ec4a0d c0ab1d1b -> bfb0c104", + "40bd8c8a 414c1142 -> 3eedc96c", + "3ff3ee73 c0079e45 -> bf663a93", + "be55171d 41253c62 -> bca51208", + "414c3650 40a80138 -> 401b95f7", + "c01af0af c03173e5 -> 3f5f85c6", + "4126be87 c1532d9a -> bf4a229a", + "c13cb964 419d8573 -> bf195ae9", + "3e03cd93 40a2e18f -> 3ccf2797", + "c17afb49 400ac375 -> c0e7837d", + "c168e79c 4165388b -> bf820e9f", + "40977585 408c8180 -> 3f89fa72", + "411d7845 c18301ae -> bf19db1d", + "4146e16b c19ae09a -> bf245ded", + "414b375a 417478eb -> 3f54cc6c", + "40df82d3 c148102b -> bf0f007d", + "c162bf30 413ee5e4 -> bf980984", + "3dba861a 415c4364 -> 3bd8c959", + "4167fa9a 40da4d84 -> 400804d5", + "c14cdbd4 40e1f003 -> bfe81dd2", + "c12d00ad c07f43f8 -> 402d801d", + "bf532ceb 4167a6d7 -> bd695f1d", + "bf5a4776 c02c3e8d -> 3ea235ba", + "c13085cc 4169ec1c -> bf412ed5", + "416140d7 3f6b56d6 -> 41750754", + "40bd9859 4140dd40 -> 3efba921", + "c02bb99f bffcc969 -> 3fade86e", + "4186851d 40596c42 -> 409e6341", + "c0035512 c0a60289 -> 3eca8645", + "40d52887 40ffc12c -> 3f555ce4", + "4158c98e 418029be -> 3f5882f3", + "c14f7044 c15b9dc3 -> 3f71ce08", + "c0a723d2 c18951b2 -> 3e9bcc0a", + "c185bb32 419e8407 -> bf57f936", + "bf8bc2f5 40d653b7 -> be26efb1", + "c0f3f539 c137b685 -> 3f29f99a", + "41407d41 40d7222b -> 3fe50de9", + "c1886b2a 4186e1ed -> bf81752c", + "bff610ba c186d241 -> 3de99d9a", + "bfda18b9 c01afc1b -> 3f341f8c", + "c00cce56 c188cb3c -> 3e03c113", + "3ec42977 c15d090a -> bce3312a", + "4114799d 40f188b0 -> 3f9d5e1a", + "3f778368 be0863f6 -> c0e8496a", + "40d3a701 4062d634 -> 3feedd0b", + "c0964758 c0b2b1fb -> 3f574a4e", + "40c05b52 c197f8b4 -> bea203d6", + "c0d299f7 c14be7c9 -> 3f043410", + "411f54b5 c07b59ec -> c0224718", + "417cf255 406c8754 -> 4088e280", + "414faf18 40fb66e1 -> 3fd37b85", + "40b98c3e c0dfc917 -> bf544206", + "3fa60384 40fe1ae1 -> 3e274075", + "c10e63f6 419f7df8 -> bee48ce1", + "41087007 c10add87 -> bf7b8642", + "41827686 c176a01d -> bf876c0c", + "403d570d c131f6ea -> be882e8a", + "bede9311 be053f1f -> 4055cf86", + "416454cc c19824b1 -> bf40190a", + "3f91d47e c1524ebf -> bdb18385", + "411c2a95 412b9381 -> 3f6901fc", + "c083a048 c13a6575 -> 3eb4c712", + "bf4c2552 c11abec1 -> 3da8dcd1", + "bf06d339 3fd13c37 -> bea4f57e", + "419db5ea 418142bf -> 3f9c2c22", + "c109ea69 c191361f -> 3ef32353", + "c0e38797 c14f02d5 -> 3f0cafe9", + "3f5cd7cf 405f4ec1 -> 3e7d2caf", + "419d4b4f 418ef245 -> 3f8cd8fd", + "c15e5647 c19bc3cd -> 3f36b4ae", + "40c1a381 403ec4df -> 4001ecea", + "c198b77d c0b81a20 -> 40545b92", + "41491711 c1257b78 -> bf9b8ae2", + "c187c7b2 c19a7cbe -> 3f610019", + "41639dd5 bf6d5f82 -> c1757a54", + "3f99edd5 c0c4bec4 -> be4849e7", + "c1106886 41810880 -> bf0f4082", + "414ca4ea c117c5fc -> bfac96db", + "c19b0163 410a050b -> c00fc0ac", + "c13e35be 40839e7e -> c038fad1", + "408fcace 415d72e9 -> 3ea63a24", + "414edccb 40eb0f65 -> 3fe14a58", + "3f309aad 4181a80f -> 3d2e5912", + "40a3a2bc 3ee484ab -> 4137508b", + "41597318 c1997141 -> bf3564e4", + "40884e79 c0ae13fc -> bf4873f9", + "3ff30b5d 418e3fc5 -> 3ddab2d9", + "4098efc0 c07f2b48 -> bf996f3e", + "41416390 40aed40d -> 400d96ce", + "c0421159 413772ce -> be8768d9", + "c0d04e39 41670bc7 -> bee6cdb1", + "c141cd5f c1344279 -> 3f899dcc", + "c191a539 4195f708 -> bf78a050", + "40d4adf6 41650692 -> 3eedba88", + "41355af5 c106c92d -> bfac3993", + "41101f14 418eebde -> 3f011323", + "404a6337 41970978 -> 3e2b84af", + "419193fe 419f789a -> 3f69b28d", + "bf57022b c14cace9 -> 3d86764b", + "c1887832 4165d900 -> bf97ff47", + "40487c7e 416940fb -> 3e5c097e", + "3fdb32c2 4005d31d -> 3f51a863", + "414f3c7e 412a4910 -> 3f9bc675", + "3e4cc351 40ac5e5d -> 3d180e4d", + "c115ee6b 4189566e -> bf0bbcca", + "bf50bb50 c1959ec2 -> 3d3291e6", + "414f797b 418089b2 -> 3f4e9b3a", + "416dc090 c0c3833b -> c01ba75f", + "3fd36383 413a583a -> 3e1133e8", + "bfdceef2 4010fdb2 -> bf430aff", + "4148138e 405cfeb5 -> 4067c49b", + "c1273a8e c04ba3a8 -> 40523a36", + "c1843fe3 41051c6f -> bffe57d8", + "c1468d99 3fb4cff2 -> c10c8f1c", + "c0d65ce7 3f88ac1d -> c0c8c2c7", + "bc890173 c12c055e -> 3acbe3fb", + "419ea78b 3f3aa0fd -> 41d9a09a", + "c1883d61 c18a6111 -> 3f7c0ac9", + "419eb554 414d9dc8 -> 3fc59907", + "c149743c c1351393 -> 3f8e6792", + "4085a200 41309085 -> 3ec1c0e7", + "c10fa554 c0a59c37 -> 3fde0c27", + "c19b74df c11e3cf7 -> 3ffb7ff7", + "c18acf58 40881c82 -> c08289ab", + "c1936110 c0d35df2 -> 40328012", + "412768ca 41968302 -> 3f0e5ec8", + "be140dbb 417aad99 -> bc173262", + "408b86c8 40b729b5 -> 3f4302d0", + "c14cc964 c1470f25 -> 3f83aed5", + "c08ff112 40729e41 -> bf97e183", + "412f32ef 418ec351 -> 3f1d14f3", + "40327907 c0f7cf3a -> beb85f20", + "41817da2 bf2a73ad -> c1c27b1d", + "c1564acd 3fb33dd1 -> c11907cb", + "41539591 410ea4b2 -> 3fbddd17", + "c01e9f75 c103a751 -> 3e9a388a", + "c0b521d0 c1613e46 -> 3ecddd91", + "3f60267a c12f2f1b -> bda3c719", + "c1839833 c1982b95 -> 3f5d628b", + "3fbdc4e8 4100407d -> 3e3d657c", + "41833b37 c1016838 -> c001cdeb", + "c100202b c10c8e05 -> 3f695cb9", + "bf14ff41 bee12b9a -> 3fa965b8", + "c0bc4ed1 c19b57e6 -> 3e9b2982", + "40e09688 410d5f5b -> 3f4b5819", + "411f42cc 41111c8d -> 3f8c7b1d", + "c10e734e c1540f13 -> 3f2bf7c3", + "413c8dcc c11beffe -> bf9ac5de", + "c1319d5d 40e03dac -> bfcac529", + "c1908d9f c141bb19 -> 3fbf0401", + "418c5ef6 c0e24138 -> c01ed341", + "c132cf92 416dc608 -> bf40847b", + "c129cb16 41605b94 -> bf41bd76", + "40de68c8 3f8bcd88 -> 40cba1e5", + "c159cbd4 41779415 -> bf613467", + "c01a60b8 4121df1c -> be742610", + "41628a35 c199eff0 -> bf3c5ea0", + "c132dad5 406a4ae1 -> c0436d0b", + "41809e79 c114c6e6 -> bfdd5079", + "41361aff 400c89ac -> 40a5dbfb", + "40d25be4 c134597a -> bf154c76", + "c0e6216f 4023fe49 -> c0339f18", + "419f6359 4094d52a -> 408913f3", + "c1863360 c17a76b3 -> 3f892ac7", + "c1762355 c0f6b9ae -> 3fff6400", + "3ff0eb60 c170cabb -> be00115a", + "c15d9a67 c13e191d -> 3f9536a7", + "bfd0a581 c182a5e6 -> 3dcc6ae4", + "c10ffb36 40f97bb8 -> bf93be02", + "4079ac21 bf7d3a15 -> c07c6815", + "4111207b 4098704a -> 3ff3b88d", + "40eeccd2 3efeee39 -> 416fcd46", + "c1716956 409863c5 -> c04ac622", + "40c690f7 bfb5efff -> c08bb2f1", + "c14c9cc4 c197bfbb -> 3f2c9718", + "40b4634a 4199a6d6 -> 3e9645cb", + "c15e6d6d c1982fab -> 3f3b1401", + "bcdfc779 c187d33a -> 3ad2e30c", + "c13a0e8c 4098b36d -> c01bf5d5", + "416083bf c11d493c -> bfb6b5fb", + "40cf08f1 c132a6a6 -> bf145629", + "418d0323 c13e661b -> bfbd98f3", + "4177d493 c182fcd7 -> bf722d7d", + "419956a3 4121b2e2 -> 3ff2c395", + "c0c779ba 412a56ef -> bf15e4d6", + "41820ff7 c151c83d -> bf9eb783", + "c07a3e38 4178ed15 -> be80ad5c", + "c155c035 4192bffe -> bf3a70b5", + "c0a3af89 40ab6b5b -> bf74734f", + "41952d05 c1273c5e -> bfe45ab5", + "412ee850 40cb7b3e -> 3fdc0d16", + "41594682 c07ca883 -> c05c2631", + "c192ba77 c14d6bb7 -> 3fb6db32", + "40d24579 3fb8c3d3 -> 4091ab8f", + "c1981b51 c1168a9a -> 400154b7", + "c058878c 3f777c19 -> c05ffaca", + "40fc652e c0cb7ce4 -> bf9ec3a4", + "4027fd8e 41831813 -> 3e24068d", + "409a0f9a c12ac816 -> bee6ef98", + "41393c30 419a1447 -> 3f19e1ec", + "40919f55 c1025c78 -> bf0efc19", + "c19bbf43 c1787b66 -> 3fa07597", + "41923d26 415523ff -> 3fafa533", + "3f5e8bbc 40fa01bf -> 3de3e177", + "4141e1d8 3f253ff2 -> 41962da1", + "c192425d 417c10f4 -> bf948ab2", + "40ea96ea c11fdc8e -> bf3bd58b", + "3fb0b615 40c7fc7d -> 3e6234b8", + "c121f72e c102f6d3 -> 3f9e4cbb", + "c0afae23 c09bc128 -> 3f906004", + "c04d1002 c0c66591 -> 3f044cf3", + "4076f534 c136df4c -> beacdb2f", + "414ebd72 40ed9d65 -> 3fdebc7e", + "c1445777 414b0aa3 -> bf778d78", + "40b2def1 c009b1d1 -> c02646f6", + "c198423d 40b8c620 -> c052f373", + "c195abd8 413d2da2 -> bfca89cf", + "4112a9d4 c1434f36 -> bf403cd8", + "4193baff 40ebb25b -> 402074c9", + "c1129d31 c0ec51fa -> 3f9ed2cd", + "c19b58cf bfa82ab7 -> 416c7bf6", + "3f2b0da1 40015955 -> 3ea944f5", + "c105702b c15fb627 -> 3f18b288", + "c0f049f9 c13332c4 -> 3f2ba2f8", + "4175c767 40eb0497 -> 4005dc61", + "c0aa2942 417ca8c6 -> beac693d", + "3ef38f5e c0431788 -> be1fcccb", + "41920c47 412e67b9 -> 3fd66040", + "40df0d24 c100c5da -> bf5db670", + "4162df88 bff2b7b7 -> c0ef49d9", + "c1639796 c1923071 -> 3f474649", + "3edbd3e2 414dbc30 -> 3d08c490", + "c12bb536 411bfbca -> bf8ce742", + "3d5a8b43 c1620b47 -> bb77818a", + "40e51882 41501506 -> 3f0ced25", + "c156ac00 c1475861 -> 3f89d75e", + "414e0faf c19dfa1e -> bf26f5c2", + "4142f8fb c13ba776 -> bf84fdf0", + "40afc332 4186f498 -> 3ea6b432", + "c12e697d 414079aa -> bf67f9a8", + "4195848e c1663d1f -> bfa63f4a", + "41447077 c1826315 -> bf40d7d1", + "c1700773 c120d89d -> 3fbf035c", + "40195cbb 4198bcfa -> 3e0085e1", + "4183b24f c119a2bc -> bfdb7177", + "bfc71be1 c0d02bbc -> 3e74db23", + "c12c0c03 c0c89320 -> 3fdb96cd", + "bf137ce5 c030ae49 -> 3e55b380", + "405b5c4f c19c3856 -> be33bc10", + "c0ee5d80 c0c82fb4 -> 3f986968", + "c18444b8 c09032a4 -> 406ad241", + "4112dc73 40f3f29a -> 3f9a1deb", + "4195876e 411b505e -> 3ff67702", + "41836115 c049d3b0 -> c0a6a4a9", + "c1607f17 4138d7fb -> bf9b7569", + "c0d87f73 4178ef71 -> bedea458", + "c125dd8e c194a8ef -> 3f0ed07e", + "c164a3a4 40613418 -> c081f3ea", + "c146e514 4095d784 -> c029e719", + "c169ccfd bfce3f1a -> 411119c2", + "40e4a9d8 419c9422 -> 3ebaed8d", + "4056cd12 4148317d -> 3e895705", + "416d2d85 c0dfdebd -> c0079bdd", + "416fe5dd 414a2525 -> 3f97e7c8", + "41067177 41138b04 -> 3f69454c", + "4197fa2d 418ff827 -> 3f871ea2", + "4182e0fd 413f5a5d -> 3faf185f", + "40cd8def c0f4d43e -> bf56eef0", + "c1941456 40e9d544 -> c0221df9", + "c1669201 c0d43cd0 -> 400b0e74", + "40a5bfc4 4141955f -> 3edb30e8", + "c14307e1 40efa016 -> bfd05bac", + "c1901d4b 419b0489 -> bf6dfe7a", + "c19d1cf5 40ef8837 -> c027ea29", + "c19873fb c16a418e -> 3fa69a9b", + "c1961a2e 3fb19c76 -> c158599a", + "412666e2 419275b8 -> 3f116db5", + "408b5987 c0b1a24b -> bf48d379", + "c191dcea c0fdd6e0 -> 40131ac1", + "c11a2ccf 417fecf2 -> bf1a384a", + "bf134ece 4140765e -> bd43f047", + "419908bf c18316e9 -> bf956d70", + "407ee62a c131c4cf -> beb78960", + "4034b922 c0e253eb -> becc6a9e", + "c11a5d6e c0aa4c43 -> 3fe80c81", + "3f847420 c10d20d6 -> bdf043bc", + "c16edf05 402e9efa -> c0af18ae", + "4102630d 4182f330 -> 3efee638", + "c11c3345 417bc9a0 -> bf1ed042", + "c1899efe be29f6e6 -> 42cf48d4", + "c113726a 419dda04 -> beef203c", + "41406a47 41518647 -> 3f6b1874", + "417c2d94 c176a636 -> bf82de83", + "41305f18 414d52d9 -> 3f5be6ef", + "c14f3c23 bfcee0b5 -> 41003892", + "c08ab20b 40a59b13 -> bf5666a9", + "3f0f1e54 bfddfb1b -> bea50d3e", + "410005aa 41934302 -> 3ede8dc7", + "c16ef95d 41921d39 -> bf51590c", + "c190236e 3f7efc3a -> c190b646", + "41803285 c023f83e -> c0c82660", + "40e2fd76 40ad8fd1 -> 3fa7671f", + "40d7c483 3fbcff2f -> 4092217c", + "c1375e60 c0afe403 -> 40057121", + "3fb11073 3ffe40fd -> 3f3247c0", + "40e8e569 418b1e6b -> 3ed64847", + "41446e27 407b0738 -> 4048521b", + "416e65d2 40b83293 -> 4025a9fe", + "c01e5543 3efb73f3 -> c0a1323c", + "c0ce3007 c13389c1 -> 3f12ffe0", + "417c92f1 c192f4c4 -> bf5bfe7a", + "c07383d1 c18cb3a1 -> 3e5d882a", + "bd8b56e1 bfdaf60c -> 3d22e8df", + "4130172f c15a1d99 -> bf4eacf6", + "4131624a c1665c32 -> bf45209c", + "c0de6cc2 c07770ff -> 3fe61e40", + "4029b93a 417c3e3a -> 3e2c405d", + "c0fd0068 bd01fde2 -> 43792007", + "40646874 4101ebf0 -> 3ee1079b", + "41123472 c17c01ea -> bf14856b", + "4143b6e8 c11881cb -> bfa443a8", + "3fc98494 c11c95d2 -> be24bae3", + "c18e0d1a 412449c3 -> bfdd597b", + "401246e8 c195cbef -> bdf9fc29", + "bfd21bf2 bff8e6b7 -> 3f581a00", + "c132025d 4104ce93 -> bfab90f3", + "4099981e 4132395a -> 3edc9f32", + "c0f36992 419b1742 -> bec8e4ce", + "411b0564 40ca1b95 -> 3fc45b8b", + "c0fb6e1f 41503ee4 -> bf1a8b31", + "c081b419 409254e0 -> bf62e8f9", + "3d29dddf c0534774 -> bc4dd269", + "c093d2c3 c0736301 -> 3f9b7bec", + "4025f454 c18f9a7f -> be13ec1e", + "40b52776 409d803a -> 3f93390d", + "c0fcc1b4 c1891993 -> 3eebfaea", + "41828cab c189c2e5 -> bf72992f", + "bfbf5d42 4188a229 -> bdb345c8", + "4189f4e7 41925067 -> 3f71609a", + "bf36cedc bfc91d10 -> 3ee8b2df", + "c1000c73 c0e62263 -> 3f8e70c5", + "409a1e05 41813127 -> 3e98b1fe", + "419e818c c115923b -> c007a570", + "419f5e04 40a75678 -> 4073ce6f", + "c05eb109 c168601a -> 3e7554e6", + "bf756ce4 4194c684 -> bd532746", + "c116c11e 40db8b4d -> bfafc99a", + "c193449c c18bdadc -> 3f86c8e3", + "4197f8c0 c139c923 -> bfd16817", + "c0277d3f c180334d -> 3e273a39", + "c126cfab c1520c0b -> 3f4b4e25", + "40b748e1 40eb83f3 -> 3f4739f2", + "405e53ce c17e0d07 -> be600878", + "be4205b7 c14e77b6 -> 3c7091ac", + "40831f46 41021578 -> 3f01058c", + "413fe996 412f3741 -> 3f8c3284", + "40ef8c34 c1719290 -> befddaaf", + "3ff0b578 c0c4e490 -> be9c7c1c", + "3d9748c7 c14630c7 -> bbc3696e", + "40890caf c19bdac7 -> be611c94", + "c139262c c089a322 -> 402c2f65", + "c18d849e 414fabc0 -> bfae73bb", + "c19d8a9e c19c9032 -> 3f80ccbc", + "4197bdf4 3e72d88c -> 429ff61a", + "40d00f58 412c7863 -> 3f1a69c3", + "417e11c2 c18bbcd2 -> bf68ba6d", + "40c9a843 415ec801 -> 3ee7b9ea", + "c0baf496 40f2b5e6 -> bf453129", + "3f80949c 41644aee -> 3d902f9d", + "41960da2 c10bb41a -> c0097b92", + "bf7c1e51 415e377f -> bd913949", + "bf9f0774 c16f69d7 -> 3daa0bf1", + "c198ff82 c19c171b -> 3f7aedb8", + "4048e3e8 bfafc35e -> c0124c84", + "c12297a7 40b37453 -> bfe7f211", + "40ade13d c19d5475 -> be8d76f3", + "406b230e c1159937 -> bec9304f", + "c0eada9f 40329e62 -> c0284c7e", + "c17aa47a c15dbb3d -> 3f90b08d", + "c154e0eb 41991043 -> bf320546", + "40b16383 c128fa8d -> bf065eda", + "410aa431 3ec9b3d1 -> 41aff691", + "40b98a2e 40c17f22 -> 3f757912", + "419c6d87 3ffff98d -> 411c7178", + "416e6917 4162870a -> 3f86b6eb", + "c0783952 c13ed7f4 -> 3ea67c41", + "bf92f130 4155e5a8 -> bdafdda6", + "bf6c80c7 41316e95 -> bdaa9d34", + "410eb9a3 41921b93 -> 3efa12c3", + "40a61bc9 bfa7310e -> c07e5774", + "415d0db4 40ab4730 -> 402532c6", + "c10786db c1277b17 -> 3f4f283d", + "c13a7ca9 410af876 -> bfabc3f0", + "41149ce4 413be7f6 -> 3f4a77b3", + "40eb42fa 41336374 -> 3f27de11", + "410cfb85 c142bfad -> bf3952d2", + "409a0f55 4140d960 -> 3ecc823d", + "40c1871f c119b1c9 -> bf212c8e", + "414441a6 40ba086e -> 400708c7", + "4187d023 41913993 -> 3f6f68af", + "c1278ed1 c1020e63 -> 3fa4e8a5", + "c135c3fc c17863d1 -> 3f3b559e", + "40d3c4f3 c09bc95e -> bfadff5b", + "405dc3a2 bfdd6772 -> c000354c", + "4138a962 c1998c34 -> bf19efe9", + "416b7078 c168ebe0 -> bf81623b", + "4080fe5c 413201bd -> 3eb98305", + "c0652bd9 3f9ae3ee -> c03d6296", + "c00408ac 419e0946 -> bdd5e118", + "c1259335 419c6821 -> bf0780cd", + "c0a66ba2 c07bcc62 -> 3fa9328a", + "c11f4dbd c145973d -> 3f4e651c", + "c09c0478 c13db0a5 -> 3ed28e78", + "41994c00 40c9f1af -> 404254be", + "41981617 bf58465e -> c1b40576", + "c17edee8 4195c186 -> bf59d818", + "403a84d4 c18e8ba9 -> be277c79", + "40d9a8a4 c0c45b89 -> bf8de2ba", + "c0cbe7d1 4198b2c5 -> beaaecb7", + "418bcda1 c11d8278 -> bfe338ca", + "40ecaf43 bfabefd4 -> c0b033bd", + "411641ff 3fa1024e -> 40eee7e7" + ] + }, + { + "function": "cycles_power", + "node": "ShaderNodeMath POWER", + "cases": [ + "00000000 00000000 -> 3f800000", + "00000000 3f800000 -> 00000000", + "00000000 bf800000 -> 00000000", + "00000000 3f000000 -> 00000000", + "00000000 bf000000 -> 00000000", + "00000000 40000000 -> 00000000", + "00000000 c0000000 -> 00000000", + "00000000 40400000 -> 00000000", + "00000000 c0300000 -> 00000000", + "00000000 3dcccccd -> 00000000", + "00000000 bdcccccd -> 00000000", + "00000000 40f00000 -> 00000000", + "00000000 c0f00000 -> 00000000", + "00000000 33d6bf95 -> 00000000", + "00000000 b3d6bf95 -> 00000000", + "00000000 42c80000 -> 00000000", + "00000000 c2c80000 -> 00000000", + "00000000 461c4000 -> 00000000", + "00000000 3e99999a -> 00000000", + "00000000 3f333333 -> 00000000", + "3f800000 00000000 -> 3f800000", + "3f800000 3f800000 -> 3f800000", + "3f800000 bf800000 -> 3f800000", + "3f800000 3f000000 -> 3f800000", + "3f800000 bf000000 -> 3f800000", + "3f800000 40000000 -> 3f800000", + "3f800000 c0000000 -> 3f800000", + "3f800000 40400000 -> 3f800000", + "3f800000 c0300000 -> 3f800000", + "3f800000 3dcccccd -> 3f800000", + "3f800000 bdcccccd -> 3f800000", + "3f800000 40f00000 -> 3f800000", + "3f800000 c0f00000 -> 3f800000", + "3f800000 33d6bf95 -> 3f800000", + "3f800000 b3d6bf95 -> 3f800000", + "3f800000 42c80000 -> 3f800000", + "3f800000 c2c80000 -> 3f800000", + "3f800000 461c4000 -> 3f800000", + "3f800000 3e99999a -> 3f800000", + "3f800000 3f333333 -> 3f800000", + "bf800000 00000000 -> 3f800000", + "bf800000 3f800000 -> bf800000", + "bf800000 bf800000 -> bf800000", + "bf800000 3f000000 -> 00000000", + "bf800000 bf000000 -> 00000000", + "bf800000 40000000 -> 3f800000", + "bf800000 c0000000 -> 3f800000", + "bf800000 40400000 -> bf800000", + "bf800000 c0300000 -> 00000000", + "bf800000 3dcccccd -> 00000000", + "bf800000 bdcccccd -> 00000000", + "bf800000 40f00000 -> 00000000", + "bf800000 c0f00000 -> 00000000", + "bf800000 33d6bf95 -> 00000000", + "bf800000 b3d6bf95 -> 00000000", + "bf800000 42c80000 -> 3f800000", + "bf800000 c2c80000 -> 3f800000", + "bf800000 461c4000 -> 3f800000", + "bf800000 3e99999a -> 00000000", + "bf800000 3f333333 -> 00000000", + "3f000000 00000000 -> 3f800000", + "3f000000 3f800000 -> 3f000000", + "3f000000 bf800000 -> 40000000", + "3f000000 3f000000 -> 3f3504f3", + "3f000000 bf000000 -> 3fb504f3", + "3f000000 40000000 -> 3e800000", + "3f000000 c0000000 -> 40800000", + "3f000000 40400000 -> 3e000000", + "3f000000 c0300000 -> 40d744fd", + "3f000000 3dcccccd -> 3f6edb40", + "3f000000 bdcccccd -> 3f892fdf", + "3f000000 40f00000 -> 3bb504f3", + "3f000000 c0f00000 -> 433504f3", + "3f000000 33d6bf95 -> 3f7fffff", + "3f000000 b3d6bf95 -> 3f800001", + "3f000000 42c80000 -> 0d800000", + "3f000000 c2c80000 -> 71800000", + "3f000000 461c4000 -> 00000000", + "3f000000 3e99999a -> 3f4fefc6", + "3f000000 3f333333 -> 3f1d9624", + "bf000000 00000000 -> 3f800000", + "bf000000 3f800000 -> bf000000", + "bf000000 bf800000 -> c0000000", + "bf000000 3f000000 -> 00000000", + "bf000000 bf000000 -> 00000000", + "bf000000 40000000 -> 3e800000", + "bf000000 c0000000 -> 40800000", + "bf000000 40400000 -> be000000", + "bf000000 c0300000 -> 00000000", + "bf000000 3dcccccd -> 00000000", + "bf000000 bdcccccd -> 00000000", + "bf000000 40f00000 -> 00000000", + "bf000000 c0f00000 -> 00000000", + "bf000000 33d6bf95 -> 00000000", + "bf000000 b3d6bf95 -> 00000000", + "bf000000 42c80000 -> 0d800000", + "bf000000 c2c80000 -> 71800000", + "bf000000 461c4000 -> 00000000", + "bf000000 3e99999a -> 00000000", + "bf000000 3f333333 -> 00000000", + "40000000 00000000 -> 3f800000", + "40000000 3f800000 -> 40000000", + "40000000 bf800000 -> 3f000000", + "40000000 3f000000 -> 3fb504f3", + "40000000 bf000000 -> 3f3504f3", + "40000000 40000000 -> 40800000", + "40000000 c0000000 -> 3e800000", + "40000000 40400000 -> 41000000", + "40000000 c0300000 -> 3e1837f0", + "40000000 3dcccccd -> 3f892fdf", + "40000000 bdcccccd -> 3f6edb40", + "40000000 40f00000 -> 433504f3", + "40000000 c0f00000 -> 3bb504f3", + "40000000 33d6bf95 -> 3f800001", + "40000000 b3d6bf95 -> 3f7fffff", + "40000000 42c80000 -> 71800000", + "40000000 c2c80000 -> 0d800000", + "40000000 461c4000 -> 00000000", + "40000000 3e99999a -> 3f9d9624", + "40000000 3f333333 -> 3fcfefc6", + "c0000000 00000000 -> 3f800000", + "c0000000 3f800000 -> c0000000", + "c0000000 bf800000 -> bf000000", + "c0000000 3f000000 -> 00000000", + "c0000000 bf000000 -> 00000000", + "c0000000 40000000 -> 40800000", + "c0000000 c0000000 -> 3e800000", + "c0000000 40400000 -> c1000000", + "c0000000 c0300000 -> 00000000", + "c0000000 3dcccccd -> 00000000", + "c0000000 bdcccccd -> 00000000", + "c0000000 40f00000 -> 00000000", + "c0000000 c0f00000 -> 00000000", + "c0000000 33d6bf95 -> 00000000", + "c0000000 b3d6bf95 -> 00000000", + "c0000000 42c80000 -> 71800000", + "c0000000 c2c80000 -> 0d800000", + "c0000000 461c4000 -> 00000000", + "c0000000 3e99999a -> 00000000", + "c0000000 3f333333 -> 00000000", + "40400000 00000000 -> 3f800000", + "40400000 3f800000 -> 40400000", + "40400000 bf800000 -> 3eaaaaab", + "40400000 3f000000 -> 3fddb3d7", + "40400000 bf000000 -> 3f13cd3a", + "40400000 40000000 -> 41100000", + "40400000 c0000000 -> 3de38e39", + "40400000 40400000 -> 41d80000", + "40400000 c0300000 -> 3d47a73f", + "40400000 3dcccccd -> 3f8edd20", + "40400000 bdcccccd -> 3f655d89", + "40400000 40f00000 -> 456cbfec", + "40400000 c0f00000 -> 398a6864", + "40400000 33d6bf95 -> 3f800001", + "40400000 b3d6bf95 -> 3f7ffffe", + "40400000 42c80000 -> 00000000", + "40400000 c2c80000 -> 00000000", + "40400000 461c4000 -> 00000000", + "40400000 3e99999a -> 3fb1f846", + "40400000 3f333333 -> 400a1741", + "c0300000 00000000 -> 3f800000", + "c0300000 3f800000 -> c0300000", + "c0300000 bf800000 -> beba2e8c", + "c0300000 3f000000 -> 00000000", + "c0300000 bf000000 -> 00000000", + "c0300000 40000000 -> 40f20000", + "c0300000 c0000000 -> 3e0767ab", + "c0300000 40400000 -> c1a66000", + "c0300000 c0300000 -> 00000000", + "c0300000 3dcccccd -> 00000000", + "c0300000 bdcccccd -> 00000000", + "c0300000 40f00000 -> 00000000", + "c0300000 c0f00000 -> 00000000", + "c0300000 33d6bf95 -> 00000000", + "c0300000 b3d6bf95 -> 00000000", + "c0300000 42c80000 -> 00000000", + "c0300000 c2c80000 -> 00000008", + "c0300000 461c4000 -> 00000000", + "c0300000 3e99999a -> 00000000", + "c0300000 3f333333 -> 00000000", + "3dcccccd 00000000 -> 3f800000", + "3dcccccd 3f800000 -> 3dcccccd", + "3dcccccd bf800000 -> 41200000", + "3dcccccd 3f000000 -> 3ea1e89b", + "3dcccccd bf000000 -> 404a62c2", + "3dcccccd 40000000 -> 3c23d70b", + "3dcccccd c0000000 -> 42c80000", + "3dcccccd 40400000 -> 3a83126f", + "3dcccccd c0300000 -> 440c95d8", + "3dcccccd 3dcccccd -> 3f4b5918", + "3dcccccd bdcccccd -> 3fa12478", + "3dcccccd 40f00000 -> 3307d19d", + "3dcccccd c0f00000 -> 4bf1433b", + "3dcccccd 33d6bf95 -> 3f7ffffc", + "3dcccccd b3d6bf95 -> 3f800002", + "3dcccccd 42c80000 -> 00000000", + "3dcccccd c2c80000 -> 00000000", + "3dcccccd 461c4000 -> 00000000", + "3dcccccd 3e99999a -> 3f004dce", + "3dcccccd 3f333333 -> 3e4c509b", + "bdcccccd 00000000 -> 3f800000", + "bdcccccd 3f800000 -> bdcccccd", + "bdcccccd bf800000 -> c1200000", + "bdcccccd 3f000000 -> 00000000", + "bdcccccd bf000000 -> 00000000", + "bdcccccd 40000000 -> 3c23d70b", + "bdcccccd c0000000 -> 42c80000", + "bdcccccd 40400000 -> ba83126f", + "bdcccccd c0300000 -> 00000000", + "bdcccccd 3dcccccd -> 00000000", + "bdcccccd bdcccccd -> 00000000", + "bdcccccd 40f00000 -> 00000000", + "bdcccccd c0f00000 -> 00000000", + "bdcccccd 33d6bf95 -> 00000000", + "bdcccccd b3d6bf95 -> 00000000", + "bdcccccd 42c80000 -> 00000000", + "bdcccccd c2c80000 -> 00000000", + "bdcccccd 461c4000 -> 00000000", + "bdcccccd 3e99999a -> 00000000", + "bdcccccd 3f333333 -> 00000000", + "40f00000 00000000 -> 3f800000", + "40f00000 3f800000 -> 40f00000", + "40f00000 bf800000 -> 3e088889", + "40f00000 3f000000 -> 402f456f", + "40f00000 bf000000 -> 3ebaf4ba", + "40f00000 40000000 -> 42610000", + "40f00000 c0000000 -> 3c91a2b4", + "40f00000 40400000 -> 43d2f000", + "40f00000 c0300000 -> 3b8089b9", + "40f00000 3dcccccd -> 3f9c929e", + "40f00000 bdcccccd -> 3f51486f", + "40f00000 40f00000 -> 4a5f1edb", + "40f00000 c0f00000 -> 3492dcc1", + "40f00000 33d6bf95 -> 3f800002", + "40f00000 b3d6bf95 -> 3f7ffffd", + "40f00000 42c80000 -> 00000000", + "40f00000 c2c80000 -> 00000000", + "40f00000 461c4000 -> 00000000", + "40f00000 3e99999a -> 3fea46bc", + "40f00000 3f333333 -> 40832091", + "c0f00000 00000000 -> 3f800000", + "c0f00000 3f800000 -> c0f00000", + "c0f00000 bf800000 -> be088889", + "c0f00000 3f000000 -> 00000000", + "c0f00000 bf000000 -> 00000000", + "c0f00000 40000000 -> 42610000", + "c0f00000 c0000000 -> 3c91a2b4", + "c0f00000 40400000 -> c3d2f000", + "c0f00000 c0300000 -> 00000000", + "c0f00000 3dcccccd -> 00000000", + "c0f00000 bdcccccd -> 00000000", + "c0f00000 40f00000 -> 00000000", + "c0f00000 c0f00000 -> 00000000", + "c0f00000 33d6bf95 -> 00000000", + "c0f00000 b3d6bf95 -> 00000000", + "c0f00000 42c80000 -> 00000000", + "c0f00000 c2c80000 -> 00000000", + "c0f00000 461c4000 -> 00000000", + "c0f00000 3e99999a -> 00000000", + "c0f00000 3f333333 -> 00000000", + "33d6bf95 00000000 -> 3f800000", + "33d6bf95 3f800000 -> 33d6bf95", + "33d6bf95 bf800000 -> 4b189680", + "33d6bf95 3f000000 -> 39a5cb5f", + "33d6bf95 bf000000 -> 4545a471", + "33d6bf95 40000000 -> 283424dc", + "33d6bf95 c0000000 -> 56b5e621", + "33d6bf95 40400000 -> 1c971da1", + "33d6bf95 c0300000 -> 5f76c92c", + "33d6bf95 3dcccccd -> 3e4c509a", + "33d6bf95 bdcccccd -> 40a06142", + "33d6bf95 40f00000 -> 00000000", + "33d6bf95 c0f00000 -> 00000000", + "33d6bf95 33d6bf95 -> 3f7fffe5", + "33d6bf95 b3d6bf95 -> 3f80000e", + "33d6bf95 42c80000 -> 00000000", + "33d6bf95 c2c80000 -> 00000000", + "33d6bf95 461c4000 -> 00000000", + "33d6bf95 3e99999a -> 3c022489", + "33d6bf95 3f333333 -> 37533672", + "b3d6bf95 00000000 -> 3f800000", + "b3d6bf95 3f800000 -> b3d6bf95", + "b3d6bf95 bf800000 -> cb189680", + "b3d6bf95 3f000000 -> 00000000", + "b3d6bf95 bf000000 -> 00000000", + "b3d6bf95 40000000 -> 283424dc", + "b3d6bf95 c0000000 -> 56b5e621", + "b3d6bf95 40400000 -> 9c971da1", + "b3d6bf95 c0300000 -> 00000000", + "b3d6bf95 3dcccccd -> 00000000", + "b3d6bf95 bdcccccd -> 00000000", + "b3d6bf95 40f00000 -> 00000000", + "b3d6bf95 c0f00000 -> 00000000", + "b3d6bf95 33d6bf95 -> 00000000", + "b3d6bf95 b3d6bf95 -> 00000000", + "b3d6bf95 42c80000 -> 00000000", + "b3d6bf95 c2c80000 -> 00000000", + "b3d6bf95 461c4000 -> 00000000", + "b3d6bf95 3e99999a -> 00000000", + "b3d6bf95 3f333333 -> 00000000", + "42c80000 00000000 -> 3f800000", + "42c80000 3f800000 -> 42c80000", + "42c80000 bf800000 -> 3c23d70a", + "42c80000 3f000000 -> 41200000", + "42c80000 bf000000 -> 3dcccccd", + "42c80000 40000000 -> 461c4000", + "42c80000 c0000000 -> 38d1b717", + "42c80000 40400000 -> 49742400", + "42c80000 c0300000 -> 36543784", + "42c80000 3dcccccd -> 3fcaddc8", + "42c80000 bdcccccd -> 3f21866c", + "42c80000 40f00000 -> 58635fa9", + "42c80000 c0f00000 -> 26901d7d", + "42c80000 33d6bf95 -> 3f800004", + "42c80000 b3d6bf95 -> 3f7ffff8", + "42c80000 42c80000 -> 00000000", + "42c80000 c2c80000 -> 00000000", + "42c80000 461c4000 -> 00000000", + "42c80000 3e99999a -> 407ec9e2", + "42c80000 3f333333 -> 41c8f36e", + "c2c80000 00000000 -> 3f800000", + "c2c80000 3f800000 -> c2c80000", + "c2c80000 bf800000 -> bc23d70a", + "c2c80000 3f000000 -> 00000000", + "c2c80000 bf000000 -> 00000000", + "c2c80000 40000000 -> 461c4000", + "c2c80000 c0000000 -> 38d1b717", + "c2c80000 40400000 -> c9742400", + "c2c80000 c0300000 -> 00000000", + "c2c80000 3dcccccd -> 00000000", + "c2c80000 bdcccccd -> 00000000", + "c2c80000 40f00000 -> 00000000", + "c2c80000 c0f00000 -> 00000000", + "c2c80000 33d6bf95 -> 00000000", + "c2c80000 b3d6bf95 -> 00000000", + "c2c80000 42c80000 -> 00000000", + "c2c80000 c2c80000 -> 00000000", + "c2c80000 461c4000 -> 00000000", + "c2c80000 3e99999a -> 00000000", + "c2c80000 3f333333 -> 00000000", + "461c4000 00000000 -> 3f800000", + "461c4000 3f800000 -> 461c4000", + "461c4000 bf800000 -> 38d1b717", + "461c4000 3f000000 -> 42c80000", + "461c4000 bf000000 -> 3c23d70a", + "461c4000 40000000 -> 4cbebc20", + "461c4000 c0000000 -> 322bcc77", + "461c4000 40400000 -> 5368d4a5", + "461c4000 c0300000 -> 2d2febff", + "461c4000 3dcccccd -> 4020c2bf", + "461c4000 bdcccccd -> 3ecbd4b4", + "461c4000 40f00000 -> 7149f2ca", + "461c4000 c0f00000 -> 0da24260", + "461c4000 33d6bf95 -> 3f800008", + "461c4000 b3d6bf95 -> 3f7ffff1", + "461c4000 42c80000 -> 00000000", + "461c4000 c2c80000 -> 00000000", + "461c4000 461c4000 -> 00000000", + "461c4000 3e99999a -> 417d953b", + "461c4000 3f333333 -> 441dbd44", + "3e99999a 00000000 -> 3f800000", + "3e99999a 3f800000 -> 3e99999a", + "3e99999a bf800000 -> 40555555", + "3e99999a 3f000000 -> 3f0c378c", + "3e99999a bf000000 -> 3fe9b1e8", + "3e99999a 40000000 -> 3db851ec", + "3e99999a c0000000 -> 4131c71c", + "3e99999a 40400000 -> 3cdd2f1c", + "3e99999a c0300000 -> 41db48a5", + "3e99999a 3dcccccd -> 3f62f621", + "3e99999a bdcccccd -> 3f90607f", + "3e99999a 40f00000 -> 38fb3622", + "3e99999a c0f00000 -> 4602709e", + "3e99999a 33d6bf95 -> 3f7ffffe", + "3e99999a b3d6bf95 -> 3f800001", + "3e99999a 42c80000 -> 00000000", + "3e99999a c2c80000 -> 00000000", + "3e99999a 461c4000 -> 00000000", + "3e99999a 3e99999a -> 3f326474", + "3e99999a 3f333333 -> 3edc6c05", + "3f333333 00000000 -> 3f800000", + "3f333333 3f800000 -> 3f333333", + "3f333333 bf800000 -> 3fb6db6e", + "3f333333 3f000000 -> 3f562f5a", + "3f333333 bf000000 -> 3f98fd40", + "3f333333 40000000 -> 3efae147", + "3f333333 c0000000 -> 40029cbc", + "3f333333 40400000 -> 3eaf9db2", + "3f333333 c0300000 -> 402aabd7", + "3f333333 3dcccccd -> 3f7707b1", + "3f333333 bdcccccd -> 3f84a5d9", + "3f333333 40f00000 -> 3d8d1cc7", + "3f333333 c0f00000 -> 41683648", + "3f333333 33d6bf95 -> 3f7fffff", + "3f333333 b3d6bf95 -> 3f800000", + "3f333333 42c80000 -> 25ba745e", + "3f333333 c2c80000 -> 592fbe18", + "3f333333 461c4000 -> 00000000", + "3f333333 3e99999a -> 3f6605a2", + "3f333333 3f333333 -> 3f477035", + "402cbbda 40219275 -> 414433ed", + "3f246380 bfd941e4 -> 4007bc14", + "3f8c1ab4 c06bef1b -> 3f3779a5", + "3f6de5ad 3fa8fa9e -> 3f686067", + "befdfecb 4037e395 -> 00000000", + "bf9ca619 401fd0b7 -> 00000000", + "bf87ceb5 bf264e3e -> 00000000", + "c072ba63 3ebe7aa1 -> 00000000", + "3f0f8841 bea4185c -> 3f9a14a7", + "bfd77f0a 40335eda -> 00000000", + "3e926216 3ff76a01 -> 3db612e7", + "3e642932 bfe745b0 -> 417123ca", + "c0510a0a 3ee6b47f -> 00000000", + "c014ec2f bf7cea2f -> 00000000", + "4018f5b2 4077e080 -> 41e9b237", + "be05edee 3fb0f9ad -> 00000000", + "bec34260 3f65c448 -> 00000000", + "3f283d6c 3e5a1aad -> 3f6a1aaa", + "bc833946 c067e731 -> 00000000", + "c038d63e c064c3b8 -> 00000000", + "bc8b382c 4002b263 -> 00000000", + "405e3603 be179739 -> 3f54eb12", + "3fa45f28 bf520e4c -> 3f508143", + "40456668 c064d8d0 -> 3c91f7e0", + "40246513 c01f7625 -> 3dc33650", + "c04a7642 bd9c34f5 -> 00000000", + "bfcd46cd 3fc1f3a2 -> 00000000", + "c05f65df 401c0950 -> 00000000", + "c00efc3f 3f8f7843 -> 00000000", + "bf96e5ab 4001c2c3 -> 00000000", + "c0753e12 c01443f4 -> 00000000", + "c04f2cda 3fc85762 -> 00000000", + "bfb43048 3ed1935c -> 00000000", + "40682b8e 3fdcd7dd -> 4113cbee", + "bdb1e062 c01f5003 -> 00000000", + "405bd240 3f0c8f96 -> 3ffc072b", + "3f611207 402af86d -> 3f357d33", + "bd67c3f8 3fa8da38 -> 00000000", + "bf627f4b bf0e3477 -> 00000000", + "3fe72f7a bf87817d -> 3f08e8d9", + "bf875634 c02cd6dd -> 00000000", + "3ebab286 4018ed94 -> 3db7d432", + "3fb33092 4061ed2e -> 4051dd4c", + "bf3b8f81 4036edf6 -> 00000000", + "c06157a0 c0306673 -> 00000000", + "3f5e1027 bfe39616 -> 3fa4d38d", + "be811267 bfe96103 -> 00000000", + "be63e2b0 3e25bb65 -> 00000000", + "406c487e 3fa43a41 -> 40aafb77", + "3f744a87 c03e6e19 -> 3f9321df", + "c07d87ff bfcb176b -> 00000000", + "bf253733 406d71ea -> 00000000", + "bf75a9a6 3e01f75e -> 00000000", + "400db565 400aa6af -> 40b31323", + "bf379815 c052436a -> 00000000", + "400cd7b9 3fafaaca -> 403cee1f", + "40044ccb bf66b89e -> 3f050bd4", + "40473e06 3f9ad09c -> 407cc1c0", + "40215946 c07c5116 -> 3cd5dfe9", + "bfaf8000 3ea53a07 -> 00000000", + "3e35ded9 3f6d58d5 -> 3e4e46ae", + "bfe6a942 403e7908 -> 00000000", + "4008c2b8 402524c9 -> 40e30ae5", + "bfb3e3a9 bff36d76 -> 00000000", + "bf9457d9 3fe4bb30 -> 00000000", + "3f2a8329 c06db346 -> 4090c074", + "3e40568a 3ffd4ee6 -> 3d15ae01", + "c046e29d 4007300b -> 00000000", + "bf8be9eb 3fd3cee6 -> 00000000", + "4020fcf5 bfb68770 -> 3e8966c6", + "c01031cb c00c8193 -> 00000000", + "bfc24fb3 bffdeab2 -> 00000000", + "c07af8d9 c076e070 -> 00000000", + "bf472a2f 3fcbb9c5 -> 00000000", + "3e6c6a49 be701b53 -> 3fb480da", + "c05994c1 3e10ac8d -> 00000000", + "bfa5deaf bfef5fcb -> 00000000", + "c04790b0 403dc367 -> 00000000", + "4002ee05 403d3e81 -> 4104d589", + "401a993e bfe63177 -> 3e51a3a8", + "400fe2a1 bfb55239 -> 3ea28174", + "bfce6e15 3fa4899f -> 00000000", + "c0136f42 403d64da -> 00000000", + "c07ff42b c0596794 -> 00000000", + "4076e3cd c0690e89 -> 3bf0132a", + "c0749ad1 bf965094 -> 00000000", + "bf668f3a bfcb6b5f -> 00000000", + "c02c10fd bebc8d1e -> 00000000", + "c046d492 3fdcca44 -> 00000000", + "bfbafdaa 4040d552 -> 00000000", + "403494eb c07e56f3 -> 3c84c547", + "bf5c54fd 3facee7b -> 00000000", + "c07ee3af 3f84b71f -> 00000000", + "4071e8f3 c06436e9 -> 3c0ef76c", + "40441a5b bfc84bdb -> 3e318d25", + "bf9ead52 bfd50c2b -> 00000000", + "bf607350 3f6b0493 -> 00000000", + "c04ccb26 40264afa -> 00000000", + "bf66a7b0 c07f7b89 -> 00000000", + "c033b3e3 40795734 -> 00000000", + "3f2e4610 bf959fc5 -> 3fc8a594", + "3faf83f3 407475c3 -> 4055bca5", + "c0333e6f 3fa774d7 -> 00000000", + "400ab0ca c06b1758 -> 3d6f1f44", + "c0182e41 bf909dea -> 00000000", + "bfdfbcf2 3f7b3855 -> 00000000", + "befa60d5 c05bbccf -> 00000000", + "4057a6e9 407d0525 -> 42f3a56e", + "bf5f442b 4065eede -> 00000000", + "c065113e bfd89772 -> 00000000", + "bf0e4c2e c040eeb5 -> 00000000", + "3e258cd9 becb5d67 -> 4003fb04", + "c00ea567 be7a419e -> 00000000", + "bff97720 bf202958 -> 00000000", + "bea264e3 be92c6c2 -> 00000000", + "c003f298 c04d4027 -> 00000000", + "bead11c1 c03fe04c -> 00000000", + "c073f091 3f60ae64 -> 00000000", + "c02bbaf0 3f1bc902 -> 00000000", + "bf9f523a bdeb66a7 -> 00000000", + "4071c905 402ff4f4 -> 421a9054", + "40153749 4043d474 -> 41555136", + "bfeb044e c0534d82 -> 00000000", + "bee7518a bf30721d -> 00000000", + "4066d359 401d58c4 -> 41bb64ab", + "c01d51ff bf7e8df4 -> 00000000", + "3ff4b08f 401ef3c7 -> 409ffa17", + "be9e0b42 40133fc9 -> 00000000", + "bf374c14 be1b02bb -> 00000000", + "c064cc6b be262d2b -> 00000000", + "407745d4 c0709173 -> 3bcbb49a", + "4008a0b3 4072d852 -> 418e2d1a", + "40264e31 3f6cac43 -> 401abcd8", + "3f8272c6 3f30c7fe -> 3f81af8d", + "bffb3e64 40728d37 -> 00000000", + "3f93d76e bfa9f6f4 -> 3f536a17", + "402ad7bf bf58ccaf -> 3edeeb89", + "c02979a5 bfc39794 -> 00000000", + "c04d02ce bfc16971 -> 00000000", + "3dcb22c8 3f79ebd7 -> 3dd697d9", + "bfca63d9 bf605a54 -> 00000000", + "4044e70f bfe152f5 -> 3e0d9edd", + "40225836 40705a10 -> 4203e6b9", + "bfbcd0eb 3f02ce51 -> 00000000", + "bc0cde82 40549a4a -> 00000000", + "40732af9 401ccb8b -> 41d28f37", + "bf1a9316 c0035a71 -> 00000000", + "3fba2ba4 3e7d5cf4 -> 3f8c6e9a", + "bf72b719 3fa962a3 -> 00000000", + "3ff2ba17 4016be3b -> 409073b5", + "3fb74cc1 3f92fe22 -> 3fc154d3", + "c05d2321 c006e677 -> 00000000", + "bffca810 401b6f55 -> 00000000", + "bf1503df 402e5761 -> 00000000", + "c03ca6b8 bfffd515 -> 00000000", + "bfa92146 c026b069 -> 00000000", + "bf7400ba bf9960ac -> 00000000", + "be82e03d c02115ed -> 00000000", + "40530457 3ff555c6 -> 411d7ab6", + "405bd969 bf6234c5 -> 3eac1157", + "bf8a7289 40246e1c -> 00000000", + "3fbd6e9f 3ff76504 -> 4008872d", + "bfcd913c 3e917bb9 -> 00000000", + "c0392058 4026ee5d -> 00000000", + "40193164 bf5dc583 -> 3ef0608f", + "3fb614e8 4004f7b0 -> 40051927", + "bfaa2ebb bfbed6ab -> 00000000", + "c079cd0e bf701390 -> 00000000", + "3ee43e78 40044b24 -> 3e40c2f1", + "c0792661 3f759764 -> 00000000", + "3f6bc772 3e858bc8 -> 3f7a9077", + "3fa8730f 3f202772 -> 3f97fdcc", + "c079cba0 3f02e5db -> 00000000", + "bf9a9718 c0472a6e -> 00000000", + "3f4dbba8 bf560a04 -> 3f99ab26", + "c01c12d9 3e82ad7a -> 00000000", + "40488635 c029d5f5 -> 3d45c5f1", + "bf995c39 3fc307a7 -> 00000000", + "3fb0cbe0 c04144a4 -> 3ec1104a", + "c0073030 c02f8a4b -> 00000000", + "3f904359 c02d1d3b -> 3f393d3b", + "c019b356 3f1ee021 -> 00000000", + "c06220b6 3f4cca1d -> 00000000", + "bfcd56c8 c05d0456 -> 00000000", + "401f0be4 c0692032 -> 3d14b0d2", + "4006db06 bdfe79c5 -> 3f695b3f", + "bf2f7b05 c061fb32 -> 00000000", + "3f89eeee c05d5a1c -> 3f45af98", + "40022813 4062bdd5 -> 4145d889", + "407b3da1 406ba61d -> 4319bd48", + "c055153b 403cc587 -> 00000000", + "3f8cf221 bf1c09d6 -> 3f71663b", + "bf22ee18 3f49476d -> 00000000", + "3e7fbd60 402a2883 -> 3ccce1ef", + "3f2a2905 c041675c -> 405be53d", + "bfb2c87a 3f75d778 -> 00000000", + "c02f33d4 3fcdb1e8 -> 00000000", + "40645689 bf8e5398 -> 3e78ed98", + "4060b975 bfcf1abb -> 3e063132", + "c013f3e8 403f7e8e -> 00000000", + "3fa157b4 c0040a5d -> 3f1ec970", + "c03cf639 40522e94 -> 00000000", + "bfb2603d bf89dca2 -> 00000000", + "bf174c6c 3f1793d4 -> 00000000", + "405b0d32 4058323d -> 427f60fd", + "3f4391fe bf85da08 -> 3fa9a050", + "bfe4203c 3fe02c2f -> 00000000", + "3fc8138e c008db25 -> 3ec4febc", + "c053a5b8 c02677ed -> 00000000", + "bf8dea40 be8830c0 -> 00000000", + "404f94ae bea6d0ce -> 3f2e7b1a", + "bf9faea9 bfae5077 -> 00000000", + "4071a48c 3fd60bc6 -> 4113911e", + "3f792ea5 4056cb49 -> 3f69d3e3", + "3fc5656e 3fd5adc1 -> 4003e5b1", + "4061fef4 be53cf56 -> 3f4532fa", + "3fef7515 bf15596d -> 3f31a45b", + "bfc8fd45 40167558 -> 00000000", + "bf35758e bf80bd9e -> 00000000", + "3ebc09f8 4015e016 -> 3dc42712", + "bf695d36 3fef1dce -> 00000000", + "bfa83331 beffbe43 -> 00000000", + "bfc7aaff 40765028 -> 00000000", + "bfd8a558 bfb3aef9 -> 00000000", + "c0222e10 402320a6 -> 00000000", + "3f406344 3f7184ed -> 3f438592", + "bfc2e21d c0763a8d -> 00000000", + "40604310 3fa32e23 -> 409e453b", + "3f9067ca 3f57a6d0 -> 3f8dafc7", + "400e23fe bff0e4d2 -> 3e641907", + "3f9f22b5 3e41b085 -> 3f8561a8", + "405d0146 3fe2524d -> 410f249c", + "bdef5333 3fa2b21e -> 00000000", + "3da085fc 406224bc -> 3901ce43", + "404a4e6e 4053f974 -> 4234f1d4", + "3e8fbe08 3e8ec346 -> 3f33a4be", + "bfc1be07 c0699279 -> 00000000", + "c0752b95 406f11a1 -> 00000000", + "4021c244 404508c0 -> 418af0ce", + "404b22cb 400d0282 -> 414bd834", + "40625a23 400d2268 -> 4181af1c", + "3f5e5e79 403c8985 -> 3f291084", + "bfc8dc58 bfe4d685 -> 00000000", + "beb23091 c044f262 -> 00000000", + "c0481677 402c7727 -> 00000000", + "3f3773e2 3fb0ce1c -> 3f219073", + "c07e3bca c020c84f -> 00000000", + "c053db78 40355b2e -> 00000000", + "404a30d1 bfcac963 -> 3e2582ef", + "bfe2dde3 bead7324 -> 00000000", + "c04b291d 403435dd -> 00000000", + "3faef442 3fffb630 -> 3feef6d2", + "bfac97c7 bdbea5d5 -> 00000000", + "c03a987e c051ce0f -> 00000000", + "c020ecae c00f6ad3 -> 00000000", + "3f8a3ff1 bfc97a05 -> 3f62c491", + "c000f85d 3e9aad3e -> 00000000", + "c020e006 3fefc908 -> 00000000", + "c052ca97 bf50b9e4 -> 00000000", + "bf36839a bf66e915 -> 00000000", + "c0586a30 3f4d09ee -> 00000000", + "bf2c4b9a 3fc6789b -> 00000000", + "3fbac8a8 400587e1 -> 400cce6e", + "c0079fb4 403addb1 -> 00000000", + "40157eea 40659b05 -> 41a7dab0", + "3fb47ee6 bf9606e7 -> 3f2b1e74", + "403a9f9b c002c692 -> 3de5eea3", + "4021b5d9 400eabc2 -> 40fcaa44", + "c0420a00 3f01d5d5 -> 00000000", + "40622f2d 3fd4cf5f -> 4102858b", + "becf8f92 bf736142 -> 00000000", + "c03593a9 40224332 -> 00000000", + "c01c2e0a 40027f18 -> 00000000", + "404b7c9c 3fa2fbf1 -> 408b9325", + "3f3a82b5 c030be6d -> 4019768c", + "bfc0bbf3 3fe78719 -> 00000000", + "401e79b6 bfd194b0 -> 3e680740", + "c0112d2b bf8c1b8f -> 00000000", + "4052243a bf1dcddb -> 3ef6082c", + "bfc2d6e8 c030bdea -> 00000000", + "3fcf7337 3f96a3b6 -> 3fe1f219", + "bf893a8a 3f8e2a5b -> 00000000", + "3fd64ebc bf903af4 -> 3f0f3aa8", + "3fefaff6 bfbaca17 -> 3eccfa65", + "404da0b8 400dbc9c -> 41543077", + "bff6b30c 40375d3f -> 00000000", + "c047fc23 40139904 -> 00000000", + "406eab57 404adcff -> 4281b088", + "3fbf23b6 c0172d7d -> 3ec6931d", + "3f89499b c075234f -> 3f43c1f3", + "bfbb814b 4061e0bb -> 00000000", + "bfc19dbf c040a3f9 -> 00000000", + "3fd7b45c 404bddfe -> 40a8b41a", + "bfbe744a 3f9a15e1 -> 00000000", + "bf945b90 402a9f00 -> 00000000", + "bfe6a7c9 c07b3a3a -> 00000000", + "3e967c98 c067f289 -> 42a925cc", + "3f1e0eac 405b2c26 -> 3e44628c", + "3f46f779 c0570534 -> 4015416d", + "c034d612 3f9d2ee9 -> 00000000", + "405b17de 405a6a92 -> 4285580b", + "c01ec9aa bfeb7240 -> 00000000", + "c029d62d bfbd6e8e -> 00000000", + "bf5028ab 3fd6f413 -> 00000000", + "c01b6cfd 3feb92c4 -> 00000000", + "c04091fb bfdd4bae -> 00000000", + "bf11d0ae 401cf125 -> 00000000", + "400ee226 c01331d4 -> 3e2177ad", + "40184166 405301bb -> 418b54ee", + "3f28adb5 c0225717 -> 403865c8", + "bfa15698 bff80262 -> 00000000", + "3fcf7996 c014727c -> 3ea702bc", + "c0341240 c04c6758 -> 00000000", + "3f9b1e1c bdb4539c -> 3f7bb484", + "c0679dc8 bfe29f54 -> 00000000", + "4024d799 402b1db1 -> 4148c616", + "c0569d59 bfb69681 -> 00000000", + "bf9ef82b 3f0cc5a6 -> 00000000", + "3ffcf1eb c07d5438 -> 3d8a2b52", + "c02acd6f bfe0da4d -> 00000000", + "bef3251e 401cffd9 -> 00000000", + "c032dcfc 3f3a5733 -> 00000000", + "3fe2314a bff58209 -> 3eabcaa1", + "bfbc6b81 bedcfa9b -> 00000000", + "bfe8753d c07eb480 -> 00000000", + "3ef3c863 405ec2c7 -> 3d9ac06a", + "be6152b5 bf45aacb -> 00000000", + "be8cb081 bebf87d7 -> 00000000", + "3fd9f513 405eb504 -> 40cbf5cd", + "c0055aad 3f57b977 -> 00000000", + "bfefa855 c028faef -> 00000000", + "404747c6 3ed9d7de -> 3fcf88d3", + "3d4d806d bfbd6ae9 -> 42a78b41", + "bfb4b504 402a358c -> 00000000", + "bea534dc c06adcfe -> 00000000", + "bf4922bd 3f67ec4b -> 00000000", + "c02fbd7a 3d8c3fe4 -> 00000000", + "405640dd c060139d -> 3c6e53f0", + "bf49fe0f 401473eb -> 00000000", + "403ed51a 3fe55e74 -> 40e2a962", + "3f829173 40027ae5 -> 3f854a59", + "3f5d078b 3f494ea1 -> 3f64134e", + "c02672da c007ef74 -> 00000000", + "3fffe9d4 3eecbfee -> 3fb055cb", + "3fd1e8f8 4034e809 -> 4081889f", + "40264351 bff3c218 -> 3e263c28", + "407f0fc4 403b49ff -> 4264b1ce", + "3f9d9fec c0118d45 -> 3f1f725a", + "bd16f231 404f1b35 -> 00000000", + "3f2d250a 404e4706 -> 3e912cb7", + "3c1dc2ea 3fa559f4 -> 3b22ccc6", + "bfefea7d 3fd8ac81 -> 00000000", + "c03b2d34 405f98d0 -> 00000000", + "c0502664 4060410d -> 00000000", + "404acde9 4055d22b -> 423c98bf", + "3eaed472 bfa77bdb -> 40828ae1", + "3fd87c46 c07c5a79 -> 3e00f3be", + "3ed791b7 3f7e1eaa -> 3ed8f173", + "3ff027e2 3d7af66c -> 3f850808", + "bfc8be02 40053248 -> 00000000", + "c0337cee 4020efa8 -> 00000000", + "3f8af8d9 c0079158 -> 3f571220", + "c06d2ec2 3faff07b -> 00000000", + "bec41754 c02d0a40 -> 00000000", + "bd9c962e bf99f241 -> 00000000", + "c04bd257 3fe8424f -> 00000000", + "bfb791ec c0043822 -> 00000000", + "3f824a07 405d903f -> 3f8819d7", + "c028a75c bfe6fefc -> 00000000", + "c03bab67 402271eb -> 00000000", + "bfe5a368 3d39da40 -> 00000000", + "bf57eecb c0258a4a -> 00000000", + "c05b366c c028aaf6 -> 00000000", + "3e948670 3ffa446c -> 3db629e3", + "bf9508d4 3fba143e -> 00000000", + "bf4f4c6e bfbce6cf -> 00000000", + "4068f0c1 beb8fd46 -> 3f20848c", + "c059aacc 40342164 -> 00000000", + "40432471 c077b9cc -> 3c5af13e", + "3ff35c7e c002dbc9 -> 3e89a221", + "3fe7e0c4 c00383e2 -> 3e9701d7", + "3e77ee6e 40450258 -> 3c501d7f", + "bfd779b9 3f882560 -> 00000000", + "402ba408 3f7d00a9 -> 4029ab68", + "3f9d2a61 bef922aa -> 3f67aa64", + "40142c54 be598d6d -> 3f562e6c", + "4014a03a 406d173a -> 41b5663d", + "bf8ef217 3fa680fa -> 00000000", + "c01aa7ae 4078681a -> 00000000", + "403117da 4058cffd -> 41fb7e12", + "40482ccc 3fd9c710 -> 40deb432", + "bfd03191 407015d9 -> 00000000", + "c0321982 c03b31c8 -> 00000000", + "402000a6 c03030e3 -> 3da45b6f", + "3ef1bfad 400b4657 -> 3e480537", + "3dabf744 bf3ac404 -> 40c303c9", + "3f70f005 bf52ddc0 -> 3f868e48", + "c0451666 bf11663c -> 00000000", + "bf00451c bd811036 -> 00000000", + "c02a7a29 40384263 -> 00000000", + "bfe2cd4e be9efbf6 -> 00000000", + "c0331bfd c07e13d8 -> 00000000", + "3fe822f8 3fed12fd -> 4040c306", + "3f6745d6 c070c6d9 -> 3fbb938f", + "bfe4797e 4045d198 -> 00000000", + "3fabd90b 3f9b7cee -> 3fb711ff", + "407e02ca 3f14e6af -> 400eb0be", + "40195aea beefb27d -> 3f2a0ba7", + "40675833 bf07d221 -> 3f0176ef", + "c054048f 3fbefc0e -> 00000000", + "402b1c91 bf889d5f -> 3eb33c75", + "40543ae6 c02889b7 -> 3d2e50fc", + "3f3f0d38 c01a59ca -> 40019fb4", + "c01d6d94 3f661722 -> 00000000", + "3deb7298 402de6b4 -> 3b37960b", + "3e8c5516 4042ec4a -> 3c9efe7a", + "3f839279 3f59a8f9 -> 3f8307e9", + "3e214851 bffe9526 -> 421dfa62", + "c0150586 40419300 -> 00000000", + "4008137f c043de85 -> 3dcb9270", + "bf93948e 40515529 -> 00000000", + "401d8f3d 3e9182fa -> 3fa55a01", + "3fd33b6b bf51fa98 -> 3f29beeb", + "c05939f9 bfb08915 -> 00000000", + "bcb25bf1 bfead0da -> 00000000", + "3f80953f 3f745012 -> 3f808e6b", + "bfbc5e72 befd3c71 -> 00000000", + "c06e3ebe c063e9c6 -> 00000000", + "3e50bfab c02d55e9 -> 4294780c", + "bfa2848f bfa12134 -> 00000000", + "3e18d2f3 4009ff3c -> 3c878f6e", + "bd010d4e 402e9d7e -> 00000000", + "3fd3a512 bfde3ce9 -> 3ed5d5fc", + "bfa2728f be4839fc -> 00000000", + "40640343 3f01ddd7 -> 3ff3d998", + "40604671 c0620aad -> 3c43686b", + "bf4bf309 402f4577 -> 00000000", + "40348f2a 3f9a1688 -> 405f0fcb", + "bf5b10d7 4013cbfb -> 00000000", + "3ec6ced3 3edf61e9 -> 3f296e82", + "40652f45 c0585a76 -> 3c5b946e", + "c013cd42 bfb05792 -> 00000000", + "404405dc bd3d3ed1 -> 3f7318d9", + "3fc2fc93 40689eee -> 4093c259", + "c0181693 3fac023a -> 00000000", + "bff699d1 404b13a1 -> 00000000", + "bfc86509 4030320e -> 00000000", + "405580ca bfdc6603 -> 3e00a41b", + "404bffb1 bf5c41b1 -> 3ebcd961", + "3f3db3fc c077ea7b -> 404c5cc0", + "40762e8e be74c607 -> 3f398488", + "3f09842d bfd1e268 -> 40314db8", + "3fc457b5 c02a9c81 -> 3ea3a9d8", + "3f6b027b 407fe17f -> 3f35d75b", + "405aa1ef c0165be2 -> 3d648142", + "c03fd015 bfdc05b5 -> 00000000", + "c004dd62 3fa22a2c -> 00000000", + "c026f5c0 bfb5a5ac -> 00000000", + "4038a59a 4079add9 -> 42799bf0", + "c0418528 c0671f40 -> 00000000", + "3e895286 3ed35d53 -> 3f14b24d", + "bf9e9bef 3ff0365b -> 00000000", + "bfd84062 c04f4839 -> 00000000", + "3e6db5e3 3ed08e53 -> 3f0d3784", + "4041ef11 40159c04 -> 41559dee", + "bf74532e bf477ab1 -> 00000000", + "c01f2d12 befba637 -> 00000000", + "3f96b320 c06b38e8 -> 3f0c7db9", + "bf25ad1f c0630f66 -> 00000000", + "400e2add 3f81bfc4 -> 400fb9f6", + "40695161 c05f4020 -> 3c33cf06", + "3e8bf22d 4050b2cb -> 3c6e8404", + "bd7e3d38 c0605969 -> 00000000", + "3f428754 401961d9 -> 3f0490c0", + "becc2418 bf28087f -> 00000000", + "c011d8e8 c01148de -> 00000000", + "bee49fd7 3f585b3f -> 00000000", + "3f4c94b3 3f9b5887 -> 3f430323", + "bffe70fa 3fce2e10 -> 00000000", + "bfb877f2 3f5a8dd6 -> 00000000", + "3f1edcf1 40532552 -> 3e54286c", + "4009099d 3f9f88bf -> 40254f8e", + "bed2a380 3f56a782 -> 00000000", + "bfc01c71 c0399cc8 -> 00000000", + "407739cf 405b9067 -> 42ce52cf", + "401b600f 3f1b6b0a -> 3fdb5070", + "bfbf7a52 3faf939f -> 00000000", + "c051b9c4 bf88edfd -> 00000000", + "3fb28046 c0002f01 -> 3f0382f5", + "3f9b2453 c07a4d2f -> 3ef15723", + "3ecb2d61 3f0834bf -> 3f1c8ee8", + "4054c68e 402175af -> 41a5b558", + "c0714e3f 3f7f8d10 -> 00000000", + "bfee540b 40585e29 -> 00000000", + "405865ef 4068dcf4 -> 42a84a1a", + "3d2f3c34 c051317b -> 46e8a77b", + "3fe9cc00 3fe62ace -> 403d1365", + "bf4fd804 3fb075b6 -> 00000000", + "c034ef70 bdf53063 -> 00000000", + "3fd8ff3e 4061c3ce -> 40cdfae1", + "40601a18 401a7ec8 -> 41a4cb33", + "40363980 3f943051 -> 4056ec16", + "bf0e9453 c04f0a69 -> 00000000", + "c054a3c1 bf317c08 -> 00000000", + "c01b1e61 40538550 -> 00000000", + "3f2c74c2 c02c5387 -> 4039682d", + "3ddf52ea 40477174 -> 3a83573a", + "3eb56dd5 c059af29 -> 42085293", + "401d3ec3 c039a93f -> 3d96f0b1", + "bf2d1344 c027429f -> 00000000", + "40324b62 3efb042a -> 3fd385e8", + "3fc9a2ac 407dee1a -> 40c22cf1", + "bf72d466 c06bd290 -> 00000000", + "404ec2b7 40090a5e -> 414513c6", + "bda94dca 3f90b16e -> 00000000", + "402adff1 403c0fc8 -> 418f549b", + "be8814ee bf279462 -> 00000000", + "bf708c3a c014e006 -> 00000000", + "3feef554 bf6dbf77 -> 3f0f5ea4", + "bef5ee50 3f988c6a -> 00000000", + "3fb92a03 3e59e7d8 -> 3f8a7659", + "404eb6ff 401862f5 -> 4182772a", + "405f37a1 3e9de352 -> 3fbc27f2", + "bfdd5e57 3e921a32 -> 00000000", + "bdf6b401 3d811c48 -> 00000000", + "3f8169c3 3e48961a -> 3f80468d", + "bfea4ded 4065a7a3 -> 00000000", + "401ab5b6 400d23b2 -> 40e024c5", + "3f3b0090 c018f444 -> 400790a0", + "3fe63501 c01baae0 -> 3e75a1bc", + "405dddb6 402647d4 -> 41ca3b82", + "c06a787a c01bcff4 -> 00000000", + "3fbaefea c013aef8 -> 3ed5a756", + "c07c78b1 3e963683 -> 00000000", + "407c878d 3f9eb519 -> 40af81df", + "c06e0a67 c052d62f -> 00000000", + "405e891e 3fc61d18 -> 40dc34c8", + "3f9cba00 400714d8 -> 3fc43f6e", + "3fb45fc7 c0638d46 -> 3e9739fa", + "40006aeb c03b91ad -> 3e050431", + "c05f7ca3 c0254dd8 -> 00000000", + "bfb55211 c023eb03 -> 00000000", + "3f9fc9bd bf905f13 -> 3f4755db", + "40341157 c05249a3 -> 3d08d795", + "c0771294 bfe9353a -> 00000000", + "400fad45 bfa789fc -> 3eb1a786", + "c0776ed5 3d6cecdc -> 00000000", + "4011a31a 3f668839 -> 400632c7", + "401ea5fa 3f9897c5 -> 403ce11e", + "c003e1a6 3f999025 -> 00000000", + "3f3d5a34 406c4fd0 -> 3ea82502", + "3e852204 407a0e29 -> 3ba9c3d4", + "bf8cbab1 c033bb00 -> 00000000", + "3db4e022 3e43de6c -> 3f20ee95", + "403a59ae 3f8e1b55 -> 4051a505", + "401770d4 bf409f77 -> 3f05e692", + "3fa08fff bfa75fca -> 3f3e56a3", + "3fad7bff 401ba18b -> 40060ebf", + "c047a481 403d0315 -> 00000000", + "c06c97f6 3f2a59b9 -> 00000000", + "4075f459 4013e669 -> 41b39248", + "c04a7468 3f0cc50f -> 00000000", + "406ad613 3ff78946 -> 4145ad88", + "c054956d bf0f319e -> 00000000", + "3ec62355 c0193e83 -> 411b5d6a", + "be8d0a89 c02003cf -> 00000000", + "4050f4d5 3f857f33 -> 405bd93c", + "bff0ebd4 c038ef6b -> 00000000", + "bfde39a0 3f1ae684 -> 00000000", + "4023d1bc 3f15529a -> 3fdd767d", + "3eb920c3 3f3e72d6 -> 3ef036df", + "3fdc76d9 3f658b48 -> 3fd06b16", + "400134d9 bf9f05bb -> 3ed5e790", + "3e5ca01b c0536b99 -> 431f4d53", + "bfc21894 4012ff25 -> 00000000", + "406cabed 3d27865d -> 3f87086c", + "4039d9e3 bffad2a7 -> 3dfd9017", + "3f3f00d5 bf22e82b -> 3f9a3984", + "3f0b23a5 c05a541d -> 41000ff7", + "c0288931 bf50637b -> 00000000", + "405d46f3 bfa2c4de -> 3e537229", + "bf58300f bfb94565 -> 00000000", + "c0741e7e c008a347 -> 00000000", + "404cbd6c 3e953981 -> 3fb3a39f", + "bfc1709d 40757f55 -> 00000000", + "c05184f7 3f4429ef -> 00000000", + "4042444c 3e15ed9c -> 3f969898", + "4015b2a8 3ff87c78 -> 40a68e26", + "4041bf7f c07584e8 -> 3c69de1b", + "3f4afba3 3f0f2f44 -> 3f60d6d4", + "c033a78c 4026e409 -> 00000000", + "bfb9000f 3f55cfe5 -> 00000000", + "3ffd7657 40388886 -> 40e56d4d", + "4010111a bdd2e263 -> 3f6b7af9", + "c00022a2 c0214209 -> 00000000", + "c05b4114 bf1fa06b -> 00000000", + "bf0da41e 3f3366c8 -> 00000000", + "3f20a921 bfce3678 -> 4007902e", + "c0731099 bff78c2f -> 00000000", + "3feb9cb8 c02b51e9 -> 3e47f7dd", + "bf34c8fa c037d62c -> 00000000", + "4017f224 401cac58 -> 4104da7d", + "403aeaca c00112f6 -> 3debd1d4", + "bfc789bc 4073ee39 -> 00000000", + "3f1a6106 3ea540fc -> 3f597156", + "bf800000 4b7fffff -> bf800000", + "bf800000 4b800000 -> 3f800000", + "bf800000 4f000000 -> 3f800000", + "bf800000 cf32d05e -> 3f800000", + "bf800000 4f32d05e -> 3f800000", + "bfc00000 4b800000 -> 00000000", + "bfc00000 41880000 -> c47650b8", + "80000000 c0400000 -> 00000000", + "00000000 40000000 -> 00000000", + "00000000 00000000 -> 3f800000", + "40000000 00000000 -> 3f800000", + "c1000000 3eaaaaaa -> 00000000", + "c0000000 cf000000 -> 00000000", + "c0000000 4f000000 -> 00000000", + "c0000000 c0400000 -> be000000", + "c0000000 40000000 -> 40800000", + "c0000000 40400000 -> c1000000", + "c0000000 d01502f9 -> 00000000", + "c0000000 501502f9 -> 00000000" + ] + }, + { + "function": "cycles_logarithm", + "node": "ShaderNodeMath LOGARITHM", + "cases": [ + "00000000 00000000 -> 00000000", + "00000000 3f800000 -> 00000000", + "00000000 bf800000 -> 00000000", + "00000000 3f000000 -> 00000000", + "00000000 bf000000 -> 00000000", + "00000000 40000000 -> 00000000", + "00000000 c0000000 -> 00000000", + "00000000 40400000 -> 00000000", + "00000000 c0300000 -> 00000000", + "00000000 3dcccccd -> 00000000", + "00000000 bdcccccd -> 00000000", + "00000000 40f00000 -> 00000000", + "00000000 c0f00000 -> 00000000", + "00000000 33d6bf95 -> 00000000", + "00000000 b3d6bf95 -> 00000000", + "00000000 42c80000 -> 00000000", + "00000000 c2c80000 -> 00000000", + "00000000 461c4000 -> 00000000", + "00000000 3e99999a -> 00000000", + "00000000 3f333333 -> 00000000", + "3f800000 00000000 -> 00000000", + "3f800000 3f800000 -> 00000000", + "3f800000 bf800000 -> 00000000", + "3f800000 3f000000 -> 00000000", + "3f800000 bf000000 -> 00000000", + "3f800000 40000000 -> 00000000", + "3f800000 c0000000 -> 00000000", + "3f800000 40400000 -> 00000000", + "3f800000 c0300000 -> 00000000", + "3f800000 3dcccccd -> 00000000", + "3f800000 bdcccccd -> 00000000", + "3f800000 40f00000 -> 00000000", + "3f800000 c0f00000 -> 00000000", + "3f800000 33d6bf95 -> 00000000", + "3f800000 b3d6bf95 -> 00000000", + "3f800000 42c80000 -> 00000000", + "3f800000 c2c80000 -> 00000000", + "3f800000 461c4000 -> 00000000", + "3f800000 3e99999a -> 00000000", + "3f800000 3f333333 -> 00000000", + "bf800000 00000000 -> 00000000", + "bf800000 3f800000 -> 00000000", + "bf800000 bf800000 -> 00000000", + "bf800000 3f000000 -> 00000000", + "bf800000 bf000000 -> 00000000", + "bf800000 40000000 -> 00000000", + "bf800000 c0000000 -> 00000000", + "bf800000 40400000 -> 00000000", + "bf800000 c0300000 -> 00000000", + "bf800000 3dcccccd -> 00000000", + "bf800000 bdcccccd -> 00000000", + "bf800000 40f00000 -> 00000000", + "bf800000 c0f00000 -> 00000000", + "bf800000 33d6bf95 -> 00000000", + "bf800000 b3d6bf95 -> 00000000", + "bf800000 42c80000 -> 00000000", + "bf800000 c2c80000 -> 00000000", + "bf800000 461c4000 -> 00000000", + "bf800000 3e99999a -> 00000000", + "bf800000 3f333333 -> 00000000", + "3f000000 00000000 -> 00000000", + "3f000000 3f800000 -> 00000000", + "3f000000 bf800000 -> 00000000", + "3f000000 3f000000 -> 3f800000", + "3f000000 bf000000 -> 00000000", + "3f000000 40000000 -> bf800000", + "3f000000 c0000000 -> 00000000", + "3f000000 40400000 -> bf21849d", + "3f000000 c0300000 -> 00000000", + "3f000000 3dcccccd -> 3e9a209a", + "3f000000 bdcccccd -> 00000000", + "3f000000 40f00000 -> beb0221a", + "3f000000 c0f00000 -> 00000000", + "3f000000 33d6bf95 -> 3d302543", + "3f000000 b3d6bf95 -> 00000000", + "3f000000 42c80000 -> be1a209a", + "3f000000 c2c80000 -> 00000000", + "3f000000 461c4000 -> bd9a209a", + "3f000000 3e99999a -> 3f13622a", + "3f000000 3f333333 -> 3ff8bff5", + "bf000000 00000000 -> 00000000", + "bf000000 3f800000 -> 00000000", + "bf000000 bf800000 -> 00000000", + "bf000000 3f000000 -> 00000000", + "bf000000 bf000000 -> 00000000", + "bf000000 40000000 -> 00000000", + "bf000000 c0000000 -> 00000000", + "bf000000 40400000 -> 00000000", + "bf000000 c0300000 -> 00000000", + "bf000000 3dcccccd -> 00000000", + "bf000000 bdcccccd -> 00000000", + "bf000000 40f00000 -> 00000000", + "bf000000 c0f00000 -> 00000000", + "bf000000 33d6bf95 -> 00000000", + "bf000000 b3d6bf95 -> 00000000", + "bf000000 42c80000 -> 00000000", + "bf000000 c2c80000 -> 00000000", + "bf000000 461c4000 -> 00000000", + "bf000000 3e99999a -> 00000000", + "bf000000 3f333333 -> 00000000", + "40000000 00000000 -> 00000000", + "40000000 3f800000 -> 00000000", + "40000000 bf800000 -> 00000000", + "40000000 3f000000 -> bf800000", + "40000000 bf000000 -> 00000000", + "40000000 40000000 -> 3f800000", + "40000000 c0000000 -> 00000000", + "40000000 40400000 -> 3f21849d", + "40000000 c0300000 -> 00000000", + "40000000 3dcccccd -> be9a209a", + "40000000 bdcccccd -> 00000000", + "40000000 40f00000 -> 3eb0221a", + "40000000 c0f00000 -> 00000000", + "40000000 33d6bf95 -> bd302543", + "40000000 b3d6bf95 -> 00000000", + "40000000 42c80000 -> 3e1a209a", + "40000000 c2c80000 -> 00000000", + "40000000 461c4000 -> 3d9a209a", + "40000000 3e99999a -> bf13622a", + "40000000 3f333333 -> bff8bff5", + "c0000000 00000000 -> 00000000", + "c0000000 3f800000 -> 00000000", + "c0000000 bf800000 -> 00000000", + "c0000000 3f000000 -> 00000000", + "c0000000 bf000000 -> 00000000", + "c0000000 40000000 -> 00000000", + "c0000000 c0000000 -> 00000000", + "c0000000 40400000 -> 00000000", + "c0000000 c0300000 -> 00000000", + "c0000000 3dcccccd -> 00000000", + "c0000000 bdcccccd -> 00000000", + "c0000000 40f00000 -> 00000000", + "c0000000 c0f00000 -> 00000000", + "c0000000 33d6bf95 -> 00000000", + "c0000000 b3d6bf95 -> 00000000", + "c0000000 42c80000 -> 00000000", + "c0000000 c2c80000 -> 00000000", + "c0000000 461c4000 -> 00000000", + "c0000000 3e99999a -> 00000000", + "c0000000 3f333333 -> 00000000", + "40400000 00000000 -> 00000000", + "40400000 3f800000 -> 00000000", + "40400000 bf800000 -> 00000000", + "40400000 3f000000 -> bfcae00d", + "40400000 bf000000 -> 00000000", + "40400000 40000000 -> 3fcae00d", + "40400000 c0000000 -> 00000000", + "40400000 40400000 -> 3f800000", + "40400000 c0300000 -> 00000000", + "40400000 3dcccccd -> bef4493d", + "40400000 bdcccccd -> 00000000", + "40400000 40f00000 -> 3f0b9510", + "40400000 c0f00000 -> 00000000", + "40400000 33d6bf95 -> bd8b9791", + "40400000 b3d6bf95 -> 00000000", + "40400000 42c80000 -> 3e74493d", + "40400000 c2c80000 -> 00000000", + "40400000 461c4000 -> 3df4493d", + "40400000 3e99999a -> bf6998e6", + "40400000 3f333333 -> c045212c", + "c0300000 00000000 -> 00000000", + "c0300000 3f800000 -> 00000000", + "c0300000 bf800000 -> 00000000", + "c0300000 3f000000 -> 00000000", + "c0300000 bf000000 -> 00000000", + "c0300000 40000000 -> 00000000", + "c0300000 c0000000 -> 00000000", + "c0300000 40400000 -> 00000000", + "c0300000 c0300000 -> 00000000", + "c0300000 3dcccccd -> 00000000", + "c0300000 bdcccccd -> 00000000", + "c0300000 40f00000 -> 00000000", + "c0300000 c0f00000 -> 00000000", + "c0300000 33d6bf95 -> 00000000", + "c0300000 b3d6bf95 -> 00000000", + "c0300000 42c80000 -> 00000000", + "c0300000 c2c80000 -> 00000000", + "c0300000 461c4000 -> 00000000", + "c0300000 3e99999a -> 00000000", + "c0300000 3f333333 -> 00000000", + "3dcccccd 00000000 -> 00000000", + "3dcccccd 3f800000 -> 00000000", + "3dcccccd bf800000 -> 00000000", + "3dcccccd 3f000000 -> 40549a78", + "3dcccccd bf000000 -> 00000000", + "3dcccccd 40000000 -> c0549a78", + "3dcccccd c0000000 -> 00000000", + "3dcccccd 40400000 -> c0062347", + "3dcccccd c0300000 -> 00000000", + "3dcccccd 3dcccccd -> 3f800000", + "3dcccccd bdcccccd -> 00000000", + "3dcccccd 40f00000 -> bf924685", + "3dcccccd c0f00000 -> 00000000", + "3dcccccd 33d6bf95 -> 3e124925", + "3dcccccd b3d6bf95 -> 00000000", + "3dcccccd 42c80000 -> bf000000", + "3dcccccd c2c80000 -> 00000000", + "3dcccccd 461c4000 -> be800000", + "3dcccccd 3e99999a -> 3ff4cc73", + "3dcccccd 3f333333 -> 40ce9510", + "bdcccccd 00000000 -> 00000000", + "bdcccccd 3f800000 -> 00000000", + "bdcccccd bf800000 -> 00000000", + "bdcccccd 3f000000 -> 00000000", + "bdcccccd bf000000 -> 00000000", + "bdcccccd 40000000 -> 00000000", + "bdcccccd c0000000 -> 00000000", + "bdcccccd 40400000 -> 00000000", + "bdcccccd c0300000 -> 00000000", + "bdcccccd 3dcccccd -> 00000000", + "bdcccccd bdcccccd -> 00000000", + "bdcccccd 40f00000 -> 00000000", + "bdcccccd c0f00000 -> 00000000", + "bdcccccd 33d6bf95 -> 00000000", + "bdcccccd b3d6bf95 -> 00000000", + "bdcccccd 42c80000 -> 00000000", + "bdcccccd c2c80000 -> 00000000", + "bdcccccd 461c4000 -> 00000000", + "bdcccccd 3e99999a -> 00000000", + "bdcccccd 3f333333 -> 00000000", + "40f00000 00000000 -> 00000000", + "40f00000 3f800000 -> 00000000", + "40f00000 bf800000 -> 00000000", + "40f00000 3f000000 -> c03a0a7f", + "40f00000 bf000000 -> 00000000", + "40f00000 40000000 -> 403a0a7f", + "40f00000 c0000000 -> 00000000", + "40f00000 40400000 -> 3feac1f2", + "40f00000 c0300000 -> 00000000", + "40f00000 3dcccccd -> bf600404", + "40f00000 bdcccccd -> 00000000", + "40f00000 40f00000 -> 3f800000", + "40f00000 c0f00000 -> 00000000", + "40f00000 33d6bf95 -> be00024c", + "40f00000 b3d6bf95 -> 00000000", + "40f00000 42c80000 -> 3ee00404", + "40f00000 c2c80000 -> 00000000", + "40f00000 461c4000 -> 3e600404", + "40f00000 3e99999a -> bfd636bc", + "40f00000 3f333333 -> c0b4c5ab", + "c0f00000 00000000 -> 00000000", + "c0f00000 3f800000 -> 00000000", + "c0f00000 bf800000 -> 00000000", + "c0f00000 3f000000 -> 00000000", + "c0f00000 bf000000 -> 00000000", + "c0f00000 40000000 -> 00000000", + "c0f00000 c0000000 -> 00000000", + "c0f00000 40400000 -> 00000000", + "c0f00000 c0300000 -> 00000000", + "c0f00000 3dcccccd -> 00000000", + "c0f00000 bdcccccd -> 00000000", + "c0f00000 40f00000 -> 00000000", + "c0f00000 c0f00000 -> 00000000", + "c0f00000 33d6bf95 -> 00000000", + "c0f00000 b3d6bf95 -> 00000000", + "c0f00000 42c80000 -> 00000000", + "c0f00000 c2c80000 -> 00000000", + "c0f00000 461c4000 -> 00000000", + "c0f00000 3e99999a -> 00000000", + "c0f00000 3f333333 -> 00000000", + "33d6bf95 00000000 -> 00000000", + "33d6bf95 3f800000 -> 00000000", + "33d6bf95 bf800000 -> 00000000", + "33d6bf95 3f000000 -> 41ba0729", + "33d6bf95 bf000000 -> 00000000", + "33d6bf95 40000000 -> c1ba0729", + "33d6bf95 c0000000 -> 00000000", + "33d6bf95 40400000 -> c16abdbd", + "33d6bf95 c0300000 -> 00000000", + "33d6bf95 3dcccccd -> 40e00000", + "33d6bf95 bdcccccd -> 00000000", + "33d6bf95 40f00000 -> c0fffb69", + "33d6bf95 c0f00000 -> 00000000", + "33d6bf95 33d6bf95 -> 3f800000", + "33d6bf95 b3d6bf95 -> 00000000", + "33d6bf95 42c80000 -> c0600000", + "33d6bf95 c2c80000 -> 00000000", + "33d6bf95 461c4000 -> bfe00000", + "33d6bf95 3e99999a -> 415632e4", + "33d6bf95 3f333333 -> 4234c26d", + "b3d6bf95 00000000 -> 00000000", + "b3d6bf95 3f800000 -> 00000000", + "b3d6bf95 bf800000 -> 00000000", + "b3d6bf95 3f000000 -> 00000000", + "b3d6bf95 bf000000 -> 00000000", + "b3d6bf95 40000000 -> 00000000", + "b3d6bf95 c0000000 -> 00000000", + "b3d6bf95 40400000 -> 00000000", + "b3d6bf95 c0300000 -> 00000000", + "b3d6bf95 3dcccccd -> 00000000", + "b3d6bf95 bdcccccd -> 00000000", + "b3d6bf95 40f00000 -> 00000000", + "b3d6bf95 c0f00000 -> 00000000", + "b3d6bf95 33d6bf95 -> 00000000", + "b3d6bf95 b3d6bf95 -> 00000000", + "b3d6bf95 42c80000 -> 00000000", + "b3d6bf95 c2c80000 -> 00000000", + "b3d6bf95 461c4000 -> 00000000", + "b3d6bf95 3e99999a -> 00000000", + "b3d6bf95 3f333333 -> 00000000", + "42c80000 00000000 -> 00000000", + "42c80000 3f800000 -> 00000000", + "42c80000 bf800000 -> 00000000", + "42c80000 3f000000 -> c0d49a78", + "42c80000 bf000000 -> 00000000", + "42c80000 40000000 -> 40d49a78", + "42c80000 c0000000 -> 00000000", + "42c80000 40400000 -> 40862347", + "42c80000 c0300000 -> 00000000", + "42c80000 3dcccccd -> c0000000", + "42c80000 bdcccccd -> 00000000", + "42c80000 40f00000 -> 40124685", + "42c80000 c0f00000 -> 00000000", + "42c80000 33d6bf95 -> be924925", + "42c80000 b3d6bf95 -> 00000000", + "42c80000 42c80000 -> 3f800000", + "42c80000 c2c80000 -> 00000000", + "42c80000 461c4000 -> 3f000000", + "42c80000 3e99999a -> c074cc73", + "42c80000 3f333333 -> c14e9510", + "c2c80000 00000000 -> 00000000", + "c2c80000 3f800000 -> 00000000", + "c2c80000 bf800000 -> 00000000", + "c2c80000 3f000000 -> 00000000", + "c2c80000 bf000000 -> 00000000", + "c2c80000 40000000 -> 00000000", + "c2c80000 c0000000 -> 00000000", + "c2c80000 40400000 -> 00000000", + "c2c80000 c0300000 -> 00000000", + "c2c80000 3dcccccd -> 00000000", + "c2c80000 bdcccccd -> 00000000", + "c2c80000 40f00000 -> 00000000", + "c2c80000 c0f00000 -> 00000000", + "c2c80000 33d6bf95 -> 00000000", + "c2c80000 b3d6bf95 -> 00000000", + "c2c80000 42c80000 -> 00000000", + "c2c80000 c2c80000 -> 00000000", + "c2c80000 461c4000 -> 00000000", + "c2c80000 3e99999a -> 00000000", + "c2c80000 3f333333 -> 00000000", + "461c4000 00000000 -> 00000000", + "461c4000 3f800000 -> 00000000", + "461c4000 bf800000 -> 00000000", + "461c4000 3f000000 -> c1549a78", + "461c4000 bf000000 -> 00000000", + "461c4000 40000000 -> 41549a78", + "461c4000 c0000000 -> 00000000", + "461c4000 40400000 -> 41062347", + "461c4000 c0300000 -> 00000000", + "461c4000 3dcccccd -> c0800000", + "461c4000 bdcccccd -> 00000000", + "461c4000 40f00000 -> 40924685", + "461c4000 c0f00000 -> 00000000", + "461c4000 33d6bf95 -> bf124925", + "461c4000 b3d6bf95 -> 00000000", + "461c4000 42c80000 -> 40000000", + "461c4000 c2c80000 -> 00000000", + "461c4000 461c4000 -> 3f800000", + "461c4000 3e99999a -> c0f4cc73", + "461c4000 3f333333 -> c1ce9510", + "3e99999a 00000000 -> 00000000", + "3e99999a 3f800000 -> 00000000", + "3e99999a bf800000 -> 00000000", + "3e99999a 3f000000 -> 3fde54e4", + "3e99999a bf000000 -> 00000000", + "3e99999a 40000000 -> bfde54e4", + "3e99999a c0000000 -> 00000000", + "3e99999a 40400000 -> bf8c468f", + "3e99999a c0300000 -> 00000000", + "3e99999a 3dcccccd -> 3f05db62", + "3e99999a bdcccccd -> 00000000", + "3e99999a 40f00000 -> bf18f7fb", + "3e99999a c0f00000 -> 00000000", + "3e99999a 33d6bf95 -> 3d98fab9", + "3e99999a b3d6bf95 -> 00000000", + "3e99999a 42c80000 -> be85db62", + "3e99999a c2c80000 -> 00000000", + "3e99999a 461c4000 -> be05db62", + "3e99999a 3e99999a -> 3f800000", + "3e99999a 3f333333 -> 405808f3", + "3f333333 00000000 -> 00000000", + "3f333333 3f800000 -> 00000000", + "3f333333 bf800000 -> 00000000", + "3f333333 3f000000 -> 3f03bb12", + "3f333333 bf000000 -> 00000000", + "3f333333 40000000 -> bf03bb12", + "3f333333 c0000000 -> 00000000", + "3f333333 40400000 -> bea639c7", + "3f333333 c0300000 -> 00000000", + "3f333333 3dcccccd -> 3e1e9e9f", + "3f333333 bdcccccd -> 00000000", + "3f333333 40f00000 -> be354451", + "3f333333 c0f00000 -> 00000000", + "3f333333 33d6bf95 -> 3cb54792", + "3f333333 b3d6bf95 -> 00000000", + "3f333333 42c80000 -> bd9e9e9f", + "3f333333 c2c80000 -> 00000000", + "3f333333 461c4000 -> bd1e9e9f", + "3f333333 3e99999a -> 3e97addd", + "3f333333 3f333333 -> 3f800000", + "40d14837 4158331a -> 3f38a621", + "409991e7 4100e17a -> 3f40741a", + "408aa447 40b570a4 -> 3f584efc", + "41921e36 419c66e0 -> 3f7a24b5", + "40692f47 41941f5f -> 3ee2d148", + "40a8ac15 4081d395 -> 3f97ec9d", + "412418e2 3ff8ebb0 -> 40600029", + "3f763f94 413fa0d9 -> bc80222e", + "4161e6ea 4191ebed -> 3f696b62", + "4197904c 412ebadd -> 3f9d7f2f", + "410601ac 4055b454 -> 3fe19ffc", + "402e939e 40a26094 -> 3f1e2a7e", + "41456e1a 3fd0e56a -> 40a42a65", + "41067042 412ad198 -> 3f661bd3", + "4118e7ba 41601f4c -> 3f5aea70", + "4198294c 418c3003 -> 3f83a9e2", + "410cb4c7 4098967f -> 3fb22853", + "40f1a4bf 3f9ce42e -> 411ef03d", + "40fc1fa8 4108049b -> 3f76e851", + "3fdacd8f 408ab5f0 -> 3ebb29e3", + "40910615 4120fe11 -> 3f278f5f", + "40bddaaa 4124c36a -> 3f437780", + "419ca290 40a17339 -> 3feb3e76", + "414e9d98 412146e6 -> 3f8db969", + "415376f7 4144cf25 -> 3f83a9ca", + "4115b7bf 4184931e -> 3f4be360", + "4059b615 40b95af4 -> 3f326dd1", + "402980f0 409c0635 -> 3f1d62a9", + "4144f601 408979f2 -> 3fdc6fa9", + "40637a33 40b8d73b -> 3f391e00", + "4124a7d8 407c0f47 -> 3fd9afff", + "3faf9ab0 412bd9f3 -> 3e086368", + "40d3b635 415dbf3a -> 3f37fe56", + "417ee9c5 407fd943 -> 3fffb75b", + "4185dea6 418dcb17 -> 3f7ae12b", + "3f526788 40333562 -> be431102", + "405eaeb6 40af7306 -> 3f3b95bb", + "4190bc11 40b36253 -> 3fd70080", + "40a5a2d4 416214d9 -> 3f1eec76", + "413ad7cf 40a6cbe4 -> 3fbe8957", + "40d045e5 407f7acd -> 3fad3416", + "4198d774 4000433e -> 4087c979", + "4169551b 4134cb12 -> 3f8d7788", + "4055b52a 418e145d -> 3ed69431", + "40e92c98 410c65b8 -> 3f6a1866", + "419cc6f4 3e1416fa -> bfc4f556", + "413697a0 3f6a3ead -> c1db502d", + "419cc58b 4112d616 -> 3fabce04", + "40d337a8 414f230c -> 3f3ca82a", + "419e53a0 4151f6bf -> 3f946ddb", + "410eec6a 41809157 -> 3f49dc32", + "412e2e0c 41902bac -> 3f535fc4", + "4168134f 3f0ce6fb -> c08f5429", + "3f67fc5c 3fe08ab8 -> be337732", + "41049e92 4134d817 -> 3f5f4243", + "41246572 416140fa -> 3f61835f", + "40fb6140 412004a1 -> 3f6527ad", + "41223afe 40570b04 -> 3ff4a601", + "4100143e 401e0653 -> 40134843", + "40adeda7 405c0ba9 -> 3faf7754", + "4028a24d 4155ee52 -> 3ebf4c79", + "41761de3 4189cd48 -> 3f75d29a", + "4111dcb6 410ba3bb -> 3f829369", + "4176b240 40389380 -> 40254b60", + "4192781d 4084a180 -> 4002de18", + "41470e63 4143a4b3 -> 3f80e256", + "40ed1bb3 418231e2 -> 3f37cb6f", + "419f4411 41475617 -> 3f97c927", + "40a01851 4059f2bc -> 3fa82e33", + "417475b0 4187f537 -> 3f766197", + "40ab04f9 40d24d00 -> 3f63e31c", + "4160dd1c 4137f7bb -> 3f8a855d", + "4187c2e2 41338c12 -> 3f95e56e", + "40ad029b 418de9eb -> 3f163afd", + "3e54791a 40d5cbc4 -> bf53f974", + "4049e79d 40873dfe -> 3f4c1004", + "40f59afa 40e01da9 -> 3f860575", + "40be9a92 409b73df -> 3f908233", + "3f8ea60f 415203d3 -> 3d2c627b", + "40cf84fe 413935d3 -> 3f436e1a", + "418b99bc 4181d890 -> 3f8353b1", + "411c9448 413b4d92 -> 3f6d5b2e", + "417b791e 41817b0d -> 3f7d4d4a", + "412305d0 417eb40a -> 3f56b989", + "4184bb29 40401643 -> 402390a2", + "4162ea01 401e6a59 -> 403b4448", + "41779d20 419c8aea -> 3f6bcdf7", + "412939f4 3fa77300 -> 410c7965", + "418a2668 41479e50 -> 3f907cac", + "41660846 3f9dd387 -> 414b9d60", + "417d7d7d 41755e28 -> 3f8186df", + "403bdefe 4126f2f2 -> 3eeb1c6f", + "410fe317 4176d647 -> 3f4d811e", + "3fdd5408 412244c3 -> 3e720dff", + "4153f425 41003e2a -> 3f9ee651", + "3f14c8a9 413cf2de -> be61158d", + "3ff9e4c2 3f2ca3dc -> bfd95bed", + "40e5f6c1 3fe45dfc -> 405a0661", + "41652cb4 3f5cd520 -> c1901b7f", + "40c2f77a 417337fb -> 3f29fe5b", + "4171274c 4099501b -> 3fdda254", + "40958010 40051e32 -> 4006b76d", + "4112ebd1 415b1339 -> 3f58ea6d", + "40fc4ac6 412c7197 -> 3f5e563e", + "40a3f180 4172d33c -> 3f19c830", + "41651810 41906d34 -> 3f6b7de1", + "3f38dff3 419d366b -> bddfd638", + "410adc69 4116a198 -> 3f76b5fc", + "41855790 4116085c -> 3fa0e50d", + "418bc524 4195e01b -> 3f79e6d7", + "40b5459e 41441ba2 -> 3f31286a", + "40248de4 413d4041 -> 3ec3b707", + "411a6e71 4009d16b -> 403d29f0", + "412fc0e1 40b7fbc5 -> 3faf6025", + "41521a17 40b35c72 -> 3fbf3882", + "415c9fa2 4190ebe6 -> 3f67e258", + "40f01833 4105d6be -> 3f72e490", + "3ed621bd 412378fd -> bec00bf1", + "406efa33 4163ee4c -> 3efdee06", + "40e09a39 41705915 -> 3f381ba9", + "40bdf84b 4133890b -> 3f3c96fc", + "3e845e05 4105e8a0 -> bf22ffb9", + "3f7477c0 4049fd74 -> bd244502", + "418c1640 4191193c -> 3f7ce519", + "411ba9f1 414bbcbe -> 3f64eb89", + "419a8580 40135ba5 -> 4063383b", + "40039393 41818d57 -> 3e84834e", + "4062a16a 40818262 -> 3f678a1c", + "3fdaba9e 419acfad -> 3e392f9a", + "4172a829 3f7d85d2 -> c38bd00b", + "4175ce51 418118d5 -> 3f7b795b", + "419b7db4 407c5092 -> 400a6e10", + "4024f174 3eb0c240 -> bf63e16e", + "40934b7f 415b90ab -> 3f153a34", + "4103a3fe 3fa30a76 -> 410b5ada", + "4065f85d 3c655e2c -> be9969e6", + "3fc9b8fb 4097bbb2 -> 3e95a289", + "3f54dc15 40ab669e -> bde13341", + "413a50e0 4189fc25 -> 3f5caf24", + "411e9861 40482ba0 -> 4000bd95", + "415b35a9 419928da -> 3f62fbd1", + "41021909 414b3229 -> 3f5316a4", + "418178ff 41966c64 -> 3f72e9da", + "41298202 419ef4a3 -> 3f4a245a", + "412c174e 3e2a1e74 -> bfa9648f", + "40ed1d72 41463155 -> 3f4bbb13", + "414d6350 41915806 -> 3f61557a", + "418f3825 415930d9 -> 3f8d94ed", + "40c21fc8 4117d3e4 -> 3f4d1993", + "418b588d 403353ee -> 40317f48", + "41843863 417e1af6 -> 3f81d872", + "404a1597 412e57b0 -> 3ef67a9f", + "418b0864 41872275 -> 3f8149a7", + "3fdf7cd9 414b6c1a -> 3e607297", + "4184c8c4 41047ec6 -> 3faa1a1a", + "415888ac 405e8969 -> 4005ca33", + "3f751cf4 41823b24 -> bc7f3694", + "4142bb62 40a9dc6d -> 3fbfa126", + "3f6a3f0a 3f0e9a17 -> 3e1b69f5", + "40d90af2 401258b6 -> 401421bd", + "41478e5d 414458f8 -> 3f80d3d7", + "4180c752 40a2beb3 -> 3fdaad70", + "41890707 413879db -> 3f94b8ce", + "408eb847 418997a5 -> 3f068b3e", + "410fadbc 411a2654 -> 3f780ceb", + "3ffc05d8 41655fbd -> 3e8244c1", + "4194efa0 418c23d2 -> 3f82b8b1", + "410df050 3f91fd1e -> 4184cb8c", + "413aa792 41851e04 -> 3f5fab10", + "40bf8df7 40902f3d -> 3f9827b5", + "41483654 408330b3 -> 3fe53be3", + "40a8fa86 40db977a -> 3f5d2d29", + "4184f7f9 40af21b7 -> 3fd3a6d3", + "416f60ee 419db0e0 -> 3f68526d", + "41646d38 4194b446 -> 3f68e25f", + "4158cdf3 40f5b1e5 -> 3fa3abd9", + "407573cc 418a7ffa -> 3ef15df0", + "419998cf 4113c826 -> 3faa217b", + "418dd668 409fa48b -> 3fe4fd0a", + "41237ac8 40fb7239 -> 3f904e33", + "40b19e6c 40aa7382 -> 3f8326eb", + "417d4bf0 41400f3e -> 3f8e4112", + "4111acc9 413f02c2 -> 3f640721", + "3fdb4e06 419cb52c -> 3e39553c", + "41191fe5 419e3278 -> 3f41bf28", + "41802ef4 414d559b -> 3f8b220f", + "4168aa59 3f4a83db -> c136c28c", + "4192ab43 40bc43a8 -> 3fd21949", + "4140a7a7 4084d416 -> 3fdfc661", + "413d5cb4 418828d5 -> 3f5f2f90", + "414df3a5 413699a7 -> 3f8653a8", + "419b8ac1 41553b54 -> 3f92aabd", + "3e6015e9 3f956180 -> c11d6296", + "41793f8e 419ae55c -> 3f6d36e5", + "3ffa2115 404697f4 -> 3f177503", + "40eeef87 409707cc -> 3fa5d693", + "419aca19 413a2c08 -> 3f9a8648", + "41409c4f 40e28a33 -> 3fa2b87e", + "40d2f642 4170210c -> 3f323f8f", + "40bd8183 41152245 -> 3f4bfbc2", + "40893e43 40f103fe -> 3f389ae4", + "418e28a8 409f3dc4 -> 3fe5873b", + "413ce670 412ab18d -> 3f857adf", + "414fc754 40c61441 -> 3fb406fb", + "403df3f0 40501ed2 -> 3f6c2bbc", + "418e020e 41963e22 -> 3f7b1466", + "418105a5 403d5279 -> 40241438", + "4189965f 41952df5 -> 3f78ec09", + "4113b970 40a617da -> 3facc415", + "40df9a09 4150c257 -> 3f41c340", + "4127ce05 419d3c16 -> 3f4a0348", + "41279b2f 41731d09 -> 3f5d023a", + "418fabb7 3e378657 -> bfd7096e", + "4140732e 3dc81e10 -> bf88e3e7", + "41818086 4144c4ee -> 3f8e0476", + "417027cb 40bc695a -> 3fc39048", + "4108cd33 4188b626 -> 3f418b43", + "418036b0 4054fc2d -> 4013ac29", + "41219a83 419fe12c -> 3f45ab46", + "3fa535a9 416013df -> 3dc60198", + "418ddd0e 4164524a -> 3f8a7634", + "419f07bb 4198c35d -> 3f81beae", + "41804a9b 40f049b3 -> 3fb02c42", + "3f2fd83f 3ed03b1f -> 3ed5bce4", + "408f5066 4096e9b8 -> 3f7778e8", + "4080c337 413b60d3 -> 3f10d9e0", + "4084fc4f 40696997 -> 3f8ceae5", + "40b0af73 40524e1a -> 3fb7d600", + "40ee937f 40d9f75e -> 3f860710", + "400f1dcd 4160ec80 -> 3e9be3e8", + "41451a1b 41308d3e -> 3f85deb0", + "41900d5c 41445988 -> 3f9392fc", + "4140241c 4081a080 -> 3fe36eeb", + "4130b649 3d68fa6b -> bf567c94", + "41807de5 41138e1a -> 3f9ff742", + "413f3309 4137fd96 -> 3f8203a4", + "416c3265 41717603 -> 3f7debc3", + "412e0fc3 4147d3ba -> 3f7200eb", + "4185b84d 40ac87cc -> 3fd5f5a5", + "40d0390f 40fe1150 -> 3f67699f", + "3fbfc788 40c7373a -> 3e62681e", + "41610c4a 414005cb -> 3f882ca7", + "4078e17d 40bbdec9 -> 3f446c37", + "40f7c867 41927571 -> 3f343b0e", + "40d125be 414bcfac -> 3f3cddb8", + "410ee546 414cb7aa -> 3f5be4d1", + "4119563d 406d3dea -> 3fdccbc5", + "40f88056 410fb33b -> 3f6f0a40", + "4110e9f2 41481919 -> 3f5f4d3f", + "40654d69 3e02e06f -> bf1ece20", + "40c5c979 41974325 -> 3f1ea038", + "411c03c0 416d5a20 -> 3f582bdb", + "412ef298 40bb0c25 -> 3fad66e2", + "4188c8ae 3edfe04a -> c05ba3f1", + "4182f793 414d4206 -> 3f8c3b27", + "40d2c433 41320ba5 -> 3f484793", + "40f22a02 41570a7e -> 3f4768c8", + "413e3643 40b7af02 -> 3fb5547e", + "4028e371 416dbd83 -> 3eb81ab1", + "41819407 418b4d19 -> 3f79846b", + "40baf125 400e4096 -> 400d6e72", + "415066d9 4127b25c -> 3f8bd6b3", + "419b1ab5 4045f661 -> 40280792", + "41861085 3f3cb46c -> c113e0f3", + "41355014 4108d1ad -> 3f90cb29", + "4104bbbf 40e80a08 -> 3f88b1f9", + "3feb6440 40943722 -> 3ecb7ae5", + "4110647f 413f84dd -> 3f62df35", + "412e9d49 4133bb97 -> 3f7cf13d", + "40259192 40bf395a -> 3f081cab", + "415dbb34 4105895d -> 3f9e974d", + "3f40e5c9 418da25f -> bdc9b0e3", + "405fccb3 40319f10 -> 3f9cfa80", + "4089fcf2 407c0aac -> 3f8878bc", + "418851dd 413573f0 -> 3f9575fe", + "4179bacd 4105df49 -> 3fa59199", + "414e4659 41638208 -> 3f768d33", + "41153274 41609332 -> 3f585e91", + "4161897c 417c790f -> 3f7587dd", + "4115c72d 41061f32 -> 3f86a58d", + "41891081 419868ae -> 3f76c848", + "40b64c9b 4175487a -> 3f232ad0", + "41058c0c 418a4572 -> 3f3e9c50", + "400bd446 413b3bcb -> 3ea2ad51", + "4199a423 408106b1 -> 4007a5ee", + "4133960e 413a43d2 -> 3f7c3112", + "40d5ddea 41975328 -> 3f2568dc", + "41507367 40ee4df1 -> 3fa3a7ee", + "41822bde 418ea956 -> 3f77dbd2", + "405266ce 4195929d -> 3ed01637", + "4157d2a3 4159a3a6 -> 3f7f2d91", + "4071deca 3fda08f0 -> 401fc120", + "4130a69b 417b091c -> 3f5f525e", + "40e9fc0c 40b40ee0 -> 3f936925", + "3fc44ae9 41152f5f -> 3e441c85", + "414a4e9d 41432a28 -> 3f81d6e0", + "3fe46d51 408b5885 -> 3ec99009", + "40facdcb 418f135c -> 3f36c458", + "414d8a57 41612c03 -> 3f772b28", + "40153360 410573f8 -> 3ecc4dcf", + "4150f561 419729ef -> 3f5fd32d", + "3ec75b34 4074ebd0 -> bf33ec78", + "414f974b 404149c4 -> 4014676d", + "4182b268 4174d54f -> 3f83122f", + "40b2b7dc 4189978d -> 3f1ac8d9", + "4194907c 40dc8389 -> 3fc1bd77", + "410916a9 40eb2d47 -> 3f89d8b4", + "415fe2fd 4120948e -> 3f92722e", + "40af1a30 40e932d1 -> 3f5b11e0", + "418c5c39 40b45383 -> 3fd41420", + "408419a2 3fe5c1b5 -> 401b1d6b", + "4040f9f3 4112d3e0 -> 3efeed01", + "410fe990 40a4f499 -> 3fab7312", + "411f2960 410b708f -> 3f87d22f", + "416db5c4 4101f015 -> 3fa4e986", + "4064f4fb 40a85684 -> 3f448b67", + "3fc81cd8 41101beb -> 3e502df4", + "40fe3de5 403601f6 -> 3ffdd284", + "401544dd 410b0036 -> 3ec89030", + "40e06b2d 415d609a -> 3f3dca32", + "418dfd8a 40f20436 -> 3fb5f798", + "41658c3d 41815c0c -> 3f74fefc", + "416876d7 412e6d23 -> 3f8f63e7", + "4142ba1a 4123702a -> 3f89a5f1", + "40823ca9 40e09e3a -> 3f386571", + "40945378 3f9b2300 -> 40ff3ec7", + "409247e6 411c40be -> 3f2aba0a", + "416fac20 40980dff -> 3fde4cd0", + "4081677a 408bd28a -> 3f728ebf", + "4185a992 411165b3 -> 3fa3526a", + "41863f84 419305ad -> 3f7801ca", + "415d34ba 40dca077 -> 3fae206c", + "413fa68b 41402bd7 -> 3f7fb878", + "419e6a24 41145048 -> 3faba1b5", + "3ed685b6 419bf2c8 -> be95f5d1", + "3fa8de57 41259aa0 -> 3df2d2c3", + "4134e861 40f67437 -> 3f981317", + "40623c62 4177d9ba -> 3eebedaf", + "416ef501 3ff554bf -> 4084fc98", + "4168bb92 4193fe33 -> 3f6ae7d0", + "41755160 4187d351 -> 3f76c864", + "40be660b 4071c696 -> 3fabbf22", + "4161a2b0 41410c5e -> 3f880463", + "4162a1a0 412a60ef -> 3f8f703c", + "3f97fee4 409e899e -> 3ddbe58d", + "419d4a56 41013e2c -> 3fb680b8", + "3f6262de 419a30c6 -> bd2a3004", + "3f9de6be 4148bd69 -> 3da9fb85", + "4186360a 3f9faff4 -> 414bfcea", + "415bc1c2 419576a6 -> 3f65187e", + "410202c9 405b25bc -> 3fd9dde2", + "4108a502 4147f86d -> 3f596706", + "412b9065 418339b4 -> 3f591916", + "417f36d5 40f77550 -> 3fad4e42", + "410f4d93 418d863c -> 3f4359b0", + "411e7f8b 410777f6 -> 3f896865", + "4191b755 40bfbb91 -> 3fcf7d94", + "41943acd 40cc3a49 -> 3fc99aa8", + "413126be 41288090 -> 3f82b8ac", + "40cdf204 3c53eaa4 -> bedb4096", + "419b22e2 417be3b3 -> 3f89ae2d", + "415dae77 3f910822 -> 41a8568d", + "408ccaa4 409c6517 -> 3f6f0abb", + "3fa3323c 418299db -> 3db2251e", + "410a6c2d 41506313 -> 3f57332d", + "408bce79 41673d25 -> 3f0d54f7", + "41847a58 416483a1 -> 3f871f6e", + "40e58868 41984db0 -> 3f2b3098", + "40e96781 419ff10c -> 3f29d29c", + "4189c9f6 40b3fd64 -> 3fd2f00b", + "414802e1 417996f4 -> 3f6b5d5f", + "416832af 41157f49 -> 3f993874", + "404be55c 413db3e5 -> 3eefe92a", + "418b0915 4185e107 -> 3f81b789", + "40d4c2ff 4103df67 -> 3f65eda5", + "40d86e7d 41877524 -> 3f2cf6e5", + "40ce08f5 41815528 -> 3f2b4fcf", + "418fd23c 4183dc90 -> 3f83f72f", + "410f9412 3d9c4edb -> bf5a56a0", + "407a142e 4182002f -> 3efa4750", + "3fa0e10f 41977317 -> 3d9f36f1", + "4124727d 418852a8 -> 3f525af4", + "40a0a8d5 3e6d45ed -> bf8d3e50", + "416e588a 4116c305 -> 3f9a22e8", + "406ba31f 41514bb0 -> 3f01c67c", + "4146361b 40342a79 -> 401ba025", + "40bb8f51 4194883f -> 3f1af658", + "40e96bc1 4175bf62 -> 3f3a3841", + "41217e08 40510173 -> 3ffa0abe", + "41641dea 40037406 -> 406c4722", + "4165865d 41802aa0 -> 3f75ce20", + "41047d85 418d6a1b -> 3f3c692c", + "4107b949 40077c4a -> 40367330", + "40c06318 41779a51 -> 3f27a3df", + "41655b94 406a19d6 -> 40036727", + "3fc1adb4 418cd8b9 -> 3e13dd54", + "40fc18bc 4151a970 -> 3f4d5f46", + "40848c77 4185d6b4 -> 3f012583", + "411870f3 3f879bfc -> 421c23ee", + "410cace7 4035e013 -> 4005353b", + "418d0551 4184f3c2 -> 3f82aeea", + "3d17ae54 407da4cd -> c0192f61", + "414b7225 4005eeb3 -> 405c6138", + "41944228 40ba645d -> 3fd412c9", + "417b165f 405ce6a0 -> 400e3c41", + "4111ef45 4169a23e -> 3f53112e", + "4152cc3d 3fbf61eb -> 40cd1d43", + "404e7781 4114d272 -> 3f0672c7", + "4083c5d2 40c5db5c -> 3f46e235", + "410db435 4088e2b4 -> 3fc01762", + "406fcd16 4173aaf9 -> 3ef859ee", + "418c40cb 4101b50f -> 3faf2d7f", + "3fa27488 418819a5 -> 3dac4370", + "419891de 41937701 -> 3f817ead", + "414f4a2d 3ef8baba -> c06312d8", + "4143f4d8 419746d0 -> 3f5a2c6a", + "41341c22 41709b51 -> 3f64a62c", + "417e6839 415ea10f -> 3f867c96", + "41967193 40c8b144 -> 3fcc8e19", + "40ee5faa 40d56ba0 -> 3f877581", + "409ac199 41049471 -> 3f3ecf4a", + "41178bd5 410e0876 -> 3f83ccf0", + "4166b55d 4129f4ed -> 3f908e05", + "4112acdc 409e8979 -> 3fb138ff", + "3fb9029f 41765678 -> 3e09f7f7", + "40cf7197 41001f45 -> 3f660098", + "40872e17 40e0b50a -> 3f3d4068", + "41410664 410dc1a9 -> 3f921d07", + "41130c58 410ac035 -> 3f837112", + "418271fa 4128f31c -> 3f979891", + "40c86e02 414bbbdd -> 3f389c3e", + "41744326 41168df4 -> 3f9ba18a", + "40726006 3f424205 -> c09a64d8", + "4014a942 40e59b91 -> 3edaf7dd", + "40df8f10 4146efd8 -> 3f4572c0", + "418ca2c1 4134c923 -> 3f975559", + "3ff06b9e 414795d0 -> 3e7fc668", + "4194eb80 3e03ca9e -> bfb68c1d", + "417f70ce 40284986 -> 4037657f", + "3fe536f9 414e48a5 -> 3e695b0f", + "40ba254d 3df10674 -> bf52aa32", + "418f5614 40cfe4b0 -> 3fc5642d", + "4104d29b 4052a5e7 -> 3fe36653", + "41254fa0 41895593 -> 3f5247b8", + "4170cb13 4161a423 -> 3f8324c2", + "40b67448 411cdde3 -> 3f4336b6", + "40e488dc 4191756a -> 3f2d84e7", + "41397733 40fc31a5 -> 3f97ebdf", + "3db64899 40e41004 -> bf9daaac", + "413b4382 4088c41d -> 3fd8c5f2", + "40d91474 4185033d -> 3f2e5b89", + "41398b97 41573f7a -> 3f715ff3", + "405a14e9 404b1aaf -> 3f87e2dd", + "41637987 416bb54c -> 3f7c9dc6", + "3fd3ec9f 41152653 -> 3e674790", + "417535f4 4161cdcb -> 3f83fca9", + "404759d8 41023726 -> 3f0abb11", + "4013e7c5 41763b50 -> 3e9ce4b5", + "40d1bed6 413fe812 -> 3f41bc54", + "4127997a 414fdaca -> 3f6a826f", + "412c49d0 41620c63 -> 3f65bf04", + "40541ea5 40852742 -> 3f5726f3", + "4185da26 3fc81d8a -> 40c9bf37", + "418df7ca 41889535 -> 3f81be91", + "418b709c 40f70e7c -> 3fb2ff39", + "40bf9f00 41012613 -> 3f5b65ca", + "40bf3d61 4088011d -> 3f9e26c6", + "3f1f10db 40c33215 -> be86bc9b", + "4149569b 40c22442 -> 3fb3cbf8", + "3ebc6f26 3f8bf26b -> c1333ac5", + "40f8a9ec 4126b39f -> 3f5ff7a2", + "412b3c42 3df38d7d -> bf8e7f56", + "40ab7e1d 4184f3bf -> 3f18ea27", + "411f8434 41407663 -> 3f6cad08", + "411d246a 3f73d0d3 -> c23b6503", + "40d7cbd4 3f83037e -> 42a407f3", + "3fbbb000 410a6bf8 -> 3e35a499", + "40f0e88b 4194636d -> 3f30f4de", + "413591df 40d0ae6d -> 3fa5d11b", + "40157118 3ff1190b -> 3fab6f00", + "4110b5ff 41357e27 -> 3f68208b", + "411d6a1a 419349de -> 3f48ed5a", + "40e8e8e1 4126de81 -> 3f58b99f", + "409be78d 416b16a1 -> 3f16d86f", + "40b5b58b 41336ba3 -> 3f37ee5e", + "3f4eb7b2 41719a4f -> bda14f95", + "3ffc7be9 4187aa3f -> 3e75bcdb", + "40b9c93a 41973909 -> 3f193030", + "40aadb56 40f6b557 -> 3f51f3fa", + "413cda36 4147dfa0 -> 3f7a3fea", + "4129d35e 40496bbd -> 4003dc45", + "4160033a 4151e8d6 -> 3f833bc6", + "4199dfb3 402f7a99 -> 403b9bae", + "416ecab6 418f3835 -> 3f6fdb14", + "412581dd 4176a94f -> 3f5aa8a4", + "412cb0af 410e1da4 -> 3f8b6b7f", + "412f755b 40832293 -> 3fd95360", + "3f23a1f2 41622926 -> be2d077a", + "419de449 4136a34d -> 3f9cc8b2", + "416c02bd 41365bba -> 3f8d90f0", + "418d2bad 414d3f85 -> 3f8fff43", + "4197ab0c 4121fcf5 -> 3fa2afbb", + "410ff94c 40844cb8 -> 3fc622e1", + "402acf1c 4168cf27 -> 3ebbb522", + "41871041 41764741 -> 3f8453dc", + "40308b90 419a085f -> 3eafa651", + "3fb6ed48 418f81a7 -> 3dfd4be3", + "40ac8d9f 40604863 -> 3fabfcb8", + "419dbf99 417fb0bb -> 3f89b520", + "4130a8a2 413e1f09 -> 3f786760", + "418bc4a1 40b19e6f -> 3fd5a27f", + "417770fe 409cb5ab -> 3fdca69d", + "419a9411 40cdcf37 -> 3fcba712", + "4050e5d3 3f6a2f76 -> c154837c", + "4190e5c8 416242a0 -> 3f8bf54f", + "4143daa5 40e32004 -> 3fa398e1", + "40c9a321 416cb90b -> 3f2ee5e5", + "41938646 410bee96 -> 3fac0828", + "410c14e4 40d507ba -> 3f927f27", + "418aa9f7 41941b12 -> 3f7a38c8", + "4141b5b5 40d9db51 -> 3fa66a81", + "4114dc31 409a9d7a -> 3fb53e0c", + "40c5d22e 4188acd4 -> 3f244f24", + "40f6305d 3fa27148 -> 4108ff86", + "416a979f 41536ee0 -> 3f852772", + "419df5ac 3d62dcc3 -> bf83f54f", + "407a8c07 419f6aca -> 3ee98933", + "408a1062 3f91d624 -> 41334eba", + "4176ed1b 419220d2 -> 3f7125cb", + "4111a1c6 402b14d1 -> 400fc026", + "414224e4 41690530 -> 3f6e8e27", + "41624e80 41036b3a -> 3fa10955", + "415edc39 4185f447 -> 3f6f469c", + "3f70636f 41875372 -> bcb64070", + "408a4b35 3fe0a149 -> 40268d76", + "41844b70 4127b467 -> 3f98d711", + "40bda8c2 405275a9 -> 3fbf5773", + "41842633 402aab07 -> 4036fe76", + "4193aead 410a9da6 -> 3facd925", + "4075f1e3 40915b64 -> 3f63b677", + "4143bda6 3f87b406 -> 422b673f", + "40bb81bf 419c8f6e -> 3f1831f5", + "3cf2ca6e 411e72b9 -> bfc46f89", + "41737ddb 40ca1828 -> 3fbd152c", + "41647229 40d6a7f6 -> 3fb2cd70", + "418fa2d0 415470fa -> 3f8eefa1", + "418efb4d 40111e42 -> 40616726", + "4082ba9c 3fc0b8ef -> 405c1bcf", + "414e2082 410695e8 -> 3f999f4b", + "408ae2fe 413fc3c1 -> 3f174d8e", + "4180c95f 40518c4b -> 4015f04f", + "417b23f9 41131512 -> 3f9edec7", + "41170556 417b1759 -> 3f50ba6d", + "408e15c0 418ee643 -> 3f0461b2", + "3fb4a97c 412ef1ca -> 3e13870e", + "4132d633 418f444e -> 3f562d01", + "412340b7 419503b0 -> 3f4b5088", + "40acc7ef 409e233c -> 3f871845", + "415d3fbd 4061fdad -> 40053fce", + "3e6a8d24 41818d39 -> bf077d94", + "3f66beb2 4155a2ca -> bd2426dc", + "409e0319 3f9d07a5 -> 40fa00a4", + "40bce6a8 411d69a3 -> 3f46ce22", + "406e8472 407e3810 -> 3f742ad3", + "40e49b26 414a5c9d -> 3f465f54", + "3fa845e7 40d6b971 -> 3e132724", + "3fc70dfb 4198c494 -> 3e194c07", + "400b1469 416382cb -> 3e95b34d", + "40feab42 3fabcda6 -> 40e18559", + "4104541a 412bdb54 -> 3f63d0cf", + "4079d5ad 41057421 -> 3f245e13", + "40cd54ea 4106ee44 -> 3f5f3035", + "41976bac 41266558 -> 3fa0bb6a", + "3ffa0e38 4002ec9b -> 3f6f8471", + "413488f8 3fc42f55 -> 40b598c2", + "3e061153 40f91673 -> bf7da30e", + "40dbb6a9 412038ba -> 3f56117a", + "41771a70 4157448e -> 3f86cabb", + "40da880d 4042fd50 -> 3fdcbc36", + "3f9e8181 414df86d -> 3dab5589", + "3f21c7c9 41872aa6 -> be263bad", + "41156769 413d21ab -> 3f678f7e", + "416c5fc6 41029299 -> 3fa42f8d", + "41732883 4198f23e -> 3f6c162a", + "419e8494 41689ea5 -> 3f8ece0f", + "41630c65 408848fd -> 3fea5159", + "419f1c37 407a408e -> 400c57da", + "41056fcc 41970508 -> 3f38d118", + "40a41cda 409c7afb -> 3f83d72e", + "41725770 412a5aec -> 3f9312e5", + "4197cdbd 418eec15 -> 3f82ad43", + "3c41cb70 41260f8b -> bff2bf12", + "416eb060 40c09e48 -> 3fc0b893", + "3ef7d79e 3e960cf5 -> 3f1754b3", + "4187393f 40c13134 -> 3fc94b8d", + "405c42db 410b5bf0 -> 3f122db0", + "40830250 4196fd9d -> 3ef5a7af", + "4161fde6 413b8821 -> 3f89b38a", + "41332562 4181e06f -> 3f5ddfee", + "3f58369d 40ff6c6a -> bda689d8", + "4145cc77 4142d78a -> 3f80c571", + "4127441e 41777932 -> 3f5b6268", + "4194036a 3f66ec1d -> c1e26b34", + "41479670 403ac0fd -> 4016d1f4", + "419436ea 410fcdf3 -> 3faa2a4d", + "419cc3f5 404a7255 -> 40255a76", + "400c7b2a 41998538 -> 3e883f6d", + "40f3a931 41563e29 -> 3f484d98", + "40d414d7 412dc34b -> 3f4afdde", + "3fc9d911 3eeac97a -> bf158f69", + "414ecf35 41830ab6 -> 3f6a5032", + "40254b75 409e4914 -> 3f17f141", + "4101a68e 417dcf88 -> 3f41c889", + "4141dbcf 416d7132 -> 3f6cc0c7", + "4099ed94 40c5f96c -> 3f5ca641", + "418503e6 4146c3a9 -> 3f8ecf04", + "414c4ab4 419f52ad -> 3f59f573", + "415134fa 41960c15 -> 3f607ea8", + "415e6fbc 41374fed -> 3f8a2770", + "4110a166 4191d6bf -> 3f422484", + "412a3af9 40b7ac10 -> 3fad34ea", + "418d92b6 414c1c2c -> 3f907469", + "416147b7 4030d235 -> 40268e92", + "3ffc055a 417dc62d -> 3e7b0140" + ] + }, + { + "function": "cycles_sqrt", + "node": "ShaderNodeMath SQRT", + "cases": [ + "00000000 -> 00000000", + "3f800000 -> 3f800000", + "bf800000 -> 00000000", + "3f000000 -> 3f3504f3", + "bf000000 -> 00000000", + "40000000 -> 3fb504f3", + "c0000000 -> 00000000", + "40400000 -> 3fddb3d7", + "c0300000 -> 00000000", + "3dcccccd -> 3ea1e89b", + "bdcccccd -> 00000000", + "40f00000 -> 402f456f", + "c0f00000 -> 00000000", + "33d6bf95 -> 39a5cb5f", + "b3d6bf95 -> 00000000", + "42c80000 -> 41200000", + "c2c80000 -> 00000000", + "461c4000 -> 42c80000", + "3e99999a -> 3f0c378c", + "3f333333 -> 3f562f5a", + "3ea9f54e -> 3f137e9d", + "419c52fb -> 408d7475", + "c036fbc8 -> 00000000", + "418be1cb -> 4085cf26", + "4138fd5d -> 40599e13", + "c04820c5 -> 00000000", + "41960f33 -> 408a976c", + "c0525240 -> 00000000", + "419b860e -> 408d179f", + "4173f9ce -> 4079ea64", + "416b7b0a -> 407586ab", + "418f6ad6 -> 40877d53", + "40aa017a -> 401383e5", + "404503ed -> 3fe09456", + "40bce870 -> 401b7ff9", + "415d671a -> 406e12e0", + "4138a7d8 -> 40596bbf", + "bcd09e27 -> 00000000", + "41584ad5 -> 406b4f61", + "414de6bf -> 40659695", + "414501fe -> 4060933c", + "bffe42fe -> 00000000", + "409fa6c7 -> 400ef3d0", + "402d6b33 -> 3fd2b3a1", + "3fe83b75 -> 3fac6959", + "410a6b31 -> 403c3e0c", + "4110896d -> 40405b88", + "403f4e4c -> 3fdd4d27", + "41178911 -> 4044f5a5", + "41361838 -> 4057e86c", + "417c6a06 -> 407e3365", + "416a1fbc -> 4074d159", + "bfe7a202 -> 00000000", + "401c714f -> 3fc81f8c", + "41796a5d -> 407cafb1", + "c010e3c0 -> 00000000", + "c033511f -> 00000000", + "4192fb95 -> 408929d3", + "418e44b2 -> 4086f21b", + "4021da29 -> 3fcb8dc8", + "3fb0df6e -> 3f96770a", + "418c2a50 -> 4085f1d1", + "40d88ed2 -> 40267dd1", + "be806335 -> 00000000", + "412d31b9 -> 405290b4", + "c0436b54 -> 00000000", + "4184e142 -> 40826ac9", + "4188fe8c -> 40846bbb", + "40d4c41a -> 40250705", + "40c7e1ab -> 401ff3de", + "4128944e -> 404fbdaf", + "41240ace -> 404ced25", + "4198d9b3 -> 408bdfd9", + "3faadd40 -> 3f93e320", + "c04bd517 -> 00000000", + "3f8d7c32 -> 3f8692e2", + "416547f5 -> 407245c2", + "41934e0f -> 40895049", + "41429d53 -> 405f34f8", + "4193b2d9 -> 40897f3b", + "40ed21a2 -> 402e3879", + "410a61a9 -> 403c3791", + "c0242a06 -> 00000000", + "417a999c -> 407d491f", + "41603e95 -> 406f98c2", + "c04b1c60 -> 00000000", + "40830090 -> 40017e0e", + "bf165dc6 -> 00000000", + "40d45552 -> 4024dc09", + "418021f3 -> 408010f8", + "c07227a4 -> 00000000", + "416f67ba -> 40779047", + "40ad113d -> 4014d66a", + "41677075 -> 407368fa", + "41367cc7 -> 40582401", + "bc964b41 -> 00000000", + "bff31e91 -> 00000000", + "41059451 -> 4038ec26", + "411267fe -> 404198f6", + "4128d0e5 -> 404fe301", + "be3bed6d -> 00000000", + "416d134b -> 40765b25", + "4064bb09 -> 3ff1fb42", + "4136afb2 -> 40584226", + "bfa70668 -> 00000000", + "bf8d058f -> 00000000", + "4181f987 -> 4080fbcc", + "419bb0e1 -> 408d2b0a", + "c096276c -> 00000000", + "418c1911 -> 4085e994", + "be96159c -> 00000000", + "3fb47571 -> 3f97fb8e", + "41794d55 -> 407ca0fc", + "419a1044 -> 408c6dab", + "410ff968 -> 403ffb9b", + "419b5d0a -> 408d0503", + "4098bc02 -> 400bd243", + "3fe832f8 -> 3fac6632", + "41748bfb -> 407a3537", + "418c9963 -> 408626d9", + "3ffcf5aa -> 3fb3f0f2", + "c0847482 -> 00000000", + "400bb44f -> 3fbd1d52", + "418f5f5f -> 408777e9", + "3fe52405 -> 3fab4294", + "418bf897 -> 4085da0d", + "3fb6a4d6 -> 3f98e668", + "3fd03a7e -> 3fa3421b", + "40cc0901 -> 40219b23", + "40e4eec2 -> 402b2eab", + "41492488 -> 4062eb6f", + "3eee7621 -> 3f2eb561", + "4026d04e -> 3fcea673", + "4164cefd -> 407205d0", + "3df4d400 -> 3eb10682", + "418da378 -> 4086a58e", + "418a65b9 -> 408518e1", + "c0978754 -> 00000000", + "3f9dcdc1 -> 3f8e1f6d", + "418cae4f -> 408630d4", + "41876bd9 -> 4083a88a", + "415310c3 -> 40687311", + "413f42ea -> 405d4691", + "3f8d6fe3 -> 3f868d07", + "411ac911 -> 40470f7a", + "418670e9 -> 40832e56", + "bfc1c29f -> 00000000", + "41569cac -> 406a64ef", + "c0405cbc -> 00000000", + "412187d1 -> 404b59f9", + "c024c88f -> 00000000", + "41810156 -> 4080806b", + "4170d309 -> 40784bd8", + "3f003fa5 -> 3f3531ef", + "c093f9c5 -> 00000000", + "41379bab -> 4058cda5", + "4001f949 -> 3fb668e0", + "c08985c9 -> 00000000", + "4196bd3d -> 408ae7b3", + "417fb28f -> 407fd945", + "c056ee2c -> 00000000", + "4196348b -> 408aa8a9", + "40803990 -> 40001cc5", + "4191710f -> 40887141", + "bf11b8a0 -> 00000000", + "3eca3af2 -> 3f20e3bf", + "41995dc6 -> 408c1c3a", + "410526f2 -> 4038a062", + "401c61f9 -> 3fc815bd", + "40d48117 -> 4024ed06", + "4098202e -> 400b8add", + "40c0c5c4 -> 401d1519", + "41521140 -> 4067e634", + "c099a95c -> 00000000", + "416a4ca3 -> 4074e8d1", + "c00e9be6 -> 00000000", + "4192c8d8 -> 40891224", + "c000ef39 -> 00000000", + "bdadfc26 -> 00000000", + "bf820986 -> 00000000", + "413cf48d -> 405bf007", + "405736da -> 3feab912", + "40d5aac4 -> 40256062", + "416a5ee1 -> 4074f25a", + "40cd507d -> 40221ca1", + "40ba5d9d -> 401a7334", + "417e67cc -> 407f3394", + "4180e895 -> 40807416", + "c076d6a3 -> 00000000", + "4151c9b5 -> 4067beb3", + "4112b277 -> 4041ca2d", + "bf45ac95 -> 00000000", + "4182b46d -> 40815867", + "40d6f14e -> 4025de90", + "bf94d006 -> 00000000", + "c01874fe -> 00000000", + "40e5d7ee -> 402b85c2", + "3f87fbb5 -> 3f83ee66", + "418b8711 -> 4085a3ba", + "c08fe249 -> 00000000", + "4183ee7f -> 4081f371", + "3e3a32ae -> 3eda53b6", + "41492962 -> 4062ee2b", + "3f0f5adc -> 3f3f91c8", + "40ac7272 -> 40149213", + "4075afe9 -> 3ffaca63", + "c037aee3 -> 00000000", + "40825e09 -> 40012da1", + "bef1ceb7 -> 00000000", + "4106820b -> 4039906a", + "405fcfd4 -> 3fef5d8f", + "4180cf8d -> 4080679d", + "4189ef74 -> 4084dff6", + "40765203 -> 3ffb1d11", + "3ff8a602 -> 3fb266b8", + "40e120dc -> 4029c108", + "407ddac1 -> 3ffeeccd", + "c030b9b0 -> 00000000", + "412d2a25 -> 40528c19", + "40f64a87 -> 40318db6", + "415d9433 -> 406e2b1e", + "c0831a17 -> 00000000", + "4110db5e -> 40409207", + "40a73139 -> 40124a1b", + "416648ff -> 4072cd69", + "40ab7a4d -> 40142707", + "4185440e -> 40829b3c", + "c0582ba5 -> 00000000", + "4161f8f7 -> 407084a3", + "416ec5de -> 40773c89", + "411356ec -> 404236ae", + "416792c6 -> 40737b05", + "417223e9 -> 4078f945", + "bf4a57fd -> 00000000", + "416833a6 -> 4073cf89", + "bfc770ee -> 00000000", + "3f57c4ec -> 3f6b067e", + "40c59914 -> 401f094a", + "4184c80a -> 40825e69", + "412700e1 -> 404ec488", + "bf4be6dd -> 00000000", + "3ff9fe29 -> 3fb2e204", + "40e7bf59 -> 402c3b41", + "410bfe51 -> 403d4f63", + "40a59865 -> 401196d2", + "4127f5bf -> 404f5be6", + "41539946 -> 4068be31", + "418d8367 -> 40869650", + "41613a38 -> 40701f0b", + "418df94b -> 4086ce53", + "3e4c96ff -> 3ee4db18", + "bf966575 -> 00000000", + "410bd420 -> 403d32da", + "411fab7a -> 404a2d46", + "416c2fcc -> 4075e4d5", + "41326e82 -> 4055b9ae", + "3e5bde38 -> 3eed3f46", + "4147f2b3 -> 40623eaa", + "3faeeae6 -> 3f95a18c", + "40d1045b -> 4023912a", + "41393350 -> 4059bdcc", + "c024c8b9 -> 00000000", + "c03b8d33 -> 00000000", + "4106018b -> 403937b2", + "3fbedf54 -> 3f9c4e6b", + "40ef3ad1 -> 402efd5f", + "c0994bce -> 00000000", + "40dafaae -> 40276b6e", + "40bcd29b -> 401b76fd", + "41926485 -> 4088e344", + "40835a36 -> 4001aa55", + "419075cb -> 4087fb32", + "4028ac0e -> 3fcfcc51", + "41901664 -> 4087ce44", + "c02b6a0c -> 00000000", + "408c56ff -> 40060729", + "417dd597 -> 407eea35", + "418473a3 -> 408234f3", + "c082594e -> 00000000", + "c07ba1b1 -> 00000000", + "4069d1be -> 3ff4a88e", + "41226186 -> 404be2d5", + "419ea5d0 -> 408e8097", + "417a05f2 -> 407cfe74", + "4179dd00 -> 407ce9bc", + "4172c711 -> 40794d19", + "413c83c9 -> 405bae5c", + "c07b5a5a -> 00000000", + "412eb917 -> 40537e16", + "416f7ce8 -> 40779b3a", + "bfa9058e -> 00000000", + "4164fb83 -> 40721d5b", + "40012292 -> 3fb5d1f6", + "3f971253 -> 3f8b0ee1", + "40afcac5 -> 4016012f", + "bf9881ca -> 00000000", + "c04553c2 -> 00000000", + "4185124d -> 408282d8", + "c018af61 -> 00000000", + "c09e3636 -> 00000000", + "411dab01 -> 4048e7cc", + "4192c93b -> 40891252", + "c070c1af -> 00000000", + "c052ca77 -> 00000000", + "3f4bb3cb -> 3f645be2", + "41400756 -> 405db813", + "c0886ee7 -> 00000000", + "4179901f -> 407cc2d1", + "410da0e2 -> 403e6993", + "c05a4557 -> 00000000", + "40ed894e -> 402e5e8a", + "4178c1d4 -> 407c5a43", + "4194c267 -> 4089fd67", + "41852596 -> 40828c4d", + "4197765e -> 408b3ce5", + "415445d4 -> 40691d04", + "c0976a94 -> 00000000", + "bfa3feab -> 00000000", + "419c8dec -> 408d8f1d", + "41567e70 -> 406a546b", + "415ac7a7 -> 406ca8cc", + "bfb5f1d6 -> 00000000", + "4137a793 -> 4058d4ac", + "c034ed26 -> 00000000", + "3f8c16e3 -> 3f85e889", + "4137cee1 -> 4058ebdf", + "411d2e1a -> 40489829", + "40e98cf7 -> 402ce674", + "40c4f4b4 -> 401ec716", + "40fa1922 -> 4032ebaa", + "bf2a54bf -> 00000000", + "417425c5 -> 407a00e8", + "416ce0d8 -> 407640ed", + "c05a725c -> 00000000", + "400939c8 -> 3fbb6ded", + "40bc7139 -> 401b4ee1", + "409b78a8 -> 400d118b", + "40577608 -> 3feadb83", + "4192b71f -> 408909de", + "418985b1 -> 4084acfc", + "3fca283a -> 3fa0dc4c", + "c04c7dbe -> 00000000", + "41586838 -> 406b5f5d", + "418fac52 -> 40879c3e", + "4199db96 -> 408c55a7", + "4097c3f6 -> 400b608b", + "40f9788a -> 4032b22f", + "3f4c5b72 -> 3f64b9c7", + "3e9b39bf -> 3f0cf4fd", + "412bef19 -> 4051cc3a", + "412fbee0 -> 40541c4b", + "418f0118 -> 40874b57", + "408eaeea -> 40072472", + "3fb22eb0 -> 3f970561", + "c04a737f -> 00000000", + "40838480 -> 4001bf33", + "40ced7dc -> 4022b6da", + "40774e21 -> 3ffb9d73", + "c072cdd9 -> 00000000", + "41727a3b -> 407925a2", + "41060eac -> 403940c4", + "41260090 -> 404e259e", + "410b6d8d -> 403ced68", + "c094aed0 -> 00000000", + "3fb073e6 -> 3f964946", + "3f2dc4ad -> 3f52e9f6", + "3eb998b0 -> 3f1a2185", + "3fd9ea72 -> 3fa7033d", + "413fb880 -> 405d8a8c", + "418e379b -> 4086ebe5", + "40c92f5f -> 4020792b", + "4190ed37 -> 4088335b", + "419ec213 -> 408e8d48", + "413a1b35 -> 405a45f3", + "beb7198d -> 00000000", + "bf8467fd -> 00000000", + "c011d805 -> 00000000", + "40e6579e -> 402bb560", + "c09648a5 -> 00000000", + "40e62476 -> 402ba24e", + "3f31d9f5 -> 3f5560a4", + "3e6e43c7 -> 3ef6f926", + "40f9b0c0 -> 4032c64f", + "419f1d6b -> 408eb644", + "41932fb0 -> 40894221", + "411ec2af -> 404999ae", + "40d5cf2e -> 40256e78", + "419f5408 -> 408ecec0", + "414ccf8a -> 4064fab6", + "3e764f52 -> 3efb1bb2", + "4174b521 -> 407a4a43", + "bd27edda -> 00000000", + "405abe5b -> 3feca3c4", + "4123c3c8 -> 404cc0c3", + "413dc54c -> 405c6962", + "408f3a88 -> 40076680", + "416f1681 -> 40776644", + "40c5fd10 -> 401f3181", + "417241f6 -> 407908b8", + "403c8abe -> 3fdbb26a", + "414f3f2f -> 4066564d", + "3f8fc80d -> 3f87a954", + "bfe45e9c -> 00000000", + "41961563 -> 408a9a47", + "407a7edc -> 3ffd3b9a", + "4118d734 -> 4045ce54", + "4164dc5b -> 40720ce2", + "411b41a9 -> 40475cf7", + "413a53b3 -> 405a6711", + "400b450e -> 3fbcd1f6", + "4097d643 -> 400b68f2", + "3f67176b -> 3f733a23", + "410dbe7b -> 403e7d78", + "410fc84a -> 403fdad8", + "bf238b12 -> 00000000", + "407cd3dd -> 3ffe68aa", + "403dbaa1 -> 3fdc6330", + "41636fff -> 40714be7", + "bf79a32a -> 00000000", + "c002bc7d -> 00000000", + "41689af7 -> 407405c0", + "40bb143f -> 401abecf", + "3fa82548 -> 3f92b4ba", + "4125326a -> 404da576", + "c01c7b6b -> 00000000", + "3f931178 -> 3f893409", + "41107ecb -> 40405475", + "c03a0b19 -> 00000000", + "419f7e27 -> 408ee19f", + "4134c57b -> 40571f3c", + "41802905 -> 40801481", + "415f2f8a -> 406f07c9", + "41537b6b -> 4068adc5", + "bfe28c58 -> 00000000", + "4164af2d -> 4071f4fc", + "c095d84f -> 00000000", + "bf553efc -> 00000000", + "4180a563 -> 40805297", + "40cba08f -> 402171c1", + "40f9efbd -> 4032dcdb", + "41958b9f -> 408a5a9b", + "418ea0ee -> 40871dd2", + "40b1aee8 -> 4016cf30", + "bda27c5c -> 00000000", + "404a5b3f -> 3fe39a70", + "4058f26f -> 3febaa7b", + "41999504 -> 408c3574", + "40c00f31 -> 401ccaa4", + "412df268 -> 405305b5", + "c00d0b68 -> 00000000", + "413634cc -> 4057f95c", + "41913683 -> 408855c8", + "4162d23c -> 4070f828", + "be0214a0 -> 00000000", + "4081b170 -> 4000d802", + "41846bf9 -> 4082312e", + "c001b72f -> 00000000", + "c0994ccd -> 00000000", + "4180aacf -> 4080554b", + "40ad24d1 -> 4014ded5", + "4146700d -> 40616380", + "416c5f33 -> 4075fd81", + "c02f91af -> 00000000", + "40b85791 -> 40199bf4", + "418be352 -> 4085cfe1", + "418b6bb6 -> 408596a0", + "409af2ac -> 400cd4b4", + "4158257e -> 406b3b11", + "4127a61c -> 404f2ab8", + "406ebc1f -> 3ff7377d", + "4047d7d5 -> 3fe22f76", + "4114560e -> 4042de8c", + "416010d6 -> 406f8050", + "4172577f -> 407913c9", + "419c3e07 -> 408d6af9", + "40084d2d -> 3fbacc12", + "40735bb5 -> 3ff9995e", + "c07fb4af -> 00000000", + "bfc8538f -> 00000000", + "3ef5c737 -> 3f315e5a", + "4116390c -> 40441acd", + "40b1efcc -> 4016eab7", + "419efb30 -> 408ea6ea", + "c03fb500 -> 00000000", + "befeb7e0 -> 00000000", + "40edb1d7 -> 402e6d6a", + "4173a980 -> 4079c140", + "c0958271 -> 00000000", + "c08e3eec -> 00000000", + "40ec8d6d -> 402e01ff", + "408e662a -> 400701f9", + "418d6eee -> 40868c93", + "412bb8cd -> 4051ab16", + "416cd34c -> 407639e2", + "414604ed -> 406126a1", + "403557c7 -> 3fd77637", + "414cfdce -> 40651492", + "bf3937f9 -> 00000000", + "41677e0e -> 40737020", + "41663698 -> 4072c3b5", + "407dec3c -> 3ffef593", + "3fa3f5f9 -> 3f90de6e", + "4175bd4b -> 407ad137", + "bfbabdfe -> 00000000", + "401b7676 -> 3fc77eda", + "c018e194 -> 00000000", + "419f7bd9 -> 408ee097", + "408e751e -> 40070910", + "4191d3d9 -> 40889f90", + "40ae6666 -> 401568d5", + "41080b4f -> 403a9eea", + "c08abfb5 -> 00000000", + "4179b91e -> 407cd793", + "418d0e02 -> 40865e71", + "3e869e64 -> 3f034485", + "bec4e4a4 -> 00000000", + "41243ef7 -> 404d0db6", + "408ee3e5 -> 40073d86", + "bfe81301 -> 00000000", + "4068b4d3 -> 3ff41351", + "40e512e3 -> 402b3c2c", + "c00e5e7b -> 00000000", + "414820c1 -> 406258b7", + "4142fe79 -> 405f6ca7", + "c09b5157 -> 00000000", + "3fd3de7e -> 3fa4ade1", + "419148be -> 40885e57", + "bf12040f -> 00000000", + "4051aecd -> 3fe7afd6", + "c0777c81 -> 00000000", + "411615f2 -> 404403e2", + "417076ab -> 40781c36", + "40c4110b -> 401e6b38", + "4137ce62 -> 4058eb94", + "402ec9da -> 3fd3883b", + "4172a331 -> 40793aac", + "41728e56 -> 40792ff6", + "c0770bab -> 00000000", + "c022d78b -> 00000000", + "400bb523 -> 3fbd1de2", + "c06b08c5 -> 00000000", + "4197f5a0 -> 408b7757", + "41836a70 -> 4081b257", + "4108b734 -> 403b14ab", + "402d799a -> 3fd2bc61", + "4021d638 -> 3fcb8b4d", + "c00d58ce -> 00000000", + "4191de53 -> 4088a478", + "4167b7d6 -> 40738e80", + "40f7b0b7 -> 40320ea3", + "41913a46 -> 4088578c", + "41641763 -> 4071a4a2", + "411aa883 -> 4046fa8a", + "41374323 -> 4058995a", + "c08434fe -> 00000000", + "411ee9b6 -> 4049b274", + "40e3e4da -> 402acb24", + "bff092be -> 00000000", + "c01a2c40 -> 00000000", + "bf98f3af -> 00000000", + "41984112 -> 408b99f2", + "41757638 -> 407aacef", + "40eb4396 -> 402d8884", + "c0082e3a -> 00000000", + "c09da253 -> 00000000", + "41833742 -> 40819913", + "4164503f -> 4071c2bf", + "418bfe23 -> 4085dcb4", + "4085ba1c -> 4002d509", + "408e1662 -> 4006dc22", + "410759e1 -> 403a2510", + "4182010b -> 4080ff86", + "40c85678 -> 40202293", + "410a68ff -> 403c3c8e", + "40a3f177 -> 4010dc70", + "c02f5545 -> 00000000", + "416e031a -> 4076d79e", + "417ef937 -> 407f7c7a", + "413bafb0 -> 405b32a5", + "41789163 -> 407c41b0", + "c0007249 -> 00000000", + "c0604615 -> 00000000", + "c088ab16 -> 00000000", + "4131923a -> 40553598", + "bfb64d0e -> 00000000", + "4181157d -> 40808a74", + "4121f665 -> 404b9f88", + "41749903 -> 407a3be2", + "bfb24f00 -> 00000000", + "413523fe -> 40575771", + "419e0f7d -> 408e3d04", + "418d2ae7 -> 40866c33", + "c036b570 -> 00000000", + "4096d57b -> 400af2de", + "418e2174 -> 4086e163", + "41687c8d -> 4073f5cc", + "404603ad -> 3fe125eb", + "3f9adf31 -> 3f8ccbda", + "c017d2c9 -> 00000000", + "c09c7814 -> 00000000", + "3fb45040 -> 3f97ebe4", + "40d4237a -> 4024c8af", + "405d3cab -> 3fedfc0e", + "4122a710 -> 404c0e78", + "c041b729 -> 00000000", + "4052c002 -> 3fe84695", + "417fab8a -> 407fd5c2", + "bf045a65 -> 00000000", + "412680e1 -> 404e753b", + "400d5d2b -> 3fbe3c09", + "41125494 -> 40418c1f", + "414bce02 -> 40646a93", + "40941504 -> 4009ace5", + "415b0ad4 -> 406ccd1e", + "c069539c -> 00000000", + "3ed4cc58 -> 3f250a38", + "c096a530 -> 00000000", + "40ea5fa3 -> 402d345e", + "40ad1f5e -> 4014dc7d", + "40df588c -> 402914a7", + "4107dbb3 -> 403a7e40", + "bfdd2d66 -> 00000000", + "412e3db7 -> 4053335e", + "40224d2d -> 3fcbd60e", + "bfc7e2e2 -> 00000000", + "c08393c7 -> 00000000", + "411e0347 -> 40492002", + "41042cfa -> 4037f2c4", + "40d582a3 -> 402550d9", + "c044312d -> 00000000", + "c08d01cc -> 00000000", + "414c2792 -> 40649cbe", + "41214d5b -> 404b352a", + "414fbd18 -> 40669c3a", + "41697b20 -> 40747b39", + "3ef16b5f -> 3f2fc9ec", + "c0949c9d -> 00000000", + "bfa851a1 -> 00000000", + "bf4f2b2f -> 00000000", + "c02e7f7b -> 00000000", + "4158e65c -> 406ba3ec", + "40aeb73f -> 40158b73", + "4189de7f -> 4084d7cb", + "bc883867 -> 00000000", + "415115ba -> 40675b35", + "40bf5b60 -> 401c812d", + "415859b8 -> 406b577a", + "412c65bf -> 40521491", + "40b86534 -> 4019a1a2", + "bf572ba4 -> 00000000", + "41154a24 -> 40437e9e", + "bf58d2eb -> 00000000", + "c09d7119 -> 00000000", + "bf9a984d -> 00000000", + "bfc6a43d -> 00000000", + "4037edd3 -> 3fd8fe20", + "418a097a -> 4084ec7f", + "418aebb7 -> 40855940", + "403fc39e -> 3fdd90f8", + "418db2c7 -> 4086acd5", + "419d5034 -> 408de6d8", + "40d01b5b -> 402335e5", + "40906d8c -> 4007f751", + "418d95d3 -> 40869f12", + "41810354 -> 40808169", + "3f76fbe5 -> 3f7b739a", + "40f4f049 -> 403110bc", + "bf6ba71c -> 00000000", + "41798647 -> 407cbdd4", + "40df4409 -> 40290ce3", + "41687a27 -> 4073f48a", + "c0903d2b -> 00000000", + "4159149a -> 406bbd09", + "40e1632c -> 4029da06", + "40db2a0d -> 40277d89", + "40a7adcd -> 40128091", + "415f39ef -> 406f0d5a", + "4167d631 -> 40739e73", + "413e636f -> 405cc525", + "41710f98 -> 40786b0e", + "40be2936 -> 401c03c7", + "40d22610 -> 4024025e", + "bf165ee1 -> 00000000", + "3fddc06a -> 3fa879e4", + "41688eda -> 4073ff66", + "41668ba7 -> 4072f08a", + "bf1a0c07 -> 00000000", + "409d366f -> 400ddb38", + "bfbfc126 -> 00000000", + "40e1e00e -> 402a090e", + "c097e3c5 -> 00000000", + "bf88e1e3 -> 00000000", + "40f7f761 -> 40322807", + "bed36f0a -> 00000000", + "c028f750 -> 00000000", + "416bfe97 -> 4075cb36", + "41848433 -> 40823d17", + "418294ee -> 408148d1", + "41770a47 -> 407b7aed", + "41370ad0 -> 4058780e", + "418b5851 -> 40858d55", + "41823352 -> 40811876", + "415e11a8 -> 406e6e81", + "41541206 -> 40690090", + "40264427 -> 3fce4f92", + "c0898e21 -> 00000000", + "40ed90fc -> 402e615c", + "beacbc74 -> 00000000", + "416fbd26 -> 4077bc6e", + "4002e1b0 -> 3fb70bac", + "41829d04 -> 40814cd1", + "405ee68d -> 3feee0b0", + "3fe0e7c7 -> 3fa9ab81", + "414ab4f4 -> 4063ccdd", + "4132c8c1 -> 4055efb3", + "bfec8823 -> 00000000", + "4102b098 -> 4036e954", + "41873137 -> 40838c07", + "4138e033 -> 40598cea", + "4173d60d -> 4079d814", + "3ffa381a -> 3fb2f6bd", + "c08b04d9 -> 00000000", + "c0512e60 -> 00000000", + "4189057d -> 40846f16", + "c0581ca1 -> 00000000", + "4137da02 -> 4058f270", + "4106a6eb -> 4039a9d8", + "bfc819a9 -> 00000000", + "40ad85d7 -> 40150885", + "4120331d -> 404a8313", + "419f2107 -> 408eb7e3", + "c09f152f -> 00000000", + "41438f7f -> 405fbfad", + "3f3cf312 -> 3f5bef2a", + "c06ebb56 -> 00000000", + "41911401 -> 40884594", + "4169e24a -> 4074b136", + "c0373f5e -> 00000000", + "40c220ad -> 401da231", + "40916a9b -> 40086e3a", + "c0861aa0 -> 00000000", + "418a6b26 -> 40851b7d", + "41769168 -> 407b3d60", + "3dc44317 -> 3e9e7f6e", + "40ee7c9b -> 402eb7c0", + "4125f7de -> 404e2038", + "415838cf -> 406b4593", + "3f18e7f0 -> 3f45d928", + "414534a5 -> 4060b019", + "4198ad5b -> 408bcb8d", + "c09c9bcd -> 00000000", + "40d4ffdb -> 40251e30", + "be1aca9b -> 00000000", + "bf1eb7fe -> 00000000", + "416a4bad -> 4074e851", + "41313031 -> 4054fab5", + "404c82f1 -> 3fe4cfe1", + "40b3dab5 -> 4017ba57", + "4147247a -> 4061c9df", + "41355b3a -> 40577844", + "3fb4c765 -> 3f981e0d", + "c080eedf -> 00000000", + "40e3ae55 -> 402ab6b5", + "414c9e6e -> 4064df41", + "4174e9a4 -> 407a651d", + "c03fc8ee -> 00000000", + "3f929076 -> 3f88f7ce", + "419fde7e -> 408f0cc0", + "40f2935f -> 4030358f", + "408a9f10 -> 40053471", + "c08a446a -> 00000000", + "418fa6b5 -> 40879998", + "bfa3f245 -> 00000000", + "4106620e -> 40397a58", + "417a4496 -> 407d1e24", + "417b66b3 -> 407db0af", + "3f09d93d -> 3f3bdab3", + "c01dac4c -> 00000000", + "40f8db6c -> 403279e0", + "4163aa54 -> 40716ad6", + "417bd594 -> 407de89a", + "418eb7ae -> 40872898", + "bf2ad6dc -> 00000000", + "413c5de6 -> 405b9848", + "c087bb0c -> 00000000", + "40099e23 -> 3fbbb26a", + "411a7cc6 -> 4046de65", + "401ef6e5 -> 3fc9bad1", + "c08c5ee2 -> 00000000", + "4161677b -> 4070372a", + "c01b7ab1 -> 00000000", + "404b015e -> 3fe3f7c9", + "419f13f8 -> 408eb207", + "4192ec26 -> 4089229f", + "c09fa264 -> 00000000", + "40db855a -> 4027a069", + "419bd459 -> 408d3b1e", + "4092a1f3 -> 4008fffa", + "40d88016 -> 40267827", + "bf970c74 -> 00000000", + "3fe17773 -> 3fa9e1aa", + "415861c2 -> 406b5bd9", + "40924bbe -> 4008d7ae", + "41913977 -> 4088572b", + "419f7c51 -> 408ee0cd", + "417a9965 -> 407d4903", + "40862843 -> 40030ae0", + "416bb316 -> 4075a3e1", + "41123ae9 -> 40417b25", + "414b089c -> 4063fbda", + "c001bc8f -> 00000000", + "418e9c6d -> 40871bb0", + "bdbf9669 -> 00000000", + "41167aab -> 4044459d", + "bfe42a3d -> 00000000", + "416aa14b -> 4075150c", + "4088e1b1 -> 40045dc8", + "41036596 -> 403767d0", + "40187ab4 -> 3fc59270", + "4191a5d4 -> 40888a00", + "40508f08 -> 3fe710a3", + "40162eb0 -> 3fc41409", + "40377a80 -> 3fd8ba0f", + "415ba585 -> 406d20ad", + "bf515779 -> 00000000", + "417f5e71 -> 407faf2c", + "41809cba -> 40804e45", + "c0454893 -> 00000000", + "41841615 -> 408206ef", + "40422c3c -> 3fdef414", + "416171b4 -> 40703c9d", + "414c6a17 -> 4064c1f9", + "415811e9 -> 406b3068", + "40303386 -> 3fd462a4", + "40f6d7e3 -> 4031c0a2", + "411f014e -> 4049c16c", + "40e42127 -> 402ae1bb", + "40c4260c -> 401e73b4", + "4143a981 -> 405fce8d", + "41907615 -> 4087fb55", + "41468228 -> 40616dc8", + "402b0690 -> 3fd13e2a", + "40e5c18b -> 402b7d67", + "c06522c2 -> 00000000", + "3e7df39c -> 3efef947", + "c04f28f0 -> 00000000", + "413debcc -> 405c7fbd", + "c08c2fab -> 00000000", + "be348fed -> 00000000", + "4068573e -> 3ff3e238", + "417282db -> 40792a10", + "4103a100 -> 40379143", + "c04d31a0 -> 00000000", + "40bf9fd8 -> 401c9d2a", + "413640d6 -> 4058007f", + "3fe41c1f -> 3faadfd9", + "c084281a -> 00000000", + "c090a187 -> 00000000", + "416eb76e -> 4077350f", + "4091c510 -> 400898a3", + "416bd44b -> 4075b52e", + "40c31ec7 -> 401e093a", + "c00b4044 -> 00000000", + "41826c73 -> 408134c5", + "40cc9118 -> 4021d100", + "c095fe89 -> 00000000", + "419d75b5 -> 408df7c1", + "417a4e9b -> 407d2335", + "4131e002 -> 40556445", + "3d239e8e -> 3e4ca97c", + "40e2c271 -> 402a5e2f", + "40972160 -> 400b15ce", + "bfe6eea5 -> 00000000", + "40447066 -> 3fe04031", + "bfa3415b -> 00000000", + "bf6b6fd1 -> 00000000", + "4133e8fe -> 40569be3", + "4077245e -> 3ffb8834", + "418e9cae -> 40871bcf", + "40fe425b -> 4034671f", + "415ca1db -> 406da8bc", + "4190dfec -> 40882d1c", + "417bbbe5 -> 407ddba7", + "40719007 -> 3ff8ad32", + "3e8fc628 -> 3f07a86f", + "41453f4c -> 4060b62a", + "419eea78 -> 408e9f69", + "401bd2c3 -> 3fc7ba0a", + "41711584 -> 40786e1b", + "c05a1809 -> 00000000", + "40db29ed -> 40277d7d", + "40a7bf85 -> 4012884f", + "414a418f -> 40638bfd", + "4110b0b1 -> 404075a7", + "419f2fc9 -> 408ebe81", + "40a95a61 -> 40133b54", + "4185586c -> 4082a537", + "41942a6e -> 4089b6d9", + "4062be22 -> 3ff0ed7b", + "40f60444 -> 40317460", + "41969ba1 -> 408ad836", + "413aaab9 -> 405a9a0c", + "416aca17 -> 40752a5a", + "41074438 -> 403a162b", + "4135537a -> 405773a9", + "c04d91f4 -> 00000000", + "bf8be119 -> 00000000", + "bfa8a76d -> 00000000", + "41946140 -> 4089d051", + "c073e2b1 -> 00000000", + "41544449 -> 40691c2b", + "418f9fa8 -> 40879644", + "412ae7d5 -> 40512b5d", + "419c7274 -> 408d82b1", + "41862d26 -> 40830d43", + "401f40d2 -> 3fc9e9b4", + "414ab5ab -> 4063cd44", + "41812cdb -> 40809616", + "c020ae86 -> 00000000", + "40d2ba5a -> 40243c31", + "4176c779 -> 407b58ea", + "c025501c -> 00000000", + "3fe260ba -> 3faa3976", + "3fd27349 -> 3fa4207d", + "4042a2c7 -> 3fdf3819", + "415cbd86 -> 406db7a2", + "41616a7c -> 407038c4", + "3f2fcf54 -> 3f542639", + "40afd53c -> 401605a5", + "bfa6760d -> 00000000", + "bf63180c -> 00000000", + "bfafd62a -> 00000000", + "40d1bec0 -> 4023da08", + "413f04d6 -> 405d22a5", + "41315079 -> 40550e1b", + "bfb8459d -> 00000000", + "405d498f -> 3fee02fd", + "c08f5110 -> 00000000", + "4179e58f -> 407cee11", + "419f5cbb -> 408ed2a6", + "4117e891 -> 404533ac", + "40bff13b -> 401cbe69", + "40b46d1d -> 4017f80c", + "c07ff7a5 -> 00000000", + "40f4bb06 -> 4030fd7a", + "4186cb91 -> 40835a89", + "bfba69a4 -> 00000000", + "3fdcba50 -> 3fa81635", + "41873dce -> 40839227", + "4182d962 -> 40816aaf", + "3f525982 -> 3f680e12", + "40b034da -> 40162e6a", + "40867d28 -> 4003344f", + "40ce568d -> 402283f5", + "414ebedc -> 40660ef2", + "411eeb2e -> 4049b362", + "bf76d0ce -> 00000000", + "415648ab -> 406a370a", + "413afadd -> 405ac8f4", + "40e21a2b -> 402a1eec", + "40686d7b -> 3ff3ede4", + "40eacad8 -> 402d5bf6", + "c020b871 -> 00000000", + "40e0f61d -> 4029b0e9", + "4176c284 -> 407b5663", + "40c6807c -> 401f664e", + "4154b5e5 -> 40695a84", + "4034d3be -> 3fd727b8", + "40b81642 -> 401980bc", + "40b02513 -> 401627b1", + "4118e3e7 -> 4045d68c", + "40a8497f -> 4012c486", + "419c1054 -> 408d5649", + "4047cd86 -> 3fe229a0", + "4179a17f -> 407ccb9d", + "4092ef44 -> 40092414", + "40ab0fe6 -> 4013f909", + "c047f94e -> 00000000", + "c03c148c -> 00000000", + "400110f4 -> 3fb5c58f", + "3f496096 -> 3f630d4c", + "412a5883 -> 4050d396", + "4167fda2 -> 4073b32c", + "c09074b0 -> 00000000", + "c03eb69f -> 00000000", + "41101069 -> 40400af0", + "4194092b -> 4089a763", + "4163cb40 -> 40717c4a", + "41847e1c -> 40823a18", + "3fe8c4f8 -> 3fac9c5d", + "40c55d1e -> 401ef127", + "413ca4b7 -> 405bc18b", + "c088d267 -> 00000000", + "bfef715a -> 00000000", + "408f4e65 -> 40076fe3", + "40a2d665 -> 40105f2a", + "419e1146 -> 408e3dd1", + "3f48c103 -> 3f62b345", + "4060b529 -> 3fefd813", + "41996254 -> 408c1e4f", + "40d4f95b -> 40251bab", + "c024a21a -> 00000000", + "c009cc00 -> 00000000", + "412250b6 -> 404bd846", + "c09b6cb5 -> 00000000", + "418a08fb -> 4084ec41", + "41928693 -> 4088f330", + "3f9878e8 -> 3f8bb388", + "4195a357 -> 408a6594", + "41656d56 -> 40725980", + "c027ca9f -> 00000000", + "41478140 -> 4061fe71", + "40d16d94 -> 4023ba50", + "416cd596 -> 40763b13", + "40ef6022 -> 402f0b05", + "414db4de -> 40657ac4", + "4115684d -> 4043925d", + "409ea210 -> 400e7ee8", + "418ce2cc -> 408649da", + "41849f3a -> 40824a5e", + "41859b28 -> 4082c5e3", + "4184f6e9 -> 40827569", + "c07d2f4a -> 00000000", + "41770496 -> 407b7807" + ] + }, + { + "function": "cycles_inverse_sqrt", + "node": "ShaderNodeMath INVERSE_SQRT", + "cases": [ + "00000000 -> 00000000", + "3f800000 -> 3f800000", + "bf800000 -> 00000000", + "3f000000 -> 3fb504f3", + "bf000000 -> 00000000", + "40000000 -> 3f3504f3", + "c0000000 -> 00000000", + "40400000 -> 3f13cd3a", + "c0300000 -> 00000000", + "3dcccccd -> 404a62c2", + "bdcccccd -> 00000000", + "40f00000 -> 3ebaf4ba", + "c0f00000 -> 00000000", + "33d6bf95 -> 4545a472", + "b3d6bf95 -> 00000000", + "42c80000 -> 3dcccccd", + "c2c80000 -> 00000000", + "461c4000 -> 3c23d70a", + "3e99999a -> 3fe9b1e8", + "3f333333 -> 3f98fd40", + "4103d730 -> 3eb25cff", + "bff6ed1d -> 00000000", + "bf5829f1 -> 00000000", + "408aa88e -> 3ef5f6d4", + "c03eafc1 -> 00000000", + "415b6f19 -> 3e8a410d", + "bf1f03bb -> 00000000", + "c003a3a5 -> 00000000", + "418b9aee -> 3e7520f3", + "41295670 -> 3e9d619f", + "3ff728b0 -> 3f383a7e", + "4177d994 -> 3e821666", + "409b5af5 -> 3ee85ef9", + "4128e091 -> 3e9d9881", + "c018ec22 -> 00000000", + "416f9f90 -> 3e844d3c", + "41228a0d -> 3ea0a391", + "41221cb0 -> 3ea0d9b7", + "412795ab -> 3e9e33cb", + "419d15b3 -> 3e671699", + "c00d99e5 -> 00000000", + "419ebba4 -> 3e65e2a9", + "41183ddd -> 3ea5fb9c", + "bff49fc7 -> 00000000", + "3f35095a -> 3f983616", + "c077c885 -> 00000000", + "4197d83c -> 3e6b0ab5", + "4196fbba -> 3e6bb61b", + "41643a83 -> 3e87906e", + "bed9c088 -> 00000000", + "41436e51 -> 3e927fa1", + "c03ddd87 -> 00000000", + "40caa486 -> 3ecb75d0", + "c083804d -> 00000000", + "c06aaec7 -> 00000000", + "40512f32 -> 3f0d99c6", + "c086d476 -> 00000000", + "412da544 -> 3e9b6ab7", + "4146f435 -> 3e913218", + "411bfdd0 -> 3ea3f9c9", + "41236d8e -> 3ea0339a", + "c03bca84 -> 00000000", + "41698d69 -> 3e86029b", + "3e9bd406 -> 3fe804a4", + "c0395b62 -> 00000000", + "408a036a -> 3ef689d0", + "40cc22b7 -> 3ecab700", + "40549262 -> 3f0c77c9", + "40f095f6 -> 3ebaba6d", + "40fbd479 -> 3eb6830d", + "410a4390 -> 3eae2bbe", + "410a7994 -> 3eae09c3", + "4117682b -> 3ea67095", + "416936bb -> 3e861b81", + "4136d8da -> 3e9774b0", + "413afd26 -> 3e95c4e1", + "418e03c9 -> 3e730a4d", + "418f95b3 -> 3e71b536", + "418b3020 -> 3e757eed", + "419fa478 -> 3e653ac9", + "40df97dc -> 3ec1b19b", + "4153c227 -> 3e8cbcc8", + "40aa00e1 -> 3ede2271", + "4189907b -> 3e76f0b7", + "419731fc -> 3e6b8bcb", + "400e51b3 -> 3f2babea", + "41178581 -> 3ea66077", + "3f21f3f0 -> 3fa0edf2", + "c05fe20f -> 00000000", + "414b4c05 -> 3e8fa2ec", + "40cae5d0 -> 3ecb5512", + "41861975 -> 3e7a1c38", + "4188c3b8 -> 3e77a94e", + "4072627d -> 3f038bc1", + "41445c70 -> 3e9226b2", + "415d24c6 -> 3e89b7f9", + "40155c41 -> 3f279380", + "4181b848 -> 3e7e4c1b", + "bee3c67e -> 00000000", + "418ba698 -> 3e7516b5", + "418ae3d6 -> 3e75c24f", + "3fca7d78 -> 3f4b896f", + "3fa1049a -> 3f643f98", + "c04f48fb -> 00000000", + "40577fc9 -> 3f0b82b6", + "4180a17b -> 3e7f5f1d", + "3f952303 -> 3f6d2a85", + "4092c85e -> 3eef0f73", + "418f825c -> 3e71c580", + "3f24c187 -> 3f9f8dfc", + "4125e2ba -> 3e9f02aa", + "40c52284 -> 3ece486e", + "404726b0 -> 3f111fb0", + "4117ba4e -> 3ea64381", + "418a7537 -> 3e762469", + "bf3f2017 -> 00000000", + "408b2cea -> 3ef581c2", + "4187c594 -> 3e7890ac", + "417e0f1b -> 3e807cef", + "bfc26988 -> 00000000", + "41894aca -> 3e772f5c", + "4172bcd2 -> 3e837344", + "c0953e0f -> 00000000", + "408ef0c1 -> 3ef24084", + "3f65ad91 -> 3f8722c0", + "4156c2bd -> 3e8bc010", + "40ec4999 -> 3ebc6b40", + "413cc2e2 -> 3e951073", + "415b0b46 -> 3e8a608a", + "41910d8f -> 3e707b43", + "bc81189c -> 00000000", + "40f79ff1 -> 3eb80e1d", + "4083e592 -> 3efc30a4", + "41073d2c -> 3eb01ba5", + "417ebbbc -> 3e80515e", + "c0898e31 -> 00000000", + "40957853 -> 3eece6cc", + "4195ce7b -> 3e6ca2a4", + "409177e8 -> 3ef0234a", + "41880d54 -> 3e784f18", + "419a7eb0 -> 3e690465", + "4108d66f -> 3eaf1384", + "4164d492 -> 3e8762c4", + "4104169b -> 3eb23228", + "416dc49f -> 3e84d11e", + "c03f08bf -> 00000000", + "40f6fab3 -> 3eb84ba4", + "4173bea7 -> 3e832dac", + "3feb17bc -> 3f3ce5aa", + "41986b8b -> 3e6a9906", + "3ed2bc37 -> 3fc783f0", + "41124ff3 -> 3ea9500d", + "40ace647 -> 3edc442c", + "418f866c -> 3e71c214", + "419963a9 -> 3e69dafc", + "4135f254 -> 3e97d484", + "419fac08 -> 3e65355b", + "419702a1 -> 3e6bb0b7", + "c08ba66a -> 00000000", + "405f212c -> 3f091ab9", + "40b91a2b -> 3ed4e1d1", + "4060bca4 -> 3f089cfd", + "4006d04f -> 3f3062b1", + "41989a9f -> 3e6a74d3", + "be1bf397 -> 00000000", + "419320c9 -> 3e6ec792", + "3fc16e8f -> 3f503f80", + "41404f0d -> 3e93aed7", + "41239c25 -> 3ea01cca", + "bfc3890d -> 00000000", + "4109b416 -> 3eae8663", + "4147f834 -> 3e90d395", + "40c24818 -> 3ecfcac9", + "418eaaca -> 3e727be4", + "c059d9e2 -> 00000000", + "3fe90bbc -> 3f3db991", + "412484d9 -> 3e9fab66", + "419a5153 -> 3e6926a3", + "40986518 -> 3eea9dfe", + "40a98e6a -> 3ede6d60", + "41970d35 -> 3e6ba877", + "400bacc0 -> 3f2d49f9", + "c062554c -> 00000000", + "403196d7 -> 3f19ae78", + "c0228685 -> 00000000", + "c087244c -> 00000000", + "41244562 -> 3e9fca3a", + "4170b7cb -> 3e840024", + "40af0a48 -> 3edaea50", + "40fcfe7b -> 3eb6176f", + "409bdb4d -> 3ee7ff39", + "41292cec -> 3e9d74ed", + "41629065 -> 3e880fae", + "414645a6 -> 3e9171f4", + "40aab337 -> 3eddae4a", + "40b07f41 -> 3eda0287", + "4184012f -> 3e7c1643", + "41275917 -> 3e9e506b", + "419b5b75 -> 3e685e99", + "c0987f71 -> 00000000", + "41912704 -> 3e70662b", + "40c979dd -> 3ecc0c66", + "417d8eb2 -> 3e809d74", + "c06b2edf -> 00000000", + "419f35a0 -> 3e658a87", + "bba473cc -> 00000000", + "4105c8ae -> 3eb11026", + "c0481fe0 -> 00000000", + "c0005f23 -> 00000000", + "4052d4b8 -> 3f0d0bf1", + "4166d6de -> 3e86cb9f", + "411ac95e -> 3ea49cd8", + "40ae22b8 -> 3edb7bae", + "412ffd19 -> 3e9a60f7", + "4122af67 -> 3ea0911f", + "bfa51cf4 -> 00000000", + "40adb778 -> 3edbbf64", + "40131ee4 -> 3f28d8cf", + "40e785b7 -> 3ebe591c", + "412fdce1 -> 3e9a6f1b", + "413ed149 -> 3e944249", + "418f3197 -> 3e7209a5", + "bee2970b -> 00000000", + "41976f00 -> 3e6b5c53", + "4171873c -> 3e83c768", + "beaf7e56 -> 00000000", + "bf925e67 -> 00000000", + "c000e296 -> 00000000", + "40bdd92c -> 3ed2344b", + "3f6d4e86 -> 3f84f226", + "418ee4ea -> 3e724a8c", + "c03a5e6f -> 00000000", + "bff380dd -> 00000000", + "40e8d81b -> 3ebdce99", + "3f53780c -> 3f8cd56f", + "bec8e4e5 -> 00000000", + "4193fd13 -> 3e6e1598", + "41678547 -> 3e8698d0", + "3e8d6b8a -> 3ff38cfc", + "4183f344 -> 3e7c238f", + "c0157d23 -> 00000000", + "407cfec3 -> 3f00c205", + "419d5a24 -> 3e66e453", + "418b329b -> 3e757cbc", + "40e5828e -> 3ebf2e46", + "415c3db5 -> 3e8a0024", + "3fd55f60 -> 3f46474d", + "3e94ed87 -> 3fed5518", + "41156f0a -> 3ea788f7", + "40edfcce -> 3ebbbea9", + "4188ee09 -> 3e778305", + "bf8b4879 -> 00000000", + "40ffff38 -> 3eb5053a", + "410b1dc8 -> 3eada2ee", + "414a29eb -> 3e9009d5", + "beb32e48 -> 00000000", + "416d0b0a -> 3e850511", + "41827816 -> 3e7d90e9", + "41813519 -> 3e7ecd12", + "c0591548 -> 00000000", + "415019af -> 3e8df811", + "bfdbdadc -> 00000000", + "4109270a -> 3eaee00a", + "40a9dd9b -> 3ede3981", + "bf057cc4 -> 00000000", + "4042f17d -> 3f12ae80", + "410ad993 -> 3eadcd8f", + "3f1e8524 -> 3fa2a9a2", + "beaf1b9e -> 00000000", + "4162044a -> 3e8839d4", + "bf3354dd -> 00000000", + "3fefa55e -> 3f3b1811", + "410e7968 -> 3eab93fc", + "416a14d3 -> 3e85dbd3", + "4189184a -> 3e775cdf", + "c060012e -> 00000000", + "418699f0 -> 3e79a4bd", + "406bcb6f -> 3f055f19", + "4182d342 -> 3e7d387f", + "412a34f5 -> 3e9cfa9c", + "4031c9b2 -> 3f19987c", + "410f4037 -> 3eab1cc3", + "4109c985 -> 3eae78d0", + "4081fbca -> 3efe0a0a", + "3ffcc346 -> 3f362cc2", + "4184af15 -> 3e7b70da", + "4121a5a0 -> 3ea114e9", + "4153bac0 -> 3e8cbf3e", + "3f4343e9 -> 3f928f88", + "3ee6a215 -> 3fbeb6f5", + "40e5f0e1 -> 3ebf0063", + "412d5f8e -> 3e9b89f3", + "414ceb39 -> 3e8f111d", + "412e3ec0 -> 3e9b2635", + "417ff15f -> 3e8003a9", + "40e48493 -> 3ebf9866", + "4182eb60 -> 3e7d212b", + "40a1060d -> 3ee43e92", + "c043bf26 -> 00000000", + "c08a2076 -> 00000000", + "41168a3d -> 3ea6eb17", + "4181512f -> 3e7eb166", + "40ba4450 -> 3ed4372d", + "3edbc2d6 -> 3fc36010", + "3f9450de -> 3f6dd24e", + "419ca1dd -> 3e676bfc", + "4181f964 -> 3e7e0c63", + "40305b93 -> 3f1a3798", + "413bd060 -> 3e957091", + "409a9768 -> 3ee8f1c2", + "414e4857 -> 3e8e97d9", + "40fa2c5f -> 3eb71d80", + "40742c5c -> 3f031030", + "4011ffc7 -> 3f297e84", + "40c8e109 -> 3ecc59f6", + "402154bc -> 3f213d47", + "4161186a -> 3e888121", + "413ae442 -> 3e95ced9", + "402d287b -> 3f1ba2ac", + "c066f2c0 -> 00000000", + "403c32f1 -> 3f154969", + "4158eed0 -> 3e8b0c7f", + "4108dcae -> 3eaf0f85", + "413de9ed -> 3e949c7b", + "413a2f02 -> 3e9617b3", + "41058867 -> 3eb13abf", + "3fad6e1d -> 3f5bedd8", + "4180d581 -> 3e7f2b89", + "40bb209a -> 3ed3ba1f", + "413e099d -> 3e949017", + "41883e86 -> 3e78223f", + "40d6517f -> 3ec5d72d", + "413a2d3d -> 3e961869", + "41022469 -> 3eb385f7", + "40c1dcf9 -> 3ed0042a", + "400ff56b -> 3f2ab0f0", + "4119fa5b -> 3ea50b5b", + "40c0ccb5 -> 3ed096d6", + "c02c43d9 -> 00000000", + "c0414dd8 -> 00000000", + "41159bbe -> 3ea76fee", + "4185232a -> 3e7b0325", + "410f4297 -> 3eab1b58", + "4143ab16 -> 3e9268df", + "418c9df3 -> 3e743ec5", + "419b1314 -> 3e6894cd", + "400e998e -> 3f2b80a4", + "c0525510 -> 00000000", + "4128885f -> 3e9dc1b8", + "4060ef49 -> 3f088d9b", + "418e7f24 -> 3e72a103", + "c09e6dc5 -> 00000000", + "41939048 -> 3e6e6d4d", + "41988dbe -> 3e6a7eb8", + "41953b17 -> 3e6d1761", + "4178493d -> 3e81f923", + "c00931c4 -> 00000000", + "40b02cb6 -> 3eda3594", + "c0361ceb -> 00000000", + "40886db4 -> 3ef7f754", + "c0348ab3 -> 00000000", + "4198f34d -> 3e6a30d3", + "41720b28 -> 3e83a37a", + "413969bd -> 3e966776", + "40006d80 -> 3f34b7b7", + "3fee3e6b -> 3f3ba4ce", + "40b4a076 -> 3ed780d6", + "419b582e -> 3e68610d", + "419214ea -> 3e6fa21c", + "41766892 -> 3e8277aa", + "413754b2 -> 3e97417f", + "40fea925 -> 3eb57ea5", + "41045131 -> 3eb20ab1", + "4100fd63 -> 3eb452cf", + "40b738a1 -> 3ed5f8da", + "bf69415c -> 00000000", + "bec3ce3d -> 00000000", + "3fdfb73e -> 3f41a405", + "415c9188 -> 3e89e5e9", + "4106331f -> 3eb0c9e0", + "41026b6d -> 3eb35511", + "41718b0b -> 3e83c65e", + "41532ab2 -> 3e8cef38", + "419fa21d -> 3e653c7a", + "40a3a148 -> 3ee26b58", + "3ffc6e9c -> 3f364b4d", + "c0956f25 -> 00000000", + "410a3228 -> 3eae36b6", + "41601522 -> 3e88d003", + "40f20fb4 -> 3eba2881", + "c010b466 -> 00000000", + "40d5a866 -> 3ec62568", + "416b3494 -> 3e8589d8", + "408755b0 -> 3ef8f757", + "bed5bc40 -> 00000000", + "41773b88 -> 3e823ff4", + "41834f17 -> 3e7cc0fc", + "413096dd -> 3e9a1db2", + "4168bce7 -> 3e863e95", + "409f965b -> 3ee544ec", + "41037d60 -> 3eb299de", + "40836635 -> 3efcaabf", + "41272d1c -> 3e9e653d", + "40ee2803 -> 3ebbada1", + "418b691a -> 3e754cbd", + "405107ea -> 3f0da714", + "41537611 -> 3e8cd618", + "c06a3faa -> 00000000", + "405028ca -> 3f0df2eb", + "3fbecf56 -> 3f51ac89", + "4191090e -> 3e707efe", + "40f0cb66 -> 3ebaa5b4", + "410bb40a -> 3ead4574", + "4172625e -> 3e838bc9", + "40b325f2 -> 3ed86408", + "41896bd7 -> 3e7711a0", + "c0692134 -> 00000000", + "3e93ad35 -> 3fee55f1", + "418af192 -> 3e75b62b", + "41640d72 -> 3e879dd3", + "c02adcc6 -> 00000000", + "c0074a0c -> 00000000", + "3f97f7b3 -> 3f6af25f", + "3fa95854 -> 3f5e90e2", + "40f913ea -> 3eb7847a", + "40883102 -> 3ef82e8e", + "4188d5e8 -> 3e7798d8", + "bfd8422e -> 00000000", + "418ec74b -> 3e7263ad", + "4042853a -> 3f12d74c", + "40a5390d -> 3ee15345", + "40d68ea5 -> 3ec5bafa", + "3feefea1 -> 3f3b5949", + "41050272 -> 3eb193e7", + "40e9f848 -> 3ebd5991", + "418a14a9 -> 3e767a69", + "c0454589 -> 00000000", + "417bbaf0 -> 3e8114bb", + "419d1c81 -> 3e671198", + "c0394292 -> 00000000", + "40cbfa45 -> 3ecacb19", + "bf3742a8 -> 00000000", + "411e89c3 -> 3ea2a744", + "bfd692bd -> 00000000", + "c07d039c -> 00000000", + "40ffac82 -> 3eb5227f", + "4190c637 -> 3e70b67c", + "408fee6f -> 3ef16aa9", + "bfbfb783 -> 00000000", + "400f8cf2 -> 3f2aef02", + "c064dd84 -> 00000000", + "bfbbf3b6 -> 00000000", + "4179d35d -> 3e819274", + "419ee14f -> 3e65c767", + "3f85c339 -> 3f7a6cca", + "3fd6cfc7 -> 3f459cfd", + "41872fca -> 3e791a3b", + "c0357115 -> 00000000", + "41176330 -> 3ea67352", + "c05ed982 -> 00000000", + "41278852 -> 3e9e3a18", + "c0339161 -> 00000000", + "4073dd3a -> 3f032572", + "4103b2e6 -> 3eb27590", + "40a17232 -> 3ee3f212", + "4187bf5a -> 3e78965e", + "c087b761 -> 00000000", + "413c95ec -> 3e952237", + "40d08405 -> 3ec8930e", + "41508927 -> 3e8dd21b", + "418198fd -> 3e7e6acd", + "c088a792 -> 00000000", + "411f853f -> 3ea226db", + "4122b772 -> 3ea08d28", + "4131a4ef -> 3e99a85f", + "c04234a1 -> 00000000", + "bf63513a -> 00000000", + "412fa1b0 -> 3e9a891f", + "4181ef27 -> 3e7e1663", + "41112b6f -> 3ea9fa4c", + "3fb2bc42 -> 3f58a3f9", + "40731aab -> 3f0359e3", + "bf018ae6 -> 00000000", + "418bfe63 -> 3e74c9d0", + "401befc0 -> 3f24012e", + "419811e6 -> 3e6ade21", + "4197d5b1 -> 3e6b0cad", + "4182e8fb -> 3e7d237c", + "41300285 -> 3e9a5e97", + "4199a911 -> 3e69a625", + "bfc75b92 -> 00000000", + "4095fa8e -> 3eec7fdb", + "4167ca16 -> 3e8684d4", + "40f891e4 -> 3eb7b473", + "41383d80 -> 3e96e1d1", + "bd298907 -> 00000000", + "41648aa7 -> 3e8778a7", + "40855278 -> 3efad699", + "413975d5 -> 3e96628f", + "4185ffc8 -> 3e7a342e", + "c03b9820 -> 00000000", + "413e34ea -> 3e947f2e", + "3dd30892 -> 40475fd5", + "40aa37b8 -> 3eddfea6", + "412579c7 -> 3e9f350f", + "413db910 -> 3e94af9e", + "4131b155 -> 3e99a303", + "41913feb -> 3e70518e", + "bf0b472a -> 00000000", + "40a79243 -> 3edfbda2", + "416c1bca -> 3e854866", + "417cd323 -> 3e80cd20", + "40fbd2b3 -> 3eb683b2", + "bfd76518 -> 00000000", + "4162627e -> 3e881d79", + "412d254c -> 3e9ba41b", + "bf803caa -> 00000000", + "4190b8ef -> 3e70c188", + "40b91aeb -> 3ed4e162", + "419a19df -> 3e695091", + "3f198971 -> 3fa54800", + "4171f9fd -> 3e83a825", + "410f8839 -> 3eaaf1d2", + "40d974ce -> 3ec4686d", + "40880b05 -> 3ef85134", + "415649a6 -> 3e8be786", + "419c136c -> 3e67d57f", + "c05a7a1d -> 00000000", + "bfe85aa5 -> 00000000", + "417819aa -> 3e820598", + "bf695427 -> 00000000", + "4117532f -> 3ea67c1f", + "4177ca71 -> 3e821a5f", + "4191868f -> 3e701733", + "3fc7bf31 -> 3f4cee04", + "410563ab -> 3eb15324", + "3ee2e2d0 -> 3fc04879", + "41450d3d -> 3e91e512", + "bfd07100 -> 00000000", + "4178f1ed -> 3e81cd12", + "c07210c2 -> 00000000", + "414b3a06 -> 3e8fa947", + "c09ed430 -> 00000000", + "41822b91 -> 3e7ddb66", + "413901cc -> 3e9691b0", + "407182f3 -> 3f03c893", + "4082608b -> 3efda7ce", + "c07d55b4 -> 00000000", + "4080e906 -> 3eff1837", + "41068466 -> 3eb0946f", + "4137411b -> 3e974995", + "3fbd21e9 -> 3f529a0a", + "c028f00f -> 00000000", + "412f8a5d -> 3e9a9363", + "40efa624 -> 3ebb17c4", + "c06b2b7f -> 00000000", + "41756b59 -> 3e82bae7", + "4171e4ba -> 3e83adee", + "3ff11235 -> 3f3a8a49", + "418aea54 -> 3e75bc91", + "402d2fbb -> 3f1b9f6a", + "c08254a8 -> 00000000", + "414e6e74 -> 3e8e8aaf", + "416ba09c -> 3e856b38", + "c0962923 -> 00000000", + "c05ad7ab -> 00000000", + "409db917 -> 3ee69ec9", + "40012bfe -> 3f343245", + "41965af3 -> 3e6c3400", + "c086e302 -> 00000000", + "4182afc3 -> 3e7d5ae2", + "4104e7e4 -> 3eb1a5a4", + "414aeddb -> 3e8fc43b", + "4156dd2b -> 3e8bb777", + "40505f9a -> 3f0de03e", + "410a8705 -> 3eae0151", + "3e7a2595 -> 40017d27", + "3fef02f5 -> 3f3b5798", + "3f6d7470 -> 3f84e788", + "418dac10 -> 3e73557f", + "40aff2ea -> 3eda5968", + "4125e2c9 -> 3e9f02a3", + "40f64452 -> 3eb88fd6", + "bf98a189 -> 00000000", + "3f8c7de6 -> 3f745aa0", + "40db17a7 -> 3ec3ac56", + "41063eee -> 3eb0c21a", + "419735e8 -> 3e6b88bd", + "41875aa1 -> 3e78f2cc", + "c083da60 -> 00000000", + "419e6cbb -> 3e661be2", + "bfc61aa8 -> 00000000", + "c02f19a9 -> 00000000", + "4183e9c7 -> 3e7c2ca0", + "417f52bb -> 3e802b67", + "3dacbb99 -> 405c5f62", + "413e166b -> 3e948b16", + "418d672d -> 3e7390bd", + "c09123fc -> 00000000", + "4112fa33 -> 3ea8ede1", + "4199e93e -> 3e69756a", + "40a042c1 -> 3ee4c97a", + "c0242793 -> 00000000", + "4170e693 -> 3e83f352", + "418388c7 -> 3e7c898a", + "c06ee12c -> 00000000", + "c07724c6 -> 00000000", + "415f10b2 -> 3e891fca", + "40dad450 -> 3ec3ca6f", + "419b76a6 -> 3e684a46", + "419387fa -> 3e6e7402", + "400766d0 -> 3f30008e", + "4195ed4e -> 3e6c8a4e", + "41918852 -> 3e7015c0", + "bf30f1e2 -> 00000000", + "417b0e52 -> 3e814114", + "412a2f51 -> 3e9cfd36", + "40bb417d -> 3ed3a787", + "beaf7fb5 -> 00000000", + "400687f5 -> 3f309219", + "40d37bb4 -> 3ec72989", + "416ea791 -> 3e8491e8", + "40e710f6 -> 3ebe892d", + "416650bf -> 3e86f2d9", + "c043a5e2 -> 00000000", + "408a4c87 -> 3ef6489c", + "3fb1e38b -> 3f5927c7", + "416a9dbf -> 3e85b4be", + "412de38d -> 3e9b4ede", + "bfb88733 -> 00000000", + "4106c696 -> 3eb0690e", + "419c7631 -> 3e678c47", + "c0057562 -> 00000000", + "419e5f1d -> 3e6625c7", + "40a92b70 -> 3edeae68", + "4108339d -> 3eaf7c0a", + "c051ebe1 -> 00000000", + "c005fd32 -> 00000000", + "4137ff38 -> 3e96fb58", + "4151ca08 -> 3e8d657b", + "40f955b1 -> 3eb76c44", + "40bb2e34 -> 3ed3b26e", + "c008484d -> 00000000", + "bf8e230c -> 00000000", + "bf6b7c40 -> 00000000", + "410f8829 -> 3eaaf1db", + "40f77e89 -> 3eb81a88", + "40b7c320 -> 3ed5a828", + "c041eaeb -> 00000000", + "40132dab -> 3f28d055", + "40d72f08 -> 3ec5713c", + "4190a50a -> 3e70d216", + "bfeb1786 -> 00000000", + "c066d8b8 -> 00000000", + "410b9646 -> 3ead57ed", + "40dd7dfd -> 3ec29c3c", + "c09d477e -> 00000000", + "418d0b5b -> 3e73dffa", + "41525c91 -> 3e8d3434", + "4142c794 -> 3e92be47", + "bf536b05 -> 00000000", + "41908228 -> 3e70ef24", + "4045863d -> 3f11b85c", + "4197af98 -> 3e6b2a31", + "40c5190f -> 3ece4d60", + "3f04d8f8 -> 3fb1af9e", + "404818e0 -> 3f10c7c2", + "4183ea72 -> 3e7c2bfd", + "3fd999a1 -> 3f4457cd", + "40b357fa -> 3ed845d7", + "415a5d14 -> 3e8a97b1", + "414b5886 -> 3e8f9e81", + "410f6e5c -> 3eab013b", + "c0613f76 -> 00000000", + "4113aaed -> 3ea888ac", + "413b9a60 -> 3e958611", + "c09f18d9 -> 00000000", + "414099ba -> 3e939232", + "40e6e578 -> 3ebe9b1e", + "419c7bf4 -> 3e678804", + "3fde54d8 -> 3f423e1c", + "40c0c054 -> 3ed09d89", + "40e6bc5c -> 3ebeac18", + "c09a8911 -> 00000000", + "be841524 -> 00000000", + "40dcf6d7 -> 3ec2d7b6", + "40b5b05e -> 3ed6df58", + "40e7f0b3 -> 3ebe2d31", + "408e58c0 -> 3ef2c1ba", + "4191cfe3 -> 3e6fdace", + "bffc7ab4 -> 00000000", + "418ff66a -> 3e7163f7", + "4128113c -> 3e9df999", + "41794df9 -> 3e81b519", + "40a06daa -> 3ee4aade", + "416b9e7c -> 3e856bd1", + "4175aa5a -> 3e82aa23", + "415711b6 -> 3e8ba665", + "40fb1e01 -> 3eb6c550", + "bffc7275 -> 00000000", + "c08ed0fc -> 00000000", + "4109e833 -> 3eae6566", + "418eb832 -> 3e72707f", + "bfce3918 -> 00000000", + "414160ec -> 3e93461e", + "41362594 -> 3e97bf26", + "40303c06 -> 3f1a4565", + "409faba4 -> 3ee535a3", + "419d70bd -> 3e66d3bf", + "4174a88e -> 3e82eee8", + "40989364 -> 3eea7a62", + "4128b00c -> 3e9daf2a", + "411d2e0a -> 3ea35acb", + "411219b3 -> 3ea96f79", + "41539fc5 -> 3e8cc837", + "419abb98 -> 3e68d685", + "bfb2843c -> 00000000", + "413545e8 -> 3e981ca8", + "406f8a3b -> 3f045321", + "be3a11f5 -> 00000000", + "be8159a1 -> 00000000", + "c05826c6 -> 00000000", + "41744d3a -> 3e83075f", + "414a11f6 -> 3e90125f", + "410db74d -> 3eac0955", + "4039d257 -> 3f163d1b", + "4026e1c8 -> 3f1e88f8", + "4149aabc -> 3e903739", + "40bb96b2 -> 3ed37770", + "4054e46f -> 3f0c5cb5", + "413e475d -> 3e9477fa", + "412d1261 -> 3e9bac9d", + "bfd6a6a2 -> 00000000", + "40a71c09 -> 3ee00cb9", + "40fda7c7 -> 3eb5daa1", + "c06e78b9 -> 00000000", + "be9e98f8 -> 00000000", + "41658f82 -> 3e872b99", + "4080e45e -> 3eff1cd2", + "4172a9bd -> 3e83786f", + "c0440f32 -> 00000000", + "c06b6214 -> 00000000", + "4007eee3 -> 3f2fa861", + "c09cb734 -> 00000000", + "413577c9 -> 3e9807bf", + "40324920 -> 3f19618e", + "410224b9 -> 3eb385c0", + "c08b271f -> 00000000", + "410a4a87 -> 3eae275b", + "3e048cb3 -> 4031e2b5", + "40ecd9ee -> 3ebc31cf", + "419340ff -> 3e6ead74", + "40a26207 -> 3ee3497f", + "41461711 -> 3e91830d", + "41834651 -> 3e7cc96f", + "bfecbc4d -> 00000000", + "403f0084 -> 3f142ff3", + "408af85b -> 3ef5b02a", + "412e2fb1 -> 3e9b2ce9", + "c03730a4 -> 00000000", + "40cf8d3d -> 3ec90a29", + "41770818 -> 3e824d83", + "419de4f9 -> 3e667eba", + "414c9f86 -> 3e8f2b91", + "41919987 -> 3e700791", + "4180d6f0 -> 3e7f2a1d", + "4120e106 -> 3ea17738", + "411c5135 -> 3ea3ce05", + "411aefce -> 3ea4886c", + "bebc441d -> 00000000", + "40c4e9c5 -> 3ece6624", + "c04755ff -> 00000000", + "4048c34b -> 3f108a42", + "407ccee7 -> 3f00ce35", + "413fe76c -> 3e93d6b1", + "bff75ebb -> 00000000", + "414f3308 -> 3e8e4700", + "c0617459 -> 00000000", + "bfc20776 -> 00000000", + "415a9619 -> 3e8a859c", + "bf1f1dcd -> 00000000", + "413b0d0d -> 3e95be82", + "410c3795 -> 3eacf41b", + "410a07e5 -> 3eae5160", + "411248fe -> 3ea95413", + "4199c3ae -> 3e6991ed", + "c04c7208 -> 00000000", + "419293fb -> 3e6f3a27", + "3ee11bbd -> 3fc10a73", + "41424361 -> 3e92f02d", + "410a61d0 -> 3eae18b3", + "419769d0 -> 3e6b605c", + "4124b7a4 -> 3e9f92c5", + "415ea250 -> 3e8941c4", + "4044de94 -> 3f11f65b", + "c09a735f -> 00000000", + "40c060f6 -> 3ed0d138", + "4186ccac -> 3e7975bf", + "c05d6b4c -> 00000000", + "419c45f0 -> 3e67b003", + "bf81c298 -> 00000000", + "41642270 -> 3e879795", + "40972c03 -> 3eeb9073", + "414220fa -> 3e92fd31", + "c06ab4d8 -> 00000000", + "403163bf -> 3f19c498", + "c097f923 -> 00000000", + "413cf7a7 -> 3e94fba1", + "415db24f -> 3e898bfc", + "41191842 -> 3ea5850d", + "40f59f66 -> 3eb8cdc1", + "413e122e -> 3e948cbe", + "419505c1 -> 3e6d41cb", + "40ccc5ed -> 3eca6628", + "414817a0 -> 3e90c836", + "40ee9bc2 -> 3ebb8017", + "41987f2d -> 3e6a89eb", + "40b944c6 -> 3ed4c955", + "3f7a3c0a -> 3f817758", + "40e200a3 -> 3ec0a898", + "4186fc1a -> 3e7949e7", + "418e12ff -> 3e72fd49", + "3fe9d210 -> 3f3d690a", + "41113c3d -> 3ea9f077", + "bfe6faed -> 00000000", + "c03a7367 -> 00000000", + "418adac0 -> 3e75ca5b", + "415c5837 -> 3e89f7d7", + "bf343d53 -> 00000000", + "c0851fcd -> 00000000", + "419861bf -> 3e6aa090", + "3f5da896 -> 3f898f00", + "4136c347 -> 3e977da0", + "419bc58a -> 3e680f6c", + "bffd9294 -> 00000000", + "41543b28 -> 3e8c94a3", + "4194c66b -> 3e6d7447", + "3fbc0c12 -> 3f533566", + "c00ea82c -> 00000000", + "3fdb7575 -> 3f43827f", + "401c8d7b -> 3f23ae7a", + "c097fc7b -> 00000000", + "40479034 -> 3f10f94d", + "410417a1 -> 3eb23178", + "402b7a99 -> 3f1c6548", + "4175de4e -> 3e829c54", + "c0890075 -> 00000000", + "40d857d7 -> 3ec4e99d", + "41814823 -> 3e7eba4e", + "3fe5487f -> 3f3f4678", + "41147671 -> 3ea81501", + "40dcf708 -> 3ec2d7a1", + "40d3cc97 -> 3ec7037d", + "40cd5ced -> 3eca1bb0", + "bf7bcadc -> 00000000", + "4087e84d -> 3ef870e8", + "41537470 -> 3e8cd6a3", + "c03c6abb -> 00000000", + "418601d6 -> 3e7a3243", + "40918796 -> 3ef0165b", + "3ebb1706 -> 3fd3bf8b", + "40db8c24 -> 3ec37866", + "c03549c8 -> 00000000", + "bf60a84a -> 00000000", + "40dee155 -> 3ec200db", + "3ec66436 -> 3fcda0ea", + "c0341f23 -> 00000000", + "40368b7b -> 3f1794c6", + "4151ff3c -> 3e8d5391", + "c02ec8a3 -> 00000000", + "417caaf7 -> 3e80d75d", + "418762ac -> 3e78eb67", + "4034ea9f -> 3f184304", + "40c0ec96 -> 3ed0859a", + "4129fafc -> 3e9d155f", + "40eee252 -> 3ebb6463", + "40b9491f -> 3ed4c6d7", + "4195e13b -> 3e6c93d5", + "40defe6b -> 3ec1f433", + "40f581a6 -> 3eb8d8f4", + "3fa7a51b -> 3f5fb10e", + "4187e0de -> 3e7877b5", + "3ef1cec4 -> 3fba417f", + "419ef2cb -> 3e65bac4", + "414b2324 -> 3e8fb15e", + "412a2023 -> 3e9d0437", + "c09a5f48 -> 00000000", + "418f6b43 -> 3e71d8f6", + "3f49e3c2 -> 3f9022da", + "41879606 -> 3e78bc3f", + "4112d121 -> 3ea90580", + "c0713b1b -> 00000000", + "416e3aac -> 3e84b031", + "40b2dff5 -> 3ed88e59", + "40fc58a0 -> 3eb6533d", + "419b6a88 -> 3e685355", + "41995e2a -> 3e69df2d", + "417f8d00 -> 3e801cc9", + "411cae18 -> 3ea39d70", + "40549f62 -> 3f0c737d", + "408e441d -> 3ef2d354", + "41743cab -> 3e830bd0", + "bfc4a216 -> 00000000", + "c052f55e -> 00000000", + "41248af4 -> 3e9fa86f", + "3f5efb53 -> 3f89265c", + "40a47389 -> 3ee1da6d", + "40496413 -> 3f105084", + "406ef20d -> 3f047d3d", + "4175ad44 -> 3e82a95d", + "bd6107e4 -> 00000000", + "41932e64 -> 3e6ebc89", + "40b194de -> 3ed957dc", + "404a4fc0 -> 3f0ffc5d", + "41329f5e -> 3e993c82", + "400a4d37 -> 3f2e25aa", + "4096eff8 -> 3eebbf48", + "40afb6e3 -> 3eda7eb0", + "4171e934 -> 3e83acb6", + "c00298cb -> 00000000", + "3e6fb244 -> 40044813", + "403ab570 -> 3f15e1a1", + "bf7534ae -> 00000000", + "416bcb43 -> 3e855f26", + "418539c0 -> 3e7aedde", + "40758622 -> 3f02b3c6", + "40f6d0bd -> 3eb85b4f", + "c06da177 -> 00000000", + "415f8ad8 -> 3e88fa4e", + "41955d43 -> 3e6cfc41", + "4099fdd8 -> 3ee965cd", + "c06a8675 -> 00000000", + "41507e4c -> 3e8dd5cc", + "4179352b -> 3e81bb8e", + "419e5c7f -> 3e6627ad", + "412a4fa5 -> 3e9cee4f", + "4196329b -> 3e6c53b7", + "40a32a96 -> 3ee2bda3", + "41879929 -> 3e78b95f", + "4166311f -> 3e86fc1e", + "410a333a -> 3eae360a", + "413a1ce1 -> 3e961f02", + "41316a7f -> 3e99c1ac", + "4183a938 -> 3e7c6a6c", + "419f80f4 -> 3e65544d", + "413335c9 -> 3e98fc26", + "419e5c82 -> 3e6627ac", + "c09a9685 -> 00000000", + "400cf0b7 -> 3f2c825d", + "418a2d5a -> 3e766463", + "41483d92 -> 3e90ba7d", + "bee58ff4 -> 00000000", + "3d75ee91 -> 40829803", + "3fa1f0bc -> 3f6398f2", + "418ced63 -> 3e73f9e7", + "c01ec5de -> 00000000", + "40d21e36 -> 3ec7cee7", + "40d9a26a -> 3ec453d7", + "418ea308 -> 3e72827b", + "bf8b72ff -> 00000000", + "3fea1e51 -> 3f3d4a2f", + "40ce2425 -> 3ec9b9f0", + "412d535c -> 3e9b8f6b", + "c00d7949 -> 00000000", + "411ff713 -> 3ea1ed1f", + "3f68819b -> 3f864fb3", + "3fb2a536 -> 3f58b1f1", + "3f4607eb -> 3f91889d", + "419aa4d0 -> 3e68e7aa", + "412c2766 -> 3e9c16b7", + "41464454 -> 3e917270", + "41922d3f -> 3e6f8e2a", + "40ae53e7 -> 3edb5cb5", + "41157953 -> 3ea78333", + "3f845da3 -> 3f7bbe2a", + "40839de7 -> 3efc7545", + "416fcdcd -> 3e84407b", + "4111fcd9 -> 3ea98036", + "40dc9415 -> 3ec30350", + "417c0ea4 -> 3e80ff4b", + "4188f9d0 -> 3e777862", + "c061d91b -> 00000000", + "40ca486a -> 3ecba41e", + "40aac5ac -> 3edda24f", + "c09e0546 -> 00000000", + "40f55803 -> 3eb8e8a2", + "40a84cfc -> 3edf4162", + "401a3255 -> 3f24ed63", + "418a9d95 -> 3e76008f", + "c09f6b80 -> 00000000", + "40a7431d -> 3edff28b", + "418079c8 -> 3e7f868e", + "410ad219 -> 3eadd23d", + "411e750d -> 3ea2b1e5", + "4091a3b2 -> 3eefff2e", + "418274fa -> 3e7d93f0", + "3eb13d73 -> 3fd98d70", + "40fd3bf6 -> 3eb60153", + "4123fec0 -> 3e9feca0", + "41475f1e -> 3e910b25", + "410f796a -> 3eaafaa4", + "416571e7 -> 3e873451", + "417e4640 -> 3e806f00", + "3f6d1c80 -> 3f85002c", + "c08a855f -> 00000000", + "4151e9f4 -> 3e8d5abb", + "402dca2d -> 3f1b5a35", + "41906a53 -> 3e710306", + "41744128 -> 3e830a9c", + "418f9f87 -> 3e71acf2", + "406cbc81 -> 3f051b20", + "41868334 -> 3e79b9d4", + "408bcaae -> 3ef4f711", + "41140c74 -> 3ea85120", + "41352ef2 -> 3e98264b", + "41369dea -> 3e978d1f", + "bfda7226 -> 00000000", + "404b8913 -> 3f0f8d5e", + "4128a7a8 -> 3e9db316", + "4121feb0 -> 3ea0e89c", + "c09b3cba -> 00000000", + "bff42631 -> 00000000", + "40e8427d -> 3ebe0bb1", + "4127113c -> 3e9e7273" + ] + }, + { + "function": "cycles_modulo", + "node": "ShaderNodeMath MODULO", + "cases": [ + "00000000 00000000 -> 00000000", + "00000000 3f800000 -> 00000000", + "00000000 bf800000 -> 00000000", + "00000000 3f000000 -> 00000000", + "00000000 bf000000 -> 00000000", + "00000000 40000000 -> 00000000", + "00000000 c0000000 -> 00000000", + "00000000 40400000 -> 00000000", + "00000000 c0300000 -> 00000000", + "00000000 3dcccccd -> 00000000", + "00000000 bdcccccd -> 00000000", + "00000000 40f00000 -> 00000000", + "00000000 c0f00000 -> 00000000", + "00000000 33d6bf95 -> 00000000", + "00000000 b3d6bf95 -> 00000000", + "00000000 42c80000 -> 00000000", + "00000000 c2c80000 -> 00000000", + "00000000 461c4000 -> 00000000", + "00000000 3e99999a -> 00000000", + "00000000 3f333333 -> 00000000", + "3f800000 00000000 -> 00000000", + "3f800000 3f800000 -> 00000000", + "3f800000 bf800000 -> 00000000", + "3f800000 3f000000 -> 00000000", + "3f800000 bf000000 -> 00000000", + "3f800000 40000000 -> 3f800000", + "3f800000 c0000000 -> 3f800000", + "3f800000 40400000 -> 3f800000", + "3f800000 c0300000 -> 3f800000", + "3f800000 3dcccccd -> 3dcccccb", + "3f800000 bdcccccd -> 3dcccccb", + "3f800000 40f00000 -> 3f800000", + "3f800000 c0f00000 -> 3f800000", + "3f800000 33d6bf95 -> 33bda715", + "3f800000 b3d6bf95 -> 33bda715", + "3f800000 42c80000 -> 3f800000", + "3f800000 c2c80000 -> 3f800000", + "3f800000 461c4000 -> 3f800000", + "3f800000 3e99999a -> 3dccccc8", + "3f800000 3f333333 -> 3e99999a", + "bf800000 00000000 -> 00000000", + "bf800000 3f800000 -> 00000000", + "bf800000 bf800000 -> 00000000", + "bf800000 3f000000 -> 00000000", + "bf800000 bf000000 -> 00000000", + "bf800000 40000000 -> bf800000", + "bf800000 c0000000 -> bf800000", + "bf800000 40400000 -> bf800000", + "bf800000 c0300000 -> bf800000", + "bf800000 3dcccccd -> bdcccccb", + "bf800000 bdcccccd -> bdcccccb", + "bf800000 40f00000 -> bf800000", + "bf800000 c0f00000 -> bf800000", + "bf800000 33d6bf95 -> b3bda715", + "bf800000 b3d6bf95 -> b3bda715", + "bf800000 42c80000 -> bf800000", + "bf800000 c2c80000 -> bf800000", + "bf800000 461c4000 -> bf800000", + "bf800000 3e99999a -> bdccccc8", + "bf800000 3f333333 -> be99999a", + "3f000000 00000000 -> 00000000", + "3f000000 3f800000 -> 3f000000", + "3f000000 bf800000 -> 3f000000", + "3f000000 3f000000 -> 00000000", + "3f000000 bf000000 -> 00000000", + "3f000000 40000000 -> 3f000000", + "3f000000 c0000000 -> 3f000000", + "3f000000 40400000 -> 3f000000", + "3f000000 c0300000 -> 3f000000", + "3f000000 3dcccccd -> 3dcccccc", + "3f000000 bdcccccd -> 3dcccccc", + "3f000000 40f00000 -> 3f000000", + "3f000000 c0f00000 -> 3f000000", + "3f000000 33d6bf95 -> 33ca3355", + "3f000000 b3d6bf95 -> 33ca3355", + "3f000000 42c80000 -> 3f000000", + "3f000000 c2c80000 -> 3f000000", + "3f000000 461c4000 -> 3f000000", + "3f000000 3e99999a -> 3e4ccccc", + "3f000000 3f333333 -> 3f000000", + "bf000000 00000000 -> 00000000", + "bf000000 3f800000 -> bf000000", + "bf000000 bf800000 -> bf000000", + "bf000000 3f000000 -> 00000000", + "bf000000 bf000000 -> 00000000", + "bf000000 40000000 -> bf000000", + "bf000000 c0000000 -> bf000000", + "bf000000 40400000 -> bf000000", + "bf000000 c0300000 -> bf000000", + "bf000000 3dcccccd -> bdcccccc", + "bf000000 bdcccccd -> bdcccccc", + "bf000000 40f00000 -> bf000000", + "bf000000 c0f00000 -> bf000000", + "bf000000 33d6bf95 -> b3ca3355", + "bf000000 b3d6bf95 -> b3ca3355", + "bf000000 42c80000 -> bf000000", + "bf000000 c2c80000 -> bf000000", + "bf000000 461c4000 -> bf000000", + "bf000000 3e99999a -> be4ccccc", + "bf000000 3f333333 -> bf000000", + "40000000 00000000 -> 00000000", + "40000000 3f800000 -> 00000000", + "40000000 bf800000 -> 00000000", + "40000000 3f000000 -> 00000000", + "40000000 bf000000 -> 00000000", + "40000000 40000000 -> 00000000", + "40000000 c0000000 -> 00000000", + "40000000 40400000 -> 40000000", + "40000000 c0300000 -> 40000000", + "40000000 3dcccccd -> 3dccccc9", + "40000000 bdcccccd -> 3dccccc9", + "40000000 40f00000 -> 40000000", + "40000000 c0f00000 -> 40000000", + "40000000 33d6bf95 -> 33a48e95", + "40000000 b3d6bf95 -> 33a48e95", + "40000000 42c80000 -> 40000000", + "40000000 c2c80000 -> 40000000", + "40000000 461c4000 -> 40000000", + "40000000 3e99999a -> 3e4cccc8", + "40000000 3f333333 -> 3f19999a", + "c0000000 00000000 -> 00000000", + "c0000000 3f800000 -> 00000000", + "c0000000 bf800000 -> 00000000", + "c0000000 3f000000 -> 00000000", + "c0000000 bf000000 -> 00000000", + "c0000000 40000000 -> 00000000", + "c0000000 c0000000 -> 00000000", + "c0000000 40400000 -> c0000000", + "c0000000 c0300000 -> c0000000", + "c0000000 3dcccccd -> bdccccc9", + "c0000000 bdcccccd -> bdccccc9", + "c0000000 40f00000 -> c0000000", + "c0000000 c0f00000 -> c0000000", + "c0000000 33d6bf95 -> b3a48e95", + "c0000000 b3d6bf95 -> b3a48e95", + "c0000000 42c80000 -> c0000000", + "c0000000 c2c80000 -> c0000000", + "c0000000 461c4000 -> c0000000", + "c0000000 3e99999a -> be4cccc8", + "c0000000 3f333333 -> bf19999a", + "40400000 00000000 -> 00000000", + "40400000 3f800000 -> 00000000", + "40400000 bf800000 -> 00000000", + "40400000 3f000000 -> 00000000", + "40400000 bf000000 -> 00000000", + "40400000 40000000 -> 3f800000", + "40400000 c0000000 -> 3f800000", + "40400000 40400000 -> 00000000", + "40400000 c0300000 -> 3e800000", + "40400000 3dcccccd -> 3dccccc7", + "40400000 bdcccccd -> 3dccccc7", + "40400000 40f00000 -> 40400000", + "40400000 c0f00000 -> 40400000", + "40400000 33d6bf95 -> 338b7615", + "40400000 b3d6bf95 -> 338b7615", + "40400000 42c80000 -> 40400000", + "40400000 c2c80000 -> 40400000", + "40400000 461c4000 -> 40400000", + "40400000 3e99999a -> 3e999996", + "40400000 3f333333 -> 3e4cccd0", + "c0300000 00000000 -> 00000000", + "c0300000 3f800000 -> bf400000", + "c0300000 bf800000 -> bf400000", + "c0300000 3f000000 -> be800000", + "c0300000 bf000000 -> be800000", + "c0300000 40000000 -> bf400000", + "c0300000 c0000000 -> bf400000", + "c0300000 40400000 -> c0300000", + "c0300000 c0300000 -> 00000000", + "c0300000 3dcccccd -> bd4cccc2", + "c0300000 bdcccccd -> bd4cccc2", + "c0300000 40f00000 -> c0300000", + "c0300000 c0f00000 -> c0300000", + "c0300000 33d6bf95 -> b391bc35", + "c0300000 b3d6bf95 -> b391bc35", + "c0300000 42c80000 -> c0300000", + "c0300000 c2c80000 -> c0300000", + "c0300000 461c4000 -> c0300000", + "c0300000 3e99999a -> bd4cccb0", + "c0300000 3f333333 -> bf266667", + "3dcccccd 00000000 -> 00000000", + "3dcccccd 3f800000 -> 3dcccccd", + "3dcccccd bf800000 -> 3dcccccd", + "3dcccccd 3f000000 -> 3dcccccd", + "3dcccccd bf000000 -> 3dcccccd", + "3dcccccd 40000000 -> 3dcccccd", + "3dcccccd c0000000 -> 3dcccccd", + "3dcccccd 40400000 -> 3dcccccd", + "3dcccccd c0300000 -> 3dcccccd", + "3dcccccd 3dcccccd -> 00000000", + "3dcccccd bdcccccd -> 00000000", + "3dcccccd 40f00000 -> 3dcccccd", + "3dcccccd c0f00000 -> 3dcccccd", + "3dcccccd 33d6bf95 -> 2fb0c000", + "3dcccccd b3d6bf95 -> 2fb0c000", + "3dcccccd 42c80000 -> 3dcccccd", + "3dcccccd c2c80000 -> 3dcccccd", + "3dcccccd 461c4000 -> 3dcccccd", + "3dcccccd 3e99999a -> 3dcccccd", + "3dcccccd 3f333333 -> 3dcccccd", + "bdcccccd 00000000 -> 00000000", + "bdcccccd 3f800000 -> bdcccccd", + "bdcccccd bf800000 -> bdcccccd", + "bdcccccd 3f000000 -> bdcccccd", + "bdcccccd bf000000 -> bdcccccd", + "bdcccccd 40000000 -> bdcccccd", + "bdcccccd c0000000 -> bdcccccd", + "bdcccccd 40400000 -> bdcccccd", + "bdcccccd c0300000 -> bdcccccd", + "bdcccccd 3dcccccd -> 00000000", + "bdcccccd bdcccccd -> 00000000", + "bdcccccd 40f00000 -> bdcccccd", + "bdcccccd c0f00000 -> bdcccccd", + "bdcccccd 33d6bf95 -> afb0c000", + "bdcccccd b3d6bf95 -> afb0c000", + "bdcccccd 42c80000 -> bdcccccd", + "bdcccccd c2c80000 -> bdcccccd", + "bdcccccd 461c4000 -> bdcccccd", + "bdcccccd 3e99999a -> bdcccccd", + "bdcccccd 3f333333 -> bdcccccd", + "40f00000 00000000 -> 00000000", + "40f00000 3f800000 -> 3f000000", + "40f00000 bf800000 -> 3f000000", + "40f00000 3f000000 -> 00000000", + "40f00000 bf000000 -> 00000000", + "40f00000 40000000 -> 3fc00000", + "40f00000 c0000000 -> 3fc00000", + "40f00000 40400000 -> 3fc00000", + "40f00000 c0300000 -> 40000000", + "40f00000 3dcccccd -> 3dccccbe", + "40f00000 bdcccccd -> 3dccccbe", + "40f00000 40f00000 -> 00000000", + "40f00000 c0f00000 -> 00000000", + "40f00000 33d6bf95 -> 32543ea8", + "40f00000 b3d6bf95 -> 32543ea8", + "40f00000 42c80000 -> 40f00000", + "40f00000 c2c80000 -> 40f00000", + "40f00000 461c4000 -> 40f00000", + "40f00000 3e99999a -> 3e999990", + "40f00000 3f333333 -> 3f000002", + "c0f00000 00000000 -> 00000000", + "c0f00000 3f800000 -> bf000000", + "c0f00000 bf800000 -> bf000000", + "c0f00000 3f000000 -> 00000000", + "c0f00000 bf000000 -> 00000000", + "c0f00000 40000000 -> bfc00000", + "c0f00000 c0000000 -> bfc00000", + "c0f00000 40400000 -> bfc00000", + "c0f00000 c0300000 -> c0000000", + "c0f00000 3dcccccd -> bdccccbe", + "c0f00000 bdcccccd -> bdccccbe", + "c0f00000 40f00000 -> 00000000", + "c0f00000 c0f00000 -> 00000000", + "c0f00000 33d6bf95 -> b2543ea8", + "c0f00000 b3d6bf95 -> b2543ea8", + "c0f00000 42c80000 -> c0f00000", + "c0f00000 c2c80000 -> c0f00000", + "c0f00000 461c4000 -> c0f00000", + "c0f00000 3e99999a -> be999990", + "c0f00000 3f333333 -> bf000002", + "33d6bf95 00000000 -> 00000000", + "33d6bf95 3f800000 -> 33d6bf95", + "33d6bf95 bf800000 -> 33d6bf95", + "33d6bf95 3f000000 -> 33d6bf95", + "33d6bf95 bf000000 -> 33d6bf95", + "33d6bf95 40000000 -> 33d6bf95", + "33d6bf95 c0000000 -> 33d6bf95", + "33d6bf95 40400000 -> 33d6bf95", + "33d6bf95 c0300000 -> 33d6bf95", + "33d6bf95 3dcccccd -> 33d6bf95", + "33d6bf95 bdcccccd -> 33d6bf95", + "33d6bf95 40f00000 -> 33d6bf95", + "33d6bf95 c0f00000 -> 33d6bf95", + "33d6bf95 33d6bf95 -> 00000000", + "33d6bf95 b3d6bf95 -> 00000000", + "33d6bf95 42c80000 -> 33d6bf95", + "33d6bf95 c2c80000 -> 33d6bf95", + "33d6bf95 461c4000 -> 33d6bf95", + "33d6bf95 3e99999a -> 33d6bf95", + "33d6bf95 3f333333 -> 33d6bf95", + "b3d6bf95 00000000 -> 00000000", + "b3d6bf95 3f800000 -> b3d6bf95", + "b3d6bf95 bf800000 -> b3d6bf95", + "b3d6bf95 3f000000 -> b3d6bf95", + "b3d6bf95 bf000000 -> b3d6bf95", + "b3d6bf95 40000000 -> b3d6bf95", + "b3d6bf95 c0000000 -> b3d6bf95", + "b3d6bf95 40400000 -> b3d6bf95", + "b3d6bf95 c0300000 -> b3d6bf95", + "b3d6bf95 3dcccccd -> b3d6bf95", + "b3d6bf95 bdcccccd -> b3d6bf95", + "b3d6bf95 40f00000 -> b3d6bf95", + "b3d6bf95 c0f00000 -> b3d6bf95", + "b3d6bf95 33d6bf95 -> 00000000", + "b3d6bf95 b3d6bf95 -> 00000000", + "b3d6bf95 42c80000 -> b3d6bf95", + "b3d6bf95 c2c80000 -> b3d6bf95", + "b3d6bf95 461c4000 -> b3d6bf95", + "b3d6bf95 3e99999a -> b3d6bf95", + "b3d6bf95 3f333333 -> b3d6bf95", + "42c80000 00000000 -> 00000000", + "42c80000 3f800000 -> 00000000", + "42c80000 bf800000 -> 00000000", + "42c80000 3f000000 -> 00000000", + "42c80000 bf000000 -> 00000000", + "42c80000 40000000 -> 00000000", + "42c80000 c0000000 -> 00000000", + "42c80000 40400000 -> 3f800000", + "42c80000 c0300000 -> 3f800000", + "42c80000 3dcccccd -> 3dcccc05", + "42c80000 bdcccccd -> 3dcccc05", + "42c80000 40f00000 -> 40200000", + "42c80000 c0f00000 -> 40200000", + "42c80000 33d6bf95 -> 3306d1f8", + "42c80000 b3d6bf95 -> 3306d1f8", + "42c80000 42c80000 -> 00000000", + "42c80000 c2c80000 -> 00000000", + "42c80000 461c4000 -> 42c80000", + "42c80000 3e99999a -> 3dcccab8", + "42c80000 3f333333 -> 3f1999b6", + "c2c80000 00000000 -> 00000000", + "c2c80000 3f800000 -> 00000000", + "c2c80000 bf800000 -> 00000000", + "c2c80000 3f000000 -> 00000000", + "c2c80000 bf000000 -> 00000000", + "c2c80000 40000000 -> 00000000", + "c2c80000 c0000000 -> 00000000", + "c2c80000 40400000 -> bf800000", + "c2c80000 c0300000 -> bf800000", + "c2c80000 3dcccccd -> bdcccc05", + "c2c80000 bdcccccd -> bdcccc05", + "c2c80000 40f00000 -> c0200000", + "c2c80000 c0f00000 -> c0200000", + "c2c80000 33d6bf95 -> b306d1f8", + "c2c80000 b3d6bf95 -> b306d1f8", + "c2c80000 42c80000 -> 00000000", + "c2c80000 c2c80000 -> 00000000", + "c2c80000 461c4000 -> c2c80000", + "c2c80000 3e99999a -> bdcccab8", + "c2c80000 3f333333 -> bf1999b6", + "461c4000 00000000 -> 00000000", + "461c4000 3f800000 -> 00000000", + "461c4000 bf800000 -> 00000000", + "461c4000 3f000000 -> 00000000", + "461c4000 bf000000 -> 00000000", + "461c4000 40000000 -> 00000000", + "461c4000 c0000000 -> 00000000", + "461c4000 40400000 -> 3f800000", + "461c4000 c0300000 -> 3f800000", + "461c4000 3dcccccd -> 3dcc7ead", + "461c4000 bdcccccd -> 3dcc7ead", + "461c4000 40f00000 -> 40200000", + "461c4000 c0f00000 -> 40200000", + "461c4000 33d6bf95 -> 33279eca", + "461c4000 b3d6bf95 -> 33279eca", + "461c4000 42c80000 -> 00000000", + "461c4000 c2c80000 -> 00000000", + "461c4000 461c4000 -> 00000000", + "461c4000 3e99999a -> 3dcbfc78", + "461c4000 3f333333 -> 3f000b29", + "3e99999a 00000000 -> 00000000", + "3e99999a 3f800000 -> 3e99999a", + "3e99999a bf800000 -> 3e99999a", + "3e99999a 3f000000 -> 3e99999a", + "3e99999a bf000000 -> 3e99999a", + "3e99999a 40000000 -> 3e99999a", + "3e99999a c0000000 -> 3e99999a", + "3e99999a 40400000 -> 3e99999a", + "3e99999a c0300000 -> 3e99999a", + "3e99999a 3dcccccd -> 32000000", + "3e99999a bdcccccd -> 32000000", + "3e99999a 40f00000 -> 3e99999a", + "3e99999a c0f00000 -> 3e99999a", + "3e99999a 33d6bf95 -> 32109200", + "3e99999a b3d6bf95 -> 32109200", + "3e99999a 42c80000 -> 3e99999a", + "3e99999a c2c80000 -> 3e99999a", + "3e99999a 461c4000 -> 3e99999a", + "3e99999a 3e99999a -> 00000000", + "3e99999a 3f333333 -> 3e99999a", + "3f333333 00000000 -> 00000000", + "3f333333 3f800000 -> 3f333333", + "3f333333 bf800000 -> 3f333333", + "3f333333 3f000000 -> 3e4ccccc", + "3f333333 bf000000 -> 3e4ccccc", + "3f333333 40000000 -> 3f333333", + "3f333333 c0000000 -> 3f333333", + "3f333333 40400000 -> 3f333333", + "3f333333 c0300000 -> 3f333333", + "3f333333 3dcccccd -> 3dccccca", + "3f333333 bdcccccd -> 3dccccca", + "3f333333 40f00000 -> 3f333333", + "3f333333 c0f00000 -> 3f333333", + "3f333333 33d6bf95 -> 33ab94d5", + "3f333333 b3d6bf95 -> 33ab94d5", + "3f333333 42c80000 -> 3f333333", + "3f333333 c2c80000 -> 3f333333", + "3f333333 461c4000 -> 3f333333", + "3f333333 3e99999a -> 3dccccc8", + "3f333333 3f333333 -> 00000000", + "c14410e1 4121455d -> c00b2e10", + "415012bc c0d801e6 -> 40c82392", + "c12815c5 c0a73a71 -> bd5b5400", + "4104bd66 41904610 -> 4104bd66", + "409993b5 c07e1ee0 -> 3f542228", + "4184fea6 c185fc8e -> 4184fea6", + "4088020a 407e61fc -> 3e8d10c0", + "c185bb89 4038e80d -> c0115407", + "bfc1bb2c 41908a71 -> bfc1bb2c", + "c110983b 418e7c15 -> c110983b", + "c10a2280 c17e2e15 -> c10a2280", + "c0b81d84 4162db8e -> c0b81d84", + "41499605 c12ba3d8 -> 3fef9168", + "41360684 c03c38cb -> 40236faf", + "c028f5c3 418dc7ec -> c028f5c3", + "c0ca83ad 41271c0f -> c0ca83ad", + "3f7f18b7 4142c4b1 -> 3f7f18b7", + "bfeaa9fc c02a15eb -> bfeaa9fc", + "c0bd3cd4 c1497a4b -> c0bd3cd4", + "400aa364 c007ba79 -> 3d3a3ac0", + "3f96c56b 4171a334 -> 3f96c56b", + "bf3bc008 c15caf54 -> bf3bc008", + "41911813 c16793a9 -> 406a71f4", + "4118ece1 418248ab -> 4118ece1", + "c19b9224 418f137f -> bfc7ea50", + "c0616d1e 40f04c4d -> c0616d1e", + "41980566 c02a2327 -> 3ec9a8f8", + "40b593c7 3f33c9b8 -> 3d650780", + "41117388 406b75ac -> 3fddc590", + "c178f5fb 40b8a1e3 -> c080a830", + "c156abdd 40be2917 -> bfc41630", + "40a2439d 41828f6d -> 40a2439d", + "40a9086e 41646ea0 -> 40a9086e", + "c1819e57 c197b101 -> c1819e57", + "c0d25b90 4196239e -> c0d25b90", + "419cfcc9 407f92b2 -> 40699b80", + "c08a1fbe c0165a33 -> bffbca92", + "c1886e21 4109b2e4 -> c107295e", + "3f044550 41346093 -> 3f044550", + "41542d60 c124196a -> 40404fd8", + "c0f306ee c033560a -> bffec390", + "4130ec62 414912e2 -> 4130ec62", + "c1184491 4135eea6 -> c1184491", + "c17e39c9 c1695cd2 -> bfa6e7b8", + "c14be50a bf924305 -> be3238c8", + "418384de 409dc24e -> 3fd33238", + "c08d8b89 4113d77c -> c08d8b89", + "410b8f7b c1853754 -> 410b8f7b", + "c1724469 bff28e0f -> bff040df", + "c1990b19 413de56d -> c0e8618a", + "c0b09701 c0ce206a -> c0b09701", + "413c8394 bf7000a1 -> 3f0831b4", + "40814b22 c02f5608 -> 3fa68078", + "4126b493 c08f541b -> 3fbb03c0", + "40beaef8 c09fb2c6 -> 3f77e190", + "c1873f2c c188bc70 -> c1873f2c", + "408de7d7 c103bb25 -> 408de7d7", + "c0ef6e6f c1653032 -> c0ef6e6f", + "411360bc 3f5e0b6c -> 3f099988", + "c0a464d1 4190f769 -> c0a464d1", + "c1910498 c1179bc9 -> c10a6d67", + "c1806783 c18d9bc0 -> c1806783", + "c0b4f319 4117c321 -> c0b4f319", + "4126139b 417fd53b -> 4126139b", + "419edd17 c12646b1 -> 4117737d", + "c18faaaf c1880924 -> bf743160", + "415f70e3 c05f4791 -> 3c254800", + "c18a45e7 4125fc9f -> c0dd1e5e", + "c0e220ac 41865f14 -> c0e220ac", + "418bb471 3f897456 -> 3e9006c0", + "c1675444 4105181f -> c0c4784a", + "c0631d25 c18e8949 -> c0631d25", + "41921b65 4116625e -> 410dd46c", + "c0fe2377 c106a6fc -> c0fe2377", + "418bb472 3fe952ad -> 3f875f0b", + "c187cab4 c19373cb -> c187cab4", + "4161ee93 4100e76d -> 40c20e4c", + "40a08e41 409a0ff0 -> 3e4fca20", + "418c2e46 c195b543 -> 418c2e46", + "c11a8827 c18698c8 -> c11a8827", + "bf817e35 c12a0fc8 -> bf817e35", + "4123093a c00dfc8e -> 3fa86560", + "4135ba44 40e82dea -> 4083469e", + "41959c98 c168637a -> 4085ab6c", + "c0267e33 c0e1606c -> c0267e33", + "40b21971 bfd89f88 -> 3efa1cb0", + "c09b6c36 c193ed80 -> c09b6c36", + "41720eb1 bffa493e -> 3fb874d6", + "4126fc02 4142c44c -> 4126fc02", + "c0d2d9bd c10681ba -> c0d2d9bd", + "415b5141 c11c324b -> 407c7bd8", + "c0f04b96 4195ca58 -> c0f04b96", + "bf457b6f 40eb91d6 -> bf457b6f", + "c17a4263 419902d5 -> c17a4263", + "409545e6 4150b07e -> 409545e6", + "4103bfd2 bfddc785 -> 3fa6e07c", + "c17e169d c0815466 -> c0706010", + "c1555d64 3ff65bbd -> bfe4c4b2", + "c0f89eb0 c12250b2 -> c0f89eb0", + "c19b2ce6 c0f05dc1 -> c08bf816", + "4190189b 410f1c33 -> 3dfc6800", + "406b704b 413a18c6 -> 406b704b", + "c15c9756 405745a1 -> beaa36a0", + "c0954e0f 41502a8e -> c0954e0f", + "c183de3f c193dedb -> c183de3f", + "4124a159 c07d9c63 -> 40174c9e", + "c1716af3 c11b07f4 -> c0acc5fe", + "c173f09d c0e7c85f -> bf4283e0", + "c13b452d c0907369 -> c02b4710", + "c121e604 3e70d105 -> bbcca520", + "40c448d1 c02b96bb -> 3f4590b0", + "4100b216 412c3ccd -> 4100b216", + "409ae8d7 c16a393a -> 409ae8d7", + "c18c0c68 c136bc37 -> c0c2b932", + "414866f2 c0f22d10 -> 409ea0d4", + "c1358341 3fd85950 -> bf9a0228", + "c19c253d c08c66f8 -> bffbe450", + "419ee1ff 3ee8a22b -> 3ea54287", + "c0a688a7 401552fe -> bf09ad48", + "c082cd14 4064d733 -> bf030bd4", + "415c37e1 c132e544 -> 40254a74", + "be092e57 3dbc78f5 -> bd2bc772", + "c1479db5 41562cf6 -> c1479db5", + "3ea2393b c05f4aa6 -> 3ea2393b", + "c191b00c c0a8c1ba -> c018f604", + "c16713aa 4132a7da -> c051af40", + "412c39b3 419bb0a7 -> 412c39b3", + "4124e776 c1946d1b -> 4124e776", + "410e2785 40ac3cae -> 406024b8", + "418f03a9 411a07b6 -> 4103ff9c", + "411bd536 40b55086 -> 408259e6", + "41874f07 40bb2e2a -> 40a6dfc8", + "41861e30 41415794 -> 4095c998", + "40f592b8 3ef5d5b3 -> 3ef1a603", + "412b2ceb 41378602 -> 412b2ceb", + "410e61d6 c10c34c6 -> 3e0b4400", + "c11d3937 c19a97c8 -> c11d3937", + "bf905069 c099ede4 -> bf905069", + "c178be4a 419c531a -> c178be4a", + "41547fe6 c16dae39 -> 41547fe6", + "4176cc04 40c02246 -> 405aa6f8", + "414e7269 c131ed1f -> 3fe42a50", + "41468a8e 3fc283da -> 3e80d680", + "4159d5a7 418808c2 -> 4159d5a7", + "c18746c8 c18ba2f7 -> c18746c8", + "c10f8670 40a9f5d8 -> c06a2e10", + "416ad59d 416fa09b -> 416ad59d", + "c100c8b6 c19e1976 -> c100c8b6", + "4105e5a5 40963bdb -> 406b1ede", + "4126ba67 417e4cbf -> 4126ba67", + "bfebf120 c12ad152 -> bfebf120", + "c0b4b6e8 416c028d -> c0b4b6e8", + "4146eb53 41950a01 -> 4146eb53", + "c19a0041 c0a7acdf -> c061f4ce", + "40f62e1c c0da89f4 -> 3f5d2140", + "c0c3f8e4 bfef91ec -> bf025b98", + "c1826434 4161501a -> c00de138", + "c0f17bd2 3f9eee97 -> bdc57be0", + "418ef6c4 c0edf7af -> 403fd764", + "c18f04f6 40be1e9c -> bd5c0200", + "c0da1d4c c0f2f220 -> c0da1d4c", + "3f29087b 40a652cb -> 3f29087b", + "c1599f27 c10b828f -> c09c3930", + "c171cd63 412c8991 -> c08a87a4", + "bc8bea3e bf3d94f7 -> bc8bea3e", + "40ec5b38 3eda8527 -> 3e05b7d2", + "40f75bc0 c184d7f9 -> 40f75bc0", + "c18baa8e c125e90a -> c0e2d824", + "c138bc94 c0a46def -> bfa27528", + "403e6247 c183cfca -> 403e6247", + "c197d1af 41239409 -> c10c0f55", + "c1982a9c c1473fc8 -> c0d22ae0", + "415f3ab3 c19896cf -> 415f3ab3", + "3d280725 40dac9b8 -> 3d280725", + "c08e30bb 4116f520 -> c08e30bb", + "c181fe37 3f9fc595 -> bcb6b7c0", + "c0bd1053 c18f61a1 -> c0bd1053", + "c13ab9ed c0ad1fd0 -> bf59a1d0", + "c183a363 c17743a8 -> bf8018f0", + "3fd10dd3 c1910903 -> 3fd10dd3", + "416c2de2 410d7f9b -> 40bd5c8e", + "415bc96b 40466939 -> 3fab0190", + "402250a9 c0dea341 -> 402250a9", + "bfb19ce0 413fe905 -> bfb19ce0", + "bf34f090 bf926a4f -> bf34f090", + "4116a0a5 411f8703 -> 4116a0a5", + "c04685d3 c0654b76 -> c04685d3", + "412a796c c11cf175 -> 3f587f70", + "3ef83ef9 407a2440 -> 3ef83ef9", + "c190ab49 c11cc86b -> c1048e27", + "bedeba63 c0cfa5d7 -> bedeba63", + "c09b3c69 40cc7348 -> c09b3c69", + "41511ba6 41124ce6 -> 407b3b00", + "c1056573 c0f288bf -> bf421138", + "41165e02 c08b5655 -> 3f307ad0", + "c18705f6 4112e860 -> c0f64718", + "c11fa787 402e2b00 -> bfe83a38", + "c13598e4 40ae92c8 -> bee0c380", + "4197debf 418886a5 -> 3ff581a0", + "bf2e18ea 40fbca4f -> bf2e18ea", + "c15646ef 3f49721e -> bc76bc80", + "4127ed5a 40d68989 -> 4072a256", + "40f9d1a0 416bfccb -> 40f9d1a0", + "418b9e40 bf4d12f5 -> 3f2139e7", + "c1308b6b c1419869 -> c1308b6b", + "412da38d 415f543e -> 412da38d", + "3fb388db 40a00454 -> 3fb388db", + "414a325a c14dd2fc -> 414a325a", + "c1363bd6 c14cb205 -> c1363bd6", + "c0db5346 414b7a1d -> c0db5346", + "4118c964 3f2b74de -> 3e30c870", + "41909fc0 c0ac3995 -> 3ff74904", + "3e05cf94 41629e2d -> 3e05cf94", + "c191f849 c12835c7 -> c0f77596", + "40a947da c0ae886d -> 40a947da", + "bf27b69e c0b87a23 -> bf27b69e", + "bfffe6d7 40963a70 -> bfffe6d7", + "c1988a61 409a4efa -> c0933c96", + "bff10cef 400682ce -> bff10cef", + "c103d908 40525134 -> bfd58370", + "41944f3a 411a8e1e -> 410e1056", + "40d7eb8f c1294636 -> 40d7eb8f", + "c0417a39 40125403 -> bf3c98d8", + "4167e4f5 412931eb -> 407acc28", + "40856a04 414fc395 -> 40856a04", + "417d8022 c198c16f -> 417d8022", + "412697ee c1210d67 -> 3eb150e0", + "c194dd89 c10b1c59 -> bf9c1300", + "c0a825ae c0e8bd77 -> c0a825ae", + "c01ef6d9 408d3b97 -> c01ef6d9", + "3f2615f4 4199efd7 -> 3f2615f4", + "c18b09ff c0b186c4 -> bf3c9d80", + "c15c2868 c16ec83b -> c15c2868", + "c0aacfaa 400e7e80 -> bf628950", + "418497af c13c465e -> 4099d200", + "40f30350 bda48cf0 -> 3d2a27c0", + "409adb5c c0b66a3a -> 409adb5c", + "40d488f8 c159d60b -> 40d488f8", + "c128af95 c088851a -> c000a9ec", + "418e7c48 4155e906 -> 408e1f14", + "c117b863 c116a66d -> bd88fb00", + "c065c669 c176a4a0 -> c065c669", + "40ef54d0 c0822f43 -> 405a4b1a", + "c0ece091 c12f589b -> c0ece091", + "41646464 c0ac4068 -> 40608ff0", + "40b094c6 bf919996 -> 3f77d980", + "4114759e c1323bab -> 4114759e", + "419e8683 411849b4 -> 3f4799e0", + "4142a37d c070709a -> 3f64f098", + "416990c8 c0559bef -> 3f9fa6c8", + "c115c6c2 408f7943 -> bec9afe0", + "c097d4d0 bf37266c -> bee77ff0", + "c0eb78b2 c1113593 -> c0eb78b2", + "bee563df 41125e0c -> bee563df", + "40b15e19 4160a46f -> 40b15e19", + "c13f85e6 419ee9c9 -> c13f85e6", + "4196dbf2 4158b4d3 -> 40aa0622", + "418e22c4 c12ae255 -> 40e2c666", + "413af61a c015332d -> 3cec4380", + "40e3ebc0 c03645ac -> 3fb69850", + "40a9724b 4127fce9 -> 40a9724b", + "c0b503e6 c1941693 -> c0b503e6", + "c0ddd0ad 40317166 -> bfb17d1c", + "c1699fbc c14a5a77 -> bffa2a28", + "40cc6a31 c15d4dc5 -> 40cc6a31", + "c0fd9cb6 4151a7b1 -> c0fd9cb6", + "41824558 405858a6 -> 4030c828", + "408ca34a c0226da1 -> 3fedb1e6", + "c1145259 415500a0 -> c1145259", + "c183edcb 41751bfd -> bf95fcc8", + "40dbc09d c1435a72 -> 40dbc09d", + "c08bd9e5 c12a48f6 -> c08bd9e5", + "4108252e 40ae2ccd -> 40443b1e", + "404d55d4 c11cd0d5 -> 404d55d4", + "c167a729 c1403d73 -> c01da6d8", + "418b4e80 c15ff53d -> 405a9f0c", + "c068b8cc 41007c75 -> c068b8cc", + "c0b636e0 4186acbb -> c0b636e0", + "3fac45f0 bf7159b6 -> 3ece6454", + "3ee2a9b6 c0ed5028 -> 3ee2a9b6", + "419bc6b4 4140df24 -> 40ed5c88", + "40a09193 c125db23 -> 40a09193", + "41705153 417e7443 -> 41705153", + "be6414ac c11e9d86 -> be6414ac", + "416f5ac2 3f05313c -> 3ec89320", + "41803bd4 40aa1f30 -> 3da47000", + "3fb36351 41360818 -> 3fb36351", + "c03e5c8e c103030f -> c03e5c8e", + "41598854 41398527 -> 40000cb4", + "bee0f982 41220a30 -> bee0f982", + "c0238b81 c198ddab -> c0238b81", + "416ce974 4199600b -> 416ce974", + "c0a0aa4c bff103de -> bfa0a174", + "40a58be1 417adab0 -> 40a58be1", + "40bbc090 40a74699 -> 3f23cfb8", + "4182a361 c185bb1f -> 4182a361", + "c12aa950 c1587d7b -> c12aa950", + "4149b4f4 c0f48a70 -> 409edf78", + "c19c86da c10e4148 -> bfe45920", + "40b50076 c19da1dd -> 40b50076", + "c1830c89 c1670de7 -> bff85958", + "c1907fe9 c0c12dea -> c0bfa3d0", + "c1133b69 c1855271 -> c1133b69", + "c0cf3157 412326b3 -> c0cf3157", + "c144eef3 c0b2ea33 -> bf902600", + "411a8492 41716e07 -> 411a8492", + "41801c87 4186fab0 -> 41801c87", + "c15ba139 c1123619 -> c092d640", + "3fe5c50f c001493b -> 3fe5c50f", + "4070c1ee 3f16ae46 -> 3e6bc850", + "418cba04 4130a35c -> 40d1a158", + "3f78c07e 4120c678 -> 3f78c07e", + "c1108615 40c1ec39 -> c03e3fe2", + "403f265c c134bf9f -> 403f265c", + "c0b108c4 c0cfd0cc -> c0b108c4", + "c02c87ac c12bc9d2 -> c02c87ac", + "c0e2c94f 4180412c -> c0e2c94f", + "c0887438 c120cfc0 -> c0887438", + "c12c9158 410fd7a9 -> bfe5cd78", + "4153d75e c13865bc -> 3fdb8d10", + "40d464b3 417202a3 -> 40d464b3", + "4189b9f2 c1787140 -> 3fd81520", + "c0ef89a0 418a741f -> c0ef89a0", + "c05ab65a 4181df73 -> c05ab65a", + "41924a5e c19a1c1c -> 41924a5e", + "4144fe55 c05ea695 -> 3ff00b2a", + "c19ef91f 412470d9 -> c1198165", + "4135b932 418da0c8 -> 4135b932", + "418704d0 c140e6e8 -> 409a4570", + "41423610 403becc6 -> 3ec92940", + "40c1619d c12965af -> 40c1619d", + "c06a9d4c c091eb7d -> c06a9d4c", + "c17ba497 c120a4cf -> c0b5ff90", + "41745e14 40b059dc -> 40880870", + "bfa3c61d c14c6ce4 -> bfa3c61d", + "c17362ff 416c5e46 -> bee09720", + "407c7d1a 4141749d -> 407c7d1a", + "4191b2b7 4189387b -> 3f87a3c0", + "c1619557 4190bcd2 -> c1619557", + "41414fec 4155d3fc -> 41414fec", + "41230431 418b2858 -> 41230431", + "4077ad56 418c9ded -> 4077ad56", + "c19ae5eb c18ff91b -> bfaecd00", + "c193c9e6 40d86774 -> c09e58b0", + "c080805a c1234abd -> c080805a", + "4196833d c18767b4 -> 3ff1b890", + "418586b9 c02a4614 -> 3f3a4540", + "c1711d40 c121ff24 -> c09e3c38", + "c0d38897 c186e5b1 -> c0d38897", + "c08cc13e c050ea9d -> bf912fbe", + "3de78cf3 bfe68718 -> 3de78cf3", + "c19bb7c1 40a64396 -> c0782884", + "41969bec 419cdaea -> 41969bec", + "3dee9dbf c04e9dcf -> 3dee9dbf", + "419ee3cf 3f465709 -> 3efbf3fe", + "c03075bd c01cbf31 -> be9db460", + "c17e471b 4163a932 -> bfd4ef48", + "c17c9537 3ea422e0 -> bd9fe800", + "4117b1b0 c0bc4f96 -> 40662794", + "4192591e 3e9a4b03 -> 3e596598", + "4124ba2a 40df6bfa -> 405410b4", + "41168080 c02580d2 -> 3fd2ff14", + "40095d6d 419621b7 -> 40095d6d", + "c14f282b 40548ef3 -> c03ef3d3", + "4182763c 40717f96 -> 3f9b6710", + "c12232a7 c00307e6 -> bff95608", + "3da1603a c146c7ab -> 3da1603a", + "c10a5533 4172b841 -> c10a5533", + "c0f315a8 419c7883 -> c0f315a8", + "c0ab5daa bff73373 -> bfbf0fc2", + "c13587ac 419b3def -> c13587ac", + "c159e1b0 c1937a30 -> c159e1b0", + "4126d95f c180cf93 -> 4126d95f", + "bf72e65a 410f1499 -> bf72e65a", + "40b22460 40c7ec6d -> 40b22460", + "41301fe7 4179100e -> 41301fe7", + "c16fc53a c0bd6691 -> c0497aa4", + "40fd353b 4173f475 -> 40fd353b", + "411a5b27 bfda7ad4 -> 3f8e7314", + "4193ffba c1626d0a -> 408b24d4", + "c18bc327 416fa95a -> c01f73d0", + "c135abdb bf3b2fa8 -> bec5e5b0", + "41240862 c0d5a510 -> 4064d768", + "4139a039 c10f49b5 -> 40295a10", + "c15f5610 bfd35bd3 -> bf3fa3d0", + "c10e12eb 418aa81b -> c10e12eb", + "3f9a2b35 412e3b4c -> 3f9a2b35", + "40de5b95 4088f0e7 -> 402ad55c", + "418322de c1973173 -> 418322de", + "416833c6 4076b5a7 -> 403cae23", + "3fa59d9c 41938661 -> 3fa59d9c", + "4149f68e 4111ff8b -> 405fdc0c", + "4174a972 c133187c -> 408321ec", + "c14c8cc7 c0a7496e -> c0150d64", + "406d7a0d c0b46939 -> 406d7a0d", + "c0bfd2d1 c0a0154b -> bf7dec30", + "c12c864a bea7e77b -> be93d9e0", + "c18802f8 c1394da3 -> c0ad709a", + "bfbc5da2 40c21e4d -> bfbc5da2", + "c15dfcef 412ee77a -> c03c55d4", + "41964a22 c1976e94 -> 41964a22", + "413decd3 417a442b -> 413decd3", + "c1904d8c 418eb343 -> be4d2480", + "bffe3300 c12812b8 -> bffe3300", + "c0ebd280 406f5993 -> c0684b6d", + "4125abd6 c0e485b4 -> 404da3f0", + "41410882 415a51d7 -> 41410882", + "c148ab0a c0bc82b5 -> bf428550", + "c0c7cb71 415d1beb -> c0c7cb71", + "3df41c5f c198ed32 -> 3df41c5f", + "c1977793 418ac137 -> bfcb65c0", + "419ef64a c0c7209a -> 3f99dd68", + "c0db4e30 bf21bd1d -> bf090e5e", + "40e4f9d8 417de5cc -> 40e4f9d8", + "40ff2c4a 41989f56 -> 40ff2c4a", + "4169c64e c121c2b8 -> 4090072c", + "4187e505 c0f9bcb2 -> 3fb06ac0", + "c132709a c1943426 -> c132709a", + "c178aeff c10e65d6 -> c0d49252", + "c17dc3aa 418821b8 -> c17dc3aa", + "40a24025 418cac3a -> 40a24025", + "419256e4 3fdedf26 -> 3f616d88", + "413dd231 416096e2 -> 413dd231", + "418b8480 c1873c83 -> 3f08ffa0", + "c0ef6104 4190747d -> c0ef6104", + "c0a5670b c11fefd4 -> c0a5670b", + "c15a7c7d 3ee61a5c -> be30f1b0", + "c11d73fb 410f272a -> bf64cd10", + "41510e1f c1297ef5 -> 401e3ca8", + "416a49b1 c1032c27 -> 40ce3b14", + "40eee4f0 c1958c7f -> 40eee4f0", + "c0bbb744 c143a5be -> c0bbb744", + "41198e3e 413d965b -> 41198e3e", + "bff95b53 411b6d74 -> bff95b53", + "c0f298c3 c0329700 -> c0000386", + "4112693c c0e7c6f4 -> 3ff42e10", + "4133f32c 419726cd -> 4133f32c", + "3f07d771 c05c389f -> 3f07d771", + "c1954c2e 40189035 -> bffcdffa", + "41785750 c18b137b -> 41785750", + "c124a535 40d8b041 -> c0613452", + "c0788344 c18f1d77 -> c0788344", + "c09de939 4100f100 -> c09de939", + "40ea8b1b 407d21dc -> 4057f45a", + "c1488b40 c184b5b3 -> c1488b40", + "c17aa160 4145a15e -> c0540008", + "408cbc48 c02fd3ea -> 3fd3494c", + "3f335304 c196689c -> 3f335304", + "413eb93b 41996a4b -> 413eb93b", + "c18e38e0 416a9488 -> c04774e0", + "c121bf8e 4188b043 -> c121bf8e", + "c032f117 40772a10 -> c032f117", + "c003b7ac c1894c06 -> c003b7ac", + "c013c565 c135033b -> c013c565", + "c0db7033 beeaeca9 -> bede11f2", + "c0d6268a 419827d5 -> c0d6268a", + "41840351 40e4b63b -> 400d419c", + "4112ba17 c170e064 -> 4112ba17", + "41208c63 418d20a8 -> 41208c63", + "c1657da0 c179ecfd -> c1657da0", + "4185e76f c152415a -> 40663610", + "c1182c5e bf38e90e -> bdf78150", + "4012a9dd 41465944 -> 4012a9dd", + "41674f6a 4126120d -> 40827aba", + "40a84e4a c1910c8e -> 40a84e4a", + "40a80745 c19d9b05 -> 40a80745", + "c081b208 c11cae2b -> c081b208", + "40e1ddbe c0e5fead -> 40e1ddbe", + "4102222e c10ff5ed -> 4102222e", + "3f89cea6 4191d11d -> 3f89cea6", + "407afa8b 40e10e11 -> 407afa8b", + "418d2564 bfef487d -> 3f5193b6", + "c191e61b c160dd7d -> c085dd72", + "40d245fa c19cfd82 -> 40d245fa", + "4174e4bd 40f57c82 -> 40f44cf8", + "c0ef9a20 c14da84f -> c0ef9a20", + "406ce87b c1214893 -> 406ce87b", + "c188a940 c140dbaf -> c0a0eda2", + "c12588c1 c046b90b -> bf83efc6", + "4063e7a1 414fb8a1 -> 4063e7a1", + "c1914ccc c1931163 -> c1914ccc", + "4167adc3 c0eac938 -> 40e4924e", + "c1850488 4097d15d -> c0193c12", + "c13aa03b c11d46fd -> bfeac9f0", + "c0d1c4f7 408df8b8 -> c007987e", + "41834276 40fe6b14 -> 3f019d80", + "bf06306c c155069c -> bf06306c", + "4040a876 416d7844 -> 4040a876", + "40419e9a 41548690 -> 40419e9a", + "413c878c 4184d409 -> 413c878c", + "40a208a6 41653e80 -> 40a208a6", + "4135393a c1571b69 -> 4135393a", + "4115ddcf 41259366 -> 4115ddcf", + "415ce833 406ae0f3 -> 4032fdf3", + "41911e81 414d4ab9 -> 40a9e492", + "4101b155 40f9f241 -> 3e970690", + "419c00c5 4165d08c -> 40a461fc", + "4197931c 416d9d8a -> 4083115c", + "c1739298 c13e4528 -> c05535c0", + "c10ebab6 bfe314a7 -> bd4dcda0", + "419206fc 4187b0e9 -> 3fa56130", + "c19d6246 c162870f -> c0b07afa", + "4156fe23 c08446e8 -> 3f849e38", + "c1975e30 c13a4321 -> c0e8f27e", + "3f55258a c052c92a -> 3f55258a", + "410ee017 c0df0001 -> 3ffb00b4", + "c19d00a5 4192da3e -> bfa26670", + "c193dc28 c0b936d4 -> bf8f3090", + "c17c8054 c0eff2a7 -> bf48dad0", + "c17e48a9 c117cb99 -> c0ccfa20", + "c0a13916 c05c45ef -> bfcc587a", + "c19ed2bb 40332c87 -> be82f138", + "418e4b21 c18e0944 -> 3d03ba00", + "40d849d3 bf6ff227 -> 3e4abe1c", + "c12e18b5 4114da33 -> bfc9f410", + "4109ce27 3f977b76 -> 3ea843f8", + "c166efb2 418d27d6 -> c166efb2", + "402ee022 c0a21837 -> 402ee022", + "c11b506f 3d865ad3 -> bd821057", + "c13b0b64 4133b833 -> beea6620", + "c0eabf07 c12d3687 -> c0eabf07", + "412a70cc 413603d1 -> 412a70cc", + "c126e3ba 4115651b -> bf8bf4f8", + "c0787587 c11fc95e -> c0787587", + "4149e364 3fc12552 -> 3f0be120", + "417d7ab3 be806e67 -> 3d215838", + "c0ba972f 41285a73 -> c0ba972f", + "bc8ee7d3 c0616a29 -> bc8ee7d3", + "400cce3c c09dfe6b -> 400cce3c", + "40867d5f 4174db52 -> 40867d5f", + "c0bf385c 40e59253 -> c0bf385c", + "40d504ab 412b8ca4 -> 40d504ab", + "41609e60 c1161e90 -> 4094ffa0", + "c10827a3 408d3924 -> c0831622", + "412c9258 c1515af6 -> 412c9258", + "c17fd865 c0130f6f -> c00d04fa", + "c0c102e4 403f2eeb -> bd69fc80", + "4193e0a9 c18ded95 -> 3f3e6280", + "c14de90c c18d1694 -> c14de90c", + "4186a44d 413fa910 -> 409b3f14", + "c178ee03 4182058e -> c178ee03", + "413be970 41834bf8 -> 413be970", + "4180c190 4143893b -> 4077e794", + "3f802b1f 417b9280 -> 3f802b1f", + "40bc0229 40466fc5 -> 4031948d", + "c084f1a1 40ae4b1c -> c084f1a1", + "c1923a0d 416acf90 -> c0669228", + "40a71e7c c18448c3 -> 40a71e7c", + "407265fe c135fadc -> 407265fe", + "c15a88ce 40b7b45d -> c00b51c4", + "4150082f 408510ac -> 3f06f2d0", + "c18a6378 c1069973 -> bef28140", + "c0b28768 c14e21b1 -> c0b28768", + "40f28087 c07bc5d5 -> 40693b39", + "41641674 40ca66f9 -> 3fcd7bd8", + "c1868303 4152a81c -> c06977a8", + "40f1ee57 3ff88189 -> 3fde34c1", + "c1822eeb 411b829b -> c0d1b676", + "40c207c2 c0f53581 -> 40c207c2", + "c09d7ba1 4123670a -> c09d7ba1", + "c0038d66 419266fd -> c0038d66", + "c069623f 4197cd7f -> c069623f", + "3f9a8606 40284270 -> 3f9a8606", + "c12084d3 c11a1d04 -> beccf9e0", + "41129d11 40ca0ab3 -> 40365ede", + "4184ddae c18a7c90 -> 4184ddae", + "bf613312 412fe363 -> bf613312", + "4186522a 41819fe3 -> 3f1648e0", + "40b91249 41919b70 -> 40b91249", + "c14f11f0 40ba8489 -> bfa46b38", + "41459e5a 4177f408 -> 41459e5a", + "418123aa 4187f68a -> 418123aa", + "40e59dd4 4125d843 -> 40e59dd4", + "4103f601 40b2fd12 -> 4029dde0", + "40777ed3 c0f66063 -> 40777ed3", + "418e1e7a c0fd5637 -> 3ff735e8", + "4135dfd7 c171e882 -> 4135dfd7", + "419a8d5c c0d299a4 -> 40c50228", + "c185f0b6 c092b8cc -> c03f30e8", + "c12f7bcf 3fba0865 -> bf4b476a", + "403be383 c1614404 -> 403be383", + "c12459d8 c19dd875 -> c12459d8", + "4090b861 415aaf62 -> 4090b861", + "4186bbb2 c10e9e95 -> 40fdb19e", + "4119f4ed c194c0da -> 4119f4ed", + "418a211d c119300e -> 40f62458", + "41332a8c 415a2ed5 -> 41332a8c", + "3f143785 3fbe32a2 -> 3f143785", + "40170ef1 c102f7e3 -> 40170ef1", + "c173220d 4108ba2a -> c0d4cfc6", + "41329d44 c1460017 -> 41329d44", + "4113aa2e 417410e4 -> 4113aa2e", + "413b3563 4120aa71 -> 3fd45790", + "41846823 40889123 -> 406fda46", + "4102c008 c18f01cf -> 4102c008", + "bff6b16c 406a664c -> bff6b16c", + "c14e23bc bed288d6 -> be0bcb2c", + "4151cb8c 413ee3ae -> 3f973ef0", + "41083b13 c0e3872e -> 3fb3bbe0", + "400c4529 c1715198 -> 400c4529", + "410bc54c 40e34a45 -> 3fd1014c", + "c0296b75 c17e3097 -> c0296b75", + "c1994fe2 c0e6b6fd -> c097d18e", + "418fb40a 417897d1 -> 401b410c", + "41353f58 41535a4a -> 41353f58", + "c104d4a3 c18ccb66 -> c104d4a3", + "c0f20de2 c192afea -> c0f20de2", + "418c353b 418f24ca -> 418c353b", + "3f021fc1 c138e326 -> 3f021fc1", + "c19f553f c12b163c -> c1139442", + "4083313f c0d804cd -> 4083313f", + "c1488c31 417e3334 -> c1488c31", + "bf55b9bc 4184a79a -> bf55b9bc", + "c18ed924 416ebe3d -> c03bd02c", + "bfc25ee0 c192339a -> bfc25ee0", + "c161af2e 404dd0a8 -> bf9ef430", + "c0e00000 40e00000 -> 00000000", + "40e00000 40e00000 -> 00000000", + "4b189680 40400000 -> 3f800000", + "3f800000 00000000 -> 00000000", + "c0b00000 c0000000 -> bfc00000", + "40b00000 c0000000 -> 3fc00000", + "be99999a 3dcccccd -> b2000000", + "3e99999a 3dcccccd -> 32000000" + ] + }, + { + "function": "cycles_floored_modulo", + "node": "ShaderNodeMath FLOORED_MODULO", + "cases": [ + "00000000 00000000 -> 00000000", + "00000000 3f800000 -> 00000000", + "00000000 bf800000 -> 00000000", + "00000000 3f000000 -> 00000000", + "00000000 bf000000 -> 00000000", + "00000000 40000000 -> 00000000", + "00000000 c0000000 -> 00000000", + "00000000 40400000 -> 00000000", + "00000000 c0300000 -> 00000000", + "00000000 3dcccccd -> 00000000", + "00000000 bdcccccd -> 00000000", + "00000000 40f00000 -> 00000000", + "00000000 c0f00000 -> 00000000", + "00000000 33d6bf95 -> 00000000", + "00000000 b3d6bf95 -> 00000000", + "00000000 42c80000 -> 00000000", + "00000000 c2c80000 -> 00000000", + "00000000 461c4000 -> 00000000", + "00000000 3e99999a -> 00000000", + "00000000 3f333333 -> 00000000", + "3f800000 00000000 -> 00000000", + "3f800000 3f800000 -> 00000000", + "3f800000 bf800000 -> 00000000", + "3f800000 3f000000 -> 00000000", + "3f800000 bf000000 -> 00000000", + "3f800000 40000000 -> 3f800000", + "3f800000 c0000000 -> bf800000", + "3f800000 40400000 -> 3f800000", + "3f800000 c0300000 -> bfe00000", + "3f800000 3dcccccd -> 00000000", + "3f800000 bdcccccd -> 00000000", + "3f800000 40f00000 -> 3f800000", + "3f800000 c0f00000 -> c0d00000", + "3f800000 33d6bf95 -> 00000000", + "3f800000 b3d6bf95 -> 00000000", + "3f800000 42c80000 -> 3f800000", + "3f800000 c2c80000 -> c2c60000", + "3f800000 461c4000 -> 3f800000", + "3f800000 3e99999a -> 3dccccc8", + "3f800000 3f333333 -> 3e99999a", + "bf800000 00000000 -> 00000000", + "bf800000 3f800000 -> 00000000", + "bf800000 bf800000 -> 00000000", + "bf800000 3f000000 -> 00000000", + "bf800000 bf000000 -> 00000000", + "bf800000 40000000 -> 3f800000", + "bf800000 c0000000 -> bf800000", + "bf800000 40400000 -> 40000000", + "bf800000 c0300000 -> bf800000", + "bf800000 3dcccccd -> 00000000", + "bf800000 bdcccccd -> 00000000", + "bf800000 40f00000 -> 40d00000", + "bf800000 c0f00000 -> bf800000", + "bf800000 33d6bf95 -> 00000000", + "bf800000 b3d6bf95 -> 00000000", + "bf800000 42c80000 -> 42c60000", + "bf800000 c2c80000 -> bf800000", + "bf800000 461c4000 -> 461c3c00", + "bf800000 3e99999a -> 3e4cccd0", + "bf800000 3f333333 -> 3ecccccc", + "3f000000 00000000 -> 00000000", + "3f000000 3f800000 -> 3f000000", + "3f000000 bf800000 -> bf000000", + "3f000000 3f000000 -> 00000000", + "3f000000 bf000000 -> 00000000", + "3f000000 40000000 -> 3f000000", + "3f000000 c0000000 -> bfc00000", + "3f000000 40400000 -> 3f000000", + "3f000000 c0300000 -> c0100000", + "3f000000 3dcccccd -> 00000000", + "3f000000 bdcccccd -> 00000000", + "3f000000 40f00000 -> 3f000000", + "3f000000 c0f00000 -> c0e00000", + "3f000000 33d6bf95 -> 00000000", + "3f000000 b3d6bf95 -> 00000000", + "3f000000 42c80000 -> 3f000000", + "3f000000 c2c80000 -> c2c70000", + "3f000000 461c4000 -> 3f000000", + "3f000000 3e99999a -> 3e4ccccc", + "3f000000 3f333333 -> 3f000000", + "bf000000 00000000 -> 00000000", + "bf000000 3f800000 -> 3f000000", + "bf000000 bf800000 -> bf000000", + "bf000000 3f000000 -> 00000000", + "bf000000 bf000000 -> 00000000", + "bf000000 40000000 -> 3fc00000", + "bf000000 c0000000 -> bf000000", + "bf000000 40400000 -> 40200000", + "bf000000 c0300000 -> bf000000", + "bf000000 3dcccccd -> 00000000", + "bf000000 bdcccccd -> 00000000", + "bf000000 40f00000 -> 40e00000", + "bf000000 c0f00000 -> bf000000", + "bf000000 33d6bf95 -> 00000000", + "bf000000 b3d6bf95 -> 00000000", + "bf000000 42c80000 -> 42c70000", + "bf000000 c2c80000 -> bf000000", + "bf000000 461c4000 -> 461c3e00", + "bf000000 3e99999a -> 3dccccd0", + "bf000000 3f333333 -> 3e4ccccc", + "40000000 00000000 -> 00000000", + "40000000 3f800000 -> 00000000", + "40000000 bf800000 -> 00000000", + "40000000 3f000000 -> 00000000", + "40000000 bf000000 -> 00000000", + "40000000 40000000 -> 00000000", + "40000000 c0000000 -> 00000000", + "40000000 40400000 -> 40000000", + "40000000 c0300000 -> bf400000", + "40000000 3dcccccd -> 00000000", + "40000000 bdcccccd -> 00000000", + "40000000 40f00000 -> 40000000", + "40000000 c0f00000 -> c0b00000", + "40000000 33d6bf95 -> 00000000", + "40000000 b3d6bf95 -> 00000000", + "40000000 42c80000 -> 40000000", + "40000000 c2c80000 -> c2c40000", + "40000000 461c4000 -> 40000000", + "40000000 3e99999a -> 3e4cccc8", + "40000000 3f333333 -> 3f19999a", + "c0000000 00000000 -> 00000000", + "c0000000 3f800000 -> 00000000", + "c0000000 bf800000 -> 00000000", + "c0000000 3f000000 -> 00000000", + "c0000000 bf000000 -> 00000000", + "c0000000 40000000 -> 00000000", + "c0000000 c0000000 -> 00000000", + "c0000000 40400000 -> 3f800000", + "c0000000 c0300000 -> c0000000", + "c0000000 3dcccccd -> 00000000", + "c0000000 bdcccccd -> 00000000", + "c0000000 40f00000 -> 40b00000", + "c0000000 c0f00000 -> c0000000", + "c0000000 33d6bf95 -> 00000000", + "c0000000 b3d6bf95 -> 00000000", + "c0000000 42c80000 -> 42c40000", + "c0000000 c2c80000 -> c0000000", + "c0000000 461c4000 -> 461c3800", + "c0000000 3e99999a -> 3dcccce0", + "c0000000 3f333333 -> 3dccccc0", + "40400000 00000000 -> 00000000", + "40400000 3f800000 -> 00000000", + "40400000 bf800000 -> 00000000", + "40400000 3f000000 -> 00000000", + "40400000 bf000000 -> 00000000", + "40400000 40000000 -> 3f800000", + "40400000 c0000000 -> bf800000", + "40400000 40400000 -> 00000000", + "40400000 c0300000 -> c0200000", + "40400000 3dcccccd -> 00000000", + "40400000 bdcccccd -> 00000000", + "40400000 40f00000 -> 40400000", + "40400000 c0f00000 -> c0900000", + "40400000 33d6bf95 -> 00000000", + "40400000 b3d6bf95 -> 00000000", + "40400000 42c80000 -> 40400000", + "40400000 c2c80000 -> c2c20000", + "40400000 461c4000 -> 40400000", + "40400000 3e99999a -> 00000000", + "40400000 3f333333 -> 3e4cccd0", + "c0300000 00000000 -> 00000000", + "c0300000 3f800000 -> 3e800000", + "c0300000 bf800000 -> bf400000", + "c0300000 3f000000 -> 3e800000", + "c0300000 bf000000 -> be800000", + "c0300000 40000000 -> 3fa00000", + "c0300000 c0000000 -> bf400000", + "c0300000 40400000 -> 3e800000", + "c0300000 c0300000 -> 00000000", + "c0300000 3dcccccd -> 3d4cccc0", + "c0300000 bdcccccd -> bd4cccc0", + "c0300000 40f00000 -> 40980000", + "c0300000 c0f00000 -> c0300000", + "c0300000 33d6bf95 -> 00000000", + "c0300000 b3d6bf95 -> 00000000", + "c0300000 42c80000 -> 42c28000", + "c0300000 c2c80000 -> c0300000", + "c0300000 461c4000 -> 461c3500", + "c0300000 3e99999a -> 3e800000", + "c0300000 3f333333 -> 3d4cccc0", + "3dcccccd 00000000 -> 00000000", + "3dcccccd 3f800000 -> 3dcccccd", + "3dcccccd bf800000 -> bf666666", + "3dcccccd 3f000000 -> 3dcccccd", + "3dcccccd bf000000 -> becccccd", + "3dcccccd 40000000 -> 3dcccccd", + "3dcccccd c0000000 -> bff33333", + "3dcccccd 40400000 -> 3dcccccd", + "3dcccccd c0300000 -> c029999a", + "3dcccccd 3dcccccd -> 00000000", + "3dcccccd bdcccccd -> 00000000", + "3dcccccd 40f00000 -> 3dcccccd", + "3dcccccd c0f00000 -> c0eccccd", + "3dcccccd 33d6bf95 -> 00000000", + "3dcccccd b3d6bf95 -> 00000000", + "3dcccccd 42c80000 -> 3dcccccd", + "3dcccccd c2c80000 -> c2c7cccd", + "3dcccccd 461c4000 -> 3dcccccd", + "3dcccccd 3e99999a -> 3dcccccd", + "3dcccccd 3f333333 -> 3dcccccd", + "bdcccccd 00000000 -> 00000000", + "bdcccccd 3f800000 -> 3f666666", + "bdcccccd bf800000 -> bdcccccd", + "bdcccccd 3f000000 -> 3ecccccd", + "bdcccccd bf000000 -> bdcccccd", + "bdcccccd 40000000 -> 3ff33333", + "bdcccccd c0000000 -> bdcccccd", + "bdcccccd 40400000 -> 4039999a", + "bdcccccd c0300000 -> bdcccccd", + "bdcccccd 3dcccccd -> 00000000", + "bdcccccd bdcccccd -> 00000000", + "bdcccccd 40f00000 -> 40eccccd", + "bdcccccd c0f00000 -> bdcccccd", + "bdcccccd 33d6bf95 -> 00000000", + "bdcccccd b3d6bf95 -> 00000000", + "bdcccccd 42c80000 -> 42c7cccd", + "bdcccccd c2c80000 -> bdcccccd", + "bdcccccd 461c4000 -> 461c3f9a", + "bdcccccd 3e99999a -> 3e4cccce", + "bdcccccd 3f333333 -> 3f199999", + "40f00000 00000000 -> 00000000", + "40f00000 3f800000 -> 3f000000", + "40f00000 bf800000 -> bf000000", + "40f00000 3f000000 -> 00000000", + "40f00000 bf000000 -> 00000000", + "40f00000 40000000 -> 3fc00000", + "40f00000 c0000000 -> bf000000", + "40f00000 40400000 -> 3fc00000", + "40f00000 c0300000 -> bf400000", + "40f00000 3dcccccd -> 00000000", + "40f00000 bdcccccd -> 00000000", + "40f00000 40f00000 -> 00000000", + "40f00000 c0f00000 -> 00000000", + "40f00000 33d6bf95 -> 00000000", + "40f00000 b3d6bf95 -> 00000000", + "40f00000 42c80000 -> 40f00000", + "40f00000 c2c80000 -> c2b90000", + "40f00000 461c4000 -> 40f00000", + "40f00000 3e99999a -> 3e999990", + "40f00000 3f333333 -> 3f000000", + "c0f00000 00000000 -> 00000000", + "c0f00000 3f800000 -> 3f000000", + "c0f00000 bf800000 -> bf000000", + "c0f00000 3f000000 -> 00000000", + "c0f00000 bf000000 -> 00000000", + "c0f00000 40000000 -> 3f000000", + "c0f00000 c0000000 -> bfc00000", + "c0f00000 40400000 -> 3fc00000", + "c0f00000 c0300000 -> c0000000", + "c0f00000 3dcccccd -> 00000000", + "c0f00000 bdcccccd -> 00000000", + "c0f00000 40f00000 -> 00000000", + "c0f00000 c0f00000 -> 00000000", + "c0f00000 33d6bf95 -> 00000000", + "c0f00000 b3d6bf95 -> 00000000", + "c0f00000 42c80000 -> 42b90000", + "c0f00000 c2c80000 -> c0f00000", + "c0f00000 461c4000 -> 461c2200", + "c0f00000 3e99999a -> 35000000", + "c0f00000 3f333333 -> 3e4cccc0", + "33d6bf95 00000000 -> 00000000", + "33d6bf95 3f800000 -> 33d6bf95", + "33d6bf95 bf800000 -> bf7ffffe", + "33d6bf95 3f000000 -> 33d6bf95", + "33d6bf95 bf000000 -> befffffd", + "33d6bf95 40000000 -> 33d6bf95", + "33d6bf95 c0000000 -> bfffffff", + "33d6bf95 40400000 -> 33d6bf95", + "33d6bf95 c0300000 -> c0300000", + "33d6bf95 3dcccccd -> 33d6bf95", + "33d6bf95 bdcccccd -> bdccccc0", + "33d6bf95 40f00000 -> 33d6bf95", + "33d6bf95 c0f00000 -> c0f00000", + "33d6bf95 33d6bf95 -> 00000000", + "33d6bf95 b3d6bf95 -> 00000000", + "33d6bf95 42c80000 -> 33d6bf95", + "33d6bf95 c2c80000 -> c2c80000", + "33d6bf95 461c4000 -> 33d6bf95", + "33d6bf95 3e99999a -> 33d6bf95", + "33d6bf95 3f333333 -> 33d6bf95", + "b3d6bf95 00000000 -> 00000000", + "b3d6bf95 3f800000 -> 3f7ffffe", + "b3d6bf95 bf800000 -> b3d6bf95", + "b3d6bf95 3f000000 -> 3efffffd", + "b3d6bf95 bf000000 -> b3d6bf95", + "b3d6bf95 40000000 -> 3fffffff", + "b3d6bf95 c0000000 -> b3d6bf95", + "b3d6bf95 40400000 -> 40400000", + "b3d6bf95 c0300000 -> b3d6bf95", + "b3d6bf95 3dcccccd -> 3dccccc0", + "b3d6bf95 bdcccccd -> b3d6bf95", + "b3d6bf95 40f00000 -> 40f00000", + "b3d6bf95 c0f00000 -> b3d6bf95", + "b3d6bf95 33d6bf95 -> 00000000", + "b3d6bf95 b3d6bf95 -> 00000000", + "b3d6bf95 42c80000 -> 42c80000", + "b3d6bf95 c2c80000 -> b3d6bf95", + "b3d6bf95 461c4000 -> 461c4000", + "b3d6bf95 3e99999a -> 3e999997", + "b3d6bf95 3f333333 -> 3f333331", + "42c80000 00000000 -> 00000000", + "42c80000 3f800000 -> 00000000", + "42c80000 bf800000 -> 00000000", + "42c80000 3f000000 -> 00000000", + "42c80000 bf000000 -> 00000000", + "42c80000 40000000 -> 00000000", + "42c80000 c0000000 -> 00000000", + "42c80000 40400000 -> 3f800000", + "42c80000 c0300000 -> bfe00000", + "42c80000 3dcccccd -> 00000000", + "42c80000 bdcccccd -> 00000000", + "42c80000 40f00000 -> 40200000", + "42c80000 c0f00000 -> c0a00000", + "42c80000 33d6bf95 -> 00000000", + "42c80000 b3d6bf95 -> 00000000", + "42c80000 42c80000 -> 00000000", + "42c80000 c2c80000 -> 00000000", + "42c80000 461c4000 -> 42c80000", + "42c80000 3e99999a -> 3dcccc00", + "42c80000 3f333333 -> 3f199980", + "c2c80000 00000000 -> 00000000", + "c2c80000 3f800000 -> 00000000", + "c2c80000 bf800000 -> 00000000", + "c2c80000 3f000000 -> 00000000", + "c2c80000 bf000000 -> 00000000", + "c2c80000 40000000 -> 00000000", + "c2c80000 c0000000 -> 00000000", + "c2c80000 40400000 -> 40000000", + "c2c80000 c0300000 -> bf800000", + "c2c80000 3dcccccd -> 00000000", + "c2c80000 bdcccccd -> 00000000", + "c2c80000 40f00000 -> 40a00000", + "c2c80000 c0f00000 -> c0200000", + "c2c80000 33d6bf95 -> 00000000", + "c2c80000 b3d6bf95 -> 00000000", + "c2c80000 42c80000 -> 00000000", + "c2c80000 c2c80000 -> 00000000", + "c2c80000 461c4000 -> 461ab000", + "c2c80000 3e99999a -> 3e4cce00", + "c2c80000 3f333333 -> 3dcccc00", + "461c4000 00000000 -> 00000000", + "461c4000 3f800000 -> 00000000", + "461c4000 bf800000 -> 00000000", + "461c4000 3f000000 -> 00000000", + "461c4000 bf000000 -> 00000000", + "461c4000 40000000 -> 00000000", + "461c4000 c0000000 -> 00000000", + "461c4000 40400000 -> 3f800000", + "461c4000 c0300000 -> bfe00000", + "461c4000 3dcccccd -> 00000000", + "461c4000 bdcccccd -> 00000000", + "461c4000 40f00000 -> 40200000", + "461c4000 c0f00000 -> c0a00000", + "461c4000 33d6bf95 -> 00000000", + "461c4000 b3d6bf95 -> 00000000", + "461c4000 42c80000 -> 00000000", + "461c4000 c2c80000 -> 00000000", + "461c4000 461c4000 -> 00000000", + "461c4000 3e99999a -> 3dcc0000", + "461c4000 3f333333 -> 3f000000", + "3e99999a 00000000 -> 00000000", + "3e99999a 3f800000 -> 3e99999a", + "3e99999a bf800000 -> bf333333", + "3e99999a 3f000000 -> 3e99999a", + "3e99999a bf000000 -> be4ccccc", + "3e99999a 40000000 -> 3e99999a", + "3e99999a c0000000 -> bfd9999a", + "3e99999a 40400000 -> 3e99999a", + "3e99999a c0300000 -> c01ccccd", + "3e99999a 3dcccccd -> 00000000", + "3e99999a bdcccccd -> 00000000", + "3e99999a 40f00000 -> 3e99999a", + "3e99999a c0f00000 -> c0e66666", + "3e99999a 33d6bf95 -> 00000000", + "3e99999a b3d6bf95 -> 00000000", + "3e99999a 42c80000 -> 3e99999a", + "3e99999a c2c80000 -> c2c76666", + "3e99999a 461c4000 -> 3e99999a", + "3e99999a 3e99999a -> 00000000", + "3e99999a 3f333333 -> 3e99999a", + "3f333333 00000000 -> 00000000", + "3f333333 3f800000 -> 3f333333", + "3f333333 bf800000 -> be99999a", + "3f333333 3f000000 -> 3e4ccccc", + "3f333333 bf000000 -> be99999a", + "3f333333 40000000 -> 3f333333", + "3f333333 c0000000 -> bfa66666", + "3f333333 40400000 -> 3f333333", + "3f333333 c0300000 -> c0033333", + "3f333333 3dcccccd -> 00000000", + "3f333333 bdcccccd -> 00000000", + "3f333333 40f00000 -> 3f333333", + "3f333333 c0f00000 -> c0d9999a", + "3f333333 33d6bf95 -> 00000000", + "3f333333 b3d6bf95 -> 00000000", + "3f333333 42c80000 -> 3f333333", + "3f333333 c2c80000 -> c2c6999a", + "3f333333 461c4000 -> 3f333333", + "3f333333 3e99999a -> 3dccccc8", + "3f333333 3f333333 -> 00000000", + "413d037f c08b723a -> bfa13ec0", + "c19e1e3f c1898576 -> c024c648", + "4098827e c0345ca5 -> bf5ed138", + "bfcaa09a c0a5d087 -> bfcaa09a", + "c16ef41f c09b3ee5 -> bec2b8e0", + "40df2b48 41927b83 -> 40df2b48", + "4126f60f 41440169 -> 4126f60f", + "c1046fe8 c0c173de -> c00ed7e4", + "c18da352 c1459323 -> c0ab6702", + "41932504 c047703b -> be9bca00", + "409a4a40 c1386f5a -> c0d69474", + "c19d4e27 c0938a37 -> bf9c3f00", + "40756618 405e125e -> 3eba9dd0", + "419531b4 3d883198 -> 3cedd800", + "41879529 3fbfcfd2 -> 3eed9240", + "40438211 c1098398 -> c0b14628", + "c0a909c3 be98b5b8 -> be5915e0", + "c19a422f 40b5f6a6 -> 405da3b8", + "405c93b5 414d58d3 -> 405c93b5", + "418646b9 416668c1 -> 401892c4", + "c0e6b722 c1685e9b -> c0e6b722", + "416d263a c1600217 -> c152ddf4", + "41138c79 c11f5a00 -> bf3cd870", + "414746c1 c101b271 -> c0707884", + "c1337a05 c06bbd41 -> be2b0500", + "c1125e40 4131d2ba -> 3ffba3d0", + "4138e7bd c16be183 -> c04be718", + "413bb730 c1394aab -> c136de26", + "c177639a c1457bd1 -> c0479f24", + "4115e414 40fa7dfc -> 3fc528b0", + "3f3bfc27 c197c54c -> c191e56b", + "414699aa c00b4592 -> bf24eb10", + "c142f1d0 408f2b78 -> 3f9e7b20", + "c11483fc c17568b6 -> c11483fc", + "c1354e1a c16997d2 -> c1354e1a", + "c1126671 416f73f9 -> 40ba1b10", + "3ea8d750 40f57b07 -> 3ea8d750", + "c15d6017 c18e4eeb -> c15d6017", + "c01abfad c193f5fa -> c01abfad", + "c18fbe80 4099497f -> 3f98aff0", + "418c2b93 408b1912 -> 3e094080", + "3fb6dcfc 40e66c1b -> 3fb6dcfc", + "c147a49f 412045b5 -> 40f1cd96", + "c171a735 c15e07ee -> bf9cfa38", + "c05aa6f7 413cd574 -> 41062bb6", + "bf079082 41273d61 -> 411ec459", + "419f4878 411e6c92 -> 3ddbe600", + "c0faf338 416bfc5a -> 40dd057c", + "c1799945 402ed4eb -> 3f4a61b0", + "419393bd 4178c745 -> 403980d4", + "416fdb86 40513f96 -> 3ff4df80", + "c1789325 c190fea7 -> c1789325", + "c1308fb0 c0dd20b6 -> c083feaa", + "40311a98 c141f163 -> c115aabd", + "416325e3 41598318 -> 3f1a2cb0", + "40b1f85c 414bd4ee -> 40b1f85c", + "40273a23 c16589d8 -> c13bbb4f", + "c0fb9082 c133ab6e -> c0fb9082", + "c1704ffc 4177e21f -> 3ef24460", + "41325e3f c1821115 -> c0a387d6", + "c1937916 c17938dc -> c036e540", + "bfa19c4a 416792a7 -> 41535f1e", + "c1557fd0 4189575c -> 4074bba0", + "409c1fc3 c1341b8e -> c0cc1759", + "40efe65a c060702c -> c04183d0", + "c1462efb 3ff79fb7 -> 3f93e628", + "c1822bf8 4005b673 -> 3ee29ec0", + "414cd98f 417f6e43 -> 414cd98f", + "419275dc c181bbc2 -> c1620350", + "c081f9ae 40da40a5 -> 40308dee", + "c19f6b38 c13881ec -> c1065484", + "413c168f 3f943b2f -> 3e332500", + "418589ab 41843005 -> 3e2cd300", + "c16a8d20 c15e395e -> bf453c20", + "40089b23 40d3b087 -> 40089b23", + "40e48a46 c0a69aee -> c051572c", + "3fd20b76 40146260 -> 3fd20b76", + "419e851a c0ead2d8 -> c00cc840", + "c19624d5 c09183ac -> bf142520", + "413d45fc 3ffc877e -> 3ffb8a68", + "412e9220 c1888037 -> c0c4dc9c", + "40cb069a c10bdbd2 -> c0196214", + "40ddcae4 417f5ca4 -> 40ddcae4", + "c01d2180 40d56f2c -> 4086de6c", + "c0026553 41017874 -> 40c1be3e", + "c15158a4 40039aa1 -> 3fa7afb0", + "3fa713d8 c102bbbe -> c0dbb286", + "c0e5b926 417eb0f9 -> 410bd466", + "c11f421a c10168c8 -> bfeeca90", + "c1114979 c0cb1e54 -> c02ee93c", + "c13e4b06 c096a79a -> c01e8db0", + "410802ec c1959557 -> c12327c2", + "419ee32c 419326f9 -> 3fbbc330", + "413b810c c175e4c8 -> c0698ef0", + "c093cf3b c0c2775a -> c093cf3b", + "41946b60 c0b42e1f -> c07e15f8", + "405c64f7 416a4b43 -> 405c64f7", + "c1084cc7 41319ff0 -> 40254ca4", + "414f10c2 c1944e86 -> c0b31894", + "418f5c1f c1378570 -> c0a0a544", + "4132060d c199d62b -> c101a649", + "c0cccf16 412d5adc -> 408de6a2", + "40e82bcb c1006f61 -> bf4597b8", + "c19dae9e c144810f -> c0edb85a", + "c013b3fa 3fb2070b -> 3ef29888", + "c1284094 40de3193 -> 4057c3fc", + "41819c8a c17c2464 -> c1750fb4", + "c15efee3 c094f799 -> c0940e94", + "c19feec6 412b3598 -> 3fb46d20", + "4130ac98 c13ea846 -> bf5fbae0", + "418c5bb3 410b5442 -> 3e03b880", + "40d2be0c c13489b6 -> c0965560", + "c112228c 40f31657 -> 40c1e796", + "401bf4d9 40e3bcc5 -> 401bf4d9", + "4192dced 40b77403 -> 3f945eb0", + "c0bafd99 41920aa6 -> 41469680", + "c13a1e44 c0066d65 -> bf90ac30", + "c18667c9 c0ed011e -> bffe73a0", + "419cc70a 41358dc4 -> 41040050", + "c1970107 4181446e -> 41570faa", + "c14208bd c14d94cc -> c14208bd", + "3f67d8c8 c07fb093 -> c045ba61", + "c11a766f 3fd6f987 -> 3ed896c0", + "c19b6298 4062cfcd -> 3feb9420", + "c14e5dc9 4176e79a -> 40222744", + "c16dd36e 40601b09 -> 40293978", + "40fef599 c14ff761 -> c0a0f929", + "4161f47e 40a65196 -> 406e8ba0", + "c08c2b75 3fc3a523 -> 3e520ca0", + "c0dae537 c14042ed -> c0dae537", + "40ef7bf8 408592c2 -> 4053d26c", + "40358c7c 40ef3a25 -> 40358c7c", + "c09bd323 418bd335 -> 4149bcd8", + "c09a2967 418a1467 -> 4147141a", + "406a856e c0368854 -> c0028b3a", + "40580f92 c0bbd895 -> c01fa198", + "414d8eb6 c0dcb95c -> bf72aa60", + "418aa53a 418233a3 -> 3f871970", + "41806c96 41436e2e -> 4075abf8", + "c16ec696 41571403 -> 413f6170", + "c0beab33 c0ebe2a3 -> c0beab33", + "c163c23a c01566a8 -> be6a0f80", + "401d05a3 4023385c -> 401d05a3", + "bff2b4b4 3fb512c8 -> 3f6ee1b8", + "c121656e 3f6935ce -> 3f582ec0", + "c18d4e1c 41435c98 -> 40d839f0", + "40264c0a c108137e -> c0bd00f7", + "c182cbc3 411dac31 -> 40570370", + "4051397a 418d5efe -> 4051397a", + "41903d48 419ce563 -> 41903d48", + "c183384d c0f6b1b4 -> bf7bee60", + "c170fa11 3fc11cc1 -> 3cd3c000", + "414c0264 c07c641d -> c04186e4", + "40b19f21 c0f3c674 -> c0044ea6", + "c0af7fe9 c1186ee5 -> c0af7fe9", + "412af1f8 4197d045 -> 412af1f8", + "c143a66e 3fd0cfea -> 3f5297c0", + "c131352e 419da248 -> 410a0f62", + "c058913d c025f222 -> bf4a7c6c", + "c1805066 c1606fab -> c000c484", + "c1787502 415bc3be -> 413f127a", + "c12b4582 c1560469 -> c12b4582", + "c1067419 c18335ab -> c1067419", + "c11deb3c 3f78a94c -> 3f509280", + "4175d6f0 c102e868 -> bf7f9e00", + "c1189201 4147fb57 -> 403da558", + "c0a9b5b7 c0d07971 -> c0a9b5b7", + "402a8246 c176c22b -> c14c219a", + "c14dfbec c188e3f2 -> c14dfbec", + "c076df31 c0eb766d -> c076df31", + "410e7c5c c0f8dee9 -> c0d4c51a", + "406f0490 4195974d -> 406f0490", + "40c27fbc c0a91491 -> c08fa966", + "403d0ea5 417f983e -> 403d0ea5", + "c0e32d60 c06f9a42 -> c056c07e", + "416f2861 41941ae4 -> 416f2861", + "40fec889 c071a245 -> c05755be", + "418e583e c190076b -> be579680", + "41202f79 40b168f6 -> 408ef5fc", + "c10b1ba2 c133819c -> c10b1ba2", + "c15ce671 4087829d -> 40487b24", + "4169f8ac 4115a24e -> 40a8acbc", + "417dff52 c05a4d62 -> bf970b40", + "419575a6 40a0d038 -> 4066cbe0", + "c1645d94 416669c8 -> 3e030d00", + "c162e4a8 bf430b94 -> beeef440", + "c08b76f5 c0ed699f -> c08b76f5", + "c15fbcf6 c115edb1 -> c0939e8a", + "4117689d c086a77e -> c04a4a80", + "c140d5fa 413f34d2 -> 413d93aa", + "401c4c3e c15658c7 -> c12f45b8", + "419947c3 c1850faa -> c161af22", + "4138dd9b 413f316d -> 4138dd9b", + "411146ab 40c45093 -> 403c7986", + "40614e6c 40bfdfd5 -> 40614e6c", + "4163b194 3e815d44 -> 3da72e80", + "c181123b c0efaf3a -> bf93a9e0", + "c0665b84 c109b487 -> c0665b84", + "c176e14f c1710cc3 -> beba9180", + "c0849239 419c1da6 -> 4175f230", + "418ab392 c11d2ed6 -> c013da20", + "c16e1657 c1298967 -> c08919e0", + "c139d3ca c18c3815 -> c139d3ca", + "c0a7c2e8 c16cccf8 -> c0a7c2e8", + "418dfa36 419b426a -> 418dfa36", + "40f7132f c0b8a3b2 -> c074686a", + "400ea2c3 41873000 -> 400ea2c3", + "c1406d6e c04f9c50 -> c012e0c8", + "c171453a 40e39f92 -> 40c85444", + "3fe24eab 40b5f990 -> 3fe24eab", + "4105c165 c0394f33 -> bea74020", + "414e9845 40be110c -> 3f8439c8", + "41981e23 be429a5b -> be37d480", + "c10d980b 40e9cdfc -> 40b86be2", + "bfb52855 4136fd71 -> 41205866", + "be99cf78 4123bcc1 -> 411eee45", + "c0aff405 40b504b6 -> 3e221620", + "c107410f c01c90e8 -> bf8ea308", + "c186d9e2 c10bf519 -> c101beab", + "41537467 c0ca1e94 -> c0b772ee", + "c01165ec c0f52748 -> c01165ec", + "c194d671 414515df -> 40c0fdb8", + "40b38948 bfc90104 -> bf2bbde0", + "c11cddcc bec6a3fd -> bdd6d700", + "4162d1a9 c08ba5ce -> c051e7cc", + "c13133cd 40d95f09 -> 4020acf0", + "c07d9ef9 c165e637 -> c07d9ef9", + "414e4b4d 41575d3c -> 414e4b4d", + "3ffc3dab c1674301 -> c147bb4c", + "3f9c6ef8 c0db02e0 -> c0b3e722", + "41890d62 c1172603 -> bfe18a10", + "41333d42 41444f70 -> 41333d42", + "c185fe30 419c716a -> 403399d0", + "c1287d68 c096457f -> bf91bf48", + "40c0f307 416a7ebc -> 40c0f307", + "409e7afb 411d0c39 -> 409e7afb", + "c166b9d6 c091d644 -> bf3f8700", + "4192e82d c0974f99 -> bf0ced80", + "410c796c c0d3ee41 -> c08ee9aa", + "40cd8965 c12a26e0 -> c086c45b", + "bf82750d 411eed20 -> 410e9e7e", + "c1374b5b 415af8a8 -> 400eb534", + "c0b77f4c 410c38b8 -> 4041e448", + "41539cd7 404644c9 -> 3f5580e0", + "418c7c1a 407e84bd -> 3fd39bb8", + "c0936402 408a33b9 -> 40810370", + "c133671a c195ca23 -> c133671a", + "4155ef28 c1990e21 -> c0b85a34", + "40759597 c1497314 -> c10c0dae", + "c11b667c c086a8b0 -> bfa5ee60", + "c19825fe c10f0709 -> bf91ef50", + "c1487a2a c08af822 -> c0760820", + "c014ccbd c19344cb -> c014ccbd", + "4125ddb1 41099a4c -> 3fe21b28", + "c0332ecc c17cefd9 -> c0332ecc", + "3e85c2fe c17d053a -> c178d722", + "418be443 40640082 -> 404f2010", + "4199318c be8eccb2 -> bdc32400", + "40dc4473 4150e6c6 -> 40dc4473", + "4133cf80 414acb14 -> 4133cf80", + "c11026d8 40d674ea -> 408c9c24", + "c0c1cf98 c0fc13eb -> c0c1cf98", + "c0971b18 c19ad34b -> c0971b18", + "415b265c c14ed987 -> c1428cb2", + "419c1b96 418b5428 -> 40063b70", + "3e8a2f19 c0fd30d0 -> c0f48dde", + "c0fcd744 bf0b9b4f -> be8877a0", + "40e8d0cd c18186c5 -> c10ea524", + "c18c7a47 415ac047 -> 411c8c00", + "c16c9518 40877465 -> 40094ec8", + "4102e473 3f71ff40 -> 3f1e4d30", + "403260b0 41966836 -> 403260b0", + "c08f7698 c1456670 -> c08f7698", + "c0d36cf2 41737d9f -> 4109c726", + "c167db7b 405cb356 -> 403012c4", + "413121d7 417b8964 -> 413121d7", + "40b6a314 c06da60b -> bfdc0bdc", + "c1802fe3 c18b76b6 -> c1802fe3", + "40ca8b70 40c96655 -> 3d128d80", + "40216636 c182eb7f -> c15d7d70", + "c1999980 3fa2cb15 -> 3f931950", + "c0cb4aea 41136e81 -> 40372430", + "c17f8d62 c08350f3 -> c06a4fd8", + "3ec9fcf5 4099b374 -> 3ec9fcf5", + "41962df4 c17acf32 -> c149427c", + "4052cbde c0c0328a -> c02d9936", + "41664e7a bfeac39f -> be8ea4a0", + "40082f5f c05dac4a -> bfaaf9d6", + "c14f4c57 4035f827 -> 3fa14ed0", + "c185d4f6 414916b3 -> 4106837a", + "415395e0 c0c7ca31 -> c0b032d4", + "41301e60 4082c87b -> 40355794", + "c15a08ba c1817b5e -> c15a08ba", + "c133091f c179b090 -> c133091f", + "419dffc2 c159cc5e -> c0ef3270", + "411bbf1d 417c6432 -> 411bbf1d", + "c181c084 4050ecfe -> 3dd39b00", + "4138673d 413522a3 -> 3e512680", + "418c6a9d 3f0acd11 -> 3e4ec600", + "c10b05b3 c12bb7aa -> c10b05b3", + "419f0d5e 4102a393 -> 40634e58", + "c184bbe6 40e38e51 -> 4097bb5c", + "40c1037c c1235c71 -> c085b566", + "3f8d2620 40a8a736 -> 3f8d2620", + "40ac8fc6 c17fde01 -> c129961e", + "c13cadcc bf65e092 -> bdf3aa80", + "4114808b c13cbc79 -> c020efb8", + "40df0dc3 c0964972 -> c01b0a42", + "419d0889 41185680 -> 3f164120", + "404985f7 c18127b2 -> c14fede6", + "c197473a c17d87c7 -> c0441ab4", + "c0aa45b6 412a0e89 -> 40a9d75c", + "40a26e2a 4196b526 -> 40a26e2a", + "3e3928a4 414ffd29 -> 3e3928a4", + "c1668d55 c0334333 -> becf2aa0", + "c15c057d 40abf97c -> 4017c2f4", + "40e74662 c11e1ef8 -> c029ef1c", + "c021e648 41721020 -> 4149968e", + "402c5f14 419a6c2b -> 402c5f14", + "41654828 419cb4e3 -> 41654828", + "4146715c 4170c834 -> 4146715c", + "c12282f7 3fb86646 -> 3faf1a78", + "c119b2ec c193f77a -> c119b2ec", + "4197ec0a 418f9d57 -> 3f84eb30", + "c18b1afd 410ff08d -> 3f1ab200", + "414386b5 409cd48b -> 401ac8a8", + "4010db98 c11bf777 -> c0ef8122", + "c16414ce 417982c1 -> 3fab6f98", + "40924aa3 c01295b2 -> bc161e00", + "411cea88 bf259229 -> bf0a7a10", + "c0477c98 3e12ee20 -> 3d22b500", + "408f9daa c1145a15 -> c0991680", + "409e1678 c089668a -> c0696d38", + "c197dba3 c097e344 -> c097c4c0", + "40e4d558 c0e2db8b -> c0e0e1be", + "40f89fd2 c1545cc8 -> c0b019be", + "c171068f 4138f702 -> 4100e775", + "414d228d c16313aa -> bfaf88e8", + "c16d04f0 c16b05d7 -> bdff8c80", + "3fc1d02d 41990048 -> 3fc1d02d", + "be9ecee5 c12ad8c7 -> be9ecee5", + "c1427afc 416c78a7 -> 4027f6ac", + "bfa11e8d 4111e9c1 -> 40fb8bdf", + "c0bb1a4b 412d020a -> 409ee9c9", + "c183e272 3c4731e6 -> 3a0c0000", + "c03bbcde 4054c661 -> 3ec84c18", + "c106b291 c15f4ac4 -> c106b291", + "404522b7 40d61029 -> 404522b7", + "415ad980 c0c2f262 -> c0932428", + "c1288f11 413cab2c -> 3fa0e0d8", + "c0921b17 c13a33d3 -> c0921b17", + "bff32d87 c0c97ff9 -> bff32d87", + "be9675db c1399286 -> be9675db", + "40ffb4f8 c027f689 -> c0207034", + "c158a865 41873364 -> 4056f98c", + "4158d327 c18d7744 -> c08436c2", + "c180e396 c123d901 -> c0bbdc56", + "c15ec395 c13d197b -> c006a868", + "c151a868 c1847098 -> c151a868", + "c18f0147 c181a7f1 -> bfd59560", + "c1805ce3 c149b75d -> c05c09a4", + "41579e36 401002c2 -> 400e6b10", + "c112e152 417fd9ff -> 40d9f15a", + "bda326d3 413daaac -> 413c645e", + "c18c570f c10fad22 -> c10900fc", + "c19e0b74 411f3a86 -> 3e178900", + "c184d6ea 4141443f -> 40f1b554", + "4185d84b 412a7586 -> 40c27620", + "c17cee96 c0af3845 -> c09b6ca2", + "412c0351 40727b24 -> 404b16fc", + "4105440f 4100d3ad -> 3e8e0c40", + "408fc5fe bffb1fd3 -> bfb24780", + "c176ed48 c18bffa6 -> c176ed48", + "c1475403 412afd5a -> 410ea6b1", + "c0beaccf c11ff442 -> c0beaccf", + "40bea15e 4015a644 -> 3fa3ec68", + "418ebf13 400267fa -> 3fc57190", + "c15ce829 417301ca -> 3fb0cd08", + "c1419948 3fe21261 -> 3e86d9a0", + "c19f2e94 3ecf1990 -> 3ea75900", + "c0eda0a6 414b2df4 -> 40a8bb42", + "c132ece4 bf8f64e3 -> bf8cdb28", + "c17bb91a c198c6d6 -> c17bb91a", + "c0bf10a4 403b857a -> 40346f28", + "41700393 c0e5c62f -> c0d14b66", + "3fe96c24 c1236df3 -> c106406e", + "c00fbaa6 411453aa -> 40e0ca01", + "414f42e4 c144c774 -> c13a4c04", + "c16e6e41 c147fd81 -> c019c300", + "c10fd8f7 4149dcd8 -> 40680f84", + "3e5a9226 411bd7a4 -> 3e5a9226", + "4123732a 3f729296 -> 3f3d78c0", + "c182c416 c19f3909 -> c182c416", + "3faecf74 c1681970 -> c1523f82", + "c16ba197 c1551e66 -> bfb41988", + "c17aaee7 410f874f -> 40117edc", + "c157ac2b c110ac52 -> c08dffb2", + "40bb9afd 414d23e4 -> 40bb9afd", + "411deb78 40d25f96 -> 4052eeb4", + "c081b521 c1346ba9 -> c081b521", + "c0ce6a54 3fc163be -> 3f8d4968", + "415e5f0c c19144a5 -> c088547c", + "c0c804e0 4125fdf3 -> 4083f706", + "c16ee2bf c15cf793 -> bf8f5960", + "c185c162 c16c5e83 -> bff92208", + "c0d36f2f 40df52f6 -> 3ebe3c70", + "406dad96 c004dbfc -> bee05310", + "c185bf36 bf66890f -> bf0243c0", + "4087168d c0c32499 -> bff03830", + "4160d87d c12981f1 -> c0e456ca", + "c103b7d0 4168a254 -> 40c9d508", + "c00dea7d c0b3f157 -> c00dea7d", + "c0a05957 c14d20de -> c0a05957", + "419cbfaa c199afc2 -> c1969fda", + "c1894cf0 c090feb3 -> c0646f50", + "c18e4ac8 4117efc3 -> 3f9a4fb0", + "c1083982 bf9630c1 -> be99db20", + "40d83fb4 c1996262 -> c146a4ea", + "4126b8bd c0c2afe5 -> bfdfb940", + "3fff3358 3f4d95c3 -> 3ec67654", + "417f80ec c166217b -> c14cc20a", + "c0c65818 c19b8c62 -> c0c65818", + "41295a13 416cc044 -> 41295a13", + "c0b3e778 c0f1001f -> c0b3e778", + "4093c6e8 415bdec6 -> 4093c6e8", + "c1556470 4182f7af -> 40422bb8", + "4101a4d9 c0ffd386 -> c0fc5d5a", + "418dd970 3f7c2def -> 3f7c2120", + "415b56f9 4114b2cc -> 408d485a", + "418cd4af 40a41d12 -> 400df70c", + "3f407a71 c1037c34 -> c0eee91a", + "411358b5 bf1c88d7 -> bf130220", + "408ccfeb 40da55f1 -> 408ccfeb", + "40888234 c1708831 -> c12c4717", + "41128a95 c01237ec -> c010ed48", + "3ff490bc c18b274c -> c177bc80", + "c160df1f 40d9c521 -> 40cb9126", + "c1910f82 418f3454 -> 418d5926", + "c18ba36e c198995a -> c18ba36e", + "c1908ae9 4189bd18 -> 4182ef47", + "40286b17 418e2517 -> 40286b17", + "4133660a 41362940 -> 4133660a", + "c1276e31 c0e80d0c -> c04d9eac", + "418b3071 40e384cd -> 404b7054", + "c141b9f5 c0965b4d -> c02d7aa0", + "c182a29c 41121093 -> 3ff6df70", + "c137c35a 417481de -> 4072fa10", + "bfc2de49 41743527 -> 415bd95e", + "40881a1a 3f00e3d2 -> 3e66c900", + "c17b980f c126ddf6 -> c0a97432", + "408f7c0b c13ae6a1 -> c0e65137", + "c19446af c195caaa -> c19446af", + "3fb79424 411716de -> 3fb79424", + "c18c8163 4024e3a1 -> 3ef17280", + "c08c72a2 bfa57cf8 -> bf02a740", + "40ecfd71 40b3b1fc -> 3fe52dd4", + "c1881926 41342953 -> 40b040b4", + "3f991d19 c19669b2 -> c18cd7e0", + "c14b1d10 4140f6bf -> 4136d06e", + "4182da62 c16446f8 -> c142d92c", + "c15a4e85 417d0b23 -> 400af278", + "418d978f c097298d -> bf991fe0", + "c1976060 c061e5ec -> bfa30ac0", + "c0379068 40f8cf7d -> 409d0749", + "404f2a30 c19834f4 -> c17c9f5c", + "c17227e2 401b8688 -> 3ff01c60", + "41435db1 40ff030f -> 4087b853", + "c196c441 c198db74 -> c196c441", + "c1026ce5 4030dee1 -> 3e0e9100", + "c19a53d8 c188cae9 -> c00c4778", + "413e92c4 40daa50f -> 40a28079", + "404095be c065c95e -> bf14ce80", + "c173f835 410aa63f -> 40055124", + "c14f742d c08e72f6 -> c082026e", + "bf137a62 c1851cba -> bf137a62", + "c012dd72 4199cd32 -> 41877184", + "4133eb9d c0d1bddf -> bfee9210", + "4082b792 c14edae2 -> c10d7f19", + "c19b6a54 41102467 -> 40f33118", + "41114399 40c68f13 -> 4037f03e", + "416c6520 40a5872f -> 408dbbe2", + "4195fdda c153b89d -> c0f6eb0c", + "41246c10 c0cb2db3 -> c01b068c", + "412300cf c105c9d7 -> c0d125be", + "c188c918 c185674c -> bed87300", + "4181bfca 3ff9b90c -> 3f1c6880", + "3fe258f4 40b09298 -> 3fe258f4", + "400d4077 4192e48e -> 400d4077", + "c1908de9 c0613cac -> bef1ff40", + "4176c08e 418d8afa -> 4176c08e", + "c1479647 41244ddc -> 41010571", + "40ea72d5 3f72f1a7 -> 3f2efb18", + "c12118d2 4198a14b -> 411029c4", + "4177058e 40a8f471 -> 409c223a", + "417012f8 3fcc8fb5 -> 3f1f14c0", + "41197178 410e8548 -> 3f2ec300", + "c0826934 4111bf99 -> 40a115fe", + "c0e77777 41181156 -> 4011566a", + "40a3ca73 bff50741 -> bf1fd7f0", + "c15c6b7b 41105572 -> 40887ed2", + "413883ab c124184a -> c10face9", + "40cb2472 415f39de -> 40cb2472", + "4189f5d1 c17b4097 -> c162958c", + "40f52f6b bf237f80 -> bafd5000", + "40f0ec6a c16ad592 -> c0e4beba", + "c1171322 40b60e39 -> 3ff7d8b8", + "c05a03f5 416ad059 -> 41344f5c", + "411a8717 4132b0d1 -> 411a8717", + "40f255e9 4187c4ee -> 40f255e9", + "40c2965c 40b55954 -> 3ed3d080", + "c199f2ca 4188d1d2 -> 416f61b4", + "4142591a bfee532e -> bf62fae0", + "401d2964 c185dd6b -> c164707d", + "403c1cb9 c14adb32 -> c11bd404", + "c15e235e 40686113 -> 3f23db50", + "c10f9cd7 c1834862 -> c10f9cd7", + "40d7e8f7 4121b1e4 -> 40d7e8f7", + "c113026d c10e0058 -> bea042a0", + "c134f7cf bff480e4 -> bfe13a08", + "4074ff99 c1917f69 -> c165beec", + "3fc788de 419e63ce -> 3fc788de", + "4195c666 c11ca107 -> bf5b5420", + "40d6e6c8 bf66db1d -> beff4550", + "c1870deb c0b0d809 -> be9af900", + "4197bcda 411817e8 -> 411761cc", + "418d993a c129f434 -> c062d7d0", + "c171e893 403718c1 -> 4002f23c", + "40259e20 c1145bd9 -> c0d5e8a2", + "be30489a c191b5ee -> be30489a", + "c1569973 41983537 -> 40b3a1f6", + "410bdf0d c081ccd9 -> c05b50e4", + "c0e12b40 4185bd6c -> 411ae538", + "414ed5f4 c04b8ed7 -> c03e7264", + "c0b21031 c14c4849 -> c0b21031", + "3fe1eff6 c0f9058f -> c0c08992", + "403eda4e 408308ec -> 403eda4e", + "4127593e c199cf3a -> c10c4536", + "41233930 417bbccd -> 41233930", + "c18b9a71 c13047e2 -> c0cdda00", + "416703b8 c158d048 -> c14a9cd8", + "4195d3d9 4058d4d9 -> 3fe4ed10", + "4186ed44 c16e95bd -> c14f50f2", + "4138f7b0 c17184e6 -> c06234d8", + "c1395e5c 4179f8b3 -> 408134ae", + "c18ab09a 41176a23 -> 3fcb9890", + "c156f2d6 c1184633 -> c07ab28c", + "c1712d2a c0dd0d4e -> bfa0fee0", + "418226d8 be9a6483 -> bc6fb800", + "419c666d c02740e1 -> bfada740", + "c12d391b 40af5b64 -> 3e089240", + "4153718d 4123351d -> 4040f1c0", + "c0d7947c c086fae0 -> c0213338", + "c19bba57 40d45a1b -> 3ee24f40", + "c16c0083 40a0987a -> 3e9c8680", + "bf683001 c0752570 -> bf683001", + "c083ff1a c173dcbc -> c083ff1a", + "c0df4c50 41382654 -> 40910058", + "415ea07f 408af1d0 -> 3f635c70", + "4119ce04 c13d5c65 -> c00e3984", + "c1974700 bfa7af65 -> bf11b100", + "c12c8b96 40f821e7 -> 40972ca2", + "418be221 41949612 -> 418be221", + "c1857e93 41788602 -> 41660ede", + "c199427c bdfdc790 -> bd986f00", + "c139f8d7 417a309a -> 40806f86", + "c07d0d81 c0d3f5b5 -> c07d0d81", + "40a892e1 41888141 -> 40a892e1", + "c1053ed4 409d81f0 -> 3fc218e0", + "419165ea 413d4e61 -> 40cafae6", + "4148c97d 4187b341 -> 4148c97d", + "40b16e90 c07babc0 -> c0147a60", + "c19c7369 40df0d7a -> 3fad6b30", + "c0cd2aef c164f0c3 -> c0cd2aef", + "c153e89a 41864583 -> 406289b0", + "40879e81 c07dfa63 -> c06cb7c4", + "410d0273 c170e632 -> c0c7c77e", + "c0fc3998 bf08bbc8 -> becf0fa0", + "c16c3421 4148f99b -> 4125bf15", + "c14a4bd5 c1653412 -> c14a4bd5", + "c1923ebc 3c049717 -> 3a360000", + "c15675c5 c19b0eed -> c15675c5", + "c15b2f88 c0d431d1 -> bedfb6e0", + "c15f269f 418f0abc -> 407bbb64", + "c08849a4 c13808fe -> c08849a4", + "41576919 4130a715 -> 401b0810", + "3e70e421 411e124a -> 3e70e421", + "c1910e5e c01d8dbe -> bf664b00", + "40ccaa9c c106b01c -> c0016b38", + "416788c8 bf7edc6a -> beecbb60", + "c1307279 c022165b -> bf65c1e0", + "c1128518 c19b0259 -> c1128518", + "be916eff 410ba9ed -> 41071e75", + "40b44054 41205218 -> 40b44054", + "c191ab36 4190098c -> 418e67e2", + "c183254c c18a810f -> c183254c", + "c0dbddd5 3f8a612b -> 3f3261b0", + "bfcac52f 413f062b -> 4125ad85", + "41106230 c107ad9a -> c0fdf208", + "c17e1182 400ca17b -> 3fd98ba0", + "40850c92 41620d12 -> 40850c92", + "4185e918 c1761d87 -> c16068de", + "41317fbd bf445351 -> bed1cbe0", + "4197c0b2 c13317b1 -> c05ab7f8", + "c13a6568 4195febe -> 40e33028", + "4192e4be 416fda12 -> 4057bda8", + "c114c712 3ed94d60 -> 3d1e2000", + "c1390fda 415cbd24 -> 400eb528", + "3fc710d0 c05c4f8d -> bff18e4a", + "bf18a182 404aea15 -> 4024c1b4", + "419148f2 4169175c -> 4065ea20", + "c19e178e 3fded647 -> 3f909270", + "c11a2986 c0d0baf5 -> c047302e", + "419ada8f 40ffae8e -> 40581a40", + "40cce620 bf8506c4 -> bf5f2db8", + "413cd126 c1937faa -> c0d45c5c", + "c1974d72 3e5e7823 -> 3e529300", + "c0a6166a 419a0591 -> 4160ffed", + "c1421a0b 3f4f1ce0 -> 3b883800", + "c18f8f9f 418c35c4 -> 4188dbe9", + "40f9a51c bf834682 -> bece7e80", + "c18cc34f 3fa833ef -> 3f4d4440", + "c17640c5 411d24e7 -> 40881212", + "3f31effc 419d93f6 -> 3f31effc", + "4143f3da c19a7fd8 -> c0e217ac" + ] + }, + { + "function": "cycles_wrap", + "node": "ShaderNodeMath WRAP", + "cases": [ + "00000000 00000000 00000000 -> 00000000", + "00000000 00000000 3f800000 -> 3f800000", + "00000000 00000000 bf800000 -> bf800000", + "00000000 00000000 3f000000 -> 3f000000", + "00000000 00000000 bf000000 -> bf000000", + "00000000 00000000 40000000 -> 40000000", + "00000000 00000000 c0000000 -> c0000000", + "00000000 00000000 40400000 -> 40400000", + "00000000 00000000 c0300000 -> c0300000", + "00000000 00000000 3dcccccd -> 3dcccccd", + "00000000 3f800000 00000000 -> 00000000", + "00000000 3f800000 3f800000 -> 3f800000", + "00000000 3f800000 bf800000 -> 00000000", + "00000000 3f800000 3f000000 -> 3f000000", + "00000000 3f800000 bf000000 -> 00000000", + "00000000 3f800000 40000000 -> 40000000", + "00000000 3f800000 c0000000 -> 00000000", + "00000000 3f800000 40400000 -> 40000000", + "00000000 3f800000 c0300000 -> 00000000", + "00000000 3f800000 3dcccccd -> 3f666666", + "00000000 bf800000 00000000 -> 00000000", + "00000000 bf800000 3f800000 -> 00000000", + "00000000 bf800000 bf800000 -> bf800000", + "00000000 bf800000 3f000000 -> 00000000", + "00000000 bf800000 bf000000 -> bf000000", + "00000000 bf800000 40000000 -> 00000000", + "00000000 bf800000 c0000000 -> c0000000", + "00000000 bf800000 40400000 -> 00000000", + "00000000 bf800000 c0300000 -> bfe00000", + "00000000 bf800000 3dcccccd -> 00000000", + "00000000 3f000000 00000000 -> 00000000", + "00000000 3f000000 3f800000 -> 3f800000", + "00000000 3f000000 bf800000 -> 00000000", + "00000000 3f000000 3f000000 -> 3f000000", + "00000000 3f000000 bf000000 -> 00000000", + "00000000 3f000000 40000000 -> 3fc00000", + "00000000 3f000000 c0000000 -> 00000000", + "00000000 3f000000 40400000 -> 40200000", + "00000000 3f000000 c0300000 -> 00000000", + "00000000 3f000000 3dcccccd -> 3ecccccd", + "00000000 bf000000 00000000 -> 00000000", + "00000000 bf000000 3f800000 -> 00000000", + "00000000 bf000000 bf800000 -> bf800000", + "00000000 bf000000 3f000000 -> 00000000", + "00000000 bf000000 bf000000 -> bf000000", + "00000000 bf000000 40000000 -> 00000000", + "00000000 bf000000 c0000000 -> bfc00000", + "00000000 bf000000 40400000 -> 00000000", + "00000000 bf000000 c0300000 -> c0100000", + "00000000 bf000000 3dcccccd -> 00000000", + "00000000 40000000 00000000 -> 00000000", + "00000000 40000000 3f800000 -> 3f800000", + "00000000 40000000 bf800000 -> 00000000", + "00000000 40000000 3f000000 -> 3fc00000", + "00000000 40000000 bf000000 -> 00000000", + "00000000 40000000 40000000 -> 40000000", + "00000000 40000000 c0000000 -> 00000000", + "00000000 40000000 40400000 -> 40400000", + "00000000 40000000 c0300000 -> 00000000", + "00000000 40000000 3dcccccd -> 3ff33333", + "00000000 c0000000 00000000 -> 00000000", + "00000000 c0000000 3f800000 -> 00000000", + "00000000 c0000000 bf800000 -> bf800000", + "00000000 c0000000 3f000000 -> 00000000", + "00000000 c0000000 bf000000 -> bfc00000", + "00000000 c0000000 40000000 -> 00000000", + "00000000 c0000000 c0000000 -> c0000000", + "00000000 c0000000 40400000 -> 00000000", + "00000000 c0000000 c0300000 -> c0100000", + "00000000 c0000000 3dcccccd -> 00000000", + "00000000 40400000 00000000 -> 00000000", + "00000000 40400000 3f800000 -> 40000000", + "00000000 40400000 bf800000 -> 00000000", + "00000000 40400000 3f000000 -> 40200000", + "00000000 40400000 bf000000 -> 00000000", + "00000000 40400000 40000000 -> 40000000", + "00000000 40400000 c0000000 -> 00000000", + "00000000 40400000 40400000 -> 40400000", + "00000000 40400000 c0300000 -> 00000000", + "00000000 40400000 3dcccccd -> 4039999a", + "00000000 c0300000 00000000 -> 00000000", + "00000000 c0300000 3f800000 -> 00000000", + "00000000 c0300000 bf800000 -> bfe00000", + "00000000 c0300000 3f000000 -> 00000000", + "00000000 c0300000 bf000000 -> c0100000", + "00000000 c0300000 40000000 -> 00000000", + "00000000 c0300000 c0000000 -> c0100000", + "00000000 c0300000 40400000 -> 00000000", + "00000000 c0300000 c0300000 -> c0300000", + "00000000 c0300000 3dcccccd -> 00000000", + "00000000 3dcccccd 00000000 -> 00000000", + "00000000 3dcccccd 3f800000 -> 3f666666", + "00000000 3dcccccd bf800000 -> 00000000", + "00000000 3dcccccd 3f000000 -> 3ecccccd", + "00000000 3dcccccd bf000000 -> 00000000", + "00000000 3dcccccd 40000000 -> 3ff33333", + "00000000 3dcccccd c0000000 -> 00000000", + "00000000 3dcccccd 40400000 -> 4039999a", + "00000000 3dcccccd c0300000 -> 00000000", + "00000000 3dcccccd 3dcccccd -> 3dcccccd", + "3f800000 00000000 00000000 -> 00000000", + "3f800000 00000000 3f800000 -> 3f800000", + "3f800000 00000000 bf800000 -> bf800000", + "3f800000 00000000 3f000000 -> 3f000000", + "3f800000 00000000 bf000000 -> bf000000", + "3f800000 00000000 40000000 -> 3f800000", + "3f800000 00000000 c0000000 -> bf800000", + "3f800000 00000000 40400000 -> 3f800000", + "3f800000 00000000 c0300000 -> bfe00000", + "3f800000 00000000 3dcccccd -> 3dccccc8", + "3f800000 3f800000 00000000 -> 00000000", + "3f800000 3f800000 3f800000 -> 3f800000", + "3f800000 3f800000 bf800000 -> bf800000", + "3f800000 3f800000 3f000000 -> 3f000000", + "3f800000 3f800000 bf000000 -> bf000000", + "3f800000 3f800000 40000000 -> 40000000", + "3f800000 3f800000 c0000000 -> c0000000", + "3f800000 3f800000 40400000 -> 40400000", + "3f800000 3f800000 c0300000 -> c0300000", + "3f800000 3f800000 3dcccccd -> 3dccccd0", + "3f800000 bf800000 00000000 -> 00000000", + "3f800000 bf800000 3f800000 -> 3f800000", + "3f800000 bf800000 bf800000 -> bf800000", + "3f800000 bf800000 3f000000 -> bf000000", + "3f800000 bf800000 bf000000 -> bf000000", + "3f800000 bf800000 40000000 -> 3f800000", + "3f800000 bf800000 c0000000 -> c0000000", + "3f800000 bf800000 40400000 -> 3f800000", + "3f800000 bf800000 c0300000 -> c0200000", + "3f800000 bf800000 3dcccccd -> bdccccd0", + "3f800000 3f000000 00000000 -> 00000000", + "3f800000 3f000000 3f800000 -> 3f800000", + "3f800000 3f000000 bf800000 -> bf000000", + "3f800000 3f000000 3f000000 -> 3f000000", + "3f800000 3f000000 bf000000 -> 00000000", + "3f800000 3f000000 40000000 -> 3f800000", + "3f800000 3f000000 c0000000 -> bfc00000", + "3f800000 3f000000 40400000 -> 3f800000", + "3f800000 3f000000 c0300000 -> c0100000", + "3f800000 3f000000 3dcccccd -> 3e4ccccc", + "3f800000 bf000000 00000000 -> 00000000", + "3f800000 bf000000 3f800000 -> 3f800000", + "3f800000 bf000000 bf800000 -> bf800000", + "3f800000 bf000000 3f000000 -> 00000000", + "3f800000 bf000000 bf000000 -> bf000000", + "3f800000 bf000000 40000000 -> 3f800000", + "3f800000 bf000000 c0000000 -> c0000000", + "3f800000 bf000000 40400000 -> 3f800000", + "3f800000 bf000000 c0300000 -> bfa00000", + "3f800000 bf000000 3dcccccd -> be4cccd0", + "3f800000 40000000 00000000 -> 3f800000", + "3f800000 40000000 3f800000 -> 3f800000", + "3f800000 40000000 bf800000 -> 3f800000", + "3f800000 40000000 3f000000 -> 3f800000", + "3f800000 40000000 bf000000 -> 3f800000", + "3f800000 40000000 40000000 -> 40000000", + "3f800000 40000000 c0000000 -> 3f800000", + "3f800000 40000000 40400000 -> 40400000", + "3f800000 40000000 c0300000 -> 3f800000", + "3f800000 40000000 3dcccccd -> 3f800000", + "3f800000 c0000000 00000000 -> bf800000", + "3f800000 c0000000 3f800000 -> 3f800000", + "3f800000 c0000000 bf800000 -> bf800000", + "3f800000 c0000000 3f000000 -> bfc00000", + "3f800000 c0000000 bf000000 -> bf000000", + "3f800000 c0000000 40000000 -> 3f800000", + "3f800000 c0000000 c0000000 -> c0000000", + "3f800000 c0000000 40400000 -> 3f800000", + "3f800000 c0000000 c0300000 -> c0300000", + "3f800000 c0000000 3dcccccd -> bf8ccccc", + "3f800000 40400000 00000000 -> 3f800000", + "3f800000 40400000 3f800000 -> 3f800000", + "3f800000 40400000 bf800000 -> 3f800000", + "3f800000 40400000 3f000000 -> 3f800000", + "3f800000 40400000 bf000000 -> 3f800000", + "3f800000 40400000 40000000 -> 40000000", + "3f800000 40400000 c0000000 -> 3f800000", + "3f800000 40400000 40400000 -> 40400000", + "3f800000 40400000 c0300000 -> 3f800000", + "3f800000 40400000 3dcccccd -> 3f800000", + "3f800000 c0300000 00000000 -> bfe00000", + "3f800000 c0300000 3f800000 -> 3f800000", + "3f800000 c0300000 bf800000 -> c0200000", + "3f800000 c0300000 3f000000 -> c0100000", + "3f800000 c0300000 bf000000 -> bfa00000", + "3f800000 c0300000 40000000 -> 3f800000", + "3f800000 c0300000 c0000000 -> c0000000", + "3f800000 c0300000 40400000 -> 3f800000", + "3f800000 c0300000 c0300000 -> c0300000", + "3f800000 c0300000 3dcccccd -> bfeccccc", + "3f800000 3dcccccd 00000000 -> 00000000", + "3f800000 3dcccccd 3f800000 -> 3f800000", + "3f800000 3dcccccd bf800000 -> bdccccd0", + "3f800000 3dcccccd 3f000000 -> 3e4ccccc", + "3f800000 3dcccccd bf000000 -> be4cccd0", + "3f800000 3dcccccd 40000000 -> 3f800000", + "3f800000 3dcccccd c0000000 -> bf8ccccc", + "3f800000 3dcccccd 40400000 -> 3f800000", + "3f800000 3dcccccd c0300000 -> bfeccccc", + "3f800000 3dcccccd 3dcccccd -> 3dcccccd", + "bf800000 00000000 00000000 -> 00000000", + "bf800000 00000000 3f800000 -> 3f800000", + "bf800000 00000000 bf800000 -> bf800000", + "bf800000 00000000 3f000000 -> 3f000000", + "bf800000 00000000 bf000000 -> bf000000", + "bf800000 00000000 40000000 -> 3f800000", + "bf800000 00000000 c0000000 -> bf800000", + "bf800000 00000000 40400000 -> 40000000", + "bf800000 00000000 c0300000 -> bf800000", + "bf800000 00000000 3dcccccd -> 3dccccd0", + "bf800000 3f800000 00000000 -> 00000000", + "bf800000 3f800000 3f800000 -> 3f800000", + "bf800000 3f800000 bf800000 -> bf800000", + "bf800000 3f800000 3f000000 -> 3f000000", + "bf800000 3f800000 bf000000 -> 3f000000", + "bf800000 3f800000 40000000 -> 40000000", + "bf800000 3f800000 c0000000 -> bf800000", + "bf800000 3f800000 40400000 -> 40400000", + "bf800000 3f800000 c0300000 -> bf800000", + "bf800000 3f800000 3dcccccd -> 3f4ccccc", + "bf800000 bf800000 00000000 -> 00000000", + "bf800000 bf800000 3f800000 -> 3f800000", + "bf800000 bf800000 bf800000 -> bf800000", + "bf800000 bf800000 3f000000 -> 3f000000", + "bf800000 bf800000 bf000000 -> bf000000", + "bf800000 bf800000 40000000 -> 40000000", + "bf800000 bf800000 c0000000 -> c0000000", + "bf800000 bf800000 40400000 -> 40400000", + "bf800000 bf800000 c0300000 -> c0300000", + "bf800000 bf800000 3dcccccd -> 3dccccd0", + "bf800000 3f000000 00000000 -> 00000000", + "bf800000 3f000000 3f800000 -> 3f800000", + "bf800000 3f000000 bf800000 -> bf800000", + "bf800000 3f000000 3f000000 -> 3f000000", + "bf800000 3f000000 bf000000 -> 00000000", + "bf800000 3f000000 40000000 -> 40000000", + "bf800000 3f000000 c0000000 -> bf800000", + "bf800000 3f000000 40400000 -> 3fc00000", + "bf800000 3f000000 c0300000 -> bf800000", + "bf800000 3f000000 3dcccccd -> 3e4cccd0", + "bf800000 bf000000 00000000 -> 00000000", + "bf800000 bf000000 3f800000 -> 3f000000", + "bf800000 bf000000 bf800000 -> bf800000", + "bf800000 bf000000 3f000000 -> 00000000", + "bf800000 bf000000 bf000000 -> bf000000", + "bf800000 bf000000 40000000 -> 3fc00000", + "bf800000 bf000000 c0000000 -> bf800000", + "bf800000 bf000000 40400000 -> 40200000", + "bf800000 bf000000 c0300000 -> bf800000", + "bf800000 bf000000 3dcccccd -> becccccc", + "bf800000 40000000 00000000 -> 3f800000", + "bf800000 40000000 3f800000 -> 3f800000", + "bf800000 40000000 bf800000 -> bf800000", + "bf800000 40000000 3f000000 -> 3f000000", + "bf800000 40000000 bf000000 -> 3fc00000", + "bf800000 40000000 40000000 -> 40000000", + "bf800000 40000000 c0000000 -> bf800000", + "bf800000 40000000 40400000 -> 40400000", + "bf800000 40000000 c0300000 -> bf800000", + "bf800000 40000000 3dcccccd -> 3f666666", + "bf800000 c0000000 00000000 -> bf800000", + "bf800000 c0000000 3f800000 -> bf800000", + "bf800000 c0000000 bf800000 -> bf800000", + "bf800000 c0000000 3f000000 -> bf800000", + "bf800000 c0000000 bf000000 -> bf800000", + "bf800000 c0000000 40000000 -> bf800000", + "bf800000 c0000000 c0000000 -> c0000000", + "bf800000 c0000000 40400000 -> bf800000", + "bf800000 c0000000 c0300000 -> c0200000", + "bf800000 c0000000 3dcccccd -> bf800000", + "bf800000 40400000 00000000 -> 40000000", + "bf800000 40400000 3f800000 -> 3f800000", + "bf800000 40400000 bf800000 -> bf800000", + "bf800000 40400000 3f000000 -> 3fc00000", + "bf800000 40400000 bf000000 -> 40200000", + "bf800000 40400000 40000000 -> 40000000", + "bf800000 40400000 c0000000 -> bf800000", + "bf800000 40400000 40400000 -> 40400000", + "bf800000 40400000 c0300000 -> bf800000", + "bf800000 40400000 3dcccccd -> 3ff33334", + "bf800000 c0300000 00000000 -> bf800000", + "bf800000 c0300000 3f800000 -> bf800000", + "bf800000 c0300000 bf800000 -> bf800000", + "bf800000 c0300000 3f000000 -> bf800000", + "bf800000 c0300000 bf000000 -> bf800000", + "bf800000 c0300000 40000000 -> bf800000", + "bf800000 c0300000 c0000000 -> c0200000", + "bf800000 c0300000 40400000 -> bf800000", + "bf800000 c0300000 c0300000 -> c0300000", + "bf800000 c0300000 3dcccccd -> bf800000", + "bf800000 3dcccccd 00000000 -> 00000000", + "bf800000 3dcccccd 3f800000 -> 3f4ccccc", + "bf800000 3dcccccd bf800000 -> bf800000", + "bf800000 3dcccccd 3f000000 -> 3e4cccd0", + "bf800000 3dcccccd bf000000 -> becccccc", + "bf800000 3dcccccd 40000000 -> 3f666666", + "bf800000 3dcccccd c0000000 -> bf800000", + "bf800000 3dcccccd 40400000 -> 3ff33334", + "bf800000 3dcccccd c0300000 -> bf800000", + "bf800000 3dcccccd 3dcccccd -> 3dcccccd", + "3f000000 00000000 00000000 -> 00000000", + "3f000000 00000000 3f800000 -> 3f000000", + "3f000000 00000000 bf800000 -> bf000000", + "3f000000 00000000 3f000000 -> 3f000000", + "3f000000 00000000 bf000000 -> bf000000", + "3f000000 00000000 40000000 -> 3f000000", + "3f000000 00000000 c0000000 -> bfc00000", + "3f000000 00000000 40400000 -> 3f000000", + "3f000000 00000000 c0300000 -> c0100000", + "3f000000 00000000 3dcccccd -> 3dcccccc", + "3f000000 3f800000 00000000 -> 3f000000", + "3f000000 3f800000 3f800000 -> 3f800000", + "3f000000 3f800000 bf800000 -> 3f000000", + "3f000000 3f800000 3f000000 -> 3f000000", + "3f000000 3f800000 bf000000 -> 3f000000", + "3f000000 3f800000 40000000 -> 3fc00000", + "3f000000 3f800000 c0000000 -> 3f000000", + "3f000000 3f800000 40400000 -> 40200000", + "3f000000 3f800000 c0300000 -> 3f000000", + "3f000000 3f800000 3dcccccd -> 3f000000", + "3f000000 bf800000 00000000 -> bf000000", + "3f000000 bf800000 3f800000 -> 3f000000", + "3f000000 bf800000 bf800000 -> bf800000", + "3f000000 bf800000 3f000000 -> 3f000000", + "3f000000 bf800000 bf000000 -> bf000000", + "3f000000 bf800000 40000000 -> 3f000000", + "3f000000 bf800000 c0000000 -> bfc00000", + "3f000000 bf800000 40400000 -> 3f000000", + "3f000000 bf800000 c0300000 -> bfa00000", + "3f000000 bf800000 3dcccccd -> bf19999a", + "3f000000 3f000000 00000000 -> 00000000", + "3f000000 3f000000 3f800000 -> 3f800000", + "3f000000 3f000000 bf800000 -> bf800000", + "3f000000 3f000000 3f000000 -> 3f000000", + "3f000000 3f000000 bf000000 -> bf000000", + "3f000000 3f000000 40000000 -> 40000000", + "3f000000 3f000000 c0000000 -> c0000000", + "3f000000 3f000000 40400000 -> 40400000", + "3f000000 3f000000 c0300000 -> c0300000", + "3f000000 3f000000 3dcccccd -> 3dcccccc", + "3f000000 bf000000 00000000 -> 00000000", + "3f000000 bf000000 3f800000 -> 3f000000", + "3f000000 bf000000 bf800000 -> bf800000", + "3f000000 bf000000 3f000000 -> 3f000000", + "3f000000 bf000000 bf000000 -> bf000000", + "3f000000 bf000000 40000000 -> 3f000000", + "3f000000 bf000000 c0000000 -> bf800000", + "3f000000 bf000000 40400000 -> 3f000000", + "3f000000 bf000000 c0300000 -> bfe00000", + "3f000000 bf000000 3dcccccd -> bdccccd0", + "3f000000 40000000 00000000 -> 3f000000", + "3f000000 40000000 3f800000 -> 3fc00000", + "3f000000 40000000 bf800000 -> 3f000000", + "3f000000 40000000 3f000000 -> 3f000000", + "3f000000 40000000 bf000000 -> 3f000000", + "3f000000 40000000 40000000 -> 40000000", + "3f000000 40000000 c0000000 -> 3f000000", + "3f000000 40000000 40400000 -> 40200000", + "3f000000 40000000 c0300000 -> 3f000000", + "3f000000 40000000 3dcccccd -> 3f000000", + "3f000000 c0000000 00000000 -> bfc00000", + "3f000000 c0000000 3f800000 -> 3f000000", + "3f000000 c0000000 bf800000 -> bfc00000", + "3f000000 c0000000 3f000000 -> 3f000000", + "3f000000 c0000000 bf000000 -> bf800000", + "3f000000 c0000000 40000000 -> 3f000000", + "3f000000 c0000000 c0000000 -> c0000000", + "3f000000 c0000000 40400000 -> 3f000000", + "3f000000 c0000000 c0300000 -> c0200000", + "3f000000 c0000000 3dcccccd -> bfcccccc", + "3f000000 40400000 00000000 -> 3f000000", + "3f000000 40400000 3f800000 -> 40200000", + "3f000000 40400000 bf800000 -> 3f000000", + "3f000000 40400000 3f000000 -> 3f000000", + "3f000000 40400000 bf000000 -> 3f000000", + "3f000000 40400000 40000000 -> 40200000", + "3f000000 40400000 c0000000 -> 3f000000", + "3f000000 40400000 40400000 -> 40400000", + "3f000000 40400000 c0300000 -> 3f000000", + "3f000000 40400000 3dcccccd -> 3f000000", + "3f000000 c0300000 00000000 -> c0100000", + "3f000000 c0300000 3f800000 -> 3f000000", + "3f000000 c0300000 bf800000 -> bfa00000", + "3f000000 c0300000 3f000000 -> 3f000000", + "3f000000 c0300000 bf000000 -> bfe00000", + "3f000000 c0300000 40000000 -> 3f000000", + "3f000000 c0300000 c0000000 -> c0200000", + "3f000000 c0300000 40400000 -> 3f000000", + "3f000000 c0300000 c0300000 -> c0300000", + "3f000000 c0300000 3dcccccd -> c0166666", + "3f000000 3dcccccd 00000000 -> 00000000", + "3f000000 3dcccccd 3f800000 -> 3f000000", + "3f000000 3dcccccd bf800000 -> bf19999a", + "3f000000 3dcccccd 3f000000 -> 3f000000", + "3f000000 3dcccccd bf000000 -> bdccccd0", + "3f000000 3dcccccd 40000000 -> 3f000000", + "3f000000 3dcccccd c0000000 -> bfcccccc", + "3f000000 3dcccccd 40400000 -> 3f000000", + "3f000000 3dcccccd c0300000 -> c0166666", + "3f000000 3dcccccd 3dcccccd -> 3dcccccd", + "bf000000 00000000 00000000 -> 00000000", + "bf000000 00000000 3f800000 -> 3f000000", + "bf000000 00000000 bf800000 -> bf000000", + "bf000000 00000000 3f000000 -> 3f000000", + "bf000000 00000000 bf000000 -> bf000000", + "bf000000 00000000 40000000 -> 3fc00000", + "bf000000 00000000 c0000000 -> bf000000", + "bf000000 00000000 40400000 -> 40200000", + "bf000000 00000000 c0300000 -> bf000000", + "bf000000 00000000 3dcccccd -> 3dccccd0", + "bf000000 3f800000 00000000 -> 3f000000", + "bf000000 3f800000 3f800000 -> 3f800000", + "bf000000 3f800000 bf800000 -> bf000000", + "bf000000 3f800000 3f000000 -> 3f000000", + "bf000000 3f800000 bf000000 -> bf000000", + "bf000000 3f800000 40000000 -> 3fc00000", + "bf000000 3f800000 c0000000 -> bf000000", + "bf000000 3f800000 40400000 -> 3fc00000", + "bf000000 3f800000 c0300000 -> bf000000", + "bf000000 3f800000 3dcccccd -> 3ecccccc", + "bf000000 bf800000 00000000 -> bf000000", + "bf000000 bf800000 3f800000 -> bf000000", + "bf000000 bf800000 bf800000 -> bf800000", + "bf000000 bf800000 3f000000 -> bf000000", + "bf000000 bf800000 bf000000 -> bf000000", + "bf000000 bf800000 40000000 -> bf000000", + "bf000000 bf800000 c0000000 -> bfc00000", + "bf000000 bf800000 40400000 -> bf000000", + "bf000000 bf800000 c0300000 -> c0100000", + "bf000000 bf800000 3dcccccd -> bf000000", + "bf000000 3f000000 00000000 -> 00000000", + "bf000000 3f000000 3f800000 -> 3f800000", + "bf000000 3f000000 bf800000 -> bf000000", + "bf000000 3f000000 3f000000 -> 3f000000", + "bf000000 3f000000 bf000000 -> bf000000", + "bf000000 3f000000 40000000 -> 3f800000", + "bf000000 3f000000 c0000000 -> bf000000", + "bf000000 3f000000 40400000 -> 40000000", + "bf000000 3f000000 c0300000 -> bf000000", + "bf000000 3f000000 3dcccccd -> 3e99999a", + "bf000000 bf000000 00000000 -> 00000000", + "bf000000 bf000000 3f800000 -> 3f800000", + "bf000000 bf000000 bf800000 -> bf800000", + "bf000000 bf000000 3f000000 -> 3f000000", + "bf000000 bf000000 bf000000 -> bf000000", + "bf000000 bf000000 40000000 -> 40000000", + "bf000000 bf000000 c0000000 -> c0000000", + "bf000000 bf000000 40400000 -> 40400000", + "bf000000 bf000000 c0300000 -> c0300000", + "bf000000 bf000000 3dcccccd -> 3dccccd0", + "bf000000 40000000 00000000 -> 3fc00000", + "bf000000 40000000 3f800000 -> 3fc00000", + "bf000000 40000000 bf800000 -> bf000000", + "bf000000 40000000 3f000000 -> 3f800000", + "bf000000 40000000 bf000000 -> bf000000", + "bf000000 40000000 40000000 -> 40000000", + "bf000000 40000000 c0000000 -> bf000000", + "bf000000 40000000 40400000 -> 40200000", + "bf000000 40000000 c0300000 -> bf000000", + "bf000000 40000000 3dcccccd -> 3fb33333", + "bf000000 c0000000 00000000 -> bf000000", + "bf000000 c0000000 3f800000 -> bf000000", + "bf000000 c0000000 bf800000 -> bfc00000", + "bf000000 c0000000 3f000000 -> bf000000", + "bf000000 c0000000 bf000000 -> bf000000", + "bf000000 c0000000 40000000 -> bf000000", + "bf000000 c0000000 c0000000 -> c0000000", + "bf000000 c0000000 40400000 -> bf000000", + "bf000000 c0000000 c0300000 -> c0300000", + "bf000000 c0000000 3dcccccd -> bf000000", + "bf000000 40400000 00000000 -> 40200000", + "bf000000 40400000 3f800000 -> 3fc00000", + "bf000000 40400000 bf800000 -> bf000000", + "bf000000 40400000 3f000000 -> 40000000", + "bf000000 40400000 bf000000 -> bf000000", + "bf000000 40400000 40000000 -> 40200000", + "bf000000 40400000 c0000000 -> bf000000", + "bf000000 40400000 40400000 -> 40400000", + "bf000000 40400000 c0300000 -> bf000000", + "bf000000 40400000 3dcccccd -> 4019999a", + "bf000000 c0300000 00000000 -> bf000000", + "bf000000 c0300000 3f800000 -> bf000000", + "bf000000 c0300000 bf800000 -> c0100000", + "bf000000 c0300000 3f000000 -> bf000000", + "bf000000 c0300000 bf000000 -> bf000000", + "bf000000 c0300000 40000000 -> bf000000", + "bf000000 c0300000 c0000000 -> c0000000", + "bf000000 c0300000 40400000 -> bf000000", + "bf000000 c0300000 c0300000 -> c0300000", + "bf000000 c0300000 3dcccccd -> bf000000", + "bf000000 3dcccccd 00000000 -> 00000000", + "bf000000 3dcccccd 3f800000 -> 3ecccccc", + "bf000000 3dcccccd bf800000 -> bf000000", + "bf000000 3dcccccd 3f000000 -> 3e99999a", + "bf000000 3dcccccd bf000000 -> bf000000", + "bf000000 3dcccccd 40000000 -> 3fb33333", + "bf000000 3dcccccd c0000000 -> bf000000", + "bf000000 3dcccccd 40400000 -> 4019999a", + "bf000000 3dcccccd c0300000 -> bf000000", + "bf000000 3dcccccd 3dcccccd -> 3dcccccd", + "40000000 00000000 00000000 -> 00000000", + "40000000 00000000 3f800000 -> 3f800000", + "40000000 00000000 bf800000 -> bf800000", + "40000000 00000000 3f000000 -> 3f000000", + "40000000 00000000 bf000000 -> bf000000", + "40000000 00000000 40000000 -> 40000000", + "40000000 00000000 c0000000 -> c0000000", + "40000000 00000000 40400000 -> 40000000", + "40000000 00000000 c0300000 -> bf400000", + "40000000 00000000 3dcccccd -> 3dccccd0", + "40000000 3f800000 00000000 -> 00000000", + "40000000 3f800000 3f800000 -> 3f800000", + "40000000 3f800000 bf800000 -> 00000000", + "40000000 3f800000 3f000000 -> 3f000000", + "40000000 3f800000 bf000000 -> 3f000000", + "40000000 3f800000 40000000 -> 40000000", + "40000000 3f800000 c0000000 -> bf800000", + "40000000 3f800000 40400000 -> 40000000", + "40000000 3f800000 c0300000 -> bfe00000", + "40000000 3f800000 3dcccccd -> 3e4cccd0", + "40000000 bf800000 00000000 -> 00000000", + "40000000 bf800000 3f800000 -> 00000000", + "40000000 bf800000 bf800000 -> bf800000", + "40000000 bf800000 3f000000 -> 3f000000", + "40000000 bf800000 bf000000 -> bf000000", + "40000000 bf800000 40000000 -> 40000000", + "40000000 bf800000 c0000000 -> c0000000", + "40000000 bf800000 40400000 -> 40000000", + "40000000 bf800000 c0300000 -> bfc00000", + "40000000 bf800000 3dcccccd -> be4cccd0", + "40000000 3f000000 00000000 -> 00000000", + "40000000 3f000000 3f800000 -> 3f800000", + "40000000 3f000000 bf800000 -> bf800000", + "40000000 3f000000 3f000000 -> 3f000000", + "40000000 3f000000 bf000000 -> 00000000", + "40000000 3f000000 40000000 -> 40000000", + "40000000 3f000000 c0000000 -> bf000000", + "40000000 3f000000 40400000 -> 40000000", + "40000000 3f000000 c0300000 -> bfa00000", + "40000000 3f000000 3dcccccd -> 3ecccccc", + "40000000 bf000000 00000000 -> 00000000", + "40000000 bf000000 3f800000 -> 3f000000", + "40000000 bf000000 bf800000 -> bf800000", + "40000000 bf000000 3f000000 -> 00000000", + "40000000 bf000000 bf000000 -> bf000000", + "40000000 bf000000 40000000 -> 40000000", + "40000000 bf000000 c0000000 -> bf800000", + "40000000 bf000000 40400000 -> 40000000", + "40000000 bf000000 c0300000 -> c0200000", + "40000000 bf000000 3dcccccd -> beccccd0", + "40000000 40000000 00000000 -> 00000000", + "40000000 40000000 3f800000 -> 3f800000", + "40000000 40000000 bf800000 -> bf800000", + "40000000 40000000 3f000000 -> 3f000000", + "40000000 40000000 bf000000 -> bf000000", + "40000000 40000000 40000000 -> 40000000", + "40000000 40000000 c0000000 -> c0000000", + "40000000 40000000 40400000 -> 40400000", + "40000000 40000000 c0300000 -> c0300000", + "40000000 40000000 3dcccccd -> 3dccccd0", + "40000000 c0000000 00000000 -> 00000000", + "40000000 c0000000 3f800000 -> bf800000", + "40000000 c0000000 bf800000 -> bf800000", + "40000000 c0000000 3f000000 -> bf000000", + "40000000 c0000000 bf000000 -> bf800000", + "40000000 c0000000 40000000 -> 40000000", + "40000000 c0000000 c0000000 -> c0000000", + "40000000 c0000000 40400000 -> 40000000", + "40000000 c0000000 c0300000 -> c0200000", + "40000000 c0000000 3dcccccd -> bdccccc0", + "40000000 40400000 00000000 -> 40000000", + "40000000 40400000 3f800000 -> 40000000", + "40000000 40400000 bf800000 -> 40000000", + "40000000 40400000 3f000000 -> 40000000", + "40000000 40400000 bf000000 -> 40000000", + "40000000 40400000 40000000 -> 40000000", + "40000000 40400000 c0000000 -> 40000000", + "40000000 40400000 40400000 -> 40400000", + "40000000 40400000 c0300000 -> 40000000", + "40000000 40400000 3dcccccd -> 40000000", + "40000000 c0300000 00000000 -> bf400000", + "40000000 c0300000 3f800000 -> bfe00000", + "40000000 c0300000 bf800000 -> bfc00000", + "40000000 c0300000 3f000000 -> bfa00000", + "40000000 c0300000 bf000000 -> c0200000", + "40000000 c0300000 40000000 -> 40000000", + "40000000 c0300000 c0000000 -> c0200000", + "40000000 c0300000 40400000 -> 40000000", + "40000000 c0300000 c0300000 -> c0300000", + "40000000 c0300000 3dcccccd -> bf599998", + "40000000 3dcccccd 00000000 -> 00000000", + "40000000 3dcccccd 3f800000 -> 3e4cccd0", + "40000000 3dcccccd bf800000 -> be4cccd0", + "40000000 3dcccccd 3f000000 -> 3ecccccc", + "40000000 3dcccccd bf000000 -> beccccd0", + "40000000 3dcccccd 40000000 -> 40000000", + "40000000 3dcccccd c0000000 -> bdccccc0", + "40000000 3dcccccd 40400000 -> 40000000", + "40000000 3dcccccd c0300000 -> bf599998", + "40000000 3dcccccd 3dcccccd -> 3dcccccd", + "c0000000 00000000 00000000 -> 00000000", + "c0000000 00000000 3f800000 -> 3f800000", + "c0000000 00000000 bf800000 -> bf800000", + "c0000000 00000000 3f000000 -> 3f000000", + "c0000000 00000000 bf000000 -> bf000000", + "c0000000 00000000 40000000 -> 40000000", + "c0000000 00000000 c0000000 -> c0000000", + "c0000000 00000000 40400000 -> 3f800000", + "c0000000 00000000 c0300000 -> c0000000", + "c0000000 00000000 3dcccccd -> 00000000", + "c0000000 3f800000 00000000 -> 00000000", + "c0000000 3f800000 3f800000 -> 3f800000", + "c0000000 3f800000 bf800000 -> 00000000", + "c0000000 3f800000 3f000000 -> 3f000000", + "c0000000 3f800000 bf000000 -> bf000000", + "c0000000 3f800000 40000000 -> 40000000", + "c0000000 3f800000 c0000000 -> c0000000", + "c0000000 3f800000 40400000 -> 40000000", + "c0000000 3f800000 c0300000 -> c0000000", + "c0000000 3f800000 3dcccccd -> 3f333330", + "c0000000 bf800000 00000000 -> 00000000", + "c0000000 bf800000 3f800000 -> 00000000", + "c0000000 bf800000 bf800000 -> bf800000", + "c0000000 bf800000 3f000000 -> bf000000", + "c0000000 bf800000 bf000000 -> bf000000", + "c0000000 bf800000 40000000 -> 3f800000", + "c0000000 bf800000 c0000000 -> c0000000", + "c0000000 bf800000 40400000 -> 40000000", + "c0000000 bf800000 c0300000 -> c0000000", + "c0000000 bf800000 3dcccccd -> bf666666", + "c0000000 3f000000 00000000 -> 00000000", + "c0000000 3f000000 3f800000 -> 3f800000", + "c0000000 3f000000 bf800000 -> bf000000", + "c0000000 3f000000 3f000000 -> 3f000000", + "c0000000 3f000000 bf000000 -> 00000000", + "c0000000 3f000000 40000000 -> 3f800000", + "c0000000 3f000000 c0000000 -> c0000000", + "c0000000 3f000000 40400000 -> 40400000", + "c0000000 3f000000 c0300000 -> c0000000", + "c0000000 3f000000 3dcccccd -> 3eccccd0", + "c0000000 bf000000 00000000 -> 00000000", + "c0000000 bf000000 3f800000 -> 3f800000", + "c0000000 bf000000 bf800000 -> bf800000", + "c0000000 bf000000 3f000000 -> 00000000", + "c0000000 bf000000 bf000000 -> bf000000", + "c0000000 bf000000 40000000 -> 3f000000", + "c0000000 bf000000 c0000000 -> c0000000", + "c0000000 bf000000 40400000 -> 3fc00000", + "c0000000 bf000000 c0300000 -> c0000000", + "c0000000 bf000000 3dcccccd -> be4cccc8", + "c0000000 40000000 00000000 -> 00000000", + "c0000000 40000000 3f800000 -> 3f800000", + "c0000000 40000000 bf800000 -> 3f800000", + "c0000000 40000000 3f000000 -> 3f800000", + "c0000000 40000000 bf000000 -> 3f000000", + "c0000000 40000000 40000000 -> 40000000", + "c0000000 40000000 c0000000 -> c0000000", + "c0000000 40000000 40400000 -> 40400000", + "c0000000 40000000 c0300000 -> c0000000", + "c0000000 40000000 3dcccccd -> 3fe66666", + "c0000000 c0000000 00000000 -> 00000000", + "c0000000 c0000000 3f800000 -> 3f800000", + "c0000000 c0000000 bf800000 -> bf800000", + "c0000000 c0000000 3f000000 -> 3f000000", + "c0000000 c0000000 bf000000 -> bf000000", + "c0000000 c0000000 40000000 -> 40000000", + "c0000000 c0000000 c0000000 -> c0000000", + "c0000000 c0000000 40400000 -> 40400000", + "c0000000 c0000000 c0300000 -> c0300000", + "c0000000 c0000000 3dcccccd -> 3dccccc0", + "c0000000 40400000 00000000 -> 3f800000", + "c0000000 40400000 3f800000 -> 40000000", + "c0000000 40400000 bf800000 -> 40000000", + "c0000000 40400000 3f000000 -> 3f000000", + "c0000000 40400000 bf000000 -> 3fc00000", + "c0000000 40400000 40000000 -> 40000000", + "c0000000 40400000 c0000000 -> c0000000", + "c0000000 40400000 40400000 -> 40400000", + "c0000000 40400000 c0300000 -> c0000000", + "c0000000 40400000 3dcccccd -> 3f666668", + "c0000000 c0300000 00000000 -> c0000000", + "c0000000 c0300000 3f800000 -> c0000000", + "c0000000 c0300000 bf800000 -> c0000000", + "c0000000 c0300000 3f000000 -> c0000000", + "c0000000 c0300000 bf000000 -> c0000000", + "c0000000 c0300000 40000000 -> c0000000", + "c0000000 c0300000 c0000000 -> c0000000", + "c0000000 c0300000 40400000 -> c0000000", + "c0000000 c0300000 c0300000 -> c0300000", + "c0000000 c0300000 3dcccccd -> c0000000", + "c0000000 3dcccccd 00000000 -> 00000000", + "c0000000 3dcccccd 3f800000 -> 3f333330", + "c0000000 3dcccccd bf800000 -> bf666666", + "c0000000 3dcccccd 3f000000 -> 3eccccd0", + "c0000000 3dcccccd bf000000 -> be4cccc8", + "c0000000 3dcccccd 40000000 -> 3fe66666", + "c0000000 3dcccccd c0000000 -> c0000000", + "c0000000 3dcccccd 40400000 -> 3f666668", + "c0000000 3dcccccd c0300000 -> c0000000", + "c0000000 3dcccccd 3dcccccd -> 3dcccccd", + "40400000 00000000 00000000 -> 00000000", + "40400000 00000000 3f800000 -> 3f800000", + "40400000 00000000 bf800000 -> bf800000", + "40400000 00000000 3f000000 -> 3f000000", + "40400000 00000000 bf000000 -> bf000000", + "40400000 00000000 40000000 -> 3f800000", + "40400000 00000000 c0000000 -> bf800000", + "40400000 00000000 40400000 -> 40400000", + "40400000 00000000 c0300000 -> c0200000", + "40400000 00000000 3dcccccd -> 3dccccc0", + "40400000 3f800000 00000000 -> 00000000", + "40400000 3f800000 3f800000 -> 3f800000", + "40400000 3f800000 bf800000 -> bf800000", + "40400000 3f800000 3f000000 -> 3f000000", + "40400000 3f800000 bf000000 -> 00000000", + "40400000 3f800000 40000000 -> 40000000", + "40400000 3f800000 c0000000 -> 00000000", + "40400000 3f800000 40400000 -> 40400000", + "40400000 3f800000 c0300000 -> bf400000", + "40400000 3f800000 3dcccccd -> 3e9999a0", + "40400000 bf800000 00000000 -> 00000000", + "40400000 bf800000 3f800000 -> 3f800000", + "40400000 bf800000 bf800000 -> bf800000", + "40400000 bf800000 3f000000 -> 00000000", + "40400000 bf800000 bf000000 -> bf000000", + "40400000 bf800000 40000000 -> 00000000", + "40400000 bf800000 c0000000 -> c0000000", + "40400000 bf800000 40400000 -> 40400000", + "40400000 bf800000 c0300000 -> c0100000", + "40400000 bf800000 3dcccccd -> be9999a0", + "40400000 3f000000 00000000 -> 00000000", + "40400000 3f000000 3f800000 -> 3f800000", + "40400000 3f000000 bf800000 -> 00000000", + "40400000 3f000000 3f000000 -> 3f000000", + "40400000 3f000000 bf000000 -> 00000000", + "40400000 3f000000 40000000 -> 3fc00000", + "40400000 3f000000 c0000000 -> c0000000", + "40400000 3f000000 40400000 -> 40400000", + "40400000 3f000000 c0300000 -> be800000", + "40400000 3f000000 3dcccccd -> 3e4cccd0", + "40400000 bf000000 00000000 -> 00000000", + "40400000 bf000000 3f800000 -> 00000000", + "40400000 bf000000 bf800000 -> bf800000", + "40400000 bf000000 3f000000 -> 00000000", + "40400000 bf000000 bf000000 -> bf000000", + "40400000 bf000000 40000000 -> 3f000000", + "40400000 bf000000 c0000000 -> bfc00000", + "40400000 bf000000 40400000 -> 40400000", + "40400000 bf000000 c0300000 -> bfc00000", + "40400000 bf000000 3dcccccd -> 00000000", + "40400000 40000000 00000000 -> 3f800000", + "40400000 40000000 3f800000 -> 3f800000", + "40400000 40000000 bf800000 -> 00000000", + "40400000 40000000 3f000000 -> 3fc00000", + "40400000 40000000 bf000000 -> 3f000000", + "40400000 40000000 40000000 -> 40000000", + "40400000 40000000 c0000000 -> bf800000", + "40400000 40000000 40400000 -> 40400000", + "40400000 40000000 c0300000 -> bfe00000", + "40400000 40000000 3dcccccd -> 3f8ccccd", + "40400000 c0000000 00000000 -> bf800000", + "40400000 c0000000 3f800000 -> 00000000", + "40400000 c0000000 bf800000 -> bf800000", + "40400000 c0000000 3f000000 -> 3f000000", + "40400000 c0000000 bf000000 -> bfc00000", + "40400000 c0000000 40000000 -> bf800000", + "40400000 c0000000 c0000000 -> c0000000", + "40400000 c0000000 40400000 -> 40400000", + "40400000 c0000000 c0300000 -> c0100000", + "40400000 c0000000 3dcccccd -> bf999998", + "40400000 40400000 00000000 -> 00000000", + "40400000 40400000 3f800000 -> 3f800000", + "40400000 40400000 bf800000 -> bf800000", + "40400000 40400000 3f000000 -> 3f000000", + "40400000 40400000 bf000000 -> bf000000", + "40400000 40400000 40000000 -> 40000000", + "40400000 40400000 c0000000 -> c0000000", + "40400000 40400000 40400000 -> 40400000", + "40400000 40400000 c0300000 -> c0300000", + "40400000 40400000 3dcccccd -> 3dccccc0", + "40400000 c0300000 00000000 -> c0200000", + "40400000 c0300000 3f800000 -> bf400000", + "40400000 c0300000 bf800000 -> c0100000", + "40400000 c0300000 3f000000 -> be800000", + "40400000 c0300000 bf000000 -> bfc00000", + "40400000 c0300000 40000000 -> bfe00000", + "40400000 c0300000 c0000000 -> c0100000", + "40400000 c0300000 40400000 -> 40400000", + "40400000 c0300000 c0300000 -> c0300000", + "40400000 c0300000 3dcccccd -> c02ccccc", + "40400000 3dcccccd 00000000 -> 00000000", + "40400000 3dcccccd 3f800000 -> 3e9999a0", + "40400000 3dcccccd bf800000 -> be9999a0", + "40400000 3dcccccd 3f000000 -> 3e4cccd0", + "40400000 3dcccccd bf000000 -> 00000000", + "40400000 3dcccccd 40000000 -> 3f8ccccd", + "40400000 3dcccccd c0000000 -> bf999998", + "40400000 3dcccccd 40400000 -> 40400000", + "40400000 3dcccccd c0300000 -> c02ccccc", + "40400000 3dcccccd 3dcccccd -> 3dcccccd", + "c0300000 00000000 00000000 -> 00000000", + "c0300000 00000000 3f800000 -> 3e800000", + "c0300000 00000000 bf800000 -> bf400000", + "c0300000 00000000 3f000000 -> 3e800000", + "c0300000 00000000 bf000000 -> be800000", + "c0300000 00000000 40000000 -> 3fa00000", + "c0300000 00000000 c0000000 -> bf400000", + "c0300000 00000000 40400000 -> 3e800000", + "c0300000 00000000 c0300000 -> c0300000", + "c0300000 00000000 3dcccccd -> 3d4cccc0", + "c0300000 3f800000 00000000 -> 3e800000", + "c0300000 3f800000 3f800000 -> 3f800000", + "c0300000 3f800000 bf800000 -> bf400000", + "c0300000 3f800000 3f000000 -> 3f400000", + "c0300000 3f800000 bf000000 -> 3e800000", + "c0300000 3f800000 40000000 -> 3fa00000", + "c0300000 3f800000 c0000000 -> 3e800000", + "c0300000 3f800000 40400000 -> 3fa00000", + "c0300000 3f800000 c0300000 -> c0300000", + "c0300000 3f800000 3dcccccd -> 3f599998", + "c0300000 bf800000 00000000 -> bf400000", + "c0300000 bf800000 3f800000 -> bf400000", + "c0300000 bf800000 bf800000 -> bf800000", + "c0300000 bf800000 3f000000 -> 3e800000", + "c0300000 bf800000 bf000000 -> bf400000", + "c0300000 bf800000 40000000 -> 3e800000", + "c0300000 bf800000 c0000000 -> bfe00000", + "c0300000 bf800000 40400000 -> 3fa00000", + "c0300000 bf800000 c0300000 -> c0300000", + "c0300000 bf800000 3dcccccd -> bf0ccccc", + "c0300000 3f000000 00000000 -> 3e800000", + "c0300000 3f000000 3f800000 -> 3f400000", + "c0300000 3f000000 bf800000 -> 3e800000", + "c0300000 3f000000 3f000000 -> 3f000000", + "c0300000 3f000000 bf000000 -> 3e800000", + "c0300000 3f000000 40000000 -> 3fe00000", + "c0300000 3f000000 c0000000 -> be800000", + "c0300000 3f000000 40400000 -> 40100000", + "c0300000 3f000000 c0300000 -> c0300000", + "c0300000 3f000000 3dcccccd -> 3ee66668", + "c0300000 bf000000 00000000 -> be800000", + "c0300000 bf000000 3f800000 -> 3e800000", + "c0300000 bf000000 bf800000 -> bf400000", + "c0300000 bf000000 3f000000 -> 3e800000", + "c0300000 bf000000 bf000000 -> bf000000", + "c0300000 bf000000 40000000 -> be800000", + "c0300000 bf000000 c0000000 -> bfa00000", + "c0300000 bf000000 40400000 -> 3f400000", + "c0300000 bf000000 c0300000 -> c0300000", + "c0300000 bf000000 3dcccccd -> beb33330", + "c0300000 40000000 00000000 -> 3fa00000", + "c0300000 40000000 3f800000 -> 3fa00000", + "c0300000 40000000 bf800000 -> 3e800000", + "c0300000 40000000 3f000000 -> 3fe00000", + "c0300000 40000000 bf000000 -> be800000", + "c0300000 40000000 40000000 -> 40000000", + "c0300000 40000000 c0000000 -> 3fa00000", + "c0300000 40000000 40400000 -> 40100000", + "c0300000 40000000 c0300000 -> c0300000", + "c0300000 40000000 3dcccccd -> 3f866666", + "c0300000 c0000000 00000000 -> bf400000", + "c0300000 c0000000 3f800000 -> 3e800000", + "c0300000 c0000000 bf800000 -> bfe00000", + "c0300000 c0000000 3f000000 -> be800000", + "c0300000 c0000000 bf000000 -> bfa00000", + "c0300000 c0000000 40000000 -> 3fa00000", + "c0300000 c0000000 c0000000 -> c0000000", + "c0300000 c0000000 40400000 -> 40100000", + "c0300000 c0000000 c0300000 -> c0300000", + "c0300000 c0000000 3dcccccd -> bf266668", + "c0300000 40400000 00000000 -> 3e800000", + "c0300000 40400000 3f800000 -> 3fa00000", + "c0300000 40400000 bf800000 -> 3fa00000", + "c0300000 40400000 3f000000 -> 40100000", + "c0300000 40400000 bf000000 -> 3f400000", + "c0300000 40400000 40000000 -> 40100000", + "c0300000 40400000 c0000000 -> 40100000", + "c0300000 40400000 40400000 -> 40400000", + "c0300000 40400000 c0300000 -> c0300000", + "c0300000 40400000 3dcccccd -> 3e1999a0", + "c0300000 c0300000 00000000 -> 00000000", + "c0300000 c0300000 3f800000 -> 3f800000", + "c0300000 c0300000 bf800000 -> bf800000", + "c0300000 c0300000 3f000000 -> 3f000000", + "c0300000 c0300000 bf000000 -> bf000000", + "c0300000 c0300000 40000000 -> 40000000", + "c0300000 c0300000 c0000000 -> c0000000", + "c0300000 c0300000 40400000 -> 40400000", + "c0300000 c0300000 c0300000 -> c0300000", + "c0300000 c0300000 3dcccccd -> 3dccccc0", + "c0300000 3dcccccd 00000000 -> 3d4cccc0", + "c0300000 3dcccccd 3f800000 -> 3f599998", + "c0300000 3dcccccd bf800000 -> bf0ccccc", + "c0300000 3dcccccd 3f000000 -> 3ee66668", + "c0300000 3dcccccd bf000000 -> beb33330", + "c0300000 3dcccccd 40000000 -> 3f866666", + "c0300000 3dcccccd c0000000 -> bf266668", + "c0300000 3dcccccd 40400000 -> 3e1999a0", + "c0300000 3dcccccd c0300000 -> c0300000", + "c0300000 3dcccccd 3dcccccd -> 3dcccccd", + "3dcccccd 00000000 00000000 -> 00000000", + "3dcccccd 00000000 3f800000 -> 3dcccccd", + "3dcccccd 00000000 bf800000 -> bf666666", + "3dcccccd 00000000 3f000000 -> 3dcccccd", + "3dcccccd 00000000 bf000000 -> becccccd", + "3dcccccd 00000000 40000000 -> 3dcccccd", + "3dcccccd 00000000 c0000000 -> bff33333", + "3dcccccd 00000000 40400000 -> 3dcccccd", + "3dcccccd 00000000 c0300000 -> c029999a", + "3dcccccd 00000000 3dcccccd -> 3dcccccd", + "3dcccccd 3f800000 00000000 -> 3dcccccd", + "3dcccccd 3f800000 3f800000 -> 3f800000", + "3dcccccd 3f800000 bf800000 -> 3dcccccd", + "3dcccccd 3f800000 3f000000 -> 3f19999a", + "3dcccccd 3f800000 bf000000 -> 3dcccccd", + "3dcccccd 3f800000 40000000 -> 3f8ccccd", + "3dcccccd 3f800000 c0000000 -> 3dcccccd", + "3dcccccd 3f800000 40400000 -> 40066666", + "3dcccccd 3f800000 c0300000 -> 3dcccccd", + "3dcccccd 3f800000 3dcccccd -> 3dcccccd", + "3dcccccd bf800000 00000000 -> bf666666", + "3dcccccd bf800000 3f800000 -> 3dcccccd", + "3dcccccd bf800000 bf800000 -> bf800000", + "3dcccccd bf800000 3f000000 -> 3dcccccd", + "3dcccccd bf800000 bf000000 -> bf666666", + "3dcccccd bf800000 40000000 -> 3dcccccd", + "3dcccccd bf800000 c0000000 -> bff33333", + "3dcccccd bf800000 40400000 -> 3dcccccd", + "3dcccccd bf800000 c0300000 -> bfd33333", + "3dcccccd bf800000 3dcccccd -> 3dcccccd", + "3dcccccd 3f000000 00000000 -> 3dcccccd", + "3dcccccd 3f000000 3f800000 -> 3f19999a", + "3dcccccd 3f000000 bf800000 -> 3dcccccd", + "3dcccccd 3f000000 3f000000 -> 3f000000", + "3dcccccd 3f000000 bf000000 -> 3dcccccd", + "3dcccccd 3f000000 40000000 -> 3fcccccd", + "3dcccccd 3f000000 c0000000 -> 3dcccccd", + "3dcccccd 3f000000 40400000 -> 40266666", + "3dcccccd 3f000000 c0300000 -> 3dcccccd", + "3dcccccd 3f000000 3dcccccd -> 3dcccccd", + "3dcccccd bf000000 00000000 -> becccccd", + "3dcccccd bf000000 3f800000 -> 3dcccccd", + "3dcccccd bf000000 bf800000 -> bf666666", + "3dcccccd bf000000 3f000000 -> 3dcccccd", + "3dcccccd bf000000 bf000000 -> bf000000", + "3dcccccd bf000000 40000000 -> 3dcccccd", + "3dcccccd bf000000 c0000000 -> bfb33333", + "3dcccccd bf000000 40400000 -> 3dcccccd", + "3dcccccd bf000000 c0300000 -> c009999a", + "3dcccccd bf000000 3dcccccd -> 3dcccccd", + "3dcccccd 40000000 00000000 -> 3dcccccd", + "3dcccccd 40000000 3f800000 -> 3f8ccccd", + "3dcccccd 40000000 bf800000 -> 3dcccccd", + "3dcccccd 40000000 3f000000 -> 3fcccccd", + "3dcccccd 40000000 bf000000 -> 3dcccccd", + "3dcccccd 40000000 40000000 -> 40000000", + "3dcccccd 40000000 c0000000 -> 3dcccccd", + "3dcccccd 40000000 40400000 -> 40066666", + "3dcccccd 40000000 c0300000 -> 3dcccccd", + "3dcccccd 40000000 3dcccccd -> 3dcccccd", + "3dcccccd c0000000 00000000 -> bff33333", + "3dcccccd c0000000 3f800000 -> 3dcccccd", + "3dcccccd c0000000 bf800000 -> bff33333", + "3dcccccd c0000000 3f000000 -> 3dcccccd", + "3dcccccd c0000000 bf000000 -> bfb33333", + "3dcccccd c0000000 40000000 -> 3dcccccd", + "3dcccccd c0000000 c0000000 -> c0000000", + "3dcccccd c0000000 40400000 -> 3dcccccd", + "3dcccccd c0000000 c0300000 -> c009999a", + "3dcccccd c0000000 3dcccccd -> 3dcccccd", + "3dcccccd 40400000 00000000 -> 3dcccccd", + "3dcccccd 40400000 3f800000 -> 40066666", + "3dcccccd 40400000 bf800000 -> 3dcccccd", + "3dcccccd 40400000 3f000000 -> 40266666", + "3dcccccd 40400000 bf000000 -> 3dcccccd", + "3dcccccd 40400000 40000000 -> 40066666", + "3dcccccd 40400000 c0000000 -> 3dcccccd", + "3dcccccd 40400000 40400000 -> 40400000", + "3dcccccd 40400000 c0300000 -> 3dcccccd", + "3dcccccd 40400000 3dcccccd -> 3dcccccd", + "3dcccccd c0300000 00000000 -> c029999a", + "3dcccccd c0300000 3f800000 -> 3dcccccd", + "3dcccccd c0300000 bf800000 -> bfd33333", + "3dcccccd c0300000 3f000000 -> 3dcccccd", + "3dcccccd c0300000 bf000000 -> c009999a", + "3dcccccd c0300000 40000000 -> 3dcccccd", + "3dcccccd c0300000 c0000000 -> c009999a", + "3dcccccd c0300000 40400000 -> 3dcccccd", + "3dcccccd c0300000 c0300000 -> c0300000", + "3dcccccd c0300000 3dcccccd -> 3dcccccd", + "3dcccccd 3dcccccd 00000000 -> 00000000", + "3dcccccd 3dcccccd 3f800000 -> 3f800000", + "3dcccccd 3dcccccd bf800000 -> bf800000", + "3dcccccd 3dcccccd 3f000000 -> 3f000000", + "3dcccccd 3dcccccd bf000000 -> bf000000", + "3dcccccd 3dcccccd 40000000 -> 40000000", + "3dcccccd 3dcccccd c0000000 -> bfffffff", + "3dcccccd 3dcccccd 40400000 -> 40400000", + "3dcccccd 3dcccccd c0300000 -> c0300000", + "3dcccccd 3dcccccd 3dcccccd -> 3dcccccd", + "4134a7eb c0ac8f2f 40863959 -> 3fda1d38", + "419907fd 3fc2e407 c041dd57 -> 3f6c0a00", + "4196fa25 c0bc8cd8 bff49850 -> c0a08004", + "41434217 c104a537 410a5189 -> c0976952", + "c13c69a6 c04c17e7 bf80ff98 -> c043462c", + "40e7eb90 3f80c9dc c059c093 -> bfc8e7c0", + "409f65b5 4113ba97 4013dd43 -> 409f65b5", + "41204b3c c030892a 403f099e -> bfbbf140", + "419ae36f bfd6102c 3faab244 -> 3fa9a850", + "40f37af1 410d8076 c06f6e7d -> 40f37af1", + "4112a593 c10cf118 c0a20d2f -> c0ba08de", + "41535edb c0006395 bef01f1a -> bf1f8750", + "40b03ad5 c10bd62f 4065020f -> c0d9f291", + "c19a4c98 bfab6f08 c11b48eb -> c0238c70", + "412125c1 400197b4 c097298a -> c05b3e8c", + "4149a4ba c0ffeed0 4113e24a -> c09469f0", + "c18a4d13 c02faa7d c09f06a5 -> c07c17c8", + "41661214 4099fe77 c0de2b89 -> 4027f450", + "c12e3cc4 c0de76aa 409b11e6 -> 3f687840", + "40f065b9 c117d3c7 c08a51f0 -> c0ff9b21", + "c108adb3 c10ba4c8 409b7597 -> c108adb3", + "3fa3c533 c1109840 4083cf4f -> 3fa3c533", + "c191efd7 c0f1cc84 3ec6b622 -> c0169f20", + "c0c340fe c0dbba64 c113936d -> c10756ba" + ] + }, + { + "function": "cycles_snap", + "node": "ShaderNodeMath SNAP", + "cases": [ + "00000000 00000000 -> 00000000", + "00000000 3f800000 -> 00000000", + "00000000 bf800000 -> 00000000", + "00000000 3f000000 -> 00000000", + "00000000 bf000000 -> 00000000", + "00000000 40000000 -> 00000000", + "00000000 c0000000 -> 00000000", + "00000000 40400000 -> 00000000", + "00000000 c0300000 -> 00000000", + "00000000 3dcccccd -> 00000000", + "00000000 bdcccccd -> 00000000", + "00000000 40f00000 -> 00000000", + "00000000 c0f00000 -> 00000000", + "00000000 33d6bf95 -> 00000000", + "00000000 b3d6bf95 -> 00000000", + "00000000 42c80000 -> 00000000", + "00000000 c2c80000 -> 00000000", + "00000000 461c4000 -> 00000000", + "00000000 3e99999a -> 00000000", + "00000000 3f333333 -> 00000000", + "3f800000 00000000 -> 00000000", + "3f800000 3f800000 -> 3f800000", + "3f800000 bf800000 -> 3f800000", + "3f800000 3f000000 -> 3f800000", + "3f800000 bf000000 -> 3f800000", + "3f800000 40000000 -> 00000000", + "3f800000 c0000000 -> 40000000", + "3f800000 40400000 -> 00000000", + "3f800000 c0300000 -> 40300000", + "3f800000 3dcccccd -> 3f800000", + "3f800000 bdcccccd -> 3f800000", + "3f800000 40f00000 -> 00000000", + "3f800000 c0f00000 -> 40f00000", + "3f800000 33d6bf95 -> 3f800000", + "3f800000 b3d6bf95 -> 3f800000", + "3f800000 42c80000 -> 00000000", + "3f800000 c2c80000 -> 42c80000", + "3f800000 461c4000 -> 00000000", + "3f800000 3e99999a -> 3f666667", + "3f800000 3f333333 -> 3f333333", + "bf800000 00000000 -> 00000000", + "bf800000 3f800000 -> bf800000", + "bf800000 bf800000 -> bf800000", + "bf800000 3f000000 -> bf800000", + "bf800000 bf000000 -> bf800000", + "bf800000 40000000 -> c0000000", + "bf800000 c0000000 -> 00000000", + "bf800000 40400000 -> c0400000", + "bf800000 c0300000 -> 00000000", + "bf800000 3dcccccd -> bf800000", + "bf800000 bdcccccd -> bf800000", + "bf800000 40f00000 -> c0f00000", + "bf800000 c0f00000 -> 00000000", + "bf800000 33d6bf95 -> bf800000", + "bf800000 b3d6bf95 -> bf800000", + "bf800000 42c80000 -> c2c80000", + "bf800000 c2c80000 -> 00000000", + "bf800000 461c4000 -> c61c4000", + "bf800000 3e99999a -> bf99999a", + "bf800000 3f333333 -> bfb33333", + "3f000000 00000000 -> 00000000", + "3f000000 3f800000 -> 00000000", + "3f000000 bf800000 -> 3f800000", + "3f000000 3f000000 -> 3f000000", + "3f000000 bf000000 -> 3f000000", + "3f000000 40000000 -> 00000000", + "3f000000 c0000000 -> 40000000", + "3f000000 40400000 -> 00000000", + "3f000000 c0300000 -> 40300000", + "3f000000 3dcccccd -> 3f000000", + "3f000000 bdcccccd -> 3f000000", + "3f000000 40f00000 -> 00000000", + "3f000000 c0f00000 -> 40f00000", + "3f000000 33d6bf95 -> 3f000000", + "3f000000 b3d6bf95 -> 3f000000", + "3f000000 42c80000 -> 00000000", + "3f000000 c2c80000 -> 42c80000", + "3f000000 461c4000 -> 00000000", + "3f000000 3e99999a -> 3e99999a", + "3f000000 3f333333 -> 00000000", + "bf000000 00000000 -> 00000000", + "bf000000 3f800000 -> bf800000", + "bf000000 bf800000 -> 00000000", + "bf000000 3f000000 -> bf000000", + "bf000000 bf000000 -> bf000000", + "bf000000 40000000 -> c0000000", + "bf000000 c0000000 -> 00000000", + "bf000000 40400000 -> c0400000", + "bf000000 c0300000 -> 00000000", + "bf000000 3dcccccd -> bf000000", + "bf000000 bdcccccd -> bf000000", + "bf000000 40f00000 -> c0f00000", + "bf000000 c0f00000 -> 00000000", + "bf000000 33d6bf95 -> bf000000", + "bf000000 b3d6bf95 -> bf000000", + "bf000000 42c80000 -> c2c80000", + "bf000000 c2c80000 -> 00000000", + "bf000000 461c4000 -> c61c4000", + "bf000000 3e99999a -> bf19999a", + "bf000000 3f333333 -> bf333333", + "40000000 00000000 -> 00000000", + "40000000 3f800000 -> 40000000", + "40000000 bf800000 -> 40000000", + "40000000 3f000000 -> 40000000", + "40000000 bf000000 -> 40000000", + "40000000 40000000 -> 40000000", + "40000000 c0000000 -> 40000000", + "40000000 40400000 -> 00000000", + "40000000 c0300000 -> 40300000", + "40000000 3dcccccd -> 40000000", + "40000000 bdcccccd -> 40000000", + "40000000 40f00000 -> 00000000", + "40000000 c0f00000 -> 40f00000", + "40000000 33d6bf95 -> 40000000", + "40000000 b3d6bf95 -> 40000000", + "40000000 42c80000 -> 00000000", + "40000000 c2c80000 -> 42c80000", + "40000000 461c4000 -> 00000000", + "40000000 3e99999a -> 3fe66667", + "40000000 3f333333 -> 3fb33333", + "c0000000 00000000 -> 00000000", + "c0000000 3f800000 -> c0000000", + "c0000000 bf800000 -> c0000000", + "c0000000 3f000000 -> c0000000", + "c0000000 bf000000 -> c0000000", + "c0000000 40000000 -> c0000000", + "c0000000 c0000000 -> c0000000", + "c0000000 40400000 -> c0400000", + "c0000000 c0300000 -> 00000000", + "c0000000 3dcccccd -> c0000000", + "c0000000 bdcccccd -> c0000000", + "c0000000 40f00000 -> c0f00000", + "c0000000 c0f00000 -> 00000000", + "c0000000 33d6bf95 -> c0000000", + "c0000000 b3d6bf95 -> c0000000", + "c0000000 42c80000 -> c2c80000", + "c0000000 c2c80000 -> 00000000", + "c0000000 461c4000 -> c61c4000", + "c0000000 3e99999a -> c0066667", + "c0000000 3f333333 -> c0066666", + "40400000 00000000 -> 00000000", + "40400000 3f800000 -> 40400000", + "40400000 bf800000 -> 40400000", + "40400000 3f000000 -> 40400000", + "40400000 bf000000 -> 40400000", + "40400000 40000000 -> 40000000", + "40400000 c0000000 -> 40800000", + "40400000 40400000 -> 40400000", + "40400000 c0300000 -> 40b00000", + "40400000 3dcccccd -> 40400000", + "40400000 bdcccccd -> 40400000", + "40400000 40f00000 -> 00000000", + "40400000 c0f00000 -> 40f00000", + "40400000 33d6bf95 -> 40400000", + "40400000 b3d6bf95 -> 40400000", + "40400000 42c80000 -> 00000000", + "40400000 c2c80000 -> 42c80000", + "40400000 461c4000 -> 00000000", + "40400000 3e99999a -> 40400000", + "40400000 3f333333 -> 40333333", + "c0300000 00000000 -> 00000000", + "c0300000 3f800000 -> c0400000", + "c0300000 bf800000 -> c0000000", + "c0300000 3f000000 -> c0400000", + "c0300000 bf000000 -> c0200000", + "c0300000 40000000 -> c0800000", + "c0300000 c0000000 -> c0000000", + "c0300000 40400000 -> c0400000", + "c0300000 c0300000 -> c0300000", + "c0300000 3dcccccd -> c0333333", + "c0300000 bdcccccd -> c02ccccd", + "c0300000 40f00000 -> c0f00000", + "c0300000 c0f00000 -> 00000000", + "c0300000 33d6bf95 -> c0300000", + "c0300000 b3d6bf95 -> c0300000", + "c0300000 42c80000 -> c2c80000", + "c0300000 c2c80000 -> 00000000", + "c0300000 461c4000 -> c61c4000", + "c0300000 3e99999a -> c0400000", + "c0300000 3f333333 -> c0333333", + "3dcccccd 00000000 -> 00000000", + "3dcccccd 3f800000 -> 00000000", + "3dcccccd bf800000 -> 3f800000", + "3dcccccd 3f000000 -> 00000000", + "3dcccccd bf000000 -> 3f000000", + "3dcccccd 40000000 -> 00000000", + "3dcccccd c0000000 -> 40000000", + "3dcccccd 40400000 -> 00000000", + "3dcccccd c0300000 -> 40300000", + "3dcccccd 3dcccccd -> 3dcccccd", + "3dcccccd bdcccccd -> 3dcccccd", + "3dcccccd 40f00000 -> 00000000", + "3dcccccd c0f00000 -> 40f00000", + "3dcccccd 33d6bf95 -> 3dcccccd", + "3dcccccd b3d6bf95 -> 3dcccccd", + "3dcccccd 42c80000 -> 00000000", + "3dcccccd c2c80000 -> 42c80000", + "3dcccccd 461c4000 -> 00000000", + "3dcccccd 3e99999a -> 00000000", + "3dcccccd 3f333333 -> 00000000", + "bdcccccd 00000000 -> 00000000", + "bdcccccd 3f800000 -> bf800000", + "bdcccccd bf800000 -> 00000000", + "bdcccccd 3f000000 -> bf000000", + "bdcccccd bf000000 -> 00000000", + "bdcccccd 40000000 -> c0000000", + "bdcccccd c0000000 -> 00000000", + "bdcccccd 40400000 -> c0400000", + "bdcccccd c0300000 -> 00000000", + "bdcccccd 3dcccccd -> bdcccccd", + "bdcccccd bdcccccd -> bdcccccd", + "bdcccccd 40f00000 -> c0f00000", + "bdcccccd c0f00000 -> 00000000", + "bdcccccd 33d6bf95 -> bdcccccd", + "bdcccccd b3d6bf95 -> bdcccccd", + "bdcccccd 42c80000 -> c2c80000", + "bdcccccd c2c80000 -> 00000000", + "bdcccccd 461c4000 -> c61c4000", + "bdcccccd 3e99999a -> be99999a", + "bdcccccd 3f333333 -> bf333333", + "40f00000 00000000 -> 00000000", + "40f00000 3f800000 -> 40e00000", + "40f00000 bf800000 -> 41000000", + "40f00000 3f000000 -> 40f00000", + "40f00000 bf000000 -> 40f00000", + "40f00000 40000000 -> 40c00000", + "40f00000 c0000000 -> 41000000", + "40f00000 40400000 -> 40c00000", + "40f00000 c0300000 -> 41040000", + "40f00000 3dcccccd -> 40f00000", + "40f00000 bdcccccd -> 40f00000", + "40f00000 40f00000 -> 40f00000", + "40f00000 c0f00000 -> 40f00000", + "40f00000 33d6bf95 -> 40f00000", + "40f00000 b3d6bf95 -> 40f00000", + "40f00000 42c80000 -> 00000000", + "40f00000 c2c80000 -> 42c80000", + "40f00000 461c4000 -> 00000000", + "40f00000 3e99999a -> 40e66667", + "40f00000 3f333333 -> 40e00000", + "c0f00000 00000000 -> 00000000", + "c0f00000 3f800000 -> c1000000", + "c0f00000 bf800000 -> c0e00000", + "c0f00000 3f000000 -> c0f00000", + "c0f00000 bf000000 -> c0f00000", + "c0f00000 40000000 -> c1000000", + "c0f00000 c0000000 -> c0c00000", + "c0f00000 40400000 -> c1100000", + "c0f00000 c0300000 -> c0b00000", + "c0f00000 3dcccccd -> c0f00000", + "c0f00000 bdcccccd -> c0f00000", + "c0f00000 40f00000 -> c0f00000", + "c0f00000 c0f00000 -> c0f00000", + "c0f00000 33d6bf95 -> c0f00000", + "c0f00000 b3d6bf95 -> c0f00000", + "c0f00000 42c80000 -> c2c80000", + "c0f00000 c2c80000 -> 00000000", + "c0f00000 461c4000 -> c61c4000", + "c0f00000 3e99999a -> c0f00001", + "c0f00000 3f333333 -> c0f66666", + "33d6bf95 00000000 -> 00000000", + "33d6bf95 3f800000 -> 00000000", + "33d6bf95 bf800000 -> 3f800000", + "33d6bf95 3f000000 -> 00000000", + "33d6bf95 bf000000 -> 3f000000", + "33d6bf95 40000000 -> 00000000", + "33d6bf95 c0000000 -> 40000000", + "33d6bf95 40400000 -> 00000000", + "33d6bf95 c0300000 -> 40300000", + "33d6bf95 3dcccccd -> 00000000", + "33d6bf95 bdcccccd -> 3dcccccd", + "33d6bf95 40f00000 -> 00000000", + "33d6bf95 c0f00000 -> 40f00000", + "33d6bf95 33d6bf95 -> 33d6bf95", + "33d6bf95 b3d6bf95 -> 33d6bf95", + "33d6bf95 42c80000 -> 00000000", + "33d6bf95 c2c80000 -> 42c80000", + "33d6bf95 461c4000 -> 00000000", + "33d6bf95 3e99999a -> 00000000", + "33d6bf95 3f333333 -> 00000000", + "b3d6bf95 00000000 -> 00000000", + "b3d6bf95 3f800000 -> bf800000", + "b3d6bf95 bf800000 -> 00000000", + "b3d6bf95 3f000000 -> bf000000", + "b3d6bf95 bf000000 -> 00000000", + "b3d6bf95 40000000 -> c0000000", + "b3d6bf95 c0000000 -> 00000000", + "b3d6bf95 40400000 -> c0400000", + "b3d6bf95 c0300000 -> 00000000", + "b3d6bf95 3dcccccd -> bdcccccd", + "b3d6bf95 bdcccccd -> 00000000", + "b3d6bf95 40f00000 -> c0f00000", + "b3d6bf95 c0f00000 -> 00000000", + "b3d6bf95 33d6bf95 -> b3d6bf95", + "b3d6bf95 b3d6bf95 -> b3d6bf95", + "b3d6bf95 42c80000 -> c2c80000", + "b3d6bf95 c2c80000 -> 00000000", + "b3d6bf95 461c4000 -> c61c4000", + "b3d6bf95 3e99999a -> be99999a", + "b3d6bf95 3f333333 -> bf333333", + "42c80000 00000000 -> 00000000", + "42c80000 3f800000 -> 42c80000", + "42c80000 bf800000 -> 42c80000", + "42c80000 3f000000 -> 42c80000", + "42c80000 bf000000 -> 42c80000", + "42c80000 40000000 -> 42c80000", + "42c80000 c0000000 -> 42c80000", + "42c80000 40400000 -> 42c60000", + "42c80000 c0300000 -> 42cb8000", + "42c80000 3dcccccd -> 42c80000", + "42c80000 bdcccccd -> 42c80000", + "42c80000 40f00000 -> 42c30000", + "42c80000 c0f00000 -> 42d20000", + "42c80000 33d6bf95 -> 42c80000", + "42c80000 b3d6bf95 -> 42c80000", + "42c80000 42c80000 -> 42c80000", + "42c80000 c2c80000 -> 42c80000", + "42c80000 461c4000 -> 00000000", + "42c80000 3e99999a -> 42c7cccd", + "42c80000 3f333333 -> 42c6cccd", + "c2c80000 00000000 -> 00000000", + "c2c80000 3f800000 -> c2c80000", + "c2c80000 bf800000 -> c2c80000", + "c2c80000 3f000000 -> c2c80000", + "c2c80000 bf000000 -> c2c80000", + "c2c80000 40000000 -> c2c80000", + "c2c80000 c0000000 -> c2c80000", + "c2c80000 40400000 -> c2cc0000", + "c2c80000 c0300000 -> c2c60000", + "c2c80000 3dcccccd -> c2c80000", + "c2c80000 bdcccccd -> c2c80000", + "c2c80000 40f00000 -> c2d20000", + "c2c80000 c0f00000 -> c2c30000", + "c2c80000 33d6bf95 -> c2c80000", + "c2c80000 b3d6bf95 -> c2c80000", + "c2c80000 42c80000 -> c2c80000", + "c2c80000 c2c80000 -> c2c80000", + "c2c80000 461c4000 -> c61c4000", + "c2c80000 3e99999a -> c2c86667", + "c2c80000 3f333333 -> c2c83333", + "461c4000 00000000 -> 00000000", + "461c4000 3f800000 -> 461c4000", + "461c4000 bf800000 -> 461c4000", + "461c4000 3f000000 -> 461c4000", + "461c4000 bf000000 -> 461c4000", + "461c4000 40000000 -> 461c4000", + "461c4000 c0000000 -> 461c4000", + "461c4000 40400000 -> 461c3c00", + "461c4000 c0300000 -> 461c4700", + "461c4000 3dcccccd -> 461c4000", + "461c4000 bdcccccd -> 461c4000", + "461c4000 40f00000 -> 461c3600", + "461c4000 c0f00000 -> 461c5400", + "461c4000 33d6bf95 -> 461c4000", + "461c4000 b3d6bf95 -> 461c4000", + "461c4000 42c80000 -> 461c4000", + "461c4000 c2c80000 -> 461c4000", + "461c4000 461c4000 -> 461c4000", + "461c4000 3e99999a -> 461c3f9a", + "461c4000 3f333333 -> 461c3e00", + "3e99999a 00000000 -> 00000000", + "3e99999a 3f800000 -> 00000000", + "3e99999a bf800000 -> 3f800000", + "3e99999a 3f000000 -> 00000000", + "3e99999a bf000000 -> 3f000000", + "3e99999a 40000000 -> 00000000", + "3e99999a c0000000 -> 40000000", + "3e99999a 40400000 -> 00000000", + "3e99999a c0300000 -> 40300000", + "3e99999a 3dcccccd -> 3e99999a", + "3e99999a bdcccccd -> 3e99999a", + "3e99999a 40f00000 -> 00000000", + "3e99999a c0f00000 -> 40f00000", + "3e99999a 33d6bf95 -> 3e99999a", + "3e99999a b3d6bf95 -> 3e99999a", + "3e99999a 42c80000 -> 00000000", + "3e99999a c2c80000 -> 42c80000", + "3e99999a 461c4000 -> 00000000", + "3e99999a 3e99999a -> 3e99999a", + "3e99999a 3f333333 -> 00000000", + "3f333333 00000000 -> 00000000", + "3f333333 3f800000 -> 00000000", + "3f333333 bf800000 -> 3f800000", + "3f333333 3f000000 -> 3f000000", + "3f333333 bf000000 -> 3f800000", + "3f333333 40000000 -> 00000000", + "3f333333 c0000000 -> 40000000", + "3f333333 40400000 -> 00000000", + "3f333333 c0300000 -> 40300000", + "3f333333 3dcccccd -> 3f333333", + "3f333333 bdcccccd -> 3f333333", + "3f333333 40f00000 -> 00000000", + "3f333333 c0f00000 -> 40f00000", + "3f333333 33d6bf95 -> 3f333333", + "3f333333 b3d6bf95 -> 3f333333", + "3f333333 42c80000 -> 00000000", + "3f333333 c2c80000 -> 42c80000", + "3f333333 461c4000 -> 00000000", + "3f333333 3e99999a -> 3f19999a", + "3f333333 3f333333 -> 3f333333", + "c191db5e c1910a47 -> c1910a47", + "c1763ca4 c01d2ad4 -> c16bc03e", + "41885972 c18d6bf1 -> 418d6bf1", + "416deb5e c0b60ea0 -> 41888af8", + "c024bb93 4066f908 -> c066f908", + "418dfdf5 404dc094 -> 4180985c", + "417332f9 c180071c -> 4180071c", + "40b6a18f 410a232b -> 00000000", + "412f0094 40f367ce -> 40f367ce", + "c026bd20 c11e7db2 -> 00000000", + "410aa753 40ec2a0d -> 40ec2a0d", + "bfe23d3d 417ac134 -> c17ac134", + "40c4f37c 406b3bd7 -> 406b3bd7", + "41811531 c18f1e41 -> 418f1e41", + "3fd96da0 40d1edc7 -> 00000000", + "c11cda71 413eba5b -> c13eba5b", + "416025ed 419aaf0e -> 00000000", + "4069ddef 4186d0b7 -> 00000000", + "c16fc16b c098fa81 -> c16577c2", + "bf502157 40de2327 -> c0de2327", + "4071c70e 416609f5 -> 00000000", + "c096aed7 c10d3ff7 -> 00000000", + "c14ee8e8 414998e9 -> c1c998e9", + "4191ce0a 419c81c0 -> 00000000", + "c16784de 3eaa5550 -> c16a354e", + "c1687991 c1891b76 -> 00000000", + "410bf61e 41427ba0 -> 00000000", + "c048b4fa 418dccf8 -> c18dccf8", + "3ffeb695 419a2a2a -> 00000000", + "40fcdbb1 c1499f69 -> 41499f69", + "c16b3a74 411bdc85 -> c19bdc85", + "409ca3c1 c0267fbc -> 40a67fbc", + "c0c480d1 c0819855 -> c0819855", + "be5a2d38 c0e9cc36 -> 00000000", + "41887c47 c139ad0b -> 41b9ad0b", + "bf5422a3 40867b1f -> c0867b1f", + "c1243b3e 3e4c2d8b -> c125e501", + "c14d7c4c 413bf014 -> c1bbf014", + "40c1bc94 41100dfb -> 00000000", + "c0a27a39 c117b8d1 -> 00000000", + "4009c11f c1876605 -> 41876605", + "c1636976 40e730e2 -> c16730e2", + "c119ca1a bf3c0789 -> c118c61f", + "c18cc7db 40834698 -> c1a4183e", + "c19b1708 c0d3d5e7 -> c153d5e7", + "3faa7b5e c000db80 -> 4000db80", + "c0bd38f4 c15da6cf -> 00000000", + "41026f89 bf0ce445 -> 41041601", + "c0932633 412f61c1 -> c12f61c1", + "40188ab1 418934bc -> 00000000", + "411f83f1 411ba0fe -> 411ba0fe", + "c113b22e 41984c9c -> c1984c9c", + "40f2561f 40a71e27 -> 40a71e27", + "413a4882 c178d331 -> 4178d331", + "418df0d6 40aeeafb -> 4183303c", + "c18e8d48 40b39d85 -> c1b39d85", + "4189fd09 41338c19 -> 41338c19", + "be37d406 4172cea0 -> c172cea0", + "414d5198 3f98dd5c -> 413f14b3", + "c12d7407 bff9389d -> c11bc362", + "40ff5229 c0013bd8 -> 41013bd8", + "c017ebb2 413a851d -> c13a851d", + "40bed92c bf8b042e -> 40d08645", + "40fd92b4 41828b42 -> 00000000", + "c10a7d7d 40f113ae -> c17113ae", + "c19a25e6 c10dd7b5 -> c18dd7b5", + "c11aa562 c15c750d -> 00000000", + "bfd95c96 c154af85 -> 00000000", + "41941ff5 414eb231 -> 414eb231", + "40b1ea29 c16aba2d -> 416aba2d", + "c19021bb 400becfe -> c19d6a9e", + "c1275f8c c116f15f -> c116f15f", + "c1807b66 416f093a -> c1ef093a", + "c190a8fd c1339d1c -> c1339d1c", + "409bbf89 c1937cf1 -> 41937cf1", + "4155d896 40fd9be5 -> 40fd9be5", + "c104201c c12f2129 -> 00000000", + "40168ec0 40b1bc64 -> 00000000", + "c1952fe2 4127ef06 -> c1a7ef06", + "c06d0c29 c0e01a76 -> 00000000", + "c1198631 41150d6f -> c1950d6f", + "c0b4c3dd 4130adce -> c130adce", + "41276e56 40b05a87 -> 40b05a87", + "c0d689fd 3fdff31e -> c0dff31e", + "419faf2d c19cdc3e -> 421cdc3e", + "c098aac2 41898012 -> c1898012", + "417b0f26 c1414542 -> 41c14542", + "415db88f 3f94160c -> 414b9e50", + "412555a9 3fa49a76 -> 41249a76", + "c18c9c03 c19d3ba6 -> 00000000", + "418d07f0 c065906a -> 418f7a42", + "bffc9a5e c02fad79 -> 00000000", + "c165dd56 414165c4 -> c1c165c4", + "41140131 c13d9c4f -> 413d9c4f", + "415baca7 418ebc1e -> 00000000", + "3ed013ab 411b6f2f -> 00000000", + "41847f26 3fc3f272 -> 4174ef0e", + "c193b039 3f8e750f -> c1975c60", + "c11207bf c1900858 -> 00000000", + "40c8ad9e bf2f6aa0 -> 40db4548", + "40e3d1df bfc8eef6 -> 40fb2ab4", + "c1863b62 be73aa7d -> c185413c", + "4183bcb1 c19daf3d -> 419daf3d", + "bfdfa8c8 c1031db8 -> 00000000", + "3f99953d c14bff5c -> 414bff5c", + "414bc214 c17b9448 -> 417b9448", + "be882fa9 407d772f -> c07d772f", + "4093fdcb bfc36443 -> 40c36443", + "40d8a447 413a0d00 -> 00000000", + "c0c9ea1e c0921e44 -> c0921e44", + "413f4fe7 c13628e7 -> 41b628e7", + "be955751 bf53f3a5 -> 00000000", + "41992dc7 c14e0eb1 -> 41ce0eb1", + "c11bbbd4 c176aef0 -> 00000000", + "c035941e 418db651 -> c18db651", + "40a6632d 404a037a -> 404a037a", + "40d85038 c19125d6 -> 419125d6", + "c10b0cbd c0a60c70 -> c0a60c70", + "c12e7f3f c0c6e84a -> c0c6e84a", + "c18f2e92 412ee7c9 -> c1aee7c9", + "be3e8a5e 40b3c166 -> c0b3c166", + "412fa3e7 c1597f06 -> 41597f06", + "411855ac c0551888 -> 411fd266", + "40c4f573 c0420525 -> 411183dc", + "418f2ce2 4170be2d -> 4170be2d", + "c0baf7e2 bf3ebae5 -> c0a6e388", + "c1935332 41526e41 -> c1d26e41", + "c1433006 bf956187 -> c13ab9e9", + "c06a2d86 c18ee0fc -> 00000000", + "412fdd77 c18079f2 -> 418079f2", + "4152857d 4142ee0a -> 4142ee0a", + "3fc05cc9 3fd16562 -> 00000000", + "c135e50d c002330f -> c122bfd3", + "407c00ac 417db527 -> 00000000", + "c0a541a6 40ca22e1 -> c0ca22e1", + "c188a3e5 4180550c -> c200550c", + "40979f4b c087faa4 -> 4107faa4", + "3f8089ac 41828d21 -> 00000000", + "c19f9459 c193effe -> c193effe", + "c136313e 4134bdeb -> c1b4bdeb", + "c0e03e8d 4129b368 -> c129b368", + "415b3005 c0c30223 -> 4192419a", + "c176c53c 418d75fa -> c18d75fa", + "c166e23f c09e2d18 -> c11e2d18", + "4194462b 41163bbb -> 41163bbb", + "c1958004 4026ea9a -> c1a6ea9a", + "40af1174 4082ec17 -> 4082ec17", + "40d8ce3b 417dfb8c -> 00000000", + "41395d9d 4168a039 -> 00000000", + "c05f2eab c0bb618e -> 00000000", + "c11f9c90 c0ac8be7 -> c0ac8be7", + "c0a82054 419bcd53 -> c19bcd53", + "c128d7ef 4183cd70 -> c183cd70", + "c1955f18 41885055 -> c2085055", + "411d2abd 410560b9 -> 410560b9", + "c11fdebd 409da04f -> c16c7076", + "c1866fe8 c193f6db -> 00000000", + "c0373b84 40ce039f -> c0ce039f", + "4020db05 c16d32cc -> 416d32cc", + "410705d2 bfa7a911 -> 4112b3ef", + "409d1cf9 419f3703 -> 00000000", + "4129a16b c0311597 -> 41311597", + "c191dd70 c17f9741 -> c17f9741", + "c14cc63f 4130da72 -> c1b0da72", + "412563fa 41344d21 -> 00000000", + "4035f7a0 c0a90263 -> 40a90263", + "4160d7b9 40575b86 -> 41575b86", + "41883839 c19ebe65 -> 419ebe65", + "c131bc28 c181c70b -> 00000000", + "c129eb3c 415a17d6 -> c15a17d6", + "c1205e87 c125f1e3 -> 00000000", + "c147aff3 c1108057 -> c1108057", + "411dfb49 bf1fbf19 -> 411fbf19", + "c185dc8f c10f114f -> c10f114f", + "402583a4 c068194f -> 4068194f", + "c0c014a8 4184fd79 -> c184fd79", + "4052f61e 4001379a -> 4001379a", + "407492e7 c0a02d6f -> 40a02d6f", + "c1519fd7 c180fb63 -> 00000000", + "bff53518 40054401 -> c0054401", + "4183410a 411e6677 -> 411e6677", + "40147a3a c14dad80 -> 414dad80", + "4023d4e3 c0001c27 -> 40801c27", + "41904bfd 418a27b8 -> 418a27b8", + "c107ee5c c15ce018 -> 00000000", + "416754c1 40242cac -> 414d37d7", + "c181b305 41814ced -> c2014ced", + "3f9d62e4 c0e67e17 -> 40e67e17", + "4199b286 3fa418aa -> 418f9595", + "c0864360 c13bcfe0 -> 00000000", + "411290b2 419f5c40 -> 00000000", + "41970531 c12b54cc -> 41ab54cc", + "3fe83120 c04e3e65 -> 404e3e65", + "40db9ca5 c037680c -> 41098e09", + "412a6838 c0f14350 -> 41714350", + "41972e48 411065b0 -> 419065b0", + "c1708cf6 410f275f -> c18f275f", + "410ef76a 412aa951 -> 00000000", + "41811a8c 3facff3b -> 416ddef1", + "418b2433 c165a162 -> 41e5a162", + "c108571d 415ba4b4 -> c15ba4b4", + "c19c0024 419afddb -> c21afddb", + "c0cb3889 41200103 -> c1200103", + "c16b1101 4182c798 -> c182c798", + "c0e3c760 4120956b -> c120956b", + "c180086c c07d462e -> c17d462e", + "c1880242 bfabddf8 -> c180e67a", + "40643134 c134c5a9 -> 4134c5a9", + "c12cf1cc 40c7b3b2 -> c147b3b2", + "be2ff176 c08fda07 -> 00000000", + "bf9d65fc c10fa9f1 -> 00000000", + "c1137a25 4185582a -> c185582a", + "c185288d 4146330d -> c1c6330d", + "414edb5a 412b0fa3 -> 412b0fa3", + "4113cd18 c11b71e1 -> 411b71e1", + "40942c1d 40f3c26b -> 00000000", + "c0cc3744 c19afdfb -> 00000000", + "c18ac031 40940159 -> c1940159", + "409d6e8c c1101005 -> 41101005", + "c0985d02 4144f837 -> c144f837", + "c11101a4 40ffd981 -> c17fd981", + "c1491192 c1143697 -> c1143697", + "c0adc707 4175fb15 -> c175fb15", + "4065f203 41862d84 -> 00000000", + "410aa679 bfe0a872 -> 410c6947", + "c0a4596f 416c2935 -> c16c2935", + "c18700e8 c1504df0 -> c1504df0", + "c10b8e47 417bb46b -> c17bb46b", + "40c0afa1 4182aa83 -> 00000000", + "41975a7b c1036205 -> 41c51308", + "c034352b c1104879 -> 00000000", + "4170fb06 419d76f9 -> 00000000", + "41975660 c124b3c1 -> 41a4b3c1", + "40ba84c7 4107f304 -> 00000000", + "c19ef99a bf1ba3d1 -> c19ba3d1", + "c181a2fa c188c96f -> 00000000", + "40aeb3d8 419d85f1 -> 00000000", + "c19c7a81 3f3b6874 -> c19e2022", + "410e052f 40c2745d -> 40c2745d", + "4154d7f5 c04a1b73 -> 417ca250", + "3fa067a4 415891ee -> 00000000", + "4084b983 c198385f -> 4198385f", + "4135595b c01ed724 -> 41468ced", + "4137be0c c0dcea8b -> 415cea8b", + "c1898de7 4187f8b1 -> c207f8b1", + "c0cdcca9 417d94ef -> c17d94ef", + "40bcb47b 40f0492a -> 00000000", + "40b5364b 40254bea -> 40a54bea", + "40a32c65 418f58c9 -> 00000000", + "4118095b c0d2c9df -> 4152c9df", + "c1428675 c157b986 -> 00000000", + "c1443c39 410bba7a -> c18bba7a", + "410b83d9 c0ae9fe7 -> 412e9fe7", + "c0eab1a8 4179557e -> c179557e", + "418d6434 c11109c2 -> 419109c2", + "411299bc c1448d7f -> 41448d7f", + "c1944db0 c115b62e -> c115b62e", + "bf99fc9a c18d9a08 -> 00000000", + "418d28fd c0eb36a3 -> 41b068fa", + "c03695b3 41157b4b -> c1157b4b", + "c145fa72 419517f1 -> c19517f1", + "c17a4d5c 418d9d90 -> c18d9d90", + "c13bf10c 41315042 -> c1b15042", + "411efc95 416619b4 -> 00000000", + "412482a3 4130647c -> 00000000", + "c10c18d8 c02a4761 -> c0ff6b12", + "419fd449 c12b0a75 -> 41ab0a75", + "408aa620 c15e48dd -> 415e48dd", + "40806bab c12e4087 -> 412e4087", + "4188fa50 c15eb23c -> 41deb23c", + "419738fc 3f90d97d -> 4190d97d", + "c106b477 40b5b3d0 -> c135b3d0", + "bec5f75b 40b8acb3 -> c0b8acb3", + "41905678 3eea2c91 -> 418eb328", + "418aaad6 409ba71f -> 41697aae", + "c13fd3ed c0d67604 -> c0d67604", + "414a6282 c19abefe -> 419abefe", + "40fc04a3 3fa6219f -> 40f9326e", + "41802a53 c19e77e1 -> 419e77e1", + "c09af9a3 c13875b9 -> 00000000", + "c189d448 412a4e61 -> c1aa4e61", + "c025383a c143ad8d -> 00000000", + "c1503fad c0cac86e -> c14ac86e", + "419b03ca bf8ccc6e -> 419e65fc", + "c15de551 bf8a80fe -> c14fc17d", + "bfbd0acf bf86eb9b -> bf86eb9b", + "c162af12 c19e920a -> 00000000", + "c0f5cb05 419aee7c -> c19aee7c", + "4187f889 bfd31e67 -> 419124e7", + "41935a11 bf4dcddc -> 4193ebf6", + "c16b219f 41668b0c -> c1e68b0c", + "3fbfde6e c11f159d -> 411f159d", + "4147728c 3f9899bf -> 413ec02f", + "418fac09 403dc39e -> 418e52b6", + "41859a4c c1954644 -> 41954644", + "c18716af c12f4711 -> c12f4711", + "4190762e 4189d2e0 -> 4189d2e0", + "41439bde c15630ec -> 415630ec", + "41315711 c073eb45 -> 4136f074", + "41176c60 c17e680f -> 417e680f", + "3ea8c2a7 41093431 -> 00000000", + "bfd1d198 c0a35a5e -> 00000000", + "c0ab87ec 415fe420 -> c15fe420", + "419da8f8 c1883b0a -> 42083b0a", + "c0db4475 418f2047 -> c18f2047", + "c04267d3 40231ad6 -> c0a31ad6", + "4195ad2b 4194e47d -> 4194e47d", + "c191575d c042000c -> c172800f", + "40c68cae 3fd915d6 -> 40a2d060", + "c028d26a bc974119 -> c027cc38", + "3fb198a2 c15c059b -> 415c059b", + "bd1332f5 415afc45 -> c15afc45", + "c180ef6d bf2824e2 -> c17c3753", + "408922a2 c19c4ddf -> 419c4ddf", + "41383f9b 40fafa87 -> 40fafa87", + "c195f0c6 c19eb116 -> 00000000", + "c118ffc0 3f2cdc91 -> c1220ec8", + "c01afc27 c1685916 -> 00000000", + "40caae4d c181dc17 -> 4181dc17", + "4017e446 c02d92d7 -> 402d92d7", + "41852eaf 40f83a29 -> 41783a29", + "c13ec744 c18667b5 -> 00000000", + "413491e0 3fe67e07 -> 412cde85", + "40bb90d5 418af558 -> 00000000", + "c1689c80 3fe9ce71 -> c169ce71", + "40ff846b c122176f -> 4122176f", + "40c7f577 409bc2ab -> 409bc2ab", + "c1515324 41257b10 -> c1a57b10", + "41747c1f c0fa93f6 -> 417a93f6", + "416827a6 c0d0e7bf -> 419cadcf", + "c195ee58 c13284ab -> c13284ab", + "414511bb c137e400 -> 41b7e400", + "416d1c59 c0faa1c5 -> 417aa1c5", + "417882ca c01c4961 -> 4188c035", + "41356d6d 4183844d -> 00000000", + "4196f024 40bf701f -> 418f9417", + "4162ad2a 409c06c4 -> 411c06c4", + "411e3081 c126af82 -> 4126af82", + "c19a73f5 4163f94d -> c1e3f94d", + "c1246181 c06c0ba3 -> c0ec0ba3", + "40fe354b c13e0117 -> 413e0117", + "4135140f c156babe -> 4156babe", + "4186c114 c0a71816 -> 41a71816", + "409e890a 4187b50e -> 00000000", + "c0d5457b 4194b568 -> c194b568", + "41170c52 419fa3a3 -> 00000000", + "c12a2e97 404fa5d2 -> c14fa5d2", + "4190f04f 409a9c0f -> 4167ea16", + "c18fc772 be4cdfd8 -> c18e73a4", + "c15c3b0f c170b736 -> 00000000", + "c04ee546 c13adbce -> 00000000", + "c19ce9a6 415667c0 -> c1d667c0", + "c1065476 41290a44 -> c1290a44", + "c156d625 414bb71f -> c1cbb71f", + "410e6645 4112fcf3 -> 00000000", + "c1523b44 c19e7417 -> 00000000", + "415d81c9 41867243 -> 00000000", + "c14f2f84 c14f248d -> c14f248d", + "403a4264 40704139 -> 00000000", + "c00d7374 40200756 -> c0200756", + "41356671 bea6ca95 -> 41366d93", + "3eea66e5 c0937056 -> 40937056", + "4175464d bfb58522 -> 4179970f", + "4160a35f c1603bf8 -> 41e03bf8", + "c021e8ef c14711a6 -> 00000000", + "c11d1cab c15b9c8f -> 00000000", + "4144243e 4059d3e3 -> 41235eea", + "c10fc1aa 40aaba1f -> c12aba1f", + "c127e61a c19fc4ef -> 00000000", + "c03dcc71 4185c91f -> c185c91f", + "c1044ace 416d331e -> c16d331e", + "41522ced 41952076 -> 00000000", + "41947d9f 410594ae -> 418594ae", + "4146a208 c0a69f7f -> 4179ef3e", + "40bc630f c0941f34 -> 41141f34", + "c10838e6 c0e8b0b2 -> c0e8b0b2", + "c14771b9 c1458228 -> c1458228", + "411898ae 4145f63f -> 00000000", + "4089d4cf 416478e9 -> 00000000", + "419db282 3fa6e868 -> 419c79e2", + "c162070d c1386c7e -> c1386c7e", + "411c5bc7 c0da11d9 -> 415a11d9", + "40ea19f6 419382c6 -> 00000000", + "419b128e c160fb5e -> 41e0fb5e", + "beb21d38 c1287ab3 -> 00000000", + "c152831e 41615105 -> c1615105", + "c0853ca6 c0faef14 -> 00000000", + "c19b3951 c12519c0 -> c12519c0", + "c1750db2 c0e79656 -> c1679656", + "bfb4a57a c17ef023 -> 00000000", + "c1717508 c0bdb3b0 -> c13db3b0", + "4159a0ca 41117351 -> 41117351", + "c01a8981 c15521d7 -> 00000000", + "40340b19 3fb22857 -> 40322857", + "3f899cf0 c160b1d9 -> 4160b1d9", + "41069c51 40ffb678 -> 40ffb678", + "c19a4d63 c06306d0 -> c18de442", + "413da09d c12d3f28 -> 41ad3f28", + "c10770d4 c17bbb77 -> 00000000", + "40c2ceac 419f69d8 -> 00000000", + "40458f32 3f15c86e -> 403b3a8a", + "c10511f5 40967ded -> c1167ded", + "c04e8328 40f5f771 -> c0f5f771", + "4101ed9f 40d5665b -> 40d5665b", + "408f7386 c15f88d4 -> 415f88d4", + "412f2877 c153aa1e -> 4153aa1e", + "c0b4bc43 c196584c -> 00000000", + "c16a22c6 c19fa15c -> 00000000", + "404a9424 c18373f0 -> 418373f0", + "4148fa35 417246a3 -> 00000000", + "4179ac43 c11ae6d0 -> 419ae6d0", + "c1517cac 414edddc -> c1cedddc", + "c11b0f4c 4167127f -> c167127f", + "c19ed1f9 c17d2796 -> c17d2796", + "c186d139 4174546f -> c1f4546f", + "40646c47 c0b8e650 -> 40b8e650", + "417a065e 409830a7 -> 416448fa", + "41384209 c046a80d -> 4146a80d", + "41265f61 407da4d4 -> 40fda4d4", + "4141effd c099d6e2 -> 4166c253", + "c151531b c120f468 -> c120f468", + "4182267f c124c6c9 -> 41a4c6c9", + "c11b7b72 3fe9c174 -> c12f5117", + "c1848d42 4073ce24 -> c19860d6", + "c1997cc3 c0eb389e -> c16b389e", + "41268c44 3f23a24b -> 4123a24b", + "4071aaee c1505af6 -> 41505af6", + "c192a4d7 3d52d2c4 -> c192fff6", + "4111cab8 4018c560 -> 40e52810", + "c19ba091 c16a66ce -> c16a66ce", + "c1888c00 41417b44 -> c1c17b44", + "414c8cea c13e566a -> 41be566a", + "4131e766 c156e157 -> 4156e157", + "c00531e2 40523ffb -> c0523ffb", + "c13b1538 409837fd -> c16453fc", + "415cc8f6 c1776cc9 -> 41776cc9", + "40dc1123 c17a12ff -> 417a12ff", + "c109043c 40bea6bf -> c13ea6bf", + "c108ae82 c1957745 -> 00000000", + "be90c0b2 418d7d51 -> c18d7d51", + "4184e40b 410795a8 -> 410795a8", + "41839b57 41726058 -> 41726058", + "c12c7d88 c14657a0 -> 00000000", + "c1298e5c c02ab2a8 -> c10005fe", + "40d0cad6 bf16bf31 -> 40e21eca", + "c148aa55 c181c8fe -> 00000000", + "c13de976 40949e00 -> c15eed00", + "416ca666 41890f59 -> 00000000", + "4129edb5 415a8bbf -> 00000000", + "4187eb0b 41388a7d -> 41388a7d", + "c0df0a2d c0121d47 -> c0db2bea", + "40a5b8cf c03dcace -> 40bdcace", + "c101b869 c194f796 -> 00000000", + "40ae815b 41021a40 -> 00000000", + "41440c95 4131c20f -> 4131c20f", + "bec3a06a 40aced64 -> c0aced64", + "41400e57 40f48aa7 -> 40f48aa7", + "c0712282 c00a6a30 -> c00a6a30", + "41776589 4077ef34 -> 4139f367", + "befa1779 c18b13f8 -> 00000000", + "40ba4b18 c092881d -> 4112881d", + "413a8359 40f99392 -> 40f99392", + "412c219d 414f96da -> 00000000", + "c02cd55b 40bcb5df -> c0bcb5df", + "c1056cd3 c10bd9fe -> 00000000", + "3e84ebb5 c0e83541 -> 40e83541", + "c0478826 4013ddcd -> c093ddcd", + "3fc5894d bf1f9ffd -> 3fef6ffc", + "40247dad 411d3876 -> 00000000", + "c100e0f3 41281820 -> c1281820", + "c156ef9f 41085af5 -> c1885af5", + "411ec69f c19e65b8 -> 419e65b8", + "c0b3b626 419e0ef8 -> c19e0ef8", + "c1623a8a 4180fdfe -> c180fdfe", + "414e35cc c1151ae0 -> 41951ae0", + "c15c30db 40a49845 -> c176e468", + "c1026723 c0d5eba8 -> c0d5eba8", + "c109245b 4084f8c1 -> c1477522", + "3fe1f9a8 416341a7 -> 00000000", + "bf8df906 c0c5fb56 -> 00000000", + "bf848319 40ba507c -> c0ba507c", + "40ab21c5 4105092d -> 00000000", + "4172aa85 4160d1a8 -> 4160d1a8", + "4187e58f 405bdf08 -> 415bdf08", + "c11bf19d c14fb935 -> 00000000", + "c123278a c16e7192 -> 00000000", + "c16e9de2 40adb210 -> c182458c", + "c0ee5316 415dd14e -> c15dd14e", + "412994c7 40d356ed -> 40d356ed", + "40a3a84d 3ea862f0 -> 409ddcc1", + "c19572be 40cbd876 -> c198e258", + "4198cc75 c1015447 -> 41c1fe6a", + "4036a762 41354dec -> 00000000", + "417eb6b7 413f61aa -> 413f61aa", + "416ed729 c16966f8 -> 41e966f8", + "41197d77 40270edb -> 40fa9648", + "41662bb6 c1726b89 -> 41726b89", + "c1833b02 418ec0cb -> c18ec0cb", + "c0987ab1 c0a18d19 -> 00000000", + "4141ceb4 3ee5a9ab -> 4141c728", + "4018c78c c1173f2e -> 41173f2e", + "4176a2d1 418073bc -> 00000000", + "bfd4a68a 41934b52 -> c1934b52", + "c18d3a2d 40ed6ebb -> c1b2130c", + "c08e4ff8 4173f4a4 -> c173f4a4", + "41591152 c05f2614 -> 415f2614", + "4156ed3c 3f541648 -> 41541648", + "4111574b c15babf0 -> 415babf0", + "c166f327 41875cea -> c1875cea", + "c18b3fd4 c0bfd243 -> c13fd243", + "4187d322 c188bc77 -> 4188bc77", + "c1440eb1 c0728fd4 -> c135ebdf", + "4129900e 409ae37d -> 411ae37d", + "3f94faca c11c47c8 -> 411c47c8", + "c0a540c0 c14eda0c -> 00000000", + "400b3b73 419c14f7 -> 00000000", + "c18dc50c 41922c83 -> c1922c83", + "c1286c9f c0533c6e -> c11e6d52", + "c181ef85 40c10928 -> c190c6de", + "c17763e8 3fed5634 -> c185807d", + "4188ed85 c151a5ca -> 41d1a5ca", + "c18e6c18 c14c537e -> c14c537e", + "c19eeb5c 40e4ddf2 -> c1aba676", + "40ef2b5d c15123af -> 415123af", + "c13d41ae 41221d39 -> c1a21d39", + "40ca8077 419189df -> 00000000", + "c0a4d020 418154b4 -> c18154b4", + "418da0dc 4180929c -> 4180929c", + "4155d907 c189470a -> 4189470a", + "40f20dd7 4189ac63 -> 00000000", + "bf854efd 413ef34d -> c13ef34d", + "c157dfcd 414e50e1 -> c1ce50e1", + "c17363f9 404ce959 -> c18011d8", + "c1799369 412ec68c -> c1aec68c", + "c0be401a c0aa5e70 -> c0aa5e70", + "4140084c 41818eb1 -> 00000000", + "4059714d c0855d36 -> 40855d36", + "41930471 3f08cce7 -> 419159b5", + "c1696170 4154ec87 -> c1d4ec87", + "c18f474b c1217c31 -> c1217c31", + "41968f36 417c27e9 -> 417c27e9", + "c0bade5a 41664e83 -> c1664e83", + "3fd2df99 4023981d -> 00000000", + "c13dd97d 419ea003 -> c19ea003", + "c1881827 4182d3cc -> c202d3cc", + "40837a7f 4015cb2b -> 4015cb2b", + "c19575ae c06f0060 -> c195603c", + "3f6cc7ce 4003feb7 -> 00000000", + "c187528f 412a959e -> c1aa959e", + "41271eee 3e89cae2 -> 4123a0ec", + "40ef674b 40a4e0a8 -> 40a4e0a8", + "41114386 c1961e28 -> 41961e28", + "4142d5e7 c04ecbbf -> 414ecbbf", + "c190c2ee 4160bc30 -> c1e0bc30", + "3d874da7 c196c158 -> 4196c158", + "c1603823 c1727b8f -> 00000000", + "c0ec6279 4182943d -> c182943d", + "404ed3c9 40925283 -> 00000000", + "c085d5d5 c17eec3d -> 00000000", + "417c821f 40463334 -> 4177c001", + "c0257b96 41145571 -> c1145571", + "c19223cf c0d7037d -> c157037d", + "c1806c98 4016488b -> c1837f7a", + "40e6e174 417f85c7 -> 00000000", + "40bbf177 414821ea -> 00000000", + "41363f04 c171be65 -> 4171be65", + "41597845 415467d5 -> 415467d5", + "c1612b99 c11dc009 -> c11dc009", + "40a569cf 419c2f3a -> 00000000", + "c03b785c c193d329 -> 00000000", + "4179f2d2 409feb3f -> 416fe0de", + "c16cfa2a c172e8a6 -> 00000000", + "401980ef c19999ee -> 419999ee", + "c13649ee bd44dde2 -> c136416a", + "41828df6 412fca5d -> 412fca5d", + "c117276a 414b644f -> c14b644f", + "41746afb 40b144de -> 413144de", + "bef009c2 c00dc9ed -> 00000000", + "41951c60 bedc51d5 -> 41977842", + "4047f2ef c0fa18a5 -> 40fa18a5", + "3f40c715 405bfd24 -> 00000000", + "c17201c5 40c2f274 -> c19235d7", + "c160a1fb c0edb972 -> c0edb972", + "415f8aae 4181513b -> 00000000", + "c18e0f2c c15874d2 -> c15874d2", + "c0dd4243 bbbf54cb -> c0dd3a0b", + "c154e4ba c0e75b5b -> c0e75b5b", + "411a91d1 c05627d9 -> 41209de3", + "414c3f4e 418f7050 -> 00000000", + "413922c4 c080c6c6 -> 41412a29", + "4004fec5 c144aa7e -> 4144aa7e", + "c0d15c1c 4054333b -> c0d4333b", + "417d4afb c08fdd1d -> 418fdd1d", + "bfb50639 bf78d824 -> bf78d824", + "c116e27a c128e29c -> 00000000", + "c0e5099f 41845631 -> c1845631", + "c12e8f4c c150f0fa -> 00000000", + "4194bfe7 c0becb52 -> 41becb52", + "c101a949 c1774cb4 -> 00000000", + "bfde77f4 c0bd49cd -> 00000000", + "4081ff6a 41504148 -> 00000000", + "c0f9a02d 40a55890 -> c1255890", + "c186112b c185ded3 -> c185ded3", + "40bdf925 409c0fce -> 409c0fce", + "4158b1dd c0ceed9e -> 419b3236", + "414e29a1 40f512d8 -> 40f512d8", + "c0deeec0 c1878c8d -> 00000000", + "4013477c c0c0e878 -> 40c0e878", + "c198a013 c0b67160 -> c188d508", + "411599b2 404509cb -> 4113c758", + "41361fbf 3f823d82 -> 41331493", + "c16ebe99 41728f39 -> c1728f39", + "419c8e79 c0cf47c0 -> 41cf47c0", + "c1424fe2 418ed54a -> c18ed54a", + "c16a8ecd 412ce471 -> c1ace471", + "41027481 4149b1c6 -> 00000000", + "4180ae2a c15d99eb -> 41dd99eb", + "4141a93a 412acfde -> 412acfde", + "c0c737bc 417ebd3c -> c17ebd3c", + "c126fc6c c19c6c33 -> 00000000", + "40461914 c19e83ca -> 419e83ca", + "c09b8545 c178ea03 -> 00000000", + "c0f838b8 c175cefa -> 00000000", + "4137c35e c0d1f95e -> 4151f95e" + ] + }, + { + "function": "cycles_pingpong", + "node": "ShaderNodeMath PINGPONG", + "cases": [ + "00000000 00000000 -> 00000000", + "00000000 3f800000 -> 00000000", + "00000000 bf800000 -> 00000000", + "00000000 3f000000 -> 00000000", + "00000000 bf000000 -> 00000000", + "00000000 40000000 -> 00000000", + "00000000 c0000000 -> 00000000", + "00000000 40400000 -> 00000000", + "00000000 c0300000 -> 00000000", + "00000000 3dcccccd -> 00000000", + "00000000 bdcccccd -> 00000000", + "00000000 40f00000 -> 00000000", + "00000000 c0f00000 -> 00000000", + "00000000 33d6bf95 -> 00000000", + "00000000 b3d6bf95 -> 00000000", + "00000000 42c80000 -> 00000000", + "00000000 c2c80000 -> 00000000", + "00000000 461c4000 -> 00000000", + "00000000 3e99999a -> 00000000", + "00000000 3f333333 -> 00000000", + "3f800000 00000000 -> 00000000", + "3f800000 3f800000 -> 3f800000", + "3f800000 bf800000 -> 3f800000", + "3f800000 3f000000 -> 00000000", + "3f800000 bf000000 -> 00000000", + "3f800000 40000000 -> 3f800000", + "3f800000 c0000000 -> 3f800000", + "3f800000 40400000 -> 3f7ffffc", + "3f800000 c0300000 -> 3f800000", + "3f800000 3dcccccd -> 00000000", + "3f800000 bdcccccd -> 00000000", + "3f800000 40f00000 -> 3f800000", + "3f800000 c0f00000 -> 3f800000", + "3f800000 33d6bf95 -> 00000000", + "3f800000 b3d6bf95 -> 00000000", + "3f800000 42c80000 -> 3f800000", + "3f800000 c2c80000 -> 3f800000", + "3f800000 461c4000 -> 3f800000", + "3f800000 3e99999a -> 3e4ccccf", + "3f800000 3f333333 -> 3ecccccc", + "bf800000 00000000 -> 00000000", + "bf800000 3f800000 -> 3f800000", + "bf800000 bf800000 -> 3f800000", + "bf800000 3f000000 -> 00000000", + "bf800000 bf000000 -> 00000000", + "bf800000 40000000 -> 3f800000", + "bf800000 c0000000 -> 3f800000", + "bf800000 40400000 -> 3f800001", + "bf800000 c0300000 -> 3f800000", + "bf800000 3dcccccd -> 00000000", + "bf800000 bdcccccd -> 00000000", + "bf800000 40f00000 -> 3f800000", + "bf800000 c0f00000 -> 3f800000", + "bf800000 33d6bf95 -> 00000000", + "bf800000 b3d6bf95 -> 00000000", + "bf800000 42c80000 -> 3f800000", + "bf800000 c2c80000 -> 3f800000", + "bf800000 461c4000 -> 3f800000", + "bf800000 3e99999a -> 3e4cccd4", + "bf800000 3f333333 -> 3eccccca", + "3f000000 00000000 -> 00000000", + "3f000000 3f800000 -> 3f000000", + "3f000000 bf800000 -> 3f000000", + "3f000000 3f000000 -> 3f000000", + "3f000000 bf000000 -> 3f000000", + "3f000000 40000000 -> 3f000000", + "3f000000 c0000000 -> 3f000000", + "3f000000 40400000 -> 3f000004", + "3f000000 c0300000 -> 3efffff8", + "3f000000 3dcccccd -> 3dcccccd", + "3f000000 bdcccccd -> 3dcccccd", + "3f000000 40f00000 -> 3efffff0", + "3f000000 c0f00000 -> 3f000008", + "3f000000 33d6bf95 -> 00000000", + "3f000000 b3d6bf95 -> 00000000", + "3f000000 42c80000 -> 3f000000", + "3f000000 c2c80000 -> 3f000000", + "3f000000 461c4000 -> 3f004000", + "3f000000 3e99999a -> 3dccccce", + "3f000000 3f333333 -> 3f000001", + "bf000000 00000000 -> 00000000", + "bf000000 3f800000 -> 3f000000", + "bf000000 bf800000 -> 3f000000", + "bf000000 3f000000 -> 3f000000", + "bf000000 bf000000 -> 3f000000", + "bf000000 40000000 -> 3f000000", + "bf000000 c0000000 -> 3f000000", + "bf000000 40400000 -> 3f000000", + "bf000000 c0300000 -> 3f000004", + "bf000000 3dcccccd -> 3dcccccd", + "bf000000 bdcccccd -> 3dcccccd", + "bf000000 40f00000 -> 3f000008", + "bf000000 c0f00000 -> 3efffff0", + "bf000000 33d6bf95 -> 00000000", + "bf000000 b3d6bf95 -> 00000000", + "bf000000 42c80000 -> 3f000000", + "bf000000 c2c80000 -> 3f000000", + "bf000000 461c4000 -> 3eff8000", + "bf000000 3e99999a -> 3dccccd4", + "bf000000 3f333333 -> 3f000002", + "40000000 00000000 -> 00000000", + "40000000 3f800000 -> 00000000", + "40000000 bf800000 -> 00000000", + "40000000 3f000000 -> 00000000", + "40000000 bf000000 -> 00000000", + "40000000 40000000 -> 40000000", + "40000000 c0000000 -> 40000000", + "40000000 40400000 -> 40000000", + "40000000 c0300000 -> 40000000", + "40000000 3dcccccd -> 00000000", + "40000000 bdcccccd -> 34500000", + "40000000 40f00000 -> 40000000", + "40000000 c0f00000 -> 40000000", + "40000000 33d6bf95 -> 33d6bf95", + "40000000 b3d6bf95 -> 33d6bf95", + "40000000 42c80000 -> 40000000", + "40000000 c2c80000 -> 40000000", + "40000000 461c4000 -> 40000000", + "40000000 3e99999a -> 3e4cccca", + "40000000 3f333333 -> 3f199999", + "c0000000 00000000 -> 00000000", + "c0000000 3f800000 -> 00000000", + "c0000000 bf800000 -> 00000000", + "c0000000 3f000000 -> 00000000", + "c0000000 bf000000 -> 00000000", + "c0000000 40000000 -> 40000000", + "c0000000 c0000000 -> 40000000", + "c0000000 40400000 -> 3fffffff", + "c0000000 c0300000 -> 40000000", + "c0000000 3dcccccd -> 34500000", + "c0000000 bdcccccd -> 00000000", + "c0000000 40f00000 -> 40000000", + "c0000000 c0f00000 -> 40000000", + "c0000000 33d6bf95 -> 33d6bf95", + "c0000000 b3d6bf95 -> 33d6bf95", + "c0000000 42c80000 -> 40000000", + "c0000000 c2c80000 -> 40000000", + "c0000000 461c4000 -> 40000000", + "c0000000 3e99999a -> 3e4cccc0", + "c0000000 3f333333 -> 3f19999a", + "40400000 00000000 -> 00000000", + "40400000 3f800000 -> 3f800000", + "40400000 bf800000 -> 3f800000", + "40400000 3f000000 -> 00000000", + "40400000 bf000000 -> 00000000", + "40400000 40000000 -> 3f800000", + "40400000 c0000000 -> 3f800000", + "40400000 40400000 -> 40400000", + "40400000 c0300000 -> 40200000", + "40400000 3dcccccd -> 00000000", + "40400000 bdcccccd -> 34500000", + "40400000 40f00000 -> 40400000", + "40400000 c0f00000 -> 40400000", + "40400000 33d6bf95 -> 33d6bf95", + "40400000 b3d6bf95 -> 33d6bf95", + "40400000 42c80000 -> 40400000", + "40400000 c2c80000 -> 40400000", + "40400000 461c4000 -> 403ff000", + "40400000 3e99999a -> 00000000", + "40400000 3f333333 -> 3e4cccd0", + "c0300000 00000000 -> 00000000", + "c0300000 3f800000 -> 3f400000", + "c0300000 bf800000 -> 3f400000", + "c0300000 3f000000 -> 3e800000", + "c0300000 bf000000 -> 3e800000", + "c0300000 40000000 -> 3fa00000", + "c0300000 c0000000 -> 3fa00000", + "c0300000 40400000 -> 40300000", + "c0300000 c0300000 -> 40300000", + "c0300000 3dcccccd -> 3d4ccd02", + "c0300000 bdcccccd -> 3d4ccccd", + "c0300000 40f00000 -> 40300000", + "c0300000 c0f00000 -> 40300000", + "c0300000 33d6bf95 -> 33d6bf95", + "c0300000 b3d6bf95 -> 33d6bf95", + "c0300000 42c80000 -> 40300000", + "c0300000 c2c80000 -> 402fffe0", + "c0300000 461c4000 -> 40300000", + "c0300000 3e99999a -> 3e800006", + "c0300000 3f333333 -> 3d4ccca0", + "3dcccccd 00000000 -> 00000000", + "3dcccccd 3f800000 -> 3dccccd0", + "3dcccccd bf800000 -> 3dccccd0", + "3dcccccd 3f000000 -> 3dccccd0", + "3dcccccd bf000000 -> 3dccccd0", + "3dcccccd 40000000 -> 3dccccc0", + "3dcccccd c0000000 -> 3dccccc0", + "3dcccccd 40400000 -> 3dccccc0", + "3dcccccd c0300000 -> 3dccccc0", + "3dcccccd 3dcccccd -> 3dcccccd", + "3dcccccd bdcccccd -> 3dcccccd", + "3dcccccd 40f00000 -> 3dccccc0", + "3dcccccd c0f00000 -> 3dccccc0", + "3dcccccd 33d6bf95 -> 31d6bf90", + "3dcccccd b3d6bf95 -> 00000000", + "3dcccccd 42c80000 -> 3dccc800", + "3dcccccd c2c80000 -> 3dccc800", + "3dcccccd 461c4000 -> 3dce0000", + "3dcccccd 3e99999a -> 3dcccccc", + "3dcccccd 3f333333 -> 3dccccd0", + "bdcccccd 00000000 -> 00000000", + "bdcccccd 3f800000 -> 3dccccd0", + "bdcccccd bf800000 -> 3dccccd0", + "bdcccccd 3f000000 -> 3dccccd0", + "bdcccccd bf000000 -> 3dccccd0", + "bdcccccd 40000000 -> 3dccccc0", + "bdcccccd c0000000 -> 3dccccc0", + "bdcccccd 40400000 -> 3dccccc0", + "bdcccccd c0300000 -> 3dccccc0", + "bdcccccd 3dcccccd -> 3dcccccd", + "bdcccccd bdcccccd -> 3dcccccd", + "bdcccccd 40f00000 -> 3dccccc0", + "bdcccccd c0f00000 -> 3dccccc0", + "bdcccccd 33d6bf95 -> 00000000", + "bdcccccd b3d6bf95 -> 31d6bf90", + "bdcccccd 42c80000 -> 3dccc800", + "bdcccccd c2c80000 -> 3dccc800", + "bdcccccd 461c4000 -> 3dce0000", + "bdcccccd 3e99999a -> 3dccccca", + "bdcccccd 3f333333 -> 3dccccd0", + "40f00000 00000000 -> 00000000", + "40f00000 3f800000 -> 3f000000", + "40f00000 bf800000 -> 3f000000", + "40f00000 3f000000 -> 3f000000", + "40f00000 bf000000 -> 3f000000", + "40f00000 40000000 -> 3f000000", + "40f00000 c0000000 -> 3f000000", + "40f00000 40400000 -> 3fc00000", + "40f00000 c0300000 -> 40000000", + "40f00000 3dcccccd -> 3dcccccd", + "40f00000 bdcccccd -> 3dcccccd", + "40f00000 40f00000 -> 40f00000", + "40f00000 c0f00000 -> 40f00000", + "40f00000 33d6bf95 -> 33d6bf95", + "40f00000 b3d6bf95 -> 33d6bf95", + "40f00000 42c80000 -> 40f00010", + "40f00000 c2c80000 -> 40f00010", + "40f00000 461c4000 -> 40f00800", + "40f00000 3e99999a -> 3e999986", + "40f00000 3f333333 -> 3f000001", + "c0f00000 00000000 -> 00000000", + "c0f00000 3f800000 -> 3f000000", + "c0f00000 bf800000 -> 3f000000", + "c0f00000 3f000000 -> 3f000000", + "c0f00000 bf000000 -> 3f000000", + "c0f00000 40000000 -> 3f000000", + "c0f00000 c0000000 -> 3f000000", + "c0f00000 40400000 -> 3fc00000", + "c0f00000 c0300000 -> 40000000", + "c0f00000 3dcccccd -> 3dcccccd", + "c0f00000 bdcccccd -> 3dcccccd", + "c0f00000 40f00000 -> 40f00000", + "c0f00000 c0f00000 -> 40f00000", + "c0f00000 33d6bf95 -> 33d6bf95", + "c0f00000 b3d6bf95 -> 33d6bf95", + "c0f00000 42c80000 -> 40f00010", + "c0f00000 c2c80000 -> 40f00010", + "c0f00000 461c4000 -> 40eff800", + "c0f00000 3e99999a -> 3e99999a", + "c0f00000 3f333333 -> 3f000002", + "33d6bf95 00000000 -> 00000000", + "33d6bf95 3f800000 -> 34000000", + "33d6bf95 bf800000 -> 34000000", + "33d6bf95 3f000000 -> 34000000", + "33d6bf95 bf000000 -> 34000000", + "33d6bf95 40000000 -> 00000000", + "33d6bf95 c0000000 -> 00000000", + "33d6bf95 40400000 -> 00000000", + "33d6bf95 c0300000 -> 00000000", + "33d6bf95 3dcccccd -> 33d00000", + "33d6bf95 bdcccccd -> 33d00000", + "33d6bf95 40f00000 -> 00000000", + "33d6bf95 c0f00000 -> 00000000", + "33d6bf95 33d6bf95 -> 33d6bf95", + "33d6bf95 b3d6bf95 -> 33d6bf95", + "33d6bf95 42c80000 -> 00000000", + "33d6bf95 c2c80000 -> 00000000", + "33d6bf95 461c4000 -> 00000000", + "33d6bf95 3e99999a -> 33800000", + "33d6bf95 3f333333 -> 34400000", + "b3d6bf95 00000000 -> 00000000", + "b3d6bf95 3f800000 -> 34000000", + "b3d6bf95 bf800000 -> 34000000", + "b3d6bf95 3f000000 -> 34000000", + "b3d6bf95 bf000000 -> 34000000", + "b3d6bf95 40000000 -> 00000000", + "b3d6bf95 c0000000 -> 00000000", + "b3d6bf95 40400000 -> 00000000", + "b3d6bf95 c0300000 -> 00000000", + "b3d6bf95 3dcccccd -> 33d00000", + "b3d6bf95 bdcccccd -> 33d00000", + "b3d6bf95 40f00000 -> 00000000", + "b3d6bf95 c0f00000 -> 00000000", + "b3d6bf95 33d6bf95 -> 33d6bf95", + "b3d6bf95 b3d6bf95 -> 33d6bf95", + "b3d6bf95 42c80000 -> 00000000", + "b3d6bf95 c2c80000 -> 00000000", + "b3d6bf95 461c4000 -> 00000000", + "b3d6bf95 3e99999a -> 33800000", + "b3d6bf95 3f333333 -> 33800000", + "42c80000 00000000 -> 00000000", + "42c80000 3f800000 -> 00000000", + "42c80000 bf800000 -> 00000000", + "42c80000 3f000000 -> 00000000", + "42c80000 bf000000 -> 00000000", + "42c80000 40000000 -> 00000000", + "42c80000 c0000000 -> 00000000", + "42c80000 40400000 -> 40000010", + "42c80000 c0300000 -> 3f7ffff0", + "42c80000 3dcccccd -> 00000000", + "42c80000 bdcccccd -> 00000000", + "42c80000 40f00000 -> 40a00005", + "42c80000 c0f00000 -> 40a00004", + "42c80000 33d6bf95 -> 33d6bf95", + "42c80000 b3d6bf95 -> 33d6bf95", + "42c80000 42c80000 -> 42c80000", + "42c80000 c2c80000 -> 42c80000", + "42c80000 461c4000 -> 42c80000", + "42c80000 3e99999a -> 3e4cce67", + "42c80000 3f333333 -> 3f1999cd", + "c2c80000 00000000 -> 00000000", + "c2c80000 3f800000 -> 00000000", + "c2c80000 bf800000 -> 00000000", + "c2c80000 3f000000 -> 00000000", + "c2c80000 bf000000 -> 00000000", + "c2c80000 40000000 -> 00000000", + "c2c80000 c0000000 -> 00000000", + "c2c80000 40400000 -> 40000010", + "c2c80000 c0300000 -> 3f7ffff0", + "c2c80000 3dcccccd -> 00000000", + "c2c80000 bdcccccd -> 00000000", + "c2c80000 40f00000 -> 40a00004", + "c2c80000 c0f00000 -> 40a00005", + "c2c80000 33d6bf95 -> 33d6bf95", + "c2c80000 b3d6bf95 -> 33d6bf95", + "c2c80000 42c80000 -> 42c80000", + "c2c80000 c2c80000 -> 42c80000", + "c2c80000 461c4000 -> 42c80000", + "c2c80000 3e99999a -> 3e4ccc00", + "c2c80000 3f333333 -> 3f1999cd", + "461c4000 00000000 -> 00000000", + "461c4000 3f800000 -> 00000000", + "461c4000 bf800000 -> 00000000", + "461c4000 3f000000 -> 00000000", + "461c4000 bf000000 -> 00000000", + "461c4000 40000000 -> 00000000", + "461c4000 c0000000 -> 00000000", + "461c4000 40400000 -> 40000400", + "461c4000 c0300000 -> 3f7fec00", + "461c4000 3dcccccd -> 00000000", + "461c4000 bdcccccd -> 3a4ccd00", + "461c4000 40f00000 -> 409ffd80", + "461c4000 c0f00000 -> 409ffd80", + "461c4000 33d6bf95 -> 33d6bf95", + "461c4000 b3d6bf95 -> 33d6bf95", + "461c4000 42c80000 -> 00000000", + "461c4000 c2c80000 -> 00000000", + "461c4000 461c4000 -> 461c4000", + "461c4000 3e99999a -> 3e4d3334", + "461c4000 3f333333 -> 3e4d199a", + "3e99999a 00000000 -> 00000000", + "3e99999a 3f800000 -> 3e999998", + "3e99999a bf800000 -> 3e999998", + "3e99999a 3f000000 -> 3e99999a", + "3e99999a bf000000 -> 3e99999a", + "3e99999a 40000000 -> 3e999998", + "3e99999a c0000000 -> 3e999998", + "3e99999a 40400000 -> 3e999990", + "3e99999a c0300000 -> 3e999998", + "3e99999a 3dcccccd -> 3dccccca", + "3e99999a bdcccccd -> 3dcccccd", + "3e99999a 40f00000 -> 3e999990", + "3e99999a c0f00000 -> 3e9999b0", + "3e99999a 33d6bf95 -> 32d6bf94", + "3e99999a b3d6bf95 -> 00000000", + "3e99999a 42c80000 -> 3e999a00", + "3e99999a c2c80000 -> 3e999a00", + "3e99999a 461c4000 -> 3e9a0000", + "3e99999a 3e99999a -> 3e99999a", + "3e99999a 3f333333 -> 3e99999a", + "3f333333 00000000 -> 00000000", + "3f333333 3f800000 -> 3f333334", + "3f333333 bf800000 -> 3f333334", + "3f333333 3f000000 -> 3e99999a", + "3f333333 bf000000 -> 3e999998", + "3f333333 40000000 -> 3f333334", + "3f333333 c0000000 -> 3f333334", + "3f333333 40400000 -> 3f333334", + "3f333333 c0300000 -> 3f333334", + "3f333333 3dcccccd -> 3dccccc7", + "3f333333 bdcccccd -> 3dcccccd", + "3f333333 40f00000 -> 3f333320", + "3f333333 c0f00000 -> 3f333338", + "3f333333 33d6bf95 -> 3356bf95", + "3f333333 b3d6bf95 -> 00000000", + "3f333333 42c80000 -> 3f333300", + "3f333333 c2c80000 -> 3f333300", + "3f333333 461c4000 -> 3f338000", + "3f333333 3e99999a -> 3dcccccc", + "3f333333 3f333333 -> 3f333333", + "c0950ad5 40a57394 -> 40950ad4", + "c18198ae 40041ae1 -> 3ea08ce8", + "c1616cea 415060e8 -> 413f54e6", + "4123d1fd 4009fe86 -> 3fce9bba", + "4125edf7 c186fe32 -> 4125edf7", + "414a9460 40a7467c -> 400d3790", + "419beef7 41004ec9 -> 405d0170", + "be08b806 3e2403f0 -> 3e08b806", + "c19b98cf 3f14bf92 -> 3e9caeea", + "c119b808 3fd502dd -> 3ec143b4", + "c0749f01 bff3c6f9 -> 3c580800", + "4172bc49 c0b8d1ca -> 4067a9fc", + "41422282 40b9968e -> 3f08bf40", + "c1062b9e c043fada -> 4010b8c4", + "be46af7b bec08dfa -> 3e46af7c", + "4186167d c0da61ed -> 40472c30", + "c126039a c18f4fb3 -> 4126039a", + "4142eca2 401a537a -> 40124254", + "4034f30d c183bd5a -> 4034f30c", + "416e60f9 413798c1 -> 4100d089", + "c1332241 414c0277 -> 41332241", + "418d47e6 40c666bd -> 40a8521f", + "c085cf72 418e1363 -> 4085cf76", + "419acc8a 4063716d -> 3ffc8879", + "c19f3b97 c16186fa -> 410496c6", + "c1590599 c131a293 -> 410a3f8d", + "c18126ae 419f7e83 -> 418126ad", + "c10fdef1 c1980149 -> 410fdef0", + "419a686f 40ac8c3f -> 40111e81", + "c1297dac c0453513 -> 3fddbb3c", + "41813abb c0ef4ac4 -> 3f995588", + "c135de96 4166afd7 -> 4135de96", + "c1523e3e 3fab4bb8 -> 3e7819f0", + "c149da58 bf96be6b -> 3f56c52a", + "40118660 c138e31a -> 40118660", + "c0cb6f78 c09d762a -> 405ef9b8", + "c05fff57 c1322bdc -> 405fff54", + "c0c60bb6 c191f630 -> 40c60bb8", + "4097f4bc 419fc83b -> 4097f4bc", + "c0f063bc c1878c77 -> 40f063bc", + "c19332e1 c0b321ec -> 407f7856", + "411bd795 c138d777 -> 411bd794", + "417137ca c1892c4c -> 417137c7", + "c1020684 414bccc7 -> 41020685", + "41545070 c02925c9 -> 4025a0f5", + "3fce52ae 411370c0 -> 3fce52a8", + "409be501 40f7f6f8 -> 409be500", + "4191aa5a c0974cb4 -> 3f344b40", + "c0e0b538 c117a87f -> 40e0b536", + "c167dff7 bfb746cc -> 3e31de30", + "c17a93ec 4120f27d -> 408ea21e", + "4187dd1e 412134bf -> 404abd08", + "412d5f53 c0a5844e -> 3efb6090", + "40edc9df 41040586 -> 40edc9e0", + "4119bdbf c19fed3d -> 4119bdbf", + "c15687ad bfbc5a76 -> 3fa74b37", + "c1555670 414cb675 -> 4144167d", + "c18b08ad 411f2cd8 -> 40212158", + "c19b7c0e 40c5f4e5 -> 40a9e35f", + "c195ed22 416c8ee3 -> 412d4381", + "418768c8 c0ac5313 -> 4093a92b", + "41279357 412f5ecd -> 41279357", + "41904ced c156ad0a -> 410cc03a", + "c117c09b c1043fd1 -> 40e17e0e", + "3da44d60 40878499 -> 3da44d80", + "c195d883 c104d949 -> 4007f9d0", + "c102f8e6 41818cc6 -> 4102f8e5", + "c0fde53f c0b19e3e -> 404aae7a", + "c16ed054 c1947884 -> 416ed054", + "4102bf08 bf95b296 -> 3f93c8be", + "3de32e68 c140e651 -> 3de32e80", + "c152da4d 40c87442 -> 3f2660b0", + "c18161b4 417d7477 -> 41782585", + "410e33be 41380fac -> 410e33be", + "c1216a76 3d07c14b -> 3c53b3f6", + "c1915fc8 4149e628 -> 40e2197c", + "c0db841c 40c8f236 -> 40b66050", + "c0e45291 bffbf869 -> 3f3d2ec0", + "4180dbbc 411f2532 -> 40724bb0", + "41593d64 c01efaf8 -> 3fa9d880", + "417bcf9f 40fba818 -> 3c1e1e00", + "3ee66408 416878d5 -> 3ee66400", + "c0a35205 418ca38a -> 40a35206", + "409fbcdf 41949daa -> 409fbce0", + "419743f4 c0836836 -> 401eddf2", + "bee34eab 41857396 -> 3ee34ec0", + "4094d0ed c00802e9 -> 3ecce040", + "c1444304 4147f616 -> 41444304", + "4149aec4 c0eec3e4 -> 40145480", + "c0dabc80 c1327af5 -> 40dabc7e", + "415bed1b 415e9fd1 -> 415bed1b", + "417e52a5 c0e5d018 -> 3fc41460", + "c172fb63 4115a182 -> 40611e8c", + "4197191b c0425073 -> 3f2b9898", + "bf94be4c 418d8d86 -> 3f94be50", + "416b20ee 4114efb4 -> 407af9e8", + "410241a2 c1770330 -> 410241a2", + "c04d3746 c0b9c4db -> 404d3746", + "41906182 3fba02c3 -> 3f1bee06", + "c128a6ad 416fc7ab -> 4128a6ad", + "c19c812f c1078f0f -> 40279100", + "417ab092 4116ec2f -> 404c9f2e", + "4037a36d 40712f09 -> 4037a36d", + "415bcbd1 c10b6304 -> 406be8dc", + "4091d1bc c183757f -> 4091d1be", + "41702986 4186bbb3 -> 41702986", + "c12a9dc6 c13bac7a -> 412a9dc6", + "4195cf14 41268aa6 -> 4005dc90", + "c0a5f6df 41285717 -> 40a5f6df", + "c0c29b3d 419f3479 -> 40c29b3e", + "4198eee3 411db09f -> 3f183780", + "417d5aa1 c13bd8a9 -> 40f4ad5e", + "41723b0d 3fef4583 -> 3e3d62a8", + "c18c58ee 419c213c -> 418c58ed", + "c14559ef 419945c7 -> 414559ee", + "40fe4f6e be5c3813 -> 3e520b15", + "416b2a0b 410ee13c -> 404a61b4", + "c0817454 40c8e782 -> 40817454", + "40ba914e c05b718d -> 3f838102", + "4187f262 411d3dba -> 402a5ac0", + "419f9433 41905941 -> 41811e4f", + "41482d64 419638d5 -> 41482d64", + "41924680 410d94c5 -> 3f163760", + "409a8323 c196dd9b -> 409a8324", + "c01b211f c1753127 -> 401b2124", + "4198e794 c17b121a -> 4144550c", + "c0ce175c 41258fed -> 40ce175d", + "c0a605c8 c0476354 -> 3f857630", + "412c3a39 c1135179 -> 40f4d172", + "41897aa8 4190518a -> 41897aa8", + "c18f0850 41551af8 -> 410c254e", + "c1992694 bfb09dfd -> 3e31d4c8", + "c06e86a5 4098bc95 -> 406e86a6", + "c0577379 4143e031 -> 40577378", + "40b1a56d c0e66a3d -> 40b1a56e", + "c0fae164 41373438 -> 40fae166", + "4186636e c1435415 -> 40f3c29e", + "40ae4d17 409406e7 -> 4073816e", + "c0b85fa6 c17edb3c -> 40b85fa4", + "c18bd637 c088d2a4 -> 3ec0e4c0", + "4113744f 411fb2af -> 4113744f", + "c1995edb c19ddc5e -> 41995edc", + "40bfbee8 4156e44d -> 40bfbee6", + "c02e652a bfe68cdb -> 3f609ec5", + "40b4b62b c0994259 -> 407b9d0e", + "3ffffc5a c09d1620 -> 3ffffc58", + "40f8fb2c 419ec09c -> 40f8fb28", + "41300525 c16c33b3 -> 41300525", + "c046f1df c14ae7ca -> 4046f1e0", + "410106c4 c116dffa -> 410106c4", + "3fa92b4c 417a5cb4 -> 3fa92b40", + "404a3ba0 419b7e1a -> 404a3ba0", + "c18f53ba 3e5b610a -> 3da3f488", + "418d21e6 c0c3cde7 -> 40acebca", + "40de6b4b 419d90e0 -> 40de6b50", + "41893c80 c0c6af83 -> 409792fa", + "413067aa c1667bc8 -> 413067a9", + "c012bfc6 417e050f -> 4012bfc4", + "40ece4c7 c19382f7 -> 40ece4c8", + "4197986b bfd508ab -> 3f82e14b", + "4190f380 bff47f55 -> 3f7b829e", + "c18777e1 c18deed3 -> 418777e1", + "c15e1eb7 417ba3e6 -> 415e1eb6", + "c14ddbd8 4194ff2e -> 414ddbd8", + "c137d06e c0c4b54e -> 3f4e4e00", + "c17afcb3 c0f7a281 -> 3e568ca0", + "416f6de0 40d53caf -> 3fd18984", + "3daebe0e 40b0918a -> 3daebe00", + "416bb26a 411ebccb -> 40a38e58", + "416e2828 40f2dbda -> 3e967640", + "c1940f92 40f8ec6d -> 403ccada", + "419d3e9d c1267064 -> 3f931c68", + "401210b8 c0e8ee73 -> 401210bc", + "c182ce49 40a235e6 -> 407b3cec", + "40da3893 c151830e -> 40da3896", + "4107a78f c1736635 -> 4107a78e", + "40ecd122 40cf84b6 -> 40b2384a", + "402d7fbc c153f488 -> 402d7fbc", + "c1792c90 c146198c -> 41130688", + "c199cf73 40ff3db7 -> 405184bc", + "c0d28193 3dcb1bf5 -> 3d065f3e", + "bfdf1b95 c18c3b9c -> 3fdf1b90", + "c19fe42a c195b549 -> 418b8668", + "c0fc87f5 4190bd78 -> 40fc87f2", + "c105ad54 c0786e94 -> 3f1760a0", + "c0f18919 c19a4fbe -> 40f18918", + "410561d6 c1105b77 -> 410561d5", + "c13936d1 41959ecb -> 413936d2", + "3f2e4642 419d0067 -> 3f2e4640", + "c0ad866e c073a92e -> 400c4580", + "c0c54a7d 40e0b80f -> 40c54a7d", + "403904a7 413d7414 -> 403904a8", + "c1937ec9 c143ef73 -> 40c1c2a9", + "c0b1ef17 bf074f84 -> 3e8cbb1c", + "c0c3d524 40b443f9 -> 40a4b2cf", + "40ccb643 c132d248 -> 40ccb644", + "414f97f7 bec5bfec -> 3e20fd0c", + "3ee11e5b 418964e7 -> 3ee11e80", + "4085c3aa 3ffc7aed -> 3e70c678", + "3ffee30e bf80c144 -> 3ca7de80", + "4080ac21 c0ebb84c -> 4080ac20", + "c1085462 4074bdd2 -> 3f5f5784", + "c0e45f5a 4072185f -> 3edb9048", + "c0e1923e c060e5d2 -> 3cac6b80", + "411ee9df 3dccaf58 -> 3d7f1db0", + "409dc295 4180e578 -> 409dc294", + "c0d9cf7a 411d8199 -> 40d9cf7a", + "40e8b247 416d9d12 -> 40e8b248", + "418f2050 3f584cb6 -> 3f328dac", + "4182c840 416a9c33 -> 414fa7e6", + "41818856 c12b2e7c -> 40a6989a", + "4066d7c2 414ea1be -> 4066d7c0", + "c0928e83 4160a608 -> 40928e84", + "c1905f79 415d6b7f -> 411a180f", + "c104ae46 4093cfc7 -> 3f721808", + "410682ca c148b31c -> 410682ca", + "c18af197 40f79752 -> 3ff25ee4", + "410513ec 40e5d881 -> 40c1892a", + "c1134942 419fce74 -> 41134943", + "c0ef8a88 415800df -> 40ef8a8a", + "418c0a51 c0fb8b14 -> 3fe44c74", + "417e6fd3 40a8888a -> 40a54283", + "bf9f0230 c115abb7 -> 3f9f0238", + "c17bcab0 3f9bfebf -> 3f8e648b", + "418e57eb c0a77bba -> 40491e70", + "3ff78d5d c1848282 -> 3ff78d68", + "c125285f c1952d2b -> 41252860", + "4163fb92 c00df8df -> 3f706436", + "c13d0eb1 3fee23cf -> 3f273d60", + "c081856c c1220150 -> 4081856c", + "c189c12d c000c098 -> 3f90094c", + "c19712e7 40b77141 -> 40817969", + "bf9d88cf c14a21f8 -> 3f9d88d0", + "404a74ff bebe2b57 -> 3e449a84", + "c17c6eb8 c0dab137 -> 4006f602", + "c0643559 41816017 -> 40643558", + "414335aa c0e04984 -> 3fe89ed0", + "bfd44741 4172a2de -> 3fd44738", + "c159379e 3fd196aa -> 3ef41e6c", + "418dc883 c18654ec -> 417dc2a8", + "c16d8a41 4117bb73 -> 4083d94a", + "c0b9df5f 40f42aed -> 40b9df5e", + "40e4d40a c0acc601 -> 40696fee", + "c1222f57 c0f96a76 -> 40ae763e", + "4172e290 4003b217 -> 3fa40cee", + "c1647985 c0c2b891 -> 400703ce", + "c097ab7b c10c8fff -> 4097ab7a", + "c1312177 403290ba -> 3db7a160", + "413a8364 c1321df4 -> 4129b884", + "4165186d bfe78926 -> 3e1c2df8", + "c1267096 41176f8c -> 41086e82", + "c10d458e 412790a8 -> 410d458e", + "419612b0 c185aaf4 -> 416a8670", + "c14518f4 419aa43d -> 414518f4", + "41981b79 c0c8868f -> 40c1ac59", + "c19b8878 418a71c0 -> 4172b610", + "c199cd3b 414d2271 -> 40cd54d2", + "417b9a9c c01c3d90 -> 3f89f220", + "415d1c99 410b2384 -> 4064a9ba", + "40b18cb8 410a287a -> 40b18cb8", + "40b81df3 4190ab15 -> 40b81df4", + "4120a1d5 be7b7251 -> 3e5e9891", + "bf56f58c bff978bb -> 3f56f58a", + "c0476b75 412cdfa5 -> 40476b72", + "c14cabd9 c0d963d6 -> 3f4b7fd0", + "3fec6a60 417c0438 -> 3fec6a60", + "c12d51df 40c41c19 -> 3fb651c8", + "c1815d25 c18e0224 -> 41815d26", + "c10a277f 40f6057b -> 40d7bbfb", + "40e539fb bf0a141f -> 3ec693b6", + "40b41bb8 416a5049 -> 40b41bba", + "417c11bb 418842ad -> 417c11ba", + "c1185b20 c07c16e8 -> 3fd27d60", + "bfe86bae c1104461 -> 3fe86bb0", + "41927184 417b3f12 -> 41519b1c", + "40b69278 c0ce32d8 -> 40b69278", + "412ebc50 c18fbf9f -> 412ebc50", + "c16fb3af 405f55bf -> 3f82ef7e", + "4129fc32 c18541d7 -> 4129fc32", + "c142b1d2 c0ad5d47 -> 3faaa458", + "bfdff52a 41575f03 -> 3fdff528", + "41336322 c0e04268 -> 40337d18", + "41612cf9 bfe141a3 -> 3ba55000", + "40db9e1d 41450c6b -> 40db9e1e", + "bf398ea2 c183e8c5 -> 3f398e80", + "c0250f46 40be3136 -> 40250f43", + "40e92c9f 4141a774 -> 40e92ca0", + "4132725a c104b524 -> 40adefde", + "3f84d246 c0bd972d -> 3f84d244", + "3f403112 4190acc4 -> 3f403100", + "419f29cf c1874126 -> 415eb0fe", + "40b92773 c155ff64 -> 40b92774", + "40e3db95 c0745efd -> 3f041b44", + "41857a7d 3f08a784 -> 3ecb41ae", + "c19169dc c11301fc -> 3e4c1000", + "c0697074 c0f00b10 -> 40697074", + "412fc94f 400a109e -> 3ffa7cea", + "4177f9ff 4097c399 -> 405e34ce", + "408154bc 418ba601 -> 408154bc", + "c13c807a 4097474a -> 4014e4c4", + "4185424d c13c79cb -> 40dcddf6", + "3f4afd1c c169865c -> 3f4afd10", + "40d06878 418115d6 -> 40d06878", + "c0b31bf0 417312f2 -> 40b31bf0", + "c034e1b0 419617c6 -> 4034e1b4", + "c09e480e c180113f -> 409e4810", + "bfc47570 405e3d4a -> 3fc47571", + "be53f398 405b5855 -> 3e53f380", + "40a071cb 4148dbcd -> 40a071ca", + "3fce1c84 c08d7620 -> 3fce1c82", + "415867ff 415d7abe -> 41586800", + "bdcb3f7d 412d7a85 -> 3dcb3f80", + "4180e036 c12b0530 -> 40a893ea", + "40e6a614 4143a147 -> 40e6a616", + "c1977e4c 40ed1649 -> 4083cc9c", + "3e28729f c15cea95 -> 3e2872c0", + "c126d93e 4126b5c7 -> 41269251", + "c12c4c36 c13d55fc -> 412c4c36", + "40f93fc8 41699332 -> 40f93fc8", + "bfdbf805 3fc8fefa -> 3fb605ec", + "c112945c c052c6a8 -> 4024c420", + "4088b00f bfa2f26a -> 3f5212d0", + "4080f424 c0a87a40 -> 4080f424", + "40c56da1 4108eb74 -> 40c56da0", + "c032db22 c1617695 -> 4032db24", + "c105564a 418cc60c -> 41055649", + "4191adc5 c0df2a84 -> 4088620c", + "41819b51 41319b26 -> 40bfff54", + "4154b13c c0c749a7 -> 3f567950", + "406f95ac c14ef36c -> 406f95b4", + "41822fe9 4122a0bc -> 4081c34c", + "403be9f6 4162d492 -> 403be9f8", + "418a2a2c 40dc446c -> 40603fb0", + "c0952216 c126ccee -> 40952216", + "40d2696d 4162db94 -> 40d2696c", + "bf9f9cf6 c1885e4c -> 3f9f9cf0", + "416c218e 416d6121 -> 416c218f", + "bcc1d279 412007ba -> 3cc1d000", + "414eb009 c164f97e -> 414eb009", + "c19e8c02 414b761c -> 40b3a868", + "411efe44 40879853 -> 3fbb2f88", + "be9e4395 408ebc4c -> 3e9e4390", + "c183bf63 c1859c81 -> 4183bf63", + "c198ca6f bfe4f0a8 -> 3f9b405a", + "c0927012 c10a6571 -> 40927012", + "410c7cf2 40f03e40 -> 40c7829c", + "4193d33b c17df37b -> 4154407f", + "419700e9 c14cabe4 -> 40d6abf0", + "4108945b c0e2a0d1 -> 40b418eb", + "40eb818d 3f3b6525 -> 3d218f70", + "416f34ea c083c979 -> 3fc2f048", + "c183d860 419bbb81 -> 4183d860", + "40200715 c1777ace -> 4020071c", + "bfbbc47c 419ca7fc -> 3fbbc480", + "40ba46d4 c1081924 -> 40ba46d4", + "411a1343 c176690e -> 411a1342", + "41817100 bcef6d6d -> 3c3d9fea", + "c0c392ad 402b0db8 -> 3f4427a2", + "402961e6 c057b3e5 -> 402961e6", + "41986a06 c09c902f -> 3f04c510", + "c18e9fe8 c18e08eb -> 418d71ee", + "c12b712e 40034401 -> 3fcba69a", + "4111f614 404176c0 -> 403e02b1", + "c0f18404 c11a679f -> 40f18406", + "417793cf 41347bda -> 40e2c7ca", + "40d942fd 411a5b6e -> 40d942fc", + "4134b116 c18010a5 -> 4134b116", + "c11bf3a0 412fd6c3 -> 411bf3a1", + "41397bdf 41277d71 -> 41157f03", + "4166e534 c1873ff8 -> 4166e533", + "bd82db80 402b872f -> 3d82dba0", + "c0444b5a 4048f14c -> 40444b5a", + "c19e101a 41178b0c -> 3f50a1d0", + "c180a703 41298a91 -> 40a38e38", + "40cd3758 41496f19 -> 40cd3756", + "40648002 3ff65210 -> 3e8e9070", + "c19d4f28 c024e1eb -> 3f725856", + "c05365cb 419fd881 -> 405365c8", + "c1217428 4106ec7d -> 40d8c9a6", + "c180503b 41614c8e -> 4141f8a4", + "3e0530e2 4168d3cf -> 3e053100", + "c113e196 c18ab099 -> 4113e196", + "400a2184 411e9830 -> 400a2184", + "40f6e515 3fd0db04 -> 3f982846", + "c18bed15 40b14393 -> 409559f7", + "3fb0192b c19176ef -> 3fb01930", + "c0d26aba c1328e7e -> 40d26abc", + "40baabfb 4189dd45 -> 40baabfc", + "c18d9182 c0a0ad1a -> 4018dcc0", + "c13b430b c16c8c8f -> 413b430b", + "c165b12e 412fe44d -> 40f42ed6", + "3ffbac4e c164912d -> 3ffbac50", + "c061c762 c08fda64 -> 4061c764", + "41264d51 c16304c6 -> 41264d52", + "c129a42d 4156c705 -> 4129a42c", + "c14b7654 40337065 -> 3fc02f76", + "c003293d c1682f35 -> 4003293c", + "40bdbf6a c0ed4da7 -> 40bdbf68", + "410e0f3b 4036d12a -> 402307bc", + "41125e9d 41006a11 -> 40dceb0a", + "41890024 40b33675 -> 40a8d942", + "412b3ce8 418a09f8 -> 412b3ce8", + "4080a7fd c0f067cb -> 4080a7fc", + "c0d0de0e c19e976f -> 40d0de0c", + "c1830640 4115f9a6 -> 40179b2c", + "4140f8f1 3ed95758 -> 3e3320e0", + "40358576 c1337823 -> 40358570", + "3da2be8c c0de8de8 -> 3da2be80", + "4192f549 c0993489 -> 3f47e810", + "c1935efd 415cf280 -> 4113270a", + "c19e5545 3fdbeb3f -> 3f53653e", + "3e89c769 41846de7 -> 3e89c780", + "41898d3c 418a51c8 -> 41898d3c", + "c0b00cdc 41949bd1 -> 40b00cdc", + "41630607 4156f755 -> 414ae8a3", + "4168b4cf c0941da7 -> 407e1a02", + "40d8392d 40950978 -> 4023b386", + "c149031b c09e0afb -> 402be07e", + "416c7cd0 409eae26 -> 409b9d54", + "c122aaef c0874b3d -> 3fdafd90", + "40975512 c16e5cfb -> 40975514", + "c161a5e3 416be266 -> 4161a5e3", + "c0ddf270 413b60f6 -> 40ddf26f", + "412a0c2b c120ff14 -> 4117f1fc", + "40972cdf 40725a2c -> 40365a9a", + "c10b8bd2 c13b0e7f -> 410b8bd1", + "40f877d4 c140d4a0 -> 40f877d4", + "3e8110bf c0c6ae08 -> 3e8110b0", + "c18afa47 418b65aa -> 418afa46", + "c0fdf04e 3e59f0e0 -> 3e1bb79c", + "c052d9f4 414d8e9e -> 4052d9f4", + "403d0cff 401e01fd -> 3ffdedf6", + "40a4cf09 c1420013 -> 40a4cf0a", + "c14fd451 c1555875 -> 414fd451", + "bf413ad2 40f122f2 -> 3f413ad8", + "419bdb4f c1491089 -> 40b4d4e2", + "c0feb1df 4051f17f -> 3fb3017e", + "c11dba08 c1822e40 -> 411dba08", + "406d3f39 c19ece12 -> 406d3f38", + "c108cb0d 4173aaf7 -> 4108cb0c", + "c13ce908 41496875 -> 413ce907", + "417a68c9 41840e62 -> 417a68c8", + "40d5a1de 40ec0b38 -> 40d5a1de", + "c046951c c01e94d1 -> 3fed290c", + "41888fdf bf949df1 -> 3f50b58a", + "c15aea57 419a20c3 -> 415aea57", + "41632a98 40e292fe -> 3d179980", + "c16399a3 c150a266 -> 413dab29", + "40cb97eb 4195181c -> 40cb97ec", + "40e660a9 c089a27f -> 3fb39154", + "40f153b1 c19ab04f -> 40f153b0", + "c0822885 c17e139e -> 40822884", + "c108259f 41565275 -> 4108259f", + "3eada9e2 c18fcec4 -> 3eadaa00", + "c121d485 418f0e61 -> 4121d486", + "c17635e2 c17773af -> 417635e1", + "c1190300 40a768f8 -> 3f665f80", + "4113046e 400c7468 -> 3ed200c0", + "c0bdf5bf c05f0e5c -> 3f846274", + "40c66543 c173fdc2 -> 40c66546", + "c19187db c0a69480 -> 4028652a", + "40c66356 c0d7b990 -> 40c66356", + "c17959fe c066d5a4 -> 3f9422cc", + "408e95a0 c11be565 -> 408e959f", + "c0951a2a 4125bf50 -> 40951a2b", + "c135c5ff 418f91cc -> 4135c600", + "41434871 413d0039 -> 4136b801", + "c02cfb30 c18f00fb -> 402cfb30", + "4072ee7c c190af33 -> 4072ee78", + "c142bf99 41699f4d -> 4142bf99", + "413d5bf2 c19b3ad6 -> 413d5bf2", + "41981898 4187e786 -> 416f6ce8", + "41674923 c16fab07 -> 41674924", + "41806111 41333359 -> 40cb4920", + "c011eacb 414385cc -> 4011eacc", + "c08ed237 c105afd3 -> 408ed238", + "409dab04 4153a381 -> 409dab02", + "c168f748 c08d740a -> 4047c332", + "413ba042 c06f27ca -> 404e1e26", + "c02ca67e 400d0a7d -> 3fdadcf4", + "411d681a 3edaddb1 -> 3ed7c55f", + "418296cd 413af3fe -> 40e174c4", + "419a16f0 c0adbb84 -> 401d249c", + "40fd92ce 419f941e -> 40fd92cc", + "c19bccf0 401005a6 -> 3fbc74a6", + "c0c35b47 c0423d91 -> 3d0edb00", + "4085f808 40fd8c47 -> 4085f807", + "c12e93f3 41865a30 -> 412e93f3", + "410f917a c0e0ef8e -> 40a2bc2a", + "4088e7c8 c19799d0 -> 4088e7c6", + "c1769d40 418676b3 -> 41769d43", + "c147b9ad 40eed5bd -> 401c703a", + "40c1eaee c0eb184f -> 40c1eaec", + "3f86561e 4066fc53 -> 3f86561e", + "c0ecb213 40dde844 -> 40cf1e72", + "3fca897a c11748fd -> 3fca8978", + "40ec36e9 400050bd -> 3f23548e", + "41399ae2 bf031dcf -> 3eaa3cb9", + "c11209e2 c169d501 -> 411209e1", + "c0b2d6d3 c173a98c -> 40b2d6d4", + "41992f1a c04a3c96 -> 3e40d4b0", + "4178efeb c186192d -> 4178efea", + "41155bb2 c120bf4f -> 41155bb2", + "c0ffe9d0 c190cb5d -> 40ffe9cc", + "41831241 c0a5e431 -> 408b47c1", + "418b2f80 c11a8c14 -> 3ff5c938", + "40f3e738 c0049689 -> 3f2a2ed4", + "c187df84 c0c45e49 -> 4096c17f", + "3f5aaa9b 414c44a7 -> 3f5aaaa0", + "c122c4ec c187d864 -> 4122c4ec", + "befd52ca bfb81837 -> 3efd52c8", + "4198ae2b c159ae3a -> 41020020", + "c0eb8cf8 414baaa2 -> 40eb8cf8", + "418d5d62 bf89a695 -> 3eedb34a", + "419961b4 4097f858 -> 3e34ae20", + "419abd86 4164e050 -> 41144594", + "c174fcff c152a131 -> 41304563", + "4151869f c0982cef -> 406566c0", + "412c8182 414fc0cb -> 412c8181", + "40300b8c 412fa1f9 -> 40300b8c", + "c035fea7 c10b3382 -> 4035fea8", + "4186c2c2 412cb351 -> 4097c23c", + "40761765 c1237aca -> 40761764", + "c157feb7 4055fd73 -> 3e005120", + "40875e0f 41205822 -> 40875e0e", + "418debf5 40c034fe -> 40b745d8", + "405945a4 c13144b8 -> 405945a6", + "c091df8e 409c7061 -> 4091df8f", + "c132401d 415fd50c -> 4132401d", + "4087577b 4178d014 -> 4087577c", + "415aac0f c0273a12 -> 4000ac2e", + "c028bdec 4165980a -> 4028bde8", + "c154a9a0 40959e3e -> 407c2d8a", + "c12ab08f 41465cd9 -> 412ab090", + "408196e3 c0889322 -> 408196e2", + "c139ef96 c0fef4e9 -> 408a0aa6", + "c19043f5 40460840 -> 3f08476c", + "419444b1 41807057 -> 415937fa", + "c16d50fd 40b4597e -> 4063ddf9", + "40e4f30c 40fd1408 -> 40e4f30c", + "4076a5e5 4185a687 -> 4076a5e8", + "c12fd81e beda549d -> 3dc650ac", + "40b1f813 40f93f63 -> 40b1f813", + "c10ee5f4 414cb640 -> 410ee5f4", + "40911e38 c161ddbc -> 40911e3a", + "418242b7 c0d30702 -> 4045f9b5", + "c0e814e4 c17dcfcf -> 40e814e6", + "40f23543 415cfb58 -> 40f23544", + "41714a28 c18b903b -> 41714a29", + "c1364fa1 3fc2ebfd -> 3f49c5b6", + "40d93125 c150d53a -> 40d93124", + "417b3e77 40209630 -> 3f25d2f0", + "c16074e3 c18de598 -> 416074e4", + "c177bb3b c1305223 -> 40d1d216", + "3f998d3d 413dc7b3 -> 3f998d38", + "40925eb3 c18f9674 -> 40925eb2", + "3fa4146b c18204b1 -> 3fa41470", + "4176693d 413cf5ad -> 4103821d", + "4184691e c0c20601 -> 408d9875", + "405efbcb 40965456 -> 405efbcc", + "c19c1e85 4182ff30 -> 4153bfba", + "bfa7357d c1995c42 -> 3fa73580", + "c0def18e 417646ca -> 40def18c", + "41840637 4123dd85 -> 407eba72", + "c0d871e6 c159c16c -> 40d871e4", + "c092ed12 40d1b10c -> 4092ed12", + "c0bdf423 c193d7c1 -> 40bdf428", + "4106d360 3f9d6977 -> 3f862237", + "4148dc5c 415c1083 -> 4148dc5b", + "c14eace0 40964a42 -> 40618a72", + "c15d5d17 c15326f9 -> 4148f0db", + "4086b771 c013fd30 -> 3ed45bf0", + "bec51a1d 411dbbdf -> 3ec51a00", + "410754d7 418779e3 -> 410754d8", + "c0e79ce1 41954617 -> 40e79ce0", + "c014cf2b 3f819139 -> 3e99ef96", + "411b1316 4118a1b7 -> 41163058", + "c1316543 409d1d54 -> 3fa23f7a", + "4105386c c00e11e6 -> 3f0d9798", + "c0927648 bffb8788 -> 3f259420", + "c1904033 40c7daca -> 40b14b3b", + "c1312e1e 405fcbd6 -> 403a76e0", + "c12c4f5b c162d3c6 -> 412c4f5c", + "c1752f01 c19d5413 -> 41752f02", + "403e296c 4179d1db -> 403e296c", + "c16acd1d c189b2c1 -> 416acd1e", + "c14ed910 413f2b5c -> 412f7da8", + "3fef53f1 c197b7de -> 3fef53f0", + "c1493732 4199d148 -> 41493732", + "c129fa54 c188b962 -> 4129fa54", + "c10e84bb c19d36b8 -> 410e84ba", + "c1915836 bfddc24a -> 3f57d8f4", + "3fdf6f14 c16c18dd -> 3fdf6f18", + "414a5428 416dcb9f -> 414a5429", + "40267074 c19b9aee -> 40267070", + "411f5b2c 419597c8 -> 411f5b2c", + "c092eddc c1273b95 -> 4092edda", + "bdb176e5 416d5740 -> 3db17780", + "40ff83cd 415f2c95 -> 40ff83ca", + "3f150930 bf4e0047 -> 3f150930", + "40586fd4 409c3364 -> 40586fd4", + "41846631 c1360317 -> 40c6739a", + "c099fa56 3f7cacca -> 3f5d1f85", + "c0e7562d c122e27b -> 40e7562e", + "c12960b7 c0aa82e7 -> 3d911800", + "c182124a 40887029 -> 3f4bbbe0", + "4151ff9b c156a5e7 -> 4151ff9b", + "c1567d1c 40118dd7 -> 3e75e990", + "4130df29 415e6236 -> 4130df2a", + "c1406062 4171398a -> 41406062", + "c19b89fa 418b1715 -> 4175485e", + "c0f9ae91 40937c16 -> 3fb52668", + "412da506 bef3257c -> 3ecf6826", + "c19ba7cf 410a7b3f -> 4009647e", + "412ef684 c00db183 -> 40051407", + "418ebdbf 410ded0a -> 3dd0b500", + "c1989902 406fbc56 -> 4059a1f0", + "4142033a 4180937c -> 4142033a", + "40728143 c0a7725e -> 40728145", + "c1019454 416b46ad -> 41019454", + "3fe97d2d 414e1464 -> 3fe97d28", + "c1980201 c19d7466 -> 41980202", + "c15349ac 41394f59 -> 411f5505", + "419ca92c 40c830c7 -> 40ae1e6e" + ] + }, + { + "function": "cycles_smooth_min", + "node": "ShaderNodeMath SMOOTH_MIN", + "cases": [ + "00000000 00000000 00000000 -> 00000000", + "00000000 00000000 3f800000 -> be2aaaab", + "00000000 00000000 bf800000 -> 00000000", + "00000000 00000000 3f000000 -> bdaaaaab", + "00000000 00000000 bf000000 -> 00000000", + "00000000 00000000 40000000 -> beaaaaab", + "00000000 00000000 c0000000 -> 00000000", + "00000000 00000000 40400000 -> bf000000", + "00000000 00000000 c0300000 -> 00000000", + "00000000 00000000 3dcccccd -> bc888889", + "00000000 3f800000 00000000 -> 00000000", + "00000000 3f800000 3f800000 -> 00000000", + "00000000 3f800000 bf800000 -> 00000000", + "00000000 3f800000 3f000000 -> 00000000", + "00000000 3f800000 bf000000 -> 00000000", + "00000000 3f800000 40000000 -> bd2aaaab", + "00000000 3f800000 c0000000 -> 00000000", + "00000000 3f800000 40400000 -> be17b427", + "00000000 3f800000 c0300000 -> 00000000", + "00000000 3f800000 3dcccccd -> 00000000", + "00000000 bf800000 00000000 -> bf800000", + "00000000 bf800000 3f800000 -> bf800000", + "00000000 bf800000 bf800000 -> bf800000", + "00000000 bf800000 3f000000 -> bf800000", + "00000000 bf800000 bf000000 -> bf800000", + "00000000 bf800000 40000000 -> bf855555", + "00000000 bf800000 c0000000 -> bf800000", + "00000000 bf800000 40400000 -> bf92f685", + "00000000 bf800000 c0300000 -> bf800000", + "00000000 bf800000 3dcccccd -> bf800000", + "00000000 3f000000 00000000 -> 00000000", + "00000000 3f000000 3f800000 -> bcaaaaab", + "00000000 3f000000 bf800000 -> 00000000", + "00000000 3f000000 3f000000 -> 00000000", + "00000000 3f000000 bf000000 -> 00000000", + "00000000 3f000000 40000000 -> be100000", + "00000000 3f000000 c0000000 -> 00000000", + "00000000 3f000000 40400000 -> be9425ec", + "00000000 3f000000 c0300000 -> 00000000", + "00000000 3f000000 3dcccccd -> 00000000", + "00000000 bf000000 00000000 -> bf000000", + "00000000 bf000000 3f800000 -> bf055555", + "00000000 bf000000 bf800000 -> bf000000", + "00000000 bf000000 3f000000 -> bf000000", + "00000000 bf000000 bf000000 -> bf000000", + "00000000 bf000000 40000000 -> bf240000", + "00000000 bf000000 c0000000 -> bf000000", + "00000000 bf000000 40400000 -> bf4a12f6", + "00000000 bf000000 c0300000 -> bf000000", + "00000000 bf000000 3dcccccd -> bf000000", + "00000000 40000000 00000000 -> 00000000", + "00000000 40000000 3f800000 -> 00000000", + "00000000 40000000 bf800000 -> 00000000", + "00000000 40000000 3f000000 -> 00000000", + "00000000 40000000 bf000000 -> 00000000", + "00000000 40000000 40000000 -> 00000000", + "00000000 40000000 c0000000 -> 00000000", + "00000000 40000000 40400000 -> bc97b427", + "00000000 40000000 c0300000 -> 00000000", + "00000000 40000000 3dcccccd -> 00000000", + "00000000 c0000000 00000000 -> c0000000", + "00000000 c0000000 3f800000 -> c0000000", + "00000000 c0000000 bf800000 -> c0000000", + "00000000 c0000000 3f000000 -> c0000000", + "00000000 c0000000 bf000000 -> c0000000", + "00000000 c0000000 40000000 -> c0000000", + "00000000 c0000000 c0000000 -> c0000000", + "00000000 c0000000 40400000 -> c0012f68", + "00000000 c0000000 c0300000 -> c0000000", + "00000000 c0000000 3dcccccd -> c0000000", + "00000000 40400000 00000000 -> 00000000", + "00000000 40400000 3f800000 -> 00000000", + "00000000 40400000 bf800000 -> 00000000", + "00000000 40400000 3f000000 -> 00000000", + "00000000 40400000 bf000000 -> 00000000", + "00000000 40400000 40000000 -> 00000000", + "00000000 40400000 c0000000 -> 00000000", + "00000000 40400000 40400000 -> 00000000", + "00000000 40400000 c0300000 -> 00000000", + "00000000 40400000 3dcccccd -> 00000000", + "00000000 c0300000 00000000 -> c0300000", + "00000000 c0300000 3f800000 -> c0300000", + "00000000 c0300000 bf800000 -> c0300000", + "00000000 c0300000 3f000000 -> c0300000", + "00000000 c0300000 bf000000 -> c0300000", + "00000000 c0300000 40000000 -> c0300000", + "00000000 c0300000 c0000000 -> c0300000", + "00000000 c0300000 40400000 -> c03004be", + "00000000 c0300000 c0300000 -> c0300000", + "00000000 c0300000 3dcccccd -> c0300000", + "00000000 3dcccccd 00000000 -> 00000000", + "00000000 3dcccccd 3f800000 -> bdf8d4fc", + "00000000 3dcccccd bf800000 -> 00000000", + "00000000 3dcccccd 3f000000 -> bd2ec33f", + "00000000 3dcccccd bf000000 -> 00000000", + "00000000 3dcccccd 40000000 -> be925349", + "00000000 3dcccccd c0000000 -> 00000000", + "00000000 3dcccccd 40400000 -> bee73e6e", + "00000000 3dcccccd c0300000 -> 00000000", + "00000000 3dcccccd 3dcccccd -> 00000000", + "3f800000 00000000 00000000 -> 00000000", + "3f800000 00000000 3f800000 -> 00000000", + "3f800000 00000000 bf800000 -> 00000000", + "3f800000 00000000 3f000000 -> 00000000", + "3f800000 00000000 bf000000 -> 00000000", + "3f800000 00000000 40000000 -> bd2aaaab", + "3f800000 00000000 c0000000 -> 00000000", + "3f800000 00000000 40400000 -> be17b427", + "3f800000 00000000 c0300000 -> 00000000", + "3f800000 00000000 3dcccccd -> 00000000", + "3f800000 3f800000 00000000 -> 3f800000", + "3f800000 3f800000 3f800000 -> 3f555555", + "3f800000 3f800000 bf800000 -> 3f800000", + "3f800000 3f800000 3f000000 -> 3f6aaaab", + "3f800000 3f800000 bf000000 -> 3f800000", + "3f800000 3f800000 40000000 -> 3f2aaaaa", + "3f800000 3f800000 c0000000 -> 3f800000", + "3f800000 3f800000 40400000 -> 3f000000", + "3f800000 3f800000 c0300000 -> 3f800000", + "3f800000 3f800000 3dcccccd -> 3f7bbbbc", + "3f800000 bf800000 00000000 -> bf800000", + "3f800000 bf800000 3f800000 -> bf800000", + "3f800000 bf800000 bf800000 -> bf800000", + "3f800000 bf800000 3f000000 -> bf800000", + "3f800000 bf800000 bf000000 -> bf800000", + "3f800000 bf800000 40000000 -> bf800000", + "3f800000 bf800000 c0000000 -> bf800000", + "3f800000 bf800000 40400000 -> bf825ed1", + "3f800000 bf800000 c0300000 -> bf800000", + "3f800000 bf800000 3dcccccd -> bf800000", + "3f800000 3f000000 00000000 -> 3f000000", + "3f800000 3f000000 3f800000 -> 3ef55555", + "3f800000 3f000000 bf800000 -> 3f000000", + "3f800000 3f000000 3f000000 -> 3f000000", + "3f800000 3f000000 bf000000 -> 3f000000", + "3f800000 3f000000 40000000 -> 3eb80000", + "3f800000 3f000000 c0000000 -> 3f000000", + "3f800000 3f000000 40400000 -> 3e57b428", + "3f800000 3f000000 c0300000 -> 3f000000", + "3f800000 3f000000 3dcccccd -> 3f000000", + "3f800000 bf000000 00000000 -> bf000000", + "3f800000 bf000000 3f800000 -> bf000000", + "3f800000 bf000000 bf800000 -> bf000000", + "3f800000 bf000000 3f000000 -> bf000000", + "3f800000 bf000000 bf000000 -> bf000000", + "3f800000 bf000000 40000000 -> bf015555", + "3f800000 bf000000 c0000000 -> bf000000", + "3f800000 bf000000 40400000 -> bf100000", + "3f800000 bf000000 c0300000 -> bf000000", + "3f800000 bf000000 3dcccccd -> bf000000", + "3f800000 40000000 00000000 -> 3f800000", + "3f800000 40000000 3f800000 -> 3f800000", + "3f800000 40000000 bf800000 -> 3f800000", + "3f800000 40000000 3f000000 -> 3f800000", + "3f800000 40000000 bf000000 -> 3f800000", + "3f800000 40000000 40000000 -> 3f755555", + "3f800000 40000000 c0000000 -> 3f800000", + "3f800000 40000000 40400000 -> 3f5a12f6", + "3f800000 40000000 c0300000 -> 3f800000", + "3f800000 40000000 3dcccccd -> 3f800000", + "3f800000 c0000000 00000000 -> c0000000", + "3f800000 c0000000 3f800000 -> c0000000", + "3f800000 c0000000 bf800000 -> c0000000", + "3f800000 c0000000 3f000000 -> c0000000", + "3f800000 c0000000 bf000000 -> c0000000", + "3f800000 c0000000 40000000 -> c0000000", + "3f800000 c0000000 c0000000 -> c0000000", + "3f800000 c0000000 40400000 -> c0000000", + "3f800000 c0000000 c0300000 -> c0000000", + "3f800000 c0000000 3dcccccd -> c0000000", + "3f800000 40400000 00000000 -> 3f800000", + "3f800000 40400000 3f800000 -> 3f800000", + "3f800000 40400000 bf800000 -> 3f800000", + "3f800000 40400000 3f000000 -> 3f800000", + "3f800000 40400000 bf000000 -> 3f800000", + "3f800000 40400000 40000000 -> 3f800000", + "3f800000 40400000 c0000000 -> 3f800000", + "3f800000 40400000 40400000 -> 3f7b425f", + "3f800000 40400000 c0300000 -> 3f800000", + "3f800000 40400000 3dcccccd -> 3f800000", + "3f800000 c0300000 00000000 -> c0300000", + "3f800000 c0300000 3f800000 -> c0300000", + "3f800000 c0300000 bf800000 -> c0300000", + "3f800000 c0300000 3f000000 -> c0300000", + "3f800000 c0300000 bf000000 -> c0300000", + "3f800000 c0300000 40000000 -> c0300000", + "3f800000 c0300000 c0000000 -> c0300000", + "3f800000 c0300000 40400000 -> c0300000", + "3f800000 c0300000 c0300000 -> c0300000", + "3f800000 c0300000 3dcccccd -> c0300000", + "3f800000 3dcccccd 00000000 -> 3dcccccd", + "3f800000 3dcccccd 3f800000 -> 3dcc756b", + "3f800000 3dcccccd bf800000 -> 3dcccccd", + "3f800000 3dcccccd 3f000000 -> 3dcccccd", + "3f800000 3dcccccd bf000000 -> 3dcccccd", + "3f800000 3dcccccd 40000000 -> 3d367152", + "3f800000 3dcccccd c0000000 -> 3dcccccd", + "3f800000 3dcccccd 40400000 -> bd926e99", + "3f800000 3dcccccd c0300000 -> 3dcccccd", + "3f800000 3dcccccd 3dcccccd -> 3dcccccd", + "bf800000 00000000 00000000 -> bf800000", + "bf800000 00000000 3f800000 -> bf800000", + "bf800000 00000000 bf800000 -> bf800000", + "bf800000 00000000 3f000000 -> bf800000", + "bf800000 00000000 bf000000 -> bf800000", + "bf800000 00000000 40000000 -> bf855555", + "bf800000 00000000 c0000000 -> bf800000", + "bf800000 00000000 40400000 -> bf92f685", + "bf800000 00000000 c0300000 -> bf800000", + "bf800000 00000000 3dcccccd -> bf800000", + "bf800000 3f800000 00000000 -> bf800000", + "bf800000 3f800000 3f800000 -> bf800000", + "bf800000 3f800000 bf800000 -> bf800000", + "bf800000 3f800000 3f000000 -> bf800000", + "bf800000 3f800000 bf000000 -> bf800000", + "bf800000 3f800000 40000000 -> bf800000", + "bf800000 3f800000 c0000000 -> bf800000", + "bf800000 3f800000 40400000 -> bf825ed1", + "bf800000 3f800000 c0300000 -> bf800000", + "bf800000 3f800000 3dcccccd -> bf800000", + "bf800000 bf800000 00000000 -> bf800000", + "bf800000 bf800000 3f800000 -> bf955555", + "bf800000 bf800000 bf800000 -> bf800000", + "bf800000 bf800000 3f000000 -> bf8aaaab", + "bf800000 bf800000 bf000000 -> bf800000", + "bf800000 bf800000 40000000 -> bfaaaaab", + "bf800000 bf800000 c0000000 -> bf800000", + "bf800000 bf800000 40400000 -> bfc00000", + "bf800000 bf800000 c0300000 -> bf800000", + "bf800000 bf800000 3dcccccd -> bf822222", + "bf800000 3f000000 00000000 -> bf800000", + "bf800000 3f000000 3f800000 -> bf800000", + "bf800000 3f000000 bf800000 -> bf800000", + "bf800000 3f000000 3f000000 -> bf800000", + "bf800000 3f000000 bf000000 -> bf800000", + "bf800000 3f000000 40000000 -> bf80aaab", + "bf800000 3f000000 c0000000 -> bf800000", + "bf800000 3f000000 40400000 -> bf880000", + "bf800000 3f000000 c0300000 -> bf800000", + "bf800000 3f000000 3dcccccd -> bf800000", + "bf800000 bf000000 00000000 -> bf800000", + "bf800000 bf000000 3f800000 -> bf82aaab", + "bf800000 bf000000 bf800000 -> bf800000", + "bf800000 bf000000 3f000000 -> bf800000", + "bf800000 bf000000 bf000000 -> bf800000", + "bf800000 bf000000 40000000 -> bf920000", + "bf800000 bf000000 c0000000 -> bf800000", + "bf800000 bf000000 40400000 -> bfa5097b", + "bf800000 bf000000 c0300000 -> bf800000", + "bf800000 bf000000 3dcccccd -> bf800000", + "bf800000 40000000 00000000 -> bf800000", + "bf800000 40000000 3f800000 -> bf800000", + "bf800000 40000000 bf800000 -> bf800000", + "bf800000 40000000 3f000000 -> bf800000", + "bf800000 40000000 bf000000 -> bf800000", + "bf800000 40000000 40000000 -> bf800000", + "bf800000 40000000 c0000000 -> bf800000", + "bf800000 40000000 40400000 -> bf800000", + "bf800000 40000000 c0300000 -> bf800000", + "bf800000 40000000 3dcccccd -> bf800000", + "bf800000 c0000000 00000000 -> c0000000", + "bf800000 c0000000 3f800000 -> c0000000", + "bf800000 c0000000 bf800000 -> c0000000", + "bf800000 c0000000 3f000000 -> c0000000", + "bf800000 c0000000 bf000000 -> c0000000", + "bf800000 c0000000 40000000 -> c002aaab", + "bf800000 c0000000 c0000000 -> c0000000", + "bf800000 c0000000 40400000 -> c0097b42", + "bf800000 c0000000 c0300000 -> c0000000", + "bf800000 c0000000 3dcccccd -> c0000000", + "bf800000 40400000 00000000 -> bf800000", + "bf800000 40400000 3f800000 -> bf800000", + "bf800000 40400000 bf800000 -> bf800000", + "bf800000 40400000 3f000000 -> bf800000", + "bf800000 40400000 bf000000 -> bf800000", + "bf800000 40400000 40000000 -> bf800000", + "bf800000 40400000 c0000000 -> bf800000", + "bf800000 40400000 40400000 -> bf800000", + "bf800000 40400000 c0300000 -> bf800000", + "bf800000 40400000 3dcccccd -> bf800000", + "bf800000 c0300000 00000000 -> c0300000", + "bf800000 c0300000 3f800000 -> c0300000", + "bf800000 c0300000 bf800000 -> c0300000", + "bf800000 c0300000 3f000000 -> c0300000", + "bf800000 c0300000 bf000000 -> c0300000", + "bf800000 c0300000 40000000 -> c0300aab", + "bf800000 c0300000 c0000000 -> c0300000", + "bf800000 c0300000 40400000 -> c0325098", + "bf800000 c0300000 c0300000 -> c0300000", + "bf800000 c0300000 3dcccccd -> c0300000", + "bf800000 3dcccccd 00000000 -> bf800000", + "bf800000 3dcccccd 3f800000 -> bf800000", + "bf800000 3dcccccd bf800000 -> bf800000", + "bf800000 3dcccccd 3f000000 -> bf800000", + "bf800000 3dcccccd bf000000 -> bf800000", + "bf800000 3dcccccd 40000000 -> bf83e354", + "bf800000 3dcccccd c0000000 -> bf800000", + "bf800000 3dcccccd 40400000 -> bf904224", + "bf800000 3dcccccd c0300000 -> bf800000", + "bf800000 3dcccccd 3dcccccd -> bf800000", + "3f000000 00000000 00000000 -> 00000000", + "3f000000 00000000 3f800000 -> bcaaaaab", + "3f000000 00000000 bf800000 -> 00000000", + "3f000000 00000000 3f000000 -> 00000000", + "3f000000 00000000 bf000000 -> 00000000", + "3f000000 00000000 40000000 -> be100000", + "3f000000 00000000 c0000000 -> 00000000", + "3f000000 00000000 40400000 -> be9425ec", + "3f000000 00000000 c0300000 -> 00000000", + "3f000000 00000000 3dcccccd -> 00000000", + "3f000000 3f800000 00000000 -> 3f000000", + "3f000000 3f800000 3f800000 -> 3ef55555", + "3f000000 3f800000 bf800000 -> 3f000000", + "3f000000 3f800000 3f000000 -> 3f000000", + "3f000000 3f800000 bf000000 -> 3f000000", + "3f000000 3f800000 40000000 -> 3eb80000", + "3f000000 3f800000 c0000000 -> 3f000000", + "3f000000 3f800000 40400000 -> 3e57b428", + "3f000000 3f800000 c0300000 -> 3f000000", + "3f000000 3f800000 3dcccccd -> 3f000000", + "3f000000 bf800000 00000000 -> bf800000", + "3f000000 bf800000 3f800000 -> bf800000", + "3f000000 bf800000 bf800000 -> bf800000", + "3f000000 bf800000 3f000000 -> bf800000", + "3f000000 bf800000 bf000000 -> bf800000", + "3f000000 bf800000 40000000 -> bf80aaab", + "3f000000 bf800000 c0000000 -> bf800000", + "3f000000 bf800000 40400000 -> bf880000", + "3f000000 bf800000 c0300000 -> bf800000", + "3f000000 bf800000 3dcccccd -> bf800000", + "3f000000 3f000000 00000000 -> 3f000000", + "3f000000 3f000000 3f800000 -> 3eaaaaaa", + "3f000000 3f000000 bf800000 -> 3f000000", + "3f000000 3f000000 3f000000 -> 3ed55555", + "3f000000 3f000000 bf000000 -> 3f000000", + "3f000000 3f000000 40000000 -> 3e2aaaaa", + "3f000000 3f000000 c0000000 -> 3f000000", + "3f000000 3f000000 40400000 -> 00000000", + "3f000000 3f000000 c0300000 -> 3f000000", + "3f000000 3f000000 3dcccccd -> 3ef77777", + "3f000000 bf000000 00000000 -> bf000000", + "3f000000 bf000000 3f800000 -> bf000000", + "3f000000 bf000000 bf800000 -> bf000000", + "3f000000 bf000000 3f000000 -> bf000000", + "3f000000 bf000000 bf000000 -> bf000000", + "3f000000 bf000000 40000000 -> bf0aaaab", + "3f000000 bf000000 c0000000 -> bf000000", + "3f000000 bf000000 40400000 -> bf25ed0a", + "3f000000 bf000000 c0300000 -> bf000000", + "3f000000 bf000000 3dcccccd -> bf000000", + "3f000000 40000000 00000000 -> 3f000000", + "3f000000 40000000 3f800000 -> 3f000000", + "3f000000 40000000 bf800000 -> 3f000000", + "3f000000 40000000 3f000000 -> 3f000000", + "3f000000 40000000 bf000000 -> 3f000000", + "3f000000 40000000 40000000 -> 3efd5555", + "3f000000 40000000 c0000000 -> 3f000000", + "3f000000 40000000 40400000 -> 3ee00000", + "3f000000 40000000 c0300000 -> 3f000000", + "3f000000 40000000 3dcccccd -> 3f000000", + "3f000000 c0000000 00000000 -> c0000000", + "3f000000 c0000000 3f800000 -> c0000000", + "3f000000 c0000000 bf800000 -> c0000000", + "3f000000 c0000000 3f000000 -> c0000000", + "3f000000 c0000000 bf000000 -> c0000000", + "3f000000 c0000000 40000000 -> c0000000", + "3f000000 c0000000 c0000000 -> c0000000", + "3f000000 c0000000 40400000 -> c00025ed", + "3f000000 c0000000 c0300000 -> c0000000", + "3f000000 c0000000 3dcccccd -> c0000000", + "3f000000 40400000 00000000 -> 3f000000", + "3f000000 40400000 3f800000 -> 3f000000", + "3f000000 40400000 bf800000 -> 3f000000", + "3f000000 40400000 3f000000 -> 3f000000", + "3f000000 40400000 bf000000 -> 3f000000", + "3f000000 40400000 40000000 -> 3f000000", + "3f000000 40400000 c0000000 -> 3f000000", + "3f000000 40400000 40400000 -> 3efed098", + "3f000000 40400000 c0300000 -> 3f000000", + "3f000000 40400000 3dcccccd -> 3f000000", + "3f000000 c0300000 00000000 -> c0300000", + "3f000000 c0300000 3f800000 -> c0300000", + "3f000000 c0300000 bf800000 -> c0300000", + "3f000000 c0300000 3f000000 -> c0300000", + "3f000000 c0300000 bf000000 -> c0300000", + "3f000000 c0300000 40000000 -> c0300000", + "3f000000 c0300000 c0000000 -> c0300000", + "3f000000 c0300000 40400000 -> c0300000", + "3f000000 c0300000 c0300000 -> c0300000", + "3f000000 c0300000 3dcccccd -> c0300000", + "3f000000 3dcccccd 00000000 -> 3dcccccd", + "3f000000 3dcccccd 3f800000 -> 3d83126e", + "3f000000 3dcccccd bf800000 -> 3dcccccd", + "3f000000 3dcccccd 3f000000 -> 3dcb6f47", + "3f000000 3dcccccd bf000000 -> 3dcccccd", + "3f000000 3dcccccd 40000000 -> bd90b9b1", + "3f000000 3dcccccd c0000000 -> 3dcccccd", + "3f000000 3dcccccd 40400000 -> be66e49a", + "3f000000 3dcccccd c0300000 -> 3dcccccd", + "3f000000 3dcccccd 3dcccccd -> 3dcccccd", + "bf000000 00000000 00000000 -> bf000000", + "bf000000 00000000 3f800000 -> bf055555", + "bf000000 00000000 bf800000 -> bf000000", + "bf000000 00000000 3f000000 -> bf000000", + "bf000000 00000000 bf000000 -> bf000000", + "bf000000 00000000 40000000 -> bf240000", + "bf000000 00000000 c0000000 -> bf000000", + "bf000000 00000000 40400000 -> bf4a12f6", + "bf000000 00000000 c0300000 -> bf000000", + "bf000000 00000000 3dcccccd -> bf000000", + "bf000000 3f800000 00000000 -> bf000000", + "bf000000 3f800000 3f800000 -> bf000000", + "bf000000 3f800000 bf800000 -> bf000000", + "bf000000 3f800000 3f000000 -> bf000000", + "bf000000 3f800000 bf000000 -> bf000000", + "bf000000 3f800000 40000000 -> bf015555", + "bf000000 3f800000 c0000000 -> bf000000", + "bf000000 3f800000 40400000 -> bf100000", + "bf000000 3f800000 c0300000 -> bf000000", + "bf000000 3f800000 3dcccccd -> bf000000", + "bf000000 bf800000 00000000 -> bf800000", + "bf000000 bf800000 3f800000 -> bf82aaab", + "bf000000 bf800000 bf800000 -> bf800000", + "bf000000 bf800000 3f000000 -> bf800000", + "bf000000 bf800000 bf000000 -> bf800000", + "bf000000 bf800000 40000000 -> bf920000", + "bf000000 bf800000 c0000000 -> bf800000", + "bf000000 bf800000 40400000 -> bfa5097b", + "bf000000 bf800000 c0300000 -> bf800000", + "bf000000 bf800000 3dcccccd -> bf800000", + "bf000000 3f000000 00000000 -> bf000000", + "bf000000 3f000000 3f800000 -> bf000000", + "bf000000 3f000000 bf800000 -> bf000000", + "bf000000 3f000000 3f000000 -> bf000000", + "bf000000 3f000000 bf000000 -> bf000000", + "bf000000 3f000000 40000000 -> bf0aaaab", + "bf000000 3f000000 c0000000 -> bf000000", + "bf000000 3f000000 40400000 -> bf25ed0a", + "bf000000 3f000000 c0300000 -> bf000000", + "bf000000 3f000000 3dcccccd -> bf000000", + "bf000000 bf000000 00000000 -> bf000000", + "bf000000 bf000000 3f800000 -> bf2aaaab", + "bf000000 bf000000 bf800000 -> bf000000", + "bf000000 bf000000 3f000000 -> bf155555", + "bf000000 bf000000 bf000000 -> bf000000", + "bf000000 bf000000 40000000 -> bf555556", + "bf000000 bf000000 c0000000 -> bf000000", + "bf000000 bf000000 40400000 -> bf800000", + "bf000000 bf000000 c0300000 -> bf000000", + "bf000000 bf000000 3dcccccd -> bf044444", + "bf000000 40000000 00000000 -> bf000000", + "bf000000 40000000 3f800000 -> bf000000", + "bf000000 40000000 bf800000 -> bf000000", + "bf000000 40000000 3f000000 -> bf000000", + "bf000000 40000000 bf000000 -> bf000000", + "bf000000 40000000 40000000 -> bf000000", + "bf000000 40000000 c0000000 -> bf000000", + "bf000000 40000000 40400000 -> bf0097b4", + "bf000000 40000000 c0300000 -> bf000000", + "bf000000 40000000 3dcccccd -> bf000000", + "bf000000 c0000000 00000000 -> c0000000", + "bf000000 c0000000 3f800000 -> c0000000", + "bf000000 c0000000 bf800000 -> c0000000", + "bf000000 c0000000 3f000000 -> c0000000", + "bf000000 c0000000 bf000000 -> c0000000", + "bf000000 c0000000 40000000 -> c0005555", + "bf000000 c0000000 c0000000 -> c0000000", + "bf000000 c0000000 40400000 -> c0040000", + "bf000000 c0000000 c0300000 -> c0000000", + "bf000000 c0000000 3dcccccd -> c0000000", + "bf000000 40400000 00000000 -> bf000000", + "bf000000 40400000 3f800000 -> bf000000", + "bf000000 40400000 bf800000 -> bf000000", + "bf000000 40400000 3f000000 -> bf000000", + "bf000000 40400000 bf000000 -> bf000000", + "bf000000 40400000 40000000 -> bf000000", + "bf000000 40400000 c0000000 -> bf000000", + "bf000000 40400000 40400000 -> bf000000", + "bf000000 40400000 c0300000 -> bf000000", + "bf000000 40400000 3dcccccd -> bf000000", + "bf000000 c0300000 00000000 -> c0300000", + "bf000000 c0300000 3f800000 -> c0300000", + "bf000000 c0300000 bf800000 -> c0300000", + "bf000000 c0300000 3f000000 -> c0300000", + "bf000000 c0300000 bf000000 -> c0300000", + "bf000000 c0300000 40000000 -> c0300000", + "bf000000 c0300000 c0000000 -> c0300000", + "bf000000 c0300000 40400000 -> c0308000", + "bf000000 c0300000 c0300000 -> c0300000", + "bf000000 c0300000 3dcccccd -> c0300000", + "bf000000 3dcccccd 00000000 -> bf000000", + "bf000000 3dcccccd 3f800000 -> bf02bb0d", + "bf000000 3dcccccd bf800000 -> bf000000", + "bf000000 3dcccccd 3f000000 -> bf000000", + "bf000000 3dcccccd bf000000 -> bf000000", + "bf000000 3dcccccd 40000000 -> bf1d44f3", + "bf000000 3dcccccd c0000000 -> bf000000", + "bf000000 3dcccccd 40400000 -> bf418938", + "bf000000 3dcccccd c0300000 -> bf000000", + "bf000000 3dcccccd 3dcccccd -> bf000000", + "40000000 00000000 00000000 -> 00000000", + "40000000 00000000 3f800000 -> 00000000", + "40000000 00000000 bf800000 -> 00000000", + "40000000 00000000 3f000000 -> 00000000", + "40000000 00000000 bf000000 -> 00000000", + "40000000 00000000 40000000 -> 00000000", + "40000000 00000000 c0000000 -> 00000000", + "40000000 00000000 40400000 -> bc97b427", + "40000000 00000000 c0300000 -> 00000000", + "40000000 00000000 3dcccccd -> 00000000", + "40000000 3f800000 00000000 -> 3f800000", + "40000000 3f800000 3f800000 -> 3f800000", + "40000000 3f800000 bf800000 -> 3f800000", + "40000000 3f800000 3f000000 -> 3f800000", + "40000000 3f800000 bf000000 -> 3f800000", + "40000000 3f800000 40000000 -> 3f755555", + "40000000 3f800000 c0000000 -> 3f800000", + "40000000 3f800000 40400000 -> 3f5a12f6", + "40000000 3f800000 c0300000 -> 3f800000", + "40000000 3f800000 3dcccccd -> 3f800000", + "40000000 bf800000 00000000 -> bf800000", + "40000000 bf800000 3f800000 -> bf800000", + "40000000 bf800000 bf800000 -> bf800000", + "40000000 bf800000 3f000000 -> bf800000", + "40000000 bf800000 bf000000 -> bf800000", + "40000000 bf800000 40000000 -> bf800000", + "40000000 bf800000 c0000000 -> bf800000", + "40000000 bf800000 40400000 -> bf800000", + "40000000 bf800000 c0300000 -> bf800000", + "40000000 bf800000 3dcccccd -> bf800000", + "40000000 3f000000 00000000 -> 3f000000", + "40000000 3f000000 3f800000 -> 3f000000", + "40000000 3f000000 bf800000 -> 3f000000", + "40000000 3f000000 3f000000 -> 3f000000", + "40000000 3f000000 bf000000 -> 3f000000", + "40000000 3f000000 40000000 -> 3efd5555", + "40000000 3f000000 c0000000 -> 3f000000", + "40000000 3f000000 40400000 -> 3ee00000", + "40000000 3f000000 c0300000 -> 3f000000", + "40000000 3f000000 3dcccccd -> 3f000000", + "40000000 bf000000 00000000 -> bf000000", + "40000000 bf000000 3f800000 -> bf000000", + "40000000 bf000000 bf800000 -> bf000000", + "40000000 bf000000 3f000000 -> bf000000", + "40000000 bf000000 bf000000 -> bf000000", + "40000000 bf000000 40000000 -> bf000000", + "40000000 bf000000 c0000000 -> bf000000", + "40000000 bf000000 40400000 -> bf0097b4", + "40000000 bf000000 c0300000 -> bf000000", + "40000000 bf000000 3dcccccd -> bf000000", + "40000000 40000000 00000000 -> 40000000", + "40000000 40000000 3f800000 -> 3feaaaab", + "40000000 40000000 bf800000 -> 40000000", + "40000000 40000000 3f000000 -> 3ff55555", + "40000000 40000000 bf000000 -> 40000000", + "40000000 40000000 40000000 -> 3fd55555", + "40000000 40000000 c0000000 -> 40000000", + "40000000 40000000 40400000 -> 3fc00000", + "40000000 40000000 c0300000 -> 40000000", + "40000000 40000000 3dcccccd -> 3ffdddde", + "40000000 c0000000 00000000 -> c0000000", + "40000000 c0000000 3f800000 -> c0000000", + "40000000 c0000000 bf800000 -> c0000000", + "40000000 c0000000 3f000000 -> c0000000", + "40000000 c0000000 bf000000 -> c0000000", + "40000000 c0000000 40000000 -> c0000000", + "40000000 c0000000 c0000000 -> c0000000", + "40000000 c0000000 40400000 -> c0000000", + "40000000 c0000000 c0300000 -> c0000000", + "40000000 c0000000 3dcccccd -> c0000000", + "40000000 40400000 00000000 -> 40000000", + "40000000 40400000 3f800000 -> 40000000", + "40000000 40400000 bf800000 -> 40000000", + "40000000 40400000 3f000000 -> 40000000", + "40000000 40400000 bf000000 -> 40000000", + "40000000 40400000 40000000 -> 3ffaaaab", + "40000000 40400000 c0000000 -> 40000000", + "40000000 40400000 40400000 -> 3fed097b", + "40000000 40400000 c0300000 -> 40000000", + "40000000 40400000 3dcccccd -> 40000000", + "40000000 c0300000 00000000 -> c0300000", + "40000000 c0300000 3f800000 -> c0300000", + "40000000 c0300000 bf800000 -> c0300000", + "40000000 c0300000 3f000000 -> c0300000", + "40000000 c0300000 bf000000 -> c0300000", + "40000000 c0300000 40000000 -> c0300000", + "40000000 c0300000 c0000000 -> c0300000", + "40000000 c0300000 40400000 -> c0300000", + "40000000 c0300000 c0300000 -> c0300000", + "40000000 c0300000 3dcccccd -> c0300000", + "40000000 3dcccccd 00000000 -> 3dcccccd", + "40000000 3dcccccd 3f800000 -> 3dcccccd", + "40000000 3dcccccd bf800000 -> 3dcccccd", + "40000000 3dcccccd 3f000000 -> 3dcccccd", + "40000000 3dcccccd bf000000 -> 3dcccccd", + "40000000 3dcccccd 40000000 -> 3dccb6f5", + "40000000 3dcccccd c0000000 -> 3dcccccd", + "40000000 3dcccccd 40400000 -> 3d9a5212", + "40000000 3dcccccd c0300000 -> 3dcccccd", + "40000000 3dcccccd 3dcccccd -> 3dcccccd", + "c0000000 00000000 00000000 -> c0000000", + "c0000000 00000000 3f800000 -> c0000000", + "c0000000 00000000 bf800000 -> c0000000", + "c0000000 00000000 3f000000 -> c0000000", + "c0000000 00000000 bf000000 -> c0000000", + "c0000000 00000000 40000000 -> c0000000", + "c0000000 00000000 c0000000 -> c0000000", + "c0000000 00000000 40400000 -> c0012f68", + "c0000000 00000000 c0300000 -> c0000000", + "c0000000 00000000 3dcccccd -> c0000000", + "c0000000 3f800000 00000000 -> c0000000", + "c0000000 3f800000 3f800000 -> c0000000", + "c0000000 3f800000 bf800000 -> c0000000", + "c0000000 3f800000 3f000000 -> c0000000", + "c0000000 3f800000 bf000000 -> c0000000", + "c0000000 3f800000 40000000 -> c0000000", + "c0000000 3f800000 c0000000 -> c0000000", + "c0000000 3f800000 40400000 -> c0000000", + "c0000000 3f800000 c0300000 -> c0000000", + "c0000000 3f800000 3dcccccd -> c0000000", + "c0000000 bf800000 00000000 -> c0000000", + "c0000000 bf800000 3f800000 -> c0000000", + "c0000000 bf800000 bf800000 -> c0000000", + "c0000000 bf800000 3f000000 -> c0000000", + "c0000000 bf800000 bf000000 -> c0000000", + "c0000000 bf800000 40000000 -> c002aaab", + "c0000000 bf800000 c0000000 -> c0000000", + "c0000000 bf800000 40400000 -> c0097b42", + "c0000000 bf800000 c0300000 -> c0000000", + "c0000000 bf800000 3dcccccd -> c0000000", + "c0000000 3f000000 00000000 -> c0000000", + "c0000000 3f000000 3f800000 -> c0000000", + "c0000000 3f000000 bf800000 -> c0000000", + "c0000000 3f000000 3f000000 -> c0000000", + "c0000000 3f000000 bf000000 -> c0000000", + "c0000000 3f000000 40000000 -> c0000000", + "c0000000 3f000000 c0000000 -> c0000000", + "c0000000 3f000000 40400000 -> c00025ed", + "c0000000 3f000000 c0300000 -> c0000000", + "c0000000 3f000000 3dcccccd -> c0000000", + "c0000000 bf000000 00000000 -> c0000000", + "c0000000 bf000000 3f800000 -> c0000000", + "c0000000 bf000000 bf800000 -> c0000000", + "c0000000 bf000000 3f000000 -> c0000000", + "c0000000 bf000000 bf000000 -> c0000000", + "c0000000 bf000000 40000000 -> c0005555", + "c0000000 bf000000 c0000000 -> c0000000", + "c0000000 bf000000 40400000 -> c0040000", + "c0000000 bf000000 c0300000 -> c0000000", + "c0000000 bf000000 3dcccccd -> c0000000", + "c0000000 40000000 00000000 -> c0000000", + "c0000000 40000000 3f800000 -> c0000000", + "c0000000 40000000 bf800000 -> c0000000", + "c0000000 40000000 3f000000 -> c0000000", + "c0000000 40000000 bf000000 -> c0000000", + "c0000000 40000000 40000000 -> c0000000", + "c0000000 40000000 c0000000 -> c0000000", + "c0000000 40000000 40400000 -> c0000000", + "c0000000 40000000 c0300000 -> c0000000", + "c0000000 40000000 3dcccccd -> c0000000", + "c0000000 c0000000 00000000 -> c0000000", + "c0000000 c0000000 3f800000 -> c00aaaab", + "c0000000 c0000000 bf800000 -> c0000000", + "c0000000 c0000000 3f000000 -> c0055555", + "c0000000 c0000000 bf000000 -> c0000000", + "c0000000 c0000000 40000000 -> c0155555", + "c0000000 c0000000 c0000000 -> c0000000", + "c0000000 c0000000 40400000 -> c0200000", + "c0000000 c0000000 c0300000 -> c0000000", + "c0000000 c0000000 3dcccccd -> c0011111", + "c0000000 40400000 00000000 -> c0000000", + "c0000000 40400000 3f800000 -> c0000000", + "c0000000 40400000 bf800000 -> c0000000", + "c0000000 40400000 3f000000 -> c0000000", + "c0000000 40400000 bf000000 -> c0000000", + "c0000000 40400000 40000000 -> c0000000", + "c0000000 40400000 c0000000 -> c0000000", + "c0000000 40400000 40400000 -> c0000000", + "c0000000 40400000 c0300000 -> c0000000", + "c0000000 40400000 3dcccccd -> c0000000", + "c0000000 c0300000 00000000 -> c0300000", + "c0000000 c0300000 3f800000 -> c0302aab", + "c0000000 c0300000 bf800000 -> c0300000", + "c0000000 c0300000 3f000000 -> c0300000", + "c0000000 c0300000 bf000000 -> c0300000", + "c0000000 c0300000 40000000 -> c0353555", + "c0000000 c0300000 c0000000 -> c0300000", + "c0000000 c0300000 40400000 -> c03d8000", + "c0000000 c0300000 c0300000 -> c0300000", + "c0000000 c0300000 3dcccccd -> c0300000", + "c0000000 3dcccccd 00000000 -> c0000000", + "c0000000 3dcccccd 3f800000 -> c0000000", + "c0000000 3dcccccd bf800000 -> c0000000", + "c0000000 3dcccccd 3f000000 -> c0000000", + "c0000000 3dcccccd bf000000 -> c0000000", + "c0000000 3dcccccd 40000000 -> c0000000", + "c0000000 3dcccccd c0000000 -> c0000000", + "c0000000 3dcccccd 40400000 -> c000dd2f", + "c0000000 3dcccccd c0300000 -> c0000000", + "c0000000 3dcccccd 3dcccccd -> c0000000", + "40400000 00000000 00000000 -> 00000000", + "40400000 00000000 3f800000 -> 00000000", + "40400000 00000000 bf800000 -> 00000000", + "40400000 00000000 3f000000 -> 00000000", + "40400000 00000000 bf000000 -> 00000000", + "40400000 00000000 40000000 -> 00000000", + "40400000 00000000 c0000000 -> 00000000", + "40400000 00000000 40400000 -> 00000000", + "40400000 00000000 c0300000 -> 00000000", + "40400000 00000000 3dcccccd -> 00000000", + "40400000 3f800000 00000000 -> 3f800000", + "40400000 3f800000 3f800000 -> 3f800000", + "40400000 3f800000 bf800000 -> 3f800000", + "40400000 3f800000 3f000000 -> 3f800000", + "40400000 3f800000 bf000000 -> 3f800000", + "40400000 3f800000 40000000 -> 3f800000", + "40400000 3f800000 c0000000 -> 3f800000", + "40400000 3f800000 40400000 -> 3f7b425f", + "40400000 3f800000 c0300000 -> 3f800000", + "40400000 3f800000 3dcccccd -> 3f800000", + "40400000 bf800000 00000000 -> bf800000", + "40400000 bf800000 3f800000 -> bf800000", + "40400000 bf800000 bf800000 -> bf800000", + "40400000 bf800000 3f000000 -> bf800000", + "40400000 bf800000 bf000000 -> bf800000", + "40400000 bf800000 40000000 -> bf800000", + "40400000 bf800000 c0000000 -> bf800000", + "40400000 bf800000 40400000 -> bf800000", + "40400000 bf800000 c0300000 -> bf800000", + "40400000 bf800000 3dcccccd -> bf800000", + "40400000 3f000000 00000000 -> 3f000000", + "40400000 3f000000 3f800000 -> 3f000000", + "40400000 3f000000 bf800000 -> 3f000000", + "40400000 3f000000 3f000000 -> 3f000000", + "40400000 3f000000 bf000000 -> 3f000000", + "40400000 3f000000 40000000 -> 3f000000", + "40400000 3f000000 c0000000 -> 3f000000", + "40400000 3f000000 40400000 -> 3efed098", + "40400000 3f000000 c0300000 -> 3f000000", + "40400000 3f000000 3dcccccd -> 3f000000", + "40400000 bf000000 00000000 -> bf000000", + "40400000 bf000000 3f800000 -> bf000000", + "40400000 bf000000 bf800000 -> bf000000", + "40400000 bf000000 3f000000 -> bf000000", + "40400000 bf000000 bf000000 -> bf000000", + "40400000 bf000000 40000000 -> bf000000", + "40400000 bf000000 c0000000 -> bf000000", + "40400000 bf000000 40400000 -> bf000000", + "40400000 bf000000 c0300000 -> bf000000", + "40400000 bf000000 3dcccccd -> bf000000", + "40400000 40000000 00000000 -> 40000000", + "40400000 40000000 3f800000 -> 40000000", + "40400000 40000000 bf800000 -> 40000000", + "40400000 40000000 3f000000 -> 40000000", + "40400000 40000000 bf000000 -> 40000000", + "40400000 40000000 40000000 -> 3ffaaaab", + "40400000 40000000 c0000000 -> 40000000", + "40400000 40000000 40400000 -> 3fed097b", + "40400000 40000000 c0300000 -> 40000000", + "40400000 40000000 3dcccccd -> 40000000", + "40400000 c0000000 00000000 -> c0000000", + "40400000 c0000000 3f800000 -> c0000000", + "40400000 c0000000 bf800000 -> c0000000", + "40400000 c0000000 3f000000 -> c0000000", + "40400000 c0000000 bf000000 -> c0000000", + "40400000 c0000000 40000000 -> c0000000", + "40400000 c0000000 c0000000 -> c0000000", + "40400000 c0000000 40400000 -> c0000000", + "40400000 c0000000 c0300000 -> c0000000", + "40400000 c0000000 3dcccccd -> c0000000", + "40400000 40400000 00000000 -> 40400000", + "40400000 40400000 3f800000 -> 40355555", + "40400000 40400000 bf800000 -> 40400000", + "40400000 40400000 3f000000 -> 403aaaab", + "40400000 40400000 bf000000 -> 40400000", + "40400000 40400000 40000000 -> 402aaaab", + "40400000 40400000 c0000000 -> 40400000", + "40400000 40400000 40400000 -> 40200000", + "40400000 40400000 c0300000 -> 40400000", + "40400000 40400000 3dcccccd -> 403eeeef", + "40400000 c0300000 00000000 -> c0300000", + "40400000 c0300000 3f800000 -> c0300000", + "40400000 c0300000 bf800000 -> c0300000", + "40400000 c0300000 3f000000 -> c0300000", + "40400000 c0300000 bf000000 -> c0300000", + "40400000 c0300000 40000000 -> c0300000", + "40400000 c0300000 c0000000 -> c0300000", + "40400000 c0300000 40400000 -> c0300000", + "40400000 c0300000 c0300000 -> c0300000", + "40400000 c0300000 3dcccccd -> c0300000", + "40400000 3dcccccd 00000000 -> 3dcccccd", + "40400000 3dcccccd 3f800000 -> 3dcccccd", + "40400000 3dcccccd bf800000 -> 3dcccccd", + "40400000 3dcccccd 3f000000 -> 3dcccccd", + "40400000 3dcccccd bf000000 -> 3dcccccd", + "40400000 3dcccccd 40000000 -> 3dcccccd", + "40400000 3dcccccd c0000000 -> 3dcccccd", + "40400000 3dcccccd 40400000 -> 3dccc317", + "40400000 3dcccccd c0300000 -> 3dcccccd", + "40400000 3dcccccd 3dcccccd -> 3dcccccd", + "c0300000 00000000 00000000 -> c0300000", + "c0300000 00000000 3f800000 -> c0300000", + "c0300000 00000000 bf800000 -> c0300000", + "c0300000 00000000 3f000000 -> c0300000", + "c0300000 00000000 bf000000 -> c0300000", + "c0300000 00000000 40000000 -> c0300000", + "c0300000 00000000 c0000000 -> c0300000", + "c0300000 00000000 40400000 -> c03004be", + "c0300000 00000000 c0300000 -> c0300000", + "c0300000 00000000 3dcccccd -> c0300000", + "c0300000 3f800000 00000000 -> c0300000", + "c0300000 3f800000 3f800000 -> c0300000", + "c0300000 3f800000 bf800000 -> c0300000", + "c0300000 3f800000 3f000000 -> c0300000", + "c0300000 3f800000 bf000000 -> c0300000", + "c0300000 3f800000 40000000 -> c0300000", + "c0300000 3f800000 c0000000 -> c0300000", + "c0300000 3f800000 40400000 -> c0300000", + "c0300000 3f800000 c0300000 -> c0300000", + "c0300000 3f800000 3dcccccd -> c0300000", + "c0300000 bf800000 00000000 -> c0300000", + "c0300000 bf800000 3f800000 -> c0300000", + "c0300000 bf800000 bf800000 -> c0300000", + "c0300000 bf800000 3f000000 -> c0300000", + "c0300000 bf800000 bf000000 -> c0300000", + "c0300000 bf800000 40000000 -> c0300aab", + "c0300000 bf800000 c0000000 -> c0300000", + "c0300000 bf800000 40400000 -> c0325098", + "c0300000 bf800000 c0300000 -> c0300000", + "c0300000 bf800000 3dcccccd -> c0300000", + "c0300000 3f000000 00000000 -> c0300000", + "c0300000 3f000000 3f800000 -> c0300000", + "c0300000 3f000000 bf800000 -> c0300000", + "c0300000 3f000000 3f000000 -> c0300000", + "c0300000 3f000000 bf000000 -> c0300000", + "c0300000 3f000000 40000000 -> c0300000", + "c0300000 3f000000 c0000000 -> c0300000", + "c0300000 3f000000 40400000 -> c0300000", + "c0300000 3f000000 c0300000 -> c0300000", + "c0300000 3f000000 3dcccccd -> c0300000", + "c0300000 bf000000 00000000 -> c0300000", + "c0300000 bf000000 3f800000 -> c0300000", + "c0300000 bf000000 bf800000 -> c0300000", + "c0300000 bf000000 3f000000 -> c0300000", + "c0300000 bf000000 bf000000 -> c0300000", + "c0300000 bf000000 40000000 -> c0300000", + "c0300000 bf000000 c0000000 -> c0300000", + "c0300000 bf000000 40400000 -> c0308000", + "c0300000 bf000000 c0300000 -> c0300000", + "c0300000 bf000000 3dcccccd -> c0300000", + "c0300000 40000000 00000000 -> c0300000", + "c0300000 40000000 3f800000 -> c0300000", + "c0300000 40000000 bf800000 -> c0300000", + "c0300000 40000000 3f000000 -> c0300000", + "c0300000 40000000 bf000000 -> c0300000", + "c0300000 40000000 40000000 -> c0300000", + "c0300000 40000000 c0000000 -> c0300000", + "c0300000 40000000 40400000 -> c0300000", + "c0300000 40000000 c0300000 -> c0300000", + "c0300000 40000000 3dcccccd -> c0300000", + "c0300000 c0000000 00000000 -> c0300000", + "c0300000 c0000000 3f800000 -> c0302aab", + "c0300000 c0000000 bf800000 -> c0300000", + "c0300000 c0000000 3f000000 -> c0300000", + "c0300000 c0000000 bf000000 -> c0300000", + "c0300000 c0000000 40000000 -> c0353555", + "c0300000 c0000000 c0000000 -> c0300000", + "c0300000 c0000000 40400000 -> c03d8000", + "c0300000 c0000000 c0300000 -> c0300000", + "c0300000 c0000000 3dcccccd -> c0300000", + "c0300000 40400000 00000000 -> c0300000", + "c0300000 40400000 3f800000 -> c0300000", + "c0300000 40400000 bf800000 -> c0300000", + "c0300000 40400000 3f000000 -> c0300000", + "c0300000 40400000 bf000000 -> c0300000", + "c0300000 40400000 40000000 -> c0300000", + "c0300000 40400000 c0000000 -> c0300000", + "c0300000 40400000 40400000 -> c0300000", + "c0300000 40400000 c0300000 -> c0300000", + "c0300000 40400000 3dcccccd -> c0300000", + "c0300000 c0300000 00000000 -> c0300000", + "c0300000 c0300000 3f800000 -> c03aaaab", + "c0300000 c0300000 bf800000 -> c0300000", + "c0300000 c0300000 3f000000 -> c0355555", + "c0300000 c0300000 bf000000 -> c0300000", + "c0300000 c0300000 40000000 -> c0455555", + "c0300000 c0300000 c0000000 -> c0300000", + "c0300000 c0300000 40400000 -> c0500000", + "c0300000 c0300000 c0300000 -> c0300000", + "c0300000 c0300000 3dcccccd -> c0311111", + "c0300000 3dcccccd 00000000 -> c0300000", + "c0300000 3dcccccd 3f800000 -> c0300000", + "c0300000 3dcccccd bf800000 -> c0300000", + "c0300000 3dcccccd 3f000000 -> c0300000", + "c0300000 3dcccccd bf000000 -> c0300000", + "c0300000 3dcccccd 40000000 -> c0300000", + "c0300000 3dcccccd c0000000 -> c0300000", + "c0300000 3dcccccd 40400000 -> c0300106", + "c0300000 3dcccccd c0300000 -> c0300000", + "c0300000 3dcccccd 3dcccccd -> c0300000", + "3dcccccd 00000000 00000000 -> 00000000", + "3dcccccd 00000000 3f800000 -> bdf8d4fc", + "3dcccccd 00000000 bf800000 -> 00000000", + "3dcccccd 00000000 3f000000 -> bd2ec33f", + "3dcccccd 00000000 bf000000 -> 00000000", + "3dcccccd 00000000 40000000 -> be925349", + "3dcccccd 00000000 c0000000 -> 00000000", + "3dcccccd 00000000 40400000 -> bee73e6e", + "3dcccccd 00000000 c0300000 -> 00000000", + "3dcccccd 00000000 3dcccccd -> 00000000", + "3dcccccd 3f800000 00000000 -> 3dcccccd", + "3dcccccd 3f800000 3f800000 -> 3dcc756b", + "3dcccccd 3f800000 bf800000 -> 3dcccccd", + "3dcccccd 3f800000 3f000000 -> 3dcccccd", + "3dcccccd 3f800000 bf000000 -> 3dcccccd", + "3dcccccd 3f800000 40000000 -> 3d367152", + "3dcccccd 3f800000 c0000000 -> 3dcccccd", + "3dcccccd 3f800000 40400000 -> bd926e99", + "3dcccccd 3f800000 c0300000 -> 3dcccccd", + "3dcccccd 3f800000 3dcccccd -> 3dcccccd", + "3dcccccd bf800000 00000000 -> bf800000", + "3dcccccd bf800000 3f800000 -> bf800000", + "3dcccccd bf800000 bf800000 -> bf800000", + "3dcccccd bf800000 3f000000 -> bf800000", + "3dcccccd bf800000 bf000000 -> bf800000", + "3dcccccd bf800000 40000000 -> bf83e354", + "3dcccccd bf800000 c0000000 -> bf800000", + "3dcccccd bf800000 40400000 -> bf904224", + "3dcccccd bf800000 c0300000 -> bf800000", + "3dcccccd bf800000 3dcccccd -> bf800000", + "3dcccccd 3f000000 00000000 -> 3dcccccd", + "3dcccccd 3f000000 3f800000 -> 3d83126e", + "3dcccccd 3f000000 bf800000 -> 3dcccccd", + "3dcccccd 3f000000 3f000000 -> 3dcb6f47", + "3dcccccd 3f000000 bf000000 -> 3dcccccd", + "3dcccccd 3f000000 40000000 -> bd90b9b1", + "3dcccccd 3f000000 c0000000 -> 3dcccccd", + "3dcccccd 3f000000 40400000 -> be66e49a", + "3dcccccd 3f000000 c0300000 -> 3dcccccd", + "3dcccccd 3f000000 3dcccccd -> 3dcccccd", + "3dcccccd bf000000 00000000 -> bf000000", + "3dcccccd bf000000 3f800000 -> bf02bb0d", + "3dcccccd bf000000 bf800000 -> bf000000", + "3dcccccd bf000000 3f000000 -> bf000000", + "3dcccccd bf000000 bf000000 -> bf000000", + "3dcccccd bf000000 40000000 -> bf1d44f3", + "3dcccccd bf000000 c0000000 -> bf000000", + "3dcccccd bf000000 40400000 -> bf418938", + "3dcccccd bf000000 c0300000 -> bf000000", + "3dcccccd bf000000 3dcccccd -> bf000000", + "3dcccccd 40000000 00000000 -> 3dcccccd", + "3dcccccd 40000000 3f800000 -> 3dcccccd", + "3dcccccd 40000000 bf800000 -> 3dcccccd", + "3dcccccd 40000000 3f000000 -> 3dcccccd", + "3dcccccd 40000000 bf000000 -> 3dcccccd", + "3dcccccd 40000000 40000000 -> 3dccb6f5", + "3dcccccd 40000000 c0000000 -> 3dcccccd", + "3dcccccd 40000000 40400000 -> 3d9a5212", + "3dcccccd 40000000 c0300000 -> 3dcccccd", + "3dcccccd 40000000 3dcccccd -> 3dcccccd", + "3dcccccd c0000000 00000000 -> c0000000", + "3dcccccd c0000000 3f800000 -> c0000000", + "3dcccccd c0000000 bf800000 -> c0000000", + "3dcccccd c0000000 3f000000 -> c0000000", + "3dcccccd c0000000 bf000000 -> c0000000", + "3dcccccd c0000000 40000000 -> c0000000", + "3dcccccd c0000000 c0000000 -> c0000000", + "3dcccccd c0000000 40400000 -> c000dd2f", + "3dcccccd c0000000 c0300000 -> c0000000", + "3dcccccd c0000000 3dcccccd -> c0000000", + "3dcccccd 40400000 00000000 -> 3dcccccd", + "3dcccccd 40400000 3f800000 -> 3dcccccd", + "3dcccccd 40400000 bf800000 -> 3dcccccd", + "3dcccccd 40400000 3f000000 -> 3dcccccd", + "3dcccccd 40400000 bf000000 -> 3dcccccd", + "3dcccccd 40400000 40000000 -> 3dcccccd", + "3dcccccd 40400000 c0000000 -> 3dcccccd", + "3dcccccd 40400000 40400000 -> 3dccc317", + "3dcccccd 40400000 c0300000 -> 3dcccccd", + "3dcccccd 40400000 3dcccccd -> 3dcccccd", + "3dcccccd c0300000 00000000 -> c0300000", + "3dcccccd c0300000 3f800000 -> c0300000", + "3dcccccd c0300000 bf800000 -> c0300000", + "3dcccccd c0300000 3f000000 -> c0300000", + "3dcccccd c0300000 bf000000 -> c0300000", + "3dcccccd c0300000 40000000 -> c0300000", + "3dcccccd c0300000 c0000000 -> c0300000", + "3dcccccd c0300000 40400000 -> c0300106", + "3dcccccd c0300000 c0300000 -> c0300000", + "3dcccccd c0300000 3dcccccd -> c0300000", + "3dcccccd 3dcccccd 00000000 -> 3dcccccd", + "3dcccccd 3dcccccd 3f800000 -> bd888889", + "3dcccccd 3dcccccd bf800000 -> 3dcccccd", + "3dcccccd 3dcccccd 3f000000 -> 3c888888", + "3dcccccd 3dcccccd bf000000 -> 3dcccccd", + "3dcccccd 3dcccccd 40000000 -> be6eeef0", + "3dcccccd 3dcccccd c0000000 -> 3dcccccd", + "3dcccccd 3dcccccd 40400000 -> becccccd", + "3dcccccd 3dcccccd c0300000 -> 3dcccccd", + "3dcccccd 3dcccccd 3dcccccd -> 3daaaaab", + "418ecc92 c18b876f be8298ae -> c18b876f", + "41994d68 c14d0aae bff2e1b9 -> c14d0aae", + "40142d39 c0fb6ea1 400f73cd -> c0fb6ea1", + "c09cad7a 41747dd9 c024cc47 -> c09cad7a", + "c0fd68b6 413d677a bec46f4f -> c0fd68b6", + "c199defb c13e00f2 c0140970 -> c199defb", + "412c312b c101f505 3ed2b28c -> c101f505", + "beb05e0b 415cb8e7 bf0f69d8 -> beb05e0b", + "3e6a80e4 405a32ae bfa00d9a -> 3e6a80e4", + "412af003 c0b6aa92 beed5628 -> c0b6aa92", + "40e5d8f6 41802292 3f70a78a -> 40e5d8f6", + "4180468a 4172e8a3 c02c8e8a -> 4172e8a3", + "c14e0a8c c12b12c5 bf811b03 -> c14e0a8c", + "412e8e58 c1182903 3ef196c8 -> c1182903", + "c15559be 417a7143 403c2aa3 -> c15559be", + "3f9e491f c19cf430 bf9d77e0 -> c19cf430", + "c1052b78 c10c7ab2 c00d7889 -> c10c7ab2", + "41920817 40d7e722 bb82aac2 -> 40d7e722", + "40dd719c 40e2c37a 4038ead9 -> 40d08b36", + "c17b7221 c0ba83b1 3f807b11 -> c17b7221", + "416706c2 c13befb9 c00b5b49 -> c13befb9", + "c15e7670 c15d3929 3f524ce1 -> c1601717", + "40832539 3f62b803 bf30cbe4 -> 3f62b803", + "c1699300 4024ec7b 401cdf89 -> c1699300" + ] + }, + { + "function": "cycles_smooth_max", + "node": "ShaderNodeMath SMOOTH_MAX", + "cases": [ + "00000000 00000000 00000000 -> 00000000", + "00000000 00000000 3f800000 -> 3e2aaaab", + "00000000 00000000 bf800000 -> 00000000", + "00000000 00000000 3f000000 -> 3daaaaab", + "00000000 00000000 bf000000 -> 00000000", + "00000000 00000000 40000000 -> 3eaaaaab", + "00000000 00000000 c0000000 -> 00000000", + "00000000 00000000 40400000 -> 3f000000", + "00000000 00000000 c0300000 -> 00000000", + "00000000 00000000 3dcccccd -> 3c888889", + "00000000 3f800000 00000000 -> 3f800000", + "00000000 3f800000 3f800000 -> 3f800000", + "00000000 3f800000 bf800000 -> 3f800000", + "00000000 3f800000 3f000000 -> 3f800000", + "00000000 3f800000 bf000000 -> 3f800000", + "00000000 3f800000 40000000 -> 3f855555", + "00000000 3f800000 c0000000 -> 3f800000", + "00000000 3f800000 40400000 -> 3f92f685", + "00000000 3f800000 c0300000 -> 3f800000", + "00000000 3f800000 3dcccccd -> 3f800000", + "00000000 bf800000 00000000 -> 00000000", + "00000000 bf800000 3f800000 -> 00000000", + "00000000 bf800000 bf800000 -> 00000000", + "00000000 bf800000 3f000000 -> 00000000", + "00000000 bf800000 bf000000 -> 00000000", + "00000000 bf800000 40000000 -> 3d2aaaab", + "00000000 bf800000 c0000000 -> 00000000", + "00000000 bf800000 40400000 -> 3e17b427", + "00000000 bf800000 c0300000 -> 00000000", + "00000000 bf800000 3dcccccd -> 00000000", + "00000000 3f000000 00000000 -> 3f000000", + "00000000 3f000000 3f800000 -> 3f055555", + "00000000 3f000000 bf800000 -> 3f000000", + "00000000 3f000000 3f000000 -> 3f000000", + "00000000 3f000000 bf000000 -> 3f000000", + "00000000 3f000000 40000000 -> 3f240000", + "00000000 3f000000 c0000000 -> 3f000000", + "00000000 3f000000 40400000 -> 3f4a12f6", + "00000000 3f000000 c0300000 -> 3f000000", + "00000000 3f000000 3dcccccd -> 3f000000", + "00000000 bf000000 00000000 -> 00000000", + "00000000 bf000000 3f800000 -> 3caaaaab", + "00000000 bf000000 bf800000 -> 00000000", + "00000000 bf000000 3f000000 -> 00000000", + "00000000 bf000000 bf000000 -> 00000000", + "00000000 bf000000 40000000 -> 3e100000", + "00000000 bf000000 c0000000 -> 00000000", + "00000000 bf000000 40400000 -> 3e9425ec", + "00000000 bf000000 c0300000 -> 00000000", + "00000000 bf000000 3dcccccd -> 00000000", + "00000000 40000000 00000000 -> 40000000", + "00000000 40000000 3f800000 -> 40000000", + "00000000 40000000 bf800000 -> 40000000", + "00000000 40000000 3f000000 -> 40000000", + "00000000 40000000 bf000000 -> 40000000", + "00000000 40000000 40000000 -> 40000000", + "00000000 40000000 c0000000 -> 40000000", + "00000000 40000000 40400000 -> 40012f68", + "00000000 40000000 c0300000 -> 40000000", + "00000000 40000000 3dcccccd -> 40000000", + "00000000 c0000000 00000000 -> 00000000", + "00000000 c0000000 3f800000 -> 00000000", + "00000000 c0000000 bf800000 -> 00000000", + "00000000 c0000000 3f000000 -> 00000000", + "00000000 c0000000 bf000000 -> 00000000", + "00000000 c0000000 40000000 -> 00000000", + "00000000 c0000000 c0000000 -> 00000000", + "00000000 c0000000 40400000 -> 3c97b427", + "00000000 c0000000 c0300000 -> 00000000", + "00000000 c0000000 3dcccccd -> 00000000", + "00000000 40400000 00000000 -> 40400000", + "00000000 40400000 3f800000 -> 40400000", + "00000000 40400000 bf800000 -> 40400000", + "00000000 40400000 3f000000 -> 40400000", + "00000000 40400000 bf000000 -> 40400000", + "00000000 40400000 40000000 -> 40400000", + "00000000 40400000 c0000000 -> 40400000", + "00000000 40400000 40400000 -> 40400000", + "00000000 40400000 c0300000 -> 40400000", + "00000000 40400000 3dcccccd -> 40400000", + "00000000 c0300000 00000000 -> 00000000", + "00000000 c0300000 3f800000 -> 00000000", + "00000000 c0300000 bf800000 -> 00000000", + "00000000 c0300000 3f000000 -> 00000000", + "00000000 c0300000 bf000000 -> 00000000", + "00000000 c0300000 40000000 -> 00000000", + "00000000 c0300000 c0000000 -> 00000000", + "00000000 c0300000 40400000 -> 3997b427", + "00000000 c0300000 c0300000 -> 00000000", + "00000000 c0300000 3dcccccd -> 00000000", + "00000000 3dcccccd 00000000 -> 3dcccccd", + "00000000 3dcccccd 3f800000 -> 3e62d0e4", + "00000000 3dcccccd bf800000 -> 3dcccccd", + "00000000 3dcccccd 3f000000 -> 3e121736", + "00000000 3dcccccd bf000000 -> 3dcccccd", + "00000000 3dcccccd 40000000 -> 3ec5867c", + "00000000 3dcccccd c0000000 -> 3dcccccd", + "00000000 3dcccccd 40400000 -> 3f0d38d1", + "00000000 3dcccccd c0300000 -> 3dcccccd", + "00000000 3dcccccd 3dcccccd -> 3dcccccd", + "3f800000 00000000 00000000 -> 3f800000", + "3f800000 00000000 3f800000 -> 3f800000", + "3f800000 00000000 bf800000 -> 3f800000", + "3f800000 00000000 3f000000 -> 3f800000", + "3f800000 00000000 bf000000 -> 3f800000", + "3f800000 00000000 40000000 -> 3f855555", + "3f800000 00000000 c0000000 -> 3f800000", + "3f800000 00000000 40400000 -> 3f92f685", + "3f800000 00000000 c0300000 -> 3f800000", + "3f800000 00000000 3dcccccd -> 3f800000", + "3f800000 3f800000 00000000 -> 3f800000", + "3f800000 3f800000 3f800000 -> 3f955555", + "3f800000 3f800000 bf800000 -> 3f800000", + "3f800000 3f800000 3f000000 -> 3f8aaaab", + "3f800000 3f800000 bf000000 -> 3f800000", + "3f800000 3f800000 40000000 -> 3faaaaab", + "3f800000 3f800000 c0000000 -> 3f800000", + "3f800000 3f800000 40400000 -> 3fc00000", + "3f800000 3f800000 c0300000 -> 3f800000", + "3f800000 3f800000 3dcccccd -> 3f822222", + "3f800000 bf800000 00000000 -> 3f800000", + "3f800000 bf800000 3f800000 -> 3f800000", + "3f800000 bf800000 bf800000 -> 3f800000", + "3f800000 bf800000 3f000000 -> 3f800000", + "3f800000 bf800000 bf000000 -> 3f800000", + "3f800000 bf800000 40000000 -> 3f800000", + "3f800000 bf800000 c0000000 -> 3f800000", + "3f800000 bf800000 40400000 -> 3f825ed1", + "3f800000 bf800000 c0300000 -> 3f800000", + "3f800000 bf800000 3dcccccd -> 3f800000", + "3f800000 3f000000 00000000 -> 3f800000", + "3f800000 3f000000 3f800000 -> 3f82aaab", + "3f800000 3f000000 bf800000 -> 3f800000", + "3f800000 3f000000 3f000000 -> 3f800000", + "3f800000 3f000000 bf000000 -> 3f800000", + "3f800000 3f000000 40000000 -> 3f920000", + "3f800000 3f000000 c0000000 -> 3f800000", + "3f800000 3f000000 40400000 -> 3fa5097b", + "3f800000 3f000000 c0300000 -> 3f800000", + "3f800000 3f000000 3dcccccd -> 3f800000", + "3f800000 bf000000 00000000 -> 3f800000", + "3f800000 bf000000 3f800000 -> 3f800000", + "3f800000 bf000000 bf800000 -> 3f800000", + "3f800000 bf000000 3f000000 -> 3f800000", + "3f800000 bf000000 bf000000 -> 3f800000", + "3f800000 bf000000 40000000 -> 3f80aaab", + "3f800000 bf000000 c0000000 -> 3f800000", + "3f800000 bf000000 40400000 -> 3f880000", + "3f800000 bf000000 c0300000 -> 3f800000", + "3f800000 bf000000 3dcccccd -> 3f800000", + "3f800000 40000000 00000000 -> 40000000", + "3f800000 40000000 3f800000 -> 40000000", + "3f800000 40000000 bf800000 -> 40000000", + "3f800000 40000000 3f000000 -> 40000000", + "3f800000 40000000 bf000000 -> 40000000", + "3f800000 40000000 40000000 -> 4002aaab", + "3f800000 40000000 c0000000 -> 40000000", + "3f800000 40000000 40400000 -> 40097b42", + "3f800000 40000000 c0300000 -> 40000000", + "3f800000 40000000 3dcccccd -> 40000000", + "3f800000 c0000000 00000000 -> 3f800000", + "3f800000 c0000000 3f800000 -> 3f800000", + "3f800000 c0000000 bf800000 -> 3f800000", + "3f800000 c0000000 3f000000 -> 3f800000", + "3f800000 c0000000 bf000000 -> 3f800000", + "3f800000 c0000000 40000000 -> 3f800000", + "3f800000 c0000000 c0000000 -> 3f800000", + "3f800000 c0000000 40400000 -> 3f800000", + "3f800000 c0000000 c0300000 -> 3f800000", + "3f800000 c0000000 3dcccccd -> 3f800000", + "3f800000 40400000 00000000 -> 40400000", + "3f800000 40400000 3f800000 -> 40400000", + "3f800000 40400000 bf800000 -> 40400000", + "3f800000 40400000 3f000000 -> 40400000", + "3f800000 40400000 bf000000 -> 40400000", + "3f800000 40400000 40000000 -> 40400000", + "3f800000 40400000 c0000000 -> 40400000", + "3f800000 40400000 40400000 -> 40412f68", + "3f800000 40400000 c0300000 -> 40400000", + "3f800000 40400000 3dcccccd -> 40400000", + "3f800000 c0300000 00000000 -> 3f800000", + "3f800000 c0300000 3f800000 -> 3f800000", + "3f800000 c0300000 bf800000 -> 3f800000", + "3f800000 c0300000 3f000000 -> 3f800000", + "3f800000 c0300000 bf000000 -> 3f800000", + "3f800000 c0300000 40000000 -> 3f800000", + "3f800000 c0300000 c0000000 -> 3f800000", + "3f800000 c0300000 40400000 -> 3f800000", + "3f800000 c0300000 c0300000 -> 3f800000", + "3f800000 c0300000 3dcccccd -> 3f800000", + "3f800000 3dcccccd 00000000 -> 3f800000", + "3f800000 3dcccccd 3f800000 -> 3f800576", + "3f800000 3dcccccd bf800000 -> 3f800000", + "3f800000 3dcccccd 3f000000 -> 3f800000", + "3f800000 3dcccccd bf000000 -> 3f800000", + "3f800000 3dcccccd 40000000 -> 3f871942", + "3f800000 3dcccccd c0000000 -> 3f800000", + "3f800000 3dcccccd 40400000 -> 3f95f3b6", + "3f800000 3dcccccd c0300000 -> 3f800000", + "3f800000 3dcccccd 3dcccccd -> 3f800000", + "bf800000 00000000 00000000 -> 00000000", + "bf800000 00000000 3f800000 -> 00000000", + "bf800000 00000000 bf800000 -> 00000000", + "bf800000 00000000 3f000000 -> 00000000", + "bf800000 00000000 bf000000 -> 00000000", + "bf800000 00000000 40000000 -> 3d2aaaab", + "bf800000 00000000 c0000000 -> 00000000", + "bf800000 00000000 40400000 -> 3e17b427", + "bf800000 00000000 c0300000 -> 00000000", + "bf800000 00000000 3dcccccd -> 00000000", + "bf800000 3f800000 00000000 -> 3f800000", + "bf800000 3f800000 3f800000 -> 3f800000", + "bf800000 3f800000 bf800000 -> 3f800000", + "bf800000 3f800000 3f000000 -> 3f800000", + "bf800000 3f800000 bf000000 -> 3f800000", + "bf800000 3f800000 40000000 -> 3f800000", + "bf800000 3f800000 c0000000 -> 3f800000", + "bf800000 3f800000 40400000 -> 3f825ed1", + "bf800000 3f800000 c0300000 -> 3f800000", + "bf800000 3f800000 3dcccccd -> 3f800000", + "bf800000 bf800000 00000000 -> bf800000", + "bf800000 bf800000 3f800000 -> bf555555", + "bf800000 bf800000 bf800000 -> bf800000", + "bf800000 bf800000 3f000000 -> bf6aaaab", + "bf800000 bf800000 bf000000 -> bf800000", + "bf800000 bf800000 40000000 -> bf2aaaaa", + "bf800000 bf800000 c0000000 -> bf800000", + "bf800000 bf800000 40400000 -> bf000000", + "bf800000 bf800000 c0300000 -> bf800000", + "bf800000 bf800000 3dcccccd -> bf7bbbbc", + "bf800000 3f000000 00000000 -> 3f000000", + "bf800000 3f000000 3f800000 -> 3f000000", + "bf800000 3f000000 bf800000 -> 3f000000", + "bf800000 3f000000 3f000000 -> 3f000000", + "bf800000 3f000000 bf000000 -> 3f000000", + "bf800000 3f000000 40000000 -> 3f015555", + "bf800000 3f000000 c0000000 -> 3f000000", + "bf800000 3f000000 40400000 -> 3f100000", + "bf800000 3f000000 c0300000 -> 3f000000", + "bf800000 3f000000 3dcccccd -> 3f000000", + "bf800000 bf000000 00000000 -> bf000000", + "bf800000 bf000000 3f800000 -> bef55555", + "bf800000 bf000000 bf800000 -> bf000000", + "bf800000 bf000000 3f000000 -> bf000000", + "bf800000 bf000000 bf000000 -> bf000000", + "bf800000 bf000000 40000000 -> beb80000", + "bf800000 bf000000 c0000000 -> bf000000", + "bf800000 bf000000 40400000 -> be57b428", + "bf800000 bf000000 c0300000 -> bf000000", + "bf800000 bf000000 3dcccccd -> bf000000", + "bf800000 40000000 00000000 -> 40000000", + "bf800000 40000000 3f800000 -> 40000000", + "bf800000 40000000 bf800000 -> 40000000", + "bf800000 40000000 3f000000 -> 40000000", + "bf800000 40000000 bf000000 -> 40000000", + "bf800000 40000000 40000000 -> 40000000", + "bf800000 40000000 c0000000 -> 40000000", + "bf800000 40000000 40400000 -> 40000000", + "bf800000 40000000 c0300000 -> 40000000", + "bf800000 40000000 3dcccccd -> 40000000", + "bf800000 c0000000 00000000 -> bf800000", + "bf800000 c0000000 3f800000 -> bf800000", + "bf800000 c0000000 bf800000 -> bf800000", + "bf800000 c0000000 3f000000 -> bf800000", + "bf800000 c0000000 bf000000 -> bf800000", + "bf800000 c0000000 40000000 -> bf755555", + "bf800000 c0000000 c0000000 -> bf800000", + "bf800000 c0000000 40400000 -> bf5a12f6", + "bf800000 c0000000 c0300000 -> bf800000", + "bf800000 c0000000 3dcccccd -> bf800000", + "bf800000 40400000 00000000 -> 40400000", + "bf800000 40400000 3f800000 -> 40400000", + "bf800000 40400000 bf800000 -> 40400000", + "bf800000 40400000 3f000000 -> 40400000", + "bf800000 40400000 bf000000 -> 40400000", + "bf800000 40400000 40000000 -> 40400000", + "bf800000 40400000 c0000000 -> 40400000", + "bf800000 40400000 40400000 -> 40400000", + "bf800000 40400000 c0300000 -> 40400000", + "bf800000 40400000 3dcccccd -> 40400000", + "bf800000 c0300000 00000000 -> bf800000", + "bf800000 c0300000 3f800000 -> bf800000", + "bf800000 c0300000 bf800000 -> bf800000", + "bf800000 c0300000 3f000000 -> bf800000", + "bf800000 c0300000 bf000000 -> bf800000", + "bf800000 c0300000 40000000 -> bf7fd555", + "bf800000 c0300000 c0000000 -> bf800000", + "bf800000 c0300000 40400000 -> bf76bda1", + "bf800000 c0300000 c0300000 -> bf800000", + "bf800000 c0300000 3dcccccd -> bf800000", + "bf800000 3dcccccd 00000000 -> 3dcccccd", + "bf800000 3dcccccd 3f800000 -> 3dcccccd", + "bf800000 3dcccccd bf800000 -> 3dcccccd", + "bf800000 3dcccccd 3f000000 -> 3dcccccd", + "bf800000 3dcccccd bf000000 -> 3dcccccd", + "bf800000 3dcccccd 40000000 -> 3e058106", + "bf800000 3dcccccd c0000000 -> 3dcccccd", + "bf800000 3dcccccd 40400000 -> 3e68778a", + "bf800000 3dcccccd c0300000 -> 3dcccccd", + "bf800000 3dcccccd 3dcccccd -> 3dcccccd", + "3f000000 00000000 00000000 -> 3f000000", + "3f000000 00000000 3f800000 -> 3f055555", + "3f000000 00000000 bf800000 -> 3f000000", + "3f000000 00000000 3f000000 -> 3f000000", + "3f000000 00000000 bf000000 -> 3f000000", + "3f000000 00000000 40000000 -> 3f240000", + "3f000000 00000000 c0000000 -> 3f000000", + "3f000000 00000000 40400000 -> 3f4a12f6", + "3f000000 00000000 c0300000 -> 3f000000", + "3f000000 00000000 3dcccccd -> 3f000000", + "3f000000 3f800000 00000000 -> 3f800000", + "3f000000 3f800000 3f800000 -> 3f82aaab", + "3f000000 3f800000 bf800000 -> 3f800000", + "3f000000 3f800000 3f000000 -> 3f800000", + "3f000000 3f800000 bf000000 -> 3f800000", + "3f000000 3f800000 40000000 -> 3f920000", + "3f000000 3f800000 c0000000 -> 3f800000", + "3f000000 3f800000 40400000 -> 3fa5097b", + "3f000000 3f800000 c0300000 -> 3f800000", + "3f000000 3f800000 3dcccccd -> 3f800000", + "3f000000 bf800000 00000000 -> 3f000000", + "3f000000 bf800000 3f800000 -> 3f000000", + "3f000000 bf800000 bf800000 -> 3f000000", + "3f000000 bf800000 3f000000 -> 3f000000", + "3f000000 bf800000 bf000000 -> 3f000000", + "3f000000 bf800000 40000000 -> 3f015555", + "3f000000 bf800000 c0000000 -> 3f000000", + "3f000000 bf800000 40400000 -> 3f100000", + "3f000000 bf800000 c0300000 -> 3f000000", + "3f000000 bf800000 3dcccccd -> 3f000000", + "3f000000 3f000000 00000000 -> 3f000000", + "3f000000 3f000000 3f800000 -> 3f2aaaab", + "3f000000 3f000000 bf800000 -> 3f000000", + "3f000000 3f000000 3f000000 -> 3f155555", + "3f000000 3f000000 bf000000 -> 3f000000", + "3f000000 3f000000 40000000 -> 3f555556", + "3f000000 3f000000 c0000000 -> 3f000000", + "3f000000 3f000000 40400000 -> 3f800000", + "3f000000 3f000000 c0300000 -> 3f000000", + "3f000000 3f000000 3dcccccd -> 3f044444", + "3f000000 bf000000 00000000 -> 3f000000", + "3f000000 bf000000 3f800000 -> 3f000000", + "3f000000 bf000000 bf800000 -> 3f000000", + "3f000000 bf000000 3f000000 -> 3f000000", + "3f000000 bf000000 bf000000 -> 3f000000", + "3f000000 bf000000 40000000 -> 3f0aaaab", + "3f000000 bf000000 c0000000 -> 3f000000", + "3f000000 bf000000 40400000 -> 3f25ed0a", + "3f000000 bf000000 c0300000 -> 3f000000", + "3f000000 bf000000 3dcccccd -> 3f000000", + "3f000000 40000000 00000000 -> 40000000", + "3f000000 40000000 3f800000 -> 40000000", + "3f000000 40000000 bf800000 -> 40000000", + "3f000000 40000000 3f000000 -> 40000000", + "3f000000 40000000 bf000000 -> 40000000", + "3f000000 40000000 40000000 -> 40005555", + "3f000000 40000000 c0000000 -> 40000000", + "3f000000 40000000 40400000 -> 40040000", + "3f000000 40000000 c0300000 -> 40000000", + "3f000000 40000000 3dcccccd -> 40000000", + "3f000000 c0000000 00000000 -> 3f000000", + "3f000000 c0000000 3f800000 -> 3f000000", + "3f000000 c0000000 bf800000 -> 3f000000", + "3f000000 c0000000 3f000000 -> 3f000000", + "3f000000 c0000000 bf000000 -> 3f000000", + "3f000000 c0000000 40000000 -> 3f000000", + "3f000000 c0000000 c0000000 -> 3f000000", + "3f000000 c0000000 40400000 -> 3f0097b4", + "3f000000 c0000000 c0300000 -> 3f000000", + "3f000000 c0000000 3dcccccd -> 3f000000", + "3f000000 40400000 00000000 -> 40400000", + "3f000000 40400000 3f800000 -> 40400000", + "3f000000 40400000 bf800000 -> 40400000", + "3f000000 40400000 3f000000 -> 40400000", + "3f000000 40400000 bf000000 -> 40400000", + "3f000000 40400000 40000000 -> 40400000", + "3f000000 40400000 c0000000 -> 40400000", + "3f000000 40400000 40400000 -> 404025ed", + "3f000000 40400000 c0300000 -> 40400000", + "3f000000 40400000 3dcccccd -> 40400000", + "3f000000 c0300000 00000000 -> 3f000000", + "3f000000 c0300000 3f800000 -> 3f000000", + "3f000000 c0300000 bf800000 -> 3f000000", + "3f000000 c0300000 3f000000 -> 3f000000", + "3f000000 c0300000 bf000000 -> 3f000000", + "3f000000 c0300000 40000000 -> 3f000000", + "3f000000 c0300000 c0000000 -> 3f000000", + "3f000000 c0300000 40400000 -> 3f000000", + "3f000000 c0300000 c0300000 -> 3f000000", + "3f000000 c0300000 3dcccccd -> 3f000000", + "3f000000 3dcccccd 00000000 -> 3f000000", + "3f000000 3dcccccd 3f800000 -> 3f09374c", + "3f000000 3dcccccd bf800000 -> 3f000000", + "3f000000 3dcccccd 3f000000 -> 3f002bb1", + "3f000000 3dcccccd bf000000 -> 3f000000", + "3f000000 3dcccccd 40000000 -> 3f2bb0d0", + "3f000000 3dcccccd c0000000 -> 3f000000", + "3f000000 3dcccccd 40400000 -> 3f5352c0", + "3f000000 3dcccccd c0300000 -> 3f000000", + "3f000000 3dcccccd 3dcccccd -> 3f000000", + "bf000000 00000000 00000000 -> 00000000", + "bf000000 00000000 3f800000 -> 3caaaaab", + "bf000000 00000000 bf800000 -> 00000000", + "bf000000 00000000 3f000000 -> 00000000", + "bf000000 00000000 bf000000 -> 00000000", + "bf000000 00000000 40000000 -> 3e100000", + "bf000000 00000000 c0000000 -> 00000000", + "bf000000 00000000 40400000 -> 3e9425ec", + "bf000000 00000000 c0300000 -> 00000000", + "bf000000 00000000 3dcccccd -> 00000000", + "bf000000 3f800000 00000000 -> 3f800000", + "bf000000 3f800000 3f800000 -> 3f800000", + "bf000000 3f800000 bf800000 -> 3f800000", + "bf000000 3f800000 3f000000 -> 3f800000", + "bf000000 3f800000 bf000000 -> 3f800000", + "bf000000 3f800000 40000000 -> 3f80aaab", + "bf000000 3f800000 c0000000 -> 3f800000", + "bf000000 3f800000 40400000 -> 3f880000", + "bf000000 3f800000 c0300000 -> 3f800000", + "bf000000 3f800000 3dcccccd -> 3f800000", + "bf000000 bf800000 00000000 -> bf000000", + "bf000000 bf800000 3f800000 -> bef55555", + "bf000000 bf800000 bf800000 -> bf000000", + "bf000000 bf800000 3f000000 -> bf000000", + "bf000000 bf800000 bf000000 -> bf000000", + "bf000000 bf800000 40000000 -> beb80000", + "bf000000 bf800000 c0000000 -> bf000000", + "bf000000 bf800000 40400000 -> be57b428", + "bf000000 bf800000 c0300000 -> bf000000", + "bf000000 bf800000 3dcccccd -> bf000000", + "bf000000 3f000000 00000000 -> 3f000000", + "bf000000 3f000000 3f800000 -> 3f000000", + "bf000000 3f000000 bf800000 -> 3f000000", + "bf000000 3f000000 3f000000 -> 3f000000", + "bf000000 3f000000 bf000000 -> 3f000000", + "bf000000 3f000000 40000000 -> 3f0aaaab", + "bf000000 3f000000 c0000000 -> 3f000000", + "bf000000 3f000000 40400000 -> 3f25ed0a", + "bf000000 3f000000 c0300000 -> 3f000000", + "bf000000 3f000000 3dcccccd -> 3f000000", + "bf000000 bf000000 00000000 -> bf000000", + "bf000000 bf000000 3f800000 -> beaaaaaa", + "bf000000 bf000000 bf800000 -> bf000000", + "bf000000 bf000000 3f000000 -> bed55555", + "bf000000 bf000000 bf000000 -> bf000000", + "bf000000 bf000000 40000000 -> be2aaaaa", + "bf000000 bf000000 c0000000 -> bf000000", + "bf000000 bf000000 40400000 -> 00000000", + "bf000000 bf000000 c0300000 -> bf000000", + "bf000000 bf000000 3dcccccd -> bef77777", + "bf000000 40000000 00000000 -> 40000000", + "bf000000 40000000 3f800000 -> 40000000", + "bf000000 40000000 bf800000 -> 40000000", + "bf000000 40000000 3f000000 -> 40000000", + "bf000000 40000000 bf000000 -> 40000000", + "bf000000 40000000 40000000 -> 40000000", + "bf000000 40000000 c0000000 -> 40000000", + "bf000000 40000000 40400000 -> 400025ed", + "bf000000 40000000 c0300000 -> 40000000", + "bf000000 40000000 3dcccccd -> 40000000", + "bf000000 c0000000 00000000 -> bf000000", + "bf000000 c0000000 3f800000 -> bf000000", + "bf000000 c0000000 bf800000 -> bf000000", + "bf000000 c0000000 3f000000 -> bf000000", + "bf000000 c0000000 bf000000 -> bf000000", + "bf000000 c0000000 40000000 -> befd5555", + "bf000000 c0000000 c0000000 -> bf000000", + "bf000000 c0000000 40400000 -> bee00000", + "bf000000 c0000000 c0300000 -> bf000000", + "bf000000 c0000000 3dcccccd -> bf000000", + "bf000000 40400000 00000000 -> 40400000", + "bf000000 40400000 3f800000 -> 40400000", + "bf000000 40400000 bf800000 -> 40400000", + "bf000000 40400000 3f000000 -> 40400000", + "bf000000 40400000 bf000000 -> 40400000", + "bf000000 40400000 40000000 -> 40400000", + "bf000000 40400000 c0000000 -> 40400000", + "bf000000 40400000 40400000 -> 40400000", + "bf000000 40400000 c0300000 -> 40400000", + "bf000000 40400000 3dcccccd -> 40400000", + "bf000000 c0300000 00000000 -> bf000000", + "bf000000 c0300000 3f800000 -> bf000000", + "bf000000 c0300000 bf800000 -> bf000000", + "bf000000 c0300000 3f000000 -> bf000000", + "bf000000 c0300000 bf000000 -> bf000000", + "bf000000 c0300000 40000000 -> bf000000", + "bf000000 c0300000 c0000000 -> bf000000", + "bf000000 c0300000 40400000 -> befc0000", + "bf000000 c0300000 c0300000 -> bf000000", + "bf000000 c0300000 3dcccccd -> bf000000", + "bf000000 3dcccccd 00000000 -> 3dcccccd", + "bf000000 3dcccccd 3f800000 -> 3de2a534", + "bf000000 3dcccccd bf800000 -> 3dcccccd", + "bf000000 3dcccccd 3f000000 -> 3dcccccd", + "bf000000 3dcccccd bf000000 -> 3dcccccd", + "bf000000 3dcccccd 40000000 -> 3e5b7a32", + "bf000000 3dcccccd c0000000 -> 3dcccccd", + "bf000000 3dcccccd 40400000 -> 3eb645a2", + "bf000000 3dcccccd c0300000 -> 3dcccccd", + "bf000000 3dcccccd 3dcccccd -> 3dcccccd", + "40000000 00000000 00000000 -> 40000000", + "40000000 00000000 3f800000 -> 40000000", + "40000000 00000000 bf800000 -> 40000000", + "40000000 00000000 3f000000 -> 40000000", + "40000000 00000000 bf000000 -> 40000000", + "40000000 00000000 40000000 -> 40000000", + "40000000 00000000 c0000000 -> 40000000", + "40000000 00000000 40400000 -> 40012f68", + "40000000 00000000 c0300000 -> 40000000", + "40000000 00000000 3dcccccd -> 40000000", + "40000000 3f800000 00000000 -> 40000000", + "40000000 3f800000 3f800000 -> 40000000", + "40000000 3f800000 bf800000 -> 40000000", + "40000000 3f800000 3f000000 -> 40000000", + "40000000 3f800000 bf000000 -> 40000000", + "40000000 3f800000 40000000 -> 4002aaab", + "40000000 3f800000 c0000000 -> 40000000", + "40000000 3f800000 40400000 -> 40097b42", + "40000000 3f800000 c0300000 -> 40000000", + "40000000 3f800000 3dcccccd -> 40000000", + "40000000 bf800000 00000000 -> 40000000", + "40000000 bf800000 3f800000 -> 40000000", + "40000000 bf800000 bf800000 -> 40000000", + "40000000 bf800000 3f000000 -> 40000000", + "40000000 bf800000 bf000000 -> 40000000", + "40000000 bf800000 40000000 -> 40000000", + "40000000 bf800000 c0000000 -> 40000000", + "40000000 bf800000 40400000 -> 40000000", + "40000000 bf800000 c0300000 -> 40000000", + "40000000 bf800000 3dcccccd -> 40000000", + "40000000 3f000000 00000000 -> 40000000", + "40000000 3f000000 3f800000 -> 40000000", + "40000000 3f000000 bf800000 -> 40000000", + "40000000 3f000000 3f000000 -> 40000000", + "40000000 3f000000 bf000000 -> 40000000", + "40000000 3f000000 40000000 -> 40005555", + "40000000 3f000000 c0000000 -> 40000000", + "40000000 3f000000 40400000 -> 40040000", + "40000000 3f000000 c0300000 -> 40000000", + "40000000 3f000000 3dcccccd -> 40000000", + "40000000 bf000000 00000000 -> 40000000", + "40000000 bf000000 3f800000 -> 40000000", + "40000000 bf000000 bf800000 -> 40000000", + "40000000 bf000000 3f000000 -> 40000000", + "40000000 bf000000 bf000000 -> 40000000", + "40000000 bf000000 40000000 -> 40000000", + "40000000 bf000000 c0000000 -> 40000000", + "40000000 bf000000 40400000 -> 400025ed", + "40000000 bf000000 c0300000 -> 40000000", + "40000000 bf000000 3dcccccd -> 40000000", + "40000000 40000000 00000000 -> 40000000", + "40000000 40000000 3f800000 -> 400aaaab", + "40000000 40000000 bf800000 -> 40000000", + "40000000 40000000 3f000000 -> 40055555", + "40000000 40000000 bf000000 -> 40000000", + "40000000 40000000 40000000 -> 40155555", + "40000000 40000000 c0000000 -> 40000000", + "40000000 40000000 40400000 -> 40200000", + "40000000 40000000 c0300000 -> 40000000", + "40000000 40000000 3dcccccd -> 40011111", + "40000000 c0000000 00000000 -> 40000000", + "40000000 c0000000 3f800000 -> 40000000", + "40000000 c0000000 bf800000 -> 40000000", + "40000000 c0000000 3f000000 -> 40000000", + "40000000 c0000000 bf000000 -> 40000000", + "40000000 c0000000 40000000 -> 40000000", + "40000000 c0000000 c0000000 -> 40000000", + "40000000 c0000000 40400000 -> 40000000", + "40000000 c0000000 c0300000 -> 40000000", + "40000000 c0000000 3dcccccd -> 40000000", + "40000000 40400000 00000000 -> 40400000", + "40000000 40400000 3f800000 -> 40400000", + "40000000 40400000 bf800000 -> 40400000", + "40000000 40400000 3f000000 -> 40400000", + "40000000 40400000 bf000000 -> 40400000", + "40000000 40400000 40000000 -> 4042aaab", + "40000000 40400000 c0000000 -> 40400000", + "40000000 40400000 40400000 -> 40497b42", + "40000000 40400000 c0300000 -> 40400000", + "40000000 40400000 3dcccccd -> 40400000", + "40000000 c0300000 00000000 -> 40000000", + "40000000 c0300000 3f800000 -> 40000000", + "40000000 c0300000 bf800000 -> 40000000", + "40000000 c0300000 3f000000 -> 40000000", + "40000000 c0300000 bf000000 -> 40000000", + "40000000 c0300000 40000000 -> 40000000", + "40000000 c0300000 c0000000 -> 40000000", + "40000000 c0300000 40400000 -> 40000000", + "40000000 c0300000 c0300000 -> 40000000", + "40000000 c0300000 3dcccccd -> 40000000", + "40000000 3dcccccd 00000000 -> 40000000", + "40000000 3dcccccd 3f800000 -> 40000000", + "40000000 3dcccccd bf800000 -> 40000000", + "40000000 3dcccccd 3f000000 -> 40000000", + "40000000 3dcccccd bf000000 -> 40000000", + "40000000 3dcccccd 40000000 -> 400000af", + "40000000 3dcccccd c0000000 -> 40000000", + "40000000 3dcccccd 40400000 -> 400193d6", + "40000000 3dcccccd c0300000 -> 40000000", + "40000000 3dcccccd 3dcccccd -> 40000000", + "c0000000 00000000 00000000 -> 00000000", + "c0000000 00000000 3f800000 -> 00000000", + "c0000000 00000000 bf800000 -> 00000000", + "c0000000 00000000 3f000000 -> 00000000", + "c0000000 00000000 bf000000 -> 00000000", + "c0000000 00000000 40000000 -> 00000000", + "c0000000 00000000 c0000000 -> 00000000", + "c0000000 00000000 40400000 -> 3c97b427", + "c0000000 00000000 c0300000 -> 00000000", + "c0000000 00000000 3dcccccd -> 00000000", + "c0000000 3f800000 00000000 -> 3f800000", + "c0000000 3f800000 3f800000 -> 3f800000", + "c0000000 3f800000 bf800000 -> 3f800000", + "c0000000 3f800000 3f000000 -> 3f800000", + "c0000000 3f800000 bf000000 -> 3f800000", + "c0000000 3f800000 40000000 -> 3f800000", + "c0000000 3f800000 c0000000 -> 3f800000", + "c0000000 3f800000 40400000 -> 3f800000", + "c0000000 3f800000 c0300000 -> 3f800000", + "c0000000 3f800000 3dcccccd -> 3f800000", + "c0000000 bf800000 00000000 -> bf800000", + "c0000000 bf800000 3f800000 -> bf800000", + "c0000000 bf800000 bf800000 -> bf800000", + "c0000000 bf800000 3f000000 -> bf800000", + "c0000000 bf800000 bf000000 -> bf800000", + "c0000000 bf800000 40000000 -> bf755555", + "c0000000 bf800000 c0000000 -> bf800000", + "c0000000 bf800000 40400000 -> bf5a12f6", + "c0000000 bf800000 c0300000 -> bf800000", + "c0000000 bf800000 3dcccccd -> bf800000", + "c0000000 3f000000 00000000 -> 3f000000", + "c0000000 3f000000 3f800000 -> 3f000000", + "c0000000 3f000000 bf800000 -> 3f000000", + "c0000000 3f000000 3f000000 -> 3f000000", + "c0000000 3f000000 bf000000 -> 3f000000", + "c0000000 3f000000 40000000 -> 3f000000", + "c0000000 3f000000 c0000000 -> 3f000000", + "c0000000 3f000000 40400000 -> 3f0097b4", + "c0000000 3f000000 c0300000 -> 3f000000", + "c0000000 3f000000 3dcccccd -> 3f000000", + "c0000000 bf000000 00000000 -> bf000000", + "c0000000 bf000000 3f800000 -> bf000000", + "c0000000 bf000000 bf800000 -> bf000000", + "c0000000 bf000000 3f000000 -> bf000000", + "c0000000 bf000000 bf000000 -> bf000000", + "c0000000 bf000000 40000000 -> befd5555", + "c0000000 bf000000 c0000000 -> bf000000", + "c0000000 bf000000 40400000 -> bee00000", + "c0000000 bf000000 c0300000 -> bf000000", + "c0000000 bf000000 3dcccccd -> bf000000", + "c0000000 40000000 00000000 -> 40000000", + "c0000000 40000000 3f800000 -> 40000000", + "c0000000 40000000 bf800000 -> 40000000", + "c0000000 40000000 3f000000 -> 40000000", + "c0000000 40000000 bf000000 -> 40000000", + "c0000000 40000000 40000000 -> 40000000", + "c0000000 40000000 c0000000 -> 40000000", + "c0000000 40000000 40400000 -> 40000000", + "c0000000 40000000 c0300000 -> 40000000", + "c0000000 40000000 3dcccccd -> 40000000", + "c0000000 c0000000 00000000 -> c0000000", + "c0000000 c0000000 3f800000 -> bfeaaaab", + "c0000000 c0000000 bf800000 -> c0000000", + "c0000000 c0000000 3f000000 -> bff55555", + "c0000000 c0000000 bf000000 -> c0000000", + "c0000000 c0000000 40000000 -> bfd55555", + "c0000000 c0000000 c0000000 -> c0000000", + "c0000000 c0000000 40400000 -> bfc00000", + "c0000000 c0000000 c0300000 -> c0000000", + "c0000000 c0000000 3dcccccd -> bffdddde", + "c0000000 40400000 00000000 -> 40400000", + "c0000000 40400000 3f800000 -> 40400000", + "c0000000 40400000 bf800000 -> 40400000", + "c0000000 40400000 3f000000 -> 40400000", + "c0000000 40400000 bf000000 -> 40400000", + "c0000000 40400000 40000000 -> 40400000", + "c0000000 40400000 c0000000 -> 40400000", + "c0000000 40400000 40400000 -> 40400000", + "c0000000 40400000 c0300000 -> 40400000", + "c0000000 40400000 3dcccccd -> 40400000", + "c0000000 c0300000 00000000 -> c0000000", + "c0000000 c0300000 3f800000 -> bfffaaab", + "c0000000 c0300000 bf800000 -> c0000000", + "c0000000 c0300000 3f000000 -> c0000000", + "c0000000 c0300000 bf000000 -> c0000000", + "c0000000 c0300000 40000000 -> bff59555", + "c0000000 c0300000 c0000000 -> c0000000", + "c0000000 c0300000 40400000 -> bfe50000", + "c0000000 c0300000 c0300000 -> c0000000", + "c0000000 c0300000 3dcccccd -> c0000000", + "c0000000 3dcccccd 00000000 -> 3dcccccd", + "c0000000 3dcccccd 3f800000 -> 3dcccccd", + "c0000000 3dcccccd bf800000 -> 3dcccccd", + "c0000000 3dcccccd 3f000000 -> 3dcccccd", + "c0000000 3dcccccd bf000000 -> 3dcccccd", + "c0000000 3dcccccd 40000000 -> 3dcccccd", + "c0000000 3dcccccd c0000000 -> 3dcccccd", + "c0000000 3dcccccd 40400000 -> 3de872b1", + "c0000000 3dcccccd c0300000 -> 3dcccccd", + "c0000000 3dcccccd 3dcccccd -> 3dcccccd", + "40400000 00000000 00000000 -> 40400000", + "40400000 00000000 3f800000 -> 40400000", + "40400000 00000000 bf800000 -> 40400000", + "40400000 00000000 3f000000 -> 40400000", + "40400000 00000000 bf000000 -> 40400000", + "40400000 00000000 40000000 -> 40400000", + "40400000 00000000 c0000000 -> 40400000", + "40400000 00000000 40400000 -> 40400000", + "40400000 00000000 c0300000 -> 40400000", + "40400000 00000000 3dcccccd -> 40400000", + "40400000 3f800000 00000000 -> 40400000", + "40400000 3f800000 3f800000 -> 40400000", + "40400000 3f800000 bf800000 -> 40400000", + "40400000 3f800000 3f000000 -> 40400000", + "40400000 3f800000 bf000000 -> 40400000", + "40400000 3f800000 40000000 -> 40400000", + "40400000 3f800000 c0000000 -> 40400000", + "40400000 3f800000 40400000 -> 40412f68", + "40400000 3f800000 c0300000 -> 40400000", + "40400000 3f800000 3dcccccd -> 40400000", + "40400000 bf800000 00000000 -> 40400000", + "40400000 bf800000 3f800000 -> 40400000", + "40400000 bf800000 bf800000 -> 40400000", + "40400000 bf800000 3f000000 -> 40400000", + "40400000 bf800000 bf000000 -> 40400000", + "40400000 bf800000 40000000 -> 40400000", + "40400000 bf800000 c0000000 -> 40400000", + "40400000 bf800000 40400000 -> 40400000", + "40400000 bf800000 c0300000 -> 40400000", + "40400000 bf800000 3dcccccd -> 40400000", + "40400000 3f000000 00000000 -> 40400000", + "40400000 3f000000 3f800000 -> 40400000", + "40400000 3f000000 bf800000 -> 40400000", + "40400000 3f000000 3f000000 -> 40400000", + "40400000 3f000000 bf000000 -> 40400000", + "40400000 3f000000 40000000 -> 40400000", + "40400000 3f000000 c0000000 -> 40400000", + "40400000 3f000000 40400000 -> 404025ed", + "40400000 3f000000 c0300000 -> 40400000", + "40400000 3f000000 3dcccccd -> 40400000", + "40400000 bf000000 00000000 -> 40400000", + "40400000 bf000000 3f800000 -> 40400000", + "40400000 bf000000 bf800000 -> 40400000", + "40400000 bf000000 3f000000 -> 40400000", + "40400000 bf000000 bf000000 -> 40400000", + "40400000 bf000000 40000000 -> 40400000", + "40400000 bf000000 c0000000 -> 40400000", + "40400000 bf000000 40400000 -> 40400000", + "40400000 bf000000 c0300000 -> 40400000", + "40400000 bf000000 3dcccccd -> 40400000", + "40400000 40000000 00000000 -> 40400000", + "40400000 40000000 3f800000 -> 40400000", + "40400000 40000000 bf800000 -> 40400000", + "40400000 40000000 3f000000 -> 40400000", + "40400000 40000000 bf000000 -> 40400000", + "40400000 40000000 40000000 -> 4042aaab", + "40400000 40000000 c0000000 -> 40400000", + "40400000 40000000 40400000 -> 40497b42", + "40400000 40000000 c0300000 -> 40400000", + "40400000 40000000 3dcccccd -> 40400000", + "40400000 c0000000 00000000 -> 40400000", + "40400000 c0000000 3f800000 -> 40400000", + "40400000 c0000000 bf800000 -> 40400000", + "40400000 c0000000 3f000000 -> 40400000", + "40400000 c0000000 bf000000 -> 40400000", + "40400000 c0000000 40000000 -> 40400000", + "40400000 c0000000 c0000000 -> 40400000", + "40400000 c0000000 40400000 -> 40400000", + "40400000 c0000000 c0300000 -> 40400000", + "40400000 c0000000 3dcccccd -> 40400000", + "40400000 40400000 00000000 -> 40400000", + "40400000 40400000 3f800000 -> 404aaaab", + "40400000 40400000 bf800000 -> 40400000", + "40400000 40400000 3f000000 -> 40455555", + "40400000 40400000 bf000000 -> 40400000", + "40400000 40400000 40000000 -> 40555555", + "40400000 40400000 c0000000 -> 40400000", + "40400000 40400000 40400000 -> 40600000", + "40400000 40400000 c0300000 -> 40400000", + "40400000 40400000 3dcccccd -> 40411111", + "40400000 c0300000 00000000 -> 40400000", + "40400000 c0300000 3f800000 -> 40400000", + "40400000 c0300000 bf800000 -> 40400000", + "40400000 c0300000 3f000000 -> 40400000", + "40400000 c0300000 bf000000 -> 40400000", + "40400000 c0300000 40000000 -> 40400000", + "40400000 c0300000 c0000000 -> 40400000", + "40400000 c0300000 40400000 -> 40400000", + "40400000 c0300000 c0300000 -> 40400000", + "40400000 c0300000 3dcccccd -> 40400000", + "40400000 3dcccccd 00000000 -> 40400000", + "40400000 3dcccccd 3f800000 -> 40400000", + "40400000 3dcccccd bf800000 -> 40400000", + "40400000 3dcccccd 3f000000 -> 40400000", + "40400000 3dcccccd bf000000 -> 40400000", + "40400000 3dcccccd 40000000 -> 40400000", + "40400000 3dcccccd c0000000 -> 40400000", + "40400000 3dcccccd 40400000 -> 4040004e", + "40400000 3dcccccd c0300000 -> 40400000", + "40400000 3dcccccd 3dcccccd -> 40400000", + "c0300000 00000000 00000000 -> 00000000", + "c0300000 00000000 3f800000 -> 00000000", + "c0300000 00000000 bf800000 -> 00000000", + "c0300000 00000000 3f000000 -> 00000000", + "c0300000 00000000 bf000000 -> 00000000", + "c0300000 00000000 40000000 -> 00000000", + "c0300000 00000000 c0000000 -> 00000000", + "c0300000 00000000 40400000 -> 3997b427", + "c0300000 00000000 c0300000 -> 00000000", + "c0300000 00000000 3dcccccd -> 00000000", + "c0300000 3f800000 00000000 -> 3f800000", + "c0300000 3f800000 3f800000 -> 3f800000", + "c0300000 3f800000 bf800000 -> 3f800000", + "c0300000 3f800000 3f000000 -> 3f800000", + "c0300000 3f800000 bf000000 -> 3f800000", + "c0300000 3f800000 40000000 -> 3f800000", + "c0300000 3f800000 c0000000 -> 3f800000", + "c0300000 3f800000 40400000 -> 3f800000", + "c0300000 3f800000 c0300000 -> 3f800000", + "c0300000 3f800000 3dcccccd -> 3f800000", + "c0300000 bf800000 00000000 -> bf800000", + "c0300000 bf800000 3f800000 -> bf800000", + "c0300000 bf800000 bf800000 -> bf800000", + "c0300000 bf800000 3f000000 -> bf800000", + "c0300000 bf800000 bf000000 -> bf800000", + "c0300000 bf800000 40000000 -> bf7fd555", + "c0300000 bf800000 c0000000 -> bf800000", + "c0300000 bf800000 40400000 -> bf76bda1", + "c0300000 bf800000 c0300000 -> bf800000", + "c0300000 bf800000 3dcccccd -> bf800000", + "c0300000 3f000000 00000000 -> 3f000000", + "c0300000 3f000000 3f800000 -> 3f000000", + "c0300000 3f000000 bf800000 -> 3f000000", + "c0300000 3f000000 3f000000 -> 3f000000", + "c0300000 3f000000 bf000000 -> 3f000000", + "c0300000 3f000000 40000000 -> 3f000000", + "c0300000 3f000000 c0000000 -> 3f000000", + "c0300000 3f000000 40400000 -> 3f000000", + "c0300000 3f000000 c0300000 -> 3f000000", + "c0300000 3f000000 3dcccccd -> 3f000000", + "c0300000 bf000000 00000000 -> bf000000", + "c0300000 bf000000 3f800000 -> bf000000", + "c0300000 bf000000 bf800000 -> bf000000", + "c0300000 bf000000 3f000000 -> bf000000", + "c0300000 bf000000 bf000000 -> bf000000", + "c0300000 bf000000 40000000 -> bf000000", + "c0300000 bf000000 c0000000 -> bf000000", + "c0300000 bf000000 40400000 -> befc0000", + "c0300000 bf000000 c0300000 -> bf000000", + "c0300000 bf000000 3dcccccd -> bf000000", + "c0300000 40000000 00000000 -> 40000000", + "c0300000 40000000 3f800000 -> 40000000", + "c0300000 40000000 bf800000 -> 40000000", + "c0300000 40000000 3f000000 -> 40000000", + "c0300000 40000000 bf000000 -> 40000000", + "c0300000 40000000 40000000 -> 40000000", + "c0300000 40000000 c0000000 -> 40000000", + "c0300000 40000000 40400000 -> 40000000", + "c0300000 40000000 c0300000 -> 40000000", + "c0300000 40000000 3dcccccd -> 40000000", + "c0300000 c0000000 00000000 -> c0000000", + "c0300000 c0000000 3f800000 -> bfffaaab", + "c0300000 c0000000 bf800000 -> c0000000", + "c0300000 c0000000 3f000000 -> c0000000", + "c0300000 c0000000 bf000000 -> c0000000", + "c0300000 c0000000 40000000 -> bff59555", + "c0300000 c0000000 c0000000 -> c0000000", + "c0300000 c0000000 40400000 -> bfe50000", + "c0300000 c0000000 c0300000 -> c0000000", + "c0300000 c0000000 3dcccccd -> c0000000", + "c0300000 40400000 00000000 -> 40400000", + "c0300000 40400000 3f800000 -> 40400000", + "c0300000 40400000 bf800000 -> 40400000", + "c0300000 40400000 3f000000 -> 40400000", + "c0300000 40400000 bf000000 -> 40400000", + "c0300000 40400000 40000000 -> 40400000", + "c0300000 40400000 c0000000 -> 40400000", + "c0300000 40400000 40400000 -> 40400000", + "c0300000 40400000 c0300000 -> 40400000", + "c0300000 40400000 3dcccccd -> 40400000", + "c0300000 c0300000 00000000 -> c0300000", + "c0300000 c0300000 3f800000 -> c0255555", + "c0300000 c0300000 bf800000 -> c0300000", + "c0300000 c0300000 3f000000 -> c02aaaab", + "c0300000 c0300000 bf000000 -> c0300000", + "c0300000 c0300000 40000000 -> c01aaaab", + "c0300000 c0300000 c0000000 -> c0300000", + "c0300000 c0300000 40400000 -> c0100000", + "c0300000 c0300000 c0300000 -> c0300000", + "c0300000 c0300000 3dcccccd -> c02eeeef", + "c0300000 3dcccccd 00000000 -> 3dcccccd", + "c0300000 3dcccccd 3f800000 -> 3dcccccd", + "c0300000 3dcccccd bf800000 -> 3dcccccd", + "c0300000 3dcccccd 3f000000 -> 3dcccccd", + "c0300000 3dcccccd bf000000 -> 3dcccccd", + "c0300000 3dcccccd 40000000 -> 3dcccccd", + "c0300000 3dcccccd c0000000 -> 3dcccccd", + "c0300000 3dcccccd 40400000 -> 3dcced92", + "c0300000 3dcccccd c0300000 -> 3dcccccd", + "c0300000 3dcccccd 3dcccccd -> 3dcccccd", + "3dcccccd 00000000 00000000 -> 3dcccccd", + "3dcccccd 00000000 3f800000 -> 3e62d0e4", + "3dcccccd 00000000 bf800000 -> 3dcccccd", + "3dcccccd 00000000 3f000000 -> 3e121736", + "3dcccccd 00000000 bf000000 -> 3dcccccd", + "3dcccccd 00000000 40000000 -> 3ec5867c", + "3dcccccd 00000000 c0000000 -> 3dcccccd", + "3dcccccd 00000000 40400000 -> 3f0d38d1", + "3dcccccd 00000000 c0300000 -> 3dcccccd", + "3dcccccd 00000000 3dcccccd -> 3dcccccd", + "3dcccccd 3f800000 00000000 -> 3f800000", + "3dcccccd 3f800000 3f800000 -> 3f800576", + "3dcccccd 3f800000 bf800000 -> 3f800000", + "3dcccccd 3f800000 3f000000 -> 3f800000", + "3dcccccd 3f800000 bf000000 -> 3f800000", + "3dcccccd 3f800000 40000000 -> 3f871942", + "3dcccccd 3f800000 c0000000 -> 3f800000", + "3dcccccd 3f800000 40400000 -> 3f95f3b6", + "3dcccccd 3f800000 c0300000 -> 3f800000", + "3dcccccd 3f800000 3dcccccd -> 3f800000", + "3dcccccd bf800000 00000000 -> 3dcccccd", + "3dcccccd bf800000 3f800000 -> 3dcccccd", + "3dcccccd bf800000 bf800000 -> 3dcccccd", + "3dcccccd bf800000 3f000000 -> 3dcccccd", + "3dcccccd bf800000 bf000000 -> 3dcccccd", + "3dcccccd bf800000 40000000 -> 3e058106", + "3dcccccd bf800000 c0000000 -> 3dcccccd", + "3dcccccd bf800000 40400000 -> 3e68778a", + "3dcccccd bf800000 c0300000 -> 3dcccccd", + "3dcccccd bf800000 3dcccccd -> 3dcccccd", + "3dcccccd 3f000000 00000000 -> 3f000000", + "3dcccccd 3f000000 3f800000 -> 3f09374c", + "3dcccccd 3f000000 bf800000 -> 3f000000", + "3dcccccd 3f000000 3f000000 -> 3f002bb1", + "3dcccccd 3f000000 bf000000 -> 3f000000", + "3dcccccd 3f000000 40000000 -> 3f2bb0d0", + "3dcccccd 3f000000 c0000000 -> 3f000000", + "3dcccccd 3f000000 40400000 -> 3f5352c0", + "3dcccccd 3f000000 c0300000 -> 3f000000", + "3dcccccd 3f000000 3dcccccd -> 3f000000", + "3dcccccd bf000000 00000000 -> 3dcccccd", + "3dcccccd bf000000 3f800000 -> 3de2a534", + "3dcccccd bf000000 bf800000 -> 3dcccccd", + "3dcccccd bf000000 3f000000 -> 3dcccccd", + "3dcccccd bf000000 bf000000 -> 3dcccccd", + "3dcccccd bf000000 40000000 -> 3e5b7a32", + "3dcccccd bf000000 c0000000 -> 3dcccccd", + "3dcccccd bf000000 40400000 -> 3eb645a2", + "3dcccccd bf000000 c0300000 -> 3dcccccd", + "3dcccccd bf000000 3dcccccd -> 3dcccccd", + "3dcccccd 40000000 00000000 -> 40000000", + "3dcccccd 40000000 3f800000 -> 40000000", + "3dcccccd 40000000 bf800000 -> 40000000", + "3dcccccd 40000000 3f000000 -> 40000000", + "3dcccccd 40000000 bf000000 -> 40000000", + "3dcccccd 40000000 40000000 -> 400000af", + "3dcccccd 40000000 c0000000 -> 40000000", + "3dcccccd 40000000 40400000 -> 400193d6", + "3dcccccd 40000000 c0300000 -> 40000000", + "3dcccccd 40000000 3dcccccd -> 40000000", + "3dcccccd c0000000 00000000 -> 3dcccccd", + "3dcccccd c0000000 3f800000 -> 3dcccccd", + "3dcccccd c0000000 bf800000 -> 3dcccccd", + "3dcccccd c0000000 3f000000 -> 3dcccccd", + "3dcccccd c0000000 bf000000 -> 3dcccccd", + "3dcccccd c0000000 40000000 -> 3dcccccd", + "3dcccccd c0000000 c0000000 -> 3dcccccd", + "3dcccccd c0000000 40400000 -> 3de872b1", + "3dcccccd c0000000 c0300000 -> 3dcccccd", + "3dcccccd c0000000 3dcccccd -> 3dcccccd", + "3dcccccd 40400000 00000000 -> 40400000", + "3dcccccd 40400000 3f800000 -> 40400000", + "3dcccccd 40400000 bf800000 -> 40400000", + "3dcccccd 40400000 3f000000 -> 40400000", + "3dcccccd 40400000 bf000000 -> 40400000", + "3dcccccd 40400000 40000000 -> 40400000", + "3dcccccd 40400000 c0000000 -> 40400000", + "3dcccccd 40400000 40400000 -> 4040004e", + "3dcccccd 40400000 c0300000 -> 40400000", + "3dcccccd 40400000 3dcccccd -> 40400000", + "3dcccccd c0300000 00000000 -> 3dcccccd", + "3dcccccd c0300000 3f800000 -> 3dcccccd", + "3dcccccd c0300000 bf800000 -> 3dcccccd", + "3dcccccd c0300000 3f000000 -> 3dcccccd", + "3dcccccd c0300000 bf000000 -> 3dcccccd", + "3dcccccd c0300000 40000000 -> 3dcccccd", + "3dcccccd c0300000 c0000000 -> 3dcccccd", + "3dcccccd c0300000 40400000 -> 3dcced92", + "3dcccccd c0300000 c0300000 -> 3dcccccd", + "3dcccccd c0300000 3dcccccd -> 3dcccccd", + "3dcccccd 3dcccccd 00000000 -> 3dcccccd", + "3dcccccd 3dcccccd 3f800000 -> 3e888889", + "3dcccccd 3dcccccd bf800000 -> 3dcccccd", + "3dcccccd 3dcccccd 3f000000 -> 3e3bbbbc", + "3dcccccd 3dcccccd bf000000 -> 3dcccccd", + "3dcccccd 3dcccccd 40000000 -> 3eddddde", + "3dcccccd 3dcccccd c0000000 -> 3dcccccd", + "3dcccccd 3dcccccd 40400000 -> 3f19999a", + "3dcccccd 3dcccccd c0300000 -> 3dcccccd", + "3dcccccd 3dcccccd 3dcccccd -> 3deeeeef", + "c119454c bfb4dee6 40205073 -> bfb4dee6", + "c0ab2598 412879d4 4035c1a8 -> 412879d4", + "413ae9c1 c1567004 c00c9f9b -> 413ae9c1", + "c196aaa6 3f9b0b8b bfde8838 -> 3f9b0b8b", + "c0ccd32c 4108637f bf47fd2b -> 4108637f", + "4115ed6a c19cd292 402212fa -> 4115ed6a", + "414de6cb c0cbf86a bf6c3a43 -> 414de6cb", + "c186a0d1 40d4951b c0137b88 -> 40d4951b", + "41893fdf 419b8b6a c03503c4 -> 419b8b6a", + "c0a8440f c12153c6 bfe297b0 -> c0a8440f", + "c199ff5d c142e421 4004adde -> c142e421", + "413ef2e1 c17a7fd7 403f599b -> 413ef2e1", + "414865f0 412e2489 3e72513d -> 414865f0", + "c18d82c9 c0f408d1 bfcf6f4c -> c0f408d1", + "c08967dd c18655de 40226e48 -> c08967dd", + "c10e39f9 41772979 bf9beddc -> 41772979", + "41312a35 4118f2c7 40389f25 -> 4131fdb2", + "413ed323 4138d3fe 3ea10c4e -> 413ed323", + "c1182643 c09be64b bf1d1181 -> c09be64b", + "4130a3e9 411a399c 402f762b -> 41317ec1", + "c0904ae7 c126cd02 bf2b4a27 -> c0904ae7", + "c15bfc41 418ed1b4 bf19daa5 -> 418ed1b4", + "4105b582 c130ea2a 3fd02ff6 -> 4105b582", + "c11332fb c19dbc5e 3f198bc4 -> c11332fb" + ] + }, + { + "function": "cycles_compare", + "node": "ShaderNodeMath COMPARE", + "cases": [ + "00000000 00000000 00000000 -> 3f800000", + "00000000 00000000 3f000000 -> 3f800000", + "00000000 00000000 3f800000 -> 3f800000", + "00000000 00000000 33d6bf95 -> 3f800000", + "00000000 3f800000 00000000 -> 00000000", + "00000000 3f800000 3f000000 -> 00000000", + "00000000 3f800000 3f800000 -> 3f800000", + "00000000 3f800000 33d6bf95 -> 00000000", + "00000000 bf800000 00000000 -> 00000000", + "00000000 bf800000 3f000000 -> 00000000", + "00000000 bf800000 3f800000 -> 3f800000", + "00000000 bf800000 33d6bf95 -> 00000000", + "00000000 3f000000 00000000 -> 00000000", + "00000000 3f000000 3f000000 -> 3f800000", + "00000000 3f000000 3f800000 -> 3f800000", + "00000000 3f000000 33d6bf95 -> 00000000", + "00000000 bf000000 00000000 -> 00000000", + "00000000 bf000000 3f000000 -> 3f800000", + "00000000 bf000000 3f800000 -> 3f800000", + "00000000 bf000000 33d6bf95 -> 00000000", + "00000000 40000000 00000000 -> 00000000", + "00000000 40000000 3f000000 -> 00000000", + "00000000 40000000 3f800000 -> 00000000", + "00000000 40000000 33d6bf95 -> 00000000", + "00000000 c0000000 00000000 -> 00000000", + "00000000 c0000000 3f000000 -> 00000000", + "00000000 c0000000 3f800000 -> 00000000", + "00000000 c0000000 33d6bf95 -> 00000000", + "00000000 40400000 00000000 -> 00000000", + "00000000 40400000 3f000000 -> 00000000", + "00000000 40400000 3f800000 -> 00000000", + "00000000 40400000 33d6bf95 -> 00000000", + "00000000 c0300000 00000000 -> 00000000", + "00000000 c0300000 3f000000 -> 00000000", + "00000000 c0300000 3f800000 -> 00000000", + "00000000 c0300000 33d6bf95 -> 00000000", + "00000000 3dcccccd 00000000 -> 00000000", + "00000000 3dcccccd 3f000000 -> 3f800000", + "00000000 3dcccccd 3f800000 -> 3f800000", + "00000000 3dcccccd 33d6bf95 -> 00000000", + "3f800000 00000000 00000000 -> 00000000", + "3f800000 00000000 3f000000 -> 00000000", + "3f800000 00000000 3f800000 -> 3f800000", + "3f800000 00000000 33d6bf95 -> 00000000", + "3f800000 3f800000 00000000 -> 3f800000", + "3f800000 3f800000 3f000000 -> 3f800000", + "3f800000 3f800000 3f800000 -> 3f800000", + "3f800000 3f800000 33d6bf95 -> 3f800000", + "3f800000 bf800000 00000000 -> 00000000", + "3f800000 bf800000 3f000000 -> 00000000", + "3f800000 bf800000 3f800000 -> 00000000", + "3f800000 bf800000 33d6bf95 -> 00000000", + "3f800000 3f000000 00000000 -> 00000000", + "3f800000 3f000000 3f000000 -> 3f800000", + "3f800000 3f000000 3f800000 -> 3f800000", + "3f800000 3f000000 33d6bf95 -> 00000000", + "3f800000 bf000000 00000000 -> 00000000", + "3f800000 bf000000 3f000000 -> 00000000", + "3f800000 bf000000 3f800000 -> 00000000", + "3f800000 bf000000 33d6bf95 -> 00000000", + "3f800000 40000000 00000000 -> 00000000", + "3f800000 40000000 3f000000 -> 00000000", + "3f800000 40000000 3f800000 -> 3f800000", + "3f800000 40000000 33d6bf95 -> 00000000", + "3f800000 c0000000 00000000 -> 00000000", + "3f800000 c0000000 3f000000 -> 00000000", + "3f800000 c0000000 3f800000 -> 00000000", + "3f800000 c0000000 33d6bf95 -> 00000000", + "3f800000 40400000 00000000 -> 00000000", + "3f800000 40400000 3f000000 -> 00000000", + "3f800000 40400000 3f800000 -> 00000000", + "3f800000 40400000 33d6bf95 -> 00000000", + "3f800000 c0300000 00000000 -> 00000000", + "3f800000 c0300000 3f000000 -> 00000000", + "3f800000 c0300000 3f800000 -> 00000000", + "3f800000 c0300000 33d6bf95 -> 00000000", + "3f800000 3dcccccd 00000000 -> 00000000", + "3f800000 3dcccccd 3f000000 -> 00000000", + "3f800000 3dcccccd 3f800000 -> 3f800000", + "3f800000 3dcccccd 33d6bf95 -> 00000000", + "bf800000 00000000 00000000 -> 00000000", + "bf800000 00000000 3f000000 -> 00000000", + "bf800000 00000000 3f800000 -> 3f800000", + "bf800000 00000000 33d6bf95 -> 00000000", + "bf800000 3f800000 00000000 -> 00000000", + "bf800000 3f800000 3f000000 -> 00000000", + "bf800000 3f800000 3f800000 -> 00000000", + "bf800000 3f800000 33d6bf95 -> 00000000", + "bf800000 bf800000 00000000 -> 3f800000", + "bf800000 bf800000 3f000000 -> 3f800000", + "bf800000 bf800000 3f800000 -> 3f800000", + "bf800000 bf800000 33d6bf95 -> 3f800000", + "bf800000 3f000000 00000000 -> 00000000", + "bf800000 3f000000 3f000000 -> 00000000", + "bf800000 3f000000 3f800000 -> 00000000", + "bf800000 3f000000 33d6bf95 -> 00000000", + "bf800000 bf000000 00000000 -> 00000000", + "bf800000 bf000000 3f000000 -> 3f800000", + "bf800000 bf000000 3f800000 -> 3f800000", + "bf800000 bf000000 33d6bf95 -> 00000000", + "bf800000 40000000 00000000 -> 00000000", + "bf800000 40000000 3f000000 -> 00000000", + "bf800000 40000000 3f800000 -> 00000000", + "bf800000 40000000 33d6bf95 -> 00000000", + "bf800000 c0000000 00000000 -> 00000000", + "bf800000 c0000000 3f000000 -> 00000000", + "bf800000 c0000000 3f800000 -> 3f800000", + "bf800000 c0000000 33d6bf95 -> 00000000", + "bf800000 40400000 00000000 -> 00000000", + "bf800000 40400000 3f000000 -> 00000000", + "bf800000 40400000 3f800000 -> 00000000", + "bf800000 40400000 33d6bf95 -> 00000000", + "bf800000 c0300000 00000000 -> 00000000", + "bf800000 c0300000 3f000000 -> 00000000", + "bf800000 c0300000 3f800000 -> 00000000", + "bf800000 c0300000 33d6bf95 -> 00000000", + "bf800000 3dcccccd 00000000 -> 00000000", + "bf800000 3dcccccd 3f000000 -> 00000000", + "bf800000 3dcccccd 3f800000 -> 00000000", + "bf800000 3dcccccd 33d6bf95 -> 00000000", + "3f000000 00000000 00000000 -> 00000000", + "3f000000 00000000 3f000000 -> 3f800000", + "3f000000 00000000 3f800000 -> 3f800000", + "3f000000 00000000 33d6bf95 -> 00000000", + "3f000000 3f800000 00000000 -> 00000000", + "3f000000 3f800000 3f000000 -> 3f800000", + "3f000000 3f800000 3f800000 -> 3f800000", + "3f000000 3f800000 33d6bf95 -> 00000000", + "3f000000 bf800000 00000000 -> 00000000", + "3f000000 bf800000 3f000000 -> 00000000", + "3f000000 bf800000 3f800000 -> 00000000", + "3f000000 bf800000 33d6bf95 -> 00000000", + "3f000000 3f000000 00000000 -> 3f800000", + "3f000000 3f000000 3f000000 -> 3f800000", + "3f000000 3f000000 3f800000 -> 3f800000", + "3f000000 3f000000 33d6bf95 -> 3f800000", + "3f000000 bf000000 00000000 -> 00000000", + "3f000000 bf000000 3f000000 -> 00000000", + "3f000000 bf000000 3f800000 -> 3f800000", + "3f000000 bf000000 33d6bf95 -> 00000000", + "3f000000 40000000 00000000 -> 00000000", + "3f000000 40000000 3f000000 -> 00000000", + "3f000000 40000000 3f800000 -> 00000000", + "3f000000 40000000 33d6bf95 -> 00000000", + "3f000000 c0000000 00000000 -> 00000000", + "3f000000 c0000000 3f000000 -> 00000000", + "3f000000 c0000000 3f800000 -> 00000000", + "3f000000 c0000000 33d6bf95 -> 00000000", + "3f000000 40400000 00000000 -> 00000000", + "3f000000 40400000 3f000000 -> 00000000", + "3f000000 40400000 3f800000 -> 00000000", + "3f000000 40400000 33d6bf95 -> 00000000", + "3f000000 c0300000 00000000 -> 00000000", + "3f000000 c0300000 3f000000 -> 00000000", + "3f000000 c0300000 3f800000 -> 00000000", + "3f000000 c0300000 33d6bf95 -> 00000000", + "3f000000 3dcccccd 00000000 -> 00000000", + "3f000000 3dcccccd 3f000000 -> 3f800000", + "3f000000 3dcccccd 3f800000 -> 3f800000", + "3f000000 3dcccccd 33d6bf95 -> 00000000", + "bf000000 00000000 00000000 -> 00000000", + "bf000000 00000000 3f000000 -> 3f800000", + "bf000000 00000000 3f800000 -> 3f800000", + "bf000000 00000000 33d6bf95 -> 00000000", + "bf000000 3f800000 00000000 -> 00000000", + "bf000000 3f800000 3f000000 -> 00000000", + "bf000000 3f800000 3f800000 -> 00000000", + "bf000000 3f800000 33d6bf95 -> 00000000", + "bf000000 bf800000 00000000 -> 00000000", + "bf000000 bf800000 3f000000 -> 3f800000", + "bf000000 bf800000 3f800000 -> 3f800000", + "bf000000 bf800000 33d6bf95 -> 00000000", + "bf000000 3f000000 00000000 -> 00000000", + "bf000000 3f000000 3f000000 -> 00000000", + "bf000000 3f000000 3f800000 -> 3f800000", + "bf000000 3f000000 33d6bf95 -> 00000000", + "bf000000 bf000000 00000000 -> 3f800000", + "bf000000 bf000000 3f000000 -> 3f800000", + "bf000000 bf000000 3f800000 -> 3f800000", + "bf000000 bf000000 33d6bf95 -> 3f800000", + "bf000000 40000000 00000000 -> 00000000", + "bf000000 40000000 3f000000 -> 00000000", + "bf000000 40000000 3f800000 -> 00000000", + "bf000000 40000000 33d6bf95 -> 00000000", + "bf000000 c0000000 00000000 -> 00000000", + "bf000000 c0000000 3f000000 -> 00000000", + "bf000000 c0000000 3f800000 -> 00000000", + "bf000000 c0000000 33d6bf95 -> 00000000", + "bf000000 40400000 00000000 -> 00000000", + "bf000000 40400000 3f000000 -> 00000000", + "bf000000 40400000 3f800000 -> 00000000", + "bf000000 40400000 33d6bf95 -> 00000000", + "bf000000 c0300000 00000000 -> 00000000", + "bf000000 c0300000 3f000000 -> 00000000", + "bf000000 c0300000 3f800000 -> 00000000", + "bf000000 c0300000 33d6bf95 -> 00000000", + "bf000000 3dcccccd 00000000 -> 00000000", + "bf000000 3dcccccd 3f000000 -> 00000000", + "bf000000 3dcccccd 3f800000 -> 3f800000", + "bf000000 3dcccccd 33d6bf95 -> 00000000", + "40000000 00000000 00000000 -> 00000000", + "40000000 00000000 3f000000 -> 00000000", + "40000000 00000000 3f800000 -> 00000000", + "40000000 00000000 33d6bf95 -> 00000000", + "40000000 3f800000 00000000 -> 00000000", + "40000000 3f800000 3f000000 -> 00000000", + "40000000 3f800000 3f800000 -> 3f800000", + "40000000 3f800000 33d6bf95 -> 00000000", + "40000000 bf800000 00000000 -> 00000000", + "40000000 bf800000 3f000000 -> 00000000", + "40000000 bf800000 3f800000 -> 00000000", + "40000000 bf800000 33d6bf95 -> 00000000", + "40000000 3f000000 00000000 -> 00000000", + "40000000 3f000000 3f000000 -> 00000000", + "40000000 3f000000 3f800000 -> 00000000", + "40000000 3f000000 33d6bf95 -> 00000000", + "40000000 bf000000 00000000 -> 00000000", + "40000000 bf000000 3f000000 -> 00000000", + "40000000 bf000000 3f800000 -> 00000000", + "40000000 bf000000 33d6bf95 -> 00000000", + "40000000 40000000 00000000 -> 3f800000", + "40000000 40000000 3f000000 -> 3f800000", + "40000000 40000000 3f800000 -> 3f800000", + "40000000 40000000 33d6bf95 -> 3f800000", + "40000000 c0000000 00000000 -> 00000000", + "40000000 c0000000 3f000000 -> 00000000", + "40000000 c0000000 3f800000 -> 00000000", + "40000000 c0000000 33d6bf95 -> 00000000", + "40000000 40400000 00000000 -> 00000000", + "40000000 40400000 3f000000 -> 00000000", + "40000000 40400000 3f800000 -> 3f800000", + "40000000 40400000 33d6bf95 -> 00000000", + "40000000 c0300000 00000000 -> 00000000", + "40000000 c0300000 3f000000 -> 00000000", + "40000000 c0300000 3f800000 -> 00000000", + "40000000 c0300000 33d6bf95 -> 00000000", + "40000000 3dcccccd 00000000 -> 00000000", + "40000000 3dcccccd 3f000000 -> 00000000", + "40000000 3dcccccd 3f800000 -> 00000000", + "40000000 3dcccccd 33d6bf95 -> 00000000", + "c0000000 00000000 00000000 -> 00000000", + "c0000000 00000000 3f000000 -> 00000000", + "c0000000 00000000 3f800000 -> 00000000", + "c0000000 00000000 33d6bf95 -> 00000000", + "c0000000 3f800000 00000000 -> 00000000", + "c0000000 3f800000 3f000000 -> 00000000", + "c0000000 3f800000 3f800000 -> 00000000", + "c0000000 3f800000 33d6bf95 -> 00000000", + "c0000000 bf800000 00000000 -> 00000000", + "c0000000 bf800000 3f000000 -> 00000000", + "c0000000 bf800000 3f800000 -> 3f800000", + "c0000000 bf800000 33d6bf95 -> 00000000", + "c0000000 3f000000 00000000 -> 00000000", + "c0000000 3f000000 3f000000 -> 00000000", + "c0000000 3f000000 3f800000 -> 00000000", + "c0000000 3f000000 33d6bf95 -> 00000000", + "c0000000 bf000000 00000000 -> 00000000", + "c0000000 bf000000 3f000000 -> 00000000", + "c0000000 bf000000 3f800000 -> 00000000", + "c0000000 bf000000 33d6bf95 -> 00000000", + "c0000000 40000000 00000000 -> 00000000", + "c0000000 40000000 3f000000 -> 00000000", + "c0000000 40000000 3f800000 -> 00000000", + "c0000000 40000000 33d6bf95 -> 00000000", + "c0000000 c0000000 00000000 -> 3f800000", + "c0000000 c0000000 3f000000 -> 3f800000", + "c0000000 c0000000 3f800000 -> 3f800000", + "c0000000 c0000000 33d6bf95 -> 3f800000", + "c0000000 40400000 00000000 -> 00000000", + "c0000000 40400000 3f000000 -> 00000000", + "c0000000 40400000 3f800000 -> 00000000", + "c0000000 40400000 33d6bf95 -> 00000000", + "c0000000 c0300000 00000000 -> 00000000", + "c0000000 c0300000 3f000000 -> 00000000", + "c0000000 c0300000 3f800000 -> 3f800000", + "c0000000 c0300000 33d6bf95 -> 00000000", + "c0000000 3dcccccd 00000000 -> 00000000", + "c0000000 3dcccccd 3f000000 -> 00000000", + "c0000000 3dcccccd 3f800000 -> 00000000", + "c0000000 3dcccccd 33d6bf95 -> 00000000", + "40400000 00000000 00000000 -> 00000000", + "40400000 00000000 3f000000 -> 00000000", + "40400000 00000000 3f800000 -> 00000000", + "40400000 00000000 33d6bf95 -> 00000000", + "40400000 3f800000 00000000 -> 00000000", + "40400000 3f800000 3f000000 -> 00000000", + "40400000 3f800000 3f800000 -> 00000000", + "40400000 3f800000 33d6bf95 -> 00000000", + "40400000 bf800000 00000000 -> 00000000", + "40400000 bf800000 3f000000 -> 00000000", + "40400000 bf800000 3f800000 -> 00000000", + "40400000 bf800000 33d6bf95 -> 00000000", + "40400000 3f000000 00000000 -> 00000000", + "40400000 3f000000 3f000000 -> 00000000", + "40400000 3f000000 3f800000 -> 00000000", + "40400000 3f000000 33d6bf95 -> 00000000", + "40400000 bf000000 00000000 -> 00000000", + "40400000 bf000000 3f000000 -> 00000000", + "40400000 bf000000 3f800000 -> 00000000", + "40400000 bf000000 33d6bf95 -> 00000000", + "40400000 40000000 00000000 -> 00000000", + "40400000 40000000 3f000000 -> 00000000", + "40400000 40000000 3f800000 -> 3f800000", + "40400000 40000000 33d6bf95 -> 00000000", + "40400000 c0000000 00000000 -> 00000000", + "40400000 c0000000 3f000000 -> 00000000", + "40400000 c0000000 3f800000 -> 00000000", + "40400000 c0000000 33d6bf95 -> 00000000", + "40400000 40400000 00000000 -> 3f800000", + "40400000 40400000 3f000000 -> 3f800000", + "40400000 40400000 3f800000 -> 3f800000", + "40400000 40400000 33d6bf95 -> 3f800000", + "40400000 c0300000 00000000 -> 00000000", + "40400000 c0300000 3f000000 -> 00000000", + "40400000 c0300000 3f800000 -> 00000000", + "40400000 c0300000 33d6bf95 -> 00000000", + "40400000 3dcccccd 00000000 -> 00000000", + "40400000 3dcccccd 3f000000 -> 00000000", + "40400000 3dcccccd 3f800000 -> 00000000", + "40400000 3dcccccd 33d6bf95 -> 00000000", + "c0300000 00000000 00000000 -> 00000000", + "c0300000 00000000 3f000000 -> 00000000", + "c0300000 00000000 3f800000 -> 00000000", + "c0300000 00000000 33d6bf95 -> 00000000", + "c0300000 3f800000 00000000 -> 00000000", + "c0300000 3f800000 3f000000 -> 00000000", + "c0300000 3f800000 3f800000 -> 00000000", + "c0300000 3f800000 33d6bf95 -> 00000000", + "c0300000 bf800000 00000000 -> 00000000", + "c0300000 bf800000 3f000000 -> 00000000", + "c0300000 bf800000 3f800000 -> 00000000", + "c0300000 bf800000 33d6bf95 -> 00000000", + "c0300000 3f000000 00000000 -> 00000000", + "c0300000 3f000000 3f000000 -> 00000000", + "c0300000 3f000000 3f800000 -> 00000000", + "c0300000 3f000000 33d6bf95 -> 00000000", + "c0300000 bf000000 00000000 -> 00000000", + "c0300000 bf000000 3f000000 -> 00000000", + "c0300000 bf000000 3f800000 -> 00000000", + "c0300000 bf000000 33d6bf95 -> 00000000", + "c0300000 40000000 00000000 -> 00000000", + "c0300000 40000000 3f000000 -> 00000000", + "c0300000 40000000 3f800000 -> 00000000", + "c0300000 40000000 33d6bf95 -> 00000000", + "c0300000 c0000000 00000000 -> 00000000", + "c0300000 c0000000 3f000000 -> 00000000", + "c0300000 c0000000 3f800000 -> 3f800000", + "c0300000 c0000000 33d6bf95 -> 00000000", + "c0300000 40400000 00000000 -> 00000000", + "c0300000 40400000 3f000000 -> 00000000", + "c0300000 40400000 3f800000 -> 00000000", + "c0300000 40400000 33d6bf95 -> 00000000", + "c0300000 c0300000 00000000 -> 3f800000", + "c0300000 c0300000 3f000000 -> 3f800000", + "c0300000 c0300000 3f800000 -> 3f800000", + "c0300000 c0300000 33d6bf95 -> 3f800000", + "c0300000 3dcccccd 00000000 -> 00000000", + "c0300000 3dcccccd 3f000000 -> 00000000", + "c0300000 3dcccccd 3f800000 -> 00000000", + "c0300000 3dcccccd 33d6bf95 -> 00000000", + "3dcccccd 00000000 00000000 -> 00000000", + "3dcccccd 00000000 3f000000 -> 3f800000", + "3dcccccd 00000000 3f800000 -> 3f800000", + "3dcccccd 00000000 33d6bf95 -> 00000000", + "3dcccccd 3f800000 00000000 -> 00000000", + "3dcccccd 3f800000 3f000000 -> 00000000", + "3dcccccd 3f800000 3f800000 -> 3f800000", + "3dcccccd 3f800000 33d6bf95 -> 00000000", + "3dcccccd bf800000 00000000 -> 00000000", + "3dcccccd bf800000 3f000000 -> 00000000", + "3dcccccd bf800000 3f800000 -> 00000000", + "3dcccccd bf800000 33d6bf95 -> 00000000", + "3dcccccd 3f000000 00000000 -> 00000000", + "3dcccccd 3f000000 3f000000 -> 3f800000", + "3dcccccd 3f000000 3f800000 -> 3f800000", + "3dcccccd 3f000000 33d6bf95 -> 00000000", + "3dcccccd bf000000 00000000 -> 00000000", + "3dcccccd bf000000 3f000000 -> 00000000", + "3dcccccd bf000000 3f800000 -> 3f800000", + "3dcccccd bf000000 33d6bf95 -> 00000000", + "3dcccccd 40000000 00000000 -> 00000000", + "3dcccccd 40000000 3f000000 -> 00000000", + "3dcccccd 40000000 3f800000 -> 00000000", + "3dcccccd 40000000 33d6bf95 -> 00000000", + "3dcccccd c0000000 00000000 -> 00000000", + "3dcccccd c0000000 3f000000 -> 00000000", + "3dcccccd c0000000 3f800000 -> 00000000", + "3dcccccd c0000000 33d6bf95 -> 00000000", + "3dcccccd 40400000 00000000 -> 00000000", + "3dcccccd 40400000 3f000000 -> 00000000", + "3dcccccd 40400000 3f800000 -> 00000000", + "3dcccccd 40400000 33d6bf95 -> 00000000", + "3dcccccd c0300000 00000000 -> 00000000", + "3dcccccd c0300000 3f000000 -> 00000000", + "3dcccccd c0300000 3f800000 -> 00000000", + "3dcccccd c0300000 33d6bf95 -> 00000000", + "3dcccccd 3dcccccd 00000000 -> 3f800000", + "3dcccccd 3dcccccd 3f000000 -> 3f800000", + "3dcccccd 3dcccccd 3f800000 -> 3f800000", + "3dcccccd 3dcccccd 33d6bf95 -> 3f800000", + "40684d4d 41197b01 3e30940b -> 00000000", + "41427002 c105f7a6 3fd71a51 -> 00000000", + "40fe24fd c06cf967 3f2aaac8 -> 00000000", + "40b0b2bc 413d97aa 3fb70429 -> 00000000", + "c02acc1e c12b02ef 3ff537fc -> 00000000", + "c17016ac 414f4775 3f0b8663 -> 00000000", + "418de3c1 4122ccba 3f2cf1ca -> 00000000", + "40ae8967 418859ed 3f7d572b -> 00000000", + "410acfc3 41363f7b 3f06c26b -> 00000000", + "c0d28e22 c0db2234 3fd8e2b3 -> 3f800000", + "c039b8b5 c12e429e 3f9abe32 -> 00000000", + "c156228f 4195cc07 3f67ec03 -> 00000000", + "c08316fd c15a3168 3fd6c565 -> 00000000", + "bf041c7b c0bd0e0e 3f70b4f9 -> 00000000", + "4144faf9 3f027628 3f5e30f3 -> 00000000", + "c0043dd9 40ddeaec 3ff58270 -> 00000000", + "4167d4d6 c18451ac 3eddb337 -> 00000000", + "c178d2b9 3f3f1142 3fcb2db0 -> 00000000", + "410f7715 c06916ee 3f92af2e -> 00000000", + "3f199066 c0ce3732 3fbd38d5 -> 00000000", + "bff67296 c0dab86c 3fe31160 -> 00000000", + "c0c239c0 4114a29a 3fffa6d2 -> 00000000", + "417e97a8 4177252c 3f7bb281 -> 3f800000", + "c0b195b0 4160a994 3fcce8fe -> 00000000", + "c004308e c16d9275 3f116a3e -> 00000000", + "4126cc06 4122059e 3f937af4 -> 3f800000", + "3f6d8b4d c199e116 3fc7886b -> 00000000", + "c194a6b5 40ec2423 3f0d21b6 -> 00000000", + "4189b300 c03ec045 3ff269db -> 00000000", + "4184bb71 c1034902 3ff37407 -> 00000000", + "418b6f4a c19b6a21 3f8f89d8 -> 00000000", + "c1704247 c18946ec 3fec1636 -> 00000000", + "c16a5b4c 40ea1c3e 3fd512e8 -> 00000000", + "c0cf1250 3f6adf1f 3fa1a55b -> 00000000", + "41141c42 c17b271f 3f34d254 -> 00000000", + "3efcbdb5 c0995f53 3fd7e55e -> 00000000", + "40024582 bfcd9737 3f422dc2 -> 00000000", + "c0b0c439 418aa066 3f523ada -> 00000000", + "411a74c8 c17aafea 3f122016 -> 00000000", + "4109dd21 4160ca2d 3ea01f18 -> 00000000", + "c11319c2 40b96b54 3f5158bf -> 00000000", + "c104449b 418d0e4d 3fd66b5e -> 00000000", + "c189c337 40dcc8f2 3ede69a8 -> 00000000", + "40817306 c0d28ff5 3f930b19 -> 00000000", + "418ec45b c0950010 3f23647a -> 00000000", + "bff9a514 c1852611 3f5d3423 -> 00000000", + "41037a47 c1664911 3e2fa0e7 -> 00000000", + "bff91719 c0999436 3f90f588 -> 00000000", + "40bc7702 c10a9505 3f90da51 -> 00000000", + "c0d586b4 3de74d82 3fadb127 -> 00000000", + "c16ad2f8 41118ff8 3cceee66 -> 00000000", + "c087d913 c0a98575 3f380e79 -> 00000000", + "4173af5b 4132fd62 3e6ec2a9 -> 00000000", + "c0ff09ad c0a50ad7 3f94f516 -> 00000000", + "3fcccf22 c126abc7 3fe77099 -> 00000000", + "c0f06c8f 412b90f4 3ee98677 -> 00000000", + "c1171890 40c34dcd 3f88f79d -> 00000000", + "c006a940 412f6a70 3ff7f4d4 -> 00000000", + "4137f961 419729a5 3dadc6e9 -> 00000000", + "c0c41471 c0a00fe5 3f40c761 -> 00000000", + "c08a4a2c c18af599 3f8700a0 -> 00000000", + "411d31dc c119d63a 3f387d7d -> 00000000", + "c15c1bd2 4107420e 3ffa835d -> 00000000", + "c147d8f8 c13322b8 3ebc9a25 -> 00000000", + "c02cae2b c044b033 3f949cfb -> 3f800000", + "40b22806 413c0c67 3ed073d0 -> 00000000", + "40b5e078 40776ae1 3e96e1b2 -> 00000000", + "c11e62b2 41027cbc 3fbb527c -> 00000000", + "41921888 41844871 3faf001e -> 00000000", + "c08c222d 4197556a 3f2bad23 -> 00000000", + "413cdba0 c1807e98 3fa7bf3a -> 00000000", + "c1965dd2 c18504c7 3f6cee01 -> 00000000", + "41355d5a c197f770 3ec1496c -> 00000000", + "c0b53421 419ba506 3e7d15f2 -> 00000000", + "c08ebd85 c0fe354b 3fe441e6 -> 00000000", + "c1328404 c188c7ce 3fa5bfb6 -> 00000000", + "40ffbae5 40b813fa 3ffe3133 -> 00000000", + "c08fa171 c183191c 3ea1d54c -> 00000000", + "c180e39f c0ff4f13 3fb56e25 -> 00000000", + "408bfb62 4000ae31 3f7aabd2 -> 00000000", + "3f0bbed1 c134e1c5 3fa32ed5 -> 00000000", + "c19f092b c1790693 3fb2f85a -> 00000000", + "c19dcdcd c0508213 3f82b29e -> 00000000", + "40e74052 c10b296f 3fe63760 -> 00000000", + "c126990f c0de3f0c 3f8a32c8 -> 00000000", + "4184366f c13af84d 3fd94647 -> 00000000", + "c1353e87 3f399249 3d47734e -> 00000000", + "c0f140fd 412527e3 3fff7cbf -> 00000000", + "c033d674 403a9e62 3fd6ecd5 -> 00000000", + "4192210b c18dd9bf 3eaa41c6 -> 00000000", + "c145e806 417488e4 3fe2c4b2 -> 00000000", + "c0ac509a 418b7cb2 3f7f8860 -> 00000000", + "41890508 3f328963 3f6bac41 -> 00000000", + "c118429d 40373e6c 3f664b27 -> 00000000", + "408bc4ad c11798fb 3f3df79a -> 00000000", + "bc56e698 41767195 3f04203e -> 00000000", + "41445ab9 c141a76c 3fbdd211 -> 00000000", + "40acdbe7 414378b2 3fc31501 -> 00000000", + "c185a1c2 412fdc67 3e197522 -> 00000000", + "413dcc43 c159ba8c 3ecc7e7e -> 00000000", + "c1348e79 416ff462 3f47d331 -> 00000000", + "4101a73e 4180dff0 3f97df87 -> 00000000", + "c159a312 40bfdb0d 3ed3f7ce -> 00000000", + "3fae8e81 41304dd9 3e0445ad -> 00000000", + "4195e40a c15ad210 3f1b0d07 -> 00000000", + "c17fd44d c10eeefe 3f88a646 -> 00000000", + "bfb24d4b c0e2ae1c 3ff09389 -> 00000000", + "c185ba57 c16903c4 3fadb40b -> 00000000", + "400cafff 3f74e3db 3f43df62 -> 00000000", + "c11f57fc c0b150fe 3fb380b4 -> 00000000", + "c061cf7e bf272d22 3feec03f -> 00000000", + "413443d4 4059ff32 3f5808dd -> 00000000", + "c17df323 c167aea6 3e6d2280 -> 00000000", + "3fae30bd 40c6d774 3f339348 -> 00000000", + "402f8236 417aca21 3f5a9d27 -> 00000000", + "4091b4c6 c119480c 3ef4a561 -> 00000000", + "c1622d9b c19bba2e 3fd447fe -> 00000000", + "40d59069 c1051866 3f94af49 -> 00000000", + "bfc6e80d 40b6fbd9 3fc132f7 -> 00000000", + "4168ec4f c16bc7ec 3e7788e2 -> 00000000", + "c0c287d3 c13f32da 3ecf9ddf -> 00000000", + "c1961eed c14fcae3 3f2b5c6a -> 00000000", + "c083a3be c0303fab 3fba6fc4 -> 3f800000", + "c1297019 c148e13d 3f16e61d -> 00000000", + "40ee0187 c0a488b1 3fb75648 -> 00000000", + "c0889a7c c0f57eb3 3fce0d93 -> 00000000", + "c0ecbe13 c1837d0b 3f8d13ac -> 00000000", + "c18b67e8 41992bc7 3fe077f8 -> 00000000", + "c18963b6 418daa7b 3f33a9c3 -> 00000000", + "412c0212 c08ab3f8 3f0b0886 -> 00000000", + "c19271fe 4158798f 3f0a98de -> 00000000", + "411466a4 402d5d0b 3e105fb5 -> 00000000", + "41871aca 41846f05 3f7203ba -> 3f800000", + "c0ccd0ea c1953de4 3f49b58e -> 00000000", + "3fb65046 4181d030 3f045352 -> 00000000", + "c1901717 c154eae3 3f7f7679 -> 00000000", + "c12d7a13 40a6cc1b 3e2284a9 -> 00000000", + "3fd1f7e7 414926fd 3fd68c68 -> 00000000", + "410b0518 40d4793a 3e3b5017 -> 00000000", + "c15f757d bfdf2fc6 3e380ca8 -> 00000000", + "bfcb1d86 c016dc3f 3fc4365f -> 3f800000", + "c0cd40a3 414b87fb 3f922bf3 -> 00000000", + "c1917400 4171d2c3 3fc1a2e5 -> 00000000", + "4146b59e 418d22cf 3f158708 -> 00000000", + "c17e4266 c021f816 3f48c0d1 -> 00000000", + "c0ae2d55 416d829d 3fcd7fad -> 00000000", + "c1245d52 c16168e1 3fc926c7 -> 00000000", + "4087b301 4161a583 3f45f7f0 -> 00000000", + "40826014 416fa6b7 3f213593 -> 00000000", + "4154eaa0 c189acf4 3f21cb4e -> 00000000", + "411ce29a c08afd76 3fc8039d -> 00000000", + "415f98c5 c19e3aa0 3ffb3eec -> 00000000", + "4062bc92 bf9dc0eb 3f440881 -> 00000000", + "416757d1 c184b662 3f5cc5e4 -> 00000000", + "c1974922 c137c37d 3e9dc2e0 -> 00000000", + "c19b5236 c0b048bc 3f94fe5e -> 00000000", + "c06ee384 c174f05c 3ff2128b -> 00000000", + "419f29f9 41261103 3fd95f35 -> 00000000", + "c114a18a 40894d97 3fad09aa -> 00000000", + "40bd45c5 40401ca4 3d399bab -> 00000000", + "bf99650f 417ede08 3f9efb2a -> 00000000", + "c066abd0 41277096 3f9e8acb -> 00000000", + "c0e75d4e c119ce7f 3e9998c1 -> 00000000", + "40065592 c1470e69 3edc03f4 -> 00000000", + "408151ef be91fa77 3f7caae2 -> 00000000", + "bd92a324 c128915e 3f387059 -> 00000000", + "c166feeb 3f838fba 3fe87693 -> 00000000", + "c0ed2bea 40b1f2a0 3f73994f -> 00000000", + "c0b8a800 c1771d88 3fde0fbc -> 00000000", + "c1649d85 4153c4dd 3f09bee7 -> 00000000", + "c014a97e c09a6139 3ed6e7ea -> 00000000", + "c12609a1 c18f8f76 3eba0646 -> 00000000", + "c1447212 3ecf1143 3fc3fa89 -> 00000000", + "4105c219 c087a63c 3fe2fa97 -> 00000000", + "c18556f8 419a378c 3f90136d -> 00000000", + "4127a27f 40151b57 3fad22af -> 00000000", + "4163f64d c191f531 3fcefcfa -> 00000000", + "c042f0df c0e6596f 3dd73069 -> 00000000", + "c158ee95 c1167be2 3ffc7afa -> 00000000", + "41067324 c0ad16a0 3f8cf882 -> 00000000", + "41804d92 c18beb74 3ffc4f3e -> 00000000", + "402c11ab 415c3b0b 3ff1ea36 -> 00000000", + "c0b722d9 41849645 3fdb596c -> 00000000", + "407e318c c183bcd0 3fa4f880 -> 00000000", + "c1946abe 41836727 3f9124f9 -> 00000000", + "3f08d700 4180ba35 3ee2d594 -> 00000000", + "c179652d c0d48fec 3f59a947 -> 00000000", + "c02a1e57 c18b2097 3fcc1895 -> 00000000", + "40b3c44b c18d0cc5 3f9af16c -> 00000000", + "c1672fbc c17ffe5f 3eb1bb69 -> 00000000", + "4047ecfe 404155e6 3f9c56c5 -> 3f800000", + "40d7c453 4183f12f 3fe32408 -> 00000000", + "412b2dc8 40e4b77d 3f544289 -> 00000000", + "41835a3a c1551824 3f3a26ac -> 00000000", + "3fb10a21 c10bbf41 3f8e9654 -> 00000000", + "c082c9df c1001479 3fd7b683 -> 00000000", + "4190de41 c11758e3 3f8564dd -> 00000000", + "c1564329 c11243ee 3fa43757 -> 00000000", + "4185b8cc 3f8e3419 3f4182dd -> 00000000", + "c1373461 c169c1ca 3fb1795a -> 00000000", + "c159bf10 418cf1a6 3e720a07 -> 00000000", + "3e3bc7a8 c024f264 3fcd3ebe -> 00000000", + "c0e3dd23 4172ea77 3f9b27b0 -> 00000000", + "41758649 c0b5125d 3fd4a89c -> 00000000", + "c1344029 c19edb8e 3f981021 -> 00000000", + "407cc7ec 41412ae5 3e5454c8 -> 00000000", + "41908922 40a66bf9 3f99a87d -> 00000000", + "40cdada8 c1555255 3f654669 -> 00000000", + "4150792b c13fb116 3ff49edb -> 00000000", + "c19d814f c0a48d8f 3fc0a58e -> 00000000", + "c1004157 415f3d7b 3ede06f9 -> 00000000", + "c175a158 41982487 3f3eb4b7 -> 00000000", + "c1846398 bcd08587 3fda72ac -> 00000000", + "c1880f8d c10cc5be 3fdd12e8 -> 00000000", + "41367d8d 41985a43 3e0175e6 -> 00000000", + "c06bf50f c086c5f0 3fd59f6f -> 3f800000", + "4052e318 4005c17a 3f06acf9 -> 00000000", + "41999725 4137359e 3f190239 -> 00000000", + "c101bc55 40b6f786 3e40ebb7 -> 00000000", + "c07be5fb c14bc8fa 3fee5b06 -> 00000000", + "415ec311 c169d5e9 3ff41d84 -> 00000000", + "c0f79594 bf7f5229 3f3f222a -> 00000000", + "4189faff be2562df 3f8eb155 -> 00000000", + "411efc1f 419372af 3fec20cb -> 00000000", + "c18103ed 40b60a4f 3ea5c49f -> 00000000", + "c0a5d79a bffb370d 3f68517f -> 00000000", + "4037e7dc c191cde3 3f987370 -> 00000000", + "416eb832 c190f508 3f180900 -> 00000000", + "410d7993 419c3b66 3f9a464e -> 00000000", + "41850922 c1309478 3ed1b848 -> 00000000", + "c147e94d c07b35ad 3e72fb66 -> 00000000", + "41972df1 c0cfd624 3e8f736c -> 00000000", + "3ef60beb c1857b80 3f796c53 -> 00000000", + "c14997f6 c10a7a29 3faa213a -> 00000000", + "40431d23 416e1925 3f3507ec -> 00000000", + "c11aac38 413fdadc 3f5de02f -> 00000000", + "4198e6d7 c139e539 3f83ec0d -> 00000000", + "409c79c8 c19771b5 3c81a223 -> 00000000", + "c0db2e00 c128c9de 3ff9edb4 -> 00000000", + "403545a5 c0e6c7ee 3c264e42 -> 00000000", + "c0af445d 4189f605 3ebb8190 -> 00000000", + "4047015a c179bdae 3f94663d -> 00000000", + "c15d2bb2 415a7f1c 3c150549 -> 00000000", + "c12715fb c18f9b0f 3f1c9eb9 -> 00000000", + "4118d49b bf8976b1 3f909613 -> 00000000", + "40456128 c17be42a 3f9385a7 -> 00000000", + "c0bc95da 415ff8b4 3f564744 -> 00000000", + "c10a6358 c1563caa 3f8cf133 -> 00000000", + "c1113ae8 40cc8b8f 3f5501ac -> 00000000", + "c1339faf c0fec7d4 3f9b7721 -> 00000000", + "bfb6b262 41970845 3eadaa37 -> 00000000", + "c0868ed7 415f5ad6 3f6b90d2 -> 00000000", + "412040ad c033c0e7 3f6e4ea2 -> 00000000", + "c137c281 c128689e 3e0cf3ec -> 00000000", + "c15fa070 c194c28d 3f80b32f -> 00000000", + "c157f55f c0a8d9e5 3ee6f235 -> 00000000", + "40254eeb c18c474f 3f784faa -> 00000000", + "bf6597ca c089547c 3fdd1b1a -> 00000000", + "41913b62 40f0b90a 3fd46e63 -> 00000000", + "410d1b23 c1428406 3fb7b0ab -> 00000000", + "c00b2c50 418885ba 3eac7766 -> 00000000", + "c18f8768 bf93bd6e 3fdcd4c9 -> 00000000", + "413bc5d9 c00e58a1 3f9d7331 -> 00000000", + "4174637a c188473b 3f00768a -> 00000000", + "401cefc8 404852f7 3fff6d37 -> 3f800000", + "40aab57b c13a8568 3f2c0d7d -> 00000000", + "c104537e c18c9d8b 3e64f170 -> 00000000", + "41493d6d c02a9fc8 3f09e8e6 -> 00000000", + "c1825605 c0aedf71 3f98bfa4 -> 00000000", + "c14da1f3 c083211d 3e6f32b9 -> 00000000", + "413a4e41 40344985 3fb3b924 -> 00000000", + "c0afe634 c15d6a8e 3efa6ea0 -> 00000000", + "c16d6e38 41201938 3fba7388 -> 00000000", + "c1915329 c1711ab4 3feaf4dc -> 00000000", + "41383098 40bc70d4 3ff491ee -> 00000000", + "c1867d91 4167066e 3cb8cd89 -> 00000000", + "bfc1c9c9 41599536 3fe4a58b -> 00000000", + "c151fcf2 c16b608a 3fa3aaa1 -> 00000000", + "c111b4be c11ab298 3ffd2998 -> 3f800000", + "410f55ff 40880707 3fddc514 -> 00000000", + "40f15b5d 41277c37 3fb8dc84 -> 00000000", + "c1883e1e 410982a9 3f863ae2 -> 00000000", + "4187052b c176e4e7 3f1f5462 -> 00000000", + "c169fc1b c0f18a6e 3f273082 -> 00000000", + "c092ab18 4122bf18 3ffe9eaf -> 00000000", + "c0c6e58a c137db44 3f9c2ede -> 00000000", + "410f6a12 4115d42d 3f2e828b -> 3f800000", + "c15c5a02 c0281b6c 3ecd0327 -> 00000000", + "c13ec9ce bdca19ae 3f025f73 -> 00000000", + "40fd4ae5 c1539954 3fca7579 -> 00000000", + "c14460a4 40e32c47 3fc5732b -> 00000000", + "414fe777 c1048643 3ee9fda0 -> 00000000", + "4181d127 c197ab13 3ca7166a -> 00000000", + "c159f576 c196d9d7 3ffde8c8 -> 00000000", + "418e0404 402be360 3fbe89e4 -> 00000000", + "c07b83e8 40b6755e 3e6d03dd -> 00000000", + "c02d7c70 4181ba87 3fc59acf -> 00000000", + "c0cb475f c1790325 3f8c39c8 -> 00000000", + "4135b378 419ffd68 3e71494e -> 00000000", + "bfec5415 bf025031 3fadb134 -> 3f800000", + "4101b841 c0b27f71 3f8571a1 -> 00000000", + "417f60ae 4180c179 3fee2eac -> 3f800000", + "c15a26bd c110798b 3f091466 -> 00000000", + "417a71b8 4087d229 3fb1c638 -> 00000000", + "40c22848 4139100a 3cec5515 -> 00000000", + "bfcc6af4 416664e8 3fc68bdb -> 00000000", + "3fc123cb 40e93e99 3f272dc5 -> 00000000", + "c16d5bd4 409d0b9a 3fb05e5c -> 00000000", + "418597ba c16fc6c1 3f6a5483 -> 00000000", + "bfa1f4f7 401ebeb8 3ebdc6b7 -> 00000000", + "c1882873 40bc46ee 3e641073 -> 00000000", + "4146f3ab 41805311 3d101086 -> 00000000", + "c191469e c172d737 3ef57062 -> 00000000", + "419ef0a7 c14b99c9 3faaa258 -> 00000000", + "c0b9d647 c12fbc54 3e9f77ef -> 00000000", + "40afd3cb bf9f4aac 3fa49acb -> 00000000", + "c19479b6 c1013d30 3fd2ab63 -> 00000000", + "c080e979 41834212 3e469caf -> 00000000", + "c1183361 410c23ef 3ecfc2eb -> 00000000", + "418f98c0 41976487 3edb656c -> 00000000", + "c163c8e3 40db2ffd 3f1a76c7 -> 00000000", + "40c4f0c9 c08a07db 3f7a2fcd -> 00000000", + "c15601d6 41517595 3ec38fc6 -> 00000000", + "bf755134 c17d06b8 3fd8a28c -> 00000000", + "c11e1b86 418105e7 3de25dbc -> 00000000", + "4181d40f c19dcf0a 3ed41a83 -> 00000000", + "c0d2f383 40dccb6c 3f531a47 -> 00000000", + "c15ed52b 4029eb07 3f84450c -> 00000000", + "c176675d 415b8ab6 3eba74c4 -> 00000000", + "414de43e c0b036b5 3f16e0e8 -> 00000000", + "3ff9d4e0 4182686e 3f631456 -> 00000000", + "416be325 c1980f38 3ff76e0c -> 00000000", + "3e8cb148 c175e5f5 3fd1571c -> 00000000", + "409517f0 c1838fd6 3fd8648e -> 00000000", + "c1505cf3 c0822d56 3ebd7138 -> 00000000", + "4145d76d 418d234c 3e7a90c9 -> 00000000", + "40df002a 4125a043 3ef92181 -> 00000000", + "c0c35437 c193da22 3f870288 -> 00000000", + "c14c9fda 4191474d 3fbeb275 -> 00000000", + "c0d77e36 3f4178de 3f553ea8 -> 00000000", + "4115d94b c14895b0 3edf90c3 -> 00000000", + "c0a96187 416c3922 3f4a2e12 -> 00000000", + "c1074904 c15df5fe 3d3238fe -> 00000000", + "c123a879 4011afd8 3fb46963 -> 00000000", + "c189b453 411a590a 3e99077e -> 00000000", + "419e1dab bd97c7be 3fac95cb -> 00000000", + "40d4da66 4192f403 3eacbe01 -> 00000000", + "c0371ae5 c0e137f7 3e387c4c -> 00000000", + "41131d73 bfb30fcd 3fdda960 -> 00000000", + "c08e29cc c18bc044 3f1ca52c -> 00000000", + "c07f72bf c18e5634 3ffeef72 -> 00000000", + "c0eb3f2f c0e3b7f3 3f9a8020 -> 3f800000", + "c085a3bd c1169d11 3e8118eb -> 00000000", + "c119bf66 c00f9c4e 3f12b46d -> 00000000", + "c0236a9b c1333f35 3fbba9cf -> 00000000", + "412a67d4 3f489588 3fe1dbbb -> 00000000", + "c118850a 41808e6e 3fe67ccf -> 00000000", + "c1105e07 3ea371e3 3faff05a -> 00000000", + "40302283 41926652 3f8575eb -> 00000000", + "c130a5ef 416838ce 3e137168 -> 00000000", + "408df7b5 c13a23a7 3fb17bf6 -> 00000000", + "c1603f53 3bd1c931 3fa38b0b -> 00000000", + "c019ace6 c1965746 3f2ccb0a -> 00000000", + "c14ff08a c17f6f87 3fe25711 -> 00000000", + "414d919d 41645fd4 3f735fb4 -> 00000000", + "c1644fbd 41854c28 3fa5cd6d -> 00000000", + "c1828aef 419037da 3f2c4b03 -> 00000000", + "c034ae40 c13720c6 3feaa5a7 -> 00000000", + "c11e6522 c18f07cb 3f94ce0a -> 00000000", + "c1562954 c138977c 3f01871d -> 00000000", + "c0a5a991 415019e0 3fc0f405 -> 00000000", + "c091fdf7 c0f93f4e 3f7382d0 -> 00000000", + "40cf73db c11b3d8b 3f050e35 -> 00000000", + "c127e4f2 bf7759af 3f3affd4 -> 00000000", + "4106ae1f bf019f2b 3fde3d64 -> 00000000", + "3fdfc188 410ae6a9 3ea9f637 -> 00000000", + "4112dbaa 3f411568 3fc85851 -> 00000000", + "412e709d c0f97ccc 3fc10ae5 -> 00000000", + "3fbf49f0 c0a7e2fb 3ffbfdcb -> 00000000", + "40693767 401640bf 3f746e1b -> 00000000", + "c17f2223 c06a7e40 3ff142c4 -> 00000000", + "bf193a22 3facfd80 3e860164 -> 00000000", + "3fe590a6 c149ab10 3ef5e556 -> 00000000", + "bdf0813f c04a0ea9 3ef40229 -> 00000000", + "c0a324cd 4157b7c7 3f7252fb -> 00000000", + "40840b0e 41212530 3fe0050c -> 00000000", + "40d608a5 c09d56cc 3fb66a00 -> 00000000", + "3fd00782 c19a9761 3f90a518 -> 00000000", + "c147eacb c081569e 3fc15e36 -> 00000000", + "3eca15ce c0f81a82 3fc05d1a -> 00000000", + "c13d0772 418dfbce 3ff4774b -> 00000000", + "40d7f7fe 40cd1961 3eec2b8a -> 3f800000", + "c0b47121 c179a8d0 3fb90340 -> 00000000", + "40a55424 4152b3ca 3e79149b -> 00000000", + "418d2343 c0b7c490 3f778a7b -> 00000000", + "c190c971 bf3267c7 3e8a1a91 -> 00000000", + "3f5028b3 be0c894a 3ee783d0 -> 00000000", + "41905b46 c108c8be 3ff131c7 -> 00000000", + "4181683f 4183607e 3d9a0dc1 -> 00000000", + "410ea50b c0f4ec0f 3fcb56b2 -> 00000000", + "c15a24eb 410ed29c 3dee0d30 -> 00000000", + "41893eb0 411b28d8 3fcbab36 -> 00000000", + "c0e245c4 3f8cdec9 3eddddda -> 00000000", + "c132b69c c0f76b77 3fd2e493 -> 00000000", + "3f9be8f3 40e2e86f 3fd78659 -> 00000000", + "c04c4a47 4184f07e 3fcd0f6c -> 00000000", + "40e0702e c19fb47b 3eef32b0 -> 00000000", + "4183f2fd 41012f72 3fb19ac4 -> 00000000", + "40c4956e 4199ae9b 3fa7d3af -> 00000000", + "41418243 c0e621cd 3f4f27f0 -> 00000000", + "bf793364 c1129cfc 3ff7d7f8 -> 00000000", + "c0ef0478 4118851e 3de247e5 -> 00000000", + "c17c09b0 40ef105b 3f23e25d -> 00000000", + "c1580329 41918bcb 3ecd2833 -> 00000000", + "c0d9ff3a 3edb7d3d 3eaa34a1 -> 00000000", + "41808dc3 c1308f69 3eae5d82 -> 00000000", + "c1359ecf c0e058fc 3ec44c00 -> 00000000", + "41525bf3 bfb27a16 3fe5c616 -> 00000000", + "4116243b 40e8fec5 3f5c4d91 -> 00000000", + "c1430e14 c190809b 3ff03c3c -> 00000000", + "41034c8d 402b32a9 3f87eb58 -> 00000000", + "c14a7c0c c0e81694 3fbf1f52 -> 00000000", + "c185b393 3f0a6d09 3fc3cc38 -> 00000000", + "40bf95a4 4196aff2 3f54078b -> 00000000", + "c108fe47 c050d856 3fc99892 -> 00000000", + "c191cde0 bff04709 3f36039c -> 00000000", + "c1679e77 c188e6be 3ed264a3 -> 00000000", + "c179b37e bfcef81c 3ab8d385 -> 00000000", + "c084fd08 4188d22c 3f51c90d -> 00000000", + "bf906c2c c1876a75 3f59a534 -> 00000000", + "c11c5b54 c19b9c28 3f76d823 -> 00000000", + "416a423d 416b7651 3f934718 -> 3f800000", + "4127dec0 4078f652 3fe7ec4f -> 00000000", + "417dc425 4088d70e 3e8f2bc0 -> 00000000", + "c0ce6859 40035204 3f5ed1e4 -> 00000000", + "c0f97422 402b982a 3f468abe -> 00000000", + "c1528412 c19e1c73 3f83deee -> 00000000", + "418b786d 41859a92 3fd386c2 -> 3f800000", + "41527c29 c0c3c9ba 3f25f70c -> 00000000", + "4188c245 40e379a7 3fb85575 -> 00000000", + "c0bec32b 413fe3a5 3ef24b66 -> 00000000", + "412a181c 4138db43 3f87c414 -> 3f800000", + "c0e39da5 403e130e 3f0e979f -> 00000000", + "bf6c575f c19d9f22 3f69495d -> 00000000", + "419fca4c c02f201e 3f667804 -> 00000000", + "3fd01a13 415514ff 3e5f8bb1 -> 00000000", + "c199bd2c 40e1cced 3fb53f0b -> 00000000", + "c19f09e1 4140247c 3f1a8910 -> 00000000", + "41865bdb c0f10744 3c891b04 -> 00000000", + "419fb8c6 c18fe1a5 3fd4880e -> 00000000", + "c0d918d6 c0d53fb0 3f475d48 -> 3f800000", + "c0037932 c0d1219f 3f1b3e65 -> 00000000", + "411092db 41451557 3f2183b3 -> 00000000", + "418444b2 41455d09 3c621aee -> 00000000", + "c18bf794 c0c1d39e 3fb781ee -> 00000000", + "40937f84 41229ed1 3fcb0eb3 -> 00000000", + "41426a3f 40bf9dbc 3efbcc05 -> 00000000", + "c0322727 c081caea 3e3af4f1 -> 00000000", + "c07510cc 419bacdf 3ff71b9d -> 00000000", + "c196a589 c0900113 3ef77aa8 -> 00000000", + "415d1a5e c0e6a911 3f06de15 -> 00000000", + "c196bef1 c118ab5a 3fa06b44 -> 00000000", + "4196d0c2 c0ee1b58 3fc20088 -> 00000000", + "418e9cf4 41377fa4 3edf4276 -> 00000000", + "c12e6bf9 419dfd7d 3f61e6a6 -> 00000000", + "c132b6b2 415cc179 3fffd2c1 -> 00000000", + "c12d8d6d 418e2827 3fa30f83 -> 00000000", + "c12576f2 c0db4c20 3f9d2fd9 -> 00000000", + "c093a0a6 41800fab 3fe8bf2d -> 00000000", + "c1188a8d c12b7123 3c874962 -> 00000000", + "c1850eba 3f9826b8 3f3aeb42 -> 00000000", + "40c8635d 3ff3b417 3f2977f0 -> 00000000", + "c11f0a12 40389416 3e1bf2a9 -> 00000000", + "c19110fd c156dcb5 3fcd63cf -> 00000000", + "3de7af9a 3fbe18e6 3fea59aa -> 3f800000", + "c17b0f30 418b238b 3e2023a2 -> 00000000", + "41108368 40c3e1cd 3fc0e06f -> 00000000", + "4105b53e c12b2658 3f9a0f5e -> 00000000", + "41801b98 c1157df3 3fb42747 -> 00000000", + "c10b36f1 4097eaf7 3e74336f -> 00000000", + "4098abbc 41952e66 3b05094f -> 00000000", + "c108a56c c12992ae 3fb106e4 -> 00000000", + "c098b380 41822cc3 3fcaab04 -> 00000000", + "c00d4819 41680e45 3daf3fa0 -> 00000000", + "c18a974b c18a3417 3f38dcf5 -> 3f800000", + "4061af50 40a0d104 3eb4bcab -> 00000000", + "c17fd324 413e88fd 3e1b8856 -> 00000000", + "c0a862e4 c0092915 3f219f0c -> 00000000", + "c07e4680 c193ae65 3f86e8b1 -> 00000000", + "410af998 c16b55f3 3f029325 -> 00000000", + "412c2a81 4135c5dc 3f0203cc -> 00000000", + "c19ca1e4 41810cfe 3eebba8e -> 00000000", + "c14837cd c0ee2a3c 3f900067 -> 00000000", + "c010ec49 c19c6b8e 3f5317d0 -> 00000000", + "4166d7a7 3f0abd8a 3e44cd2e -> 00000000", + "c1901e8d c0b8d237 3fbc8602 -> 00000000", + "c082c2b2 41478804 3f740f6f -> 00000000", + "4098badd 4183da8e 3fce3435 -> 00000000", + "419c7f92 c1783ac5 3f938dc9 -> 00000000", + "c1586f42 c1413e03 3e72a916 -> 00000000", + "c0a05d25 410d8066 3fd3ba92 -> 00000000", + "c0996707 40b33b4d 3f2d32d7 -> 00000000", + "c00c0b83 416f7151 3d9aa113 -> 00000000", + "40f18393 41271e0c 3f5ee635 -> 00000000", + "c122931c 4111f336 3faab615 -> 00000000", + "419fbb40 415b67b4 3f8a1f91 -> 00000000", + "c105f074 414a4eae 3fdfcaa1 -> 00000000", + "c0d1c27b 41814eb3 3fff00ab -> 00000000", + "412bf1c7 4153af7c 3fb0f91b -> 00000000", + "c1708892 417f0394 3f3ed156 -> 00000000", + "3ec6f84c c15ffaa3 3ff53da1 -> 00000000", + "c10132b2 41970251 3f5ef2ff -> 00000000", + "3fdd9e70 c0971da2 3ff4de0d -> 00000000", + "c1874e6d 41248aba 3f240d8e -> 00000000", + "c135cf9b c10e5679 3e85fc37 -> 00000000", + "c188c510 401575ca 3ed9c0e6 -> 00000000", + "bf9cd642 c188b1ee 3f96eec3 -> 00000000", + "c08af748 c19bb083 3f306db3 -> 00000000", + "c0f9a4b0 c185b45a 3faf70b7 -> 00000000", + "415b7995 4158f3c8 3fc9e813 -> 3f800000", + "c08a57df 4186e44e 3f0ed528 -> 00000000", + "4119969f 4153a3d2 3f1b4eea -> 00000000", + "c17a73f9 4187e3ce 3f4683ef -> 00000000", + "c0913041 419f7d1f 3f2b5feb -> 00000000", + "c106c8d1 40a94119 3f48076a -> 00000000", + "c0d783b9 c0f2f8ba 3fce2960 -> 3f800000", + "418137e0 c14675eb 3fb59c52 -> 00000000", + "c171f358 41721005 3f8b66a7 -> 00000000", + "c17becdb c11df550 3fa5ae68 -> 00000000", + "41876ca7 c199be23 3f58095c -> 00000000", + "bdcd7e46 c13f37fa 3e822c91 -> 00000000", + "411a5853 3f38a864 3eb68b31 -> 00000000", + "c18515af c13e1588 3f184e0e -> 00000000", + "bf17e8d3 412c9b17 3f6ff684 -> 00000000", + "c06fe0a4 4097ee91 3f22206e -> 00000000", + "4032a145 4186f6b4 3ffe9e15 -> 00000000", + "c074d648 418f561a 3f9aa048 -> 00000000", + "c1332f8f c100c17c 3ead7bc3 -> 00000000", + "40b4fb06 413ec37d 3f85a9e2 -> 00000000", + "419b8696 c199ba82 3f95d5a3 -> 00000000", + "c08653f4 418bf5a0 3f142045 -> 00000000", + "c046682b c0efd59a 3f3baef4 -> 00000000", + "c1587657 c19130c7 3f267579 -> 00000000", + "40dc9def 41173c9d 3fc44d81 -> 00000000", + "c1662a0d 410cc199 3fea328b -> 00000000", + "415b27ac c18fb993 3fc58a34 -> 00000000", + "c18c8571 40999d6e 3f1f40f2 -> 00000000", + "c177ed7d c0a7ded8 3e6adc13 -> 00000000", + "4180868d 415af4df 3c8216e5 -> 00000000", + "406b402f c1883a1f 3f645f27 -> 00000000", + "416f0d58 c0aa0b05 3e4e4612 -> 00000000", + "c09273c5 c14e142a 3fce3c33 -> 00000000", + "417a83e0 c1918de8 3fde5575 -> 00000000", + "c18d6d8a 412e5b26 3f1456c7 -> 00000000", + "40ca3ae0 bf320eb5 3c18b2ed -> 00000000", + "417e253c c105b81f 3fefe745 -> 00000000", + "bf0d0388 c0daa56e 3fed3b66 -> 00000000", + "419a7cac c07440c7 3eac7f61 -> 00000000", + "40228f7f 415874b8 3f82a048 -> 00000000", + "419484af 414244d2 3fbe759e -> 00000000", + "bfc35972 bfcdde79 3ed66b5d -> 3f800000", + "41433e8d 4151304c 3e840eac -> 00000000", + "c14ee9b4 40d76dbd 3fcbd4db -> 00000000", + "4138dc3f c058698a 3de1d8f8 -> 00000000", + "401fe9f8 c17f9e15 3f3f34ae -> 00000000", + "4192ae27 c179f17d 3de9dd93 -> 00000000", + "41865fa9 be2f75ad 3e89675f -> 00000000", + "3d12a810 40b92957 3fcca656 -> 00000000", + "41074ac2 401356fb 3f00045d -> 00000000", + "c129f34f c0c9bf1e 3fad1b37 -> 00000000", + "3ff318d3 c132d83d 3e2a59ee -> 00000000", + "3f7bd79b c0b0abad 3feedb3d -> 00000000", + "bf53b8c9 c19de629 3ec65d13 -> 00000000", + "c1091871 c13c1e23 3f391708 -> 00000000", + "c188bf41 41821ac9 3df8d355 -> 00000000", + "c056b4f3 40c98909 3f264b91 -> 00000000", + "c12766e5 41038db7 3eb9881e -> 00000000", + "3f447c92 3f204293 3e030a85 -> 00000000", + "40e073b4 407ee62a 3e2f3f95 -> 00000000", + "c03a36eb 412986bb 3fffa6b7 -> 00000000", + "bfa0d495 3f8024e1 3ed45097 -> 00000000", + "c13f2ca5 c1455d2f 3febf2dc -> 3f800000", + "3fbb96fb c184e97e 3fb98e24 -> 00000000", + "bbf9149b c19f89f1 3ffc5e7b -> 00000000", + "3f8037d3 c192a7ca 3fd8b817 -> 00000000", + "c1479edd 412144f8 3ead33dd -> 00000000", + "40259ab0 4159d8a8 3fa3a778 -> 00000000", + "412cf6b1 c179c4e2 3fbb62ac -> 00000000", + "415567ef c0544fa1 3faf307c -> 00000000", + "c0e05bd6 c190bf4b 3fb0e536 -> 00000000", + "bf325821 415a704f 3f293c01 -> 00000000", + "c13a327f 40b2f9f4 3f5fed05 -> 00000000", + "4194926c bf88038b 3ff981f6 -> 00000000", + "c182315e c1667975 3f8195d7 -> 00000000", + "c0dbe78c bd8905bc 3e1d2ed6 -> 00000000", + "c122cdaf c1696ddc 3f76da9f -> 00000000", + "bfc2a969 410c41bb 3fef53fd -> 00000000", + "c1865406 419f3dac 3e980e6d -> 00000000", + "c19df483 c01da692 3f33897c -> 00000000", + "4111f4c4 c0e49c33 3f267992 -> 00000000", + "c10b4fba c0854d49 3fdc07a8 -> 00000000", + "bfb61fcb c09e2093 3f5cbb9c -> 00000000", + "416674ee 414eaada 3fe8673d -> 3f800000", + "c03068f2 bf43ab6d 3f2ae1a6 -> 00000000", + "418a2346 c18935ac 3f58279e -> 00000000", + "419f9542 418fe0b0 3eaa4fc6 -> 00000000", + "c17362f9 418f0c7a 3fd996dd -> 00000000", + "c07742a1 40e2cd72 3e242762 -> 00000000", + "c18a3e44 41758151 3de082b6 -> 00000000", + "c09a6336 3ee39394 3fe96e1a -> 00000000", + "c0c15e7b 412446d1 3ebd9c9b -> 00000000", + "4197dd72 40c5dfae 3df058a9 -> 00000000", + "c15231cf 4177ec9f 3fa58896 -> 00000000", + "418afc01 c1255a74 3ee5c4ed -> 00000000", + "c18889a1 c0652cef 3fb7f4f9 -> 00000000", + "c0ce673c bff541f9 3d30ce61 -> 00000000", + "c138bb87 40e3e970 3fea7cf9 -> 00000000", + "4096aa67 4000a256 3fffb887 -> 00000000", + "00000000 3456bf95 33d6bf95 -> 00000000", + "40a00000 40a00000 00000000 -> 3f800000", + "00000000 33d6bf95 322bcc77 -> 3f800000", + "3f800000 3f800002 00000000 -> 00000000", + "3f800000 3f800001 00000000 -> 3f800000", + "00000000 33d6bf95 00000000 -> 3f800000" + ] + }, + { + "function": "cycles_round", + "node": "ShaderNodeMath ROUND", + "cases": [ + "00000000 -> 00000000", + "3f800000 -> 3f800000", + "bf800000 -> bf800000", + "3f000000 -> 3f800000", + "bf000000 -> 00000000", + "40000000 -> 40000000", + "c0000000 -> c0000000", + "40400000 -> 40400000", + "c0300000 -> c0400000", + "3dcccccd -> 00000000", + "bdcccccd -> 00000000", + "40f00000 -> 41000000", + "c0f00000 -> c0e00000", + "33d6bf95 -> 00000000", + "b3d6bf95 -> 00000000", + "42c80000 -> 42c80000", + "c2c80000 -> c2c80000", + "461c4000 -> 461c4000", + "3e99999a -> 00000000", + "3f333333 -> 3f800000", + "4111c5f3 -> 41100000", + "41008713 -> 41000000", + "412cd7a6 -> 41300000", + "c0d546b3 -> c0e00000", + "c19dd589 -> c1a00000", + "bf6d73a0 -> bf800000", + "c11b5985 -> c1200000", + "c13ed911 -> c1400000", + "4189c3d0 -> 41880000", + "4195d6f3 -> 41980000", + "c18454fd -> c1880000", + "c198ff12 -> c1980000", + "40bb8d9f -> 40c00000", + "4128eb04 -> 41300000", + "c16ebf49 -> c1700000", + "416b1436 -> 41700000", + "c113fff0 -> c1100000", + "41380aad -> 41400000", + "c188901f -> c1880000", + "40edc2d2 -> 40e00000", + "c175df92 -> c1700000", + "bea1d0c8 -> 00000000", + "c0b478fa -> c0c00000", + "41646285 -> 41600000", + "4181da80 -> 41800000", + "415e6594 -> 41600000", + "4157c33e -> 41500000", + "40605af8 -> 40800000", + "3ef52642 -> 00000000", + "3f25ede7 -> 3f800000", + "c0c6628a -> c0c00000", + "c16f07e5 -> c1700000", + "4149a574 -> 41500000", + "c1598847 -> c1600000", + "41687887 -> 41700000", + "416de893 -> 41700000", + "4103a7ff -> 41000000", + "bf5662db -> bf800000", + "415a6d66 -> 41600000", + "c0e7eabc -> c0e00000", + "bf6c2bcb -> bf800000", + "c1289008 -> c1300000", + "c0b81f4f -> c0c00000", + "4195269f -> 41980000", + "c0c89e5a -> c0c00000", + "3f905e80 -> 3f800000", + "4111b609 -> 41100000", + "c18628cc -> c1880000", + "4116df46 -> 41100000", + "413addc6 -> 41400000", + "c19eb9f2 -> c1a00000", + "3f964568 -> 3f800000", + "c19770a6 -> c1980000", + "4084f218 -> 40800000", + "c16ea947 -> c1700000", + "3f93887a -> 3f800000", + "4178305a -> 41800000", + "41095f29 -> 41100000", + "40bed18b -> 40c00000", + "3ff34f6b -> 40000000", + "c1299edc -> c1300000", + "417521ac -> 41700000", + "c1825f65 -> c1800000", + "c19c25cd -> c1a00000", + "c177f0b1 -> c1700000", + "c163bd7c -> c1600000", + "418bca3b -> 41880000", + "4163f70f -> 41600000", + "411fb745 -> 41200000", + "c0ea2eeb -> c0e00000", + "c091cb3a -> c0a00000", + "c1169476 -> c1100000", + "c134cdcc -> c1300000", + "40fc4824 -> 41000000", + "419acbb6 -> 41980000", + "40a4e773 -> 40a00000", + "40014ac9 -> 40000000", + "becb3808 -> 00000000", + "3f24774d -> 3f800000", + "4110c667 -> 41100000", + "c160b883 -> c1600000", + "4190bda9 -> 41900000", + "41869bc9 -> 41880000", + "414bc08d -> 41500000", + "4154255f -> 41500000", + "c0d30a5b -> c0e00000", + "c1205ebd -> c1200000", + "c0029a01 -> c0000000", + "bfbb87ef -> bf800000", + "419410fc -> 41980000", + "41190605 -> 41200000", + "418c3fac -> 41900000", + "413d8639 -> 41400000", + "c1027c00 -> c1000000", + "c09342c3 -> c0a00000", + "bebb17e7 -> 00000000", + "3f686a50 -> 3f800000", + "40fe9332 -> 41000000", + "41521284 -> 41500000", + "4151e64a -> 41500000", + "c0d335f6 -> c0e00000", + "411a0560 -> 41200000", + "3fbd689f -> 3f800000", + "c082e2e8 -> c0800000", + "4191e0ea -> 41900000", + "c096a743 -> c0a00000", + "c17645eb -> c1700000", + "40b5bd22 -> 40c00000", + "3f6de445 -> 3f800000", + "3e57b303 -> 00000000", + "bff79782 -> c0000000", + "3ffabd69 -> 40000000", + "c1308f57 -> c1300000", + "404d92a5 -> 40400000", + "40579253 -> 40400000", + "4147308b -> 41400000", + "4151bc5c -> 41500000", + "411e4b3a -> 41200000", + "c1841205 -> c1880000", + "4144bd8d -> 41400000", + "40e00c94 -> 40e00000", + "c102cdee -> c1000000", + "c106ebc7 -> c1000000", + "c08ebbdf -> c0800000", + "41735bda -> 41700000", + "4130e61d -> 41300000", + "c19d4774 -> c1a00000", + "c18bdb32 -> c1880000", + "4002e125 -> 40000000", + "411aaa77 -> 41200000", + "40d0e47c -> 40e00000", + "40a9cb32 -> 40a00000", + "40ec2ede -> 40e00000", + "c16bcd7b -> c1700000", + "412dc829 -> 41300000", + "41898546 -> 41880000", + "c140cce4 -> c1400000", + "41902fef -> 41900000", + "402b8b24 -> 40400000", + "411b8c87 -> 41200000", + "c0181e33 -> c0000000", + "c19ea4fc -> c1a00000", + "413ec2e1 -> 41400000", + "3c454f96 -> 00000000", + "c112d1d3 -> c1100000", + "c1021a0b -> c1000000", + "bffcd655 -> c0000000", + "bfdb741d -> c0000000", + "4104d200 -> 41000000", + "4160f77f -> 41600000", + "c09c47fe -> c0a00000", + "c11a51e7 -> c1200000", + "c105f53b -> c1000000", + "c060036c -> c0800000", + "4187f6fd -> 41880000", + "c08c39cf -> c0800000", + "c020c005 -> c0400000", + "41205920 -> 41200000", + "c154721a -> c1500000", + "41132ac2 -> 41100000", + "3f1d8ab5 -> 3f800000", + "c117f18a -> c1100000", + "414b76e2 -> 41500000", + "419dca62 -> 41a00000", + "411026e9 -> 41100000", + "c1162ec8 -> c1100000", + "bfb7d9de -> bf800000", + "c17a8a98 -> c1800000", + "c042e616 -> c0400000", + "416a825d -> 41700000", + "415349f6 -> 41500000", + "c1177b37 -> c1100000", + "c0ae90d8 -> c0a00000", + "c15cb766 -> c1600000", + "411a3835 -> 41200000", + "c129c579 -> c1300000", + "41007a5e -> 41000000", + "c0a35cd5 -> c0a00000", + "418d920c -> 41900000", + "41939f12 -> 41900000", + "c0dbd32d -> c0e00000", + "c173fd73 -> c1700000", + "412fef6c -> 41300000", + "c18ad451 -> c1880000", + "408ec23f -> 40800000", + "41837951 -> 41800000", + "bf356bf4 -> bf800000", + "c19f7d77 -> c1a00000", + "4195b5bf -> 41980000", + "4167af6a -> 41600000", + "c134299f -> c1300000", + "418f7317 -> 41900000", + "c149ab29 -> c1500000", + "c11e75ed -> c1200000", + "c13cddf0 -> c1400000", + "bfc05088 -> c0000000", + "40a7b22a -> 40a00000", + "4040a929 -> 40400000", + "415c5972 -> 41600000", + "c196462e -> c1980000", + "c129e326 -> c1300000", + "c1344e21 -> c1300000", + "c1974ee1 -> c1980000", + "c124cf4b -> c1200000", + "c16709cc -> c1600000", + "c1065aeb -> c1000000", + "c0c2bb47 -> c0c00000", + "4141bd16 -> 41400000", + "c0226c12 -> c0400000", + "c0a3ea8e -> c0a00000", + "3e337a6f -> 00000000", + "40784caf -> 40800000", + "41896229 -> 41880000", + "c12ffc43 -> c1300000", + "40f74591 -> 41000000", + "4117394b -> 41100000", + "3fb445a8 -> 3f800000", + "c146eed7 -> c1400000", + "4199ae61 -> 41980000", + "416e52ce -> 41700000", + "40c00995 -> 40c00000", + "3fe967a2 -> 40000000", + "41081963 -> 41100000", + "c18dbc3b -> c1900000", + "4110f90c -> 41100000", + "4176e2ad -> 41700000", + "c101c694 -> c1000000", + "c189d817 -> c1880000", + "418eed64 -> 41900000", + "c111da18 -> c1100000", + "419003a0 -> 41900000", + "3fd766cb -> 40000000", + "c0d24a0c -> c0e00000", + "c1173107 -> c1100000", + "c0d6a83f -> c0e00000", + "c18a761d -> c1880000", + "c0912d56 -> c0a00000", + "418f881c -> 41900000", + "415fd27d -> 41600000", + "40c1256c -> 40c00000", + "c082c198 -> c0800000", + "4098d068 -> 40a00000", + "c0b29ef9 -> c0c00000", + "c192d272 -> c1900000", + "419581a3 -> 41980000", + "c0bb28cb -> c0c00000", + "c0a94703 -> c0a00000", + "c0fd5650 -> c1000000", + "40ce3616 -> 40c00000", + "c105ef86 -> c1000000", + "403a15f2 -> 40400000", + "4176a89a -> 41700000", + "41562456 -> 41500000", + "41458501 -> 41400000", + "3f7fcc3b -> 3f800000", + "c17f731f -> c1800000", + "416cfb43 -> 41700000", + "40d87b10 -> 40e00000", + "c16377c9 -> c1600000", + "c0e6ba6b -> c0e00000", + "c18136e1 -> c1800000", + "c122f4e7 -> c1200000", + "c194cdc9 -> c1980000", + "40b4b4aa -> 40c00000", + "c1463c99 -> c1400000", + "4136dbdd -> 41300000", + "3f90b221 -> 3f800000", + "3f99cb5f -> 3f800000", + "c193566e -> c1900000", + "c19d5b70 -> c1a00000", + "4169e693 -> 41700000", + "41040f1b -> 41000000", + "c190ad37 -> c1900000", + "4148f4a4 -> 41500000", + "c1873245 -> c1880000", + "408963d4 -> 40800000", + "4153d29d -> 41500000", + "c122b115 -> c1200000", + "40c30eff -> 40c00000", + "c142686a -> c1400000", + "c191c3b9 -> c1900000", + "408309c7 -> 40800000", + "40fafc45 -> 41000000", + "4022baa8 -> 40400000", + "c081f5b1 -> c0800000", + "411800ac -> 41200000", + "bfc26f64 -> c0000000", + "c05d8a62 -> c0400000", + "c0aee061 -> c0a00000", + "40d5e7c6 -> 40e00000", + "4089b1fa -> 40800000", + "411add01 -> 41200000", + "c0925e53 -> c0a00000", + "c175d8b2 -> c1700000", + "c19ad1b0 -> c1980000", + "c17ce6a7 -> c1800000", + "40cae270 -> 40c00000", + "c18d05e5 -> c1900000", + "c13a9a07 -> c1400000", + "419a63ee -> 41980000", + "419ad78c -> 41980000", + "410f86d0 -> 41100000", + "4185deeb -> 41880000", + "3f876410 -> 3f800000", + "401375f7 -> 40000000", + "c19bcc60 -> c1980000", + "c13540d1 -> c1300000", + "c1557b90 -> c1500000", + "c0f17cef -> c1000000", + "409cfa9a -> 40a00000", + "406d5953 -> 40800000", + "c12fd156 -> c1300000", + "bfbdc6f9 -> bf800000", + "3e4ac9ea -> 00000000", + "412f31d2 -> 41300000", + "406aa5ee -> 40800000", + "418730a7 -> 41880000", + "40e9a1cc -> 40e00000", + "4152ee49 -> 41500000", + "414e3e42 -> 41500000", + "c182ee47 -> c1800000", + "c16fca96 -> c1700000", + "41950074 -> 41980000", + "413f4cfb -> 41400000", + "414a3dcb -> 41500000", + "4116788f -> 41100000", + "c1161725 -> c1100000", + "41733a48 -> 41700000", + "c0532c5e -> c0400000", + "413b3f1e -> 41400000", + "416b9506 -> 41700000", + "c119aeb0 -> c1200000", + "409b7b2b -> 40a00000", + "4013fec7 -> 40000000", + "c19593d4 -> c1980000", + "3ff04b19 -> 40000000", + "3fb62838 -> 3f800000", + "416364af -> 41600000", + "c0fbd2dd -> c1000000", + "c13bdc8c -> c1400000", + "c159d03b -> c1600000", + "41846095 -> 41880000", + "c153e782 -> c1500000", + "c09487c6 -> c0a00000", + "41586619 -> 41600000", + "c19f44bd -> c1a00000", + "414e3052 -> 41500000", + "40c547b3 -> 40c00000", + "c1932563 -> c1900000", + "4097cef6 -> 40a00000", + "c1150037 -> c1100000", + "bf17a30b -> bf800000", + "418afb27 -> 41880000", + "40896e5f -> 40800000", + "412234ac -> 41200000", + "40874719 -> 40800000", + "40fca19a -> 41000000", + "c1772780 -> c1700000", + "41169cc0 -> 41100000", + "417c79f8 -> 41800000", + "4008aeac -> 40000000", + "41182d90 -> 41200000", + "407c09cd -> 40800000", + "40ffa4eb -> 41000000", + "410e50ba -> 41100000", + "41000f92 -> 41000000", + "c0a6d73a -> c0a00000", + "417e698a -> 41800000", + "be3c64db -> 00000000", + "c19d1fd2 -> c1a00000", + "4196f207 -> 41980000", + "4181f250 -> 41800000", + "408b0d2f -> 40800000", + "418fc5bb -> 41900000", + "c19d2a3e -> c1a00000", + "412c30c6 -> 41300000", + "4140f8a3 -> 41400000", + "4145578f -> 41400000", + "c01e3fb7 -> c0000000", + "c09f9db9 -> c0a00000", + "40d7ccba -> 40e00000", + "c193a8f6 -> c1900000", + "c1694c5e -> c1700000", + "bfef593a -> c0000000", + "c089777b -> c0800000", + "c1688aea -> c1700000", + "3f91cafe -> 3f800000", + "4117dea8 -> 41100000", + "c018ba0a -> c0000000", + "410d8862 -> 41100000", + "419309b8 -> 41900000", + "c16f229d -> c1700000", + "c1360696 -> c1300000", + "c116eb7b -> c1100000", + "c184e8f0 -> c1880000", + "4191a475 -> 41900000", + "c19061ec -> c1900000", + "c15b303f -> c1600000", + "c022ed17 -> c0400000", + "c18ff7ad -> c1900000", + "3e842456 -> 00000000", + "40bf24fc -> 40c00000", + "c0c48160 -> c0c00000", + "bfe73950 -> c0000000", + "c12c4995 -> c1300000", + "409d7e1b -> 40a00000", + "c0c049e7 -> c0c00000", + "c0852cc1 -> c0800000", + "417e0a32 -> 41800000", + "c169baff -> c1700000", + "be2a7df8 -> 00000000", + "414cb33c -> 41500000", + "c18e5022 -> c1900000", + "c0f0c7f7 -> c1000000", + "c09a9392 -> c0a00000", + "c0a35d5d -> c0a00000", + "414a8966 -> 41500000", + "c182a3bc -> c1800000", + "41467c37 -> 41400000", + "c07f1020 -> c0800000", + "406e1400 -> 40800000", + "c03cd985 -> c0400000", + "c1472252 -> c1400000", + "c14b304a -> c1500000", + "c19f12fe -> c1a00000", + "40c1125c -> 40c00000", + "c150dde5 -> c1500000", + "c08986a7 -> c0800000", + "bf69bd3f -> bf800000", + "c1245cfc -> c1200000", + "416afb3d -> 41700000", + "418ed9fa -> 41900000", + "c14b856d -> c1500000", + "409fd69e -> 40a00000", + "3f82c2bb -> 3f800000", + "c0ca62dd -> c0c00000", + "c13b8163 -> c1400000", + "c16ab9f6 -> c1700000", + "415547d8 -> 41500000", + "41991e5e -> 41980000", + "411e701e -> 41200000", + "bfa72650 -> bf800000", + "3fb857b8 -> 3f800000", + "419d8c44 -> 41a00000", + "c0383b79 -> c0400000", + "4002fed8 -> 40000000", + "4143b753 -> 41400000", + "c199b6f8 -> c1980000", + "c13eebcd -> c1400000", + "c004bb25 -> c0000000", + "c19903bb -> c1980000", + "c048c7c1 -> c0400000", + "4111a598 -> 41100000", + "c074909f -> c0800000", + "c1292140 -> c1300000", + "3ec30c9f -> 00000000", + "419fbc55 -> 41a00000", + "c140c96f -> c1400000", + "c0f4ade2 -> c1000000", + "3f9aaee4 -> 3f800000", + "c197659e -> c1980000", + "3faccf05 -> 3f800000", + "c0a332f4 -> c0a00000", + "c16ccf34 -> c1700000", + "3fa82a12 -> 3f800000", + "4194e30e -> 41980000", + "c11deca7 -> c1200000", + "4115bbf2 -> 41100000", + "c12b18c1 -> c1300000", + "418952d8 -> 41880000", + "c107a825 -> c1000000", + "c0f3b3db -> c1000000", + "417a49f2 -> 41800000", + "41943a56 -> 41980000", + "c07ff904 -> c0800000", + "419d638d -> 41a00000", + "c09d30ac -> c0a00000", + "c15d69a2 -> c1600000", + "405acd7e -> 40400000", + "407afa50 -> 40800000", + "4140a8f5 -> 41400000", + "410c6d36 -> 41100000", + "40c01434 -> 40c00000", + "c1880f18 -> c1880000", + "416c2a7e -> 41700000", + "c192a662 -> c1900000", + "c0fba03a -> c1000000", + "416f3223 -> 41700000", + "415efe2a -> 41600000", + "c14b7c5e -> c1500000", + "bef2f389 -> 00000000", + "bfed07c4 -> c0000000", + "c1409960 -> c1400000", + "4091c11f -> 40a00000", + "c0f7020f -> c1000000", + "415eef5f -> 41600000", + "418e616b -> 41900000", + "c134d227 -> c1300000", + "41771966 -> 41700000", + "41034b6f -> 41000000", + "c0904d92 -> c0a00000", + "c022ac6e -> c0400000", + "c077430e -> c0800000", + "c078565a -> c0800000", + "40c3a92e -> 40c00000", + "c06dcada -> c0800000", + "408932fc -> 40800000", + "c1633683 -> c1600000", + "403ce66a -> 40400000", + "415b37ad -> 41600000", + "40e66fcb -> 40e00000", + "c090fbcb -> c0a00000", + "c005d538 -> c0000000", + "c1966090 -> c1980000", + "417d0c5a -> 41800000", + "c19d9ef5 -> c1a00000", + "410e990c -> 41100000", + "4105cfda -> 41000000", + "401c0bcf -> 40000000", + "418fb0d3 -> 41900000", + "41950664 -> 41980000", + "418c11b4 -> 41900000", + "411f6681 -> 41200000", + "4122ee16 -> 41200000", + "40d024d5 -> 40e00000", + "c161f34a -> c1600000", + "c18fb525 -> c1900000", + "c111ded3 -> c1100000", + "c10e0819 -> c1100000", + "c198fb6b -> c1980000", + "419ca3b6 -> 41a00000", + "c19bcb4a -> c1980000", + "c159c899 -> c1600000", + "416e24df -> 41700000", + "c157d833 -> c1500000", + "c11e3904 -> c1200000", + "c06abbad -> c0800000", + "c1849368 -> c1880000", + "409ef3ad -> 40a00000", + "c15321e2 -> c1500000", + "41527e64 -> 41500000", + "3e04a7e5 -> 00000000", + "40c327c8 -> 40c00000", + "41149595 -> 41100000", + "40139549 -> 40000000", + "412a708b -> 41300000", + "414a48f7 -> 41500000", + "c0ade14d -> c0a00000", + "c1459023 -> c1400000", + "4186b43e -> 41880000", + "bfb1047a -> bf800000", + "be4f1b0c -> 00000000", + "41217931 -> 41200000", + "c153c7a5 -> c1500000", + "c16f3405 -> c1700000", + "bf08190c -> bf800000", + "414dbb5a -> 41500000", + "4183e8fc -> 41800000", + "41913d87 -> 41900000", + "401c8a84 -> 40000000", + "c0ae48ce -> c0a00000", + "c0cf9429 -> c0c00000", + "410a5bd3 -> 41100000", + "41648753 -> 41600000", + "4156e1bc -> 41500000", + "4116697f -> 41100000", + "bfed779d -> c0000000", + "c0debcb7 -> c0e00000", + "c1654a4a -> c1600000", + "c0d4212e -> c0e00000", + "4176e2a5 -> 41700000", + "41577730 -> 41500000", + "c14e3a59 -> c1500000", + "419c3fcb -> 41a00000", + "40d0336c -> 40e00000", + "4151ebb8 -> 41500000", + "c108758f -> c1100000", + "4152cb85 -> 41500000", + "41530adf -> 41500000", + "417f0b06 -> 41800000", + "c0c59f97 -> c0c00000", + "c087e54d -> c0800000", + "410be571 -> 41100000", + "c11b7976 -> c1200000", + "c0c9d3ea -> c0c00000", + "418bef37 -> 41880000", + "413ceda4 -> 41400000", + "c18decba -> c1900000", + "40db4237 -> 40e00000", + "c1308ac4 -> c1300000", + "c10c52ab -> c1100000", + "40bb5c08 -> 40c00000", + "4173cbd4 -> 41700000", + "bfb7e82a -> bf800000", + "41169229 -> 41100000", + "c17a4eba -> c1800000", + "3ea21fe4 -> 00000000", + "4106a7ab -> 41000000", + "c0448d4d -> c0400000", + "411b770e -> 41200000", + "41128ab9 -> 41100000", + "415eff6e -> 41600000", + "c12c24d9 -> c1300000", + "40029b15 -> 40000000", + "41302a40 -> 41300000", + "41626fe3 -> 41600000", + "c15154f8 -> c1500000", + "418f0a9f -> 41900000", + "418634eb -> 41880000", + "40d002ac -> 40e00000", + "c07d9ba6 -> c0800000", + "c0617bd0 -> c0800000", + "c176cee9 -> c1700000", + "c09877a9 -> c0a00000", + "c11d3251 -> c1200000", + "401b6678 -> 40000000", + "414d84ef -> 41500000", + "c129dac9 -> c1300000", + "c0a1f5c5 -> c0a00000", + "40e1429b -> 40e00000", + "417dcb4a -> 41800000", + "3e1c0412 -> 00000000", + "4145fd86 -> 41400000", + "c18c601f -> c1900000", + "41533874 -> 41500000", + "4127daa5 -> 41200000", + "c18bd6df -> c1880000", + "4122cba5 -> 41200000", + "413d2a1b -> 41400000", + "c10864f1 -> c1100000", + "c0a5f798 -> c0a00000", + "417b5945 -> 41800000", + "40aa4a7c -> 40a00000", + "bffe096c -> c0000000", + "c0ccc5b3 -> c0c00000", + "c14c7a0f -> c1500000", + "41213756 -> 41200000", + "41354a2e -> 41300000", + "41909ee9 -> 41900000", + "c1950dfe -> c1980000", + "41581833 -> 41600000", + "411497b1 -> 41100000", + "4104e8a1 -> 41000000", + "c103a259 -> c1000000", + "bfc93033 -> c0000000", + "41094a78 -> 41100000", + "c106e4d2 -> c1000000", + "403ac15c -> 40400000", + "4061a48e -> 40800000", + "4187ffcd -> 41880000", + "c0a73ab5 -> c0a00000", + "c184867e -> c1880000", + "415a0bc0 -> 41600000", + "413aedd4 -> 41400000", + "410a88e5 -> 41100000", + "3f200a45 -> 3f800000", + "bf035f6e -> bf800000", + "c018e352 -> c0000000", + "40b79eeb -> 40c00000", + "c16f3bc7 -> c1700000", + "4041ff89 -> 40400000", + "c14a9245 -> c1500000", + "41274c9a -> 41200000", + "c134cf4c -> c1300000", + "c0653bf7 -> c0800000", + "3fb74ed8 -> 3f800000", + "c186aff7 -> c1880000", + "c191234e -> c1900000", + "411c4d98 -> 41200000", + "414dd294 -> 41500000", + "40e70244 -> 40e00000", + "40497ee6 -> 40400000", + "c0b70cf9 -> c0c00000", + "c0ead0dc -> c0e00000", + "c118df2d -> c1200000", + "c12be0d4 -> c1300000", + "c1530a92 -> c1500000", + "4157b0cc -> 41500000", + "c19bf910 -> c1980000", + "c19f43e2 -> c1a00000", + "41800b7f -> 41800000", + "40edbf41 -> 40e00000", + "c0317151 -> c0400000", + "c04f92d1 -> c0400000", + "40489028 -> 40400000", + "4011a222 -> 40000000", + "c19a03e8 -> c1980000", + "41571b78 -> 41500000", + "4125ac80 -> 41200000", + "4192ff91 -> 41900000", + "40a67a40 -> 40a00000", + "40e7e495 -> 40e00000", + "c1046159 -> c1000000", + "c0fe4aaa -> c1000000", + "bfde9545 -> c0000000", + "c135b658 -> c1300000", + "411587eb -> 41100000", + "3ee2a8b3 -> 00000000", + "415ac779 -> 41600000", + "c11245fb -> c1100000", + "bf1abb7b -> bf800000", + "40f414b3 -> 41000000", + "c0922e56 -> c0a00000", + "40e822fc -> 40e00000", + "c0571eca -> c0400000", + "bbd2b335 -> 00000000", + "414e25d4 -> 41500000", + "418dea38 -> 41900000", + "c12c4565 -> c1300000", + "3fe13ceb -> 40000000", + "c19849b6 -> c1980000", + "410ce293 -> 41100000", + "40917a01 -> 40a00000", + "c1340233 -> c1300000", + "c13dce41 -> c1400000", + "4107ab28 -> 41000000", + "c0a73683 -> c0a00000", + "408d1327 -> 40800000", + "c12035fc -> c1200000", + "c0bfc50a -> c0c00000", + "c19cb335 -> c1a00000", + "4181164e -> 41800000", + "3fc34c95 -> 40000000", + "40e69467 -> 40e00000", + "c106d292 -> c1000000", + "4185c3eb -> 41880000", + "c19c8851 -> c1a00000", + "4193bc67 -> 41900000", + "c095fe86 -> c0a00000", + "c0c67c8c -> c0c00000", + "c087297c -> c0800000", + "409e812b -> 40a00000", + "415114a3 -> 41500000", + "41917ccd -> 41900000", + "4198b8ef -> 41980000", + "418479cc -> 41880000", + "c19163b6 -> c1900000", + "c14af1e2 -> c1500000", + "403f8780 -> 40400000", + "c0288a9c -> c0400000", + "c19bbe7a -> c1980000", + "c1956e41 -> c1980000", + "c06b7b6e -> c0800000", + "4095b68b -> 40a00000", + "4098efc0 -> 40a00000", + "40d76feb -> 40e00000", + "41075999 -> 41000000", + "c05b1229 -> c0400000", + "c12668b0 -> c1200000", + "c0a53794 -> c0a00000", + "4064135c -> 40800000", + "c14f0f73 -> c1500000", + "c0b84597 -> c0c00000", + "4187ba5f -> 41880000", + "4196dcc4 -> 41980000", + "c132c8ae -> c1300000", + "419b1ae2 -> 41980000", + "40c68b80 -> 40c00000", + "c1345c5f -> c1300000", + "4114a2e2 -> 41100000", + "3f670d21 -> 3f800000", + "40491679 -> 40400000", + "3fd044bb -> 40000000", + "3f5d446e -> 3f800000", + "c0a2986c -> c0a00000", + "c1850857 -> c1880000", + "c18fa0ec -> c1900000", + "c156812b -> c1500000", + "40b9d750 -> 40c00000", + "40b6235f -> 40c00000", + "c132e35a -> c1300000", + "4104366b -> 41000000", + "416c029f -> 41700000", + "c10e7a95 -> c1100000", + "c03fd932 -> c0400000", + "408e31e3 -> 40800000", + "c17648d1 -> c1700000", + "c16d4674 -> c1700000", + "c19cb441 -> c1a00000", + "3f457f68 -> 3f800000", + "40028a3b -> 40000000", + "40d8adbd -> 40e00000", + "406dafdd -> 40800000", + "c1945559 -> c1980000", + "414b7818 -> 41500000", + "c1546cb5 -> c1500000", + "4103dcce -> 41000000", + "4194473e -> 41980000", + "c17ea4e8 -> c1800000", + "410e489b -> 41100000", + "c15dc0ab -> c1600000", + "bfbcc4a3 -> bf800000", + "412ce731 -> 41300000", + "405211e0 -> 40400000", + "4003aeea -> 40000000", + "40efbe64 -> 40e00000", + "c1679066 -> c1600000", + "414dd548 -> 41500000", + "40fab840 -> 41000000", + "4083902d -> 40800000", + "c18475f3 -> c1880000", + "40a46fac -> 40a00000", + "4185dd7f -> 41880000", + "c18cda48 -> c1900000", + "c1303c7b -> c1300000", + "c140e6b0 -> c1400000", + "c18e71ac -> c1900000", + "413717fb -> 41300000", + "3ff74235 -> 40000000", + "c092cc4d -> c0a00000", + "4086bf69 -> 40800000", + "c05dffa5 -> c0400000", + "40381bba -> 40400000", + "c03e33f0 -> c0400000", + "41835ed2 -> 41800000", + "41140ea2 -> 41100000", + "3e43716a -> 00000000", + "c00abdfe -> c0000000", + "c141d5dc -> c1400000", + "c108e7b5 -> c1100000", + "404ce2e1 -> 40400000", + "4140a679 -> 41400000", + "c195b466 -> c1980000", + "419e0f53 -> 41a00000", + "415f8a5c -> 41600000", + "bee8b8c7 -> 00000000", + "4116f9cf -> 41100000", + "c16183dd -> c1600000", + "c1999ad2 -> c1980000", + "c0b055fc -> c0c00000", + "c100bd36 -> c1000000", + "c138e9d0 -> c1400000", + "c1384cec -> c1400000", + "40db9b7c -> 40e00000", + "c0bd9b48 -> c0c00000", + "c1197b3c -> c1200000", + "c0898cb1 -> c0800000", + "c19f709b -> c1a00000", + "403bb44d -> 40400000", + "415476f7 -> 41500000", + "c17aaf4b -> c1800000", + "4174ce42 -> 41700000", + "bf4ade61 -> bf800000", + "c168e320 -> c1700000", + "c105f34a -> c1000000", + "4080be9b -> 40800000", + "408791a4 -> 40800000", + "c0f1358f -> c1000000", + "4111f976 -> 41100000", + "410bb061 -> 41100000", + "41858221 -> 41880000", + "416ef0eb -> 41700000", + "4130c3d2 -> 41300000", + "408a09ba -> 40800000", + "c191cc9c -> c1900000", + "c05c1121 -> c0400000", + "c0c19a55 -> c0c00000", + "bf99598b -> bf800000", + "3d0194f1 -> 00000000", + "40126652 -> 40000000", + "c16cc49f -> c1700000", + "4193fd87 -> 41900000", + "c146b8a7 -> c1400000", + "406e5ef0 -> 40800000", + "411954cc -> 41200000", + "c0a49cdd -> c0a00000", + "4182ef2a -> 41800000", + "becfcc00 -> 00000000", + "c0e30eba -> c0e00000", + "c183a428 -> c1800000", + "c058e61f -> c0400000", + "c19355a0 -> c1900000", + "c192e8fa -> c1900000", + "41535216 -> 41500000", + "4123f16a -> 41200000", + "41472411 -> 41400000", + "3e805609 -> 00000000", + "41766fe3 -> 41700000", + "4199292c -> 41980000", + "c15d7890 -> c1600000", + "41487afb -> 41500000", + "418ce066 -> 41900000", + "4115b2ba -> 41100000", + "c15b5825 -> c1600000", + "c106d081 -> c1000000", + "bfdf6525 -> c0000000", + "418d2543 -> 41900000", + "40a193a3 -> 40a00000", + "c0e1d541 -> c0e00000", + "41847e14 -> 41880000", + "c1445d65 -> c1400000", + "40e0abbc -> 40e00000", + "c19839d4 -> c1980000", + "c08d90cf -> c0800000", + "3fa25a67 -> 3f800000", + "bfa837b7 -> bf800000", + "415403ef -> 41500000", + "c171d857 -> c1700000", + "c187a5cf -> c1880000", + "c18cfb27 -> c1900000", + "c1926f73 -> c1900000", + "4094c859 -> 40a00000", + "c0a78054 -> c0a00000", + "c0878dd5 -> c0800000", + "c15f2acf -> c1600000", + "40e4c8f6 -> 40e00000", + "3f35d593 -> 3f800000", + "c197c031 -> c1980000", + "404df0fa -> 40400000", + "c18ddddd -> c1900000", + "c122ee6a -> c1200000", + "c18cd6de -> c1900000", + "3fa09bc0 -> 3f800000", + "4169171b -> 41700000", + "c019c3b2 -> c0000000", + "40d67258 -> 40e00000", + "c1879725 -> c1880000", + "c195b11b -> c1980000", + "41038f45 -> 41000000", + "40f412b6 -> 41000000", + "c1470849 -> c1400000", + "40967898 -> 40a00000", + "c0a4c90e -> c0a00000", + "c146fb87 -> c1400000", + "41401624 -> 41400000", + "4199a19c -> 41980000", + "40ef563b -> 40e00000", + "418a937e -> 41880000", + "c143b4f2 -> c1400000", + "c1601031 -> c1600000", + "40da88dc -> 40e00000", + "c1964677 -> c1980000", + "c161c269 -> c1600000", + "c0101015 -> c0000000", + "411f7693 -> 41200000", + "4168b7ed -> 41700000", + "c11bca43 -> c1200000", + "418c2e28 -> 41900000", + "c0cc1660 -> c0c00000", + "c16cc3a3 -> c1700000", + "c164035c -> c1600000", + "c131af2a -> c1300000", + "c0b38780 -> c0c00000", + "c0c843dc -> c0c00000", + "c16fc596 -> c1700000", + "c1850220 -> c1880000", + "c01cab94 -> c0000000", + "c093ab09 -> c0a00000", + "41990d46 -> 41980000", + "bf0daaf9 -> bf800000", + "c185d518 -> c1880000", + "c11c3208 -> c1200000", + "bf5f0dc2 -> bf800000", + "40601ac3 -> 40800000", + "40747a7c -> 40800000", + "40131e52 -> 40000000", + "c053ff53 -> c0400000", + "4082fd1c -> 40800000", + "4159f398 -> 41600000", + "c14a5300 -> c1500000", + "409c31ad -> 40a00000", + "c10b8868 -> c1100000", + "c088579c -> c0800000", + "4169b9b5 -> 41700000", + "c19e7810 -> c1a00000", + "c05148de -> c0400000", + "c17a8d1a -> c1800000", + "bfda8150 -> c0000000", + "c1824165 -> c1800000", + "4124a4c1 -> 41200000", + "40a311d9 -> 40a00000", + "c10d3aaf -> c1100000", + "4184700f -> 41880000", + "40f5348c -> 41000000", + "bfe6c7f4 -> c0000000", + "415043ca -> 41500000", + "c13811a3 -> c1400000", + "4146976a -> 41400000", + "c13f5c48 -> c1400000", + "418d2d98 -> 41900000", + "c04a0547 -> c0400000", + "c1606289 -> c1600000", + "40ff5291 -> 41000000", + "415d5cdc -> 41600000", + "bf8a5688 -> bf800000", + "3f22c300 -> 3f800000", + "c032af0d -> c0400000", + "3ff1d65d -> 40000000", + "415ebdc6 -> 41600000", + "40b9c7bf -> 40c00000", + "40031f56 -> 40000000", + "c14c0653 -> c1500000", + "bc93d4e6 -> 00000000", + "c0e41663 -> c0e00000", + "c0c76499 -> c0c00000", + "c11d4019 -> c1200000", + "4199afb8 -> 41980000", + "c0a1beb9 -> c0a00000", + "bf01a410 -> bf800000", + "c0441cab -> c0400000", + "c1929a10 -> c1900000", + "c0ed9821 -> c0e00000", + "bf917c9f -> bf800000", + "c17963ec -> c1800000" + ] + }, + { + "function": "cycles_trunc", + "node": "ShaderNodeMath TRUNC", + "cases": [ + "00000000 -> 00000000", + "3f800000 -> 3f800000", + "bf800000 -> bf800000", + "3f000000 -> 00000000", + "bf000000 -> 00000000", + "40000000 -> 40000000", + "c0000000 -> c0000000", + "40400000 -> 40400000", + "c0300000 -> c0000000", + "3dcccccd -> 00000000", + "bdcccccd -> 00000000", + "40f00000 -> 40e00000", + "c0f00000 -> c0e00000", + "33d6bf95 -> 00000000", + "b3d6bf95 -> 00000000", + "42c80000 -> 42c80000", + "c2c80000 -> c2c80000", + "461c4000 -> 461c4000", + "3e99999a -> 00000000", + "3f333333 -> 00000000", + "c0bf356a -> c0a00000", + "412dab71 -> 41200000", + "c0d5d858 -> c0c00000", + "c18f7c65 -> c1880000", + "411d1207 -> 41100000", + "c0afdd6e -> c0a00000", + "c163ccb7 -> c1600000", + "3f0d30c4 -> 00000000", + "41089951 -> 41000000", + "c198e11c -> c1980000", + "4100331b -> 41000000", + "c12cfa5b -> c1200000", + "410274dc -> 41000000", + "c0f52e05 -> c0e00000", + "c19b510b -> c1980000", + "419f6cff -> 41980000", + "c163ff88 -> c1600000", + "c19cb75c -> c1980000", + "40755e8c -> 40400000", + "401604e9 -> 40000000", + "bf9337d1 -> bf800000", + "c0bde07e -> c0a00000", + "4185da8f -> 41800000", + "414e5d6d -> 41400000", + "40c71074 -> 40c00000", + "40b118a2 -> 40a00000", + "4187cd01 -> 41800000", + "40b20577 -> 40a00000", + "c16669f0 -> c1600000", + "415c80c4 -> 41500000", + "41249a00 -> 41200000", + "c115f802 -> c1100000", + "c0486159 -> c0400000", + "c0b72071 -> c0a00000", + "c0bd9c45 -> c0a00000", + "c014bf9d -> c0000000", + "c129dc06 -> c1200000", + "c130f23b -> c1300000", + "415e310e -> 41500000", + "c1822959 -> c1800000", + "40b00938 -> 40a00000", + "41867125 -> 41800000", + "c14e1f23 -> c1400000", + "40e8eca9 -> 40e00000", + "bf1d1151 -> 00000000", + "41133ff4 -> 41100000", + "bfc6797e -> bf800000", + "3f1ff8dc -> 00000000", + "411c47e4 -> 41100000", + "411d865b -> 41100000", + "419b90f2 -> 41980000", + "c16b41a1 -> c1600000", + "414e2bfb -> 41400000", + "c19b8ca3 -> c1980000", + "c19df835 -> c1980000", + "c13c8a2d -> c1300000", + "c1408bd4 -> c1400000", + "418e4227 -> 41880000", + "3fbf8f1c -> 3f800000", + "41526e3c -> 41500000", + "c19e13a6 -> c1980000", + "41868a49 -> 41800000", + "c09da410 -> c0800000", + "c15a2c17 -> c1500000", + "c1436ea0 -> c1400000", + "c09e8510 -> c0800000", + "c189f265 -> c1880000", + "c00a0242 -> c0000000", + "bf661f6c -> 00000000", + "4111e5d8 -> 41100000", + "c1150e6d -> c1100000", + "c177e967 -> c1700000", + "c18434fc -> c1800000", + "c001738e -> c0000000", + "c12fcf08 -> c1200000", + "c12b1f53 -> c1200000", + "41570d8a -> 41500000", + "c06fc415 -> c0400000", + "c100965f -> c1000000", + "405e2635 -> 40400000", + "c118477d -> c1100000", + "c00e104c -> c0000000", + "c187c3ad -> c1800000", + "c0887e65 -> c0800000", + "414e19b1 -> 41400000", + "415d78a3 -> 41500000", + "c1636733 -> c1600000", + "bfa40bf8 -> bf800000", + "c0ee2ee8 -> c0e00000", + "4104ccb2 -> 41000000", + "4106a1e9 -> 41000000", + "c0120c1e -> c0000000", + "c14c25b8 -> c1400000", + "413a3629 -> 41300000", + "4192988c -> 41900000", + "414591ed -> 41400000", + "c0d357c9 -> c0c00000", + "bfd1f6fd -> bf800000", + "c0e57e38 -> c0e00000", + "c168af9c -> c1600000", + "c028eca6 -> c0000000", + "401de9b5 -> 40000000", + "410c5103 -> 41000000", + "c13c09de -> c1300000", + "c0c712b0 -> c0c00000", + "40a969c9 -> 40a00000", + "c03dff8e -> c0000000", + "3f09c0b1 -> 00000000", + "411a68c5 -> 41100000", + "c100d86a -> c1000000", + "c1697028 -> c1600000", + "c14b4267 -> c1400000", + "be433e6d -> 00000000", + "408f64b9 -> 40800000", + "bf55393d -> 00000000", + "3f54ba93 -> 00000000", + "412c2f76 -> 41200000", + "c0951722 -> c0800000", + "bfe9a289 -> bf800000", + "41844ce9 -> 41800000", + "41674ac7 -> 41600000", + "c18a9036 -> c1880000", + "416d2832 -> 41600000", + "c11e42df -> c1100000", + "413016f9 -> 41300000", + "410941f5 -> 41000000", + "416bd711 -> 41600000", + "407aa3b0 -> 40400000", + "bfb4c932 -> bf800000", + "3fa30399 -> 3f800000", + "c1542959 -> c1500000", + "c199ea61 -> c1980000", + "c089c844 -> c0800000", + "4144053c -> 41400000", + "bfbadaf6 -> bf800000", + "bcc139ec -> 00000000", + "4044ad12 -> 40400000", + "40a70b1a -> 40a00000", + "c0e548da -> c0e00000", + "415c1a93 -> 41500000", + "40865adf -> 40800000", + "c19829f7 -> c1980000", + "c0f6768a -> c0e00000", + "c19cccf6 -> c1980000", + "41946997 -> 41900000", + "c17fbf7a -> c1700000", + "415bf221 -> 41500000", + "c0cc0b71 -> c0c00000", + "414abdf2 -> 41400000", + "41668d61 -> 41600000", + "c0217fb1 -> c0000000", + "c13d2db0 -> c1300000", + "418d1367 -> 41880000", + "40deef0e -> 40c00000", + "4080be41 -> 40800000", + "c11d93aa -> c1100000", + "c0e46f4d -> c0e00000", + "403da0ff -> 40000000", + "c19f8b9b -> c1980000", + "40ae37c0 -> 40a00000", + "40dabecf -> 40c00000", + "416aa5c5 -> 41600000", + "c030faee -> c0000000", + "40ad925a -> 40a00000", + "c104ad0c -> c1000000", + "418217bf -> 41800000", + "4103129c -> 41000000", + "c07f9076 -> c0400000", + "c19dc3a8 -> c1980000", + "419d8dd8 -> 41980000", + "41651030 -> 41600000", + "40f280f6 -> 40e00000", + "c18c2a9d -> c1880000", + "c14ab48d -> c1400000", + "41018ab4 -> 41000000", + "c170ffe1 -> c1700000", + "bf12c6a4 -> 00000000", + "40616366 -> 40400000", + "414d3399 -> 41400000", + "3fd25a92 -> 3f800000", + "409fe732 -> 40800000", + "c0d084b4 -> c0c00000", + "411f286b -> 41100000", + "411425e1 -> 41100000", + "4192f97d -> 41900000", + "c11bdf8b -> c1100000", + "c1377caf -> c1300000", + "408987d3 -> 40800000", + "c1600a96 -> c1600000", + "4107fbd1 -> 41000000", + "41843542 -> 41800000", + "41094f43 -> 41000000", + "4185d295 -> 41800000", + "c171914c -> c1700000", + "bfbaaa6d -> bf800000", + "4141d601 -> 41400000", + "c0809492 -> c0800000", + "4119629b -> 41100000", + "c15ada3a -> c1500000", + "41449bdd -> 41400000", + "c1051406 -> c1000000", + "c02a8481 -> c0000000", + "3d1026c7 -> 00000000", + "c0e18d4c -> c0e00000", + "40ff5edf -> 40e00000", + "c07b90c6 -> c0400000", + "415292b2 -> 41500000", + "c15d4ab6 -> c1500000", + "bf206375 -> 00000000", + "c0c9ffc7 -> c0c00000", + "c1805bb8 -> c1800000", + "c12bf639 -> c1200000", + "41732100 -> 41700000", + "40d0092b -> 40c00000", + "c0ed7276 -> c0e00000", + "4132b412 -> 41300000", + "409d6261 -> 40800000", + "4179e5ae -> 41700000", + "c0a7a805 -> c0a00000", + "c028ff8d -> c0000000", + "c0a6285f -> c0a00000", + "419eeba1 -> 41980000", + "c0dda426 -> c0c00000", + "c18a84b0 -> c1880000", + "41854cad -> 41800000", + "409be392 -> 40800000", + "401119e7 -> 40000000", + "c0821a04 -> c0800000", + "c0c1a656 -> c0c00000", + "41993364 -> 41980000", + "c18f1200 -> c1880000", + "c1391744 -> c1300000", + "40d43eee -> 40c00000", + "c12c199b -> c1200000", + "418d8c36 -> 41880000", + "413db256 -> 41300000", + "c0ab2008 -> c0a00000", + "c1955d06 -> c1900000", + "403ea5ae -> 40000000", + "c0770c08 -> c0400000", + "3f349a79 -> 00000000", + "c07a23d1 -> c0400000", + "c17c9bb3 -> c1700000", + "4152b09e -> 41500000", + "c18a09cc -> c1880000", + "40d11ea6 -> 40c00000", + "410a425e -> 41000000", + "c182bba1 -> c1800000", + "c0de6d56 -> c0c00000", + "41959311 -> 41900000", + "40dca68e -> 40c00000", + "402b9ac7 -> 40000000", + "417e0c44 -> 41700000", + "c19107d0 -> c1900000", + "4199dfcb -> 41980000", + "c0a4f1c9 -> c0a00000", + "c0ae0384 -> c0a00000", + "405497cc -> 40400000", + "c171f74d -> c1700000", + "4156f322 -> 41500000", + "c100f0e8 -> c1000000", + "c0a814cb -> c0a00000", + "c125d972 -> c1200000", + "c0f16c98 -> c0e00000", + "417ca2a0 -> 41700000", + "c14e7693 -> c1400000", + "40fc0104 -> 40e00000", + "c1009c07 -> c1000000", + "4171eaba -> 41700000", + "412f0d99 -> 41200000", + "4030908d -> 40000000", + "c1891ff1 -> c1880000", + "c1668d73 -> c1600000", + "bff0e7eb -> bf800000", + "c150df68 -> c1500000", + "41957384 -> 41900000", + "40e7f1bb -> 40e00000", + "415a12b4 -> 41500000", + "4151633e -> 41500000", + "c076cd09 -> c0400000", + "c0d5097d -> c0c00000", + "c026f2a6 -> c0000000", + "c0b645ef -> c0a00000", + "c0eb0d54 -> c0e00000", + "40c8be9c -> 40c00000", + "4115548b -> 41100000", + "c196b17d -> c1900000", + "c1985aa4 -> c1980000", + "4131c9e5 -> 41300000", + "4133f0fb -> 41300000", + "409870d4 -> 40800000", + "c1558ede -> c1500000", + "c195359e -> c1900000", + "c12b53c0 -> c1200000", + "c16c8183 -> c1600000", + "40867a9b -> 40800000", + "c15e23b6 -> c1500000", + "411ba8d9 -> 41100000", + "418ce811 -> 41880000", + "c0edb41f -> c0e00000", + "c16c23e2 -> c1600000", + "418d0cf2 -> 41880000", + "4197518b -> 41900000", + "c0beb9a9 -> c0a00000", + "411e5ad0 -> 41100000", + "bf89c219 -> bf800000", + "c18121b1 -> c1800000", + "413a47d0 -> 41300000", + "c1862427 -> c1800000", + "c0adc237 -> c0a00000", + "c12fbf4c -> c1200000", + "c18a39c4 -> c1880000", + "416c4914 -> 41600000", + "c17ba345 -> c1700000", + "40b98062 -> 40a00000", + "c099a719 -> c0800000", + "3f8a88ee -> 3f800000", + "c1428fe2 -> c1400000", + "c15c3288 -> c1500000", + "40182d36 -> 40000000", + "c0e1ea71 -> c0e00000", + "c0cfa0dc -> c0c00000", + "4182dca6 -> 41800000", + "bea519be -> 00000000", + "40f7f413 -> 40e00000", + "40151bc5 -> 40000000", + "41264cb4 -> 41200000", + "c12994d2 -> c1200000", + "c0dccaf3 -> c0c00000", + "c0fc4f94 -> c0e00000", + "beaf11e1 -> 00000000", + "c09be68b -> c0800000", + "c17b6a39 -> c1700000", + "419dccfa -> 41980000", + "415d2008 -> 41500000", + "bfaa05ac -> bf800000", + "c1114b60 -> c1100000", + "c077f605 -> c0400000", + "40850a52 -> 40800000", + "40a3aecd -> 40a00000", + "c12529fe -> c1200000", + "c158436c -> c1500000", + "400ff545 -> 40000000", + "c0f3759d -> c0e00000", + "bee1933d -> 00000000", + "c19b397b -> c1980000", + "3f67c231 -> 00000000", + "408fb5b0 -> 40800000", + "c14e0d20 -> c1400000", + "c1700bbf -> c1700000", + "c172a38a -> c1700000", + "4196323f -> 41900000", + "412e48e7 -> 41200000", + "c11f8869 -> c1100000", + "418aec75 -> 41880000", + "c10bf283 -> c1000000", + "c1207774 -> c1200000", + "3f55cda9 -> 00000000", + "c17c2652 -> c1700000", + "3f833ba3 -> 3f800000", + "413efc6a -> 41300000", + "4184fa65 -> 41800000", + "40e4af9d -> 40e00000", + "409b68e5 -> 40800000", + "c105109d -> c1000000", + "4076befd -> 40400000", + "c18297d2 -> c1800000", + "4199ccbe -> 41980000", + "4001fa06 -> 40000000", + "41870b8d -> 41800000", + "c1408efa -> c1400000", + "c06f1318 -> c0400000", + "40dcea43 -> 40c00000", + "41807929 -> 41800000", + "41528a66 -> 41500000", + "40edf3f6 -> 40e00000", + "c18ef727 -> c1880000", + "3f8c1a1e -> 3f800000", + "c0ae991c -> c0a00000", + "c0d847b8 -> c0c00000", + "41532860 -> 41500000", + "418ca6c1 -> 41880000", + "c12aa1c5 -> c1200000", + "413ad152 -> 41300000", + "3e21d574 -> 00000000", + "c180b87f -> c1800000", + "410fe060 -> 41000000", + "4136e502 -> 41300000", + "414f29e3 -> 41400000", + "c18f2c0f -> c1880000", + "4197c599 -> 41900000", + "c193bbaf -> c1900000", + "c169b544 -> c1600000", + "415afd7f -> 41500000", + "c1820d66 -> c1800000", + "41645721 -> 41600000", + "c143f2e0 -> c1400000", + "c19878ff -> c1980000", + "413c8949 -> 41300000", + "c12e4a81 -> c1200000", + "c0a38bf2 -> c0a00000", + "c10d56ff -> c1000000", + "41831b12 -> 41800000", + "c15cc9fe -> c1500000", + "417c5a7f -> 41700000", + "4141b36e -> 41400000", + "409dd92a -> 40800000", + "402f58b3 -> 40000000", + "4095cba5 -> 40800000", + "bf8c9a84 -> bf800000", + "4157f200 -> 41500000", + "c0abd3e4 -> c0a00000", + "41976a04 -> 41900000", + "c18719c5 -> c1800000", + "40b10b99 -> 40a00000", + "c182a8c1 -> c1800000", + "4132504a -> 41300000", + "41921e5e -> 41900000", + "c067c1f8 -> c0400000", + "40c30ce3 -> 40c00000", + "c03716e5 -> c0000000", + "408f8c33 -> 40800000", + "40fe69a8 -> 40e00000", + "c19b7b45 -> c1980000", + "c1220d9d -> c1200000", + "4043f675 -> 40400000", + "c19395b8 -> c1900000", + "c0602b74 -> c0400000", + "41837fdd -> 41800000", + "4158de0c -> 41500000", + "3ffccf97 -> 3f800000", + "40ec7c11 -> 40e00000", + "412fccb4 -> 41200000", + "3fffe932 -> 3f800000", + "be8c6bb6 -> 00000000", + "c1043454 -> c1000000", + "bfd0da70 -> bf800000", + "c1859630 -> c1800000", + "c1015e0d -> c1000000", + "c0a8ba20 -> c0a00000", + "41727d77 -> 41700000", + "c12aa731 -> c1200000", + "c1536704 -> c1500000", + "c188c944 -> c1880000", + "bfe10105 -> bf800000", + "c1711b60 -> c1700000", + "c19766a3 -> c1900000", + "41537cb8 -> 41500000", + "4144b24a -> 41400000", + "c1384f6a -> c1300000", + "411d36a6 -> 41100000", + "4138911a -> 41300000", + "c037e81a -> c0000000", + "c119d022 -> c1100000", + "c10766ef -> c1000000", + "412f8d08 -> 41200000", + "40ba7ee5 -> 40a00000", + "c180836e -> c1800000", + "418c0980 -> 41880000", + "412888a3 -> 41200000", + "4180917e -> 41800000", + "c03a098b -> c0000000", + "c10aadcb -> c1000000", + "c16d3caf -> c1600000", + "419d7223 -> 41980000", + "c1886e2f -> c1880000", + "c192fcae -> c1900000", + "4188af30 -> 41880000", + "419de91f -> 41980000", + "be280b4f -> 00000000", + "c1996819 -> c1980000", + "bf3d9840 -> 00000000", + "4189177c -> 41880000", + "bffcb4b8 -> bf800000", + "c0e6af77 -> c0e00000", + "40f3eba4 -> 40e00000", + "4124a314 -> 41200000", + "3f78f85d -> 00000000", + "c09d9ccf -> c0800000", + "416b9d17 -> 41600000", + "bfe0469a -> bf800000", + "c0cc293e -> c0c00000", + "c0861e25 -> c0800000", + "c19aa4e6 -> c1980000", + "c13b4c58 -> c1300000", + "c125fd81 -> c1200000", + "41707075 -> 41700000", + "bea89e34 -> 00000000", + "40cd5d67 -> 40c00000", + "c19744ab -> c1900000", + "418dc342 -> 41880000", + "416b0d6e -> 41600000", + "c13422bc -> c1300000", + "c0bd1004 -> c0a00000", + "c193b29f -> c1900000", + "415dfa53 -> 41500000", + "c0c72b73 -> c0c00000", + "bf17fc60 -> 00000000", + "c13b1953 -> c1300000", + "c0fb245f -> c0e00000", + "419fce8d -> 41980000", + "c17e7ebe -> c1700000", + "40472ee0 -> 40400000", + "c04577b1 -> c0400000", + "c14af5a6 -> c1400000", + "4044e1c0 -> 40400000", + "c18dd1bf -> c1880000", + "4110d4e5 -> 41100000", + "c0ddd045 -> c0c00000", + "3fc05e78 -> 3f800000", + "4193584b -> 41900000", + "c1755b34 -> c1700000", + "409896eb -> 40800000", + "41909b4f -> 41900000", + "c1241113 -> c1200000", + "c0963997 -> c0800000", + "c16f5963 -> c1600000", + "c0ab23c8 -> c0a00000", + "4194cd90 -> 41900000", + "c106b160 -> c1000000", + "4183564e -> 41800000", + "c06c4836 -> c0400000", + "c0584859 -> c0400000", + "c13a23e3 -> c1300000", + "c0930ba2 -> c0800000", + "c1223797 -> c1200000", + "40f83117 -> 40e00000", + "c1836c99 -> c1800000", + "414d7959 -> 41400000", + "c10b999c -> c1000000", + "c19d4ab5 -> c1980000", + "c169fc6d -> c1600000", + "418a23eb -> 41880000", + "418e0413 -> 41880000", + "414ec58a -> 41400000", + "c068ede4 -> c0400000", + "4107c44a -> 41000000", + "c1715a66 -> c1700000", + "c16339ee -> c1600000", + "c08aa19c -> c0800000", + "c15e7d15 -> c1500000", + "c15de1c4 -> c1500000", + "c1539d74 -> c1500000", + "4178f23a -> 41700000", + "41580ded -> 41500000", + "4025f906 -> 40000000", + "411d124d -> 41100000", + "4122e18e -> 41200000", + "419c4057 -> 41980000", + "415f5bd1 -> 41500000", + "c135f636 -> c1300000", + "c199d751 -> c1980000", + "418bda01 -> 41880000", + "40d71379 -> 40c00000", + "c0c85317 -> c0c00000", + "40ec34c8 -> 40e00000", + "4187abed -> 41800000", + "c0a777a1 -> c0a00000", + "c0ca8b74 -> c0c00000", + "40bf0b8d -> 40a00000", + "c0af3927 -> c0a00000", + "4001b3b6 -> 40000000", + "408cba97 -> 40800000", + "418d7040 -> 41880000", + "c0c6162f -> c0c00000", + "c1940774 -> c1900000", + "bf6fa49a -> 00000000", + "c05e0b79 -> c0400000", + "4082dab8 -> 40800000", + "41158709 -> 41100000", + "c14f5508 -> c1400000", + "415408d2 -> 41500000", + "4153b8b7 -> 41500000", + "402e1453 -> 40000000", + "41421877 -> 41400000", + "c1872b69 -> c1800000", + "c18d8812 -> c1880000", + "4188688a -> 41880000", + "40ef44af -> 40e00000", + "412fce99 -> 41200000", + "41577dad -> 41500000", + "c0f0d8ff -> c0e00000", + "c1693adf -> c1600000", + "40e9cc87 -> 40e00000", + "c0c6d74b -> c0c00000", + "c107fcab -> c1000000", + "41269e08 -> 41200000", + "c077850c -> c0400000", + "3c669ccb -> 00000000", + "40d1d782 -> 40c00000", + "411211cb -> 41100000", + "3fbeac13 -> 3f800000", + "c1899d40 -> c1880000", + "c1689f8e -> c1600000", + "c1957a8c -> c1900000", + "c0fe9065 -> c0e00000", + "40e0d982 -> 40e00000", + "c1723dc8 -> c1700000", + "4185e3c6 -> 41800000", + "c0f58466 -> c0e00000", + "41088434 -> 41000000", + "40f614cf -> 40e00000", + "c0bd2c4b -> c0a00000", + "3fc427af -> 3f800000", + "41947638 -> 41900000", + "c13d6182 -> c1300000", + "409dd2f8 -> 40800000", + "c19fbcb9 -> c1980000", + "418424fe -> 41800000", + "c11daf77 -> c1100000", + "416643fc -> 41600000", + "416574a0 -> 41600000", + "41931eb1 -> 41900000", + "c0d41ee6 -> c0c00000", + "c116cebd -> c1100000", + "c19005a4 -> c1900000", + "40c480c3 -> 40c00000", + "c18b4c83 -> c1880000", + "c122d18a -> c1200000", + "4118b879 -> 41100000", + "40aa77dd -> 40a00000", + "4193811a -> 41900000", + "c12d0bd5 -> c1200000", + "4188d568 -> 41880000", + "c13ad0a5 -> c1300000", + "c1762d36 -> c1700000", + "41553020 -> 41500000", + "c1414adf -> c1400000", + "4010ccac -> 40000000", + "416cb69d -> 41600000", + "c110b7e9 -> c1100000", + "c0e9a9c7 -> c0e00000", + "c19085d5 -> c1900000", + "c0c65538 -> c0c00000", + "c0b2a024 -> c0a00000", + "413b538a -> 41300000", + "41760bc1 -> 41700000", + "40ee4acc -> 40e00000", + "c1880e47 -> c1880000", + "c19c6c10 -> c1980000", + "418222eb -> 41800000", + "c1728150 -> c1700000", + "c113b64c -> c1100000", + "4165a4d9 -> 41600000", + "c18b3aa0 -> c1880000", + "4116c5df -> 41100000", + "419f752d -> 41980000", + "4180e17e -> 41800000", + "bfda6dab -> bf800000", + "41757654 -> 41700000", + "c0ad94d5 -> c0a00000", + "bfe43fd1 -> bf800000", + "40b19469 -> 40a00000", + "4156777f -> 41500000", + "c02ccea4 -> c0000000", + "c03b64d2 -> c0000000", + "c1579314 -> c1500000", + "409598e5 -> 40800000", + "41863dba -> 41800000", + "3ecc8385 -> 00000000", + "4150eb35 -> 41500000", + "c0ac90a6 -> c0a00000", + "c156ba6e -> c1500000", + "c068c166 -> c0400000", + "c1396217 -> c1300000", + "4186ba91 -> 41800000", + "c0b5721f -> c0a00000", + "41520346 -> 41500000", + "418cf69d -> 41880000", + "418705ec -> 41800000", + "3f5ba492 -> 00000000", + "4047e9f2 -> 40400000", + "c140b912 -> c1400000", + "c020614c -> c0000000", + "40a4191d -> 40a00000", + "bfe56202 -> bf800000", + "c1947805 -> c1900000", + "406786c6 -> 40400000", + "409815e1 -> 40800000", + "4178ce90 -> 41700000", + "c19eddf4 -> c1980000", + "c043832b -> c0400000", + "bdbd8c0b -> 00000000", + "c1590b9c -> c1500000", + "40befdbb -> 40a00000", + "c041fd00 -> c0400000", + "4181bdb6 -> 41800000", + "413a90c9 -> 41300000", + "3fc2bdb6 -> 3f800000", + "c19353c1 -> c1900000", + "40d29274 -> 40c00000", + "c0e8df4f -> c0e00000", + "bfb2e160 -> bf800000", + "411e64b5 -> 41100000", + "c13cde07 -> c1300000", + "c1979241 -> c1900000", + "4126ff9e -> 41200000", + "c09b8602 -> c0800000", + "c1469939 -> c1400000", + "bf3cc47a -> 00000000", + "bf807768 -> bf800000", + "3e887449 -> 00000000", + "40155923 -> 40000000", + "c186a392 -> c1800000", + "bfb5ba49 -> bf800000", + "414f2a56 -> 41400000", + "4186e173 -> 41800000", + "c12da4ed -> c1200000", + "c18d7b96 -> c1880000", + "c0a8548e -> c0a00000", + "418dda6e -> 41880000", + "414fca85 -> 41400000", + "41263a33 -> 41200000", + "c0e02618 -> c0e00000", + "c15a93cc -> c1500000", + "410e1e69 -> 41000000", + "419a4d1f -> 41980000", + "4087ce12 -> 40800000", + "4194f5e7 -> 41900000", + "41837b7f -> 41800000", + "40329c0c -> 40000000", + "c19c499d -> c1980000", + "c1779834 -> c1700000", + "41015f06 -> 41000000", + "c180d74b -> c1800000", + "c11d6e98 -> c1100000", + "4114df58 -> 41100000", + "bf6d104b -> 00000000", + "c180d4d7 -> c1800000", + "40a2c97a -> 40a00000", + "c04bee6e -> c0400000", + "c137e7ef -> c1300000", + "418303f3 -> 41800000", + "bf199cfd -> 00000000", + "c084730d -> c0800000", + "c0acb675 -> c0a00000", + "41398859 -> 41300000", + "c124c004 -> c1200000", + "be39a33f -> 00000000", + "413a8b85 -> 41300000", + "4086fe31 -> 40800000", + "4185efa2 -> 41800000", + "418e4f46 -> 41880000", + "41355bbf -> 41300000", + "419ae149 -> 41980000", + "3f757f9a -> 00000000", + "c133cac8 -> c1300000", + "419f7826 -> 41980000", + "c0ba575a -> c0a00000", + "40821625 -> 40800000", + "410ea159 -> 41000000", + "c05c4767 -> c0400000", + "4194d24c -> 41900000", + "4157522e -> 41500000", + "bf72f64b -> 00000000", + "41941850 -> 41900000", + "c18cb9d0 -> c1880000", + "418f2cbf -> 41880000", + "c0f2941e -> c0e00000", + "402cf40e -> 40000000", + "c15e696c -> c1500000", + "3f7e7ea6 -> 00000000", + "c12ccaf1 -> c1200000", + "c1885e6d -> c1880000", + "c138de85 -> c1300000", + "412555b5 -> 41200000", + "3e14abaf -> 00000000", + "41818d09 -> 41800000", + "4185b160 -> 41800000", + "40a90876 -> 40a00000", + "41880304 -> 41880000", + "c1267296 -> c1200000", + "c14a7fb4 -> c1400000", + "40befcc1 -> 40a00000", + "c0e23f2e -> c0e00000", + "c0eac7c0 -> c0e00000", + "4192118d -> 41900000", + "4185b0bc -> 41800000", + "40872d03 -> 40800000", + "41762367 -> 41700000", + "40fda5bd -> 40e00000", + "c1502d37 -> c1500000", + "4131e3b4 -> 41300000", + "40d3480f -> 40c00000", + "c18efbda -> c1880000", + "4171a95d -> 41700000", + "c16b234c -> c1600000", + "40ce4a69 -> 40c00000", + "c11d166e -> c1100000", + "c142be41 -> c1400000", + "4155e46a -> 41500000", + "406a9eef -> 40400000", + "419193f5 -> 41900000", + "40300247 -> 40000000", + "c1140ae1 -> c1100000", + "c1754d89 -> c1700000", + "c0fddad6 -> c0e00000", + "3e47d1c2 -> 00000000", + "c137e2ca -> c1300000", + "410c6b42 -> 41000000", + "c185be44 -> c1800000", + "c0495295 -> c0400000", + "c144daa6 -> c1400000", + "417ba0b6 -> 41700000", + "c11d1eae -> c1100000", + "c08ea4ef -> c0800000", + "414045af -> 41400000", + "c1438283 -> c1400000", + "c065c913 -> c0400000", + "40185f77 -> 40000000", + "c19141c4 -> c1900000", + "4156acfb -> 41500000", + "4190d369 -> 41900000", + "4126fdb6 -> 41200000", + "c0864e44 -> c0800000", + "c055cd54 -> c0400000", + "c0837442 -> c0800000", + "c09d61fc -> c0800000", + "413216d9 -> 41300000", + "4085afa3 -> 40800000", + "4116e788 -> 41100000", + "409d29ac -> 40800000", + "41261b3b -> 41200000", + "41132118 -> 41100000", + "c10106ee -> c1000000", + "41979a5f -> 41900000", + "41085ed1 -> 41000000", + "c197e412 -> c1900000", + "c19c16b5 -> c1980000", + "4047e486 -> 40400000", + "c13de834 -> c1300000", + "c0a665e0 -> c0a00000", + "c10b6e86 -> c1000000", + "417fb220 -> 41700000", + "4115c1f8 -> 41100000", + "c133ad3d -> c1300000", + "c0de68c4 -> c0c00000", + "4130e869 -> 41300000", + "c0b69e78 -> c0a00000", + "c1878a1e -> c1800000", + "40e2bad6 -> 40e00000", + "c1427791 -> c1400000", + "3ff16ff0 -> 3f800000", + "c153dd37 -> c1500000", + "c0b15088 -> c0a00000", + "c0d82cf2 -> c0c00000", + "c0c5499d -> c0c00000", + "c18cfda4 -> c1880000", + "c0904332 -> c0800000", + "416a9b1f -> 41600000", + "c0a87fa7 -> c0a00000", + "c1111f9c -> c1100000", + "40a686ac -> 40a00000", + "c18af9e9 -> c1880000", + "c1950970 -> c1900000", + "3f8ea597 -> 3f800000", + "c177407c -> c1700000", + "c1852c6f -> c1800000", + "c0cd06fd -> c0c00000", + "c197ec83 -> c1900000", + "40ef5eb8 -> 40e00000", + "4119df68 -> 41100000", + "c192a1f3 -> c1900000", + "41096a56 -> 41000000", + "c1719222 -> c1700000", + "415b1a69 -> 41500000", + "417d631f -> 41700000", + "40a9910a -> 40a00000", + "c152db59 -> c1500000", + "c13cb730 -> c1300000", + "419ab66f -> 41980000", + "c176967c -> c1700000", + "c085cdd8 -> c0800000", + "412358f6 -> 41200000", + "40b567be -> 40a00000", + "c14b6eb1 -> c1400000", + "c136f7a7 -> c1300000", + "c0ffc6e7 -> c0e00000", + "c10a5fc1 -> c1000000", + "c17573ea -> c1700000", + "41520736 -> 41500000", + "c016c7ca -> c0000000", + "416f5b41 -> 41600000", + "c167c112 -> c1600000", + "41210bec -> 41200000", + "402bffe3 -> 40000000", + "407d4006 -> 40400000", + "419bc70b -> 41980000", + "c11090c7 -> c1100000", + "c15a5bcf -> c1500000", + "415f072f -> 41500000", + "c1877b94 -> c1800000", + "417c57a5 -> 41700000", + "c1441dbf -> c1400000", + "4151578a -> 41500000", + "404caedf -> 40400000", + "c1618eab -> c1600000", + "412aa4bd -> 41200000", + "3f70f0ad -> 00000000", + "3f58aa36 -> 00000000", + "c19ce2f9 -> c1980000", + "413e250d -> 41300000", + "c1892afa -> c1880000", + "413dddbb -> 41300000", + "416db7af -> 41600000", + "4120bc60 -> 41200000", + "40f40ecd -> 40e00000", + "c156df52 -> c1500000", + "3fd57ca0 -> 3f800000", + "c15eecd3 -> c1500000", + "40a5ece1 -> 40a00000", + "bdedf1dc -> 00000000", + "411c8760 -> 41100000", + "c140e8a2 -> c1400000", + "40394a0d -> 40000000", + "40dce1e1 -> 40c00000", + "c1557726 -> c1500000", + "40d78e50 -> 40c00000", + "4169ae66 -> 41600000", + "41933bc0 -> 41900000", + "c19973bb -> c1980000", + "c1873c78 -> c1800000", + "4190d39f -> 41900000", + "418d99a6 -> 41880000", + "4169b3a7 -> 41600000", + "c19499d6 -> c1900000", + "bfbc9946 -> bf800000", + "c159dacb -> c1500000", + "4120e47c -> 41200000", + "c1721833 -> c1700000", + "c18f3f9a -> c1880000", + "417aaa05 -> 41700000", + "40265519 -> 40000000", + "c04a26c1 -> c0400000", + "3f1cbd07 -> 00000000", + "c1807445 -> c1800000", + "415d499f -> 41500000", + "419d58e1 -> 41980000", + "c1369675 -> c1300000", + "405794a0 -> 40400000", + "40882955 -> 40800000", + "c0acb331 -> c0a00000", + "c0e13eb8 -> c0e00000", + "3f62af8b -> 00000000", + "bf1744ad -> 00000000", + "c180f446 -> c1800000", + "c0ab6d72 -> c0a00000", + "418bdf61 -> 41880000", + "411b5249 -> 41100000", + "40e8c958 -> 40e00000", + "c19a4cf1 -> c1980000", + "c145e07b -> c1400000", + "4185c462 -> 41800000", + "410d1266 -> 41000000", + "c19ca387 -> c1980000", + "402cbe1e -> 40000000", + "4170027a -> 41700000", + "c1874dfb -> c1800000", + "41790399 -> 41700000", + "40400c32 -> 40400000", + "c19323e4 -> c1900000", + "4196aa20 -> 41900000", + "419a4f51 -> 41980000", + "40cd8bd5 -> 40c00000", + "4159b01b -> 41500000", + "c10fe64e -> c1000000", + "c101d666 -> c1000000", + "418d4a17 -> 41880000", + "417002e5 -> 41700000", + "41623f2b -> 41600000", + "c178bdd6 -> c1700000", + "417b1ef8 -> 41700000", + "41927b22 -> 41900000", + "40edbe82 -> 40e00000", + "41632e67 -> 41600000", + "c075426f -> c0400000", + "c132f20e -> c1300000", + "c1698958 -> c1600000", + "4189c48b -> 41880000", + "3e900315 -> 00000000", + "c115b62f -> c1100000", + "410e4040 -> 41000000", + "407bf33b -> 40400000", + "c114230a -> c1100000", + "c1511fd3 -> c1500000", + "c17aeb68 -> c1700000", + "3d85d096 -> 00000000", + "c186eb3a -> c1800000", + "c129e3f4 -> c1200000", + "4076ab55 -> 40400000", + "c0a4c0c0 -> c0a00000", + "c09241a2 -> c0800000", + "c09723b6 -> c0800000", + "3f8c21af -> 3f800000", + "c0fe0e65 -> c0e00000", + "c1978ab6 -> c1900000", + "4062352a -> 40400000", + "bfa4792d -> bf800000", + "c103efa3 -> c1000000", + "c16d895c -> c1600000", + "c08176ef -> c0800000", + "c00ab58b -> c0000000", + "4093e307 -> 40800000", + "418039f5 -> 41800000" + ] + }, + { + "function": "cycles_fract", + "node": "ShaderNodeMath FRACT", + "cases": [ + "00000000 -> 00000000", + "3f800000 -> 00000000", + "bf800000 -> 00000000", + "3f000000 -> 3f000000", + "bf000000 -> 3f000000", + "40000000 -> 00000000", + "c0000000 -> 00000000", + "40400000 -> 00000000", + "c0300000 -> 3e800000", + "3dcccccd -> 3dcccccd", + "bdcccccd -> 3f666666", + "40f00000 -> 3f000000", + "c0f00000 -> 3f000000", + "33d6bf95 -> 33d6bf95", + "b3d6bf95 -> 3f7ffffe", + "42c80000 -> 00000000", + "c2c80000 -> 00000000", + "461c4000 -> 00000000", + "3e99999a -> 3e99999a", + "3f333333 -> 3f333333", + "c098cce3 -> 3e6663a0", + "c0ca818c -> 3f2bf3a0", + "4159ad94 -> 3f1ad940", + "40307c1b -> 3f41f06c", + "c198e938 -> 3f62d900", + "41272952 -> 3ee52a40", + "c155bfd1 -> 3f2402f0", + "c131a76e -> 3f658920", + "41403572 -> 3c55c800", + "4198396f -> 3ce5bc00", + "3fa382f0 -> 3e8e0bc0", + "418128b8 -> 3e145c00", + "40770a94 -> 3f5c2a50", + "410a9af3 -> 3f29af30", + "c10b6454 -> 3e937580", + "4181a0f1 -> 3e507880", + "c19f35ed -> 3dca1300", + "4047ecdb -> 3dfd9b60", + "40d966d8 -> 3f4b36c0", + "418faa34 -> 3f754680", + "c1114491 -> 3f6bb6f0", + "c1567655 -> 3f189ab0", + "40a5925c -> 3e324b80", + "c0762975 -> 3e1d68b0", + "3f18864e -> 3f18864e", + "4162f4ac -> 3e3d2b00", + "c1146c4b -> 3f393b50", + "41932095 -> 3ec82540", + "c1293d9b -> 3ed84ca0", + "c17e4a3e -> 3ddae100", + "41630761 -> 3e41d840", + "c157ba00 -> 3f046000", + "41675d03 -> 3eeba060", + "c00e3e5f -> 3f470684", + "c152abad -> 3f554530", + "beb4fb23 -> 3f25826e", + "c0b6037b -> 3e9fc850", + "41673369 -> 3ee66d20", + "c095d5b0 -> 3ea2a500", + "c0f3eeba -> 3ec11460", + "41710fee -> 3d87f700", + "c15cfe1a -> 3e407980", + "c081491e -> 3f75b710", + "c17afc75 -> 3ea07160", + "4048f0f7 -> 3e0f0f70", + "c005ad11 -> 3f694bbc", + "41329436 -> 3e250d80", + "418cda41 -> 3f1b4820", + "c16cc141 -> 3e4fafc0", + "416fdb6d -> 3f7db6d0", + "c1100d89 -> 3f7f2770", + "40b43254 -> 3f2192a0", + "41523b58 -> 3e0ed600", + "c10505bf -> 3f2fa410", + "410eb009 -> 3f6b0090", + "c19db5dd -> 3e9288c0", + "c121fbf4 -> 3f6040c0", + "bfe5d7a0 -> 3e514300", + "c1354ed4 -> 3f2b12c0", + "c14d1252 -> 3e3b6b80", + "3fc69f78 -> 3f0d3ef0", + "c1829c35 -> 3f2c7960", + "c1518d59 -> 3f672a70", + "40ea64ae -> 3ea64ae0", + "400892f7 -> 3e092f70", + "c11d9df9 -> 3e1881c0", + "408620cc -> 3e441980", + "c185a1d4 -> 3e978b00", + "c1559710 -> 3f268f00", + "40d607c5 -> 3f303e28", + "c199efbc -> 3f420880", + "40c3dca1 -> 3df72840", + "c0b4be7a -> 3eb41860", + "414c806b -> 3f4806b0", + "c188daf3 -> 3f64a1a0", + "bfd53ebf -> 3eab0504", + "c12fcf74 -> 3c423000", + "c043edbc -> 3f704910", + "c0c36010 -> 3f64ff80", + "416b93db -> 3f393db0", + "c0daa9d1 -> 3e2ac5e0", + "4188cbf1 -> 3dcbf100", + "4192e0a8 -> 3eb82a00", + "41909978 -> 3d997800", + "4180fe13 -> 3dfe1300", + "c106059e -> 3f1fa620", + "415b7847 -> 3f378470", + "3e906837 -> 3e906837", + "bfa2a9cd -> 3f3aac66", + "416d5b13 -> 3f55b130", + "c139d1ab -> 3ec5caa0", + "c191dffd -> 3f440060", + "416c934e -> 3f4934e0", + "40a47bd5 -> 3e0f7aa0", + "c0e46679 -> 3f5ccc38", + "c0f75a17 -> 3e8a5e90", + "c0aa5007 -> 3f2d7fc8", + "4082039a -> 3d80e680", + "4106fdd3 -> 3edfba60", + "411d8ba6 -> 3f58ba60", + "41116766 -> 3db3b300", + "c10ccd0e -> 3e4cbc80", + "416e2cfe -> 3f62cfe0", + "415769c3 -> 3eed3860", + "41991995 -> 3e0cca80", + "40b63ac4 -> 3f31d620", + "411afddb -> 3f2fddb0", + "41081c76 -> 3f01c760", + "41744ced -> 3e899da0", + "419bb73a -> 3eedce80", + "41925099 -> 3e942640", + "41421199 -> 3e046640", + "412b5fb8 -> 3f35fb80", + "c02c8da4 -> 3e9b92e0", + "bfca6010 -> 3ed67fc0", + "c18fee62 -> 3c0cf000", + "c167d029 -> 3f02fd70", + "c11b878d -> 3e8f0e60", + "c1265a20 -> 3f1a5e00", + "412dfb49 -> 3f5fb490", + "41315385 -> 3da9c280", + "c1416281 -> 3f69d7f0", + "c192f4a1 -> 3f216be0", + "415e6d68 -> 3f66d680", + "4191ef18 -> 3e778c00", + "c13405de -> 3f3fa220", + "419d51f9 -> 3f2a3f20", + "c1864786 -> 3e5c3d00", + "417c9a70 -> 3f49a700", + "4184b952 -> 3f172a40", + "40e7ada1 -> 3e75b420", + "c18522a6 -> 3eb75680", + "40f4ff5d -> 3f27fae8", + "c181557f -> 3f555020", + "c192d435 -> 3f257960", + "4058c824 -> 3ec64120", + "c138d93a -> 3ee4d8c0", + "c16221bc -> 3f5de440", + "c17ed3e9 -> 3d960b80", + "4162766b -> 3e1d9ac0", + "c0e4492f -> 3f5db688", + "40e0baf4 -> 3cbaf400", + "c0f1a122 -> 3ee5ede0", + "411a616f -> 3f2616f0", + "40cbc1f2 -> 3ebc1f20", + "c12ed5df -> 3d951080", + "c18393e4 -> 3f0d8380", + "41393a81 -> 3f13a810", + "41580627 -> 3f006270", + "c119b200 -> 3ec9c000", + "4189130d -> 3e098680", + "4127db04 -> 3efb6080", + "c106ede3 -> 3f1121d0", + "4030c408 -> 3f431020", + "41704f1e -> 3c9e3c00", + "41889f4c -> 3d9f4c00", + "4048cb2e -> 3e0cb2e0", + "413b7e31 -> 3f37e310", + "4104141d -> 3e8283a0", + "c19bc3f8 -> 3f078100", + "40e71747 -> 3e62e8e0", + "41755cc5 -> 3eab98a0", + "c0c15c5e -> 3f751d10", + "c192140f -> 3f3d7e20", + "bd830f00 -> 3f6f9e20", + "c08a2383 -> 3f2ee3e8", + "41953922 -> 3f272440", + "bedc8a77 -> 3f11bac4", + "c167e9d6 -> 3f0162a0", + "c19b2326 -> 3f1b9b40", + "3fbadf43 -> 3eeb7d0c", + "c08301ce -> 3f67f190", + "c161f32d -> 3f60cd30", + "c11d89c6 -> 3e1d8e80", + "416838e2 -> 3f038e20", + "415b564f -> 3f3564f0", + "c111f6e4 -> 3f6091c0", + "c124ef35 -> 3f310cb0", + "bc990f65 -> 3f7b3785", + "40bbdc66 -> 3f5ee330", + "3f5808d3 -> 3f5808d3", + "415ae1a7 -> 3f2e1a70", + "40eaa4d3 -> 3eaa4d30", + "404bddec -> 3e3ddec0", + "c12174ba -> 3f68b460", + "c16e739e -> 3dc63100", + "41611d6d -> 3d8eb680", + "c1476770 -> 3f098900", + "409a2480 -> 3f512400", + "c1011d3f -> 3f6e2c10", + "c100271e -> 3f7d8e20", + "c0d2c97c -> 3ed36840", + "c1050788 -> 3f2f8780", + "411e449e -> 3f6449e0", + "41744558 -> 3e88ab00", + "c1131cf4 -> 3f4e30c0", + "c0eb4b81 -> 3f25a3f8", + "4160d6f7 -> 3d56f700", + "c1818032 -> 3f4ff9c0", + "4102e420 -> 3e390800", + "4173559f -> 3e5567c0", + "c189ede5 -> 3f424360", + "c191f23a -> 3f41b8c0", + "402ece66 -> 3f3b3998", + "c0ca8be3 -> 3f2ba0e8", + "c17f6d57 -> 3d12a900", + "c095d889 -> 3ea27770", + "418a2625 -> 3e898940", + "c0d96f76 -> 3e521140", + "c0db2a27 -> 3e1abb20", + "c16ba179 -> 3e8bd0e0", + "3f0d4ead -> 3f0d4ead", + "40cf8db9 -> 3ef8db90", + "40dd948f -> 3f6ca478", + "c1648f65 -> 3f3709b0", + "416cfbfa -> 3f4fbfa0", + "410ed9da -> 3f6d9da0", + "c19ee10b -> 3e0f7a80", + "4112ea33 -> 3e3a8cc0", + "c131d2c4 -> 3f62d3c0", + "41207536 -> 3cea6c00", + "4161c782 -> 3de3c100", + "c049f158 -> 3f583aa0", + "c16a5f39 -> 3eb418e0", + "c1337b83 -> 3f4847d0", + "bfa3a50c -> 3f38b5e8", + "c145691b -> 3f296e50", + "c190ca4a -> 3f66b6c0", + "404d5730 -> 3e557300", + "c082cf55 -> 3f698558", + "c1358dad -> 3f272530", + "4134bc7a -> 3e978f40", + "c15a0b18 -> 3ebe9d00", + "c0d9e77c -> 3e431080", + "418dbe80 -> 3f37d000", + "419ddf5f -> 3f3bebe0", + "c082a1c3 -> 3f6af1e8", + "c1160f5a -> 3f1f0a60", + "c0a0a1e5 -> 3f7af0d8", + "c18b7255 -> 3f11b560", + "c176c8c7 -> 3f137390", + "c053fe02 -> 3f3007f8", + "412b86a0 -> 3f386a00", + "3cb22181 -> 3cb22181", + "c142fed8 -> 3f501280", + "c13efcc8 -> 3d819c00", + "c1820deb -> 3f3e42a0", + "c11cc619 -> 3e4e79c0", + "40eb1d35 -> 3eb1d350", + "416abb24 -> 3f2bb240", + "c0c00548 -> 3f7fd5c0", + "413109e5 -> 3d84f280", + "c10e784f -> 3dc3d880", + "c17be4bb -> 3e8368a0", + "c1607b3c -> 3f784c40", + "c1611c64 -> 3f6e39c0", + "3cce676b -> 3cce676b", + "411c4ea9 -> 3f44ea90", + "c1457bde -> 3f284220", + "40900cb4 -> 3f0065a0", + "419efd93 -> 3f5fb260", + "c15938e7 -> 3ed8e320", + "c097e3c3 -> 3e81c3d0", + "c0fdbe12 -> 3d907b80", + "c0d64b0d -> 3e9b4f30", + "c153ed1d -> 3f412e30", + "3f98b152 -> 3e458a90", + "c0501ef0 -> 3f3f8440", + "c18dc883 -> 3e8ddf40", + "410df568 -> 3f5f5680", + "40d20616 -> 3f1030b0", + "417da348 -> 3f5a3480", + "c183c2ac -> 3f07aa80", + "c11bfc0c -> 3e807e80", + "c10a95b0 -> 3ead4a00", + "c09de1b1 -> 3d8793c0", + "c16667f2 -> 3f1980e0", + "c051eb72 -> 3f385238", + "c18d3074 -> 3eb3e300", + "c0e93e60 -> 3f360d00", + "417b5e1f -> 3f35e1f0", + "c1871bb3 -> 3de44d00", + "41897d45 -> 3e3ea280", + "417bc937 -> 3f3c9370", + "40aa1f60 -> 3ea1f600", + "411d573b -> 3f5573b0", + "c15641d3 -> 3f1be2d0", + "40e70a9b -> 3e615360", + "bf24f9c0 -> 3eb60c80", + "41023d36 -> 3e0f4d80", + "411c3b2d -> 3f43b2d0", + "41839a0c -> 3ee68300", + "c17f10dc -> 3d6f2400", + "c1936878 -> 3f12f100", + "c11bc521 -> 3e875be0", + "409ce770 -> 3f673b80", + "c1702958 -> 3f7d6a80", + "41964639 -> 3f48c720", + "c0900efd -> 3eff1030", + "4163a1b8 -> 3e686e00", + "4060609e -> 3f018278", + "41796465 -> 3f164650", + "c0fe7d8d -> 3d413980", + "c08c22d7 -> 3f1ee948", + "40380e8a -> 3f603a28", + "4194e15c -> 3f1c2b80", + "415f5133 -> 3f751330", + "c12450c0 -> 3f3af400", + "c180b017 -> 3f69fd20", + "41573175 -> 3ee62ea0", + "4187475e -> 3f68ebc0", + "c1324cf2 -> 3f5b30e0", + "c119b121 -> 3ec9dbe0", + "40c6afd9 -> 3e55fb20", + "c13a3606 -> 3eb93f40", + "3ec7fc61 -> 3ec7fc61", + "41935dd9 -> 3ed77640", + "409d5e2f -> 3f6af178", + "40abd9f8 -> 3ebd9f80", + "c00dd673 -> 3f48a634", + "40572516 -> 3eb928b0", + "415ecc53 -> 3f6cc530", + "c14b5c81 -> 3e946fe0", + "c15d2f42 -> 3e342f80", + "41254e2a -> 3ea9c540", + "418e4cc5 -> 3f4998a0", + "4145da86 -> 3ebb50c0", + "419f8b33 -> 3f716660", + "c18de43f -> 3e86f040", + "c15ed6c8 -> 3d949c00", + "c1821fe8 -> 3f3c0300", + "c12f8314 -> 3cf9d800", + "3fee44ae -> 3f5c895c", + "c038fe4e -> 3de03640", + "c0930c8e -> 3ecf3720", + "415a998f -> 3f2998f0", + "419b015b -> 3ec056c0", + "c0d3327a -> 3eccd860", + "3f6cf64f -> 3f6cf64f", + "c199a10d -> 3f4bde60", + "c18ce15c -> 3ec7a900", + "c080349c -> 3f7e5b20", + "c07ea685 -> 3cacbd80", + "c16b0f75 -> 3e9e1160", + "c0ff6763 -> 3c989d00", + "c0c8ddd3 -> 3f391168", + "c137c1fd -> 3f03e030", + "be961e24 -> 3f34f0ee", + "41754e81 -> 3ea9d020", + "419519e3 -> 3f233c60", + "c16a99f3 -> 3eacc1a0", + "c18a27a9 -> 3f3b0ae0", + "4188ae2d -> 3dae2d00", + "400a9e78 -> 3e29e780", + "41478d36 -> 3ef1a6c0", + "40f9ae14 -> 3f4d70a0", + "40b7ad3a -> 3f3d69d0", + "40f97cde -> 3f4be6f0", + "bff9893e -> 3d4ed840", + "4196e7b7 -> 3f5cf6e0", + "c0ae8ec2 -> 3f0b89f0", + "4186da6e -> 3f5b4dc0", + "c0ec70c2 -> 3f1c79f0", + "c1292e99 -> 3eda2ce0", + "40ab0d01 -> 3eb0d010", + "412c2657 -> 3f426570", + "415eb248 -> 3f6b2480", + "418900a4 -> 3e005200", + "3f6ac163 -> 3f6ac163", + "c153f759 -> 3f408a70", + "414a873f -> 3f2873f0", + "c088970c -> 3f3b47a0", + "bf2dc9a7 -> 3ea46cb2", + "c191ae85 -> 3f4a2f60", + "4181f4ba -> 3e7a5d00", + "409feb56 -> 3f7f5ab0", + "40be4480 -> 3f722400", + "3f20b3a8 -> 3f20b3a8", + "407653a2 -> 3f594e88", + "4182a331 -> 3ea8cc40", + "4035193f -> 3f5464fc", + "c197b06d -> 3d1f2600", + "40f99352 -> 3f4c9a90", + "418cf7a9 -> 3f1ef520", + "412f6bdc -> 3f76bdc0", + "c1179166 -> 3f06e9a0", + "c192f31c -> 3f219c80", + "c00d8ed0 -> 3f49c4c0", + "4192d2a2 -> 3eb4a880", + "419e3aba -> 3f475740", + "c1626de0 -> 3f592200", + "c0637fea -> 3ee400b0", + "4190ddd7 -> 3dddd700", + "419fcfdc -> 3f79fb80", + "c18257c0 -> 3f350800", + "415e4405 -> 3f644050", + "414a8f2b -> 3f28f2b0", + "41454fb3 -> 3ea9f660", + "bf454b03 -> 3e6ad3f4", + "419c45b9 -> 3f08b720", + "bf6dda22 -> 3d912ef0", + "c19c7cdb -> 3ee0c940", + "4189f159 -> 3e78ac80", + "c1741d2e -> 3f3e2d20", + "401d08ed -> 3ee84768", + "4196ffd6 -> 3f5ffac0", + "c17bb404 -> 3e897f80", + "c015d5dd -> 3f28a88c", + "c15d460a -> 3e2e7d80", + "c0316dac -> 3e692540", + "40b758d4 -> 3f3ac6a0", + "3f1fdb15 -> 3f1fdb15", + "4127b4f2 -> 3ef69e40", + "40970670 -> 3f383380", + "c16bbaff -> 3e88a020", + "417c8e74 -> 3f48e740", + "bfb8c13e -> 3f0e7d84", + "416a9df2 -> 3f29df20", + "40e69087 -> 3e5210e0", + "c15e2719 -> 3dec7380", + "c1290c87 -> 3ede6f20", + "c117708f -> 3f08f710", + "c19c188c -> 3ef9dd00", + "c0193758 -> 3f1b22a0", + "405324e4 -> 3e992720", + "c1214c20 -> 3f6b3e00", + "419d40ee -> 3f281dc0", + "3ecd4756 -> 3ecd4756", + "c00f7154 -> 3f423ab0", + "c18c43cf -> 3eef0c40", + "c0b8f8b5 -> 3e60e960", + "4131328b -> 3d994580", + "c1802389 -> 3f7b8ee0", + "4113d16a -> 3e745a80", + "4042042c -> 3d010b00", + "40851d14 -> 3e23a280", + "c199ef23 -> 3f421ba0", + "c18235e4 -> 3f394380", + "40b5297f -> 3f294bf8", + "c006a0e1 -> 3f657c7c", + "c0aa78a3 -> 3f2c3ae8", + "c15cfdb2 -> 3e409380", + "41418c87 -> 3dc64380", + "3e4a04f9 -> 3e4a04f9", + "40563f62 -> 3eb1fb10", + "c14fa4cf -> 3cb66200", + "c1723c8f -> 3f5c3710", + "c185e974 -> 3e85a300", + "40b1d7d8 -> 3f0ebec0", + "419af100 -> 3ebc4000", + "40f663ec -> 3f331f60", + "c0a98042 -> 3f33fdf0", + "c0fe159c -> 3d753200", + "4167415c -> 3ee82b80", + "c06ed6b1 -> 3e894a78", + "c19bb71a -> 3f091cc0", + "4137f78d -> 3efef1a0", + "415aa5a3 -> 3f2a5a30", + "40dbb950 -> 3f5dca80", + "40e2cf9e -> 3db3e780", + "4152f839 -> 3e3e0e40", + "41367d87 -> 3ecfb0e0", + "c1045169 -> 3f3ae970", + "3fe94791 -> 3f528f22", + "c0c36183 -> 3f64f3e8", + "41425345 -> 3e14d140", + "400a2c12 -> 3e22c120", + "4188c175 -> 3dc17500", + "418310e0 -> 3ec43800", + "c0bad847 -> 3e24f720", + "3fe6a5cd -> 3f4d4b9a", + "40df7b5a -> 3f7bdad0", + "c10083fa -> 3f77c060", + "4198e516 -> 3de51600", + "408e417d -> 3ee417d0", + "40cba9a9 -> 3eba9a90", + "3e897e22 -> 3e897e22", + "3f1f222e -> 3f1f222e", + "c146c82b -> 3f137d50", + "409f9a12 -> 3f7cd090", + "4187311f -> 3f6623e0", + "419309d5 -> 3ec27540", + "c10623c7 -> 3f1dc390", + "416efff6 -> 3f6fff60", + "3ed92375 -> 3ed92375", + "c0a331df -> 3f667108", + "40e626a4 -> 3e44d480", + "c142fdb6 -> 3f5024a0", + "3fd06d79 -> 3f20daf2", + "410e521f -> 3f6521f0", + "41957165 -> 3f2e2ca0", + "c1337704 -> 3f488fc0", + "40a1547c -> 3d2a3e00", + "40c18f04 -> 3d478200", + "c0bfd763 -> 3ba27400", + "be0cd724 -> 3f5cca37", + "c03b63cb -> 3d9386a0", + "4030d5f4 -> 3f4357d0", + "419202dd -> 3e80b740", + "40a9e4b4 -> 3e9e4b40", + "c1020d82 -> 3f5f27e0", + "bf890764 -> 3f6df138", + "40f8d372 -> 3f469b90", + "c1313233 -> 3f6cdcd0", + "c0baa769 -> 3e2b12e0", + "c121c3cb -> 3f63c350", + "40be794b -> 3f73ca58", + "bfb2bb49 -> 3f1a896e", + "c0cb7b93 -> 3f242368", + "c0a37172 -> 3f647470", + "c115a460 -> 3f25ba00", + "bfa13301 -> 3f3d99fe", + "40a4d826 -> 3e1b04c0", + "c0ae08bf -> 3f0fba08", + "c10117e5 -> 3f6e81b0", + "40fa1cc8 -> 3f50e640", + "3f273f25 -> 3f273f25", + "c192cf03 -> 3f261fa0", + "c16176f7 -> 3f689090", + "4109078e -> 3f1078e0", + "4184426c -> 3f084d80", + "4146e3b0 -> 3edc7600", + "c19136a9 -> 3f592ae0", + "c0d6a71e -> 3e958e20", + "4184ffa7 -> 3f1ff4e0", + "c195ab0e -> 3e953c80", + "c168b10d -> 3ee9de60", + "40c1845e -> 3d422f00", + "c0a4fd0e -> 3f581790", + "416498d7 -> 3e931ae0", + "c0f05ea8 -> 3efa1580", + "c052c319 -> 3f34f39c", + "410a9e94 -> 3f29e940", + "417da15e -> 3f5a15e0", + "c0af67c0 -> 3f04c200", + "4139bad1 -> 3f1bad10", + "4144aa68 -> 3e954d00", + "41152b84 -> 3ea57080", + "40d8725f -> 3f4392f8", + "414750b8 -> 3eea1700", + "3f589219 -> 3f589219", + "41880274 -> 3a9d0000", + "4115492b -> 3ea92560", + "413fec77 -> 3f7ec770", + "c13688e4 -> 3f1771c0", + "c189409c -> 3f57ec80", + "c1954dc9 -> 3eac8dc0", + "419c7da9 -> 3f0fb520", + "40144804 -> 3ea24020", + "40ac0cb7 -> 3ec0cb70", + "c0e5d4e9 -> 3f5158b8", + "4108e3e9 -> 3f0e3e90", + "bf7f55e1 -> 3b2a1f00", + "40ca2d37 -> 3ea2d370", + "405e63f7 -> 3ef31fb8", + "c19899e2 -> 3f6cc3c0", + "405ac4f4 -> 3ed627a0", + "c182482a -> 3f36fac0", + "417478fb -> 3e8f1f60", + "c19e85d8 -> 3e3d1400", + "40eac4bd -> 3eac4bd0", + "412ba82e -> 3f3a82e0", + "c1069b7a -> 3f164860", + "c12136ab -> 3f6c9550", + "418fc543 -> 3f78a860", + "3f36311c -> 3f36311c", + "c0a3319c -> 3f667320", + "40f5cc7c -> 3f2e63e0", + "40ae1a07 -> 3ee1a070", + "4125d56c -> 3ebaad80", + "c139ae78 -> 3eca3100", + "4141ce43 -> 3de72180", + "41639380 -> 3e64e000", + "c1463223 -> 3f1cddd0", + "c0d7f030 -> 3e80fd00", + "3ea59ddc -> 3ea59ddc", + "40c5bcd9 -> 3e379b20", + "3fc90cc1 -> 3f121982", + "41955b67 -> 3f2b6ce0", + "bec2343d -> 3f1ee5e2", + "c119d4d8 -> 3ec56500", + "41505dca -> 3cbb9400", + "c0a50a5a -> 3f57ad30", + "40189f29 -> 3ec4f948", + "4121a12b -> 3dd09580", + "418cb98e -> 3f1731c0", + "414dc95a -> 3f5c95a0", + "c107e123 -> 3f01edd0", + "c0ea994a -> 3f2b35b0", + "414e6097 -> 3f660970", + "be617339 -> 3f47a332", + "c153128c -> 3f4ed740", + "40bea195 -> 3f750ca8", + "c17cc076 -> 3e4fe280", + "c0f952f8 -> 3e55a100", + "c11531e7 -> 3f2ce190", + "415745fe -> 3ee8bfc0", + "c174357c -> 3f3ca840", + "408d56a5 -> 3ed56a50", + "c184fab8 -> 3ec15200", + "bff88c55 -> 3d6e7560", + "c1275302 -> 3f0acfe0", + "40c3b3bc -> 3decef00", + "c0e4d137 -> 3f597648", + "c14eff2d -> 3d806980", + "40cc3180 -> 3ec31800", + "bff8fd8a -> 3d604ec0", + "412a9325 -> 3f293250", + "bfb63016 -> 3f139fd4", + "c150313f -> 3f7cec10", + "c0f2266a -> 3edd9960", + "40075f6f -> 3debede0", + "c1782eec -> 3efa2280", + "c181351d -> 3f595c60", + "4004bb8d -> 3d9771a0", + "41088d4b -> 3f08d4b0", + "c076450f -> 3e1baf10", + "41943c01 -> 3f078020", + "c1715648 -> 3f6a9b80", + "4195396f -> 3f272de0", + "c17be5d7 -> 3e834520", + "415d9d26 -> 3f59d260", + "c1926f1f -> 3f321c20", + "419eac19 -> 3f558320", + "4141a1ce -> 3dd0e700", + "c169247e -> 3edb7040", + "408f550c -> 3ef550c0", + "41950f39 -> 3f21e720", + "c122ba05 -> 3f545fb0", + "c11ff780 -> 3b080000", + "bf454593 -> 3e6ae9b4", + "40b0571f -> 3f02b8f8", + "c10ceb36 -> 3e453280", + "c183844a -> 3f0f76c0", + "c09c11a4 -> 3dfb9700", + "c00e58b1 -> 3f469d3c", + "bfaf3f0b -> 3f2181ea", + "c19b3540 -> 3f195800", + "41732e18 -> 3e4b8600", + "c1975cc5 -> 3da33b00", + "417e3e5b -> 3f63e5b0", + "412f043b -> 3f7043b0", + "41500dd1 -> 3b5d1000", + "c04f1110 -> 3f43bbc0", + "418df3a5 -> 3f3e74a0", + "4038230c -> 3f608c30", + "4062645d -> 3f099174", + "41260cd2 -> 3ec19a40", + "416be918 -> 3f3e9180", + "c119825f -> 3ecfb420", + "c08a4a65 -> 3f2dacd8", + "413fe374 -> 3f7e3740", + "418228b9 -> 3e8a2e40", + "409e755f -> 3f73aaf8", + "c1460409 -> 3f1fbf70", + "c05045e0 -> 3f3ee880", + "c0bd45d8 -> 3dae8a00", + "c11d6be7 -> 3e250640", + "411d6213 -> 3f562130", + "c1081f85 -> 3efc0f60", + "c110ea70 -> 3f715900", + "41022794 -> 3e09e500", + "40805360 -> 3c26c000", + "c14dd6a2 -> 3e0a5780", + "bfcba74e -> 3ed162c8", + "c130d39b -> 3f72c650", + "415f5d3b -> 3f75d3b0", + "c19f1367 -> 3dec9900", + "3fc253bf -> 3f04a77e", + "40ce1ccd -> 3ee1ccd0", + "c195f617 -> 3e827a40", + "415c17cd -> 3f417cd0", + "c10caa85 -> 3e555ec0", + "c10c438f -> 3e6f1c40", + "418d6fe0 -> 3f2dfc00", + "4121e4e0 -> 3df27000", + "bf1b83dd -> 3ec8f846", + "41056305 -> 3eac60a0", + "c04a435b -> 3f56f294", + "c16be2cb -> 3e83a6a0", + "c19fe533 -> 3c566800", + "c19ef63d -> 3e04e180", + "40281a28 -> 3f2068a0", + "40a17fda -> 3d3fed00", + "c076440e -> 3e1bbf20", + "4194f62d -> 3f1ec5a0", + "bf99357a -> 3f4d950c", + "c0e7282b -> 3f46bea8", + "c11c5f93 -> 3e681b40", + "c0e997ab -> 3f3342a8", + "410068b8 -> 3cd17000", + "415676a0 -> 3eced400", + "418a3787 -> 3e8de1c0", + "c14758b1 -> 3f0a74f0", + "c0c99b59 -> 3f332538", + "be05f11e -> 3f5e83b8", + "c1841bc7 -> 3ef90e40", + "bfaae3ab -> 3f2a38aa", + "41093a70 -> 3f13a700", + "c123ea9e -> 3f415620", + "c08f8f9c -> 3f038320", + "c18ae88f -> 3f22ee20", + "c11f441c -> 3d3be400", + "c0218f92 -> 3ef38370", + "c14fc0b5 -> 3c7d2c00", + "414fd2af -> 3f7d2af0", + "c178e29f -> 3ee3ac20", + "4199bf16 -> 3e5f8b00", + "c1172144 -> 3f0debc0", + "c01c093b -> 3f0fdb14", + "c11a31b0 -> 3eb9ca00", + "405588c8 -> 3eac4640", + "c16a303f -> 3eb9f820", + "c0b3e0da -> 3ec1f260", + "41889bfa -> 3d9bfa00", + "c16fdea7 -> 3c056400", + "c13b4fdd -> 3e960460", + "c11bdb12 -> 3e849dc0", + "411c19bf -> 3f419bf0", + "3f0e7849 -> 3f0e7849", + "c1733502 -> 3f4cafe0", + "c11df262 -> 3e036780", + "c0f5c45f -> 3ea3ba10", + "41820d71 -> 3e835c40", + "c19a969f -> 3f2d2c20", + "c127ab83 -> 3f0547d0", + "3deb22a6 -> 3deb22a6", + "c0885590 -> 3f3d5380", + "3ff031e9 -> 3f6063d2", + "c1773313 -> 3f0cced0", + "4093a676 -> 3f1d33b0", + "3e58ac6b -> 3e58ac6b", + "c1626414 -> 3f59bec0", + "c13c4b87 -> 3e6d1e40", + "c0fa6a68 -> 3e32b300", + "40efd4d5 -> 3efd4d50", + "bf5dc41b -> 3e08ef94", + "c0e256da -> 3f6d4930", + "3f8fdbb1 -> 3dfdbb10", + "c10301f0 -> 3f4fe100", + "41370a7a -> 3ee14f40", + "c15a06ed -> 3ebf2260", + "c0ac44a8 -> 3f1ddac0", + "c0df7aa6 -> 3c855a00", + "c175c81d -> 3f237e30", + "c10d423e -> 3e2f7080", + "c111f772 -> 3f6088e0", + "c1336a5d -> 3f495a30", + "416342f3 -> 3e50bcc0", + "4032f38f -> 3f4bce3c", + "c0bea28c -> 3d2eba00", + "416c58f6 -> 3f458f60", + "c16adf03 -> 3ea41fa0", + "bf84acd3 -> 3f76a65a", + "418dbf36 -> 3f37e6c0", + "bf9a9bed -> 3f4ac826", + "40e4f3ba -> 3e1e7740", + "bfb37d9d -> 3f1904c6", + "c13fbcd2 -> 3c865c00", + "c18c2c7f -> 3ef4e040", + "c1358592 -> 3f27a6e0", + "c18a16e0 -> 3f3d2400", + "c15525c9 -> 3f2da370", + "4144d26f -> 3e9a4de0", + "41861680 -> 3f42d000", + "3fa6dab6 -> 3e9b6ad8", + "3ff91843 -> 3f723086", + "4184d553 -> 3f1aaa60", + "c192d49d -> 3f256c60", + "418c6df2 -> 3f0dbe40", + "c183b199 -> 3f09cce0", + "c0fe37b4 -> 3d642600", + "40efa760 -> 3efa7600", + "c1861344 -> 3e765e00", + "410d68bf -> 3f568bf0", + "406b4631 -> 3f2d18c4", + "c153b3e4 -> 3f44c1c0", + "4162b20e -> 3e2c8380", + "4127461a -> 3ee8c340", + "c17b4d62 -> 3e9653c0", + "c1619e47 -> 3f661b90", + "4177e665 -> 3efccca0", + "c125b718 -> 3f248e80", + "40585ba5 -> 3ec2dd28", + "c195888d -> 3e9ddcc0", + "c19b89bb -> 3f0ec8a0", + "419dc71d -> 3f38e3a0", + "410b26da -> 3f326da0", + "411af4f9 -> 3f2f4f90", + "3f9e9c1a -> 3e74e0d0", + "3e68cdf4 -> 3e68cdf4", + "408e8f21 -> 3ee8f210", + "c10bd146 -> 3e85d740", + "c119367b -> 3ed930a0", + "bbac22a5 -> 3f7ea7bb", + "c12fc1ec -> 3c785000", + "40efd6e1 -> 3efd6e10", + "419724bf -> 3f6497e0", + "c14d49ac -> 3e2d9500", + "4121ad1a -> 3dd68d00", + "4131cbfd -> 3de5fe80", + "3f85fc25 -> 3d3f84a0", + "c01e5517 -> 3f06aba4", + "c0f8007e -> 3e7ff040", + "c05b9d2e -> 3f118b48", + "c15b3e42 -> 3e9837c0", + "bffe46cb -> 3c5c9a80", + "c0aaa8e4 -> 3f2ab8e0", + "c18b98a1 -> 3f0cebe0", + "c1746d32 -> 3f392ce0", + "c0fc9820 -> 3dd9f800", + "c1642d9d -> 3f3d2630", + "bfd5c897 -> 3ea8dda4", + "4083757a -> 3ddd5e80", + "c15a6929 -> 3eb2dae0", + "41898ba0 -> 3e45d000", + "c17ff9e6 -> 3ac34000", + "3ff3c8c3 -> 3f679186", + "c1163bbb -> 3f1c4450", + "410cc3c7 -> 3f4c3c70", + "419f05da -> 3f60bb40", + "3ed87151 -> 3ed87151", + "c19d5912 -> 3ea9bb80", + "c135a3b7 -> 3f25c490", + "41459c32 -> 3eb38640", + "c1301452 -> 3f7ebae0", + "41178314 -> 3ef06280", + "4066cc95 -> 3f1b3254", + "4173a401 -> 3e690040", + "4154f06d -> 3e9e0da0", + "c107e7f1 -> 3f0180f0", + "406813e0 -> 3f204f80", + "bff02e96 -> 3dfd16a0", + "c12847b8 -> 3ef70900", + "40f20771 -> 3f103b88", + "c0394ad7 -> 3dd6a520", + "c0f57858 -> 3ea87a80", + "c15314cf -> 3f4eb310", + "40496b1a -> 3e16b1a0", + "c0031e50 -> 3f7386c0", + "4147faa5 -> 3eff54a0", + "40340ec5 -> 3f503b14", + "41620bc0 -> 3e02f000", + "411132a2 -> 3d995100", + "4124da6a -> 3e9b4d40", + "3f8d1a27 -> 3dd1a270", + "c1606136 -> 3f79eca0", + "c1084ba6 -> 3ef68b40", + "c188f51f -> 3f615c20", + "415b27ba -> 3f327ba0", + "40bbb20f -> 3f5d9078", + "4194ec91 -> 3f1d9220", + "c0b2534c -> 3edacb40", + "c0017627 -> 3f7a2764", + "c19de07c -> 3e87e100", + "c15e5aa0 -> 3dd2b000", + "41556de6 -> 3eadbcc0", + "c0c2f387 -> 3f6863c8", + "c17465ed -> 3f39a130", + "41920545 -> 3e815140", + "c0aa6d54 -> 3f2c9560", + "4195881b -> 3f310360", + "3f317b8f -> 3f317b8f", + "c164ea67 -> 3f315990", + "c1554f3b -> 3f2b0c50", + "410c20f4 -> 3f420f40", + "41214523 -> 3da29180", + "4194b540 -> 3f16a800", + "4030c6ed -> 3f431bb4", + "c16124c6 -> 3f6db3a0", + "40ce6626 -> 3ee66260", + "4184814f -> 3f1029e0", + "3fa715f3 -> 3e9c57cc", + "c14cdf4c -> 3e482d00", + "415ce26a -> 3f4e26a0", + "c001f347 -> 3f7832e4", + "41444ae0 -> 3e895c00", + "c183bea0 -> 3f082c00", + "41482a38 -> 3f02a380", + "413591ce -> 3eb239c0", + "bf03a8d8 -> 3ef8ae50", + "c0aac5af -> 3f29d288", + "c10509cc -> 3f2f6340", + "4128dc61 -> 3f0dc610", + "418b6b9b -> 3edae6c0", + "c14063fb -> 3f79c050", + "c0f08c8c -> 3ef73740", + "4058bdc4 -> 3ec5ee20", + "41975883 -> 3f6b1060", + "c0ede4ff -> 3f10d808", + "3fad766a -> 3eb5d9a8", + "40f514a2 -> 3f28a510", + "c16ea7f6 -> 3dac0500", + "411abb7d -> 3f2bb7d0", + "3f71316e -> 3f71316e", + "c0232dff -> 3ee69008", + "4191635f -> 3e31af80", + "41380d30 -> 3f00d300", + "4063c130 -> 3f0f04c0", + "418142dc -> 3e216e00", + "c19bb73a -> 3f0918c0", + "3e09b51f -> 3e09b51f", + "4198b1f1 -> 3db1f100", + "416ab1c3 -> 3f2b1c30", + "c19a510e -> 3f35de40", + "c17b825b -> 3e8fb4a0", + "c137544a -> 3f0abb60", + "417d3f3b -> 3f53f3b0", + "3e0204c0 -> 3e0204c0", + "c000ec78 -> 3f7c4e20", + "c16a3226 -> 3eb9bb40", + "41869275 -> 3f524ea0", + "c13e2030 -> 3defe800", + "c12bc9e6 -> 3e86c340", + "c048e69f -> 3f5c6584", + "be1d5b31 -> 3f58a934", + "c13950f5 -> 3ed5e160", + "c183da5f -> 3f04b420", + "c1785e25 -> 3ef43b60", + "c081874d -> 3f73c598", + "c074b91f -> 3e346e10", + "c1207505 -> 3f78afb0", + "40b5d16b -> 3f2e8b58", + "41922671 -> 3e899c40", + "c180bc8f -> 3f686e20", + "c0b5d566 -> 3ea2a9a0", + "418a7fa2 -> 3e9fe880", + "409d1ef8 -> 3f68f7c0", + "c0eee5e2 -> 3f08d0f0", + "40240c33 -> 3f1030cc", + "c18a9e6b -> 3f2c32a0", + "419b9d5c -> 3ee75700", + "41046594 -> 3e8cb280", + "c0bfa0d1 -> 3c3e5e00", + "c0524694 -> 3f36e5b0", + "c1601600 -> 3f7ea000", + "c102236c -> 3f5dc940", + "40e686db -> 3e50db60", + "401162db -> 3e8b16d8", + "c0bd4343 -> 3daf2f40", + "c086362a -> 3f4e4eb0", + "41795eab -> 3f15eab0", + "c134d96d -> 3f326930", + "416cc1a0 -> 3f4c1a00", + "403847b7 -> 3f611edc", + "412036ec -> 3c5bb000", + "c13fbf07 -> 3c81f200", + "c054dd57 -> 3f2c8aa4", + "c1258897 -> 3f277690", + "c08c953b -> 3f1b5628", + "c13470f2 -> 3f38f0e0", + "c0dd43da -> 3daf0980", + "3f0a0191 -> 3f0a0191", + "bce32e04 -> 3f78e690", + "40f96783 -> 3f4b3c18", + "416f1838 -> 3f718380", + "c1012232 -> 3f6ddce0", + "40d6ee2b -> 3f377158", + "c0b403d7 -> 3ebfc290", + "c0c7093a -> 3f47b630", + "411bb548 -> 3f3b5480", + "418b8ed0 -> 3ee3b400", + "418d1c9e -> 3f2393c0", + "c15c10e1 -> 3e7bc7c0", + "414f234c -> 3f7234c0", + "4195ea3f -> 3f3d47e0", + "c0e563f9 -> 3f54e038", + "4172c700 -> 3e31c000", + "c17b7632 -> 3e9139c0", + "40997fb5 -> 3f4bfda8", + "418a25d3 -> 3e8974c0", + "c1904c3f -> 3f767820", + "c12c4fee -> 3e6c0480", + "4193fa34 -> 3efe8d00", + "4139f25b -> 3f1f25b0", + "c14f5f62 -> 3d209e00", + "c1913cd7 -> 3f586520", + "c192b507 -> 3f295f20", + "c052d3ba -> 3f34b118", + "c16c5402 -> 3e6aff80", + "41697a40 -> 3f17a400", + "c152203d -> 3f5dfc30", + "c193afc8 -> 3f0a0700", + "415ba8ad -> 3f3a8ad0", + "3f83ec50 -> 3cfb1400", + "c0ae80de -> 3f0bf910", + "c0c461cf -> 3f5cf188", + "41927860 -> 3e9e1800", + "41282c44 -> 3f02c440", + "40845db2 -> 3e0bb640", + "c12dc39f -> 3e0f1840", + "c184c393 -> 3ecf1b40", + "413db030 -> 3f5b0300", + "419726cb -> 3f64d960", + "40b1eb0a -> 3f0f5850", + "c12ca60a -> 3e567d80", + "40650dd2 -> 3f143748", + "416aba4d -> 3f2ba4d0", + "c1434097 -> 3f4bf690", + "c1964839 -> 3e5be380", + "c17a58a0 -> 3eb4ec00", + "4006606a -> 3dcc0d40", + "c186c163 -> 3e1f4e80", + "c0a424f7 -> 3f5ed848" + ] + }, + { + "function": "cycles_sign", + "node": "ShaderNodeMath SIGN", + "cases": [ + "00000000 -> 00000000", + "3f800000 -> 3f800000", + "bf800000 -> bf800000", + "3f000000 -> 3f800000", + "bf000000 -> bf800000", + "40000000 -> 3f800000", + "c0000000 -> bf800000", + "40400000 -> 3f800000", + "c0300000 -> bf800000", + "3dcccccd -> 3f800000", + "bdcccccd -> bf800000", + "40f00000 -> 3f800000", + "c0f00000 -> bf800000", + "33d6bf95 -> 3f800000", + "b3d6bf95 -> bf800000", + "42c80000 -> 3f800000", + "c2c80000 -> bf800000", + "461c4000 -> 3f800000", + "3e99999a -> 3f800000", + "3f333333 -> 3f800000", + "419c6194 -> 3f800000", + "413346cc -> 3f800000", + "c17683ba -> bf800000", + "402bf939 -> 3f800000", + "c17a684b -> bf800000", + "c174704e -> bf800000", + "c0be1c17 -> bf800000", + "4193aff3 -> 3f800000", + "c08cc175 -> bf800000", + "4130ca6e -> 3f800000", + "4153bd92 -> 3f800000", + "411a7e3b -> 3f800000", + "c161d813 -> bf800000", + "4157c1e3 -> 3f800000", + "c1389b7b -> bf800000", + "3febe052 -> 3f800000", + "c1592b1e -> bf800000", + "be12fc23 -> bf800000", + "c0f85eef -> bf800000", + "4180fd50 -> 3f800000", + "414721e1 -> 3f800000", + "40de2fb8 -> 3f800000", + "412447f9 -> 3f800000", + "40bc6b0a -> 3f800000", + "c0592a4b -> bf800000", + "40139f42 -> 3f800000", + "4027e084 -> 3f800000", + "c16fcb18 -> bf800000", + "c10ad838 -> bf800000", + "41953b98 -> 3f800000", + "3f51315c -> 3f800000", + "c197003d -> bf800000", + "419f2b5f -> 3f800000", + "c11e9f31 -> bf800000", + "beeee0cb -> bf800000", + "c185ece4 -> bf800000", + "4171aa4d -> 3f800000", + "c1477312 -> bf800000", + "c0bcd9a0 -> bf800000", + "c1310822 -> bf800000", + "40d007b4 -> 3f800000", + "c1275169 -> bf800000", + "402881d0 -> 3f800000", + "401ca3b8 -> 3f800000", + "bfc80e3c -> bf800000", + "4018f21b -> 3f800000", + "c0d4325d -> bf800000", + "c172fb57 -> bf800000", + "c0a8f08e -> bf800000", + "c00d3d54 -> bf800000", + "3fee0e9a -> 3f800000", + "c14fbcd7 -> bf800000", + "40f97c00 -> 3f800000", + "c121c50b -> bf800000", + "c14ba3d3 -> bf800000", + "40749284 -> 3f800000", + "40d14e27 -> 3f800000", + "41770565 -> 3f800000", + "4172de38 -> 3f800000", + "c10e147e -> bf800000", + "c14be447 -> bf800000", + "c1236e7e -> bf800000", + "c16652af -> bf800000", + "40384653 -> 3f800000", + "c060bced -> bf800000", + "c08a0ce6 -> bf800000", + "4054d36c -> 3f800000", + "40669360 -> 3f800000", + "c09dabb2 -> bf800000", + "40d4bfb0 -> 3f800000", + "40386824 -> 3f800000", + "41910d3c -> 3f800000", + "c055a71a -> bf800000", + "40680d26 -> 3f800000", + "416ada52 -> 3f800000", + "4182abf9 -> 3f800000", + "409bfd5c -> 3f800000", + "416c89e0 -> 3f800000", + "c1628293 -> bf800000", + "c0c642ef -> bf800000", + "4075b4c4 -> 3f800000", + "c18e192f -> bf800000", + "40c9ee43 -> 3f800000", + "c18534ac -> bf800000", + "418ebf1a -> 3f800000", + "c178e189 -> bf800000", + "c05900bc -> bf800000", + "4196a2e2 -> 3f800000", + "412ca6ea -> 3f800000", + "4103c254 -> 3f800000", + "41130711 -> 3f800000", + "412fff68 -> 3f800000", + "3fb55c46 -> 3f800000", + "c0a26522 -> bf800000", + "416cafd1 -> 3f800000", + "bf89fcd8 -> bf800000", + "c13316a4 -> bf800000", + "41231bfe -> 3f800000", + "c183b93e -> bf800000", + "4012122c -> 3f800000", + "4180ccf5 -> 3f800000", + "40f88a0a -> 3f800000", + "41916fb2 -> 3f800000", + "4192eb06 -> 3f800000", + "c10c14c9 -> bf800000", + "c11bae00 -> bf800000", + "c0b7571a -> bf800000", + "3fab7e29 -> 3f800000", + "c16c482e -> bf800000", + "40f8a351 -> 3f800000", + "c0ebd29b -> bf800000", + "3fb06452 -> 3f800000", + "bf098039 -> bf800000", + "418414d7 -> 3f800000", + "bfdc07f9 -> bf800000", + "c18eb363 -> bf800000", + "401674aa -> 3f800000", + "40805070 -> 3f800000", + "c1865945 -> bf800000", + "4082c43d -> 3f800000", + "c199c9ec -> bf800000", + "c13eab06 -> bf800000", + "c19579e4 -> bf800000", + "c11bcda1 -> bf800000", + "41712c09 -> 3f800000", + "417ef40d -> 3f800000", + "416e6efb -> 3f800000", + "412af27d -> 3f800000", + "415944d9 -> 3f800000", + "c1053134 -> bf800000", + "40a06780 -> 3f800000", + "418152e0 -> 3f800000", + "c088cea5 -> bf800000", + "c0dc7cef -> bf800000", + "3f8ad4d4 -> 3f800000", + "414df9cb -> 3f800000", + "41839232 -> 3f800000", + "418a1af9 -> 3f800000", + "4191ce1c -> 3f800000", + "c0456673 -> bf800000", + "c18d8e0a -> bf800000", + "40997d5e -> 3f800000", + "c0b2f708 -> bf800000", + "3fe29bfb -> 3f800000", + "c0cab1e5 -> bf800000", + "41229abf -> 3f800000", + "c027d0ec -> bf800000", + "c0f671f3 -> bf800000", + "4169aca8 -> 3f800000", + "bfad083a -> bf800000", + "bf953e80 -> bf800000", + "c10f16f4 -> bf800000", + "c09de42b -> bf800000", + "c17610a0 -> bf800000", + "3ff27fd4 -> 3f800000", + "c18a2d74 -> bf800000", + "c192cb55 -> bf800000", + "40c73e17 -> 3f800000", + "c1855c7c -> bf800000", + "c18aef65 -> bf800000", + "c004e469 -> bf800000", + "c05d4fd1 -> bf800000", + "c1868113 -> bf800000", + "c16b99cc -> bf800000", + "bf3a94f1 -> bf800000", + "c0e62a2a -> bf800000", + "40645d9c -> 3f800000", + "40ba4bac -> 3f800000", + "3f7d297e -> 3f800000", + "4196d1a6 -> 3f800000", + "403929c3 -> 3f800000", + "c09a1713 -> bf800000", + "418bea2c -> 3f800000", + "3d01e624 -> 3f800000", + "3fccd703 -> 3f800000", + "418168f4 -> 3f800000", + "4005fb1c -> 3f800000", + "419fb679 -> 3f800000", + "c096e61b -> bf800000", + "40a7d150 -> 3f800000", + "bfe521d3 -> bf800000", + "c02051a7 -> bf800000", + "3f3f6d58 -> 3f800000", + "c19ece51 -> bf800000", + "4177cccb -> 3f800000", + "41787116 -> 3f800000", + "c0037ab6 -> bf800000", + "419000e1 -> 3f800000", + "40d0e29e -> 3f800000", + "c05b5540 -> bf800000", + "c1354b0e -> bf800000", + "c196a834 -> bf800000", + "bfef3f5c -> bf800000", + "c19fc4b6 -> bf800000", + "c0fd3540 -> bf800000", + "c16f43d8 -> bf800000", + "4176e690 -> 3f800000", + "402d3cef -> 3f800000", + "c1976692 -> bf800000", + "bd470f6a -> bf800000", + "c1991210 -> bf800000", + "c08e2040 -> bf800000", + "40036c30 -> 3f800000", + "c04cdfd0 -> bf800000", + "4018696b -> 3f800000", + "419ce5ef -> 3f800000", + "4198f0a2 -> 3f800000", + "c19215f4 -> bf800000", + "c0d0d03a -> bf800000", + "c1628dd9 -> bf800000", + "3eda3033 -> 3f800000", + "c19e331f -> bf800000", + "c054919d -> bf800000", + "40962208 -> 3f800000", + "4162a71e -> 3f800000", + "41565344 -> 3f800000", + "4199c1a0 -> 3f800000", + "40481e82 -> 3f800000", + "c01debdc -> bf800000", + "c0b37607 -> bf800000", + "bf947232 -> bf800000", + "4004fe8b -> 3f800000", + "c1853e6b -> bf800000", + "417d0d9a -> 3f800000", + "c13996c2 -> bf800000", + "40cb4c2b -> 3f800000", + "c1771665 -> bf800000", + "40798373 -> 3f800000", + "40cb2d68 -> 3f800000", + "4136cc3e -> 3f800000", + "4026566d -> 3f800000", + "c10bab86 -> bf800000", + "41725ee8 -> 3f800000", + "3f532f31 -> 3f800000", + "419fb031 -> 3f800000", + "410dd4de -> 3f800000", + "413a9cc4 -> 3f800000", + "c11c6e80 -> bf800000", + "4195ac1c -> 3f800000", + "411723c9 -> 3f800000", + "c19aa9f6 -> bf800000", + "bffb34b7 -> bf800000", + "41171894 -> 3f800000", + "41544e54 -> 3f800000", + "c046ba8e -> bf800000", + "bdd1ba63 -> bf800000", + "c0aece7c -> bf800000", + "414cbab9 -> 3f800000", + "c0cf96fd -> bf800000", + "409303d0 -> 3f800000", + "c14ec938 -> bf800000", + "416621b2 -> 3f800000", + "c00a6549 -> bf800000", + "c0edca78 -> bf800000", + "c170f295 -> bf800000", + "4199d93c -> 3f800000", + "413d6b97 -> 3f800000", + "c19ee15c -> bf800000", + "c0d0c86c -> bf800000", + "3fc4b18a -> 3f800000", + "c0ee77af -> bf800000", + "c195dd85 -> bf800000", + "c01e90ba -> bf800000", + "4186d9a5 -> 3f800000", + "c1890324 -> bf800000", + "4155aa89 -> 3f800000", + "c170b634 -> bf800000", + "415d4201 -> 3f800000", + "418dbd2b -> 3f800000", + "417314a5 -> 3f800000", + "40c211ce -> 3f800000", + "40bd6c84 -> 3f800000", + "c0ae57c3 -> bf800000", + "40360470 -> 3f800000", + "c086f184 -> bf800000", + "c198eab0 -> bf800000", + "40f9a6f6 -> 3f800000", + "c0b10062 -> bf800000", + "4099f5a6 -> 3f800000", + "40fda609 -> 3f800000", + "c06be6d2 -> bf800000", + "4112d58e -> 3f800000", + "405e0764 -> 3f800000", + "c1748c72 -> bf800000", + "40672939 -> 3f800000", + "40c47105 -> 3f800000", + "c0cefa96 -> bf800000", + "3e29e7b2 -> 3f800000", + "c19377ed -> bf800000", + "c13d8e0e -> bf800000", + "c18e9fc6 -> bf800000", + "c18f906f -> bf800000", + "415a671d -> 3f800000", + "bf0fa1b8 -> bf800000", + "4164730f -> 3f800000", + "40bb75eb -> 3f800000", + "4146712e -> 3f800000", + "4060a749 -> 3f800000", + "4137eb57 -> 3f800000", + "c017f4d2 -> bf800000", + "41968932 -> 3f800000", + "41506fd4 -> 3f800000", + "c0fbabac -> bf800000", + "c1583e07 -> bf800000", + "417442ef -> 3f800000", + "417c5afb -> 3f800000", + "418f2429 -> 3f800000", + "3fbbb1a8 -> 3f800000", + "40981a0a -> 3f800000", + "c191fae7 -> bf800000", + "4189d307 -> 3f800000", + "41849ee6 -> 3f800000", + "3e949429 -> 3f800000", + "c0e24bc6 -> bf800000", + "be3bd3d6 -> bf800000", + "c18b9419 -> bf800000", + "3f86a591 -> 3f800000", + "c0e8d593 -> bf800000", + "bfe78fe3 -> bf800000", + "c15f8512 -> bf800000", + "412b6f8c -> 3f800000", + "c181f390 -> bf800000", + "3f53d803 -> 3f800000", + "410cb010 -> 3f800000", + "c18e2638 -> bf800000", + "c0ee8857 -> bf800000", + "40199aff -> 3f800000", + "4052c9dd -> 3f800000", + "c1642ccc -> bf800000", + "41853b71 -> 3f800000", + "c14d3aba -> bf800000", + "410e7a1e -> 3f800000", + "c0b6bad1 -> bf800000", + "c1927f6d -> bf800000", + "418d5212 -> 3f800000", + "c1980057 -> bf800000", + "418a2dec -> 3f800000", + "c113d9ee -> bf800000", + "41885ae8 -> 3f800000", + "c143547e -> bf800000", + "3fad6cd6 -> 3f800000", + "41534f4e -> 3f800000", + "c1600818 -> bf800000", + "41367506 -> 3f800000", + "c05cde2a -> bf800000", + "41943d10 -> 3f800000", + "40f9a651 -> 3f800000", + "c0774462 -> bf800000", + "40f8cba2 -> 3f800000", + "c1621461 -> bf800000", + "c194fdae -> bf800000", + "c184a87b -> bf800000", + "c158dec2 -> bf800000", + "402ff3e8 -> 3f800000", + "c07b302c -> bf800000", + "c1971464 -> bf800000", + "c13767bd -> bf800000", + "c0d01ee8 -> bf800000", + "40d05e89 -> 3f800000", + "c0a1742b -> bf800000", + "be5865e4 -> bf800000", + "4188ec68 -> 3f800000", + "c011fdb1 -> bf800000", + "4192f4fc -> 3f800000", + "c10ffb4d -> bf800000", + "c16be912 -> bf800000", + "40fa89a2 -> 3f800000", + "41724663 -> 3f800000", + "4040a3ee -> 3f800000", + "c18b18ae -> bf800000", + "400c5046 -> 3f800000", + "c194f141 -> bf800000", + "c16e3b0b -> bf800000", + "40b31f0e -> 3f800000", + "c0b88b38 -> bf800000", + "c19394bf -> bf800000", + "415cd8e4 -> 3f800000", + "c157e944 -> bf800000", + "410e2230 -> 3f800000", + "4197f1e1 -> 3f800000", + "3d2f85fa -> 3f800000", + "412c28b5 -> 3f800000", + "40abba25 -> 3f800000", + "419ea7b1 -> 3f800000", + "c12fea78 -> bf800000", + "4143996b -> 3f800000", + "c1591633 -> bf800000", + "c1881edb -> bf800000", + "3f69449f -> 3f800000", + "c18f134a -> bf800000", + "c188b244 -> bf800000", + "c0601548 -> bf800000", + "c16289d0 -> bf800000", + "bf22395e -> bf800000", + "4154695c -> 3f800000", + "418f6cdb -> 3f800000", + "c076ea2f -> bf800000", + "40a87825 -> 3f800000", + "3f83bd3b -> 3f800000", + "41961d04 -> 3f800000", + "418a845f -> 3f800000", + "c1527063 -> bf800000", + "414b5fbb -> 3f800000", + "4105feb3 -> 3f800000", + "41350ef9 -> 3f800000", + "c1698863 -> bf800000", + "bfa93b02 -> bf800000", + "41216982 -> 3f800000", + "c14e5b54 -> bf800000", + "c07dfc91 -> bf800000", + "c05db46d -> bf800000", + "400d57d6 -> 3f800000", + "c12c5f5f -> bf800000", + "41591093 -> 3f800000", + "c111b998 -> bf800000", + "c10dcd5f -> bf800000", + "417d46e0 -> 3f800000", + "408f3ff6 -> 3f800000", + "c17bfefa -> bf800000", + "3e640074 -> 3f800000", + "400f2392 -> 3f800000", + "40d2a33e -> 3f800000", + "419c77fd -> 3f800000", + "c122ca5d -> bf800000", + "412c2e42 -> 3f800000", + "40de5e3f -> 3f800000", + "c15135c6 -> bf800000", + "402a71a1 -> 3f800000", + "bf5518b7 -> bf800000", + "41032bb2 -> 3f800000", + "c001f965 -> bf800000", + "c19fe65b -> bf800000", + "c0b6cb78 -> bf800000", + "c118d780 -> bf800000", + "40c5b505 -> 3f800000", + "414f0383 -> 3f800000", + "40e69338 -> 3f800000", + "c04ba9d2 -> bf800000", + "4083b180 -> 3f800000", + "bfa30e0a -> bf800000", + "c0c8b381 -> bf800000", + "c19ee922 -> bf800000", + "400bf4cd -> 3f800000", + "c1075507 -> bf800000", + "c10ceae8 -> bf800000", + "c16925a3 -> bf800000", + "c1873266 -> bf800000", + "410373bf -> 3f800000", + "c1788523 -> bf800000", + "40a9afd2 -> 3f800000", + "41225805 -> 3f800000", + "40aa53cd -> 3f800000", + "c194c050 -> bf800000", + "41386f46 -> 3f800000", + "c18fcd6b -> bf800000", + "c06de028 -> bf800000", + "c0ea3ee9 -> bf800000", + "c169a5e1 -> bf800000", + "c1839001 -> bf800000", + "c111d479 -> bf800000", + "41716134 -> 3f800000", + "41897b5c -> 3f800000", + "40e2ca0b -> 3f800000", + "c121e1f3 -> bf800000", + "413722d6 -> 3f800000", + "41900222 -> 3f800000", + "c0b550ef -> bf800000", + "c19ec6ca -> bf800000", + "c100a43f -> bf800000", + "4062a8c9 -> 3f800000", + "408d3ffc -> 3f800000", + "416175c8 -> 3f800000", + "4115b9b3 -> 3f800000", + "4186393a -> 3f800000", + "c15f451f -> bf800000", + "c0a59944 -> bf800000", + "40d9bf52 -> 3f800000", + "c1627ee7 -> bf800000", + "408d3821 -> 3f800000", + "4192e2c1 -> 3f800000", + "4087e48c -> 3f800000", + "41824714 -> 3f800000", + "c115b054 -> bf800000", + "4190cfd8 -> 3f800000", + "41937724 -> 3f800000", + "bfa46fc2 -> bf800000", + "416041b2 -> 3f800000", + "4189bc98 -> 3f800000", + "c07a708b -> bf800000", + "417eebb1 -> 3f800000", + "4150f76c -> 3f800000", + "c1894bb4 -> bf800000", + "414a8a7e -> 3f800000", + "bf11543d -> bf800000", + "40e13645 -> 3f800000", + "40f09281 -> 3f800000", + "412b3c20 -> 3f800000", + "c0e3b504 -> bf800000", + "c0f48c7f -> bf800000", + "40c97e4f -> 3f800000", + "416cc4de -> 3f800000", + "419064a7 -> 3f800000", + "c0cb930f -> bf800000", + "40987d3d -> 3f800000", + "c0e2a898 -> bf800000", + "414fab14 -> 3f800000", + "4044a506 -> 3f800000", + "c1682c67 -> bf800000", + "bf90004e -> bf800000", + "c18a6be9 -> bf800000", + "c17147ff -> bf800000", + "4170d583 -> 3f800000", + "417a5394 -> 3f800000", + "40db9d2c -> 3f800000", + "408c0d73 -> 3f800000", + "c1816011 -> bf800000", + "c1912d5a -> bf800000", + "412d8536 -> 3f800000", + "3f923e13 -> 3f800000", + "418b1cf4 -> 3f800000", + "40a2a1d3 -> 3f800000", + "4071f49b -> 3f800000", + "c1041750 -> bf800000", + "41826348 -> 3f800000", + "c140271f -> bf800000", + "41989834 -> 3f800000", + "bf3779f1 -> bf800000", + "bf71760a -> bf800000", + "4107753a -> 3f800000", + "bd360004 -> bf800000", + "40a41e33 -> 3f800000", + "3f81bdc5 -> 3f800000", + "c1805a36 -> bf800000", + "c152f767 -> bf800000", + "c1870d05 -> bf800000", + "be465ce9 -> bf800000", + "41286f16 -> 3f800000", + "c18b662c -> bf800000", + "3fc022ed -> 3f800000", + "c18da35a -> bf800000", + "c11fd902 -> bf800000", + "3f428755 -> 3f800000", + "c19c721b -> bf800000", + "c0a0d108 -> bf800000", + "beb1b0ec -> bf800000", + "c13ef3a0 -> bf800000", + "c0e2e50f -> bf800000", + "4185b10b -> 3f800000", + "c0d7914d -> bf800000", + "c13dfbf2 -> bf800000", + "40f889b4 -> 3f800000", + "c1444916 -> bf800000", + "bf1cae0c -> bf800000", + "418a17b3 -> 3f800000", + "416c5a32 -> 3f800000", + "418fe5c6 -> 3f800000", + "c179e879 -> bf800000", + "419e3b08 -> 3f800000", + "c1245942 -> bf800000", + "c0c2e688 -> bf800000", + "414888cd -> 3f800000", + "c0110a50 -> bf800000", + "41966b50 -> 3f800000", + "c19d774a -> bf800000", + "c181d247 -> bf800000", + "3fe575a8 -> 3f800000", + "c15835b4 -> bf800000", + "c14f0d84 -> bf800000", + "bf1ef449 -> bf800000", + "c139ce02 -> bf800000", + "c11f4c17 -> bf800000", + "c16c31a2 -> bf800000", + "c040702d -> bf800000", + "c117103b -> bf800000", + "c0b5e99b -> bf800000", + "c181dad6 -> bf800000", + "c19df50b -> bf800000", + "c19f7c03 -> bf800000", + "400e8646 -> 3f800000", + "c1104711 -> bf800000", + "c07833f7 -> bf800000", + "4082a965 -> 3f800000", + "40b8d733 -> 3f800000", + "414ca29a -> 3f800000", + "c12b3e4b -> bf800000", + "c1974338 -> bf800000", + "c1508b3f -> bf800000", + "c0224afa -> bf800000", + "c0557e5e -> bf800000", + "c1339f17 -> bf800000", + "40824cab -> 3f800000", + "41976aff -> 3f800000", + "c13a5e61 -> bf800000", + "c1803060 -> bf800000", + "412c527b -> 3f800000", + "c11ad3e8 -> bf800000", + "c1824f7e -> bf800000", + "c1445273 -> bf800000", + "c11fccda -> bf800000", + "3f10f7f2 -> 3f800000", + "c09b6768 -> bf800000", + "c190a415 -> bf800000", + "c19eb0d7 -> bf800000", + "4107177d -> 3f800000", + "c1205fc7 -> bf800000", + "c1912248 -> bf800000", + "c1874a2c -> bf800000", + "c021a1ae -> bf800000", + "410ac60b -> 3f800000", + "c1812a59 -> bf800000", + "417acf32 -> 3f800000", + "4174651c -> 3f800000", + "41912863 -> 3f800000", + "3fc21164 -> 3f800000", + "bf0d416d -> bf800000", + "40aabdb4 -> 3f800000", + "4101b0fc -> 3f800000", + "c18b7b24 -> bf800000", + "c0e97e0b -> bf800000", + "c133d0e2 -> bf800000", + "c053e023 -> bf800000", + "c18b88e2 -> bf800000", + "41097c9c -> 3f800000", + "c127258d -> bf800000", + "c0c273e4 -> bf800000", + "417de3d4 -> 3f800000", + "c0825c5b -> bf800000", + "c1477abc -> bf800000", + "41921d06 -> 3f800000", + "405ea775 -> 3f800000", + "c10e60cc -> bf800000", + "bb8daa56 -> bf800000", + "40e28ffc -> 3f800000", + "c03aea4f -> bf800000", + "418bfb64 -> 3f800000", + "41312ccd -> 3f800000", + "4196524c -> 3f800000", + "c16986a2 -> bf800000", + "c04ff93e -> bf800000", + "3f2fb446 -> 3f800000", + "40fe91c0 -> 3f800000", + "c0e6c88a -> bf800000", + "bf95bf50 -> bf800000", + "c0e48c4c -> bf800000", + "3ea74f0f -> 3f800000", + "4180f9f5 -> 3f800000", + "40a49bb7 -> 3f800000", + "4050d1ab -> 3f800000", + "4168cce6 -> 3f800000", + "4083e87c -> 3f800000", + "4149b07e -> 3f800000", + "c12d18d4 -> bf800000", + "41584a68 -> 3f800000", + "41342707 -> 3f800000", + "4141fc3e -> 3f800000", + "bf0bf911 -> bf800000", + "c16822f9 -> bf800000", + "c1020329 -> bf800000", + "41923406 -> 3f800000", + "4071e9a3 -> 3f800000", + "c131a2f5 -> bf800000", + "c0bff8ef -> bf800000", + "4089cc10 -> 3f800000", + "40fca5c9 -> 3f800000", + "419cea62 -> 3f800000", + "4112d3b6 -> 3f800000", + "c186f2ce -> bf800000", + "41269b40 -> 3f800000", + "c1805d23 -> bf800000", + "4148013f -> 3f800000", + "c06dae56 -> bf800000", + "c0005a46 -> bf800000", + "414304b1 -> 3f800000", + "400b2d95 -> 3f800000", + "415fa80d -> 3f800000", + "c1828203 -> bf800000", + "c143d709 -> bf800000", + "c19f5b68 -> bf800000", + "41341137 -> 3f800000", + "bfe09897 -> bf800000", + "c19a75d3 -> bf800000", + "41641dad -> 3f800000", + "40e8775a -> 3f800000", + "419d02c3 -> 3f800000", + "c1025103 -> bf800000", + "417a34e2 -> 3f800000", + "c186fbdb -> bf800000", + "c114d53e -> bf800000", + "4089df45 -> 3f800000", + "41799e22 -> 3f800000", + "41626e3f -> 3f800000", + "4186ab73 -> 3f800000", + "419ce058 -> 3f800000", + "c1962e5d -> bf800000", + "bf6d75e6 -> bf800000", + "c1601113 -> bf800000", + "c0fbeec6 -> bf800000", + "c17a3868 -> bf800000", + "416da605 -> 3f800000", + "4187cc47 -> 3f800000", + "406ae42a -> 3f800000", + "410a313f -> 3f800000", + "c13acf3e -> bf800000", + "4173959a -> 3f800000", + "be9694ac -> bf800000", + "c0f350ed -> bf800000", + "4180369e -> 3f800000", + "418c88d7 -> 3f800000", + "419e4ac9 -> 3f800000", + "4157db41 -> 3f800000", + "4194aab7 -> 3f800000", + "41773059 -> 3f800000", + "c100c8d4 -> bf800000", + "4103ec90 -> 3f800000", + "c186d133 -> bf800000", + "bf46912c -> bf800000", + "418c1307 -> 3f800000", + "c05f593b -> bf800000", + "bfab6a66 -> bf800000", + "c0cacd18 -> bf800000", + "40c94072 -> 3f800000", + "41751639 -> 3f800000", + "c06e1de1 -> bf800000", + "c180f3c4 -> bf800000", + "c1867999 -> bf800000", + "c1552757 -> bf800000", + "c1994627 -> bf800000", + "412020fe -> 3f800000", + "3fdf7c88 -> 3f800000", + "4192b8ae -> 3f800000", + "c18916a4 -> bf800000", + "412d2220 -> 3f800000", + "c19ad496 -> bf800000", + "41217475 -> 3f800000", + "40e2bdf7 -> 3f800000", + "407ad9c1 -> 3f800000", + "4017cbdf -> 3f800000", + "c00e63d0 -> bf800000", + "411df7c6 -> 3f800000", + "c191a354 -> bf800000", + "c0555da2 -> bf800000", + "c06e8930 -> bf800000", + "bfaf8742 -> bf800000", + "41871104 -> 3f800000", + "419a7306 -> 3f800000", + "c109ed40 -> bf800000", + "bffeae62 -> bf800000", + "3e90073d -> 3f800000", + "41136b3f -> 3f800000", + "c1944875 -> bf800000", + "41565c12 -> 3f800000", + "4108ffd7 -> 3f800000", + "c17d6c05 -> bf800000", + "c16bdecc -> bf800000", + "c198ac07 -> bf800000", + "c020ba23 -> bf800000", + "417bbf3f -> 3f800000", + "c0d913c3 -> bf800000", + "418a8335 -> 3f800000", + "c195ccc0 -> bf800000", + "c1989a6d -> bf800000", + "3ebb622b -> 3f800000", + "3fe0734a -> 3f800000", + "3f8231e0 -> 3f800000", + "40700c8b -> 3f800000", + "41832a0b -> 3f800000", + "41123bca -> 3f800000", + "41263a8e -> 3f800000", + "c161c9e7 -> bf800000", + "41832741 -> 3f800000", + "414a74df -> 3f800000", + "c13b5de3 -> bf800000", + "c15f7aaa -> bf800000", + "c15662a9 -> bf800000", + "c11f0400 -> bf800000", + "406ebfb7 -> 3f800000", + "408b099b -> 3f800000", + "40a7e657 -> 3f800000", + "419e1d15 -> 3f800000", + "4184ef67 -> 3f800000", + "c0a6b6be -> bf800000", + "c16ebed4 -> bf800000", + "407efbab -> 3f800000", + "c0a278ff -> bf800000", + "40977f7f -> 3f800000", + "414834dd -> 3f800000", + "c122ae43 -> bf800000", + "4131fa77 -> 3f800000", + "4092579a -> 3f800000", + "c185c4a3 -> bf800000", + "4197bf16 -> 3f800000", + "c1841fb4 -> bf800000", + "c166ea02 -> bf800000", + "41626e27 -> 3f800000", + "405028bb -> 3f800000", + "40faf222 -> 3f800000", + "c13d440a -> bf800000", + "c10a444b -> bf800000", + "4162a628 -> 3f800000", + "c1124e56 -> bf800000", + "409b5587 -> 3f800000", + "c19d316c -> bf800000", + "c19f1446 -> bf800000", + "c19671fd -> bf800000", + "c1900d76 -> bf800000", + "c162f0cd -> bf800000", + "c0be543c -> bf800000", + "40f396d2 -> 3f800000", + "c180ddda -> bf800000", + "3e5e1409 -> 3f800000", + "4128ce8e -> 3f800000", + "3f03e89c -> 3f800000", + "412102bf -> 3f800000", + "c1313e43 -> bf800000", + "c18fb618 -> bf800000", + "c184ac2a -> bf800000", + "4197da10 -> 3f800000", + "c08048c8 -> bf800000", + "411a2bc1 -> 3f800000", + "c1781723 -> bf800000", + "4157ec31 -> 3f800000", + "c11c53e3 -> bf800000", + "4161d189 -> 3f800000", + "c18c7e8c -> bf800000", + "c17db946 -> bf800000", + "4167f9b1 -> 3f800000", + "c18df452 -> bf800000", + "4137ab2f -> 3f800000", + "c002907a -> bf800000", + "41867cf3 -> 3f800000", + "c1951b1b -> bf800000", + "c108e274 -> bf800000", + "4119ae31 -> 3f800000", + "c19c2a23 -> bf800000", + "417f3e56 -> 3f800000", + "c172a9a0 -> bf800000", + "418b6de2 -> 3f800000", + "c0efc7da -> bf800000", + "4185e658 -> 3f800000", + "3d570992 -> 3f800000", + "c0b74378 -> bf800000", + "c08a1c40 -> bf800000", + "4178ea32 -> 3f800000", + "418401bd -> 3f800000", + "40bf9207 -> 3f800000", + "c180c9df -> bf800000", + "c181c132 -> bf800000", + "400125d1 -> 3f800000", + "c10cac1f -> bf800000", + "40893bac -> 3f800000", + "c11d21c4 -> bf800000", + "40a57e1c -> 3f800000", + "bfa7e06b -> bf800000", + "3ffd9285 -> 3f800000", + "c16824c4 -> bf800000", + "41570ab9 -> 3f800000", + "402a2433 -> 3f800000", + "c1329ffa -> bf800000", + "bf4cf312 -> bf800000", + "c08f023c -> bf800000", + "401945e9 -> 3f800000", + "4160b717 -> 3f800000", + "4088a290 -> 3f800000", + "c086dedf -> bf800000", + "4197c5b9 -> 3f800000", + "c11832e5 -> bf800000", + "c17fdcfa -> bf800000", + "c0d93c50 -> bf800000", + "3f484c75 -> 3f800000", + "3f180415 -> 3f800000", + "411c5850 -> 3f800000", + "415748df -> 3f800000", + "c0697711 -> bf800000", + "c18c4e97 -> bf800000", + "415a8ea1 -> 3f800000", + "417a0e89 -> 3f800000", + "4156fc57 -> 3f800000", + "c139f054 -> bf800000", + "bfbe914f -> bf800000", + "41974e9a -> 3f800000", + "c1936dde -> bf800000", + "c0b0c98c -> bf800000", + "414e8466 -> 3f800000", + "c02f170c -> bf800000", + "409873d6 -> 3f800000", + "c19b8ee0 -> bf800000", + "4197b00f -> 3f800000", + "4135939d -> 3f800000", + "c18ff1db -> bf800000", + "c10e48b8 -> bf800000", + "40f84faf -> 3f800000", + "c0fb6baf -> bf800000", + "c1844f73 -> bf800000", + "419b6e65 -> 3f800000", + "c0b00668 -> bf800000", + "40591848 -> 3f800000", + "41863835 -> 3f800000", + "4177682d -> 3f800000", + "c0956675 -> bf800000", + "40184cbf -> 3f800000", + "c0a73603 -> bf800000", + "40bd560c -> 3f800000", + "c1210045 -> bf800000", + "c01cbeb5 -> bf800000", + "40aeb301 -> 3f800000", + "414e1976 -> 3f800000", + "4042fef1 -> 3f800000", + "4028cb73 -> 3f800000", + "405d7b88 -> 3f800000", + "c0b43259 -> bf800000", + "c1842e4d -> bf800000", + "c177fc69 -> bf800000", + "c00e9b76 -> bf800000", + "c14ab1b2 -> bf800000", + "c08e4b52 -> bf800000", + "40c90f25 -> 3f800000", + "40a5fcec -> 3f800000", + "bfbea3df -> bf800000", + "41566165 -> 3f800000", + "c097a633 -> bf800000", + "c084a659 -> bf800000", + "bffff7aa -> bf800000", + "c174c80c -> bf800000", + "c115cc51 -> bf800000", + "415181be -> 3f800000", + "4138ca08 -> 3f800000", + "402244ee -> 3f800000", + "c13d6699 -> bf800000", + "413df3c6 -> 3f800000", + "c1234dd3 -> bf800000", + "414ed2c6 -> 3f800000", + "41756250 -> 3f800000", + "416371e1 -> 3f800000", + "c01ce0da -> bf800000", + "c19fe20b -> bf800000", + "4166e465 -> 3f800000", + "c060b301 -> bf800000", + "bf268ebb -> bf800000", + "412be9eb -> 3f800000", + "c1876284 -> bf800000", + "c0b07cd4 -> bf800000", + "c1896f19 -> bf800000", + "c199aceb -> bf800000", + "c114cc71 -> bf800000", + "41596d77 -> 3f800000", + "4137e193 -> 3f800000", + "c1513b0b -> bf800000", + "4181ae3c -> 3f800000", + "418c034c -> 3f800000", + "c0b9aafb -> bf800000", + "c1445844 -> bf800000", + "c18ea20b -> bf800000", + "3fa7ff24 -> 3f800000", + "c1229101 -> bf800000", + "c0d1330c -> bf800000", + "416b838c -> 3f800000", + "bf863a15 -> bf800000", + "c02d2981 -> bf800000", + "4190686f -> 3f800000", + "c127ec49 -> bf800000", + "c179f554 -> bf800000", + "3f883b96 -> 3f800000", + "40f84211 -> 3f800000", + "c13a7d9a -> bf800000", + "418f9db5 -> 3f800000", + "41852a0b -> 3f800000", + "4182df2b -> 3f800000", + "c0db08a1 -> bf800000", + "3ecbe970 -> 3f800000", + "3fa76f09 -> 3f800000", + "41992700 -> 3f800000", + "3fe66767 -> 3f800000", + "40e694e9 -> 3f800000", + "c1394131 -> bf800000", + "3f927b00 -> 3f800000", + "c1601c9f -> bf800000", + "40a2d319 -> 3f800000", + "c0256e18 -> bf800000", + "3e4b3bfd -> 3f800000", + "c0cd79d7 -> bf800000", + "41855c7d -> 3f800000", + "c1843dc9 -> bf800000", + "4188372e -> 3f800000", + "c0049bfb -> bf800000", + "41785fb9 -> 3f800000", + "4087bfe2 -> 3f800000", + "c0f494e2 -> bf800000", + "c125ba1b -> bf800000", + "c17abcde -> bf800000", + "c19b2b29 -> bf800000", + "41223dac -> 3f800000", + "418a1e25 -> 3f800000", + "40f75c43 -> 3f800000", + "c18f8317 -> bf800000", + "4180f0bf -> 3f800000", + "3fd74895 -> 3f800000", + "c091219d -> bf800000", + "413d56c5 -> 3f800000", + "41296725 -> 3f800000", + "4146f8ca -> 3f800000", + "416f8e49 -> 3f800000", + "41669a2c -> 3f800000", + "c0bc2df7 -> bf800000", + "411c0a5f -> 3f800000" + ] + }, + { + "function": "cycles_arcsine", + "node": "ShaderNodeMath ARCSINE", + "cases": [ + "00000000 -> 00000000", + "3f800000 -> 3fc90fdb", + "bf800000 -> bfc90fdb", + "3f000000 -> 3f060a92", + "bf000000 -> bf060a92", + "40000000 -> 3fc90fdb", + "c0000000 -> bfc90fdb", + "40400000 -> 3fc90fdb", + "c0300000 -> bfc90fdb", + "3dcccccd -> 3dcd2494", + "bdcccccd -> bdcd2494", + "40f00000 -> 3fc90fdb", + "c0f00000 -> bfc90fdb", + "33d6bf95 -> 33d6bf95", + "b3d6bf95 -> b3d6bf95", + "42c80000 -> 3fc90fdb", + "c2c80000 -> bfc90fdb", + "461c4000 -> 3fc90fdb", + "3e99999a -> 3e9c00ad", + "3f333333 -> 3f468073", + "3fbc775c -> 3fc90fdb", + "3e9da747 -> 3ea041e5", + "bf0f7d62 -> bf1851c7", + "bc308cb4 -> bc308d94", + "3f81b336 -> 3fc90fdb", + "bfbdbbc4 -> bfc90fdb", + "bf9d3d84 -> bfc90fdb", + "bedd6996 -> bee4f7ec", + "3e52d511 -> 3e5459dc", + "3f3f93eb -> 3f58776c", + "3f32a062 -> 3f45b32e", + "3c7c9c77 -> 3c7c9f07", + "bf09fa0c -> bf11b820", + "3f21f67b -> 3f2f5bac", + "beeb868b -> bef4bd64", + "3f7c8cfc -> 3fb406b4", + "3f3255e1 -> 3f454b41", + "befea014 -> bf053f92", + "bedc8f8b -> bee40634", + "bf8a19aa -> bfc90fdb", + "3f305efe -> 3f4291e5", + "3e2abd78 -> 3e2b8a94", + "bea4a8ff -> bea7a3b0", + "3f1bd222 -> 3f278615", + "39a00b14 -> 39a00b14", + "3e81e5b3 -> 3e83552f", + "3f69abf4 -> 3f93347e", + "3f80cab7 -> 3fc90fdb", + "3f4dd9af -> 3f6f256c", + "3ec92b20 -> 3ecebdad", + "3fb9ce6c -> 3fc90fdb", + "3f532685 -> 3f7848bd", + "3f6025b4 -> 3f88872f", + "3fbfafaa -> 3fc90fdb", + "bf8244e5 -> bfc90fdb", + "bfa2821c -> bfc90fdb", + "bedc96e9 -> bee40e5e", + "bfbc31b3 -> bfc90fdb", + "3f9f357b -> 3fc90fdb", + "bd44cd67 -> bd44e0cf", + "3fb8a4fe -> 3fc90fdb", + "bf551d33 -> bf7bcaca", + "3fa9bb30 -> 3fc90fdb", + "3f4cc8e6 -> 3f6d5cb8", + "bfaef365 -> bfc90fdb", + "bf0a7db3 -> bf12548b", + "3f46a367 -> 3f636060", + "bdb13f7f -> bdb17856", + "bf9b0a51 -> bfc90fdb", + "3ec01087 -> 3ec4e17c", + "3dc8aab6 -> 3dc8fd44", + "3f87c2d9 -> 3fc90fdb", + "3f5b56b8 -> 3f83b6cc", + "bdc7cbb1 -> bdc81d2c", + "bed525a0 -> bedbd70d", + "3ec0709a -> 3ec54924", + "3f4cef74 -> 3f6d9d02", + "bf2cf71b -> bf3de93a", + "3d42d902 -> 3d42ebd7", + "3f628deb -> 3f8b10b0", + "3faf4f42 -> 3fc90fdb", + "3f2e459f -> 3f3fb06d", + "3f86a808 -> 3fc90fdb", + "3f23490f -> 3f311213", + "bf183348 -> bf22fdbb", + "bfb45721 -> bfc90fdb", + "3f82b3ae -> 3fc90fdb", + "bfb41430 -> bfc90fdb", + "3e8f13eb -> 3e910237", + "3fa0142b -> 3fc90fdb", + "3f778bfb -> 3fa813aa", + "bf822156 -> bfc90fdb", + "3f1a7740 -> 3f25d1fe", + "3f242ccf -> 3f323a57", + "3fbdb8cf -> 3fc90fdb", + "3f78eb39 -> 3faae2c4", + "bdc8f21e -> bdc94504", + "3c376867 -> 3c376962", + "bf25fa8f -> bf34967a", + "be9b76e3 -> be9df54f", + "bf882f37 -> bfc90fdb", + "3f9bbd2d -> 3fc90fdb", + "3f941da2 -> 3fc90fdb", + "3e9cdf2b -> 3e9f6f9e", + "bf91df6c -> bfc90fdb", + "3fa0c4fd -> 3fc90fdb", + "3f845ab2 -> 3fc90fdb", + "bf803c37 -> bfc90fdb", + "bfbc5d74 -> bfc90fdb", + "3f87d515 -> 3fc90fdb", + "bfb9bcfd -> bfc90fdb", + "3f36dec6 -> 3f4bb16a", + "be6452da -> be664259", + "3dcb54cf -> 3dcbaab5", + "bf1ec2cb -> bf2b4012", + "3e2702ee -> 3e27c2c9", + "bf90d371 -> bfc90fdb", + "bf4bbac5 -> bf6b9c9a", + "bf22301d -> bf2fa620", + "bf7552ca -> bfa3f6f0", + "3fa6e0cd -> 3fc90fdb", + "3f0824d5 -> 3f0f8c94", + "bf72053f -> bf9e90e6", + "3f6fab01 -> 3f9b17e4", + "bf39145a -> bf4edec9", + "be9a7694 -> be9ce863", + "3faf70c7 -> 3fc90fdb", + "3f95575c -> 3fc90fdb", + "bf984a70 -> bfc90fdb", + "bf89f276 -> bfc90fdb", + "3f8f5838 -> 3fc90fdb", + "3f44b7f4 -> 3f605ae8", + "bf30cc7e -> bf432922", + "3f9573c3 -> 3fc90fdb", + "bd0be64e -> bd0bed46", + "3fb15c0d -> 3fc90fdb", + "3f84c261 -> 3fc90fdb", + "bf958d3a -> bfc90fdb", + "bf57bfac -> bf804ed6", + "3f706640 -> 3f9c253a", + "3ed3b9ac -> 3eda470a", + "bfa531f9 -> bfc90fdb", + "3f253b0c -> 3f339b57", + "bfa4cf83 -> bfc90fdb", + "bef8eea5 -> bf01faa8", + "bf0897e8 -> bf10148d", + "bf88fd53 -> bfc90fdb", + "bf6c0c8a -> bf963182", + "bf55901f -> bf7c9ab4", + "3f222823 -> 3f2f9bd1", + "3faf0285 -> 3fc90fdb", + "bf674668 -> bf9057ae", + "3e35f12b -> 3e36e9c9", + "3e48a17f -> 3e49efeb", + "bf8c13c0 -> bfc90fdb", + "bf783d8e -> bfa97762", + "3de75ba3 -> 3de7da57", + "3f389942 -> 3f4e2cde", + "be55277e -> be56b973", + "3f7bcddb -> 3fb1daf8", + "bfb1e178 -> bfc90fdb", + "3e100317 -> 3e107db7", + "3e9d461f -> 3e9fdbca", + "3f8540aa -> 3fc90fdb", + "3f6ba7c1 -> 3f95afeb", + "3f6734b2 -> 3f90430a", + "bf808f78 -> bfc90fdb", + "3fa113ed -> 3fc90fdb", + "3edb2910 -> 3ee27943", + "bec0b4dc -> bec592cf", + "3fb24bf9 -> 3fc90fdb", + "3f3daa2a -> 3f5599af", + "bfbed5f1 -> bfc90fdb", + "3ebf4934 -> 3ec40a87", + "3f5963e9 -> 3f81d8e9", + "3f9af8fb -> 3fc90fdb", + "3e953759 -> 3e9769e0", + "3edd07d0 -> 3ee48b82", + "bf810073 -> bfc90fdb", + "3f832759 -> 3fc90fdb", + "3f6f5dc3 -> 3f9aaa7e", + "bf258e2f -> bf340842", + "bfb8e37f -> bfc90fdb", + "bf797333 -> bfac0b71", + "3fbca4d9 -> 3fc90fdb", + "3f8c1082 -> 3fc90fdb", + "befac25f -> bf030696", + "3c09275a -> 3c0927c3", + "3f7a583a -> 3fae1b65", + "bfab2637 -> bfc90fdb", + "bf6ac14f -> bf948c0b", + "bf91b156 -> bfc90fdb", + "3f760f8e -> 3fa546fc", + "be6fb50e -> be71f3c9", + "3fa757cf -> 3fc90fdb", + "bf94f53f -> bfc90fdb", + "3fb0ee95 -> 3fc90fdb", + "3fb13c16 -> 3fc90fdb", + "bf20c745 -> bf2dd517", + "be514c95 -> be52c8d8", + "3dd3ff02 -> 3dd46066", + "bf1dbe1b -> bf29f46d", + "3fae6ebf -> 3fc90fdb", + "3f163751 -> 3f208837", + "bfa23724 -> bfc90fdb", + "3efc14b1 -> 3f03c8c6", + "3f6791bc -> 3f90afc6", + "3e594211 -> 3e5aec06", + "befb77f3 -> bf036ec4", + "bdc562df -> bdc5b16e", + "bf4aa736 -> bf69d797", + "bf7b99e6 -> bfb14c94", + "3db75799 -> 3db79685", + "3f033416 -> 3f09c18a", + "3f519a4d -> 3f75915a", + "3f57bc89 -> 3f804bec", + "bd82f36f -> bd830a52", + "3f4de105 -> 3f6f31c4", + "bd74f53a -> bd751aab", + "bf976321 -> bfc90fdb", + "3e99824a -> 3e9be83d", + "3e903b12 -> 3e9235b8", + "be565f06 -> be57f7ff", + "3fbc3082 -> 3fc90fdb", + "3f1a250b -> 3f256af8", + "bf107353 -> bf197b36", + "bf63f73b -> bf8c9925", + "bf9a451c -> bfc90fdb", + "bf8f1add -> bfc90fdb", + "bd078546 -> bd078b9b", + "3fa9a446 -> 3fc90fdb", + "3f8e79f3 -> 3fc90fdb", + "3f321d0f -> 3f44fc1a", + "3f54cbc9 -> 3f7b3818", + "bf4dfa03 -> bf6f5bd6", + "be6476c9 -> be666736", + "be9ac274 -> be9d37fb", + "3d9a7273 -> 3d9a9806", + "3f97e7c1 -> 3fc90fdb", + "bf8ada57 -> bfc90fdb", + "be7be40a -> be7e80bb", + "bf556363 -> bf7c49a7", + "be575e6f -> be58fd39", + "3e3b7d7d -> 3e3c8dcc", + "bf27934a -> bf36b13a", + "3f8dd5bf -> 3fc90fdb", + "3fad503f -> 3fc90fdb", + "3f36c5cf -> 3f4b8dc0", + "bf1a8dcb -> bf25ee44", + "3fba617e -> 3fc90fdb", + "bfaf12d6 -> bfc90fdb", + "bf734016 -> bfa07eb0", + "bf15469c -> bf1f5f70", + "3d08ea84 -> 3d08f10c", + "bf058f9b -> bf0c82aa", + "bf49455d -> bf6797c0", + "be16bff4 -> be174cbb", + "3fa78712 -> 3fc90fdb", + "bf2939e4 -> bf38e252", + "be7e31a5 -> be80709a", + "3fbc4a5e -> 3fc90fdb", + "be74a783 -> be770b39", + "bf482fce -> bf65d888", + "be815a76 -> be82c542", + "3e355827 -> 3e364e4e", + "3e81dac4 -> 3e8349e1", + "bfa41b14 -> bfc90fdb", + "3ef6d383 -> 3f00c694", + "3e18b0dc -> 3e19432e", + "bee0a487 -> bee88e9b", + "3eb27a70 -> 3eb64e61", + "3f297578 -> 3f3931c4", + "3e7eae14 -> 3e80b0d6", + "3fac5d9d -> 3fc90fdb", + "3f69b27a -> 3f933c7b", + "3f1f0e23 -> 3f2ba02c", + "3e988108 -> 3e9adaaa", + "bf7e66dc -> bfbac06e", + "bf091221 -> bf10a52a", + "bf956e0e -> bfc90fdb", + "3e88ed52 -> 3e8a9d37", + "bf9568d5 -> bfc90fdb", + "3fa95bc8 -> 3fc90fdb", + "be858056 -> be870ff3", + "beb5ba89 -> beb9c74a", + "be93bd38 -> be95dec5", + "bf12129a -> bf1b738c", + "bf20f93f -> bf2e1556", + "bf9262a6 -> bfc90fdb", + "3f89ead5 -> 3fc90fdb", + "3f5d40cb -> 3f8597de", + "bef3cdaa -> befe1b85", + "bf76b468 -> bfa67698", + "bf07fae0 -> bf0f5b0c", + "3f6faaea -> 3f9b17c4", + "bfa0c931 -> bfc90fdb", + "3e73e86e -> 3e764676", + "bfaadbcf -> bfc90fdb", + "bf1b42e6 -> bf26d1bf", + "bf8e3695 -> bfc90fdb", + "bf79b67d -> bfaca2a5", + "3f896fc4 -> 3fc90fdb", + "3d569d38 -> 3d56b664", + "bf766120 -> bfa5dbf8", + "3da8f375 -> 3da924ab", + "bf90089a -> bfc90fdb", + "3fb96208 -> 3fc90fdb", + "3fa23e90 -> 3fc90fdb", + "bf9064dd -> bfc90fdb", + "3f331c5d -> 3f46607b", + "be84133f -> be8595ed", + "3e4131f2 -> 3e425c29", + "3f6a748b -> 3f942c22", + "bf042ae4 -> bf0ae158", + "bf1e4628 -> bf2aa158", + "3ee08922 -> 3ee8701f", + "3eb64225 -> 3eba5860", + "3f9ef0b2 -> 3fc90fdb", + "bf27fade -> bf373a5c", + "3f59646a -> 3f81d963", + "3fbf5a45 -> 3fc90fdb", + "bf0bd457 -> bf13ecc4", + "3fa5c21b -> 3fc90fdb", + "beb365ae -> beb74974", + "3f939039 -> 3fc90fdb", + "3f805b95 -> 3fc90fdb", + "bf20bf66 -> bf2dcafa", + "3faa2347 -> 3fc90fdb", + "3f53b126 -> 3f793e98", + "3ed33c5d -> 3ed9bd72", + "3e2fe0b3 -> 3e30c110", + "3f464612 -> 3f62cca0", + "3e0612bd -> 3e067591", + "3fbec92f -> 3fc90fdb", + "bef790a1 -> bf01328e", + "be3a03e8 -> be3b0dc6", + "3f3f8034 -> 3f5859b5", + "bf09bf09 -> bf117218", + "bf11b324 -> bf1aff60", + "bf1ad5ac -> bf26487a", + "3f69e245 -> 3f937722", + "bf98bdf6 -> bfc90fdb", + "3e9f7163 -> 3ea223af", + "3def9135 -> 3df01df1", + "bf02d891 -> bf095702", + "3d84d57f -> 3d84ed62", + "be20f5d2 -> be21a16c", + "3f8de92c -> 3fc90fdb", + "3f2ef181 -> 3f409b77", + "be2debb0 -> be2ec494", + "3ea19dd1 -> 3ea46da9", + "bee13a1d -> bee9351f", + "3f91f950 -> 3fc90fdb", + "3ed831c3 -> 3edf325e", + "3f90c822 -> 3fc90fdb", + "3e4506f7 -> 3e46437d", + "3e5e7b6d -> 3e604552", + "bfb4a8c7 -> bfc90fdb", + "3f207dda -> 3f2d76cc", + "be898753 -> be8b3d12", + "3f067214 -> 3f0d8c76", + "3ddc8aaa -> 3ddcf85b", + "3f814b6a -> 3fc90fdb", + "bee4d798 -> beed3dac", + "bfa079cb -> bfc90fdb", + "3f8b3d19 -> 3fc90fdb", + "bf1a767f -> bf25d10c", + "be4dfb26 -> be4f6564", + "befa5d9d -> bf02ccd1", + "bf630861 -> bf8b94b1", + "bfac1046 -> bfc90fdb", + "3e9841fc -> 3e9a98a0", + "3ea6fa72 -> 3eaa16f2", + "bf6658f9 -> bf8f4536", + "be45d494 -> be471508", + "be6e3d91 -> be7071a3", + "bf410830 -> bf5aab67", + "3efe4924 -> 3f050d7a", + "bfb07e5f -> bfc90fdb", + "3f99972d -> 3fc90fdb", + "bf0f3563 -> bf17fae1", + "bd07580b -> bd075e5a", + "be859ca7 -> be872d48", + "3ebea1b9 -> 3ec35606", + "bd5e3638 -> bd5e5229", + "bfa4894e -> bfc90fdb", + "bfbf7914 -> bfc90fdb", + "bfb5260e -> bfc90fdb", + "3caa3a23 -> 3caa3d46", + "3f82a8af -> 3fc90fdb", + "beb2cc73 -> beb6a5e3", + "be8ec2fb -> be90aded", + "3fb9e3e1 -> 3fc90fdb", + "3d95a8b4 -> 3d95cae2", + "bf8f6352 -> bfc90fdb", + "bf306893 -> bf429f1d", + "bf844442 -> bfc90fdb", + "3f4f82b0 -> 3f71f5b2", + "bf403662 -> bf596ce0", + "3e1fb74c -> 3e205eeb", + "3f26cee0 -> 3f35addb", + "bf136fe4 -> bf1d1dd6", + "bf5db7e0 -> bf860e9b", + "bdc4c2d1 -> bdc510a1", + "3f389a16 -> 3f4e2e10", + "bea4cae5 -> bea7c77d", + "3ebce873 -> 3ec17ae9", + "bf79282f -> bfab665d", + "3eba6568 -> 3ebec7c6", + "3faf7f82 -> 3fc90fdb", + "3f2c801e -> 3f3d4802", + "be51518e -> be52cded", + "3ec98015 -> 3ecf1a13", + "be490d48 -> be4a5dd6", + "bfabf8df -> bfc90fdb", + "bf2f383c -> bf40fc6a", + "bf4ddd28 -> bf6f2b44", + "bfb5198c -> bfc90fdb", + "bf7a02ae -> bfad51ac", + "bdd2e1e4 -> bdd341c0", + "3f68c86a -> 3f92208c", + "3f8e3673 -> 3fc90fdb", + "3f8732e6 -> 3fc90fdb", + "3f949a14 -> 3fc90fdb", + "3f848244 -> 3fc90fdb", + "bf927180 -> bfc90fdb", + "3fbd8dee -> 3fc90fdb", + "bd489d20 -> bd48b1ae", + "be0d2686 -> be0d99f1", + "bf831a08 -> bfc90fdb", + "3f06d878 -> 3f0e04d9", + "bf18b157 -> bf239aa5", + "bf37fbe7 -> bf4d4a29", + "bf8ac563 -> bfc90fdb", + "3f88987e -> 3fc90fdb", + "3fbcffee -> 3fc90fdb", + "3e4c0daf -> 3e4d6dba", + "3fb72f97 -> 3fc90fdb", + "bf4a14b9 -> bf68e869", + "bfbb2f02 -> bfc90fdb", + "beff89b1 -> bf05c649", + "3ece3f9a -> 3ed44730", + "bac47643 -> bac47648", + "3f2a07f9 -> 3f39f57b", + "3facfdd3 -> 3fc90fdb", + "bf4c5e65 -> bf6cab8e", + "bf311068 -> bf43871a", + "3f17089a -> 3f218b0b", + "3fb87092 -> 3fc90fdb", + "bf3df338 -> bf56068e", + "bf09b584 -> bf1166cc", + "bfa2ac2e -> bfc90fdb", + "3f8a8da2 -> 3fc90fdb", + "bf56b848 -> bf7eb72c", + "3ede8892 -> 3ee63664", + "3fad2060 -> 3fc90fdb", + "3f52f522 -> 3f77f17a", + "bf4d3128 -> bf6e0ac4", + "becffc1a -> bed62d3b", + "3f66bd7f -> 3f8fb8d4", + "3f601672 -> 3f887766", + "3f8f1c0a -> 3fc90fdb", + "3ec598a0 -> 3ecadccb", + "3f1b66ed -> 3f26ff12", + "3e372136 -> 3e381ec7", + "be39507b -> be3a5753", + "3f994577 -> 3fc90fdb", + "3f75c36b -> 3fa4be06", + "bfb6f4b5 -> bfc90fdb", + "bee4e43e -> beed4bd0", + "bf965690 -> bfc90fdb", + "bf1fabb4 -> bf2c6981", + "3ee52476 -> 3eed939d", + "bf387792 -> bf4dfc44", + "3f8bf451 -> 3fc90fdb", + "3f46d5ac -> 3f63b020", + "bf90d68a -> bfc90fdb", + "bf08a800 -> bf102794", + "3fa5c5b2 -> 3fc90fdb", + "3f9b2a64 -> 3fc90fdb", + "3f0ea33a -> 3f174ab5", + "3df8d938 -> 3df97708", + "bf033e3b -> bf09cd5b", + "3e11d5b8 -> 3e125517", + "bf19671f -> bf247d6a", + "3f5540c2 -> 3f7c0b04", + "bea5ab0b -> bea8b44f", + "3f2ce638 -> 3f3dd253", + "bfbf68cd -> bfc90fdb", + "becac24d -> bed078c8", + "bf2c07ff -> bf3ca59e", + "bfad001e -> bfc90fdb", + "3f703efc -> 3f9bec40", + "bcdbeb5a -> bcdbf21e", + "3e9a0761 -> 3e9c73c5", + "3f4a225f -> 3f68fea6", + "bfa59c61 -> bfc90fdb", + "3f16ed5a -> 3f21694d", + "3f97d7f8 -> 3fc90fdb", + "3f4c5618 -> 3f6c9dc6", + "bfaed520 -> bfc90fdb", + "3f5a11e1 -> 3f827e4b", + "bf2ff4cf -> bf41ff8d", + "bda68446 -> bda6b362", + "bf0ee1cb -> bf179615", + "bd499f30 -> bd49b40e", + "3fade4be -> 3fc90fdb", + "bd7c240e -> bd7c4ce4", + "3c5c3196 -> 3c5c3348", + "3ed8bdbb -> 3edfccd2", + "3f83177b -> 3fc90fdb", + "3d5cfe0a -> 3d5d1986", + "3f30daee -> 3f433d19", + "be6754b2 -> be695859", + "3ebaffb0 -> 3ebf6d76", + "3d84ef77 -> 3d850768", + "3f498977 -> 3f680613", + "bfa5ea9e -> bfc90fdb", + "3fa6da31 -> 3fc90fdb", + "bf0f9605 -> bf186f88", + "bedaf90e -> bee24426", + "3fb1ffdb -> 3fc90fdb", + "bf6ebb61 -> bf99c796", + "3f440ce0 -> 3f5f5038", + "3f988b7a -> 3fc90fdb", + "3f4a049c -> 3f68ce2c", + "bfb3b106 -> bfc90fdb", + "3f0f4bd8 -> 3f1815fa", + "3f4c3816 -> 3f6c6bfc", + "3d453fcd -> 3d455357", + "3de0f03d -> 3de164a6", + "bf73e4e7 -> bfa18a74", + "be44adfd -> be45e8d2", + "bf99eb2b -> bfc90fdb", + "bf1e6f06 -> bf2ad55b", + "3fbe7163 -> 3fc90fdb", + "bf74c88e -> bfa30801", + "3fa5f5ce -> 3fc90fdb", + "bfbd2672 -> bfc90fdb", + "bf33ecfd -> bf47851d", + "3fb55521 -> 3fc90fdb", + "3f6eff5c -> 3f9a2614", + "3e639e21 -> 3e6588f9", + "3fb810b6 -> 3fc90fdb", + "3e962b8a -> 3e986939", + "3f4c91e4 -> 3f6d0122", + "3f9d8532 -> 3fc90fdb", + "bfa7d732 -> bfc90fdb", + "bf332ba2 -> bf4675db", + "3ecebde8 -> 3ed4d137", + "beba3698 -> bebe9584", + "bf9b3f5f -> bfc90fdb", + "3f978c6c -> 3fc90fdb", + "3f93496c -> 3fc90fdb", + "bfbedb5f -> bfc90fdb", + "3f182eb2 -> 3f22f806", + "bd58f127 -> bd590b27", + "3eb5324d -> 3eb93599", + "bf770405 -> bfa70cea", + "be31a715 -> be328e5f", + "3fa06b89 -> 3fc90fdb", + "bcd38808 -> bcd38e0d", + "bfa079d6 -> bfc90fdb", + "3eaad8fb -> 3eae303b", + "3eb2f82d -> 3eb6d48e", + "bfb5c3f0 -> bfc90fdb", + "3e900aea -> 3e920389", + "becc18cd -> bed1ee01", + "3f05ef4b -> 3f0cf2e2", + "bfafc5f9 -> bfc90fdb", + "3ef06c59 -> 3efa4576", + "3f18f2f2 -> 3f23ec6b", + "3ee7920f -> 3ef04ba3", + "bf8f79f7 -> bfc90fdb", + "3f19db02 -> 3f250e4a", + "3f025341 -> 3f08bc04", + "3f6d1ad5 -> 3f979340", + "3f4c4588 -> 3f6c8249", + "3f654c6b -> 3f8e1461", + "3ed2c538 -> 3ed93aae", + "be77b610 -> be7a316b", + "3f48a52d -> 3f66952d", + "bf9a3d22 -> bfc90fdb", + "bf8c3107 -> bfc90fdb", + "3f2c3fc4 -> 3f3cf0f7", + "3f823708 -> 3fc90fdb", + "3f020b03 -> 3f08681e", + "bf30bb6a -> bf431186", + "bfb35c2a -> bfc90fdb", + "3d7ef10f -> 3d7f1b46", + "3fb09d6d -> 3fc90fdb", + "3f1913ae -> 3f241540", + "3e82ce6e -> 3e8445d8", + "bf46feff -> bf63f1c6", + "3ea1b816 -> 3ea48959", + "3d0eacc6 -> 3d0eb42a", + "bf1081d3 -> bf198cc6", + "bed27c41 -> bed8eaa0", + "be9c439b -> be9ecc3b", + "bf488f07 -> bf667186", + "3da25604 -> 3da281a8", + "bfae4e3b -> bfc90fdb", + "bf80f4d5 -> bfc90fdb", + "bf521366 -> bf7664c2", + "bfae6f0a -> bfc90fdb", + "3f35a178 -> 3f49ed95", + "3fa4714d -> 3fc90fdb", + "3fa8389e -> 3fc90fdb", + "be381895 -> be391a39", + "bf36c5ad -> bf4b8d90", + "bfb66ee9 -> bfc90fdb", + "bf54b84c -> bf7b150d", + "bfb619d5 -> bfc90fdb", + "bf95784a -> bfc90fdb", + "3fa29140 -> 3fc90fdb", + "bee68fde -> beef2a4e", + "bf5efdcf -> bf875779", + "bf4527d3 -> bf610a01", + "bf61a762 -> bf8a1ae3", + "bf5f1c78 -> bf8776b6", + "bfa22f8d -> bfc90fdb", + "3f867a09 -> 3fc90fdb", + "bcc00c97 -> bcc01118", + "bea71f0e -> beaa3dac", + "3b8edd44 -> 3b8edd62", + "bf9439a7 -> bfc90fdb", + "beb6c631 -> bebae5b5", + "bf2c3df7 -> bf3cee88", + "3ec4c130 -> 3ec9f35a", + "3f04e29b -> 3f0bb812", + "3d764521 -> 3d766b2d", + "bf10b852 -> bf19ced2", + "3f5ae182 -> 3f834578", + "3eee4d73 -> 3ef7df50", + "bf97a6a6 -> bfc90fdb", + "bf9e26a3 -> bfc90fdb", + "3f91ccb9 -> 3fc90fdb", + "be99b185 -> be9c19c0", + "bf6d2d4c -> bf97abc2", + "3f98babe -> 3fc90fdb", + "3f623357 -> 3f8aafb2", + "3faedf29 -> 3fc90fdb", + "bf3f4140 -> bf57faed", + "3efe1090 -> 3f04ece3", + "3f81bd66 -> 3fc90fdb", + "be4c722d -> be4dd448", + "3f6da65f -> 3f984d98", + "3f98f590 -> 3fc90fdb", + "3f6ffb64 -> 3f9b8aca", + "bfb0d9db -> bfc90fdb", + "3f2f60b8 -> 3f4133f7", + "bf6a47c8 -> bf93f481", + "bf451775 -> bf60f05a", + "bf1c300d -> bf27fc89", + "3f2a880b -> 3f3aa0fe", + "3f286989 -> 3f37cd29", + "be059f13 -> be0600e7", + "3f8359dd -> 3fc90fdb", + "bfa366d7 -> bfc90fdb", + "bfbb5137 -> bfc90fdb", + "3f9e99d4 -> 3fc90fdb", + "bfbddfa7 -> bfc90fdb", + "bf34f839 -> bf48fddb", + "3f8ec615 -> 3fc90fdb", + "3eb2c9c7 -> 3eb6a309", + "3f842663 -> 3fc90fdb", + "bf49cbce -> bf6871c5", + "3e6f89d8 -> 3e71c757", + "bf97d1b5 -> bfc90fdb", + "3fab8350 -> 3fc90fdb", + "bf92af33 -> bfc90fdb", + "bfb8e872 -> bfc90fdb", + "3f46ddf0 -> 3f63bd40", + "bf713a62 -> bf9d5ddc", + "bf723553 -> bf9edae5", + "bdec5c85 -> bdece3a8", + "bf3241ff -> bf452f8b", + "3f7ef775 -> 3fbd8ea0", + "bd239922 -> bd23a447", + "3fa9a2f7 -> 3fc90fdb", + "bfa30cf3 -> bfc90fdb", + "3e600d0c -> 3e61e0d7", + "3de00323 -> 3de0761c", + "bf575a9e -> bf7fe25a", + "3ea920ba -> 3eac5d80", + "3deb1041 -> 3deb952b", + "3f849019 -> 3fc90fdb", + "bfb78b91 -> bfc90fdb", + "bee4dbec -> beed4282", + "bd759b15 -> bd75c0d2", + "bc4fbca4 -> bc4fbe11", + "3e1aa19e -> 3e1b39a1", + "3f36d08b -> 3f4b9d15", + "bf47d1e8 -> bf65421a", + "3fbfe269 -> 3fc90fdb", + "bf6f5328 -> bf9a9b8c", + "bf894aa4 -> bfc90fdb", + "be704a19 -> be728d1a", + "bf8936d7 -> bfc90fdb", + "bf134296 -> bf1ce66f", + "3eda7e3e -> 3ee1bc51", + "bf7515d2 -> bfa38cd8", + "3e2a5ee7 -> 3e2b2aac", + "bf68501b -> bf9190ae", + "bf54b4f3 -> bf7b0f09", + "3ea1ffec -> 3ea4d511", + "bf343af5 -> bf47f2d0", + "bf3b5dec -> bf523431", + "bf13d1e5 -> bf1d95cc", + "bed17e2d -> bed7d40a", + "bec39e8f -> bec8b8b5", + "3fa186d6 -> 3fc90fdb", + "bfbfaf97 -> bfc90fdb", + "3f9d2f83 -> 3fc90fdb", + "3f924e5b -> 3fc90fdb", + "be9ea24d -> bea149d2", + "bf83e658 -> bfc90fdb", + "bede1c56 -> bee5be3d", + "bf05b635 -> bf0cafec", + "be95572d -> be978b26", + "bfbe6396 -> bfc90fdb", + "3fb9aede -> 3fc90fdb", + "3f203bc7 -> 3f2d2208", + "bf6112b4 -> bf897e2c", + "3f72d8ff -> 3f9fda8c", + "beb233d2 -> beb6030b", + "3eb6db28 -> 3ebafc26", + "bfb14c13 -> bfc90fdb", + "bf215c62 -> bf2e94ef", + "be40637f -> be4189f3", + "3fa401dd -> 3fc90fdb", + "3f8a329f -> 3fc90fdb", + "3ec3fad6 -> 3ec91c93", + "be57f236 -> be599464", + "beabb415 -> beaf18ba", + "beab603f -> beaebfbf", + "3e9f83f4 -> 3ea23739", + "be90c164 -> be92c1bb", + "3f2749ed -> 3f36503e", + "3f6277da -> 3f8af902", + "be48a3a4 -> be49f21b", + "3e910b53 -> 3e930ed1", + "3c3c02b7 -> 3c3c03c5", + "bfa79b86 -> bfc90fdb", + "3f144d63 -> 3f1e2d2c", + "3f0f55cf -> 3f182200", + "3f154ec1 -> 3f1f6976", + "3f97dbd2 -> 3fc90fdb", + "be06d88f -> be073d1e", + "3f8f133f -> 3fc90fdb", + "3f89cd70 -> 3fc90fdb", + "bef820b8 -> bf0184e4", + "3fbeb010 -> 3fc90fdb", + "bee92c92 -> bef21854", + "bf4d6a07 -> bf6e69f8", + "3f5a7ab7 -> 3f82e29d", + "bf85f31e -> bfc90fdb", + "3e24f53c -> 3e25ae0c", + "bf988262 -> bfc90fdb", + "3f5ec3bb -> 3f871c72", + "bf9d2c27 -> bfc90fdb", + "bf6b35c6 -> bf951ecc", + "bfb69c7f -> bfc90fdb", + "3ecbb530 -> 3ed18168", + "bbfa8805 -> bbfa88a5", + "bf8ca1da -> bfc90fdb", + "3d9c0b0d -> 3d9c31ce", + "bd6d6422 -> bd6d8635", + "be7796a6 -> be7a110b", + "bf8eed81 -> bfc90fdb", + "bf8ecf96 -> bfc90fdb", + "beb4ed88 -> beb8ec14", + "3fb7d33d -> 3fc90fdb", + "3c4c08a2 -> 3c4c09fc", + "3f34bf0a -> 3f48ad0f", + "bf9c7ff4 -> bfc90fdb", + "bf368224 -> bf4b2d2e", + "3f3c3538 -> 3f5370f9", + "3fa17a9f -> 3fc90fdb", + "3f624381 -> 3f8ac0f7", + "bf27cc92 -> bf36fd09", + "be9fbe49 -> bea2749d", + "3eaa1afc -> 3ead66bd", + "3f8e8377 -> 3fc90fdb", + "3f905296 -> 3fc90fdb", + "bd9c1524 -> bd9c3bec", + "bf90f8df -> bfc90fdb", + "3faa0257 -> 3fc90fdb", + "3e6ae1b2 -> 3e6cfddc", + "bf5ec862 -> bf87212a", + "bf685634 -> bf9197f0", + "beca9458 -> bed046bc", + "3e9c9ce3 -> 3e9f29ff", + "3f1c81a5 -> 3f286394", + "3fbe9cf3 -> 3fc90fdb", + "3ef2279f -> 3efc3c0b", + "bf1bc030 -> bf276f78", + "bf7a2b78 -> bfadb124", + "3efdaf17 -> 3f04b4c4", + "3f337102 -> 3f46d70e", + "3fbe0b8b -> 3fc90fdb", + "3f4fed64 -> 3f72ac42", + "3f6228d8 -> 3f8aa47e", + "bf465cf3 -> bf62f0cf", + "bf8a9ee4 -> bfc90fdb", + "bfb14494 -> bfc90fdb", + "bf11d088 -> bf1b2320", + "3f80c85c -> 3fc90fdb", + "be1361cc -> be13e54a", + "3f9c7442 -> 3fc90fdb", + "bf444cdf -> bf5fb3d4", + "3ee8d1c6 -> 3ef1b25d", + "bf9c338c -> bfc90fdb", + "bf80c940 -> bfc90fdb", + "3fafa494 -> 3fc90fdb", + "3f3ba5ff -> 3f529e0e", + "3fa4df84 -> 3fc90fdb", + "bfbd3445 -> bfc90fdb", + "3f8e7ac7 -> 3fc90fdb", + "3fab2b6b -> 3fc90fdb", + "3e99d4a7 -> 3e9c3e95", + "3f31c776 -> 3f448509", + "3e18355c -> 3e18c64a", + "bfbd6bfb -> bfc90fdb", + "bfb7c854 -> bfc90fdb", + "bf5d4d3c -> bf85a43d", + "bf66c23c -> bf8fbe4d", + "bfa0b5df -> bfc90fdb", + "3fb7a656 -> 3fc90fdb", + "3cecf514 -> 3cecfd8a", + "be5c94ee -> be5e5306", + "3ed25724 -> 3ed8c1eb", + "bfaf07da -> bfc90fdb", + "3f3e5851 -> 3f569d8c", + "3f8f0114 -> 3fc90fdb", + "3ed51f40 -> 3edbd00a", + "3f107bb2 -> 3f19855a", + "bfb46b2b -> bfc90fdb", + "bdabba4f -> bdabedfd", + "3f34508f -> 3f48113c", + "bee5edbb -> beee74c7", + "3f62c34c -> 3f8b4a1a", + "3e80d951 -> 3e823fcd", + "3fbf0f7d -> 3fc90fdb", + "3f19ac76 -> 3f24d412", + "3ea880e2 -> 3eabb431", + "3d51a001 -> 3d51b775", + "3f8beeab -> 3fc90fdb", + "beb01185 -> beb3bcc9", + "3ea36817 -> 3ea650ed", + "bf0b5fb2 -> bf13619c", + "3ed65afa -> 3edd2b7d", + "3fabc735 -> 3fc90fdb", + "3e7cffdd -> 3e7fa598", + "bf533fa7 -> bf787536", + "bed342f2 -> bed9c4ac", + "bfa6b5f2 -> bfc90fdb", + "bf80755c -> bfc90fdb", + "3ed31df0 -> 3ed99c0c", + "3d708c1f -> 3d70af93", + "3f68e7b2 -> 3f92462e", + "bf94f191 -> bfc90fdb", + "3fb8ac2b -> 3fc90fdb", + "3f9d300a -> 3fc90fdb", + "3f1eb2e9 -> 3f2b2bd4", + "3fbddcdd -> 3fc90fdb", + "bfb482e9 -> bfc90fdb", + "3d93408d -> 3d93611b", + "bfaac753 -> bfc90fdb", + "3eb36542 -> 3eb74900", + "bf89132f -> bfc90fdb", + "be6e4705 -> be707b5b", + "be50c8fe -> be52426d", + "3f9543c6 -> 3fc90fdb", + "3d124b80 -> 3d125378", + "3fba492a -> 3fc90fdb", + "3f3e72c2 -> 3f56c51a", + "bf5fc9d3 -> bf882856", + "bf8fbf74 -> bfc90fdb", + "3ec007ae -> 3ec4d7f0", + "bf89bac0 -> bfc90fdb", + "3fb3936d -> 3fc90fdb", + "bf80bf4a -> bfc90fdb", + "bf069425 -> bf0db480", + "3e6b6ddd -> 3e6d8de0", + "bf5282a6 -> bf7727d8", + "bf3f194a -> bf57bed7", + "bdb98463 -> bdb9c594", + "bf985f66 -> bfc90fdb", + "3f655734 -> 3f8e2082", + "3ec62317 -> 3ecb72ec", + "3fb5c198 -> 3fc90fdb", + "3f9065d4 -> 3fc90fdb", + "3fb16e79 -> 3fc90fdb", + "3d3cc57a -> 3d3cd69a", + "3a0bc17d -> 3a0bc17d", + "be40efbe -> be4218bf", + "becc5de8 -> bed2395e", + "be0f029d -> be0f7aaf", + "3fb54a99 -> 3fc90fdb", + "bf80e322 -> bfc90fdb", + "bf1dc599 -> bf29fdf0", + "3fb750e9 -> 3fc90fdb", + "3fb9eb93 -> 3fc90fdb", + "bf6500a5 -> bf8dbf66", + "bf6a0285 -> bf939ed9", + "3ec1a00e -> 3ec690c6", + "3f8535e7 -> 3fc90fdb", + "be3dff08 -> be3f1a86", + "3fa4702c -> 3fc90fdb", + "3f41dbc1 -> 3f5bee6a", + "3f98116e -> 3fc90fdb", + "3f0077b5 -> 3f0694e1", + "3fbba0c5 -> 3fc90fdb", + "bf7c8e5f -> bfb40af1", + "bf891554 -> bfc90fdb", + "bf7c997c -> bfb42d0a", + "bba3506d -> bba35099", + "3ef2ded7 -> 3efd0c14", + "3ee1341c -> 3ee92e70", + "bf5e6af1 -> bf86c291", + "bf2fee86 -> bf41f6e6", + "bf851e55 -> bfc90fdb", + "bf1f2e30 -> bf2bc916", + "3fbc129b -> 3fc90fdb", + "be6f46ef -> be718286", + "be7fee23 -> be815615", + "3f859d7f -> 3fc90fdb", + "3ea461dd -> 3ea75892", + "3fb4f5e5 -> 3fc90fdb", + "be8bdcc7 -> be8da9bb", + "3ea8efbe -> 3eac299c", + "3eb7b946 -> 3ebbea08", + "3f351cc8 -> 3f493191", + "bf62487f -> bf8ac64d", + "bf446bbd -> bf5fe3f0", + "bfbe1b34 -> bfc90fdb", + "bfb3c973 -> bfc90fdb", + "3fbf3ca8 -> 3fc90fdb", + "3fb4c338 -> 3fc90fdb", + "3f8cb90f -> 3fc90fdb", + "3f830892 -> 3fc90fdb", + "bfa129cb -> bfc90fdb", + "3e374df3 -> 3e384c40", + "bdd4d310 -> bdd5359a", + "bf3be485 -> bf52fa0a", + "3eee0129 -> 3ef78922", + "3f163168 -> 3f2080ea", + "3f59b897 -> 3f82293e", + "bf268345 -> bf354a41", + "3f49c2ca -> 3f68631f", + "3eac164d -> 3eaf80ff", + "bcb8a7d7 -> bcb8abd8", + "3c32162d -> 3c321713", + "bfa527a7 -> bfc90fdb", + "bf907535 -> bfc90fdb", + "bf85ae54 -> bfc90fdb", + "3f4288d5 -> 3f5cf80c", + "bfb85ded -> bfc90fdb", + "3fb05173 -> 3fc90fdb", + "3fb8fceb -> 3fc90fdb", + "3f567349 -> 3f7e38a6", + "bf80f891 -> bfc90fdb", + "bea60655 -> bea914cd", + "bf78f6a6 -> bfaafb44", + "3f93a039 -> 3fc90fdb", + "3f6e8a9c -> 3f99843a", + "3f11b1a8 -> 3f1afd92", + "3f58729b -> 3f80f5b6", + "3e00da68 -> 3e013215", + "3f71841e -> 3f9dcc83", + "be8a1b78 -> be8bd6e4", + "3f4d1b86 -> 3f6de69a", + "3f9afe4f -> 3fc90fdb", + "bf223a04 -> bf2fb2ed", + "be017318 -> be01cc00", + "3d854fc9 -> 3d8567ef", + "beb0db6d -> beb493de", + "bf4e748b -> bf702a9f", + "3f320f91 -> 3f44e952", + "3f4b38ba -> 3f6ac64e", + "3fa2136f -> 3fc90fdb", + "3eda9370 -> 3ee1d3c1", + "3f74e434 -> 3fa33756", + "bfab3c1e -> bfc90fdb", + "3f7e563e -> 3fba76b2", + "3f79cdde -> 3facd7e8", + "3fb269be -> 3fc90fdb", + "3f9a59e7 -> 3fc90fdb", + "bf987018 -> bfc90fdb", + "3fb732aa -> 3fc90fdb", + "3e8bc0e6 -> 3e8d8cc0", + "bf730d55 -> bfa02d91", + "bf511a29 -> bf74b2b3", + "be1128f0 -> be11a689", + "bfb140d8 -> bfc90fdb", + "be9b639e -> be9de116", + "bfa50590 -> bfc90fdb", + "bf6863df -> bf91a838", + "3eaec90b -> 3eb25f25", + "3f12e582 -> 3f1c74b6", + "bdf672c3 -> bdf70c08", + "bf51480b -> bf75024d", + "bfae5cce -> bfc90fdb", + "bd9e0792 -> bd9e2fd3", + "bf3e5025 -> bf569154", + "3f8b767b -> 3fc90fdb", + "3f83a7ac -> 3fc90fdb", + "3f95385c -> 3fc90fdb", + "bf2f4931 -> bf4113ad", + "bdd2f489 -> bdd3547e", + "3d327614 -> 3d32848c", + "be6fdb38 -> be721b0b", + "3f553788 -> 3f7bfa57", + "3f15d200 -> 3f200b2e", + "bf656b6d -> bf8e3748", + "bf819a52 -> bfc90fdb", + "3fc00000 -> 3fc90fdb", + "bf800001 -> bfc90fdb", + "3f800001 -> 3fc90fdb", + "bf800000 -> bfc90fdb", + "3f800000 -> 3fc90fdb", + "c0000000 -> bfc90fdb", + "40000000 -> 3fc90fdb" + ] + }, + { + "function": "cycles_arccosine", + "node": "ShaderNodeMath ARCCOSINE", + "cases": [ + "00000000 -> 3fc90fdb", + "3f800000 -> 00000000", + "bf800000 -> 40490fdb", + "3f000000 -> 3f860a92", + "bf000000 -> 40060a92", + "40000000 -> 00000000", + "c0000000 -> 40490fdb", + "40400000 -> 00000000", + "c0300000 -> 40490fdb", + "3dcccccd -> 3fbc3d91", + "bdcccccd -> 3fd5e224", + "40f00000 -> 00000000", + "c0f00000 -> 40490fdb", + "33d6bf95 -> 3fc90fda", + "b3d6bf95 -> 3fc90fdb", + "42c80000 -> 00000000", + "c2c80000 -> 40490fdb", + "461c4000 -> 00000000", + "3e99999a -> 3fa20faf", + "3f333333 -> 3f4b9f42", + "bfa34584 -> 40490fdb", + "3fa3e142 -> 00000000", + "3f027192 -> 3f84a03c", + "3ed25903 -> 3f92dedc", + "bed9ab90 -> 4000a25c", + "be87b156 -> 3feb6534", + "bfad9b01 -> 40490fdb", + "bed3d3ed -> 3fffa8d3", + "bf84a9b2 -> 40490fdb", + "3f694296 -> 3ed96f22", + "bf43f44f -> 401c526f", + "3ed62f2d -> 3f91d10a", + "3f92de32 -> 00000000", + "3f586688 -> 3f104ae5", + "3dec0db5 -> 3fba4696", + "be83bf33 -> 3fea5f97", + "bf3f9cc0 -> 401aa91d", + "bf9b2554 -> 40490fdb", + "bfb68324 -> 40490fdb", + "3bd59d9c -> 3fc83a3d", + "3f3f693b -> 3f39e89b", + "3f599dd0 -> 3f0e0019", + "bf2dae1f -> 40144067", + "bf4e50e6 -> 40208385", + "3f3bd46a -> 3f3f3d60", + "3fbdf123 -> 00000000", + "3e57bd3e -> 3fade414", + "3f8dc273 -> 00000000", + "3d371e0e -> 3fc3566d", + "bfa823bb -> 40490fdb", + "3f86941f -> 00000000", + "bf3dccbb -> 4019fb38", + "bf9907e0 -> 40490fdb", + "3fae55cb -> 00000000", + "3f813ca3 -> 00000000", + "bfba2bd8 -> 40490fdb", + "3d1a146c -> 3fc43eed", + "3f1dea52 -> 3f67f320", + "bf06f314 -> 400810f8", + "3ebc7c99 -> 3f98ce22", + "3efb8bc2 -> 3f8752c9", + "3cddb9b4 -> 3fc598d8", + "bf95d1cb -> 40490fdb", + "3fb8386c -> 00000000", + "3ee59858 -> 3f8d8a8c", + "bfa6ba52 -> 40490fdb", + "3fa0858c -> 00000000", + "3e95ab9d -> 3fa316ff", + "bea4ed98 -> 3ff30ae4", + "bf7a9054 -> 403bd960", + "bde99e70 -> 3fd7b1e9", + "3fa7d7b5 -> 00000000", + "3f71d1b6 -> 3eab36f6", + "bef69199 -> 4004b02b", + "3f923c2d -> 00000000", + "bf7375d5 -> 4034f28f", + "3e6415d6 -> 3fac4f62", + "bed2144e -> 3fff2e02", + "bf97940e -> 40490fdb", + "3f6ef6b3 -> 3ebbd769", + "be051397 -> 3fd9be62", + "beb40cd6 -> 3ff70ed8", + "3ee3e854 -> 3f8e0345", + "3f157e8a -> 3f727b66", + "bf6f57a0 -> 4031d8d9", + "bf5517f2 -> 40237841", + "3f8c431e -> 00000000", + "bf465745 -> 401d41e2", + "3eba95f5 -> 3f9950e1", + "3fb1dd79 -> 00000000", + "3f80b51b -> 00000000", + "bd8e4898 -> 3fd1f63a", + "3f28833f -> 3f5a3067", + "3ed66cd2 -> 3f91c012", + "3faa671d -> 00000000", + "be84c269 -> 3feaa2ab", + "3fbf8b50 -> 00000000", + "3fa9d9f5 -> 00000000", + "3ec4229c -> 3f96bdf2", + "bea172f0 -> 3ff21ff9", + "bec9f317 -> 3ffcf5a8", + "3ef211a5 -> 3f8a0714", + "be2c76dc -> 3fdeb924", + "3fb96c08 -> 00000000", + "bea3c652 -> 3ff2bcf2", + "bedbc5ad -> 4000ecc1", + "bf86e011 -> 40490fdb", + "3d4ba26a -> 3fc2b21b", + "3ebf9e68 -> 3f97f641", + "3f634547 -> 3ef4e48b", + "3fb06daf -> 00000000", + "bef73d35 -> 4004c8a8", + "bf5d6019 -> 4027636f", + "3f4fc42e -> 3f1fba0b", + "bfaf6788 -> 40490fdb", + "3ef79675 -> 3f8874ea", + "3e2b8ee7 -> 3fb383fb", + "3e39b39d -> 3fb1b857", + "3f13b0f1 -> 3f74b244", + "3f527b9d -> 3f1b043a", + "bfafe886 -> 40490fdb", + "3fa3342b -> 00000000", + "3f8fadf7 -> 00000000", + "3ea3faa1 -> 3f9f54f6", + "3f804070 -> 00000000", + "be17761d -> 3fdc1078", + "3e584c72 -> 3fadd1c4", + "bf57b49e -> 4024aa36", + "3f952931 -> 00000000", + "3f232e4f -> 3f61305c", + "bf32bf4a -> 4015ff83", + "bf277d10 -> 40122ce2", + "bf0b5bbd -> 40095f26", + "3ec4e14d -> 3f968a52", + "3f49eea1 -> 3f297550", + "bfa3a680 -> 40490fdb", + "bfa54fdb -> 40490fdb", + "be7facff -> 3fe95cf7", + "be9e84ed -> 3ff15a96", + "3f33f173 -> 3f4a9452", + "3f349c73 -> 3f49a379", + "bea903f5 -> 3ff41f9c", + "3f7036bd -> 3eb4be24", + "3eb57abc -> 3f9aaf17", + "be9f74f1 -> 3ff199b6", + "bf5ab4c8 -> 40261520", + "bf32ab42 -> 4015f885", + "3cacc05b -> 3fc65ccc", + "3f004205 -> 3f85e471", + "3f1c7614 -> 3f69cabe", + "3ea051ba -> 3fa04be5", + "3f4822dc -> 3f2c5bf1", + "bfb233cb -> 40490fdb", + "bfab8b98 -> 40490fdb", + "bf8839a4 -> 40490fdb", + "bfaeb196 -> 40490fdb", + "be00187f -> 3fd91daf", + "3dfed17b -> 3fb9182b", + "bdcf4425 -> 3fd609cd", + "3f83d91b -> 00000000", + "bfb3cb94 -> 40490fdb", + "bfbe385e -> 40490fdb", + "3dee6839 -> 3fba20ac", + "3fa8ac4f -> 00000000", + "bf99367f -> 40490fdb", + "3df3d500 -> 3fb9c944", + "bf3c6526 -> 401975dc", + "bee559ed -> 400241da", + "bf7917f8 -> 403a2980", + "bf90e4ce -> 40490fdb", + "3f597817 -> 3f0e47a9", + "3f95b11a -> 00000000", + "bfb32bfc -> 40490fdb", + "3e5ab062 -> 3fad837d", + "be8e5465 -> 3fed1e8d", + "3eef8e0a -> 3f8abd68", + "bf0372e0 -> 40070a99", + "be93f7b8 -> 3fee96d2", + "3f86f257 -> 00000000", + "bfa9bff2 -> 40490fdb", + "bfbc4e18 -> 40490fdb", + "be942b4d -> 3feea44b", + "bfad1c33 -> 40490fdb", + "3e9b0086 -> 3fa1b194", + "bcdd0063 -> 3fcc83f8", + "3f8a3afc -> 00000000", + "bf82bad4 -> 40490fdb", + "3faeabb7 -> 00000000", + "3ea0dcc8 -> 3fa02749", + "bf24d6aa -> 40114def", + "be2a5ddb -> 3fde750e", + "3f4e4e13 -> 3f22361b", + "3f171aa6 -> 3f707e50", + "3f83e7d8 -> 00000000", + "3f15d08c -> 3f721652", + "3f831803 -> 00000000", + "bfbbb118 -> 40490fdb", + "bdb036f4 -> 3fd416c7", + "3cd6ea01 -> 3fc5b419", + "bfa2733e -> 40490fdb", + "bd6b2590 -> 3fd06a10", + "3e07fc88 -> 3fb80365", + "bf9a64a6 -> 40490fdb", + "3f49a0e6 -> 3f29f39e", + "3e2a522b -> 3fb3ac22", + "be8f6162 -> 3fed6494", + "bfb62176 -> 40490fdb", + "3ec5bea1 -> 3f964e5b", + "be8da22c -> 3fecf02d", + "bf433c44 -> 401c0b1e", + "3d37c964 -> 3fc35111", + "3fb83891 -> 00000000", + "3f286ba6 -> 3f5a4fbe", + "3f2313f9 -> 3f615288", + "3f8b0ed1 -> 00000000", + "3e97cad5 -> 3fa288e4", + "3fbf18d0 -> 00000000", + "beab2863 -> 3ff4b0f9", + "3f005013 -> 3f85dc52", + "3e70106a -> 3faac5a2", + "bf505ef8 -> 402163c4", + "bfb52f84 -> 40490fdb", + "3f137907 -> 3f74f6b2", + "3e530a32 -> 3fae7dd6", + "bf201c85 -> 400fc66b", + "bf845013 -> 40490fdb", + "3dc66492 -> 3fbca495", + "3ed10942 -> 3f933adf", + "be5b8990 -> 3fe4b803", + "3e85a838 -> 3fa7418a", + "bf34a49e -> 4016a9de", + "bfa211e2 -> 40490fdb", + "bedb67d1 -> 4000dfc4", + "3f9c072f -> 00000000", + "3ec762d0 -> 3f95dc64", + "bfa3330b -> 40490fdb", + "3f37d0a5 -> 3f4513ba", + "bd4dee3c -> 3fcf7ffe", + "bfa57bb4 -> 40490fdb", + "3ef672bd -> 3f88c82c", + "3edb5d07 -> 3f90632a", + "3ef51022 -> 3f892d3a", + "bfaf4f28 -> 40490fdb", + "3f9a5ca2 -> 00000000", + "3f26b45f -> 3f5c94c9", + "bfa3d1e3 -> 40490fdb", + "3f67c784 -> 3ee08384", + "bf89a338 -> 40490fdb", + "3fbcdb0c -> 00000000", + "bf94c8c5 -> 40490fdb", + "bf922d0e -> 40490fdb", + "3ec1125a -> 3f9791ec", + "3ec12bda -> 3f978b09", + "bf3fbf8d -> 401ab63d", + "bf7d3027 -> 403f9141", + "3f242e8d -> 3f5fe319", + "bf8c45ba -> 40490fdb", + "3e2da8b3 -> 3fb33fc7", + "bf50c583 -> 40218ffa", + "3f65cc13 -> 3ee9ad2e", + "bf6c7c62 -> 402fe94f", + "3dd53531 -> 3fbbb656", + "3f14bcea -> 3f73699c", + "3e48ae3f -> 3fafd03d", + "bfa755a1 -> 40490fdb", + "bf1f0f6a -> 400f7060", + "3fb1419a -> 00000000", + "3ebd450c -> 3f989838", + "bf307fcf -> 401537b9", + "be26deab -> 3fde039c", + "bf0ad291 -> 4009364e", + "3f37df08 -> 3f44ff0e", + "bf143203 -> 400c0ad4", + "bf446caf -> 401c8148", + "3f41ca78 -> 3f364bc0", + "bd5bdece -> 3fcfefaa", + "bf85be96 -> 40490fdb", + "bf13845b -> 400bd5a5", + "3f82bf4d -> 00000000", + "be2de68d -> 3fdee7c6", + "bfbc7788 -> 40490fdb", + "be1e4e48 -> 3fdcee0a", + "3f7922e6 -> 3e6da7e8", + "bfa75b81 -> 40490fdb", + "3f0a1ba8 -> 3f801fd6", + "3e99fdef -> 3fa1f563", + "bf3436e3 -> 40168332", + "bf93a47a -> 40490fdb", + "3f17e816 -> 3f6f7f73", + "bdccb9f3 -> 3fd5e0f5", + "bdb69489 -> 3fd47d05", + "bd37149d -> 3fcec8fc", + "3f8a5dc0 -> 00000000", + "bfb24a83 -> 40490fdb", + "bfaeeea3 -> 40490fdb", + "be46f7fe -> 3fe2179d", + "3f408469 -> 3f383c94", + "be90705b -> 3fedab2b", + "bf3d0996 -> 4019b2b2", + "3eaf1cdb -> 3f9c61c6", + "3f97522f -> 00000000", + "3f655476 -> 3eebc9b8", + "3e9144c1 -> 3fa43d2e", + "be9db740 -> 3ff12486", + "3f35f159 -> 3f47c0ae", + "3f49e124 -> 3f298b40", + "3f9fc358 -> 00000000", + "3cd14f9d -> 3fc5ca85", + "be89d4a0 -> 3febf330", + "bd4c8be0 -> 3fcf74e8", + "bf28ea97 -> 4012a61b", + "3e54710c -> 3fae4ffd", + "3f881c38 -> 00000000", + "3f708f15 -> 3eb2bc59", + "bf39d46c -> 40188548", + "bedc9794 -> 400109d1", + "3f9221b7 -> 00000000", + "3ed5980e -> 3f91fa9f", + "3f059256 -> 3f82ccec", + "bfab915c -> 40490fdb", + "3fb32d25 -> 00000000", + "3f6b9669 -> 3ecdd878", + "3d88ff73 -> 3fc07e40", + "bf1e3c5e -> 400f2d26", + "3f5336b0 -> 3f19ba5e", + "bfa5a8ba -> 40490fdb", + "bfa3c6d6 -> 40490fdb", + "bfbd1864 -> 40490fdb", + "bf559ac8 -> 4023b370", + "3c2faa22 -> 3fc7b085", + "be606f28 -> 3fe55887", + "bf4e9930 -> 4020a216", + "3fa36754 -> 00000000", + "3efc771d -> 3f870f31", + "3f179051 -> 3f6fec6c", + "3f4d43bb -> 3f23f5df", + "3f38a722 -> 3f43decf", + "3f5ed09b -> 3f03ccae", + "bf318cf2 -> 401594de", + "be7b24ea -> 3fe8c74d", + "be3ad204 -> 3fe08bc7", + "3f41f651 -> 3f36089b", + "bfb09073 -> 40490fdb", + "3f35c742 -> 3f47fc7b", + "3f102663 -> 3f7901a4", + "bee3899d -> 40020100", + "bf7dc04f -> 4040929c", + "3f095604 -> 3f809511", + "be365287 -> 3fdff972", + "becc17a4 -> 3ffd8b0a", + "bee8f22a -> 4002c2c5", + "3e502170 -> 3faedcf2", + "3fa8336e -> 00000000", + "3f0ae067 -> 3f7f55bd", + "3fb31fa4 -> 00000000", + "bf6ebf42 -> 40316e68", + "3f8a3091 -> 00000000", + "3ef8bee7 -> 3f88202e", + "3fa68bed -> 00000000", + "be0f7a81 -> 3fdb0e53", + "bf4494d7 -> 401c90f2", + "3f43ce56 -> 3f3330a8", + "3efca335 -> 3f870285", + "be9ab087 -> 3ff05926", + "3f3e1c8d -> 3f3bdb78", + "bda6a7b0 -> 3fd37d49", + "be65e255 -> 3fe60b62", + "3f36d3fe -> 3f467db3", + "bf84bfef -> 40490fdb", + "bf9c2b8a -> 40490fdb", + "bf378650 -> 4017b03f", + "bf7edcb0 -> 40430679", + "3fb1c839 -> 00000000", + "bf0f756d -> 400a99f8", + "3f63e1b9 -> 3ef23951", + "be915ac0 -> 3fede844", + "be94405c -> 3feea9cb", + "bf95afe1 -> 40490fdb", + "bf399089 -> 40186ca0", + "bf160e2d -> 400c9d48", + "be5a9fca -> 3fe49a19", + "bdba6ed7 -> 3fd4baeb", + "3eb8c09d -> 3f99cec9", + "bcf15b51 -> 3fccd56c", + "bf99e4c1 -> 40490fdb", + "3f21e960 -> 3f62d4f5", + "be29c928 -> 3fde6235", + "bf4fcf14 -> 40212602", + "3f98840a -> 00000000", + "3f084dfb -> 3f813144", + "3fb3e92c -> 00000000", + "bf468558 -> 401d541d", + "3e74faf3 -> 3faa23b6", + "3f71c682 -> 3eab7b2e", + "3e93095b -> 3fa3c71e", + "bdfd9c75 -> 3fd8f413", + "3fa123e8 -> 00000000", + "3f25f4ac -> 3f5d90f7", + "3f4c147a -> 3f25eebe", + "bf80a303 -> 40490fdb", + "be179c4d -> 3fdc154b", + "bfad6cff -> 40490fdb", + "3f61313e -> 3efdc66c", + "3ecc111f -> 3f949672", + "3fa24365 -> 00000000", + "bf5d2aaf -> 402748e1", + "3eefde02 -> 3f8aa6c8", + "3fa3ce52 -> 00000000", + "3e4341d9 -> 3fb08120", + "3e042697 -> 3fb87f34", + "3f61b439 -> 3efb9d79", + "3ed971ec -> 3f90eae8", + "bf80309a -> 40490fdb", + "bf37df8b -> 4017d046", + "bf8a0bff -> 40490fdb", + "bfa9b4f3 -> 40490fdb", + "bfbac5fd -> 40490fdb", + "bcd8540b -> 3fcc7145", + "3fa74d0a -> 00000000", + "3f90c049 -> 00000000", + "3f49a2fe -> 3f29f038", + "bf2a5abb -> 401320fe", + "bfafdc04 -> 40490fdb", + "bf1193ca -> 400b3e3e", + "3f858aab -> 00000000", + "3f89d067 -> 00000000", + "3ef9edc2 -> 3f87c97e", + "3eb182cc -> 3f9bbe4a", + "bed24ec4 -> 3fff3e0a", + "bf4015b9 -> 401ad6ca", + "bf98a51f -> 40490fdb", + "3f4211da -> 3f35de67", + "3f82906b -> 00000000", + "3f2684e1 -> 3f5cd356", + "bfaa4da9 -> 40490fdb", + "bfae9cf2 -> 40490fdb", + "3f439851 -> 3f338473", + "bf843e6a -> 40490fdb", + "bfb68773 -> 40490fdb", + "bfa80ba1 -> 40490fdb", + "bf3f4fc3 -> 401a8c1e", + "3f1d8617 -> 3f687260", + "bf766a3a -> 40377e4c", + "3f411688 -> 3f375e77", + "bf47c828 -> 401dd48e", + "3f9f18d7 -> 00000000", + "3d79ae9f -> 3fc14128", + "3fba7307 -> 00000000", + "3f8161d2 -> 00000000", + "3fb18023 -> 00000000", + "3f219ec6 -> 3f633536", + "3faaecd1 -> 00000000", + "3e237a48 -> 3fb48a17", + "be290482 -> 3fde4948", + "3f4b6194 -> 3f27162f", + "3f09510e -> 3f809802", + "bebeb498 -> 3ff9ea72", + "bf6350a4 -> 402a7976", + "3e7dc85e -> 3fa9014a", + "3f9edee8 -> 00000000", + "bebee3bb -> 3ff9f724", + "bf717943 -> 40336601", + "bf81e837 -> 40490fdb", + "bea31601 -> 3ff28e6f", + "3e9b9681 -> 3fa18a3b", + "bf747219 -> 4035c2a3", + "3f939850 -> 00000000", + "bf6491c8 -> 402b29da", + "bfb75cf0 -> 40490fdb", + "bf6687c5 -> 402c4564", + "3eb256e4 -> 3f9b85be", + "3f0863b3 -> 3f81246f", + "bf90af2a -> 40490fdb", + "3ef343d1 -> 3f89b027", + "3f970927 -> 00000000", + "3f982f03 -> 00000000", + "bf49448e -> 401e6d8a", + "3f9ba69d -> 00000000", + "3d419721 -> 3fc3028e", + "bfa186fd -> 40490fdb", + "3ed37072 -> 3f929233", + "bfb39a8c -> 40490fdb", + "3f5d7f65 -> 3f067351", + "bfb42875 -> 40490fdb", + "3f07f09b -> 3f816864", + "3fa52e0b -> 00000000", + "3e0ab1c6 -> 3fb7abf3", + "be434f62 -> 3fe1a04e", + "3f12ba7f -> 3f75df80", + "bf706403 -> 403298ea", + "bfbec3d8 -> 40490fdb", + "bfa78345 -> 40490fdb", + "bf5978b3 -> 40257e3a", + "bf931e4f -> 40490fdb", + "3fb67a1c -> 00000000", + "bf70c3dd -> 4032df04", + "bf8a4e53 -> 40490fdb", + "3f9fa4ea -> 00000000", + "3fb705f4 -> 00000000", + "bfbcef20 -> 40490fdb", + "3f0571a5 -> 3f82e014", + "bf66a8fb -> 402c5882", + "3f64ccdc -> 3eee2921", + "3faf7252 -> 00000000", + "beb78887 -> 3ff7fd4e", + "be2225a7 -> 3fdd6a7e", + "bfb664fc -> 40490fdb", + "bf77e029 -> 4038e524", + "bee3ebf1 -> 40020eb9", + "beab7128 -> 3ff4c447", + "bdb8fefc -> 3fd4a3d5", + "bee1c63f -> 4001c214", + "bf08bc1e -> 400897c5", + "bf1df103 -> 400f1533", + "be1b3961 -> 3fdc8a40", + "bf7ff552 -> 4047e811", + "3fb61707 -> 00000000", + "3ed7df33 -> 3f915a07", + "3f606388 -> 3f009121", + "bf8fc5bb -> 40490fdb", + "bf904200 -> 40490fdb", + "be7e0712 -> 3fe92683", + "bf7e2eaa -> 40416e41", + "3facf8fb -> 00000000", + "bf4c39f9 -> 401fa3b4", + "3f845d96 -> 00000000", + "3f821e2d -> 00000000", + "3dca1ccc -> 3fbc68c8", + "bd8598fd -> 3fd16aef", + "bf48aa76 -> 401e2f59", + "3fb5ed41 -> 00000000", + "bfb6d867 -> 40490fdb", + "bc0c815e -> 3fca28de", + "3f98279f -> 00000000", + "bf879e59 -> 40490fdb", + "3da8710c -> 3fbe85be", + "bf42e3e6 -> 401be901", + "bf924206 -> 40490fdb", + "bd6e069c -> 3fd08122", + "3f6436bd -> 3ef0c31a", + "3ea9ffeb -> 3f9dbd58", + "3e3b2e09 -> 3fb1883b", + "bf0baf86 -> 40097822", + "bfb691fa -> 40490fdb", + "bf0850ef -> 40087818", + "3ec35102 -> 3f96f6a7", + "3f256fb9 -> 3f5e3f60", + "bf650a99 -> 402b6d32", + "3f4836f2 -> 3f2c3bb8", + "bf4caa63 -> 401fd267", + "3c40b871 -> 3fc78e67", + "3f22eba0 -> 3f6186db", + "bf5232e9 -> 40222ee9", + "bfaea5d1 -> 40490fdb", + "3f839a86 -> 00000000", + "3f5a0cd3 -> 3f0d2cc5", + "3fb41e4c -> 00000000", + "3fa89222 -> 00000000", + "3fae003f -> 00000000", + "3cb10a84 -> 3fc64ba2", + "3f5b993c -> 3f0a30ea", + "3fb151b2 -> 00000000", + "3f9da42a -> 00000000", + "bfa0c271 -> 40490fdb", + "3f4cc368 -> 3f24cc24", + "bf86695a -> 40490fdb", + "3e0bcd6b -> 3fb78829", + "bf0210cc -> 4006a3a2", + "bf5421b8 -> 402309bc", + "3f1faaa1 -> 3f65b794", + "bf3194da -> 4015979c", + "3f77d1e6 -> 3e81c7a2", + "3db63717 -> 3fbda88d", + "bf84e2b9 -> 40490fdb", + "3f31e01d -> 3f4d7868", + "be8a918e -> 3fec243d", + "3e971cad -> 3fa2b679", + "3fa06af4 -> 00000000", + "3f29c3e3 -> 3f588540", + "bfb1787f -> 40490fdb", + "bf4bec92 -> 401f83a8", + "bf2ad460 -> 401349c8", + "3f82775e -> 00000000", + "bf86e167 -> 40490fdb", + "3dc5e673 -> 3fbcac81", + "bf2bbba0 -> 40139792", + "bfb3365d -> 40490fdb", + "3eaf4f89 -> 3f9c544a", + "bf25ebee -> 4011a8be", + "3debbf60 -> 3fba4b83", + "3fafe5a5 -> 00000000", + "3f8d94c5 -> 00000000", + "3f8e9ace -> 00000000", + "bebdb3e7 -> 3ff9a553", + "3fa8d363 -> 00000000", + "3efd0fd3 -> 3f86e34a", + "bf73581c -> 4034da94", + "bfa68d9c -> 40490fdb", + "bf039b03 -> 4007164c", + "3e6a8434 -> 3fab7c21", + "be5df9a8 -> 3fe507e7", + "bde41547 -> 3fd758c5", + "3defbce3 -> 3fba0b3c", + "be8c7463 -> 3feca1b2", + "3fad1b3b -> 00000000", + "bf711f60 -> 403322b9", + "be5ad1d4 -> 3fe4a080", + "be8f861d -> 3fed6e25", + "3f73f35d -> 3e9db654", + "bf92dc96 -> 40490fdb", + "bf476319 -> 401dac36", + "bf736070 -> 4034e149", + "3f4a1d6b -> 3f292922", + "3f81ac6b -> 00000000", + "3eac0c7a -> 3f9d3236", + "bf87f124 -> 40490fdb", + "3fb755ea -> 00000000", + "3f27d60b -> 3f5b1621", + "3f13c56a -> 3f749933", + "bf8732a5 -> 40490fdb", + "3f57c982 -> 3f116fc3", + "3eb2ddd3 -> 3f9b61bf", + "be2c6a1d -> 3fdeb786", + "3f9ef8fa -> 00000000", + "3f885454 -> 00000000", + "be2d89a9 -> 3fdedbfe", + "bfb28ee5 -> 40490fdb", + "3f94dfa7 -> 00000000", + "bfb5db35 -> 40490fdb", + "bf6bc258 -> 402f70ec", + "3f873fd1 -> 00000000", + "3fa4ec7c -> 00000000", + "3f8819ac -> 00000000", + "3f92b300 -> 00000000", + "3e947ec3 -> 3fa3659e", + "bea319e4 -> 3ff28f76", + "3f142aa9 -> 3f741d21", + "be9cf111 -> 3ff0f076", + "bf1c4f41 -> 400e90e8", + "3fbe4a2c -> 00000000", + "bf9324c0 -> 40490fdb", + "3fb35bea -> 00000000", + "3f2ca9aa -> 3f549f74", + "bf3cea45 -> 4019a718", + "3f38ad18 -> 3f43d634", + "3f04eb6e -> 3f832ea8", + "3ee8dbff -> 3f8ca065", + "3f9d3d57 -> 00000000", + "3e514567 -> 3faeb7aa", + "3f946320 -> 00000000", + "bd140ac2 -> 3fcdb073", + "bf0ef5e6 -> 400a7382", + "be704326 -> 3fe76099", + "bf4e7e5a -> 402096bb", + "3e09ccea -> 3fb7c8d2", + "3e6808d2 -> 3fabcdb2", + "bf9e3f4c -> 40490fdb", + "3ef0f2ee -> 3f8a585e", + "bf85e66f -> 40490fdb", + "bf93e9ec -> 40490fdb", + "3e2d58b0 -> 3fb349ed", + "3f0903b7 -> 3f80c5ce", + "3f45ebfd -> 3f2fe14d", + "bf9ebe4c -> 40490fdb", + "3f51d464 -> 3f1c2911", + "3f83b104 -> 00000000", + "3fb2f461 -> 00000000", + "bfa92d7d -> 40490fdb", + "3fae94c9 -> 00000000", + "bfb24d45 -> 40490fdb", + "be313c73 -> 3fdf541e", + "3e5aac7d -> 3fad83fc", + "3efc31f8 -> 3f87230f", + "3fa1f497 -> 00000000", + "bfad797b -> 40490fdb", + "3e94846f -> 3fa36422", + "3ed10a74 -> 3f933a8b", + "3f5e3d0b -> 3f04f729", + "3f9d0238 -> 00000000", + "bfb6d82b -> 40490fdb", + "3f7a5590 -> 3e57d6a3", + "3e8951c8 -> 3fa64e7c", + "bf8ac125 -> 40490fdb", + "3fa0bf7f -> 00000000", + "bf3cf064 -> 4019a95c", + "3f0bd80d -> 3f7e2e83", + "bf6fc213 -> 4032244e", + "bf026c97 -> 4006be4a", + "bd958acb -> 3fd26aa9", + "3e07d69e -> 3fb8082d", + "3fb621b9 -> 00000000", + "3d34e634 -> 3fc36830", + "3e857eb3 -> 3fa74c4a", + "bfb627db -> 40490fdb", + "3efc8812 -> 3f870a52", + "bf03f240 -> 40072fbc", + "bf653001 -> 402b8228", + "3ebd6dca -> 3f988d41", + "3f9b7880 -> 00000000", + "bf0cf7af -> 4009da39", + "3db7ead0 -> 3fbd8d35", + "3f8b6db3 -> 00000000", + "3e0f0b5d -> 3fb71f6a", + "3f2a0c13 -> 3f5824be", + "3e7973a9 -> 3fa99042", + "bf9812ce -> 40490fdb", + "3ebb2b85 -> 3f9928b8", + "3f720605 -> 3ea9f716", + "bedfc9c6 -> 40017b56", + "be668c3b -> 3fe6212d", + "3e3e2e49 -> 3fb12687", + "bf7cb0ca -> 403ec28e", + "3f5e49b2 -> 3f04ddaa", + "3d99edda -> 3fbf6eaa", + "3ee06cb5 -> 3f8efbbb", + "3f0d8641 -> 3f7c2b94", + "bf587282 -> 402502bc", + "3f086a26 -> 3f8120a0", + "3fbd3c74 -> 00000000", + "be846087 -> 3fea8956", + "bf909a44 -> 40490fdb", + "3f831a30 -> 00000000", + "3faac142 -> 00000000", + "3fb980d1 -> 00000000", + "3f1f3b7c -> 3f6645a5", + "bf5ed4cb -> 40281ed0", + "3e376c53 -> 3fb20277", + "3f9126c2 -> 00000000", + "bf74018a -> 403564c4", + "3fa95309 -> 00000000", + "3f99ef4e -> 00000000", + "bfaae6c6 -> 40490fdb", + "bf042489 -> 40073e68", + "bdd22287 -> 3fd637f0", + "bfada237 -> 40490fdb", + "bfa32e79 -> 40490fdb", + "bf6c198e -> 402fa918", + "3efc26a6 -> 3f872650", + "3f0b9af3 -> 3f7e776f", + "3f7b2b52 -> 3e473ee5", + "3e9f09a0 -> 3fa0a23a", + "bf0b0d17 -> 400947b9", + "bf8a481e -> 40490fdb", + "3fbae545 -> 00000000", + "bf986cf0 -> 40490fdb", + "3ee75044 -> 3f8d0f62", + "bfa5ddf3 -> 40490fdb", + "be696853 -> 3fe67f22", + "bdb95f89 -> 3fd4a9e4", + "3fb93aaa -> 00000000", + "be2b5508 -> 3fde9464", + "3f403ef2 -> 3f38a5de", + "bdece44b -> 3fd7e6a0", + "3f5c94ec -> 3f084421", + "3e4f9b4e -> 3faeee11", + "3fbcb486 -> 00000000", + "bf634908 -> 402a7553", + "be91eaba -> 3fee0dcf", + "3fbea125 -> 00000000", + "3f2f066f -> 3f516792", + "be6f086a -> 3fe73822", + "3eefa34e -> 3f8ab764", + "bfa9f3ca -> 40490fdb", + "bf740172 -> 403564b0", + "3da4cdf7 -> 3fbec020", + "3f8ab8b1 -> 00000000", + "3f8f0be4 -> 00000000", + "bfbe0539 -> 40490fdb", + "bf5ee19a -> 40282551", + "bed19f2c -> 3fff0de8", + "be5794b8 -> 3fe43673", + "bfb8ccba -> 40490fdb", + "bf0e3cf4 -> 400a3bd5", + "bf608740 -> 4028fe24", + "bee6a81e -> 4002709c", + "bee8db02 -> 4002bf85", + "bf8ac1b9 -> 40490fdb", + "beff5186 -> 4005f166", + "be89304e -> 3febc88a", + "3ef0c46e -> 3f8a658b", + "3f8bc232 -> 00000000", + "bd87cb0b -> 3fd18e24", + "bfa1d8d9 -> 40490fdb", + "becda52e -> 3ffdf77c", + "3f1d271d -> 3f68eac6", + "3f8afd76 -> 00000000", + "3d8ceab5 -> 3fc03f67", + "3e31a4a5 -> 3fb2be5e", + "3fad81c6 -> 00000000", + "3e8cce26 -> 3fa566ad", + "3e9e597d -> 3fa0d08b", + "bf6db2f6 -> 4030b732", + "3f9d1459 -> 00000000", + "3e7ef011 -> 3fa8db21", + "3f11e9be -> 3f76dde8", + "3ea9fc53 -> 3f9dbe4c", + "3f45070b -> 3f314912", + "bf9b73fa -> 40490fdb", + "3dfb9025 -> 3fb94ca7", + "bf2c79b1 -> 4013d7c1", + "bf47a90a -> 401dc81e", + "bf6b7c56 -> 402f4428", + "bf2b5db2 -> 401377ee", + "3eaf3e7b -> 3f9c58d4", + "3e944e72 -> 3fa3723c", + "bf19b09f -> 400dbe3e", + "3fb4f4e3 -> 00000000", + "3f917e4a -> 00000000", + "bf3d7862 -> 4019dbd4", + "3f849bf1 -> 00000000", + "bfb72ec5 -> 40490fdb", + "3ec92e52 -> 3f955f91", + "bfadd069 -> 40490fdb", + "bfa800ce -> 40490fdb", + "bd947e95 -> 3fd259da", + "bf46e0d0 -> 401d7862", + "3db2974d -> 3fbde2c4", + "3f80685e -> 00000000", + "3ea52a4d -> 3f9f04c9", + "3f4eb7f9 -> 3f2182ea", + "3d908841 -> 3fc0056a", + "3f4216ac -> 3f35d702", + "bf6040c7 -> 4028d98a", + "bf523449 -> 40222f83", + "3f69d2fd -> 3ed6ae00", + "3eabc020 -> 3f9d467a", + "bfa47efe -> 40490fdb", + "be6308e8 -> 3fe5add8", + "bfbfbb81 -> 40490fdb", + "3f63071e -> 3ef5f21c", + "3f948c26 -> 00000000", + "3f19f1d5 -> 3f6cf4dc", + "3fb1cc54 -> 00000000", + "be8c3291 -> 3fec9096", + "3f868c60 -> 00000000", + "be99d08f -> 3ff01e6d", + "3f3ec9a8 -> 3f3ad86c", + "bf904283 -> 40490fdb", + "bf7504ad -> 40363f89", + "bf3c2079 -> 40195c85", + "3f1f23c8 -> 3f6663e9", + "bef54d56 -> 400481f5", + "bf3679bf -> 4017503b", + "3d13f339 -> 3fc46fff", + "3fada81f -> 00000000", + "bed4a152 -> 3fffe13f", + "3ae95bca -> 3fc8d584", + "3faa02a3 -> 00000000", + "3fad073f -> 00000000", + "3df80182 -> 3fb985ff", + "bfa1f4bc -> 40490fdb", + "3fa802b4 -> 00000000", + "bf81d6b4 -> 40490fdb", + "3e80a520 -> 3fa88d62", + "3f2bb19f -> 3f55eea1", + "3e9dbbb0 -> 3fa0fa04", + "3f07a439 -> 3f819571", + "3f1e08f9 -> 3f67cc2c", + "3f4e4d9f -> 3f2236df", + "bfa24758 -> 40490fdb", + "bf3ac971 -> 4018de99", + "bf91302a -> 40490fdb", + "3f2f9fee -> 3f5094eb", + "3e8ecd9c -> 3fa4e19b", + "3f7ee754 -> 3dbd9bf9", + "3e706d6a -> 3faab9ad", + "bf94ec46 -> 40490fdb", + "bf23c157 -> 4010f387", + "be8030e2 -> 3fe9744e", + "3f8081ed -> 00000000", + "3fa4d736 -> 00000000", + "bfb51ee8 -> 40490fdb", + "3f00e316 -> 3f85874f", + "bf536848 -> 4022b73a", + "bd6507d1 -> 3fd0390e", + "bee55122 -> 400240a0", + "bd36235a -> 3fcec170", + "3fb2b4ac -> 00000000", + "bef7a35c -> 4004d73e", + "3eab7fc5 -> 3f9d578e", + "3d71938b -> 3fc1821f", + "bfaafe69 -> 40490fdb", + "bf32d9bb -> 401608c0", + "3d9bb4ed -> 3fbf5224", + "3fa2abbc -> 00000000", + "3eee6e0b -> 3f8b0ed2", + "bf0c162a -> 400996c6", + "3ef0404a -> 3f8a8af6", + "bfa4d5d6 -> 40490fdb", + "3eab2266 -> 3f9d7053", + "bf8482c1 -> 40490fdb", + "bfb6c986 -> 40490fdb", + "bfb5d5d0 -> 40490fdb", + "bfb5005b -> 40490fdb", + "bf6a74c0 -> 402e9e20", + "3fa01c09 -> 00000000", + "bf951ce3 -> 40490fdb", + "bf5bee2e -> 4026ad08", + "3f9be763 -> 00000000", + "bfbed52d -> 40490fdb", + "bf9e3e26 -> 40490fdb", + "bf69d745 -> 402e3cbc", + "3f8d31fb -> 00000000", + "3f832b78 -> 00000000", + "3fb7d468 -> 00000000", + "3f36545b -> 3f4733c9", + "bebf82fe -> 3ffa2210", + "3f96c9a2 -> 00000000", + "be901719 -> 3fed93ea", + "bf9bb740 -> 40490fdb", + "bf5da026 -> 4027835f", + "bc26ee75 -> 3fca5db9", + "3fab2a03 -> 00000000", + "bf3d6953 -> 4019d63c", + "be058580 -> 3fd9ccbe", + "bfafbcfc -> 40490fdb", + "3f18d011 -> 3f6e5ec6", + "3f8334bc -> 00000000", + "3f077844 -> 3f81af5a", + "3e985a4e -> 3fa26354", + "bf0734bc -> 4008244a", + "bf83b35f -> 40490fdb", + "bf95dea2 -> 40490fdb", + "bdf401c3 -> 3fd85943", + "3f8dd054 -> 00000000", + "3f3d8b30 -> 3f3cb420", + "bd8947f2 -> 3fd1a600", + "3f19116a -> 3f6e0d49", + "bf1147c7 -> 400b2726", + "3ef5d3df -> 3f88f578", + "3f9e6e9c -> 00000000", + "3e94d2c9 -> 3fa34faa", + "3f2356f2 -> 3f60fb9a", + "3f8e1727 -> 00000000", + "bf92c31b -> 40490fdb", + "bfac3c51 -> 40490fdb", + "bf996561 -> 40490fdb", + "bf5394a3 -> 4022cae8", + "3e9e98f2 -> 3fa0bfdc", + "3ec767cd -> 3f95db09", + "bfb36c91 -> 40490fdb", + "3f72fcc7 -> 3ea3f277", + "3f94eff4 -> 00000000", + "bf98b14c -> 40490fdb", + "bfb38d81 -> 40490fdb", + "bf9e7a98 -> 40490fdb", + "3f9d4766 -> 00000000", + "bf3b87bc -> 40192452", + "bf1b0375 -> 400e286d", + "bfacc547 -> 40490fdb", + "3f9f204e -> 00000000", + "bf29f468 -> 4012fec1", + "bfb083bc -> 40490fdb", + "3f9e6533 -> 00000000", + "bf2ae23f -> 40134e70", + "bf047813 -> 400756ce", + "3e89c6c2 -> 3fa6301f", + "bfb1bb0e -> 40490fdb", + "3f272709 -> 3f5bfd8b", + "3db1bc57 -> 3fbdf080", + "3fb7d4fc -> 00000000", + "3fb7e99e -> 00000000", + "3f7cff06 -> 3e1d0551", + "bf0eb804 -> 400a60dd", + "3f9d6746 -> 00000000", + "3f37b867 -> 3f45368d", + "be6aea93 -> 3fe6b0ba", + "bf7fd1c8 -> 4046a87e", + "bfb2c656 -> 40490fdb", + "3fa3867a -> 00000000", + "bbd58729 -> 3fc9e562", + "bf2b3fc0 -> 40136ddc", + "becddd75 -> 3ffe06d9", + "3f01d8f8 -> 3f84f8d6", + "3ed82054 -> 3f914812", + "bebebdf5 -> 3ff9ecf7", + "3ec6f7cc -> 3f95f96e", + "bf965572 -> 40490fdb", + "bd55ae08 -> 3fcfbe12", + "3f3f4f0f -> 3f3a1002", + "bea26271 -> 3ff25f16", + "bf94a67b -> 40490fdb", + "bf18938d -> 400d6550", + "bfaa319e -> 40490fdb", + "3fa6ce37 -> 00000000", + "be899b24 -> 3febe444", + "bfb5d99f -> 40490fdb", + "bf7e79d0 -> 4042131d", + "3ebb0949 -> 3f9931e9", + "3f4d0324 -> 3f2461d6", + "3f975fe7 -> 00000000", + "3fb831b0 -> 00000000", + "bd0fc0bb -> 3fcd8e1d", + "bf8d4dfa -> 40490fdb", + "3f13bbb7 -> 3f74a513", + "bfa44b0a -> 40490fdb", + "3ee23197 -> 3f8e7da5", + "bf36d076 -> 40176f2b", + "3e97ecd0 -> 3fa28000", + "bfba0d4e -> 40490fdb", + "be8a2584 -> 3fec0830", + "3fb9bd9b -> 00000000", + "3f33a286 -> 3f4b0331", + "3f7de341 -> 3e03a283", + "bf38ddc6 -> 40182be3", + "3d2e44d8 -> 3fc39d48", + "bf2bc30e -> 40139a13", + "3d398e5b -> 3fc342e6", + "be8a95e2 -> 3fec255d", + "bf86f306 -> 40490fdb", + "3f31abe3 -> 3f4dc0fc", + "3f0cce72 -> 3f7d07ea", + "3f2f3d85 -> 3f511c0b", + "bf865525 -> 40490fdb", + "be8aa471 -> 3fec2925", + "bf6627f6 -> 402c0e80", + "3f89cb05 -> 00000000", + "3fc00000 -> 00000000", + "bf800001 -> 40490fdb", + "3f800001 -> 00000000", + "bf800000 -> 40490fdb", + "3f800000 -> 00000000", + "c0000000 -> 40490fdb", + "40000000 -> 00000000" + ] + }, + { + "function": "cycles_arctan2", + "node": "ShaderNodeMath ARCTAN2", + "cases": [ + "00000000 00000000 -> 00000000", + "00000000 3f800000 -> 00000000", + "00000000 bf800000 -> 40490fdb", + "00000000 3f000000 -> 00000000", + "00000000 bf000000 -> 40490fdb", + "00000000 40000000 -> 00000000", + "00000000 c0000000 -> 40490fdb", + "00000000 40400000 -> 00000000", + "00000000 c0300000 -> 40490fdb", + "00000000 3dcccccd -> 00000000", + "00000000 bdcccccd -> 40490fdb", + "00000000 40f00000 -> 00000000", + "00000000 c0f00000 -> 40490fdb", + "00000000 33d6bf95 -> 00000000", + "00000000 b3d6bf95 -> 40490fdb", + "00000000 42c80000 -> 00000000", + "00000000 c2c80000 -> 40490fdb", + "00000000 461c4000 -> 00000000", + "00000000 3e99999a -> 00000000", + "00000000 3f333333 -> 00000000", + "3f800000 00000000 -> 3fc90fdb", + "3f800000 3f800000 -> 3f490fdb", + "3f800000 bf800000 -> 4016cbe4", + "3f800000 3f000000 -> 3f8db70d", + "3f800000 bf000000 -> 40023454", + "3f800000 40000000 -> 3eed6338", + "3f800000 c0000000 -> 402b6374", + "3f800000 40400000 -> 3ea4bc7d", + "3f800000 c0300000 -> 4032bd97", + "3f800000 3dcccccd -> 3fbc4de9", + "3f800000 bdcccccd -> 3fd5d1cc", + "3f800000 40f00000 -> 3e07bb97", + "3f800000 c0f00000 -> 40409421", + "3f800000 33d6bf95 -> 3fc90fda", + "3f800000 b3d6bf95 -> 3fc90fdb", + "3f800000 42c80000 -> 3c23d5a4", + "3f800000 c2c80000 -> 40486c05", + "3f800000 461c4000 -> 38d1b717", + "3f800000 3e99999a -> 3fa3c166", + "3f800000 3f333333 -> 3f75c72c", + "bf800000 00000000 -> bfc90fdb", + "bf800000 3f800000 -> bf490fdb", + "bf800000 bf800000 -> c016cbe4", + "bf800000 3f000000 -> bf8db70d", + "bf800000 bf000000 -> c0023454", + "bf800000 40000000 -> beed6338", + "bf800000 c0000000 -> c02b6374", + "bf800000 40400000 -> bea4bc7d", + "bf800000 c0300000 -> c032bd97", + "bf800000 3dcccccd -> bfbc4de9", + "bf800000 bdcccccd -> bfd5d1cc", + "bf800000 40f00000 -> be07bb97", + "bf800000 c0f00000 -> c0409421", + "bf800000 33d6bf95 -> bfc90fda", + "bf800000 b3d6bf95 -> bfc90fdb", + "bf800000 42c80000 -> bc23d5a4", + "bf800000 c2c80000 -> c0486c05", + "bf800000 461c4000 -> b8d1b717", + "bf800000 3e99999a -> bfa3c166", + "bf800000 3f333333 -> bf75c72c", + "3f000000 00000000 -> 3fc90fdb", + "3f000000 3f800000 -> 3eed6338", + "3f000000 bf800000 -> 402b6374", + "3f000000 3f000000 -> 3f490fdb", + "3f000000 bf000000 -> 4016cbe4", + "3f000000 40000000 -> 3e7adbb0", + "3f000000 c0000000 -> 40396220", + "3f000000 40400000 -> 3e291cbc", + "3f000000 c0300000 -> 403d8d22", + "3f000000 3dcccccd -> 3fafcb99", + "3f000000 bdcccccd -> 3fe2541c", + "3f000000 40f00000 -> 3d8854e4", + "3f000000 c0f00000 -> 4044cd34", + "3f000000 33d6bf95 -> 3fc90fd9", + "3f000000 b3d6bf95 -> 3fc90fdc", + "3f000000 42c80000 -> 3ba3d6b1", + "3f000000 c2c80000 -> 4048bdef", + "3f000000 461c4000 -> 3851b717", + "3f000000 3e99999a -> 3f83e363", + "3f000000 3f333333 -> 3f1ec8ac", + "bf000000 00000000 -> bfc90fdb", + "bf000000 3f800000 -> beed6338", + "bf000000 bf800000 -> c02b6374", + "bf000000 3f000000 -> bf490fdb", + "bf000000 bf000000 -> c016cbe4", + "bf000000 40000000 -> be7adbb0", + "bf000000 c0000000 -> c0396220", + "bf000000 40400000 -> be291cbc", + "bf000000 c0300000 -> c03d8d22", + "bf000000 3dcccccd -> bfafcb99", + "bf000000 bdcccccd -> bfe2541c", + "bf000000 40f00000 -> bd8854e4", + "bf000000 c0f00000 -> c044cd34", + "bf000000 33d6bf95 -> bfc90fd9", + "bf000000 b3d6bf95 -> bfc90fdc", + "bf000000 42c80000 -> bba3d6b1", + "bf000000 c2c80000 -> c048bdef", + "bf000000 461c4000 -> b851b717", + "bf000000 3e99999a -> bf83e363", + "bf000000 3f333333 -> bf1ec8ac", + "40000000 00000000 -> 3fc90fdb", + "40000000 3f800000 -> 3f8db70d", + "40000000 bf800000 -> 40023454", + "40000000 3f000000 -> 3fa9b465", + "40000000 bf000000 -> 3fe86b50", + "40000000 40000000 -> 3f490fdb", + "40000000 c0000000 -> 4016cbe4", + "40000000 40400000 -> 3f168757", + "40000000 c0300000 -> 4020d1a8", + "40000000 3dcccccd -> 3fc2aad1", + "40000000 bdcccccd -> 3fcf74e4", + "40000000 40f00000 -> 3e856dae", + "40000000 c0f00000 -> 40386225", + "40000000 33d6bf95 -> 3fc90fda", + "40000000 b3d6bf95 -> 3fc90fdb", + "40000000 42c80000 -> 3ca3d173", + "40000000 c2c80000 -> 4047c838", + "40000000 461c4000 -> 3951b717", + "40000000 3e99999a -> 3fb60107", + "40000000 3f333333 -> 3f9df7b2", + "c0000000 00000000 -> bfc90fdb", + "c0000000 3f800000 -> bf8db70d", + "c0000000 bf800000 -> c0023454", + "c0000000 3f000000 -> bfa9b465", + "c0000000 bf000000 -> bfe86b50", + "c0000000 40000000 -> bf490fdb", + "c0000000 c0000000 -> c016cbe4", + "c0000000 40400000 -> bf168757", + "c0000000 c0300000 -> c020d1a8", + "c0000000 3dcccccd -> bfc2aad1", + "c0000000 bdcccccd -> bfcf74e4", + "c0000000 40f00000 -> be856dae", + "c0000000 c0f00000 -> c0386225", + "c0000000 33d6bf95 -> bfc90fda", + "c0000000 b3d6bf95 -> bfc90fdb", + "c0000000 42c80000 -> bca3d173", + "c0000000 c2c80000 -> c047c838", + "c0000000 461c4000 -> b951b717", + "c0000000 3e99999a -> bfb60107", + "c0000000 3f333333 -> bf9df7b2", + "40400000 00000000 -> 3fc90fdb", + "40400000 3f800000 -> 3f9fe0bb", + "40400000 bf800000 -> 3ff23efa", + "40400000 3f000000 -> 3fb3ec43", + "40400000 bf000000 -> 3fde3372", + "40400000 40000000 -> 3f7b985f", + "40400000 c0000000 -> 400a29c3", + "40400000 40400000 -> 3f490fdb", + "40400000 c0300000 -> 401403fe", + "40400000 3dcccccd -> 3fc4cbfe", + "40400000 bdcccccd -> 3fcd53b7", + "40400000 40f00000 -> 3ec2d1bc", + "40400000 c0f00000 -> 4030b5a3", + "40400000 33d6bf95 -> 3fc90fda", + "40400000 b3d6bf95 -> 3fc90fdb", + "40400000 42c80000 -> 3cf5afb2", + "40400000 c2c80000 -> 4047247b", + "40400000 461c4000 -> 399d4952", + "40400000 3e99999a -> 3fbc4de9", + "40400000 3f333333 -> 3fabb862", + "c0300000 00000000 -> bfc90fdb", + "c0300000 3f800000 -> bf9c6b53", + "c0300000 bf800000 -> bff5b462", + "c0300000 3f000000 -> bfb20a6a", + "c0300000 bf000000 -> bfe0154b", + "c0300000 40000000 -> bf7126ea", + "c0300000 c0000000 -> c00cc620", + "c0300000 40400000 -> bf3df042", + "c0300000 c0300000 -> c016cbe4", + "c0300000 3dcccccd -> bfc468d1", + "c0300000 bdcccccd -> bfcdb6e4", + "c0300000 40f00000 -> beb3f093", + "c0300000 c0f00000 -> c03291c8", + "c0300000 33d6bf95 -> bfc90fda", + "c0300000 b3d6bf95 -> bfc90fdb", + "c0300000 42c80000 -> bce13926", + "c0300000 c2c80000 -> c0474d68", + "c0300000 461c4000 -> b9902de0", + "c0300000 3e99999a -> bfbb273e", + "c0300000 3f333333 -> bfa9285c", + "3dcccccd 00000000 -> 3fc90fdb", + "3dcccccd 3f800000 -> 3dcc1f14", + "3dcccccd bf800000 -> 4042aee2", + "3dcccccd 3f000000 -> 3e4a2210", + "3dcccccd bf000000 -> 403c6dba", + "3dcccccd 40000000 -> 3d4ca12d", + "3dcccccd c0000000 -> 4045dd56", + "3dcccccd 40400000 -> 3d087b99", + "3dcccccd c0300000 -> 4046bc56", + "3dcccccd 3dcccccd -> 3f490fdb", + "3dcccccd bdcccccd -> 4016cbe4", + "3dcccccd 40f00000 -> 3c5a70be", + "3dcccccd c0f00000 -> 4048356a", + "3dcccccd 33d6bf95 -> 3fc90fd2", + "3dcccccd b3d6bf95 -> 3fc90fe3", + "3dcccccd 42c80000 -> 3a83126c", + "3dcccccd c2c80000 -> 4048ff78", + "3dcccccd 461c4000 -> 3727c5ac", + "3dcccccd 3e99999a -> 3ea4bc7d", + "3dcccccd 3f333333 -> 3e114d77", + "bdcccccd 00000000 -> bfc90fdb", + "bdcccccd 3f800000 -> bdcc1f14", + "bdcccccd bf800000 -> c042aee2", + "bdcccccd 3f000000 -> be4a2210", + "bdcccccd bf000000 -> c03c6dba", + "bdcccccd 40000000 -> bd4ca12d", + "bdcccccd c0000000 -> c045dd56", + "bdcccccd 40400000 -> bd087b99", + "bdcccccd c0300000 -> c046bc56", + "bdcccccd 3dcccccd -> bf490fdb", + "bdcccccd bdcccccd -> c016cbe4", + "bdcccccd 40f00000 -> bc5a70be", + "bdcccccd c0f00000 -> c048356a", + "bdcccccd 33d6bf95 -> bfc90fd2", + "bdcccccd b3d6bf95 -> bfc90fe3", + "bdcccccd 42c80000 -> ba83126c", + "bdcccccd c2c80000 -> c048ff78", + "bdcccccd 461c4000 -> b727c5ac", + "bdcccccd 3e99999a -> bea4bc7d", + "bdcccccd 3f333333 -> be114d77", + "40f00000 00000000 -> 3fc90fdb", + "40f00000 3f800000 -> 3fb81868", + "40f00000 bf800000 -> 3fda074d", + "40f00000 3f000000 -> 3fc08a8c", + "40f00000 bf000000 -> 3fd19529", + "40f00000 40000000 -> 3fa7b46f", + "40f00000 c0000000 -> 3fea6b46", + "40f00000 40400000 -> 3f985b6c", + "40f00000 c0300000 -> 3ff60bff", + "40f00000 3dcccccd -> 3fc75af9", + "40f00000 bdcccccd -> 3fcac4bc", + "40f00000 40f00000 -> 3f490fdb", + "40f00000 c0f00000 -> 4016cbe4", + "40f00000 33d6bf95 -> 3fc90fdb", + "40f00000 b3d6bf95 -> 3fc90fda", + "40f00000 42c80000 -> 3d99501f", + "40f00000 c2c80000 -> 4044455a", + "40f00000 461c4000 -> 3a449ba4", + "40f00000 3e99999a -> 3fc3f1d5", + "40f00000 3f333333 -> 3fbd2658", + "c0f00000 00000000 -> bfc90fdb", + "c0f00000 3f800000 -> bfb81868", + "c0f00000 bf800000 -> bfda074d", + "c0f00000 3f000000 -> bfc08a8c", + "c0f00000 bf000000 -> bfd19529", + "c0f00000 40000000 -> bfa7b46f", + "c0f00000 c0000000 -> bfea6b46", + "c0f00000 40400000 -> bf985b6c", + "c0f00000 c0300000 -> bff60bff", + "c0f00000 3dcccccd -> bfc75af9", + "c0f00000 bdcccccd -> bfcac4bc", + "c0f00000 40f00000 -> bf490fdb", + "c0f00000 c0f00000 -> c016cbe4", + "c0f00000 33d6bf95 -> bfc90fdb", + "c0f00000 b3d6bf95 -> bfc90fda", + "c0f00000 42c80000 -> bd99501f", + "c0f00000 c2c80000 -> c044455a", + "c0f00000 461c4000 -> ba449ba4", + "c0f00000 3e99999a -> bfc3f1d5", + "c0f00000 3f333333 -> bfbd2658", + "33d6bf95 00000000 -> 3fc90fdb", + "33d6bf95 3f800000 -> 33d6bf95", + "33d6bf95 bf800000 -> 40490fda", + "33d6bf95 3f000000 -> 3456bf95", + "33d6bf95 bf000000 -> 40490fda", + "33d6bf95 40000000 -> 3356bf95", + "33d6bf95 c0000000 -> 40490fda", + "33d6bf95 40400000 -> 330f2a63", + "33d6bf95 c0300000 -> 40490fda", + "33d6bf95 3dcccccd -> 358637bd", + "33d6bf95 bdcccccd -> 40490fd6", + "33d6bf95 40f00000 -> 3265109f", + "33d6bf95 c0f00000 -> 40490fdb", + "33d6bf95 33d6bf95 -> 3f490fdb", + "33d6bf95 b3d6bf95 -> 4016cbe4", + "33d6bf95 42c80000 -> 3089705f", + "33d6bf95 c2c80000 -> 40490fdb", + "33d6bf95 461c4000 -> 2d2febff", + "33d6bf95 3e99999a -> 34b2f4fc", + "33d6bf95 3f333333 -> 34196446", + "b3d6bf95 00000000 -> bfc90fdb", + "b3d6bf95 3f800000 -> b3d6bf95", + "b3d6bf95 bf800000 -> c0490fda", + "b3d6bf95 3f000000 -> b456bf95", + "b3d6bf95 bf000000 -> c0490fda", + "b3d6bf95 40000000 -> b356bf95", + "b3d6bf95 c0000000 -> c0490fda", + "b3d6bf95 40400000 -> b30f2a63", + "b3d6bf95 c0300000 -> c0490fda", + "b3d6bf95 3dcccccd -> b58637bd", + "b3d6bf95 bdcccccd -> c0490fd6", + "b3d6bf95 40f00000 -> b265109f", + "b3d6bf95 c0f00000 -> c0490fdb", + "b3d6bf95 33d6bf95 -> bf490fdb", + "b3d6bf95 b3d6bf95 -> c016cbe4", + "b3d6bf95 42c80000 -> b089705f", + "b3d6bf95 c2c80000 -> c0490fdb", + "b3d6bf95 461c4000 -> ad2febff", + "b3d6bf95 3e99999a -> b4b2f4fc", + "b3d6bf95 3f333333 -> b4196446", + "42c80000 00000000 -> 3fc90fdb", + "42c80000 3f800000 -> 3fc7c82f", + "42c80000 bf800000 -> 3fca5786", + "42c80000 3f000000 -> 3fc86c04", + "42c80000 bf000000 -> 3fc9b3b1", + "42c80000 40000000 -> 3fc68095", + "42c80000 c0000000 -> 3fcb9f20", + "42c80000 40400000 -> 3fc5391c", + "42c80000 c0300000 -> 3fcc94bf", + "42c80000 3dcccccd -> 3fc8ef16", + "42c80000 bdcccccd -> 3fc9309f", + "42c80000 40f00000 -> 3fbf7ad9", + "42c80000 c0f00000 -> 3fd2a4dc", + "42c80000 33d6bf95 -> 3fc90fdb", + "42c80000 b3d6bf95 -> 3fc90fda", + "42c80000 42c80000 -> 3f490fdb", + "42c80000 c2c80000 -> 4016cbe4", + "42c80000 461c4000 -> 3c23d5a4", + "42c80000 3e99999a -> 3fc8ad8d", + "42c80000 3f333333 -> 3fc82a7b", + "c2c80000 00000000 -> bfc90fdb", + "c2c80000 3f800000 -> bfc7c82f", + "c2c80000 bf800000 -> bfca5786", + "c2c80000 3f000000 -> bfc86c04", + "c2c80000 bf000000 -> bfc9b3b1", + "c2c80000 40000000 -> bfc68095", + "c2c80000 c0000000 -> bfcb9f20", + "c2c80000 40400000 -> bfc5391c", + "c2c80000 c0300000 -> bfcc94bf", + "c2c80000 3dcccccd -> bfc8ef16", + "c2c80000 bdcccccd -> bfc9309f", + "c2c80000 40f00000 -> bfbf7ad9", + "c2c80000 c0f00000 -> bfd2a4dc", + "c2c80000 33d6bf95 -> bfc90fdb", + "c2c80000 b3d6bf95 -> bfc90fda", + "c2c80000 42c80000 -> bf490fdb", + "c2c80000 c2c80000 -> c016cbe4", + "c2c80000 461c4000 -> bc23d5a4", + "c2c80000 3e99999a -> bfc8ad8d", + "c2c80000 3f333333 -> bfc82a7b", + "461c4000 00000000 -> 3fc90fdb", + "461c4000 3f800000 -> 3fc90c94", + "461c4000 bf800000 -> 3fc91321", + "461c4000 3f000000 -> 3fc90e37", + "461c4000 bf000000 -> 3fc9117e", + "461c4000 40000000 -> 3fc9094d", + "461c4000 c0000000 -> 3fc91668", + "461c4000 40400000 -> 3fc90606", + "461c4000 c0300000 -> 3fc918dd", + "461c4000 3dcccccd -> 3fc90f87", + "461c4000 bdcccccd -> 3fc9102e", + "461c4000 40f00000 -> 3fc8f747", + "461c4000 c0f00000 -> 3fc9286e", + "461c4000 33d6bf95 -> 3fc90fdb", + "461c4000 b3d6bf95 -> 3fc90fda", + "461c4000 42c80000 -> 3fc7c82f", + "461c4000 c2c80000 -> 3fca5786", + "461c4000 461c4000 -> 3f490fdb", + "461c4000 3e99999a -> 3fc90edf", + "461c4000 3f333333 -> 3fc90d8f", + "3e99999a 00000000 -> 3fc90fdb", + "3e99999a 3f800000 -> 3e9539d4", + "3e99999a bf800000 -> 403668a0", + "3e99999a 3f000000 -> 3f0a58ef", + "3e99999a bf000000 -> 4026799f", + "3e99999a 40000000 -> 3e18769c", + "3e99999a c0000000 -> 403f8871", + "3e99999a 40400000 -> 3dcc1f14", + "3e99999a c0300000 -> 40421b8c", + "3e99999a 3dcccccd -> 3f9fe0bb", + "3e99999a bdcccccd -> 3ff23efa", + "3e99999a 40f00000 -> 3d23c0b2", + "3e99999a c0f00000 -> 404680d8", + "3e99999a 33d6bf95 -> 3fc90fd8", + "3e99999a b3d6bf95 -> 3fc90fdd", + "3e99999a 42c80000 -> 3b449b7f", + "3e99999a c2c80000 -> 4048deb4", + "3e99999a 461c4000 -> 37fba883", + "3e99999a 3e99999a -> 3f490fdb", + "3e99999a 3f333333 -> 3ecf4dfb", + "3f333333 00000000 -> 3fc90fdb", + "3f333333 3f800000 -> 3f1c5889", + "3f333333 bf800000 -> 4021f9b8", + "3f333333 3f000000 -> 3f73570a", + "3f333333 bf000000 -> 400c3a18", + "3f333333 40000000 -> 3eac60a4", + "3f333333 c0000000 -> 403383c6", + "3f333333 40400000 -> 3e6abbc7", + "3f333333 c0300000 -> 40391c1b", + "3f333333 3dcccccd -> 3fb6e62c", + "3f333333 bdcccccd -> 3fdb3989", + "3f333333 40f00000 -> 3dbe9832", + "3f333333 c0f00000 -> 40431b19", + "3f333333 33d6bf95 -> 3fc90fd9", + "3f333333 b3d6bf95 -> 3fc90fdc", + "3f333333 42c80000 -> 3be55f4b", + "3f333333 c2c80000 -> 40489d2b", + "3f333333 461c4000 -> 3892ccf7", + "3f333333 3e99999a -> 3f953c5c", + "3f333333 3f333333 -> 3f490fdb", + "c10e339f 416ae499 -> bf0b5c02", + "417e6412 41862611 -> 3f4240a2", + "c08b21ab c133d858 -> c03170ca", + "c0954524 c125e253 -> c02e00de", + "c1577cd7 bfa3c981 -> bfd52fcf", + "4178cfca c19a12c4 -> 401d96c8", + "4136f804 c04b1753 -> 3febb59d", + "c033e4cc c138de5d -> c039ca07", + "4084ccf1 417a56ec -> 3e84bf24", + "c0e39bd3 41288209 -> bf181067", + "c074bbf9 bf9088b6 -> bfedd076", + "41806b43 4127358a -> 3f7e62f8", + "401dce70 c1263273 -> 403a2552", + "c0d609b3 41506620 -> bef2e62c", + "c03b65ab bcfa344e -> bfca65a4", + "c10f43db c152f45d -> c022e17d", + "c0c88268 41341667 -> bf020a7d", + "413ae40f c002a63e -> 3fdf355b", + "c0b9af7c c0f3b8ca -> c01f64ed", + "412d932d c149e212 -> 401b9cda", + "40903471 c162e243 -> 40355e7b", + "c13f1119 414a56ac -> bf41baa4", + "416772f8 c031a30d -> 3fe153b5", + "41229647 419c398c -> 3ef5a8f1", + "418dd6e3 bf2f5046 -> 3fce00e3", + "c0f92506 418de1eb -> bed3cc32", + "408b8426 41692471 -> 3e94da97", + "3f860c22 3f967e78 -> 3f3a480e", + "418772f5 c0d3eaca -> 3ff8c931", + "c18119f9 c1187eca -> c006ac7a", + "c17c9a87 4025087b -> bfb456a2", + "413fa88c c15bc100 -> 401b2907", + "4182cfce c11783c8 -> 40062075", + "40f0c4eb c19e2b6d -> 4031ca1b", + "c13982b6 401d63c9 -> bfae4f25", + "c12a9e0e c16ed66a -> c0215cd1", + "c13fb815 c1239bdb -> c011be6f", + "41898303 c0fef3aa -> 40004f18", + "40a7cb99 c183d64a -> 403558a4", + "40c5197b 4061dcbc -> 3f86768c", + "c038c5c1 c10eda0f -> c0350bbc", + "413230c8 c14a0575 -> 401acd76", + "41953fc6 412b3774 -> 3f86670c", + "416086ff bec6bf18 -> 3fcc9a0b", + "3e053aa9 c1852a0a -> 40488fcb", + "40d2c508 c1827be9 -> 40307fb7", + "410ea6ab 419cfacd -> 3eda5aee", + "4070134e 41932917 -> 3e4dfe2c", + "bf67c269 418810a8 -> bd59d110", + "417688b9 c1256b47 -> 400a5a92", + "4187f382 c0b8b0ee -> 3ff2f840", + "416059ae c10e965b -> 4008c3ce", + "c19ef6b0 414be862 -> bf8010dd", + "bf142cf0 408da233 -> be052815", + "3f31579a c107e4a5 -> 4043da79", + "c16b9ee3 419f4575 -> bf2309a0", + "4129c549 3f5cd52d -> 3fbeadb9", + "c1019612 40fb8e69 -> bf4ce113", + "41268df5 419e6310 -> 3ef7d6d9", + "4188b8fb c1635396 -> 4010eb40", + "c19e2c91 40b61802 -> bfa53133", + "419d5691 c032bd5a -> 3fdb1e19", + "417bcfea 408880c0 -> 3fa72ec1", + "c15090b2 41666802 -> bf3c55cb", + "c1980006 c10145e0 -> bffc8701", + "4128a2dc c0f8d673 -> 400d3650", + "c15398ca c0a72279 -> bff93501", + "c0a20fbb 418f9d92 -> be8cc81b", + "3fc608ba c19fe709 -> 40441e30", + "41167b1c 419d389b -> 3ee48856", + "c153069a c1983450 -> c0224461", + "c199804c 4182f77c -> bf5d4c8a", + "c1197bae 414f7849 -> bf230df1", + "418514ec c1376927 -> 400b257d", + "c174f6ed c19c5396 -> c01e870a", + "c19510e3 418128db -> bf5b58d2", + "c031fe85 419125a7 -> be1bc11c", + "401c4c02 4137f846 -> 3e564eba", + "c13b8022 41997a66 -> bf0c60b2", + "c19639fc c055e6a8 -> bfdf9b88", + "40c5f998 40d6e0cd -> 3f3e9629", + "407a9359 beb9e873 -> 3fd4e61b", + "be329d03 c189f24d -> c0486a20", + "c0b8b6aa 41125e11 -> bf101a04", + "c17962bd 40afd743 -> bf9dad5f", + "c0bbc304 414c4967 -> bedc8e04", + "c15f7a6c 41980423 -> bf2244d3", + "c07d2819 c0dc4214 -> c027ae0a", + "40ce0b9e 401e29bc -> 3f9a2767", + "4119fe20 40bae409 -> 3f833fa2", + "41515061 c01a7010 -> 3fe068f5", + "41608b05 bff982d0 -> 3fdaba5f", + "c180b37f 41450585 -> bf6ae11f", + "3bc0a5e5 c12fe13b -> 40490717", + "c04a5054 c17b36ce -> c03c58af", + "409eadf1 be142ef8 -> 3fcccbd9", + "c1538eac 4004b8e1 -> bfb52611", + "41830341 41259fc1 -> 3f80e91b", + "c1162c3c 3fc9a0cb -> bfb3c72d", + "c19a164b 41616f85 -> bf707138", + "418bc662 4174a522 -> 3f5a154c", + "4196b1c6 412f99f5 -> 3f8588da", + "c041b9a3 4187f748 -> be347b98", + "41866cab c17eff2e -> 40151abf", + "4192698a c106dfb0 -> 400027c2", + "4058aacd 40ff822c -> 3ecd520f", + "41195cd5 41766629 -> 3f0e866e", + "4000ffeb c142461b -> 403e88a6", + "c16a8ac4 414cd974 -> bf5a55d7", + "4179ea57 c19ba8a0 -> 401dc54a", + "41783504 41538046 -> 3f5d7596", + "41813916 c165a504 -> 40130638", + "3ffefdcb 410922c2 -> 3e69da2a", + "40c5f1f2 419f728c -> 3e9a1427", + "4062854e 4176af28 -> 3e671247", + "c16b81c2 c12929c9 -> c00c6580", + "416caf3f c1319aae -> 400dbb12", + "4143140a 4183cffc -> 3f231661", + "410e6dbe c16f78bb -> 4026b8de", + "41561025 419ff8b7 -> 3f16f415", + "41177eb7 40b57a35 -> 3f83fc94", + "bfb57da4 41451b2e -> bdeaafa9", + "bf982fe2 418b5b43 -> bd8b9189", + "c03544d6 4112bf35 -> be995ae4", + "41408109 4068fae4 -> 3fa37457", + "4117d309 3fea49e7 -> 3fb0abc7", + "41636a7d c051b4ce -> 3fe61034", + "40c8784e c0e26a9c -> 401aae80", + "c15e5b3e c14a311e -> c013c24b", + "c123488b 40973044 -> bf91903d", + "3f913913 bf507fc5 -> 400c60cb", + "c0bb0354 c1988cff -> c0360773", + "40dc1dd8 c10599e4 -> 401cf60c", + "c12106cd 410025c9 -> bf660b67", + "413046db c133da53 -> 40177068", + "3ef5f7cd 41884fa1 -> 3ce6e8eb", + "40a1d5f3 41853e86 -> 3e96efaf", + "41988421 c19257fd -> 4015798e", + "c1350cd1 417c3510 -> bf1f639c", + "c1857781 c192aecf -> c019d03c", + "40d7315c c145d5b5 -> 40292e94", + "40ce2a72 c188cd3c -> 4032007c", + "3f01a77f c18807f6 -> 40472800", + "4196e422 4166b63c -> 3f6b075d", + "415872f6 414e12be -> 3f4f58e5", + "4070c2cb 41410889 -> 3e9ac1a1", + "c19f1702 c0bb4541 -> bfedb235", + "c109c256 418463fa -> bef59ffc", + "c003dc9a c186891a -> c0414283", + "c0a5cd2f c19c78a1 -> c0387d11", + "40c2f0a0 c03b141c -> 400129ea", + "408e177f c007d6d0 -> 4001116a", + "c11c3204 c15a1c7a -> c02149ba", + "c144b88e 414a37d2 -> bf4588de", + "40af67a5 3fc96a4e -> 3fa5476a", + "403600ab c10c5da4 -> 4034fff7", + "c17c62ac c13e1949 -> c00dd8a3", + "411772e1 40550168 -> 3f9dc8a0", + "c19dea9c c161c146 -> c00c3f98", + "416e37e2 40f80e26 -> 3f8b9e48", + "c06df81b 4141b6ca -> be988f99", + "c0311500 c0ed1865 -> c032302a", + "419a289e c0d1dd95 -> 3ff30d2e", + "c100ce40 bf706bf2 -> bfd7ed56", + "4178a007 c0b43444 -> 3ff590a0", + "415fa999 40b09e50 -> 3f98eda8", + "414ad51a c183f16c -> 401f1f0f", + "bfdfc90b c1451d1a -> c0400a29", + "418951f8 41757a4d -> 3f576691", + "4168b224 c18d3901 -> 401cf546", + "41214b25 c174a0c0 -> 4023c161", + "4169005e 416fc20b -> 3f45674b", + "c0864886 4135f758 -> beb4fb80", + "40d70c3d bf15149e -> 3fd4204e", + "bf37dc43 c186a933 -> c0465537", + "4167bba3 41896251 -> 3f335ce5", + "c13fb8de 41824c6a -> bf2260ba", + "3f0acca2 4173d35d -> 3d11ab11", + "3fe6c83a c1291434 -> 403e3f1f", + "c134a625 c156c0a7 -> c01c4d88", + "c0f84f32 c1991913 -> c0306876", + "bf69241a 418bd17a -> bd553de0", + "4109af7c 416bffaf -> 3f0733ef", + "c03fca2c c11ae3c5 -> c035d955", + "41967956 418cee10 -> 3f517184", + "c1772c4e 41943935 -> bf31ebd8", + "41823463 c1812d9e -> 40168b0e", + "c19070e4 4113ee4d -> bf8c7be5", + "40fdc4a5 418962ac -> 3edd7ecc", + "418f2f53 c16cb969 -> 4010bd93", + "40d70fb1 c148bdb8 -> 402996a3", + "4038430d 41415344 -> 3e6f8820", + "c08fef75 419ffadf -> be628e17", + "419ea7c1 bfe1fcae -> 3fd46d55", + "4198ce50 c19d11fe -> 4017ad58", + "c17ba0f9 c183dfec -> c0184d23", + "c185ffb6 4183630d -> bf4b94d8", + "c162a4d9 404564d1 -> bfad9ebe", + "c0d430f7 40c93bf2 -> bf4fd85d", + "3ebb4567 416e66e3 -> 3cc90df4", + "c13b4443 c0a4b0ce -> bffe16ca", + "414c2943 c115f595 -> 400d1376", + "4175ae6a 4084e9f9 -> 3fa73f41", + "c09c119f 41899c51 -> be8d74dd", + "40f1382f 404e077b -> 3f95664a", + "c0d5a3af 414f4c65 -> bef39d1d", + "41441a30 c07aa8f5 -> 3ff0a6e6", + "c1890ec7 bd636d34 -> bfc97a0d", + "bea28d35 c153b949 -> c04786d7", + "c14d6498 c0fd85bb -> c007eb60", + "c04d8872 41260065 -> be99b158", + "4048c846 c14c9e52 -> 4039aa7a", + "bf39b858 c1372044 -> c04502bc", + "c106e25c c14450ec -> c02288b0", + "c13e4901 c147d680 -> c0185cff", + "c0bc18af c182feb5 -> c033011f", + "3ef3737a 4197dd77 -> 3ccd2691", + "c0203374 bf1e17fb -> bfe805d1", + "c0c28280 c11533b2 -> c024176b", + "40ae194f 40961a10 -> 3f5bf9f1", + "4199e9e2 c14142a8 -> 40086936", + "c13158b1 c0a20033 -> bfffe701", + "3fcd7093 412eed52 -> 3e1542d2", + "4141272e 40acccfc -> 3f933900", + "c1119cc8 406c043f -> bf97c869", + "c10b4640 417e4266 -> bf0049c7", + "c0ee3cce 413f313b -> bf0ea37f", + "c13be0c3 401f4d4f -> bfae532a", + "401a81b8 40da6e81 -> 3eae0d07", + "419a92ca c0b909ad -> 3fee4869", + "40dbd5a1 c182bf8b -> 402f9864", + "40a54681 4166a07d -> 3eb0295a", + "414fdce3 c112ed36 -> 400be914", + "406308a1 417e4fb6 -> 3e60db28", + "c08f1e70 c00867fc -> c000fe12", + "c18a0df7 c16bb76c -> c011c190", + "41510c24 c10371cc -> 40087476", + "412a9317 c1163fe1 -> 4012bf4f", + "3fd7bbe1 418614bf -> 3dcd4273", + "bfeb1c96 40f8d933 -> be6d83eb", + "418787a7 c18818c6 -> 4016ee16", + "40e329ac bf910293 -> 3fdd5183", + "3f449ab4 c15867d3 -> 40456e8c", + "419c5d47 41056600 -> 3f957402", + "c1771733 c1350f1f -> c00d00d0", + "c1769c64 4185cd3d -> bf3e9dde", + "4189da38 40763cbd -> 3facf17e", + "41482de7 40cda489 -> 3f8c5347", + "c16c73af 3fd4e6ef -> bfbab742", + "4122190f c1432a2d -> 401cb406", + "bfd5a6aa 40a92936 -> be9c9793", + "c1966423 414518be -> bf7d9fb6", + "c138a677 40c76597 -> bf89b113", + "4149cc95 40d57d04 -> 3f8ac8a4", + "40a3272c 40a56993 -> 3f474d34", + "c01fe37a c04a4f2e -> c01e4216", + "c1053d5d 40cd8e8b -> bf69eba7", + "c0844da3 4148fb60 -> bea2cd76", + "4120ae80 417e89e5 -> 3f1026d7", + "c0ebe821 41333a25 -> bf150225", + "4004a91b c18b986f -> 40417eac", + "41863a96 41882402 -> 3f474074", + "c06697a7 c0827aa7 -> c01abebd", + "c16c4893 c0c3359b -> bffb342f", + "3f3b20a9 419f8462 -> 3d161688", + "c18eb876 41426218 -> bf7912b2", + "c11c10f7 c11c664a -> c016dd5e", + "416a7e88 c18d5a19 -> 401cbeb2", + "4178073f c10e7002 -> 4005e4c8", + "40f4434e 40c83632 -> 3f6259e3", + "c0e31d16 c11a8b4d -> c0208170", + "41070d8b 40e9339e -> 3f5bcc96", + "c10f4313 c092bbff -> c002d267", + "c186e9a9 40d06b5b -> bf99e2c4", + "c146ffde c1922783 -> c022ceeb", + "c1705390 4142dc4e -> bf63b5ee", + "c019917c 418becc8 -> be0b9bf1", + "c156dc5d c13f78e5 -> c0131dde", + "4050c57c c18ee6d2 -> 403d8073", + "4108aeab c16cf519 -> 402793b4", + "c19446e8 415ab855 -> bf6f7103", + "c18af348 413bd9b7 -> bf79f468", + "c19eed60 c19da23b -> c01688f2", + "c15b6c55 c124a112 -> c00dba01", + "c01a4e33 c179cd0e -> c03f4188", + "400499be c1085b2a -> 4039cc79", + "419072c8 419b4402 -> 3f3fd38e", + "4114ef59 c1011df1 -> 40123e1a", + "413a500f 4089804c -> 3f9bd02e", + "409e18c5 414c4cf9 -> 3ebd055a", + "41711a28 4094797b -> 3fa2d430", + "413bbcf4 c06fa8b0 -> 3ff09aa1", + "4082bbfc 40ef078e -> 3f002010", + "c1831ace 4179dad9 -> bf4f3cbb", + "c0fa256e c15bba72 -> c027f181", + "411798e9 c014e09b -> 3fe7e0d6", + "c103be36 4187e462 -> bee718b1", + "c195ec57 c196aa35 -> c016f451", + "418236a3 417f4b04 -> 3f4b9c39", + "40ba08a7 bee6ee13 -> 3fd2f905", + "413a6c1c c098f009 -> 3ffae329", + "c15fd59c c182cb04 -> c01bc388", + "41572207 c165afce -> 4018e3c2", + "4157400a 40edc4a9 -> 3f8878b7", + "40ece510 3f07d804 -> 3fbfe713", + "c131f152 41633029 -> bf2a188c", + "40ddaeb0 41951387 -> 3eb63c13", + "c195eb5c 419b3988 -> bf449c89", + "41122d52 3f4205dc -> 3fbe77b9", + "40825540 41388752 -> 3eadd03f", + "c0c5ba0b c1937981 -> c0345cf7", + "418593cd 4128f8ec -> 3f80dfce", + "c14d3b2f 412a1d7c -> bf60f15d", + "3f971c71 c140741e -> 4042ccef", + "c17ce948 4101bbae -> bf8c6519", + "40b81294 c1382675 -> 402b6637", + "c07fdbec c0fd5375 -> c02b220d", + "bfbf53bc c0f9e86d -> c03cf578", + "c165f020 4130b2de -> bf6a63b0", + "4182dd12 c185ca9c -> 40178124", + "4127dc21 c17690cf -> 4022ced8", + "c10bc8c4 41849fd1 -> bef85305", + "40c70bb3 c1799372 -> 4030c70d", + "40a24fdd 41525098 -> 3ebc8e61", + "c19bf5fd 4125bb15 -> bf8a8c4c", + "c1813193 c125cd28 -> c0090b0a", + "40129d91 4192a939 -> 3dfe99cc", + "412807eb 4128984b -> 3f48a20f", + "40cdf414 c14e3187 -> 402b6b15", + "405c0940 c1960871 -> 403d7546", + "413ddec0 418402db -> 3f1f9b06", + "40af0e26 bf887567 -> 3fe1b29d", + "416b6383 415916be -> 3f5368ee", + "40defa35 c08a6135 -> 40081413", + "414e6dd7 c1151184 -> 400c8edf", + "c18d8630 c18edcaf -> c01718f8", + "c17eac81 c132aa94 -> c00baf16", + "40ecf953 c1806de1 -> 402d669a", + "414ee466 c103a121 -> 4008cb92", + "bf7202ec 40ec735d -> be024d6a", + "c189b8f9 40beaef5 -> bf9e689a", + "c0c79344 40f69e3a -> bf2e2bbb", + "bf068ac4 bd5b793b -> bfd6112d", + "414d70e5 c0c9701c -> 4001b422", + "411c0b4d 4192024f -> 3efb44e5", + "c0d72bea 3fb59e8b -> bfae713a", + "c11dae6c c0a4ede0 -> c0035eca", + "41877ff4 411a2710 -> 3f86dcc0", + "c18afd36 c19191b0 -> c01846ae", + "c0fd4a31 c162ae47 -> c0287454", + "c0b1fcb4 c09e1b30 -> c01303db", + "410760d2 c10895e0 -> 4017149e", + "c0084c66 4069fd83 -> bf0706ef", + "40c6a845 c15f2c0e -> 402e4305", + "c172cbf8 415aa373 -> bf5673d6", + "c19bc5ff c0f8365d -> bff995c9", + "bf88ca11 c1456215 -> c0438818", + "415af6f5 c1589da9 -> 4016738b", + "414a0aef c1561345 -> 4018a586", + "c1850f96 419e4e39 -> bf32efce", + "41675c74 c18e7813 -> 401d6a03", + "3eec84a8 c0e9da61 -> 4045058f", + "c0942180 419f6ccc -> be69b827", + "406fb8a9 40153594 -> 3f81cc58", + "c1002b15 c19b8571 -> c0300c02", + "41922051 c124aa8b -> 40055e96", + "c19fa456 411715ab -> bf907d23", + "c16b11bd 415b4ac0 -> bf51f29e", + "411b3512 417951c2 -> 3f0e8b8d", + "40d26c12 c18b3a49 -> 4031f106", + "4060618f c19c8f79 -> 403db77d", + "c1018654 40bc0785 -> bf716437", + "410de4f0 418010f7 -> 3f0182a4", + "c19c7255 4134e719 -> bf85f6a6", + "c1872544 403d43a5 -> bfb2e12a", + "406bafc4 c15d97e6 -> 40386de0", + "c195ca63 414743a9 -> bf7bdd8c", + "c19d310c 418854a2 -> bf5b39c3", + "415c3a23 c16cf451 -> 40192314", + "c0752961 40e6418e -> befa7913", + "4186b7a1 c0efe3ab -> 3ffeac1f", + "411e3ad1 414a13f8 -> 3f2a0f5e", + "40a16b59 415be669 -> 3eb41a6a", + "c02a23f3 c109bd26 -> c035e487", + "c1057979 4166bc83 -> bf0641ac", + "40ed55e8 c18d5fdc -> 402fa164", + "415ea02b c0c7d51d -> 3fff0f71", + "418ad42b c12f5aa1 -> 400894f0", + "c01af97e 405a1715 -> bf1e2864", + "40bcb19f c11cd68f -> 402666e4", + "417938a6 c0c14966 -> 3ff869af", + "c197fb68 413cd68d -> bf81e827", + "c1738b72 411471a2 -> bf82ff1f", + "c0e02fb5 c0998a71 -> c00af69f", + "be3c1f87 c18caccb -> c04864b0", + "c08a2710 c1656fd3 -> c0365890", + "40c452a0 4168ffa2 -> 3ecc263c", + "4097b58f c1111d7f -> 402a3c5f", + "404a1862 400b5b4a -> 3f7794aa", + "c0b9977e c10d7c71 -> c023e925", + "41296a58 414f461a -> 3f2f6b54", + "c144328b 41738b7b -> bf2d9a9e", + "4075a2b8 c140c5bd -> 40355325", + "3f43680a c136f913 -> 4044cbe4", + "4155de6f be38579e -> 3fcac924", + "c19e42d6 c110ec81 -> c00002c9", + "4188f072 c19b1a74 -> 401ac59c", + "40f3831a c18ca753 -> 402eeb5c", + "414516af 4178f534 -> 3f2b6cf9", + "4056883c 40a8454a -> 3f11485b", + "c0ff1ae7 c123caf6 -> c01eb779", + "c18eb020 c0ee94f8 -> bffbbdf3", + "40857b75 4194497f -> 3e62aa4b", + "4024f12e 4080a0c2 -> 3f11f465", + "4144eedd c1813faa -> 401f654f", + "c100e845 415b8e60 -> bf07e912", + "c1081b2f c011200e -> bfea6833", + "c187ce20 c18bb8e1 -> c017b4cc", + "c198866a 41521701 -> bf77ba90", + "4068a503 411a8559 -> 3eb85135", + "418b4255 4188830f -> 3f4b9caf", + "3ff00e44 41588e63 -> 3e0cfdfa", + "c16f92d8 415b5c5d -> bf545463", + "4126a4f1 40d948ae -> 3f7e391f", + "411765a5 c03c5f3e -> 3fefa9ab", + "c1957c72 40999e2c -> bfa8dfa3", + "413ace43 c1745a0b -> 401f49cb", + "3da546df c0113eec -> 4046c97d", + "3e3bb902 c12eb260 -> 4047fccb", + "4029087b c05ebf71 -> 401f8448", + "c14cada9 c1399887 -> c013ab6e", + "41487572 c0a4553e -> 3ffadac4", + "4199f323 c01c6384 -> 3fd93a98", + "410e5341 419b5df0 -> 3edbe8dc", + "40ac6f6d c111be4f -> 4026df8a", + "4160ed0c 4028b5fd -> 3fb155cb", + "c0e5b5c0 c0b8e799 -> c00fe833", + "41989d64 40eba9cf -> 3f99e794", + "c13bf5b5 c1869277 -> c0220bc2", + "c17fb0df 418b9822 -> bf3dd2a9", + "bfe066bc c11f59e7 -> c03de912", + "c0c006a8 c1890a22 -> c0337f3b", + "408ca9df 404d7901 -> 3f70a262", + "c10bdd48 40eae3af -> bf5f4fb6", + "41363b77 c13169ab -> 4015f059", + "c128539b 40c2ba5a -> bf85f038", + "c1111369 c1894e0d -> c029f4c2", + "4194a70e c18d2d9e -> 40152576", + "c1472c96 415c8758 -> bf3c0c40", + "c11d7f22 3fbbd3eb -> bfb61ebe", + "c0e448b9 41883770 -> becb2365", + "417193e0 c143f626 -> 401025e8", + "401d6462 c084bad1 -> 4026cf5f", + "c0c8025e 40a44e83 -> bf6211de", + "c0f12ba1 40d814c8 -> bf571831", + "c113a363 c14825e0 -> c020630d", + "41177883 40bb6375 -> 3f8227c8", + "4154dadb c1808955 -> 401ccd06", + "416d885a c0a46037 -> 3ff3b34d", + "be4547e3 bf1673cd -> c034c9d5", + "411362b6 41641466 -> 3f12de0e", + "41232cd4 409a10ed -> 3f909ae0", + "41819faa 40ef495c -> 3f91b7b1", + "41156419 410cdb0b -> 3f509689", + "414527cf 412d7e79 -> 3f5961dc", + "c19dd8be c092050b -> bfe6271f", + "40b40874 c012e699 -> 3ffaa52a", + "c13ea71f c19ac8a3 -> c025bbca", + "c138d3b6 c09d1c96 -> bffc8101", + "c0a57fcf 4123fe2b -> beef43ef", + "c0acbee2 c1074331 -> c024b102", + "bbed4064 c171aa80 -> c0490800", + "40a579fd c13308f3 -> 402d5b3c", + "c029ced9 4180f074 -> be271293", + "41136e74 416aadee -> 3f0f9820", + "417ae2a7 41412bbf -> 3f6a2629", + "4085ba01 c19bc271 -> 403b87cf", + "c02389b5 4185dfaf -> be1b2a00", + "4034e7bf c1957617 -> 403f73a7", + "4140b53b c1284b8b -> 4012799b", + "409ebf9f c156eba9 -> 40326b82", + "41821fc6 416b6ba1 -> 3f55dfc8", + "4066de81 3fd9f288 -> 3f909cd7", + "c0e3bb52 c18477c8 -> c02f154b", + "3f544f5e 3f884633 -> 3f296b3a", + "414e39bf 418a247e -> 3f242634", + "c1980d15 c0c5f6a3 -> bff15713", + "c16706e8 c190aea4 -> c01df0f3", + "c100a05b 40872408 -> bf8b25f9", + "c190cd7c 415e40c8 -> bf6a8e13", + "4183e7c9 c1923f28 -> 401a17e4", + "bf9afedb 408b5f1a -> be8ad7bc", + "418748f0 40475ef7 -> 3fb1be74", + "c19458d5 4009096c -> bfba58d2", + "c18cb822 3e2cfe5e -> bfc7d526", + "c05c2a7e c10b3115 -> c030f632", + "40aa25f7 4081cb89 -> 3f6b4c31", + "402d1a27 40b7b09d -> 3ee17294", + "c0a7820b c15f418f -> c03217a3", + "c114881e 415fd634 -> bf15fab7", + "bfe97007 c114e924 -> c03cad82", + "410fba69 bf53a8da -> 3fd4cf58", + "40a271e3 41991832 -> 3e84c293", + "bd12b715 c15d5d1c -> c048e570", + "41080b9e c10c9fb0 -> 4017dafe", + "414b02ea 4173da72 -> 3f31baae", + "c02c9ace 413ecb34 -> be63c343", + "411b51a9 417dec1e -> 3f0c88d4", + "41183afc 40bcc27b -> 3f820639", + "4197d6fa c0772708 -> 3fe2c135", + "c0325daa 40649d1e -> bf299d2c", + "41981765 c18e25f2 -> 4014a271", + "c18ce538 bffae971 -> bfd7400f", + "c18c7838 c1593b54 -> c00ea7f9", + "402585f9 c08313ba -> 4025049d", + "c0f3cfc4 4095d2ee -> bf828817", + "4144d71e 40b194e9 -> 3f92d258", + "c1584d25 c1939e9c -> c0209862", + "4135e1ec 4154801b -> 3f353a27", + "4150cf76 412f621c -> 3f5f478e", + "c13a29fa c13e1bfa -> c01777ad", + "40b008f5 c0fd25dd -> 40222c96", + "c124c793 4107ea69 -> bf618f7b", + "c0d5bc2a c0b1d7b3 -> c010f24d", + "3f8b1d2d 416c69d4 -> 3d965e5f", + "3f2f2d8a 41722c2c -> 3d390dda", + "c185099d c19957d0 -> c01b53a3", + "c1029528 c13a66d7 -> c021f3bd", + "c0952d25 c08b20a7 -> c014910f", + "c09d8520 c00626c6 -> bffc9733", + "40f75c96 41880568 -> 3eda7902", + "c174ad21 c0c7485e -> bffa9038", + "c198d78d c10e1a7b -> c0006172", + "c09b258f c12a4e89 -> c02db524", + "c0d7e820 3fd7dff3 -> bfa9b589", + "41598585 40676ba1 -> 3fa7c9a0", + "41567351 c19ff7f3 -> 402344ff", + "c115c188 bf8a2f66 -> bfd7c2c0", + "3f621c5a c188d4d2 -> 4045c289", + "418f8465 410fa700 -> 3f8daab5", + "417c0c39 41130776 -> 3f8577c9", + "c19fd821 41930d76 -> bf53b9dc", + "411955a8 c17be60f -> 40261108", + "414d362e c1507101 -> 40174bd0", + "40835d5e c194b562 -> 403b26ba", + "404ffb51 c18474c3 -> 403ca876", + "408c3e05 40c0cb20 -> 3f20ff34", + "3fae9ddf 418179f0 -> 3dac37f5", + "c0bdf293 4125849f -> bf055ba8", + "4198be1c c004d679 -> 3fd6ec25", + "41038946 4029d2db -> 3fa1193f", + "410f836c 40e81e28 -> 3f6409cc", + "c090d4a9 c0d639e6 -> c02303e2", + "41885943 c17d345e -> 40146ce3", + "419e2742 419175a7 -> 3f53c242", + "beb5b2f6 c1307124 -> c04700c8", + "418c1a46 3dfca214 -> 3fc8290c", + "40896457 419d2331 -> 3e5c5d9a", + "c14827d7 c184ae7a -> c01fb40b", + "c15c38ac c14682a6 -> c0137b26", + "406b21fe 4175c344 -> 3e706917", + "412efd0f c0bc1636 -> 40041781", + "c0b60953 c195e9b9 -> c0363304", + "419bd143 c1644133 -> 400cfd64", + "c19c3f83 c0fa5843 -> bff9d401", + "4125fbcb 414db12f -> 3f2dd0ac", + "c1454cde c01c3e70 -> bfe2145b", + "c19e0a72 400fb229 -> bfba938c", + "c181586f 3e5d5ea9 -> bfc759bf", + "c170a76d 405f2bd7 -> bfabe6dc", + "c18cd7b3 40e9a1f1 -> bf96be25", + "40e0410d 401692db -> 3f9f9a5e", + "bf6e0982 41682cdc -> bd830d74", + "c0e49d36 4142d122 -> bf07d642", + "c15c4829 bfeea9c4 -> bfda4ace", + "c105f184 c000d74f -> bfe744f5", + "3f060684 414bf195 -> 3d282407", + "c0d18f66 c16a5c17 -> c02e277f", + "40b10ecc 418b0663 -> 3e9dd220", + "c0164007 41880688 -> be0c7f3e", + "41978933 c19f88a2 -> 4018710a", + "40211701 40b11b6d -> 3eda887d", + "c1291e42 c1895fc7 -> c025bfb5", + "41013fd1 41729df2 -> 3efa9e14", + "c0e010a8 4196d738 -> beb60e0e", + "41993c31 bf371d73 -> 3fcdd6f5", + "414e7cc1 c09adeec -> 3ff6fc6b", + "c026ae6f c1043161 -> c03584c3", + "416bedca c098b1d7 -> 3ff11f31", + "c0d921a7 418934ce -> bec0e32a", + "4176687c 4165b001 -> 3f520c8e", + "c07f8311 c083a229 -> c017c0ca", + "c00bcf6f 41807a51 -> be0a70cf", + "c0d06b8d c0796a0f -> c0070a35", + "4116de4c 3f3f7076 -> 3fbeee8b", + "c18614a8 40dc71ab -> bf972512", + "40f6c7a8 40e884ac -> 3f50ad53", + "c164eefd c0ec5367 -> c0030693", + "3f531fd7 3fd4bf73 -> 3eebd286", + "416e1b6e c1922db5 -> 401d51a8", + "c1775475 c16730a9 -> c014a37e", + "419e2608 41850b80 -> 3f5f13be", + "418c28b7 c10404d6 -> 4000b34e", + "c0163b98 406b1a8a -> bf11904d", + "412c7bbf c0926760 -> 3ffc6fb0", + "c18e5839 bf8b0abf -> bfd0dddb", + "418e0108 c16ca588 -> 4010fd9c", + "4152e092 c14d6bf6 -> 4015f532", + "4185bc21 c05764b4 -> 3fe27dd9", + "c12b9443 c19d088d -> c0290fb5", + "c1705d58 bfc7b6b3 -> bfd64ef9", + "c14d19dd 3ec3aeb4 -> bfc53f2b", + "4122e052 c176e656 -> 4023bd75", + "41812f72 be9e4026 -> 3fcb82f9", + "418e68d0 c1223c15 -> 4005ab18", + "bf35ddbe c115e27b -> c04437bc", + "33d6bf95 b3d6bf95 -> 4016cbe4", + "bf800000 00000000 -> bfc90fdb", + "3f800000 00000000 -> 3fc90fdb", + "00000000 bf800000 -> 40490fdb", + "80000000 bf800000 -> c0490fdb", + "80000000 80000000 -> 00000000", + "00000000 80000000 -> 00000000", + "00000000 00000000 -> 00000000" + ] + } + ] +} diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/mix.json b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/mix.json new file mode 100644 index 00000000..3e1199ad --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/mix.json @@ -0,0 +1,21640 @@ +{ + "oracle": "tools/cycles-oracle/oracle.py (Blender 5.2.2 LTS, build d13f752e3b9c, Cycles CPU, 1 sample, Emit bake, float Non-Color images)", + "blender": "5.2.2 LTS", + "build_hash": "d13f752e3b9c", + "platform": "Linux", + "encoding": "each case is 'operands -> results', every scalar a float32 bit pattern in hex, colours flattened as r g b", + "family": "mix", + "functions": [ + { + "function": "cycles_mix_float", + "node": "ShaderNodeMix FLOAT", + "cases": [ + "00000000 c196cd18 4097cf22 -> c196cd18", + "3f000000 414b9b75 4068d7f4 -> 4102e8b9", + "3f800000 c195d47b 41144d0e -> 41144d0e", + "3fc00000 c162f59f c0309753 -> 403d0842", + "bf000000 40bfa685 c1810688 -> 418861b6", + "3e800000 409d9fca 41273885 -> 40c9d41a", + "3f400000 c13343e8 c15ca3a5 -> c1524bb6", + "40000000 c16774eb 40b63356 -> 41ced420", + "00000000 41324f6c 40230207 -> 41324f6c", + "3f000000 bf094f3f c075d3a6 -> c00c13bb", + "3f800000 c1771e49 4169a8b6 -> 4169a8b6", + "3fc00000 40bb44e5 c112415d -> c18519a3", + "bf000000 c19d6950 c0fef167 -> c1cc3fcb", + "3e800000 c14205f1 c08a41dc -> c122ccb0", + "3f400000 c12da62f 417410c2 -> 410ba306", + "40000000 c127e9d6 c12fa95e -> c13768e6", + "00000000 414d9bb4 40985638 -> 414d9bb4", + "3f000000 c17d595d c1232e8d -> c15043f5", + "3f800000 c18061a5 40fbee95 -> 40fbee95", + "3fc00000 4111d26b c1849351 -> c1eb5195", + "bf000000 415b55d6 41337acf -> 416f4358", + "3e800000 40e434be c00b293c -> 4099c266", + "3f400000 418570f5 c025cbd6 -> 400e890a", + "40000000 40dc9469 c0b6dc9e -> c1929369", + "00000000 41347ba9 41833f58 -> 41347ba9", + "3f000000 c16badeb 416fdc7e -> 3e05d260", + "3f800000 40b06ad6 4188d866 -> 4188d866", + "3fc00000 c187cddf bee4bab8 -> 40fa2a3d", + "bf000000 40601625 409eeaee -> 4031364a", + "3e800000 c1469107 c0b04107 -> c12af4e6", + "3f400000 41898fef c16eebef -> c0dcd1f7", + "40000000 c19e38e6 c1244f2f -> bf42c920", + "00000000 4080277e 4182a6dd -> 4080277e", + "3f000000 c15002c9 c114ddb6 -> c1327040", + "3f800000 c19c20cc bf2bbd6d -> bf2bbd6d", + "3fc00000 c0d98906 41627b5e -> 41c50da7", + "bf000000 4181b04d c0926e5a -> 41d4d63f", + "3e800000 c10e63be 40ef22cb -> c099ccea", + "3f400000 c1865ba4 4130226a -> 4081d7fc", + "40000000 40f675a4 c1979e3a -> c2366cee", + "00000000 4195a4ea c13f5850 -> 4195a4ea", + "3f000000 c193fd46 41828f2b -> bf8b70d8", + "3f800000 3ffcba36 411f9a93 -> 411f9a93", + "3fc00000 c0a56906 c18d3ad6 -> c1bf2b20", + "bf000000 c04e40ec c11aec82 -> 3bef4400", + "3e800000 c13af4cb 4180ff5a -> c0976fd6", + "3f400000 41443426 c19e56fe -> c13c7574", + "40000000 4180be17 40fd605b -> be837a60", + "00000000 c1890e26 c07a04e0 -> c1890e26", + "3f000000 c11a491b 410fd63f -> bea72dc0", + "3f800000 40ed13b2 412d19d3 -> 412d19d3", + "3fc00000 c16d6d1b c166097e -> c16257ae", + "bf000000 3ff016a4 c16ec5b5 -> 41246719", + "3e800000 40a19dd1 4123d814 -> 40cb2267", + "3f400000 c0dac199 c18953ae -> c16955b8", + "40000000 bf951845 40efc148 -> 41813228", + "00000000 bf807f3e 40d1dc21 -> bf807f3e", + "3f000000 41246adf 408df13a -> 40eb637c", + "3f800000 41913170 4121f50d -> 4121f50d", + "3fc00000 c1121e5f c0a1e355 -> c0416d42", + "bf000000 410bcb8f c075f79f -> 4170704a", + "3e800000 c0c12338 c19b4a00 -> c1161235", + "3f400000 c1809b3e 414aee6a -> 40afca62", + "40000000 403ba83b 4163f946 -> 41cc843f", + "00000000 bfc4f113 c0249a2d -> bfc4f113", + "3f000000 c0e0c964 c1300cfd -> c11038d8", + "3f800000 c113dbf0 41237cf6 -> 41237cf6", + "3fc00000 c132ddbd 411d00cb -> 41a27807", + "bf000000 415f1e01 c198d553 -> 41f3c12a", + "3e800000 40f88c25 3fdd01f7 -> 40c8393b", + "3f400000 417fb563 41034f03 -> 4122689b", + "40000000 c1797280 41330eb0 -> 4217e3f8", + "00000000 419e8212 c118c993 -> 419e8212", + "3f000000 c0b25e91 c0ba98c8 -> c0b67bac", + "3f800000 41459bb8 c0e512e9 -> c0e512e9", + "3fc00000 406d60c8 40676aac -> 40646f9e", + "bf000000 419331da 40435ecb -> 41d094da", + "3e800000 4062909b 419c15b2 -> 40f10bec", + "3f400000 419cec59 40d1e8b0 -> 411d2d6e", + "40000000 3eadec5c c10029d8 -> c182e189", + "00000000 c02372d5 c169a036 -> c02372d5", + "3f000000 410b4c9e 412a65ac -> 411ad925", + "3f800000 41398cef c163bd0e -> c163bd0e", + "3fc00000 4127ddbd c0ffa3e3 -> c189d4e4", + "bf000000 41964039 3f905d7d -> 41dcdd6a", + "3e800000 bfe97c4c 40fb358f -> 3f1830ac", + "3f400000 4104b2d3 c08ca03c -> bf9c7b0e", + "40000000 bf35c128 4097c669 -> 4123227c", + "00000000 410845c1 c0db5cd7 -> 410845c1", + "3f000000 41247005 40ab394d -> 40fa0cac", + "3f800000 c087619c c0b20941 -> c0b20941", + "3fc00000 c0a3b9d4 c149d066 -> c182e512", + "bf000000 413942f8 c1100096 -> 41aef260", + "3e800000 40c5b433 412a325d -> 40e96054", + "3f400000 41590c2d 414f634a -> 4151cd83", + "40000000 4093d3ac 3f447b32 -> c04569bf", + "00000000 4174c778 41770638 -> 4174c778", + "3f000000 c0a65120 41889616 -> 40be039c", + "3f800000 418802e4 41751f47 -> 41751f47", + "3fc00000 417beec9 c13b02b2 -> c1cb3db8", + "bf000000 416c7c56 c1476c6d -> 41e3385b", + "3e800000 410760eb 40f50f91 -> 41042aa2", + "3f400000 41984113 418eee44 -> 419142f8", + "40000000 3ff363b5 410eb693 -> 417f00af", + "00000000 4125f690 41740b78 -> 4125f690", + "3f000000 4081a580 c18f8cd5 -> c0de46ea", + "3f800000 41236f7a 41360b1e -> 41360b1e", + "3fc00000 c04abc9d 4130ccdc -> 4191456f", + "bf000000 bfda8319 40c33cb1 -> c0b38f82", + "3e800000 3fccf209 c04e7f70 -> 3ec9d73c", + "3f400000 c08bcd8c c1983c5d -> c175d43e", + "40000000 40a1f0d6 c113af9d -> c1bc2bd2", + "00000000 40d2efb7 c14de406 -> 40d2efb7", + "3f000000 411bdfe6 402dc15b -> 40c7503d", + "3f800000 c08d0a31 c1958942 -> c1958942", + "3fc00000 bed0fabf c0fc04e4 -> c139bfc0", + "bf000000 41863d41 415e73bc -> 4191bef3", + "3e800000 c132571b c11e314a -> c12d4da6", + "3f400000 418a1280 41767c2d -> 417de662", + "40000000 419f19be 40edf1fe -> c0a082fc", + "00000000 c182dfc7 bfd5ddf3 -> c182dfc7", + "3f000000 40080d32 40c2e9b5 -> 40837827", + "3f800000 c12113b7 413263f9 -> 413263f9", + "3fc00000 c14551c5 c17f79fc -> c18e470c", + "bf000000 4106ec10 4125d66d -> 40eeedc3", + "3e800000 40f23004 411cea0a -> 41020c84", + "3f400000 414d60b9 41292f3c -> 41323b9b", + "40000000 40427b3f c18f3130 -> c21b58e4", + "00000000 c186e37b 4124f8c6 -> c186e37b", + "3f000000 c19c4086 4190aaee -> bf395980", + "3f800000 3fe21c48 3f59378e -> 3f59378e", + "3fc00000 c19c739d c0c5777f -> 3f059fe0", + "bf000000 412dd8b3 c142fbbd -> 41b32175", + "3e800000 c186ec91 417e598f -> c10acc76", + "3f400000 412d30bd c07e0c02 -> be8ac228", + "40000000 c147ab7a c1309bb4 -> c1198bee", + "00000000 41178a25 3ff0b52f -> 41178a25", + "3f000000 c1799d5a c10e686e -> c14402e4", + "3f800000 c0dffb7a 4129471f -> 4129471f", + "3fc00000 c17c799d c16af3f0 -> c162311a", + "bf000000 c19a9167 bf92701c -> c1e34699", + "3e800000 4167b9de 418cb835 -> 41742780", + "3f400000 bf8d27ea 4122e709 -> 40eb880f", + "40000000 416e74a8 41441e6a -> 4119c82c", + "00000000 410f4c76 4107c07c -> 410f4c76", + "3f000000 c11d1cc3 c12f16d4 -> c12619cc", + "3f800000 418e7881 41511d21 -> 41511d21", + "3fc00000 c19ce91b c0bc5037 -> 3f7acf20", + "bf000000 40987cce c041f90d -> 410a9cbc", + "3e800000 bfb996cf 417f6bf4 -> 4039d366", + "3f400000 419ed0e7 407d52b5 -> 40fdcfeb", + "40000000 41350406 c07f236a -> c19a4ade", + "00000000 c056e80c c1887453 -> c056e80c", + "3f000000 c0cdbcf1 3fb1629a -> c021644a", + "3f800000 c12b6f9b c0fa9549 -> c0fa9549", + "3fc00000 c15e8a34 bf5bfdb8 -> 40b54aa2", + "bf000000 c173a4eb c0af77d9 -> c1a0ccb5", + "3e800000 41086f8f 417992f8 -> 4124b869", + "3f400000 40d5e5af 414f5086 -> 4136391a", + "40000000 419a6018 4086b429 -> c12e0c07", + "00000000 c08ec10d 40ce3d83 -> c08ec10d", + "3f000000 c05466a1 415dd525 -> 40a8bb7d", + "3f800000 bfdf931b 412fb032 -> 412fb032", + "3fc00000 4181bdb1 413f4fcb -> 411d39ff", + "bf000000 c08bf0d3 418d1aa9 -> c1760f47", + "3e800000 c0e11135 415d10ae -> bfe91244", + "3f400000 41365f09 419197e7 -> 4183fdce", + "40000000 c11c44cc bffe0a7d -> 40b9845a", + "00000000 414bd742 3fcc9f68 -> 414bd742", + "3f000000 c180bb9d 41000e27 -> c0816913", + "3f800000 c0339487 418ad64d -> 418ad64d", + "3fc00000 40d8757c 414e301e -> 417f2acd", + "bf000000 c1907f42 bf8102eb -> c1d4b6cc", + "3e800000 c103d699 c18efd27 -> c12a5f86", + "3f400000 c15a3837 c1226693 -> c1305afc", + "40000000 411a2592 40f48be3 -> 40b4cca2", + "00000000 410354b2 c0b28833 -> 410354b2", + "3f000000 40a38d38 40f29961 -> 40cb134c", + "3f800000 3ec3e8a8 408d79f8 -> 408d79f8", + "3fc00000 41556fd5 4117fec1 -> 40f28c6f", + "bf000000 41626507 4096ec63 -> 4196ee39", + "3e800000 bf699ed7 bfb32587 -> bf8464f2", + "3f400000 bfa97c31 bf653072 -> bf805137", + "40000000 418a0390 c1713c55 -> c23d9ff2", + "00000000 bfbc3841 3eaebd63 -> bfbc3841", + "3f000000 c1562b68 41911916 -> 40180d88", + "3f800000 c0129bb1 c18d54db -> c18d54db", + "3fc00000 c0f1f73f 40525b33 -> 410b6003", + "bf000000 c18addff 40d42677 -> c1ead1cd", + "3e800000 3f62990b 416427fc -> 40875257", + "3f400000 3f26bf09 41303519 -> 4106c2cf", + "40000000 c05e6da6 c17719c8 -> c1db4c13", + "00000000 40de23b5 4130893c -> 40de23b5", + "3f000000 c0bfbb4c c0451d74 -> c0912503", + "3f800000 4140eca2 c0d5847c -> c0d5847c", + "3fc00000 40d97509 41327d13 -> 41555e5a", + "bf000000 410837f6 c113b30c -> 418b16bc", + "3e800000 c0a29067 c129c48b -> c0cece92", + "3f400000 402cf94c 4186f468 -> 41553e31", + "40000000 405fdfe9 41990c86 -> 420b0e87", + "00000000 c10a44fe c094525e -> c10a44fe", + "3f000000 c05ce1ae 40fbd43b -> 400d6364", + "3f800000 4026ce4d bfe824a4 -> bfe824a4", + "3fc00000 414d16cd 415051e2 -> 4151ef6e", + "bf000000 c192b29c c1865163 -> c198e338", + "3e800000 c1806008 418f8543 -> c0f19ad5", + "3f400000 4102f26c c10e49a6 -> c093f543", + "40000000 4182ad9c c1129181 -> c20a9f8e", + "00000000 411329b5 4082a21f -> 411329b5", + "3f000000 3e51caa0 bdf8b71d -> 3d2ade23", + "3f800000 c0935972 c19f3a6b -> c19f3a6b", + "3fc00000 4143cfcd c16a2917 -> c1e092c4", + "bf000000 c18539ba c0903af3 -> c1b5cf39", + "3e800000 40002ce3 c0dbb3d8 -> be5b8420", + "3f400000 c0058b15 4114dfde -> 40ce9e6a", + "40000000 c10ffc02 41583d80 -> 42101dc0", + "00000000 4074afbb 4123bf5c -> 4074afbb", + "3f000000 c147a6cc 4193cc31 -> 403fe32c", + "3f800000 418a1f31 c0675d72 -> c0675d72", + "3fc00000 bfcd5ec5 c181ab11 -> c1bc15a4", + "bf000000 c054d531 419549a2 -> c1651994", + "3e800000 3fc42a77 3ffde379 -> 3fd298b7", + "3f400000 41081f61 4185346f -> 4169d67e", + "40000000 3d1fbfe6 4182fbb7 -> 4202d3c7", + "00000000 c009e70b bf209c5c -> c009e70b", + "3f000000 c1222eb2 becdac5c -> c0a89c15", + "3f800000 410e06f2 413944e8 -> 413944e8", + "3fc00000 401c69d0 c0ab1835 -> c113df62", + "bf000000 419b4925 c1517cd2 -> 420ea676", + "3e800000 4133fb8d 411c2a61 -> 412e0742", + "3f400000 4049223d 41937a43 -> 4169c988", + "40000000 c13da469 c173d343 -> c195010e", + "00000000 40cbcc26 419beaf4 -> 40cbcc26", + "3f000000 40cfe353 41498a0b -> 4118bdda", + "3f800000 40ad7192 411d2278 -> 411d2278", + "3fc00000 c150201a c104468f -> c0bcb392", + "bf000000 c0eacccc 400c8dfa -> c141ab58", + "3e800000 c168855b 416257d4 -> c0eb9c1e", + "3f400000 be546ecd 41139b21 -> 40dbbfd4", + "40000000 405e8ed0 c19b27f6 -> c22910e3", + "00000000 407d73c5 4187e319 -> 407d73c5", + "3f000000 c0b852ab 404e930a -> bfa2124c", + "3f800000 4139eea4 4157d333 -> 4157d333", + "3fc00000 c102aabc 415c68cb -> 41c5f947", + "bf000000 c13e1b10 c12f2fce -> c14590b1", + "3e800000 be1884e0 419b8978 -> 4097f65b", + "3f400000 c1728fb3 c05b7eaa -> c0cb975a", + "40000000 40b08cd0 4144da9e -> 4198b76a", + "00000000 c01e7515 3fffef89 -> c01e7515", + "3f000000 412a62cc 418e7973 -> 4163aad9", + "3f800000 40cb1760 419869a7 -> 419869a7", + "3fc00000 c02b6c82 413e0a45 -> 41993e7c", + "bf000000 3e9e3a10 415a340f -> c0cb5e9e", + "3e800000 40b3f273 4132ca80 -> 40e05b16", + "3f400000 3f6fc217 c19c3356 -> c1668df9", + "40000000 c119f47f c0dcdfa1 -> c085d644", + "00000000 40c06387 413b248e -> 40c06387", + "3f000000 3f30236c c0e02468 -> c04a1ffa", + "3f800000 c124b169 bfbef8b3 -> bfbef8b3", + "3fc00000 40cecaa9 414cbae1 -> 417f65a8", + "bf000000 4124f7f3 40b2c7ab -> 414ac201", + "3e800000 c1294f25 40988518 -> c0d7d572", + "3f400000 40897123 c1083770 -> c0a9f6df", + "40000000 4116c795 c140d443 -> c2061c07", + "00000000 c083300b c053a8ed -> c083300b", + "3f000000 c14f823b 416b29b9 -> 3f5d3bf0", + "3f800000 c17a9284 41968be3 -> 41968be3", + "3fc00000 c17d93c1 414291c5 -> 41d15244", + "bf000000 41748eab 4151af07 -> 4182ff3e", + "3e800000 418772d2 3fdad4a0 -> 415202e0", + "3f400000 c197ef47 411f0885 -> 402d3b02", + "40000000 c1808b77 4111fb1b -> 42094349", + "00000000 41774dfb 41832b7e -> 41774dfb", + "3f000000 415b0ade c0ed448d -> 4048d12f", + "3f800000 41654d35 3f0d4280 -> 3f0d4280", + "3fc00000 bee83798 41362d36 -> 418a7257", + "bf000000 c1445d80 3ec9e1f0 -> c194d9e4", + "3e800000 c14e9eee 41071165 -> c0f265b2", + "3f400000 c0374b0c 4195d1ad -> 415545d3", + "40000000 c0ac6476 c12f4bc9 -> c18432ac", + "00000000 c10fcf3a c19497d1 -> c10fcf3a", + "3f000000 c10b082e c0daa716 -> c0f85bb9", + "3f800000 c17e8d1c c0db9ebe -> c0db9ebe", + "3fc00000 c1405230 bfa276df -> 4083659c", + "bf000000 4199a5c0 416b2fd2 -> 41abacac", + "3e800000 3ec0ff60 4152948a -> 4064ac7b", + "3f400000 413deba5 4011cbb6 -> 4095a237", + "40000000 40772b84 c1351677 -> c1d3fbe8", + "00000000 40f16e0a c13168a8 -> 40f16e0a", + "3f000000 413222de 412131f0 -> 4129aa67", + "3f800000 4037fdb0 c15afa2d -> c15afa2d", + "3fc00000 c117d571 c13b95d9 -> c14d760e", + "bf000000 c15ddf38 c1356d46 -> c1721831", + "3e800000 c0aeae82 40a31355 -> c0347c1a", + "3f400000 40c9c3d9 c0d1111b -> c054b7bc", + "40000000 4098d41c 410ef1ef -> 415179d0", + "00000000 3f366b8d c0f87ad3 -> 3f366b8d", + "3f000000 c175b4d7 c15a3be5 -> c167f85e", + "3f800000 40604605 4107581a -> 4107581a", + "3fc00000 406a4657 405e38a4 -> 405831ca", + "bf000000 4109bf49 bfe02ab3 -> 415ca199", + "3e800000 4158bcaa 40ae3208 -> 413853c1", + "3f400000 4156087b 404bc268 -> 40b76d24", + "40000000 412c0bbf 4173d7ac -> 419dd1cc", + "00000000 bffd1a55 40c334a1 -> bffd1a55", + "3f000000 418e8297 4193ea33 -> 41913665", + "3f800000 c132825a 41056dba -> 41056dba", + "3fc00000 41687a55 3ebdd459 -> c0d6ae6d", + "bf000000 4197efe0 c0360655 -> 41ef4835", + "3e800000 4050c64d c16ec39e -> bfa45dc8", + "3f400000 c13b7ce1 40b03e8e -> 3f99c1e6", + "40000000 4153dd8b c1807e9e -> c2357601", + "00000000 c13dfdc6 416e3089 -> c13dfdc6", + "3f000000 4185aa8c bfda900b -> 40f00317", + "3f800000 4058020d 3fd7073e -> 3fd7073e", + "3fc00000 c1233cb1 412f65a4 -> 41ac5b67", + "bf000000 417d2c9d 416de945 -> 41826725", + "3e800000 c19e2b4c 40d0326c -> c1533aa4", + "3f400000 c08570ae bf07d625 -> bfb860fc", + "40000000 c1104538 c13f8a10 -> c16ecee8", + "00000000 c100376e c1913381 -> c100376e", + "3f000000 40b48601 c0fd4b24 -> bf918a46", + "3f800000 c16e1857 c0ed56c7 -> c0ed56c7", + "3fc00000 c0aa0e8a 3f150bdd -> 4061f2fd", + "bf000000 41709603 bfd70cb7 -> 41bb28e8", + "3e800000 c15a1ac3 40bab135 -> c10c3deb", + "3f400000 41890ee3 c042c3e4 -> 40000adb", + "40000000 c0590c11 4101e8a8 -> 419d0a2a", + "00000000 41990949 40a74fd8 -> 41990949", + "3f000000 c163ad72 c18c3739 -> c17e0df2", + "3f800000 41102239 411de877 -> 411de877", + "3fc00000 c17b7424 c11faf13 -> c0e39914", + "bf000000 4168bbc4 c0a03aa5 -> 41c29428", + "3e800000 c19c2343 c096aa0f -> c17d0a26", + "3f400000 c10384c5 4114a97d -> 409d3bda", + "40000000 c15cff9d 4180df12 -> 42381ef9", + "00000000 419e313c c0f975ae -> 419e313c", + "3f000000 c137fa85 41857e34 -> 402603c6", + "3f800000 c18884ef 4114d699 -> 4114d699", + "3fc00000 c137f50c 4150b8a3 -> 41ca87bd", + "bf000000 413f5e7c c093ace3 -> 41a1fc79", + "3e800000 bfdbcba4 41545cb7 -> 4001f05a", + "3f400000 3f5e63c8 419d16d8 -> 416f1bd3", + "40000000 c1241213 c16e97c3 -> c19c8eba", + "00000000 3d003884 be94ecf7 -> 3d003884", + "3f000000 408fc8b3 c168f09c -> c0a10c42", + "3f800000 412c5758 411d8f51 -> 411d8f51", + "3fc00000 413c6215 c183bcaa -> c1f4b384", + "bf000000 c120e233 c0a1c3df -> c148e254", + "3e800000 c19bc09e c184f375 -> c1960d54", + "3f400000 c188e6a0 41597021 -> 40bd4192", + "40000000 4197ef73 c19b45db -> c2673d94", + "00000000 4159c611 c096df9d -> 4159c611", + "3f000000 c11813c9 414c3b81 -> 3fd09ee0", + "3f800000 c08010a5 c18e9180 -> c18e9180", + "3fc00000 411c5f8a c147ca9e -> c1bcefd8", + "bf000000 4193ae83 40c68e68 -> 41c4b3f7", + "3e800000 bf2ad4bb c13be3a8 -> c05beb8b", + "3f400000 40c20b52 c128dfcf -> c0cccce2", + "40000000 40091752 3f02bde3 -> bf8f70c1", + "00000000 c19bb1e1 409ff7f8 -> c19bb1e1", + "3f000000 c0aefb06 412f1512 -> 402f2f1e", + "3f800000 c1130de6 3ef5a3be -> 3ef5a3be", + "3fc00000 c0e638d5 c1864a8a -> c1aca8b4", + "bf000000 3f398c64 c1947296 -> 4125d7bf", + "3e800000 c1339737 41906366 -> c079fed8", + "3f400000 c11c3a91 4143e365 -> 40d7b7d0", + "40000000 bf9e7bdf 416c0fff -> 41f5f7bd", + "00000000 c1390753 411eabb3 -> c1390753", + "3f000000 bfc8d552 c0eb7e91 -> c08ed9f3", + "3f800000 c09f91a4 c19e12f5 -> c19e12f5", + "3fc00000 c14c8ce7 c151be0d -> c15456a0", + "bf000000 41236ec3 bfdcdbbf -> 418179f0", + "3e800000 4195b94e 4176a498 -> 418f1f8e", + "3f400000 c136ffea c182aabf -> c171c018", + "40000000 c0eb775a c14f3ea6 -> c19460d0", + "00000000 c01c3866 4148f70e -> c01c3866", + "3f000000 c1542c2f c0e7d4c8 -> c1240b4a", + "3f800000 4182abe4 3f3cf8a9 -> 3f3cf8a9", + "3fc00000 41895571 be65b86c -> c10eb7c4", + "bf000000 416c1c6a c129cd48 -> 41db88a2", + "3e800000 4172cd4d c0e80b8d -> 41191888", + "3f400000 c166292c c0c89e9b -> c104c5c5", + "40000000 c04f25d5 c0047db9 -> bf675674", + "00000000 419c13f9 c1975350 -> 419c13f9", + "3f000000 bf43d005 c19a7833 -> c12096b3", + "3f800000 c13f7198 3d4f5a57 -> 3d4f5a57", + "3fc00000 4148b825 40922efb -> 3f147298", + "bf000000 40b27e8e c18aa407 -> 41884178", + "3e800000 4076814a 4084e8e8 -> 407b556c", + "3f400000 408dd4a6 4164eea7 -> 413d6d92", + "40000000 c19131a8 c1615cea -> c1205684", + "00000000 bf2759c5 c02afbb1 -> bf2759c5", + "3f000000 416ae775 40559fd9 -> 411027b6", + "3f800000 bf7710d3 418f6e49 -> 418f6e49", + "3fc00000 417dbf83 412a34f9 -> 41006fb4", + "bf000000 4194a9d5 c0e31b5a -> 41fb622b", + "3e800000 c0bbabe5 4169c6ed -> bf3eebac", + "3f400000 c0b6b2de c17246a4 -> c14c8b57", + "40000000 c1086791 bfd03813 -> 40a8b318", + "00000000 c13342f9 418eb9b4 -> c13342f9", + "3f000000 4089d2f9 c111a777 -> c0197bf5", + "3f800000 c118b412 c17b2d04 -> c17b2d04", + "3fc00000 c19753db c145e210 -> c1117f3d", + "bf000000 3e885b9d 4182cad8 -> c0f8cd19", + "3e800000 c0a3a22c c19c437a -> c10b7e8e", + "3f400000 bfc77a83 41393fbd -> 4104b3fa", + "40000000 bf94b558 c18507e9 -> c200623e", + "00000000 c1371f83 c18893d8 -> c1371f83", + "3f000000 419450ca 4096df84 -> 413a08ab", + "3f800000 403d1bd4 c1020920 -> c1020920", + "3fc00000 419023a2 c19a94d2 -> c217f886", + "bf000000 416bd227 c0c24968 -> 41c926ca", + "3e800000 41265574 c096ef83 -> 40d3c44d", + "3f400000 40d21396 409a6ee8 -> 40a85814", + "40000000 4151f14f 40befa2e -> bf97b908", + "00000000 c132fb88 c09cc0b8 -> c132fb88", + "3f000000 c156658b c105e0e5 -> c12e2338", + "3f800000 c0e1b23b 414cf739 -> 414cf739", + "3fc00000 404a0537 41990d69 -> 41d8f3cb", + "bf000000 bf06e318 419e0b1f -> c12ab069", + "3e800000 c059bf32 c1414a8b -> c0b24cf8", + "3f400000 c1212a0f c1607840 -> c150a4b4", + "40000000 c16bc781 417979b0 -> 4237aeb8", + "00000000 c18069e9 413940d1 -> c18069e9", + "3f000000 418b4374 c1003c7f -> 40964a69", + "3f800000 4114531c c139b889 -> c139b889", + "3fc00000 c0e3ce0a 4189e00f -> 41eb49d7", + "bf000000 c0bccf96 c0c5644b -> c0b8853a", + "3e800000 40bb32de 415be3be -> 40fa5805", + "3f400000 4116eff8 c10cb4a6 -> c08796fd", + "40000000 414d0023 4123286f -> 40f2a176", + "00000000 413bf12b 41967d41 -> 413bf12b", + "3f000000 c1239a66 c135c383 -> c12caef4", + "3f800000 4178866b 3f1c919d -> 3f1c919d", + "3fc00000 40569ad4 40e46d66 -> 41107eb2", + "bf000000 c02d74d9 c19dcf20 -> 40b9869d", + "3e800000 c19959a1 c018e02e -> c16f9475", + "3f400000 c072db16 40bd3e77 -> 405f26ec", + "40000000 c11d5622 c198ac5b -> c1e2ada5", + "00000000 c10d4631 406e8a85 -> c10d4631", + "3f000000 40445c8c c1964349 -> c0fb6f6f", + "3f800000 c154377f 419a891f -> 419a891f", + "3fc00000 4157dd6e c186cf4c -> c2001727", + "bf000000 c16c3e67 40ddab5d -> c1cce439", + "3e800000 c1311985 c0870134 -> c115b34a", + "3f400000 3f0a8e3d c0276566 -> bfe9c651", + "40000000 409ab3db 40814be2 -> 404fc7d2", + "00000000 c0b86df8 c10c291b -> c0b86df8", + "3f000000 411df265 c1821081 -> c04c5d3a", + "3f800000 40841e47 c117053c -> c117053c", + "3fc00000 4120e780 c1138f5b -> c196e564", + "bf000000 405c745c bfe137c9 -> 40c17e3e", + "3e800000 bfde35a4 c1894a29 -> c0b2f438", + "3f400000 c0958d66 c16bbcb6 -> c1437f35", + "40000000 c17576c9 c113c2a5 -> c0483a04", + "00000000 c18cac71 40de6f3e -> c18cac71", + "3f000000 41422144 c0a08cd6 -> 4063b5b2", + "3f800000 3eb0f62c 415bb8e5 -> 415bb8e5", + "3fc00000 4181c4d9 c0a7c09a -> c17f954c", + "bf000000 41487dc7 4140bcd2 -> 414c5e41", + "3e800000 c0b42a19 417d7fcf -> be85fab8", + "3f400000 41345034 c0f8a49e -> c040a6b8", + "40000000 c0fb9569 c19130c4 -> c1e37c2e", + "00000000 c0f6bfe2 40885dab -> c0f6bfe2", + "3f000000 bfb38ee9 c1935b2b -> c11e941a", + "3f800000 4194b9ce 418f69d0 -> 418f69d0", + "3fc00000 c11f317e bf8882e8 -> 405800ce", + "bf000000 40ef1839 c1250c8e -> 4182ec39", + "3e800000 c150e5e6 c0a5f8f0 -> c1316b8a", + "3f400000 3f739c18 c19dec14 -> c16913ae", + "40000000 c0d6d9e1 417be077 -> 4218cb78", + "00000000 40439d91 c1088107 -> 40439d91", + "3f000000 418ba665 4154019c -> 4175a733", + "3f800000 40c9fa50 41040dc2 -> 41040dc2", + "3fc00000 4198b993 4170158a -> 414f66bd", + "bf000000 c12322d4 c18d7701 -> c0ce7a7a", + "3e800000 4172d557 c1800181 -> 40ec3e81", + "3f400000 4160beaa 419bad65 -> 4190d9e1", + "40000000 c132f286 c08f3bff -> 400eda1c", + "00000000 3c7713fb c19e44c9 -> 3c7713fb", + "3f000000 c12f2bc5 c12fad26 -> c12f6c76", + "3f800000 c0b9dd70 40983b1f -> 40983b1f", + "3fc00000 40c928fb 419ddb09 -> 41d3a36f", + "bf000000 4180ee62 40bd0b79 -> 41a9c424", + "3e800000 417fcedd 4089558c -> 415105d8", + "3f400000 40421b79 406bdcb4 -> 40616c65", + "40000000 c18c394b c0230c1e -> 4146ec87", + "00000000 40788e16 c08289b9 -> 40788e16", + "3f000000 c1689cce 416cf552 -> 3e0b1080", + "3f800000 40def49d c0644ea9 -> c0644ea9", + "3fc00000 40203fc9 418463ed -> 41bc91e7", + "bf000000 c159d447 409a5acf -> c1b6aa8f", + "3e800000 c19619aa c1329a6c -> c186e68d", + "3f400000 3fb5db46 40ac60ea -> 408ca664", + "40000000 413768a5 418e6402 -> 41c113b2", + "00000000 c1190911 4196ace6 -> c1190911", + "3f000000 4046888f 4136a8da -> 40e84afe", + "3f800000 40bbca58 417b3848 -> 417b3848", + "3fc00000 c011a87b 4150f24d -> 41a5d042", + "bf000000 c162a836 3fb24d32 -> c1af9092", + "3e800000 c19b2fd1 40979b50 -> c155d450", + "3f400000 c180f8e5 bfed88aa -> c0ad8285", + "40000000 41988c0f c0043ff9 -> c1b99c0d", + "00000000 c18aef9f c0c154a9 -> c18aef9f", + "3f000000 3e38920b bfc01b7d -> bf29093c", + "3f800000 c18cd7a6 411a284f -> 411a284f", + "3fc00000 c0e9e4c9 40c12377 -> 414b53cb", + "bf000000 415decf6 c0be44bd -> 41be3a50", + "3e800000 c14d5b9d c155fb03 -> c14f8377", + "3f400000 3fbc3f44 408c6996 -> 406a264a", + "40000000 c1794d90 4182df59 -> 424132bd", + "3ebd50f7 4122b15e c19bd731 -> bf4b5fe8", + "be97cc07 3dc7c0e7 4120dcb6 -> c036acf8", + "bd4d184b 40e62c29 c111be21 -> 4100257f", + "3eabda05 c182d43b 3f25886e -> c12a5c4f", + "3f6ea086 417a8924 c1590108 -> c139467c", + "3f4e3f40 4163868b c134322b -> c0c9e9a8", + "3fa93f33 c1549c44 c08705ae -> bfa6086c", + "3f4f2a69 418e56fa be82cb54 -> 404bfd88", + "3f72d1a6 40e79553 c184c49b -> c175e6e8", + "be637261 419dbfaf 41504632 -> 41a9a822", + "3e0c6307 c170a323 40d9ae4e -> c140b99f", + "3f999754 c19bcdda 40d313bc -> 413cf061", + "3d8930fe 4137927d 41597506 -> 4139d794", + "3f9f21aa 416c48bd 4141d6f9 -> 41378442", + "3f73ae45 40557a8c c09b1e82 -> c08e849b", + "3eb6b5e7 40930853 4182f642 -> 410cc031", + "3f2b1500 c16c6904 40294c73 -> c04889f2", + "befb401d c0e61fde c01c594f -> c1185850", + "be9bede8 c030fbf8 c18ce716 -> 3fe0d1e8", + "3e305fec c0e22374 40faa847 -> c09003c6", + "bed45d16 3fd2e8c0 40d11cf3 -> bec23238", + "3d1734d1 c11dcfd5 417f6f62 -> c10e8e7d", + "3f99ab02 40f40e7e 41937ee0 -> 41a4d67d", + "3f5c350e 413af1c7 c1400c3e -> c10b0f10", + "3e9d21dc 40fe18c7 bf8bff38 -> 40a55f9f", + "3fb0282e 40022e3f 4186e482 -> 41b38544", + "bdd07999 c19d9d70 c14df714 -> c1a32d21", + "be7d3661 4145fad0 41149cca -> 41522fea", + "3f0c56a5 40ce8d41 c10ee8b6 -> bffd74ac", + "befb792a 3f53795b 413ab0d7 -> c08ff8d2", + "3fb804dd c0dd05ae 41096af9 -> 4175ec70", + "3f9a728c c142f500 c0890170 -> c0297fbe", + "3fa9a44c 3eb9ab8f 415ab2a8 -> 418ffaaf", + "3f8a1513 c09feae2 c121e748 -> c1285bab", + "3e7d78fd c199f8d2 3f8ffd18 -> c1634345", + "3f7e4bde 410b02a1 40f93c34 -> 40f96d3e", + "3e6e4a60 c13e247e 4183144a -> c0a9c774", + "3fab2ab7 3f585488 40c47aeb -> 40fd9f35", + "3f3f4962 c0dc23eb 40ef2515 -> 40761668", + "3f5fba47 c05a36d8 4174db10 -> 414f1c6c", + "3ea75ebf c12d45d4 3de2af3d -> c0e81a91", + "3d696ee4 4153bda7 417fc62c -> 41564015", + "3fa9e9e8 4181e5eb 4025a6d4 -> bff0c660", + "3f1950aa c0344726 bf7ec523 -> bfdce9b2", + "3f2eaa21 40b7c729 c16aea99 -> c10315bd", + "bd9e4720 c187a612 c0acce71 -> c18ecb1d", + "3fa62922 4162919e 40f1f60a -> 40b300c3", + "bee8582d 411ff110 c17c0829 -> 41ad7278", + "3fb6a79f 416b5da8 401bc84e -> c033b21e", + "3f9438e7 40e70b52 4113a5f2 -> 4118b946", + "3f926207 40b661ab c19b474b -> c1b82097", + "3f4df372 40891f55 4112256e -> 4102fa60", + "3f9dcb2e c17b627c c169a178 -> c1657f8f", + "3f2b92ad 412a8658 415d4e33 -> 414c8eef", + "3f154ad7 bfc2c697 c03aab61 -> c015745a", + "be9eec7d c043ba3b c19d956a -> 4006d40e", + "3f310ef1 c0d8e4bb c0bcdcb9 -> c0c5818f", + "3f614a59 3f6ec794 415a6436 -> 4141fbcd", + "3de8473a 41240f99 40ea0968 -> 411eb9ba", + "3f80a844 c0e4820d c0c1e53b -> c0c1b7bb", + "3ebaad22 411df126 40cb56bd -> 41096cc5", + "3e2e58c7 c14ef838 c113cd49 -> c144e54b", + "be2f465e c16f4657 3fad636e -> c18df862", + "3e5a37b9 c11f4cd2 3fedec8c -> c0ee07a5", + "bdc7f70b 419048b7 c18a71b7 -> 41abe3b0", + "bec14b27 bfaeea9d c148da76 -> 4036d577", + "3ee13590 c14bbb67 408457ce -> c0aa060a", + "3f4a673a c14933ab c1166770 -> c1210a09", + "bd7e2b61 c04ae306 c0117701 -> c04e7334", + "be1d32cc 41302f0e 3e30596a -> 414aceb9", + "3f777ab3 41303b5c 412db782 -> 412dccf0", + "3dc498ff 416399c6 418df038 -> 416900be", + "3f3c59cc c19330f6 410cf7a3 -> 3fcf6470", + "3f280524 c0f42976 418d3129 -> 410f6184", + "3f9fa3c7 bf969d2b c193c8b4 -> c1b5fcbb", + "3fbef442 413f731f c0a02436 -> c1559cc5", + "be5363a6 c16473c9 c1653acb -> c1644ab4", + "3e824ff1 3f260f6a 4181d5d4 -> 4093a7b4", + "bdfbc462 c172b4a2 40b8fa0b -> c18df4be", + "3ebca098 41536920 419bad8b -> 41783b52", + "3f6feb90 40bf32a5 40b671f9 -> 40b6feb7", + "be056e42 4151dddf c12955ee -> 4181a397", + "3f5fce9c c13cbd7f 41845702 -> 414fa919", + "3f90221b 40880876 41991f6a -> 41a822d1", + "3ef0557e c13e9960 3e9acd01 -> c0c5b8b0", + "3f99061c c14241be 417ec4c2 -> 41ab46ba", + "be23b482 c1809607 41690b73 -> c1a7c567", + "bd9f512f 419b4249 c123d310 -> 41adb577", + "3f2ed008 4054d849 411b1150 -> 40f587b8", + "bed70e08 40aea7e9 c1492a2a -> 415080d2", + "3f578deb c0b371f2 c191be73 -> c181ce30", + "bedc7488 3e7d1cdb 419d83a9 -> c101fc76", + "be9ddc1d 40ab5062 c1210643 -> 4121b6bc", + "3d2227cd c020e6ec c13edef8 -> c038c1ec", + "be3efb5a c0cfa327 bd5fbcbc -> c0f6096f", + "3fb39079 bfcb4585 416ebe9a -> 41ac9434", + "3e9869e3 bfa07949 c19cbd6e -> c0d6cfa2", + "3faa5502 c12c1363 c15af9db -> c16a7ca0", + "3f0d1308 41830a67 413ca09d -> 415d9a5a", + "be2f2c37 c14d7d62 418c38aa -> c1904ef4", + "3db9dc31 41387c9c c17ff62f -> 411083e3", + "3f481e10 c0c45b90 c13acaca -> c12772d9", + "bef060c9 4182f1c2 c19583b9 -> 42034eec", + "3f5e4960 c0b1cd32 402decf5 -> 3fd06182", + "3f946a84 c13e77e8 bf7cba89 -> 3f4109c2", + "3f97c94a 419197a3 c119e1c7 -> c16c96bd", + "3f4ae1e1 c17be428 413930fc -> 40bd005d", + "be94dcb1 40ec35fa 4046d97f -> 4109fd8d", + "3ea1c545 401f2469 419a97ac -> 40f9cf1a", + "3ee730d0 419b19cb c10ebab2 -> 40d35dcc", + "3f4c3e63 c1796628 412e4d25 -> 40b147f6", + "3f6825eb 419d5599 417452b8 -> 417ae098", + "3f1f68b7 c089649a 419f344b -> 412c59bd", + "3e8e2da9 4154038e 41072bcb -> 413eacdd", + "3f8d12fc c1863263 41927806 -> 41af22f5", + "bedfbb60 41995597 418d5ba2 -> 419e9158", + "3f78b799 416aa9ce 411fa2bb -> 4121c525", + "be57a164 c134a4d9 c046ca87 -> c15037d6", + "3f04020c 40c1653f 4192072f -> 41456f7d", + "beaf2fb8 40fe8298 c19f813e -> 418bf988", + "3fb87ec1 40d9d6da 40cc27ce -> 40c61dac", + "3f7bd949 4047d39b 4160e1b2 -> 415e0b8b", + "3faa0b8b 417e23ff c13477bf -> c1a19d05", + "3ef0c1d5 c18ad39c c029110a -> c126f7b8", + "be24320c c15d58cd 3efe457a -> c1810e82", + "3f38757d 410f2796 4121de95 -> 411ca3b4", + "3f124995 c0e9e5b7 4135b67e -> 4056de46", + "3fabad88 c1057271 c1343b3c -> c144321e", + "3efb201a 3d54b71a c18a565d -> c10747a4", + "3f194ef5 4115cae3 c1792dd2 -> c0b2459e", + "3f340ae3 41096433 c0c0d5c4 -> bfd85ac8", + "3d03f1c9 418319e5 411263a1 -> 41813c5d", + "3fa86c7e 4189bdca c04e07bd -> c11ac650", + "be90ed21 c194244c 41864728 -> c1e41551", + "3d1446b4 bffd2219 c166b7e5 -> c01b64a2", + "3f695982 bf8995c9 c0db830b -> c0cb221c", + "bee806e3 c1956c0f 4101b762 -> c1f68774", + "3f8a56bb c16db6a5 c080f3d9 -> c049ef30", + "be0b7f5a 403982ac bfafb3ba -> 405ebffb", + "3e92d478 bf95f5db bff1b776 -> bfb04624", + "3fa754cc 41708f3c c0e71b85 -> c160fa82", + "3e422589 c1949f6d bfa2006e -> c174ba6e", + "bbc1a3ce c18dca9a c0eff164 -> c18e465c", + "3f06ea90 40c3cb59 c01f7e04 -> 3fca51d8", + "bde39081 409449af 40a48551 -> 40927bed", + "3f2420b2 414ccd5b 417f1099 -> 416d06da", + "3f957856 40e63d97 c1403c96 -> c173ca89", + "3fba03eb c169ad8d 408ea9e6 -> 4151936b", + "bd279dee c1171469 c18560ec -> c1125891", + "3db45281 417ff04c bf86fed8 -> 4167eb03", + "3faefdfe 40e00afd 4185e0fe -> 41a27761", + "be6b0736 bdced068 c1432e42 -> 402b3eb4", + "3f3b61a3 c182640b c106ae17 -> c1287b00", + "3d49c15f c17e6186 c17cf9e6 -> c17e4fcf", + "bedee4f2 c1121937 c02691a5 -> c13f9292", + "3f52aaed c0b80504 c0512504 -> c06d4813", + "3fbd5dd4 c181a9cb 412896c1 -> 41badf0e", + "3fb021e9 404e42cb 3fdef7af -> 3f97b040", + "3d633ab0 c12c56a5 414b4d62 -> c1177fdc", + "3e09bb96 40e4024f c0871513 -> 40b32bea", + "befce248 c19f2813 c0c5b477 -> c1d55a96", + "bd64aa6d c10ea0fc 41220b2d -> c11fa33e", + "3fa4fc1c 402fb8f6 bfce7cbc -> c037d962", + "be519ba7 403085c8 c1425f4c -> 40b9e6f4", + "3c26fa0f c128febe 4196e84a -> c1243265", + "3f7ff4b9 414b6b77 41356c99 -> 41356d91", + "3ea50e43 c0b81f66 c1020122 -> c0d09620", + "3fba4e5e 40ce70d5 c0793491 -> c109b300", + "3fb81a48 c144b7e5 c17c4287 -> c18a4d4b", + "3fb62280 405df9e1 c014c4f4 -> c098c8b2", + "be1d4eb6 c129cb7e c192981a -> c116d6d2", + "bef75171 40f220fb 40f50e06 -> 40f0b72a", + "bedbccb5 408b4d3b c100055f -> 411a82b6", + "3f7b9bf3 c02a79ac bf3407fb -> bf3ca39a", + "3e231923 c11453a6 417ca1e4 -> c0a8ed70", + "3e854696 c091bca3 4069ede9 -> c01ab589", + "3bbf20ef c08a6e2d c18900eb -> c08cd1c3", + "3e18dc18 c122d257 419079e6 -> c0bec3a7", + "3f2d0fb9 414f2aec c18ad743 -> c0f13399", + "3eb8ecfd c13c4040 4124bb58 -> c07309cc", + "be5f5480 41800f09 41923017 -> 417835ae", + "3f3da409 4185b769 bfbe32fd -> 404ed7d0", + "bd82c849 c077aad0 c09f5166 -> c07322a3", + "3e7fe1b8 40c3df49 3f5e80b8 -> 4099e075", + "3df13ba1 4167c7d1 3fbfe901 -> 414f4e0a", + "3f8869ba c124da20 c12de896 -> c12e80f8", + "3fa35ee4 c16bc549 c160db86 -> c15dd783", + "3f279b27 406a97d1 c0240bd7 -> bed3345c", + "beea1e58 c18d162c c17f50da -> c1933a20", + "3f1e0bf3 c08a2237 40e7288e -> 4033b657", + "3f040cac 412f6c3c 4181bc33 -> 415ac6ab", + "3f8c49df c0680301 4129263c -> 413ef4fc", + "be6a0a5f c1931071 41835883 -> c1d2b23e", + "be749e76 415bc245 c019992e -> 418cb6f2", + "3eb5889e c18bfb6c c12a55ab -> c171181d", + "3f9cb570 c1572cc1 4184744b -> 41ba4ae2", + "be401a62 411d660c 410af3ad -> 4120dbf7", + "3f2bc4e6 bf9bfac4 c0374dbe -> c014a710", + "3f0efd0c c13f9c93 40578dfe -> c059f376", + "3de81a39 c16069be 4088fa8a -> c13f37d3", + "bee97f05 410c409d c102d61b -> 4183f0da", + "3f008477 41830861 c184ca86 -> be34cac0", + "3f97bb2d c19fbdbd c0888bc1 -> bfad9732", + "befb34cb 411fa9d5 c1936e80 -> 41bf55e6", + "be353507 c1822734 c1676617 -> c184b5fb", + "beac3089 41745082 3e69acec -> 41a2a02f", + "3f2203f1 c0c4672e c18d4db3 -> c156e81e", + "3a88ebb6 c16c6570 41842aaa -> c16bdf88", + "3f86b0d1 c11b9b88 418dc289 -> 41993c99", + "bece3bdf c0c9668c 4023cdd7 -> c11dc1ec", + "3fab87e7 413d1ced bf467465 -> c0a1df4a", + "3f702260 c15890e7 c07021d6 -> c08b77f0", + "be5c9f04 c19c9faa 412d62ca -> c1d10bdc", + "bd1e8319 c00cbcc2 40809234 -> c01c228d", + "3f664f91 41942df5 c038070f -> bf3a6a90", + "3f74aada c1754827 c152032c -> c15392de", + "bded4b0f c102e315 c15a6c05 -> c0f17d4d", + "3f3e743a 414d74ae c104c6e0 -> c038b454", + "3fa1b247 3fde57ff c185562a -> c1ac189d", + "3fa3e3ea c11aec26 419b3fcf -> 41dc7fe7", + "3f5b8710 c0bc87b1 c00a1d89 -> c02c286d", + "be1b2811 c0932f9e 4137cc1f -> c0e12f82", + "bea97787 40ff90b5 c11f4d06 -> 415ecdee", + "3f03b1bd 41393cec 4144929a -> 413f11a3", + "3e25b419 c190406d 411a1fcc -> c158e09e", + "3fbf5239 c1831bf5 bf8a7e5b -> 40cfaf8c", + "bdcfbc4d c0ecbbcc 40d8ece7 -> c10d5ff8", + "3e4233fc 40827684 c19b3ac9 -> bec09a18", + "3f3477c1 c0d53acc 40795db4 -> 3f47dc78", + "be9b84b5 40d8fa79 c153f9dc -> 414dd45a", + "bec2efe6 c1865975 41970323 -> c1f2ff40", + "3f4ddc20 c0c4a198 c13da363 -> c12bc075", + "3eb2c6c5 c11a1925 be44cec8 -> c0cabaeb", + "3fae68df c0ad7ad5 411596d4 -> 416b46ba", + "bd9d99c5 4026e5cb 40faa0d4 -> 400d2ae5", + "3e300562 40612b64 bdea4b82 -> 4039348e", + "3fb72c08 c0c6e491 c12eec5e -> c14f74ca", + "3e44c41b 40857b54 bfeaa799 -> 40411ecf", + "beabccee c0c985e6 40edc248 -> c12e762a", + "3f83b700 c0d7d5de 4135fec0 -> 413e68b6", + "3f63dd9e 411e9118 c0c9a818 -> c090a44b", + "be8dda98 c193511e c0d88bf2 -> c1ad221a", + "3f8cbd44 c13ff616 4188dc2c -> 41a008a3", + "3ed1e597 bd9f395e c0807dbe -> bfd892fa", + "3f955852 c18f7f10 c0a00874 -> c03601a7", + "3f9b949a c1859c50 c0f1d2be -> c0b2c596", + "3ec34fc0 c00b4071 407bab3b -> 3e1df350", + "3c8f3b31 4122f7ff 417cf1f0 -> 41248aba", + "3e880c88 c1606ffc c06c2155 -> c1347c68", + "bda3cef9 40ad39c3 bfddb89f -> 40bf83bc", + "bebb8ec6 3fd7cec2 40f97148 -> bf0d498c", + "3e1220ff c109cb06 4184dd8a -> c0a06ace", + "3f717e00 416114e7 41810f17 -> 41801f73", + "bd9eec48 4113960b 40e553be -> 4116240f", + "3dbc807e c02485fd 40ea97be -> bfd46424", + "be515fad c19ff3b5 410bc825 -> c1cef27a", + "beae1e18 3f82ce11 c13329fd -> 40a5ae0c", + "3d1da6fb bfe2d94f bf8dfea6 -> bfdf9538", + "3f7cebe3 40ca825f bfb2332d -> bfa650d2", + "be3d4e50 c14b9d7c bf3d526e -> c16f11e1", + "3f980a24 c076ddad c18651b0 -> c199c001", + "3ee29289 40d22029 419a9d2f -> 4143692e", + "be571596 c199b9d4 40de894d -> c1c5b357", + "3f166a31 41204ed8 c0df3c38 -> 3d093500", + "3f0bc66d c1994bbd c163b943 -> c183c3d8", + "beea6b68 c082986d c051c7de -> c08e5d4f", + "3f271154 403b27cd c19a199a -> c138e138", + "3f09f665 40c1d932 c191ea04 -> c0e1294f", + "3fb1f510 4190dd62 4114a12c -> 40bb1e77", + "3f8ebb43 c192a2ff c19a4669 -> c19b2775", + "bec8c467 3f4c9c5c c1619c4d -> 40d48a31", + "3f89cde5 410c47a5 40a9eb05 -> 40a1717f", + "3e1238e7 3fc67e79 c15db1d5 -> bf2635f8", + "3f6acd63 c11cc666 bf5a6363 -> bfcc0132", + "bdecb71f c0ddccf1 416e5cd1 -> c11744f4", + "3f44e4ac c0e4f13f 40bca33c -> 403872e0", + "3eb5a23a 40975b65 c139eff7 -> bf890b76", + "3ddb912a 41422442 3fca3c2f -> 413009b0", + "3f9e9003 3f620a1f 40d27279 -> 40fdf2fe", + "3f9e0631 419557af 40480bd3 -> bf0517b0", + "beb79ce4 41881fc1 c016511f -> 41bfadd3", + "be084b7c c0160738 41830169 -> c09abeff", + "be3b83de 40e5b18f c1999f04 -> 414023cd", + "bdb3ef11 41626044 4170a072 -> 41611fbe", + "3e732f38 c1750e40 c122817d -> c161738b", + "3fa9ce2d 4180010a 4196fd0d -> 419e7ecb", + "3e6ca1f2 410e4444 c1950554 -> 402211c6", + "befde7a0 418e4a98 3efcd491 -> 41d2e54d", + "3c8e5482 bfb2b6c5 c03693a8 -> bfb5f405", + "3f004530 3fcaada9 c088f000 -> bfad53fc", + "beb5bc38 c0391d03 41918c99 -> c12607e0", + "3e9e330b c132d96d c1243df2 -> c12e55fd", + "3f09329f c09f4b7a c16259ba -> c11e4512", + "be93c795 c1881158 bfaea876 -> c1ac30c6", + "3f9b87c4 c116f11a bf4ddf54 -> 3f86a442", + "3e87fd78 bf67958a 411518b7 -> 3fe7c525", + "3f469ec2 c186e8e9 c19ee832 -> c199873d", + "bdaf74d2 40f84fd3 418510dc -> 40dffc2e", + "3edd050c c1899f4a c12ade6e -> c166300c", + "3f232f2d 4183ffd8 c19db9ba -> c0d2bad1", + "beec8378 410a01cc c15f60be -> 41987902", + "3e21ba6d c0d4ef69 c144b390 -> c0f17017", + "3f67e5fd 41901d69 c158ddff -> c1295059", + "3f3d1abb c18d136d c18424ab -> c1867a39", + "3f6bded7 411f6dec c1893a95 -> c1705739", + "3f41782e 414eea19 4195574b -> 418a2228", + "3f9c9a63 c02a4fc4 40d9f8f2 -> 410edae0", + "3f9aaf2e 408674e3 4111e226 -> 412247dc", + "3f8ddb4e 4180966e 417dfd64 -> 417da51c", + "3ddb5636 c132afb6 c100bc11 -> c12d562e", + "be30fa03 c134b69c 4169f92a -> c17c6210", + "3f1f332c 40ef6720 414438c1 -> 41274995", + "3f62e0dc c147d328 414f707d -> 41211c49", + "3f8d2ede c18339be 3f29446c -> 401acc23", + "3f8d3627 418e9e82 c1857493 -> c1a1f350", + "3fb88c7a c132c281 c08b820e -> bfacc600", + "3f5ee8e4 41365c1f bfde2972 -> bd1beb40", + "3f99f00e 417a33e3 c19d22ad -> c1d653d4", + "3f674b65 c08df184 41063ea4 -> 40e4e157", + "3f86ffd9 bf8c84ea 4189a5cd -> 4191a7a6", + "3f6c16eb 3e5f49c0 415e2e6e -> 414d2c28", + "3e7bb4e1 bfc50650 c14a2908 -> c0888896", + "3e9a836f c108b9d2 418d37b0 -> bf23ad40", + "bee39f05 c01c516d 414ddbe3 -> c113f8f2", + "3f81f8ee 40a205c6 c1676fa9 -> c16c4031", + "3ebbcdcf 3fd84cd1 c0e931f5 -> bfcd3020", + "3dfd7d2b c09fdc62 4181d1d6 -> c0179a2c", + "3f69a4e5 3eb4e9e2 c19453f6 -> c18720c3", + "bd82886e 3fa84dc8 3f8b73d3 -> 3faa248a", + "3e5b90ae 415c62c2 bf87b82c -> 41297e45", + "be8277d4 c124dec9 be680dc7 -> c14df569", + "3dee19a9 c110764d 403ce7f8 -> c0f45a54", + "3f93c13a 413d5a6c c0207277 -> c0970d5d", + "3f619ac2 404352c1 c0f879a8 -> c0cf60a9", + "3f9de4c3 c0fa4abd 414ed95e -> 418e3136", + "3fb48ee2 bf83ad6c 4081ddf5 -> 40c4b574", + "3f9f4c09 c0de2634 c104eacc -> c10a4202", + "3f9f7d93 c0836813 411459c7 -> 4149031f", + "3f5cce69 41743600 c10e536e -> c0b25f87", + "3f3c2b64 c0eae6e6 41769608 -> 41162137", + "bd8104de c016876b 40f43fe4 -> c03ec944", + "3f8cc8b1 c15ac686 c106e98f -> c0fd12b6", + "3f3e4d58 418aff3a c159cdc4 -> c0b521d0", + "3eefc9f6 41170abe 3eceb399 -> 40a6a832", + "3e69320e bf842e51 bec7e773 -> bf62ebb9", + "3f81204e c02a3321 c0da1e99 -> c0db4a36", + "3f4d5eb4 418270f6 c1049edf -> c05b2f21", + "be8a6182 c138c3e6 c0ef2ae9 -> c14a61d4", + "3f8ab452 4169d1d5 c0dbfb27 -> c10abe20", + "3e0bf3fd bf94c5b1 417d6a0b -> 3f94a3cb", + "3f18aad9 c1578160 41835fed -> 408b690f", + "ba897974 40bdaf8d c14cee65 -> 40be5088", + "bee0e7c7 408a9852 407311fb -> 409216c0", + "3f990dcd bf933351 c190f5f2 -> c1ab889e", + "be0597be c0abfc07 41625922 -> c0fd7b3c", + "3f8ba49c c0b21086 c197d66a -> c1a19981", + "be9248d9 c1815771 c06bfa43 -> c19dde49", + "3f950938 c07393da 41132b2d -> 41355ccf", + "3eb9ae80 c109ff73 4101858a -> c023eae1", + "3f3adf6d 4084ddbb 4103eb30 -> 40e478b2", + "3dd117f7 bf01899c 41331f5c -> 3f304ad1", + "3e3b58df 41246e21 be08c61a -> 4105f4a7", + "bee7ff96 c15cf311 c17c122e -> c14ed900", + "3ea5edbc c1673ff6 4162b735 -> c0a5aa53", + "3f8e8b14 3eb00256 418ce0bf -> 419c9268", + "3e0ceb64 418c48ce c12cfd2d -> 415a26d4", + "3f6c7fc7 40ee4bc8 c1184ae1 -> c1039d8e", + "beb5bc39 bfee83f3 3dec76fc -> c024361b", + "be07a3cf c189f6c9 410034bb -> c1a4badf", + "beae4ccc c11d4106 4192966d -> c19b4bf6", + "3f753c1a c18db53d c0820d0f -> c0946b1a", + "3fb5cf1f 40d6e4b1 413b334c -> 415cba3e", + "3f2f1fc2 c0f3f903 c0ebd41d -> c0ee66c7", + "3ed15db1 41775a0d 41153347 -> 414f3744", + "be4633d9 c12ef6db 4137cade -> c174677a", + "3f6e14ff c10ee1ad c12a1ddc -> c12835dc", + "3ec7ec7f c14623fd c1508772 -> c14a3271", + "be56183a c10e88c8 c1390c58 -> c105a548", + "3f78dcda c19990d1 c0ad8725 -> c0b9d0cd", + "3f848ea2 41443b9f 40eaa627 -> 40e507c3", + "be9ef1fb c106e184 4158cfcf -> c1740f74", + "3f0ca2ea 40b8342b c10f904e -> c0157448", + "3f248eab c155d78d 3dd8096d -> c096991b", + "3f09c2f7 c01f51b9 40f01946 -> 4038d31a", + "bd910e16 400016f3 c18660ce -> 40554dae", + "bdb3df98 c1518cc9 419994c1 -> c17eeea3", + "3fb11b7f bd0a7480 4181d8db -> 41b3c452", + "3f939ea9 4199ee0f bf87510b -> c0856441", + "bdd8f8a9 41387079 c14cce6c -> 4161ad5e", + "3f8aa18d c18d9279 c19412b9 -> c1949cf2", + "3db196c8 c0a74df1 c1044553 -> c0afbc79", + "3db155b2 4185d650 41706292 -> 4184a7db", + "bc9d38d5 40e8c03a c0830f9d -> 40efbbb3", + "3f85dc9e 40859c35 419011ea -> 41952355", + "be4308e8 c116fde3 41855ea4 -> c1668de9", + "3ebb030d 3ed33a5d 3f936d9d -> 3f2ebc78", + "3f449c3f c10109b9 41169184 -> 40ab6793", + "3edc1c53 407e7e04 417772d3 -> 410ea67a", + "3f13f297 4165555a 410841d0 -> 412f8aee", + "3fa83690 41439df3 4124beb1 -> 411b0bc3", + "3f088f49 c19cc598 c19bda36 -> c19c4808", + "3f86ca9b c0303d9a c0ea00c8 -> c0f1be49", + "3f494be6 408e8c6c c1233ec5 -> c0e24376", + "3ec3d9c8 c0f619b3 40e940af -> bffaf386", + "3e053436 3f8cf068 c10204df -> bdcb31a8", + "3f6b0c01 3ebe3edc 40e65d60 -> 40d47ba8", + "3d0b3d1a c18d4af0 413794c3 -> c1855e8c", + "3e4aa388 c17b3142 409dc15a -> c139e002", + "becc75a9 c124a18f c05fc408 -> c15008e1", + "3eb42943 4167b613 c06c12f7 -> 410168f7", + "3f5aee21 41546ae7 c10cc51b -> c0b34106", + "3f589cff 4033bf6b 40235d22 -> 4025e271", + "3ed5930c 402903ec 415891c8 -> 40e5ef51", + "3f8e5330 c0b74658 418b7e18 -> 41a03b3e", + "be598a01 c0eb8209 41823c3c -> c1461aac", + "be9ecc2c 4108a488 c187bae7 -> 41839bb3", + "3f07f5d2 412683cc 4122e9f0 -> 41249a34", + "3ef7fe25 408f705d c18d9a19 -> c0c8620c", + "3f206bfa 4154907e c155e60f -> c05ab5e6", + "bee8910c 40744aff c06f39fe -> 40e7f61e", + "3ccde2ab c1856976 413f33f0 -> c17f5005", + "3f6153bf 40b43de0 c1037298 -> c0d1cce8", + "bea2da59 c0edbebd c185ab97 -> c08f4c4a", + "3d733fb7 41084baf c102a397 -> 40f0e2ec", + "3f9a0038 41846acb c18d989b -> c1c541c3", + "3e9dc256 40da761f c09edd80 -> 404c6586", + "3b6f1d46 412e0afb c0b8b0dd -> 412d122a", + "3f95b88f c161fbef 40b7b80f -> 4111cbbf", + "3dceee5e 403bbace c02fcbe3 -> 4016ffb2", + "3ee46961 4152cd6a bf980f9a -> 40d88f8c", + "befd628b 40056939 3f8f174a -> 4024071f", + "bd96a3b4 416cff16 40ba127c -> 417795d9", + "bec71aa1 40dc9c44 be9361d9 -> 411afdbf", + "3fb2588b 414cad99 40fbb49f -> 40bdb27f", + "3fba717f c18357ed c19bc6ea -> c1a6eedf", + "3f675558 41951a9c 4147a08b -> 41512032", + "3f817ae9 c181b1dd c173442a -> c173146f", + "3fb34642 c13bec57 40d409e0 -> 415fc46a", + "3da3c243 c19052de c1917852 -> c1906a55", + "beaced2d c19ba0f4 c06bc6f9 -> c1c63cdb", + "3fb25cf1 413089d6 c1775b45 -> c1cf1248", + "3f741a34 40b9c4b0 41934817 -> 418e9856", + "3e88451b 4099a7aa c14d3ea7 -> 3de06cc0", + "3f9090df 418fbbcb c0fe9fb3 -> c134fe3a", + "bed53678 40eee61c c10a863d -> 4162e0b5", + "be7a11df c1544bea c0d25b3d -> c16e74af", + "3dc68b8c c0add7ac 4189fae4 -> c04ef72f", + "3f55d7f5 413a6804 4136f7aa -> 413788a3", + "3f824dca 4197b848 402ede44 -> 401c2b58", + "3f3b4540 417c2895 40cd1017 -> 410eb3d6", + "3fbd890d c0bc292c c089fef7 -> c063c248", + "3f144b70 41409de6 40c6b668 -> 410a97dc", + "3eefd916 bfa32692 c109650f -> c0966814", + "3f5f3404 c0125562 417bafcd -> 4156c176", + "3f541966 c191a455 c1863f69 -> c18833a0", + "3ebd61d7 40a8bf39 40bb22f1 -> 40af8c8c", + "bcd9d3ea 4095e930 c192babb -> 40a980de", + "bedaf20e 40e25c1c c197d089 -> 4191b5a6", + "3fb884c8 40a2484b c188b23a -> c1d6f7ff", + "bd958c99 4192c795 c12965b3 -> 41a3aec2", + "3fb5739d 407e1a99 c190b5cd -> c1da675a", + "3f027e14 c12dfbc2 40d47a98 -> bff92638", + "3e36ac01 c1811b95 4143fae2 -> c13130fa", + "3e87c743 40bee212 3e3cf99c -> 408dd417", + "bea202a3 c133822a 40a8dc2f -> c1838345", + "3f633fcf c0131ad1 40dc7402 -> 40bb6f21", + "3f953bc0 4189e46f c0570d19 -> c0d8dc32", + "3dc57c03 c0fbb034 c18060aa -> c10a77b7", + "3f607172 c11126d8 40d48afe -> 40968ebe", + "3f88cfc8 c191b5c0 c0e0345a -> c0c78404", + "3f64e43a 402fc5a2 c15687d0 -> c13b28fd", + "be9d40ec 40f709e7 c18eb0fe -> 41791b9e", + "be2d7f7b c10127c2 c1049462 -> c100933a", + "3e6288c2 41181c38 c0a1a124 -> 40c929b4", + "3f96f3a7 c15060ae c04134a1 -> bf9cc8bc", + "3f882aa4 4127636e c19c7bf7 -> c1abced5", + "3f1a5d72 3f46ce92 41988189 -> 413cda0b", + "be91062a c0eb26d2 3ef3428b -> c119084c", + "3f5d5451 4193eb5b 3f83f80e -> 40594ff8", + "beefc6c9 c17cbeab c11dd34e -> c1949931", + "bef18f43 4084630e 3f06338e -> 40baee9f", + "3ee4240d 40506bc9 4106cd61 -> 40b1e874", + "3fb0d43a c189a1e6 401a3ce8 -> 411e46b0", + "3d3d4755 c0ae0e46 418635bf -> c08d3471", + "3f6c24bb 41504bb4 c0a9f8fd -> c078f3bb", + "3fa89160 bfa26c08 c19eb254 -> c1cdc6a7", + "3f1f8f0e c15aa81f c134e6fc -> c1432012", + "be092d1c c18b4d5e 41084823 -> c1a7176f", + "beea57b2 c17b7c32 40dc4094 -> c1d07f52", + "bd678cf2 419d91f2 c17116bd -> 41ad4acc", + "3f0bf673 c18dda93 c1358732 -> c163d7d4", + "bebdf78f 40662c53 c1949e89 -> 413d2d82", + "3fb8c2ea 3fa74cbf 4068e729 -> 40958b65", + "3eae724a 41086a22 414f39cc -> 41208a83", + "3f20993b c19919c9 4086cac7 -> c08fa8b4", + "3f8d10b0 c1892cf3 40fea068 -> 41284fd8", + "3e8ae5b3 bf86ba3d c02c8b13 -> bfbfcb62", + "3fa90189 c165c7b6 bf03c38a -> 407af478", + "be2478ed 40fa16e6 c16599c5 -> 413601cb", + "3f93a702 4182f350 c15c5ffa -> c19335da", + "3f3bbbb2 4131c290 411b5d1d -> 41215609", + "3f9032a4 417b7e73 c0557d3d -> c0b7e74a", + "beb353ed c15b8459 c1692866 -> c156bd42", + "3f856a69 bf11d08e c15e06e0 -> c1670903", + "3fa03a72 c194d434 40dfb441 -> 4156f5be", + "bd3cc170 41570f3f c1824c89 -> 416cfab0", + "be36fbb1 c171bea2 c1235390 -> c17fc1ef", + "3d63c59e c1678173 c08a2a9d -> c15e793f", + "becf5d40 c10c84f3 bfa8aa9b -> c13ce455", + "3fba508b c07553d7 c0375eff -> c01b2512", + "3fbacd71 bfa69ebf c1438a9a -> c189e6ea", + "bea48826 c0a3e519 bee2cca0 -> c0d401f3" + ] + }, + { + "function": "cycles_mix_vector", + "node": "ShaderNodeMix VECTOR UNIFORM", + "cases": [ + "00000000 00000000 00000000 00000000 3f8d85ae bdebd611 3f8d85ae -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3ee7dafc bd96d5e7 3f7c82da -> 3e67dafc bd16d5e7 3f1e416d", + "3f800000 00000000 00000000 3f000000 3e8556cb 3f0df3ba 3f81bbea -> 3e8556cb 3f0df3ba 3f81bbea", + "3fc00000 00000000 00000000 3f400000 3f490129 3f94c77c 3ec80a84 -> 3f96c0df 3fdf2b3a 3e581f8c", + "bf000000 00000000 00000000 3f800000 3f1e29b2 3f02b0a3 be184e9a -> be9e29b2 be82b0a3 3fc984ea", + "3e800000 00000000 3e800000 00000000 3edbead4 3edbead4 3f16dc04 -> 3ddbead4 3e96fab5 3e16dc04", + "3f400000 00000000 3e800000 3e800000 3e800000 3e800000 3e800000 -> 3e400000 3e800000 3e800000", + "40000000 00000000 3e800000 3f000000 3f34d950 3f523648 3e361319 -> 3fb4d950 3fb23648 be13d9ce", + "00000000 00000000 3e800000 3f400000 bdc4910e 3f25cfee 3f25cfee -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3e36c678 3cd8be6b 3e36c678 -> 3db6c678 3e0d8be7 3f16d8cf", + "3f800000 00000000 3f000000 00000000 3f745f2f 3ebdc79a 3ed8e23f -> 3f745f2f 3ebdc79a 3ed8e23f", + "3fc00000 00000000 3f000000 3e800000 3e1d546c 3f11e600 3e1d546c -> 3e6bfea2 3f1ad900 3dd7fd44", + "bf000000 00000000 3f000000 3f000000 3e8b812b 3d2aead5 be0dc11c -> be0b812b 3f3aa8a9 3f51b824", + "3e800000 00000000 3f000000 3f400000 be5c19b3 be0b2116 3e8d0e7b -> bd5c19b3 3eae9bdd 3f21a1cf", + "3f400000 00000000 3f000000 3f800000 3ec43669 3f80217d 3f36c699 -> 3e9328cf 3f60323c 3f4914f3", + "40000000 00000000 3f400000 00000000 3f0c2020 3f0c2020 3f52922a -> 3f8c2020 3eb08080 3fd2922a", + "00000000 00000000 3f400000 3e800000 3f327536 3f75a2df 3f327536 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f1c0f04 3f5b30fc 3d927710 -> 3e9c0f04 3f4d987e 3e924ee2", + "3f800000 00000000 3f400000 3f400000 3f9e2e48 3f81d1dc 3f9e2e48 -> 3f9e2e48 3f81d1dc 3f9e2e48", + "3fc00000 00000000 3f400000 3f800000 00000000 3f400000 3f000000 -> 00000000 3f400000 3e800000", + "bf000000 00000000 3f800000 00000000 be322292 be322292 bdf54468 -> 3db22292 3fcb2229 3d754468", + "3e800000 00000000 3f800000 3e800000 3f6b26b4 3f5af2b6 be22f40f -> 3e6b26b4 3f76bcae 3e1742fc", + "3f400000 00000000 3f800000 3f000000 3ecf494e 3f9b0358 be1ead3b -> 3e9b76fa 3f944282 3c0fe140", + "40000000 00000000 3f800000 3f400000 3f00c97b 3ef6527a 3d2542d4 -> 3f80c97b bd1ad860 bf2b57a6", + "00000000 00000000 3f800000 3f800000 3f23c696 3efacbc9 3efacbc9 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3c1d477b 3c1d477b 3ecb4c9e -> 3e04ea3c 3b9d477b 3e4b4c9e", + "3f800000 3e800000 00000000 3e800000 00000000 00000000 3f400000 -> 00000000 00000000 3f400000", + "3fc00000 3e800000 00000000 3f000000 3f800000 3e800000 3e800000 -> 3fb00000 3ec00000 3e000000", + "bf000000 3e800000 00000000 3f400000 3ef71aa4 3f755f58 3ef71aa4 -> 3e08e55c bef55f58 3f623957", + "3e800000 3e800000 00000000 3f800000 3f81c1b9 3dcb1c11 3dcb1c11 -> 3ee1c1b9 3ccb1c11 3f4658e1", + "3f400000 3e800000 3e800000 00000000 3f310e4b 3f74cd5e 3f3a8a2e -> 3f14cab8 3f479a06 3f0be7a2", + "40000000 3e800000 3e800000 3e800000 3e11f347 3e288b02 3e11f347 -> 3d0f9a38 3da22c08 3d0f9a38", + "00000000 3e800000 3e800000 3f000000 3f40fd66 3ec068c1 3f97af93 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f81ed18 3f0271a1 3f9cc991 -> 3f21ed18 3ec271a1 3f7cc991", + "3f800000 3e800000 3e800000 3f800000 3f9e0e17 3f412e7c 3f412e7c -> 3f9e0e17 3f412e7c 3f412e7c", + "3fc00000 3e800000 3f000000 00000000 bd4b95a8 3f0f3e8b 3f0f3e8b -> be4c581f 3f16ddd0 3f56ddd0", + "bf000000 3e800000 3f000000 3e800000 3f0c75af 3f58c4c9 3de16bf8 -> 3dce2944 3ea73b37 3ea3d281", + "3e800000 3e800000 3f000000 3f000000 be184120 3e2bd73b be184120 -> 3e19efb8 3ed57ae7 3eacf7dc", + "3f400000 3e800000 3f000000 3f400000 bdca41f9 3f8a9666 bdca41f9 -> bc3d8bd8 3f6fe199 3de84e85", + "40000000 3e800000 3f000000 3f800000 bdbb2199 3f8f309d 3d36365e -> bedd90cc 3fde613a bf693934", + "00000000 3e800000 3f400000 00000000 3e0780d4 3f9a01b6 3f0b2ea3 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f2cdb5b 3d5f0b09 3e7372d5 -> 3eecdb5b 3ecdf0b1 3e79b96a", + "3f800000 3e800000 3f400000 3f000000 3f32f77c 3ed4189d 3f27abc1 -> 3f32f77c 3ed4189d 3f27abc1", + "3fc00000 3e800000 3f400000 3f400000 be22e4a3 bdd80021 3ec2db7f -> beba2b7a bf088006 3e48927c", + "bf000000 3e800000 3f400000 3f800000 3f9919a8 bd319be3 3e33f278 -> be6466a0 3f92c670 3fb4c0d8", + "3e800000 3e800000 3f800000 00000000 bd89a08c 3eb215fb 3f57a806 -> 3e2ecbee 3f5642bf 3e57a806", + "3f400000 3e800000 3f800000 3e800000 3ea7077e be42be05 3eaeb6d2 -> 3e9d459e 3ddbe2f8 3ea3091e", + "40000000 3e800000 3f800000 3f000000 3f0d3569 3f8372d4 3f0d3569 -> 3f5a6ad2 3f86e5a8 3f1a6ad2", + "00000000 3e800000 3f800000 3f400000 be399e2e 3f47ebac 3f9b2728 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f800000 3f800000 00000000 -> 3f200000 3f800000 3f000000", + "3f800000 3f000000 00000000 00000000 3f02d2d6 3f02d2d6 bd5b9175 -> 3f02d2d6 3f02d2d6 bd5b9175", + "3fc00000 3f000000 00000000 3e800000 3ea347eb 3e2f3d7d 3e2f3d7d -> 3e69d7c0 3e836e1e 3e06dc3c", + "bf000000 3f000000 00000000 3f000000 3e825c4d 3ec772ec 3f23b5c6 -> 3f1f68ed be4772ec 3edc4a3a", + "3e800000 3f000000 00000000 3f400000 3f718517 3f80542e 3f201da3 -> 3f1c6146 3e80542e 3f380769", + "3f400000 3f000000 00000000 3f800000 3e3b30cd 3f42d5e5 3f46cf85 -> 3e86324d 3f12206c 3f551ba4", + "40000000 3f000000 3e800000 00000000 3e88fa81 3ed37ab4 3ed37ab4 -> 3d0fa810 3f137ab4 3f537ab4", + "00000000 3f000000 3e800000 3e800000 be635ec6 bdfd8c13 be635ec6 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 be730961 3f0ee6e7 3f1e401c -> 3e067b50 3ecee6e7 3f0f200e", + "3f800000 3f000000 3e800000 3f400000 3e7b2c6a 3f520c2f 3f4ff115 -> 3e7b2c6a 3f520c2f 3f4ff115", + "3fc00000 3f000000 3e800000 3f800000 3e975d5c 3efc2745 3efc2745 -> 3e461814 3f1d1d74 3e7475d0", + "bf000000 3f000000 3f000000 00000000 3f747735 3f59f10e be3e9c32 -> 3e8b88cb 3ea60ef2 3dbe9c32", + "3e800000 3f000000 3f000000 3e800000 3f22553b 3f71355a 3dc6029d -> 3f08954f 3f1c4d56 3e58c054", + "3f400000 3f000000 3f000000 3f000000 3e8fa29b 3f6f682c 3f6f682c -> 3eabb9f4 3f538e21 3f538e21", + "40000000 3f000000 3f000000 3f400000 3f9653d4 3e9d049d 3f0c03aa -> 3feca7a8 3de824e8 3eb00ea8", + "00000000 3f000000 3f000000 3f800000 3f797ba8 3f41914a 3f41914a -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f33f278 3f33f278 3f60a035 -> 3f19f93c 3f39f93c 3ee0a035", + "3f800000 3f000000 3f400000 3e800000 bda24629 3e1380cd 3e1380cd -> bda24629 3e1380cd 3e1380cd", + "3fc00000 3f000000 3f400000 3f000000 bdb3fda0 bdb3fda0 3f8caae2 -> bec37f1c bf01bf8e 3fb30053", + "bf000000 3f000000 3f400000 3f400000 3f27f1ac 3e24a86a 3e24a86a -> 3ed80e54 3f85b579 3f85b579", + "3e800000 3f000000 3f400000 3f800000 3f0567bf 3f0567bf 3e40dbaa -> 3f0159f0 3f3159f0 3f4c0dbb", + "3f400000 3f000000 3f800000 00000000 3f750a77 3f750a77 3ee1e574 -> 3f57c7d9 3f77c7d9 3ea96c17", + "40000000 3f000000 3f800000 3e800000 3f754f18 bd113e35 3f754f18 -> 3fb54f18 bf8913e3 3fd54f18", + "00000000 3f000000 3f800000 3f000000 bd610328 bd610328 3e089ebf -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 be68740a 3ef21aef be68740a -> 3e0bc5fb 3f3c86bc 3e85e2fe", + "3f800000 3f000000 3f800000 3f800000 3c13cec0 3f55f326 3f0271d5 -> 3c13cec0 3f55f326 3f0271d5", + "3fc00000 3f400000 00000000 00000000 3f7f5d3a 3f7f5d3a 3e071399 -> 3f8f85ec 3fbf85ec 3e4a9d66", + "bf000000 3f400000 00000000 3e800000 3dde2137 3dde2137 be310b8a -> 3f890ef6 bd5e2137 3eec42e2", + "3e800000 3f400000 00000000 3f000000 3f400000 3f800000 00000000 -> 3f400000 3e800000 3ec00000", + "3f400000 3f400000 00000000 3f400000 3e907ff1 bc70b144 3e907ff1 -> 3ecc5ff5 bc3484f3 3ecc5ff5", + "40000000 3f400000 00000000 3f800000 3e6c4ba3 3e6c4ba3 3f438d40 -> be93b45d 3eec4ba3 3f071a80", + "00000000 3f400000 3e800000 00000000 be677b9e be677b9e 3f120ee7 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3ee71ee0 3ee71ee0 3f66b614 -> 3f19c7b8 3eb38f70 3f135b0a", + "3f800000 3f400000 3e800000 3f000000 bdbcf958 3f439f9c 3f349032 -> bdbcf958 3f439f9c 3f349032", + "3fc00000 3f400000 3e800000 3f400000 3f9358b6 3f8a9581 3e8cddfe -> 3fad0511 3fbfe042 3d1a67e8", + "bf000000 3f400000 3e800000 3f800000 3f60fa2b 3f6f198f 3f9a8e6d -> 3f2f82ea bdbc663c 3f657193", + "3e800000 3f400000 3f000000 00000000 3f0ffedf 3f8cc7e6 3f8d77d7 -> 3f33ffb8 3f2663f3 3e8d77d7", + "3f400000 3f400000 3f000000 3e800000 be197056 be197056 3c62f0d4 -> 3d99d77f 3c4ebbf8 3d954694", + "40000000 3f400000 3f000000 3f000000 3dc54bb3 3f2222df 3f511cac -> bf0ead13 3f4445be 3f911cac", + "00000000 3f400000 3f000000 3f400000 3f000000 3f800000 00000000 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3eda994e 3f96c850 3f8a0833 -> 3f16a654 3f56c850 3f85041a", + "3f800000 3f400000 3f400000 00000000 3f9ea343 be5af382 bca57ece -> 3f9ea343 be5af382 bca57ece", + "3fc00000 3f400000 3f400000 3e800000 3e9274d0 3e9274d0 3f8d8221 -> 3d5d79c0 3d5d79c0 3fc44332", + "bf000000 3f400000 3f400000 3f000000 be1671ec bdc4578b be1671ec -> 3f99671f 3f9622bc 3f52ce3e", + "3e800000 3f400000 3f400000 3f400000 3e1ee1dc 3f65a540 3f7d0964 -> 3f19ee1e 3f496950 3f4f4259", + "3f400000 3f400000 3f400000 3f800000 3e21fabe bdde1f96 3e49bd3e -> 3e9cbe07 3dd96850 3ecba6f7", + "40000000 3f400000 3f800000 00000000 3ea2d961 bca4e999 3e890662 -> bde934f8 bf85274d 3f090662", + "00000000 3f400000 3f800000 3e800000 3ee05345 3d18ee44 3d6fd132 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f400000 3f000000 3e800000 -> 3f400000 3f400000 3ec00000", + "3f800000 3f400000 3f800000 3f400000 3e207dd0 be1ecf61 be041c36 -> 3e207dd0 be1ecf61 be041c36", + "3fc00000 3f400000 3f800000 3f800000 be5b3dae 3f546adc 3ea50564 -> bf323721 3f3ea04a bc877ea0", + "bf000000 3f800000 00000000 00000000 3e8a5ed8 3f2dd359 3f10355c -> 3faeb425 beadd359 be90355c", + "3e800000 3f800000 00000000 3e800000 3f468898 3f468898 3f8e11df -> 3f71a226 3e468898 3eee11df", + "3f400000 3f800000 00000000 3f000000 3f85b789 3f76daf5 3f56bd90 -> 3f8449a7 3f392438 3f410e2c", + "40000000 3f800000 00000000 3f400000 3f3c58d7 3d61e5da 3f93e06a -> 3ef1635c 3de1e5da 3fc7c0d4", + "00000000 3f800000 00000000 3f800000 3e70fb1c 3f15de7e 3f9b0e45 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 bdb61179 3f84203c 3f545748 -> 3ee93dd1 3f24203c 3ed45748", + "3f800000 3f800000 3e800000 3e800000 00000000 3e800000 3f000000 -> 00000000 3e800000 3f000000", + "3fc00000 3f800000 3e800000 3f000000 3e31b772 3d366ab4 3d366ab4 -> be756cd4 bd6e5ff2 be3b97fc", + "bf000000 3f800000 3e800000 3f400000 bdc53be2 3e69b916 3ec7b4f3 -> 3fc629df 3e8591ba 3f6e12c3", + "3e800000 3f800000 3e800000 3f800000 3f219edc be7af37c 3f78386c -> 3f6867b7 3e014321 3f7e0e1b", + "3f400000 3f800000 3f000000 00000000 3f400000 3e800000 3f400000 -> 3f500000 3ea00000 3f100000", + "40000000 3f800000 3f000000 3e800000 3f6b6be8 3f9c494a 3d10abb6 -> 3f56d7d0 3ff89294 be37aa25", + "00000000 3f800000 3f000000 3f000000 3f89f9fd 3e478811 be169f24 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3e43e485 3e85ab8f 3e85ab8f -> 3f187c91 3ec2d5c8 3f016ae4", + "3f800000 3f800000 3f000000 3f800000 3f6a6027 3f29c523 3f6a6027 -> 3f6a6027 3f29c523 3f6a6027", + "3fc00000 3f800000 3f400000 00000000 00000000 3e800000 3f400000 -> bf000000 00000000 3f900000", + "bf000000 3f800000 3f400000 3e800000 3e800000 3f800000 00000000 -> 3fb00000 3f200000 3ec00000", + "3e800000 3f800000 3f400000 3f000000 be2039b3 bd41551e 3f961783 -> 3f35fc65 3f0cfaac 3f2b0bc2", + "3f400000 3f800000 3f400000 3f400000 3f46beb0 3f46beb0 3f49d3b4 -> 3f550f04 3f450f04 3f475ec7", + "40000000 3f800000 3f400000 3f800000 3f3b9b89 3e3c9718 3e950739 -> 3eee6e24 bec368e8 bed5f18e", + "00000000 3f800000 3f800000 00000000 3f658b92 3e4fe396 3f658b92 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f1e7227 3f092247 3f0eb3da -> 3f4f3914 3f449124 3eceb3da", + "3f800000 3f800000 3f800000 3f000000 3c3a2de2 3c3a2de2 3d1c396a -> 3c3a2de2 3c3a2de2 3d1c396a", + "3fc00000 3f800000 3f800000 3f400000 3e800000 3e800000 3f400000 -> be000000 be000000 3f400000", + "bf000000 3f800000 3f800000 3f800000 3f15e8ca 3f50d02d 3ef6868c -> 3f9a85ce 3f8bcbf5 3fa12f2e", + "3e800000 00000000 00000000 00000000 bddf4ab0 3f9c51cd 3e100884 -> bcdf4ab0 3e9c51cd 3d100884", + "3f400000 3e800000 3e800000 3e800000 3e742ceb 3f30b390 3f30b390 -> 3e7721b0 3f1486ac 3f1486ac", + "40000000 3f000000 3f000000 3f000000 3f42c777 3ec340d7 3ec340d7 -> 3f82c777 3e8681ae 3e8681ae", + "00000000 3f400000 3f400000 3f400000 3e9f104d 3f903336 3e69e1f0 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 bccdf24b 3e3c61b2 3f51665f -> 3ef9906e 3f178c36 3f68b330", + "3f800000 3fa00000 3fa00000 3fa00000 3f400000 3f800000 3e800000 -> 3f400000 3f800000 3e800000", + "3fc00000 be800000 be800000 be800000 3e800000 3e800000 00000000 -> 3f000000 3f000000 3e000000", + "bf000000 3dcccccd 3dcccccd 3dcccccd be7ad889 3f8d5629 3f69bdf8 -> 3e8b82ef becddf85 be9cf12b", + "3e800000 3f666666 3f666666 3f666666 3f4c2867 39acf231 3f8b0961 -> 3f5fd6e6 3f2cd234 3f72517c", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f5e1df1 3f5a3f67 bdd86a49 -> 3f3bebca 3f3904e2 3b85af30", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f012189 3f292392 3f23401f -> 3eaf30ce 3f279c79 3f1bd593", + "00000000 bd2a2c1e 3df656d7 3f64a817 3f339e54 bd4affdc be649893 -> bd2a2c1e 3df656d7 3f64a817", + "3f000000 3f8d6e89 be4dac34 3f8d6e89 3ec49d60 3e1d15d5 bd8e4d80 -> 3f3e95e1 bcc2597c 3f0489b1", + "3f800000 3ee26d6b 3f3a3d0e 3df08785 3e9ce8af 3ee595e1 3f426e8e -> 3e9ce8af 3ee595e1 3f426e8e", + "3fc00000 3eefb2f9 3efd4857 3f4f3918 3f400000 00000000 3f800000 -> 3f641342 be7d4857 3f8c31ba", + "bf000000 3f77c29a 3f8f2a35 3f266677 bd929c34 3f08c0d9 3f65b21d -> 3fbe66d6 3fb48f1a 3f06c0a4", + "3e800000 3f6d0c53 3f6d0c53 3f4c3619 00000000 3e800000 3f800000 -> 3f31c93e 3f41c93e 3f592893", + "3f400000 3f7a9a51 3f7a9a51 3f49310a 3ebf85e5 3e0560cf 3db71fac -> 3f0678ca 3eaf5176 3e86ee75", + "40000000 3eb1df05 3f9ddd85 3f9ddd85 3f0e67e7 3f3150b0 be55c568 -> 3f43e04c 3e1b9958 bfd34edf", + "00000000 3f6c0442 bd9455f3 3f80a5a7 3f3cacc3 3e46da2a 3f3cacc3 -> 3f6c0442 bd9455f3 3f80a5a7", + "3f000000 3ee82603 3f42e200 3ee82603 3e4ec4cb 3c9298d2 3e377c65 -> 3ea7c434 3ec776c7 3ea1f21b", + "3f800000 3f008290 3c76430d bd43a316 3f400000 3f000000 3f800000 -> 3f400000 3f000000 3f800000", + "3fc00000 3de42210 3f929670 bd3d6fa1 3f47869b 3f47869b be35df5b -> 3f8e83e4 3f18b378 be792114", + "bf000000 3e383d57 3e383d57 3f04263b 3f9304ce 3f9304ce 3f0c5549 -> be9bdb9b be9bdb9b 3f000eb4", + "3e800000 3f8077a1 3ed40d54 3ed40d54 be245ce0 3f04a50c 3e744a37 -> 3f366da4 3ee15c85 3ebd9346", + "3f400000 3ec0bb56 3e80c0a2 3f972a89 3ef1f69a 3f5c89a0 bd7e13b8 -> 3ee5a7ca 3f357f4c 3e7eb160", + "40000000 be71b121 bdaeaa70 3eb911e9 3f74fa03 3e75d73d 3d1b5041 -> 40099814 3f10c0ec be923dd9", + "00000000 3c4ed09a 3f5703ea 3f7e1398 3cdd0df9 3f99e04d 3f99e04d -> 3c4ed09a 3f5703ea 3f7e1398", + "3f000000 3f8671e9 3f3e3d32 3f7a9b84 3e800000 3f800000 3f800000 -> 3f2671e9 3f5f1e99 3f7d4dc2", + "3f800000 bd8c8fc5 3dcd77ce 3f5f293f bcd97985 3d0ccd76 3f5d1acf -> bcd97985 3d0ccd76 3f5d1acf", + "3fc00000 3f73c568 bd28458b 3f887b32 3f3f267e 3f3f267e 3ef68e5d -> 3f24d708 3f91fdf4 3e41be50", + "bf000000 3f9cf926 3f953dd6 3f9cf926 3f6e4e66 bdf4b3b7 3f6e4e66 -> 3fafe220 3fe7825f 3fafe220", + "3e800000 3f992cff 3f659970 3f992cff be1e617a 3f85c933 3ea1dbed -> 3f5bdd66 3f6f17ae 3f79fefc", + "3f400000 be1b0067 3f1da378 3f1da378 3ebed5a8 3f195b16 3ebed5a8 -> 3e778062 3f1a6d2e 3eddf1fa", + "40000000 3f63eb22 3f63eb22 3f9a528c 3f9cbafe 3f0f7da9 3d9b450d -> 3fc7806b 3e6c40c0 bf86e9ea", + "00000000 3e055e4f 3f938595 3e99a548 3f4849b6 3f973113 3f4849b6 -> 3e055e4f 3f938595 3e99a548", + "3f000000 3f1ad895 be43928e 3f80e114 3f1947a0 bdba9af6 3f98a112 -> 3f1a101a be107004 3f8cc113", + "3f800000 3f156bc0 3f44da40 3f8f0cf2 3f39ac1c 3f39ac1c 3f1ee8ab -> 3f39ac1c 3f39ac1c 3f1ee8ab", + "3fc00000 3f9e5e7e 3f0e62e7 3ecc0a6e bdc505b2 3f5c009f 3f5c009f -> bf434f90 3f8167bd 3f8b7f29", + "bf000000 3f89bcce 3ec388cc 3f8e694b 3f9eb4ed bd8bee47 3e0c3c63 -> 3f7e817d 3f1b657d 3fccda2a", + "3e800000 3effd700 3dc44518 3effd700 be182f6f 3f2afeb3 3f2afeb3 -> 3eacdb52 3e74989c 3f0ab04d", + "3f400000 3f956685 3f6ccd91 3d0805ec be029d18 be029d18 3f992884 -> 3e48d738 3e0ad7bf 3f67dcde", + "40000000 be38429d be38429d 3f8031a8 3f724fab 3f724fab 3f29ab5b -> 4004abff 4004abff 3ea5e6cc", + "00000000 be2b05e2 3f677a15 be2b05e2 3e8e3b5c 3f7679ff 3e2429e2 -> be2b05e2 3f677a15 be2b05e2", + "3f000000 3f80ed14 3f80ed14 3f055f29 3f2ddbba 3ef1022a 3ef1022a -> 3f57daf1 3f3d2d9e 3efde03e", + "3f800000 3f22e251 bcd2d7f2 bcd2d7f2 3e813fa8 3e8ed31c 3dc0e196 -> 3e813fa8 3e8ed31c 3dc0e196", + "3fc00000 3f59fc64 3f02eef9 3f99ffdd bd2d598d 3ed0db63 be276c0a -> befa7d2e 3eb65a1b bf58c861", + "bf000000 3f9e4649 3f752b9d 3ee437e7 3f000000 3f000000 3f000000 -> 3fcd696e 3f97e0b6 3ed653da", + "3e800000 3f1750a9 3e37a46e 3f1750a9 3f070748 3e87411f 3f070748 -> 3f133e51 3e4d5be2 3f133e51", + "3f400000 3e484a1a 3f9888d8 3f3720b9 3f400000 3f400000 3f400000 -> 3f1c84a2 3f5c446c 3f3dc82e", + "40000000 3f90bebe 3f619690 3f90bebe 3e99ac78 be449d52 be449d52 -> bf07d104 bfa1f29c bfc1e612", + "00000000 bd7f368e 3f8bd4fa 3e93f27b 3f800000 00000000 00000000 -> bd7f368e 3f8bd4fa 3e93f27b", + "3f000000 3f5b53fc be76054f be76054f 3f5ed5b1 3e99d89f 3f35dfe4 -> 3f5d14d6 3cf6afbc 3e70bd20", + "3f800000 3f8ff6d5 be54c614 3f414ac5 3f800000 3e800000 3f800000 -> 3f800000 3e800000 3f800000", + "3fc00000 3debcc39 3f555051 3f555051 3db6fca0 3ef2e8f6 3e27f5de -> 3d9c94d4 3e970d1f be2eafd5", + "bf000000 3efd34ce be37e9b7 3efd34ce 3f968933 3f968933 be1797f5 -> 3e1d799c bf5b80d8 3f50da99", + "3e800000 3cfb8974 bdbb89dd 3cca0744 3deccf8b 3edc50f8 3dee8b2a -> 3d54bb51 3d1f5324 3d43084e", + "3f400000 3db86229 be6510e8 3db86229 3f82f39a 3f614632 3f0580ba -> 3f4a3078 3f1aa398 3ed3c73a", + "40000000 bd6b0fec 3f4a8b8d 3eafeedc 3f1a2389 3f27a00d 3f844e85 -> 3fa17c08 3f04b48d 3fdca153", + "00000000 3f9940ca 3c763077 3f1e0a91 be800000 be800000 be800000 -> 3f9940ca 3c763077 3f1e0a91", + "3f000000 3edabf9e 3edabf9e 3f97a446 3f39a749 3e1205ff 3e1205ff -> 3f13838c 3e91e14f 3f29e506", + "3f800000 3f5e244f 3f4496e2 3f4496e2 3f000000 3f800000 3f000000 -> 3f000000 3f800000 3f000000", + "3fc00000 3e76d8ea 3e76d8ea 3f92b3b3 3e1d29ce 3ea7ddc2 be6c41fc -> 3de0a480 3ebe1668 bf6b4c72", + "bf000000 3f8d739c 3f02884a 3f8d739c 3f0e7359 bd75a5fd 3f0a1781 -> 3fb09094 3f4b799f 3fb1a78a", + "3e800000 3ea450c8 be4fc4b4 be4fc4b4 3f9c95f3 3f9c95f3 3e5c6d13 -> 3f0be944 3e1d585f bdc97084", + "3f400000 be1dd581 be63b142 3f1876ae 3f400000 3f400000 00000000 -> 3f0622a8 3f01c4ec 3e1876ae", + "40000000 3c8c8be4 3f4e4d4a 3f4e4d4a 3f3bf2bb bd8bfa2b 3f99f5ea -> 3fb9c08b bf714bd5 3fccc52f", + "00000000 3f38f9cd 3f4645f6 be40af6b 3e39d404 3f1cb371 3f1cb371 -> 3f38f9cd 3f4645f6 be40af6b", + "3f000000 3f82d589 3eb16dcc 3ed94c78 3f4b2820 3f4b2820 3f55aa35 -> 3f686999 3f11ef83 3f212838", + "3f800000 3f356769 be298201 3f08ff15 3f9ecbf6 3f9b507c 3db1af80 -> 3f9ecbf6 3f9b507c 3db1af80", + "3fc00000 3f5d38c0 3f6b3a73 3f5d38c0 3f2aaaab 3f2aaaab 3f2aaaab -> 3f1163a0 3f0a62c6 3f1163a0", + "bf000000 3f97ddb1 3dd41755 3dd41755 3e5b95b0 3f81a38b 3f81a38b -> 3fd6132f beb3be56 beb3be56", + "3e800000 3e8d0e7f 3f464ce5 3e2fbcc9 3f887523 3eda5397 3f784732 -> 3ef24002 3f30041f 3ebe0a64", + "3f400000 3eb8f684 3f93181a 3f626a26 3f985fcf 3ee82fe0 3ee82fe0 -> 3f7bae86 3f209e01 3f0fac7e", + "40000000 bde3c8f0 3f240585 3f240585 3f99a697 3eb062cc 3f63197f -> 4020c4de 3d45d470 3f9116bc", + "00000000 bd793a82 3f4e6191 3f4e6191 3f5b3455 3f909b0d 3f8d667c -> bd793a82 3f4e6191 3f4e6191", + "3f000000 3f5cdfdf 3e84a0f8 3e84a0f8 3f000000 3f400000 3f000000 -> 3f2e6ff0 3f01283e 3ec2507c", + "3f800000 3f5208e4 be732e93 3f5208e4 3f86ca37 3e996df1 3f86ca37 -> 3f86ca37 3e996df1 3f86ca37", + "3fc00000 3f052b87 3e9e8965 3e9e8965 bd31a378 bd31a378 3e5146ff -> bea67a2e be6126b2 3e1b6119", + "bf000000 3cf41d29 3f86c129 3f86c129 3f84d04c 3f84d04c 3f818396 -> bef2bddc 3f87b998 3f895ff3", + "3e800000 3f9519c9 be0632cc be0632cc 3f62fac6 3f62fac6 3dbf87ad -> 3f8c32b0 3dfca95a bd996a47", + "3f400000 be11ab4c 3f4cd5f9 3f4cd5f9 3e800000 3e800000 3f000000 -> 3e1b952d 3ec66afc 3f13357e", + "40000000 3e81dfe3 3f75b73b be466c23 3e800000 3f400000 3f000000 -> 3e7c403a 3f0a48c5 3f98cd84", + "00000000 3f82819d bde30450 3f82819d 3f6a610e be327019 3f6a610e -> 3f82819d bde30450 3f82819d", + "3f000000 3ec27819 3e8243f9 3ecc94e7 3e586f13 3f24c87f 3e586f13 -> 3e9757d1 3ee5ea7c 3e9c6638", + "3f800000 bd34b23e bd34b23e 3ecc2926 3e89eaec 3f24080e 3f82b9cf -> 3e89eaec 3f24080e 3f82b9cf", + "3fc00000 3f9907ec 3f315256 bd770dfd 3f800000 3f000000 3e800000 -> 3f66f814 3eceadaa 3ecf70e0", + "bf000000 3e0f1154 3e83bb81 3e83bb81 3f7adeab 3f7adeab be30bc74 -> be8f91ac bdd515a4 3ef1c85f", + "3e800000 3f2d0d49 3f6c0baa 3da2e3db 3f400000 3f800000 3f400000 -> 3f31c9f7 3f7108c0 3e7d1572", + "3f400000 bd34d86c 3f7c2653 3f7c2653 bcdfa620 3f2ab885 3f06c8de -> bd011467 3f3f13f9 3f24203b", + "40000000 3f14f5db 3f1ca436 3f14f5db 3cd0c103 bda83890 be0d210e -> bf07e9cb bf46b25a bf5b8662", + "00000000 3f2e2644 3f5a01f0 3f2e2644 bd2935f4 bc7f616a 3f86c5dc -> 3f2e2644 3f5a01f0 3f2e2644", + "3f000000 3f92632f 3e900cad 3e900cad 3f2f7c61 3f58a7e6 3dbc34e8 -> 3f6a2160 3f10571e 3e3f19e7", + "3f800000 be515caf 3f5a0556 3f5a0556 3f8362f1 be284da0 3f8362f1 -> 3f8362f1 be284da0 3f8362f1", + "3fc00000 3f9403a3 3ded20f4 3f9403a3 3ef7c37a 3e891fc4 3f892cd5 -> 3e173be4 3eb00b88 3f83c16e", + "bf000000 3e77654b 3f6d0152 3f98bc9b 3f30a849 be7fd33e 3c9730a0 -> 3c8e3af0 3fc1be32 3fe3ec87", + "3e800000 3d8d020e 3e4a3fca be3e071b 3e8d1f05 3e8d1f05 3e506e39 -> 3df6e090 3e5e3f5a bdb4d38c", + "3f400000 bdf29152 3ed99252 bdf29152 bdeb3f7b 3f834c29 3f834c29 -> bded13f0 3f602488 3f3d5db3", + "40000000 3f6875c0 3f9de172 3f6875c0 3e621869 3e9c8da8 3e395dfa -> beeed317 bf1f353c bf0bc6c3", + "00000000 3f8cff37 3f977ef4 3f9678c3 3f800000 3e800000 3f400000 -> 3f8cff37 3f977ef4 3f9678c3", + "3f000000 3e8ff3dd 3f57a5e4 bd62b9da 3f38c487 3f9a6eff bdfe7fd8 -> 3f005f3b 3f8320f8 bdb7ee62", + "3f800000 bce9d336 bc3fa8f2 bce9d336 3f40196f 3eac5882 3eac5882 -> 3f40196f 3eac5882 3eac5882", + "3fc00000 3f964523 bbe0b808 3edaf02c 3f860130 3e321490 3f05a8d6 -> 3f7bbe6d 3e8750dc 3f11c136", + "bf000000 3c36d197 3f0bd0a5 3f0bd0a5 3ed72e5e 3efaa4d5 3f47f77b -> be460ab8 3f130fc3 3edb7a75", + "3e800000 3f8b1cd7 3f68714f 3e296611 3edd5b6b 3f6a37b4 3edd5b6b -> 3f6c56af 3f68e2e8 3e6dba42", + "3f400000 3ea7525b 3c93bf5f 3ea7525b 3f884618 3da6cbb8 3f816147 -> 3f61536f 3d8654c0 3f56fc35", + "40000000 3ee2bf68 bddd7ba9 bddd7ba9 bded1e4a 3ec90c95 3f014bc0 -> bf2ca746 3f64bc0a 3f8f237b", + "00000000 3f8e4512 3f293a5a be000516 3f800000 3f400000 00000000 -> 3f8e4512 3f293a5a be000516", + "3f000000 3f80a24d 3f81d486 3f1ca6f4 3e91689e 3f9368d3 3e094dda -> 3f24fc74 3f8a9eac 3ebefa6a", + "3f800000 3ca8a3d5 bce0c838 3f9ffd52 3f66fabc 3f8308f9 3f337fbc -> 3f66fabc 3f8308f9 3f337fbc", + "3fc00000 3f93b08d 3e4babc2 3f93b08d 3f34698d 3e145bc3 3f988516 -> 3ef5db8e 3df16786 3f9aef5a", + "bf000000 3f4e9050 3f4e9050 3f823e28 3f000000 00000000 3e800000 -> 3f75d878 3f9aec3c 3fb35d3c", + "3e800000 3f9e379a 3da2885c 3da3e242 be6a6685 3e6ca8a1 be6a6685 -> 3f5eacff 3df03a96 3b36cde0", + "3f400000 3eed2874 3e8b4586 3f5d8494 3f0c5c7a 3ef75522 3f4a3475 -> 3f06ea6a 3edc513c 3f4f087d", + "40000000 3f9d2cb1 3f4d4bbe 3f9d2cb1 3e8a4166 3f0f6871 bd30fead -> bf3017fc 3ea30a48 bfa83c9c", + "00000000 3d3d4b54 3f49c3be 3d3d4b54 3eec56f3 3f210fb6 3eb0114c -> 3d3d4b54 3f49c3be 3d3d4b54", + "3f000000 3f597637 3e6783d8 3dc412c9 bcd6599d 3e0e1f2c 3f1fcdbe -> 3ed2c36a 3e3ad182 3eb85017", + "3f800000 bdb7a2a2 3f36f524 bd8c9174 3f8e0626 be71caad bdafa0ba -> 3f8e0626 be71caad bdafa0ba", + "3fc00000 3eb4e460 3eb4e460 3f22eabc 3f4c9c45 3e05b390 be5ab99c -> 3f82d8a8 3c9d47c0 bf237af8", + "bf000000 3f8d56ff bdc834b9 3e0b2731 3f5756da 3f5756da 3e55700c -> 3f9e2cc8 bf113550 3dcc0588", + "3e800000 3ea87e8a 3ea87e8a 3f809b58 3f99ffa7 3ed05008 3ec0d8a1 -> 3f0c2f47 3eb272ea 3f590418", + "3f400000 3f28025a 3e8ff279 be0cb8db 3f3a60bd 3f8e5e91 bccff32c -> 3f35c924 3f678c29 bd5ab40c", + "40000000 3f3a1fcb 3dc74f4a 3f3a1fcb 3f41b23b 3f41b23b bdd272e3 -> 3f4944ab 3fb53d46 bf6ebc84", + "00000000 3f2e86a6 3f66c079 3d086762 3f6e83bf bd242a76 bdb2eae4 -> 3f2e86a6 3f66c079 3d086762", + "3f000000 3f95d502 3f95d502 3f53608e bd44f42e be392530 be392530 -> 3f0fad61 3efd60b8 3ea51742", + "3f800000 3d2f990d 3f8139fa 3f8139fa 3e800000 00000000 3f000000 -> 3e800000 00000000 3f000000", + "3fc00000 3ec59981 be6790ec 3ec59981 3de7adbb 3f759933 3f759933 -> bcbeb9a8 3fc6abf5 3f9f7fb6", + "bf000000 3f26daa8 3f26daa8 3f84f5c6 3dce9ab2 3f10add1 3dce9ab2 -> 3f6d5e51 3f31f114 3fc0fbd3", + "3e800000 3f29dba9 3c0edc4a 3f5482fe 3f954e20 3f8481d3 3f8481d3 -> 3f4a0bcf 3e87dafd 3f61a328", + "3f400000 be7932a2 3f0481fd 3f038631 3f2eb9b4 3dc8cbcd 3f2eb9b4 -> 3ee6f03a 3e4fce6a 3f23ecd3", + "40000000 3f4c2ffc 3f9a50d4 3ede32f8 3e115e12 3f081a35 3f11e220 -> bf0380f3 be11b4f8 3f34aac4", + "00000000 3ee197d0 3f93185d 3f93185d bddb41b0 3f9eaaab 3f9eaaab -> 3ee197d0 3f93185d 3f93185d", + "3f000000 3ee865b1 3f9558ca 3eb22064 3f1b30a2 3eda3894 3f0be545 -> 3f07b1bd 3f4be6ef 3ee4f577", + "3f800000 3f301164 bddeb446 bddeb446 3e36c355 3f53f698 3f1bd013 -> 3e36c355 3f53f698 3f1bd013", + "3fc00000 3f9b14f2 3c9844e0 3dd90a8d 3f4fab30 3f89ee06 3f89ee06 -> 3f1c6bd6 3fcdb47f 3fc81cb5", + "bf000000 3e00d7b8 3eaa12c9 3e00d7b8 3e800000 3f000000 3f000000 -> 3d828728 3e7e385c bd7af1b0", + "3e800000 3ec1df10 3ec1df10 3c9f2bff 3e59d01b 3ef1f4a0 3f16d7ac -> 3eaca14f 3ecde474 3e25c3cc", + "3f400000 3f10a561 3ed6d2cb 3f10a561 3e800000 3e800000 3e800000 -> 3ea852b0 3e95b4b3 3ea852b0", + "40000000 3f24d673 3f1288df 3f24d673 3f000000 3e800000 3e800000 -> 3eb6531a bd9446f8 be1359cc", + "00000000 3e9d2c31 3eb4cd5d bd99af1b be66223d be66223d 3f72fa65 -> 3e9d2c31 3eb4cd5d bd99af1b", + "3f000000 3f1e9c44 3f00f836 3f89e83d 3f1f30f0 be79cff9 3f0df1a8 -> 3f1ee69a 3e050870 3f50e111", + "3f800000 3f9bdb94 3e31fb7c 3f9bdb94 3f342c02 3f342c02 3e1b5344 -> 3f342c02 3f342c02 3e1b5344", + "3fc00000 bd23a4b2 bd23a4b2 3c68c685 bd63df9c 3f7c083f 3f0cfbc0 -> bd81fe88 3fbf94c2 3f51a813", + "bf000000 3ed1a09a 3f5c96b8 3f7b5dbd 3ec30066 3f0040e0 3ec30066 -> 3ed8f0b5 3f8560d2 3fa42641", + "3e800000 3f9469c7 3f9469c7 3f6db6dc 3ee51d9f 3f8df468 be387ecc -> 3f7b425e 3f92cc6f 3f26c138", + "3f400000 3f978ee0 3f0fe9a0 3f44f223 3f92bdd3 3f8e4944 3f8f56d4 -> 3f93f216 3f79684e 3f841f63", + "40000000 3f9d841d 3f996eb5 3f9d841d 3f66662c 3ebe730e 3ebe730e -> 3f11c41e bee8d4b8 bef92a58", + "00000000 3ecdd05a 3f10bdb3 3f10bdb3 3e20e756 3e9e79d0 3ef73f26 -> 3ecdd05a 3f10bdb3 3f10bdb3", + "3f000000 3f007752 3f45ed92 3f9e3163 3f8d5389 3f7b7536 3f8d5389 -> 3f4d8f32 3f60b164 3f95c276", + "3f800000 3f050fe8 3f47c87f be66e0d0 3e8b4b97 3f4ea25a 3f4ea25a -> 3e8b4b97 3f4ea25a 3f4ea25a", + "3fc00000 3f231a2e 3f3182a5 3f3182a5 3e9a8b07 3e9a8b07 3cfad7a6 -> 3e096cb8 3dd93794 be99fe6e", + "bf000000 3f4863e0 3f4863e0 3f9c7988 bd64b5c6 bd64b5c6 3edf519e -> 3f99ddbf 3f99ddbf 3fcecc18", + "3e800000 3f152b08 3eb95b2e 3f3183eb 3f705779 be21cb11 be21cb11 -> 3f2bf624 3e6d9600 3ef60c7e", + "3f400000 3f751c8b 3f0181c0 3f751c8b 3f6d1230 3f8dbfc4 be09a537 -> 3f6f14c7 3f750016 3e0de0a2", + "40000000 3f98c2cf 3f98c2cf 3f8779a6 3ede2cfc be1c0e33 3f9d30a1 -> bea6b144 bfbfc65c 3fb2e79c", + "00000000 3f5d0371 3efa679a 3efa679a 3ecfeb9f be57c855 3f9e6ae4 -> 3f5d0371 3efa679a 3efa679a", + "3f000000 3de0f503 3f658049 3f73b7a1 3f67dd82 3e6984d6 3e6984d6 -> 3f01fe11 3f0ff0bf 3f170c6b", + "3f800000 3f6f2acd 3f5bd9cf 3f5bd9cf 3f91839c 3f3c786f 3f42b894 -> 3f91839c 3f3c786f 3f42b894", + "3fc00000 3f9763a6 3f9763a6 3ec9de02 3f6d3201 3f6d3201 be4aa319 -> 3f4c675c 3f4c675c befce954", + "bf000000 3f4ae45c 3f193606 3e6159ea 3f35fe65 be7c58e6 3e46b749 -> 3f555758 3f82ae13 3e6eab3c", + "3e800000 3f4c1b2f 3dbb2b6a 3dbb2b6a 3f5dcb52 3f5a1b39 3ece77e7 -> 3f508738 3e9025c0 3e2d6c3c", + "3f400000 3f880624 3e76e196 be5c1b8e 3e0586cf 3e0586cf 3f0452ed -> 3eba18b2 3e21dd80 3eaaf8f2", + "40000000 3f4c27f9 3f4c27f9 3bd30e34 3e2a3c0f bdd6887e bdd6887e -> beee13e3 bf80e50c be5d20f0", + "00000000 3f75e45d 3f63d4f1 3f75e45d 3eaeb868 3f20d093 3dcad1f5 -> 3f75e45d 3f63d4f1 3f75e45d", + "3f000000 3f36c3d7 3f7b555d 3f7b555d be2b0102 be1e37f8 3eca4c00 -> 3e8c0396 3ed3c75f 3f303dae", + "3f800000 3f1e78b4 3f1e78b4 3e7a9df1 3eb16b7c 3ee71745 3f74fdef -> 3eb16b7c 3ee71745 3f74fdef", + "3fc00000 3db0739e 3f06a5e2 3f06a5e2 3eba4842 3eba4842 3dcd6c40 -> 3f00aef8 3e90c682 bde67528", + "bf000000 3f739289 3f0f9728 3e7e6b41 3f6d874b 3c01ea51 3f9aa106 -> 3f769828 3f565ee7 be6ce336", + "3e800000 3ebe84c4 3f8c7b30 bd1a8631 bdf07b39 3f3dd93d 3f880d7c -> 3e7fb7bf 3f81178c 3e7321cf", + "3f400000 3f80a5cb 3f228fe0 3f80a5cb 3f212ddf 3f212ddf 3f4e5ab9 -> 3f39354c 3f21865f 3f5b16f0", + "40000000 be540faa 3eaf48b5 3f12d9db 3ea44638 3e8f3ac4 3f6cdafd -> 3f594a22 3e5e59a6 3fa36e10", + "00000000 3f8dc377 3daaaafb 3f8dc377 3f48761a 3f48761a 3da2d64a -> 3f8dc377 3daaaafb 3f8dc377", + "3f000000 3f1d6f8b 3f18a51f 3f18a51f 3e91c89c 3f329d3c 3e91c89c -> 3ee653d9 3f25a12e 3ee1896d", + "3f800000 3d733405 3dcc45bb 3d733405 bdd18c15 3f568403 3f568403 -> bdd18c15 3f568403 3f568403", + "3fc00000 bd63ae4d be26018b bd63ae4d 3f949787 3f766aac 3f766aac -> 3fe27203 3fc3301a 3fbc5eba", + "bf000000 3f8bf812 3ea1b95f 3f8bf812 3f49c3bb 3ecd60f3 3ecd60f3 -> 3f9f832c 3e8be594 3fb847fd", + "3e800000 3f0759f1 3ebb42d6 3f8c8647 3f800000 3f800000 3f400000 -> 3f258375 3f063910 3f8164b5", + "3f400000 3ea838fe 3f93c14c 3f265ae0 3f242cfa 3efed72a 3f81ff64 -> 3f1028db 3f297156 3f6c95ce", + "40000000 3e43a64d 3ea639cc 3ec66478 3f97af07 3ef97c1f 3f85400e -> 400b74a2 3f265f39 3fd8e6fe", + "00000000 3f8b4a46 be0a12a9 3e1bb484 3e57ad29 3e57ad29 3f83ec3f -> 3f8b4a46 be0a12a9 3e1bb484", + "3f000000 3f6d2ece 3efff9c8 3efff9c8 3f9ad3f5 bd43762b 3ded7177 -> 3f88b5ae 3e678b03 3e9dab13", + "3f800000 3f0a50e9 3f7596bc 3f7596bc 3f7c75fb 3ea38a67 3d3b4702 -> 3f7c75fb 3ea38a67 3d3b4702", + "3fc00000 be16152c 3e6c9ba3 3f6e0160 3f642110 3f039613 3f642110 -> 3fb47a1f 3f27cda8 3f5f30e8", + "bf000000 3f9cde2d 3eb4f7cc 3eb4f7cc 3eed2957 3e1281ee 3eed2957 -> 3fcda819 3eead336 3e98df06", + "3e800000 3f832cb8 3f08bf5f be274c92 3f47024e be24100d 3f5eb9bd -> 3f7683a8 3eb89d0c 3dc2809f", + "3f400000 3e8b5ed6 3f28be91 3f64fa98 bdb1d265 bd0331bb 3f733393 -> 3b402140 3e10253e 3f6fa554", + "40000000 3f74a778 3f74a778 3f4c5ebf 3f6974ec 3e529b91 3e529b91 -> 3f5e4260 bf0b59b0 bec621ed", + "00000000 3f596381 3f82538c be4eb1c0 3eb0c178 3ee455f8 3ee455f8 -> 3f596381 3f82538c be4eb1c0", + "3f000000 3f3fdaf1 3e9b675d 3f87c58f bc9dc44f 3f75b4d5 3e8f5a5d -> 3ebaeccf 3f21b442 3f2b9c26", + "3f800000 3f25b865 3f53560f 3e076b7e 3eb626e0 3f94d959 3f9751d6 -> 3eb626e0 3f94d959 3f9751d6", + "3fc00000 3f93ef19 bd5e4eaa 3f37fd9c 3f00d436 3f9e5a86 3e597298 -> 3e353ce0 3ff10104 bd273d50", + "bf000000 3f21e64d be24fce0 be24fce0 be48ee70 3e183010 3e36313d -> 3f85fba1 bea1c9ac bea949f7", + "3e800000 3f34a364 3f8152aa be30ba45 3f580839 3ce54d3c 3f596742 -> 3f3d7c99 3f43c699 3da9b71c", + "3f400000 bdd8e6ae 3f408a06 be635292 be4855a3 be4855a3 be079bb2 -> be315d10 3d292730 be1e896a", + "40000000 3d9b14ac 3d9b14ac 3f87afa0 3f55abeb 3f9ef001 3f632e5d -> 3fcbfaa0 401a175c 3f36fd7a", + "00000000 3f8c138d 3f0ba566 3f8c138d 3f828ff5 3f847458 bde1683d -> 3f8c138d 3f0ba566 3f8c138d", + "3f000000 3f896dc1 3f64a0e2 3e2aba3b 3f702dc8 3f9d5f26 3f844eb3 -> 3f80c252 3f87d7cc 3f19a5fa", + "3f800000 bccea517 bccea517 3e960e11 bdc784d7 3e8575aa 3e8575aa -> bdc784d7 3e8575aa 3e8575aa", + "3fc00000 3f06ceee 3ea8d972 3f21ec5c be601bdd 3e8d34c3 3f400859 -> bf1771ea 3e7ec4d6 3f4f1658", + "bf000000 3e8bcf2c 3eaf834c 3e8c49ab 3c99de47 bd12f772 be738e65 -> 3ecce7d0 3f083a35 3f07a90d", + "3e800000 3f846b05 3e7afe45 3f846b05 3ef76a39 be353fe2 3f6eeb7c -> 3f658dcf 3e0eeebc 3f812db4", + "3f400000 bd4024be bd4024be 3e1a8bfe 3cf3564a 3f3f656a 3ed9c993 -> 3c2cdcb2 3f0c8b7d 3eb6a8ae", + "40000000 3f57a41b 3f1ab9d4 3f11e5ba 3e924569 3ea2a716 3f68c7b1 -> be8abd64 3cfda840 3f9fd4d4", + "00000000 3efb9e5c 3efb9e5c 3e1978df 3f9ae921 3f5bb2eb 3f5bb2eb -> 3efb9e5c 3efb9e5c 3e1978df", + "3f000000 3f84c944 3f03f75a 3dae4858 3f84a9c0 3f26726d 3f2e8218 -> 3f84b982 3f1534e4 3ec44b23", + "3f800000 3f9675fe 3f1beaa1 3f90761d bd051e2d bd051e2d 3ec1a54e -> bd051e2d bd051e2d 3ec1a54e", + "3fc00000 3eb5bf44 3eb5bf44 3f540848 3f8e4807 3f2d858c 3f2d858c -> 3fbeb422 3f56d881 3f1a442e", + "bf000000 3f1a4446 3f1a4446 3f9aec4e 3f6905b8 3f6905b8 3f042eb5 -> 3ee5c71a 3ee5c71a 3fc756c8", + "3e800000 3f9536d4 3f60e26e 3f60e26e 3f69b237 3f0a94ca 3f082ea1 -> 3f8d1f66 3f4b4f04 3f4ab57a", + "3f400000 3f973c89 3f973c89 3f8c24ae 3f9b54ca 3e28f110 3f8f6e81 -> 3f9a4eba 3ed696ef 3f8e9c0c", + "40000000 3f3e28a6 3f857b88 3f3e28a6 3f967e38 bdb535f5 bdb535f5 -> 3fcde81d bf9c2247 bf6b7623", + "00000000 3f162a7e 3f162a7e 3eb9b248 3dcba819 3f86484e 3eb6c73b -> 3f162a7e 3f162a7e 3eb9b248", + "3f000000 be168c60 3c510835 3ddc9b42 be6253b3 3f82da58 3f73b16a -> be3c700a 3f047c68 3f07a269", + "3f800000 be6325fd be6325fd be5ed763 3f82893d be70be20 3f284da0 -> 3f82893d be70be20 3f284da0", + "3fc00000 3ed34f12 3dce8755 3e9ec8bc 3f74379d 3f86f9bf be385bde -> 3f9cbfd4 3fc40263 bed9a944", + "bf000000 be1a0bf2 3f89e8e9 3f89e8e9 3f400000 3f000000 3f000000 -> bf19c47b 3faedd5e 3faedd5e", + "3e800000 3f93b622 3f93b622 bd35021e 3f8614c4 3f8614c4 3e993ef9 -> 3f904dca 3f904dca 3d2abc5c", + "3f400000 3f43f473 3eeaad3a 3f6e6e1a be601872 3f1b5a1b 3f92d141 -> 3cdf10e8 3f11d93b 3f8beab4", + "40000000 3f99578b be24a95a be24a95a 3fa00000 3fa00000 3fa00000 -> 3fa6a875 402a4a96 402a4a96", + "00000000 3ef582d9 be0b5827 3ef582d9 3e8d5e05 3e8d5e05 3c37e5e2 -> 3ef582d9 be0b5827 3ef582d9", + "3f000000 3f94f638 3f94f638 3d879697 3eb9111a 3eff6ebb 3eb9111a -> 3f433a7e 3f54d1e7 3e5af6c0", + "3f800000 3f1c0958 3f4f276f 3f1c0958 3f9f86fe 3f5d71a4 3f369bd5 -> 3f9f86fe 3f5d71a4 3f369bd5", + "3fc00000 3f034f84 3f034f84 bd45a94e 3e0c136f 3f7d88ff 3eebd8f7 -> bd520788 3f9d52de 3f371003", + "bf000000 3edcbd76 3e404ad7 3edcbd76 3f3c4fdc 3f3fc7e6 3f3c4fdc -> 3e8ecc54 bdbe3f14 3e8ecc54", + "3e800000 3e068b39 3e9431c8 bdf54414 3f000000 3f000000 3f000000 -> 3e64e86b 3eaf2556 3d1019e2", + "3f400000 3e57e964 3e57e964 3e9feba0 3ed6a717 3f9b17e0 3ed6a717 -> 3ebbfa7e 3f762266 3ec8f839", + "40000000 be77a494 3df976fb be77a494 3f802588 3f036ece 3ef5cbf1 -> 400f9fd1 3f67aebd 3f99da8b", + "00000000 bdddde6f 3f3fb125 3f8eebf2 3f583371 3f9ccf79 3f8b0944 -> bdddde6f 3f3fb125 3f8eebf2", + "3f000000 3f066443 3e96a0d1 3e96a0d1 3eff513d 3e8cd71b 3f1fd4d5 -> 3f030671 3e91bbf6 3eeb253e", + "3f800000 be559e16 bd88c39b bd88c39b 00000000 3f800000 3e800000 -> 00000000 3f800000 3e800000", + "3fc00000 3e7166da bd73ee97 bd73ee97 3f68b9c8 3f9d4d0b 3f3ed719 -> 3f9f74e8 3fefc34a 3f92f10d", + "bf000000 be32e5ff 3e583596 be32e5ff 3e05221b 3f917776 3da4abf8 -> bea77506 be80c6bc be9ac1fe", + "3e800000 3f84ddf9 3f7e1ac6 3f9ee28c 3e9da7d9 3f1268d1 be713845 -> 3f5b01f1 3f632e48 3f5f404e", + "3f400000 bd90620b 3e8ea01f 3f92035e 3e19bdef 3e4413f5 3daaf8be -> 3dc28463 3e5a5f08 3eb21202", + "40000000 3e6f0569 3dd2513c 3db19362 3f9c332a bd3bfb8e bd3bfb8e -> 400d42d3 be472665 be36c778", + "00000000 bdc2446b 3f5b2295 bdc2446b be1fddb5 3ec7248c 3ec7248c -> bdc2446b 3f5b2295 bdc2446b", + "3f000000 3cc0f5ae 3cc0f5ae be45c327 be01bbc1 be01bbc1 3ecb54fa -> bd533a16 bd533a16 3dd0e6cd", + "3f800000 bd15e37e 3eec8b43 3ecb1f95 3f000000 3f000000 3f400000 -> 3f000000 3f000000 3f400000", + "3fc00000 bdcd5543 be217151 3f6a1479 3f1bc85c 3f499fb2 3f499fb2 -> 3f7681de 3fa14edb 3f396550", + "bf000000 3d5eb579 3f94abc6 3f94abc6 3ecbb0de 3f745928 3dafb43a -> bdf059a1 3fa1eb5f 3fd98407", + "3e800000 3e89795b 3e8decc0 3e25062b 3f400000 3e800000 3e800000 -> 3ec71b04 3e8a7190 3e3bc4a0", + "3f400000 3f44b256 3f1e51a5 3eada089 3e96c10d 3e96c10d 3ece9ee1 -> 3ed369f5 3ec0399c 3ec65f4b", + "40000000 3e83a6bc 3ec1b3a1 be678a1f 3f6a620b bd4e44be bd4e44be -> 3fc9785c bef544d0 3e0067c0", + "00000000 3f57e915 3f57e915 3f8600f2 3f22cfd2 3f08fe47 3f22cfd2 -> 3f57e915 3f57e915 3f8600f2", + "3f000000 bc059cdf 3f92a500 3d7f45e3 3f800000 3f000000 3f800000 -> 3efde98d 3f52a500 3f07fa2f", + "3f800000 3f1ff9aa be7bf0e3 3d82f555 bcda733e be3e9de2 be3e9de2 -> bcda733e be3e9de2 be3e9de2", + "3fc00000 3f37e417 be5f2f3d be5f2f3d 3f7c6a83 3f8f2ff9 3ec60b03 -> 3f8f56dc 3fe4baea 3f306e2a", + "bf000000 3f260529 3e03787a 3e84d45c 3f0885be 3f6090ed 3e5cd014 -> 3f34c4df be7bed23 3e900a85", + "3e800000 3f8445b8 be08c217 3b5bc956 3d9f1699 be67c89c 3d9f1699 -> 3f4b6149 be2083b8 3cb3b179", + "3f400000 3f4c010a 3cd4e1cd 3e1728b5 3e5bd8a5 3e5bd8a5 3e986a44 -> 3eb871c3 3e2b898a 3e8534ca", + "40000000 3f0cc4f6 3dbd6e9e 3bb1ff06 3f8cf580 3c649119 bcbe0f42 -> 3fd38885 bd844a58 bd544f23", + "00000000 3f4a0f3b 3f402bd7 3f4a0f3b 3f9b7ffc 3f9ff68e 3f26f327 -> 3f4a0f3b 3f402bd7 3f4a0f3b", + "3f000000 3f95f6c2 3e604ce6 3f88cd66 bde2aaf5 3f5b7204 3e471edf -> 3f07cc13 3f09c29f 3f21b142", + "3f800000 3ee88df5 3f63e17b 3f72a9c7 3e18415a 3e18415a 3f183fb5 -> 3e18415a 3e18415a 3f183fb5", + "3fc00000 3f3eaebe be1bb492 3f7a1ddf 3f800000 3f400000 3e800000 -> 3f905450 3f99bb49 bde8777c", + "bf000000 3f8bf93e 3b6f72b2 3b6f72b2 3f7f73fd 3f7f73fd 3ec3af78 -> 3f9218de befca5a5 be3e12c8", + "3e800000 bc181c1b 3f437475 bc181c1b 00000000 3f000000 3f000000 -> bbe42a28 3f329758 3df1bd5e", + "3f400000 3f140508 3e149703 3f140508 00000000 3f400000 3f800000 -> 3e140508 3f194970 3f650142", + "40000000 3f888643 3f4a2189 3f4a2189 be6edddd bd5970c4 3ec294c4 -> bfc43dba bf654fa2 bcf198a0", + "00000000 3f3218df 3f3218df 3f9a7016 00000000 3f800000 00000000 -> 3f3218df 3f3218df 3f9a7016", + "3f000000 bdac5b2f 3f625ce8 bdac5b2f 3eb1e7f9 3e787508 3e787508 -> 3e06d12d 3f103d15 3da24770", + "3f800000 3e8f8063 3f6b690c bd0ab79a 3f4ac4fe 3f743e8b 3e038640 -> 3f4ac4fe 3f743e8b 3e038640", + "3fc00000 3f228906 3f15c8c2 b7086374 3f50576c bd9fd3d7 3f50576c -> 3f673e9f bed1b832 3f9c41b3", + "bf000000 be21b540 3f5c7bd3 be21b540 3f2eb85e bc98f05b 3e02d5b7 -> bf140027 3fa68ebf be99fd5e", + "3e800000 3ed1a2b7 be631eb2 3f17367b 3eb7abe3 3eb7abe3 be21f4c2 -> 3ecb2502 bd9d0229 3ece9320", + "3f400000 3e4b2738 3e0c605d be44c1a0 3f400000 3e800000 3f000000 -> 3f1cb274 3e631817 3ea767cc", + "40000000 bd39bc49 3e1326cc 3e1326cc 3e52ce22 3f6804e2 3e52ce22 -> 3eea05ab 3fd5a008 3e893abc", + "00000000 3f55c5f5 3f50b59b 3f55c5f5 3ec03b18 3f9d65c4 3f026c4c -> 3f55c5f5 3f50b59b 3f55c5f5", + "3f000000 bbe8ddda be25225e 3f6dc349 3efd3b5c be3f4b81 bb8f24f7 -> 3e7997e5 be3236f0 3eeca4ff", + "3f800000 3f7eba35 3f87ca2d bdd762f6 3f9631bd 3ee90382 3f9acf61 -> 3f9631bd 3ee90382 3f9acf61", + "3fc00000 3eaa4d83 3f1810e5 3eaa4d83 3ee004cb 3f7c4f0a 3f4ac621 -> 3efae06e 3f97370f 3f82cae9", + "bf000000 3f094712 3f094712 3f9f6e03 3f757663 3ea29ba0 3e9a4c44 -> 3ea65ed3 3f2543b3 3fdbdb7c", + "3e800000 3f2a584e 3de3d393 3f2a584e 3e1f2a36 3ed3cd63 3ed3cd63 -> 3f09b4de 3e3f5608 3f1a3be7", + "3f400000 bcf74e54 3f8f668d 3f327bc7 3ee30a5b bdd049b6 3ed5dfd3 -> 3ea66a8b 3e50b176 3ef9a5c2", + "40000000 3f7c6d85 be0d1e1f 3f58bfd0 3e95fa35 3f065db7 3dd48f34 -> becce6a0 3f98017b bf239c03", + "00000000 3f4ec85e 3ed08d1f 3f8a9c61 3f8b209a 3ef867a9 3f9c76e6 -> 3f4ec85e 3ed08d1f 3f8a9c61", + "3f000000 be4a9322 3eb08ea6 3f818077 3e800000 3e800000 3f800000 -> 3cd5b378 3e984753 3f80c03c", + "3f800000 3f050292 3ed703cd 3f62c222 3f9cf66e 3e271cc4 3f9cf66e -> 3f9cf66e 3e271cc4 3f9cf66e", + "3fc00000 3f92dd89 3f92dd89 3f5ff40e 3ef6ceb3 3eddfc0d 3dbe6647 -> 3e18f5f4 3d9cfc08 be988db4", + "bf000000 3f3eb9bd 3f7f69dd bdc72b62 3f6fc328 bde94aaa bde94aaa -> 3f263508 3fc6d9bb bdb61bbf", + "3e800000 bd3e443a 3f56fce4 3ec3e871 3f800000 00000000 3f800000 -> 3e5c5335 3f213dab 3f09772a", + "3f400000 3f84b6fe 3f11a87f 3f11a87f 3ef71b4f 3eccdcd6 3ef71b4f -> 3f1f05bc 3ee279e0 3f01145d", + "40000000 bdb4d826 bdb4d826 3eba28af 00000000 00000000 3f800000 -> 3db4d826 3db4d826 3fd175d4", + "00000000 3dff8333 bdb84fd8 3ed4b174 be0d0cff be0d0cff 3f5a9121 -> 3dff8333 bdb84fd8 3ed4b174", + "3f000000 be5b549d 3edb6ba7 bd48910c 3f92f0c8 3e4d0675 3e4d0675 -> 3eef0c69 3ea0f771 3d9ae232", + "3f800000 3f601538 3f601538 bdf23d33 bd9f1eba 3ecaf350 bd9f1eba -> bd9f1eba 3ecaf350 bd9f1eba", + "3fc00000 be084c7b 3c96d546 be7cc346 3f9bd360 3eea5585 3dee85d0 -> 3ff241d8 3f2d64cf 3e98a300", + "bf000000 bdcd3274 3f41dd9f 3c0eed4b 3e80a47a 3e842e59 3e842e59 -> be8d4528 3f80e06c bded9034", + "3e800000 3f7476a8 3e205a63 3f7476a8 3f51f763 3f5ac798 3f5ac798 -> 3f6bd6d7 3ea985b1 3f6e0ae4", + "3f400000 be163b4d 3f51d1cb 3f51d1cb 3f20ec59 3ed8a367 3f20ec59 -> 3ede9b1c 3f05b1b9 3f2d25b6", + "40000000 3f505e6a 3e6842e0 3f5b2fa8 be31ede0 3f8946bb ba65e3ef -> bf94aaad 3ff5851a bf5ba29a", + "00000000 3e959206 3f389664 3e959206 3f000000 3f800000 3f400000 -> 3e959206 3f389664 3e959206", + "3f000000 3f7f5f40 3ebb33aa 3f7f5f40 3f000000 3f000000 3e800000 -> 3f3fafa0 3edd99d5 3f1fafa0", + "3f800000 3f991448 3e7fea31 3f0baaa0 3f05b219 be0797f9 be0797f9 -> 3f05b219 be0797f9 be0797f9", + "3fc00000 3f593c21 3e5551f4 3da9b354 3f81c2e6 3e58d7e0 3eb2f649 -> 3f8c5551 3e5a9ad6 3ef73b04", + "bf000000 3d764eea 3d0da0c9 3e0768d5 3e52504a 3e52504a 3ea3dbb8 -> bc4ca8d0 bd502f66 3d1d0620", + "3e800000 3f18952a 3e1ae716 3ee2aab7 3d887c8a bd8375ab 3f6a28c5 -> 3eed6788 3dc77d36 3f0f8a36", + "3f400000 3f8d5dab 3f1db915 3f44c290 3f0115ce 3f3dd195 3e0068bf -> 3f277f30 3f35cb75 3e928890", + "40000000 3f23bcfb 3e1170a8 3f23bcfb 3f366292 3e6a02fa 3f366292 -> 3f490829 3ea14aa6 3f490829", + "00000000 bd063f26 bd063f26 3f9a8051 3e10f075 3e10f075 3f7e4067 -> bd063f26 bd063f26 3f9a8051", + "3f000000 be38f307 3f49d31d bd89dda7 3e2b0efe 3ef3bdfb 3e2b0efe -> bbde4090 3f21d90d 3d4c4055", + "3f800000 3f745030 3f5b74b5 3f5b74b5 3f53e8a5 3eaed4e5 3f2b241c -> 3f53e8a5 3eaed4e5 3f2b241c", + "3fc00000 3f82870c 3e891ebc bdc39483 3d70d093 3d70d093 baac1b7d -> bed7e6fc bd3b4214 3d3b8339", + "bf000000 3f99a2b0 3f99a2b0 3ea0b48f 3f9566fe 3f30468a 3e988ec4 -> 3f9bc089 3fba6266 3ea4c774", + "3e800000 3c9e2f1e be687e76 3f7b46fd 3e6bc851 3e44f05f be237086 -> 3d938cfe bdfa4580 3f323e36", + "3f400000 3f991610 3ef26897 3ef26897 3f9deb35 3dbece8d 3dbdcf6e -> 3f9cb5ec 3e40c1c0 3e406214", + "40000000 3f9ed0be 3f1465dd 3f1465dd 3f18ffea 3f0c4c41 3f85b52d -> bd3a1a80 3f0432a5 3fc1376c", + "00000000 3daf1dd3 3f5f633f 3f5f633f 3f641e06 3f641e06 3f341b5b -> 3daf1dd3 3f5f633f 3f5f633f", + "3f000000 3c9cdc77 3f295398 3f1d0493 3e9c87c3 3f7ea1f3 3e9c87c3 -> 3e26558a 3f53fac6 3eeb4874", + "3f800000 3f2f2d2e 3f9958e0 3de69e96 00000000 3f400000 3e800000 -> 00000000 3f400000 3e800000", + "3fc00000 be51d6e9 3f9de9a9 be51d6e9 3f6ec000 3ed5d2af 3f6ec000 -> 3fc02d6f 3c1d1680 3fc02d6f", + "bf000000 3e5273a8 3ef27a93 3ef27a93 3ea842f0 3ef2877e 3ea842f0 -> 3e136a8c 3ef2741d 3f0bcb32", + "3e800000 3f6d8b71 3f89fd0c 3f89fd0c 3f844472 3f844472 3f00ccd1 -> 3f744ace 3f888ee6 3f6f2ec6", + "3f400000 3eb32d22 3eb32d22 3f0d9718 3f132e64 3e21dc51 3f132e64 -> 3f04c86f 3e52fbce 3f11c891", + "40000000 3f9563e8 3e5718ed 3e5718ed 3e58cbee 3f30b521 3f30b521 -> bf3e61d9 3f95d203 3f95d203", + "00000000 3f3d0b20 3f8b4d6f 3f77b191 3c8da18f 3e1b4f05 3f4f9d97 -> 3f3d0b20 3f8b4d6f 3f77b191", + "3f000000 3f8c1a11 3f6b7ba9 3f6b7ba9 3eecfbd1 3eecfbd1 3f43c51d -> 3f475905 3f30fcc9 3f57a063", + "3f800000 bdcf9321 bdcf9321 3f90f2d2 3f09a3fd 3ea53a93 3f09a3fd -> 3f09a3fd 3ea53a93 3f09a3fd", + "3fc00000 bd633f3b 3f1fc88e bd633f3b 3e94a741 3f4f1ac2 3f96c1a1 -> 3eed2ed6 3f66c3dd 3fe5af6f", + "bf000000 3f0c36d7 3ea336ee 3f0c36d7 3f9d48ec 3f489354 3ecc85f5 -> 3e542558 3db0fc44 3f1f30c5", + "3e800000 3f02eb17 3f02eb17 3f53dd9a 3e49cef0 3e9384c3 3ed0e298 -> 3edd9a80 3ee941d3 3f390287", + "3f400000 3f915192 3f5c6c40 3efe479f 3f99b50d 3b8178f2 3f820414 -> 3f979c2e 3e5f7516 3f62cf12", + "40000000 3eeb87a0 3f14a73a bd3b2e23 3f05694d be0f1c13 3f9a526c -> 3f150eca bf5c3544 401d3f25", + "00000000 3f03d2f2 3f6f1318 3f6f1318 3f000000 3f400000 00000000 -> 3f03d2f2 3f6f1318 3f6f1318", + "3f000000 bb13e3d0 bb13e3d0 3eef2eb8 3e5e2b74 3ebd1a13 3e1af932 -> 3ddbdbe5 3e3bf24b 3e9e55a8", + "3f800000 3e113594 3e113594 bd0c3683 3f820304 3e7db5bf 3f6946ae -> 3f820304 3e7db5bf 3f6946ae", + "3fc00000 3f191854 3f50e0fa 3f191854 3f2cb327 3ebc9351 be7851e5 -> 3f368090 3e13f800 bf29aae0", + "bf000000 bd0843cc 3df16b4c bd0843cc 3edd6f9b 3f959bbf 3da01356 -> be884484 bed0af42 bdb63c84", + "3e800000 3cafc593 3f5a5c65 3f14184a 3f8dff16 3f8dff16 3ebe70b5 -> 3e963c59 3f6ac4d7 3f06e04e", + "3f400000 3ec03080 3f10f392 3de1495e 3d8abd01 3d8abd01 3e6652fa -> 3e141f20 3e44fa72 3e48e768", + "40000000 3eab1a4d 3e9c8900 3e9c8900 be66300e 3f859ed1 3f859ed1 -> bf48a52e 3fe41b62 3fe41b62", + "00000000 3f9be60a bc0764c5 bc0764c5 bde5f0af 3ee4c501 3f0a4962 -> 3f9be60a bc0764c5 bc0764c5", + "3f000000 3ecaa00f bd2c46a5 bdc63221 3e5c8818 be3231dc 3f166e38 -> 3e9c720e bddd4385 3e7b4fe8", + "3f800000 3f1acca3 3ea5bb0b bdb9d4c0 3dfce358 3f027683 3f2e8abe -> 3dfce358 3f027683 3f2e8abe", + "3fc00000 3f55d1c6 3e386c55 3f02560e 3f80277d 3f61d8fa 3ec9b768 -> 3f8ac6ca 3f9ddbf7 3eac3d0e", + "bf000000 3f411864 3f949e4e 3efedeb8 3f11d96a 3f795b8b 3f8efc0a -> 3f58b7e1 3fa09692 3e40ac00", + "3e800000 3f874b6d 3f87cf69 3e0c579f 3f034c3b 3f98b634 3e56342e -> 3f6bc433 3f8c091c 3e1ecec2", + "3f400000 3dde5bae 3dde5bae be4672bc 00000000 00000000 00000000 -> 3cde5bae 3cde5bae bd4672bc", + "40000000 3f7371bc 3f3d8ae3 3f7371bc 3f8c9046 3f0f54be 3f8c9046 -> 3f9f67ae 3ec23d32 3f9f67ae", + "00000000 bd9208aa 3eaa80a9 3f3d7942 3f1ec429 3ecf310d 3ed29ad6 -> bd9208aa 3eaa80a9 3f3d7942", + "3f000000 3f49ff22 3f4afe51 3f4afe51 be49b3c6 bdeefef8 3f15950f -> 3e979230 3ead1e72 3f3049b0", + "3f800000 3ef0b314 3eaf6def 3e622699 3f04e388 3f4676ea 3f03b7c9 -> 3f04e388 3f4676ea 3f03b7c9", + "3fc00000 be16d1e6 be16d1e6 3ef5ec06 3e30a81b 3e30a81b 3f04332d -> 3eaa328e 3eaa328e 3f08d1c2", + "bf000000 3f7b8089 3f7b8089 3f3d6870 3e4d371c 3da3c16a 3da3c16a -> 3fafccf5 3fb7825c 3f88f049", + "3e800000 3e72c7c7 3f8af1ce 3ed34f97 00000000 3e800000 00000000 -> 3e3615d5 3f606ab5 3e9e7bb1", + "3f400000 3da24650 3f2026c3 3f3bb17e 3ea3cd78 3ea3cd78 3e29348f -> 3e84fe7f 3ecaed7c 3e9d4c74", + "40000000 3f715c9a 3e99168c 3e99168c 3e849efa 3f66da83 3de1cc7e -> bed97b40 3fc094e0 bda0c134", + "00000000 3f9aa1fc 3f6d119b bcaf2cc8 3ec64726 3f3b82b5 3ec64726 -> 3f9aa1fc 3f6d119b bcaf2cc8", + "3f000000 3e9a396b be13a26c 3f2ff54f 3f000000 00000000 3f000000 -> 3ecd1cb6 bd93a26c 3f17faa8", + "3f800000 3f9fe0ff be2d524d 3f9fe0ff 3dfe5f93 3f3c74a9 3dfe5f93 -> 3dfe5f93 3f3c74a9 3dfe5f93", + "3fc00000 3e113397 bd235a91 3f5bd792 3f542de9 bd16e5c3 be42990c -> 3f960f36 bd10ab5c bf36e52e", + "bf000000 3f8faedd 3f29d068 3f46eddb 3ed99249 3f8a4dff 3f8a4dff -> 3fbc5403 3ee8d53a 3f2016c9", + "3e800000 3ed701dd 3dc3983f 3ed701dd 3f3ab1ec 3f3ab1ec 3f3b4975 -> 3efe9a5c 3e820582 3efee620", + "3f400000 3ea92f6f 3e123842 3db295b5 00000000 3f000000 3f400000 -> 3da92f6f 3ed24708 3f1594ae", + "40000000 3f902396 3f0afe29 bcaa2563 3f6e6149 3d670bd6 3f87ca29 -> 3f3c7b66 bedc395c 40091e74", + "00000000 3d6641a7 3d6641a7 3eee1c5a 3f8bfd80 3f58c4f6 3f58c4f6 -> 3d6641a7 3d6641a7 3eee1c5a", + "3f000000 3e5889ad 3f99808e 3e5889ad 3f46cb80 3d960937 3d960937 -> 3efcedeb 3f22e121 3e11c724", + "3f800000 3e04c680 be24998e 3f0e2e24 3e4d8c7c 3e6b5c16 3e4d8c7c -> 3e4d8c7c 3e6b5c16 3e4d8c7c", + "3fc00000 3dc89fea 3ea53dd0 3f4f7072 bd3a55d9 3e80c12b 3e2125c4 -> bdf01058 3e5d05b0 be2d283e", + "bf000000 3f35c0a8 3f8190fd 3f8190fd bd292c85 bd292c85 3f602363 -> 3f8af530 3fc4fe2e 3f8a50a3", + "3e800000 3f7de2e6 3f7de2e6 3f873e44 3e316f06 3e316f06 bd0b97a7 -> 3f49811c 3f49811c 3f48af07", + "3f400000 3f9834d2 3d59cfad 3ef882cb 3f4fbc0a bcb553ac 3e6445ea -> 3f67e771 bb58b754 3e93baeb", + "40000000 3f191930 3d1ebaaa 3f191930 3f2a99fa 3f70f3d9 3f9813fd -> 3f3c1ac4 3febfe04 3fe39b62", + "00000000 be04a1b8 3f1f4db2 3f357c76 3f094c05 3f9b89be 3f9b89be -> be04a1b8 3f1f4db2 3f357c76", + "3f000000 3f9d2b6a 3ef43ab6 3f413bae 3de9613c be1e37a7 be0c0821 -> 3f2bc17e 3e251ee2 3e9e39a6", + "3f800000 3f5c5491 bdb50405 3f88601b 3f1aae2c be78553e 3f1aae2c -> 3f1aae2c be78553e 3f1aae2c", + "3fc00000 bcc3cd40 3f6227aa bcc3cd40 3f11e43e 3f11e43e 3ed0d84f -> 3f5de592 3ed38510 3f1fb170", + "bf000000 be4d8328 be77ae90 3f79da53 00000000 3f400000 3f400000 -> be9a225e bf3ce176 3f8b63be", + "3e800000 3f436132 3f41f65d 3f221cdb 3f9d11b3 bd8c42eb bd8c42eb -> 3f6111c0 3f0d16af 3eea6719", + "3f400000 3f387102 3f387102 3f45ae84 be0eb970 3f9e7bde 3f2c6cbf -> 3d9acbdc 3f8deb07 3f32bd30", + "40000000 3f6ca7e0 3f04a748 3ebd52b3 3f7f2a39 3f4943e4 3f87fe47 -> 3f88d649 3f86f040 3fe0a7e1", + "00000000 3da6adde 3f8bbeec be0fb2e5 3d997200 3eda6c18 3eda6c18 -> 3da6adde 3f8bbeec be0fb2e5", + "3f000000 3f81bd94 3eaf7a69 3eaf7a69 3f0fd671 3dd0a992 3f0fd671 -> 3f49a8cc 3e63a4ce 3ee793a6", + "3f800000 3f95e643 3f396d8c 3f396d8c 3daf3953 3e1731a3 3f6b9399 -> 3daf3953 3e1731a3 3f6b9399", + "3fc00000 bdded8ca 3f8dcee1 3f8dcee1 3db4e507 3e110789 3d6e817c -> 3e3f61f8 beaed81b beeee57b", + "bf000000 3f058588 3ef09e73 3ef09e73 3f2aeadd 3cc3f2f7 3f8047b4 -> 3ee5a5bb 3f31670a 3e50bc88", + "3e800000 3e43ba74 be29a516 be44a2ed 3f91e093 3f91e093 3f45decc -> 3edb467e 3e248556 3d499268", + "3f400000 3f2930db 3f79f8b9 3f2930db 3f55be7a 3f55be7a be1a1b38 -> 3f4a9b13 3f5ecd0a 3d5671c4", + "40000000 3f9c48ca 3f7328ea be6649b6 3f400000 3f800000 3f800000 -> 3e8edcd8 3f866b8b 400e649b", + "00000000 3f7987ce 3f7987ce 3f205396 3f9ee436 3f8cdf82 3f951690 -> 3f7987ce 3f7987ce 3f205396", + "3f000000 3f9fa102 3f9fa102 3f8cb83f 3cebba13 3f56e316 3f56e316 -> 3f234fea 3f858946 3f7829ca", + "3f800000 3dcb119f 3efb1c97 3efb1c97 3f0560db 3f8bd161 3f0560db -> 3f0560db 3f8bd161 3f0560db", + "3fc00000 bdcd8767 3f3593cc 3eaad615 3c96f118 3e08261b 3c96f118 -> 3d9f5e1c be1eee70 be0e88e0", + "bf000000 be0caa19 be0caa19 be38006c 3f000000 3e800000 3f800000 -> bee97f93 bea97f93 bf450028", + "3e800000 3f5b7f14 3e3ccc71 3e3ccc71 3f9c80a0 3f358dbe 3f993ae3 -> 3f72df9f 3ea1938a 3ee0078e", + "3f400000 3e08c59a 3e08c59a 3a692d4a 3f80d1af 3f1c8292 3f1c8292 -> 3f49c6e0 3efbdc8e 3eeae101", + "40000000 3f1680c9 be104c0f 3f1680c9 3f018389 3f82730b 3f4cfff8 -> 3ed90c92 400b77cc 3f81bf94", + "be2a1f08 3ed87f3b bdb99a93 3f0c9fc3 3f82af68 3f52c682 3f82af68 -> 3ea59e98 be78498d 3ef120c6", + "3ea2430b bdbe9d2c 3e8e3435 3f1dd77d 3ead755a 3e9715c2 3ed24080 -> 3d335dca 3e9104bc 3f0d229b", + "3f82d4f0 bd859e3c 3f4565a9 3f1bbc8a 00000000 3f000000 00000000 -> 3abd3063 3efcedee bc5c819c", + "beb9b2eb 3f613e71 3f78e414 3e99f6d7 b996e0eb 3f82f756 3ddc1f5d -> 3f997b88 3f742932 3ebdd8c5", + "be193f51 3f208f6c 3ef2c60b 3ef2c60b 3f000000 3f400000 3f800000 -> 3f256edd 3edda366 3eca7b7c", + "bcbcc3f4 3f20533b 3c8427d8 bdef4a88 3f7d7bf4 3df6c192 3df6c192 -> 3f1e2db2 3c60ea16 bdfa7db0", + "beecc3fe bd602c0e 3f52e6a3 3e318bdf bd68d5d0 3f998bfd 3f998bfd -> bd5c2a7f 3f266b13 be9a320e", + "3f86dd5f 3f1b7f80 3f4dd0f8 bc63ee8b 3f2f43a0 bc87c3f5 3e6f07a8 -> 3f305300 bd7821ec 3e7c9cfe", + "bee9e4ed 3e013984 3ec2afc1 3e4ec767 3c9974dc 3c9974dc 3f80c432 -> 3e337eaf 3f0b9f12 be295944", + "3faf8d46 3f0e232c 3f14a2ac 3f45b762 be4188b4 3f8d4a17 3f19b5da -> beee52d6 3fa62b58 3f095cb8", + "3ec4696d 3f502dae 3ea30f59 be0fa4d0 3e800000 3f400000 3e800000 -> 3f18de82 3ef7d0f8 3c1aa918", + "bd03ec72 3ea469a1 3ea469a1 bdebaf37 3f800000 3f000000 3f000000 -> 3e9937b2 3ea17679 be0a20cd", + "3e7cc1f4 3f715a04 3f212c75 3f212c75 3e34f28d 3f9c391f 3f294148 -> 3f40f1a4 3f468348 3f232b1c", + "bebc07f7 be07855c 3f99bbb9 be07855c 3f400000 3f400000 3f000000 -> bee9ab31 3faeef8d bebaa934", + "3fa28be1 3f031e80 3ead02e3 3ead02e3 3e25a212 3f6d16ac 3e5e3b0c -> 3d899124 3f8add70 3e3cd1eb", + "3fb0dd9c 3ebf3c57 be12eba1 3de63f25 3e616f42 3f412b63 3eca861b -> 3e257bd8 3f8c77e3 3f00eeba", + "bedbb411 3e46fa2f 3f8d94a5 3f8d94a5 3f400000 00000000 3f400000 -> bd34c7b8 3fca5584 3fa123c1", + "3faf9d83 3f881b07 3dbdf214 be14a399 00000000 3e800000 3e800000 -> beca85a4 3e9df35b 3ecb4300", + "3f4cadc2 3c49bfc6 3f250610 3f250610 3efcaaf6 3efcaaf6 3f774cdf -> 3ecb474b 3f061716 3f66ce55", + "be6700b5 bdeb206f 3f909c94 3f9709e2 3f8b89c8 3f958438 3f434090 -> bec5f480 3f8f8152 3fa3167e", + "3f5a9b44 3d2e6f0c 3e297a0d 3f6e3b33 3f6c2d7d 3f13e91e 3f5b74bc -> 3f4b45a6 3f047e8e 3f5e32ce", + "3ee391a3 3eb366b5 bdc8ba0f 3e89a769 3f0c4a71 3ea5beb4 3f9d7452 -> 3ee05f75 3db72a50 3f3233fc", + "3f899ebc 3e3d99a7 3f3609d5 3ed89496 3ebcad67 3f5de369 3eae66e0 -> 3ec3bb9c 3f60e220 3eab3b5b", + "3da83527 3f976d60 3f82a348 3f82a348 3f389d04 3f389d04 3e0cd078 -> 3f92924f 3f7efaaa 3f72b52e", + "3fb71f64 3e088d44 3e088d44 3ddb4f91 3e32e543 3f6bc829 3f9e79eb -> 3e452175 3fa14f39 3fdcd20b", + "bec31b91 3e0ddbd1 3d9b2443 3f669748 3f23fa0a 3f23fa0a 3f30e72d -> bd581e40 be0ed0c6 3f7b0cbe", + "3bd6afb7 3f3ee063 be2a392a be2a392a 3eab179b 3eafc5a7 3eafc5a7 -> 3f3e2fb9 be26ce0a be26ce0a", + "3ef203cc bb9cef1d be37137c 3e42581e 3e9a5219 3f699397 3e50be84 -> 3e0f4ddf 3eac8c06 3e4926a0", + "beb23ac5 3ea9df3b 3ea9df3b 3f064da4 3e800000 00000000 00000000 -> 3eb872a5 3ee50156 3f350e0c", + "3f4dd2d2 3d75b8c0 3e8cf4d2 3e8cf4d2 00000000 00000000 3e800000 -> 3c40a5cd 3d5d058b 3e828a1a", + "bee465ee 3ee10706 3f3de060 3f3de060 3f9018b4 3ef262e6 3ef262e6 -> 3e089468 3f5c83f2 3f5c83f2", + "3fb1484a 3c60d7fd 3f8d00b9 3ecf82fd 3f76c2f2 3f76c2f2 3f64a541 -> 3faa3554 3f69311c 3f8a5d7d", + "be997bcd 3e31010b 3e66576e 3ef6d59d 3e800000 3f000000 3f800000 -> 3e1952c0 3e11e873 3ea75855", + "bda08c8b 3ecc8ba6 3e2b4ec3 3f88625f 3ee14b13 3f69520f bbbf8793 -> 3ecaeb46 3ddf25f7 3f93226f", + "3f2561cb 3f29b905 3f29b905 3ee698ea 3f338b20 3f5f2765 3d9409e2 -> 3f301130 3f4c3d92 3e5311ff", + "3f6989e9 be43f53b 3f6ba56a 3e858d9f 3f2c0505 3f2c0505 3e35252b -> 3f18a0df 3f319a28 3e3caff8", + "3f0a824a 3dd020a7 3e011353 3e3396ed 3f32b5d1 3f932a3a 3e8039aa -> 3ed94335 3f2e0ea0 3e5d2cda", + "bef58e8c 3e841f37 3f8ec4bd 3f8ec4bd 3f1be0e1 3f9bed37 3f1be0e1 -> 3db7dfb4 3f887535 3faddc60", + "3f046a05 3f1067b6 3e09ce35 3f1067b6 3d03c9a7 be57e48a be57e48a -> 3e93f22f bd3491c2 3e272e7a", + "bee2c9f1 3f317f0d 3f9a2399 3f317f0d 3f450a90 3e84a39c 3f450a90 -> 3f28d6c3 3fcfb9f9 3f28d6c3", + "be6c8dc5 3ee4551d 3f2337a2 3ed664d5 3d375d2e 3f6cdc71 3dc72500 -> 3f09e46e 3f123475 3efc6b7c", + "3ed0fc9d 3c982408 3f86484b bb6727bc 3e901ef8 3f9d7bc5 3e901ef8 -> 3e00e8ab 3f8fc0a7 3de70855", + "3dab723d 3f5ee88f 3f254e21 be4b4110 3d3ad050 3ccfa7a4 3e9da5df -> 3f4d39ae 3f180294 be1fd822", + "3ecd7672 3f3e0113 3f3e0113 3f8e4ee9 3f853f7c bdeafb94 3f3b7687 -> 3f5cb32e 3ecbf05b 3f75a11d", + "3f1c861a 3f446c10 3ebbfded 3c1b1f68 3f99580b 3f93402b 3f163d59 -> 3f83eba3 3f5896d4 3eb99a63", + "3c0b9a0d 3f06104a 3f5c2b51 3f5c2b51 3f3205ef 3f3205ef 3ee9abcb -> 3f06702d 3f5bcf62 3f5b49eb", + "3e6084c0 3f13b219 be2bcbb3 bdcfe1e6 3f800000 3f400000 3f800000 -> 3f2b712e 3d090ac8 3e0f5dfc", + "bea716b1 3f4d4827 3f3f8ce7 3e544d03 3f8880de 3ecba9c3 3f8880de -> 3f372e1e 3f5cd466 bd959640", + "3dea6e61 3ea43049 3e94bad7 3e94bad7 3f400000 00000000 3e800000 -> 3ebd599d 3e83b47a 3e925b60", + "3f0e205f 3f91c036 3f91c036 3f6ffdce 3d164412 3d164412 3f29be76 -> 3f06e120 3f06e120 3f48fdca", + "3e7fc9ab 3edb0fc8 3e6649b2 3e6649b2 3dffbe51 3eef0e6b 3de9b7f9 -> 3eb44ff6 3e9218aa 3e49f449", + "3e572986 3dbf9610 3f74a7b2 3dbf9610 3f800000 00000000 3e800000 -> 3e9169e5 3f413f90 3e0174a6", + "befa6db8 3f1d9c91 3e03eeec 3f1d9c91 3f9f98ae 3eaec19a 3f8e6d53 -> 3e9d2892 3ccc1728 3ebebff8", + "bb8b6b11 3f7a96e3 3e1ac295 3f6d826d 3f53c649 3f8784d0 3ecf67d3 -> 3f7ac12a 3e16ce49 3f6e142b", + "3f9dc2d8 3ee5ed25 3dda1e4d 3cf73534 bd99f05d be1aafb1 be1aafb1 -> be49c906 be580268 be45d641", + "be9f4a25 3f9b96ec 3f865297 3d6a33e6 3f864f1e 3d7ccd59 3d7ccd59 -> 3fa235cd 3fada77d 3d646a8d", + "3f54ec31 3e99b47b 3e99b47b 3e73a375 3f95181e 3e131475 3f95181e -> 3f8278d5 3e2e0f0f 3f812171", + "3fa93a98 3ec839d0 3f794130 3ec839d0 3f833c9d 3dfe56da be6ea4ae -> 3f9d6290 be19025f bede3f82", + "bdd63023 3f6b0c7b 3f6b0c7b 3f8ac013 3f9f1b5c 3f9f1b5c 3f957929 -> 3f6259dc 3f6259dc 3f89a0fc", + "3f0885af 3f9c2aa4 3f31cd1a 3f31cd1a 3e800000 3f000000 3f400000 -> 3f33e64c 3f173e22 3f395f8e", + "3e67022d 3e065977 3e0da9c1 3f9bfaa9 3cbc8335 3d80e767 bdaf92fb -> 3ddab6bf 3df87d4c 3f6ca198", + "bef0f08d be6ba4af 3f5b5c7f 3eceec74 3f08de5b 3f4c53a2 3f4c53a2 -> bf170aae 3f626fb6 3e5ffc36", + "bee3beb9 3f4ea125 3f9ff3d4 3f4ea125 3c3c5115 3f25fa66 3e4528f7 -> 3f949dbf 3fc22fd7 3f8a4ee4", + "be82ebde bde2fb76 bd8aaffc bde2fb76 be6aa7b9 bda4b889 be6aa7b9 -> bda50480 bd8407d2 bda50480", + "bd3f03db 3ead7bef 3d3aa9f5 bdbe84bc 00000000 00000000 3f000000 -> 3eb59310 3d435e6f bdf72832", + "3e12b813 3eb07f84 3eb07f84 bd7f9d97 3f1004e5 3e815c78 3f1004e5 -> 3ec07ac8 3ea9be8b 3cde5770", + "3e1733cd 3f1cb4b9 3f35b985 3f35b985 3f800000 3f400000 3f400000 -> 3f2b5e19 3f373dee 3f373dee", + "be7bfa32 3e85819d 3f716296 3f886338 3d030837 3f9bc115 3cb3cdaf -> 3ea253f8 3f602136 3fa941e3", + "3ee2d4c9 be3edda6 3f53d160 be3edda6 3e511ad2 be053cbe 3e511ad2 -> bc5aabf8 3ece7042 bc5aabf8", + "becc9955 3f86da02 3ee31eef 3f9578b5 3f8f3a2f 3e80b845 be488c61 -> 3f83812e 3f0538a7 3fdb3810", + "3deb398f bd678b1c 3f6c9561 3f6c9561 bdceb732 3e9acc3d 3e9acc3d -> bd7c6f2d 3f5a4cdc 3f5a4cdc", + "3e981b2c 3f8b3c20 3daf58ec 3f97cd97 3f000000 00000000 00000000 -> 3f69c491 3d76826f 3f556900", + "3f4e4d1e 3f858eae 3f8350dd 3f8350dd 3f400000 3f000000 3f400000 -> 3f4e951b 3f1a2308 3f4db64f", + "3f9bd2a2 bc86613d bc86613d bcc707d4 3e9802fd 3e9802fd 3f9ed1d4 -> 3ebae11e 3ebae11e 3fc2047d", + "3f9411d9 3f557ad8 3f557ad8 3f97ba04 3e11edbf bcf98851 3f93de8c -> 3d0bad98 be29f8e5 3f9343b8", + "3fbe8366 3ec49e5a be4b4b01 3f65656e 3f61a495 3f5b70a8 3f5b70a8 -> 3f8fea55 3fafb760 3f5693e0", + "be857604 be0054dd bd4bf4e6 be0054dd 3f870cc4 3f0e6062 3f9f7293 -> beddb406 be54bb2c bef7244e", + "3e51aafd 3f3e0dba bc3f4505 3eed7f9b 3f800000 3f400000 3f000000 -> 3f4b8e70 3e13be8a 3ef14966", + "3fad59d3 3ee9ac86 3ee9ac86 3f7cbf45 3e25c657 3f94e4a7 be68b61d -> 3d6bb488 3fb4f2dd bf2856f8", + "3faee7ae 3f999497 3e8e573c 3f999497 3f4ba6cb bdbd7c10 3f4ba6cb -> 3f25b896 be69c7c8 3f25b896", + "3e140736 bcab24b3 3f988297 3f14438e be7eac7b be61ffc9 bdd50e24 -> bd5c767c 3f7cc264 3ef5f65b", + "bcf3a418 3f983dca 3f798503 3ec5c03b 3d9e242c 3ea6621f 3f6750ec -> 3f9c79aa 3f7e7765 3ebddf7b", + "bd5121a5 3f43cc18 3bfbd4a2 3f2c3732 3f879579 3f899589 3ea41bd1 -> 3f3ff2f2 bd3fb44c 3f30d1ab", + "be9616ce 3f9314fa 3f46355e 3f5786e9 3f7b2d10 3f1c18f8 be37d4a4 -> 3f9961fb 3f528d92 3f9216f5", + "3f798371 3f9a8825 3f9a8825 3e06d700 3e021161 3f17a59d 3f20c6cc -> 3e1e18b8 3f1ba2b4 3f1d8e92", + "3f8abcbc 3f362e42 3f910f0d 3f362e42 3f05f3c6 3f812c1f 3e238b40 -> 3f01e817 3f7fadf0 3de844a6", + "be9dec87 3f4ee063 3e928baa 3f4ee063 bd241f41 3f2dea44 3f2dea44 -> 3f88ecdd 3e28ebab 3f590b16", + "be0a81b8 3d268c11 3f87e05c 3ed38167 3f9dd7c5 bd2fcca7 3f580fc5 -> bdf70fa9 3f9aff8a 3eb5aa24", + "3ec3ca3b 3f40c72f be3866a3 3f40c72f 3cc5c4f6 3f99a378 3f99a378 -> 3ef2d865 3eb2106b 3f6c9010", + "bed92cc5 3f4e30f2 3f5ee837 3f4e30f2 3ea7f40d 3f89bb40 3e3b6aaf -> 3f8103f4 3f489d50 3f88e379", + "be5ca12a 3d57a074 bdb64cf2 bdb64cf2 3e627fd2 3f231ebc bd95a78e -> 3c85c2d8 be7b5f30 bdbd559e", + "3ee60f04 3f21c460 3e9c5d18 3f21c460 3ef9210f 3f7bd1d7 3ef9210f -> 3f110cfe 3f1c33fe 3f110cfe", + "3eb97f71 3f0819a9 3ef700b3 3f909f08 bd11b559 3ee6a474 3f5dcb1f -> 3ea6fbbe 3ef1134c 3f84671f", + "3faf0a15 bdda0acf be39490d 3d24c2d6 3f35c278 3f3d2b46 3f6d0c4d -> 3f81492b 3f89daf5 3fa0305b", + "be99c716 3db53709 3f37b6d7 3e1fd1a0 3f99075a 3f04cac4 3f73c315 -> be79df60 3f470230 bdaa10d0", + "bec0f636 3d0bd7e9 3e906f0c 3f7da54e 3f9f73e5 3f487c05 3f139935 -> bed84f0a 3dbf0144 3f92ce6c", + "3f86b851 bd894f36 3ef3131b 3f1008e2 3f664965 3f81ca73 3f81ca73 -> 3f73471f 3f856a1b 3f84d2ed", + "bdc0dc5a bb303ee2 ba7e7de6 bb303ee2 3eaf2f55 3f98e1fc 3f98e1fc -> bd1007c6 bde88714 bdec60e8", + "3fb0e508 3d3a9fc4 3ee5ae99 3f5cfb9e be7dcbac 3e63d64e be7dcbac -> beb84850 3e0b6572 bf2c194e", + "3f4fef32 3ef983be 3ef983be 3f7a2119 3ed01386 3bace31f 3c94ce90 -> 3ed7db49 3dc42b26 3e4af642", + "3f72228b 3effffbf 3de2c019 be44deb7 3f800000 3f800000 3f800000 -> 3f791144 3f73ab88 3f6f7824", + "3e43ee49 3f72f6e4 be5177d2 3f76fc5f bd42d2f1 3e10d674 bd50531f -> 3f422567 be0dacf8 3f453c92", + "3e4fccaa 3f4f4782 bd047792 3f763350 3e94d49e 3e00f343 3ea1ad67 -> 3f34513d b96a2200 3f54a4cb", + "3d45763b 3f8f2e6f 3f6756ca 3f6b3c5b 3f5dae5e be47124f 3f419aed -> 3f8d9f4e 3f59c98c 3f693a93", + "3f5b9873 3f0b2c30 3edeed64 3f3cfb86 3f0a1eef 3da60188 3f0a1eef -> 3f0a4539 3e069a32 3f115a87", + "3f286cdc 3eb43d1a be4bb82d 3f5025c9 3ea8256d 3ecded5f 3ef804a4 -> 3eac486c 3e494600 3f18cabc", + "3e922b62 3e312a98 3f388e15 3f68dc2f 3f51ac5d 3f8dbd04 3f8dbd04 -> 3eb7030d 3f54cbc0 3f774f7c", + "3f81f95d 3ed32837 3e15952f 3f81bbf1 3e9e39da 3b62ba0e 3ee66d8b -> 3e9d68df 3aa528ca 3ee1fa78", + "3e34674b be2e6f11 3e5feaf4 be178430 3f3ddd6d 3f9a2ca6 3f3ddd6d -> bc1e7a60 3ec8e1a2 3c0f9a10", + "3eacef82 3f46ed2c 3f17436c 3e8eb62a 3f9f3aa5 3f61b33f 3f61b33f -> 3f6f4cd0 3f3067cf 3ef6f9cc", + "beefb16a be2acefd 3e5bbb2a 3f5f67ed 3f2c23aa 3ec6618c bd5b752d -> bf0f47bf 3e08da9d 3fa73516", + "3f7536c7 bda462bd be615c4c be7905fc 3e800000 00000000 3f400000 -> 3e71c03e bc17ebea 3f354997", + "3de7e8df 3e7d9447 3e58544d 3e7d9447 3edc05b2 3f0b6fd9 3f0b6fd9 -> 3e8958d5 3e7efd94 3e9002dd", + "3f9d5698 3f5308ee 3f007d16 3f94c340 3eaf19b7 3d00edef 3eaf19b7 -> 3e6cfcd6 bd9c5c95 3e1db0fe", + "3f737943 3ebfe485 3f86d529 3f87014e 3ee743d1 bd86eae9 bd86eae9 -> 3ee556a0 bc360c9c bc34f820", + "be35cd13 3f6f7722 3f568254 3f568254 3f77fb35 3e70fa4c 3f8aedd1 -> 3f6df415 3f71e5b2 3f4b431a", + "3fae3155 3e11e936 3e2d0742 be3d43c4 bdb61f7c bc57ddbf bc57ddbf -> be30948a bda19b2b 3d47c408", + "bdab26be 3f250280 3e5a23e3 3ed23776 3f8db73d 3f1b2d2e 3f1b2d2e -> 3f1b1cff 3e387f6e 3ec9d928", + "3f2aa238 bd1cf6fc bd1cf6fc 3f27da25 3f974094 3f9537df 3f4e6a79 -> 3f465bfc 3f43a5d8 3f418e6d", + "befd4b42 3f581804 3f0c587b 3f8d4ebe 3f918686 be0e3d84 3f918686 -> 3f3302ea 3f635e68 3f8b388f", + "bda6b8e4 3f64134d 3f96300a 3f64134d 3f102d6d 3f56f64e 3f102d6d -> 3f6ae7c1 3f99aa0f 3f6ae7c1", + "3d91916b bda40214 bd59d983 3f8b26ac 3d824b9d 3ec78ae0 3ed01bda -> bd8f16ee bcb1cd06 3f84f55e", + "3f4a8574 3f55373f 3f55373f bce0e95d 3f88438e 3f086a11 3f32a6ba -> 3f821198 3f187550 3f0bdcd0", + "beea1f7e 3f44812c 3e6137d0 3f0229f1 3f916d2a 3f9fc3ad 3ed1af35 -> 3f195ca0 be801eef 3f0dbe22", + "3f1277fc be4fadb2 3f1f9a3f 3f1f9a3f 3f6ae614 bdc0eacc 3f6ae614 -> 3ee05cfa 3e59f5bc 3f4aaeca", + "3f32b18c 3efe1415 3f00b8b2 bdbe9d08 3ef74732 bcdae90d 3f45d385 -> 3ef954e8 3e086245 3f02e451", + "3b94145f 3f0fdccd 3f98dec7 3ee55599 3ed21841 3ec04342 3f680b98 -> 3f0fafe6 3f986588 3ee6652e", + "3e378ba1 be3e9108 be3e9108 3f9755c1 be35e080 3f5e5a00 3f31dcfd -> be3d024d 3b40bf00 3f8c264a", + "3f8df7ba 3f329cdc 3f98d7d4 3f671906 3f9f84e8 be4045ab 3ee7bab1 -> 3fa72e54 bead5756 3ece9488", + "3f9b07a0 3f56ee76 3f1ffec4 3f016e8c 3f943154 3f374070 3f943154 -> 3f9ccb03 3f3c29ad 3fa5d20c", + "beb08165 3f8c11ef 3e8719c7 3f8c11ef 3de584d9 3eb201ee 3de584d9 -> 3fb76984 3e709e43 3fb76984", + "be261679 bd3667c2 3f9366f7 3ee04695 bc0c72ef bc0c72ef 3f0f02d8 -> bd4e4ba7 3fab7cf3 3ed642bf", + "3f6556b8 3f809353 3f809353 3df1971e 3e80d564 3e80d564 3f1933b6 -> 3ea8fa76 3ea8fa76 3f0c644a", + "be072fb3 3ed6d354 3f4a1844 bcffb60a 3ee54aea 3ea336e4 3dd80d53 -> 3ed4ea62 3f5a0055 bd49c7bd", + "3cf70788 3f38c497 3f3851a7 3f3851a7 3f4fc387 3f485c1f 3f55d953 -> 3f39761c 3f38cd7c 3f39359e", + "3f4c85fd 3f1fc7a5 3f5f2fe6 3f1fc7a5 3f1b4fca 3e5e639a 3f042ef7 -> 3f1c35cc 3eb297b6 3f09bb89", + "3f11069d 3ecd73bf 3ecd73bf 3f9807d6 3e800000 3f400000 3f800000 -> 3ea19330 3f194ce6 3f8a6ac7", + "bd3183b0 3f3698e4 3f10e385 be125637 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f3ad001 3f137845 be2778bf", + "be23400a 3eca939b 3eca939b 3f4b8ece 3e84232d 3f5330d5 3f51f31f -> 3ed5ce68 3ea788cf 3f4a89f0", + "3f62bef9 3f9921ea 3f35767c 3f35767c 3f155068 3e93c70d 3e93c70d -> 3f273fda 3eac5cff 3eac5cff", + "3f558fc9 3ed209bb 3f73fcd0 3f2fefcc 3f400000 3e800000 00000000 -> 3f3194ac 3ebbacbf 3de953b1", + "3f748975 3e857b0d bdbbb394 3f514bd1 3f05bef8 3d5cb7a0 3f1ec46d -> 3f02bee1 3d420644 3f2107a5", + "3f5c29af 3f8a12c9 bd7fd407 3eba2100 3f2948b2 3f49d45d 3f49d45d -> 3f383e5b 3f2b565a 3f3a9a88", + "3fb29e58 3f7467ea 3f7467ea be10042f 00000000 3f000000 3f800000 -> bec14ddf 3ea3eed1 3fb9bcd1", + "3e006688 3f6f5653 bd7f07c8 3f55c720 be324443 3e23f90c 3f032850 -> 3f4bbcfa bd0ccf14 3f4b6b00", + "3fa111dd 3de83b4d 3f01d72f 3ec99e33 be06b6dc 3f485908 3f020994 -> be4784a7 3f5a9059 3f0996bc", + "3ee0bd46 3f715d72 3f1eeec6 3f019117 be7c98c7 bc913aee 3f27cd70 -> 3ed76690 3eae5b25 3f1259a0", + "3f829652 3d15aeac 3d15aeac 3f7925d7 3f4cf8a1 3ee70919 3f4cf8a1 -> 3f50ecd2 3eeb53c0 3f4c140b", + "3f8c712f 3ed3e88d bdc45848 bdc45848 3f01d3ae 3f01d3ae 3ea98f1b -> 3f0425bc 3f10d510 3ebecfed", + "3fa71cd9 3ea9cf2e 3f6b7f82 bd9c53c0 3d7fa1de 3e6d8a57 3de5edb3 -> bca2b8bc 3cb242a0 3e2dfa59", + "3f5393a9 3f8f71cd 3f265425 be08455e bd1074ef 3f9cc650 3f8183e3 -> 3e294933 3f90004e 3f502b6b", + "bebd230c 3f113e6f 3f113e6f 3f57c8a6 3f6abde0 3f6abde0 3f8cc79d -> 3ee05d87 3ee05d87 3f3f7c57", + "3f91693f 3f97a2dd 3f97a2dd 3f5c4a89 00000000 3f800000 3f800000 -> be25027d 3f7991df 3f826dbb", + "3fa54c52 be41ee3d 3f6cd639 3f1361ff 3f8680e9 3f2159b1 3f2159b1 -> 3fb4c2af 3f0b5ab0 3f256b9f", + "be25ad9c 3efa9ab1 bdba21b2 3efa9ab1 3f5b6500 3f7dbcba 3f8d1e94 -> 3edc282b be882b27 3ec7d233", + "beb4abd2 3f906b25 3f1056c2 bdbbb686 3f010237 3f1d16f0 3e4ff970 -> 3fac9e3d 3f0bd6ea be485d54", + "3ef37387 3e84104c 3f60b22a bdc0e15b 3f788e08 3f9c7b3b bd96f0f1 -> 3f18d1e0 3f85553f bdacf04a", + "be3757ad 3ed894c6 3ed894c6 3ea62499 3ed292de be0e4f19 3e8a4ea1 -> 3ed9a821 3f060ca8 3eab2079", + "3f59f09b 3f01cac5 3f07f067 3e50aec8 3f994873 3f0d7d03 be6862dc -> 3f8c246e 3f0ca9ce be26cfb8", + "be6bdf3b be0a99af be0a99af 3db9aebf 3f1d74d6 bc0b8182 3f95262e -> be9dcd1c be288484 be209e2c", + "3f1ab160 3f98b328 3ec33633 3f8d3443 3f09d94a 3f09d94a 3f78f538 -> 3f4c2763 3ef3d8ca 3f8318fe", + "3cdba024 3f46dab1 3f0f6e18 3f01a0bc 3e924153 3ece6415 3f785c38 -> 3f437bca 3f0e59f4 3f04cfa2", + "be1a7c26 3f0a5259 be34077a 3f0a5259 3f90e91a 3e66fd02 3f14fd78 -> 3ee6ee82 be72097c 3f08b652", + "3dcac338 3d808e7f 3e8ba3c0 3e8ba3c0 3ef8ff91 3f40e976 3f40e976 -> 3dd66ff5 3ea4035f 3ea4035f", + "3fa0b304 3f925c20 3e8036fc 3e9996ec 3d279011 3f368ef2 3f75a54d -> be768630 3f54d178 3f9063f5", + "3f62d761 3f336062 3f7bcc27 3f7bcc27 3f1ab690 3de54c29 3f7e19d0 -> 3f1d85b7 3e584f66 3f7dd6a7", + "3f9424b7 3f8f0e3b 3f1cad75 3f8f0e3b 3e0f85d1 3f804a35 3e0f85d1 -> bc5fe2a0 3f882694 bc5fe2a0", + "3f42cbd4 3e463a94 3ecf9c71 3e7a92f6 3cd8023f 3f0f6d4c 3f5db1fe -> 3d87e022 3f05f451 3f37ab6b", + "be91a52c 3f66f8b6 3f58e31e 3e241283 3f17c2ac 3c6928a3 bdc12924 -> 3f7d8111 3f8ac60e 3e6e37ea", + "3fb89573 3e9b5865 3f6a73d2 3e9b5865 3f66c3b9 3dd8ae29 3dd8ae29 -> 3f953862 be812afd 3c971c98", + "3e91faa9 3f6f5e5a 3f6f5e5a bc08bdb7 3f400000 3f400000 3e800000 -> 3f61dcf2 3f61dcf2 3d85c288", + "be8ec910 be64ffcc 3f4f60cc 3f9ce6e1 3f9353ec 3f616041 be735c7c -> bf1b636e 3f4a5be1 3fd1244e", + "3f819345 3f5b6ced 3f5b6ced bde4f8d5 3f296a31 3f296a31 3ef89bf9 -> 3f28cca2 3f28cca2 3efc5f93", + "3fb4e061 3f80b8c5 3f475920 3f163d76 3f3de3ea 3f1e4b57 be42b148 -> 3f21fbf6 3f0d55c6 bf02d7fb", + "3e540109 3e27e7bc 3efd8c9c 3e433df3 3f85533c be713490 be713490 -> 3eb0fbc3 3eb0162e 3dd1c39a", + "3f879b5d bd9e17e1 3e8b7361 bd9e17e1 3daf1a97 3eab1018 3daf1a97 -> 3dc2e7c7 3eacf109 3dc2e7c7", + "be58e7de bcc828a9 3f180772 3f75c236 3e966bae 3f851adc 3e24cd01 -> bdbc16bc 3effafaa 3f908b58", + "3f96c240 3e94f610 3f4d5f0a 3c44af57 3f3e9660 3e9a736f 3f5d9b04 -> 3f533b47 3e59c352 3f823b0a", + "3f2e0c08 3f2e5363 3f63b5d7 3f63b5d7 3e9a6dd5 3e9a6dd5 3f4affa5 -> 3ed89af1 3efac8fe 3f52e8d7", + "3f1d0bad 3f8b4c89 3f7ad4a4 3f8b4c89 3e6e547c be31f44c 3f03abfc -> 3f103da9 3e8b541e 3f3c76f8", + "be2aad82 3f8931e5 3f82480b 3deff9b7 3f901bb2 3f13ad0f 3f860018 -> 3f880ae8 3f8bb074 bd1ac468", + "bec12380 3f05bab2 3f8b8880 bda65848 3e6883dc 3f1eca09 be69c886 -> 3f223f63 3fa2380c bcd2de00", + "3f7b4fc4 3f9be457 3d0968fd 3f9be457 3e8b55cd 3edd49cf 3f205942 -> 3e943416 3ed98cd9 3f231f40", + "3f50a285 3f9c76f8 3f71fa53 3f9c76f8 3eee5107 3f7769af 3f7769af -> 3f1b0284 3f766842 3f81c472", + "3f800dc2 3f3660dc 3f5c1758 3f83a59f 3e672ebd 3f3b322d 3d459f2b -> 3e66f92d 3f3b2ea4 3d43ef9e", + "3ec22e4a 3f15d60f 3ef73fc4 3f72eb0a 00000000 00000000 00000000 -> 3eba04cf 3e997a40 3f16ca05", + "beecbf21 be6e551a 3f719648 be6e551a 3f8ef47d 3df36024 3ea4ba58 -> bf5b5671 3fa99d4b befa7008", + "3f1ef34e 3e551f7a 3f4333e9 3e551f7a 3f52cb37 3e443b26 3e443b26 -> 3f1714a3 3ed0ec34 3e4aa280", + "3dc86896 3f05d954 3f05d954 3e6c2808 3f976651 bd0e6d9c 3f3d17bb -> 3f1661b7 3eefc28b 3e8f87fb", + "3c8403dd 3f4e0762 3f566fb0 3f4e0762 3f213d8d 3f6db536 3f213d8d -> 3f4d4e9c 3f56cfb1 3f4d4e9c", + "bed88116 3ed32b17 3f2f9275 bdba31ec 3f90534e 3f688e1a 3f721fed -> 3de16188 3f1779ee bf078041", + "3e0e188b 3f977eb4 3eb38eb3 3ef79a11 3f2b3c6f 3e060a79 3ebae18d -> 3f8e5a7e 3ea3f0f0 3eef2d06", + "be689418 3ead8a08 3ee7d999 3e22c472 3f800000 3f800000 3f000000 -> 3e4154b6 3ea83862 3da6e4e4", + "3ccc4880 3d589016 3dc0dc00 3dd66e6c 3f52bf5c 3ebebf34 3f954122 -> 3d939fd6 3dcf139d 3e06514e", + "3f04dd01 3e70cdb8 3eb21785 3d832f10 3f4ef174 3f67acc7 be56331b -> 3f085c18 3f2311ea bd9f3cfe", + "3f725d46 be762eb8 3f96afe5 3f96afe5 3f000000 00000000 3f800000 -> 3eebced8 3d806b77 3f81355a", + "3f6b9ccf 3f76a501 3eebebe9 3eebebe9 3c85d49a be79c069 3f009841 -> 3dbbeeb2 be4048ed 3eff7ee9", + "3f1b4e92 3f021695 3f2a7fd8 3ec0d5df 3eb26543 3eb26543 3f896ee6 -> 3ed29008 3ef25a48 3f4cad40", + "3f2cc074 bdea9982 3f070949 3f377f8b 3f000000 3e800000 3f000000 -> 3e99adf4 3eae334a 3f120c21", + "be345e94 3f7c8b8b 3f71f4c6 3f8ea558 3edae953 3f2d96eb 3f2d96eb -> 3f8adfe3 3f7dff94 3f987bcd", + "bec36c3f 3da82d1f 3f8ffac5 3f8847ec 3eee3653 be2bd3ac 3eee3653 -> bd835259 3fcf21e6 3fa5911e", + "3f892cdb 3ee1cd39 3f0cb421 3ee1cd39 3ea82b08 be4701ca 3e2c5697 -> 3ea4096e be7d9d8b 3e1851f4", + "3f947c23 3ea88b45 3e989322 3f31125b 3f217603 bdd024d9 3f217603 -> 3f2dd06e be299027 3f1ef672", + "3f9fb83c bcb5c718 bcb5c718 be223bd3 3f21458d 3f8dfb32 bd6b7bfa -> 3f4aa4e4 3fb1de93 bd0506f5", + "be9d20fd 3eb4e11c 3e6f37ec 3f4a584f 3ecbfc6a 3ecbfc6a 3f709a9a -> 3eadc9bf 3e3b6de6 3f3e9a83", + "3ec6101a be683795 3f90cd70 3f593c92 3f000000 3e800000 3f400000 -> 3d5eb544 3f4a54e3 3f4f795b", + "3e8dbcaf 3efe46ce 3f637e30 3f637e30 3e800000 3f800000 3f000000 -> 3edb51c5 3f6b6270 3f47f345", + "3f201686 3e896442 3f0d704f 3f44340f 3f2e680c 3f4df092 3f4df092 -> 3f06cd21 3f35c626 3f4a4abc", + "3fabee31 3f3f8606 3db1de03 3f3f8606 be31c77f 3c194938 3c194938 -> befadc84 bc8d3bc0 be7a0f61", + "3f0c5ec3 3e0d43eb 3ef1d1c2 3ef1d1c2 bdfcf4f1 3f017db3 3f017db3 -> bbb169e0 3efb3ae2 3efb3ae2", + "3e8a0405 3ed6330b 3e0fe8e5 3f8ba7b9 3f87153e 3ea6cd0f 3f87153e -> 3f170e60 3e430b27 3f8a6c35", + "3fbf3d59 3e9cd61b 3e9cd61b 3f1d03a8 bdba8f42 3dfaa893 3d953e5b -> be932b58 3d011af8 be46ceec", + "3eb0a7bf 3db72422 3f1c5a85 3f311c4b be0e6dd4 3f310743 3f9ba89f -> 3c2d5700 3f237cac 3f5f6a76", + "3f3875bd 3db7217c 3f587f02 3eae2e40 be2e64e6 3efffb4a 3dbfdd55 -> bdc82443 3f18b953 3e267976", + "bc964247 3e07fc0e 3e07fc0e 3f0e544a baf10a62 3eb3b205 3ec2b353 -> 3e0a836d 3e03e308 3f0f277e", + "3f9f485a 3f6cad58 3e214b7c 3e10765e 3df18194 3f825267 3df18194 -> bda236a2 3f9d3e98 3de5ead2", + "be53e263 3e9d5fbd 3e27ebb4 3e9d5fbd 3f646c84 3f287b98 3f287b98 -> 3e3ed093 3d7cdf20 3e706d27", + "3fa9de12 3f0382d6 3ed0d2d7 3f0382d6 3f800000 3f800000 3e800000 -> 3f945c09 3f98ca9d 3e27abdc", + "3f434fb4 bdbf295b 3f95ea7a bdaa3cdd 3f1069a9 bddf575e bd3bbfaf -> 3ed1068e 3e471f07 bd5ff476", + "3f80c4ef 3e0b64cc 3f360e14 3f00cca6 bd888a12 bd888a12 3f26a43b -> bd8b0911 bd921cf0 3f26de74", + "3f92f3ae 3f797b53 3c9208f3 3c9208f3 3f9baeeb 3f9e01e7 3f9e01e7 -> 3fa043c0 3fb5107d 3fb5107d", + "beb3696a 3b388bad 3f50c124 3f761d43 3f20f4f6 3f20f4f6 3f33ddbe -> be5db644 3f6180dc 3f86aa0d", + "3f765516 3f93984a 3ece214f 3f850043 3f95a7db 3f95a7db 3ebbbd6d -> 3f9593ef 3f91f33d 3ec8bda5", + "3f690b28 3f742d3d 3f3c1826 3f0d28d0 3e800000 3f800000 3e800000 -> 3ea0506d 3f79e921 3e8dd69c", + "3ec0bc29 3f1cbca8 3ed827e9 3e80fc11 3f94ab32 3f86c327 3f94ab32 -> 3f51a9fa 3f28da2b 3f1824bd", + "3fa37b2c 3f9a12dd 3f9a12dd 3f91d3c1 bd424b6a 3f239e5f bd424b6a -> bec9da8e 3ef71c90 bec0b5ca", + "3f26a544 3f9a3c25 bc26f879 3f9a3c25 3d5c04d2 3e0d37da 3e3e91ff -> 3ee93d72 3db091d2 3f0aae93", + "bedc6216 3dead49c 3ecf14e9 3dead49c 3e8202fa 3f269840 3f269840 -> 3d60206c 3e98cce6 bdedc1bc", + "3e961388 bd50d50f bd50d50f be4e7487 3eaa37d5 3f70e0a1 3f70e0a1 -> 3d7b8822 3e758453 3e087b7b", + "3f9755f4 3f7a9d4b 3f7a9d4b be74571a 3f8e8547 3cd5b13b bd915498 -> 3f91a8a7 be172d65 bd2577dd", + "3f06ae19 3f162b65 3ecfac09 3ecfac09 3de0803f be109c47 3f44e701 -> 3eabdc10 3df182b9 3f18cc34", + "3ec95a67 3f92bc05 3f0a8053 3f92bc05 3f8351ec 3f51626d 3ebc6f6b -> 3f8cac25 3f26609a 3f571c1a", + "3f81d6c1 3f94a7ad 3f81daca 3e957fbc 3ea2c628 3f8ca683 3ea2c628 -> 3e9c91ee 3f8cce37 3ea2f6fb", + "bece6e17 bd8c9037 3f105526 bd8c9037 3f8c9f80 3d27ce03 3f8c9f80 -> bf0a0c61 3f464bf2 bf0a0c61", + "3fae7cb7 3e9a2063 bb83b5e7 bb83b5e7 3f000000 3f400000 3e800000 -> 3f127fcf 3f830d5f 3eaf3c0e", + "3fbc3df1 be3529cc 3e1f3a25 3efef3ec 3d8d5946 3ebd6cec 3ebd6cec -> 3e3d3305 3ef11b7e 3e9e95ef", + "3f7ff013 3f2e5aea 3f4ddb8b 3f2a77a3 be3e4570 3c1aee57 3edaacbd -> be3e0e37 3c1e1850 3edab458", + "3f53a252 3cbbfe98 3f1cb044 3f1cb044 3f9b2c79 3f19db25 3f19db25 -> 3f80ca5e 3f1a58d0 3f1a58d0", + "3f94f13e 3f0a916a 3f8bff5b 3f8bff5b 3eb7aa71 3f82a0ae 3f0d9511 -> 3ea85f78 3f81183a 3eeddf62", + "be97b921 3f9c3402 3f2a0540 3f2a0540 3f8558b8 3f18592c 3f8558b8 -> 3fa2f9f2 3f2f41e4 3f0d5f83", + "3fa30be8 3f21a9c8 3f473614 3e8c6de6 be697fa1 3ebf1d94 3f89514e -> beed3e0c 3e865ace 3fa54d88", + "be6a16be 3f76f098 3f76f098 3e1144ec 3f1daddd 3eec85a7 3f1daddd -> 3f85ac2a 3f8a2d95 3d092de0", + "3f73fbda 3f5fb678 3f0d965e 3f603558 3f35cbe6 3f357dd7 3f357dd7 -> 3f37c393 3f339e58 3f377f22", + "3eafe097 3dfc898a 3e34dd5d 3e81078a 3c839196 be0aa4e0 be0aa4e0 -> 3db1163e 3d8e3863 3df3931b", + "3f9b9ea9 3f5b3ee8 3ecacf30 3ee6d981 3f3c1315 bd209064 3f3c1315 -> 3f355933 be0853a7 3f4bc038", + "3f178b54 3e898e48 3e898e48 3f96d3f8 3f5e19d0 3e398827 3f08738a -> 3f1f8a5a 3e5e1546 3f4bdc1e", + "3dd8c1f0 3ef2885f 3e9ba843 3f3e9498 3e800000 3f000000 3e800000 -> 3ee66924 3ea64704 3f312ef0", + "be6c53ba 3f3aaa6d 3f889212 3f3aaa6d be5a8c8b 3f6d55f6 be5a8c8b -> 3f725b08 3f8cb3cb 3f725b08", + "be919d62 be0f3011 3f40f107 be0f3011 3f53a103 3f028950 3f4ccefa -> bed454e6 3f52b095 bed073be", + "be51b3ab bd02c9a7 3e9c27d2 3e3ee9c5 bdfa3988 3f55b1e0 bdfa3988 -> bc5c57de 3e49387e 3e7fa18d", + "3ea2e0e9 3e708848 3e708848 3f7d570e 3f96c03c 3f3d9f81 3f569385 -> 3f08eaf8 3ecaa748 3f71022a", + "b9a666df 3f92305e 3f92305e be396bf2 3f2f9025 3f883318 3f2f9025 -> 3f92351c 3f92312d be39b411", + "be92c548 3f9f598e 3f9f598e be4fe73b 3f000000 3f800000 3e800000 -> 3fbaaed5 3fa8562c beaa7175", + "3ec641f0 bc8066dd bc8066dd 3ed1af89 3eed6a7e 3eed6a7e 3f92b1ed -> 3e2e07b2 3e2e07b2 3f31da39", + "3f63b9ea 3f99f442 be6d087e 3f51bf93 3e17f429 be014f50 3e17f429 -> 3e879962 be0d350f 3e63d55d", + "bee78dbe 3daed658 3f60f031 3f9a516d 3e9089f6 3e9089f6 3eaed2ed -> bb721280 3f92fdda 3fcc57bf", + "3ecf3a33 3f5d73a6 3e87df55 3f676a35 3ef61c47 be5ea8ec 3ef61c47 -> 3f35a06c 3d8f472b 3f3b8eaa", + "be6d85af be0c3db1 3f925331 3f08a3ff 00000000 3f800000 3f000000 -> be2cc547 3f969357 3f0aa515", + "3f800e26 bd1a8e3e 3df8e6d9 3df8e6d9 3ec2a62a 3ec2a62a 3f97b477 -> 3ec2bdd1 3ec2b4cd 3f97c384", + "3faae012 3ddb8773 3f2a365f bdd9bb03 3f3e82d2 3f7b7c72 3f3e82d2 -> 3f752227 3f8b5adb 3f83b888", + "bea61466 3e41d472 bc48862f bc48862f bdf5c0bf 3f5509e7 3f9aab19 -> 3e9447d8 be9281f2 bed0fb17", + "3fa26585 3ee84a86 3f41d770 3ee84a86 3f846f42 3f6932eb 3efa31d9 -> 3f986ad7 3f73c66f 3eff017e", + "beb032fd be6293e2 be6293e2 3f9f6ddf 3c9c35ad 3f99d384 3f44ca53 -> be9ba2c4 bf360360 3fb46ef1", + "be11871f 3f93282d bdfa8d3e 3e24ec4c 3ea395a1 3f827255 3f827255 -> 3fa24228 be91b1d0 3d203534", + "befdd784 3c870b34 3f6ddb20 3c870b34 3d70396a 3f79df64 3ec57411 -> bb90cf94 3f67e5f6 be2a8a0c", + "be99bb7c 3f8553ae bda19c1c 3f8553ae 3eefed6b be4392c9 be4392c9 -> 3f9b596e bd3960f6 3fb4b321", + "3f57d22a 3f943ffc 3ec8923b 3f2353c7 3f504cdd bbd69549 bdeb9b7c -> 3f5e24a4 3d653924 3b4e3540", + "be1ec18f 3f994928 3f5df040 3f950822 bd5e0d31 bd5e0d31 3f0db3c3 -> 3fb22053 3f813fcb 3fa1270c", + "3ec93277 3f88075a 3f804ef8 3f804ef8 be584f01 3ee61375 3f0d0523 -> 3f0fe608 3f48fb4c 3f53310e", + "3f8da470 3ef0195b 3f276463 3f276463 be360c3d 3f5cb93e 3f5cb93e -> be7ca166 3f626860 3f626860", + "3d2c8cbc bd06ebaa 3e053579 3e053579 3f6b4188 3f8dcc04 3d5c2108 -> 3beaa5d0 3e2f626a 3e01ea63", + "3f8c887f 3f592d95 3e71a576 3f592d95 3db7b8d7 3e9daf92 3f31e823 -> 3c7cb938 3ea14b96 3f2e0fbf", + "beb97cde bceb99df 3f08c107 3f9db48a 3f05edc0 3f83c8c9 bdd6ecc3 -> be6a32d4 3eb59f80 3fdbb48c", + "3f6d17b9 3f9c5839 3f8fbf3c 3f9c5839 3f84433c 3f90999e 3ed09509 -> 3f860a8f 3f90897d 3eef5d8a", + "bd7b3a35 3f86d226 3e6e41b9 3f22adf5 3e37fd32 3ebd0fb0 3ce32f44 -> 3f8dadf4 3e65ad97 3f2c38d5", + "3f95f9b1 be62ec54 be32a676 3d34342d 3f6c66f2 be0c33ff 3f6c66f2 -> 3f8f5d2c be059a38 3f8986fd", + "3f6b288d bc8ff911 be08e9e2 bc8ff911 3f1240c1 3f1240c1 3f0c9a79 -> 3f05fad7 3f038f3c 3f00ca4e", + "3e0b03d5 3e119298 3e119298 3ec41d2c 3c93c076 3f1c37a9 3f83788d -> 3e005144 3e52a3f6 3ef0e1e8", + "3f7994e0 3f668b24 3e0f7ad3 3d733d35 3eb8a8ab 3ec00684 3f63fce3 -> 3ebf96e9 3ebd0278 3f5ea722", + "3e643011 3e101d79 3f2c6525 3f2c6525 3eccd453 3f115b29 3eccd453 -> 3e4b49ed 3f265ea7 3f1cccfa", + "3f4b7330 3e83350f 3dc874bf 3eabc8ae 3ea86fa7 3dd3efa1 bd52b6b2 -> 3ea0cb46 3dd1945a 3ce548ae", + "bddebcc8 3ed46335 3f0c8c72 3f0c8c72 3d895c67 3f32c86e 3ebd318f -> 3ee7c06e 3f0863ea 3f118bd7", + "3ed60336 3f8a4aea 3dc1bbc4 3f8a4aea 3f33346b 3eadaa99 3f33346b -> 3f6be180 3e498f53 3f6be180", + "3f94ea2b 3e04c7f8 3f9d2812 3f9d2812 3e140964 3f74aaf0 3e140964 -> 3e168786 3f6949b6 bd04d1e0", + "3ea444e3 3ed0ec54 3d7c1d47 be661a9d 3f000000 3f000000 3f800000 -> 3ee006f6 3e4f1362 3e2c42a5", + "3fab64d5 3e61309e bda16cc8 bda16cc8 3f13b399 3f13b399 3dc26e62 -> 3f32b05a 3f4c9d7f 3e1d892a", + "3fb6c5b6 bcc634bf 3f19ea52 bcc634bf 3ec055f7 3ec055f7 3f31f6c2 -> 3f0bf82b 3e8eea20 3f806221", + "3e2a8d96 3f949b54 3e370a6b 3e370a6b 3f786785 3f786785 3eeebd26 -> 3f908ac2 3e9f0601 3e6814b4", + "3f0f8e2b 3f96b432 be4ad7a5 3f96b432 3f8fcb0a 3edac41f 3f8fed71 -> 3f92d41e 3e1c418c 3f92e769", + "3f5816b8 3f90d8e0 3f622b91 3f90d8e0 3f73b3bb 3f3bf09c 3ed5f08f -> 3f7adf56 3f41e66d 3f07750b", + "3f76fad7 3dcdc0a7 3dcdc0a7 3e6b39e1 3f61a0c1 3f61a0c1 3f88a010 -> 3f5a958b 3f5a958b 3f84d8e7", + "3de38536 3f39e93a 3f19efa2 3f46ee8c bdc21a82 3f3b7c59 3f907e21 -> 3f228fde 3f1da9c9 3f50efad", + "bd6621ca 3e32370f bd290075 3e32370f 3f2aa316 3f2aa316 3f143e32 -> 3e15e11b bda5f226 3e1ae982", + "bdb120ba 3f890a01 3f07352f 3f9f1a6d 3ee29803 3f00c993 3f902d2e -> 3f8ffdee 3f07c356 3fa064ec", + "bdf6ea25 3de51b6a bdfc8dfb 3e187269 3f567252 3f9c5f40 3f2ac82c -> 3cc792a0 be922980 3db0ee9c", + "3c1e11c7 3def00b7 3f8fce28 be630dfe 3ed93ee3 3f85d070 3ed93ee3 -> 3df514a9 3f8fb57b be5cac15", + "3f0f4cd8 3ed34df0 3ed34df0 3e84d90d 3f8ad700 3ea0b13b 3d177a00 -> 3f49f289 3eb6f936 3e0a2a84", + "3f20c6e3 bb9524a7 3f4a8960 bb9524a7 be095bd4 3f4f601f 3d882106 -> bdafffd5 3f4d935a 3d240d90", + "3d0f7b20 3f863770 3f863770 3f5ae981 3f018c17 3f018c17 3dcc43ab -> 3f83c8b4 3f83c8b4 3f54235d", + "3ed8e39f 3f2ba403 3f2ba403 3f576be6 3f9407fc 3f904781 3f9e35b2 -> 3f6058de 3f5d2b21 3f811a4b", + "3fa7278f 3f3d6c58 bba32139 bba32139 be7b93b2 3f823519 be771422 -> bf0c13aa 3faa3b6b bea08cb6", + "3f27a171 3d9157f8 3f9e9acc 3e8567fe 3f400000 00000000 3f000000 -> 3f03fe93 3edaff2e 3ed5ae77", + "3f5bae15 3f9acd68 39254e07 3f2d323e 3e321ac3 3e423876 3e321ac3 -> 3ea444b0 3e26b03c 3e7b1ff4", + "3e355bf6 3eb3c69e 3f860bc4 3eb3c69e 3f919914 3dd87cb5 3dd87cb5 -> 3efb1526 3f61673a 3e9d857c", + "3f2fa6a3 3f83c365 3f83c365 be7e1563 3e223581 3f4ea100 3f4cd72e -> 3edd124e 3f607cac 3ef1392c", + "3cba06fd 3f636fca 3f2d4166 3f60d861 3e08576e 3f21f4c5 3f06f677 -> 3f5f0bc4 3f2cffb6 3f5ecddc", + "bec0ef13 3deafca7 3f2237cf 3f2237cf 3e563a3f 3e563a3f 3f7ad1f5 -> 3da21560 3f4b2a04 3f00d4a2", + "be576a62 3b9af32f 3b9af32f 3f0386d8 3e989a42 be07f6be 3f86ca3b -> bd696075 3d09da35 3eccf849", + "3f1edfd8 3dccd7aa bd90d8c4 3f55d749 3f400000 3f000000 00000000 -> 3f00ded0 3e9122c3 3ea242de", + "3fb8ab16 3e1b57f3 3cd13daf 3f3d618b 3f49ffd2 3f7260da 3f392df6 -> 3f891e1a 3fad650d 3f3751c6", + "3f55ae90 3f49890b 3f6562d3 3f53be8e be52d101 3ed3d65b 3f2aec22 -> bd2ad514 3efca82c 3f31aba4", + "bed0a205 3f9740a3 be3faf9d 3ec028a7 3f800000 3f800000 3f800000 -> 3fa0ba41 bf2bc3ea 3df74fd4", + "3f626ed2 3f935189 3f664e13 3f40df60 3f1f0a44 3f78d4f3 3f78d4f3 -> 3f2eb379 3f76b12a 3f725e65", + "be8349e2 3f6c73f7 3f9db18b 3ee8a74e 3e60a2ba 3f8c41e6 3e60a2ba -> 3f8d579e 3fa22a1f 3f03c154", + "3f8d8aca 3e9557a8 3efdd1dc 3f9d2e4c 3f5f88d1 3f591505 3f591505 -> 3f6f48ab 3f629f45 3f4eca46", + "3f79f0f1 3f557fbe 3e1e0ff1 3f557fbe 3e8fb808 3e8fb808 3f4608c0 -> 3e966c5f 3e8e301a 3f466672", + "3f6ec9eb bce60b24 3f25720e bdeb5345 bdd0b703 3f7f9b43 3e97b58e -> bdc68c9a 3f798b7b 3e898de3", + "3f7cb3b5 3f8910ae 3f012f33 3e990a0e be773078 be773078 3d8d929e -> be65e0e3 be6d5906 3d93a29d", + "3f98b410 3f6eee4d be331697 3c4b34f4 3f4dc6c8 3f10930a 3f4dc6c8 -> 3f4760bc 3f351e08 3f74e0a8", + "3e42fca0 3f839035 3f3594b1 3f17f005 3ebfe6eb 3f75ef29 be058515 -> 3f674b28 3f41d5b6 3ee94ccc", + "be9686d6 be4ae3d1 3da4dee7 3f02f299 3f250c38 3e8d06b5 3e8d06b5 -> bee45116 3cbdfcd8 3f14b71c", + "3fb78395 3dee0920 3dee0920 3f4711e5 3f809a95 be2cc4db 3f56f3ef -> 3fb1ed6b be95a8ae 3f5dd764", + "3fba7d87 3f342a5a bdf94efa 3eeef468 3f741351 3efab317 be43d2fc -> 3f88a3c7 3f44de95 befbd866", + "3e80f0be 3ebcbe7f 3e899c95 be3d5204 3f56d2f3 3f6ff7e4 3f87118f -> 3ef9699e 3edfd258 3e027ab2", + "3f89b3c2 3bd8ec7d 3f96ba8c 3f1969d9 3f81f506 3e5508c7 bd35c4a0 -> 3f8bbe51 3e09c838 bdbeccfa", + "be104d7b 3f298485 3e2a4634 3ee204ad 00000000 3f800000 3f400000 -> 3f4167fb 3d47dde8 3ecbc160", + "bef0544f be194d28 be194d28 3f8cdc40 3f92c341 be68ba6f be68ba6f -> bf421806 bde809b5 3fdca267", + "3f922f53 3eb69381 3e3f8548 be5da8ae 00000000 3f000000 3e800000 -> bd4f81f6 3f0b61f0 3ea1ee29", + "3fb6c815 3f870937 3f89e994 3e6c04b0 3f0d4a9e bc4f8ef5 bd974c5f -> 3eac5a09 bef55b96 be510974", + "3eede0c9 3d8e1f8b 3f1833d7 3d8e1f8b 3eafdf90 3e989f8a 3ebc1814 -> 3e49782c 3ee9e2e7 3e54d339", + "3f9ea98d be4b5b10 3f0d0b9f 3e787a8c 3ec59144 3ec59144 3e6b9182 -> 3f06a02f 3eb151e7 3e6879ca", + "3e29ac40 3f8b382c 3f8b382c 3eafab13 3e8ab7e6 3f56d2ba 3e5b6b81 -> 3f73cb8f 3f85f2f0 3ea4bd3d", + "3fbe6ba8 be36a48e be36a48e 3f5181c2 3f55139a 3f2c80ce 3f9d00a1 -> 3fa9a051 3f8b724e 3fb67b74", + "3f1b327c 3f720340 3dd6b2c1 3f720340 3e7dba14 bdfccab7 3e7dba14 -> 3f05bffb bd096cd0 3f05bffb", + "3f80d6b5 3f4b4600 be6aa0d5 3ee64ce8 3f1ed970 be295422 3dc794c1 -> 3f1e8eec be28e699 3dc2da4f", + "bd57b079 3f92d3c7 3f98c3d0 3e6e0baa 3f8fe3ae 3f8fe3ae 3f236b4c -> 3f92fb62 3f993b76 3e5828b8", + "3f7f2efe 3f985062 be12738c 3f985062 3f000000 00000000 3f400000 -> 3f009035 b9ef22f4 3f405bf4", + "3f865ac7 3d804a6d 3f6489a7 3f2e276d 3f48e54e 3e7e0736 3e7e0736 -> 3f5212b8 3e5d4194 3e680e46", + "3f435413 3f93fca1 3f678c01 3f678c01 3e0d2dca 3f426637 3f938855 -> 3ec22681 3f4b3405 3f8c0175", + "be1085ec 3f4e391c 3f4e391c 3ec15a11 3ee7e9a8 3ee7e9a8 3f8d1d80 -> 3f5af685 3f5af685 3e8cf99c", + "3f371a1f 3f0aeda3 3e85dcb2 3f0aeda3 bb93b4f4 bb93b4f4 3ecfd141 -> 3e1af12f 3d91dec2 3ee3c2f7", + "3f26b0c4 be7a9275 be7a9275 be2f9472 be7b86a4 3f9958bf 3f9958bf -> be7b3174 3f31d83f 3f3862a0", + "3f3ee6e8 3f797aab 3f5b6b99 3f561981 3e720639 3e6621e5 3e6621e5 -> 3ed91ea9 3ec56606 3ec2b14a", + "3fb7212a 3eb5976f 3f95433f 3f02a1ac bc97dab0 be473146 3f71fb41 -> be37947d bf47d226 3f90f84d", + "bc875ce2 3f5f327a 3ef22df3 3f5f327a be528bd4 3f7a8358 be528bd4 -> 3f63c148 3eede702 3f63c148", + "3efad708 3ee08e86 3bb4db8e 3bb4db8e bcd27264 3f077ca3 3f8238dd -> 3e5831f6 3e863287 3f00516a", + "bee139f1 3f4fb713 3e2b3325 3f4fb713 3f400000 3f800000 3f000000 -> 3f56a0ce be4bf164 3f72c80c", + "3fbd378c 3f95b89c 3e62b6d8 3eddf005 3f962e61 3f87c9d8 3f87c9d8 -> 3f9666b4 3fbb2d45 3fae31c9", + "3f7246ee 3c72febb bda22ca1 3f986239 3f6a2b84 3f6a2b84 3f22406e -> 3f5dd21e 3f5c87d4 3f29e429", + "3ddbdf16 be1ceea8 3f55bfa1 3e6b2fc5 3e60c6b3 3f65d2aa 3e9bd514 -> bde7e79d 3f57796a 3e7365b0", + "3eedf8c5 3efe9b42 3f6b9585 3f13c69f 3f1db30a 3e58c62d 3e58c62d -> 3f0d6e57 3f17469c 3ed08f4a", + "3eada9bd 3ef76519 3e623812 3f0cc448 3f90cbaf 3f9fad2b 3dff85da -> 3f33f75c 3f11b12e 3ecfb572", + "3d67a3ec 3e1fd24d 3f804c49 3f8b6daa 3dabe9f1 3f64df87 3f32eb10 -> 3e1ba4ec 3f7f0736 3f889a3b", + "3f8907a1 3f7d1455 3f7d1455 3ee704fb 3f78fdc6 3f99adef 3f78fdc6 -> 3f78b3f1 3f9b9811 3f813432", + "3fa2a6ba bdcff603 3f90e5ed 3f90e5ed 3f7932e2 3f858f59 3f858f59 -> 3fa1d943 3f827d95 3f827d95", + "be665de3 be277a21 bc538679 3f50ae23 3f000000 3e800000 00000000 -> bea02b2e bd939284 3f7fa061", + "3e999183 3f952f97 3df64732 3ea25a4c 3f1382b9 3f4714e1 3f4714e1 -> 3f7d1f6c 3ea286de 3ee914cf", + "be63a3ea 3f43f995 3e0ca5aa 3e8a5005 3f121f18 3f7ad67b 3f9e0028 -> 3f4f0ebe bd4c8b90 3d6480c0", + "3f121ecb 3f9fffaf 3f9fffaf 3eb693cf bdfc41d8 3ec2bc73 3f461fa7 -> 3eeeb381 3f40ecb0 3f1844a8", + "3e211db1 3d96a118 be42e810 3e795d68 3f159cc7 3f87eeff 3dcadc6f -> 3e1d9fe6 3bdb9700 3e6216c3", + "3fb1da8a 3ef0d317 3f0026ab bc365638 3e800000 3f400000 3f400000 -> 3e281d20 3f58de36 3f85f1f1", + "3de84277 3de30204 bdac837e 3e42eb13 3e406dc1 3f723df6 3e131438 -> 3df4e8c6 3d05a81a 3e3d7e2e", + "3f551472 bdf5a208 3ebc477f bdf5a208 3deeb08c 3deeb08c 3f3e6e4b -> 3d9d7d5c 3e2277ec 3f195b27", + "3f51642a 3f857332 3ef52383 3ef52383 bd2b5faf 3f469614 3f469614 -> 3e1f546f 3f38bf08 3f38bf08", + "3fa4673e 3e00bc81 3f863f93 3e00bc81 3ef2f70d bd0aab5d 3c7da25a -> 3f12e10a beaefc13 bc820487", + "3f8fcbb6 3e9df110 3e9df110 3f959851 3f5205ad 3ea15aa7 3f5205ad -> 3f6231c9 3ea1c675 3f4704bc", + "bdfb1df0 3f70dc37 3f3cbb6a 3ef235f4 3e800000 3f000000 00000000 -> 3f8345e5 3f442dc5 3f07f46e", + "3fa57816 3d8188c0 3f8532cb 3f8532cb 3f99daff bbe52805 3f79fa85 -> 3fc485f3 bea09787 3f752c2c", + "3f87a7c6 3f7b07d8 3f13f475 3e8c2bc4 3e800000 00000000 3f800000 -> 3e5341b2 bd0d94c3 3f858f3e", + "bd1a25b2 3f8c5388 3dd8ead8 3cfa5261 3e662ed6 3f89d9a7 3f1a5dac -> 3f908643 3d8e1371 3c13afbe", + "be9a8660 3def157d 3f852d86 3f215988 3e800000 3f400000 00000000 -> 3d9cb754 3f9065f9 3f520bcf", + "3f3be680 3d6f1ae2 3f2c038f 3f2c038f 3ec1ae6d 3f8ebe7e 3f8d3607 -> 3e961c2c 3f7f4d6d 3f7d0d4d", + "3fabee6d bd989fb0 3f859976 bd989fb0 3f8fd35a bd586b7c 3f8fd35a -> 3fc47661 bedbbffa 3fc47661", + "3ee17914 bcd987b8 3ef289dd 3f896040 3f481282 3f29ef88 3f29ef88 -> 3ea89b23 3f0eb369 3f6497e2", + "be766a69 3dc1ec6a 3d925809 3c3ffa20 3f6451cb 3f9b223f 3f75b8ae -> bdc6f426 be4fdf16 be5da2cf", + "3f2a60be 3f8244ce be48f18b 3d9ec70b 3f241717 3f241717 3f849a64 -> 3f44591d 3eb8d014 3f3724a1", + "3f75eb2f 3f7f4660 3f7f4660 3f34be69 3f690bb5 3f690bb5 3f8fc2bd -> 3f69ebcf 3f69ebcf 3f8da882", + "3f10491f 3da839a4 3f8bf5c0 3f921f3e 3dcccccd 3dcccccd 3dcccccd -> 3dbcd6de 3f0894ca 3f0df593", + "3e84493e 3e343139 3f623ec0 3eaae882 3f4b6c28 3eb35e52 3f1910fa -> 3eabef58 3f3ef632 3ecdd8aa", + "be3e7846 3f827f2a 3dfd56f8 3dfd56f8 3f4fb229 3f4fb229 3f967715 -> 3f87741c bb899400 bd9355ec", + "be548793 3c75e906 be2e480e 3c75e906 bc9b38e2 3f18cbd4 3f859fa0 -> 3cb4b0bd bea8a6e1 be4b4ebc", + "3f03e41e 3e114f82 3f8b216c 3f4daa28 3f1c1338 3ed4a84d 3f1c1338 -> 3ec40afd 3f3dae7e 3f341dbb", + "3f5c974a 3f0e6ade 3ed34051 3f8b62d2 be087866 3f34a6b3 3ea2fcf8 -> bd1b32a8 3f2a461e 3ed98fcf", + "3f6fd223 3ee403c5 3e0c3a4b 3ee403c5 bddf47e3 bddf47e3 3f76e77d -> bd97870d bdbf71dc 3f6e8154", + "3fac6cc3 3f9e5569 be68ebe0 3eef9b7d 3e8ab0d6 3db67318 3f25c5d9 -> bd83f074 3e4bb9d6 3f35ba32", + "3f7b3b00 3f739777 3f9c6a6e 3e6d099f 3f2c471b 3f9224be 3f9224be -> 3f2d9b3d 3f9255bd 3f8ff907", + "3efdb4d4 3ec914ed 3f86541e 3f0501ae 3dfd2154 3dfd2154 3e73d39a -> 3e84cca9 3f173604 3ec29bd6", + "3f090c5e 3f638c78 be2a0ca5 3f638c78 3de94509 3ec094f1 3ebdd37e -> 3ef2aee9 3dfe5cb7 3f1c8afa", + "3ee4b4d6 3d8d9272 bdb2c057 be289376 3f400000 3f400000 3f400000 -> 3ebf1cef 3e92cdbc 3e79c8ff", + "3f1b89a3 3f9d23fe 3f285fcd 3f285fcd be3073d8 3f8990e1 be3073d8 -> 3ec1105b 3f693ca2 3e1d1814", + "be690f61 3ec9d64a 3d592c4d 3f3049d5 bcb584fe bcb584fe 3e250063 -> 3efa5b58 3d8fa101 3f4f05d3", + "3f051943 3f8ec83d 3e9bbcab 3f955f3c 3f800000 3f000000 3f400000 -> 3f8718c0 3ecfdd8b 3f733efb", + "3f8a0cbb 3edf2f3b 3edf2f3b 3f9cc341 3f851435 3e6c655a 3f0147a7 -> 3f8b258c 3e5be902 3ee5a0d6", + "3f3de8c5 3f0b088f 3ec8f3e8 3f80cac0 3f07dc2b 3f80e6e1 3f80e6e1 -> 3f08ade7 3f592fe0 3f80df9e", + "be41951c 3e1365d5 3f303a32 3ef51bdc 3f47a5a7 bdc7e85c 3f6f4e9b -> 3cc25890 3f564429 3ec8f73b", + "be2dbf6a 3ef74739 3e86c918 3f8fa5f9 bdd98de4 3edaa592 be7dbfbb -> 3f153b59 3e711cd6 3fad675f", + "3ea0bbfd 3f56d061 3f7202e0 3ea5fb86 3e1110ff 3d8c2982 3d8c2982 -> 3f1ec309 3f2b892d 3e79c02e", + "3ee993a1 3e27c8e1 3d594b2d be0310b9 3f000000 3f800000 3f800000 -> 3ea2689c 3ef858db 3ec5f0b8", + "3cb790d5 3f9cc73d bdc3f290 bde37af1 00000000 3f400000 00000000 -> 3f9943e4 bd9d235e bdde6204", + "3fbd8558 3f22b12d 3e1a7411 bd97374c 3e0bdfff 3e0bdfff 3f89633e -> bdd35a72 3e04de3e 3fcff687", + "be596781 bd81c9e0 3f5cf261 bd81c9e0 3f400000 3e800000 3f800000 -> be71b9a4 3f7e449c be9409c2", + "3e8130a6 3f4efb8a 3f4efb8a 3ec1d385 be68e89a 3ef5ba3c 3f402967 -> 3f0c1050 3f39c1e2 3ef1e4b0", + "3f2175c5 3e57f97e 3eb897fa 3e57f97e 3f1d1bc3 3f3cd355 3f1d1bc3 -> 3eee0e95 3f192d84 3eee0e95", + "3f6bd6a2 be18f98c 3f93db5e 3f93db5e bd58220c 3f1cfc12 bd58220c -> bd774d52 3f27e912 3d2d8482", + "3e3c22b4 3f823e1c 3f364067 3f956641 3f000000 3f400000 3f400000 -> 3f6c24ec 3f380ae9 3f8b96ac", + "be581699 3e4d1889 3e4d1889 bdeb9ff9 3f15e736 be33e6a4 3f15e736 -> 3df3afd6 3e8f2b6e be869a63", + "bc1b8781 3daf2c6e be40adc8 3daf2c6e 3e191fc4 3e191fc4 3f9672e0 -> 3dadede6 be43f622 3d99fc54", + "3e3063d9 3f98aa8a 3f80c108 3f9bbfec 3f800000 00000000 3f000000 -> 3f946ad3 3f55269a 3f8bf1fe", + "3f7acec2 3f556b25 3f953eb2 3f8f4af3 3f43e3be 3f942e5b 3eae2711 -> 3f443ec2 3f9433e1 3eb63ee9", + "be0d5f12 3f120d22 3e5537f1 3e5537f1 3e0be2ea 3f34294a 3f34294a -> 3f216301 3e0f2a0a 3e0f2a0a", + "3f787b31 3f1690af 3f1690af 3f2c3351 3f990ba8 3f21a9b1 3f21a9b1 -> 3f96c2fa 3f215640 3f21f8ec", + "3f1acb0d 3f56be91 3f077c08 be0cf6a1 3f8c426c 3f7255a6 3dcbb738 -> 3f7e8404 3f4817b1 3bbb8e18", + "3eaaeb55 3ef1e9fd 3e99679d 3f06b3a5 3f9d2a52 bd541315 3f9d2a52 -> 3f3982a2 3e3ab073 3f42aaaa", + "3f169a19 3eff9848 3f0c74aa 3eff9848 3f1d3522 be155e0f 3e823645 -> 3f11195c 3e0f7004 3eb5d561", + "bca3ce09 3f88e7f1 3e95a2e5 be0a7ba9 3efd8c77 3f741410 be464d86 -> 3f8a6047 3e8ede0b be094972", + "3e0d748f be662f4e be6e938f be662f4e 3e356eaf 3e92e529 3e356eaf -> be2d52f2 be250908 be2d52f2", + "3e8ecdbb 3da34825 3cb7c25e 3da34825 3e99eb66 3f933f31 3f007dd2 -> 3e10bb08 3eac8edf 3e4a38dd", + "3e76c2ab 3f022d35 3f022d35 3f85abc1 3f08f8ee 3ebe2ce6 bd118faf -> 3f03d071 3ef37124 3f48b9ee", + "3f49e17d 3f70d1cd 3f9d8c74 3f467d44 3f000000 3f000000 00000000 -> 3f17d9b4 3f278d8e 3e27d852", + "3fba880d 3f2d678a 3f8fcaa5 3f2d678a 3d314ecf bd909503 3d314ecf -> be7c942a bf1dd798 be7c942a", + "be35f310 3f47ae4a 3f61cd57 3e1b1dcb 3f800000 3f000000 00000000 -> 3f3dac7a 3f732e1a 3e36ada1", + "3f12e332 3e8cee26 3e876fce 3e876fce 3eb751d5 3e17730e 3e17730e -> 3ea5409f 3e4a59b6 3e4a59b6", + "3f9095a0 3f19d0d0 3e0887fc 3e1f5162 3dc588be 3ca0416c 3dc588be -> 3cfec60c 3b9e00a8 3db5d7ee", + "3eb8d569 3e91b464 be1e5932 bca69a36 3efdc0d8 3f68c9ac 3f9ffd94 -> 3eb8b5e8 3e6af6e2 3ee05fee", + "be64178c 3e9fb6f1 be58f8ac 3f6500e0 3f940f2f 3f138a8b 3d8f33c4 -> 3dfd7cd4 bec660ff 3f8a034e", + "be97660b be7ab06a 3eb6ef20 be7ab06a 3f1f41cc 3e5b5c2b 3f1f41cc -> bf004bff 3ecc9868 bf004bff", + "3f23bb84 3f3e34a3 3f3e34a3 bce2efd6 3e837923 3e0c93e7 be26693a -> 3edd3208 3eb6102b bde95083", + "3e87a40f 3ec5e939 3de7181a 3f89f53d 3f209285 3f842d01 3f842d01 -> 3ee68efc 3eb688ac 3f886d16", + "be9346eb 3f3b875a 3f8bb6b2 3e47a9a0 3f800000 3e800000 00000000 -> 3f27d53a 3faab291 3e808c3e", + "3f3cd502 3f64b15a 3e0c8c21 3f9b2918 3e767090 3e9ae181 3f65870d -> 3ed2e580 3e84ae9d 3f7ab9c9", + "3f726d08 3f486211 be07ca92 be07ca92 3f629699 3f97e9cb 3f629699 -> 3f6132e3 3f8ef54d 3f54c60e", + "3d967637 3f036414 bca8d19f 3e6a0b89 3f264f2e 3f55c9da be33b30d -> 3f05f4d0 3d2d18ba 3e4ba5f1", + "3f031d68 3c7c7b0f 3de7c79e 3c046769 3e0e0635 3eafb157 3f9f115c -> 3da0e05e 3e6c80c8 3f23f2ac", + "3f56cb30 be7b8f58 3c116bc9 3c116bc9 3f8556e0 3f8556e0 3ebb2d53 -> 3f55a171 3f601e89 3e9dc7b5", + "3fb0d313 3de84589 3f977828 be4698f1 be767ada bdc3cddb 3f813396 -> bec065f5 bf155d69 3fbbf417", + "3efe7e4a 3f89365b 3ec4357f 3ec4357f 3f172b60 3f4535a4 3e4e1298 -> 3f5528e5 3f135d89 3e95e596", + "3f9411e0 3e2a8888 3e2a8888 3eba64f3 3ef2e503 3e49ecb9 3e49ecb9 -> 3f05ce12 3e4ed8c3 3e2f224e", + "3f9f0f3c 3f44b61b 3f44b61b 3f11268d 3f85b658 3f8a042a 3f8a042a -> 3f8e4aa9 3f93a3d7 3f99e54b", + "3f9fbf36 3f920a7b 3f920a7b 3f999cbb 3ced6e3a 3ced6e3a 3e846e5c -> be7cbb65 be7cbb65 3cce1330", + "3c83a6a2 3f2da81b be66a163 3ec60fee 3f8d8bd7 3f38dbd0 3f38dbd0 -> 3f2f6a56 be570a73 3ec8d222", + "bcb36c5e 3f35dd54 3f35dd54 3cea1ed7 3f33c27f 3cf87922 3ee742c4 -> 3f35e920 3f39ad80 3c9e34c1", + "3f00de86 3f84d1d1 bdff7dde be34dec3 3eeda063 3f7b739d bc5bccdd -> 3f3fba4a 3edd708a bdc17903", + "bed9a1d3 3ee13ffa be5109db 3e91053f 3f84e677 3f0d81b8 3f0d81b8 -> 3e3e101e bf069f5a 3e2cbacc", + "3ec0c29c bdcfd008 3f187ab6 3de8e617 3e0cb23f 3f29df77 3f291104 -> bc3d1320 3f1f071b 3ea39b1b", + "3f8cf67d 3f03ad40 3f03ad40 3c6aa545 3e83d374 3caac14f be195c99 -> 3e6d0306 bceeadb1 be2a60d1", + "3f520e84 3f8f02db 3effb9cc 3effb9cc 3d2c5367 3f78a124 be2623e4 -> 3e70acc8 3f62f4ba bd32245e", + "3ef5773b 3f956b7f 3f0bd2ec be71974a 3c93707d 3f8d1449 3f79f558 -> 3f1dc702 3f50100d 3eb0ca27", + "be8602e3 3f0fa40b 3f7750ee 3f1d995c 3f963fdc 3f8baf8a 3f8baf8a -> 3ecd2b54 3f6eed0c 3efb73db", + "3e8e00e2 3f1156f0 3f3273a6 3f3273a6 3f58da20 3f58da20 bce160c5 -> 3f252c72 3f3d1a22 3efe0264", + "3f51f703 3f8e77a9 3eda4646 3f894b08 3f400000 3f400000 3f800000 -> 3f50b644 3f311967 3f81abcf", + "bca3ff31 3e2c2111 be1e8ca0 3f975649 3f666666 3f666666 3f666666 -> 3e1d201a be342c49 3f980f7d", + "3f62a983 3f03bdd9 bdd67305 be3029b0 3e1ee98b bb7b77b0 bb7b77b0 -> 3e491775 bc7c4562 bcbd56ae", + "3f63fdc1 3e459282 3e459282 be516e34 3f7f21ff be4eec82 3ec9136b -> 3f689f7a be22ab11 3ea79e96", + "3f2cf55e 3f22b8ae 3f737095 3f737095 3e169a4b 3e169a4b 3dc5989c -> 3e9c7147 3ed0cf3c 3ebf4f35", + "3eeb9970 3f9ede68 3f9e6cc2 bdd21f82 3f0f6d8b bd47e64a be665fee -> 3f6d8731 3f254cf8 be22b99c", + "3e949293 3f469819 3f92cf5f 3f469819 be1677b6 3e561601 3ebb397a -> 3f020cdc 3f5ff2b6 3f282162", + "3e02de21 3f8516d8 bd508a88 3f6d7460 3f5f8914 3eb4d19e 3e6f270b -> 3f825d45 3a3ebe80 3f56bfad", + "be8ccbb0 3f5db622 3cf84da1 3f5db622 3ee239fb bda42f6e 3ee239fb -> 3f7b9337 3d789764 3f7b9337", + "beb9e144 3f4c99ea 3f891e0d 3f93d916 3e09ed17 3f9ef91d 3e841022 -> 3f852e6b 3f812ec8 3fbd8997", + "be034b38 3f9d2f46 3f9c340c 3f0ffd4e 3eab3e9e bd809618 bd809618 -> 3fabd968 3fb142f8 3f24831e", + "3ef29008 3f35c63d 3f91f8fc 3f9fa321 3e565efc 3ef318ea 3f135633 -> 3ef21868 3f53380e 3f6dd16c", + "3f9255b1 3f85e4ab 3f85e4ab bc39156a 3e800000 3f800000 3f400000 -> 3e0b3d0a 3f7e4fcc 3f5bea96", + "3fbabf53 3f6f7c82 bdfa3d6b 3ef40cc9 3f889193 3f4c6422 3ed84b9a -> 3f904a7a 3f9c4720 3ecb8e94", + "3f51e095 3be5cfc1 3be5cfc1 3f1c8681 3f8ca915 3d8e8777 3d8e8777 -> 3f66f5af 3d6ee034 3e2b3a54", + "3f9b83ff bd483d1e 3f26d882 bd483d1e 3e01347f 3e01347f 3e91fed9 -> 3e27bda7 3c583e90 3eb6c294", + "3e190a5f 3e79239f 3f8f58f0 3f8f58f0 3e63fefb 3f4fd188 3f24aa3c -> 3e75faae 3f897407 3f863a80", + "3fa3ed13 3f1184b0 bd64f8e1 bd64f8e1 3dc21811 3ee78230 be3d793f -> bd1c5892 3f18428b be62964c", + "3ec46a1f 3f815a3b 3f5465c5 3f8de03e 3f9dd604 3f99c3bd bdba9996 -> 3f8c4785 3f78e464 3f25f34d", + "bd79ef2b 3f8f176c 3f21b55a 3f21b55a 3f9d502e bd23cad0 3f9e73f5 -> 3f8e3944 3f2c334a 3f183d07", + "3f2ade5a 3f0b6af6 3f1802c1 3f1802c1 3ea7ff63 3f4d8166 3f4d8166 -> 3eccdb30 3f3bb751 3f3bb751", + "3f4f9753 bc9c0ff7 3f80a1c1 bc9c0ff7 be276d3b be276d3b bd6270fc -> be0b74a4 3d6b4c74 bd46609d", + "bd8ac3e2 3ed2cc1c 3e2f7f64 bcffaf15 3f758c59 3f758c59 3f24d1f1 -> 3ebfce23 3df1ad79 bd9d97cf", + "3f8b9311 3f0197c2 3f0197c2 be2388da bda641e9 3c933caa 3f8e7af8 -> be09850d bcd670fa 3f9d3672", + "3e6d9176 3ed49001 3dbe9ac5 3f89f8fb 3f67bd38 3f67bd38 3f07e3b2 -> 3f076334 3e901f85 3f7373c3", + "3e92118a 3d925e07 3f41def8 be24431d 3c95301d 3c95301d be1f5779 -> 3d668051 3f0be43e be22dbc0", + "3fb8d7fa 3f7334ff 3e7e0de3 3eb0c95d 3f984ffe 3f9e5910 3e8a8be8 -> 3fa5f336 3fd690de 3e7320fe", + "3f88b667 3ecba28e 3ecba28e 3f86025b 3f838820 3e35dd26 3f16ffa0 -> 3f8904fb 3e268571 3f0f088d", + "be47dccc 3f0808e2 bda80ac7 3f8dcc1c 3f111268 be202f1a 3f111268 -> 3f064555 bd8a4fb9 3f9b50cc", + "3f9c2a8d 3f448954 3de9e117 3eb47265 3e8e56a8 3f7f92a6 be27c059 -> 3e2e545c 3f98b068 be8e0a1a", + "3e70991e 3f354a7a 3e266eb0 3cb66bfe 3d121d20 bde29698 bde29698 -> 3f0cd734 3dc96a8a bc12ca9c", + "beb7c19d 3ee2a7e4 3ee2a7e4 3f821e3b 3f45fa71 3f03c6d2 3f45fa71 -> 3ea5e4da 3ed569d2 3f8d4a4c", + "3f3ff1bf bd402713 3f7ab394 3f7ab394 3e785291 3e785291 3f4a0842 -> 3e2e2afb 3eda8dc2 3f5635cc", + "3fbfd6a9 3f64c704 3f8e8323 3f8e8323 3e449089 3ef974a6 3e449089 -> be21cd2a 3e33207c be890181", + "bec8e189 3f808ebf 3f59f911 3e389835 3f1013a3 3e15ae85 3f1013a3 -> 3f96bb91 3f9067ed 3cf74378", + "3f232943 3f8e8060 bd3924a4 3e88f4e4 be02058c 3f448d78 be659f86 -> 3ea5476e 3ef226f4 bd3c0f36", + "3f9610c8 3f8b11c0 bd8f7f21 3f9fe3c0 3f2ecbe5 3f5f9419 3e98a1b6 -> 3f1cfb4a 3f849b3a 3e09622e", + "3cb77b9d 3e583d7d 3f53bc87 be657a20 3f8fd64a 3cb148f7 3f922f48 -> 3e6d2b83 3f4f1e3b be4624be", + "be611e30 3f0eef7b 3f4ba4fb 3f673e45 3eb84ad5 3eb84ad5 3ecce5c7 -> 3f1a19e0 3f64280c 3f81c760", + "3f7a74c3 3f219ba1 3f219ba1 3f9920d9 3d4195a5 3f906d0b 3e733a15 -> 3d756370 3f8f0c54 3e843e8a", + "3faa3e7c 3f0e0db3 3f7ad352 3f72c2ef 3e800000 00000000 3e800000 -> 3e18f59c bea58f91 3ca018c0", + "3f37c08b 3cbe11fe 3cbe11fe 3f977f87 3f922e72 3d501fc5 3f2cc95e -> 3f53876c 3d303555 3f5188be", + "3f5e9279 3edd32c0 3e89dda6 3d539060 3f930138 3f365afb 3f365afb -> 3f8707b6 3f278b83 3f20453e", + "3eb8bde6 3f3b3d1b 3f3fa8c7 3f419fe1 3e783a3f bd85b16b 3d5811f3 -> 3f0e11f3 3ee8f2bd 3f00a205", + "3ec957d2 3f34b119 3f3c1b94 3f9f0925 3f3617c8 3f3617c8 3f7a2185 -> 3f353e26 3f39be0e 3f91ad4e", + "bd2114ae bd99646b 3f09d410 3eab0a6f be2d74f2 3f700f78 bd9fbc55 -> bd91c821 3f05ced6 3eb3566d", + "3e8868bd be367f30 3ee1f51f 3eb92ed6 3f800000 00000000 3f400000 -> 3e0af168 3ea5c1ca 3eee2712", + "3e8c3f3e 3f7066c4 3f78e6a0 bce77127 3f833021 3f833021 3d188511 -> 3f766bb4 3f7c978c bc28fa5a", + "3cc25818 3f3d3122 3f6667ce 3f3d3122 3f982cb3 3deda210 3deda210 -> 3f3fec83 3f61a4e5 3f396886", + "bd4e70c9 3f5aa616 3f049515 3c4c9e08 3f8c4a1f 3f71b769 bc2bba10 -> 3f578707 3efe29f3 3c5f95d3", + "3f43cb5f 3dd14dd7 3ee9103a 3ee9103a 3f400000 00000000 00000000 -> 3f18ffb0 3ddb3ede 3ddb3ede", + "3faada1d 3f6806a5 3f58e0eb 3e992958 3e6218b1 3f30286d be1eab97 -> bc0ec280 3f228680 be9d2bb0", + "3f0ea836 3e8bc7e6 3f905e91 3f469d3d 3f9b1c6b 3f9b64e3 3f9b1c6b -> 3f4bd0f3 3f968351 3f826770", + "be47063b 3f13312d 3f9d43e5 3f9d43e5 3f800000 3e800000 3f000000 -> 3efc16a2 3fb59c99 3faf6467", + "bdbbd43b 3f1f9b9e 3f950b14 3ea11af0 bd9571bd 3d8a8ec9 3f15fe54 -> 3f2ff596 3fa1eb17 3e945e30", + "3fb5fa3f 3f488eaa 3f7d529a 3f9c439c 3f6e81eb bdcdab00 3f6e81eb -> 3f7e82d6 bf0f6033 3f4f4b03", + "3ee825cd 3f6f7dea 3f85f21c 3ddb752f be329f03 3f922fba 3f922fba -> 3edd4fbd 3f8b7ef0 3f138f53", + "3ec2eb2d 3ea97622 3ea97622 3eae48ad 3f9b6847 3f9cf2f8 3f3f947a -> 3f2acd0e 3f2bf993 3efdcd99", + "3dec19cd 3f213c2c 3e223ae3 3f819af9 3f0632cd 3f0632cd 3b41aec1 -> 3f1e1e40 3e4d693c 3f656a4a", + "3fb75613 bc3fe6f7 3e71b936 3f703c0a 3f8e8801 3f9a9661 3f9a9661 -> 3fcccc37 3fd05aef 3fa97d47", + "3f8dddd6 3f07a6e8 3f589bf9 3f589bf9 3f16d7f3 3f16d7f3 3f9d7ed3 -> 3f187d42 3f0fb810 3fa2d30a", + "3bcbc00f 3f6172ba 3edd03c4 be17b27e 3f8b455e 3e637352 3f9a1f29 -> 3f61c73e 3edc58fc be0f1660", + "bec31109 3f1a034e 3e972cab 3f1a034e 3e4175ca 3e550bf0 3f6f9999 -> 3f42437d 3ea82fa4 3ef2cf6f" + ] + }, + { + "function": "cycles_mix_blend", + "node": "ShaderNodeMix RGBA MIX", + "cases": [ + "00000000 00000000 00000000 00000000 3f65b3f9 3ea38e39 3f65b3f9 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3e800000 00000000 3e800000 -> 3e000000 00000000 3e800000", + "3f800000 00000000 00000000 3f000000 3e1ad983 3e1ad983 be22d1a4 -> 3e1ad983 3e1ad983 be22d1a4", + "3fc00000 00000000 00000000 3f400000 3f03b808 3f867910 3f92193a -> 3f45940c 3fc9b598 3fab25d7", + "bf000000 00000000 00000000 3f800000 3eb2cd7a 3eb2cd7a 3f2e056c -> be32cd7a be32cd7a 3f947ea5", + "3e800000 00000000 3e800000 00000000 3f8cb147 3f42d726 3f93d048 -> 3e8cb147 3ec16b93 3e93d048", + "3f400000 00000000 3e800000 3e800000 3f54e438 3f9abcad 3f59401b -> 3f1fab2a 3f781b04 3f32f014", + "40000000 00000000 3e800000 3f000000 bc166936 bc166936 3f24801c -> bc966936 be896694 3f490038", + "00000000 00000000 3e800000 3f400000 3f5b80b8 3ee67ab7 be1ec894 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3f752c36 3f1e8df4 3f9c020c -> 3ef52c36 3ede8df4 3f8e0106", + "3f800000 00000000 3f000000 00000000 be5fe3ce 3ef04ed4 3f6dce33 -> be5fe3ce 3ef04ed4 3f6dce33", + "3fc00000 00000000 3f000000 3e800000 3f9eda82 3f9eda82 3f147173 -> 3fee47c3 3fce47c3 3f3eaa2c", + "bf000000 00000000 3f000000 3f000000 3f4cdf51 3f4cdf51 3f64bd74 -> beccdf51 3eb320af 3e9b428c", + "3e800000 00000000 3f000000 3f400000 3f8ef4bb be1a4ad0 3f35ca57 -> 3e8ef4bb 3eacb6a6 3f3d7296", + "3f400000 00000000 3f000000 3f800000 3f951df1 bd521a2f 3f951df1 -> 3f5facea 3db13630 3f8fd675", + "40000000 00000000 3f400000 00000000 3e800000 3f400000 3f800000 -> 3f000000 3f400000 40000000", + "00000000 00000000 3f400000 3e800000 3f7d0b44 3ecaf3f1 3ecaf3f1 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f5321be 3c3710e2 3f57a009 -> 3ed321be 3ec2dc44 3f2bd004", + "3f800000 00000000 3f400000 3f400000 3f531176 3ea52936 3f41fe08 -> 3f531176 3ea52936 3f41fe08", + "3fc00000 00000000 3f400000 3f800000 3f800000 3f000000 3e800000 -> 3fc00000 3ec00000 be000000", + "bf000000 00000000 3f800000 00000000 3f430153 3ed4261f bd7c9b82 -> bec30153 3fa57b3c 3cfc9b82", + "3e800000 00000000 3f800000 3e800000 3ef75b2a 3dab57bd 3ef75b2a -> 3df75b2a 3f455abe 3e9dd6ca", + "3f400000 00000000 3f800000 3f000000 3f37fcb3 3c089efd 3c089efd -> 3f09fd86 3e8333ba 3e066774", + "40000000 00000000 3f800000 3f400000 3f1c1fdd 3f9ba973 3f1c1fdd -> 3f9c1fdd 3fb752e6 3ef07f74", + "00000000 00000000 3f800000 3f800000 3f515e02 3f2b84bd 3f03d4d4 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 bb90d651 3ee41dab 3ed3fb73 -> 3dfb794e 3e641dab 3e53fb73", + "3f800000 3e800000 00000000 3e800000 3ed94c7c 3e23af24 bd103b50 -> 3ed94c7c 3e23af24 bd103b50", + "3fc00000 3e800000 00000000 3f000000 3f400000 3f800000 3f400000 -> 3f800000 3fc00000 3f600000", + "bf000000 3e800000 00000000 3f400000 3f6968e0 3f2abd3a 3f2e0899 -> bda5a380 beaabd3a 3f48fbb4", + "3e800000 3e800000 00000000 3f800000 3f8453da 3f7ef9a5 3f7ef9a5 -> 3ee453da 3e7ef9a5 3f7fbe69", + "3f400000 3e800000 3e800000 00000000 3e1414f6 3f870f85 be34b847 -> 3e2f0fb8 3f5a9748 be078a35", + "40000000 3e800000 3e800000 3e800000 3dcccccd 3dcccccd 3dcccccd -> bd4cccd0 bd4cccd0 bd4cccd0", + "00000000 3e800000 3e800000 3f000000 3f7ee12e 3e7671a6 3f55cce1 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3ef8ce79 3ef8ce79 3e91c504 -> 3ebc673c 3ebc673c 3f047141", + "3f800000 3e800000 3e800000 3f800000 3e1c8661 3e960e64 3e960e64 -> 3e1c8661 3e960e64 3e960e64", + "3fc00000 3e800000 3f000000 00000000 3f000000 3e800000 00000000 -> 3f200000 3e000000 00000000", + "bf000000 3e800000 3f000000 3e800000 bc1d8843 bdec859c 3e9287ad -> 3ec27621 3f4ec85a 3e6d7853", + "3e800000 3e800000 3f000000 3f000000 3f800000 3f400000 3f000000 -> 3ee00000 3f100000 3f000000", + "3f400000 3e800000 3f000000 3f400000 3f6e0c87 3f14afc6 3f6af335 -> 3f428965 3f0f83d4 3f603668", + "40000000 3e800000 3f000000 3f800000 3f111bef 3f43cc13 3f111bef -> 3f6237de 3f83cc13 3e08df78", + "00000000 3e800000 3f400000 00000000 3f800000 3f400000 00000000 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f9b7141 3f861626 3eb76dbf -> 3f3b7141 3f661626 3e9bb6e0", + "3f800000 3e800000 3f400000 3f000000 3eda05ce 3f39fd05 3e7aaa98 -> 3eda05ce 3f39fd05 3e7aaa98", + "3fc00000 3e800000 3f400000 3f400000 3f400000 3e800000 3f400000 -> 3f800000 00000000 3f400000", + "bf000000 3e800000 3f400000 3f800000 bd5c4427 bd5c4427 3ee0012c -> 3ecdc442 3f937110 3fa3ffda", + "3e800000 3e800000 3f800000 00000000 3e8855d7 3e8855d7 3f8eca2f -> 3e821576 3f510abb 3e8eca2f", + "3f400000 3e800000 3f800000 3e800000 3edcb14e bdad3143 3edcb14e -> 3ec584fa 3e3f0d88 3ec584fa", + "40000000 3e800000 3f800000 3f000000 3eecbb82 3ebc63ba 3ee08dc1 -> 3f2cbb82 be87388c 3ec11b82", + "00000000 3e800000 3f800000 3f400000 3ea7c20f 3ea7c20f bdeaff84 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f3571be 3f27e71d 3f117ff5 -> 3ef571be 3f53f38e 3f48bffa", + "3f800000 3f000000 00000000 00000000 3e404845 3e404845 3edd5323 -> 3e404844 3e404845 3edd5323", + "3fc00000 3f000000 00000000 3e800000 be1b643c bdf90caa 3f8ea05a -> bef48b2c be3ac980 3fc5f087", + "bf000000 3f000000 00000000 3f000000 00000000 3f000000 00000000 -> 3f400000 be800000 3f400000", + "3e800000 3f000000 00000000 3f400000 3ef79f09 3f84893e 3ee9804e -> 3efde7c2 3e84893e 3f2d300a", + "3f400000 3f000000 00000000 3f800000 3e81a097 bd084c07 3f00943b -> 3ea13871 bccc720a 3f206f2c", + "40000000 3f000000 3e800000 00000000 3e72165a bb8a9629 bb8a9629 -> bcde9a60 be8454b2 bc0a9629", + "00000000 3f000000 3e800000 3e800000 3f400000 3f800000 3f800000 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3e869552 3f72d62b 3f8bc21b -> 3ec34aa9 3f196b16 3f4bc21b", + "3f800000 3f000000 3e800000 3f400000 3d761b96 3e5c50d8 3eeaec9f -> 3d761b98 3e5c50d8 3eeaec9f", + "3fc00000 3f000000 3e800000 3f800000 3ec696ad 3ee27c34 3ee27c34 -> 3ea9e204 3f09dd27 3e27749c", + "bf000000 3f000000 3f000000 00000000 3f400000 3f400000 3f400000 -> 3ec00000 3ec00000 bec00000", + "3e800000 3f000000 3f000000 3e800000 3f7afe1d 3f988714 3f7afe1d -> 3f1ebf87 3f2c438a 3edd7f0e", + "3f400000 3f000000 3f000000 3f000000 3ef5de1c 3ef5de1c be7b73b5 -> 3ef86695 3ef86695 bd725b20", + "40000000 3f000000 3f000000 3f400000 3f699e46 3f699e46 3f89942b -> 3fa99e46 3fa99e46 3fb32856", + "00000000 3f000000 3f000000 3f800000 3ec3462d be5d97a1 be598ae7 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 be4031f9 be0b9641 3e912006 -> 3e1fe704 3e9d1a70 3e112006", + "3f800000 3f000000 3f400000 3e800000 3f0c3e1a 3ebb193a 3eccc226 -> 3f0c3e1a 3ebb193a 3eccc226", + "3fc00000 3f000000 3f400000 3f000000 3f05e8a6 bd8b12d3 bd8b12d3 -> 3f08dcf9 bef42710 beb4270e", + "bf000000 3f000000 3f400000 3f400000 3f400000 00000000 3f800000 -> 3ec00000 3f900000 3f200000", + "3e800000 3f000000 3f400000 3f800000 3f4f06f8 3f19b879 3ec75e25 -> 3f13c1be 3f366e1e 3f58ebc4", + "3f400000 3f000000 3f800000 00000000 3e188f35 3f051970 3f9a3295 -> 3e726b68 3f23d314 3f674be0", + "40000000 3f000000 3f800000 3e800000 3ef87a8e 3eb5d30c 3ef87a8e -> 3ef0f51c be9459e8 3f387a8e", + "00000000 3f000000 3f800000 3f000000 3f844b62 3f5e5ad5 3f84cd07 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 bd1cd0dd 3eabff6c bd1cd0dd -> 3e6c65e4 3f2affdb 3eb632f2", + "3f800000 3f000000 3f800000 3f800000 be5d5da8 3f20a01b be5d5da8 -> be5d5da8 3f20a01b be5d5da8", + "3fc00000 3f400000 00000000 00000000 3d2c7c1d 3e3c6559 3f78f7c8 -> be9fa8b8 3e8d4c03 3fbab9d6", + "bf000000 3f400000 00000000 3e800000 3f575ad4 bd783261 bd783261 -> 3f345296 3cf83261 3ecf8326", + "3e800000 3f400000 00000000 3f000000 3e390429 3f042e8f 3f83c9d5 -> 3f1b9042 3e042e8f 3f21e4ea", + "3f400000 3f400000 00000000 3f400000 3e3fc9f5 3ef7d848 3f318db0 -> 3ea7ebbc 3eb9e236 3f352a44", + "40000000 3f400000 00000000 3f800000 3f8c7b3e 3eb00db3 3eb00db3 -> 3fb8f67c 3f300db3 be9fe498", + "00000000 3f400000 3e800000 00000000 3f8f5e02 3eeda0d8 3f0e2208 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f35c626 3f1f0be7 3f35c626 -> 3f3ae313 3edf0be7 3ef5c626", + "3f800000 3f400000 3e800000 3f000000 3ce0ff7d bc584c59 3f1484a3 -> 3ce0ff80 bc584c60 3f1484a3", + "3fc00000 3f400000 3e800000 3f400000 3e13d6ef 3f588f7d bc5ddbfd -> be223d98 3f926b9e beca6650", + "bf000000 3f400000 3e800000 3f800000 3f2f4ec3 3dbfb967 bd8e6b76 -> 3f48589e 3ea808d3 3fc4735c", + "3e800000 3f400000 3f000000 00000000 3f400000 3e800000 00000000 -> 3f400000 3ee00000 00000000", + "3f400000 3f400000 3f000000 3e800000 3e800000 00000000 3f800000 -> 3ec00000 3e000000 3f500000", + "40000000 3f400000 3f000000 3f000000 3d7247d3 3f55b8d8 3f988fa0 -> bf21b706 3f95b8d8 3ff11f40", + "00000000 3f400000 3f000000 3f400000 3f8307ab 3f8307ab bc64d108 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f07e2a5 3f958f40 3f1a3903 -> 3f23f152 3f558f40 3f4d1c82", + "3f800000 3f400000 3f400000 00000000 be14b6c7 3e7e1584 3e9725b7 -> be14b6c8 3e7e1584 3e9725b7", + "3fc00000 3f400000 3f400000 3e800000 3e88b121 3e41d84c 3f73616f -> 3cd09b20 bdba7720 3fa68913", + "bf000000 3f400000 3f400000 3f000000 bd9a8e72 bd9a8e72 3f04ac59 -> 3f94d474 3f94d474 3efb53a7", + "3e800000 3f400000 3f400000 3f400000 be52cd43 3e856e3b 3f86626e -> 3f02d32c 3f20adc7 3f533137", + "3f400000 3f400000 3f400000 3f800000 3f400000 3f400000 00000000 -> 3f400000 3f400000 3e800000", + "40000000 3f400000 3f800000 00000000 3f400000 3f400000 3f800000 -> 3f400000 3f000000 40000000", + "00000000 3f400000 3f800000 3e800000 3f178de2 3eb427ec 3f178de2 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3eb786d7 3eb786d7 3f767cfd -> 3f0de1b6 3f2de1b6 3f3b3e7e", + "3f800000 3f400000 3f800000 3f400000 3f000000 3f000000 3f800000 -> 3f000000 3f000000 3f800000", + "3fc00000 3f400000 3f800000 3f800000 3e9a42ab 3ef0469f 3ef0469f -> 3d9d9000 3e50d3e0 3e50d3e0", + "bf000000 3f800000 00000000 00000000 3e8000d4 3e8000d4 3f2f44d4 -> 3fafffe6 be0000d4 beaf44d4", + "3e800000 3f800000 00000000 3e800000 be1aa65b 3f1709a5 bde73951 -> 3f36559a 3e1709a5 3e2318d6", + "3f400000 3f800000 00000000 3f000000 3f514a82 3f514a82 be3e0316 -> 3f5cf7e2 3f1cf7e2 bc682500", + "40000000 3f800000 00000000 3f400000 00000000 00000000 00000000 -> bf800000 00000000 bf400000", + "00000000 3f800000 00000000 3f800000 3eb23799 be681a00 3eb23799 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f07ecae 3f7ae611 3f8d7783 -> 3f43f657 3f1d7308 3f0d7783", + "3f800000 3f800000 3e800000 3e800000 3f202929 3f8c97d2 3f8c97d2 -> 3f202929 3f8c97d2 3f8c97d2", + "3fc00000 3f800000 3e800000 3f000000 3f772868 3f5f818a 3f8215b5 -> 3f72bc9c 3f97a128 3fa32090", + "bf000000 3f800000 3e800000 3f400000 3f5313bd 3f87fa77 3f87fa77 -> 3f8b3b11 be1fe9dc 3f180589", + "3e800000 3f800000 3e800000 3f800000 3f800000 3e800000 3f400000 -> 3f800000 3e800000 3f700000", + "3f400000 3f800000 3f000000 00000000 3f873d92 3f48e913 3ee9eca8 -> 3f856e2e 3f36aece 3eaf717e", + "40000000 3f800000 3f000000 3e800000 bdb245d5 3de5cb0e 3f830768 -> bf9648ba be8d1a78 3fe60ed0", + "00000000 3f800000 3f000000 3f000000 3e19d540 3f40557e 3f917d32 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f9f5ca5 3dc5f9d1 be74bd64 -> 3f8fae52 3e98bf3a 3e82d0a7", + "3f800000 3f800000 3f000000 3f800000 3edf3164 3f5a1d81 3f5a1d81 -> 3edf3164 3f5a1d81 3f5a1d81", + "3fc00000 3f800000 3f400000 00000000 3eebcac0 3eebcac0 3f376e0f -> 3e436040 3ea1b020 3f89928b", + "bf000000 3f800000 3f400000 3e800000 00000000 00000000 00000000 -> 3fc00000 3f900000 3ec00000", + "3e800000 3f800000 3f400000 3f000000 3e1955d7 be062891 3e1955d7 -> 3f49955e 3f079d77 3ed32abb", + "3f400000 3f800000 3f400000 3f400000 3f4ab72f 3f77edc1 3f4ab72f -> 3f580963 3f69f251 3f480963", + "40000000 3f800000 3f400000 3f800000 3e800000 3f000000 3e800000 -> bf000000 3e800000 bf000000", + "00000000 3f800000 3f800000 00000000 3ec041fe 3ec041fe 3f0b8a4d -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3ec64b4d 3ecbf8c5 bdc85913 -> 3f3192d3 3f32fe31 3d9bd376", + "3f800000 3f800000 3f800000 3f000000 be002113 3b9987bd be002113 -> be002110 3b998780 be002114", + "3fc00000 3f800000 3f800000 3f400000 3e8136d8 3f294909 bc9ded11 -> bdf8b6f0 3efbdb1c becece3c", + "bf000000 3f800000 3f800000 3f800000 be800000 be800000 be800000 -> 3fd00000 3fd00000 3fd00000", + "3e800000 00000000 00000000 00000000 3ef0247b bdc6e3c6 3f81077c -> 3df0247b bcc6e3c6 3e81077c", + "3f400000 3e800000 3e800000 3e800000 3f76afd7 3e9e844d 3f041a13 -> 3f4903e1 3e96e33a 3ee6271c", + "40000000 3f000000 3f000000 3f000000 be6b5c8a 3f93c461 3f166871 -> bf75ae44 3fe788c2 3f2cd0e2", + "00000000 3f400000 3f400000 3f400000 be697154 3f9b015c be697154 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3e079b04 3ebf1c22 3ebe1e5f -> 3f10f360 3f2fc708 3f2f8798", + "3f800000 3fa00000 3fa00000 3fa00000 be2a45a4 3f4b0f37 be2a45a4 -> be2a45a0 3f4b0f37 be2a45a0", + "3fc00000 be800000 be800000 be800000 bde00cbd bde00cbd 3ea5aa4d -> bd202634 bd202634 3f1c3fb9", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3f000000 3f000000 3f000000 -> bdcccccd bdcccccd bdcccccd", + "3e800000 3f666666 3f666666 3f666666 3eaf49cb be0741ab 3f1dc241 -> 3f42b606 3f2458b2 3f543d5d", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f400000 00000000 3f000000 -> 3f255555 3daaaaaa 3eeaaaaa", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f0087a2 bd1405f9 3f0087a2 -> 3eacc932 bf3d2b6b 3eacc932", + "00000000 3d9af5d3 3d9af5d3 bd2998e3 3f80e489 3f449dd3 3f697761 -> 3d9af5d3 3d9af5d3 bd2998e3", + "3f000000 3e64b87d 3f15b3ed 3e55c67c 3e1f6155 3f8e6c67 bdf1acd1 -> 3e420ce9 3f59465e 3d39e028", + "3f800000 3dd60869 3e22fbb0 3e22fbb0 3ed8b0f1 3f3533f3 3e84f73a -> 3ed8b0f1 3f3533f3 3e84f73a", + "3fc00000 3e31266d 3df3a3ec 3f9f1e90 3f800000 3f800000 3f800000 -> 3fb4ed9a 3fb862e1 3f60e170", + "bf000000 3f720cad 3ea78f27 3ea78f27 3f742d96 3f73e1a6 3db637dd -> 3f70fc38 3c6ea2a0 3ee48fbf", + "3e800000 3efbb8d0 3ec21df1 3db34573 be3bd789 3f204750 3f5bd46b -> 3ea54fab 3ee1ba1d 3e8f873b", + "3f400000 3f271f74 3c810bf5 3f271f74 bddcec1d 3f9d0bde 3e0bd66c -> 3da88dd0 3f6c93e5 3e880022", + "40000000 3f66ac47 be0d019b be0d019b 3f26fe96 3f3eb707 3f04456e -> 3ecea1ca 3fd0573b 3f95e5a2", + "00000000 3f731b13 3f7ba6bd 3f26822c 3f90eabe 3e347995 3f623a2a -> 3f731b13 3f7ba6bd 3f26822c", + "3f000000 3effcb8d 3f83404d 3f83404d 3d9aedd7 3f455c27 bdb158de -> 3e934382 3f65ee60 3ef0557e", + "3f800000 3f5673ac 3c170433 3f5673ac 3f903f4d 3f903f4d 3f69a0bf -> 3f903f4d 3f903f4d 3f69a0bf", + "3fc00000 3c1af97b 3d1011ef 3f12642d 3f73251a 3df25d87 3f73251a -> 3fb5c0da 3e23c3e8 3f91c2c8", + "bf000000 3ec6cf28 3f1edd82 3ee6d10d 3f98055b 3df1dc83 3df1dc83 -> bc3a7f40 3f5f2e7b 3f1dff02", + "3e800000 3f9f9861 3f754bfd 3e9c2fb3 be367f30 3f5913e6 3e0795f7 -> 3f63fc9e 3f6e3df7 3e861685", + "3f400000 3e189494 be5307ac be5307ac be75f7b6 3f92469b 3f92469b -> be1254a4 3f4e396d 3f4e396d", + "40000000 bdb8ff7a 3f9d5d56 bde54670 3d9113dc 3d9113dc be4e1693 -> 3e6d9399 bf8b3ada be94c4f7", + "00000000 3f2ba686 3f999ab0 3ee5d9c5 3f838be5 3e7de04c 3f838be5 -> 3f2ba686 3f999ab0 3ee5d9c5", + "3f000000 3f983143 be373790 3f376d73 be7ca854 be335b7e 3f9cbe2d -> 3ef13870 be354987 3f7874e6", + "3f800000 3f9a0816 3e08d099 3f9a0816 3f800000 00000000 3f800000 -> 3f800000 00000000 3f800000", + "3fc00000 3ef9f255 bdb44603 3f9f351b 3f557003 3f557003 3f770ffe -> 3f80d5b8 3fa5b632 3f5362e2", + "bf000000 3f87d1ba 3f87d1ba 3eb49911 3f400000 3e800000 3f000000 -> 3f9bba97 3fbbba97 3e8ee59a", + "3e800000 3f8bb526 3f639755 3f639755 3f14de4f 3f09f7e7 3f09f7e7 -> 3f76c74d 3f4d2f7a 3f4d2f7a", + "3f400000 be172b50 be172b50 3d2ee106 bd7fa29d 3f7021f1 3f9f0a02 -> bdab72a2 3f2aa6bf 3f714a87", + "40000000 3f7da2d9 3c517f88 3f372e66 3ee8d4aa 3f2f5de9 bdb9e71a -> bda67178 3fadbaea bf65a82c", + "00000000 3f4a162d bdd7f4b0 3f4a162d 3e073e7a 3f832ae8 3e073e7a -> 3f4a162d bdd7f4b0 3f4a162d", + "3f000000 3d807cfd bca9c009 3d807cfd 3f824cb8 3f7a8dbf 3f824cb8 -> 3f0a5488 3ef53fbe 3f0a5488", + "3f800000 3f2dc7e4 3f2dc7e4 bdf4c60b be6ba07b 3ef2e021 3e665c35 -> be6ba07c 3ef2e021 3e665c34", + "3fc00000 3e31ac75 3f7cd321 3e9715c1 3f83c466 bda26358 3f83c466 -> 3fba8bd2 bf1cdc31 3fb2c3e1", + "bf000000 3f62bf98 bc9b8ce4 bc2710ae be52f7fe bd741624 3efb7d41 -> 3fb73f32 3aac2ce0 be859368", + "3e800000 3f5c3540 3f510038 3dc93ad5 bd42e298 3ef02e8d bd42e298 -> 3f221c66 3f3ac5fc 3d7d1f9a", + "3f400000 3f6fb299 3f7237ca 3f7237ca 3dbc2711 bdd753a2 3f49e3f3 -> 3e9b20a0 3e217870 3f53f8e9", + "40000000 3dbbdacd bdbdd3e7 bdbdd3e7 3f8e87d8 3f63e7f8 3d9e202a -> 4008a901 3fefc537 3e7d0a1c", + "00000000 3f91e823 3f91e823 3f02c514 be5fc218 3f480294 3f480294 -> 3f91e823 3f91e823 3f02c514", + "3f000000 3f5cd782 3e2acecd 3ea6025d 3f8402e6 3f8402e6 3e7c9963 -> 3f726ea7 3f195cc0 3e922787", + "3f800000 3f99be6f 3ea4a78b 3f1eae19 be1323d6 be1323d6 3ceaaa52 -> be1323d8 be1323d6 3ceaaa60", + "3fc00000 3efe9016 3efe9016 3ed2b795 3f1d79b5 be29f6ea be29f6ea -> 3f2c928a befec13c bee8d4fb", + "bf000000 3d429c3b 3d429c3b 3efa55e0 3ef08ecf 3ef8cd75 3f02881a -> be279439 be2fd2df 3ef4f8b6", + "3e800000 3e8dbc99 be16d1de 3f8e99bb 00000000 3e800000 3f400000 -> 3e549ae6 bd44759a 3f82f34c", + "3f400000 3f9645b2 3e1a875d 3e94d05e 3f1f16b9 3f960196 3e4204c2 -> 3f4273e4 3f6aaad6 3e5bebc0", + "40000000 3f34e7ed 3e8ccdcb 3f28d637 3f8abfb7 3f8b5f4e 3f5c4a7a -> 3fbb0b78 3ff38b29 3f87df5e", + "00000000 bdd234cf 3f036ae1 be6a089d 3f92636b 3ce2dde7 3f2b882b -> bdd234cf 3f036ae1 be6a089d", + "3f000000 3f0716f0 3f79db53 3b864d9c 3e800000 00000000 3f000000 -> 3ec716f0 3ef9db53 3e810c9b", + "3f800000 3cf82fe3 3cf82fe3 3f260bb8 3f6aea10 3f906d69 3f906d69 -> 3f6aea10 3f906d69 3f906d69", + "3fc00000 3f70d088 3f70d088 be4da267 3f76ae4f bc8de912 3f7cacb0 -> 3f799d32 befe1e64 3fca5bab", + "bf000000 3f8f5957 3dedbc30 3dfc5ecb 3e9ea687 be04b11f 3f34507a -> 3fc33132 3e74a5b4 be2b59dc", + "3e800000 3f1fa31a 3f6e115c 3f6e115c 3f46d2cd 3f46d2cd 3f4ad8ff -> 3f296f07 3f6441b8 3f654345", + "3f400000 3ef2f680 3d12b430 3eac434c 3efbf725 3efbf725 3f0ef649 -> 3ef9b6fc 3ec18efd 3f00c120", + "40000000 3f738fd5 3d1984e0 3f18706c 3f000000 3f800000 00000000 -> 3d4702b0 3ffb33d9 bf18706c", + "00000000 3e8e2f30 be453935 3f2eae83 3f800000 3e800000 3f000000 -> 3e8e2f30 be453935 3f2eae83", + "3f000000 3dac41af 3f703e29 be492c37 3f80a441 3e65f3c1 3f80a441 -> 3f0b685c 3f14dd8c 3ecefd74", + "3f800000 3d861b61 be1d31b0 3ef04eca 3f3633c8 3ed65dbf 3f794660 -> 3f3633c8 3ed65dc0 3f794660", + "3fc00000 39c8312d 3f211c51 39c8312d be6f9b2e 3f12982d 3eac3f08 -> beb3cd69 3f0b561b 3f0122c3", + "bf000000 3f696992 3f1e50d5 3e932955 3f147060 3dd94897 3f1ce11f -> 3f89f316 3f5fe4b6 3dff7382", + "3e800000 be51a985 3f98e6ea 3f81e619 be6faa10 3f737103 be6faa10 -> be5929a8 3f911b50 3f33de84", + "3f400000 be040539 bdac763e bdcca638 3f97afd1 3ec95965 3ebb2048 -> 3f5b4766 3e8c3ba8 3e7f1ba4", + "40000000 3e04044f 3f3eb39c 3f3eb39c be6b6ef7 3ed9ba34 3ed9ba34 -> bf16b88f 3dd834c0 3dd834c0", + "00000000 3f1b7e15 3ddc00a3 3f1b7e15 3d04e825 be791b3d 3f95f0e9 -> 3f1b7e15 3ddc00a3 3f1b7e15", + "3f000000 3f335a79 3f7322e6 3f9ad39f 3edc6706 3f13481b 3f0d5377 -> 3f10c6fe 3f433580 3f617d5a", + "3f800000 3d969915 3d969915 3f5063d3 3f10e18e 3f641349 3f10e18e -> 3f10e18e 3f641349 3f10e18e", + "3fc00000 3f620e5c be5fb9c4 be5fb9c4 3f0c82c0 3f0c82c0 3eed6bbc -> 3ec379e4 3f6ebb59 3f4e0805", + "bf000000 3f8a46e6 3e243aab 3e2873c5 3f423168 3f886431 3f886431 -> 3f9eddff be959c62 be92718e", + "3e800000 3f6afdc9 be2153b5 3e9adf10 bc2d4e8b 3f9bb2f7 3f9bb2f7 -> 3f2f9108 3e3e6727 3f07ed22", + "3f400000 3e756fe9 3f9a37cf 3e5de99f 3efd8bb7 3f2a13cd 3f422b37 -> 3edcd6c6 3f4caac1 3f1f7f03", + "40000000 bd5780c9 bd5780c9 3e1c4138 3f0d56c9 3f0d56c9 3f38d1fa -> 3f9412d0 3f9412d0 3fa549d3", + "00000000 3f012ce1 3f012ce1 3e30a9f2 3ea459f0 3ea459f0 be350a4e -> 3f012ce1 3f012ce1 3e30a9f2", + "3f000000 be5f48c7 3f35276a 3f0b728a 3f8b4c90 3f8b4c90 3f86c85e -> 3edec6ee 3f65e045 3f4c81a3", + "3f800000 be0be993 be0be993 3f5cd298 3f800000 3f000000 00000000 -> 3f7fffff 3f000000 00000000", + "3fc00000 3e8033ad 3f881a3f 3f1ff905 3ea9b8ba 3ea9b8ba 3f87e490 -> 3ebe7b40 bd0cfb40 3fa3d896", + "bf000000 3f82f195 3e7bc5c3 3f20ecee 3f16b681 3edfde50 bdef7cea -> 3f9ebcbf 3e19ca54 3f802d9a", + "3e800000 3eabd833 3efc6e5a 3ee91e8e 3f148e8c 3e586ef2 3e586ef2 -> 3ecb296c 3ed860a2 3ec9e4c9", + "3f400000 3e5ae535 be5492bf 3f8ced27 3f7eb9cd 3f2f4ab9 3f2f4ab9 -> 3f4cb9ad 3eec5dbe 3f49ee9e", + "40000000 3f22b595 be4413a0 3f0321ba 3f406fc7 3f2d3ea6 3f9d5a41 -> 3f5e29f9 3fc5c11a 3ff923a5", + "00000000 3e823a06 3f9472e3 3e823a06 3f400000 3e800000 3f800000 -> 3e823a06 3f9472e3 3e823a06", + "3f000000 3efc7dc4 3efc7dc4 3eaa3f62 3f99a23c 3f99a23c 3f4bd516 -> 3f58c1ad 3f58c1ad 3f107a64", + "3f800000 3f3a1420 3f3a1420 3f575c71 3e018378 bdb44ba2 3f595113 -> 3e018378 bdb44ba0 3f595113", + "3fc00000 3ed3f229 3f490a41 3f490a41 3f000000 3f400000 3f000000 -> 3f0b0376 3f3b7ae0 3eb6f5bf", + "bf000000 3f22ecfa 3f22ecfa 3f6a173b 3f1f115d 3e973a7c 3f4a9559 -> 3f24dac8 3f4e94d8 3f79d82c", + "3e800000 3f9dc3a3 3ebfedc0 3f9dc3a3 be2c3bef 3f9bc824 bd94c8c4 -> 3f61e1b6 3f15dd3a 3f67ff2e", + "3f400000 3d310c2d 3f5c5ba7 3eebe9e0 bd517a67 bd517a67 3f63580b -> bce1b186 3e3514b4 3f47ff44", + "40000000 3f7a4073 3f9129b5 3f6b0b53 3f812e93 bd9765e4 3e05265d -> 3f853cec bfa41671 bf287825", + "00000000 3f73400b 3f9dd188 3f724a79 3e102fc3 3f96f6ab 3f96f6ab -> 3f73400b 3f9dd188 3f724a79", + "3f000000 3f39cb58 3f05cd75 3f39cb58 3e800000 3f000000 00000000 -> 3ef9cb58 3f02e6ba 3eb9cb58", + "3f800000 3f37c8a0 3ed5637a 3f37c8a0 3f1fa5de 3f1fa5de 3c2f8b53 -> 3f1fa5de 3f1fa5de 3c2f8b40", + "3fc00000 3f55749d 3e6503a3 3e6503a3 00000000 00000000 3f000000 -> bed5749e bde503a2 3f235f8b", + "bf000000 3f551890 3f5a93f3 3f93c3a9 be479dd6 3efe1e23 be479dd6 -> 3fac4c4a 3f842b32 3fea1f5b", + "3e800000 3e6529e9 3f6c4b9e 3e6529e9 be211801 bcfc9a4f bcfc9a4f -> 3e03996e 3f2f3f82 3e23fa9c", + "3f400000 3f3e2294 3f30b324 3f30b324 3f552cc2 3f916677 3f916677 -> 3f4f6a36 3f83233e 3f83233e", + "40000000 3f80ad20 3f80ad20 3f940377 3e985fe7 3e985fe7 3b805e79 -> bed1f4b0 bed1f4b0 bf9302bb", + "00000000 3f7a42f3 bddd54f9 3f555a6c 3d27f97e 3f187a7d 3d27f97e -> 3f7a42f3 bddd54f9 3f555a6c", + "3f000000 3f9248bd 3eb25f61 bd4da9f6 3f4c57af 3f7652d9 babec7f2 -> 3f787494 3f27c144 bcd3a036", + "3f800000 3f0dfca7 3e98a3b3 3f0dfca7 3e074432 3ec41b7f 3ec41b7f -> 3e074432 3ec41b7f 3ec41b7f", + "3fc00000 3f902af8 3ddd9d55 bd2fc596 3f9d4076 bcdc43a2 3ec9df66 -> 3fa3cb35 bdc16807 3f1ce5ba", + "bf000000 3f06230c 3eb42312 be1aaffd be0bf356 3f24f686 3f874426 -> 3f5ab2fd 3e527c2a bf414625", + "3e800000 3ee091e2 3ee091e2 3e3ced36 3e800000 3e800000 3e800000 -> 3ec86d6a 3ec86d6a 3e4db1e8", + "3f400000 bdd5575a 3f31f622 3eeb4b82 3f7ecdc1 3f7ecdc1 3dc8fb21 -> 3f386f96 3f6b97d9 3e4103ec", + "40000000 bcd20615 3f89a9c5 3f019f2e 3f3822dd 3f54dec8 3f4af807 -> 3fbb6af6 3f166a06 3f8a2870", + "00000000 3f7447db 3f4808d4 3f4808d4 3f27f05e 3f27f05e 3f25b68c -> 3f7447db 3f4808d4 3f4808d4", + "3f000000 3e643cd4 3f7b9326 3e643cd4 3f907a20 3f80597e 3f80597e -> 3f2d01ba 3f7e2311 3f1ce118", + "3f800000 bd2079a0 bd2079a0 3f8207e1 3f0260e3 3f6a8f85 3f0260e3 -> 3f0260e3 3f6a8f85 3f0260e3", + "3fc00000 3f7a9366 3f7a9366 3f6ccfac 3f400000 3f400000 3f000000 -> 3f22b64d 3f22b64d 3e933054", + "bf000000 bd779f07 3e9a318d 3f7848e3 3f7463d0 bc4ba27b 3e4dd711 -> bf1168d0 3eea78de 3fad5939", + "3e800000 3ec18d9a 3d9dc96d 3d9dc96d 3f5692cd 3f11ca31 3f89150d -> 3efc739a 3e4cf5ba 3ea6aad1", + "3f400000 3f98f11d 3f1d2862 3f7a2247 3ea944b5 3e276438 3e276438 -> 3f0bf252 3e8d59c6 3ebbd6b8", + "40000000 3ef6dd04 3f936506 3e8bf004 3f000000 3e800000 3f800000 -> 3f04917e bf26ca0c 3fdd03ff", + "00000000 3f24c4e9 3f0dd845 3f078820 3c0ae9c7 3e90bbe9 3c0ae9c7 -> 3f24c4e9 3f0dd845 3f078820", + "3f000000 bd16a81e bd16a81e be2555a4 3ede5710 3f969cec 3e5c6262 -> 3e4b820c 3f11e7ab 3cdc32f8", + "3f800000 bd23f9a0 3f2528b7 3f65d870 00000000 3f000000 3e800000 -> 00000000 3f000000 3e800000", + "3fc00000 3eb58105 be67d587 3e81ec28 3f8eb071 3f8eb071 3e4b7989 -> 3fbf5889 3fe48603 3e2f4a26", + "bf000000 be6444eb 3ee9314a 3ec15bc9 be507e13 be507e13 bc6c1e54 -> be6e2857 3f48f4ba 3f12dd14", + "3e800000 3f13fea5 3f85ced0 3dcecf21 3f5dfcff 3f5dfcff 3ec0e615 -> 3f267e3c 3f801abc 3e2e00b7", + "3f400000 3d12af47 3f98556b 3f98556b be18c5a8 3f2030f9 bc021ebf -> bdd2d294 3f444f70 3e9548b4", + "40000000 3f8b3b26 3f8b3b26 3f41e8fe 00000000 3f000000 3f000000 -> bf8b3b26 bdb3b260 3e785c08", + "00000000 be26defe 3f96dbab 3f0d93ee 3fa00000 3fa00000 3fa00000 -> be26defe 3f96dbab 3f0d93ee", + "3f000000 bdadcafa 3f83c3a3 3f8d9974 3ecf523f 3f9dd47b 3e3a002a -> 3e23df81 3f90cc0f 3f24d979", + "3f800000 3dd8246e 3ec6b48f 3f6850ad 3ef7a0ea 3f9f6ded be2d5176 -> 3ef7a0ea 3f9f6ded be2d5174", + "3fc00000 3ef25c1a 3eb4a36e be1d52fc 3d6eb639 3e0d0f8c 3e360d23 -> be18d7c4 3cf79f20 3eafde9a", + "bf000000 3f6b074a 3f67a2d6 3f6b074a 3e4acaea 3e4acaea 3f0de1ff -> 3fa398c9 3fa10d72 3f8cccf8", + "3e800000 3eee2b8c 3efc1b0d 3c9b0d1d 3f8b844c 3f9dd9e1 3f9dd9e1 -> 3f1f127a 3f2d7716 3ea51e7f", + "3f400000 3f8dc033 3ddcd1fc 3ddcd1fc 3f5b669f 3f181bbf 3f812c39 -> 3f6b6d11 3ef1f6be 3f48a8e6", + "40000000 3ecb463d 3f60befd 3f60befd 3e85b541 3d6e17f6 3f81e63e -> 3e00488a bf42fbff 3f936cfe", + "00000000 3e551bad 3f0a1d29 3f465325 3f94e043 3f829d64 3e771a25 -> 3e551bad 3f0a1d29 3f465325", + "3f000000 3f0ceb89 3ef33df5 3e3f3b51 be3d2a5f bcea6028 bdbac0ba -> 3e3b41e2 3e6497f2 3d43b5e8", + "3f800000 3f3bad5c 3db2eb89 3db2eb89 b8ec1687 3d80a50d 3f8ea477 -> b8ec2000 3d80a50d 3f8ea477", + "3fc00000 bdafed5a bdafed5a 3ded3c3c 3d506046 3f71c631 3d506046 -> 3df43ee0 3fbad40f 3c96a858", + "bf000000 3ea059a4 3f36f29d 3f36f29d be77bcc1 3f39bbfb 3ce63d8f -> 3f173ad3 3f358dee 3f87697b", + "3e800000 3f389063 3f4c7f9d 3e8bec2f 3f9baace 3f988d39 bda9a350 -> 3f5841b1 3f65a652 3e3caddc", + "3f400000 3f899076 3ebe6c6b 3def4b04 3f044f0a bdba3c5f 3ee373bc -> 3f280382 3ccafc90 3eb98b7d", + "40000000 be78bc01 3ea35f27 be78bc01 bd5ea137 be42efd9 3e6da97b -> 3e096b65 bf332780 3f3503be", + "00000000 3f1061f2 3f841804 3f841804 be2e9a55 be2e9a55 3f03d2e3 -> 3f1061f2 3f841804 3f841804", + "3f000000 3f688f9f 3ea787cb 3f406937 3ed984ac 3eee0604 3ed984ac -> 3f2aa8fa 3ecac6e8 3f1695c6", + "3f800000 3f8934f2 3f8223b9 be599013 3f057f8a 3f057f8a 3eb1d22c -> 3f057f8a 3f057f8a 3eb1d22c", + "3fc00000 bda75a39 bda75a39 3e3c07d9 3ec8c926 3ec8c926 3d29e393 -> 3f210c80 3f210c80 bcf274a8", + "bf000000 3f4b2ebf 3f4b2ebf be0a9ac0 3f8dd1ea 3f8dd1ea 3f889302 -> 3f22f434 3f22f434 bf3c8d0a", + "3e800000 3f36b6a6 3f818422 3e30ba98 3dc2571c 3dc2571c 3f333751 -> 3f0f1bb6 3f4858ec 3e9be1a2", + "3f400000 3e89464e 3f6d33e1 3dfb5e53 3f400000 3f400000 3e800000 -> 3f2128ca 3f4b4cf8 3e5f6bca", + "40000000 3e79b6bc 3d27a919 3d27a919 3f3ba5bb 3ed1be17 3f3ba5bb -> 3f9c6ee4 3f474386 3fb66872", + "00000000 be05f254 3f6904f9 be67f2e1 3ede43bb 3d95f2a1 3f0f4996 -> be05f254 3f6904f9 be67f2e1", + "3f000000 3e1916ed 3ee4d6f6 3ee4d6f6 3f9ad7ef 3f3cdc3b 3eb00696 -> 3f2dfacc 3f17a3db 3eca6ec6", + "3f800000 3f5b5f4a 3ee5f1e9 3ee5f1e9 3e809b17 3ea9a231 3ea9a231 -> 3e809b18 3ea9a231 3ea9a231", + "3fc00000 3f89c34b 3e394bc5 3f89c34b 3d0c81bd be726021 bd8d1041 -> bef92e44 bee41b0a bf243656", + "bf000000 3cc4d228 bcbcf944 3e2110a2 3f8d71e2 3ed1c03b 3e79fa95 -> bf043808 be752ef8 3de93751", + "3e800000 3f7dbf4f 3f92202f 3eab88a0 3ece6381 3e25b6ca 3f475d8a -> 3f581bec 3f658bb3 3ee4553d", + "3f400000 3f3aa90e be028576 3f621574 3f80d432 3f9ecf77 3ee0b1da -> 3f6fe88e 3f660eda 3f0cc80f", + "40000000 3ef69880 be1efabc 3f6ee88a 3f800000 3f800000 3f400000 -> 3fc259e0 4009efac 3f111776", + "00000000 3d7e9b5e 3b311456 bdc11c4d 00000000 00000000 3f400000 -> 3d7e9b5e 3b311456 bdc11c4d", + "3f000000 3f80c8f8 3e95e1d8 3f677fba 3ed3cb42 3f4521d3 3e5cf8af -> 3f35bbc8 3f080960 3f0f5ef3", + "3f800000 3f0a9f13 3e87bbc7 3f0a9f13 3f29cec5 3e9a7cb9 3e9a7cb9 -> 3f29cec5 3e9a7cb9 3e9a7cb9", + "3fc00000 3f30cc00 3e77cc9e 3f12874d 3f188af8 3f80789f 3c696fa1 -> 3f0c6a74 3fb13824 be879610", + "bf000000 3eff70a2 3f847857 3eff70a2 3dfcf4cf 3f86c570 3dfcf4cf -> 3f2fc52c 3f8351ca 3f2fc52c", + "3e800000 3f804501 bdc1138a 3f019781 3ee4ba69 3f2002fe 3f131bde -> 3f5cfece 3daf3754 3f05f898", + "3f400000 3f468a2f 3f468a2f 3f096a40 3f400000 3f000000 3f400000 -> 3f41a28c 3f11a28c 3f325a90", + "40000000 3f4ec7d9 3f8f4f67 3f8f4f67 be7a9de8 be7454bf 3f37aae3 -> bfa60b68 bfcc6497 3ea16df0", + "00000000 bc085e2d 3e62322c bc085e2d 3f129aa4 3f7c2373 3ed88091 -> bc085e2d 3e62322c bc085e2d", + "3f000000 3f8f2742 3f9de230 3f9de230 3f421a80 bdeef983 bdeef983 -> 3f703482 3f0ef298 3f0ef298", + "3f800000 3f92d15f ba8c6118 3f92d15f 3f31053e 3f31053e 3e8be6d7 -> 3f31053e 3f31053e 3e8be6d8", + "3fc00000 bdc45725 3f9be386 3f5088d8 3f000000 3f400000 3f800000 -> 3f4c4573 3f041c7a 3f8bddca", + "bf000000 bdee04b1 be1bfcec be1bfcec 3f5a4481 3f815ae3 3f5a4481 -> bf19c322 bf3bd9bb bf27a119", + "3e800000 be1bc51a 3ed194aa 3f6b255e 3ebbde0f 3e0fdf31 3e0fdf31 -> bcb72660 3eaf2b66 3f3959fa", + "3f400000 3f879fb3 be2ba72f 3f879fb3 3f860295 3f41cb3c 3f873dc1 -> 3f8669dc 3f069dfa 3f87563e", + "40000000 3f6d4fba 3d792e9c 3d792e9c bc591eef 3eb626b9 3eb626b9 -> bf7418b2 3f2693d0 3f2693d0", + "00000000 3f968a33 3f35fec7 3f35fec7 3f98feab 3f2fa5b2 3f243745 -> 3f968a33 3f35fec7 3f35fec7", + "3f000000 3f8ebbca 3e2f1805 3e2f1805 3f8bf285 3ed9e9d2 3ec73324 -> 3f8d5728 3e98baea 3e8f5f93", + "3f800000 be794d45 3f5d9686 3f0e012b 3ddbfe3e 3e0ccff7 3e0ccff7 -> 3ddbfe3e 3e0ccff8 3e0ccff8", + "3fc00000 3f550859 3f550859 3f8bb823 3ebd83a1 3ebd83a1 3e709358 -> 3e0e7a30 3e0e7a30 be460388", + "bf000000 3f91a70d be5b514c 3f3691da 3ee53065 3e278a0d 3ef2ed25 -> 3fbdd487 bece5f7c 3f551f7e", + "3e800000 3f0e832a 3e1b93f8 3f0e832a 3f84b4e6 bd0b6149 bd0b6149 -> 3f2d3cd2 3dd7f1cb 3ed169b4", + "3f400000 3f61ca58 bceeef9a bceeef9a 3e800000 3f400000 3e800000 -> 3ed0e52c 3f0e2221 3e388884", + "40000000 3f46c1c7 3edcd387 3f553858 3c341ecf 3f8dfb17 3f61765d -> bf4120d1 3fe4c14c 3f6db462", + "00000000 3f1cbe1d 3f1cbe1d 3eccb0d1 3f8f5265 bdbddd9d 3ee7c832 -> 3f1cbe1d 3f1cbe1d 3eccb0d1", + "3f000000 3e561bc0 3e694f90 3edacdfc 3f18ff63 be2fb215 3f5d72c1 -> 3ece8653 3ce675f0 3f256ce0", + "3f800000 3efee055 be460dd5 3ebd84ba 3f93f2f8 3f9d74db 3eec303f -> 3f93f2f8 3f9d74db 3eec303f", + "3fc00000 3ea09241 3d268c60 3f67c80f 3edf441a 3c3cbf2c 3f43fb54 -> 3efe9d06 bb47e800 3f3214f6", + "bf000000 3cc29f5c 3ef36820 3f8fdeb2 3f5098de be605857 3eb603ea -> bebe59ed 3f529923 3fc10d8e", + "3e800000 3ef0b747 3ef0b747 3f1b4ba7 3f400000 3f800000 3e800000 -> 3f0a44bb 3f1a44ba 3f0478bd", + "3f400000 3f022b6e 3f933d0b 3f933d0b 3ea5f6c4 3f4aaa69 3e71c8a9 -> 3ebd8eca 3f619e54 3eede84a", + "40000000 3d8667ec 3ef108c0 3d8667ec 3ea379f9 be199f80 3ea379f9 -> 3f12acfc bf455420 3f12acfc", + "00000000 3f66fbb3 3ebf61b5 3eebff04 3f03aa3c 3f1465f1 3f03aa3c -> 3f66fbb3 3ebf61b5 3eebff04", + "3f000000 3e2ba26f 3edd0845 3f025ff6 3eace1e6 3ea1134a 3f777951 -> 3e81598f 3ebf0dc8 3f3ceca4", + "3f800000 3f769d25 3f3b23b0 3f070931 3e877a6b be73f866 3e815287 -> 3e877a6a be73f868 3e815287", + "3fc00000 3f015ad9 3f015ad9 3e7d271b 3f988cc9 3f988cc9 be6bf336 -> 3fc47c78 3fc47c78 bef0402e", + "bf000000 bcddc728 3ede63ab 3ede63ab 3cd9a93c 3f07b1f4 3eda0461 -> bd5cbfad 3ec5e38c 3ee09350", + "3e800000 3f82053c 3f31c18f 3ee3efda 3e9b2695 3f26d665 3f62a609 -> 3f566cac 3f2f06c4 3f0e2374", + "3f400000 3f146f94 3e43a290 3ea31768 3ea37bbc be66b2db 3f230885 -> 3ec4d497 bdf83b00 3f0ea951", + "40000000 3e9f92bb 3e9f92bb bdf5b382 00000000 3f400000 3e800000 -> be9f92bb 3f981b51 3f1eb670", + "00000000 3f576488 3ed9c71c 3ed9c71c 3d97cc2f 3f8fd1cb 3f8fd1cb -> 3f576488 3ed9c71c 3ed9c71c", + "3f000000 3ee62d1f 3f88c5e1 3f88c5e1 3e931731 3f9ac679 3f2e103e -> 3ebca228 3f91c62d 3f5fce00", + "3f800000 3f75ea05 3f75ea05 3f660d4e bd90397f 3f118c02 bddb82e2 -> bd903978 3f118c02 bddb82e0", + "3fc00000 3f3e0d8b 3f1dc304 3f291c23 3f59fa94 3d788bfb bdc42cc4 -> 3f67f118 be5e5188 bef2acee", + "bf000000 3f8ebcb9 3f4c42d6 3f8ebcb9 3f018fda bd8323a6 3f26a05e -> 3fb5b71f 3f9d4b3e 3fac72fe", + "3e800000 bd4f69ab 3f62e3c6 bd4f69ab 3f362e07 3f57d0b0 3f953c51 -> 3e0f4a37 3f601f00 3e81ca69", + "3f400000 3f2a565a 3ddd0d70 3f43c8fa 3eb15762 bcf4f471 3eb15762 -> 3eda2cb6 3b955870 3ee6e606", + "40000000 3f23c21e 3f9c2d00 be2e60d1 3e41139f 3e8080db 3e41139f -> be86709c bf37d924 3f0c2204", + "00000000 3e3da7ec 3f2fa08a 3f2fa08a bc7f1a8d 3f55523c bc7f1a8d -> 3e3da7ec 3f2fa08a 3f2fa08a", + "3f000000 3ed94d2d be5edada 3f8a176a 3f5fbfd4 3f5fbfd4 be5bde29 -> 3f263335 3ea8091d 3edd374a", + "3f800000 3e0dc01b be5528c1 3f094d7e bda69f9e 3f247290 3f65eb45 -> bda69f9e 3f247290 3f65eb45", + "3fc00000 3e86612a 3f4ff142 3f912cc7 3ef91bbd 3e086d42 3eace813 -> 3f193c83 be533ea8 bd77eb80", + "bf000000 3f974fe8 3de3645f 3de3645f 3e214ba2 3eeb7944 3eeb7944 -> 3fd8e322 bd81dbf9 bd81dbf9", + "3e800000 3f5c824e bde48a4d 3f918602 3e83a683 3f755088 3f535087 -> 3f35d68b 3e1f9cac 3f878e92", + "3f400000 3b11a4e5 bd75d458 3f70c577 3f99344b 3f8d6c89 3f99344b -> 3f65f2db 3f504b7c 3f90ffe7", + "40000000 3f2874ef 3edfc635 3edfc635 be753399 be753399 3f92c914 -> bf91875e bf6a7ce8 3feda09b", + "00000000 bdd7555a 3e54c3a6 3e54c3a6 3e03ec4f 3d6e76ba 3e7ae4fe -> bdd7555a 3e54c3a6 3e54c3a6", + "3f000000 bdc43ad4 3f2284d8 3f2284d8 3d8d4e30 3d8d4e30 3eb3f791 -> bc5bb290 3eb42e9e 3efc80a0", + "3f800000 3e1e3c2b bcd7614d 3e39541e 3f6c689e 3d0f03e3 3e94be54 -> 3f6c689e 3d0f03e4 3e94be54", + "3fc00000 3f27da68 3d1533a2 3d788b56 3f8cbba0 3f8cbba0 be519a25 -> 3fa922d6 3fd0c4a1 beacbc51", + "bf000000 3f2a51a3 be0b4585 be0b4585 be7d33f3 3f79ac2d 3f78dc58 -> 3f8f907a bf311028 bf30a83e", + "3e800000 be45f13d 3f9e040b 3f7e1ae9 be254502 3f349a70 3f8bac89 -> be3dc62e 3f8d1656 3f82353a", + "3f400000 3e16cb88 be6fb394 be5b9e0b 3f290301 3f774fa8 3f74cc49 -> 3f082ef9 3f2a8084 3f29df56", + "40000000 3e8767b7 3eec7471 bc9ecfa7 3f895a9f 3f90e551 3f881adb -> 3ff0db50 3fe6ad86 4009587b", + "00000000 3f567abb 3e2905e6 3f64ca4c 3f000000 3f800000 3f400000 -> 3f567abb 3e2905e6 3f64ca4c", + "3f000000 3f790fdf bdb6ab5a 3f242fd5 3df5b17e 3d5f0bac bd975b2a -> 3f0be308 bc8e4b08 3e914470", + "3f800000 3ec61de3 3f856e73 3ea3c3b6 3f3b3b0b 3f46a946 3f3b3b0b -> 3f3b3b0b 3f46a946 3f3b3b0b", + "3fc00000 3f8d2382 3f9ff8e9 3f9ff8e9 3f95589a 3f5b702f 3f90d2e1 -> 3f997326 3f292f5e 3f893fdd", + "bf000000 3f34768c 3f80c072 bd8c00d1 3f35805b 3f8cfebb 3f7737cd -> 3f33f1a4 3f75429b bf15dc0e", + "3e800000 3f8887b6 3f8887b6 3f92cf95 00000000 3f400000 3f000000 -> 3f4ccb91 3f7ccb91 3f7c3760", + "3f400000 3f8ebab9 3f32daff 3ed11451 3f29ddaa 3e22e004 3f33610e -> 3f46c39c 3e968181 3f20ab54", + "40000000 3ef63013 3f7bf501 3f7986f5 3f25c044 be4512e3 be42cc6e -> 3f50687e bfaf3f3a bfad7696", + "00000000 3f7ad7ba 3eddd16b 3eddd16b 3f644fb7 3f4ed6b7 3f644fb7 -> 3f7ad7ba 3eddd16b 3eddd16b", + "3f000000 3f81479b 3f81479b 3f1c216a 3f0b9986 3f31a2a4 3f0b7f64 -> 3f47145e 3f5a18ed 3f13d067", + "3f800000 3f8a6073 3e7b5a53 3f1fb30f bdb71ee7 3f96a62d 3f96a62d -> bdb71ee0 3f96a62d 3f96a62d", + "3fc00000 3e99ca75 3f974be0 3e80f69e 3f8eeaa9 3e162eb9 3f8eeaa9 -> 3fc326af bebdf4b8 3fc6412a", + "bf000000 be2f6970 3ed697f9 3ecf43c2 3f87c3cf bc4bbb0b bcba59f6 -> bf498b59 3f228971 3f1e5c39", + "3e800000 3bcfc394 3ed1a0b5 3dcad975 3f9cf974 bd8581d7 bd8581d7 -> 3e9f68be 3e94e06a 3d6d8544", + "3f400000 be434f80 be434f80 3e8793be 3e49204a bd27fe89 bd27fe89 -> 3dcc08b0 bda0a733 3d112898", + "40000000 3f4efbae 3f0067ba 3f4efbae 3f1682ae 3f9edf0d 3eaf0172 -> 3ebc135c 3ffd8a3d bdffd1e0", + "00000000 3f1ad860 3f1ad860 bdb27197 3f7fbdb7 3f7fbdb7 3eacdb3c -> 3f1ad860 3f1ad860 bdb27197", + "3f000000 bc9898ac 3f124034 3d38e2b7 be6dba3e 3f2825c9 3e3edaf4 -> be0066aa 3f1d32fe 3ded13a2", + "3f800000 3f9ce590 3e71b1fd 3e71b1fd 3f3a46ac 3df67dde 3f047d75 -> 3f3a46ac 3df67dde 3f047d75", + "3fc00000 3f899c14 3f899c14 3f8c0dd7 3f3ec918 3f9f8fcb 3f9f8fcb -> 3f149190 3faa89a6 3fa950c5", + "bf000000 bdb7da48 3ec5fb62 bcc80fcd 3f6f0e0a be7783dc 3f6f0e0a -> bf19fff3 3f336d05 bf00e7c2", + "3e800000 3f7a3fe8 3f7a3fe8 be26ffcb 3f60c6ed 3f844e51 be6a70d9 -> 3f73e1a9 3f7dd716 be37dc0e", + "3f400000 3f7a9a7e 3f7a9a7e 3f888199 00000000 3e800000 3f000000 -> 3e7a9a80 3edd4d40 3f2440cc", + "40000000 3f3c5981 3f2728d6 3f7cb8f4 3f08901d 3f08901d 3f7c6f4c -> 3ea98d72 3ed3eec8 3f7c25a4", + "00000000 3dabf87c 3f8f4b27 3f8f4b27 be4f1ba7 bd6fe638 bd6fe638 -> 3dabf87c 3f8f4b27 3f8f4b27", + "3f000000 3f0fae2f 3f932578 bc103a28 3f8a4034 3f1688a0 3f693741 -> 3f52174c 3f5e69c8 3ee6f659", + "3f800000 3f62365d 3f3ddeb8 3f9e01d8 3f9d2b83 3ed631fd 3f8f7c5c -> 3f9d2b83 3ed631fd 3f8f7c5c", + "3fc00000 be455944 3f946def 3f5a1a59 3eb0f642 3f29b79b 3f9e564d -> 3f1d63da 3ed44af4 3fb6fade", + "bf000000 3f8cf095 3e9395c7 3f8cf095 3f19b645 3f19b645 3ed4855f -> 3facfb4e 3e0754cb 3fb8d834", + "3e800000 3f94d3e8 3f94d3e8 3f13d759 3f826361 3f1b381e 3f1b381e -> 3f9037c6 3f8305f2 3f15af8a", + "3f400000 bd968266 3f4a95fc 3f4a95fc 3f7fc762 bdf22242 3f9b0d81 -> 3f3b2175 3ddf9248 3f8d9ce0", + "40000000 3f893d96 3f893d96 be2e9b29 3f040dda 3f040dda 3e8e71b7 -> bd25f780 bd25f780 3f3a1882", + "00000000 3f9668f6 3f9e9576 3ea94a16 3f86cb77 bd15a863 3f51ac9f -> 3f9668f6 3f9e9576 3ea94a16", + "3f000000 3e79a79a be5a9973 3f053799 3f166def 3f166def 3f848192 -> 3ed4d7d6 3e3f8f25 3f471d5e", + "3f800000 3dbd18fb 3df4b4c3 3df4b4c3 be5b510f 3f5d0b51 3ece564e -> be5b510e 3f5d0b51 3ece564e", + "3fc00000 3efd6eaf 3f0d1aa6 3efd6eaf 3e916987 3f4c8060 3f9e31a9 -> 3e36cde6 3f6c333d 3fcd9ca8", + "bf000000 3f16fb70 be2909de 3f06d227 3d8da698 3b97b8a2 3f1446f0 -> 3f599ebe be7fedb0 3f0017c2", + "3e800000 3f71d1fb 3f8df2ae 3e208b03 be3cce27 3f8bd9da be3cce27 -> 3f29909a 3f8d6c79 3d926971", + "3f400000 3f873daa 3e511314 3c686bd8 bb332698 3f9fbaa7 3e3853b9 -> 3e8630f0 3f7ca92b 3e0de07a", + "40000000 3f94ba80 3ef6aee2 3f2dec41 3de929ca 3de929ca 3f2b93f8 -> bf6f2a8c be8219fe 3f293baf", + "00000000 3e09e0e2 3f2bfcf9 3f2bfcf9 3f6fc648 be503506 3f995509 -> 3e09e0e2 3f2bfcf9 3f2bfcf9", + "3f000000 3e7d407d 3f8c9fcb 3e7d407d 3e3e1b45 3e3471ff 3f088e40 -> 3e5dade1 3f232e0b 3ec7de60", + "3f800000 3ed7eb75 3ed7eb75 3e8ea954 bc3e9e09 3e646277 3ebfd9a6 -> bc3e9e00 3e646277 3ebfd9a6", + "3fc00000 3df19230 3f971779 3f9dec45 3f224c8d 3f1075d0 3f1075d0 -> 3f6459b0 3e83327e 3e6b11c8", + "bf000000 3ed65e90 3f51c6c4 3f51c6c4 3f554417 3f6bcbab 3cd49834 -> 3e589382 3f44c450 3f9babe2", + "3e800000 3ec67f29 3ce96a44 3b51621a 3f9d55ad 3f9b520f 3f047cf5 -> 3f191a86 3ea6430a 3e06f11b", + "3f400000 3eca0927 3e92a3ad 3e92a3ad 3f69c3a9 3eff7acf 3eff7acf -> 3f4893e4 3ee44506 3ee44506", + "40000000 3f16dc18 3ce4a772 be6902f4 3f5b000e bdab18b6 bdab18b6 -> 3f8f9202 be47ada4 3d77a8f8", + "00000000 3d080c8e 3d080c8e 3e1183f3 3f77427e 3bff5f7f 3bff5f7f -> 3d080c8e 3d080c8e 3e1183f3", + "3f000000 3f3ab517 3f85fb9a 3f373b1b 3f6748b7 3f7e248a 3f7e248a -> 3f50fee7 3f8286f0 3f5aafd2", + "3f800000 3f400278 3f8bd67e 3f400278 3f657734 3f90355f 3d51da5f -> 3f657734 3f90355f 3d51da60", + "3fc00000 3e24ea69 3e5d1bea 3f17b67d 3f39139b 3f39139b 3dee704c -> 3f80800e 3f79f9ea bdf93180", + "bf000000 3e512fd0 3f8d6ed7 3f803abd 3f76966d 3f86233b 3e8ea57f -> be336522 3f9114a5 3fae836c", + "3e800000 3f210c57 3e899462 3e30e855 3f111884 3f1bccd9 be4c6bc2 -> 3f1d0f62 3eb515b6 3da3269e", + "3f400000 3ed90fde 3ed90fde 3e6664c6 3f0ef0b9 3f886965 3f886965 -> 3f065686 3f67c013 3f5b0464", + "40000000 bdab7f23 3e1e6f4e be6f0945 3f9fc5ae 3f9fc5ae bd2b19e7 -> 402521a7 4015deb9 3e197c51", + "00000000 3e18e50d 3ef33d4d 3ef33d4d 3e91ed78 3f503dae 3f725a29 -> 3e18e50d 3ef33d4d 3ef33d4d", + "3f000000 3f936642 3f81c3ff be6e287f 3f1a61a2 bdfe809d 3f1a61a2 -> 3f609713 3ee3b7ea 3e3daf05", + "3f800000 3edc1b00 3ec2be72 3ec2be72 00000000 3f800000 3f400000 -> 00000000 3f800000 3f400000", + "3fc00000 3f4216e8 3f970054 3eed26a2 3edc8865 3edc8865 3d64858e -> 3e88b5b0 3d665f80 be17748c", + "bf000000 3f9e9b06 bd029b81 3f4678bc be4fe292 3f7b6ce6 be0611b7 -> 3ffae6b2 bf09f507 3f9d3ba8", + "3e800000 3f03d1d9 3f03d1d9 3f9b78d8 3f800000 3f800000 3e800000 -> 3f22dd63 3f22dd63 3f793544", + "3f400000 3f8f5b00 3ed3ea09 be4135c8 bbbe1724 bbbe1724 3f377e4e -> 3e8d20bc 3dcb00f4 3efb16bc", + "40000000 3f83be78 3e7e82c1 3e7e82c1 3f45e7b6 bd934a91 3f94d144 -> 3f04527c bec8e6aa 4004e918", + "00000000 3ec2eda9 3f102f58 bdf828a5 3f4d2dd2 3f563e60 3f4d2dd2 -> 3ec2eda9 3f102f58 bdf828a5", + "3f000000 3e737afa 3f94063a 3e737afa be327641 3f3a233f be1a953b -> 3d020970 3f7117da 3d31cb80", + "3f800000 3f5651b2 bdf36e9e 3f5651b2 3f4c9b64 3e37be3f 3e37be3f -> 3f4c9b64 3e37be3f 3e37be40", + "3fc00000 3ea095c5 be55b249 3ea095c5 3e859de9 3f97c458 3f97c458 -> 3e7043f6 3ff101a9 3fcf93cb", + "bf000000 be1263b0 be265dfd be1263b0 3f980dcc 3ef96e08 3ef96e08 -> bf4ef32e bef97d82 beea81c8", + "3e800000 3f9256fb 3f9256fb 3f02af2f 3f0df473 3f7fbba0 3f71f456 -> 3f7eff95 3f8db8b0 3f1e8079", + "3f400000 3f9aec38 3f647e53 3ef67633 3f900e42 3efb1802 3efb1802 -> 3f92c5c0 3f174896 3ef9ef8e", + "40000000 be5eb11a 3f799fd7 3f8357c2 bd1be72a 3f45306a 3eabe319 -> 3e10bd86 3f10c0fd beb598d8", + "00000000 3beb7c3e 3f4612eb 3dc2b6b6 be49914d 3e8a0f35 3f915ac6 -> 3beb7c3e 3f4612eb 3dc2b6b6", + "3f000000 3efe5710 be760594 be760594 3f564d40 3f564d40 3f6cae67 -> 3f2abc64 3e98cbda 3eaf2d02", + "3f800000 3f0c3694 be186b49 3e238050 be317df1 3f37b345 be317df1 -> be317df0 3f37b345 be317df0", + "3fc00000 3f96569b 3eb2724b 3f83cdd1 3e443146 be724bba 3e443146 -> be998840 bf0778f8 be68ed58", + "bf000000 be528c69 3e34195d 3f5e8109 bd4e254c be0776c4 3f8f6ddb -> be9106fa 3ea8f0b6 3f3e53b2", + "3e800000 be4c0fee 3bf00a1f 3f588d10 3f394205 3f394205 3f8440c8 -> 3d00d848 3e3ee242 3f648a30", + "3f400000 3f4e33ea 3f4e33ea 3f865c9b 3f8d1f31 3f8d1f31 3eb3e5a2 -> 3f839de2 3f839de2 3f06a46a", + "40000000 3f3cf3b1 3f3cf3b1 bd715c63 3e5708d3 be65fa66 be65fa66 -> bea2de8e bf97f872 bec7ced9", + "00000000 3f95a281 3df9208b 3f8ae859 3ea8a8c2 3e6bd687 3f953ad6 -> 3f95a281 3df9208b 3f8ae859", + "3f000000 3ee52f9e 3f683d87 3ec27ee0 3ef6cdb4 3ef6cdb4 3ef8737d -> 3eedfea9 3f31d230 3edd792e", + "3f800000 3efc37e3 be7de7b7 3f49cf6a 3f161b12 3df20b43 3f2760d2 -> 3f161b12 3df20b42 3f2760d2", + "3fc00000 3f0df499 3f4c8119 3f33126d 3ee90cbf 3f9303ec 3f57c4a0 -> 3ecf9e86 3fa9659c 3f6a1dba", + "bf000000 3f6f852a 3f1e99ff 3f1e99ff 3e90cb99 3f14b5fa 3f14b5fa -> 3fa18a6c 3f238c02 3f238c02", + "3e800000 3f0c45c1 bd8742c8 3f0c45c1 3f0b48a4 3ef88d8a 3f0b48a4 -> 3f0c067a 3d931b74 3f0c067a", + "3f400000 3f2f1cb2 3d53b609 3f2f1cb2 3f3b9bad 3f3b9bad 3f8d9aff -> 3f387bee 3f10039a 3f8017d6", + "40000000 3f8e9031 3efac9b4 3efac9b4 3f424fb6 3f2c831d 3ea5c0c9 -> 3ecefe14 3f5ba160 3e216fbc", + "00000000 3ea88d61 3f04d022 3f04d022 3f666666 3f666666 3f666666 -> 3ea88d61 3f04d022 3f04d022", + "3f000000 3f9b305f 3e31d8ef 3f8a9036 3f6e9ff7 be770ef6 3e9a52e7 -> 3f89402d bd0a6c0c 3f3124f0", + "3f800000 3f29c74f 3f82edf7 3f914af1 3dfb5d67 3f5950fc be518d16 -> 3dfb5d68 3f5950fc be518d18", + "3fc00000 3f507cd6 3f47db02 3f47db02 3d0a8d1f 3f859aef 3f5b730d -> beb68260 3f9671a6 3f653f12", + "bf000000 3f49ec39 3f2ab507 3f49ec39 3f07c188 3f07c188 3f180d3d -> 3f6b0192 3f3c2ec6 3f62dbb7", + "3e800000 3aefdc26 3f7f6dda 3aefdc26 3e12b3eb 3f05c248 3f05c248 -> 3d185314 3f6102f6 3e072a12", + "3f400000 3f4df5df 3f570e67 3f8b0ab3 3e800000 3f800000 00000000 -> 3ec6faf0 3f75c39a 3e8b0ab4", + "40000000 be53181c 3f131b49 3f9bdc95 3f854512 3e9ea5f3 3f854512 -> 40127694 3d38aaa0 3f5d5b1e", + "00000000 3f1c562c 3f16f8a7 3f1c562c be5696b1 be5696b1 3f96c426 -> 3f1c562c 3f16f8a7 3f1c562c", + "3f000000 3f0a80d0 be710483 be710483 3f147435 3f9a9aab 3f9a9aab -> 3f0f7a82 3ef8f434 3ef8f434", + "3f800000 3ecb3126 3e812b99 bda5e010 3f2c762e 3f2660ac 3f1062de -> 3f2c762e 3f2660ac 3f1062de", + "3fc00000 3f8c728e 3f068b5e 3ebcbf78 3e76460c 3ea69349 3efc9415 -> be406128 3e66a320 3f0e3f32", + "bf000000 3f0210e3 3f0210e3 bc51efad be5c0564 be5c0564 3f6b19af -> 3f5e9a01 3f5e9a01 bef4f0eb", + "3e800000 3f384e44 3f70a459 3f384e44 3f6ac2ef bdab93b0 3f625232 -> 3f44eb6f 3f2f1ea5 3f42cf40", + "3f400000 3f340a3c 3f6ac1c0 3f8c256f bd6ea0f7 3f58ca32 3e36ee7e -> 3e074c10 3f5d4816 3ed0bee0", + "40000000 3cce4de0 3b0e8593 3f0cb919 3f879dc6 3f2e1118 3f7e98c3 -> 4006012a 3fadc9d5 3fb83c36", + "00000000 3f042b5f 3f042b5f 3e43f958 3ecd6e6e 3f50e1a9 3e8ccf85 -> 3f042b5f 3f042b5f 3e43f958", + "3f000000 3e420c91 3e420c91 bd1ddf71 bd7b284a 3f41d7f2 3f41d7f2 -> 3d83427e 3ef25b16 3eb7f9fb", + "3f800000 3e8f1a14 3e8f1a14 3f7bb6fa be6e9b0e be6e9b0e 3f31dc8d -> be6e9b10 be6e9b10 3f31dc8d", + "3fc00000 3f3b4365 3f5cc9dc 3f83cd2e bd80a25c 3f84c1af be1d75df -> beeb8046 3f8ff010 bf3ed962", + "bf000000 3e42b4f1 3f833bc6 3f88a443 3f320f57 3f320f57 3f985e20 -> bd801e8a 3f9855d3 3f80c754", + "3e800000 bdf3c81d bdf3c81d 3e67719f 3f53017d 3f850d63 3e2a1f04 -> 3def2ce5 3e2eafbc 3e581cf8", + "3f400000 3f91714c 3f1c014b 3f91714c 3aeb90a3 be45868c 3f212e77 -> 3e9221f8 3bfb8c80 3f419b7f", + "40000000 3f89fdeb 3f9a3c87 3f89fdeb 3e8fb943 3f13a265 3e8fb943 -> bf044292 bd534440 bf044292", + "00000000 3f76f2c7 3f76f2c7 3f7380a5 3ed07854 3ed07854 3f86b304 -> 3f76f2c7 3f76f2c7 3f7380a5", + "3f000000 3e410d42 3f168416 3f27c3a7 3f2d5051 3f6d4e1c 3f2d5051 -> 3edd93a2 3f41e919 3f2a89fc", + "3f800000 be021d08 3f7a9ee8 3f7a9ee8 3f77e282 3f77e282 3e0c28d6 -> 3f77e282 3f77e282 3e0c28d8", + "3fc00000 3da4f3ad 3f6108ee 3f6108ee 3e468fc7 3e468fc7 3dfc37e8 -> 3e804d60 be183a30 be8273f8", + "bf000000 3f13b7ea 3f13b7ea 3d9fc228 3f9f139f 3e0d8d01 3f9f139f -> 3e7a0100 3f4be23f bf011f37", + "3e800000 3f6379e0 3f047efc 3db91d22 3f559f1d 3f239e3f 3ec3622d -> 3f60032f 3f0c46cd 3e271c03", + "3f400000 bc5cce42 3f074869 3f074869 3f465aee 3f3cc11c 3f3cc11c -> 3f13e764 3f2f62ef 3f2f62ef", + "40000000 3f9203ca 3d030c21 3d030c21 3f8a40da 3f332c0c 3eafebe1 -> 3f827dea 3faf13ab 3f27bb1f", + "00000000 3ee8bff4 3f653947 3f653947 3eff01b5 3f71f182 3f4d3c5c -> 3ee8bff4 3f653947 3f653947", + "3f000000 3f966a6d 3f85b103 3f85b103 3f1ad71c 3e848879 3e4a487d -> 3f63d5fb 3f26d321 3f1efa12", + "3f800000 3dec4dd3 3dec4dd3 3eead13f 3f400000 00000000 3f400000 -> 3f400000 00000000 3f400000", + "3fc00000 3f803b2b bcdc56c9 3e032cc4 3f86fef4 3f2ba900 be20e917 -> 3f8a60d8 3f82776d be997a03", + "bf000000 3f84e02d 3f07c3d9 3e34b2f8 3f3f6428 3f3f6428 3c7fd059 -> 3f97773a 3ed7e763 3e8386f8", + "3e800000 bd8159b8 bd8159b8 3f2bdb69 be1a3cd6 3f96f9f6 3f8e2d1f -> bdae21b5 3e7d7248 3f47fb1e", + "3f400000 3f17f3af 3e702044 3f98f287 3f400000 3f000000 3f800000 -> 3f35fcec 3ede0408 3f863ca2", + "40000000 3f7dc904 3f7dc904 3e8b5052 3d1f040f 3f56be60 3e0d66ad -> bf69e882 3f2fb3bc 3b8596c0", + "00000000 3e5c3d66 3e98cfc8 3e98cfc8 bcac21b8 3f8e6530 3f187805 -> 3e5c3d66 3e98cfc8 3e98cfc8", + "3f000000 3f5406f4 3ecb225f 3de6ae8b 3d030c74 3f58ee91 3ef85bf8 -> 3edc37bb 3f1f3fe0 3e9903cd", + "3f800000 be7ed853 3f17cea0 3f59ba14 3f1d1c44 3f1d1c44 3f35686a -> 3f1d1c44 3f1d1c44 3f35686a", + "3fc00000 3f8d8a77 3f01ae3e 3cfa37aa 3e525628 3f6b01e6 3e76cfc2 -> be7aa8a0 3f8fd5dd 3eb14a15", + "bf000000 3ed4396e 3f4a0c8a 3ed4396e 3eca2671 bd23cc5b bd23cc5b -> 3ed942ec 3f9a1899 3f244975", + "3e800000 3f16816b 3f8c20c1 3f16816b 3e800000 3f400000 3f400000 -> 3f00e110 3f811891 3f20e110", + "3f400000 3f8aaf46 3f1576cb 3f8aaf46 3f3eec05 3f3eec05 bd1f0014 -> 3f5488a7 3f348eb6 3e778e88", + "40000000 3f8a4287 3f8a4287 3f247a48 bce9fc43 3f07ead2 3f39177e -> bf919269 bc95ed40 3f4db4b4", + "00000000 bdb26f14 3f56aa63 3f931829 3f89e47e 3f94348b 3f94348b -> bdb26f14 3f56aa63 3f931829", + "3f000000 3ede20b4 3f15eb67 3f15eb67 3f7982e9 3f3e7801 3f7982e9 -> 3f3449a2 3f2a31b4 3f47b728", + "3f800000 3f5aeaa4 3f969e7e 3f5aeaa4 3f2ed795 3ea8beb9 3f75b9c7 -> 3f2ed795 3ea8beb8 3f75b9c7", + "3fc00000 3f9f52f3 3f96580d be0978e8 3f8065b4 3e267cc6 3f8065b4 -> 3f61de29 beafd284 3fc9301d", + "bf000000 3f73e76c bdedfd50 bdedfd50 bd20c7f5 3e9b545b 3e8b687d -> 3fb970b1 bea6e92c be9ef33c", + "3e800000 3ecac83e 3ed7ad84 3ed7ad84 3e2b8fd2 3f84d3f4 3f0e53ee -> 3ead8829 3f134b0c 3ee8ec1a", + "3f400000 3debf60e 3f829af9 3f829af9 3f499cc2 bdc37d14 3d095ef8 -> 3f1e9542 3e3be70c 3e8f7be0", + "40000000 be0f6876 3f07c514 3f1c6a21 3e74a0be 3f82b920 3f82b920 -> 3f1e2a7c 3fc18fb6 3fb73d30", + "00000000 3f259712 bcbd3570 3f259712 3df8ea81 3df8ea81 3f8143fe -> 3f259712 bcbd3570 3f259712", + "3f000000 3ecd8009 3ecd8009 be2bde93 3f8a3635 3f8a3635 be4c8ba8 -> 3f3d9638 3f3d9638 be3c351e", + "3f800000 3f82ae35 3f82ae35 3e893266 be4d0c11 3edddffe 3e405e1e -> be4d0c10 3edddffe 3e405e1e", + "3fc00000 3f68fe20 3f6e64b2 bdc41979 3f238573 3f238573 3f0edf9f -> 3f00c91c 3efc2ba7 3f629106", + "bf000000 be249898 3e4ac31c 3f8c5ea5 3ea77dda be543060 3ea77dda -> becf315f 3ecd1e6d 3fbd9e3c", + "3e800000 3f833d88 bc85369c 3f833d88 3db82b26 3f12812f 3efb30ba -> 3f4a9da5 3e060410 3f644263", + "3f400000 3f96706d 3e5a2afe 3f96706d 3f1bc3ef 3ef2591a 3f9f1b95 -> 3f400b2a 3ed10833 3f9cf0cb", + "40000000 3f3e0b07 3f3e0b07 bccb74b6 3f711d99 3f711d99 3f5e65d4 -> 3f921816 3f921816 3fe193a7", + "00000000 3ec59004 bda8075d 3f90148f 3e574e92 3e574e92 3ea0a0de -> 3ec59004 bda8075d 3f90148f", + "3f000000 3f91d2b1 3e7c355c 3eced304 3f72c5ae 3cce92f3 3f8733a9 -> 3f859ac4 3e0b03dd 3f3ae86a", + "3f800000 3f4c659a 3f4c659a 3ef0e060 3e800000 00000000 3f400000 -> 3e800000 00000000 3f400000", + "3fc00000 3f2cc849 be0149ed bd8015ec 3f60fee3 be4b574f 3f310034 -> 3f7b1a30 be705e00 3f88c0d7", + "bf000000 3dd4ca42 3f822ea8 3f31799d be4ed268 3f68024b 3e1d089c -> 3e838072 3f894569 3f769558", + "3e800000 3e9530e0 3e9530e0 3f46d1e8 3e9bae44 3e9bae44 3f9ced06 -> 3e96d039 3e96d039 3f6393f1", + "3f400000 3ea017e5 be57a971 3f30b885 3f3d7e2a 3f5e80de 3ec51642 -> 3f22219c 3f196610 3eec2cf4", + "40000000 3f7ceab4 3f2c9833 3f2c9833 3eaaaaaa 3eaaaaaa 3eaaaaaa -> bea48014 bbf6c480 bbf6c480", + "00000000 3e843f91 3eb6176f 3f983636 3e28dae3 3e6100c2 3f168f6c -> 3e843f91 3eb6176f 3f983636", + "3f000000 3f4ac652 3f624e22 3d4f5349 3e68b60a 3d6afeaa 3f6892f9 -> 3f0279ea 3ef0fe0d 3ef5882d", + "3f800000 3f673caf 3f673caf 3f329203 bda3f391 3f65ff09 3f9398eb -> bda3f390 3f65ff09 3f9398eb", + "3fc00000 3d44da97 3f5ebb4d 3f036d36 3edf4c66 3e40f689 3f733178 -> 3f215277 be1c04cc 3f9589cc", + "bf000000 3f88f6f0 3f908d4e 3f88f6f0 3f6d4190 3f4d14e9 3f9f1e9a -> 3f922204 3fa58ebb 3f7bc636", + "3e800000 3e1800c0 3e1800c0 3f93173f 3f000000 00000000 3f800000 -> 3e720090 3de40120 3f8e516f", + "3f400000 3f1e5792 3f758eaa 3f97b2b4 3edd8dc2 3f7f0559 3edd8dc2 -> 3ef5561a 3f7ca7ad 3f1eee83", + "40000000 3f5e7428 3dbe189d 3dbe189d 3e2cb6dd 3e2cb6dd be7385c3 -> bf0818ba 3e7a616c bf1185f5", + "beb22e59 3f78bb27 3f87a902 3f49f085 3cc285f1 3d174f96 3f6ceecc -> 3fa69695 3fb539c8 3f3dc2f3", + "3f18ba25 bd811a14 3f604bca 3e9ee00d 3f7869ff 3f0f4ba1 3f0f4ba1 -> 3f0db0fa 3f2ff8cc 3eeb11b2", + "3fb44069 3f44b559 3f43a77e 3f43a77e 3f76ed63 3f76ed63 3f3ce8c6 -> 3f85b6b6 3f85edca 3f3a27e6", + "bed94b7e 3f4078e2 3f0850ce bbf4290e 3f986edc 3d39b428 3d39b428 -> 3f10c593 3f3d3e23 bcf49296", + "3fbd5ab9 3f3cd912 3f3cd912 be592681 3f4d22b3 3f35a661 3f35a661 -> 3f54f155 3f32331f 3f935efe", + "3f9411f1 3ed5c89e 3f6784de 3ed5c89e 3f9d654e 3f4d7434 3f84e548 -> 3fadb1de 3f495df2 3f915a68", + "3cf325ad 3f92f4b6 3f9e401a 3f92f4b6 3e6ffddb 3e6ffddb 3f9fd9c9 -> 3f8f7c08 3f9a719a 3f9356b1", + "bef52263 3f9738c9 bdb9f1d2 3ef4da62 ba1506a0 3f95f589 ba1506a0 -> 3fdfa888 bf31f731 3f351c80", + "bee7beb2 3d0cb94a 3ebbd001 3f33a03b 3f9f6334 3ed1eff3 3e5edf69 -> bf038289 3eb1cc5a 3f6bb5b9", + "3f39b3be bdbbd2d8 3ed7d617 bdbbd2d8 3f7f2769 3f7f2769 bd85b20e -> 3f32a42e 3f56b90c bd948f25", + "3e3e69e7 3e29ec6b 3f996fa7 3f996fa7 3e800000 3f000000 3f000000 -> 3e39edf4 3f88ce30 3f88ce30", + "3ee5f096 3e5e66d0 be7aa8c3 3f618aa5 3e6ec142 3dcfccda 3e6ec142 -> 3e65bef3 bdb6da3a 3f170e90", + "be45229c 3f988e32 3f108aca 3f108aca be62aefb 3d82c5a4 3f7d00ee -> 3fbb6130 3f2938c2 3ef752ca", + "3f734e4e 3d0b9614 be63ab7f 3eaa9435 be7b6968 3f67b788 3d4fef41 -> be6d36f9 3f596792 3d84a540", + "3d5aca22 3dd1e237 3dd1e237 3e917136 3eb4c411 3f67b781 3f67b781 -> 3ded4b9e 3e14d867 3ea26d89", + "3f833188 3f71889b 3f890bac 3e9065a7 be0c2a8c 3f87c887 be0c2a8c -> be27c474 3f87c077 be16de4c", + "3f649df9 3f36aada 3e5fa98e 3f8bbf46 3e800000 3f000000 3f800000 -> 3e9962eb 3ef0943c 3f8141ac", + "3f90b540 3ebfa87b 3ebfa87b 3f4a41f7 3ea61b79 3dd58ae2 3db46aa5 -> 3ea2c5ab 3d8d58d4 bb67b700", + "be92391e 3f9bd715 3f5d67f4 3f9bd715 3ea41742 3f57c4cc 3ea41742 -> 3fbca190 3f5f041b 3fbca190", + "3f303fc7 3f49a4c4 3f9c79f0 3f9c79f0 be540547 3f80baba 3f9d071c -> 3dd29920 3f895f91 3f9cdb21", + "3eb2d285 3df6a0df 3f22a6d5 3f698f23 3d82fec9 3c383389 3d82fec9 -> 3dce3dfa 3ed5b296 3f1db466", + "3f9c9344 bc09ba9f 3f656a6b 3e454fc5 3ee43219 3e5b9e39 3f9e9b4b -> 3f0c0cca 3d7f2270 3fbc822f", + "3e8504f3 bdf24de7 3f0c540f 3f8289e2 3f2c0846 3e61cec3 3e61cec3 -> 3db2342d 3eed12ee 3f4fea35", + "3e1c4b42 3ef2ee60 3f638501 be6c5617 be7e279f 3f9dc190 be7e279f -> 3eba74d9 3f70f32f be6f0e52", + "3fa6da03 3e958648 3e958648 3eded9eb 3ee22f32 3f938e97 3f938e97 -> 3ef973e9 3fb4ff9c 3faf6f2d", + "3fbff68c 3f743d40 3ec95ed8 3f81d137 3f8cff01 be4e8790 3f8cff01 -> 3f966dcd beff7e98 3f929513", + "3e9e8d26 3d6b8602 3f950e08 3f99bf7b 3f18c6ce 3f18c6ce 3de90813 -> 3e65e38e 3f7d1ab0 3f5d4b3a", + "3f45f365 3f693ab6 3f693ab6 3f5b358f 3e800000 3e800000 00000000 -> 3eccbf44 3eccbf44 3e46d3b8", + "3f9655ee 3e87ad48 be74c4ab be74c4ab 3ecdd26c 3ce24b29 3ee05627 -> 3eda0fe6 3d97de3e 3f0e6b4f", + "be840046 3f1b3c7a 3f9fbd65 3de20342 3e9d3ec1 3e9d3ec1 3d691307 -> 3f2efd05 3fbec9be 3dfe3cb4", + "be8f810b bdacea73 3f9f19bc 3f5d0230 3d401484 3f70f72f 3f91e5d9 -> bdf84c94 3fa9eca3 3f492b11", + "3fa0b4f3 3caa9aa8 3eb8c643 3caa9aa8 3f000000 3f400000 3e800000 -> 3f1f5834 3f59740a 3e9dfb76", + "3f60fd46 3f07f453 3f76e9fc be6aaf49 3f25a8db 3f75bdc8 3f75bdc8 -> 3f220fae 3f75e225 3f50ddc0", + "3fae6a1c 3f9e55f6 3e583507 3f9e55f6 3f9fe352 3f4ae1ca 3f81df66 -> 3fa07368 3f806cc5 3f6f1a64", + "3fa8f8f7 3f7c4efa 3f8905e5 3f73977a 3e17a509 3eb1ab35 3ef7b92d -> bdf5bc50 3dec6368 3eab129c", + "3f43cea9 3f84cb34 3f4a8b26 3f4a8b26 3f85ac87 3f9d7de6 3ce5ae86 -> 3f85778c 3f9045dd 3e547444", + "3ec1706c 3f825ed4 3f042d64 3d93ccd2 3e7a8baa 3e641992 3f126a40 -> 3f39e514 3ecf9160 3e859fd1", + "3f41c89f 3f69c13b 3f69c13b 3f0d6ebe 3f6d0e54 bd0c2814 bd0c2814 -> 3f6c40f1 3e48b774 3dddef4c", + "3ef2eac4 3f4f7e75 3da3620d 3f4f7e75 3f9f15ac 3e588a20 3e588a20 -> 3f820076 3e11ab79 3f06bbb0", + "3f92a356 3eb4ef95 3e78fb0a bd54891c 3d23d197 3d23d197 bd245836 -> bbb8c400 3c2aa030 bd1d53d7", + "3f9104a3 3f82c57b 3e557b27 3f1e2d0f be3f373a 3f93240a 3e841ddf -> beb1dd98 3fa327e5 3e573e64", + "3f91e527 3f0394c1 bce74396 bce74396 3ebe18ca be7fc99f 3cc10839 -> 3eb3e1c4 be8fc0d9 3cfc59e4", + "3ed26c8f 3f6da7ca 3e766d69 3f5805f5 be548eb9 bdc26ff8 3ee36aaf -> 3eec495b 3dd2636c 3f2df933", + "3fb8b22d bdd73c89 3f838da9 3e07ec61 bd9e46cf 3e3dca2e 3f72b8ee -> bd850c04 be404df8 3fa79747", + "bef96ae1 3f083a37 3e84f2d4 3f810a9b 00000000 3f400000 3f400000 -> 3f4a96f6 3caa6840 3f912329", + "3f970a24 3f7d12d2 3f952626 3f3ed6ab 3f800000 00000000 3e800000 -> 3f80436d be56c560 3e24ad84", + "3e419a3d bd86f000 3e5e0d77 bd86f000 3f400000 3f800000 00000000 -> 3db4fa6a 3ebad61c bd5ad9e2", + "3f2581e2 3db582f3 3f36d0f2 3f36d0f2 3b34d893 3f5f5e94 3e746f3b -> 3d07a1a0 3f5108cf 3ed042e5", + "3fa32b43 3f641d50 3f1d40a8 3f7f1518 3f8f031f bb92672b 3f928698 -> 3f96f7c1 be32a854 3f97bdee", + "3e24786f b98f0d3f bdf6295a 3e8a56c6 3e79129b 3e79129b 3f845fb3 -> 3d1f14f2 bd7d3a76 3ec92a30", + "3f2a4413 3ed0fa23 3f3cff82 3ed0fa23 3f9d1a85 3f36bb91 3d987c73 -> 3f73f900 3f38d4b9 3e3eae84", + "3faa659b 3ef0c791 3ef0c791 3f445e62 3f9fa21c 3f16fe67 bdcc24d1 -> 3fc091dd 3f21216e bec6066c", + "3e6f7137 3f8e4508 3f923936 3f923936 3f1357b0 3f9b3938 3f6c816e -> 3f7c7563 3f9453f5 3f8baedf", + "3fb4652a 3ea8b0f2 3f9922d7 3f11523a 3f706ffc 3f460f3d 3f706ffc -> 3f982a74 3f19c399 3f8bafa0", + "3e2d3c4f 3e716e41 3e716e41 be53ac97 3f902db3 3f4192e7 3e515c51 -> 3ec5dbee 3ea5ca04 be0c720a", + "beca464a be5e483f be5e483f 3d8d9fa6 3f1a087e 3f8334ba 3f1a087e -> bf0a60d0 bf3531f2 be10a072", + "3ec8caa2 3f231801 3f6db4df 3e14bded 3e8d2013 be3fc6c2 3f0c60a5 -> 3efd9c8b 3efb5d83 3e9b4f0e", + "3ebf0503 3ee8bb0c 3f98fb1c 3efee256 bdd8072d 3f8926fe 3f60b629 -> 3e7b8196 3f931353 3f23bb5c", + "3f85184e 3f416c79 3e8e3a9b 3f131b69 3f40b92a 3e717b7b 3e717b7b -> 3f40b207 3e6fc591 3e63ac26", + "be220284 be110c54 be110c54 3e46ace7 3f0d9ec0 be78b429 bdc6c1f8 -> be80cf7e be00a606 3e75d4d5", + "3ec22b9c 3f0a78fb 3f443976 3f0a78fb 00000000 3f000000 3f400000 -> 3eabeab1 3f2a59e1 3f1ec5b3", + "bd0dbc1c 3ea012ca bd86a7b4 3f8b91ff 3f952772 3f952772 3ed87bf6 -> 3e90f7b5 bddde4dc 3f8e86f1", + "bed78a56 3f214aca be0d82d7 3f260103 3f895382 3f879eb8 3d4739c0 -> 3ee323de bf2474f7 3f66a560", + "3fb22c93 3d1fff37 be30aec3 3d1fff37 bd1ecbf5 bd1ecbf5 bdcfc870 -> bd8de12c 3c5ff100 be204b66", + "3e3edf4f 3eef4fdd 3f84bd42 3eef4fdd 3eef0cb9 3f8c722e 3eef0cb9 -> 3eef4359 3f862d02 3eef4359", + "3e76f4d1 3f6144dd 3f9d29cb 3f794ecc 3f800000 3f800000 3f800000 -> 3f68ae2b 3f962148 3f7aebf8", + "3f694f92 3f7e29e4 3f9021c6 3f7e29e4 3e7296c5 3f86eabe 3f9ee5f9 -> 3e9b98d6 3f87bbd2 3f9c1415", + "3f008a4d 3f5f0483 3f49d3dc bd8fca80 3eda9819 3f956682 3eda9819 -> 3f25ead8 3f7a84d4 3e37b880", + "be2a8470 3ee78e28 3e70e3f8 3ee78e28 be2d8f4b 3e94d9b5 3f7a6dc4 -> 3f0e4849 3e676e2f 3ebab5fb", + "3f23cb2a 3f89e071 3f610755 3f2fe7c8 be4acd23 3e393219 be4acd23 -> 3e85c3b0 3edd5917 3df759b0", + "3f108d69 3f34e211 3f34e211 3f7ef176 bd52c18d bdfd22f9 3f75624d -> 3e8e9dd0 3e738434 3f798ba7", + "be90d088 3f9ed7aa 3f9e97c5 3f9e97c5 3f3ba157 3f557a0b 3f3ba157 -> 3fb13c1e 3fad426a 3fb0ea26", + "3f4deea2 3ebeb45f 3f679d69 3f2794bd 3f35d964 3f89dc77 3f1f40da -> 3f24eeae 3f858c48 3f20e1cd", + "be441972 3f03cfdd bda18018 3dac493a 3f800000 3e800000 00000000 -> 3ed80f20 be113d2c 3dcd4786", + "3f18559b bdb13ec3 bdb13ec3 3f299bda 3ed6a12f 3ed6a12f 3e1adf06 -> 3e5b8bd6 3e5b8bd6 3eb7714e", + "bdda1386 3e939d5b 3f530d49 3dc3964a be1230c6 3f01262b bd8148ac -> 3eab1dce 3f5bc5eb 3de62e1e", + "3fbbdcc0 3e2e477d 3e7a1f45 3e7a1f45 3f8693fb 3f21212b 3f21212b -> 3fbb5419 3f4f3de6 3f4f3de6", + "3e1797fc be0856eb be0856eb 3eb483f4 3f8d313d 3f92daf4 3f883151 -> 3d4c3f78 3d671334 3eea70a6", + "be8ba674 3f728e7d 3f728e7d 3f75f727 3f47dec8 3eb26110 3f47dec8 -> 3f7e3311 3f8e31ae 3f8144e1", + "bed7f00f 3e13c4e4 3f3f9c6b 3f3f9c6b 3f0d4ad6 3f98564d 3f807e47 -> bce22ab0 3f0fed1c 3f2409e5", + "3fa22571 3f0b49e6 3efbda53 be47ace7 bdc515d1 bdc515d1 3f1dcdd2 -> be88bb10 be8199fb 3f5537bc", + "bd293b5a 3e85e9ee 3f764c34 3f764c34 3e8f7346 3e8f7346 3e97de8d -> 3e858510 3f7d82a8 3f7d5622", + "3fa567c9 3f83149e bcb1e1b3 bcb1e1b3 3f157b89 3f2c3323 3f2c3323 -> 3ee91bee 3f602567 3f602567", + "be929e18 3f4c1bb8 3f86c791 3f4c1bb8 3f8bb52f 3f8bb52f 3f52ac59 -> 3f368b0a 3f855e49 3f4a3a73", + "3eb2a482 3f763109 3f763109 3f539ccd 3f800000 3f400000 3f400000 -> 3f799d24 3f634893 3f4cc4fd", + "be4c02a2 3e93622f 3f99bd18 3e93622f be193259 3ca536d2 3ca536d2 -> 3ec001d6 3fb7da80 3eaeb07a", + "be481195 3d8c80b7 3f495027 3f495027 be470355 bd913eeb 3f9e0fac -> 3df5b867 3f74315c 3f32e1b7", + "3f917ff0 3f8d5d05 3f228050 3f96f44f 3f4096be 3f07936c 3d577485 -> 3f3443f6 3f03e50c bdcfc090", + "3d684426 3f8a0b9f 3f23a1c5 3ed6d8d4 3f667c0c 3f813c83 3e4b4d0d -> 3f88c099 3f29028a 3ed06d98", + "bec4aa87 3f641c42 3f9d087d 3f9d087d 3f24e69e be1f2475 3f2401a2 -> 3f7c63d8 3fe0fe29 3fb9da6a", + "3f91bc54 3f83124b 3f502a67 3f882f00 3f4e838d 3f1ef7cc bd1e3aee -> 3f46ce51 3f1826b1 be43fec0", + "3faa46f1 3f1622bc bda7398d 3f902e09 3f8cb9be 3e35b989 3f8cb9be -> 3fa26961 3e86ae76 3f8b95ab", + "3fa0accd 3ed5a0d4 be620479 3f06e3da 3c41f6b6 3f844ab7 3f844ab7 -> bdbbb320 3fad4645 3f94d874", + "3f4707f0 3e619e86 3f9a6d5a 3ba5c7be 3f8c0740 3ee888e3 be2d5a1c -> 3f664948 3f1f1fee be059f49", + "3f507757 bdf352e2 3f44f894 bdf352e2 3f911ea2 3e36ed63 3f911ea2 -> 3f66b350 3e93a0a6 3f66b350", + "3f343672 3f059d84 3f1f71a2 3db4f5f1 3d430557 3d430557 3d6d1197 -> 3e408bb0 3e5f219a 3d8903ec", + "3f9325f8 be1e4230 3f7e00f8 3f7e00f8 3ef46d2a 3eae4224 3e10bd29 -> 3f126a21 3e78a958 3c666380", + "bd60140a 3ec3bb88 3f9faa4c bdd965c5 3f004ef7 3f7a698c 3cc309f5 -> 3ec066da 3fa18ce4 bde7f546", + "3fa9b98a 3f2fb2a1 3f33dc45 3f2fb2a1 3e800000 3f000000 3f400000 -> 3ddcb700 3ede308b 3f45506a", + "3e9b74c1 3f2038df 3d51ff85 3d51ff85 3f5d35ef 3e6ccea0 3f0d96e4 -> 3f32bd64 3dd8eb7f 3e508510", + "3f2ca075 3f8e07c2 3f6460ad 3f8e07c2 bd7ec0b2 3d15d36c 3d15d36c -> 3ea38cf2 3ea16226 3ec5a716", + "3f14e83e 3ebba79e 3f2f0172 3f74b016 3e3b381c bc4e606c 3eef2d52 -> 3e84f39e 3e8eab59 3f2bebe6", + "3faedca0 3efd2beb be70e4bd be70e4bd 3f5b79a4 3f0ec1fc 3f2d4228 -> 3f7d7b92 3f59121d 3f815e75", + "be36af83 3f60b286 3f1f2b93 3f60b286 3f8e8c36 3f245ba9 3e5fc377 -> 3f55ec10 3f1e3ea3 3f7ecdde", + "3f817993 bda874aa 3f32e346 3f04e153 bbf8657e 3ed20e3f 3eed88f4 -> bbdc33a0 3ed05a81 3eed35b2", + "3f527e4b 3f76525f 3f76525f 3f6e5ec9 3e81a8a5 3f646d48 3e81a8a5 -> 3ec22ee0 3f679b9e 3ebf5b2e", + "3fbd57cb 3f5a888a 3f980f64 3f5a888a 3ecf3910 3ecf3910 3f939f39 -> 3e4224f0 3cf09dc0 3fa600e0", + "3f6bd5d3 3f8ce737 bdbec3a0 3f23b850 3f4ceae0 3f2d33b1 3f102adb -> 3f52f952 3f1dae47 3f11b521", + "bed8e62d 3ed0aade 3ed0aade 3f8a5755 3f38435b 3f5fbd54 3f38435b -> 3e8cf241 3e56ffb1 3f9deabe", + "3fb09294 3de18433 3f8b97e8 3e51abb3 3f75c1c7 3f175f3d 3f4ff05a -> 3fa428b2 3ecdbd50 3f857a3d", + "3f782321 3d8c219c bd40e11d 3f3dc40c 3e800000 3e800000 3f000000 -> 3e7a4a0a 3e76a7fd 3f01e5a6", + "3fa6961c 3f99bee5 be6d61e6 3f55200c 3f000000 3f800000 3f000000 -> 3e93c852 3faf880a 3eccad51", + "3e5ee4be 3f23e826 3f68d33e 3f365f3f 3f8409e6 bcf94af3 3f8409e6 -> 3f39b5fd 3f347354 3f482824", + "3e5390f6 be288855 be288855 3e9b03a2 3da27cd2 3f8ba611 3f979c35 -> bde9da8b 3dc2370e 3ef8484a", + "be8089be 3e254d30 3f90275a 3e254d30 3f754780 3f754780 3f05d69f -> bd1e09f8 3f958e0a 3d90cc9e", + "3fb11a8a bdb35876 bdb35876 bd42b96a 3f829fa6 bd89767c 3ecdcc51 -> 3fb908a9 bd72ca96 3f130acf", + "be5106e9 bde98c07 bd830c69 3f667177 3f8a69d0 3e8c5a29 3f8a69d0 -> beb7523b be0832fc 3f5cf99e", + "3f1a7477 3ec6f3ea 3ee9ddbe 3ee9ddbe 3f91b311 3efb03fb 3f91b311 -> 3f574558 3ef4368c 3f5e31fc", + "be8780cd 3f16e182 3f5cfee3 3f8ccc8f bc5cefdb 3f41aa30 bc5cefdb -> 3f3fb9d0 3f643a98 3fb284dc", + "3f6372a5 be51e49f 3ee7f326 be5242cf 3f60f051 3f46f983 3f2c90a4 -> 3f41ff99 3f3db7b0 3f1374af", + "3fb84013 3ecf0793 3f54ed6e 3f0c8ed2 3e41e9ec 3d9a8c0a 3ea7e3fa -> 3dc256e0 be838744 3e6c4424", + "be62136b 3e6026de 3e6026de 3ed0a8c0 3ebf7ef5 3f67786f 3f76b6e0 -> 3e3d1565 3d8a73a2 3e91c9df", + "3fa1a773 3ee66172 3f615677 bbde0c5d 3f8d20f5 3f30a9bd 3f75067f -> 3fa31774 3f23dd88 3f9af3bd", + "3d02154f 3f888925 3d645c93 3ccf77c4 be46d44e 3f4ddf4e 3ef4b439 -> 3f836904 3da2dc3e 3d229c73", + "bec9bcc6 3e01de5e 3f8a5c0a 3d85f388 3d4a19ad 3ea83481 be51927e -> 3e2121a6 3fb04e87 3e2ff0ca", + "3fb3369d 3f43ace2 3f70309d 3f70309d 3f400000 3f000000 3f000000 -> 3f3e878c 3ea63986 3ea63986", + "3fbe1c9d be2920d2 3ebe1ed6 be2920d2 bd14f78f 3f0860ae 3f0860ae -> 3cd60c18 3f1c6d47 3f5f126c", + "3e8c62c8 3f5c0e6d 3f5c0e6d 3ec2452a 3d12d820 3f138a12 3f0d4947 -> 3f223c3d 3f482c3e 3eda7b5d", + "3f36d627 3f01de89 3eb6b6f7 3f81a1cd be176caa 3f474ee9 3e54d021 -> 3d214340 3f2874da 3ee03050", + "3e2234cd 3dd7b25d 3e7634d2 3f994d01 3f39cc26 3f06b137 3f56473e -> 3e507d45 3e924659 3f91fd14", + "bee710f7 3ec70367 bd65939a 3f4e79bf 3f996fd0 3f51dd3c 3f51dd3c -> 3cbd7e90 bee71273 3f4cf23f", + "3f06f4cc 3bb53686 bd8b3ef5 3d524745 ba309ce1 3e3eb867 3e3eb867 -> 3b1416a7 3d873ef3 3dfacc3e", + "bd32680e 3e7204c9 3efbdb29 3f4351b7 3e85a674 3eba4d6c 3eb72642 -> 3e70eae2 3efeb61c 3f47d682", + "bbf0efbb 3ef30284 be457a50 3f8ea49e 3f9aeeb6 3f9aeeb6 3f9681f0 -> 3ef03d69 be500b15 3f8e95d0", + "be9271b5 3efc56c7 3e9ab07e 3e9ab07e 3f3075b9 3f020946 3f3075b9 -> 3edf920c 3e791841 3e43fb50", + "3e756053 3ef13144 3dccc7e3 3dccc7e3 3f902ee0 3f7f69b3 3f7f69b3 -> 3f20cc54 3ea15595 3ea15595", + "3efc9394 3f93215a bdfb3790 3ea9855e 3f89a55b 3f03ee8c 3f03ee8c -> 3f8e7397 3e44b0da 3ed80fbd", + "3f1178dd 3e91b713 3f95b86f 3f95b86f 3cb65c15 3cb65c15 3e2d55a0 -> 3e0ac733 3f048592 3f19e866", + "3edbbb23 3f86ebfd bcb3843a 3ec59073 3f400000 3f000000 00000000 -> 3f6c6fa5 3e4eebf2 3e618de8", + "3f1ea496 3f9059b6 3f1ba024 be6e3e6d 3f000000 00000000 3f400000 -> 3f3d1d5e 3e6cbd00 3ec0a984", + "bec60694 3d714ccb 3f8a0267 3d714ccb 3f3ab1c8 3f169fe8 be49e0ea -> be4d2c73 3fa24238 3e21bcb8", + "3f091834 3f15e3fe 3f1d163a 3f1d163a 3f6d5041 bdf0cbb0 3f915075 -> 3f44b532 3e63600a 3f649a12", + "3f90db50 3f0ef9d5 3f7d3e27 3ef77bfd 3eacf19d 3de1c791 3eacf19d -> 3e9e0fbb bbb4a000 3ea3209a", + "3f8be152 3ec894aa 3ec894aa be3f3599 3f971196 3f971196 be2bd70d -> 3fa06f90 3fa06f90 be2a0ad4", + "3fa7ee3e 3f503928 3f93ff64 3f93ff64 3f7f0331 3f9e44b5 3ec33ee1 -> 3f86cdeb 3fa178f2 3e0ef4a8", + "3d2d9010 3f9bbe5a 3f9bbe5a 3f2ee9da 3ea2158a 3f665cfb 3f665cfb -> 3f96dc75 3f9a0659 3f31435a", + "3f9efce3 3efd33fc 3efd33fc 3af5d3bf 3e70c515 bdbfdd50 3ed453ec -> 3e307616 be71c0fc 3f03bfc9", + "3dd832df 3ed8ebb5 3f0c6e23 3f0c6e23 3f17aa74 3f1371fc 3ed6114d -> 3ee20af3 3f0d2bb7 3f08e79a", + "be174c59 3ef8364a 3f633341 3edc8fbb 3f714cd2 3e6ea28d 3f753b09 -> 3ed594aa 3f7bf470 3eb4aee4", + "3f8c1565 3f92bf82 3f66e452 bd8d7e55 3f85964e 3f01580d 3f01580d -> 3f84583e 3eef83db 3f0f395d", + "3fb0f8ab 3f3a2cfd 3f4c28b3 3eb37df0 3f2a8039 3e41c20d 3f4ffa0a -> 3f2480fc bd323140 3f7d35e1", + "3ef393d8 be4b4cee 3edd3c38 3f20b601 3e59d472 3f423f78 3e59d472 -> bb3cff00 3f166757 3edc530c", + "3f3d3b02 be3f576c 3e196fe1 be3f576c 3e05b4ea 3f500bd3 3f3e9bea -> 3d43b670 3f23c9ea 3f006b1a", + "3c52bd77 3f168d49 bc9a1e1f 3f168d49 3e72e800 3e0f1e20 3e0f1e20 -> 3f156582 bc896890 3f15135c", + "3f3aa6a1 3f852057 3f8a857a 3e4a7a69 3f797ad6 be17c76b 3f797ad6 -> 3f7e0604 3e3d8900 3f439c0d", + "bede38f6 3f2425d1 3f2425d1 3f47994f 3f4d78da 3ecf412a 3d415359 -> 3f123637 3f3e6a52 3f8c7e39", + "3e33f82e 3df50e05 3f839ebe 3f0834a1 3dc47585 3f091221 3f809a8b -> 3dec8396 3f7110d4 3f1d78c9", + "3e2700a6 bc127cad 3f8edafc 3f14f8fc 3e800000 3e800000 3f400000 -> 3d085a76 3f798d67 3f1bfd68", + "3fa62a64 3f32fbaa 3f5c0790 3f756281 3f690ab8 bdb81883 3f0b520e -> 3f792918 bebef568 3ed76418", + "3f8119c7 bc729837 3ea13469 3ea13469 3f9f6d94 3f9f6d94 3e4d388b -> 3fa0d0b7 3fa073d3 3e4c3691", + "3eca8f47 3f9cd4c0 3f12746b 3f12746b be221006 3f01267c 3f01267c -> 3f2d8a6f 3f0b9bd4 3f0b9bd4", + "3f8d172c 3f632021 3f632021 be6cf3db 3f48c22a 3f0aa6e6 3f41aac1 -> 3f460fd9 3f019a92 3f5b8813", + "3e51c38b be620d6d 3f3263f7 3f1fb244 3eb8caf3 bcdf456b bcdf456b -> bdd01332 3f0c6b1b 3efb1b7d", + "3f002ad7 bbb2e5be bb249423 3f8e21d9 3f75e015 3f9d1ad9 3f12049d -> 3ef4cd0b 3f1cfd3f 3f570d05", + "bc19e8a8 3f470baf 3f470baf 3f26e14d 3f7bf239 3dc9b3da 3f7bf239 -> 3f468c78 3f48adb9 3f2614bb", + "3fb41f4b be7c6dce bc71ba85 bc71ba85 bdcbfcc0 3f2533d2 bd42482c -> bd22f150 3f6a02fe bd78c946", + "3fbd3b07 bda80656 bda80656 3f506169 3ea5c9c3 3f8f25ce 3ea5c9c3 -> 3f04983f 3fd8a5dd 3db6ed58", + "3ec87e15 3f486565 3d9f99f2 3f988db5 be5bb6f7 be5bb6f7 3f475fd7 -> 3ec8d417 bd15f14a 3f83da0e", + "3f6d0905 3f865644 3edbe0af 3edbe0af 3f39ac7e 3f087c9b 3f2821a2 -> 3f3fd292 3f068522 3f23d206", + "3fb6aebf be0352b3 3ed296ff 3e8e4b13 3f000000 3f400000 3f400000 -> 3f44b54a 3f650a85 3f73a128", + "3f6d7a93 3e637b0c 3da02ec0 3e637b0c 3f000000 3f800000 3e800000 -> 3ef5b52e 3f6eed6c 3e7defca", + "3eb35436 3e80e04a 3e67ea60 3e80e04a be74a7ad be74a7ad 3f37aa22 -> 3da39100 3d81fdde 3ed4650e", + "be03c39f 3e588844 3f9bf67f 3f9c0702 3ee2fdf7 be08d9da 3e33a52b -> 3e39fa5b 3fb23b94 3fad3700", + "be264df5 3d936363 3d936363 3f87495c 3cbf5eb1 3f2fcbb2 bdfd58a4 -> 3da38e1d bce45010 3f9fd460", + "3eb80c33 bdf8f0f4 3f7c7f4d be4ef1c3 3e800000 3f800000 3f800000 -> 3c44be30 3f7dc1a3 3e6b8a73", + "3e5c5f23 3f7252e5 3f6c822c 3f590dc4 3f800000 3f400000 3f800000 -> 3f75445b 3f62ee12 3f616f6d", + "be90d0fd 3f8c1262 3f68cf21 3f5139e7 3f9401e0 3f36656f 3f01aa03 -> 3f89d3c9 3f77116f 3f67bad9", + "3f7c2e58 3f681f06 3e8f8f95 3e9381bd bdfd7453 bdfd7453 bd288cb9 -> bdddf8b0 bdf11b60 bd146e70", + "3f1e7aca bdfa9ce0 3f8a308f 3f8a308f 3f2de7ef 3f8424f0 3eff5e2d -> 3ebf7328 3f86727d 3f3853eb", + "be048ec2 3e94c9ca 3f857a10 3f68727d 3f6b37a1 be2743f4 3f8c1d74 -> 3e564d3c 3f99764a 3f6242fe", + "bef0aca2 3f2f8343 3f523072 3f2f8343 00000000 3e800000 3f800000 -> 3f8101fc 3f8b7439 3f09ada7", + "bdfaa24c 3f9c3427 3f9c3427 3f955af3 be0eb80d bdf31f13 3edf47f4 -> 3fb180cf 3fb12df3 3fa0cd55", + "3ed269dc 3f7e455f 3ea16f7c 3f70105d 3ed68b0d 3e6794f6 3f93eda4 -> 3f41dc0b 3e8ead5f 3f837f10", + "3cbad4ce bd5639e5 3f52e511 3ea4e216 3d83f596 3d83f596 3f7cffd7 -> bd4b5242 3f4e7611 3eaca9ae", + "3f30b977 3f9175e2 3ebd80ce 3f9175e2 3ef111e6 3e5291f2 3ef111e6 -> 3f2d4c64 3e835d68 3f2d4c64", + "3f4e46c9 3f5959d3 3e2965a6 3f03cb92 3e028d0b 3f363b2e 3f580936 -> 3e8907b0 3f1b0fc3 3f47ac77", + "3f9d4f78 3e419c1d 3ec4be9d bdce17c6 bdce06b6 3f87c0ed 3f35b0d2 -> be2aefa5 3f9b9396 3f6531da", + "3f49a424 3f16651e 3f16651e 3e309a3d 3ec89b57 3ec89b57 3d56025e -> 3edde12e 3edde12e 3d9f4859", + "3f55589f 3eacba94 be684852 3f811308 bc589eb2 3f7df4e0 3d0a053b -> 3d391a98 3f49f7ba 3e48cda8", + "3fa51dfd 3efbc7e9 3ec0a87c 3d8a7e03 3e0cee02 3f1ad8be 3eed63cd -> 3d0f1918 3f2bd0c0 3f141806", + "3fa4588e be7f114d 3f41da61 3cbf3d09 3e94958c 3eb69d9d 3ef6b044 -> 3ee2fd12 3e78c270 3f1cabd5", + "3f6f5a5d 3f663ec5 be45600f 3cad8ee9 3f2ea5fa 3f9b6574 3f5eaf77 -> 3f324380 3f8fafdb 3f508eb4", + "3d44e232 3f2e5e24 3f2e5e24 3f1199a7 be6bcbba be6bcbba 3f9d0f17 -> 3f232720 3f232720 3f19b34d", + "3df84a71 3f2d05b1 3ec5be65 3f1d1b0b 3ee5c831 3f7b0fca 3ee5c831 -> 3f25f983 3eeaa53a 3f17fcdb", + "3f1f9dfc 3f9277fc 3dede668 3dede668 bdf11e76 3f9dc40e 3f8783a0 -> 3eb6fe9e 3f4fee73 3f342ef3", + "3dd87f7f 3c1d6f6c 3f92d2be 3f92d2be 3f45e75a bd85b532 bd85b532 -> 3db8f720 3f826b39 3f826b39", + "3fa73e75 3da9f510 3f0ef629 3f0ef629 3caa6bfe 3e9a88f0 3caa6bfe -> 3ae3da80 3e648118 be137d88", + "3f95a3a7 3f0d2155 bdaf251b 3f0d2155 3f6f75fe 3f6699e1 3f4f165f -> 3f800acd 3f88a4ba 3f5a3ce6", + "3f38febb be68ece5 3ed184a6 bd4dcb48 3e6d5287 bd8e1366 3ee83ca5 -> 3dd5c936 3d81c800 3ea0b020", + "3f2c1074 be359a39 3f8acd43 3f8acd43 3ee9b401 3f3bd63c 3f3bd63c -> 3e7e9cfd 3f5944df 3f5944df", + "3e44365b 3ee3c3d4 3ee3c3d4 3ee988b6 3f830a33 3f19fbac bdcb02f6 -> 3f0e4772 3ef321f2 3eb30f90", + "3d826b8d 3f97b668 3c963c61 3e4c01f1 3f11baca 3f11baca 3f25dffa -> 3f92b0fe 3d5ad1bc 3e6944d1", + "3ecc1528 3f0f8b8c 3f0f8b8c be7bd5f5 bd0b168e 3f9813d8 bd0b168e -> 3ea5b9f0 3f4f9066 be25507c", + "bd051ed7 3f1efd79 3dd5d2db 3f91cdf5 bd059bdf 3f3d1d4e 3f3d1d4e -> 3f246dc1 3dab9a5f 3f937856", + "3e08865e 3e4c5a35 3f51c883 3e4c5a35 3f2ca65e 3d78de08 3f8805fe -> 3e869735 3f37e33d 3ea11849", + "3f406907 3f8eb400 3f92774a bd465908 3f400000 3f400000 3f400000 -> 3f5733ae 3f59123c 3f0d3a76", + "be8e7fb6 3de2e0c5 3de2e0c5 bdd4865f 3f5c429f 3d568997 3f6be600 -> bdc865a3 3e02156e bec73a6d", + "3d22519f 3f19da68 3e7d18fe 3f30d0d5 3df0e83f 3df0e83f 3f76cb9c -> 3f14f313 3e77d754 3f3396c5", + "bef4b0d8 bd964ef7 3ea72bb5 3ea72bb5 3f3cd367 3f427b88 3f754210 -> beec0510 3df4b0c0 3cca3e30", + "3d04c59b 3f5c159b 3f5c159b 3f663ce4 3f333170 3e68e771 3f932829 -> 3f5ac248 3f56d677 3f68509c", + "3eeefc66 3ecd07a6 3ecd07a6 3f911bea 3e702b10 3f85927b 3f976eb8 -> 3ea5613a 3f335be2 3f940f86", + "3f52082c be64d141 3f21b45d 3f21b45d 3ea43e5f 3f89a6b8 3f0d90f8 -> 3e646a85 3f7ee78f 3f112eb0", + "3f00d12a 3e294c9d 3f8f8f3a 3e9b0364 3f7dfbd5 3f7dfbd5 3f59157b -> 3f14d46e 3f873909 3f13bda1", + "3faf3303 bd27bcc0 3f89284f bd27bcc0 3ecb49db 3e35d845 3e9fa88b -> 3f0efda1 be1bb590 3ee24354", + "3f97afff 3e90aed4 3e8a9674 3e90aed4 3f863d14 3f2230cd 3f2230cd -> 3f98630a 3f3361c8 3f32d167", + "bef41aff 3f8b57c0 3f8b57c0 3f5d0fc9 bce7c15c 3ef83697 bce7c15c -> 3fcf80e4 3fb03124 3fa4f475", + "3ed02401 3e946c0c 3f47f1a7 3ea03aed bd55c5c2 3f6f4e96 bd55c5c2 -> 3e1a7197 3f57f22d 3e287599", + "3eae5343 3f0d74c8 3d72f42d 3f8b7339 be529fcd 3e9d867b be3b553d -> 3e96bae7 3e13538f 3f27feaa", + "bec48644 be3b933a be3b933a 3f31c206 3f3033a9 3f139a1c 3f139a1c -> bf0486ae bef318ca 3f3d5536", + "3f65d6e7 be5b9206 3f643b88 3d2a4de7 3d718b9c 3e3d7fdc 3eb9117f -> 3cfe38a0 3e83b69a 3ea854ea", + "3f581e8b 3f7c60c3 3eee0646 3eee0646 3f8ec4a6 3f5ff213 3ef91d8f -> 3f8c2f76 3f4f9942 3ef7633e", + "3fb40070 3f6d3cbf 3f6d3cbf 3f4d5323 3f9aaad2 3e76b24e 3e778bfd -> 3fa95000 bd1a6980 3c673cc0", + "3ee6de2e 3f52a5fa 3f52a5fa 3f930fb3 3f78f36e 3f78f36e 3e11c81c -> 3f63eb64 3f63eb64 3f31eeb2", + "3fbe2407 bd778c41 bd778c41 3f41246f be036fc2 3eaafe7b 3f4d9b52 -> be25337c 3f0683c9 3f53a86a", + "be5633d6 3f876099 3f89f176 3f89f176 3e9946c8 3e862ab5 3e9946c8 -> 3f9bae20 3f9fc83a 3f9ec864", + "3f5df650 3e93a32e 3f6502e9 3f89514d 3d2f00a2 3f51857a 3f25d866 -> 3d9a6300 3f541ce0 3f344f5f", + "bea1fb75 3e1f02c4 be44c603 3f7468c5 00000000 3f800000 3f800000 -> 3e51513b bf11bf75 3f70be06", + "3f0517cc 3f473938 3f473938 3e9f7a92 bca5cf07 3d30f369 3d30f369 -> 3eb9e8b3 3ecacbd0 3e3021dc", + "3fa15a92 3f48a5da 3f48a5da 3e0115e8 3ed7450f 3f1b3f40 3f1b3f40 -> 3ea6cbb8 3f0f6aac 3f3b4aa9", + "3fb9f675 3f92fb5e bd5cba51 3f1c50be 3e78324c 3bb628ea 3bb628ea -> be2be0f8 3d0508b3 be896f46", + "3fa9ceaa bda58270 bc55d124 bc55d124 3f800000 3f800000 00000000 -> 3fad2f9a 3faa5a56 3b8bac6c", + "3ec5380b be2bb923 3f51e72e 3f5ef113 3f800000 3f000000 3f800000 -> 3e906e3c 3f325ac4 3f6bacf0", + "bed623db 3edc576f 3edc576f 3e87b996 3ce5e599 3f547d08 3ce5e599 -> 3f193e7c 3e86c121 3eba7b38", + "bdb9aa57 3f5cabf6 3eb7be09 3ebe19a0 3e24b0fd 3ec80dd9 3f6cb010 -> 3f6cf1cd 3eb64378 3ea46b52", + "3f9a534a 3c94887d 3c94887d 3f8a6f78 00000000 00000000 3e800000 -> bb746300 bb746300 3da1c1a0", + "3e28ae57 3f6e77d2 3f91bd8a 3f91bd8a 3f2c02bf 3f852f63 3f2c02bf -> 3f63854c 3f8fac14 3f87e680", + "bece1251 3f3cb1e9 be02e1d0 3f3cb1e9 3f54f5c1 3eb5930b be7d4468 -> 3f32edbf bea4dc55 3f911012", + "3eae9236 bdd3ec12 be7d77f9 be7d77f9 be04f973 bdbba649 be04f973 -> bde657d2 be47095e be546291", + "3f159476 be1798b9 3f63ed3f 3f63ed3f bd299793 3e089f8a 3e089f8a -> bdaf95a0 3ee56a02 3ee56a02", + "bea80d8c 3cbd12e8 3f5bdd9d be710085 3eda3e20 3eda3e20 be2ea2b1 -> bddfc01c 3f801b89 be836488", + "3e6d6fbd 3f15f686 3dd38e3b 3dd38e3b 3f11fc73 be0a8d25 3eacaa51 -> 3f150a76 3d447fd0 3e2152c2", + "3e19f94e 3b878700 3f07588f 3b878700 bc46e384 3e581530 bc46e384 -> 3add5902 3ef63c23 3add5902", + "3fb0084d be72e634 3f3bee77 be72e634 3f6b6fec 3f94fe67 3f94fe67 -> 3fad4956 3fa9a4a9 3fd84c3a", + "3f5b1b35 3f3ae1fc 3f3ae1fc 3e672884 3f098d4f 3f098d4f 3f7ac3fc -> 3f10a94e 3f10a94e 3f5ef462", + "3f731798 bd9d23db 3f01747f 3f01747f 3e2672c8 3e2672c8 bcc4cc66 -> 3e1a1820 3e382a3c 3b2ffb00", + "bea67a35 3d812384 3f84c313 3f84c313 3f92a5fa be19096b be19096b -> be93f30d 3fb62655 3fb62655", + "be98b07d 3e162f39 3f8201e4 3f713d14 3eec2399 3f44fc97 3f44fc97 -> 3d588452 3f8b67d2 3f7e6f7a", + "3ec45400 be415dea 3f06aff9 3f38b163 bdbadf42 3ea640c6 3f91a428 -> be1b0c4d 3ee5d518 3f6190a6", + "3e80c7b2 3f483284 3f9cd76d 3f9d309b 00000000 3f800000 3f000000 -> 3f15d7ce 3f959652 3f85c01c", + "bee3cc30 3f1f85af 3e064849 3e97d0b9 3f83a3ef 3d9299ee 3f81c225 -> 3ee2b76c 3e216a08 bcb90fe0", + "3f013a52 bd09c160 3dad05ed 3dad05ed 3f73bf97 3f73bf97 3e59197d -> 3eed8f34 3f05c0e3 3e186e90", + "beb6ed20 3f0db297 3f24fe30 3f8fa741 be6ffb3d 3f4973d8 be6ffb3d -> 3f55c210 3f17f77b 3fcdb1ec", + "bec43ea9 3f578339 3f578339 3f181079 3f709bc3 3e9f89fc 3f0ae105 -> 3f4de4c2 3f85c554 3f1d1e40", + "3f313584 be30a5de be568be2 bdbfb840 00000000 00000000 3f800000 -> bd597908 bd8410a2 3f29d54b", + "bea80803 bd09ad4a bd09ad4a 3e2ef6e1 3ee5bdae 3ee5bdae 3f44cfd2 -> be4482be be4482be bccfd3b0", + "3fadc94e 3f828025 3eb5cdac 3f313d19 3f20f4a8 3ed62d15 3f20f4a8 -> 3efa5674 3ee1c18a 3f1b2195", + "3f88c6e3 be5c89ef 3ec7fe7f 3f6bb922 3f830f18 3f4c189b 3f4c189b -> 3f8def97 3f533bf0 3f49ed6e", + "3f03943f 3f42169a 3f97e34f 3f97e34f 3f7685e3 3f888882 3e992348 -> 3f5d09ea 3f8ffef4 3f3afef0", + "3fb93af5 3c7cee17 bd7e8d08 bd7e8d08 3f63a12a 3e96ea56 3f6e99ae -> 3fa3d1b7 3ee89e35 3fb03282", + "3f82fee2 3f9450c8 3ea53b93 3f9450c8 3f5a8152 3f1ebc05 3f97935a -> 3f58ad3f 3f208410 3f97a6e2", + "3ef34843 3f7105e1 3f1b01ac 3f7105e1 3e9ba81a bdd0571e be1dbdae -> 3f237ab2 3e89f550 3ed78540", + "3f743a38 3edad5a3 3e18f4c8 3f9ab7dd 3f0a8a08 3f0a8a08 3f427c3a -> 3f093331 3f05ed3e 3f47c580", + "bee9cb66 3f99f5f0 3f699724 be7a42ff bd3340df bd3340df bd053b64 -> 3fe2d258 3facaf6e beaeaa25", + "3f91153a bd278a7c 3e7b6413 bd95569b be485a55 be485a55 3f278eaf -> be5d8083 be825244 3f406934", + "3f99ca58 3f0cf12d 3ee84080 3f0cf12d be77470e 3f1e0a44 3f484539 -> becd58ba 3f267c3b 3f54396d", + "be20dad3 3f9207ed 3f74c482 3f20eea1 bd761e67 bd761e67 3f1ad930 -> 3faa2daa 3f8ed10d 3f21e347", + "3f5d6e8f 3f0abd48 3f929039 3f0abd48 3f77f334 3edfe3a6 3f89513a -> 3f6933ff 3f0868f3 3f802468", + "bd236e1a 3f6e94e8 3d0548ba 3f906df1 3ddf66a4 3f3fc9c4 3f3fc9c4 -> 3f76fca2 3b815184 3f925db3", + "bca7cd6b 3f5c5c8f 3f8ab737 3ee07436 3f8ead91 3ec298ea 3e5d0800 -> 3f5b07bd 3f8c8f82 3ee2c9af", + "3efdc96b 3f15bd42 3f15bd42 3f82d176 3f15fee8 3f9767c1 3f15fee8 -> 3f15ddcc 3f619cfe 3f4e4c75", + "bef9590e 3eff9ea2 bcbf17d8 3ede7eb5 be00c23c be58d9fc 3f9da320 -> 3f4dbb16 3d8c2d6a 3d3e2830", + "be1d9518 3ed8ece5 3f0ddb84 3f0ddb84 3f400000 3e800000 3e800000 -> 3ebf36e4 3f19d6c2 3f19d6c2", + "3f1048c5 3ed6d725 3ed6d725 3f663ee1 3f0f9c7f 3f7e7c47 3d3a4132 -> 3effa2c2 3f3e4ec6 3ed61353", + "bebaf231 3f9d5c9a 3db745ab 3f118b0b 3e800000 3e800000 3f800000 -> 3fcb228b 3cfcf9ec 3ed26c9c", + "3d3d5700 3f66a2d1 3f89eea1 3f89eea1 3e800000 00000000 00000000 -> 3f5eeee4 3f838e60 3f838e60", + "3f8a2ff0 3e82b8ed 3eda1a7c be458fbc bd01bde6 be0ec241 3f81d9e3 -> bd5f4c90 be3cd664 3f8e26b0", + "3fb31e24 3e80a528 3f9ad6d7 3e1a4e6b 3f77919e 3f143656 3f927f0d -> 3fa05ff1 3ea77588 3fc54c38", + "3e989864 3dd17913 3dd17913 3e44d94c 3ebd9678 3f850908 3f850908 -> 3e3a8797 3ec35bcf 3ee3b035", + "3f9a67c1 3f81c8cf 3f7c9d7e 3f81c8cf 3f19cace 3ec93ed3 3ec93ed3 -> 3f03f8ae 3e8a8934 3e87aac2", + "bee1b2f1 3cf69bec 3f84ad32 3cf69bec 3f25efc1 3f133346 3f133346 -> be782d38 3f9eb7f0 be5723b6", + "3d8aee4e bde0a74f bc5e84c8 3f99799f 3f96a69a 3ee7b399 be03dcc8 -> bcb79734 3c93c6c8 3f8df212", + "3f7e0162 3eaa29ea be638e9c 3f4f757b 3e6fc1b9 3eb7f604 3f912574 -> 3e708a52 3eb5a426 3f90d2d8", + "3fb37a7e 3f8fb721 3ec0dad7 3ebd12d9 3e96899b 3e5b33f1 3e5b33f1 -> bd20ebe0 3e183ce8 3e1b4783", + "bedd5ff4 3f93afb1 3f98a1a9 3f93afb1 bdc38896 bdc38896 bcd06874 -> 3fd8d366 3fdfe8bc 3fd4f325", + "be20aa3f 3ec854c4 3d1c34b4 3ef0ded1 3ec4e655 3ea260bd 3f97b4d1 -> 3ec8de97 bbb8cfe0 3eb773c7", + "3f76116a be1068d5 3f26f30e 3f26f30e 3f400000 3f000000 3e800000 -> 3f37267e 3f0182d8 3e87fcfc", + "3f684539 3f8c7fe6 3f1d02cd 3f8c7fe6 3f000000 3f000000 3f400000 -> 3f0e2e9c 3f02b06b 3f483fea", + "3f338b70 3f74c2c2 3f13d512 3f39e068 3f38df4c 3f4745f8 3f51e665 -> 3f4ac218 3f37e908 3f4ab9ae", + "3f9dd0ce 3e7169c0 3dbe92d3 3dbe92d3 00000000 3f800000 3e800000 -> bd60ef18 3f9b0a8c 3e92b7c4", + "befaa667 3f4f1cdc 3ec97018 3c9d38e4 be7dc06d be431feb 3dbe233b -> 3fa9c7d0 3f2de826 bc8a233a", + "3f5144ed be53b90d 3f05f48a be53b90d 3ef3304c 3f227bff 3ed390aa -> 3eb378ec 3f1d46cf 3e999f16", + "3f857bb4 3f490189 be3e902e 3f490189 3f5eab91 3f1fa50f 3f5eab91 -> 3f5f9925 3f28863e 3f5f9925", + "be7b1ecc 3f0401fa 3f8fe56d 3f0401fa 3f000000 3f000000 3f000000 -> 3f04fd95 3fa37d51 3f04fd95", + "3fb22e01 3f7ab69d be0396e5 3c1358f1 be2fed44 3d7e8d22 3d7e8d22 -> bf1f82bd 3e0c2c2d 3da9f36a", + "bb929f1c 3e3499bf 3ee9d7b7 3f1765fd 3e800000 3e800000 3e800000 -> 3e344361 3eea50f5 3f17ca1a", + "3fa3e077 3f5d4392 3f0064c5 3f5d4392 be580250 3e9ce77f 3f400aec -> bf0327ee 3e80e888 3f37da30", + "3f17f4bd 3cf61421 3f6096c6 3e0f6190 3f2b31f1 3edcb96f 3ed10b45 -> 3ed17c6e 3f1cc954 3e993878", + "3edc3f7e 3ee86f02 3f615221 3f9ca77f 3f8db72a be63046f 3efa1ffc -> 3f3c25cc 3ecff5c5 3f685494", + "3f857e5a 3e00ad0e 3f3f5b1c 3e00ad0e 3f3c00fc 3f44ad38 3f86a7b7 -> 3f42b128 3f44e7ae 3f8bbe77", + "3eadfe80 3f86ce4b 3e063289 3e063289 3f2e2eed 3f55088f 3f55088f -> 3f6d2e99 3ebd1672 3ebd1672", + "3efaf52e 3e7b06d4 3e7b06d4 3f4d4062 3f6b585e 3f6b585e be4e6154 -> 3f1359eb 3f1359eb 3e9eb723", + "befe9a7a 3f82d777 3ec43b3f 3f517c18 3f160b2a 3f6b5eee 3f6b5eee -> 3f9e996e 3deee684 3f449cc0", + "3f6269e3 3f40ef13 3f40ef13 bdc06bfa 3f800000 00000000 3f400000 -> 3f78b61a 3db261b8 3f2707c8", + "3f831076 be1a9399 be1a9399 3d9f9dee 3d01066d 3ef0f2ca 3e2b798a -> 3d12ea84 3ef89122 3e2dab54", + "3f129b76 be0c44f4 3f1219b3 3e6b5528 3f9ebb3f 3f444a6c 3f804f5a -> 3f26d241 3f2ed7f7 3f2c1a44", + "3f660176 3e29bce3 3e29bce3 3f1fe5e2 3ec65894 be4393e5 be4393e5 -> 3ebad2d2 be1e7bc7 bddd8c80", + "3f441891 3e359049 3e359049 3f75dcd1 3e800000 3f800000 3f400000 -> 3e6e94f6 3f4eb7aa 3f4c9a96", + "3f8a58c7 3f973425 3f973425 3f8796a5 3f4ab88d 3f381743 3f381743 -> 3f42a9ae 3f2e86df 3f310d24", + "3f28cd54 3f330eea 3f94d918 3f330eea 3f9e54db 3f91ef16 3f3f6859 -> 3f86e56f 3f92ed30 3f3b3382", + "bc9dc336 3eb9f1b0 bcff6d74 3eb9f1b0 3e4d1932 3ec4a3eb 3de5b14e -> 3ebb8cd5 bd2077fc 3ebc6b4e", + "3e93a18b bdeab9fd 3ec791bc 3ec791bc 3e33d7a1 3ed34960 3f417157 -> bcfd54e8 3ecaf2a8 3efd9493", + "3f105d02 3f83e06f 3f5716d2 3eaaa6ab 3e3c2176 3e3c2176 be47bbc4 -> 3f0d8a5a 3ef0a344 3d10cea0", + "be826b98 3f8fc623 3f6df85b 3ef5a1eb 3f726ea9 bdaaf83e be715b5e -> 3f958523 3f980405 3f29788e", + "bdbbe740 3f9dcc47 3ec63854 3f3871a2 3f6eeafe 3e5b6a33 3eff2652 -> 3fa150c8 3ece574e 3f3da95e", + "3f3ed0ee 3d918442 3ee23e4f 3f50026b 3ebbeb44 3ebbeb44 bda2923f -> 3e955550 3ec5ad66 3e1744d4", + "bdc8314f 3f97680a bcaf0ef8 3f32f8a5 00000000 3e800000 3e800000 -> 3fa634d8 bd442e7a 3f3e35b2", + "3e5216be 3d246b26 3e8f8559 3d246b26 3f732841 3f0f49b5 3e499fe8 -> 3e683882 3eacdee9 3d94134e", + "3e090442 3f228128 bd8ca844 be183c19 be6f510e 3ddfd48d 3d5bfbca -> 3f04c14e bd37c61a bdf9032c", + "3fa8c041 3eae2fc4 3e9f8eb4 3f28e18c 3f3f78eb 3f12d397 3e8696e9 -> 3f60b404 3f282c1e 3e0bcfe0", + "3ef90cf0 3eb73b6c 3ed621f5 3e8fba66 3ef77e9a 3f87d7e6 3f0a3392 -> 3ed67db8 3f3b2460 3ed043c2", + "3e9c7e30 3f1d8655 bd34d9b4 3f1d8655 3f800000 3f000000 3f000000 -> 3f3b9fac 3dfa32fa 3f148020", + "3e8b672c 3ecd3983 3f9e155a 3f37b1e0 3f5bbe8e 3f5bbe8e 3f84f8a6 -> 3f068109 3f90f4f5 3f4e16ab", + "3f066ad8 3ee51adf 3de23d18 3f9fe339 3f72eb36 3f93ef88 3f93ef88 -> 3f35f418 3f28c894 3f999cad", + "3e04497e 3f9ef847 3e0598e4 3e0598e4 3f936185 3f88e032 3f936185 -> 3f9d7903 3e80e631 3e8653e4", + "3f936278 3f1fdf64 3f969033 bd19820b 3f1466eb 3f34ae34 3d9bcccd -> 3f12aa36 3f227098 3dbf04c0", + "3fb995d4 3f8f0e5d 3f07f29b 3f8f0e5d 3f8d6162 be34c329 3f8d6162 -> 3f8ca064 befd5d2a 3f8ca064", + "3d84ed27 3f931911 3f6fb37d 3f331609 3ea5b15c 3d79d38c 3d79d38c -> 3f8c3d32 3f61281b 3f2879d2", + "3fa36af3 3f7373cb 3f8f601e 3cc0178e bd49b3b5 bb15cec4 be640cf0 -> bea6ea92 bea02ed4 be94e5f2", + "3f37b46a 3f660aae bc7630aa 3f66e3fd 3f8ed807 3f3a3c12 3ef31c1c -> 3f86fc8e 3f048e17 3f186e82", + "3f993d4a 3f74aebb 3f97e830 3f390247 3f1d5909 3f2ae791 3f3296eb -> 3f0c207b 3f10b275 3f3152e0", + "3fac63ec 3f985f54 3eb93570 3f9018a9 3ee1a065 3f8be9e2 3ee1a065 -> 3e390198 3fac60c4 3e4ff79c", + "bdcdde8d 3ecfce31 3e5e0d26 3f1b3208 3e145fee 3f990b73 be759381 -> 3edd3cad 3df29842 3f30f7ac", + "3f6b511e be4352db 3f9221c3 3cb97a51 3f75b829 be17d4f0 3f9e524d -> 3f5debef bd347360 3f91c3a8", + "3f5fceae 3f31e31d 3f31e31d 3f0a5d41 3e9418a8 3d4a8553 3dc2bd73 -> 3eae365d 3e05be0c 3e1ab962", + "3f85d5dd 3f2dcfc8 3f2dcfc8 3f6da483 3f9bf0fb 3f9bf0fb 3d32601b -> 3f9f16ae 3f9f16ae 3b52a300", + "3f62904c be3952c7 3ea89243 3ded14aa 3ebd8ee7 3f4e96dc 3f4e96dc -> 3e9d1b62 3f4086b0 3f3a3dfa", + "3f38f15f 3e83cef9 3f9ca122 3f9394a6 3f800000 3e800000 3f800000 -> 3f4b3c56 3f052f9f 3f856f58", + "bdf959c2 3de8eac9 3de8eac9 3dcaecb6 3f07edff bd386b41 bd9d45ed -> 3d80e064 3e08404d 3df6c7a8", + "3e94fc7e 3d3a5b0f 3d3a5b0f 3e092923 3f4c3b02 3e945583 3f9deaf4 -> 3e875fa6 3deeb7e4 3ee86efa", + "be282b0a 3f31e066 3f31e066 3efd1305 3e800000 3f800000 3e800000 -> 3f449400 3f250bee 3f08ceb3", + "3f94f3e7 3f01f48b 3f01f48b be7a748b 3f850cf8 3ecdbc81 3f6d38ba -> 3f90319a 3ec4de4f 3f8f26bd", + "be1dd6e5 3ee3aa60 3debc529 bce94921 3f937db6 3d856c5b 3d856c5b -> 3eabd21e 3dfb8bc1 bd2fc100", + "3f67f27e 3f4d03a8 3d8955e6 3f404db4 3f46ce38 3f46ce38 be1c0e28 -> 3f47638e 3f35bd4f bd8a3dc0", + "3f741334 3f6bca92 3eead457 3f4bf030 3e1932ab 3f81173b 3f864045 -> 3e3dff04 3f7b9fd2 3f84bf4f", + "3fa40e44 3f9fd6fa 3f672dee 3f672dee be19de32 3f833398 3f833398 -> bf0b5a02 3f879963 3f879963", + "3fae77d3 3f2f7877 3f2f0d1a 3f9937cd 3e00fe07 3dbcb6da 3dbcb6da -> bd9df848 bdfb2b68 be9e2fa0", + "bee21013 3d5d1985 3f04f880 3cc1de80 3f000000 3f400000 00000000 -> be1261e4 3ed5d0ac 3d0bbbe6", + "3f1979b7 3e724b08 3e724b08 3f5baf24 3f1d060b 3f99a057 bc90ec07 -> 3eeccb08 3f5075fd 3eaa87ea", + "3fba7b72 3e815038 3d317f2d 3f0dd274 3e270c10 3f353029 3f2ca219 -> 3dfa6904 3f817396 3f3ab5e7", + "3f25c83b 3f95a001 3f95a001 3f1e9ce7 3d04368c 3f162e0f 3f4278b7 -> 3edd9f34 3f4ab6d8 3f35d5a0", + "3f1ea0de 3ebdbc66 bdd11ad9 bdd11ad9 3f9a80cb 3f14135c 3f14135c -> 3f638e9a 3ea39fc6 3ea39fc6", + "3d807037 3f0cc82a 3f66122d be668d7b 3d0582cf 3f931e29 3d0582cf -> 3f0479e8 3f6a1853 be560022", + "bdb1bd1d 3f019a6d bd70c0d5 3f13e275 3f7b334f 3ea72e47 3f1ff2f2 -> 3eee19b8 bdbcdc1d 3f12d66b", + "3f0e0115 be1d40d8 bd93ee4b 3f84c5e9 be17b2c2 3e1c79e5 3e8d5d64 -> be1a2c02 3d57721e 3f1d7458", + "bef60302 be4984ad 3f7fadd7 3f2cf9ce be362321 3e16c025 3f886f25 -> be52d4a8 3fb43608 3ef9f4e0", + "3f6cc8aa 3df6ced0 3d89a715 3f54e538 3e6a9a17 3e396df7 3e6a9a17 -> 3e62414b 3e30ad4c 3e8c7508", + "3eb996dd 3d38c99e 3f9e70ae 3e38548e 3f000000 3f800000 3f800000 -> 3e570a72 3f9367ff 3ef458b5", + "3e2dc998 be19fd1f 3ecf4f67 be19fd1f 3ec4b11d 3f6578fc 3ec4b11d -> bd745e02 3efa0428 bd745e02", + "be8ca005 3f9cd11f bcc5c3d0 3f940569 3f92c3c5 3f87e22d 3f87e22d -> 3f9f93ea bea50a94 3f975ad7", + "3f4d8ef8 3e0206b2 3f3f1873 3e88a06d 3f14c990 3f98b9c4 3e329d4c -> 3efbc05c 3f8d75a0 3e454307", + "3fa5ee13 3f1910af be6035b5 3f1910af 3f8d7a44 3f8d7a44 3de51994 -> 3fa0b8fe 3fbfb4d2 bd03be20", + "3f08b9d3 3f11db8f 3f8c1cbb bdeb12ae 3f456841 3f1e4077 3f997d96 -> 3f2d63b9 3f5714a5 3f164380", + "3ea654a0 3eb80d65 3f442c93 be6fcb6c 00000000 3f800000 00000000 -> 3e788543 3f579c03 be21e4d6", + "3f02c12f 3f8f1752 3eae2f9b 3eae2f9b 3f15c5c1 3f15c5c1 3f16ab73 -> 3f588270 3eee36e0 3eef2183", + "be953330 3f24c090 3f0cbb28 3f24c090 3f953565 3f62d147 3d0d7694 -> 3efb9a52 3ee74a3a 3f522f80", + "be3c294e 3f6f966b 3f8e7171 3f252eed 3e885e08 3e885e08 3f37df54 -> 3f878aa8 3fa25a53 3f21bfc9", + "3e47dbda be63e7d0 be63e7d0 3f954570 3f042cc4 3f67a779 3f5846e1 -> bda0788c bb249d40 3f8d3e40", + "3f4b1306 3f56c9a5 3f56c9a5 3f3a2d47 3f46bbdc bd364ae3 bd364ae3 -> 3f4a0d85 3e0d7868 3deb9ed8", + "3f8b183b 3f65e957 3f974f58 3cdd0d89 3f83581b 3dbfaf9f 3f83581b -> 3f84c3c1 ba453000 3f8e6de6", + "3f934c8d 3e908a04 3f968a35 3f968a35 3f781b96 3f717f3c 3f781b96 -> 3f894f4c 3f688375 3f701ef8", + "3f4562fa 3f043ec9 3ece752b 3f004dd3 3f400000 00000000 00000000 -> 3f325193 3dbd14b8 3deb02a4", + "3f872bd5 be71c33f 3f4e51f8 3e20053f 3f371848 3ef38d35 bd468bdf -> 3f44bd2c 3eea1410 bd7587d8", + "3fa5873f 3d9c7945 3d9c7945 bd015b4a 3e4a50e2 3f5bfedd 3f5bfedd -> 3e6eb1d6 3f8b6177 3f8f6ee7", + "3fbd5999 3e3ae4fe 3e3ae4fe bdf22eb6 3f35005c 3f680f29 3f1e69ea -> 3f755c3c 3fa071eb 3f78d9bf", + "be08485b 3f533bb7 bcfb9782 3f491541 3f50a216 3eb588f3 3eb588f3 -> 3f53944d bda7e8ea 3f57c3c7", + "be27b28d 3f0f3e39 3e8fc69e 3f1e7c77 3e1d92de bd9b12b1 be23d888 -> 3f20400e 3eadabaa 3f3f262e", + "3f10f6cc 3f65dd14 3d00352a 3f65dd14 3f78e71e 3f11f1f1 bd5d2e63 -> 3f70a514 3eac3d09 3eb7be54", + "3f058f29 3f5786b4 3f37b482 3f66fe3b 3f4e634a 3f4e634a 3e353a07 -> 3f52c232 3f4389ff 3f061e19", + "3f9c9db7 3e822dd8 3e822dd8 3f82623b 3f000000 00000000 00000000 -> 3f0e1080 bd68d370 be693120", + "3db54395 3f94352b 3f0fc773 3f0fc773 3f800000 00000000 3f000000 -> 3f926b4d 3f030db4 3f0e61ed", + "beab9c8b 3e924821 3d38e1e5 3d38e1e5 3f44ede3 3d5ee637 3d5ee637 -> 3dfd327c 3d2c23d4 3d2c23d4", + "3db02182 3f0c5136 3e7f0ae8 3f0c5136 be102df7 be232f2d be232f2d -> 3efa4cb8 3e5b1312 3ef97b83", + "3f39f38c 3c345089 3ed615fe 3f4afa61 3e72f0bc 3e72f0bc bd6eb94f -> 3e338c84 3e92cff9 3e32cf98", + "be5f4a7b 3f218afb bd6cfe16 bd6cfe16 3f30669a 3f6739c8 3f6739c8 -> 3f1e4d92 be88ecc2 be88ecc2", + "3e52f036 3f501c87 3e7bfa71 3f501c87 3f798de4 3f798de4 3ea030b0 -> 3f58a5ff 3ecad984 3f35bda4", + "3e6b38bb 3f11381a be1eb1d7 be1eb1d7 3f523a69 3e1e85fe 3e944aec -> 3f2026fc bdaba768 bd5873aa", + "3f9279fc 3f1cc747 bc223eaa 3f1cc747 3d7db24d 3eccb855 3d7db24d -> bc8f8b80 3eeb00b6 bc8f8b80", + "3f602cea 3e8a1730 3e8a1730 3f6e0f77 3f3d9c52 3d6e71f3 3f9d9811 -> 3f2e9f62 3dad1174 3f98ccca", + "3f4f0486 3e416593 3e78bf11 3e416593 3f6e407d be19e625 be19e625 -> 3f49ea9c bd99b746 bdaee592", + "3f7bb7d0 be3d6651 3f3ef262 3f234bba 3f83d328 3f2c23b7 3f83d328 -> 3f81394f 3f2c743f 3f82fc4d", + "3f9a66e8 3ebc49d1 3f943830 3f943830 be781013 3eebfcd7 3f94b9bb -> bebc73c1 3ea25fa0 3f94d473", + "3db1e284 3eb46eec 3eb46eec be532644 be728a3d 3db1453d 3f99ad46 -> 3e9a3a5e 3ea89c4f bdac0ce7", + "3f99a508 be33dcdd 3e0001ba 3f9b7619 3f400000 00000000 3e800000 -> 3f6f79cf bccd2b08 3d687820", + "3fa0db04 3ef4d0ff 3f04981f 3e35bfa1 3ea20704 3ee48402 3f4c1c39 -> 3e8cc6dd 3edb1a33 3f74d6cd", + "bec1a00a 3f45bfc6 3f2a0747 3f45bfc6 3f23560b 3f50a828 3f50a828 -> 3f52c363 3f1b6b8f 3f419fc4", + "bea6980a 3ec33385 3f5e296c be5992c0 3f800000 3e800000 3e800000 -> 3e383e4c 3f88cfe9 beb9d4fa", + "bef8b553 3eceecf3 3ea34364 3f849794 3f0140d7 3f515a1b 3ee15087 -> 3eb5dea4 3d9cb91e 3fa9a342", + "3e09ecd4 3f946e9b 3f39eada 3f81d320 3f80cb8a 3f7ed4ab 3ebd1d35 -> 3f91c97f 3f433312 3f6d69a7", + "3fac9710 3f9d1834 3f5f9c91 3e8b1297 00000000 3f400000 3f800000 -> bedae6e0 3f34fce0 3fa07a6e", + "3f25570e 3f86cb51 3d196bb8 3f86cb51 3e800000 3f800000 3f000000 -> 3f08cea2 3f28bc60 3f322466", + "be661298 3f5cebd4 3da4f9c8 3f5cebd4 3f48fb99 3f50ce58 3f50ce58 -> 3f6166a6 bdad463a 3f5fa4ac", + "3ed98c59 3f0a5800 3f6eacc3 3f6eacc3 3e6a244d be514791 3e6a244d -> 3ed0ddd8 3ee61021 3f222242", + "3fa2a7e4 3f0fac9b bd367614 3f9981d1 3eec270c 3ec54a1e 3d0328b6 -> 3ede4a92 3f0070b5 be9169dc", + "3fb850b5 3f55e8ef 3f55809e 3f55809e be7f81a0 3ee1d95c 3ee1d95c -> bf3a17a7 3e895914 3e895914", + "be1ae346 3ebb7f23 3e7f92f5 3f70662b bc9c596d bd13d2c1 bd13d2c1 -> 3ed955c2 3e95e924 3f8b1452", + "3f8f4c85 3f6d7083 3f7fd69e 3f6d7083 3f255b97 3e3c52c9 3e3c52c9 -> 3f1cbe0c 3db10960 3dc2a118", + "be9586c8 3b92f8b2 3b92f8b2 3e678979 3d090bd6 3f8894a4 3f8894a4 -> bb824b6a be9c9544 bc9f8e10", + "3f8d006e 3d511be6 3eac7d0c 3f9c6d7c 3f047468 3f95bd37 3d7ea363 -> 3f1094d3 3fa0919e bd63f3c0", + "3fb38a8c be149cb2 be149cb2 3f991c78 3ee5e124 be2a078e 3dad4e7b -> 3f302ea8 be32a750 beb9d670", + "3dad78b1 3f68b35c bdf35714 3f1ce2f8 3f9f8f35 3f2e81f4 3f756fe8 -> 3f70053f bd50f4d6 3f246318", + "3f1e0573 3f25cb75 3f83417f 3f25cb75 3f6ba0db 3f1dc255 3eabb046 -> 3f50e6a6 3f45d9db 3ee8e32a", + "3f3504de 3f99052f 3f99052f 3ee4528b 3f29c60e 3f29c60e 3ea1a21f -> 3f51af7a 3f51af7a 3eb52a8a", + "beac135b 3f38a8e2 3e9ba009 3f38a8e2 3e497a70 3f375543 3e497a70 -> 3f65cae9 3e296511 3f65cae9", + "3f91bf45 3ea737d2 bdcae8c3 3f687e4a 3f000000 3e800000 3e800000 -> 3f0627a0 3e98c7cd 3e228dcc", + "3f598b63 3eec4452 3f7ef831 3eec4452 3f8b823d 3f87c391 3f8b823d -> 3f7ed999 3f868530 3f7ed999", + "bca46360 bb2cec99 bb2cec99 3f2ad29f 3e89e96c 3e74d0d3 3e74d0d3 -> bc04a84e bbf56746 3f2d05bf", + "bd72cb89 bbd780b2 3f7e4206 3f36d52b be3a0473 3f15f639 3f192a38 -> 3b7922a0 3f823858 3f38975e", + "3f80b09f 3f69f703 3f2ece3b 3f67862d 3f96fb35 3f989d48 3f989d48 -> 3f972a1f 3f98f744 3f98d022", + "3f986f77 3e51ca17 3e51ca17 3f88029b 3e8da5cc 3e10ef6c 3e8da5cc -> 3e94a9f2 3e048df2 3e01a908", + "3f1a4a8d 3f993eb7 3f841030 3f290fab 3ea5a468 3f8dad6b 3f482229 -> 3f2baf4a 3f89db92 3f3bc9d7", + "3b823097 bc1d0b8e 3e41690c bc1d0b8e bd5300bd bd5300bd 3ee51f6a -> bc1fc646 3e406ead bbfe94ed", + "bd805275 3f645fe9 3f645fe9 3f4c1da9 3f9cc212 3f9cc212 3f5e1df9 -> 3f5f0a38 3f5f0a38 3f4afcea", + "3fafd4b3 3ee5b8fe be029609 3ee5b8fe 3e360ec7 be5fe916 3e360ec7 -> 3d9cced4 be816454 3d9cced4", + "3f825140 3eb0ac7c 3ec6f8b8 3eb0ac7c 3ead83dd 3f97f910 3ead83dd -> 3ead7539 3f99d2e0 3ead7539", + "3f05fea6 3e66c356 3e66c356 3ed0f2f9 3f000000 3f000000 3e800000 -> 3ebcfbce 3ebcfbce 3ea69438", + "bd3d07a4 3d843e2c 3f357aaf be481812 3e800000 3f400000 3f000000 -> 3d656f2a 3f34fe63 be68f502", + "be3d1130 3e4d7486 3e86249e be794d3e 3f800000 00000000 00000000 -> 3d594a2c 3e9ee920 be93aa78", + "3f09b5e1 3f68bff6 3e8422a8 3e8422a8 3dab9388 be02cda3 3f894bc4 -> 3eee2ab5 3d4efdf0 3f323d4c", + "3f35cc2a 3f32e4fc 3f32e4fc 3f58eada 3f30b612 3f4a01c8 3f30b612 -> 3f315813 3f434ec7 3f3c5d78", + "bc4be1bc 3f8dbed9 3f85039c 3f9719db 3e85f095 3e81009e 3e81009e -> 3f8f17ba 3f86449b 3f989479", + "3fad5a63 3eb4bc8a 3eb4bc8a 3f22be01 3f800000 3f400000 3e800000 -> 3f9d57e9 3f6402a0 3de81bd0", + "bdfdf7ea 3f1500f4 be26f00c be26f00c 3f4256d6 3f8e8fee 3f8e8fee -> 3f0f61bb bea488fc bea488fc", + "3f4ee5d7 3f93869a 3ea18117 3ea18117 3e73e10a bdfbfa1f 3f767485 -> 3ed3bc60 bd1f7950 3f56ac24", + "3ee0fff0 3e5954fc 3f4819e4 3ef59ddd 3f599258 3f48df61 3dbf56e3 -> 3efc2327 3f4870ad 3e9eb370", + "3f837b85 3f5099f2 3ee5b6fe 3f5099f2 3ebce4b0 3f89911c 3e8f43a3 -> 3eb6ae83 3f8bbf46 3e87cfa8", + "be8adab5 3ee2781a 3f96b9e8 3ee2781a 3ea27007 3f9d8c65 3f7f9c23 -> 3ef3d5a1 3f94e042 3e953eac", + "3d981829 3e8b5961 3f287ef4 3f287ef4 3e74f488 3f2b4862 3e74f488 -> 3e8a189f 3f28b3f0 3f2087ce", + "3fb33891 3f7f5041 3ed3760e 3ec9de07 3f170445 3f9fd283 3c881a72 -> 3eda8fce 3fca9f66 be09bd36", + "3f9cec05 3ea12991 3e02f621 3e02f621 3f000000 00000000 3e800000 -> 3f0ab6e4 bcecba90 3e8e205c", + "3c97406e be3ee8d9 3ede2dfb 3f9a0984 be4caeae be4caeae 3ef6b65b -> be3f29f2 3ed83018 3f9854f8", + "bc521734 3f9c9f61 3e8edab9 bda97bf6 3f115451 3f89cbc3 3e2d2317 -> 3f9db2fc 3e899e50 bdb01906", + "3f7ab577 3f324296 be60f3c4 3f5a026b 3f21a960 3f634d11 3f21a960 -> 3f220133 3f5d70d1 3f22d385", + "3ee3c1aa 3eaa8224 3f10e69c 3f33b053 3d017b01 3f467164 3f0c6ac6 -> 3e4bb825 3f28b7e4 3f223822", + "3f3a0ab4 3f59c8a9 3efbc0dc 3f59c8a9 3f9537b0 3f65a2de 3eb1a101 -> 3f8a3295 3f49480a 3ef81def", + "3f95a439 3ef17567 3f00b05a 3f00b05a 3f493c35 3e4ffb9d 3f76a170 -> 3f56d8be 3e1c1d92 3f854928", + "be4f63cc 3f5137bf 3f5137bf 3f821e2a 3e829c8e 3f990fee 3f022e55 -> 3f6e5d38 3f3d9761 3f8f49aa", + "3b8775f0 be265f59 be265f59 3f7f8f37 bc8302c4 3f912e3e bdd3da31 -> be25c09c be20e223 3f7e64bc", + "3f9bd591 3f867893 3f9ac754 3f9ac754 3f800000 3f800000 3f000000 -> 3f7d2f8a 3f745a8c 3eb109f8", + "3f0a5a76 3f1887b0 3f0cd712 3f1887b0 3ee2d8c5 3f3f6a1c 3f3f6a1c -> 3f036527 3f282c34 3f2d8b7c", + "3d8c87ea 3f3d7454 be7f1231 3f3d7454 3f568584 3f8a66c4 3f79874f -> 3f3f2cab be2197d8 3f41939d", + "be67167d 3f338ff8 3f338ff8 3f34e37d 3e5f285b 3eafdf33 3e5f285b -> 3f4f7e93 3f483d68 3f511eb7", + "be80733d bd6288fb 3f9af4f2 3f9af4f2 3f6b32ab 3f3a4a11 3e82a798 -> be996efc 3faa76d6 3fb9a33b", + "bebdde34 3f992ef6 3ef61e76 3f88c9d7 3f0417e0 3f0417e0 3f030568 -> 3fb97f35 3eef6b3d 3fa33888", + "3f3a79e2 be19411f be19411f 3f8fd422 bd81476c 3f7c6455 3f82b329 -> bdb16920 3f2d7159 3f8643ed", + "3f1fef94 3f1231c0 3f996de4 3f06c83c 3f677924 3f206826 3f206826 -> 3f4778e6 3f575ce8 3f16ca8a", + "3e15805a 3f17f6ef 3f17f6ef bda465c0 3f965535 3f965535 3ecbe88c -> 3f2dacb0 3f2dacb0 bc2a8608", + "3fb698b3 3f6162d6 3f74f417 3f74f417 3f2aaaab 3f2aaaab 3f2aaaab -> 3f1353b2 3f0afb12 3f0afb12", + "bebc5b0d 3f8429f2 bdb2b6fe 3f83e266 00000000 3e800000 00000000 -> 3fb4c8da be586882 3fb466fc", + "3f93db58 3d93fc5e 3f52cb47 3eb3d601 3f6f4dc1 3f262e7c bdbea9dd -> 3f88c75e 3f1f42c3 be25eac6", + "bdf8948d 3f964059 3eaf8219 3eaf8219 3f4d5a46 3f590d35 3f3aad65 -> 3f9c06a0 3e901ee6 3e977e82", + "3e48d630 3ee24154 3f758409 3ee24154 3f8e51be 3e7e494f 3edc7476 -> 3f12c417 3f51d4c5 3ee11e1a", + "3df5f90f 3f12849b bd732735 3e722120 3f15347d 3ec6ab63 3f15347d -> 3f12d739 bbb87e20 3e8e5d55", + "3e6cd4c0 bd22cd17 bd22cd17 3e8de68a bde27e91 3f77be80 3f77be80 -> bd65ea74 3e45e802 3edfadae", + "bccf1d93 3f0f8d60 3f8f10e7 bd2c702c 3e8af37b 3e2397c3 be1cfff2 -> 3f116cd3 3f922a86 bd20eb9e", + "3fa45659 3f395c02 3f395c02 3f6f3b33 3f8ca437 3ee5e49c 3f2b8fae -> 3f9a41d1 3ebdea27 3f1859ca", + "3f700945 3f527e5a 3f3207ea 3f3207ea 3e800000 3f400000 00000000 -> 3e924530 3f3f2100 3d31a0c0", + "3eb98329 be454b67 3f7a54f8 3f2e0de3 3f5de11c 3f3a2c06 bd2e3b52 -> 3e43c399 3f6315bd 3ed6166e", + "bc8707c6 3e7d05c3 3ddc9bfe 3ddc9bfe 3ec7fb3b 3c97c39c be56b6c6 -> 3e7a99b8 3ddf9ecc 3de752f4", + "beff3ae2 be52084d 3f875f1c 3f875f1c 3f813ddc 3dd29d47 3dd29d47 -> bf4f893e 3fc44ab3 3fc44ab3", + "3f1fbe2b 3dff3062 3f5069e5 3f802ba7 00000000 3f400000 00000000 -> 3d3fe788 3f462bee 3ec0c552", + "3f77a2c5 3f9dc5d6 3f4466eb 3f4466eb 3f4fd225 3f8a2d43 3f8a2d43 -> 3f53572c 3f88dee6 3f88dee6", + "3f06afeb 3ed51c87 3ed51c87 3e9cf1ed 3f91cdb3 3ee17fda 3ee17fda -> 3f4bea4d 3edba108 3ec10353", + "3fa76349 3f9463e7 3e9f9e20 3f6742ed 3f7ad259 3f7ad259 3f904ec6 -> 3f6cade9 3f97b900 3f9921d2", + "3f023da9 3f2f0845 3f2f0845 3f87f8bb 3f400000 3f800000 3f000000 -> 3f37aa28 3f583992 3f46b62c", + "be00f6b9 3f09c21b 3e195fcd 3e195fcd 3e25ca88 3f9c8ad1 3e290b6d -> 3f15e33f 3c6f82d0 3e176692", + "3ec5a1e8 bd662608 bc982691 bc982691 00000000 3f000000 3f800000 -> bd0d4f9e 3e39f475 3ebfcb2e", + "3f62bb63 3f50fbc9 3f5654d4 3f50fbc9 3f15df89 3d53527c 3f15df89 -> 3f1ca194 3e10ce98 3f1ca194", + "3f8c5ed9 3df65f8f 3d4982a4 3d46fd9f 3ebdb875 3e555546 3f8d12f4 -> 3eca1a74 3e6514f5 3f9a1b6a", + "3eb3d9f1 3ea7d9bc 3f812444 3f812444 3f1f703e 3f96a1c0 3f0f0d64 -> 3edce6e2 3f88b0c9 3f59ce4e", + "3f1e01e4 3f8f578f 3f8f578f 3d79c828 be6a4f30 be6a4f30 3e48e653 -> 3e932a8a 3e932a8a 3e13e6d5", + "3fa58102 3ef94c99 3f4092f6 3f66325a 3f11c02c 3e766680 3f6f1645 -> 3f17eeeb 3db9cc60 3f71b11d", + "3eff125f bded92f9 3e8cf0e2 bded92f9 3f7c454d 3f9e2bf6 3f9e2bf6 -> 3edd8d32 3f40f611 3f0eb22c", + "3fa3945e 3f393648 3eaa1161 3eada1f8 3dfa8b80 bd2ffcbf 3f21bb69 -> bd375850 be16c5ba 3f368e59", + "3f1c9e64 3f3fd5a8 3f8618ed be3d451b 3f4553c4 3f30a51d 3f4553c4 -> 3f4331e7 3f542f72 3eccb552", + "3d57d25e bda077ac 3e5b7964 3e5b7964 3f000000 3f000000 00000000 -> bd441d1d 3e6ae33b 3e4fe8ef", + "be8afe95 3efa9d2c 3f5b82b9 3e6227e5 3f56bdd0 3f32231c 3e45d827 -> 3eca0e46 3f66be11 3e69d777", + "3fa3035f bd0f58d8 3d9af56b 3f1c8fe6 3ec04831 3e726082 3ec04831 -> 3ef9c7c1 3e8fbdd8 3e9f3a0e", + "3fa82fe4 3e2f317f be4d07ca 3e2f317f 3f7779ea 3f840417 3f7779ea -> 3f9bb62d 3fb582a7 3f9bb62d", + "3f30a30a 3ca9a342 3ea2704a 3eec6f1c 3f000000 00000000 3f000000 -> 3eb3ec7a 3dc96e8e 3ef9ef2f", + "be90cfb1 3e9f637e 3e9f637e 3f056d7f 3d66ff2e 3ea5c890 3ea5c890 -> 3ec44d72 3e9d9479 3f13b896", + "3f738dd9 3f9355f0 3d22c5c9 bd8e651a 3d5e6c02 be23abee 3f0756d2 -> 3ddc6980 be19bc6d 3effc9be", + "3faecae1 3b62e5a3 3b62e5a3 3e9c8ed9 3f051ed1 3e5461a2 3e5461a2 -> 3f3575f0 3e905cc7 3e2f8e62", + "3c2232f0 3e9f6a7f 3b687a63 bbbf8180 3f6f65bb 3f79a08d 3f1022d7 -> 3ea293eb 3c57b492 b95ed680", + "3ed2d645 3f7ed417 3ec456e3 3f7ed417 3f51cea2 3db17680 3f6a8999 -> 3f6c4a03 3e85c20d 3f76790b", + "3f1d39df bc2b7ac3 3e873e41 bc2b7ac3 3e56b811 3e56b811 3d5c8db2 -> 3dff79a2 3e6c3c6e 3cedd4a8", + "3f9bb319 3f69a3ee 3edc0d2a 3f69a3ee 3f800000 3f000000 3f400000 -> 3f826b5a 3f03e3c3 3f36fd28", + "3f7938da 3e80839a 3ef7553d 3f73a031 3f319332 3f2af0bb 3f319332 -> 3f2e9322 3f29b050 3f3352e2", + "3fb37dfe bd8f7080 bd847886 3edccf72 3f70d0d4 3e0932a7 3f958772 -> 3fac73c9 3e5b0917 3fbb7998", + "bec9389d 3d61fb59 3f6e523f 3f091647 3eace9e2 3eace9e2 3f6ba852 -> bd64dbfd 3f9500b6 3ec4b217", + "3f5f915c 3ef73abe 3e716020 3ef73abe 3e83fbbd 3e71ada6 3e71ada6 -> 3e92956c 3e71a3d4 3e88d9f0", + "3fbf1944 bd678928 3f08c9ce 3f08cafe 3f540b9e 3f030cc5 3ec85471 -> 3fa1dab2 3f003899 3ea437b9", + "3fb32012 3e5e9b13 3f3709f9 3f210995 3dd632de 3e126cfd 3f2261eb -> 3d73db5c bdaf0c78 3f22eb74", + "beb0fb45 3f849c86 3f93acfb 3f93acfb 3f7d5559 3c9cc95e 3f914504 -> 3f86aa94 3fc5e022 3f9481e6", + "3f8d44f3 3f7e4542 3f54f58f 3f7e4542 3f988150 3f263428 3f988150 -> 3f9b2298 3f215b54 3f9b2298", + "bea4a9c5 3f93dd6a 3f967eaf 3f93dd6a 3ef02b02 3f69d7df 3f0c5e01 -> 3fb01c03 3fa14ad2 3facd90a", + "bdf7f4e8 3f3bf3fe 3ead5732 3f140286 3f991fe7 3ca68d6a 3f856180 -> 3f2da174 3ec1112d 3f05a1dc", + "3b945d39 3ea4f92c 3f7314f6 bcfe4805 3f78bc7b 3f9e0d24 3f78bc7b -> 3ea67a92 3f736999 bcd91766", + "3eb90afd be7af69f 3f9f4622 3f9f4622 3e69bcee 3e69bcee be0daf7a -> bd9792b0 3f608a32 3f3e9e83", + "3eca3cb0 3d04e1be bdaab985 3f75d0ab 3f000000 3e800000 3f000000 -> 3e5e55ec 3d45e532 3f474760", + "3fa7101b bd09bbf4 3f85c7c8 3f88fb4a 3f5fa2bc 3f8b609a 3e35dd9d -> 3f93417f 3f8d15de bdc220c0", + "bc55bf66 3f1fb054 3f1fb054 be614e84 3f000000 3e800000 3f400000 -> 3f201a2a 3f20efe9 be6e43f8", + "3f98cea1 3dc5c0de 3dc5c0de be40a102 3f8e141d 3cca8a25 3db12083 -> 3fa73807 3c30fad8 3e0f0f6c" + ] + }, + { + "function": "cycles_mix_add", + "node": "ShaderNodeMix RGBA ADD", + "cases": [ + "00000000 00000000 00000000 00000000 3f72e1aa 3ec35e1c 3f01b72a -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 be645dac be645dac 3e3ba288 -> bde45dac bde45dac 3eaee8a2", + "3f800000 00000000 00000000 3f000000 bdb7e249 3c6b90bb 3f956d21 -> bdb7e249 3c6b90bb 3fd56d21", + "3fc00000 00000000 00000000 3f400000 3d5ba888 3e8c3ec5 3efd1225 -> 3da4be66 3ed25e28 3fbee6ce", + "bf000000 00000000 00000000 3f800000 3f836f67 bd278d7d 3f836f67 -> bf036f67 3ca78d7d 3ef92130", + "3e800000 00000000 3e800000 00000000 3e253cc6 3f77f3fa 3e2a08d9 -> 3d253cc6 3efbf9fd 3d2a08d9", + "3f400000 00000000 3e800000 3e800000 3e800000 3e800000 3f400000 -> 3e400000 3ee00000 3f500000", + "40000000 00000000 3e800000 3f000000 3ebb58e6 3f213a3c 3ebb58e6 -> 3f3b58e6 3fc13a3c 3f9dac73", + "00000000 00000000 3e800000 3f400000 3e465035 bc8a6bfc 3f8f6531 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3e259bec 3e259bec 3f9b0282 -> 3da59bec 3ea966fb 3fcd8141", + "3f800000 00000000 3f000000 00000000 3e81a225 be139ff4 3f197979 -> 3e81a225 3eb63006 3f197979", + "3fc00000 00000000 3f000000 3e800000 3f195180 3f0994a7 3f0994a7 -> 3f65fa40 3fa72f7e 3f872f7d", + "bf000000 00000000 3f000000 3f000000 3eb1bb63 3f50a08f 3f50a08f -> be31bb63 3dbd7dc0 3dbd7dc0", + "3e800000 00000000 3f000000 3f400000 3f800000 00000000 3f800000 -> 3e800000 3f000000 3f800000", + "3f400000 00000000 3f000000 3f800000 be40d265 3e775247 3e775247 -> be109dcc 3f2e5f6e 3f972fb7", + "40000000 00000000 3f400000 00000000 bdac9506 3f6d28af bb8b2824 -> be2c9506 40269458 bc0b2824", + "00000000 00000000 3f400000 3e800000 3f581e96 bd82cc41 be693bb9 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3eb10bee 3f552477 bd87ab20 -> 3e310bee 3f95491e 3eef0a9c", + "3f800000 00000000 3f400000 3f400000 3e3ad1b9 3f1b488c 3f65b659 -> 3e3ad1b9 3fada446 3fd2db2c", + "3fc00000 00000000 3f400000 3f800000 3f400000 3f400000 3f800000 -> 3f900000 3ff00000 40200000", + "bf000000 00000000 3f800000 00000000 3f86befa 3f240b9c 3f169ea3 -> bf06befa 3f2dfa32 be969ea3", + "3e800000 00000000 3f800000 3e800000 3d6d4315 3f4e8c77 3f889e8c -> 3c6d4315 3f99d18f 3f044f46", + "3f400000 00000000 3f800000 3f000000 3f31038c 3f31038c 3dbbf1d9 -> 3f04c2a9 3fc26154 3f119eac", + "40000000 00000000 3f800000 3f400000 3f839d69 bdf383d5 bdf383d5 -> 40039d69 3f431f0a 3f031f0a", + "00000000 00000000 3f800000 3f800000 3f9c72c3 3f783526 3e96de95 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 be43eac8 bd8780f9 be70a186 -> 3e1e0a9c bd0780f9 bdf0a186", + "3f800000 3e800000 00000000 3e800000 3d98c016 3f7d1586 3f7d1586 -> 3ea63006 3f7d1586 3f9e8ac3", + "3fc00000 3e800000 00000000 3f000000 3f1965e5 3f2599f7 3ec8b8eb -> 3f930c6c 3f7866f2 3f8b4558", + "bf000000 3e800000 00000000 3f400000 3f400000 3e800000 3e800000 -> be000000 be000000 3f200000", + "3e800000 3e800000 00000000 3f800000 3f8c9249 3f0fe14b 3f11d5f2 -> 3f064924 3e0fe14b 3f923abe", + "3f400000 3e800000 3e800000 00000000 be5128b7 be5128b7 3f7c1402 -> 3dc642ee 3dc642ee 3f3d0f02", + "40000000 3e800000 3e800000 3e800000 3f654fdd 3f14181b 3e4df774 -> 4002a7ee 3fb4181b 3f26fbba", + "00000000 3e800000 3e800000 3f000000 3f000000 3f400000 3f000000 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f30c427 3f66d7aa 3f8a5ff8 -> 3f186214 3f336bd5 3fa52ffc", + "3f800000 3e800000 3e800000 3f800000 3f396d57 3f396d57 3ebae3b8 -> 3f796d57 3f796d57 3faeb8ee", + "3fc00000 3e800000 3f000000 00000000 3f9ffd4c 3ee7d368 be6ba4e3 -> 4007fdf9 3f96ef47 beb0bbaa", + "bf000000 3e800000 3f000000 3e800000 3ee9e9eb 3f8f2ede 3e3c6046 -> 3cb0b0a0 bd72ede0 3e21cfdd", + "3e800000 3e800000 3f000000 3f000000 be34ad3e be34ad3e 3f985a3d -> 3e52d4b0 3ee96a58 3f4c2d1e", + "3f400000 3e800000 3f000000 3f400000 3ee4b4f2 3f4609f7 3f9a2bac -> 3f15c3db 3f8a43bd 3fd3a0c1", + "40000000 3e800000 3f000000 3f800000 3f868609 3e1d06d9 3e950548 -> 40168609 3f4e836c 3fca82a4", + "00000000 3e800000 3f400000 00000000 3da110a4 3da110a4 3eb5f0b9 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3d10f365 3f8b193c bd00e872 -> 3e890f36 3fa58c9e 3e6fe2f2", + "3f800000 3e800000 3f400000 3f000000 3e1f0ce9 3e9aed41 3e9aed41 -> 3ecf8674 3f86bb50 3f4d76a0", + "3fc00000 3e800000 3f400000 3f400000 3f5ba6f0 3f10e3bb 3f10e3bb -> 3fc4bd34 3fccaacd 3fccaacd", + "bf000000 3e800000 3f400000 3f800000 bde5a55b bde5a55b 3f98b2b6 -> 3e9cb4ac 3f4e5a56 3ece9a94", + "3e800000 3e800000 3f800000 00000000 bdee0dae 3eb91a3b 3eb91a3b -> 3e623e4a 3f8b91a4 3db91a3b", + "3f400000 3e800000 3f800000 3e800000 3ece5f98 3f2fca24 3f986f98 -> 3f0d63d9 3fc1ebce 3f9253b2", + "40000000 3e800000 3f800000 3f000000 3f94e413 3f5173c7 3f9c8c2c -> 4024e413 4028b9e4 403c8c2c", + "00000000 3e800000 3f800000 3f400000 3f047504 3edd8c6e 3edd8c6e -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3ee3b940 3f393ffd 3f661704 -> 3ef1dca0 3fae4fff 3fb985c1", + "3f800000 3f000000 00000000 00000000 3d6f6fa0 3f15fd6a 3f15fd6a -> 3f0ef6fa 3f15fd6a 3f15fd6a", + "3fc00000 3f000000 00000000 3e800000 3f90478f 3f68a45c 3f95e634 -> 400c35ab 3fae7b45 40006ca7", + "bf000000 3f000000 00000000 3f000000 3f000000 3e800000 00000000 -> 3e800000 be000000 3f000000", + "3e800000 3f000000 00000000 3f400000 3e9bbc69 3e9bbc69 3f607de8 -> 3f13778d 3d9bbc69 3f781f7a", + "3f400000 3f000000 00000000 3f800000 3f621d7d 3f4c1257 3f2c3e53 -> 3f94cb0e 3f190dc1 3fc09760", + "40000000 3f000000 3e800000 00000000 3f000000 3f400000 00000000 -> 3fc00000 3fe00000 00000000", + "00000000 3f000000 3e800000 3e800000 3edd459c 3edd459c 3f757e59 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 be2d8fec be0cc9e1 3e98ebf7 -> 3ed49c05 3e399b10 3f263afe", + "3f800000 3f000000 3e800000 3f400000 3f9e2642 3f1560bc 3f1560bc -> 3fde2642 3f5560bc 3faab05e", + "3fc00000 3f000000 3e800000 3f800000 3d93ea4c bde43c56 3f10d33f -> 3f1bbbef 3da9a580 3fec9e70", + "bf000000 3f000000 3f000000 00000000 be29c38b 3c07b68a 3c07b68a -> 3f153872 3efde126 bb87b68a", + "3e800000 3f000000 3f000000 3e800000 3f768e23 3f5dec61 3f5dec61 -> 3f3da389 3f377b18 3eeef630", + "3f400000 3f000000 3f000000 3f000000 bbd5c1c3 3ef4a39e 3f35186f -> 3efd7ebb 3f5bbd5b 3f83e92a", + "40000000 3f000000 3f000000 3f400000 bc8e7ba8 3ebfc594 3f9435b9 -> 3eee308c 3f9fe2ca 404435b9", + "00000000 3f000000 3f000000 3f800000 00000000 3f400000 3f400000 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3ee47555 3de51141 3eadc7fb -> 3f391d55 3f4e5114 3e2dc7fb", + "3f800000 3f000000 3f400000 3e800000 3f8d7f0d bcd66e54 bcd66e54 -> 3fcd7f0d 3f394c8d 3e653236", + "3fc00000 3f000000 3f400000 3f000000 3be03b41 3ef36602 3ee070d0 -> 3f02a0b2 3fbb4640 3f942a4e", + "bf000000 3f000000 3f400000 3f400000 3eac63af 3e6953eb 3f4bed5d -> 3ea9ce28 3f22d582 3eb412a4", + "3e800000 3f000000 3f400000 3f800000 3d7d1dfa bd62096f be68862b -> 3f03f478 3f3c77da 3f71779d", + "3f400000 3f000000 3f800000 00000000 3f1430c7 3f1430c7 3f32f51a -> 3f6f2496 3fb7924b 3f0637d4", + "40000000 3f000000 3f800000 3e800000 3e7b958b 3e1e46c4 3e1e46c4 -> 3f7dcac6 3fa791b0 3f0f2362", + "00000000 3f000000 3f800000 3f000000 3ed64384 3f90e23a 3f90e23a -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3f04bf95 3f1a8f7a 3e53e7a7 -> 3f425fca 3fa6a3de 3f5a7cf5", + "3f800000 3f000000 3f800000 3f800000 3f788afe 3f886379 3f886379 -> 3fbc457f 400431bc 400431bc", + "3fc00000 3f400000 00000000 00000000 be0ae996 3f83079c be0ae996 -> 3f0be867 3fc48b6a be505e61", + "bf000000 3f400000 00000000 3e800000 3f7ebb01 3f032dfa 3f032dfa -> 3e814500 be832dfa bbcb7e80", + "3e800000 3f400000 00000000 3f000000 3f627712 3f627712 3f8df460 -> 3f789dc4 3e627712 3f46fa30", + "3f400000 3f400000 00000000 3f400000 3f43920b 3f6db6ec 3f43920b -> 3fa956c4 3f324931 3fa956c4", + "40000000 3f400000 00000000 3f800000 3f3199a0 3ec68dd3 3f25ccb4 -> 4008ccd0 3f468dd3 4012e65a", + "00000000 3f400000 3e800000 00000000 3f6c356a 3f6c356a 3eac4247 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3e9ecb28 3d4a8975 3f22a259 -> 3f67b2ca 3e8ca898 3f11512c", + "3f800000 3f400000 3e800000 3f000000 bdcf97a1 be6c14cc bdcf97a1 -> 3f260d0c 3c9f59a0 3ecc1a18", + "3fc00000 3f400000 3e800000 3f400000 3f687266 3f687266 3e082653 -> 40072ae6 3fce55cc 3f730e60", + "bf000000 3f400000 3e800000 3f800000 3f7481a9 3f8f7905 3f7481a9 -> 3e8b7e58 be9ef20a 3f05bf2c", + "3e800000 3f400000 3f000000 00000000 3f889aec 3f466dd1 3e8debcc -> 3f8226bb 3f319b74 3d8debcc", + "3f400000 3f400000 3f000000 3e800000 be4bbcd8 be4bbcd8 be357f14 -> 3f19cc98 3eb3992f 3defc162", + "40000000 3f400000 3f000000 3f000000 3e800000 3e800000 00000000 -> 3fa00000 3f800000 3f000000", + "00000000 3f400000 3f000000 3f400000 bce890bd 3d6c1c4d bce890bd -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f560726 3db6eba5 3ec3110a -> 3f9581ca 3f0b6eba 3f986221", + "3f800000 3f400000 3f400000 00000000 3f8666f1 3f8a86f4 3f7ee9d7 -> 3fe666f1 3fea86f4 3f7ee9d7", + "3fc00000 3f400000 3f400000 3e800000 be7121c0 3f85b1d4 be7121c0 -> 3ecb26b0 4014455f bdd36540", + "bf000000 3f400000 3f400000 3f000000 bdceaac8 3f76e316 3f76e316 -> 3f4ceaac 3e891cea 3c91cea0", + "3e800000 3f400000 3f400000 3f400000 3f9383a0 3f238101 3f9383a0 -> 3f84e0e8 3f68e040 3f84e0e8", + "3f400000 3f400000 3f400000 3f800000 3f769e11 3f8221a9 bd208bd7 -> 3fbc7b46 3fc1993f 3f787972", + "40000000 3f400000 3f800000 00000000 3eb43d43 3eb43d43 be09ffc2 -> 3fba1ea2 3fda1ea2 be89ffc2", + "00000000 3f400000 3f800000 3e800000 3f724a9f 3d6a6e92 3f724a9f -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f883a49 3e7ce88c 3e7ce88c -> 3fa41d24 3f8fce89 3f1f9d12", + "3f800000 3f400000 3f800000 3f400000 3f05a7b1 3f01c486 3c3a19d5 -> 3fa2d3d8 3fc0e243 3f42e867", + "3fc00000 3f400000 3f800000 3f800000 00000000 3f000000 00000000 -> 3f400000 3fe00000 3f800000", + "bf000000 3f800000 00000000 00000000 3e0753c2 3f082bcc 3e0753c2 -> 3f6f1588 be882bcc bd8753c2", + "3e800000 3f800000 00000000 3e800000 3dddc7cc 3dddc7cc be52b90d -> 3f83771f 3cddc7cc 3e4b51bd", + "3f400000 3f800000 00000000 3f000000 3f9a0c62 3f182333 3f25a06b -> 3ff3894a 3ee434cc 3f7c3851", + "40000000 3f800000 00000000 3f400000 3f6d34dc 3f6d34dc 3f7a95f3 -> 40369a6e 3fed34dc 402d4afa", + "00000000 3f800000 00000000 3f800000 3f9a66a3 3f9aba2e 3e388641 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f5b4869 3da99687 3f8ad998 -> 3fb6d21a 3e9532d1 3f0ad998", + "3f800000 3f800000 3e800000 3e800000 be3d7c3d 3df09808 3f99d061 -> 3f50a0f1 3ebc2602 3fb9d061", + "3fc00000 3f800000 3e800000 3f000000 3e01e551 3e01e551 3e9e8ba7 -> 3f985aff 3ee16bfc 3f76e8be", + "bf000000 3f800000 3e800000 3f400000 3f1cea37 3f1cea37 3f19047d -> 3f318ae4 bd6751b8 3ee6fb84", + "3e800000 3f800000 3e800000 3f800000 be800000 be800000 be800000 -> 3f700000 3e400000 3f700000", + "3f400000 3f800000 3f000000 00000000 be5385c7 3f61ad08 3f3586d4 -> 3f5856ea 3f94a0e3 3f08251f", + "40000000 3f800000 3f000000 3e800000 3f400000 3e800000 00000000 -> 40200000 3f800000 3e800000", + "00000000 3f800000 3f000000 3f000000 3f0c0e8d 3f0c0e8d 3e1d8773 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3e3b0bb4 3d9ba5d6 3f9ac18d -> 3f8bb0bb 3f09ba5e 3fad60c6", + "3f800000 3f800000 3f000000 3f800000 3e800000 3f000000 3f800000 -> 3fa00000 3f800000 40000000", + "3fc00000 3f800000 3f400000 00000000 3f7129a5 3f2c9548 3f2c9548 -> 401a6f9e 3fe16ff6 3f816ff6", + "bf000000 3f800000 3f400000 3e800000 bd218309 bd218309 bdae8e4f -> 3f82860c 3f450c18 3e95d1ca", + "3e800000 3f800000 3f400000 3f000000 be098fd3 3dc8a9e7 3b01356f -> 3f776703 3f46454f 3f00204d", + "3f400000 3f800000 3f400000 3f400000 3e8b00ce be3f5fee be3f5fee -> 3f9a1027 3f1c1e03 3f1c1e03", + "40000000 3f800000 3f400000 3f800000 3f251a18 3f94e024 3f3d6c7e -> 40128d0c 4044e024 401eb63f", + "00000000 3f800000 3f800000 00000000 3ec67471 3ec67471 3f28a285 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f9f430a 3d291ef5 3f124069 -> 3fcfa185 3f82a47c 3f092034", + "3f800000 3f800000 3f800000 3f000000 3d47a82f 3d47a82f 3f1bf939 -> 3f863d41 3f863d41 3f8dfc9c", + "3fc00000 3f800000 3f800000 3f400000 3f75c714 3e9fad46 3f75c714 -> 401c2aa8 3fbbe0fb 400c2aa8", + "bf000000 3f800000 3f800000 3f800000 3f6ee5e9 3f53cdab 3f1f76ea -> 3f088d0c 3f16192a 3f30448b", + "3e800000 00000000 00000000 00000000 3e996d97 3f5b768e 3f5b768e -> 3d996d97 3e5b768e 3e5b768e", + "3f400000 3e800000 3e800000 3e800000 3f97e178 3f41839e 3f41839e -> 3f91e91a 3f5122b6 3f5122b6", + "40000000 3f000000 3f000000 3f000000 3f3536c9 3efa3241 3f6dff93 -> 3ff536c8 3fbd1920 4016ffca", + "00000000 3f400000 3f400000 3f400000 3f1d18f6 3f1d18f6 3f8333fb -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f3ba408 bd0bdba7 bdf6775d -> 3faee902 3f7ba123 3f70988a", + "3f800000 3fa00000 3fa00000 3fa00000 3ef9b964 3f6e8bea 3e915581 -> 3fde6e59 400ba2fa 3fc45560", + "3fc00000 be800000 be800000 be800000 bdbeb318 3f811fb9 3f47aff4 -> bec78329 3fa1af96 3f6b87ee", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3cb3cddf 3cb3cddf 3f63c83c -> 3db65311 3db65311 beb09509", + "3e800000 3f666666 3f666666 3f666666 3ea34958 3ed35b59 3ea34958 -> 3f7acf91 3f8068e8 3f7acf91", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f000000 3e800000 3f800000 -> 3f355555 3f055555 3f8aaaaa", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3ebe1507 3f733c97 3e1c3ea0 -> 3fb45fd8 402448f6 3f78c9fb", + "00000000 3f571357 3f49458e 3e53befe 3e47b0a9 bd98f749 3e47b0a9 -> 3f571357 3f49458e 3e53befe", + "3f000000 3f5c861d 3f063bb2 3f692508 3f8681c0 3f0a8270 3f39da01 -> 3fb183ee 3f4b7cea 3fa30904", + "3f800000 3e898dc0 3e7f6e46 3f77a5a6 3f000000 00000000 3e800000 -> 3f44c6e0 3e7f6e46 3f9bd2d3", + "3fc00000 3f6ca06f be691f17 be691f17 3f85e271 3f125b4b 3f94a0d8 -> 401f91f0 3f21412a 3fc1cd61", + "bf000000 3f5472ee 3f599b7e 3f599b7e 3f373526 3e6d20a3 3e6d20a3 -> 3ef1b0b6 3f3bf76a 3f3bf76a", + "3e800000 bdd7f391 3f0f42ac bdd7f391 bdb4805f 3f9fcaac 3f468384 -> be0289d4 3f5f2802 3db51377", + "3f400000 3f46ef22 3e0c00ca 3f0b42fb 3f875273 3f59ce0b bcfd9925 -> 3fc8f567 3f465abc 3f055164", + "40000000 3f3f884f 3f962307 3f3ded1a 00000000 00000000 3f400000 -> 3f3f884f 3f962307 400f7b46", + "00000000 3f79255d bdbf67e1 3f303969 3f4ffcb7 3e2cef9e 3f4ffcb7 -> 3f79255d bdbf67e1 3f303969", + "3f000000 bd98acf2 3e6daf26 3f998dbe 3e4873d2 3f8bb0e8 3f96ffc0 -> 3cbf1b80 3f471cb2 3fe50d9e", + "3f800000 3f83dac9 3f281a1d be6f8716 3f255448 3f0be164 3f255448 -> 3fd684ed 3f99fdc0 3ed2e505", + "3fc00000 3e97d962 be429d07 3e9dba3e 3f400000 3f800000 3f000000 -> 3fb5f658 3fa7ac5f 3f876e90", + "bf000000 3c7a9e49 3c7a9e49 3f697f1c be694162 3db8583e be241f02 -> 3e044a96 bcf36158 3f7e02fc", + "3e800000 3f955bff 3f677365 3f088745 3f894748 bd7e4164 bd7e4164 -> 3fb7add1 3f637a60 3f048e40", + "3f400000 3ed8556f 3f9df15f 3f9df15f be5386ff be7fd096 3d22ae39 -> 3e8902d0 3f85f5d1 3fa1c174", + "40000000 3f3881d8 3f3881d8 be04d2f2 3f8c8bd3 bd00078d bd00078d -> 403aac49 3f2880e6 be44d6b8", + "00000000 bd770c26 3f9c4fe8 3f9df7a4 3ed5aeb5 bde9d57e bde9d57e -> bd770c26 3f9c4fe8 3f9df7a4", + "3f000000 3eb4c29c 3f74f043 3f74f043 3f800000 3e800000 3f800000 -> 3f5a614e 3f8a7822 3fba7822", + "3f800000 3f151505 3f88b296 3f9a7fe9 3cd330f2 3de2bc24 3e55e3b0 -> 3f1bae8d 3f96de58 3fb53c5f", + "3fc00000 3f88ae3e 3f88ae3e 3e886316 be063f83 3eb9fad6 3eb9fad6 -> 3f5f04aa 3fce6c4f 3f4fadab", + "bf000000 be77db0d 3f480eaf 3e470d7f 3e28a084 3e28a084 3d9080f8 -> bea615a8 3f32fa9e 3e22ed40", + "3e800000 3e991d1f bdf1b21f 3e991d1f 3f8e64da 3f45326f 3f45326f -> 3f13c0fc 3d98b2bf 3efbb656", + "3f400000 3dec2da0 3f19cf7d 3f136568 bd7c3e01 3e828265 3e828265 -> 3d8d9660 3f4ac063 3f44564e", + "40000000 3f5a361d 3ed9bb1d 3f33ce8f bdaae5be 3d321777 bdaae5be -> 3f2f7cad 3f03207e 3f09151f", + "00000000 3e97657b 3f23d68a 3e69ee9e 3f5507b2 3e923320 3f71fe82 -> 3e97657b 3f23d68a 3e69ee9e", + "3f000000 3f9b40ca 3e9b2ed7 3f9b40ca 3f7b2c39 3f7b2c39 be409401 -> 3fda0bd8 3f4b2d88 3f8f378a", + "3f800000 3ea39825 3ea39825 be5ff4ca 3f5fdab1 3ed54c61 3f9d0aac -> 3f98d362 3f3c7243 3f810c13", + "3fc00000 3f4bb658 3f4bb658 bdf09674 3e65059d 3f92609b bd24d27d -> 3f90cc3a 4020b60a be361a28", + "bf000000 bdfefb20 3e5fadda 3f88ae13 3f9e4139 3f9e4139 3f752a31 -> bf3e209d beccab85 3f16c70d", + "3e800000 3f6a88b1 3dc191f0 3f756a53 3f2bfe94 3f65ce39 3f76f38a -> 3f8ac42b 3ea34b98 3f99939b", + "3f400000 3ee286d8 3ee286d8 be34bbb1 3ec1cf1e 3ec1cf1e 3f7b3993 -> 3f39f117 3f39f117 3f0f3c42", + "40000000 3f0806d2 3f8644f1 3f8644f1 3f400000 3f800000 3f800000 -> 400201b4 40432278 40432278", + "00000000 3e50ea8e bad3b489 3f980720 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3e50ea8e bad3b489 3f980720", + "3f000000 3f8be130 3f87e61d 3f8be130 3e640615 3f011860 3f8683e3 -> 3f9a2192 3fa82c35 3fcf2322", + "3f800000 3ea94e0b 3f9ae126 3f86b440 3f800000 3f400000 3f400000 -> 3faa5383 3ffae126 3fe6b440", + "3fc00000 bd55a244 3ea8f9b3 3ea8f9b3 3f9e896d 3f574993 3f2dff3e -> 3fe72112 3fcbb59b 3facbddb", + "bf000000 3f49c582 3df2a646 3efefdf4 bc2aeaaf bc2aeaaf 3cea248b -> 3f4b1b58 3dfd54f1 3ef7acd0", + "3e800000 3f3470d0 3f49b58d be06979d 3e3dff4c 3ee4b610 3f8417db -> 3f4050c5 3f664c4f 3e019819", + "3f400000 3f254930 3f3a9f9c be0278ca 3f30e75f 3f495c48 3f30e75f -> 3f94fb5c 3fa8d269 3ec81ea7", + "40000000 3f333610 3f333610 3f9af464 3d405e62 3ea23bc2 3eea3167 -> 3f4b41dc 3faab8e8 4008068c", + "00000000 3d84ec68 3f9d55f1 3f9d55f1 3f237334 be0ff1d1 3f00e5d5 -> 3d84ec68 3f9d55f1 3f9d55f1", + "3f000000 bc3b2ea1 3ed4bd06 3f6edecc 3d9e2db1 3d16b394 3d16b394 -> 3cdec412 3ede283f 3f739468", + "3f800000 bd74d084 bd74d084 3f89cb75 3f400000 3e800000 3f800000 -> 3f30b2f8 3e42cbdf 4004e5ba", + "3fc00000 3e8a50f7 be3fcec6 3f7ddb2c 3f9d14c3 3f490f2c 3f490f2c -> 400719b1 3f7da310 400adc7c", + "bf000000 be480960 3f6fbca7 3ed5df37 3f3b46c1 3de71f7c 3de71f7c -> bf0fa5b8 3f614ab0 3eb8fb48", + "3e800000 3db3fe3c 3f0c1a1a 3e1c8426 3f88b2df be555986 3f88b2df -> 3eb5b26e 3efd8903 3ed6f4f2", + "3f400000 3f859fbf 3f7fa74f 3db6de43 3f3e4c78 3ee3c910 3d8d0c7e -> 3fccfc6c 3faa895b 3e1053d0", + "40000000 3f899d77 3f899d77 3f70ed92 3f9ed5ca 3f6a1d70 3f9ed5ca -> 4063a484 4039dd74 405b1130", + "00000000 3f7822fa 3ecbce1e 3f4ad9ce 3e7ba3ac 3e5d7f92 3f9b0074 -> 3f7822fa 3ecbce1e 3f4ad9ce", + "3f000000 3ec45715 3f9a8464 3f9a8464 3f173eaa 3e098140 3eb90d69 -> 3f2dcae0 3fa31c78 3fb1a611", + "3f800000 3cf1d12a be36605f 3f8030d3 3f2c7e6f 3f2c7e6f 3f62a316 -> 3f340cf8 3efdccae 3ff1825e", + "3fc00000 3f371fb5 3e813408 3f1fe787 3d8f3fa0 3f54be45 3ee2b5da -> 3f51fba3 3fbfdbb5 3fa4f7f6", + "bf000000 3c19e1ba 3f8bab03 3f8bab03 bc82a256 3e58008a 3e58008a -> 3c8e4208 3f7c55f5 3f7c55f5", + "3e800000 3f9b85c0 3f777be8 3e8e6332 3e29d710 3e29d710 3ea68d6e -> 3fa0d478 3f810cac 3eb8068e", + "3f400000 be6ef803 3f0aa2fd be6ef803 00000000 3f400000 3e800000 -> be6ef803 3f8d517e bd3be00c", + "40000000 3e3acbd7 3f559f38 be78bed0 3f9ae83f 3f460034 3f9ae83f -> 402694fc 401867e8 400b5c52", + "00000000 3f84affb 3f95200e 3f61f94f 3f4fa905 3ea96a30 be45995d -> 3f84affb 3f95200e 3f61f94f", + "3f000000 be04b2c0 3f9a3a13 be04b2c0 3ed7b1f3 3f6d4dd8 3de06d42 -> 3da5fe66 3fd58d8a bd992edf", + "3f800000 3ef16f2d 3f86615a bda68d3f 3f9ccfcf be3f433a 3e21cf2b -> 3fd92b9a 3f5cf1e6 3d9d1117", + "3fc00000 3f49cd2c bc71d6a4 3ea08077 3f9efce6 3db4dfba 3f9539a4 -> 4029b0f8 3df114c4 4003fb4a", + "bf000000 3f6b45db 3f9fbf40 3f9bffd6 bd584cf8 bd584cf8 3f7c3f0d -> 3f720842 3fa32074 3f39e026", + "3e800000 bdc6a9df 3d4f05f5 3f99d58a 3fa00000 3fa00000 3fa00000 -> 3e5cab10 3eb9e0bf 3fc1d58a", + "3f400000 3f7634e5 3f6a4eac 3e54e034 3f000000 3f800000 00000000 -> 3fab1a72 3fd52756 3e54e034", + "40000000 3f751950 3f3c1634 3f3c1634 3f0cdc0a 3d9464d1 3d9464d1 -> 4003b459 3f612f68 3f612f68", + "00000000 3f24fa75 3f25914c 3ed2f6df 3f96451e 3f966d12 3f96451e -> 3f24fa75 3f25914c 3ed2f6df", + "3f000000 3f8365f8 3e88bb9e 3e88bb9e 3dbae75c 3d5c627f 3f92273a -> 3f893d33 3e9681c6 3f568509", + "3f800000 3f3efac4 3f3efac4 3e21324b be362a32 be362a32 3e4f577f -> 3f117038 3f117038 3eb844e5", + "3fc00000 3f8afec5 3f7815f3 3f7815f3 3f024c3c 3f369c06 3ea4e373 -> 3fecb7f2 40027fff 3fb9e044", + "bf000000 3f97fa16 3f97fa16 3f59ba5f 3f400000 3f000000 3f800000 -> 3f4ff42c 3f6ff42c 3eb374be", + "3e800000 3f08538a bb89ced0 3ebe4f77 3f158fbc 3dce0c26 3f158fbc -> 3f2db779 3cab9872 3f048baa", + "3f400000 3f97061c 3f744912 3ea85cad bd8b5bef 3f40dcb3 3f0b8edc -> 3f907dcd 3fc2774c 3f3cd97c", + "40000000 3f2c57a8 3f9b8c2c be76b039 3e800000 3f000000 3e800000 -> 3f962bd4 400dc616 3e84a7e4", + "00000000 be0ee8cb be0a34c6 3eb17073 3f27a7d0 3d8227f4 3f344cdb -> be0ee8cb be0a34c6 3eb17073", + "3f000000 3d14bce3 3f0d6acd 3e769da5 3f7d5967 be631c07 3f388ab1 -> 3f07f882 3ee20e98 3f19ecc2", + "3f800000 3ee4a3ca 3f0ad434 3ee4a3ca be11f340 be11f340 3f4d9926 -> 3e9baa2a 3eccaec8 3f9ff586", + "3fc00000 3f973f05 3de29d27 3f2c9d80 3dc79a5a be3c303c be3c303c -> 3fa9f57e be28f9c6 3ecc16d3", + "bf000000 3f6dd609 3e1b02a2 3e1b02a2 3f108459 be6affeb bd3b4758 -> 3f2593dc 3e88414c 3e326b8d", + "3e800000 3f81c558 3e9ad5a5 3f81c558 00000000 00000000 00000000 -> 3f81c558 3e9ad5a5 3f81c558", + "3f400000 bdb3f2c4 3d23ee8c bdb08392 3f77ee7a 3f77ee7a be544c9c -> 3f237484 3f4431c4 be777b3d", + "40000000 3c1403e3 3f70c210 be369678 3f400000 3f000000 00000000 -> 3fc12808 3ff86108 be369678", + "00000000 3e16d926 3ede0e41 3ede0e41 3f400000 00000000 00000000 -> 3e16d926 3ede0e41 3ede0e41", + "3f000000 3f7d9285 3f52c908 bd990d30 3ea1dfca 3f796f8d be160593 -> 3f93053c 3fa7c067 be178962", + "3f800000 3f866f26 3f20c790 3f866f26 00000000 3f400000 00000000 -> 3f866f26 3fb063c8 3f866f26", + "3fc00000 3e3c176d 3e3c176d 3c9cb809 00000000 3e800000 3e800000 -> 3e3c176d 3f0f05db 3ec9cb81", + "bf000000 bd9be08e 3f5a7310 be53c024 3f13d518 3f13d518 3f853d5d -> bebacd3c 3f108884 bf3a2d66", + "3e800000 bd9e70e5 3f28702d 3f4b603c 3ebaf593 3ebaf593 bde19ab6 -> 3c642570 3f3fcedf 3f445366", + "3f400000 be0bba7a 3d803acd 3f9f12db 3f000000 3f000000 3f400000 -> 3e744586 3ee00eb3 3fe712db", + "40000000 3f61566f 3dcb8dc6 3dcb8dc6 3f948a0b 3f3eabd2 3ef018ef -> 404cdfa6 3fcb64ae 3f84c553", + "00000000 3f6bd0af 3db54fd6 bdb2576f 3f8b474f 3f8b474f 3f059cd3 -> 3f6bd0af 3db54fd6 bdb2576f", + "3f000000 3f28b32f be641c59 3e6659f1 3f8c5b5d 3f12a87b 3f8c5b5d -> 3f9a8746 3d82693a 3f45f1d9", + "3f800000 3f160d09 3f9fda30 be33c191 3f93c97d 3f1fde23 3f93c97d -> 3fded002 3fefc942 3f7aa296", + "3fc00000 3f07596d 3e9075a5 3e9075a5 3f97e221 3f97e221 3f8a13d9 -> 4013bff5 4003f84e 3ff33b2f", + "bf000000 3f49133a 3f050ab9 be179393 3e6430c4 bdc4c886 bd97a350 -> 3f2c8d21 3f115742 bde3557e", + "3e800000 be47a640 be2a0377 3f862c00 3f2244d7 3f2244d7 be2332c0 -> bd1585a4 bbf7d400 3f81126a", + "3f400000 3f5318db 3f283ab7 3f5318db 3e800000 3f400000 3f800000 -> 3f818c6e 3f9c1d5c 3fc98c6e", + "40000000 3f5e1e11 3f5e1e11 be72c34e bcf89a2b bcf89a2b 3f8e379c -> 3f4e946f 3f4e946f 3ffe16ce", + "00000000 3f23a2e6 3f1a1cb3 bcb9cf09 3f26fc17 3d86c8a3 3e2af10e -> 3f23a2e6 3f1a1cb3 bcb9cf09", + "3f000000 be468203 bd160579 3f21da32 3f1add13 bc9bbf03 be567af7 -> 3dde7046 bd3cf53a 3f070ad3", + "3f800000 3f7df4c3 3f715f6e 3f7df4c3 3e59b842 3e9960dd be7150df -> 3f9a316a 3f9f07ee 3f41a08b", + "3fc00000 3f8a9b00 3e6c44ae 3e6c44ae 3e9009bd bd20ffc6 3e8477cc -> 3fc09ea6 3e2fe4c3 3f1e6b04", + "bf000000 3f77d291 3f77d291 3ee6ba6c 3f800000 3f800000 3f000000 -> 3eefa523 3eefa523 3e4d74d8", + "3e800000 3e286fc7 3f24bb47 3f24bb47 3f7d31bf 3f7d31bf be0a6908 -> 3ed2d0c2 3f6407b7 3f1c14b6", + "3f400000 bd3367b7 3f2bbce5 3ef80df5 3f92fd45 3f92fd45 3f8a6df2 -> 3f51456d 3fc41c67 3fa5d5f3", + "40000000 3f3e2894 3f56bf89 3f918445 3ee74cbe 3f79e387 3f5c599e -> 3fd2baaa 4032a1a6 4036eef2", + "00000000 3f3bf181 3f3e4699 3f3e4699 3f9fed69 3f6aa21b 3f6aa21b -> 3f3bf181 3f3e4699 3f3e4699", + "3f000000 3dc01a25 3eccc8d7 3d95e84d bdab67d8 3f694aff bdab67d8 -> 3d54cc72 3f5b09ea 3d0068c2", + "3f800000 3f12b1da 3f98455c 3f875042 3f425275 3f58c59c 3eca1e8e -> 3faa8228 40025415 3fb9d7e6", + "3fc00000 3f773a4c be0bde76 3f9dc472 3f42f7fd 3f42f7fd 3ee44ebd -> 4006eb92 3f80be2f 3ff361f8", + "bf000000 3ed32406 3f84bce6 3edcba3c 3f8cc20f 3f45ee5c 3f8cc20f -> be0cc02c 3f26829e bdf32788", + "3e800000 3f416e80 3f118d53 bd1d380c 3e800000 3e800000 3e800000 -> 3f516e80 3f218d53 3cc58fe8", + "3f400000 bd0f133b 3f70a3e5 3f008246 3f90f06e bd944e95 bdc3028b -> 3f507771 3f62bc87 3edc7412", + "40000000 3d9d176a 3d9d176a be4a2419 bddcbfac bddcbfac 3f570fc3 -> be0e33f7 be0e33f7 3fbdcb40", + "00000000 3f64b5c6 3f64b5c6 3f1371c4 3df9a8ac 3deb5ceb 3ef7db25 -> 3f64b5c6 3f64b5c6 3f1371c4", + "3f000000 3f74c942 3f74c942 3f10ef96 3f800000 3f800000 3f800000 -> 3fba64a1 3fba64a1 3f8877cb", + "3f800000 3f951b6e 3e5b094a 3f951b6e 3efa08e9 3efa08e9 3f511f67 -> 3fd39da8 3f33c6c7 3ffdab22", + "3fc00000 3da0b8f1 3da0b8f1 3f11c667 3f9b96c0 3f872b23 3f872b23 -> 3ff36daf 3fd4cc43 4009d1f3", + "bf000000 3e8a436b 3f787539 3f787539 be13b62a 3f1d4b4b 3f1d4b4b -> 3eaf30f6 3f29cf94 3f29cf94", + "3e800000 3e39cc9a bdf8ba8b 3e39cc9a 3eb23a2f 3ebddff0 3f9fb8ec -> 3e8974d9 bceb6a6c 3efc9f39", + "3f400000 3dba1ee1 3ecec2d8 3dba1ee1 3f8a3e85 3f0a5694 3f0a5694 -> 3f66a1a4 3f4f225b 3efe0996", + "40000000 3f4389b1 3d24de4e 3f4389b1 bdefb55b bdefb55b bd112e82 -> 3f079c5b be467dc8 3f3163e1", + "00000000 3f8588f4 3f947520 3f22b030 3ba59da4 3ebab7ce 3e82c402 -> 3f8588f4 3f947520 3f22b030", + "3f000000 3c850140 3f15dc97 3f15dc97 3f25cbdf 3f23840f 3f23840f -> 3eae1bf3 3f679e9e 3f679e9e", + "3f800000 3e1d483d 3e1d483d 3e7603f6 3e83ae0f 3e83ae0f 3f83ca35 -> 3ed2522e 3ed2522e 3fa28ab4", + "3fc00000 bd70807f 3f762c9f 3f6b80c1 be586ba1 be586ba1 3f387446 -> bec060c8 3f250443 40000bcb", + "bf000000 3ed79768 bc8a2365 3ed79768 3f800000 3f800000 3f800000 -> bda1a260 bf04511b bda1a260", + "3e800000 3ea2be7a 3f61d4b9 3ea2be7a 3ebc067c bce9b672 3f38c954 -> 3ed1c019 3f60014c 3eff2324", + "3f400000 3f8c427f 3f18ab3a 3f35dca1 3f800000 3f000000 3f400000 -> 3fec4280 3f78ab3a 3fa2ee50", + "40000000 bd97ac40 3ec76db8 bd97ac40 3f6a7c5d 3f175ab5 3e46eee8 -> 3fe10199 3fc93623 3ea103d8", + "00000000 3f866aec 3f91e07f 3f91e07f 3f8e74b9 3f23397d be512b96 -> 3f866aec 3f91e07f 3f91e07f", + "3f000000 3f697a6d 3f956d33 3f3813ca 3f7d919f 3f7d919f 3efb7d68 -> 3fb4219e 3fd4d19a 3f76f324", + "3f800000 3f1e3029 3f1e3029 3da9578c 3f2498e7 3e9ea4b0 bce3d8f7 -> 3fa16488 3f6d8281 3d60c29c", + "3fc00000 bcf57350 be3828b3 3f550053 3e423051 3f57266f 3f1f2384 -> 3e824d08 3f8a57bd 3fe1dace", + "bf000000 3f91a572 3f3cfc06 3f91a572 3f96e852 3f0055b5 3d355ba0 -> 3f0c6292 3ef9a256 3f8ed004", + "3e800000 be7e5130 3f8be518 3f8be518 3f9479fa 3f86f86d 3f86a7ba -> 3d2a8b10 3fada333 3fad8f06", + "3f400000 3f3c39a0 3f84528c 3f862d79 3f800000 00000000 3f000000 -> 3fbe1cd0 3f84528c 3fb62d79", + "40000000 be7069ef be0b3115 be0b3115 3ebc372a 3ec18af1 3ec18af1 -> 3f001cae 3f1ebeac 3f1ebeac", + "00000000 3ec64adb 3f0ac88d 3eede7b5 be0eb835 3f1bcef1 3f1bcef1 -> 3ec64adb 3f0ac88d 3eede7b5", + "3f000000 be0764ee 3f8fee1e 3f3f0f9d 3f1ac771 3ecff413 3cf4e906 -> 3e2e29f4 3fa9eca0 3f42e341", + "3f800000 3ea57863 3bf9ce7a 3bf9ce7a 3ea8127a 3f209193 3e47275a -> 3f26c56e 3f228530 3e4ef5ce", + "3fc00000 3f78d037 3f769784 3da3af17 3ed51194 3e02d721 3f180e9a -> 3fcc4eb2 3f93d418 3f788bca", + "bf000000 3f5728e2 3f5728e2 3f697fdb 3f400000 3f400000 3f400000 -> 3eee51c4 3eee51c4 3f097fda", + "3e800000 3f9fcf45 3f81f975 3ea8ec37 be01ffcb 3f03e614 3eb4def8 -> 3f9bbf47 3f927638 3ed623f5", + "3f400000 3edbad3e be7d587f 3e1398df 3f9e85a2 3f40339d 3f9e85a2 -> 3fadcf89 3ea1a12c 3f895755", + "40000000 3f8b31e5 3f9282d3 3f8b31e5 3f457248 3ee63d13 3e35a6db -> 40285216 4002d0ae 3fb89b9b", + "00000000 3f0930d8 3f9176b8 3f0930d8 3f2851fc bc7e6e24 3f63fd69 -> 3f0930d8 3f9176b8 3f0930d8", + "3f000000 3f493956 3f511cb1 bd2bf511 bd3cf27d 3e2ec20f 3e2ec20f -> 3f4351c2 3f66f4f3 3d318f0d", + "3f800000 bcfb36f1 bcfb36f1 3f095266 3ecf13b1 3f644791 3f644791 -> 3ebf6042 3f5c6dd9 3fb6ccfc", + "3fc00000 3f4c69ce 3f431982 3f45b2bb 3e969cc9 3e58f3db 3ee5d0c2 -> 3f9eafb2 3f8a3a7a 3fb907a6", + "bf000000 3e98b16d 3e98b16d bcbe6a95 3f933c47 3c8f0871 be67d940 -> be8dc721 3e94392a 3db83e9b", + "3e800000 be019dc4 bd3ccc93 be019dc4 3ef313be 3ef313be 3f74bc28 -> bc013e50 3d94ad74 3de63cc8", + "3f400000 3f567275 3dd0235b 3f567275 3efb6d72 3f7fcea4 bd6d6469 -> 3f9a5dc0 3f59df67 3f4b51c0", + "40000000 bdd91408 bdd91408 3f70b089 3ef50ac7 3ef50ac7 3e0acf90 -> 3f59e846 3f59e846 3f9b0c28", + "00000000 3f33350e 3f33350e 3f090638 3f2290dc 3eedcb89 3f23ef56 -> 3f33350e 3f33350e 3f090638", + "3f000000 3d62c14e 3f57d3a0 3ecadf46 3e800000 3f400000 3f400000 -> 3e38b054 3f9be9d0 3f456fa4", + "3f800000 bde85269 3f4e539c 3f9fccaa 3f509416 3db9b5f2 3f73cb34 -> 3f3389c9 3f658a5a 400cd922", + "3fc00000 3f4c0667 3e39dcbc 3f2f81a4 3eefe5a0 3f63155f 3f1ac5b7 -> 3fbff950 3fc18b9e 3fcbd51c", + "bf000000 3f51298c 3da5dd4a 3f9ca26d 3ef2b67b 3efc8706 3efc8706 -> 3f147bed be299861 3f7a2319", + "3e800000 3f58834f 3f58834f 3ebb5517 3f2637a1 3f702f76 3f2637a1 -> 3f81089c 3f8a4796 3f073874", + "3f400000 bda557a7 bda557a7 3f6c6396 3f000000 3f800000 3e800000 -> 3e96aa16 3f2b550b 3f8e31cb", + "40000000 3edb904a be2b82fe be2b82fe 3e9f7636 3f564761 3f80f6e6 -> 3f869f2e 3fc0d702 3fec7d6c", + "00000000 3e6504d7 be63f817 3ec5613d 3dc884e6 3e4fed45 3dc884e6 -> 3e6504d7 be63f817 3ec5613d", + "3f000000 3efd1c68 3f660516 3f50e8cb 3f0eaab6 3eccabee 3f9dd3bc -> 3f45e38f 3f8c9808 3fb75e44", + "3f800000 3f1bbf33 3ef905aa 3f1bbf33 3dc10399 3f5f502e 3f5f502e -> 3f33dfa6 3fade982 3fbd87b0", + "3fc00000 3ea6df06 3f737e5f 3f67e368 00000000 3f400000 3f000000 -> 3ea6df06 4004df98 3fd3f1b4", + "bf000000 be25e39f 3f88a281 3ead882d 3e7966c5 bd9acdc2 3ea645f0 -> be914b81 3f8d78ef 3e34ca6b", + "3e800000 bdfdb93f 3f5126a8 3f5126a8 3f758dcc 3f3ba627 3e4ff3ca -> 3ded6259 3f800819 3f5e25e4", + "3f400000 3f33cff7 3d46c4ef 3f2f31d9 3f400000 3f400000 3e800000 -> 3fa1e7fc 3f1c6c4f 3f5f31d9", + "40000000 3ef7d825 3ef7d825 3dab2876 3d36c19b 3d36c19b 3d8ce019 -> 3f12c446 3f12c446 3e627455", + "00000000 3e2139a6 3f94a154 3e2139a6 3f36b9f2 3e8492ce 3f36b9f2 -> 3e2139a6 3f94a154 3e2139a6", + "3f000000 3f9d69fc 3f256109 3e05d231 3f2aaaab 3f2aaaab 3f2aaaab -> 3fc814a7 3f7ab65e 3eed93c4", + "3f800000 3f995843 3f995843 3c55ea60 3f44e045 3f50c107 3f44e045 -> 3ffbc866 4000dc63 3f4837ee", + "3fc00000 3eca8352 3f3529b9 3e510a29 3f9e92af 3f42c0af 3c619b22 -> 40103e6e 3feca560 3e6630b4", + "bf000000 3e4092c0 3ede463d 3eb5b1e0 3f8c65c8 3f683c89 3f0bd2c7 -> beb88230 bc9f64d0 3da77c64", + "3e800000 3f81e53b 3f81e53b 3e5e8bd5 bb83a575 be05cb83 3f1bfa40 -> 3f81c452 3f7b6dbe 3ebd430a", + "3f400000 3f915800 3e5e782d 3e5e782d be2280ff bda9c422 be2280ff -> 3f821be8 3e1ecea0 3dc92edc", + "40000000 3f209bc8 3f8af216 3f8af216 3e27e975 bd9f19c0 3f472259 -> 3f749082 3f6e1dbc 40290a37", + "00000000 3f8165e4 3f7e8ed0 3f7e8ed0 3f509f28 3e035db4 3efe9d71 -> 3f8165e4 3f7e8ed0 3f7e8ed0", + "3f000000 3f0c44fc 3f56d77c 3f921541 3f800000 00000000 00000000 -> 3f86227e 3f56d77c 3f921541", + "3f800000 bd640ef8 3f54d746 bd640ef8 3f000000 3f800000 3f000000 -> 3ee37e21 3fea6ba3 3ee37e21", + "3fc00000 3f5aa785 3f5aa785 3ec15541 3f80e5c6 3f99f75d 3e86ca56 -> 40175636 402a2368 3f45c262", + "bf000000 3f2ee6e7 3edf5272 3f2ee6e7 be0efb53 be0efb53 3effa694 -> 3f40c652 3f0188a4 3eddfa85", + "3e800000 3dbf22cb 3f4abef8 be7a7183 bda2403b be5304c4 bda2403b -> 3d9692bc 3f3d8eac be875cc5", + "3f400000 3f79ebef 3ea22779 3ea22779 3dde6011 3f6e0fcf 3e83112a -> 3f876279 3f81cfcc 3f023a2c", + "40000000 3f32aa42 3f4c32fd 3f264445 3e5bfda1 3f8a1847 3f203c60 -> 3f905489 403d2507 3ff35e82", + "00000000 bde6e28c 3db4f472 bde6e28c 3e89f1d2 3e89f1d2 3f32f11e -> bde6e28c 3db4f472 bde6e28c", + "3f000000 3f4f5847 3f850712 3f832dc9 3f41e553 3d351366 3f2ebcf7 -> 3f982578 3f87db60 3faedd06", + "3f800000 3f08cc4f be08fc55 3f22aa2f 3d9e27a0 be557317 be557317 -> 3f1c9143 beaf37b6 3eda9ad2", + "3fc00000 3f9e4970 be7b67b5 3ec77e8f 3f333306 3f333306 3f68d92b -> 401257da 3f4df29b 3fe08284", + "bf000000 3e80a396 3f5399f4 3e80a396 bc30a48f bd43d7c0 3f367aaa -> 3e836628 3f59b8b2 bdd75c50", + "3e800000 3f7c031c 3e7972da bcb6200f be35e861 3f49ca96 3ef7ab05 -> 3f70a496 3ee19eb8 3dca2301", + "3f400000 3f7ce07d 3f39659c 3f7ce07d 3d2097ba 3f3a9d49 3f910e36 -> 3f8233cd 3fa2adc9 3feb3ae7", + "40000000 3e9f1b15 3dd5ee48 3f9a6910 3f800000 3f000000 3f800000 -> 4013e363 3f8d5ee4 404d3488", + "00000000 3f97ed62 3f97ed62 3f7839aa 3f000000 3f000000 00000000 -> 3f97ed62 3f97ed62 3f7839aa", + "3f000000 3e38909e 3ef8f9f6 3f39eccd 3f86840f bb8d01df 3f86840f -> 3f34a836 3ef7dff2 3fa0386e", + "3f800000 3d2a7c43 3d2a7c43 bcf2bbaa 3f7bde4e 3f7bde4e be7b4fdb -> 3f834309 3f834309 be8cd3a8", + "3fc00000 3f7f0c70 bd9714f9 3f7d6986 3f1a2e5f 3dd571f6 3dd571f6 -> 3ff32900 3da915f7 3f92b772", + "bf000000 3f5cc39c 3f5d7382 3f5d7382 3dc8d641 3dc8d641 3f72e591 -> 3f503638 3f50e61e 3ec80172", + "3e800000 3f577bdc 3f577bdc 3f0c0062 bd7919f7 3da23b65 bd7919f7 -> 3f539774 3f5c8db7 3f081bfa", + "3f400000 3f8de1b8 bdc7d301 3f8de1b8 3f576986 bd19bbcc bd61bcd7 -> 3fdea94a be00bcb7 3f88974b", + "40000000 3f3826a0 3f06b1b6 3f06b1b6 3ed52159 3f54aed6 3f3f7910 -> 3fc6a3fc 400c03d8 400168f6", + "00000000 3f815efa 3f918d67 be3acfb3 be570711 be570711 3f28e607 -> 3f815efa 3f918d67 be3acfb3", + "3f000000 3e611dcf 3f1015f3 3f950b16 3ec243ea 3ec243ea be6f6a7c -> 3ed1b0dc 3f40a6ee 3f86146e", + "3f800000 3b896930 3f71fb1b bdf8c355 3e0150c1 3f85a4cb bd2b1cc0 -> 3e059c0a 3ffea258 be2728da", + "3fc00000 3f0c6e77 3f6c3d13 3f0c6e77 00000000 3f800000 3f400000 -> 3f0c6e77 401b0f45 3fd6373c", + "bf000000 be530d65 3f10e333 3d26ec72 bcbd5d0e 3f1d43b7 3f860ada -> be473794 3e8482af bef73826", + "3e800000 3cfa48b3 3f58340b 3f75f5bc 3eab676c 3f81ff26 bced2d46 -> 3de9f999 3f8c99cf 3f741b62", + "3f400000 3e5ed878 3f5a4d1a 3e5ed878 3f551b61 3f351f03 3f2b8fa1 -> 3f578aa8 3fb1122e 3f3861d7", + "40000000 3ec52774 3f817b58 3f1c9751 be0412f7 3f7a4d6b 3f7a4d6b -> 3e0228f8 403de462 40244c8a", + "00000000 3ef47215 3ef47215 3f5d0434 bd6541f9 be364785 be038a72 -> 3ef47215 3ef47215 3f5d0434", + "3f000000 3f9c500c 3f8c1bf1 3f08a8e8 3f01f44d 3e5dadb0 3e5dadb0 -> 3fbccd1f 3f99f6cc 3f245e9e", + "3f800000 3f92d7cb 3f92d7cb 3eb6f485 3f8a305c bc18d595 3f8a305c -> 400e8414 3f91a620 3fb7ed7d", + "3fc00000 3f1b4089 3e8eb7a2 3f0f6c28 3ec9f548 3f4ecf0b 3ec9f548 -> 3f995c3e 3fbec930 3f93720f", + "bf000000 3b7c28fa 3f60f33a 3eff48e0 3e800000 3f400000 3e800000 -> bdf81eb8 3f00f33a 3ebf48e0", + "3e800000 be5965ed 3e19df81 3e19df81 3f829af5 3f829af5 3e8ed526 -> 3d2f3ff4 3ecf8ab6 3e614a14", + "3f400000 3d9e09de 3d9e09de be76da0a 3eeca35c be037dbb 3f63efef -> 3ed8fcfc bc9ccae8 3eda7adf", + "40000000 3cc36127 3f13a230 3f865a30 3e1d6d6c 3ecf58c8 be0d162e -> 3ea9a37e 3fb17d7c 3f462948", + "00000000 3f1ad1a3 3f3c0a33 3f76be75 3f800000 3f000000 00000000 -> 3f1ad1a3 3f3c0a33 3f76be75", + "3f000000 3e4a1092 3f282bcd 3c08ec00 3f400000 3e800000 3f000000 -> 3f128424 3f482bcd 3e844760", + "3f800000 3f620621 3f620621 bded6c60 00000000 3e800000 3f800000 -> 3f620621 3f910310 3f625274", + "3fc00000 3f043f4f 3e59fd88 3e59fd88 3e16bf8d 3f0f5a9b 3e16bf8d -> 3f3cc724 3f86c3a5 3ede0e6d", + "bf000000 3eae8282 3eae8282 3f1f1ead 00000000 3e800000 00000000 -> 3eae8282 3e5d0504 3f1f1ead", + "3e800000 3f46fb7b 3f9e2728 3f3dea50 bcb7c707 bc7a3c22 bc7a3c22 -> 3f458bed 3f9daa0a 3f3cf014", + "3f400000 3f3e6f34 3f0097c3 3f0097c3 bc94886d 3f6d7598 3f241c53 -> 3f3af402 3f9957fb 3f7bad01", + "40000000 3f920fd0 3eeb99f2 3ea94d4e 3f6de7be 3f6de7be 3ddf183a -> 403ffbc8 4014671e 3f0c6cb5", + "00000000 be19c229 3ecaa739 bdab1945 3ef01457 bd80996c 3ef01457 -> be19c229 3ecaa739 bdab1945", + "3f000000 3f23d305 3f9ba75f 3f9ba75f 3f8f25e1 bd9b3ac0 bd9b3ac0 -> 3f997c74 3f96cd89 3f96cd89", + "3f800000 3df03b05 3f6d5baa be56a718 3ed4e8ec 3f2fb559 3ed4e8ec -> 3f087bd7 3fce8882 3e532ac0", + "3fc00000 3e161cb9 3ec97b86 3ec97b86 bce9d15c be61bff1 bce9d15c -> 3dd48af0 3d80ae44 3eb38fe5", + "bf000000 3f598f82 3f598f82 3f9f3ad1 3f3a397a bbd4349e 3e856a91 -> 3ef8e58a 3f5a63b6 3f8e8d7f", + "3e800000 3c365063 3f0b37c4 3e927e85 3e539c81 3f0478d4 3f1cee99 -> 3d80984d 3f2c55f9 3ee0f5d2", + "3f400000 3eb50ece 3f579c41 3f37b323 3f16634c 3f220457 3f220457 -> 3f4b51e0 3fa88fc1 3f989b32", + "40000000 3eca1a54 be14858b 3eb80cf9 3eb6f5c1 bdc08506 3f2827d6 -> 3f8e0175 beaa8548 3fd62b14", + "00000000 3f4115cd 3f952f09 3f4c695e 3ee3edb1 3ee96366 3ee3edb1 -> 3f4115cd 3f952f09 3f4c695e", + "3f000000 3f7a3a5a 3f499445 be504ecb be0cda55 3f52d351 3eb2600f -> 3f689f10 3f997ef7 bcef75e0", + "3f800000 3d389fc0 3f89ca13 3eca4e39 3e426aa2 3eb775e6 3f0fc7f8 -> 3e709292 3fb7a78c 3f74ef14", + "3fc00000 3e422cff 3edbd76e 3f41da78 bbd32338 3f641dc1 3f59a9fd -> 3e384758 3fe20c2c 4002165c", + "bf000000 be28c2c0 3f170dca 3f014100 3f1481e3 3f1481e3 3e12d778 -> bee8e343 3e9999b2 3eddcc22", + "3e800000 3f810220 3e8fd6b1 3f41cf22 3e6f68fc 3d829953 3e6f68fc -> 3f887d68 3e980046 3f50c5b2", + "3f400000 3f9dbbb2 3e9a2211 3e309215 3f0183b3 3f86808f bddb74af -> 3fce4d16 3f8b68ef 3dbc8ca7", + "40000000 3f4977b5 3e9b1d2c 3ec6ecda 3e1146da 3f920ab3 3e1146da -> 3f890d92 40256e58 3f2c19db", + "00000000 3ec7ea50 3f854b68 3f2184bf 3dc08802 3f357bb4 3f357bb4 -> 3ec7ea50 3f854b68 3f2184bf", + "3f000000 3f52abb5 3f5463bf 3e4a5c6e 3f4ee578 3f4ee578 be0da237 -> 3f9d0f38 3f9deb3e 3e038b52", + "3f800000 bd56826b 3e4654a5 3f90f2bd 3f6fd023 3f83f184 3f83f184 -> 3f6267fc 3f9cbc19 400a7220", + "3fc00000 3bcf3d12 3f600125 3bcf3d12 3db8a9fa 3ec94294 3f8b242c -> 3e10f965 3fbb798a 3fd1857f", + "bf000000 3f00eba3 3f53e6d6 be6aeb1a 3f327848 3f831025 3f91eb56 -> 3e1ebdfa 3ea1ad62 bf4ca61c", + "3e800000 3f295bfc 3f0e1a82 3f295bfc 3eefe806 3eefe806 3f9ad77d -> 3f4758fd 3f2c1782 3f76c7ba", + "3f400000 3eea0899 3f29c051 3f8abe41 3e794523 bda3cabc 3f9734e6 -> 3f23c143 3f1a6550 3ffc25ee", + "40000000 3eabf4a5 3ed299e1 be0e0ca5 3e03bdf0 be751af4 bc1e083e -> 3f17d94a bd8a044c be21cdad", + "00000000 3f5df4c4 3f13e34a 3f5df4c4 3f7cc71e 3da3f607 3edeed78 -> 3f5df4c4 3f13e34a 3f5df4c4", + "3f000000 3f736d2a 3d1128eb 3f736d2a 3f27e590 3f15978e 3f36dbb8 -> 3fa3aff9 3ea7bcab 3fa76d83", + "3f800000 3f92c1f4 3f80cd28 3ee4a132 3dd7581e 3dd7581e be5ea201 -> 3fa03776 3f8e42aa 3e6aa063", + "3fc00000 3e3125fa 3ccd9b71 3efd1b36 3e0b6ead 3e0b6ead 3ebe776f -> 3ec12600 3e6ad972 3f86b396", + "bf000000 3de13587 3ef7cb88 3f35c6c4 3ded1a64 3e827143 3e827143 -> 3d5550a9 3eb692e6 3f152a73", + "3e800000 3f8d4be7 3dc4d1d9 3dc4d1d9 3da0d20e 3da0d20e 3f822a0e -> 3f8fcf2f 3ded065d 3eb35e84", + "3f400000 3f6d22b5 3f9c8e43 3df280ac 3f6681c5 3f983ae9 3e8784c0 -> 3fcd0204 40075d39 3ea243bb", + "40000000 3f7d4dbc 3e542949 3f7d4dbc 00000000 3f400000 3f800000 -> 3f7d4dbc 3fda8529 403f536f", + "00000000 3eac6a0a 3eac6a0a 3f86386c 3f6f29e0 be420fd2 be015f1a -> 3eac6a0a 3eac6a0a 3f86386c", + "3f000000 3e67ca16 3ef318a9 3f0034d7 3e2ee6b9 3e5b77db 3e5b77db -> 3e9f9eba 3f14fb50 3f1ba3d2", + "3f800000 3f8a474f 3f8a474f bdcfec51 bc466177 3eb129aa bc466177 -> 3f88ba8c 3fb691ba bde8b880", + "3fc00000 3f9feea9 be2a8cd1 3f14fe89 3f138579 bcd55456 3cac0ba5 -> 40074962 be528ca2 3f1d0f14", + "bf000000 3f30257a 3eb76203 3e836860 3f97ce36 3f97ce36 3e6cb69b -> 3dc2ba20 be7074d2 3e107572", + "3e800000 3f900118 3f10438f 3f69c76f 3de2f8d8 3de2f8d8 3f2daba4 -> 3f938cfc 3f175b56 3f8a992c", + "3f400000 3dbcb825 be0e3d9b 3e64dd5c 3e7b6f71 3e7b6f71 3ed09a82 -> 3e8d77d4 3d3957e8 3f077148", + "40000000 3f4f5054 3f47a2ed 3f94e443 3f0f8e34 3f0f8e34 3f3ebdf1 -> 3ff7365e 3ff35faa 4029d11a", + "00000000 3f20d317 3f8eccd0 3ece870b 3f400000 00000000 3f400000 -> 3f20d317 3f8eccd0 3ece870b", + "3f000000 be2e49fb be12e1b5 3e2ac9c9 3f394a01 3f87799b 3e16c563 -> 3e444a07 3ec5825c 3e762c7a", + "3f800000 3f1e8ee5 3f251f22 3f1e8ee5 3f4917ca 3f8e36e3 3f387c72 -> 3fb3d358 3fe0c674 3fab85ac", + "3fc00000 bd16cbe1 3f475594 3f1e0620 3f3e8527 3eb07bd7 3f5035a9 -> 3f8a2d7e 3fa5d93b 3feb2b4e", + "bf000000 3f8d781f 3f4eb517 3e75b757 bdefb572 3dac2355 3dac2355 -> 3f94f5ca 3f43f2e2 3e4aae82", + "3e800000 3f8414cf 3f42afa7 3f91b437 bde7ee1c bdcabe7f 3f89a4a7 -> 3f807516 3f3c59b3 3fb41d61", + "3f400000 3edbeb46 3edbeb46 3ed8885f 3f10f260 3d209f4d 3d209f4d -> 3f5aab6b 3eeafa36 3ee7974e", + "40000000 3f8c7f21 3f1baa4d be7751d0 3e800000 00000000 3f000000 -> 3fcc7f21 3f1baa4d 3f422b8c", + "00000000 3e1ae8bc 3f164957 3f4be143 3f1978e0 3d0e8f4e 3f879bd0 -> 3e1ae8bc 3f164957 3f4be143", + "3f000000 3f5eb171 be79b184 3eac4525 3f957ac6 3f9a0ac3 3f957ac6 -> 3fba161c 3eb73cc4 3f6b9d58", + "3f800000 3f136ec4 3f8932e0 3f8932e0 3d8d33e3 3e9a4536 be2624ca -> 3f251540 3fafc42e 3f68dc8e", + "3fc00000 3e0c5f6c 3f9a31e2 3f012478 3f7312d6 be1b90f7 3f15576b -> 3fc7da0e 3f7a0d67 3fb093cd", + "bf000000 3f8ba961 3da78702 3f8ba961 3ea88cef bdbb39d8 bdbb39d8 -> 3f6d2f86 3e0291f7 3f918330", + "3e800000 3d722efd 3d722efd 3e296ab0 3f9649d1 3f86b75a 3f9649d1 -> 3eb48fb1 3ea4fd3a 3eeaff29", + "3f400000 3f3a1e80 3f135283 3d9ad569 3ed745e3 3f13bd8e 3eb8974b -> 3f856c5b 3f811056 3eb126d2", + "40000000 3f2ed85c 3f88b09c 3f2ed85c 3f5e7239 3f992c0b 3f71009c -> 401aef33 405d845a 40243665", + "00000000 3f9507b8 3dfbea5f be4a4c36 3f8951ae 3f8951ae 3ee6f4ba -> 3f9507b8 3dfbea5f be4a4c36", + "3f000000 bc8a9405 3f68202f 3f68202f 3f1e0c3a be530dd6 3f9f23a5 -> 3e9562fa 3f4dbe74 3fc3a1ea", + "3f800000 3f926f8f 3f969d59 3f894d63 3f800000 00000000 3f400000 -> 400937c8 3f969d59 3fe94d63", + "3fc00000 3f33ad78 3e8b26ea bda8a66d 3f21d3c1 3ec0b04d 3f77e3f9 -> 3fd3358c 3f5617af 3faf6094", + "bf000000 3ebd4839 3f8289fd 3ebd4839 3f971694 3f971694 3ebc8029 -> be61c9de 3edbface 3e3e1049", + "3e800000 3e510158 3f08ed0b 3f6b5ed2 3f6f29e8 bdc58578 3eb444f0 -> 3ee015a0 3f02c0df 3f80f3b8", + "3f400000 3ee00c45 3ab6a193 3ee00c45 3be4baf9 3f63d637 3f63d637 -> 3ee2ba76 3f2b3bfa 3f8d7366", + "40000000 bcabb883 3f9d7baf bcabb883 3f7612bb 3dae9304 3dae9304 -> 3ff363d9 3fb34e0f 3e191bf4", + "00000000 3f142e20 3cfa00d6 3eeb8874 3f5cd811 3f494adc 3f494adc -> 3f142e20 3cfa00d6 3eeb8874", + "3f000000 3f19a0fc 3e65f49b 3f416664 3e0593fc 3e0593fc 3e155db6 -> 3f2a537c 3e945f4d 3f54121b", + "3f800000 3d98f471 be5daac1 3f9dbb3a 3f89f559 3ebc44d0 3f89f559 -> 3f9384a0 3e1adedf 4013d84a", + "3fc00000 3f0c2131 bd52ab8c bd52ab8c 3eeee10f 3eeee10f 3f482da1 -> 3f9fa4fe 3f25fe13 3f8f8cdd", + "bf000000 3f8e1510 3f6b8641 3f8e1510 3f55c027 3e02f89f 3f19e319 -> 3f314a0c 3f5b272e 3f4f3894", + "3e800000 3f9c09cc 3ec3226b 3f3f1fea 3f42b190 3c273925 3f42b190 -> 3fb45ffe 3ec470dd 3f6fcc4e", + "3f400000 3e93c181 3f4d3aa5 3edc4842 3f2f7481 3e795b36 3f1e8215 -> 3f4d7822 3f7bfbbf 3f6505b1", + "40000000 3f9ca421 3f9ca421 3e9c9b83 be44c7b7 3f2cc9eb 3e97fed5 -> 3f56e466 4024b706 3f664c96", + "00000000 bd16c6ac bdd875bd bdd875bd 3f6d9a32 3f9014a7 3f9014a7 -> bd16c6ac bdd875bd bdd875bd", + "3f000000 3f9109df 3f519031 3f519031 3f41f522 3f4a7fb6 3f98397e -> 3fc18728 3f9b6806 3fb4e4d8", + "3f800000 3f1882e2 3eec15e9 3f1882e2 3f800000 3f400000 3f800000 -> 3fcc4171 3f9b057a 3fcc4171", + "3fc00000 bc3aae83 bc3aae83 3f58d95b 3ea102f6 3dfb2177 3ea102f6 -> 3eebaefd 3e30ae31 3fa8cdca", + "bf000000 3cc5c72f 3cc5c72f be5596ed 3f187f78 3e6f787b 3f03c19e -> be8c2305 bdbe06ae beee8d14", + "3e800000 3ec0beda 3e84bb35 3f14c43d 3ecdc76d 3f7962f0 3ede7449 -> 3ef430b6 3f00b656 3f3092c6", + "3f400000 3ec2b0cd 3f215089 3f215089 00000000 00000000 00000000 -> 3ec2b0cd 3f215089 3f215089", + "40000000 3f9d876c 3f9d876c 3f01f2d6 3e569994 3f8a2a7f 3e569994 -> 3fd32dd0 4058ee36 3f6d3fa0", + "00000000 3e2d869e 3eee6edb 3eee6edb bd6a17da 3f38770b 3f9c8a45 -> 3e2d869e 3eee6edb 3eee6edb", + "3f000000 3ec0ecba bdacf5e5 3ec0ecba 3ee88d81 3f2a1a7c 3f341878 -> 3f1a99be 3e7dba06 3f3a8298", + "3f800000 3f653f78 bdd66cc6 3f406bb2 3e97f088 3f970c75 3e97f088 -> 3f989bde 3f89a5a9 3f8631fb", + "3fc00000 3f487e93 3edaaaf7 3edaaaf7 3f7c04c0 3f8d1ca3 3d770441 -> 4010a16d 40052ad9 3f047de2", + "bf000000 3f993d76 3f993d76 3f987ed2 3e800000 00000000 00000000 -> 3f893d76 3f993d76 3f987ed2", + "3e800000 3ef3fff6 be543468 be543468 3f41a26f 3ed5a907 3f64eccd -> 3f2a6897 bdd2bfc9 3c85c328", + "3f400000 3f8746bc 3f586510 3f586510 3e96cc76 bdb65a3e 3e96cc76 -> 3fa38d12 3f474c9a 3f8878de", + "40000000 3f0ef38c 3f25e267 3f25e267 3f000000 3e800000 3f400000 -> 3fc779c6 3f92f134 4009789a", + "00000000 3e1b4894 3f48c8a8 3f35ed68 3f55c2cb 3f22a182 be4ae90c -> 3e1b4894 3f48c8a8 3f35ed68", + "3f000000 3f792395 3f80456e 3f792395 3f026047 3f615241 3f8978f6 -> 3f9d29dc 3fb899fe 3fc14e46", + "3f800000 3e80b5d4 3f88f5be 3f88f5be 3f801e07 3f4a3c66 3f7b6138 -> 3fa04b7c 3fee13f1 4003532d", + "3fc00000 3ef1b60c 3f81f235 3f81f235 3ea1c17f 3ea1c17f 3dd5d2e3 -> 3f722c26 3fbe9ac5 3f95fdfa", + "bf000000 3ecef7e4 3f8575dd 3f34f797 3f94d3ee be1ab173 3f9e16c9 -> be355ff0 3f8f20f4 3db70678", + "3e800000 3f88fe0c bce04988 3f76db0c bd6a60f1 3f4f3b12 bd6a60f1 -> 3f87294a 3e3331e1 3f733188", + "3f400000 3f3853cf 3edd3bd8 3d8f649b 3e275c77 3f7c7915 3e2decf9 -> 3f57b526 3f95fc5e 3e4a2408", + "40000000 3f2de630 3f118d85 3f118d85 3e48520c bdbecd41 3ddbe036 -> 3f89079b 3ec3b46a 3f488593", + "00000000 3eaca22f bdb3b506 3eaf330e 3f7340d6 3f7340d6 3f645c04 -> 3eaca22f bdb3b506 3eaf330e", + "3f000000 3f9cf48a 3eea0a95 3f88944c 3f800000 3f800000 00000000 -> 3fdcf48a 3f75054a 3f88944c", + "3f800000 3f84d8c3 3f937c7d 3f19efe2 3f688e3c 3f1e23e5 3e913863 -> 3ff91fe1 3fe28e70 3f628c14", + "3fc00000 3e3049be 3e3049be 3f617171 3edadafb 3f8bc1e0 3f64ccf1 -> 3f5036ac 3fe7ac08 400e2937", + "bf000000 3f979937 3f30cd81 3f979937 3f9a2a35 3f9a2a35 3e208b88 -> 3f150839 3db51a58 3f8d907e", + "3e800000 3f3aac1e 3e913e03 3e01bfaf 3f03bfc1 bd9bc8ce bd9bc8ce -> 3f5b9c0e 3e878176 3ddc8d2a", + "3f400000 3f6c5e64 3f6dc906 3f6c5e64 3c8d1cf6 3f0cfbd5 3c8d1cf6 -> 3f6fad12 3fabc2f3 3f6fad12", + "40000000 3f50826e 3e5da8da 3ee35f77 3e800000 3f400000 3f000000 -> 3fa84137 3fdbb51b 3fb8d7de", + "00000000 3f624edd 3f00a9aa 3f422d97 be71efe9 3f8418ab 3f70d6c3 -> 3f624edd 3f00a9aa 3f422d97", + "3f000000 3f821c92 3e32b859 3f100e87 3f400000 3f800000 3e800000 -> 3fb21c92 3f2cae16 3f300e87", + "3f800000 3eee25cb 3f068485 3f6d3855 3e9de637 ba261ddb 3e9de637 -> 3f460601 3f065afe 3f9e15b8", + "3fc00000 3f2fe93b 3f2fe93b 3c4ebd60 3f18b621 3f8bbdd9 bd6280c8 -> 3fca7d36 4014c8b1 bd9008ea", + "bf000000 3f9602f7 be220558 3f6fad8f 3c7133b3 3d25f224 bc47481f -> 3f9511c4 be36c39c 3f713c1f", + "3e800000 be7c3209 3f89d7fd 3e04e1fb 3daa0df5 3f37abdc bc204f94 -> be66f04a 3fa0cd78 3e0260bd", + "3f400000 be497a0c 3e330ad8 be497a0c 3f000000 3f400000 3e800000 -> 3e3685f4 3f3cc2b6 bc17a0c0", + "40000000 3f884711 3e50355b 3f884711 00000000 00000000 3e800000 -> 3f884711 3e50355b 3fc84711", + "00000000 3f9326ef 3f230ba8 3f851880 3f97f35d 3f22f2e1 3f0b9763 -> 3f9326ef 3f230ba8 3f851880", + "3f000000 bd991749 bd991749 bd533849 3f23e5da be68ce33 be41baae -> 3e7b4010 be40f2be be15ab69", + "3f800000 3efde253 bd975159 3f179d58 3e6907ad 3e6907ad 3f624c3d -> 3f393315 3e1d5f00 3fbcf4ca", + "3fc00000 be1b736c 3eec89d5 be1b736c 3f88c706 3ec33af5 3f791223 -> 3fb9bc1c 3f845891 3fa75f2c", + "bf000000 3e1ba91e 3f6ead60 3f6a6319 bd9e8f3d 3f091764 3f091764 -> 3e434ced 3f2a21ae 3f25d768", + "3e800000 be0b92ab 3f71c240 be0b92ab 3f8b81d7 3df88f22 3df88f22 -> 3e0b7103 3f7986b9 bdd9018e", + "3f400000 3d9a7b5a 3f847e1c 3f7e600f 3e9578ff 3eac6810 3f3d68e5 -> 3e96b996 3fa4d19f 3fc6375e", + "40000000 3f72d9ad 3f23f85f 3f529163 be3e16e5 bdaec5f4 bdaec5f4 -> 3f13ce3b 3ef08dc2 3f26dfe5", + "00000000 3f952171 3f952171 bd481e2f 3f800000 3f000000 3f000000 -> 3f952171 3f952171 bd481e2f", + "3f000000 3e98644a 3e98644a 3efdcd56 3e2fd3cd 3f604e29 3ef3ccab -> 3ec4593d 3f3c593a 3f3bd9d6", + "3f800000 3da0b4f2 3da15768 3f7cf9b9 3f9be63e bcc2a5ce 3f312977 -> 3fa5f18d 3d615be9 3fd71198", + "3fc00000 3f1ee024 be2983c3 be2983c3 3da0dacf 3d9180b3 3da0dacf -> 3f3d092b bd718cf4 bd437ea0", + "bf000000 3f858104 3dc7ccee 3f858104 be607dda 3ef5aafe be607dda -> 3f9388e2 be11c487 3f9388e2", + "3e800000 3f95f6fa 3f1c17a7 3f1c17a7 3f25db56 be327fdd 3f966c26 -> 3faab265 3f10efa9 3f674dba", + "3f400000 bd7b5b28 3f102bec bd7b5b28 3f155845 3d85af40 3ddebc7f -> 3ec09901 3f1cb45a 3ca57f2c", + "40000000 3ea8e66a 3f260e73 3f260e73 3ea11764 bc19e10b 3f853e77 -> 3f758a99 3f213f6b 402ec213", + "00000000 3f292fb8 be5455d2 3f866d17 be260549 bc8c0bb7 bc8c0bb7 -> 3f292fb8 be5455d2 3f866d17", + "3f000000 3e74297e 3d65d7f2 3f914884 bde62816 3f942512 be59deff -> 3e3a9f78 3f228291 3f83aa94", + "3f800000 3f3d494f 3f3d494f 3f6d4969 3f8e5090 3f87e3f5 3f7a4fbc -> 3fecf538 3fe6889c 3ff3cc92", + "3fc00000 be0bbc4a 3f309578 3f309578 3f4a1af3 3f0e02a2 3f3598f0 -> 3f861cad 3fc2ccb6 3fe07d70", + "bf000000 3ec00559 3f9f71ff 3eec28ce 3ec0f2a5 3f4e4d60 3f5d84e0 -> 3e3f180d 3f57bd4d 3cea3ed0", + "3e800000 3f5cf69b 3f5cf69b 3f6b0f0b 3eca255b 3e4d73fa 3eca255b -> 3f763b46 3f69cddb 3f8229db", + "3f400000 3cce3d4b 3f995ca7 3cce3d4b 3e9f7c5b 3e1efba5 3f91170b -> 3e848119 3fa8443f 3f60147a", + "40000000 3f9977c4 3ec8a86f 3f4f83a2 3f0bfd3c 3e78daea 3e78daea -> 4012ba80 3f60c1ac 3fa5f88b", + "00000000 3e940a03 3e2c1170 3ec6e685 3f868fec 3ea3e781 3f06b139 -> 3e940a03 3e2c1170 3ec6e685", + "3f000000 be535281 3b966fc4 3da1ed11 3f000000 00000000 3f400000 -> 3d32b5fc 3b966fc4 3ee87b44", + "3f800000 be442989 3f820daf bd7b1613 3f000000 3f800000 3f800000 -> 3e9deb3c 400106d8 3f704e9f", + "3fc00000 3f009b82 3ef738bb 3f101048 3e2adbae 3f3c949a 3f46d059 -> 3f40ade4 3fcb3da3 3fdd2466", + "bf000000 3e93764b 3f664f04 3f664f04 3f937ad0 3f937ad0 bbeb87ae -> be937f55 3ea5a868 3f673a8c", + "3e800000 3f9201cb 3f0174db 3f247d7c 3f413592 3f103981 3f9a1ed0 -> 3faa287d 3f25833b 3f718ce4", + "3f400000 3f5e3535 3eab1ec5 3f990bc1 bd9596da 3f831655 be6a6cce -> 3f502f11 3f8d1871 3f83118e", + "40000000 3f32db5e be16b6b1 be16b6b1 be2f5aff 3f1bae29 3f57575e -> 3eb65bbc 3f88d753 3fc48088", + "00000000 3ca2b64e be5fd90e be5fd90e 3ed3751c 3ed3751c 3f1b8f9d -> 3ca2b64e be5fd90e be5fd90e", + "3f000000 3e00e8be 3f2cf412 3e99b27f 3f400000 3f800000 00000000 -> 3f003a30 3f967a09 3e99b27f", + "3f800000 3f87dd73 bd4fb0b7 3f87dd73 3e19b1a7 3e87ec3b 3e19b1a7 -> 3f9b13a8 3e5bec48 3f9b13a8", + "3fc00000 3ea2c250 3f96ed9d 3f96ed9d 3f800000 3f800000 3e800000 -> 3fe8b094 402b76ce 3fc6ed9d", + "bf000000 3e579a03 be04c0d8 3f497899 3cd27f4d 3cd27f4d 3eb673a4 -> 3e4a720e be11e8cd 3f1bdbb0", + "3e800000 3f8f1ea8 3f75932b 3f75932b 3f902ef5 3e1e96cd 3f8fc992 -> 3fb32a65 3f7f7c98 3f9ebbfa", + "3f400000 bc999a29 3f8d22eb 3f8d22eb 3f800000 3f400000 3e800000 -> 3f3b332f 3fd522eb 3fa522eb", + "40000000 3f69cfb1 3f5c5e6d 3f81d814 be72bc85 be2a4d87 3f8122e4 -> 3ee0e2de 3f0737a9 40420eee", + "bde60d09 be750c4f 3d59effe 3d59effe 3f972421 3ed88c9c 3f2ffdfa -> bebe6f3c 3bbab518 bcc4bc98", + "3f71d62b 3f90e7ad 3f893358 3f8980bd 3ad777c1 be00cf79 3f9801e1 -> 3f911a90 3f73faeb 400c8cd6", + "be00f3e2 3f94da16 bdfaf056 3f94da16 3f0e4165 3e2a67fa 3f56f9bd -> 3f8be50f be12edc0 3f8750e1", + "3f759ab9 bd92e004 3f852088 3e9b901e 3f9327f0 3f1dc992 3f8a4cb3 -> 3f840029 3fd0d12b 3fab9304", + "3f8ea3d2 3f97a8aa 3f5616ff 3f97a8aa 3f677a03 3e11967f be0d958f -> 400c513c 3f7ea652 3f83efc6", + "3dfcebea bd1d40fb 3f7b0f76 3f5fb612 3f000000 3f400000 3f400000 -> 3cbf55de 3f8962ca 3f776c30", + "3f7866cd 3f8cc0ea be756f4a 3f97ff2b 3f8a9f51 3f976cf9 3f976cf9 -> 4009a176 3f6880ee 401576c6", + "bebb1dda 3eababc7 3eb30114 3eb30114 3f0d8b12 3f92df2b 3f0d8b12 -> 3e086d5f bd8eccd8 3e1717f9", + "3f1a1664 3f185826 3eb824d6 3f81d760 3f1b0456 3e97eb2e 3f457161 -> 3f75a650 3f09cacc 3fbd431c", + "3eb189f0 3f2e09e4 3e4fdf97 3f2e09e4 3f944fb1 be22a4e8 bda794db -> 3f8a7274 3e1779c4 3f26c661", + "3f974f20 3f8ed5dd 3f9231a2 3ed9db91 3e800000 00000000 3f400000 -> 3fb4a9a5 3f9231a2 3fa7f23c", + "3f261f17 3e1d9577 3eefcb22 3eeeae63 3ecf643c 3f9db157 bc1b5216 -> 3ed55eea 3fa246ee 3eeb8812", + "3ef0981c 3f8826d7 3ef30ea9 3e6957d3 3eea14ed be5f0170 bdc34be4 -> 3fa3a6ad 3ebea932 3e3b7507", + "3fbc8102 3f25f95c 3f2defdf 3e6e0f55 3f065433 3f54c95b 3f0360c7 -> 3fb5e636 3ff3a70a 3f7cfe63", + "3f7c059b bd870fe2 3e206f4e bd870fe2 3e800000 3f800000 3f400000 -> 3e387daa 3f9210b7 3f2c2238", + "3f9621d8 bd92631d 3f27bc42 3f23a315 3f6bf032 3e21b446 3f6bf032 -> 3f8137bc 3f5726c4 3fdc2f7a", + "3fbb1565 3dbebeb4 3d319961 3d319961 3f179f97 3f179f97 3f910f4c -> 3f757456 3f68b614 3fd99163", + "3fa57a96 3f316023 3f316023 3f8516b0 bda7e389 3ebd3b69 be088af6 -> 3f163ea0 3f95d906 3f5e0be6", + "3f0b8be1 be542ee5 3f3e6977 be542ee5 3f000000 3e800000 3f000000 -> 3d85d1ba 3f614c6f 3d85d1ba", + "3fae750e 3df90114 3df90114 3f784fb2 3f92de1b be7ae89d 3f917d64 -> 3fd7bc4d be597920 402139ac", + "3f164eb8 3df6b027 bd4fdd21 3ea4e133 3f7803c5 3c2472b6 3f7803c5 -> 3f30747e bd37b9af 3f640f12", + "3e9e9b5c 3f6a7de6 3de68557 3f6a7de6 3f0dd2cd be2bd426 be2bd426 -> 3f8b367e 3d782041 3f5d2f3f", + "3f3351e0 3f1a91be 3e9a13a6 3e9a13a6 00000000 3e800000 3f000000 -> 3f1a91be 3ef3bc96 3f26b2c3", + "3f24560c 3efc4adc 3f3b1957 3eff3e91 00000000 3f800000 3f800000 -> 3efc4adc 3fafb7b2 3f91faaa", + "3e51e9b0 3ec6b975 3ec6b975 3eddac28 3ede95ee 3ef8c2d8 bdd1a2bd -> 3ef45a5b 3ef9b7fe 3ed2edd4", + "3f149035 3f60c262 3f60c262 3eebfe4a bcf9f548 bcf9f548 3f81caf2 -> 3f5c39ed 3f5c39ed 3f865204", + "be2569d0 bd9770af 3f89141f 3f663f01 3f4d0000 3e4e91df 3e171fd5 -> be502e14 3f84e854 3f6024a1", + "3f80a226 3f828e24 3f695d0b 3f695d0b 3e444a61 3e2ccbf4 3e2ccbf4 -> 3f9b3685 3f8a6361 3f8a6361", + "3eff0bd5 3f9e0e5b be786731 be786731 3f1594bb 3f8a0b4a 3ef4e048 -> 3fc34fdf 3e96dba8 bb8e0f00", + "3e0c37ce 3f35eadd 3f35eadd 3f9afeca be65d08b 3f1eb9da 3f1eb9da -> 3f2e0cdb 3f4ba6ec 3fa5dcd2", + "bee643f4 3f903211 3f8f9c72 3f903211 3dae27f0 3f0bae1b 3f0bae1b -> 3f8b4ce0 3f606724 3f619262", + "3d09fd5d 3f95c49f 3f6efd25 3ef32415 3f801995 bcc1d27e bcc1d27e -> 3f9a1567 3f6ec8e8 3ef2bb9c", + "3f26243b 3db89ab7 3db89ab7 3f1add2d bd144d39 3f2a9403 bdb1b727 -> 3d887b2f 3f05c775 3f0c7270", + "bd829d82 3f8eddb3 3f8eddb3 3d811d29 3f14a21f be1d5041 3f14a21f -> 3f8a2057 3f901ec1 3cd51d8a", + "3f43259a 3f97e330 3f84a084 3f84a084 3d8f8950 be5f85ab be5f85ab -> 3f9eb9db 3f5ea81e 3f5ea81e", + "bef9e6b1 be1ef3e6 3d9593a6 be1ef3e6 3f19de53 3de848cd 3de848cd -> bee5adda 3c90ce54 be57a3ee", + "3f817b67 3f1529ce 3f219c66 be1400ce be07f8e7 3f7509ae bd1ceb99 -> 3ee58da4 3fccbe32 be3baffc", + "be0a1a7a 3f9b2946 3e872cd2 3f9b2946 3f7cd9de 3eafd8f8 3f1e428b -> 3f8a1c53 3e5eeb11 3f907d3e", + "3f1a2d95 be37af22 3f67963c be37af22 3f872d9c 3e37a840 3f872d9c -> 3ee9ce75 3f819e9b 3ee9ce75", + "3f9dcd95 be5a2fc0 3dab41ad 3f81bba2 3e511689 3ed1d218 3f444d79 -> 3d1e56d8 3f16be8e 3ffabcc9", + "3f23c22e bcb3ee13 3f679707 be42a673 3ea33c77 3f876164 3ea33c77 -> 3e3a58e0 3fca6536 3c6302f0", + "3f500d9a 3f4fce07 3f66dfb7 3f66dfb7 be3c574c 3e8542fe 3e8542fe -> 3f2989cb 3f8e833c 3f8e833c", + "3f8f29a3 3e90be5f 3e34238e 3e90be5f 00000000 3f000000 3f000000 -> 3e90be5f 3f3c3286 3f5788d2", + "3f570fe8 3f96c7fa 3f19bcef 3e3ad7d0 3e3c1558 bd847127 3f64b39c -> 3faa882e 3f0bd487 3f6ed702", + "3dc58185 3f96b1f0 3f706f7c 3f706f7c 3f9632e5 bd805f9f 3f86205e -> 3fa52e15 3f6ee352 3f852717", + "3f358fbc bde7f95b bd8c8f8c bd8c8f8c 3e22d698 3f208700 3f208700 -> b9ff0d00 3ec08f46 3ec08f46", + "be1f41ab bddd1800 bddd1800 3ebeb8ed 3e9a3355 be5df14f 3f159e95 -> be1e82b8 bd980f18 3e902efd", + "3f81596b 3ea10f1a 3e941594 3ea10f1a 3f7adf5e 3f7adf5e 3f9f1970 -> 3fa705f6 3fa3c794 3fc90a8e", + "3f80a170 3f8bc305 3f8bc305 3f0c5122 be664263 be3059ca be3059ca -> 3f5dacd7 3f6b37fd 3ec0062a", + "bea47975 3f5ba4f2 3eaddb51 be3d4bd8 3f8a30a1 be05ebb1 be05ebb1 -> 3f02dc3a 3ec35df3 be124695", + "bdbb120a 3e70d477 3f178134 3e70d477 3f444500 3edefbab 3e9bffd3 -> 3e291e59 3f0d521b 3e5454c0", + "3f05a9bf 3f406067 3f406067 3f0dadbe 3f9ed7d4 3e663ed3 bd228b13 -> 3fb31fa8 3f5e6e3b 3f085fde", + "3deff96b 3e9f9d7e 3f8e6efb 3e2dd59a 00000000 3f000000 3e800000 -> 3e9f9d7e 3f95eec6 3e4bd4c7", + "3db38bcb 3f590ecd 3f590ecd 3f1be6d7 3e800000 3f000000 3f000000 -> 3f5eab2b 3f64478a 3f271f94", + "3e9358ad baf25200 3f04926f 3f04926f 3e497ff5 3ed4d9fe 3f173f09 -> 3d6061fc 3f233329 3f30193a", + "3e538797 3f5cf4c4 3e1d96b6 3e1d96b6 3ef07aff 3f4cf53c bd0c7f29 -> 3f75cb5c 3ea378b2 3e165542", + "3f297e3c 3f7a6807 be1aa2e2 be1aa2e2 3f1e9d0f 3f1901df 3ec83d68 -> 3fb1b5f6 3e7a93da 3ddd0758", + "3fa376d0 be34424c be34424c 3f013fda 3f97855d 3f7d1437 3f97855d -> 3faaf832 3f8b110a 40011034", + "3f5ea4a4 3e3697a3 3e3697a3 3d3a91f1 be3dd055 3f33a1f4 3e9b2d29 -> 3c8c1730 3f49dfe1 3e9e4734", + "3fbd898a 3ea2b1b7 3dd27781 3f24318b 3ead464f 3f997b4f be795e69 -> 3f51a2dc 3ff06c76 3e8fc269", + "3f528dc0 3c64d3f6 3e9ebc38 3e9ebc38 3f48c31c 3f48c31c 3f736d0f -> 3f28b287 3f747d53 3f8bca2e", + "3f533eef 3f4b3f7a 3e50e652 3f4246ed 3e800000 3f800000 3e800000 -> 3f80079b 3f83bc42 3f7716a8", + "3f00ca59 3f71c2d2 3e9f8fe9 3e9f8fe9 3f035bbc 3eae0137 3eae0137 -> 3f99ec42 3ef71a0e 3ef71a0e", + "3f06d642 3f1084e4 3f29975c 3f1084e4 3f9bcfd1 3f849341 3f6e8523 -> 3f9a53a2 3f9a9fb8 3f87131b", + "3fbd85f3 be49b1c5 3edd77fd 3edd77fd 3f400000 00000000 3e800000 -> 3f69dc7b 3edd77fd 3f4d7ef8", + "3fad6a6b 3f94b501 3f9104f0 3f94b501 3f8dbcb2 3ee2c768 3ee2c768 -> 402a5df1 3fddd474 3fe18484", + "3ee4cd43 3e806eb7 be08ff46 3f662658 bc120fee bc120fee 3f2ee807 -> 3e7cc914 be0d13a0 3f9a27e5", + "3e8c6713 3e23c2e6 bc1926da 3eef3ed3 3f818566 3e8f8a1e 3f38d057 -> 3edff3a7 3d8a4dcc 3f2a4d96", + "bebbd6c6 3d997dcf 3f8e4836 3d997dcf 3e800000 00000000 3f800000 -> bc8963dc 3f8e4836 be957752", + "3eb8def7 3e79cac8 3f946150 3e79cac8 3eb13120 3e0111a6 3f89eec3 -> 3ebce035 3f9a34a2 3f220e70", + "be8e5dc2 3f69bac2 3f2a4526 3f82c757 3e89d0aa 3edfad36 3e5cc56d -> 3f5691b4 3f0b2c26 3f7635e2", + "bd9a9f34 3e87b88b 3f8816ab 3f8cefdd 3f18888b 3d257ac7 3eccdb37 -> 3e616096 3f87b2b8 3f891203", + "3f2fc406 be14ef0a 3f96df7b 3f9a7468 3f1e77a2 3db3982a 3eb3cfa2 -> 3e8f22b9 3f9e9464 3fb9518f", + "3fba347e 3ea1d847 3f99f668 3f51d31b 3eb08438 3f7bd09f 3eb08438 -> 3f515066 40288fd0 3fa91bb0", + "3e96b670 be60d981 3f5cf226 3f5cf226 be25b5d8 3f63cd44 be472190 -> be88d06a 3f90003a 3f4e4ab4", + "bc28351b be7c2ecb be7c2ecb 3f460ef4 3ee8df00 3f9da530 3f9da530 -> be807b70 be8490b7 3f42d24b", + "3f88e7c7 3ed11c58 3f052f96 3f81ae81 3f7fe53c bdba5284 3f7fe53c -> 3fbd208d 3ed88ce8 400543fc", + "bee46f65 3f8245a0 3f75e0dd 3e85f4d3 3edb22d5 3f851816 3f851816 -> 3f53a8a8 3efe3aff be4f23d0", + "3d75cfc2 3f987774 3f07c6b5 3f03b9c9 3f70dc29 3f6815d6 3f1c6bf5 -> 3f9fb1a5 3f15b449 3f0d1ced", + "3cebdd10 3e7b8520 3f090ed1 3eb41ace bc95d032 be0b1b0e 3f6932d8 -> 3e7afb19 3f080e7d 3ec1887f", + "3eb74f5e 3e75299f bdaf343c bdaf343c 00000000 3f000000 3f400000 -> 3e75299f 3dbf6a80 3e3b5cee", + "3f7ef1ee 3d9bb89c 3f434660 3d9bb89c 3f910689 3eefc7d7 3eefc7d7 -> 3f9a2914 3f9d55e8 3f0adc84", + "3f776a02 3de5b2e0 3f0c5de0 bdd9b609 3f413ae7 3c866553 3f88c099 -> 3f577635 3f106cfc 3f6d1e27", + "3f200c27 bdb46651 3e8ac3d2 3f415ebe 3ec21105 3ec21105 3ebcddee -> 3e18748a 3f020bd6 3f7c6893", + "3fbef917 be33be18 3f5c84d6 3f47e838 3d7b1c42 3e852d8e 3e852d8e -> bdac28e2 3f9fef1c 3f95a0cf", + "3f96db86 3a592a22 3a592a22 3f8dcb1e be24e070 3f270068 3f9f93e6 -> be41789e 3f45092e 4024ef0f", + "be1b794d 3e34ea59 3f923c4b 3f01d563 3dd61303 be57e03a 3f286df7 -> 3e24a9fb 3f965523 3ed08594", + "3f0ef506 3f435c24 3d5f13a6 3d5f13a6 3f8485ef bd84b814 bd84b814 -> 3fabaf34 3c95b2c2 3c95b2c2", + "3e5bfc0e 3f9808a3 bdb74be2 bdb74be2 bd1aa93f 3f8af656 3f8af656 -> 3f96fed5 3e132d2a 3e132d2a", + "3e9c13be 3f95a0e8 bd219722 3f34f948 3f3bedcf 3f274e41 3d949f41 -> 3fb245c2 3e239b64 3f3aa310", + "3f74d057 3f62c7cb bdaa6371 3f79b30c 3f000000 3f800000 3f400000 -> 3fae97fc 3f5f83e9 3fd8a7a6", + "3f4a442f 3f95b7b4 3e16bee6 bd8a473e bd937f85 3e6aad7f be69bfda -> 3f8e6f16 3ea81526 be7dd342", + "3f78e7b1 3f222067 3f96aa55 3f96aa55 3f7a1ab5 3f7a1ab5 3f6f92c8 -> 3fcaa650 40082039 400590eb", + "3eb8231b 3f249985 3f4d7efd 3f3b09ca 3ea235d1 3ea235d1 3f46733b -> 3f41c4c0 3f6aaa38 3f813467", + "beb85908 be148127 3f5ffb81 3f97b1c3 3e818b6a 3ea9dec0 3e818b6a -> be71ca68 3f4166b6 3f8c089b", + "3ea0114c 3f4a80b0 3f524ce1 bd673577 3f000000 00000000 3f000000 -> 3f728503 3f524ce1 3dcc87dc", + "3f56c7bc 3f89d627 3ef66f6f 3f89d627 3eb3b3aa be448e96 3f7c3fe3 -> 3faf8740 3ea3fb28 3ff3a742", + "3fb1940c 3f646f4c 3f4ba6a5 3f646f4c 3f351ec1 be3bfac5 3f862de0 -> 3fefdaa7 3f0a741a 40162f24", + "3f65e1d2 3f240feb 3f8df727 3f4c78c8 3f2814f5 3e30990f 3f2814f5 -> 3f9d7f77 3fa1c9bd 3fb1b3e6", + "3fa03ff6 3f74355c 3f8d9c2e 3f84ca95 3e1f2de5 3e1f2de5 bd92702d -> 3f9303cc 3fa6854c 3f72aa7d", + "3f917c3c 3ee62655 be52505f 3e262a63 3f60f207 3e885b45 3f60f207 -> 3fb95fd6 3dc74e32 3f949b8c", + "3f621b06 3f8e83a2 3e648f5d 3e648f5d 3e800000 3e800000 3f800000 -> 3faac703 3ee35531 3f8d9f6f", + "bee03487 3e5bb498 3f99b83c bd6c52ac 3f63ad8a 3e83ca0e 3dd5f2ae -> be331888 3f8b4ac1 bdd3d975", + "bdda402b bd8256d2 3f16d867 3e8ee873 3f0c0314 3f16cc80 3f16cc80 -> bdf9b48a 3f06c669 3e5d88ee", + "3fa262c4 3e77cd2f 3e77cd2f 3e10672e 3f400000 3f400000 3f400000 -> 3f98c3b9 3f98c3b9 3f8bd6f9", + "3eb8684b 3e9acd22 3f745f6d 3f745f6d be25f160 3ec54fc1 3e98a83c -> 3e79d5b8 3f8bf3ed 3f87ee9a", + "3f4b19f5 3eadfb40 be27e610 3eadfb40 3d7ce18f be5de968 3d7ce18f -> 3ec70f50 beabfa53 3ec70f50", + "3db077fd 3f743edd 3e351da1 3f08d5e6 3f974a2b 3da6f0cd 3f434c01 -> 3f8728ab 3e3c4ede 3f19a9df", + "3ecfc9e7 3ed82636 3ed82636 3d5d6f67 3f270051 3f1752ab 3f1752ab -> 3f2fd996 3f297cb3 3e96811d", + "3f57cdf6 be521e06 be325f48 3df282c5 3ecd5738 3e9c72f6 3f8fa176 -> 3e0814e2 3daacb1c 3f883c55", + "bec5d72b 3ed326db 3efe63be 3f56865c 3d2994c9 3edf381d 3f314496 -> 3ecaf5fb 3ea822d8 3f1206f9", + "3f1ebd0e 3f3f2b18 3d02ca79 3e6d32f7 00000000 3e800000 3f400000 -> 3f3f2b18 3e3f6fac 3f325a88", + "3f01ac00 3f75ab1c 3e723f74 3e5bed85 3e800000 3f000000 00000000 -> 3f8b0b0e 3efacbba 3e5bed85", + "3fb56e2b 3dcfd0e5 bdce1f64 bd2b0379 3f91a67d 3f35fe8c 3f59be34 -> 3fdb6fd7 3f6832aa 3f94f913", + "3f96ad80 3f5cf303 3e819ce0 3f5d38d4 3e924f29 3e6d3980 3e924f29 -> 3f998847 3f069eac 3f99ab2f", + "3e54e72d 3f3666f5 3f87620a 3f3c4c3e 3f68ff92 3f68ff92 3efe43b4 -> 3f66d878 3f9f9acc 3f56baf4", + "3f57bed7 be713f0b bdc9db65 bdc9db65 3f6f6b4d 3f4e0fb4 3e9ff142 -> 3f0d75d5 3f146d60 3e28a802", + "3fbcfa43 3e5dd3f3 3ec27e31 be30a7df 3f000000 3f000000 3f800000 -> 3f746f40 3f8f1cad 3fa6e547", + "3e705ad9 3f21a656 bb477fff be0c14aa 3f752486 3eb88364 3f5f9cad -> 3f5b30a5 3da700a8 3d8bbb24", + "3d81858f 3ea0205c 3eacaf7b 3f649273 be2e79d4 3e9b0ffc 3f9c6156 -> 3e9a9bf5 3eb67dfa 3f785a1c", + "3f5c6e2c 3e0c7d2d 3e0c7d2d 3f86d949 be46c741 be46c741 3ef9d94c -> bcf55cd8 bcf55cd8 3fbca1da", + "3f61f4f1 bdc500aa bdc500aa 3b7e2fe0 00000000 3f800000 00000000 -> bdc500aa 3f4954dc 3b7e2fe0", + "3e72f876 3f3c15fd 3c034dc7 3f8c30c0 3f400000 3f000000 3f000000 -> 3f69a493 3e01b117 3f9b6047", + "3eb3e678 3f72e4d1 3ecd4364 bde2dafb bd85eedb bd85eedb 3f360fba -> 3f6d02e8 3ec17f91 3e0e7450", + "3eb5386a be69d82a be03d495 be69d82a 3de8cda7 3ed11b3b 3f596b5d -> be40a4fd 3c818e00 3d93f2f4", + "3f9c648a 3e4c8225 3ebe357d 3f59e1fa 3f360998 3ddef0b8 3ddef0b8 -> 3f88c59b 3f01274e 3f7bee8a", + "3f2cb0ff 3f61f8a8 3f486999 3f346de2 3e118f17 3f92e69d 3f03b868 -> 3f7a84da 3fc74d50 3f86a46d", + "3f0fdb3b 3f7efb6d 3e11db1a 3e11db1a 3d414d89 3d414d89 3f2c9310 -> 3f82e2b5 3e2d0310 3f0570b6", + "3f6e3a46 bd18835b bd18835b be4c4c24 3f364cf6 3f2e459d 3f1d5771 -> 3f201cd6 3f18a42d 3ebeb026", + "3f7084ff 3f6ec26b 3f6ec26b 3f06a716 3d0a27e7 3f627800 3f3ecd6d -> 3f76df3e 3fe1c44a 3f9cf566", + "3dc64bd1 3f2465ce 3d9c9d68 3f2465ce 3e2ef6ea 3e995537 3e99a3de -> 3f28a204 3dd80011 3f2bd5f2", + "be722b79 3f867d59 3e8994a8 3f867d59 bdb83cb7 3e14ea8a bdb83cb7 -> 3f89367c 3e6ff190 3f89367c", + "3dbb8c63 3f885c17 3f8d46e6 3f8d46e6 3f1052d8 3f1052d8 bd137687 -> 3f8ef7d2 3f93e2a1 3f8cdade", + "3fabee52 bc62f3c2 3e94d064 3f970583 3f5b72ab 3e9288f2 3e9288f2 -> 3f919bfb 3f2cd216 3fc83a76", + "3ea78db7 bd9f413f 3f32fa88 3f8e9437 be781b9f be781b9f be1a317e -> be20d24e 3f1eae1c 3f88457d", + "be22081f 3d228cf9 3d228cf9 3ec25a4e be751188 be7302f8 be7302f8 -> 3d9ed4ec 3d9e2e48 3ed59441", + "3f8000c3 3f6cbb78 be792dc7 be792dc7 3f0495d9 be18606e 3f4a1466 -> 3fb8a90d bec8c78e 3f0bca28", + "3fa630a9 3f902208 3ed3484d 3eb608c4 3e45906b 3f8ce7bb be172c99 -> 3fb03254 3febc42a 3e27ca39", + "3f013a2f 3ea231af 3ea231af 3f6197d5 3f666666 3f666666 3f666666 -> 3f4566ce 3f4566ce 3faaf2e6", + "3f6fde72 3f1759f5 3f741eed 3f0bb60b be741a83 3e207307 3f886b3e -> 3ebc577c 3f8cda50 3fc5adae", + "bef1f212 3f376db0 3f99956e 3f376db0 3e56b867 bdb03817 3f85a567 -> 3f1e0fdc 3f9ec9c9 3e647a6a", + "3e823ef4 3e325610 3f48e6b8 be59c53c 3f90956e 3f9ad638 3f9ad638 -> 3eec49e8 3f8bd6ca 3dc2ac68", + "3f372550 3f408218 3f7be79e 3e498b96 3f8a0fc7 3ea21f0b 3ebdbee3 -> 3fc30672 3f9af2c4 3eec84e7", + "3f12ce02 3f5ca8cd 3f9164db 3f3356a5 3f400000 00000000 3f000000 -> 3fa561a7 3f9164db 3f7cbda6", + "3fa6dee4 3f4c48af 3f89ce46 3b361e05 3e77a1a4 3e77a1a4 be5ec941 -> 3f8e7ef2 3fb228e0 be8fcc3d", + "3ee2b621 3ea97078 3f5e0174 3f83acb8 3f000000 3f000000 3f000000 -> 3f0d65c4 3f8b577e 3fa0037c", + "3f37ab17 3f0d0693 bcbd29ad 3de8ca84 3f272a57 bb5f1c2e bb5f1c2e -> 3f827ac8 bcd12bf5 3de3c9f2", + "3fa3a857 3f30dab0 3f865eeb 3f30dab0 3f3b917d 3f3b917d 3da6543d -> 3fd05651 3ffe47e6 3f4b6ff1", + "3f45e3ba 3f0360d9 3d9dd96a 3d9dd96a 3f853240 3f3078b8 3f853240 -> 3fa8a694 3f1c250e 3f61a77c", + "3e8ff0dc 3db81ed0 3f58dfbc be3bcef9 3f93487c 3f163cae 3f163cae -> 3ed3a7d4 3f818e2e bc96e3d8", + "3ec377d7 3eb22145 3f9236d7 3eb7775a 3ec715dd bd2dfe55 3e9c6014 -> 3efe22b2 3f90236e 3ef32a8c", + "beb4086e 3ead16a4 3e1d7e06 3ead16a4 bde94fcf bc17f7ed bde94fcf -> 3ec1991e 3e20d501 3ec1991e", + "3f7d465b 3f0775a9 3f87d1ba 3ecee952 3f35e30a 3d093eab bd9d9184 -> 3f9db484 3f8c0fff 3ea7f04b", + "3f1a8462 3f54dbdd 3f54dbdd 3f328879 be380d67 bdbed335 be380d67 -> 3f39160e 3f467625 3f16c2aa", + "beeda3f6 3ee2762f bcdfd3cb bcdfd3cb 3f66f3c7 3f66f3c7 3f075438 -> 3cc12960 bee460d7 be8b9ce1", + "3ed2beec 3efd572e 3efc2b9c 3efc2b9c bc07b9c2 bc07b9c2 3f9b9772 -> 3efb9840 3efa6cae 3f7e2c13", + "3f8cf371 3f95bfc4 bd5dd88f bd5dd88f 3f04e7b4 be3c2c3a 3f982265 -> 3fdeecdd be835633 3fa09832", + "bdf48f63 3f69e5c5 3f8cfa84 3f69e5c5 3e5f0a68 3f64a44c 3f9133c1 -> 3f633d2e 3f7ea773 3f47381b", + "3f9376c3 bd09aac8 3e68ecec 3e68ecec 3f5cd0e9 3d2a462d 3d2a462d -> 3f75ca1e 3e8cfbc9 3e8cfbc9", + "3fae57f0 bd5d5956 bd5d5956 3f9d866b 3e800000 3e800000 3e800000 -> 3e92acc5 3e92acc5 3fc91c67", + "3f9666e0 3f962bc7 3f7bf1f6 3f962bc7 3f88e4d0 3ec1a2f0 3f8064f3 -> 401b82f9 3fb6daa0 401684a2", + "3edb8198 3f4603ab 3f5166ff 3dfeb338 3e8d2b32 3e9e175b 3deb40d9 -> 3f644686 3f734a80 3e31c780", + "3f735260 be0e8200 bd170a97 3f3e309c 3eb2ffba 3f90e570 3f90e570 -> 3e45c2ae 3f850014 3fe8d0b7", + "3d830ff0 3f34c424 3f4e61a3 3f828ec3 3f0cd9c8 3f0cd9c8 3f03caa8 -> 3f3dc7ab 3f57652a 3f86c652", + "be086618 be34c61f 3f9549df 3f858a0a 3e6ac47a 3dd6cf46 3dd6cf46 -> be540b9f 3f938010 3f83c03b", + "3efc2448 3f95c271 3f8879f1 3f82b358 3f261f1d be207452 be661111 -> 3fbea9fc 3f7d32ba 3f691383", + "bca437d9 bdb5f39f 3f242391 3f6690d2 be709a1b 3f0f2c84 3e84b294 -> bdac4e2c 3f2144d3 3f653c55", + "3ef50f60 3cc07db2 3eac810b 3f99c723 3f464fe3 3ed5f500 3f825a29 -> 3ec9de38 3f09749a 3fd82b32", + "3f47b3b0 3e74c92d 3f87af90 3f87af90 3eb996f2 3f209fe4 3f402420 -> 3f059598 3fc65614 3fd2a109", + "3e297180 bdfe2766 bdfe2766 3ebde5f5 00000000 00000000 3f800000 -> bdfe2766 bdfe2766 3f094f5a", + "3fa70fde be5e17b4 bd85815d be5e17b4 3f000000 3e800000 3e800000 -> 3edf13e2 3e85af87 3de01010", + "bd1dd068 3e68532b 3eac758e 3f5e1c42 3e800000 00000000 3e800000 -> 3e5e7624 3eac758e 3f5ba500", + "3dcfccf3 3f972d74 be3c7f19 bd9799f0 3f29e8af 3f7b63f7 3f90b266 -> 3f9fcc27 bdacef1b 3d269c80", + "3f88c1ce 3f6460a2 3f9fc9a9 3f06c7c6 3f5e05f5 3f5e05f5 3f264a49 -> 3fe8cb91 400b3274 3f9c393e", + "3fbb6859 3ebeb3f0 3ed77ea8 3f055fa5 3f38a4b1 3f93ec62 3e442aa5 -> 3fb6d88c 400739cc 3f4d2d32", + "bc0ff8d6 3f221800 3f93ec3f 3ee87d17 be374d92 3ee354c5 3f1cdbd4 -> 3f227f17 3f936c66 3ee5bb5d", + "3ee81fba 3e9b1aaa 3f87b273 3f6020a5 3e800000 3f000000 3f400000 -> 3ed52298 3fa4b66a 3f9b9645", + "3f938928 3f14ea24 3f405ec9 bc84ef0d 3f000000 00000000 3f800000 -> 3f9439a6 3f405ec9 3f91756c", + "3de06e17 bdac2896 3ee64d1d 3f7eb29f be3aea6a 3f32aad4 3ec63267 -> bdd51ff5 3f06bad8 3f84c75a", + "3fb9fad6 3f87207d 3f810d88 3da89d86 3f4f2876 3bd754a8 3ef2adfd -> 400ecfda 3f824667 3f456135", + "3e908d63 3f43b803 3f6c15c4 be11d1b1 3ed894ed 3f234e6c 3f234e6c -> 3f624adc 3f8d1876 3d1a6bac", + "3f19457c 3f9a509a 3f8cb433 3f6100ca 3f00b124 3ee422af 3f3e151e -> 3fc0d700 3faed9dd 3fa96780", + "3f9da090 3f4aa355 3f3f2b78 3f946e1b 3f66efb6 3f48f167 bcf7ff44 -> 3ff38386 3fdb4fd0 3f8fa882", + "3fb844f6 3f85705c 3ee65556 3f12af11 3ec5ba08 3f350fef be654a19 -> 3fcc99d8 3fbbe990 3e80531d", + "3e0a62c8 3f54710a 3ec5d4ee 3e31e1a5 3d273434 3d273434 bca09508 -> 3f55da95 3ec8a803 3e2f2b33", + "3eeecb8c bd69ade5 bd69ade5 3f8cff07 be499cc6 be21c3ab be309f6c -> be187381 be05ddbd 3f82b2fd", + "3f004675 3f5ec0da 3f80f508 3ef490e7 3f400000 3f000000 3f400000 -> 3f9f7ad9 3fa106a5 3f5a7d4c", + "3fa309be 3f3a042b 3f63941b 3f9c47d3 3ad8e0bb bd73f52e 3f948d05 -> 3f3a8e4a 3f50284e 402cbf5b", + "be980c01 3c9af438 bc67d302 3f77492d bcd09e71 3f2fe81f bcd09e71 -> 3cd8e826 be5f7154 3f7938cd", + "be9aa41b be512c8f be512c8f bb9a03d6 3e914dc2 bd35d11d 3d527b48 -> be94793e be437204 bca5a60c", + "3fbfb88b 3ef57d66 bd10e63b 3ef57d66 3f30817f 3f8e2415 3f30817f -> 3fc18f34 3fd05f94 3fc18f34", + "3fbfe8e1 3f00dbe7 3f00dbe7 3e90eff2 3f800000 3e800000 3f000000 -> 40002b6a 3f60d058 3f84306d", + "bec7088b 3e00fbb3 be5dfa4f be5dfa4f 3e3ea144 3f841f39 3f841f39 -> 3d5b835a bf1e3742 bf1e3742", + "3f1bfe0c 3efba060 3f211d8f 3f553e78 be6f12fa 3f1e385f 3f5c08ab -> 3eb2c982 3f80c35a 3fada90a", + "3f4031f8 be18e5e5 be18e5e5 be795827 3f90fb07 3f5cc6ee 3f5cc6ee -> 3f3377aa 3eff0da2 3eced480", + "3e9f2d59 3ce17afe 3dfdd88e 3ce17afe 3f511f7f 3f7eaa55 3f7eaa55 -> 3e901f4b 3eddcf0a 3eac7097", + "3e33c0ff 3d69ffd1 3d69ffd1 3f8062fd 3ed8182d be30eacc 3f130996 -> 3e065ddd 3cdb8c88 3f8d4acf", + "3f0159e7 be2c9f1b 3efecc52 3efecc52 3effa55e 3effa55e 3ee60c78 -> 3dab723a 3f3ffc37 3f3984b2", + "3faaac20 3eba9242 3eba9242 3e173ad7 3e255f7d 3f352005 3d9d1341 -> 3f14696e 3fa7659c 3e7ff33e", + "3f15af6a bd850041 be1e99ff 3f8bf20d 3f638b23 3f638b23 3e9a7042 -> 3ee8d7bc 3ebacacc 3fa28558", + "3f8684f5 3e25aba4 3f71d3b3 3f292116 3dffe107 3f61fcf9 3eac57f4 -> 3e96102a 3fefa9a2 3f81d851", + "bd336a47 3f564a38 3f564a38 3d530005 3f874632 be5e74c3 3f874632 -> 3f4a7070 3f58b9d8 3bab1c50", + "beb42912 3f32a07d 3df23d56 3f32a07d bdd2f803 3f898a18 3f6fa6be -> 3f3be801 be8506fe 3ebc9949", + "3e067c7b 3ed0d5e9 3ed0d5e9 3f609aeb 3f81c928 3eef5ec9 3f6b4bb7 -> 3f0a8228 3ef045ea 3f7f81ee", + "3fae3717 3f37023b 3f945283 3f945283 3efe3b37 3f81c4e5 3ddb1556 -> 3fb20298 40227902 3fa6f577", + "3f69c070 3f91c00e bd0a37f8 3f51e4a9 3f000000 3f000000 3e800000 -> 3fcc302a 3ed87971 3f862a62", + "3f5f83e6 3f417261 3e333092 3e78e661 3ebf9298 3eb74146 3ebf9298 -> 3f8a8a0a 3ef99891 3f11db4c", + "3fb13059 3e018267 3e018267 3f84338d 3e9b2cf9 3f866d16 be3e4d5b -> 3f0bc800 3fca45ec 3f468b64", + "3f2bc41e 3f279800 3f4f3548 3f4f3548 3e1b4d37 3f98b630 3f98b630 -> 3f41a4e3 3fce1154 3fce1154", + "3fa91115 be7616ca 3ef7cf04 3f65eb58 3f95bb67 3e525bca 3f95bb67 -> 3fa70290 3f415dd2 401c5d8c", + "3ebe0964 3ea9aa1b 3f61e3be 3f61e3be 3f85c22e 3f85c22e 3f3de09f -> 3f382014 3fa29762 3f942eca", + "3f6eabfe 3e74c5a5 3e74c5a5 3f9ff31d bdaff55c 3f2e74f1 3f7eb621 -> 3e22bf7c 3f5fd756 400b57ac", + "bec986a7 3ec27ca2 3f6e0ca5 3f6e0ca5 3f2b8d29 3f501118 3f2b8d29 -> 3dedc244 3f1c2737 3f2a869c", + "beb74123 3f0fd083 3f9bd807 3f9ac212 3f3f31df 3f90ade6 3f90ade6 -> 3e96c3ba 3f501ef0 3f4df304", + "3d643430 3f8757f9 3f29f513 3f8757f9 3e4ef1d1 bd6b3b3c bd6b3b3c -> 3f88c8ec 3f292362 3f86ef21", + "3f28be87 3e67e4f3 3e4f6827 3f9b97a1 3ecba06e 3f5716d7 3ecba06e -> 3efa2b4e 3f41a11b 3fbd25d6", + "3f317ed8 bdc61998 3f382432 3f382432 3f06a845 3f06a845 3f663a8d -> 3e8933ba 3f8ac0a2 3fabe260", + "3f8959b3 3f3bfb08 be10b7c0 3f3bfb08 3f064d33 3f08876c 3f4ed42c -> 3fa60be4 3edca55e 3fccf588", + "3f8b01b7 3f97cc2c 3ea3bf8a 3f1f52fe 3f524469 3f14b0da 3f975763 -> 4004fc5c 3f7359d0 3ff4046c", + "be5ceea0 3ea1cb19 3f878f83 3d0764c8 3f151c21 3f0cdbd8 be1fcb9b -> 3e42e707 3f70baf8 3d88a65a", + "3f5f1cc6 3f6b4278 3f6b4278 3f13004b 3f0cc0db 3f0f8a79 3f0cc0db -> 3fb2f725 3fb42e1c 3f86d60e", + "3f28082b 3d2c8dd5 3d0922c0 be4253e8 3cdc7e6a 3f5bc688 3ebc8bc1 -> 3d74ead4 3f18d378 3d54be34", + "3fa74ad5 3dbef370 3f9cdfed 3f9cdfed bd342234 3f12b3c2 3e76a048 -> 3d1278f1 3ffcbe12 3fc52a97", + "3f68f174 3f283181 3f6fab9a 3f283181 3f983382 3ec8a05f 3f9e30e8 -> 3fde96fc 3fa57971 3fe40a46", + "3e1cf473 3f80418d 3f3225f0 3f3225f0 3f136da5 3f136da5 3f6371f6 -> 3f8b8e00 3f48bed6 3f550298", + "3f7d0e25 3f53d4be 3ef7e975 3f61a9e8 3f18e265 3f688faa 3f188d26 -> 3fb57a78 3fb0ebc7 3fbc3aea", + "3f9ac669 3f524b0b 3e35c9ff 3f3707d2 3d7488b5 3f72a854 3d7488b5 -> 3f64c603 3fa96e94 3f4982ca", + "3f58ea33 3d1219b2 3f82f002 3d1219b2 3eea8fc7 3f450df7 3f450df7 -> 3ed9031c 3fd66c0a 3f3019a9", + "3facf049 3ee53761 3d518432 3f8397fa be510b91 be3f067b be3f067b -> 3e2ffeca be4db642 3f46aa20", + "3ecfe45d bcdb21da 3f757b1d 3f4fa872 3f134551 3e37b689 be22430a -> 3e53cc9c 3f841096 3f3f2fd4", + "3fa13f2a 3f48da43 3f9f36f5 3f0d031a bd84d50a 3f8d4572 be273121 -> 3f33ef93 40289703 3eb0b70e", + "3ecb607e 3eaf6124 3e1af86c 3e1af86c 3f569bef 3f569bef 3f70f46f -> 3f2cefd7 3ef7fac1 3f06746e", + "3f8ef798 3a5c33ed 3cd45331 3f335682 3ee21d86 3ee21d86 3f9b760b -> 3efcfc3c 3f04e9ab 4003a776", + "3fa5fed6 3f696123 3f696123 3f82ade8 3d83a337 3c5afd94 3d660862 -> 3f7eb7f2 3f6dd11e 3f8c006e", + "3f24e312 3e597e54 3f181a3d bd94010c bd6672d1 bd6672d1 3f3e1111 -> 3e3462d7 3f0ed35e 3ecfd6c9", + "befa368a 3f8424bd 3da94525 3f8424bd 3f75cf33 3f1d2f35 bd4c6f67 -> 3f102920 be5ea09a 3f8743fe", + "3d0f83ec 3f9c7e01 3f021824 3f48835e 3f6d59bf 3f6d59bf 3d9c2189 -> 3fa0a67d 3f0a691b 3f49326c", + "3f1db71f 3f8f1984 3f57e9c6 3f8f1984 3f438064 be6ec0f8 3f438064 -> 3fcb524f 3f3323fe 3fcb524f", + "3f652c5a 3ee7c341 3f1d15ae 3ee7116e 3f99fb27 3e2cc4bd 3f99fb27 -> 3fc3c927 3f43c029 3fc39cb2", + "3f56efc9 3f636925 3f636925 3efac920 be6066ea 3eb56351 be6066ea -> 3f344f16 3f97c74e 3e9c9504", + "3f7e41ec 3f028303 3f028303 be654a75 3f777d2d 3ede3a6b 3f96e5cc -> 3fbc2878 3f70de9a 3f726b1b", + "befbcbae be7bdd6e be7bdd6e 3f81bb66 3effe44d 3f927e4d bdbbc97d -> befbc6ee bf4f0dbe 3f878106", + "3e905c31 3ee9874f 3ebf3912 3ebf3912 00000000 3f000000 3f800000 -> 3ee9874f 3f03b395 3f27caa1", + "3f19e905 3dcd4f4d 3f2865b8 bdd30677 3f41936a 3f082993 3f41936a -> 3f0e0b37 3f7a4282 3eb400fd", + "3fa1992b bdc73ddb 3f5f3b71 3f024c5c 3f9ce9af be46b5e0 be3692be -> 3fb9a5d4 3f2083ce 3e915932", + "3ef87f67 3d6c0f1b 3f65678f 3f93f0bd 3f187d35 3ecae993 3f576ded -> 3eb18712 3f8b52b0 3fc8382a", + "3f2fee78 3e94a4a3 3f3134a9 3f11de24 3f800000 3f000000 3e800000 -> 3f7a40ca 3f8495f2 3f3dd9c2", + "3c83f9d0 3f2f5c6f 3f8a008f 3f2f5c6f 3f000000 3f000000 3f000000 -> 3f316c56 3f8b0883 3f316c56", + "3fb84283 3f5f2600 3ed9f66e 3f90182c 3f3a0325 3f7eb20b 3f7eb20b -> 3ff57596 3fedcfc0 4023b528", + "3f0185f5 3d8c60f5 3d9358ac 3f65a8a0 3f7b2593 3f8e1011 3f8e1011 -> 3f109d79 3f222bf4 3fbab4be", + "3fa4e1d6 3f440625 3f1709c6 3f440625 3f800000 3f400000 3f000000 -> 40037274 3fc72e44 3fb473fd", + "bd6bed51 3cd493db 3f654467 3f87b091 3effb74f 3f2ade88 3f9a64a5 -> bb38b3b8 3f5b6cdc 3f7d97f2", + "3f675b01 3f9d22ee bd78a252 3f9d22ee 3f82d1db 3f43cb5a 3eef3bab -> 4009ae66 3f2167f3 3fd32fe7", + "bee15485 3f6d416c 3ed22ff9 3f199cbe 3ee14859 3f59f8df 3f59f8df -> 3f3baeae 3d12a228 3e66bb94", + "bdb3e0ad 3f67637a 3f8b63ca 3bed2909 3ed15360 3f9e7a1f 3f8d75c2 -> 3f5e322a 3f7af0f6 bdb7f86a", + "3f7c1e5b 3efae102 3efae102 3eb230d4 3f8a956e be1f6b7e 3f8a956e -> 3fc733c8 3eac60a6 3fb507bc", + "3d5ce3ac 3cf3dce3 3cf3dce3 bdfe3677 be784803 3f61d688 3f73e72e -> 3c88bf8a 3d9e65d4 bd94fcac", + "3f4d7e00 3f4cda81 3f4cda81 3f21a6b1 3f608484 3db54229 3f544480 -> 3fc08990 3f5f0a67 3fa60502", + "3f19c359 bd81c74f bd81c74f 3f373097 bdc28165 3f6c3126 3f6c3126 -> bdf69b10 3efb4962 3fa28719", + "bd86e373 3f133a8e 3f4115be 3e29d010 3da23416 3e4158f2 be67dc0d -> 3f11e4b0 3f3de6bb 3e391576", + "3ef98d46 3dbbf12c 3f1a29bc 3f4c9df4 be3e45cb 3f7a9d42 be4fb676 -> 3a9d9240 3f8a282e 3f334e91", + "3f3e75d0 3e7819f1 3f800e96 3f89f1cd 3f95fd97 3f384394 3f3fd06e -> 3f8e9a7b 3fc49a10 3fd14c49", + "3fa0eb7a 3ebd4d07 3f8ccef4 bc705291 3ecb76ca 3f9ed774 3ee64502 -> 3f5e8be8 402a403e 3f0cfda6", + "3fa8d564 bd9faa1c 3d15033a 3f2d4ccd 3f1f4232 3f862ba7 3e514809 -> 3f3e1b1e 3fb5a113 3f724fa9", + "3fb15fa0 3f34abcd 3f34abcd bd69ad42 3f678a83 3f678a83 3f42cfab -> 3ffac328 3ffac328 3f7f59e0", + "bb2e456b 3e01d0f4 3f9266f9 3f0fe7c1 bd839bb1 bd839bb1 3f8b5221 -> 3e01fdc0 3f926c92 3f0f2a12", + "bedc32cf 3e189b52 3edb1b4d 3edb1b4d 3f5d032d 3f89dc0f 3f5d032d -> be6399e0 bd106d30 3d6805a0", + "3dbc545d 3f050b6d 3f71f23a bdcb90c1 3f13e692 bdaf8971 bd6eaf64 -> 3f12a52f 3f6fedaf bdd68a38", + "be41c356 be2c7e70 3f75f644 3f641516 3f529bb7 3f529bb7 3e50b8eb -> bea5f344 3f4e1c3e 3f5a356b", + "3f856aca 3ed7c670 3f7eb657 3ec30153 3f408511 3ef01449 3f0b118f -> 3f9a470c 3fbdea84 3f7274ee", + "3ef95f89 3f16e861 3f16e861 3f998094 3f4033fe 3e8ef418 3f4033fe -> 3f748588 3f39b892 3fc84f27", + "3fadea14 3e60a158 3f0c6c0d 3e60a158 3f5b3b1e 3f3c1f87 3f5b3b1e -> 3fb10393 3fc60358 3fb10393", + "3fb37c77 3f285ef4 bdf34f44 3f17163a 3f8ae411 3f1d8ce7 3f9c7d6f -> 400b78bc 3f3e8256 40137d58", + "3fa1bc84 3e34f955 3df67db1 3df67db1 3f1916bb 3f7afde4 3f1916bb -> 3f6eae63 3fadfa5b 3f603fc4", + "3f3a1a0a 3f851b86 3f185a83 3f185a83 3f432d0f 3f432d0f 3dd84dea -> 3fcc0cd2 3f931e8d 3f2c0256", + "3f44e74a 3f26d53c be07aa23 3f09ff29 3edba5b5 be172a5f be172a5f -> 3f7b4de4 be7bef26 3ed9dbd0", + "3e4867c6 3f9ef6d4 3ee1fbac 3ee1fbac 3f882eb3 3e89df41 3e89df41 -> 3fb99dc0 3efcf73f 3efcf73f", + "be8d8ccf 3f8b0f98 3f8acb88 3f8acb88 be2bdbe6 be2bdbe6 bcaee3ae -> 3f910002 3f90bbf2 3f8b8cef", + "3ea70af7 3f7d5e8c 3efc56e0 3efc56e0 3e0c8376 3f263c90 3d6c1ba7 -> 3f846a42 3f3467c0 3f02fbf1", + "3f98b7fd 3ecbb67e 3f6d974d 3f2a1614 3f400000 3f800000 3f400000 -> 3fa5779e 4007c1d1 3fc79508", + "3eedeb7e 3e04ea67 bde5a35b be7000d6 3e836680 3f4e6fb1 3f4e6fb1 -> 3e7f092c 3e867276 3e0fb5c6", + "3f11348f 3f52f35a 3f64e5bb 3f97ad0b 3f9af56d 3f407ef5 3e8a5ebe -> 3fc15e80 3fa90a94 3fab4c0f", + "3dd80395 3d6963b3 3f323c36 3d6963b3 3efda5a0 3ec3a243 3e0b8f04 -> 3ddfb580 3f3c8d70 3d922281", + "3f0be6b9 3ed82278 3f92ad31 3ed82278 3ea5000a 3f8272d7 3f8272d7 -> 3f192719 3fd9f71d 3f7aa514", + "3f87948c 3eab5742 3eab5742 3f277d2e 3f99b8f4 3e7efe4d 3da6cb5a -> 3fcda948 3f1931aa 3f3d92af", + "3ed565b1 3f6eb007 3e13480c 3e13480c 3f4dbbca 3f81b8f2 3f4dbbca -> 3fa237c2 3f10f46c 3ef522fe", + "be28c3a6 3f64f58c 3ed93b40 3f565758 3f7010d5 3f769990 be0cfecc -> 3f3d64eb 3e87f2a2 3f5c2687", + "3e3afa6c bda917a1 bd15175d 3f409a5e 3ed85304 3f9c60f4 3f4cb16d -> bbb17b40 3e3f28fd 3f65faa8", + "3eaab712 3f97378b 3f97378b 3f20c7da 3f762798 3f8136f5 3f191ba8 -> 3fc04120 3fc24cfe 3f53d4c8", + "be47496b 3f329920 3d454029 3f8305bd be22e279 3e8c98e0 be700cad -> 3f3a85ec bbad3140 3f88dcb3", + "3fbca4e9 be52dcd3 be34710c be52dcd3 3f747c88 3f64e4f4 bc53f957 -> 3f99cd58 3f921d74 be666347", + "bdf3a3b4 3c1c20f0 3ee33a83 3ee33a83 3f338fe5 3f338fe5 3e18e736 -> bd97604b 3eb88169 3eda222f", + "3f1ae82b be2dc943 3ec3df83 3f145ca7 3e746fac 3e746fac 3f216644 -> bccf0338 3f06e9f8 3f76068c", + "be00ffdc 3f947a1d 3f8b6156 3eb0af68 3ea510d5 3efcb59f 3e7946be -> 3f8f4747 3f836be0 3ea0fbd8", + "3ee4b5f0 3eddc0e4 3eddc0e4 3f62026b 3e800000 3f800000 00000000 -> 3f0b7730 3f613b6a 3f62026b", + "3fbb9a5a be76383d be011a64 be011a64 3f800000 00000000 3e800000 -> 3f9cd352 be011a64 3e761a50", + "3f222bfb 3e8312fb 3ef8fe37 3ef8fe37 be2c57e3 3ce7806d 3ebd9eb0 -> 3e18f8bc 3f011454 3f388e9b", + "3e07f0cf 3f912f5b 3f54f4d1 3ec9d1cb 3edc536b 3c9c8db1 3ef3fcd9 -> 3f987f4f 3f559b15 3eea35c1", + "3f573331 3ecb70ff 3f77a08a 3ecb70ff 3f908c92 3f55fc29 3f504c51 -> 3fac5f36 3fd5c10e 3f8a691f", + "bd8964bf bd830f50 bd830f50 3f9255a5 3f9f2cca 3dd26451 3dd26451 -> be16f544 bd912c9f 3f9173d0", + "bee91c81 be575d2a bd93cddb be575d2a 3e7c6bcf 3eddd232 3eddd232 -> bea52524 be89f1f8 bed0ad16", + "3fbcf9a3 3f85f203 3f85f203 3f77ff14 3eca19db 3f75d7d9 3f308112 -> 3fd08a0c 401db622 3ffe4a71", + "3d56606d 3f007f85 3f6a8c95 3f6a8c95 be2ff089 3f9d96b0 3f9d96b0 -> 3efc645f 3f7b0b7f 3f7b0b7f", + "3f102c41 3f1650a2 bd4533d7 3f133ca8 3f3779ce 3f4f8d78 3f4f8d78 -> 3f7da4de 3ed1206e 3f84100e", + "be70e3d9 bdce9806 bdd502de 3e863ab0 3f641814 3ec6a16f 3ec6a16f -> be9ef6cc be47f580 3e2f014e", + "3fbc8fe4 3eb87139 3f810229 3f810229 3e08ae68 bdc62e6a 3f15bae7 -> 3f0e8f10 3f5d85f4 3fef4b92", + "3fa81c15 3eee7316 3e688716 bde4c911 3f5b6440 3f5b6440 bdcd3f81 -> 3fcbaea2 3fad22be be792cb8", + "3f87aed6 3ea4db8f 3ed1c2fb 3ea4db8f be3af0fa be3af0fa 3f97ebcd -> 3e038d9e 3e5d5c76 3fca4119", + "bd913c61 3f529758 3f2fdf67 3f529758 be576515 bd1a287f 3f5e722d -> 3f5668f0 3f308e52 3f42d0f4", + "3f044be7 3ef09b3c 3ef09b3c 3f65ab7f 3f3209a5 3f0f468f 3f3209a5 -> 3f544f61 3f42587a 3fa0d6a1", + "3fbab7ba 3e04ad71 3f9b8e89 3f7bf705 3aedbfd5 3e99454d 3f65596c -> 3e076312 3fd373b6 4012a18a", + "3eaed88e 3f55bf35 3e46f34c 3f5eb777 3f60e20a 3f61ea58 3f60e20a -> 3f914592 3efdc60a 3f95c1b3", + "3f542a8d 3e8ccd12 3e8ccd12 3f205f75 bd45c990 3f6c98eb 3f6c98eb -> 3e709f31 3f853e40 3fb23ab6", + "3e5f5958 3f2d009f 3f8d9377 3e9e0e1f 3e81b3ad 3f7cc572 3e04c2ff -> 3f3b25b8 3fa9247e 3eac88a5", + "3f66f8db 3e4ddc3b 3e4ddc3b be160953 3f9b38d1 3f9b38d1 3dcbd638 -> 3fa5c777 3fa5c777 bd685414", + "3ed06058 3eaf5536 3eaf5536 3ed38856 3e6c6769 3f388353 3e6c6769 -> 3edf7075 3f22c2ad 3f01d1cb", + "be7887ab 3ebf659e 3ebf659e 3f223333 3f1c7ab3 3f874976 3f4ff8c2 -> 3e66e171 3df03b08 3edf72cd", + "3fbb8582 3e837f15 3e837f15 3f13db57 3e80f641 3e62e1e1 3e89de1a -> 3f2036ae 3f14d834 3f78d87a", + "3f19dd9e bd527392 3f86f8dc 3f9b6bcc 3f9dd5ca 3f9c0b7e 3ecd148e -> 3f309398 3fe4c2d0 3fba3c81", + "3e76f408 3c4c0815 3f1fd648 3eb7015f 3eb0ba11 3d856fdc be4ba9bb -> 3dc3fc46 3f23dc0e 3e9e7277", + "be5cece4 bd80b6c0 3f5867e2 3e352d94 3f16f83f 3f16f83f 3f84be6a -> be42a469 3f37d5a0 bd3fbd78", + "be9d7c94 3c1a7c31 3f65e3f9 3e726588 3f948084 3cf6a6b9 3f53ba11 -> beb1e248 3f638508 bc90d620", + "3fb19853 3f1939b7 3ef32c88 3f1939b7 3f86960e 3f9e76d4 3f86960e -> 4003ac42 400c5404 4003ac42", + "3db284b6 3f3528a2 3f9069fe 3f69b3b6 3f79f698 3d9167a7 3eadd5a3 -> 3f4af283 3f9134c9 3f714741", + "3fac0d29 3f8d5cf5 bbed3b68 3f7de3a1 3d277b83 3f979c79 3f1377ab -> 3f9465ee 3fcadc9e 3fe20dcc", + "3f6cc042 3eab5900 3eab5900 3f3d6636 3f92ef12 3e751318 3e751318 -> 3fb2b8fe 3f0e55ea 3f760fa0", + "3f94d900 be66981f bde7befe 3f56e81c 3f9b32e4 3e562b66 3e562b66 -> 3f97a6f0 3e052dc5 3f8a95b7", + "3f20ae83 3ef87768 3f835b1d 3f890fe8 bd3c416a bd3c416a be5c794d -> 3ee9b241 3f7f53a6 3f6f8749", + "3ee5728c 3f96376c 3eb72ffc 3f96376c 3e735867 3c62d1b7 3f0e9d6d -> 3fa3d91b 3eba5d28 3fb62c14", + "3ed9b78b 3f491a48 3eab07e4 3f491a48 3f910090 3f95ae1f 3f910090 -> 3fa235dc 3f54cfdb 3fa235dc", + "bef97d82 bd27377f bd27377f 3f7a9c5e 3edbdabb 3f4dd547 3f82498b -> be8008b4 bedd804c 3ef745eb", + "be3a3936 3d1357d9 3f4f9c12 3f4f9c12 3cbf7c89 be2a6e7c be2a6e7c -> 3d01ee70 3f575bb8 3f575bb8", + "3f7c9dad bb5a745f 3f69eff2 3f5979d0 3d56a1ec 3ec73560 3e389137 -> 3d462451 3fa61cc8 3f8380fc", + "3f767723 3f0f9d83 3f8ec747 3f8ec747 3e57d312 3e57d312 3dc0f544 -> 3f438fd4 3fa8c06f 3f9a639e", + "be09b423 3f41c7fe 3f41c7fe 3ec33a0a 3e006047 bc21a394 3f8da799 -> 3f3d7720 3f421ef0 3e6e0f57", + "bda0cf91 3f2f7d6e 3f83c7bc 3f83c7bc 3eb71e7b be0577ca bdb470d9 -> 3f284cf6 3f851718 3f84aa6e", + "bee3b9f3 3e21f655 3f1e74f4 3f576551 3f10b3c4 3f29d0cb 3f29d0cb -> bdbef55e 3ea5da6a 3f0bdd92", + "3fb1bef7 bd132c74 3f83060e 3ea646e5 3eeff4f7 3f8af0f3 be65cf61 -> 3f1d6896 4021fb43 3c56e2a0", + "3eaba922 3dfdb2eb 3f0bf1a2 3dfdb2eb 3ee594f3 3f31e646 3d0578a5 -> 3e8c65d1 3f4796cf 3e0a096e", + "3e37488d 3ec025d3 bd9c04cb bd9c04cb 3f800000 3e800000 3f400000 -> 3f0de50d bd00c109 3d6dd012", + "3f1bb052 bdf55628 3da5f427 3e0e2cb4 bd8ca681 3f2d886a 3f2d886a -> be256fec 3efc8f45 3f0d144a", + "3eae4112 3f9c31fb 3f9c31fb 3efd3044 3e3bf680 3f83b21e 3f3db1fe -> 3fa43110 3fc90440 3f3f27bb", + "3f2c6b61 3f6b211f 3eb2d7a7 3eb2d7a7 3f93fbfa 3f4c4df2 ba522a0a -> 3fd93bee 3f6305e4 3eb290e1", + "3f1fceb6 3f90d59b 3e26f35c 3f90d59b 3f8f268b 3f1aca57 3f8f268b -> 3fea3222 3f0a5d80 3fea3222", + "beba6ec0 3f187c1a 3f22e55b 3f52daa6 3f400000 3e800000 3f400000 -> 3ea52524 3f0b9783 3f0cf11e", + "3fbcb491 3f6575dc 3e18ac4d 3f6575dc 3de94015 3f4abd2e 3f830694 -> 3f8838e0 3fa88778 4019f2b6", + "3f2b5df3 3ed8f3e3 3f9f0c88 3ed8f3e3 3f0be3b6 be4353fc 3f0be3b6 -> 3f4a1e62 3f8eb46f 3f4a1e62", + "3f02991d 3f83ec6f 3f83447a 3f704f24 3cc7e779 3f971745 3e0b2fe4 -> 3f85845b 3fd058aa 3f8107c4", + "3d72cdf7 3f354f2e 3ee284d8 3ee284d8 3ed1ce45 3d17f68b 3f6973a0 -> 3f3b871c 3ee3a51b 3efe323c", + "3ee893cf be5f2395 3f1d0df5 3f9ddfe6 3f52bea9 3f25a2f6 3e2882eb -> 3e1fc959 3f684b9e 3fa77165", + "bec8f167 3f0e5825 3f0e5825 be0fab4f 00000000 3f800000 3f000000 -> 3f0e5825 3e277dc8 beac4e5b", + "3e40a72a 3eeb2046 3eeb2046 3ec9522c be4340b8 3f1be0e5 3f1be0e5 -> 3ed8c245 3f12e3c0 3f01fcb4", + "3eabe64d 3f6410f4 3edab3fe 3edab3fe 3f400000 3f400000 3f000000 -> 3f9243a8 3f2dd05c 3f185392", + "be8efca2 3ecf5171 3ecf5171 3e37fa91 3f9cbfb6 be074b29 3f54a5d9 -> 3d80dd8c 3ee235be bd564480", + "3ebbc8c5 3ec7da47 3ec7da47 3f1472e3 3e2595b4 3e2595b4 3e9fb9da -> 3ee637d4 3ee637d4 3f31bd65", + "3f837fa5 3f4df3ff 3e9e7b0c 3f4df3ff 3f2a735a 3f8fd0ef 3f59b25b -> 3fbe8803 3fbb5e02 3fd6ccd0", + "be9cceed 3f103d6b 3f183f59 bd53b79b bda6c4da 3f89a46d 3f89a46d -> 3f169fd7 3e87dfc8 bec315db", + "3f55e4ee bd665ce3 3f9dd48e bd665ce3 3f8c70a6 3f8c70a6 3f90a5bc -> 3f5c48d4 400995f0 3f6350b1", + "3e1952dc 3f44521e 3f93558c 3f87aee4 3f44cd20 3d1f3b0c 3f011b50 -> 3f61c9b1 3f941448 3f915948", + "3f60a8c4 3f1c9429 be5a8574 3f10261f 3f8c0f76 3f084f93 3f084f93 -> 3fc933f1 3e81fc40 3f83e2ce", + "3ece3949 3f7cab5f 3ef074f7 3ee4ccdb 3f95f9c0 3f8851d8 3f8851d8 -> 3fbabdf4 3f660ad8 3f6036ca", + "3f6fdc3a 3e9a22e3 3e9a22e3 3f9d9001 3d038fe4 3f482ac8 3f0e4a72 -> 3ea98b74 3f844eca 3fe038f6", + "3fb6fc9d 3c0df737 3c0df737 3f3ffe68 3f3bcf4a 3e9760ae 3d396433 -> 3f875aa0 3edcd7f1 3f508eed", + "be4bfef7 3e18e834 bda4c78d 3f41e2b5 3e3632dd 3e39ed0e 3d4ebdf0 -> 3de93882 bdeedba0 3f3f4fbb", + "3fb5fe6d 3ef41ecb 3ef41ecb 3f9f68d5 3f7cd496 bd9cea57 3edf8ab0 -> 3ff0c548 3ebc57f9 3feede72", + "3daab904 3ec90cf4 3eac3388 3e1d1f60 bde28a36 3f805f82 3c1eea0a -> 3ec45458 3ed701a2 3e1df355", + "3eeffff3 3e8d7837 3e883542 3ea57a13 be4820f3 3f80aa0b bac08eb5 -> 3e3d2101 3f3cba06 3ea51fd0", + "bee2cd9b 3f1df8ab 3f1df8ab bde7e443 3f97d8d9 3e77d1d4 3e77d1d4 -> 3dbb8a40 3f0286e2 be61b944", + "3f80e6d4 3ecb7692 be2b88a0 be2b88a0 3e8dca83 3f02c28c 3ee3736d -> 3f2d2064 3eb19864 3e8f4949", + "3f9f08fb 3ecac5e5 3eb0c780 3ecac5e5 3ed976d8 bc5b6eee 3ea7b7c1 -> 3f6c7b62 3ea84267 3f4d93f6", + "3f75dc15 3e68fed1 bd798729 3e68fed1 3f8953b6 3f46586e be2e7ce5 -> 3fa10306 3f2ee4b3 3d82d690", + "3eeac72c 3f78dca8 3f78dca8 bce00f70 3f387401 3ef02a99 3f7bc425 -> 3fa6b8b6 3f97f68d 3ed8e434", + "bdd22632 3e886c1a be49b0de be49b0de 3e3f4eb9 3f3de46a 3f1469a8 -> 3e7d36d0 be8bd0dc be834da3", + "3f13ef65 3f457a0b 3f970191 bdc3efcc 3d54b9e9 3f52093e 3e7b63f8 -> 3f4d28e6 3fd3b16d 3d3d365c", + "3f328334 3ea7cd43 3ea7cd43 3f91f347 3f068dcb 3f0da9ac 3ea6a9f9 -> 3f31ba2e 3f36af36 3faf012d", + "3df8685f 3f569fc9 3f569fc9 3f42c56c bdd182a5 bdd182a5 3d9a5ce6 -> 3f537299 3f537299 3f451c90", + "3d118313 3edfe9d1 3f978d1d 3f350523 3f691082 3d84a8e0 3f79b91f -> 3ef07907 3f97d885 3f3de43e", + "3f610b8b 3e7564d8 3ee47eff 3f05c82e 3f940d58 be34d895 3f5235b3 -> 3fa0d302 3e9501be 3f9f496d", + "3f47e735 3f9a2df0 3f4f44fe bafc1c1b 3f260a95 3f260a95 3f430506 -> 3fdb0208 3fa87698 3f17cafc", + "3ebd5f1f 3dd32631 3dd32631 3f855b54 3f80d9aa 3f9812aa be014022 -> 3ef36ab2 3f0ae30f 3f7ec31c", + "3f90c263 3f647c25 3f7ceea4 3f78d345 3f91138d be12bf8f 3f91138d -> 400b2832 3f53710c 40103dfa", + "3f95b1e8 3f8212f8 3ead4ec8 3ead4ec8 3f428adc 3ddea651 3f6c5bf2 -> 3ff3d4fc 3eee678c 3fb58978", + "3f67b340 3ee1b751 3ece41a1 3f221122 3ca5e471 3e9c3480 3e87de3e -> 3eeb19a6 3f2dd130 3f5f8d78", + "3e2c8f8b 3df7c7fb 3edded6e 3edded6e be65664c bd15822a bd15822a -> 3daa774d 3edac734 3edac734", + "3fa147a7 3e44f410 be5ddda6 3f118387 3ec6af55 3f8a5724 3f8a5724 -> 3f2e68e4 3f929357 3ff710d0", + "3f94d276 3eef4ca1 3eef4ca1 3e30fd32 3f892e11 3f892e11 3eee2f3b -> 3fdb51fa 3fdb51fa 3f36b66c", + "bdd99440 be3641d4 3f9c9d19 bd853ef0 3e800000 3f800000 3f800000 -> be51745c 3f8f03d5 be2f6998", + "3eecf2bb bda5662f 3f2c0086 3f878238 3ed933d5 3f3a16e1 3f8ddfb2 -> 3decad45 3f810fa6 3fc92a96", + "3f97ed9b 3f9bceb9 3f9bceb9 3dc43e6c 3f9c41d8 3f2d6805 3f3f53e6 -> 402aa33a 40015c04 3f7b9ff0", + "be8466f4 be0f697a 3f42eb7b be0f697a 3f004899 3f63be25 3eccdca1 -> be8a0dc3 3f0806aa be795da0", + "3ebe9fda 3f6b35b2 3c1c5952 3e1f909b 3e602069 be689f34 3e602069 -> 3f800919 bd99ac40 3e73029c", + "3f9c9d27 3f2f8445 bdf2d98a 3f3d523b be698729 3e34e3c0 bd5a7ff1 -> 3ed02ad2 3dc7cdc6 3f2c9cb8", + "3f469f74 3f7b0ae1 3d87ee3a 3d87ee3a be1c1029 3f2d7f4c 3f2d7f4c -> 3f5cc574 3f179a4c 3f179a4c", + "3f70571d 3f8ca816 3f74620c bdf40493 3f7e8094 3e86f876 be02dfc3 -> 40020fd4 3f99debe be74e098", + "3fa152bb 3eb3b4c4 3f90c892 3f92e37d 3efc7d0e 3ba39e97 3ba39e97 -> 3f78f6a0 3f9196ca 3f93b1b5", + "be500c41 b9ff3ac3 b9ff3ac3 bdae9921 3f85242e be2d54d3 3f3b2426 -> be58e727 3d0adec1 be6f62e4", + "3f8f3cb3 bd0e3b6d bd0e3b6d 3f61c068 3e1cf50f 3e1cf50f 3f925744 -> 3e0c155a 3e0c155a 400a518c", + "3f4b1a6a 3f8139ee be0c0add 3ecf62a1 3f6ea262 3f1036cc 3f6ea262 -> 3fdfe3a0 3e9ecf3c 3f92825a", + "3ed1a521 3ef41768 bd7ff09d 3d81ef6a 3ef7a1a2 3ead34e8 3f32b6cb -> 3f2cbe60 3d9bb788 3eb2d65e", + "bd962486 3ee4d343 3f219c8f 3ee0df1e 3f028409 3f028409 3e440780 -> 3ed1b044 3f180b10 3ed9af98", + "bde04078 3f7897d5 3ea7065a 3f41e20e bdad3055 bdad3055 3f28deda -> 3f7af6ad 3eabc409 3f2f645d", + "3f3d32eb 3f9f42a4 3f0e9239 3f9f42a4 3f000000 3f400000 3f800000 -> 3fce8f5f 3f8e3c34 3ffddc1a", + "3f17675c 3eb37e13 3f9db94f 3eb37e13 3f3e58e4 3f491e17 3f491e17 -> 3f4a5252 3fd93248 3f50b0fc", + "3f36a347 be3f8e3a 3edcac21 3e88cf6d 3f7db765 3f7db765 3f78b479 -> 3f051ea4 3f91ac23 3f75d6a6", + "3e90d83f 3f13c243 3f13c243 bd6b07a9 3f261380 3f3bca14 3f3bca14 -> 3f42bde4 3f48e269 3e19beae", + "be913c57 3f94d7f2 be0921fe 3f94d7f2 3f661a5b 3e5f23b4 3f8d2eb2 -> 3f686a4f be486de6 3f59972a", + "3e944413 3f92855c bbdf952d 3ec2b388 3e33837b 3f81441a 3e33837b -> 3f9904d8 3e923d28 3edcb178", + "3fae7863 3eece5db 3ea77f0a 3ed7acb5 3f660467 3f93c124 3f93c124 -> 3fd7fc9f 3ff34546 3fff50b1", + "3fbbf0b7 3f8ace97 3f9b329c 3f9b329c 3f3b35e5 3e937ce0 bc499285 -> 400a1f7f 3fd1560f 3f98e2ae", + "3ee2b8c7 3e17b7cb 3d6de9bb 3d947360 3f6a0c54 3f5c1827 3f5c1827 -> 3f0d91db 3ee0a966 3ee80907", + "3fa0c5bb 3ccc4427 3f285c86 3eb77e6c 3f6fa459 3f6fa459 3f7a5608 -> 3f99b0e1 3feaae14 3fcb16bb", + "3f9bcbaf 3f146e80 3caef4a2 3f146e80 3e67e8dc 3e67e8dc 3d4cd384 -> 3f5affc0 3e9811cb 3f240361", + "3faf50a7 3f7ba9af 3f05aab5 3f05aab5 3e9a6bb5 3e9a6bb5 3f809506 -> 3fb2b4fc 3f6f6afd 3ff2f21e", + "3f22952e 3f9a724a 3f570c3f 3eca8288 3f736218 3f736218 3ebf94df -> 3fe7bb3e 3fb8cf14 3f221731", + "befbe48f 3e47c194 bbc3432e 3e47c194 3f000000 00000000 00000000 -> bd508bec bbc3432e 3e47c194", + "3d80c4a5 3f1dc241 3f1bd920 3f1836b7 3eab015f 3d7697e0 3de66e28 -> 3f232282 3f1cd133 3f1a0657", + "beab75bb 3f081f28 3f081f28 bd51c39d 3f17971b 3eced948 be056b95 -> 3eaab6aa 3ecaf92e bbf85968", + "3f80f64c 3e8d32e7 3e8d32e7 3f50b839 3f7ee9b3 3f7ee9b3 3f52bb34 -> 3fa3b6d3 3fa3b6d3 3fd28474", + "3fb4cc49 3f039fbb bcbda8a7 3f039fbb be0ee421 3f006cf5 3c6107ee -> 3ea25509 3f2f78ea 3f089725", + "3f411201 be729bca 3f4d4cc0 3ea19e06 3f800000 3e800000 00000000 -> 3f046b0e 3f7d9140 3ea19e06", + "3f750b7e bddc440f 3e774b66 bcfa83c8 00000000 00000000 3f000000 -> bddc440f 3e774b66 3ee56342", + "3fb98135 3ea07256 3f47e08a 3ec39170 3eb80866 3f8b3837 3eb80866 -> 3f55941f 4016da06 3f6723ac", + "3f4e3ad3 3f3d8ba6 be0416e6 3f3d8ba6 3f932d5a 3f406f15 3f566a75 -> 3fd55623 3ef3ffc3 3fb5234b", + "3e58a55c 3f216daa 3f9c53c5 be38e921 bc9b3799 bcd0c9f1 3e90b0f3 -> 3f2066f4 3f9ba314 bdf75f7f", + "3b153a64 3f08964d 3f08964d 3e33b7c8 3eadea34 3f00a4a3 3f97259d -> 3f08c8fd 3f08e14a 3e3678a3", + "3f883eed bdec41bb bdec41bb 3f82c26d 3f056cdc 3ed729dc 3eb98124 -> 3ee0fa15 3ea9f5d1 3fb41f87", + "3f8930af 3f0d2155 3f7cffa8 3f0d2155 3f4d5353 3f67a43e 3f95c866 -> 3fb4994e 3ffaa2c6 3fe71a20", + "3e7caff6 3f2098ba 3f0ff87c 3f4f4f00 3e433d56 3e433d56 bc930850 -> 3f2ca423 3f1c03e5 3f4e2cbe", + "3f35c937 3f8757bf 3f679e50 3f159863 3f45b135 3f4c5b77 3f61102f -> 3fcd8896 3fbc5dce 3f9ab4dd", + "3f6b5892 3d742f23 3f19ab3b 3f19ab3b 3ee021be 3f74c76f 3ee021be -> 3eec9269 3fbd597f 3f8058bf", + "3df9c246 3f08b411 3ecb16b1 3f38d893 3f88f6a4 3f9a1ab7 3f9a1ab7 -> 3f2a1c06 3f0b2194 3f5e6ece", + "3ed9d49f 3f02735b 3f369fbc 3eba3c52 3f1daa4d 3f691d3c 3f97ed3c -> 3f458782 3f8ce6b7 3f5e6470", + "3f8189e8 3f61ab97 3f809e3a 3ea86bdb 3f2350a2 3f2350a2 be514ec9 -> 3fc37967 3fd341d6 3dfa099c", + "3f00e239 3f369a47 3f850fa5 3f369a47 bd4fcae9 bd4fcae9 3e6080e6 -> 3f301076 3f81cabc 3f52dbfc", + "3f583cc9 3f34aa8b 3eab65b7 3f34aa8b 3f6441bb 3f5a8abb 3f6441bb -> 3fbabc1a 3f8725e6 3fbabc1a", + "3fa4c772 3f3b5611 3f3b5611 3dafb812 3f3a3889 3f1a2917 3f1a2917 -> 3fd58855 3fc0e576 3f5c6bdd", + "3f982618 be2b7125 3f8d41a7 3de4b0a4 3e800000 3f800000 3f000000 -> 3e04db0b 4012b3e0 3f34bc2c", + "3d8740ee 3f637dfa 3e228b8a 3e228b8a 3e800000 3f400000 00000000 -> 3f67b801 3e5543e3 3e228b8a", + "3f1568b4 3f9a2c23 3f9a2c23 3f75799e 3f321b12 3f52ca3c 3f3349f2 -> 3fce2570 3fd7af18 3faf0e7e", + "3ee83264 3f4676c3 3f50235d 3f4676c3 3f2d127b 3f65280d 3e7acae7 -> 3f8a7a16 3f9c0808 3f62e5ea", + "3f08b0b2 3f8c26ab 3f9054ed 3d3da9e0 bd80e30f be1b262f bd80e30f -> 3f87d992 3f85fa01 3c501ad4", + "3f88d039 3ea8bb70 be6a636c 3f653464 3f34dd68 3e5b4b76 3f34dd68 -> 3f8ad798 36bf0000 3fd342ee", + "befd4ac0 3ed54cde 3e85cb84 3ed54cde be1e0200 3f2e3220 be1e0200 -> 3efc6265 bd9a3b8c 3efc6265", + "3f3fe1a4 3e555aa8 3f8474b2 bcd4f791 3ec24307 be7c6aee bd19702f -> 3efc4890 3f599cd3 bd5d7dba", + "3f44327e 3f484b46 3f901f5d 3f484b46 3f800000 3e800000 3e800000 -> 3fc63ee2 3fa8a5ad 3f7957e6", + "be197038 3f9195ca 3ed54e90 3f1a0129 3f6c011a 3ef21d95 3ef21d95 -> 3f7fce8c 3eb1071c 3f07dd6f", + "3fb2ae9f 3f74be40 3f9d4d8d 3ea8ae70 3f282abc 3e8cc698 3f5fecb0 -> 3fefbf8c 3fce6e9b 3fc676ec", + "bec158e6 3f9e49fc 3d4140e2 3f6d4f17 3e2f9ef8 3e2f9ef8 3e12c548 -> 3f95ffbf bc900d90 3f5f73e1", + "3f8a73b5 3f7cd70a 3f95ca8a be04daaf 3f76773d 3f76773d 3f6a7826 -> 4001db99 400d8b1b 3f5c66d0", + "3f738324 be29c13f 3f44ca41 be29c13f 3f800000 3f800000 3f400000 -> 3f4912d4 3fdc26b2 3f0c320b", + "befd76b1 3f80a411 3f8ba4e6 3f80a411 3f90918b 3ecf1ded bdbe29bc -> 3ee44a8a 3f6405a6 3f86864c", + "3fa27551 3ece171b 3f4f8443 3f6d25bb 3f8a36eb 3f8a36eb be01724b -> 3fe2f1f6 400b9728 3f4412e8", + "3bd05484 3cd338c8 bdf3fb73 bdf3fb73 3e8ae44c 3e60b9aa 3e8ae44c -> 3ce159b3 bdf11fef bdf07338", + "bedba6b3 be1f93e4 3f6a345f 3f97cb39 3f8a353c 3f5c0d6d 3f30b53d -> bf1e7a82 3f0bccfc 3f63c764", + "3d881cea 3e1ad88e bdf82ca4 bdf82ca4 3f03c8fd 3f03c8fd 3f1fe1ed -> 3e3de162 bdb21afb bda32a90", + "3ed3573f 3f290db7 bca6dd69 3f290db7 3f023cbd 3f1ba234 3dccbb75 -> 3f5ecff0 3e6c1bc9 3f339dfc", + "3eaf3dd2 3f009703 3f009703 3efd1d0c 00000000 3f800000 3e800000 -> 3f009703 3f5835ec 3f147640", + "3fa05ec2 3f5378cb 3e43d7b8 3f81c1ed 3f85f848 3ef6b43f 3e7598fe -> 4008caf6 3f4b81e7 3fa8388f", + "3dd5e39e 3f81e5ad 3f97d832 3f186f3f 3f94f0c0 be77ed32 be77ed32 -> 3f9173c5 3f949b9f 3f11f619", + "3e74ad50 3f8c743b 3f488398 3f8c743b be548391 be548391 3f5c3369 -> 3f861b51 3f3bd1c4 3fa6c2fe", + "3faede95 3bfc0938 3f834a91 3bfc0938 3e4586c7 3e4586c7 3ebe7e62 -> 3e8add7e 3fa505e8 3f041799", + "3f2eba35 3f486b74 3f227ac7 3f227ac7 3ef4a9bc 3f20c206 3ef4a9bc -> 3f8df50f 3f8819ca 3f75f970", + "3f9c20aa 3f21b1d3 3f7f90de 3f094dc8 3e713965 3f450eb8 3f450eb8 -> 3f6b40b3 3ff7f68c 3fbcd501", + "bee34575 3e7296ae 3e7296ae 3f0263cf 3f53ee25 3f96cbfb 3f53ee25 -> be05b4a6 be92743b 3e1143e6", + "be885d18 3f6e4864 3f9bbd24 3f9bbd24 3f532d4b bc867c2a 3f65cfca -> 3f3609f6 3f9c4c6a 3f7a454e", + "beae834b 3e6bcab3 3f705590 3e6bcab3 3f800000 3f400000 00000000 -> bde277c2 3f2ee454 3e6bcab3", + "be7112c3 3f58b309 3ef0b9b9 3f58b309 3eaecd9b 3f9021f3 3f6cbbfd -> 3f441f7d 3e51fe66 3f20f774", + "3efd2dc4 3e264d21 bdec648b bdec648b 3f40199e 3f94c2ef 3f40199e -> 3f08911d 3eeb2559 3e82e286", + "be87c5c8 3ed6c71a 3f865063 3f34ee6d 3ecc48bd 3f382480 3c790377 -> 3ea09b02 3f5bcc04 3f33e64b", + "3f1f7c75 3f8969a0 bdf86db7 3ed8ec1e 3f02510e 3d97e408 3f02510e -> 3fb20179 bd99cd3e 3f3da5c2", + "3e725020 3e2102e4 bdd968f1 3e2102e4 3f9c6948 be65fc5b 3e1ddd93 -> 3ee48ded be23209b 3e465e1c", + "bebcf79d bd7190a0 3f715fba 3f715fba 3f09c87f 3f32cc2d 3f32cc2d -> be83e696 3f2f6249 3f2f6249", + "3ee60d1c be2896e3 3f3f5246 be2896e3 3f276dec 3e982aa7 3f166530 -> 3e0453c7 3f6181ce 3dcb6cae", + "bdf65edb 3f83805a bcdadca3 3f83805a 3f51cd02 3f9f2732 3f9f2732 -> 3f6dc39c be348637 3f60b60b", + "3d1385f3 bda647e8 3f846a77 bda647e8 3f36149a 3f2dff65 3e4ee40e -> bd63a2b6 3f878c9d bd9760c1", + "3f89c8eb bd9f8bfa 3d0e8a8d bd9f8bfa bd173e72 3dd54eca bd173e72 -> bdf0f318 3e167137 bdf0f318", + "3f86ecbb be6b07a6 be4806e9 3e6f332a 3f97538b 3f44f4c0 be092b2c -> 3f822260 3f1d9ac2 3dbd3890", + "3ee7028f 3d49546c 3f9e6fc1 3eb29f34 3f9f906a 3f21a168 3ecea080 -> 3f1c922f 3fc2e652 3f07ecd3", + "beb261c7 3f295dda 3f050aaf 3f295dda 3dcccccd 3dcccccd 3dcccccd -> 3f207290 3ef83eca 3f207290", + "3f8bd6d6 be7c76a2 3f054fdb 3b8f4cb4 3f6fe0a6 3f90da5d 3f90da5d -> 3f46f2e8 3fe0e82c 3f9ecf8d", + "be9965dd 3d4c14e8 3f910eb8 3f2fe2df bce1310e 3daf35a5 3f465b55 -> 3d6dd0e3 3f8dc6d2 3ee8ea3b", + "bd875b88 3f423b87 3ef74a93 3f423b87 3f347560 3f342bc7 3f527f9d -> 3f364e3a 3edf79b3 3f3451f5", + "3f9b52d0 bcb6be5f 3ed601df 3ed601df 3f1d0c31 3f1d0c31 3d41af3d -> 3f38dc6b 3f94c9a6 3ef362d0", + "3f94400a 3f9b1bf4 3f1dd392 3f9b1bf4 3e05cec1 3f797372 3f797372 -> 3fae7b34 3fdf5eee 4015c88c", + "3f4a84c8 3f2d60b5 3f2d60b5 3d266716 3eb51860 3eb51860 bd8cb580 -> 3f750249 3f750249 bc60e53c", + "3f8c911e bdf5086f 3e955468 3f4f707b 3f57e4ac be068b75 be068b75 -> 3f4e75d2 3e16e7bf 3f2a8037", + "3f2ff5d4 be6bdfc5 3e8d1386 3f740057 3f318e55 3f91aa17 3f91aa17 -> 3e7c4b6d 3f876407 3fde1f51", + "3f6e172e 3f7a87ee 3da06d17 3f9c41c6 3de1aa12 3de1aa12 3f99b88b -> 3f8a6200 3e3926d1 40159ca0", + "3fb181ec bdf3ec83 3ef09072 bdf3ec83 bcb5e552 3f710b4c 3c0f2652 -> be197e39 3fe34740 bddb1bfa", + "3f9be7d6 3d06245e 3d06245e 3f27d727 3f9bffd3 3ebb5109 3f9bffd3 -> 3fc23379 3ef4ebf2 4008f6f4", + "be6d5f65 3ef24146 3ef24146 3dc611a8 3f4cbdb4 3f71c17b 3f3bd6ac -> 3e935550 3e822c2c bd9645d0", + "be82ff99 3da8cd55 3efb6a2f 3d011cea 3f9b4eef 3dfbfebc 3e4f54ca -> be697dee 3eeb4bd0 bca6266c", + "3e6bb61b be5a9886 3f26a76d 3f4218de be0c737d 3e2ad495 3e2ad495 -> be7aed02 3f307c18 3f4bed89", + "beb5ae62 3f457552 3c19b41b 3f91e596 3f884b70 3f884b70 3d50a5dd -> 3ec97649 bebca6ba 3f8f9548", + "3efd11c7 3f884618 3e8c4d4d 3f8a0c13 3f1d46ce 3f1d46ce 3f51a59d -> 3faf2492 3f13e39a 3fbddbe2", + "bd7e1d7b 3f2ed287 3f455942 3f2ed287 3cebe9d9 be126fcb be126fcb -> 3f2e5d70 3f479eb1 3f3117f6", + "bd7c6c3f be1be5f0 3f8250a9 be7cdf18 3f453fd8 3f453fd8 3f74c56b -> be4c8580 3f78796e be9c9ac7", + "3f935126 3f4c657f 3f910de2 be17d3a9 3f4c740b 3f4c740b 3e3356a1 -> 3fdbda31 40035aaa 3d5a4e18", + "bdab2edf 3e274b5a 3e274b5a 3f968c36 3e800000 3e800000 3f000000 -> 3e11e57e 3e11e57e 3f9132bf", + "3f292adb 3ed89256 3ed89256 3df8e391 3f7312a4 3f8e4f1c 3f8e4f1c -> 3f867496 3f942ea2 3f5b308a", + "bec657d8 3f8804d9 3f858cae 3f8a40a8 3e63ae2b 3e63ae2b 3f28583f -> 3f79fcd8 3f750c82 3f534a4d", + "3f80a005 3f604d75 3f9ea721 3f604d75 3f703458 3f703458 3f96adc7 -> 3fe8d70c 400babb9 4003c871", + "3f9cac06 3f8ab17e 3f8ab17e 3f81e1cd 3edc6766 3f3b0ae0 3edc6766 -> 3fce230d 3ffd29ce 3fc5535b", + "bd15dd86 3ea7f541 3e087a3d 3f1a68bc be3beaa6 3e9b1bea 3e9b1bea -> 3eab6552 3dfa411c 3f179250", + "3f91886d 3d1763c3 3e17ca4e 3dbb2957 3f5e5777 3f815744 3f815744 -> 3f832126 3fa60800 3f9ec14b", + "3d574d74 3f2e2f94 3f2e2f94 3f76395c 3eb2a5be 3d960440 3f9a5492 -> 3f32e18e 3f2f2bea 3f83396a", + "3fb29ea2 3e3fddd2 3f9d95ec 3f995b22 3dfe35e9 be40c58c 3dfe35e9 -> 3eb89e6a 3f77eb6f 3faf8703", + "3f2574df 3e86d121 bd873378 3eee42af 3f400000 3f400000 00000000 -> 3f3f8038 3ed66270 3eee42af", + "bef38aa6 3f4734b9 3f4c1f4b 3f4c1f4b 3d8afc66 3f82d1da bbe8ec61 -> 3f3ef12b 3e9f567e 3f4cfce2", + "be7e73b8 3f0c557a bdeee444 be77a1dd 3f9df08b 3f23c322 3b23fb04 -> 3e775dcc be8d1be2 be7844da", + "3f158fe6 3f2f4b64 3f849bb4 3f849bb4 3f400000 3f000000 3e800000 -> 3f8fbba8 3fa9ffae 3f974db1", + "3f0c1fe8 3ebcf22d 3ef941d6 3f954763 3f400000 00000000 3f800000 -> 3f479104 3ef941d6 3fdb5758" + ] + }, + { + "function": "cycles_mix_mul", + "node": "ShaderNodeMix RGBA MULTIPLY", + "cases": [ + "00000000 00000000 00000000 00000000 bd492215 3f48f25f 3f75dde8 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f8df6fc 3e8ec0c1 3eee69d8 -> 00000000 00000000 3e3b9a76", + "3f800000 00000000 00000000 3f000000 3f3c4e9b 3f7fd2dd 3f3c4e9b -> 00000000 00000000 3ebc4e9b", + "3fc00000 00000000 00000000 3f400000 3ecc7571 3ed1357c 3f2847eb -> 00000000 00000000 3ebaa1d0", + "bf000000 00000000 00000000 3f800000 3f07f046 3e14e413 3f5cb50b -> 00000000 00000000 3f88d2bd", + "3e800000 00000000 3e800000 00000000 3f2b1840 be1c8c05 3f4c1971 -> 00000000 3e363740 00000000", + "3f400000 00000000 3e800000 3e800000 3f400000 3f400000 3f800000 -> 00000000 3e500000 3e800000", + "40000000 00000000 3e800000 3f000000 3f9aca2a 3f9aca2a 3e9d1814 -> 00000000 3eb59454 be45cfd8", + "00000000 00000000 3e800000 3f400000 00000000 3f000000 00000000 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3eda2ea4 3eda2ea4 bd855ff4 -> 00000000 3e368ba9 3eef5402", + "3f800000 00000000 3f000000 00000000 3f2dfcce 3f9e5dea 3f9e5dea -> 00000000 3f1e5dea 00000000", + "3fc00000 00000000 3f000000 3e800000 3f800000 3f000000 3f800000 -> 00000000 3e000000 3e800000", + "bf000000 00000000 3f000000 3f000000 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 00000000 3f2aaaab 3f2aaaab", + "3e800000 00000000 3f000000 3f400000 3f9b629d 3f9b629d 3f9a02ec -> 00000000 3f06d8a7 3f49c118", + "3f400000 00000000 3f000000 3f800000 3e09f59a 3eb90bce 3e09f59a -> 00000000 3e85646d 3eb3bc18", + "40000000 00000000 3f400000 00000000 3eced00d 3ee339f7 3ee339f7 -> 00000000 bdaca438 00000000", + "00000000 00000000 3f400000 3e800000 be01ec7d bde3f41a be01ec7d -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f914b02 3d5340b0 3f46a5c1 -> 00000000 3ec9e708 3ee352e0", + "3f800000 00000000 3f400000 3f400000 3d5a564e be18624e be18624e -> 00000000 bde49378 bde49378", + "3fc00000 00000000 3f400000 3f800000 3f14c83a be17909b 3e66bf43 -> 00000000 bf0aa0ac be25e118", + "bf000000 00000000 3f800000 00000000 3edadf02 3f610853 3f9d4f89 -> 00000000 3f87bdeb 00000000", + "3e800000 00000000 3f800000 3e800000 3e800000 00000000 00000000 -> 00000000 3f400000 3e400000", + "3f400000 00000000 3f800000 3f000000 3f729965 3e837520 3e837520 -> 00000000 3ee297d8 3e6297d8", + "40000000 00000000 3f800000 3f400000 3f837496 3ed20f97 bca52995 -> 00000000 be37c1a0 bf47bdf4", + "00000000 00000000 3f800000 3f800000 3f800000 00000000 3f000000 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 bdce31d8 be13c30e bdce31d8 -> 3de639c4 00000000 00000000", + "3f800000 3e800000 00000000 3e800000 3edf360c 3edf360c 3f975f18 -> 3ddf360c 00000000 3e975f18", + "3fc00000 3e800000 00000000 3f000000 3ee1e90b 3da9b9c4 3ee1e90b -> 3d25bb24 00000000 3da5bb24", + "bf000000 3e800000 00000000 3f400000 3f847119 3e1a236f be19dd23 -> 3e7b8ee7 00000000 3f97365e", + "3e800000 3e800000 00000000 3f800000 3f665a60 3f66a33c 3e5ce0ee -> 3e799698 00000000 3f4dce0f", + "3f400000 3e800000 3e800000 00000000 3f400000 3f400000 00000000 -> 3e500000 3e500000 00000000", + "40000000 3e800000 3e800000 3e800000 3f9c97aa 3f1d6eea 3f1d6eea -> 3eb92f54 3d6b7750 3d6b7750", + "00000000 3e800000 3e800000 3f000000 be68e8b1 be68e8b1 3eac5afb -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f271c96 3f271c96 3f8f8ae7 -> 3e538e4b 3e538e4b 3f4ba82d", + "3f800000 3e800000 3e800000 3f800000 be796e5a 3f8ce83a 3f65030c -> bd796e58 3e8ce83a 3f65030c", + "3fc00000 3e800000 3f000000 00000000 3f43a89a 3f2b19b3 3f13048c -> 3e257ce7 3e80a68c 00000000", + "bf000000 3e800000 3f000000 3e800000 be3a64cb 3ec36798 3e96a996 -> 3ecba64c 3f27930d 3ead2acd", + "3e800000 3e800000 3f000000 3f000000 3f81a5ac 3e3fa14b 3e3fa14b -> 3e80696b 3ecbfa15 3ecbfa15", + "3f400000 3e800000 3f000000 3f400000 3f000000 3f800000 3e800000 -> 3e200000 3f000000 3ea80000", + "40000000 3e800000 3f000000 3f800000 3ee233a0 3edb4c4b 3ee233a0 -> bcee6300 bd92ced0 bdee6300", + "00000000 3e800000 3f400000 00000000 be465a39 3f642003 3f8e910c -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3edcf84e 3f6558a6 be13e872 -> 3e373e14 3f36013e 3ddb05e4", + "3f800000 3e800000 3f400000 3f000000 3f8d3a37 3e29ac7d 3eed30fe -> 3e8d3a37 3dfe82c0 3e6d30fe", + "3fc00000 3e800000 3f400000 3f400000 3f8a86f6 3f8a86f6 3f78444a -> 3e8fca71 3f57afaa 3f374cd4", + "bf000000 3e800000 3f400000 3f800000 3f99b7c6 3f3b022b bd4bc8bd -> 3e66483a 3f59df30 3fc32f23", + "3e800000 3e800000 3f800000 00000000 3e5147a7 bd96d4a4 3f839905 -> 3e4d147a 3f3b495b 00000000", + "3f400000 3e800000 3f800000 3e800000 3eb882d9 3f921c2b be081ddf -> 3e053111 3f8d9520 3d19e998", + "40000000 3e800000 3f800000 3f000000 3e800000 00000000 3f000000 -> be000000 bf800000 00000000", + "00000000 3e800000 3f800000 3f400000 3f93215e 3cf56771 3f9d026a -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f65a544 3e2b3226 be4f983d -> 3e72d2a2 3f156645 3ecc19f0", + "3f800000 3f000000 00000000 00000000 3f3d6975 3f91ccd2 3f7eb326 -> 3ebd6975 00000000 00000000", + "3fc00000 3f000000 00000000 3e800000 3e17bdf5 3cd83d23 3cd83d23 -> be0e3188 00000000 bdebba44", + "bf000000 3f000000 00000000 3f000000 3f1d6875 3f1d6875 3f488e0f -> 3f18a5e3 00000000 3f0ddc7c", + "3e800000 3f000000 00000000 3f400000 3f324f85 3e81ce5b 3e81ce5b -> 3eec93e1 00000000 3f1c2b58", + "3f400000 3f000000 00000000 3f800000 be65f89b be65f89b 3d3cd37f -> 3d270b20 00000000 3e91b3d4", + "40000000 3f000000 3e800000 00000000 be4c8797 3f828e93 3e49d0f2 -> bf3321e6 3e851d26 00000000", + "00000000 3f000000 3e800000 3e800000 3f52f485 bdeec192 3f28fc01 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3f005c9e bd58c28a 3f005c9e -> 3ec02e4f 3df273d8 3ec02e4f", + "3f800000 3f000000 3e800000 3f400000 bde5fc08 3f001778 3e992eb5 -> bd65fc00 3e001778 3e65c610", + "3fc00000 3f000000 3e800000 3f800000 3f93f2c8 3f059d00 3f059d00 -> 3f1dec2c 3d90d700 3e90d700", + "bf000000 3f000000 3f000000 00000000 3f12c9c4 bdea6a86 3f456893 -> 3f1b4d8f 3f475354 00000000", + "3e800000 3f000000 3f000000 3e800000 3f6abb2e 3ebc9bda 3f6abb2e -> 3efaaecc 3ed7937b 3e7aaecc", + "3f400000 3f000000 3f000000 3f000000 3f823a6e 3f6db03e bcc9b916 -> 3f01abd2 3ef2442e 3ded16a8", + "40000000 3f000000 3f000000 3f400000 3cc55ff4 3efefd69 3f6ab738 -> bef3aa00 bb014c00 3f2012d4", + "00000000 3f000000 3f000000 3f800000 3ec017fa bdc94984 3f7d8638 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3e815bc0 3ef59c60 3f3d9d25 -> 3ea056f0 3f0e0d52 00000000", + "3f800000 3f000000 3f400000 3e800000 be621a5f 3f874fe0 be621a5f -> bde21a60 3f4af7d0 bd621a60", + "3fc00000 3f000000 3f400000 3f000000 3f641710 3f355669 3f641710 -> 3ed62298 3ed8026d 3ed62298", + "bf000000 3f000000 3f400000 3f400000 3ece780a bd9d6f1f bd9d6f1f -> 3f2630ff 3f93b09b 3f93b09b", + "3e800000 3f000000 3f400000 3f800000 3f8fe78e 3f8fe78e 3f9b3ec3 -> 3f03f9e4 3f45f6d5 3f86cfb1", + "3f400000 3f000000 3f800000 00000000 3f000000 3f000000 3f400000 -> 3ea00000 3f200000 00000000", + "40000000 3f000000 3f800000 3e800000 3f400000 00000000 3f400000 -> 3e800000 bf800000 3e000000", + "00000000 3f000000 3f800000 3f000000 3f38bd22 3cb85f7b 3eb8eb6d -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3f7dc856 3f565c01 3f9a24fb -> 3efee42b 3f6b2e00 3f539bbc", + "3f800000 3f000000 3f800000 3f800000 3f5b070f 3f170562 3f5b070f -> 3edb070f 3f170562 3f5b070f", + "3fc00000 3f400000 00000000 00000000 3d5002bb 3f3586e0 3f55fdea -> bea2bf9c 00000000 00000000", + "bf000000 3f400000 00000000 3e800000 3f05b967 3f375ac3 3f4e1f8a -> 3f6dda7a 00000000 3e8c781e", + "3e800000 3f400000 00000000 3f000000 3e403aa9 3e179d31 3e403aa9 -> 3f1902c0 00000000 3ecc03aa", + "3f400000 3f400000 00000000 3f400000 00000000 3f400000 3e800000 -> 3e400000 00000000 3ea80000", + "40000000 3f400000 00000000 3f800000 be30fc8a 3f1a17b1 be30fc8a -> bf812f5a 00000000 bfac3f22", + "00000000 3f400000 3e800000 00000000 3f253ac6 3f16cfd9 3f72ac31 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f1c4910 3f9ddcb0 3f89f18d -> 3f1a9b66 3e8eee58 3e84f8c6", + "3f800000 3f400000 3e800000 3f000000 3eb02aa8 3f24826b 3f830503 -> 3e841ffe 3e24826b 3f030503", + "3fc00000 3f400000 3e800000 3f400000 3f3a795b 3ea7914f 3f0deee0 -> 3ee3910c bb14c100 3e7eb2f0", + "bf000000 3f400000 3e800000 3f800000 3f1d2985 3f12efde 3f12efde -> 3f65106e 3e9b4408 3f9b4408", + "3e800000 3f400000 3f000000 00000000 3f3fb406 bcb98b01 be441625 -> 3f33f1c1 3ebe8cea 00000000", + "3f400000 3f400000 3f000000 3e800000 3f5198d0 3f64a863 3f5198d0 -> 3f25e5f5 3eeb7e4a 3e5d329c", + "40000000 3f400000 3f000000 3f000000 3f0ed8ef bce6fcff 3f21aa98 -> 3db22b30 bf0737e8 3e06aa60", + "00000000 3f400000 3f000000 3f400000 3f400000 3e800000 00000000 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f04ade3 3ed6fa55 3f7df4d7 -> 3f11c135 3eb5be95 3f7efa6c", + "3f800000 3f400000 3f400000 00000000 be235dee 3f812166 3f138cfa -> bdf50ce8 3f41b219 00000000", + "3fc00000 3f400000 3f400000 3e800000 3f952b80 bca5fe7c bca5fe7c -> 3f6fa1e0 becbabe4 be07c7ee", + "bf000000 3f400000 3f400000 3f000000 3f25e975 3f7bb230 3f6db7e6 -> 3f61c874 3f419d2e 3f049206", + "3e800000 3f400000 3f400000 3f400000 3efa12b5 be65a176 3f7b8d47 -> 3f2771c1 3f053c6e 3f3f2a7d", + "3f400000 3f400000 3f400000 3f800000 3f000000 00000000 3f400000 -> 3ef00000 3e400000 3f500000", + "40000000 3f400000 3f800000 00000000 3e454a8b 3e31092e 3e454a8b -> beec0818 bf277b68 00000000", + "00000000 3f400000 3f800000 3e800000 3e9ef139 3ede25a3 3e9ef139 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f1d10bc 3f1d10bc bd443a40 -> 3f1ae646 3f4e885e 3e73bc5c", + "3f800000 3f400000 3f800000 3f400000 be800000 be800000 be800000 -> be400000 be800000 be400000", + "3fc00000 3f400000 3f800000 3f800000 3e76f142 3ee1372d 3eb77641 -> bdd46130 3e23a584 3d198b00", + "bf000000 3f800000 00000000 00000000 3f03b051 3ef99c55 3f20542a -> 3f9f13ec 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 3f2bb667 3f2bb667 3e7e9fb3 -> 3f6aed9a 00000000 3e4fe9fb", + "3f400000 3f800000 00000000 3f000000 3ea74112 3e0a78af 3ea74112 -> 3efd70ce 00000000 3e7d70ce", + "40000000 3f800000 00000000 3f400000 3f3712bf 3ee18393 be0ba6c4 -> 3edc4afc 00000000 bf745e8a", + "00000000 3f800000 00000000 3f800000 3f800000 3f400000 3e800000 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f962440 3f1a8108 be10ed52 -> 3f8b1220 3e4d4084 00000000", + "3f800000 3f800000 3e800000 3e800000 3f90e87a 3f03ada7 3f57053f -> 3f90e87a 3e03ada7 3e57053f", + "3fc00000 3f800000 3e800000 3f000000 bda1b711 3f1911db bda1b711 -> bf1e5254 3dcb3590 be9e5254", + "bf000000 3f800000 3e800000 3f400000 3ea05523 3f4d0aad 3f96c771 -> 3fabf55c 3e8cbd55 3f2eea6b", + "3e800000 3f800000 3e800000 3f800000 3f60142d be1bdfcd 3f7e1a51 -> 3f78050b 3e364203 3f7f8694", + "3f400000 3f800000 3f000000 00000000 3e477f6b 3f76f928 3f76f928 -> 3ecacfc8 3ef93ade 00000000", + "40000000 3f800000 3f000000 3e800000 3f000000 3f800000 00000000 -> 00000000 3f000000 be800000", + "00000000 3f800000 3f000000 3f000000 3ed71264 3f313bb0 bd31606c -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f800000 3f400000 00000000 -> 3f800000 3ee00000 3ec00000", + "3f800000 3f800000 3f000000 3f800000 3f4232a4 3e1c5ab2 be059024 -> 3f4232a4 3d9c5ab0 be059020", + "3fc00000 3f800000 3f400000 00000000 3f2f76dd 3ebf733f 3f8b08b0 -> 3f07324c 3d3b0d30 00000000", + "bf000000 3f800000 3f400000 3e800000 3e800000 3f400000 3e800000 -> 3fb00000 3f580000 3eb00000", + "3e800000 3f800000 3f400000 3f000000 3f805117 3eae819e be2316cc -> 3f801446 3f205c27 3eb5ce93", + "3f400000 3f800000 3f400000 3f400000 bd602714 bd602714 3f722b5a -> 3e55f8a8 3e207a80 3f383863", + "40000000 3f800000 3f400000 3f800000 3f8a93c4 3f63e7f4 3f63e7f4 -> 3f952788 3f15dbee 3f47cfe8", + "00000000 3f800000 3f800000 00000000 3de47268 3f6f2a0c 3de47268 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3db7f321 3ea64c1d 3f3338f8 -> 3f0b7f32 3f299307 3e599c7c", + "3f800000 3f800000 3f800000 3f000000 3e230562 bda945cd 3f31ee4a -> 3e230560 bda945d0 3eb1ee4a", + "3fc00000 3f800000 3f800000 3f400000 3e800000 3f400000 3f400000 -> be000000 3f200000 3ef00000", + "bf000000 3f800000 3f800000 3f800000 3f853d78 3f13a664 3f8eac87 -> 3f7ac288 3f9b1667 3f715379", + "3e800000 00000000 00000000 00000000 3db3ed12 be600660 3db3ed12 -> 00000000 00000000 00000000", + "3f400000 3e800000 3e800000 3e800000 3e1f8d6e 3d31b18c be278c95 -> 3dbbd50a 3d90a8a6 3d025690", + "40000000 3f000000 3f000000 3f000000 3f0dc41c 3f9c4b34 3f22a251 -> 3d5c41c0 3f389668 3e0a8944", + "00000000 3f400000 3f400000 3f400000 bd9f1060 3e91a961 3f8f5143 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f000000 3f400000 3f400000 -> 3f400000 3f600000 3f600000", + "3f800000 3fa00000 3fa00000 3fa00000 3e95d426 3e95d426 3eb0d1e3 -> 3ebb4930 3ebb4930 3edd065c", + "3fc00000 be800000 be800000 be800000 3f671750 3ee89dcf 3ee89dcf -> be5aa2f8 bd39d970 bd39d970", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3e05c1e9 3f90a43b 3e1d6d1f -> 3e12e981 3dbf7c9e 3e11ba8c", + "3e800000 3f666666 3f666666 3f666666 3f8ebdcd 3f1da6f5 3db1c2fb -> 3f6d089c 3f504590 3f31ccaf", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f1de37a 3f3b0c2c 3ee83f21 -> 3e7338ce 3e8830c0 3e4974e5", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f800000 3f800000 3f800000 -> 3f2aaaab 3f2aaaab 3f2aaaab", + "00000000 bdbbc835 3f73f2cd 3f73f2cd be620607 3e795b55 3f9a1448 -> bdbbc835 3f73f2cd 3f73f2cd", + "3f000000 3f93d445 3f41e44f 3f93d445 be59a85e 3e4dee86 3e4dee86 -> 3ee8d076 3ee8e26e 3f318ef3", + "3f800000 3f023db6 3f7997d6 3f574398 3f88877d 3eb5bd7f 3f05748b -> 3f0aeb6e 3eb1311c 3ee0703b", + "3fc00000 3f84e999 3e52757c 3e52757c 3e9f2b91 3e9f2b91 3f75ca12 -> bd0f40a0 bbe2d500 3e45de18", + "bf000000 be2bfe6a be2bfe6a 3f8eee9a 3f7e5719 3e33c604 3f7e5719 -> be2c8d26 be72e4a2 3f8f6538", + "3e800000 3f8d7352 bded56d4 be4ecf48 3f898d87 3f898d87 3f077ff5 -> 3f9016f2 bdf1c476 be367921", + "3f400000 3f45e1a4 3e749519 bcadeaae 3f2ec186 3f5793b9 3f5793b9 -> 3f16c820 3e579e0a bc995202", + "40000000 3e5a451f 3e5a451f 3e5afe08 3d6a772b 3eef25ce 3eef25ce -> be414805 bc65e5b0 bc66a880", + "00000000 3e950e43 3f8611d6 3f8611d6 3f9c0581 3f9c0581 3f80a6c5 -> 3e950e43 3f8611d6 3f8611d6", + "3f000000 3f6d33a2 3f6d33a2 3d01b400 3f935e1e 3ed0db7b bdcdee08 -> 3f7f25ac 3f26fb25 3c695290", + "3f800000 3f3c7035 3f3c7035 3e00157b 3ec4fced 3ecaceef 3ec4fced -> 3e910015 3e9548dc 3d451dfc", + "3fc00000 3f88f475 3ecd14d5 3ecd14d5 3f2b1a0a 3f580d7d 3dada5ba -> 3f09a734 3e9d1428 be18ea66", + "bf000000 3ebfc34a 3ebfc34a 3eabad16 00000000 3f800000 3f400000 -> 3f0fd278 3ebfc34a 3ec122b9", + "3e800000 3f94bd59 3f94bd59 3da8593e 3f31d106 3cd90468 3f233152 -> 3f89621a 3f611462 3d99173f", + "3f400000 3f58ef5b 3dc9a0f2 3f28d46c 3f2d7416 3f9a9062 3f2d7416 -> 3f2478ef 3de9030b 3f000030", + "40000000 bc7a2f48 bd8a5497 3f415cc3 3e57fbc1 3f3de91f 3f1c80a6 -> 3c10a568 bd05d07e 3e2c3a88", + "00000000 3ec08bc1 3f8f1c65 3f8f1c65 3f1d0522 3e33f3fb 3f1d0522 -> 3ec08bc1 3f8f1c65 3f8f1c65", + "3f000000 3eea75d5 3e2dd206 3e2dd206 3f800000 3f000000 3e800000 -> 3eea75d5 3e025d84 3dd94688", + "3f800000 3f06faac 3f06faac be707b7e 3eb12c03 3c9912b3 3e8d763e -> 3e3ad50c 3c216b40 bd84e318", + "3fc00000 3f524d68 3f524d68 3f46ffee 3df9a825 3df9a825 bde3354f -> be8564a0 be8564a0 bf049daa", + "bf000000 3e7bb2a7 3e7bb2a7 3f2d1b60 be1062cc 3f2ba2f1 be14a64c -> 3ec5a558 3e9295db 3f881ccc", + "3e800000 3f9b6f13 3de13927 3f7180c0 3ed028d8 3ed028d8 3e1ffcae -> 3f845fb0 3dbfcf29 3f3e8f66", + "3f400000 3f58d669 3f58d669 3e9cb596 be2919a6 3ea16ef0 3d2ac792 -> 3ddad3e8 3ed2f8cf 3db04f9a", + "40000000 3f961cfa 3f961cfa 3f340ed0 3f2cce54 3f92f1c2 3dc7ee4a -> 3ed22fbc 3fc28c2c bf10e708", + "00000000 3f49c2dc 3f82cd0b 3eb2efd9 3eb00863 3f851b33 be1fff8c -> 3f49c2dc 3f82cd0b 3eb2efd9", + "3f000000 3f74348e 3f74348e 3f6fc066 be43cb2a be3f2023 3f507e89 -> 3ec58318 3ec6a016 3f59819d", + "3f800000 be3bf9ec 3f2c4f20 3dba6b5a 3d96e5ab bdfce7fc bd19f07e -> bc5d9a30 bdaa3a08 bb6032a0", + "3fc00000 3f15f37a 3f94597e bc99885f 3ecce8f5 3ecce8f5 3eada7ec -> 3d70b1e0 3dee1fd0 b92c1b80", + "bf000000 3b87d2b4 bd8bf1d8 3e72179b 3f323dcb 3e237fec 3e4c46ac -> 3b9c7369 bdc6bea7 3ea97eda", + "3e800000 3f21e1a5 3e6751d7 3f4ef86f 3f1a0a94 3eeb5c7f 3cecafbc -> 3f11c357 3e4812d8 3f1cb90a", + "3f400000 3f45f3ed 3f45f3ed 3f1cb2cb be52f858 be52f858 3e670741 -> 3d9734a8 3d9734a8 3e836110", + "40000000 3f1731e0 be08150c 3f3baabb 00000000 3f800000 3f000000 -> bf1731e0 be08150c 00000000", + "00000000 3f4a0e5a 3eb5631b be47dce1 be6de52f 3ed47e4c 3f1ad278 -> 3f4a0e5a 3eb5631b be47dce1", + "3f000000 3f7253cf 3eecee2c 3f7253cf 3f000000 3f400000 3f800000 -> 3f35bedb 3ecf5066 3f7253cf", + "3f800000 3f733b9f 3f4d90d4 3f733b9f 3f800000 3f000000 3f400000 -> 3f733b9f 3ecd90d4 3f366cb7", + "3fc00000 3f87c550 3ef1c4c8 3f0d39d4 3f01bce4 bc999eea bc999eea -> 3e8d4d02 be7f5eb8 be952bc2", + "bf000000 bdbff475 3f96df1c bdbff475 3d185360 3e24968e 3ebda9ef -> be0e2e79 3fd62eb5 bdfc60f6", + "3e800000 3f78b3b4 3e83f743 3e83f743 3f400000 3f800000 3f000000 -> 3f692879 3e83f743 3e66f0b5", + "3f400000 3f9f0761 3f4f28bf 3ea20e74 3f85e14b 3eb30f1d 3f3a6be9 -> 3fa48206 3ed440aa 3e8105b9", + "40000000 3e8e6bd3 3dd4b648 3e8e6bd3 3df8e2a0 3eaf7f90 3df8e2a0 -> be579c62 bd05c760 be579c62", + "00000000 3f073b5d 3f73d913 3f073b5d 3f800527 3f5c50b3 3f4b5473 -> 3f073b5d 3f73d913 3f073b5d", + "3f000000 3f34c4cc 3ef898b8 3dcf6598 3f42a446 3f42a446 3f965f1a -> 3f1f1af7 3edacdfc 3de1855f", + "3f800000 be10783d be39c635 3f954c94 3e15d745 3f85fac2 3f85fac2 -> bca91ef0 be4273e4 3f9c460e", + "3fc00000 3f4c5dc5 3f368f28 3f4c5dc5 3f15df5d 3d872b5f 3f15df5d -> 3e9a90e6 be92697e 3e9a90e6", + "bf000000 3f5a43b2 3f3e4a03 3f4889b5 3f72f46a 3f8725ae bb174bad -> 3f5fd35a 3f38f9fb 3f9684e9", + "3e800000 3e027e0a 3e2f4571 bdcf281c bdff7d18 3f828e1c 3f828e1c -> 3dbb995a 3e30255c bdd030c4", + "3f400000 3dfa5a88 3d0f0cac be130533 3ed6251d 3e3e786a 3ed6251d -> 3d8d1f1f 3c5edfb0 bda5bf58", + "40000000 3ea50622 3eaa11d1 3ea50622 3e86437a 3f354d61 3f96850e -> be1cf2da 3e0da460 3edf1752", + "00000000 3f3c0397 3f52b7ca 3f52b7ca bda1ebed 3f4c39d6 3f4c39d6 -> 3f3c0397 3f52b7ca 3f52b7ca", + "3f000000 3ea0ea4f 3cce5fde 3ea0ea4f 3f2b0824 3f3539d9 3eedb770 -> 3e8635f8 3cb03c24 3e6ba06c", + "3f800000 3f7eff5f 3f5552ec 3f7eff5f 3f800000 00000000 3f800000 -> 3f7eff5f 00000000 3f7eff5f", + "3fc00000 3e821442 3e821442 bd9b5fe4 be51da82 3f4fac9a 3f2864ab -> be520d6e 3e3a7dfd bd173c31", + "bf000000 3efee4f7 be7a59c9 3efee4f7 3ed7f9b3 3f776601 3ed7f9b3 -> 3f244a5c be7e8e7c 3f244a5c", + "3e800000 3f2e603d 3f2e603d 3f8f305e 3f7bf44e 3f0c9661 bd21fefd -> 3f2dafdf 3f1ab8f2 3f53f3ac", + "3f400000 3e8ee69a 3e8ee69a bd98dfb6 3f8a60b3 3f26c599 3e5ca92d -> 3e979715 3e53170c bcfbb3ac", + "40000000 3f0610ca 3f0610ca 3f2fbd73 3f1c5092 3f9b082a 3f8a114f -> 3ded4080 3f3eb0fa 3f4b6295", + "00000000 3f060dc7 be77d89d 3e6323a7 3f762316 3f0f3881 3da30fa5 -> 3f060dc7 be77d89d 3e6323a7", + "3f000000 3f8f072b 3f8919a5 3f8f072b 3e15f41c 3ed25234 3f9a91dd -> 3f23f90e 3f416b2d 3f9ddf64", + "3f800000 3f77f2ed bd8fd137 3ddb2142 3e800000 3f400000 3f800000 -> 3e77f2ec bd57b9d2 3ddb2142", + "3fc00000 be6dd4b2 3f90e3f4 3f2fc67f 3e974654 bd620ebb 3e974654 -> 3c583000 bf28e140 bd1fc780", + "bf000000 3e9872e8 3ca33ace 3f42ef8b 3e775d32 3f561175 bd806f3e -> 3ed24290 3cb09910 3f95420c", + "3e800000 3eccb49d 3f2ae519 3f88bc4c 3f8443fc 3f8443fc 3f8a722e -> 3ece6934 3f2c5194 3f8b8678", + "3f400000 3f3cd744 3f5c2405 3f3cd744 3e876f02 3f2f186a 3f2f186a -> 3ea95930 3f27f638 3f1014b0", + "40000000 3f7f18f8 3e018e3f bb84d4d9 be36e860 3f805394 3e8d2626 -> bfad1d50 3e02376f 3aee5f48", + "00000000 3ecf213e bc241556 3ecf213e 3f298942 3f46b696 3eb580ac -> 3ecf213e bc241556 3ecf213e", + "3f000000 bdd21de8 bdd21de8 be151df4 3f154f8c 3c0d9cd8 be4d5f48 -> bda6554d bd53eed5 bd6e6baa", + "3f800000 3f93992b 3f93992b 3f1f3d49 3f1a3168 3f4074e2 3f4074e2 -> 3f31cd40 3f5dec88 3eef6d56", + "3fc00000 3f8670d9 be4082b8 be0ff420 be68916a 3f98d9f6 be68916a -> bf620ad4 be789333 3df20960", + "bf000000 3f7bc90f 3f11e0d1 3ed583fd 3ee4f19f 3f7f0714 3f73c451 -> 3fa0b134 3f1227bd 3eda9df8", + "3e800000 3f5a3f30 3ecc7950 3f5a3f30 3f8476e0 3f7861c4 bc0e08ec -> 3f5c265a 3ecaf3e3 3f23364d", + "3f400000 3f131892 3f417fab 3f417fab 3f000000 3f000000 3e800000 -> 3eb7deb6 3ef1df96 3ea94fb6", + "40000000 3f1076ce bd62d535 be47b3bd 3f7a7998 3f7ea566 be1aa8d3 -> 3f0a3a78 bd606efb 3e820354", + "00000000 be2ba0f3 be5deb81 3f97c058 be454e8b 3f5af0ad 3f90e301 -> be2ba0f3 be5deb81 3f97c058", + "3f000000 3ed988a0 3dd3bea0 3ed988a0 3f800000 3e800000 00000000 -> 3ed988a0 3d845724 3e5988a0", + "3f800000 be6eb202 3ea74e03 3ea58d6d 3f83f67f be567fbc 3f3c8966 -> be7615d9 bd8c2eb0 3e73d96d", + "3fc00000 3eb76405 3f7b5a88 3e7cac0a 3e94d81d 3f4fdb87 3e94d81d -> bcbb9870 3f34735a bc813b90", + "bf000000 3f5f19ae 3f5f19ae 3f91ac73 3f4ce75e 3f8f937a 3f4ce75e -> 3f755d78 3f5186a6 3fa03623", + "3e800000 3f94c7ad 3ed4ba90 bdf340c6 bc03ea74 bc03ea74 be5686fe -> 3f5e922e 3e9f1e4e bda9b30e", + "3f400000 3f955661 3f955661 3e7066eb 3f00f329 be22bed9 3f57323f -> 3f3b80bf 3e1c44c8 3e53a9f2", + "40000000 3e56fcf9 3df7d5a1 3e56fcf9 3f7a5c3a 3f3434d5 3f871908 -> 3e4d8405 3d4a2a2a 3e6ed4b9", + "00000000 3e1ddb5d 3f83f49d 3f83f49d be7def52 be7def52 bddfa554 -> 3e1ddb5d 3f83f49d 3f83f49d", + "3f000000 3f0b5000 bde10332 3f0b5000 00000000 00000000 3e800000 -> 3e8b5000 bd610332 3eae2400", + "3f800000 3f37f5c3 3ea4ce76 3e985526 3f7abaf9 3f7abaf9 bd8ca476 -> 3f342c5c 3ea169fe bca760e0", + "3fc00000 3e835408 3f118686 3effdef8 3f800000 3f400000 3f000000 -> 3e835408 3eb5e828 3dffdef8", + "bf000000 3f7fa58e 3eee814f 3f7be388 bd16a0ad be312f29 bdfc64ec -> 3fc215d8 3f3d3230 3fc4ad60", + "3e800000 3e087c42 3f2467c2 3f30a897 3e800000 3e800000 3f800000 -> 3dddc9eb 3f05944e 3f30a897", + "3f400000 bd082d48 3f12cf77 3f596a6f be69780b be4d4513 3f986f6c -> bb2c21f0 3d6a16a0 3f788b58", + "40000000 3f9f8f87 3f4f49e7 3f4f49e7 3f0796a3 3d809efb 3f0796a3 -> 3d975a10 bf35407b 3d449fd0", + "00000000 3d43476c 3f8166e5 be77c927 3ee0f4be 3f1d3b28 3f1d3b28 -> 3d43476c 3f8166e5 be77c927", + "3f000000 3f8fc6f2 3f8fc6f2 3f5c4421 be2f288f 3d8877c4 be2f288f -> 3eee5e00 3f195b90 3eb696c2", + "3f800000 3da3e0fe 3f19893c 3f19893c be4c5571 be4c5571 be4a352a -> bc82cdfc bdf51930 bdf28c58", + "3fc00000 be0a383d be12381b be12381b 3f1a33d0 3e6bdae8 3e6bdae8 -> bd5f1a5a 3cb4bcd8 3cb4bcd8", + "bf000000 3f86efe2 3f01f579 3f01f579 3ebd10f3 3ebd10f3 3ecd85e3 -> 3fb17dd1 3f2af180 3f28dad3", + "3e800000 3f6fb497 3f2bb072 3f7ec59f bd47dac0 3f251f42 bd47dac0 -> 3f30dae8 3f1c73c2 3f3bf8a2", + "3f400000 3f3a6948 3f05dce9 3ec70582 3f6aee04 3f6aee04 3e950435 -> 3f2ee77c 3efb3308 3e3a65dc", + "40000000 3f963907 3f5e46ed 3f963907 3f313274 3c95bed9 3c95bed9 -> 3ee6f42c bf56269d bf90bb15", + "00000000 3f912d9e 3dd07ebd 3f72ebb4 3f4f7f4e 3f4f7f4e 3f2f22a5 -> 3f912d9e 3dd07ebd 3f72ebb4", + "3f000000 3ea330e6 3f48c5d2 3f085801 3f000000 3f000000 3f800000 -> 3e74c959 3f16945e 3f085801", + "3f800000 3f148906 3f034a2d 3f9fa579 3e2dd724 3f4708a4 3f4708a4 -> 3dc9bad8 3ecc262f 3f783e09", + "3fc00000 3ef84750 3f88a2a8 3f88a2a8 3f48c858 3f35b75f bc8696cd -> 3ea7f35e 3f1a53f8 bf0f5eb0", + "bf000000 3ec0750f 3f69583d 3e269f3c 3f37d4b0 3eb614dd 3eb614dd -> 3edb95cd 3f9a4336 3e5c4e28", + "3e800000 3f3b2d61 3f1c71ea be788bbd 00000000 3e800000 3f800000 -> 3f0c6209 3efe391c be788bbd", + "3f400000 3f742668 3f1431db 3f742668 3f28459c bdf5a317 3ef246dd -> 3f35664b 3dbdbe20 3f13af90", + "40000000 bd90e111 3f3edcf5 bd90e111 3f7b6cc4 3f53e62d 3f7b6cc4 -> bd8bb363 3efa34fe bd8bb363", + "00000000 3dc6f83b 3f8566dd 3f8566dd 3f00e360 3f11036b 3da2c69e -> 3dc6f83b 3f8566dd 3f8566dd", + "3f000000 3d41e312 3d41e312 3ec9f945 3e8cc093 3d354d6a 3f8f8ef4 -> 3cf73016 3cca7815 3ed63fa9", + "3f800000 3f1ee62c 3f4e8656 bdc6ed53 3f4231f4 bcc178a9 3e2305b7 -> 3ef112de bc9c14a0 bc7d5b18", + "3fc00000 3f34a247 3f34a247 3f4c8ee3 be2e5e41 be2e5e41 be7d7fc8 -> bf087471 bf087471 bf323d2f", + "bf000000 3e87d5db bca15335 3e79cc32 3e8d6c50 3e82050f 3e82050f -> 3eb8fe38 bcdd80f3 3eab7d52", + "3e800000 3c7b2910 bdb6293f 3c7b2910 3e35e346 3e35e346 3d01878e -> 3c4785fc bd90b5be 3c3e5b1f", + "3f400000 3d98ce5f be2012b8 3f406a1b 3f400000 3f000000 3f000000 -> 3d784f5a bdc81766 3ef084a2", + "40000000 3f9dbb83 3f4973be 3ea9c2dd 3f701b80 3f701b80 3f8863de -> 3f8a25f5 3f30708e 3ec0041f", + "00000000 3f3d8212 3f6f0102 3f3d8212 3f812804 3f431f2e bd52636b -> 3f3d8212 3f6f0102 3f3d8212", + "3f000000 3f8b11ea be59aef3 3f2cdb46 bb97d53a 3f5fcfce 3f06c95e -> 3f0a6cf3 be4bff86 3f03ef02", + "3f800000 3f7f7f6a be5fc46b 3f7f7f6a 3f52448b 3f9758c7 3c93c473 -> 3f51daee be844a75 3c937a40", + "3fc00000 3f36dce2 3f36dce2 3f8b0119 be36fc8a 3f08dc07 3f13ff15 -> bf0c727a 3e5cd54e 3ecc26a0", + "bf000000 3f57baf6 3f277906 3f2dfeb8 3e5e51db 3f92c500 3f92c500 -> 3f9616a7 3f1b31a4 3f213cea", + "3e800000 3e761f6d 3f11bf32 3e761f6d 3f2504dd 3f057ba2 3f2504dd -> 3e60414d 3f004f14 3e60414d", + "3f400000 3f80722b 3ebf49df 3e30e552 3e435869 3f9d0d47 3e435869 -> 3ec9f4a8 3edfd9ce 3d8b1112", + "40000000 3f4a5ca1 bb6418b2 3f4a5ca1 3f7b1c32 3e92ed88 3e46855e -> 3f42a197 3ac25df0 bef7cc32", + "00000000 bdeb403b 3f87b240 3e93e89a 3f814eb8 3f27a451 3f39723d -> bdeb403b 3f87b240 3e93e89a", + "3f000000 3f578486 be684aeb 3f6acd10 3f8c4be1 bcb0179b 3f8c4be1 -> 3f61de9e bde34ca4 3f761445", + "3f800000 3f97908b bd1942a9 bd1942a9 3d654644 be5a6c4b 3f01472a -> 3d87bde0 3c02c398 bc9aca64", + "3fc00000 bd0ac618 3ef18ad6 3f81e0d7 3ecb51c6 3f0e3b9f 3ecb51c6 -> bb546830 3e210ef6 3dc6caa0", + "bf000000 3f19d23b 3f80ae19 3f3e80d7 3e34dcf0 3e34dcf0 3d9f5fbd -> 3f5925c6 3fb5a7f6 3f8b2bd7", + "3e800000 3e7695df 3f9b620e 3f84d181 3d7e15ff 3ef22fa1 3d865e56 -> 3e3cc35f 3f86e97e 3f4b95ab", + "3f400000 be497622 be497622 3f057f0e 3f17f48b 3f17f48b 3f2b0659 -> be0c0d60 be0c0d60 3ec8864b", + "40000000 3dd42bb0 3dc9f911 3f85f5f4 bd9ab94a 3ef70747 bd9ab94a -> bdf43aa6 bb628080 bf9a33ae", + "00000000 3f6255f5 be0fc4bd 3f8e8f49 3f400000 3f800000 3e800000 -> 3f6255f5 be0fc4bd 3f8e8f49", + "3f000000 3d07fc3e 3f92cdc8 3f27f2f3 be2511b4 3eab64cc 3df5e2bb -> 3c6420fe 3f43f269 3ebc1cfb", + "3f800000 3f86d0bf 3f9f84dc 3f9f84dc be3670af bd6e3b34 3f4fc3ab -> be402780 bd947270 3f81765b", + "3fc00000 3d171db7 be5bb0d2 be5bb0d2 3f453c89 be3072e1 3f10c0f3 -> 3cc62b16 3e26a0f8 bd98fa50", + "bf000000 3d04e881 3e1d5e15 3d04e881 3ec58a24 3f3814f7 3f3814f7 -> 3d2db918 3e3378de 3d1793c2", + "3e800000 3f894ff2 3f66a918 3f66a918 3e800000 3f400000 00000000 -> 3f5f21e9 3f583e86 3f2cfed2", + "3f400000 3dd9f49b 3dd9f49b be6d146a 3f90fba4 be3b5301 be3b5301 -> 3defa4e7 3c44aeb8 bcd5f0a8", + "40000000 3f6cede6 3f0d2ed9 3f6cede6 3f054903 3f054903 3d0cd438 -> 3d1c8700 3cba8ba0 bf5ca316", + "00000000 3e2ae9dc 3e2fd801 3ea58e55 3f87a004 3edcdcd8 3daf90ad -> 3e2ae9dc 3e2fd801 3ea58e55", + "3f000000 3f0bfd33 3f178dae 3f178dae 3e8fcf5a 3f1e87df 3f8ef31f -> 3eb34f1c 3ef5678f 3f20675c", + "3f800000 3e6f7538 3e7dd958 3f03b8d8 3f7e84bf 3dc41a36 3f77c774 -> 3e6e1279 3cc27468 3efefbf2", + "3fc00000 3f4bef6e 3f3ae348 bdf19b55 3d94cd28 3c5931d6 bd202b48 -> be9f7bbc beb37494 3d86f999", + "bf000000 3f14c2f0 bdc898cd bdc898cd 3e800000 3f800000 00000000 -> 3f4c8c0a bdc898cd be16729a", + "3e800000 3f09711f bc9164ba 3f8be529 3e81d2c4 3f612ffb bdcf0f27 -> 3edf9678 bc8d04bd 3f4ac554", + "3f400000 3f796bc9 be2d1201 3f796bc9 3f53fca2 3f9c19c0 3d22f610 -> 3f59426e be499112 3e8b9872", + "40000000 3f02ec53 3ef5f511 be1876f3 3ccb5163 3f836e09 3f836e09 -> bef8d946 3f0191b6 be20a2a9", + "00000000 3f7c72e8 3f1cded6 3efc790e 3f8440eb 3eb0ba3a 3eac2e61 -> 3f7c72e8 3f1cded6 3efc790e", + "3f000000 3d40e1af 3f454307 3f664854 be5f0004 bd2900b2 3f8c6257 -> 3c96e088 3ebd1f6a 3f716c2e", + "3f800000 3f3fe5c0 3ecd55d3 3ecd55d3 3f47226c 3edda3ea 3edda3ea -> 3f154566 3e31c690 3e31c690", + "3fc00000 3e3a6ffe 3f8a08d2 3f8a08d2 3f887199 3f887199 3f1702a6 -> 3e4ce2af 3f97b167 3ed47a24", + "bf000000 3e169639 3e169639 3efc5d34 3d8300b4 3f8540dd 3d8300b4 -> 3e5d1061 3e137f22 3f393cc4", + "3e800000 3f7035a8 3f5e73bd 3eb3c518 3e789404 3f832c2b 3ec67b99 -> 3f42bc2c 3f5fd49b 3e983ffa", + "3f400000 3e0b7c89 3e0b7c89 3edaa489 3f826a85 3d2cf2a0 3f905b1f -> 3e0d760e 3d1d27c4 3eef98b2", + "40000000 3f9d7b91 3f9d7b91 3e445998 bda230a3 3f9959f7 3f0025ab -> bfb66d19 3fdbdd35 39672000", + "00000000 3f82b3db 3efbd7b5 3f82b3db 3ee0dfb7 3ee0dfb7 3f560759 -> 3f82b3db 3efbd7b5 3f82b3db", + "3f000000 3f43ae97 3eaead42 3f43ae97 bd94f9db 3f7aa62c 3f7aa62c -> 3eb5729a 3eacd9ec 3f41a30e", + "3f800000 3e30eb99 3e30eb99 bd6f4e15 00000000 00000000 00000000 -> 00000000 00000000 00000000", + "3fc00000 bd4bbed8 bd9ba35a bd9ba35a 3f9ad7d6 3d1d31ca 3f9ad7d6 -> bd85eb2a 3d09b814 bdcc98c8", + "bf000000 3eb81077 3f9f3835 3f8483e5 3ee1908c 3f64339e 3f874a3f -> 3eeb8d19 3fa7dd3a 3f80bddb", + "3e800000 3f10a937 3f10a937 3f41c284 3ed66b01 3f04e78a 3f04e78a -> 3ef7484e 3efe8ade 3f2a77c6", + "3f400000 3f6fca91 3f6fca91 3f2949f3 3f3ebb6a 3f3ebb6a 3f8fb899 -> 3f41f08f 3f41f08f 3f38e20e", + "40000000 3f79b63c be3771f9 3f79b63c 3f000000 3e800000 3e800000 -> 00000000 3db771fa bef9b63c", + "00000000 3f8fe584 3f04dd32 3f113d73 3d0acde8 3f8823d6 3f946980 -> 3f8fe584 3f04dd32 3f113d73", + "3f000000 3f5fd3b2 3f5bbe50 3e092a63 3f000000 00000000 00000000 -> 3f27dec6 3edbbe50 3d892a63", + "3f800000 3e255289 3e2be508 3f861941 3f77c0e0 3f142707 3f91c65f -> 3e1fff31 3dc6f53a 3f98b86e", + "3fc00000 3dab595b 3dab595b 3ee87f18 3f2f26bb 3f33b64c 3f9c7ff7 -> 3d345aaa 3d3d8322 3f1b12b9", + "bf000000 3f699a8d 3f9611d7 3f5bbaa8 3f400000 3e800000 3e800000 -> 3f8366ef 3fce5888 3f971054", + "3e800000 3e9d1985 3ec430a6 be2d3325 3f24ada9 bd807015 3f5dae16 -> 3e8f16de 3e90110b be276518", + "3f400000 3f6808d3 3f78ec18 3f6808d3 3f8066e8 bded4e22 bded4e22 -> 3f6894bc 3e2264a0 3e176034", + "40000000 3f7ab664 3ea3fb1d 3ea3fb1d 3e186a5f 3e186a5f be22a9af -> bf301428 be6654fe bed813e9", + "00000000 be0c422a 3f5e4be3 3f5e4be3 3e95e29c 3e7a4375 3e95e29c -> be0c422a 3f5e4be3 3f5e4be3", + "3f000000 be7587f4 3edf0058 be7587f4 3e988a24 3f9aa14f 3f508117 -> be1f5748 3ef632e5 be5ec11d", + "3f800000 3e3978a9 3e9178ad be0eb921 3f9b0649 3f7951ac 3f9b0649 -> 3e60a138 3e8dacc9 be2cdb30", + "3fc00000 3f1421a3 3f651217 3f651217 3f400000 3f800000 00000000 -> 3eb92a0b 3f651217 bee51216", + "bf000000 3f9cbcb3 3f107926 3f8029c9 3e6bf3e0 3eed7b89 3e306afa -> 3fd90c3c 3f373441 3fb53464", + "3e800000 3f232557 bdde8726 bda3d739 be3aaf66 3f47c0eb 3f6d444d -> 3ee5d8e6 bdd24e0c bda0d7e8", + "3f400000 3de68d32 3f453210 3de68d32 3e9a9f4a 3e9a9f4a be00afd6 -> 3d5bb6e4 3ebbed24 3c8fa178", + "40000000 3f97722d 3edfa4b1 3edfa4b1 bda6ba88 bda6ba88 3d1bd70e -> bfb01ac5 bf020750 becea01f", + "00000000 3ef5e343 be4f1c11 3e9343a9 3e8cc397 3e8cc397 be290aa7 -> 3ef5e343 be4f1c11 3e9343a9", + "3f000000 3ec74854 3ec74854 3f775ea8 3f8665ce 3f9e14d4 3f9e14d4 -> 3ecc4346 3edeb304 3f8a37f0", + "3f800000 3f5c985d 3f5c985d 3e004d4c b95dee2d 3ee957f0 3f345431 -> b93f4000 3ec91273 3db4c117", + "3fc00000 be744276 be744276 3f946fe3 bc9e6438 be1a0605 3ef44355 -> 3e0136c2 3e313d60 3e800548", + "bf000000 bdfa7952 3e2f12f8 3df0649b 3f000000 3f800000 3f000000 -> be1c8bd3 3e2f12f8 3e163ee1", + "3e800000 3e7f8094 3f62d65d be59c81f 3f400000 3f800000 3f800000 -> 3e6f888b 3f62d65d be59c81f", + "3f400000 3e40044d 3f3f6714 3ead368f 3f3cf15b 3f3cf15b 3ed51129 -> 3e1a4b38 3f19cce2 3e42bac8", + "40000000 3f531091 3f379219 bd85ac7c 3f000000 3f000000 3f000000 -> 00000000 00000000 00000000", + "00000000 3f48a36a 3f31910d 3f31910d 3ea657f2 3f92b967 3efe0ab8 -> 3f48a36a 3f31910d 3f31910d", + "3f000000 3f7af80a 3f77948b 3f58eb76 be31edba 3f33e2d8 be31edba -> 3ecf5c66 3f52c665 3eb33a67", + "3f800000 bd0c7e74 3f8ab009 bd0c7e74 3eed39b7 3e8b91ef 3f8f1fa6 -> bc8230be 3e973948 bd1d1802", + "3fc00000 be7cf038 3f6f3da7 be4ef9bf 3d97075f be6d5985 3dfded6e -> 3dc4fadc bf4accb9 3d81fcf2", + "bf000000 3f7dff02 3d64fb92 bdd7f158 3e61d873 3e61d873 be46af46 -> 3fb07e04 3d9f1c82 be2c6e8a", + "3e800000 3e95071e 3e95071e 3f9ffcbd 3ed72765 3f720986 3ed72765 -> 3e7edaa7 3e92fee8 3f88cc4a", + "3f400000 3f9397ab 3f9397ab 3ed7577a be651cac be651cac 3f4b2714 -> 3dc21910 3dc21910 3eb6004c", + "40000000 3f9befff 3f9aa9e7 3f4ecb20 3f8d7971 3d6f6540 3d6f6540 -> 3fbcc4a3 bf8895ad bf369ef2", + "00000000 3f283c71 bb40ef06 3f37b267 3f7ded8d 3f7ded8d 3f31678c -> 3f283c71 bb40ef06 3f37b267", + "3f000000 be2aaa68 be2aaa68 bdeb5bb2 3f400000 00000000 3f000000 -> be15551b bdaaaa68 bdb084c6", + "3f800000 be54346b be689dac 3f750426 3df00369 be03ec9b 3ed82665 -> bcc6f3f8 3cefbf60 3ecee040", + "3fc00000 3f75c919 3e3a65af bba640b3 3f04d9b4 3f81ecac 3f04d9b4 -> 3e88dd06 3e3e99d8 bab9270e", + "bf000000 3ef5356f 3eeb2064 3eeb2064 3e2e73b2 3f64f3de 3f64f3de -> 3f2d7681 3ef78c2c 3ef78c2c", + "3e800000 bdf0d9b7 3ee68fa7 3d27b78d 3f9f46d9 bda1e242 3f90082b -> bdff9039 3ea85d5c 3d2cf7f6", + "3f400000 3f53ab77 3f53ab77 3d56a610 3f8f45d2 3f8f45d2 be3c8ba3 -> 3f669ca2 3f669ca2 3bc02990", + "40000000 bd22bbb7 3f9afc7b bd22bbb7 be05a49c 3edfdc90 3f9121a0 -> 3d4d35cb be1ba820 bd4e4b13", + "00000000 be68afa0 be68afa0 3f870d6c 3f873e4a 3f5dde4a 3eb3701a -> be68afa0 be68afa0 3f870d6c", + "3f000000 bd9b3bf5 3eb7e6ba 3f838017 bd932205 be5c20a8 bd932205 -> bd1014f3 3e105e4b 3ef41b2c", + "3f800000 be536328 3ebfe705 3e9d9f37 3f87d1c5 3ed73f22 3ed73f22 -> be604d01 3e215a59 3e048796", + "3fc00000 3e47daa9 3f9b0090 3f2b00e7 3e878892 3f824453 3f824453 -> bca49110 3f9f1eae 3f2f8bd8", + "bf000000 3f919f6c 3f919f6c 3d27cc82 3f57ef8c 3efbc50f 3f57ef8c -> 3f9d048e 3fb6a148 3d34ede0", + "3e800000 be65c101 3ea31c46 be65c101 3f7e809b 3f32bb32 3f7e809b -> be656afc 3e96cd70 be656afc", + "3f400000 bdeaec1b bdeaec1b bd738d8b 3f8ed91d 3f531512 3f531512 -> bdff5c55 bdcc01fb bd5380aa", + "40000000 3d49792b 3f8dad85 3f80c717 3f5bf1ea 3efc0f03 3efc0f03 -> 3d10b8eb bc8b99c0 bc7dc780", + "00000000 3e91ea95 3f54179a 3f962d40 3f1d48d7 3f2301e3 3f7426fd -> 3e91ea95 3f54179a 3f962d40", + "3f000000 3e91e268 3f022d7f 3f022d7f be3b9464 bc505fe2 3f54bdc4 -> 3dee5258 3e8085a8 3eee5bac", + "3f800000 3ef975dd be65401d 3e4c00bb 3d0a7ac1 bc85555b 3d0a7ac1 -> 3c86f120 3b6ecd80 3bdcb460", + "3fc00000 be7f598f 3e989be3 3f95d2b0 3f5cc82d 3f5cc82d 3f0af7e2 -> be4aa82c 3e723c01 3ebc5680", + "bf000000 be69ab78 3eea733f be69ab78 3f3412b7 3f8dd523 3f8dd523 -> be862931 3eddc832 be5d0b37", + "3e800000 3f7fbb1c 3f043cf6 3f043cf6 3e2cf1c3 3f7f6333 3e933a1c -> 3f4a9888 3f0428b6 3ed95eb2", + "3f400000 3f812006 3f1ba4c6 3f913af2 3f9155a4 3f574ce8 3f574ce8 -> 3f8e3d82 3f0915cc 3f7fd3ad", + "40000000 be395dd1 3eb0722d 3ecca065 bc6c52fb 3f8a10e9 3f8a10e9 -> 3e3eb6c5 3ecc32a3 3eeccf85", + "00000000 3e97e3e9 3f51d850 be23f3ea 3f89913e bc2c9480 3f8126d8 -> 3e97e3e9 3f51d850 be23f3ea", + "3f000000 3f081575 3ecea727 3f9516dd 00000000 3e800000 00000000 -> 3e881575 3e812878 3f1516dd", + "3f800000 3f6bbbf2 3f23cabc 3f23cabc 3f6eb4ee 3f56b1c1 3ea76894 -> 3f5bcf56 3f095d34 3e563854", + "3fc00000 3f97ab19 3f97ab19 3f57e4df 3f8c680e 3d71dadd 3d71dadd -> 3fadb81a bef99a8c beb1a68a", + "bf000000 3f9748b7 bdce7623 3f8f06df 3f727198 3f974cac 3f86f5ff -> 3f9b4a24 bdbbabb0 3f8b2346", + "3e800000 3f805dbd be3ea36b 3f805dbd bd88c623 3f2946aa 3f2946aa -> 3f3c4349 be2e7e30 3f6afd44", + "3f400000 3e31bb0d 3f0c786a 3f0c786a 3f400000 3f400000 3f000000 -> 3e1067fb 3ee443ac 3eaf9684", + "40000000 3f81b809 3f95f616 3f9c1169 3e7e5657 3eaf260c 3c673d9d -> bf028fba bebd7250 bf97a99f", + "00000000 3f1f599c 3f890084 3f5dbcea 3f775d97 3f25bce2 3dc18c6c -> 3f1f599c 3f890084 3f5dbcea", + "3f000000 3f8423f5 3f4419a8 3f5a202a 3dba3a17 3ba692ee 3f89e4b4 -> 3f1027f8 3ec518da 3f628e2a", + "3f800000 3f981999 3f6a8a6e 3f981999 3f5d8b5d 3f5d8b5d 3f87bd49 -> 3f83a0e6 3f4af92f 3fa14bec", + "3fc00000 3de265ee 3de265ee 3f60fb2c 3f8f29ec 3df7d73f 3f56e027 -> 3e055089 bd10346c 3f2ac4da", + "bf000000 3f3137a1 3f0dceff 3f0dceff 3f3c285d 3f88cc7d bc8a5230 -> 3f48b30c 3f08ef41 3f55e8fb", + "3e800000 3f8918c9 3f08b9d0 3f43a727 3f7636d6 3f7636d6 3e00e06f -> 3f87c962 3f076b52 3f18e54f", + "3f400000 bca5d9bc 3f8fd5d5 3f147312 3f88e317 3f88e317 3f7f6e01 -> bcae7ca0 3f97533e 3f143393", + "40000000 3ecf5c8c 3e543658 3f35cd1c 3f7c22f2 3e433fb8 3f7c22f2 -> 3ec91a44 be03493c 3f305056", + "00000000 3e333717 3dbf20d8 3e333717 bd8d7b90 3e2513e4 bd8d7b90 -> 3e333717 3dbf20d8 3e333717", + "3f000000 3f5647b5 3f58573f 3f5647b5 3ee0be2d 3ee0be2d 3f8634e5 -> 3f1a2b56 3f1ba6e3 3f5b79aa", + "3f800000 3cae3b5d 3cae3b5d 3e2dfab9 bd6df4a8 3f1ba4c0 bd6df4a8 -> baa1f370 3c53dc24 bc21b760", + "3fc00000 3f057f78 3f83fe9b 3ef6a782 3edfb355 be491420 be491420 -> 3da5ef74 bf51c092 bec3fa98", + "bf000000 be37f9bb 3f067f7b bdb839e6 3dc8401b 3f95ee78 3f95ee78 -> be857c03 3ef5f379 bda8718a", + "3e800000 3f8c8f16 bcfea0f4 3f8c8f16 3f000000 00000000 3f800000 -> 3f75fa66 bcbef8b7 3f8c8f16", + "3f400000 3f64a865 3eb2dc4f 3e604441 3f800000 00000000 00000000 -> 3f64a865 3db2dc50 3d604440", + "40000000 3f21a2c8 3ed9d57e 3f21a2c8 3d952baa 3d952baa 3ef4755a -> bf0a16f4 beba19e4 bce93120", + "00000000 3e8166d6 3f480294 3f1900b4 3f8df4e9 3f013fc4 3f013fc4 -> 3e8166d6 3f480294 3f1900b4", + "3f000000 3ecdfd34 3f3aa9e5 3f95b975 3f89da8f be312ec5 be312ec5 -> 3ed5eaf8 3e9a5d80 3ef7a2a0", + "3f800000 3f436ada be59d5f5 3f808b87 3f800000 3f800000 3e800000 -> 3f436ada be59d5f5 3e808b88", + "3fc00000 3f031c1e 3e8ab42b 3e8ab42b be3f7762 3e32a134 3f660805 -> becca776 bd843b68 3e6b327a", + "bf000000 bdf38949 3edeb796 3f680d7e 3f6a1f5c 3f9f5d0d 3f6a1f5c -> bdfdf144 3ec36e67 3f71f7dc", + "3e800000 3ee6bd06 3e437e1f 3d5beb8a 3eff98bf 3f2bb932 bd7ff5a8 -> 3ec9d9c3 3e336742 3d21811d", + "3f400000 3f123213 3f34768d 3ee8d80e 3f0364fa 3f9abc8a 3f1919d1 -> 3eb9a6f8 3f50bbf9 3ea2a678", + "40000000 3f2e69d0 bd7f0f9a 3ea23e7c 3e2fa34e 3e231a08 3e231a08 -> bee52a08 3d2dcf2a be5d1eb0", + "00000000 3ead2813 3f97dd28 3ead2813 3f16cb79 3f8af780 3f4a7daa -> 3ead2813 3f97dd28 3ead2813", + "3f000000 3f48b071 3f5c87fd be3a4287 bda68cc1 be14ead6 3e5757f5 -> 3eb85e59 3ebc75c2 bde16dfe", + "3f800000 3f6f5f96 3e64a15f 3ee7405e 3f800000 00000000 3f400000 -> 3f6f5f96 00000000 3ead7046", + "3fc00000 3f654ff6 3f654ff6 3ef83a7f 3f63a5b4 be6145fd be6145fd -> 3f3f3784 bf3e53b8 bece06f9", + "bf000000 3f9f4cb2 3e8d1a13 3f5d7649 3f1b2aa5 3e50a3e4 3f1b2aa5 -> 3fbeac0e 3ec5472c 3f8489d6", + "3e800000 3e56ea63 3f014b6e 3f014b6e 3f802241 be520970 3f673819 -> 3e56f8c4 3eb4ae90 3efc54d8", + "3f400000 3d1553ef 3f9396a4 be0385ee 3ecf2910 3f39b3d2 3f54d5b8 -> 3ca54b15 3f6a629e bde5c808", + "40000000 3f0868ef 3f30c141 3f760c26 3f03f969 3f03f969 3f92a8cb -> 3c878840 3caf9e00 3f9ee43f", + "00000000 3f85839a bc58013c 3f44ab9e 3f400000 3e800000 3f800000 -> 3f85839a bc58013c 3f44ab9e", + "3f000000 3f07a8a2 3cf79f2a 3cf79f2a be4de51e 3f01db37 3f01db37 -> 3e58c38a 3cba9d34 3cba9d34", + "3f800000 3d252267 3f9b7dc6 3f9b7dc6 3d5d4216 3f80e73a 3d2ddcdf -> 3b0eb950 3f9c96a9 3d533440", + "3fc00000 3f0aafb0 3d820ded 3f8ef87b be1bd950 bcd60d37 3f14aec2 -> beca0242 bd0c3fc6 3ed4468c", + "bf000000 3f300233 3e6851ad 3f0d0169 3f7f7ace 3f92dbe2 3f7f7ace -> 3f302ffd 3e573464 3f0d2618", + "3e800000 3ef6d315 3ef6d315 3f566210 3f000000 3f000000 3f000000 -> 3ed7f8b2 3ed7f8b2 3f3b95ce", + "3f400000 3f9cef39 3f26a92b 3f26a92b 3f2df2d8 3f935794 3f492067 -> 3f6e6b68 3f398c86 3f0bde3b", + "40000000 3f6cc6c0 3f90f0fd 3e6ec1d5 bde6c3fc 3f1b0288 3f1b0288 -> bf91115a 3e74ad98 3d49866c", + "00000000 3d9ccc09 3f543c22 3d9ccc09 3f7a6959 3f7a6959 3dfc9c3a -> 3d9ccc09 3f543c22 3d9ccc09", + "3f000000 bda471c0 bda471c0 3f8aa640 3f937560 3e8a734b 3e8a734b -> bdb0f197 bd50e970 3f302448", + "3f800000 3f94ebf1 3eaf9521 3f7f8d24 3e7a80e3 3ea13a39 3e7a80e3 -> 3e91b964 3ddd2970 3e7a1080", + "3fc00000 3f9fe540 3e3cf274 3f430d65 3ee87704 3f4ff1f6 3ee87704 -> 3e679790 3e07beb9 3e0d41ac", + "bf000000 3ede8398 3ede8398 3f2f20a7 3f960169 3f80bb6e 3f80bb6e -> 3ecb630f 3edde0ae 3f2ea06f", + "3e800000 3f9589fd 3e05e227 3f2842d8 3e800000 3e800000 00000000 -> 3f73003b 3dd98f80 3efc6444", + "3f400000 3f009c79 be0e3f37 3f009c79 bdd70709 3eb649e5 be76f049 -> 3db033c0 bd93171c 3d0e44a8", + "40000000 3eb91c88 3f45c871 3e9c7de5 3f843578 3f9fda3a 3f9fda3a -> 3ec548f8 3f941bf6 3eea607b", + "00000000 3f6c33f0 3f0f3eb8 3f6c33f0 3f6c5c77 3dd67979 3dd67979 -> 3f6c33f0 3f0f3eb8 3f6c33f0", + "3f000000 3f265e03 3b91a69d 3f265e03 3e28e103 3f1cd7cb 3f797327 -> 3ec1cdfe 3b6ae2eb 3f243d24", + "3f800000 3d8b58cc 3f6fe23e 3f055c27 be1af154 3f87b887 3e62b980 -> bc28ad90 3f7e5a70 3dec37f8", + "3fc00000 bd8d49ce 3b4fd3d2 3debfd8d be444b55 3f70b5f3 3f3655e7 -> 3d5e8a5c 3b3d3588 3d862164", + "bf000000 3f9f57be bdc767f7 3f3b9431 3f48b177 3dc0b731 3f61b7f3 -> 3fb08e1c be10dd14 3f46ac46", + "3e800000 3f120cf3 3e9a1c42 3f61b33d 3f673d8d 3f9fa5da 3e566efc -> 3f0e84ea 3ea3a2e4 3f351748", + "3f400000 3f104fa4 3f59955c 3f59955c 3f92e9fa 3f0e3d49 3f92e9fa -> 3f204de2 3f11110a 3f71b269", + "40000000 3e124c60 3f39776c 3f39776c bd2bc3a0 3f97d4a9 3f9930c8 -> be1e917a 3f7e869c 3f813bb8", + "00000000 3f884860 3f817824 3f817824 3f6118e2 3f09b2fe 3f09b2fe -> 3f884860 3f817824 3f817824", + "3f000000 bda7727f bda7727f bde5105c 3f50dae8 3eefd3b1 3d8054a5 -> bd98075a bd75e1ad bd736ad9", + "3f800000 3f776a3d 3f2f938f 3f20dadd 3f9df536 3f02bfb5 3f12e17d -> 3f98a924 3eb358d4 3eb89502", + "3fc00000 3f07920b bddb37c6 3e0b40c2 3f666666 3f666666 3f666666 -> 3ee67845 bdba55ce 3decbae2", + "bf000000 3f9fa097 3eb2d8d1 3f9fa097 3e63ecf3 3f23e8c3 3f23e8c3 -> 3fddacfe 3ed303e4 3fbc56b1", + "3e800000 be0839a7 3ea0af09 be0839a7 3f000000 3f800000 3f400000 -> bdee64e4 3ea0af09 bdff6c19", + "3f400000 3f2b2c3e bd1cebfc be7f815e 3f400000 3f000000 3f800000 -> 3f0b13f2 bcc426fb be7f815e", + "40000000 be569594 be569594 3f295511 3f9389dc 3d3e2c5b 3c758e17 -> be8c0c1b 3e42a88e bf2441ad", + "00000000 3e23d105 3ecf2738 3ecf2738 3e5fe967 3e60dbe0 3f305b47 -> 3e23d105 3ecf2738 3ecf2738", + "3f000000 3eff23ab 3eff23ab 3f6d52b1 3f5d9089 bce0bde5 bce0bde5 -> 3eedfac1 3e7823c8 3ee6cfee", + "3f800000 3e96b60f 3f6551c6 3f7f33d0 bded5527 3f689ed7 3f689ed7 -> bd0bb8b0 3f506064 3f67e54d", + "3fc00000 3f1743ec 3e484b0d 3d5c34d9 bbf551ee bbf551ee 3ead0358 -> be9aa9a8 bdcccaae 39c1c200", + "bf000000 3f7eddbe 3f95dfb3 3ed420b1 3da25d85 3d9dd424 3da25d85 -> 3fba1923 3fdb0926 3f1ae433", + "3e800000 be63ac10 3e11b198 3f4128d4 3e540573 3f016dfd 3e9c7cd2 -> be368a02 3dff5eef 3f1fa101", + "3f400000 be19842f 3f05a2d4 3f5866b2 3f165e91 3f165e91 3f959c8d -> bdd40455 3eb88f92 3f73cdd6", + "40000000 3f6b7316 bcefc25d 3f3e2623 3f5fdcff 3eadae48 3d38a433 -> 3f3055ee 3c1a3196 bf2d0177", + "00000000 3f02291b 3edbbfaf 3edbbfaf 3ed5a7ca 3f38636a 3f0e742d -> 3f02291b 3edbbfaf 3edbbfaf", + "3f000000 3f83ff53 3dbf340d 3dbf340d 3db519a4 3f9e8db8 3e2ed41f -> 3f0fab6b 3dd60600 3d5fd901", + "3f800000 3f8da4cb bd0dd5a9 3f7674c2 3f8ae1d6 3e02072b 3f8ae1d6 -> 3f99af93 bb9014f0 3f85b45b", + "3fc00000 3f92ed58 3ec7ee22 3f341250 3f98704e 3f2638c2 be485ee8 -> 3fbd0177 3e3d8418 bf0ee38e", + "bf000000 3f71b611 bd7b4912 3c2205f2 00000000 00000000 3f000000 -> 3fb5488d bdbc76ce 3c4a876e", + "3e800000 3f4974a0 3e5d645e 3f4974a0 3e800000 3f000000 3e800000 -> 3f23aec2 3e41b7d2 3f23aec2", + "3f400000 be49a4e6 3e585c4c 3e585c4c 3e8bce37 3f395fd6 3edb6f9c -> bdb769ad 3e2b97d8 3df7461d", + "40000000 bde838f1 3f3ae114 3e4226fd 3f800000 3f800000 3f800000 -> bde838f1 3f3ae114 3e4226fd", + "00000000 3da3ea77 3f005a8a 3f2ec7ed 3f9895d2 3f9895d2 3f665e87 -> 3da3ea77 3f005a8a 3f2ec7ed", + "3f000000 3f830a70 3f731fcb 3e9853d4 3f932c39 3e5ea2aa 3eecab26 -> 3f8cdada 3f13fde7 3e5ebd63", + "3f800000 3db1f654 3ed4c474 3ed4c474 be398211 3e544d10 3f7d4eac -> bc80f570 3db072bc 3ed28789", + "3fc00000 3e4b4bb0 3f3b777a 3f1b015e 3f58ca22 3ece27ee 3f83596c -> 3e1c96ba 3d9bee60 3f2116d9", + "bf000000 3ef92a07 3eafa3d6 3f9a7d15 be204511 be204511 3f9dab2c -> 3f449f5d 3f0a9a3d 3f88959e", + "3e800000 3f68b0bd 3deba226 3deba226 3f03aed5 3e081e78 3e7d3afe -> 3f4c70e4 3db88e40 3dbf4af5", + "3f400000 3f93644e 3f154361 3f22b48c 3f255f58 3dcb2bb8 3f255f58 -> 3f5883f8 3e41af98 3eef02b8", + "40000000 3f719430 3d13ee08 3f1c0950 3e800000 3e800000 3e800000 -> bef19430 bc93ee08 be9c0950", + "00000000 3ef19e41 3f1317a9 3ef19e41 3f1a3bc0 3df90b86 3df90b86 -> 3ef19e41 3f1317a9 3ef19e41", + "3f000000 3ed0fa51 be36a38a 3f2f4b1a 3f258fae 3ea0ffab 3ea0ffab -> 3eac1078 bdf011d8 3ee66a1a", + "3f800000 3ecbd3c9 3f1d7012 3f1d7012 3ecdffc9 3ecdffc9 3edbd721 -> 3e240440 3e7d6018 3e87332d", + "3fc00000 be44d25a 3f8cf58d be44d25a 3eb84955 3e1d16f1 3eb84955 -> bbfb5000 be982c44 bbfb5000", + "bf000000 3f15e2db bdc7c814 be5f5be9 3f897c8e 3f897c8e 3f0d57b8 -> 3f1054f4 bdc060d8 be88b065", + "3e800000 3f5be8f1 3f5be8f1 3ef62397 3eefe57f 3f98acda 3f1bed07 -> 3f3eb128 3f66821a 3ede158e", + "3f400000 3f20ab07 3f85f2fb 3f20ab07 3ef53e00 bd922d47 3d8e6f00 -> 3ec3c575 3e5288c0 3e4230ba", + "40000000 3ea401f4 be1e1e87 3da3d7c9 3f80a654 3f2b272e 3f80a654 -> 3ea5ac30 bd553a9c 3da58197", + "00000000 be5c0afa 3f0631fd be5c0afa 3f471e77 3f9fe381 3ee6f79c -> be5c0afa 3f0631fd be5c0afa", + "3f000000 3f3ea37f 3f78af3e bdc9a9b0 3ee81a7c 3dd25780 3f27c055 -> 3f0a87b8 3f091ceb bda6e772", + "3f800000 bb846d0a 3f9c9e92 3ec2dd0b 3e409c7b 3bc57ae4 3f32e1f1 -> ba474574 3bf1a200 3e8829ad", + "3fc00000 3e2d052e 3e2d052e 3f55cb96 3eb1a7a1 3ef32b6f 3ef32b6f -> 3b62b440 3d130178 3e35a664", + "bf000000 3f9fdab3 3f177c77 3f177c77 3f60c1e3 3f405d1a 3f60c1e3 -> 3fa99bd6 3f2a507a 3f20bae1", + "3e800000 3f556868 3f9decbf 3f9decbf 3f26ed31 3f95dee8 3f95dee8 -> 3f42d82a 3fa4abb6 3fa4abb6", + "3f400000 3f7dd7fa 3f0b43ab be39ab7b 3f22037a 3f041a07 3f5bdeab -> 3f37f296 3eb16d69 be260444", + "40000000 3e4da6a3 3f68179a 3f827e17 bd1689bd bd1689bd 3f320409 -> be5cc46d bf7926f0 3ecbf578", + "00000000 bd957270 3d11176b 3f57091d be49e66c be49e66c 3f688ba6 -> bd957270 3d11176b 3f57091d", + "3f000000 3e959a7d 3f47e465 3f6be8aa 3f001515 3ea62899 3e9a96a9 -> 3e60740e 3f0461a6 3f199188", + "3f800000 3df22964 3e30e8d7 3ddad038 bd9c311e 3eb247a4 3eb247a4 -> bc13bfb0 3d7666d0 3d186204", + "3fc00000 3e720091 3f34e6e7 3f6510e4 3e35b606 3f8d807a bcaec87c -> bd62576c 3f518672 bef3ba58", + "bf000000 3f09943c 3f955149 3f955149 be694e8f 3f98e31c be3ce645 -> 3f5e0a9e 3f86cd32 3fedbfae", + "3e800000 3e9626b6 3e9626b6 3f6894a8 3f44b5bd 3f99364a 3f19e02f -> 3e8d7517 3e9d8b86 3f51629f", + "3f400000 3f261e58 3f07c949 3ec14fe8 bdc885d3 3eb36cee 3dee58de -> 3deaa5c8 3e8b4548 3e026718", + "40000000 3f482b4b 3e26724d 3f363eea 3f43814f 3eee3498 3f50bea6 -> 3ed321c2 bc391d70 3ee5ed88", + "00000000 3f47afaf be002341 be002341 3e800000 3e800000 3f000000 -> 3f47afaf be002341 be002341", + "3f000000 3dfbab94 3dfbab94 3f9af936 3f3612e7 be4e3f86 3dc94a36 -> 3dd75512 3d48faf4 3f2a3489", + "3f800000 3f62c0aa 3f62c0aa 3e706136 3e800000 3f800000 3f000000 -> 3e62c0a8 3f62c0aa 3df06136", + "3fc00000 3f0dd949 3f8de346 3ecbe3fa 3f30f917 3e65d91f 3ed4562f -> 3e9854ee be395f30 3d4720b0", + "bf000000 3f8fc532 3d39874e 3da72673 3e68ae73 3f2df105 3f3e9ec0 -> 3fc75235 3d574367 3dbc7e94", + "3e800000 3f532b7b 3e765df5 be38fcd2 3f7e834d bcb89892 bcb89892 -> 3f52dcf9 3e37632b be09b2d6", + "3f400000 3f8f0991 3f8f0991 3ebc440e 3e98e7b9 3f9e33b0 3d910a1c -> 3f079826 3fa85991 3de443cc", + "40000000 3e83caa1 3f1d119c 3f724e65 3ec27c3d bd5e8b58 bd5e8b58 -> bd7d58e8 bf2e22f4 bf865170", + "00000000 3e342fa3 3e342fa3 3f6d3e2d 3e63183d 3e3aebc9 be69c322 -> 3e342fa3 3e342fa3 3f6d3e2d", + "3f000000 3e8fdbd3 3e8fdbd3 3d40c635 3f000000 3f400000 00000000 -> 3e57c9bc 3e7bc0b1 3cc0c635", + "3f800000 3f96958e 3d8e6fc5 3d8e6fc5 3e1b1d17 3f0f5f54 3f516a94 -> 3e367b54 3d1f8af3 3d690919", + "3fc00000 3e820edf 3e836994 3e820edf 3f21525c 3f5775be 3f21525c -> 3de7a16c 3e4864c0 3de7a16c", + "bf000000 3f832790 3d67247e 3f9ded3f 3eb2cc30 3eb2cc30 3f8f6341 -> 3fadd4d0 3d992d67 3f946f1e", + "3e800000 3f9d6067 3f94c939 3d30b51b 3e9fe47b 3e9fe47b 3e9f6ae0 -> 3f8251b8 3f766947 3d12491c", + "3f400000 3f5a3486 3ed5698c 3f5a3486 3f842f6c 3f0c50b8 3f842f6c -> 3f5f8e63 3e8d1525 3f5f8e63", + "40000000 3f5e442f 3edf045d 3f1b14f9 3f6e5c5e 3f991613 3e8f6240 -> 3f3fa2fd 3f1b3780 be88717a", + "00000000 3f890e0e bdfe66ef bd77406a 00000000 00000000 3f400000 -> 3f890e0e bdfe66ef bd77406a", + "3f000000 bd8a19bc 3eb30247 3f481bd3 3f40dfc6 3f69a2a0 3f69a2a0 -> bd7225c0 3eab3088 3f3f5e22", + "3f800000 3f0bbca5 3f1ecdb2 3f1ecdb2 3f586cea 3f08ff61 3f586cea -> 3eec453d 3ea9f763 3f06411e", + "3fc00000 3f89671c 3f625e5d 3dc46c57 3e6c855f 3ef07430 3e6c855f -> be28c480 3e3920e4 bc7142c0", + "bf000000 3f53a2f5 3f811686 3eccda53 bd34bb4b bdd967e9 3f0b6bef -> 3fa10fde 3fc87bd1 3efb7f08", + "3e800000 3ef52d6d be7e8180 3f9aeb1f 3f9d8aea 3ef31aed 3e1ed3c6 -> 3f01a982 be5d1716 3f746457", + "3f400000 3f20ba6e ba8dd6f5 3f732252 3f40e1d3 3e23c2a4 3f40e1d3 -> 3f0301d0 b9d1e3be 3f462cbe", + "40000000 3f74d2da 3f74d2da be21424a 3ee565fe 3f5213ec 3ee565fe -> bdcb8590 3f1cfd2e 3c860df8", + "00000000 3ed4c2e5 3efaa6e9 3f865706 3f1b241a 3f66e9a4 be051b23 -> 3ed4c2e5 3efaa6e9 3f865706", + "3f000000 3f10bf8b 3f634f86 3f634f86 3eeb65e7 3eeb65e7 3f84a2a8 -> 3ed34c44 3f25e8e2 3f676d32", + "3f800000 be40d6c6 3f772b39 3eded513 3e59f648 3f9ecc3a 3f9ecc3a -> bd242f90 3f9951dc 3f0a3946", + "3fc00000 3f7eecc3 bdc37644 3f74da34 3f1959fd bcf3c7a4 3f1959fd -> 3ecb3294 3d54e970 3ec32b3c", + "bf000000 3ea085ea 3f8dc1c4 3f8dc1c4 3f12ed2d 3f12ed2d 3ed4dce5 -> 3ec2b853 3fabf4ba 3fb72af4", + "3e800000 3f8feae8 3f8feae8 3e4cadd7 3f405800 bcefcc57 3ebdc279 -> 3f86f898 3f55c520 3e2c795c", + "3f400000 3f16b907 3f8742ec 3f16b907 3f800000 00000000 3e800000 -> 3f16b907 3e8742ec 3e83e1e6", + "40000000 3f48f342 3f88520d 3f05e4a7 3f2a31b4 3f66f8d8 3ed417a5 -> 3e847bb4 3f5b54ce bdb7b778", + "00000000 3dccf2ae 3e59bf1f 3e85e639 3f54ae2d 3f0be95b 3f54ae2d -> 3dccf2ae 3e59bf1f 3e85e639", + "3f000000 bd30e756 3f6f0d9c 3f1b22b9 3f6266e6 3f7bec23 3f06774e -> bd26ad56 3f6d263a 3eec9f32", + "3f800000 3e7246e8 3c905328 3e80c4cd 3ec00807 3f2e82cb bc5dacd3 -> 3db5bcc8 3c44c484 bb5f0180", + "3fc00000 3ebfe489 3f9d0a18 3ebfe489 00000000 3f400000 3f800000 -> be3fe48a 3f444c9e 3ebfe489", + "bf000000 3e0e9c76 be210bf8 3dc4b544 3f586a50 3f1d4124 be6ff02f -> 3e19a312 be401b4b 3e1f0dd0", + "3e800000 3f66a746 3f8d2b52 bc8fb1d3 be4f7763 3e81539e 3ee4d1d8 -> 3f214ea8 3f659537 bc77a6c7", + "3f400000 3e8fcb5a 3f80daab 3f80daab 3ef3e639 3f0b697f 3f2fad1d -> 3e2ea52e 3f29af14 3f451042", + "40000000 3e6aba3b bc30f63f 3f7a7a1a 3f800000 3e800000 3f800000 -> 3e6aba3b 3bb0f63e 3f7a7a1a", + "3f9ebc90 3f01abf4 3f6bc0db 3ebe593a 3f4ecd93 3f8584a5 3f4ecd93 -> 3ec58935 3f785b79 3e90fbf1", + "3fa004e7 3e1932e0 be02c43d 3f8b36a0 3f8a5ca0 3e1f2891 be71a6bb -> 3e28b3e5 3be9ab40 bf17ca2e", + "be8913fc bc88b413 3f84a161 bc88b413 be6bcd14 be6bcd14 3f83e3fa -> bcb5bb28 3fb05104 bc87974a", + "3e9fde4e bd6d4560 bd6d4560 3f8cbee5 3f434243 3dad7cbd 3dad7cbd -> bd5bb14b bd2975f0 3f490b10", + "3f9a001f be00ca04 3d81404f 3f55caf1 be03a8bb 3eabb1d0 be03a8bb -> 3d385530 3c4f248c be98ff8a", + "bee2421b 3e856ab4 3e856ab4 3e57ed36 3f800000 3e800000 3f000000 -> 3e856ab4 3eb1a2b2 3e83d180", + "3eaa895b bdff7c26 3f4c7cd2 bdff7c26 3f800000 3f000000 00000000 -> bdff7c26 3f2a6eab bdaa6364", + "3e79a892 3f3a790c bcad8ce6 3f3e5b5e 3f0ad6e1 3f891d4f 3f033119 -> 3f25aa87 bcb09038 3f27baf9", + "3fa43996 be6a8482 3f03fbb0 3f2404a7 3f618ed7 bd8551b7 bd8551b7 -> be46bcdf be41807c be707804", + "3dbf9c6d 3ccc081d 3eabf60f 3f97d9e1 3cc072d4 3eeecbef 3eeecbef -> 3cb96413 3ea36051 3f904527", + "3fb95615 3e400b4d 3eaf642c 3e8c61c6 3f750470 3f2a4ab3 3f2a4ab3 -> 3e341d5f 3e34bc1f 3e10a8ab", + "3f39568a bd8859c8 bdb09221 3e1d5d01 3f800000 3e800000 3e800000 -> bd8859c8 bd216452 3d8fd5e6", + "3facd490 bdf9d8c4 3f9e69b7 be370696 3f1415f2 3f1415f2 3f8dd142 -> bd574746 3f087ec7 be51b3ed", + "3fadb581 3f43c095 3c53d13e 3c53d13e 3ef6e030 3f96ff1e 3f96ff1e -> 3e68c2c4 3c83bb28 3c83bb28", + "bde577aa 3f21df9b be6846f2 3f6f4cb1 3f331c2c 3f9a69e2 3f844e01 -> 3f27522a be62e818 3f6e65db", + "3ef44b36 3f5563c0 3f5563c0 3f07bdfa 3f371fe9 3bcbdd6e 3f6b8600 -> 3f3867e1 3ee06a0e 3f028fc3", + "beee80ac bcd395fc 3f3a8476 3f85c681 bbf939de 3f4ce95a 3f4ce95a -> bd1b72e4 3f4bdb43 3f923622", + "3e8425b3 be376bd5 3ed7aaa1 3f126ba8 3f02075c 3e505c09 3f98f8d0 -> be202039 3eab5444 3f19cb18", + "3f4ae5f4 3f85e4c3 3f7cbd62 3f73c275 3f9c1964 be2627ed bd3cb19b -> 3f9d308c 3d9f6090 3e26a678", + "bea3a409 3f822713 be546c83 3e52bb1d 3eded1b3 3e1f41a4 3f1febaf -> 3f99a5c6 be86e102 3e6c023d", + "bceef2e8 3f798d9a 3f224ad2 3f224ad2 3e8e3f02 3f40320c be3b25d6 -> 3f7ecf57 3f2378dc 3f27e42a", + "be7bd9d9 3e8f4158 3e809eed 3f812a8c 3e8c7148 3f0d111e 3f8b1909 -> 3ea8d2f5 3e8ed2ba 3f7cd2de", + "3fa13633 3f178e4f 3f178e4f 3f578e3c 3f030850 3f8e9194 3f17d300 -> 3e69823c 3f2d4808 3ed22821", + "bdcf048e 3edf1d62 3f4f1f03 3e9babc7 3f400000 00000000 3f800000 -> 3ee4c0c8 3f640ebb 3e9babc7", + "3fa79206 bd689b90 3f816a3a 3f6a64e8 3f950233 3f952a5c 3f950233 -> bd8d4b40 3f9d6e0c 3f8e6110", + "3f965eca 3d84fb17 3e83530a 3f2b1e8b 3f838853 3f88fe4f be6a1eaf -> 3d894acd 3e8e29f6 be97bbf6", + "3e5a718e bc7e6fa8 3e514b7f bc7e6fa8 3fa00000 3fa00000 3fa00000 -> bc8600b4 3e5c74f1 bc8600b4", + "3f701f78 be1e42b4 3f28fd2a 3f28fd2a 3f1edbe5 bd8b1cd5 3f122015 -> bdcbdd26 ba928600 3ec9ea3d", + "3fb2e700 3f97b04f 3eab07c5 3ea23288 3f00cada be781784 3e24fd5f -> 3eb95b5c be7bdbea bd5fcd90", + "bd00cdfe 3ed110ba 3f45d235 3f9ee743 3f19a36b 3f8f443f be3c6138 -> 3ed3b1b0 3f451444 3fa4d1d0", + "3e5a5bc0 3f8b57be bd6c5ab1 3f0bb7ab 3f4fb4f1 3f4fb4f1 3e02ab4c -> 3f85bcc8 bd62d8b3 3ee373a3", + "3f02e754 3f826f7e 3dd9b49b be776404 3f410b53 3f5cd6d6 3f4a0b4a -> 3f64110a 3dca6a6f be5cba86", + "bbf396ee 3eb0c462 3f25179e 3eb0c462 3e025413 3d13480f 3d0d9b84 -> 3eb1e9f7 3f26467f 3eb20926", + "3ef747d2 3e9feb35 3edec9f1 3edec9f1 3f9e1b38 3f7a6bea bdc54b2f -> 3eb215ca 3edc71b2 3e51a552", + "beee2abe 3f871e6e 3f871e6e 3f37e450 3f57483e 3f36d96c be6e3862 -> 3f911dad 3f991430 3f90aa98", + "3dcaac9d 3e1b09b8 3e1b09b8 3e6e9d27 3f390d49 3f8b7afb 3f8b7afb -> 3e16c92c 3e1c6a01 3e70bb58", + "3f210a5c 3e137e2f 3f70ec48 3e137e2f 3f1bf26b be566e7c 3f9ffb2d -> 3dde7604 3e668554 3e2aacc5", + "beff910a 3e085625 3e085625 3f76500c 3eb147c5 3cabaaea 3f57f53d -> 3e34d374 3e4af698 3f84c590", + "3e6c4a5d 3dc4a57a 3f5fad62 3dc4a57a 3f3a7f2e be52d270 3f3a7f2e -> 3db853a8 3f216fd6 3db853a8", + "3fb26e40 be2687df be2687df 3f6dbcc4 3f20b181 bda4c4df 3f47f3f9 -> bda03660 3da8937a 3f252e9b", + "bef11cfb 3f779a76 3f374d52 3f779a76 be228f50 3f9d355b 3f930940 -> 3fbf5bb3 3f239ab3 3f664325", + "3ee34454 3c2c3061 3c2c3061 3ec17795 3f65b34e 3f1670aa 3f5cda26 -> 3c245644 3c0cac4b 3eb5ad37", + "3ef847c3 3f7085be 3eb0fe65 3ed55166 3f080813 3ecf478b 3f4274a2 -> 3f39dd40 3e7bd329 3ebc7314", + "bd9c644a 3f2da1c7 be1305e2 3f2da1c7 3f3024c3 3f1e7db3 3f3024c3 -> 3f31c49a be174ca1 3f31c49a", + "3f952768 3ece5e27 3e3afaff 3f05fa82 3943c717 3f5054c9 3f60a786 -> bd883df0 3e1268d4 3ee5b9a2", + "3f05a69d 3f0f4e3c be5298bf 3f8b3d4d 3edc31e0 3f86e413 3edc31e0 -> 3ec954c1 be588404 3f439e56", + "be88ed91 3f5972c2 3dbb7d79 bd931511 3f5ba349 be0f2071 3f5ba349 -> 3f61b55b 3df4a3f5 bd98ab62", + "3f96d55e bd9e8416 3ecf457c 3eb85118 3f8de3ea 3f493774 bdeaabdc -> bdb2c94e 3e9b00de bde7119c", + "3f24dbb3 be5d4e95 3f697b1f 3f12091a 3f6e56d4 bb6d6e88 3f6e56d4 -> be53799e 3ea528d8 3f0b8c37", + "3fac4e98 bdef3bad 3f94e992 be1e899c 3b44da35 3f69c81e 3b44da35 -> 3d23af8a 3f8383bc 3d58f22c", + "3fadc765 3e2e4b5b 3ed45779 3f5b3f9d 3f911726 3f8b964e 3f8b964e -> 3e4de394 3eee7044 3f7631b7", + "bed0e936 3f508587 3f9da121 3f9da121 3e0b450f 3ec201b2 3e0b450f -> 3f8d0431 3fc59362 3fd53304", + "3e95ed92 3f030a08 3f75cc32 bd019afb 3f190935 3f671755 3e8c9b80 -> 3ee73633 3f6ecb58 bccc26d4", + "3ebb8087 3e8a3404 3db88c8c 3f75bc00 3f800000 3f800000 3f000000 -> 3e8a3404 3db88c8c 3f48bd13", + "3e6a5fc4 be7799b2 3e9f8e2c be7799b2 3ee5f8df 3e9f465a 3e5eeace -> be58624b 3e86658e be4b4427", + "3f6d206b 3e246973 3ed85be8 3f899978 be01cf83 be08f48f 3f564f78 -> bbe5e780 bcada510 3f69afd7", + "bec2a29c 3f96b948 3f17861f 3f96b948 bd55e66b bd55e66b 3d9a57de -> 3fd30359 3f542220 3fcbb3ed", + "3f8ba601 3e9a854c 3f908337 3e9a854c 3ed0ef55 bd871d55 3eedd823 -> 3ddaee2c be3c6c38 3e0080b4", + "3f0ac746 3f8114b4 3f901427 3f9597f5 3e800000 3f800000 3f400000 -> 3f1932f3 3f901427 3f8151de", + "3ebe3435 3e9babb7 bc797a01 3f64df88 3f6d0ce0 3e427a7f 3f173a35 -> 3e9763d8 bc2e664a 3f421349", + "3fb173d2 3f2ecfd8 3cde6864 3f92cc7b 3ed2cafb 3ed2cafb bdc0fbb3 -> 3e00f454 3ba4108c bf17c8ea", + "3f87d2a2 bd4b0b8c bd4b0b8c 3f69b8ca 3e53160f be5df95a 3eb7ce13 -> bc000468 3c6c7448 3e957f4a", + "3f2fb8fa 3eb9ee26 bd869332 3f6f7fd8 3f9876ea 3f9876ea be3b5a78 -> 3ed252be bd983afc 3e341960", + "3f935fd3 3e2fd45f 3f8a728e 3f8a728e 3dab93ac 3ce1bf92 3ea87f30 -> bc1a7540 be0480f8 3e7c0680", + "be9acaba bd7edeb2 3ea19910 bd7edeb2 3efe7552 3e3cb266 bda0c6c9 -> bd92d086 3ec9735d bda8fc94", + "3fb4e422 be2eca63 3eb0534e 3e23e80b 3f809b88 3f423418 3f423418 -> be2ff689 3e685910 3dd7fbae", + "3f839529 3f304304 3f7a5d64 3f6bfc84 00000000 3e800000 3f400000 -> bc9ddf20 3e655790 3f2f56a8", + "3f753129 3ea09610 be73c46e bb15c13e 3f9552a4 3f9552a4 3f38daad -> 3eba353d be8d5493 badbc942", + "3fb460f4 be6f6f8a be6f8cde 3d43216a 3ece8bdf 3f8ced87 3f68012d -> bd188cf8 be88d291 3d295b2a", + "be9a2761 3f6f0a25 3dbec2e4 3c35654e 3f33145f 3d0baf2c 3e01e5b2 -> 3f825512 3df63cc3 3c651525", + "3fa95e7f 3e731b5b 3f6789a1 3f6789a1 3f9589b9 3ed35b19 3f721b6d -> 3e949df9 3e4e8dfc 3f56e946", + "3e9db064 3e68a49b 3f4537ec 3e68a49b 3f74c40b 3dcba2e9 bdae05bb -> 3e657faa 3f0e8474 3e1ae760", + "3f95d251 be3a9960 3e05466d be1545dd bde1f1bf 3f9ff06c bde1f1bf -> 3d5fa160 3e2c332e 3d32e58c", + "bed46cf2 3f9ede49 3f73cf02 3f0b4d5a 3dd463b0 3f0053c1 3e8b73bb -> 3fd9f237 3f9320db 3f355b2a", + "3e056f92 3e94da24 bdab79d0 3f4dd13c 3f4f8e1b 3f71bc78 3f4f8e1b -> 3e912e78 bdaa3b18 3f48bdf4", + "3d849d79 3f51edbe 3e7dbae3 3f07d618 3e8003f7 3f170be4 be64ea26 -> 3f47bbe0 3e76fe83 3efa25f3", + "3f10a08d 3e784ca1 3f711588 3f0501c6 3f83f1fe 3ebbae7c 3f83f1fe -> 3e7c9f7e 3f1acf61 3f0752b0", + "3e2d657a 3f761ad5 3eca0e18 3ebc9459 be17bc50 be76ad85 3e6a8cbe -> 3f464192 3e9f9934 3ea3f60b", + "3f26d688 3f8f0808 3f724adc 3f724adc 3f9ef109 3f83d457 3f9ef109 -> 3fa59078 3f77043d 3f8c3b3e", + "3f97a00c 3f0122cc 3ede2f3a 3eec2774 be0c94ac 3f523ac2 3f523ac2 -> be3357a0 3eaf20bd 3eba238d", + "3fb29d72 bc21d573 3e5e9774 3e5e9774 3f574944 3f574944 bdd7a9b0 -> bbfbd648 3e2d314c bdf174bc", + "3fbac1e1 3e5dafb5 3ecc6825 3f8db6e3 bac13bff bac13bff 3cf3ca86 -> bdcc7af2 be3c8ab6 beeb9914", + "3f29ccd0 3cc41352 3d688859 3f71a9d9 3f783392 3f597fd9 3d1886fc -> 3cc01d18 3d51563a 3eaeaeda", + "3fa15605 be7b0a45 3f740f7c 3f53544e 3deeabfd 3f7b389e 3f7b389e -> 3ce40a28 3f6e5168 3f4e5b60", + "3f7cfbe2 3dec55b1 3dec55b1 3f56d05a bd0c502d bd1cabc8 3f7b54b5 -> bb26eaa0 bb44c360 3f52f12d", + "3fbaa41e 3e6dc440 3f5e4f0f 3f5e4f0f 3f431e6d 3e036240 3f431e6d -> 3e1b5108 be71069c 3f113812", + "3f9ada9c 3f297b52 3edf593a 3ead3178 3eb58025 3e9d450c 3e9d450c -> 3e148324 3d909038 3d603340", + "3f5acce0 3e48eda1 3f5a42ce 3f6af373 3e926062 3e38ed4f 3e38ed4f -> 3d9c9656 3e82cf1c 3e8ccfce", + "3f782ae2 3ebcfa83 3ee9a7af 3eab0785 3f800000 3f800000 00000000 -> 3ebcfa83 3ee9a7af 3c2772c0", + "3fb57777 3f948da4 3f508664 3f508664 3e5eb259 3f0cf7c6 be2a08b5 -> be020038 3e975f70 bf0830f4", + "3f8706f4 3e86abcb 3f6ea0f0 3f5d503f 3ee30359 3f0a6efe 3ee30359 -> 3dde6224 3ef60c0a 3eb6ba72", + "bedda938 be7b50e8 3f03ef81 be7b50e8 3f9e1aa8 3f77a44d 3f77a44d -> be61ba17 3f05cceb be7ede4d", + "bea15a97 3f037e09 3f8cdf7a 3f037e09 3f791e51 3f8ae0ff 3f8ae0ff -> 3f049b34 3f891989 3efff0d4", + "bc9de060 3ed8cfda 3ed8cfda 3ec26bf4 3f5bfcdb 3dd2187d 3f5bfcdb -> 3ed96653 3edc8fca 3ec2f2e3", + "3d0298b0 3f5378a5 bbfb7851 3f7998bb 3da9c81d 3e01d85d 3e01d85d -> 3f4d49a7 bbf47805 3f72a5c9", + "3f80a773 3de8ce86 3ba43182 3f6ba1f3 3f752968 3ea7f5d2 3eef809f -> 3ddee669 3ad53296 3edb2a77", + "3f419f81 3ee0a6b0 3ee0a6b0 3c186df4 3f000000 3e800000 3f400000 -> 3e8bb1de 3e426eeb 3bf736f9", + "3f126955 3f83a6b0 bd92dcdb bd92dcdb 3e800000 00000000 3f400000 -> 3f165c87 bcfb79e4 bd7bba84", + "3df2a0ba 3eb04910 3e867551 3f155ad1 3e4e52f4 3f952cc2 3f952cc2 -> 3e9f9bd8 3e8917eb 3f184828", + "3fb49f08 3e0c1edb 3f556800 3ebc4a2d 3f694c13 bdda1b93 3f633015 -> 3df52be6 beef9af0 3e9e62e3", + "3fa17661 3f9ea5e4 3eca0046 3f9ea5e4 3f818dca 3f5d876d 3ed2b67d -> 3fa113d1 3ea7b0c0 3ea38ad4", + "3f0ba26b 3f881ad0 3eb84ed2 3f0021f0 bdbc976f 3f23d8d3 3f23d8d3 -> 3edc1f4c 3e941ea8 3ecdf2d0", + "3f5a3434 3f359801 3f930299 3f930299 be7e8e3d 3e2f4f97 3e2f4f97 -> bd3aab20 3eaca10a 3eaca10a", + "be464ef5 be458f0d 3ea7ded3 3ea7ded3 3f41404d 3e34e7ea 3f8db63e -> be4eefc8 3ec2a30c 3ea46348", + "3faa7272 3f42ea49 3f42ea49 3f563005 00000000 3f800000 3f800000 -> be81464e 3f42ea49 3f563005", + "3f1b4418 3f7b8294 3e45f235 3e45f235 3f076001 3f076001 3f97e0fe -> 3f33a21a 3e0d6078 3e5c57ce", + "3fafe98b bcd60bf5 3f96ab08 bcd60bf5 3ea8f21c be2dded2 3f5ea95a -> bb0791f0 bf371cac bcafbcdd", + "3ebf2610 bde5d59d 3f800cd1 3f33791a 3f886e60 3f886e60 3f38e532 -> bdeb7c7f 3f8332ef 3f20dcce", + "3de090ec 3f1db135 3e829406 3f1db135 3f772001 3ec8f23e 3ec8f23e -> 3f1d17c0 3e73c25a 3f132ff7", + "3f47bc26 3e844e70 3eba3fb0 3f54b4b3 3f8da6db 3edb28dc 3d8e842c -> 3e8f50e9 3e4e458f 3e69315c", + "3d8892e8 3f0bef16 3f156d33 3f0bef16 3f64d5b5 3e156c88 3e156c88 -> 3f0af197 3f0cea79 3f03f6c4", + "bd2cfdc0 bdeb2826 3f22454c 3f7512cc be02680d 3e4b6408 3e4b6408 -> bdf65a71 3f27c348 3f7d5e39", + "bc06b327 3f233f90 bd0b494d 3f233f90 bcf8e003 3d4f24aa bcf8e003 -> 3f24a196 bd0c5fa1 3f24a196", + "3e864879 bc100320 3f866069 bde29648 3f3b17f5 be6a69ee 3f3b17f5 -> bc05d882 3f362192 bdd2975b", + "3f730a47 3d830452 3f45a0c1 3f45a0c1 be6dccf4 3d99b82a be6dccf4 -> bc320598 3dc0b328 be0643fc", + "3f75c9a9 3e7f544d bc0cc375 bc0cc375 3e800000 3f400000 3f000000 -> 3d8ef162 bbd5f3f2 bb9260f9", + "3f0cc6af 3f752d7b 3f85074f 3f4b9f31 3f7e1360 3ea4a1dd 3d7acb0a -> 3f742a09 3f26cb87 3ec50275", + "be0da0c6 bd7a2427 bd7a2427 3f6fbbd9 3f800000 3f400000 3f400000 -> bd7a2427 bd81652c 3f7805e9", + "3f966833 3f98490e be03112a 3f6bba77 be0984b9 3ef54fb8 3f8d19f9 -> becac228 bd4b62b8 3f840a41", + "3d75392f 3e47e30c be143330 be143330 3dba7ab2 3dba7ab2 be4bdfe1 -> 3e3d0270 be0c22a0 be098f95", + "3f70e3a9 3f923b86 3f9040fb 3e9f2a44 3f000000 3f400000 3e800000 -> 3f1add33 3f5ca35c 3dbb598e", + "3f0754a0 3f941187 3ee4a3d1 3ee4a3d1 3f88c40c 3f88c40c 3f96aaac -> 3f996dcd 3eecead0 3efa0b21", + "3f9aa8cf 3e59870d 3f05832a bdca4728 3d65e3ea 3ea31e28 3e9906ab -> bcf46f18 3dbcb2cc bc775938", + "3ef38a03 3d6e59dd 3f9519bd 3e3e8493 00000000 3f800000 00000000 -> 3cf9f3ee 3f9519bd 3dc7ca99", + "becffbd2 3e06b425 3e17d9f1 3f25c1c2 bc0c3894 3f09a538 3f5eb87d -> 3e3de41e 3e345e9e 3f2e8292", + "3f08a9fa 3f8aa11c 3f75c880 3f67edca 3e98d440 3d5898b2 3f827dc5 -> 3f2d6d47 3ef30607 3f6a56b3", + "be92bdf7 3e7fd0c5 3f20858b 3ee65bda 3e85f267 be74e031 be74e031 -> 3e9af9ec 3f5987a5 3f1c15a8", + "3ee156ac 3e99bf7b 3f8d8db7 3ea48a37 3f33627d 3eadaa11 3f33627d -> 3e857f2e 3f48c532 3e8ede04", + "3fa6141d 3d3f12e4 3ec4cb6a 3f962b7d be5d6900 3f7afce4 be5d6900 -> bcdce4d8 3ebfcb9e bf2d9b36", + "be551ad3 3f9b9eec 3e5241dc 3f965ade 3f047ba8 bba05f56 3f7526f6 -> 3fab3f2d 3e7e3a64 3f97ae4d", + "3fa7900d 3e77cc54 3f87e6d2 3e77cc54 3f5b84fa 3f046419 3f5b84fa -> 3e499274 3ec7ffda 3e499274", + "3f831aee 3ed1421f 3f3fcc54 3f828af0 3f2f2c84 3e4ee608 be4359c9 -> 3e8d9646 3e0c28e0 be656648", + "3e9925bf 3f2e0161 be391496 3f2e0161 3f83b3d1 3f485e62 3e413b46 -> 3f2f82c8 be2d0ccf 3f03c775", + "3e005b01 bdb9f36d 3f8e1841 3f8e1841 3efbaa69 3f47a597 3f398e31 -> bdae1970 3f8a2c8a 3f89318e", + "3ee57d26 3f2b3f84 be5582b9 ba881b69 3f8620ca bccd0183 3f9e9973 -> 3f2eec43 bde6d4f1 ba96b0e8", + "3f2cd90a 3e303e76 3f2e2077 bd907cd5 00000000 3f400000 3f000000 -> 3d64fc4c 3f10bc1b bd3f6b4c", + "3ecd1ca8 3f803939 be70b8a4 3f803939 3f7db84e 3f706d3d 3f706d3d -> 3f7f8834 be6adad4 3f7a3286", + "3f4600a1 3f33c685 3f04dac5 3f30af14 be188bf6 be188bf6 be3c29ac -> 3da01e00 3d6ca778 3d6eadb0", + "3e2e6791 3f56732d 3ec95333 3ec95333 3f988318 3f988318 3f189dad -> 3f5d71c2 3ecfe431 3ebb7a42", + "3f600370 3f5bc178 3dbab0bc 3f6c0abc 3eca8891 3eca8891 3f8bec33 -> 3ecf0d34 3d2fe5d2 3f7f47f6", + "3f215645 3f8146ec bc96e8dd 3f8146ec bdd929bb 3edfe7f9 3edfe7f9 -> 3e9ca886 bc42ca15 3f26dde2", + "3f4f6693 3f992753 3f84cdd5 3f992753 3f54f3b9 3f565b77 3f54f3b9 -> 3f8449fc 3f669aca 3f8449fc", + "3ebd519a 3d9e14d3 3f008373 3ea70051 3f4b616a 3e123071 3e575cc0 -> 3d921113 3eaf8e50 3e6c7993", + "3f4e37db 3f9a65ba 3f4cc1a9 3f76fc33 3f800000 3f000000 3f000000 -> 3f9a65ba 3ef492cf 3f1381c8", + "3fb24c9c 3f97cad5 3f6f5438 3f6f5438 3ec32bb4 be66f046 3ec32bb4 -> 3e279bc8 bf293b80 3e042210", + "3f59e3cd 3f5a7e88 3f986ef2 3f4dae98 3f3342c4 3db1773a 3e8fb2b1 -> 3f22bf89 3e87bd52 3e9f814a", + "bee68ea3 be4112af 3e1b5d69 3f8abc91 00000000 3e800000 3f000000 -> be8c01ef 3e4fd618 3fa9f93f", + "3f960f5f be4c0576 3ef27b91 be4c0576 3f8c202f 3f86053d 3dfd7d4b -> be62adff 3effda7a 3bb1d460", + "3d17c7a7 3f82e3f6 3f0f3c4c 3f0f3c4c 3f11a1f3 3d683434 3f4cd46e -> 3f80cca7 3f0a3a8f 3f0e2cb4", + "3f04257d 3ebee9d7 3f82a744 3ebee9d7 bd4427a3 3f90df17 be0b4598 -> 3e2f4a43 3f8b8afc 3e1dec13", + "3e4735c8 3ced833e bda0b6e9 be04ecef 3f9a4a65 3f9394ab 3f8b5ed6 -> 3cf700cf bda57f51 be073900", + "3f9d3c86 3f00b76a 3efb3e60 3efb3e60 3e1a7ebe 3ec8015f 3ebc2905 -> bcb16b80 3dfcb3a0 3de02418", + "bea68318 3f8f24f1 3f7c8089 3f8f24f1 3f5417aa 3efc9149 3efc9149 -> 3f9720fb 3f930e51 3fa6bba7", + "3ed39f73 3f575011 3dfb57ea 3dfb57ea 3f6f964f 3eddd09b 3eddd09b -> 3f519b6a 3dc076b8 3dc076b8", + "3f855e54 3f0a5754 3f5ddc49 3f5ddc49 3f83690b 3f5f076c 3f5f076c -> 3f0e2e7a 3f401686 3f401686", + "3f3dc492 3f83e1eb bc23d9bd 3ed54d1a 3ebdc0e4 3f2b7a6f 3ec6dedc -> 3f0cb464 bbf77f95 3e69336a", + "3ede515d 3f71e32f 3f30c82d 3ddbd222 3f4e8269 3eca3b68 3eca3b68 -> 3f5d9523 3f025715 3da2128d", + "3db3fafd 3f668dee 3f59b1a3 3f668dee 3f561a72 3e7ec5f1 3f0992b3 -> 3f633d0c 3f4b5296 3f5d2e70", + "bdc2b84f 3f442e57 3f442e57 3f5f3a50 3f81d821 3f81d821 3e3b3edf -> 3f43e98a 3f43e98a 3f709226", + "3f1842c4 3f4794f5 be13ab2a be13ab2a 3eab4ce0 3e6ef30b 3ee73a00 -> 3ef12f22 bda0ab5a bdc7025e", + "3f45f366 3ef544c7 3ef544c7 3e66a0eb 3f8ce5bf 3f8ce5bf 3edc0f22 -> 3f04306d 3f04306d 3e00f1a6", + "3ee12013 3f00ef87 3f00ef87 3f7f6201 3f98afb6 3f56ae52 3f2e6a9b -> 3f0bde9a 3eef9213 3f5b98e2", + "3f515c3c 3f85deec 3f85deec 3f14a34f 3e397581 3ec2f995 3f853241 -> 3eb0df16 3f042982 3f19929d", + "3f3de26a 3d64d579 3f9c1874 3d64d579 3f799936 3f799936 3e600a2b -> 3d6096eb 3f993346 3cc07894", + "be7fafde 3f908398 3f908398 3f837331 3f400000 3e800000 3f000000 -> 3f9988fe 3fab93c9 3f93dc72", + "3e82fdfa 3f532a8c 3f532a8c 3f1eae3d 3f87f775 be4e8d84 3f5128a5 -> 3f56875a 3f123e36 3f17409a", + "3e918ac5 3f0480dd 3f0480dd 3f812aae bd05a7b6 bd05a7b6 3df48df1 -> 3ebb37a3 3ebb37a3 3f41ab02", + "3fb526e0 3e71d74f 3f0a9bc1 3f60ed17 3f8da126 3f7021e9 3f8da126 -> 3e8b248e 3efce62e 3f81692c", + "3f54b3ed 3f9a58a6 3f93d023 3f07ab46 3e800000 3f800000 3e800000 -> 3ee8a8ea 3f93d023 3e4c8188", + "3f202ccc be202975 3f41751d 3f41751d 3f52ce32 be3c53bc 3f52ce32 -> be0e787b 3e489c8c 3f2c169f", + "3f60eb41 3f6689d0 3f6689d0 3f1a1dab 3f3174cd 3f648fb9 3f648fb9 -> 3f2864e3 3f50d42b 3f0b9a5b", + "3f7b5ffd 3f8fad69 3f8fad69 3df929bc 3f0eb63c be311911 3f435d3a -> 3f227d11 be2e6e68 3dbf367b", + "bed181af bcf82efa 3f20e5be 3f2eabfc 3db53f5e 3db53f5e bd935792 -> bd2a6019 3f5ce8a8 3f7b49d4", + "3f8a3fb9 3f88dcbd 3d3a25fe 3f6d83c9 3f123693 3f45f088 3f45f088 -> 3f12efee 3d0c8cc2 3f335566", + "3e062c7f 3e944be9 3ec01de6 3ec01de6 3ed5e0f1 3f091cdf 3f931410 -> 3e88fb7d 3eb46d2a 3ec3de6a", + "3edf007d 3f383a0c 3f4881a8 3f4881a8 3e9c4e24 3f4377b8 3f4377b8 -> 3f007b90 3f33db52 3f33db52", + "becea0b3 3f32bfd2 3f82a57c 3f32bfd2 3f4a1a58 3ed28528 3d1e4d29 -> 3f41efd7 3fa1b13d 3f781962", + "3f838aa4 be5711c9 3f34d3bb 3e4a1b9d 3dbf40de 3f498be0 3f498be0 -> bc6b07e0 3f0d4c9a 3e1ded9a", + "3f9abefa 3f880cc6 3df1a53e 3f880cc6 3eebcfbf 3f15256a 3e3159f2 -> 3ebd4d44 3d6f6a55 39f04000", + "3ef5a354 3f443641 3f74b780 3f443641 3f57db1b 3f46f1f3 3d00f704 -> 3f35734a 3f5a8cee 3ed214ea", + "3fbf10ed 3c0c2d0c 3f450eef 3f1d05ef 3e9944f0 3ed8f045 3e9944f0 -> b9cdb280 3ddc5670 bce66b80", + "3e4d9ade 3eff6dd2 be6f5831 3eff6dd2 3f835254 3f835254 3ed7b914 -> 3f006143 be709772 3ee1c04d", + "3f7c9db7 3da23c82 3f8337c7 3f8337c7 3e5676f7 3f526000 3e5676f7 -> 3c8eb208 3f584832 3e66d37c", + "3d22787a 3d57a565 3f072edf 3d57a565 3f9145e7 3ea84967 3f115c56 -> 3d58cce5 3f03955b 3d53f304", + "3de7c65f 3e51f1b5 bd3bea02 3f941225 be3b60a2 3ee34ba3 3ee34ba3 -> 3e35d63a bd3016ad 3f8ac0b2", + "3f01b9e8 3f2bdc28 3defa076 3f2bdc28 3f96527a 3f025d99 3f915b97 -> 3f3b0c2e 3db408c8 3f37ab7e", + "3f25d185 3f9b2eb2 3f9b2eb2 3daa32f4 bd1a747d 3ecf5f47 bd1a747d -> 3ecb8112 3f3ec16a 3cdf325e", + "bdf1c80b 3f1805c3 3f56ec40 3f56ec40 3f8f2e3b 3f4b0f36 3ee622c0 -> 3f15e4dc 3f5c2b86 3f64e427", + "3faf7385 bd140e4b 3f463d6a 3e21ce1c 3f8de174 be6a2bc6 be6a2bc6 -> bd2a103d bf07a148 bddd679c", + "bead03f4 3f0f9547 3e31da55 3e31da55 3ec52313 bd25b0ac bd25b0ac -> 3f2d6bcf 3e70625a 3e70625a", + "3f804c19 be346f8d 3f2c0657 be346f8d bd230e19 bd230e19 3e372290 -> 3bf3cb40 bce86e00 bcff6788", + "3f0b3694 3f482f86 3eff79f4 3eff79f4 3f8dab99 3f8dab99 3f53f03e -> 3f53cfdb 3f07282c 3ee7908c", + "3f4101ac 3f95d007 bd434cc2 bd434cc2 3f000000 3e800000 00000000 -> 3f3aad3e bca9bc4c bc403a74", + "3f8eb2c4 3d8359b4 3e425eb8 3f632931 3e5966ac 3e5966ac 3f87a973 -> 3c000b84 3cbd7a90 3f7251e3", + "3f9caf78 3f27f2fa 3f27f2fa 3f1704a9 3f993866 bd80ae95 3f6c0474 -> 3f5074ee be4a393c 3f0896a2", + "be3caac5 3d837c75 bdd3cefe 3f032935 3f77b271 3e1bc864 3f8f0042 -> 3d84459a bdf4e579 3f00542f", + "3f5b8f7e 3edf5147 3f0c0d2b 3f8632db be4784df 3f841339 3f695e97 -> bc30fcc0 3f0fe023 3f780c52", + "3c9329ae 3ec5c5b2 3ec5c5b2 3e19b607 3e3c8912 3ea9fe98 3ea9fe98 -> 3ec2dfa2 3ec36627 3e17ddd6", + "3f0a362e 3f9a156d be581db4 3f9a156d 3dc2a86f bdb1e1fc 3e60e117 -> 3f1d9ad7 bdb29b1f 3f32542c", + "be016579 3d15a637 3ca4abc4 3d15a637 3f9d9e5c 3f9d9e5c 3f8478c1 -> 3d114607 3c9fdb22 3d14fd18", + "3f22a585 be3a0378 3ee30dc9 3f948e43 3e800000 3f800000 3f800000 -> bdc2c13e 3ee30dc9 3f948e43", + "bde73e66 3f3986dc 3f3986dc 3e6f57dd 3f024572 3f024572 3ebb87bd -> 3f43d0a6 3f43d0a6 3e803c1c", + "3fb9fd08 3f2aedab 3f2aedab 3f3f02ba 3f400000 3f000000 3e800000 -> 3ed9aca2 3e3afbe0 bd892f68", + "3e393d75 bd1b7f6c bd1b7f6c be141715 be253235 be253235 3e4aea14 -> bcf5a936 bcf5a936 bdfd3804", + "3f1c1d53 3f28aa60 3df09693 be57d633 3e2b2c43 3f4b4e3e 3f4b4e3e -> 3ea6018c 3dd26377 be3cbe75", + "3f0e3f96 3f42510f 3f8dc224 3f7e3cd0 3e800000 3f000000 3f000000 -> 3ee2ac47 3f4cbf62 3f379a60", + "bda7ed6e 3e437478 3f1cd8bf 3e437478 3e800000 3e800000 3e800000 -> 3e4f798e 3f267e04 3e4f798e", + "3fa94b4e bde2c70e 3e998a12 3d96d9e0 00000000 3f400000 3f400000 -> 3d12525c 3e4d8ad4 3d49f18c", + "3f4002ee 3dcbb1e7 3e1941ff 3dcbb1e7 3ee51364 3e8ca5fc 3e8ca5fc -> 3d6e8a8d 3d8bc50d 3d39c497", + "3e0b1791 3f16e01e 3f16e01e 3f4fef40 00000000 3f000000 3f000000 -> 3f0261b9 3f0ca0ec 3f41cffe", + "3f115736 3f375865 3f485cc8 3e8201cc 3e8b7e91 bd63d79f bd63d79f -> 3ed739f9 3ea09039 3dd05db6", + "be32a2d1 3f7a1024 3f7a1024 3e0f3c3b 3f9f65ab 3f99ff69 3f99ff69 -> 3f6f5cd9 3f7133ee 3e0a2902", + "3ef3c41c 3f9979a1 3f9437bb 3f325aa2 3f5930b2 3f3ea321 3f3ea321 -> 3f8e65c9 3f823342 3f1cac54", + "3fb57028 3f739cdb 3f95d620 bd6fb511 3f870fc4 be75ec64 3ec9c0bb -> 3f8354ea bf631fd8 bc0743c4", + "3f732d6a bd36f2c2 bd36f2c2 3d0d2b8a 3e7329a9 3f4506b5 3f883fb2 -> bc49b974 bd0eea03 3d15cfdb", + "3fbbe9a2 3d6aa844 3ee1ffd4 3d6aa844 3f3a09a6 3f621437 3ea493bb -> 3d0c82c2 3ebb3890 3965ef00", + "3f338c3a 3f4a976e 3f81f20b 3f9e6111 3e8b016d 3f8f670e 3e8b016d -> 3ec6285a 3f8ce992 3f1ae9b3", + "3f69f234 3ef96f7e 3ef96f7e 3f63511c 3e800000 3f000000 3f800000 -> 3e1cf34a 3e877642 3f63511c", + "3f2d981f bcac8151 bcac8151 3f90c714 3e9dce1b 3f7ae94e 3f7ae94e -> bc372a46 bcaa2e10 3f8ed381", + "3f888480 3ed72126 3f7581d7 3f6fcd9a bd703c15 3f8556af 3f8556af -> bd5e2e70 3f8036cd 3f7a7869", + "3fabebfc 3e83dfdc 3f6ca367 bdeb741d 3ee5a322 3e8a2f31 3eb12b9c -> 3d88c404 3c929ee0 bc651d88", + "3e13ad1b 3f12b0f5 3f7a93a8 3f11e2f8 bded9395 be62d69b 3f824f45 -> 3ef62a06 3f4e6f4a 3f124428", + "bd84454a 3c565cb7 3d9552b3 3c565cb7 3f873f82 3eed6c5d 3f873f82 -> 3c559405 3d9a7eb8 3c559405", + "3f70502d be2d4203 be2d4203 3f9c6dec 3ebd85be 3ecc797e 3f594c88 -> bd8da3e2 bd9723b8 3f863ae9", + "3e1dfa17 3e613056 3f019f20 3f019f20 3d07532a be3d3e82 3f7cf637 -> 3e3f9882 3ed3db75 3f01625e", + "be8b2bd6 3e962f5d 3d93d5b9 3d93d5b9 3d9b9f37 bd8adc54 bd9e1379 -> 3ebbe7f5 3dbebe68 3dbf1eec", + "be8c25eb 3e554534 3f4cc07f 3ef33660 3f1f7b72 3f4f4d7d 3f4f4d7d -> 3e6b47b3 3f5769ca 3effe056", + "3f824a3d bd9249d3 3f3e865a 3f2da7fb 3f846702 3f846702 3e775579 -> bd9768e6 3f4531e3 3e1e5a18", + "3fa38855 3f97433b 3f06d969 3f25b74d 3ef60811 3e8a2090 3f9703ff -> 3ecb7e9a 3d10b6b8 3f4bc8f5", + "3fb13a97 be781ae2 3ee1bf01 3f1fbeb7 3d4f0b3d 3f375b31 3d4f0b3d -> 3d9c1d14 3e890cde be4907dc", + "3e94c6d7 bdb335c6 3f34e576 3e6785b0 3f01acaf 3e90007c 3f01acaf -> bd998368 3f0f1d98 3e465310", + "3f9508c3 3e1ed15c 3d498599 3dde49cc 3dea461e 3dea461e bd5bf0a9 -> bb9e42c0 bac8d0a0 bcc9b458", + "3fbe292d 3f9e72c6 3f9e72c6 3f9e6746 3f450a7c 3f450a7c 3f16362e -> 3f50781e 3f50781e 3ef4a0c6", + "3fbfdc56 3f07eaf4 3f60b075 3f85bc31 3df20f97 3e9aca80 3e9aca80 -> be2eed0c bd247a40 bd43cb40", + "3da2868a 3f726722 3f3b2088 3f3b2088 3e70dba9 3f716ab4 3e77b904 -> 3f63b0e0 3f3a47f8 3f2fde97", + "3f596731 3f721e80 3f783612 3f721e80 3f92f5dc 3f44f418 3f92f5dc -> 3f8849ca 3f4797be 3f8849ca", + "3ed35a20 be3c098d 3f6f37dd be3c098d 3f400000 3f000000 00000000 -> be28a1cb 3f3dd80c bddcd508", + "3daf0fd2 bb3b894a 3e8362f2 bb3b894a 3dadcd41 be14db8a 3ef9b50e -> bb2cddc0 3e6d0bce bb3352f3", + "3f3ed634 3eb7bdda 3f89ee2c 3f3fb63b 3ed13679 3ed13679 3ebcb044 -> 3e4d7a8d 3f1a3f75 3ecaef23", + "3f89ecd0 3f96f950 3f4e7fd0 3ec8bf7f 3ee64a3d 3d6f59c8 3ee64a3d -> 3ef5dbe8 bc409940 3e237532", + "3fb20d51 3f9edda0 3f84cc90 3ef17f70 3f9459ce 3f872c01 3f0d9486 -> 3fc20029 3f8f2641 3e36b48a", + "3bfb068c 3f486917 3f34ee38 3f34ee38 be74bed1 be74bed1 3f798151 -> 3f46821e 3f333695 3f34e537", + "3f35ae76 bc7b5b85 bda05d22 3e5fc002 3e8ee6d0 3eb39ef8 3e8ee6d0 -> bbf584c8 bd2cf681 3dda8d72", + "3f00d0a2 3f7eac74 3f9264d1 3e9dd3a0 3f2c8e37 3f155adc 3f2c8e37 -> 3f54e73f 3f676a0d 3e83f0d2", + "beb42a25 3f84b6bf 3ee1f9be 3eb23f08 3e0d119d 3f42334a 3f530188 -> 3facfaf2 3ef52be0 3ebd4525", + "bec8cfde 3e4718ee 3e90c2ba 3f9efd85 3ed642c3 3ebdf0f0 3f80c93b -> 3e7481e2 3eb47972 3f9e9b7d", + "3f890fb2 3f9ff9f4 3f4f65e6 3f9ff9f4 3f800000 3f400000 3f800000 -> 3f9ff9f4 3f17e0c6 3f9ff9f4", + "3ea17b60 3f9ff785 3f9d51b8 3ed84b7e 3f94585b 3f3608fa 3f2fe7b6 -> 3fa7fc74 3f8efbc2 3ec2f390", + "3f5d0b41 be5a5726 be03d475 be03d475 bcda405f 3e58a94a 3ef1aba1 -> bcc653f8 bd285754 bd8f7596", + "3e76a50d 3f622984 3f934047 3f622984 3ddc9cde 3f8b8dbc 3f1b49a2 -> 3f318e4e 3f9673d6 3f4cbb47", + "3f8822a0 3f656ae8 3f91803d 3f77d419 3f000000 3e800000 3f000000 -> 3ed6d62a 3e6b8438 3ee813ce", + "3f1453a0 3f56996c be39be7f be7db73e 3f3f9cec 3e12a237 3e12a237 -> 3f37539a bdbb11c3 bdff86aa", + "3fb68b47 3cb9b1b8 bdd862fe 3cb9b1b8 3f8c00de 3f8c00de 3f2603d4 -> 3cd28745 bdf5535a 3c39372c", + "3eb26a51 3f3fe2d9 3f5e4c26 3f3fe2d9 3f8345b5 3ef33a33 be13768e -> 3f419875 3f35a220 3ee6c823", + "3f332803 3eaffa22 3e4db717 3ebed470 3f814108 3f8c546a 3ed202e8 -> 3eb12f02 3e5b9535 3e601ecd", + "be24990f 3f9bccd4 3f163124 3f9bccd4 3f2edbdd 3e4cf90c 3f2edbdd -> 3fa3bcdf 3f29805a 3fa3bcdf", + "bebdb801 3f8f6525 3f61eeb8 be471f3d bdd119f8 3e242f53 3f817bbe -> 3fc9f452 3f941d1d be464458", + "bd9b899b 3f5965dd 3f8684eb 3f5965dd 3f6c41d4 3f6c41d4 3eb9c0f0 -> 3f5aabd4 3f874e9d 3f63eb1c", + "3f8a96d4 be1332ae be1332ae 3c15fa15 3eab7ffc be1ce38a 3d67572b -> bd24d418 3d1261d8 b94f1880", + "3f072589 3f4fb29d 3f5fb970 be6d9ec8 3f7a9cd7 3f1f0015 3f7a9cd7 -> 3f4d63e8 3f32f905 be6afaf9", + "3f285383 3d8b318d 3f18f447 3eb488f5 3f05b15b bb780869 3f05b15b -> 3d3eef38 3e500288 3e77a4ae", + "be846def be58f56a 3f4285df 3f4285df 3f8be1c7 3f8be1c7 3f9b737c -> be53bfdd 3f3dda39 3f37bb8b", + "be265641 3ce074ec 3ce074ec 3ebbfc9c 3f21323b 3f9e1ed8 3f3f6aab -> 3cedf581 3cd7e083 3ec3b0be", + "bc556f7a 3eb8460b 3f7d0ad2 3eb8460b 3e9722ad 3edf67bd 3e9722ad -> 3eb9f72e 3f7ee67b 3eb9f72e", + "3fbf1fa8 3f243a06 3f243a06 3dc071e0 3f13a90b 3ccfe8d9 3ccfe8d9 -> 3e71cdc6 be9587f0 bd2f395c", + "be97cd52 3f9bb2fd 3f670ad5 3f670ad5 be162860 3f3839b3 be7f3717 -> 3fd0a1a6 3f7a3f7e 3f9e4eea", + "3f4f7042 3f563f15 3f9a31ee 3f9a31ee 3f18bf68 3f7a05c4 3f7a05c4 -> 3f1039ee 3f974712 3f974712", + "3f390c61 3f7a6290 3f3bfbf5 3f7a6290 3e415388 3efec431 3dd1283d -> 3ecf217a 3eef6e1e 3eafc246", + "3f181143 3eb39c1e bcfa17f9 bcfa17f9 3de66f1a 3f55793b 3de66f1a -> 3e29d8ea bce16a4a bc6c8004", + "3e704b5b 3f615134 3f80386c 3f615134 3ecec037 3ea3a3de 3f3dd407 -> 3f41cb69 3f577f36 3f53a679", + "3f812229 3f4c2572 3ec191ec 3f4c2572 be48cc5c be48cc5c 3e7ef2e9 -> be28c64c bda007e8 3e45e0a4", + "3f15bf86 3e509391 3e509391 3f300765 00000000 00000000 3f800000 -> 3dad2345 3dad2345 3f300765", + "3f7771d0 3f92ac6e bdecc912 3e0114ff 3f55e5d0 bd4b8168 3f4da9e6 -> 3f76b706 3add4fc0 3dd11940", + "3f6a1c5e 3e8a0b5e 3d591d90 3e8a0b5e bb2c00e2 3f2e59b1 3ecf8986 -> 3cb78dc8 3d19c9f0 3dfbe61e", + "bdf8839b 3d3ab0b7 3d3ab0b7 3eebede7 3f000000 3f000000 00000000 -> 3d46046a 3d46046a 3f044770", + "3cc32ea7 3ec0b56f 3f100766 3f21ba39 3e74005c 3f0f7c33 3f0f7c33 -> 3ebd3619 3f0e854a 3f2008ab", + "3f4c9f3a 3f7648e1 3f68e4b1 3cd4a989 3e9d188c bcfc5d70 3e9d188c -> 3edba896 3e240618 3c3dabcb", + "3e6c0329 3f604b17 3e63d99a bd34f195 3f2fed41 be3e6242 3f135be3 -> 3f501fae 3e25923e bd233ecf", + "3fa06080 3ebfb015 3ebfb015 3f54af78 3f400000 3f400000 3e800000 -> 3e83a4ee 3e83a4ee 3d4d2b50", + "3f974ada 3eb00049 3f1b11b0 3cf47d48 be465bae be4a55a7 3e03453b -> be10a600 be80de66 ba6e3bc0", + "bd419fca 3e4a93df 3f6899ab 3e4a93df bd4669e3 3dbdad35 3ea8c0e8 -> 3e549e1e 3f7293ca 3e50ff5d", + "be2cfe4f 3f504586 3f504586 3f0be331 3f832220 3f70ad95 3f02eb5e -> 3f4f6908 3f5260a1 3f176f26", + "be8d262a 3de2c1b0 3de2c1b0 3d10c511 3e800000 3e800000 3f400000 -> 3e08d20f 3e08d20f 3d1abf55", + "3faef350 3ef26c55 3ed9c8b1 3f9fd230 3f89f40f 3d399284 3e8c037a -> 3f061827 be04cb5a 3c0e9800", + "bea1b01f 3ed0fd51 3f947772 3f09018b bdbea8c1 3f945a48 3f945a48 -> 3f0c90e1 3f8d02f7 3f022062", + "3f8f9c28 be6ca6fb 3d88e584 3d88e584 3ec1a650 bdc9c5f3 3ec1a650 -> bd8f1fe6 bc7e9de8 3ca59642", + "3f3f6f6a 3f4efb1b 3f4efb1b be66e317 3f17902d 3f8d46cc be0fdbc2 -> 3f0fd67a 3f5f08f8 bd07e6b0", + "3f2bce7c 3d94b5db 3d94b5db 3f50c378 3f6b1b04 3f95371a be35014b -> 3d8c908a 3da54085 3e2f9250", + "3f2215ce bcaba6bc be13a919 3c493969 3e2c1416 3eb1944e 3e2c1416 -> bc2277f8 bdad3104 3bbe75a4", + "3f0a180e 3f6a8cad 3de58213 3f9d77ec 00000000 3f800000 3e800000 -> 3ed80d9b 3de58213 3f3b85ae", + "be9e67ed 3f58b0a5 3f58b0a5 3f8bf989 3f400000 3e800000 3f400000 -> 3f697345 3f857c42 3f96cd24", + "3c701021 3ed89916 3ed89916 3ec1d0da baf859e8 3f0932df 3f56b5c4 -> 3ed56b17 3ed7200d 3ec15b98", + "3fbf80c9 3df80d1c be0c62fb 3f26d3ce 3f5031df 3f5031df 3f25aed9 -> 3db2bff1 bdca5470 3e9d8a8f", + "3e992117 3f355f72 3ee546af 3f355f72 3f4a149b 3ec634dd 3f857e9c -> 3f29f294 3ebb3ff4 3f37b38d", + "3ed89332 3f4ed9b1 3f4ed9b1 3ec1f256 be3e4e89 be1b81ca be44c1ba -> 3ece2f1c 3ed4218d 3e4049d1", + "3e8dac17 3d56d21e bc0353d5 3f59282a 3f8a9ea0 3f4786a7 3ee94cd5 -> 3d5bc09d bbf69f45 3f3872e5", + "beb0266f 3df0bed6 3f7b65c4 3df0bed6 3bf93c63 3d7bceca 3bf93c63 -> 3e21789e 3fa64935 3e21789e", + "3e80e961 be104b7e 3f253007 3f253007 be1cd6a6 be11c495 3eab84ad -> bdccccac 3eeb5a22 3f098789", + "3f7e369e 3f422a23 3f9aeff8 3f11da8a 3f9e87ec bd3933b8 3f9e87ec -> 3f702773 bd3c02a0 3f34667c", + "3f399052 be65f0de 3f26c7a8 bd5402f2 3f9f5535 3ed93860 3f9f5535 -> be875ed2 3ec25ada bd79a14d", + "be5ef954 3e86923b 3f266edd 3e86923b 3f000000 3e800000 3f800000 -> 3e9538f7 3f419d08 3e86923b", + "beffab94 3f7991b4 3f813f53 3f813f53 3f9417be bd4fefa8 3f9417be -> 3f6601a3 3fc51072 3f6e3b79", + "be876e22 3e196a05 3e196a05 be089e0c 3f09403f 3f09403f bd7ba5fa -> 3e2c3cd8 3e2c3cd8 be2ef978", + "bee463b8 3f7f3410 3f6cb094 3de63bb3 3e61d961 3f3d8107 3e61d961 -> 3fabf7a8 3f840ea5 3e1b2433", + "3f1d6246 3f7e3822 3d785f24 3f8283e5 3d0f2950 3db08d72 3d721d68 -> 3ecec90e 3cd9ae86 3edc1456", + "3f371c17 bd91bfc1 3eef2460 3f108577 3f254209 3f380c19 3f4a8478 -> bd5997be 3ebf10bc 3ef5d9b9", + "3d3f056f 3ed8c5f4 3f8c29f8 3f8894eb 3f3a3931 3f909c32 3f922e81 -> 3ed6048d 3f8d031f 3f897c8a", + "3ebedef6 3f51ec48 be54efe1 3f90001d 3db4aa4e be436dbd 3f9ebb45 -> 3f0a9180 bdeccf87 3f9ce39c", + "3fb8997d 3efca7e3 3f5d56fe 3efca7e3 3f02df60 3f63fa2f bbb43e1e -> 3e151cda 3f3a65c8 be637306", + "be48ede1 3f136efe 3f85a718 3d5eedc6 3f48f956 3f047c83 3e3a094b -> 3f19a6dd 3f924e47 3d815cc6", + "3efeda3a 3f8c2047 3f9a9758 3e3076bf 3eb18259 3f356168 3f9d22df -> 3f3d1e2a 3f842970 3e447530", + "3e877d64 3f90662b 3f90662b 3ed6bee1 3f912b17 3f912b17 3eed9338 -> 3f95863e 3f95863e 3eb84965", + "3f88e1cc 3f6ebe6a 3f8c7c95 3e8cab1b 3d9ef8b9 3e2c6e1b 3f51bcd9 -> 3c501540 3df8ca78 3e62f7c8", + "3e673ad2 3f523f35 3ebe6a98 be2eb889 3f6e0bb2 3f880cae 3f7a5477 -> 3f4eeacf 3ec11ed2 be2dd8d5", + "3f838bd9 bcd2bc20 3ee8ad07 3f44fd86 3f8c9271 3f7230a9 3f8c9271 -> bce801aa 3edbc6c5 3f58dfe4", + "3f94cd35 3e959dd8 3f36473a 3d52dccb 3e20f8b7 3f2d7df8 3f7d0c32 -> 3bc1bdc0 3ee3f779 3d500914", + "3f8e23d9 bd6ec828 3f317494 3f317494 be61f331 3f87ca25 be61f331 -> 3ca9c5f4 3f3d729b be7c5730", + "3f1f053b bdfc8f99 3f4e24f8 3d068810 3e1d7a1c 3f826d03 3f99854f -> bd6f9b52 3f50923b 3d173178", + "3dc0c823 be0884c3 be23546f 3f112554 3f76a13e 3eba093f 3f9e1392 -> be080c59 be198aaa 3f145b30", + "bdc2876f 3d110562 3f2bd9bd 3f2ec5a3 bda8124b 3f14f626 bda8124b -> 3d1fed20 3f32acf3 3f40bc2e", + "3f9493d4 be112013 3f7fa065 3e8b7936 3ed2770c 3f935ffc 3f3e4620 -> bd37a9a6 3f964528 3e43d0eb", + "3fb27f9a bd0566ad 3f3e9678 3e8e9463 3f6fc004 3db65042 3db65042 -> bcf32f63 be4e1f9c bd9a33b4", + "3ec580ec 3f3cefb2 be2cd9f1 be2cd9f1 3f31da37 3edc13f1 be43cd73 -> 3f26b024 be06d5a8 bdbad955", + "3fab9376 3f50c626 3f448a7f 3e3e21f0 3f1d1f44 3f744e4b 3e39f40a -> 3ec95ea4 3f3881a8 bc939318", + "beed1d60 3e47543f 3efa68df 3efa68df 3f4ba52a 3ea698c2 3ea698c2 -> 3e5a353d 3f245267 3f245267", + "3cbcbbab 3dab8f82 3f87cc92 3f69f33a 3f53e363 3f51dcb0 3f51dcb0 -> 3daae128 3f873c39 3f68fa8c", + "3f56e11a 3ec293df 3f8a7e50 3f8a7e50 3f98edd6 3f8208bc 3f8208bc -> 3ee262d9 3f8c573d 3f8c573d", + "bebbad75 bdc47936 3f822381 3f822381 3f81eed3 3eaba6b5 3f466bf8 -> bdc362cd 3fa1d964 3f8cde2e", + "3f0783c6 3ef41b4a 3f6dc87b 3ef41b4a bdb54bf5 bdb54bf5 3f280633 -> 3e4ee5c0 3ec989b4 3ec7b328", + "3f75de43 3f1f9b3b bd832b5b 3f9ce8d8 be408ed6 3f899488 3f899488 -> bdb41180 bd8c9925 3fa8304e", + "3f821fe8 3ea7907a 3f6cc11a 3ea7907a 3f7bee4a 3f2f33ae 3e995c69 -> 3ea4db4f 3f20ca46 3dc0f8ac", + "3f87a20f be28622f 3ecbc63c 3d00e654 3f0dd94a 3f0dd94a 3d574ce7 -> bdb1a590 3e56fc07 b901da00", + "be52a065 3f0c6552 3dff8c83 3f8f4d30 3cf5ba03 3f4b601c 3f0f15ab -> 3f286856 3e052d55 3f9c4d72", + "3f52dd84 be7e7f2a be7e7f2a 3f8d9ba8 3d8f0d11 3f967cc6 b89ea227 -> bd6e0c3c be91a98c 3e47a96c", + "3f02e17a 3f9b5b84 3f3c4759 3e82afa6 3f1a46b6 bd95e31f bd95e31f -> 3f7797ce 3ea9f39d 3debee22", + "3ecfaa3f 3d8567f6 be6b74f8 3d8567f6 3e334271 bd1b66d4 3f06357e -> 3d3189ea be085554 3d5753f4", + "bd5bccc6 3d771f26 3f00711c 3d771f26 3f708a4e 3f679b2d 3f679b2d -> 3d77ec29 3f01193e 3d7862a3", + "3d9c1d54 be31b001 3f5df1c8 3f5df1c8 00000000 3f400000 00000000 -> be24248e 3f59b702 3f4d06b0", + "3f9aa9c4 3ea14161 3e8bfd92 3e8bfd92 3ec3da35 3f453bf8 3f6d223c -> 3da3c56c 3e4a5288 3e7f0ca2", + "bd2cca87 3f36b521 3e31dc9d 3f36b521 3f90e971 3f90e971 3f2c13a1 -> 3f35b06e 3e30ded4 3f393bf9", + "3f4cb3e1 3eecf608 3f38aaf4 3f8017fa 00000000 3e800000 3e800000 -> 3dbdede4 3e93d6ee 3ecd1892", + "3fa78664 3f919b27 3f919b27 3a6d2e24 3ebdfbd0 3ed550ae 3ed550ae -> 3e4e01b4 3e89bd50 39605dc4", + "be59f1e3 3f88db75 3f91d8a3 3f88db75 bde74f67 3f13bf8e 3f13bf8e -> 3fa94680 3f9ef8ed 3f952ca4", + "3f8ef881 bde29923 3e9130d1 bde29923 3f9cdc17 3ecbbc29 3f9cdc17 -> be0dd4fd 3dbe335c be0dd4fd", + "3f4b18cd 3e436cc1 3f829ac0 3d89dd73 3f7f5af3 3dd09357 3f7f5af3 -> 3e4308cc 3e962b4a 3d8996ee", + "3fae91cb bcfc5dbb 3f1d46a9 3f1d46a9 3f9b34d1 3f0c3140 3f0c3140 -> bd22c2d1 3e70f92c 3e70f92c", + "3eb53d83 bd2fe3c1 3f7b36d6 3f7b36d6 3e9590c6 3f012bbf 3e9590c6 -> bd03d0c1 3f4f286d 3f3c43e8", + "3f456dc0 bd85fe07 bd85fe07 3e2752c8 3e800000 3f000000 3f400000 -> bce1f656 bd24a621 3e07102c", + "3f8bceb6 3f8756fb 3e5c6a0d be1a3faf 3f6597f6 be1c12b2 3deed391 -> 3f702ef2 bd641a4c bbad6140", + "be7e6db1 bdce4927 3ec62bad 3ec62bad 3e70bcad be7fe029 3e70bcad -> bdf57da9 3f01db3c 3eebd55a", + "be1d2a2c 3e4d87e5 3e4d87e5 3d73c406 3f400000 00000000 3e800000 -> 3e556ac8 3e6d1372 3d87e9b4", + "3efc46e6 bdbd3f4f 3f58a6f2 3f161eb2 3eee1075 3eee1075 3f3d1beb -> bd8b5b65 3f1f8989 3f02cae2", + "3f61f0d5 3db2e585 be3cfbaa 3f71539e 3f040271 3f2fc386 3f040271 -> 3d4cd928 be08b4d5 3f0a2ada", + "3df90ba6 3ec97117 3ec97117 3eed6362 3ef86b63 be7f75c4 3f5805ce -> 3ebcd4bc 3eaad59f 3ee8e157", + "be19681e 3f6ab30f 3f6ab30f 3f86731d 3ed7fc05 3ed7fc05 3e039e1b -> 3f7f071a 3f7f071a 3f9800b8", + "bedbc344 3f338121 bd088cb8 3e8bd608 3f4acc65 3f969396 3f969396 -> 3f43842f bcfc6c90 3e813fe7", + "3deba0ca 3e00621f 3d0b8e76 3f381ca7 3ef15625 3ef61eec 3f9b2c0b -> 3df12650 3d0337ef 3f3c9bcd", + "3eb355e5 3f40e737 be34a541 3f40e737 00000000 3f000000 3f800000 -> 3efaac09 be150237 3f40e737", + "3f2777b5 3f87278a 3eba70a1 3eabc5e3 3f84bc6e 3f755cb0 3df9bac8 -> 3f8a6d02 3eb55f30 3e123668", + "bea2bda6 3f9c46b3 be1cba43 3f9c46b3 3f3de6fd 3ef077b5 3e14ea06 -> 3fa919f6 be3725a4 3fc6b9b5", + "3f4e8170 3f707fe7 3c96b330 3c96b330 3e8a7631 3f03d9ae 3e8a7631 -> 3ec5ec9c 3c377e1c 3bf80b20", + "3db067f8 3e43bbf1 3efe5f08 3efe5f08 3e3c6a57 3e3c6a57 3ebbd30d -> 3e35fa03 3eec7e05 3ef07f9d", + "bd758ec1 be008fc0 3f9b76fb 3f394eaf be6e5b44 3e7a5b40 be6e5b44 -> be0a101a 3fa2819c 3f4700a7", + "3f0078b8 3f311e12 3f238be5 3f40f4d7 3e9b87db 3e9b87db 3ea984a6 -> 3ee67760 3ed4cec0 3f002ef6", + "3f3e5fe7 be3822bc 3e700940 be0244e9 bd8bf058 3f98c4b0 3f98c4b0 -> bd1762cc 3e8949d8 be1503c2", + "3fbd458d 3ee4b8b2 3e00b617 3ee4b8b2 3f8b7e2c 3f90f901 3edb0d5e -> 3f018b50 3e19f2af 3d8cd8cc", + "3f996340 bdc191be bdc191be 3eb3b3e1 bddfe6b6 3ebab2d5 3f19f9f9 -> 3cff0288 bcb8c3c0 3e3bc336", + "3f8cbfdd 3ea1489b bdcab72c 3ea1489b bc305fc1 bc305fc1 3c1e092e -> bd0fca70 3c34ba98 bce5aa20", + "3e6b8a35 3f50117c 3f0dc5d7 3f50117c 3da746b0 3f7f0d97 3da746b0 -> 3f241e1d 3f0da6f6 3f241e1d", + "bd5019cc bd3a1dae 3dd172f1 bd3a1dae 3f8e6f69 3eedef4e 3ec63524 -> bd390cb0 3dd72523 bd3fe941", + "3ec65b46 3f2d17c0 be31538b 3ec39f87 bcf5988d bdb7bfe5 be67cbdf -> 3ed00c15 bdcced66 3e4d5c4e", + "beff9ccc 3f1a4b40 3f1a4b40 3cb6d56c 3e51dbc7 3f74fedb 3f26db83 -> 3f57899e 3f1d9aed 3cd69e37", + "3fba79df 3f58ceb3 3f718979 3f357f89 3ef81543 3f05db6b 3e0de6ad -> 3e57fc04 3e934b3a be3919b0", + "3dc8c9d5 3f3f87e4 3f2b24fe 3f055f41 be208652 3f03289a 3f834907 -> 3f29cf2a 3f22f640 3f05b52b", + "3f4f49f8 bd6f7935 3f336387 3ee63857 3f8b65a5 3f8b65a5 bdcffb9e -> bd805e92 3f40527c 3d46ff18", + "3f2401d3 3eda106b 3f6b4fff 3dcd0863 be613ec3 be613ec3 3b8622fc -> 3dbe85e0 3e4d97c0 3d146e6a", + "3ef6e2b5 be3785d0 3ecb10a2 3f421b9f 3dcccccd 3dcccccd 3dcccccd -> bdcfc16d 3e65e0d6 3edbbd0c", + "3e94da73 3f76e52c 3f76e52c 3e2737a5 3eca70b0 3e878c2c 3eca70b0 -> 3f4b7f21 3f421e5d 3e09d307", + "3fb8a6c7 3f123bbd bdf3b2db 3f123bbd 3f166096 3f166096 3e4bba83 -> 3e6cc884 bd454cde bdb60260", + "3db0ebe4 3f91d466 bd6b1a21 bd9cf77a 00000000 3f000000 3e800000 -> 3f853b59 bd60f277 bd92cbf7", + "3f85cb28 3ef2e872 3f557f9c 3e96d183 3df784ce 3f4f73c7 3f4f73c7 -> 3d1d88c0 3f2b2d9a 3e71d86d", + "bc593e67 3f136e66 3f166da7 3f00ece8 3f51c253 3f4cf334 3e949325 -> 3f13c8cb 3f16d37a 3f02238b", + "be318eb0 3f748bef 3f748bef 3f548696 3f2aaaab 3f2aaaab 3f2aaaab -> 3f81572d 3f81572d 3f60cf36", + "3faf3068 3e311e72 3f11aad5 3f11aad5 3f938f7b 3f4b5cf1 3f341b0c -> 3e562a01 3ed1593d 3ead1f98", + "3f1c59d6 bd1cdf31 3f24459c 3f7d0a78 3f7262b9 3f582df0 3f582df0 -> bd17c6d1 3f14aa7a 3f650074", + "3f2e4610 3f729dc3 3f8b2b43 3f8b2b43 3f2168fb 3f2168fb 3dfbe2b3 -> 3f35970c 3f505396 3ee052ec", + "3f6de3d0 3f173120 3f8f4bb6 3ee9fbb8 be266c68 3f6af037 3f6af037 -> bd4235d0 3f84572b 3ed81844", + "3f8bb820 3e33afe8 3db92a49 3db92a49 3f39ac63 3f8f71e2 3d95939f -> 3dfb9c46 3dd18da9 ba8c3e00", + "bdf2b6a5 3f6450bb 3f6450bb 3dfb6824 be2fda03 be2fda03 3e892048 -> 3f820298 3f820298 3e089c65", + "3f2561c0 3e3eda7e 3e3eda7e 3e81e5aa bd2a7b29 3f1640f7 3f651eac -> 3d79b444 3e0bec70 3e722bf2", + "3eecd302 3f62c4e1 be282fc8 3e2c836f 3e800000 00000000 3e800000 -> 3f1419ba bdb4c8e3 3de15559", + "3f1974e2 3f986190 3f8eccef 3e1732b1 3e1959b7 3e1959b7 3f6cb52f -> 3f156f21 3f0c09ef 3e105e28", + "3f2458de 3e9501c3 3f69f703 be04ed20 3c9606c7 3c9606c7 be779b56 -> 3ddc6590 3ead077c bcd7a4fc", + "3faa78fa 3f8fa07d 3e002f78 3e4557bd 3f87fd22 3f48d20a 3f87fd22 -> 3f9b90c2 3db6c67d 3e55bf0a", + "3ec14dc1 bdf1dab4 3f93a889 3f93a889 3ec8e813 3ec8e813 3de94808 -> bdba5f8b 3f639246 3f448566", + "becf17b2 3ea0852a 3e7a18bf 3e7a18bf 3e2cdc4d be7e8970 bcdd5c70 -> 3ed67c9c 3ebc333c 3eb0fe8c", + "3f3f0ecd 3ec1cfb9 3f42ccdc 3e479789 3f400000 3f400000 3f400000 -> 3e9da66d 3f1e7455 3e225a23", + "3eba6fb7 3f29e619 be2bab37 3f95d0e1 3f4432f1 3f164bdc 3f164bdc -> 3f1b7275 be11dba4 3f7e94da", + "3f274018 3f36a088 3f36a088 bd09ee32 3f0507e4 3ebd59ed 3f911eb5 -> 3efaa11d 3ed6e079 bd15fba8", + "3e93593d 3e45c8bc 3f92fe1f 3f66dc67 bda80eac bda80eac 3d300948 -> 3e083165 3f4a6fc0 3f2746df", + "3e4b63f7 3f85ae5a 3f85ae5a bd4808ad 3f13a071 3e1f572b 3f31a388 -> 3f74e19b 3f5e8565 bd3bdf46", + "bed88c3c 3f6b20a8 3f6b20a8 3f705d9b 3d0a9d71 3d0a9d71 3e8d5c05 -> 3fa59aa5 3fa59aa5 3f9cfac4", + "3fa69cbc 3f1e4e92 bca274cf bca274cf 3f400000 00000000 00000000 -> 3ed59545 3bc40668 3bc40668", + "3f98eb3c 3e4e3bb1 3f5aee4a 3e4e3bb1 3f95856f 3f560df3 3f95856f -> 3e77a898 3f30135c 3e77a898", + "3f1d2e7a 3f4c4b33 3eb38531 be34bcc8 3f2a971e 3f37ca9c 3f2a971e -> 3f2271e2 3e946e18 be0fb6c7", + "be97ed5c 3d8a50d2 bbc92c4f 3f5dae9b 3f44a702 3f96fc30 3f434062 -> 3d93d49d bbbe7422 3f6d4aa9", + "beea3d46 3f8f820b 3ec5a3d0 be557e84 3f77f37d bd294b16 3f8a3738 -> 3f91927d 3f11e606 be4db2ea", + "bedf8a69 3f0be01a 3f11f1e1 3f0be01a 3d2c8d60 3e2fb1f6 3d2c8d60 -> 3f465f69 3f46bb5c 3f465f69", + "3f7a8beb 3f41a793 3ef5bd37 3ef5bd37 3f94f5ce 3f6eefdd 3e451689 -> 3f60b0b5 3ee5b57c 3dce1900", + "3ee96b62 bdcada43 3e867dae 3f34a10a 3f368e9a be54761e 3eb2311c -> bdb05242 3df1d23e 3efde18a", + "3ef2da1f 3ea04e87 3f80e6c9 3d57289b 3e7a2286 3da0fe8b 3da0fe8b -> 3e4daff5 3f112266 3cf24109", + "3f2b8eb4 3f29ecbe 3ddff926 3f29ecbe bd6fc86e 3e9c8c12 3bd5ad37 -> 3e458940 3d6f8aab 3e632bec", + "3f9d43f9 3f83792e 3e8b7342 3f83792e 3e224869 bddf2d6c bddf2d6c -> bd0eb860 bdca3794 bebea658", + "3fb3ee35 3f223c64 3f223c64 3f9836d1 3f000000 00000000 3e800000 -> 3e40d4d2 be83a3f6 bd843210", + "3fa4b0eb 3f3dd9d5 3f40136b bda5547f 3f28360b 3d41da10 3edd0631 -> 3ed42b04 be2d72ec bcb1c032", + "3e8557f1 3f6d8d9f 3f156d80 3f6d5e1b 3f40e51d 3e95f486 3f40e51d -> 3f5e4d78 3ef3d180 3f5e2101", + "bebebf05 3f6dfc1e be5c72f2 3f6dfc1e 3e99f477 3e99f477 3f8b81a1 -> 3f95fe43 be8af0e6 3f6603c6", + "bd75c093 3f39a771 bcd455a8 3f80e270 3eeb5c1e 3eeb5c1e 3f74ebe8 -> 3f3fac2d bcdb37cf 3f81381b", + "bee80751 3e82c861 3f8f4932 3f741d28 be2974d6 3f019149 3f2fd151 -> 3ec7dbe4 3faf5b04 3f8b61c6", + "3f0842a7 3b6703ba 3edf7950 3edf7950 3e4e5030 3f362ac3 3f362ac3 -> 3b04d3be 3ebd2b0c 3ebd2b0c", + "bd57fb34 bc9e2cbf 3f806649 be41adbd be59f746 3f437d93 3f20bd8e -> bca84a68 3f81fff7 be457a97", + "3f9e4875 3f71d7d2 3f71d7d2 bdbf2558 bb5f60fa bb5f60fa 3f1f8b6c -> be68f1c0 be68f1c0 bd4c2cb0", + "3f5384aa 3f6932b2 3f4ff6f9 3f224c91 3f8f4d1a be5cc17b 3f83d6bd -> 3f801d8d bb687100 3f265220", + "3f9074d4 3e320ae6 3e320ae6 3f6cfa8c 3df70e70 3e76a17b 3d4bb3cc -> 3aacac80 3ccc0970 bd895538", + "be988de5 bda7796c bdc25013 3e9a3c48 3ec22afd be23b7de 3e708a91 -> bdc6735e be02bbb2 3ebd655e", + "be302f36 3f911b06 3ec4cb15 3b99fab9 3f719e24 3f2da311 3f33ffcf -> 3f928218 3ecfafd6 3ba1d835", + "3fbb7e18 3f05d2c4 3f05d2c4 3e8250e3 3f0c2b6b 3f93de1e be47f634 -> 3e3485a2 3f243fc6 be43b028", + "3eae7c0f 3f4f4769 3f47e4d2 be149c1c 3f5fa3d8 3f63a424 3e0c1378 -> 3f46598c 3f4058f7 bdd1c928", + "be9b69cf 3f60ce5a 3f16e930 be6a806d 3e577e8b 3f9018b1 3f485997 -> 3f8b5787 3f112681 be79f9a7", + "3d701ba2 3f454205 3f1aa90d 3ecb9711 3f8b82a6 3f4f1470 be7a46e1 -> 3f464c37 3f18ed88 3ebcbd1c", + "3f15a83f 3dfbae47 3f601133 3dfbae47 3d530fa7 bd8c3a6a bd94d8f9 -> 3d60429c 3ea837c2 3d3bb5cc", + "3f7264c8 3f694e2b bc94cf18 3f8df89e 3f52abaf 3e39c86a 3e847278 -> 3f4230ad bb85e3be 3ea94758", + "3fbfce44 3ecb92e3 be1bc912 be1bc912 3eacded2 3e31c659 3e31c659 -> 3b426e00 3d1483f8 3d1483f8", + "3f1f509e 3f5499b1 be33c45a 3f5499b1 3f4d0195 3f53ad17 3f68c8fb -> 3f3a3ee4 be2065b2 3f489a36", + "3f86a31d 3e853fc4 3e853fc4 3eb4aa20 3dc593d9 3dc593d9 3f3ce3f1 -> 3c539750 3c539750 3e82d91e", + "3dc4bc16 3f659c76 bb54ad5c 3ee2b989 3ee001c6 3f85d462 3ee001c6 -> 3f593459 bb559b8f 3ed67959", + "3f71e08b 3f83ce0b be387779 3f93530d 3f252b0b 3f7ec31e 3f252b0b -> 3f2f3cde be379fbc 3f43df12", + "3fbd3ba9 bca6e18a 3f4af483 3f8cf1f0 3e9cfda6 3f57c4cf 3f3088f3 -> 3a05eb00 3f1bcd51 3f18877c", + "3fbd0822 3f472c84 3db080a5 3f667da2 00000000 3f000000 3f400000 -> bebdefbc 3cb8b040 3f116499", + "3f93e551 3f75dd5f 3f75dd5f 3e5deafa 3f6402f4 3ee9d02a 3f6402f4 -> 3f56ce62 3eb7072c 3e41e267", + "3f0f04e4 3d456a26 3f216eab 3d456a26 3df91bf3 3f009d65 3f94564a -> 3cc914b0 3ee91c55 3d56f012", + "bed11cfd 3be9bae2 3f0d942f 3f006a7e 3f077457 3ef44901 3e97761a -> 3c0b5724 3f2bd063 3f25594c", + "3f2a7be1 bd5ce0e6 3ddc927b 3e97b84d 3e6c2c54 3f8ddb59 3e6c2c54 -> bcd76b3e 3dec795b 3e13f842", + "3dcf11b2 3f21a012 bdaa304d 3f8fbb05 be4ffc68 be7ea805 3f59e190 -> 3f0df6ea bd94b3b4 3f8d9110", + "3f856512 3ed60786 3f75f1c4 3f75f1c4 3f000000 3f400000 3f000000 -> 3e4d023b 3f35ddea 3eeb941e", + "3f98a81e 3f027408 3f60131a 3f60131a 3f2ce963 3dd062e4 be52d423 -> 3e9fe9e0 bd7f8ca0 bec45e80", + "be872625 3ec9ea6c 3f987324 3ec9ea6c bca9764b bca9764b be1e3ba2 -> 3f002883 3fc185f6 3f03b994", + "bdf49b0e 3f1ce318 3f1ce318 3ef8a1ef 3e416dec 3ee02a2b bb6dcb72 -> 3f2c15e8 3f276bd3 3f0b37d1", + "3f740c27 3f91db53 3ea917c2 3f166a0b 3f800000 3e800000 3f400000 -> 3f91db53 3dc0c704 3ee521fa", + "3f9f5109 3ef2c800 3ef2c800 3f4ac7a8 3f60398f 3f20b14a 3f60398f -> 3ecd462c 3e8247f8 3f2b73db", + "3e6446a4 3f79233d 3f84cdb8 3e1e5c1a 3f4e2ef6 3f504f2b 3e690145 -> 3f6e5478 3f7e93a3 3e031715", + "3f5fdb32 3f5f519c 3c1a2773 be3ff4b7 3f000000 3f800000 3f800000 -> 3efb5beb 3c1a2773 be3ff4b7", + "3f87f072 3f8e3903 3da9bf22 3f166ed9 3e75f323 3e75f323 3d44526e -> 3e5ba848 3c831560 bbd62a00", + "bc139bd2 3e2f6f4f 3e2f6f4f 3f05a981 3f33d708 3eadf116 bc762eea -> 3e2fe7af 3e307a78 3f06e26a", + "3d826ce8 3f7a2160 3f14cd66 3f7a2160 3e800000 00000000 3f800000 -> 3f6e2eef 3f0b5373 3f7a2160", + "bcc6542a bd819f0f 3cf80f97 be6107c0 3e908c4e 3f4bbfe7 3ef0f497 -> bd83df9e 3cf94962 be63ea13", + "3f08caba bcf3e9be 3f6b12ef bcf3e9be 3f249970 3f5ae6f0 3f4901bd -> bcc56132 3f58df0f bcd7ea4b", + "3e1800c2 bde552eb bd877c1a 3e9ce943 3f89bea3 3f576756 3f27f940 -> bde7ea5b bd844ba7 3e94e6f5", + "3f468934 3f794ee2 bd56f6fe bd56f6fe 3f9a89ea 3e8579df 3f9a89ea -> 3f90b29a bcb76d8b bd7987a2", + "3f836098 3e2af01c be351834 3e2af01c 3f63adad 3dfe0989 3dfe0989 -> 3e178724 bc9238c8 3c8a0560", + "3f0cc5a6 3e7a7ab0 3f804a36 3f804a36 3ed8c8fe 3edd5b5f 3e5e2a46 -> 3e2b0fca 3f307ce0 3f121986", + "3fb1c1b6 3f77b153 bd77c661 3f77b153 be087df3 3f8bf1fc 3f8bf1fc -> bf0e2241 bd8bf171 3f8be58d", + "3fb1ebaf 3f9abdf3 3e2c45c4 3ec5a0b3 3e39335b be432c62 3e4d6bb6 -> be2b96b8 bde1a7e4 bd2fbfa8", + "bec334cb 3f653f98 3f574371 3f574371 be55fd96 3f39b5f4 3e2d69de -> 3fa7756c 3f6dcc35 3f8db7de", + "3e65bc90 3e83ece0 3f9ade4a bd5eb478 3f400000 3f400000 3f400000 -> 3e790d3e 3f922e9b bd5236c0", + "3dbdad86 3f64017b be32f56e 3f8d1125 3de2d09e 3e31e9dd 3f958c7d -> 3f513a3b be254393 3f8f4438", + "3f85b870 3f7c02ea bde952a1 3f7c02ea 3f7e806d 3f4070ab 3f91c643 -> 3f7a7871 bdaccde4 3f904903", + "3f32d320 3f03a8e7 3f03a8e7 3e9962c5 3f262efe 3ed2074a 3e8ec095 -> 3ec6c92e 3e9ad5d6 3e183a69", + "3f0a61b7 3f646974 3f2f4778 3f2f4778 3ea50acb be0ee7f4 bde17715 -> 3f10be35 3e869e10 3e8c337f", + "3eac6a8b bd6cd83e 3f2a9fc1 3f2a9fc1 3f82c5c4 3e901540 3e901540 -> bd6e9280 3f0155ec 3f0155ec", + "3f3cba0d 3f9c0867 3f9c0867 3d0654a4 be466f54 be79eb82 3f142aeb -> 3e15b2e8 3dcedc90 3cb93beb", + "3f6039b9 3d92faf1 3d892dac 3d92faf1 be20ad5a 3e881b43 3e80e4cb -> ba7a8680 3cc3de06 3cca9bba", + "3d4d0c47 be31c92a be31c92a 3f9c8b6e 3f563744 3f3f3244 3f840c97 -> be305549 be2f8868 3f9ccae5", + "3f4853e3 3dea0825 3e385a85 3f755afa 3f9a6c04 3df02008 3df02008 -> 3e07eae7 3d640610 3e97bce4", + "3f5f94e9 3f1e7376 3f408934 3f1e7376 3e92bd0f 3f1352e8 3f54ba7f -> 3e6ee7e4 3ef24dad 3f070f4d", + "beaac22c 3f7612a6 3f833295 3f38ec58 3f400000 3f000000 3f400000 -> 3f854b84 3f99135c 3f48577f", + "bc04e0de 3f359dbe 3f359dbe 3f6019a3 3f000000 00000000 3f000000 -> 3f365a48 3f3716d1 3f610247", + "bec6a3cc 3e8a6dfa 3e8a6dfa 3f92f970 3d622c98 bdd04a96 bdd04a96 -> 3ebd2b9b 3ec5991d 3fd1cb8e", + "bb38bcaa 3f9585cf 3f5f71fe bcb0bbd0 3ef4cd04 3f925fd4 3f9f694c -> 3f95be1e 3f5f5ad8 bcb09c84", + "3e00f713 bda26c32 3e8230ee 3ea3a573 3f400000 3f800000 3f400000 -> bd9d4f04 3e8230ee 3e9e7e68", + "3fb94c48 3f4d2f79 3f4d2f79 3f91910a 3f73a464 3f8fb31d 3f8fb31d -> 3f3ed8c2 3f719e2a 3fab69c2", + "3f81d5c7 3ea61af6 3f8674ea 3f269d42 3f778763 3f968be6 bdca3387 -> 3ea087b0 3f9e7ae3 bd989898", + "3f83b3a4 3ea64d44 3ea64d44 3eedc0d6 be2645cd be2645cd 3e02b553 -> bd825ff0 bd825ff0 3d42cc90", + "3e15d6f2 3f988ce7 3f7aedaa 3f7aedaa 3f0ff463 3f18a24b 3f0ff463 -> 3f8ec7c9 3f6c1a4b 3f6adb9b", + "3f727f39 3f31144b 3b48733f 3f419d43 3ed76208 3f34b65c 3ed76208 -> 3e9fce55 3b109bd6 3eaeba66", + "3f12770d 3f2a331c 3f28aa5a 3f28aa5a 3e5443b3 3f137e11 3f98da50 -> 3eba0460 3eff8718 3f3b66dc", + "3fa7d9b3 3eeb262b be0693a3 3f825b5e 3f618496 3eadabb2 3eadabb2 -> 3ec66ec3 bc8fb2f4 3e0b3170", + "3eba854d 3d9007a2 3ed9465d 3d9007a2 3e039b1b 3f3422eb 3f3422eb -> 3d449b64 3ec1d18b 3d807b15", + "3faa5c42 3f93bea7 3f84bf20 3dcf45f9 3f4024dd 3f4024dd 3f1dd590 -> 3f456416 3f315a60 3d4afa43", + "bdd9a5cc 3f89bbc8 3e903846 3f89bbc8 3f9a71fe 3ebb4c56 3f9a71fe -> 3f86b59a 3e99f094 3f86b59a", + "bd6ceecd 3f33836c be7902a0 be3481b8 3e541cbb 3f7ebf6f 3e91dfca -> 3f3bbf12 be7914a9 be3bf927", + "3fa2653d 3f00056d 3f1a5a9f 3f1a5a9f 3f03071d 3f952354 3f9cebd8 -> 3e42ec94 3f3ab194 3f4699fe", + "3f6ee4a4 3f29cf0d 3db570ba 3f0a5873 3f890630 be69eef4 3f8d0065 -> 3f34fb04 bc547238 3f177578", + "3e1dd29c 3f74ec9e 3ee14335 3f067ea3 3f400872 3f9f1e2b 3ead422c -> 3f6b7df3 3ee9b3ed 3ef18f90", + "bed0a88c 3f498087 3ef20622 3f0c3a25 3e800000 3f000000 00000000 -> 3f838bb8 3f11ab9c 3f455fee", + "3fa96216 3f87d5ec 3d91eb93 3d91eb93 3f084e42 bd74f852 3f8910b1 -> 3ecf2a7c bceae6d8 3d9f9881", + "3f25bab5 3ef8badc 3f1e9fc5 3ef8badc 3f901a4d be1de8b9 3f901a4d -> 3f067e57 3e2064b8 3f067e57", + "3ea5b012 bc0e2daa bc0e2daa 3f1867f9 be29b8bb 3ec563d0 3f42b322 -> bbb115a6 bbe3d00e 3f0c98a5", + "3f6207a4 3eb19de0 3f25ea22 3ebb0dfd 3ea112ba 3ea112ba 3e9a8a32 -> 3e0c425e 3e8304b5 3e0f7f4a", + "3e34c702 be6789bf be4ad1cd 3e68a254 3e2f0d85 3f5d4104 3cc4fd7f -> be45a664 be45f5b1 3e408d67", + "3f26c225 3f9d7c37 3d12b77d 3eae36dd 3ecdbdde bd078f0b 3eb184d2 -> 3f403ea8 3c3fee14 3e4827bd", + "3f8c3443 3e05a8a0 3eeed7f2 3e05a8a0 3ecf93ad be542730 be542730 -> 3d3a71f8 be19f2dc bd2c4d38", + "3d8b29b4 3e90ddea 3f9ac557 3e90ddea 3f4adde3 3d724e79 3f20d103 -> 3e8ed2e2 3f90e050 3e8d34f2", + "3f7b81fb 3f19720c 3f97b3fc 3f97b3fc 00000000 00000000 00000000 -> 3c2c5440 3caa5f40 3caa5f40", + "3f88d41e 3da8548f 3f126a21 3da8548f 3f499b0f 3f5587b3 3f1e65c7 -> 3d8218d0 3ef0e60c 3d4773d6", + "be8aa178 3e9675ec 3ef88d7d 3ef88d7d 3e9a4442 3eeb15b6 3e9a4442 -> 3eb2ecce 3f0e79c4 3f13c983", + "3e54f4dd 3f62767f 3f62767f 3f08e1cb bdcb3c8c 3e76f426 3f837e87 -> 3f2eb159 3f3eb978 3f09a8bb", + "be17f62e 3df7bfa5 bdc081a5 3e1985c9 3dd70007 3efc4a07 3efc4a07 -> 3e0c53d1 bdceff59 3e251440", + "bdd4d132 3f9efbc3 bd5e5fbd 3eb602b2 3ec76f6f 3f689fb7 3f3cf8ef -> 3fa911a8 bd607be9 3ebaf66d", + "3fb37213 3f97adbe bbd9193c 3f97adbe 3f800000 3f800000 3f400000 -> 3f97adbe bbd9193c 3f45096a", + "bd976af9 3f78849c bdda6109 3f78849c 3f911d30 3f2b402a 3f0d6530 -> 3f760fb4 bddfb960 3f805f2e", + "3fa2f30b 3ea7f044 3f2d1d82 bd823d7d 3ec3abe4 be763428 3f23aadb -> 3d8f6784 bec882a8 bd0ce142" + ] + }, + { + "function": "cycles_mix_screen", + "node": "ShaderNodeMix RGBA SCREEN", + "cases": [ + "00000000 00000000 00000000 00000000 3ef875ba 3ef875ba 3f3a67d5 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3efd74e5 3efd74e5 3f29d701 -> 3e7d74e4 3e7d74e4 3eff6140", + "3f800000 00000000 00000000 3f000000 3ed9258b 3c61e916 be3219c6 -> 3ed9258c 3c61e900 3ed3798e", + "3fc00000 00000000 00000000 3f400000 3f28e036 3f1dea0a 3f11acc2 -> 3f7d5051 3f6cdf0f 3f76a0c9", + "bf000000 00000000 00000000 3f800000 3ec2140e 3ec2140e 3f987882 -> be421410 be421410 3f800000", + "3e800000 00000000 3e800000 00000000 be44f888 3f710e18 3f710e18 -> bd44f880 3eda6548 3e710e18", + "3f400000 00000000 3e800000 3e800000 bdee1c29 3dfee6b5 3f99df08 -> bdb29520 3ea3d872 3f6d1ae9", + "40000000 00000000 3e800000 3f000000 3f000000 3f000000 3e800000 -> 3f800000 3f800000 3f400000", + "00000000 00000000 3e800000 3f400000 3f7a4598 bc71da05 3f7a4598 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3f2aaaab 3f2aaaab 3f2aaaab -> 3eaaaaac 3f000000 3f800000", + "3f800000 00000000 3f000000 00000000 3e800000 3e800000 00000000 -> 3e800000 3f200000 00000000", + "3fc00000 00000000 3f000000 3e800000 3f9cbc17 3f9a50ce be16e386 -> 3feb1a22 3fb3bc9a 3dac8008", + "bf000000 00000000 3f000000 3f000000 3d36cffc 3f1b8774 3f1b8774 -> bcb6d000 3eb23c46 3eb23c46", + "3e800000 00000000 3f000000 3f400000 bdce857a 3f23aa40 bdce857a -> bcce8580 3f147548 3f3e62f5", + "3f400000 00000000 3f000000 3f800000 3f48a61b 3f48a61b 3efaa92f -> 3f167c94 3f4b3e4a 3f800000", + "40000000 00000000 3f400000 00000000 3f2955c9 3e4e01da 3f6d191a -> 3fa955c9 3f59c03b 3fed191a", + "00000000 00000000 3f400000 3e800000 3e88d053 3e88d053 3d4418ad -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f8b8acc 3f57b0f6 3e654e7f -> 3f0b8acc 3f5af61f 3f0e54e8", + "3f800000 00000000 3f400000 3f400000 3f800000 3f400000 3f000000 -> 3f800000 3f700000 3f600000", + "3fc00000 00000000 3f400000 3f800000 3f52252b 3f58ec5b 3f3bd962 -> 3f9d9be0 3f88ac51 3f800000", + "bf000000 00000000 3f800000 00000000 3f9d9769 3edc207a 3f9d9769 -> bf1d9768 3f800000 bf1d9768", + "3e800000 00000000 3f800000 3e800000 3d47ad07 3f646bad 3f646bad -> 3c47ad00 3f800000 3ed5a860", + "3f400000 00000000 3f800000 3f000000 3e800000 00000000 3f000000 -> 3e400000 3f800000 3f300000", + "40000000 00000000 3f800000 3f400000 3f90fa93 3f8b012f 3f8b012f -> 4010fa93 3f800000 3fa58098", + "00000000 00000000 3f800000 3f800000 3f48c76b 3e0b1437 3e1f9f8e -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3c83f0b0 3f4118ae 3f031e94 -> 3e8317a4 3ec118ae 3e831e94", + "3f800000 3e800000 00000000 3e800000 00000000 3e800000 00000000 -> 3e800000 3e800000 3e800000", + "3fc00000 3e800000 00000000 3f000000 3f50d03c 3f263a71 3f8bd863 -> 3f957522 3f7957aa 3fa8e24a", + "bf000000 3e800000 00000000 3f400000 3f9c3e9e bde94cf5 bd1c79e3 -> be54bbd8 3d694cf0 3f4138f4", + "3e800000 3e800000 00000000 3f800000 3f000000 3e800000 3f400000 -> 3eb00000 3d800000 3f800000", + "3f400000 3e800000 3e800000 00000000 3f02b59f 3f1868fc 3f9d1593 -> 3f098629 3f15bb0e 3f6ba05c", + "40000000 3e800000 3e800000 3e800000 be085c71 3f059740 3f059740 -> 3d4dd560 3f843170 3f843170", + "00000000 3e800000 3e800000 3f000000 3f855359 bde6071d 3f855359 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f5095d8 3f8e60ca 3f3c2a81 -> 3f0e3831 3f2ac898 3f578550", + "3f800000 3e800000 3e800000 3f800000 3f222e6e 3f876577 3eb714fc -> 3f39a2d2 3f858c19 3f800000", + "3fc00000 3e800000 3f000000 00000000 3da78569 3ef14c57 3f155208 -> 3eaf1d86 3f5a7ca1 3f5ffb0c", + "bf000000 3e800000 3f000000 3e800000 3e306e8f 3ebdc116 3f271bb7 -> 3e3dd688 3ed08fba 3baacd80", + "3e800000 3e800000 3f000000 3f000000 bd9fa844 3f9f3b3a bd9fa844 -> 3e710838 3f27cece 3efb02be", + "3f400000 3e800000 3f000000 3f400000 3edb7977 3eefba2b 3eefba2b -> 3efb7454 3f2cf2e8 3f567974", + "40000000 3e800000 3f000000 3f800000 3f800000 3f000000 00000000 -> 3fe00000 3f800000 3f800000", + "00000000 3e800000 3f400000 00000000 3e8a2f07 be16ef22 3f656787 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f77b844 3eae4fa1 3f9c2046 -> 3f1ce51a 3f4ae4fa 3f351834", + "3f800000 3e800000 3f400000 3f000000 3f8aec66 3f807906 3f8aec66 -> 3f88314c 3f801e42 3f857633", + "3fc00000 3e800000 3f400000 3f400000 3eec4330 3eec4330 3e9131c6 -> 3f44e5cb 3f6c4c99 3f5b3955", + "bf000000 3e800000 3f400000 3f800000 3f84c8b0 3f84c8b0 3f6500ff -> be0e5a10 3f1ecdd4 3f800000", + "3e800000 3e800000 3f800000 00000000 3ce5f230 3f4096e2 3f37e01e -> 3e82b1d6 3f800000 3e37e020", + "3f400000 3e800000 3f800000 3e800000 3f400000 3f000000 3f000000 -> 3f2c0000 3f800000 3f080000", + "40000000 3e800000 3f800000 3f000000 3f8baa24 3e8650c8 bdedfea9 -> 3ff17f36 3f800000 3ec48054", + "00000000 3e800000 3f800000 3f400000 bd9b5b1b be485794 bd9b5b1b -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3e83c14b 3eb1b969 be58664a -> 3eb1687c 3f800000 3f800000", + "3f800000 3f000000 00000000 00000000 3f6b03fb 3ea35334 3ea35334 -> 3f7581fe 3ea35334 3ea35334", + "3fc00000 3f000000 00000000 3e800000 3e571470 3f2b1409 3f0dcced -> 3f2853d5 3f804f07 3f5f868b", + "bf000000 3f000000 00000000 3f000000 3f3ba4d1 bc86ca6e 3f3ba4d1 -> 3ea22d98 3c06ca80 3ea22d98", + "3e800000 3f000000 00000000 3f400000 3f3446ef 3f929565 3f891215 -> 3f1688de 3e929564 3f512242", + "3f400000 3f000000 00000000 3f800000 be6d7020 3dbbe908 3eefcac5 -> 3ed37afa 3d8ceec8 3f800000", + "40000000 3f000000 3e800000 00000000 3e4eccee 3ef6996e 3e8c9bbf -> 3f33b33c 3f78f312 3f0c9bc0", + "00000000 3f000000 3e800000 3e800000 3f709497 3f83221c 3e5b38b6 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 be3030e5 be381073 3e5b77ae -> 3ee9f9e4 3e3af9d8 3f0db77b", + "3f800000 3f000000 3e800000 3f400000 3f84df9e 3f9a1a87 3f4b5d69 -> 3f826fcf 3f9393e5 3f72d75a", + "3fc00000 3f000000 3e800000 3f800000 3f9d18a1 3d982126 3d982126 -> 3fb5d279 3eaac954 3f800000", + "bf000000 3f000000 3f000000 00000000 3ee8cbed 3f2c71d9 3f2c71d9 -> 3ec5cd04 3ea9c714 beac71d8", + "3e800000 3f000000 3f000000 3e800000 3f45ee65 3edae0fc 3edae0fc -> 3f18bdcc 3f0dae10 3ea90a30", + "3f400000 3f000000 3f000000 3f000000 3f400000 3f800000 3f000000 -> 3f480000 3f600000 3f300000", + "40000000 3f000000 3f000000 3f400000 3f800000 3e800000 3f800000 -> 3fc00000 3f400000 3fa00000", + "00000000 3f000000 3f000000 3f800000 3f6e8879 3f00d053 3f59b325 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f347719 3f66c900 3f66c900 -> 3f2d1dc6 3f5cd920 3ee6c900", + "3f800000 3f000000 3f400000 3e800000 00000000 3f800000 3e800000 -> 3f000000 3f800000 3ee00000", + "3fc00000 3f000000 3f400000 3f000000 3db855ca 3db855ca 3f095c6e -> 3f11480b 3f48a406 3f670552", + "bf000000 3f000000 3f400000 3f400000 be6a84dd bddc622a 3f749e73 -> 3f0ea84e 3f437189 3f216c32", + "3e800000 3f000000 3f400000 3f800000 3f1846e7 3f6d4e5f bddd1ec6 -> 3f1308dd 3f4ed4e6 3f800000", + "3f400000 3f000000 3f800000 00000000 3ee49d8f 3f9a9b0a 3f2bc258 -> 3f2add8b 3f800000 3f00d1c2", + "40000000 3f000000 3f800000 3e800000 3f9988d3 3f03b6bb be6d7fe3 -> 3fd988d3 3f800000 bdc87fa0", + "00000000 3f000000 3f800000 3f000000 3e11ec00 3f4ee500 3e11ec00 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3f985cb6 be0f8552 bde24046 -> 3f4c2e5b 3f800000 3f3c76ff", + "3f800000 3f000000 3f800000 3f800000 bd833701 3efd282b bd833701 -> 3eef9920 3f800000 3f800000", + "3fc00000 3f400000 00000000 00000000 3f383894 3f383894 3e82a997 -> 3f828a9c 3f8a2a6f 3ec3fe64", + "bf000000 3f400000 00000000 3e800000 3f495b47 3db254f9 3dde7577 -> 3f26d497 bd325500 3e5649f8", + "3e800000 3f400000 00000000 3f000000 3ee06536 3e5aed4b 3e20c4d0 -> 3f47032a 3d5aed50 3f050626", + "3f400000 3f400000 00000000 3f400000 3e8337b3 3d647942 3e4e707c -> 3f4c4d39 3d2b5af0 3f49ad46", + "40000000 3f400000 00000000 3f800000 3f800000 3f400000 3e800000 -> 3fa00000 3fc00000 3f800000", + "00000000 3f400000 3e800000 00000000 3f113d2e 3f718b80 3f718b80 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f800000 3f400000 3f800000 -> 3f600000 3f080000 3f200000", + "3f800000 3f400000 3e800000 3f000000 bd917d74 bd917d74 3ca4667c -> 3f3b7414 3e4970f8 3f02919a", + "3fc00000 3f400000 3e800000 3f400000 3e62bf13 3f3af87f 3f0d08d4 -> 3f5541ea 3f892bc7 3f74e350", + "bf000000 3f400000 3e800000 3f800000 00000000 3e800000 3f000000 -> 3f400000 3e200000 3f800000", + "3e800000 3f400000 3f000000 00000000 3f6acd09 3f745ce5 3f745ce5 -> 3f4eacd0 3f1e8b9c 3e745ce4", + "3f400000 3f400000 3f000000 3e800000 bda6ebd7 3f34aeaf 3e8288eb -> 3f3c1679 3f43c182 3ec96d04", + "40000000 3f400000 3f000000 3f000000 3e9a8205 3e1b3fea 3e5b89c7 -> 3f66a081 3f26cffa 3f36e272", + "00000000 3f400000 3f000000 3f400000 3f4e468d 3f8ed855 3d8bde2d -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f400000 3f400000 3f400000 -> 3f580000 3f300000 3f800000", + "3f800000 3f400000 3f400000 00000000 3f30634f 3e9d7991 3e505f41 -> 3f6c18d4 3f53af32 3e505f40", + "3fc00000 3f400000 3f400000 3e800000 3f000000 3f800000 3e800000 -> 3f700000 3f900000 3f080000", + "bf000000 3f400000 3f400000 3f000000 3e331779 bdc4734d 3e331779 -> 3f3a6744 3f4311cd 3ee99d10", + "3e800000 3f400000 3f400000 3f400000 3f8a1224 3ee38659 3ec1fabe -> 3f514244 3f471c33 3f460fd6", + "3f400000 3f400000 3f400000 3f800000 3ee5fd60 3e95cf25 3ee5fd60 -> 3f558fc1 3f4e0b6c 3f800000", + "40000000 3f400000 3f800000 00000000 be638a42 3dca2c91 3eaa05b3 -> 3f238eb8 3f800000 3f2a05b4", + "00000000 3f400000 3f800000 3e800000 3ec8c9f5 3ec8c9f5 be7b14db -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3eb28652 3e78297e 3f671a0b -> 3f4b2865 3f800000 3f39c683", + "3f800000 3f400000 3f800000 3f400000 3f343e22 3f343e22 3ee17143 -> 3f6d0f88 3f800000 3f5c2e28", + "3fc00000 3f400000 3f800000 3f800000 be349c67 3f379cc9 3f5a2b12 -> 3f2f1156 3f800000 3f800000", + "bf000000 3f800000 00000000 00000000 3d6a91cb 3d6a91cb 3f08bff3 -> 3f800000 bcea91c0 be88bff4", + "3e800000 3f800000 00000000 3e800000 3ed7c526 3ed7c526 3f9d1fc8 -> 3f800000 3dd7c528 3ef5d7d6", + "3f400000 3f800000 00000000 3f000000 be5c9d02 3e301694 be5c9d02 -> 3f800000 3e0410f0 3ed6a290", + "40000000 3f800000 00000000 3f400000 3e800000 3f800000 3f800000 -> 3f800000 40000000 3fa00000", + "00000000 3f800000 00000000 3f800000 3edd0e41 3edd0e41 3d18cd7e -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3e99a385 3f7cb58e 3f1ea123 -> 3f800000 3f1ec415 3e9ea124", + "3f800000 3f800000 3e800000 3e800000 3e9d8e56 3f929196 3f95061a -> 3f800000 3f8ded30 3f8fc494", + "3fc00000 3f800000 3e800000 3f000000 3f944b98 3f944b98 3e1da4ff -> 3f800000 3fc6d50b 3f1d8ef0", + "bf000000 3f800000 3e800000 3f400000 3f05719e 3d8fd713 3f8e8fa2 -> 3f800000 3e6507b0 3f1c5c18", + "3e800000 3f800000 3e800000 3f800000 bd1da11a 3ea48d63 3f7c69cd -> 3f800000 3e9eda82 3f800000", + "3f400000 3f800000 3f000000 00000000 3f061944 3ee2c5d1 3f061944 -> 3f800000 3f2a8517 3ec925e6", + "40000000 3f800000 3f000000 3e800000 3f400000 3f800000 00000000 -> 3f800000 3fc00000 3e800000", + "00000000 3f800000 3f000000 3f000000 3e800000 3f000000 3f400000 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f8e2fac 3f1f2061 3f8e2fac -> 3f800000 3f27c818 3f638beb", + "3f800000 3f800000 3f000000 3f800000 3f1c7039 3ed76c4e 3f8431d3 -> 3f800000 3f35db14 3f800000", + "3fc00000 3f800000 3f400000 00000000 3e800000 00000000 3e800000 -> 3f800000 3f400000 3ec00000", + "bf000000 3f800000 3f400000 3e800000 3ed1d7f2 3e025514 3f809dd8 -> 3f800000 3f3bed58 be01d988", + "3e800000 3f800000 3f400000 3f000000 be273231 3f2db27e 3f55d605 -> 3f800000 3f4adb28 3f1abac0", + "3f400000 3f800000 3f400000 3f400000 3e68510d 3eae4979 3e68510d -> 3f800000 3f5056e3 3f4ae3cc", + "40000000 3f800000 3f400000 3f800000 3ea1b824 bdf92388 bdf92388 -> 3f800000 3f306dc8 3f800000", + "00000000 3f800000 3f800000 00000000 3ef72384 3f3c7d4c 3f810c91 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f84d556 bdbd72b5 3f8a56dc -> 3f800000 3f800000 3f27c125", + "3f800000 3f800000 3f800000 3f000000 3d134cff 3f2d1b7c 3f902199 -> 3f800000 3f800000 3f8810cc", + "3fc00000 3f800000 3f800000 3f400000 3e964c87 3e964c87 3f338a10 -> 3f800000 3f800000 3f81a9e3", + "bf000000 3f800000 3f800000 3f800000 3f80dd67 3ea7663d 3ed7ac05 -> 3f800000 3f800000 3f800000", + "3e800000 00000000 00000000 00000000 3f400000 3f800000 3f400000 -> 3e400000 3e800000 3e400000", + "3f400000 3e800000 3e800000 3e800000 3ea8925c be4ef903 3ea8925c -> 3eded254 3e0b93f0 3eded254", + "40000000 3f000000 3f000000 3f000000 3f8a4a67 bcd1495b 3f8a4a67 -> 3fca4a67 3ef2eb6c 3fca4a67", + "00000000 3f400000 3f400000 3f400000 3f8fad72 3e8bbf9c 3f29b4e8 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f10ee38 3f62911f 3f62911f -> 3f800000 3f800000 3f800000", + "3f800000 3fa00000 3fa00000 3fa00000 3f131fd0 3f28c36a 3f4f9e59 -> 3f8d9c06 3f8ae793 3f860c35", + "3fc00000 be800000 be800000 be800000 3f933bc9 3f5076e8 3f933bc9 -> 3ff41019 3fa36f7a 3ff41019", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3e6ce518 3e6ce518 3f82291f -> bb867d00 bb867d00 beb716d0", + "3e800000 3f666666 3f666666 3f666666 3ecb543c 3f79759f 3f79759f -> 3f68f10d 3f6ca2f0 3f6ca2f0", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3e3ceb13 3e010def 3e9d1c9a -> 3ed9e570 3ecaee26 3ef938f8", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f400000 00000000 3e800000 -> 3f955555 3f2aaaab 3f555556", + "00000000 3f010755 3f010755 3ed9776d 3d970a36 3d970a36 3e4dee10 -> 3f010755 3f010755 3ed9776c", + "3f000000 bda6bd01 3f5e9e32 be143006 be700f89 be700f89 3f3c2df1 -> be552bf8 3f5ab47b 3e8d5164", + "3f800000 be727704 3f54e168 3f88f910 3e7d7bb8 3f9ee3aa 3da48708 -> 3d8e13d8 3f8533ef 3f884087", + "3fc00000 3f6f1122 3e1f88a2 3db78c61 3eded606 3eb70740 3ed10c20 -> 3f7a1f1b 3f1bc4bf 3f25ad6d", + "bf000000 3c6e5988 3d4d6a1c 3f51b8c0 3f6f92e8 3f0e95b1 3f6f92e8 -> bee4a3e4 be5b83b8 3f3c1136", + "3e800000 3f1e29d0 3f21d28c 3f21d28c 3ec99a3b 3dd7e5d4 3f940951 -> 3f27cb54 3f244df2 3f3d0d66", + "3f400000 be7c2c5f 3ef6877d 3f28853e 3f6dfdfe be1bc816 3f7a2af4 -> 3f1f6844 3ed83d56 3f68a2a9", + "40000000 3f44a37b 3f07a4f0 3f13996f 3f4e5d7d 3ef8ba7c 3ef8ba7c -> 3f922bde 3f7c94d4 3f7cebc2", + "00000000 3f776fe5 3f955bce 3c30f396 3e54ac86 3f99d9f3 3f99d9f3 -> 3f776fe5 3f955bce 3c30f380", + "3f000000 3f9aa8a0 3f9aa8a0 3f8cc2bf 3f800000 3f000000 3f400000 -> 3f8d5450 3f93fe78 3f87f9b7", + "3f800000 3ee5be84 3e918393 be63a6bc 00000000 3f800000 00000000 -> 3ee5be84 3f800000 be63a6c0", + "3fc00000 3f727cfe 3ea7e6c5 3cf35baa 3e180445 3eb2ace3 3e180445 -> 3f757f3f 3f2e031c 3e7babc0", + "bf000000 be7df3db 3f3df7e8 3e795d3a 3ec500f7 3f7effd2 3f7886e3 -> bef9e81c 3f1d14e6 bdfd4b70", + "3e800000 3e3b48af 3eb470e3 3e3b48af 3f0199aa 3f0199aa 3f24b113 -> 3e92972a 3ede676c 3ea0ed5e", + "3f400000 3eb9da36 3f8c02c2 3eb9da36 3f97e134 be5ac225 3f97e134 -> 3f6e0c82 3f8def68 3f6e0c82", + "40000000 3f11d906 3eca02e3 3f20f4ef 3f942eb3 3f7e29db 3e649257 -> 3fc871c4 3fcc62a2 3f4b6307", + "00000000 bb5d14a9 3f25101d bb5d14a9 3e1f4831 3e33a44a 3e33a44a -> bb5d1400 3f25101d bb5d1400", + "3f000000 bdc687f6 3f81235c 3e0e220d 3e9fe4c1 3e90c296 3e9fe4c1 -> 3d984188 3f80fa2c 3e8beaa2", + "3f800000 3f7761a5 3f0dcadb 3f0dcadb 3ef1fbb7 3f087992 3ef1fbb7 -> 3f7b746c 3f4aad53 3f43c505", + "3fc00000 3f883ce8 be286779 be286779 bcd8777b 3f00149c 3f00149c -> 3f88907f 3f359d88 3f359d88", + "bf000000 3f45236c 3f404e2f 3ec297cd 3f9e3759 bce95686 3f9e3759 -> 3f20c28f 3f413668 bb499200", + "3e800000 3f15df55 3f392f71 3f15df55 3f000000 3e800000 3f800000 -> 3f23236a 3f3d9c7a 3f306780", + "3f400000 3f41fca8 3f6b4caa 3f81b58a 3f000000 3f400000 3f000000 -> 3f593de9 3f76f18a 3f811176", + "40000000 3f4e3518 3e4b7738 3f4e3518 3e800000 3e800000 3e800000 -> 3f671a8c 3f196ee7 3f671a8c", + "00000000 3f0da55c be479071 3d95afbf 3f400000 3f400000 3e800000 -> 3f0da55c be479070 3d95afc0", + "3f000000 be41a6ff bdd9d222 3f2e8858 3f8d3567 3f8d3567 3eb698ac -> 3eeefffe 3f00ffe8 3f3d0f42", + "3f800000 3cf44f58 3cf44f58 3f801af3 be24126e 3f2df649 3e378636 -> be00a3e0 3f30689e 3f80161f", + "3fc00000 3e0d5ac0 3f006ab8 3f2ae428 bd0359c1 be475f9e be475f9e -> 3dc5cb80 3eb64fea 3f1208fe", + "bf000000 3e84e404 3e84e404 3f89ef90 3f69d55a bacefef2 3f595dc2 -> bda100c0 3e8530a6 3f8e276a", + "3e800000 3f5802b4 3f5802b4 3d9b47c3 3f9db6f0 3ef50e17 3eee0b7f -> 3f64542a 3f5ccba8 3e3ba364", + "3f400000 3ef379b8 bc03a4eb bc03a4eb 3f162e28 be2b4d4c be2b4d4c -> 3f34cf85 be09bc98 be09bc98", + "40000000 be696009 3edde9ba 3f96683a 3f400000 00000000 3f800000 -> 3fce9600 3edde9ba 3f532f8c", + "00000000 3e2f34cb be777c94 3f2ecc74 3e2deb15 3f4ba8f5 3e2deb15 -> 3e2f34cc be777c90 3f2ecc74", + "3f000000 be63d3cf 3ecbad73 3ecbad73 3edcb568 3f9f021a bdc81ba8 -> 3d27f1e0 3f4597a0 3ebc9d58", + "3f800000 3f5a927f 3e3ff807 3f5a927f 3f8ee305 3f7eb8a5 3ebc5148 -> 3f822d2e 3f7ef604 3f6856a6", + "3fc00000 be123e5a 3eb88861 be123e5a be16eb8c be15e625 be16eb8c -> beca7a2c 3e614178 beca7a2c", + "bf000000 be19d56e 3f628c9c 3f628c9c 3e4d6eed 3f48b879 3e98f612 -> be87fd9c 3f5700ec 3f5e2668", + "3e800000 3e7e004d 3f9f36ea 3f3c4628 bd4dd770 bdc6e1ce 3eec50a5 -> 3e7453c4 3f9ff8ea 3f4416bd", + "3f400000 3edaba5a 3edaba5a 3f6c9cb5 bdb44117 bdb44117 be74b22e -> 3ec75e66 3ec75e66 3f69232f", + "40000000 3f7efaad 3eb06fcc 3f023241 3e3231a8 3f09ce70 3f4363b9 -> 3f7f55a0 3f866d55 3fa11dda", + "00000000 bcc75dbe 3f61f2bd 3e899768 3f8ee055 3f1907d3 3ef23312 -> bcc75dc0 3f61f2bd 3e899768", + "3f000000 3f8aa36d 3f4cc30c 3e91bc96 bdbc5571 3eba83f0 3f481a7c -> 3f8b20a6 3f561838 3f1070ef", + "3f800000 be785ddf 3f61396e be785ddf 3f9d912d 3f9d912d 3dbfe79e -> 3fa4bd0c 3f838df2 be012438", + "3fc00000 3f64c4d0 3f64c4d0 3f5d142c 3f8519ca 3eb5823b 3ecdcc95 -> 3f879f25 3f733fd7 3f72223d", + "bf000000 3e5fa8db 3d2b4bbd be7b0a82 3f98859d be376b85 3f8e6ad1 -> be7d2c98 3e02b2dc bf701794", + "3e800000 be3ba9ca 3f8c7330 be3ba9ca 3ddd9334 3f1c91d3 bdaf73b7 -> be1ae3f0 3f8a8bde be559d30", + "3f400000 3f3ea59d 3f3ea59d bd03ddd1 3f58a7a9 3f58a7a9 bde6c6f8 -> 3f6820ea 3f6820ea bdf496b0", + "40000000 3ea752c1 3f9536b2 3e1d7b9b 3f800000 3f800000 3f800000 -> 3fd62b50 3f55929c 3fec508c", + "00000000 3f0da4dd 3f61c5d1 3f0da4dd 3f800000 3e800000 3f400000 -> 3f0da4dd 3f61c5d1 3f0da4dd", + "3f000000 3f60518a 3f60518a 3dbbf57e 3e9a57b6 3e9a57b6 3ed6811f -> 3f6517fe 3f6517fe 3e906610", + "3f800000 3eca8eca be3aaad8 3ef7485f be7edcb0 3f3d5bb4 3f9649ec -> 3e7b1508 3f3135be 3f8b861c", + "3fc00000 395bbe42 3f22310c 3f22310c 3e655c46 bb770c4b 3f195ce9 -> 3eac1776 3f21a942 3f767d26", + "bf000000 bc3b897e 3f2b2c4d 3f2b2c4d 3f8552ab 3f8552ab bbdeb83d -> bf09c77e 3efdfdd8 3f2b761a", + "3e800000 3f62bce8 be429947 be429947 3f795c07 3f27e6c3 3f58c544 -> 3f69dd1a 3ba6bb00 3d7d7740", + "3f400000 3eea6a70 3f84d259 3eea6a70 be302fe9 be302fe9 3f5fd590 -> 3ec6986a 3f8571a2 3f50390a", + "40000000 3eec1e63 3c6394fc 3f8f0d14 be29a94f be29a94f 3f51a674 -> 3e90b330 bea03158 3f6ccc4e", + "00000000 be23f346 3e309d29 be23f346 3f603677 3f107660 3f603677 -> be23f348 3e309d28 be23f348", + "3f000000 3e72a272 3e72a272 3f0a911e bd6a1ee8 3f4e4d65 3f972507 -> 3e5c4dc0 3f0b5e4c 3f4fe682", + "3f800000 3edb7ff7 bd8dc6be bd8dc6be 3f7746a3 3f1a07c6 3f866879 -> 3f7b041a 3f12f8aa 3f86da0a", + "3fc00000 3f966785 3f942fce bd8270f3 3e5356f8 3ec54c99 3ec54c99 -> 3f8f77eb 3f8884af 3f0d1812", + "bf000000 be79695f 3f4d3a92 3f7c9831 3f8bc127 3f37e43f be1e6767 -> bf6c259a 3f3afe5f 3f7cdb9f", + "3e800000 3f0e3da3 3f0e3da3 3d01e70b 3d1e9ddd bd58019f 3e7a536c -> 3f0f5794 3f0cbdb0 3dba2510", + "3f400000 3e969b6a 3f4679e3 3f534c5e 3d1811de 3f518ceb 3f1fd538 -> 3ea0ab84 3f69ca81 3f683af8", + "40000000 3ef1ee0d 3f578e20 bdf44c38 3ef2d66d 3f990cdd bce3645f -> 3f790e9d 3f9c233e be39c728", + "00000000 3f96218f 3f9d6ce8 be40ace8 3f79b2ca 3ef4a79a 3ef4a79a -> 3f96218f 3f9d6ce8 be40ace8", + "3f000000 3e536817 3f9b1c2a bdfd6a9b 3f85f2e7 3f85f2e7 3f54d829 -> 3f1f2582 3f8ceccf 3eafd3c8", + "3f800000 3f433eda 3f6a7847 3f6a7847 be5ee3ea be5ee3ea 3dfb7b18 -> 3f360574 3f65c890 3f6d1d15", + "3fc00000 3f924fbd 3f924fbd be0e7438 3f6433f5 3f6433f5 be5c8897 -> 3f73a747 3f73a747 bf01d184", + "bf000000 3e9d3540 3f9c303d 3e69e436 3f2d9464 3f5713f5 3f2d9464 -> 3d93b3a8 3fa80798 bd07e4a0", + "3e800000 3e6a362c 3efa0e62 3e6a362c 3f53779d 3f2242ff 3b9a8433 -> 3ec6a7e2 3f11c820 3e6b2484", + "3f400000 3e3de95d bba19fba 3bfc503e 3f8c5b85 3f576001 3eae2432 -> 3f5af7ce 3f2110b8 3e858af2", + "40000000 3d2458de be44a8b0 3f6f0dbf 3e9a602a 3e9a602a 3f2bb647 -> 3f1e7405 3f06dbd4 3f82e4c2", + "00000000 be073578 3e50c76c be073578 be483743 3d53bf9e 3f83e566 -> be073578 3e50c76c be073578", + "3f000000 be27274f 3f9b7bd0 3f9b7bd0 3dd75a28 3dce9026 3dab7b57 -> bdd10df0 3f9a18fe 3f9a5541", + "3f800000 3e7f78c2 be079555 3f5f8adf 3e49351c 3f77e262 3ddec9a6 -> 3ecb3d94 3f76cf4b 3f6312c4", + "3fc00000 3f2151e3 bb092239 3f2151e3 be79dca0 3f40a06d 3f40a06d -> 3efd5510 3f908124 3f861762", + "bf000000 3f31371b be69fa41 3f8e47f8 3f4fb989 3f35221b 3f4fb989 -> 3f114056 bf29c142 3f94133e", + "3e800000 3f87732f be418c42 3f87732f 3f400000 3f800000 3e800000 -> 3f860d96 3dddada0 3f86fbfc", + "3f400000 3eed795f 3dbfaae2 be7ce77c bdded04b bdded04b 3da643e6 -> 3ed712dc 3ca0c940 be2f27e8", + "40000000 3f884fe7 3e02b10d 3f884fe7 3f800000 3f800000 00000000 -> 3f6f6032 3fefa9de 3f884fe7", + "00000000 3f62060e 3f04998d 3f04998d 3ef9afc0 be4d634a 3ef9afc0 -> 3f62060e 3f04998d 3f04998d", + "3f000000 3f54690e 3ee5ec56 3ee5ec56 3f000000 3f800000 3f800000 -> 3f5f4eca 3f397b16 3f397b16", + "3f800000 3f8ad528 3f56ccf8 3f56ccf8 00000000 00000000 3f800000 -> 3f8ad528 3f56ccf8 3f800000", + "3fc00000 3ee9422f 3efb58f9 3ec63762 3f220184 3f020483 3f07cf4b -> 3f78ed6b 3f60f58b 3f5ff4d9", + "bf000000 3e534e3e 3f240f11 3f33c4d1 3f8fcac9 3d8fe00d 3d8fe00d -> be752cc8 3f20d450 3f311755", + "3e800000 3f006020 3f9aef5a 3f26421a be7a9e73 be7a9e73 3eb72c91 -> 3ef1221c 3f9c9541 3f2e48e6", + "3f400000 3d70fbe3 bd68cd47 bd68cd47 3f91f0e7 3f66cf79 3f91f0e7 -> 3f5d17f6 3f286584 3f58cdb6", + "40000000 3edfdb15 3f5e889d 3f802b92 3f486576 3f486576 bd247bfd -> 3fa8be4b 3f8976d7 3f802f12", + "00000000 3f88b139 3f88b139 3ee293fc 3f000000 00000000 00000000 -> 3f88b139 3f88b139 3ee293fc", + "3f000000 bdbbde5f 3e05d687 3f8f2346 3e476e89 3e476e89 3f994c28 -> 3c6edc40 3e5c855c 3f8612b0", + "3f800000 3f830785 3f817e7d 3eaa0efb 3e800000 3e800000 3f000000 -> 3f8245a4 3f811ede 3f2a83bf", + "3fc00000 3f973ac8 3e42e7d4 be4056c6 3f95fe66 3f95fe66 3f213540 -> 3f5ccbc8 3fce8798 3f6f25a6", + "bf000000 3f905a81 be4593ad 3f9f4275 3f3c5b60 3f3c5b60 3f815c29 -> 3f965ea8 bf21be7c 3faf0e33", + "3e800000 3f65a282 3ec613c8 3f65a282 3f8efb4d 3f3ca495 3f8bcf0a -> 3f6cff61 3effe89a 3f6cd58d", + "3f400000 3da89cbd 3ea0cbb5 3ea0cbb5 bd994a59 3f996a12 3f5aa1cf -> 3cfc7080 3f6e3fae 3f40e00c", + "40000000 3f65cb9e 3f65cb9e 3f6bc1f4 3f400000 3e800000 3f800000 -> 3f868d18 3f72e5cf 3f8a1f06", + "00000000 3d037ed4 3e945cc7 3e199255 00000000 3f000000 00000000 -> 3d037ed0 3e945cc8 3e199254", + "3f000000 3edee077 3edee077 bd8bf643 3f8556a5 3d95af5d 3e09ab66 -> 3f3abbda 3ee9714e 3b63b700", + "3f800000 3f9a5f61 3f3cb8d4 3f3cb8d4 3f43baf1 3ebaed24 3e65f70f -> 3f863578 3f5548d8 3f4bd4ba", + "3fc00000 bac968f6 3f966927 be727cc8 3f860736 3f15f55a 3f7a41eb -> 3fc9278c 3f82b822 3fc9d426", + "bf000000 3edc8b45 3ebd425d 3e2a041c be5d3643 3f84f222 be5d3643 -> 3efc0676 3d2d3a90 3e832104", + "3e800000 3f9d8358 3eac01e9 3eac01e9 bd9a9dd6 3edb9e3d bcda96c3 -> 3f9e11f2 3ed0777a 3ea9bd4a", + "3f400000 3dc142a0 3f9e6ca2 3f9e6ca2 3f400000 3e800000 3e800000 -> 3f1a91a5 3f98b844 3f98b844", + "40000000 bc8003a5 3d7f0b8c bc8003a5 3e762293 3f7830a1 3f7830a1 -> 3ef1fb00 3ff0b4c3 3ffa1172", + "00000000 3f9e542e 3f8cac63 be475d84 3f390b60 3f105b77 3f7edb3a -> 3f9e542e 3f8cac63 be475d80", + "3f000000 3f6da927 be11d41a 3f8b5ec8 be726f25 be726f25 3f14f916 -> 3f6b7d65 be8e2770 3f880fda", + "3f800000 3f22dd1a 3ebf2b3e 3f8c45d7 3f000000 3f400000 3f800000 -> 3f516e8d 3f57e568 3f800000", + "3fc00000 3ed87328 3f34a779 3ed87328 00000000 00000000 3e800000 -> 3ed87328 3f34a779 3f23a3fc", + "bf000000 3f450804 3e924d06 3e924d06 3ef8ef66 be5fb9fa be5fb9fa -> 3f36b22c 3eba4018 3eba4018", + "3e800000 3f950d61 3f96e7fb 3d8cc997 3f8afc6e 3e003c00 3e003c00 -> 3f8f5665 3f963065 3dc87f38", + "3f400000 bd2ec6ff 3e6848b4 bd2ec6ff be0f780e 3e79b7e6 be6febf2 -> be1be338 3ebc8b4c be675048", + "40000000 3f579d85 3f0ab716 3e39b955 3f438dc6 3e7eddba 3c8dc268 -> 3f8aa824 3f45190c 3e56bc6c", + "00000000 bde95b75 3e8e6171 bde95b75 3efde108 3ed21a6d 3f4bbbe2 -> bde95b70 3e8e6170 bde95b70", + "3f000000 3f66351c 3f4b707c 3f66351c 3e06b797 ba6367f5 ba6367f5 -> 3f67e772 3f4b6aa6 3f66323f", + "3f800000 3f65d500 3eb00f8d 3f6f239f 3e44b227 3f907fef 3f907fef -> 3f6adbc8 3f8ad375 3f811633", + "3fc00000 3e0ff892 3f612fa3 3e8ba745 3e800000 3f800000 00000000 -> 3eecfdac 3f87b417 3e8ba744", + "bf000000 3f56ac36 3f6f7772 3f6f7772 3f8d6e72 be3311ca 3f86aac3 -> 3f3fd73c 3f70e986 3f66c4f0", + "3e800000 3f80cf8c 3f80cf8c 3f737d37 3e800000 3f400000 3f000000 -> 3f80c293 3f80a8a2 3f750d90", + "3f400000 3f0d5b60 3e0dd954 3cf7ba2d 3f76c51a 3f9a5b90 3f9a5b90 -> 3f603d38 3f6aece0 3f6846ba", + "40000000 3e862398 be370d82 3e9384fa be780efd 3ea217c4 be780efd -> bdc3b8f0 3f114e46 bd688a60", + "00000000 3ecdd825 3ee7ecb1 3f98d0da be42d87d be42d87d 3eb437d5 -> 3ecdd824 3ee7ecb0 3f98d0da", + "3f000000 3f4252b7 3f4252b7 3f96321e be800000 be800000 be800000 -> 3f3a9d0e 3f3a9d0e 3f98f862", + "3f800000 3f80a29e 3f940358 3f2a6330 3d9168b1 3dcc600d be409032 -> 3f809712 3f920412 3f1a49bb", + "3fc00000 3e7ed643 be0342ed 3f18eae9 3f8a5a92 bdc44c1d 3f228fc9 -> 3fbbbd04 be94ad9c 3f7b1ac7", + "bf000000 3b689357 be36a4e6 3d5f9e4d 3f000000 3f800000 3f400000 -> be7b7520 bf447dd8 be9990cc", + "3e800000 be095188 be095188 3f3d8b09 3e97c6b8 3d82b9dc 3d82b9dc -> bd4d03e0 bded92a0 3f3e9a86", + "3f400000 3f8a2447 3f7cb4b5 3ef9efc0 3f645d02 bdfba35c bdfba35c -> 3f835b48 3f7c66ff 3ee1c964", + "40000000 3eddbef0 3eddbef0 3f1d0f89 3f9b01ed 3f7259f7 3f9b01ed -> 3fe72f50 3fc0d37d 3fc65872", + "00000000 3ef401e2 3db2709e 3e141835 3d6587a4 bd1e2876 be6ef65f -> 3ef401e2 3db270a0 3e141834", + "3f000000 bdb0a042 3db89ece 3db89ece bceea9f3 3e08f091 3e08f091 -> bdd10830 3e1a9b94 3e1a9b94", + "3f800000 3f8d0f8f 3e482978 3f8d0f8f 3e5d6a6c 3e86670e 3e5d6a6c -> 3f8a3c98 3ed03638 3f8a3c98", + "3fc00000 3f9f5225 3ee61142 3ee61142 3f9abbdc 3eeb8937 3ea825cb -> 3f4d0de5 3f544e9c 3f3879fe", + "bf000000 3f29c372 be229b67 3f1d605f 3f5053c3 3f11dbc8 3f7092d2 -> 3f06acbc befa52e4 3ede1288", + "3e800000 3e97c818 3f4219e6 3f953f73 3e0fa684 3f46b2ab 3f4d8b3f -> 3ea46a30 3f4e1cb1 3f90fb9c", + "3f400000 3f9b9c24 3f30afc0 3f30afc0 3f400000 3e800000 3f000000 -> 3f8c1450 3f3f8ecc 3f4e6dd8", + "40000000 3f6b5558 3f27f41f 3f1037e3 3f92e348 3f2d2ae8 3f92e348 -> 3f8d6206 3f8f88d8 3fc862ae", + "00000000 3e9048b5 3e9048b5 3f19d890 3f69ccd1 3f8c4080 3f44178e -> 3e9048b4 3e9048b4 3f19d890", + "3f000000 3f6435fe 3f28d868 3f28d868 3ec0248f 3f6f38d7 3ec0248f -> 3f696cdc 3f519110 3f3932f1", + "3f800000 3f89f5dc bda35175 3f89f5dc 3f136a0d 3e7eabfc 3ec44cef -> 3f84398e 3e415254 3f86243f", + "3fc00000 3ee08ac5 3f625231 3f1b4a37 3d6ee67a 3ec0e446 3ec29cae -> 3ef9b0f0 3f7317cf 3f54b5c3", + "bf000000 3f2bb909 3f8bf834 3f53832e 3f5d92b4 3d101637 be55c2aa -> 3f074042 3f8c2e19 3f5827e4", + "3e800000 3dc60834 3f5e3566 3f806c3b 3f42ba71 3ea0ef99 3f42ba71 -> 3e89751e 3f60dd2e 3f8057a6", + "3f400000 3f67de89 3ebe3ae4 3f531915 be765d0e be765d0e 3f6c1796 -> 3f6383dc 3e842b50 3f7227d8", + "40000000 bd40248b bd40248b bda37dd8 3e51622c bb419166 bb419166 -> 3ec33014 bd597960 bdb08e40", + "00000000 3ef97539 3f6bab11 3f6bab11 3f112094 3f861856 3eb7ae62 -> 3ef97538 3f6bab11 3f6bab11", + "3f000000 be1e6037 be0c101f bcfb5d80 3ea6f01e 3f7b4f7f 3f6e4329 -> 3d098690 3ed7a744 3ee5dce6", + "3f800000 be3ceb63 3d366d74 be3ceb63 be30542e 3f82aa1c 3f4f16e1 -> bec6e3c8 3f828bbb 3f4610d6", + "3fc00000 3f80b3c1 3f3847a9 be3662ca 3f000000 3e800000 00000000 -> 3f802cf0 3f532cca be3662c8", + "bf000000 3f88dde0 3e566155 3e566155 3e02886a 3f88d332 3eb4e67b -> 3f896e8d be5a56e0 3d8eb460", + "3e800000 3ec190ea 3f6e5556 3ec190ea 3f86aa3f 3f4ff9bd 3f86aa3f -> 3f0aa8f0 3f71ebe5 3f0aa8f0", + "3f400000 3f56a7e0 3f56a7e0 3f00b1c7 3f4a016a 3d99a838 3f4a016a -> 3f6f1fb3 3f58fb74 3f4c0919", + "40000000 3f00b728 3f00b728 3f8c7f3d 3f000000 00000000 3f800000 -> 3f800000 3f00b728 3f670186", + "00000000 3f45c549 3f45c549 3edb1e95 3f5126db 3f5126db 3f1c3308 -> 3f45c549 3f45c549 3edb1e94", + "3f000000 3ef990ad 3d07d520 3d07d520 bdb48d80 be609cc9 3e9b5668 -> 3eedff36 bd953f50 3e3824f0", + "3f800000 3e382c16 3f9782ee 3de0b596 3f400000 3e800000 3f400000 -> 3f4b82c2 3f91a232 3f4705ad", + "3fc00000 3f848b01 3f848b01 be13fdea 3f8aea6c 3bcda058 3f8aea6c -> 3f7a4b75 3f84800e 3fdbfd4a", + "bf000000 3e3e53dc 3f86dcfe 3e3e53dc 3f42d659 3f42d659 3f25ad5a -> bdfdd6c0 3f89799a bd9ee0c0", + "3e800000 3f99df89 3f96045c 3e52f1ae 3eb2683c 3eb2683c 3f512a17 -> 3f979e8a 3f94195c 3ebc82a4", + "3f400000 3ebc782a 3e8925e7 3e7672ea 3f1c7fe4 3e0b6e0d bda389aa -> 3f28673c 3eaf6db2 3e47e1c0", + "40000000 3f89d8f6 3dd20a2b 3ead5e2a 3f7a54fe 3f8c7fb7 3f042a22 -> 3f6d2d57 4004a73e 3f82c121", + "00000000 3f95a457 3f95a457 3e87ae33 3cf72b89 3f07bd65 3ee2944a -> 3f95a457 3f95a457 3e87ae34", + "3f000000 3f6617bc 3f6b96d7 3f6b96d7 3f86d89c 3f37cec0 3f1e69dc -> 3f73bd3b 3f72eaab 3f71e783", + "3f800000 3f37bff1 bdf0f84f 3f37bff1 3f800000 3e800000 3f000000 -> 3f800000 3e25a2e0 3f5bdff8", + "3fc00000 3e827a45 3e827a45 3eb40ce9 3f743788 3deadbe6 3deadbe6 -> 3fa91ae6 3ec41b04 3eed26aa", + "bf000000 3eb60cc7 3eb60cc7 bdb63c77 3ecd955d 3d64f09a 3f956795 -> 3e679d6c 3eacd434 bf397a80", + "3e800000 3ea1bf39 bdd99b1f be484954 3d17ee9f 3ea7e189 3c36b292 -> 3ea4feb2 bc7f1900 be44df98", + "3f400000 be0a50fd bca2f6d4 3e85ced6 3f8b6b79 be195c3a 3f25c7c9 -> 3f4acc7a be09adc0 3f1ebebb", + "40000000 3f6a3efc 3f09c27a 3f3b0ab0 3f36f0c0 3f5b7b1d 3f920392 -> 3f84ab2c 3faa40bc 3fac2f14", + "00000000 3f70be70 3e94f915 3f95e2e9 3f842c93 3f6e465f 3f842c93 -> 3f70be70 3e94f914 3f95e2e9", + "3f000000 3edca7ec 3da9fe05 3f4dd6bd 3f8fe898 be1614ab 3df0d6fc -> 3f40376a 3c8179e0 3f50c9ca", + "3f800000 3f0f3599 3f32fb4a 3f32fb4a be05d788 3e830b56 be05d788 -> 3f007792 3f46b1b3 3f28ea38", + "3fc00000 3f15e825 3f214902 3f214902 3ec28438 be7b894b 3e9d86fe -> 3f525dcc 3efcc5dc 3f4cff22", + "bf000000 3eb40857 3f96e854 3eb40857 3f12daeb bd80bad9 3eb42eea -> 3e29a190 3f963006 3e733d34", + "3e800000 3f10b929 bddcd088 3f10b929 3f928a6b 3f2810f5 3f928a6b -> 3f309272 3d978f48 3f309272", + "3f400000 3d38a910 3ed2c5f9 3d38a910 bd6e4279 3f86fa7d 3f86fa7d -> 3b605900 3f608152 3f4ce190", + "40000000 3f5ff640 3f5ff640 bcfe2571 3f250872 3f906dd2 3f906dd2 -> 3f84a277 3f942195 4012ec98", + "00000000 3f918ae8 3f918ae8 3f69443f 3f635364 3f90e69d 3f635364 -> 3f918ae8 3f918ae8 3f69443f", + "3f000000 3f3afc72 3f91b12f 3f1a77d9 3f64feb5 3e457cf7 bdd607fe -> 3f59da5c 3f8ffc70 3f1529a9", + "3f800000 3f5f1017 3e5dd5c5 3f403f09 3dd65b4b 3f868fcb 3dd65b4b -> 3f6282a0 3f8523e4 3f46eb4a", + "3fc00000 3f951a59 3f9e94f5 3f951a59 3d9cb5ae be6c2e0c 3f94fb12 -> 3f92ae48 3fa92984 3f60851f", + "bf000000 bc75d26f bc75d26f 3f3f5ead 3f1b13d7 bdad070a bdad070a -> bea51614 3ce45620 3f42199a", + "3e800000 be6d35e0 3f98977a 3f625501 3edac11c bd129654 3dd4b837 -> bdccfdf0 3f98cfcd 3f631a39", + "3f400000 3ec6e0b3 be50f1b9 be50f1b9 3f959a20 3f959a20 3f99c035 -> 3f6cad26 3f59f4b0 3f6172e2", + "40000000 3dde8060 3dde8060 be4b4f08 3f036046 3bfd1181 3f880fe6 -> 3f830260 3dfab2c0 40165e9c", + "00000000 3e8c4d46 be022ae2 3edb939d 3eea1ccf 3eea1ccf 3f26a78a -> 3e8c4d46 be022ae0 3edb939c", + "3f000000 bdd3b072 bdd3b072 3edb0411 3a420032 3a420032 3f85a036 -> bdd2da60 bdd2da60 3f39f928", + "3f800000 be3788be 3f560a33 3eada479 3ecaa442 3f6c4e38 3eafc3da -> 3e9331cc 3f7cc59e 3f10e618", + "3fc00000 3ed7804a 3f38030f 3f38030f 3dcccccd 3dcccccd 3dcccccd -> 3f01fced 3f42cf67 3f42cf67", + "bf000000 3e246277 3e8073a0 3e8073a0 be7a4624 3e4b5fb8 3eeae88e -> 3e86b770 3e34ba50 3da1dbc0", + "3e800000 3dbbc66d 3f34c773 3f16ff9c 3e2dbbc6 3e2dbbc6 be3e886a -> 3e0556b0 3f37f839 3f121d38", + "3f400000 3f9a7f29 bd1d4c53 3f9a7f29 3f9455dc 3f9060cc 3f9455dc -> 3f83778f 3f570d86 3f83778f", + "40000000 3ed3d014 3f75b3aa 3f6613b5 be65b635 bd854b1f 3f3db872 -> 3e1a43a0 3f745c7e 3f863ffb", + "00000000 bdb1a42c 3f7f09f9 3f7f09f9 3f9da709 3f7125b6 3f7125b6 -> bdb1a430 3f7f09f9 3f7f09f9", + "3f000000 bd0a88c6 3f93e925 3f74ecdf bda7edf8 bda7edf8 3f5d2f19 -> bd9c1260 3f94ba1f 3f79b5a6", + "3f800000 3f6c96cf 3e523da1 3ed4ea61 bdfe7424 3f7399db 3f7399db -> 3f6a2d69 3f76258d 3f78c1d3", + "3fc00000 3f7a2754 3d944e47 3d944e47 3e536f14 3e536f14 3e71a83b -> 3f7bf6e0 3eb82b2e 3ecd31d2", + "bf000000 bd5de277 3f0075c7 bb8855b0 3ead815e 3f4d0133 be7b8bc9 -> be6e6020 3e9ac944 3df41258", + "3e800000 3e015c5c 3f4c2cbf 3f4c2cbf bd8b9c57 3f5163a6 3f29905e -> 3de43a68 3f56c5a8 3f54c1ab", + "3f400000 be38fccb be38fccb 3f568edf 3ebf265d bbb7791b 3f82f313 -> 3e1988e0 be3e1080 3f765b11", + "40000000 3f97d8e9 bcdd78bb 3e551cd2 3f443423 3f98736f 3f4981c9 -> 3f66961b 401ad79a 3fba3578", + "00000000 3f9a9dde 3f9a9dde 3f6fd529 3bdf2bc1 be74dfe6 3f84420d -> 3f9a9dde 3f9a9dde 3f6fd529", + "3f000000 3e3ad4c8 3de55f62 3f4733d9 3f278ef1 3e952b73 3f278ef1 -> 3ee6670c 3e772634 3f59ca4b", + "3f800000 3f81dffd 3f928b4e 3f5647a8 3f866d66 3f1e1796 3e7888be -> 3f7fcfcc 3f87179e 3f6067e0", + "3fc00000 3ea1295a 3e37a828 3ea1295a 3e02a6d0 3e762dd8 3f15d5b4 -> 3ee44e74 3ef3591e 3f6a9687", + "bf000000 3ec74d53 3ec74d53 3e0d3b98 3f579d2c 3d99360b be5d8f82 -> 3e073ca0 3ebb9b08 3e6cbbe4", + "3e800000 3e8294cf 3f217865 3ea7c3c8 3f0b4e0b 3f160b96 3e97234a -> 3eb6782e 3f2f5254 3ec12b26", + "3f400000 3ebcfc63 3f12b82b 3f12b82b be4242b7 be4242b7 be00bc4e -> 3e8f06f8 3f032bbf 3f086a5c", + "40000000 3f765ee2 3f4af51c 3f765ee2 3f3dc5a7 3f6509b3 3f006f07 -> 3f8252d3 3f94ef4e 3f80042d", + "00000000 3f7a4ba1 3f3ee4e1 3f206f59 3f856eda 3f389c28 3f856eda -> 3f7a4ba1 3f3ee4e1 3f206f59", + "3f000000 3f9b1b97 3f5422a7 3f5422a7 3e0c49b7 3d3aaef7 3d3aaef7 -> 3f99403a 3f55228e 3f55228e", + "3f800000 3f674d95 3f674d95 3f6d4bcd bd9f11e0 3f3273b5 bd9f11e0 -> 3f656284 3f7884cd 3f6bd7e6", + "3fc00000 3f0435d3 3c7898c6 3f0435d3 be3ddfe2 bbe5dc79 3f596ec9 -> 3ec38f42 3b9da300 3f90f5df", + "bf000000 3e5ae34a be35d4c5 3f98e024 3f666666 3f666666 3f666666 -> be0f69a8 bf351d24 3fa411ce", + "3e800000 bdfe4d71 be0b8697 be748125 3f811d95 3f37d786 3f811d95 -> 3e232508 3d8abb38 3d96c558", + "3f400000 be157357 3d976610 3d976610 3eec380a 3eec380a 3f0a4503 -> 3e804bae 3ec9eabe 3ee5ebf0", + "40000000 3f4caf6d 3e8f2101 3df8bdcb 3f9be3c8 3f9be3c8 3f079ad2 -> 3fa4d69a 400233be 3f86ae5e", + "00000000 3f1dc80d 3f6217d8 3f1dc80d 3ded5ab0 3e95a8c1 3ebfe8f4 -> 3f1dc80d 3f6217d8 3f1dc80d", + "3f000000 3edee198 be29d63a 3f75f7a5 3f16b3c8 3f16b3c8 3e8bf142 -> 3f19fd83 3e358ebc 3f7756a4", + "3f800000 bd2f7310 3ed89666 bd2f7310 3f919900 3f9b155a 3ec7d701 -> 3f9259f8 3f8fa063 3eba77fc", + "3fc00000 3f8c26ac 3da0366e 3cc9b683 3f4812be 3f5d9e8c 3f4812be -> 3f7bd00a 3fa3399b 3f958308", + "bf000000 3f99b8e5 3caf0646 3daf3191 3e2c704d be2e1316 3e2c704d -> 3f9be355 3dd61c90 3c0c0c40", + "3e800000 3f080abd bdb479d9 bdb479d9 3ecd08c0 3ecd08c0 3f5d1019 -> 3f140d2d 3caa8160 3e164e38", + "3f400000 3f4acd95 3f590b3e 3f84e74f bd996fca 3e5ffea1 3f7f9022 -> 3f47d05c 3f5f6f5c 3f813b6f", + "40000000 be20bd63 be20bd63 be027cc0 bcea3792 3eab413b 3eab413b -> be647c40 3f1df3c1 3f2074b1", + "00000000 3f8f48a5 3f0da93b 3f98b421 3eb3cf77 3f2c14d5 3f899979 -> 3f8f48a5 3f0da93b 3f98b421", + "3f000000 3f5df7dd 3f76e186 3e1c7556 3f1a31cd 3f8dcdec 3f8dcdec -> 3f68379f 3f7beea5 3f1f40a3", + "3f800000 3f4b5742 3e448c29 3f4b5742 3d839c3f 3d839c3f be0fb4c8 -> 3f4eb992 3e79b8d4 3f43f366", + "3fc00000 3f085c81 3e23cf7b bdb29f5a bd9e7aa7 3e5e204e 3f4a4eec -> 3ef4f2ee 3eddd97e 3f99cd0f", + "bf000000 3ece4e33 bd8c67ca 3f2d44c3 3f2de987 3f57f040 3f57f040 -> 3e4cf064 bf04ec0a 3f0a6051", + "3e800000 3f1df1d9 3edbd45d 3ec3caef 3ee70b48 3f5c6ea7 3f5c6ea7 -> 3f2901bc 3f0d5ca8 3f03ee41", + "3f400000 3f1a0bcd 3e3c6244 3f1a0bcd 3f6a6791 3f543a4c 3f6a6791 -> 3f600fa5 3f30fbfd 3f600fa5", + "40000000 3d98eb80 3d98eb80 3eb294d0 3f8f4d7e be06c953 3f282e80 -> 4009619f be2cfc00 3f9a2aa8", + "00000000 3de36a2a 3ebfdc7a 3f99c04a be57f803 3eb5263e be57f803 -> 3de36a28 3ebfdc7a 3f99c04a", + "3f000000 3f542772 3f542772 3f3f1707 bcef0ca0 3e9d987b 3ee0aa76 -> 3f5383ad 3f5ae6ed 3f4d54cc", + "3f800000 3f82ed56 3f186d66 3ee37cdc bda915e7 3f50ea05 3f5b8efd -> 3f832b34 3f6cf331 3f6bbffb", + "3fc00000 3f8821ed 3f8821ed 3ec65963 00000000 00000000 3f000000 -> 3f8821ed 3f8821ed 3f58cb2c", + "bf000000 3f4b2e1e 3f7fdcc3 3eb0eb6c 3f800000 3f800000 3f000000 -> 3f30c52d 3f7fcb24 3e3a4c90", + "3e800000 3f2a0736 3e750ebb 3e750ebb bd95a45f 3f410996 3f47a82d -> 3f28752e 3ec3f300 3ec67786", + "3f400000 bd2a1109 bd30b60c 3f359d3f bc80acbe 3f21bf9b 3f9b0369 -> bd5c52a0 3ee7004a 3f792d6c", + "40000000 3d9cdd2e 3f7df0a2 3e9547a1 3f400000 3f400000 3f400000 -> 3fbb1916 3f8083d8 3fad570c", + "00000000 bdddae5c 3e08a956 3e08a956 3f3418d1 3f9a1b89 3f0eef1a -> bdddae60 3e08a958 3e08a958", + "3f000000 3f1c45cb be6fa133 3f0ae04f 3eba8abd 3f9050b7 bbc023e9 -> 3f2e70a0 3eec5bf2 3f0a8867", + "3f800000 3da3fa6d 3da3fa6d 3f56fd0d 3f3d7af5 3f82ccbb 3f3d7af5 -> 3f42ce6e 3f829358 3f7557ed", + "3fc00000 3f1f31cd bd309005 bd309005 3e29d296 3f2b6960 3f0e1445 -> 3f3746b6 3f809532 3f534534", + "bf000000 3f0f9ca3 3f0f9ca3 3f52eb67 3f21ac90 be2094a0 bdba8893 -> 3ed83f06 3f186c8e 3f54f8f7", + "3e800000 3f3d128c 3f3d128c 3ee38a94 bc70ff4f bc70ff4f 3f55dea3 -> 3f3cd38a 3f3cd38a 3f0f79ed", + "3f400000 bd559798 bd559798 3f7f6f67 bdc6612c 3f3c40e0 3f07874a -> be03ab70 3f073400 3f7fa8d1", + "40000000 be177773 bdca12ec bdca12ec 3f96ddc3 3f100f83 bde64205 -> 4023b718 3f91a531 beb101cc", + "00000000 3f22c717 3f42fd1f 3f22c717 3f936141 3f8cce71 3cb0622a -> 3f22c717 3f42fd1f 3f22c717", + "3f000000 3f899e74 3e202231 3f899e74 3f515478 3f9e8132 3df1957b -> 3f85afaf 3f2dc044 3f890d37", + "3f800000 bdccfe93 3f50c0bf bdccfe93 3f4e3770 3f364cc7 3ed39170 -> 3f493bc6 3f7265e3 3eb57f14", + "3fc00000 3f970936 3f1b4d41 3f1b4d41 3f800000 3f000000 3f000000 -> 3f68f6ca 3f66d350 3f66d350", + "bf000000 3f2741e6 be3f7379 3f38c503 3f94c0f0 3f57016b 3f94c0f0 -> 3ee7623a bf2f76f6 3f0f613a", + "3e800000 3c3e153b 3f524139 3f86890c 3ee2beca 3f2c0832 3f0a2ce1 -> 3df7e000 3f59f0a2 3f85a74b", + "3f400000 3eb80295 3f101903 3f101903 3edaf923 3edaf923 3f872bb4 -> 3f109bba 3f33fdde 3f68b9e2", + "40000000 3ef29725 3ef29725 3f789425 3f400000 3e800000 00000000 -> 3fa1ad1c 3f3ca5c9 3f789425", + "00000000 bc6e337f 3c94654e 3ef08110 3e954518 3f16070e 3ee0bc57 -> bc6e3380 3c946540 3ef08110", + "3f000000 bdd1ab48 3f1e0e70 3f1e0e70 3ebff823 3eedefe8 3f366bc0 -> 3dd59388 3f34d08b 3f40f3eb", + "3f800000 3ec239e7 3f3dab12 3ee65d29 3f1c1daf 3f1c1daf bc772c48 -> 3f4201bc 3f661e84 3ee21d74", + "3fc00000 3eeb64b9 3eeb64b9 be726e8e 3d4b5ec7 be60e66c 3d4b5ec7 -> 3efffe7c 3e904466 be141cd8", + "bf000000 3eb4ea35 3eb4ea35 3db84053 3ef0ffca 3e29bee7 be311724 -> 3e4dfcc8 3e99792c 3e2cb468", + "3e800000 3f810309 3f810309 3f761df8 3f83d375 3f558f46 3f558f46 -> 3f80c057 3f80cd03 3f782d9e", + "3f400000 3ea07fae 3f8e8b0b 3ecb102e 3f92631a 3f506d38 be136dad -> 3f66ff48 3f85a9a9 3ea9b44c", + "40000000 3f52cd37 3f1a5738 3f52cd37 3f39097c 3ebb49b4 3f2459f6 -> 3f8a11fb 3f64b6c7 3f866b06", + "00000000 3f9a305b 3e89db16 3f05afef 3ec73d47 3f917303 3f917303 -> 3f9a305b 3e89db16 3f05afef", + "3f000000 3e3adb5b be0215b7 3e3adb5b 3d52b6e2 3d52b6e2 3e4508d8 -> 3e5063cc bdc8cc90 3e85b2d0", + "3f800000 3f30b8da bd84b842 be031e3c bda056a1 bda056a1 3d96b197 -> 3f2a83f0 be17b970 bd387e80", + "3fc00000 bda3b5be bddaee1d 3f79b9e2 bdf7d7e5 bdf7d7e5 3e0ac318 -> be8d4c50 be9d9bf0 3f7b005a", + "bf000000 3f03735c 3f03735c be4a6ed3 3e800000 3e800000 3e800000 -> 3ee7c390 3ee7c390 beb1de54", + "3e800000 3f41f17c bc66cb44 be215962 3f9d0812 3f079d10 3f079d10 -> 3f54f9ea 3df632c8 bb8bc100", + "3f400000 3f6797cf be66e756 bb0e517b 3f7cce46 3ed84cd6 3f0dc57b -> 3f79ab7b 3e26b518 3ed401ce", + "40000000 3f5a7e79 3f9babfb 3f6b871a 3f15d202 3f36c60d 3f15d202 -> 3f833265 3f685142 3f81beb6", + "00000000 3ea808b7 3f9f5a41 3f296122 3eede918 3f861dd7 3f861dd7 -> 3ea808b8 3f9f5a41 3f296122", + "3f000000 3f8f3f41 3f75f4aa 3d8c142b 3f594bef 3f3af4bf 3f3af4bf -> 3f88c6af 3f799f95 3ed13038", + "3f800000 be63ddff 3f9126fb 3f8c6dd1 3f800000 00000000 3f400000 -> 3f800000 3f9126fb 3f831b74", + "3fc00000 3f87e98c bd285c30 3f356ec5 3f904868 3eb45087 3f904868 -> 3f751172 3f0245a8 3f99c18f", + "bf000000 3f83cfb3 3f83cfb3 3ea61ad0 3c3a84e0 3f9b8355 3c2b3347 -> 3f83d541 3f862069 3ea44c2e", + "3e800000 3f78c311 3e67daf4 3e67daf4 3f15483a 3f7ee941 3f07fc1d -> 3f79d131 3ed6864a 3ea8866e", + "3f400000 3dc33292 3d9af2b2 3dd9c71d 3f0868f6 3f6089d5 3f8c5f02 -> 3ee9e98a 3f2f07fc 3f576394", + "40000000 3f956779 3f3744ea 3f3744ea 3f93fb80 3f02539d 3e604a20 -> 3f47d365 3f80a937 3f57214b", + "00000000 3f456498 3ea634a7 3f037125 3d75ca60 3f9c67e7 3d75ca60 -> 3f456498 3ea634a8 3f037125", + "3f000000 3eaae810 3ef1f2c3 3eaae810 3f9e05eb 3f507ad4 3eabacc1 -> 3f3eba5c 3f2ff476 3ee4175a", + "3f800000 3f544f3f be705e4f 3f87a7fb 3f400000 3f400000 3f800000 -> 3f7513d0 3f30fa1b 3f800000", + "3fc00000 3f82860a 3f094619 3f094619 3f1b13cc 3f7926b2 3f7926b2 -> 3f803b03 3f9b4c9f 3f9b4c9f", + "bf000000 3f6b5bfc 3f5dc0dd 3f6b5bfc 00000000 00000000 00000000 -> 3f6b5bfc 3f5dc0dd 3f6b5bfc", + "3e800000 bc8bd121 bc8bd121 3f9a2444 3ec437da 3ec598ec 3ec437da -> 3da49ce0 3da60400 3f97a315", + "3f400000 be385849 3f26da60 bd86803f 3f954904 3f76c4d4 3f987b57 -> 3f5a2770 3f674d66 3f62ee68", + "40000000 3f8597fe 3f127175 3f8e7b3b 3f8f7417 be6c0c76 3f930ffc -> 3f721c7a 3ebfde2c 3f5a6923", + "00000000 3f42518e 3ea272b0 3f174842 3f800000 3f400000 00000000 -> 3f42518e 3ea272b0 3f174842", + "3f000000 3f0853d5 3f824da3 3f0853d5 3f9c9073 3f9c9073 3f88a45f -> 3f518446 3f80e507 3f483422", + "3f800000 3ef73c71 3e67c65d 3e67c65d 3e679023 3e679023 be4e5d54 -> 3f198dea 3ecd7670 3d903d28", + "3fc00000 be4d4e60 3c929b27 be4d4e60 3e800000 3f400000 3f800000 -> 3e7faf04 3f8fb6b2 3fccd4e6", + "bf000000 3e5d5a6f bded840b 3f752eb8 3eab59d4 3dc1cb57 3ed22e41 -> 3dae15c8 be2cd348 3f72f650", + "3e800000 bdbef2fe 3f9810d0 3f866ec5 3d967460 3d967460 bdbfba94 -> bd95d420 3f979faa 3f869550", + "3f400000 3f88b1ac 3dd38951 3f9f8030 3ee4ec70 3ee4ec70 3f923af0 -> 3f85c752 3eced7c0 3f8482a6", + "40000000 bde69c5a 3d1422b2 3f8a954b 3f48cccf be7a1a22 be7a1a22 -> 3fd0ff5e bede8a3c 3f8fc0bb", + "00000000 3f9f5e85 3f89a06f be6b1bc7 3edcae11 3f13c06c 3f13c06c -> 3f9f5e85 3f89a06f be6b1bc8", + "3f000000 3f495987 be13f4ca 3f2b841d 3e15baaa 3e71abf9 3e15baaa -> 3f4d585f bc1a9300 3f31b154", + "3f800000 3f424975 3f65774f 3e275dde 3e81f9bc 3f5d3289 3f020962 -> 3f51f40d 3f7c648d 3f169fe6", + "3fc00000 3f4667dc 3f8f5e24 bb884eed 3f016dae 3f8823fe 3f9617d4 -> 3f72155f 3f6db33e 3fe18b30", + "bf000000 3f7fbea5 3f7fbea5 bde8fd11 bd3dd9b9 bd3dd9b9 3f0998ba -> 3f7fc029 3f7fc029 bed37f48", + "3e800000 3ea10e74 3f4497ba 3f80b2f2 3f800000 3e800000 3e800000 -> 3ef8cad8 3f484e3e 3f80a7c3", + "3f400000 3ef290d6 bdaafab7 bdaafab7 3f494193 3e9ef270 3e074d7d -> 3f48b6e7 3e2cd5f0 3cc3aca0", + "40000000 3e4e12e6 3e0f601c 3e4e12e6 3ecb267c 3ecb267c 3f860ab1 -> 3f55c938 3f528cd2 3fefe47e", + "00000000 3f60e1a0 3eb900b0 3f60e1a0 3e2b19c0 3e8ed9b8 3f22bc6d -> 3f60e1a0 3eb900b0 3f60e1a0", + "3f000000 3f62efbe 3eed69db 3f5e197e 3e4ba5e6 3e4ba5e6 3ea692c9 -> 3f65d395 3f045bde 3f639d38", + "3f800000 3f820e58 3f820e58 3f2fa5bc 3f8d52e0 3dc049ee 3d15f1b9 -> 3f7f926d 3f81dced 3f3296c2", + "3fc00000 3e9c2d7c 3f08d0d4 be038b90 3f9b530b 3f7cc5bf 3dc1d1b2 -> 3fc8f649 3f9cab4a 3d01f8b0", + "bf000000 3f8fe730 3e20dcd5 3f581f66 3f5dcb77 3f5267ba 3f8b6ef5 -> 3f96cacc be41d770 3f42672a", + "3e800000 3f938e62 3e316b8d 3e316b8d 3f400000 3f000000 00000000 -> 3f8fe3b0 3e8d9f0e 3e316b8c", + "3f400000 3ec397f7 3f92d57d 3f92d57d 3ed60a02 3f3e76fd 3f3e76fd -> 3f13661c 3f885316 3f885316", + "40000000 3f87f8eb 3f87f8eb 3d17b020 3f3bdd85 3e391407 be643d4e -> 3f788aef 3f85172a bec8d378", + "00000000 3f79f3b2 3f79f3b2 3f982fed bdaad5dd 3e8e07b0 bd12fdd6 -> 3f79f3b2 3f79f3b2 3f982fed", + "3f000000 3f97e282 3f8865c0 be431f6f 3f13ec14 3f9703c2 3f9703c2 -> 3f90fbf6 3f83719c 3f030280", + "3f800000 3ec8e74a 3f43aac3 3e45943e 3f9643d6 3f9643d6 3f38d2f5 -> 3f8d8748 3f853f50 3f468ead", + "3fc00000 3ed47203 3f793e1f bd92fdcc 3f800000 00000000 3e800000 -> 3fa571c0 3f793e1f 3ea90858", + "bf000000 3e6626ca 3e1181a7 3e6626ca 3f644b3a 3f80bcd9 3f80bcd9 -> bdf7a120 be9422c8 be290f70", + "3e800000 3e4bc187 3e4bc187 3f6d83c7 3f8f9ffd b9be3779 bcfe9892 -> 3ed8eca4 3e4bae7c 3f6d5f02", + "3f400000 be67f0f6 3f14ad5c 3ea1759e 3da6bb0e 3e9bc9b6 3e9bc9b6 -> be1b4158 3f2d2b36 3ef1745c", + "40000000 3f85a4a0 3f968f8a 3f968f8a 3f9a628a 3d907966 3f8e0c29 -> 3f700f9e 3f9360ae 3f48f98d", + "00000000 3f472191 3f7bc039 3e9ce4b8 00000000 3f400000 3f000000 -> 3f472191 3f7bc039 3e9ce4b8", + "3f000000 3f64e53a 3f64e53a 3f024661 3f5d7a47 3f8d01e7 3f5d7a47 -> 3f709ec2 3f73d32d 3f38a907", + "3f800000 3f13f2f9 3f13f2f9 3e2c385a 00000000 3f400000 3f400000 -> 3f13f2f9 3f64fcbe 3f4ac386", + "3fc00000 3f8b8d3a 3e8e40a4 3f2a1d43 3f800000 3e800000 00000000 -> 3f7472c6 3f0c7433 3f2a1d43", + "bf000000 3d4cb1a9 3e82581d 3d635330 be33d4bb 3f94b10d 3f94b10d -> 3e089874 be36a9d0 befc7688", + "3e800000 3e09bf38 3e09bf38 3e88a401 3f58cf9a 3f6e7a86 bacf417a -> 3ea2b246 3eac12aa 3e887e04", + "3f400000 3df0c641 3e2f2f05 3e2f2f05 3e13026e bd6df18e bd6a86af -> 3e59ae90 3e0a33a8 3e0abba0", + "40000000 3f9899cc 3f9899cc 3f401b10 3f6cc9b5 3f8c58bd 3f943d95 -> 3f562eef 3f454e83 3faa0cfb", + "00000000 be224d5b 3bab32a9 be224d5b 3f2adcc3 3f2adcc3 3f5e6eea -> be224d58 3bab3280 be224d58", + "3f000000 3f477663 3f477663 3efdb9b9 3f1c899c 3da30a12 be2a1b8e -> 3f58bf83 3f49b680 3ee845e8", + "3f800000 3f99aa08 3f8fec03 3f1981f6 ba18fa53 3ee52e93 3ee52e93 -> 3f99adde 3f88cb81 3f4762a8", + "3fc00000 be7f9ee3 be7f9ee3 3f350b15 3f5df7ba bdd35d6f 3e1a7186 -> 3fb01498 bee2dbb4 3f46004c", + "bf000000 3f42bbf5 3f84be20 3f6f6161 3e800000 3e800000 3f400000 -> 3f3b1374 3f8555e4 3f6925e5", + "3e800000 3f908c8e 3f908c8e 3f151fc9 3e4be793 3f885e1d 3e4be793 -> 3f8fb9a7 3f8c242e 3f1a71d0", + "3f400000 3ebe0e4b 3ebe0e4b bda8a6ee 3f0d0d81 3e9f00d9 3e9f00d9 -> 3f218c50 3f04854e 3e2dd1d8", + "40000000 3cfee28a be254dca 3cfee28a be4f27b2 3e0c259f 3e0c259f -> beb8c784 3e203ce4 3e97b77e", + "00000000 3d85ea05 3f727d50 3f727d50 3f9fa44a 3f9b28db 3f9fa44a -> 3d85ea08 3f727d50 3f727d50", + "3f000000 3eeff1bc 3eeff1bc 3f171944 3f02f0c3 3e2be6f0 3e342d97 -> 3f1ac2a5 3f0363cd 3f2053e2", + "3f800000 3f74ad9b 3f88eb23 3f74ad9b 3f12ca9f 3f99ac68 3eb39953 -> 3f7b2b8f 3f7c6c20 3f78a64d", + "3fc00000 3f374cc8 3e56b98e bb68e6b6 bcdea198 3f8032e0 3f8032e0 -> 3f345618 3fb2d0b6 3fc086cf", + "bf000000 be202037 be202037 3f87b094 be3b712e 3ee46b0b be444fca -> bd4eff60 bed42198 3f86f3e1", + "3e800000 3e415f63 3f0fab0a 3ec379cb 3d88e4af bdb4cbbe 3d88e4af -> 3e4f40c0 3f0d3061 3ec8c3de", + "3f400000 3e2af945 3f919fbc bccad9f8 3f81ba8e 3e94736a 3e94736a -> 3f4cd893 3f8dcaa0 3e4ad570", + "40000000 3d5e0fd2 3e72ca16 3e72ca16 3f800000 3f000000 3e800000 -> 3ff90f82 3f800000 3f1e5943", + "00000000 bd3e03e5 bd3e03e5 3f1de294 3e9265de 3e9265de 3f8c7417 -> bd3e03e0 bd3e03e0 3f1de294", + "3f000000 3d9c5f3b bd37292e 3d9c5f3b 3f8d5478 3f503b53 3f503b53 -> 3f1615de 3ec2a5ee 3ee76cee", + "3f800000 3f35ae58 3f35ae58 3f3d219a 3f613dd0 3f69ca5c 3f69ca5c -> 3f77120e 3f798d69 3f7a32e0", + "3fc00000 3f360e64 3f360e64 3f455a66 3eef0fc7 3eef0fc7 3ebbfe36 -> 3f69d83c 3f69d83c 3f65a74d", + "bf000000 3f74ab63 3f74ab63 bd3188e0 bc1a5d29 3ddd9dfd 3f822cd5 -> 3f74b90d 3f740e72 bf12e9cc", + "3e800000 3e786c7e 3e786c7e 3f82c84d 3e800000 3f400000 3f400000 -> 3e9472dc 3ec4ec14 3f8242bf", + "3f400000 3f0694c9 be32e0e8 bd5f6925 3f8ff19b 3eee76fb 3eee76fb -> 3f6cfd02 3e714da4 3ea0ad62", + "40000000 be70a89b 3f56260b be70a89b be246a9a 3ef0cd3e 3f421417 -> bf21b178 3f7d83ee 3fd19bae", + "00000000 3ec512d7 3e949e6a 3f95d3e1 00000000 3f000000 3e800000 -> 3ec512d8 3e949e6a 3f95d3e1", + "3f000000 3f4ac3dc 3f02bcf9 3f4ac3dc 3f74171d 3ed0ec63 3f2f11c2 -> 3f6424ec 3f1c4b81 3f5cf7c3", + "3f800000 be24bcf2 3ef4b709 3ea49d8b 3f4b7712 3f4b7712 3f3dfe0d -> 3f430372 3f64931b 3f5336fc", + "3fc00000 3f25bd08 3d87ffa7 3f322f2b 3ec0dc4a 3d620177 bd9c8fa8 -> 3f58bcf4 3e131f98 3f2942df", + "bf000000 3f97e933 3d03c877 3f7f6416 3ebd27dd 3f0dfcea 3f72c688 -> 3f9c53ec be71e4c0 3f7f1a28", + "3e800000 3f32fd0d 3f32fd0d 3ee56860 3f9e8dfb 3f9e8dfb 3f567b35 -> 3f4ad651 3f4ad651 3f104c88", + "3f400000 3ef75ba3 3f480314 be0f7f50 3f16de61 3f13850e 3f13850e -> 3f362a24 3f603594 3eb48a2e", + "40000000 3f004533 be5d1602 3ee2eff9 3d9286f3 3d9286f3 3f142355 -> 3f128c2a bd2bb120 3f8b364c", + "00000000 3f2f1675 3f5e9eaa 3f5e9eaa 3f773a17 3e2ce5f5 3f7c5199 -> 3f2f1675 3f5e9eaa 3f5e9eaa", + "3f000000 3f1965c9 3f6eae9c bda5ccb0 bd8a3c26 3f34b7c6 3e62947e -> 3f15ef56 3f74cb70 3d1e3f60", + "3f800000 3c1ef3d9 3c1ef3d9 be14d1df be74e44e 3f047be4 be74e44e -> be6894d8 3f05aea8 bed6a6b0", + "3fc00000 3ee69d50 3eaf43b4 3ee69d50 3f847d53 3f604807 3f604807 -> 3fa6dfce 3f9a723d 3f961966", + "bf000000 3f17576b 3f898c90 3f3fcb5d bd18ce2e bd18ce2e 3ef1149d -> 3f194b2e 3f895ef7 3f30adae", + "3e800000 3e802706 3f2518dc 3f2518dc be0810e0 be0810e0 bc3e5612 -> 3e66cd78 3f2213d0 3f24d546", + "3f400000 3f873a90 3f796b28 3f4ff348 bde5e38d 3e482d3c 3f39e900 -> 3f87d65c 3f7a622d 3f6a1ef9", + "40000000 3f5defb1 3e37bda7 3f5defb1 3e6fc2a5 bd2e1f09 3e6fc2a5 -> 3f6de341 3de09a98 3f6de341", + "00000000 3f864244 3f9a42b1 3f65f6d6 3f9c202a 3f87faaf 3f027165 -> 3f864244 3f9a42b1 3f65f6d6", + "3f000000 bd387518 3f91fcbd 3f91fcbd 3ea949bd 3e97adae 3f83d88c -> 3e02cc1c 3f8f52ab 3f88b931", + "3f800000 be5a46b1 3f288fd9 3ec66db8 3f7add5b 3f9a5263 3f9a5263 -> 3f79c520 3f88fd88 3f901ee3", + "3fc00000 bd8cd707 3f9b9232 3ea8ad03 3ec2fa38 3ec985c3 3efb4df4 -> 3f0aaf38 3f8b4b0d 3f52b919", + "bf000000 3f3cc471 3ee974d1 3f020134 3f8dfeb6 3cad6899 3f8dfeb6 -> 3f1779be 3ee68218 3e707a04", + "3e800000 3ede2b38 3f8b07f0 3f90b41e 3e2763a5 3e9a351b 3ef158b4 -> 3eea0362 3f8a334e 3f8ebc33", + "3f400000 bcc98bc9 3f454c06 bcc98bc9 3da6b528 3f538f26 3f538f26 -> 3d1b70d0 3f69ae66 3f1c4658", + "40000000 3f7b7bcb 3f7b7bcb be6e2660 3f8ffcaa 3f8acb11 3f8ffcaa -> 3f82d283 3f82a399 402296e3", + "3caaf5ca 3ecfbfd4 3eb03976 3eb03976 3d57a7c2 3d57a7c2 3de655df -> 3ed01568 3eb097e8 3eb10338", + "3f736929 3f78af8e 3f78af8e 3f8dd2a2 3eb4c3d0 3f8e02ce 3e84b1ea -> 3f7b2420 3f803366 3f8a6aa0", + "3f5e7bab 3dde99b3 3dde99b3 3e1205e3 bc70d2bc 3f89f7f3 bd099c1c -> 3dc74840 3f7191d3 3df0c6c0", + "3fb52136 3f4d94dd bdb6f64d 3cd6ca78 3f99d04b 3ca12fe4 3e7b000d -> 3f91a86c bd71b0a0 3eba5c36", + "be4f941f 3f624fb0 3da3b7ae 3f624fb0 3ec28f27 3f6e3853 3f6e3853 -> 3f60063b bdbfb910 3f5cb602", + "3de2f784 3f03dcb6 3edb5a13 3edb5a13 be28241f 3e266996 3f7d1c39 -> 3f019a6a 3ee09f5c 3efb6b08", + "3fb8d27d 3f7e371d 3f0b636d be6c7b0e bc9526b7 3f40ece5 3f49f164 -> 3f7e2b1a 3f8523ef 3f95e797", + "3f7e77a9 3f84dc70 3f240003 3e0194d5 00000000 00000000 3f400000 -> 3f84dc70 3f240003 3f471849", + "3f8a8e1b be196ea0 3eb7d0a5 3eb7d0a5 3f63e3ad bca040ee 3f65b194 -> 3f754907 3eb0dd96 3f7b4765", + "3f17a9fb 3e7f8779 3f239bab 3f03193c 3f3bf5e6 3f1f9ab4 3f54b8da -> 3f13731c 3f45bbd7 3f4095e0", + "3d9ce215 3f948911 3f948911 3f240be0 be26720c 3f8d41b7 3eaf7288 -> 3f94ca86 3f92cca7 3f2675cc", + "bc8e034c 3e9ad0f8 3e9ad0f8 be434117 3ec4fd2a 3f6ef3da 3f6e2086 -> 3e986f18 3e950962 be56ea40", + "3f5eefcc bca9e6ec bca9e6ec 3f32dea7 3ee395f2 3ee395f2 bde13651 -> 3ebfaf10 3ebfaf10 3f2b7bc1", + "3f97d551 bcb9cd71 3f9339d1 3c76a8d9 3e4d1170 bdbf08ef bdbf08ef -> 3e618b0c 3f955a67 bdc05c80", + "3fae0f12 3f145146 3e9dcd45 3f052c18 3e800000 3f800000 3f400000 -> 3f38ecd2 3f9fdcfc 3f81387e", + "3f730a35 be16e9b3 3eedf215 3f1ef549 3e8321ca 3f82ce16 3f4b3460 -> 3e06c4c0 3f7be9ec 3f681655", + "3eb74042 3f55ddb5 3f264334 3f83e153 be0568cb 3f99e362 3e59e0b3 -> 3f53e6bf 3f4ce068 3f8395ae", + "3e818c78 3e9370c3 3e9370c3 3f9400df 3f87dbc1 3d36562a 3f332753 -> 3ef558a2 3e978bf8 3f90761c", + "3d946b17 bd62cb9a 3f98915b 3f98915b 3f7e609c bdd3c2be 3ee76c62 -> 3ca8fbc0 3f98c07c 3f97c357", + "3e87afdc 3f80f238 3f80f238 3f3b7ffb be2e7759 3f1c348b bde766df -> 3f80fd28 3f80cb0d 3f3972e3", + "3eb46719 3e09c9be 3e09c9be 3dac02f4 3f068a1c 3f3503d8 3f3503d8 -> 3e96f240 3eb34a60 3e9fd996", + "3fb84ef7 3f6f1d37 3f19ecc0 3f47a9c4 3f2bbe61 3f2287be 3ebe7a1b -> 3f7f6d04 3f773d4b 3f65d783", + "3c8d2657 3f9441df 3f9ab63f 3f9ab63f 3d43c85c 3f894d38 3f894d38 -> 3f943d9a 3f9a37dc 3f9a37dc", + "3f8583ac 3f1101a6 3f1101a6 bd19a15a 3f04d54d be7edcce 3dd22931 -> 3f4d1472 3ee861e8 3d969f30", + "3e318cd3 3f640ea3 3ef4ea37 3f640ea3 3eeeca1c 3f0b550d 3f0b550d -> 3f66511a 3f070f51 3f66b1b3", + "3f2ca086 be749bb4 3f8b44e3 be749bb4 3dcaa7d6 3f1780bc 3d50dafd -> be1ff560 3f86c59d be48fd10", + "3e8a5a60 3f4b001d bd81036e 3f4b001d 3e6610c2 3e6610c2 3f0a42ff -> 3f4e37d7 3ac9fe00 3f52bc3d", + "3ea6a5d9 3e4f9c62 3e4f9c62 3f67ef24 3e548b46 3f9f4e37 be0e03f6 -> 3e8361e2 3f06948f 3f66d909", + "3f18f58e 3c34d52c 3f46cc3d 3f429323 3f6ece4e 3f7136e4 3f932349 -> 3f0fefba 3f67007f 3f6cc377", + "3e44bb15 3e7d4698 3f2ce3f4 3f5cf065 3f4b2e03 3ca1b413 3ea0aa5a -> 3eb965dc 3f2d34a4 3f5f0d82", + "3e77ebed be576388 3f89e535 3f89e535 00000000 00000000 00000000 -> be576388 3f89e535 3f89e535", + "3f8ee9ec 3f55f231 3f3d5f1c 3f82ef22 3f62798e 3f865505 3f585fd9 -> 3f7f7c0c 3f85b8bd 3f802a4c", + "3f63f17b 3f830317 3f03ec7d 3f03ec7d 3e717baf 3dcfd41a 3f2d00ac -> 3f82612e 3f0f228c 3f4e9574", + "3fb90fc7 3f9b8a45 3f9b8a45 3f8f620b 3f4c050d 3e2fa30e 3f8bab9f -> 3f779d7f 3f94b5ec 3f6e3aa9", + "3f9187c1 3f73bbe9 3ea37852 3ea37852 3f675137 3eceddd3 3e0af874 -> 3f802aea 3f21c98c 3ed93f8a", + "3f53dbd7 be126431 3de1ba13 be126431 3ea3eaa4 3f534790 3f534790 -> 3e23b354 3f37cb28 3f233f7a", + "3f2b3f21 3f489bfa 3cb587aa 3cb587aa 3f377a0b be5cf34f 3f377a0b -> 3f632a45 bdf3ab30 3efb5f86", + "3e23ad09 3e9830e1 3f0d9c35 bd7c60ac 3f249552 3f1665c1 3f7f849a -> 3ebd2a5a 3f185a14 3ddcadc0", + "3fb97a1f be3c83ee 3d619374 3ca911c6 3e800000 3f000000 3f000000 -> 3e7abaf4 3f3d5c64 3f3aeeb9", + "3f702e34 be56c2a7 be56c2a7 3f840c3c 3f0e4c76 3d0cfb63 3efac1c6 -> 3ed7a13a be2ec1f8 3f823017", + "3f0b671f bcb8f6df bcb8f6df be26232d 3f633eeb be6aba95 3f633eeb -> 3ef18480 be19d388 3ecc9324", + "3f84de63 3f22eb93 3f22eb93 3ecea9f6 3ebab6c3 be3a3738 3f51306f -> 3f4627bf 3f115986 3f68d43f", + "3ee2242a 3f4d4e49 3f90cd18 3f8b3080 3f80721a 3f80721a bd288bab -> 3f63c645 3f895ac3 3f8b6490", + "3f88dd33 bdaa8633 3ea05387 bdaa8633 3e267136 3ee669fa 3e267136 -> 3dd70ca0 3f24c640 3dd70ca0", + "3ec34477 3f7961be 3f7961be 3e9488de 3f530603 be2c186b bda118cf -> 3f7b7661 3f78f526 3e89a17a", + "3f059d1a 3f6c1b15 3f69988e 3f6c1b15 3f9b3059 3f3137df 3f857402 -> 3f78b1d8 3f71b0d3 3f76ee77", + "be15f345 3f1fb1af 3ee2196c 3ca8ff0b 3e80314b bd7ad8c6 3f3b93ad -> 3f1c29c1 3ee4a9ca bdacf630", + "3e286ccb 3f8039e0 3f8039e0 3ca8b55e 3f2122c3 3dee99d9 3da47b8e -> 3f8033e2 3f8038c4 3d0958f0", + "3df25e19 3f43560c bd6fd5eb bd6fd5eb be698dac 3f153d65 be698dac -> 3f41b2de 3c6d2f00 bdb26f00", + "bece8dd9 3e2a1d0f 3f23cf22 be208b0b 3f6725fb 3f93a054 3e2ae235 -> be0cece8 3ef1d416 be704a48", + "3fb68030 3f701c30 3f3c78a6 be0edb00 3f854d20 3f66f91d 3f66f91d -> 3f83da1d 3f89ab8d 3fa9c600", + "3f5028cd 3f185176 3f55b37c bd91e2f7 bdcdf85c bde62734 3ec96973 -> 3f0fd6e5 3f51d5fe 3e8af792", + "beaa19d0 bcc6e644 3d401632 3f44ab4e be5be1de be5be1de 3f6fe9d8 -> 3d47d980 3deb4b40 3f323248", + "beb259ba 3d4c091b 3e4acdc5 be0f9e71 3f002d44 bbd8af18 3e96041b -> bded6200 3e4cb204 be836534", + "bef85618 3f6ee7a4 3f14e2bc 3f93729c 3f8cdc9f 3f8cdc9f 3eadf768 -> 3f65c7ad 3eb76c36 3f96a71a", + "beb8f78f bbbe3d52 bde369b6 bde369b6 3f8c2b8f 3ed40d52 3f8c2b8f -> beceb3b8 be8df768 bf0cf306", + "bd8b77eb 3f8e7ebe 3f19f864 3f19f864 3eb45ff5 3ddafa30 3f286b8e -> 3f8ed7c4 3f193a34 3f15662c", + "3edc6d4e 3f2d55a9 3f104ee6 3f2d55a9 3f72a48e 3f72a48e be7f5248 -> 3f4f1121 3f3de28d 3f2475fc", + "3f85404d 3f467e33 3f8e623d 3f8e623d 3f913ede 3f9bc591 3d3e0aa4 -> 3f853668 3f78527a 3f8db063", + "3f663f3c 3f570a82 bcc4db39 3e24daa8 be2f89a6 3f03d6bf 3eaaab5b -> 3f50b9de 3ee68c34 3ed33724", + "3e5302ae 3f65c587 3f835624 3f4c27e0 3f000000 00000000 3f000000 -> 3f687956 3f835624 3f517f56", + "bb9ad9c2 3f4201d7 3f1dd074 3e177e91 be34b513 3e8c5ba0 be34b513 -> 3f420f13 3f1dafe4 3e1838d4", + "3f27b566 3f99bda0 3f4b93d8 3f99bda0 3ebf914a be28c7a8 be5ee69b -> 3f936e6b 3f45eac2 3f9d6952", + "3f81653b bdb4dbde 3f82bf84 3f84aae6 3f580959 3f2ce91c 3f580959 -> 3f57120d 3f80df29 3f80af8a", + "3f70303d 3ee2b1c0 3ee2b1c0 3f9a417d 3eaac9c9 3ea548f3 3eaac9c9 -> 3f1dfe32 3f1c8dea 3f9209e0", + "3f86b722 3f3514dd 3f513ec5 3f3514dd 3f51233b 3f94b9c1 3f94b9c1 -> 3f757f28 3f8535d6 3f88594c", + "3ed3d776 bde9ab0e 3f361abd 3f8ed07d be4943d9 3d564b22 3d564b22 -> be519c00 3f37b43c 3f8e7e65", + "bec68ed1 bd14f37b bd14f37b be667a68 be2a8c19 3f8b06fc 3f2469bf -> 3cfa74c0 bef22010 bf07bb38", + "3f8ea518 3f783015 3f783015 3f8fd8ce 3f800000 3f400000 3f400000 -> 3f807269 3f7eb7a2 3f829a16", + "be65265b 3c9946b7 bc09b152 3c9946b7 3f070c05 3f070c05 bda26db3 -> bdc6ec40 be028120 3d13f970", + "3ecb7333 3f0b6987 be3dafe4 3f0b6987 bde3818c 3f6fc0fc 3f7badc6 -> 3f06440c 3e82fdaa 3f38f53a", + "3fa470ba bce8d8a4 3f3def2a 3e460c54 3f2250f7 3f44b496 be4e8c55 -> 3f4f2d3e 3f7f2659 bc7fb580", + "3f60e238 3dc3112b 3f633f40 3dc3112b 3ebf3412 be654d8e be654d8e -> 3ec8bb4e 3f5d9750 bda96cb0", + "3fa588e5 be0d2097 be0d2097 3f305d2f 3ef67440 3f3a6099 3f3a6099 -> 3f120b28 3f6ef7b4 3f7b57e7", + "bd7f6edb 3ed11187 be3f37da be3f37da 3f4a7d4d 3f0cafc3 bb105258 -> 3ec2203e be68dd78 be3f0d20", + "be090c3f 3f8e2ddd 3ee17323 3ee17323 3ee76cf4 3f9cc388 3ee76cf4 -> 3f8f0973 3eb27b26 3ed01d7a", + "3fb7a131 3f0c29fb be174a30 3f540e11 be22eac3 3ecddd92 3ec90166 -> 3ee37342 3f03a9a2 3f6cce26", + "be0d7ef4 3f2f3b35 3f1efad3 3f4f7dc2 3e7d1ab9 3f01e300 3f01e300 -> 3f2c7902 3f182d89 3f4c1723", + "bd577bd1 3ec9247e 3f901667 3f901667 bd720159 3ec4bafd 3f89d634 -> 3eca1bd8 3f9069a7 3f90ffb7", + "bd9e4a99 be09ac96 3eec1471 3f382463 00000000 3e800000 3f400000 -> be09ac98 3ee6bf90 3f33fa07", + "3f0ab8fc 3e550b65 3e550b65 3f09383f be04b0b1 be04b0b1 3ee1cb82 -> 3e1c19e4 3e1c19e4 3f259aec", + "be917df3 3f2fd95e 3e0d4427 3f0f5006 3f000000 3e800000 3e800000 -> 3f24760a 3d9d1c98 3f074ea2", + "3fa87c64 3f8d6287 bdd8307d 3f05de40 3f9f1ba5 3f93a1c4 3f653165 -> 3f6ef81b 3fc95432 3f8ae5d8", + "3f63bcc7 3f8d8857 be32abad 3f1f2188 3eddbf6a 3f807f94 3f8f5824 -> 3f885194 3f5fd8f2 3f7fa2cf", + "3f76b9a8 3f63b79c 3f9dea77 bd9d57ed 3eecbc45 3eecbc45 3f18818a -> 3f705217 3f9095af 3f0a9ae6", + "3f9bdf14 3f338a6f be4f7522 be4f7522 3e800000 3f400000 3e800000 -> 3f4ad156 3f654f99 3e277160", + "beaca4e8 bca17682 3f4518c9 3eafa542 3f978f87 3f978f87 bd99a09d -> beda8afc 3f2d9438 3eb82742", + "bec07e42 3f3c310f be2d77b8 3f6796c6 3f56d43e 3da4f35f 3f56d43e -> 3f26cc53 be51ba58 3f5fe326", + "3f44b1aa 3f83bb0e 3f83bb0e be7778a4 3e800000 00000000 3f800000 -> 3f83039b 3f83bb0e 3f365c88", + "beac532b 3cb8279b 3cb8279b 3e91db55 3f56f357 3f9254c2 3f1a3a56 -> be81ee2c beb510c4 3e0f3a90", + "3fa9b631 3f93af65 3f93af65 3daafec2 3d4da5f7 3f9dd150 3f8d482c -> 3f925fee 3f6702a4 3fb65e6b", + "3f1236fa 3f4f8c30 3f9f0113 3f9f0113 3e800000 3f400000 00000000 -> 3f56774d 3f91b91f 3f9f0113", + "3fb64581 be529433 3f21039a 3f9cb2b0 be218862 3e696eaa be218862 -> bef3f3a0 3f3fd917 3fa324fb", + "3f1df4ae 3f667f81 bdb083ed 3ec3ef28 3f812015 3f812015 3f19e233 -> 3f765f19 3f170388 3f1c948f", + "3f7d4a7d 3e8564c6 3f836e01 3e8564c6 3f60cf8c 3f8add53 be7da91d -> 3f672d6c 3f7f7f1c 3da265e0", + "3f8f4104 3d43010a 3f54b6bb 3f741835 3ec17f05 3f0bbf95 3ec17f05 -> 3ee69efe 3f6f28cc 3f79214d", + "3d17c721 be7a8cc7 be50f3b4 be046785 3e8ea4d3 3f169c2d be4c6009 -> be6d6458 be3612c0 be0cf4f0", + "3f647458 3f7f3ca5 3e992276 3f7f3ca5 3f400000 3f400000 00000000 -> 3f7fbf65 3f44a962 3f7f3ca5", + "3db6cb17 3e439a87 be490bf2 3e439a87 bcedd69e bcedd69e 3e8a4f60 -> 3e4174fc be4c38a0 3e5793bc", + "3fb966ae 3f1fb9a2 3dfb21bc 3d2975ff 3e800000 00000000 3f400000 -> 3f42965e 3dfb21c0 3f8a97f8", + "3fa2f25f 3f050f02 3f050f02 3f44e5c5 3f97b70a 3f39c546 3f8d0a7b -> 3f9f47f8 3f76a169 3f8be6a0", + "3f0b2601 3edb46c4 3f25a18a 3f8d73ba 3f9620cb 3f600b9c 3f0147fe -> 3f4af230 3f509ea2 3f89c271", + "3d3efd39 3f8b3600 3f8b3600 3d2da44d 3f000000 3f000000 3f000000 -> 3f8af317 3f8af317 3d848b48", + "be90dfc9 be260ef3 3f99e9c2 3f99e9c2 be3c80d5 be3c80d5 3f83c767 -> bdd02400 3f989038 3fa1763e", + "3ebdbd99 bd9b6c5e 3ca13526 3e23d225 3ec33dda 3f1592b5 3f1592b5 -> 3d9bf4e0 3e6d81d8 3eaf08e0", + "be842299 3f0d104c 3f0c7c96 3f0c7c96 3f6433f0 3f6433f0 3f90fc01 -> 3ee53e84 3ee3d322 3ed57080", + "3f3c5baf 3f235be1 3e9b80e1 3e9b80e1 3d18b402 3f9e2706 3f9e2706 -> 3f25e66c 3f6fcbf7 3f6fcbf7", + "3fab8032 3f8b61b2 3e8e46e1 3e04df4f 3f679cda 3e3698bd be73ce0a -> 3f7b2b5c 3ee69c40 be176708", + "3f27ed21 bd805716 3f422e31 3f6e5452 3f9f3cd2 3f54e614 3f74b9c9 -> 3f4df4df 3f63e782 3f796900", + "3ecfc5d2 3ed0c859 3f13277c 3ed0c859 3f3311f2 3f871b81 3f4416ba -> 3f136d3c 3f41c6f3 3f178449", + "3eafb93f bd5a9c0b 3e414921 3e414921 3f800000 00000000 00000000 -> 3e9dc6ae 3e414920 3e414920", + "3f22ba66 3f50925c 3f42f9ca 3f070387 3ea5fbef 3ea5fbef 3f6c02cb -> 3f5a586a 3f4f8d17 3f4dea1d", + "3da1060b 3e28ed91 be63cfc1 3f7efc32 3f08d976 3f5f3bc3 3f5f3bc3 -> 3e4cddec be0dfc58 3f7f0e02", + "3d380677 3f6c6226 3ea311a2 3f31dd29 3f4448d4 3f5e552b 3f5e552b -> 3f6d0f24 3eb0af18 3f34e9a8", + "befcf8ca be7e0f96 3f2ec153 3f8c4697 3f378a83 be4e1810 be4e1810 -> bf30b322 3f36d594 3f8b0e16", + "bd8970ab 3f76123f 3ee8b53a 3f8c8072 3d3002c9 3f2734b2 3f2734b2 -> 3f760aeb 3edc7744 3f8d0cba", + "3c01ef8e bd0f427d 3e5eda85 be19cc5f 3f572481 3f3d344a 3f572481 -> bce602c0 3e638ca4 be11f2c8", + "3e98c66a 3e8ad35d 3f0a7a12 be4abb73 bc56ee9a 3f004c52 3f8431ce -> 3e895d6a 3f1c0d2d 3e2f4e60", + "bc987476 3f2f853d 3eb6ca13 3eb6ca13 3e800000 3f800000 3e800000 -> 3f2f2562 3eb0a9a6 3eb541f8", + "3eaa7b4d 3f0bf09c 3f938093 3df326fa 3ee5a0a2 3f54a41e 3f54a41e -> 3f1d458f 3f8e1bbf 3eb99522", + "3fb7ab0d 3f6a9ef4 3f0fc7a2 3dd2c1c8 3f623308 3f623308 3f9adc44 -> 3f82dd09 3f8f07c2 3fd483ec", + "beb11621 3df31f9a 3f15c7b3 3df31f9a be04259b 3d751a4c bd77afb5 -> 3e21d780 3f1394e8 3e0c6fac", + "3f703498 bbddb91c bbf78174 bbf78174 3f920b68 3f48d576 3f63d44b -> 3f891859 3f3beec0 3f55742e", + "3f9fc275 be3ce072 3ea71cca 3f10591b 3f2da725 3efca151 3efca151 -> 3f517f9d 3f3dc14a 3f551bc4", + "3f541eb3 3f9c29da 3e8b3b69 3d72b8de 3f849152 3e98ad0d be680cf6 -> 3f83fea2 3ee75626 bdf06700", + "3f993c72 3f8971d2 3ea9a83d 3ea9a83d 3eb80580 bdae45c2 bdae45c2 -> 3f85617c 3e86c84c 3e86c84c", + "3f2091dd 3f44e021 3f9fcbba 3f746ec6 3f03cf5b 3f03cf5b 3ecfb90d -> 3f57f839 3f958705 3f776052", + "3ed9fbd0 3f01709a bdd32501 3f873cf9 3f41aac0 3f41aac0 3f69daab -> 3f2a33f0 3e811f64 3f846c51", + "be599f76 3f87d101 3f29ae5a 3f87d101 3e5c79ed 3dbc53dc 3e5c79ed -> 3f882c91 3f27fe80 3f882c91", + "3fa02d3c 3f8e2dbe 3f8e2dbe 3f9354f9 00000000 3e800000 3e800000 -> 3f8e2dbe 3f89be32 3f8d48b6", + "3d2dc67f 3ec666ec be160daa be160daa 3f8ab5ec 3e9043bc 3f8ab5ec -> 3ed4d1e6 be0804c0 bdc026a0", + "3eb321d9 bcde1e29 3c938c04 3e70c03d bdad6660 3f0b2beb 3e203442 -> bd6baee0 3e51b3b0 3e8dcfc6", + "3f643d7e be56927f 3dd3e849 3dd3e849 3ea9c6ce 3f9bcc19 3f199754 -> 3e1798b8 3f89c664 3f15417b", + "3f953dd7 3f6d5f99 3ebdabeb 3ebdabeb 3e1fc9f4 3ee20526 3ed5bf60 -> 3f70c328 3f31c99c 3f2d488c", + "3e968f3a 3d8f0ff1 3d8f0ff1 3ebf263f 3f874515 3f773e28 be4e46f0 -> 3eb7c2f6 3eab046a 3eac24b2", + "be284deb 3f0bb06d be601f64 be7b150b 3d74ef89 3f59fc71 3c5f8d26 -> 3f0a8bc7 bec766a4 be7df110", + "3f38099e 3efe4c00 3f9be832 3efe4c00 00000000 3f400000 3f800000 -> 3efe4c00 3f8cdc3e 3f5bc787", + "3e1c13a4 bdfe4420 3ebff554 3ebff554 3e36bbed 3f5809ad 3f5809ad -> bdbfa570 3ee91fb8 3ee91fb8", + "beeb1d3d 3e1d8dc2 3f990999 3e1d8dc2 be12076f 3f32e83b 3ebc04bf -> 3e564b38 3fa11290 3c3717c0", + "be635b03 3f604e47 3e375608 3f32cf95 3ea63a62 3ea63a62 3e5f8784 -> 3f5e0568 3df57998 3f2f11de", + "be659204 3ea808dd 3f90e38c 3f292c2e 3e1db607 bdd4bae7 3e66f26f -> 3e9c2872 3f907edd 3f24c84a", + "3f477c54 3e5eefe5 3e5eefe5 3d5cff86 3ed06fa9 bd9759f5 bd9759f5 -> 3eee8780 3e30ce54 ba09d000", + "3f8741a8 3eb2d9f0 3f2aea57 3f6fe9f0 3eabc035 3e66534a 3e66534a -> 3f14788e 3f3f235f 3f73bcb6", + "bd842e6d 3e0358bb 3e0358bb 3f472e26 3f934e67 3f94f838 3f90ceff -> 3d821638 3d8096f0 3f43080d", + "3f93f5c1 bd3b3f87 3f4727d0 3f4727d0 00000000 3f000000 3f000000 -> bd3b3f80 3f680285 3f680285", + "3e6369ae 3f00d8ee 3d87337f 3f00f900 3f800000 3f000000 3f800000 -> 3f1d15f7 3e2dccf0 3f1d2eea", + "be9f3a1f 3ed47145 be78d66c 3f8550d3 3f526da6 bdcd8819 3f526da6 -> 3e87ddde be511cb8 3f86acb1", + "3c38c729 3edcced9 3f626059 3e139759 3f7ca9bb bddc0617 3f2f05ad -> 3ee00c9a 3f625729 3e1a5948", + "3fb562d2 3f830ec3 3ed65e3b 3ed65e3b bd3d4fd4 3f9ec0a8 3f537bd9 -> 3f834207 3fb85de9 3f8cb2d1", + "3fabec66 3f6ad57d be58db26 3ea5767a 3f2871b2 3ea06755 be2e86d5 -> 3f7d8a3a 3e98a4ec 3e2c440c", + "3f25b264 3e7aa512 3d8ab0a0 3d8ab0a0 00000000 3f400000 00000000 -> 3e7aa510 3f053174 3d8ab0a0", + "bef51622 3f5b8606 3f1bcaad 3f1bcaad 3f7a2bc9 3f13c136 3f13c136 -> 3f4a75dc 3f001b28 3f001b28", + "3f0e8069 3e4146d9 3f2ebafa be3974a8 3f0672e4 3e59edbe 3e59edbe -> 3eda114c 3f385bab bd28b460", + "bd756434 3ecf209c 3f2ccebd 3f2ccebd 3f523347 3cbe0057 3e883ad3 -> 3ec02150 3f2cb124 3f2b7b40", + "3f71eca2 3f2fe5b5 3f7e99c3 3f2fe5b5 3f3b5c7c 3f885491 3f3148d7 -> 3f674ca9 3f80012b 3f6451de", + "3f73fc11 3f5d208d 3f027b81 3f027b81 be540812 3c78c059 be540812 -> 3f563ec7 3f044c76 3ed36cba", + "3d856593 3f38a601 3e9d32a5 3e9d32a5 3f800000 00000000 3f000000 -> 3f3d4bc3 3e9d32a4 3ea8c0bc", + "3f2997bd 3eac9fc1 3f7e280c 3f7e280c 3f93cf90 3f5616e4 3f648be1 -> 3f581fb9 3f7f2d84 3f7f3f2c", + "be658557 3f66dcd2 be592fe3 3e9ab92a 3ea70532 3f7073bf 3f9ba766 -> 3f65064c beef3f00 3de55de8", + "3f687449 bdd6770e 3f8799a2 3f91287e 3f0606a6 3f90a07e 3e965751 -> 3ed74516 3f7f9aed 3f8c9555", + "3f14d0d9 3f831cf8 3f8d22f6 3f8d22f6 3f0f2b1e be0faa62 3f62b0cc -> 3f8219e0 3f8e353c 3f865fda", + "3ecd5885 3f6d2f68 3edddfdc 3e15d436 3e03237b 3e03237b 3f9ca6ef -> 3f6e26cc 3eecc6aa 3f10ba2f", + "3f6e8f34 bdccdb9f 3f141ebe 3f141ebe 3ec11776 3ec11776 3f815793 -> 3e92b89c 3f3a0887 3f79b459", + "beede675 3f0748e0 3f780ab4 3e3d2a83 be5ec2be be5ec2be 3e7b6ffb -> 3f137c8e 3f78d8a2 3dbbd630", + "3f516e10 3cc5a841 3f554928 3e0ba866 3f93a809 be7ffbf4 3f8b3b5f -> 3f71f056 3f4c8ce2 3f67a6ff", + "3f4118f3 be602019 3e759164 bd1e009c 3ef6eaf3 3f3d978c 3f3d978c -> 3e65e5a0 3f2a1a9c 3f0aa5e8", + "3eda0e1b 3f16812e 3f8b7468 3ef38f6a 3f169464 3daef57d 3d4eab26 -> 3f30ee9f 3f8b09b7 3ef95422", + "be71dd33 3f70ef23 3f70ef23 3f1d9915 3e908493 3ed86bb4 3f01f7ea -> 3f6fee01 3f6f6e12 3f11cc58", + "3ece15e0 be2a85d3 be2a85d3 3e423e1c 3f6cb08b 3f6cb08b 3f1060c4 -> 3e89023e 3e89023e 3ebf4d2e", + "3f94f4ef 3e2d9889 be255b2e be255b2e 3f1c1f11 3f29aceb 3f29aceb -> 3f4247fa 3f3c0072 3f3c0072", + "3d62653e 3f21b99d 3b95b979 3f21b99d 3f1aadd9 3f1aadd9 3eb18e77 -> 3f24df9d 3d1ae1d0 3f238838", + "beba4fa2 3f72af67 bd4d5596 3f9bc456 3f2f5488 3f2f5488 3eda311f -> 3f6f5de8 be9faa38 3fa012a6", + "be98b0f9 3e95f25b 3f00d27c 3f570cd7 bdc5cc8c 3f2c64e1 be06e0aa -> 3ea05ffe 3ece8ffa 3f58a8a1", + "3e84f8c0 bd985329 3f90c75e 3eed7968 3f658979 bd852cc0 3f404f52 -> 3e340688 3f910fe8 3f118447", + "3f2e5ec9 3f6e15a9 3f713463 3f23c40f 3ebc412e 3f6a3866 3ebc412e -> 3f729246 3f7a6cc5 3f3add7e", + "3f59517f 3f362b23 3f558009 3f362b23 3f43a0fb be3028f4 3eb064b5 -> 3f661048 3f4f4b28 3f4bc2ea", + "be094e29 3f4f9319 3f71f605 3f4f9319 3f400000 00000000 3f400000 -> 3f4ab466 3f71f605 3f4ab466", + "3e81543a 3e10c0b7 be549bd6 3e10c0b7 bbcba932 bbcba932 3f91fdad -> 3e0f5f54 be568cd8 3ec70814", + "3fa2289a 3f98e786 3f98e786 3ec39c9c 3e6b4c5f bcddcfd8 3eeba967 -> 3f91a794 3f99c238 3f3e0cd8", + "3d2b6106 3f37311a 3f966abc 3e00f829 be1cd770 3f6eeced 3f988be7 -> 3f36b9a7 3f958aa3 3e2d9974", + "3e51eba6 3e5004c1 3ef05cd6 3f579c34 3f358722 3f428195 3f57f2b7 -> 3ea3510e 3f0d5609 3f5e983d", + "be99aa31 3f2f4ec1 be05285b be05285b 3f03af43 3e418277 3e04ef03 -> 3f22d9a0 be46c988 be323e18", + "3f6babaa 3c631ecf 3f8da1d9 3f54db53 be637ce7 be637ce7 3ee82736 -> be405318 3f906b92 3f66dd8f", + "3ced1a94 3f0b3927 3e25ad9a 3e25ad9a 3ea3430c 3e5f7fe4 3f9a7178 -> 3f0c4d0e 3e2b19b0 3e43a72c", + "3e1794b1 3f289e89 3f736cfc 3ed27a71 3efb8e8d 3f1d762e 3ea0814c -> 3f2ef974 3f749213 3ee07868", + "3fb40c47 3e2040bf bcffb95b 3f43d1f7 3f37606e 3f633cbc 3df67553 -> 3f80d1b1 3fa0cfe0 3f4e01d0", + "3f246701 3f06289e 3f7e8f52 3f889039 3ef260f0 3f9f37e9 3f9f37e9 -> 3f2b3336 3f7fb5d5 3f81b906", + "bebf1300 bd6e25f7 3f0d201b 3e493287 3e05e4ac 3ecc91b5 3f0985ad -> bde0d210 3ef7fe48 3d10fa20", + "3f3457de bced61e7 bced61e7 3dde2ade 3f34ce17 3f8f363b 3f4e359f -> 3ef74988 3f483453 3f1d47a0", + "bed4f7a6 3f89d134 3f7e2153 3f7e2153 3ea8d433 3e9dff70 3e9dff70 -> 3f8b29e8 3f7de3e2 3f7de3e2", + "3f4bb15a be0792f9 3f17d5d1 3dcec633 3f1238f1 3f4fa25c 3f1238f1 -> 3ec3b624 3f5b0ed0 3f027212", + "3f26e121 bdc89bce 3dee40d7 3f7b7814 3f8bd0ff 3e130b43 3f8bd0ff -> 3f2f1078 3e4bd458 3f7eb200", + "be1ad390 3f929778 3f97e97a 3f929778 3f3ec1c1 3cd177cb 3efe05f0 -> 3f94afb0 3f980124 3f93fc80", + "3f6dac4d 3f855aea 3d2881bf 3e693fc5 3f961b58 3f9147f7 3f961b58 -> 3f7f0ca6 3f8698f1 3f88c5e0", + "3f9e0c10 3f505151 3ee8f5a1 bd83ed1c 3f757eb7 3f5bc1cb 3f5bc1cb -> 3f846379 3f842e5c 3f882a79", + "3ea00372 3e140eac 3e140eac 3ee71412 00000000 3f000000 3f800000 -> 3e140eac 3e8e77a8 3f1f6fd8", + "3f1576ae 3f7a87cb 3f41f433 3f661055 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f7b984b 3f4e0769 3f6b1c81", + "3f8f3cd8 3f9979b1 3e8bbc01 be7d6088 3f79db96 3f4c75c2 3f4c75c2 -> 3f7b4d77 3f6c3926 3f5e11c5", + "be7c3d0d 3f8f2468 3ea27a27 3ed36824 3f00e706 3f00e706 3eeabea2 -> 3f910534 3e6e4024 3eb1756a", + "3eee1edb bd46b6e8 3ec36a27 bd46b6e8 3f15edfa 3f4be5d4 3f4be5d4 -> 3e72c4f8 3f1c57c0 3eae04de", + "3f9560c4 3f6c4375 3efdc332 3efdc332 3f04cf05 3ebf4b5c 3f94d69d -> 3f78366a 3f372e0f 3f970c4b", + "3f9062c3 3f300e68 3eb9fb4c 3f6e8733 3fa00000 3fa00000 3fa00000 -> 3f9063a0 3fa16b16 3f8394f7", + "be3e844b be555416 be555416 3f960f87 bd7b0f44 bdb0d098 3e99cc9e -> be4737d8 be417418 3f974b28", + "be11ef1e 3f847369 3f1eda5a 3eabc33b 3f1165da 3d69c435 3f1165da -> 3f84cfa3 3f1e1013 3e90391c", + "3eeb56c0 3f8c5136 bd9b7519 3f8c5136 3f2e77dc 3f88fad8 3f0dca18 -> 3f887572 3ee81a10 3f892e76", + "bd87cbeb 3ed995c3 3f54154a 3f5d23b8 be5055c5 be5055c5 3f62b06a -> 3edd8e88 3f54acf5 3f5b17ba", + "be9b3918 3ecb4f95 bd41c12c 3ecb4f95 3f13e1e8 3b240782 be5f8000 -> 3e953ff4 bd450260 3edfbca8", + "3f281341 3f817353 3f22be6a 3f1af4e2 3ed7e394 3ed7e394 bd9813fe -> 3f810c87 3f3c8f82 3f1607c9", + "bdf33812 3f8f76f4 3f5ace7e be631cab 3f34cb96 3f502eae 3f502eae -> 3f90c2ff 3f5736f0 beadf850", + "3eada289 3f81082e 3e86f817 3d987621 be6936c8 3f65640d 3e93b16f -> 3f811c96 3ef98aa2 3e28f2a4", + "3f52396d 3e11cdf3 3ec2cc4d 3ec2cc4d 3e512bd5 3e512bd5 3f901b81 -> 3e928ed4 3ef801aa 3f7407a4", + "3eddd18c 3f517b53 3ecc6589 3f134a00 3f144d27 3f144d27 3f55ac99 -> 3f5d2820 3f0ccc86 3f3a9998", + "be98e392 3f3e52ce 3cba707d 3eca3624 3f64cb56 3f5c99f9 3f5c99f9 -> 3f2ccbc0 be6a31c8 3e74fe3c", + "3ee4864b be0d4c8b 3eefca54 be0d4c8b 3f62b478 3da25af5 3f62b478 -> 3e9fa630 3ef96c0c 3e9fa630", + "3bb4ff24 be1fea9f 3f84230d 3f476b9e 3f8b3509 3f73ec28 be2a06f1 -> be18cdf0 3f841d7a 3f475e55", + "bef6f45e 3e524910 3e524910 be57686f 3e09aa4c 3e09aa4c 3f9f6acb -> 3e1d854c 3e1d854c bf6ffc80", + "3e9be2f1 3f5ef1c1 3f5ef1c1 3f67a752 3eff023a 3f48ebc1 3f83f20f -> 3f63f4ff 3f66d7e2 3f6f4b74", + "3f4500f6 3eb4dfbf 3eb4dfbf 3f8ab057 3e9b1f7e 3e9b1f7e 3f3834f3 -> 3f0109dc 3f0109dc 3f84c523", + "bd3f5478 3f4f90ac 3f071aa1 3f1fe228 3f32840f 3f4d3c55 3f4d3c55 -> 3f4dfcc9 3f02939e 3f1c48b4", + "befc0be5 3d37cdd1 3ecd07de 3e92ea79 3f578f0f 3dfc82ce 3dfc82ce -> beb3bb10 3eba661e 3e798370", + "3f96aeb6 3f65059e 3ec88b22 3ec88b22 3e8c028f be40bbdc be40bbdc -> 3f6db4e4 3e8388ba 3e8388ba", + "be7f5c4b 3e244d4e 3f87ede0 3f89c0cd 3f9075b7 3f8d0853 3e10743a -> bd9b4ef0 3f8a1b9e 3f8a18a3", + "3f8ebea5 be422b88 3f91bb4f 3e7090e6 3f80f828 3ed6c3e6 bd4ed506 -> 3f92d39c 3f896fe6 3e4472d8", + "3e80aa3d 3f42dc11 3f1d84ae be5a9555 3f5dedf9 3ed423fa 3f48de55 -> 3f502de7 3f27c5be 3cd36e40", + "3fa8b963 be1789b0 be1789b0 3f4d0201 3f5a6224 3f3d7645 3e7f2eb5 -> 3f924a1f 3f78d081 3f5dc212", + "3eb96ae8 3e174c58 3eaf51e9 3f445f99 3f000000 3f000000 3f400000 -> 3e9aa8f4 3eec4882 3f549187", + "3ea1848d 3efe3587 3d8ddbb4 3ed0b387 3e272e93 3d89aeda 3d89aeda -> 3f05be40 3db648a0 3ed72238", + "3f6e66f5 bdb27cd3 bdb27cd3 3ee7b9c1 bd93c439 3ee202b0 3f5dee1a -> be240b70 3eb83210 3f64ffa2", + "3f231ef5 3f6fd082 3f0a12f0 3e9a7ae4 3da7cc73 3f30e0ed 3e203b3a -> 3f70a8d4 3f3dfdd8 3ebe2068", + "bdd5fc11 3f6eb826 3ea2149a 3f90ed64 bc8f6e60 be7d93ac be7d93ac -> 3f6ec03e 3eab225e 3f907d45", + "3fb84079 3f8b74a9 3f5d8028 3f5d8028 3f986f69 bd8cfa79 3f986f69 -> 3f6fa2a0 3f5a1505 3f8c5220", + "3e44f2e6 3f7b456c 3f57957e 3f57957e 3eb56f00 3f2633ac 3f21ba49 -> 3f7b97ee 3f5ca16f 3f5c7ea8", + "3f07953f 3f9b80f1 3da85771 3da85771 3f98c4e2 3ecabb7e 3ecabb7e -> 3f8a1e50 3e8ca18a 3e8ca18a", + "3ec08b40 3f87e84b 3f53b43c be1c50ee 3ed193ea 3f87395d 3f87395d -> 3f86b0af 3f654d5f 3e9c4dc8", + "3d9cf39e 3e692270 3e692270 bd9c883d 3ce90191 3f667a8b 3ee93700 -> 3e6adbc4 3e8fd9c8 bd1f2760", + "beac0e7a 3f078a29 bb3d6450 3f595f88 3d72e2b9 3d72e2b9 3f43eb74 -> 3f0523a8 bcbb6340 3f4f7067", + "3fa33ffc be064416 be064416 3eecdf3d 3f84b463 bd7d5145 3e3d7e7a -> 3faea8ac be61a048 3f16e732", + "3f40f678 3f8887de be7643d4 3f8887de 3f910cfe 3f910cfe 3f47b36b -> 3f813e7a 3f51b058 3f8383c4", + "be8192c1 3d8f9050 3f50a3ef 3d8f9050 3f11d117 3d8fd3b7 3f2dcbbb -> bd82f5b0 3f4fcc74 bdb7a270", + "beacbed2 3f205bcc 3dcf5419 bdfb0b97 3e866836 3f59945e 3d908256 -> 3f17e339 be203fb0 be18e398", + "3f4f30ff 3f923421 3f923421 3f153c25 3dabecf5 3e22d2a1 be75afc3 -> 3f90f782 3f8fdc6a 3f0080be", + "be8be73f 3ed27f89 3f3cae3d 3e98509b 3e800000 3e800000 3f800000 -> 3ebde6e4 3f3814f6 3dd82028", + "be9e4f5f 3f87facf 3d8ffb6a 3f9e6eba 3e211dfd 3e211dfd be44f82e -> 3f885e31 3ccd6860 3f9c9f5f", + "3f912697 3f1ae91a 3f86a486 3f2dd0e1 3f000000 00000000 3f400000 -> 3f543a4f 3f86a486 3f73b67f", + "3f0499d1 3ca05cb1 3dfa63de 3e23057e 3e800000 3f000000 3e800000 -> 3e160ce8 3eb2fc8a 3e89418e", + "3f3d79a4 bc600794 3f10363d 3f10363d 3f426f86 3f426f86 3f051548 -> 3f0e605a 3f4f0d90 3f3b3958", + "bedc49e2 3d8cad35 3e454edc 3d8cad35 3ea63045 be32ba9d 3e963b15 -> bd7b6080 3e81b1d8 bd483920", + "3f858b6e 3f27910c 3f83500e 3f8ed07d 3e4336d3 3f1c3dcb 3f1c3dcb -> 3f3927dd 3f81340d 3f85619a", + "3f57eca5 3f4c9b03 3db767d8 3f4c9b03 be31fac9 3e70998a be31fac9 -> 3f451235 3e8a3b6c 3f451235", + "be3de646 3e98da79 3e00c847 3f2b33cf 3f741813 3f741813 3f980929 -> 3e32b200 bcec1bc0 3f188618", + "bec0e641 3f1f1940 3f3f9d0e 3e014b91 3f1c821c 3e6423a6 3f1c821c -> 3f08c769 3f3a3580 bd999250", + "3f850fe0 3c5ff242 3f5c969d 3f641111 3f9ab0f0 3f9cb9cf 3f9cb9cf -> 3fa05c3c 3f84d4b6 3f83cf8a", + "beef44e4 3eb8c5e6 be00d47f be00d47f 3f18012e 3de982e0 3e4e4b73 -> 3e3bf290 be3e41d0 be6d5d78", + "be2da1b3 3f7d88c9 3dd21e82 3f7b39ea 3eb64824 3eab57cb 3eab57cb -> 3f7d62ae 3d53a880 3f7af491", + "3f0297f9 3e835499 3d84a0c4 3f4ed625 3e4c1838 3f41919e 3e9f76b8 -> 3eaa08f6 3ed9dbcc 3f56a5cf", + "3f78a8a2 bd7f2499 bd7f2499 3f611183 3f000000 3e800000 3f000000 -> 3ee84146 3e485cb0 3f701738", + "3fba3aa4 be40ceb3 3f150043 be40ceb3 3f9ef971 3d6d08e0 3f9ef971 -> 3ffabe45 3f1e0286 3ffabe45", + "3f87af67 3f77076c 3e9886fd 3f9ff221 3eee0960 3f6be595 3eee0960 -> 3f7b733e 3f7bd464 3f9033b6", + "3e8ab64a 3f4dbb73 3dd3fdf5 3dd3fdf5 bdcec2e5 bdcec2e5 3ef51672 -> 3f4c5b79 3da1c638 3e610c90", + "3fbf2301 bdbbb1fe 3f9e0a2f 3f933b02 be3d6851 be3d6851 3f7af0c8 -> bec94d20 3fa65640 3f6e29f9", + "3f372c2e 3f30a5fe 3f30a5fe bda85395 be61a941 3e9534cc 3d47b894 -> 3f2422e0 3f4131c5 bd360100", + "3f8fc4ac 3e7aac59 3f27d68d 3f27d68d be262057 be262057 3e664fd8 -> 3ddb84a8 3f17c5fd 3f3e1c12", + "3fa9a9ac 3f963467 3f96ffb3 3f963467 3e800000 00000000 00000000 -> 3f8ed8bf 3f96ffb3 3f963467", + "3f8ea31c 3f93432f 3e8a94d0 3e8a94d0 3f1026ca 3f1026ca 3f07ae99 -> 3f872cf3 3f3a7295 3f33906b", + "bd9a8fc7 3f0622e0 3e826e13 3ec6002f 3f93ff10 3f4bc23c 3f93ff10 -> 3ef70144 3e5704ec 3eaa99f2", + "beed3eaa 3ea039da 3f6a8f9d be5f1ef3 3f9c3f66 3e8d9f2f 3f9be583 -> bd9afce0 3f67d02a bf67bc38", + "3fac33f9 3f48f010 3f48f010 3f546951 3f800000 3f800000 3f800000 -> 3f8981eb 3f8981eb 3f8786c0", + "3fa5e7c1 be245923 be466e6f be6b741f bbbf6ba9 3f8f1d81 3f8f1d81 -> be2d5890 3fc4a371 3fc6b79b", + "3f0d0f82 3f17ab1a be26fdab be26fdab 3ed4239f 3d2fa6cf 3ed4239f -> 3f2f7ce4 be0ad920 3dd1d688", + "3f9fe20f 3e208a47 3db9aef2 3f8aea86 3e54c1ce 3f8a3667 3f0f27d0 -> 3ec05068 3fa89793 3f834a93", + "be62c965 3dd09d9e bdfcfad5 3dd09d9e bd8739a8 3da55ce9 bd8739a8 -> 3deb8370 be131040 3deb8370", + "3f473e5b 3f456141 3e925167 3f4be648 3f140999 3f86f90f 3f140999 -> 3f5fc347 3f5f3724 3f635922", + "3f9a6a44 3f843e72 3f373a50 3f373a50 be7e032d bc061f00 be7e032d -> 3f858391 3f368256 3f21735e", + "bea46e78 3e4cb5d1 3e4cb5d1 3f3f4190 3f571f3d 3f571f3d bdea8e43 -> bc832780 bc832780 3f41a333", + "3e8823c0 3ec7fb81 3e91ad45 3f3f1d24 3d07a384 3f960313 3f2d27e3 -> 3ecabad4 3f01ea7a 3f4ac89d", + "3dd85a86 3e96f603 3ec1919e 3f60d3c9 be4f3ca9 be4f3ca9 3f04dac5 -> 3e8f3dfa 3ebac2c8 3f62894b", + "3f90820c 3f60b6b2 3f3edecc 3f60b6b2 3f89cf4f 3f82c314 3f512d36 -> 3f835ef8 3f84fe40 3f7d9316", + "3e0a7945 3e0d0dbd 3e0d0dbd 3f357d26 3f596c34 3f069b7c 3d2b3180 -> 3e7275d4 3e4bd5c0 3f35e8f5", + "3f2c2cc0 3e0a3c57 3f09daab 3e0a3c57 3f08349f 3f3c1e55 3f3c1e55 -> 3ee398e2 3f443e8c 3f0ffff0", + "bd2223cf 3f0f1d09 3f010657 3f90790c 3f400000 3f000000 3f400000 -> 3f0bc311 3efd05f2 3f90f63f", + "bd86bc67 bdf25476 3ee85134 3edc6b9a 3f749056 be6d28d2 be56f5c3 -> be412378 3eec9424 3ee0727c", + "bccbda11 be5469f2 be7ca943 3d9f1235 3f85b5cd 3f9a7a5d be72d381 -> be748db8 be918034 3daa37b8", + "be106b40 3f0c0c79 3da992d8 3f519778 3eb92ce5 3ebd4384 3ebd4384 -> 3f062261 3d0f4990 3f4f2c17", + "3fb1df4b 3ed6f1f4 3f7a6687 3ed6f1f4 3f456ddc 3f9b210b 3f588c79 -> 3f8552f3 3f81ea5b 3f8d0812", + "3f49b138 3d9d111d 3d9d111d 3ea23dca bc01f4b9 3f0060c4 3f0060c4 -> 3d914008 3ee20a62 3f1636e0", + "3f93a927 be525924 bda5be2c 3f699cd4 3f8eddaa 3f81f748 3f1c1534 -> 3fac5f18 3f97b40d 3f795bd6", + "3f5c8620 3e8f91c5 3e8f91c5 3f65274d 3f6a73af 3f139eed 3f7c57a2 -> 3f591d5c 3f234a64 3f7bf301", + "3e884634 bdd9ddce be10775d 3f8b2236 3f7b6f2d be57c22d bd61e6c5 -> 3e3b3b24 be51fe90 3f8b4c0d", + "3f0496dc 3ec78d65 3ec78d65 3f51fb42 3f10b812 3ee85229 3f10b812 -> 3f118448 3f087d88 3f5f7486", + "3e9b86b6 be76670e 3f5c784c bdb87b8a 3f392b2c 3f787906 3e65f6ec -> 3d02e640 3f66f1fd bc80c140", + "3e8e8ac1 3f6719f7 3f9af5ac 3e7fbcb8 3d39c0bf bdb11032 bdb11032 -> 3f676a71 3f9b9bcb 3e6d3ec8", + "3eed43af 3f583df7 3f43bc40 3f9d69a0 3d1cc3e7 3dd03b48 3dd03b48 -> 3f58f27b 3f46932a 3f9c06da", + "3d3cb9ad 3f1b1581 3f551cc3 3f551cc3 3e643167 be7bc578 3edc9654 -> 3f1c1ec4 3f54a062 3f55f6b6", + "3f7069a9 be429d8f 3e3e388f 3f9c173f 3f400000 00000000 00000000 -> 3f25ec9d 3e3e3890 3f9c173f", + "bef59434 3f6dcde6 3f9decba 3f0619bb 3f93f6a5 3e10b672 3f733350 -> 3f63b732 3f9ff400 3e9d1c42", + "3f9f8aa3 3f04e839 3e152411 3e152411 3f78bb5d 3f638e4f 3f86d799 -> 3f8cfcfc 3f8bcd87 3fa23bda", + "3de14dde 3edd44d2 3edd44d2 3eca0312 3f000000 3f000000 3f000000 -> 3eed42c2 3eed42c2 3edb102c", + "3f98b2b8 3f9faf5b 3e57ab4b 3f9faf5b 00000000 3f000000 3f400000 -> 3f9faf5b 3f2e747a 3f835600", + "3f0c5d76 3e88e9cb 3f23d670 3f10a36f 3f21d0a2 3eb4daaa 3f99bd34 -> 3f05745e 3f35aff7 3f59f9f4", + "3eeb2901 3ed8495d 3f975bd9 be1778ae be0a55cf bce9433b 3f6f8426 -> 3ec5f02c 3f97aa0e 3eb0d3f2", + "3f8792a8 3f85b393 3f0407eb 3f85b393 3e800000 3f000000 3f800000 -> 3f843118 3f45aec3 3f7f534b", + "3f7d0127 3dd0e564 3d97dbb5 3ea1d950 3f842221 3f301d4b 3f301d4b -> 3f8252c4 3f342146 3f47f534", + "3f604c0a 3ee14996 3e39ecb1 3f8dfbc2 3daa1629 3e3c8a32 3f68b989 -> 3ef62670 3ea08fac 3f82d87a", + "bea5771c 3f9ea8f9 3ec8edfa 3ea15a0f 3f9a5a72 3f9a5a72 3f752a8f -> 3faa9bce 3e1f676c 3dd34ed0", + "be41f830 3f90ce5d 3f1be0a4 3e88c361 3e332f05 3e8d156c 3d63e635 -> 3f915cf8 3f16a6c6 3e84cef4", + "3cd028b5 3eda292b 3f8b1273 3f8b1273 3f2592a4 3f9e3425 3f9ab22d -> 3edefd6a 3f8ab96e 3f8abb68", + "3fb8305b 3e4ed22e 3f4b049e 3e4ed22e 3f332a07 3eeedb6a 3eeedb6a -> 3f80b92e 3f6e95d2 3f3cd992", + "bed03adc be386e66 3f3f57b5 be386e66 bce1cdae 3f100720 3e9b1ce4 -> be2ae270 3f308c56 bea6a970", + "3f33cdd6 3f1d6426 3d31b090 3f7f4a2c 3f7579d1 3f0961db 3e32eea6 -> 3f5fcd85 3eced2a4 3f7f607d", + "be822ac0 3eb300db be2dbcab be6ccf31 3f22ca23 3f22ca23 3f348820 -> 3e7a56ac beb7af54 bee76d4c", + "3f8aa3fb 3f1eb749 3eb51b23 3f1eb749 3f000000 3f800000 3f000000 -> 3f5366cc 3f86e072 3f5366cc", + "3f9ccaa8 3e2c5625 3e70a1cf 3e5e87a5 3f2e5716 3f815954 3cd72e42 -> 3f5cb2da 3f974a36 3e78514c", + "3f189747 3f36647b bddc5fbd 3e358756 3e8af1fc 3f8c0ddb 3f80dbbf -> 3f424c8c 3f1d613c 3f2bc3ba", + "3fa8a44e 3d365a9c 3d365a9c be31eaea 3d91bf55 3eed5951 3eb0242a -> 3e095384 3f20ca9c 3eb76e62", + "3f586cbd be1f4db7 3ee24e26 3ee24e26 3f135762 3f135762 3f96b9d5 -> 3ed03b7e 3f36a8ac 3f7f5bbf", + "3e834395 3eaededf bdecc16c 3f65107f 3e04fbe7 be137f9d 3f33e9b9 -> 3eba1860 be209078 3f69eae7", + "3f1f0b03 be2d31bd 3e55dae5 be2d31bd 3f000000 3f400000 00000000 -> 3e46b0f4 3f13d5b4 be2d31c0", + "3e9acabb 3f4f2201 3f51a80a be78024f 3e5ed720 be5c77be 3f18a253 -> 3f525910 3f4ea3cc bc95c600", + "3f0b1a71 3f8608ec 3e579211 3efda7a1 3eaae012 3f691f36 3e8cae58 -> 3f84f0c2 3f19e5da 3f121cee", + "3f986784 3f60a018 3f733c07 3f60a018 3c345abd 3e93e9c9 3e93e9c9 -> 3f61095e 3f77a01f 3f6b6ada", + "be1abca6 3f7ecae8 3d5ac422 3f9a1b85 3f812d71 3e140394 3f699f06 -> 3f7e9bc5 3d061420 3f9db52e", + "3ef45097 3e203ca6 3f958fb8 bdec76c4 3eb08f6d 3f556494 3dedf76d -> 3e972f74 3f8cfc34 bd5b9a00", + "3e0a5dd2 3f1e736f 3f1e736f 3cd9cfe8 3eb6b821 3f10b595 3f880498 -> 3f2327a9 3f25e6df 3e2a59d4", + "3f88cbb9 3f30ab60 3f30ab60 3f9ef1c8 3e800000 3f000000 00000000 -> 3f45dd6b 3f5b0f76 3f9ef1c8", + "3e8cbef2 3f0a9e8b be3f52ab 3f9f8e87 3d1a37c2 3e371faf 3f4289ed -> 3f0bd58e be0393e8 3f98f6f3", + "bede3440 3d301649 3f565584 3f96e2b6 3ef43972 be08db77 be08db77 -> be1ed920 3f58c034 3f958ee3", + "be123b79 3ebf4e43 3ef07595 3f10c00a 3f8c0879 3f8c0879 3f8a5c10 -> 3e8d3426 3ec6095a 3eff2796", + "3e835d96 3f755b1e 3f8d3b5c bd834c36 bd63baad bddbe379 bd63baad -> 3f75343f 3f8d98ac bda262a0", + "3df8f129 3f42a7cf 3f74302a 3f42a7cf 3f187039 3f12ff04 3f3af9ea -> 3f47187d 3f750338 3f481a06", + "bea48159 bd5b0def 3f4a52a4 3f4a52a4 3f3fd8bc 3f8c5152 bd3f99c6 -> be9d4154 3f376aae 3f4b212b", + "3f8e1f25 3f93e26c be25a4af 3f094dce 3f81a463 3f81a463 bc3a3d30 -> 3f7b0bc6 3f928634 3f07ce4c", + "3fbba061 bd976158 3f670a26 3e5eeafb 3e960609 3ee4770e 3f8346b7 -> 3ec651ae 3f775da7 3fb26734", + "be94fbaa 3f45f69e 3f500e8c 3f45f69e 3f36c11e 3ec3abf2 3f36c11e -> 3f39e854 3f4ab9ad 3f39e854", + "3fb56bc0 3f77c0b8 3f8d5beb 3f8d5beb be24cded 3f1950d7 3f1950d7 -> 3f75df1d 3f8204f7 3f8204f7", + "3f9de907 3f54fe3d 3f594e31 3f3ef8e3 be385f7b 3f1bbb2e 3f1a9c51 -> 3f4b70b2 3f765840 3f6f6c3a", + "3fa0ece6 3d6fea83 bdde2e29 3f894afd 00000000 3e800000 3f800000 -> 3d6fea80 3e75ad54 3f7b381c", + "bced23a4 bd296e93 3e5cabd2 3f391c07 3f8ea7f0 3dacf5a6 3f6d47ac -> bd9985b0 3e5ab50c 3f37351a", + "3fbf5596 3f82d397 3f1a1b9f 3f96b196 3f84707c 3f366640 3f366640 -> 3f7ce8e9 3f835047 3f7d0c47", + "3fb71157 3e07842a 3f88078f 3e07842a 3e24c059 3d8ba857 bd81e709 -> 3ea9fb46 3f873f15 3d5ba970", + "bea2341e 3de9d23e be436c12 3f9dc9f9 3f62bf11 3f5fb5ea 3f62bf11 -> be099ed8 bf0540dc 3fa625d6", + "bdf29389 3e7e3ae5 bc65c62c 3e7e3ae5 3f92862d 3eb078da be201bbd -> 3e15dc00 bd6301e0 3e863e30", + "3fa371ba bd974ff1 3f815154 bd974ff1 3f8e8acb 3eacd7e9 3f8e8acb -> 3fba0100 3f80bfeb 3fba0100", + "3fbf28b1 3f4bacb3 bc153789 3f4bacb3 3f3fa410 bd04e5f4 3f65475b -> 3f83162b bd6d9620 3f88d4c2", + "3fa22b3e 3e5821f9 be7f930e 3e5821f9 3edda270 3f964942 3f54c93c -> 3f24cc80 3fcdfab8 3f855c2e", + "bef21285 3f9ac294 3f9ac294 3f18dfc0 3f03194a 3f344f43 3f62fbfd -> 3fa13d41 3fa3abdf 3edb4908", + "3f0e201a 3ee7d4d2 3ee7d4d2 3f8c9d76 be6125ff be6125ff 3d2f833c -> 3ec5a1bc 3ec5a1bc 3f8c50a2", + "3f61ccb4 3f166215 3f9217e9 3f166215 00000000 3f800000 3f800000 -> 3f166215 3f82226d 3f738a55", + "beb7f886 3f560758 3f560758 3dd9d509 3f98865d 3f973b56 3f9ab39b -> 3f440ee0 3f4435e0 be903d94", + "3f3a057c 3d848bfb 3e769d05 3e1800f0 3eff808e 3f2b0476 3eff808e -> 3ecec7cc 3f1bfe8d 3eea1a1c", + "3f5861f2 3ecac858 be2510a7 bc3d90f9 3f48a1e2 3e76da1a 3f1baabd -> 3f4bcf3e 3d9a7010 3f022314", + "3f83a4df be288191 be288191 be4b4608 3f84183d 3eb07348 3f84183d -> 3f8925de 3e7e2aa8 3f896a25", + "3d51f4a1 3f399772 be13c5f8 3f399772 3f0849e6 3f448fcc 3f0849e6 -> 3f3b8351 bdcb4f90 3f3b8351", + "3fbd379b 3f8c32de 3eac3d3f 3eac3d3f be4ba16a be4ba16a 3f202900 -> 3f8fc8e0 3e10b954 3f733b35", + "3f5ddfd1 3f787ca7 3bbdd19b 3f3d6217 3ddd65a2 be4f6c25 3ddd65a2 -> 3f7930db be2ccc88 3f439fed", + "3fa9d2db 3f791d4d 3f7907a8 3d9a6b8e 3ba3b972 3ba3b972 3f473cc4 -> 3f7928fc 3f79137c 3f83dac0", + "be30589f 3f7b4197 bd9c4189 3e24a8b4 bd5cf89d bd5cf89d 3f46d212 -> 3f7b4cdf bd87c700 3d46e530", + "3f9529c4 3edfc85a 3f9dd40f 3eb9cdcd 3f400000 3f400000 3f000000 -> 3f6dd7bc 3f83c21f 3f3bef1e", + "3f7d70b2 3afb251d 3eb8be96 3eb8be96 3f000000 3f000000 00000000 -> 3efdef86 3f2d5e38 3eb8be96", + "bea2ff06 3e6aa52e be54ffca be54ffca 3da2e152 3f0847fe 3da2e152 -> 3e56a8dc bed351c0 be745198", + "3fbc722e 3ec53527 3f3c58aa 3ec53527 be3003ea 3efac245 3f9ad3fd -> 3e6b1758 3f6d20b6 3fbd72af", + "3e81689a 3f51af90 3f51af90 be028626 3e9cea4f 3f452de8 3e90ab63 -> 3f5545fc 3f5ab3bd bd404960", + "3f5b74f8 3f9d4380 3f9d4380 3ede4fa1 3f2eab5f 3ecc8165 3f2eab5f -> 3f8c25ad 3f933e59 3f43e03e", + "3f9643ee bd83fa2a 3f34c1ed 3d15ad8e 3f445ef3 3f445ef3 3ea73ac1 -> 3f64e34a 3f788384 3ecfdac0", + "3eee1673 3f7da1ca 3eb1ff71 3e9c5a72 3f0531bc 3f8c669e 3f8e5167 -> 3f7e3475 3f2e2e39 3f2a1dec", + "be8e5392 3f48a9e9 3f2fcc72 3f48a9e9 3e6f0c13 3e46b2ba 3e46b2ba -> 3f4512a1 3f2b78fa 3f45adcb", + "3fbf76ac bdd904e0 3ee75562 be2f25b4 3f41d541 3ed4a1b2 3e98975a -> 3f92c446 3f4ad7a0 3eb3b6b0", + "3e88a56c bcae3b79 3f67a3ec 3f67a3ec 3ecf663d 3dcf0b37 3ecf663d -> 3db68f50 3f684c2e 3f6a461a", + "3dd03265 3d622849 be7dbb78 be2106fb 3dd3d7bd 3e87f5bc 3dd0635f -> 3d856ce0 be5b3d60 be14c4f0", + "3ca4012a 3f8b354d 3f8b354d 3ef1473f 3f8cbe4c 3d817e91 3f5e50bb -> 3f8af623 3f8b31ab 3ef5fc2c", + "be16e9fc 3e6c53bc 3e6c53bc 3edf6325 3f000000 3f400000 3f400000 -> 3e3248e0 3e154370 3ebf7c72", + "3f80966b be3abf73 be3abf73 3f3188a1 bc4ae949 be210682 be0e862a -> be49cfc0 bebd01b8 3f268ff6", + "3ea15640 3ecd1a13 3f78d69f 3f78d69f be37ec4f be37ec4f 3f7afd24 -> 3ebbbb6a 3f786edb 3f7b0d08", + "3f2f5f08 3de15a9e 3f13a086 3de15a9e 3f7b6ba0 3f42ba4a 3f1474bf -> 3f357387 3f4c1927 3eed5aec", + "3fb99cb2 3e96b826 3e96b826 3f4644e9 bd9fc046 3f37f21b 3eaf2495 -> 3e5bb544 3f83c9eb 3f62e7f7", + "3f81f529 3f94b983 3f7967cc 3f94b983 3e2f22ca 3f2402be 3e2f22ca -> 3f91203a 3f7db1ea 3f91203a", + "3ee737ce 3f53fc42 3f53fc42 3dad2e6e 3f65318c 3ef44507 3f0dd7fe -> 3f65c7ea 3f5d77eb 3ea09318", + "3f7d7753 3f9d5bb9 3f9d5bb9 3e512df4 3b6599e1 3f397b2b 3b6599e1 -> 3f9d41a7 3f884c36 3e540184", + "3f98131f be4caf13 be4caf13 3f65c152 3f01be9c be4985f6 3e77bdb9 -> 3f05c9d6 bef5fbf8 3f6d4c87", + "be350b09 bde45ca6 bc924c12 3ecea8e6 3f65159f 3ef26d3d 3f4f19d6 -> be932084 bdd31480 3ea2fcbc", + "3f3f87a5 3f1ca5fe 3f7d4052 3ea09e18 bd5b6de0 bd2a60b3 3e9cb88d -> 3f18aa97 3f7d2a6c 3ef11664", + "3f739541 3f6904a2 3e35db98 3f6f2109 3f31fe76 be14392c 3f31fe76 -> 3f7838dd 3d83bde0 3f7a4a50", + "3e75cea0 3f41d345 3f87ea6e 3f87ea6e 3dfdbf36 3e58fa4f be717b1a -> 3f43aca9 3f87835c 3f885d24", + "3f0bc11b 3f9c09af 3f850a44 3f850a44 3eba2b96 3f8e3acd 3f165274 -> 3f9678e6 3f81fb96 3f836ca9", + "bead07b6 3f2bbffc bcf7003c 3f2bbffc bd8356ed 3f476537 3e45141d -> 3f2d936c be9a45b0 3f26452a", + "3faa8996 3f79a4ae be2a4958 3e317361 be7c284d 3e46d88b 3e46d88b -> 3f778ec9 3e0ab260 3ec63bec", + "3d2f4470 bda4a210 3f83aca8 3f99124c 3f400000 3f000000 3e800000 -> bd3b3fa0 3f839888 3f98cda3", + "3f757f33 be6ed72b 3f0539d1 3f9b3419 3d82601d be3630f7 be3630f7 -> be21bf18 3ee08e50 3f9fd852", + "bd19b19a 3bcd06f1 3f3d3860 be617db0 3f19bb94 3f19bb94 3f831286 -> bc842e00 3f3bb728 be88c01c", + "3faf6882 3f8ccb35 3f54877c 3ed48fc1 3f329725 3f329725 3f9daf03 -> 3f80901b 3f7e165a 3fb3842c", + "3d83c977 3ea0848f 3f2cd9c5 3f2af321 3f053b14 3f053b14 3f9b33da -> 3eac49ec 3f2fa2a2 3f3195f2", + "3b266c8c 3f81f8cd 3ea0a9cb 3ea0a9cb 3e8aa173 be71aee1 3f75675d -> 3f81f874 3ea073e4 3ea184c0", + "3eaf754a bd2e058f 3e124c46 3e124c46 3e980f7e 3f8b6252 3f8726cf -> 3d8248d0 3eecea40 3ee7f134", + "3fae71fb 3f99453d 3e6e4e9d 3d0cbeba 00000000 3f800000 3f400000 -> 3f99453d 3fa3a2ec 3f82bc8e", + "3f5e4678 be76dc74 3ea74975 3f8406fd 3f80a431 3f9fab73 3f9fab73 -> 3f5786ff 3f87290f 3f7f54ad", + "be489855 3f1dbeee 3eab9b75 be312f67 3f492b6f 3ea4120d 3f492b6f -> 3f0e9ef1 3e963d46 beb50bc8", + "3f9ff68f 3f767128 3f96596f 3f823176 3f419ce5 3f2aa87d 3ed4dc09 -> 3f7f79cf 3f83bae9 3f810dc0", + "3e683b34 3f57683d 3ef27290 3ef27290 3ed334bd 3ebf5007 3ed334bd -> 3f5b346b 3f04a515 3f05d51c", + "bdf03540 3f92b72b 3f0eccec 3f0eccec 3db79991 3f9711aa 3db79991 -> 3f92e98c 3efe42d6 3f0d9c37", + "3f914d21 be242e4c 3f9244a9 bdc7f8f0 3e52624c 3e99b44d 3e99b44d -> 3de1dc88 3f8c0af1 3e8d8606", + "3f890f44 3f11651c bdf0d88a be6e69fa be1cf58a be1cf58a be5ed4f7 -> 3efe7b9e be9a20cc bf052486", + "3fb5953d be7fa48c 3f29920c be7fa48c 3f800000 3f800000 3f400000 -> 3fc2f5c4 3f921726 3f8a3b2e", + "3f265ae6 3ee45f54 3f93ff39 3ee45f54 bdda95d8 3db02b9f bddf2637 -> 3ed0b370 3f92e111 3ed04a4c", + "3fb52e03 3edc276a 3f35f914 bd9a74b2 3f6ed1e7 3f672754 3c94586e -> 3f9761e2 3f8a4b00 bd440140", + "3fa087aa 3f457042 3f7c8df8 3efced38 3f602ad8 3f8f2f75 3e7adbf1 -> 3f82e00a 3f80b1b2 3f264313", + "bed76a4a be2a1ac5 3e899656 3f56fcc1 3ee79e9a 3f66c5f4 bdba52a2 -> bec6b0bc bc0d5b00 3f588ea4", + "3eb689b8 3f9fe5dd 3f67e047 3f3cfec3 3e6118f9 3f84309d 3f84309d -> 3f9d65e6 3f70c21d 3f55aa68", + "3f5a3904 3ee81a38 be2fdaa2 3f581017 3d9f3ad6 3f78d1a0 3f78d1a0 -> 3efaa720 3f4c8ffc 3f7926cf", + "3db98b50 3f136b37 bd97f69f 3f9303f4 00000000 3f400000 3e800000 -> 3f136b37 ba9eb000 3f9295b2", + "3fbe3547 be435aed be435aed 3f6705ff 3cd6621e 3cd6621e 3ec3d253 -> be13efb8 be13efb8 3f7537fa", + "3ec5ed59 3f785999 3f5fe97e be412554 3f7000a2 3df6e3f3 3d1ace35 -> 3f7b1f5c 3f61684f be2f5ce0", + "3f90d415 3f976d92 bd7eb53a 3f976d92 3e25340a 3e25340a 3f49620f -> 3f9326c3 3e06dea0 3f829348", + "be865499 be4116ec 3f520eb0 be4116ec 3f3bdcd6 3f3bdcd6 3f6c4223 -> bed5b5b0 3f493640 bef3e490", + "3e0833b9 3e2584f5 3f9e13e3 3f9e13e3 3f800000 00000000 3f800000 -> 3e8bda54 3f9e13e3 3f9a13ba", + "3cbabc49 3f751947 3d6a8c55 3d31e1c1 3f3e3ce1 3c9c9008 bd2faf88 -> 3f75488d 3d6c3af0 3d2e0d00", + "3f0e1d93 3f47d606 3f47d606 be34618e 3d99f0fe bc2fb8b8 3f92c432 -> 3f4a2dfd 3f47806b 3f128f84", + "be99b689 3e40c134 3ee45600 3ee45600 3ef05928 3f03349d be53bc48 -> 3d9735d0 3eb8b04c 3ef5f1f2", + "3dca0412 3f33349a 3f322c01 be5f26c7 3f833af1 3eaf9dc6 3f8f6218 -> 3f3af8c1 3f34ce1c bdaab1c0", + "3fb0ed6b 3f7b79d6 3ec15969 3f4d92e7 3f802dce 3f4e9425 3f4ac0c7 -> 3f80de78 3f89316e 3f826388", + "3f890285 3f95ee15 3e708c18 3f95ee15 3f260e21 3f260e21 3ee09bab -> 3f86b429 3f442079 3f8ba1e6", + "beeff5f9 3e8e2151 3e91a692 3e8e2151 bdbd5cf7 3eb0c966 3eb0c966 -> 3e9e2888 3e2cbb30 3e248cf8", + "3f1b91cf 3ea45ebd 3f0d9ffe 3f0d9ffe 3f8ace0f 3dee8e93 3f26d943 -> 3f44ba40 3f15b89a 3f3aecce", + "3e81f228 3f35f2da 3f35f2da be718248 3f24e41c 3edd7421 3f1aa6dc -> 3f420ddc 3f3e13e2 bd3de8a0", + "be26a2b9 3d7a1d1c 3f986370 bcbf7857 3d9251c7 bd2819e6 3cb9f6e6 -> 3d4d6690 3f9839be bcde7040", + "3f9cdb80 3f8837db 3f8837db bdc4bb5d 3f9a8622 3f64dc71 3f64dc71 -> 3f781ee4 3f7e6e02 3f8d6749", + "3fb36a0d 3d877989 3d877989 3f8a1beb 3f000000 3f400000 3e800000 -> 3f387afb 3f862070 3f869110", + "3f04d83b 3f486312 3f8aaaeb 3c9be4bf bd425198 3ed7fd87 3f3f9e2b -> 3f470494 3f885517 3eccd448", + "3f5ed76c 3eeffc5b 3f25f18d 3f25f18d 3deeed42 3eb9e395 3eb9e395 -> 3f05ce04 3f4267a4 3f4267a4", + "3f928026 3f833775 3d30c5e7 3efd6ae8 3f0ff56d 3f0ff56d 3ee05fce -> 3f812577 3f28b40c 3f3f8eba", + "3e77b741 bcf44e10 bd7c28a4 bcf44e10 3f2aa895 be3ca73d 3f2aa895 -> 3e0b85cc bddef910 3e0b85cc", + "becc93fd 3f6b3da8 3e9816d6 3e9816d6 3f24527e 3f2ac498 3ef8544c -> 3f65eaa9 3de0a3f0 3e24addc", + "3f83437c 3ee3aac6 bdaf58de 3f260d16 3c9fdebc 3f82ef46 bda71e39 -> 3ee95b80 3f86cf69 3f1e862a", + "3cf6ab95 3f7870fb 3f7870fb be3aa174 3f4e99e1 3f4e99e1 be4c3a12 -> 3f78a001 3f78a001 be41e698", + "3f030881 3f631507 3f1a83a8 3e98fdc0 3f5ce7e7 bd7b64dd bd7b64dd -> 3f6fdac8 3f17537c 3e8db684", + "3f1a994c 3ef2163f 3ee0e681 3ef2163f 3f15e946 bdcdf321 3f502862 -> 3f28c4f6 3ecf770e 3f3b5014", + "befa743b 3de8ddc2 3f502c29 3f02eeeb 3f000000 00000000 3e800000 -> bdd31630 3f502c29 3ee746f8", + "3d6bd735 3ec8aa72 3f110d96 3f92d278 3e9f9096 3e9f9096 3f7ec37e -> 3ece40a2 3f130b3f 3f91be5f", + "3f6b19d0 3f785733 3f57b317 3f57b317 3f800000 3f800000 3e800000 -> 3f7f5fed 3f7cb5c1 3f60f3c2", + "3fa4bc4e 3e8d43b1 bcaeb6d8 3f8cf372 3e4514d3 3dfbdad5 3e4514d3 -> 3ee91850 3e0faf74 3f89be37", + "3e50ac60 bc1ab030 3d1b50c9 3d1b50c9 3f0b796c 3f9c211d 3ee364c5 -> 3dd230b0 3e8ddabc 3dfffc20", + "3f382704 bdb689a6 3f340845 3e903f24 3d5f54fa bd5c851d 3d5f54fa -> bd3e1a80 3f311719 3e9eabae", + "bdccdee5 3cf5e796 3f9e207d 3e49d259 3f6302f0 3ea120a0 3ea120a0 -> bd657c20 3f9f1349 3e2ff04c", + "3e30eaf7 3e622cb4 bca41850 bca41850 3f1d99e5 bdd06f5f 3f1d99e5 -> 3e9b8454 bd1b8360 3db52be0", + "bdbdc88a 3eaf00c1 3f967bed 3f22de4b 3f7c7267 bd3ba960 3e9251dd -> 3e903526 3f96637d 3f2066e6", + "be3ec6d3 3f873e93 3f168bbf 3f168bbf 3f3c68d5 3f3c68d5 3f80092e -> 3f883cde 3f081621 3f02e4ca", + "3c4fef51 3f836f73 3d92587e 3eb3ecbe bdd71292 3e4e6c42 3f992a35 -> 3f83709f 3d9735f8 3eb8f7c2", + "3f42d2db 3f8008e7 3f8008e7 3eb31d04 3e8ff447 bd953879 3e8ff447 -> 3f8006ff 3f800965 3efa5776", + "3e41b557 3cfa028c 3f9c6245 3cfa028c 3d8d6434 be66a974 3f68926e -> 3d30ddb0 3f9d97e5 3e49dc8c", + "bc2267f2 bdee278a 3e0205af 3e0205af bc8bf24d be1caf10 3ef519e3 -> bdedc470 3e0360cc 3dfb8f68", + "3d7ba571 be6b66d7 3f36ce5c 3f36ce5c 3e239934 3f9c7961 3edaa511 -> be5f0a48 3f3c4da2 3f38b9f6", + "3e37d75f bd368ec5 3f5ac25c 3f5ac25c 3eee5ef8 3e7131f3 3e20f2b0 -> 3d2f1070 3f5c5583 3f5bcf62", + "be3da607 3dde738c be545900 bd732004 be0f95ef 3f331d8e be00ff3f -> 3e06ee0c beba4718 bd0de3c0", + "3fb62266 3f25d62d be4b0002 3f5396a8 3f2bd0c1 3f2bd0c1 3f33b0ca -> 3f7bf15c 3f723261 3f7ff210", + "3f301480 3e284205 bd95993d 3f289d6e bd1bfdf5 3ed87366 bd1bfdf5 -> 3e11d78c 3e74b4b0 3f265370", + "3f55796a 3f5f2a72 3eda82a9 3f5f2a72 be2fd78c 3f44059e 3d0cc232 -> 3f5a76d0 3f4af42b 3f601b51", + "bec188e7 3f833085 3d1eeb93 3d1eeb93 3f6e299e 3f7288c7 3f89976b -> 3f844fa8 be9c6034 beb419b0", + "be23888e 3f9acb3c 3e8d93b1 3f1664c3 3ed28889 3ed28889 be4025a7 -> 3f9c8dac 3e6a80e4 3f198eec", + "3f190592 3ea4cf59 3e4303b1 3ea4cf59 be732ca3 bd913bd4 be732ca3 -> 3e670db8 3e1fdff4 3e670db8", + "bebf969e 3f194fde be001b06 3f194fde 3f5a1c0d 3f47ed08 3f5a1c0d -> 3ef125d0 bee864e4 3ef125d0", + "3f5f4884 3f27d79e 3f543f88 3f543f88 3e3fcbe5 3e3fcbe5 3f482898 -> 3f363e7c 3f5b6549 3f7215a7", + "3e057584 bdee391b bdee391b 3f097a8c 3f400000 00000000 3f000000 -> bbebfa00 bdee3920 3f1133c4", + "3efcf7a2 3dbec8ca 3e78e712 3e2faf7a be7bdce9 3e90523a 3f5d837a -> bc8ba440 3eb26cc2 3f0696c1", + "3fb78d5f 3f4747d5 3efd7e15 3e605d89 bd327379 3f907da2 3f907da2 -> 3f43bcae 3fa7fce6 3fbdd8c4", + "3faa9004 3ebab545 3f870cc0 3ec62f1b 3e878376 3f9d540a 3f9d540a -> 3f16b77c 3f7701bb 3fb20a74", + "3f22029d 3f928dd0 3f1ae288 3f9df886 3e800000 3f800000 3f000000 -> 3f8f9e54 3f5ae036 3f947cbc", + "befe89e2 3f9b26c5 3f1c8d9d 3e12a841 3f9496fb 3ed122f5 3f9496fb -> 3faad22a 3f085bce beb3d5d8", + "beffbf42 3f862281 3f862281 3f7e6063 3f87c1c3 3ea81b10 3f87c1c3 -> 3f896285 3f872412 3f7d8434", + "3e4e9508 3f41f12a 3f4cd7db 3f4cd7db 3d6dac1d be649651 3f2e7cdc -> 3f42ab23 3f4a8a14 3f53e0a3", + "3f46b972 3f7957de 3f635d9d 3f7957de 3f400000 3f800000 3f800000 -> 3f7d3804 3f7997f4 3f7e82bb", + "3f58fa9c 3efa1cf6 bd0245f9 bd0245f9 3ebe34ba 3d4f4923 3f9df79c -> 3f26496a 3c4c0480 3f861382", + "3f9ba82b 3f8f6757 3f845e3e 3f9196a2 bda5022c bda5022c bde23a93 -> 3f90e9b5 3f84cbcf 3f93f37a", + "3f8a40ec bd8b40ad 3ef4546b 3ef4546b 3e4daa03 3e4daa03 be602cfb -> 3e279df4 3f1732b6 3eb50970", + "be71f27f 3ed103d9 3f98fdaa 3f5e6740 3e8f2667 3f82f649 3f82f649 -> 3ebcffea 3f9f0843 3f564812", + "3fab6612 be34227b 3e75ed37 be34227b 3d2372a4 3ecff4e2 3d2372a4 -> bde79610 3f27468e bde79610", + "becaa1d0 3f1c6dd4 3eb74c55 3f1c6dd4 3f8ec927 3f2a9854 3e9293fa -> 3ee0f0be 3e413798 3f1125be", + "3f1c2a61 3f8cb338 be683fa8 bdad0965 3ef10daf be7591c6 3f251454 -> 3f890d76 bed00384 3eaf295e", + "3ea8130f 3f0100fc 3f0100fc 3f863e1d 3f000000 3f800000 00000000 -> 3f15d930 3f2ab164 3f863e1d", + "3d95be8d 3d835983 3d835983 3eb0080b 3e19e7cf 3ef06f64 3ea618d2 -> 3d986998 3dc528d8 3eb80026", + "be8d8cfa 3e28d2b7 3e2b5962 3f1470d7 3ee41bc7 3f506611 3ee41bc7 -> 3d7df4b0 bca46200 3f073144", + "3ea76e94 3debad98 3f1d6546 3f1d6546 3e2636da 3eea245b 3f1c57c6 -> 3e25f04c 3f2c2440 3f311694", + "be002f94 3c29ebb1 3f729618 3f729618 3f7f0f1e 3f01d613 3f01d613 -> bde78a40 3f71bc14 3f71bc14", + "bec38931 bd89cf05 3f95bad4 3e9e23be 3e97b64e 3ee0f93e 3e97b64e -> be4094d0 3f996054 3e6c30e8", + "3fad0b45 3eedff47 3e4c5a71 3f9696ca 3e9427b9 3f7e0617 3f741dec -> 3f2c97c7 3fa2fc52 3f72efc7", + "bda2c7f9 bc101958 3f3cd802 3e153286 3f000000 3f000000 3f800000 -> bd483ce0 3f3a2cc6 3d9f54b0", + "3f8c538a 3f5d55a7 be19e3d0 3e5fb531 00000000 3f800000 3f000000 -> 3f5d55a7 3f8e2dc3 3f2598d0", + "3ee5fa47 bddded03 bddded03 3ef541ec 3f0e4220 3f0e4220 3f852c63 -> 3e2c5460 3e2c5460 3f38f502", + "bec1c2da 3eef6857 3eda80c1 3eda80c1 3e078ae5 3f0a6acf 3e078ae5 -> 3ee1c0b6 3e9e729e 3ecbcd0a", + "3eea97a6 3e6685d8 3e6685d8 bdae95a4 3f436e31 3d89c977 3b5ad149 -> 3efe0874 3e7efb98 bdab2f30", + "3f9b457e 3f3e129a 3f3e129a bddb7691 3f400000 3f000000 3f800000 -> 3f7a0d8d 3f660f3c 3f9e31a0", + "3f1ecc5a 3ed3a100 3f70b831 3ed3a100 3f223c8c 3f939d94 3f939d94 -> 3f24da9c 3f7ba690 3f554082", + "3f8dc912 3cad7f86 be3df73e 3f2708df 3e62b17d 3eadc378 bdadebcb -> 3e85bd0c 3e8533b4 3f1eaa74", + "3fa13984 be5e9b20 3f15306c bdaa4967 be77cc34 3f0e5e84 3f0e5e84 -> bf16a4c8 3f600222 3f2cf2bc", + "bdb4e14a 3f88a19e 3e0c0ad6 3f5b0da6 3f8a1356 3f8a1356 3f29d3e1 -> 3f897422 3d5f4d40 3f58e37a", + "3f88f13f 3f1dc3de be6d0d66 3f1dc3de 3d8e40a5 3f049dd2 3f049dd2 -> 3f2510ac 3ee6ed38 3f543592", + "3f49bbb5 3f970d74 3f9a9c12 3e4122c6 3f850bc1 3f27bfdf bc9f4195 -> 3f842ba9 3f8cde8a 3e346850", + "3de74426 be5a1f16 be5a1f16 3f06e815 3dc1c94c 3f27713c 3f27713c -> be4cd970 bdfcc1f0 3f0fd9ba", + "be2f84ce bdcfd217 3ef22260 3f0b7eff 3e8f7e24 3e7705dd 3e8f7e24 -> be1e17b8 3ee6f9c6 3f05e644", + "bec0157a 3d282e09 3efd902e 3f733dc4 3f40d322 be588525 bdf6316e -> be6b6ff0 3f090836 3f73d112", + "be0c575b 3e9aec78 3e9aec78 3eb67c91 bd97f77e be533fc9 3f989b6d -> 3e9e8e16 3ea50500 3e80a4f4", + "3f9f961b be61054f 3f94ca11 be61054f 3eddf9d8 3eddf9d8 3f88dfd0 -> 3ee10ec6 3f898d51 3fb405d8", + "3fa61766 3e19c41f 3e19c41f 3dddd7fa be5ee447 3f9c7007 3f266d09 -> bdb80d20 3fbfbb16 3f5c4a5e", + "3dae53b2 3e01b4ad 3cdf28ee 3f9b9cee 3e28da72 3f6d2433 3f41e6ff -> 3e0e4210 3dd4e030 3f99d52d", + "3f14e40d 3f695aff 3f58b5e1 3f695aff 3ea39169 3dc89336 3f249f9d -> 3f6d901b 3f5af2cc 3f71d31e", + "3eaf4d0f 3e935cc6 3f82d7ef 3e3de61b bdeeb8e7 3dd48101 3f244d64 -> 3e84cf52 3f82be13 3eba9814", + "3d65316e 3f026aa0 3ee3fd11 be5acc2d 3e66df17 3f4c6cdc 3f1a14a7 -> 3f040036 3ef0adc8 be30f138", + "3facd4fb 3f22e94b 3f23b33d 3e655188 bdf4de75 3f135800 3f135800 -> 3f13e202 3f6b6e5f 3f53ba06", + "be4c79a9 3f72a491 be45734b be5d56ba 3e1e8c31 3d014a26 3f1f4232 -> 3f723ad9 be4d2628 bebc0500", + "bdc3aae9 3f5fbdc5 3f5fbdc5 bc070c2f be24d619 3f82d312 bda24974 -> 3f603cc7 3f5c975c ba1fc800", + "bdc14ac9 3d6bb0a2 3f6fce5c 3f6fce5c 3e62a7b5 3f7ddf8b 3f5f51c4 -> 3d1b0bb0 3f6e4a57 3f6e790a", + "3e190d73 3e783bc8 3e783bc8 3f9f1bd3 3ef29c8d be27e98d 3ef29c8d -> 3e97969c 3e65386c 3f9ce7cb", + "3f4a1fe6 bde0e104 3f894ea7 bde0e104 3f7c1b56 3f7c1b56 bd0855d0 -> 3f40cc26 3f82120a be0e4e20", + "be6a014c 3bd87ca7 bd6f02fb 3bd87ca7 3f329268 3f329268 3f1812e7 -> be1b62c8 be6881e0 be035310", + "3e95a4de 3df93dba be67ad19 3f0165dd bcd6730f bcd6730f bd749cf0 -> 3deb7a88 be714890 3efe6050" + ] + }, + { + "function": "cycles_mix_overlay", + "node": "ShaderNodeMix RGBA OVERLAY", + "cases": [ + "00000000 00000000 00000000 00000000 3db2343a 3e1fca4e bd838629 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f800000 3e800000 3f400000 -> 00000000 00000000 3ea00000", + "3f800000 00000000 00000000 3f000000 be69c43a 3df4f957 3e852d62 -> 00000000 00000000 3e852d62", + "3fc00000 00000000 00000000 3f400000 3e536d5a 3e536d5a 3f5c4b6f -> 00000000 00000000 3f829c4a", + "bf000000 00000000 00000000 3f800000 bd00231a 3f25f532 3f25f532 -> 00000000 00000000 3f800000", + "3e800000 00000000 3e800000 00000000 be457454 3f3bce87 3f3bce87 -> 00000000 3e8ef3a2 00000000", + "3f400000 00000000 3e800000 3e800000 3f400000 00000000 3f400000 -> 00000000 3d800000 3eb00000", + "40000000 00000000 3e800000 3f000000 3efba1d7 3f956106 bddf626b -> 00000000 3f6ac20c bf37d89c", + "00000000 00000000 3e800000 3f400000 3e800000 3e800000 3f800000 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3e800000 3e800000 00000000 -> 00000000 3e400000 3f800000", + "3f800000 00000000 3f000000 00000000 3ec3eebb 3f449e78 bd64683c -> 00000000 3f449e78 00000000", + "3fc00000 00000000 3f000000 3e800000 3e124826 3ec0222f 3f98941a -> 00000000 3ea03348 3f44de27", + "bf000000 00000000 3f000000 3f000000 3f000000 3f400000 3f000000 -> 00000000 3ec00000 3f000000", + "3e800000 00000000 3f000000 3f400000 bd88bf3e 3e9c2ed6 bd88bf3e -> 00000000 3ee70bb6 3f2ddd03", + "3f400000 00000000 3f000000 3f800000 3f3d1638 3f7e5353 3f43e1f7 -> 00000000 3f5ebe7e 3f800000", + "40000000 00000000 3f400000 00000000 bd98bcc0 3f17ffa2 3f29edc0 -> 00000000 3f57ffa2 00000000", + "00000000 00000000 3f400000 3e800000 3f82803c 3dad75b9 3eaad946 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3e1e192d 3ee7bfc7 3e1e192d -> 00000000 3f3cf7f9 3ea7864c", + "3f800000 00000000 3f400000 3f400000 be15dac0 3f9d1634 3eab5d12 -> 00000000 3f8e8b1a 3f2ad744", + "3fc00000 00000000 3f400000 3f800000 3ee07aea bcdf3596 3ee07aea -> 00000000 3eb5897e 3f800000", + "bf000000 00000000 3f800000 00000000 3f8e0e14 3c028f3d 3f6ccf9f -> 00000000 3f800000 00000000", + "3e800000 00000000 3f800000 3e800000 3f000000 3f000000 3f400000 -> 00000000 3f800000 3e900000", + "3f400000 00000000 3f800000 3f000000 3e800000 3f000000 3f400000 -> 00000000 3f800000 3f300000", + "40000000 00000000 3f800000 3f400000 3f869d89 3f1a0259 3f1a0259 -> 00000000 3f800000 3f5a0259", + "00000000 00000000 3f800000 3f800000 3f2d5e6a 3f286189 3d454f97 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3e800000 3f800000 3e800000 -> 3e400000 00000000 00000000", + "3f800000 3e800000 00000000 3e800000 3f000000 00000000 3f800000 -> 3e800000 00000000 3f000000", + "3fc00000 3e800000 00000000 3f000000 3f000000 3f800000 3f400000 -> 3e800000 00000000 3f600000", + "bf000000 3e800000 00000000 3f400000 3dd98bbd 3f6cd4c5 3f6cd4c5 -> 3eb26744 00000000 3f24cacf", + "3e800000 3e800000 00000000 3f800000 3f86d668 3f9276dd 3f86d668 -> 3ea36b34 00000000 3f800000", + "3f400000 3e800000 3e800000 00000000 3e46359f 3efe1be3 3e86ecec -> 3e0a541c 3e7e94ea 00000000", + "40000000 3e800000 3e800000 3e800000 3f0f5aa0 3f2c5c44 3f0f5aa0 -> 3e9eb540 3ed8b888 3e9eb540", + "00000000 3e800000 3e800000 3f000000 3e54828a 3e6e6500 3e6e6500 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3d007e14 3ebb4043 3d007e14 -> 3e0807e1 3e5da022 3f2201f8", + "3f800000 3e800000 3e800000 3f800000 3a86eeeb be5c17de 3f7aba0c -> 3a06eeeb bddc17de 3f800000", + "3fc00000 3e800000 3f000000 00000000 bdcf9c6e 3f4d6ff0 bdcf9c6e -> be4ddaa9 3f7427e8 00000000", + "bf000000 3e800000 3f000000 3e800000 3c0af539 3c0af539 3f18b85c -> 3ebeea16 3f3eea16 3e6747a4", + "3e800000 3e800000 3f000000 3f000000 3ed0c328 3de8cbbc 3de8cbbc -> 3e7430ca 3ece8cbc 3ece8cbc", + "3f400000 3e800000 3f000000 3f400000 bda959b2 bda959b2 3f926375 -> 3d00fcba 3d80fcc0 3f7dca98", + "40000000 3e800000 3f000000 3f800000 3f907f89 3f0fcec5 3f096ab6 -> 3f60ff12 3f1f9d8a 3f800000", + "00000000 3e800000 3f400000 00000000 3f94335b 3ebc96ef 3f94335b -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f3b72ab 3f3b72ab 3f935701 -> 3e9db956 3f4edcab 3ed35701", + "3f800000 3e800000 3f400000 3f000000 3f000000 3f000000 3f000000 -> 3e800000 3f400000 3f000000", + "3fc00000 3e800000 3f400000 3f400000 3e850574 3f6fb671 3f6fb671 -> 3d8f105c 3f89e46a 3f89e46a", + "bf000000 3e800000 3f400000 3f800000 3e19f59c 3f6a6e79 3f4e2e91 -> 3eacc14c 3f256462 3f800000", + "3e800000 3e800000 3f800000 00000000 3f091dea 3edebe09 3f091dea -> 3e82477a 3f800000 00000000", + "3f400000 3e800000 3f800000 3e800000 3f3f2ce2 3f3f2ce2 3e6d3712 -> 3eaf61aa 3f800000 3e18f4a7", + "40000000 3e800000 3f800000 3f000000 3f6b4011 3f6b4011 3f804e17 -> 3f2b4011 3f800000 3fc09c2e", + "00000000 3e800000 3f800000 3f400000 3f800000 3f000000 00000000 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 bd1d2831 bd1d2831 3f4832f5 -> 3dec5afa 3f800000 3f800000", + "3f800000 3f000000 00000000 00000000 3f8c60f7 3f8e18e3 3f8c60f7 -> 3f8c60f7 00000000 00000000", + "3fc00000 3f000000 00000000 3e800000 be3a30a1 3f701c9a 3f701c9a -> bf05d23c 00000000 3f141574", + "bf000000 3f000000 00000000 3f000000 3f72ccba 3f4f422c 3f00d4a4 -> 3e8d3346 00000000 3eff2b5c", + "3e800000 3f000000 00000000 3f400000 3db51d33 3db51d33 3f0ac5bb -> 3ecb51d4 00000000 3f4158b8", + "3f400000 3f000000 00000000 3f800000 be29924c bb98b552 3f83f4ca -> 3a524400 00000000 3f800000", + "40000000 3f000000 3e800000 00000000 3e2dfa95 3e2dfa95 3f445c77 -> be240ad8 bda40ad6 00000000", + "00000000 3f000000 3e800000 3e800000 3a9f1854 3a9f1854 3ef83e31 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 bde7adea 3f40fd6a 3f8628d0 -> 3e461484 3ea07eb5 3f4628d0", + "3f800000 3f000000 3e800000 3f400000 3f7fda35 3f7fda35 3f9690c0 -> 3f7fda35 3effda35 3f8b4860", + "3fc00000 3f000000 3e800000 3f800000 3f8eceff 3f8eceff 3ed00b66 -> 3fb6367e 3f36367e 3f800000", + "bf000000 3f000000 3f000000 00000000 3d8e0d1b 3e9f2c0a be73b488 -> 3f371f2e 3f1834fe 00000000", + "3e800000 3f000000 3f000000 3e800000 3f64655f be24c5ea 3f4f4e7c -> 3f191958 3eab6744 3e93d39f", + "3f400000 3f000000 3f000000 3f000000 3f400000 3f000000 00000000 -> 3f300000 3f000000 3e000000", + "40000000 3f000000 3f000000 3f400000 bce57215 3f431b37 3f9f1145 -> bf0e5720 3f831b37 3fbf1145", + "00000000 3f000000 3f000000 3f800000 3e800000 00000000 3f400000 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 be4e5f67 3f0a7266 3f978e19 -> 3e18d04c 3f429c9a 00000000", + "3f800000 3f000000 3f400000 3e800000 3f8f8fc2 3f4eb146 3f8f8fc2 -> 3f8f8fc2 3f6758a3 3f0f8fc2", + "3fc00000 3f000000 3f400000 3f000000 3e800000 3f800000 3f400000 -> 3e000000 3f900000 3f600000", + "bf000000 3f000000 3f400000 3f400000 3f800cd6 be271f6e 3f800cd6 -> 3e7fcca8 3f6a71f7 3f1ff995", + "3e800000 3f000000 3f400000 3f800000 3f579a59 3eefc83d 3f579a59 -> 3f15e696 3f3efc84 3f800000", + "3f400000 3f000000 3f800000 00000000 be0138de 3f56ea21 3f42e604 -> 3cf8aac0 3f800000 00000000", + "40000000 3f000000 3f800000 3e800000 3f4114d5 3f5a0b8a 3f4114d5 -> 3f8114d5 3f800000 3f0114d5", + "00000000 3f000000 3f800000 3f000000 bd5000b5 3ef7be95 3f6c4293 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3e166439 bdefbcbb 3f982810 -> 3ea5990e 3f800000 3f6c1408", + "3f800000 3f000000 3f800000 3f800000 3f94da13 3f94da13 3f85e330 -> 3f94da13 3f800000 3f800000", + "3fc00000 3f400000 00000000 00000000 3f5752d9 3f8f6da7 3f03613a -> 3f80bf11 00000000 00000000", + "bf000000 3f400000 00000000 3e800000 3cd1fe5c 3dce8f41 3f8d6c25 -> 3f5e5c03 00000000 3dca4f6c", + "3e800000 3f400000 00000000 3f000000 3f8de295 3f80a130 3eda4aaf -> 3f5378a5 00000000 3ef692ac", + "3f400000 3f400000 00000000 3f400000 3f1a063a 3f50587c 3f50587c -> 3f49c256 00000000 3f5e212e", + "40000000 3f400000 00000000 3f800000 3eeb0e8e 3f8fd19c 3f60b6dd -> 3f358747 00000000 3f800000", + "00000000 3f400000 3e800000 00000000 3e62f8a6 3f9ccf52 3e223400 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f44f367 3f44a37a 3f904578 -> 3f513cda 3ea251bd 3ed04578", + "3f800000 3f400000 3e800000 3f000000 3f000000 00000000 3f400000 -> 3f400000 00000000 3f400000", + "3fc00000 3f400000 3e800000 3f400000 00000000 00000000 3e800000 -> 3ec00000 be000000 3f100000", + "bf000000 3f400000 3e800000 3f800000 3e06f9b6 3f08d787 bda43433 -> 3f579064 3e772879 3f800000", + "3e800000 3f400000 3f000000 00000000 3ea42f4f 3f9ac745 3f820140 -> 3f3a42f5 3f2d63a2 00000000", + "3f400000 3f400000 3f000000 3e800000 3f7ea51e 3f7ea51e 3f64f18f -> 3f6f7deb 3f5efbd6 3ecbb52b", + "40000000 3f400000 3f000000 3f000000 bdbd946b 3f84335d 3f35bf74 -> 3e2135c8 3fc866ba 3f6b7ee8", + "00000000 3f400000 3f000000 3f400000 3d8cc07b 3f1991ec 3f1991ec -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f0d1352 bde9fe19 3f836cad -> 3f4344d4 3e458078 3f800000", + "3f800000 3f400000 3f400000 00000000 3ea46260 3ebc2170 3ccef67a -> 3f291898 3f2f085c 00000000", + "3fc00000 3f400000 3f400000 3e800000 3f6b8c4a 3f221df9 bd2d7f8c -> 3f88549c 3f59967b be2087ea", + "bf000000 3f400000 3f400000 3f000000 3e852c87 3e852c87 3e580bc4 -> 3f4f5a6f 3f4f5a6f 3f24fe88", + "3e800000 3f400000 3f400000 3f400000 3ea98f72 3ce7950d 3ea98f72 -> 3f3a98f7 3f30e795 3f3a98f7", + "3f400000 3f400000 3f400000 3f800000 3e10be25 3f3b3693 be2e2325 -> 3f1d91d4 3f563477 3f800000", + "40000000 3f400000 3f800000 00000000 3f800000 3f800000 3f400000 -> 3fa00000 3f800000 00000000", + "00000000 3f400000 3f800000 3e800000 3f805351 3f6a08a0 3f2ef996 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f86e0c7 be3f842c be3f842c -> 3f637064 3f800000 3e203de8", + "3f800000 3f400000 3f800000 3f400000 3f25fd79 3f80dbbe 3ef02d71 -> 3f52febc 3f800000 3f3c0b5c", + "3fc00000 3f400000 3f800000 3f800000 bc260675 3eedb091 3f931ef3 -> 3ebc1bd8 3f800000 3f800000", + "bf000000 3f800000 00000000 00000000 3f81e9ce 3f81e9ce 3ee1e0ce -> 3f800000 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 3e296dcd 3f28a69f 3e296dcd -> 3f800000 00000000 3e552dba", + "3f400000 3f800000 00000000 3f000000 3f1fcc82 3f66f084 3f66f084 -> 3f800000 00000000 3f4d3463", + "40000000 3f800000 00000000 3f400000 3db5c8dd bd977de1 bd005162 -> 3f800000 00000000 3e5feba8", + "00000000 3f800000 00000000 3f800000 3ed65a15 3ed65a15 3f336c98 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3e1d104e 3eee4c08 3eadcc4d -> 3f800000 3e772604 00000000", + "3f800000 3f800000 3e800000 3e800000 3f2aaaab 3f2aaaab 3f2aaaab -> 3f800000 3eaaaaab 3eaaaaab", + "3fc00000 3f800000 3e800000 3f000000 3f764133 3f68e4c1 3f68e4c1 -> 3f800000 3f0eab91 3f8eab91", + "bf000000 3f800000 3e800000 3f400000 3f9a9bc7 bde85ee2 3f9a9bc7 -> 3f800000 3ece85ee 3f12b21c", + "3e800000 3f800000 3e800000 3f800000 3e800000 3f400000 3f400000 -> 3f800000 3e900000 3f800000", + "3f400000 3f800000 3f000000 00000000 3e6827e2 3f79d1ae 3f79d1ae -> 3f800000 3f5b5d42 00000000", + "40000000 3f800000 3f000000 3e800000 3ecdf8ff 3e8936d5 3e8936d5 -> 3f800000 3d136d40 3c936d50", + "00000000 3f800000 3f000000 3f000000 3f0b2a39 3f966714 3f966714 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f7e38c0 3f7e38c0 3f00c76b -> 3f800000 3f3f1c60 3f4031db", + "3f800000 3f800000 3f000000 3f800000 3f956a88 3e014293 3e014293 -> 3f800000 3e014294 3f800000", + "3fc00000 3f800000 3f400000 00000000 3f400000 3e800000 3f000000 -> 3f800000 3f100000 00000000", + "bf000000 3f800000 3f400000 3e800000 3f47375a 3ec9d248 bd050393 -> 3f800000 3f46c5b7 3ec4281d", + "3e800000 3f800000 3f400000 3f000000 be561fc2 3e734357 3e734357 -> 3f800000 3f379a1b 3ede686c", + "3f400000 3f800000 3f400000 3f400000 3f0c28f1 3efea131 3f4f60d7 -> 3f800000 3f3fbe39 3f5dc450", + "40000000 3f800000 3f400000 3f800000 3f400000 3f000000 3f000000 -> 3f800000 3f400000 3f800000", + "00000000 3f800000 3f800000 00000000 3e7650a8 3f310900 3f64121b -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f98873f 3f17b067 3f17b067 -> 3f800000 3f800000 3e8bd834", + "3f800000 3f800000 3f800000 3f000000 3efd8a20 3cb2f928 3f000e73 -> 3f800000 3f800000 3f000e73", + "3fc00000 3f800000 3f800000 3f400000 3f400000 3f000000 3f800000 -> 3f800000 3f800000 3f900000", + "bf000000 3f800000 3f800000 3f800000 3d8a6213 3f3bd825 3d8a6213 -> 3f800000 3f800000 3f800000", + "3e800000 00000000 00000000 00000000 3da08826 3da08826 3f6d91ce -> 00000000 00000000 00000000", + "3f400000 3e800000 3e800000 3e800000 3e800000 3f400000 00000000 -> 3e200000 3eb00000 3d800000", + "40000000 3f000000 3f000000 3f000000 3e651733 3eb2df39 3f8f3462 -> bd574660 3e4b7ce0 3fde68c4", + "00000000 3f400000 3f400000 3f400000 be1a48b5 be2da7ae 3d2b9b44 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3e0a8e1b 3ecf2ecc 3f45e3cf -> 3f800000 3f800000 3f800000", + "3f800000 3fa00000 3fa00000 3fa00000 3f7e2ccd 3eddf7cb 3f94a60a -> 3f8074cd 3fa44106 3f6b59f6", + "3fc00000 be800000 be800000 be800000 3eb6d19f bddb6629 3ed21303 -> be123a6e 3e524650 be3b1c84", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3f1ca356 3f948675 3f1ca356 -> 3db5e3bb 3d0b1e8a 3db5e3bb", + "3e800000 3f666666 3f666666 3f666666 3f392d31 be648aa3 3f392d31 -> 3f694242 3f5d24aa 3f694242", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa be70d443 be70d443 3e417aa1 -> bd0c532f bd0c532f 3e3612a5", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3ebe1ecc 3f3a4865 be74d7ef -> 3efd7e66 3f786087 bea33a9c", + "00000000 3f9df634 3f3bda93 3f3bda93 3f1096c9 3cf40b33 3cf40b33 -> 3f9df634 3f3bda93 3f3bda93", + "3f000000 be7e8b22 3f4c45d2 3f5f4833 3f000000 3e800000 3f400000 -> be7e8b22 3f3f5746 3f677626", + "3f800000 3f341e24 3cd3d61a 3ec33626 3f190a9b bd7a6795 3f190a9b -> 3f42f68a bb4f34cc 3ee966e6", + "3fc00000 3e848256 3ec469dd 3f8b9809 3f4d64f2 3e888e0f 3f4d64f2 -> 3efcb0b3 3debcbaa 3f811422", + "bf000000 3dee1c64 3effef1f 3effef1f 3f66e368 3e3c8637 3e3c8637 -> 3d8e6990 3f28641e 3f28641e", + "3e800000 3ef7e0c1 be6b544e bdf7c314 3f800000 3f400000 00000000 -> 3f1aec79 be845f6c bdb9d24f", + "3f400000 3e2e3b1e be71ecc0 3f350090 3d2cb9f1 3d2cb9f1 3eae7d3c -> 3d5a5078 bd979165 3f2317b6", + "40000000 3f66ae3d 3e7135a9 be66a9d1 bde36892 3edc672c 3dc8c655 -> 3f28cbcc 3e2e20fe 3e0c3622", + "00000000 3f6f7d58 3e963eed 3f6f7d58 be4e0799 3f8c8b89 be4e0799 -> 3f6f7d58 3e963eed 3f6f7d58", + "3f000000 be4ae1ea be4ae1ea 3f9cea63 3f7043b9 3f17a816 3f1eb0d6 -> be91ed36 be5da16c 3f9972f2", + "3f800000 3d8ebed4 3f8d2b7d 3f691ae6 3f000000 3f400000 3f400000 -> 3d8ebed4 3f8695be 3f748d73", + "3fc00000 3f15b229 3e406794 3f065d9e 3f2701c0 3f145f51 3f76e532 -> 3f4649ea 3e6e56c5 3f97eb6e", + "bf000000 be36103f 3f07a7a2 be25ee6f bccd0ffd be694893 3f92a245 -> be8ad389 3f5f3e74 bd6b3d53", + "3e800000 3f92a37e 3f9dc8d6 3f66ace2 bd5d63e4 3f18118b 3f18118b -> 3f97cd51 3f9c6267 3f67dda6", + "3f400000 3c7e3a5e 3dcf7454 3dcf7454 3f7152a6 be4e1768 3f124f3d -> 3cd38490 bbac3e24 3de5b5eb", + "40000000 be7cc660 3ea9df6a 3f2c97a3 3cb7b4af 3f81e90e 3ea31c13 -> 3e6619d9 3f81f09a 3ee02036", + "00000000 3f149c0f 3f03f76f 3f92a19c 3f000000 3f000000 3f800000 -> 3f149c0f 3f03f76f 3f92a19c", + "3f000000 3ef9a0ed 3ef9a0ed 3e84f999 3f21e642 3f21e642 3f802149 -> 3f0d5799 3f0d5799 3ec798fa", + "3f800000 3ed2fa99 3f8559f0 3f442ead 3f0a7345 3edd5da3 3ea98950 -> 3ee4342c 3f861347 3f2ffaa0", + "3fc00000 3f90499a 3f90499a 3e8e4950 3f9b9d33 3f9b9d33 3f994daf -> 3f5aa13a 3f5aa13a 3f5c0ca6", + "bf000000 3f583aeb 3f781b5d 3f583aeb be7ab85d 3f29bd0f 3e54d0cf -> 3f75da3c 3f76d1eb 3f63d98c", + "3e800000 3eb6908d 3da29e8d 3eb6908d 3d37b08e 3f8880ec 3f8880ec -> 3e8d0463 3dd0ad0a 3eea4525", + "3f400000 3f1f8ca2 3f8188dd 3f1f8ca2 be6f6e76 3f945d11 be6f6e76 -> 3e558874 3f800477 3e558874", + "40000000 3f30204e 3d7a6edc 3f18a3bf 3f29da2c 3f8cc1fd 3f29da2c -> 3f645be5 3e54c914 3f5c3b32", + "00000000 3efcc9a2 3f7a79f0 3f525379 3eee1e83 3e4621fd 3eee1e83 -> 3efcc9a2 3f7a79f0 3f525379", + "3f000000 3f489d27 3db3d189 3f4ce76e 3eaacae2 3f5f8d79 3eaacae2 -> 3f3f657f 3df6efaa 3f44668c", + "3f800000 bbe1d0a7 3e70d865 bbe1d0a7 be6bea3e 3f732303 3e8406c7 -> 3b501929 3ee4be58 bb68eb21", + "3fc00000 3f152f7e 3ddbcb08 3f152f7e 3e8365b3 3f2459cf 3f91f5c1 -> 3e8e66de 3e1cb600 3fb12f49", + "bf000000 3f23263b 3f6b4fb7 3f6b4fb7 3f13aca3 bd8d64e3 3f8bf62d -> 3f1c0374 3f771583 3f5f08a2", + "3e800000 3e9d5cf1 3ed28459 3f457433 bd1a08c1 3f5499d4 3f5499d4 -> 3e662075 3ef54d4f 3f4f20ba", + "3f400000 3e97c8c0 3cc2f0a7 3f937da9 3f1ebe1a 3e1bdaff 3eb2781c -> 3eb3201c 3c3a7b2d 3f97eb04", + "40000000 3ef5a989 3f0053b9 3f97c94d 3f95aceb 3f759f8d 3f95aceb -> 3fe1d8d6 3fb57c7a 3f303420", + "00000000 be2f2613 3f13caad be2f2613 3f3ad9c4 3f0b8a63 3f236cb7 -> be2f2613 3f13caad be2f2613", + "3f000000 3f925f7c 3f828f17 3f925f7c 3e1ea5c7 3ec6c084 3f38f887 -> 3f98b685 3f82d856 3f8e48c3", + "3f800000 3e565298 3e754d50 3f4370ee be355258 3cac5dd1 3cac5dd1 -> bd97cd56 3c2529d7 3f096e42", + "3fc00000 3f63386c 3e3ded6e 3e91abbe 3dbfabab 3f3ffbcf 3f9a4006 -> 3f4021a2 3ea62b16 3f62e64c", + "bf000000 3ef359a6 3f6b7cdb 3f6b7cdb 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f0df44c 3f6ee80c 3f6ee80c", + "3e800000 3f11311f 3f567669 3f6f8e27 be424d53 be424d53 3efea5bc -> 3ed5f43e 3f482329 3f6f8898", + "3f400000 3f673310 3e8eecf8 3f8f1fda 3f946f2c 3e7bd780 3f946f2c -> 3f7fbd1c 3e30ea7a 3f8028cb", + "40000000 3e18cdd5 be2fec5b 3e8ba10e 00000000 3e800000 3e800000 -> be18cdd5 00000000 00000000", + "00000000 3ed98315 3d9763fa 3f5a3679 3f93b0a8 3f706bb0 3f7d86c3 -> 3ed98315 3d9763fa 3f5a3679", + "3f000000 3e8e1572 3f5052f3 3eda3783 3e38cd6c 3e38cd6c bdd77382 -> 3e415e29 3f411716 3e2c4dbe", + "3f800000 3f6ce946 3df003b8 3f29636a 3f9203e1 3f9203e1 3e8c06f0 -> 3f82afc6 3e88e5c2 3f0226cf", + "3fc00000 3f761bb9 3f160732 3f67841b 3f878af7 3f4e26c1 3e40bff4 -> 3f8358e7 3f7714bf 3f509db9", + "bf000000 3f449e7c 3e6c9094 3f651c5b 3f399d25 3ed579e7 3dc78b1e -> 3f374152 3e801b33 3f6fef7b", + "3e800000 3f879947 bcda5a68 bcda5a68 3f824fa0 3ee492d9 3f8ff50b -> 3f85a166 bcd4813f bd0f46a8", + "3f400000 3f0d3b26 3f889be0 3eb275c9 3e2fcf61 be31caa3 bdb1d01c -> 3ea96c2c 3f914ec0 3d2afccd", + "40000000 3e8a3f0d 3f657a24 3e8ea345 3db6199c 3f77fb62 3db6199c -> be322772 3f8b999b be37d032", + "00000000 3f10e0d7 3f43062b 3f10e0d7 be2cf752 3f8a6f68 3f761ee7 -> 3f10e0d7 3f43062b 3f10e0d7", + "3f000000 3ec2d115 3ac274ab 3ec2d115 3f604fd8 3f22944d 3f9a90c6 -> 3f060e20 3adcb8cf 3f265438", + "3f800000 3e16db4f 3c70f2d7 3e16db4f 3e6e25f4 3e6e25f4 3e568f26 -> 3d8c5641 3be0257d 3d7cdf5e", + "3fc00000 3ebcca2f 3ebcca2f be78c18b 3f523fc8 bd177c34 3f523fc8 -> 3f3960ca be66aec1 bef442ba", + "bf000000 bd8bf2a8 bd8bf2a8 3f0de278 3e814071 3f79b50d 3f5cc824 -> bdae97bc bd12d3fa 3ec90d48", + "3e800000 3f978329 3d2b3b67 bda836b0 00000000 3f000000 3f800000 -> 3f9d63f3 3d2b3b67 bdd2445c", + "3f400000 be627ad3 3f7910d1 be627ad3 3f5e13b5 3f863e93 3f5e13b5 -> beafa950 3f7ec61b beafa950", + "40000000 3d87e3a7 3c92a8a4 3c92a8a4 3ef9403d 3f59cb38 3ef9403d -> 3d80b966 3d30366c 3c8aed05", + "00000000 3f40dfd2 3f7e2106 3f03815b 3eae1502 3f7b7843 3eae1502 -> 3f40dfd2 3f7e2106 3f03815b", + "3f000000 3ee890cd 3e3c99bd 3ee890cd 3cf31fb4 3cf31fb4 3f56be9d -> 3e765eb2 3dc7cb92 3f1baf4e", + "3f800000 be54bcb1 3f7505de be54bcb1 3f3c05f9 3f963870 3f3c05f9 -> be9c3f89 3f81e7d5 be9c3f89", + "3fc00000 3de27114 3de27114 3e88aa3d 3f9e4af4 be235198 3f9e4af4 -> 3eb5b800 bddd912b 3f5b58b0", + "bf000000 bc9ce6da 3e578052 3f269a59 3f8af574 be1714d6 3f301c40 -> bc020908 3eb18605 3f15cd6c", + "3e800000 3f87b471 3f87b471 3e11dd63 3f901a31 bd3198d9 3f064db6 -> 3f854b44 3f89cc50 3e13a91f", + "3f400000 3f2a8b3a 3f99362d 3f99362d 3ed016f0 3f81badc 3f68dda2 -> 3f1e8c8c 3f85cab4 3f89b86c", + "40000000 3e93e5de 3f09ff6e 3f5a1caa 3f800000 3f800000 3f000000 -> 3f5dd8cd 3fbb0049 3f5a1caa", + "00000000 be249f4b 3f1f5190 be249f4b 3da913d3 3f8960c9 3dd0081e -> be249f4b 3f1f5190 be249f4b", + "3f000000 bd6468f2 3f72dabd 3ef8fe9c 3f0dcff1 3f8b9e13 3f0dcff1 -> bd70bbcd 3f7a9ece 3f0336e5", + "3f800000 3d2c9abc 3f8be0cc 3e01cfe6 3f981bea 3f8ad02b 3f088e1d -> 3dcd1d63 3f7bfc7b 3e0a7d04", + "3fc00000 3ed359ae 3e3b5abb 3f84c89f 3e800000 3e800000 3e800000 -> 3dd359ae 3d3b5abb 3f885f16", + "bf000000 3f594d9f be5a83f5 3f0f7aaa be38f2de 3e9ce718 3e0ce312 -> 3f73a40b be82678d 3f384227", + "3e800000 3f9237a1 3f981714 3f9237a1 3e77dd3a 3f381399 bda5db0a -> 3f94911c 3f9573a2 3f978260", + "3f400000 be51a6a1 ba99c70f be51a6a1 3ecb76f6 bc8ea588 3ecb76f6 -> be316212 b989b616 be316212", + "40000000 3ee463c2 3ee463c2 3eb3eedb 3e9b24fe be4401ff 3e9b24fe -> 3dc1bc31 bf49a0f6 3d98a18a", + "00000000 3e4843a0 3e4843a0 3e97a7b3 3f400000 00000000 3f800000 -> 3e4843a0 3e4843a0 3e97a7b3", + "3f000000 3f15cbde 3f235a3e 3f82343a 3f4da2b7 3e6f3fdb 3e6f3fdb -> 3f36010d 3f0aacd4 3f82ca83", + "3f800000 3e28785d bc6f1f38 3e28785d 3edc43be 3f29f387 3f29f387 -> 3e10f404 bc9ebf15 3e5faf71", + "3fc00000 bd0c7e87 3f1e6899 3e7ed08a 3f0316a3 3d5683e5 3f81dea0 -> bd11943e 3ddad630 3f220cf3", + "bf000000 3d5b9a75 3d31a97a 3d31a97a 3eb5f91c 3f55d487 3f55d487 -> 3d7b5abd 3cec316d 3cec316d", + "3e800000 3f0853e4 3f8a1c88 3f46f4f7 3f2a69d4 bd77969b 3f7efef0 -> 3f123dbe 3f8cf1e6 3f551b16", + "3f400000 3e5a126a 3efa26b8 3f42d849 3f38cd39 3dcf85af 3f38cd39 -> 3e915358 3e491e56 3f5732db", + "40000000 be43d019 be43d019 3e8c1c86 3f1ac1e8 3f1ac1e8 be54eaef -> be8ad6f4 be8ad6f4 bf00525d", + "00000000 3f8c7474 3d068261 3ecb7cde 3e1d1881 3c10e254 3efae405 -> 3f8c7474 3d068261 3ecb7cde", + "3f000000 3c2bbee0 3c2bbee0 3f5294af 3f501caa 3f1f30f7 3f817ff1 -> 3c617dc1 3c40abd7 3f69d294", + "3f800000 bdc37124 3f9510e4 3ec76d67 3f3f2d76 3f3f2d76 be3fd5c1 -> be11f41f 3f8aab18 be157124", + "3fc00000 3f5dfffe 3f45f28d 3f3936af 3f9b7778 3f9b7778 3e88be8d -> 3f93719b 3fa132e4 3f07c02a", + "bf000000 3f41ecde 3f5cbd68 3f41ecde 3f26d63e bdf1b237 3f8cc8a3 -> 3f388214 3f7287fc 3f1cb035", + "3e800000 3f487010 3cbc2f5f 3f487010 bdcb6d09 3e821c42 3f65ac52 -> 3f37c9a8 3ca50cbc 3f5378a8", + "3f400000 3f1642ee 3f1642ee 3e952fe6 3f585472 be54f238 be54f238 -> 3f4cfcbd 3e17e594 bc93d556", + "40000000 3ee9ffdb 3e9deb25 3f95857c 3dbb4bbe be78a73b be78a73b -> be94664b bf1ba70d 3fd577d3", + "00000000 3f849e78 be15e497 be7770f0 be633417 3c6e1d45 3f7be7ef -> 3f849e78 be15e497 be7770f0", + "3f000000 3ee32b13 3ea88755 3ea88755 3f9f7ea2 3ed52579 3ebdb30e -> 3f4652e5 3e9a6c4d 3e92b48f", + "3f800000 3f61d2be 3e384e6c 3e10afb9 3ed499f7 3f4c4cd8 3f0f74ea -> 3f5cb51d 3e9315d1 3e222878", + "3fc00000 3f8fbf6b 3d78e20e 3d78e20e 3f666666 3f666666 3f666666 -> 3f79b36f 3e08e2ba 3e08e2ba", + "bf000000 bcadb3b1 3f5aceac 3f5aceac 3dca9178 3f919380 3ed2bff6 -> bcf35f39 3f431a99 3f5e1829", + "3e800000 3ecad0af 3f1b3f8b 3edcb050 3f9beef5 3e92a2db 3f0b7805 -> 3f09d316 3f107ce5 3ee1a1d5", + "3f400000 be4c9abb be4c9abb 3f6c1550 3ea1f5d6 3e952749 3e045698 -> be143c06 be0c8ec7 3f6101b4", + "40000000 3ee1a5ba 3ee6296a 3ee6296a 3f9b53f6 3f64b9ac 3f64b9ac -> 3fd96944 3f941976 3f941976", + "00000000 3f4f8f52 3f4f8f52 3f8a1709 3d8a10c9 bdf1f2cd bdf1f2cd -> 3f4f8f52 3f4f8f52 3f8a1709", + "3f000000 3f999606 3f999606 3ebe2bcd 3f800000 3f400000 3e800000 -> 3f8ccb03 3f933084 3e8ea0da", + "3f800000 3f61ea3a 3f96af0b 3eb95132 bdc03882 bdc03882 be71725a -> 3f3e2eb6 3fb1a028 be2ec837", + "3fc00000 3f0afb41 3eaf5097 3edeaa7d 3ebe155a 3ded1880 3f79fdf7 -> 3ebb921e bd562733 3f873f3b", + "bf000000 3f91809c 3f28402d 3e383272 3dbe91e0 3f092beb 3dbe91e0 -> 3f8a613c 3f251b60 3e8193ef", + "3e800000 3d545000 bdef5a80 3f370a8e 3f3b9168 3f3b9168 3ed9b70b -> 3d6d0384 be0599b4 3f345040", + "3f400000 3f821068 be5893fe 3eac96ec 3e513639 3e92659d 3e513639 -> 3f82fac6 be1308c6 3e40144b", + "40000000 3ed0081b 3f468640 3f468640 3f28ba6e 3f424040 3f424040 -> 3f2a3594 3f8102c1 3f8102c1", + "00000000 3f1f3b8b 3f1f3b8b 3f30c67f 3f9053b1 bb305cee 3f9053b1 -> 3f1f3b8b 3f1f3b8b 3f30c67f", + "3f000000 bc71f1fc 3dde1bd3 3dde1bd3 3f214d7b 3f948614 3f9375ce -> bc88b5b4 3e38635f 3e377724", + "3f800000 be2d775d be04af6c 3f85ba86 3f3874f7 3d9bf3d9 3dbec4aa -> be79fa19 bca1a933 3f8a63d6", + "3fc00000 3f2f5e24 3f2f5e24 3dcd1bb1 3e211314 3d89822e 3eec329b -> 3eb8f06a 3e8d526a 3db54f43", + "bf000000 3f5c4f33 3d72017e 3f01a00f 3f000000 3f000000 3f000000 -> 3f5c4f33 3d72017e 3f01a00f", + "3e800000 3f559c61 3e0b51d1 3f559c61 3e62a16e 3dbb7ecb 3dbb7ecb -> 3f4fb44f 3dddbbf2 3f4cf435", + "3f400000 3df5a6ad 3f527f9b be31fd7f 3f07336d 3f135be2 3f07336d -> 3e000204 3f57a8e6 be398007", + "40000000 bda773bb 3e0c8392 3ec68be1 3f2e256b 3f473d5b 3f6db8b1 -> be101868 3e94761f 3f86bbc5", + "00000000 be746cf9 3ec88ad0 3ed0abc8 3e9e7b0f 3e9e7b0f 3f4f5475 -> be746cf9 3ec88ad0 3ed0abc8", + "3f000000 3f9de8d6 3ceae677 be397a26 3ebed974 3e95df5c 3f450cf0 -> 3fa1b726 3cba35c7 be6b8172", + "3f800000 3f24d382 3e3c189a 3f24d382 3f118787 3f95b5bb 3e97e024 -> 3f314ff4 3edbffb1 3eff7c2c", + "3fc00000 3f40752d 3f40752d 3f2d71c6 be664553 bd309355 bd309355 -> 3e591bf8 3eb1da60 3e1bbcc4", + "bf000000 bda22ae5 3f1aa927 3e3611c6 3e424673 3f5f379d 3f5f379d -> bdd47c0f 3ee9efd2 3de4b340", + "3e800000 3f2e6db2 3f2b05cf 3f893512 3f42387d be06b55d be06b55d -> 3f38fa8e 3f10305e 3f8c1d60", + "3f400000 3f6aae0f 3f47278a 3eb4cfd8 3f1c947f bda3c495 3f700aa5 -> 3f6e400d 3f15b3aa 3f15c1c3", + "40000000 3f209e0f 3d38675d 3f37ab6c bd5c7cde 3ed9334a 3f959406 -> be4abe00 3d0081c2 3fbc8d55", + "00000000 be7c6deb 3f303466 3f303466 3f542f4c 3f542f4c 3ed5409e -> be7c6deb 3f303466 3f303466", + "3f000000 3eba6a65 bdd8c3fb 3eba6a65 3eb4ce69 be160c96 3e63b10d -> 3e9f09c1 bd193d3c 3e86a883", + "3f800000 3f4ebb33 3f793c86 3ee9d143 3f72395d 3f955b9c 3f955b9c -> 3f7ab28e 3f8120e9 3f886a78", + "3fc00000 3f991bec 3f991bec be568a93 3f33d94d 3f77560c 3ea087e6 -> 3f89da4b 3f6bfd54 bdbd0eec", + "bf000000 bda4e255 3f7327f5 3e861ffe 3ea1acd7 3ea1acd7 3f5c4e2e -> bdc342aa 3f7585b5 3e2b8712", + "3e800000 3e182e31 3f62bde6 3f62bde6 3f59416a bda8b626 3f59416a -> 3e32b5a9 3f5a38dc 3f67d7a0", + "3f400000 3f8a6112 3edce52e 3f8a6112 3f839944 3f534ac8 3f0c2304 -> 3f822837 3f2459b7 3f89a41e", + "40000000 be75c1d6 3f96788d 3f1610dc 3e77dabb 3f48cc32 be59d2bb -> 3bfa3abe 3f79d279 bf17f054", + "00000000 3e5a0fe9 3e5a0fe9 3e850439 3ec65f40 3e0fffd1 3efd0516 -> 3e5a0fe9 3e5a0fe9 3e850439", + "3f000000 3f92ceeb 3f793b55 3de91c26 3f932c5d 3ebb5fc6 3eb4e30e -> 3f86963a 3f785318 3dc6e959", + "3f800000 3ef8b780 3ef8b780 3f437b98 3f9a7990 3f922793 3f922793 -> 3f96147e 3f8dff1a 3f889554", + "3fc00000 be532a13 3f8dc177 3f531eb4 3f800000 3f800000 3f800000 -> bf03fa4c 3f723e89 3f8b3853", + "bf000000 3f92be46 3f90784e 3f90784e 3f8904ab 3f8904ab 3f8d845c -> 3f9d6f79 3f99dd84 3f9a71b5", + "3e800000 3e43fb92 3f01c180 3e43fb92 3f108c67 3f6d85c2 3ec1d370 -> 3e4a512d 3f1cc2ca 3e38154f", + "3f400000 3eb033b5 3f5debf8 3eb033b5 3f400000 3e800000 3f800000 -> 3ef24719 3f512475 3f1a2d3e", + "40000000 3f5b5782 3f291e11 3f8fbf91 3f8f4bee 3f837527 3f1cd0c9 -> 3f9b173a 3fb02299 3f88a862", + "00000000 3d0d9c31 3ddcd53c 3f333a43 3f39d0b1 3f24e45f 3f39d0b1 -> 3d0d9c31 3ddcd53c 3f333a43", + "3f000000 3d0c41ba 3f39d16d 3f895ad1 3ebd5151 be2c43e0 3ebd5151 -> 3cf3facd 3f0aebaa 3f8a92b7", + "3f800000 3f506fa1 be3241cc 3ea48ed1 3dd1169d be13b01c 3dd1169d -> 3f2a9586 3d4dacd2 3d866722", + "3fc00000 3d5eed59 3d5eed59 be00f462 3f64f7c3 3f82362b 3f82362b -> 3df3595f 3e0e37e0 bea48910", + "bf000000 3e87723f 3e87723f be6beddc 3f45005a 3f0b6580 bdd3c79c -> 3e45e089 3e816aa2 bebd2535", + "3e800000 be711273 be711273 3d1902a3 3f85e5fc 3f3634e3 3f85e5fc -> be99727f be854c26 3d42c9cf", + "3f400000 3f0a89d5 3f381054 bd966438 3f9f4725 3f9f4725 3f15eae3 -> 3f86d829 3f843110 bda9b488", + "40000000 3e8eff8f be0061e9 3e8eff8f 3c58ed57 3e776599 3e776599 -> be876ccc 3b8a0fbb bc19c778", + "00000000 be647a82 3f89e03c 3f89e03c 3f51b460 3f6ae403 3f51b460 -> be647a82 3f89e03c 3f89e03c", + "3f000000 3f06e9e4 3f36fd9c 3ece5a66 3f800000 3e800000 00000000 -> 3f4374f2 3f24bd03 3e4e5a66", + "3f800000 3f24bfc5 3f9c8231 3f6a3a40 3e4eeae7 3e4eeae7 3f68f625 -> 3edcc07e 3fad7eec 3f7c14ca", + "3fc00000 3f92ed52 bdfc4780 3eee01a9 be50c01d 3e089e5f be50c01d -> 3fbae492 3c4951af bf0447e6", + "bf000000 3ed44be0 3ed44be0 3d7c37b7 00000000 3f000000 3e800000 -> 3f1f38e8 3ed44be0 3d9da2d2", + "3e800000 be2d5670 3f974380 3e2808d4 3f105d81 3f1a1418 3f0d737e -> be32e0cb 3f961429 3e2c72f5", + "3f400000 3f90d2a6 be36197d 3f0777f4 be5193ef 3f8ec376 3f362bbc -> 3fa29ac5 beaf16f3 3f2db9e3", + "40000000 bdb7f8dc bdfeef8b 3f81267e 3f000000 3f400000 3e800000 -> bdb7f8dc be7eef8b 3f824cfc", + "00000000 3f91c3a7 bc86300c 3f91c3a7 3f7c0846 3f7c0846 3f9f3fd4 -> 3f91c3a7 bc86300c 3f91c3a7", + "3f000000 3e1d997a bd34ba31 bd215a02 3dec4174 3dec4174 3f3fb129 -> 3dc1f5eb bcde6ca7 bd497ed1", + "3f800000 be23f306 3f871c28 be23f306 3cdbc047 3f084da9 3cdbc047 -> bc0cbc0a 3f86a615 bc0cbc0a", + "3fc00000 bdf1d18e bdf1d18e 3f93b69c 3f400000 3f400000 3f000000 -> be53975c be53975c 3f93b69c", + "bf000000 3e926f7b 3ec80c20 3f0d5207 3f63babd 3f75e418 3f795e98 -> 3e32c71b 3e57d8b0 3eade6d8", + "3e800000 3f3601e6 3f3601e6 3f75a965 bd8b0891 bdd6c0de bd6db50e -> 3f20ff68 3f1fa13d 3f72c6f2", + "3f400000 3f518f73 3f71428f 3f2fbd68 3f400000 3f800000 3f800000 -> 3f62f9a8 3f7c50a4 3f6bef5a", + "40000000 3ce01783 3f4c274b 3f893a81 3f6eec63 3f8e7ad0 3f95894a -> 3d991ee7 3fa5a740 3f611f05", + "00000000 bbca655f 3d0552fa 3f22a241 3f93ccf9 3d8216b1 3e97b643 -> bbca655f 3d0552fa 3f22a241", + "3f000000 3f58ec01 3f99310b 3f58ec01 3f13f3e0 3e8653b9 3f13f3e0 -> 3f5bf7b7 3f9f2d9c 3f5bf7b7", + "3f800000 3e9cee57 3f370fb4 3e9cee57 3f22a7fa be69fcaf 3f99b83a -> 3ec76b98 3e99941c 3f3c76c2", + "3fc00000 3f9cfa23 bdcf56b2 bdcf56b2 bc3bc71d 3e6ca913 3f0af5bd -> 3fc97066 bca0592e bde9f7f1", + "bf000000 3dbca4a4 3dbca4a4 3f8d0454 00000000 3f800000 3f800000 -> 3e0d7b7b 3d3ca4a4 3f93867e", + "3e800000 3eb57497 3e2ddd75 3eb57497 3f1331ca 3f7971f5 be04b657 -> 3ebc420f 3e571afd 3e78aa8b", + "3f400000 3f8bdcc2 3f2549ae 3f8bdcc2 3f37bfe5 3f2da83a 3f2da83a -> 3f87fcc7 3f3d8e2b 3f88b05c", + "40000000 3ee65c70 3f5c2de5 3ee65c70 3ee497d9 3f71bfde 3f8bf9b2 -> 3eb5097f 3f8dec20 3fc252a6", + "00000000 3e61160b bd53cf8a 3f40c39c 3f400000 3f800000 00000000 -> 3e61160b bd53cf8a 3f40c39c", + "3f000000 3f8c5207 3e9e0059 3f791568 3f800000 3e800000 3f800000 -> 3f862904 3e6d0086 3f7c8ab4", + "3f800000 3dad4e81 3dbe6724 3f97b876 3eea9a4a 3f8b96a0 be10d806 -> 3d9ed235 3e4fa410 3fb626d0", + "3fc00000 3dc570d7 3e7374c0 3f9ea138 3e3d65e6 3f9fff59 3f9fff59 -> 3bad5c05 3f45cdee 3f336de4", + "bf000000 3f5b32d5 bbadca18 3f2ee272 be25a6ca 3f4c75ab 3ce58b80 -> 3f738d78 bb73c46f 3f552b5c", + "3e800000 be7a2b3a bc7ddd63 3f5e6235 bcc12606 3ee3c4f9 3ee3c4f9 -> be38ad6d bc76ddb3 3f5d74f4", + "3f400000 be055e64 3f97e988 3f97e988 3f91a303 3e927fb3 3e927fb3 -> be827ae1 3f9f9558 3f9f9558", + "40000000 3dcea8dd 3eeb9e53 3f837a2b 3f800000 3f800000 3f800000 -> 3e9afea6 3fb0b6be 3f790baa", + "00000000 be36f5dd be36f5dd 3edafd5a 3f44cac4 3f44cac4 bd2ad483 -> be36f5dd be36f5dd 3edafd5a", + "3f000000 bda745f1 3e0d6d63 3e0d6d63 3e7fa9ec 3d18b06f 3f615351 -> bd7accca 3d97f8b0 3e4331dc", + "3f800000 3f4904eb 3ecd1f0c 3f9ddd36 3f9a203f 3e81cb41 3f460abe -> 3f8b38da 3e4fff01 3f8d85bb", + "3fc00000 bc232cf2 bd17c0d2 bd17c0d2 3e98bfbe bd3ec7e4 3ead30e3 -> bb80e9c4 3cc229ac bc9c3e07", + "bf000000 3ecbab5c 3f692137 3ecbab5c 3e800000 3e800000 3e800000 -> 3efe9633 3f6ed8e9 3efe9633", + "3e800000 3e2efc1b 3e2efc1b 3e826d3c 3e5de3e8 3e3964d1 3f89435d -> 3e163282 3e131437 3ea7c0b4", + "3f400000 3eac5513 3eac5513 3f733af2 3f4e0221 3f4e0221 3f197b1c -> 3efb1a1b 3efb1a1b 3f752306", + "40000000 3f0737cd 3f563bfa 3f0737cd 3d3be2ad 3f202b01 3f907b04 -> bea85e98 3f6b3a0d 3fdb7e4e", + "00000000 3f035c4a be49e178 3ef8a28b 3f3002e6 3f9c2454 3f3002e6 -> 3f035c4a be49e178 3ef8a28b", + "3f000000 3f5b3fbd 3de61779 3dcdf178 3f419d36 bc5989fc be04db3f -> 3f64ab20 3d5ffb4a 3d188107", + "3f800000 3f9bcbec 3f54e466 3f9bcbec 3f000000 3e800000 3f800000 -> 3f9bcbec 3f3f5699 3f800000", + "3fc00000 3f4caa96 3f15905b 3b2313e2 3f429844 3e6460ae 3f429844 -> 3f74ba3f 3e747e74 3b912c20", + "bf000000 3d89408f 3f24657b 3eec9ddd be65b942 3e7eb888 3f36e8dd -> 3decab5b 3f3b6968 3eb9dd55", + "3e800000 3f6f00d8 3f6beb5f 3f6f00d8 3f36052d 3f5300fd 3f5300fd -> 3f70cbed 3f6f2cc1 3f71c23d", + "3f400000 3f94601a 3f94601a 3e83720d 3f3f0b8c 3f3f0b8c bcb9bf79 -> 3f8cd940 3f8cd940 3d632033", + "40000000 3eecf6f2 3eecf6f2 3e9ef303 3f800000 3f000000 3f800000 -> 3fb1b936 3eecf6f2 3f6e6c84", + "00000000 3f82c946 3f889dce 3eee5061 3eb9f23a 3f20aa41 3eb9f23a -> 3f82c946 3f889dce 3eee5061", + "3f000000 bdd0c1d6 3f22314b 3f293f31 3f8fede4 3eafea6e 3f8fede4 -> be298eb9 3f13850c 3f5f6b6c", + "3f800000 3f6111e5 3f6111e5 be423b9f 3f751ea2 3f751ea2 3f7dd39c -> 3f7d5ef1 3f7d5ef1 bec0957a", + "3fc00000 3ee63abe 3ec5ba0c 3f5b4fd8 3f400000 3f000000 3f400000 -> 3f497366 3ec5ba0c 3f76d3f6", + "bf000000 3f616550 3efb56d9 3d79d378 3ef4e79b 3f35ec52 3eb02768 -> 3f620f18 3ec665da 3d9064a4", + "3e800000 3dd93e90 3dd93e90 3f8938ba 3f93d82e be36b06a 3f09f344 -> 3e1032a6 3d8f8de6 3f890ad9", + "3f400000 3f75f13c 3f75f13c 3e774a9b 3e297f15 bd767ce0 3e9ec9a0 -> 3f70e570 3f6d7dbf 3e30dcc3", + "40000000 3e9441fc bd70a951 3e9441fc 3d07560f 3f799323 3d07560f -> be80a9d3 be2e74ae be80a9d3", + "00000000 3f8aee9f 3ec093fc be20f18a 3f2fad7a 3ea21ef0 3f2fad7a -> 3f8aee9f 3ec093fc be20f18a", + "3f000000 3f99ce8b be7fa450 3f2bd285 3d5e364f 3f2b9e84 3f2b9e84 -> 3fa54f67 be95999a 3f3a2a48", + "3f800000 3e89ae6b 3e89ae6b 3e93944b 3f1837c3 3f8b0624 be6329fb -> 3ea3bb1a 3f158a03 be02f4b2", + "3fc00000 3e9a1cb1 3f3a70a0 3f3a70a0 3ecbeb49 bda81f7b bd89983a -> 3e562a7e 3e81f024 3e8828ce", + "bf000000 bd3f5a0e 3d08d77c 3f64d19c 3dd8a5ec 3f51f566 3f9de260 -> bd85648a 3cba1042 3f50e1d5", + "3e800000 3d9bef6c 3dba02e6 bdab258a 3f400000 3f400000 00000000 -> 3daf6d5a 3dd14343 bd805c28", + "3f400000 3f63f1aa 3f23e9d8 be2324f6 be1dea1a 3df8de0a 3f5e334f -> 3f48697f 3edf4474 be7d315d", + "40000000 3f6fed83 be5496f8 3f10658f 3d8aaba7 3f78ea1e 3f94cd66 -> 3f5422e8 bf198eed 3fdc13a8", + "00000000 3f546941 3f546941 3f88af43 3e95d0ff 3f830af9 3f830af9 -> 3f546941 3f546941 3f88af43", + "3f000000 3f8b2dde 3f8b2dde 3f62d7b3 3f8c3207 3dc17c5c 3f8c3207 -> 3f848644 3f8fb66d 3f743306", + "3f800000 3f5af28d 3f1391cb 3f79f6e2 3e955606 3e955606 bd92e901 -> 3f4b8261 3eccc854 3f731018", + "3fc00000 3ed490f2 be0aefb6 3f6315b8 3f6437d6 3d28bf25 3f6437d6 -> 3f671af1 3d512fa3 3f828598", + "bf000000 3c27593c bd4831e5 3da46ce7 3e93d12e 3f2452f9 3f8aab1f -> 3c4ab55c bd2bc9fe 3d090440", + "3e800000 3d8a31f9 be25249e 3e914d64 3e3b6284 3f47d0b7 3e3b6284 -> 3d6894e1 be3c4e84 3e748af2", + "3f400000 3e053db9 3e590a4f 3e590a4f 3f8a1c43 3db227fb 3db227fb -> 3e78f560 3da5294e 3da5294e", + "40000000 3f0b87b5 3f986d7c 3f7267a4 3d2d1ce5 3d2d1ce5 3f848f2f -> be93708c 3fc52744 3f87c41e", + "00000000 3e899fba bdb96366 3ec72372 00000000 00000000 3f800000 -> 3e899fba bdb96366 3ec72372", + "3f000000 3e165930 3f2b9ede bd9612d3 be797426 3e87d84c 3f51c115 -> 3d1a316a 3f17d18f bdc5fff8", + "3f800000 3f04c1cc 3e35002a 3e35002a 3f794929 3f794929 3f48dc00 -> 3f79890a 3eb040e3 3e8e03ad", + "3fc00000 be73aefc 3f058997 be41b63a 3f064aee 3f9b9003 3f9b9003 -> be82d3a2 3fc62bbe bf185aad", + "bf000000 bd584b18 3f86af7c be6646b5 3f02c42d 3eb55880 3eb55880 -> bd55f4c2 3f85b5ef be83ed21", + "3e800000 3f89d590 3f89d590 3f861515 bd680718 3eafcc1d be75cfa4 -> 3f8c9242 3f8a9abf 3f88553e", + "3f400000 3f41a4e9 3f87c645 3eb38895 3ea09345 3ec06717 3e884d80 -> 3f303632 3f893919 3e6926a8", + "40000000 3f81f0ae 3f6797c4 3f81f0ae 3f1c5870 3f91fec6 3e8e9136 -> 3f8114b4 3f9310f7 3f83a8d6", + "00000000 3f07b7a0 3f956602 3f3b6065 3f66e427 3f66e427 be1f169c -> 3f07b7a0 3f956602 3f3b6065", + "3f000000 bd74c4dc 3f7edd8d bd74c4dc be108c2f 3f8beb02 3f8beb02 -> bcafaa79 3f7f89d2 bdc2f8cd", + "3f800000 3f7e65ec 3f9d231c 3f6743b6 3f086c15 3e213d9b bde6e541 -> 3f7e80e8 3fb1192c 3f48f398", + "3fc00000 be47ae1c 3f98093b 3dc71450 3f98938d 3deb00cf 3e04203e -> bf198df0 3fb3d0de bc33d3f8", + "bf000000 3eaf9f41 3f01fe9e 3ee31fd0 3edbff0e 3edbb226 3d0fca81 -> 3ebbf8c6 3f0aede0 3f265b49", + "3e800000 3f9fe729 be358114 be7c7d6e 3f000000 3f000000 00000000 -> 3f9fe729 be358114 be3d5e12", + "3f400000 3f9582ec 3f9582ec 3f996973 3f014c29 3f5bef75 3f21dea0 -> 3f95590e 3f89ec6f 3f945e69", + "40000000 3f5ce703 3f5ce703 bcdae68f 3f20174d 3d20ec66 3f20174d -> 3f6e8049 3f1c390a bd2454c4", + "00000000 be70be0c 3f29acc3 be795501 3f8cf4b5 bcaa5bb7 be7687d2 -> be70be0c 3f29acc3 be795501", + "3f000000 3f8235d8 3e8d4705 3f7860e2 3e800000 3e800000 3f400000 -> 3f82c34e 3e53ea88 3f7a48aa", + "3f800000 3f70237f 3e250b6d 3ece250f 3f400000 3f400000 3f400000 -> 3f7811c0 3e779124 3f1a9bcb", + "3fc00000 3ec778f9 3ec778f9 3e440982 3ec6a9e2 3f5cace7 3f1a740d -> 3e84756c 3f500dc8 3e806782", + "bf000000 3f67a0ea 3f7aee37 3f67a0ea 3f95f0a4 3f10e5f4 3f95f0a4 -> 3f5743f4 3f7a988d 3f5743f4", + "3e800000 3f896810 bd825973 3f896810 be2312d9 3f55ab78 3f55ab78 -> 3f8c81d2 bd9828f4 3f87d523", + "3f400000 3f95693e bdc58dd9 3f9da676 be405e24 3e7cc4c3 be01feda -> 3fab80ba bd751287 3fb988b4", + "40000000 3f7705ca 3f38cb21 3f38cb21 3d212ea0 3f74bb20 3f832cf1 -> 3f667b1e 3f9d5594 3fa722ea", + "00000000 3f8ab558 bdcceef2 3f82999e 3e8bf2d0 3e8bf2d0 3f685a0f -> 3f8ab558 bdcceef2 3f82999e", + "3f000000 3f33000f 3f8fe377 3f8fe377 3e800000 3f000000 3f800000 -> 3f1fc013 3f8fe377 3f87f1bc", + "3f800000 3f9dd9c5 3f4fe0db 3ebac8df be34ac0a be34ac0a 3e88660d -> 3fc63c21 3f0ec698 3e470a58", + "3fc00000 3f651a2b 3eda0398 3b96e359 be2657b7 3e8d9358 3ecd29a6 -> 3f2fa5bc 3e0fb0c9 3b53e275", + "bf000000 3ccb437a 3f1cd375 3f8af012 3eb0653d be73c836 3f0be151 -> 3ceaddd4 3f6605f1 3f8b7203", + "3e800000 3f096d32 3dd91af6 3dd91af6 3e6d896d bd84b031 3edc8a5e -> 3ef31262 3d9bcbc3 3dd1965a", + "3f400000 3eb09166 3eb09166 3ecdff35 bd5c3a95 be04fa63 bd5c3a95 -> 3d6f36c7 3c9bf798 3d8b8ac9", + "40000000 3f4c047f 3f6c4c5c 3f2a1171 3edb4c39 3f4adfa7 3ebf7d78 -> 3f3d1cc0 3f81ac75 3efd8510", + "00000000 3f176d18 3d75b194 3f176d18 3f80baf4 be2a9c75 be2a9c75 -> 3f176d18 3d75b194 3f176d18", + "3f000000 3e8d31ad 3e61bd14 bd2de156 3eea43be 3efc0558 3efc0558 -> 3e873339 3e5ffbf5 bd2c8764", + "3f800000 be1f5da7 3e34dbb1 3e4e3606 3ea4a79a 3ea4a79a 3f036706 -> bdcd00aa 3de8a64b 3e53b143", + "3fc00000 bd26a37a 3f857272 bdd294a5 3e9980a8 bdcfd256 3ee5d63d -> bc851edf 3f8f469e bdb24c79", + "bf000000 3f3ba173 3f3ba173 3f99f6a8 3d7dd478 3d7dd478 3e6549b0 -> 3f599416 3f599416 3f92cb9b", + "3e800000 3e5017c1 be2b7574 3e5017c1 3f1845a2 3f8a9da8 3f0ae790 -> 3e59f52a be5d6eff 3e548655", + "3f400000 3f9fc465 3f29b7d3 3e66315c be55ce5b 3e2cd3ae 3f95c7af -> 3fc18ab2 3efdb344 3ee6cb97", + "40000000 be4c9c29 3f707618 3f707618 3e9fbef8 3f64d0a0 3ea04525 -> bd4afc59 3f84781d 3f64d70f", + "00000000 3f958cec 3f545730 3ecad991 be4cc695 3dc841ef 3dc841ef -> 3f958cec 3f545730 3ecad991", + "3f000000 3ec8146f 3f36e31a 3ec8146f 3e7024f7 3f7af946 bdf2817b -> 3e92f63b 3f5a0211 3e18b24e", + "3f800000 3e85adf3 3dc42227 3dc42227 bdf3094b 3e3adab5 3e3adab5 -> bd7dd1f0 3d0f2860 3d0f2860", + "3fc00000 3ea3f783 3d68b754 3f527e8d 3f5c0326 3f69bd5e 3f5c0326 -> 3f2a6234 3e024555 3f81c7e5", + "bf000000 3ea80592 3f92b42f 3f848180 3f66840c 3f68b5a0 3e06e5d5 -> 3e49795e 3f9a5aa7 3f82d8b5", + "3e800000 3f899fa5 3f899fa5 3ddf8282 be56440c 3e9607dc bdcef525 -> 3f8d094f 3f8a9e99 3d9c56d1", + "3f400000 3f8ddb91 3f44932e 3f107a65 3e213cd6 3f43aefb 3e758c6e -> 3f94fa59 3f5c2454 3ec9e66a", + "40000000 3ebadeca 3ebadeca 3f942537 bd197ecf 3e83c34f 3e8bfab7 -> bed6e1b8 3c2fcb6f 3fa667c6", + "00000000 bcfd0081 3f1ebfe0 3f909e7b 3f8ee262 3b880626 3e73091d -> bcfd0081 3f1ebfe0 3f909e7b", + "3f000000 3f4dd34b 3f50c173 3f50c173 3cbc8fab bd5f4477 3f85add4 -> 3f35e498 3f368eea 3f6a7954", + "3f800000 3f58497e 3f409c05 3f58497e 3ee5e876 3d9535c5 3e9e406d -> 3f543d4e 3f0a74aa 3f491f9e", + "3fc00000 be0dea8f 3e165097 3f659046 3e8d2a26 3f896533 3f548863 -> bd39b438 3ecc717f 3f7fc082", + "bf000000 3f0a702f be416466 3f125e0c 3f90e8ee 3f93aefc bdcec302 -> 3e8040ba bd85e9d5 3f544080", + "3e800000 3f8bb908 3d814a01 3f8bb908 3ee8ccdf 3f535345 3e8dbfa1 -> 3f8bfd06 3d965487 3f8d07de", + "3f400000 3e1ebfd8 3eea79bd 3e1bca43 3f06439a 3e9b3615 3e9b3615 -> 3e249379 3ea53d5e 3ddb93b2", + "40000000 3ecc4b83 3e555065 3f172a28 3ea748f0 3f564da7 3f4aec40 -> 3dfacdae 3efa7b9f 3f88f234", + "00000000 3f7bc145 3f103622 be761519 3f000000 3f800000 00000000 -> 3f7bc145 3f103622 be761519", + "3f000000 bc835816 3f5c2b4f bc835816 3f6d8810 3e3a962f 3f5c730f -> bcbb8a66 3f50c85a bcb2c6c7", + "3f800000 3f926227 bdd8def1 be351f2f 3d3ae668 3f87e7b9 bce9495d -> 3fa316d2 be6643be 3c250d49", + "3fc00000 3d408f99 3d9b17a6 3d408f99 3f5e9322 3f5e9322 3f781a52 -> 3dcafce7 3e237d8f 3de7ca77", + "bf000000 3efe1b84 3efe1b84 3d8b2184 3f4b4e32 3e03903b 3f4b4e32 -> 3eb35bd6 3f2e41bc 3d446866", + "3e800000 3f4785e5 3f4785e5 3eb4d982 3f97c3ac 3f8973c8 3f8973c8 -> 3f5ae28f 3f57ba42 3ee8bd53", + "3f400000 3e50d468 3f0c7a51 3f8afd88 3f8c9e96 3f5d27e4 3f8c9e96 -> 3ec62ad6 3f4b88aa 3f811f4e", + "40000000 3f4d864c 3e1972ef 3f46d64b bd59ff38 be28f54b 3f058046 -> 3ebba80a be7eb964 3f4bc01f", + "00000000 3ed8326d 3e8f9158 3e8f9158 3f214bd2 3dc54d4a 3f214bd2 -> 3ed8326d 3e8f9158 3e8f9158", + "3f000000 3f6ad986 3f8e6802 3eb252c1 3e800000 00000000 3f000000 -> 3f658fe8 3f959c03 3eb252c1", + "3f800000 3e0df16b 3f433694 3f433694 3f1f467a 3f4eaeac baeddb3a -> 3e30a00a 3f689445 3f0634ae", + "3fc00000 bdd623ed 3f9a4da1 3f9a4da1 3f33876b 3f33876b 3e18fac6 -> be2bb99c 3f8a6b7e 3fb5f82d", + "bf000000 3e110e0d 3e990579 3e110e0d 3e9e0208 3f70643b 3f7f3928 -> 3e2cd12a 3e2bae55 3d91ef64", + "3e800000 3f6a81c4 3f8b50ef 3f844623 be7e88cb bd838d17 be7e88cb -> 3f62765e 3f8e8235 3f85dfa8", + "3f400000 be4f2cac 3f38b778 be4dc694 3dc1ade8 3dc1ade8 3f9e569b -> bda25d5e 3f0d5db7 bed8a215", + "40000000 3f959ddf 3f85bcb8 3f305156 3f596e2f 3f596e2f 3ef770c9 -> 3f6ed23b 3f7b70cf 3f2afd44", + "00000000 3f5e4d8a 3f7b7cb9 3f5e4d8a be6acea6 3eb6a9a3 3f7d4da6 -> 3f5e4d8a 3f7b7cb9 3f5e4d8a", + "3f000000 bd917805 3c997a2d bd917805 3ec31b79 bd9823bb bd9823bb -> bd802b06 3c02acaf bcf7b641", + "3f800000 3da0a90b 3d818780 3f151239 00000000 3f400000 3f000000 -> 00000000 3dc24b40 3f151239", + "3fc00000 3f9e019b 3f131b20 3e751b79 3f15ca8b 3f6b84e0 3d2a07a2 -> 3f9657fd 3f8e27d6 bdb80f24", + "bf000000 be053743 3e0e2962 3f282022 bdc70477 3e451cfb 3f846c58 -> be54c4ed 3e39e097 3ef24da6", + "3e800000 3f51330f bc19828c bc19828c 3eff08bb 3ecfd53e 3e814664 -> 3f5127c2 bc124a05 bc068329", + "3f400000 3efbfe61 3ed9d319 bcdbdda6 bd998ac9 bd998ac9 3f8f79a2 -> 3d8aa3a5 3d6fae50 bd54519f", + "40000000 3e9f1528 3e9f1528 3f41d48b 3f4e7c04 3f522f39 3d891b0d -> 3f31159a 3f35aed2 3eac4716", + "00000000 3e354c8f 3e354c8f be67e06a 3e400c01 3e890eca 3e5fbb9c -> 3e354c8f 3e354c8f be67e06a", + "3f000000 3f6dbf13 bdf6ceb9 bd008651 3f9fe499 3f23dca8 3f23dca8 -> 3f7b6bdc be0cb0dc bd128776", + "3f800000 3f5c5e82 be43efc3 bd4e1830 3e800000 00000000 3e800000 -> 3f4a8dc3 00000000 bcce1830", + "3fc00000 3f5f2734 3f566f0f 3f736a06 3f85debf bd0f8e40 3f85debf -> 3f8a78a4 3f13b6d2 3f840322", + "bf000000 3f353d8c 3e929344 3f9f4982 be4fcfa0 3e93515e 3e93515e -> 3f69cabe 3eb1b052 3f98a555", + "3e800000 3f34ae9a 3f27a8d5 3ec79bac 3f119b1f 3f119b1f 3f90cb5a -> 3f3745a0 3f2ab27e 3f034d70", + "3f400000 be081234 bdcc3f0d be081234 3f8cd8da 3f7bff06 3f8cd8da -> be814e1a be3051d8 be814e1a", + "40000000 bd466e17 be524701 be524701 00000000 3f800000 3f000000 -> 3d466e17 bf1db541 be524701", + "00000000 3f46b88d 3f3e94b1 3f33028d 3f2aa57a 3f21e033 3f95ebd1 -> 3f46b88d 3f3e94b1 3f33028d", + "3f000000 3e2da8b3 3e2da8b3 3e04f394 3dc2b9ee 3dc2b9ee 3e1e2863 -> 3dceaeb1 3dceaeb1 3dae053c", + "3f800000 3f642e8d 3f89adce 3f99add6 3f9a0a10 3f199012 3e9b8eb0 -> 3f85a8bb 3f87bef7 3fa3c11b", + "3fc00000 3e1c5393 3e1c5393 3efd7be2 3f8f0ead bd8ee709 3f3471c0 -> 3edefe0c bdddc628 3f4ca2a3", + "bf000000 3f121b11 3f6bda29 3f6bda29 3e517b33 3e9b67f7 3ec8cba4 -> 3f329256 3f6fcf88 3f6e0649", + "3e800000 3e5af54f 3f393e72 3f9c62d1 3f531956 be4ebd3e 3f6a12ce -> 3e7e7eea 3f20698c 3f968151", + "3f400000 3f99fb4c 3f51a5d7 3e2368fe 3c1f4357 3f9e8ae6 3c1f4357 -> 3fad16ca 3f82804d 3d2cf0db", + "40000000 3f19eb7e 3f19eb7e 3f7e873e 3f513467 3f46d8ba 3f44c208 -> 3f8db884 3f8575cd 3f800e01", + "00000000 3f858070 3eeb98d0 3ede025e 3ed0ecc3 3ed0ecc3 3f41d153 -> 3f858070 3eeb98d0 3ede025e", + "3f000000 3f90a463 3edaedcd 3e09ee38 3f8980f4 3f1b4984 3f65993c -> 3f8715de 3ef243c0 3e40abc4", + "3f800000 3f8fcc14 be1d0350 3f8fcc14 3adedc0d 3adedc0d 3f48c0e7 -> 3f9f8a68 ba08afd6 3f86d17a", + "3fc00000 3ed39b71 3f897be4 3ed39b71 3f7edb3e 3f6211a3 3f6211a3 -> 3f838ba8 3f7d2b4d 3f6365d8", + "bf000000 bdc6b1c5 3f9d1865 3f4fa33a 3e55ba84 3f8a0c94 3f8a0c94 -> be0048ff 3faded5b 3f33a8d7", + "3e800000 3f2d211c 3f3c3f4d 3f3c3f4d 3f97caa8 3f18ea51 3f97caa8 -> 3f498c76 3f3f8b57 3f537b6c", + "3f400000 3f328ad6 3f1f7bc6 3c23020f 3f99413c 3f0f2f14 3f0f2f14 -> 3f81c7a0 3f281205 3c3182b4", + "40000000 bb631c98 bd6b92c9 bb631c98 3f6b2912 3f6b2912 3f9a724d -> bc17d889 be1d80d7 bc59420f", + "00000000 3ed11c41 3f6542dd 3f1f977d be6dc97c 3f5f19f7 3f5f19f7 -> 3ed11c41 3f6542dd 3f1f977d", + "3f000000 3f1aa1b3 3f12f326 3f843769 3ca4deba 3f2be886 3ca4deba -> 3ed3f9a2 3f25a75c 3f863d64", + "3f800000 3eef78a5 3f1f0301 3f1f0301 3f45c65f 3f45c65f bdccc936 -> 3f390167 3f53e1b2 3e2a8234", + "3fc00000 3f9e9476 3f9e9476 3f072b04 3dabd815 3ec8d633 be0d52e1 -> 3fc4c089 3fa876cb bec03790", + "bf000000 3ee4447b 3f8e0e3f 3f9cbe28 3ee75ea3 3f9712d6 3e28b576 -> 3eef3fa1 3f979dff 3f931b5e", + "3e800000 bd81db93 3f55d4c7 3ebc1273 3e559ad4 3e559ad4 3b7fdc66 -> bd5ddfeb 3f4fafe8 3e8d6bd2", + "3f400000 3f97455d 3e0e9a49 3e0e9a49 3f001b43 3f501aed 3e405db9 -> 3f9741a5 3e51891b 3d97ab16", + "40000000 3f686a08 3f656048 3f656048 3f898074 3ef13f4f 3ef13f4f -> 3f8f4b6a 3f624ebc 3f624ebc", + "00000000 3f8f7286 bd6ca6be 3f86eed6 3f880206 be79b5d0 be1517a9 -> 3f8f7286 bd6ca6be 3f86eed6", + "3f000000 3ddf124e 3e779a95 3f15a6c9 bdd0623e 3f9c04ca 3f138574 -> 3d31ad2f 3ed4cd7a 3f1dc2d8", + "3f800000 3e162a20 3f9c0146 3f9c0146 3f062f83 bd923f52 be74b151 -> 3e1d6bd7 3fbc0276 3fc564da", + "3fc00000 3eedaf79 3f3f6fe8 be53e801 3f666ead 3f883507 be66d082 -> 3f82bfe0 3f9659a7 3e793f48", + "bf000000 3f9ad8f8 3f926632 3f30bf2f 3f8866d3 3f115521 3f8866d3 -> 3faa0895 3f93a51a 3f03eb0f", + "3e800000 3dec34fb be246f88 3f92d119 3f90fbea 3f90fbea 3f28eea4 -> 3e1b76fd be587432 3f914ffe", + "3f400000 3f7729bb 3f105a1d bd96a1bc 3de19a80 3f808af7 3ea28bfa -> 3f71fed7 3f64cc59 bd5ac7ef", + "40000000 3f905193 3f549b5d 3f549b5d 3e408995 3e0753fa 3e408995 -> 3fa4aec6 3f14c264 3f1e74e3", + "00000000 3ea3c022 3ea8b10e 3edc2c62 3ef57ed1 3ef57ed1 3e3162af -> 3ea3c022 3ea8b10e 3edc2c62", + "3f000000 3ee7e116 3e975634 3f76b9e4 be707dba 3f82bc7a be3c41de -> 3df5ed46 3ee63d7e 3f70625e", + "3f800000 bc8a9638 3f4c1a4e 3e0bb19d 3f87e3da 3f87e3da 3ed8c5c8 -> bd132121 3f8332f1 3dec9393", + "3fc00000 3f2bfb74 3f2ad148 3f2bfb74 3b2cc430 3f3e757d 3f3e757d -> 3e3a7af0 3f692a82 3f697a6f", + "bf000000 3f387548 3f83758c 3e2edfb6 00000000 3f800000 3e800000 -> 3f5c3aa4 3f853052 3e5a97a4", + "3e800000 3f8d004b 3f8d004b 3d8ece61 3e0ab7f1 3e972362 3f5ad714 -> 3f8f5eee 3f8e5520 3da824a5", + "3f400000 3f616d7c 3f616d7c 3f9d64a2 3f0cb4b9 3eeadedf 3eeadedf -> 3f63b429 3f5f8901 3f9f366d", + "40000000 be2546f3 3f14b43a 3f14b43a 3e800000 3f000000 00000000 -> 00000000 3f14b43a be83c6a4", + "00000000 3f9d8736 3ce2198e 3f672129 3f31ee80 3f9be83f 3ef50613 -> 3f9d8736 3ce2198e 3f672129", + "3f000000 bd60be7a 3eec5d75 bd60be7a 3ea274ab bdd6d9b7 3cb6b8a6 -> bd37aeb8 3e3ac5ac bceac512", + "3f800000 be74ff2e 3eadb321 3f31db17 3cff0cde 3ead0940 3ead0940 -> bc74167f 3e6ad0a8 3f1887f2", + "3fc00000 3f10407a 3e7b2440 3dca1c83 3f386318 3f386318 3ed75985 -> 3f5a17ee 3ed08bd7 3d99f8ad", + "bf000000 bd511bf7 bd511bf7 bd93065c 3f9e09c8 3da52c2a 3f9e09c8 -> bc5dedcc bd946647 bc9c09d1", + "3e800000 3f60ce27 be38d192 be38d192 3e7e52df 3f86eee7 3e7e52df -> 3f5ce162 be6c075a be2190a6", + "3f400000 be2301ef 3f120ad8 bd9eeec1 3f934b11 3f5d4532 3edd95da -> bea10f1b 3f4e2284 bd8ee88c", + "40000000 3ee7fa9a 3e35c248 3f782112 3f929d0d 3ebf018c 3f929d0d -> 3fcfb7d2 3db2efa4 3f86397a", + "00000000 be715674 3f6a2d67 3f27e850 00000000 3f000000 00000000 -> be715674 3f6a2d67 3f27e850", + "3f000000 3f8ae344 3f18c98c 3f18c98c 3f94cf96 be4caa48 3f33b1e5 -> 3f83ac77 3ea11a9e 3f2da11e", + "3f800000 be19f1a9 3f4eca4c 3f80dea8 3f84163a 3f75c606 3eaa6b44 -> be9edbf2 3f7c1184 3f812917", + "3fc00000 bdfc2599 3efeb9cb 3f843617 3f800000 3f800000 00000000 -> be9d9780 3f9f341f 3f8a873a", + "bf000000 3e56d661 3e56d661 3e083ed1 3e5c3d81 3ed3eb59 3f620a79 -> 3e8a064e 3e695578 3da82264", + "3e800000 3f1d9d49 3f9ef7b1 3f9ef7b1 3dcdecaf be71e0fb 3f27a3cb -> 3f09f6dc 3faa5dea 3f9c91eb", + "3f400000 bda84aad 3f16b5e6 3df3ad18 3f0b724a 3f8697fa bdf29bdd -> bdb39431 3f6dd034 3c0cf534", + "40000000 3f686c99 3f686c99 3f8adf25 3f8b085f 3e4f519e 3f8b085f -> 3f8fda1f 3f4c5d80 3f62c29c", + "00000000 bd741231 bd741231 3f599860 be401d0d 3f12c322 3f4ced01 -> bd741231 bd741231 3f599860", + "3f000000 3f9b89c9 3e5104f8 3f4db3be 3f7013f9 3f42838e 3f42838e -> 3f8f7b5b 3e83a9d5 3f5ac540", + "3f800000 bd9844ca 3f2cb7ac 3f2cb7ac bdb8c0ea bdb8c0ea 3f46fffc -> 3c5bc860 3e94d150 3f5ae9c8", + "3fc00000 3f017187 3eb44d5d 3ea57d80 3f400000 3f800000 3f000000 -> 3f605c62 3f6160b4 3ea57d80", + "bf000000 3ea75617 3f00b8c9 3f8d8897 3f850161 3f850161 3eddb9f2 -> 3e1a3fc2 3e706c18 3f8ca0ab", + "3e800000 3efde1f5 3d82b5c5 3f11ce85 3f4a9a35 3f4a9a35 be6cbba3 -> 3f11700a 3d95c168 3ed30ab4", + "3f400000 bd3f68c6 3eefdaf8 3eefdaf8 3f9b33f4 3f9d6c28 3e808618 -> bdc5fe05 3f7b394f 3e964715", + "40000000 3f7bf7ab be6a07cb 3f918c38 3f1f0e8a 3f3adc89 3f2d70c8 -> 3f7dec9f bee0a2a5 3f8516b4", + "00000000 3f508040 3f508040 3f438d11 3f431fc5 3f431fc5 bd68b1c8 -> 3f508040 3f508040 3f438d11", + "3f000000 3f8642a7 be148892 3ebbd19a 3f9b2e8f 3f3b0c3f 3f9b2e8f -> 3f81ccfd be36cb27 3f20ce77", + "3f800000 3c84c2b2 3f89455f 3f30f8cf 3da51b45 3f9b01da 3f9b01da -> 3b2b3f42 3f782cef 3f90aca9", + "3fc00000 3e8c9d82 3e56bec1 3e56bec1 3f691b4a 3e9f0a27 3f691b4a -> 3f1ce825 3db97c38 3eefa013", + "bf000000 3e3b4665 3e41fc60 3f0434e8 3f4b9afe 3f07e8d0 bddcc5b5 -> 3e03f763 3e3bfe0f 3f4f72b8", + "3e800000 3f8c5d27 3f14abdf bd35dee7 3f800000 3f000000 3e800000 -> 3f8945dd 3f14abdf bd1f230a", + "3f400000 3eb9bf20 3da5cf18 3eb9bf20 00000000 3f000000 3f000000 -> 3db9bf20 3da5cf18 3eb9bf20", + "40000000 3f2cc7cf 3f9595de 3f2cc7cf 3f1ad2cb 3f1ad2cb bd4f06b2 -> 3f4fa8bb 3f8c89e4 bd27bbc0", + "3f708c56 be63fd5e 3ea2375d 3f9cf92a 3ef085f5 3f03b69b 3ef085f5 -> be5709cf 3ea6a35d 3f9e9e83", + "be9e9a8e 3cf7f916 3e96f43b 3cf7f916 3f4862b6 3e7f5ea8 3f4862b6 -> 3ccc8872 3eae6470 3ccc8872", + "3fa0e9ae 3f035038 bd025fe8 3f09115a 3f9ed72c bd9e65bc 3f508541 -> 3fb5cc22 3c6b80fd 3f671f26", + "beced400 3e23e36f 3f30e211 3e23e36f 3f037f93 3f226f06 3f7ecaa0 -> 3e221439 3f28490e 3dc49e2a", + "3fa43d28 3f6f7f37 3db55611 3f6f7f37 3f61e67b 3ec11a9e 3f61e67b -> 3f7fb15d 3d785769 3f7fb15d", + "bed3e1c5 3f3fec7a 3f3fec7a 3f8a56b3 3e660139 be541533 3e660139 -> 3f4e8748 3f656ca8 3f87fb72", + "3f81e522 3f5343de 3f3601bc 3f86e7db 3f000000 3f400000 3f800000 -> 3f5343de 3f5b8d16 3f7fcba7", + "3f794367 3f952571 3f9c1d66 3f9c1d66 3f873836 3f77526c 3f904c4d -> 3f7c77b7 3f829886 3f738988", + "3f1a17b9 3e833223 3e3b5915 3f060077 be699ec1 3f95b61c 3f95b61c -> 3d018aa2 3ea92fc4 3f6858e0", + "3f914f41 3f8cc0fc 3f2425ba 3f080947 3f46d885 3f76c375 3f46d885 -> 3f84bd7f 3f8272ce 3f5369c5", + "3f48733f bdfa1157 bdfa1157 3f4912b4 3f000000 00000000 3e800000 -> bdfa1157 bcd90cdf 3f3391a5", + "3ec61699 3ea9bd94 3ea9bd94 be37ccff 3f9f1dbd be791d09 3d889a09 -> 3f05ab8f 3e103bfe bdf45a27", + "beb1f524 3f6f9a1a 3f7b2e5c 3f40b96e 3efc25ed 3efc25ed bdcee349 -> 3f6fb00e 3f7b34d0 3f5b2924", + "3f820e7b 3e643939 3f674e79 3f674e79 3f88746b 3f90fb9f 3f082bb9 -> 3ef55fbd 3f8386fe 3f68e87c", + "be1cb890 3f64ca3f 3f413115 3d0191c8 3f67f996 3f67f996 3f7fd08b -> 3f616841 3f396221 3cdb8925", + "be6d65f7 3f2212ea 3f2212ea bdc5e715 3ebfe5b2 3ec4fa79 3ea8ee10 -> 3f2786c5 3f271820 bdd581e9", + "bd7432ee 3c86e13c 3e55620f 3f2edee6 3edf242c 3ef9f3cf 3b694c75 -> 3c87e976 3e55aefe 3f33ac50", + "3f76626c 3e00edd1 3f97766e 3f66ebb9 3c2ac22a 3c2ac22a 3f3e6f59 -> 3bedbbe1 3fad92c1 3f72b1bc", + "bd9d12b4 3f2db44c 3f2db44c 3cf37860 3e025972 3dfa9cd7 3f44be20 -> 3f3268bc 3f3278a7 3ce97117", + "bec36dbf be4a8070 3f856e89 3f462224 3f42f136 3f0d8cee 3f8e9fad -> be2213f2 3f85a6b9 3f2affbc", + "3e58ce61 3f9cccac 3e06bbee 3f235d59 3f6f270b 3ea84372 3f9ed505 -> 3f978127 3df9ea39 3f406d31", + "3bdf9eda 3f5ca8ef 3f90a9f6 3e7ef734 3e92ecd1 3e60ed5d 3e180d34 -> 3f5c8ea1 3f90ba49 3e7dbe0d", + "3ded70d2 3f57c164 3e446573 3e4bfe79 3f185dc5 3f99d0ff 3f73d716 -> 3f58a4c5 3e6459d7 3e6165dd", + "3f74abdf bd5a1c7e be295b4d 3c61f761 bcc346a1 3e7f749b 3f7bce19 -> 389294f1 bdb081bf 3cd96d78", + "3f80642b 3df61eb3 bb676f9c bb676f9c 3f99a485 3d52ba25 3f99a485 -> 3e93f9f6 b9b96e04 bc0b25dc", + "3f0f5f9b 3e1cb65d 3f851ad7 3e1cb65d 3e974d92 3f63c0dd 3e28d58b -> 3df1a2d0 3f82e074 3dc3c609", + "3fb5e750 3e2fa54f 3edd69c4 3e2fa54f 3e955e4d 3e955e4d 3f8a8348 -> 3d8f5920 3e34b32c 3ee92188", + "3f8c4518 3f1889f0 3e37847e 3f70a488 3f800000 3f000000 3f400000 -> 3f84f575 3e37847e 3f790eb3", + "3e44549c be41dca7 be41dca7 3e9a89e7 3e800000 3e800000 3f000000 -> be2f4706 be2f4706 3e9a89e7", + "be932122 3deff57f 3f0ae87e 3efc0a85 3ec400b8 3ec400b8 be1b3aae -> 3e000f4e 3f12cb44 3f2d369f", + "3eb42f43 3f2f159e 3f2d2db9 3f257469 3eb0c801 be280f55 3eb0c801 -> 3f2645c8 3f0676f4 3f1b981c", + "3f583e86 3f31c662 3f31c662 3f9058ed 3f013c6d 3f013c6d 3d7eaf9d -> 3f3269bb 3f3269bb 3f9c7057", + "3cee6201 bd16eddb bda056ec 3f9c59c7 3f9472a2 3f2dbdee 3f2dbdee -> bd1cb96b bda201c5 3f9c0e4e", + "3f3a2929 3ec3a800 3f9e4403 3f637b2c 3ce61c19 3e822dc8 3f2f48f0 -> 3df57ae3 3fa91533 3f6b246c", + "be875b9c 3e5ed597 be0d6ec5 be0d6ec5 3f33d70b 3dee8c78 3dee8c78 -> 3e46f9b5 be2a1ce8 be2a1ce8", + "3f0657bb 3caa616a 3caa616a be221151 3f9e8625 3e4e85a1 3f1f0e3f -> 3d1737cc 3c6a118a be36b3d6", + "3d8d55c4 be40e505 3f3788d3 3e6128c9 3e800000 00000000 00000000 -> be3a3d19 3f328896 3e519eed", + "be7f8987 be3961f2 3f598663 3f18bfb6 be5baac5 3f05ea52 be652c39 -> be7b7e17 3f5914cc 3f3e0c48", + "3fa4fdb7 3efeab21 3e76eb32 3e76eb32 bce05f7a 3f81c83c 3f9bd553 -> be372896 3f0f83b6 3f2fe72e", + "bef7c9fd 3c53f3c2 bb39b55e be2c2a71 3ee7c928 3ee7c928 be2cd6c6 -> 3c5da794 bb4235a5 be8dcebc", + "3f07621f 3f02dcd7 3f02dcd7 3f9c50b5 be6a7c84 3e8ffc2c 3e8ffc2c -> 3e0981c8 3ecbcfe2 3fa2de0c", + "bed6797c 3ed36395 3f584b63 3ed36395 3e5227a9 be6fae8d 3f023dea -> 3f03cbe2 3f70b68c 3ed1d68d", + "be72c3b3 3f4285f8 3f2c3bec 3f4285f8 3f2a8544 be70a59b be36e8e3 -> 3f3dae88 3f496d3f 3f564df9", + "3f9e3f51 3ea01975 3f193104 be25c87d be43ceb2 bd6706ce 3e9840b1 -> be630ee5 3d3c0250 bda5711c", + "beeed9ce 3f8c6985 3f93806f 3ecc795a 3f949092 3f308b84 3f298df0 -> 3f941028 3f96f3ba 3ead81be", + "bec8ea4b 3f928b86 3f928b86 3f08b3f4 3f375158 3f897839 3f897839 -> 3f95b0a7 3f9ae62a 3ea5ecda", + "3fa27215 3f3291e9 3f3291e9 3f6f5d4e 3e800000 3f400000 3f800000 -> 3f016fbd 3f63b415 3f823d05", + "beee13f9 3e69662a 3f9a46aa 3f9a46aa 3f4a9342 3f5ab96e 3f3b5aad -> 3e2a2aea 3fa2efa6 3f9ff113", + "3f9d7171 3e0f89f0 3f8ea0f6 3e0f89f0 3d860b4c 3f4ea52e bdc581d1 -> bc1e7e1b 3f8392b8 bd86247c", + "3f57868c 3f435258 3f351f48 3e8ddfca bdcdcea3 3f804980 3f5196f9 -> 3f05f833 3f7471c3 3eda0281", + "3f9fb307 3ec15445 3f7ec765 3eb60960 3f9b4097 3f6699e8 3f9b4097 -> 3f864fca 3f800003 3f7ceecc", + "3e9a0b72 3e9c7060 3dc44e76 3dc44e76 bd5d7aba 3f700c34 3f7b6a0f -> 3e509008 3df80215 3dfd40c4", + "3e9b8e9b 3ed4d1ca 3f81df5a 3f1a92a4 3e297468 3f902027 3e5598ee -> 3ea98f6a 3f812905 3f089ce0", + "3f97eb92 3ecbf21e 3ecbf21e bbd409c6 3eba6aec 3f826c26 3f613d47 -> 3e8a2720 3f63954a bc499c74", + "3f850fd8 3f539e65 3f357d69 3f539e65 3e2f7fa5 3f92064f 3f92064f -> 3f354bea 3f8c616c 3f875fd6", + "3f350979 be453931 3f8ba472 be453931 3f6c5d1a 3f11eb08 3f688609 -> be9da641 3f8a7d66 be9b8eab", + "3f0a4a2a 3edc0c4f 3edc0c4f 3e17c296 3f640275 3f39679b 3f39679b -> 3f1c762a 3f08adc7 3e3c86a7", + "3fb1dd58 be20d7dd 3ef04d4a 3f95aad4 3f046f28 3f046f28 3f7e14a8 -> be2895f9 3efbde96 3f70056c", + "3f4f2b32 3f3b3c14 3ecd56d9 3f3b3c14 be70f77e be70f77e 3f0d460b -> 3ed2caa8 bd9c27a8 3f410164", + "3eb88aac bdf6ded4 3f9f52bf 3f9f52bf 3f8f2179 3e9857df 3efed6dc -> be32718f 3fa3e506 3f9f5fda", + "be7c419f 3f0e59f0 bbb2dd6c bbb2dd6c 3e625184 3f291549 3e625184 -> 3f1df902 bba4b8fc bbcb7352", + "3f9493b3 3f85f7a2 3eb9138d 3f286eed 3e65b4c1 3e65b4c1 3e05ffeb -> 3f89c94d 3e05423e 3ebac882", + "be0b8614 3f0e5fc7 3f2c3356 3f2c3356 3f637539 3f940c05 3f940c05 -> 3f02582d 3f1d34c0 3f1d34c0", + "3f9443f3 bde2178e 3e5da9bf bde2178e 3df22cc0 3df22cc0 3f2a191e -> bc511f9b 3ccd06e4 be1c1cc2", + "3fbc2ecf bdf1b730 3f9d43cd bdf1b730 3efacf31 3eaa498b 3f6fb29a -> bdea829c 3fabab8d be89f485", + "3f84d7cf be39c1c0 3e93b449 3e93b449 be643645 be643645 3efb63fd -> 3db9ea5d be13d494 3e90f1b2", + "3faea1cc be2728ee be2728ee 3f4fe4c0 3f4de56c 3f4de56c be0bd9da -> be98f957 be98f957 3ef8ab12", + "beda7413 3eb8daf3 3f7fbb37 3eb8daf3 3f1ebb9c 3f1ebb9c be359b36 -> 3ea5eb0d 3f7fb42b 3f11d9f0", + "3fb561a4 3f518135 3f37e3b6 3f2438c7 3f6c8fae 3f6c8fae 3f893374 -> 3f84b13f 3f87470a 3f9c7c7e", + "bd17c9d6 3f8ffd0b 3e828ea3 3f1ef9a2 3ec3bee0 3ec3bee0 3e6da6d7 -> 3f8fd958 3e83b229 3f20e6d8", + "3e94d457 3f1eb22c 3def6914 3f1eb22c 3e68593d 3f978a65 3f978a65 -> 3f0f3f42 3e274cdd 3f45625e", + "3f02a8d3 3f089f87 bdf3270b 3d2f87c9 3f7fd2e3 bdcbba86 3f7fd2e3 -> 3f4577c5 bd3cb824 3d847f76", + "3ed97fc0 3f373993 3f373993 3f62ef5c 3f4122a6 3e1edea2 be64fb92 -> 3f46f4e7 3f21e70d 3f5110f1", + "3fbcffb5 3d79b9b8 3ec6bed5 3ec6bed5 00000000 3f000000 3f400000 -> bcee03df 3ec6bed5 3f2cbcbf", + "3fbfdee2 3ea8cbf7 3ebd09c8 3ec93128 3dd5b03e 3db767b6 3dd5b03e -> bd7b69a6 bdae4d19 bd95d4ee", + "bece560d 3f9e04ef 3e3a590d 3e3a590d 3f5d7a69 3e7487e0 3f4927a8 -> 3fa6dab0 3e619449 3e0f6d71", + "befda8f4 3f97879e bad98bbe 3f97879e bd1abd04 bd1abd04 3f9862a7 -> 3f8afddc bb26bbe2 3fa7a0f8", + "3fb203e6 3f986fa6 3f953b97 3f6c0f22 3f554518 3ee5ebae 3f554518 -> 3f81cbf5 3f983db2 3f7e88a8", + "3e851606 3e42fc81 3e404534 3f805e63 3f78ae32 3f7240d9 3f7240d9 -> 3e72c586 3e6ce165 3f80487d", + "3fb73745 3ed04535 3ed04535 3f571eef 3f586b48 be2542f0 3f206281 -> 3f4f1976 beba10f3 3f65ecd2", + "bef63269 3f142b75 3b851cb9 be473fb3 be153c42 be153c42 3f199afe -> 3f57222a 3bd7c6b7 be341536", + "3f7bdeaf 3de96731 be7e4c64 3e9f53df 3f523d67 3f523d67 3ea320b6 -> 3e3e78f4 becf8642 3e4ceaf9", + "3fb70208 3f4124b2 3f9b028c 3f9b028c 3f2a4cb3 3e23a4cc 3f2a4cb3 -> 3f5ed791 3fb548dd 3f8e3f8a", + "be4f266d 3f7a7e93 3f7a7e93 3f9ddb4c 3e23cdf4 3e23cdf4 3f885e89 -> 3f7b407a 3f7b407a 3fa4afb2", + "bef5d408 3efd0881 3f02c6d3 3efd0881 3e800000 3f400000 3f000000 -> 3f1ce397 3ec96dee 3efd0881", + "3f379104 3ef4b758 3ef4b758 3ee0fba3 3f2335b5 3f1fdacd 3f1fdacd -> 3f127e1f 3f103162 3f0490cb", + "befb8e01 3d00b948 3f2f2794 3d00b948 3f800000 00000000 3f000000 -> 3c82f57f 3f56e019 3d00b948", + "3f4022df 3f63e4ce bd88b1c9 3f63e4ce 3e800000 00000000 3f800000 -> 3f5958b1 bc88674e 3f78fd08", + "3f9847cb 3f9306fc 3eceb9ac 3f9306fc 3f26079f 3dbadeba 3e215141 -> 3f8c4d42 3c355cee 3fa2881d", + "3e4e12b7 3f196c67 3f14418a 3f196c67 3f8041ec 3f8041ec 3f90d666 -> 3f2e263c 3f2a06a8 3f337f44", + "3f904097 3f97a5c2 3f8bf0fb 3f8bf0fb 3e92a397 3f1e9400 3ed60128 -> 3fa3083b 3f88b9f8 3f8e2623", + "3f8ac255 3f09be35 3f635085 3f09be35 3e684e3b 3e684e3b 3eb2e717 -> 3e876c62 3f5253be 3ec6451a", + "3d459245 be640339 3f528878 3f5bc20c 3d850691 3edb79c6 3f6b9dd9 -> be5a7170 3f52385e 3f5d3a4e", + "3ebd86be 3f81ed7e be51c966 3f81ed7e 3e6b3ff2 3e6b3ff2 3ea68cbf -> 3f82503c be27cfae 3f822d52", + "bec36d4a 3f91f069 3f98678b bdc2e046 3f868cf6 3e8a6e2d 3f94190e -> 3f997cb7 3f942061 bd424504", + "3eb4a14c 3e98dae4 3e98dae4 3f093454 3e800000 3f000000 3e800000 -> 3e7bc8ac 3e98dae4 3ee87fa0", + "be150ca5 3ecb730c 3e8dd3e7 3e8dd3e7 3f7f3c85 3da24706 3da24706 -> 3eae0346 3e9f333b 3e9f333b", + "3db56eb0 3f9654c5 3f82c02d 3f836820 bdc187ec 3e8f8c18 3e8f8c18 -> 3f98aeef 3f82db94 3f838a10", + "3f8515f2 be002efa be2c0bbb be002efa 3f89df7e 3f1a7474 3f775255 -> be8d0290 be510452 be7c6c84", + "3f91f425 3f16b0b1 3ebfe71b 3ebfe71b 3dbe23f9 3dbe23f9 3f901c83 -> 3e53a030 3cdb6e55 3f68e770", + "3f0056c9 3f930cbe 3f9275be 3f9275be 3f98f635 bdb9a55f 3f0eeb10 -> 3f85c65d 3f9d6462 3f9161a0", + "3ec92ad4 be3b6aa0 3e7188c5 3e7188c5 3e7b2ba2 3f4691d2 3e9e0e1c -> be15e74a 3e92ed71 3e4d39cd", + "3fa1e016 3f7426ea 3e3de92d 3f7426ea 3f1ad9e2 3f1ad9e2 3f047c21 -> 3f774b91 3e704ae3 3f74ad50", + "be80c87c 3e940eb7 3dd992bf 3ed7d982 3f400000 00000000 3f000000 -> 3e816fe3 3e082650 3ed7d982", + "3fa2d74c 3f311da3 3f1d16ae 3f1af753 3e99c099 3d28b123 3f83df6f -> 3f090874 3e2679b0 3f91a3b3", + "3fb1e1a8 3e663e6c 3e663e6c 3d9815e5 3f01acfa 3f06d3c9 be65a2b5 -> 3e6a6ec3 3e774f78 bd9a0f98", + "be972f48 3f35ae52 3ec71efa 3f35ae52 00000000 3e800000 00000000 -> 3f4ba046 3ee484fd 3f4ba046", + "3fbcddf2 3f691ece 3f691ece 3f87f219 3f887480 3f0da2da 3da8f4ee -> 3f87ab7f 3f6cb781 3f91bc3e", + "bdbd828d be26d0f7 3f4e819b 3b5f71da 3f6fbe5b 3f3a5560 3f6fbe5b -> be19572c 3f4c6b4a 3b4d64f9", + "3f8f5931 3f3aadd6 3f1163f1 3f889b11 be7074a1 3e31ae2b 3e31ae2b -> 3e912c24 3e8102cc 3f8ee618", + "3f4bb982 3d797b73 3edc05b6 3d797b73 3dddd51d 3f9f65d7 3dddd51d -> 3cbbe89d 3f7081f3 3cbbe89d", + "3f0f5505 be62749b 3f6547c8 3eed2217 be701cbf be701cbf 3f0311f8 -> bd20d12f 3f4f4df5 3ef05156", + "3fa39c75 3e3e6394 3e3e6394 3f70883c be49445c 3ec7085a 3f9f809f -> be14a1de 3e083c24 3f870482", + "be99a4fb 3e23c4c3 3f38859d 3f38859d 3f800000 00000000 3f800000 -> 3de53f63 3f4df8b8 3f231282", + "3f98ccd3 3f553d6d 3f023707 3f023707 3e48c440 3e48c440 3e49c931 -> 3f3635ff 3e1bc0fc 3e1cf318", + "bdcd20f2 be16239f 3f0ae505 3efb5e29 3f933c83 be0e9c42 be0e9c42 -> be0294c8 3f19e418 3f0dc762", + "3f440014 3f8e65f0 be72bd36 be19c272 bddaa732 3e5d0b67 3e5d0b67 -> 3f9bc693 be09208d bdadb8ef", + "3faa849f 3df05c23 3f2e8526 3df05c23 be7bd656 3f98ba5c bd6f033a -> bded5684 3fa28092 bd6a6b8d", + "bd7ff248 3f16c853 3f89a44d be24d9a5 3f6078d0 3f553366 3f553366 -> 3f11d3c6 3f8a0af7 be1dfe57", + "3fbd225c 3e5d1689 3e5d1689 3f2b2cc8 3f8f73e4 3df1e1a1 3df1e1a1 -> 3f1ca969 bce36c0f 3e96e2c8", + "3f6a8124 3f7ee8a6 3f7ee8a6 3e837ec3 3efc9e27 3f7616e1 3f83338d -> 3f7ee545 3f7fd4bb 3f00fcb8", + "3ea3b67e 3eb2b1cd be750051 3eb2b1cd 3f400000 3e800000 00000000 -> 3ecf4373 be4dd4da 3e731d02", + "3f979bfb 3f34ccdf 3f868e1e 3f868e1e 3f8ec5dd 3f031b3e 3f1b9ccb -> 3f913710 3f865de1 3f84e157", + "3f8366c8 3f33c046 3f9e179e 3f24500a be11466f be11466f 3e1b71aa -> 3e9e8836 3fc5bfde 3ec587a6", + "3ecd5a20 3e91fc03 3f23ce70 bd02cfc8 3f471ad3 be61ad36 be61ad36 -> 3eb2828d 3edd0fec bc5ce1ae", + "be246132 3e6988c7 bcb00094 3e6988c7 3f000000 3f400000 00000000 -> 3e6988c7 bca1e02d 3e8782ed", + "be08ca16 3e2f8855 3f1664fc 3e17c095 be0ad8b4 3ee545d7 3f732b3a -> 3e4d56f0 3f17de07 3e058346", + "3f266f46 3e8a26df 3ebe40ff 3e8a26df 3f94035a 3f0eaf32 bd844ae1 -> 3f00071d 3ecc71a2 3d92ec4c", + "3fa3eac3 3ed925b9 3e8ed686 bc2c408d 3efdcca8 3ad95018 bd0d5456 -> 3ed6c1ca bd9de570 3b7e39fa", + "3da89441 3ee7876e 3f88fdbd 3ce033d9 3efe2db6 3f912637 3f6c6019 -> 3ee764b7 3f880d81 3cefd3fc", + "3f0c9198 3f9ce514 3f551cd3 3f551cd3 3f806aef 3f9c06de 3f976864 -> 3f8cecdc 3f76f981 3f754667", + "bccf7036 3f92116e 3e281aca 3f9bc0c2 3f14976f 3f14976f 3e39213d -> 3f922446 3e276b7c 3f9b4de7", + "be705df8 3edd6b28 3ea3f960 3f127c71 3f860e11 be0e090b 3f100c76 -> 3ea486ea 3ed5245b 3f0f4354", + "3e961732 3f40556e 3f251e47 3f251e47 3eae3d2d 3eae3d2d be52b72b -> 3f3a5f7c 3f1c9c08 3eff0644", + "3f97bffe 3e635142 3e635142 3f1e6278 3dcccccd 3dcccccd 3dcccccd -> 3c3b899f 3c3b899f 3e839af0", + "3ebd5447 3f911b0e 3f596771 3f596771 3e942add 3f62a033 3f9a5801 -> 3f93c524 3f6466a5 3f6d8d0a", + "3f4d1de6 3f8a1cd2 3c058ba4 3c058ba4 3d006bf7 3b283763 3b283763 -> 3f91b503 3ad8bebe 3ad8bebe", + "3f655b54 3cc02757 be0f2c90 3e7a5778 3f9b2fb1 3f9cc89c 3cda5154 -> 3d5ab811 bea49196 3d180923", + "3f8832e8 be71e7d2 3f96bf1c be71e7d2 be12eb9f 3f2354fd 3f13bf99 -> 3db2b6c4 3f9010cb be8ccf2a", + "3f381741 3eb6a0ae 3eb6a0ae 3f933a0f 3e1e217c 3f8d6a23 3e2d32c4 -> 3e37b846 3f2abdd0 3f9c6035", + "3f1f3c1f bdfc0526 bdfc0526 3f8618f7 3f8d4d08 3f8d4d08 3f83ae19 -> be5cadd8 be5cadd8 3f821633", + "bdb1899d 3f920721 bda7e1f4 bda7e1f4 3f10f6be 3f5aa5bf 3f5aa5bf -> 3f923c27 bd9d937d bd9d937d", + "3f0f40ab 3e832562 3e832562 3f738603 3f8ceafa 3f06569d 3f06569d -> 3edb5866 3e86c7af 3f73de84", + "3f920c9d 3efb3f7b 3f599c04 3efb3f7b 3d1576d1 3d1576d1 3f4d2595 -> bce81b47 3f310094 3f5403e9", + "3e4dd9ce bd10ba59 3ef14239 3ef14239 3ef54da3 3e5f7b62 bd8e66a4 -> bd0f8323 3ed5edc2 3eba03cf", + "3e025170 bde904c1 3f07183f 3e35acfc be39cc23 3f278fbc be39cc23 -> bdc09a39 3f0bd9b4 3e162a30", + "be64a072 3f8b2c9a 3c0c5a00 3f25b4f3 00000000 3e800000 3f000000 -> 3f88adec 3c1c0504 3f25b4f3", + "bebf93c5 bda1b848 3f030171 bdfcddd8 3ecb56dc 3ecb56dc 3e925051 -> bdae2adb 3f0ca05e be12b3f8", + "3d8cf484 3ec41fbb 3ec41fbb 3e2ddce9 3f4b629d 3ece498e 3f4b629d -> 3ecc12e3 3ec180b1 3e34e911", + "3dd0900f 3eed48f8 3e154ea7 3e154ea7 3f911efe bdd33bdc bdd33bdc -> 3f05f4fa 3e02f735 3e02f735", + "3f834b11 3ea63e48 3f93c223 3f13a9cc 3e9189ea 3eff220c 3f34af92 -> 3e3954c1 3f93d3b5 3f41671f", + "be62367e 3f6e7c9f be2b61ca 3f6e7c9f 00000000 3f400000 00000000 -> 3f725b0c be1873b1 3f725b0c", + "3f9c9899 3eddee8b 3eddee8b 3ecc28d8 3d14c60a 3d14c60a 3e2a66c2 -> bd6edc25 bd6edc25 3d961112", + "be9b86e2 3f246e82 3f9cb7f4 3f3c521b 3f9cf508 3f65ef0b 3e895d27 -> 3ef8101c 3fa3aa6c 3f45d916", + "3f4f81ef 3f36cd2b 3df5b238 3ef7669c bd886664 3f542cd3 3f05ea9e -> 3ee72152 3e3c550b 3f0055c7", + "3e81e6de 3e4e9c69 3f23e9e0 be5fffce 3f000000 3e800000 3e800000 -> 3e4e9c69 3f183b54 be439553", + "3fb7f38b 3f8d884f 3ec672a8 3f9972d2 3e76c5ee 3f592f2e 3e76c5ee -> 3f979b58 3f469419 3fac64d5", + "3edf064f 3e92da80 3f92be4b bd0e6083 3d931a40 3f6387e6 3f1e1326 -> 3e382606 3f8c650e bd1cf2ea", + "3dd594ad 3deb482a 3e666d12 bb5be896 3f5cbda6 3f6f1f6a 3e2772b6 -> 3dfd0f52 3e7b49bf bb4c79a8", + "bec7a3a3 3f9f5016 3e11358a 3ef2fd1a 3f1c23f7 3ef57b61 3ef57b61 -> 3fa1ff40 3e138912 3ef6e1a5", + "3eda5189 3ea76f01 3ee0bbcb 3f9fe857 3f800000 3f000000 3f000000 -> 3eeed3ee 3ee0bbcb 3f9fe857", + "3fbfb086 3f3297c7 3f6f0c95 3f680854 3e80c568 3f9dfe06 3ebb3830 -> 3ef1f610 3f8a2a4f 3f5e6396", + "3f379fc4 bb4de096 bb4de096 3ec8bdef 3e5cc7b3 3eb48e3c 3eb48e3c -> baf3c426 bb225b8f 3e9e4ecf", + "3e0841d1 3f95499e 3e9072ad 3f95499e 3eee0bc1 3f81af32 3e5ada57 -> 3f957c79 3ea42cb1 3f96e8cd", + "3d073595 3f022272 3f022272 bc060cb0 3e9313a6 3f49fb92 3f4a4b98 -> 3f005de3 3f048937 bc089e33", + "beddbd71 3f25c4ac bd4c28df 3f25c4ac 3f392925 bd0a764a bd0a764a -> 3f145136 bd954731 3f4f7d05", + "3f8af965 3dc00f3e 3f17d027 be06b1a9 3f5bdcb2 3f2f901e 3e25bd9d -> 3e2adb40 3f41d8be bd0f2b43", + "3d886b22 3f4ff1de bd7be9b2 3ec7fec3 3e390ac8 bdf67a02 3dade0fb -> 3f4de693 bd671806 3ebcef7a", + "3fb2113a bdeea51e 3f26e237 3e9d68d6 be7b7fd9 3e472514 3e472514 -> 3e003633 3eb64272 3d3cd222", + "3f707440 3f9c9a54 3f585eb6 3c0a0f7b 3f20cbeb 3f4b72b9 3f20cbeb -> 3f95b81c 3f6e4f97 3c2b495f", + "3eb92217 3f65fb78 3f6e84ad 3f862ce4 be039876 3eb415e8 3e588878 -> 3f5a2818 3f6ca4ce 3f8776c5", + "3e4a4e17 3f560478 3f710e58 3f2eae48 3f734aff 3f734aff 3eeeabc1 -> 3f5d7d00 3f73b71f 3f2d97e1", + "3eb57093 be59ca27 3f307456 3f584a69 3f5979d9 3f8c2560 3f21beee -> be87dec1 3f51fe3b 3f5c0027", + "3f492ece 3eac5c82 3ecd1ee4 bddeecae 3e800000 3f800000 00000000 -> 3e5144df 3f3728d3 bcbef05e", + "3fa9e399 bd0ab564 3f8e54b6 3f802735 3eb16011 3eb16011 3e88f3f9 -> bca454d4 3f942c38 3f803f68", + "3e39cfdc 3f205086 3f205086 3f7f85af 3f2ee929 3ee6ba79 3ee6ba79 -> 3f26ad87 3f1e99be 3f7f837e", + "bd1fa4ee 3f229a70 3f88ea97 3f3374e4 3f400000 3f800000 3f400000 -> 3f20c87e 3f89438e 3f31f706", + "3f81281d 3f46043b 3f1fe776 3f8eea0c 3e0a0d56 3f135e7f 3e0a0d56 -> 3f1b48dd 3f2e93b0 3f99e7d2", + "3f00d5a2 3f10c0e4 3d4b4173 bd70ca1a be36a628 be02ea8b 3f9cddf3 -> 3e89973a 3c959ebe bdd0503b", + "3e854a04 3ecbaeab 3e084daa 3e084daa 3f9a4810 3f6ece64 3f6ece64 -> 3f0b3da0 3e270557 3e270557", + "bdba3073 3ec7f1ab 3f851764 3f0761de 00000000 3f400000 3e800000 -> 3eda1f18 3f8552a3 3f0cdd7a", + "3f6dfe11 3f22d83a bdcd97b6 bdcd97b6 3f0aef3c 3f2713a1 3ef147aa -> 3f2a3e24 be03f89d bdc29a41", + "3e8ab218 3f9e9159 bc7be998 bc7be998 3f017307 3f460564 3f460564 -> 3f9e7958 bc909f13 bc909f13", + "3fae4594 3f03d394 3f45842c be00d6ef 3ebf025a 3f865709 3f0d2478 -> 3eb1d032 3f8e83cb be12d9b3", + "3f9b5755 3e003c30 3e003c30 3f6d5b95 3f145c99 bd9b4a1d bdd5db42 -> 3e18fdd5 bd4bf7ea 3f52022c", + "be851e49 3d0e3e0c 3f2a1c0d 3f8f7320 3f800000 00000000 3f400000 -> 3cd28507 3f4070d8 3f917549", + "3fa22a31 bcf3e217 bd902650 bd902650 3f69a24e bd86c0b7 3f69a24e -> bd796fb2 3cfa07ff be136e91", + "3f845c95 3eb74ab2 3f00389c 3f2c20e2 3f896a73 3f5811da 3dc799e2 -> 3f485b73 3f5b2271 3ecc9bea", + "bcad47f4 3f453627 3f453627 3e738944 3f800000 3f400000 3f800000 -> 3f43f7d0 3f4496fb 3e6e6283", + "3fa7cf6c 3e8b70c3 3f662af5 3ea45162 3f7989ba 3f7989ba 3f43085c -> 3f1c829c 3f83298a 3f0a911c", + "3f5b6ee8 3f99a29b be1b962a 3f99a29b 3f800000 3e800000 3e800000 -> 3f83a965 bdb1cf77 3fa49f36", + "3f15f887 3f8bbd6f 3d0e7ab4 3d0e7ab4 00000000 00000000 00000000 -> 3f929e16 3c6c0bdd 3c6c0bdd", + "be84945d bde50a1a 3e5b78f1 be0b5dd6 3ef5ca8d bd2780cc 3ef5ca8d -> bde76791 3e8c79d2 be0cce40", + "3ea3d3b8 3eed22fe 3eae9603 3f74b859 3f400000 00000000 00000000 -> 3f0989ac 3e6d721f 3f711c5f", + "3f975037 3f7d4fa0 3cbde706 3cbde706 3f1e671c 3f48a114 3ea18d3b -> 3f7e10e9 3d1ea412 3c562890", + "3fb0319f 3f27db70 be11ce4f 3f609b8c 3db87f15 3f9300ac 3db87f15 -> 3e88c672 becb0d0e 3f3d2e5f", + "be54d56b 3f4455bb 3f4455bb 3f8538c9 3ef854db b83396dd 3ef854db -> 3f44b4d4 3f50bcb0 3f853076", + "3f28ffd5 3f67ecbf 3f3adcf1 3e1776b5 3f9c902f 3ec0eaa0 3f9c902f -> 3f7ee94d 3f2f9dbf 3e940a04", + "3fab7df9 3f8a3143 3f8a3143 3f5942dc 3f85e965 3f4bb8f5 3f288a93 -> 3f768d04 3f821d2f 3f69b32d", + "3da37a95 bdb2822f 3f7bdab5 3f0f4ac0 3f458431 be16a67b be16a67b -> bdba3f49 3f7b6d10 3f03a5e6", + "3f67c464 bdda5420 bdda5420 be1d257c 3ec29f40 be05765d 3e8072a1 -> bdaaf00f 3c76dbcd bdac8500", + "3f6bac99 bd8138a2 bd8138a2 3f3a4545 3f78bb93 3ed10e06 3f78bb93 -> bdf16db0 bd56cfee 3f76d1ad", + "be41d754 3f11e524 3f3360cc bdcc719d be021e88 3f92b807 3f92b807 -> 3f2c08e0 3f20a1a8 bd9a6c78", + "3f75b753 3f8c84a9 39d81bf7 bccaab80 3ec79b91 3ece7f9a 3f5f7a5e -> 3f8f2a3c 39affff7 bd2de2ef", + "3f56255c be4cfff6 3f82322b be4cfff6 3ef2b8e3 bbcbddfb 3d6f409f -> be441b09 3f840e47 bd563248", + "3f9856fe 3f5cd39d 3f45d3e1 3f5cd39d 3edc55df 3edc55df 3df0f36a -> 3f56fea2 3f3c2ead 3f3cd0a8", + "3fa9f417 3f310b4b 3f310b4b 3eb4d015 be58352f be58352f 3f5d643a -> 3ddf84e8 3ddf84e8 3f31fd22", + "beb3f1b5 3f292c80 3f0c70b2 3f0c70b2 3f2f630d 3f7fbecd 3eeee558 -> 3f1de071 3ec7d076 3f0f275d", + "3cee0646 3ed8d269 3ed8d269 3dc34abf 3f227df9 3f3d9f94 bdd25f02 -> 3eda8502 3edbdadb 3dbc73af", + "3f83b584 3f6ce483 bd97c65a 3f6ce483 3ea4a240 3f942913 3f2d3cfe -> 3f65e028 be329251 3f73d760", + "3f0deae9 3f8fd3ba 3f8fd3ba 3e5a6855 3ed93901 3e3d828f 3f2cf05b -> 3f9127f5 3f955a7c 3e827542", + "bed642ef 3ef21b0b 3f4f5cce 3f260fd1 3f943d6d 3f99c8f0 3f943d6d -> 3e597f1a 3f32cef4 3ee90b20", + "3f187d66 3d3d0c02 3f88f048 3f88f048 3f3137e3 3f3137e3 bdbc73cd -> 3d6858c9 3f86e42a 3f8f3e2d", + "3efedeed be5ebe2d bd68caa3 3f172007 3f6b91c8 3f72ba1a 3edaa43b -> be9df669 bda85427 3f0f81af", + "3fa4f6b5 3e2e0fa9 3e063633 3f716402 3f000000 3e800000 3f000000 -> 3e2e0fa9 3d3ee88d 3f716402", + "bda8f2a9 3e492675 bdaa7f5b 3e83d3f2 3f6a9267 3f28fac7 3f6a9267 -> 3e3b559e bda5fe99 3e758c02", + "bd0f6387 3f29c749 3f740535 3f0d7527 bdf69c4e bbab822f 3f10dd68 -> 3f2d8614 3f7471b1 3f0cede7", + "3d23ff2b 3f8fae4c 3f7e8292 3f7e8292 3e0f4fb3 3edf3345 be771cf5 -> 3f902209 3f7e809d 3f7e6bee", + "3ee34cfc bd9f1d23 3f18095d 3f142ab6 3f05f473 3e223ab1 3f5dec96 -> bda2666b 3ef10356 3f374b6c", + "3d1436ba 3f18b0e5 3f3e3b7f 3f3e3b7f 3eca3bb3 3db4fc45 3db4fc45 -> 3f17e7e6 3f3c45f2 3f3c45f2", + "3f1820fe 3f3cca88 3f8e58d3 3f8e58d3 3f74d5f8 bd989991 3f9fa3d7 -> 3f613f2a 3f9824ab 3f819b38", + "3ebb0f59 bddddbb3 3f5247a7 3f5247a7 3f800000 3f400000 3f000000 -> be17750b 3f5aa1c1 3f5247a7", + "3de3810c 3f639517 3e045ec2 3c6db360 3f000000 3f800000 3f800000 -> 3f639517 3e131319 3c840d8d", + "3f1ee2e0 3d7d9f96 3f883446 3c59c326 3f0aca9c 3f26dcdd 3f0aca9c -> 3d85727c 3f86a880 3c652829", + "3f9280d9 3f98ef17 3f548bc9 3dae9913 3f2f6996 3f6d4bd4 3f04acc7 -> 3f8e5cf2 3f7f0399 3db5e585", + "3f159d83 3e36514a 3edb108f 3eb4ca09 bd994134 3f114a1b 3f379a8f -> 3d6f4580 3eec5bab 3ee2b02a", + "bef96366 3f3d9b70 3e0f1134 3f3d9b70 3f183a60 3f183a60 3f642f36 -> 3f377c6a 3e01e07e 3f244bb4", + "3ed5e415 3eae861e 3f4c1131 3f4c1131 3f294868 3e98920f 3f294868 -> 3ec609d9 3f434d44 3f531079", + "be408eae 3f84b94c 3f86d2f0 3f86d2f0 3e2d7582 3f2fba65 3f2cf659 -> 3f8422f0 3f874d6e 3f874654", + "3f7ae46a be64dc6d be5634e4 3e969290 3f84188a bcdc2f75 bcdc2f75 -> bee9c14b 3be05c8a bc1db5f0", + "3fadedf7 3f8eeab5 be419f63 3f7611cb 3eab92b2 3f301419 3ef6a716 -> 3f9599fc be92391c 3f7593aa", + "3fadd834 3f618c9f 3f618c9f 3ed3ea3a 3fa00000 3fa00000 3fa00000 -> 3f8fcad8 3f8fcad8 3fa0e8c0", + "be9d9fa6 3dcf2265 3dcf2265 3caf6a4a 3f98bbd1 3f98bbd1 3f866319 -> 3d6d71c7 3d6d71c7 3c680b9f", + "bece14ca 3f10519d 3ede32e9 3ede32e9 3eb17f2a 3f8eaa8c 3ed21046 -> 3f1e1a7e 3e60895d 3eee3f42", + "3eab9da9 3e9ba51a 3ea10cef 3e025216 3dd6c483 3dd6c483 3f60dae0 -> 3e64d54d 3e6cc7d9 3e235fb0", + "bdd4f59a 3f806872 3f806872 bc34f4fa 3e800000 3f000000 3f000000 -> 3f806304 3f806872 bc34f4fa", + "bd868b22 3f102c5d be53523b 3d6c9cec bdc6e162 be75c55d 3edafa9e -> 3f18f253 be67de35 3d6edc63", + "3f997550 3ddf87fb 3f1f2d2a 3f6d18fb 3f245c5f 3edb45f5 3f245c5f -> 3e15d453 3f0e85e2 3f7388ff", + "3efd7a05 3f62e03a 3f62e03a bdb6e84d 3e354a93 3eff85ef 3e354a93 -> 3f599010 3f62d95a bd78d62f", + "3d364503 3f87a95d 3f8aa94a 3ed6c2b2 3d5197ec be53d70a be7b8a25 -> 3f87f7b6 3f8b54fe 3ec8823b", + "bd9bd34f 3f9e2594 3ec9888c 3f9e2594 3f9e85a6 3e10ad9e 3f9e85a6 -> 3fa188d3 3ed488ce 3fa188d3", + "be79638b 3efb318e 3f849bf2 3efb318e 3ef517f1 3f82aba9 3ef517f1 -> 3efdccc6 3f85c74e 3efdccc6", + "3f5f5d31 3f088aed 3f2196f3 3de54c07 3dee6186 3dee6186 3f3c2d44 -> 3e624fe8 3ec4c868 3e21ad4d", + "3f98f69d 3ee4eb6c bdc197ab 3ee4eb6c 3f405450 3f405450 3f883ed6 -> 3f3733f6 be1aee4d 3f866ead", + "3e9bccad 3e44a0a2 bd99d3d4 3e44a0a2 3d05ff18 3f8c0316 3e78b969 -> 3e0cb594 bdd16c0b 3e25dc5b", + "3dd78bc0 3e2f3c31 3e5918cf 3e5918cf bd443b99 bd443b99 bdce0bb5 -> 3e1b0666 3e400f0e 3e3da68b", + "3f10a317 3d87117e 3e7dfb4e 3d6c46a2 be7a9f3d be7a9f3d 3ef3b896 -> 3c2b36e9 3d20f9b0 3d65df7a", + "3fa3fcb5 3e4a7f55 3f9a619f 3e98f9cd 3ea9f3c5 be2ea7d7 be2ea7d7 -> 3de69803 3fc7b590 be5bba7f", + "3f154e19 3f696810 be742958 be742958 3f8aa59e 3dd6c1d6 be0c5ebe -> 3f78c692 be03a02e bd7ae19d", + "3f675dbb 3ed652d9 3ed652d9 3e4ccdd9 3f2433db 3d084735 3f77e833 -> 3f068ddd 3d860d06 3ebd194e", + "3d07ba51 3f234fa7 3f234fa7 3dd84de3 3f38d944 3f1d206c 3f38d944 -> 3f24acdc 3f240292 3ddb7cd3", + "3f5e730e 3f8c74a7 3c55e752 3ed5bc8e 3ebc8f6a 3df94a33 3f0ed87d -> 3f8f4e92 3b9290ee 3eeb46f8", + "3ecaede7 be5b0f5b 3e2aa412 3ebc1bd3 3e7f4483 3e7f4483 3f98ed26 -> be2f8623 3e08ba4b 3f11d9ef", + "3e542e3f 3f7bad86 be4b98e6 3f6044c2 00000000 3f400000 3f400000 -> 3f7ac841 be60b0d3 3f638e5b", + "3fb674e0 3eea5cd0 3e8e54de 3dca121a 3ec7f467 3f83d3a4 3e23ff39 -> 3ea139c0 3f32ac85 3b495663", + "3fa90753 3dd9a361 3dd9a361 3eb85edc 3f52ec6a 3de3093b 3f52ec6a -> 3e49e9d3 bb414980 3f2b0ca5", + "3f873baf 3f5e04ba be77290d 3f007a0e 3e0e8b4a 3e0e8b4a 3f8098f0 -> 3f441ca9 bd6aee4c 3f843b5f", + "3fa88aad 3da49e07 3da49e07 3e6abbfe 3bc40224 3f5cec51 3f5cec51 -> bcc62f8a 3e20fcbd 3ee58ee1", + "3e986e56 3f08a1b4 3e76a17e 3f08a1b4 3e1ca808 3f2ceea8 3f2ceea8 -> 3edfef38 3e8833f3 3f151b4e", + "3c94b9cd 3f02a0eb 3f2333dc 3e1693a3 3f6bc707 3f8b509a 3f6bc707 -> 3f048b8c 3f252f67 3e18e0e7", + "3f599e1b 3e628348 be58acde bc0baed4 be63f704 be63f704 3f54c1d6 -> bd4f1588 3d461721 bc5a4ef9", + "3f63ace8 be12f18c 3f1e38e5 3f7ddce1 3d80cac8 3e7e5b57 3e7e5b57 -> bd02c7b1 3ee4ed50 3f7ce806", + "bdad2036 bda613b0 bda613b0 bdc5d6b4 bdbae0d6 3f90dea4 be1c5d68 -> bdb6ad9d bd945650 bddbab9b", + "be9cb6a4 3f1ee4b4 3f43b4b8 3dabb115 3e88302b 3e43501d 3f2e43ae -> 3f2ccdcf 3f4f1eee 3d98b28d", + "3fb86781 3eb0c72a 3ead2d19 3f07ce09 bd80d543 3dc476bc bd80d543 -> be5be18e bd638f7e be6c90b0", + "3ee1efea 3ea71365 3f820c1b 3f820c1b 3e3cb1e2 be144710 3f978f30 -> 3e710a37 3f83365d 3f80cfb0", + "3cb5eb35 be705dca 3f9813f6 be39ad76 bc0e4c43 3e798f0a be7fafb2 -> be6aef94 3f985a20 be337ec0", + "3e6d63ee 3f37d483 3f56252b 3d48f7a7 3f7dc59b 3f7dc59b 3f3a8a12 -> 3f484510 3f5fadea 3d5e464c", + "3ef1b618 3f5b8c1b 3eb861fc 3eb861fc 3f94b591 3f9c1688 3f9c1688 -> 3f72532b 3f1ad0b9 3f1ad0b9", + "3f2795f9 3f5560b1 3f8ed3ca 3a7a4a3f be0d8584 3e9b2105 3f9728b0 -> 3f31c370 3f92a6e3 3aecb6bd", + "3f87012d 3e3edf99 bdc4c0ac 3f68ed78 3f33a66f bd910470 3f9c37da -> 3e880df0 3ca09f50 3f85fefe", + "3fa46be9 3d6ebe04 3ebcfa9c 3ebcfa9c be678fcb 3d9e206c 3f25b92b -> bd4ea1c6 bd024b6c 3f0242b3", + "3f9b082e be64da0a be64da0a 3f586357 3f9e6a2a 3f9e6a2a 3e7b1ea6 -> bf1f7097 bf1f7097 3f3ff126", + "bedf731d 3f373349 be18e2bf be18e2bf 3f5d1c11 3f87d672 be0d02ea -> 3f2016cd bd9bfb97 be6dfc3d", + "3f4b9f4a 3ecadd33 3f6ff1e7 3f95cc20 3f9be5f0 3f1fc9a7 3eadd8b2 -> 3f59479b 3f731dc6 3f9b5c79", + "bede8463 3eefc635 3f07792a 3f6723bd 3e16375a 3e16375a 3f1b4233 -> 3f1cb430 3f2c7c87 3f64d6b6", + "3f91c8ec 3e23245f 3e23245f be0256df 3f2cbd17 3d960ebe 3f2cbd17 -> 3e64161e 3b91f3fa be3639b4", + "3fb227d4 3f8ac348 3d5a5b6f 3f8ac348 3f800000 3e800000 3f000000 -> 3f7790bd 3c84cbc6 3f8ac348", + "3f9cfba0 3ec10da2 3ec10da2 3ed4e8fb 3f9d9d99 3eb54228 3f9d9d99 -> 3f86d86a 3e77dab9 3f94b712", + "3f406c73 3f918309 3f88b541 3a0cc219 3f58669d 3f58669d 3f453672 -> 3f886bd1 3f843003 3a45f7b8", + "3f7dbcb8 3f602481 be5696ff be3d8b51 3c843ae5 3e56d2f4 3f70d7e0 -> 3f41960d bdb646bb beb19563", + "3f925326 be2bda57 3f237a91 3f345b49 3e800000 3f800000 3f800000 -> bd934000 3f869f6f 3f856a26", + "3fb08966 3e8f427e 3f702215 3f82c2ef 3ebdf6c2 3d32c60b 3f4d0593 -> 3e3895c8 3f5c28f0 3f80783f", + "3eec5f8d 3ec05a3f 3ef6bbeb 3f89ecc1 3f00ebac 3f5c39d3 3f5c39d3 -> 3ec0fdc1 3f24674e 3f869f9b", + "be85d2ac 3f2c1e41 3f8b9529 3ea1aa95 3f9d5371 3f0eb294 3f0eb294 -> 3f0c25c8 3f8bee27 3e9cd07c", + "be11164e be77b84c be77b84c bde780c8 3ed9bdc4 bd0c0b4d 3f29e31c -> be7cf720 be8e9bfb bddcc4e9", + "3fb5bad5 3e9d6ee6 3ee0161d 3eb9b796 3eb2c029 3eb2c029 3f27a55a -> 3e33f88c 3e80153e 3f05b169", + "bd7e3d38 3f8d0dd9 3e8bfcfe 3f8f03cd 3c6cef8b 3f6dac3c 3c6cef8b -> 3f8c446b 3e848b15 3f8e1c1e", + "bda8a0ab 3f7028b5 3f3d475e 3d9a10ac 3e896510 be5c1f8a 3f3ff429 -> 3f70c368 3f452264 3d93ba1f", + "3f1c184d 3ce8ac5a 3f548107 3f548107 3e5a1c29 3f6761ce 3f6761ce -> 3c973d0a 3f69ecb8 3f69ecb8", + "3f0f8d00 3f5a058b 3f71ce9b 3f918ad5 3f1b167b 3e633838 3ee3239a -> 3f5e8747 3f6d6160 3f92a6bb", + "3fbd577a 3dcafdc0 3d4db7ea 3dcafdc0 3e4374b0 3f296cb1 3f77f961 -> 3c0ac9b5 3d9819ad 3e7237a5", + "3f197981 3f11970a be3c8f7d be3c8f7d 3e1bad67 be5a5f31 be5a5f31 -> 3ec70c66 bcda6b6d bcda6b6d", + "3e1c24a1 3e27525a 3e68fc6e 3d5db768 3edf411c 3ed26b70 3edf411c -> 3e240ee3 3e62a91f 3d596457", + "beae24d7 3eb54fa8 be663d5a 3e0aad55 3e9a3244 3f1b770f 3f8a9841 -> 3ecdd5ba be556fc3 3da76714", + "3c970ec3 be437bd8 be2a9197 3f208660 00000000 00000000 3f000000 -> be3fe10e be276c69 3f208660", + "3f35802d 3f90f010 3f90f010 3f8f3973 be482a0a 3f87d61f 3f87d61f -> 3fa1a420 3f83756f 3f831bde", + "3dc5a930 3f6c8840 3f882225 3f882225 3f62cb29 bccac4c0 3ed41dba -> 3f6dfb80 3f88f50c 3f884498", + "3f6c4414 3f38f027 3f38f027 3e974eaa 3f64927a 3d204d9a be624ed0 -> 3f6c7802 3ef8f9a0 bdc83d3e", + "be37758c 3e34e90c be3e871f 3e34e90c 3f93faa7 3f1e92cc 3f47bcf2 -> 3e0a6166 be365fe3 3e22bebc", + "3d6e2cb5 be00e218 3f316cb5 3f316cb5 bc89544d bd4bcc13 3f5b7314 -> bdf24674 3f2c66a6 3f34b060", + "3efaa881 3f500996 3f064646 3f064646 3f2e9dea be498596 3f68bed9 -> 3f5896cc 3e4ce79c 3f370a6c", + "3ecd1976 be1bdb10 bdd43962 bd08d0de 3f1bebeb 3e2888a9 bda316ae -> be29798a bd9b31b4 bc928fb9", + "be4f4f9c 3ec7f83e 3e01978e 3f4e721e 3f7204b2 3f0f7e53 3f65b32f -> 3ea3e857 3dfcd529 3f467989", + "be2ea0d4 3e7f8b9a 3f14be26 3e3f6a4f 3e800000 3f800000 3f000000 -> 3e8aaae4 3f02739e 3e3f6a4e", + "3e7d8dc1 3f56d53d 3f2568bc 3f845020 3f721803 3c5b65e8 bd09efba -> 3f5feb40 3f0f941d 3f8573ef", + "be893348 3f979df1 3f4965cf 3f227011 3f88cd7d 3f9bdf27 3f778db3 -> 3f9ed0e7 3f3464d6 3f0b0538", + "3f57c60e 3f504af3 3ace2f15 bdfe59a4 3f000000 3f800000 3f000000 -> 3f504af3 3b3dfc12 bdfe59a4", + "3d8e217f 3ea6ebda 3cf9d0a3 be34347d 3f800000 3f800000 3e800000 -> 3eb2816f 3d059378 be2df3b2", + "3c996af5 3f5dad21 3f5dad21 3ec7ce1d 3f74bf16 bd640d47 bd640d47 -> 3f5e4338 3f5cf63f 3ec3a584", + "beefeaf2 3f8c088a 3f8c088a 3f88a251 3ef0af58 3f8841a5 3f8c2841 -> 3f8bb22f 3f926645 3f8d72cb", + "3f4667a8 3f96b8cf 3f2013c5 3ea8dcf1 3f15eb83 3dc828bc 3dc828bc -> 3f93b4ca 3ec8888e 3dfe49f9", + "3f892a0d 3dfc19c5 3dfc19c5 3f751829 3f532bcf 3f9bca69 3f6144b3 -> 3e55d190 3e9fe3b1 3f7df999", + "bea79a3e 3f8e11ee 3f8e11ee 3f6a23a0 3f960bb9 3f960bb9 3f5be550 -> 3f94432c 3f94432c 3f650064", + "be55821b 3f08be66 3f4708ae bddcfc29 3f0c5d0d bdf7c0b7 bd307fd4 -> 3f06578e 3f55c90b be07841f", + "3f7b28ad 3c8ffeb6 3f66b780 3e0381dc bd8d5e0e 3f85c0f0 3f9cce6e -> bb063dbb 3f80e03e 3e9f4cc2", + "bed7f52c 3f3f6c6f 3eb05407 3f76f55b 3f800000 00000000 00000000 -> 3f242f8c 3efab3bf 3f7ac5a8", + "be6f5d65 3ef2cbeb 3ef2cbeb 3f229660 3f400000 3f000000 3e800000 -> 3ed66b4d 3ef2cbeb 3f2d8156", + "3f892c58 3eb4bf4d 3e9256cf 3f8301f5 3ee91103 3f753955 3f753955 -> 3ea3650e 3f10fb3d 3f800e49", + "3f7edef0 bc9af587 bc9af587 3f106084 3eb1ded4 3f937584 3f916eac -> bc57c014 bd321227 3f8ee382", + "3f733ebe bd8df2e8 3f7e2261 3f2c602c 3e248434 3e248434 3dac111a -> bcc9a4f2 3f7cee61 3ed489f6", + "3f8cf159 3f7dd759 3f827486 3f7dd759 3f9a9bbb 3e644556 3e644556 -> 3f809a71 3f83f40b 3f7c8620", + "3f46fcbb 3f0e92fd 3f0c7eee 3f419b11 3e032c76 3f8869a5 3f8869a5 -> 3e99fe5a 3f7213f8 3f787abe", + "3e5c3361 3e6a799e 3ebf8e0e 3f158921 3f8cc68a 3f885268 3f885268 -> 3e937b14 3eee1a5e 3f2f6819", + "3fbf0cad 3f895dc9 3e24a916 3df3c203 3dcd82ed 3dcd82ed bd443a4a -> 3f948a65 bcfe43f3 bd9aedbd", + "3f693afc 3f4816ae bdb6d164 3f8a4aea 00000000 00000000 3f400000 -> 3f152670 bc021585 3f859aa3", + "3f463e22 3e2dc82b 3f8b3a6b 3f447fe7 3f000000 3f800000 3e800000 -> 3e2dc82b 3f828883 3f2d7624", + "3f34e11c 3f8d78cc 3ed20efa 3d72efd7 3f50a1c4 3f50a1c4 3f8ec2cb -> 3f8779c7 3f17c6ca 3de31674", + "3eb4cf90 3da1c9e9 be6263d8 3f9e0698 bcf739a6 bd4d687d 3f921117 -> 3d4a6906 be0a6c33 3f906dd2", + "beb00c23 bde01e3e be2f9e01 bde01e3e 3f148264 3f97cc20 3f6c6071 -> bdd3c54a bdb98f16 bd9edeed", + "be996a5a 3f4b110b 3f4b110b 3e5ce7e6 be531092 be531092 3f1c6e38 -> 3f61774a 3f61774a 3e4e3424", + "3e608cca 3f442d04 3f197e84 3f197e84 00000000 00000000 00000000 -> 3f370ea3 3f030418 3f030418", + "3dd1c879 bd6f176f bd9ad20a bd6f176f 3f6264ad be430caa be430caa -> bd80f575 bd84eb95 bd4d454c", + "be6ccf5d be4a2de6 3e4b4f3d 3e4b4f3d 3e784041 3f555db9 3f555db9 -> be6243d1 3e2bf3de 3e2bf3de", + "bee184ab 3f95426a 3ea29cdc 3f7b5cd7 bdb28ac0 3f829fa8 3e5c4e2d -> 3f8a4340 3e301a3a 3f7c86bf", + "3fb501dc 3e5f37d3 3e64c4ee 3e64c4ee 3f79a534 3ef3f750 3f79a534 -> 3f02cd0e 3e558fde 3f060dca", + "3f5e4b66 3f60d086 3f10182c 3f60d086 bc278a4c 3efa95a0 3c925d59 -> 3f452e64 3f0e09ef 3f46b3e3", + "3f5370eb 3f0be253 3ee18d7f 3ee18d7f bb842e3f 3f6c3eb0 be618788 -> 3e2cd24c 3f3f8c0e bdab33bf", + "3f440367 3f4e4b8e 3f4e4b8e 3f34b3c6 3ebfb1d0 3f8c7feb 3ebfb1d0 -> 3f44bc3a 3f7bc937 3f263853", + "bedadd9c 3f383f2e 3d81c6ff 3d81c6ff 3f6d7e21 3f683236 3f683236 -> 3f1e025b 3d293c61 3d293c61", + "3d7383b9 3ef18fec bbe49c26 3f813926 3f690b85 3ecbc2b6 3f927907 -> 3efd5917 bbe1d626 3f812128", + "3f9268af 3f3b8645 3f34bdde bc7a5c79 3f9aa01d 3f9aa01d 3f87efd0 -> 3f95375d 3f97515e bd0f0f83", + "3bd34350 3f961c91 3f961c91 3f2f2497 3f56e9c7 bce2070e 3f56e9c7 -> 3f9603c9 3f964313 3f2f7f35", + "3f82c9b3 be5f1779 3f2a5e81 3f2a5e81 3ec33a88 3dfa3f60 3ec33a88 -> be28fa99 3ed082ea 3f159942", + "3fa23d13 3ea9cdbc 3e107bac 3e107bac 3f35e8de 3f96ac0f bd8c092d -> 3f023987 3ec43e7c bd7ec405", + "3fb79272 3f79ca4d 3db9b8af 3f79ca4d bdd79c7b 3f0e3661 be136273 -> 3f6f0260 3dd74bbd 3f6e5223", + "be9b59b6 3eb2f4b6 3f3fa464 3f1853ed bc5e61a7 3f4043e8 bd97cc31 -> 3eeaba7f 3f35d686 3f3c726c", + "3d171311 3f9c5dad 3eed6654 3eed6654 3f800000 3f400000 3f400000 -> 3f9b51d7 3ef1c71c 3ef1c71c", + "bd822215 bddf7c35 be1ed205 3ee3fa63 3f0ea923 3e9c8362 be24fa2e -> bddddbd3 be22be02 3ef721c2", + "3efca52d 3ec52297 bc3a3e70 3ec52297 bbad033b 3f603484 3ec341a6 -> 3e45aa00 bc7f5140 3eae0db6", + "3f182417 3f278f40 3f278f40 3e19d91c 3f6fb924 3f41134d 3f397454 -> 3f556fa4 3f424800 3e42e375", + "3f87e6c6 3e13d208 3f78cc9c 3e527685 3f508579 3f63d198 3e7535de -> 3e768cf4 3f7ec2e3 3dbc0d9b", + "3f477e4d 3f51a2d1 3f034afc be4e5b56 3f0fa604 3f81730c 3f7b2b7a -> 3f560d94 3f66aca3 beb48c58", + "3f3c6dc4 bdc482ca 3f78f9d3 3f78f9d3 3d776d7c 3d8dea2d 3d776d7c -> bd0ab010 3f7485b5 3f746e2e", + "3df28e28 bd402db4 3f376326 3e57709b 3f800000 00000000 3e800000 -> bd56f071 3f2ec993 3e4aae9a", + "3f4c5342 3f5a1808 3f560a38 3f5a1808 3d25fb85 3ec30046 3f0aec77 -> 3f3e4a92 3f4e0f59 3f5cad04", + "3fbb2e6d 3f069479 3e7b7736 3e945049 3da13dc4 3f5987d5 3f62cf0d -> bd705340 3efe56de 3f1dde7e", + "3fb7f9bb be7344b6 3f60d12d be7344b6 3e94a8d7 3e94a8d7 3f3ea508 -> bdc151d9 3f4e063c becf322b", + "3f6cdd1e 3f91fd67 bde1ab97 3f91fd67 be535abb 3eb214fe be535abb -> 3fa9818e bda21e38 3fa9818e", + "3d3cdaa0 3f7b6d13 3de0160d 3f7b6d13 3f41e5e1 3f41e5e1 3efbc489 -> 3f7b88de 3de567c2 3f7b6c2f", + "bea27c67 3f8db074 3e62add1 3e62add1 3f905e9f 3f905e9f 3e276fe8 -> 3f932512 3e08575f 3e898bae", + "3f228f53 3f9d8cb7 3f2f73ee 3f9d8cb7 3ea70701 3ea70701 3e466599 -> 3fa41233 3f1dad36 3fa90af2", + "bed1e22d 3e00b6fe 3f60ab49 3f6b649c 3d5089ba 3f8ff3ae 3f8ff3ae -> 3e301b24 3f509fdb 3f60d711", + "3f945a29 3ef13c8c 3d7c6f5d bd0a57bb 3c7ad652 3ede7017 3f3da7b3 -> bd6e5df1 3d5613ff bd579335", + "3f9cab40 3d64f37f 3e2c5def 3d64f37f 3f8c2e7a 3f0cc0c7 3f179665 -> 3e0ca14a 3e416306 3d8c4bb0", + "3ee4cbc0 bdd7d690 bdd7d690 3eb904ee 3f015568 3f3c6de6 3f3c6de6 -> bdd8d7d2 be02afbe 3ee00d64", + "3ed2add2 3eeb8fa7 3f6181a0 3eeb8fa7 be41384e 3f24f6c9 3f24f6c9 -> 3e4c1adb 3f65213e 3f03c6b8", + "3f6125b4 3f895b54 3f895b54 bd3858c7 00000000 3f800000 3f400000 -> 3f9195fa 3f8120ae bd84b4af", + "3fab85da 3e5aafda 3e5aafda 3f7a4a74 3f1a75ca 3ea78aa4 3e61d5f4 -> 3e8ba1f0 3deadb08 3f7603d1", + "3ece9266 3e099450 3e525f50 bdbe306a 3edce79a 3df6c03c 3f70da6c -> 3e01f83f 3e11f2ad be00ebde", + "3c53da02 3e26be12 3f9ebc4e 3f8cbd27 00000000 3e800000 3f400000 -> 3e24961f 3f9eef2d 3f8ca812", + "3faa6570 3e9e0b9b 3f4626ae 3f9a38c0 3f7caa01 3f62a069 3f6e8e3a -> 3f357a47 3f80be8a 3f7824eb", + "bebe0235 3eacefa8 3f37af24 3d078470 3e0cd2e4 3f88b7ba 3f88b7ba -> 3edb766a 3f1930fe 3c9cbffa", + "3f49969f 3f60979e be337ba4 be337ba4 bc3b7f9a bc3b7f9a 3cbf6718 -> 3f474b44 bd0ba758 bd3302cf", + "3e628311 3de2d2e5 3f3f1bfb 3f42c41f 3eea433c 3e9da6a6 3e9da6a6 -> 3dde903e 3f399846 3f3d8ff8", + "3ec4cf42 3e9ec602 3ea264d8 3e9ec602 3f34ae86 3f4f231e 3f34ae86 -> 3eb7e47f 3ec8fcd6 3eb7e47f", + "3fa1fa85 3e854886 bd8eeabf be69eba3 3f400000 3e800000 3f400000 -> 3ed99d91 bcd1f506 bebef6e0", + "3ef5171c be5ee05a 3e3502f9 be5ee05a be800000 be800000 be800000 -> bd7b5eea 3d4c2756 bd7b5eea", + "be979097 3f437de7 3e48d968 3edb4120 3f879ca4 bd19a1fc 3ea0861e -> 3f2f7312 3e846207 3ef375fb", + "3fbc2087 3eb71a89 3f41fd97 3f80b081 3f585458 3f3a2bfa 3f8774aa -> 3f386813 3f6b68e5 3f7f1dbc", + "3f6a2ef8 3e6b0f8b 3e57ee5f 3f30e408 3ee61dcd 3dbaff88 3f87b9fb -> 3e5551d5 3d59e516 3f80ff59", + "3d42d431 3e177d3b 3f9ddfd2 3f3f45c3 be0125d5 3ed00e2a 3e7cba74 -> 3e0e7747 3f9e23f3 3f3db6a4", + "3f3c2c25 3f745db5 3eb6ff33 bc6f368a 3e800000 3f400000 3e800000 -> 3f70171d 3efa40b0 bc174be4", + "3f505467 3e3a4ed7 3e146ebb be51bccc be310130 3f80e886 be310130 -> bc8dc77f 3e87783f 3c9f9be8", + "3b276050 3eb2ea4a 3f377564 3e9d1180 3f000000 00000000 00000000 -> 3eb2ea4a 3f3745f6 3e9caacf", + "3f4363c8 3f575f62 3f03a483 3f13eccd bdf5dd6b bd8dff62 bdf5dd6b -> 3f30eb3a 3dbc8780 3e368778", + "3f29fa5d 3f4f203a 3d739689 3f943ccd bdf1d616 3f31fd31 3f31fd31 -> 3f2702bc 3d996055 3f8efd5f", + "be1d1529 be4afccc bda5ecf7 be4afccc be45b894 3e14fb9d be45b894 -> be76269e bdb7f8ef be76269e", + "3ed8cdfa be777afe be777afe 3e11fc5d 3f26cfad 3f0347de 3f06036a -> be8ba0b5 be7a2a9a 3e14e3d1", + "be2f65ee 3f92c560 3f6ae296 3e8a52e0 be2677eb 3f94e1e9 3f475a52 -> 3f8e82a8 3f66169b 3e7a3b7a", + "be7930ee bde15e46 3dbb04b1 3f2d0045 3ee98f68 3f400327 3f9946b6 -> bde62cf4 3da44229 3f10d384", + "3d1b482c 3cf1a6b3 3cf1a6b3 3f5610ad 3f86fba3 3f95cd0e 3f86fba3 -> 3cfbcfd7 3cfdeed7 3f57d410", + "3ec17b01 bd7ef96c 3ed7d341 be0f9bdb 3f114745 3ddd0966 3ddd0966 -> bd85fd88 3e97df21 bdca1be2", + "3f8381e9 3dec0293 3f840d11 3e2ff6f6 3f0f5f40 be74cc21 3f5dd4da -> 3e0490aa 3f8a33fb 3e9a3ef0", + "3f2a1f51 3d9b5c5d 3d9b5c5d 3dd8bc84 3f2071f3 3f898561 3f2071f3 -> 3db587dd 3e08fb51 3dfd3eaa", + "3f68f2fc 3e0eafa6 3e0eafa6 3f9007c8 be6c90aa 3d7bb72a 3e36337d -> bd3c924b 3ce6729a 3f996d2b", + "3f238245 3edbe055 3e3ab399 3edbe055 bcb7c9f3 3eaea248 3ba77e3c -> 3e1246e2 3e14cce5 3e21c049", + "3f194433 3ea51cc6 3f547efc 3f519130 bdf1159c 3f79f3f4 3f77b760 -> 3dabf29e 3f6d4fae 3f6b913a", + "3f9af48b 3f8a7a19 3f7822e5 3f7822e5 3f6d16b5 3db329ce 3edaed68 -> 3f7f55cb 3f704840 3f76c1fa", + "3ee9f632 3e4d0d89 3e4d0d89 3f34d104 3f626d9d 3f24587e 3f233243 -> 3e8a8d83 3e67a8bc 3f3e4366", + "3f295957 3dfd1dc9 3dfd1dc9 3f0249dc 3f961630 3f2e043a 3f961630 -> 3e6f2bd7 3e1ca7f7 3f7225ef", + "3e7a14c3 3f478cee 3db1be44 3e612ba9 3f634eb3 3f04dccf 3f31daf6 -> 3f523f0d 3db3646b 3e7696dc", + "bec493ea 3e66e9ea bd962f72 3f41a056 3ec1f42b 3ec1f42b 3eb5b403 -> 3e7c66c3 bda4292c 3f489395", + "3fbe1b48 3d9436c6 3e92b272 3d9436c6 3f000000 00000000 3f000000 -> 3d9436c6 be0e5b67 3d9436c6", + "3f83fd87 3f35cb61 bcda5eff bd8031ae 3f8f2a70 3bb62b23 3f82c526 -> 3f8a390a 3a09b9c6 be050d94", + "3f098eb0 3f1a6157 3d979c80 3d979c80 3e9402c6 3f9aba07 3f9aba07 -> 3f0358bc 3e058c80 3e058c80", + "3edb05fa 3f32f67b 3d7b42e3 be73ded8 3edfc0fd 3f94d877 3f84eebf -> 3f2ecfd0 3dc4e09e beb21dec", + "3fa812ff 3f0ce920 3f0ce920 bda3889f 00000000 3f800000 00000000 -> bd235fc0 3f92041d 3ccccbdb", + "3fbba835 3f0cb9f6 bd674b79 bd674b79 3e7138aa 3f33dda6 3f12d35d -> 3e4d650c bdb85927 bd8c9568", + "3f3e7a22 3f8e987a be62019a 3f8e987a 3e3f16cd bc17db46 3ee4eb62 -> 3f956701 bd5aea55 3f8fbe91", + "be809e86 3ec00789 3eac9493 3f2cd3fe 3b850518 bdb26be3 3f758974 -> 3eefe09d 3edf7cf8 3f19a476", + "3f72710a 3f162eaf 3f4ea400 3f4ea400 3ea40f3f 3f696c2d 3f50eaaa -> 3ee46212 3f7523fe 3f6c30ed", + "3ea56dee bdec4005 3f904dca 3f5c302e bdc623bb 3e41776a be27a20b -> bd91257f 3f9394c8 3f4cd42e", + "3fb45c7b bd807b05 3f816761 3d84c9da 3f4722c1 3e464183 3e464183 -> bde517a0 3f829db0 3c110dfa", + "3c9bc308 3f9d86c7 3f31ade5 be04cd7c 3eb152e6 3eb152e6 3e1ecbe2 -> 3f9db2f2 3f3138bb be030f8d", + "be4873e3 3e18360b 3f77132b 3f89b2f5 3e51d1b3 3f46ce5c 3e51d1b3 -> 3e29cbef 3f761bc1 3f889417", + "be24db21 bcf53445 3f975833 3f975833 3f400000 00000000 3e800000 -> bce17759 3f939614 3f957724", + "3f859c06 3f5ecf7d 3e1c5d34 3f5ecf7d 3f80821c 3f0267e6 3f80821c -> 3f80dd64 3e1f6e8e 3f80dd64", + "3f839585 3edd6cc3 3f27b941 3f579224 bb3b5b77 bb3b5b77 3eb289cb -> bc700c33 3e98e9cc 3f4afebe", + "3cc8fcd2 3f707dd9 3deb3fc3 3deb3fc3 3f0791a4 3f0791a4 3f97dbdb -> 3f70839c 3deb9722 3df32c27", + "3fa9ee08 3f95d47c 3f92f6e0 3f026fb4 3ef3079d 3eceee97 3de7c87b -> 3f974c60 3f97ca3e 3bbc7d00", + "be798cea 3f599386 3e959c66 3e959c66 3f400000 3f400000 3f800000 -> 3f54e4f1 3e836176 3e624d0f", + "3f9e93c8 3f92c6a7 3f26e3e2 3f62c0d6 3eb37b2e 3f26f2eb 3f2b801b -> 3f99ba94 3f487b8e 3f6f112b", + "3fa91235 3f57683b 3f8abdab 3f8abdab 3e409106 3f84f621 3c3f6067 -> 3f35f492 3f76e853 3f9898c5", + "bcaf9e63 3f3206a3 3b5356da 3f3206a3 bd0d0ecf 3ee448ab 3f0685c7 -> 3f33d00a 3b53d46d 3f31f0d4", + "3e1f78c6 3d35a8a7 3d35a8a7 3f11ef8f 3f498d28 3da3d244 3e2aa78d -> 3d45ea43 3d1de4ef 3f06821a", + "3f1cde61 3f3a8277 3f57af12 3f1661a4 3ee273d9 3f3bde9d 3f577c46 -> 3f35984a 3f633d29 3f429db5", + "3cec6c01 3ec6c382 be45aee2 bd7f4133 bd03cacc 3f1b33cd 3b98e233 -> 3ec0a881 be46e545 bd77f4ee", + "3fbaac5d 3f7bf732 be567ecc 3f4b82f5 3d21a1e1 3f680e61 3d21a1e1 -> 3f768bd8 beea65e9 3f050128", + "3f028a22 3e7aad62 3f021d83 3e393311 3f8c31bd 3f8e3112 3f6c2488 -> 3ec96dd3 3f508a60 3e847e33", + "3fb4e711 3f2c1dad 3f25973c 3f23e65f 3f7107af 3f0bc530 be0c94c9 -> 3f8a66f1 3f315724 bc005480", + "3ee794a1 3f20bab5 3f2c30dc 3f20bab5 3f6bafec be21af26 3e214a77 -> 3f44fb82 3ef4a020 3f03366b", + "3f549535 3e9fb64d bc493fbb 3f219432 3f1373ff 3ea34e78 3ecb91f8 -> 3eb3de3f bc0cbd08 3f118550", + "bee29aab 3f1911d4 3f96fa2e 3f1911d4 be32c634 3e25ffb6 3ea4f436 -> 3f568822 3f901add 3f29457c", + "3fb9214b 3cf5388c bdc38ea7 3f890034 bdbf326c be1e7917 3dd33d90 -> bcafabeb 3daed3a5 3f93555a", + "3faddd97 be288338 3f8dee64 bd942cbf bdbb4f18 bd9a9844 3f43b72b -> 3dcc80bc 3fa3b610 bdfea6e1", + "3f40fee9 be0d1c72 3cf96693 be0d1c72 3f68c5c1 3f30bcd3 3e07c4c2 -> be64304c 3d207ef5 bd7bc120", + "3f81048d bd92ffa6 be3a8026 3f4fe77b bc07af9a 3f18cba0 3f18cba0 -> 3ae7deca be5eea68 3f594b8e", + "bc53203a 3eb0fdaa bd1d38f4 bd1d38f4 3f4b0b4a 3f1a2ce4 3ed992fd -> 3eafa75a bd1ccee4 bd1d86cd", + "bec2f505 bd926915 3e6185d2 3e038066 bce36b5f 3df56194 3f74af1a -> bdcd415f 3e9168c1 3dabb61f", + "3fae6c21 3d8471ca 3f887c64 3ea69135 3f38187b be0dfede be0dfede -> 3dd389ed 3f9741a3 be76b781", + "3f8f7128 3f90c38a 3f5c8aa4 3f918235 3f1bc7fb 3f760faa 3ea78ffe -> 3f8cafbc 3f80989f 3f98496e", + "3f15cd7d 3f6950a0 3f4cf84b 3f6950a0 3ec63dd0 3f051c2a 3f051c2a -> 3f6651e8 3f4e297a 3f69d84a", + "be878b3f 3f8e9b88 3f60b0e0 3f9b60f3 3c4de6f0 be6b4ccb 3f22c933 -> 3f8ad66f 3f6cc9e8 3f9d5936", + "bdee0e48 3ef0f41c 3f0288ab 3efe9a20 3f00bd1f 3e79e116 3f8cfbb6 -> 3ef0caba 3f0a000c 3edb0102", + "3fab176e 3e6e7de3 3f7775c1 3f117cdf 3f95f591 3f3af5c8 3f3af5c8 -> 3f26a99c 3f7cb7d1 3f55879e", + "3f70cf27 3f1b3044 3f48b32c 3f1b3044 3f43ad67 3f44c6eb 3f44c6eb -> 3f4d53df 3f64a68c 3f4e246f", + "3e7e6001 3f9aed62 3f9c3c78 3f9c3c78 3e8514a2 3f67dbbc 3e82ca31 -> 3f9e239a 3f968b7e 3f9faab9", + "3e85002d 3e25b595 3e031d38 3ecfe7d7 3e642e8b 3f8b4967 3e5d5c83 -> 3e0dd8fe 3e2b2e05 3eb13f95", + "3e8b96bd 3f19efee 3f5abe00 3f5abe00 3ef6d1cd 3f854a45 3f33ea77 -> 3f18f07a 3f65bd54 3f5edcb3", + "3ed03b2e 3f3e50fe 3f1a9e68 3f3e50fe 3f7ff2e2 3f77511e 3f74f1e3 -> 3f5904f2 3f410dba 3f56b909", + "3f95d0d5 3e9b76c4 3f071204 3f071204 3f98403c 3e8d5ff6 3ee63fd4 -> 3f4b2fc0 3e8f63de 3ef1aa84", + "3edfd6c8 3f68b82c 3f9f10f9 3f68b82c 3f1aa875 3f1305db 3ed72598 -> 3f6ad6d2 3f9d0c3f 3f67185f", + "3e68e5e0 bdb67aee 3dfe0913 3dc5483c 3f000000 3e800000 00000000 -> bdb67aee 3de12588 3d986995", + "3f8f2698 3f62c0e7 3f62c0e7 3f99c675 3e803f7c 3ecfffc5 3e9174cb -> 3f526e5c 3f5c9ee0 3fa63901", + "be41c3b4 3f4ad6a0 3f4ad6a0 3ebfd9b4 00000000 3f400000 3f800000 -> 3f54e5d6 3f45cf06 3e9b8c41", + "3f657867 3f031d54 3f185557 3f0441b2 00000000 3e800000 3f800000 -> 3d995e98 3ed3be42 3f732d21", + "3c7977b9 be1bf95d be0a1d02 3f408d98 3f4ebc1e 3f363236 3f4ebc1e -> be1d6f57 be0b00f4 3f4125b8", + "3ed87418 3f080bd3 be7f6a7e bca68ad1 be101689 3f4c2b6b 3f4c2b6b -> 3e8e2044 be9fd607 bcd070a4", + "3f3aa49b 3f5ee9a3 3f4f08d6 3f4f08d6 be2bc55a 3d931c2e 3f880358 -> 3f3eb24a 3f3076b6 3f773426", + "3f39170b be19d4a9 be5e96b4 3f2c093f 3e904616 3eac1d97 3f1dd274 -> bdd294c3 be29dae7 3f3a2e0a", + "3fb2a2fe 3f9ab6f3 3f9ab6f3 3f9f0dbc 3f6cffcc be66be25 be66be25 -> 3f75eea8 3fd0ccc4 3fddec64", + "3f4b470b bd8a5390 bd8a5390 bcb20c29 3f400000 3f400000 3f400000 -> bdc13ee2 bdc13ee2 bcf8bcaf", + "3f99f210 3f6a26d3 be1abdbb 3f006dd9 3f151b3a 3f151b3a be6391fb -> 3f6e7c0c be396dd0 beba6430", + "3d79fe74 bdd29407 bdd29407 3e66c2f9 3f96d7b2 bd8514c3 3ed772ba -> bde4048f bdc40e39 3e6487d5", + "be85248e 3f929d9e 3f7fd032 3f7fd032 3e9eb7d8 3e9eb7d8 3e09e510 -> 3f90c6af 3f7fd4eb 3f7fd947", + "3fa6ab0e 3eb41205 3eb41205 3f900f48 3f422b4d bcfc1842 3f8dfc1f -> 3f16a39c be09a886 3f6d287a", + "3fa2a309 3f9de06a 3f16b59e 3f04d88e 3e62c442 3e62c442 3f04247c -> 3fb30652 3e985c14 3f09e8fe", + "bd96ecd4 3f95edab 3f3189f0 3f95edab 3f098b20 3e505cc0 3f343291 -> 3f960c83 3f34f7c6 3f96965e", + "3f80f3a8 be0c4eeb 3f4c61e6 3f4c61e6 3f000000 3f000000 3e800000 -> be0c4eeb 3f4c61e6 3f3261b8", + "3f9a4207 3e9354f5 3f5f5a0f 3f96dcd7 3f73a23f 3f69b686 3e21b1e0 -> 3f19dde4 3f7fd8c1 3fa9b6c4", + "3fbc862e 3e93af7f 3f760caa 3f760caa 3ef5c891 be2531d6 be355da0 -> 3e8b0138 3f62aa52 3f6233d3", + "3dc0fba8 3f4c6ab7 3f7c2058 3f4c6ab7 3e8d9c35 3f8197ec 3e037bff -> 3f4a3eb4 3f7c801d 3f48cdef", + "bec384a2 bc177028 bc177028 3f7978e1 3e25a8e1 3f68605d 3f5b80c0 -> bc3e8e8f bbd09002 3f77b0af", + "3f1b9af8 3e111373 be69d6cd 3ec72a17 3f017d24 3e8de479 3f951c43 -> 3e121a07 be2a7c1b 3f3413c4", + "3fb3b475 3ef9afe3 3e6343d7 3e6343d7 3f84e306 b9260108 3f766903 -> 3f9cc005 bdb7ce97 3f029b63", + "3fbcb447 3f3d5f25 3f87143f 3f3d5f25 bde14c97 3eba46c6 3eba46c6 -> 3e8b10e0 3f89ebe8 3f229e6a", + "be04fbbe be3f86b4 3f606692 be3f86b4 be49b27d 3f8c532b 3f48b318 -> be62328c 3f5b81b7 be316637", + "3f84c0c6 3f97c158 3f944f7a 3ddb4bec 3f400000 3e800000 3e800000 -> 3f8b6fc3 3f9ed7c0 3d532748", + "3ed65e0c be4ef577 3f7bd378 be4ef577 3f8b28a6 3f88287b 3f88287b -> be9a5be0 3f7dcbe0 be9853db", + "be7594d3 3f71d56a 3f078843 be5f059e 3f9e3219 3f15b881 3e183764 -> 3f6cd550 3f02a130 be824db0", + "3ee5d1f1 3f627d79 3f627d79 3f3fc08e 3f400000 3f400000 3e800000 -> 3f691cf6 3f691cf6 3f315532", + "3fb40e8b 3f74bc11 3f21469e 3c8e6d2b 3e971f0d 3f5e1e6f 3f5e1e6f -> 3f6e3e10 3f81a073 3d10df56", + "bef8aa1f 3f45619c 3f45619c bdd41ad3 3f215d64 3f7dba6d 3f58175e -> 3f3df5d9 3f296ac4 bd8d35a2", + "3e92442c 3e35a26d 3f8ff31b 3e35a26d 3f617a22 3f9e0637 3f9cf096 -> 3e5d2656 3f894172 3e807e42", + "3f427974 3d95700d be235a72 be235a72 3efb6c22 3ea1475e 3ea1475e -> 3d936864 bdeae03d bdeae03d", + "3fb8366b 3f0d386e 3f645da6 3f0d386e 3f9f8633 3f9f8633 3f220607 -> 3fc1e2ca 3f8fdcd4 3f3920e0", + "3f15ab4d bc8234d5 bdbd7613 3eaa1c6b 3e94f154 3f07e0cc 3f07437f -> bc44be4b bdc4475a 3eafc13a", + "3e243055 3f2c11bd 3ef52c56 bdbea526 3f752758 3f784908 3f784908 -> 3f3862ee 3f0d0ebb bddb5ef3", + "bd0fb3f8 3f8e23c0 3cff59e8 bdcc12db 3d86125a 3f7d7134 3f889c46 -> 3f8db562 3cf69251 bdc3f364", + "be705ea8 3f0acada 3f867548 3f34301b 3f970727 3f8a2254 3f372795 -> 3ecac29c 3f8836d1 3f2c8510", + "bea36bc8 3f141fb0 be607eac 3f141fb0 3e012452 bdb86ee4 3f9c7a69 -> 3f2ddefe be9a8711 3ec4bda0", + "be865774 3f9e49e4 3eaddaa1 3eaddaa1 3f1423e9 3bac8fcd 3f1423e9 -> 3f9f8a03 3edafd8d 3ea6ad28", + "3e1dc5c5 3e4ddd94 3e74c771 3eb70ae9 3ee8e07f 3ee8e07f 3f8fb14e -> 3e4b0025 3e715f5f 3eda28f4", + "3f80896f 3e7a7668 be27abf8 bd9cea83 3f7a47a1 3f83e90f 3f5402c4 -> 3ef55e2a bead2acf be022b31", + "bed08bb6 bd5e38a4 bd5e38a4 3ef815b6 3e2cd1c0 3eea5e62 3e2cd1c0 -> bd8d177e bd65de96 3f1d8350", + "bef17db3 be01ea23 be01ea23 3efbd926 3f56d716 3d6db17d 3f898c7b -> bdb0af79 be381423 3e66ad0c", + "bec2014a 3f9518fc 3f1fe84a 3f1fe84a 3f4f7f6f 3e60ab51 3f70979b -> 3f9a1008 3f34574c 3effc22e", + "3f180e76 3ebd6788 3f9327b7 3e2b9861 be46a75d be46a75d 3f9d813e -> 3d850414 3fa2f27a 3ea040b1", + "be8a4f96 3ec52445 3f0ee1fb 3f9777bc 3f5eff1e 3f7104bd 3f5eff1e -> 3e9d9e16 3ee7cdc8 3f9c2c34", + "3f4b0438 3e38da3b 3f9b7487 3ecce244 3f523f68 3ef2dd1e 3eb6bd9d -> 3e8b8624 3f9c928a 3e9e631d", + "3edff8cd 3e018d69 bcf497c4 3f86443e be6fa83f 3f9baed7 3f5d8b14 -> 3d3969bb bd46ef4b 3f844363", + "3d8f5b69 3e5165b7 3f1a86b8 3ea680b1 3f3abbf4 3f3abbf4 3f9cc6d3 -> 3e581f83 3f1dc919 3eb765ec", + "3f90160c 3f4ce0fc 3f98b90e 3f4ce0fc 3efa5dba 3f99a049 3efa5dba -> 3f4b9cc7 3f637fda 3f4b9cc7", + "bef639a3 3f964d89 3f8cc724 3e90a4f5 3f1265fa 39ecfb09 3f1265fa -> 3f97d834 3f86a372 3e86a55b", + "3f86c8f0 3f28dd57 3f85b2d1 3ed7fb0f 3f123f7a 3f26bdbd 3f6e2ea0 -> 3f35f1fe 3f83e1e1 3f4de02a", + "3f3535c0 3e0f7938 3e0f7938 3f8ddbda 3f400000 3f800000 3e800000 -> 3e4240a2 3e75080c 3f92c387", + "3c0d02af be1fbf1b 3f983324 3f44e2f0 3e6d386b 3f414b18 bd5bf4d2 -> be1f0236 3f9817f1 3f4452b5", + "3fa3d9af 3d3ee878 3f625c11 3ea8661e 3eca47d6 bc980db0 3f7b7639 -> 3d0ba0a5 3f3b0252 3f3c2900", + "3f210cba 3f75402b 3f02d298 3f9c5d2b 3f9d5217 3f9d150e 3f9d150e -> 3f7f1c76 3f755b2e 3f82696b", + "3db7f955 be344d74 3f8b4d17 3f90481a 3f8f22bf 3c4ea5e6 3c4ea5e6 -> be48546c 3f8c4a6c 3f91b515", + "bebbf671 3f85752a be4c15b7 3f3e4a30 bda95e12 3f95852d 3e4deb40 -> 3f831f69 bdcff04f 3f4cb603" + ] + }, + { + "function": "cycles_mix_sub", + "node": "ShaderNodeMix RGBA SUBTRACT", + "cases": [ + "00000000 00000000 00000000 00000000 3dda0a4b bcfbc2c6 3ed1e7f7 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f0e045d 3d2a4413 bbb2e1cb -> be8e045d bcaa4413 3e8165c4", + "3f800000 00000000 00000000 3f000000 3e1abe1d 3f6cc31c 3f687f6d -> be1abe1d bf6cc31c bed0feda", + "3fc00000 00000000 00000000 3f400000 3f80a0b5 3ea39ecf 3f6ce08b -> bfc0f110 bef56e36 bf2350d0", + "bf000000 00000000 00000000 3f800000 bd00cd98 3ecce7d0 3ecce7d0 -> bc80cd98 3e4ce7d0 3f999cfa", + "3e800000 00000000 3e800000 00000000 be2f7d09 3f634c96 3f634c96 -> 3d2f7d09 3ce59b50 be634c96", + "3f400000 00000000 3e800000 3e800000 3e2358b8 3f4c1768 3f4c1768 -> bdf50514 beb2231c beb2231c", + "40000000 00000000 3e800000 3f000000 3f7cf014 be44fb31 3f7cf014 -> bffcf014 3f227d98 bfbcf014", + "00000000 00000000 3e800000 3f400000 3f39467a 3f39467a 3f52bb4e -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3f3318d8 3e80d13a 3f3318d8 -> beb318d8 3dfe5d8c 3f267394", + "3f800000 00000000 3f000000 00000000 3f307a38 3f49f722 3f49f722 -> bf307a38 be93ee44 bf49f722", + "3fc00000 00000000 3f000000 3e800000 bb8f1c6b 3f647b45 3f424b8b -> 3bd6aaa0 bf56b8e8 bf637150", + "bf000000 00000000 3f000000 3f000000 3f433cb6 3cd8c739 3cd8c739 -> 3ec33cb6 3f03631d 3f03631d", + "3e800000 00000000 3f000000 3f400000 3e7f1bc6 3d442ad2 3e7f1bc6 -> bd7f1bc6 3ef9deaa 3f300e44", + "3f400000 00000000 3f000000 3f800000 be0bf454 bdd656d4 bd5c647f -> 3dd1ee7e 3f141824 3f852a5b", + "40000000 00000000 3f400000 00000000 3f435a29 bdc13543 3f435a29 -> bfc35a29 3f704d50 bfc35a29", + "00000000 00000000 3f400000 3e800000 3f9d0eb5 be1c1073 be1c1073 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f64cb43 3ea84edb 3ea84edb -> bee4cb43 3f15ec49 3eabd892", + "3f800000 00000000 3f400000 3f400000 3e80f863 3c968501 be2f9b66 -> be80f863 3f3b4bd8 3f6be6da", + "3fc00000 00000000 3f400000 3f800000 3f96ccaa 3ebedaba 3dbd85f4 -> bfe232ff 3e436fd0 3f5c76e3", + "bf000000 00000000 3f800000 00000000 3f4c718b 3f1fc6b6 3f44128b -> 3ecc718b 3fa7f1ae 3ec4128b", + "3e800000 00000000 3f800000 3e800000 3ef443d1 be39d37a 3f16f160 -> bdf443d1 3f85ce9c 3dd21d40", + "3f400000 00000000 3f800000 3f000000 3f5e4174 bd1863a1 3eee5f0a -> bf26b117 3f839256 3e1a7170", + "40000000 00000000 3f800000 3f400000 bd4ae62d be1be361 bd4ae62d -> 3dcae62d 3fa6f8d8 3f595cc6", + "00000000 00000000 3f800000 3f800000 3f5e8883 3ea81693 3cfd73dc -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3edb9fe6 3f5452c8 bdb0f788 -> 3d118068 bed452c8 3d30f788", + "3f800000 3e800000 00000000 3e800000 3ecdc26a 3ecdc26a 3f2f8747 -> be1b84d4 becdc26a bedf0e8e", + "3fc00000 3e800000 00000000 3f000000 3f0b9603 3f2f6b0b 3f7050c2 -> bf116104 bf839048 bf687924", + "bf000000 3e800000 00000000 3f400000 bc24dbe1 3f52d5ca be74accb -> 3e7ad921 3ed2d5ca 3f216a66", + "3e800000 3e800000 00000000 3f800000 3ef95089 3f9fba31 3f57c2fe -> 3e0357bc be9fba31 3f4a0f40", + "3f400000 3e800000 3e800000 00000000 3f83edbe 3f0ccf47 3f83edbe -> bf05e49d be266dd4 bf45e49d", + "40000000 3e800000 3e800000 3e800000 3f5c0cfc be67f0ec be67f0ec -> bfbc0cfc 3f33f876 3f33f876", + "00000000 3e800000 3e800000 3f000000 3f0f059f 3f0f059f 3e53bb3f -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f800000 3f800000 3f800000 -> be800000 be800000 3e800000", + "3f800000 3e800000 3e800000 3f800000 3f8cf5df 3eb1081f 3f5e85de -> bf59ebbe bdc4207c 3e05e888", + "3fc00000 3e800000 3f000000 00000000 be6cd98c 3e66d33f 3f95b570 -> 3f18d194 3e25c320 bfe09028", + "bf000000 3e800000 3f000000 3e800000 bce5a34e 3eadb4fe be122727 -> 3e71a5cb 3f2b6d40 3e36ec6c", + "3e800000 3e800000 3f000000 3f000000 3cb4b737 3e8d4957 3cb4b737 -> 3e7a5a46 3edcadaa 3efd2d23", + "3f400000 3e800000 3f000000 3f400000 3f854bed be629d12 3f854bed -> bf07f1e4 3f2a7d73 bcfe3c80", + "40000000 3e800000 3f000000 3f800000 be4a46e4 3ebc53ef 3ebc53ef -> 3f252372 be714fbc 3e875820", + "00000000 3e800000 3f400000 00000000 be703b3b 3f9ffa2f be703b3b -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3cc473b7 3f638ba5 3f638ba5 -> 3e73b8c4 3e9c745b be47174a", + "3f800000 3e800000 3f400000 3f000000 3ea1fb96 3f9ab7b1 3e305bc0 -> bd87ee58 beeadec4 3ea7d220", + "3fc00000 3e800000 3f400000 3f400000 3dcccccd 3dcccccd 3dcccccd -> 3dccccce 3f199999 3f199999", + "bf000000 3e800000 3f400000 3f800000 3e25d925 3f51ef0c 3f51538f -> 3ea97649 3f947bc3 3fb454e4", + "3e800000 3e800000 3f800000 00000000 3f921369 3e7ca8ba bc2d691e -> bd109b48 3f703574 3b2d691e", + "3f400000 3e800000 3f800000 3e800000 3f4232b4 3f9b21c6 3f2324a3 -> bea34c0e 3dba6ab8 be696de8", + "40000000 3e800000 3f800000 3f000000 3f34d3f1 3f02c696 3f2fe4be -> bf94d3f1 bcb1a580 bf5fc97c", + "00000000 3e800000 3f800000 3f400000 be4adf40 3f1d7636 bdceaa6b -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f64c989 3f64c989 3f351405 -> be499312 3f0d9b3c 3f2575fe", + "3f800000 3f000000 00000000 00000000 3eefc10f 3eefc10f 3f0f30fd -> 3d01f788 beefc10f bf0f30fd", + "3fc00000 3f000000 00000000 3e800000 3e60b473 3f9eb9bd 3e517075 -> 3e2ef152 bfee169c bd68a2c0", + "bf000000 3f000000 00000000 3f000000 be14aac2 3ec18fef bd99801e -> 3edad550 3e418fef 3eeccffc", + "3e800000 3f000000 00000000 3f400000 3de108a8 3de108a8 3eef333f -> 3ef1ef76 bce108a8 3f221998", + "3f400000 3f000000 00000000 3f800000 3f000000 3f000000 00000000 -> 3e000000 bec00000 3f800000", + "40000000 3f000000 3e800000 00000000 3ef6cb81 3ef47ed3 3ef47ed3 -> beed9702 bf347ed3 bf747ed3", + "00000000 3f000000 3e800000 3e800000 3dc03498 3e911d7f 3bf10aeb -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3f88c79f 3e3924f5 3f88c79f -> bd0c79f0 3e236d86 bd0c79f0", + "3f800000 3f000000 3e800000 3f400000 bab69750 3ea296de 3f843f4f -> 3f005b4c bd8a5b78 be90fd3c", + "3fc00000 3f000000 3e800000 3f800000 3f800000 3f400000 3e800000 -> bf800000 bf600000 3f200000", + "bf000000 3f000000 3f000000 00000000 3e3fba3b 3f61a9d4 3f9bab35 -> 3f17f748 3f70d4ea 3f1bab35", + "3e800000 3f000000 3f000000 3e800000 3f8c6714 3f2aecf6 3f8c6714 -> 3e6731d8 3eaa8985 bcc67140", + "3f400000 3f000000 3f000000 3f000000 3e05fee9 3d23a307 bd6e579c -> 3ecdc069 3ef0a8b7 3f0b2c1c", + "40000000 3f000000 3f000000 3f400000 3f921519 3f99276b 3eb45ff8 -> bfe42a32 bff24ed6 3d3a0080", + "00000000 3f000000 3f000000 3f800000 3f8d8964 bd9371ec 3f62b162 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f1ad852 3ed36a87 3f1ad852 -> 3e4a4f5c 3f0b255e be9ad852", + "3f800000 3f000000 3f400000 3e800000 3dccc79c bd80e49f 3ec2a3e2 -> 3eccce19 3f501c94 be0547c4", + "3fc00000 3f000000 3f400000 3f000000 3f800000 3f800000 00000000 -> bf800000 bf400000 3f000000", + "bf000000 3f000000 3f400000 3f400000 3f622721 bd5fbe70 bd34b950 -> 3f711390 3f39020c 3f3a5a36", + "3e800000 3f000000 3f400000 3f800000 3f8069a4 bc93fec4 3e110089 -> 3e7f2cb8 3f4127fe 3f76eff8", + "3f400000 3f000000 3f800000 00000000 3efe6a39 3e8c9d59 3efe6a39 -> 3e0260aa 3f4b44ff bebecfab", + "40000000 3f000000 3f800000 3e800000 3f83c1db 3f86f714 3f83c1db -> bfc783b6 bf8dee28 bfe783b6", + "00000000 3f000000 3f800000 3f000000 3f8801d9 3f83b3f1 3f8801d9 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3eac786b 3ee2f8a3 3f28a55c -> 3ea9c3ca 3f4741d7 3ed75aa4", + "3f800000 3f000000 3f800000 3f800000 3f05d327 3ed315e8 3f17d13a -> bcba64e0 3f16750c 3ed05d8c", + "3fc00000 3f400000 00000000 00000000 3f0c7797 3f71877e 3f753372 -> bd959b10 bfb5259e bfb7e696", + "bf000000 3f400000 00000000 3e800000 3eb763f2 3f3adfda 3eb763f2 -> 3f6dd8fc 3ebadfda 3edbb1f9", + "3e800000 3f400000 00000000 3f000000 be318a7b be138d93 be138d93 -> 3f4b18a8 3d138d93 3f0938d9", + "3f400000 3f400000 00000000 3f400000 3e800000 00000000 3f000000 -> 3f100000 00000000 3ec00000", + "40000000 3f400000 00000000 3f800000 3f1e21b0 3f36e7de 3f1e21b0 -> bef886c0 bfb6e7de be710d80", + "00000000 3f400000 3e800000 00000000 3f9411bf 3f9411bf 3ee986d4 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3e800000 3f000000 3f400000 -> 3f200000 00000000 be000000", + "3f800000 3f400000 3e800000 3f000000 3f5446dd 3ef300e0 3ef300e0 -> bda236e8 be6601c0 3ccff200", + "3fc00000 3f400000 3e800000 3f400000 be38615d 3f2271a2 bd97227b -> 3f829241 bf33aa73 3f5c5676", + "bf000000 3f400000 3e800000 3f800000 3eeb3058 3e392396 3f958f7b -> 3f7acc16 3eae48e6 3fcac7be", + "3e800000 3f400000 3f000000 00000000 00000000 00000000 3f800000 -> 3f400000 3f000000 be800000", + "3f400000 3f400000 3f000000 3e800000 3f83208b 3f83208b 3f799ebb -> bc961a00 be8961a0 bef66e18", + "40000000 3f400000 3f000000 3f000000 3ea22377 3f0af412 3f9201de -> 3deee448 bf15e824 bfe403bc", + "00000000 3f400000 3f000000 3f400000 3f000000 3e800000 3f400000 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 00000000 3f000000 3f000000 -> 3f400000 3e800000 3f400000", + "3f800000 3f400000 3f400000 00000000 3f8c43a4 3e8bec8a 3e8bec8a -> beb10e90 3ef41376 be8bec8a", + "3fc00000 3f400000 3f400000 3e800000 3e76b9bf 3eed9c1c 3f897bdd -> 3ec6f4b0 3d5caeb0 bfae39cc", + "bf000000 3f400000 3f400000 3f000000 be05d912 be05d912 bd5e2093 -> 3f2f44de 3f2f44de 3ef21df7", + "3e800000 3f400000 3f400000 3f400000 3f65bc02 3f65bc02 3eb60ca3 -> 3f069100 3f069100 3f293e6c", + "3f400000 3f400000 3f400000 3f800000 3e471744 3f16ce0e 3f614f61 -> 3f1aaba3 3e9dcaeb 3eae08ee", + "40000000 3f400000 3f800000 00000000 3f846ec1 3f846ec1 3ebb240e -> bfa8dd82 bf88dd82 bf3b240e", + "00000000 3f400000 3f800000 3e800000 3f800000 3f400000 3f800000 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f800000 3f800000 3f000000 -> 3e800000 3f000000 3e800000", + "3f800000 3f400000 3f800000 3f400000 3e870538 3ef8a1a8 3f751606 -> 3ef8fac8 3f03af2c be545818", + "3fc00000 3f400000 3f800000 3f800000 3e893aa7 3ef50fb2 3ac2cb2e -> 3eb22806 3e906874 3f7f6de7", + "bf000000 3f800000 00000000 00000000 3eb7e058 3f91ca52 3eb7e058 -> 3f96fc0b 3f11ca52 3e37e058", + "3e800000 3f800000 00000000 3e800000 3ed28ef4 3f9f1d3d 3f78d4e9 -> 3f65ae22 be9f1d3d 3be562e0", + "3f400000 3f800000 00000000 3f000000 3f2d20b2 3f2d20b2 3f92dc3b -> 3efc4ef4 bf01d886 beb894b0", + "40000000 3f800000 00000000 3f400000 3e189f06 3f43486e bdcb1c41 -> 3f33b07c bfc3486e 3f72c710", + "00000000 3f800000 00000000 3f800000 3d9b62e7 3f362c86 3ebe0967 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f3a7c81 3f82d526 3f3a7c81 -> 3f22c1c0 be85aa4c beba7c81", + "3f800000 3f800000 3e800000 3e800000 3f9e6ad5 3e2c3552 3f526157 -> be7356a8 3da7955c bf126157", + "3fc00000 3f800000 3e800000 3f000000 3e156526 3f004945 3e156526 -> 3f47fa11 bf006de8 3e8ff424", + "bf000000 3f800000 3e800000 3f400000 3f400000 3f000000 3f000000 -> 3fb00000 3f000000 3f800000", + "3e800000 3f800000 3e800000 3f800000 bd4abc75 3f21a109 3f2e08b2 -> 3f819579 3dbcbdee 3f547dd4", + "3f400000 3f800000 3f000000 00000000 3ec2bbb7 3f0e2746 3ea538e0 -> 3f36f99b 3dab145c be77d550", + "40000000 3f800000 3f000000 3e800000 3eb18bef 3eb18bef 3f8ce42b -> 3e9ce820 be462fbc bff9c856", + "00000000 3f800000 3f000000 3f000000 3e800000 3f800000 3e800000 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3e8c7248 3f9a7204 3f9f9bec -> 3f5ce36e bdd39020 3e019050", + "3f800000 3f800000 3f000000 3f800000 00000000 3f000000 3f800000 -> 3f800000 00000000 00000000", + "3fc00000 3f800000 3f400000 00000000 3f328f67 3f3c3977 3f328f67 -> bd3d71a0 beb4ac64 bf85eb8d", + "bf000000 3f800000 3f400000 3e800000 3ed12715 3dadbc5a 3eb8eb95 -> 3f9a24e2 3f4adbc6 3edc75ca", + "3e800000 3f800000 3f400000 3f000000 bd884aad bd884aad 3f9f2aab -> 3f82212b 3f444256 3e41aaaa", + "3f400000 3f800000 3f400000 3f400000 bdb6391e 3f985ab0 3f985ab0 -> 3f888aae be122020 be122020", + "40000000 3f800000 3f400000 3f800000 3f28a23e 3ebbe850 3f28a23e -> bea288f8 3c82f600 bea288f8", + "00000000 3f800000 3f800000 00000000 3dd73cc2 3dd73cc2 3f3ed971 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 be1d8064 3ed115ff 3ed115ff -> 3f89d806 3f4bba80 3d3ba804", + "3f800000 3f800000 3f800000 3f000000 bda9120c bda9120c 3e912dcc -> 3f8a9121 3f8a9121 3e5da468", + "3fc00000 3f800000 3f800000 3f400000 3f71b29c 3f0fee5f 3e938caa -> bed517d4 3e2069c8 3ea2ad01", + "bf000000 3f800000 3f800000 3f800000 3f0989af 3f0989af 3ebcded6 -> 3fa2626c 3fa2626c 3f979bdb", + "3e800000 00000000 00000000 00000000 3eaaa977 3f9813e2 3f3426c6 -> bdaaa977 be9813e2 be3426c6", + "3f400000 3e800000 3e800000 3e800000 3f251c6e 3f51e279 3f51e279 -> be6f554a bebad3b6 bebad3b6", + "40000000 3f000000 3f000000 3f000000 3e800000 3f800000 3f000000 -> 00000000 bfc00000 bf000000", + "00000000 3f400000 3f400000 3f400000 3e68d02b bdfaf71b bdfaf71b -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f5654ee 3f683c90 3f683c90 -> 3f14d589 3f0be1b8 3f0be1b8", + "3f800000 3fa00000 3fa00000 3fa00000 3f5b3f66 3f5b3f66 3cfb92b6 -> 3ec98134 3ec98134 3f9c11b5", + "3fc00000 be800000 be800000 be800000 3e955b11 3d80ea65 3e955b11 -> bf30044c beb057e6 bf30044c", + "bf000000 3dcccccd 3dcccccd 3dcccccd 00000000 3f400000 3e800000 -> 3dcccccd 3ef33333 3e666666", + "3e800000 3f666666 3f666666 3f666666 3ec5a1be 3dc64215 3dc64215 -> 3f4db22e 3f603455 3f603455", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3dd3d0f2 3dd3d0f2 3f02e8fc -> 3e82f37c 3e82f37c bd4d9680", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f3cc4ce 3f4e0176 3f3cc4ce -> bf4edef1 bf715841 bf4edef1", + "00000000 3ce171f2 3f086d31 3db86639 3e353692 3f911d26 3f3b4bf8 -> 3ce171f2 3f086d31 3db86639", + "3f000000 3db3faf7 3ef05d1e 3e9fd147 3f688098 bcaebd54 3e858ccc -> bebb81da 3ef5d308 3e3a15c2", + "3f800000 3e923a6a 3f713272 3e923a6a 3f713654 3f5f36d4 3f88a74d -> bf28191f 3d8fdcf0 bf483165", + "3fc00000 3eeb6c31 3f9e11cb 3f27c11c 3ee86b34 3ee1257a 3ee1257a -> be62693a 3f13477a bb8d8000", + "bf000000 bdbd8d4f bd8f50d5 bcb6cb99 3eb208bf 3f2ae339 3e7edee1 -> 3da6842f 3e870f04 3dd12bfb", + "3e800000 3eb09a60 3f820fe4 3eb09a60 3c1267d3 3f50e598 3c1267d3 -> 3eaf7590 3f4fe662 3eaf7590", + "3f400000 3e4b0278 3efa41b5 3e4b0278 3f800000 00000000 3f800000 -> bf0d3f62 3efa41b5 bf0d3f62", + "40000000 3f736304 3e6bd646 3efa178f 3f62a87d 3e896fdf bdb3f44c -> bf51edf6 be9cf49b 3f2a08da", + "00000000 be354d9e 3f9f42c6 3efccd1b 3eac33b2 3e1ec8c6 bd1df921 -> be354d9e 3f9f42c6 3efccd1b", + "3f000000 3f9bfce3 3f9e6061 3f9bfce3 3f3b3e67 be608b0d 3f3b3e67 -> 3f5a5a92 3fac6912 3f5a5a92", + "3f800000 3ed43f01 3f52c3f6 3e342743 3f9dd19a 3f9dd19a 3f87a703 -> bf5183b4 bed1be7c bf624435", + "3fc00000 3f9515df bd93fbb0 3f9515df 3f5d0dcd bd44218d 3f51199e -> be05a3d8 b9e28600 bd77aae0", + "bf000000 3f3f565e 3f14f390 3f14f390 3f396658 3f698f8b 3f698f8b -> 3f8e04c5 3f84ddab 3f84ddab", + "3e800000 3f1c9a6e 3eebccf2 3d9c2436 3f800000 3f000000 3f400000 -> 3eb934dc 3eabccf2 bde3dbca", + "3f400000 3ed008d2 bd2c4c5f 3ed008d2 3f7e1eb0 be5b1da8 3f8e35e0 -> bead2536 3df2864c beda98ce", + "40000000 3ee4bdea 3e197b08 3ee4bdea 3eca2bca bc1a345b 3eca2bca -> beaf99aa 3e2cc194 beaf99aa", + "00000000 be62b50d 3e568f84 3e824be8 be5e0392 3ce5cf52 3f541ee1 -> be62b50d 3e568f84 3e824be8", + "3f000000 bd86ff29 3df6d959 3f02fec3 3f4f03a1 3f9fe789 3f70e983 -> bef0c36b bf010c5e 3d28a018", + "3f800000 3f89489c 3f914815 3f989dc2 3f400000 3f800000 3f800000 -> 3ea52270 3e0a40a8 3e44ee10", + "3fc00000 3f5a3a77 be666b72 3f9098f4 3f89b067 3e3fac01 3ebfefd4 -> bf42d6bd bf017b5e 3f113e09", + "bf000000 bc9876f9 3e29b3dd bc9876f9 3f231949 3ea908e3 3ea908e3 -> 3e9991d9 3ea95e60 3e15fa04", + "3e800000 bdeb314d 3f138a5c bdeb314d 3f0bea3a bc11d078 3c68e2bb -> be80c170 3f141c2c bdf27863", + "3f400000 3f219be3 bd269297 3f219be3 3f8a8894 3f5aa543 3f8a8894 -> be38c3ec bf2e651b be38c3ec", + "40000000 3f9d5694 3f83f06f 3f83f06f 3f94658c 3f6c71c2 3f6c71c2 -> bf8b7484 bf5102a6 bf5102a6", + "00000000 3f4ed72d 3f4ed72d 3f99cec1 3f5a4de7 3e19016a 3e302aa2 -> 3f4ed72d 3f4ed72d 3f99cec1", + "3f000000 3f3a207e 3f9e4859 bcd457b9 bd94ea23 bd94ea23 3f1d227a -> 3f436f20 3fa2efaa beaa67f6", + "3f800000 3ec322c9 3f1223fb 3f1223fb bda46b88 3eb28bbb 3f162cd0 -> 3eec3dab 3e637876 bc811aa0", + "3fc00000 3e2539fc 3f880683 3cd55eab 3f732f07 3eb3d13e 3eb3d13e -> bfa1bc06 3f093018 bf0031f9", + "bf000000 3f7b076f 3f1d7d60 3e55f12e 3f44e822 3e4e705d 3d1214b5 -> 3faebdc0 3f374b6c 3e6833c4", + "3e800000 bd095c24 bd095c24 3ea96023 3f9ff53e 3ee4d1b1 3ee4d1b1 -> beb120c2 be14bfe2 3e60576e", + "3f400000 3eb8ab00 3e6e3815 3f4f832a 3f126c7a 3f0c9a94 3f126c7a -> bd8bdedc be3797a7 3ec3639d", + "40000000 3ec17553 3f5543ac 3d524dda 3dc01f91 3ecbef61 3e8e5027 -> 3e42cb16 3d1544b0 bf012b49", + "00000000 3d837bff 3d837bff 3f8b27f9 3f6aa7da bd998958 3f95630d -> 3d837bff 3d837bff 3f8b27f9", + "3f000000 bdcae96d 3e42b115 3e42b115 3f2972af 3edf3444 3edf3444 -> bedc2d0a bce41978 bce41978", + "3f800000 3e35e2cc 3f8d3fa5 be2a54d2 3e5a1b82 3e5a1b82 3f71fc31 -> bd10e2d8 3f63f86a bf8e48b3", + "3fc00000 3df8836b 3df8836b 3f6dee6a 3f925db2 3ea12493 3f3235c6 -> bfcc0454 beb39601 bdeb11f0", + "bf000000 3f8198c5 3efbead8 bd9a67e7 3f7a85be 3e6961b4 3f969d93 -> 3fc03a34 3f1b21a2 3f035096", + "3e800000 3f82e892 3f292af5 3f9bea46 3eaf1944 3f5e5709 3e5e24ea -> 3f6fedfc 3ee32a66 3f94f91f", + "3f400000 3f8a1cf0 bd94c2aa 3d91ddf3 3f8be81e 3f77b2b2 3f8df72b -> 3e84bb66 bf4c5e5b bf42b702", + "40000000 3eef1ca3 3f9aab7a 3f9aab7a 3e7b44b0 3f27588e 3f7f66c8 -> bcc280d0 bdcad140 bf49769c", + "00000000 3f815d70 3f87b2de bd810381 bd7abe8d 3e1a538a 3e20d4cd -> 3f815d70 3f87b2de bd810381", + "3f000000 3e243ede be786aaf 3f009f35 3f0f64b7 3f5d7bb8 3f0f64b7 -> bdf51520 bf2cd888 3e63b366", + "3f800000 3efbef97 3efbef97 3f646f78 00000000 3e800000 00000000 -> 3efbef97 3e77df2e 3f646f78", + "3fc00000 bd901c5b 3ea8942e 3f13224c 3f1b2ebf be2291be 3f19d888 -> bf7ac9a9 3f1140be bea74500", + "bf000000 bdeebb7d 3f83c845 3f65f831 3f10187e 3f49ffd0 3f6ada68 -> 3e28d33e 3fb64839 3fadb2b2", + "3e800000 be3e7704 3e0168c4 3f10e760 3d040099 3ea24929 bdaa3ff9 -> be46b70e 3d4110be 3f163960", + "3f400000 bd3888bc bd3888bc 3f04a8fe 3f65057f 3f98f592 bdcb6986 -> bf374cab bf70f8e7 3f17bae3", + "40000000 be0f772e 3ca5d58b 3d94c540 3f1d7032 3eac1f9a 3f1d7032 -> bfaf5f18 bf26f0ee bf9423de", + "00000000 3f0d2f81 3e782bff 3e782bff 3f3505b3 3f74d9cc 3f3505b3 -> 3f0d2f81 3e782bff 3e782bff", + "3f000000 3f2f437f 3ecc1ea7 be71a900 3e61be8f 3f468b0a 3df57e88 -> 3f130bad 3c3273a0 be978451", + "3f800000 bdd1de39 3f25923f bdd1de39 3f2011da 3f5f7c76 3f0c120b -> bf3a4da1 be67a8dc bf264dd2", + "3fc00000 3f1a1d2e 3c8e6f9c 3f1a1d2e 3f004cd7 3f0dce58 3f0dce58 -> be195850 bf504207 be6a6158", + "bf000000 3f81cabc 3e73119a be4543b5 00000000 3e800000 3f400000 -> 3f81cabc 3eb988cd 3e3abc4b", + "3e800000 3f961897 3f431dc7 3f961897 3f9c9748 3f257aec 3f257aec -> 3f5de58a 3f19bf0c 3f81693a", + "3f400000 3eff2691 be55834d be55834d 3f0294da 3f78ec70 3f405582 -> 3ded1d28 bf701228 bf45a0f5", + "40000000 3f8dbb87 bd145c6e 3d5cdb3c 3f6b9323 be01b5d6 be4c0b84 -> bf3baf38 3e5e5490 3ee7a6ec", + "00000000 3f7a3cd1 3f116517 3ec8fd2f be00ce8f 3eaff9cd 3d603bda -> 3f7a3cd1 3f116517 3ec8fd2f", + "3f000000 3f19a183 3e40225b 3e40225b 3f000000 3f400000 00000000 -> 3eb34306 be3fdda5 3e40225b", + "3f800000 3ea9e9ba be357a25 3f28ce1a 3e564153 3f74f677 bd030a9c -> 3dfb2442 bf912a80 3f30fec4", + "3fc00000 3e4f3640 3f684ee6 3e4f3640 3e620956 3f126bad 3f126bad -> be03d7c0 3d4ad620 bf27d3f4", + "bf000000 3eb92ce9 3f9ed7ee 3eb92ce9 be486c85 be486c85 3f863ca1 -> 3e8711c8 3f925126 3f62d316", + "3e800000 3ec4df54 3f52e199 3f52e199 3f8d2bc1 3f26253c 3f211811 -> 3ddece4c 3f29584a 3f2a9b95", + "3f400000 3e4befdd 3e7dc28b 3e65df42 3f0a4fd6 3d028fb3 bd63589f -> be52ffa5 3e654799 3e883ff0", + "40000000 3efbd1e1 3f5d4c1a 3f8fd071 3d9a5c02 3df16d0d be781ae1 -> 3eaea3df 3f20f0d6 3fcdd729", + "00000000 3f70875a 3e925938 be673931 3f01d3f1 3f3b3bb6 3f3b3bb6 -> 3f70875a 3e925938 be673931", + "3f000000 3f9d7af9 3f15914a 3f9d7af9 3eb84a8c be02cf04 3eb84a8c -> 3f8671a8 3f25eb2a 3f8671a8", + "3f800000 3e081995 3f359658 3f359658 3e417f99 3f4044af be5bd796 -> bd659810 bd2ae570 3f6c8c3e", + "3fc00000 3ef473e1 bd8d36d2 bd8d36d2 be5df994 3effc66a 3f4c0e33 -> 3f4d7788 bf517baa bfa1de13", + "bf000000 3f55d1b1 3f0973fc 3f809734 be349532 3f8646ea be00c1dd -> 3f3f3f0a 3f87dd73 3f71162c", + "3e800000 3d8743cf 3d8743cf be106d98 3f840704 3f4efff6 3f4efff6 -> be446c20 be0b5e0e beafb6c7", + "3f400000 3f905e18 3f7efffd 3f7efffd 3f9b9da3 3f9b9da3 3e5d4374 -> 3e5d3ef0 3dac9c48 3f558357", + "40000000 3d3fafb2 3d3fafb2 3ed87ed5 3f5ffcc2 be65acd3 3f879ec3 -> bfd9ff44 3efda2ca bfd91dd1", + "00000000 3e75c4f1 3e75c4f1 3f628ff2 00000000 00000000 00000000 -> 3e75c4f1 3e75c4f1 3f628ff2", + "3f000000 3f94482b 3f8b6539 bda7ec53 3e96a237 3f71c117 3f16f4d6 -> 3f8173e4 3f1de9e6 bec0efeb", + "3f800000 3f267b9a 3f8f2fbc 3f8f2fbc 3f908115 3e325ee4 bcdae144 -> bef50d20 3f71c7bf 3f929b41", + "3fc00000 be0c0b53 bd239ac2 3f000dd8 bd905818 3f43ccfd 3f61c0d3 -> bcfe4a08 bf97f694 bf529364", + "bf000000 3f0a14d5 3f91533c 3f971bb1 3ec36b04 be4aad09 3f9f6450 -> 3f3aef96 3f84a86c 3fe6cdd9", + "3e800000 3cffc05a 3ce90f31 3cffc05a 3f8d5d4d 3f9c7e23 3f8d5d4d -> be7ac28f be8ded30 be7ac28f", + "3f400000 3f0048ec 3f0048ec 3e3626dd 3f81b252 be3625d1 be3625d1 -> be84851e 3f227003 3e9f619d", + "40000000 3daa55ac 3f3c2d08 3f3c2d08 3f77c4ad 3e0ae4d3 3f77c4ad -> bfed1f53 3eed753c bf99ae29", + "00000000 bce3b780 3f8da0f3 3f8da0f3 3f1c6ae8 3ea6779c 3f1c6ae8 -> bce3b780 3f8da0f3 3f8da0f3", + "3f000000 3cd48a1f 3e7630f8 3e7630f8 3f97ae35 3d2dfbdd 3f97ae35 -> bf1109e4 3e60717c beb443ee", + "3f800000 3e8dc83e 3f7a715e bd891528 3f400000 00000000 3f800000 -> bef237c2 3f7a715e bf889152", + "3fc00000 3ed0a4ef 3f403ed6 3f403ed6 3ea08ad3 3ec15172 3ec15172 -> bd80ad34 3e3d0700 3e3d0700", + "bf000000 3f5b04bd 3f5b04bd be208c98 be66142a 3f9be72d be66142a -> 3f3e4238 3fbb75f5 be89cb56", + "3e800000 3cffefc0 3e8c6009 3e8c6009 3e5bd14a 3e5bd14a bac528c5 -> bcb7b2d4 3e61cbc0 3e8c9153", + "3f400000 bdaee5c5 bd8e45c5 bdaee5c5 3ef4b822 3ef4b822 3f69daff -> bee3438b bedb1b8b bf4540f8", + "40000000 3f282ed0 3f83e149 3f6e9d67 00000000 3f800000 3f400000 -> 3f282ed0 bf783d6e bf116299", + "00000000 3f63a37f 3f63a37f 3ebcb888 3e472fa3 3e472fa3 3f56e1b4 -> 3f63a37f 3f63a37f 3ebcb888", + "3f000000 3f12af43 3f12af43 3f4deb77 3f9bc386 3f9bc386 3ea75e70 -> bd114430 bd114430 3f2413db", + "3f800000 3ed4551b 3dccf6c2 3dccf6c2 3e0b157b 3e3fe738 3eee5db6 -> 3e8eca5e bdb2d7ae bebb2006", + "3fc00000 bdbc8dfc bdbe17d5 be1b00ba bdabff6c 3ef79edb 3f5590a5 -> 3d0ae24c bf517a1f bfb38c93", + "bf000000 be728300 be728300 bc9d019b be7981be 3d96795e be7981be -> beb7a1f0 be4ce4a8 be106112", + "3e800000 3f1bca0c 3d1a8273 3d1a8273 bd293f00 3f282f2f 3f900bf0 -> 3f1e6f08 be018e92 be797743", + "3f400000 3e28e51c 3f2916b7 3f7ece39 3f500190 3c8223cc 3c8223cc -> bee38fca 3f2609e0 3f7bc162", + "40000000 3dfa1bd2 3dfa1bd2 3f7d424a 3e49c7af 3f6cefdf 3f93630b -> be8b40ba bfdd4e22 bfa824f1", + "00000000 3f7673f5 3cb1ba35 3cb1ba35 be31cc09 3f0c4d67 3f0c4d67 -> 3f7673f5 3cb1ba35 3cb1ba35", + "3f000000 3f1af00d 3f96fc30 3f77979a 3e21868a 3e8ad292 3e44fe45 -> 3f06bf3c 3f85a1de 3f5ef7d2", + "3f800000 3f1a1523 be4583dc be4583dc 3f87f6b4 3eb973b3 3eb973b3 -> beebb08a bf0e1ad0 bf0e1ad0", + "3fc00000 3dd03fc5 3e8d8534 3dd03fc5 3e8536c1 3ec58a6e 3f1fb788 -> be93c231 be9aca70 bf558b53", + "bf000000 3e44ffcb 3f1c20dd 3ec140f5 3f9cb276 3f9cb276 3d7a9ead -> 3f4df269 3f9c69aa 3ed0eae0", + "3e800000 3f39c1be 3f885e14 3f39c1be 00000000 00000000 3f000000 -> 3f39c1be 3f885e14 3f19c1be", + "3f400000 3f93555a 3f791e0a 3f90fb73 bba843e5 3f0e1022 3f9de7d2 -> 3f93d38d 3f0e91f0 3e546cac", + "40000000 3f821d36 3f176083 3f15b0a6 bdc9ec61 3f202859 bdc9ec61 -> 3f9b5ac2 bf28f02f 3f482bbe", + "00000000 be5bf097 be5bf097 3e1c536d 3f387937 3df66cac 3f311f05 -> be5bf097 be5bf097 3e1c536d", + "3f000000 be375e86 3e330329 be375e86 3f0252fd be04f7fd 3f9a9818 -> bede023f 3e757f28 bf486fba", + "3f800000 be0f72d4 3f9f7285 be0f72d4 3e681389 3edf34e4 3edf34e4 -> bebbc32e 3f4f4a98 bf137727", + "3fc00000 3f52c09b 3ebd9fc4 3f52c09b 3f916afc be13bf8f 3f9e9415 -> bf618059 3f1637b8 bf847dd2", + "bf000000 be6cd34a 3ea1e6a9 bde74f83 3ea19779 3e6c7d3a 3f3f20df -> bd9677a2 3edd05f8 3e854cfe", + "3e800000 bc9b42f0 b9bd4f83 b9bd4f83 3f930521 3f9b2a57 3efd560e -> be9cb950 be9b59ab bdfe135e", + "3f400000 3f2a467c 3efe60b3 3f888ced 3ef03018 3ef03018 3f83dd5a -> 3ea068e6 3e147942 3e969ba6", + "40000000 3e976aa4 3f2ee0d4 3e825994 be07ae77 3f9d1e8c bc93deda -> 3f0f8c8e bfe2ccae 3e94d570", + "00000000 3ed3bbb6 3ed3bbb6 be1e5c7b 3e081434 3f067137 3e0cf00c -> 3ed3bbb6 3ed3bbb6 be1e5c7b", + "3f000000 3e553902 3f1ff9e5 be204595 3f685922 3ec7ffe6 3ec7ffe6 -> be7b7942 3edbf3d7 beb422be", + "3f800000 3eb25a63 3f96abe2 3eb25a63 3f9e2601 3f386696 3e9feeb6 -> bf631ed0 3ee9e25c 3d135d68", + "3fc00000 3f16196a 3f024e3c 3e952e2d bdcdfa41 3ee64037 bdcdfa41 -> 3f3cb856 be2987b4 3ee26c05", + "bf000000 3f3f6ac7 bd00248a bd00248a 3f27d3d3 3f27d3d3 3f5790ca -> 3f89aa58 3e97cf42 3ec78c39", + "3e800000 3ee94702 3ee94702 3edd267e 3f35d8b6 3e879178 3e879178 -> 3e8e5aa7 3ec762a4 3ebb4220", + "3f400000 3ca7bd27 be3bb70a 3f683c30 3e505ae9 3e505ae9 bb82deac -> be074c8a beabfd9d 3f69007e", + "40000000 3e3dd4e8 3e13b941 3f8ec6bc 3e23f65d 3e126641 3e23f65d -> be0a17d2 be111341 3f4b924a", + "00000000 bd0827f7 3e4f0061 3ebf1902 3ee7f9a5 3ef39b1d 3f447c98 -> bd0827f7 3e4f0061 3ebf1902", + "3f000000 3f94cc60 3cf893d2 3f39d74d bdcf6bd7 3f4095f8 3eaf7f0f -> 3f9b47be beb10cbb 3f0df789", + "3f800000 3f7f4453 3db46737 3e0b55af be05bfd0 be05bfd0 3f91945b -> 3f905a24 3e5ff36c bf8029a5", + "3fc00000 3f46dd09 3ed4fa4a 3f46dd09 3f64c87b 3f9582ea 3e012267 -> bf104faf bfab05cc 3f167022", + "bf000000 3f0f5855 3f0f5855 3ede4e0c 3f000000 3f000000 3f400000 -> 3f4f5855 3f4f5855 3f4f2706", + "3e800000 be1151ef bd4b0afa bd4b0afa 3ed5df2e 3ddb9b7d 3f8beb56 -> be7c4186 bd9c6c5c bea54cb5", + "3f400000 3f72129a 3f6923ac 3e84e6ef 3f43dbc1 3e91ce47 3f43dbc1 -> 3ebe5b92 3f327651 bea0e2b5", + "40000000 3e396359 3f1df7e2 3f391536 3f624c82 3e3ba0a2 3f0062e2 -> bfcb2017 3e804f22 be8f611c", + "00000000 3f5e83f9 3f5e83f9 3f8c6d24 00000000 3e800000 3f000000 -> 3f5e83f9 3f5e83f9 3f8c6d24", + "3f000000 3e154142 3f6ba548 3e15549a 3f875dd2 3ed72e0b 3ead73b8 -> bec41b03 3f35d9c5 bcc0f8f0", + "3f800000 3da26365 3f49cb94 3eef30eb 00000000 00000000 3f400000 -> 3da26365 3f49cb94 be90cf15", + "3fc00000 3f98c22b 3f49328d 3f98c22b 3f800000 3f400000 3f000000 -> be9cf754 bead9ae6 3ee308ac", + "bf000000 3e3fc758 3f99350d 3f99350d be75bc43 bdb6c987 3e6183c0 -> 3d89d26c 3f937ec1 3fa74d49", + "3e800000 3f8ff0e4 3f8ff0e4 bdc8e41b 3f7181de 3f7216df 3de35c83 -> 3f638150 3f635c10 be00dd9e", + "3f400000 3f04ade3 3f7a2570 3f0ece0c 3d80a6d7 3d80a6d7 3e3bf979 -> 3ef13c7e 3f6e15cc 3ed71e8b", + "40000000 3f9e906f 3f9841f8 bd19d60d 3f5d9f92 3f34fce9 3f957e10 -> befc3c8c be65d788 c017e568", + "00000000 3e9d62c7 3f34a9ae be0c543e 3f0e2535 3f6611bc 3ecd162e -> 3e9d62c7 3f34a9ae be0c543e", + "3f000000 3f970892 be5ae028 bdec864d bdc2db48 3f43735f 3f0913ab -> 3f9d1f6c bf1871ba bec4353e", + "3f800000 3e99b25c 3f457854 3f457854 3ea77ba3 3f0507af 3f766f19 -> bcdc9470 3e80e14a be43db14", + "3fc00000 3de27532 3e44fa83 3f97b867 3f48dfcb 3f97a7a0 3e1efd93 -> bf888085 bfcadc20 3f73d1b8", + "bf000000 3f1eaf1c be77063d 3f711796 3e3966b4 3e3966b4 3f1e45dc -> 3f35dbf2 be1a52e4 3fa01d42", + "3e800000 bdb70111 3f49fa49 bdb70111 3f984dce 3f968b7f 3f984dce -> bec60e12 3efd6913 bec60e12", + "3f400000 3f5dc159 3ee6787c 3f5dc159 be535aa8 3e09529d be535aa8 -> 3f82b12d 3eb2f982 3f82b12d", + "40000000 bd657ef5 3f6304a7 3f6304a7 3e800000 3f800000 3f400000 -> bf0e57ef bf8e7dac bf1cfb59", + "00000000 3f76b4bd 3f51c287 be36314e 3f9d0489 3e91d7d1 3e91d7d1 -> 3f76b4bd 3f51c287 be36314e", + "3f000000 3e834a26 bdce70c9 bdce70c9 3f76caf9 3f23d23e 3f319b95 -> be6701a6 bed76e70 bee537c7", + "3f800000 3f931631 be195bcb 3f931631 3e0ec735 3e4630f1 3d3e4164 -> 3f813d4a beafc65e 3f8d2426", + "3fc00000 3f8e11d7 3f8e11d7 3f84f3e1 3f2a8696 be201a94 be201a94 -> 3de2ce68 3fac16d4 3fa2f8de", + "bf000000 3dbbfce3 3f29af73 3e958ba9 be37361c be2daf11 be37361c -> 3b18d8e0 3f13f991 3e4f7c44", + "3e800000 3f481d64 3f629c15 3f481d64 3ea31fe8 3ea31fe8 3dfbd8fc -> 3f33b967 3f4e3818 3f403e9c", + "3f400000 3e273a66 be5d5594 3f9cc823 3f4bc92d 3f4bc92d 3ee10178 -> bede1091 bf502c47 3f652fb9", + "40000000 3eb61303 3eac0533 3f90a137 3ef223d0 3e3af4d2 3e3af4d2 -> bf171a4e bceef9f0 3f43c806", + "00000000 3e579f2f 3c8aa42c 3e579f2f 3cebe757 3cebe757 3f1fc55c -> 3e579f2f 3c8aa42c 3e579f2f", + "3f000000 3f336679 3da39322 3f50ec1f 3dbe1c4b 3dbe1c4b 3f4c6343 -> 3f2784b4 3d0909f9 3ed574fb", + "3f800000 3f23c536 3f65be5c 3f23c536 3f000000 3f800000 00000000 -> 3e0f14d8 bdd20d20 3f23c536", + "3fc00000 3f1f3532 3f23141b 3f1f3532 3e28b2cf 3e997c04 3e997c04 -> 3ebfe448 3e3fdc60 3e3060bc", + "bf000000 3f4eaa58 3f4eaa58 3e624f9e 3f8ec124 3f83430d 3f8ec124 -> 3faeb5be 3fa8f6b2 3f47550c", + "3e800000 3e10cf14 3e10cf14 3f4edc83 3f28e9a7 3f111fb6 3f111fb6 -> bcc0d498 b9a14400 3f2a9496", + "3f400000 3f23edf6 3f23edf6 3ecad32d 3f28b99a bdce6b96 3d1f237a -> 3e158b0a 3f37480c 3ebbe7da", + "40000000 3ead4bf9 3f0ef59e 3ead4bf9 be6b9336 3f672a79 3f672a79 -> 3f4c6f98 bf9fafaa bfbbd77a", + "00000000 3e2a8fd5 3e2a8fd5 3e0b70a2 3d87ceea 3d87ceea 3f6e7fd6 -> 3e2a8fd5 3e2a8fd5 3e0b70a2", + "3f000000 3f4384c8 3e2b7219 3f6c17cb be3d7468 3f97f7a5 3f2dc298 -> 3f5b3355 beda363e 3f15367f", + "3f800000 3e45b609 3f673564 be667da7 3ef87233 3f8e5cd1 3e29a0fe -> be95972e be5610f8 bec80f52", + "3fc00000 be35289e 3e076569 3e076569 3e9c2d0e 3e9c2d0e 3f093f50 -> bf226bf2 bea690e0 bf2c059e", + "bf000000 3f88a68a 3f4e6442 3ee0e83d be70f6fe bd9999d9 3f393eeb -> 3f732e34 3f44caa4 3f4d1394", + "3e800000 3ed01927 3f0780e9 3eab6ab2 3f96e3d7 3f6cba59 3d9b39b8 -> 3de4d540 3e98a4a6 3ea1b716", + "3f400000 3f2530b1 3f1ab40f 3f61051e 3f97ebe1 3e22b7ec 3f5cdd5f -> be7ac484 3ef86326 3e6d7c5c", + "40000000 3e9eac3a 3ea29029 3e9eac3a 00000000 3f800000 3e800000 -> 3e9eac3a bfd75bf6 be42a78c", + "00000000 3f9a0e43 be2454ca be2454ca 3df43d7d 3f176981 3f3d3d41 -> 3f9a0e43 be2454ca be2454ca", + "3f000000 3f0e09c5 3f8f289a 3eef4f28 3f800000 3f000000 3f000000 -> 3d609c50 3f5e5134 3e5e9e50", + "3f800000 3f9c5217 3e6a1ee2 3e6a1ee2 3f400000 3f000000 3f800000 -> 3ef1485c be8af08f bf457848", + "3fc00000 3f755663 3d92a944 3f92f9cf 00000000 3f800000 00000000 -> 3f755663 bfb6d56c 3f92f9cf", + "bf000000 3f74c6a2 3f71ce24 3f71ce24 3f8b0785 3f29ae15 3d85ab9c -> 3fbfe714 3fa35297 3f7a28de", + "3e800000 3f9f3c11 3f71b2a9 3f4cb71e be0aefb7 3f571105 be0aefb7 -> 3fa3938f 3f3bee68 3f55661a", + "3f400000 3f87bbdf be301797 3f98010d 3f000000 00000000 3e800000 -> 3f2f77be be301797 3f80010d", + "40000000 3e8a200c 3d236217 3e8a200c 3f965358 3f4d63d6 3e21c04b -> c0050f56 bfc848c5 bd3d01f8", + "00000000 3f7623eb 3f8c478a 3f8c478a 3f209d87 3e911498 3f8f8be7 -> 3f7623eb 3f8c478a 3f8c478a", + "3f000000 3f9343e1 3f9a773f bdfc035a 3f5a5b48 bd4661e6 be169827 -> 3f395a1e 3f9d90c6 bd4ad666", + "3f800000 3e90277f bb03cf90 3f844d34 3f571ac0 3e7a26ed 3f449ea2 -> bf0f0700 be7c362b 3e87f78c", + "3fc00000 3f4bfd92 3f83dafe 3f8a38a2 3e3c215a be2de301 3ecf1413 -> 3f057111 3fa4758e 3ef2446a", + "bf000000 3f9b2dc2 be6f407e 3f9b2dc2 3d776b98 3f66e136 3f821d6d -> 3f9f0b70 3e5e81ee 3fdc3c78", + "3e800000 3f9062dd bd8e8961 3ed4d80b 3f2ead92 3f3bd6ac 3e597cea -> 3f751a56 be818dae 3eb9a86e", + "3f400000 be6f65f1 3f443365 be6f65f1 3efe2673 3efe2673 3ef51043 -> bf1b27e8 3ec9c9f4 bf17bf96", + "40000000 3f3f5249 3e187754 3f3f5249 3f865521 3ed6209c bdaaff79 -> bfad011e bf3002c7 3f6a1227", + "00000000 3f1e10d3 3e9be4f0 3f1e10d3 3f800000 3e800000 00000000 -> 3f1e10d3 3e9be4f0 3f1e10d3", + "3f000000 3d01b7e5 3d01b7e5 3f13cfdb 3f403640 3eac7217 3e200a82 -> beafff43 be0c041e 3eff9d16", + "3f800000 3f93d8d2 be35aeea 3e999f67 3f8d1447 3f0db2e0 3f52f6db -> 3d589160 bf3b1e9a bf062728", + "3fc00000 3f9d45ae 3f5eb329 3f9d45ae 3e1200a4 3eb6592f 3eb6592f -> 3f81e590 3eabe08e 3f31c878", + "bf000000 3f155021 3f155021 3e7328bc 3e06644b 3f3e45d5 3e06644b -> 3f261caa 3f74730c 3e9b2d71", + "3e800000 3f372016 3f924031 3f31bd56 bc75be84 3f86eb05 3ed04688 -> 3f3815d4 3f610ae0 3f17b485", + "3f400000 3d05d278 3f9b7dfe 3eaf6a32 3f93472b 3f483b4b 3f95f4d4 -> bf548d98 3f20cf84 bf093a25", + "40000000 3f9d455f 3f60ad09 3edf821c 3f4abb2c 3f590e69 3c935dcf -> beb5d734 bf516fc9 3ecd1662", + "00000000 3f4d1b60 3ea101d5 3f703be8 3f81e4c5 3f7ae390 3f09530b -> 3f4d1b60 3ea101d5 3f703be8", + "3f000000 3d5a1b85 3f63330f 3f6e6007 00000000 3f400000 3f000000 -> 3d5a1b85 3f03330f 3f2e6007", + "3f800000 3e682498 3f694ded 3f203b1f 3e7c9126 bd9deadc bd9deadc -> bca36470 3f7d0b48 3f33f87a", + "3fc00000 3d339c45 3df5a0a6 3f918786 be4af6b4 bd74fd15 be4af6b4 -> 3eaeac90 3e56af3a 3fb795c7", + "bf000000 3e2fd405 3f9cc1a9 bd49d1a6 3f666666 3f666666 3f666666 -> 3f1f2834 3fd65b42 3ecd2c31", + "3e800000 3f12fcbd 3e329213 3f901caf bd8d8842 3ec7f576 bd8d8842 -> 3f1768ff 3d9d2eb0 3f9252d0", + "3f400000 3dc58ca4 3f477664 3efe7396 3f75a870 3eb78c7d 3f7a0341 -> bf1f8cc0 3f02a1b5 be712298", + "40000000 3f705b18 3f9c8d8c 3f9c8d8c 3e800000 3e800000 3e800000 -> 3ee0b630 3f391b18 3f391b18", + "00000000 3d4bcda9 3f9e0033 3f91f82d 3e6b940c 3ea6ca56 bda924a2 -> 3d4bcda9 3f9e0033 3f91f82d", + "3f000000 3f6187a4 3f6187a4 3f96d6f9 3f3c9ae1 3de2b8ab 3f6ea6b1 -> 3f033a34 3f535c1a 3f365a9a", + "3f800000 3f10d7c6 3f466200 3e860f25 3f9aa081 3f5d3e49 3f779d9c -> bf24693c bdb6e248 bf34960a", + "3fc00000 3f87cec1 be752058 3f968ba8 3f8fe3f9 3f8027a2 3f8fe3f9 -> bf200e6a bfdedf7e bf02949c", + "bf000000 3eee6922 3eee6922 3f161fcc 3e55787d 3f81b246 3eabd5e1 -> 3f11e3a0 3f78e6d7 3f411544", + "3e800000 3f43038b 3f05e4bd 3f780791 3f99f2c8 3f4c31d6 be33b165 -> 3eec144e 3ea5b08f 3f81a154", + "3f400000 be5b6fb0 3e00928c 3f85fb0c 3aaf2f3b bdce4c58 3e6504be -> be5c7676 3e4def2d 3f610534", + "40000000 3f1f04bc 3e1ee1f8 3e2ba9cc 3e800000 3f400000 3f000000 -> 3df825e0 bfac23c1 bf55158d", + "00000000 3d936bd8 3f2bb07a 3d936bd8 3f165236 3ee535b7 bc85a50c -> 3d936bd8 3f2bb07a 3d936bd8", + "3f000000 be268915 3e1d670c 3f0a7959 3f400000 00000000 3f000000 -> bf09a245 3e1d670c 3e94f2b2", + "3f800000 3ec53b57 3f057f06 3f057f06 be6031a6 3da29e58 3da29e58 -> 3f1aaa15 3ee25676 3ee25676", + "3fc00000 3f86b911 3f39ce57 3de1d147 3e800000 3f800000 3f800000 -> 3f2d7222 bf4631a9 bfb1e2ec", + "bf000000 3f912061 3f3887ac 3f912061 3ef9fc86 3ef9fc86 bd408dd4 -> 3fb05ff2 3f7706ce 3f8e1e2a", + "3e800000 3f1a22ca 3e98df6a 3f1a22ca 3f800000 3f800000 3f400000 -> 3eb44594 3d46fb50 3ed44594", + "3f400000 3f9b68b2 3dbc36e6 bdce2efc 3d32b37f 3f85c6d3 3f83097e -> 3f97387d bf31235f bf5e541c", + "40000000 be718556 3f94429e 3f35c8c0 3f400000 3f000000 00000000 -> bfde30ab 3e2214f0 3f35c8c0", + "00000000 3eacd4a9 3eefcb2a be583e02 3f0e590b 3e0d4248 3e0d4248 -> 3eacd4a9 3eefcb2a be583e02", + "3f000000 be7d44d4 3f0feeb0 3f280f3f 3e34ddb5 3f7da7d7 3b1f84a8 -> beabd9d7 3d88d624 3f27bf7c", + "3f800000 3e0c8467 3ea6687d 3e928ad9 3f2513a8 3f2513a8 3f88867a -> bf01f28e bea3bed3 bf47c788", + "3fc00000 3f96b1f2 3da8df6d 3f96b1f2 be0ecda5 3f429a8a 3f495361 -> 3fb17882 bf8765f1 bb192e00", + "bf000000 3f57a391 bd3c20ee 3ed9ffe8 3f400000 3f800000 00000000 -> 3f9bd1c8 3ee87be1 3ed9ffe8", + "3e800000 3eec5496 bcd58fae 3eec5496 3f0573da 3f9e7df0 3ec0ed2d -> 3ea99aa9 beabd6eb 3ebc194b", + "3f400000 3f86468c 3dcd4fac 3dcd4fac 3f400f96 3f9f0189 bd8f4867 -> 3ef902d0 bf54d858 3e1c62fd", + "40000000 3f803be5 3f6415e1 bd82f4c3 3f00f41b 3f7de89a 3f3b441a -> bbb83600 bf8bddaa bfc37366", + "00000000 3ef01594 3f2e2e0e 3f2e2e0e 3f003903 3f9e38f3 3f9e38f3 -> 3ef01594 3f2e2e0e 3f2e2e0e", + "3f000000 3eee2742 3f73dcd7 3f73dcd7 be4485cc 3ea058bf 3ea058bf -> 3f0fa45a 3f4bc6a8 3f4bc6a8", + "3f800000 3f6f4aa7 3f946c01 3f78a5f0 3f0e6f0a 3f8e3716 3e807ace -> 3ec1b73a 3d469d60 3f386889", + "3fc00000 3f6b2824 be5f3153 3f60c9e7 3f3b3754 bb324ea3 3ed1ce34 -> be36ab68 be5b037a 3e86de80", + "bf000000 3f7abd19 be6cd980 3f7abd19 bd8b5146 bd8b5146 3f267666 -> 3f720804 be87d6e9 3fa6fc26", + "3e800000 be2d4adc 3ef4338a be2d4adc 00000000 3f400000 3f400000 -> be2d4adc 3e94338a beb6a56e", + "3f400000 3f865de3 bdc3942b bdc3942b 3f9d8e48 3e8a110f 3f9d8e48 -> 3e019968 be9871d6 bf8263f9", + "40000000 3de546be 3f41d9c6 3f2302aa bcc79b4d be57596e 3edf7e2f -> 3e248a33 3f96c33f be71ee14", + "00000000 3f6b3184 39ff5329 3f6b3184 3f9b0d88 be31d26d be31d26d -> 3f6b3184 39ff5329 3f6b3184", + "3f000000 bc2833e1 bc2833e1 3d708029 3ebf8db0 3ebf8db0 3e3ceca3 -> be4a10ee be4a10ee bd09591d", + "3f800000 3f52f871 3f91ec15 3f91ec15 3b13c2b6 3b13c2b6 3eea31c8 -> 3f5264ae 3f91a234 3f2ebf46", + "3fc00000 3dd8996e 3ec7eda2 3dd8996e 3e730634 3e730634 be380258 -> be801e4c 3d0d47d8 3ec0281e", + "bf000000 3f8a792a 3f48ea54 3f8767d2 3f4a3060 bd66b975 3f5528a9 -> 3fbd0542 3f41b488 3fbcb1fc", + "3e800000 bd475e9b 3f3803d2 3f3803d2 3e1fd1ad 3e1fd1ad 3ed361e6 -> bdb39824 3f2e06b7 3f1d9795", + "3f400000 3f92705a 3e9feeee 3f9339bf 3e8eecec be07f66e be07f66e -> 3f6f47dc 3ed2eb57 3f9ff8da", + "40000000 3f99d6fa 3f2ce2b9 3f2ce2b9 3ecc0b04 3ecc0b04 3f6a5d97 -> 3ecf45e0 bdf94258 bf93ec3a", + "00000000 3ecebbf0 3dba8402 3dba8402 3e274a98 3f0f0a73 3f0f0a73 -> 3ecebbf0 3dba8402 3dba8402", + "3f000000 3eb72254 3edf8d1c 3eb72254 3f246581 3f9e6924 3e702c68 -> 3d15e698 be3a8a58 3e762e74", + "3f800000 3ed8438b 3f1cc989 3ed8438b 3f599b21 bd42221b be57f3f8 -> bedaf2b7 3f28ebab 3f221ec4", + "3fc00000 3ec8e0b1 3ee41f93 3ee41f93 3f76d0f3 3f76d0f3 3f074c50 -> bf86e48a bf8014d2 beb1c55d", + "bf000000 3f3a46a3 3ead7074 3f3a46a3 3f000000 3e800000 3f000000 -> 3f7a46a3 3eed7074 3f7a46a3", + "3e800000 3f9ed20b 3eda8fe6 3eda8fe6 3f98bb3a 3e5765d4 3f680b3d -> 3f714679 3ebfa32c 3e4d148f", + "3f400000 3e5ff008 3e5ff008 3f2c9bc6 3f4f3577 3e8fcd60 3e8fcd60 -> bec6d82e 3c03bf80 3eed5d84", + "40000000 bdbd416b 3f713cf2 bdbd416b 3f9c36d1 3f8b44bf 3f009c99 -> c02220dc bf9deb05 bf8c70b0", + "00000000 3f1f472c 3d778de7 3f472ed3 3f8de91d 3f8de91d 3ea94c80 -> 3f1f472c 3d778de7 3f472ed3", + "3f000000 3f95fe5b 3d4bf993 3d4bf993 3f8cfd68 3dc330c2 3dc330c2 -> 3f1eff4e 3b0c8d10 3b0c8d10", + "3f800000 3d047336 3efc7527 3d047336 3f82f1f5 3d9cb768 3f82f1f5 -> bf7d9cb7 3ed5474d bf7d9cb7", + "3fc00000 3e302168 3ef302e7 3ef302e7 3deffa8d 3f476beb 3f2d5aa5 -> bb76a080 bf31a06c bf0a8684", + "bf000000 3f9b9922 3f9b9922 be320e42 3f000000 3f000000 3f800000 -> 3fbb9922 3fbb9922 3ea6f8df", + "3e800000 3ec49d50 3ec49d50 3f853a7f 3dfbfc29 3f024104 bd766f25 -> 3eb4dd8e 3e837cce 3f87275d", + "3f400000 3f8e2cfe 3f8e2cfe 3e98024e 3eaf0402 3eaf0402 3f618808 -> 3f5ab87b 3f5ab87b beba49be", + "40000000 3ebbb2e9 3f1d2910 3f1d2910 3e91ce51 3e91ce51 3f469280 -> be4fd372 3d35abf0 bf6ffbf0", + "00000000 3df971c8 3e3591e9 3f21861b 3ea7ab67 3ea7ab67 3f2805f3 -> 3df971c8 3e3591e9 3f21861b", + "3f000000 3f1ba4bf 3ecea849 3f2d9e91 3f915da9 3f217d78 3f915da9 -> 3d247160 3db4ab44 3de20740", + "3f800000 3f7a590f 3f7a590f 3e65b515 3c221382 3f8ab892 3f8ab892 -> 3f77d0c1 bdd8c0a8 bf5c03df", + "3fc00000 bd088dfb 3da864a7 3d0174ab 3f95ef0f 3ee8ae64 3e053281 -> bfe52b06 bf197636 be276e97", + "bf000000 3f1382c6 be53fe0c 3f2a8f56 bdbd2e4f 3edeb194 3f8dabd3 -> 3f07afe1 3c2b3880 3f9c1d94", + "3e800000 3e66aae8 3dc92354 3dc92354 3dc1f22d be3664d4 bc3be951 -> 3e4e6ca2 3e122adf 3dcf029e", + "3f400000 3dae10a6 3f5963de 3dae10a6 3f6d85be 3f24f963 3f5ae336 -> bf1c6239 3ebb51a8 bf0e6853", + "40000000 3f87be2d 3f31e9df 3f199dd6 3f40f4f4 3f923fcf 3f40f4f4 -> bee4db1c bfcb8aae bf684c12", + "00000000 3f4f6b55 3f1eecae be379cd8 bd5bae21 ba934d5f bd5bae21 -> 3f4f6b55 3f1eecae be379cd8", + "3f000000 3f838d04 3ef4cce4 3f477491 3f000000 3f400000 3f400000 -> 3f471a08 3dd33390 3ecee922", + "3f800000 3f96d127 3ef1bed5 3f6a5bd2 3e0c3d3f 3f8cd436 3d14251b -> 3f85497f bf20c902 3f611980", + "3fc00000 3ea0d522 bc44bc6b 3f83b3e9 bdf52d80 3e68f3a1 bdf52d80 -> 3efcc632 beb4dc9c 3f9ab02d", + "bf000000 3f2cbe00 3f5e4852 3e917197 3f44019b 3f92ad83 3f1a970d -> 3f875f67 3fb87aea 3f160452", + "3e800000 3ef1ef4a 3f626564 3f8ded9a 3e800000 3f400000 3e800000 -> 3ed1ef4a 3f326564 3f85ed9a", + "3f400000 3ea24ea6 3ecad59f 3ecad59f 3f02055b 3ebcbe3f 3e528b3c -> bd82e588 3df51bc0 3e77c2d1", + "40000000 3f49aa07 3f4fb51f 3ecf7266 be239691 3f7e5f96 3e2f36f9 -> 3f8dbaa8 bf968506 3d80edb4", + "00000000 3eded326 3ede33db 3df01fcd bd9813c5 bd9813c5 3f6c9d30 -> 3eded326 3ede33db 3df01fcd", + "3f000000 3f67aa1b be3ac1cf be3ac1cf 3f1f86ff 3f85b5ab 3f85b5ab -> 3f17e69c bf34661f bf34661f", + "3f800000 3f4d1ffc 3ee8934d 3f4d1ffc 3f12d346 be093f22 3f12d346 -> 3e6932d8 3f16996f 3e6932d8", + "3fc00000 3ef7eb06 3ef7eb06 3eb0836c 3e800000 00000000 3f800000 -> 3ddfac18 3ef7eb06 bf93df25", + "bf000000 3f61a32e 3f729a1f 3e609c2f 3f541ca6 3f107ba0 3f541ca6 -> 3fa5d8c0 3f9d6bf8 3f22355f", + "3e800000 3f0cee3e 3e372052 3e196128 3d49fcd9 3d49fcd9 be146d48 -> 3f09c64a 3e2a8084 3e3e7c7a", + "3f400000 3e119fbd 3ec40186 3e119fbd 3ea4f298 3f115a78 3e2bd435 -> bdcb984e bd303170 3c8604a8", + "40000000 3f264def 3efdda65 3eed66ce 3e385fc5 3f84f211 3e201a07 -> 3e943c1a bfca6d89 3e1a998c", + "00000000 3f358b90 3f4ebc56 3e1d68ae 3d3a8693 3f21a5eb 3f92e497 -> 3f358b90 3f4ebc56 3e1d68ae", + "3f000000 bd7632e1 bd7632e1 3e3a8a57 3f9ebbbc 3cf5cad5 be09d0b8 -> bf2e1eea bd99d2cb 3e7f72b4", + "3f800000 3e1413d8 3e1413d8 3f1f4196 3ec34c36 3f302ba1 3f302ba1 -> be728494 bf0b26ab bd875058", + "3fc00000 3f8f88ae 3ee6d731 3ee6d731 3f000000 3e800000 00000000 -> 3ebe22b8 3d9b5cc4 3ee6d731", + "bf000000 3f90452e 3f980665 3f90452e 3f400000 3f800000 3e800000 -> 3fc0452e 3fd80665 3fa0452e", + "3e800000 3e55d4fe 3f41cfa1 3f41cfa1 3e800000 3f000000 3e800000 -> 3e15d4fe 3f21cfa1 3f31cfa1", + "3f400000 3f3192fa 3f1dc47b 3f1dc47b 3e5e77a7 3e134b20 3f677ba9 -> 3f07dc8a 3f022665 bd7d8440", + "40000000 3f184da6 3e7f68e9 3f184da6 3f73ce14 3e3b2457 3f1202b3 -> bfa7a741 bdedbf8a bf0bb7c0", + "00000000 3f64c0a9 bd2d0e45 3f64c0a9 be467a61 3e6e2d1a 3e1920e0 -> 3f64c0a9 bd2d0e45 3f64c0a9", + "3f000000 3f9b2b55 be5b9900 3e8f27b3 3ee815f5 bdd8c4c9 3f350b87 -> 3f7c512d be2567ce bd978f50", + "3f800000 3dacf2eb 3f06f4be 3ceaa4f9 be800000 be800000 be800000 -> 3eab3cbb 3f46f4be 3e8eaa50", + "3fc00000 3f8b7676 3f20a5c4 3f8b7676 be6c9515 be32409b be513554 -> 3fb7d26a 3f637dfe 3fb2b075", + "bf000000 3dfe0530 3dfe0530 3f67ce6d 3f8d1bfc 3db36c07 be484a1c -> 3f2cdca2 3e2bdd9a 3f4ec52a", + "3e800000 3ecd5277 3f04b6d6 3d2dc96a 3f8532e2 3e04d24e 3d0b411c -> 3e103f2a 3ef8d362 3d0af923", + "3f400000 3c916047 3f7d8ff7 3f979e98 3e8e258f 3df20a88 3f652330 -> be430c4d 3f66defa 3f0362cc", + "40000000 3f93a572 3cf568f8 3f6b10e7 3f0c27ee 3f20924f 3e10136a -> 3d6fb080 bf9cbcab 3f230731", + "00000000 3f9719b9 3f80d815 3e1d7ea6 bd9f2ba6 3f094c92 3f04b0ab -> 3f9719b9 3f80d815 3e1d7ea6", + "3f000000 3d9e9ca2 be2bf815 3f6ab825 3db2848a 3db2848a 3f2b786e -> 3d0ab4ba be589938 3f14fbee", + "3f800000 3ea93071 bd55d945 3ecfe3a1 3f2a562f 3f433e1a 3f2a562f -> beab7bed bf509bae be84c8bd", + "3fc00000 3eb611c5 3eb611c5 3f5d0a19 3f98ded1 3ef9719f 3ef9719f -> bfb7c9c9 bec018a9 3e07d388", + "bf000000 3f23c847 bb42fdca 3f23c847 3f000000 3f800000 3e800000 -> 3f63c847 3efe7a04 3f43c847", + "3e800000 3f8e5d75 3f8e5d75 3ededa4a 3f400000 3e800000 3f000000 -> 3f6cbaea 3f865d75 3e9eda4a", + "3f400000 3f008101 3f3a5211 3f95e2d2 3ec86a5c 3e98be2f 3e98be2f -> 3e55647a 3f010ac0 3f727e52", + "40000000 3f81d2c2 3f7b4770 3f7b4770 bdf89cd0 bdf89cd0 3e9a5e26 -> 3fa0e65c 3f9cb752 3ec1d294", + "00000000 3f9db8bb 3edd75c5 3edd75c5 3f000000 00000000 3f800000 -> 3f9db8bb 3edd75c5 3edd75c5", + "3f000000 3f865678 3d0a8100 3f9af0b6 3f1d0986 3f1d0986 3f266a2f -> 3f3e282d be8bb966 3f62ac54", + "3f800000 3f930fb4 3f31bd08 3f930fb4 3c75285c 3f80c614 3c75285c -> 3f912563 be9f9e40 3f912563", + "3fc00000 3f208659 3f2d6752 3dc92df1 3e4bb0ac 3f509dbb 3f509dbb -> 3ea84831 bf0b8546 bf8fe36d", + "bf000000 3f024e00 3e96a901 3f024e00 3e84ffac bd01b1a1 3ed2bb4a -> 3f238deb 3e8e8de7 3f36fcd2", + "3e800000 bdd01eae 3f2ae231 3f7460fc 3f459e1e 3f59189a 3e90eac2 -> be96d6ba 3ee93815 3f6243a4", + "3f400000 3cd2e1dd 3f1fae96 3e71eabb 3f927544 3f927544 bdeec13b -> bf5518d7 be700540 3ea5b998", + "40000000 3f4bec51 3f9b7c49 3f53a68f 3f393131 3e095950 3ee0fddc -> bf267611 3f724bea bd5574d0", + "00000000 3f7b3c80 3e657201 be6962f9 3f9db24c bdc9f9c6 be422590 -> 3f7b3c80 3e657201 be6962f9", + "3f000000 be39b402 be39b402 3ef7689d 3f8c7f6f 3f6a6c38 3f8c7f6f -> bf3aec70 bf23a31c bd865904", + "3f800000 3f5e0169 3ee8bbe6 3f6d9e27 3e3f58eb 3f924d0a 3e3f58eb -> 3f2e2b2e bf303c21 3f3dc7ec", + "3fc00000 be1aa6d2 3f228542 3f8ef780 3f89c521 3f0972c5 3f89c521 -> bfe1fc8c be2e9b98 befec0c8", + "bf000000 3f43143a bd278b47 3f838c4e 3f2c13d6 bdc42858 bdc42858 -> 3f8c8f12 bdb5d9d0 3f7ad616", + "3e800000 3f95e257 3f6d9436 3f35f68d be72d71c 3f7dac6a 3f50d697 -> 3f9d7910 3f2e291c 3f01c0e7", + "3f400000 3f961cd2 3f4a3986 3f4383fa 3f1670cc 3f1670cc 3f74315b -> 3f3b650b 3eb2c9da 3d45ef60", + "40000000 3eae2491 3e8818fa 3eae2491 3c788936 3f5d42f2 be35bb72 -> 3e9e9bfd bfbb3cb4 3f31f002", + "00000000 3f8d9614 3e48d5d3 3f46ee8e bd241786 be11ba93 3e91c19e -> 3f8d9614 3e48d5d3 3f46ee8e", + "3f000000 3cc9cc24 3e512538 3f62fc9b 3f8c3a57 3ed6a5d8 3e79b813 -> bf05ebf6 bbb01400 3f43c598", + "3f800000 3f59b4b7 3ec2b4a6 3f25cfaa 3f5008ff 3efd9f32 3f93da5a -> 3d1abb80 bdebaa30 bf01e50a", + "3fc00000 3f8d0094 3f8d0094 3e032897 3e800000 00000000 3f400000 -> 3f3a0128 3f8d0094 bf7f35da", + "bf000000 3e1974c3 3f7a964c 3f301d31 be2fd28e 3f2f33b5 3f2f33b5 -> 3d8316f9 3fa91813 3f83db86", + "3e800000 3f848c0c 3e4da7ce 3d878512 3f679ca9 3f7c1d04 3f679ca9 -> 3f4f30ee bd39d4d8 be23da20", + "3f400000 3ec7ea05 3f8d09aa 3ec7ea05 3dc9353e 3f664d33 3f664d33 -> 3ea2300a 3edab2dc be9189c7", + "40000000 3ee48dac 3ee48dac 3f0c6d36 3f5650eb 3ea0d8e2 3f5650eb -> bf9d2d80 be3a4830 bf901a50", + "00000000 3f2a7285 3ed60cec 3ed60cec 3f9b5eb8 3f5cdea7 3f395c55 -> 3f2a7285 3ed60cec 3ed60cec", + "3f000000 3f6f1f7e bdfc6191 3f8cef0a 3f882abc 3f13b455 3e8442b2 -> 3ecde984 bed2ccb9 3f78cd68", + "3f800000 3f1760aa be57b172 3f089e3f 3e6659fd 3f548b33 3f714271 -> 3ebb9456 bf853bc8 bed14864", + "3fc00000 3ecf67d1 3f7baf16 be7f675b 3b252d76 3f7be0bb 3f2551fc -> 3ecd7848 befc4404 bf9bea68", + "bf000000 3f36ed13 3e9e64e7 bcf48831 3e924123 bdeacaf5 3f84a114 -> 3f5b7d5c 3e810b88 3ef9f9a5", + "3e800000 3f394629 3e228b4e 3eaf5e9e 3e1309e2 3e1309e2 3f7c645c -> 3f30158b 3dfb91ab 3dc4b1c0", + "3f400000 be688a48 3ce45ccb 3e6d9f59 be33bb38 3f458a8d 3f458a8d -> bdc37bbc bf0d0504 beb18028", + "40000000 be5b5d45 3f29d76a 3f29d76a 3f2c17c1 3f2c17c1 3f4f2146 -> bfc7836a bf2e5818 bf746b22", + "00000000 3f8ee790 3f9efb62 3ef7658c 3e38ca0d 3f16a535 3f87159c -> 3f8ee790 3f9efb62 3ef7658c", + "3f000000 3f89b632 3f5f2220 3f5f2220 3de62ca2 3eb40c1b 3de62ca2 -> 3f8284cd 3f321f19 3f50bf56", + "3f800000 3eb9d1db bcfe07a1 3eb9d1db 3f6f2649 be4ce379 be4ce379 -> bf123d5c 3e2d2285 3f1021cc", + "3fc00000 3ea24956 3f7ac19b 3f507e72 3f82f724 3d995188 3d995188 -> bf9be060 3f5e0252 3f33bf28", + "bf000000 3ee54e36 3f6bd38e 3f6089a5 3f271d2b 3f5aa11b 3f4e8dfa -> 3f4635b0 3fac920e 3fa3e851", + "3e800000 3f4314e5 3f4122c0 3f7b0cc3 be110c0d 3f0a2e7c 3ea13b7f -> 3f4c25a6 3f1e9721 3f66e553", + "3f400000 3ecb35d1 bd8339c9 3f1add41 3f400000 00000000 3e800000 -> be29945e bd8339c9 3ed5ba82", + "40000000 3f80e611 3e0de38e 3e0de38e bda3170f 3e8797b4 3ec47f27 -> 3f9548f3 bec83da1 bf210644", + "00000000 3e587679 3f209e45 3e587679 3f800000 00000000 00000000 -> 3e587679 3f209e45 3e587679", + "3f000000 3f25d723 be1f1195 3f25d723 3f000000 3f800000 3f800000 -> 3ecbae46 bf27c465 3e175c8c", + "3f800000 3e9440e7 3e9440e7 3e8f7a5e 3e800000 3f000000 3f800000 -> 3d220738 be577e32 bf3842d1", + "3fc00000 3efa0c92 3f0ac1b3 3dc6bcd0 3f88f672 3f5cceec 3f5a0eb3 -> bf8eee86 bf4074af bf971f39", + "bf000000 bc801758 3eafcd69 3e80f282 3ef2914a 3f575bdc 3f575bdc -> 3e628e5f 3f4394a2 3f2c272f", + "3e800000 3ec66f0f 3e4b2026 3f80d6e4 3f89ff04 3f3aa96f 3f3aa96f -> 3df1c02c 3c83b5b0 3f53036c", + "3f400000 bda237a5 3f3206ea be3c0d6c 3ebee23c bdc54472 bd041abf -> beb7b796 3f448554 be234868", + "40000000 3f8933e6 3f2d48de 3e928435 be645bca be5615cc 3f9a266b -> 3fc24ad8 3f8c29e2 c007d5e4", + "00000000 3eb801e3 3e0b5a0d 3e0b5a0d bc6f932b 3f08ea85 3f9ed4c4 -> 3eb801e3 3e0b5a0d 3e0b5a0d", + "3f000000 3ebb9295 3f0b2a0e 3ebb9295 3f90fbfa 3f863cef 3f06cc9d -> be4ccabe 3c9da3e0 3dd317e0", + "3f800000 3f40a566 3f92e348 3d9e0c29 3f9ce2eb 3dc60f39 3f9ce2eb -> bef240e0 3f868254 bf930228", + "3fc00000 3f5c38da be1e2cee 3f5c38da 3db459ad 3f688e2f 3e59ea0e -> 3f3a6809 bfc23040 3f0a8114", + "bf000000 3ee81499 3f0c2d87 3f0c2d87 3e800000 3f400000 3f400000 -> 3f140a4c 3f6c2d87 3f6c2d87", + "3e800000 be13b7a0 3f2619e0 be13b7a0 3f800000 3f000000 3e800000 -> bec9dbd0 3f0619e0 be53b7a0", + "3f400000 3f6ec6b8 3f81430d 3dbefe35 3f9af269 3f9af269 3f87eceb -> 3ccb6340 3dd0d3e0 bf340399", + "40000000 3e1d6019 be7cabac 3f952ca8 3eeddcea be620b56 3eb2e1d5 -> bf4684e4 3e476b00 3eeeeef8", + "00000000 3eeca452 3f82b61e 3eec612e 3cefd3b7 3f762de9 bc0a0a81 -> 3eeca452 3f82b61e 3eec612e", + "3f000000 3c205a37 3c205a37 bdfa84c4 3ef2ad68 bcb43553 be14a404 -> be68a7c5 3caa47c4 bd4bc180", + "3f800000 3f0f7f81 3ed543aa 3f56597f 3e6e21ca 3ee04618 3e6e21ca -> 3ea7ee1d bcb026e0 3f1ad10c", + "3fc00000 3ed285d9 3f95d97e 3d8a79e0 bd2eb2ea 3e52ee53 3e52ee53 -> 3ef34764 3f5c999c be77288c", + "bf000000 bdd55aa3 be3c14bd 3f30f092 be72a873 3e9bfa0a 3e9bfa0a -> be64018c bd006acc 3f57ef14", + "3e800000 3cc7eaa2 3f3845cb 3f97d07f 3f0e6874 3f0e6874 3f8bf8cf -> bdead640 3f14abae 3f69a496", + "3f400000 3eae9530 3f88eabb 3eae9530 3eca9de8 3e02e74d 3edd5907 -> 3d34f610 3f794a18 3c8926b0", + "40000000 3e90e51f 3f800302 3de36f17 3e800000 3e800000 00000000 -> be5e35c2 3f000604 3de36f17", + "00000000 3f9bd098 3ef901f7 3e28f5d3 3e773825 3f50044c 3e773825 -> 3f9bd098 3ef901f7 3e28f5d3", + "3f000000 3f50f18b 3ef74a7d 3f50f18b 00000000 3f000000 00000000 -> 3f50f18b 3e6e94fa 3f50f18b", + "3f800000 3d5070e6 3e15e03b 3d5070e6 bc85c3cc bc85c3cc 3f11c411 -> 3d89a966 3e2698b4 bf04bd03", + "3fc00000 3ebd11bc 3f49d21c 3f49d21c bdd532fe 3f59159a 3f59159a -> 3f06826e bef79c98 bef79c98", + "bf000000 3e01962d 3e01962d 3f22622d 3eadaac7 3f851110 3f2ddaef -> 3e97a07a 3f25769b 3f794fa4", + "3e800000 bd5d89db 3ec58202 3eb46449 3e165fd3 3e5e7b7a 3f8c37f3 -> bdb9f4d7 3ea9b293 3da0b158", + "3f400000 3b28f1e4 3f8bc6cb 3b28f1e4 3f9910e0 3e8a3729 3f9910e0 -> bf64f05e 3f63b8e7 bf64f05e", + "40000000 3f6acefc 3e87655b 3f6acefc 3f3563ba be16285b 3f339020 -> befff0f0 3f0ec6da bef8a288", + "3fb3c94c 3f8b1439 3f8e1708 3e411863 3f33a8ec 3f69a7c3 3f69a7c3 -> 3dce7d70 be3007f8 bf8bf4fb", + "3f167508 3f41197a 3f41197a 3f72d238 3f8413d5 3f4bfb95 3eb0a96b -> 3e1765e8 3e926da1 3f3ee834", + "3f5dd800 3e0d1551 3e0d1551 bda4487a bdd4dc8b 3f0614bf be12ce84 -> 3e695050 bea1d76c 3d344fa4", + "3e3ad30d 3e965a77 3ed37e0b 3ed37e0b 3f7765fe be7a67bd 3f97fc81 -> 3df051bc 3eea55c5 3e492691", + "3fbb16c3 3f5c862f 3f4467a4 3f5c862f be31f63f 3edda4e1 3edda4e1 -> 3f8ec6c4 3e09b1fc 3e6a2c28", + "3f9fbe56 3f546af1 3f04083a 3f04083a 3ee89645 3f9e55cb 3f30967a -> 3e86915c bf8395e7 beb0b290", + "bef8c03b 3f347c07 3f347c07 bded28fc bda2dd67 ba5fb366 3f8668ae -> 3f2a97fa 3f3460db 3ec9ea6d", + "3fb364e0 3f415471 3ed39160 3f0db41c be77cf20 3f87b451 3f7b5b90 -> 3f8c1417 bf894cc4 bf529406", + "3ee88c2d 3f3793ab 3f9b7eaf 3f4ff284 3f2d27db 3f7511a0 3ed34a73 -> 3ed1dc67 3f47ae49 3f1ff6ba", + "3f21bf02 3f344295 3f1d4e97 3f50362b 3f7d0a9d 3f041417 3f7d0a9d -> 3da310d8 3e93b6d1 3e4156c4", + "3f1d7fba 3f924f7e 3f1599f7 bd762c3b 3f0abd2d 3f9ddbeb 3ebc16b0 -> 3f4f43bf be328d34 be927d49", + "3f25b428 3f26337f 3f9625ef 3ef2472c 3f800000 3e800000 3f400000 -> 3afeae00 3f816f6a bc48e200", + "3f595a0f be68f4d3 be11cfc4 3e718e46 3e89cc9b 3f86066b 3e518f11 -> bee97952 bf840490 3d7e8920", + "3f07dba7 3f8b9ca3 3e05e2f0 3f27cab8 3f000000 3f800000 3f400000 -> 3f534b72 beccc5d6 3e83cbf6", + "3f90050b bd6ebce4 bdc427e4 bd6ebce4 3ec36cf2 3f924806 3efe7f69 -> bef9b9e0 bfb0d948 bf1e187d", + "bee79fcb 3dd1a64c be40863e 3dd1a64c 3f077c37 3f81e0cc 3f077c37 -> 3eaeff3a 3e8ac2b4 3eaeff3a", + "3a436515 3d42f125 3d42f125 3e085e79 be767efd be298cf5 3eb3cd99 -> 3d43ad49 3d43728e 3e0819db", + "3f9d4eba 3e8c9fb7 3e8c9fb7 3f4175a8 3da3096a 3f558798 3f88a358 -> 3e351084 bf401bca bf0e6320", + "3f433ac7 3e523428 3f6610d0 3f1f9747 3f911321 3f911321 3f14a78c -> bf28b8b8 3d0cb0e0 3e38e618", + "3f295ba5 3e200e1b 3f8d79d6 3e3c9f63 3f2aaaab 3f2aaaab 3f2aaaab -> be91c87a 3f2a0be8 be837fd6", + "3d24b529 3dd522cf 3eae0a58 3f82e91e 3f7ecb7d 3f89a6fb 3f7ecb7d -> 3d832b7a 3e97e640 3f7b9351", + "3d68deed 3f9348aa 3f14f9d3 3f9348aa 3f4259e3 3f6b3539 3cc3206d -> 3f8dc254 3f079a82 3f931c4a", + "bd90c58b 3e7e1a05 3f01bb96 bbb95d66 3c0d6cb8 be5ccd50 3e62a820 -> 3e7eb9fa 3efba94e 3c23ac3d", + "3f3a40a3 3e8f56d3 3e8f56d3 3f758db3 3ec02973 3ec02973 3f45eece -> 3be20c40 3be20c40 3ecb1870", + "be46b595 3f6661ed 3da6e60f 3f566a61 3f514a71 3f8ce487 3f8ce487 -> 3f877f77 3e971634 3f868c5c", + "3fb46a32 3eee317e 3cf5021b 3e892277 3f06b969 3f06b969 3f102ea0 -> be8d9786 bf363c71 bf06a7f4", + "bec45b64 3f8aed47 3f2dcec9 3f8aed47 3f80164b 3f80164b be554397 -> 3fbc0cad 3f8806ca 3f80b409", + "3d1cd043 3e262959 3f90a859 3e262959 3e800000 3f400000 3f800000 -> 3e1c5c55 3f8cfb77 3dfdea90", + "3f0df721 3f1875e6 3e0ba070 3e6f9af5 3e7a663b 3ec20651 3e7a663b -> 3eeb7dc8 bd97223e 3dc97ddc", + "3eb1a474 3e63805f 3e926531 bdfcadd1 3eecf256 3f48aaa8 bdbc8a0a -> 3d7c526c 3c64c960 bdbb438a", + "3f075408 3eb8510e 3f2c4309 3f520950 3f6a06be 3f4214ff 3f0bf7f9 -> bdfc6ec4 3e8b5483 3f080b9a", + "bec7c4cd 3eac7c20 3d4477c6 3ebeb28f be245589 3d4b2368 3c4cbc09 -> 3e8c6cec 3d89dd0f 3ec1319d", + "3f552b37 3ea90279 3f230847 3ea90279 3f1faa96 be0c6a65 3f6c373e -> be41ca9a 3f404355 bee06135", + "3f9e4c17 3f92b7b1 3f7de7b1 3f92b7b1 bd1f4cc1 3f3f1dfb bd1f4cc1 -> 3f98dfbc 3d8c6898 3f98dfbc", + "3f4d131f 3f94b894 3f98d7fd 3f98d7fd 3edddfda 3d5f3f08 be01300e -> 3f5092be 3f93414c 3fa5c7a1", + "bca0f932 3f06213a bb8cb98e 3f06213a 00000000 3e800000 3e800000 -> 3f06213a 3a21fd20 3f07632c", + "3fac2b2c 3ecef7f4 3ed198bc 3e4340dd bd4740f8 3f916dac 3f25e979 -> 3ef07844 bf8f363d bf2e5979", + "3f4b5f8f be23b4cc 3e0b3f29 3f4e3ed8 3f58dee3 3efe6737 3f666b01 -> bf5536e5 be847b3a 3db98fe0", + "3cd4267e 3eb702f2 3f79fc8b 3e39b1a8 3ec460a5 3f1597c8 bb486f87 -> 3eb1ed06 3f761cca 3e39c66b", + "3ecdce95 3f08ebf7 3d61e1bc 3d61e1bc bdac2a65 3f912f19 3d97c631 -> 3f119285 becd3388 3ccfbb1a", + "3f22d90d 3e5f5df3 3f8cd620 3f8cd620 3f400000 3f000000 3e800000 -> be84969a 3f483fba 3f70f5fd", + "3e6cfe70 3f07d3d1 3bcf86f3 3bcf86f3 3f1631cb 3e493a51 3f3faec1 -> 3eca220b bd2058e5 be2af765", + "3f1a560e 3f58c60c 3ec5be14 3f3c4fba 3eb0069d 3eb0069d 3e9e38d2 -> 3f23b679 3e373ddb 3f0c9e0b", + "3fb9e0ed be2e140d 3f1976f6 3e689b4b 3f02f30d baa994ca 3f869979 -> bf69ae68 3f19f217 bfa662ee", + "bd34c2f1 3eda3ee7 bd96dae1 3f5c1715 3e4c9958 3f599840 3f902181 -> 3edec2a4 bd141103 3f68cfbf", + "be9a0fa9 3e9f9a31 3f52253c 3f94c4f5 3f800000 3f400000 3f400000 -> 3f1cd4ed 3f85f58e 3fb1a7e5", + "3f697f84 3f2e710a 3f91517c 3c8d1760 3f98a109 3f288229 3f288229 -> becff84c 3f08f091 bf1549ac", + "bef658e4 3e35fb03 be35afad 3e35fb03 3df5a6b3 3f22a586 3f22a586 -> 3e7113e2 3e035765 3ef7810a", + "3fb058d3 bdb42765 3e01b52d 3d82b7be 00000000 3f000000 3f400000 -> bdb42765 bf0feb88 bf782e44", + "3f47b655 3ed8ade4 3df44260 3ed8ade4 00000000 3f800000 3f800000 -> 3ed8ade4 bf292e09 beb6bec6", + "3e911b8c 3e8c68a4 3e8c68a4 3f73397c 3f1e2ee8 3f1e2ee8 3f3af875 -> 3dcafc34 3dcafc34 3f3e3c10", + "3eea6439 3f5a953c 3edf18b6 3f63ea2f 3f7b406b 3e35963d 3f408069 -> 3ecf1f39 3eb5881c 3f0bc9d0", + "bee57eac 3da01ebf 3e9e1d4f 3e9e1d4f 3e3db64a 3e3db64a 3eb59856 -> 3e251857 3ec8a1cb 3eef82df", + "3f1652ef 3f9d70d6 3c914fc8 3f8b77b2 3e3a9079 3eac4b06 3f865405 -> 3f8fbf33 be382d94 3ef25bca", + "befe2de3 3e6d97d2 3f96cd3a 3e5c0c09 be508590 bd45297a be508590 -> 3e0612e0 3f93be30 3de90e2e", + "3f153e40 be3d5d50 be3d5d50 3f043c88 3f800000 3e800000 3f000000 -> bf449594 bea94dc8 3e6675a0", + "3f3569a9 3ea263de 3f94dd6c 3ea263de 3f000000 3f400000 3e800000 -> bd182e58 3f21ab99 3e0f5e13", + "3c85844d 3e98399d 3f6961f0 3f9c8494 3ea1a5f4 3e7f058f 3e7f058f -> 3e959727 3f6857ed 3f9bff92", + "3e888b51 3f63636d 3f9211f0 3f04cfb0 bd65d694 3e874674 bd65d694 -> 3f673826 3f890d0f 3f08a469", + "3e5c1ced 3f635f80 3f8c0765 3f943230 3f22f6ec 3f6368bf 3f22f6ec -> 3f4057d9 3f672cdc 3f82ae5c", + "3e6f5c87 3e249b3c 3c93b4fe 3f1b1c2d 3e8b7d4f 3e8b7d4f 3ddb5e79 -> 3dc6ca11 bd3afe4f 3f14b349", + "3fb397ed 3f91f50f 3f91f50f 3e835dc4 3f430b1d 3dd7536a 3dd7536a -> 3d9208a0 3f7e2656 3ddf58d6", + "bd6856de 3e3cdff5 3f612449 3f612449 3f3423b3 3f06529a 3f3423b3 -> 3e65bf54 3f68c2d0 3f6b5c21", + "3ef18445 3f77fbf3 3f77fbf3 3ef7473a 3ec100ec 3ed9bac6 3ec100ec -> 3f4a768d 3f44a19e 3e9c3c6e", + "3f74da16 3f56cc23 3f137705 3f137705 3f88e7b5 3f78e9c9 3f576cbb -> be3c5b44 beb537b6 be6a5088", + "be69604f 3f37cefc 3f5bc363 3f6a3e2f 3f07b795 3eb77264 3c9cf41b -> 3f56bd45 3f70aae7 3f6b5c59", + "3ecd5536 3f1ff6e0 3f7dec15 3f7dec15 3eceb81b 3dc92269 3dc92269 -> 3eed06a2 3f73d6dd 3f73d6dd", + "3edc55dd 3e7f9f59 3bebba65 3e7f9f59 3f468bc8 3f468bc8 bd44cbe0 -> bdac4c2e bea733ce 3e8a65c0", + "3ee5c61e 3db3b503 3f88c9e1 3f892ae8 3f104773 3f104773 3e0821f1 -> be2924a2 3f50d3f9 3f8187ed", + "be4e429d 3e31d816 3e31d816 be1ac484 3f9573a0 3f9573a0 3f8a054e -> 3ed155f9 3ed155f9 3d8747b4", + "3ea7a8bc 3f3bf60c 3ec16c54 3f978ba4 3f377091 3f616b1f be4a85e2 -> 3effc8c1 3db72b7c 3f9fd5d1", + "3f9db365 3ed0950b 3f8aed4d 3ed0950b 00000000 3e800000 3f800000 -> 3ed0950b 3f4700e8 bf531c44", + "bd072b8a 3d77f4f3 3f8c2cc8 3f8c2cc8 3f161118 3f67d367 3f161118 -> 3da398be 3f900007 3f8ea6ac", + "3fab9d2b bd8bfe01 bd8bfe01 3f86a3af 3f400000 3f400000 3f000000 -> bf8975c0 bf8975c0 3ec35466", + "3f7db030 3f0be516 3f91a7b3 bd81985a 3f8bfbe1 3da150f5 3de0a47f -> bf098b74 3f87a9f3 be301ac3", + "3f95a532 3f9e2a75 3dac7302 3f403080 be3cff96 3f3b75f1 be3cff96 -> 3fb9c923 bf459ada 3f776ddc", + "3f82b941 bcd4989c baf0df91 baf0df91 3f0dab96 3f476984 3f476984 -> bf175413 bf4c2036 bf4c2036", + "be80fc41 3e90381b 3f48a8ab 3eba365c be39059d 3f4cc968 be39059d -> 3e71d3a6 3f7c3fea 3ea2e814", + "3eeac770 bdd65d27 3f9475eb 3f8a4c9e 3e51ebb8 3f9f7d9b 3edc96ac -> be4b7114 3f16a6c6 3f6205d7", + "3f3d92bd be3fd4f2 3ed68a7b 3d62c2e7 3d621269 3f882f12 3d621269 -> be69af3d bebcd8c3 3c6d66e8", + "be259686 3f789eb6 3f7c607d 3f81199a 3ed41227 3f2a049c 3ed41227 -> 3f84e221 3f8bef5c 3f89ac60", + "be18df5f 3e51c8f7 bde01d82 3e5fb5ba 00000000 3f000000 3e800000 -> 3e51c8f7 bd0e7c46 3e82f6c9", + "3ee83458 3f942843 3d5839c7 3f025e0d bda39090 3f92627d 3e5d4d02 -> 3f98cb27 beee8727 3ed28d58", + "3f8d3de5 3f175f29 3f0ddcd0 3f175f29 be0aa48f 3f7d1e46 be0aa48f -> 3f3d9e3d bf0970ee 3f3d9e3d", + "befd444f 3d96b99f 3f79e6fc 3e7353c0 be6c2525 be6c2525 3f6a8dfe -> bd25cc30 3f5cb305 3f30db65", + "3f8a31c4 3f4cf18e 3e33be9a 3f4cf18e 3f80f315 3f3d147c 3f3d147c -> be92fdb8 bf1f33f2 3b4df500", + "3fb09001 bd97ec41 3f1e1749 3d6d5bba 3e9696ac 3f20dd89 3f20dd89 -> bef5b3a7 be7f3938 bf4f0fdb", + "3f906ea0 3f5c0cdb bcf273c2 3edd2dbf 3ecf64e0 bdf068d7 3ecf64e0 -> 3ece14fc 3dd2a8c8 bccd6fb0", + "3fbfd6f4 3f2a7342 3edb29a9 3efee525 3d37d46b 3ebd59da 3ebd59da -> 3f193b07 be0140ca bd672748", + "3f877018 be36943f 3f2751d9 3f987fad 3f972948 3f74045d 3f74045d -> bfb6c472 beb5c0e6 3e3b3438", + "beea20e2 3e2526f6 3c8b2c32 3c95aa78 3f000000 3f000000 3f000000 -> 3ec7a3ec 3e7b8668 3e7cd631", + "3f80869a 3f9404d4 bddd811d 3f819b94 3f59026d 3eb5f03b 3eb5f03b -> 3e9c460e beee0fd4 3f27df61", + "3f91d366 3f256f5c 3f5755d3 3f5755d3 3f312650 3ec8375b 3e2f01c1 -> be118a74 3eca9246 3f257d92", + "bef33baa 3e6ddc94 be3b23a8 3f0608d1 3f9c22c3 3f813734 3f63f350 -> 3f4fd088 3e97f934 3f72535c", + "3f0621ce 3dac9212 3f9d0686 be48b9a4 3e828db1 3e828db1 bdbade5e -> bd4a171c 3f8becac be17c51b", + "3ef6f564 3f030973 3d80e2a9 3ee7ec5d 3b892eec 3f8a4ff7 3f8a4ff7 -> 3f02851c beeaa22e bd8bb9ec", + "bec8dc93 3d64a3d2 3ea3e2aa 3f2fce23 3ecf8425 3f2f3a79 3e5c94db -> 3e5bfafe 3f16afaa 3f45706e", + "3ef044b8 3e7f2e46 3f9940c2 3e7f2e46 3f3dc2e9 3e9013a4 3e9013a4 -> bdca0a20 3f88599f 3defea5e", + "3f98e10d 3ea93f46 3ea93f46 3f3c38ee 3f4cfd55 3f32308f 3e6d22e0 -> bf20359c bf003352 3eead4af", + "3f9dd284 3f2f6656 3f2f6656 3f00f9bd be0e5ab5 be0e5ab5 3f804947 -> 3f5b47ae 3f5b47ae bf3b5fff", + "be9686b9 3f823f7c be135159 3d3ee163 3f84e4df 3f8355a8 3f84e4df -> 3fa95181 3e2193df 3eb42441", + "3fa16f30 3e726e45 3f5a7ce0 3f5a7ce0 3e0dc2cb 3f9c9d44 3ed67227 -> 3d7e9078 bf308ed6 3ea683e4", + "3f030069 3efcdfa0 bca49c6a 3f602782 3ce44839 bd3de91a bda7e1fd -> 3ef5928b 3b6e0610 3f6ae49f", + "bc8e86b7 3dce992c 3dce992c 3f6a3763 00000000 3f400000 00000000 -> 3dce992c 3de9526e 3f6a3763", + "3f57cd08 3f226d1a 3f226d1a 3f255665 3f400000 3f800000 3f400000 -> 3b135400 be557fb8 3c5f27c0", + "3f2eae38 be270fb9 3e2123b4 3eb4813f 3e4007b7 3e2bcf66 3f967d91 -> be950bd4 3d2f9f40 bee63dcd", + "3f877658 3e745ca9 be15dff5 3f908b21 be66fb01 3ec609b7 3f9fbcf9 -> 3ef46779 bf0e42aa be440ef0", + "be2a0073 3f90279b 3f90279b 3f1a7ac3 3f368ce8 be3dd5eb be3dd5eb -> 3f9f4ed8 3f8c3718 3f1299bd", + "3f81cf4b 3ea876b1 3f3303bf 3f817bff 3f839cfd 3e856171 3f449316 -> bf36b760 3edec348 3e6e75a4", + "be9a5ae5 3f51359a 3ed2a52b bca052d3 3ebf3a23 3f9bf1ad 3f977a7c -> 3f6e08d2 3f475956 3eaca5c1", + "be38aefd 3f2d3c94 be2676a2 be2676a2 3f593b21 3f593b21 bd03b927 -> 3f546a53 bc1bfa50 be2c6714", + "3f96a10c 3f1880e1 3f65b488 3ee77e0a 3d624174 3f7c0035 3f7c0035 -> 3f07dccb be85b18c bf34ce49", + "bdb4ffe5 3f56d435 3ea4b956 3f6dd8ba be7595d1 3f20d4d1 3f79b9a8 -> 3f51671e 3ec126f0 3f81f560", + "3f6ea097 3efe2ee3 3e15f9d4 3e15f9d4 3f04f9f0 3e9d424f 3e83ba57 -> 3c48ea60 be0f32c4 bdbf33d4", + "3fad3ac7 3c6c52ac 3ebe0696 3d9d8457 3e9af9eb 3eea1e62 3eda0838 -> beca5a5d be7da3f8 beffb224", + "bdf50c88 3d86877b 3d86877b 3da785f1 3f64838e 3f8f701a bd35b38c -> 3e30a248 3e4c910c 3d9ca715", + "3e55b8f8 3f4fc296 3ea78392 3f8268d4 3f800000 3f000000 00000000 -> 3f1a5458 3e642aa8 3f8268d4", + "bcd2230c 3ee9f689 3f9f1b68 3f9893f3 3f000000 00000000 3f000000 -> 3ef087a1 3f9f1b68 3f9a3839", + "3eb53cd8 3f8e2bc4 3f0a0901 be541142 3f800000 00000000 3f400000 -> 3f41b91c 3f0a0901 bef1f643", + "bebc0ec8 3f843157 3f594cf9 3f594cf9 3f73a5a4 3f73a5a4 be5b43ed -> 3fb0f044 3f99656a 3f452aa8", + "3fa34c38 3f884379 3f93e5b7 3df1a980 3f8ea1d7 be7d3d06 bdb6be38 -> beb6ce34 3fbc4808 3e6d6646", + "3f613870 3f94e3ed 3f9d55d7 3f88ffc7 3e41ed56 3f002b36 3f8a7938 -> 3f7f20c3 3f49e972 3df2cb58", + "3f9f3518 3f2534d8 3f737209 3c5b2817 3eaf9701 3f60652e 3f0ed401 -> 3e60068e be0ea2ec bf2e39f8", + "bc2ceffd 3eecaac1 3eecaac1 3f41baf4 3e2b961f 3de749d7 3e6057d0 -> 3eed9294 3eed46ff 3f425281", + "be6d1f89 3f0a480a 3f7d0673 3f66f1ff 3f3a9c20 3f9c7f7c 3f9c7f7c -> 3f357e6c 3fa2c08d 3f97b653", + "3f4aafc3 3f75c36a 3f75c36a 3f6bc38c 3f800000 3f800000 3f800000 -> 3e2c4e9c 3e2c4e9c 3e044f24", + "be62d3f3 3e9cd23d 3e9cd23d 3eeb203f 3f400000 3e800000 3f400000 -> 3ef1e1b8 3eb92cbb 3f2017dd", + "3fadeb22 3f8b4c57 3f1523f6 3f77ff05 3f000000 3e800000 3f800000 -> 3ed15b18 3e78b994 bec7ae7e", + "3e7fd27a 3f9f1dc3 3e8fcb9b 3f104a74 be671d68 3f869531 3f94a322 -> 3fa65565 3c94e590 3e8c0c34", + "3faef7aa 3f211b14 3f3bcead 3f8c5575 3f6d3dd3 baa9571f 3dbd4e59 -> bf233000 3f3c426b 3f785250", + "3d52df93 3da15328 3ea37764 3da15328 3f9307ec 3eb098d5 be41dd3c -> 3ca0d900 3e9a5fea 3db54941", + "3fb7c94d 3e945961 bd822b31 3e466974 3e800000 3f000000 00000000 -> bd8dbfb0 bf480eb3 3e466974", + "3f3bd8f6 3f7b7b7f 3f0ccc7e 3e9457dc 3dd353bd 3f7efaf8 3f96af53 -> 3f681956 be3933b8 bf12f79f", + "3e9d097a bd9703a9 3e1c71ce 3ea0a714 3f73f5c1 bddfc290 3f73f5c1 -> bebb67a9 3e3ec275 3cb00550", + "3ebe4feb 3ebcc2eb 3e6e257a 3ebcc2eb 3f953e4e 3f89550d be2bfa01 -> bd848afc be2a3a82 3edcb93a", + "bd394aa6 be29fb76 3f5894e3 3f0c1590 3dbd2939 bd0e11ed 3d9f9015 -> be25b426 3f582e0f 3f0cfc8b", + "3e9b3d77 3f29ca4d 3f29ca4d bc458e9c 3f39dbf7 3dc86122 3ee192f6 -> 3ee2dfcc 3f22321e be15230e", + "3efe09fd 3f826432 bd3490c1 3f352553 3ee661d2 3e3a7b32 3e3a7b32 -> 3f4ba0e1 be09aaf1 3f1e03a2", + "3e9ed870 bd8326b6 3efabc67 3e4d1c89 00000000 3f400000 3f800000 -> bd8326b6 3e839a13 bde128ae", + "3ed4bc26 3e854fc9 3f68c666 3f22dc12 bd42aba5 be565dc7 bd42aba5 -> 3e8f6c1d 3f7f0acd 3f27ea3c", + "3ed47380 be0f0443 3efd1059 3f938a8c 3f542bc5 3f9d2085 3e6e2254 -> bef7961a bc776960 3f87308e", + "3ecb04b9 3e69b95f 3e69b95f 3b499b05 3e38d263 3e911517 3f9273d0 -> 3e207040 3ded55f1 bee6b5dd", + "3f26620c be0ca322 3ec8a767 3ec8a767 3ecf9848 3ecf9848 3f7f4893 -> becd3dd1 3e03764c be832e45", + "3f871b32 bd96bb86 3f7961be 3f5e4f3e 3e800000 3e800000 3f400000 -> beacca14 3f35d425 3d9d3398", + "3da04bcf 3f9c74a8 3f63e152 3f9c74a8 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f991dbe 3f5d337f 3f991dbe", + "3eb680ec bdad00cd 3f4a78cc 3f4a78cc 3e800000 3f800000 00000000 -> be31c0dc 3ede70ac 3f4a78cc", + "3edad4c4 bdd486bb 3ed36277 3e83b889 3f50a7c8 3f395e60 3f50a7c8 -> bee77dfa 3dd3b824 bdba8f08", + "3e083f9f 3f7980cc 3f7980cc bda1d35d 3f800000 3e800000 3e800000 -> 3f5770e4 3f70fcd2 bde5f32c", + "3f4db384 be5f2195 be407a71 be5f2195 3f9817df 3efe1435 3efe1435 -> bf9619f7 bf1632c9 bf1ddc92", + "3e91eb45 3eb9f659 3f8ea590 3f9f749f 3f9bea88 3f48484c 3dea668e -> 3c838160 3f64369e 3f9b47c3", + "3f056ab3 3f80417c be18aec3 3deca80b 3ee8c0c7 3ee47996 3ee47996 -> 3f43dc63 bec369c6 bdefa189", + "be09c42e 3f3ebf67 be49191d 3f513a37 3f5b83a9 3f562607 3f5b83a9 -> 3f5c47d2 bdabb54f 3f6ec2a2", + "3fbe6d64 bb2984ea 3f8a398b 3f8aa0dc 3f400000 3e800000 00000000 -> bf8f26cd 3f353c64 3f8aa0dc", + "3ece1533 3e909175 3f279a9b 3e909175 3f12767b 3ec29f33 3f12767b -> 3d554fe8 3f006f8d 3d554fe8", + "bde6a600 3f6fca50 3ee32db8 3e570076 bc2ea144 3f01f0f9 3f01f0f9 -> 3f6f7ba5 3f003934 3e88c4ec", + "3dffd56a 3e164692 3e18ec72 3e18ec72 3f1ecd6a 3f3c4891 3f3b1dbf -> 3d8dda25 3d6b5f4c 3d6db48e", + "3f935779 3f8a108e 3f916d43 3f84ad8f 3e1f6e92 3f4dbd19 3f4dbd19 -> 3f663fa1 3e581b08 3de43ad0", + "3f3b7a5d bdfe23f3 3f987852 3f8eac82 bdc2cf53 be668b13 be668b13 -> bd5ef2c8 3fad930b 3fa3c73b", + "3ed1b243 3f67eb49 3f065629 3f81a3da 3f2e25d8 3f95250e 3f2e25d8 -> 3f209834 3d42b0e0 3f3bf4a0", + "be946b24 3f980eb1 3f6d8147 3f6d8147 bd4b3bcf 3e6b72ae bd4b3bcf -> 3f963763 3f7e9162 3f69d2aa", + "3f8b7df7 3d7f2175 3f3b5174 3f6a0fd0 3f7e6a71 3f7e6a71 3f6805fd -> bf82a7ef beb3e104 bd965830", + "3f3b821c 3f24d9b2 3f24d9b2 3f275ab1 3ef3cc09 3e61297d 3ef3cc09 -> 3e972171 3ef73d86 3e9c236f", + "3f29b43b 3e2f034e 3e2f034e 3f8c1e53 3f9900a5 3e97ca9a 3e97ca9a -> bf1f1976 bcd1df60 3f65ecd8", + "bdb04c11 3e505115 3f4a35cf 3dc5c0e3 3f819f93 3f64830a 3f819f93 -> 3e94caa7 3f5de18f 3e3c24aa", + "3f5ee91a be136148 3f5c11d6 3f5c11d6 3ee1cff3 3ecf7446 3f298ed9 -> bf07284c 3f01bff8 3e90db24", + "be19354d be2f0f83 3f81fec2 3edfe394 3eb80446 be00f7fc 3e942146 -> bdeffe28 3f7f2a93 3ef60d43", + "3fb2a879 3f122970 3eaca8a8 3c433e3a 3e9e7137 3eb42b24 3e9e7137 -> 3e0e59ca be1da0f2 bed70c09", + "bdcd599e be7f7d3d be2c538f be7f7d3d 3ec855ad 3ec855ad 3f90ea4b -> be57508e be0426e0 be0b3ee4", + "bee5b632 3ef8ee23 3ef8ee23 3f5b4bb3 3f800000 3e800000 3f800000 -> 3f6f522a 3f192dd8 3fa71366", + "bdfd0887 3ea1b982 3e289e89 3f82ca13 3f0352ed 3f4c933e 3f0352ed -> 3ec22cd7 3e86dc5a 3f8ae6e8", + "3efb46df 3f4cf3e4 3f917d37 3e9adee5 3fa00000 3fa00000 3fa00000 -> 3e3f9e64 3f05ee23 be9f39b1", + "be6b43e1 bd47708d 3f84ece2 3f84ece2 3dd1f33e 3dd1f33e 3ecc0e19 -> bccdef25 3f87f0aa 3f90a553", + "bdca7d47 3f8ddc58 3f38814a 3f8ddc58 3f5dcf77 3f8fa854 3f8fa854 -> 3f98d37c 3f54e992 3f9c107c", + "3d805914 3f4d406f 3e216735 3f1369ce 3f4ea08c 3f9621c8 3d61dbf1 -> 3f404d6a 3dac4427 3f128755", + "3eeeae89 3f49d5c7 3f8ce585 3f49d5c7 be2bf2ea be2bf2ea 3f107ab0 -> 3f5ddfe9 3f96ea96 3f067b7f", + "3fa52ebf 3f8a56e9 3ee5a038 bdacc585 3df13cf3 3f00272e 3d545e51 -> 3f6dc3bd be4a44cc be1ae68c", + "3fba2182 be137d2c 3e8dce04 3f98b669 3f105fd3 3f105fd3 bdd43d9b -> bf76d055 bf0b0a08 3fac007b", + "3fa99267 be0ced24 bcf8bea0 bcf8bea0 3eb1343c 3f10ca36 3eb1343c -> bf189c1c bf47968b befa4d8f", + "becc0981 be043dd3 3f9bbe16 be043dd3 3ef4cd39 3e8baaf8 3f285b6f -> 3d7b7b30 3fa9a844 3e082067", + "bebc23f1 3ebef480 3f4bb4fc 3f4bb4fc be684211 be684211 3e4ca16a -> 3e944838 3f365ed8 3f5e8164", + "3eb0d1c0 3ea2c9cd 3f6e7cae 3f6e7cae 3e14f66a 3f137495 3e14f66a -> 3e8910f0 3f3b9032 3f61a03f", + "becac508 3f152b89 3f7a3f3e 3f425897 3f33bc7c 3f8b837b 3ec3c69f -> 3f5c5a11 3fb4602f 3f691cf1", + "3f9c4dff 3f955770 3f2b587e 3f8753ba 3f2b252a 3b91843e 3b91843e -> 3eb36298 3f29f51b 3f86a208", + "3fa83bfd 3d494321 3f7adebc 3d494321 3f825c51 3f9b1bb0 be4f2a5d -> bfa50c2a bf1cdb54 3ea14cbd", + "3f143375 be338961 3f77f101 bd802943 3f81a4f4 3f6fa534 3f8cce4e -> bf42fd30 3eda6aa8 bf330c4d", + "3e6ab0cf 3f5f22c0 3f2b5c07 3f96e5b4 3eccd9b2 3f9c81ad 3f9c81ad -> 3f47a931 3ec73d6e 3f660e18", + "bb61f7a4 3e3b2ee2 3e3b2ee2 3e904ff2 be6e6ebd 3f4b4cfd be4431d0 -> 3e3a5c6c 3e3dfcaf 3e8ff95b", + "3ea4ee8c 3f3a0a54 3f40f4bb 3eeb38f2 3f8d8651 3f0aed2b be5edc2a -> 3ebdb8d0 3f143409 3f078f10", + "3f26e16a 3d5de463 3d5de463 3cebf28d 3f3d5fd7 3eac7cb6 bddaf90d -> bedb293e be296865 3dc9baf1", + "3f7620cc 3cf7e133 be6a2a64 3cf7e133 3ea393c8 3f41d90b 3e666572 -> be8dc6e4 bf74e9ff be3e86da", + "bb8bd9f8 3f408d6d be63f9a6 3f408d6d 3f300df6 3f300df6 3e8d6c42 -> 3f414dc8 be60f83a 3f40daaf", + "3d8eda6e 3f9334b1 3f085e2b be5189d6 3f8186d0 3f8df991 be7329be -> 3f8a2bc8 3ee91f8d be4093c2", + "3f2cb2ce 3ee183e4 3f0e093b 3ecd31d4 3dc86751 3f2f5f45 3f6e3ff9 -> 3ebfb78b 3dbdd5dc be6881e4", + "3f92f31b 3e6dea5f 3b52eeb2 be662b2c 3ea26693 3f51af37 3ea26693 -> be06f883 bf6fe72b bf16c383", + "3f24dba9 3e982f50 3d7d47e9 bdc1bf40 bc941085 3f2266d9 3f2266d9 -> 3e9e24ea beb1817b bf00cd24", + "3ebe35b7 3f0790d6 be3519b6 3f0790d6 3f5cd67a 3f5cd67a 3eb6117a -> 3e56184e befea260 3ecb7e16", + "3f3cd36b 3eb921b2 3f604370 3f604370 3f306f8b 3f0c72a4 3f0c72a4 -> be164b1c 3ef15685 3ef15685", + "3f9190b4 3f0f5898 3e77e39a 3e77e39a 3f400000 3e800000 3f800000 -> be9600ec bd2cf738 bf652882", + "bee0b946 3f31e157 3f31e157 3f07cb46 3c313d0d 3f5ba87d 3c313d0d -> 3f331882 3f892545 3f090271", + "3e079c1c 3eab729f 3ced86dd 3f7374f8 3ea80e5b bd3ee00b bd3ee00b -> 3e95311c 3d100a91 3f75096a", + "3f9c8837 3f2de46a 3f01e37d 3f0db2c7 3adaefa5 3f93f5f5 be70175e -> 3f2d5e8b bf67fef1 3f5719c5", + "be582f54 3f609d83 3f8d7079 3f8d7079 3f95add4 3f3f0a31 3d8d1e50 -> 3f8fe857 3fa19af6 3f8f4d28", + "bd699e44 3f447c15 3f447c15 3c92ad0b 3f7dbf6d 3f28457f 3f42b9f8 -> 3f52f517 3f4e150a 3d7b0a2a", + "bdff078e 3eb44471 3eb44471 3e5eefd6 bc919302 3f8a0cc8 3f966834 -> 3eb32266 3ef907d8 3eba6309", + "3f1a03b3 3f497117 3f497117 3f8e3f48 3f932ba8 3f9a6d19 3ed15b2f -> 3dc2e280 3d7a15e0 3f5d849f", + "bee2a95e 3e9e4fb7 3e9e4fb7 3ec2d58e 3f000000 00000000 00000000 -> 3f07d233 3e9e4fb7 3ec2d58e", + "3f38bf1e 3f75ca5d 3e2a89eb 3ef48920 3f87699e 3ef4a1c6 3f173d17 -> 3e49616c be368be5 3d51fbf0", + "3db56c36 3e5f2282 3f8c7e6b 3f8c7e6b 3f3adc82 3f0d7c7a be64ad02 -> 3e1cec10 3f863a1e 3f8f06a7", + "3e08e3e0 3f89a3ff 3d773742 3f123456 3f8ef428 3f1a6913 3f1a6913 -> 3f6d0f84 bca61ba0 3efb200a", + "bd124c76 3ed5c82f 3f38dbed 3f38dbed bcce57c3 3d24e7ba 3d24e7ba -> 3ed55243 3f393a2a 3f393a2a", + "3fa7fc91 3f0e023e 3f934c80 3f0b299c bd7a431b 3f1fdda8 bd7a431b -> 3f228954 3ea994ba 3f1fb0b2", + "bd5a7e47 3f28b4a5 3f338754 3f338754 3e7f60d3 3e99c1bb 3f3d0cc6 -> 3f2c1c7f 3f37a12b 3f3d9cf6", + "3f772fd3 3f3459df be3eb3be 3f010d52 3e4b3f70 3f8fc4fa 3e286f92 -> 3f0349d4 bfa2a861 3eb0c916", + "be92515c be1aca81 3d13a33b 3eb45af3 3ef0f2ed 3ef0f2ed 3f39fcd6 -> bc889b10 3e2e9fee 3f0f5420", + "3f18987a 3ec084ce 3f340e29 3e2e7103 3f2a05af be6d1daf 3ed16e42 -> bca2c7b0 3f5763e0 bd9676cc", + "3f9fa83c be37210a be6777b1 be6777b1 3e9973fb 3f226b18 3e9973fb -> bf0d7c24 bf823a37 bf1991ce", + "3f428d29 3f4235ee 3f818421 3f79c700 3f69c848 3f69c848 3f13ed2a -> 3d8459f8 3ea2bb26 3f095bb5", + "3f2227c8 3f443d94 3f443d94 3f12907a bd93d118 3f8120db 3f8120db -> 3f4ff1bd 3e029f74 bd8829e8", + "3f69e471 3d6b3ae9 3f441b2a 3f82ce3d 3e843e6c 3e843e6c bd6e99f3 -> be36d6eb 3f07b1c1 3f899e36", + "3f293b93 3f4970b9 3f83ba47 3daeec66 3f8e70dc 3f935864 3f935864 -> 3d51d6b0 3e894a8c bf2cf1bb", + "becfbde5 3e779fc8 3ec3e001 3f5dcd17 3de76ae3 be546254 3de76ae3 -> 3e934947 3e98c9be 3f6989c8", + "3f921f57 3e0b46b4 3f16c3a6 3f16c3a6 be2d3b92 be7be51b be7be51b -> 3ea88488 3f5ea766 3f5ea766", + "3f9a115a 3d62c55a bddcd21b bddcd21b 3f000000 00000000 3f400000 -> bf0be504 bddcd21b bf815a25", + "3ef11130 3f9d7389 3e45d7d4 3ed80024 3e2da5b6 3e7684d2 3f3a196f -> 3f933b3e 3da38c11 3da306d0", + "3f5f4616 3f639561 be7eb31d be7eb31d be014aa5 3dc7bd29 3f5f4dd3 -> 3f7fc63c beaae6ac bf81375a", + "3fb3c18a bd8f31e2 3f11dbe1 3f84db51 3f5181ea 3c094644 3f638a7e -> bf9c0f58 3f0ed8c2 be575458", + "3eecfe71 3dd64f79 3e6de4d8 3e6de4d8 3df4269a 3f52bbef 3f52bbef -> 3d4a98b2 be184890 be184890", + "3f86e7e1 3eb3ee6a 3eb3ee6a 3e877db7 3f9ebde4 3e28e548 3f55d7bd -> bf74a583 3e35dad6 bf1da262", + "3fab12f3 3eec97f9 3f9b6095 3f9b6095 bd855276 be713276 bd855276 -> 3f0c91f9 3fc3ac39 3fa68393", + "3e811c2d 3e3a081f bca3c308 bca3c308 3b97f95c 3f58e2f4 3f58e2f4 -> 3e38d589 be6f3cd9 be6f3cd9", + "be3b0fb4 3eac262f 3f30f23f 3f9b6606 3e800000 3e800000 3f000000 -> 3ec38826 3f3ca33a 3fa71701", + "3f9a4537 3f4c6caa 3f292161 3f957ded 3ec08d91 3f942e18 3f942e18 -> 3eb0c6e2 bf3c0dc9 be68cd40", + "3f3ba800 3f9d09d9 3d5504bd 3f9d09d9 3e800000 3f400000 00000000 -> 3f8594d9 befedb68 3f9d09d9", + "3f7db5c2 be62f67f 3e8f7723 be62f67f 3ea155f4 3f49c57b bddbbeab -> bf08afdf bf003bdc bdec258b", + "3e592ee8 3eb491d7 3f9d082c 3eb491d7 3f0e8e4d 3f86f8ae 3f0e8e4d -> 3e7032f0 3f8067ca 3e7032f0", + "3f994228 3f8f9e8f 3f6f2f37 3f6f2f37 3ee57a0a 3f6101e3 3da44e41 -> 3f15dbe1 bdf1caa8 3f5697e8", + "3eed3f0d 3e077c06 3e077c06 3ee61d02 3e75c410 be04e49e be04e49e -> 3cacd404 3e451037 3f02738d", + "3f8198ed 3f4579ef 3f4579ef 3f6def0a 00000000 3f800000 3f000000 -> 3f4579ef be76dfac 3ed8ac3a", + "3fa7e778 3ee808c1 3d90bb6d 3f185e0b 3f33bb89 3f3ab61c 3f99e543 -> beef7ea3 bf62d3ce bf7b60c7", + "3e831387 3e645e18 be38c40a 3ed36934 3ea94e41 be502947 be36e2f1 -> 3e0dae22 be03798a 3eead239", + "3eb91cd4 3d2968ba 3f492a32 be4bf594 3f959224 3f1fd5d1 3f1fd5d1 -> bec321d1 3f0f6070 bed98e4e", + "be638fdd 3f89ba85 3f89ba85 3e5c70c2 3ef15a56 3f561234 3d66532b -> 3f972331 3fa183d3 3e693c95", + "3f1ccaac 3f89b015 3f89b015 3ea973af 3e98ab86 3eba02cd 3eba02cd -> 3f649f78 3f5a69ae 3dde1adc", + "3f62380a be6311b6 3f36b1fe be6311b6 3f82c9b3 3f0ef1a9 3e93a359 -> bf8ff4e8 3e618572 bef3ff61", + "3f6a46d4 3f61d14a 3f2b52e2 3f602ca2 3f945b69 3f7abc87 3f287b5f -> be36dfa8 be688b44 3e8bfa80", + "3ebf4333 3e8bd7b4 3f3b0501 be11b91c 3e7143d8 3e7143d8 3dcd56e1 -> 3e3d8eee 3f247ce3 be38138a", + "3ed3c432 3da23723 3f610220 3f53ba37 3f74f5f2 3c2fbd62 3e892bbd -> bea214aa 3f5fdf60 3f375c2c", + "3ed2efce 3f81d9de 3ecf0f5f 3f660c1f 00000000 00000000 3e800000 -> 3f81d9de 3ecf0f5f 3f4bae25", + "bc295775 3f105f45 3f9ed2f9 3f105f45 3f3df0b3 be76d886 3e6f56e7 -> 3f1255d8 3f9e8154 3f10fd97", + "3e21899a 3e8a4ca2 3ece33f5 3dc19943 3f6d5ea9 bcdd182c 3dff6a6a -> 3dfda24a 3ed06201 3d994e76", + "3f851c12 3f9ad0a4 3f6e5e17 3f6e5e17 3f400000 3e800000 3e800000 -> 3edbee5a 3f2bd00e 3f2bd00e", + "bed1d68a 3f8ae6aa 3f7ce057 3f7ce057 3edc9eca 3f9549f9 3f8f8e01 -> 3fa1817b 3fbb9f6c 3fb945ca", + "3f6680d4 3f2dce04 3f20b449 3f673813 3e37ffb7 3f85b3a2 3dce9610 -> 3f0462ee bea0221e 3f4ff7ba", + "3f66d550 3e9bc9c2 3f4020d2 3f34cc10 bd043e04 bd043e04 3eca2607 -> 3eaab17f 3f4794b0 3eb35185", + "3ee0c467 3e058eac 3e058eac 3f30356f 3ea549a5 3ef11b93 3ea20de8 -> bc390930 bd9c44de 3f0ca34f", + "3f2bde7e 3f552552 3f6cc6d1 3f6cc6d1 3e2af4c0 3e2af4c0 3ee97ad7 -> 3f3873ce 3f50154d 3f1e66d4", + "bea5ec8b 3d342ca6 3f40aa2d 3d342ca6 3f4881a6 3ea44012 3ed9b817 -> 3e987a69 3f5b4771 3e3a27fc", + "3ef5395d 3f0c7045 3f5aa788 3ecfd8a1 3f222f6b 3f222f6b 3f862a4b -> 3e7b09a2 3f0cf9ac bdc4c1cc", + "be20a75d 3f5556e8 3f9dbdc2 3efacc85 3f3b3a5b 3f3c702f 3f3b3a5b -> 3f72b6a0 3fac85ec 3f1ac5fa", + "3e96048f 3f2b7ab8 3f4661e8 3f8b5c25 bd37670c 3e934e5a 3e837f32 -> 3f2ed685 3f30cd46 3f81ba49", + "3f811774 be240ec2 3ed11b27 3e88b2fa bdc46187 3eb2c2ad 3f42838a -> bd820f3e 3d6691a0 beffa570", + "3f8c66bf 3f66a385 3f57f96d be04ed0f 3d907bec 3f21f141 3e419f89 -> 3f52d415 3e195e40 beaca77c", + "3e00d03f 3e61244c 3f77944b 3f77944b 3f576e84 3f965abf be10c251 -> 3de97b96 3f51c074 3f7c21ba", + "3f7ddd63 3ef97719 3ef97719 3e075ea2 3f9c8044 3f701f29 3f412f3f -> bf39a8a8 bee2c5cd bf1dbb18", + "3f113da8 3f3b4372 3f96f84e 3e5f2779 3f8e3264 3ec23213 3f8e3264 -> 3dcf4ef0 3f76da0b bed31f6c", + "3d9300db be2ea82e 3e175c7d 3f3feb4b 3f2b87c5 3f65204e 3f0284b0 -> be5fe7f2 3dab26a9 3f368cf7", + "3d075b80 3f5b6cd2 3f84c957 b9ad2336 3ed2c5a3 3f4505e0 3f4660de -> 3f57f146 3f8187f3 bcd47c86", + "3cbbfd34 bd971a53 3dc3ce83 3f5161a6 3e800000 3f000000 3f000000 -> bda2da26 3dac4edc 3f4e71b1", + "3eb00208 3f2614b5 3f91afeb 3f92dc1f bdee195f bdee195f 3e826381 -> 3f304fea 3f96cd86 3f87a771", + "3f35fdce 3f94f34f 3f366556 3f55fc3f 3ccdcb98 3f4663c4 3f311c10 -> 3f92aa1b 3e257070 3eb027a1", + "3f79bd1d 3d1ea27d 3ddb7770 3f83b482 3efc536e 3f43bde8 be1434f9 -> bee2533c bf238562 3f95c722", + "3f331294 3f78e74e 3d9c1ac2 3d9c1ac2 3f67156d 3f67156d 3f88975c -> 3eae851c bf0e2168 bf2b9426", + "3efd2332 3f05892f 3e4851b5 3e4851b5 3f0d8f03 be3ba37d be3ba37d -> 3e7e3124 3e928b72 3e928b72", + "3ee733bd 3ea24ef2 bdb07632 3f060098 3db5a064 be4beddb 3cf67d90 -> 3e8dcde4 3b76d4c0 3f028624", + "3f4764c0 3f92b4d3 3f80b5da 3f80b5da 3f000000 3e800000 3e800000 -> 3f41b746 3f4f9284 3f4f9284", + "3f68fb1d 3f90f650 bd329c87 3f90f650 3e283628 3e6feeb1 3f740c0a -> 3f7ba71b be838166 3e87a4a6", + "3d1cd8f7 3f41d74e bd0cc347 3d287a96 3f0fb235 3e93f123 3f87a687 -> 3f3c56a8 bd3a1571 3a106cc0", + "bee3cfc0 3f96e17f 3ef6c68c 3f290e52 00000000 00000000 00000000 -> 3f96e17f 3ef6c68c 3f290e52", + "be7cbba0 3e7da6fa 3f1ace49 3f1ace49 3f884603 be260fe8 3f884603 -> 3f02ae24 3f108f33 3f5e12ae", + "3f514b6b 3f92f1d1 3f92f1d1 3ed05145 3f953ae0 bd5f3c39 bd5f3c39 -> 3e47864c 3f98a5e1 3ee72183", + "3d9c1b94 3f7d1ad2 3ef97e2a 3ef97e2a bcc4cefd 3e69f5ed 3f1fdfae -> 3f7d92d5 3ef09379 3ee11ec8", + "3cd62900 3f1dfdc6 be4e66f6 3f1dfdc6 3e3e7824 3e3e7824 bde19e2d -> 3f1cbf18 be5361ad 3f1eba84", + "3eaa73f6 3f920fd6 3f920fd6 bd8eb151 3ea1a20e 3f56a07b 3f8aefdc -> 3f849bfb 3f5cabc7 bedcb0c3", + "3f29acc8 3f917be5 3f917be5 3c5b4d5e be5386ac be57d245 3f977422 -> 3fa3023a 3fa35d54 bf455691", + "3de2e787 3d8b1917 3f8490bb 3f013e2f 3f8a13d0 3e315319 3ebe2d0e -> bd53574c 3f821c0c 3eed6a65", + "3faa0b93 3f1ff6f0 3eb3a132 3f1ff6f0 bdd0852f 3e90e083 3f4e4f62 -> 3f429768 bccd6160 bee43a4c", + "3ede7442 3e252807 3e252807 3f88cb06 be6bf676 3f87c71f 3f8b8be2 -> 3e85d6bc be9964a8 3f18535e", + "3fb3f032 3f728a9c 3f9539f9 3f728a9c bd6052b2 3da10e72 3da10e72 -> 3f832013 3f871372 3f563d8f", + "3fab06e8 3f07e96d be1b8c1f be1b8c1f 3f400000 3f400000 3f800000 -> bef141de bf93b6b2 bfbe786c", + "3fb55ddc 3edc1372 3f2b0b5f 3f4d33d4 3ed56ce5 3ed56ce5 3e64ee16 -> be24aa14 3d9eb908 3ef83762", + "3fae5e34 3f938a8b 3f1d58c7 3f1d58c7 3f8d7177 3f03c9ef 3eae74ee -> beb48f30 bdb175c0 3e1a146c", + "3de87d31 3f16564e 3dfd4622 bb22b5a5 3f157909 3e8a14fe 3f73d8df -> 3f055e75 3dbe92dc bde28977", + "3de4e2a5 3f202818 bd8a119d 3f5bdf2e 3f800000 3f400000 00000000 -> 3f038bc3 be1addcc 3f5bdf2e", + "3f57bf82 3eaaa16a 3eaaa16a 3e795a80 3e3b68b4 3ef503af 3ef503af -> 3e3751b3 bd8f6fe0 be23a044", + "3e9013c3 3f96c670 3c43f080 3f697722 3e800000 00000000 00000000 -> 3f8dc534 3c43f080 3f697722", + "3f42194d 3e5d3d47 3eada920 3eada920 bdb3d147 3f716e8b 3f976015 -> 3e90b43b bec07224 bf0eb6fc", + "3f27b0a4 be541b86 be2e8cdb 3d176486 3f2ed7da 3ee132bb 3f2ed7da -> bf278e55 beeac9e8 bed22256", + "3f85da0c 3eb68a9a 3d1e1b4c 3f8ac456 3ca7e93c 3ca7e93c 3eab0842 -> 3eab9134 3c8ca037 3f3c1bb4", + "3ed87a86 3f93e815 3f93e815 3f73f55b 3daaf5a6 3daaf5a6 3e47304c -> 3f8f638c 3f8f638c 3f5ee758", + "3f206788 3f04f6ea 3e9b26ed 3f04f6ea 3f01aa04 3f3fa066 3eae36bf -> 3e4ee0dc be29f922 3e9cc528", + "3e29e136 3e25420f 3f5e3393 3f425c9e 3ea93b4b 3ed2c25c 3ea93b4b -> 3dda3718 3f4cb81c 3f3452fd", + "bb8632ce 3d68b306 3ec88313 3f511d81 3f37ca0e 3cf09589 3cf09589 -> 3d74be0e 3ec892d7 3f512563", + "3f832b1b 3cd1e5b9 3cd1e5b9 bd92fd4b 3f8b1c70 3f8b1c70 bc2f236e -> bf8b465d bf8b465d bd791c46", + "be645a17 3c60bb77 bdc51440 3d2ff1bf 3a1a8f34 bc35df6d 3f25790f -> 3c62e2ef bdca2618 3e3f967d", + "3f9ddeb5 3f98e60d 3f5d72c5 3f2fc285 3f90863f 3f90863f be34b931 -> be4ad088 bf070d77 3f677bea", + "3fbe7574 3f32c28c 3f32c28c 3e378ccc 3d3acff9 3eba5372 3f86e97b -> 3f216309 3e208c84 bfb1ccc4", + "3fb98f1c 3e31b1ee 3f85414d 3e1a80ae be411e4d 3f5a3985 bdc55535 -> 3ee4d3d2 be476210 3e94c4c8", + "bee7bb55 3f453b1e 3df6f4b1 3eef53c1 3f4b8175 3eccb533 3f1114dd -> 3f90ab3e 3e9a63d3 3f3953e0", + "3e531488 3ec550c5 3f2534dd 3f9f5dea 3f12fa04 3f12fa04 3f8a1184 -> 3e88b8d8 3f06e8e6 3f82e809", + "bd5d7839 3f298e1a 3f76468f 3f8cd26c 3f800000 00000000 3f000000 -> 3f37659e 3f76468f 3f90484d", + "3f094652 3f1cc418 be77d3b7 3d00bd79 bdb5b100 3f636c1b 3dde414a -> 3f28f1cc bf37e840 bcdb3d04", + "be038f2c 3df1a133 3e693c20 3df694dd 3f400000 00000000 00000000 -> 3e5b7bfa 3e693c20 3df694dd", + "3e827ae8 3f31da16 3f80dd62 3f31da16 3e408044 be5b48f3 3e408044 -> 3f259664 3f87d9a7 3f259664", + "3fa49df3 3f10420d 3f421028 3f421028 3ec2bca0 3f920481 3ec2bca0 -> 3d984880 bf3583c0 3e89ae56", + "3f2b87b1 3f6856ad 3f2b0672 3f6856ad 3f4dd80c 3e0282c5 3e7c3d5e -> 3ebcd484 3f1529d0 3f3e1601", + "3f0ee9c2 be01f5a6 be01f5a6 bc6560d4 3e8a75e9 3ee4a5bc 3ec5afaf -> be8e46a8 bec09f8a be6b0df9", + "baa8efe9 3ec12db6 3c95b2ed bdfe9738 3ec8c818 3df3017c 3f420286 -> 3ec16ff6 3c96f3a6 bdfc971a", + "3fba67c0 bc828530 3dab4f59 bdc11400 bdbabfd9 bdf9d80f 3f51f23c -> 3def54da 3e85c9f4 bfa4f056", + "3f853449 bddd0c34 bddd0c34 3ef9f097 3f933e5e 3d8f356e 3f6d03b3 -> bfa70bb6 be390a1c bef35cbb", + "3f95957f bdbe8fe8 be3ee183 3c90315e be2e38ed 3f6d71ac 3f9fb8ae -> 3dd8a396 bfa29a01 bfb866c1", + "3ebc6df4 3f3bd993 3f2fbd5f 3f42ed15 3f6452f4 3dbec7af 3ca17958 -> 3ecfa42a 3f26f696 3f4111ab", + "3f06491d 3f7a8f61 3f7a8f61 3f2ab3c0 3f2c0159 bde596a6 3ef5d0d3 -> 3f20558c 3f84ce97 3ed475fd", + "bde179b9 3f9e2673 3eca10da bddcdcb6 be2c4bac 3f522240 3f522240 -> 3f9bc771 3ef855db bc8f22c8", + "be126ff4 3f95441c 3f81e395 3f95441c 3f800000 00000000 3e800000 -> 3fa7921a 3f81e395 3f99d79c", + "3f93b54f 3f65e096 3f23eac0 3f65e096 3e7a9b39 be7a37e3 3ca9ecf6 -> 3f1d9447 3f6c1a68 3f5fbfdf", + "3fb4d376 be2b208e be2b208e 3eda1c59 bd94e6be 3f30b3e1 be3dc317 -> bd83e6a3 bf923481 3f301322", + "3f53f441 3f69a7b8 3d805bc9 bc489bef be70806c be018ea4 be018ea4 -> 3f8db7c6 3e2b7212 3dbd74de", + "3faf8743 3f55244e 3f78de95 3f945a3e 3f9c47a4 3f6e262d 3f6e262d -> bf5779e2 be9b6a8a bdeefaf0", + "be01c3d7 bdafb2a7 3f8a67a6 3f8a67a6 3f872008 3eac65cb be640a62 -> 3d448eca 3f8fddd9 3f86cae9", + "3f87609a 3f97c713 3f3c8f90 bc5f9e15 3e729de0 3f4de7cf 3e729de0 -> 3f6f67bf bde9b290 be8749c0", + "3fb4224c 3f920320 3ea0f8ea 3e6006c7 3f235f66 3f95640f 3f95640f -> 3e787148 bfa9fe82 bfb63be3", + "3f967572 3f9234b8 bdea86c9 3f28b17d 3f767ecf 3f1a1ac4 be6ad2bd -> 3c2aaa80 bf52759c 3f6db318", + "3d1d4e20 3f4e00e4 3e94dd61 3f2fff6e bd52dbef 3ed2a1be 3ed2a1be -> 3f4e8275 3e8cc689 3f2bf402", + "3f4838cb be38cf0a 3e01aa65 3eedcf79 3f6f1d6d 3f6f1d6d 3d9a4d60 -> bf6937cc bf1a9970 3ecfa3cd", + "bd81d9d2 3f9ac550 be73a04a be73a04a 3f8bc229 3f38aa70 3f84fc75 -> 3fa3a1c8 be44cac9 be302bec", + "bec7fab8 bdeb5e06 3f665c06 bdeb5e06 3f6db4b8 3d675822 3f6db4b8 -> 3e7db18d 3f6c01c7 3e7db18d", + "3f87256e 3e5e8479 3f54e60a 3e9d4e00 3e800000 3e800000 3e800000 -> bd3f198c 3f115353 3d314490", + "3e8c4096 3e92d2eb 3e85fa63 3f23cc65 3f0cc652 3f90a430 3f766f18 -> 3e0b65e4 bd441168 3ec095dd", + "be71f317 3f0c6255 3f2dd7dd 3f2dd7dd 3ed0834e 3f4f2693 3f92c9e6 -> 3f250488 3f5ec9de 3f733597", + "3ebfda2d 3dd78bf0 3e537bf7 3f622485 3f86faf0 3f8f3cc6 3f86faf0 -> be946d89 be59e5b3 3ef9f885", + "beac4417 3ea44d8d 3f1b33ac 3f1b33ac be1f3af1 3ecbaa5a be0064cf -> 3e898410 3f3d76d4 3f1066f0", + "3e9d6d07 3e9e9136 3ea99e44 be303619 3f400000 3f000000 3f400000 -> 3da1fdc4 3e35cf81 bece2cd2", + "3d753ea9 3f93b7d2 3e98481e 3f93b7d2 3f3c9840 3f16422d 3ecd47ef -> 3f8e1273 3e8649da 3f90a532", + "3f7c0d77 3f8cbfe2 3f269404 3f80b519 3f400000 3f800000 3f000000 -> 3eb8eb56 beaaf2e6 3f036376", + "3f2fb5b4 3f83b0b5 3f83b0b5 bde48eba 3f055bff 3f055bff 3e44ead8 -> 3f2bd8df 3f2bd8df be796faa", + "be2eba9f 3e352167 3cd8721c 3cd8721c 3f1dd8ee bc98c032 3f1dd8ee -> 3e906ef5 3cbe619d 3e06cac7", + "befb4ce9 3f8f7664 3ef8eade 3f4bfb46 3f9770a1 3f5c23dd 3f275d37 -> 3fd9cada 3f688216 3f8f104e", + "bea76458 3f5d209d 3ee42fdf 3f960398 3e800000 3e800000 3f800000 -> 3f720d28 3f07047a 3fbfdcae", + "3fa87c9c 3f6e4d50 3e895162 bddd1cbd 3f8ea0e5 3eb5eb65 3eb5eb65 -> bf092ebc be4c4958 bf135e9f", + "3f0bd66a 3eaa407d 3f7d90b6 3f7d90b6 3f000000 3f000000 3f000000 -> 3d735098 3f37a581 3f37a581", + "3ed3cdb7 3e997650 3f68df2f 3f8cc91c 3f24a2c7 3f24a2c7 3e81a520 -> 3d09fed0 3f24c3f4 3f7ec166", + "3f00ac01 bce8d7b4 bce8d7b4 3f8acc66 3f850ec1 3e596e86 bc9e3923 -> bf0d084c be0a6450 3f8c0a82", + "3f4dc2c1 3f3ab6db 3f4b70a5 bd7c0a48 3ee33e8e 3f8904be be0d76b6 -> 3ebec7be bd868b68 3d4ac472", + "3fb283c2 3eee20e3 3f42ea7a 3f6fe803 3de3629f 3e0df76c 3f8b41c9 -> 3e9ed916 3f116aed bf1485a5", + "3cbab321 bd88280f 3f3aa876 3f96e13e 3f9d7d64 3f9d7d64 3e703706 -> bdc195b6 3f337ac1 3f96320e", + "3f97c3ad 3e8a873d 3e8a873d 3ee760a0 3f495754 3f33afe1 3f495754 -> bf297532 bf0fc88e bef61100", + "3f922fa0 3e679089 3e679089 3f66ef48 be38c916 be38c916 3eb849b8 -> 3edd4d54 3edd4d54 3efb65e9", + "3f427bda 3d9e345f 3e36483e 3f399652 3f2b7af1 3f9f5b35 3f36f511 -> bedcff2a bf448e5e 3e3a6060", + "3fbcf64e 3f254762 3e637ffa 3ee3b090 3e7eb3f8 bd8b531e bd8b531e -> 3e8e8d8b 3ea52b88 3f0b8e0e", + "3ed1f25c be602160 3d131625 be602160 3e1c1caa 3f9819be 3f2cd0cd -> be90127c bee71741 befdcac3", + "3ee2085f 3d03d929 3d03d929 3f445554 be241b49 be241b49 3f1345ad -> 3dd2d208 3dd2d208 3f03512a", + "3f144c72 3f82eb20 3f4af2a3 3f8a4f29 3e05c61e 3f4eb478 3f864811 -> 3f7276a1 3ea66928 3ef21598", + "3f9dc89f 3ea0bcfc bcbbe7fb bcbbe7fb 3f7a0340 3e2e81db 3f5b3afd -> bf63d15a be6e99c9 bf8a0e9b", + "bdf8ff56 3ea25ffc 3ebf1de1 bdf0ee2c 3ed2c54e 3d1db1e7 3f4ca52e -> 3ebc0028 3ec18368 bca78828", + "3fb940f2 be030865 be030865 3f92b2b9 3f520924 3e6b51ab 3f5857f8 -> bfa85ef1 beebcdea bd9dbbc0", + "3faebf9b 3efbe127 be1e3331 3f7223b6 be31a4de 3e203dda 3ef6cecc -> 3f3a9216 bebc7b92 3e9354dc", + "3f425160 3eae98be 3f8528fd 3f8528fd 3f8485bd bcaae05f 3f48f513 -> bee3c526 3f872fce 3ee390c2", + "3ed19165 3e998ce5 3e998ce5 3e383a06 3f400000 3f400000 00000000 -> bbe809c0 bbe809c0 3e383a06", + "3fadf136 3f963f55 3ecc937e 3edcfcb3 3f289ba2 3f2cfd2d be5419fc -> 3e8ebd2a bf04ca6d 3f368d0d", + "3f2b5dcb 3f6cda71 3f33b36c 3f6cda71 3f43b622 3f8f6c27 3f43b622 -> 3ed3b028 bd450280 3ed3b028", + "3f3c89c3 3f8b6132 3f8b6132 3dd80e4e bd7216fc 3f124271 3f7d0d30 -> 3f90f38b 3f2b0ae4 bf1f5c12", + "bd123027 be085d16 3f752e64 3f752e64 3f4a9915 3e284075 bd5a4f0f -> bdd6e178 3f76aeb6 3f74b1ba", + "3f0312ab 3f2e671c 3f556d54 3f62d711 3ed72ffc 3f940616 be37a7c7 -> 3eeea0f9 3e77660c 3f7a5920", + "3e671803 3f5e7577 3d9ee1f5 3d9ee1f5 3eb6fb47 3cd9a27c 3eb6fb47 -> 3f49cfba 3d929a94 bb497e40", + "3cb7db0b 3f2c4620 3f2c4620 bda33a82 3f000000 3f000000 3e800000 -> 3f2966b4 3f2966b4 bdaeb833", + "3f356cb3 3f793d5d 3f46df02 3f46df02 3f000000 3f400000 3f800000 -> 3f1e8704 3e7b35f0 3d8b9278", + "be9ab4e5 3f8cfb18 3f1b24c5 3f9acc91 3f9a5c1c 3f2bb42e 3f1fbc6c -> 3fbb9f56 3f4f06a1 3fb2ee9f", + "3f392d96 3f90164a 3f054f9e 3f8630b5 be4f2db2 3e5a4ce4 3e5a4ce4 -> 3fa2d1e7 3ebbab04 3f64e74e", + "3f8d95fd be262a2d be262a2d 3e07438e 3ed860bb 3f6659e8 3ed860bb -> bf213699 bf942bc1 beabb653", + "be078506 3f1198d1 3f1198d1 be7cc772 3f4ab20d 3f5b8b9d 3f53a303 -> 3f2c6c1f 3f2ea6fe be0cbe82", + "3f2a3e1d 3f52dfc5 bdf256f6 be58f7cf bd1c44b3 3f6b029a bd1c44b3 -> 3f595e7d bf3a939e be3efcec", + "3e17e3a4 3d6fdd3a 3d6fdd3a 3f0a454f 3edf4b38 3ea1b301 3ea1b301 -> bbc8d500 3c3ff1f0 3efc8e86", + "3f816f01 3f545b28 bdd3159e bdd3159e bdb2d3bc bd827021 bd827021 -> 3f6af5b8 bd1e5efc bd1e5efc", + "3f653b17 3f80659a 3f80659a 3df7babe bdc7186e bdc7186e bca49e51 -> 3f8b8a07 3f8b8a07 3e0e4a53", + "3fb9fb0c be5aaf3c 3f0b25cf 3f026391 bdcf0865 be68b2c9 bdcf0865 -> bd888e48 3f5fac82 3f27fd98", + "3f6f88bf 3ea9e476 3d5d2a7f 3d5d2a7f 3f9c0889 3f9c0889 3dba1223 -> bf4f0c67 bf8b15fd bcfe144e", + "3f922855 3ebcc47e 3f741a77 3f8d121f 3f98250f 3f3ec033 3f3ec033 -> bf7d122d 3dd25910 3e80a9d2", + "3e0742ac be2cfdf4 bd078512 be7e54f8 3f87801b 3f87801b 3ee432be -> be9e16d3 be3110f6 be9d4f08", + "bef0eca6 3f4e5c52 3f8ee9d1 3f4e5c52 3e8ab2f0 bce193dd 3e8ab2f0 -> 3f6efe50 3f8d413b 3f6efe50", + "be4df9fa 3f5d7c0f 3f50995f 3dc2b269 bde17a12 3f5fc75c bda22894 -> 3f57d0b8 3f7d9ca9 3da21434", + "bed122ac 3f6e6f93 be5bf5d2 3f89f155 3f800000 3f800000 3e800000 -> 3fab8074 3e464f86 3f970380", + "3fa620bb 3f858700 3f858700 3e9928b8 be5a7c56 bb8dca00 be5a7c56 -> 3fa8f924 3f863f06 3f1378a4", + "3ef48b7c 3f9d8b59 be6634af be4cb992 3f159e9f 3f7e38eb 3f077bb1 -> 3f73a058 bf32f98d bee7c880", + "3f7d5737 be2925e7 3efc76b9 3f658f55 3d3d89a6 3d3d89a6 3f1539ad -> be580a4e 3ee50485 3ea3c4fc", + "3ee0fa88 3ede0202 3f9784e5 3f256fc3 3e104a46 3ef5a582 3ed09d67 -> 3ebe4e75 3f79117c 3eef3494", + "3f89141a 3f2776d2 3f45e4f8 3f45e4f8 3c21aee5 3e640f03 3c21aee5 -> 3f24c237 3f08d5ff 3f43305d", + "3fb1307f 3f6356f5 3f2fd42a 3f2fd42a 3ec2d7a0 3f6b3eda 3ee432e2 -> 3eb8f5ec bf15d1e0 3d8f0e08", + "bebc6f37 3f92c803 3f92c803 3c5e0a42 3eb0876f 3f924edc 3eb0876f -> 3fa30608 3fc8a0c0 3e0fd0ca", + "3f2e0703 bdbd7d3f 3f9a45cb be4a54e3 3f400000 3f400000 3e800000 -> bf1a34ea 3f320654 bebc2df3", + "3fa94a00 3b639358 3e8cd798 3e8cd798 3d3f7f7e 3f82dd6a 3f82dd6a -> bd6f0bd4 bf89de18 bf89de18", + "3f59704e 3ea8a169 3f675953 3f675953 3e7234a9 be39d1cb 3f16d8c0 -> 3e0389ee 3f876735 3ece72d6", + "be6283c2 3e867791 3f82773e 3f05c6db 3f0f186c 3f0f186c 3e89a089 -> 3ec5c62c 3f924ae5 3f14ffad", + "3f9a1068 3f141dc0 3f9a46f9 3db24380 3f678b97 3d2ce365 3e85b9f9 -> bf0293e0 3f93c63b be68c806", + "3f4964de 3f61a676 3f4eeda9 3f622a84 3f58c08e 3e946b28 3ec31eab -> 3e5c877c 3f148c5a 3f156a89", + "3fb2831e 3f85c88f 3f38055c 3f38055c 3ee73de7 3f9d9cd3 3e2d467a -> 3ed4a346 bf7f99b6 3ef736f9", + "3f890d79 bbdf2363 bbdf2363 3c0ada2b be36cfcd 3f3d55b0 3f7bc2c3 -> 3e3cc48c bf4c77eb bf85b2c6", + "3f47f367 3e741553 be6e7203 3f957616 be6e264a 3f78c349 be6e264a -> 3ed70bc2 bf7de8d4 3facb65c", + "3fb2d118 3f48790c 3e7ec431 3e7ec431 3eab14b4 3f2741dd 3e99fd38 -> 3ea1f1d6 bf29f7c4 be2f7b2b", + "3f62f75e 3f0e4ac0 3e3978d2 3f8dd928 3ea6224e bc3eb0a6 bc3eb0a6 -> 3e894aaf 3e4409d5 3f8f2b48", + "3f5a054d 3e843a09 3e843a09 3ef948f3 3f24b98f 3f100c99 3f8aaf6e -> be9458d1 be6242c6 bedf2819", + "3e3ec661 3f51cea6 3f997043 3ddf6c3c 3e02f7e1 3e29b122 3ebbc58e -> 3f4bb50f 3f957c9b 3d26fc36", + "3e92db6c 3ef5ec41 3e250856 3e26cf69 3f3f4c3b 3f1240ad 3f1240ad -> 3e882ed0 bb310940 ba7d1200", + "3e40429b 3f2d0375 3f8bbbd9 3e371f55 3ed6c273 3f59adb3 3ed6c273 -> 3f18da3e 3f6e98f8 3dccf4f4", + "3f4c5854 3f886103 be2f3237 3e975338 be67de2f be67de2f 3f4e86cb -> 3f9f83a5 3c1e2d70 beb26220", + "3fa772c5 3ef09fc4 3ef09fc4 3e0ad639 3f9eb7b4 3f32d5fd bd320b9c -> bf937a0c bee34750 3e4510ec", + "3dc23a33 3f004d33 3f004d33 3ec86882 3f6e1bf6 be2345f0 3f6e1bf6 -> 3ed37092 3f042c34 3e9b3eae", + "3f5e9368 3f804d32 3f757c03 3efeaafe 3ed746de 3e388000 3ed746de -> 3f2304af 3f4d61b4 3e06ff28", + "3fbf4249 3f0b85b2 3f4f4380 3f88e004 3efffc0e 3f9a9c08 3f4208f9 -> be4ee690 bf7ec64a bd816eb0", + "be0908a5 3f98f875 3f04687a 3f04687a 3eb303fb bdec6a70 bd9b5156 -> 3f9ef5a8 3f007412 3f01cf5c", + "3dd86341 3f049d46 3f3c03b3 3f3c03b3 ba4da779 3f2bf0ca 3eb7cbf5 -> 3f04a2b5 3f29d8f8 3f324dfd", + "3f81fdbd 3f73f882 be42a29d 3f73f882 3f000000 3f800000 3f000000 -> 3ee3f58a bf9a5211 3ee3f58a", + "3f779b9f 3f2d50ee 3ef44278 3ef44278 3de52855 3de52855 3e58a3b4 -> 3f119c47 3ebcd92a 3e8b7da6", + "3eae4632 3a4af634 3a4af634 3df19a16 3f93b79e 3e9e4082 3f981611 -> bec8b922 bdd5e08e be92aae2", + "3f326a38 3f9ca81c 3c58b402 bdda3af2 3f1bc4be be7a8bfa 3f553000 -> 3f4cc0ca 3e3c2889 bf2fdb33", + "be80fd4d 3f6bb724 3f998904 3e62c4ea 3d88b47f 3f2e8d7f 3e4f640d -> 3f70053c 3faf85e2 3e8b8244", + "3fa6ab70 bd8a6800 3e1347e4 3f51e665 3f0da810 3f090348 3cba6bd2 -> bf49c0af bf0d95cb 3f4a5078", + "bea3da5c 3f861732 3f770200 3f861732 3e27e8be 3ec6e911 3ec6e911 -> 3f8cceb9 3f8b6b02 3f960134", + "3b86c3e3 3f95ae08 3f5e95c7 3f5e95c7 bda1e9cd be411ea6 3d399859 -> 3f95b8b0 3f5ec89c 3f5e8991", + "3d07c412 be2f3e2e be2f3e2e 3f95b500 3ed93c86 bdba397d bdba397d -> be3da4d7 be2c2816 3f9617c3", + "3f91b988 3f4ed8a6 3f00055e 3f4ed8a6 3f84ab5c 3f84ab5c 3f8e46c6 -> bebe7860 bf2e0f78 beea384c", + "3f4026ec 3ea56d1f 3f17541a 3e07f83c 3f04288e bd9105a4 3f9cf7ac -> bd83df98 3f24ef63 bf49a52e", + "3fa51491 3e0a44a8 3d304978 3e0a44a8 3ebd8ab5 bd87a309 3e9de4c6 -> beaf50ee 3e038958 be867ff2", + "3f9b6565 3f945ea8 3f983ede 3f941e02 bcdc46fb bcdc46fb 3d9c8971 -> 3f988c5a 3f9c6c90 3f883d5b", + "3dcf14cf bdd2f3c4 bdd2f3c4 be02fcdd 3f498dbf 3f2b13c9 3f2b13c9 -> be3afee2 be2eab56 be482e50", + "bda0a3e8 3f930dde 3e6159b1 3ce75b95 3f5882ee bdc613ec 3d1cca23 -> 3f9b8ba5 3e5994fd 3cfff443", + "3eb53806 3e080c6d 3f732355 3f9cb898 3f546872 3f546872 3f42112c -> be24ac3b 3f27f52b 3f74c0e2", + "3fa6b78e be3c48bf 3f455bfa 3eb33928 3e974f63 3e5bc8ee 3f125aea -> bf119c27 3efb9612 beca0668", + "3f918530 3f2fe378 3f54ebd2 3f54b63a 3f0c03e2 3ead0de9 3f0c03e2 -> 3d85ab08 3ee519d1 3e56208c", + "beaf3f8d 3e89c8c9 3e89c8c9 3f77ca01 3df6c004 3eadb038 3df6c004 -> 3e9ee61a 3ec53c13 3f812c55", + "3edb6791 3eabcdcc 3f4b3118 3f1843dd bca8e90f 3f392128 be53264e -> 3eb053ea 3ef7b7ee 3f2ee2c3", + "bebe2405 3ec4735d 3f0143f7 3f98c4b5 3e954629 3df6c51f 3f388679 -> 3efbe2e6 3f0cb887 3fbb0826", + "3f10919d 3f253dd5 3f1b7283 be3ecd4e 3e850944 3f25145b 3e88c462 -> 3eff5ac8 3e78e4a8 beaca2e9", + "3f3898b1 3f8a14b5 3f8aba95 3f8aba95 3f9b9415 3f8f3eff 3e950d2a -> 3e4f2bd4 3e8dbf76 3f5fb7fc", + "3ec8113b be01625d 3d978a2c 3f92c145 be62c6c4 be2aebe9 be2aebe9 -> bd23145a 3e0e8efe 3f9b1a82", + "3dfec8e9 3f1e217d 3f5f02b1 3f5f02b1 3eb8a48b 3f15a356 be2faa67 -> 3f12a53a 3f4c6501 3f647958", + "3fa50551 bd5c5872 be3e575d 3df4e81f 3e6a4621 3ed66eee 3ed66eee -> beb28f1f bf39cfca bed739de", + "3f8a14ff 3f1edba0 3f1edba0 bdc5b1b6 3d5ec23a 3f93a4bc 3f3271db -> 3f0fd6c1 bf1fb006 bf59363c", + "bea975db 3eef4601 be4f3a78 3f388ffe 3e80ea80 be1dd793 3e80ea80 -> 3f0cf88a be81bc3b 3f4de588", + "3fa6940d bd86a792 3eb6f145 bd86a792 3f1d868a 3f9b6588 3f9b6588 -> bf5dd5a1 bf9c7f19 bfd2a5e3", + "3f1f2b8d 3f3eee0e 3f114053 3ed15eb9 3f67b3f2 3e4519dc 3f67b3f2 -> 3e3b7780 3ee53a5a be1d8346", + "bee520f7 3f0c25f9 3f9c97a7 3f0c25f9 3f815d28 3f086f53 3f3c97be -> 3f7feef6 3fbb1ef1 3f608bfc", + "3f0b7da9 3f31d751 3ec220f4 3f94947f 3ee0a06f bdbb5d66 be11479a -> 3ee94943 3edba6e0 3f9e79a5", + "3fb78f06 3d2e4c05 3f653821 3c630e40 3e359cc1 3f81eac9 3ef6ca55 -> be58de09 bf0f658b bf2d684b", + "3ebf3517 3ed9adea 3f0eccf2 3f658b5a 3f358dde 3ee289ff 3f751066 -> 3e2426d6 3ec8ffec 3f0a0652", + "3f9274b9 be2a2f2b 3f744b8a be2a2f2b 3f000000 3f400000 3f000000 -> bf3d0084 3dc4e3a0 bf3d0084", + "beff9a3c 3f8569b3 3f8569b3 3f72fb6a 3f235e09 3f6b9fd5 3f235e09 -> 3fae30f9 3fc03a3e 3fa244fb", + "3f493c1a 3ea0b2f0 3f37e2b4 bd775ff5 3eee2c42 3f60e102 3efa18a0 -> bd542dd0 3ce3a7c0 bee3840b", + "3e7bb7be 3f6b6879 3e0ab75a 3e9a3612 3efeeb11 3f46b760 3efeeb11 -> 3f4c138b bd62b448 3e37186c", + "be536c08 3f740e12 3ca4a124 3f740e12 3f1b5937 3f4f8609 3f1b5937 -> 3f8a108c 3e3ff730 3f8a108c", + "3f864ff5 3f0d2d92 3f85faf6 3f0d2d92 3f4053de bc7f4fa9 bd40d462 -> be728978 3f8812c3 3f19d2ff", + "3f4c5d8c 3eb4c318 3c86fbc7 3f982e40 3ef3a6ec 3f98d4dd 3e200618 -> bcdbef50 bf6fcb14 3f883655", + "3d383c48 3f5eb1af 3f5eb1af 3f789e9e 3f390d42 be0c2cae bd6b2a90 -> 3f565edd 3f604533 3f7947dc", + "3e947e28 be08a55d bc216872 bd281eb8 3d7699fb 3eff63e0 3d7699fb -> be1a86ae be1e3a20 bd6fa3fe", + "bef05c30 3f62e777 3deb9718 3f334a40 3f1c70f1 3efb57bd 3f2361cc -> 3f962c4a 3eb0e428 3f7ffd82", + "be049b33 3e204599 bd7656e0 3e74e685 3f7e578e 3f83df40 3f4c7385 -> 3e920278 3d9610ce 3eaf6704", + "3e1229cc 3ecb383b 3f91bd48 3f8e3cbc 3f58b083 be404097 3f2ce740 -> 3e8d5c35 3f952b6a 3f81e5b8", + "be11f173 3ee0fa04 3e1914ce 3e1914ce 3e5128fb 3e5128fb bda06207 -> 3eefe1b3 3e36e42d 3e0da6f5", + "bee79383 3e50a317 be0c1cb8 3e46d7aa 3f400000 3f400000 3f400000 -> 3f0b0017 3e4f408c 3f088d3c", + "3f37c9e2 bdfda06f 3e639c5e 3f578985 3eb9b619 3f0e6da0 3f858ce0 -> bec4bbbc be35665e 3dbe3bd0", + "3f6d2bd5 3d2f235c 3e4d9f1f 3d2f235c bd3632b4 3f95875d bd3632b4 -> 3dabf7c0 bf61a80e 3dabf7c0", + "3fa934c0 3f1da85c 3dfecaf1 3dfecaf1 3f634220 3e91e777 3ea60678 -> bf0ec29a be812d00 be9bc63a", + "3fbea482 3f900758 bd07e8b4 bd07e8b4 3f04fedc 3f6acf7d 3f6acf7d -> 3eb3f2e8 bfb31c29 bfb31c29", + "3ef48765 be61de80 3ecfba9b be61de80 3e65797a 3f3c91d4 3f7dfc55 -> bea7bb8a 3d5cdf10 bf31c50a", + "bcedcc34 3d298e05 3f6c817b 3f1f12f4 3e421c22 3ebc05b6 3f01f515 -> 3d4017e1 3f6f3c18 3f22d8b0", + "3fa24843 be33eb89 3de8e6cb 3de8e6cb 3f7aea2e 3f39d8c7 3ee995d6 -> bfb58c76 bf4e826e beedebcf", + "3f7ed82b 3f5f633e 3f4a1c2b 3f5f633e 3f8032c0 3f2d203b 3f8fa854 -> bdfecfc0 3dee2000 be7a8598", + "bee89c8a 3f7d3966 3f240b5b 3f4021ef 3f800000 3f000000 3f800000 -> 3fb8c3d6 3f5e327e 3f9a381a", + "3ea26d24 3e2b1938 3e2b1938 3e579661 3ed95351 3dcd120b 3ed95351 -> 3d04d760 3e0a9202 3d9b6602", + "be550145 3f21a68e 3f21a68e bd82fbb7 3ebcebe6 3f9dee8d 3eece8cf -> 3f354cb5 3f635ab0 3d044652", + "3f7a3ec1 be0208e2 3f73298d be0208e2 3f83048b 3e1f1bf2 3f83048b -> bf9053aa 3f4c477a bf9053aa", + "3f6b80b8 bddaec29 bddaec29 bd60957d 3e5067ce be48ff8f 3d9e28a2 -> be969714 3d96e329 be00e4c9", + "3e830c72 3e35cf16 3f98ca5f 3f4737c7 3e682727 3f5a0c4a 3f913b4b -> 3df4c6da 3f79c54c 3ef9bec0", + "3f91d667 be4498c2 3ec8b394 be4498c2 3e800000 00000000 3e800000 -> bef422c8 3ec8b394 bef422c8", + "3f6b5343 3d51e17b bd0ec924 be7f7ab3 3e024516 bddd6776 3f8a38f8 -> bd868ed6 3d84216a bf9efe97", + "3edc6847 3f32c29b 3f2346c6 3f2346c6 bd272ef6 3f8c0487 bd272ef6 -> 3f37421e 3e2ae766 3f27c64a", + "3f87e25f be11e13f 3da92b17 be51fa77 3e9ca854 3ea90fb3 3c5cd605 -> beef3f36 be892ec6 be60a17b", + "3f805bc3 3f988d7a 3f22979c 3d11063e 3df581fa 3f8f0a6a be2c2da7 -> 3f892a5a bef8949c 3e50eaa4", + "3f86de61 3ee748b3 3eb6e925 3ee748b3 3ea37989 3ea37989 bded1393 -> 3dec25d4 3caa9e70 3f12dde6", + "3f597132 3f4f3f76 3f47fb28 3f9fa8a0 3f400000 00000000 3f400000 -> 3e30aa40 3f47fb28 3f1c3c5a", + "3f56d900 bc85c235 bc85c235 3e05a20c bd946cdb 3efa7d8d 3efa7d8d -> 3d364084 beda956b be8f6842", + "3f920882 3ec526a4 3e46a785 3ec526a4 3f7e1e07 3f94075a 3f7e1e07 -> bf3f57d2 bf900d48 bf3f57d2", + "3eb99d17 3f490a89 3f412887 3f412887 3e4db4b7 3f26afeb 3f4ce554 -> 3f3665cf 3f04bad2 3eedc199", + "be811343 3ec1b852 3f3b7969 3f3b7969 3f099afd 3eee5653 3f6aa8b8 -> 3f038ce3 3f598445 3f76a1bf", + "3f23d1ab 3f91f7c9 3efea368 3d88e70d 3f847134 3dfb5956 3dfb5956 -> 3ef4dcf0 3ed66d78 bc3f8588", + "3e0b0068 bd9ebad5 3f917ef6 3f917ef6 3f414bae 3f6d0838 3cebaaac -> be3851d0 3f81687b 3f90ff00", + "3f968817 3f3271a8 3f3271a8 3f641d48 3f88e393 bde8d7ad 3f88e393 -> bf0f86ce 3f54ac32 bebbb65c", + "3c9425ed 3f30dcb0 3f080af8 3f30dcb0 be7683a3 3f65a7f8 3f4e5152 -> 3f31fa01 3f03e3bf 3f2d2183", + "3f7b829d 3ec25f4d 3ec25f4d 3f6aa80f 3f67df15 bb7a326e 3f94a38f -> bf029e60 3ec44aeb be65a15c", + "3debe698 3f7d47af 3f7d47af 3f15e7f3 be5ef1f3 3f41d73e 3f41d73e -> 3f81d99b 3f66f3c9 3eff281a", + "3f2b7db1 3f5552ff 3f8c64d8 3f5552ff 3f52a860 3a8789f3 3a8789f3 -> 3e906a32 3f8c4e25 3f552599", + "3fa9b5fe 3e04d70e 3e04d70e 3f12ef17 bbff081e 3f0c6a35 3f8046c3 -> 3e0f6829 bf18f61c bf413889", + "3ee12303 3e2de4f3 3e6c1e0a 3f24cb4e bdb89c5a bdb89c5a 3e54c176 -> 3e567b9e 3e8a5a5a 3f0d67ea", + "3f32742f bd7d836d 3e84eebe 3f03ce41 be28f84e 3f77b6a6 3f77b6a6 -> 3d59a1eb bed46c1a be237cac", + "bebf610e 3f9c1511 3f109224 3f0b6543 3f86ad6b 3f9acd77 3f6474fb -> 3fce6c4a 3f822610 3f60ca35", + "3fb21b17 be3d0fa1 be3d0fa1 3e2cc3b7 3f72452c 3f72452c be38cfd4 -> bfc02fb0 bfc02fb0 3ed6f5ec", + "3e60ad13 3decefa6 3f4fae9a 3e95f14d be1537fe 3f20d0ac 3f20d0ac -> 3e17354b 3f2c65c6 3e1ebf4b", + "3f876ce8 3f6deb2b be4fedd3 3f6deb2b be3fbc3e 3f892e0b 3f892e0b -> 3f90510b bfab2101 be516d8c", + "3e53f0f9 be558c05 3ee6b1bf 3e8960a1 3e6ac33f 3e6ac33f 3e71db4c -> be831180 3ece6642 3e60b268", + "3f84e45c be1edb5a 3da3d996 3f0446c1 3f400000 3f400000 3f400000 -> bf6f0d60 bf32db57 be861f92", + "3ef810c3 3f650980 3f650980 3f3c9b2e bd84f2cc 3dfbf7c3 3f7db46c -> 3f6d16bf 3f55c6f8 3e835ef7", + "3f0e5799 3f677858 3f677858 3f9b7d4a 3d396053 3d396053 3ea993f3 -> 3f61072a 3f61072a 3f83eac4", + "bd18b329 3ee37a55 3dd06359 3c1ea04a 3f83efe7 3f31fa5b 3c161c46 -> 3ef72707 3e02bbfa 3c2438e7" + ] + }, + { + "function": "cycles_mix_div", + "node": "ShaderNodeMix RGBA DIVIDE", + "cases": [ + "00000000 00000000 00000000 00000000 3f4b28c3 3f7e7a19 3e85f8ba -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f2d4ec1 3f3df2d6 3f7b7c27 -> 00000000 00000000 3e812626", + "3f800000 00000000 00000000 3f000000 3f784b92 3f784b92 3e78de87 -> 00000000 00000000 4003aae3", + "3fc00000 00000000 00000000 3f400000 3e8ffc77 3e8ffc77 3e075037 -> 00000000 00000000 41023798", + "bf000000 00000000 00000000 3f800000 3f1b2632 3f8d3296 3df11e41 -> 00000000 00000000 c02fcce2", + "3e800000 00000000 3e800000 00000000 3f800000 00000000 00000000 -> 00000000 3e800000 00000000", + "3f400000 00000000 3e800000 3e800000 3f9534ba 3f9534ba 3e1f6eb8 -> 00000000 3e64b640 3fa22591", + "40000000 00000000 3e800000 3f000000 3e800000 3f000000 3f800000 -> 00000000 3f400000 3f000000", + "00000000 00000000 3e800000 3f400000 3ec8c892 3e22ac4f 3e22ac4f -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3eeba4d7 3f82a060 3eeba4d7 -> 00000000 3e7d6d25 3fcb0eaa", + "3f800000 00000000 3f000000 00000000 3f2ef816 3f2ef816 3e5f9656 -> 00000000 3f3b475f 00000000", + "3fc00000 00000000 3f000000 3e800000 3f400000 00000000 3f400000 -> 00000000 3f000000 3ec00000", + "bf000000 00000000 3f000000 3f000000 3f62bc50 3f561bde 3f2174ce -> 00000000 3ee6f4d4 3eb50c16", + "3e800000 00000000 3f000000 3f400000 3b8a049c 3ea30d8b 3b8a049c -> 00000000 3f447b94 42345050", + "3f400000 00000000 3f000000 3f800000 3f3e6215 3eefae26 3e62d0a5 -> 00000000 3f6d12bd 4068b48a", + "40000000 00000000 3f400000 00000000 3dd17870 3f4e7189 3f092248 -> 00000000 3f8e16e0 00000000", + "00000000 00000000 3f400000 3e800000 bdce6873 bdce6873 3f35eeaa -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3efe6b8f 3f8d5ab9 3f8d5ab9 -> 00000000 3f36ee32 3ef3e842", + "3f800000 00000000 3f400000 3f400000 3f5c58aa bdc0fcb7 bdc0fcb7 -> 00000000 c0feb0c5 c0feb0c5", + "3fc00000 00000000 3f400000 3f800000 3f0c5740 3f0c5740 3eb7b976 -> 00000000 3fd6acc2 406b87f4", + "bf000000 00000000 3f800000 00000000 3f36ea56 3e38d26c 3f08378d -> 00000000 bfa29704 00000000", + "3e800000 00000000 3f800000 3e800000 3ee00965 3f28d259 3f28d259 -> 00000000 3f90864a 3e90864a", + "3f400000 00000000 3f800000 3f000000 3f000000 3f400000 3f800000 -> 00000000 3fa00000 3f000000", + "40000000 00000000 3f800000 3f400000 3f8ed3d3 3f8ed3d3 3edc5377 -> 00000000 3f4ad8f0 402f166b", + "00000000 00000000 3f800000 3f800000 3e2a3e3c bdca6d68 bd211a0a -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3e3a2631 3f40aa6f 3f01815c -> 3f5007e6 00000000 00000000", + "3f800000 3e800000 00000000 3e800000 3ee41076 3e4fa852 3f325323 -> 3f0fadc4 00000000 3eb7c130", + "3fc00000 3e800000 00000000 3f000000 3f428b8c bdfb9fd7 3f4e0fcc -> 3ebca6a3 00000000 3f2e87ce", + "bf000000 3e800000 00000000 3f400000 00000000 3f400000 3f000000 -> 3e800000 00000000 3ec00000", + "3e800000 3e800000 00000000 3f800000 3f2026f6 3b7bd59c 3f96ca4d -> 3e9326be 00000000 3f7653be", + "3f400000 3e800000 3e800000 00000000 3f92cadf 3f441430 3f1bb262 -> 3e676b88 3e9d565b 00000000", + "40000000 3e800000 3e800000 3e800000 3ecb3841 3ecb3841 3f346975 -> 3f813e82 3f813e82 3eeb41ee", + "00000000 3e800000 3e800000 3f000000 3f0018e9 3f58bf76 3f3fb8af -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f75a598 3e22e2cf 3f75a598 -> 3e82b287 3f692be1 3f440bca", + "3f800000 3e800000 3e800000 3f800000 3efb50c2 3eb858c1 3eb858c1 -> 3f0262cc 3f31c085 4031c085", + "3fc00000 3e800000 3f000000 00000000 3f98c1a1 3f9b6cea 3f46b24a -> 3e41c46c 3ebc3dde 00000000", + "bf000000 3e800000 3f000000 3e800000 3f9d8c57 bdb5525b 3ec88004 -> 3e8c00d3 4064b7ac 3d648c90", + "3e800000 3e800000 3f000000 3f000000 3f07244a 3f5af669 3e841c98 -> 3e9c9e2a 3f0569ad 3f5c042a", + "3f400000 3e800000 3f000000 3f400000 3f0f5bfc 3f9f6bad bcf64906 -> 3ecb6ded 3eda2882 c1942e1b", + "40000000 3e800000 3f000000 3f800000 3f7e2fdf 3f7e2fdf 3edadb35 -> 3e81d370 3f01d370 406b729a", + "00000000 3e800000 3f400000 00000000 3ebfcbee 3f1f4df3 3ebfcbee -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f8352ba 3f3cd460 3f8d3dc7 -> 3e7cc2cd 3f62262b 3e740004", + "3f800000 3e800000 3f400000 3f000000 3e8b3e9a 3e8b3e9a 3f822cc8 -> 3f6b53b7 40307ec9 3efbb90b", + "3fc00000 3e800000 3f400000 3f400000 3db8e301 3f5291e2 3dfb963d -> 4080ecb4 3f7e22b6 410c86a3", + "bf000000 3e800000 3f400000 3f800000 3f29ed7f 3f6d1919 3f6d1919 -> 3e3f2a42 3f3858c0 3f75cbaa", + "3e800000 3e800000 3f800000 00000000 3ef218d4 3ea42912 3ef218d4 -> 3ea3ace4 3fc3ce08 00000000", + "3f400000 3e800000 3f800000 3e800000 3f913651 3eb1dd32 3dd6f833 -> 3e693df4 401a2c47 3feca578", + "40000000 3e800000 3f800000 3f000000 3f86fff2 3f9b45d6 3f86fff2 -> 3e6573de 3f2611f0 3ee573de", + "00000000 3e800000 3f800000 3f400000 3f3d5d48 3f3d5d48 3f5df470 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 be716a4b bc5c3bad 3f9e06fa -> becf7746 c212c9ad 3f67ada6", + "3f800000 3f000000 00000000 00000000 3f70d01c 3e8a9f14 3f00e4d3 -> 3f08128b 00000000 00000000", + "3fc00000 3f000000 00000000 3e800000 be0a7f38 3e60733a 3e60733a -> c0b972ad 00000000 3fcafd11", + "bf000000 3f000000 00000000 3f000000 3f9f9961 3f20b2ab 3f498abd -> 3f0cabe1 00000000 3edd69db", + "3e800000 3f000000 00000000 3f400000 be7fddfe 3f65161b 3e4b458a -> be00440c 00000000 3fc0e6fa", + "3f400000 3f000000 00000000 3f800000 3e0b3539 3f887c5e be7c4a59 -> 40388aad 00000000 c032d2b6", + "40000000 3f000000 3e800000 00000000 3f9d42b9 3f9d42b9 3ed5b7ef -> 3ea0bc24 3e20bc24 00000000", + "00000000 3f000000 3e800000 3e800000 3e57f390 3f960999 3e57f390 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3e800000 3e800000 3f400000 -> 3fa00000 3f200000 3f155556", + "3f800000 3f000000 3e800000 3f400000 3f168e5f 3db23b99 bcff4864 -> 3f59a57a 4037d975 c1c08a18", + "3fc00000 3f000000 3e800000 3f800000 3f896964 3e485ae1 3f327609 -> 3ee5b2e8 3fe55316 3fd36be2", + "bf000000 3f000000 3f000000 00000000 3f800000 00000000 3f800000 -> 3f000000 3f000000 00000000", + "3e800000 3f000000 3f000000 3e800000 3f39f4ed 3e44caeb 3edfe5ad -> 3f0c0da2 3f834151 3ea92d2c", + "3f400000 3f000000 3f000000 3f000000 3f79e4d8 3f629ee3 3f629ee3 -> 3f025882 3f0c720f 3f0c720f", + "40000000 3f000000 3f000000 3f400000 3f9ef337 3f304420 3f9ef337 -> 3e9c4e3c 3f73cd2e 3eea755c", + "00000000 3f000000 3f000000 3f800000 bdd3494d 3f7de2dc 3f7de2dc -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3e800000 3f000000 00000000 -> 3fa00000 3f900000 00000000", + "3f800000 3f000000 3f400000 3e800000 3f877c30 3f1b7c76 3d908faf -> 3ef1db5a 3f9e0f1f 4062ac0c", + "3fc00000 3f000000 3f400000 3f000000 3f76994a bcbd1e21 bcbd1e21 -> 3f0751d9 c2446d1e c202f369", + "bf000000 3f000000 3f400000 3f400000 bbb0da68 3f84ec92 3f69df2f -> 423c489e 3f438e68 3f36eab3", + "3e800000 3f000000 3f400000 3f800000 be38c0cd 3e5d6845 3f63f3a2 -> bea2b8d6 3fb6ffc2 3f83effc", + "3f400000 3f000000 3f800000 00000000 3f287aef 3f231734 3f287aef -> 3f31de67 3fb6b070 00000000", + "40000000 3f000000 3f800000 3e800000 3c3c3e6a 3e81e428 3f47a8f4 -> 42ad1277 40dc45c9 3ec83cf0", + "00000000 3f000000 3f800000 3f000000 be5128b4 3ea5daaf 3f351eb0 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3f800000 3e800000 3f000000 -> 3f000000 40200000 3f900000", + "3f800000 3f000000 3f800000 3f800000 3f0035f0 bcc16cb0 3f9a2f73 -> 3f7f944d c22968e3 3f548600", + "3fc00000 3f400000 00000000 00000000 3f88bbbc 3f979263 3f88bbbc -> 3f2d9ae6 00000000 00000000", + "bf000000 3f400000 00000000 3e800000 3f5c34b2 3d2d8f58 3e044dba -> 3f306534 00000000 bf17ac39", + "3e800000 3f400000 00000000 3f000000 3f98bd9a 3f97d716 3f8e3574 -> 3f38399d 00000000 3ef99afe", + "3f400000 3f400000 00000000 3f400000 3ee07b8b bcf9aca5 3ee07b8b -> 3fbc37b7 00000000 3fbc37b7", + "40000000 3f400000 00000000 3f800000 3edafda8 3f9ac9df 3f124627 -> 4030729f 00000000 40200494", + "00000000 3f400000 3e800000 00000000 00000000 3f400000 3e800000 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 bdd7cd0a bdd7cd0a 3ea65111 -> c04bc3f6 bf87d7f9 3f0282c8", + "3f800000 3f400000 3e800000 3f000000 3e71c44a 3c1a5d5c 3c86306a -> 404b4dab 41d446cb 41f43153", + "3fc00000 3f400000 3e800000 3f400000 3f3ab5d7 3db04f10 3db04f10 -> 3f957086 4087644b 414b1670", + "bf000000 3f400000 3e800000 3f800000 3f47431d bdf4e177 3f629106 -> 3f24aa3d 3fb5cfe5 3f6f5f13", + "3e800000 3f400000 3f000000 00000000 3f84a1b8 3e29c548 3f4b1c2d -> 3f3e52e2 3f9081b6 00000000", + "3f400000 3f400000 3f000000 3e800000 3f800000 3f400000 3f800000 -> 3f400000 3f200000 3e800000", + "40000000 3f400000 3f000000 3f000000 3becabcd 3ec9057d 3f151eb7 -> 434eee3d 400301eb 3f9bbe16", + "00000000 3f400000 3f000000 3f400000 3f9828ad 3f237af7 3c73ea2b -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3e800000 3f000000 3e800000 -> 3ff00000 3f400000 40200000", + "3f800000 3f400000 3f400000 00000000 3e1cb1ee 3e963f6c 3f900ba8 -> 409cd6f5 402391e1 00000000", + "3fc00000 3f400000 3f400000 3e800000 3f5ee5fb 3f1b1994 3f5ee5fb -> 3f6ac504 3fbdadd6 3e9c8358", + "bf000000 3f400000 3f400000 3f000000 3f8551b0 be7c42aa 3de0c04c -> 3f43d485 40296c52 bfc397f6", + "3e800000 3f400000 3f400000 3f400000 3e800000 3e800000 3f000000 -> 3fa80000 3fa80000 3f700000", + "3f400000 3f400000 3f400000 3f800000 be5548b6 3f686a1d 3f416c4c -> c020d707 3f4e9cf8 3f9f0eec", + "40000000 3f400000 3f800000 00000000 3f68c33c 3e9157f4 3e719b9c -> 3f6655f8 40c173b7 00000000", + "00000000 3f400000 3f800000 3e800000 3e24d3cc 3f2600ca 3f01fc7a -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3ef65667 3de4d179 3de4d179 -> 3f93c3fc 409f3492 401f3492", + "3f800000 3f400000 3f800000 3f400000 3dd3c638 3dd3c638 3f93dd73 -> 40e8189e 411abb14 3f2634a4", + "3fc00000 3f400000 3f800000 3f800000 3eb953ba 3e9113f8 3e9113f8 -> 402ee9c8 40996606 40996606", + "bf000000 3f800000 00000000 00000000 3f901fa4 3f8f54b6 3f901fa4 -> 3f8728ef 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 3f9669df bc129aa0 3f90fe74 -> 3f767693 00000000 3e787fb8", + "3f400000 3f800000 00000000 3f000000 00000000 3f000000 3f800000 -> 3f800000 00000000 3f000000", + "40000000 3f800000 00000000 3f400000 3f888f2b 3ebe6894 3f67b733 -> 3f5fe8ae 00000000 3f683e82", + "00000000 3f800000 00000000 3f800000 3f933ef1 3ed5235e 3f1184d3 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f2a13d6 3f5c62cf 3f2d4f49 -> 3fa05523 3e8a57a1 00000000", + "3f800000 3f800000 3e800000 3e800000 3f46f36e 3f46f36e 3f9cb3b9 -> 3fa4b437 3ea4b437 3e511c38", + "3fc00000 3f800000 3e800000 3f000000 3ececbb2 3f5e7785 3f31b407 -> 404daf13 3e9cf0d6 3f549892", + "bf000000 3f800000 3e800000 3f400000 3eb51797 3f57c569 3f7920cf -> 3db0daf0 3e6822a9 3f3d5a1b", + "3e800000 3f800000 3e800000 3f800000 3f182e82 3f96348a 3e9eabd0 -> 3f95d495 3e7689e9 3fc741f2", + "3f400000 3f800000 3f000000 00000000 be43ac72 bda839c0 3e09b55c -> c06b319d c08e16ed 00000000", + "40000000 3f800000 3f000000 3e800000 3d98b51a 3f68f607 3f68f607 -> 41ce948c 3f195142 3e995142", + "00000000 3f800000 3f000000 3f000000 3f3fbfac 3f96a181 3f8db3d3 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3d6f2bc3 3f019653 bdf52283 -> 411101b1 3f3e6ea7 c0308294", + "3f800000 3f800000 3f000000 3f800000 3f5306e5 3f8902e8 3f8902e8 -> 3f9b475d 3eef29a4 3f6f29a4", + "3fc00000 3f800000 3f400000 00000000 3f80d855 3e7e67b2 3f3f37dd -> 3f7d7b42 4084e71c 00000000", + "bf000000 3f800000 3f400000 3e800000 3ed790ef 3ec6df97 3f410513 -> 3e9ff6c0 3e236424 3e563c2c", + "3e800000 3f800000 3f400000 3f000000 3f899de7 3f5154a8 39d27d07 -> 3f7b8712 3f4ab38e 439bdd11", + "3f400000 3f800000 3f400000 3f400000 bda146e8 3f6338ef 3f6338ef -> c1146241 3f523ccf 3f523ccf", + "40000000 3f800000 3f400000 3f800000 3f6fbfaf 3f77e106 3f9e8839 -> 3f915a52 3f4c94a2 3f1d6480", + "00000000 3f800000 3f800000 00000000 3ea144e1 3f811fb1 be435d68 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3ec69f3c 3f4325a5 bba8a4a8 -> 3fe4fa08 3f93f50b c1c14dc1", + "3f800000 3f800000 3f800000 3f000000 3f32f12f 3eef258a 3f32f12f -> 3fb71ee4 40090542 3f371ee4", + "3fc00000 3f800000 3f800000 3f400000 3f20e3c9 3f9061b7 3f9061b7 -> 3ff18046 3f546e54 3f1f52be", + "bf000000 3f800000 3f800000 3f800000 3dd9efd4 3dd9efd4 3f736657 -> c04cb604 c04cb604 3f795fad", + "3e800000 00000000 00000000 00000000 3ecc7997 3f2f798c 3f2f798c -> 00000000 00000000 00000000", + "3f400000 3e800000 3e800000 3e800000 3f9800bd be73157c 3f6a6f08 -> 3e61ae5f bf3a33a7 3e88d4d2", + "40000000 3f000000 3f000000 3f000000 3e8d6b7d 3f5c7c88 3d1b8d11 -> 4047b509 3f293bd2 41cea855", + "00000000 3f400000 3f400000 3f400000 3f800000 3f800000 3f400000 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 be144703 be144703 3f974c05 -> c03cfdc0 c03cfdc0 3f6c4a54", + "3f800000 3fa00000 3fa00000 3fa00000 3f2521b2 3e892d66 3c486074 -> 3ff80b68 40954bb9 42cc6a38", + "3fc00000 be800000 be800000 be800000 3f658d09 3ef68a63 3eb8d849 -> be961f57 bf275de5 bf69e8d4", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3e17cd6d 3f8bd1eb 3f2a5e6e -> be3fc674 3dd574e5 3d9954df", + "3e800000 3f666666 3f666666 3f666666 3f6d1077 3b01eb90 3f889063 -> 3f6b0036 42e45844 3f62c9b1", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3da721b4 3f44830b 3d16d4c1 -> 404964f2 3ed16a32 40dbea94", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3e8671a2 3e8671a2 3f8a13bc -> 408d273f 408d273f 3f11c171", + "00000000 3e9b2712 3df2f49b 3df2f49b 3dcccccd 3dcccccd 3dcccccd -> 3e9b2712 3df2f49b 3df2f49b", + "3f000000 3f71798b be3563b4 be4fe6d7 3f699cff 3f0e30d8 3f699cff -> 3f7d0b7a be7dfb39 be59dcf6", + "3f800000 3f18ac2c 3f143931 3f8eded1 3e6cf9f3 3e50d9a1 3f99e550 -> 4024edb6 4035afad 3f6da8e1", + "3fc00000 3f2b5309 3d9e6211 3f326839 3f926ebc 3f9170bb 3f9170bb -> 3f0af9be 3d81e500 3f12511c", + "bf000000 3f163730 3f163730 3d1c22f1 3f59de79 3e8a0059 3e926289 -> 3f091204 be5556b8 bc1b6558", + "3e800000 3f117145 3efcd74a 3f4ecc40 3ee61b8f 3e9da457 3e9da457 -> 3f3dfc62 3f4576ef 3fa18174", + "3f400000 3f8572e4 3f65a46e 3f8572e4 3eed3fe4 3ebb21db 3f46d7fb -> 3ff95b07 4004291a 3fa237d1", + "40000000 3f90940a 3ef080f8 3f1b7e0c be2cef20 3f6b4325 3f1331bc -> c16818a4 3f0d739e 3fc0af94", + "00000000 be3c0b53 3d154cbe be55e385 3f20d4a9 3e8c6591 3e8c6591 -> be3c0b53 3d154cbe be55e385", + "3f000000 3e272751 3e272751 bd746e41 3b5f243b 3f4e7381 3f4e7381 -> 41c06ba9 3e3b3654 bd88e19f", + "3f800000 3f6650cb 3d071105 3d071105 3e7291d6 3f826e4e 3f5afd63 -> 40731145 3d048c99 3d1de4af", + "3fc00000 3e8e9b69 3f03bc02 3f27aee0 3df35cc9 3df35cc9 3f3bf819 -> 40581b17 40c7a124 3f815bb2", + "bf000000 3e958e35 3e958e35 bd2ffb1f 3e800000 3f800000 3f800000 -> be158e34 3e958e36 bd2ffb1e", + "3e800000 3efc9b4d 3f00b3ce be461fc1 3e9addb3 3e9addb3 3f8a1cdc -> 3f471eae 3f4ae6e8 be427f52", + "3f400000 be2dc4b0 3eaccd07 be7dced6 3f430de3 3f8ca955 3f2a8bf9 -> be567d4c 3ea12293 beae97e5", + "40000000 3f079c68 3f079c68 3e79acdb 3f0096ce 3d4c5023 be70310e -> 3fca2c88 41a5ae0d c014a899", + "00000000 3eed4c4b 3eed4c4b 3dc762ab 3f864f7d 3f0341a9 3f849964 -> 3eed4c4b 3eed4c4b 3dc762ab", + "3f000000 3e291349 3e43c948 bc4ebafb 3f8bff20 3f908a7a 3ef89805 -> 3e21d4c5 3e389566 bc9e2095", + "3f800000 3f1cdad8 3f1989d6 3f33188a 3e89bf45 bd47aa15 3f872fc7 -> 4011c171 c144dc0a 3f299332", + "3fc00000 3f83eccf 3de1da21 3f83eccf 3ec08f3b 3ec08f3b 3ed5c557 -> 40661a28 3ec4f6df 404bff6e", + "bf000000 3e66f349 3e66f349 3eaba6c3 3f991992 3eff10b1 3e6add96 -> 3e79e1c2 3de541ec be696f90", + "3e800000 3f77fe15 3f87efbe 3ec0745a be7b3f3a 3f36c806 3f6fce6c -> be856110 3f958cc4 3ec3b41a", + "3f400000 3f07e05c 3f0b06de 3ef61ea5 3e0fdc0d 3f226e42 3f89ae6e -> 403dd671 3f4717a4 3ee923cf", + "40000000 be74a638 be74a638 3f04df0e 3f638c97 3f672ea8 3f672ea8 -> be98e9dc be94968e 3f216630", + "00000000 3d07944f 3f3007cd 3f9efa76 3f957e66 3e976ca2 3f957e66 -> 3d07944f 3f3007cd 3f9efa76", + "3f000000 3f950284 3f92287c 3f92287c 3f8fbce8 3f671290 3f671290 -> 3f8cda2e 3f9a0aae 3f9a0aae", + "3f800000 be4c42c1 bd0960e7 3f19574d 3d36f6b7 3f103169 3d36f6b7 -> c08ee634 bd73e6ce 41568d68", + "3fc00000 3f7afb7e 3e9e4fd4 3f7afb7e 3e21ce0a 3f4372cb 3eb331e7 -> 410d1105 3ee7e1a2 406d8b64", + "bf000000 3f147213 3f6abffe 3f147213 bde79b45 bde79b45 3f63d5f2 -> 405bbf57 40adc0bc 3f0b453a", + "3e800000 3f5cf607 3f8a3a5f 3f5cf607 3ede6fc3 3ede6fc3 3ed44c6c -> 3f926f94 3fb736b0 3f9578c9", + "3f400000 3f8967c7 be2348fa 3f8967c7 3eb66687 be2775bc be2775bc -> 4021d001 3f310210 c094f40f", + "40000000 be1c62bc 3f3ecb21 3e0864ff 3e917f0f be12f4db be12f4db -> bf6c1037 c1321b5e bffea678", + "00000000 3e85a7a7 3f45113d 3f45113d 3f82448b 3f766237 bcfb247e -> 3e85a7a7 3f45113d 3f45113d", + "3f000000 3f9ef45a 3f6fa89e 3f9ef45a 3e4a301d 3f1ba33a 3f821144 -> 4070ffa8 3f9e7711 3f9db0f2", + "3f800000 bc971c0f bda6fa54 bda6fa54 3e861f75 3ef23fd2 3ef23fd2 -> bd903615 be3074b9 be3074b9", + "3fc00000 3ef759a6 be3dfa59 be3dfa59 3f73e362 3f73e362 3f18f67d -> 3f04e34c be4c2136 bebef794", + "bf000000 3ea70417 bd9ccf75 3e686339 3f4a8679 3ef658d0 be58b5a6 -> 3e90f770 bd10856e 3f6067d6", + "3e800000 bcde7925 3e21f43f 3ebaa31a 3f66f4f4 3bcc0af7 3bcc0af7 -> bce48109 40cefd58 416e8954", + "3f400000 bd23180a 3f8e274f 3f138904 3f400000 3e800000 3f400000 -> bd4bde0c 4066ffe0 3f386b45", + "40000000 3e607a19 3f87d300 be254b46 be800000 be800000 be800000 -> bffc895c c118cd60 3fb9f4af", + "00000000 3f286bfe 3eb6c6f9 3f9b3178 bdb107d5 3f3fdd68 3c9f008c -> 3f286bfe 3eb6c6f9 3f9b3178", + "3f000000 be7aa892 3ebfa5fa 3e37962c 3f89b381 3e3b4923 3f89b381 -> be71d433 3f9af00c 3e311ea3", + "3f800000 3ea0707f 3f2fdefe 3f2fdefe 3f4a0816 3f4b3280 3e83e30f -> 3ecb4c22 3f5d92a5 402ab015", + "3fc00000 3f78d1b0 3f11c5f6 3f78d1b0 3f400000 3f800000 3f400000 -> 3fba9d44 3f11c5f6 3fba9d44", + "bf000000 bd1a82ef bddc7de5 bd11a6d8 3f09cbb4 3f09cbb4 3e7bef68 -> bcb07abe bd7bd73a 3c9b0d40", + "3e800000 3f1f8069 3ebac7df 3f2a054b 3f666666 3f666666 3f666666 -> 3f23eea5 3ebff817 3f2ebe54", + "3f400000 3f75e2a8 3f2243cc 3f5735d7 3ecede47 be232988 3ecede47 -> 40017968 c034cd6c 3fe2a4cd", + "40000000 3f847889 3d04eb3f bdc0010d 00000000 3f000000 00000000 -> 3f847889 3dc760de bdc0010d", + "00000000 3f933da8 3f933da8 3f365074 3f9dc804 3f9dc804 3dde62e2 -> 3f933da8 3f933da8 3f365074", + "3f000000 3d587801 3f801f6a bd939323 3f9cfaf1 3f54eb0a be08dcaa -> 3d447ccf 3f8d15bc 3e6f2501", + "3f800000 3f4271b3 3f034743 3f0d8684 3f39ef90 bd3b68a9 3f026f9e -> 3f85db73 c1335370 3f8ae1e1", + "3fc00000 3dd691d9 3f69f6df 3f1649ae 3f66b672 bd6af89a 3f5965a2 -> 3df9d8c0 c1c2d542 3f3e5149", + "bf000000 3dcd425e 3f4f7a90 3f46ddb0 be147e65 3f03cb99 3f03cb99 -> 3efde74b 3edb6da4 3ed251c6", + "3e800000 3f80626f 3dfc098b bd9a75f3 3f9df791 3eed49f2 be361779 -> 3f749769 3e227de8 3d4a9df4", + "3f400000 3f380558 3f950403 3e6da6ee 3f7192a4 3f9d6b44 3e6b77c8 -> 3f404370 3f802116 3f50a25c", + "40000000 3f27a8f4 3f844173 3f844173 3f6acd70 3ecbced9 3f8161ad -> 3f45ee98 40850f71 3f816e63", + "00000000 3f3132af 3f67678e 3f3132af 3f2e5976 be62c78e 3e899c44 -> 3f3132af 3f67678e 3f3132af", + "3f000000 3e5034df be40e542 3f72b18a 3e503c2a 3ea5b341 3ef5fae6 -> 3f1a0220 bec53b52 3fbaf692", + "3f800000 3ebe5093 3f9a56bd 3ebe5093 3f036be0 3e846335 3ece7918 -> 3f395c32 4095394b 3f6bf73f", + "3fc00000 3f513391 3f0be6e8 3f844cfd 3ed5c60c be090fed 3f985577 -> 4021be4b c0ccb8ce 3f493341", + "bf000000 3f25eae6 3f25eae6 bd93a23e 3ecf8ffe 3f283667 3e37b276 -> 3e30f568 3ef53ecf 3dbe08a1", + "3e800000 3f18f4c8 3f18f4c8 bdf180db 3e800000 3f000000 3f000000 -> 3f85d62f 3f3f31fa be16f089", + "3f400000 bd73787d bd73787d 3e8ba561 3f800000 3f800000 3f000000 -> bd73787d bd73787d 3ef4616a", + "40000000 3f42c088 bd1cafca 3ce067ec 3c8682f1 3f8025c1 3ec9d245 -> 42b7cd8d bd1c5378 3de48bbf", + "00000000 bde703cb 3f34b74e 3d9066f0 3f6f0c77 bd90d811 bd90d811 -> bde703cb 3f34b74e 3d9066f0", + "3f000000 3f2fd4c6 3f2a39f1 3f297148 3f09ec9b 3f2f6115 3f561ce8 -> 3f7b184c 3f515a33 3f3a0440", + "3f800000 3f212bc2 3e7e6526 3e7e6526 3eeb0fbd 3f8a144f 3eeb0fbd -> 3faf870b 3e6bd33b 3f0a8725", + "3fc00000 3f85941f 3da01e43 3f85941f be5d2622 3e7a2e04 3ed1b391 -> c0f8a430 3ee1c006 4053360c", + "bf000000 3f534204 bdfbb69d 3f94e113 3d28af4c 3f7f64cb 3eb6c39e -> c10c7fe4 bdfb6a22 3dec8260", + "3e800000 bceb2adc 3ee54c34 3ee54c34 3ed5b6ec 3f1e8a88 3ea81dc0 -> bd1e9cb7 3f0444a6 3f2d471a", + "3f400000 3c0b77aa 3d300540 3f42c67c 3e931719 3cdc2e89 3f9d60d7 -> 3cc77bb6 3f9addc2 3f278180", + "40000000 3f7e4141 3f094b8c 3f094b8c 3e83e6fb 3f1b5280 3f746f2b -> 40d6f376 3f9da3ed 3f1649a8", + "00000000 be65b73d 3e84eb4e 3f82e5e0 3f9d156c 3f10fa6f 3f1b6145 -> be65b73d 3e84eb4e 3f82e5e0", + "3f000000 3dfac819 3f1a0b3b bd8d2e85 3f858a43 3f34065d 3f9754e8 -> 3df59462 3f3a8c93 bd824c5f", + "3f800000 3e726006 3f36f162 3f36f162 3e65a92c 3e65a92c 3f954d17 -> 3f871612 404bec93 3f1cd78f", + "3fc00000 3dea6ee1 3f2ae528 3dea6ee1 3f9fa0f2 3f8c37d6 3f8e7c05 -> 3da4c1f0 3f148ef0 3dc6af8a", + "bf000000 3e3ca2c2 3e3ca2c2 3f2ae157 3f000000 3f800000 3f400000 -> 3dbca2c4 3e3ca2c3 3f0e6672", + "3e800000 be0be21c bd4765a3 bd4765a3 3ed85814 be0fd4f7 3ed85814 -> be3baca4 3d4d59a2 bd85c2b2", + "3f400000 3f61cdf2 3f61cdf2 3f9b3f69 3eef52e1 3ed90f3d 3eef52e1 -> 3fd1612c 3fe3f5fe 400ff47f", + "40000000 bd86b452 3f2d0411 3de4a1d3 3f3f3816 3f95beea 3f89a60d -> bde1f96a 3ef58822 3dc49465", + "00000000 3f9bcc19 3f9bcc19 3f97697e 3f108599 3f108599 3f19b656 -> 3f9bcc19 3f9bcc19 3f97697e", + "3f000000 3e8d727f 3f0c24fc 3f0c24fc 3f3c9f4b 3e53a9ae 3f3c9f4b -> 3ea6b5e0 3fcc896a 3f252ccc", + "3f800000 3f50be49 3f00d5c3 3f50be49 3f036ae7 3f036ae7 3f972fd2 -> 3fcb5098 3f7af81b 3f30bab6", + "3fc00000 3f9ccbe3 3e7ec792 3f3d4622 3f322fe3 3cbfaddd 3cbfaddd -> 4001c088 417d3731 423c1cb2", + "bf000000 bdfb3aa7 3e6163ff bdfb3aa7 00000000 3f000000 3e800000 -> bdfb3aa7 3de163fe 3d7b3aa8", + "3e800000 3f2ff3cf 3e5f69be 3f2ff3cf 3f680cb8 3f67bc17 3f680cb8 -> 3f347e13 3e6542f3 3f347e13", + "3f400000 3eba65ec 3f35dc73 3f9ee20e 3f8df33c 3dcb4be4 3f4f06d8 -> 3eaca8d1 40b1705e 3fbb124e", + "40000000 be63282e be66bff9 3f9ebd2d 3f64f62d 3e8cb316 3e7b18e9 -> be8c675b bfb51423 410dfef9", + "00000000 3f57311a 3f57311a 3e15b48f 3f8caafb 3ef12321 bc0a070a -> 3f57311a 3f57311a 3e15b48f", + "3f000000 be620365 3f85e0d0 3f801a34 bd03e14d 3eb68f76 3f856c04 -> 40544cfe 3ffeac56 3f7affbb", + "3f800000 3f270364 3f82d6ea 3ea9d701 3f14a72c 3f83192e 3f47eedb -> 3f8fcf32 3f7f7e9a 3ed977c4", + "3fc00000 3f6e3465 3f5f09a4 3dafba25 bd97e094 bc8c314d bd97e094 -> c19a49e1 c29999ec bfe3a458", + "bf000000 3f36cabf 3f36cabf 3f8e59aa 3edc3e77 3f9573a9 3e273362 -> 3e76e180 3f43e920 bfde60b9", + "3e800000 3f8b80ab 3f3a21e5 3f6b1a91 3f400000 3f800000 3f800000 -> 3f9720b9 3f3a21e5 3f6b1a91", + "3f400000 3f69141d 3f69141d 3ef07d12 3f9df734 3f14e927 3f9df734 -> 3f47eaf5 3fb36571 3ece4608", + "40000000 3f81430f 3e95c2aa 3e95c2aa be67fb1d be53de1e be67fb1d -> c11ecda9 c047ad00 c037fc8c", + "00000000 3eeae80b 3f2800da 3ed24930 3f168337 3f1ef3fd 3f1ef3fd -> 3eeae80b 3f2800da 3ed24930", + "3f000000 3f923ca6 3f923ca6 3eef36c9 3f54c26e 3f78e75a 3f78e75a -> 3fa118e6 3f945250 3ef29fc0", + "3f800000 3edca42a 3edca42a 3f9ddbdc 3f33677c 3f8c00e8 3f57976a -> 3f1d6be7 3ec9b95c 3fbb724c", + "3fc00000 3f53951b 3f9d069e 3f9d069e 3e85a94d 3f938676 3f938676 -> 408abdda 3f7bb426 3f7bb426", + "bf000000 3e82c04a 3f1a41d2 3e82c04a 3f000000 3f000000 00000000 -> 3e02c04a 3e9a41d2 3e82c04a", + "3e800000 bd8c1bba 3f472e71 bdf318d4 3ecc933b 3ecc933b bdb7337c -> bdc0bec4 3f890172 3e788910", + "3f400000 3f8c4f2d 3f8c4f2d 3f73576d 3f35b672 3f112e9b bdab4865 -> 3fb75478 3fdca219 c10495c3", + "40000000 3f57892d 3f4b68d5 3e34148c 3e95cae4 3e95cae4 bdc4b207 -> 409d3c96 409463eb c075a15c", + "00000000 3f6b6726 3f0ebaba 3f9c1fe6 3d70ea95 3f7befed 3f7befed -> 3f6b6726 3f0ebaba 3f9c1fe6", + "3f000000 3f9610d4 3f0befb0 3eed4c65 3f85d448 3f83da7c 3ef4f85e -> 3f92cc2a 3f09e436 3f3750e6", + "3f800000 3d5dbbff 3ea7a37e 3d5dbbff 3f1c18ff 3f59ba11 3db90ef4 -> 3db5d274 3ec51b68 3f195e27", + "3fc00000 3f794d8f 3f685eae 3e8d2233 3f1d0667 bdf45d73 3f48219c -> 3ff28178 c13dd639 3ec83b60", + "bf000000 bd493cd0 bd493cd0 bd8b8709 3f9639a6 3f9639a6 3f0d23b1 -> bd581fa9 bd581fa9 bd258197", + "3e800000 3f5cea84 3f5cea84 3ec822e5 3f9da6a7 3ead5165 3f3492eb -> 3f528753 3fa46b77 3edd0920", + "3f400000 3da61d89 3f53067a 3f53067a 3e800000 3f800000 3e800000 -> 3e86f800 3f53067a 402b7544", + "40000000 3f6c1a54 3f826a0b 3f6c1a54 3ee72f61 3ee72f61 3ecad3ee -> 404a6b81 405f9e3e 406ef8f3", + "00000000 3f0824bb 3f89c9a8 be623576 3d2c2e82 3f7a5c8e 3c89005e -> 3f0824bb 3f89c9a8 be623576", + "3f000000 3f513db2 3f513db2 3f475c56 3ecec325 3f97de41 3ecec325 -> 3fb5d842 3f40cc66 3fad4212", + "3f800000 3f08ea2f 3f6953c6 3f849d30 3f8c21ae 3f3a02ac bdf033fb -> 3efa1f98 3fa08f6e c10d55db", + "3fc00000 3ed0f4d5 3f1e2e21 3e685ce8 3e7993b1 3f96bf4b 3f26867f -> 4013b0d6 3ef4c0fd 3ed1d188", + "bf000000 3f3145df 3e649447 3f3145df 3f8435be 3f8435be 3f9cfd72 -> 3f34186a 3e6837f0 3f41a403", + "3e800000 3e934213 3ec29eae 3dff6c67 3e53e1bc 3f1abf64 3e53e1bc -> 3f102e94 3ee27481 3e7a1678", + "3f400000 3e2c1c5c be1e2635 be1e2635 3f000000 00000000 3f000000 -> 3e9698d0 be1e2635 be8a616f", + "40000000 3f6fb3a1 3f6bb84c 3eff41a3 3f7d6453 3f7d6453 3f1e9a92 -> 3f74a2d5 3f709284 3f8e304c", + "00000000 be79bd5a be447dc8 3f6bd1c1 be7b5611 be7b5611 3e0e2b53 -> be79bd5a be447dc8 3f6bd1c1", + "3f000000 3f88cb07 3f60b90a bdfeb866 3f2146d7 3ef1c8ff 3ef1c8ff -> 3fb0f6f6 3faf25e2 be468724", + "3f800000 3e07a99a 3f9d1428 3f9d1428 3f800000 3f400000 3e800000 -> 3e07a99a 3fd17035 409d1428", + "3fc00000 3f52a4db 3f928090 3f928090 3f8573fc be2e6e66 3f8573fc -> 3f45bbb2 c12a6a11 3f8985d6", + "bf000000 3f2094bf 3f8f3069 3ef325fb 3f8c419a 3f99a461 3ee4420b -> 3f2798e2 3f9b234c 3e380b78", + "3e800000 be582ccf bdf83c48 3e8a6749 3f04114b 3eab81cd be470325 -> be8571e5 be39b872 be147756", + "3f400000 3e35612b 3e64bebf 3ecdac64 3f897ddf 3e457f85 3f951691 -> 3e2bfd0c 3f6cac75 3eb7daba", + "40000000 3f32b60c 3b1907b5 3b1907b5 3f836f47 3f898442 3f898442 -> 3f295ef2 3b03d983 3b03d983", + "00000000 3f696a01 3e4a234f 3c0bb18a 3f1eb9ea 3f1eb9ea 3eb2e269 -> 3f696a01 3e4a234f 3c0bb18a", + "3f000000 3f5f246f 3e0adbfd 3f70e374 3e97175f 3e97175f 3f9f11e1 -> 3ff4d336 3e985a2f 3f595cf2", + "3f800000 3d35e1b1 3eba725f 3e350cae 3ed26e6f 3ed26e6f 3f5a5f35 -> 3ddd448f 3f62d251 3e543f1d", + "3fc00000 3f0d48d4 3f682059 3f6b0998 3f82a0ee 3f50d748 3f53b177 -> 3f090518 3f9b6048 3f9a69ca", + "bf000000 3f8509cc 3f8509cc 3f13b040 3f9be782 3ed9013e 3e44f2ac -> 3f90f1b1 3eaa733c bf2268aa", + "3e800000 3f5b4208 3f5b4208 3f0ebb09 3eee8a84 3f4a6a2c 3f31b777 -> 3f8d0c50 3f69c4dc 3f1e72da", + "3f400000 3f6e5648 3f204ad1 3f6e5648 3c5a07d4 3f03bde9 3e58b846 -> 4252d026 3f88d757 40620c2c", + "40000000 3f3cfeb4 3f3cfeb4 3d5e9650 3e84c969 3eea6bbb 3e898597 -> 409e8ebe 401f24cf 3eb35a24", + "00000000 3f5c7663 3f7dd411 3f7dd411 3f9f49c8 3f9f4111 bde31c4a -> 3f5c7663 3f7dd411 3f7dd411", + "3f000000 3f69045d 3f69045d be778d91 3e3430e5 3f4c529e 3eb87e17 -> 4042a70b 3f833e00 bee9a3a7", + "3f800000 3ce1b8ec 3ee7ade8 3d02730c 3f428f20 bd703249 3f991b78 -> 3d148093 c0f6ec2a 3cda1d85", + "3fc00000 3e00dc18 3f7eca62 3d96eb7b 3e99944d 3f097a2b 3f097a2b -> 3f10fd2a 40121220 3e2d0b3f", + "bf000000 3f67c29c 3f7d51c4 3f178db3 bb988845 bb988845 3f3306af -> 42c5338b 42d78bb5 3eedf1f9", + "3e800000 be56995a 3eb515fc bd46a1df bd508645 3f8113fa bd508645 -> 3f5f3861 3eb4b531 3e4e9cb1", + "3f400000 3e511a62 be353a96 3e511a62 bd27a6b2 bd27a6b2 3eed454b -> c06c3478 404cb7cc 3ec35837", + "40000000 3f8b4e16 3f640b55 3f8b4e16 3f1f62bd 3dc047c3 3e2e3e24 -> 401a1836 4190ae76 413b4180", + "00000000 3f6aaa43 3f80ce6f 3f81b78f bdd6a7c5 3ef51830 bdd6a7c5 -> 3f6aaa43 3f80ce6f 3f81b78f", + "3f000000 3e9406a5 be42c3f2 3eaddc6c 3f121aa6 3f9d0990 3f121aa6 -> 3ecbb25a be30c236 3eef3f7e", + "3f800000 3ef9f515 3ec807a6 be5d23db 3f000000 3f800000 00000000 -> 3f79f515 3ec807a6 be5d23db", + "3fc00000 3e820415 3f4a017a 3f8dfdfa 3f0373c1 3f832de3 3efff124 -> 3f1d65f5 3f42a97f 403189d6", + "bf000000 3f05ec0d 3f1f6da7 3f1f6da7 3f0d45ef 3f0d45ef 3e56d64e -> 3e9f164d 3ebd62dc bf0ccea6", + "3e800000 3f04b6da 3f7050cc 3f9fd9c4 3e292d5a 3e69dd60 3e0b1c01 -> 3f962e0e 3fdda62a 404f0762", + "3f400000 3eaaa2f1 3f63fcd6 3eaaa2f1 3f543ae0 3f543ae0 3f558fad -> 3ec507c6 3f83a053 3ec4116e", + "40000000 3f48c51c 3f9fbd28 3f48c51c 3f6798b9 3f44f3c8 3f6798b9 -> 3f731494 3fff854a 3f731494", + "00000000 3ed6cff5 3cd65903 be672db9 3f6b1cd8 3f03a8cd 3e9c4b41 -> 3ed6cff5 3cd65903 be672db9", + "3f000000 be28cf4c 3f185302 3f9e0080 3f89308f 3f88cbfa 3f822eb7 -> be2327e8 3f136d36 3f9cad72", + "3f800000 3ef0e8d7 3ef0e8d7 3f7d1dca 3f61e14d 3f1842c5 3f1842c5 -> 3f08844b 3f4a860f 3fd4c917", + "3fc00000 3f43388d bdfae6f0 3f8519fa 3f4ae879 3f6bb8a3 3f4ae879 -> 3f87ebbc be0da3be 3fb9576a", + "bf000000 3e00d7e9 be50bdde 3f9f25b5 3ec74b8b 3ee869b2 3f0ee0ee -> 3cde1910 bda65f40 3f404af8", + "3e800000 3f6c707c 3e0231ea 3f9ff6c0 3f35c533 3f0ec6d6 3daa064a -> 3f824a00 3e1c01a6 40966b51", + "3f400000 3f0abd38 3f25cc5e 3f00337c bdbcb16d 3e57d423 3e57d423 -> c088d5c3 401ddb0d 3ff41e82", + "40000000 3e840f88 3e840f88 3e3c100c 3f00a168 3ea55687 be0ccb77 -> 3f44cbe0 3fab75c9 c036b9f1", + "00000000 3eb9539e be716a53 3ec558e6 3f8ee643 3f8ee643 be7e4c40 -> 3eb9539e be716a53 3ec558e6", + "3f000000 3f7521d3 3ef56b17 3f7521d3 3f51c565 3ebc55a6 3f51c565 -> 3f88124d 3f6426ad 3f88124d", + "3f800000 3f8d0dfb 3ebb8997 3e5d62f8 bd8d36ad 3d31609a 3d31609a -> c17fb63a 410754f0 409fc219", + "3fc00000 bd9f798d 3f1caf4a bd9f798d 3ecc9fb7 3ecc9fb7 3f1b1aca -> be81b3b3 3ffedd94 be1d8a80", + "bf000000 3f093f1a 3ee1c349 3f093f1a 3f8a845c 3c9b7bbf 3c9b7bbf -> 3f0e74ef c12f4630 c1551b44", + "3e800000 3f160044 bd56a8f0 3b39dc19 3f6efb55 bd195df7 bd195df7 -> 3f18abe6 3e9f07d6 bc89b1ac", + "3f400000 3f884e9b 3e7c28e8 3e7c28e8 3f9aaa87 3f993382 3f871b7f -> 3f6d5ce6 3e5d0cd1 3e723606", + "40000000 3eab4c10 3d3feca8 3f0a5b04 3f0a6057 be0c78ee 3f0a6057 -> 3f67417c bf3ae104 3fbac8a4", + "00000000 3f24900c 3f4cf15b 3e173edb be754c5b be754c5b 3f8d4d60 -> 3f24900c 3f4cf15b 3e173edb", + "3f000000 3ef1d3b1 3f800a5a be20d04f be195287 be195287 3e8a96dc -> bfaba8b3 c035c6ec bebcbacf", + "3f800000 3e74f5ca 3f35bbe5 3f35bbe5 be5f4e29 be5f4e29 3f64754f -> bf8c69a5 c0505793 3f4ba494", + "3fc00000 3da6ebee 3f9624d5 bd8235b8 3e72e1b1 3f979949 be0f34f2 -> 3ef30a6c 3f662bbf 3f36b67c", + "bf000000 3e9a4517 be10ab1e be10ab1e 3f7f3dfd 3f8bd249 be38554e -> 3e9a0a75 be16c8b6 bf1ab528", + "3e800000 3f932fd3 3f932fd3 3f923819 3f8386cd 3efc8ce8 3f82eb54 -> 3f923340 3fb8fd1d 3f91676f", + "3f400000 3f97fa07 3e9c40bd 3e9c40bd 3ded7d29 3e81a4f1 3f4ff772 -> 40ff3b77 3f7af033 3eb751e0", + "40000000 3f8dfbe9 3f8be181 3f209c42 3f853bef 3f4cb1c6 3f8ef372 -> 3f82d40d 3fd2006d 3efe0770", + "00000000 3e1d249f 3db913a6 3e1d249f 3d132bab bd0dfb4a be1a8407 -> 3e1d249f 3db913a6 3e1d249f", + "3f000000 3f6a83e4 3e19aff6 3e0b2dde be649477 be649477 3ec7fa8e -> bfcc04b9 be85b39a 3e77c204", + "3f800000 bc574db5 3e0de88a 3e1f1c22 3f800000 3e800000 3e800000 -> bc574db5 3f0de88a 3f1f1c22", + "3fc00000 bbb86203 3f84de8d bbb86203 3f000000 3f800000 3f800000 -> bc667a83 3f84de8e bbb86202", + "bf000000 3f8eb387 be34e4b5 3d90a784 3efdb7bf 3efdb7bf 3efee4fb -> 3f0c224e bdb1a39a 3d0f6648", + "3e800000 3f8b1c8b be21ef7f 3f5c63ec 3f87eb60 3f8a3a8a 3f52c978 -> 3f8915cc be1ef096 3f683563", + "3f400000 3f12d2b8 3eacde44 3f20ecc2 bdd9d50c be0b7b64 be0b7b64 -> c079a5a0 bfe32712 c0537570", + "40000000 3f8e9cec bd94a832 3f147b51 be3cf872 3f8a9461 3e136290 -> c1530694 bd7beb10 40ef583e", + "00000000 3f67264f 3e8a25d5 3f28f1ed 3ce4b251 3f68b285 3f87294a -> 3f67264f 3e8a25d5 3f28f1ed", + "3f000000 bdeaa0b2 bcac3f87 be615fee 3f4d33ad 3f578aee 3f8112f0 -> be03d5a2 bcbc69e3 be606fe6", + "3f800000 3d622302 3f6d94c4 3e8afda3 3f7cda88 3f705e0d 3f837f6b -> 3d64f35f 3f7d0853 3e874b32", + "3fc00000 3f8d4e4d 3e8ddbf5 3e8ddbf5 3f6b0ce0 3f8c4bc1 3f039e4a -> 3fa0328e 3e766b6f 3f2b7968", + "bf000000 3ef8dd2f 3ee11cae 3f206e6e be3aebd0 3e867c1c 3d251dea -> 4003dee2 be35b15c c0daa798", + "3e800000 3f3241c1 3dac8e27 3d11a7cc 3f3b0850 bde3b761 3f3b0850 -> 3f42b093 be014788 3d1f153b", + "3f400000 3ec5d010 3f58fbcd 3f58fbcd 3f684235 3f7f4688 3f38339f -> 3ed4fa5e 3f597209 3f8c3536", + "40000000 3f6c732f be4ceadd 3f79f168 3f5d3220 3f64cb8c 3f5d3220 -> 3f9b6de8 be7da61d 3fa44c88", + "00000000 3f22e510 be2bbc40 3f22e510 be265c66 be265c66 bdd98c20 -> 3f22e510 be2bbc40 3f22e510", + "3f000000 3f93dc10 3e626df4 3f496f84 3f8338b6 3c9b2861 3e8e0d35 -> 3f920b6c 40be55b7 3fe7de64", + "3f800000 bdec26e8 3e6e6930 3f89fd09 3f508515 be5fbf18 3f2290c5 -> be10f645 bf8863a1 3fd94c18", + "3fc00000 3e82d5be 3e82d5be 3f99d945 00000000 3e800000 3f000000 -> 3e82d5be 3fb3e5e5 40404f97", + "bf000000 3f4dd729 3f8485c5 3f6967b1 3e876812 be30f0eb be30f0eb -> bea0cdc8 40919039 40802fc4", + "3e800000 3f9fe08d be2aff9e 3ef5b2af 3f99b240 3e85e7a5 3ddcf87a -> 3f9931da be91da78 3fbc645b", + "3f400000 3f1ce805 3e438f22 3e65a1f3 3f0584a9 3f95874e 3f3c3bda -> 3f846def 3e2e7136 3e91d151", + "40000000 bd33138e 3eacb091 bd33138e 3f9820cf 3f9820cf 3e89e3a0 -> bcf48b34 3e6bd27a be8fd94b", + "00000000 3f266fd3 3eb92b45 3ecc9853 3eac67ec 3f8f158c be5fad40 -> 3f266fd3 3eb92b45 3ecc9853", + "3f000000 3f825836 3ea5d407 3ea5d407 3ec82a10 3f929864 bd9399b6 -> 3fe7e05b 3e9b4f8e c0057168", + "3f800000 3f8ecdcd 3f1d2af7 3f600168 3ed24b6a 3f47f172 3e820935 -> 402dd745 3f493b66 405c7f8e", + "3fc00000 3efe788e 3f152b3b 3efe788e 3f26777b 3f257bc2 3f9e5ca2 -> 3f65e286 3f87c76e 3eb549d7", + "bf000000 3f82c9d5 3f926b04 3f9cf4be 3f400000 00000000 00000000 -> 3f59fb0f 3f926b04 3f9cf4be", + "3e800000 3f0247bc 3cef07ec 3f0247bc 3aedab9b 3f85ca9c 3f85ca9c -> 428d1751 3cec71b8 3f00decf", + "3f400000 3c932196 3c932196 3f1bfb40 3f7f401d bdbbb7e9 3eb29722 -> 3c93748a be11e3a3 3fbb30ef", + "40000000 3f86fc77 3f86fc77 3ebcd306 3e940e60 be067980 be067980 -> 40c7a78f c188ec70 c0bf88cf", + "00000000 3ee66382 3ed14d50 3ed14d50 3f846c1a 3f846c1a bd158e9d -> 3ee66382 3ed14d50 3ed14d50", + "3f000000 bc4f1f17 3f0f02e1 bdfadd02 3f3e87a5 3f3e87a5 be120e76 -> bc72b506 3f279505 3ebc7df3", + "3f800000 3f752e08 3ef62054 3f9e41a6 be51da5b 3f823ea4 be51da5b -> c0958c33 3ef1e26b c0c10ead", + "3fc00000 3f6d6fb9 3d6904ce 3e582aa3 be111a8b bdcdc218 3f45f643 -> c12481c1 bf60b838 3e9b9d5c", + "bf000000 3e96855e 3e29a78a 3f234a36 bdb69c6c 3e16d6ca 3f54b2a0 -> 4005bab8 bea0b134 3f12ab0b", + "3e800000 3d5cb8c7 3f97a8fe 3f97a8fe 3efffec4 3efffec4 3f2ef073 -> 3d89f3c0 3fbd939b 3fa93a87", + "3f400000 bd8de56e 3f8956b9 3f221e27 3f551b67 3f44fea8 3f81cf63 -> bda350f6 3fa830f7 3f206c1d", + "40000000 3f30bd5f 3f97597c 3f30bd5f 3f2514eb 3f4e5523 3f2514eb -> 3fb9b572 3fe036c2 3fb9b572", + "00000000 3e645bb0 3e838740 be4cb659 3f39c93c 3f9b7cbe 3ee7dabc -> 3e645bb0 3e838740 be4cb659", + "3f000000 3ec0bd12 3f06369f 3ec0bd12 00000000 00000000 00000000 -> 3ec0bd12 3f06369f 3ec0bd12", + "3f800000 3f8489d1 3f86d289 3f8489d1 3f5bf8c0 3f1b55f3 3f5bf8c0 -> 3f9a3f0d 3fde3171 3f9a3f0d", + "3fc00000 3f7a72fd 3f924acb 3f87b4e5 3f5ac4d7 3f09cebf 3f09cebf -> 3f9d3108 40273f7f 401b256b", + "bf000000 bd41bb03 3e74bac6 3eaff2f7 3f820909 3f820909 3d225ffc -> bd433f23 3e76a512 c0746918", + "3e800000 3ba22c61 3f950609 3e91543b 3edc4c9f 3f0a15a8 3f379167 -> 3bd7db74 3fb4d676 3e9faa3b", + "3f400000 be67f5ca 3f9d7865 be100519 3f400000 3e800000 3e800000 -> be90f99f 407fe3a5 beea0849", + "40000000 be0b8914 be02ecec be02ecec 3f932cc5 3ebb4791 3ebb4791 -> bdce5a48 bf123c68 bf123c68", + "00000000 3f5b10f4 3f7d205b 3f72e048 3ed135a9 3bb8fed5 3f11d428 -> 3f5b10f4 3f7d205b 3f72e048", + "3f000000 3eb6d83a be62128c 3ea965e9 3db15162 3db15162 be747405 -> 400f6ad8 bfb152e8 bf070cd5", + "3f800000 3de4f141 3e84dc05 bdbf2970 be418100 3f2f4c89 3f42d86c -> bf17712a 3ec205df bdfb290c", + "3fc00000 3f8fb0ad 3f7f81d8 be5926a2 3f24b124 3f933ca7 3cf615a6 -> 400397e2 3f4d6ede c127ba9a", + "bf000000 3e82c23b 3e0b354b 3eb21aef 3e289947 3f38537d 3f38537d -> bec8f312 3de04948 3e8f7a4e", + "3e800000 be0c4140 be0c4140 be610e17 3ea52d40 3f54677f 3f54677f -> be55e0e6 be1373a0 be6c9a65", + "3f400000 be3fd5a1 3f2443f4 3f2443f4 3f4bd330 3f4add00 3f6c1e66 -> be64a9ee 3f448912 3f2ea38b", + "40000000 bddbe4db 3f1b4ceb 3ea60766 3f000000 00000000 3f800000 -> bea4eba4 3f1b4ceb 3ea60766", + "00000000 3e32aa87 3d35494e 3e9bc7d3 3f85b1e2 be078b68 3e030cc3 -> 3e32aa87 3d35494e 3e9bc7d3", + "3f000000 3efd77f8 3f603648 3efd77f8 3f8e94f8 3e8a1907 3e8a1907 -> 3ef081e9 4003ef6f 3f9526aa", + "3f800000 3f1064df be6c3da3 3f1064df 00000000 00000000 3e800000 -> 3f1064df be6c3da3 401064df", + "3fc00000 3daa9658 bc4b613f 3f95d9e7 bced9df0 bced9df0 3ee89d44 -> c08b2bd3 3f25ecaf 4051e965", + "bf000000 3f1fb467 3f79ef48 3f8e87ad 3f28e966 3ead3066 3f00b84e -> 3eed116e 3caeba00 3f101fd6", + "3e800000 3f34a239 3f2a3341 3f92a9c7 3f8c20de 3f58b917 3f58b917 -> 3f30b9a2 3f31e960 3f994ee5", + "3f400000 3f0debbd 3f80c6d4 3f8a64b1 3f850ca4 3f0f4bb7 3f850ca4 -> 3f09e19e 3fccbd81 3f867446", + "40000000 3f174b58 3f3d0eb6 be053f50 3f2a9725 3e65beea 3f2a9725 -> 3f976551 40bb07a5 be85562f", + "00000000 3f21fa6b 3e82214b 3e82214b 3daa6937 3f0c8008 3daa6937 -> 3f21fa6b 3e82214b 3e82214b", + "3f000000 3f0b045c 3f3406d3 3f909f6b 3f8650d3 3e7a2cce 3f8650d3 -> 3f07bfa6 3fe5399a 3f8d38f8", + "3f800000 3efcb492 3f5e4e77 3edfcee7 baaf5074 3b896925 3f81bed8 -> c3b8812c 434f14e4 3edccc1b", + "3fc00000 3f16fa27 3f24f887 3f16fa27 3e6c2c4b 3f5bb04c 3dd4ac09 -> 40629b0a 3f4ddf28 4103957d", + "bf000000 3ebd8387 3f39df8f 3f824a31 3ed70c74 3ecc10a3 3ed70c74 -> 3deaac20 3e36869c 3ea15610", + "3e800000 be402a32 3eb4cdfd 3eb4cdfd 3f35c869 3f097b65 3eafa613 -> be53c75f 3edbc556 3f05ae2c", + "3f400000 3f9a3667 3e3684f7 3f9a3667 bdc673dc bd122b2f bdbecf83 -> c1106115 c06ce589 c1165aca", + "40000000 3ea3f448 bda68d4e bda68d4e 3f96c61b 3ea7e8ad 3f5e1a5f -> 3e64d984 bed44b10 bdd963c6", + "00000000 3e81051a 3e26df22 3e26df22 3f8e34d2 3eb4ef28 3f8e34d2 -> 3e81051a 3e26df22 3e26df22", + "3f000000 3f0741bc 3f4535df 3ec66f8f 3f800000 3f400000 3f400000 -> 3f0741bc 3f66142e 3ee78226", + "3f800000 3f2f0dc9 3d1f1ceb 3ec49179 3e6b3192 3e6b3192 3f874a6f -> 403e8a3b 3e2d3059 3eb9f9ac", + "3fc00000 3f024a02 3f9686c4 3f024a02 3f8831df be386f86 be386f86 -> 3eed0f4e c1261ba3 c08fc699", + "bf000000 3e23b051 3e66dd3e 3f996fbe bdc72c2d 3ea22c64 3f4ec445 -> 3f87e33d bc9116b0 3f872b48", + "3e800000 3f4be357 3e856f9b bdfcc1a5 3e65d458 3f510aa9 3ea54404 -> 3fbe02a6 3e8cedfa be40aa38", + "3f400000 3f9cf02c 3f9cf02c 3f32cd74 3eaa28ba 3eaa28ba 3f2080d9 -> 4044b30a 4044b30a 3f814ba2", + "40000000 3f5bf6dd be499fc1 3f5bf6dd 3f31fde9 3dad463f 3f31fde9 -> 3fce62b2 c08ea439 3fce62b2", + "00000000 bddbf53c bddbf53c be19e673 3f9de998 3d9b189a 3f9de998 -> bddbf53c bddbf53c be19e673", + "3f000000 3f223e15 3f4cffef 3f2bc8b6 3dc26b3d 3e825dee 3e423742 -> 4069e988 3ffc871b 4006b067", + "3f800000 3f83f313 3f83f313 3f64ab2a 3e937e15 3ee150ec 3dac80c4 -> 406505b6 4015eb29 4129ad01", + "3fc00000 bdb911b3 3f6cb55d 3f6cb55d 3f9a3fa8 be7ca573 3f0da3e0 -> bd89d43a c0c2aea7 4002d8a5", + "bf000000 3e68384b 3e68384b 3d7546db 3f9f4635 3f3b62a0 3f2ba69c -> 3e7f04c4 3e3db438 3d390325", + "3e800000 3f4c15c2 bdb7866c bdb7866c 3f5e3b5c 3eeb4c23 3eeb4c23 -> 3f53d672 bded7ae6 bded7ae6", + "3f400000 3f78a9d9 3e43c916 3d800da7 3d9d601c 3dfbdd75 3dfbdd75 -> 411b9257 3f9b5e3c 3ecb3c9b", + "40000000 3df053c5 be513d4a bdce945c 3f64593e 3f64593e 3ef4e194 -> 3e1543fa be81f505 bea4507c", + "00000000 3f2c8c1b 3f102c64 3f2c8c1b 3e2700b1 3f92b927 3e2700b1 -> 3f2c8c1b 3f102c64 3f2c8c1b", + "3f000000 3f91bea5 3f039763 3b874826 3f98c285 bd76c8c6 3ef67d0d -> 3f85eeed c08047ec 3bd0249c", + "3f800000 3f021530 3f021530 3f18b097 3f000000 3f800000 3f000000 -> 3f821530 3f021530 3f98b097", + "3fc00000 bcddee21 3f8613ed 3f8613ed 3eadfbd2 3ce43de4 3f9d462a -> bdd92b92 425f7b2d 3f41494b", + "bf000000 3f83b86c be12fcca 3f83b86c 3e800000 3f400000 3f400000 -> bf03b86c bdf4faa6 3f5b88b4", + "3e800000 3bb43038 3eb432fc 3bb43038 3e689708 3f287fa8 be139c55 -> 3c26bb94 3ecb97f0 bbb15ba2", + "3f400000 3df48118 be37b0a0 3f29f074 3f149a48 3e3be8ad 3f149a48 -> 3e3c8468 bf472b79 3f8306b8", + "40000000 3f255f03 3f9c0d40 3f9c0d40 00000000 3f800000 00000000 -> 3f255f03 3f9c0d40 3f9c0d40", + "00000000 3f74dfc5 3f88d9ad 3f88d9ad bdf3e12d bdf3e12d 3e10d202 -> 3f74dfc5 3f88d9ad 3f88d9ad", + "3f000000 3e84293e 3f80d6e4 3e84293e 3f800000 00000000 3f400000 -> 3e84293e 3f80d6e4 3e9a301e", + "3f800000 3ebdcc72 3ebdcc72 3f38749a be4a5e1e 3f95e183 3f709fe4 -> bff01991 3ea21716 3f443de7", + "3fc00000 3ecc65c6 3f264ed2 3f861552 3cb0bd6b 3eda7660 bd714ec1 -> 41dc72e3 3ffabfbe c1d98f92", + "bf000000 3ec3c1ea bcf8f92f 3e9c5546 3ec65df7 3ec65df7 3f2bd4f3 -> 3da40414 bbd09a58 3e6c16fa", + "3e800000 3d29169b 3f78e31e 3f1421e1 3ec0d7bc 3efce498 3efce498 -> 3d6f0c96 3f9c51a6 3f3a134e", + "3f400000 3f467a29 3f110b17 3ecc28e9 3f8ec6f0 3f8ec6f0 3f2ba912 -> 3f37121c 3f05c8da 3f0bb1ef", + "40000000 3ef3b55a 3f0f4684 3f26ad38 be4076a7 3f08ef28 3f08ef28 -> c0b15013 3fc437a2 3fe443f6", + "00000000 3f354060 3f354060 3f1a8ca3 bccd4b09 3f92f84c bccd4b09 -> 3f354060 3f354060 3f1a8ca3", + "3f000000 3f76febb bdb7882f 3f76febb 3f9f2211 3f6d9243 3f6d9243 -> 3f5ed572 bdbea67e 3f804996", + "3f800000 3ebbdc04 3f4e574b 3ebbdc04 3f9c33ca bca503f3 3f4c6226 -> 3e99f102 c2200e3d 3eeb4d8e", + "3fc00000 3f9bc140 be3e6c5f 3e224a38 3e772dd9 3ee95f53 3dc26e41 -> 40de801d bf04dcb0 401b3082", + "bf000000 3e96728b 3f9bdff4 3e96728b 3f69fa4b 3f1a719c 3f9d05ab -> 3e8f5e06 3f5140a0 3ea459d4", + "3e800000 3eec3af0 3f84d9fe 3f98fe20 bd4665ca 3f9a5c69 3f958255 -> c0024308 3f7e5bf5 3f937d78", + "3f400000 3ed761a3 3f68b237 3ed761a3 3d9d8337 3f1d3ebb 3d9d8337 -> 4086a28d 3fab269d 4086a28d", + "40000000 3f976df1 3f01a7d4 3f01a7d4 3e1b36d3 3f89b67b 3e1b36d3 -> 4166d43f 3edebba6 40c5a370", + "00000000 3f9d4cd8 3d8206bc 3d57ca2f 3f237a34 be433836 3f237a34 -> 3f9d4cd8 3d8206bc 3d57ca2f", + "3f000000 3f55553b 3e2cfac8 3e09882f 3f9b55ee 3f99070f 3f731f71 -> 3f428fde 3e1ed592 3e0d2c99", + "3f800000 3e4e5db1 3f1451ed 3f1451ed 3f71a1c6 3efb7aa7 3f539441 -> 3e5aa316 3f96fc85 3f3375af", + "3fc00000 3f85a7a8 3f8366a4 3f8dfb1e 3f000000 3e800000 3f800000 -> 40271192 40b4ad22 3f8dfb1e", + "bf000000 3cdd9177 be139b42 be139b42 3f966f1f 3ecf0796 3d828fdf -> 3cee16de bd1b8e08 3f6a114f", + "3e800000 3f6ba682 3f6ba682 3ea96e27 3f400000 3e800000 3f000000 -> 3f7f49b8 3fce31b2 3ed3c9b0", + "3f400000 3f9fc2ef 3f2ffb7f 3f9fc2ef 3cfdb25b 3f9cdd7b be666c4f -> 41f4506d 3f17b1f7 c07645b2", + "40000000 3f3a5ffc 3f209b01 3f209b01 be13ae55 be13ae55 3f649d80 -> c12d2f8f c1153d6c 3f4714f5", + "00000000 3f9a5b57 3f900017 be2308a4 3eeb0f35 3f0e657f bdb19f0d -> 3f9a5b57 3f900017 be2308a4", + "3f000000 3f78d720 3f78d720 3f4a8aef 3e26eba2 3e809f40 3ead3bcd -> 405dec83 401aec68 3fc84ab3", + "3f800000 3f9f15ea 3e640d17 3c282a67 3eecefeb 3f6cc51d bc9742eb -> 402be286 3e7692b2 bf0e4dfe", + "3fc00000 3f13610e 3f8419b5 3f13610e 3f0af01c 3f0af01c 3e8ad590 -> 3fa6d1fa 401586ad 4039650c", + "bf000000 3f9d8b2b 3f94c883 3f5b3d7d 3f1aab16 3f992061 3f1aab16 -> 3f53df2c 3fa0fd7a 3f136c0c", + "3e800000 bde0fc08 bc98f058 bc98f058 3d46816b bd4a3159 3f9d3f20 -> bf262a9a 3da4f672 bc91d3d7", + "3f400000 3f786f8a be08adaa 3f3dc90c 3f1f0881 3f1f0881 bd6090b3 -> 3fb505a5 be472e42 c11f4c5e", + "40000000 3e30f8e9 bdc7f12c 3e30f8e9 3f4848e6 3f4848e6 3eeb40c9 -> 3e89b762 be1b9749 3f14561e", + "00000000 3f956436 be484631 be484631 3f972401 be647359 3f35fcfa -> 3f956436 be484631 be484631", + "3f000000 3f30c596 3f8a4262 3f8a4262 3f4125d2 3f31bf3b 3f383ccf -> 3f4d8894 3fa8b190 3fa52fa0", + "3f800000 be6c0f2d 3e37d854 3f3686cc 3f371b9d bd4810af 3f00cb8c -> bea503e7 c06b3eb7 3fb56655", + "3fc00000 3f092eab 3f802f9b 3f802f9b bd3a3a77 3ebbac1c bd8cd984 -> c18f93cd 40663cc1 c1b2be42", + "bf000000 ba9dd713 3f8e1d93 3f8e5d7a bc4c207c bc4c207c 3dfcebf7 -> bd4d597a 4238e451 c0356bfc", + "3e800000 3f594dca 3cf5194e 3cf5194e bd2c3360 3edb6fb7 39aa5714 -> c08d2760 3d23658d 41b85b24", + "3f400000 3f52dc36 3f0884ce 3f9bd6f7 3e9ddfc6 3f6b0590 3e9ddfc6 -> 400d6604 3f11a87a 4051017c", + "40000000 bdc68b62 bdeaad86 be4476be 3e8841fe be4d6637 3e8841fe -> bf21b19d 3fa0e9be bf9fffd5", + "00000000 3f6dbddd 3f4e7bda 3f6dbddd bd85b53d 3efd69e3 bd5491c2 -> 3f6dbddd 3f4e7bda 3f6dbddd", + "3f000000 3ec81b31 3f5c0456 3f1c011a 3f000000 3f000000 3e800000 -> 3f161465 3fa50340 3fc30160", + "3f800000 3f5b63d0 3ebd467e 3f5b63d0 3f9d537d bd3ad357 bd9b0a28 -> 3f327eb0 c101adae c1352092", + "3fc00000 be5b9ccc 3e926aaf 3cb7c6b3 bcc78551 3f94ae14 3f67adc7 -> 41550cd4 3e67bce5 3cd4b700", + "bf000000 3f87e3dd be116545 3e5bb11a 3d5d91ad 3d5d91ad 3f998094 -> c1038708 3f8cba52 3e6df0f2", + "3e800000 3dd0709e 3f981c8a 3f75206d 3dfa9f69 bd168623 3f755ab5 -> 3e9189df c0e62dd4 3f77c91e", + "3f400000 be2da612 3e8b50f5 be2c3b14 3f85009d 3dfb2446 bd357389 -> be28c017 3fddb966 40338d65", + "40000000 3ec11cbc 3f550607 3f550607 3eae9294 3f85587e 3f85587e -> 3feae8c3 3f43f19d 3f43f19d", + "00000000 3eab88c5 3eab88c5 3f643f17 3e72ffb4 3ec800bd 3f3adfbe -> 3eab88c5 3eab88c5 3f643f17", + "3f000000 3f3f62db 3ef64f2f 3f9aac5d 3f85a165 3f274cf1 3db7a8c9 -> 3f3b5aac 3f1bcd3f 40eaee55", + "3f800000 be354cdf 3ee1e852 3f20af11 3e0e0177 3f4b4380 3f3f2843 -> bfa36b45 3f0e4266 3f57308d", + "3fc00000 bd83a0f8 bd85f2f7 bd83a0f8 3f85206d 3f92ec62 3e918210 -> bd780cf6 bd582427 be9d3b85", + "bf000000 3f614a2e 3f6b81d1 3f206a02 3e1fcdb8 3f26654e 3e1fcdb8 -> bfbff078 3f2c18c1 bf88aadc", + "3e800000 3e084c3e 3e084c3e 3f6196d0 3f497d85 bc7560e5 3f497d85 -> 3e11841d c007cf05 3f70d8ae", + "3f400000 3f2e8043 3f337ba7 3f337ba7 be0c585d 3f905029 be0c585d -> c063d21f 3f244437 c06a5337", + "40000000 bd3bdfed 3f781da6 3c2b66f5 3f800000 3f000000 3f400000 -> bd3bdfed 403a163c 3c8ed5cc", + "00000000 3f6e0f47 3e4ac862 3f2f1e94 3e81126d 3ef9ee39 3d6a010b -> 3f6e0f47 3e4ac862 3f2f1e94", + "3f000000 be109f40 3d7239e0 be109f40 3f78d335 3f8dcdcc 3eaff223 -> be12b50a 3d666fb4 be8d5e1a", + "3f800000 3e7a9233 3f6bd5f2 3f3d0100 be329010 be329010 3f6a2e42 -> bfb39e3b c0a90e26 3f4e9d2c", + "3fc00000 3f73eb3a 3f56966b 3d44ec0c 3e0898df 3e160097 3ed1b0be -> 4123cd88 4102a0ca 3e1bb190", + "bf000000 3cdbf207 3f9c2946 3f770310 be02ef69 be086b33 be02ef69 -> 3e14bf48 40cd15a7 40a70d54", + "3e800000 3e944658 3f274b7e 3e944658 3f5ede71 3dd8808a 3dd8808a -> 3e99c90a 4002468d 3f66edb6", + "3f400000 3f890375 3f9c0d25 3f890375 3df065eb 3f1320e6 3f1320e6 -> 40e36c02 3ff2a830 3fd50db1", + "40000000 3f486c21 3ed2237e 3f839142 3f400000 3f800000 3f000000 -> 3fa704c6 3ed2237e 404559e3", + "00000000 3f03ad1c 3f03ad1c 3f8c22d1 be5799dc 3f5121be 3f2f9e44 -> 3f03ad1c 3f03ad1c 3f8c22d1", + "3f000000 3f9c17ae 3f6ac74d 3f1c2a92 3e7310ab 3f707d5f 3f0437d4 -> 404b6c16 3f725978 3f654471", + "3f800000 3f86ca91 3f0f3dcf 3f86ca91 bbaf0226 3f7e133a 3f5a5c7d -> c3452bc2 3f10539f 3f9e066e", + "3fc00000 bd46ded3 bc72fc48 bd46ded3 3e800000 3f400000 3f000000 -> be88b931 bcb63d36 bdf89687", + "bf000000 3f7e573f 3f642730 3f642730 3f709d57 3f100e92 3f100e92 -> 3f763592 3f0b81cb 3f0b81cb", + "3e800000 3f7491bf 3f85927c 3f8b20b0 3f32d1bd 3f32d1bd 3f008695 -> 3f877ac5 3f93fc2e 3fada004", + "3f400000 3f14ee50 3f9ce91d 3f14ee50 3cd989b0 bd1e1024 3ef8f30e -> 41849c57 c1bc25fd 3f857a5d", + "40000000 3f48d6f5 3e7deecd 3d7a7fab 3e800000 3e800000 3f800000 -> 40afbc16 3fde30f3 3d7a7fab", + "00000000 3f1fa107 3ecbc359 bd97f413 3f227736 bdf841fb 3d823434 -> 3f1fa107 3ecbc359 bd97f413", + "3f000000 3f4e7894 3f8db5a7 3f4e7894 3ee10984 3f8f22d1 3ee10984 -> 3fa90eb2 3f86378d 3fa90eb2", + "3f800000 3f53cb61 3f23ed06 3e203332 3f2766de 3eedfe0f 3e73ad74 -> 3fa1f19e 3fb05449 3f284d14", + "3fc00000 3eaea737 3ef35635 3eaea737 3f4ac9d8 3f34599b 3f4ac9d8 -> 3ef36580 3f4638a5 3ef36580", + "bf000000 be20af01 3ea4840d 3f03b800 3f8a29bc 3e801d87 3e84ce0a -> be2697ea be23ec60 be615028", + "3e800000 3ebe7e92 3f900a98 3f3034f5 3f63e760 3f3e9e32 3f8deef1 -> 3ec45d92 3f9c6498 3f2be1e4", + "3f400000 bd5a9ae7 3e867f75 3edd6d5f 3e7aa3d4 3ef65982 3ed58070 -> be351f73 3ef34640 3f62ce45", + "40000000 be6930ef 3f421b7d 3f421b7d 3f043de4 3f4e0115 3f043de4 -> bf2769df 3f902984 400b5ab9", + "00000000 3e27e28a 3f08e85a 3f57cf0d bdaaa859 3dcf443b bdfc11cd -> 3e27e28a 3f08e85a 3f57cf0d", + "3f000000 3ebb443e 3f714f21 bd665fad 3e2241ea 3c414529 3f16f313 -> 3fab2322 4221b362 bd9b4498", + "3f800000 be37b4c6 3f958d83 3f305f4b 3f90df3b 3ee6affa 3eb42720 -> be224fbd 4025f675 3ffaa0b2", + "3fc00000 3eae1a72 3f7d9436 3eae1a72 3f800000 3e800000 3f800000 -> 3eae1a73 40ae55e5 3eae1a73", + "bf000000 3f303b43 3ce61d99 3f209785 3f800000 3f800000 3f800000 -> 3f303b42 3ce61d9a 3f209786", + "3e800000 3f04fe27 3f04fe27 3e16dc52 3f3b0c85 bdb2b302 3f3b0c85 -> 3f113fba bf8ca658 3e24c36f", + "3f400000 3e10b734 3e70b69c 3b11fc78 bd455508 3e825bf2 3f6cae82 -> c00a8b48 3f404ff7 3b1aec44", + "40000000 3e89dd1c 3f9f3e7c 3f4d2aac be2a53b9 be2a53b9 3da40e4d -> c06070dc c1819fbc 4199aa04", + "00000000 bb39747d 3ee7a629 bc56ed46 3f858d26 3f98a01c 3f98a01c -> bb39747d 3ee7a629 bc56ed46", + "3f000000 bd23fef0 bd23fef0 3f6d40bb 3f6bd30c bbc2a186 3e9d7a76 -> bd2b02d4 40566c94 3ffc279c", + "3f800000 3f469b8e 3cd6d20e 3f908ef0 3f4161c0 3f20162a 3f4161c0 -> 3f83757f 3d2bc373 3fbf5e00", + "3fc00000 3f106cf3 3f26e0ed 3f44712f 3e800000 3f400000 00000000 -> 404695ce 3f7a5164 3f44712f", + "bf000000 3f8937d5 3f510681 3f510681 3eb063d0 3eb063d0 bd26cc23 -> 3d55b540 3d22c580 41340077", + "3e800000 3f2f0f79 3d188845 3f2f0f79 3ec7f055 3d8e1e8c 3d8e1e8c -> 3f735e4a 3e25fa70 403e7e08", + "3f400000 3f9a7a05 3f9a7a05 3ebfef8c 3f2dce92 3f6edf02 3f6edf02 -> 3fd143f8 3fa2c8d5 3eca4217", + "40000000 3b3d2d00 3f393f3c 3f4868c7 3f218685 3f77e50c 3f218685 -> 3bcd3c1c 3f455c62 3fd96c02", + "00000000 3db03533 3db03533 be7cc326 3ebbc82e be550535 3ebbc82e -> 3db03533 3db03533 be7cc326", + "3f000000 3f487d78 3ede7501 3f487d78 3ed9cdc9 3f07c981 3ed9cdc9 -> 3fa7f290 3f2076cc 3fa7f290", + "3f800000 be2191ea bd960e5c 3ebe2d44 bce7cd33 3f38a8dc bdcb4e61 -> 40b26fce bdd00728 c06f77bd", + "3fc00000 3e582f9e be233c96 3e1f53be 3ebb6737 3e115927 3e115927 -> 3f427730 bfcd6d7d 3fc881f5", + "bf000000 bd90d493 3f407806 3f66ab73 bccaa882 3e0a7a1b be1d785e -> bfc48772 bfd37654 40890033", + "3e800000 3e4da345 be4b49b8 3f51915d 3f4f8053 3f4f8053 3f94a542 -> 3e59a750 be572a9d 3f4a4a82", + "3f400000 3f7bbfb8 3f7bbfb8 3f4ad0c3 3ed4dc1d bdeb7add 3de59d86 -> 400145f8 c0c565d9 40afedaf", + "40000000 be25228d 3f542f8f 3f0a4322 3f08150d 3f316edb 3f08150d -> bee41644 3fc80c5c 3fbef84f", + "3db4a77e 3f74bed9 be25d8ed 3f46b7ad 3f9ea860 bd9d681a 3eaaaf53 -> 3f7092e6 3d1c7ea0 3f69c508", + "3f98759e 3f3d9a27 3e8a92c2 3e8a92c2 3f52c90f be62395d 3c1eabdf -> 3f6e0b6a bfc165cc 4204f0f9", + "3e87c55f 3f3b5305 3c686020 3f91f824 3f63a7ea 3f97da1b 3ea0c6d8 -> 3f41824a 3c5eb24c 3fe6872e", + "bed5e856 3f9b9011 3f9b9011 3f7089b7 3f984880 3f07fe0c 3f8e9d98 -> 3fa5ed2e 3f446b67 3f7ad63b", + "3fa91266 3f944512 3e18a2e1 3e18a2e1 bcadebff 3e0be63e 3f5b70c0 -> c290e0e7 3fb257b2 3e3a39ca", + "3f26e3f4 be6540c4 bd88c0e7 3e940cef 3efbb9ca 3f9ff632 3f93df9b -> bebfe41a bd6de168 3e871446", + "3f8000f0 3f1db943 be0a36e6 be0a36e6 3f460348 3ed3d662 3ed3d662 -> 3f4be9e7 bea70806 bea70806", + "3eb08f1c 3f4a2659 3e3014b2 3e3014b2 be4f79bc 3f71c59d b82eed72 -> bf539d1c 3e33a778 c4b1b582", + "3efdf613 3f015d09 3f218574 3e1d508a 3f400000 3f400000 00000000 -> 3f16c096 3f3c3a25 3e1d508a", + "3f1c39a4 be2c3443 3e05b24d 3e05b24d 3dddc129 3ef0e227 be29f68c -> bf81b4e4 3e61868c bedbb9e3", + "bda28ca5 3f2b60b6 3f042e40 3f2b60b6 3df04cb4 3f8f31d8 be02277e -> 3e8a1ad6 3f054b3d 3f91ff93", + "3f990d1c 3ee8e838 3ec63d1a 3f2aee78 bd083f7d 3f3505d0 3f2c9143 -> c183871d 3f143545 3f86dfa4", + "3fade406 3d728650 bdd59ef6 3d728650 3ebbd04c 3edb1349 3ebbd04c -> 3e4aceee be966a16 3e4aceee", + "3fbbf0fd 3f8f9c1b 3f935632 be2af9ea be5d3580 3edbe426 be5d3580 -> c1026b31 40595c0a 3f9b457e", + "3ec10a81 bae8a7b3 3f4649bb 3e0343b0 3f9fbd5c 3f9fbd5c 3df3a3c1 -> bad739c8 3f376ee9 3ef8e4dc", + "3f030a4f 3f30e9cc be0b9411 3d36d001 3f7d5b58 3f1fc7e9 3ee3bbd9 -> 3f31dba8 be369a6e 3d95cf4a", + "be02d403 3f802113 3f4c4d7e 3f802113 bd510ce4 3f8c19fa bd510ce4 -> 40689f20 3f4e8eac 40689f20", + "3f9cb858 3f2a5fdb bc11f95a 3f505c98 3e8c0002 3f5a8723 3f5a8723 -> 40352a45 bc309f0c 3f7c1b76", + "be122512 3e98763e 3f1724b6 3e98763e 3f5b6d3c 3f5b6d3c 3ec8250f -> 3e94d5ca 3f138c49 3e6d1d87", + "3f3db642 3f88506f 3f44e58d 3f44e58d be29c501 3f8ad271 3f8ad271 -> c08f80a1 3f39859a 3f39859a", + "3f254f00 3f442d99 bc8e8c55 3f442d99 3f05596c 3f3a8312 3f05596c -> 3f9c58d6 bcb0d7a3 3f9c58d6", + "be872f68 3f6953bf 3f6953bf bc97eced 3f800000 3f400000 3f000000 -> 3f6953be 3f54caae bc5f9fc8", + "3f9ea5f4 3e7ddfdd 3f8f75f6 3f8f75f6 3d181ea4 3f823cde 3f2a5651 -> 41036f6c 3f8c67d6 3fe8e1d7", + "bd2cfadc 3f9e0117 3f1210ea 3f61cc3b 3f2940ac 3d9b0ffa 3f2940ac -> 3f9a9592 3e8d8676 3f5ce910", + "3ea66eb2 3f006d72 3f807e68 3ed35460 00000000 3f400000 00000000 -> 3f006d72 3f8e6aa9 3ed35460", + "3eddda03 3e8e4186 be240498 3f0f7afb 3f646906 3f9ba42b 3f9ba42b -> 3e95b394 be176571 3f04706b", + "3ec1bc6a 3f75cddf 3f439085 3f21d16e 3f2fbcca 3eb225b1 3eb225b1 -> 3f90244c 3fa71efe 3f8a4866", + "3f1397a3 3e19e14a 3f188243 3f22e86e 3f8cbc51 3f24df83 3f51bbdb -> 3e11da0e 3f491b46 3f37a067", + "3fb8c731 3e147935 3f60f294 3f3926d1 bd59c8b8 3f3b5fa1 bd59c8b8 -> c08007a6 3fabf0cf c19fa864", + "be3bed42 3f8d449f 3f8d449f 3f74e4fc bd88c86a bd88c86a 3e815f14 -> 408ad7cd 408ad7cd 3edff056", + "3f1403d7 bdbc225b 3e79ec90 3e79ec90 3f0b6a5f 3f41e75d 3dac5556 -> be0b8c66 3e941992 3fe3d5a1", + "bea8f456 3e8c2f6e 3e8c2f6e 3f23cbd0 3e9743c6 be307c82 3e9743c6 -> 3d6eecc8 3f636cce 3e0b9544", + "3f8e1eb0 3e6528fb 3ecf42ab 3e6528fb 3f01100d 3daa1d0a 3f8506f4 -> 3eefb45c 40abb99e 3e5b8b72", + "3ef2d5c5 3f810a57 3f8aec4d 3d784c9e 3f957f41 be54f0f2 3f72def7 -> 3f707ac2 bff3d168 3d7eaa58", + "3fbdacdd 3eddd857 3eddd857 3e6fb0a8 3f88b7a2 3f88b7a2 3f296d12 -> 3ec8e25b 3ec8e25b 3ed29752", + "3f87b1f5 3f0bb743 3f3336d9 3f3336d9 3e5bb936 3f5570cd 3f5570cd -> 402a782e 3f5918e9 3f5918e9", + "3f88f526 3f90fd91 3f90fd91 3ee00704 3f312398 bdb41ac9 3efda6f9 -> 3fd60e6e c15dc794 3f6a15bf", + "bdb9fccc be0bbcbf 3ed751a0 bddce9ce 3c3a771f 3f1e2cff be27a865 -> 3f70a6cb 3ecb39c2 be35c107", + "3deb1c5d 3eba4a7d 3f76407d 3f76407d 3f29e287 bcd71093 bcd71093 -> 3ec521b8 c056b599 c056b599", + "3e66b8fc 3f88ce02 3f88ce02 3f8c73f8 3f8c7c02 bd721323 3f8c7c02 -> 3f8610c3 c04fc9c5 3f89a406", + "3d5e2834 3e87e492 3d7abb57 3d7abb57 3f2695c2 be02ea0c 3ef9f355 -> 3e8bd957 3d02c30a 3d847e9d", + "3f2f0d9d 3f8b9039 3e92c189 3f9b6207 3f000000 3e800000 00000000 -> 3feaff3c 3f5fe7ec 3f9b6207", + "3deefed5 3ed749ca 3f9a0e30 3f888a51 3ebfe9b3 3e75c3ac 3ebfe9b3 -> 3f009877 3fd2fbda 3fa31db1", + "bdc22f7c be3f2765 3c0ef050 3c0ef050 3f000000 3f000000 3f000000 -> be2d077b 3c0162bc 3c0162bc", + "3fb4e153 3f021edb 3ec930fa 3d5c0944 3f400000 3f400000 3f400000 -> 3f3f69ac 3f13faff 3da1d75c", + "be34e5f1 3f24552d 3e1fa780 3f24552d 3f639ea2 3f639ea2 3dec36e6 -> 3f20b68b 3e1c2340 be6957cc", + "be84a1cf 3f3360d8 3f0a9488 3f3360d8 3e4349fe bd2cccd9 3d194701 -> bd8e73f8 40802d31 c07df930", + "3fa1c8f7 3f63a3c5 3ef42fa8 3ef42fa8 3f000000 00000000 3f400000 -> 4000d74a 3ef42fa8 3f2d8862", + "3f2d7d8a 3e239506 3e239506 3f932111 3e1b854e 3f1183ec 3eff9f74 -> 3f43a9fc 3e77c0e8 3ff721e2", + "3ee48449 be345453 3f07e70c 3f07e70c 3f5053dd 3e049a5d 3e629b3c -> be46bf40 4007e9bc 3faeabde", + "3f40fc7f 3f0383f2 3f3089ef 3f31edb1 3ea84337 be4a496b 3f8836a7 -> 3fa7069a c01d8efa 3f29d72c", + "3fb4774f 3e14850a bd259b07 bd259b07 3f17544c 3f973e23 3f541ad7 -> 3e92ad52 bd01b950 bd55ecef", + "3f4d4ce7 bdbadf27 bdc41ae8 bdc41ae8 3f29bd9d 3f7d8d63 3f807cd0 -> be0383c1 bdc59f91 bdc38223", + "3e05cf95 3e8fd790 3f995d2e 3eb7b0dd 3f579220 3ea98eae 3f965e85 -> 3e935e03 3fc1d6c3 3eb41ebb", + "3e341354 3f7703bf 3dc359ad 3f4f4d26 3f800000 3f800000 3e800000 -> 3f7703bf 3dc359ad 3f9e5549", + "beddcee6 3e079293 3f46ec9f 3f4123b0 3e051476 3f825634 3e051476 -> be80cf66 3f487826 bfb7816a", + "3ecdae39 3ef34734 be2b8893 3f0c1eb4 3f2843fc 3f863264 3e55ca43 -> 3f131e0f be2859fc 3fb0b86a", + "3eaba6c3 3f3bcfc5 3f8de1f7 3f0a2cfe 3f7d71ff 3e27af80 3f626b17 -> 3f3c723f 40406564 3f103a61", + "3f0848d4 3e83e556 3f6b1904 3f9e1354 be5e190f 3f1efd77 3f7f0e9b -> bf03076c 3f9bbb60 3f9e62f9", + "3f1a3c5b 3f624bcb 3f624bcb 3e78585b 3f8e66e2 3f68e595 3f8e66e2 -> 3f5481dd 3f6fd224 3e69367e", + "3f9b626b 3ecba4cf 3f8961f7 3ecba4cf 3f911f0c 3f911f0c 3ec37eea -> 3eae7a5e 3f6b69de 3f96f7ff", + "3f9e6e0c 3edc9d2d ba82a727 ba82a727 3e800000 3f800000 00000000 -> 4001f988 ba82a727 ba82a727", + "be85e468 bc9122bf 3d70ab30 3d70ab30 00000000 3e800000 3f800000 -> bc9122bf 3c4f6ec8 3d70ab31", + "3fb00f71 3f356aea 3e655a4d 3e655a4d 3f92c522 3f552a2f 3f5de5d0 -> 3f158158 3e925f72 3e8aeaed", + "3f91a1fe 3e298ffb 3ed434e8 be2e02db 3e9820d1 3e9820d1 be5c10b6 -> 3f1c7baa 3fc3d680 3f6c4dc6", + "3fadb90f 3f9cbb6f 3f99dfe2 3f99dfe2 3ec3c274 be395256 be395256 -> 407a2f37 c1171d5c c1171d5c", + "3f9f9bdd 3f032816 be41b5f9 3f3a30e0 3f941c0b 3f49a8ff 3eefa475 -> 3ed9e712 be816638 3fe1071e", + "be6b3e56 3edcd364 3edcd364 3f87f659 bc83fcc9 bb2da11f bc83fcc9 -> 40d5c356 4217b72c 41839d21", + "3e1ba3b3 3f324eb2 3f15af42 3e42a33c 3e9e41ea 3ecdf636 3f471df4 -> 3f6ee290 3f377d70 3e4b16c1", + "3e9543f4 3dd915cc be44fd51 3dbad195 3f19ea61 3f8590c7 3f960dcf -> 3e0187c5 be4298b4 3db2d05d", + "3f7e7491 3ddaac77 3e04296a 3f9b3863 3f9650e9 3f317fd8 3f8f0fe9 -> 3dba67b4 3e3e423e 3f8afa07", + "be23e8d1 3ede4533 3f94f5a9 3f94f5a9 3f400000 3f400000 3e800000 -> 3ed2692f 3f8d0301 3f1adb7e", + "3fb15d62 3f15764a 3d2cd83c 3d2cd83c 3f800000 3f400000 00000000 -> 3f15764a 3d7cadf0 3d2cd83c", + "3e58e09d be10a5a8 3eec4542 3f2b31d5 3eaaaaaa 3eaaaaaa 3eaaaaaa -> be4deb00 3f282d10 3f73b5f6", + "beeff932 3f419519 3f918894 3f83ead2 3f58f942 3f0492b7 3e9b6937 -> 3f314347 3f240e66 bd9f31a0", + "3fbca086 3d045bd6 3d045bd6 3f43398a 3ee72c1c be4b6eb9 be4b6eb9 -> 3db8a71a be828ff6 c0c0933c", + "beb558bb be1f13a2 3e3eca5d 3f6f9614 3d583ec4 3d583ec4 3f159560 -> 3f54f40b bf7f6874 3f33372a", + "3dd032c5 3e7db06b 3f9ace03 bdd7bfdb 3f800000 00000000 3f000000 -> 3e7db06b 3f9ace03 bdedaeb0", + "beb25b63 3edaee25 3f5c732b 3edaee25 3f63d2c9 3f63d2c9 3f11dda6 -> 3ed17f7c 3f52f3be 3ea158e4", + "beac9df3 3d10baa6 bd8687f9 bd81b96c 3f000000 3f800000 3e800000 -> 3cbfde99 bd8687f9 3a3dc100", + "3f83c978 3f39c386 3f39c386 3ecc67c8 00000000 00000000 3f000000 -> 3f39c386 3f39c386 3f4f6ddc", + "3f796bf1 3eab03bd 3f1eaa7a be266c8b 3f01b0fb 3e3c94c9 3f795bc0 -> 3f26a4f8 4052dfd5 be2abe25", + "3f936ae7 3f0afb13 be091f30 3f93334f 00000000 3e800000 3e800000 -> 3f0afb13 bf18b90c 40a3f2ba", + "3f8c9585 be12caf7 3f93bfb7 be12caf7 3f612097 3f45bcfe 3f72d5f9 -> be28e6fa 3fc38fc3 be1b8868", + "3f9699c8 3f9872c8 3f297bb1 3d5b3415 3f8c556e 3f065f0f 3f065f0f -> 3f88af26 3faefd9f 3de253a4", + "3e9e75a3 3f495a41 3f495a41 3e1fd4b1 3f014efc 3e650a42 3f629811 -> 3f83343f 3fd0d26e 3e264010", + "beec0c5d 3e2ec260 3ec6025d 3ee0d5fe 3eb7df62 3e6cbad6 3e6cbad6 -> 3cf7d6c8 be532940 be6fc508", + "3e8c87e2 3e59ad77 3ed93df2 3f911225 3e26fa01 3f80b1ac 3f80b1ac -> 3f031564 3ed8eba0 3f90db2c", + "bc904ea8 3e150b8f 3e150b8f 3c930194 3f2d3ebe 3f0cb3fb be26215e -> 3e13ca80 3e12e4ca 3ca58ec4", + "3e37a00d 3f28c85c 3f0951c5 3f28c85c 3f3e5a14 3ef8b8ed 3c472266 -> 3f333889 3f23627f 41244b6d", + "be950dd0 bde03e39 3f9b5390 3f9b5390 bdb66170 3db00eff bdb66170 -> beffa5e8 c022bb21 40b11468", + "3f86c306 bb44a0a3 3f38ef4e 3f25e2c9 3eb77a34 3eb77a34 3f91fe26 -> bc0dd2da 400563d1 3f105c84", + "3faa40e7 3f8d55e2 3f3ba026 3d97fad8 3f9633e0 3d428b5d 3ef53465 -> 3f631814 41a2435a 3e39f6e0", + "3f95013b 3f685f8b 3f685f8b be161028 3f9a1977 3e7a92ae 3f9a1977 -> 3f3a8eec 40856a68 bdf0f3fc", + "bee619c1 3ea14b00 3f8b3f1a 3f8b3f1a 3f6be6ce 3f984936 3f984936 -> 3e9b1dfe 3f9539f6 3f9539f6", + "3e3205f3 3e41cf5e 3ef4a97d 3f1e4c1d be0d313c bd63f33d 3f289d98 -> bda8804e bf8c8b00 3f2c8f3c", + "3c6f1b99 bd8ca688 bd8ca688 3dbc8518 00000000 3f000000 3f400000 -> bd8ca688 bd8eb403 3dbd6fde", + "3e9823ea 3ed1af2f 3f183270 3f3eab24 3f8c811b 3f86f984 3f8c811b -> 3ecc23a2 3f15dc2c 3f39a053", + "bec3f79d 3eace184 be62cfdd 3f928071 3f319eae 3f18fa4b 3f1297b6 -> 3e8fae72 be285949 3f514dea", + "beb2d62b 3f878c04 3ebd6e34 3f846cd6 3f7bbe9c 3f429609 3df7edbe -> 3f86bf24 3ea88c2c bfcb67b5", + "3f22030e 3f2b7fd7 3e27cbf3 3e540302 3e800000 00000000 00000000 -> 3ff88d56 3e27cbf3 3e540302", + "beeb5eba be575b60 be575b60 3eb1de6e 3f000000 3f400000 3f400000 -> bde8b62e be365b47 3e969cee", + "bed53916 be1a2a86 3e02dd5e 3c2e7053 3def5f7d 3f225832 3e0df322 -> 3ea576e6 3dc6d978 bc8a7b9c", + "3f305a9a 3e0b1be6 3f3b1ed4 3f3b1ed4 3de9babc 3f858d14 3e3a6de6 -> 3f5cbdc4 3f35c333 403f8fd2", + "be269931 3f778252 3f8d686f 3f778252 3f9d3140 3ef42586 3f2d0925 -> 3f7efcc2 3f6855ed 3f6433b4", + "3f0febfc bd37d77e 3f6cb688 3f069a73 3d92dc10 be3abcad be3abcad -> bebe399b c01c87de bfb20489", + "be9ea19e 3f249d7b 3f4b29f8 3f249d7b 00000000 3f000000 3f000000 -> 3f249d7b 3f0c37e4 3ee339d9", + "3f24668f 3e73a820 3f27a3aa 3e11b49e 3daad752 3ef4a38d 3ef4a38d -> 3ff55e7c 3f8ea5bc 3e77f792", + "3e8809dd 3da1af41 3e202161 3f18aea2 3f6e61a8 3f980906 3f71aff0 -> 3da4dc15 3e196779 3f1b15a8", + "3d871c13 3ebb1edf bc88853e bc88853e 3f000000 3e800000 3e800000 -> 3ec77719 bca38a35 bca38a35", + "bddc79cc 3e9dbf8f 3f97808c 3f97808c 3e2c303f 3e2c303f 3f511d50 -> 3e13799a 3f0da2b9 3f93d867", + "3e74bf87 3f98bf44 3f98bf44 3e4ec7ec 3d348abe 3e8440d3 bc2041aa -> 40ec20da 4000c9b6 c098fbbd", + "3ebbd5de be5809ac 3f5c1a49 3f95f207 3f8eb177 3ef1ca10 3ef1ca10 -> be4fe06c 3f9b2bd8 3fd36be7", + "3efc9ff5 3f3f79e2 3f3f79e2 3f92e482 3e49c228 3f474ec8 3f474ec8 -> 4010200a 3f5a5970 3fa78238", + "3f802430 3eea2985 3f4d74dc 3eea2985 3f800000 3f800000 3f800000 -> 3eea2985 3f4d74dc 3eea2985", + "3fbc5d89 3f3d7d7d bdc0b2ed 3f0a2492 3ee76683 3f7edddc 3ef95389 -> 4003e889 bdc1f5be 3fb028a2", + "3f15dbd4 be5b4363 3f215c90 3cf6d055 3f534e4a 3eaac9d7 3c84f098 -> be76696d 3faf09db 3f8cb625", + "bef2d3c2 3edafc67 3ed85154 3f4403e7 3f9c29e8 3f290c2f 3f3ccb29 -> 3eedb772 3ea38c0e 3f22ec01", + "3f75453b 3ef35de6 3f183ec4 3ef35de6 3f937101 3f898249 3f678834 -> 3ed49f2c 3f0e2892 3f0600f6", + "3f8b6cb7 3f9a9e7e 3f9a9e7e 3eee24e6 be1705f9 3caa4066 3caa4066 -> c1107828 427cd070 41c2b12a", + "bd63c46a 3f325fea 3f86949a 3e5d8706 3e2f85f6 3e2f85f6 3f904b0b -> 3f026d3f 3f44cf2c 3e5eeb1d", + "be3b9d70 3f6f5a84 3f9e1791 be19d69b 3f21646e 3f21646e 3efe55f9 -> 3f55a586 3f8d1cda bdfa912d", + "3fb277de 3f2e6022 3f2968c5 3f2968c5 3e0ddb33 3ef7b9ff 3ef7b9ff -> 40d2c94c 3fd2b20c 3fd2b20c", + "3f2a45de 3f825872 bd0579da 3f573076 3f8e8c58 3f8e8c58 3e2f9bb3 -> 3f72feab bcf8d4ae 4062aaaa", + "3f914a30 3f42ce2b bd7c2910 3f42ce2b be636570 3f1fcbfa 3f3a27d9 -> c07f82f4 bdd43ce0 3f8ae244", + "3fa8b4e7 3f96db6a 3f9f1e04 3eec695f 3ece93c9 be5e6871 3f8fb422 -> 405e6a30 c0fe0bce 3eca5c72", + "3fbc0413 be40e61b be40e61b 3e67070b 3e17ee4e 3e17ee4e 3f50f833 -> bfe36894 bfe36894 3e99b35f", + "3f462da2 be360210 3ee491ba 3ee491ba 3f93227e 3f93227e be7258aa -> be23af30 3ecd8ed6 bfae016a", + "3f384457 3f82fd2d 3e89a40a 3f5d1404 3f45c861 3f45c861 3f83ca35 -> 3f9ebde0 3ea6cd86 3f588089", + "3fae37b4 3eb20bec 3eb02bab 3f8f313e 3f800000 3f000000 3f000000 -> 3eb20bec 3f4ff9d9 40290b40", + "3f128fa6 3f174001 3f9752a0 3f9752a0 3d912263 3f9dae91 3d912263 -> 40a0d1bc 3f8703da 4120e589", + "3f965e70 3eae81ad 3e9fbeeb 3e9fbeeb 3ef75069 3ef75069 3ec3f91d -> 3f44f45e 3f344b85 3f672f7a", + "3fa330ec be7cb286 3f00a2de 3f9068c2 3f8164dc 3f8164dc 3f7aac66 -> be793a00 3efdbd20 3f945248", + "3f16978c 3efa6df2 be0de650 bde7f2e9 3f70c62b 3ed1dcd8 3ed1dcd8 -> 3f01df66 be83097f be563165", + "3f1f0f20 3f8057aa 3f8057aa 3f25e8ef 3e44b8a9 3f948257 3f948257 -> 4067d7bb 3f6aa8f8 3f17ac8b", + "3f5168f3 3f0a7143 3f005ba9 3eaa47ed 3f000000 3f400000 3e800000 -> 3f7bb07c 3f235b7a 3f9309e0", + "beae2a36 be452267 be51b981 be51b981 3e800000 00000000 3f000000 -> 3b814d80 be51b981 be0a622c", + "3f2d4de4 3f7c34c1 3f96dc2d 3ecc5528 3e88244c 3f01eac1 3f907acc -> 4034e48e 3ff9f94e 3ebc8e04", + "3e3058c7 3e4a7138 3f2534ec 3e4a7138 3d210760 3b5f5598 3f2742e8 -> 3f83cc17 420495e4 3e5cf048", + "3f5f8d30 3f0f4d62 bd0069bc bd0069bc 3f800000 00000000 3e800000 -> 3f0f4d62 bd0069bc bde86941", + "3f610e5b be4638b7 3e1ee791 3bd386a1 3f88533f 3f601d98 3e67f327 -> be3b9463 3e32c767 3cd3a196", + "3f0eb07b 3f971974 3f6ea026 3f971974 3eeb0bb8 3f65b3db 3f65b3db -> 3ffa55ea 3f7dda47 3fa0bdc7", + "3f455e6f 3ea7bdca 3ea7bdca 3f41480f 3e800000 3f000000 3f400000 -> 3f8aeda4 3f14885c 3f72f3fa", + "3fab7f3a 3f977a93 3f69cd24 3f7b510b 3f615993 3e206028 3b9caeaf -> 3fb31537 40f0154a 43895f6a", + "3efb9b6d 3d408ca8 3f37b093 3c63408c 3f4309ce 3f876dc0 3f4309ce -> 3d5e1ffe 3f32bcfa 3c831439", + "3f7dbdf4 3e854cc9 3e16ca08 3de78ec9 3ef8e77d 3f2df33c 3f2df33c -> 3f087a89 3e5d4979 3e29e893", + "3ed513df 3f3c4ce6 be09641e 3f8950dc 3f400000 00000000 3f800000 -> 3f566bff be09641e 3f8950dc", + "3e6e0aa9 3f15e875 bd9d1256 3f0cb0d5 3e8e8fae 3f82b2f1 3f0ad922 -> 3f7036ea bd9c514f 3f28491a", + "3f1ea2df 3f1163e2 3f10e84d 3e722e46 be6fa5e4 3ed9cf9e 3ed9cf9e -> bfa4d5ea 3f85185d 3ede706d", + "3f314b5e 3f2ee31f be500d1f 3f951894 bd8c4334 3f0b0cc8 bd8c4334 -> c0d656f3 bea49e77 c136baf4", + "3e13b590 3f6eb016 3f6eb016 3f2f71d4 3f076abf 3f076abf be79c354 -> 3f86ac55 3f86ac55 3e3984ce", + "3ea75a0a bda3b67d bda3b67d 3f7af7ea 3e5e3299 3f8e25e8 3e5e3299 -> be326764 bd9e630a 4008bea7", + "3f4d2a14 3cceaccf 3d38e191 3cceaccf 3f6eccc7 3f6eccc7 3f965ee5 -> 3cda9aee 3d438da2 3cb6089a", + "3f9862ec 3f3e942c 3e86fadf 3e09458e 3f3ff917 be6e5dff be6e5dff -> 3f852012 bfb30333 bf360d44", + "be2a66fb 3e75fc44 3ed9559e 3e75fc44 3f9b646e 3f50a3f4 3f996237 -> 3e7d3382 3ed12000 3e7cc278", + "bed57176 be12c0aa 3f6ed967 3e3b35bc 3f065e6c 3f065e6c 3d7c6199 -> bdb6bf54 3f14b76e bf7a56fb", + "3e9bbd51 3f8eae1d 3eb90b09 3db56ff3 3f1b0471 bc170cf9 3f072fa0 -> 3faaf3c8 c13ac373 3de6c262", + "3ef4ce85 3e2ec8a4 3f2b6abd 3f2b6abd 3f7e8535 3f6ff5ef 3f2000ce -> 3e2f4504 3f30e536 3f5c9749", + "3fb8488a 3e2a683a 3e2a683a bd56102e 3f659bb0 be067fdb bdc41fb9 -> 3e469b62 bff2d92a 3f4f05c2", + "3d916292 3da69d69 be212e14 be212e14 3f813493 3eaca658 3eaca658 -> 3da6812a be37ab6f be37ab6f", + "3fa6e4d6 3f9f19ab 3f432da5 3f8c2a6a bcfb3769 3ea72114 3ecceda2 -> c254e7b0 403413ac 404f01cc", + "3ce7ce9b 3dec92ef 3dec92ef 3eeea309 3f400000 3f000000 3e800000 -> 3deece2e 3df344ab 3f017289", + "3e8545b5 3dbbd8f3 3f9ae6d5 3f811d4b 3e800000 00000000 3f800000 -> 3e27449f 3f9ae6d5 3f811d4b", + "be8cd9c5 3f8a4a01 bdd8a233 bdd8a233 3e1103ce 3e1103ce 3f6a52a6 -> bf389b86 3d9098ac bdd31ed2", + "3e027d35 3efc308d 3efc308d 3ef784b7 3f400000 3f000000 3f000000 -> 3f037371 3f0e29c6 3f0b87aa", + "3e2d62ef 3f51eb1a 3f51eb1a 3f814479 3f98ab2f 3f57cbba 3f98ab2f -> 3f4c2cd1 3f588a5a 3f7b7624", + "3d4f50b6 3dfdc872 bc258e7b 3f5caa6d be4eca2b be466245 3f60f4c7 -> 3db154bd bbe3d960 3f5e34ff", + "3f1d10c1 3f8f1405 3f3fa6bb 3f034ce8 bd9b6934 be2d4570 bdcf69e7 -> c109b089 c01b35bc c03a2bac", + "3f9aa6b2 3f4a72a2 3f5d9948 3f037b94 3e129a77 3f1dfcd3 be42e5e1 -> 40d04ac8 3fc1d964 c05781b3", + "3f09acfa bdb3732f 3f894eab 3f894eab 3eb806d4 bd274c2c 3f89236d -> be2fb915 c15a0edf 3f8462fc", + "3f5c47d4 3f8ad867 bd8b2383 3e947a82 3b37d7e8 3b37d7e8 bdf6e4b3 -> 43a67091 c1a6ca9a c001e263", + "3eb33f6a 3f799731 3f799731 3f6a323c 3f40310f 3f272d3a bd8e1ea4 -> 3f8b4cf0 3f940227 c080a9e6", + "3f3ebd0c 3ee39bf2 3ea95a19 3ea95a19 3f400000 3f000000 3f800000 -> 3f0e119c 3f13c404 3ea95a19", + "bdeb420e 3ed07784 3f8e7a91 3ed07784 3f1e01de 3da70127 3f9d253b -> 3ec19d8d bea773e8 3ed4e884", + "3eb0c1f7 3ea351cd 3ea351cd 3f8f6d77 3f400000 3f400000 3f000000 -> 3eb61d21 3eb61d21 3fc0f16e", + "3e84663d 3c70a74a 3f8ee8ba 3c70a74a 3e240db1 3ebd254b 3edb0174 -> 3d0db71c 3fcdfcff 3ca1f453", + "3f030d59 3f67f399 3f67f399 bd090251 3f1c3cf6 3f56b1b3 3f5c3864 -> 3f99e2a7 3f7ecbf2 bd146790", + "3fb35e5b 3dcef452 3f4aa498 3ed1aed3 3f443465 3f826272 3f826272 -> 3e13ab32 3f457318 3ecc4f22", + "3f81414b 3f39d65a 3f39d65a 3f63bd93 3f93e77d 3edf02ac 3f365fa0 -> 3f20953f 3fd6822f 3fa04ab7", + "3d3e5705 3edc9d70 3f5c2ad2 3f5c2ad2 3f4af67f 3f3cfe8e 3f8534e1 -> 3edf4b42 3f5fcb6a 3f5bc472", + "3e0926fe bda63090 be2ddf64 be2ddf64 3df794d7 3f8350d8 3f2b0ffc -> be240778 be2d48da be396f94", + "3fb73fa8 be2590f0 3ecd54bb 3f83f061 3e829e98 baa47efe baa47efe -> bf566900 c3e4d347 c4930922", + "3f90c406 3f879a9d 3e5375f8 3e5375f8 3f1be9bc bc271e15 bc271e15 -> 3fea0e41 c1b76501 c1b76501", + "3f652f1f 3f532f2c 3f54ba56 3f4f7413 3f800000 3e800000 00000000 -> 3f532f2c 404403f7 3f4f7413", + "3e39299d bce125ce 3f3a2648 3f9b2b4d 3b8ea1f3 3f3ba548 3f3030fc -> bf9505d0 3f466938 3fa7e0e6", + "bea995e2 3e6e0e8c 3cfdec19 3e6e0e8c 3e800000 3e800000 00000000 -> 3ac10900 394de700 3e6e0e8c", + "3fbbeae5 3f1fc7c9 3ede60dc 3f1fc7c9 3f000000 3f400000 3f000000 -> 3fc52d70 3f259a07 3fc52d70", + "3f503eef 3f9d1588 3f74f199 3f9d1588 3e5f9d23 3f892dcf 3f0ae3fc -> 40999d31 3f679c82 400469d4", + "3f43bc9a 3e69c964 3f0dd5a6 3f0dd5a6 3e047c95 3f77b064 3d51ff6e -> 3fb3940e 3f11792f 41064a0f", + "3eaf719d 3f71a40f 3f4cb8e2 3f71a40f 3daa8d08 3daa8d08 bdb75b6e -> 4090243c 40743d00 c03f8094", + "3f7a9e7c 3f9d75f5 3f98cb66 3f970c86 3f5b6ef7 3f757232 3f5b6ef7 -> 3fb7260b 3f9f39f8 3fafb0d5", + "bedbbfd6 bd8a6bc7 3c58d585 3c58d585 3f8985c5 3e130f27 3e130f27 -> bd8e88e6 bca91060 bca91060", + "3fb92e3d 3d70f786 3f89aead 3f8eec45 3f03041b 3ebf247e 3e44bd92 -> 3e0f61dc 406c05d5 40fd16b2", + "be9ea714 3e32d744 be1ba015 be7d73ce 3f05d692 3e864c57 3e864c57 -> 3e004229 bca002c0 bd024c20", + "3fbb34b4 3eac7df6 3eac7df6 3f977064 3f800000 3f000000 00000000 -> 3eac7df6 3f546280 3f977064", + "bebbeef7 3f55b3fb 3f49a559 3f4fce1b 3ebe4824 3f8da9d8 3f9b87dc -> 3ea2284e 3f50c8e2 3f5d4e92", + "3f3cad4b 3ef12d5e 3ef12d5e 3db4ad88 3de111fb 3f961675 3f763368 -> 40521b89 3ed704ab 3db9fa5c", + "3f2da81c 3e0e2a16 3f28e2af 3e0e2a16 3f53e668 3f1a8915 3f1a8915 -> 3e223c08 3f741ada 3e4d7b8a", + "3f66aa94 3f20721c bdc5acb2 3f856abd 3f98b195 bd7bf88d 3eabbc22 -> 3f0910ee 3fb3bcfe 4039cd08", + "3f3a60f3 3eb749ec 3f69637c 3f887b82 3f81a07f 3f1c46d4 3f733a22 -> 3eb59d2b 3faae870 3f8db357", + "3f9a996f 3f7912a3 be73865d 3f7912a3 3f59f11d 3ea51683 3f83f08c -> 3f96cd86 bf5766bf 3f701712", + "3eeaed67 3f5c1793 3e75abf8 3ed358be 3f1bf0aa 3f6b6dae 3f6b6dae -> 3f8e7219 3e7f8584 3edbd1fa", + "3f831cc7 3f78dc55 3f3a0fb1 be0ea3ab 3f000000 00000000 00000000 -> 3ffbe2e3 3f3a0fb1 be0ea3ab", + "bd8fa9d3 3ed94b88 3f8ba7f8 3e3c24f3 3efcf200 3f20ab41 3f20ab41 -> 3ec9af1e 3f85d7ea 3e34503f", + "be9305e6 3e99b831 3f90f594 3f90f594 bdc45440 3d87fc49 3e2ef027 -> 3fa49460 c05c286f bee448b0", + "3f8878e9 3de30e93 3de30e93 3f3590f6 be527ed4 3ecdebd9 be527ed4 -> bf1516a0 3e92b8f8 c06e6ff1", + "3f41ac40 3c3579ca 3d87f068 3f35fdb2 3e800000 3e800000 3e800000 -> 3d1456a3 3e5e3bc5 4014c276", + "3e0af5ba be09352e 3f31d2ae 3f31d2ae 3f2dcd2c 3f2dcd2c 3da4a9ee -> be120384 3f3d3c54 3fe2e92d", + "3f5f88fb 3c13a497 3f3dbb47 3f3dbb47 3f6e79d0 bdb1bfc8 3e325449 -> 3c1d1dd0 c0eb98ab 4073d7d5", + "bdb1d0c3 3f87a0e0 3f5eecd9 bdb0f8c0 3f0c8603 3daae476 3f0c8603 -> 3f7be730 3d253050 bda45853", + "bde543d0 3ee09e89 be7fac0d 3c8c0189 3f400000 3f000000 3f400000 -> 3ed83cd0 be630cfa 3c86c81a", + "3f657258 3f5da3e3 3f5ced79 3f5ced79 3f4b5ea1 3f4b5ea1 3d9082c8 -> 3f888650 3f8815f4 4130d21f", + "be928224 be044a7e 3ee5e269 3e04f9f1 3ed987a2 3f479900 3f479900 -> bda217eb 3ed34bc4 3df4729e", + "3e5e32ed 3f17e82f 3f093c35 3e973dae 3f6fbc38 3f6fbc38 bdb4dbdb -> 3f1a24af 3f0b416a befd32fe", + "3f90713b 3e8712d3 bd670c40 3f6cdf54 be72164f 3f9ad9c4 3f4d3b0a -> bfa585a9 bd39d6aa 3f977f86", + "3db4c2e5 3f991ffe 3f825a4a 3f825a4a 3f20f66e be106028 3d45eaa1 -> 3fa11ad1 3e94fb2e 40327a42", + "bdaa9876 3f7b4ea4 3f7b4ea4 3f08d4bc 3f979a12 3f74ba9d 3f74ba9d -> 3f7e90f1 3f7a57d4 3f084e5a", + "3f7c6cf3 3f3cdb75 3f9763fb 3f662790 3f31db89 3f2b2f0d 3ec1c15a -> 3f875643 3fe15a3e 4016ba0e", + "bc272d24 3f93fe53 3ed6b88f 3ee77c2e 3e87a51e 3f4133f6 3f09a947 -> 3f8fcdbe 3ed60241 3ee57462", + "bee0d386 3ea6c7d5 3ea6c7d5 3eda7071 3f9a3d4c 3f26fa76 3f26fa76 -> 3eb33d54 3e7f78fa 3ea74d23", + "be9a3174 3f86aec8 3f958def 3f6e0b1a 3f6c9ba5 3e8f5388 3f6c9ba5 -> 3f835bc2 3e86cd50 3f682af8", + "3f3b6579 3d6f102a 3f9eb311 3e4a783b 3f000000 3f400000 00000000 -> 3dcf07de 3fc56c4d 3e4a783b", + "3f159085 3f4e2921 3e674ce9 be3659b5 3f86ab75 bd775961 3f86ab75 -> 3f483202 c005d998 be3112f5", + "3f92f138 be7f0ae1 3f90a189 3f807c8d 3eff5c71 3f02f5aa 3f8b0fba -> bf0952bf 40179496 3f6981f3", + "3f94b8b0 3d5bfeb8 3eeb5fcb 3f692231 3ea6b807 3f355206 3f355206 -> 3e3b57c4 3f2e0152 3fac5946", + "3facfe31 3f27daf8 3f75f277 3f27daf8 3f776f2a 3e4ded7d 3e4ded7d -> 3f2fb573 40c3ce2e 4085a264", + "3f04c9d9 3f2c4b4b 3f90178a 3e909c4a 3f800000 3f000000 3f800000 -> 3f2c4b4b 3fdad54a 3e909c4a", + "be2507a9 3e4d39f0 3e7adf8e 3ee42f3a 3f0a7ab6 3f824493 3f824493 -> 3e31284e 3e7b93bf 3ee4d31e", + "3f02c6ea bdee45d4 3f1b3659 bdee45d4 3f000000 3f000000 3f800000 -> be33ff37 3f6a808c bdee45d4", + "3f199eea be4bf7e6 be4bf7e6 3f8e1cbc 3e7ac997 3e7ac997 3ee105a7 -> bf115592 bf115592 3ffadf03", + "3f20eb74 3f6d49a1 3f4b7441 3f265ab8 3f5a0c26 3f362043 3f5a0c26 -> 3f839fec 3f7f542c 3f388e28", + "3e0ada0c 3f96e78c 3f228622 3f96e78c 3f0646dd 3f769ca9 3f769ca9 -> 3fa97426 3f235ce7 3f97aef6", + "be4fa7b0 3f96ab2b 3f3abedc be2e3ae8 3f207668 3ea24e78 3f822306 -> 3f847a2d 3ed24eee be2ecf6c", + "3f9d6fe6 3ea322bf 3f0ab1c3 3f692190 3f0e46a2 be7a1d3a 3f82c83c -> 3f21c2d3 c036945d 3f6307f3", + "3e10fddf bdfe3265 bdfe3265 3f486172 3f9597c3 3f0c14f4 bdf9df99 -> bdf90064 be0dfd8c be7226d0", + "3f9a4b3b 3f9548fa bd12c6a3 3e9b79ba be4dbc09 3eacb279 3eacb279 -> c0e7957f bdf731c3 3f82ec45", + "beb75332 be04a4fd 3f2a5480 be04a4fd 3f96ff71 3c3c67bd 3f807cd4 -> be0be0cc c19e822f be04d321", + "be949173 3d5b0207 3f89ba81 3d5b0207 3f623e25 3e02a00c 3e02a00c -> 3d52a63a bf8799d7 bd579ff2", + "3e80afe9 3e9a8ba0 3f956d39 3f25aec5 3e800000 00000000 3e800000 -> 3f0789d2 3f956d39 3f914e50", + "be2328a8 3f84b5aa 3f072c69 3f39385b 3f056033 3f8981bd 3f056033 -> 3f6289af 3f08a99c 3f1e164e", + "3e9aeea6 3f251352 bd89e5ec bd89e5ec 3a46046f 3f26bf77 3a46046f -> 438161ff bda03bb6 c1d829da", + "3f0997dc 3e048587 3f75785c 3d84d8a8 3f49d24c 3f06dfe9 3f49d24c -> 3e17a46c 3fb5fa28 3d98038c", + "bbf53e0a 3ebdb9e7 3e89f7a2 3ebdb9e7 3f2ffe0b 3ebdff79 bd9a85ce -> 3ebd14a6 3e8837a4 3ed1f73b", + "becfcb15 3f97d680 3f977d7c 3ef89a3a 3edc8d35 bdec3d46 3f8fb957 -> 3f0ccffe 40ba7dee 3f01d202", + "3f37eb45 3f2e9a54 bc68435b bc68435b 3eeb2d72 3f0202e8 3f0df13d -> 3fa120ce bcc4fb9c bcb72c86", + "bcfe756a 3ee31756 3f81e842 3e199f97 3f400000 3e800000 00000000 -> 3ee0bd68 3f6b9a84 3e199f97", + "3f31d404 3eaf79ac 3f6e8d47 3dc0abe8 00000000 3f400000 3f400000 -> 3eaf79ac 3f92e4d8 3ded48b7", + "3fbabc55 3f012f75 3f012f75 be57f615 be7a2d94 3f44ffcc be7a2d94 -> c04fabb4 3f39a156 3fad954e", + "3f439648 3f92ab9a 3e64b9b8 3f9f05db be4d59a0 3e0f721c 3f7938eb -> c0830b42 3fa2adfe 3fa253b4", + "3f8dea83 3f7dd080 bdf609f3 bdf609f3 3ea99d30 3f256698 bdf64118 -> 404d77cc be45bae6 3f8f76b9", + "3fa1223c 3f1295db 3f1295db 3f5713b8 3f8d8930 3e46f3a6 3f8b1c08 -> 3f00f00d 4063f4f1 3f417456", + "3f27d611 3f8b6bd6 3f929461 3e0fd085 3d813160 3f041942 3f041942 -> 413b203c 3fecb71d 3e683ffa", + "3ebbd472 be507842 3f8f111b 3f8413d8 3f63126d bdd016e4 bcb390dd -> be5a3678 c054fc15 c184edf2", + "3e35c350 3f836281 3f8bd5dd 3ed77483 3df7f094 3f46ddb1 3d3f9926 -> 4016595e 3f92f76d 3ff8b2b0", + "3f9673da 3f94db84 3f56383a 3f9d0477 3f33ad4f 3f76dd3d 3f542f95 -> 3fdf2e35 3f5f89b7 3fc3208b", + "be596180 3d5f2802 bd855c49 bd855c49 3f3edc05 3d205e0c 3f3edc05 -> 3d4efce3 3e8c5ad2 bd776568", + "3ea7bb43 3eec45ec 3eec45ec 3f5e7fe8 3f6dd09c 3f6dd09c 3f37fe65 -> 3ef23124 3ef23124 3f7b0692", + "3f4b38b6 3f98730c 3f4ce2f1 3eaa40e6 3f296200 3f296200 3f993867 -> 3fd655c8 3f900780 3e9401d2", + "3f4b4622 3f7a7f80 3f7a7f80 be6fb45f 3e4bd270 3f40e6c3 3f40e6c3 -> 40835c81 3f9dc7bf be96fb57", + "3f83bcb6 3f32fe41 3ef906e0 3dd94647 3f2f20d8 3f2f20d8 3f19777a -> 3f84080d 3f37b0d0 3e3756a8", + "3ebb325d 3e7937ff 3f85d382 3f85d382 be1073cb be1073cb be4ff6c7 -> bef3ea14 c002fa55 bf9c0720", + "3f3313c3 bdafd003 bdafd003 3f26feaf 3e554491 3d1a3f2e 3f20751f -> bea0d56c bfcf6a94 3f6c8d3e", + "3f9d71c3 bd4e263e be1af5a9 3e9f9cb6 3e800000 3e800000 3e800000 -> be71b728 bf35b1b2 3fbb263c", + "3eafad38 3f5da417 bdab4349 3f6575c0 be05811a 3f717109 3f717109 -> bfdadbd0 bdaece60 3f6a3514", + "be542988 3e934234 3ee32d21 3d444bc5 3f8a398f 3f95d585 3e8c46c8 -> 3e9583fb 3eea0903 3cb10b2a", + "3e7638bb 3f94a830 3f4973bf be47b955 be3361b3 3f7fa52b 3e5bc1b7 -> bf3645c4 3f4984f4 bebbbcfe", + "3fa3bc0a bd45b1e7 3f82c80d 3dfbaf06 3e150bda 3e150bda 3f4d6fe1 -> bed24748 410b1b19 3e25761c", + "bde49b99 3ec97174 3ed99472 3ed99472 3f000000 3f000000 3f400000 -> 3eb2f505 3ec14ae4 3ed17bee", + "3f909769 3f5df085 be2e21d2 3f88288e 3efdd389 3f876634 3e16ed96 -> 3fee7872 be2361fd 41003c5b", + "3f1ad7d7 3f0e3b42 3f0e3b42 3f96dd07 3f98abff 3f417cef 3f417cef -> 3f00543c 3f2a069e 3fb45836", + "3f5df837 3f855a4d be327282 3e1fc9cf 3f11445e 3c58d225 be3cdcdf -> 3fdd7dba c1370e30 bf367d01", + "3f16b974 3d29ea95 be1f9152 bd888f04 3efe8ed4 3f1819b1 3f991c71 -> 3d878ba6 be5fbe5e bd76bea9", + "3ebae137 be3f9cab 3ec9ad72 3ee4bb7b 3f49f256 bd182dc7 3f9a0317 -> be5254ef c067a848 3ed6a1b4", + "3fb604d4 3f280233 3d41a97a 3f280233 be5d8b69 3e49eb2a be5d8b69 -> c092e5ac 3ea45c1a c092e5ac", + "3eef9c78 3f215418 be3eef93 be3eef93 3ecd4768 3ebdaed5 3f04412e -> 3f8911b9 beab6304 be89457d", + "3f145e05 3f8f6fcc 3f4b5028 3f74ea9c 3ef21f48 3f499ada 3f9d6203 -> 3fec18b0 3f6b1afe 3f5a6a81", + "3f3391a0 3f790c7e 3f99f1ad 3f26c894 00000000 3f400000 3f800000 -> 3f790c7e 3fbdf032 3f26c894", + "3f470080 be327e9c 3f3eb1c3 bc2096e4 3f8d2d17 3f4a424e 3f4a424e -> be258b6a 3f6614d7 bc41c226", + "3e09c06b 3f827376 3f0ecbb4 3f827376 3e289885 3e289885 3f5c24ad -> 3fdb7cda 3f70420e 3f854f30", + "3f23662e 3d36d7f2 be203d03 3f6097f9 3f970fd6 3ea5b010 3f970fd6 -> 3d2506da bebb0180 3f4ab568", + "3eb29b1d bddb620b 3e6cb313 3e6cb313 3f844053 3f0d6078 3f844053 -> bdd8ec44 3e97d27c 3e6a0b96", + "3f8f547d 3f63d90a 3f63d90a 3e893efb 3f7521ff 3eef01e1 3f7521ff -> 3f6f2892 4001d0d1 3e900f21", + "be9282ba 3eaea7ef be7efd93 3f9fd2f7 bd9eb9ff 3f37a2a7 3f5f49ba -> 3fd95f6c be623ca1 3f991fba", + "3d8cd2f0 3f092e1d 3f311006 3f092e1d 3f400000 3f000000 00000000 -> 3f0c530a 3f3d3cdb 3f092e1d", + "3ea5255a 3ca1bc6c 3f09575f bd7a7dfa 3d91babe 3d91babe 3f9074c1 -> 3dd2ad57 4032e68c bd7149b9", + "3f687464 3f8faebb 3f8faebb 3f1fcac0 bc0dd384 be1af37d bd99061c -> c2eb4a6a c0d43ef8 c0f0e61b", + "be2e7563 bd05cf5c 3e4f7b45 3e4f7b45 3ede20a9 3f21fc1a 3f21fc1a -> bcd01ec8 3e3af723 3e3af723", + "3f40b06b bd83fe13 3d350b0d bd83fe13 3ec493f7 3f3bfffc 3ec493f7 -> be11b3e4 3d665510 be11b3e4", + "3fba5700 be4e3393 bd3975a0 3f9ee481 3dc21e21 3f56539b 3ddb477a -> c04010c7 bd6df4a6 41827f80", + "bed44840 3f9dbd35 bdad4cbf 3f22456b bcd210db 3f89d513 3c92e6e2 -> 41ad5981 bdb26ce8 c15c2514", + "3d36e12b baa73594 bdd90abb 3c04f956 3ef5f4b7 3f547c06 3ebe8e5b -> baaf48de bddb06c7 3c0efd32", + "3e6686c7 bc774793 bc774793 3f384257 3f90eadf 3f90eadf bd80ccf1 -> bc70c7ea bc70c7ea c00132cd", + "3fba7ff0 3e72aa0d 3f07b545 3eb6f92a 3e12bfdd 3e12bfdd 3f1f73bd -> 4013441a 40a4b6fa 3f2c32e1", + "be49eed0 3db9ed44 3f7d1ae8 3f7d1ae8 3f3dc8ba be1cfed8 3f2f8427 -> 3dad226a 401d2476 3f6637b3", + "3f182dd7 3f7afa49 3c0375b1 3e6e3417 3f3b358f 3ec1d18e 3f3b358f -> 3f98e654 3c81dfc0 3e911e12", + "3ee5a3eb be28b328 be28b328 3f5b6417 bdd94688 3f8fdc62 3f8fdc62 -> 3f1b0a9d be205b92 3f508acc", + "3f9bcd53 3f5d70c3 3f521dfb 3f96212a 3f5112b5 3d1f43ea 3e2faf5a -> 3f8cf82e 41cc1f35 41011010", + "3fb6a82b be7a6c76 3f919833 bdd1ece6 3f837201 3f837201 3eb90d0b -> be710e96 3f8c2617 beb8ccb4", + "3ec9d784 bc830257 3f8ed3e4 3f86df91 bd156511 3f24306a bd156511 -> 3e2714d5 3fae500c c12c026f", + "3f85cc24 3f0a7374 3f956c91 bddae677 3f42534e 3f08ea4f 3e3a999f -> 3f3861ea 400ea334 bf1bb7de", + "be7e93e1 3f64d983 3f29fa90 be0a7c4b 3f8079ff 3f69d631 3f49bab2 -> 3f650f8a 3f25f934 be013921", + "bd3539fb 3f3365e3 3f3365e3 be7c4a6d 3ea13187 3ef9e14c 3e991dca -> 3f221fad 3f2b1260 be622096", + "3fb49297 bcba036e bcba036e 3f9ffdcb 3f91bc9f 3f91bc9f bc8a06b0 -> bc9a1398 bc9a1398 c2d255dd", + "3f02351b 3c475e0a 3f7f6548 3f7f6548 3f4c51d8 3f469f0c 3f4c51d8 -> 3c610418 3f9275fe 3f90204c", + "3eeb21c1 3f988f51 3f988f51 3d5b57f3 3d03a0b1 3eda2c5c 3d03a0b1 -> 418d6b03 3ff6ea90 3f4b5308", + "3fbc6675 3ed91f93 3e68e3b8 3e10fc76 3f1521b6 3effba0e 3d775501 -> 3f5f113e 3f101a07 40589aca", + "bda7f706 3a18082b 3a18082b 3efa396f 3f4e8c9f 3f1a4a8a 3f1a4a8a -> 3a150bf5 3a0fcffe 3eecb23f", + "bdc57936 3f8b3e8e 3eacd7fe 3eacd7fe 3ed5f83b 3ed5f83b be2be209 -> 3f711633 3e95a155 3f106632", + "3f9fc6e2 3f9170ef 3f9170ef 3c635abd 3df3ecc4 3df3ecc4 3f0961c2 -> 413a0596 413a0596 3cec31ea", + "3f71c6f9 3efad297 3f6adb2c 3efad297 3f36ee10 3c88aeca 3eeb7112 -> 3f2cb90b 424febee 3f844512", + "3d6fe42c 3f82f811 3f6494f5 3f82f811 3f83babe 3f885cc6 3eb634ca -> 3f82c079 3f63c2c9 3f90da45", + "3c4b593f 3f370a9b 3f635151 3f90b805 3f75bf58 be77a854 3f75bf58 -> 3f3722de 3f54d4b1 3f90cb33", + "3dd0f9d9 3f9190db 3f4a61f0 3f6e2894 3f6b24c5 3f6c933b 3e3c2a26 -> 3f92e21f 3f4c1404 3fad0da7", + "3f1b17e7 3f94b930 3ebc08e3 3f38cc45 3f07c0a3 3e04d547 3eff5c31 -> 3fe488b7 3fee132f 3f94a86c", + "3f75877a 3f65b93c 3f8e09db 3e97b08a 3f7731cf 3f87f3b9 bd9f7ffb -> 3f6d926c 3f8611fd c068bb0f", + "3fb85e18 3f82e74c 3ebdf939 3f82e74c 3e3fc21a 3e5d6c0a 3dae8179 -> 40ed4e16 4013b97a 4186b2c6", + "3f9cdf8b 3f980233 3ef4ef51 3dfeaf42 3f0dd0ad 3f0dd0ad 3e8330b5 -> 4017012c 3f73512a 3f11173a", + "3f99de30 3f97a4d4 3f88bce8 3f97a4d4 3f7347ab 3f370ed9 3f7347ab -> 3fa12ccd 3fca3bee 3fa12ccd", + "3fa7f97d 3ea61866 3f9f2775 3ea61866 3e543ffb be56f0ee 3f281ae3 -> 3ff9ed7d c102972d 3f0c07d0", + "be05bd17 3f21a18b 3f21a18b 3f90b328 3f9b7d25 3f9b7d25 3f4eb4a5 -> 3f255cee 3f255cee 3f8c3169", + "beb7bcd7 bdf0d21b bdf0d21b bda4855a be359afa be476c33 be359afa -> becba27c bec0c01b be8b1ddb", + "bed4b486 3e97792b be36431f 3dc14bcd 3f6ffee0 3f187fd0 3f6ffee0 -> 3e9346e2 be02df3c 3dbbf0e6", + "bec18d3f 3f162a35 3f10a839 3f525e7d 3f901b4d 3f39e21d 3f2d2e77 -> 3f1c8278 3ef80f20 3f2c569e", + "3f87c457 bd9b1a88 bd9b1a88 be6be193 bc59a907 3f79a3ce 3f79a3ce -> 40c1a40a bd9f4b86 be724162", + "3fb4eb28 3f6c1151 3f9e644f 3f865357 3f9e09dc be02049e be02049e -> 3f2ca5d8 c16495f8 c141daa9", + "3e8c92df 3f892522 bd2e3045 be4a5071 3f285d21 bd3e40bf bd3e40bf -> 3f9cbea7 3e61d13c 3f8323c0", + "3fbfae94 3f759ba6 3eb0ed4a 3f759ba6 3e54e246 3f6836fd 3f01e760 -> 40cddf6c 3ecc10b0 4016a843", + "3f3ff9ff 3f3c2b55 3f8472c5 3f7d37e4 3f3d0294 3f313d3d 3d2e5bde -> 3f6e2e9e 3fb095e6 418d618f", + "3f798720 3ec2aa28 be36b4fd bcf12e36 3f000000 3e800000 3f000000 -> 3f403435 bf333e1b bd6e21bb", + "3e20cfa7 3f5f2930 bdc259c8 bdc259c8 3e971299 3dbfeaf5 bd882905 -> 3f9971b7 be74c3b2 3e139f34", + "3f4dd550 3f831e82 bd3e21af 3f831e82 be1f8130 3e9a273b 3e7c87f5 -> c0a2c78c be08405d 406297bf", + "3f2b7956 3eddce33 3d82e665 3f16ad45 3f235ebc bd77039c 3f235ebc -> 3f190599 bf3055e7 3f4fe6cc", + "bec5be50 3df0c58f 3df15806 3df0c58f 3e081270 3e081270 3f0dc8e7 -> be3703c5 be377319 3da5dcf3", + "3fb879ca 3dfdfea9 3dfdfea9 3f927b22 bd088e68 3f577a77 3f5617d7 -> c0ad5044 3e216ac6 3fbbcdda", + "3faaaac9 3f8acb4a 3f470f58 3f90a06d 3f1f2c67 3f1f2c67 3ed12e89 -> 3ffb5e02 3fb441ba 4053e423", + "bec205c3 3f87c470 3f46edf2 3f57649f 3f8f4334 3e2bfbac 3f6c51e5 -> 3f8d3f9c bf2e87be 3f50987e", + "bed3e311 3f9228f5 3d970615 3f337478 3f34f7cb be1ac3bf 3f34f7cb -> 3f722988 3e9cc37c 3f14a9c4", + "3f908f6b be4604b6 3e7d28a6 3f84df9d 3f9e11ea 3f956557 3f9e11ea -> be1b79b4 3e543632 3f50a727", + "3e34b046 3ec5b209 3f850361 3eeb9415 3f7095a8 bdf68968 3ee3452f -> 3ec7ee3e bf2adc3e 3f0fd40f", + "3f6363ea 3f99040b 3f8d882b 3f8d882b 3f6ef8c9 3f59e6a5 3f59e6a5 -> 3fa2b359 3fa38339 3fa38339", + "3fbec7e3 3ec3a4de 3dcace66 3ec3a4de 3c6d9ceb be528d5b be528d5b -> 421c5582 bf443238 c03d4472", + "3e0566c9 3f31ec08 3f12589b 3f12bcfb 3f1de214 3f724b2d 3d12755b -> 3f405396 3f136cb4 40258fd3", + "be1ca722 3ef805aa 3f9d55e5 3f7d29e9 3f400000 3f400000 3f400000 -> 3eeb5fe2 3f954ff9 3f704101", + "3e823da7 bd340609 3dcb7bc7 be0d1a32 bc3c396a 3f039fe2 3f3cea1d -> 3f70be52 3dfc64ec be19d92d", + "3f19d6be 3f9ddb48 3f498388 3f6aba06 3e920155 be3c7045 3dda8104 -> 4045d2e1 c01068b0 40b0f82e", + "3f9accf2 3f9a1bcb 3cf3f925 3e8383d4 3f3b8c8f 3f8add6c 3f3b8c8f -> 3fde219b 3cdce342 3ebd90a1", + "befdf269 3f021f24 3f53ff1b 3f236d1d 3df353ee 3df353ee bd469bc3 -> bfae452d c00df64b 40ef85b8", + "3fbcb98e 3f4c68bd 3ef149eb 3f1635d4 be6f9d32 3eeae693 be6f9d32 -> c0ad1e57 3fa53d52 c07e6ec2", + "3fb10b5a 3f9af49d 3e942e7c 3f9af49d be725740 3f961e2d 3ea73a8c -> c0f14066 3e6bf7a0 40953528", + "3f79a751 be64d479 be64d479 3cea900e 3f70a839 3eebb91a 3f70a839 -> be730ea2 bef53088 3cf92575", + "3df02b05 3eb5c6f3 3f590134 3f8a5d27 3f6f1a40 3f748c53 3f748c53 -> 3eb7489b 3f5a3247 3f8b1fab", + "bea05403 3f1fe2e1 3eb8e653 3f1fe2e1 3e800000 3f400000 3f800000 -> 3d1af7a0 3ea5998e 3f1fe2e2", + "be44280f 3eab4963 3f6123c9 3eab4963 00000000 00000000 00000000 -> 3eab4963 3f6123c9 3eab4963", + "3eb4de91 3f92e093 3f7b11e9 3f200116 3e328492 3f8d1efc 3f0e4db1 -> 40444ec3 3f72d2d4 3f4d2a2a", + "3f904a5c 3f2f32c6 be1ca234 be0459f7 3f9a40a0 3f9a40a0 bdfd921d -> 3f0d9615 bdfd2a9a 3f98bb05", + "beb073c7 3f320c0d 3f958954 be28c838 00000000 3f800000 3f000000 -> 3f320c0d 3f958955 bddd3a75", + "3f526166 3f23cee4 3f23cee4 3e86a4fa 00000000 3f800000 3f800000 -> 3f23cee4 3f23cee4 3e86a4fa", + "3ee972cf 3f0aceeb 3e7e8587 3f0aceeb 3e17d571 3e17d571 3f8e9c59 -> 3ffb2e34 3f6648e5 3f0452f6", + "3d8297c3 3f49559d 3d82ae1f 3f1a5db4 3f39777b 3f39777b 3f886103 -> 3f4e3784 3d85d965 3f19c2e2", + "be97fb0f 3d6553d7 3d9fd66b 3d9fd66b 3f838f02 bd9c496f bd9c496f -> 3d672b3a 3ecf4121 3ecf4121", + "3fa43a7e bd4277e0 3f9fefc1 bd4277e0 3f8a786b 3f8a786b 3f9a9c12 -> bd2f9a09 3f906b8c bd178688", + "3fb1daf3 bdeaa34b 3f3e56fb 3f3e56fb 3f5248fc 3f09752a 3f09752a -> be18c1e2 3fd135f8 3fd135f8", + "bedad976 3d047ec2 3f08e304 3d047ec2 3f6b1cc9 3f4e939f 3da5bacf -> 3cfeed73 3ef5c6b2 bdff5c50", + "be055c6c 3f8a9351 3d92f3dc 3d92f3dc be695952 3f7e735a bdd3d184 -> 3febd1ee 3d92d607 3e2f9124", + "3d4aa62f 3f2da46d 3f398a0b 3f2da46d 3f800000 3f800000 00000000 -> 3f2da46d 3f398a0b 3f2da46d", + "3f410773 3edb669d 3de6bfee 3de6bfee 00000000 00000000 3f800000 -> 3edb669d 3de6bfee 3de6bfee", + "3fa3032e 3ef33100 3ef33100 3f86e33b 3f72cc6f 3def59e7 3f72cc6f -> 3f0203fb 40a17863 3f903a55", + "3f4cc4c3 3f46ab4d 3f3e559b 3c285804 3d91bf7c 3f460f08 3f31d999 -> 410e0b84 3f6adf71 3c638355", + "bef2b4c9 3f2ebb9d 3f746cd9 3f2ebb9d 3f2b036c be602384 3f9d9fe0 -> 3f0591e8 405e68d0 3f3e4cd6", + "3d94eb8a 3f8b8d55 3f453c79 3f30b593 3ef06c64 3f3c32ba 3f378758 -> 3f9703b5 3f4a6738 3f35c880", + "3f48b3bb 3e965e48 3ea6b206 3f0a63b6 bb3d1113 bb3d1113 3c269906 -> c29f7ec8 c2b0d039 42272fb7", + "bde8a1d4 3f9d2334 3f69830b 3f9d2334 3f874d1c 3e1d6ddf 3f874d1c -> 3f9e19c7 3eaf038c 3f9e19c7", + "3f0c3e39 3f0a4664 3f0a4664 3e6479fa 3f522086 3f064d4c 3f522086 -> 3f1acfe4 3f4eea98 3e7fcd23", + "3f9594cf bc125316 3f5bccf0 3f5bccf0 3db3fe38 bc6e4787 3f0dc8cb -> bdf01e79 c28a4545 3fd55bad", + "3f54a085 3f953aa4 3e9bf7f9 3f953aa4 3d11ce82 3f52565d 3e222b05 -> 41db32b3 3eb81771 40c9fb9c", + "be2c4f93 bd4ed815 3ec3c965 bd4ed815 3f5cc62c 3f5cc62c 3e716851 -> bd494a60 3ebe87b0 bcbc0510", + "3fa8276e 3efa39d8 3f8f5c4d 3f8f5c4d 3fa00000 3fa00000 3fa00000 -> 3eb87b3e 3f536347 3f536347", + "3fa87ca3 3f96ab11 3f38f530 3eeecc9b 3f99bb6b 3f8a6da8 bd6dba73 -> 3f6af1ac 3f269def c12b9b35", + "3d46aa1c 3f7e1f03 3f3739f2 3f7e1f03 3f734c0c 3f985cae 3f985cae -> 3f7ec3c1 3f35ce2d 3f7c267e", + "3f771263 bd48f946 3f071088 bd48f946 3f6e93da 3f2d7f5f bd4c4d61 -> bd572365 3f450d1e 3f729bc1", + "be01d11e 3e23fea3 3f9c5895 3e23fea3 be0be09f 3f6be0c2 3f6be0c2 -> 3ea87e04 3f9aa7bb 3e22389c", + "3fa3b952 be56bf31 3df68acc 3f473869 3f443209 3ebdbf7d 3efe3bf4 -> be953cdd 3ec386d3 3fe4ca6e", + "3f6e7af3 3f8990ef 3e6ae5fc be4088e9 00000000 3e800000 3f400000 -> 3f8990ef 3f5ed778 be7c5229", + "3f0b5bbd be0a713d 3dd2520e 3ead696a 3f8e5aea 3f9876a1 3f999b90 -> be02d7b8 3dbff328 3e9dacae", + "3fba73f4 3f5da617 3d9da115 3f31c0e3 3f85f1e3 3e23528c 3ed28a02 -> 3f4f51a8 3f2af49a 40091feb", + "3f11c8c8 3f9b55c4 3cb75dde 3f3d60fc 3e800000 3f800000 3f400000 -> 40525aff 3cb75dde 3f6153ce", + "be9783cb 3f132654 3f32ea63 3f132654 bd4b717c be0b2dd5 3f5e0468 -> 40856d4e 401b5a20 3f0c7c06", + "bea38f2d 3e477103 3f967ddf 3f967ddf 00000000 3f800000 3f400000 -> 3e477103 3f967ddf 3f86777c", + "bed84f29 3e79a36e 3efc67bc 3d5fd781 3e5b1400 bd8de3dd 3f9576d9 -> be09dc74 406d4627 3d6d6c2e", + "3f89293e 3f56e15e 3f5b7b47 3f56e15e 3f400000 3f400000 3f800000 -> 3f91d118 3f94f06b 3f56e15e", + "3f68a523 3ecf615a 3ecf615a 3ea25417 3ea8d74a 3f6a1710 3e486ed8 -> 3f939a9b 3ee104fd 3fc01e77", + "bd5f6bd1 3ce74d41 3f9c7fba 3f628176 3f9e01d2 3ded2036 3f1b351c -> 3ce9b2a3 3f369ddb 3f5a7b79", + "3f01ba96 3f16e778 3f9f6b76 3f16e778 3f400000 3f800000 3e800000 -> 3f306502 3f9f6b76 3fbe28ac", + "3eb57997 be2ef562 3f1984d4 3edeac4c 3ef2c4a4 3f1715dd 3ef2c4a4 -> be73bb38 3f3f4dd7 3f1b19ca", + "3f7ab073 3f554a5a 3e811d4a 3e811d4a be1888af 3f884fef 3f1aa973 -> c0aeb7d9 3e72cf10 3ed3f54b", + "3f2556cd 3ac12b5e 3e3a49fc bd92ce81 3f72afff 3f72afff 3d4c95d8 -> 3ac80356 3e40e38d bf73c991", + "3f79da6b 3f1fd201 3dd50937 3f2fb7e3 00000000 3e800000 00000000 -> 3f1fd201 3ed13318 3f2fb7e3", + "3ea708a7 3e077db0 3e077db0 3f4fa226 3f9724cd 3f831b91 3e8d16e4 -> 3e00b8f7 3e067177 3fc0dada", + "3fb93b16 3f970423 3f1babcd 3ed84649 bd084002 bd084002 3f622771 -> c24f6a50 c1d5cf05 3f00ca06", + "3f94b7bc 3d0b4d42 3d0b4d42 3dd75211 3f66a363 3e98c4ff 3f2c4af9 -> 3d1d1967 3e01f86e 3e286eaa", + "bee7bdde bde60d2b bde60d2b 3f674bea 3f5e5739 bd6d1c2f 3f73844a -> bdd649c9 bf854eb9 3f61ee0e", + "3e5bc729 3d99c146 3e866ea6 3ecdebf4 3f000000 00000000 3e800000 -> 3dbac144 3e866ea6 3f29415f", + "be0c098d 3e94b007 3f4f5dda be6359ca 3e683698 3f4eff2c 3e683698 -> 3e1eb593 3f48a738 bdf2aca4", + "3f9fda7d 3e7e3b70 3e7e3b70 3f60a374 3f800000 3e800000 3f400000 -> 3e7e3b6f 3f96d75a 3f9f1379", + "beb64383 3f447a86 3f4390b2 3f8f867e 3f9c4d47 3f1f903a 3f9c4d47 -> 3f5124b3 3f197d58 3f98c6de", + "3df482f0 3c997a3d 3f168f70 3c997a3d 3f400000 3f800000 00000000 -> 3c9f95dd 3f168f70 3c997a3d", + "3fab2869 3f8243b6 3f984b8e 3eac17d9 3f9749aa bd305fdd 3f9749aa -> 3f4ee772 c2156538 3e88abcc", + "bcfda760 3d9fec65 3d2986c0 3d24144e 3de8110e 3e11e7bb 3ec7592a -> 3d7259c0 3d09ef88 3d1c1c7a", + "3fb57b63 3f44d8c9 3f4de6d2 3f4de6d2 3d2520c1 3e8ddd3d 3e8ddd3d -> 41d5c5a1 4071e51e 4071e51e", + "3f8e159e be23515a 3f50320f bc2feda4 be30f4af 3df98b6b 3df98b6b -> 3f85615b 40ea3815 bdc5eb24", + "bec91961 3f205f17 3f205f17 3f78bbe1 3e800000 00000000 3f400000 -> bde4c600 3f205f17 3f582b2e", + "3e48d7e2 3f8dd3e1 3f31749c bd46f674 3f2f0257 3f2f0257 3f5f8a0f -> 3f9ab379 3f419012 bd4ca124", + "bec82763 3f98c8a2 be153058 bce54ef6 3ed4b093 bdc1b77a 3ed4b093 -> 3f0976d6 bf4e0624 bc4e50da", + "3cb3e914 3f268179 3ef58d19 3ef58d19 3ed46b43 3f3f69a9 3f997c83 -> 3f2ba9b9 3ef75eec 3ef4a7dc", + "3eac2650 3cffc271 be13de1a 3ef5bd87 3f436f57 3e0c3097 3e0c3097 -> 3d0d345a bee6a71f 3fbfa90d", + "3f715d5e 3e92902d 3e92902d bd320438 3f59935e 3f2b8564 be6afb40 -> 3eaaf783 3ed69f73 3e344edc", + "3e9dabea 3e70ce25 3e4a5d73 3eb0b356 3f654304 3f8f98c2 3f0eec93 -> 3e797436 3e4398a8 3edbc074", + "3e8f6107 3f6f66d4 be1fd222 3f91609b 3ef9fe44 be702bff 3f46dd5b -> 3f9ad516 3d978333 3f9d12ef", + "3f72062f 3f061fb0 3d9637c4 3d9637c4 be710580 bbb370f8 3ef81c3e -> c004d9e7 c14a8b65 3e16a227", + "3f82d4ba 3f3d5c12 bd86305f 3f3d5c12 bdd6e7c7 bdd6e7c7 3f0850fa -> c0e714ee 3f23c153 3fb3a554", + "3f765041 3d3a8696 3ee418f9 bd74df51 3f512bf2 3f512bf2 3f59ef05 -> 3d62b443 3f0a9d88 bd8f0348", + "3f5483ce 3ceafce2 3f85d1e8 be6dbbab 3f9b0ff9 3ebc8453 3ebf4ba6 -> 3cc8f157 4022387c bf0e25b7", + "3ef3143e 3f0df862 3f4fc97e 3f4fc97e 3f013c94 be58ce25 be11330d -> 3f50152a bfb2663d c012a4f6", + "3fb8e5d1 3ee528b5 be2d03aa 3f864f47 be2f4f17 bde4da84 be2f4f17 -> c07e6d1e 40109717 c1151e66", + "bece333f bc131e31 be63eda4 be63eda4 3f2f3701 3f2f3701 ba8be773 -> bbef99b1 be399aec c2a897b2", + "3ed7e06e 3f5ed855 3f8c2628 3f8c2628 3f573f8a 3f573f8a 3e751dde -> 3f70a242 3f975628 4023f599", + "3f2b9417 3f102b47 3f102b47 3e62cb29 3f9bfa0d 3ac5e61f 3f9bfa0d -> 3efdace7 437a2ccf 3e47878d", + "3e44476f 3eae44c6 3f64b89d 3f64b89d 3f5d9157 3eded16b 3f5d9157 -> 3eb375ac 3f8ecf52 3f6b88be", + "be8135a8 3ed33a35 3f632660 3f632660 3e3bf504 3f8f18d3 3f4db1e1 -> bd4f0a00 3f69329d 3f552170", + "be81fba8 bc96d379 3e397ca6 3f5ed863 bdec21ac 3ed99610 bdec21ac -> bd824de2 3df38a14 40408637", + "3f38d31f be24a308 3e4ad2ca 3f8ecb74 3f400000 00000000 3f000000 -> be4c4204 3e4ad2ca 3ff5e373", + "3f80dc1f 3f5d9406 3e8d50b2 3f8ae109 3eedafe6 bd043c50 3eedafe6 -> 3fef8247 c109bcc3 40161e14", + "3f87abe1 3f92f4d6 3f824710 3f73038e 3f488097 3f488097 3eeca4eb -> 3fbe1220 3fa87fad 4007ae9e", + "3f2b3803 3f3d4fd6 3d1e7d2d 3d1e7d2d 3eeb2772 3eeb2772 3e348fd1 -> 3fa93034 3d8da44f 3e2368fb", + "bed2a7d5 3e91e7e3 3e83df43 3e91e7e3 be3801bb be7bbc2a 3f1df193 -> 3f8700a6 3f4b6ac8 3e5945fb", + "3c310520 3f71236f be3e6be4 3d2ec167 3f0c688a 3f82af98 3f0c688a -> 3f734886 be3e6111 3d304f55", + "3fba4d60 3ece5f00 bd165f5f 3e83909e bc989833 3f53eb2a bc989833 -> c1fd6d39 bd43e61d c1a19047", + "3f810f35 3e2c0c84 3e5bc676 3e5bc676 3ed4314d 3ee4d74d 3ecd9dea -> 3ed09317 3ef6fbd1 3f097dcf", + "3f3e0059 3f6a7fc8 3f694535 3f9683ed 3f7e2b89 3f7e2b89 3eb99257 -> 3f6bc090 3f6a844e 402d829c", + "3f44a4df 3ee26c1c 3ed6c79d 3f6160f5 bd37a8c3 be55678f 3e675671 -> c0ef263c bfb97629 404ca48f", + "3f8d8555 3f13d548 3ecb4550 3ecb4550 bd9a1c78 3f2ca999 3f2ca999 -> c108bb4c 3f1bdf65 3f1bdf65", + "3f1acb82 3f5c4f09 3f91ab84 3f5c4f09 3f45f367 3e6fdce0 3f5272ed -> 3f81afd6 4058cf46 3f792477", + "be694aa4 3f18a68c 3f8444e4 3ece7b64 3f000000 3e800000 3f400000 -> 3eebbf0b 3ea777c4 3ebecd2e", + "3f9013c4 3f90c3b6 3f94e183 3f90c3b6 3e2d387f be3d96a2 3defc6e0 -> 40ec4582 c0e6f552 412bb30e", + "be1c6216 3e90adf6 3f8895dc be5cd959 3ea21219 3f8c559b 3ea21219 -> 3e41f276 3f8a6b33 be1406fa", + "3f895f85 3f09f32c 3f09f32c 3ecac4c8 3ebd9de6 3e3734e6 3e56cd1c -> 3fc2d516 404c59f7 3fffa4ca", + "3dc76baf 3f824797 be44605d 3f40ed54 be4385f3 bd97931c 3f0c56cb -> 3ecc9f58 3da2384a 3f5068da", + "3f3ed370 3d9c66e4 3f5e63f6 3d9c66e4 3edd980d 3f9d3f3e 3f3f7eb6 -> 3e1a9839 3f3f8ec3 3dc3ac5a", + "3e8ab7df 3f5e0909 bc9a8819 3ca1d305 3e0dc863 3eb670c6 3e0dc863 -> 40151672 bce6295a 3d595120", + "beb5bf80 3f8c5e4a 3f8c5e4a 3e705729 3f410914 3f911fbd 3f726824 -> 3f783b26 3f923f6b 3e6b8e6c", + "bdb3d96a 3e5a3588 3f9046b4 3e5a3588 3e25ed13 3e25ed13 3f2956ba -> 3dee3945 3f1d826d 3e506709", + "3f79e86a 3f93f30a 3e2f6def 3f93f30a 3e2348b4 3e2348b4 3ed89aa9 -> 40e3517a 3f86c528 402c7523", + "3e236d9a 3ed4ee8e 3d9457ad 3d9457ad 3f52cb62 be1fc7d6 be1fc7d6 -> 3edc3840 bc587e00 bc587e00", + "3f87e3f7 3e8c5a3c 3e8c5a3c 3f72730d 3f8922de 3e898f0f 3f8922de -> 3e826cf4 3f887cbd 3f614d29", + "3f5156aa 3d593e59 3f0f3893 3f0f3893 3f7a0457 3f7a0457 3dacae23 -> 3d5d7ea6 3f12060d 40b0e377", + "3f4f9ee6 3f8057e8 3edd9709 3f9cd38b 3f79d744 3f79d744 3f978564 -> 3f82e8ce 3ee20534 3f891519", + "3f8d477c 3f435357 3f038690 3f038690 00000000 3f800000 3e800000 -> 3f435357 3f038690 400dc267", + "3f73733a be051cf8 bd60c019 be051cf8 3f95c677 3f9ba4f7 3f0e6496 -> bde56b0c bd3ac9f0 be6a1c2c", + "bdd20d4d 3f231b98 3e271eff 3e271eff 3f141e87 3f141e87 3f997b16 -> 3f16ec64 3e1aa30b 3e29f77e", + "be060254 3f40d5e8 3f70ff63 3f40d5e8 3e800000 3f400000 3e800000 -> 3eea4139 3f667c10 3eea4139", + "3fbae1b3 3f914805 3e4eb01c 3e4eb01c 3f003576 3f35aa72 3f35aa72 -> 403259f9 3ea51527 3ea51527", + "3f8f5760 3f847355 3dbfafc1 3f225f49 00000000 00000000 3f400000 -> 3f847355 3dbfafc1 3f5efbb7", + "3e71792c bc708030 3f91fdac 3f3bd9d0 3f019400 3f693a6a 3f5d4272 -> bc93ea96 3f955a2d 3f42ce5e", + "3e60bb96 3f7c79a0 3f8d4a92 3f8d4a92 3f4528b6 3f4599a9 3f4528b6 -> 3f868181 3f9674aa 3f968bad", + "3f3464a8 be6761fc 3e38504b 3f5a5c9b 3edcd726 bdef5170 3dc2de01 -> bedf2c40 bf8420a6 40d23437", + "3efca4cf 3f8150fc 3dbcb626 3dbcb626 3f846a76 3f597296 3f77bd70 -> 3f7e6071 3dcd3894 3dbfd0f4", + "3fa159f2 3f22e3f3 3f474b38 3f96d287 3f400000 00000000 3e800000 -> 3f6755ad 3f474b38 40b44bb8", + "3fbabc32 bd0508c2 3f0710d1 3f0710d1 3f92599f 3f92599f 3f8d815a -> bcd96632 3edcb80e 3ee8850e", + "3fb1517a 3f54844e bda0a46b 3f54844e bd900918 3f7caaa9 3f7caaa9 -> c1855ee6 bda39400 3f586696", + "3f8c3d42 3c884226 3ee14ea0 3c884226 3f8045f2 3e22b534 3d8bc174 -> 3c87f0bf 403f8050 3e87ea64", + "3f60902c 3c5973a4 3c5973a4 be65ccfe 3a7bb88d 3f087c1d bd98b7d2 -> 4142046f 3cc03df1 402730d3", + "3ec2d9fd 3f2628ca 3dd81137 3f5b95b2 3f8da221 3e6376e6 3f9015f5 -> 3f20128d 3e7c01fc 3f52415b", + "3f9a1703 bd538f98 3ed5f984 bd538f98 3f3ee4bd be35fa44 3f6e32b0 -> bd953635 c03aa29d bd66984e", + "3f04e6d1 3f06f901 3f06f901 3f6ea45f 3f02533b 3f54484a 3f02533b -> 3f4a8b08 3f156730 3fb30e4e", + "3cf31141 3e3d7db4 3e3d7db4 3db2f6f7 3e83bdaa 3e83bdaa be787634 -> 3e4db842 3e4db842 3d97c50a", + "3fa583c1 3f6bf96f be6610fd be5181d4 3e223ea3 bddcfe2b 3f72439a -> 40e815d7 4030864f be60de04", + "3fbcb146 3f93d694 3e69ffb5 3e4fd634 be15f693 3e64e2d5 3e64e2d5 -> c142c7f4 3fb309d0 3f9f0562", + "3fbaca3d 3e361a1b 3f9bfaaf 3f4a2b71 3dde7ee4 3f9f426e bddf5cfc -> 4013a6b4 3f5e9a96 c12edec4", + "3f872f88 3d3cd411 be296707 be296707 3f2e6314 3de4c648 3de4c648 -> 3d8d1498 bfc703e5 bfc703e5", + "3f258e19 3e1ed2e1 3e1ed2e1 bd490788 3efd7a70 3efe74a8 3efe74a8 -> 3e83ca10 3e83640f bda64e79", + "3f9e636c 3f8a2227 3f06d237 3f3e0176 3f4bc9b3 3e820223 3e83e668 -> 3fb5ed2b 401c3ff5 4058e2b9", + "3f14526a 3f69bf77 3f2246ee 3f2246ee 3f21a085 3f21a085 3ead6cb0 -> 3f9c6982 3f592cce 3facea91", + "3f952e9a 3f3f3f43 bba3b07e 3f92b1a2 be0ed27a 3e93e04a be0ed27a -> c0cbb82a bc9e5ceb c11c42b7", + "3ea6b775 3f7bc162 3f7bc162 3f83f721 3f708984 3f98ed7f bd4382a4 -> 3f80833a 3f6e649e c0cacfcb", + "be6cf4f1 3f4df4be bcd41d94 bcd41d94 3f7538b8 3f7538b8 3ee16caf -> 3f4bdc79 bcd1f546 bc95b75e", + "be3eea5b 3f9ee6d1 3f9ee6d1 3f352856 3f2aaaab 3f2aaaab 3f2aaaab -> 3f9016b8 3f9016b8 3f24451c", + "3f32cc3e 3ca6f060 3f0ae231 3f1e1981 3eefcb9d 3f168152 3f10e2de -> 3d15a568 3f4edff3 3f72c83f", + "3f943a2a 3f2c0f12 3f909062 3f091699 3f673cbd 3e0d6006 3e0d6006 -> 3f416560 4114b70f 408d0652", + "3f82c4ca 3f95b628 3df9eb98 3f2024b9 3d479a66 3f511ee8 3d9b1325 -> 41c3f676 3e19942c 4106d391", + "3eaab5dc 3f811f4c 3f8ee505 3f2460b7 3f2afbb3 3e027eef 3e027eef -> 3f968752 406a8e34 4006e8dd", + "3f0f37ff 3ea55322 3ea55322 bdeeabb0 3f74a34f 3dd82572 3f74a34f -> 3ea99ed4 3fed4c15 bdf4df42", + "3f8db67f 3e45d6d9 3e45d6d9 3f9e5d3a 3e0ec1de 3e385204 3e0ec1de -> 3fc1be14 3f957517 411b15b8", + "3f9cc350 be4455d6 3f7b0523 3e4a713e 3f109591 3f05b828 3f05b828 -> bebed056 40050986 3ed69558", + "3fa42b95 3f8d8d50 3f310318 3f3a2cfa 3ead3423 3f39ebf3 3d087860 -> 407856c0 3f834b00 41de5215", + "3f1be86b 3f1405ef 3d88171e 3f33e7a6 3f894133 3f792e47 3e41a69e -> 3f0df1da 3d8a5bc5 40226d12", + "3fbbe17d be14e078 3ee71dec 3ee71dec 3ec234f4 3e120dd5 3ec234f4 -> befd3b24 408de4f6 3fc48ef0", + "3e57a383 3f409295 3f75a37f 3f189206 3e800000 3f800000 3f000000 -> 3f9d1d94 3f75a37f 3f38b30c", + "3fa6ff68 3f6aa9de 3f646e75 3deb75a7 bd2e293e be5c9f40 ba8ddb78 -> c1e33eec c0b59bc3 c30aa117", + "3f611e9c 3e3cf6b1 3e3cf6b1 3f317c81 3ed03904 bc8eb925 be706b60 -> 3ed7b1d7 c114abe7 c020d6ca", + "3e27e912 3dd647a9 bd1a005b 3f58846a 3f513532 3f934959 be25bc03 -> 3dde2382 bd16b1d8 be19627c", + "bdae558e 3da095cd 3e9c2e2d 3f4d66fc be3c4dff 3efd47e1 3f636a18 -> 3df89728 3e8e99a7 3f4b345a", + "3f2a2c0a 3d8717f7 be7cb54d bc7ed481 3f400000 3e800000 3f800000 -> 3da50704 bf3d2a3a bc7ed481", + "3eba59cc 3f3b7a20 bc0d2cff bc0d2cff 3f800000 3f000000 3e800000 -> 3f3b7a20 bc408f1a bc93a9a8", + "be87fc06 3f2ab839 3f5222eb 3ee79ae9 3f58ffb4 3f453b85 3d01097c -> 3f2291fe 3f4181c4 c04f6f62", + "3ec20cf5 3d34e8ec bbd42886 3c901843 3f29e415 3f32cb00 3f29e415 -> 3d57a990 bbf6e17e 3cabc670", + "3f68a0c5 3db5e9ee 3ed78f09 3f114121 3efd1411 3efd1411 3ed193dc -> 3e2f849f 3f4ffae8 3fa7dc62", + "3fa79cdf 3f466b77 3f466b77 3e5de38e 3f8f53ae 3f0a1646 3f987517 -> 3f2aa28b 3fd22498 3e2f46fc", + "be3e4d7f 3ea3a37b 3f6ee19f 3f9b5b49 bd3f5b2a bd3f5b2a be785cd0 -> 3fd3400c 409a314f 4017a235", + "3f6fb9d7 be0def96 bd55e166 3ee7e67d 3f797800 3f8429c5 3f6cad04 -> be116a67 bd4f924d 3ef9a185", + "3f2fe6b3 3f598695 3ed88a4b be604a56 3f000000 3f000000 3f000000 -> 3fb77ece 3f36a9fc bebd33a3", + "3d2bbbb3 3f22bdac 3f629377 3eb93fd2 3f3ca2a9 bddb7071 bddb7071 -> 3f252d77 3f006ac9 3e51fd11", + "3e38bbfe 3f0a356c 3d87a581 3f0a356c 3f954d74 be2552bf be2552bf -> 3f06a6b2 bca1977e be24a4e0" + ] + }, + { + "function": "cycles_mix_diff", + "node": "ShaderNodeMix RGBA DIFFERENCE", + "cases": [ + "00000000 00000000 00000000 00000000 3ed479a5 3f27627c 3d458f77 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f12888f be7304f4 3f3fdadd -> 3e92888f 3df304f4 3ebfdadd", + "3f800000 00000000 00000000 3f000000 3f420f96 3f420f96 3eb07ce5 -> 3f420f96 3f420f96 3e1f0636", + "3fc00000 00000000 00000000 3f400000 be10abfa bdb3966a 3d17479a -> 3e5901f7 3e06b0d0 3f31d149", + "bf000000 00000000 00000000 3f800000 3f806f6f 3f5404cd 3e60efac -> bf006f6f bed404cd 3f8e0efb", + "3e800000 00000000 3e800000 00000000 3f30894b bda7097a 3f566c82 -> 3e30894b 3e8a7098 3e566c82", + "3f400000 00000000 3e800000 3e800000 3f547072 3df00dc2 3d38dbef -> 3f1f5456 3e25fad7 3e5d56c3", + "40000000 00000000 3e800000 3f000000 3f28026a 3f28026a 3f67ec80 -> 3fa8026a 3f1004d4 3e9fb200", + "00000000 00000000 3e800000 3f400000 3e800000 3e800000 3e800000 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3e15b055 3ed28e0d 3ed28e0d -> 3d95b055 3e528e0d 3f4b5c7d", + "3f800000 00000000 3f000000 00000000 3f9d0426 3ef8827d 3ef8827d -> 3f9d0426 3c6fb060 3ef8827d", + "3fc00000 00000000 3f000000 3e800000 3e800000 3e800000 00000000 -> 3ec00000 3e000000 3e800000", + "bf000000 00000000 3f000000 3f000000 3f8ba69c 3f751db0 3eac88c1 -> bf0ba69c 3f057128 3f2b2230", + "3e800000 00000000 3f000000 3f400000 3e77d5db 3f4fd913 3e197a7d -> 3d77d5db 3ee7ec8a 3f366858", + "3f400000 00000000 3f000000 3f800000 3f8b862c bcf44896 3f2637ec -> 3f514942 3f05b9b4 3f03560f", + "40000000 00000000 3f400000 00000000 3f5e0943 3ca73f6f 3e831429 -> 3fde0943 3f358c0a 3f031429", + "00000000 00000000 3f400000 3e800000 3f40d600 3f119d93 3e8a23f9 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3eaed74d 3eaed74d bcda0be1 -> 3e2ed74d 3f144a2d 3f036830", + "3f800000 00000000 3f400000 3f400000 3dd307f6 3e9606c3 3e9606c3 -> 3dd307f6 3ee9f93d 3ee9f93d", + "3fc00000 00000000 3f400000 3f800000 3f9bbcf8 be6b62ea 3f9bbcf8 -> 3fe99b74 3f8c228c be332460", + "bf000000 00000000 3f800000 00000000 3ee00f98 3ee00f98 3f82a263 -> be600f98 3f9c01f3 bf02a263", + "3e800000 00000000 3f800000 3e800000 3ec47e56 3f95faee 3ed09d5f -> 3dc47e56 3f4afd77 3e684eb0", + "3f400000 00000000 3f800000 3f000000 3f7f844b be0fcf68 3d0edab9 -> 3f3fa338 3f8d7b72 3ef29b7f", + "40000000 00000000 3f800000 3f400000 3f259af8 3edbcfd4 3f259af8 -> 3fa59af8 3e10c0b0 bf0b35f0", + "00000000 00000000 3f800000 3f800000 3ebf31e9 3f79bec6 3cf1c47b -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3f206313 3f82ab5f 3f14b56a -> 3ea06313 3f02ab5f 3e94b56a", + "3f800000 3e800000 00000000 3e800000 3f800000 3f800000 3f800000 -> 3f400000 3f800000 3f400000", + "3fc00000 3e800000 00000000 3f000000 3f000000 00000000 3f800000 -> 3e800000 00000000 3f000000", + "bf000000 3e800000 00000000 3f400000 3f90137f 3cf8cbae 3f90137f -> bd809bf8 bc78cbae 3f6fec81", + "3e800000 3e800000 00000000 3f800000 3f87a98e 3f87a98e bd8d57d3 -> 3ec7a98e 3e87a98e 3f82355f", + "3f400000 3e800000 3e800000 00000000 3f9f3d4d 3f9f3d4d 3f674417 -> 3f4edbf4 3f4edbf4 3f2d7311", + "40000000 3e800000 3e800000 3e800000 3f400000 3e800000 3f000000 -> 3f400000 be800000 3e800000", + "00000000 3e800000 3e800000 3f000000 3f8d86fe 3f7cbd89 3f7cbd89 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3e5261b3 3e5261b3 3f625055 -> 3e16cf26 3e16cf26 3ee25055", + "3f800000 3e800000 3e800000 3f800000 3f1de1a8 3ca86dce 3e14ce46 -> 3ebbc350 3e6af246 3f5acc6e", + "3fc00000 3e800000 3f000000 00000000 3e2d57e8 3f4f3acb 3e2d57e8 -> bb807b80 3e5b60c2 3e8201ee", + "bf000000 3e800000 3f000000 3e800000 be24bd13 bdf6b4ad be08fa04 -> 3e2da176 3ee1296a 3e3b82fe", + "3e800000 3e800000 3f000000 3f000000 00000000 3f400000 3f400000 -> 3e800000 3ee00000 3ee00000", + "3f400000 3e800000 3f000000 3f400000 3f800000 3f000000 3f000000 -> 3f200000 3e000000 3ec00000", + "40000000 3e800000 3f000000 3f800000 3f000000 3f000000 00000000 -> 3e800000 bf000000 3f800000", + "00000000 3e800000 3f400000 00000000 3f0813b6 3d100563 3f426e12 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f9ac56b 3da82189 3f9ac56b -> 3f1ac56b 3f357de8 3f1ac56b", + "3f800000 3e800000 3f400000 3f000000 3f3cf902 bd041569 3f9ae473 -> 3ef9f204 3f484157 3f35c8e6", + "3fc00000 3e800000 3f400000 3f400000 3f000000 3f000000 3e800000 -> 3e800000 00000000 3ec00000", + "bf000000 3e800000 3f400000 3f800000 3ed1f464 3f88287b 3ed1f464 -> 3e9705ce 3f77d785 3f9a3e8c", + "3e800000 3e800000 3f800000 00000000 3f26a24a 3f85bf79 be243672 -> 3e935125 3f42dfbc 3d243672", + "3f400000 3e800000 3f800000 3e800000 3f159124 3f9e2061 3f13cd18 -> 3ea059b6 3eda6124 3e9db3a4", + "40000000 3e800000 3f800000 3f000000 3f400000 3f800000 00000000 -> 3f400000 bf800000 3f000000", + "00000000 3e800000 3f800000 3f400000 3f95c582 3f70b0b8 3f0be637 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3e778b99 3f610191 3f385a64 -> 3e043a34 3f0f7f38 3f23d2ce", + "3f800000 3f000000 00000000 00000000 3e99a8c1 3f9b435e 3e99a8c1 -> 3e4cae7e 3f9b435e 3e99a8c1", + "3fc00000 3f000000 00000000 3e800000 3f0e1272 3f9d3c7e 3f8a9103 -> be2b9154 3febdabd 3f8fd984", + "bf000000 3f000000 00000000 3f000000 3f68dde9 3f98ea0a 3f68dde9 -> 3f0b910c bf18ea0a 3f0b910c", + "3e800000 3f000000 00000000 3f400000 00000000 00000000 3f400000 -> 3f000000 00000000 3f100000", + "3f400000 3f000000 00000000 3f800000 3f7dca07 3f9b6a0e 3f0784fb -> 3efcaf0a 3f691f15 3f1a5c44", + "40000000 3f000000 3e800000 00000000 3f6eae9a 3f7afa93 3f7afa93 -> 3ebaba68 3f9afa93 3ffafa93", + "00000000 3f000000 3e800000 3e800000 be50462f 3ecea1a3 3ecea1a3 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3ec50dda 3f919c5a 3ec50dda -> 3e9d7913 3f119c5a 3e9d7913", + "3f800000 3f000000 3e800000 3f400000 3f2a9975 3f2a9975 3d930064 -> 3e2a65d4 3ed532ea 3f2d9ff4", + "3fc00000 3f000000 3e800000 3f800000 3f400000 00000000 3f400000 -> 3e000000 3e800000 be000000", + "bf000000 3f000000 3f000000 00000000 be49e3f2 3f907866 3e8872a6 -> 3ecd8704 3edf0f34 be0872a6", + "3e800000 3f000000 3f000000 3e800000 3f9faae1 3f9faae1 3f5b5089 -> 3f0fd570 3f0fd570 3eada844", + "3f400000 3f000000 3f000000 3f000000 3ed7e7b7 bd44b999 3f4a4857 -> 3e3c246e 3f0938b4 3eaf6c82", + "40000000 3f000000 3f000000 3f400000 3f93e10a 3f318f04 3f93e10a -> 3f4f8428 bde70fc0 3d784280", + "00000000 3f000000 3f000000 3f800000 3f50dd2a 3f977b86 3f280570 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f8617cb be2a76e6 3f579709 -> 3f0617cb 3f554edd 3ed79709", + "3f800000 3f000000 3f400000 3e800000 be2f590e 3d8154d7 3f16c1cd -> 3f2bd644 3f2fd565 3ead839a", + "3fc00000 3f000000 3f400000 3f000000 3f0ec3ea 3e2658d4 3f852e61 -> be276884 3f019eb0 3f0f8b23", + "bf000000 3f000000 3f400000 3f400000 3f993ce8 3f03c482 3f993ce8 -> 3ecd8630 3f80f120 3f66c318", + "3e800000 3f000000 3f400000 3f800000 3f8a87df 3d6ab77b 3f8a87df -> 3f0543f0 3f3c5522 3f4543f0", + "3f400000 3f000000 3f800000 00000000 be0d2409 be0d2409 be2a2808 -> 3f1a76c2 3f8d3b61 3dff3c0c", + "40000000 3f000000 3f800000 3e800000 3f800000 3f400000 3f400000 -> 3f000000 bf000000 3f400000", + "00000000 3f000000 3f800000 3f000000 3eaac297 3c8e1074 3eaac297 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 be6e17df 3f8d0cc4 3e5298a9 -> 3f1dc2fc 3f0d0cc4 3f25aceb", + "3f800000 3f000000 3f800000 3f800000 3e105eaf bd308b2d 3f5ea780 -> 3eb7d0a8 3f858459 3e056200", + "3fc00000 3f400000 00000000 00000000 bd6c2277 3d99005d 3f8164a5 -> 3f56233a 3de5808c 3fc216f8", + "bf000000 3f400000 00000000 3e800000 3e3fd90e 3e3fd90e 3f594b7e -> 3f57fb22 bdbfd90e 3d9ad208", + "3e800000 3f400000 00000000 3f000000 3f87e8d8 3f4d3743 3f87e8d8 -> 3f23f46c 3e4d3743 3f03f46c", + "3f400000 3f400000 00000000 3f400000 3eb955c6 3f9cf90e 3e129907 -> 3ef4ffac 3f6b7595 3f24834e", + "40000000 3f400000 00000000 3f800000 bdefb05b 3f06d978 3f06d978 -> 3f7bec16 3f86d978 bd5b2f00", + "00000000 3f400000 3e800000 00000000 3f848a78 3e1fc49f 3f2257ff -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f000000 3f000000 3f800000 -> 3f000000 3e800000 3f000000", + "3f800000 3f400000 3e800000 3f000000 3f1514f9 3cffc19d 3cffc19d -> 3e2bac1c 3e6007cc 3ef003e6", + "3fc00000 3f400000 3e800000 3f400000 00000000 3f800000 3e800000 -> 3f400000 3f800000 3ec00000", + "bf000000 3f400000 3e800000 3f800000 bc365a14 3ecc699b 3ecc699b -> 3f3e934c 3e99cb32 3f998d34", + "3e800000 3f400000 3f000000 00000000 3ee821b0 3f826419 3f2448a2 -> 3f22fbca 3f01320c 3e2448a2", + "3f400000 3f400000 3f000000 3e800000 3ea33d26 3ea33d26 3f080b10 -> 3f02c912 3e859224 3e8c1098", + "40000000 3f400000 3f000000 3f000000 3f50567c be0664e5 be0664e5 -> bf1f5308 3f433272 3f433272", + "00000000 3f400000 3f000000 3f400000 3e1545fa 3e8c2843 be5539ac -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f1e5581 be077426 3ee6e465 -> 3ee1aa7f 3f10ee85 3f4646e7", + "3f800000 3f400000 3f400000 00000000 3f1e4618 3f968a36 3e91e76b -> 3e06e7a0 3eda28d8 3e91e76b", + "3fc00000 3f400000 3f400000 3e800000 3f1145b5 3f1145b5 3f9bd051 -> bdcf4480 bdcf4480 3fa9b87a", + "bf000000 3f400000 3f400000 3f000000 3edaefac 3e823bf9 3edaefac -> 3f76bbeb 3f608efe 3f36bbeb", + "3e800000 3f400000 3f400000 3f400000 3f4f71e0 3e137a94 3f4f71e0 -> 3f13dc78 3f36c857 3f13dc78", + "3f400000 3f400000 3f400000 3f800000 bda1f3e6 bda1f3e6 be554e57 -> 3f4f2ede 3f4f2ede 3f93ff58", + "40000000 3f400000 3f800000 00000000 3e9e143c 3f7bd5de 3f7bd5de -> 3e07af10 bf77abbc 3ffbd5de", + "00000000 3f400000 3f800000 3e800000 3ee1efd0 3ef634a0 bcf14c0e -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3ef78d73 bd85d8c4 3f132ef0 -> 3f021ca3 3f842ec6 3e932ef0", + "3f800000 3f400000 3f800000 3f400000 3f9eab80 3f4e6fde 3f1fbee4 -> 3efaae00 3e464088 3e010470", + "3fc00000 3f400000 3f800000 3f800000 3eabbe12 3f98439f bdabaf17 -> 3e7cc5c8 be5cd490 3f90186a", + "bf000000 3f800000 00000000 00000000 3f4bf506 3f4bf506 3f7ebd48 -> 3fb2fd42 becbf506 befebd48", + "3e800000 3f800000 00000000 3e800000 be227de1 3f2faf76 3ea928b5 -> 3f8513ef 3e2faf76 3e54945a", + "3f400000 3f800000 00000000 3f000000 3f2aac5c 3f9c6556 3f2aac5c -> 3efffd76 3f6a9801 3e80028a", + "40000000 3f800000 00000000 3f400000 be6f8037 be6f8037 3f6e80d6 -> 3fbbe00e 3eef8037 bec5fca8", + "00000000 3f800000 00000000 3f800000 3ed40a4e 3ebd818a 3ebd818a -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3ea419eb be16e007 3f7e5967 -> 3f56f985 3ea5b802 3efe5967", + "3f800000 3f800000 3e800000 3e800000 3f400000 00000000 3f800000 -> 3e800000 3e800000 3f400000", + "3fc00000 3f800000 3e800000 3f000000 3f800000 00000000 3f000000 -> bf000000 3e800000 be800000", + "bf000000 3f800000 3e800000 3f400000 00000000 3f000000 3f400000 -> 3f800000 3e800000 3f900000", + "3e800000 3f800000 3e800000 3f800000 3f753e8a be6d8d15 3f0005fb -> 3f42b05e 3e9db1a2 3f5ffe81", + "3f400000 3f800000 3f000000 00000000 3f55915b be1194f5 3f1221d8 -> 3ebfa5f8 3f1b4bee 3edb32c4", + "40000000 3f800000 3f000000 3e800000 3f8e7f49 3f663823 3f8e7f49 -> bf4602dc 3e98e08c 3fbcfe92", + "00000000 3f800000 3f000000 3f000000 3f64278c 3f96e6a6 be65fec6 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 bd89b78b bd83cbdf bd83cbdf -> 3f844dbc 3f083cbe 3f483cbe", + "3f800000 3f800000 3f000000 3f800000 3f8e0769 3f6e0e99 3f6e0e99 -> 3de07690 3edc1d32 3d8f8b38", + "3fc00000 3f800000 3f400000 00000000 bd9feb53 3f9381c6 3f9381c6 -> 3f8efe10 3e6a1548 3fdd42a9", + "bf000000 3f800000 3f400000 3e800000 3e800000 3f400000 3f000000 -> 3f900000 3f900000 3e800000", + "3e800000 3f800000 3f400000 3f000000 bcf6ef68 3f3e2d81 bcf6ef68 -> 3f80f6f0 3f1074a0 3f01eddf", + "3f400000 3f800000 3f400000 3f400000 3f729e1e 3eae997c 3f896d67 -> 3e9412d4 3efd0ce3 3edc4835", + "40000000 3f800000 3f400000 3f800000 3f40d2f0 be714514 3f0644c1 -> bf01a5e0 3f9c5145 bd489820", + "00000000 3f800000 3f800000 00000000 3f000000 3f400000 3f000000 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3ea43e03 3f092ca9 3f9279e9 -> 3f56f07f 3f3b69ac 3f1279e9", + "3f800000 3f800000 3f800000 3f000000 3efc9e81 3efc9e81 bdcff5e5 -> 3f01b0c0 3f01b0c0 3f19febd", + "3fc00000 3f800000 3f800000 3f400000 3f0fc882 3f80b5ad 3ef18be1 -> 3e214cf4 befbbdf0 3d2d7170", + "bf000000 3f800000 3f800000 3f800000 3f86e848 3e3e8ffc 3e3e8ffc -> 3fbc8bdc 3f8be900 3f8be900", + "3e800000 00000000 00000000 00000000 bca666fd 3ed16718 3ea9f8f9 -> 3ba666fd 3dd16718 3da9f8f9", + "3f400000 3e800000 3e800000 3e800000 be21930d 3f63c469 3f63c469 -> 3ebc9724 3f0ad34f 3f0ad34f", + "40000000 3f000000 3f000000 3f000000 3f000000 3f400000 3f800000 -> bf000000 00000000 3f000000", + "00000000 3f400000 3f400000 3f400000 3f2f8029 3f2f8029 3f0064a8 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3dcab244 3dcab244 3d75d5d5 -> 3f7354dc 3f7354dc 3f785152", + "3f800000 3fa00000 3fa00000 3fa00000 3f36127c 3f510355 3f36127c -> 3f09ed84 3eddf956 3f09ed84", + "3fc00000 be800000 be800000 be800000 3e03eb66 3e03eb66 3dcd345f -> 3f317847 3f317847 3f2679d2", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3f679fc3 3f0620ea 3f0620ea -> be81395c bd7dd41e bd7dd41e", + "3e800000 3f666666 3f666666 3f666666 3f06e6a4 3efc306d 3efc306d -> 3f44acbd 3f46e058 3f46e058", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f823934 be63d1ce be77d235 -> 3f18ab24 3f000cab 3f03ccbf", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3e29734a 3e29734a bdb62c2d -> 3eabe20a 3eabe20a 3f5835b7", + "00000000 3c74c58c 3eb9981c 3eef4a40 3f883639 3f96392c 3f865cdd -> 3c74c58c 3eb9981c 3eef4a40", + "3f000000 3f37de9b 3f4eaea1 3f2d4e06 3e67889c 3f8348ad be1e46b7 -> 3f1aed88 3f0348ad 3f4116dd", + "3f800000 3d595b4e 3d595b4e 3dacfc9e be176c01 3f647b42 3eb0038f -> 3e4dc2d4 3f56e58d 3e84c468", + "3fc00000 3f3f88e9 3db09e34 3f41c9ef be19997e 3f780db2 3f780db2 -> 3f792278 3fa3f67f bd77f530", + "bf000000 3f6f1194 3f0751fd 3f828313 3eb6447f 3f937d5a 3d8cdfc2 -> 3f8e515a 3ef64d40 3f86ea11", + "3e800000 bdd76735 3e831ec3 3f51bb41 3f5ddbd6 3f093c74 3f157343 -> 3e28020a 3e862d9c 3f2c5e70", + "3f400000 3f53c38d 3f214778 3f580827 3e5cdd15 3f789943 3f789943 -> 3f2a5a19 3ed39e6c 3e9cddbe", + "40000000 be67bb98 be67bb98 3f4a9f5c 3e5ba777 3f6e4cf4 3e5ba777 -> 3f8dd037 402299a6 3eb99740", + "00000000 bd6bcda4 3f0a14c0 be284ff4 3ead81da 3d04344b 3e433bdd -> bd6bcda4 3f0a14c0 be284ff4", + "3f000000 be16d3e2 3eeca451 3eeca451 3f86bf5a 3f881564 3e9471b2 -> 3f06bf5a 3f081564 3ea26b78", + "3f800000 3e962ebb 3f7c79e9 3f0ae6a6 3f8b7c31 3f8b0b1b 3f8b0b1b -> 3f4be104 3dcce268 3f0b2f90", + "3fc00000 3f19ef5d bd77f548 3f19ef5d 3f8cb75c 3f8cb75c 3f81df47 -> 3ee48eb4 3fe2925e 3ea37e36", + "bf000000 3f487b53 3f079dae 3f8356e0 3e4643f6 be09eb9a 3e4643f6 -> 3f6143d2 3eecc076 3f8fbb20", + "3e800000 3f05a4f9 3d4a7e66 3f3ec2b8 3f84a226 3f23281e 3f173145 -> 3f052390 3e3c77ec 3f18f667", + "3f400000 3f91a83b 3f91a83b 3f257f33 3f8f7159 be7cca08 3ea7e852 -> 3e984ce0 3fa95b2c 3ecd1028", + "40000000 3f58f559 3f939557 3f5a84c4 bd495351 3d84ed10 3f48fa17 -> 3f721fc3 3f82f7b5 bf376f6a", + "00000000 3f518c1b 3f842432 3f842432 3e800000 3f800000 3e800000 -> 3f518c1b 3f842432 3f842432", + "3f000000 3f2930a6 3f2930a6 3f05a27d 3f473bb5 3ec7cdfe bde50526 -> 3ec73bb5 3eee7a4d 3f13f2d0", + "3f800000 3eaf86e0 3f47f583 3f83200f 3f49b77c 3f49b77c 3e99be9a -> 3ee3e818 3be0fc80 3f3960d1", + "3fc00000 bd2fe284 3da286ee bd2fe284 3f9b8849 3f9b8849 3f824901 -> 3ff44a96 3fd4fb8f 3fce6baa", + "bf000000 3dbab912 3dbab912 3de3f343 3f6ac600 3f5e473b 3e671ac7 -> be8d6978 be80eab2 3de0cbbf", + "3e800000 3e2788f6 3e58b42e 3f835b2d bdaa8ce5 bdaa8ce5 3da05df5 -> 3e3cda92 3e6e05ca 3f80d9b5", + "3f400000 3e35be10 bd9f6715 bd9f6715 3f400000 3f800000 3e800000 -> 3ef2907c 3f49f670 3e67d9c6", + "40000000 3f3b1dbc 3f5e2dc0 3f3b1dbc 3d062409 3f5976d2 3f17536d -> 3f2a593a bf54bfe4 bee7123c", + "00000000 3e47751c 3e47751c 3f98199a 3f43964f 3f8a4d54 3f43964f -> 3e47751c 3e47751c 3f98199a", + "3f000000 3e43d854 be4f3501 3f8d5bbc 3f3ae737 3ee09899 3ef20aff -> 3ebae737 3e609899 3f5e34b8", + "3f800000 be03a6d1 3f64c80c 3f569960 3e58c008 3f4bd22c 3f18b3bb -> 3eae336c 3dc7af00 3e779694", + "3fc00000 be04aee7 be04aee7 3f85f3e8 3f93a70b 3f93a70b 3f8ecaa3 -> 3ffea64b 3ffea64b bed6df70", + "bf000000 3f193043 3f12b96d 3f828f90 be0273bd be04f009 3f0873fd -> 3f08e1cc 3f021b6c 3fa4ac8f", + "3e800000 3f853826 3ec689b2 be710e82 3f8de213 3f9e7689 3f45a18e -> 3f4c2930 3f00ddb1 3d9a3498", + "3f400000 3f248fa2 3f88875c 3f88875c 00000000 3f000000 3f000000 -> 3f248fa2 3f310eb8 3f310eb8", + "40000000 bde8b59d 3e2ad17a bde8b59d 3f7e0191 3ee87057 3ebd9c3e -> 4014d1cf 3ed0a677 3f8a702c", + "00000000 3efe3f40 3ecf9c30 3da12792 3ee8c398 3f800d6e 3f89a672 -> 3efe3f40 3ecf9c30 3da12792", + "3f000000 3e65dd6c 3f959064 3f151636 3efb2937 bdf822b1 3f8fabae -> 3e7b2937 3f9d517a 3f0fabae", + "3f800000 3d443d76 3f0f1f7e 3d443d76 3f176207 3ea2c91c 3f690f42 -> 3f0b1e30 3e76ebc0 3f5ccb6b", + "3fc00000 3e3332e7 3e3332e7 3ed670ee 3e2a0995 be617925 3e2d14dd -> bd97b6f2 3f015a28 3e294290", + "bf000000 3f659b6a 3f294482 bc2ec161 3e800000 3f800000 00000000 -> 3f82cdb5 3f528904 bcaec161", + "3e800000 3f23dc68 3f23dc68 3eeda376 3ee678b5 3f8272e3 3ed49370 -> 3f070d51 3f1327a6 3eb87e9a", + "3f400000 3f4c3318 bdffa1e8 bdffa1e8 3f3ea3c0 bd7463fb 3e6658b6 -> 3e74e120 3c90add8 3e6cab02", + "40000000 bdcef1c4 3e452551 bd469af4 3f96cd69 bd0452a7 bd0452a7 -> 402a3413 3e83a752 3da595c6", + "00000000 3f5ade12 3f6f7f3e 3f5ade12 3f0a7c0b 3f0a7c0b 3ef28ae7 -> 3f5ade12 3f6f7f3e 3f5ade12", + "3f000000 3e31cd58 3f89ea56 3ecc784e 3f4ca06c be273bd7 3f432219 -> 3ecca06c 3f945e14 3ec32219", + "3f800000 3cc10ccc 3f7343cc 3f9dbc41 3f151847 3f1cb7b7 3f1cb7b7 -> 3f0f0fe1 3ead182a 3f1ec0cb", + "3fc00000 3ec56109 3f83f802 3ec56109 3f080056 3f9d021c 3f080056 -> 3cd3ef00 be6366d0 3cd3ef00", + "bf000000 be2ddeed 3f1c088e 3f9e152f 3ebe7085 3ebe7085 3f5dd784 -> bf068b98 3f4ba4af 3fd58b10", + "3e800000 3d45860d be327df8 3f93e4cf 3f579c7c bdb1b365 3f8c1c9c -> 3e704d3d bddeead1 3f61bb50", + "3f400000 3f6f9cba 3f15e753 bd1e0f87 3eb26cb8 3f0e7ca7 3e249785 -> 3f2cb3f5 3e2c2758 3e0f3395", + "40000000 be4f3b01 3f37d938 3f37d938 3f48eca7 3f7e629b 3f9f9d74 -> 400b5164 be2b19c8 3eadd450", + "00000000 3f4705af 3d3ce753 3f4705af bcdeb6d5 bcdeb6d5 3f4d42e8 -> 3f4705af 3d3ce753 3f4705af", + "3f000000 bd0e3e73 3ecc8f95 bd92e17b be5dc8d2 3f514ce5 3bff572a -> 3d96a998 3ed14ce5 3b7f5720", + "3f800000 3ea663c2 3ee27181 3e750b51 3f44af8a 3f28ac8b 3e72b27b -> 3ee2fb52 3e5dcf2a 3b163580", + "3fc00000 3f569b7d 3f4c165c 3e092dfc 3eba9e07 3eba9e07 3e9ffd85 -> 3e9549f0 3e803fae 3e4d9c97", + "bf000000 3ecdeba5 3ed87733 3eeab532 3f7b6d38 3f9f902a 3ea01be5 -> 3ea06a12 3e639c25 3f1d6192", + "3e800000 3d47ae78 3f2bf936 3f2bf936 3f9ad3b6 3f4d6000 3f4d6000 -> 3ea74e9d 3f09549b 3f09549b", + "3f400000 3f7585cc 3f7585cc 3f186ecd 3f8379bf 3f1c5652 3f26b81d -> 3e94e770 3f00450e 3e434abc", + "40000000 3ea9725e be395833 be395833 3ec9b08d 3e89e127 3eed19dc -> be51ec00 3f8a71a7 3fbc0e02", + "00000000 be0d3b02 3e11648e 3f704e3c be38c855 be38c855 3d55932c -> be0d3b02 3e11648e 3f704e3c", + "3f000000 3e756356 3efcb0ae 3e2fc611 3e8b6f7c 3f84f71a 3f84f71a -> 3e0b6f7c 3f04f71a 3f04f71a", + "3f800000 3eff4aef 3e811097 3ebc5f63 3f7aaf13 be4aa7e2 be4aa7e2 -> 3ef61337 3ee66488 3f10d9aa", + "3fc00000 3b9c9330 3f81c328 3b9c9330 3e2230e7 3e2a8649 bd86c3ca -> 3e698028 3f4393f5 3dd3eee2", + "bf000000 3eed51af 3f2cd6ec 3eed51af 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f215382 3f578196 3f215382", + "3e800000 3f85eeab 3f9d5eb8 3f9d5eb8 3f2021ca bdd53c4d 3ca7c5a5 -> 3f63d4e4 3fa0b3a9 3f9cb6f2", + "3f400000 3eb703ca 3ef17a50 3e43fb4f 3d511d3f 3f61de59 3ea084c2 -> 3ea3690c 3eda105e 3e0ec97c", + "40000000 3f18136f 3f677dd3 be639a43 3e73fb97 3eaa4e25 3f3fe37e -> 3df0ad18 3e74beb4 400a9eac", + "00000000 3f5586a5 bdce3ee0 3e621a6f 3f6ddf78 3d5462b8 3d5462b8 -> 3f5586a5 bdce3ee0 3e621a6f", + "3f000000 3e64370b 3e64370b 3d374ae6 3f8afc38 3d400847 3f8afc38 -> 3f0afc38 3e4c3602 3f0afc38", + "3f800000 3f975441 3f9ffeda 3f975441 3ed5cdaf be20ed73 3cdaed3d -> 3f43c1aa 3fb41c88 3f93e88c", + "3fc00000 3e27c881 3e27c881 3f90ee74 bd3ac3d0 3e39ce4d bd3ac3d0 -> 3e6dd1ef bd636e3c 3f99afa1", + "bf000000 be762f28 3f3951c6 3f1e522a 3f7fd7ac 3f3ccaec 3f8ee5e2 -> bf7b036a 3f8a1f0b 3f2dbe72", + "3e800000 3f41bae3 bc504701 bc504701 3e88eb63 3f7e9a64 3e71beff -> 3f309d77 3e78182c 3d57b620", + "3f400000 3f3c5bc7 3e40046f 3f3c5bc7 3f000000 3e800000 3e800000 -> 3eb8b78e 3dbffb91 3f0c5bc7", + "40000000 3ed4394d 3e1c755d bd223af8 3f65e749 3f131b57 3d2c351e -> 3f0d789e 3f30dea9 3e4fc6c9", + "00000000 bd68c6c1 3f3bdb27 3f3bdb27 3f682845 be6fde12 3f27816f -> bd68c6c1 3f3bdb27 3f3bdb27", + "3f000000 bca6088c 3d11254d be55632a 3f1f83b3 3f95e8fe 3f95e8fe -> 3e9f83b2 3f15e8ff 3f15e8fe", + "3f800000 3f2abab6 3f947e45 3f9f00cb 3f2ce0ba 3e103265 3e103265 -> 3c098100 3f8277f8 3f8cfa7e", + "3fc00000 3f23c6c4 3d50147c 3f736730 3f581170 3f78cce0 3f78cce0 -> bc5cd800 3fad9860 bee33620", + "bf000000 3f3cdda7 3f60ac58 3f4cfbbd 3f876ae9 3f47df45 bd176bff -> 3f725065 3fa24dfd 3f48405d", + "3e800000 3f73d8ee 3ed28deb 3f73d8ee 3f6d90c0 3f731ec9 3f6d90c0 -> 3f3874be 3ee2d65a 3f3874be", + "3f400000 be3dd3da be3dd3da 3b53f373 3d8fd1a7 3d8fd1a7 3f226438 -> 3e14d88c 3e14d88c 3ef2c262", + "40000000 3ea917d4 3ea917d4 3f7698e2 3e3c7e8b bdbc5c40 3e3c7e8b -> bd1b35b8 3f03a2fa 3f18599c", + "00000000 3ed344b5 3f7fc681 3ed344b5 3f090129 3f897a98 3f6dca6d -> 3ed344b5 3f7fc681 3ed344b5", + "3f000000 be7a9ab6 3f51b6a9 3ef8a326 3f6dac6a bde43133 3f89ef50 -> 3eedac6b 3f5ff9bc 3f09ef50", + "3f800000 3dea30f2 3dea30f2 3f2019b3 3f400000 00000000 00000000 -> 3f22b9e2 3dea30f2 3f2019b3", + "3fc00000 3eb6f049 3eb6f049 3f819645 3f886234 3e808f74 3f886234 -> 3f623654 bc9e6e50 beda64f0", + "bf000000 3ecea80e 3f0ec6c3 3ed71c22 3f820804 3f820804 3e9b4e1f -> 3e994014 3f1b8582 3f126199", + "3e800000 3e065729 3f116021 3f116021 3e8f1555 3f968474 3f968474 -> 3e0ab63f 3f13f24a 3f13f24a", + "3f400000 3f95fcdb be29a1ee 3f5faa1c 3f000000 3f800000 3e800000 -> 3f4bf9b6 3f55343e 3f2faa1c", + "40000000 3f21ef00 3f8852f7 3ebe505b 3ecbea49 3f42c10e 3ecbea49 -> be27ed24 bee9b85c bea31c7f", + "00000000 3f5a232c 3f90edf8 3f90edf8 3e0bd7ee 3ee58526 3ee58526 -> 3f5a232c 3f90edf8 3f90edf8", + "3f000000 3d5cb05d 3f864059 3f12ffee 3e800000 3e800000 3f000000 -> 3e000000 3f6c80b2 3ea5ffdc", + "3f800000 3e96bd07 3e3dde56 3f88ffc9 3f82a5c1 3be68ebf 3f82a5c1 -> 3f39ecfe 3e36a9e0 3d4b4100", + "3fc00000 3ce7a963 3f8936a3 3efef1c7 3f948c74 3f2530fb 3f948c74 -> 3fd79562 3dd51e70 3f3eb394", + "bf000000 be727e0a 3eb37f0f 3eb37f0f 3e8c6cbc 3b999823 3f56c608 -> bf1c5a34 3eb4b240 3e903816", + "3e800000 be5ab358 bde8c0aa bde8c0aa 3f2ed4ed 3eb6be2d 3ecd7224 -> 3d82f680 3d04bbb0 3d32239c", + "3f400000 3f68437a 3effe2c0 3effe2c0 3eb6a118 3eb6a118 be2d3fcb -> 3f23c711 3e6dd3dc 3f206d56", + "40000000 3daaa68f 3f0887b9 3e35e5e1 3e053476 3f3fc0ad 3f00a26c -> 3c26f158 bdd0ae88 3ef1b0e0", + "00000000 3d1e6739 bb15afff 3e2a3e0b 3f24cd23 be5ae02a be5ae02a -> 3d1e6739 bb15afff 3e2a3e0b", + "3f000000 3eccba50 3f0a7a02 3eccba50 3f124a1d 3f124a1d 3f2fb127 -> 3e924a1d 3e924a1d 3eafb127", + "3f800000 3e862f64 3f3fad7c 3f3a8215 3f4c7cae 3eff0f8a 3efd44a3 -> 3f0964fc 3e804b6e 3e6f7f0e", + "3fc00000 3ed3b773 3f90f85c 3ddea2a7 3f455b61 3f3b6c77 bdfeaad3 -> 3ea8a33d 3d0ce060 3e9728b9", + "bf000000 3ee87cb2 3dcdae93 3f050b03 00000000 3f400000 3f000000 -> 3ee87cb2 be32516e 3f450b03", + "3e800000 3e846403 3f3370df bd87d7e2 3f2e9180 3eb03e18 3f2e9180 -> 3e997ac2 3f1d691c 3e0c9b87", + "3f400000 3f582f60 3f43bb93 3e278d2f be126ab1 3f585202 3f9ee9ae -> 3f73a361 3e80bf70 3f596cdf", + "40000000 3e97ebac 3f53fe6b bac9ded5 00000000 3f400000 3f800000 -> 3e97ebac bf2c0195 40004bb4", + "00000000 3f6b33b7 3f112b69 3f24dd8d 3f950a15 3eb0b9c7 3f94a65d -> 3f6b33b7 3f112b69 3f24dd8d", + "3f000000 bd54c452 3ed67b17 3db21fb2 3f800000 3f800000 00000000 -> 3f000001 3f000000 3db21fb2", + "3f800000 3db09969 b9dba0cf 3db09969 3de2298c 3ef0a538 3de2298c -> 3cc6408c 3ef0dc20 3cc6408c", + "3fc00000 3ed6bf18 3f61fb3d 3ed6bf18 3f800000 3f000000 3f400000 -> 3f2940e8 3e07ecf4 3e9281d0", + "bf000000 3e8294d5 3e6e61f5 3e8294d5 3e917561 3e6b0ff8 3f6fa098 -> 3ebc6efa 3eb1f4f8 3d2c488c", + "3e800000 3f4a89be 3f1e2c7d bd9b2e08 3f88f306 bbde808e 3f88f306 -> 3f29be62 3f1e9bbd 3e6b1a88", + "3f400000 3e6f79e2 3e9d7a72 3e9d7a72 3f530487 3f493fed 3f530487 -> 3f005428 3edf22aa 3eedc992", + "40000000 3d63d772 3e9f10f9 3d63d772 3f1db361 3e9195ff 3e9195ff -> 3f88572f be841b05 3ecdbb34", + "00000000 3ecc68d7 3db53027 3ecc68d7 3f0f89a9 3f4c5249 be0142c5 -> 3ecc68d7 3db53027 3ecc68d7", + "3f000000 3f90318a 3f94fc42 3f94fc42 3f931c62 3f30172c bdf199ab -> 3f131c62 3f51ecee 3f9c8910", + "3f800000 3ede5e7f 3ede5e7f 3f7cb45e 3f89f307 3f86b183 3f86b183 -> 3f24b6ce 3f1e33c6 3d857540", + "3fc00000 3e12a9f3 3e12a9f3 3ed99404 3f9da402 3e28f4bd 3f23430a -> 3fc7cb86 bd1f932c 3dda8458", + "bf000000 3f423852 3f1636ee 3f15ca47 3f610314 3f610314 3e8fe1e8 -> 3f89f78d 3f3bec52 3f39c2c1", + "3e800000 3f187341 3f0274a9 3f0274a9 3e99b6e8 3f7ac099 3e99b6e8 -> 3f053c64 3effd4f6 3ede7b98", + "3f400000 be28448e 3f6946f8 be28448e 3f5694d3 3e7b0447 3f5116af -> 3f35f830 3f3a362a 3f31d994", + "40000000 3f1a444f 3e91baf4 3f9e58d0 3f625ba4 3f625ba4 3f140646 -> bd215a50 3f6a1eda 3da528a0", + "00000000 be39ae74 3f968919 3e9fd8a1 bbb43900 3f0db0c6 bc76851c -> be39ae74 3f968919 3e9fd8a1", + "3f000000 3f6a8368 3ef6b9a9 3dbfef33 3efb2422 3e7f01f0 3f70d13b -> 3f2bba60 3eb6f92d 3ef0d13c", + "3f800000 3e0f0dae 3f8b9678 3ed11725 3e5a0c94 3f45b459 3e5a0c94 -> 3d95fdcc 3ea2f12e 3e4821b6", + "3fc00000 3eb8acd1 3f8147a6 3eb8acd1 3f50b768 3f50b768 3f69d7a8 -> 3f00664b be5a0f40 3f2616ac", + "bf000000 3ecdd4db 3ecdd4db 3ea284ef 3f140411 3f140411 3e39145a -> 3f03d2d2 3f03d2d2 3ed0ca06", + "3e800000 3f964bd6 3ed21e5d 3ef1ddf1 3f9202b5 3dd3a220 3f9202b5 -> 3f639652 3ec4e43b 3f0578d7", + "3f400000 3f93fc79 3ed6460f 3f96d28a 3f92bbc8 3f9f344f 3ef20fe2 -> 3e97be8c 3f393cf2 3f52df1f", + "40000000 3f6f8c82 3f6f8c82 3f6616d5 3e3ea8fc 3da4c26d 3da4c26d -> 3f103804 3f465be6 3f3ce639", + "00000000 3f4e241e 3f852a5e 3f4e241e 3f8c6627 bdf8b299 3f0e58ce -> 3f4e241e 3f852a5e 3f4e241e", + "3f000000 3f90dfe0 3d973527 3d973527 3f955439 3eee0e42 3eee0e42 -> 3f155439 3e6e0e42 3e6e0e42", + "3f800000 3dfe1634 3dfe1634 3f1f8625 bdf346c0 3f42a600 bdf346c0 -> 3e78ae7a 3f22e33a 3f3deefd", + "3fc00000 3e70430d 3e08aedc 3e70430d 3f21a92f 3e252709 3f9cd203 -> 3ef4b880 bccd1950 3faf2a42", + "bf000000 3f99a307 3f560a04 3f99a307 3eededfc 3ee893ea 3f2fec63 -> 3fb760c6 3f88177f 3fc59e20", + "3e800000 3f9880bd 3f576d66 be4b12ce 3f6c9cfc bd8e4443 bd8e4443 -> 3f75da3b 3f5bdf88 bdeea3df", + "3f400000 3f8fd1b0 be6e84dc 3f424f70 3e2cb200 3e2cb200 3f2e613c -> 3f7f4200 3e78c7ee 3e7e1a0c", + "40000000 bc831256 bc831256 3e4264d5 bdb56d84 bd0370f3 3ea15fb3 -> 3e250b39 3d4558bb 3d794134", + "00000000 3f21d4df be7b1af3 3e9c913d 3e53d78f 3f099a76 3f40db01 -> 3f21d4df be7b1af3 3e9c913d", + "3f000000 3d9cb7a3 3f1257ae 3f69c8dd 3d031499 3e873980 3eb60536 -> 3d77e4fa 3ee1129c 3f3c4790", + "3f800000 3f9d454b 3ea48346 3f26ecff 3e006543 3eb69c2e 3eb69c2e -> 3f8d38a3 3d10c740 3e973dd0", + "3fc00000 3e07d0f4 3f959c8a 3e07d0f4 be7ef70f be7ef70f 3dcef6ca -> 3f0190e3 3fc56add bc9b4120", + "bf000000 3dd03bc7 3e4ab1f3 3f590685 3f3676f8 be47c9f5 3f3676f8 -> be1cb228 3dcd99f1 3f9a2100", + "3e800000 3f485c54 3e833f90 3f5b374c 3e91a2ef 3e9920ab 3e91a2ef -> 3f3627f6 3e4fcfe6 3f4902ee", + "3f400000 3ebda979 3da2a1ee be75df0e 3f979025 3f979025 3f09fa0f -> 3f33edda 3f592e18 3f06376c", + "40000000 3f373428 3eb92d32 3f373428 3f6e7704 3f9e7239 3d9e2509 -> be915ce0 3fb2028c 3f0faae6", + "00000000 bdb2ab86 3f88549a bdb2ab86 3f94329f 3d264ac7 3d264ac7 -> bdb2ab86 3f88549a bdb2ab86", + "3f000000 3f688fc9 3f1109b4 3f688fc9 3f0ded54 3dd93f7c be101a78 -> 3f21991f 3f0375bc 3f7a9318", + "3f800000 bd8251a0 bc19dd41 bdc49654 3f400000 3f400000 3e800000 -> 3f504a34 3f426775 3eb12595", + "3fc00000 3f5685bb 3e8f8f16 3f26a50b 00000000 3e800000 3f800000 -> 3f5685bb bdc1c3a8 3e4ad7a8", + "bf000000 3da27f25 3d8ef5f3 3da27f25 3f761fa4 3f2db285 3dcd74ec -> bea4e011 be4c6f18 3dde43d4", + "3e800000 3f7864b1 3f7864b1 3f40764e 3ef9e477 3edd6419 bdee1e53 -> 3f592822 3f5cb82e 3f47e740", + "3f400000 3d52159e 3ed1f75f 3d89583a 3f079b91 3e798e1a 3ef0997d -> 3ebe4800 3e68c42a 3ea34816", + "40000000 3f808bd0 3e94287b 3df16982 3f761125 3e0952a1 3f2b3f26 -> bf6b0aaa 3cad5da0 3f7bf6bc", + "00000000 3e978460 be27c5ae 3e978460 3e2e8a28 3f8adc6d 3f161b60 -> 3e978460 be27c5ae 3e978460", + "3f000000 3f8e7db1 bd4fd1f8 3f098f18 3e8b8ed3 3f623ede 3f7807d1 -> 3f7a17ad 3ee23edf 3ef807d1", + "3f800000 3e03f332 3f8dc00d 3f881eb6 be4d16cc 3ed53211 be4d16cc -> 3ea884ff 3f30e712 3fa1c190", + "3fc00000 3f015542 3e5d53db 3f015542 3f99d962 3f914cce 3f095b56 -> 3f4ae1a2 3fa29e3d be52860c", + "bf000000 3e33da9c 3f329ec1 3f329ec1 3d1df776 bd9ef6b5 bd77ec99 -> 3e47998b 3f28af56 3f2adf5c", + "3e800000 3c035914 3e14c36e 3f2e3a3d 3f508136 3f957bbe 3f957bbe -> 3e549bff 3ebaac99 3f21dafe", + "3f400000 3f32e4db 3f831e67 3f32e4db 3f9f2624 3f94076f 3f8913d6 -> 3f1546c8 3eb5d980 3ee856a7", + "40000000 3f436e3f 3f50f894 3f436e3f 3f56aadc 3de6bf04 3f9b6d15 -> bf1cf505 3f1748d4 3e0da65c", + "00000000 3e4d4d87 3e4de013 3e4d4d87 3df110fd 3f6db021 3f919445 -> 3e4d4d87 3e4de013 3e4d4d87", + "3f000000 3e4f2033 bd9ad5ad bd9ad5ad 3f9cddee 3f9cddee 3f8b6ec9 -> 3f1cddee 3f1cddee 3f0b6ec9", + "3f800000 3eb65ef9 3f2f7894 3eb65ef9 3f400000 3f800000 3f400000 -> 3ec9a107 3ea10ed8 3ec9a107", + "3fc00000 3dd8fec7 3f5f587c 3f92bd90 3f8a1b6d 3f8a1b6d 3e3e9845 -> 3fb4094a be017ac4 3f5e0206", + "bf000000 3d22959b 3d22959b 3f4d4ae7 bd53f218 3f9a9fa6 bd53f218 -> 3c62723a bf064cf2 3f46ab56", + "3e800000 3eba4949 be6bb561 3eba4949 3f8ad49f 3f53be4e 3f14463c -> 3ee7f944 3dbbc73a 3ea747c2", + "3f400000 3ede7789 3ede7789 be254fb3 3e1943c4 3f084af5 3e71b6f0 -> 3ea4fe20 3e3a6956 3e83f888", + "40000000 3e7c7930 3d645545 3f5c9622 be3daecc 3e0bf1c4 be3daecc -> 3f1df5b2 3dd9472a 3f9db6c3", + "00000000 3f75c7eb be1b3f45 be1b3f45 3e114946 3e18b32a 3e18b32a -> 3f75c7eb be1b3f45 be1b3f45", + "3f000000 3f1721ac 3f1cb4dc 3f832f3e 3e952dd4 be26ee53 be26ee53 -> 3ee3ac6e 3f3192a6 3f8d9e23", + "3f800000 3c5fcc56 3f93ef12 3f08a410 be23b12c be0d5953 3f3e6bad -> 3e31adf1 3fa59a3c 3e571e74", + "3fc00000 3f999fef bdcdb5f9 3d9b2915 00000000 00000000 3f800000 -> 3f999fef 3e4db5fa 3fac9add", + "bf000000 3ebcac3f 3ebcac3f 3f15e8b9 3ab189ae 3f996bfe 3efc91f4 -> 3ebd0504 3e0d0105 3f550d36", + "3e800000 bcb0240f 3f06296d 3e785480 3f3ab53f 3f61bacf 3f1303cb -> 3e2fb2fd 3ef706d4 3e879706", + "3f400000 3f49d8a3 3f5d8ad2 be14ef8b 3f526fd4 3ea2ee43 bd1783f9 -> 3e639e34 3f207178 3d383c1c", + "40000000 3e54d1d2 3f5e376a 3c774702 3f55179b 3ede2d8f 3d3bca1c -> 3f8548ec 391db000 3d3e1ef6", + "00000000 3f6f1888 3f9eb94a bdf425b1 be479d0c be479d0c 3cd120c2 -> 3f6f1888 3f9eb94a bdf425b1", + "3f000000 3f454ffa be5fdb7a be5fdb7a 3ef18359 3e47ba9f 3ef18359 -> 3f08ef24 3dc7ba9c 3e71835a", + "3f800000 3ed9b23e 3f84554c 3f456b12 3e800000 00000000 3f800000 -> 3e33647c 3f84554c 3e6a53b8", + "3fc00000 3eb6ed14 3de083eb 3eb6ed14 3e301349 3f173b35 3f8d9ad7 -> 3dcb7a74 3f2ab7d4 3f71e371", + "bf000000 3f977fe2 3f103884 3f103884 3ef2d3b2 3f582907 3f582907 -> 3fb5da58 3f345c84 3f345c84", + "3e800000 3cb72ca3 3f550c29 3f90896c be23c76d 3f12f3dd 3f388034 -> 3d7f5dbe 3f304f32 3f72f2cb", + "3f400000 3e18321a 3d5af924 3f1c49f6 3f816447 3f816447 3f0f0c47 -> 3f2f1028 3f3b3ea2 3e440304", + "40000000 3f4a3b55 3f4a3b55 3f8012f0 3f9dd116 3eb02be1 3eb02be1 -> 3dc492c8 3dd07ba0 3e9ff400", + "00000000 3e312e24 3f266a96 bd387f9b 3eba1af7 3f16212e 3f16212e -> 3e312e24 3f266a96 bd387f9b", + "3f000000 bb35f31a be560fb9 be560fb9 3dde67d7 3f443214 3e9d8232 -> 3d5e67d7 3ec43214 3e1d8231", + "3f800000 3f609f5c bd8a58cc be561bed 3f97de81 3f27c823 3f0f40de -> 3e9e3b4c 3f39133c 3f44c7d9", + "3fc00000 3ef0eb54 bd763460 3f271dae 3f000000 3f000000 3f400000 -> be43ad50 3f5ec68c be38ed70", + "bf000000 3f2c5591 3f0e4dea 3eb0e7ed 3f317e40 3f4068cd 3f317e40 -> 3f7fec02 3f3c676e 3eb0519a", + "3e800000 3f0a3792 3d7cf099 3c879d4b 3e800000 3f800000 3f000000 -> 3ef46f24 3e8fcf09 3e0879d4", + "3f400000 be433cff 3f760938 3f0c8bda 3f000000 00000000 3e800000 -> 3ef0cf40 3f760938 3eb917b4", + "40000000 be778108 3f8a2568 be778108 3e800000 00000000 3f400000 -> 3f9cd063 3f8a2568 400e6832", + "00000000 3ef970ee 3f8aa313 3f7a4131 3f9e2a37 3ec3c053 3f9e2a37 -> 3ef970ee 3f8aa313 3f7a4131", + "3f000000 3e3fac7e 3e3fac7e 3e1b51c5 3e8c38f4 3f35df91 3f35df91 -> 3e0c38f4 3eb5df92 3eb5df92", + "3f800000 3eaebd16 3f512210 3f2d2527 3ecbac03 3e16b3af 3e16b3af -> 3d677768 3f2b7524 3f07783b", + "3fc00000 3f89a6ea 3f3a0147 be19c2a0 3f389c02 3f389c02 3f299a59 -> bbce1800 beb5d17a 3fa5a46b", + "bf000000 3d374d0c 3f5c593d 3f00d6d8 3f000000 00000000 3f000000 -> be245979 3f5c593d 3f40d6d8", + "3e800000 3f24bf0c be22527d 3eba4a14 bd90af1e 3e4dfe7c 3eda5195 -> 3f294485 bced4d00 3e93b96f", + "3f400000 3f40c96d 3f40c96d 3f826d6e 3ec15004 bdf74765 3eaa7a5b -> 3ef096d7 3f57f81f 3f44ecfa", + "40000000 3de93081 3f020e1f 3ec38a4e 3e800000 3f000000 3f800000 -> 3e223740 befbe3c2 3f5ab08b", + "00000000 3c8bce88 3f3aee9d 3effdee6 3f2a2ea6 bbd1b283 3f360480 -> 3c8bce88 3f3aee9d 3effdee6", + "3f000000 3f92ebbb bd9d205f bd9d205f 3f45913d 3f9b910b 3f9d48dc -> 3f430ed8 3f1b910b 3f1d48dc", + "3f800000 be1725fc 3eadca4a 3eadca4a 3f624d89 3f624d89 3ec06b17 -> 3f840b84 3f0b6864 3d150668", + "3fc00000 3f8cdc8f bce93173 3f5d66d9 3de78bf8 3f3b6fe7 3eb48a65 -> 3f6e4ee0 3f93dd79 3eabfe1a", + "bf000000 bd587ba5 3f322397 3f322397 3f9f7b94 3f9f7b94 3c7fba9d -> bf3a8b08 3f44cb9a 3f34230c", + "3e800000 3ea435af 3e7f7c3d 3f242d43 3f9fca09 bc13564d 3f99a920 -> 3ef1e4e0 3e80e4cb 3f1eeb32", + "3f400000 3ee78550 3ee78550 3f559990 3f800000 3f400000 3f000000 -> 3f061eac 3eac3d58 3eeb3320", + "40000000 bc8020fd 3f2903d5 3ee6e8d6 3e6755eb 3d3b9982 3f5e0e0d -> 3eff5c1a 3f1190a5 3ec37db2", + "00000000 3f838f15 3f9213b5 3e1dfc7c 3f207304 3f207304 3f9ce00b -> 3f838f15 3f9213b5 3e1dfc7c", + "3f000000 3dd44bb4 bd70990e bd70990e be7b8862 3f6170f9 3edcb0b6 -> 3e67ea0b 3ee170f9 3e5cb0b6", + "3f800000 3db0846b 3db0846b 3f5e0653 3f7a2217 be7b9931 3e05fc0a -> 3f64118a 3ea9edb3 3f3c8750", + "3fc00000 3e686e49 3e5d02dc 3e5d02dc 3f0ffd78 bbd01f88 3f34651b -> 3ec78a20 3e66c456 3f20163a", + "bf000000 3d8c2ea8 3f049f9f 3f049f9f bdf07f01 3f9e6e0e 3f876d3f -> 3c1f7940 3ed5a260 3f01d1ff", + "3e800000 3f5ae806 3f65795d 3f5ae806 3f400000 3f000000 3f000000 -> 3f2ae806 3f45795d 3f3ae806", + "3f400000 3f8bd249 3f916a38 3eb9ad66 bcac519d 3e25c34a 3f907282 -> 3f8dd73e 3f81dfe9 3f2a406a", + "40000000 3e22e4ca 3f61fd2c 3f50e54c 3e84a0e4 3f8d749a 3f3fcfc4 -> 3d2754c8 bee04a38 bf2eba3c", + "00000000 3e96ca44 be01d50c 3f6c7760 3f758295 bd8b16e1 3efb8e5d -> 3e96ca44 be01d50c 3f6c7760", + "3f000000 3ef9c9bb bcbc3106 3f2ff250 3f208d43 3e95544a 3e28e628 -> 3ea08d43 3e155449 3f1ad58b", + "3f800000 3ee3ebbc 3f7dfb5c 3f97d78c 3ec68e29 3eb2a241 bded3535 -> 3d6aec98 3f24aa3c 3fa6aadf", + "3fc00000 3f145912 be67b3de 3f014911 be7bb433 3f8d330a be7bb433 -> 3f72bca6 4006dcc4 3f5faca4", + "bf000000 bcb75627 3f0fd8ee 3f0fd8ee 3e889e26 3e889e26 3ec87215 -> be3673af 3f320078 3f41f573", + "3e800000 be310ab8 3ebd25e8 3f8737f9 3f0a1a3a bdfa30c6 bd4e597d -> 3d465378 3eccc8f4 3f88d4ac", + "3f400000 3f35ae4e 3f35ae4e 3f63edca bd52ef97 bd52ef97 3f50cd34 -> 3f3f9189 3f3f9189 3e8ea7c6", + "40000000 3f99ce61 3ecaa0c5 3ce8d3c2 3f1643be 3f728eeb 3f9ff3fb -> 3ce2a8c0 3f352cae 401a7f05", + "00000000 3d3425e1 3eaa0c0a 3cb85510 3f751ba0 3f2cafdc 3f6c35e1 -> 3d3425e1 3eaa0c0a 3cb85510", + "3f000000 bd203a9d 3d3be6c1 3cb688e3 3f9a3294 3f5c9f12 3f9a3294 -> 3f1a3294 3edc9f12 3f1a3293", + "3f800000 3f93e809 3f93e809 3f1fbc35 3f9afc8d 3f9afc8d 3f910602 -> 3d629080 3d629080 3f024fcf", + "3fc00000 3f1f0885 3eab1da6 3eab1da6 be11627f be11627f be700d74 -> 3f558d75 3f0c13c3 3f2f93de", + "bf000000 3f992e35 3eecdc8a 3f4aaecb 3ec0a9f0 3ec0a9f0 3f85a10a -> 3fb14373 3f2698c1 3f87de46", + "3e800000 3f3a9e1e 3f3a9e1e 3f244c43 3f3c0e0f 3ec80246 3ec80246 -> 3f0c5293 3f219dd5 3f0b4bfa", + "3f400000 3f08a6d5 3e559223 3e559223 3f8ec27d 3e258481 3e258481 -> 3f11d051 3db2dd84 3db2dd84", + "40000000 3f891a03 3e86602d 3f891a03 3f85feff 3f760c22 3f760c22 -> bf82e3fb 3f914401 bf59e43e", + "00000000 3f7fd7c0 3df111ce 3f80ff2e 3f0fcdbe 3f21ea6b 3f21ea6b -> 3f7fd7c0 3df111ce 3f80ff2e", + "3f000000 3d24a2b7 3d24a2b7 3f6cfaa7 3e9d5fba 3f93a2ee 3f1171a0 -> 3e1d5fba 3f13a2ed 3f2441d7", + "3f800000 3dce6330 3f0e8dbe bd752772 3f400000 3f800000 3f000000 -> 3f26339a 3ee2e484 3f0f5277", + "3fc00000 3f146c0f 3f701955 3f0f0b44 3e8c2e7d 3e133c9e 3e133c9e -> 3e2d24c4 3f38e29a 3eafa912", + "bf000000 3f397963 3f18c0ee 3f397963 3f1302a3 3f6d0587 3f1302a3 -> 3f817d5a 3f3aff18 3f817d5a", + "3e800000 3ebbece6 3f1bcf07 3eb49108 3f1e4c1a 3f1e4c1a 3f7bf51d -> 3ead1c80 3eeaf514 3ed84312", + "3f400000 3f2af474 3ece5f82 3f4314d5 bd026b2c bd3822a6 3ea29a11 -> 3f31117a 3edfa2c2 3f061b0e", + "40000000 3ede6973 3ecc6ec2 3f018bf3 3f13beb2 3ede283b 3ede283b -> be188322 bea8fbd0 beb93890", + "00000000 3e4ce381 3f74f501 3ecf0355 3f800000 3f400000 3f800000 -> 3e4ce381 3f74f501 3ecf0355", + "3f000000 bd610822 3f7800d5 bd610822 3fa00000 3fa00000 3fa00000 -> 3f200000 3f200000 3f200000", + "3f800000 3f9a901c 3f71a561 3f692458 3f000000 00000000 3f400000 -> 3f352038 3f71a561 3e249160", + "3fc00000 3f517236 3e2ed398 3e1fb68e 3f77a77b 3cfbc02d 3f677985 -> be3da4d0 3dff3f1e 3f85ad80", + "bf000000 3edfff01 3bc7eb0b 3ec7716b 3f4b044f be5e68f3 3e96d571 -> 3ef4f9b3 bdd1ea42 3f096e12", + "3e800000 3f6eb48a 3e858865 3e858865 bd44b968 3ebc9b9b be67e681 -> 3f71c770 3e63d632 3ea28535", + "3f400000 3e4af7e0 3e4af7e0 3f882b4b 3f800000 3f800000 3e800000 -> 3f26a104 3f26a104 3f605696", + "40000000 3f951688 3f02505f 3ee0756f 3f400000 3e800000 3e800000 -> beaba5e0 3c1417c0 bd7c5488", + "00000000 3ed4c1d9 be6227d6 be2f9e72 3f33ed78 3ede7b12 3acaaa4f -> 3ed4c1d9 be6227d6 be2f9e72", + "3f000000 3f9e7c00 3f9e7c00 3f6b72a2 3f800000 3f000000 00000000 -> 3f3cf800 3f7cf800 3f6b72a2", + "3f800000 3eef0bdf 3f508b9f 3f0f1718 3f8a5137 3e1c1d72 3ea3611b -> 3f1d1c7e 3f298442 3e759a2a", + "3fc00000 3d976237 3f480221 3f02e4be 3f400000 3f400000 00000000 -> 3f7a2772 beaffbbe 3f02e4be", + "bf000000 3eec5674 3e3bb4e9 3e3590ff 3f4d060d 3f4d060d 3f1f9d31 -> 3f05d36e bd0a8924 3d2f9e74", + "3e800000 3de47786 bde2f449 bde2f449 3eb7a27c 3ede8fc8 3d38d4dd -> 3e14ef20 3d5a2b46 bd34bf12", + "3f400000 3daac574 3dd1dbe6 be086e04 3f0f8425 3f0f8425 3ca7ba93 -> 3ec1ed89 3ebd0aba 3da7e100", + "40000000 3f8ce57f 3f50b95a 3f8ce57f 00000000 3e800000 3f000000 -> 3f8ce57f 3ea172b4 3dce57f0", + "00000000 3dc83854 3dc83854 3cad7c93 3e4d506c bd993edd bde72e5f -> 3dc83854 3dc83854 3cad7c93", + "3f000000 3edc653a be061fc9 be061fc9 3f9c977f 3f9fae33 3f9fae33 -> 3f1c977f 3f1fae33 3f1fae33", + "3f800000 bdb6317f 3f8768ea 3f8768ea 3f84a05c 3f84a05c bdc41a32 -> 3f900374 3cb22380 3f93aa8d", + "3fc00000 bc9d602f bc9d602f 3f754eb7 3dca9d4a be7a36e5 be7a36e5 -> 3e3f4e04 3eb1d329 3fa991a6", + "bf000000 3f7545a7 be4837e5 3f7545a7 3f000000 3e800000 3f400000 -> 3f9aa2d4 bf041bf2 3faaa2d4", + "3e800000 3d842ee6 3e7533f9 3e7533f9 3f800000 00000000 3f800000 -> 3e9085dc 3e7533f9 3ebd4cfe", + "3f400000 3f188edc 3f188edc 3f8a14ef 3df8125f 3ee6223e 3df8125f -> 3f014d23 3e84840a 3f7ce825", + "40000000 3e21714e 3f95cec5 3e416f2a 3e800000 3f400000 00000000 -> 3cdd60b0 bea8c4ec 3e416f2a", + "00000000 be37e591 be37e591 3ea3fe46 3f0067ca 3f613a4d 3f0067ca -> be37e591 be37e591 3ea3fe46", + "3f000000 3f362da2 3f2323fa 3d8082cd 3c76177f 3c76177f 3e36a4d4 -> 3f344173 3f2137cb 3db6a4d4", + "3f800000 3f46c373 3f020528 3f020528 3f85fe55 bc2ca0b2 3f758f11 -> 3e8a726e 3f04b7ab 3ee713d2", + "3fc00000 3f39dd77 3f2bdadf 3f39dd77 3f74efa3 3f8745a7 3f9d4a7c -> bc8a6f20 3e786cdc 3ec8490c", + "bf000000 3f6a5c43 3f7882d8 bdb2662f 3dab15ba 3f8a32b4 3f8a32b4 -> 3f750d9e 3fb3697e bf36cc40", + "3e800000 3f9b7f18 3eddf430 3f9b7f18 3d95bce4 3f587066 3f587066 -> 3f992824 3edb324b 3f80710b", + "3f400000 3e0dda19 3f484bf6 3f484bf6 3f067f75 3f4f1eb8 3f067f75 -> 3ea648aa 3e5cc43c 3ec6d8bc", + "40000000 3e9387eb bc45c312 3e9387eb 3e8351af 3ea30eb9 3dfa08dd -> be6636e6 3f2c53df 3d341be8", + "00000000 3e232191 3f50a83d 3e232191 3f5998dd 3f5998dd 3ea70122 -> 3e232191 3f50a83d 3e232191", + "3f000000 3eadfa51 3ea9ae9c 3ea79be9 3f88264b 3f99b628 3f88264b -> 3f08264b 3f19b628 3f08264b", + "3f800000 3e6a03b2 3e6a03b2 3f2f52ba 3f25c7f7 bc678291 3f25c7f7 -> 3ed68e15 3e787bdb 3d18ac30", + "3fc00000 be721a18 3f9ae7c4 3f8b7ab6 be76be67 3f6f4e8f 3f6f4e8f -> 3e000382 be449938 bea000d4", + "bf000000 3dbc840c 3dbc840c 3f87121b 3f73e8df 3ec5ee2f 3c1f0ce5 -> be95a6d9 bc16a230 3f87b128", + "3e800000 3f11de45 3f08d316 3e64935f 3f91f860 3f91f860 3f20d1a8 -> 3f11eb52 3f0d65bb 3e898dac", + "3f400000 3e04d350 3f9f495a 3f828b88 3f9dfaa6 3f686525 3f686525 -> 3f5c5d8f 3f1046d8 3ead9668", + "40000000 be089c20 396bfc69 396bfc69 3f8d56c9 bde8b517 3f8d56c9 -> 4026f40f 3e68f016 400d4bb9", + "00000000 3eb7512c 3f8b64d6 3e8aca55 3f60ddc1 3dc0d60a 3f60ddc1 -> 3eb7512c 3f8b64d6 3e8aca55", + "3f000000 3f9b4140 3f79e07e bcbbfdba 3f76fb0c 3f5ccf27 3ee9561d -> 3f3b04fa 3f0b78ea 3e69561d", + "3f800000 3ed0edb3 3f2f4b19 3ed0edb3 3ea7e9a4 3f27d236 3f8fb66e -> 3da4103c 3cef1c60 3f36f602", + "3fc00000 3f9b1373 bcfe8b44 bcfe8b44 3f67218b 3ca82d79 3df16593 -> be122da8 3dbe56af 3e74af00", + "bf000000 3f9cc003 3ec4bce2 3f896478 3f400000 3f000000 00000000 -> 3fccc003 3f04bce2 3f896478", + "3e800000 3f1290ce 3f71a6d3 3f1bedf4 3f9683b5 be56aa2e 3ecc8dbe -> 3f148a42 3f7f1176 3f025c3c", + "3f400000 3f73ac49 3ebe2ad0 bc914a36 3f900f71 3f3e55f2 3f3e55f2 -> 3ebc820a 3ebe6b83 3f11059e", + "40000000 3f17cf6b 3f6335b7 3f34b537 3f763f14 3f763f14 3f0f8250 -> 3e143f9c bf3d22fd bed49ed2", + "00000000 3f295949 3e91a7d8 3e91a7d8 3f88b3d4 be75c9e2 3f88b3d4 -> 3f295949 3e91a7d8 3e91a7d8", + "3f000000 3ed89fba 3f6fe3e7 3ddc4f1e be2da95b 3eb7a1aa 3d6b0559 -> 3f020508 3f41fb7c 3da18dc8", + "3f800000 3f09bbec 3f21efbd 3d5636e9 3ef91908 3e48f04f 3e4778f4 -> 3d52f680 3edf6752 3e11eb3a", + "3fc00000 3f9a0d61 bdb44dc5 3f57b0d4 00000000 3f800000 00000000 -> 3f9a0d61 3fd689b8 3f57b0d4", + "bf000000 3ec77e55 3f440f0c 3f9012b3 3f13c8c4 3f72d3a1 3ea2cbf7 -> 3efb33e6 3f875a24 3fa46c32", + "3e800000 3f091c98 3f81dcee 3f81dcee 3f9f72d2 3f9f72d2 3f9934ef -> 3f1447b5 3f519657 3f4e7766", + "3f400000 3ebf2944 3ed62316 3eb26f6a 3f0f0b18 3f7b47f0 3f0f0b18 -> 3e6df804 3f06ed2e 3e7ab1de", + "40000000 3f9c7948 3f892265 3f892265 3f208ff4 3f8c127b bd82c9ac -> bd02d580 bf834239 3f997b9b", + "00000000 3db309b3 3f6cb85a 3f0d4792 bddc0550 3f43098a 3e267013 -> 3db309b3 3f6cb85a 3f0d4792", + "3f000000 3f8fd9e6 3e8d42b9 3e8d42b9 3f80cf09 3f7409fd 3f7409fd -> 3f1ee4c3 3ef409fc 3ef409fc", + "3f800000 3f5bfaeb 3f9f6ce2 3f96da9d 3e069c86 be494894 be494894 -> 3f3a53ca 3fb895f4 3fb003b0", + "3fc00000 3f2607c2 3f8737db 3f8737db 3dd81d53 be0529d4 be0529d4 -> 3efb0486 3fa02fb4 3fa02fb4", + "bf000000 3f9023c3 3e7aade1 3e1eed95 3f800000 3f800000 3f800000 -> 3fd023c3 bc2a43f0 be4224d7", + "3e800000 3f8e79a4 bdbe6c46 bdbe6c46 3eec2580 3f7c759c 3f441d8d -> 3f7f6e98 3e4cda89 3e14827c", + "3f400000 bdae200e 3f23ae92 bdae200e bd68864c 3f88c7c7 bd1c66cd -> b8895800 3ef6a8c3 3c634bd0", + "40000000 3f16e4bc 3f16e4bc 3f10ded0 bce74ed6 3eb3f472 3ac0af90 -> 3f2559aa bde87db0 3f101e20", + "00000000 be7bb454 3ee043b8 be7bb454 3f00617b bd895821 bd895821 -> be7bb454 3ee043b8 be7bb454", + "3f000000 3f04525d 3f04525d 3f8422b2 3e3d84d3 3f330a9d 3f330a9d -> 3ed94385 3eb30a9d 3f2ec016", + "3f800000 3f695878 3eb53ca0 3ef4ed17 3f81bb22 bddbb40c bddbb40c -> 3dd0ee60 3eec29a3 3f15ed0d", + "3fc00000 3e1fccfe 3e921fed 3e921fed be29008c 3f26ef67 3e132198 -> 3ecea6e8 3ed08e5b 3d8f1aec", + "bf000000 3f4139ad bdff46ac bdff46ac 3d973f4c 3f986546 bdcbc98c -> 3f4aada2 bf5836f2 be4c5449", + "3e800000 bda4ca3d 3f475fe4 3f58ff5b 3f1bb077 bd199d7d 3f9d928a -> 3de4fbd1 3f49c65a 3f3b48f2", + "3f400000 3e3edaba 3f5e0748 3f060cb0 3e800000 3f000000 3e800000 -> 3dc12546 3efc0e90 3eac1960", + "40000000 3ddadce7 3ddadce7 3ecb9ecc 3da87408 3f390ccc 3f242ae2 -> bd6c1652 3f900360 3db73c90", + "00000000 3f773261 3f773261 bdf40731 3f77d060 be3c3f3c 3e9f17cd -> 3f773261 3f773261 bdf40731", + "3f000000 3f85e3b0 bdb844c3 bdb844c3 3f800000 00000000 3e800000 -> 3f0bc760 00000000 3e000000", + "3f800000 3f2f2459 3f2e6ef5 3f897609 3f04e56b 3f04e56b 3ea1b342 -> 3e28fbb8 3e262628 3f421271", + "3fc00000 3e029879 3ca3ee12 3ef6f924 3f83be9f 3f83be9f 3f72571d -> 3fa4f7d1 3fc07e7e 3ee9130f", + "bf000000 3f4dd74d 3d53d57d bdd204e4 3df4fa26 3f306ffb 3f9b5eff -> 3f5d26f0 be76f537 bf4fe038", + "3e800000 3eb666ab 3bea0a9e 3bea0a9e 3e474a55 3e474a55 3f928ca0 -> 3e9d7d60 3d55eaff 3e9460b4", + "3f400000 3e3af525 3e3af525 3f8e5d55 3e4fdd6b 3e4fdd6b 3e54cebe -> 3d79adf8 3d79adf8 3f74d3e6", + "40000000 be108779 be0f4081 3eb68e66 00000000 3f000000 3f800000 -> 3ed8cb36 3fb5b830 3f6e2a67", + "00000000 3ee6b705 3f285b15 3f285b15 3e800000 00000000 3f000000 -> 3ee6b705 3f285b15 3f285b15", + "3f000000 3f7829b7 3f2d0a67 3f7c76fc 3eabe841 3e5c80ac 3eabe841 -> 3f4d2fa6 3f117a52 3f517cec", + "3f800000 3f57ff1e be6386a9 bc8df7a8 3d947270 3f99880b be0bd488 -> 3f4570d0 3fb5f8e0 3df42b26", + "3fc00000 be5865a1 be5865a1 3db3969c 3f8ad296 bdf6fa90 3f8ad296 -> 40032aa4 3e778f57 3fb9c90d", + "bf000000 3f5b9d3d 3f35db74 be759d4f 3f3349bc 3f8e7d49 3e8bb30e -> 3f9aa10e 3f5d399f bf1dbb6b", + "3e800000 3f2df489 3e69c1fe 3ecc4df5 3f171281 3ee4e0e2 3f681774 -> 3f082fe9 3e675170 3eda32b5", + "3f400000 3f3ff388 3f4182cc 3f1278dc 3e4c3ec5 3f8fb4ed 3f8c8d81 -> 3f19a7c3 3eed9bfb 3f0997d4", + "40000000 3e044b8d 3f101f88 3d94a6ec 3ef13a73 3f45158d bdcdd026 -> 3f0e01c9 be18cdf8 3e8c11ce", + "00000000 3f949c83 3e29c028 3ecf609c 3ed40c0d 3ed40c0d 3f17e620 -> 3f949c83 3e29c028 3ecf609c", + "3f000000 3e0042df 3f18e367 3e0042df 3e6e8547 3f81f316 3f1a86ad -> 3dee8547 3f01f316 3e9a86ac", + "3f800000 bc9c7ea5 3e8b774b 3f1aa5bf be504609 3f001d4f 3f9a3811 -> 3e3cb634 3e6986a6 3f19ca63", + "3fc00000 3eea3429 3f7a29fe 3f0fb3f4 3e800000 00000000 00000000 -> 3da8d0a4 3f7a29fe 3f0fb3f4", + "bf000000 bda30283 bdddbd94 bda30283 3f8297b1 3f8297b1 3e7bda7b -> bf2b5851 bf3a0716 be9077e0", + "3e800000 3f402455 3eb22b55 3eace72d 3f75fb1b 3f83f723 3e94ec86 -> 3f1d90f1 3edd0cce 3e87ac0c", + "3f400000 3f079211 3f3afcc9 3f079211 be236c2b be236c2b be65543e -> 3f263659 3f59a111 3f3291dc", + "40000000 be294879 be294879 3df21731 3ebe3f75 3e300556 3d26a123 -> 3f9e9ae8 3f56f906 3d16ec1e", + "00000000 3f3f5597 3f589704 3f3f5597 3e0fd650 3f2661c3 3f556e9c -> 3f3f5597 3f589704 3f3f5597", + "3f000000 3f1e1659 3f6f2ee9 3f6f2ee9 3f943336 3f943336 3e2c81fb -> 3f143336 3f143336 3f599eaa", + "3f800000 3f5c5015 3f5c5015 3f9c9f20 3f400000 3f000000 3f800000 -> 3de280a8 3eb8a02a 3e64f900", + "3fc00000 3f2501d4 be52a3b3 bd89899c 3eda0c7a 3f16a20c 3f993549 -> 3bbc3c00 3fa5a276 3ff70122", + "bf000000 3f8705d7 3ef16748 3f8705d7 3f44f9c2 3f21b375 3f44f9c2 -> 3fb84448 3f208d8e 3fb84448", + "3e800000 3f06dbff 3f06dbff 3f311bb4 3f4ffa8d 3e8381e5 3f870e86 -> 3eeed946 3eecd785 3f1c151d", + "3f400000 3e7593fb be0e40c5 3f6ea56a 3f9ac037 be18c94e 3e9ead34 -> 3f496dd3 bcdd4e54 3f332476", + "40000000 3f54c9db 3f54c9db be362c97 3f02d0e6 3f9cb956 3f8ee681 -> be435fc4 bd378390 40310ede", + "00000000 3dc52a2f 3e877fc4 3f01aa4c be51529c 3f471a1f be51529c -> 3dc52a2f 3e877fc4 3f01aa4c", + "3f000000 3f843844 3eec7aae 3ec86ad0 3dcccccd 3dcccccd 3dcccccd -> 3f7ba3bb 3ed2e114 3eaed136", + "3f800000 3e01886e 3f406cca 3f406cca 3e1b4516 bd37fb38 bd37fb38 -> 3ccde540 3f4bec7e 3f4bec7e", + "3fc00000 3f01b8de 3f01b8de 3cc40238 3f096786 3f32ac27 3f42021b -> be5559cc 3d0907e8 3f8b6182", + "bf000000 3e9ba5ad 3ef780e6 3e626fb9 be418a47 3e874b4c 3e874b4c -> 3e568637 3f1d9346 3e9eca13", + "3e800000 3e418c01 3f2573de bd96dbf1 3eb79ee2 3eb79ee2 3f14ea4f -> 3e3c9572 3f0e8002 3dde66a5", + "3f400000 3f55aa83 3f560786 3f560786 3f756bc3 3f756bc3 3f3bb975 -> 3e9a7722 3e9a1a1e 3e9278dc", + "40000000 3f9ed911 3f98bc4c be7dca9d 3f000000 3e800000 3f000000 -> 3e76c888 3f317898 3fdf2bfa", + "00000000 3f7781ac 3f083081 3efef813 3f41d631 3f41d631 be60d2d9 -> 3f7781ac 3f083081 3efef813", + "3f000000 3e2124c1 3f690d76 3f68400c 3f74480a 3e950ba2 3ec75b89 -> 3ef4480a 3f43ca8e 3f36692a", + "3f800000 3ec42fc8 bd74e03e 3f27f651 3ef82cb6 3e2bc4fe 3e2bc4fe -> 3dcff3b8 3e68fd0e 3efa0a23", + "3fc00000 3f6e90ba 3f6e90ba 3f51191c 3f400000 3f400000 3f800000 -> be45bd18 be45bd18 be08c8e0", + "bf000000 be592f33 3f69e9cd 3ea0cc2f 3f9bc91a 3ebe3293 3edd66bf -> bf843059 3f8cbb39 3ed2e4fe", + "3e800000 3cb8cb51 3d119c3d 3e734c85 3f00b17c 3f00b17c be67e577 -> 3e0c3e31 3e12e503 3e96a2f1", + "3f400000 3f8423cf 3ee52b98 3f8423cf 3d9a42c7 3d9a42c7 3f8d5749 -> 3f79d15b 3ec83f12 3e9fbe3c", + "40000000 bcf2411c 3f95b316 3f8e8659 3f936b79 3d191055 3f936b79 -> 401918ff 3f8c2210 bf84bc19", + "00000000 3f7a395b 3f7a395b 3f432ac6 3f3648ef 3e0f3f6f 3e3e3a87 -> 3f7a395b 3f7a395b 3f432ac6", + "3f000000 3e4785d3 3e8d5b23 3e8d5b23 3f056af9 3f056af9 3f479f31 -> 3e856af9 3e856af9 3ec79f32", + "3f800000 3f5f76b4 3f16e740 3d54c0dc 3eaf6849 be2fc166 3f88c370 -> 3f07c290 3f42d79a 3f821d69", + "3fc00000 be476283 be476283 3eace470 3f584003 3f6ce7c6 3f584003 -> 3fd408a3 3fe38674 3f177b94", + "bf000000 3eb5a265 3eeae918 3f85a78b 3f1479c9 3e2fe6d7 3f8301ef -> 3ed6cb01 3f0b7167 3fc72882", + "3e800000 3eb7bd4e 3e1bf7c5 3f1cad68 3e4dceff 3ebfb704 3f9321ef -> 3e9e036e 3e2dd764 3f17e7ac", + "3f400000 3ec719cf 3f598453 be1d0f92 3f000000 3f400000 3e800000 -> 3e38e631 3e9308a6 3e8743e5", + "40000000 3e4afa97 3f1b2120 3e4afa97 3de14577 3f1d2094 3de14577 -> bcb25700 bf172238 bcb25700", + "00000000 3f59e479 3f3462b2 3ee70519 bdb8e1b9 3e95e531 3ec7f8ff -> 3f59e479 3f3462b2 3ee70519", + "3f000000 3f3b55d3 3ea03222 3e15c202 3e49d732 3e49d732 bdfd874e -> 3f221aec 3e5b78ab 3e5523d5", + "3f800000 3e3114ba 3efd7ce9 3f8f071a be30bc9e be30bc9e 3f854792 -> 3eb0e8ac 3f2aed9c 3d9bf880", + "3fc00000 3e7d7a62 3f0d7b05 3e82d37d 3e09335b 3c0a2be9 3e09335b -> 3d3eb568 3f0a3dfd 3d5f67c8", + "bf000000 3f0056ae 3ede527f 3ede527f 3ed7dac5 3f92365a 3ece79dd -> 3f364d5f 3e98384a 3f22c7b7", + "3e800000 3ec91900 3f46e4e7 3ec91900 3ea53df8 3f72cea6 3f6277a4 -> 3e9fc982 3f20261d 3ed5c852", + "3f400000 3e9c591d 3e5e5b74 3e9c591d 3f000000 3f800000 3f000000 -> 3e63a6e3 3f243492 3e63a6e3", + "40000000 3f0f5277 3f35de65 3f5616b9 3de335b0 3ee69fcf 3ee69fcf -> 3ead0a16 be4305a8 bd8448b0", + "beab3f41 3f46c2ab 3f4af3b2 3f6da9b7 be2836d7 3f091c28 3f2e8c6b -> 3f38b1e5 3f78cf8a 3f940597", + "3f9f383e 3f3e894a 3f15cb90 3f15cb90 3de37514 3f5c96d6 3df039d1 -> 3f1b2b5e 3e4e19f6 3ee0e2c8", + "3fa67b6a 3f13d48c 3e387b6e 3e387b6e 3f3920cc 3f5e1c65 3f5e1c65 -> 3c8226e0 3f5708dc 3f5708dc", + "be51883e 3e6a0a2a 3ef425f1 3f38f31a 3f0de52c 3f8e0a47 3f6705a2 -> 3e55adfa 3ee3ce6a 3f555dea", + "3f7c8921 3f45250f 3ec6cce8 3f45250f 3eac60ae 3d97e79e 3f88f945 -> 3ee03e9d 3ea15690 3e9cdcc6", + "be72d3e2 be46de37 3f2aeea8 3f2aeea8 3f2eee3f 3da6e700 3da6e700 -> bee58ec6 3f2fe12c 3f2fe12c", + "3f42da1f 3ef54e77 3f3c20b2 3b3b96ed 3f854389 3f1bb99a 3f854389 -> 3f0ace35 3e8b32b9 3f4a7b7b", + "3f6f8c05 3f6f5e40 3e17a023 3f6f5e40 3f1b0964 3d821477 3f1b0964 -> 3ebc975e 3db58805 3ebc975e", + "3f6ceb3c 3e5f8424 3f3c48ca 3e5f8424 be5abeab 3ebb16e7 3ebb16e7 -> 3ed4fa76 3ecb6c8d 3e1c17ca", + "3e859ce9 3ea1ba7a 3ea1ba7a 3f8583b5 3f57636c 3efb3df5 3f99ad95 -> 3ebdbc24 3e8ee20f 3f4fde44", + "3e29fafc 3ef2bf68 3ecb7d31 3ef2bf68 3f9a5792 3f9a5792 3dc2acc9 -> 3f0451ae 3eee69bf 3eeaab39", + "3f303c59 3f879f65 3f62ae36 3f856236 3ed0091f bd3b2f4e 3ed0091f -> 3f47a322 3f6abc00 3f4328c4", + "3edf5c6b 3f8237a5 bdffe821 be22ae16 3f170b40 3ed402ad 3f44a740 -> 3f428aa0 3e28aa9a 3ea135d5", + "bef8eb20 3f196b87 3ee169e0 3f196b87 3f800000 3f400000 00000000 -> 3f32230b 3f00f391 3f196b87", + "3f722215 3e3f13a1 bc901ba5 3f46c48a 3f8f37ee 3f9a2393 3f34766e -> 3f6453ca 3f93cc23 3de0a478", + "3f7b305b 3f1196e3 3f1196e3 3f8fd7c8 3f6711c1 3f5cd5dd 3f105590 -> 3ead381f 3e9922d0 3f121068", + "be400580 3e12efa7 3f911e69 3e12efa7 be1b9698 3f18f970 3f9bd517 -> 3deb8529 3f9f7635 bcfdd9d8", + "3f36afc7 3f38a2e9 3d71ee90 3ddb5af8 3f570209 3f43ce59 3f43ce59 -> 3e951998 3f054558 3f000432", + "3ede8bc8 3f23980e 3f9c73c8 3e7277a3 3e7fd325 3e7fd325 3f854762 -> 3f07cb75 3f8e8d7b 3ef79119", + "3f9a141c 3c77e7d4 3f030be2 bdc3e42a 3f960323 be10d015 3f5f4ff2 -> 3fb1d97f 3f2ea028 3f97a308", + "3fad6f9d 3f8aa4c4 3f4c3bec 3f8aa4c4 bd0f19c7 3f69baed 3f3aaf6f -> 3f90b3f1 be021f20 3dc2ad18", + "3d1fed41 3db577da 3e947abc 3db577da 3f82aea7 3f82aea7 3e8f9e92 -> 3df8efbd 3e9d4b67 3dbdba4c", + "3d151b3d 3dd35860 3f8e6522 3e965238 bd1af264 bdbdb1d2 3f883dab -> 3dd62a5d 3f8ed39f 3e9f3716", + "bce916e9 3e63214f 3e63214f be013336 3e8656e2 3f691e9b 3f57b8d4 -> 3e686918 3e5585f2 be211aba", + "be7addaf 3d22126c 3df6c566 3e059bd7 3ed959e3 3f221b04 3ed959e3 -> bd388066 3cc7e478 3db92792", + "3f81e7ef 3f889075 3f1881d5 3f15afd0 3f34cc9e 3f5ab6c7 3f65e176 -> 3eb34630 3e81d7f1 3e9e517c", + "bd53f439 3f1150a8 3f2ab9ba 3f1150a8 3f30d442 3f687afe 3f687afe -> 3f173431 3f305d46 3f1452f9", + "3e9e4393 3f9d43a1 3f3b01d4 bdb80cfd 3db199ad 3e4db831 3f804e39 -> 3f99d543 3f2b1c15 3e8d1332", + "3f7d5dc4 3f012e01 3f4fd014 3f355809 3dff7fca 3eda6538 3eda6538 -> 3ec3244a 3ec77a22 3e928a0c", + "bc97a09a 3f6feedb 3f04808f 3f5ad2f0 3f5dbe98 3f85829f 3f75993c -> 3f74098f 3f047701 3f5e60f0", + "3e0b3db6 3e83606f 3e83606f 3e8cecf3 3f704cca 3f95e517 3e07d490 -> 3ea0ffba 3eb12d70 3e83b0ce", + "3df807a0 3e99525d 3f6df69b be2d751f 3f9318f0 3eb0e5ee 3f9318f0 -> 3ebb718c 3f63405b 3c313140", + "3e8fbbe2 3ea404a9 3ea404a9 3b712467 3ebbcb14 3f8cedbb 3ebbcb14 -> 3e794ba0 3ee62e22 3dd62e87", + "bd9a6c75 3f48123b be5d46a6 be162cdf 3f154105 3f154105 3edff1d6 -> 3f535346 be95d4b1 be4e981d", + "3f062a29 3f7e2a11 ba028925 be32945b 3e29794a 3f30d409 3df4db51 -> 3f67f5b7 3eb95b5b 3d9186ae", + "3faf697d 3e360b86 3f17b449 3f0ce0fb 3ed7ab44 bd13d809 3f8c2637 -> 3e8919df 3f245dfd 3f0ae117", + "3ece7570 3e2f04b0 3e2f04b0 3f55c289 3f8211ab 3f9e3252 3f9e3252 -> 3ee2bb15 3f080cb8 3f28f300", + "3f79355e 3edf65e0 3d763b57 be6665e1 bc8303a6 bc8303a6 be688a28 -> 3ee75e7d 3d9b0023 bb80e0c0", + "3f83a63e 3f02a020 3e7d35e5 3eb7a139 3f800000 3e800000 00000000 -> 3efa7319 bb8b3520 3eb7a139", + "3f9f35f8 3f3cd8ca 3f3cd8ca bd1a2687 be0bc761 3e658c55 3f469119 -> 3f684ff0 3eeaef07 3f82a894", + "3fa51861 3e696fee 3f43b0b7 3d6eb951 3f7f7d1f bc6a8224 3f55a2f6 -> 3f6d5890 3f486a99 3f7bfb4b", + "3fac8da0 3ec04774 3f57e890 3ec04774 3f000000 00000000 00000000 -> 3d17c970 3f57e890 3ec04774", + "3ea23c88 3f8ff7fc 3e07ee5b 3e07ee5b 3f6d22b5 3f6d22b5 3f97df3f -> 3f54cbf4 3eaf2cb9 3ed9630e", + "3fae4b39 3f80e199 3f0232ca 3f8e7320 bd27f094 be4517f9 3f009c0a -> 3f880707 3f454ae4 3edb8d1c", + "3d3a198a 3ea44f79 3f30be4e 3f3de3a7 3ee025e9 3f80b24a 3f9a29f8 -> 3e9f9053 3f2c609d 3f3aa498", + "3f815372 3dabdec5 3f69de46 3e83be59 3f96381c 3f96381c 3f342f7b -> 3f8ccf95 3e81ac92 3ee5a18a", + "3f6bdc66 3f845b22 be38461f 3f845b22 be447d44 3f84f1f7 be447d44 -> 3f9afc26 3f8de590 3f9afc26", + "3e6770b5 3ea27230 3ecb883b 3f3ec81a 3f800000 3f800000 3f000000 -> 3eccbc44 3ee33fd1 3f21da03", + "beabe35d be365aad be365aad 3f7633fe bccbe6bc 3eca895f 3f96fec0 -> be941e58 bedc646c 3f9b108f", + "3f884f95 3f41afe9 3f41afe9 3e775b6b 3e9eecff 3dd2692e 3e9eecff -> 3eda2134 3f25ad96 3d6c0b3c", + "3f86826f 3f4e7e74 3f85d250 3f85d250 3f216746 3f9f57f0 3e6bbf0f -> 3e138778 3e201d60 3f4db590", + "3ef7b7a4 3f90e9fc 3e19c6a3 3f8d89b9 3e874d38 3f515f28 3eb8a5cb -> 3f808c6a 3ecd15d6 3f6e6857", + "be4a082c 3e497af2 3f8cb78a 3f0c5a14 3f31bea9 3f374611 3f31bea9 -> 3e0cb58d 3f9ecbee 3f20aa54", + "3f3fedc0 3ee84d96 3f6af321 3f58b68c 3f0d1128 3f89f2e5 3e99521f -> 3e3effe6 3eb30138 3f1f3d37", + "3eda8fa6 3f3dbb03 3efa73ef 3f5ef814 00000000 3f400000 3e800000 -> 3f3dbb03 3ec88c69 3f43a61f", + "3f93fce8 be035f30 be035f30 3f179d44 3f9c359e 3f3d6b74 3f3d6b74 -> 3fca270b 3f830ca8 3da044a8", + "3fb51f65 3f9e57bc 3f20db9e 3f20db9e 3f87e537 3f87e537 3f98f305 -> be87cee4 3eb46d08 3f0a79ec", + "3f4a4764 3f60879b 3f60879b 3e1c1434 3f0ab420 3f720739 3f0ab420 -> 3ee5dd97 3e73c644 3eade841", + "3f1b216e 3f7ab8c8 3f75ff6d 3f1167e5 3f24ce80 3f24ce80 3f68622d -> 3f16da3b 3f1220e0 3edbffcc", + "beefcd3f be5f6ce0 be017eb5 be017eb5 3f857a58 3ef14572 be3ee33b -> bf6935e6 beee668c be5ae64c", + "3f01b6c1 be1387c0 3f73edec 3f73edec 3ecd828d 3ecd828d 3e822d16 -> 3e523cb0 3f3fdd2d 3f52f319", + "be493906 3eb9e5ec 3f4904a9 3f8367fb 3f99fcef 3ef4c9af 3ef4c9af -> 3e89eb7f 3f6111c5 3f8f6e89", + "3f15213d bd9bf54b be2df0ed bd9bf54b 3ea25a3a bdbdf64d bdbdf64d -> 3e4a0690 bcd4ee80 bcb53118", + "3f8c5abe 3e1767bc 3eb377db 3eb377db 3f9513b3 3e8c94fa 3f9513b3 -> 3f8ce300 3d4a8a00 3f5be010", + "3f56f847 3f7447eb 3f919c88 3f919c88 3f000000 3f400000 3f400000 -> 3f08cbc8 3f01fedb 3f01fedb", + "becb5c7a 3f0b0dc3 3f39b882 3f39b882 3f7fc5b2 3f0baa72 3f7fc5b2 -> 3f13ecd3 3f7131d0 3f67a9d3", + "3ea6dd35 3f81532f 3f8cf3c1 3f8cf3c1 3eca3d4d 3eca3d4d bde55696 -> 3f61b1be 3f78f2e2 3f919fa3", + "3f9ef54d bd2f8702 3e85cf42 3f99e01d 3f0414fc 3ee87d98 3ea60927 -> 3f344df7 3e345e99 3f4ca77a", + "3f479313 3f07a31b 3dab9716 3f8a2211 3f93d30c 3f93d30c 3f98e68c -> 3f1aa3a4 3f5a7d99 3ea7d5c6", + "be4a92c5 3f975b18 bd418749 bd418749 bda7bd4d 3e801555 3f825132 -> 3f95482a bdec66d6 be88e1ec", + "3f829e87 3f9223ea bdfb221d bdfb221d 3eb4a27d 3eb4a27d bae1970f -> 3f481d76 3ef9af0d 3e00e834", + "3f568018 3f914fad 3e8899ec 3f7f9bbb be064466 3f2e60ba be064466 -> 3f9f5fb9 3ec7e81a 3f8ddde9", + "3fb7bdd6 bdfbf17e 3e22518f bdfbf17e bd931b47 bdc8f4ea bd931b47 -> 3e021a95 3e9946d4 3e021a95", + "3eb8d65c bd816e0d bc324e5e be343ce9 bc95bca1 be7f29b5 3ea924c8 -> bcc5f8c6 3da1f1d7 3d900bb6", + "be03dcb5 3ec71513 3f9eb4f6 3da325d1 3f8434f3 3e865f06 3f9d06c7 -> 3eb641b6 3fa3085e bd6cba22", + "bddd3c15 3dd40611 3ed9906e 3e4d8ee0 3e3c46b7 3e3c46b7 3f5fabd1 -> 3dd92782 3ee3bbc2 3e19521c", + "3e8d6562 3f8332fa 3f037d68 be267769 be56e9cd 3e85c0f7 be56e9cd -> 3f8a9e38 3ee20ab0 bdd63af0", + "be0bf1d3 3e0f05ac be3b29fb bc32f7b6 3e8ed0e2 3f0a985b 3e8ed0e2 -> 3e0f141a be9d0af6 bd551d46", + "3f6a4140 be3c7a86 3e7462cb 3f89fed5 3f9fc0c2 3f9fc0c2 3f872c79 -> 3fa5bd9b 3f71a63a 3de4dba8", + "be60138a 3f848c07 be2471c5 3f892c8e be55d194 be55d194 3eebd625 -> 3f7d6593 be533bb2 3f961364", + "bdd810d5 3f14282d 3f00e015 3f40669e 3e800000 3f000000 3f000000 -> 3f1ae8b4 3f0e6122 3f4de7ab", + "be0c3e85 3f970ec2 3f54dcfa 3f405107 3ede5fa9 3d87f76b 3d87f76b -> 3f9eabec 3f5730de 3f42a4eb", + "3fafe00c 3d9188ed 3d5dff24 3d9188ed 3f13c176 be2fd3c0 3f13c176 -> 3f2b3841 3e948b86 3f2b3841", + "3dc97fd0 be6230c6 3ebdd837 3f583a9c 3e04285c 3f9b8885 bd95c522 -> be28adc2 3ed5b2c0 3f5a1226", + "3f2a5047 3f337bfe 3f558ce5 3f558ce5 3f8c7cfd 3f6a2165 3f8c7cfd -> 3eff31b8 3eaa56de 3ee8abe5", + "be0fb0f4 3ec152f9 be5fe007 3f9fe1b3 3e8d3762 3f0a822b 3e2299c3 -> 3ed523dc beb63976 3fa2bbd5", + "3f2960b2 be5cf8c3 3f5aabe2 be60a2a7 3f6fbb8d 3b75a1c6 3f1be967 -> 3f307904 3f5a095d 3ef29ed6", + "3e8ed232 3ef8ba48 3f4676d6 3f939446 3edb73d5 3e35fa3f 3e35fa3f -> 3ebb8310 3f39c60f 3f8d3be2", + "bd56c5da be569016 bcacdfaa 3f846e9e 3f8c6201 3f84c509 3f8c6201 -> be93f9ca bd9f2382 3f8af592", + "3fb6e846 be01bdbc be01bdbc 3e25f446 3e8e4278 3e8e4278 3ecbac11 -> 3f21e781 3f21e781 3e88dfea", + "3ee67b63 3f90503e bd820f0b 3ee096f7 3f3c1fce 3f7b4e3e 3f7b4e3e -> 3f4bf0dc 3edf03b6 3ef8a481", + "3f6393ba 3f0ac2f4 3f80dc01 3f355b80 3f1e9305 3f7c001b 3e64819d -> 3e0413c4 3e06c9fc 3f0292ce", + "bea0a6b9 3e456e13 3e456e13 3f799f3a be01c513 bd1dbfc7 3eb398ec -> 3e1cb63b 3e390e40 3f8ae62e", + "3f4e2827 3f0cd30c 3ee4cef8 bdb0b3e4 bc16eb06 3f89161e 3f89161e -> 3f0eb92f 3f16efa6 3f6a473a", + "3f927f79 3d55d9a9 3d5dcaed 3d5dcaed 3f463181 3ec58139 3e829bde -> 3f519b4a 3ebe4f5d 3e637e47", + "3f3065ae 3ded8185 be70340d be70340d 3f168d20 3f00f49a 3e87b2fe -> 3eb90655 3edf1fee 3e8aea1e", + "3f0b891c 3e83ab15 3f8e2f16 bca64449 bdd72685 3f567a8e 3f567a8e -> 3ea0fc5e 3f2776c2 3eeabe93", + "3de4305c 3ec5459a be622ef3 3ec5459a 3f9d2429 3f09f0d8 3c4a5de2 -> 3edf58bc bde49b11 3ec49138", + "be9a215c 3eb0b29b 3eb0b29b 3f3f592d 3f9d3022 3e818205 3f9f6c08 -> 3e3b9c66 3ed7af27 3f5291fe", + "3e4fa2ef 3e9723c1 3ce57442 3ce57442 3f168e8a bcee5610 bcee5610 -> 3e96e73e 3d0ae40a 3d0ae40a", + "3fa17804 3f825c55 3e9bd0b5 3e9bd0b5 3e474a99 be171e6c bd8c8919 -> 3f45defe 3efb21b0 3ec822c2", + "3e3bab24 bc84a033 bd5c122f bc84a033 be07770a 3f9f62cb 3f9f62cb -> 3c03f9aa 3e46d56f 3e5f2f05", + "3d3b8427 3e6d21fc 3a93f415 3a93f415 be477400 be477400 bd156555 -> 3e764387 3c249735 3b37682e", + "3f953a80 3f0ba89c 3f61c03c be305460 3f3fc65b 3f3fc65b 3f8afbc6 -> 3e1663d2 3c0aec00 3fbf62c1", + "bc1f4212 3f77c20b 3f77c20b 3f98b4fa 3e6dfa38 be3bc7ab 3f3380f7 -> 3f785617 3f774d3a 3f999451", + "3f96a993 3f774df5 3f8f5b13 3f774df5 3f8e1acc be7b8068 3f358acd -> bab16000 3fb45c08 3e067b2c", + "be9370e9 bcf462eb bd8b4d9c bcf462eb 3f36fad5 3e8badcf bda0f43c -> be8174f4 be3e36b8 bd56e4b2", + "bde79386 bdfd993f 3ee11950 be602b62 3f16323e 3f7f2904 3f16323e -> be5f687f 3eda4cf0 beab6634", + "3f8c26a8 bd5fba47 3f7bb772 3e8decff 3ebde62c 3f790ce1 3eb45fa4 -> 3ef133a5 bda7ced0 3d64ff64", + "3f88a71a 3c666b21 3f7ec528 3f7ec528 3e056a08 3e3e7197 3f410e24 -> 3dfc2b64 3f4bf0d4 3e42a868", + "bd044cd6 3d2abacf 3f1541a3 3f1541a3 3f86a043 3f86a043 3ef5e4b5 -> 3c2a70ac 3f163396 3f193a41", + "3f1367a8 3f5ebf10 3f8c9fac 3f8c9fac 3ef61992 3e17a648 3e17a648 -> 3f17e4e6 3f81b570 3f81b570", + "be7c627b 3f6fd681 3e21ea3a 3eb34f28 3f896197 3e1b219b 3f896197 -> 3f912be1 3e48266a 3e8441b1", + "3f580b25 bdd53401 bdd53401 3f668666 3f2d6471 3f2d6471 3f01a5ca -> 3f24a916 3f24a916 3ef239bd", + "3f1b3abf 3f8cdf4c be6aa996 3efde75d 3f8b8580 be1bf53b be1bf53b -> 3ee115cc bd329734 3f169800", + "3f8abb8e 3e1844f9 3e1844f9 3f57cf4e 3da3c307 3f330a7a 3e12660a -> 3d7e1774 3f159a25 3f30242d", + "3f140f05 3f3b3386 3e50ec84 3f7a162c 3f400000 3f400000 3f400000 -> 3ea36a7f 3ecdb7cb 3f0b0ae8", + "3f4ca1da 3ee2e362 3e040ebe 3f68a716 3e98ec4d 3e84c203 3f393af7 -> 3e514ccc 3e052d57 3ea92dfa", + "3f21013e 3f431d20 bdc8eada bdc8eada 3f95cd41 3f8393ae 3f939fea -> 3f0a1e39 3f2bfad9 3f402a64", + "3fb23da1 3f97b749 3d0f2c82 3f838a9c 3ec1313f 3f8898bf 3f770b59 -> 3f28ebd1 3fb639a5 bea1db04", + "3fb75004 3e9e684a 3c91e129 bdf2e611 3e7dcebb 3f8cabf8 3ea430a1 -> bd3aae90 3fc535f8 3f2e2c84", + "3ea53bdd 3f024720 3d2b0ff3 3f79d452 00000000 3e800000 3f400000 -> 3f024720 3dc38f32 3f3bdddf", + "3f25140a 3f9065e6 be30f0b6 be30f0b6 3e590a9e bde5bc22 3f498ee5 -> 3f7dce96 bcb686b8 3f0ec932", + "3e9b6c0b be281d7b 3cca9eb5 3f89bc0f be318c34 3f46a921 3f21ec51 -> bde47024 3e7b2be0 3f6250e8", + "3f3945f0 3d46f790 3d46f790 3f6ba2c7 3f5a3e9a 3e2258fd 3f5701d2 -> 3f18626d 3dbe79d8 3ea00f72", + "3ebdd4ae bd802040 be5a8baf 3f33f687 3e91b453 3e91b453 3ee7f63c -> 3db6f85c 3d4e38bc 3f08f627", + "3f59711c 3c1ae2eb 3e985175 3f404996 3e002247 3f95c5c3 3f95c5c3 -> 3dcc2402 3f493600 3ef02111", + "3f37488a 3ee65d80 3ca859e2 3f999cdc 3f800000 00000000 00000000 -> 3f05892d 3ca859e2 3f999cdc", + "3ed33744 3f11b53e 3f8cc7d9 3f4946ea 3f9db3b7 3f81b22f 3f9db3b7 -> 3f1b9a93 3f2e8dd6 3f25532f", + "3ebb3e58 3e291133 3f824f6a 3f8c8b79 00000000 3f800000 3f800000 -> 3e291133 3f26ffa8 3f3b77c6", + "3f020fef 3f2b38b0 3f13a6d6 3eaba801 3e8b9cf4 3f944ebb 3e8b9cf4 -> 3f07c17e 3f14516f 3e497339", + "3dcd0959 be37bb66 3f8daf4b 3f8eb7cb 3f3aefd7 3f867513 be3f64c0 -> bd902a06 3f803936 3f911cf6", + "3f8df8ab 3f85de8b bc686b59 bc686b59 3e71f349 3f94bc41 3f1ba8e1 -> 3f48a614 3fa72ea4 3f31130f", + "3ebeaf1c 3de1bcdd 3f9f7b12 3f9f7b12 3e13d81c be32ece4 3e82f84f -> 3da7b7ce 3fa7cf75 3f934956", + "3e534de6 bd5a5120 3e3f6f06 3e941117 3ea6a990 3f9070b5 3ea9f847 -> 3d12e976 3eaf6fab 3e7410b7", + "be75ad61 3f6eec21 3f9afbc5 3f6eec21 3f5884dc 3f5884dc 3f1a4a67 -> 3f916f4a 3fb4f4fe 3f89f847", + "3f90008e 3f72e67e 3f9ba725 3f90b564 3f8b4b12 3f8b4b12 3f22bc6c -> 3d1c7e50 bc06f500 3ed4ac34", + "3f7de5b9 3df19dd1 3f964b6a 3f127ef0 3efb8efb 3f734010 3f356cc7 -> 3ebe149b 3e6d58f0 3e0f61b4", + "3fb8c025 3f73a2fd 3f674453 3f5e0c54 3f8b719e 3f96c67d 3f2a989a -> be648f14 bb8b8e00 bdc17900", + "3f8bc396 3f07ffa4 3e573b6c 3f8ed514 3ec760ad 3f88d3cd 3f88d3cd -> 3dd92e94 3f6b1b4e bd524000", + "3f86183b 3f848777 3f5fb687 3f90dde8 be6e7359 3f8777b0 3f8777b0 -> 3fa3c134 3e1b4630 3cbcbdc0", + "3fa34ca5 be4e4037 3f5ed7cc 3f5ed7cc be74c5b5 3f4171e5 3f98a387 -> 3dd40c3e bdbf9898 3e2eda64", + "3f6c9849 bd20bd70 3e4dc6b6 bd0e3b58 3e2bf41d 3f8c3bb1 3f8c3bb1 -> 3e410319 3f578fc6 3f855fcd", + "3d79bdd3 3f338bbe 3e585598 3f338bbe 3f906183 3f238273 bbbb129d -> 3f2f41f9 3e65d4eb 3f33a28e", + "3d2922f4 3e6ca642 3f8a5796 3f8a5796 3e82936e 3da94dad 3e12380f -> 3e63e3a5 3f89e7bb 3f899660", + "3ed55402 3e8fc4ca be16e26b be16e26b 3f7c1023 3f918109 3f336015 -> 3eea0304 3ee5ecf4 3e88e68c", + "be225635 3f2517a6 3f2517a6 3f95e45e 3e800000 3e800000 3f400000 -> 3f2f3d09 3f2f3d09 3fa51c73", + "3eb49739 3f4c9b64 3ecc763f 3f4c9b64 be10cc07 3f6a3294 3f6a3294 -> 3f596004 3ee1703b 3f0ee038", + "3e0c5460 3f3e70a7 3f2d1c36 3e9b0e5d 3e800000 3f800000 3f800000 -> 3f35ab61 3f20bf10 3eb6b912", + "3f89cdb1 3f6d79cd 3f34b337 3f9afc3a 3f504c7f 3f7a7685 3f62da6e -> 3d539330 3e7510a8 3e837c3e", + "3e396bb7 3dbd7cc3 3f18d5f3 3f18d5f3 3f4f6075 3f8a9e89 3f4f6075 -> 3e52a2a0 3f13aff0 3f07097b", + "3efc637b 3f5c08db 3f2485fb 3f0e6965 3f2c516f 3e005770 3f71d385 -> 3f07174b 3f14b4fd 3ef26ecd", + "3dc7ea55 be5833a4 be5833a4 3e1a5d21 3f9e515b 3e3bb5ea bcef547a -> bd496fe0 be1bab5a 3e1d48b8", + "3e545063 3f0b3ee8 3f0b3ee8 3e5683b7 3f55cf0d 3f55cf0d 3f732a25 -> 3efbab4c 3efbab4c 3ea39d60", + "3fa039b9 3e2d2e71 3e2d2e71 3f114b9b be4ad18b 3c90c140 be4ad18b -> 3ed587ea 3e168816 3f50c3f4", + "3f94ad00 be677405 3f988f9e 3f988f9e 3f53c697 3daab104 be0b5557 -> 3fa1452a 3f8c2b68 3facca7e", + "3fb17360 3da4b91c 3dfea360 3dfea360 3ede77c9 3f6a57ae 3f6a57ae -> 3eeb6a38 3f863a04 3f863a04", + "3f0315d4 3f1a3f8d 3f8368b0 3f8e5691 3f0f4dec 3f154847 3f154847 -> 3ea1bcea 3f3a60a9 3f503c6b", + "3ed5f1ea 3f98ba9b 3f98ba9b 3f892c7c 3e688571 3f969c59 3e31586d -> 3f8c956f 3f3396cd 3f7fd233", + "3ec657cc 3f58c0ed 3ebf63d0 3f48eb69 3f2aaaab 3f2aaaab 3f2aaaab -> 3f16a3a9 3eaf5582 3f06ce25", + "beec1a8f 3f80b7cf 3f67c030 3f4d498b 3e3693f9 3f2cbf9b 3f8ad66f -> 3f8b3e05 3f9bb4bc 3f854947", + "beca69a2 3f48759f 3f48759f bce4e456 3f4bccbb be7986fe be6d6f77 -> 3f8b31aa 3f2fcc30 bdf4f502", + "be2c22e1 3e84e302 3da70a90 3e84e302 be60a175 3ee0b163 be60a175 -> 3e64033f 3d103b64 3e64033f", + "3fbdfaaa 3d83829f bc8fbe48 3d83829f 3e8be811 3e955928 3e8be811 -> 3e8eef17 3eef5946 3e8eef17", + "3eff1215 be789347 be789347 be1b9c9c 3f000000 3f800000 00000000 -> 3e7e2b11 3efe9e92 ba109f00", + "3f87a1c1 3ef3d6ff 3d5a4a94 3f9bfbba bd76c556 bb12a4a4 bb12a4a4 -> 3f0a433f 3d6400c3 3f9c496b", + "3ee96529 3f36f0e1 3f9cec42 3f36f0e1 3e0fb97c 3e0fb97c 3e0daf97 -> 3f268fcd 3f94bbb8 3f26cb47", + "3f6b64d5 3f93c4da 3f9882d0 3eaff43b 3f159cb0 3f842b7b 3f31ce36 -> 3f1df7f1 3e77d6b8 3eb35be3", + "3f141ecb 3f9f7ef2 be2873db be2873db 3f95c511 3f43945c 3e20e69e -> 3f11ae01 3eef8fe8 3def269e", + "3f60a90c 3dc2ceb0 be0ea36a 3dc2ceb0 3d8dd90c bdb4a097 3d8dd90c -> 3d0ca635 3ce3a858 3d0ca635", + "bd8b7d0c 3e0f05e8 3e2bf6e3 3f9c7337 3f36d089 be47a49d 3f2c3bdc -> 3de16652 3e1e5de6 3fa250c1", + "3f6002d7 3f99cf48 3f99cf48 3f44e4ec bdc2b10c bc14dabc 3e0f8346 -> 3fa47519 3f9ad3ca 3f257fce", + "3f03dba8 3e0579ff 3e0579ff be6dc4df 3ed6100a 3f35f797 bd5890b5 -> 3e587dd8 3eb970b4 bca5c2a0", + "3ee5c89b bd57ac8d 3e3b1b6d bd57ac8d 3f1b5db9 3f1b5db9 3e001f07 -> 3e88b1d0 3e950939 3d4fea1b", + "3d9f37c4 3f20ee6d 3f6f2a15 3ec0bc39 3f800000 3f400000 3e800000 -> 3f1bcf9c 3f603cdb 3eb6c8bd", + "3d8ed7fd 3f91105e 3f32d2e7 3f301bab 3efe6429 3efe6429 3f5c7d94 -> 3f8ca0cc 3f29f3c4 3f26eba5", + "3e077c51 3efe6792 3efe6792 3f0dda22 3f666666 3f666666 3f666666 -> 3ef80d6f 3ef80d6f 3f06cca5", + "bc92d7e1 3eeaaf7a 3ecac795 3f13d7e1 3f08d561 3f9ca295 3f9ca295 -> 3eee3188 3ec6d188 3f138731", + "bea0fc18 3ecee2ea 3f32c2e5 3ecee2ea 3f836950 3e4a0922 3d392940 -> 3eabb603 3f42a47a 3ed629ec", + "3f608ea7 3f60a268 3f596de7 3f60a268 be6d9f08 be6d9f08 3eef883b -> 3f8a5f26 3f86c4e5 3eef2823", + "bd6346ca 3f091b4d 3f091b4d 3e89c18a 3f000000 3f000000 3f000000 -> 3f103583 3f103583 3e8ad6b4", + "bcf615e1 3e9d21a0 3f41d189 3f1c34dd 3e381a44 bbb981cb bdac147d -> 3e9fe584 3f41c664 3f1b8f73", + "beb04958 3e94f811 3e55a27b 3f7d9247 3f5de6e5 3d945ce0 3f5de6e5 -> 3e457df5 3e6f2d12 3fa4fcb8", + "3ed9e77b 3f9909ff 3f9909ff 3f6aca90 be04567d be0579d1 3e59bbda -> 3fa0144f 3fa023ce 3f539fed", + "3fa68754 bddf2c10 3f8e2783 3e9b77e8 3f23fd19 3ea21f59 3d0acd26 -> 3f810530 3f32d8ff 3e84e54e", + "3f6ba1ce 3f472828 3f472828 3ce75c7c bd0dd655 bdbf8ffb bd24c30a -> 3f4f50fe 3f5d3270 3d85aab6", + "3e4de97a 3f762349 3e5da2bd 3e8b6783 3f6fd65b 3f80894d 3ef2d111 -> 3f45e8f0 3ea9a32e 3e842ab7", + "bd14bf21 3f49ac88 3f20a5a7 3f2b1acc bdfd2a25 3e802481 bdfd2a25 -> 3f488655 3f22f94d 3f29f499", + "3f337e95 3e7ae865 3e4ea853 3e4ea853 3f08b869 3f205d02 3f205d02 -> 3e8d40bb 3eb74eef 3eb74eef", + "be0dc092 3e4ad2cb 3eaee58b 3f8b74e2 3e6d5283 3ebd3540 3f7af0b0 -> 3e621fe3 3ec52060 3f9cd34d", + "3e05c0bd 3e129c04 be7329c4 3e5785b5 3e5a3f18 3e92627e 3f918556 -> 3e08d112 be0d6630 3e9ba401", + "3ed086f9 3e221aa8 bdab0526 bdab0526 00000000 3f800000 3f400000 -> 3e221aa8 3ec89944 3e947788", + "beaebfdc 3e7c4746 3e7c4746 3f8ccb47 bd689883 be2943a7 be2943a7 -> 3e686e87 3e4281db 3f85929a", + "3fb97e69 3f7e5e5f 3f6c99f3 3f97ec66 3f1170ed 3ea26405 3cdd5905 -> 3e2e6618 3eeddef6 3f92e951", + "be921080 3b9da30d 3f3d9ef2 3f8a4ee5 3e313b66 be07aa4e 3f7e2262 -> bd2b4c13 3f33f1f6 3fae8ee4", + "3f9f368d 3e4d79e7 bc53635b 3f8a3568 3e9d5fa1 3dacb961 3f5e6537 -> 3dab9f42 3dfe2757 ba56c800", + "3f9bb9e0 3f17965f 3f837da3 3f17965f 3f3bfde2 3e27868f 3eb4f9c2 -> 3d3745d0 3f540738 3e25fefe", + "be80d49d be600d42 3f9ed74a 3f9ed74a be381d65 3f62cc53 3f805d46 -> be913d15 3fbb5fec 3fbf23ea", + "be44e55d 3f9073b1 bd3aaba7 3e9fcb8e 3f509e87 3f509e87 3ec21899 -> 3fa4823a be611188 3eb7ece1", + "3eb79fc2 3f1b848f 3ea5c9d1 3f9aa172 3f93f9da 3f18f9af 3f8f839c -> 3f161bb3 3e9c990a 3f4e5240", + "3f8e347a 3f4ee44f 3f4ee44f be361ed5 3643b1ee 3f840d09 3643b1ee -> 3f4ee419 3e226538 3e5e8bc1", + "3f8e2e6f 3f81faab 3e92f61c 3e41e673 3f000000 3e800000 00000000 -> 3eeb8dce 3c18f5a0 3e41e673", + "bedacfee 3eda53ea 3f1df853 3f44ff4d bd3aa594 3d917bd2 bd3aa594 -> 3ed05b61 3f25bded 3f400308", + "3f75e8d7 3e9bc34d 3f71d51c 3f4208e2 3f81afeb 3f1f0858 3f8c6c61 -> 3f3168b3 3eb222f6 3eb6139b", + "3df9cae6 3e2371d4 be14f12f be14f12f bd8bb047 bd8bb047 3f9442e2 -> 3e2bf6a7 bdf241b2 3d003a28", + "bda516ce 3f96aba2 3f96aba2 3e22aa0f 3f67086f 3ec53818 3f67086f -> 3f9ffb72 3f9aa518 3de4ca26", + "3e1c454b 3f108178 3f38c887 3f0f5b19 3f3bd145 3f2ff3ad 3f2ff3ad -> 3f01100e 3f1dee80 3efce7f0", + "3f31ef43 3f63610e 3ef6ad3a 3f63610e 3f800000 3e800000 3f800000 -> 3eb2762a 3e9db598 3eb2762a", + "3f20be7b 3f9aa1f5 3f61b55b 3f61b55b 3f847e81 3f5ab903 3f5ab903 -> 3f0ee09e 3eb0bdf6 3eb0bdf6", + "be801b89 3f15db55 3f15db55 3f9cb3b0 3f6483a2 3e70ecfa 3e70ecfa -> 3f27abeb 3f24ed62 3fa43cb6", + "3fa2c693 3e8206dc 3f48f26b 3f8809a0 3ebf6a46 3e7a2e06 3f4301c6 -> 3daaf610 3ef2d1a8 3dc0b3d8", + "3f1452e0 bce3c40c 3f3b03e5 3f63401e 3f9d8278 3ea318a0 bd857100 -> 3f37a627 3f0bc460 3f6cea2f", + "3d325c4a 3f9db5d9 3f8b92ac 3f8e15f2 3f52b892 3f9215ba 3eaf8091 -> 3f991f57 3f85c75f 3f8c2cd7", + "3fb26906 3ed72cd1 bc569ace 3ed72cd1 bdf6e307 3f693365 be300468 -> 3f169a31 3fa584af 3f28ec0b", + "3dae7dc5 3f3866a1 3e129549 3f6af835 3f3550eb 3f52f8d8 3f6c8fa2 -> 3f28f3de 3e41814f 3f5715e7", + "becfee61 3f80aca5 be60f128 3d1d7f3e 3f88dd75 3eb84a79 3eb84a79 -> 3fb19ace bf0b555c bd9ca9c0", + "3faf68c7 3e2f57cf 3f9ccc9f bc770b14 3f000add 3f3ef779 3ebbbd8c -> 3ec651a6 3e4f9a50 3f075b99", + "3e855308 3ebca0d8 3ebca0d8 3f61aa00 3f0978ed be2f4246 3e77ca28 -> 3ea1fc83 3ed3726a 3f518873", + "3f660d60 3f2e1999 3e9e253c 3f2e1999 3f000000 3f800000 3f400000 -> 3e6c4ba4 3f270247 3e06edc4", + "3f483cd8 3f94ee5e 3f3014c8 3f94ee5e 3f2c2d9e 3f90c277 3ea63a02 -> 3f23302d 3efe2a8c 3f68da52", + "3f2edaa2 bd8e2784 bd8e2784 3f847bd7 3e0d872f 3e23e68d 3e0d872f -> 3df55e86 3e09f72f 3f70ccfe", + "bda9fc44 3f962e9e be7b1e08 3f447e6a 3e5957e0 3e5957e0 3f5e75c1 -> 3f986fe3 be9b6be0 3f52a5d1", + "3f5e59ef 3f6ed8b0 3f0be8ff 3edefc77 3f629063 3f629063 3e1b33d3 -> 3e283f88 3ebb4eca 3e9b95bc", + "3f02b18b 3e16a623 3e16a623 bdd2ac49 3dc23939 3dc23939 3f24b8d2 -> 3dca2484 3dca2484 3ea94bea", + "3f8574d1 be62713b 3f909f01 3f909f01 3f85d624 3f85d624 3e8179da -> 3faa4292 3d228b60 3f5dbe9f", + "3ee44c9d 3f1092c4 be3326a6 be3326a6 3f770382 3efa6108 3efa6108 -> 3efb929f 3e4be6be 3e4be6be", + "3f4d2749 be5c8e0f 3e5d6e22 3f7c64cd 3f72d8c0 3e8bad71 3ed92a2e -> 3f63d920 3db4ccde 3f2560c0", + "3f3a792a 3f82cb49 3eb36413 3ec68c07 3e37be06 be791ded 3e37be06 -> 3f6420d0 3f070f73 3e83a084", + "be8464e4 3f930388 3f38416d 3f930388 3f7b552e 3f952db0 3f9bc2de -> 3fb38246 3f4a656d 3fb6c45c", + "3f86e82c 3da89de3 3f6a1357 3f6a1357 3f400000 3e800000 3f400000 -> 3f330236 3f269f41 3dfdb8a8", + "3f90573b 3f890d71 3c3eb3c7 3f11b433 3f2dae07 3f2dae07 3f285820 -> 3e9c817c 3f401c92 3cddc0c0", + "be90ccba 3f9efa80 3d639cae 3f2fa6a0 be2e1015 3f8fe9c7 be2e1015 -> 3f98d33c be6c83a8 3f235818", + "3ee199dd 3f69a872 3f3004fd bce1e899 3e800000 3f400000 3f800000 -> 3f4d7536 3ed30105 3edfeca5", + "3fb9fecb 3f8fac4d be7ee9b7 3ef8afe4 3f1f7051 3f389ef6 3f39ccd3 -> 3e5eab94 3fc2dfb7 3e03da54", + "3ed29aeb 3e4139f8 3e4139f8 bdfd68ce 3ef3fb89 3f610453 be6751bf -> 3e6afb78 3eca3f76 bcfc6f10", + "3f8554cd 3f14e69e 3f9ac52f 3f14e69e be64fef2 3f4a6ecb 3f98927a -> 3f5088c5 3ec55a44 3f1c8ca0", + "3c93c10b 3cf1c6ad 3edf26fb 3cf1c6ad 3ea19826 3bb2ef73 3bb2ef73 -> 3d0bd809 3edf1a12 3cf0f820", + "3f606547 3e233cba 3f7af02c 3f2604d6 3f251a66 bbdfe7ea be052612 -> 3ee3f97b 3f7c78b3 3f433255", + "3f9f4d55 3e990b94 3f5e4499 3e16fc95 3eb4417e 3f5aaf31 3eb4417e -> bbe3f6c0 be479494 3e5fd726", + "3e85a72a 3ccbcbad 3f320249 be14308a 3e63e957 3eda3623 3e63e957 -> 3d8f567f 3f158722 bc354090", + "3e5ebfc7 3f95168e 3f872bb3 bdd1c0dc 00000000 3e800000 3e800000 -> 3f95168e 3f8035b5 bb63f900", + "be3b2597 3f11896a 3d419d54 3f1f81c8 3e200abd be0189f5 3e200abd -> 3f18d95f 3cc5d511 3f26d1bd", + "3f3ba22b 3f071841 3d559b30 3f1230a1 3c95b0b2 bde6b4b2 3df5b171 -> 3f03aa8a 3e09f2de 3ef75c32", + "3d3b5db1 3d205cff be6d7ce8 3efb201b 3e60e9a0 3ef3fc2d 3f02c4ff -> 3d3ad869 be417073 3ef01d48", + "3f6b8afb be023dc9 3f984348 be4b1af4 3f21edf2 3f75c6d0 3f75c6d0 -> 3f30589a 3e9cc742 3f866618", + "3f47701e 3f3a8c71 3e9409c2 3e9409c2 3f8258fe 3ed7c8f3 3ed7c8f3 -> 3ec5f674 3e2af942 3e2af942", + "3f38edb8 3f9b3747 3f5d47e4 3f5d47e4 3f400000 3f800000 3f800000 -> 3f2bbc44 3ead069e 3ead069e", + "3e92a316 3f957411 3f0ac0f4 3dcca794 3f624700 3f8ef1a8 3f624700 -> 3f6a19d0 3f0d2766 3e97780e", + "3e8ce8d0 3f0caaec 3f8082a3 3f0caaec 3f96911f 3f9db51d 3f8a0d79 -> 3f121dd1 3f4a5b1e 3f0b3a70", + "3e8a2537 3eb80ae4 3f8d7b70 3eb80ae4 3f73d056 3b1e4c0d 3eb36f7d -> 3ed84c04 3f8d6615 3e87a0cc", + "3e0d5a42 3f911f75 3f911f75 3f497401 bb99f71b 3f8b1ee9 3f8b8c92 -> 3f9134b6 3f7bd660 3f385cdb", + "be76ad80 3f57f015 3e9b66d8 3f57f015 3e3f34d1 3f8676b0 be579afe -> 3f6373fa 3e496978 3f4af404", + "3f3f18f8 3e92de62 bd5a12af 3e92de62 be793d70 be793d70 be1be104 -> 3eefe4f5 3e03887a 3ecd0c6d", + "3fa188f9 3f0918a3 3e7a5bc2 3ef132b2 3f800000 00000000 3f400000 -> 3ee44662 3e7a5bc2 3e6a0bbe", + "bef6bc10 3ed2e35d 3f10761e 3f47bfb4 bde3f2d2 bcdc0729 bde3f2d2 -> 3eb76d04 3f0d25dc 3f3a0488", + "3fb93505 3b302fd3 bd84bea7 bdb41928 3f000000 3f400000 00000000 -> 3f37e758 3f9a9e2b 3e2a8a62", + "3fa4a39d 3f380326 3eee2981 3f5cf98b 3f896402 3dc4b5bf be384402 -> 3e802854 3eaee86d 3f8c1d1b", + "bd33f534 be3cc9f4 3f248ada 3f248ada 3ee3eab5 3f8d72a8 3ee3eab5 -> be6167a2 3f26925b 3f298c95", + "bdec7ef1 3e9486a4 3c821d9d 3e976989 3eb088cb 3eb088cb 3e997c18 -> 3ea27161 bca600b7 3ea8a850", + "3f9ec2cf 3f44581c 3f989a49 3f0fd068 3f0479d6 3dbd99f8 3f22fc4c -> 3e002064 3f89e7a0 bd2c85e0", + "3f94a3af 3f922f52 b9dfa41e b9dfa41e be001603 be77ea2b 3f2cfd80 -> 3fa4c6f9 3e8fb9fb 3f49074c", + "3f17d306 3f0e6979 3f4bfca4 3ed2489d 3ec6f21e 3f3a18ae 3f3a18ae -> 3ea6d624 3ebb3d5d 3eb59831", + "3f0bc41d 3f4ada28 3f4ada28 be04388d 3f5cf7b5 3e851747 3d998cb5 -> 3ecbfc75 3f26855c 3d5847d0", + "3e0619d4 bdd85868 bcd4fa93 bcd4fa93 3f774333 3f41d8a0 3eaa8e75 -> 3d46bbc4 3da3c955 3cc82cd9", + "3bcde2b8 3d21692c 3ead766e bdae1c97 3f70013f 3e7221c9 3e1eaead -> 3d37829d 3eacb3b3 bda9ee01", + "3fbf0c78 3f90a689 3ee56a50 3e9869c8 3e800000 3e800000 3f800000 -> 3f41c6d6 3d997760 3f66d123", + "3f98ba0a 3eea79c1 3e84a1f4 3e9cedef bda26c86 3f1ca76d 3f1ca76d -> 3f0d767e 3ebdf4c7 3e9c45ad", + "bcc329e4 3f6d667c 3f9107a0 3f6d667c 3f1cf7dd 3f99254d 3e999d8c -> 3f7123d0 3f944aa5 3f6f3aed", + "beb06815 3f6462cc 3f9a0a63 3f6462cc 00000000 00000000 3e800000 -> 3f6462cc 3f9a0a63 3f7a6fcf", + "be2a5c01 3e92b9dc 3f81e164 3f81e164 3eb8818d 3f293e16 bd219fc2 -> 3ea4d9da 3f8ff566 3f810a48", + "3f027a81 3f7444c6 3f58644e 3eeed7d0 3f400000 00000000 3e800000 -> 3f1268e5 3f58644e 3ead9a90", + "3e9f16e5 3f81c131 3f81c131 3f3e8ad1 3e053702 bdb16f78 3e053702 -> 3f792940 3f853352 3f3431ae", + "3fa48673 3f71f54b 3f71f54b bdf1ce67 3eea5345 3eea5345 be064be0 -> 3eb6b9c4 3eb6b9c4 3d4edc4e", + "3e4770e2 3e0c551e 3e3611a9 bdc768a1 3e96b0e4 3f835cf2 3f4a9551 -> 3e105e12 3e9dea00 3dc1eb4d", + "3f01ad6d 3e69a39e 3db36d2e 3f20be6f 3f9662ca 3f9662ca 3f98ca6a -> 3f17975c 3f181013 3f18afbb", + "3fb9ac56 bdb674b7 bdb674b7 3f4e79bc 3f33b2f5 3f613959 3ebf1b49 -> 3f98034c 3fb9080f 3e87bcbc", + "3f914054 3f8e986e be3b8b73 3f3f6a0f 3f3bd66d 3f73f56d bb7bbb1b -> 3e90131c 3fa82e70 3f4087b7", + "be49ff9f 3f1af97f 3eb4e529 3eb43bc8 00000000 00000000 3f000000 -> 3f1af97f 3eb4e529 3ec8d754", + "3ec13cef 3f86b309 3f86b309 3eb8a891 bcfcccbc 3f9761f8 3f9761f8 -> 3f8830ae 3f3450e4 3f08e7a8", + "3f3f0ecd 3e8796a3 3f94602e 3f2d6097 bde9762c 3f0cfc9b 3f3ab8b2 -> 3eb325ce 3f3f87be 3e57c408", + "3ded5b3a be16e7f1 bda0b767 3f37ee91 3aa2ea64 3eee4f9d 3aa2ea64 -> bde78f1b bbcfc530 3f37e520", + "3df83b4c 3f06cd81 3e7536d9 3bc09b5e 3f0e7618 3f8988c7 3f8988c7 -> 3eeec8b4 3e9f90dd 3e09ebb2", + "3fb96f44 3ebc45d9 3e1cc5df be4327f5 bcef58f9 3d50b35f 3d50b35f -> 3ed1f1c4 3da25f68 3edef080", + "be551736 bda4370f bda4370f be736f16 3ee36dbc 3ee36dbc be7f01eb -> be52ef2a be52ef2a be944002", + "3f49067a 3b14e53d 3f9f5257 be5d3cc6 3f8ce194 bda62b3c 3f70c134 -> 3f5cec68 3fa77a1a 3f5c9bc0", + "3fbbaaaf 3f88e2df 3f88e2df 3f1e3e1d 00000000 3f000000 00000000 -> 3f88e2df 3eac361e 3f1e3e1d", + "3eb0fbd8 3eb20a96 3d7ba62c 3d7ba62c 3f562d8f 3f87d24a 3f674800 -> 3ecb062e 3ec581ec 3ea99a92", + "3fa1db4a 3ecbba83 3ecbba83 3f7a1ad7 3f8ac7fd 3eb55234 be047c51 -> 3f433a3e bd4c6c30 3f91fe57", + "3f9b25c8 3cfefe8f 3f9d1989 3e673b1f 3f76eeb1 3f76eeb1 3f8d7dff -> 3f8ffa55 3d6e5240 3f825644", + "3f18c112 be5405d3 3f8b1f6c be215edc 3f800000 3e800000 3f000000 -> 3f23014a 3f700e94 3ea85baa", + "3f8bc48c 3e610066 3e610066 3e3f3b1b 3f400000 3f000000 3e800000 -> 3f0f0ef4 3e92595e 3d549234", + "3f253d45 3de20751 3f852720 3f852720 3e800000 3f800000 3f400000 -> 3e045c1e 3eca21f6 3f0e604c", + "3f8d1d86 3e28e09a 3f39aa83 3f39aa83 bdaa0705 bdaa0705 3e8a3649 -> 3e834d0a 3f5118e2 3edaf559", + "3ea83915 3f767e60 3d9d1011 3d9d1011 3f8fcda2 3f3a2c51 3f8fcda2 -> 3f33037e 3e87cd39 3eca74a6", + "be42e1b4 be5b8c5b be5b8c5b 3f73b3aa bd5ae80f 3ea4b01c 3e44bdc9 -> be925982 beb6e653 3f7d0ffe", + "3f942eca 3f8f4faa be4dee00 3e95f485 3f967226 3f9853e8 3e2e92ce -> bde565a0 3fd23490 3dc39ef8", + "3f1fbf39 3f679fc0 3e974e60 bccb5fa0 bdeb9b65 bceb138d 3f64a62c -> 3f7a0070 3ea0796c 3f104188", + "3f8223cf bc9e93b7 bd8d468e bd8d468e 3e90c507 3e90c507 be512402 -> 3e9d6eac 3eb7b08e 3e0dffcd", + "3f4646f4 3f9aadad 3f44d7e1 3f44d7e1 3f9d87da 3ee9a44b 3e59ee07 -> 3e94580e 3ed4b9ee 3f1aa541", + "3f3721b7 3f2ea91b 3f875baf 3f2ea91b 3e7579f7 bc95e54a bc95e54a -> 3f02c27a 3f890899 3f3202f0", + "3e59bf94 bcc37f55 bd96e09a bd96e09a be78f47a 3ef2a45a bd9eaba4 -> 3ce403bf 3d6f59e0 bd6a4616", + "bec04246 3f97cd92 3efcb364 3efcb364 bda512a7 3f11ac98 3f8c72fb -> 3f93edcc 3f268a19 3ee7862a", + "3f3d5081 3f0966c4 bd9f4f94 3f30ca1a 3f8462a5 3ebe6604 3f19586c -> 3f01fb87 3e9fe138 3e7d8e66", + "3ecb7fa3 be00cd19 3f5e31b8 3f35118f 3f8cd3fe 3f8cd3fe 3c95ce44 -> 3ed2af84 3f1d83d4 3f33353a", + "3f8a97ef 3f0b5fd7 3f237416 3f0b5fd7 3ea251c1 3f06e8d8 bd5cfc25 -> 3e4dfdbc 3d8b0758 3f1a5439", + "bcbe5a09 3de9ef20 3e342b17 3ecaf100 3f1ab871 3e9fe891 be27ab28 -> 3dd80b68 3e351c1f 3ec8fe50", + "3f0cfa91 3f8bce4c 3f5df9ec 3f8827b8 3edd2279 bd848a22 3c6b609b -> 3f5ab8f3 3f671994 3f87247a", + "3f2d3fa6 3e7a1414 3f245139 3f245139 3ec76813 3f6f79e7 3f6f79e7 -> 3e357e68 3ecff550 3ecff550", + "bdc6860f 3f726134 3f86996e 3f2dd475 be1bc774 3f64b118 be1bc774 -> 3f6e9ac5 3f91aefa 3f2a0e06", + "3f0a469c be1ac784 be1ac784 3f256e19 3e5ae999 be1feeec 3f2877c9 -> 3e02ab46 bd88c938 3e9b6e5c", + "3fb811d7 3f0cfd23 3e9ef6b3 3f12d32d 3e800000 3f400000 3f400000 -> 3e43d0de 3efdfaa6 3b25e100", + "be916f42 3e98aefd 3ec63c91 3f8e282a 3f400000 3f000000 3f400000 -> 3e825904 3eee2366 3fa96d06", + "3f74ebc5 3f23a39f 3f23a39f bb1ba69e bdd88414 bdb6160f 3ec39f30 -> 3f3d8849 3f396a36 3ebc443f", + "3eb4a871 3f5cb7b8 3d69e2ec 3f9d674f be7d3e14 be7d3e14 3f039a6c -> 3f730e80 3e13d3de 3f862f84", + "3f5abebb 3f6c3ced 3f0bcc9d 3f0a01f9 3e2802d7 3f692ec4 3e2802d7 -> 3f485907 3ec846bf 3ecc3c26", + "3faac399 3ec11ff2 be204362 3ebb98cc 3ed2cc1d 3f42c655 3ed2cc1d -> bda3c7b8 3fa357b3 bd7dc990", + "3dfe8788 3f08be40 3f8e336f be5bc8f2 3f9c6361 be76e1e5 be48a713 -> 3f0da04f 3f92094a be3e1783", + "3f0c2620 3f2a69e2 3ee4e2bd 3f2a69e2 3f538a9e bd2dd91c 3f0c28f7 -> 3ec74540 3ef0c851 3ebb5d37", + "3f97d13d 3d761c90 3d761c90 3f2b38bd 3f000000 3f000000 3f000000 -> 3f02b606 3f02b606 3d9b3c00", + "3d5819f1 3f157f73 3ecb92bb 3ecb92bb 3f58e862 bded9782 3f1a8d56 -> 3f112abe 3eceb4fb 3ec6668a", + "3ea98c5b 3f9e3e79 3f283ae7 3f380cbc be800000 be800000 be800000 -> 3fa8d73f 3f3d6c72 3f4d3e47", + "3ec82ec9 bdca6b95 3dfb31cd bdca6b95 be1147a8 3f42f8da 3ed0d639 -> bd31a21a 3ea6274b 3e0d3c42", + "3e98948e 3eec42a2 3f6b0faf 3e593b8b 3ea46aaa 3d26a5c8 3f879fbe -> 3ebb4343 3f67f516 3ecd8c2a", + "bdc81d0f 3f2317c8 3b33864a 3f23afe9 3e36edc2 3ec82d30 3e36edc2 -> 3f278fbc bd0f104c 3f2827dd", + "3fbb4c60 be2be1d7 be2be1d7 3f059dc0 3f4c0753 3f7dba55 3caacd1b -> 3fbeaa9d 3fe30733 3efb9ca7", + "3fa18331 3ef7d6cb 3f0efe36 bdfe3050 3e95e5b4 3e95e5b4 3cfa126a -> 3deac8f0 3e41afba 3e691690", + "3fa2361e 3e55b159 3e55b159 3e733479 3f951b59 3ddd66b9 3eeae578 -> 3f93f81f 3d92cf14 3e5e2578", + "bd4d3b77 3f37fd39 3d000f9b be240567 3e93cc01 3e93cc01 3f301d07 -> 3f3bb11f 3ca34d14 be57c13e", + "3f887ae7 3f07cf28 3f6a1f1a 3f4c0543 3f400000 3f400000 3f000000 -> 3e4baa02 3deb3600 3e8714b8", + "3f11b4c3 3eb2008a 3d89c1ac 3f7c66a3 3f8758f4 3f9c144d 3f8ef5cf -> 3f0dc22e 3f2f49a0 3effa48b", + "be0deed8 3f298d61 3f4d0945 3f1232a4 3ebf687e 3f9ddd90 be481908 -> 3f36d145 3f5a1cd0 3f0b439c", + "3faa77dd bdfeed48 3f0e42b7 3f58e845 3f000000 3e800000 3f800000 -> 3f5f7aab 3e641b22 bd9f39a8", + "3e4e0742 3de4e9f0 3f9bd36f 3e42a35b 3f3bb69a 3f4819a2 3f76a1ea -> 3e5b788b 3f87b225 3e9d6714", + "be891ae2 3f02ec6c 3f128794 3f02ec6c 3f724d28 3f98a687 3f98a687 -> 3f082853 3f0f405f 3eee9317", + "3f7aa3e3 3e1c2a0d 3eaa39e6 3eaa39e6 3f316bf3 3f1e5cda 3f985ad2 -> 3f084cff 3e92fefa 3f58c7e3", + "3fbf3bd8 3ec8b277 3f48757c 3f20d097 3c54285b 3d15f780 3f445868 -> 3ebecabc 3f3a74a5 bdd2e498", + "3fb3ce27 bdbb093c 3f93f0b7 bdbb093c 3e891fb3 3e8187b6 3f96a773 -> 3f0a9d78 3f4ce73b 3fe8c7c0", + "bdc3ebf5 3f304300 3f6b1dec be67c707 00000000 3f000000 3e800000 -> 3f304300 3f775cab be964e8a", + "3f32b503 3f31e869 3f886917 3e344f79 3f4908e3 3d3207db 3f477ea4 -> 3e8bb7e7 3f8486dc 3ef2cf36", + "3f9ef524 3f3fbca5 3eef1bf6 3eef1bf6 00000000 3f800000 3f000000 -> 3f3fbca5 3f0c87d1 bd936a98", + "bef1c60b 3f04cc81 3f96fc77 3ec345da 3e89e8c2 3e89e8c2 3f1abc97 -> 3f255c35 3fa74451 3ee98e6e", + "3faada5a 3f8ad6dd 3f1a0147 3f37c13d 3e0d9c32 3eacc70d 3ed3ecfb -> 3f666c7a 3e1ac6e8 3e294470", + "3e239282 3f8d3da4 3f8b9534 3d28fe96 3f1ccdb4 bd07af48 3f1ccdb4 -> 3f80b78d 3f8c4298 3e00f102", + "3d24f319 3f8ff706 3f69988a 3ef1f6c4 3d280d06 3f148f2a 3f1c1f6f -> 3f8fc0e2 3f639cfd 3eeb0cd5", + "3e277cd3 3e9088bc 3e9088bc 3f36af13 3f767678 3d7f9a2b bdce1e3b -> 3eb1e0a0 3e8b4eea 3f3ae5e5", + "3fa8a230 3f3ca4f2 3ee8be7a 3ee8be7a 3ed505bf 3e525adc 3ed505bf -> 3e4148dc 3e3c5b2a bdbf9bf0", + "be94cec2 3d484d7f 3f7cf0d8 3ecec437 3f8d4786 3e7cde9d 3f8d4786 -> be794ecc 3f87a83b 3ea2b5be", + "3fbfd445 be114297 3ecab6ff 3edc3c11 bdf9e7f3 3f5cf475 3f86dc71 -> 3dcdbd4c 3f00b175 3f38485a", + "be8f6005 3e8cce98 3f47caa6 3ed9b868 3f2f7c69 3ea35409 3eb9ba63 -> 3e72c4fd 3f5ea8f3 3f06dd66", + "3f2f936e 3f6f8168 3da3bc34 3f6f8168 3ee513a2 3ee513a2 3f8fd378 -> 3f20f33c 3e8de56c 3ed886cc", + "3f2ca8a2 bdc3fa04 bdc3fa04 3f85b301 3f8b303d 3f8b303d bdfde667 -> 3f444c34 3f444c34 3f9066e2", + "beb2b504 3f29d702 3f9ca2c5 3e228249 3d4724bf 3dcee437 3e57132e -> 3f2e2f25 3fa1262d 3e48e214", + "3f1e8650 3f8a97a1 3f03f0dd 3f8a97a1 3dc93166 3edfce4d 3edfce4d -> 3f82ce40 3e7a95f6 3f4fe3e2", + "3f8f783e 3f0d4c42 3e2f5f58 3f35e401 bc9f21b3 3f6efdf8 3dcd4f8e -> 3f12df2c 3f556f72 3f192009", + "3f167e6b bd8116f8 3f0a0ffc 3f5d414a 00000000 3f400000 00000000 -> 3c357b88 3eb1376c 3f5d414a", + "befd22e3 3f2265a2 bd2d6cd3 3f2265a2 00000000 00000000 00000000 -> 3f2265a2 bdac7481 3f2265a2", + "3ed5afa0 3f8d8835 3e0204f1 3ece774b bb3f43d1 3f0a36bc bb3f43d1 -> 3f8db01f 3e7c3a5b 3ecf16f2", + "bef603ae 3f8ac16e 3ebe60c0 3d63e636 bdad1da4 bd1bced4 3ec89838 -> 3f858e86 3eb50510 bda215f5", + "be338262 be4d6dd2 3f0a5623 be4d6dd2 3ed66079 3eb8d8b4 3eb8d8b4 -> beb04eac 3f1a89d8 beab216e", + "3f05c326 3f30ae11 3f30ae11 3f9e45b4 3efa932e 3d98180f 3f3756be -> 3ede6ea8 3f26bf03 3f5cbf95", + "be7b3272 be62c101 3f218fb9 bde2ce86 00000000 3e800000 00000000 -> bea9007b 3f3142e0 be290a8f", + "3f9ad8ed 3cdd0206 3f2669c1 be75e4aa bd8f6d86 3f3ca11a 3f3ca11a -> 3de4c35a bd007440 3f9dba20", + "3f863afb 3f25baa0 3f25baa0 3ee14f07 3f757e40 3f132cf7 3f757e40 -> 3e9728df 3d363bc0 3f05d240", + "3e9c50d5 bdc2a8bc bdc2a8bc 3f0e7fd9 3f37d9f7 3f995b32 3f37d9f7 -> 3e3a9f86 3ea854e1 3edf3cc4", + "3ef13c1f 3f65a253 3f9a7064 3f9a7064 3f88deae 3f88deae be5416c3 -> 3f0e385c 3f33e701 3fa6ee18", + "bdc3f618 3f10df5d 3f9dde1e 3f9dde1e 3f0ae28f 3f0ae28f 3f40b614 -> 3f1e2960 3fa4831f 3fa7165d", + "3d299aa1 3dee26d1 3d8b3fa9 3e9ed83d 3f73b4d6 3f4c4002 3f8a25a1 -> 3e159456 3dc36055 3ea89239", + "3e5affce bd800e9d bd800e9d 3f8f9c05 3ec5b8d6 3eee66bc 3f0a3092 -> 3d3fb91e 3d82a94d 3f80d517", + "bd558504 3f2fefe7 3f609f1e 3c41b89c 3e91bba2 3f195c75 3e24a407 -> 3f33bc4e 3f689db8 3b9931fe", + "3f56f791 be5c0534 3ec7f921 be5c0534 3f9803c9 3eeb6d6e 3f9803c9 -> 3f9255ce 3df74bf8 3f9255ce", + "beaa6ce4 3eb79ca5 3f1127b6 be7618a1 3f9c8ea5 3f915c05 3f915c05 -> 3e42cc42 3f1104e3 bf47405a", + "3e5c5a23 3f039c31 3f3dd16d 3e958065 3e3f85d8 3e3f85d8 3eb28def -> 3ef29d13 3f3383c6 3e772a3c", + "3f3676c7 3ec56301 3f372e41 3cfc252e bd551f7b bd4a09c9 3f14a6e8 -> 3ed85fe9 3f402e4c 3ecd32aa", + "be8c436a 3f274d68 3f2eb976 3f274d68 3f73c47a 3f3a95e8 3f7e8962 -> 3f402ff9 3f5b5757 3f3d3cb7", + "3f5f2a85 3f92b2f9 3f08e3dc 3f08e3dc 3f290396 3ed43f56 3ed43f56 -> 3f120fc0 3e318296 3e318296", + "3f76a9cf 3dbeb035 be5689c1 3ef47207 3e3cdbae 3db706e7 3e3cdbae -> 3dbb2954 3e8f8850 3e9975d8", + "3da79c9c be68f7d1 be22a5ea 3f8f979c 3db2ed5a 3f99f251 3f99f251 -> be3b8361 bd0cecec 3f84b014", + "3f7d5f0a 3ec634f2 3f9cc060 3f9cc060 3f6cee33 3f6cee33 3f135a46 -> 3f096dee 3e9e02c4 3f27a9d5", + "3f0810eb be4cceee be718caa 3e12addb 3f5c9790 3e882b83 3f21b09b -> 3ef0f233 3e1ff8f2 3ea741e2", + "bef0aff6 3f3b4119 3f46cc4f 3ef1fa74 be322359 3f3994d0 3f16078d -> 3f2651a6 3f8f04ec 3f2436b0", + "bcc61087 3efbd3ee 3ed9deed 3e99eeb5 3f557137 3f557137 bdd852b4 -> 3efdaf1b 3eda15bf 3e989ff9", + "3e89d87b 3f39bda9 3f94b25c 3f94b25c 3e771cf7 3f43f633 3d649915 -> 3f291bba 3f74a27c 3f92c5ff", + "3eba2910 3ec83304 3f5501d7 3f0ec086 3e800000 3f000000 3f400000 -> 3e99a8c0 3f267793 3ed9824a", + "3f8f76eb 3f878c6c 3f5a7edc 3e86f54c 3e3b9a67 3f424cfb 3e3b9a67 -> 3f5a87a5 3b385800 3d6e9738", + "3f83ea4a 3f718e73 3eb96f8d 3eb96f8d 3f8ff999 3f8ff999 3f32601c -> 3e21b230 3f465e26 3eaae219", + "bea6ad10 3e5983d5 bd4d052e bd9152a6 3f29d641 3f29d641 3eba1a48 -> 3e09fae0 be98e3e3 be712319", + "3e027047 3e5db491 3e5db491 3f170f1e 3f9ccc60 3f9ccc60 3f0a7bcc -> 3ea2811b 3ea2811b 3f056b38", + "3f9d2f95 be6c1100 be6c1100 3f80b5c5 3f5ea519 3f8542ea 3f8542ea -> 3fb3aba8 3fce9ca3 be3e11b8", + "be92c196 3f528483 3e9b0794 3d8cb790 3f800000 3f000000 3e800000 -> 3f80e93e 3eaa8657 3d154226", + "3ecbc3c8 3f834fbf 3eed057a 3e698f7b bd9d3b37 3f1531a5 bd9d3b37 -> 3f8738f0 3ea71d55 3e846c84", + "3f3edb22 3f9c3450 3ed3a1d8 3f120e66 3eaa29fd 3eaa29fd 3cc107ff -> 3f78fa37 3e298a0b 3f0d8f1d", + "3f3de947 3f3e7e0f 3e3f62ff 3f0d0617 be3119af 3f1517e7 3f1517e7 -> 3f5f5665 3eaeec06 3e29925e", + "3fa1f2b6 3ebcbc6f 3f2d30f2 3ebcbc6f 3f8211e8 3f8211e8 be2431f3 -> 3f38b5a4 3e8026aa 3f124dc2", + "3fb419ff 3f39cd11 3f928af5 3f3228a5 3f869cef 3e199c41 3e199c41 -> 3e27039c 3f6f0d2f 3ef83fd4", + "3b5d7d91 3f6aeba5 3f328a29 3f390071 3f67b8e9 3e53d683 3f67b8e9 -> 3f6a2329 3f325c57 3f3888cd", + "be0f5852 3f05fdc0 3ea9d7f1 3f140c57 3f800000 3e800000 3f400000 -> 3f07ab28 3ebbc2fb 3f229ec4", + "3ef3f6db 3edf0eab 3ea246ce 3ea246ce 3f305d9a 3f305d9a 3f32c6fd -> 3eb28f92 3eafb408 3eb20064", + "3f67c9bb bdf82b87 3f77d527 3f77d527 3f974996 bbd23b01 3efa9a57 -> 3f958e40 3f7951d9 3f0661c8", + "bdc81c57 3f1f709f 3ebc5248 3f958289 3f880784 be6a073b be6a073b -> 3f2403cc 3eb0e34f 3f92a6cb", + "be9b56f7 3f69d185 3f3c8f4c 3f69d185 3e1f0598 3e3f8aae 3f07b05d -> 3f75e152 3f4b168d 3f897e3b", + "bde1a338 3f9b151c 3f242db8 bd9aa782 3f14adb6 3f5c4239 3f14adb6 -> 3fa345d4 3f30169b be1fe378", + "3e9dde39 3ed55dc1 3eddfda3 be3463d7 3f44533e bdb22be6 3f44533e -> 3ecadb84 3eebb996 3e2cfced", + "be20ea39 3f85c587 3f92fe31 3f85c587 3ecacf7a 3f812fb9 3ecacf7a -> 3f8dbd3b 3fa74b32 3f8dbd3b", + "be5ee5c0 3baa6f43 3baa6f43 3eea3458 3f6722aa 3ee3ae47 3f6722aa -> be419a6e bdb6f358 3eeb8a63", + "3d9d3862 3f295772 3ed2ca1b 3ea59879 be58f3ba 3f227053 be576dce -> 3f2d815c 3ecb5dae 3eaddd56", + "3f70f391 3d2ece5c bdb67893 3d2ece5c 3f18d8df be286754 3e7fcaa6 -> 3f0638aa 3d86899d 3e4a310d", + "3fa87c72 3f9ddf70 3d83fcf1 3f9e41a4 3f82e495 3e28cb68 3f82e495 -> bde6bd60 3de4e27b bde09a20", + "3f2f4310 3f931f2c 3f931f2c 3ece6133 3f6626ae 3ea098c8 3f6626ae -> 3f08ad9d 3f6f4517 3eeeeda6", + "beb5afa6 be3d1071 3ed3d17f be3d1071 3ec0f21c 3f4de744 3f832329 -> bee6172c 3ed8042a bf2de188", + "beb4d5ab 3f69eb0a 3f69eb0a 3f2c1a99 3f3c5b74 3f3c5b74 bdad29a6 -> 3f9638e6 3f9638e6 3f24757c", + "3e9e1333 bcf00978 3e372883 3dd21243 3e800000 3f000000 00000000 -> 3d871ecc 3e6422f8 3dd21243", + "3ede495d 3f2be781 3e9dbcea 3f495750 3d7c0ce2 3f80ea1c 3d28caac -> 3f2510a6 3ef4a5ce 3f44c2cf", + "3f35cec7 3f29a0a5 3e7665b1 3f369bd0 3f97810d 3f97810d 3f8bdd3d -> 3f0fe2b1 3f3d4c32 3ef3ca8e", + "3eb6f026 3eb0beda 3eb0beda be3089fc 3f010834 3f3549af 3f3549af -> 3e8ea63e 3eb3fdd0 3e50b69c", + "3fabbfcc 3f2d1327 3e90bb43 3f2d1327 3d807739 3d807739 3f0c7cc9 -> 3f17872f 3e4b46a4 bd76e100", + "3f901bcf 3d922cf3 be64e0ad 3d922cf3 3e05c0da 3ef27f3e bcda81cc -> 3d6c68aa 3f5020fd 3dcfad52", + "3f3c0ddf 3f9f3248 3e3792a5 3e3792a5 3f8beb88 3ed9846e 3d2f497e -> 3ee1a6ee 3e697172 3e1761c8", + "3f92f9fd 3d0eb914 3f936973 3d0eb914 3f8b2fdb 3f83b128 3f83b128 -> 3f9a0a17 bcf37480 3f916ef0", + "3f755428 3f11b3e9 3efe284e 3efe284e 3ebb45d2 be31e972 3df82e34 -> 3e5fe0e0 3f29b3e1 3ec2b2da", + "beed0471 3f462d62 3f462d62 be665ef0 3e9ab868 3f826662 3e9ab868 -> 3f69fd3c 3f8276e5 bf12ba0e", + "be4253f1 3f53d02a 3f53d02a 3f12556e 3eff8fd7 3eff8fd7 3f7d69ca -> 3f6c1004 3f6c1004 3f19c87a", + "bef2f976 3f1174b6 3f3461b2 3f3461b2 3f58dcb1 3ecc063d 3f58dcb1 -> 3f3498cf 3f64cae0 3f78abda", + "bee59916 3f118b3f 3f6f2d3d 3f118b3f 3f48ad2e be75910f 3f48ad2e -> 3f3a1662 3f53a58a 3f3a1662", + "3fa5ae7d bd9360f6 3d971903 bd874723 be7ec2f5 3ed677f7 3e2675f6 -> 3e800910 3ed99726 3ea176c3", + "bd4bc3b4 3f857151 3f880924 3ead510c bcd54310 be438e88 bcd54310 -> 3f8546e1 3f86d1d5 3eaca74d", + "3f7a26fb 3f8ee7b8 3f14657e 3f14657e 3f842058 3f3fd518 3e8fea1b -> 3ddcc040 3e375588 3e9c2a74", + "3f47cf46 3f845e7e 3f3c9e27 3f845e7e 3f7a7020 3f7a7020 be307539 -> 3e8a8a1c 3eb34d8b 3f9595be", + "bef9138a 3e932cfd 3e932cfd 3f5f926e 3f800000 3f800000 3f400000 -> 3da52dc2 3da52dc2 3f9e7ce1", + "3fa7bb68 3e1e5c55 3eaea89c 3f691832 3ef54b7c 3e1a8b8f 3da2ed18 -> 3ec11978 3e12ccde 3f4e6836", + "3f3d460c 3f1f57a5 3f7f5e20 3f9f469a 3f257a3e be39a1e7 3f0c957c -> 3e38463e 3f90d6fa 3f569c60", + "3e0d02a8 3f7b43ba 3f7b43ba bcbf5849 be646efa 3eb32588 3f96cb76 -> 3f819079 3f6eee09 3e14ca92", + "3ebb129c 3f913328 3e5c4747 3e5c4747 3eb569da 3f852f97 3f803c23 -> 3f80a0f8 3ee04e7c 3ed91219", + "3f5544b6 3f9e9b7b be02cc0c be02cc0c 3ddeae57 3ddeae57 bdcf7627 -> 3f93034e 3e33e320 3a373700", + "3f575910 3e15522d 3f64799b 3eb70979 bdef230a 3da35eda bdef230a -> 3e79e6fd 3f534beb 3ee953e1", + "3f18a126 3f9e32a3 3e900a96 3e900a96 3ed053a3 3f8bdb37 bc62ca3e -> 3f7e4ae0 3f18e8ba 3e94444d", + "3fa0cba3 bdfdc056 3ea0267a 3eed8fec be7b8fa0 be7b8fa0 3ecc5d3e -> 3e3d2393 3f1f142c bd194e10", + "3bb7422c 3f8027cf 3f16e02c 3f8027cf 3e2e683e 3f8555f6 3f875c08 -> 3f800899 3f16adf3 3f7ef548", + "3f157f61 3ea2cefe 3f9af995 3f9af995 3e0bbc09 3e257f15 3e0bbc09 -> 3e740404 3f8ee4eb 3f90c656", + "bd8f2171 3f16c5c9 3f6eee1b 3f3d65d5 3f400000 00000000 3f000000 -> 3f1e6db2 3f6eee1b 3f4657ec", + "3fb0d0af be6f66f7 bd76c269 bd76c269 3f48fa2e 3f48fa2e 3f89d38f -> 3fbf8fee 3f98679c 3fcbfb5f", + "3d5eab81 3f9dc09d bdda72c6 bde4ec0e 3ecd1d31 3f8d6fc4 3f248d1c -> 3f9af6fa bd0f59bc bd8477fe", + "3ebf2b7a 3ea1b32c 3f329957 3ea1b32c 3f8ce607 be4ad5a0 3f8ce607 -> 3efb6222 3f458852 3efb6222", + "3ec8e29f 3f8f2436 3ce2b76d 3ce2b76d 3f17eb6e be08ae85 be08ae85 -> 3f62ad37 3da3ef32 3da3ef32", + "39b253d4 3f8b8bd5 3f5ba19e 3ed77b5c 3f9c6ec6 3f9c6ec6 3f19f554 -> 3f8b8127 3f5b969c 3ed770a5", + "3f212f35 3e742090 be67050f 3b8c92fb 3f800000 3f000000 3f800000 -> 3f115c9a 3ebf2176 3f20e652", + "3fa93386 3f77a228 3f77a228 3f8683a5 3f7fccc6 3f87a489 3f1adb85 -> be89d420 be41c6e0 3e80a63e", + "be44bfc6 3ed8294c 3f5b951b 3edbfc28 3f6d0782 3f2142da 3f2142da -> 3ed0246a 3f7a911a 3ef28d17", + "3e493e1e 3ed3e344 3ec26ceb 3ec26ceb 3e0e0bcb 3f0980ad 3f0980ad -> 3ec5ee0d 3eac0d45 3eac0d45", + "3f2387aa bdb8102b 3f9fecaf 3f9fecaf be6d478d 3ae7d06b be29c79f -> 3d6e28e2 3f9fc7aa 3fad7b32", + "3f4202d3 3f44c5be 3eb3a64b 3f521f6b 3e8455a7 3e8455a7 3f204c99 -> 3f12a08e 3e1eb7d9 3eb14735", + "3ee2f036 3f0f2580 3eaa52df 3f0f2580 3f874a86 3e4c9912 3e4c9912 -> 3f082ed0 3e79f630 3ef0f339", + "3f917154 3d579413 3e490353 3f295709 3f800000 3e800000 3e800000 -> 3f88deab 3d0c5a04 3ec13cbe", + "3f14eff0 3eab62c4 3dc1579f 3eab62c4 bd2bd2a9 be47dc89 be47dc89 -> 3eb7e19e 3e54f2a0 3ee5862c", + "be8bab81 3f81fd77 3f70a473 3f9787e1 3f40315d 3f40315d 3edf3bb7 -> 3f9c345b 3f92891d 3fa6c140", + "be9f3f31 be75110d be75110d 3edac869 be47f4bd 3e669c87 be47f4bd -> bea7a8fa beea9e9a 3ebbafd2", + "3fbbb6a7 be477bf8 be477bf8 3df9b0d9 bd8a44c3 3f9cd3b0 bd8a44c3 -> 3e8e1c58 400b1840 3e623b4e", + "3f6b8b0e 3f81db78 3f834824 3f81db78 3f980930 3f4557d9 3f980930 -> 3e7643dc 3ea1fae4 3e7643dc", + "3f5585c7 3da40fb8 3da40fb8 3e98d770 3f517c64 3e0c7057 3e0c7057 -> 3f21063b 3d794fa0 3e3c8c04", + "3e9839c6 3e966452 3e966452 3f1b6dfe 3f5a143c 3e25b866 3f9cb27d -> 3ebea40c 3e7b8332 3f1c2ef3", + "3e91343c 3ccb892d bdc049dc bbc5cb8b 3f4c1494 3e8df266 3e8df266 -> 3e728577 3d1b9b74 3d9bacd6", + "3f0a1816 be48d712 be48d712 3f8c6ce9 3f927528 3e8f804b 3f927528 -> 3f21f784 3e2aa7e8 3f07dc01", + "3f4ea661 3f18de62 3f9cfbab 3f18de62 3f863d97 3f0a50a7 3f1779df -> 3ef596c9 3f4a508b 3df4bef0", + "be03b381 3efa9406 3f84080a bd106a1a 3e7130ee be31b36d bdf89bf6 -> 3f050b56 3f812caf bd505d2a", + "bee7dd8f 3f838cf5 3f838cf5 3f9571f3 3f9626db 3f12b4bd 3f21eef0 -> 3fb6b37f 3fa4c4f9 3fba1ca3", + "bec63050 3f2c4094 3ed7602a 3f479b03 3f9fcbb4 3decebc4 3decebc4 -> 3f35e553 3eee4d8c 3f5311b4", + "3f96ed2e be21bc7f be21bc7f 3eec92fb 3f01ef6e bd4bc62c 3f01ef6e -> 3f502084 3e1f9b39 bcee78a0", + "bc145df9 3f4534f9 3e69dd9f 3f4534f9 3dceb64a 3e5ee087 3dceb64a -> 3f4570e0 3e6be24d 3f4570e0", + "3f54721f 3f35f8d8 bc5e0761 bc5e0761 bdbb5724 3ee17331 bdbb5724 -> 3f4967cd 3ebfabbc 3d7f6d82", + "3f761eb0 3f92ae27 3f735f52 3f735f52 3f3c531c 3f3c531c 3d56f610 -> 3ee09bbc 3e794388 3f6674ae", + "3f8b08ed be3d1fe7 be3d1fe7 3f97b227 3f400000 3f400000 3f400000 -> 3f83fe2a 3f83fe2a 3ebdadd4", + "bd911281 bdb4a426 bdb4a426 3f547da4 be1cd252 3e062970 3e514693 -> bdcadbc4 bde13d73 3f583265", + "3f281dcd 3f3f5bf3 be707c7f 3f3f5bf3 bdd6a52a 3f9c7dac 3ddaa467 -> 3f50fa9f 3f60611a 3f2d6948", + "3f8a1f46 3f85fff1 3f08592d 3ebbddd8 3f0c3d87 3ec2e205 3ec2e205 -> 3ee95692 3df99c3c bc692080", + "3f2afa5e 3ec464e2 3efafe7f 3efafe7f bc88c7be 3f89574c 3f89574c -> 3eca1a89 3f0d515a 3f0d515a", + "3f7b1571 3ec44f97 3e870c3c 3ee460b0 3f959f79 3e9b8369 3e9b8369 -> 3f471d18 3d3553ec 3e17b3a4", + "bdfa9d90 3f740792 3f740792 3ec6a4d4 bd7e95b8 bdce6d9b bd7e95b8 -> 3f72151c 3f70df3a 3ec2bfe8", + "3fbb7ed6 3f777fd7 3f393fa1 3f837bf7 3f44c37b be42e8be 3f878888 -> be22e2e4 3f804ff5 bedcbc3c", + "3f93dfee 3f8b14c7 3e36a092 bd24572b bdaf14c4 3eb269a8 3f8230de -> 3f97b909 3e2ce3b2 3f9d22e2", + "3f3157c5 3f8c5e91 be708e46 be708e46 3f883089 3f1a4f72 3f3e276f -> 3eb81944 3f0214b0 3f1ae950", + "bee1c277 3e297ccd 3ecba2fd 3f8235db bd564d42 bd564d42 3f878338 -> 3e11dd37 3ebfd332 3fb94978", + "be832ddf 3f985b69 3f985b69 3f029c90 3f7a780e 3eaa19f9 3f7a780e -> 3fb8717d 3fa340a2 3f055ded", + "3f9eb273 bcdc9121 bdd92ff6 bdd92ff6 3f945598 3f69a25c 3f945598 -> 3fbd01e5 3fa4ead0 3fcbfe34", + "3eec89b6 3f8aa6f1 3d81cdc5 3f8aa6f1 3f8160a0 3f4c0047 3f09c870 -> 3f1dc336 3ebef58e 3f55a66f", + "3f90e701 3eb66355 3f8a9bd0 3eb7f270 00000000 00000000 00000000 -> 3eb66355 3f8a9bd0 3eb7f270", + "beb9a117 bd8df331 be3a0170 3f6b1d93 3ee24357 3d151ed4 3ee24357 -> be8f40d6 bea732d4 3f8a10eb", + "3f092555 bd04b8a4 bd04b8a4 be17a194 3f88e15d 3f88e15d 3f1a335d -> 3f1340dd 3f1340dd 3eaaa2be", + "be4cfdec 3f380007 3f1a2de6 3f1a2de6 3f400000 3e800000 00000000 -> 3f5b3bae 3f26fdc5 3f1a2de6", + "3f417a45 3ecacf40 3cbf75d2 3d919401 3f25183f 3f25183f 3ed7b944 -> 3e91cd4a 3ef36d36 3e906ba7", + "3e1cc54e be68a637 3f560cae 3f560cae 3e248a5f 3f559e58 3ea046a3 -> be083922 3f355866 3f49c7dc", + "beb42b2e 3f9d3bb2 3f9d3bb2 3eb091af 3f2e5537 3f2e5537 3ee214f7 -> 3fbbe807 3fbbe807 3edd4776", + "3f89c39c 3efc51fb 3f95f319 3f1c4db1 3e295b04 be7d08dd 3f8dc9fc -> 3ea12ede 3fb7fddf 3efa1eca", + "beed0d23 3f8be783 3e7ba830 3efae657 3d64ff5e 3f9a4b0e 3f86abbc -> 3f8f37b4 bdad9b9c 3ee9d2aa", + "3f710d24 3f807780 3eecea26 3f807780 3efef448 3f775579 3f30edd5 -> 3f08e679 3f0044a5 3eb4ac0c", + "bcb8b0f5 3eeae502 3f8c4a5a 3eeae502 3e800000 3f400000 3e800000 -> 3eedc7c6 3f8e746d 3eedc7c6", + "becec865 3ee3d09d 3eb47720 3eb47720 3e95d09a 3ec5af7e 3f882086 -> 3f102917 3ef66545 3e54a594", + "bd1ce4d7 3f4fd736 3e8cdc9e 3df88243 3f2b8d90 3f2dc794 3f54e22f -> 3f566970 3e8a570b 3dca4fe3", + "3e3eaa0b 3d989ea0 3d989ea0 3f427d25 3dca9429 3eeb3fba 3eeb3fba -> 3d858134 3e077f50 3f2c9673", + "3f023865 3c25ad90 3f1029ba 3c25ad90 3f000000 3f800000 3f800000 -> 3e822168 3eff7074 3f022ce6", + "3f8c1f91 be549b3e 3f84756e 3eccc15e 3f400000 3e800000 3f800000 -> 3f88b3d4 3f42db14 3f1e79d4", + "3f9af5b0 3f079039 be7aa46c 3f079039 3d548121 3e2d6b51 3d548121 -> 3eeef80a 3f0d8ad8 3eeef80a", + "3ee5f8e8 3efb758e 3dbcfe6f 3f8397bd 3e74e0f6 3f3b268c 3f3b268c -> 3ec476b9 3eaced37 3f331fc1", + "3eb5e3c0 bda85e4c 3e42368b 3f0ea606 3df6bbb1 3e2bee74 3f96e1d6 -> 3c9ba510 3e052244 3f147fa3", + "3b02cf7f 3f9b6bbb 3f50b83d bd8c6130 3f5b1cbb 3f5b1cbb be41e284 -> 3f9b33c0 3f5052e6 bd8b9b0c", + "3f55e663 3f675b2f 3ed0bd5b 3f675b2f 3e800000 00000000 3e800000 -> 3f31e196 3ed0bd5b 3f31e196", + "be0a8705 3f136d08 3f136d08 3f32a0cd 3f5c0c97 3f452b80 3f5c0c97 -> 3f1d8b96 3f20a3f0 3f453089", + "bec6c927 3f6e5d5b 3f6e5d5b 3f72def1 3e1f9b10 3f2f54b2 3f2f54b2 -> 3f7ddb46 3f9937ff 3f9b78ca", + "3f024bd2 3f8c687c 3ef2f89e 3ef2f89e 3f087614 3f7a9044 3f7a9044 -> 3f535c98 3efab322 3efab322", + "3f71370d 3d93c8f2 3ee8fce5 3e7b8015 3eda50da 3da99c62 3eda50da -> 3ead0754 3ec108b8 3e3cf6e2", + "be09ffa1 bc794a42 be066ba4 be066ba4 3ef10b79 3f40db7c 3ef10b79 -> bda97f39 be894e4c be6b9e7a", + "3e746478 3ef4e2de 3f16c275 bdc549c9 3dea5674 3e624fd0 3e624fd0 -> 3ee6e778 3f0941a7 3b1d1120", + "3ef4abdd 3f4d1f6e 3ec0faaa 3ec0faaa 3e800000 3e800000 3e800000 -> 3f2e89f2 3e83cfb3 3e83cfb3", + "3e033fa1 3e683d85 3ed5d0f8 3e683d85 3f65deef 3f65deef 3f7374c0 -> 3e914791 3ed9ee89 3e94c316" + ] + }, + { + "function": "cycles_mix_exclusion", + "node": "ShaderNodeMix RGBA EXCLUSION", + "cases": [ + "00000000 00000000 00000000 00000000 3e798fa0 3e798fa0 3f5ce10f -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 00000000 3f800000 3f000000 -> 00000000 3f000000 3ec00000", + "3f800000 00000000 00000000 3f000000 3f1e5465 3f666676 3f294b32 -> 3f1e5465 3f666676 3f000000", + "3fc00000 00000000 00000000 3f400000 bd0d8f55 be24352e 3f67d682 -> 00000000 00000000 3d90f8e8", + "bf000000 00000000 00000000 3f800000 3ef80ace bde5304b 3ef80ace -> 00000000 3d65304b 3f9f015a", + "3e800000 00000000 3e800000 00000000 3f8f481c 3f8f481c 3f518ced -> 3e8f481c 3ec7a40e 3e518ced", + "3f400000 00000000 3e800000 3e800000 3f06f530 3f04b73c 3f04b73c -> 3eca6fc8 3ee3896d 3ee3896d", + "40000000 00000000 3e800000 3f000000 3e9df622 3f60bfd4 3f6ffd26 -> 3f1df622 3f905fea 3f000000", + "00000000 00000000 3e800000 3f400000 3f0b40fe be69e75c 3f0b40fe -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3e9b2644 3f90b51d 3f3fa4e0 -> 3e1b2644 3f085a8e 3f202d90", + "3f800000 00000000 3f000000 00000000 3f95c145 3f127d30 3f95c145 -> 3f95c145 3f000000 3f95c145", + "3fc00000 00000000 3f000000 3e800000 be470861 be470861 bdb178d8 -> 00000000 3f000000 3e3d72af", + "bf000000 00000000 3f000000 3f000000 3e684c80 3e684c80 3f7e8e3f -> 00000000 3f000000 3effffff", + "3e800000 00000000 3f000000 3f400000 3f2143d8 3f6e3946 3f751316 -> 3e2143d8 3f000000 3f215d9e", + "3f400000 00000000 3f000000 3f800000 3f800000 3f800000 3f800000 -> 3f400000 3f000000 3e800000", + "40000000 00000000 3f400000 00000000 3f5b003f 3d9b8e7a 3ef105a5 -> 3fdb003f 3f2c8e30 3f7105a5", + "00000000 00000000 3f400000 3e800000 3f2b79f6 3c22427f 3f3182c7 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3e8167bd 3f2aef97 3f2aef97 -> 3e0167bd 3f15441b 3f000000", + "3f800000 00000000 3f400000 3f400000 3f400000 3e800000 3f800000 -> 3f400000 3f200000 3e800000", + "3fc00000 00000000 3f400000 3f800000 3f923354 3f93ffeb 3f37dc31 -> 3fdb4cfe 00000000 00000000", + "bf000000 00000000 3f800000 00000000 3f781bcf 3f9d3f85 3f953418 -> 00000000 3fce9fc3 00000000", + "3e800000 00000000 3f800000 3e800000 3f800000 3f800000 3f000000 -> 3e800000 3f400000 3ea00000", + "3f400000 00000000 3f800000 3f000000 3ebbecd7 3f7b02fb 3f5e51ea -> 3e8cf1a1 3e877b88 3f000000", + "40000000 00000000 3f800000 3f400000 3f99c820 3d5231ef 3f3fb53a -> 4019c820 3f65b9c0 3a958800", + "00000000 00000000 3f800000 3f800000 3f800000 3e800000 3f800000 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 bbe21f9d bbe21f9d 3f961470 -> 3e7e3bc0 00000000 3f161470", + "3f800000 3e800000 00000000 3e800000 3e038c53 3f828091 3f828091 -> 3ea0e315 3f828091 3f428091", + "3fc00000 3e800000 00000000 3f000000 3e5853b5 3e03fd7f 3e03fd7f -> 3ed11f64 3e45fc3e 3f000000", + "bf000000 3e800000 00000000 3f400000 be64d78e 3d93e0be bdc3e0c4 -> 3e9c9af2 00000000 3f39e0fa", + "3e800000 3e800000 00000000 3f800000 3f8a308d 3eec20bb bd817c3e -> 3ec51846 3dec20bb 3f8205f1", + "3f400000 3e800000 3e800000 00000000 be542517 3e30047b 3f6d44e6 -> 3e307217 3ea100d7 3f31f3ac", + "40000000 3e800000 3e800000 3e800000 3f3b58df 3e263d11 3f6e3f22 -> 3f7b58e0 3ed31e88 3f971f91", + "00000000 3e800000 3e800000 3f000000 3f4f67a0 3f4f67a0 3ed824b4 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f4e46f6 3f21f68e 3f4e46f6 -> 3ee7237b 3ed0fb47 3f0c6e43", + "3f800000 3e800000 3e800000 3f800000 3f19e155 3f08418a bc6ed3d2 -> 3f0cf0aa 3f0420c5 3f81dda8", + "3fc00000 3e800000 3f000000 00000000 3f000000 3e800000 3f400000 -> 3f200000 3f000000 3f900000", + "bf000000 3e800000 3f000000 3e800000 3f0c90bd 3f764944 3f0c90bd -> 3de6de88 3f000000 3de6de88", + "3e800000 3e800000 3f000000 3f000000 3f2b9109 3f8ecd6c 3e985185 -> 3eaae442 3f000000 3f000000", + "3f400000 3e800000 3f000000 3f400000 3e585cd5 3f9ece95 be1018fa -> 3ea89168 3f000000 3f4d8258", + "40000000 3e800000 3f000000 3f800000 be59f9a8 be59f9a8 3e918e00 -> 3d181960 3f000000 3edce400", + "00000000 3e800000 3f400000 00000000 3f21d8c6 3d5bc2fe 3d544f4a -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3ef5ec02 3edbc0d3 3edbc0d3 -> 3ebd7b00 3f2487e6 3eb6f035", + "3f800000 3e800000 3f400000 3f000000 3f740be0 3f740be0 3f503178 -> 3f3a05f0 3e8bf420 3f000000", + "3fc00000 3e800000 3f400000 3f400000 be5979b8 3eb80b46 3eb80b46 -> 3db9c96c 3ef5f790 3ef5f790", + "bf000000 3e800000 3f400000 3f800000 3e800000 00000000 3f800000 -> 3e400000 3f400000 3fc00000", + "3e800000 3e800000 3f800000 00000000 3f31b112 3d935953 3e2bf784 -> 3eac6c44 3f7b6535 3d2bf784", + "3f400000 3e800000 3f800000 3e800000 00000000 00000000 3f400000 -> 3e800000 3f800000 3f080000", + "40000000 3e800000 3f800000 3f000000 be608225 3f9ff1eb 3e6955dd -> 3cfbeee0 00000000 3f000000", + "00000000 3e800000 3f800000 3f400000 bd00b14b bd00b14b bd8e50fc -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 00000000 00000000 00000000 -> 3e800000 3f800000 3f800000", + "3f800000 3f000000 00000000 00000000 3d959382 3f2feebc bdd5d0af -> 3f000000 3f2feebc 00000000", + "3fc00000 3f000000 00000000 3e800000 3f400000 3f400000 3f800000 -> 3f000000 3f900000 3f800000", + "bf000000 3f000000 00000000 3f000000 be37ced2 3cfffc73 be37ced2 -> 3f000000 00000000 3f000000", + "3e800000 3f000000 00000000 3f400000 3f51441e be64b6c8 3f51441e -> 3f000000 00000000 3f25d77c", + "3f400000 3f000000 00000000 3f800000 3f62fd6f 3f5dacb9 3e3f3fda -> 3f000001 3f26418b 3f5c2407", + "40000000 3f000000 3e800000 00000000 3f581c59 be657f1a be657f1a -> 3efffffc 3cd40730 00000000", + "00000000 3f000000 3e800000 3e800000 3f0402e0 3e4fe083 3f559e49 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3e8fc22f 3f18b35e 3f268fef -> 3f000000 3ecc59af 3f000000", + "3f800000 3f000000 3e800000 3f400000 00000000 3f400000 3f000000 -> 3f000000 3f200000 3f000000", + "3fc00000 3f000000 3e800000 3f800000 3f000000 3f800000 3f800000 -> 3f000000 3f800000 00000000", + "bf000000 3f000000 3f000000 00000000 3f4a3a6d bd46485e be0020cf -> 3f000000 3f000000 3d8020cf", + "3e800000 3f000000 3f000000 3e800000 00000000 3f000000 3f000000 -> 3f000000 3f000000 3ea00000", + "3f400000 3f000000 3f000000 3f000000 3f000000 3f400000 3f400000 -> 3f000000 3f000000 3f000000", + "40000000 3f000000 3f000000 3f400000 3e21455e 3f1139c1 3f719e78 -> 3f000000 3efffffc 00000000", + "00000000 3f000000 3f000000 3f800000 3e9b294c 3f2e2c84 3ee45dd5 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f2fc107 3e4006ab 3e5cba07 -> 3f000000 3f33ff96 3ddcba07", + "3f800000 3f000000 3f400000 3e800000 be0fe4d1 be0fe4d1 3ee01911 -> 3f000000 3f51fc9a 3ef00c88", + "3fc00000 3f000000 3f400000 3f000000 3dc14ee5 be70fb09 3dc14ee5 -> 3f000000 3f6d2f13 3f000000", + "bf000000 3f000000 3f400000 3f400000 3f000000 3f000000 3f800000 -> 3f000000 3f600000 3f800000", + "3e800000 3f000000 3f400000 3f800000 3f400000 00000000 3f800000 -> 3f000000 3f400000 3f400000", + "3f400000 3f000000 3f800000 00000000 3f9fb93e 3f9fb93e 3e827840 -> 3f000000 3d835118 3e43b460", + "40000000 3f000000 3f800000 3e800000 3f8a010a 3f430e41 bd7eff59 -> 3f000000 00000000 3e40402a", + "00000000 3f000000 3f800000 3f000000 3f5f3f9e 3ea4456c bd3ede91 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3e0dd5aa 3f288df2 3f098e04 -> 3f000000 3f2bb907 3f1d9c7f", + "3f800000 3f000000 3f800000 3f800000 3e54bd1b 3e889da8 3e54bd1b -> 3f000000 3f3bb12c 3f4ad0b8", + "3fc00000 3f400000 00000000 00000000 3f681062 3ec19956 3ec19956 -> 3d8f9da8 3f113300 3f113300", + "bf000000 3f400000 00000000 3e800000 3eedeb02 3eee29fa 3eedeb02 -> 3f5dbd61 00000000 3e090a7f", + "3e800000 3f400000 00000000 3f000000 3f9d9435 3f9d9435 3ef85fd3 -> 3f189af2 3e9d9435 3f000000", + "3f400000 3f400000 00000000 3f400000 3f400000 3f000000 3e800000 -> 3ef00000 3ec00000 3f280000", + "40000000 3f400000 00000000 3f800000 3e8ac4c8 3f816884 3e031f76 -> 3ef53b38 40016884 3f3e7046", + "00000000 3f400000 3e800000 00000000 3f307335 3f307335 3beea21d -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3e800000 3f400000 3f800000 -> 3f300000 3ee00000 3f000000", + "3f800000 3f400000 3e800000 3f000000 3ef3d1d6 3ef3d1d6 3f77cf1b -> 3f030b8c 3ef9e8eb 3f000001", + "3fc00000 3f400000 3e800000 3f400000 3ddf504e be7a5b69 be7a5b69 -> 3f2b107a 3d8876e4 3f6ef125", + "bf000000 3f400000 3e800000 3f800000 3f400000 3e800000 00000000 -> 3f700000 3e400000 3f800000", + "3e800000 3f400000 3f000000 00000000 3f088f47 3e6859fd 3f058be1 -> 3f2eee18 3f000000 3e058be1", + "3f400000 3f400000 3f000000 3e800000 3f95665c 3f6fc1ae 3f6fc1ae -> 3e9fe676 3f000000 3f19e8a1", + "40000000 3f400000 3f000000 3f000000 3da63db6 3da63db6 3da6ea0b -> 3f2b384a 3f000000 3efffffe", + "00000000 3f400000 3f000000 3f400000 3da0cc7f bd75a3ce 3ef3955d -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3e75e63f 3f547944 3e13dccb -> 3f30a19c 3f000000 3f6d8466", + "3f800000 3f400000 3f400000 00000000 3f9ec1a0 3f9ec1a0 3f5f6ece -> 3e04f980 3e04f980 3f5f6ece", + "3fc00000 3f400000 3f400000 3e800000 3dff24fc 3dff24fc 3f9730d6 -> 3f28148a 3f28148a 3f9164a0", + "bf000000 3f400000 3f400000 3f000000 3e783856 3f8b6cae 3f8b6cae -> 3f4f8385 3f82db2c 3f000000", + "3e800000 3f400000 3f400000 3f400000 3f6e1fbd 3ed91bac 3f31341e -> 3f223c08 3f326e45 3f29d97c", + "3f400000 3f400000 3f400000 3f800000 3f1ca58b 3f1ca58b 3e833d72 -> 3f0541ed 3f0541ed 3f4ec8f4", + "40000000 3f400000 3f800000 00000000 3f3b1e3b 3ede6394 3e25ff9f -> 3c9c3900 3e0671b0 3ea5ff9f", + "00000000 3f400000 3f800000 3e800000 3f5a4c26 3f794f06 3f853ec8 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f6e06f6 3e90fe09 3f20ae01 -> 3f047e43 3f5bc07e 3effffff", + "3f800000 3f400000 3f800000 3f400000 00000000 3f000000 3e800000 -> 3f400000 3f000000 3f200000", + "3fc00000 3f400000 3f800000 3f800000 3ef5f522 3f999738 3f013119 -> 3ec78822 00000000 3e78d964", + "bf000000 3f800000 00000000 00000000 3f7836c4 3d79a9f4 3f1674a9 -> 3fbe0db1 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 3e800000 3f000000 00000000 -> 3f700000 3e000000 3e800000", + "3f400000 3f800000 00000000 3f000000 3eb4c429 3e0d0361 bded8616 -> 3f3c3670 3dd38512 3f000000", + "40000000 3f800000 00000000 3f400000 3e87a2c8 3e87a2c8 3f8ca7ac -> 3ef0ba70 3f07a2c8 00000000", + "00000000 3f800000 00000000 3f800000 3f1d52bf 3f2d93c5 3f8349cc -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3ed13196 3e0fb38b 3e0fb38b -> 3f4bb39b 3e91f672 3d8fb38b", + "3f800000 3f800000 3e800000 3e800000 be1dd00e bddfe5ed 3ae07568 -> 3f93ba02 3e480685 3e80703a", + "3fc00000 3f800000 3e800000 3f000000 3eac974a 3f93c22c 3e5f9f99 -> 3efd1d0e 3f8ed1a1 3f000000", + "bf000000 3f800000 3e800000 3f400000 3f874918 3d0ae44b 3f71d781 -> 3fc3a48c 3e7751bc 3f7c75e1", + "3e800000 3f800000 3e800000 3f800000 3ee8f751 3f045f0b 3f045f0b -> 3f62e116 3ea117c3 3f5ee83e", + "3f400000 3f800000 3f000000 00000000 3e800000 3f000000 3f400000 -> 3f500000 3f000000 3f100000", + "40000000 3f800000 3f000000 3e800000 3d8f81e1 bcd47e6e 3f72be58 -> 3f5c1f88 3f000000 3f995f2c", + "00000000 3f800000 3f000000 3f000000 3f1911fa 3f2b49fc 3f528308 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f0a853b 3f0a853b 3f2bd515 -> 3f3abd63 3f000000 3f150aba", + "3f800000 3f800000 3f000000 3f800000 3f84e6b2 3f84e6b2 3d12bec0 -> 00000000 3f000000 3f76d414", + "3fc00000 3f800000 3f400000 00000000 3d93e443 bd34ff6e bd34ff6e -> 3f644532 3f487bf8 00000000", + "bf000000 3f800000 3f400000 3e800000 3f7c6e71 3f7fdec6 3f7c6e71 -> 3fbf1b9c 3f7ff7b1 3b646400", + "3e800000 3f800000 3f400000 3f000000 3daed96b 3f0c657b 3f0c657b -> 3f7a8935 3f2e7351 3f000000", + "3f400000 3f800000 3f400000 3f400000 bd000e62 be7c8c04 be7c8c04 -> 3f830056 3f57ad20 3f57ad20", + "40000000 3f800000 3f400000 3f800000 bdb59d6f bdb59d6f 3f8c3c8f -> 3f96b3ae 3f56b3ae 00000000", + "00000000 3f800000 3f800000 00000000 3f85bd12 3f85bd12 3f758177 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f3cdc03 bd6d0e98 3f30e60d -> 3f2191ff 3f83b43a 3ed87306", + "3f800000 3f800000 3f800000 3f000000 3ef283a1 bd58db23 3ef283a1 -> 3f06be2f 3f86c6d9 3effffff", + "3fc00000 3f800000 3f800000 3f400000 3ed92809 3ed92809 3f76c37b -> 3eba43f0 3eba43f0 3cddacc0", + "bf000000 3f800000 3f800000 3f800000 3eca672e 3eca672e 3f41534e -> 3f994ce6 3f994ce6 3fb054d4", + "3e800000 00000000 00000000 00000000 be006939 3ece5931 3f28802b -> 00000000 3dce5931 3e28802b", + "3f400000 3e800000 3e800000 3e800000 3e01b053 3f5f05ff 3ebd9180 -> 3e985110 3f13a240 3ec71690", + "40000000 3f000000 3f000000 3f000000 be442aa8 bdb00483 3f6b81ac -> 3f000000 3f000000 3f000000", + "00000000 3f400000 3f400000 3f400000 3d7307bd 3eea4ce5 3d7307bd -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 00000000 3e800000 3e800000 -> 3f800000 3f600000 3f600000", + "3f800000 3fa00000 3fa00000 3fa00000 3f8e16e2 3f7f9cb9 3f150e58 -> 00000000 00000000 3ec0d4f8", + "3fc00000 be800000 be800000 be800000 3f59b639 3f5c55a2 3f5c55a2 -> 3fd4ed00 3fd7e057 3fd7e057", + "bf000000 3dcccccd 3dcccccd 3dcccccd bdd30297 3f829ac8 3e307efb -> 3e109a1e 00000000 3cfe69ac", + "3e800000 3f666666 3f666666 3f666666 3f9a0286 3f9a0286 bdbaeaf8 -> 3f28cbca 3f28cbca 3f6b12ac", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3ea465b1 bd9527f3 3ed63ae7 -> 3ed3c418 3ea1582b 3ee03963", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f090c10 3f3efe0b 3f3efe0b -> 3e9e9a9a 3e2d5a8c 3e2d5a8c", + "00000000 3e12e23b 3e12e23b 3f85b332 3f6b85f1 3f83c02b 3de2603a -> 3e12e23b 3e12e23b 3f85b332", + "3f000000 3ef05887 3e13d51c 3ef05887 3d4b63ea 3e451364 3f83eb4e -> 3ef11f86 3e59eb42 3f003d5a", + "3f800000 3f2aac7d 3eb6e4df 3f6e7d15 3e9d37b4 3e9793aa 3e39a5fe -> 3f10776c 3ee22e0a 3f466d10", + "3fc00000 3ef47a38 be470191 be470191 3f9cb915 3f0267b5 3f9cb915 -> 3f0f66aa 3f5de2bc 4016ca87", + "bf000000 3f74965a 3f36c9d4 3f36c9d4 be6209c7 3e8ed33a 3f86d131 -> 3f5ada0e 3f461268 3f707ea8", + "3e800000 3f492228 3ebecd61 3ef5e460 3e95ad6c 3e789b93 3e95ad6c -> 3f3e718d 3ec6b776 3ef75e9b", + "3f400000 3f8693c5 3f8693c5 3ef2755d bda8074c 3f9153c7 3f9c3152 -> 3f8f4354 3de61630 3f059f51", + "40000000 3ea08ed0 3f73422d 3ea08ed0 3e546e72 be7c50e6 3f574baf -> 3eefc1b8 3fb26de0 3f70cff8", + "00000000 3f0463e5 3ea3b93f 3ea3b93f 3f3a9aeb bdbc33cc bdbc33cc -> 3f0463e5 3ea3b93f 3ea3b93f", + "3f000000 3f9beccb be21bebd be21bebd 3f61180e be3ea59f bd9a21b1 -> 3f163213 00000000 00000000", + "3f800000 3f9885ea bdda034d bd0f1024 3dee8286 3ea8cd5e 3dee8286 -> 3f83e781 3e963ccf 3db7a3b2", + "3fc00000 bd35f49a bd68a704 be545047 3e80e2df 3ee8050f 3f2ee8b4 -> 3ebbc2e7 3f333dfa 3f9f0a53", + "bf000000 3ed5bde6 bdd2800e 3f857215 3c3bcc1b 3f5ab563 3d3837e3 -> 3ed541e6 00000000 3f8891a8", + "3e800000 3d4f9756 3d4f9756 3f734e4e 3f06c58c 3f699f7f be7006d9 -> 3e2d0234 3e82eb89 3f8068ef", + "3f400000 3f3a1140 3f9a2457 3f5516a0 3f800000 3f400000 3e800000 -> 3ec5eec0 3ed2edd6 3f352e24", + "40000000 bd9ef40f 3e55e824 3f7e9296 3f20aade 3f99afa5 3f99afa5 -> 3fafac45 3fcdb1ce 00000000", + "00000000 3eef81bd 3e968331 3eef81bd bdd5af90 3ed8f7ec be5cccd7 -> 3eef81bd 3e968331 3eef81bd", + "3f000000 3ea6687f 3b955889 3f8637ce 3f6c4ed3 3e9ba1d7 3e9ba1d7 -> 3ef91bc0 3e1ee16f 3f61bf6e", + "3f800000 be28cfb2 bdab4d56 be28cfb2 3f859a00 3f859a00 bdf42509 -> 3f9c8cc4 3f913eb9 00000000", + "3fc00000 3f8357ab 3f5b375c 3e346c03 3e558a95 3e558a95 3f054e89 -> 3f326cbe 3f222688 3f2e9a35", + "bf000000 3e65890c bd85af27 3f382c83 00000000 3e800000 00000000 -> 3e65890c 00000000 3f382c83", + "3e800000 3f6139b7 be6fe516 bc40f636 3f00dab1 3d53174a 3f074c37 -> 3f48c1c2 00000000 3dfcd95b", + "3f400000 3e0d8335 3e0d8335 3e2be5b3 00000000 3f400000 3f800000 -> 3e0d8335 3f0b93e6 3f2a8349", + "40000000 3f90f0db 3f90f0db 3e4e0e8c 3f6bb336 3ec57f41 3ec57f41 -> 00000000 3e206d88 3f298715", + "00000000 3f7e33cc 3f3b6bf6 3f3b6bf6 3f800000 00000000 3e800000 -> 3f7e33cc 3f3b6bf6 3f3b6bf6", + "3f000000 3e6c3a83 3e6c3a83 bd6b0102 be2196c9 3f8bd3b2 3f8d61a5 -> 3e40b61a 3f065ec3 3f0eeabb", + "3f800000 bc9d35d5 bc9d35d5 3f7565fd 3f26a425 3e8db27e 3eb5e3c5 -> 3f281fd1 3e894f65 3f21fc6e", + "3fc00000 3d958b4f 3ee0d620 3f96f50a 3f63132c 3f63132c 3f825c40 -> 3f9ac803 3f19e1c2 00000000", + "bf000000 ba255aca 3ead59ed 3ead59ed 3f74d1e2 3f8b850c 3f287d65 -> 00000000 3e268759 3e6de8e9", + "3e800000 be014583 3ebbed06 be25a3c1 3e5974e5 be17578f be17578f -> 00000000 3eb6e537 00000000", + "3f400000 3ef92a6e 3ef8fb78 3f9897ea 3f800000 3f000000 3f800000 -> 3f01b565 3efe3ede 3e1da058", + "40000000 3f90aee3 bcdf212a 3eaa49f7 3f400000 3f800000 3f000000 -> 00000000 40053ac8 3f2adb04", + "00000000 3eff7896 3f067336 3f067336 3f57e715 3f57e715 3f0d7ce4 -> 3eff7896 3f067336 3f067336", + "3f000000 3f003276 3f003276 3f23a7cf 3f9b4fdc bda1ee25 3f6e6acb -> 3effea78 3f003674 3f0272ec", + "3f800000 3ee3908c 3e04fbd5 3f8f3c9f 3f81230a 3f341581 be43650e -> 3f0e7862 3f268e57 3fad79d9", + "3fc00000 3f961b4a 3f5a1083 bdfdd563 3f0d156f bd0421d5 3d607c34 -> 3d77d260 3f62c7d8 00000000", + "bf000000 3f604f85 3b4d3c7a 3f43d6a7 3f8169d2 3edb6aab 3f7b8616 -> 3fa0d7a4 00000000 3f833ed3", + "3e800000 3e87b16f 3d202250 3d202250 3f2f53b1 3f2f53b1 3f8a4e36 -> 3eb0e3f4 3e49a6cb 3e938212", + "3f400000 3dbd20dc 3dbd20dc 3dd7e039 3f97e7e6 3f97e7e6 3e01b9dd -> 3f516a52 3f516a52 3e38b8a0", + "40000000 3f7faeec 3f8fdbbb 3f8d5d4f be4638c8 be4638c8 3e0288c2 -> 3fb14644 3fcdb165 3f4bd530", + "00000000 3f8e2666 3ef86023 3ea9da8d 3f6b5931 bdc0b9ba 3f53467f -> 3f8e2666 3ef86023 3ea9da8d", + "3f000000 be67af4d be358ae6 3e61d910 3f86fe22 3f86fe22 3f20d456 -> 3f0a2830 3f0978de 3ecacf5f", + "3f800000 3f4c324f 3f4c324f 3f99844d 3ecc529f 3ecc529f 3e39b623 -> 3f0f61a0 3f0f61a0 3f72184e", + "3fc00000 be13a3cc 3f3d69a3 3eedf1fa 3f804fe3 3f804fe3 3f939f04 -> 3fe58356 3c9737a0 3f1634c8", + "bf000000 3e3845bd bdefea0b bdefea0b 3f400000 00000000 00000000 -> 00000000 00000000 00000000", + "3e800000 bda2c324 3ed87b65 3e2705a2 3ecfd607 3e040e14 3f99baad -> 3d1c37b6 3edb07b7 3ebb1769", + "3f400000 3e36b273 3e98250c 3f8b8599 3e066b02 3f9cfef6 3f9cfef6 -> 3e778989 3f2b9bcf 3b93b800", + "40000000 3f1fe148 3e9de89e 3f6f2723 3f6b9b8e 3f7f8923 3f1f0f52 -> 3e2a1260 3f8963fe 00000000", + "00000000 3f846090 3f53f2e1 3f53f2e1 be800000 be800000 be800000 -> 3f846090 3f53f2e1 3f53f2e1", + "3f000000 bd6edc4e 3f5c202c be167819 3d6548c7 3e00a0e3 3eed0bf1 -> 00000000 3f508dad 3e1c3df1", + "3f800000 3f8ae4e4 3e65d8b1 3ebcd99b 3f800000 3f000000 3f000000 -> 00000000 3f000000 3f000000", + "3fc00000 3f01cad4 3f7cebe1 3f0cc870 3e3673e2 3e3673e2 3f7dffa6 -> 3f00d591 3f3a25b2 3ecd77be", + "bf000000 3f8b498e be115115 be4f61b1 3f244e92 3e183bbf 3f3b5685 -> 3fbb9bc8 00000000 00000000", + "3e800000 3f0e4b69 3f86b722 3f43e0e4 3f0ae99b 3f64119e 3f572697 -> 3f0a6a90 3f4e6e4c 3f275ad7", + "3f400000 3eb83132 3eb83132 3e048afa bdc4eef0 3f8fb4ca 3f8fb4ca -> 3eadd5b1 3f188f71 3f40e480", + "40000000 3f418c2f 3e4ae1cf 3e4ae1cf 3f000000 3f800000 3f400000 -> 3e79cf4c 3fb3eb52 3f8d478c", + "00000000 3e849c7a 3ef47a3a 3ef35456 be0fdec6 3f065a8b 3f281014 -> 3e849c7a 3ef47a3a 3ef35456", + "3f000000 be697cad bd5715c7 bd5715c7 3e800000 3e800000 3f800000 -> 00000000 3daf57d4 3effffff", + "3f800000 be4e114a 3f476014 bda2fa26 3e9ef41b 3e6d3efa 3d8dc3e2 -> 3e6fca16 3f264d53 3a2ced80", + "3fc00000 3e5b6ce5 3ea26b35 3e5b6ce5 bdb95e2c be4466e8 3e9fb5b7 -> 3e0bfb2b 3e59251b 3ef69bba", + "bf000000 3f8e89b7 3f034ea0 3d34984f 3f71f92d bde47896 3f70facd -> 3fd8c5ce 3f02f02e 00000000", + "3e800000 3ed29cc3 3e2342bf 3f3c6c13 3ee45ae3 3f3ff59f 3f636b9d -> 3edcbbe3 3e930152 3f219575", + "3f400000 3f706b94 3f0d3c6f 3f0d3c6f 3c6364ba 3d41851d 3d41851d -> 3f6e146e 3f0c4c4c 3f0c4c4c", + "40000000 3f5e7c5e 3f595298 3f8085f5 3ec23f8c 3ea23e32 3e8879c4 -> 3e9e31ec 3ed0354c 3eeee8fc", + "00000000 3f5a555c 3f4f9060 3f67a231 3f9bb6a7 3f7a2e70 3f7a2e70 -> 3f5a555c 3f4f9060 3f67a231", + "3f000000 3eee4e03 3edaa55d 3f7b832e 3dff768f 3f0019d9 3f9971af -> 3ef08312 3eed5674 3ecee55e", + "3f800000 3f032600 3f032600 bdd2baf2 3f6cb183 3f358a6c 3f381723 -> 3efaa726 3efd5db8 3f43a220", + "3fc00000 3f0dbb9f 3f0dbb9f 3f357588 3f8effbb 3f99daaf 3f01c90a -> 3ebf69c3 3eb86cdf 3ec84dd2", + "bf000000 3e38f1a8 3e38f1a8 3f2782a2 3f516126 3f02733b 3f217325 -> 00000000 3c924940 3f406d8f", + "3e800000 3f02fce8 3e8a0742 3f616c11 3f9fa2db 3f827073 3f7b9646 -> 3f011fee 3ec62365 3f318cff", + "3f400000 3f78a54c 3f773ba7 3df1adab 3eb4ca33 3eb4ca33 3f5a9df7 -> 3f38beaa 3f381490 3f1b799e", + "40000000 3f6ac031 3f7ba0ff 3eb98b6d 3f2c345b 3e9f49e6 3f188eb9 -> 00000000 3ec38f46 3f30beb6", + "00000000 3d43268f 3ec771db bde06278 3f2b846f 3f2b846f 3f68e422 -> 3d43268f 3ec771db 00000000", + "3f000000 be084170 3f36bf4c be084170 3e7269b5 bd1c53b1 3e8f91ea -> 3c89a790 3f38d634 3d361658", + "3f800000 be49066c be7bef3a be7711e9 3f429a00 3da1562d 3f3fa69f -> 3f5cc04b 00000000 3f5e5dbc", + "3fc00000 3d71c8db be65f0c8 3f1324d9 3f8945ea 3f8945ea be5bc0e5 -> 3fbd27ed 4006d222 3f1f780e", + "bf000000 bdb58bb6 be560f5a 3ef4d09f 3edff279 3f535169 3edff279 -> 00000000 00000000 3eefec30", + "3e800000 3f617015 3f617015 3f9eb248 3f9e9890 3f757a19 3f757a19 -> 3f2512d7 3f32b8b6 3f6296c7", + "3f400000 3f42d8d8 be16efc7 3e59fac7 3ec46619 bc755470 bc755470 -> 3f1c6255 00000000 3e53602f", + "40000000 3f5c14cb 3e61d112 3e9ffac9 3e800000 3e800000 3f400000 -> 3f000001 3effffff 3f600536", + "00000000 3f34b171 3ed4730f 3f34b171 bcdfcd43 3ec461b4 bcdfcd43 -> 3f34b171 3ed4730f 3f34b171", + "3f000000 be783502 3e8c8f84 3eb189f3 3f3139eb 3f3139eb bdade548 -> 3e8b09d1 3edc7a68 3eaae072", + "3f800000 be244b96 be244b96 3e751874 be5d28a5 3f5074f6 be5d28a5 -> 00000000 3f6a464c 3e01ce52", + "3fc00000 bdf9ef3b be532b24 3f773456 3f80c87d 3f5f3a51 3e70982c -> 3fe0b40a 3fd2135a 3f232e64", + "bf000000 bdf56d21 3ef98e4d 3e24a530 3f000000 3f800000 3f000000 -> 00000000 3ef31c9a 00000000", + "3e800000 3f1fcde9 3f1fcde9 3f71a1a5 3e892bd4 3f60e29d 3f6588b8 -> 3f1b8b40 3f11d5bf 3f3eb081", + "3f400000 3eb700a8 3edeeb55 3e8543f2 be218382 be218382 3f09754f -> 3ea5bb60 3ed717b6 3ee81e44", + "40000000 3d59ce50 3eb8aff5 3ecaa565 3f56c75d 3f56c75d 3f91651c -> 3fc6be4c 3f5400e0 3f5e8844", + "00000000 3f64a32e 3f64a32e 3f8ef1d7 3e65da0a 3dfd83e7 be13cf77 -> 3f64a32e 3f64a32e 3f8ef1d7", + "3f000000 be4dbbae 3f95414d be4dbbae 3f301eb0 3f84dd45 3f84dd45 -> 3e9005b1 3ef30a52 3f06d1a6", + "3f800000 3e6453df 3e6453df 3f802fd1 3f8d8b67 3f8d8b67 bda90d91 -> 3f55ed3f 3f55ed3f 3f8ac88f", + "3fc00000 be134bbc 3f77129c 3f77129c 3f64ffb8 3f336739 be2ea6d1 -> 3fcabf4c 00000000 3f99ffe6", + "bf000000 be35ff59 3ea031bd be35ff59 3f127f70 3f41e7b4 3f127f70 -> 00000000 3e2f410d 00000000", + "3e800000 3f9ffe04 be196683 bca50ff1 3f79021c 3e45906e 3e45906e -> 3f629d2c 00000000 3cf5fd37", + "3f400000 3f89dd4b 3f700455 3f5bf249 3f8a9458 be0a21c8 3f179db5 -> 3e0f4820 3f835760 3f0a4375", + "40000000 3f1fee3a 3cf7ac6b 3cf7ac6b 3f1a8dac 3cccaf28 3cccaf28 -> 3ea5a4a0 3d9e1278 3d9e1278", + "00000000 3f7549fe 3f86cd09 3f7549fe 3ea2be4b 3ea2be4b bdfe1141 -> 3f7549fe 3f86cd09 3f7549fe", + "3f000000 3d7ba13b 3f8a94c6 3f0c6c12 be3b2636 be3b2636 3e8f2a5e -> 00000000 3f98363a 3f08f2dc", + "3f800000 bd83ae1a 3f873206 3f873206 3e6bb712 3e226212 3f295139 -> 3e482fc3 3f613b1e 3ea41330", + "3fc00000 3dea32e1 3f7abbd7 3f7abbd7 be0331e3 3f92e72a 3e525b1c -> 00000000 00000000 3f2f1882", + "bf000000 3f2af1bc 3f037d7a 3cafeb29 3e21cf81 3f47c4f7 3f3ffdba -> 3f31baf2 3f0636b4 00000000", + "3e800000 3e81a9b3 3ec6dca0 3f620ce5 3d988d9d 3f458340 3f458340 -> 3e865e45 3edce762 3f3c39cc", + "3f400000 3f8af26d 3f54de62 3f54de62 3f91d02b 3e9ae06f 3e9ae06f -> 3dae1a90 3f2e5c40 3f2e5c40", + "40000000 3f110dcd be383661 3f2f6ae4 3f297caa bd80e67d 3eedc51a -> 3ec7c84a 00000000 3eaeabe8", + "00000000 be083b2c 3e92bc14 3d66d8cf 3f22cb0a 3e333c27 3f6f9732 -> 00000000 3e92bc14 3d66d8cf", + "3f000000 3cb9385c 3cb9385c 3f115007 3df62b51 be1fbaf6 3f15ee32 -> 3da3d2e4 00000000 3f072c56", + "3f800000 3deb9b4c 3e8b6a3e 3e8b6a3e 3f618c22 3f43ef4a 3df7a484 -> 3f4b1a6e 3f1ef02a 3ea79c18", + "3fc00000 3f8f7794 3f8f7794 3f1f2fe0 3f0418c8 3f0418c8 3e347600 -> 3e239c3c 3e239c3c 3f0eb2d8", + "bf000000 3f952d65 3f878394 3f878394 3f6ff6ca 3f6ff6ca be589d4c -> 3fe504e4 3fca8c5c 3f70c5ad", + "3e800000 3b3411e4 3f2cacec 3f2cacec 3f92041f 3f3859f0 3f3859f0 -> 3e929ed9 3f1c96ee 3f1c96ee", + "3f400000 bde8ae5b 3f80c295 3f9ff32e 3f8f34ed bb66d4f8 3f601bb4 -> 3f6a8929 3f811a2c 3e87d1bc", + "40000000 3f79aebc 3f79aebc 3ebb5dd2 3efe41ea 3efe41ea 3f6a2c35 -> 3cff2a80 3cff2a80 3f5b3f19", + "00000000 3f8ee273 3f6ca311 3e53c0f0 3e6bf6ed 3f96387c 3f96387c -> 3f8ee273 3f6ca311 3e53c0f0", + "3f000000 bdd15cde 3f2ed1a9 3f2ed1a9 3cc385ab 3f80e065 3ee598b5 -> 00000000 3eff5bd9 3f19d2ec", + "3f800000 3ea1d592 be6a0341 3f9e1f28 3f7aef3d 3f43bed7 bd1b7681 -> 3f2d3838 3f62b57e 3fa54436", + "3fc00000 3e89e068 3ede7f42 3ede7f42 3f56a89f 3f56a89f 3f6a85ff -> 3f598288 3f196329 3f1d4974", + "bf000000 3f690857 3f00fdc3 3f1190b1 3ebade37 3f1e2c35 3f2002bc -> 3f87aefa 3f019a8d 3f1c8b50", + "3e800000 bd52b830 bdf69cc8 bdf69cc8 3f741f97 3f9e4d78 3f741f97 -> 3e588fbc 3e86c620 3e339c2c", + "3f400000 3e87807b 3f9e11fd 3f4b65aa 3f800000 3e800000 3e800000 -> 3f1e1fe2 3f75967c 3f2f1f8a", + "40000000 3f2b3ec7 3f2b3ec7 3f914ae5 3eaab02a 3f84eb8c 3e4ebe54 -> 3ee327c2 00000000 3f1f4862", + "00000000 3e97565b 3f971007 3f971007 be442d8e be5b972c 3f6c5288 -> 3e97565b 3f971007 3f971007", + "3f000000 bd21e586 3f3bd24e 3f3bd24e 3f283626 3f131529 3f14ccae -> 3ea14591 3f19739a 3f190ce4", + "3f800000 3ef36ff5 3efa0685 3efa0685 3d1c4f12 3e8fa154 3dc32152 -> 3ef4656b 3efd60a4 3efb29fa", + "3fc00000 3f7c43eb 3f7c43eb 3f8eca72 00000000 3f800000 00000000 -> 3f7c43eb 00000000 3f8eca72", + "bf000000 bd1de4b6 3f979242 3f979242 3eb14a18 3f88a1aa 3f353afb -> 00000000 3ff50c42 3fd590d8", + "3e800000 3f1f2786 3f06d072 3e2403b8 3e7694b4 3c7a7de3 3c7a7de3 -> 3f1b6744 3f06c31c 3e26acb7", + "3f400000 3f6795ad 3eabe4f1 3e9b85ab 3f800000 3e800000 3f400000 -> 3e986a52 3ecb6f16 3f0647a6", + "40000000 3e832cda be58d5ac 3e832cda 3f0863af be01fdd9 3f41ca51 -> 3f4697fb 00000000 3f7e9219", + "00000000 3db76ce9 3f6c4a11 3f9d27be 3f9766e5 3f7657d5 3f16871a -> 3db76ce9 3f6c4a11 3f9d27be", + "3f000000 3f64c0e1 bdcb9a93 bdafe2ab 3f06315c 3e894751 3de62202 -> 3f2ff07e 3d7b168e 00000000", + "3f800000 3f3579cd 3e08651f 3ea8fcba 3e064bc6 3f0d009a 3e064bc6 -> 3f277302 3f0989e0 3ebfcf76", + "3fc00000 3f8fa8bc 3f4e765f 3e75ffb0 be532483 3f8ef913 3f8cfe18 -> 3fc0ef50 00000000 3f8ca01b", + "bf000000 bd76ab9f 3f751edc 3f751edc 3f9f6a54 3f9f6a54 3ed9d318 -> 00000000 3fc37e3e 3f93795d", + "3e800000 3e533d90 bdba4167 bdba4167 3e61fe8b 3f8c39bf 3f0ba947 -> 3e746dce 3e6e55ae 3d8fdf7d", + "3f400000 3eb51b4c 3de35ff2 bd0b5318 3f4202bc be3096b3 3f2479bf -> 3f051f3c 3c2a76a0 3ef614e5", + "40000000 3ecc4f02 3ddfe055 3e0fc0a4 3f4f5f8a 3f4f5f8a 3e22d593 -> 3f39e653 3fb00712 3ebcfdfc", + "00000000 3d869d0b 3f00da8f 3f00da8f 3e1433f6 3f0de7c4 3dc3a524 -> 3d869d0b 3f00da8f 3f00da8f", + "3f000000 3ee8b037 3eba2aee 3eba2aee 3f000000 3f000000 3f000000 -> 3ef4581c 3edd1577 3edd1577", + "3f800000 3f978bd8 bd5a4eae be37e71a 3f8fe0d2 3f197bb5 3f0111f6 -> 00000000 3f1c331a 3f01745e", + "3fc00000 3ede5152 bc59f848 3ede5152 bccd1ef0 3db7645c 3db7645c -> 3edbc99c 3dff2947 3ee75db8", + "bf000000 3e61522a 3f69850a 3f55a633 3f6826c6 bde229f8 3f6826c6 -> 00000000 3f5dddf2 3f91a8e5", + "3e800000 3e844557 3e643953 be4956e3 3d79237f 3f2e6c05 3ea49713 -> 3e8808a5 3ea272db 00000000", + "3f400000 3e311078 bd339225 3edb0ece 3f800000 3f000000 3e800000 -> 3f29ddf1 3eba636e 3ee8e941", + "40000000 3e1e2684 3f8e7221 3f8e7221 bdaea288 3eccf5ca 3e61b44b -> 3d15d51c 3e06acd8 3f129124", + "00000000 3e883fed 3f882e95 3f882e95 3f65411b 3f5804cb 3f9e7560 -> 3e883fed 3f882e95 3f882e95", + "3f000000 3ef39df7 bc587ded be3309f4 3ee0db93 3ee0db93 3e7aba91 -> 3ef90e2a 3e5944f3 00000000", + "3f800000 3f244268 3f6244f9 3f244268 be2afa9f be5dddd3 3e848389 -> 3f305e34 3f866d29 3f117d88", + "3fc00000 3f9729b0 3f9729b0 3f9425bd 3f0051e7 3f5a039d bd72487e -> 3e20bc00 00000000 3fa31465", + "bf000000 3f4df15b be30a04b 3f4df15b 3d55e9b2 be02d1e4 3d55e9b2 -> 3f52036a 00000000 3f52036a", + "3e800000 3f17ee7c 3f317aa1 be57f7ed 3f9073fa 3de1f9f6 3e85ada8 -> 3f0a6d7e 3f2ebfd0 00000000", + "3f400000 bdb465ef 3ef38845 bdb465ef 3f9f9008 be4d7988 3f9f9008 -> 3f817ace 3eefc798 3f817ace", + "40000000 3f4a8aa9 3f08398b 3f227b7a bdbcea93 3f06e521 bdbcea93 -> 3f660bbb 3eedc73a 3f2f349e", + "00000000 3e24857c 3e24857c 3ef1ad12 3f2bf570 3f70a6dd 3f70a6dd -> 3e24857c 3e24857c 3ef1ad12", + "3f000000 3f67c5f9 3f9c3f3b 3f9c3f3b 3f8fe63a 3f4e7df7 3f11d15d -> 3ee6384d 3f23adeb 3f4f67f3", + "3f800000 3f420440 be12413b 3eb495f4 3e548170 3e548170 3ee0fec9 -> 3f269dcd 3dfde862 3ef6ddcc", + "3fc00000 be49015f 3eb7ce27 3f2612c9 3f0f4009 3f07037b 3e58e4a7 -> 3f78fb3e 3f1503fa 3f0de166", + "bf000000 bca0ab97 3e9c9bb1 3eee81ac be000f06 3f6d2023 3f8b881f -> 3d39d428 3e0116b3 3edb6fe2", + "3e800000 3f4eb784 3ee57377 3f5d9008 3f3391b4 3edd6822 3f3d62a6 -> 3f331bf4 3eeb30fe 3f3af456", + "3f400000 3efbc463 3f7c9260 3f5d7401 3ec5c5c9 3e373a67 3ef46980 -> 3efe383f 3f5b22fc 3f1a8931", + "40000000 3f8cca9a 3edd6d1b be7fb7fd 3e842157 3f1f16e5 3e842157 -> 3ef616ac 3f19af34 3f06316e", + "00000000 3f18b19d 3f1c692b 3f18b19d 3f9bb0dd 3f25fb6d 3f8e50c0 -> 3f18b19d 3f1c692b 3f18b19d", + "3f000000 3f705c33 3f705c33 3e146c7c 3f7bb659 be0b676c 3e7e8616 -> 3f01e1c4 3f7fa810 3e6ecb2f", + "3f800000 3f8eb18e be145f76 3f357acf 3e2e40fa 3f407fee 3e2e40fa -> 3f67d274 3f5330ee 3f23474a", + "3fc00000 3f780b0a 3f5dc4cd 3f88d5f0 3f2aaaab 3f2aaaab 3f2aaaab -> 3cfe9e60 3e08eccc 00000000", + "bf000000 3df3ba54 3df3ba54 3f2c1a67 3e7bad05 3f7bc58e 3f8cb695 -> 3ccfd1a0 00000000 3f5c9632", + "3e800000 3f933e8b be64876e be64876e bc22bada 3f942ce7 3f83d680 -> 3f93a860 3e4818c2 3e18d65a", + "3f400000 3efce360 bca81dad 3f1f77c4 3f973190 3f973190 be6a55f9 -> 3f01336c 3f66d85d 3f2a4508", + "40000000 3edd53dc 3f72aa2a 3edd53dc 3f51ab8c 3ea02ad9 3f9bb332 -> 3f277578 3ec65e24 3f4303ea", + "00000000 3ed7a507 3d86082d 3f93ea8f 3f96c5ac 3da7dac2 3f63b228 -> 3ed7a507 3d86082d 3f93ea8f", + "3f000000 3f4742ec 3f666237 3f1ce23f 3eb79dc0 3bfa4599 be4bcb9a -> 3f2db48c 3f659a08 3f22a1d7", + "3f800000 3f7d9a5b 3f86de24 3f86de24 3d8ce6a9 be0478dc 3d8ce6a9 -> 3f6c51f6 3f993424 3f7a3b9e", + "3fc00000 3f6a2e8f 3f21a7e0 3f413ce9 3f15121d 3e3dcaff 3f771a02 -> 3e42c2e4 3f0ef128 3c8a7720", + "bf000000 3f9cee3a 3e2f04d0 3d960a1d 3f859841 3f38ec96 3f38ec96 -> 3ffdec4c 00000000 00000000", + "3e800000 3ecd9d03 3ebe013f be439b75 3f4ffd91 3e9d6adc 3e9d6adc -> 3ee214fc 3ec82671 00000000", + "3f400000 be697e34 3e9961d8 3e004d7c 3f4efded 3f90d7af 3f90d7af -> 3f27ab13 3f23c80d 3f42e522", + "40000000 3e75d463 3ef277bd 3d9173ca 3ec285ed be2801c4 be2801c4 -> 3f22953e 3ee99639 00000000", + "00000000 3f814ec4 3eabfada 3e930cc6 3f398185 3d9a9ba0 3d9a9ba0 -> 3f814ec4 3eabfada 3e930cc6", + "3f000000 3f293200 3e6c70c8 3e6c70c8 3f400000 3f000000 3f400000 -> 3f0a4c80 3ebb1c32 3edd8e19", + "3f800000 3eb4db2d 3eb4db2d 3f9932fa 3f59ea89 3e2cdd2e bdf6ad99 -> 3f1a64a6 3ece3a02 3faeafd8", + "3fc00000 be6bed7c 3ea3e29f 3a661204 3e28392c 3e996c15 3e28392c -> 3e04aeae 3ef6b14c 3e7cca70", + "bf000000 3db6b66c 3f0e8177 3db6b66c 3f1c3e0d 3f6f0d78 3f84f0cf -> 00000000 3f1c0d18 00000000", + "3e800000 bd94e8fa bd94e8fa 3f919937 3f7f79ee 3f8c2040 3e7f03fd -> 3e5a2c31 3e768d19 3f87701b", + "3f400000 3ea461ba 3e7c7bf5 3f814984 bdc34e20 bdf58dbd bdc34e20 -> 3e9746b1 3e4dcf82 3f8aa050", + "40000000 be2134d8 3f3b1dcf 3f9623c9 be439a6e 3f93b25b 3f3f88ba -> 00000000 00000000 00000000", + "00000000 3e84e74a 3d206660 3f379329 bc802354 be041f5c be041f5c -> 3e84e74a 3d206660 3f379329", + "3f000000 be0a4471 3f648add 3ef7d656 3f04ea80 3e37b2af 3e37b2af -> 3e475a81 3f528180 3ef94d35", + "3f800000 3f12fe4b 3f9445d5 3f12fe4b 3db37b5d be6b214a 3dc0da18 -> 3f0faa0e 3fbaf95d 3f0f6a91", + "3fc00000 3e0622c7 3ecf63dc 3ed7b4b8 3f8750df 3dd0c0bc 3f41ee41 -> 3fa6909f 3ede4129 3f19a3be", + "bf000000 3ea0885c be1882e8 be6ce7db 3b3b0f73 3b3b0f73 3e08edbd -> 3ea0429a 00000000 00000000", + "3e800000 3f8c9f1f 3f8c9f1f 3f82468f bd81b39b 3e419991 3f28aeab -> 3f8f0c3e 3f8560e1 3f58e198", + "3f400000 3f3f13b4 3e2ae48a 3f3f13b4 3f85a0ef 3f0b059b 3f0b059b -> 3eb89a13 3ee0604f 3f0bb216", + "40000000 3ebf8cd7 3f202b7a 3f28771b be1256a2 3f3d0948 3f3d0948 -> 3e9ab559 3e824cd8 3e43c60c", + "00000000 be3fccec 3eaaa259 3dbcd9c5 3f9ddc40 3eebcfb4 3f9ddc40 -> 00000000 3eaaa259 3dbcd9c5", + "3f000000 3f807f41 3d42c746 3d42c746 3f17c9d9 3f1bff28 3f9ec049 -> 3f3482af 3ea581f8 3f1bd394", + "3f800000 3ed411a2 3ed411a2 3f1e99e7 3f5ddb83 3f9191f4 3f96e2bb -> 3f101b44 3f1bfeee 3eace990", + "3fc00000 3f9464f2 3f9464f2 bdd31ecc 3e800000 3e800000 3e800000 -> 3f2a3279 3f2a3279 3eb2ce14", + "bf000000 3ef71982 3ee69ff4 3ee69ff4 3f579302 3f21d0e0 3e683159 -> 3eef9ad1 3ed695d8 3ee0def8", + "3e800000 3f96ae96 3da151d5 3f4b85fb 3f15d7e4 3e3e72cb 3ec37624 -> 3f7aa075 3df18ad8 3f3d1b80", + "3f400000 3f931455 3e76c924 3f7d08a2 be34a539 3f66d382 be4f750f -> 3fa9104d 3f175f31 3f9183e8", + "40000000 3d3ed2f1 3d3ed2f1 3f8365bf 3edab263 3edd58aa 3d8a56e1 -> 3f523eff 3f54a613 3f625fc6", + "00000000 be44d9d1 be3e1841 3f579bd0 be07df18 3f82ace6 be2b2c74 -> 00000000 00000000 3f579bd0", + "3f000000 3d37bffa be762c74 3d37bffa 3f400000 3f800000 3e800000 -> 3ec5bdff 3efffffe 3e2273fe", + "3f800000 3bf28a8c 3bf28a8c 3f9ce0af 3f00d8a7 3dec6688 3f08f593 -> 3f00d572 3df80f4e 3ee5ff10", + "3fc00000 3dcc3f51 3dcc3f51 bd93e186 bd8cbd15 3f958dba 3f17dcae -> 3c8cfd00 3fc059d3 3f723463", + "bf000000 3f3a05f1 3ecd30be 3ecd30be 3e800000 3f000000 3f800000 -> 3f48876e 3eb3c91d 3e9a617b", + "3e800000 3e84e729 3f4fb04a 3eb4a089 3f48ad75 3f235130 3f235130 -> 3eb52691 3f364508 3eccab61", + "3f400000 3f94b73d 3f148bc3 3f8d9bb5 3f381f20 3f8c3219 3f8c3219 -> 3ee548f0 3ee594cc 3de1ab10", + "40000000 3f86f393 3f20cbd6 3f20cbd6 bcc1eaf0 3f95add6 3f569973 -> 3f8dab6b 3cec9240 3e4b4e78", + "00000000 3eb0a2f2 be55e6bb 3eb0a2f2 3f65f149 3f6b0bb8 3f65f149 -> 3eb0a2f2 00000000 3eb0a2f2", + "3f000000 3f534d7e 3f797774 3f797774 3e84b344 3e84b344 bdff1691 -> 3f3db659 3f59fc20 3f844c45", + "3f800000 3df855e0 bcc56584 3df855e0 3ed071fd 3f07e35f be77b3c8 -> 3edbfa5e 3f0844b1 00000000", + "3fc00000 3ebdf133 3f95ffe5 be6c6673 3efe8c99 3efe8c99 3e3954b1 -> 3f103bd3 3e2dd998 3e29f3c5", + "bf000000 bd5d0398 3f571beb bd5d0398 3f000000 00000000 00000000 -> 00000000 3f571beb 00000000", + "3e800000 3e9f2d32 3e9f2d32 3e3d0c6c bd8a6c42 be04e1c8 3f18703a -> 3e9be789 3e98e4ef 3e8e99c3", + "3f400000 3f982248 be11651c 3f77d103 3f724dde 3ef65f96 3f8b608e -> 3e580bb8 3ea48e2e 3e5077f0", + "40000000 3f89d99c be69f712 3e125efc 3f879338 3eb4394b 3f879338 -> 00000000 3f4c1690 3fd3ee0c", + "00000000 3f8c0b86 be6fcc73 be6fcc73 be13c810 3f88e4bd bd86316d -> 3f8c0b86 00000000 00000000", + "3f000000 3f66ad55 be3853f1 3f4a08a8 3ea4c2aa 3f0223d2 bda3d4e0 -> 3f45a2c6 3e29a81f 3f4ff4ca", + "3f800000 3e05bb7f 3f11f416 3f29547b 3f3cea5c 3f41ccb6 3e941d48 -> 3f2d012d 3eed8aac 3f116aea", + "3fc00000 3f2184ba be7e60b1 3f60c2fb 3f13152c 3f3fffec 3f03a9c0 -> 3ecf7d89 3fb7bf05 3e96ee5c", + "bf000000 3f648940 3f9ba518 3f648940 3e800000 3f400000 3f000000 -> 3f7dab90 3fe060ea 3f8b66f0", + "3e800000 3f81e392 bd1ae507 3f81e392 3f1c0b82 3f0cd0b0 3f00c80c -> 3f5b9d81 3de17bbe 3f62a1de", + "3f400000 3de7cb46 3e948fa1 3de7cb46 be4be13f 3ee3c569 3e40055a -> 00000000 3edc4140 3e635027", + "40000000 3f54c548 3e1ced83 be520cf7 3f0eb868 3e0ffcd5 3f0eb868 -> 3dbdda80 3eb251c2 3faf0409", + "00000000 3e94ff9c 3f5c7369 3e94ff9c 3f453997 3e6eb082 3f453997 -> 3e94ff9c 3f5c7369 3e94ff9c", + "3f000000 3d99c781 3f5318fe 3f5318fe 00000000 3e800000 3f000000 -> 3d99c781 3f3e52be 3f298c7f", + "3f800000 3f96f304 3f755fef bd09d3b8 3f73fea4 3f9aa4e0 3f73fea4 -> 00000000 00000000 3f7bcd0a", + "3fc00000 3f723f3b 3ef7491b 3f8a27da 3d9e0c99 3f807d3c 3f5c0066 -> 3f57cbfe 3f08c3b0 00000000", + "bf000000 be0ffaaa 3f78bf06 be0ffaaa 3f697dbd 3f169129 3f697dbd -> 00000000 3f9fe1b6 00000000", + "3e800000 3f08bdb5 be2f5bdc be2f5bdc 3f452656 3f586129 3f586129 -> 3f056010 3de642a8 3de642a8", + "3f400000 3f9a3995 3f9a3995 3eaacdc2 3f800000 3f400000 3f000000 -> 3e1719a8 3ed2e334 3eeab370", + "40000000 3ee59851 3ee59851 be3f0f16 3ecd7f05 3f88c8cd 3f93b185 -> 3f07fe4a 3f2b3b54 403edda7", + "00000000 3f969f89 3f969f89 3f48eaf5 3f927a38 3f1416e5 3f30d25f -> 3f969f89 3f969f89 3f48eaf5", + "3f000000 be6a6ce2 3d551472 3d551472 3f854768 3df84dde 3eb1f0e7 -> 3f07b22a 3dd9c65e 3e54b28e", + "3f800000 3f0129aa 3f37e018 3f0129aa be45d749 3dddff03 3e38def3 -> 3f019caf 3f2bc310 3f00be30", + "3fc00000 3e9199ab 3e9f32cd 3e9f32cd 3f400000 3f000000 3f000000 -> 3f44fff6 3f18334c 3f18334c", + "bf000000 3f7bfba4 bdc82795 bdc82795 3f82aa6c 3e926468 3f811b9b -> 3fbd4625 00000000 00000000", + "3e800000 3e6d8fef 3e6d8fef 3f02d765 3f78f0f7 be64c41e 3e5700d9 -> 3eb97fb0 3e4ee82d 3f028b08", + "3f400000 3e0bd62b 3ee63c06 be34d32a 3f000000 3e800000 3f000000 -> 3ed17ac6 3eefe584 3ea9659b", + "40000000 bcb02d3b 3d93861d 3f9bc592 00000000 00000000 00000000 -> 00000000 3d93861d 3f9bc592", + "00000000 3f8b2106 3f9a4dd0 bd74c1a2 3f2bf634 3f84e587 3f2bf634 -> 3f8b2106 3f9a4dd0 00000000", + "3f000000 bd0dcc20 3f9c1937 bd0dcc20 3dac073d bcc71e9f bcc71e9f -> 3c289108 3f9e564c 00000000", + "3f800000 3d57111d 3f70af22 3edbdd2a be3b88af be3b88af 3eebf269 -> 00000000 3f8cfa97 3efd2b5d", + "3fc00000 3d53c065 3e7aa1f4 3e7aa1f4 bd11931b be6971eb 3f68f8cf -> 3b7f78c0 3d8fc18c 3f710cef", + "bf000000 3f056739 3f056739 3f0b4e37 3f2d3072 be553b07 3f86fccd -> 3f090f00 3f044730 3f173a6e", + "3e800000 bd294896 3e74eaa7 3f226ffc 3f95d035 3f95d035 3f8c5310 -> 3e8d0940 3ec89ba6 3f0f8f92", + "3f400000 3f5bdf7e 3f8d4b61 3dc1f801 3f780a54 3f509eb9 3f509eb9 -> 3eacb258 3ebb3e82 3f1712b6", + "40000000 3f19f14e 3e93def0 3f298320 3f331813 3f506f48 3f331813 -> 3ea2b148 3f7a0334 3e556320", + "00000000 3edd9509 be6000cc be1d6db8 3ee293cd 3f71b96e 3f71b96e -> 3edd9509 00000000 00000000", + "3f000000 bc42871f 3f14eb40 bdf8359a 00000000 3f800000 3f800000 -> 00000000 3f000000 3f000001", + "3f800000 3ee5d02a bdc7d85c 3f9f8850 3edea5cd 3eccb6c1 3ed2e4f4 -> 3efc969c 3ec2b46f 3f21aa1c", + "3fc00000 3f8c85fa 3f63da0d 3f63da0d 3f88fee3 3f0b801d 3f0b801d -> 00000000 3e813bea 3e813bea", + "bf000000 3f24837d 3ec87c24 3eb14413 3f46ca4d 3f46ca4d 3f262014 -> 3f40de0a 3e9d6048 3e7c58b1", + "3e800000 be792a9b 3ec199e4 3ec199e4 3f9de226 3f9614ec 3f9de226 -> 3e5c44ef 3ee62ed2 3ee815a2", + "3f400000 3ec96f9e 3ec96f9e 3f7c4f7a 3f0a27d7 3ec73b29 3f0a27d7 -> 3ef59b1a 3ee948c1 3f17ae30", + "40000000 3e482196 3f31885a be2999e4 3f800000 00000000 3f400000 -> 3fb4f369 3f31885a 3fea6678", + "00000000 3ddfe737 3ddfe737 bcd34801 3f89764d 3d0bb032 bddc016d -> 3ddfe737 3ddfe737 00000000", + "3f000000 3f3b7f1c 3f7717dc 3f93b0af 3f034b17 3f034b17 3e6d7f07 -> 3f1cfb9e 3f3a03b8 3f8047a9", + "3f800000 3e73dfc8 3d27f1e3 be58cfee 3ef61157 3f128fd4 3f64a16f -> 3efacc74 3f110a28 3f879f34", + "3fc00000 3e5578fd 3e125aac 3e5578fd 3eafb3fa 3eafb3fa 3f11b989 -> 3f0233cf 3f02b292 3f34d15e", + "bf000000 bd3f9d76 3f9d7389 3f9d7389 3f641819 3ec0b894 3ec0b894 -> 00000000 3fc0a08d 3fc0a08d", + "3e800000 3f424834 3f424834 3f28bcf4 3ca1028f be2e7234 3eb55a4b -> 3f41a174 3f47ed88 3f2185f6", + "3f400000 3e8960b9 3f776c13 3f984121 3f919444 3e6115da be024b97 -> 3f29dfbd 3f500c02 3fa9194e", + "40000000 be31ee98 3f99aa59 3f99aa59 3e800000 3f000000 3f000000 -> 3f000000 00000000 00000000", + "00000000 3f6898d5 3f392a95 3f3c879e 3f0b17ce 3f911b7f 3f9acba4 -> 3f6898d5 3f392a95 3f3c879e", + "3f000000 3f04baeb 3f914b0c 3f91e7f1 3e1e82e6 3f9a2715 3f4cae4d -> 3f03ff78 3ebd8fbc 3f20d6b2", + "3f800000 3f94f111 3e2651c7 3dcb7c83 3f400000 3f800000 3f800000 -> 3e2c3bb8 3f566b8e 3f66906f", + "3fc00000 3e9a3810 3ee60ba8 3e14dd7c 3f800000 3f400000 3f800000 -> 3f65c7f0 3f1038b7 3f9ac8a2", + "bf000000 3f9cb7f1 3f357ba3 3f9cb7f1 3e940651 3e940651 3f9026f0 -> 3fb78642 3f44f208 4002918b", + "3e800000 3e0833b6 3d62b711 3eb6aefa 3f86525a 3f807d46 3e083e38 -> 3ea6b0c4 3e8e9ada 3ebb8f96", + "3f400000 3f8589e6 3f14e90c 3f87f6bb 3f5a6c58 3f5a6c58 3dcfd6d3 -> 3eb22a70 3ef44c30 3f7a04a0", + "40000000 3f8426a0 3e9c7dce 3f6d530c be4f959a be0bcb72 be4f959a -> 3fbb69b0 3e4c4e10 3fa2fc8c", + "00000000 bd0e89a0 3eaa57c3 3eaa57c3 3e800000 00000000 3f000000 -> 00000000 3eaa57c3 3eaa57c3", + "3f000000 3ef87ce5 3e1555de 3e1555de 3f81a667 3eb95665 3f462f02 -> 3f000c65 3e8c4ec4 3ed70c07", + "3f800000 3f53d99d 3f788e7d 3e472d2f 3f2e82e3 3f926b31 3f1d972c -> 3ec3101c 00000000 3f12144e", + "3fc00000 3f8d7192 3f3ffbc0 3f3ffbc0 3f889274 3f166477 3f202aba -> 00000000 3e9e6fcc 3e8fc75c", + "bf000000 3f6472c1 3f48e4e2 3f6472c1 3f55e93b be4b9843 3f55e93b -> 3f9c30e0 3f3a66ac 3f9c30e0", + "3e800000 bb577b0e bb577b0e bcfad143 be63b725 be63b725 3ef1b423 -> 00000000 00000000 3dc1cccb", + "3f400000 3e8305b6 3f9f73d7 3f9f73d7 3f000000 3f000000 3e800000 -> 3ee0c16e 3f2fb9ec 3f7750cd", + "40000000 3f7b46d3 3f7b46d3 3f959215 3e800000 3f000000 3e800000 -> 3f000001 3c9725e0 3f000000", + "00000000 3f5d9259 be5f7774 3f5d9259 3fa00000 3fa00000 3fa00000 -> 3f5d9259 00000000 3f5d9259", + "3f000000 bdcb83b6 3dd46faf 3f9aaed8 3f400000 00000000 3f400000 -> 3eb347c4 3dd46faf 3f2d576c", + "3f800000 3d99bb31 3e38bff8 3e38bff8 3f81d0f9 3e11e21c 3e11e21c -> 3f6fdeef 3e8aff10 3e8aff10", + "3fc00000 3e846be8 3f6b4153 3f6bcc26 3f73ff35 3f9aceca 3f3abefb -> 3f72e31a 00000000 00000000", + "bf000000 3f754880 3f978228 3f754880 be6b9380 be764df4 3f61a444 -> 3f5a4d38 3f8275ba 3fae543d", + "3e800000 3eaebd8d 3f8ea77c 3f9e022a 3dc78b39 3e811e14 3dcced41 -> 3eb2b2fa 3f84bc93 3f994e1c", + "3f400000 3e9c2318 3f8d731e 3f7cc2d0 3f2c0644 3f20b26d 3f2c0644 -> 3f0065b2 3f090c72 3efe03cd", + "40000000 3e3b0093 3f18eee5 3e174925 3f000000 3f800000 00000000 -> 3f513fdb 3e54cd3c 3e174925", + "00000000 3ebd1052 3de5f59a 3d41ea64 3f8c325c 3f9f3455 3f160d05 -> 3ebd1052 3de5f59a 3d41ea64", + "3f000000 3f111e36 3f19e324 be6ad686 3f209a78 3f209a78 3f5ed81b -> 3f066100 3f09a58e 3ecfa2fb", + "3f800000 be53e103 3df45988 3df45988 3f15cd98 3e70452d 3f91e3e3 -> 3f1ed367 3e988e39 3f7cb2db", + "3fc00000 3f4e92f7 3c8b370a 3c8b370a 00000000 3f000000 00000000 -> 3f4e92f7 3f3dd322 3c8b370a", + "bf000000 3f0fa642 be7f1fa4 be7f1fa4 3dadd8d6 3f705070 3dadd8d6 -> 3f10fa56 00000000 00000000", + "3e800000 3f10e720 3f95206e 3f10e720 3e75066a 3f2ddbb3 3e75066a -> 3f0ee16c 3f7070e4 3f0ee16c", + "3f400000 3ef00846 3f1ef3e1 3f669270 3f000000 3f000000 3f000000 -> 3efc0212 3f07bcf8 3f19a49c", + "40000000 3f3c0efb 3e95a27c 3ea0a9c8 3f99aecc 3e974882 3e8d7632 -> 00000000 3f09ac87 3f050365", + "00000000 3e2a4822 be51805e 3f91a7e3 3f2303cf 3f931abb 3d59c1d8 -> 3e2a4822 00000000 3f91a7e3", + "3f000000 3f9cbc67 3f681d13 3f0652c2 3e30b3e0 3e30b3e0 3ef9493f -> 3f8cbbbb 3f5625ca 3f033e9c", + "3f800000 3f80905b 3f87970d 3f89ba7a 3f98daaf 3f80b321 3f80b321 -> 00000000 00000000 00000000", + "3fc00000 3f066f55 3f066f55 3f8f6981 bdfe910d 3f74b81c 3f601b59 -> 3f08d5a0 3ee7f633 00000000", + "bf000000 3f46370e 3f7ba6a8 bde4b111 be0887e6 3f30a71f 3f2a51a1 -> 3f3cda6d 3fa87cfa 00000000", + "3e800000 3ed6467c 3f2b6022 3ed00c59 3ef5cd20 3f467122 3ef5cd20 -> 3ee04a7a 3f1a9060 3edb8f00", + "3f400000 3f313354 bda7570b 3e831605 3ed664ac 3e6145d6 3e6145d6 -> 3f124c23 3de1ca25 3eac4e6b", + "40000000 bdacf9d7 3f748b30 3f4815ce 3f6c0f53 3f6c0f53 3f777f16 -> 40048ff0 00000000 00000000", + "00000000 3f88de59 3f3822e2 3f98a200 3e097f3c 3f1a1907 3e097f3c -> 3f88de59 3f3822e2 3f98a200", + "3f000000 be210701 3f5912e0 be46e3ee bd878ebd 3f9ab1cf 3f6d042c -> 00000000 3edad8e0 3ee5a455", + "3f800000 3f4511c7 3f744a9d 3d58a931 bddda258 3f3f0bf1 3f3f0bf1 -> 3f5404d0 3e8d70dc 3f386079", + "3fc00000 3f29820f 3f15c521 3f15c521 3e91ce2c 3ef7c5f6 3f3cb0d4 -> 3f060bea 3eec542a 3ecb436b", + "bf000000 3f8052a4 3f5952bc 3f8052a4 3f2cdaf8 3f2cdaf8 3dd4f798 -> 3fabc12f 3f8ad15c 3f8702f8", + "3e800000 3f4402d6 3f424574 3f424574 3f88ac2c 3f860279 3f860279 -> 3f1fb396 3f1f9476 3f1f9476", + "3f400000 3ec553d6 3f4d84de 3f89989a be0fce4a be0fce4a 3f0c41a5 -> 3eb8f7ca 3f5dd940 3f1a3a3a", + "40000000 3f4ccc65 3f4ccc65 3f614bd0 3f5b7070 3f5b7070 3ef493d7 -> 00000000 00000000 3e1d8bb0", + "00000000 3f624c9b 3dfe7004 3ec3fd52 3f16eb37 3f16eb37 3ef42a83 -> 3f624c9b 3dfe7004 3ec3fd52", + "3f000000 3f944b1c 3ee0016f 3edaab8f be1d49e5 3e015e7e be1d49e5 -> 3fa13db5 3ee40c34 3ed4efaa", + "3f800000 3e8bf21c 3f082378 3e8bf21c 3f400000 3f400000 3f000000 -> 3f1d0379 3ef7dc88 3f000000", + "3fc00000 3d25fd00 3e9252f2 3f9d634c 3f9dba4a 3f194d4c 3e0b8555 -> 3fde9a6a 3f2badca 3f6e6e46", + "bf000000 3f432f8c 3f432f8c 3dddd589 3f61bbee 3f61bbee 3f4ff47b -> 3f7e6da8 3f7e6da8 00000000", + "3e800000 3edc7832 3f3874d8 3edc7832 3f000000 3e800000 00000000 -> 3ee55a26 3f31663d 3edc7832", + "3f400000 3e94b242 3e94b242 3f90850c 3f8e3950 3e1274d7 3e1274d7 -> 3f23c4d8 3eabb780 3f7e7da0", + "40000000 3e35177e be24a4ab 3e35177e 3f67afd3 3e9db4fc 3f8cb606 -> 3fac6078 3f274283 3fcc8560", + "00000000 3f94dfd1 3f94dfd1 bdbb759d 3f800000 00000000 3f000000 -> 3f94dfd1 3f94dfd1 00000000", + "3f000000 3ea4e812 be352d1e 3e9cb982 be2fa3ab 3eb19346 3e8321fe -> 3e95482c 3d6cf178 3eb626a2", + "3f800000 be3a841d 3f552de9 3ec594b8 3df71293 3f75d374 3ec507ea -> 00000000 3e465d48 3ef28b15", + "3fc00000 3d981c94 bde9eb4e 3dae1e4f 3e6104f6 3f9142d9 3f9142d9 -> 3eb5b91b 3ffd0bd3 3fbfb96f", + "bf000000 3f36d586 3e172b87 3f94197e 3f7ac2cd 3f70197c 3f7ac2cd -> 3f6c8bc4 00000000 3fe67a62", + "3e800000 bb898f91 3f6e777c 3f671877 be52ade5 be52ade5 3e23535e -> 00000000 3f79d49e 3f5edfb2", + "3f400000 3eb41227 3eb41227 3ec296b3 00000000 3e800000 3f800000 -> 3eb41227 3ed08b59 3f0f5a54", + "40000000 3f2ccc33 3d2c3a47 3f77bfb6 3f400000 3f400000 3f400000 -> 3e199e74 3fb53c5b 00000000", + "00000000 3e745eef 3e0d42f5 3e0d42f5 3f04eeee 3f941200 3f1e0751 -> 3e745eef 3e0d42f5 3e0d42f5", + "3f000000 be7885dc 3f5a77fa be09a262 3f1e85de 3f4c2f86 3f4c2f86 -> 3e5e6a72 3f124f93 3ebe41cf", + "3f800000 3ef0d7f1 3ef0d7f1 be34c999 3f380e88 be66ed0e 3f9e27d8 -> 3f03519f 3eea01ee 3fbf66ed", + "3fc00000 3f305491 3f4fd7e6 3f184fa9 3e4b1654 3ebae898 3f825d19 -> 3f13931c 3ef0cd94 3e9c0fd1", + "bf000000 3f97f07c 3f257196 3f97f07c 3e8d8ca0 3f50ce2b 3f6b965f -> 3fb0405e 3f43fc08 3fe8dde5", + "3e800000 3e1b8f54 3ebbbf94 3f95f723 3f8a1beb 3bbb47bf 3eaf7078 -> 3eaded78 3ebbf182 3f873cb6", + "3f400000 3f6ed57a 3dbbac0e be76d749 3f000000 3e800000 3f800000 -> 3f1bb55e 3e7aa5c5 3f5edaea", + "40000000 3f5a2286 3ea4f9f8 3df04cbd 3ee72ba4 3e35d9c1 3e35d9c1 -> 3e5d65f8 3ee5a2a8 3ec74047", + "00000000 3d81f80e 3f815418 3d81f80e bb7f70ae 3dae1c6b 3dbcc08e -> 3d81f80e 3f815418 3d81f80e", + "3f000000 3f7fcc07 3f5afaaf 3f9cda43 3f4f4687 3f4f4687 3f9d9041 -> 3f1852d8 3f1150ea 3eaa37a2", + "3f800000 3ecc0b9b 3f06f2df 3f06f2df 3f86b2ba 3f53ac1d 3f53ac1d -> 3f1cb233 3ef6ea56 3ef6ea56", + "3fc00000 3f999412 3f9728bf 3f9728bf 3f8d3b70 3f702b5a 3f81fbbd -> 00000000 00000000 00000000", + "bf000000 3f6362fd 3f6362fd bdccf4f7 bd03aa78 3ef0500f 3f2fb939 -> 3f603120 3f890477 00000000", + "3e800000 3dc556eb 3f4b23d2 3efec29c 3f9172e8 3f3a9bb4 3d77b5c3 -> 3ea6c0ef 3f2fc0f5 3efecc35", + "3f400000 3f01a5c3 3f01a5c3 3e00c20f 3e707b19 3f53095b 3f53095b -> 3f011130 3eff3879 3f16a9ca", + "40000000 3f486c18 3f02d629 3f9efb03 3f800000 3f800000 3f800000 -> 00000000 3eeefb06 00000000", + "00000000 3f92e324 bd828e8b 3f8eed81 3ef40f88 3f0a454a 3f0a454a -> 3f92e324 00000000 3f8eed81", + "3f000000 3f57308a 3f73cb59 3f9b8fa1 3f8d475a bdea0e14 3f4d741e -> 3eede8f0 3f808390 3f24282b", + "3f800000 3d969238 3df7e0d6 bdcf5e51 3f180890 3f180890 3e89f40f -> 3f147fe0 3f123738 3e64188c", + "3fc00000 3f21a460 3e8b6e9c bc490753 3ed6c1b7 bdb45236 3ed6c1b7 -> 3eee9e29 3e594878 3f21e106", + "bf000000 3e911ccd 3f9e05ef 3f94340b 3f875492 3f6e8c5f bd6c38f2 -> 3d5eff54 3ff5a302 3f8f58e0", + "3e800000 3ea434b6 3ef964df 3e014b8e 3ee3e1fe 3f627216 3f838780 -> 3eb8a249 3efc50d2 3ea2f63b", + "3f400000 3f85596e 3f85596e 3dd17838 be23bd39 be23bd39 3f0a30d3 -> 3f95fba2 3f95fba2 3ed94042", + "40000000 3eed9175 3e52d343 3eed9175 3f7aad0e 3e62c723 3e8b4b55 -> 3f1ae18c 3eeecf84 3f00d02c", + "00000000 be2072d5 be2072d5 3dc21473 3f8028f2 3f8028f2 3f4e1496 -> 00000000 00000000 3dc21473", + "3f000000 3e8d2ec7 3e8d2ec7 3f9e7d71 3f025917 3f54ee16 3ec88d2b -> 3ec7a4fa 3eecaed4 3f72f4c7", + "3f800000 3eb779e4 3f968660 3f89774b 3e95d671 3e9bc0b0 3e95d671 -> 3ee1ecb2 3f43c3c7 3f3ceea4", + "3fc00000 3d8bbcbe 3eb0165b 3d3ceb57 3ed9c63a 3eabd946 3f2e407a -> 3f1e826a 3f0046d8 3f791303", + "bf000000 3f1fdbbc 3ddfa1af 3ddfa1af 3ec5cbfe 3e867fd6 3ea2cfc7 -> 3f2c2a79 3bd612b0 00000000", + "3e800000 3f11e90f 3f513490 3f4f79ab 3f9e5157 3f9659a8 3f26c54f -> 3f06d587 3f218353 3f359698", + "3f400000 3e98e8c4 3ef1ad6c 3f9699c4 3e5b74e4 3e5b74e4 3f30b238 -> 3eba0cc0 3ef6481e 3ef3c30c", + "40000000 3f4e7e36 3f986824 3f986824 3f600b4b 3f43c4c1 bd1417ff -> 00000000 00000000 3fa53144", + "00000000 be4cb50a 3f7dd971 3f7dd971 3f63d10d 3f63d10d 3f978c6e -> 00000000 3f7dd971 3f7dd971", + "3f000000 be1c5650 3f4518eb 3ec56497 00000000 3f400000 3f400000 -> 00000000 3f11463c 3ef15926", + "3f800000 3dfc3ef4 3e267d7e 3dfc3ef4 3ebfb6d2 3f7d3c80 3f7d3c80 -> 3ecf8cc8 3f548332 3f5e62e8", + "3fc00000 bd914ab9 3f95ff27 3be0ad1e 3ef144fb 3ef144fb 3e14c1d3 -> 3f3c771d 3e6364b8 3e6318d0", + "bf000000 3f2f6b5e 3f45a2fe 3f2f6b5e 3e36fe03 3f994622 bdc7097a -> 3f37e4b6 3f8c82fc 3f2acf97", + "3e800000 3ecc157f 3f060ad7 be1a4aee 3f88b988 3e98700f 3e211312 -> 3ee7cfb4 3f052492 00000000", + "3f400000 3f893c83 3f1b5aee 3f893c83 3e80b8da 3f5525cb 3e80b8da -> 3f5b3c52 3ef261c6 3f5b3c52", + "40000000 3eedb34c 3eedb34c 3f2a75db 3e9888de 3f746989 3eec6c63 -> 3f01c0f9 3f19caf6 3eb81132", + "00000000 3f4e2657 3f8678bc 3f5182ea 3f2ae563 3f391585 3d491db7 -> 3f4e2657 3f8678bc 3f5182ea", + "3f000000 bd4e4455 3e43cb3a 3e43cb3a 3f260ff4 3f260ff4 3ecfc8dd -> 3e9d010e 3ec87492 3ea20f4e", + "3f800000 3c4e1d75 3ea7edb5 3c4e1d75 3df52310 3df52310 be48bab3 -> 3e045de5 3ebd031a 00000000", + "3fc00000 3e9c61cb 3f8119be 3e9c61cb 3d8e9eb7 be1a00c5 3d8e9eb7 -> 3eb1319c 3f9e7900 3eb1319c", + "bf000000 3f8a7231 3f80d76a 3f80d76a be668507 3f05105c 3f05105c -> 3f735fbf 3fa28b79 3fa28b79", + "3e800000 bde7c8af 3f064a0a 3f30ac06 3e1287c2 3e1287c2 bdfea9c5 -> 00000000 3f05d6d8 3f33b2b5", + "3f400000 3e34a14e 3df64ee5 3df64ee5 3f825d4f 3f9d0b33 3f825d4f -> 3f2bb77a 3f51b13a 3f334ca2", + "40000000 3f89b0d8 3f960556 3f1d9b3e 3f880f40 3f410c85 3f1a7887 -> 00000000 00000000 3eac4bdc", + "3ebc40fd be45b2f2 3e2628fe 3e8d2dbf 3daf00ee 3daf00ee 3ea1d59a -> 00000000 3e3be457 3ea7de0c", + "3f0e731f ba7c5f5d 3eefad14 3e726cee bdd7360c bdd7360c 3efab55e -> 00000000 3eedc45e 3ec2a9fe", + "3f4fce75 3f9cdc38 3f626aeb 3f724f32 3f000000 3f800000 3e800000 -> 3f22f686 3e85468c 3f43ea15", + "3e37bdc3 3ecc5e25 3f93d858 3f93d858 3f64273f 3e8c1fc4 3f64273f -> 3edce1a7 3f8b9c37 3f720eab", + "3f6a4062 bcb420ea bdb7ac47 bddbc1ea 3e959cff 3f896247 3f7e2138 -> 3e83aa54 3f88c81c 3f7ef9a7", + "3e9b80b7 3f04a906 3f40da31 3f04a906 3f9275f5 3f9275f5 3ed7b2fe -> 3f016bd3 3f13c703 3f0377b9", + "3fb0f452 3f8aa52d 3f994e8e 3ea23cd3 3f6eb788 be7ebd9e 3ebce72a -> 00000000 3fd6bc0f 3f00f171", + "3f1b6504 3f426435 3f270313 3e79f35b 3e800000 3f400000 00000000 -> 3f2e3dc5 3f037db2 3e79f35b", + "3fa77a47 be3e070d 3f27e7e7 3e6dda0d 3efde633 3f093b29 3eb51252 -> 3f343ec7 3edfda7c 3ef5c848", + "bc9f16ea 3f26adfc 3f7dc671 3f26adfc 3e83f9ac 3eb09129 3f4847d0 -> 3f27111f 3f7f75b8 3f27dadf", + "3f9e9a1a 3f78e67a bc642c97 3d00da81 3e1654ac bd80f4ba bd80f4ba -> 3f4cea55 00000000 00000000", + "3f2bba73 3f8c98dc bd1335c4 3f8c98dc be38c0c1 3f7290ba 3f005fc6 -> 3f9f2363 3f253629 3f32210b", + "3eb156bf 3f66f6d6 3f14749f 3f66f6d6 3f000000 3f400000 3f800000 -> 3f434d0f 3f09d3f3 3f1fa348", + "3e962e98 bd30553e 3f4eaca6 be7cc451 3f8be729 3f8be729 3f886199 -> 3e9c3d3e 3f1c3a6c 3e614261", + "bee3ef27 3f055339 3e64c3b2 3f055339 3e7451e7 3e7451e7 be74e739 -> 3f0674d2 3e289850 3f0430ef", + "3f615bcf 3e461206 3e461206 3f6ec5a3 3ebdddc1 3f0daec6 3f0daec6 -> 3ec98434 3efbfba9 3f02d5b5", + "be0a3b6c be385b5f be385b5f 3f5736a6 3f0572c8 3d86c91a 3d86c91a -> 00000000 00000000 3f58c35c", + "3f6f11fd 3f5fd165 3f5fd165 3f119693 bdaf73dd 3f195f28 3f03506c -> 3f6f2653 3ee93329 3f00bce6", + "3f90fa4d 3f6062a7 3ec20bab 3ec20bab be6c698c 3f83b7cc be6c698c -> 3f896598 3f293ba7 3ea1a4e9", + "bca4a97e 3f891129 3f704a90 3f704a90 3f40acc6 3ae10542 bdb2280b -> 3f8b471d 3f704c8c 3f6fe609", + "bba382a6 3ebbb6ef 3eb38f6a bdaef45a 3f08bacb 3ec74d11 3f08bacb -> 3ebb59c1 3eb34365 00000000", + "be4b90eb be15a84e 3f30f3e6 be15a84e 3f078558 3f28b52f 3f078558 -> 00000000 3f3dc77a 00000000", + "bec0463a 3e6783a1 3f73deea be614983 3f6da16a 3f84981e 3f88ed4b -> 3d0fdcd8 3fa702c4 00000000", + "3f0fea8a 3ec72fbd bda5d7a6 3f7f001c 3f98ad53 3f98ad53 3e11419a -> 3f09b093 3f32bba1 3f6abebd", + "3ea7ec44 be62ace0 3f9da84e be3a15e6 3f52fd44 3ebceee9 3d4d869c -> 3e2caa76 3f86fccc 00000000", + "3fb2aa87 bdcea185 3f893043 bdcea185 3f193acd 3f5cbc49 3f5cbc49 -> 3f673667 00000000 3fac39f7", + "bef2eef7 be57a9e7 3f7f73f2 3f0169f6 3eb64b60 bc8e9c3a 3eb64b60 -> 00000000 3f7d58ef 3f01e442", + "be745688 3e381ef7 3ea87e44 bde07766 3e800000 3e800000 00000000 -> 3e1100cd 3e9e0d9d 00000000", + "3f74253a be1daad4 3e1f95c9 3e3113a9 3a6779c8 3f3e6277 3f37de86 -> 00000000 3f24df2b 3f1efa1c", + "3e56922a 3f181880 bddc8dab bddc8dab 3e863044 3f629dee be088b6d -> 3f1572f9 3df1276f 00000000", + "be38b5b4 3f526069 3f722749 3f167eea 3debcbb6 3ee03b70 3e28c404 -> 3f55cc57 3f82183c 3f17d553", + "3e7dcddc bde20215 3f14aecd 3d3a35fc 3d9bf8b3 3ed9a143 3ed9a143 -> 00000000 3f105327 3e10a018", + "3e71bd0a be14eb8b bde1f83d be2e0b52 be1a7a15 3ee0b359 3e799df7 -> 00000000 3c8424f4 00000000", + "3da2cbca 3f097056 bd609617 3f097056 3e95565a 3f3a6fb6 3e95565a -> 3f09004a 3c1a2334 3f09004a", + "3fb5830b 3f090880 3f800725 3f0399ba 3ee175c6 3c9cefec 3f00a54b -> 3efb80e1 3f791925 3efcf021", + "beb64368 3f2cffec 3f2cffec 3eabaf82 3f28b69b 3f82eb4e 3f28b69b -> 3f421d33 3f4dc4c4 3e841fd1", + "3f8fe0ac 3f7c2cec 3f0997da 3f0997da bbd18df7 3f355f31 3f355f31 -> 3f7df5f1 3ef4a0ac 3ef4a0ac", + "3f1669f7 3d78db4d 3f75c4ac 3f75c4ac 3f8b1c27 3f8b1c27 3f9c2aef -> 3f1f28ce 3ebebb58 3e99d8d0", + "3fa2777b 3f82a7d1 3f3e5cca 3f82a7d1 be3952e7 3e371722 3e0ee69b -> 3fa14762 3f220e8a 3f5615a8", + "bef14f61 3e28bb94 3c888680 3c888680 3ee0498c bdb697d8 3f8a165c -> 3cd7ea50 3d6aa42e 00000000", + "3cc3f52e 3f22e9c0 3f0f0438 3f22e9c0 3e965d82 3f3384a1 3ee15d10 -> 3f226c2c 3f0e8340 3f222d8a", + "3fa564b2 be3849c2 3f9866cf 3ebaa9af 3f400000 3f000000 00000000 -> 3f91a851 3e98b2f4 3ebaa9af", + "bef532f7 3f375500 3f375500 be183c28 3f12457a 3f12457a 3f8d7068 -> 3f559d05 3f559d05 00000000", + "3fb0f357 be406e8f 3ed4d1ae 3f18226e 3f000000 3f000000 00000000 -> 3f43592a 3f0841bb 3f18226e", + "3fbbad23 3db0a6a8 3f2c08c5 3f6f5cf3 3d10cda6 3f91027a 3f8e66ca -> 3e043f50 3dcdf960 00000000", + "3f84738e 3ed2f67b 3db36934 3f5e410a bc8cccbe bc8cccbe 3c8f3f1a -> 3ed15c5f 3d955e5b 3f5ad7d8", + "bed037f6 3f16d283 bde9aa6d 3ed403bb bdb1d0d0 3f67e715 3f4975ec -> 3f1535ec 00000000 3eb7dc54", + "3f62b635 3db08f46 3f773b0d 3f773b0d 3f00f10d 3f41e741 3f52822a -> 3ee92452 3eae8d3a 3e9327ea", + "3bf4953f 3f05c824 3f92bb36 3ebdad88 3e41037a 3ef10bec 3e41037a -> 3f05c3fa 3f92265d 3ebddd4e", + "3f17f01e 3eab186d 3f0343f6 3f0343f6 3efb4fff 3ef02c3c 3ef02c3c -> 3edc9072 3f01727c 3f01727c", + "3f371b4f 3f83a53a 3f9d4a57 3f9d4a57 3e800000 3f800000 3f800000 -> 3f56e820 3e3eb140 3e3eb140", + "3f02cfb2 3f218113 3f3cd1b0 3f8da74c 3ef10f7f 3ef10f7f 3eb9aa77 -> 3f11621c 3f1f8e25 3f61c054", + "3f2cb0f7 3f9cdb44 3e0f6b98 3cea06fc 3d9c5abb 3f80f3c2 be6fdd58 -> 3f934acf 3f2118e4 00000000", + "befeeb21 bcc00995 3e168ca3 bcc00995 3f616d20 3d908774 3d908774 -> 00000000 3dfa4c6a 00000000", + "3f8081fd be5ff414 3f791cd5 3daca86d 3f76a4f4 be4c0603 3f3973f5 -> 3f95f932 3f94c860 3f30609c", + "3f83062b 3f89accb 3f0c5f65 3f0c5f65 3d91b841 3e224115 3f827a7f -> 3f7de2d1 3f085bec 3ee51ac4", + "3fba3175 3ece313a 3e43b1a5 3f66a279 3f24fc3c 3f917c6c 3f0d6062 -> 3f15ca1f 3f9b33f9 3e83793c", + "3f900ca2 397f2de4 3e588217 3efb717c 3f4fd4b1 be316aef 3d1a4ab1 -> 3f69d699 3dca8d4c 3efbd463", + "3e760061 3ed14cc8 3ed14cc8 3f376d4b 3f0fd031 3f563ff8 3f0fd031 -> 3edde7ac 3ee41422 3f287764", + "3f97da18 3e95cbbd 3f75a622 3ed98a6f 3efab6e3 3efab6e3 be18f37f -> 3f089832 3ed9ead4 3ecbe92c", + "be5e4c58 3e6fb9d5 3e520292 3f6c0a93 3f451690 be458509 be393b28 -> 3e14b712 3e6b4d1c 3f638e53", + "bee2c118 3e961c9d 3ef38834 3f019ed1 3f4a0255 3ec34e93 bdbb303d -> 3e1833c6 3eef51c1 3f017d3c", + "bc811936 3f41c3bd 3d031ebd 3edd721f 3d9f013c 3f96a17d 3f96a17d -> 3f41ecf0 3c70162c 3edc2a05", + "3e617f02 3f1793f0 3f0530ac 3f9bfcee 3f5c30dc 3f228fa2 3f228fa2 -> 3f0ea56d 3f03bd15 3f824301", + "be47868b 3f337687 3f337687 3e4ffa39 be013daf 3e88ff9f 3e88ff9f -> 3f30ee8b 3f38d449 3e3046a1", + "3fb181fc 3ed4c2f1 bd5537bb bd5537bb 3f345314 3e3ff10f 3e3ff10f -> 3f149e23 3e7096a1 3e7096a1", + "3f71070b 3f71c69d bde0bc5c 3f81f19f bdb15d78 3ef876ff bdb15d78 -> 3f822a42 3ee5170d 3f8cb2a4", + "3d1a480e 3ec60f59 3e2df13a 3ec13260 3ebeb3b4 3ebeb3b4 3f7e9670 -> 3ec7af89 3e376d83 3ec5e6dd", + "bee15dfa 3f88f101 3f980422 3f980422 3e581330 3f0695bb 3f1492ea -> 3f967db9 3fc0c054 3fc4fc41", + "3e62a9a1 3f8c56ae bd563f58 3f8c56ae bcc6d9cb 3ec4f627 3eab0488 -> 3f8d28b0 3d2b04f0 3f810ce6", + "3f7b448c be72b0f4 bbaed578 bbaed578 3f5d4bb3 3f665171 3ef5d894 -> 3f81be8c 3f631b67 3ef12506", + "3d4e0d19 3e87a6b4 3ecf41a4 3ecf41a4 3f400000 00000000 3f000000 -> 3e90bb84 3ecf41a4 3ed1b55f", + "bda0ef05 3f10e0b7 3f10e0b7 3f6e4b85 3f29f479 3f29f479 3d43a9ad -> 3f12a387 3f12a387 3f6f1f7f", + "bd884b54 be3650e7 be3650e7 3e9ff265 3f0802a5 3f23dae4 3e35355a -> 00000000 00000000 3e9daf39", + "3f6ecbfe 3f34d123 3de9cda5 3ecf66af 3f211dbf 3ec91131 3f211dbf -> 3eed9b02 3ecb2ed7 3f043b3b", + "bdf2e1ae 3f3d5695 be544356 be544356 3ea00d95 3f472071 3e976c50 -> 3f41e2de 00000000 00000000", + "3fb3eeb0 3f3239a4 3f932214 3f3239a4 3f4f3d4b 3ea44795 3f4c9e74 -> 3e7fa970 3f10480e 3e82b8c4", + "3f8e3ff5 3ef94fd7 3f9efa7e 3f9efa7e 3ecc998c 3dd7a49a bd50f10b -> 3eff4093 3f88c01a 3fa9bf46", + "be589be8 3f1bd771 3f18a4a0 3f18a4a0 3f9cc124 bdbe0d94 bd489da0 -> 3f2a4432 3f17acf2 3f1821e7", + "3f7163f3 3f0567ac 3f2a9963 3f0567ac 3f800000 00000000 3f800000 -> 3ef66c83 3f2a9963 3ef66c83", + "3f8c2a28 3f7d6877 3d64cda4 3d350327 3f88a04e 3f0bba2d 3f63d9f1 -> 00000000 3f163674 3f6ec42a", + "3ef46179 3f93e0b3 3f93e0b3 3f017070 3f893b10 3eb26f30 3f9cc424 -> 3ef82182 3f6ff209 3eff835c", + "3fa2dfcd bde8b0af 3f4a0f17 bde8b0af 3d3c70e0 3eac11aa 3f2da0ea -> 00000000 3f0ab7e1 3f720d78", + "beb551c6 3f526f36 3ec561f6 3e0491a3 3f400000 3e800000 3f400000 -> 3f7e396e 3ebb00d8 00000000", + "3f907f5a 3f89e7b7 3e7b1328 bb8c15f7 be52376b 3f530882 3d521ec3 -> 3fac28f3 3f382d3a 3d5db81d", + "3d868977 3f1476b1 3f83b2b9 3c84cb71 be3f23c3 3e786128 3e786128 -> 3f14f72a 3f818a6c 3d018c26", + "bd71c9de 3d143b19 3cad6fa9 bd50d66e 3f7d523f 3f7d523f 3f527552 -> 00000000 00000000 00000000", + "3f0ba79c 3eeedb50 3eeedb50 be5235b9 bb423022 3f5479b1 bb423022 -> 3eeecd20 3efe6180 00000000", + "beca3d3d be33a395 be55dc65 be33a395 be3598d5 3f8c5fb4 be3598d5 -> 00000000 00000000 00000000", + "3e799ff4 3f8328d4 3f7ca934 3e491ff3 3f45293b 3f8e41d7 3e8bf435 -> 3f53e22b 3f391cea 3e728e21", + "3fb84cc7 3d53c860 3ed719e6 bd2fdf21 3f2524ed 3f7a26ed 3eea6571 -> 3f626de7 3f2517e0 3f2c3efd", + "be56c487 3f5b7902 3f1b7b81 3f1b7b81 3f935508 3f935508 be17a2bc -> 3f83d19f 3f28c066 3f19c67d", + "3e8e67ad 3eb059e9 3f8e74be 3eb059e9 be300193 3f2b5b94 bc94d496 -> 3ea8bc5f 3f627c76 3eaf8bd8", + "be8a8a53 3d407e29 3f9700e7 3f770ef6 3f8de5dc 3f512ec7 3f512ec7 -> 00000000 3fbd7a0e 3f95da6e", + "3edccb17 3f1c035d 3f6410c8 3f2d86b7 bd9bd51a 3f81d121 3f7f1c2f -> 3f1dd9fd 3f0c895c 3f0665c5", + "bed7517e 3f6689ee 3de147b6 3f9ccfb0 3e3591ad 3ed39d21 3e3591ad -> 3f75d4be 00000000 3faaa71d", + "bed4b4b9 3da5ca99 bcdf17da 3f7c601f 3e5e2c72 3eddb13d 3eddb13d -> 3bb143a0 00000000 3f948f8f", + "3fb37f61 3f6da5cb 3f93ac24 3e5309cb 3f9125d8 3f7c578c 3e3090ab -> 00000000 00000000 3eb24a8e", + "3f282cf7 3f322340 3eed9268 3f322340 3f368946 3f96b7dc 3f368946 -> 3f032ac4 3f050a6b 3f032ac4", + "3f613947 3ebb75ee 3ebb75ee 3f61c725 3f14cb10 3f1efee7 3f97d913 -> 3f00c721 3f032e56 3dad6b90", + "3d9b37ae 3f859865 3ecf822b 3eb588b1 3f08fe50 3e846cb8 3e4cc615 -> 3f7fe671 3ed168da 3eb7ca8a", + "bef19dec 3f79ce5d 3f46e4c0 3f46e4c0 3f4c1593 3f97df65 3f97df65 -> 3faaba34 3f8b243e 3f8b243e", + "bdc747b4 3d8399f7 3eab9dbc 3eab9dbc be3f42a7 be3f42a7 3f8062fb -> 3da409f9 3eaeaef3 3e9b2508", + "3f62be65 3f340255 3f9bec9b bd524d10 3f0cf649 3f84b9a9 3ea966a5 -> 3f014764 00000000 3e8b2934", + "3f018ce3 3d619bcf 3ee62e89 3ee62e89 3e9f9a82 3ca6b3c0 3f36d2bb -> 3e4824d5 3ee6b6aa 3ef8d7e0", + "3f4a8020 3e748bbd 3e748bbd 3f1df49a be610978 3f1a33f0 be64f6c1 -> 3e178f39 3ef9b52b 3f288d49", + "beb17372 be1efb3d 3f87902c be210398 3ef0d0a2 3f957513 3da155d9 -> 00000000 3fc17beb 00000000", + "bc99947f 3ee3f9c2 be4ced5a be4ced5a 3e9c6288 bda16df6 3f1806b5 -> 3ee3a798 00000000 00000000", + "3e5999c8 3f1e490d 3f4d4596 3f4d4596 3f9cd9c7 3f1c2da4 3f3c26d7 -> 3f0e834d 3f393c98 3f352290", + "3e7ddccc bd92be61 3f9cc14c 3f9cc14c bd2eb83d bd169dd7 bd2eb83d -> 00000000 3f9e723a 3f9eb782", + "3fbaf184 3ef7ad02 bc867f0f be79e56a 3f802aaf 3e4ea8ad 3e7b748b -> 3f0802df 3e937626 3e944cbd", + "3f92a7c3 3f2e03de 3ebf4bfe 3f2e03de 3f0195d0 3f0195d0 bc2c8be4 -> 3ef147ff 3f052c94 3f2f2025", + "be980d32 be333fab be333fab be07eea0 3f8c18ec 3f8c18ec bda87475 -> 00000000 00000000 00000000", + "3f73b9bb 3f4f977b bd9800a0 3f035601 3f000000 3f000000 3f400000 -> 3f03d0f4 3ef1e74a 3efd24d4", + "be985f23 3e1d1de9 3e76fe43 3e4a7ea5 3e800000 00000000 3f400000 -> 3dd09ec2 3e76fe43 3d80a98e", + "3e12153f 3f6d34cf 3f02b37f 3e1bf404 3f7b3093 3f31c876 3eddc865 -> 3f4ea219 3f022a7b 3e47f51b", + "be6af4c9 3f6f5f8e be7c4b8c 3f6f5f8e 3e80caea 3f907b3c be281e3c -> 3f7c3aca 00000000 3f66fb77", + "3f03c9dc 3f0fb00e 3e935fc3 3f28067e 3f6a6050 3e95cf86 3e95cf86 -> 3f00e667 3eb4193f 3f1bf7a4", + "3c7c839f 3f574c56 3ece00e7 3f11d419 3f097d64 3dce65ee 3f05c83e -> 3f55da5d 3ece28aa 3f118a94", + "3edda55d 3e8101e7 bd9b8aa6 3f9e4647 3f310662 3e6afb8e 3f39ea37 -> 3ecd09ed 3d1d9f00 3f45fe94", + "becde21c 3f0cf5f7 3e2175d7 3d947425 3f000000 00000000 3f400000 -> 3f122c2b 3e2175d7 00000000", + "3fb6a29f 3f89f56c 3f89f56c bd8e2906 3f2846b1 3f6540f6 bd9ecb8c -> 00000000 00000000 00000000", + "be48078a 3f8101fd 3f4590b9 3f8101fd 3e35d999 3f144ab3 3f8c1c3c -> 3f85849e 3f554efe 3f9ccedd", + "bd90a284 3f9b35ec 3f9b35ec be3846f6 be48f6ad be48f6ad bcab27e0 -> 3f98aeab 3f98aeab 00000000", + "3fba5cc3 3d94364d 3f7f724b 3f5477fe 3f0f8a0b 3f7c5bd5 3f820cdd -> 3f4543d1 00000000 00000000", + "3fa42c08 3f1576e6 3e020ceb 3f1074f7 bcb5512f 3d8071ec 3eac9579 -> 3f16aee1 3e3f7fc6 3f023a27", + "3fb867c0 3f4d2d59 3e33b227 3e33b227 bd07129b 3e7e7130 3f9f649d -> 3f5482a0 3ed0cdf0 3fab801e", + "be7c408b 3f472cd0 3eeef8d1 3eb219a1 3f37370a 3f37370a be502396 -> 3f604586 3ee8f7c2 3eb9e6b5", + "3ef3214b bcc555b5 3e0aff21 bcc555b5 3f2d1ded 3f887754 3e985b17 -> 3ea0005a 3f012b6f 3dfe0057", + "be59eeb5 3f337938 3f337938 3f671c52 3f219767 3f0f6b17 3f0f6b17 -> 3f414da2 3f3fbf77 3f7fb2cd", + "3fbacc49 3f83e2c3 3edaf7d2 be000170 3f7dd1cc 3f9f6e3c 3f676c37 -> 00000000 3f30cc1a 3fc314eb", + "3ead6441 3f671c54 3f671c54 3f348d40 3e416d39 3f85cb9b 3f49c575 -> 3f59eb32 3f1e1c56 3f187f6d", + "bdc5f498 3f314881 3f8967ae 3f314881 00000000 3f000000 3f400000 -> 3f314881 3f90800b 3f386dbb", + "3f8b1f6c 3ec52e73 3ec6162e 3ec52e73 3f54a6ec 3f5f554c 3f8c8e69 -> 3f17b201 3f19f4fd 3f28caaa", + "3ecfd18e 3f20ba89 be7695f5 3f9528a9 3e96e104 3e96e104 3f428d45 -> 3f18e632 00000000 3f413e1f", + "3d8e7d86 be4bbae2 3f3cc1e7 3f3cc1e7 bc8b9cf4 bc8b9cf4 3f965354 -> 00000000 3f3ce6ca 3f32d411", + "bdc82a67 3f3e0718 3f3e0718 3e88bd0f 3f7b0e55 3f9a18b3 bd72ad61 -> 3f49eb1a 3f4c9fe1 3e8a1ea6", + "3e23829b 3f452758 3da35861 3c8a9814 3f69dd0e 3f69dd0e 3e4b3b21 -> 3f30fa8e 3e4f377a 3d42b5fa", + "3f1fccbd 3e7a92db 3f57c8f0 bdcd6a1c 3f400000 3e800000 3f000000 -> 3ef7ad54 3f3c62ef 3e8c8083", + "3f07344c 3f2ed0f5 3f2ed0f5 3f23614f 3e055807 3e88e950 bddb85f2 -> 3f286074 3f2197bd 3f2762cc", + "3fbe7adb bd09648a 3e95f3ea 3ed965da 00000000 3f800000 3f400000 -> 00000000 3f68c9ad 3f17c851", + "3f0f12f4 be64a211 3e83e601 3f6fde82 00000000 3f400000 3e800000 -> 00000000 3eebef90 3f509bb8", + "3f0875a0 3f79882f 3d409b3a 3f79882f 3f26a05f 3f4945d1 3f26a05f -> 3f253366 3eda787c 3f253366", + "be631832 bdadff52 3f7f6411 3f7f6411 3f6f44a0 3d764c7d 3f94fa42 -> 00000000 3f8164ee 3fa093c8", + "3e1be38a be2f3ec2 3f64c11e be2f3ec2 3f270a0a 3f24b995 3f6c7c39 -> 00000000 3f5103e6 3c906638", + "3f2deaa6 3f6e9f17 3eb36f16 3f964504 3ea5421a 3f0703db 3e28811e -> 3f3e1b9c 3eea4cfe 3f82fb24", + "3f7a7f53 3f730b9e 3f730b9e be7a165d 3f73bcf8 bda6de84 3f1a330d -> 3de57970 3f82b1eb 3f22102b", + "3fa70f2d 3f508b1f 3d824697 3f1067ed 3f82f664 be43735e be587829 -> 00000000 00000000 3f19757a", + "bd256aa8 3f52a661 3c8afcd8 bd376ac9 3f909146 3de48829 bc789a09 -> 3f5a3089 3c4ea594 00000000", + "3f9bf833 3e20ebc0 3e20ebc0 be3a0728 3f0e415b 3f909a6a 3e0bdb8a -> 3f1f16ec 3f8cefaa 3d393c9c", + "3f229712 3ca3f660 3ca3f660 3f5b0a23 3e447670 3f87dbbf bba02583 -> 3e0c4703 3f2ac9b3 3f5b9ad2", + "3e5fa7d6 3f9e3a5e 3f31197c 3f896596 3e800000 3f400000 3e800000 -> 3f93f00a 3f210377 3f8161a2", + "3f375980 3e64a9b0 3f7de1b6 3ee2fd13 be5c9ae8 3e49230d be5c9ae8 -> 3e0d3a22 3f5a76b2 3eda092e", + "3ed21c0c 3da7132f 3e2ee790 3dd5c3dc 3edc1d5e 3f596c82 3f2856e0 -> 3e6ab7fa 3eccf0e1 3ea2c312", + "beeaab33 3f8a9d6f 3e8110f5 3e8110f5 3f984915 3ec34a8d 3f3daad4 -> 3fdbfd60 3e295e6a 3dab6f62", + "bebe4925 bd62e632 3f5db625 3f115af7 3cd63446 3f22e81e bde3f2e0 -> 00000000 3f8504cb 3f0feb64", + "3f88c766 3e2bb158 3e2bb158 3f56585b 3f412235 be7e53ae 3e2f7fd7 -> 3f341898 00000000 3f36b7f1", + "be3ae098 3f1cd326 3f1cd326 3f79302f 3f917411 3e8b2362 3f3bc034 -> 3f28c7c0 3f1faf14 3f8cd07d", + "3f1be455 3f34797c 3e902ae0 3e7e2248 3f86c36d 3e17dd03 3f99f525 -> 3ee26091 3ea45de1 3f1df844", + "bea811de 3f032930 3e837b1a 3ef6a1ea be34e113 3e3ce6f9 3f5940d8 -> 3f02cb59 3e68ccdc 3ef169d0", + "3edd158d 3f905d3d 3f905d3d 3efd9019 be37313d be37313d 3f92a006 -> 3f9cc7c7 3f9cc7c7 3efff94f", + "be97f2c9 3e98a03b 3ddb3a44 3ddb3a44 3e08196f 3ef335d0 3f87ed54 -> 3e90788d 00000000 00000000", + "3fbf606b 3f39c636 3ed6cdbe 3ecaccdb 3eaef027 3eaef027 bdcf4065 -> 3efd7e1c 3f00726c 3ebab3a1", + "3c4abf72 3f777c95 3f88833e 3f01e3bd 3f31b930 3f31b930 3e436d9b -> 3f756f03 3f87444a 3f01e174", + "3fa607f8 3f4e7d0e 3e56edf1 3e56edf1 3f011e05 bd89df30 3e165d4e -> 3ecf9500 3e230c36 3ea40c2c", + "3f82915e 3eaca299 3f24b952 3f24b952 3f3718a4 3f3718a4 3e16e406 -> 3f13234d 3ede4708 3f19af17", + "3e1a4103 3f375b5c 3f1eb15c 3daedda4 be45e04d be45e04d be74d001 -> 3f3a9465 3f207acd 3d6368b8", + "3f30af52 be621ded 3db3d574 3db3d574 3ea20ea3 3da21c52 3e8698a8 -> 3dc0bdb6 3e0808e4 3e731426", + "3eb5fada 3f5fbca8 3f2f65d5 3f2f65d5 3c6277f9 3f5edd95 be73d079 -> 3f5ecbd6 3f1210cb 3f376b8d", + "3e97056e 3e0ae1bc 3df0b462 3e0ae1bc be060460 be060460 3f808d1d -> 3ddc260f 3db43a80 3eb3f894", + "3d6aee86 3eba9b76 3eba9b76 3e4509c6 3f2049ae 3ecf83f0 3f89c46e -> 3ebf9764 3ebdd565 3e6bece1", + "befb71bd 3f18194b 3f18194b 3f67ab35 bc53bf33 3e9d712a bc53bf33 -> 3f17cafb 3f1f609d 3f665a52", + "3eaccd2f 3d5d2f9a 3e8aa125 3f988546 3f86adc1 3f9d4099 3f9d4099 -> 3ebdd460 3eebf606 3f1e3a08", + "3d9d6b50 3f901708 bdd44a78 3f901708 3e853523 3de3561d 3f8e95df -> 3f8ce2fe 00000000 3f825ff3", + "3eb73f7e 3f799a94 3f799a94 3e7d85f6 3ee20c2f 3f947464 3f947464 -> 3f532c5c 3f14a5f2 3eea0e31", + "be3d335d 3f1c672e bb4806e8 3ec4d151 3f958fd8 3f8ce508 3f8ce508 -> 3f28aabd 00000000 3eacbea4", + "3f92dfa6 3f3ddaa9 3f3ddaa9 3edd0a16 3eb5e70a 3f855bc6 3d871d1f -> 3f0b6c37 3e27d9ac 3ee25520", + "3f7e3895 3f968b77 3e383dc5 3f968b77 3e24f7d0 3f6e6a0b 3f6e6a0b -> 3f75b506 3f459f19 00000000", + "3dc05991 3f42f816 3e73c494 3e73c494 3f2350a3 3f9c025e 3f415417 -> 3f3af1a7 3e9896d7 3e8ce8bc", + "3f420b23 3d93c4ae 3d93c4ae 3f82ecf1 be5b1d6f 3f36979a 3f36979a -> 00000000 3f08e692 3eea3ee4", + "bec66698 3ef2566c 3f290a56 be6d0277 3f53ee9c 3e8f2a57 3d65200f -> 3ee99266 3f31ef20 00000000", + "bcab2ed8 3e3df00b 3f0613bb 3ef98955 3f4dec7b 3f4dec7b 3b06a249 -> 3e331c56 3f064808 3ef98931", + "3f953d72 3f56e3ea 3f0be1d4 3f39bf8d bc86f30b 3f211a40 3f211a40 -> 3f5a3a63 3ef4e41c 3eca0268", + "be4de155 3f10ce93 3ef9a4a8 3f944b87 3f9997cd 3f4465cc 3f4465cc -> 3f18ea9c 3ef7aea3 3fae4c98", + "3f5aa50e 3f24995e 3e3a062e 3f24995e 3e8d2c7b 3e8d2c7b 3f892a27 -> 3f135c7a 3ea9c72b 3ec33625", + "3f4f5426 3f502ba8 bda89892 3e4587e3 3f8ff07d 3f71252a 3e55c498 -> 3e7892b0 3f4e60dd 3e97eea3", + "3f8f653e 3f93c65d 3e08295a 3dd17790 00000000 3f800000 3e800000 -> 3f93c65d 3f748fde 3ea66dfa", + "3faf963f 3f419e66 3f419e66 3f973c9d 3f205513 3f26ca68 be51b255 -> 3ea1bc2e 3e98a6d2 3fc83fb6", + "3e1a7fb5 3f66a020 3e1acd9b 3f66a020 3e800000 3f800000 3e800000 -> 3f5ee22f 3e834b6d 3f5ee22f", + "bde55ebe 3f09aff1 3f09aff1 3e855103 3f415ddc 3f6f1a26 3f415ddc -> 3f0b5387 3f0bb6c4 3e611e6f", + "bee5dff4 3ec135eb 3ee1f57a 3ee1f57a 00000000 3e800000 3f400000 -> 3ec135eb 3edb370e 3ecdba36", + "3e31f9fe bd2d687b bd2d687b 3f9445ab 3ca0617c 3f6a74b3 3f6a74b3 -> 00000000 3e0572ae 3f72e318", + "3de3ed4d 3f93fe7f 3f272177 3f31db35 3de2b291 3de2b291 3f76f15a -> 3f91ecb5 3f262aa6 3f2726d2", + "3cc3c72f 3f0bba88 3f7f4eb6 3e6dabe4 3f184868 3f835634 3f184868 -> 3f0b6529 3f79105a 3e7578a7", + "bc761fc0 3eaafbfe 3eaafbfe 3e8978d5 3f2f2d9e 3efffcd2 3efffcd2 -> 3ea93c8b 3ea9b510 3e87b108", + "be6a89d2 3ef06e61 bd86b4b2 3f806c32 3f90a853 3eb5fea0 3daec0b7 -> 3ee85f0a 00000000 3f82f0d6", + "3fbc9a0c 3f594ec2 bcd843b2 3f4ce244 3f3a9955 3f7352dd 3de46816 -> 3dcbcbe0 3fb95938 3f339d87", + "bed32c32 3ee5ce82 3ee5ce82 3e55131c 3f41cbce 3f41cbce 3f1bd088 -> 3ed57336 3ed57336 3d7bf87c", + "bea1c22f 3f9f89f3 bdf043ee 3f5e7b5d 3f465d45 bdb68c2f 3f357e07 -> 3fce50d2 00000000 3f84673f", + "3f586046 3f852586 3ef292ac 3e8f1edd bdc9b018 be20d725 3e89c9ee -> 3f90a863 3eef0200 3ec27900", + "3e6d6b74 3ebee204 3f53a5c9 3ee0b448 3f95f349 bdbd7d84 bdbd7d84 -> 3ee241aa 3f573c89 3edf5c8b", + "3f365145 3f29b0e0 3f29b0e0 bd606b77 3e773be5 3e773be5 3eea7b6d -> 3f1b5a85 3f1b5a85 3e9d3d51", + "3e43ac98 3f14c7c5 3da33682 3da33682 3e89d96d 3ca5bfeb 3f969b48 -> 3f12a463 3da9de7a 3e899252", + "3f8f9d62 3f9324b5 3f8772bb 3f9324b5 3ebd0220 3f4b0e8d 3f8d24ab -> 3f1c89b9 3d846f90 00000000", + "3fb5ac2c 3eeb208b 3f6443b2 3f0448bc 3f000000 00000000 3e800000 -> 3f04604d 3f6443b2 3f013e6d", + "3dd3278a 3f86ad08 3f4fba04 3f4fba04 be613031 3e81a070 3eb7c449 -> 3f89e17e 3f4b907b 3f49d372", + "becbf465 3f160c78 3f95e1f6 3f66466d 3e9edbcb be237db7 be237db7 -> 3f1b7fbc 3f8af558 3f594405", + "3fb78dcd 3f8990aa 3f7dfafe 3f8e02e5 3e96262c 3f8b14ac 3e96262c -> 3f1761d6 00000000 3f18cb9d", + "3f5d7cf6 3d762841 3d8c800f 3d762841 3e7f55b5 3e358304 3e7f55b5 -> 3e7fe64a 3e4dbea2 3e7fe64a", + "3f85bb39 3e9dba29 3f0893f1 3f161cd0 3ba09f65 3f0d1a26 3f0d1a26 -> 3e9ebbd8 3efd65ac 3ef94a48", + "3f4c38c6 3dfaec6a 3ec787aa 3ef1b4b8 bd0d7167 3f95615e bd0d7167 -> 3dd054aa 3f18568d 3ef0eb1c", + "3f50b4d2 3f503bef 3f503bef 3f0fc096 3f8f541d 3f6c6445 3f869964 -> 3e76fa1c 3eaedcd7 3ee97cc6", + "3f058bf4 3f88110b 3e85c845 3e85c845 3f748e45 3de9b1c3 3f748e45 -> 3f007a0d 3e94552e 3eff9882", + "3f064e8f 3f43bfd3 3eb16047 3f43bfd3 3ef30dbd 3e193c17 3ef30dbd -> 3f2200ca 3ebdb8aa 3f2200ca", + "3fac6410 3f5d3836 3f97a4db be5baed8 bde0cfab 3f671d1d bde0cfab -> 3f78c864 00000000 00000000", + "3fad3542 be4bb251 3f04aa11 be4bb251 3f627488 3f627488 3f1f616e -> 3fbcb695 3ef2feda 3f7a8d3a", + "3fb1416b 3bd7fd51 3e8fd2db 3bd7fd51 3ef9f80e 3edc4e0d 3f4d0c22 -> 3f2c7c3f 3f0ac0d1 3f8cf2a1", + "3d4c5ecf 3f8fff7b be79426a 3f8fff7b 3f810ae3 3f7a9e0b 3f810ae3 -> 3f87f32f 00000000 3f87f32f", + "bd0c094c 3f8b8d77 3f34dc3b be191743 3f51a15f 3f51cbba 3f51a15f -> 3f8fc86e 3f37d286 00000000", + "3f62fef5 be3c0d5d 3edc9637 3edc9637 3f7d4d12 3f8c5077 3f7d4d12 -> 3f820abf 3f10b722 3f0d5d04", + "3e70957f be3eca8c 3f5c9d38 3f5c9d38 00000000 00000000 3f000000 -> 00000000 3f5c9d38 3f46dada", + "3edd64e0 3f4e4e58 3d7bf52e 3d7bf52e 3f4fbb1c 3dba4cb7 3f4fbb1c -> 3f175aac 3dc4a043 3ebd0b02", + "3cde8fda 3ee24072 3f6b1a6b 3ee58aa4 3f91d3e3 bc416458 3f9e154c -> 3ee417e2 3f6b2c01 3ee7512e", + "3fbb9fec 3f320ff1 3f975b35 bd29892c 3f5e7bc2 3f91c1e1 3e2e5da0 -> 3e4a0d3a 00000000 3e6a5cc3", + "3f474f84 3e5f473a be5f1e82 3e5f473a 3b8a2431 3f4367c0 3b8a2431 -> 3e612c6b 3f22a6be 3e612c6b", + "3ddeb4d4 3f42450c be205dee 3f9af389 3e982b11 3e9a88e7 be380387 -> 3f3dfc76 00000000 3f9e8184", + "3f5891e7 3c89b26b 3c89b26b 3f0562be 3ea01e54 3f6e8965 3d9a4000 -> 3e8b8241 3f4750c8 3f04b30b", + "3c2ef9d8 3e078010 3f82fc72 3f891c3e 3f400000 3f800000 3f400000 -> 3e0d8816 3f818e2a 3f87f06b", + "bdbe309f 3e510ef7 3f54f5f6 3e510ef7 3f800000 3f400000 00000000 -> 3e18cadc 3f60cbb7 3e510ef7", + "3e9e3ea3 3eb96ba0 3eb96ba0 3e8a258e 3f85dbba 3de1f120 3f933ea8 -> 3ee70ba5 3ebe3bcf 3eddf32e", + "3f9cb7dd 3f16ac39 3f16ac39 3eebda10 3f46807b 3ed889f0 3f46807b -> 3ed73f18 3efe625c 3f090dd0", + "3f1be165 3eac6b5d 3f05a654 3f05a654 3f57ece4 3f8d0e56 3f99324c -> 3f0122c0 3efc229c 3efad47e", + "3f9ff3a4 3f888a2a 3d0afac2 3e7c3a15 be46240a be46240a 3f9c8545 -> 3fab9ea0 00000000 3f82c3ff", + "3fa5a713 3ee67c2b 3f0a2b20 3de19107 3f48c23c 3e3a42ec 3f48c23c -> 3f0d233c 3f05618f 3f66c735", + "3f9ade2a 3e29f638 3e5c456b 3e5c456b 3f376bc1 be7fbff5 3f75928d -> 3f3ebe6f 3d2fd8a0 3f605c7f", + "3e76a4d1 be293ed5 3f60b902 3f130c15 3e8ce686 3f23eb54 3ef205a1 -> 00000000 3f42e361 3f0eb5be", + "3f88e208 3f3f7627 bdfb8d91 bdfb8d91 3f90acc2 3f9794ac 3ef73cdd -> 3e183170 3fba32fc 3f053a9e", + "be5a2de0 3f6e1a88 be4fdad0 be438677 3e09e8c6 3f60b145 3e13a3ad -> 3f746c29 00000000 00000000", + "3e8dca5a be70976d be70976d 3ec7fa96 3f9efda4 3eecdb07 3f9efda4 -> 3e8a9588 00000000 3eee850a", + "be9135a7 3f2923ad 3f12190e 3f12190e 3f400000 3f400000 00000000 -> 3f3aa40d 3f19cc0b 3f12190e", + "bdcb32e7 3e6e5d9a 3f1ba5f0 bc27f48e be698181 3f9fbd82 3f997892 -> 3e7abf63 3f227ebd 00000000", + "3ef5fbdb 3f755938 3f755938 3f6a1d1d 3d9ae05c 3f631eb0 3f631eb0 -> 3f6cd24b 3f114fd4 3f0fa787", + "3ce393ea 3f9c646f 3f5b1ba3 3f5b1ba3 3f95683a 3f9de8f9 3f580a62 -> 3f96667f 3f54dcf1 3f56d607", + "3f0eeaf2 3eae40de 3eae40de 3e5fc651 b9848ddb 3f68225a 3f68225a -> 3eae3af6 3f008250 3f00e5bc", + "3f6fccd2 3d3da5be bd9418d1 3cbf43ab 3ee23109 3f595ee5 3ee23109 -> 3ed7f6b4 3f568d1b 3ed5f030", + "3f905efe 3ed9b526 3f01f18e 3f67ce20 bb54c3a8 3f87727d 3e69a7dc -> 3ed96d5c 3efa9bbd 3f325fb8", + "3dbdcdd2 3f81d020 3f9df69c 3f81d020 3ed47899 bda51fe1 3ec8dc56 -> 3f79805c 3f9f5e19 3f7a0dfe", + "bdf4feb9 3f975845 3ee0e1fb 3f24d6f8 3eefd6ec 3f835282 3e7f7fb6 -> 3fa1224b 3ed93e9e 3f2709f6", + "3fa74218 3f1d98c6 3f1d98c6 3e82eeab 3f7280cf 3f7280cf bdbd0611 -> 3ea8a70a 3ea8a70a 3e498798", + "3f554fab 3f1e96a7 3ebc81ee 3f1e96a7 3da97c68 bd5b2d81 3f8be070 -> 3f1a5eb3 3eb67d2b 3ecdc428", + "beb9fdec 3d5a6684 3f62fd6b 3f2adaaf 3e919e94 be123fe6 3ee250e9 -> 00000000 3f58b7e1 3f389dd9", + "3f82f72b 3e895f43 3f6265d1 be6f7a11 3f800000 3f800000 3f400000 -> 3f3e0ff4 3dc857e0 3f6476a2", + "3f61312d be725c3b 3e329295 3e345221 bcb22c98 3f927f45 3f1af8a1 -> 00000000 3f547c80 3f056406", + "3f84899e be5e7a01 3f342ca2 3f0c4a28 3f80bbd3 3ed4dec9 3ec09058 -> 3fa3689b 3f07408c 3f02b7b7", + "beeb7b7b 3f6b3e5d 3eb38ffa 3f6b3e5d 3f49a174 3f49a174 3f9ae7c8 -> 3f9c7873 3e785e1d 3fb15058", + "be2f27e6 3dff7e4a 3e936547 bda251b0 3f9b14d7 3d7291c2 3f9b14d7 -> 00000000 3e913201 00000000", + "3ed543b9 3f37018c 3c1c52cd 3e94ae20 be491ddf bd928d31 bd928d31 -> 3f400185 00000000 3e8e4855", + "be547836 3f9aa59a be46b009 3f9d4ccc be6134a7 3e328343 3efbcd66 -> 3f925fbc 00000000 3fb05763", + "3e32b9e6 3f826a0b 3f826a0b 3f607ede 3ee4611d 3f2c6da3 3ee4611d -> 3f702573 3f659919 3f51787c", + "3fbf451e 3f17f3f0 3f9c5f58 3f17f3f0 3f83755c be6b8ddf 3f8b105b -> 3e9cddd7 3fdbe056 3e945c16", + "3e2c1b4e 3ee1cb73 3ee1cb73 3ec0c955 3f69995a 3ec642cc 3ec642cc -> 3eeb0f45 3ee5b9f6 3ec903c0", + "bebec924 3f10642f 3e6ae25a 3ddc0655 3f400000 3f400000 3f400000 -> 3f198d9b 3d9ffc1c 00000000", + "3f922f37 3f761d60 3f7ce4ca 3f761d60 3f5d7467 3f5d7467 3f8141f6 -> 3d4bb330 3cc3b2c0 00000000", + "3e09b55a 3f1933f7 be051b2d 3f5129a2 3f6eebb1 3f9d14b4 3e82adb6 -> 3f12e068 3d9fa558 3f4b974d", + "3fb2181c be653812 be3e48c6 3e847640 3f9e39d7 3cb54d01 3e819efa -> 40110739 00000000 3edb7e4c", + "3f7cc321 3f0f4872 3f0f4872 3e42043a 3f8e694f bda7bfb4 3eba5b1a -> 3edb6958 3f11c144 3ed3486e", + "beea4fa3 3e69c5b2 3f4bea81 3e507ae0 3f7f7cf6 3f8aae3e 3f93d4fd -> 00000000 3f8b9960 00000000", + "3f7a800e 3e88ec52 be213a90 3f9c2497 3f11eed3 3f5ba67d 3f11eed3 -> 3f06e212 3f724e64 3ed563f0", + "3fb52d88 3f773b10 3f14eb2e 3f773b10 3ef3272f 3e064f77 be6edc60 -> 3eadde80 3f0d26c2 3fa2fb64", + "be992be7 3e712cc2 3f4adcc5 3f4c2d89 3f843a33 be5d76e4 3f843a33 -> 3d93901a 3f412cce 3f7b432c", + "bce85706 3f409b9e 3f409b9e 3f777305 3f77fd28 be00a60f 3f77fd28 -> 3f442872 3f4025c0 3f7e034b", + "3fb8e920 3f7be3b2 3f887ec5 3f887ec5 3f27b007 3e3ce49e be5a4769 -> 3d8b6610 3f43b73a 3fb524b0", + "bd885bbf 3ba58d98 3f8a1f20 3ba58d98 3f800000 3e800000 00000000 -> 00000000 3f8c96d2 3ba58d98", + "3d975541 3dbb20bb 3f7b6eac 3dbb20bb be65aa99 3f5cc21f 3f5cc21f -> 3d9f638e 3f6bb3b1 3e12e3da", + "beecf025 3f3cdc70 3f69958f 3f8d50a0 bdd3b5aa 3f10c0c2 bdd3b5aa -> 3f3709c1 3f906b94 3f85eaef", + "3f66a801 3eef7642 bde0c40b bde0c40b bc916030 3ecf3531 3f59857a -> 3eeeeede 3eab7b64 3f52e8f7", + "3e367515 bdf5ad3f 3e27dc5b 3e27dc5b 3f6e9a2e 3f63e19f bdfd80c4 -> 3db009d3 3e8a83a6 3e18ae37", + "3f8780e2 3ea98d25 be686c6c 3ea98d25 3f8e083b 3f8e083b 3f316d86 -> 3f3a5318 3fbd8f88 3f14341e", + "3f87dd6f 3e743381 3ea25050 3f81a6ca 3da2d189 3eea7213 3eea7213 -> 3e90b2f9 3efd6241 3f03aaac", + "3f8e3055 3f8919a1 3f8919a1 3f2a8fad 00000000 3f000000 3f800000 -> 3f8919a1 3edf9660 3e980180", + "3fb4ad8b 3f0af845 3ef21445 be26c455 3f01dfd6 3f2e7df4 3f2e7df4 -> 3ef68475 3f066ee0 3f8e6b20", + "3dff22e6 3f013069 be75e512 3ddcaa0a 3ed28d66 3ed28d66 3f4c2e45 -> 3f011138 00000000 3e3e2710", + "3f41ed24 3f9b9873 3ede0e41 3f82e1fa 3f400000 00000000 3e800000 -> 3ece1120 3ede0e41 3f5319a2", + "3e93a767 3f038974 3f8c6308 3f50e3a1 3d03e4e9 3ecb5cc8 3eef172b -> 3f0378a3 3f75c659 3f3b1a48", + "3fa8df50 3f3f69a4 3e7b0233 3f8fd152 bdf6e063 3dd6b09d 3cb86066 -> 3f539524 3ea1999f 3f8b13d7", + "3fbd5838 3f1ae818 3eaa194a 3f837134 3f87e348 be269cde be269cde -> 3e8ccb9e 3e80bf92 3fa3e832", + "3e75b2eb be1d7c30 3ea3df26 3f120e21 3f1b8d0f 3e79068e 3d89a964 -> 3d16e894 3eae9f8a 3f117909", + "3fa74427 3f29aff1 3f29aff1 3f3caec9 3f96bf30 3f8e3ce6 3f8e3ce6 -> 3e257f70 3e4277e8 3d471ec0", + "3f932c8b 3f72f0be 3f93e1e2 3ebf85f2 3e800000 3f800000 00000000 -> 3f30dc81 00000000 3ebf85f2", + "3f54f566 3f845a29 3d91a2e7 3f845a29 3f0fa90c 3f0fa90c bd9c25bc -> 3f091228 3ef16de0 3f8d05cd", + "3d9d56dd bde95bc2 3e280a2c 3e280a2c 3f966da0 be0a6fad be0a6fad -> 00000000 3e20e515 3e20e515", + "3f213e87 be5be51d bdf8ad1c bdf8ad1c 3e75d84c 3e2a1cdf 3f7a8e4c -> 3aba8e00 3c0d4660 3f250e46", + "3cf86189 3f1e3c9d 3ed47185 3f1e3c9d 3f889c49 3e8df89b be05e66d -> 3f1c47a6 3ed52d03 3f1e79fe", + "3ea6c06e 3f682b45 3f682b45 3dce3b0c 3f82547f 3f82547f be77f000 -> 3f2314b5 3f2314b5 3d1a833a", + "bc8ae221 3dd1f099 3dd1f099 3f5c917b 3ed5829e bdef4a07 3ed5829e -> 3dc66de7 3dd52a37 3f5de08e", + "bdd40e68 3e101249 be60a029 3f9bbb25 3cc87b79 3f7fa836 3f7fa836 -> 3e0e34ee 00000000 3faeb3aa", + "3f04c8cd 3effb3f5 3e3c5059 3d77f4e3 3f3284bc 3f7c5080 3f70e8af -> 3effeaf7 3f01d0ee 3efaa688", + "3f16d2f3 bdac0fbb 3f09ce4f bdac0fbb 3d10a6d7 3f762f65 3ebee862 -> 00000000 3efd6392 3e30b758", + "3f22842f 3ee14f68 bceda88b 3ee14f68 3f64e1bc 3f64e1bc bd86afe5 -> 3f0212f6 3f124e03 3edebf63", + "bef1e459 3f8253ca 3ea180a3 b9a27f31 3f6ec183 3f6ec183 3d40e6e9 -> 3fbcc71c 3e1c7457 00000000", + "bee29602 bd3478d2 3f66176c 3f531f55 3e800000 3e800000 3e800000 -> 00000000 3f7cae8c 3f6583ed", + "bbf88a0a 3e9da4db 3ef8a26e 3de55f8c 3eb46300 3eb46300 3d5bf147 -> 3e9d1e49 3ef8985a 3de4b9d8", + "3fa2172d 3e90588b 3e1bdc88 3e1bdc88 be7b38f0 bd056848 bd056848 -> 3e15f071 3dfcf7ba 3dfcf7ba", + "bdd86a85 3e8c44f6 3f2cef99 bdfcd4e7 3ed726c9 3f4f4c2e be0a76c2 -> 3e81fdc5 3f34a04a 00000000", + "3f68c3f5 3f768787 3f09d9ed be09bc70 bdff75c5 3f125e62 3dfae772 -> 3f88b52f 3eff37a9 3be07f00", + "be1376d4 be1d4398 3f87bd8c 3e46a5cf 3dfb6d80 3e9c3fe8 3f346b9b -> 00000000 3f8e0bcb 3e070aca", + "3f81d3f2 3f20035a 3f4ff676 3efc9462 3cdcbf73 3e817324 3e8958a6 -> 3f1e435e 3f26f37c 3efe70de", + "3f14ddad 3f8c99c2 3f819cd7 3f819cd7 bd59832c bda97a2c be764622 -> 3f9154dd 3f87ed68 3f93f70a", + "beff6a6d 3d14c12d 3f59293d 3f9acbd6 3f796f12 3f59f97c 3f986cfe -> 00000000 3f9273de 40035604", + "3fa54241 3f2f6a57 3f12f757 3c4064a0 be052359 3efafede be052359 -> 3f3f5584 3ef5ea75 00000000", + "3ea66a45 3d84fc5d 3f1311e8 3f1311e8 3f421888 3f4ee5a4 3f4ee5a4 -> 3e8f08be 3f090d17 3f090d17", + "3f168980 3e4f7807 bd96b602 3e4f7807 3f3148af 3f3f90a3 3f3f90a3 -> 3ee3bf28 3edcc65a 3eedbc8a", + "3fb18093 3ee00a0d bd163918 be31a2a8 3f941931 bdfbf1c4 3ed1a082 -> 3f234ccd 00000000 3f175e21", + "bd3c0a65 3f7e9e53 be1186c3 3f2e54a0 3f800000 3f400000 3f400000 -> 3f851f40 00000000 3f318561", + "3eeab5b3 3ea69924 3ea69924 3f725a78 3f800000 3f000000 3f400000 -> 3ef8909e 3ecf94e1 3f23b894", + "3f29452c 3e4d05d7 bd9ae1a3 3e852098 3f6dd2fa 3da1d151 3da1d151 -> 3f1189dd 00000000 3e91f74f", + "3f8461a0 be50e4aa be50e4aa 3eb5323a 3f800000 3f800000 3e800000 -> 3fa047d4 3fa047d4 3edbe0db", + "3f6c4a6c 3f2ee434 3e967f06 3f2ee434 3f49ac47 3f49ac47 3e5624d0 -> 3ed565c2 3f17f6a7 3f1cc9fe", + "3f5013fa 3f80e35e 3f8acd2e 3f80e35e be4615a1 3f2b786d 3f2b786d -> 3f954afe 3ee56ade 3ee8f0c0", + "3e645bf6 3f438ad3 3f775b96 3f438ad3 3f93a752 3e43ea6d 3f93a752 -> 3f20cac0 3f6d2c2e 3f20cac0", + "3e80e260 3f431bdc 3f34cee8 3f03143c 3e66091b 3e66091b 3eb544cf -> 3f3b84da 3f2ed5f2 3f0287bd", + "3d6180b8 3e98edeb be47319c 3e98edeb 3f1d9c6d 3f41020f 3e7c0cae -> 3e9feaa5 00000000 3e9bb90b", + "bee1003e 3e389b5f bde14ded bde14ded 3f892c2a 3e95c6b4 3f1a79f0 -> 00000000 00000000 00000000", + "3facdfd9 be2b4e3a 3c298458 3f0d31cd 3f800000 3f000000 00000000 -> 3fd14d3f 3f2bf220 3f0d31cd", + "3f8b46ae 3dbe9786 3ee1590b 3c6cee45 3cb5894a 3e456f75 3f4a52a9 -> 3de6c864 3eee3586 3f597b39", + "3fbba5de 3f33eaea 3e7cf0e2 3f0164bf 3ec2eb68 3f63adb1 3de4dc86 -> 3ef3eeb3 3f681e24 3f00efdc", + "3f8568b7 3d840f91 bb9c3370 3d840f91 3d15f7c4 3d15f7c4 3f50937b -> 3dc82268 3d0a452f 3f4ddca4", + "3f086e58 3f3f6c05 3f88aace 3ee28512 3dc82a50 3e6291ff 3e6291ff -> 3f38d0a3 3f6f0f44 3ee978e5", + "3f9615ce 3eb59227 be0e009c bd785a08 3dee559a 3dee559a be038d48 -> 3ec9e215 3d11eae8 00000000", + "3f9f7411 3f413282 3f413282 3e7247e5 3f92cddf 3eeae4ee 3f92cddf -> 3cdcba40 3eed59a2 3f7d3fc4", + "3fa24df7 3f92dd36 3f92dd36 3e46443d 3e02a79e 3eda8863 3e02a79e -> 3f701a44 3ee4ae1c 3e95e43d", + "bebb7b21 3f9ab2f3 3f4109eb 3f4e3d0d 3e074786 be27b6ef be27b6ef -> 3fa3795f 3f393cd1 3f44daa2", + "3f089472 3f85c0c6 3efcebf0 3f8e1068 3f560d5b 3f557fbc bd942c1e -> 3f0f0a5a 3effa939 3f941731", + "bdf3d534 3f304602 3ec5422c bb87657d 3f587f49 3f21d941 3f21d941 -> 3f39fe98 3ebc6a54 00000000", + "3fa9e202 3f252fd6 3f252fd6 3f246aef 3e9d0405 3e9d0405 be2673f8 -> 3f06ea5d 3f06ea5d 3f342199", + "3f5d9ebd 3f3d3160 3e1e7414 3cd01f2e 3f5b1b14 3f8377fc 3f555cfd -> 3ec50659 3f44cb2d 3f35d3ec", + "3f926f1b 3f898c85 3e0cac17 3f80e45d bd9550bf bd9550bf 3f29dbf7 -> 3f95d169 3d9d753a 3e73040c", + "bea1905b bae88c7f bc531c84 3f27398a 3eb960b3 3f3df7c0 3e9de4ed -> 00000000 00000000 3f2edbe2", + "3fbcb3de 3f603e5f 3ea321ad 3ea321ad 3f5efc46 3f5efc46 3f8067ed -> 00000000 3f48d1d7 3f5ae908", + "3ec85dfb 3f14efbe 3e95ff0f 3e95ff0f 3ef90cfa 3d468425 3d468425 -> 3f0cf731 3e9a0475 3e9a0475", + "3f39d583 3f1f4412 3efbf198 3f58590e be580cb0 3ea78edc be580cb0 -> 3f28d7d7 3efddef8 3f736901", + "3ec01077 3e6b152c 3f7a201f 3f8ad640 3f09782c 3e9f1b9c 3f09782c -> 3ead52be 3f5da702 3f595fa6", + "3f4199c6 3c92baf2 3f5d2a75 3e091636 3f916895 3eeb032e 3f71c299 -> 3f58a350 3f1c7c34 3f282692", + "be8d1d04 3e290a94 bdd66992 3f1a75dd be5d9d85 3f9a113d be592090 -> 3e51f482 00000000 3f175e21", + "3e32e562 3eb9ecc3 3e176b62 3eb9ecc3 3f800000 00000000 00000000 -> 3ed268d8 3e176b62 3eb9ecc3", + "3f038d0c 3f695b6e 3ea3467d 3ea3467d 3d83506c 3e813fb5 3f9c7569 -> 3f626a18 3ebb5501 3f0be148", + "be8efdf2 3e9cb9fb 3f09c071 3f09c071 3f666666 3f666666 3f666666 -> 3e55a464 3f0ea76b 3f0ea76b", + "3f8db220 3e46c253 be3bc67a be32bf08 3f41e044 3f8baf2d 3eccbef6 -> 3f34fe8b 3fbbde6b 3ed8687c", + "3f601d13 39c7a209 3f58a367 3e7c33ac 3edbd300 3edbd300 be62a9c5 -> 3ec07dfc 3f160186 3e1783b1", + "3fa12877 3ee7c7bc 3df4145c 3e4ea548 bd9fac7b 3e6050cd 3f82d3e4 -> 3ee30677 3ea892a0 3f7822c3", + "3f4ad92d 3d865a85 3eea0ebd 3eea0ebd 3f400000 3f800000 00000000 -> 3f14f82f 3f066a5a 3eea0ebd", + "3fb62d55 3ed1cfa6 3f562e9f 3f3ffe4d 3f400000 3e800000 3e800000 -> 3f1a35aa 3f18da38 3f12742c", + "3fbf89d4 3ede25ee 3f889641 3f01f611 be74fa93 be74fa93 3f9cafdf -> 3ec5e925 3fbc8ee2 3ef58d79", + "bec0af56 3f824e18 be4b949c 3e86065f 3f000000 3f400000 3f000000 -> 3f9b4216 00000000 3e303dfa", + "3f76c3d5 3f35b260 be60d386 3f35b260 00000000 3f400000 00000000 -> 3f35b260 3f5222b6 3f35b260", + "bed9ed49 3df830f0 3eab70cd 3f703f96 be36336e be36336e 3f123042 -> 3e36d9cb 3eb83fa9 3f936846", + "3f5c17b4 be6284c0 3ee99ec1 bd47ec09 3f845542 3eb8e355 3eb8e355 -> 3f87ca9d 3ef78425 3e957b4e", + "3f8d8713 3f00973d 3f86df30 3eb66b98 3f33c11b 3f830c4a 3f33c11b -> 3eff58d0 00000000 3f1455e2", + "bdc4e48a bd8954db 3eef9038 bd8954db 3f37e43a 3f8aa7e8 3f37e43a -> 00000000 3eec23cd 00000000", + "3e0d444e 3f3d2c95 3f4b0591 3f3d2c95 bd0e190e bd0e190e 3f13474f -> 3f3dc27c 3f4bbd66 3f3376b7", + "3f375814 3dfdbcb9 bdcdd1c9 3f2e628b 3ee65d05 3ecaef04 3f51b813 -> 3ebb8954 3e76313a 3eefe95b", + "3f1d06d6 3f780ea8 3f3bb903 3f780ea8 3f249263 3f25f537 3f249263 -> 3f196010 3f0c39ee 3f196010", + "3d13d642 3f161e3d 3f161e3d 3f815ca7 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f1595fe 3f1595fe 3f7f9410", + "3f95c385 3e67e49d 3e67e49d 3e14f9ab 3f4746da 3f4f0281 3f4746da -> 3f3987fb 3f3e7b28 3f4a8fc8", + "3f7718fb 3f77ed89 3e926f7a 3f77ed89 3e3f8bb5 3f4dae55 3e77de35 -> 3f4c9f1f 3f1e2f6a 3f3fe343", + "bef00c0a 3f6f248d 3f986c16 3d8a4aed 3f98c5d0 bd8e0c9d 3f98c5d0 -> 3fb5c3c1 3f92abe3 00000000", + "3d5ee901 be7b4ae1 3f1b2959 3f0f41ea 3f0fd806 3f0fd806 3e696281 -> 00000000 3f198019 3f0ee105", + "3f5aae72 3f947aae 3ee4ed67 3f96fc32 be13318b be13318b 3ee6ddb7 -> 3fa939bc 3ede4766 3f27f377", + "3f585c9b 3f0ef1cc 3f0ef1cc 3ee6b5e2 3d54b7e2 3f87d4e9 3f9fd0c7 -> 3f0da1f4 3ee8468e 3f0e0aab", + "becd953f 3f5fcafd 3f638c33 3f5fcafd bc982405 3f23cdd7 be78972d -> 3f5e5d3f 3f8b5990 3f4d1e23", + "3eb1c51d 3ead5147 3dd5cbdd 3ead5147 3e5e362a 3e5e362a 3f9b8c03 -> 3eb9c6e5 3e27f16d 3ef31702", + "3f675bd3 be716b3e be339227 be339227 bd76b15a 3f675409 3f956f7f -> 00000000 3f6d7df6 3f9ff89c", + "3fa220ce be103277 3f3f56d0 be103277 3f646a1f 3f0971c6 3f9e1a38 -> 3fa75fbe 3ed262a0 3feea19d", + "befe69b7 3effaf87 3e60de92 3e60de92 3f4b538a 3efb52e3 3efb52e3 -> 3eff7002 3da999c4 3da999c4", + "3f6665dd be73d0ee 3f0d1a9f be73d0ee 3e800000 3e800000 3f000000 -> 3dc09898 3f07350f 3eda34c3", + "3ec5d93f 3d8683ed 3e022dee 3d8683ed 3f000000 00000000 3f000000 -> 3e6f1dca 3e022dee 3e6f1dca", + "3f80dd35 3f8fb99c 3b8d8c18 3f03fa68 3f984420 3f311d83 bca0e244 -> 00000000 3f31e053 3f0422ad", + "3f818867 bdf8c1da 3ec20f9a 3ee50070 3f285381 3f6b614c bdd64bad -> 3f34a0c0 3f1aa99b 3edf48b7", + "ba855423 3efbf408 3f3e7e5c 3ed97c91 3f5668c3 be7dabfb 3f5668c3 -> 3efbf244 3f3e764c 3ed96bc4", + "3eaffc6e 3e5dfc35 3e3eb1e4 3e5dfc35 3e65ef1f bdd1af30 be263fd3 -> 3e856055 3e281483 3e3d9df4", + "3fb88d4d 3eeb6f95 bd6f80b3 bd6f80b3 3daf0c39 3f808560 3f41d6db -> 3ef0811d 3fc77d29 3f9498e8", + "3fb06425 3d438836 3f79ba21 be5f9138 3f7334e1 3cb1496a 3cb1496a -> 3f9daff0 3f72776c 00000000", + "3ed5573f be383e2e 3f3b012d 3da7ec82 3f6f6299 3f6f6299 3f9d6bbf -> 3eb32945 3f0d0614 3f02aa6f", + "3ece3a14 3f94eead 3f94eead 3f8467b0 be38e15d 3f4bc99e be7f1d4a -> 3fa14905 3f3cef5e 3f92223a", + "3e4a85a1 3f844800 3e6ae2a4 3f8e6e84 3eda4273 3eda4273 3f0b8318 -> 3f718918 3e8cce56 3f7b0caa", + "3f0ad9f5 3f1235da 3f1a97ad 3f21fda8 be724500 3ec354ae 3f8cc547 -> 3f16e24f 3f0f9655 3ef2e112", + "be5f1c55 3e870a3a 3f86e39d 3f98cc67 3f75e6c5 3f75e6c5 3f8c469f -> 3e28d190 3fa48fb8 3fc33460", + "3fb2cc04 be0fb7ba 3e4c9f77 391269c2 3e800000 00000000 3e800000 -> 3e9d204a 3e4c9f77 3eb2d188", + "bde6acab bcb0c34c bdabb4e6 bdabb4e6 3e57f54b 3e57f54b 3f527b56 -> 00000000 00000000 00000000", + "3e5b87db be655bfd be655bfd 3e162b95 3f8b6391 3f549bce 3f8b6391 -> 3de9981a 3d0a8a74 3e9f8ee1", + "3fbc8466 3ef5d667 3f94bd23 be3c85f3 bcb81c8e 3f381827 3f963988 -> 3ef52a2c 00000000 400b933e", + "3f5994ba 3f3ad6c2 3f414239 3f414239 3f7963e6 3ea22356 3f8f0beb -> 3eb2cecc 3f1e213c 3e8a93ce", + "3f9a8a1a be215892 3f3bd453 3f1b12e0 bdb4a700 3f78b327 3f63151b -> 00000000 3e3debe0 3ec22b02", + "bcb637d2 3f479a70 3f51c039 3f9acbc3 3f894e43 3f894e43 3e48f4f8 -> 3f4b052f 3f55a6f1 3f9b96b0", + "3eb4ae28 3f2f539c 3edddc24 3f9b788c 3f7650b4 3f9c487c 3f7650b4 -> 3f0f301e 3efb4792 3f3ab596", + "3ed0a042 3e792b4c 3ea237a5 3ea237a5 3f543721 3f543721 baaad3fb -> 3ed55d26 3ee192c8 3ea21e25", + "3f4b4675 3e1f7bd4 3e1f7bd4 3f8cc171 3f42d741 3f7d763c 3f42d741 -> 3f12643c 3f3270a4 3ebfed88", + "3dda38ae 3d98d643 3f36e2c8 3ee5b3ac 3f71d40f 3f595cbe 3f5af573 -> 3e241af2 3f2cf464 3eea7ec9", + "3e61db5a 3f960c52 3f960c52 3ef7ee63 bd45dcfb 3f287c7d 3f19e2ea -> 3f97e1ba 3f7a21cc 3efa1220", + "3f50818d 3f3be465 bcd02480 3f3be465 3e8bb188 3ed24338 3ed24338 -> 3f214608 3ea6f292 3f13d39e", + "3fab5c10 3f3d7e38 3edf7d96 3f923614 3f0bece1 3f963e0a 3f0bece1 -> 3ec6ffca 3f22d477 3e4f2da0", + "3edff5f3 3e8ce3a1 3e8ce3a1 3f002b98 3f5bcbb4 3e0215cf 3f4a4796 -> 3ee35a02 3e99aeaa 3f000d76", + "3d8d93fa 3df6318e 3f646628 3f2dc844 3effe3fe 3f46b964 3effe3fe -> 3e15f85b 3f599fa3 3f2a9e64", + "bec31872 3f970f00 3edbe5e2 3db4a8f0 3f71f723 3efa100a 3f71f723 -> 3fd5c496 3ece75e4 00000000", + "3eecaaad 3e91b431 3ea98d43 3e995b19 3cb96d73 3f1fa66a 3f6af82a -> 3e94030c 3edb646e 3ef073e8", + "3fb12a6c 3e84505f be19fbc2 be19fbc2 3eaaa3f1 3f1c57d4 3d6444a6 -> 3ef66d1c 3f72fb00 00000000", + "3ebb0e35 3f9b90c5 3ee139ee be705d63 3f5757bc 3f5757bc 3f70c907 -> 3f469248 3ef4241c 3e8a5a32", + "be93d1df 3f956cc4 3ec76937 3ec76937 3f800000 3f800000 00000000 -> 3fc6c041 3ea6bc3d 3ec76937", + "3f1a0903 3f27ec2e 3f45c2bb be191022 3f9260b2 3f9260b2 3f6973c0 -> 3ee1f6c3 3ecb83d7 3f10320e", + "3e868ac3 3f065597 3ec36c4f 3f065597 3f8bfcc0 3f8bfcc0 3f77c307 -> 3f02b18b 3ee63db8 3f031cc8", + "bece1e14 3f8fac28 3f9dcada be1cc7ca 3f475624 3f779e4b 3f82c37d -> 3fc19f32 3fe6d626 00000000", + "3e774406 3f87516d 3e4e62d1 3e01ed1f 3cad29e4 3cad29e4 3da436cf -> 3f86970c 3e518180 3e10b8b3", + "bed1ad68 3ef3a163 3f70799c 3f70799c 3f1d5ca4 be233b8c 3e1cbaa5 -> 3eed671a 3f61ca3e 3f7e9332", + "3f71928c 3ed69971 3f606fe3 3e6fe6ef 3f869bd7 3ef28bc4 3ddbf5ea -> 3f146257 3f0a37b2 3e938730", + "3eb21ba0 3eac273d 3b769597 3eac273d 3f7b6a38 be4374b2 3f729b31 -> 3ee57188 00000000 3ee36fae", + "3f430693 3e01662a 3e01662a 3e5954e0 3d27ea5f bd9db421 3f56d02f -> 3e194c03 3da9052e 3f14844b", + "bd8a8490 bdac2618 bdac2618 3e771ca7 3f1c3d15 3f9db7e9 3f1c3d15 -> 00000000 00000000 3e613e59", + "bea34e6f 3f60b1de 3f76037c 3f9598ce 3f5e32a3 3ef1171a 3f9e2418 -> 3f8b1ddc 3f8cbb3a 3fd90ef0", + "bd5a59d8 3f62af71 3ea3cc29 be514b9d 3f000000 3f400000 3e800000 -> 3f67f232 3e9c6cbd 00000000", + "3f491cb3 3d5f01cd 3f114bcf be0ed4a4 3f561579 3f561579 bda275a9 -> 3f23ceb9 3ef523f4 00000000", + "3cf7259b 3f522bce 3e9699b3 3e7d38b9 3eb80061 3eb97441 3eb80061 -> 3f5063a8 3e98e76a 3e816aa0", + "3fb021fe be52073d be646a97 be646a97 00000000 00000000 3f800000 -> 00000000 00000000 3fe22879", + "3fb36cdb 3f86fbe2 3f06d246 bcaae927 3f29e634 bd885c2c bd668b1a -> 3cba4800 3f08183d 00000000", + "be3065fb 3d82f8ed 3d82f8ed 3f999324 3e3b982e 3eedec59 bde11fa4 -> 3d1536f8 00000000 3f962eb2", + "3f89a4fd 3e5f9c97 3e016592 3e016592 bc9f793b 3ef47374 3e8f9d27 -> 3e53899e 3f029119 3eb41a6b", + "3f84bafa 3f95153a 3f73d6bc 3e4b00ae bd26aae7 3f8bb115 3f8bb115 -> 3f9c434e 00000000 3f6197bc", + "3e9ac2df 3f013243 3f78ad6a 3f79f993 3e39ac30 3ce173f2 bdd1c190 -> 3f0110b1 3f76ab6d 3f80c37a", + "3fbc15a7 3f502478 3f502478 3f8721f1 3f6c4593 3f412803 3e322bf2 -> 00000000 3df37ba0 3f4584d8", + "3eae1e44 3f8df63a be51f925 3f59a1f8 3eea23fe 3f416e1e be13432f -> 3f6b6cfd 3e210ea7 3f626662", + "3f4128dd 3f81a32c 3f82390d 3d898c4d 3d39a970 3d39a970 3df1c6cc -> 3f7a4b9b 3f7b62da 3e13bc50", + "3f3bbaee 3f8c5b2c 3f04584a 3f8c5b2c 3f000000 3e800000 3e800000 -> 3f28b9a4 3f02c075 3f60b7fe", + "bde283d1 3f0891fb 3f0891fb 3e96e581 3e800000 3f800000 3f400000 -> 3f090b50 3f0a774d 3e857599", + "3f8fd524 3f884cde 3f77e968 3eb4e3d7 bc181ae7 3f425466 3f31e41d -> 3f89cf0a 3e2d5fc4 3f151804", + "3e1b293e bcadd594 bcadd594 3f5ebb2c 3e80f755 3ed753d8 3e801b73 -> 3c981986 3d392e00 3f578c4f", + "3c8d74de 3f76f028 3f76f028 bd192d73 3e630f66 3e9d7e7e 3e630f66 -> 3f7606fe 3f75acb3 00000000", + "be82079a 3f26279b 3ecaa936 3f259b71 3ee49721 3f126993 3f1be5eb -> 3f2ecea1 3ebb2a8c 3f313d5f", + "3f4c9cf2 3f2843c0 3f9d5b8d 3f628a23 00000000 00000000 3e800000 -> 3f2843c0 3f9d5b8d 3f3b28e5", + "befb03e8 3ea35a1e 3ea35a1e 3e8dc50d 3f9b33d2 be6d6f6b 3e0ec1ac -> 3dd4ced0 3eb86a82 3e7c4f4e", + "3f789ff8 3f57317d bdce5074 3e040619 bd972bbc 3f604deb 3f604deb -> 3f63b1d4 3f6bf196 3f42acfc", + "beb116ec bdbce6b4 bd1cf65b 3f682ad1 3f667aee 3f89bde7 3f89bde7 -> 00000000 00000000 3f9adada", + "3eebca97 3f967017 bd84accb be1e9671 3f840a4b 3f840a4b 3e01738d -> 3f089ef2 3ef19473 00000000", + "3f7a751e 3f29a5ef 3f6872a8 3f6872a8 3ee275c2 3f52e5c9 3f52e5c9 -> 3f059a7d 3e8029ba 3e8029ba", + "becddbbc 3f61e7b5 3f14beda 3df2d9bf 3ec8294e 3ec8294e be212515 -> 3f805778 3f1b446a 3e2ad9be", + "3f681cec 3f12a054 be6716e7 be3f3956 3f9543bc 3eed0bf9 3eb530b3 -> 3ed67a12 3ec46400 3e82076b", + "3f4070c2 3ede0b90 3ee60ea6 3ee60ea6 3f2e37fd 3f2e37fd be502ff7 -> 3f0064a2 3f004ce4 3ede20a5", + "3f6a7532 3f285c24 3f285c24 3f103671 3f73ab02 bd0b4194 bd0b4194 -> 3ec3fcd5 3f2adf92 3f1138e8", + "3f206a37 3ef5dec1 3e8d18ff 3f1c4bca 3d909fe3 bde684f0 bde684f0 -> 3ef6c442 3e79c746 3f20499e", + "3fb540a5 3d4835dc 3f5d7968 be7a437e be0fe9cc be0fe9cc 3f696f6f -> 00000000 3f8156e5 3fd6c79f", + "3f31ecc8 3ee1ac2c 3f281d3e 3f281d3e 3f71002e 3f9ab37d bdc5888c -> 3f04adf0 3ec971be 3f2d7e0e", + "3f11284c 3f992775 3f20d7d2 3f749ae8 3f612cf3 3f1170d6 3f0f9bf4 -> 3f00725c 3f0baed2 3f2a6cba", + "3f9cc60f be582311 3e8ac1f9 be582311 3f784f09 3f2d9360 3f7560f9 -> 3fbd3d2a 3f26be0e 3fbaafec", + "3d12fc69 3f0332f0 bdb964e3 be6334af 3dc224e2 3f8f1c7f 3ed51b2b -> 3f032d5e 00000000 00000000", + "3ea4ff70 3ec71def 3e9f5911 3e32d165 bb80a66c 3f71e455 bbb28965 -> 3ec6f916 3eda3598 3e31a5de", + "3fb29eda 3f915581 3f86c121 3f86c121 be6b9665 3e1e9f96 be6b9665 -> 3fc58f06 3f505471 3fb42f98", + "3f89e3a6 bdc2bc7a 3f75c393 bdc2bc7a be5c8cc2 3f9ab12b 3e90ec47 -> 00000000 00000000 3e89200e", + "bd36352f be3ca244 3f578f03 3f98cea3 3f7bc8af 3eed4468 3eed4468 -> 00000000 3f5b2b2a 3f9c77f8", + "bef9e4db 3c810532 3e8622d8 be7750d1 3f96fbac 3f00e9db 3dc70488 -> 00000000 3e14774e 00000000", + "3f551655 3f5c3d52 3f5c3d52 be3f0887 3e7a2aa2 3f926f2f 3f926f2f -> 3f36b9ba 3e324744 3f8f7c88", + "3f782e08 3f7f10e1 3f7f10e1 3f83cfe2 3ca6ac76 3f8e7fb0 3f1c1e83 -> 3f7a0da7 00000000 3ece84a8", + "3e86a2a1 be5585e5 be5585e5 bdb2aec7 bcfdcbc8 3e2c8c33 3f0c5505 -> 00000000 00000000 3da80b35", + "bc277824 3f49ecaf be529892 be4cadf5 3f1a231c 3f1a231c 3f9189f2 -> 3f4ad59f 00000000 00000000", + "bda80a98 bd6eef24 3ddc4852 3ddc4852 3f400000 3f000000 3f800000 -> 00000000 3d9a5618 3d30c7be", + "3f971acb 3ea33e30 3ea33e30 3f6a9180 3ed17bc6 3f803a53 3ed7411a -> 3efcd8ad 3f3f510b 3f00c98a", + "3eb3e8e7 be070287 3f6c2bba 3eb32552 3f3cbd55 3e2472e1 3e84d67a -> 3e483983 3f5ff666 3ec128ac", + "3fa76f0e 3f0a0cb5 3eb37f28 be217fa4 3e800000 3f400000 3f400000 -> 3f037a0e 3f24cd70 3f90ff74", + "3f9532af 3f399453 3f399453 3f921405 3f2aae1e 3f050a0e 3f050a0e -> 3ec02bcd 3ee7a4e1 3eba8ff4", + "3f794e3f 3f6c642b 3eee5e6b 3eb7adf4 3f32e10a 3ec7e54e 3f398442 -> 3eb1c0ae 3efbc6a6 3f0ee0ca", + "3fbbcdaf 3f03b62a 3e34f184 3ea4f9bc be25bb71 3e7df0c4 3e7a6400 -> 3f05796e 3ed2ed74 3ee649de", + "3ebaba24 bd237255 3f378697 3f73c34b 3e800000 00000000 00000000 -> 3d6fcfef 3f378697 3f73c34b", + "3f0943d4 3dd1d540 3dd1d540 3f23e414 3e9c4450 3f85622f 3f972ca8 -> 3e6e27b6 3f0bf4e4 3eecde10", + "3fa42dce be329992 3f5c84de be0620cb 3f1a9d58 3eb30aac 3f4341e7 -> 3f5ed828 3f09861c 3f8d4309", + "3d14f303 bd6ff3a4 3ee5f2d7 bd6ff3a4 3f655cee 3f02ee6f 3f133ddc -> 00000000 3ee6eaea 00000000", + "3fb77018 3f953b99 3f3cb6cd 3f3cb6cd 3e58198a 3c59ce43 3c59ce43 -> 3f435b14 3f3a6693 3f3a6693", + "3fb43653 3f5a50f6 3e228f07 be432496 3edf527e 3db436fe 3db436fe -> 3ed6c7f4 3e79249a 00000000", + "3d905d6d 3ed5ef9b 3f37ecd0 3ed5ef9b 3f000000 3f400000 00000000 -> 3ed8e6ad 3f320302 3ed5ef9b", + "3f8241fe 3f9a18ea 3c1a6514 3da22e63 3f84a228 3f84a228 3f800dbb -> 00000000 3f85a2a4 3f6f9e9f", + "bce1e6a5 3e9bd3b5 3de447c0 3de447c0 3f000000 00000000 3f800000 -> 3e99108c 3de447c0 3db86522", + "be99a6fd 3f5f9f35 be3322e1 be3322e1 3f098b56 3f387ea9 3f8c19ba -> 3f7e753e 00000000 00000000", + "3f1aa3b1 3d818930 3d818930 3f38458d 3dcccccd 3dcccccd 3dcccccd -> 3ded9912 3ded9912 3f317930", + "bd1c6d8e 3e48f56c 3e48f56c bd599e77 3ee8368a 3e55e0ce 3f49d5e0 -> 3e3e2f03 3e43ff1d 00000000", + "3f642fc3 3f90bc02 3e01fb94 3f3e0072 bd339e92 3f93b9f1 3e0e51eb -> 3f970bbf 3f64fd91 3f2ea3c1", + "3efe58cf 3dd469f7 3f738fd5 3d0d6641 be62b692 be62b692 3de5f314 -> 3c878ec0 3f867db1 3db10b8e", + "3f023259 3f8384df 3f8384df 3e4bab04 3ee6f460 3f23d3a2 3caa8b7a -> 3f49144c 3f2f233f 3e52327a", + "3facc743 3f8c77d5 bdd88366 3f6858e5 3f3a1fa7 3f3a1fa7 bcf75657 -> 00000000 3f8aa567 3f70da40", + "3a815f52 3e2002e1 3ea1e030 3f8cbec7 3f5e2b1f 3ecbf276 3ecbf276 -> 3e209d41 3ea1f323 3f8caf54", + "3f101586 be2527d0 be2527d0 be013e82 3f60cbc9 3f60cbc9 bdaaee64 -> 3efc16e4 3efc16e4 00000000", + "3f60901f bda030fc 3f5e49ed 3f5e49ed 3f4af289 3f1241e1 3e009dba -> 3f39d9e0 3eff900e 3f498301", + "3f03c837 3f652c2d 3ed7b020 3e49c9f5 3eb2f78f 3e37c214 3e517a21 -> 3f40c366 3edf22c2 3e858fc0", + "3fbea404 3ed3015e 3f534846 3ed3015e 3df46dfd 3f2fecf4 3df46dfd -> 3ee3006e 3e2333f0 3ee3006e", + "3fae8430 3f2eee9f bdd00f57 3f2eee9f bd01584e bd134a72 bd134a72 -> 3f32f92f 00000000 3f3388b8", + "be80da2e 3f6ed183 3f6ed183 bd7a1f4d 3e658d0b 3f711b58 3f711b58 -> 3f7b527e 3f91ad00 00000000", + "3fa93cad bd9ff0cb bd3b03bb bd9ff0cb 3f83e729 3f1fb4b7 3f07aa4e -> 3fbfa3fd 3f5ac043 3f3b6545", + "3f0d7348 3f52fac7 3e94ba0b 3f0b6596 3f800000 3e800000 3f000000 -> 3eee8f99 3eb25cf6 3f051981", + "3f7440b9 be109fdc be7223f3 3eddca61 3f400000 3f400000 3e800000 -> 3f46c76e 3f514a5b 3eee1c41", + "3f8d323b bd7666e6 3f32cef0 3f32cef0 3f79cbad be6237d1 3f702933 -> 3f92a676 3f4b924c 3e934d34", + "3fba14d6 3e9ab0f8 3e9ab0f8 3f9f51fd be04e144 bcd0b412 bc4aa827 -> 3e68ef8e 3e932fe0 3fa2bf94", + "bd8c9261 3e94061d 3e94061d bda8acd6 3ee9ea7e 3e704a0a 3e1c149a -> 3e8d407c 3e908baf 00000000", + "bbad437d 3f1a0b8b be258c02 3f1a0b8b 3f8eeb4b 3f458472 3f83d2ee -> 3f1a5a46 00000000 3f1a5429", + "be9a74c6 be7f9f91 3dc19c79 3f416edb 3ec22c32 be5542c9 3f204022 -> 00000000 3e14f9fa 3f5a2555", + "3f98319d 3e9646aa 3f006146 3f006146 3eb92d2d 3eb92d2d 3f7b563e -> 3ef134b3 3f000d9b 3efefc56", + "3f2cdb2b 3f9a848d 3f9a848d 3f80c60e 3e2dfc7f 3e79cc0d 3f9ac81b -> 3f85bf96 3f7965ab 3e37fd64", + "3e4926f6 3ea110be 3ea110be bd8920e3 3f84ad4f bd7350c6 bd7350c6 -> 3ec7b9c6 3e9ed98d 00000000", + "be3b6b47 3d382670 3e64dd14 3f210673 3e489559 3e9e6d0a be011481 -> 3c4a0638 3e44cb38 3f1f8056", + "3e584cce 3dd6a585 3f81d229 3e730ea4 3f276a49 3f276a49 3f37d254 -> 3e5b2014 3f5f45c4 3ea25206", + "3fbd5d3e 3ead5821 3f5519e8 3f8faa60 3e8350c0 3e8350c0 3f2f7487 -> 3eec1195 3f14855f 00000000", + "3fb04564 3ea1add1 3f7db73a bd806403 3f8af907 3f9b6db7 3d84874d -> 3f5ddd92 00000000 3d19ffde", + "3f4f650a 3f5801cb 3e79f42d be23bb87 3e8b1138 3e8db1d4 3ef2a753 -> 3f3146a3 3eb7ba78 3eb194c2", + "3e859b9d 3f8606ca 3e21cfb0 3f89ef81 3f8aac03 3f175202 3f08d4e7 -> 3f3cdd46 3e86ebea 3f6a9f0e", + "3ef7312a be27e534 3e0c92a3 3e0c92a3 3e800000 3f800000 3f000000 -> 00000000 3ef99c3c 3e9ff2c8", + "3add0935 3cc9bae3 3e3e20d4 3e3e20d4 3f5d5c20 3f8c89f7 3f87311d -> 3cd5164f 3e3f51f7 3e3f465b", + "3f9c773e bc5f415e be688c1e bc5f415e 3e94d660 3e94d660 3d0e87ef -> 3eb3eb35 3e944c5f 3cf6534f", + "3f46c8c2 3f32bdeb 3f32bdeb be5f5e50 3f841fa2 3d93f73e 3f0ffd54 -> 3ec2cd53 3f2d0c6a 3ed17cec" + ] + }, + { + "function": "cycles_mix_dark", + "node": "ShaderNodeMix RGBA DARKEN", + "cases": [ + "00000000 00000000 00000000 00000000 3f63e576 3f236cb6 3f1b45ca -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 bd0045c0 3ea1a8da 3ea1a8da -> bc8045c0 00000000 3e800000", + "3f800000 00000000 00000000 3f000000 3e811d71 3ef278cf 3ef278cf -> 00000000 00000000 3ef278cf", + "3fc00000 00000000 00000000 3f400000 3ec07c00 3ec07c00 3f022729 -> 00000000 00000000 3ec6757b", + "bf000000 00000000 00000000 3f800000 3f24c5fe 3f223407 3eee4dc9 -> 00000000 00000000 3fa23647", + "3e800000 00000000 3e800000 00000000 bd0adb08 be14f837 bd0adb08 -> bc0adb08 3e1ac1f2 bc0adb08", + "3f400000 00000000 3e800000 3e800000 3ebd88c4 3caadb16 3caadb16 -> 00000000 3da00914 3da00914", + "40000000 00000000 3e800000 3f000000 3f4d53f2 3f1a4ae9 3f4d53f2 -> 00000000 3e800000 3f000000", + "00000000 00000000 3e800000 3f400000 3ef5ddf4 3f77cc74 3ef5ddf4 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3f1e62ca 3f1e62ca 3e021e64 -> 00000000 3e800000 3f1043cc", + "3f800000 00000000 3f000000 00000000 3f5fbf12 bdc98544 3cf64649 -> 00000000 bdc98540 00000000", + "3fc00000 00000000 3f000000 3e800000 3f2049b5 3f929b9b 3f2049b5 -> 00000000 3f000000 3e800000", + "bf000000 00000000 3f000000 3f000000 3c638445 3c638445 3f11d73d -> 00000000 3f3e38f8 3f000000", + "3e800000 00000000 3f000000 3f400000 bbf8ec44 bbf8ec44 3e2c3e45 -> baf8ec44 3ebf0714 3f1ac3e4", + "3f400000 00000000 3f000000 3f800000 bda75870 3eb889e9 bda75870 -> bd7b04a8 3eca676f 3e413ed8", + "40000000 00000000 3f400000 00000000 00000000 3f800000 3f400000 -> 00000000 3f400000 00000000", + "00000000 00000000 3f400000 3e800000 3d8a0cf6 3f3b53af 3f939cb5 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f7b87de bc77787e bc77787e -> 00000000 3ebc221e 3e78443c", + "3f800000 00000000 3f400000 3f400000 3f31aae9 3eb201eb 3eb201eb -> 00000000 3eb201eb 3eb201eb", + "3fc00000 00000000 3f400000 3f800000 3efc9354 3ec15dca 3f9c5c8c -> 00000000 3e441960 3f800000", + "bf000000 00000000 3f800000 00000000 be18124b 3e0ccab5 3d87c21a -> 3d98124b 3fb73355 00000000", + "3e800000 00000000 3f800000 3e800000 3c4a0a5b 3f8c7d0d 3f93646f -> 00000000 3f800000 3e800000", + "3f400000 00000000 3f800000 3f000000 3eea61ba bd6e0347 3f536a31 -> 00000000 3e535f64 3f000000", + "40000000 00000000 3f800000 3f400000 3f800000 3f400000 3f400000 -> 00000000 3f000000 3f400000", + "00000000 00000000 3f800000 3f800000 3e3bf56e 3f935eba 3f081b94 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 bc4d5cb6 3e0a4109 3f6a0798 -> 3df32a34 00000000 00000000", + "3f800000 3e800000 00000000 3e800000 3f459aab 3f459aab 3eaaa6cb -> 3e800000 00000000 3e800000", + "3fc00000 3e800000 00000000 3f000000 be1f3cc9 be1f3cc9 3f56e508 -> beb76d96 be6edb2e 3f000000", + "bf000000 3e800000 00000000 3f400000 3eb7bf6f 3ebe6e9f be40d716 -> 3e800000 00000000 3f9c0d72", + "3e800000 3e800000 00000000 3f800000 bd31c202 3cdf8e0b 3f8df13a -> 3e34e3e0 00000000 3f800000", + "3f400000 3e800000 3e800000 00000000 3ef921f4 3eb0eb44 3e9f8cb8 -> 3e800000 3e800000 00000000", + "40000000 3e800000 3e800000 3e800000 3f82233d 3f5435dc 3f8457d7 -> 3e800000 3e800000 3e800000", + "00000000 3e800000 3e800000 3f000000 3f835ccf 3e847cf0 3e2eace4 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3df9e99e 3f463e4a 3eda2a7b -> 3e3e7a68 3e800000 3f168a9f", + "3f800000 3e800000 3e800000 3f800000 3f800000 3f000000 3f400000 -> 3e800000 3e800000 3f400000", + "3fc00000 3e800000 3f000000 00000000 3e9f7565 3ee667fb 3e1a67f9 -> 3e800000 3ed99bf8 00000000", + "bf000000 3e800000 3f000000 3e800000 3f9c36c6 be586915 3f1253bc -> 3e800000 3f5b0d22 3e800000", + "3e800000 3e800000 3f000000 3f000000 00000000 3f000000 3e800000 -> 3e400000 3f000000 3ee00000", + "3f400000 3e800000 3f000000 3f400000 3e3dacbf 3f7d1de4 3e3dacbf -> 3e4e418f 3f000000 3ea720c8", + "40000000 3e800000 3f000000 3f800000 3ed97289 3f4757cc 3f4757cc -> 3e800000 3f000000 3f0eaf98", + "00000000 3e800000 3f400000 00000000 3ee18aa1 3f99910b 3f702f9b -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f8d72ee 3f6ac084 3f6ac084 -> 3e800000 3f400000 3e800000", + "3f800000 3e800000 3f400000 3f000000 3e800000 3f800000 3f800000 -> 3e800000 3f400000 3f000000", + "3fc00000 3e800000 3f400000 3f400000 3f13bee0 3f5915ce bc8cf221 -> 3e800000 3f400000 becd36b4", + "bf000000 3e800000 3f400000 3f800000 3f83c891 3f949415 3f949415 -> 3e800000 3f400000 3f800000", + "3e800000 3e800000 3f800000 00000000 3c8e19ed 3d485bed 3d485bed -> 3e4470d0 3f432170 00000000", + "3f400000 3e800000 3f800000 3e800000 3f9ea913 3f9b4c78 bd414767 -> 3e800000 3f800000 3cde14e0", + "40000000 3e800000 3f800000 3f000000 3f000000 00000000 00000000 -> 3e800000 bf800000 bf000000", + "00000000 3e800000 3f800000 3f400000 3ef9f803 3ef9f803 3b02aa3b -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f412fd0 3f412fd0 3e448aea -> 3e800000 3f6097e8 3f18915d", + "3f800000 3f000000 00000000 00000000 be519d1d 3f98bda1 bdcffac7 -> be519d1c 00000000 bdcffac7", + "3fc00000 3f000000 00000000 3e800000 3f419c96 3dd31bab 3f419c96 -> 3f000000 00000000 3e800000", + "bf000000 3f000000 00000000 3f000000 be6ad9ea be6ad9ea 3f9a7e89 -> 3f5d5b3d 3dead9ea 3f000000", + "3e800000 3f000000 00000000 3f400000 3f16313e 3f9d8f91 3f833efe -> 3f000000 00000000 3f400000", + "3f400000 3f000000 00000000 3f800000 3e1e3dc7 3e1e3dc7 3edbfb73 -> 3e76ae56 00000000 3f127e4c", + "40000000 3f000000 3e800000 00000000 3f83ab8e bcc4e688 3f93c648 -> 3f000000 be989cd0 00000000", + "00000000 3f000000 3e800000 3e800000 00000000 3e800000 3f000000 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3ec282e8 3ee7d1cf 3ee7d1cf -> 3ee14174 3e800000 3ef3e8e8", + "3f800000 3f000000 3e800000 3f400000 3f24882d 3e9db48d 3d25a9f5 -> 3f000000 3e800000 3d25a9f0", + "3fc00000 3f000000 3e800000 3f800000 3f9ad3d1 3d9ea05a 3f91da58 -> 3f000000 bc107bc0 3f800000", + "bf000000 3f000000 3f000000 00000000 3f851893 3f85f37a 3f22fabe -> 3f000000 3f000000 00000000", + "3e800000 3f000000 3f000000 3e800000 3e1ccded 3e379875 3e379875 -> 3ed399be 3ed6f30e 3e6de61d", + "3f400000 3f000000 3f000000 3f000000 3e223c50 3ce04b2d 3e9fa7aa -> 3e79ad3c 3e15070c 3eb7bdc0", + "40000000 3f000000 3f000000 3f400000 3f70b15d 3e9508da 3f32da31 -> 3f000000 3da846d0 3f25b462", + "00000000 3f000000 3f000000 3f800000 3f0b2d86 3f9cb4bd 3f4e884d -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3e83e7ba 3e83e7ba 3f9e1675 -> 3ec1f3dd 3f00f9ee 00000000", + "3f800000 3f000000 3f400000 3e800000 3f746dc7 3f746dc7 3f89e59c -> 3f000000 3f400000 3e800000", + "3fc00000 3f000000 3f400000 3f000000 3f58ab80 3f9cbe18 3f58ab80 -> 3f000000 3f400000 3f000000", + "bf000000 3f000000 3f400000 3f400000 3f72126e bc4f984a 3f368255 -> 3f000000 3f90cf98 3f44bed6", + "3e800000 3f000000 3f400000 3f800000 3f683213 3f1dad4d bdccb327 -> 3f000000 3f376b53 3f399a67", + "3f400000 3f000000 3f800000 00000000 3f000000 3e800000 3f800000 -> 3f000000 3ee00000 00000000", + "40000000 3f000000 3f800000 3e800000 3eaaf3cb 3f5c4bf0 3d60f942 -> 3e2bcf2c 3f3897e0 be0f8360", + "00000000 3f000000 3f800000 3f000000 3f400000 3f400000 3e800000 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 00000000 3f400000 00000000 -> 3e800000 3f600000 3ec00000", + "3f800000 3f000000 3f800000 3f800000 3eaa0a36 bde318fa 3eaa0a36 -> 3eaa0a36 bde31900 3eaa0a36", + "3fc00000 3f400000 00000000 00000000 be66e648 be66e648 3f1c46c4 -> bf36965c bead2cb6 00000000", + "bf000000 3f400000 00000000 3e800000 3f000000 00000000 3f400000 -> 3f600000 00000000 3e800000", + "3e800000 3f400000 00000000 3f000000 3f983598 3f97e5c9 3f358d68 -> 3f400000 00000000 3f000000", + "3f400000 3f400000 00000000 3f400000 3dc138ad 3f12bfd1 3e914da9 -> 3e843aa1 00000000 3eccfa3f", + "40000000 3f400000 00000000 3f800000 3f8f5218 3e5fa1b9 3f79f470 -> 3f400000 00000000 3f73e8e0", + "00000000 3f400000 3e800000 00000000 3e800000 00000000 3f400000 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f9c6980 3d8d5306 3d8d5306 -> 3f400000 3e2354c2 3e2354c2", + "3f800000 3f400000 3e800000 3f000000 3f8f336b 3f301c19 3f8f336b -> 3f400000 3e800000 3f000000", + "3fc00000 3f400000 3e800000 3f400000 3f25bbe1 3cf8930b 3cf8930b -> 3f1899d2 bda2c8dc bea8b238", + "bf000000 3f400000 3e800000 3f800000 3f9f4099 3ef35582 3e496947 -> 3f400000 3e800000 3fb3696c", + "3e800000 3f400000 3f000000 00000000 3d11f855 3f397ecc be3193ff -> 3f1247e1 3f000000 bd3193ff", + "3f400000 3f400000 3f000000 3e800000 3f917ce2 3f0ae763 3ea6ccfa -> 3f400000 3f000000 3e800000", + "40000000 3f400000 3f000000 3f000000 3e3cea0b bda70f5c 3ddaa3e2 -> bec315f4 bf29c3d8 be92ae10", + "00000000 3f400000 3f000000 3f400000 be3f0e69 3f9f0adf 3f9f0adf -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3e746f98 3f688487 3f919c8f -> 3efd1be6 3f000000 3f800000", + "3f800000 3f400000 3f400000 00000000 3f8efa3e 3ea34cf8 3da96965 -> 3f400000 3ea34cf8 00000000", + "3fc00000 3f400000 3f400000 3e800000 3e84bde5 3f3112c8 3e84bde5 -> 3c639b00 3f299c2c 3e800000", + "bf000000 3f400000 3f400000 3f000000 3f88e298 3f2f0a9c 3f88e298 -> 3f400000 3f487ab2 3f000000", + "3e800000 3f400000 3f400000 3f400000 3e85eb42 3d9ae11d 3e9f9092 -> 3f20bd68 3f14d709 3f23f212", + "3f400000 3f400000 3f400000 3f800000 3f526857 3f9496a0 3f526857 -> 3f400000 3f400000 3f5dce41", + "40000000 3f400000 3f800000 00000000 be2d39c0 3e8aa9d6 be2d39c0 -> bf8b4e70 beeaac54 bead39c0", + "00000000 3f400000 3f800000 3e800000 3eb104c8 3f23d4c4 3f652ad5 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f26f239 3e15a65e 3f26f239 -> 3f33791c 3f12b4cc 3f000000", + "3f800000 3f400000 3f800000 3f400000 3f3e2c0b 3f30175b 3f959820 -> 3f3e2c0b 3f30175b 3f400000", + "3fc00000 3f400000 3f800000 3f800000 3f02e03b 3f83bcf2 3f83bcf2 -> 3ec8a0b1 3f800000 3f800000", + "bf000000 3f800000 00000000 00000000 bdf883a4 3f26c14a 3f19298d -> 3fc7c41d 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 be74770b 3e931b82 3f4549ff -> 3f30b890 00000000 3e800000", + "3f400000 3f800000 00000000 3f000000 3f84e599 3ead8b7b 3f84e599 -> 3f800000 00000000 3f000000", + "40000000 3f800000 00000000 3f400000 3e709608 3f85797f 3f85797f -> bf07b4fc 00000000 3f400000", + "00000000 3f800000 00000000 3f800000 be285849 3d1c39ea 3e55375a -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f836c9b 3d41cf0c 3d41cf0c -> 3f800000 3e1839e2 00000000", + "3f800000 3f800000 3e800000 3e800000 3edeba68 bd0967ca 3edeba68 -> 3edeba68 bd0967c8 3e800000", + "3fc00000 3f800000 3e800000 3f000000 3f92ca51 be489383 3f92ca51 -> 3f800000 bed66ea4 3f000000", + "bf000000 3f800000 3e800000 3f400000 3f000000 00000000 3f000000 -> 3fa00000 3ec00000 3f600000", + "3e800000 3f800000 3e800000 3f800000 3f94ffe6 3e8685b7 3e8685b7 -> 3f800000 3e800000 3f50d0b7", + "3f400000 3f800000 3f000000 00000000 3f71385a 3f71385a 3e848fb8 -> 3f74ea44 3f000000 00000000", + "40000000 3f800000 3f000000 3e800000 3f6883b1 3f9fb5f8 3f9fb5f8 -> 3f510762 3f000000 3e800000", + "00000000 3f800000 3f000000 3f000000 3f88a568 3ef546de 3dbe0faa -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f2069be 3ee86b15 3f653746 -> 3f5034df 3ef4358a 3f400000", + "3f800000 3f800000 3f000000 3f800000 3e928462 3f67fa7e 3f67fa7e -> 3e928462 3f000000 3f67fa7e", + "3fc00000 3f800000 3f400000 00000000 3e8da30e 3f78ec8f be353a70 -> bdae2db0 3f400000 be87ebd4", + "bf000000 3f800000 3f400000 3e800000 3e3b2829 3e81af71 3f1459c4 -> 3fb44d7e 3f7f9424 3e800000", + "3e800000 3f800000 3f400000 3f000000 3f400000 3f400000 3f400000 -> 3f700000 3f400000 3f000000", + "3f400000 3f800000 3f400000 3f400000 3d5e2402 3f365d5a 3e0e7c05 -> 3e94d360 3f38c604 3e956e82", + "40000000 3f800000 3f400000 3f800000 3d187dda 3f992c18 bdab9811 -> bf6cf044 3f400000 bf957302", + "00000000 3f800000 3f800000 00000000 3f09e848 3f98cf9e 3eef1763 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f8947da 3f16dd8b 3f0fe4a7 -> 3f800000 3f4b6ec6 3e800000", + "3f800000 3f800000 3f800000 3f000000 3f6d3ec2 3eecb69e 3f6d3ec2 -> 3f6d3ec2 3eecb69e 3f000000", + "3fc00000 3f800000 3f800000 3f400000 3f25c6df 3f3962cb 3f25c6df -> 3ef1549c 3f161430 3f18aa4e", + "bf000000 3f800000 3f800000 3f800000 3e97060b 3f58b777 3eb400d5 -> 3fad1f3e 3f89d222 3fa97fe6", + "3e800000 00000000 00000000 00000000 3f80b777 be4d6b98 3f86464d -> 00000000 bd4d6b98 00000000", + "3f400000 3e800000 3e800000 3e800000 3f727ef4 3e82f5a4 bc261c09 -> 3e800000 3e800000 3d60dac0", + "40000000 3f000000 3f000000 3f000000 3f814217 3f7c416b 3e85a565 -> 3f000000 3f000000 3cb4aca0", + "00000000 3f400000 3f400000 3f400000 3f02bf46 3f18b35c bdbb9d2f -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f0394e6 3dc89ad1 3dc89ad1 -> 3f41ca73 3f0c89ad 3f0c89ad", + "3f800000 3fa00000 3fa00000 3fa00000 3f674b2f 3d0bbb4e 3e4152bd -> 3f674b2f 3d0bbb40 3e4152c0", + "3fc00000 be800000 be800000 be800000 3f400000 00000000 00000000 -> be800000 be800000 be800000", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3f800000 00000000 3e800000 -> 3dcccccd 3e19999a 3dcccccd", + "3e800000 3f666666 3f666666 3f666666 00000000 3f000000 00000000 -> 3f2ccccc 3f4ccccc 3f2ccccc", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f8e5086 be462ccf 3f7c0c7d -> 3eaaaaaa bd7d3120 3eaaaaaa", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f365416 3f9a9e69 bb5cd29c -> 3f2aaaab 3f2aaaab bf2c6451", + "00000000 3f237073 3f4e6ebe 3f4e6ebe 3f000000 3f400000 3e800000 -> 3f237073 3f4e6ebe 3f4e6ebe", + "3f000000 3ef308f9 3ef308f9 3f8589a9 3e2ced54 bd353092 3f8f501e -> 3ea4bfd2 3e5c62e6 3f8589a9", + "3f800000 3cfd8242 3f83129e 3cfd8242 3e330035 3e330035 bde4d424 -> 3cfd8242 3e330034 bde4d424", + "3fc00000 3ecb54ba 3f058dd0 3eedb7f7 00000000 3f800000 00000000 -> be4b54bc 3f058dd0 be6db7f6", + "bf000000 3f25d52b 3f25d52b 3e883faa 3f73162a 3bea4fe8 3eaa878a -> 3f25d52b 3f77d570 3e883faa", + "3e800000 3e646df3 3eec3c9d 3e646df3 3f33d825 3f1f46af 3f33d825 -> 3e646df3 3eec3c9d 3e646df3", + "3f400000 3f6a8345 3f0e2699 3f6a8345 3f2772c3 3f2772c3 3f410ee2 -> 3f3836e4 3f0e2699 3f4b6bfb", + "40000000 3f4f0a8c 3eeaa950 3f8c42c1 3cbb9ffa 3f168da8 3f6e3370 -> bf43508c 3eeaa950 3f43e15e", + "00000000 3cf53118 3f932348 be67ed12 3f908f43 3f908f43 3d8ff04b -> 3cf53118 3f932348 be67ed12", + "3f000000 3cb9f937 bcd3be91 3cb9f937 3f6b3ac2 3eb910fb 3eb910fb -> 3cb9f937 bcd3be91 3cb9f937", + "3f800000 3f1dda75 3f33568b 3f1dda75 3f3f8a01 3f440521 3def87ab -> 3f1dda75 3f33568b 3def87ac", + "3fc00000 3dacd190 3f0b6a0c 3f0b6a0c 3f6b3616 3f6b3616 3eac3e8d -> 3dacd190 3f0b6a0c 3e6de790", + "bf000000 3e621742 3f9546ad 3e621742 3f400000 3e800000 3f800000 -> 3e621742 3fcfea04 3e621742", + "3e800000 be08179d 3e0adac2 be36a343 3ec2c356 be1af16a 3f571462 -> be08179d 3d82cf6e be36a343", + "3f400000 3ee149b2 3f3f318b 3ee149b2 3f6ed11f 3f9cebaa bc987353 -> 3ee149b2 3f3f318b 3dc4b414", + "40000000 3e588060 3e588060 3f32c60e 3af33289 bdef231d 3ef8ce11 -> be54b396 bee3d1be 3e8c1006", + "00000000 3eb8c2a5 3f463d9f 3f463d9f 3e57be58 3e57be58 3f8af894 -> 3eb8c2a5 3f463d9f 3f463d9f", + "3f000000 3f272aec 3f83b86a 3f83b86a 3e646d6c 3d3ecbbe 3efbc35a -> 3ee04647 3f09aec8 3f42a940", + "3f800000 be27e47e 3f97dbab 3f588742 3e8b5bc9 bde80c75 bde80c75 -> be27e47e bde80c70 bde80c78", + "3fc00000 bda08ed3 3f63da5c 3f63da5c 3ee21524 bdcffac7 bdcffac7 -> bda08ed3 bf18ec34 bf18ec34", + "bf000000 3f8fd618 3f8d404e 3f8d404e 3f3be541 3ecfe75b 3ecfe75b -> 3fa8c7d4 3fb9e38a 3fb9e38a", + "3e800000 3f299502 3f869f4f 3d44a5f5 be3055f4 3f58f7bb be3055f4 -> 3ee854c4 3f801673 bbe6cbe0", + "3f400000 3e305d01 be1a7371 be1a7371 3efba24a bdff1da6 bdff1da6 -> 3e305d01 be1a7371 be1a7371", + "40000000 3ef79d1d 3eeaed56 be43584c 3f3060ac 3f4fa977 bc541198 -> 3ef79d1d 3eeaed56 be43584c", + "00000000 3f608963 3f7d92c0 3f73a977 3f9ca8b8 3f9ca8b8 3f81851c -> 3f608963 3f7d92c0 3f73a977", + "3f000000 3f5dd5a7 3f5d1a59 3f5dd5a7 3e5eb6e4 3f5f8edc 3f307a3a -> 3f0ac1b0 3f5d1a59 3f4727f0", + "3f800000 3f434fef be4a4aab 3e096104 3f901413 bc19bcb3 bc19bcb3 -> 3f434fef be4a4aab bc19bcb0", + "3fc00000 3eb2d17c 3eb2d17c 3f6089af 3f99147f 3f0097d4 3f0097d4 -> 3eb2d17c 3eb2d17c 3ea13dce", + "bf000000 3f2b8757 3e911d2d 3e64b336 3daf662e 3f3247af 3f046da6 -> 3f7654a0 3e911d2d 3e64b336", + "3e800000 bc7323e3 3f9a4911 3f43b998 3e3ca923 3f748fb7 3f95e1d7 -> bc7323e3 3f9248c4 3f43b998", + "3f400000 3f8edc35 3ee4c392 3ee4c392 3f000000 3f000000 3f400000 -> 3f276e1a 3ee4c392 3ee4c392", + "40000000 3e9dbcd9 3e24f135 3e9dbcd9 be12d6b8 be12d6b8 3c04241d -> bf1849c8 bee54f52 be957a97", + "00000000 3f806729 3f5153a6 3e27d54f 3f805a36 3f805a36 3f14c301 -> 3f806729 3f5153a6 3e27d54f", + "3f000000 3f9f0d97 3f74d6da bd853386 3f84b152 3f6fdbc5 3e5eee72 -> 3f91df74 3f725950 bd853386", + "3f800000 3e4a6ec6 3f015e64 3f855c40 3e9b9a1e 3f5f13e2 3cba77b6 -> 3e4a6ec6 3f015e64 3cba77c0", + "3fc00000 3e46703c 3e46703c 3f6800cf 3f68b57f 3d6d37f3 3d6d37f3 -> 3e46703c bc243220 bebb8652", + "bf000000 be2ac3a2 3f8ff495 3f8ff495 3e1a127f 3efd40f1 3e3354da -> be2ac3a2 3fb846c2 3fccb992", + "3e800000 3f20535b 3e3f11cd 3e616a94 bd0bf57a 3f2d03f7 3ef2b98b -> 3eec1d5c 3e3f11cd 3e616a94", + "3f400000 3f8a389d 3f9587e6 bcc5283f 3f11dcab 3f5fcd35 3ec86c3e -> 3f3281cf 3f729ddb bcc5283f", + "40000000 3ec21b6a 3ec21b6a 3eb84c4c 3d30bb0e 3f40e443 3f3544b4 -> be95eca6 3ec21b6a 3eb84c4c", + "00000000 3e1b6ee7 be775bd4 be579d36 3f740042 3e4c1a1c 3e4c1a1c -> 3e1b6ee7 be775bd4 be579d36", + "3f000000 3f8651ae 3f8651ae 3e63f58b 3ef4d9c9 3e704f36 3dd0880b -> 3f438820 3f245b95 3e261cc8", + "3f800000 bdf3ac4c 3f2b5a39 3e8c4f9e 3f586d24 3f05f00a 3d567f2d -> bdf3ac4c 3f05f00a 3d567f2c", + "3fc00000 3f5f708a 3f87c1f0 3f7bb814 3f5113f2 3f5113f2 3ebe7183 -> 3f49e5a6 3f31dbfb 3d87c8c8", + "bf000000 be70c445 3df7f1b9 3e9434d3 3f933b17 3f095de6 3f095de6 -> be70c445 3df7f1b9 3e9434d3", + "3e800000 3f90d194 3f49c7cb 3f49c7cb 3f5aa4a6 3e7cde95 3f02684c -> 3f87f1c4 3f2723c2 3f37efeb", + "3f400000 be4cb950 bd320d1d be5404b1 3f000000 3f800000 3f400000 -> be4cb950 bd320d1d be5404b1", + "40000000 be3b18a0 3efb3670 be3b18a0 3f9981d5 3f9981d5 be319944 -> be3b18a0 3efb3670 be3b18a0", + "00000000 3f36700e bd1e3daa 3e3f6fdf 3f66e37e 3d041ca9 3f3dea35 -> 3f36700e bd1e3daa 3e3f6fdf", + "3f000000 3e973fe4 bcec4e22 bcec4e22 3f2aba15 3f6e40e6 3e78cc90 -> 3e973fe4 bcec4e22 bcec4e22", + "3f800000 bdd9c9c3 bd55ea07 3e91dc5e 3f54388a 3f78ecd2 3f78ecd2 -> bdd9c9c3 bd55ea07 3e91dc5e", + "3fc00000 3f9e4a30 bdc430ae bdc430ae bd81db9f 3ed8ece3 bd81db9f -> bf36a35e bdc430ae bdc430ae", + "bf000000 3f9f0cab 3ef740e6 3ef740e6 bd6586c4 3eb73a72 3eb73a72 -> 3ff2291c 3f0ba210 3f0ba210", + "3e800000 3f47358b 3f063085 3ed0e8db 3f800000 3f800000 3f800000 -> 3f47358b 3f063085 3ed0e8db", + "3f400000 be0454ce 3f89f9c2 3f697cf9 3daff4c0 be5a9801 3daff4c0 -> be0454ce 3de00308 3e95bc60", + "40000000 3ec0376f 3ec0376f 3ef5648f 3f2a5bfb bd548072 3f34cd72 -> 3ec0376f bef5578b 3ef5648f", + "00000000 3e82d63f 3eda0fb0 3ef5a473 3f038303 3f930e4c 3cd66b1c -> 3e82d63f 3eda0fb0 3ef5a473", + "3f000000 3f448c53 3f448c53 3f386571 3f800000 3e800000 3e800000 -> 3f448c53 3f02462a 3ef86571", + "3f800000 3f83b4dd 3f83b4dd 3f40b9f1 bdc2faa4 3e62eff1 3e62eff1 -> bdc2faa0 3e62eff0 3e62eff0", + "3fc00000 3ee7b154 3f68145c 3e806690 be4a79ad be4a79ad be204e6a -> bf05d9f6 bf3ff7d0 beb86e18", + "bf000000 bd4240f9 bd14ecf6 bd4240f9 3e501aeb 3e145a4e 3e501aeb -> bd4240f9 bd14ecf6 bd4240f9", + "3e800000 3f5c1403 3f0b3efe 3f0b3efe 3f400000 00000000 3f400000 -> 3f550f02 3ed0de7d 3f0b3efe", + "3f400000 bdd45a36 3cc2a410 3ef85f4e 3f0f4c2a 3f41b648 3f41b648 -> bdd45a36 3cc2a410 3ef85f4e", + "40000000 3f82bb7f 3f32b28a 3f32b28a 3f50ae67 3e1186bd 3f13decf -> 3f1be5d0 bed3de58 3eea1628", + "00000000 3e00f291 3e51939b 3e00f291 3dd6c41c 3d17850c 3f8cdd96 -> 3e00f291 3e51939b 3e00f291", + "3f000000 3f38d74f 3f38d74f 3e47c69c 3f740f64 3f740f64 3f04112e -> 3f38d74f 3f38d74f 3e47c69c", + "3f800000 3f2c34cb 3f2dbebd 3f8493ea 3f45e74f bddb37ad 3f45e74f -> 3f2c34cb bddb37b0 3f45e74f", + "3fc00000 3e205404 3f783af0 3e205404 be1124ae 3e90acc2 3f8f2639 -> be94f084 bd79be60 3e205404", + "bf000000 3f294bb6 3f23c7ef 3f294bb6 3f2b0f5e 3d662a75 3c2d2fa5 -> 3f294bb6 3f6e7a93 3f7c9732", + "3e800000 3d94cd2b 3eedf638 3d94cd2b 00000000 00000000 3e800000 -> 3d5f33c0 3eb278aa 3d94cd2b", + "3f400000 3f57fb2b 3f4996b2 3f57fb2b 3e19722e 3e19722e 3f6fbf2e -> 3ea58866 3e9e562b 3f57fb2b", + "40000000 3e9410e1 3f6f4303 3f6fa1b7 3f400000 3f800000 00000000 -> 3e9410e1 3f6f4303 bf6fa1b7", + "00000000 3f8d3e5b 3e6526e2 3f8d3e5b 3f92ed03 3f8a92f6 3e9d2b2e -> 3f8d3e5b 3e6526e2 3f8d3e5b", + "3f000000 3f45272e 3f1d5e71 3f8c1ad7 be0b2ace 3f46258c 3f932b07 -> 3ea25c7a 3f1d5e71 3f8c1ad7", + "3f800000 3ed3250c 3f716067 3ed3250c 3d3d7005 bdf4fce6 3d3d7005 -> 3d3d7008 bdf4fce8 3d3d7008", + "3fc00000 3efed768 3e8a7230 be5631b7 3ebb4f99 3e7a3f7f 3ec1ce58 -> 3e998bb2 3e6ced0e be5631b7", + "bf000000 3f8c52ff 3f8c52ff be038811 be560631 be560631 3b8c3acd -> 3fdfdce2 3fdfdce2 be038811", + "3e800000 3ee400ae 3e57f6f1 be1572f6 3d193ecf 3f55dcda 3d193ecf -> 3eafca79 3e57f6f1 be1572f6", + "3f400000 3e80993c 3f82e012 3e92faa1 3db76ed0 3db76ed0 3f586da7 -> 3e05162c 3ea544d8 3e92faa1", + "40000000 bd89eedf be726be1 be726be1 3f65c7e5 3c3125eb 3c3125eb -> bd89eedf be726be1 be726be1", + "00000000 3ca407bb 3f85147e bdbd1f79 be5f3fb3 3f1f7175 3e88c2e3 -> 3ca407bb 3f85147e bdbd1f79", + "3f000000 3ece25ca 3e30ff7c 3ee7e1db 3f40a0b4 be4bccbe 3f98e389 -> 3ece25ca bc566a10 3ee7e1db", + "3f800000 3eaa3133 3eee285f 3eee285f 3f800000 00000000 00000000 -> 3eaa3133 00000000 00000000", + "3fc00000 3f8959f0 3f8959f0 3f62af47 be073252 3f4dbf88 3f4dbf88 -> bf3c0cce 3f2b455c 3f4347a8", + "bf000000 3f6170f1 3eaa53c5 3f6170f1 3f87cb15 3ee7669f 3f87cb15 -> 3f6170f1 3eaa53c5 3f6170f1", + "3e800000 3f1b8779 3ef22b23 3ef22b23 3f462d6b 3f9e13f6 3ede14c0 -> 3f1b8779 3ef22b23 3eed258a", + "3f400000 be6e5c63 3f93f07f 3dbac0e0 3f9174b5 3efbc9ce 3f9174b5 -> be6e5c63 3f2863ed 3dbac0e0", + "40000000 3df9139f 3e83b4c5 3e83b4c5 3f7407c6 3f60d966 bdf7b661 -> 3df9139f 3e83b4c5 beff8ff5", + "00000000 3f77cd88 3e8d2139 3f9aa8b0 3c758a7a 3dfe68aa 3ec5c6fa -> 3f77cd88 3e8d2139 3f9aa8b0", + "3f000000 3f69d90b 3f997b18 3f42c05f 3f99b800 3c6636a6 3f8eeff3 -> 3f69d90b 3f1b4785 3f42c05f", + "3f800000 bcdeb20f 3f8f75d7 3f99d5c5 3f875e16 3f97f38d 3f99b11f -> bcdeb20f 3f8f75d7 3f99b11f", + "3fc00000 3e8111b7 3e4e178d 3e8111b7 3edeaa04 bd534cc4 bd534cc4 -> 3e8111b7 be36488f be504e82", + "bf000000 3f498154 3e8c4c7d 3f3b368e 3f530188 bca11d71 3f827b84 -> 3f498154 3ed77ba7 3f3b368e", + "3e800000 3f4f79b5 3e5dba88 3e5dba88 3eecc670 3e976fce 3f5dbf7b -> 3f393416 3e5dba88 3e5dba88", + "3f400000 3eb1a727 be2f9d48 be2f9d48 3f400000 3f000000 3f800000 -> 3eb1a727 be2f9d48 be2f9d48", + "40000000 be6fd91e be6fd91e 3f328cc6 bd809e36 3f5274c2 3f5274c2 -> be6fd91e be6fd91e 3f328cc6", + "00000000 3ecd37c8 3e5e4ee7 3f896e7c 00000000 3f800000 3f800000 -> 3ecd37c8 3e5e4ee7 3f896e7c", + "3f000000 3f15df58 3eceef9d 3eceef9d 3f800000 3f000000 3e800000 -> 3f15df58 3eceef9d 3ea777ce", + "3f800000 3d30d7fb bdbd6292 3e1379e2 3e800000 3f000000 00000000 -> 3d30d7fb bdbd6292 00000000", + "3fc00000 3da8f4f6 3da8f4f6 3f373cc5 be6e1600 3f2689e3 3f2689e3 -> bec7af20 3da8f4f6 3f1e3072", + "bf000000 3e099a98 3f82813a be3bc9eb bdc5e78f bcac38e8 bcac38e8 -> 3e7fe1c8 3fc51a49 be3bc9eb", + "3e800000 3eb53317 3eb53317 3f8ef531 bc84ef7b bc84ef7b 3eee5591 -> 3e85d293 3e85d293 3f743a7c", + "3f400000 3db454c8 be7c3168 3db454c8 3f500d8c be635a95 bd2e6027 -> 3db454c8 be7c3168 bc2276e8", + "40000000 3f38cc1a bd8b37de 3f6ac2b0 3eaaaaaa 3eaaaaaa 3eaaaaaa -> bd621700 bd8b37de be80300c", + "00000000 3f837d15 3d4c9440 3f44ff0c 3f5bfe76 3f317a03 be2e450f -> 3f837d15 3d4c9440 3f44ff0c", + "3f000000 3f21a60a 3e99831d 3e99831d 3f8e13ad bd745e74 bd745e74 -> 3f21a60a 3df5ee9c 3df5ee9c", + "3f800000 3f9957f2 3d18c651 3f119ad8 3e12912c 3ea19116 3ea19116 -> 3e129130 3d18c651 3ea19116", + "3fc00000 3e527ec7 3e527ec7 3f209273 bd8c2484 3e51e8b8 3e51e8b8 -> be525ac5 3e519db0 bbc8fa80", + "bf000000 3f596a8d 3f596a8d 3f804f8c 3efe9766 3edaa58a 3edaa58a -> 3f833cfd 3f87bb38 3fa522a1", + "3e800000 3f8c4762 bdeaf59d 3f81807c 3e985189 3f8e4a92 3e985189 -> 3f657544 bdeaf59d 3f554aeb", + "3f400000 be5a6e4c 3e93c680 3f1a3d6a 3f7351c4 3f3540f0 3f3540f0 -> be5a6e4c 3e93c680 3f1a3d6a", + "40000000 3f31ee38 3f90bf1b 3f31d112 3f43116d 3f91ae1d 3f43116d -> 3f31ee38 3f90bf1b 3f31d112", + "00000000 3e8dce2b 3f287e12 3f0ee627 3ee27189 be0e74a9 be0e74a9 -> 3e8dce2b 3f287e12 3f0ee627", + "3f000000 3d825810 3e684783 3ef0387b 3ca8d8b5 3f957daf 3e55ab35 -> 3d2c8e3d 3e684783 3ead870b", + "3f800000 be68bad4 3e6fec7c be68bad4 3f61405b be1cffc6 3f61405b -> be68bad4 be1cffc6 be68bad4", + "3fc00000 3f9de891 3f91149b 3f766fcd 3f800000 3e800000 3f800000 -> 3f62176f be445268 3f766fcd", + "bf000000 3e76a0d5 3e76a0d5 3f3b5523 3f800000 3f800000 3f400000 -> 3e76a0d5 3e76a0d5 3f3b5523", + "3e800000 3efd6195 3efd6195 3f8f4908 3f9122d4 3e55f014 3ed2afbf -> 3efd6195 3ed8c732 3f714384", + "3f400000 3f11d60c 3f4706ff 3f11d60c 3f792dd9 3f002053 3f548f4c -> 3f11d60c 3f11d9fe 3f11d60c", + "40000000 3e1b1e99 3f9a1d0d 3f9a1d0d 3f7cde83 3e3054f9 3f380c91 -> 3e1b1e99 bf5c0f9e 3e6f7c20", + "00000000 3f861129 be35757b be35757b 3e800000 3e800000 00000000 -> 3f861129 be35757b be35757b", + "3f000000 3f1701de be6b7978 be6b7978 be4485f8 be4485f8 3f62f5f4 -> 3e4bc0c0 be6b7978 be6b7978", + "3f800000 3eaed6bc 3eaed6bc 3ee94648 3f0647be 3f2cef3d 3f6882bb -> 3eaed6bc 3eaed6bc 3ee94648", + "3fc00000 3f1a66a6 3e380461 3f8625bc be645b94 3f890946 3f890946 -> bf22d5aa 3e380461 3f8625bc", + "bf000000 3ecbd766 3f29016d 3e7f452c 3f3c401c 3f991e26 3eb26d12 -> 3ecbd766 3f29016d 3e7f452c", + "3e800000 3d6fbc9b 3f981a4f 3f9fbedb 3e800000 3f800000 3f000000 -> 3d6fbc9b 3f9213bb 3f87cf24", + "3f400000 3f75d385 3f320861 3ccafdcb 3f797a18 3cc75b73 3f4f8db1 -> 3f75d385 3e44b8f4 3ccafdcb", + "40000000 3eb147b6 3f8195a4 3f0b04e3 3e6d891a 3dc191b0 3dc191b0 -> 3df10590 bf52c6dc beb540ee", + "00000000 3e770cb2 3e91ef3a 3e770cb2 bd72b351 3f8a43bf bd2b3375 -> 3e770cb2 3e91ef3a 3e770cb2", + "3f000000 3c3a35fa be6055fa 3f8b371d 3efa82b6 3efa82b6 3ede6132 -> 3c3a35fa be6055fa 3f42cf6a", + "3f800000 3f6b9786 3f9e3ca5 3ebf762a 3dd76425 3dd76425 be3fffdc -> 3dd76428 3dd76420 be3fffdc", + "3fc00000 3f809543 3e20f9b1 3e20f9b1 be405588 be405588 3ee568db -> bf48b556 beb87e92 3e20f9b1", + "bf000000 3ebd7232 bdb43434 3f11364e 3e800000 00000000 3f000000 -> 3edc2b4b bdb43434 3f19d175", + "3e800000 3f1a3824 3f46d7e1 3f70f868 3e9d5b2a 3f42aea7 be128029 -> 3f075580 3f45cd92 3f2b924c", + "3f400000 3f1cba43 3f7cada1 3f1cba43 3ec9fc58 3ec9fc58 3f97f1b0 -> 3ee5da64 3f0aea09 3f1cba43", + "40000000 3dea30b8 3dea30b8 3f0f580d 3f8f7cf0 3e836a29 3f2476cd -> 3dea30b8 3dea30b8 3f0f580d", + "00000000 3f78bedf 3f8e277b 3f8e277b 3f7848f4 3ea1c28d 3dc9616b -> 3f78bedf 3f8e277b 3f8e277b", + "3f000000 bd6f7051 be31b32c bd6f7051 bc69a9ed 3f672700 bc69a9ed -> bd6f7051 be31b32c bd6f7051", + "3f800000 3f49ba6e 3f49ba6e bdaf5a11 3f368a87 bdcdd61e 3e8f9dd4 -> 3f368a87 bdcdd620 bdaf5a11", + "3fc00000 bdde3bae 3e455d40 3f616212 3f8f31d9 3f8f31d9 3ef2f202 -> bdde3bae 3e455d40 3e8b08f0", + "bf000000 bde16fcb 3e0507b6 3f9040a3 3f5a9afc 3f75d632 3eca5bb9 -> bde16fcb 3e0507b6 3fbf157e", + "3e800000 be142042 3f90ec64 3e04d3f6 3f35ee2a 3f47e90c 3e34ec34 -> be142042 3f85ae6c 3e04d3f6", + "3f400000 bdad5f0f bdad5f0f 3f95955b bcc550de 3efc6721 3f868632 -> bdad5f0f bdad5f0f 3f8a49fc", + "40000000 3ecfde07 3f91bbcb be0dd30f 3f231bf4 3f9092f8 3d08d729 -> 3ecfde07 3f8f6a25 be0dd30f", + "00000000 3f5a2c03 3f5a2c03 3ada9b40 3f09f798 3f3c6584 3f5e3cb7 -> 3f5a2c03 3f5a2c03 3ada9b40", + "3f000000 3e00bd35 3f763ba9 3f219a74 3f865768 3e9d7f42 3f8eea91 -> 3e00bd35 3f227da5 3f219a74", + "3f800000 3f1dd8c3 bc7239c9 bc7239c9 be3e6757 3e2cb6db 3e2cb6db -> be3e6758 bc7239c9 bc7239c9", + "3fc00000 3dd3341f 3f7e393b 3f0b5870 3f3666f8 3f33679d 3eca5c54 -> 3dd3341f 3f0dfece 3ea4320e", + "bf000000 3f69e335 3ea062f9 3f69e335 3f96b99f 3ece5025 3ece5025 -> 3f69e335 3ea062f9 3f95a063", + "3e800000 3eb01f82 3eb01f82 3f046e3e 3f9a6a94 3f9a6a94 3f7bb724 -> 3eb01f82 3eb01f82 3f046e3e", + "3f400000 3f7ce3b0 3ea78a58 3ea78a58 3f859b13 3e515f6e 3f89616b -> 3f7ce3b0 3e70ccbe 3ea78a58", + "40000000 bce01d5d 3f8decf4 3e922218 3f9513e7 3f40c5f4 3df1067e -> bce01d5d 3ecb6400 bd4cf6c8", + "00000000 3f9914b3 3f9914b3 3f86ddee 3f0a2962 3f0a2962 3f2253c0 -> 3f9914b3 3f9914b3 3f86ddee", + "3f000000 3e79ec15 3ecfca28 3ecfca28 00000000 3f400000 3f000000 -> 3df9ec15 3ecfca28 3ecfca28", + "3f800000 3dd4370f bda79da5 bda79da5 3e800000 00000000 3e800000 -> 3dd4370f bda79da5 bda79da5", + "3fc00000 be5ab2fe 3eaf7791 3f8eea8d 3e0362e3 3ea344d9 3f7fc119 -> be5ab2fe 3e9d2b7d 3f70b718", + "bf000000 bddf2be6 bddf2be6 be6fd549 3f83f965 3e461ec7 3e18500b -> bddf2be6 bddf2be6 be6fd549", + "3e800000 3f728c77 3cc184d5 3f4335cb be001f0a be14ebf8 3f7fd343 -> 3f2de768 bc98b451 3f4335cb", + "3f400000 3df2d988 3f8adaa1 3f8adaa1 3f1a985b 3f7a5e74 3f7a5e74 -> 3df2d988 3f809a14 3f809a14", + "40000000 3f3ae8d5 3e8df913 3f3ae8d5 3f398a78 3ee3731a 3ecfb122 -> 3f382c1b 3e8df913 3da64268", + "00000000 3f2beb8e 3f3b4e33 3ea71fa3 3f18eebb 3edc8165 3f02e881 -> 3f2beb8e 3f3b4e33 3ea71fa3", + "3f000000 3f15e03a 3f15e03a 3b8fe290 3ea90a64 3ea90a64 3ea97752 -> 3eea656c 3eea656c 3b8fe290", + "3f800000 3f8e25c0 3edf6c36 3f8e25c0 00000000 3e800000 3e800000 -> 00000000 3e800000 3e800000", + "3fc00000 3f730034 be366684 3f69200c 3f959acc 3e8a215a 3d91c5af -> 3f730034 be366684 beb275e8", + "bf000000 3e5c6f47 3eaa84ee 3eaa84ee bce3f415 3ea927aa 3db527fe -> 3eac7316 3eab3390 3ee92265", + "3e800000 3f8f3142 3f94ba89 3f94ba89 3f92bdc1 3f866de2 3f92bdc1 -> 3f8f3142 3f91275f 3f943b57", + "3f400000 3e846834 3f62cdf5 3dcd4db8 bdec84ef bdd2d445 3f5aa631 -> bcb3ee00 3e13be5c 3dcd4db8", + "40000000 3f291d01 3f5d7c08 3e894d91 3f846517 3f507e39 3f507e39 -> 3f291d01 3f43806a 3e894d91", + "00000000 3ebc5607 3f68d64b 3f68d64b 00000000 3f400000 3f400000 -> 3ebc5607 3f68d64b 3f68d64b", + "3f000000 3e918ade bc9c19c2 bc9c19c2 3eff5239 3f75805b 3eff5239 -> 3e918ade bc9c19c2 bc9c19c2", + "3f800000 3de2db98 3ea0c28f 3de2db98 3e0b4a90 3e805095 3e0b4a90 -> 3de2db98 3e805095 3de2db98", + "3fc00000 3e044543 3dae6743 3dae6743 bcf51350 bcf51350 bcecc5bd -> bde02c82 bdb31adf bdaffdc9", + "bf000000 3f378fad 3f378fad 3f83860b 3f2bf998 3f08e6f5 3f2bf998 -> 3f3d5ab8 3f4ee409 3f9a4aaa", + "3e800000 3f8e6501 3f8e6501 3f80ee1b 3fa00000 3fa00000 3fa00000 -> 3f8e6501 3f8e6501 3f80ee1b", + "3f400000 3f2f0cd5 3f9974f7 3f9974f7 3ef30b3c bd53f63a 3f7c634d -> 3f06e76c 3e8595e0 3f85027b", + "40000000 3f4ed818 be4081b9 3f2dc038 3f74294c 3e769111 3f6042cd -> 3f4ed818 be4081b9 3f2dc038", + "00000000 bd84ef9e 3e10c235 3f2aa3b2 3f1d3ec3 3f5ed8ab bd6ee1b7 -> bd84ef9e 3e10c235 3f2aa3b2", + "3f000000 3f83dec9 3f040b58 3f83dec9 be28cec0 3f922474 3f9136b8 -> 3edd89e2 3f040b58 3f83dec9", + "3f800000 3f71104a 3f83679b 3ee06767 3f112698 3e8d2094 3f908f1a -> 3f112698 3e8d2094 3ee06767", + "3fc00000 3f52fc14 3f97ef10 3f725db1 3f54119f 3af6620f 3f54119f -> 3f52fc14 bf173644 3f44eb96", + "bf000000 3f946d8e 3f9835bc 3f9835bc 00000000 3e800000 00000000 -> 3fdea455 3fd4509a 3fe4509a", + "3e800000 bc557edc 3d85ffb7 3f373acb bde680ac be24ee58 3ef5b70e -> bd1b481f 3c1044e8 3f2822fa", + "3f400000 3ed9b2a3 3ec53561 3ec5b340 be531578 3ec4ba32 3f1ab9de -> bd45db28 3ec4d8fe 3ec5b340", + "40000000 3e5c7922 3e5c7922 3e531378 3f331384 3e684f25 3e684f25 -> 3e5c7922 3e5c7922 3e531378", + "00000000 3f2223c4 3f2223c4 3f7a91b7 3f996620 bdba69e0 3f996620 -> 3f2223c4 3f2223c4 3f7a91b7", + "3f000000 3f8051bd 3f4a03c8 bd4240af 3e345eb5 be4df2b1 3e345eb5 -> 3f16dd94 3e96871c bd4240af", + "3f800000 3f8716f0 3f1c8765 3f09dc6e 3ea1c7d6 3ea1c7d6 bd9f4fe0 -> 3ea1c7d6 3ea1c7d6 bd9f4fe0", + "3fc00000 3f78caa0 3f18ad28 3f83b1cf 3f99daf1 3f951b57 3f59bef6 -> 3f78caa0 3f18ad28 3f42eca2", + "bf000000 bd904c79 bd904c79 be3ebc38 bb9800be 3e981148 3e981148 -> bd904c79 bd904c79 be3ebc38", + "3e800000 3f8cdb11 3f17d059 3f8cdb11 3f400000 00000000 3e800000 -> 3f81a44d 3ee3b886 3f63489a", + "3f400000 be4cbf52 be4cbf52 3f6bbb0a bd87caf9 3f849086 3f252716 -> be4cbf52 be4cbf52 3f36cc13", + "40000000 3e6e92b5 3f0a71d4 3e6e92b5 3f842f54 3f306e00 3f842f54 -> 3e6e92b5 3f0a71d4 3e6e92b5", + "00000000 3f1178e9 3e4a3963 3efd6577 3f5423cc 3e927993 3d5db889 -> 3f1178e9 3e4a3963 3efd6577", + "3f000000 3f8ad5ac bcc69348 bcc69348 3f90dda6 3ef17cae 3f90dda6 -> 3f8ad5ac bcc69348 bcc69348", + "3f800000 3f9a87e5 3e69fa0b 3f035e91 3f2a7142 3f5f60af 3e528bfe -> 3f2a7142 3e69fa0b 3e528bfe", + "3fc00000 3d993d5d 3f4d17b9 bd1ab7b3 3dd4201b 3dba9f39 3dba9f39 -> 3d993d5d be871c06 bd1ab7b3", + "bf000000 3f567f21 3f999350 be53b92d 3e047568 3f3c784d be380fea -> 3f989802 3fb73ee5 be53b92d", + "3e800000 3eabf95f 3f8dcdab 3f09cd91 bd609edf 3eb0046e 3eb0046e -> 3e73ec20 3f6ab50e 3efab575", + "3f400000 3efcfca4 3efcfca4 3e31971b 3f000000 3f800000 00000000 -> 3efcfca4 3efcfca4 3d31971c", + "40000000 3e27bebe 3e9dd64b 3f99798a 3e07fda7 baca5309 baca5309 -> 3dd07920 be9f6af1 bf99deb4", + "00000000 3dffac05 3f3c046b 3f3c046b 3f942402 3eff4a80 be464f43 -> 3dffac05 3f3c046b 3f3c046b", + "3f000000 3ec572a7 3f648b15 be089e76 3f400000 3e800000 3e800000 -> 3ec572a7 3f12458a be089e76", + "3f800000 3f8ae56f 3e6f17bd 3ed065ad be34ce2b 3f46e122 3e5fdffe -> be34ce28 3e6f17bd 3e5fdffe", + "3fc00000 3f88a84c 3f01e285 3f88a84c be2db5f2 3f2a2a9e 3f2a2a9e -> bf49cc86 3f01e285 3eed2f42", + "bf000000 3e5de959 3f865302 3f0ff0dd 3f382e19 3f02da76 3f705ea4 -> 3e5de959 3fa8c5e6 3f0ff0dd", + "3e800000 bbc74f2d bde0deab 3f0e9a25 3f9fb1a4 3f9fb1a4 be20a907 -> bbc74f2d bde0deab 3ec1d216", + "3f400000 3f99bbfb 3f36bf87 3f36bf87 3ef6fa83 3f806e8b be7416ca -> 3f297bef 3f36bf87 b9a32800", + "40000000 3f58fc6f 3e430217 3f58fc6f 3f29f3f3 3f33e54c bc72ebef -> 3ef5d6ee 3e430217 bf6093cf", + "00000000 3e497a47 3f9ff5fa 3f9ff5fa 3f234fd6 3d2f3a5b 3d2f3a5b -> 3e497a47 3f9ff5fa 3f9ff5fa", + "3f000000 3f198316 3db50eff 3f2f68d7 3edd099a 3edd099a be127ddf -> 3f0403f2 3db50eff 3e8ac95f", + "3f800000 3ce02c93 3f5c1c7a 3f4d2d5c 3f9775c5 3ecc9b61 bdaee7e2 -> 3ce02c93 3ecc9b61 bdaee7e0", + "3fc00000 3f277316 bded2f6e 3f91aaf8 3e031d4c 3e031d4c 3f41e519 -> be0a3a38 bded2f6e 3f112cae", + "bf000000 3f9910b6 3f9bd6f1 3f74f705 3f20b989 3f20b989 3dc7ef2a -> 3fbd6aaf 3fc19407 3fb179ca", + "3e800000 3f988f62 be1f4950 3f46b2a0 3f698c2b 3ea3088a 3ea3088a -> 3f8f9d0f be1f4950 3f296709", + "3f400000 3e920543 3f8f5eeb 3f8e49ef bcd35fd0 3f0b51e0 3f6e584d -> 3d54c698 3f302cde 3f79e731", + "40000000 3f4f15ba 3f83dc99 bd0e7fcc 3e800000 3e800000 3f400000 -> be9e2b74 bf07b932 bd0e7fcc", + "00000000 3f955ac2 3eabe432 bdb4b442 bdd66969 bdc530cb 3f3e76a1 -> 3f955ac2 3eabe432 bdb4b442", + "3f000000 3f797db0 3f85f4cc 3e156e39 3ee5b58c 3f355e9b 3f355e9b -> 3f362c3b 3f60a41a 3e156e39", + "3f800000 3f9c949d 3ef8705e 3ef8705e 3e6f3dea bd5630fe 3f0087d7 -> 3e6f3de8 bd563100 3ef8705e", + "3fc00000 3f9a1fc2 3f198dd6 3f05c57a 3eac902e 3f4fbead 3f4fbead -> bdc59d00 3f198dd6 3f05c57a", + "bf000000 3e9d01fe 3f26187b 3f57ae9f 3d9728b5 3ebd0d5d 3ebd0d5d -> 3ed89de6 3f49e161 3f8a214c", + "3e800000 3e543b42 3e543b42 3f39f37b 3efe42e5 3f016815 3f016815 -> 3e543b42 3e543b42 3f2bd0a2", + "3f400000 3f92a4d4 bdd69748 3f92a4d4 bd153244 3f940888 3f940888 -> 3e84a81e bdd69748 3f92a4d4", + "40000000 3f64e46a 3f00d8da 3e6d8b19 3f3e42b7 3f3e42b7 3f2fcdaf -> 3f17a104 3f00d8da 3e6d8b19", + "00000000 3f8c6903 3f23b160 3f23b160 3e1b6557 3f28336c 3f2f2c31 -> 3f8c6903 3f23b160 3f23b160", + "3f000000 3f14f160 3ea230c4 3e9ed224 3f8423d9 3dc6ac05 3f5709f1 -> 3f14f160 3e53dbc5 3e9ed224", + "3f800000 3dd7ea6f 3dee5f16 bbfe3d62 3f3a9fd4 3f14ef36 3f381b07 -> 3dd7ea6f 3dee5f16 bbfe3d62", + "3fc00000 3f9001bd 3f571563 3f1e8c6a 3f227b36 be2aff8c bd58bdeb -> 3ec76e28 bf2baa85 bec73008", + "bf000000 be50e907 3f62b6f5 be19652d 3ef4e74c 3f9a1c0a 3f9a1c0a -> be50e907 3f62b6f5 be19652d", + "3e800000 3f812fc9 3f586fda 3f812fc9 3f844eb3 3f9d5257 3f9d5257 -> 3f812fc9 3f586fda 3f812fc9", + "3f400000 3e9b449e be32ac89 3f24317a 3f35895d 3f6eddd8 3f35895d -> 3e9b449e be32ac89 3f24317a", + "40000000 3f38f1b3 3f38f1b3 3f24b897 be2186ae 3f0ce3a4 3f6527e2 -> bf84da84 3ec1ab2a 3f24b897", + "00000000 3f684b8b be6fa164 be6fa164 3f0aa808 3f3d9d88 3edb6c69 -> 3f684b8b be6fa164 be6fa164", + "3f000000 3f71db0f 3f71db0f bcfe6f1e 3ed0ddb7 3f9286d4 3f9ca459 -> 3f2d24f5 3f71db0f bcfe6f1e", + "3f800000 3dbb63eb 3f668746 3f668746 3f416821 3f416821 3f20a227 -> 3dbb63eb 3f416821 3f20a227", + "3fc00000 3f1eb62a bd793c33 bd793c33 3f782ea5 3c80bd00 bd15cfdd -> 3f1eb62a bd793c33 bd793c33", + "bf000000 3f14ca75 3f14ca75 3f992b14 3f679bf8 be2b58d0 3f679bf8 -> 3f14ca75 3f749aca 3fabd9a0", + "3e800000 be1e06b4 3f823e56 3f8fc7d3 be40ff92 3cda2e97 be40ff92 -> be26c4ec 3f4511de 3f4b9bc4", + "3f400000 3f806db2 3f806db2 3e8d3d61 3e800000 3f800000 3f400000 -> 3ee06db2 3f801b6c 3e8d3d61", + "40000000 3d6a07a8 3e8ae91a 3eddaf1d bd0803d1 3f3e8340 3ebc3908 -> bdfd07a4 3e8ae91a 3e9ac2f3", + "00000000 3f273cfc 3f273cfc be578a12 3e8fafc8 3e5d4bca 3e5d4bca -> 3f273cfc 3f273cfc be578a12", + "3f000000 3f1e199b 3f1e199b 3e87c577 3f83ca81 3f449bf8 be5d5ca0 -> 3f1e199b 3f1e199b 3cc8b938", + "3f800000 3eb24fc3 3ec34389 bdc512be bde5c29c 3ef922b0 3f346d2c -> bde5c29c 3ec34389 bdc512be", + "3fc00000 3f24133b be323df0 be323df0 3f9c3482 3d4b439d 3f050d05 -> 3f24133b be323df0 be323df0", + "bf000000 3e9adc41 3d2f288c 3f124876 bd0d2437 3f5bf7fb 3f5bf7fb -> 3ef11ca5 3d2f288c 3f124876", + "3e800000 3f8bce33 3f8bce33 be205dbc 3f8691fa 3ea188ae 3e81c342 -> 3f8a7f25 3f65e662 be205dbc", + "3f400000 3f7d43a1 3f564282 3f564282 3ea79edf 3f5d810b 3f88097e -> 3efc58f7 3f564282 3f564282", + "40000000 3f53c5e1 bcd56d84 3f56b6b2 b9dbb41e 3f881b93 3f881b93 -> bf53fccf bcd56d84 3f56b6b2", + "00000000 be34160d 3f623dbc be2acd69 bdd05c5f 3f8c99f6 3f732f2e -> be34160d 3f623dbc be2acd69", + "3f000000 3f1a45a5 3ef05793 3ef05793 00000000 3e800000 3f800000 -> 3e9a45a5 3eb82bca 3ef05793", + "3f800000 3f2feb2e 3f2feb2e 3f167d0d 3f800000 3e800000 3f000000 -> 3f2feb2e 3e800000 3f000000", + "3fc00000 3f744ec8 3f744ec8 3f90d2f8 3f931cff 3cc96318 3f6dff5a -> 3f744ec8 bee16d7c 3f542c0f", + "bf000000 3f517ff0 3f8d1e73 be7c3deb 3e7a7f51 3f2bdec2 3e7a7f51 -> 3f8d77ff 3fa8b5fc be7c3deb", + "3e800000 3f58883e 3f5e3cb4 3f58883e 3ded36e4 3ded36e4 3f83a84b -> 3f29cfe6 3f2e173e 3f58883e", + "3f400000 bdfdd9a6 bd9c46f4 3e30ce83 3eab9b54 be66cc84 be66cc84 -> bdfdd9a6 be40a242 be00e5c3", + "40000000 3f13e92d 3ed32be1 3f56bef6 3f5fef44 3f5fef44 3ee04156 -> 3f13e92d 3ed32be1 3d182600", + "00000000 3f86625d 3f76c203 3f8aa727 3f800000 3f000000 00000000 -> 3f86625d 3f76c203 3f8aa727", + "3f000000 3f880616 3ed8583e 3e35ae39 3d3f6a46 bd335136 3f3c492f -> 3f0e0168 3e41ee17 3e35ae39", + "3f800000 3f1ea7e2 3e626785 3ee7ed21 3e44f083 3f8200af 3f8200af -> 3e44f084 3e626785 3ee7ed21", + "3fc00000 3f916ff5 3f9ab9fd 3e70ed02 be5e502b 3f207af9 3f207af9 -> bf64ce06 3eabfcf0 3e70ed02", + "bf000000 3f202a88 3f2bd9d2 3f202a88 3f694a26 3f3862fe 3e54f74f -> 3f202a88 3f2bd9d2 3f55a0e2", + "3e800000 3e8eef16 bd07b95d 3f8d6ddd 3f6947ac 3f8f844f be4e6b65 -> 3e8eef16 bd07b95d 3f473e15", + "3f400000 3ee1d22c 3f97f05a 3f9c2400 bcea6281 3f8c7d32 be6be32f -> 3db5dfb4 3f8f59fc 3e075da0", + "40000000 3f0ec6aa 3f5e485a 3f5e485a 3f9c52dd 3f97955a 3f9c52dd -> 3f0ec6aa 3f5e485a 3f5e485a", + "00000000 3e168532 3d166a8a 3d166a8a bdf341b2 be38dde0 bd04631c -> 3e168532 3d166a8a 3d166a8a", + "3f000000 3f16dd95 3daae34c 3daae34c 3f8ad4bc 3f2bf25e 3f22e436 -> 3f16dd95 3daae34c 3daae34c", + "3f800000 3f2dd5d9 3f78ac5c 3f78ac5c 3f000000 3f000000 00000000 -> 3f000000 3f000000 00000000", + "3fc00000 3f5764bf 3d9d68db 3f7496a8 3f5d39b3 3ee1567e 3f64f2ee -> 3f5764bf 3d9d68db 3f5d2111", + "bf000000 3f6129f7 3f84ee7a 3f98a9c8 3dea071c 3d075d52 3d075d52 -> 3fa18f40 3fc54842 3fe2e136", + "3e800000 bde0ab97 3f993952 3f993952 3f64e317 3ebfd289 3ebfd289 -> bde0ab97 3f7dd04c 3f7dd04c", + "3f400000 3d8e2414 3def2bce 3f5c5d49 00000000 3f400000 3e800000 -> 3c8e2414 3def2bce 3ece2ea4", + "40000000 3f9ea100 3f360417 3f9c5dd5 3f000000 3f400000 3f000000 -> be750800 3f360417 be62eea8", + "00000000 be2eb027 3f4dadad be33564b 3f4c2709 3f4c2709 3f64807e -> be2eb027 3f4dadad be33564b", + "3f000000 3f91ed8f 3f5e9869 3f5e9869 be5a64bd 3f44402e 3f44402e -> 3eed41ee 3f516c4c 3f516c4c", + "3f800000 3f53969e 3f625f17 3f53969e 3f10adba 3f4d891f 3f49cd34 -> 3f10adba 3f4d891f 3f49cd34", + "3fc00000 3f4c8c5e 3e75b011 3e75b011 3f416f41 3f97d1dc 3f82d543 -> 3f3be0b2 3e75b011 3e75b011", + "bf000000 3f8d1d80 3ef1fde4 3efee2b7 3f265777 3f568678 3f23b8ca -> 3faa1662 3ef1fde4 3efee2b7", + "3e800000 3f41e2e9 3e804de2 3f41e2e9 3f44af0e 3f812b3b be1d20d1 -> 3f41e2e9 3e804de2 3f079822", + "3f400000 3f5663ca 3edae9f8 3f36eeba 3f32c6d5 bdfef0e5 bdfef0e5 -> 3f3bae12 3c5daa40 3daea8c8", + "40000000 3f8b1440 3f14fa83 be782797 3f715ced 3f79eeb9 3f79eeb9 -> 3f4c915a 3f14fa83 be782797", + "00000000 3f94eb73 3c6fd8f8 3e3a69e4 3f059b82 3f874c98 3f874c98 -> 3f94eb73 3c6fd8f8 3e3a69e4", + "3f000000 3c304470 3f09f1ee 3f0e1e96 00000000 3f000000 3f800000 -> 3bb04470 3f04f8f7 3f0e1e96", + "3f800000 3f17ffcc 3f531870 be0d5e2e 3f2e644d b98308f6 b98308f6 -> 3f17ffcc b9830800 be0d5e2e", + "3fc00000 3e464787 3e6cbcdd 3f66ca77 3f135e65 3f135e65 3e4bb521 -> 3e464787 3e6cbcdd be1c053c", + "bf000000 3e072c33 3ec2d067 3d8fcf15 3f8cea72 3f311591 3f78ded3 -> 3e072c33 3ec2d067 3d8fcf15", + "3e800000 3f9668cc 3f4938ee 3f4938ee 3ef9ea85 bdc1f51e bdc1f51e -> 3f806d41 3f10db0a 3f10db0a", + "3f400000 3ef032bf 3f823352 bde40d6d 3f981d57 bac83fd7 3cb1bc1a -> 3ef032bf 3e819d22 bde40d6d", + "40000000 3eb22840 be354cac 3e8c8dfd 3f42e44e 3f762194 3f42e44e -> 3eb22840 be354cac 3e8c8dfd", + "00000000 3eb1a072 3f2624ff 3d8ec77c 3d88a2a1 3d88a2a1 be6be442 -> 3eb1a072 3f2624ff 3d8ec77c", + "3f000000 3f248a73 3f7a3dc1 3f9dc183 3f87b225 3e40654d 3f80fef1 -> 3f248a73 3f152b8a 3f8f603a", + "3f800000 3dc84ae1 3f6834cd 3f34a437 3ea36a18 3e1f8871 3f3248ae -> 3dc84ae1 3e1f8870 3f3248ae", + "3fc00000 3f3b06e5 3f3a5930 3f8a399e 3c1cf9d8 be7887e8 be7887e8 -> beb3ab2e bf3a5f90 bf676c94", + "bf000000 3f5f9d85 3f7c62bc 3f7c62bc 3f9d2999 3f0a3850 3f98e5a1 -> 3f5f9d85 3f9abbf9 3f7c62bc", + "3e800000 3f1ae0b9 3f1ae0b9 3f85c5b2 3f800000 3f800000 3e800000 -> 3f1ae0b9 3f1ae0b9 3f58a88b", + "3f400000 3e8e594e be626d77 3e8e594e 3f9195e5 3edbff65 3d810138 -> 3e8e594e be626d77 3def1a38", + "40000000 3f36103d 3e405484 3f36103d 3e526161 be659364 be659364 -> be99bf1a bf22ded3 bf946cf8", + "00000000 3f98df12 3f9e5638 3f8a6533 00000000 3f000000 3f400000 -> 3f98df12 3f9e5638 3f8a6533", + "3f000000 3f6f0fbb 3f3ae607 3eaad73b 3e800000 3f000000 3f800000 -> 3f1787de 3f1d7304 3eaad73b", + "3f800000 be0c6282 3f4be940 3f4be940 3e800000 3e800000 3f000000 -> be0c6282 3e800000 3f000000", + "3fc00000 bc04e52b 3f183bcb 3f183bcb 3f026caf 3e9c2636 3f026caf -> bc04e52b 3e23fb0c 3eef0a42", + "bf000000 3e85bbcc 3e417aab 3e85bbcc 3f4b7144 3f3fd4f5 3f2056b5 -> 3e85bbcc 3e417aab 3e85bbcc", + "3e800000 3f608380 3f53f070 3e3dc589 3eac5e06 3f77527f 3eedf3a3 -> 3f3dee61 3f53f070 3e3dc589", + "3f400000 3f663a66 3f95d23e 3f0544b4 3efae843 bd72241c bd46b4b0 -> 3f17a5b2 3e7e3db8 3dc005a8", + "40000000 3f1ac3b1 3f5f0bae 3f1ac3b1 3e816fc0 be5d5672 be5d5672 -> bdca9f88 bfa6db73 bf84b776", + "00000000 3ed5af8e bdee0066 3f8fb3e3 3e210c8c 3d7620b3 3f34ec38 -> 3ed5af8e bdee0066 3f8fb3e3", + "3f000000 bd7c6445 3f8496bf 3f689d7f 3f2c4053 be45dbdb 3f1d1540 -> bd7c6445 3ed7b688 3f42d960", + "3f800000 3f15ebbc 3ec507ac ba2ed55b 3f5b90fa 3f5b90fa bdb4b318 -> 3f15ebbc 3ec507ac bdb4b318", + "3fc00000 3f9e505b bc3b98d5 3f26afe2 3f000000 3e800000 3e800000 -> 3e06be98 bc3b98d5 3d4a80f0", + "bf000000 3f999fb1 3d6200c6 3d6200c6 be800000 be800000 be800000 -> 3ff66f8a 3e54c04a 3e54c04a", + "3e800000 3f94a482 3f3b110c 3e75d4ac 3f5a7dd2 3f054474 3f5a7dd2 -> 3f8acb1c 3f2d9de6 3e75d4ac", + "3f400000 3f2404a7 bdd1787f 3ea319b5 3e595a3f 3ed254a3 3e595a3f -> 3ea3842c bdd1787f 3e74908a", + "40000000 bc794ce5 3f8e70a1 3ee65a7b 3e5a4c3f bb93d2f1 3f14949b -> bc794ce5 bf8f9847 3ee65a7b", + "00000000 bdbc7ff3 3f66b2cc 3f38335d 3f917baf 3e9fe86f 3d9eb31b -> bdbc7ff3 3f66b2cc 3f38335d", + "3f000000 3f944cca 3f827d5e bdfa1635 be22ba94 3f24e625 3f0a8535 -> 3effeaf0 3f54f070 bdfa1635", + "3f800000 3f295b26 3f9a277f 3ed33226 3ef13167 3edb98df 3ef13167 -> 3ef13167 3edb98e0 3ed33226", + "3fc00000 3f248f9d 3f56c7d3 3f56c7d3 3f37dafb 3e8ac227 3f1a9ce2 -> 3f248f9d bc549340 3ef90ed3", + "bf000000 3e3a2c92 3e3a2c92 3f45bab6 3ec37895 3f89f060 3e5d88ee -> 3e3a2c92 3e3a2c92 3f86737a", + "3e800000 3f060486 3e11c748 3ea226d7 3f000000 00000000 3e800000 -> 3f048364 3ddaaaec 3e999d21", + "3f400000 3f45e158 3f165bef 3e014402 3f206093 3f206093 3f0fdfc9 -> 3f29c0c4 3f165bef 3e014402", + "40000000 3ed0e905 bcc83d60 3e2987a6 3f6ccc73 3f6ccc73 3f7768df -> 3ed0e905 bcc83d60 3e2987a6", + "00000000 3f6e3df7 3f6e3df7 3e961e8b bd268e33 3d74f81e 3f2ea264 -> 3f6e3df7 3f6e3df7 3e961e8b", + "3f000000 3f52d7d4 3c433158 3c6b2a17 3f5e0d92 3ed158ba 3f14eb80 -> 3f52d7d4 3c433158 3c6b2a17", + "3f800000 be718147 3f2a7296 3f5b800f 3f3884d4 bd23ba4e 3e16dc25 -> be718147 bd23ba50 3e16dc24", + "3fc00000 3eaafea3 3f5f81c1 3e3759e9 00000000 3f000000 3f000000 -> be2afea2 3ea07e3e 3e3759e9", + "bf000000 be49ba52 3d5364f2 bd944949 3f25706f 3f4fac07 3f4fac07 -> be49ba52 3d5364f2 bd944949", + "3e800000 3f2c7207 be33dde8 be33dde8 bdd211a3 bd6be08a 3ebf397b -> 3ef589f0 be33dde8 be33dde8", + "3f400000 3e740bd6 3f80ba02 3f8e7455 3e858e48 3e4eebc5 3e4eebc5 -> 3e740bd6 3ece526c 3edc0cbe", + "40000000 3f661368 3f445c09 3f661368 3f836564 3f701cd0 3f9ae845 -> 3f661368 3f445c09 3f661368", + "00000000 3f54a1a4 3dc8cd45 3de9c35c 3c466a86 3eaddbf9 3f37a3ef -> 3f54a1a4 3dc8cd45 3de9c35c", + "3f000000 3d716af9 3f251e11 3ecd9c32 3d928244 3dd7ab71 3db77153 -> 3d716af9 3ec0137f 3e7b7887", + "3f800000 3a32531e 3f5a0ecc 3f526bfe 3dc5c64b 3efffc4a 3f768388 -> 3a32531e 3efffc4a 3f526bfe", + "3fc00000 be37f974 bddad8c6 3f8a3b5a 3f78aa2d 3f78aa2d 3f252ad0 -> be37f974 bddad8c6 3edb09bc", + "bf000000 3b4f0dff be20c459 be20c459 3f8e0b38 3f852a52 3f6b3c58 -> 3b4f0dff be20c459 be20c459", + "3e800000 3f9d6a3b 3f9d6a3b 3eee028c 3f22a0cc 3edcb555 3f22a0cc -> 3f8a63c6 3f83db02 3eee028c", + "3f400000 3e36c17c 3e36c17c 3f42badb 3f5308e8 3f5308e8 3efc43c8 -> 3e36c17c 3e36c17c 3f0f4822", + "40000000 bdae022b bdae022b 3f1ddc15 3f000000 3f800000 3f800000 -> bdae022b bdae022b 3f1ddc15", + "00000000 3f09a5ee 3f8491bb 3f09a5ee 3f500cd4 3f5a6145 3ecd8084 -> 3f09a5ee 3f8491bb 3f09a5ee", + "3f000000 3f766a85 3e0e3437 3f9804ae 3e763dcb 3f1e7edd 3e763dcb -> 3f19fcfc 3e0e3437 3f36cc68", + "3f800000 be5c3fcc be3bbf2a be3bbf2a 3f937407 3f9e1b4b 3f406493 -> be5c3fcc be3bbf2a be3bbf2a", + "3fc00000 3f75cc98 3f7bcb6a 3f7bcb6a 3f666666 3f666666 3f666666 -> 3f5eb34d 3f5bb3e4 3f5bb3e4", + "bf000000 3f887c21 3f12c25d 3eb6c9c1 3eeceeff 3edcf6e4 3f5d3225 -> 3faf1c52 3f24e5d2 3eb6c9c1", + "3e800000 bbeb60f0 3f5c442c 3ea14a45 3f6949aa 3f9b1166 3f598a5b -> bbeb60f0 3f5c442c 3ea14a45", + "3f400000 bb02674b 3f98cdd9 3f98cdd9 3f917f09 bddaf500 3effc00b -> bb02674b 3e5f7fd0 3f2c4ef1", + "40000000 3e88b8e4 3e88b8e4 3f86aaf7 3f0ea591 3f0ea591 be5f16fa -> 3e88b8e4 3e88b8e4 bfbe70b5", + "00000000 3f2a3cc0 3f468380 3f2a3cc0 3f978791 bd8b9788 3e78b296 -> 3f2a3cc0 3f468380 3f2a3cc0", + "3f000000 3f369ac2 3f9d0ac3 3f86c621 3e5d82af 3f5e4df2 3e5d82af -> 3eedfb6e 3f8618de 3f227677", + "3f800000 3f920f52 be63c3f2 3f9eb91e 3f400000 3f000000 3e800000 -> 3f400000 be63c3f2 3e800000", + "3fc00000 3f8d8f03 3f2fd81d 3f8d8f03 3e99b9c8 bcdf58e4 3e99b9c8 -> bdd21d70 bec4c872 bdd21d70", + "bf000000 be2eaeea be7b3095 3db62428 3f071ef3 3f176084 3f47d56c -> be2eaeea be7b3095 3db62428", + "3e800000 3d4b7779 3eb99a3f 3d4b7779 3f61de70 3f49fd38 3f9706a0 -> 3d4b7779 3eb99a3f 3d4b7779", + "3f400000 be3de680 3f4f1afe 3f822586 00000000 00000000 00000000 -> be3de680 3e4f1b00 3e822586", + "40000000 3f5a3e26 be166a3c 3e9a3314 3e5856bd 3e3d0a50 3f86343a -> bedc2590 be166a3c 3e9a3314", + "00000000 3d90249c 3ea51759 3d90249c 3f9e1be3 3f76d7b4 3e9a9fe2 -> 3d90249c 3ea51759 3d90249c", + "3f000000 bd87f88e be407a1a 3f073f08 3d4e69e1 3d4e69e1 3f33a479 -> bd87f88e be407a1a 3f073f08", + "3f800000 3ee7411a 3e99e5ea 3e99e5ea 3f4dcfe3 3f4dcfe3 3ec0b8f2 -> 3ee7411a 3e99e5ea 3e99e5ea", + "3fc00000 3f3b0c99 3f3b0c99 3f4e3d0b 3f49a886 3f95633e 3f9e27b7 -> 3f3b0c99 3f3b0c99 3f4e3d0b", + "bf000000 bce00490 3df0e7b8 bce00490 3f33fbc6 3f878558 3da1db78 -> bce00490 3df0e7b8 bce00490", + "3e800000 3e9f7723 3edceb1f 3edceb1f 00000000 00000000 3f400000 -> 3e6f32b4 3ea5b057 3edceb1f", + "3f400000 3f004da7 3eab675f 3ebe32c6 3f270a70 3f270a70 3ee3f45f -> 3f004da7 3eab675f 3ebe32c6", + "40000000 3f6040e2 3f94e9d1 3f6040e2 be49e9e5 3f3c82dc 3efd6fce -> bfa29aeb 3e9e642c 3de97760", + "00000000 be1696c8 be1696c8 3f046566 3f51f11e 3f115076 3f115076 -> be1696c8 be1696c8 3f046566", + "3f000000 3eb0036f 3f38bccf 3e049e5f 3f1e4a78 3e8a8ce3 3d23babb -> 3eb0036f 3efe0340 3dad8d0e", + "3f800000 3cd2b9ef 3f3442d2 3e955697 3f0cd4a6 3d6f3a17 3da07123 -> 3cd2b9ef 3d6f3a10 3da07124", + "3fc00000 3e51765f 3f61ca5e be0067d4 3ed052b8 3f3306f5 3ed052b8 -> 3e51765f 3f1ba540 be0067d4", + "bf000000 3eed866c 3f4c8c57 3f4c8c57 be7490ca 3f909c46 3d8128d1 -> 3f50b6ea 3f4c8c57 3f955ffb", + "3e800000 3f746907 3e646e56 3e646e56 3f9e5757 3e2c5e4c 3ee465b5 -> 3f746907 3e566a54 3e646e56", + "3f400000 3eedaaff 3df61379 3f9d65f1 be3eee00 3f88f084 be3eee00 -> bcc2e810 3df61379 3e2b9960", + "40000000 3e9753ea 3e43a0ef 3f182b57 3d6e3b88 3f2ff558 3f2ff558 -> be378a10 3e43a0ef 3f182b57", + "00000000 3f1543b0 bddccb18 bddccb18 00000000 3f800000 3e800000 -> 3f1543b0 bddccb18 bddccb18", + "3f000000 3d81359f 3f5aa629 3d074803 3f988f9b 3f9d8e51 3f988f9b -> 3d81359f 3f5aa629 3d074803", + "3f800000 bddcd7bf 3f69f76c 3f89d7bd 3e088dce 3f991a2e 3ea761a8 -> bddcd7bf 3f69f76c 3ea761a8", + "3fc00000 3efd5b83 3f96c289 3c3ab256 3f88eb47 3f7824c1 3f6002b2 -> 3efd5b83 3f5d7498 3c3ab256", + "bf000000 bc78d904 bc78d904 3eedbda7 3f5d35fa be1f429e 3f8ff603 -> bc78d904 3d6133db 3eedbda7", + "3e800000 3e241578 3e241578 3f5867ef 3f0af683 3e466582 be442d54 -> 3e241578 3e241578 3f160b1e", + "3f400000 be33307b 3f65504a 3e6e436e be628558 be628558 3f0313a4 -> be56b021 3d6db120 3e6e436e", + "40000000 3f8b0aff 3f8b0aff 3f755b81 3f45f812 bdb99cbd 3f1566e6 -> 3eebb44c bfa23e97 3e55c92c", + "3eb1ee34 3f685205 3f904453 be6f91c8 3f0ececa 3f4308c4 3f0ececa -> 3f493682 3f800538 be6f91c8", + "3f830764 3ed7ebad 3f3f9e16 3ed7ebad 3f8eb3cf 3f46952a 3ec4e0cf -> 3ed7ebad 3f3f9e16 3ec46d74", + "beb069a4 3ec5c846 3ec5c846 3e9e8abd 3f94de4a 3eec2367 3f94de4a -> 3ec5c846 3ec5c846 3e9e8abd", + "3fa3dc94 3f50a0c6 3f972fbb 3f95818c 3ea2b53c 3f5179ce 3e8fa3cd -> 3e36c86c 3f3772ec 3d02af00", + "3e141fa7 3f8961d2 3f8961d2 3f067ccb 3f37a737 3e974da3 3f0897b1 -> 3f82cadc 3f75f652 3f067ccb", + "3ec08792 be6beba4 3ddc6158 3ddc6158 3cbd5618 3f73581b 3f18179e -> be6beba4 3ddc6158 3ddc6158", + "3e40935d bd070f30 3c4a4642 3f955ee9 3ef36863 be242f37 3f9d066b -> bd070f30 bca4e5db 3f955ee9", + "3fa0e065 3f1e46cd 3f1e46cd 3f6ed832 3f8b130a 3def039e 3f1fa807 -> 3f1e46cd bc468ec0 3f0b512a", + "3f02835c be1dc10d 3f8d1e30 be1dc10d bd2c15e5 3f212af6 bd2c15e5 -> be1dc10d 3f5c8369 be1dc10d", + "be123e39 3eacd8fc 3ecb2ee7 be5511d3 3f37b736 3f7e1a4d 3f55840f -> 3eacd8fc 3ecb2ee7 be5511d3", + "3dfa6e43 3e8e224f 3f29da88 3f820737 bdb0a510 bdb0a510 3d2beceb -> 3e6eb51b 3f126241 3f65920a", + "3f9dc402 3f824723 3e78c554 3e78c554 3e780552 3e9ab172 3e25b1ff -> 3d7d55a0 3e78c554 3e126067", + "3f154127 3eb44ee7 3f3c9cde bde8212f 3f77b198 3f63a6a2 3f77b198 -> 3eb44ee7 3f3c9cde bde8212f", + "3f6ce13e be2be48f 3e8055e9 3f44d330 3f80e0a9 3ee3a439 3f60bcd0 -> be2be48f 3e8055e9 3f44d330", + "be32f8a2 3d04858e 3e9c26f9 3f91f804 3e800000 00000000 00000000 -> 3d04858e 3eb771a9 3fab7b12", + "bea04a39 3f9fc832 3f9fc832 3f86f39d 3f5bef43 3f8c64b7 3f562ca0 -> 3faf6098 3fa5da18 3f8faccf", + "3f137831 3f0c9974 be4c8a64 3f91f585 3e956f67 3f35d92a 3e956f67 -> 3ecd4bc8 be4c8a64 3f26cc96", + "3fb7a54e 3eb089da 3eb089da be148163 3f000000 3f000000 3f800000 -> 3eb089da 3eb089da be148163", + "3f48ff5f 3d8be1ae 3e63e7f6 be7632d7 3e6d6533 3f91777a 3f91777a -> 3d8be1ae 3e63e7f6 be7632d7", + "3f2cbfe1 3f832d9e 3f832d9e 3f0c06dd 3eeea45c 3f38ac32 3eeea45c -> 3f25d5f1 3f51ef68 3efc1be5", + "3e3f700f 3e9ffc6d 3f8fb48c be4b95a4 3ee42a81 3e1b5689 3ee42a81 -> 3e9ffc6d 3f70f063 be4b95a4", + "3f76a5e9 3ee0a085 3e118bfb 3f04589c 3e572754 3e572754 3f6083ef -> 3e5fb49d 3e118bfb 3f04589c", + "3db2b03e 3f6248c6 3ed38d71 3f3b89b6 be451567 3f4bacf5 3f8d093f -> 3f4a3df5 3ed38d71 3f3b89b6", + "3fac8c4c 3f086e01 3e97c798 bde2fcc9 3f442fe0 3f442fe0 3f751911 -> 3f086e01 3e97c798 bde2fcc9", + "3dc3f0be 3dbf6229 3f007cb8 3f007cb8 3f8b621c 3f78431c 3f8b621c -> 3dbf6229 3f007cb8 3f007cb8", + "3fbff2a2 3f14935b 3e90780d 3f14935b bd1d1edb bdf31ee2 bc9eaebd -> beb1e810 bea3522d bea353ac", + "3ec73bac 3e826f8e 3f1819b8 3f1819b8 bd299bf6 3dd44d03 3ef8669a -> 3e0edc04 3ece7b29 3f0d3e69", + "3f14ab7d bd607e22 3d656552 3f32a02d 3f946726 3f06a411 3f92865c -> bd607e22 3d656552 3f32a02d", + "3f22041d be3b25bc 3e33272e 3f9a48f8 3e659d31 3ed3b4af 3e659d31 -> be3b25bc 3e33272e 3f159ceb", + "bd47d803 3f719f8e be16168d 3ea791b1 bdba696f bcbd5b25 3f3aba60 -> 3f7e8c87 be16168d 3ea791b1", + "3f3f3674 3f917449 bdc34379 bdc34379 3eebb170 3f970138 3eebb170 -> 3f21a4ef bdc34379 bdc34379", + "be054de8 3e35a5ce 3f94ef64 3f1087f4 be7e9dc8 3dcd1509 3f6470d5 -> 3e6e70c6 3fa6a7a7 3f1087f4", + "3f7ad0a3 3f812a0a 3f907858 3f907858 3f800000 3f400000 3f000000 -> 3f800609 3f41f6a3 3f03427a", + "3f66e725 3f85c634 3f9cfa37 3f5ab614 3e2c5c43 be624a40 3f95741d -> 3e8230a4 bda1fb40 3f5ab614", + "3f7fd5d0 3edf4dce 3e58df1d 3f6b0c92 be5e8552 3f9beab4 3ec5d400 -> be5e1710 3e58df1d 3ec600de", + "3f349972 3ebeabca be20f53e 3ebeabca 3d055ae9 3f8465a9 3d055ae9 -> 3e07d663 be20f53e 3e07d663", + "bea46525 3f7aa997 3f2c1d16 3f5af1e4 3eda629c 3ee0c86a 3f79d3c9 -> 3f940b08 3f3f4a1a 3f5af1e4", + "3face3f5 3eeed5a7 bdc6b2ee 3e922b96 3ebacb9a 3e70827e 3f8e0060 -> 3ea88b78 bdc6b2ee 3e922b96", + "3fb6c0f2 3ce93bf7 3cf0f063 3ce93bf7 be4b40a0 bdafbe70 3f296583 -> be975571 be0a57ec 3ce93bf7", + "3fba73ec 3e274ed3 3f7d3db8 3f7d3db8 3e78bee9 3f3c8009 3f6b1c19 -> 3e274ed3 3f1eef74 3f62d471", + "3f8dfa03 bd28df76 3eb535ad 3e0e4bce 3f0bb8ba 3eb23f79 3f4e9a36 -> bd28df76 3eb1ecaf 3e0e4bce", + "3f8cee32 3f5d0365 3f5d0365 3f96191d 3c86c756 3f3ab832 3f4be4b8 -> bd8d8398 3f374154 3f422a3e", + "3fb61482 3ecff295 3ecff295 3e8c3822 3df6e352 3f116476 3d84cf5c -> b8ef6000 3ecff295 bcc031e0", + "bebf8635 3eaf50e1 3f4269e6 3f4269e6 3f3c2b3d 3f3c2b3d 3f8b0843 -> 3eaf50e1 3f44bfe9 3f4269e6", + "3f5e4380 3f9eebd6 be2e63ee 3f9eebd6 3f5baee3 3e873e16 3e873e16 -> 3f689e6c be2e63ee 3ec9312c", + "3e5ab8b3 3f3692dd be31f369 3f3692dd 3e7c69fe 3dfeb58e 3e7c69fe -> 3f1d0e31 be31f369 3f1d0e31", + "3fa9d3e3 bd65a18c bd9b2be2 3f374feb 3d802a5c 3f8bb51d 3f8bb51d -> bd65a18c bd9b2be2 3f374feb", + "3fa86294 3e0ff11a 3e0ff11a 3f642476 3f510276 be228a20 be3fba80 -> 3e0ff11a be819e55 bf070934", + "3f9e0ec1 3f794299 3f939b18 3f794299 be460a48 be1a9d80 be460a48 -> beef5672 beea1b94 beef5672", + "3f69724d be05a8ae 3daee0c7 3f3933c3 bcafd5fd bcafd5fd 3e597afe -> be05a8ae bc456fa0 3e83caf0", + "3f9a7b76 3e855e06 3e855e06 3ea8e8ef 3f10db4d 3f83c295 3cbbd7cc -> 3e855e06 3e855e06 bd263778", + "be5a2a99 3f7b8ea5 bd2f79d4 3f9962eb 3f897871 3f12aac3 3f52638a -> 3f7b8ea5 bd2f79d4 3fa3a763", + "3fb1ce58 3e9291c5 3f83ecf0 3f83ecf0 3ec7a054 be3d9764 3f65a247 -> 3e9291c5 bf2881fc 3f5851d6", + "3e8fdaed be58c6ad be1793b3 be1793b3 3f5cdd92 3e0715e3 3f724a4f -> be58c6ad be1793b3 be1793b3", + "be91916b 3f74830c 3ee7e659 3f74830c 3f2aaaab 3f2aaaab 3f2aaaab -> 3f84c0e6 3ee7e659 3f84c0e6", + "3f7625a1 3eb4be90 3f669e94 bd89d63f 3ebc39b9 3de164aa 3f99258a -> 3eb4be90 3e0fdd1c bd89d63f", + "3f90fe75 3f47a02e bdf2f5ec 3f6e3b89 bc5c937a 3f58221f bd9620a6 -> bdf34280 bdf2f5ec be538bbc", + "3f9d4665 bdbcc5a7 3f6dea1f bdbcc5a7 be3bcf7d be3bcf7d 3f08b7c3 -> be512d7c bee035aa bdbcc5a7", + "3ce497ba be1a1a4b 3f23319f bd43df45 3f44bdeb 3f0b1ce1 3dd0577b -> be1a1a4b 3f228599 bd43df45", + "3fbb70d1 3f2c7b56 3f8db093 3f249744 3f580aff 3f580aff 3ea95053 -> 3f2c7b56 3f38c5f0 3e3e25fe", + "3ef5eb28 3d954076 3f793ccd bb0a9a08 3e47f22a be5d221a 3e47f22a -> 3d954076 3ecdf246 bb0a9a08", + "3d57d7cf 3f9f7926 3f91e90d 3f3ba030 3dd62d32 3f880ad7 3f387c60 -> 3f97c668 3f9163ee 3f3b75d4", + "3f8a15a2 be1f1169 3e18a798 3e18a798 3e800000 3f800000 00000000 -> be1f1169 3e18a798 bc406e50", + "3fb82a58 3ed7c7a0 3f440d6c 3ef7c448 3f593328 3f6e70f2 3eacabfc -> 3ed7c7a0 3f440d6c 3e8bb883", + "3f221273 3e637b5c 3f4ee73d 3f4ee73d be2392af 3f3b63ec be2392af -> bca0bdb0 3f428cbc 3e481960", + "3f07b1f8 3f7b1c1c bda2b236 bda2b236 3f989369 3e4cc68c 3f9a8526 -> 3f7b1c1c bda2b236 bda2b236", + "3e780551 3f4ac12b 3f3c595b 3f4ac12b 3da2784f 3f050942 3e4357af -> 3f1e9094 3f2ef3ab 3f257965", + "3f32cb4f 3f46e5f1 3d8dac86 3f46e5f1 be09d54c bc26742a be34003d -> 3e0faca0 3c618f74 3de47290", + "3f74e8d4 3f2e6b37 3f7501ee 3f7501ee 3f9de832 3e77ec9c bddce452 -> 3f2e6b37 3e8bd206 bd7cd0e0", + "be979953 3f7f0a42 3f7f0a42 3edc5e0c 3f1fe95a 3f1fe95a 3f69a1e3 -> 3f8d9a7a 3f8d9a7a 3edc5e0c", + "3de09e04 3f55b9a2 3f39bb26 bbb7bde5 3ed37f41 3ea16cc4 3f134214 -> 3f49e1f5 3f2e3686 bbb7bde5", + "3c6c8b8b 3cb1ee97 3cb1ee97 3ed9587f 3e7f9abc 3e8f9a80 bd1e5f3d -> 3cb1ee97 3cb1ee97 3ed5ec04", + "3f4d44a4 3f281339 bda0aa48 3ebaf1d8 3e800000 3f000000 3f400000 -> 3ea93fd9 bda0aa48 3ebaf1d8", + "3fae311b 3f89677d 3f89677d 3f6d6316 3f5aa49a 3f5aa49a 3f4f59ec -> 3f465fd4 3f465fd4 3f44831b", + "be9cdd18 3f5b2af2 3f464e86 3f464e86 3e800000 3f400000 00000000 -> 3f855a84 3f483d2c 3f81880a", + "3f6566d7 3f4f0eed 3f30ad5e 3f4f0eed 3ea47911 be0ca7f4 be0ca7f4 -> 3ebe6929 bd527600 bd1ff4a0", + "3fb411ed 3f96cbb2 3e63d69b 3f91d85e 3f36b9e1 3f859c49 3e9cc150 -> 3f065f3e 3e63d69b bd065c00", + "3f8342f2 3f9ef378 3e95b1ec 3e95b1ec 3edf819e 3edf819e 3ee67761 -> 3ed50032 3e95b1ec 3e95b1ec", + "3f012122 3f4bc85e 3d80d7bd 3f4bc85e 3f38ca93 3f548e86 3f548e86 -> 3f423406 3d80d7bd 3f4bc85e", + "3e120ecc 3f2af1f0 3f3f18b3 3ef32a38 00000000 3f800000 3f000000 -> 3f128ff9 3f3f18b3 3ef32a38", + "3fa5e159 3f192758 bd55ec49 bd55ec49 3f1cc86f 3eb2e189 3c7516fb -> 3f192758 bd55ec49 bd55ec49", + "3f2f972b 3f5239fc 3ea29b35 bbb9522f 3f400000 00000000 3f800000 -> 3f45b996 3dcc4c5c bbb9522f", + "bdb706f7 3f86c35c 3e4051ab 3f3de69e 3f400000 00000000 3f000000 -> 3f8a3a33 3e51819f 3f436ecf", + "3f473ea9 3f28853c 3f818cf0 3f818cf0 bdf4c545 3db32c25 3f36994a -> 3d58c420 3e95bf7a 3f478f32", + "3f1bec80 3e86974c 3ecad952 3ecad952 3f07de0e 3f647e21 3dd7f03e -> 3e86974c 3ecad952 3e605ba9", + "3e82ebb0 3eaa91de 3e43fefb 3ebcf0c3 3f5de781 3f868e13 bbb6980e -> 3eaa91de 3e43fefb 3e8be5e6", + "3e7cdb0b 3ebd3149 3f00da29 3ebd3149 3f9a6939 3eb7c2d4 bd9766b1 -> 3ebd3149 3eef7213 3e852106", + "bcd5c85b 3f5936b4 3f9818e9 3f8d1d9d 3e84ef18 3f801298 bd8a1495 -> 3f5d25cc 3f98b969 3f910605", + "bc3c09be 3ec1c92b 3f638b63 3f409113 3d99fd84 bd71ede1 bd71ede1 -> 3ec3916b 3f66545c 3f42f347", + "be35428f 3f066c30 3f9663e4 3f87b595 3ec00501 3ec00501 3f467379 -> 3f0d38dd 3fa8837b 3f8e2ad8", + "3f2f274f be17e6ea 3e75a860 3dc22177 3ee75e19 3ee75e19 bd2883e1 -> be17e6ea 3e75a860 3aea3100", + "3faaacfc 3f43a33a 3f60b4a0 3f6251b0 bd48d4fc 3f47aadb 3f47aadb -> bea3ed30 3f3f51d0 3f3ec818", + "3f741c84 3f02faab 3ede02cf 3ed2ee2c 3f0e4ee5 3f0e4af9 3f9c3325 -> 3f02faab 3ede02cf 3ed2ee2c", + "3f28bb38 3f121192 bd7fc5ac 3f84c384 bd13c830 3ef04d2f bd13c830 -> 3e2ed300 bd7fc5ac 3ea8db86", + "bee09b5a 3f14ae74 3f0a1829 3ca75923 3eec59bb 3e9173e4 ba6f1319 -> 3f221067 3f26c537 3cf409f0", + "3f81cf4e 3e47e782 bdcb4746 3d7fd78e 3e98d04a 3e98d04a 3d1ea44e -> 3e47e782 bdcb4746 3d1d447c", + "bebb98c9 3f7c3ae8 3f24d68d 3eed039b 3f903eff 3f903eff 3f505a41 -> 3f7c3ae8 3f24d68d 3eed039b", + "3ee950f5 be574365 3f1bb220 3f983abc 3f28584f 3f3c1137 3f3c1137 -> be574365 3f1bb220 3f7b6b71", + "3f96ea62 3ebf19c8 3f3defac 3ea50141 bd6d84e8 3f4dd46b 3f4dd46b -> be0a6f64 3f3defac 3ea50141", + "3f75ea77 3f67e74b 3f84bdbc 3b4587d6 3f5c5845 3f5c5845 3f938bea -> 3f5cccd4 3f5e1f71 3b4587d6", + "3fabe298 3f2e9dcf 3f2e9dcf 3f93008b 3f0fe9a3 3f9d762b 3f9d762b -> 3f0562c2 3f2e9dcf 3f93008b", + "3e7361a5 3f9eb5ac 3ef17860 3e2f4edf 3f52c408 be1a3b66 3f919ad7 -> 3f9208fc 3ea5bfe2 3e2f4edf", + "becc7306 3f8361aa 3e062ef7 3f8bdc6a 3f102be3 3e5e974f 3d8ffe52 -> 3f9b0f28 3e062ef7 3fc01dad", + "3f3041f8 3ec9bb97 3e4fd6c2 3e4fd6c2 3f964285 3f964285 bcd1ebc2 -> 3ec9bb97 3e4fd6c2 3d3ab220", + "bec77086 3f9109d9 3f27cb56 3dcf8796 3f39dd16 3ee44c71 3f8f8cac -> 3fa555e9 3f3cb0cd 3dcf8796", + "3f4becef 3f650d89 3f4ddeac 3f8361bd 3ebdc6ed 3f03e516 3f03e516 -> 3ef45c01 3f12f14b 3f1e8402", + "3fb94623 3f3eabdb 3f94d163 3ecb1c0c 3f400000 3f400000 3f000000 -> 3f3eabdb 3f10bba2 3ecb1c0c", + "3f30f61e be1bebdf 3eacf5a8 3f147729 3f400000 3e800000 3f400000 -> be1bebdf 3e8de18b 3f147729", + "3f8587b2 3f52e07f 3e594428 3f88f6eb 3f96cca6 3f6d456a 3f44a641 -> 3f52e07f 3e594428 3f414f88", + "bef51643 3f281162 3f281162 3f50710e be732b0d bd369e88 bd369e88 -> 3f8acf56 3f7dfbae 3f9cd772", + "3f500639 3f463fad 3e3b3474 be0fbf5c 3f7facbb 3f7facbb 3eaa56ff -> 3f463fad 3e3b3474 be0fbf5c", + "be8f6595 3d846858 bd2ed44b be7cb118 3e59e293 3e59e293 3dbd9e82 -> 3d846858 bd2ed44b be7cb118", + "3f8be75f 3ef30e4f 3f390438 3ef30e4f be2d691a 3f4355d1 be2d691a -> be6abebe 3f390438 be6abebe", + "3e492740 3f538ab4 3ec54b1c 3f3f49cf bd61377a bd61377a 3f4d3033 -> 3f2738c2 3e9901d5 3f3f49cf", + "be551285 3d2755bd 3f2c1b18 3f0afaaa 3bf2fc14 3f91faa5 3f91faa5 -> 3d43d56f 3f2c1b18 3f0afaaa", + "bd36f58e 3f79af13 bdea8caa 3f88a97d 3f800000 3f400000 3f800000 -> 3f79af13 bdea8caa 3f890c8a", + "3f845a2f 3e56eddf 3e56eddf be767e19 3f991e07 3e67c848 3f991e07 -> 3e56eddf 3e56eddf be767e19", + "3eadc9bb 3f6b33aa 3f6b33aa 3f0ddfc5 3e267c39 3e9a1f20 3f2d8ae7 -> 3f297eae 3f358628 3f0ddfc5", + "3d9dcd6d 3ebae8c6 bd17321b 3ebae8c6 3e976132 3f2775f3 3ee43212 -> 3eb82bf1 bd17321b 3ebae8c6", + "3f28f2e3 3f03e8fe 3f81f5d1 3f81f5d1 3f2ce9af 3f967e2e 3f4cc2f0 -> 3f03e8fe 3f81f5d1 3f5f8498", + "be7dbebc 3e85c8c2 3f61541e 3f87fe2b 3f41fd44 3eebba81 3f7bf0f0 -> 3e85c8c2 3f7bf540 3f8a79f1", + "3d298074 3f3903aa 3f3903aa 3f5e69ef 3f8c18ec 3f3bab1f 3f1e81a7 -> 3f3903aa 3f3903aa 3f5bc4e8", + "3f1bb89b 3ed7a4c3 3e0664be bd8ffa2f 3f978340 3f3ff069 3f978340 -> 3ed7a4c3 3e0664be bd8ffa2f", + "3e782fbb 3f74c4cd 3f74c4cd 3eb21ac0 3f000000 3f400000 00000000 -> 3f5877b2 3f67faae 3e86eff8", + "3fb6e41a 3f662572 3e619214 3f611714 3f31f167 3f22019c 3f22019c -> 3f1b8e6b 3e619214 3f06f422", + "3f9b1ae1 3f3613fd be6e9032 bcd74b3c 3e490547 3e490547 3f517bbe -> 3db2b998 be6e9032 bcd74b3c", + "bebeaf23 3ebab4b3 3f0fb0fa 3ebab4b3 3e47862d 3f83ade2 3f403224 -> 3edb161a 3f0fb0fa 3ebab4b3", + "3f98531d bdb7a6d0 3f4191f7 3e5032b9 3f9c0b23 3f2c0ee9 3e386ced -> bdb7a6d0 3f27f85e 3e33e867", + "3faa5fc4 3f08eb42 3e2e42fb bd97a572 3f4c44a8 bdaff38f 3f9d2cfc -> 3f08eb42 be2ec9e9 bd97a572", + "3f95e798 3f86ad46 3f556797 3f86ad46 3e2fa185 3f90fa58 3eed47fd -> 3caa77c0 3f556797 3eb9b2b4", + "3f3acea8 3f62ce1d 3f0af04a 3deca4b7 3e95c220 3f8cc701 3f8cc701 -> 3ee7e27a 3f0af04a 3deca4b7", + "3e4df903 3db97676 3f64021c 3f7eb68e 3f8c931f 3f50d67e 3f8c931f -> 3db97676 3f6026f7 3f7eb68e", + "3f6af9a1 3f99aa78 3c24fc1c 3c24fc1c 3f4360ae 3e4fceaf 3f4360ae -> 3f4c9280 3c24fc1c 3c24fc1c", + "bdb9503b be0eccd6 3c944b96 be2b2558 3e955326 3e88da59 3e88da59 -> be0eccd6 3c944b96 be2b2558", + "3e47c2ef 3f1dde3d 3dba58e7 3f1dde3d 3eb468c2 3f9773fe bd5dc456 -> 3f10ab19 3dba58e7 3ef8bc1a", + "3ed23ed2 3dad5604 3f0a40ca 3f0a40ca 3edce675 3edce675 3ccc1656 -> 3dad5604 3efdac22 3ea83364", + "3f34514f 3eec68dc 3e8f1564 3eec68dc 3eb2cc12 3eccb17b 3e783ec8 -> 3ec3d452 3e8f1564 3e9d518a", + "3f75d4f6 be370840 3f4dde92 bd9b387f be45a2d8 3ee100fc be45a2d8 -> be450e5a 3ee86bba be40de68", + "bee506b7 3d75b525 3d75b525 3e83cbe1 00000000 00000000 3f000000 -> 3db1cef2 3db1cef2 3e83cbe1", + "be2d7c12 3ec104d8 3ec104d8 3f9b2030 3dcccccd 3dcccccd 3dcccccd -> 3ed90bb2 3ed90bb2 3fb33d05", + "3f282224 3f3c0a30 3f2f9705 3f2f9705 3d450bf6 3f1b8fb3 3d450bf6 -> 3e91421d 3f226f8b 3e88b642", + "3faf44c1 bca002c5 3f053917 3e97d1bb bcdfc822 3f54ff88 3f54ff88 -> bcf754db 3f053917 3e97d1bb", + "3e3f63e7 3f8a201b 3e52ac01 3f5c28e3 3dfe2eb8 3f1b3061 3f5935b6 -> 3f668e89 3e52ac01 3f5b9bbe", + "3e986a5a 3f9be96f 3f7e7d28 3f9be96f 3f5dfdac 3e760b3d 3f5dfdac -> 3f8e8a75 3f450ac0 3f8e8a75", + "3eaf04b6 3e39f5bd 3e39f5bd be385014 3f6c72ec be5793bc 3f2888da -> 3e39f5bd 3d42ce3c be385014", + "be97063f 3f6e9edf 3f2e45fe 3f6e9edf 3f07af71 3f74310b 3f40f91e -> 3f867ddf 3f2e45fe 3f7c15d0", + "bca4dceb 3e890062 3e890062 3e1713eb 3ea17051 3f4632e3 be173698 -> 3e890062 3e890062 3e1d2950", + "3f3019a5 be432761 bcc572e5 3ea56da5 bd8e619c 3d7103e8 3d7103e8 -> be432761 bcc572e5 3e10b618", + "becc294b 3e8943fc 3f45479d 3f45479d 3f800000 3f000000 3f000000 -> 3e8943fc 3f60e7bc 3f60e7bc", + "3ed2f4c8 3e9cea8b 3e9cea8b 3ebe9629 3f810b2f 3efe02ee 3e95130c -> 3e9cea8b 3e9cea8b 3ead7b89", + "3e724b58 3f8acd9e 3f963681 3f963681 3f7149bb be5ff5b9 3f8316dd -> 3f8681a6 3f5817a1 3f91b01f", + "bde08fa2 be76c229 3f78ce0f 3f78ce0f 3e977272 3ca17f53 3e888e1e -> be76c229 3f89c431 3f864cbe", + "3f18609e 3f28405e 3f3134da 3f28405e 3f5efd14 3f667c4b 3bf8e556 -> 3f28405e 3f3134da 3e8a85e5", + "bec1dfc3 3f1a3b08 bd9bed05 3f06ee9c 00000000 00000000 3f800000 -> 3f54a1b0 bd9bed05 3f06ee9c", + "3fa512ee 3f18caaf 3e748b17 3f731b94 3f8b5675 bde10055 bde10055 -> 3f18caaf be57ea39 bed55ec4", + "3fa33fec 3f85a08c 3f33aed3 3f8e92e5 3f000000 3f000000 3f000000 -> 3eb34d52 3ee388c6 3ea97260", + "bec03e7d b9f25c37 3ee9a24e b9f25c37 3f9a7584 3f8c0cdf 3eca09b6 -> b9f25c37 3ee9a24e b9f25c37", + "3f93826b 3e934025 3cc3e932 3ef62619 3e31e0cd 3e31e0cd 3e144251 -> 3e201a4d 3cc3e932 3dbfa4a4", + "3f730358 3f0e1203 3f845591 be37b6ea 3f0a59e5 3f88d21e 3f88d21e -> 3f0a8a32 3f845591 be37b6ea", + "be060c63 3e3d2157 bd6a5f19 3e4ee76e 3f3e7f59 3f157de4 3f3e7f59 -> 3e3d2157 bd6a5f19 3e4ee76e", + "3f811e45 3f3605e5 3f8cfe28 3f83c45c 3f20a931 3eda3b5c 3edb3bf7 -> 3f20796a 3ed7361e 3ed88b82", + "3f6fb281 3f622457 3f722bba 3ebfbcbb 3f2d64d1 3f1ab2b3 3e89a972 -> 3f30c0c1 3f2044be 3e8d1b05", + "be4e3ceb 3f395971 3e38087a 3f941201 3e800000 3f400000 3f000000 -> 3f51ca27 3e38087a 3fa500a0", + "3f739e42 3f1ff1e3 bd231857 3f71fb34 3f2dbe2e 3e4294a8 3f2dbe2e -> 3f1ff1e3 bd231857 3f310b18", + "becd6409 3f339fab 3f208311 3f6621dd 3e2315a7 3f9dc9d2 3f9dc9d2 -> 3f6b532f 3f208311 3f6621dd", + "3f817e7e 3f227855 3f00dfdc 3f4cc2c9 3efaeb45 3d9f63ed bdd2f7e8 -> 3efa0e14 3d953760 bde88d48", + "bec7339c 3f8f9e93 3f660422 3e97484d 3ec41b15 3e95d680 3e95d680 -> 3fb46c1c 3f912df8 3e97d82d", + "be0d53d5 bdb66ce7 bca86da0 3f29445b 3f000000 3f400000 3f800000 -> bdb66ce7 bca86da0 3f29445b", + "3f230787 3f66c06c 3f66c06c 3da74e15 3f01362c 3f782ead 3f01362c -> 3f261669 3f66c06c 3da74e15", + "3eeb1f6f be48e4cd 3f27f802 3f27f802 3ea09ddf 3f6be398 3e1c447a -> be48e4cd 3f27f802 3ed98c3d", + "3faf87b9 3f519e5f 3f2f9fbb bd55a053 3f635750 3f85af27 bdb56bca -> 3f519e5f 3f2f9fbb bdd1200b", + "3f3fe43e 3f8d5860 bdb99a1a 3f45a7ad 3eded111 3e73d620 3f3599f9 -> 3f1a4d28 bdb99a1a 3f399f24", + "3fb3418c be786446 be1536df 3f949df3 3d1d6a53 3f567084 3e0a9c1d -> be786446 be1536df be8cfd80", + "3f1dfc12 bddd13a5 3d460bf6 3f2dfc7f 3f110ac6 3f78a720 3f110ac6 -> bddd13a5 3d460bf6 3f1c1fc0", + "be947c4c be5d9aa4 3f9d6715 be495278 3f903e4c be724896 3f903e4c -> be5d9aa4 3fd3d591 be495278", + "3f8d89db 3f95bc8f 3ded2432 3ded2432 3f18e1a8 3f4a7c7c 3ec4fc5c -> 3f096065 3ded2432 3ded2432", + "3f698d48 bda87094 3f010936 3e928b79 3d43a950 3d43a950 3f2fda7c -> bda87094 3db3c578 3e928b79", + "3fabc3f6 3eaeea11 3f8291b2 3eaeea11 3f6b2aa5 3f46aa8e 3f77d2bc -> 3eaeea11 3f314e52 3eaeea11", + "3f6caa95 3f6862df 3f8cfded 3f67385a 3f000000 3f400000 3f400000 -> 3f07e22b 3f46cbb8 3f42f645", + "3fa6d344 bd9d89ad bd9d89ad 3e0350ca 3f217251 3f9932f8 3f9932f8 -> bd9d89ad bd9d89ad 3e0350ca", + "befd7e9d 3e0c31e9 3ee7d533 3f3f4823 3f9882e4 3d3149cd 3ef35f1a -> 3e0c31e9 3f27d244 3f61bd3f", + "3e8724f1 bdc3b324 3e0dc54c bdc3b324 bc3e84fb 3f35c329 3f624d11 -> bdc3b324 3e0dc54c bdc3b324", + "3f760afd be2c1395 be2c1395 3f98384f 3f000000 3e800000 00000000 -> be2c1395 be2c1395 3d3d7540", + "3f7da645 3f864b3b 3f59e6b3 3f030d96 3f280278 bdc9c20f 3f280278 -> 3f28eee1 bdb7e668 3f030d96", + "be58908f 3f9634b3 3f1ade49 3f9634b3 3f8538c7 3f79be61 3f971361 -> 3f99cc3d 3f1ade49 3f9634b3", + "bea9f337 3ef18286 3f0bf80e 3f0bf80e 3f238d7b 3ebcaabd 3d956d1e -> 3ef18286 3f1b1def 3f343abc", + "be896cfc 3f59d717 3f07bcf3 3f07bcf3 3f947c88 3e321a02 3f6085df -> 3f59d717 3f20386f 3f07bcf3", + "3d8226b2 3f8821ec 3f7a5f5b be6b76e7 be691ae1 3ef3ba45 3cf55d15 -> 3f7b424e 3f7234a9 be6b76e7", + "3f330852 be54aa10 3df3e76a 3e8ff359 3f68a58a 3f41133f be659c20 -> be54aa10 3df3e76a bd940930", + "3f1a8c3d 3e7dbc9e 3d7b8cdc 3d7b8cdc bc07e40f bc07e40f 3f9396b1 -> 3dbedb1c 3c9e5bd4 3d7b8cdc", + "3ec43a81 3f91a8ca 3f337dc9 3f77474d 3f88bd72 3f5aae51 3e1fc200 -> 3f8e3dad 3f337dc9 3f27d062", + "3f73a948 3f08c776 3f08c776 3f251958 3ec16188 3dd72697 3dd72697 -> 3ec53ed2 3e00c2b0 3e063868", + "3f9dd87c 3f812e52 3d8f6875 3d8f6875 3f80d222 3f405702 3f405702 -> 3f80bca3 3d8f6875 3d8f6875", + "3f8f2c02 3edc7301 3f82cf1d 3f82cf1d be1111b7 3f03b0fb be1111b7 -> be568632 3ee89504 be8f26d0", + "3fa38989 3e0eeb38 3f5dac25 3e127721 3df29139 3c48f700 3f134df8 -> 3de68dce be6620dc 3e127721", + "3f660725 3f7f5e30 3f7f5e30 be213e5c 3eab7530 3eab7530 3f471954 -> 3ecde0f2 3ecde0f2 be213e5c", + "3fa0081e 3b94a1b1 3f25ccd5 3f2df8d1 3ec74adb 3f211873 3f211873 -> 3b94a1b1 3f1feb0e 3f1ddf8a", + "3ecb2052 3f682258 3f197718 3f682258 3f73b491 3f96826a 3f40ceab -> 3f682258 3f197718 3f58882f", + "3d8f25ee 3f06f145 3f94ef8a 3f06f145 3ebfbfc4 3f01ec52 3f672ae0 -> 3f043635 3f8f10f2 3f06f145", + "3f28dfd8 3f4a33c4 3f955945 3f955945 3e6ac7a3 3e59155c bcef8c48 -> 3ed71222 3f097527 3ec1700c", + "3e0334b2 3f82cd23 3eaae45c be741412 3f4b8a46 3e9ea9f0 be0c991c -> 3f7e29bd 3ea95342 be741412", + "3edfe6d6 3f94a334 3dcfd8a4 3f94a334 3f400000 3f800000 3f400000 -> 3f7b3cc7 3dcfd8a4 3f7b3cc7", + "3f547eb6 3f18a879 3edd77d6 3e90faa9 be7e5808 3f3baf69 3f89038c -> bdd6b268 3edd77d6 3e90faa9", + "3fac9547 3eb974e6 baf5c961 3eff17da 3f6a252e 3f6a252e 3f942fae -> 3eb974e6 baf5c961 3eff17da", + "3fb8f7fc be282f15 3f92b026 3f92b026 bceaf9a9 3eebe550 3ef60f92 -> be282f15 3e1f7b44 3e3cdc28", + "3e169158 3ec12ccd 3f6373e2 3ec12ccd 3f414239 3f807e8e bb42b0b9 -> 3ec12ccd 3f6373e2 3ea48c11", + "3f2ae360 3f6e018f 3ee72edd 3f6e018f 3f22c78d 3f5035a6 3f70fed5 -> 3f3bca39 3ee72edd 3f6e018f", + "3f3a77c3 3f8b015b 3f8b015b be042d3a 3ebd455c 3f441f3b 3f441f3b -> 3f107127 3f5a5d20 be042d3a", + "bd1c9eaf bccdd770 3f9866c5 3f8dbc53 3e6a58b0 bdefc83b 3e3e0753 -> bccdd770 3f9ecd49 3f923f38", + "3f96fa2e 3e04bfbd 3f93a99f 3f33bb62 be5d516c 3f377eb2 3e39e243 -> be8e7034 3f236b97 3db464f8", + "3e527d90 3e8f53a1 3f722a0c 3ed2f149 bce01a70 3e6ca689 3e6ca689 -> 3e5df8b2 3f4c8c06 3ebfe786", + "be57e874 3f8ed0fc 3f6463e8 3ee16a5e 3e5bc41e 3ed67601 3f8b2fd5 -> 3fa722fe 3f7defc0 3ee16a5e", + "3fa73d27 3f0a187c 3f90baab 3ea3f3d0 3f800000 3f400000 3e800000 -> 3f0a187c 3f221fb0 3e69f513", + "3ed7c2e5 3f36b55c 3eb4cd30 3eb4ce45 bda5fd98 3f1de747 3f5858ff -> 3ec1f084 3eb4cd30 3eb4ce45", + "3fb54078 3e271ae4 3e271ae4 be43edf7 3ec5600b 3f38e9e1 3e5cb8cc -> 3e271ae4 3e271ae4 be43edf7", + "3fbadaab 3f0a3d05 3f0a3d05 be1f494a 3f7a5a1a 3f87fdcd 3f5aadf2 -> 3f0a3d05 3f0a3d05 be1f494a", + "bd543ff3 3f24f70a be75c56b 3f20af34 3f28cf50 3f932227 3f93acd7 -> 3f24f70a be75c56b 3f20af34", + "3f13b38e 3ed6cf6f 3f9ed183 3f9ed183 3f21bc37 3ec4fa58 3f21bc37 -> 3ed6cf6f 3f3f3295 3f63b024", + "3f7db5ce be616e12 be616e12 bd1c5aea 3e800000 3f400000 3f800000 -> be616e12 be616e12 bd1c5aea", + "be12c99d 3e030c61 3e37b198 3e030c61 3f982351 bdcced6b bdcced6b -> 3e030c61 3e60b6ae 3e24858c", + "3cf0376f 3f6de728 be30ccb9 be30ccb9 3f9d4b12 3db33273 be7c2f66 -> 3f6de728 be30ccb9 be3302a0", + "bdf10e4e bca674a6 3f936ed7 3db69ca8 3d657ce8 bd9dfaa4 3f6e49ab -> bca674a6 3fa5f2cd 3db69ca8", + "3f88fc84 3db8f165 3f26c8a8 3f914b0f bd9bdb1b bd9bdb1b 3e9b907a -> bdb3c835 be023c68 3e7b5e38", + "3dfdcb0d 3f713dd7 3f8adeed 3f2646e0 3edb2c28 3f99d8a8 3e08f854 -> 3f60ed30 3f8adeed 3f15ea33", + "3f1e7cc7 be177860 3f10c38f be177860 3cfc2a11 3f2d12d5 3e8eec34 -> be177860 3f10c38f be177860", + "bd62f735 3f92eb8e 3f41556b 3e73746c 3e51c2e4 be2da55b 36c7a4e0 -> 3f999bba 3f4e73bb 3e8078ea", + "be8943e8 3f4022a2 be6cb393 3e581840 3f36a9e8 3f36a9e8 3f48fddd -> 3f42acb1 be6cb393 3e581840", + "3f3d1d22 be0d0695 3e6a7f38 3e38b274 3f660c13 3e2bd28b 3f263dfa -> be0d0695 3e3c329a 3e38b274", + "3f9072e8 3f8c164b 3f0e1fa8 be547f43 3d237469 3f3d6065 3f57be25 -> bdc3cde0 3f0e1fa8 be547f43", + "3efda8d7 3f811682 3c3747b9 3f6b21a0 3f79f561 3f7a997b 3f8177b3 -> 3f7e1ad0 3c3747b9 3f6b21a0", + "3f8ac38c 3eb9f542 3db92b6c 3eb9f542 3f98769d 3e7e751a 3f838712 -> 3eb9f542 3db92b6c 3eb9f542", + "3f748654 3f9b67d4 3f7a06b4 3d44f5d7 3f3a9b77 3e1025ef 3e331167 -> 3f402cbd 3e368448 3d44f5d7", + "bd837431 3f567943 3e95efc8 3e95efc8 3f8da5be 3e8089e7 3f8da5be -> 3f567943 3e974f63 3e95efc8", + "3f8db9c5 3f90e1dd be4606d7 3f90e1dd 3f90482a 3f90482a be65a0fe -> 3f9037af be4606d7 bebd4528", + "3f80c6a5 3e933e19 3f6c0d8e 3eaa2c9d 3e801813 bd965f6e 3c217af0 -> 3e7ff4b7 bda2bb70 3c017260", + "3f9be8a3 3dd3e66b 3f86f501 3dd3e66b 3f400000 3f400000 3f800000 -> 3dd3e66b 3f2f0308 3dd3e66b", + "3fb637b5 3e5a757e 3e5a757e bd650e08 3f35bc68 3f276b50 3f276b50 -> 3e5a757e 3e5a757e bd650e08", + "be20beb8 3f92150d 3f986e0a 3f553f37 3f000000 3f000000 3e800000 -> 3f9ef7a1 3fa64fb4 3f6cace4", + "bea03932 3f9bd23b 3f46517a 3f46517a 3f8ce7e4 3efc73ed 3f8ce7e4 -> 3fa07d21 3f5ce0e1 3f46517a", + "3fb6f718 be14c905 be14c905 3e3421b3 3e800000 00000000 3f800000 -> be14c905 be14c905 3e3421b3", + "3fa2fe1b 3ed6cf88 3f7f26e6 3ed6cf88 3f400000 3f800000 3f000000 -> 3ed6cf88 3f7f26e6 3ed6cf88", + "bd97cfe5 be0efb1c be7328dd 3f65fecb 3f3bfe7a be31f809 3f43d51f -> be0efb1c be7328dd 3f688715", + "bc338212 3ef04f72 3f592b59 3d601a91 be5e910c 3f88ecbe be5e910c -> 3ef4299a 3f592b59 3d6c502b", + "3f7b270c 3f765393 3c40e0dc 3f765393 3e800000 3f400000 3e800000 -> 3e86e7a6 3c40e0dc 3e86e7a6", + "3f74c138 3f7b7429 3d9aede5 3d9aede5 3f7d1035 3f861476 3f516c5d -> 3f7b7429 3d9aede5 3d9aede5", + "3fbe2c01 3f9c658f 3e9a28b0 3f18effa 3f80213f be36d70f 3f0f70a3 -> 3f64cce1 bed2b3c0 3f0ad3b1", + "3f480574 bbd4d30a 3dea163b 3f75d074 3f9906a7 3f9906a7 3f8fdad3 -> bbd4d30a 3dea163b 3f75d074", + "3fbb27c7 3f8b574b 3d8bb33b 3f8b574b 00000000 00000000 00000000 -> bf00cb14 bd01200e bf00cb14", + "bec9cac4 3cb6affd 3f83c670 3cb6affd 3f31bd52 3f7d1314 3d7a7ef3 -> 3cb6affd 3f85d6eb 3cb6affd", + "3f67923c be3e63a3 3eb7b35f be3e63a3 3f400000 3f400000 3f400000 -> be3e63a3 3eb7b35f be3e63a3", + "becce432 3e608166 3e608166 3f4f8556 be56e62e 3f839bd8 3f1b2c80 -> 3ec82c41 3e608166 3f647810", + "3d29a14e be64a703 3e8b8960 be64a703 3f3000cc 3f8c9f32 3f8c9f32 -> be64a703 3e8b8960 be64a703", + "3fad3cbf 3f204cb7 3ec10532 3f204cb7 3e4826f7 be3a77e4 3c8f2990 -> 3d311df0 bec266b2 be4a63e8", + "3f7e208c 3f126f1b 3f126f1b 3db0535c 3ddca1b0 3f28de18 3ed9f27d -> 3de3967c 3f126f1b 3db0535c", + "3fa4a01e 3eac9410 be2bd4d7 be2bd4d7 3f195ec0 3dc553f4 be317f78 -> 3eac9410 be2bd4d7 be331e8c", + "3f6f737d 3ea077a7 3ec846cc 3f5448b0 be4dc68e 3f0d308f 3f5c7f5b -> be2bba18 3ec846cc 3f5448b0", + "3f8194ba be598fef bda5f790 bdc840cd 3f694c73 bd0ab7fa 3e44b93b -> be598fef bda5f790 bdc840cd", + "3faa50a5 3f788994 3f6f528a bd6cc17b 3e800000 3e800000 3e800000 -> 3c3fa600 3cc14ea0 bd6cc17b", + "bbc9a10f 3f8772cf 3f9e625b 3f9e625b 3f5f8c17 be224f09 be224f09 -> 3f87981a 3f9f7bce 3f9f7bce", + "3f66107e 3d87e5ea 3efbcc50 3ecc9c2d 3f80e8a0 3d5303f7 be0ea3f9 -> 3d87e5ea 3dc4dbb4 bdad764c", + "3e1ceac1 be330b6d 3f1d5c5e 3f1d5c5e 3f7a8a97 3f5f5d5a 3f1a4ba1 -> be330b6d 3f1d5c5e 3f1ce41d", + "3f9400bd bc53f4ee 3e322dc5 3f3ede95 3e32183b 3f3ef05f 3f44c1f5 -> bc53f4ee 3e322dc5 3f3ede95", + "3fa6d1ff 3e088fb3 3ea1449b 3ea1449b 3f27628f 3e4b2626 3f27628f -> 3e088fb3 3e26f0e0 3ea1449b", + "3eed5285 3f72aa37 3f72aa37 3ea3ef58 be15b29c 3e9f72fe 3c0fcff8 -> 3ee1acfa 3f272387 3e340fd3", + "3efe839e 3f8dc562 3f8dc562 3f8099e4 3f9db0ab 3db701c8 3db701c8 -> 3f8dc562 3f19f726 3f0cb818", + "3e6a225d bddb9355 be40ea20 be40ea20 3f53ee10 3e7dc54b 3f179dc2 -> bddb9355 be40ea20 be40ea20", + "3f57d936 3f7e71f8 be554082 3f7e71f8 3ee1cecc bdced887 3f69ce23 -> 3f071a7f be554082 3f6d0add", + "3e2b7a5c 3f8720c8 3f8720c8 3f417974 3e3c7a42 be26b6d9 be26b6d9 -> 3f68e3ce 3f5a0515 3f1a1890", + "3fb429e0 3f006b06 3f1cb198 3f3d3748 bd9488fb 3e3ac0c7 3bd90b34 -> be9cef48 3bedd200 be9572c0", + "3f732fb8 3f49bcb8 3e44625f 3de4adad 3f09e28f 3f6e3e23 3f6e3e23 -> 3f0d14bc 3e44625f 3de4adad", + "3ece8d4b 3f69a200 3f0cf902 3ec018c5 3eb613c5 be005010 3d975fb4 -> 3f301b72 3e8e5206 3e81de1d", + "3f493e4e 3e4894a9 3c63528e 3c63528e 3f5629bb 3f726886 3f726886 -> 3e4894a9 3c63528e 3c63528e", + "3f189c93 be4459d1 3f99d4c9 3f99d4c9 3f0f1ed8 3f5f5ff8 3f25269e -> be4459d1 3f80b529 3f5eb4a8", + "3fa41b00 3ec2654b 3ec2654b 3f8a1796 3f800000 3f800000 3f800000 -> 3ec2654b 3ec2654b 3f7a4e7a", + "3f1bf8af 3f7a3ed7 3f7a3ed7 3f80bf88 3f176372 3f774b25 3f176372 -> 3f3e03f9 3f78726c 3f40d944", + "befac50f 3eb71cad be7fe13a 3eb71cad 3f96effb 3f9bbe61 3ece9bf5 -> 3eb71cad be7fe13a 3eb71cad", + "3fb139ef bd82b28a 3f291666 3f867873 3f96f555 be447e2f be6ae584 -> bd82b28a bf050af6 bf38bce0", + "be16adeb 3f1c6e14 3f7523a2 3f196218 3f800000 00000000 3f000000 -> 3f1c6e14 3f8c9afe 3f1d1e46", + "3d9bc50b 3d8a4375 3d8a4375 3f3122c9 bd000781 3d2b03f5 3bc11dcb -> 3d75c1b6 3d86403d 3f23c71d", + "3f614fac 3f186229 3f4b3901 3f186229 3f000000 3f000000 3f000000 -> 3f02ec4c 3f09047e 3f02ec4c", + "be1bfa4c 3edb604d 3e2bc6bb 3e2bc6bb 3f73a253 3f0a232c 3f0a232c -> 3edb604d 3e2bc6bb 3e2bc6bb", + "3f0d4293 be27e273 bd8d9901 be27e273 be407fe5 3f88c1fd 3f88c1fd -> be357792 bd8d9901 be27e273", + "3f12d373 3f7fa35f 3f4a70a1 3f7fa35f 3ebf4748 3f82e9b8 3f82fa50 -> 3f23df5e 3f4a70a1 3f7fa35f", + "3f1fffba 3f254cdb 3f3f0fa5 3ceac351 3f9c6cb9 be0a1bf9 3e0cf80b -> 3f254cdb 3e4846f4 3ceac351", + "3f6ecb40 3f1b0dec 3f1b0dec 3f9c290b 3f23ce2f 3f92fdf7 3efa1174 -> 3f1b0dec 3f1b0dec 3f099f30", + "beb3941f 3d7c059d 3f59ac50 3f59ac50 3f8dfe23 3f8dfe23 3f3dd01f -> 3d7c059d 3f59ac50 3f6371da", + "3fa6316f 3f3383d8 3f3383d8 3e9128f5 3f113914 bda72ba7 3f47fa1b -> 3f06fda4 bea1643c 3e9128f5", + "3dbb6968 3e1010f9 3e64dc89 3e1010f9 3ebd6e14 3f35e00a 3f7c0389 -> 3e1010f9 3e64dc89 3e1010f9", + "3e10fbd2 3cae11bd 3eeac1d5 bb8b0473 3ee09e8c 3f570857 3f8b28b9 -> 3cae11bd 3eeac1d5 bb8b0473", + "3f8486fa 3f5f52a6 3f97011e 3d429178 3f6d4b4b 3f5eaf50 3e8cd92a -> 3f5f52a6 3f5be113 3d429178", + "3c190443 3f3ed7db 3d8710f3 3f1e4f5a 3e50dee9 3f9e07ce bd406e96 -> 3f3d8c6b 3d8710f3 3f1cb818", + "3eae6b33 3f1abf0f 3f7f3f9e 3f1abf0f 3f400000 3f400000 00000000 -> 3f1abf0f 3f69b3c1 3ecc0f75", + "bd95968f 3f9600c1 3f1f3c75 3f1f3c75 bdc88dfb 3f41e8fc bdc88dfb -> 3fa1dff7 3f1f3c75 3f2cb2b2", + "3d081ab1 3f17067f 3f541c34 3f541c34 bdae38af be1f2b07 3ea18bcd -> 3f11488b 3f4bbd65 3f4fbefb", + "3fb33666 3eb3c50b 3f190761 3f190761 3e30067d 3f4eb899 bc60874c -> 3dcd3420 3f190761 be8446d8", + "3f61a13e 3f3be53b 3f3be53b 3ea6d874 be41e0cf 3e85f69c be41e0cf -> bda36e20 3ea2a6f3 be034a76", + "bebeb436 bd179ee7 3e1852c3 be4abd82 3ee155a7 3f85c721 3f85c721 -> bd179ee7 3e1852c3 be4abd82", + "3eeaee54 3f6b40a5 3f6b40a5 be0e1bd1 3e800000 3f000000 3f000000 -> 3f1cac62 3f3a0a2d be0e1bd1", + "3f98446e 3f08d7f0 3f1c42b7 be70fe51 3f57b166 3f86920a 3f5fa33f -> 3f08d7f0 3f1c42b7 be70fe51", + "bea159cf 3aa3f3e0 3f27586f 3aa3f3e0 3e87041b 3e87041b be577213 -> 3aa3f3e0 3f46cedc 3d8b28ce", + "3f94d360 3f0a3086 3f9fc1cb 3f0a3086 3efefa38 3ee4a0d1 3f4e5bb3 -> 3efb7ecf 3ea1db1a 3f0a3086", + "3e9835ab 3f3290b4 3f6c8197 3f7dc2d9 3e800000 3f400000 3f400000 -> 3f1081bc 3f5f4674 3f6b6687", + "bece331d 3f437f0e 3e93de3c 3f437f0e be56e191 3eba2e01 3f98f4c1 -> 3f93ee9f 3e93de3c 3f437f0e", + "3e4c254d 3f86dbaf 3ec3628c 3f172742 3eda78be 3ec60e88 3ec3af22 -> 3f6db905 3ec3628c 3f0c8671", + "3e978098 3f9569be 3e8fb98e 3f0c0c6e 3f520e53 bd8d7684 3f0616ec -> 3f884785 3e35767a 3f0a4907", + "3f32dbff 3f5ddcc0 be5f6ae3 3f5ddcc0 3ec6cef3 be3cc16f be3cc16f -> 3f084df8 be5f6ae3 3e0789b0", + "bd96f606 3f62922e 3de43650 3f5a4a49 3e9da57f 3e9da57f 3f3ef59d -> 3f6d7633 3de43650 3f5c4e05", + "3f020918 3f8684f5 3f4b9054 3f8ab666 3e10cf89 3ea3e8c0 3f38f45d -> 3f16c4f4 3f0dcad0 3f66745b", + "3f30b899 be71f3de 3ece37d7 3ece37d7 3f97d862 3f97d862 3e9c9aaf -> be71f3de 3ece37d7 3eabf805", + "3f917e81 3f377157 3f377157 3f77497e 3e659285 be69f2d3 3e659285 -> 3e20a974 beb71ada 3dfb8478", + "3fbd0204 3f590f86 3ee29787 3e9bb358 3f152fa0 3cedc610 be7d6169 -> 3ee9abb6 be2c1c4a bf02a46a", + "bd148da9 3d02c8f6 3f8f2f96 3f5ca6aa 3f667886 3f667886 3f0ae501 -> 3d02c8f6 3f903318 3f5f9dbd", + "3f857889 3d667c56 3ed70d7e 3f5b5f98 3f4e4fc2 3f4e4fc2 3f26b046 -> 3d667c56 3ed70d7e 3f246fd0", + "3f46304a 3e38e440 3ef8c05b 3e38e440 3f6914d9 3f6914d9 bde19637 -> 3e38e440 3ef8c05b bd364620", + "3fa37fc8 3ee00c70 3f8f8fb9 be2e77e0 3f8f1c77 be332ed5 3e188c18 -> 3ee00c70 bf08d95c be2e77e0", + "3f4eb3db bddd6687 bddd6687 3f8292e4 3f899a54 3eeee07b 3f899a54 -> bddd6687 bddd6687 3f8292e4", + "3f4dcc40 3f1a76cc 3eaed0db 3e65b769 3f400000 3f800000 3f800000 -> 3f1a76cc 3eaed0db 3e65b769", + "3fa2f77e 3e9a61a2 3e9a61a2 3f0791ac be655ee6 3ef729fc 3f7f21ba -> bebc303c 3e9a61a2 3f0791ac", + "3f7f7cb1 3ddd76a4 3d1bad07 3e8ca48e 3f22258c 3f837af6 3f22258c -> 3ddd76a4 3d1bad07 3e8ca48e", + "3f92ec7e 3f5c99b7 3bf29bcb 3d89de90 be28bc93 be0879cf be28bc93 -> bea211d2 be1dc608 be4bdfdc", + "bdb81c42 3f17d992 3f990b5d 3ec7a6c6 3d1299a3 3f89902f 3e7cbabe -> 3f24ad59 3f9a6fa5 3ece3d61", + "bee584d6 3f7b2fbc 3f82deec 3f4316e3 bd70617b 3f54cc3e bd70617b -> 3fb942f0 3f8dd74d 3f90a3ae", + "3f23d64c bdb0bd3b bdb0bd3b be0b6205 3f0b266d 3e69541e 3f9aea5f -> bdb0bd3b bdb0bd3b be0b6205", + "be70822a 3c5b0678 3dad2a99 3f34c409 3f87ff8c 3f099a47 3f87ff8c -> 3c5b0678 3dad2a99 3f34c409", + "3f9d0798 3f54d0b4 3c1e110c be63ab1e bd9a394e 3e8482c8 3f66c98f -> be8fd4b0 3c1e110c be63ab1e", + "3e50ee24 3eece7e6 3f683261 3f683261 3f400000 3f000000 3f000000 -> 3eece7e6 3f52efea 3f52efea", + "beec48fa be3b65f2 3eff791b 3ebf0eb8 3f800000 00000000 3f400000 -> be3b65f2 3f3aafac 3ebf0eb8", + "3f01bebd 3f8469b3 3f998c55 3f8469b3 be046a96 3f8aea55 3f4c08a5 -> 3ee3a8ee 3f9221cc 3f6a03ef", + "3e95f24c 3d6ae954 3efed641 3efed641 3f0d605d 3f0d605d bda50bf9 -> 3d6ae954 3efed641 3ea81ec8", + "3f4815a7 3f412b41 3e9f11dd 3e9f11dd 3e06cd1c 3f4bb40d 3f4bb40d -> 3e891012 3e9f11dd 3e9f11dd", + "3dab8c0a 3e7a1c77 3e8954a2 3e7a1c77 be3fb36f 3f8f2c0d 3f113255 -> 3e551a85 3e8954a2 3e7a1c77", + "3e6cec2e 3f856793 3f9c7a1c 3f856793 3e9c6e6a 3eb125fe 3f8cf269 -> 3f5f2ca2 3f828508 3f856793", + "3fb67ec3 3f6741e1 bdb96325 3f6741e1 3ef862c3 3f9d1bda 3f80bba7 -> 3e9d38c8 bdb96325 3f6741e1", + "3fbdc84a 3d1f0961 bdb4ee56 3d1f0961 3e7a94b3 3e942f23 3f90a13b -> 3d1f0961 bdb4ee56 3d1f0961", + "3fa33199 3ee6f898 be1d7b80 be1d7b80 3e1cc5cb 3ebdacb5 3e1cc5cb -> 3d91bb60 be1d7b80 be1d7b80", + "3f032b7e 3f8a900b 3e463187 3f7d15ab 00000000 3f400000 3f800000 -> 3f072196 3e463187 3f7d15ab", + "3f8a0a7d 3f95c78c 3ccbc6a9 bdfe24b5 3f917e4b 3d82956a 3ef69b45 -> 3f912838 3ccbc6a9 bdfe24b5", + "3f4e880a 3f20e4b4 3f061f86 3f20e4b4 bd29560c bd29560c 3f2bd6ab -> 3db46ac0 3d8b0874 3f20e4b4", + "3e8e744f 3f36e869 3f7e1227 3f7e1227 3f68bb0c 3e8fc3ca 3f9359a2 -> 3f36e869 3f4b6162 3f7e1227", + "beb2ec57 3f3c86e2 3f224c30 3ead3171 3ea584ba 3f24bb7c 3f24bb7c -> 3f617d07 3f224c30 3ead3171", + "3f6536ff 3eee90b6 3e7ea637 3e7ea637 3f438d03 3f137227 be5ca035 -> 3eee90b6 3e7ea637 be2ae5e1", + "3ec09010 3f1b283c 3e1788b7 bd9b8fc2 3f09eab4 3f09eab4 bd5e2a81 -> 3f14ac4f 3e1788b7 bd9b8fc2", + "3ca96c67 3e1fb9bb 3e1fb9bb 3f6fb444 3edb54b3 3e65bdd1 3efa9f2f -> 3e1fb9bb 3e1fb9bb 3f6d569d", + "be35bdc4 3f18befb 3f30b142 3f18befb 3f800000 3f800000 00000000 -> 3f18befb 3f30b142 3f33db0b", + "3f204fba bdea0bfc 3ead6c73 3f9bc5bb bdd779f3 3df5ab4a 3f1d1709 -> bdea0bfc 3e4e911a 3f56d298", + "beb532ee 3f93053c 3f17f4e5 3c5df931 3f7c3d29 3f7fc735 3e9c9458 -> 3f9a6ada 3f17f4e5 3c5df931", + "3e39f4ca 3f15b821 3f15b821 3f82ae39 3f07cd66 3f07cd66 3f9d89ce -> 3f133125 3f133125 3f82ae39", + "3dae9c72 3dcaeb85 3f9c38ee 3f9c38ee 3f675986 3d022c84 3f1e1d8d -> 3dcaeb85 3f8f3ff3 3f95a4b4", + "3d5d8be8 bdfc6a09 3eb8c84a 3eb8c84a 3eb5f6b7 be603e00 3f2d9d4c -> bdfc6a09 3ea8b92b 3eb8c84a", + "3f406b34 3f6adad4 3f610b02 bd6a7332 3f000000 3f800000 3e800000 -> 3f1a89f6 3f610b02 bd6a7332", + "3f8057ab 3e23b072 3f487332 3e23b072 3f66b6ff 3f2c2151 3f3adac0 -> 3e23b072 3f2c0dec 3e23b072", + "3f6feb41 3e842e9c be53e79b 3ebc81ca 3f021544 3f921996 3f021544 -> 3e842e9c be53e79b 3ebc81ca", + "3da4b96d 3d904089 3ead6e59 3d904089 be3258d8 3edcdc0c 3edcdc0c -> 3d4feb91 3ead6e59 3d904089", + "3f8426ef be6476b9 3f106f1a 3f106f1a 3f81c51e 3f4c6be5 3f401f80 -> be6476b9 3f106f1a 3f106f1a", + "3fb26da8 3e886dce 3d643772 3e886dce 3e414b23 3e414b23 3e2bd7da -> 3e21f28a 3d643772 3e040bd8", + "3f070646 be22fe72 3f7b8397 be22fe72 be7cf5be 3f4e4643 3f9883e5 -> be527210 3f63a724 be22fe72", + "3ee62231 3f8c3df8 3f27087a 3ec51266 3f1c7527 3dbb2c0f 3f45328d -> 3f60bc9c 3eccf15a 3ec51266", + "3f23af96 3f2e14c4 3e832fe5 3e832fe5 3f3272a3 3ebc4408 3f3272a3 -> 3f2e14c4 3e832fe5 3e832fe5", + "3f7eba3d 3f39c406 3f59b647 be4cac87 3f6d0093 bdb85527 bdb85527 -> 3f39c406 bdaec248 be4cac87", + "3e778e11 3f31fa9f 3f1c2ab7 3f1c2ab7 3f0301dd 3c160f35 3f0301dd -> 3f269f9a 3eedf5b6 3f16159f", + "3ec794be 3de3880d 3e07905f 3db3fd65 be20afc1 3f129d82 be20afc1 -> 3bd90960 3e07905f bbf71de0", + "bea4aacd 3f8f7466 3f9bd37d 3f9bd37d 3f400000 3e800000 3f000000 -> 3f9eb783 3fc3a68a 3fb95bdd", + "3faa452e 3ed46649 3e602ec4 3e602ec4 3e7b7b3e 3f94b3a8 3e7b7b3e -> 3e423ee2 3e602ec4 3e602ec4", + "3f239d21 bd66e81f 3f914b88 3f914b88 3f9b08e8 3f9b08e8 3e0b8af8 -> bd66e81f 3f914b88 3efe549a", + "be7ecc17 3db9c193 3f8c1fac be7939f8 3f800000 3e800000 00000000 -> 3db9c193 3fa70714 be7939f8", + "3f9b73a9 bc047246 bc047246 3ecd41da 3e88dbf4 3f8e830b 3e743f17 -> bc047246 bc047246 3e509661", + "3f85be55 3f4de46b 3db4cf39 3ec1f814 00000000 3e800000 3f400000 -> bd13d140 3db4cf39 3ec1f814", + "3f1d3a51 3f9c1272 3f9c1272 3edd93b8 3e800000 3e800000 3f800000 -> 3f1fbdbd 3f1fbdbd 3edd93b8", + "3eb15f90 3f53e4f5 3f56e29e 3eb096dd 3eb9ad75 3f1fecfc 3eb9ad75 -> 3f2aa651 3f43d872 3eb096dd", + "be2b93c7 3e819682 3f155078 3ede9ead 3f6bc404 3f6bc404 3e9bf918 -> 3e819682 3f155078 3ee9c972", + "3f70367a 3f9634ec 3ef7a617 be0ffb19 3e2d0784 3e2d0784 3f0b8668 -> 3e6c769c 3e40e73a be0ffb19", + "3fbdc079 3f835ca3 3f1f3211 bddfb20c 3daa1d69 3d2829f1 3f35fdd1 -> bebe72e4 be74e244 bddfb20c", + "be3a4cbc 3f3c4f87 3f8b66d9 3f383137 bdc8ed22 bdc8ed22 3f9a54c6 -> 3f6323da 3fa70c5c 3f383137", + "3f33952d 3dd2aa5a 3f464f4e 3d9cbbfd 3e2b5e8e 3f825a8e 3f1a7784 -> 3dd2aa5a 3f464f4e 3d9cbbfd", + "3fb77f97 3f1daba7 3f1daba7 3f5eda2d 3f55dd49 3f9484c4 3f55dd49 -> 3f1daba7 3f1daba7 3f51f7aa", + "bdbeaa27 3f518e76 3f518e76 bafd2940 3f5459e4 3f9b01fc 3f9b01fc -> 3f518e76 3f518e76 bafd2940", + "bc12d9d1 3f697149 3ebfe5d3 3eade028 3e6c432b 3f74d67d 3ed8cd0c -> 3f6b0167 3ebfe5d3 3eade028", + "3f2b061e 3f3cd210 3ee2119c 3f5a6740 3f91093c 3f89ad64 be462178 -> 3f3cd210 3ee2119c 3e1d9f28", + "3fb0db58 3e81a48e 3ead0fe5 3f614165 3f0c5084 3e8333d8 3e8333d8 -> 3e81a48e 3e667330 3c953100", + "3f4ec165 3f7d9ec0 bd3d2c22 bd3d2c22 3dcea439 3f99fc30 3f394abb -> 3e8b4be2 bd3d2c22 bd3d2c22", + "3e1d1b8f 3e3e46ef be3efaa1 be3efaa1 3d3292be bde853be 3f2cfcc6 -> 3e27eee3 be3efaa1 be3efaa1", + "3f300634 3dde0d35 3f67a0a3 3f55773a 3f462a3a 3ebd8d23 3f464f8d -> 3dde0d35 3f098766 3f4b0b95", + "be9b282a 3f4568d6 3f12107a 3f2f5ce8 3ec2dcf6 3ec2dcf6 3f8e03cc -> 3f63b4f8 3f20cd55 3f2f5ce8", + "3e842247 be07847a bdb5e0b2 be07847a 3f400000 3f000000 3f400000 -> be07847a bdb5e0b2 be07847a", + "3f8149d1 bc1bd2bf 3f90b660 3edafabf 3e667af2 3dc7fa89 3f53bfe4 -> bc1bd2bf 3db2afc0 3edafabf", + "be3f7113 3e1a8e11 3e97dc25 3ee59c7d 3e216879 3d4a1f72 3f41e610 -> 3e1a8e11 3eaf8704 3ee59c7d", + "3fa8962b 3f150fd8 3f150fd8 3f8ec180 3ee2faf7 3f6b4506 3efdc360 -> 3ecc6c06 3f150fd8 3e992a5a", + "3eddcdfa 3f3cc48f be135dd5 be135dd5 3e5d2da6 3f8ffbca be489675 -> 3f02f212 be135dd5 be2a6c2f", + "be942aa6 3e8f657a 3f9fd6d8 3f84f4d5 be59afe5 3f5b56fa be59afe5 -> 3ed8643e 3fae5b8e 3fb34e8d", + "3f847733 3ee92f3f 3ee92f3f 3df67684 3dcea3de 3ebdf59e 3dcea3de -> 3db54ee8 3ebc7390 3dcd4033", + "3f4aef26 3f8ed755 3f58258b 3f0bfc3b 3e8c0a4e 3e8c0a4e bd43ce07 -> 3ee572e2 3ec89ef4 3d9a87c0", + "3faf3ae9 3ead8672 3eca8222 3f82b302 3f9020e7 be485ba7 3f3af4aa -> 3ead8672 bed3ddc0 3f1f7cc8", + "3fb06663 3f10c8a2 3b8890f3 3f2c76a5 3f9c931e 3f452188 3f0ca4a3 -> 3f10c8a2 3b8890f3 3f009c6e", + "3f98a728 3ef62cac 3eee9f52 3f17eb54 3b63b468 be20dbf0 3f819ffe -> bdb52af0 be8de11c 3f17eb54", + "bea8b212 3e8d0c89 3f9e57b1 3e60000f 3f075501 3efe722e 3f075501 -> 3e8d0c89 3fbd8e0c 3e60000f", + "3f372433 3caa101c 3f321514 3caa101c 3f19752f 3f19752f 3f684356 -> 3caa101c 3f20774c 3caa101c", + "3fb834a9 3f2cf628 3eb7745f 3eb7745f 3e3996d6 bdcb6104 bd8c5eb4 -> bd12d8e0 be99ba2b be830edb", + "3ec442dd be3a01c0 3f776dc5 be3a01c0 bdd18227 bdd18227 3f83ce42 -> be3a01c0 3f0e8b8a be3a01c0", + "bcd5f9e4 3f8bba9a 3f8bba9a 3f659ea5 3d4d8bd1 be518a54 3f9fb97f -> 3f8f35fc 3f901014 3f659ea5", + "3f30bf7c 3f8c3a55 be4d4971 3f8c3a55 3f6a923f 3f6a923f 3f34a775 -> 3f78c6ae be4d4971 3f538cef", + "3f73b519 bdc9e2ac 3e8442b1 3e8442b1 3ec9f479 3f7c0451 3ec9f479 -> bdc9e2ac 3e8442b1 3e8442b1", + "3e3f1af2 3d4fd8c6 3f6bc7ec bdd56330 3f9eaac4 3f4f851b 3e8e80fa -> 3d4fd8c6 3f6681b7 bdd56330", + "3d9b2186 3f5e492d 3f47dff1 3eb7efab 3d1c2d6f bda0d203 3f8bf4ec -> 3f4e3008 3f373648 3eb7efab", + "3eb939f8 3e05c230 3e05c230 3ebf6fca 3f3c7859 3f63aaf8 3f63aaf8 -> 3e05c230 3e05c230 3ebf6fca", + "3f5cf8f2 be039e93 3f641ebd 3ef89d11 3f5c24f0 3e722e1a 3e722e1a -> be039e93 3ea6f28c 3e8a89e3", + "3f49a8e3 bddb073b 3f8bcece bddb073b 3f9ff075 3e322293 3f0702b9 -> bddb073b 3ebcde20 bddb073b", + "3f080608 3d595e91 3e8b6130 3f674e61 3f274bfd 3e80d5d0 3f387c7a -> 3d595e91 3e85c6e5 3f4e6dc4", + "3cbda2fb 3e8ed76d 3f7cb39c 3c63def6 3f7b7b49 3f5a2bc1 3f380867 -> 3e8ed76d 3f7be6fa 3c63def6", + "3e82de74 3edc1497 3e520a6b 3f9106f9 3f800000 00000000 3f800000 -> 3edc1497 3e1c5a84 3f8cacce", + "3f5d2c75 be01fb06 be01fb06 bdc3a38d 3f34b074 3f34b074 bd9cecac -> be01fb06 be01fb06 bdc3a38d", + "3f1dcfea 3f8586e2 3f86bbea 3f8586e2 3f2a1ab4 3ee6077c 3e29695f -> 3f4f49f6 3f2e4132 3f00893c", + "3ad8012a 3dbfe643 3dbfe643 3f162a71 3f347e87 3ea1437a 3f347e87 -> 3dbfe643 3dbfe643 3f162a71", + "3f09ebdc 3eaa1530 3f3e2b7e 3ccc6cab 3e9fbafa 3e9fbafa bdd79dbf -> 3ea4815f 3f02be1f bd392f0e", + "3ec136b1 3f5deec3 3f8ffb11 3f5deec3 3f76053c 3ce7bd45 3e76fee2 -> 3f5deec3 3f3606b4 3f217bec", + "be4c0a3b 3cb8c06a 3f3ae598 3cb8c06a 3f47afc3 3f623649 3f566437 -> 3cb8c06a 3f3ae598 3cb8c06a", + "3d5d7e20 3f95cab4 3f7dc515 3f7dc515 bc1db357 bc1db357 3e0b5699 -> 3f8da009 3f6fe9f6 3f71ee4c", + "3f897ea5 bdedb44b 3f73ed8d 3f73ed8d 3f25e1b6 3f25e1b6 bd9c846c -> bdedb44b 3f2017a8 be1c707c", + "becca5b2 be770c41 3df1e835 3df1e835 3f1950a1 3f257565 3e979c82 -> be770c41 3df1e835 3df1e835", + "3e65a6c7 3f91394b 3f91394b bcd1a48b 3f4dfaff 3f4dfaff 3f74a303 -> 3f87c08b 3f87c08b bcd1a48b", + "3fb99c68 3e1b59a1 bdb64761 3f2769b6 3f400000 3f800000 3e800000 -> 3e1b59a1 bdb64761 3d8ba480", + "3f6e751b 3f3b8f39 3f3b8f39 3f2e7dea 3f9e725b 3f1d2526 3f1d2526 -> 3f3b8f39 3f1f3ab2 3f1e5574", + "be1a668e be2249d4 3f0b8211 3ebd3d92 3e881862 3f9af14b 3f02c55b -> be2249d4 3f0b8211 3ebd3d92", + "be1711d3 3f7cc0d6 3f22fbfc 3f51c0a8 3f517a26 3f8830d7 3f517a26 -> 3f8191a2 3f22fbfc 3f51cb0f", + "bef6562f 3e7b40e4 3e5ed03e 3ec5e5a7 3cccd339 3f83af27 3cccd339 -> 3eb3e8ef 3e5ed03e 3f0f79c7", + "3f3898c8 3f074fd1 3f074fd1 3f9fffdd 3f0373ba 3f0373ba 3f08e907 -> 3f048753 3f048753 3f3bfa25", + "3f7a0013 3f1409de 3f9ed6eb 3f9c02b4 3f6c6c94 3e606f0a 3f1c7e35 -> 3f1409de 3e78f46c 3f202355", + "3f6306e9 bd834706 bdd6d7c9 3f851a8f 3f992c86 3ef52107 3e48655e -> bd834706 bdd6d7c9 3e951d50", + "3e8ea8da 3f75d7b5 3f9dbfe6 3f9dbfe6 3d3128cd bd4d4dc2 3f8c20f0 -> 3f346d9a 3f60040a 3f98d700", + "3f7f57ac 3f829bf0 3f40b010 3f1426bc 3f02a693 3e111fd4 3f88e7ca -> 3f02fc6d 3e12bb34 3f1426bc", + "3d939a6d 3f80a66a be3b578a bd13c845 bcd3743b 3f886efe 3f886efe -> 3f6e479e be3b578a bd13c845", + "bedbd18c 3f06f6ed bda37202 3ec99e71 3da06c40 3f5731f7 3f5731f7 -> 3f384cca bda37202 3ec99e71", + "bdc8675f 3f3f602c 3f1b2cef 3f570162 3f47595c 3f47595c 3cb37152 -> 3f3f602c 3f1b2cef 3f6b7ee6", + "be86c318 3f7bd55c bdbf7bd2 bd8e2468 3f86652b 3e84bd6e 3e84bd6e -> 3f7bd55c bdbf7bd2 bd8e2468", + "3c786879 3f25ac13 3e90426f 3e90426f 3f000000 3e800000 3f400000 -> 3f2519db 3e900353 3e90426f", + "3f3b42b4 be79893d 3e7049e4 be79893d 3e6aecfe 3edb37bc 3f266993 -> be79893d 3e7049e4 be79893d", + "becd3e9b 3f1b28c8 3f1b28c8 3dfba1f8 3eb78994 3eb78994 3f5e2b14 -> 3f349212 3f349212 3dfba1f8", + "3f33db26 3cf367ac 3f1a7565 3ebc38cb 3ea29e6f 3e842e0b 3e842e0b -> 3cf367ac 3eb8bf84 3e94d94d", + "3e1aba73 3ea529b0 3f88243c 3f81a6f1 3e800000 3e800000 3e800000 -> 3e9f8c27 3f70cfa5 3f65cb1c", + "3f964d58 3f2dde1a 3e83cfc3 3e83cfc3 bdeea561 3f8a01b8 3e637037 -> be82a4f8 3e83cfc3 3e5d2238", + "3fa89b1c bcad2298 3f78cbe0 bcad2298 bd812b58 3f95d47a 3f048234 -> bd9c6a43 3f78cbe0 bcad2298", + "3eaf4e87 3f664e99 bdddc68f 3f1e6b72 3f23ee8f 3f9f1943 3f23ee8f -> 3f4f9498 bdddc68f 3f1e6b72", + "3f840cf0 3edc7265 3edc7265 bd1431d1 3f027b59 3f027b59 3f110225 -> 3edc7265 3edc7265 bd1431d1", + "3f5b2561 be584dd1 3f31c97f be584dd1 3cc05187 bd68caad bd68caad -> be584dd1 3d523b40 be584dd1", + "bef9096a 3f19b2e6 3f19b2e6 3eb0e0be 3f800000 3f800000 3f000000 -> 3f19b2e6 3f19b2e6 3eb0e0be", + "3f70d785 3ee760f4 3e2b807a 3ee760f4 3f813009 3f1bc117 3f7a0a66 -> 3ee760f4 3e2b807a 3ee760f4", + "bd1331f2 3f2bf415 be646f8e be580ea6 bd121a79 3f34d3ae 3f3d0eb5 -> 3f327602 be646f8e be580ea6", + "bc6d317d 3e30a2d6 3f142f14 3e30a2d6 be2d2753 3f348837 be79165a -> 3e35b335 3f142f14 3e36cca1", + "3fadb477 bdbcfeed 3f4f1ab0 bdbcfeed be565d71 3f9030ad be565d71 -> be80953d 3f4f1ab0 be80953d", + "bdb4635a 3c065ba3 3f5f45e6 bcf86f1d 3f2b85cd 3f2b85cd 3f8a8f1d -> 3c065ba3 3f63d4cb bcf86f1d", + "3f317d6c 3f27b512 3f27b512 3e9e472b 3f9540c6 3eec3814 3f82b833 -> 3f27b512 3f0551f7 3e9e472b", + "3ebcd043 3f39c013 3f466106 bde3cde4 3f3fc169 bce2b75a 3d5dc101 -> 3f39c013 3ef537b0 bde3cde4", + "be29bce7 bdb80e15 3dc98891 be6c0010 3f847ae0 3f847ae0 3de5dc3a -> bdb80e15 3dc98891 be6c0010", + "3f7813ba 3b768f05 3f1bf229 3b768f05 3f9172c2 3f8c37ac 3f65b66b -> 3b768f05 3f1bf229 3b768f05", + "3f6de553 3d8f15f7 3f308f1b 3d8f15f7 3d346671 3d346671 3e240a1e -> 3d3be15a 3db7b5e8 3d8f15f7", + "3f864c9f 3f6fdb94 3f6fdb94 3ce549d6 3e800000 3f800000 3e800000 -> 3e5d61c0 3f6fdb94 3ce549d6", + "becffba3 3f01f267 3ec27a3d 3f01f267 3f6b397a 3f4855c6 3f368874 -> 3f01f267 3ec27a3d 3f01f267", + "be9e4842 3f00af63 bd9433e3 bd9433e3 3d8da551 3d8da551 3f9f4cc0 -> 3f22fe6c bd9433e3 bd9433e3", + "3fa2f9ce 3f9e8cca 3f62aafe 3f730c5f be4bd6b1 3f896afc 3f896afc -> bf178808 3f62aafe 3f730c5f", + "be265a60 3f73f7b6 3e5a04bf 3f73f7b6 3f306133 3ed5b027 3f6b89c2 -> 3f7ef293 3e5a04bf 3f755648", + "bec082e6 3ea7e61d 3f5d5524 3f5d5524 3f5e1412 3f40149e 3f465931 -> 3ea7e61d 3f6854d1 3f65f97f", + "3f9225a3 be026db2 be026db2 3d6ee94d 3f40ef3e 3e8c3541 3ec5db0a -> be026db2 be026db2 3d6ee94d", + "be6004fc 3f7e6ef5 3f826c1d 3ed43fa3 3f000000 00000000 3f800000 -> 3f8d0bec 3f9ef466 3ed43fa3", + "3fbc8da5 3f9566da 3f35f085 3f5e235d 3f8164c2 3e8c78fb bdf2a312 -> 3f6fdb45 3d8b23f0 bf15c3e5", + "becf0b8c 3f3e8b2b 3e57cab3 be308951 3f800000 3f000000 3f800000 -> 3f3e8b2b 3e57cab3 be308951", + "3ee80365 3f5fb7c3 3e9b3067 3e9b3067 3f84e387 3ec5cfb6 3f142f90 -> 3f5fb7c3 3e9b3067 3e9b3067", + "3d9203f5 3f835281 3f835281 bcd9bfad be47fb8c 3f313a4e 3f43ff83 -> 3f705ab8 3f8046fe bcd9bfad", + "bedfe822 3da953a5 3f942df5 3da953a5 3f9e4b3e be2077b6 3d63f016 -> 3da953a5 3fddc0c4 3dc18924", + "3f58f924 3f8bf123 3f8bf123 3f5d437e 3eae76f8 3f044f36 3f044f36 -> 3ee9341c 3f1ace92 3f11decf", + "be438f53 3efb4012 3f544b07 be74b56c 3f73ae21 3eb17169 3eb17169 -> 3efb4012 3f6be470 be74b56c", + "be8f560e be60396d 3de43fda 3e6e7564 3f241d8e 3f545988 be36013a -> be60396d 3de43fda 3eb21598", + "3ea20571 3f968129 3c017a94 3e938aea 3f0b6174 3f57363c 3e41e361 -> 3f79dcb4 3c017a94 3e8387e5", + "3f27d01c be4fd66e be5e9c24 3f8f15b5 3f5ce8bf 3ed077e3 3f5ce8bf -> be4fd66e be5e9c24 3f7363df", + "3f0cdd3d 3f534fda 3d027b4c be5b7854 3f800000 3e800000 3f400000 -> 3f534fda 3d027b4c be5b7854", + "3f9b6cfa 3e532b42 3f1e60e4 3f1e60e4 3f3edf74 3f006080 3f006080 -> 3e532b42 3ef3e5c0 3ef3e5c0", + "3d8f86d6 3f22eb75 3f0a42bb 3f22eb75 3f400000 3e800000 00000000 -> 3f22eb75 3f050e6f 3f17808a", + "3f49becc 3f048b6c bb6fd314 3f091e6a 3f94dc38 3f94dc38 3e5219aa -> 3f048b6c bb6fd314 3e8ce80c", + "3f8ef1ae 3eb71afe bc476d61 bc476d61 bdb23203 bdb23203 3f1d1c23 -> be0e4154 bdc416e0 bc476d61", + "3c978246 3e883bbb 3f9bf21a 3e485fbb 3f800000 3f400000 00000000 -> 3e883bbb 3f9ad648 3e44ab08", + "3fb55b92 3efc2658 3efc2658 3e3a6046 3e03dbce 3e03dbce be358730 -> bcbb2b00 bcbb2b00 bea7721d", + "bee82a88 be1c0b75 3d816a5b 3d816a5b bc40ac66 be51b5c6 3f1d49a9 -> be1c0b75 3e3d2470 3d816a5b", + "bed27f72 3f16b74d 3f16b74d 3e9da45b bd83aa3e bd891db8 bd891db8 -> 3f5b7233 3f5bb9ea 3eec8bd6", + "3fbae211 bda871a3 bdbcca21 3e05a780 3ddff485 3f97879c 3f97879c -> bda871a3 bdbcca21 3e05a780", + "bd973197 3ee908f0 3f9b65f4 3f9b65f4 3f0be944 3f984df6 3f984df6 -> 3ee908f0 3f9ba06c 3f9ba06c", + "3f8e8865 3f515f8a be55f064 be18dab9 3ea552d3 3f75e8c1 3e983111 -> 3e888cf0 be55f064 be18dab9", + "3f92879c 3e1df791 be2cc5d1 bb63b03c 3f7ea9db 3eda1902 3eda1902 -> 3e1df791 be2cc5d1 bb63b03c", + "3f9e3b6b 3f2df90f 3f9dfe07 3f8ace14 3db0e3dd 3e2982ec 3e2982ec -> bd5c1b50 bdb1f580 bd52e640", + "3fa0a582 bdfbbe05 be5a3090 be5a3090 3f8dfe73 3f8567de 3e936515 -> bdfbbe05 be5a3090 be5a3090", + "3f190326 3f2704f1 bdd9b52d 3f2704f1 3f5db177 3f8411c8 3f0787d2 -> 3f2704f1 bdd9b52d 3f1432c6", + "3e9e6256 3f8c1cff 3f0c71b8 3e386444 bb950590 3f3c24e8 3f19b108 -> 3f412e14 3f0c71b8 3e386444", + "3f7a81a2 3f93a60f be75e19e 3ec69f03 3f05c960 3f891e55 3f418da0 -> 3f0940a7 be75e19e 3ec69f03", + "be34795f 3efe83b0 3f912cee be4c0c08 3eefcf65 3ebbadbf 3e9fd9dc -> 3f008d90 3fa27e16 be4c0c08", + "3f7b0590 3ee72290 3efdcc17 3efdcc17 3f4369d5 be74dad7 3e18ddce -> 3ee72290 be6638f2 3e1fc3bc", + "3e81b85b 3f78ddd1 bc847c44 bc847c44 3f35dfb4 bd6b4e85 bd6b4e85 -> 3f67e4ac bcda2746 bcda2746", + "be2d6227 bd0cbfe1 3f6d9f6f bd0cbfe1 3e69f57a 3f77fca0 3f77fca0 -> bd0cbfe1 3f6d9f6f bd0cbfe1", + "3fb667cc 3f303b8f 3ec5ca83 3f29d357 3f95dc3a 3ebd44c4 bc84ad45 -> 3f303b8f 3eb9a56e be9c2ede", + "3f8ec1b6 3f84b8af 3f64694a 3ee1dd8d 3c7d7952 be68bcc6 3c7d7952 -> bdd17aa0 beb67330 bd09a3d8", + "be311e78 3f85960e 3f85960e bda2e668 3de8f577 3f0da2bb 3de8f577 -> 3f9a2c82 3f90716c bda2e668", + "3e41ed0a 3f5a024a 3f5a589f 3f476787 3f8bb4ff be1f4400 3efec244 -> 3f5a024a 3f297484 3f39c3a6", + "3e8b63bd 3e44d5aa 3f7ddfa2 be7ca036 3f694393 3edeff8d 3f9075bb -> 3e44d5aa 3f571ce0 be7ca036", + "3f9e394a 3f36f6d1 3f82d2cd 3ee4da79 3f400000 3f000000 00000000 -> 3f36f6d1 3ec0e2be bdd82684", + "3f385100 3f87ecc1 3ea53add 3e8e6b21 3ef1f5ed 3d51440f bd7f0acf -> 3f2339d1 3e023356 3d076814", + "3f5e04ab bd3d7eb5 bd0daf2b bd0daf2b 3f82d655 3d078def 3f81918e -> bd3d7eb5 bd0daf2b bd0daf2b", + "3e340a08 3f407af8 3f776d3d 3f776d3d 3f000000 3e800000 3f000000 -> 3f3524b9 3f572d3d 3f626dde", + "3fad034e 3f1190af 3e29530e 3f1190af be5b8df9 3f2a9fc9 be5b8df9 -> befac306 3e29530e befac306", + "3f48ce58 3e5ef339 3e3fcdcf 3f62f4de bd82e7c3 3e0762cd be0acfcf -> bb517240 3e138cbc 3dadb090", + "3fbc0e5a 3f5571f0 3f5571f0 3f7cc1be be64c58f 3f025f13 3f025f13 -> bf382c4c 3eb6c9d6 3e91e634", + "3f9e5d81 bd3a71a5 bd3a71a5 3f6bb918 3ebaa9dc 3d5e2c51 3d5e2c51 -> bd3a71a5 bd3a71a5 be1af610", + "3fad69c3 3f92672c 3f92672c 3edfeb46 3f18ef79 3f31ccfe 3e308c69 -> 3ece9f1a 3f08ff7e 3da09860", + "beed2d4c 3f88a120 3cb229c6 3cb229c6 3e800000 3f000000 3e800000 -> 3fb918f7 3cb229c6 3cb229c6", + "3fbe4c28 3f6075f8 3f42fa8f 3e7b54d0 3f000000 3f800000 3f000000 -> 3ea21af0 3f42fa8f 3e7b54d0", + "3ed862f7 bdc0e183 3f9319b4 3f4e09b2 3d764f5b 3f2b51e4 3d764f5b -> bdc0e183 3f724484 3efaeeb2", + "3fa76959 3f23b590 3f46772d 3f46772d 3e39cc44 3f399efd 3e104338 -> 3d2584c0 3f35aa8c bd5f00c0" + ] + }, + { + "function": "cycles_mix_light", + "node": "ShaderNodeMix RGBA LIGHTEN", + "cases": [ + "00000000 00000000 00000000 00000000 3e08abc7 3f9e37de 3f986430 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f400000 00000000 3f000000 -> 3ec00000 00000000 3ec00000", + "3f800000 00000000 00000000 3f000000 3ec024cb 3f08af9e 3ec024cb -> 3ec024cb 3f08af9e 3f000000", + "3fc00000 00000000 00000000 3f400000 3e3cec6c 3f15eb07 3f15eb07 -> 3e8db151 3f60e08a 3f400000", + "bf000000 00000000 00000000 3f800000 3f1b3310 3ebced97 3f1b3310 -> be9b3310 be3ced97 3f800000", + "3e800000 00000000 3e800000 00000000 bd12fca1 bcbc20cb 3ea5dd00 -> 00000000 3e800000 3da5dd00", + "3f400000 00000000 3e800000 3e800000 3dd73002 be2e4818 3f0b8f2f -> 3da16402 3e800000 3ef156c6", + "40000000 00000000 3e800000 3f000000 3ee623b6 bc9409c1 3ee623b6 -> 3f6623b6 3e800000 3f000000", + "00000000 00000000 3e800000 3f400000 3ef93b9f 3f8e7ece 3f639873 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3f8af7aa 3f9417e9 3f8af7aa -> 3f0af7aa 3f3417e9 3f857bd5", + "3f800000 00000000 3f000000 00000000 3de1e0dc 3de1e0dc 3f03e675 -> 3de1e0dc 3f000000 3f03e675", + "3fc00000 00000000 3f000000 3e800000 3f8d5158 3ecca9c0 3f8d5158 -> 3fd3fa04 3f000000 3fc3fa04", + "bf000000 00000000 3f000000 3f000000 3dfda7d9 3f9fc466 be166f3d -> bd7da7d9 3e00ee68 3f000000", + "3e800000 00000000 3f000000 3f400000 3f81871f bde95598 3e08cd58 -> 3e81871f 3f000000 3f400000", + "3f400000 00000000 3f000000 3f800000 be65c968 3edaa472 3f92e7f1 -> 00000000 3f000000 3f8e2df5", + "40000000 00000000 3f400000 00000000 3e3a9b93 3ebbd4c6 3f786bfd -> 3eba9b93 3f400000 3ff86bfd", + "00000000 00000000 3f400000 3e800000 3e2e936a be65c89d 3f20725e -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 bc37901b bcf8bebd be24d7e4 -> 00000000 3f400000 3f000000", + "3f800000 00000000 3f400000 3f400000 3e874b1f 3e707d13 3f6bcb0e -> 3e874b1f 3f400000 3f6bcb0e", + "3fc00000 00000000 3f400000 3f800000 bdf68a5b bdf68a5b 3f91dba6 -> 00000000 3f400000 3f9ac979", + "bf000000 00000000 3f800000 00000000 3e800000 00000000 00000000 -> be000000 3f800000 00000000", + "3e800000 00000000 3f800000 3e800000 be3f4e69 3f851717 3ea59618 -> 00000000 3f8145c6 3e896586", + "3f400000 00000000 3f800000 3f000000 3f3cc521 3ed8bbbb 3f65a30a -> 3f0d93d9 3f800000 3f4c3a48", + "40000000 00000000 3f800000 3f400000 3f8bd09b 3e98559b 3f84ce21 -> 400bd09b 3f800000 3fa99c42", + "00000000 00000000 3f800000 3f800000 3f800000 3e800000 00000000 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3f01471d 3f0f2b3e 3f0f2b3e -> 3ec1471d 3e8f2b3e 3e8f2b3e", + "3f800000 3e800000 00000000 3e800000 3f9f3d0c 3f5a622c 3f9f3d0c -> 3f9f3d0c 3f5a622c 3f9f3d0c", + "3fc00000 3e800000 00000000 3f000000 00000000 3e800000 00000000 -> 3e800000 3ec00000 3f000000", + "bf000000 3e800000 00000000 3f400000 3f400000 3f000000 3f800000 -> 00000000 be800000 3f200000", + "3e800000 3e800000 00000000 3f800000 3f518024 3ed17015 3f518024 -> 3ec8c012 3dd17015 3f800000", + "3f400000 3e800000 3e800000 00000000 3f800000 3f400000 3e800000 -> 3f500000 3f200000 3e400000", + "40000000 3e800000 3e800000 3e800000 3f1e5418 bddbe41d 3ec67bd6 -> 3f7ca830 3e800000 3f067bd6", + "00000000 3e800000 3e800000 3f000000 3f6e9cfd 3e8730b0 be70b60e -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f9fb399 3f841adc 3f841adc -> 3f3fb399 3f241adc 3f641adc", + "3f800000 3e800000 3e800000 3f800000 bda9a3fd 3d754db2 3f9ba922 -> 3e800000 3e800000 3f9ba922", + "3fc00000 3e800000 3f000000 00000000 3ebe1626 3ebe1626 3f768bf9 -> 3edd2139 3f000000 3fb8e8fb", + "bf000000 3e800000 3f000000 3e800000 3f19115e 3f9b53ff be090655 -> 3d9bba88 3e12b004 3e800000", + "3e800000 3e800000 3f000000 3f000000 3f778866 3f778866 3e9f0126 -> 3edbc433 3f1de21a 3f000000", + "3f400000 3e800000 3f000000 3f400000 3e1ea2dc bdb80f39 bdb80f39 -> 3e800000 3f000000 3f400000", + "40000000 3e800000 3f000000 3f800000 be12352a 3f2b88f4 be12352a -> 3e800000 3f5711e8 3f800000", + "00000000 3e800000 3f400000 00000000 3f800000 3e800000 3f800000 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 be7bdd3d be7bdd3d 3f57e37c -> 3e800000 3f400000 3f0bf1be", + "3f800000 3e800000 3f400000 3f000000 bd056ddc be5a5648 be5a5648 -> 3e800000 3f400000 3f000000", + "3fc00000 3e800000 3f400000 3f400000 3f400000 3f800000 00000000 -> 3f800000 3f900000 3f400000", + "bf000000 3e800000 3f400000 3f800000 3f4fdb80 3f289388 3dff709b -> bcfdb800 3f400000 3f800000", + "3e800000 3e800000 3f800000 00000000 bc850268 bc850268 3f77198b -> 3e800000 3f800000 3e77198b", + "3f400000 3e800000 3f800000 3e800000 bd687ba4 3f7a5e85 3f7a5e85 -> 3e800000 3f800000 3f4bc6e4", + "40000000 3e800000 3f800000 3f000000 3f66a700 3f2ad00c 3f3ff4bb -> 3fc6a700 3f800000 3f7fe976", + "00000000 3e800000 3f800000 3f400000 3f836d3e 3eb9f11a 3f845a92 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3d057d19 3f4e73d5 3f4e73d5 -> 3e800000 3f800000 3f800000", + "3f800000 3f000000 00000000 00000000 3e95642e be4c55c2 be4c55c2 -> 3f000000 00000000 00000000", + "3fc00000 3f000000 00000000 3e800000 3f98638a 3f98638a 3f8c8afe -> 3fc4954f 3fe4954f 3fc2d07d", + "bf000000 3f000000 00000000 3f000000 3f1fd8b0 3f1fd8b0 bdbefcb4 -> 3ee02750 be9fd8b0 3f000000", + "3e800000 3f000000 00000000 3f400000 3e22aeaf 3e22aeaf 3f4b26e8 -> 3f000000 3d22aeaf 3f42c9ba", + "3f400000 3f000000 00000000 3f800000 3f000000 3f400000 3f400000 -> 3f000000 3f100000 3f800000", + "40000000 3f000000 3e800000 00000000 3f657db6 3e8878c8 3d99eea1 -> 3fa57db6 3e90f190 3e19eea1", + "00000000 3f000000 3e800000 3e800000 3f7a66e8 3eba4858 3f82584b -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3f046d79 bd04079c bd79aa79 -> 3f0236bc 3e800000 3f000000", + "3f800000 3f000000 3e800000 3f400000 bca33d3c 3eb40d71 bca33d3c -> 3f000000 3eb40d71 3f400000", + "3fc00000 3f000000 3e800000 3f800000 3eb437fa 3da721bf be32e03e -> 3f000000 3e800000 3f800000", + "bf000000 3f000000 3f000000 00000000 3eb91be1 3f67cf2a 3f574e59 -> 3f000000 3e9830d6 bed74e59", + "3e800000 3f000000 3f000000 3e800000 bd84cdae 3da4762d 3f5ee5c5 -> 3f000000 3f000000 3ecf72e2", + "3f400000 3f000000 3f000000 3f000000 3f9d6a7b 3e48e1bc 3f9d6a7b -> 3f860fdc 3f000000 3f860fdc", + "40000000 3f000000 3f000000 3f400000 3f800000 3f800000 3f800000 -> 3fc00000 3fc00000 3fa00000", + "00000000 3f000000 3f000000 3f800000 3f8514b2 3f310ee1 be436339 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f419471 3eb0614a 3f4e7fd6 -> 3f20ca38 3f400000 3ece7fd6", + "3f800000 3f000000 3f400000 3e800000 3f800000 3e800000 3e800000 -> 3f800000 3f400000 3e800000", + "3fc00000 3f000000 3f400000 3f000000 3ec7f402 3f70d2d4 3f70d2d4 -> 3f000000 3f849e1f 3f949e1f", + "bf000000 3f000000 3f400000 3f400000 3eac997c be14e700 3f99784e -> 3f000000 3f400000 3f0687b2", + "3e800000 3f000000 3f400000 3f800000 3d25b827 3f812926 3f8d417e -> 3f000000 3f509493 3f835060", + "3f400000 3f000000 3f800000 00000000 3e800000 3e800000 3e800000 -> 3f000000 3f800000 3e400000", + "40000000 3f000000 3f800000 3e800000 3e800000 3f800000 3f000000 -> 3f000000 3f800000 3f400000", + "00000000 3f000000 3f800000 3f000000 3f944890 3f219e81 3f811a85 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 bdaabac0 3f54af1f 3f54af1f -> 3f000000 3f800000 3f4a5790", + "3f800000 3f000000 3f800000 3f800000 3f8dfe53 3f96b478 3f96b478 -> 3f8dfe53 3f96b478 3f96b478", + "3fc00000 3f400000 00000000 00000000 be6e5dfb 3f896be7 3eb34b51 -> 3f400000 3fce21da 3f06787d", + "bf000000 3f400000 00000000 3e800000 be26e45c 3eed8028 be26e45c -> 3f400000 be6d8028 3e800000", + "3e800000 3f400000 00000000 3f000000 bdd12b15 3f84b550 3f84b550 -> 3f400000 3e84b550 3f225aa8", + "3f400000 3f400000 00000000 3f400000 be5622bc 3f984e54 3ea81ded -> 3f400000 3f64757e 3f400000", + "40000000 3f400000 00000000 3f800000 be28a4a4 3f92330d be28a4a4 -> 3f400000 4012330d 3f800000", + "00000000 3f400000 3e800000 00000000 3e800000 3f000000 3f400000 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f9914f4 3f86dad1 3f86dad1 -> 3f7914f4 3f26dad1 3f26dad1", + "3f800000 3f400000 3e800000 3f000000 3e800000 00000000 3f400000 -> 3f400000 3e800000 3f400000", + "3fc00000 3f400000 3e800000 3f400000 3ed0d667 3f3b3465 3f3b3465 -> 3f400000 3f78ce98 3f400000", + "bf000000 3f400000 3e800000 3f800000 3ec953c1 39e74c54 3ec953c1 -> 3f400000 3e800000 3f800000", + "3e800000 3f400000 3f000000 00000000 3bf68adc 3f1aa4e0 3f1aa4e0 -> 3f400000 3f06a938 3e1aa4e0", + "3f400000 3f400000 3f000000 3e800000 3f542b8d 3ed379da 3d8f6ff2 -> 3f4f20aa 3f000000 3e800000", + "40000000 3f400000 3f000000 3f000000 3f11e57c 3ee6028d 3f38ef29 -> 3f400000 3f000000 3f71de52", + "00000000 3f400000 3f000000 3f400000 3ec53351 3ec53351 bd82f06c -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3eeeb58c bbdd5c43 3f96dbb8 -> 3f400000 3f000000 3f8b6ddc", + "3f800000 3f400000 3f400000 00000000 3e0e7226 3f19f714 3f19f714 -> 3f400000 3f400000 3f19f714", + "3fc00000 3f400000 3f400000 3e800000 3f12aed9 3f48f619 3f12aed9 -> 3f400000 3f4d7126 3f3c0646", + "bf000000 3f400000 3f400000 3f000000 3f9fcb3b 3f9fcb3b 3f06c4b6 -> 3f0034c5 3f0034c5 3ef93b4a", + "3e800000 3f400000 3f400000 3f400000 bdbf43cf 3f440ef6 bdbf43cf -> 3f400000 3f4103be 3f400000", + "3f400000 3f400000 3f400000 3f800000 3f6c0427 3f8bce36 3f8589a1 -> 3f61031d 3f80daa8 3f842739", + "40000000 3f400000 3f800000 00000000 3f68d808 3f2df45f 3f17f684 -> 3f88d808 3f800000 3f97f684", + "00000000 3f400000 3f800000 3e800000 3f17c919 3ed13dcc 3da8db1b -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3e55ac51 3e55ac51 be73629e -> 3f400000 3f800000 3f000000", + "3f800000 3f400000 3f800000 3f400000 3eb96939 be6f0867 3eb96939 -> 3f400000 3f800000 3f400000", + "3fc00000 3f400000 3f800000 3f800000 bd41c450 3ed9618e 3ed9618e -> 3f400000 3f800000 3f800000", + "bf000000 3f800000 00000000 00000000 3f64a62e bd386d7c bd3e83cb -> 3f800000 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 3e118fe4 3f6d1e02 3ea0d300 -> 3f800000 3e6d1e02 3e8834c0", + "3f400000 3f800000 00000000 3f000000 3e5bd59a 3e9c40ac 3ed1151a -> 3f800000 3e6a6102 3f000000", + "40000000 3f800000 00000000 3f400000 3f10c2f2 3f10c2f2 3f9ea200 -> 3f800000 3f90c2f2 3fdd4400", + "00000000 3f800000 00000000 3f800000 3f400000 00000000 3f400000 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f9784b7 be4f49e2 3f9784b7 -> 3f8bc25c 3e800000 3f1784b7", + "3f800000 3f800000 3e800000 3e800000 3f59a6be 3f62656c 3f99701e -> 3f800000 3f62656c 3f99701e", + "3fc00000 3f800000 3e800000 3f000000 3f535e13 3f535e13 bda4c83b -> 3f800000 3f8e868e 3f000000", + "bf000000 3f800000 3e800000 3f400000 bd274f16 3f1a0f48 3f9c120c -> 3f800000 3d97c2e0 3f03edf4", + "3e800000 3f800000 3e800000 3f800000 3f672741 3f526856 3f72a865 -> 3f800000 3ec9342b 3f800000", + "3f400000 3f800000 3f000000 00000000 be1b5a05 3e863544 3e863544 -> 3f800000 3f000000 3e494fe6", + "40000000 3f800000 3f000000 3e800000 bce321c3 bd596172 bd596172 -> 3f800000 3f000000 3e800000", + "00000000 3f800000 3f000000 3f000000 3f4ae970 3f917ca4 3ebb5fcc -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f1a8c31 3efd3417 3f9bd156 -> 3f800000 3f000000 3f7bd156", + "3f800000 3f800000 3f000000 3f800000 3f8f10ac 3f8f10ac 3e00d7e1 -> 3f8f10ac 3f8f10ac 3f800000", + "3fc00000 3f800000 3f400000 00000000 3e6b295a be040deb 3e8a9742 -> 3f800000 3f400000 3ecfe2e3", + "bf000000 3f800000 3f400000 3e800000 3f5f2f76 3e198818 3f5cbf39 -> 3f800000 3f400000 bd65f9c8", + "3e800000 3f800000 3f400000 3f000000 3f434c10 3d3a0c24 3f8bf7dd -> 3f800000 3f400000 3f25fbee", + "3f400000 3f800000 3f400000 3f400000 bdca0b7e bdcca2f4 bdcca2f4 -> 3f800000 3f400000 3f400000", + "40000000 3f800000 3f400000 3f800000 be62a74a 3e56a58a 3f61e94f -> 3f800000 3f400000 3f800000", + "00000000 3f800000 3f800000 00000000 3ee9016e 3e8f8967 bd955cee -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f7fc4f0 3d3b73d8 3f14ce6a -> 3f800000 3f800000 3ed4ce6a", + "3f800000 3f800000 3f800000 3f000000 bdbac1eb be745fb5 3f1af80d -> 3f800000 3f800000 3f1af80d", + "3fc00000 3f800000 3f800000 3f400000 3f3c8689 be1c7ab4 3f0b62f1 -> 3f800000 3f800000 3f400000", + "bf000000 3f800000 3f800000 3f800000 3e68075d 3f0f5a97 3f9f368c -> 3f800000 3f800000 3f60c974", + "3e800000 00000000 00000000 00000000 3e15bbbd 3e6a06c9 3e15bbbd -> 3d15bbbd 3d6a06c9 3d15bbbd", + "3f400000 3e800000 3e800000 3e800000 3ea8be8f 3eb3172e 3eece934 -> 3e9e8eeb 3ea65162 3ed1aee7", + "40000000 3f000000 3f000000 3f000000 3efc57ba bd24d6db bd24d6db -> 3f000000 3f000000 3f000000", + "00000000 3f400000 3f400000 3f400000 3d87fab5 3e95e1bf 3e8c6b46 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f800000 3e800000 3f400000 -> 3f800000 3f800000 3f800000", + "3f800000 3fa00000 3fa00000 3fa00000 3eb2d54a 3f5b103a 3f5b103a -> 3fa00000 3fa00000 3fa00000", + "3fc00000 be800000 be800000 be800000 3f000000 3e800000 3f400000 -> 3f600000 3f000000 3fa00000", + "bf000000 3dcccccd 3dcccccd 3dcccccd be2af12f 3f063e45 be2af12f -> 3dcccccd bde5c5e1 3dcccccd", + "3e800000 3f666666 3f666666 3f666666 3f0e0b74 3f47c050 3f982bdc -> 3f666666 3f666666 3f78e2ba", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f825ef5 3e85ef73 3d91ef5d -> 3f58e3c5 3eaaaaaa 3eaaaaaa", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3e69cfa1 3f921129 3f58ef7a -> 3f2aaaab 3fceccfc 3f839a24", + "00000000 3f445dfd 3f445dfd bde053cb 3e800000 3e800000 3f800000 -> 3f445dfd 3f445dfd bde053cb", + "3f000000 bd395b84 3f5ed14f 3e3b65bf 3eb7c080 3ed3a54a 3ece189a -> 3e20950f 3f5ed14f 3e95e5bd", + "3f800000 3f762779 3f98560d 3ec807ed 3f000000 3f000000 00000000 -> 3f762779 3f98560d 3ec807ed", + "3fc00000 be5f4670 3f00a174 3f305701 3f000000 3e800000 00000000 -> 3f5be8ce 3f00a174 3f305701", + "bf000000 3e7d1676 3f4b2f09 be3b7f4b be5c4256 be5c4256 3e598d8b -> 3e7d1676 3f4b2f09 bec302db", + "3e800000 3ed95f37 be58a6ab be58a6ab 3f8569c3 3e9f8ef8 3e9f8ef8 -> 3f143896 bda56b08 bda56b08", + "3f400000 3e25fe94 be13fc0d 3dc33740 be515f5c 3e201a7a 3e201a7a -> 3e25fe94 3da629b2 3e107ac4", + "40000000 3d81774b 3d81774b bd8b2a5d be2c3faa 3f631bd2 3f631bd2 -> 3d81774b 3fdb045e 3febce78", + "00000000 3f8c1e15 3eff2f5e 3f5c90b8 bd93231b be2a7f4a bd93231b -> 3f8c1e15 3eff2f5e 3f5c90b8", + "3f000000 3cadc6cb 3f49343c 3f8535d4 3f2368cd 3ec2c2f4 3f64fc1c -> 3ea8d704 3f49343c 3f8535d4", + "3f800000 3f938835 3f1cd5cc 3ea96d27 3ecd85f8 3df005c8 3d24c69b -> 3f938835 3f1cd5cc 3ea96d27", + "3fc00000 3ebd1362 3e0a4b43 3f899700 be15eb7a 3f166b43 3f1ec9f1 -> 3ebd1362 3f50577c 3f899700", + "bf000000 3e9e8afa be59ea9a 3e9e8afa 3f0e23e5 3f0e23e5 3eeb464c -> 3e3f5924 bf18c9ec 3e705aa2", + "3e800000 be065218 3f914c6d be065218 bd9d8e8f 3f2fecbd 3e69115f -> bdf0dec8 3f914c6d bd29e4e8", + "3f400000 3f5ef185 3e729e9f 3f5ef185 bdf3c97c 3f590429 3f8c96a3 -> 3f5ef185 3f31ed09 3f854f2b", + "40000000 3f426dea 3e8a8264 3f47bc46 3eec0da5 bd2b4c8d 3eec0da5 -> 3f426dea 3e8a8264 3f47bc46", + "00000000 3f399a37 3f149cee be6902a7 3e800000 3e800000 00000000 -> 3f399a37 3f149cee be6902a7", + "3f000000 3f16173c 3f16173c be303dbf 3f33ba7a 3f2fc66f bdb902d0 -> 3f24e8db 3f22eed6 be065f94", + "3f800000 3f04b7b4 3efdfe50 3f9c3eef 3f63554c 3eea8581 3f3e9af1 -> 3f63554c 3efdfe50 3f9c3eef", + "3fc00000 3dd85b4c 3dd85b4c 3f54305f 3ea5c973 3f6f2ca0 3e774e31 -> 3edda2c3 3fac9e9d 3f54305f", + "bf000000 3ec15b96 3f07ac8a 3f829047 3e976d3e 3f7c3f4f 3f2645b8 -> 3ec15b96 3e9ac64f 3f829047", + "3e800000 3f923564 3f196d21 bd5c92bd 3dd8f520 3f8a6dbe 3efe17ed -> 3f923564 3f3848b8 3dab60e6", + "3f400000 bdcb9354 bd91f326 bdcb9354 3f00814b 3f00814b 3d360245 -> 3eb408bc 3eb7a2be 3c0ae020", + "40000000 3d0e64f7 be4a908a 3f819ad9 3ec3f840 3f591e34 3f591e34 -> 3f3b11f0 3ff27045 3f819ad9", + "00000000 3f80ab11 3f8f1ba1 3f7ffc08 3f400000 3f800000 3f000000 -> 3f80ab11 3f8f1ba1 3f7ffc08", + "3f000000 3f0847a1 3f9c12d2 3f9c12d2 3f8d93a3 3f859d0b 3f859d0b -> 3f51b774 3f9c12d2 3f9c12d2", + "3f800000 3f966b8e 3ebab57f bd980009 3e616f1d 3e1a48b0 3e1a48b0 -> 3f966b8e 3ebab57f 3e1a48b0", + "3fc00000 3f8a7de1 bcffbfeb bcffbfeb 3ec3bb6b 3ec3bb6b 3f7b30df -> 3f8a7de1 3f16cb91 3fbe6426", + "bf000000 3f8d1f33 3d88532c 3f862efb bd43f064 3f1dc9a7 3f1dc9a7 -> 3f8d1f33 be5554ee 3f862efb", + "3e800000 bcb062b6 3f33d418 3e85ceaa 3f8d0695 3f8d0695 ba25993c -> 3e84c1f5 3f4d625c 3e85ceaa", + "3f400000 3f8475c9 3f7b7898 bdc5558a bc028c4b 3eca7b05 bc028c4b -> 3f8475c9 3f7b7898 bcf64a24", + "40000000 3e9d2dc1 3f9b6458 3e9d2dc1 be0714f0 3e941ef4 3e941ef4 -> 3e9d2dc1 3f9b6458 3e9d2dc1", + "00000000 3e4de5cb bde7f392 3f87ef04 3c9c6e9a 3f939f48 3f8be550 -> 3e4de5cb bde7f392 3f87ef04", + "3f000000 bd48ea11 bd48ea11 3e8af4a3 be4f98c1 3f0a27f1 3ece6058 -> bd48ea11 3e7b32a0 3eacaa7e", + "3f800000 3f0fa6a6 be05b65b be05b65b 3f000000 3f400000 3f800000 -> 3f0fa6a6 3f400000 3f7fffff", + "3fc00000 3eac5d40 3e38993b 3e38993b 3e724aca 3f8b31c9 bcc357ca -> 3eac5d40 3fc54119 3e38993b", + "bf000000 3ad9f809 3d091834 3d091834 3f40717e 3f5ba391 3f40717e -> bebf2a8a bec1ef08 bea6bcf4", + "3e800000 3f322d3e 3f1a3455 3f7c47b2 3eeb1787 3f16c4ad 3f97c129 -> 3f322d3e 3f1a3455 3f848b2d", + "3f400000 3f6ccadd bde55b1c 3f6ccadd 3f54cdad 3e12f63b 3f54cdad -> 3f6ccadd 3da31a90 3f6ccadd", + "40000000 3e352b07 3f89c85a bd6416c0 3f9adaf5 3f9adaf5 3f546f8b -> 400f8844 3fabed90 3fdb9041", + "00000000 bdb247fc 3f31065c 3f31065c 3f33ecb9 3f33ecb9 3eac6b3e -> bdb247fc 3f31065c 3f31065c", + "3f000000 3f91e663 3c87ce4a 3c87ce4a 3f6b165f bd7e8d32 3f390d4e -> 3f91e663 3c87ce4a 3ebd4bc1", + "3f800000 3dfce360 3f7e39f6 3dfce360 3c79edd6 3f66dcbe 3c79edd6 -> 3dfce360 3f7e39f6 3dfce360", + "3fc00000 3f22a7e1 3f23e699 3f23e699 3f800000 3f000000 3e800000 -> 3f975608 3f23e699 3f23e699", + "bf000000 3ee2d26c 3f96c023 3e552bfe 3ca7986e 3f98025f 3ca7986e -> 3ee2d26c 3f961f05 3e552bfe", + "3e800000 3f8c0b1b 3f14004d be0e44d9 3d2311e5 3f752536 3f752536 -> 3f8c0b1b 3f2c4987 3e0a7193", + "3f400000 3f9dcf17 3f927578 3eec0c5b 3e8df524 3f57f6a7 3f57f6a7 -> 3f9dcf17 3f927578 3f3f7a88", + "40000000 3e87b103 3f396e11 3d2ff8c4 00000000 3f800000 3f000000 -> 3e87b103 3fa348f8 3f750074", + "00000000 3f599471 3ee99b8a 3eb22722 3f71efaf 3f1e4e5b 3f79e2e9 -> 3f599471 3ee99b8a 3eb22722", + "3f000000 3f9a1426 3f57a8d6 3f57a8d6 3f78fe11 3eb12c03 3f78fe11 -> 3f9a1426 3f57a8d6 3f685374", + "3f800000 3f73cb72 3ed1386d 3ed1386d be528c9a 3ea64e80 3e77b0fb -> 3f73cb72 3ed1386d 3ed1386d", + "3fc00000 3db159c8 3f95b97f bd53a438 3f8a4fd3 3f78cfcc 3efeb003 -> 3fc9ecee 3f95b97f 3f45a124", + "bf000000 3f3a030c 3f2abca8 3e94f710 3f89d910 3f1c4632 3c442b70 -> 3f0d2b82 3f2abca8 3e94f710", + "3e800000 3eb61686 3eb61686 be12014b 3f355a50 3eb7f8af 3f30e81d -> 3ee33e0c 3eb68f10 3d86ce4a", + "3f400000 3e95e509 3f87627a 3e95e509 be437647 3f24e693 be2e746b -> 3e95e509 3f87627a 3e95e509", + "40000000 3f0823c2 3f925f45 3f0823c2 3cba8a3a bdde94ea 3cba8a3a -> 3f0823c2 3f925f45 3f0823c2", + "00000000 3f9c9486 3f9c9486 3f3b7075 3ec1cada 3ec1cada be5a6d49 -> 3f9c9486 3f9c9486 3f3b7075", + "3f000000 3f823a90 3f0bb2a7 3f49caf7 bd9969ce 3da2193b 3da2193b -> 3f823a90 3f0bb2a7 3f49caf7", + "3f800000 bc022f04 3f1dc58d bc022f04 3f666666 3f666666 3f666666 -> 3f666666 3f666666 3f666666", + "3fc00000 3f6ffed6 3ef48d91 3f05c605 3e9562af 3e9562af 3f9b0fd8 -> 3f6ffed6 3ef48d91 3fc72642", + "bf000000 bcb191e1 3f0e23e4 bcb191e1 3f7050b3 be77346a 3f871e2b -> bf007b30 3f0e23e4 bf0f7102", + "3e800000 3f8bfec8 3f8bfec8 3d8f82fa 3ececdc6 3e5a543c 3e5a543c -> 3f8bfec8 3f8bfec8 3dd8cc5a", + "3f400000 3cf36818 3f0600fd bd2cc7e6 3c4c4b31 3f02cef3 3e652d58 -> 3cf36818 3f0600fd 3e211584", + "40000000 3f5ee41c 3f5186c1 3f5186c1 3f09bd24 3f09bd24 3e424b75 -> 3f5ee41c 3f5186c1 3f5186c1", + "00000000 be0702a1 be0702a1 3f5b9385 3f6bff4c be6e4b82 3f6bff4c -> be0702a1 be0702a1 3f5b9385", + "3f000000 bc2d6de4 3f88451f 3f88451f 3eacb35b 3f9f5de9 3f3dd9e9 -> 3e2747ec 3f93d184 3f88451f", + "3f800000 be13f480 3eb13397 3eb13397 be346990 3ed8eceb 3f2609a4 -> be13f480 3ed8eceb 3f2609a4", + "3fc00000 3f9f0870 3f901ff7 3f94eab1 3f800000 3f800000 3f800000 -> 3f9f0870 3f901ff7 3f94eab1", + "bf000000 3ece0998 3e0ca39b 3f9ec2ca bd3b1fbd 3f970e10 3f90335a -> 3ece0998 bec4a16c 3f9ec2ca", + "3e800000 3f3b83c5 3f3d616b 3f3d616b 3d6ca332 3d6ca332 3ea2db2d -> 3f3b83c5 3f3d616b 3f3d616b", + "3f400000 3f69e335 3e961b2d 3f33e069 3ed74202 3f21b471 3ed74202 -> 3f69e335 3f0c0aba 3f33e069", + "40000000 3f72e413 3d7d2e4e 3f6b48f0 3f2aaaab 3f2aaaab 3f2aaaab -> 3f72e413 3fa2c138 3f6b48f0", + "00000000 3ea1bd8d 3e127d47 3ea1bd8d 3f1e1063 3f1e1063 3e7d40db -> 3ea1bd8d 3e127d47 3ea1bd8d", + "3f000000 3f8a203a 3ec93bf4 3f89d17c 3f376bb2 3f81102a 3f81102a -> 3f8a203a 3f335f27 3f89d17c", + "3f800000 3eb618f1 3f8603b0 3eb618f1 3f93c7ba bd38a664 3f90beba -> 3f93c7ba 3f8603b0 3f90beba", + "3fc00000 bdda92e4 3eb8b11a 3f9d2778 3f51e22c 3f95b81c 3f95b81c -> 3fa43e38 3fc97e06 3f9d2778", + "bf000000 3e83a921 3f9c082c 3ea4499d 3f28cdc5 3ed5b8ed 3f62c749 -> 3d657f64 3f9c082c 3d1d3918", + "3e800000 3f6718b1 3f26e781 3f6718b1 bde87733 3ed35f34 3f531246 -> 3f6718b1 3f26e781 3f6718b1", + "3f400000 3f37ecc6 3f37ecc6 3cf77213 3ec4db4a 3e145119 3f0e57bf -> 3f37ecc6 3f37ecc6 3ed96166", + "40000000 3ec380c2 3f708b72 3e8f4a03 3f504736 3f5bf80f 3f504736 -> 3f9f6706 3f708b72 3fac74b5", + "00000000 bdd9c3a8 bdd9c3a8 be27aac7 3f25c87a 3ec3bf5f 3f25c87a -> bdd9c3a8 bdd9c3a8 be27aac7", + "3f000000 bd1ccfef 3f445b26 be105202 bd006c3f 3f69dc2d 3f99c3e4 -> bd0e9e17 3f571baa 3f07b9a4", + "3f800000 3f3f9581 3f3f9581 3f30eede bcc3e644 bcc3e644 3f7618d5 -> 3f3f9581 3f3f9581 3f7618d5", + "3fc00000 be1a35d8 be1a35d8 bdefb77c be1c0aaa 3f954d62 3ee76bed -> be1a35d8 3fe99771 3f3c8c6a", + "bf000000 3eefdd3a bde96ba0 bde96ba0 3f0d922c bddd1a8c be18fe43 -> 3eda39ab bdef942a bde96ba0", + "3e800000 3f4ae848 3f2a6e0d 3f2a6e0d 3f7b750a 3f3c9b65 3f3c9b65 -> 3f570b78 3f2ef963 3f2ef963", + "3f400000 3f9fe942 bc73315e 3f9fe942 3e783e66 3d245bcd 3f9b32b7 -> 3f9fe942 3cd82387 3f9fe942", + "40000000 3dc21067 3e6bb55c 3e4fbe99 3d40fe91 3db7f51d 3f6cc127 -> 3dc21067 3e6bb55c 3fd2c954", + "00000000 3f293f27 3f293f27 3f42cab7 3e8c4f93 3e8c4f93 3ef608e9 -> 3f293f27 3f293f27 3f42cab7", + "3f000000 3f33261c 3f96d9aa 3de4a38f 3f6befc8 3e36d11c 3e0bb826 -> 3f4f8af2 3f96d9aa 3dfe09ee", + "3f800000 3f8874df 3f8874df 3ebc9dd2 3f6b9312 3f6b9312 3d7d51df -> 3f8874df 3f8874df 3ebc9dd2", + "3fc00000 bd979624 be51aa58 3f513f6a 3eba187d 3eba187d 3e1cd374 -> 3f150bc0 3f25c7a8 3f513f6a", + "bf000000 3cd0ae7f 3cd0ae7f 3e06029a 3f400000 3e800000 3f400000 -> beac6fa4 bdb1be90 be36fc1a", + "3e800000 3f5e2254 bd4bb0ce 3f5e2254 bcda3246 bcda3246 3e5b99ba -> 3f5e2254 bd340ae3 3f5e2254", + "3f400000 3f4d671e 3e88f928 3f5dc1da 3f888d86 bdbd14e4 3e0d4063 -> 3f801708 3e88f928 3f5dc1da", + "40000000 3f2b3f70 3e5dbc26 3f2b3f70 3e605c56 3e605c56 3f2be477 -> 3f2b3f70 3e62fc86 3f2c897e", + "00000000 3f07d75c 3e034a95 3b930137 3f3c5c47 be4bc52f 3e76f4b3 -> 3f07d75c 3e034a95 3b930137", + "3f000000 3f191189 3d643bae 3f191189 3f400000 3e800000 00000000 -> 3f2c88c4 3e1c8776 3f191189", + "3f800000 3f0d2d14 3ea3ccbc 3ef196cf 3f8cddc1 3f07b403 be73b208 -> 3f8cddc1 3f07b403 3ef196cf", + "3fc00000 3eb409ec 3f60f980 3f60f980 3bfee2c8 3f9591ad 3f06dffd -> 3eb409ec 3fa81c24 3f60f980", + "bf000000 3f173ea1 3f961b44 3f961b44 3c862720 be73e095 3f863b97 -> 3f173ea1 3f961b44 3f961b44", + "3e800000 be7a9848 3f968ce1 3f469e1e bcf6dcbb 3f96ef07 3f96ef07 -> be43a91c 3f96a56a 3f606e1a", + "3f400000 3f44a683 3f4e20b3 3f44a683 3f553c6a 3ec3749b 3f553c6a -> 3f5116f0 3f4e20b3 3f5116f0", + "40000000 3f8c0c15 3dc76db3 3f6729ff be5c4980 be651475 3f1023f1 -> 3f8c0c15 3dc76db3 3f6729ff", + "00000000 3f8f4f7a 3f77fd7e 3f8b425f 3f16630f be455800 3f16630f -> 3f8f4f7a 3f77fd7e 3f8b425f", + "3f000000 be233abb 3f061eb8 be233abb 00000000 3f000000 3f000000 -> bda33abb 3f061eb8 3e2e62a3", + "3f800000 be5b51b4 3e9fb754 3e9fb754 3e97d090 3f2bb59c 3f2bb59c -> 3e97d090 3f2bb59c 3f2bb59c", + "3fc00000 bdb7adbe 3f969578 3f2a843b 3dbc5985 3e8071f3 3f4b9be2 -> 3e3b2e95 3f969578 3f5c27b6", + "bf000000 3f53d82a 3f53d82a be5a3b7b 3f3aaa60 bd38978e bd38978e -> 3f53d82a 3f53d82a be982324", + "3e800000 3cbcb433 be0db256 3ed486da be18ec1c 3f81baf4 3e489c88 -> 3cbcb433 3e193028 3ed486da", + "3f400000 3f5ab2b1 3f5ab2b1 3f4d4eb8 3c186131 be6733a5 3c186131 -> 3f5ab2b1 3f5ab2b1 3f4d4eb8", + "40000000 3f38a34b 3f3a91f6 3f86e85a 3f20dfe4 3f3264dd 3f3264dd -> 3f38a34b 3f3a91f6 3f86e85a", + "00000000 be34ae9b be34ae9b 3f51d1ad 3f604297 3e171db1 3eb71220 -> be34ae9b be34ae9b 3f51d1ad", + "3f000000 3f3ff00c 3f9f9810 3f9f9810 3f637115 3f18a490 bd5fa333 -> 3f51b090 3f9f9810 3f9f9810", + "3f800000 3f9c5f94 3ee037a0 bdcb45ea 3ecf3342 3ecf3342 3f2a3845 -> 3f9c5f94 3ee037a0 3f2a3845", + "3fc00000 3f8303d6 3f8303d6 3f946b37 3f400000 00000000 3f800000 -> 3f8303d6 3f8303d6 3f946b37", + "bf000000 3e2f394d 3de72c64 3e2f394d 3e82343f 3e82343f 3ec091af -> 3e04a1b4 3d2cb430 3d8c8889", + "3e800000 3f7e82ef 3f963744 3f963744 3f7f8082 3e9851f5 3e9851f5 -> 3f7ec254 3f963744 3f963744", + "3f400000 3f8a96e6 3eb04b6a 3f2c342a 3e5a5974 3e5a5974 3f55d70c -> 3f8a96e6 3eb04b6a 3f4b6e54", + "40000000 3f064e7b bd36f26d bd36f26d be743f59 3f371741 be743f59 -> 3f064e7b 3fbcced5 bd36f26d", + "00000000 3f3f9e52 3f39353e 3ed9e896 00000000 3f400000 3f400000 -> 3f3f9e52 3f39353e 3ed9e896", + "3f000000 3f9186f8 3d8d023b bddaaa2e 3f6ea7ec 3c4f992f 3cbc0ac4 -> 3f9186f8 3d8d023b bd2ba77c", + "3f800000 3f788cb1 3f788cb1 3f1d7995 3f76caa0 3f6e6572 3f6e6572 -> 3f788cb1 3f788cb1 3f6e6572", + "3fc00000 3eb38681 3f27abad 3edf986e 3f7ea587 3f7ea587 3f114ae2 -> 3fa88b55 3f95113a 3f220a38", + "bf000000 3eafd3db 3d83cce4 3f02cb03 3e800000 3e800000 3e800000 -> 3eafd3db bce932a8 3f02cb03", + "3e800000 3f949e84 3f16adf7 3f16adf7 bdc9af88 3e4457b0 3f18f3ff -> 3f949e84 3f16adf7 3f173f79", + "3f400000 3f8f7786 3f8f7786 bdb8f141 3f921655 3eb51df4 3eb51df4 -> 3f916ea1 3f8f7786 3e788ec6", + "40000000 3ebd135d 3f07ab14 3f07ab14 3ee1cc25 3ee1cc25 3f8071b1 -> 3f034276 3f07ab14 3fbd0dd8", + "00000000 3f246ae2 bd97a11b 3e647b5a 3f6d1e3f 3e9c7203 3eb53875 -> 3f246ae2 bd97a11b 3e647b5a", + "3f000000 3f8b69e0 3f569c5d 3f8b69e0 3e83577c be4d3d6a 3ef0fb30 -> 3f8b69e0 3f569c5d 3f8b69e0", + "3f800000 3e159461 3d1700fa 3df91038 3f3dd767 3d7cd7fc 3f3dd767 -> 3f3dd767 3d7cd7fc 3f3dd767", + "3fc00000 3f8feeb1 3d9652c5 3c77bb43 3f889551 3f2e95a5 3f889551 -> 3f8feeb1 3f7c7b4b 3fcbe83e", + "bf000000 3f3f1212 3eec590c 3f793e78 3ec05fc7 3ee9f0c4 3ec05fc7 -> 3f3f1212 3eec590c 3f793e78", + "3e800000 3e83889b 3f3a2f07 3f53da5e 3f39530c 3eeac131 3f39530c -> 3ebf4ffa 3f3a2f07 3f53da5e", + "3f400000 be2eb206 3f3dae91 3f3dae91 3ed07552 3ed07552 3e7cd4ff -> 3e8681bc 3f3dae91 3f3dae91", + "40000000 be04711d bdaf818c be04711d be5ea77f be60ea7f be01f216 -> be04711d bdaf818c bdfee61e", + "00000000 3dd5bb96 3f8cf307 3e81e075 bd80a0e3 3f9b8a3b 3e5bea3b -> 3dd5bb96 3f8cf307 3e81e075", + "3f000000 3e947c4f bd0015aa bd0015aa 3e800000 3f000000 3e800000 -> 3e947c4f 3e6ffd4c 3ddffa95", + "3f800000 3d7dd200 3d7dd200 3ec2bbe9 3eb0199d 3eb0199d 3dc6d478 -> 3eb0199d 3eb0199d 3ec2bbe9", + "3fc00000 3f9d47f3 3f9d47f3 3f8f78b9 3f2e0ba6 3ca1dd4f 3ca1dd4f -> 3f9d47f3 3f9d47f3 3f8f78b9", + "bf000000 3f52f918 3f52f918 be395e4b 3f335efc 3e924646 bc4cb115 -> 3f52f918 3f52f918 be87d3f4", + "3e800000 3d4c8ec9 be3cb4b2 3d4c8ec9 3ea66271 3dc0f415 3ea66271 -> 3df317fc bdead206 3df317fc", + "3f400000 3da3096c 3da3096c 3f425a66 3f800000 00000000 3f000000 -> 3f45184c 3da3096c 3f425a66", + "40000000 3f9176ad 3f033d1d 3f9176ad 3f8053ec 3f8053ec 3f61e82f -> 3f9176ad 3fbf094a 3f9176ad", + "00000000 3eaaaf8e 3f4db0dd 3dd41326 3e5e129d 3f8842c4 3f9e4e34 -> 3eaaaf8e 3f4db0dd 3dd41326", + "3f000000 3f214c6f 3f8f00e3 3f834246 3f0872a1 3f4770c2 3f0872a1 -> 3f214c6f 3f8f00e3 3f834246", + "3f800000 3e05d1cd 3e05d1cd 3f99487d bd2f7afd 3f9d673f 3e3a0c1c -> 3e05d1cd 3f9d673f 3f99487d", + "3fc00000 3ee9d643 3f0d7663 3ee9d643 3f0d83bf 3da70e13 3e089185 -> 3f19d00e 3f0d7663 3ee9d643", + "bf000000 3ed88941 3f126136 3eca88bf 3e800000 3f400000 3e800000 -> 3ed88941 3ef723a2 3eca88bf", + "3e800000 3ea9973d 3f0573aa 3ea9973d 3e800000 3f400000 3f800000 -> 3ea9973d 3f1416c0 3eff316e", + "3f400000 3eb26907 3f7efeba 3f7efeba 3f8af847 3f0196fb 3f8af847 -> 3f66c18c 3f7efeba 3f881a0c", + "40000000 3f535634 bd2fa253 bd2fa253 3eebf4b9 3f93fe1c 3ef54b9f -> 3f535634 4016bca6 3f8022e2", + "00000000 3ec70432 3ec70432 3f80314a 3f2ca0d0 3f9aa45c 3f1d93e6 -> 3ec70432 3ec70432 3f80314a", + "3f000000 3f0a26b1 3f064902 3e4e2c0d 3f62b1df 3e57a0d2 3ea914fa -> 3f366c48 3f064902 3e881580", + "3f800000 3f0f3900 3f0f3900 3e805a6a 3f9918b6 3eaadc06 3f9918b6 -> 3f9918b6 3f0f3900 3f9918b6", + "3fc00000 3f73e7d3 bd25669f 3ea9adab 3f4f54d5 3f7ccb71 3f1a6f01 -> 3f73e7d3 3fc02e2f 3f3d3b16", + "bf000000 be72ac8b be72ac8b 3f95be61 3eed5d84 3f53767f 3f655fa8 -> bf165815 bf44bbf4 3f95be61", + "3e800000 3f85c61d 3f85c61d 3f465ab6 3f8e6126 3f8e6126 3f918b8f -> 3f87ecdf 3f87ecdf 3f5d89d0", + "3f400000 3f8ecd37 3eac7d2f 3e7522e6 bcff540f bddfb12d 3ea9588c -> 3f8ecd37 3eac7d2f 3e9da6c6", + "40000000 3f200dd7 3f88f1ef 3f200dd7 be4b084e 3ec30473 bc48e115 -> 3f200dd7 3f88f1ef 3f200dd7", + "00000000 3f2ba779 3dcffe11 3f2ba779 3f13c7c1 3f81be2f 3f81be2f -> 3f2ba779 3dcffe11 3f2ba779", + "3f000000 3f51729d bc95fd80 3f495f2f 3ee56d69 3f361ec7 3ee56d69 -> 3f51729d 3eb16edb 3f495f2f", + "3f800000 3f22c8cd 3f365f93 3f0c2782 bdb5d293 3e1545fc be3faea1 -> 3f22c8cd 3f365f93 3f0c2782", + "3fc00000 3f8c4241 3ef10543 3f8c4241 3ee553c6 3f5c2fad 3f5c2fad -> 3f8c4241 3f870319 3f8c4241", + "bf000000 3f9796e4 3f8e4767 3f8e32b7 3f03dc78 3f03dc78 3dec381d -> 3f9796e4 3f8e4767 3f8e32b7", + "3e800000 be095489 3f4c372f be095489 3f69f58e 3e9967bc 3eabd35f -> 3e02f627 3f4c372f bc88adb8", + "3f400000 be1b787a 3eb13585 3f4e2d17 3f4296b7 3f4296b7 3f899b48 -> 3f083982 3f2817ba 3f80fa19", + "40000000 3f65fe94 3f309bed be1072a8 bd04ab2f bd04ab2f 3f1a17fd -> 3f65fe94 3f309bed 3fac2652", + "00000000 3f74e4f0 3f74e4f0 3c983bb0 3f93ab76 3ebeef49 3e172679 -> 3f74e4f0 3f74e4f0 3c983bb0", + "3f000000 3f80f758 3f80f758 3f94483c 3f637537 3f449838 3d8079a8 -> 3f80f758 3f80f758 3f94483c", + "3f800000 bc366ed8 baaf20ba 3e2e457b 3d0e3b63 3e3c10cc 3e75a0ff -> 3d0e3b63 3e3c10cc 3e75a0ff", + "3fc00000 bc1fb770 3e163256 3e7a66dd 3f40e4cb 3f40e4cb bda98b3e -> 3f914b50 3f874873 3e7a66dd", + "bf000000 3edc514d 3eec7007 3df28dcd be0604e0 3ea298e4 be0604e0 -> 3edc514d 3eec7007 3df28dcd", + "3e800000 be6288a0 3eb9918e 3f806c6e bd6fd68b be7c1788 3f97523c -> be38e3e1 3eb9918e 3f8625e2", + "3f400000 3ef3f24a 3f0de520 3ead225a 3f83ca47 bdbc4de1 3f700a45 -> 3f642db4 3f0de520 3f49abff", + "40000000 3ed5f978 3e2699fd 3e2699fd 3eec7a8a 3f7b26f0 bdf5f0ed -> 3f017dce 3fe653b1 3e2699fd", + "00000000 3df32c59 3eea979f 3eb6618d 3f7633c8 3f9190e7 3f9190e7 -> 3df32c59 3eea979f 3eb6618d", + "3f000000 3e8db016 3f9d1c91 3da0efba 3e42efda 3f924bd0 3f19bde6 -> 3e8db016 3f9d1c91 3eaddbde", + "3f800000 bc8c680b 3f3a4273 3f9afdf7 3f800000 3f400000 3f400000 -> 3f800000 3f400000 3f9afdf7", + "3fc00000 bd84b5eb 3f1ec3a7 3f0a8f81 3f1f4444 3e856f9a 3e856f9a -> 3f7731c5 3f1ec3a7 3f0a8f81", + "bf000000 3e15f95b 3f059f3d 3f059f3d 3f800000 3f400000 3f000000 -> be8f84fc 3ed0ddb7 3f059f3d", + "3e800000 bdc3b547 3f06f486 3f06f486 3f7e96a5 3eee054e 3ebb0847 -> 3e3532aa 3f06f486 3f06f486", + "3f400000 3ef6b7c2 3ed127c0 3ef6b7c2 3f193317 bd1368ae 3e600db8 -> 3f11bd4a 3ed127c0 3ef6b7c2", + "40000000 3f28f6ed 3f94a2a1 3e26d28f be0bc43a 3e1eb44d be0bc43a -> 3f28f6ed 3f94a2a1 3e26d28f", + "00000000 3e7b7402 3e7b7402 3f8fe2c0 3f2a5b0e 3e4b97cf 3f8d4e25 -> 3e7b7402 3e7b7402 3f8fe2c0", + "3f000000 3e3c3571 bdb0ccb5 bdb0ccb5 3f64c1cc 3ee01291 3ee01291 -> 3f09e794 3e33df64 3e33df64", + "3f800000 3f4e11cd 3f5b87dc 3f4e11cd 3e08889c 3f363d61 3e08889c -> 3f4e11cd 3f5b87dc 3f4e11cd", + "3fc00000 3ee21a95 bca7d481 3ee21a95 3e800000 3f000000 3f800000 -> 3ee21a95 3f429f52 3fa3bcae", + "bf000000 3f1538e9 3f9b8519 3f9b8519 3f310ab3 3f83cac3 3f310ab3 -> 3f075004 3f9b8519 3f9b8519", + "3e800000 be76dad0 3f2de5bc 3f2de5bc 3f1e9730 3f7c599f 3c0c37c4 -> bcd46760 3f4182b5 3f2de5bc", + "3f400000 3f4523aa 3f4523aa bd1a5e9e 3f870859 3f753d4e 3f870859 -> 3f7bd570 3f6936e5 3f48230b", + "40000000 be2d21e2 3f9009b6 3bd5aa9a 3f163a2a 3ee894b0 3f025b55 -> 3fabde66 3f9009b6 3f8185ab", + "00000000 bc5b53c8 bc5b53c8 be67442f 3eeab215 3e4b81c5 3f91958f -> bc5b53c8 bc5b53c8 be67442f", + "3f000000 be1e2ba3 be1e2ba3 3d5437a5 3f145f61 3f55a8dd bcc39b9c -> 3e59a8f1 3eae1df4 3d5437a5", + "3f800000 3f0b1a89 3f2d2227 3e76c295 3e5f02da 3e862533 3e5f02da -> 3f0b1a89 3f2d2227 3e76c295", + "3fc00000 3f6cbf28 3f6cbf28 3f68199c 3f000000 00000000 00000000 -> 3f6cbf28 3f6cbf28 3f68199c", + "bf000000 3c60b2b9 3f87dc8c 3f3c24ad bdc70910 be7a0439 bdc70910 -> 3c60b2b9 3f87dc8c 3f3c24ad", + "3e800000 3dffe91b 3dffe91b 3f9ac9e7 3de09e04 3f5d64c0 3de09e04 -> 3dffe91b 3e9eae15 3f9ac9e7", + "3f400000 be7853e6 3f7dc165 3f2f4cf7 00000000 00000000 3e800000 -> bd7853e8 3f7dc165 3f2f4cf7", + "40000000 3e7cf9f7 3eee61d9 3f9e9d1b 3f33b605 3d229977 3f570a86 -> 3f9416c6 3eee61d9 3f9e9d1b", + "00000000 3f00e94d bdf0e575 3f00e94d 3f800000 3f000000 3f400000 -> 3f00e94d bdf0e575 3f00e94d", + "3f000000 3f261dc2 3f261dc2 3f3140b9 3dcccccd 3dcccccd 3dcccccd -> 3f261dc2 3f261dc2 3f3140b9", + "3f800000 3ea93e28 bde7906d 3dd074bb 3f241fd9 3ed8aa1b 3ed8aa1b -> 3f241fd9 3ed8aa1b 3ed8aa1b", + "3fc00000 bc128e47 bdc7772e 3eeaee24 be6ec9ae 3f26e069 be6ec9ae -> bc128e47 3f836408 3eeaee24", + "bf000000 3f756070 3f991229 3f756070 3f3e4d28 3f8e90ea 3f6d01fe -> 3f756070 3f991229 3f756070", + "3e800000 3f4432da 3f32b809 3f4432da 3e7ec8c7 3efa224b 3efa224b -> 3f4432da 3f32b809 3f4432da", + "3f400000 3c9b07d2 3c9b07d2 3f8517d6 3f0d203d 3ee4897a 3f16ee56 -> 3ed61c7a 3eadd33b 3f8517d6", + "40000000 3f77f44c be1b7d0b 3f77f44c 3f1fc638 3f1ea00a 3e2d7589 -> 3f77f44c 3fb20fac 3f77f44c", + "00000000 3e22fd33 3f66238d 3f66238d 3f800000 00000000 3f800000 -> 3e22fd33 3f66238d 3f66238d", + "3f000000 3f8ec2f6 3f30a7a0 3f30a7a0 3f732dc7 3f732dc7 3e3793ef -> 3f8ec2f6 3f51eab4 3f30a7a0", + "3f800000 3f958bef 3e6860a6 3e6860a6 3d13312b 3f5d3ea3 3f8685ea -> 3f958bef 3f5d3ea4 3f8685ea", + "3fc00000 3f28d20f 3e08cbeb 3f28d20f 3f51cae1 3f9aa50d 3f9d7928 -> 3f66474a 3fdf6ad5 3fc20138", + "bf000000 3f97ebef 3ec60236 3e9358b4 3f2b6dc2 3edaf3f6 3f2b6dc2 -> 3f97ebef 3ebb8956 3dc65d30", + "3e800000 3ef2f4b9 3ef2f4b9 bb9a1821 3ea1a231 be19b540 3f6aacf8 -> 3ef2f4b9 3ef2f4b9 3e671067", + "3f400000 3e86ad71 3e86ad71 3e91a943 bc362ca6 3ed74c57 3f71d73f -> 3e86ad71 3ec3249e 3f479698", + "40000000 3f9a54c5 bdb338ab 3f9a54c5 3eadfe74 3c900af3 3e0b56c6 -> 3f9a54c5 3dfb3e25 3f9a54c5", + "00000000 3ebab6a6 3f9a2578 3f761831 3f2c79f2 3f575482 3f575482 -> 3ebab6a6 3f9a2578 3f761831", + "3f000000 3c97fe7a 3c9a7d44 3c97fe7a 3f901d49 3f901d49 3f42bf0d -> 3f127d43 3f12873e 3ec77f01", + "3f800000 3de81e78 bd7fadd4 3ecbcbf5 3e6c8304 3f9023a2 3cab3117 -> 3e6c8304 3f9023a2 3ecbcbf5", + "3fc00000 3f63bcaf bb4b9123 3f9e131c 3f7a2105 3f563b16 3f563b16 -> 3f82a998 3fa0df34 3f9e131c", + "bf000000 3ea4bcc7 3f8c2770 3f303c41 3e285b0c bddb45be 3e51ba26 -> 3ea4bcc7 3f8c2770 3f303c41", + "3e800000 3f9f6e24 3f420b39 3f50367e 3f06d480 3e4f4126 3e3332e4 -> 3f9f6e24 3f420b39 3f50367e", + "3f400000 3f94e190 3f0f20d9 3e71ea47 3f9ab0bc 3f52bfd4 3f52bfd4 -> 3f993cf1 3f41d815 3f2d2e83", + "40000000 3ee527f3 3f817c5d 3ebb3c75 3ee0a79f 3f1e23d5 3ee0a79f -> 3ee527f3 3f817c5d 3f030964", + "00000000 be00e685 3eb2e280 be00e685 3f5cb247 3f8a50a7 3e24dc15 -> be00e685 3eb2e280 be00e685", + "3f000000 3f8ffc8f 3dcebe92 3f8ffc8f 3f3b806b 3e7b620f be6ad310 -> 3f8ffc8f 3e3160ac 3f8ffc8f", + "3f800000 3f62288b 3f62288b 3f10d751 bdcc5ae8 3f76bf1c 3f7854c7 -> 3f62288b 3f76bf1c 3f7854c7", + "3fc00000 3ec912e4 3ef80b99 3ef80b99 3ea54e0f 3f630bca bd987870 -> 3ec912e4 3f8b4764 3ef80b99", + "bf000000 3dd54abc 3e9927e2 bd9498cf 3f6c9b48 3e68692a 3e68692a -> be9c9f41 3e9927e2 be63a730", + "3e800000 3f420309 bb6a939a bbadaf73 3f4c1923 3f343cce 3f60c26e -> 3f448890 3e317d14 3e5cb051", + "3f400000 3f9410e4 3ea299e7 3f9410e4 3f66e295 3f552091 3f7a96d7 -> 3f9410e4 3f342baa 3f9410e4", + "40000000 bd96bf4c 3f95a917 3f065914 3f400000 3f400000 00000000 -> 3fc96bf5 3f95a917 3f065914", + "00000000 3ee58c4c 3f7bba26 bdc44e7b 3f5d4ef8 3f04e95c 3f414e05 -> 3ee58c4c 3f7bba26 bdc44e7b", + "3f000000 3ece2238 3f5895f8 3f5895f8 be1bd012 bcda316e be1bd012 -> 3ece2238 3f5895f8 3f5895f8", + "3f800000 3eb7b1f9 3e9059a7 3eb2e7af 3f8d2081 3f85238a 3f84ebda -> 3f8d2081 3f85238a 3f84ebda", + "3fc00000 3ecfde4d 3ecfde4d 3e59c3cb 393aa101 3df4e679 3f0b3565 -> 3ecfde4d 3ecfde4d 3f35979e", + "bf000000 be6dd91b 3e26b8c2 bde661b3 3f955206 3f18cc78 3f853d72 -> bf6e8370 bd5e0f34 bf306fc3", + "3e800000 3de802cf 3f8914c0 3de802cf 3e800000 3e800000 3f400000 -> 3e17010e 3f8914c0 3e8b8087", + "3f400000 3f52e16b 3f94ffe4 3e5c9e7f 3f5ef0a5 3f5702d0 3ded711a -> 3f5becd6 3f94ffe4 3e5c9e7f", + "40000000 3f96d1f3 3f17c48e 3f17c48e 3f81069e 3f3da311 be526b2b -> 3f96d1f3 3f638194 3f17c48e", + "00000000 3f68984c 3f525542 3f8e19ee 3f8dae88 3f6f7b6f 3f994148 -> 3f68984c 3f525542 3f8e19ee", + "3f000000 bda65685 3f89cd4d bda65685 bd3ad1be bd3ad1be be0cd1c9 -> bd81dfb2 3f89cd4d bda65685", + "3f800000 3f4e591a bd4f0f5b 3f083bb1 3eab27f0 3f36c623 3f6e3204 -> 3f4e591a 3f36c623 3f6e3204", + "3fc00000 be324460 3ee29eee 3c9c33b6 3f400000 3f000000 3e800000 -> 3f9b2446 3f075844 3ebb1e62", + "bf000000 bdcc5317 bdcc5317 3f039403 3f95ae12 3ebcbb08 3f87b128 -> bf3bfda6 beaafcad 3e76b372", + "3e800000 3f859b4c 3f859b4c be3723a0 3f1eefcf 3f1eefcf 3f8d69cc -> 3f859b4c 3f859b4c 3e1178e0", + "3f400000 3f8388aa 3f8388aa 3c481b63 3f908e52 3f3225c7 3f3225c7 -> 3f8d4ce8 3f8388aa 3f066471", + "40000000 3ea7784e bca06f79 3f84bbcd 3e40a601 bd22877e 3f8cf95a -> 3ea7784e bca06f79 3f9536e7", + "00000000 3f7b663c 3e45b89d 3f683c39 be013840 3f2ceff2 be013840 -> 3f7b663c 3e45b89d 3f683c39", + "3f000000 3eec506e 3f39215f 3f39215f 3e800000 3f800000 3f800000 -> 3eec506e 3f5c90b0 3f5c90b0", + "3f800000 bdf4772e 3f89abf3 3f89abf3 3f2f4312 3f8b95f7 3f8b95f7 -> 3f2f4312 3f8b95f7 3f8b95f7", + "3fc00000 3f5ffa67 be387ed3 bd55dacf 3e80426b 3d9176b2 3f524e3d -> 3f5ffa67 3e49586f 3fa1121a", + "bf000000 3e991b32 be155161 3e991b32 3f800000 3f400000 00000000 -> bd52b9a8 bf17fe84 3e991b32", + "3e800000 3ecb98a3 3ecb98a3 3ed1501f 3f805c26 be74ca41 3f0fa3e9 -> 3f0c8750 3ecb98a3 3ee4ce0c", + "3f400000 3f3b43b7 bd9ecfc3 3b831437 3f80e1c8 3ef1dc20 3d549766 -> 3f70239a 3eab781b 3d238a2e", + "40000000 3f805740 3e906744 be56846f 3f83c00c 3f9cc57e 3f412ee5 -> 3f8728d8 400ab896 3fdbff73", + "00000000 3f9535aa 3ec48d78 3ec48d78 be6294a9 3f7f697f 3f8543ff -> 3f9535aa 3ec48d78 3ec48d78", + "3f000000 3f2c0c5f 3de84e52 3de84e52 3ecbce30 3f71b99a 3f3d52bc -> 3f2c0c5f 3f0761b2 3eda5c86", + "3f800000 3f75c4a3 3f9ec1f3 3f75c4a3 3f762a5a 3f762a5a 3f8f719f -> 3f762a5a 3f9ec1f3 3f8f719f", + "3fc00000 3f59795b 3ed23e99 3d70b8b9 3f42c43b 3f42c43b be0cd1b8 -> 3f59795b 3f6f96b2 3d70b8b9", + "bf000000 3e03d637 3ed0647c 3f5eef13 3d7988b3 3f5443e7 3f4e27ba -> 3e03d637 3e48a5a6 3f5eef13", + "3e800000 3f180160 3f5aabbe 3d7f613c 3d1e4e40 3f55fcb0 3d1e4e40 -> 3f180160 3f5aabbe 3d7f613c", + "3f400000 3d4d2b51 bb15f3f2 bb15f3f2 3f000000 3f400000 3e800000 -> 3ec6695a 3f0fda83 3e3f6a0c", + "40000000 3f8de2d0 bd618b6d bd618b6d 3d5a6d64 3f22cdd9 3e3f7eff -> 3f8de2d0 3fa9da35 3edbb06c", + "00000000 3f8e2f1e 3f3fcdc5 3f3fcdc5 3f400000 3f000000 00000000 -> 3f8e2f1e 3f3fcdc5 3f3fcdc5", + "3f000000 3cc9eee1 3ea0928d 3f048a09 3f9d7c38 3d27941e 3f640629 -> 3f20a3f3 3ea0928d 3f344819", + "3f800000 3f2da653 3f2da653 bc84337b 3f007d6d be6d2c8e 3f007d6d -> 3f2da653 3f2da653 3f007d6d", + "3fc00000 3ee518af 3f97ccd2 3f97ccd2 00000000 3f000000 3e800000 -> 3ee518af 3f97ccd2 3f97ccd2", + "bf000000 3f9d95ce 3e31e7b6 3e31e7b6 3efd9a4c 3e838802 3f1c8d7b -> 3f9d95ce 3e07538f bd38fd94", + "3e800000 3e1e39d8 3f580c8e 3f659d6d 3f068a57 3eb3a6eb 3ef69752 -> 3e7d35b9 3f580c8e 3f659d6d", + "3f400000 be38583a 3f8ab142 3f4f77d7 3ee81e28 3ce804f1 3f815bdd -> 3e970b96 3f8ab142 3f75e7c1", + "40000000 3e473d6c 3f5ab34d bd824a0b 3f3a91a1 3f3ab5e7 3f3a91a1 -> 3fa1a9f4 3f5ab34d 3fc2b641", + "00000000 be0569cd 3ee53a63 3ee53a63 3f000000 3f000000 3f400000 -> be0569cd 3ee53a63 3ee53a63", + "3f000000 3e07b26d 3f38f863 3f38f863 3e800000 3f400000 00000000 -> 3e43d936 3f3c7c32 3f38f863", + "3f800000 3e609ae6 be54ef71 3dc113b1 bd2b5d52 3f168119 3f9865a7 -> 3e609ae6 3f168119 3f9865a7", + "3fc00000 3ed98437 3ed98437 3f1f9f9e 3eade6ef 3eade6ef 3f49ab4a -> 3ed98437 3ed98437 3f5eb120", + "bf000000 3e0f8b60 3f381526 3f381526 00000000 3f800000 3f800000 -> 3e0f8b60 3f141fb9 3f141fb9", + "3e800000 be449a37 3f8ad8b7 be4f9ff7 3ed4483b 3f394ff5 3f3861e4 -> bd253e30 3f8ad8b7 3ce54f58", + "3f400000 3d7b91c5 3f357f43 3f357f43 3f6e5e83 3f6e5e83 3f698005 -> 3f36b529 3f6026b3 3f5c7fd4", + "40000000 3edd689c 3e625310 3e625310 3f6990d8 3f6990d8 3f39e2de -> 3fb236b1 3fcd4676 3f9d987c", + "00000000 3f5ba9c3 3f85da2d 3f85da2d 3e9ce6bc be2a47e5 3e9ce6bc -> 3f5ba9c3 3f85da2d 3f85da2d", + "3f000000 bc911f6d be31a699 3f50b4c8 3f332403 3f455949 bdc03351 -> 3eae9b07 3e98efa2 3f50b4c8", + "3f800000 bdceebc8 3f844612 3f6a1ddb 3d835fea 3d835fea 3ea3cf64 -> 3d835fea 3f844612 3f6a1ddb", + "3fc00000 3f32a872 3ecc00b9 3f32a872 3f9c230c 3f1c2215 3f744239 -> 3fbd8a76 3f3732f2 3f8a878e", + "bf000000 3f90ebf3 3e42dda0 3f369e2c 3f632a10 3f7272a0 3f632a10 -> 3f90ebf3 be4098d0 3f20583a", + "3e800000 3ddcf403 3e390ec1 3f70297a 3f0cf7d6 3f21dd6a 3f0cf7d6 -> 3e5fd357 3e96543e 3f70297a", + "3f400000 3f8141fc 3f6a4d29 3e21b645 3db1589b 3d240d5f 3f79466b -> 3f8141fc 3f6a4d29 3f451035", + "40000000 3f31f5b5 3f854671 3f854671 3e61eacf 3f95f192 3e2d875f -> 3f31f5b5 3fa69cb3 3f854671", + "00000000 3e868ffe 3f96fe6a 3f55baac 3f5a319f 3f4d2ed5 be0e4068 -> 3e868ffe 3f96fe6a 3f55baac", + "3f000000 3f81d062 bd98b91f 3d8198a7 3ef377fa 3f88789a be375013 -> 3f81d062 3efdda10 3d8198a7", + "3f800000 3f1540ea 3f71c7ad 3f1540ea be410ee9 3f6d5d45 3f6d5d45 -> 3f1540ea 3f71c7ad 3f6d5d45", + "3fc00000 3f73133a 3d6df67c 3b21f73c 3e9e54e4 3f75a360 be0734fc -> 3f73133a 3fb482ae 3b21f73c", + "bf000000 be7f2d79 be7f2d79 3f164183 3e800000 3f400000 3f000000 -> beff621a bf3fb10d 3f164183", + "3e800000 3f86bc60 bd345c28 3f86bc60 3f4aaaed 3f4aaaed 3f522d5f -> 3f86bc60 3e28d9a6 3f86bc60", + "3f400000 3ebafd6d bdad002c bd85cad2 3e6ef880 3e6ef880 3f135ce2 -> 3ebafd6d 3e1d9a5a 3ed4aea6", + "40000000 3e14368e 3e14368e 3e5921fd 3f9d31b1 3f06e16f 3f9d31b1 -> 4013ee48 3f68b53a 400f9f91", + "00000000 3f8f30af 3ed364cc 3e4ba0a6 3f83ede6 3f01d621 3f01d621 -> 3f8f30af 3ed364cc 3e4ba0a6", + "3f000000 bdba94ba 3f008bc5 bdba94ba be4c88ba 3e770105 bda60adb -> bdba94ba 3f008bc5 bdb04fca", + "3f800000 3da9b634 3e676955 3f282ea3 3f2fea2b bd632784 3efb318f -> 3f2fea2a 3e676955 3f282ea3", + "3fc00000 3daa836f 3f822710 3d169fcb be42a30e be42a30e 3e7e09d0 -> 3daa836f 3f822710 3eb51d5f", + "bf000000 3ece56e9 bca15943 3ece56e9 3f830896 3ef97d1b 3ef97d1b -> 3dbdc4c4 be8bdeec 3eb8c3d0", + "3e800000 3be475a7 3f32c101 3f26e6b0 3f1bf27c 3f51b730 3f6b5e36 -> 3e214d3e 3f3a7e8d 3f380492", + "3f400000 be6880d1 be356cd5 be356cd5 3f421ac8 bdb4f79f 3f9e2aa9 -> 3f030c09 bde27022 3f61e931", + "40000000 3de97185 3bf415a6 3de97185 3ed827f6 3f68a5c7 3eddd31d -> 3f3af9c6 3fe7b1b2 3f40a4ed", + "00000000 be106f19 3f879678 3f80a751 3e800000 3e800000 3f000000 -> be106f19 3f879678 3f80a751", + "3f000000 3d0c3a29 3ef025c2 3ce81e74 3f5735f5 3f7aabdb bdf343c3 -> 3edff997 3f395f5e 3ce81e74", + "3f800000 3ed1dc3f 3eaa870d 3ed1dc3f 3f8548e7 3f943481 3f46472a -> 3f8548e7 3f943481 3f46472a", + "3fc00000 3f3386ff 3f5446b9 3f3386ff 3b585ca2 3f0e0332 3f913bcb -> 3f3386ff 3f5446b9 3facf7f0", + "bf000000 3f9c7d93 3ed0cfb1 3f9c7d93 3e4dfb2e 3e12b689 3e12b689 -> 3f9c7d93 3ed0cfb1 3f9c7d93", + "3e800000 3e18886f 3f445bb7 3f149784 3f36c25a 3f75e2d6 3f8b51d6 -> 3e949456 3f50bd7f 3f351a8e", + "3f400000 3eea96bc 3f1a8539 3eea96bc 3f3adf4b 3f9ebf56 3f3adf4b -> 3f297a50 3f8a6028 3f297a50", + "40000000 bd971640 3f2372d7 3f27baf9 3eb98581 3dc8f6be 3eb98581 -> 3f4c6849 3f2372d7 3f27baf9", + "00000000 3efa8bf1 3f0f39da 3f0136c8 3f2a2ea5 bd2cf629 3f1735b8 -> 3efa8bf1 3f0f39da 3f0136c8", + "3f000000 3e19357a 3f307540 3e19357a bda3446c 3e70c8f0 bd9e64b9 -> 3e19357a 3f307540 3e19357a", + "3f800000 3f33ab17 3f811b38 3f829a51 be30caa6 3f9c5378 be30caa6 -> 3f33ab17 3f9c5378 3f829a51", + "3fc00000 3f2be77a 3e1eeb39 3f79e376 3cb7ceeb 3cb7ceeb be099bce -> 3f2be77a 3e1eeb39 3f79e376", + "bf000000 3eadd66b be0b9da1 3eadd66b 3f2bb50a 3e5cb510 3f0061eb -> 3e32192d be9fe37c 3e845fb6", + "3e800000 3f7dae26 3f3dbf48 bd962196 3f8d012a 3f690f26 3f933f5b -> 3f826199 3f489340 3e6e321d", + "3f400000 be042a6a 3da31e1a 3ea94a64 3f99ffda 3e8d146e 3e8d146e -> 3f5ebd20 3e680268 3ea94a64", + "40000000 3e6ab730 bd1ae7e2 3f32e3e3 bd38fca9 bd38fca9 3f334405 -> 3e6ab730 bd1ae7e2 3f33a427", + "00000000 3f87f58d 3f87f58d 3d179dbd 3f309c02 3f5a1e54 3f309c02 -> 3f87f58d 3f87f58d 3d179dbd", + "3f000000 3f08d2b0 3f9006f1 3f123f6f 3f51ed5b be2f6044 3f51ed5b -> 3f2d6006 3f9006f1 3f321665", + "3f800000 3f5dce8b 3f5dce8b 3f925245 3f23098b 3f1e645d 3f23098b -> 3f5dce8b 3f5dce8b 3f925245", + "3fc00000 3f1e0699 3f0fa8bb 3e829095 be51ac66 3ce1e192 3f8e3f93 -> 3f1e0699 3f0fa8bb 3fc50d4a", + "bf000000 3ec65af1 3ec65af1 3c8db575 be800000 be800000 be800000 -> 3ec65af1 3ec65af1 3c8db575", + "3e800000 3e6e46bb 3f850549 3f850549 3f0d60a1 be7b0252 be7b0252 -> 3ea00ad6 3f850549 3f850549", + "3f400000 3f665e56 bd9c7a71 3efc9721 3f7baa64 bcbd16e1 3e8b15b1 -> 3f765760 bd1525cc 3efc9721", + "40000000 3f1f7deb 3f04c9b0 3f9d7afc 3eb09c0c 3f488de8 3f488de8 -> 3f1f7deb 3f862910 3f9d7afc", + "00000000 3ec29f7a 3ecbd9c6 3f77f4df 3f000000 3f800000 3f800000 -> 3ec29f7a 3ecbd9c6 3f77f4df", + "3f000000 3f9428ca bdd9a137 bdd9a137 3f000000 00000000 3e800000 -> 3f9428ca bd59a137 3d932f65", + "3f800000 3f8cbe2f 3df0482e 3f444b17 3f704f45 3f34df21 3f313f11 -> 3f8cbe2f 3f34df21 3f444b17", + "3fc00000 3f5ee76c 3f5ee76c be1f39d0 be0dc92f 3ec7441f 3e2cac04 -> 3f5ee76c 3f5ee76c 3ea94f77", + "bf000000 bddd35cb 3eb14cbd bddd35cb 3f2af1db 3f97a49f 3e1fc2a4 -> befde607 bd95588c be75c9aa", + "3e800000 3cc99cef 3cc99cef 3f4b7c22 3e63b2df be69877e be69877e -> 3d97a6dc 3cc99cef 3f4b7c22", + "3f400000 3ea75753 3f10977e bb21bdf7 3f4afe7c 3e9f22dc 3f960964 -> 3f2d29c8 3f10977e 3f60e5a6", + "40000000 3cf90bf6 3f8f3534 be3c1eba 3f24eee0 bdaf6c20 3eb4f9c7 -> 3fa10ab0 3f8f3534 3f640176", + "00000000 be0aa4f0 3e38f9a7 3f0854f3 00000000 3f400000 00000000 -> be0aa4f0 3e38f9a7 3f0854f3", + "3f000000 3f9181e4 3f9181e4 3eeb2051 3e6b196a 3e6b196a 3e73b483 -> 3f9181e4 3f9181e4 3eeb2051", + "3f800000 3f134e35 3f880731 3e9440f3 3f4295b6 3f08df1b 3f0da8a8 -> 3f4295b6 3f880731 3f0da8a8", + "3fc00000 3efe7ccb 3efe7ccb 3f342a97 3f51a469 3f855e2d 3e01c55c -> 3f7ad76a 3fa83daa 3f342a97", + "bf000000 3e93f62a 3e93f62a 3e308527 3f15b212 3af0caa8 3f15b212 -> 3e107e5a 3e93f62a bd0a71a4", + "3e800000 3e340990 3f6fd1eb 3ecd1454 bdcfe373 bd5158e3 3ecca1da -> 3e340990 3f6fd1eb 3ecd1454", + "3f400000 3f1b0663 3f6355ca 3f6355ca bd78112c 3ee23717 bd78112c -> 3f1b0663 3f6355ca 3f6355ca", + "40000000 bd41615b 3f62ba6c 3f57b0d7 3e800000 00000000 3f000000 -> 3f0c1615 3f62ba6c 3f57b0d7", + "00000000 3f3af184 3f86aafd 3f86aafd 3f5996f0 bde3149f 3f278de2 -> 3f3af184 3f86aafd 3f86aafd", + "3f000000 be2caee3 be16dc33 3f32d199 3f57d66d 3ee129b4 bd972c02 -> 3eacaab4 3e15bb9b 3f32d199", + "3f800000 3f1383b6 3f886b5a bdb070c1 3d0dbc9d 3f9af583 3e9f60b6 -> 3f1383b6 3f9af583 3e9f60b6", + "3fc00000 3eecb3a1 3f85c143 3f95081f 3f671cd1 3e180548 3e180548 -> 3f8fbf29 3f85c143 3f95081f", + "bf000000 3e80ae92 3e782061 3e7f95a1 bdffa7b8 3f4b19c6 3f898432 -> 3e80ae92 bd080bec be26b057", + "3e800000 3f608b2b 3f807fd1 3f5b6269 3e800000 3f000000 00000000 -> 3f608b2b 3f807fd1 3f5b6269", + "3f400000 be78671e be78671e 3f2b9d1c 3e800000 3f000000 3f000000 -> 3e01e638 3ea0f31d 3f2b9d1c", + "40000000 3f5da01a 3f946979 3f8582da 3f0a7840 3f9a5a35 3f050f2a -> 3f5da01a 3fa04af1 3f8582da", + "00000000 3f984a71 3e2e472f 3f984a71 3f7b7d4b 3e21c29e 3f7b7d4b -> 3f984a71 3e2e472f 3f984a71", + "3f000000 3f8247ec 3eb881df 3f5f2f03 3f039783 3f039783 3f836d75 -> 3f8247ec 3edfd872 3f7304f6", + "3f800000 3f320aa9 3f320aa9 3f9ad166 3f16920f 3f9e93b2 3f16920f -> 3f320aa9 3f9e93b2 3f9ad166", + "3fc00000 bd65aa0c 3f45a816 3f45a816 3f000000 3e800000 3e800000 -> 3f472d51 3f45a816 3f45a816", + "bf000000 3e0cb769 3f9d2c7b 3e0cb769 3efe17dd 3f18da0b 3f3f518f -> bd2c12fc 3f9d2c7b be2b9001", + "3e800000 3eb89c97 3dd58f4e 3f092b57 3f699f4e 3f10904d 3e157520 -> 3eff4518 3e60a60a 3f092b57", + "3f400000 bd3bd96e 3d5a7d63 3ed99314 3f400000 3f400000 3e800000 -> 3f0d109a 3f1369f6 3ed99314", + "40000000 3ec4bd6b bdd55aa4 3f99f06a 3f400000 3e800000 3f800000 -> 3f8ed0a5 3f1aab54 3f99f06a", + "00000000 3f9d72fe 3f26722e 3f3ee547 3f5df6b9 3ec75c80 3dae81ef -> 3f9d72fe 3f26722e 3f3ee547", + "3f000000 3ef5a1e7 3da50057 3da50057 3f3c4762 3cc84b6d 3f3c4762 -> 3f1b8c2b 3da50057 3ed0e76d", + "3f800000 3f954c19 3f954c19 3e816e07 3f000000 3f800000 3f400000 -> 3f954c19 3f954c19 3f400000", + "3fc00000 3e82be14 3f96fdce bcb31044 3f1995fd 3f1995fd be39a619 -> 3f45b176 3f96fdce bcb31044", + "bf000000 3f667b01 3eaebdd6 3eb6c4eb 3f9677de 3f7e269f bd819891 -> 3f4340a4 3c7ec440 3eb6c4eb", + "3e800000 3f70cbb4 3ea859b5 3f70cbb4 3e924bea 3e924bea 3e4179e4 -> 3f70cbb4 3ea859b5 3f70cbb4", + "3f400000 3ecf9e0f 3f7f8ee4 3f7f8ee4 3f820fbe 3efc09bf 3f859cd9 -> 3f5d0b5e 3f7f8ee4 3f84277f", + "40000000 3f4755f6 bdb9400f 3f4755f6 3f01f8e6 3f14e45e 3f01f8e6 -> 3f4755f6 3fa0785f 3f4755f6", + "00000000 3f2648f7 3e1ca166 3e1ca166 3f400000 00000000 3e800000 -> 3f2648f7 3e1ca166 3e1ca166", + "3f000000 3f8d9091 3e8bd36d 3e8bd36d 3ec2b19b 3ed82932 3e105869 -> 3f8d9091 3eb1fe50 3e8bd36d", + "3f800000 3ea5e2ba 3f6f867e 3ea5e2ba be6ecf4e be1af594 3ea382be -> 3ea5e2ba 3f6f867e 3ea5e2ba", + "3fc00000 3f342da4 3f4e1413 3f4e1413 3ed1fb5c 3ed1fb5c 3ed6306e -> 3f342da4 3f4e1413 3f4e1413", + "bf000000 3f34027d 3f6696c3 3f6696c3 3ef6247d 3f2ddcb7 bdaa63d3 -> 3f34027d 3f6696c3 3f6696c3", + "3e800000 3ed340eb 3e0d2f98 3f339d6c 3ed8248c 3e65ec7b 3f95578b -> 3ed479d3 3e235ed1 3f5161d6", + "3f400000 bd133e7e 3edcf10f 3efbe49f 3e14a3a4 3e6db4fe 3e9bdbdf -> 3dcc8da7 3edcf10f 3efbe49f", + "40000000 3ea583c7 3f01794d 3f01794d 3f2d7d23 bd688ff1 3ee58c93 -> 3f841c31 3f01794d 3f01794d", + "3f887f70 bbe0ee0e 3ee39bec 3f8c55c7 3f918160 3f5733fc 3ef251ef -> 3f9b3942 3f5def50 3f8c55c7", + "3f686d12 be09d10e be56692b 3d235bbd be37fced be37fced 3f7daf4f -> be09d10e be3aca1d 3f6743a5", + "3f856668 be69fb45 3ed29a99 3ed29a99 3f649c5c 3f3d0b90 bd89da7b -> 3f70b91f 3f4093fe 3ed29a99", + "be17f11b 3f62eb30 be25e937 3f84dcc7 3f29bc6d 3ece433e 3f0bd4d7 -> 3f62eb30 be7bbd62 3f84dcc7", + "3f9fd0bb 3ec0131e 3f8f1290 3e163b01 3d016254 3ed24133 3ed24133 -> 3ec0131e 3f8f1290 3ef3d838", + "3f5030e7 3f80f45e 3f92da41 3e60c1dc be420c65 3e148c01 3e148c01 -> 3f80f45e 3f92da41 3e60c1dc", + "bed4605c 3ec0c87b 3f52f1b4 3ec66aeb 3ecf0c0e 3f78846d 3ecf0c0e -> 3ebaddd1 3f435be1 3ec2d693", + "b8743319 3f8c4008 3f4b3360 3f4b3360 3e21ca8e 3f4c5f53 3e9ac03c -> 3f8c4008 3f4b335c 3f4b3360", + "3f9da9c6 3edfcb62 3f748dc6 3e29eb1f 3f6f8840 3eb86695 3d1c0772 -> 3f868e2f 3f748dc6 3e29eb1f", + "3fb90d34 3f400477 3e6a60d9 3e6a60d9 3f40a738 3f362a52 3f40a738 -> 3f40efc3 3f6d3e22 3f7c67bb", + "befae299 3e340a3e 3f95376e 3e340a3e 3f419738 3ed6bcca 3ed6bcca -> bdde5e44 3f95376e 3d6741f2", + "3f93d643 3f5185cc 3f8a7c4d 3f8e3146 3f91dbd6 3efa834c 3f048335 -> 3f983a55 3f8a7c4d 3f8e3146", + "3f3f114a 3f3c7a7d bd11a0c6 3f5a317f 3e8bd5ff 3ef9b334 3f9a2b92 -> 3f3c7a7d 3eb5bf91 3f8ebcd6", + "3f83c17a be32ab41 3f44ef79 3f44ef79 3f000000 3f800000 3f000000 -> 3f0510ff 3f80ddd5 3f44ef79", + "3e26a29e 3f5d6f44 3f6cc443 3f5d6f44 3f4e97cc 3e825abe 3f4e97cc -> 3f5d6f44 3f6cc443 3f5d6f44", + "3ee88276 3f2f78e2 3eccc61d 3f2f78e2 3f267f88 bd0bb134 3f267f88 -> 3f2f78e2 3eccc61d 3f2f78e2", + "3fbe26ce 3e25d610 bdda8b23 3e25d610 3eb808f7 3e367fd0 3e367fd0 -> 3ee9221e 3ea215f0 3e3e9716", + "3f013711 3f8c6bc8 bdc12b2d 3f8c6bc8 3e7df2a5 3f4de6ef 3f4de6ef -> 3f8c6bc8 3eb7f09b 3f8c6bc8", + "bea5a1d2 3e77c507 3e77c507 3f4466ca 3f1bbf6d be227a37 bdcb3583 -> 3dfcc559 3e77c507 3f4466ca", + "be737268 bd92355c be598e70 bd92355c 3be852a8 3f8d8473 3f8d8473 -> bdb86b94 bf069bce beb3d1ef", + "beca0055 3f88020f 3c3e4f69 bde5d2c2 3e8bce59 3f108009 3f35a64c -> 3f88020f be53741f bedf7538", + "3f32d258 3f87300f 3f4df653 3f4df653 3f7c8e94 3f5d170f be045ff5 -> 3f87300f 3f588784 3f4df653", + "3f118ded 3edaf32b 3ec233a1 3edaf32b 3f000000 3f400000 00000000 -> 3ef003fa 3f170ece 3edaf32b", + "3f41aba2 3eb2fef9 3f8687b1 3f8687b1 3f963564 3e8c3537 3f4e4c39 -> 3f79104a 3f8687b1 3f8687b1", + "3e8c52e0 3f0f49d3 3f6e66dd 3f34bfae 3f57200d 3f57200d 3f59dde0 -> 3f22fa08 3f6e66dd 3f3eebf2", + "bea2857a 3f3ce292 3e44add4 3e3f2768 3f10cb2c 3e568fd1 3e568fd1 -> 3f3ce292 3e3f00a9 3e37b945", + "bcfd9170 3f658c1b 3f9ff737 3ea927f2 3e23e4af 3e23e4af 3ed3aec2 -> 3f658c1b 3f9ff737 3ea7d6f7", + "3f847e02 3ef6fe8f be0223c2 3e442fdb 00000000 3f000000 3f400000 -> 3ef6fe8f 3f05a250 3f45045b", + "be36e131 be18403e 3f8580fa 3f8580fa 3f1f7cef 3f162c07 3f543e05 -> be92b020 3f8580fa 3f8580fa", + "be97d265 3ed0a55a 3ea7c9ae 3ea7c9ae bdd7c3d5 be4c1c49 be4c1c49 -> 3ed0a55a 3ea7c9ae 3ea7c9ae", + "3ee3e82f 3f24edcf bd7d8a24 3f81c8e0 3f32c8d8 3f32c8d8 3d7c09c1 -> 3f2b18b4 3e8d9470 3f81c8e0", + "3f8e404b 3dba2b34 3f5d9220 3efe1649 3e5f2266 3d8dae4d 3f4247e8 -> 3e6d9d1f 3f5d9220 3f49c453", + "3fb6c2e2 be183ffa be183ffa 3f822086 3f400000 3e800000 3f000000 -> 3f913683 3ed75447 3f822086", + "bed386b1 3f071213 3f37da53 3f071213 3f87221a 3f87221a bcccb7e8 -> 3e9e6eb3 3f1426f5 3f071213", + "3ea9b89f 3c431597 3e0fde9f 3e0fde9f 3efc59f4 3f46aa31 3f46aa31 -> 3e2f7409 3eb3cc82 3eb3cc82", + "3f5aee78 3df3f0fa 3f078000 3f89256b 00000000 3f400000 3f000000 -> 3df3f0fa 3f37d1a2 3f89256b", + "3f43a00c 3f644a9a 3f644a9a 3f8d720e 3f21c020 3f8bea99 3f353e92 -> 3f644a9a 3f85d6b2 3f8d720e", + "3fb9bb39 3f6a9080 3f9696c5 be0b2c1c 3e31ca67 3e31ca67 3ed8b688 -> 3f6a9080 3f9696c5 3f2cebb3", + "be10d408 3f844b70 3d622930 3f538162 be29ce6e be29ce6e 3f8b7da7 -> 3f844b70 3d622930 3f49f644", + "3fb526e6 3d92a573 bdf8c5a7 bdf8c5a7 3f90c57f be123eb9 3f90c57f -> 3fc914f3 bdf8c5a7 3fd3581b", + "3f9c1fc8 3f639812 3ecfb83c 3f05fb37 3f7f82e7 be599e59 3f7f82e7 -> 3f82d29a 3ecfb83c 3f8d1b61", + "3e647f97 3f9f920d be01abb1 3e817a69 3eb0e242 3f25c808 3eb0e242 -> 3f9f920d 3d3cf1e0 3e8c0e70", + "3f8ff832 3f690f5d be686ff1 3f8b3db6 3f800000 3f000000 3f000000 -> 3f816e57 3f173826 3f8b3db6", + "bebcfe08 be1cd603 3dc8603f 3dc8603f bca7f694 3e6b4eb9 be09bb1c -> be4efa6c 3d493f63 3dc8603f", + "3f18ea11 3e953d12 3eb6512a 3f907e25 3eeda540 3eeda540 3f850b42 -> 3eca0bc2 3ed75dae 3f907e25", + "3d3a9bba be0c0c14 3f5228d2 3f8e8197 3f6d02e2 3ed1fd2d 3f6d02e2 -> bdb4f346 3f5228d2 3f8e8197", + "3f8417b3 3ef80df0 3f4dd239 3d5a03de 3f7c8272 be73655d 3bfeb1db -> 3f804f0c 3f4dd239 3d5a03de", + "3f22bc93 3f376c7c 3f74649c 3f96977c 3f400000 3f800000 3f800000 -> 3f3ce027 3f7bc57e 3f96977c", + "3ce9b52f 3eefdf89 3f9dec39 3f9dec39 bd256426 bd256426 3eba08c5 -> 3eefdf89 3f9dec39 3f9dec39", + "3fa903f2 3f946174 3f9d3f55 be368af2 3e800000 3f800000 3f400000 -> 3f946174 3f9d3f55 3f8612ba", + "3f40df80 3b74325e 3b74325e 3f984ad5 3f2ee11b 3f2ee11b be0605b2 -> 3f03fdb9 3f03fdb9 3f984ad5", + "3f5acad6 3e8044d0 3e292421 3e292421 3f0c96d2 3f0c96d2 3f88ec79 -> 3f017a1e 3efc9a54 3f70310e", + "3fb20fea 3f70c1f4 3f98bf45 bd7f1fd3 3f400000 3f000000 3f000000 -> 3f70c1f4 3f98bf45 3f384c6c", + "3e0b2b88 3f1c2483 3f1c2483 3d1a11f0 3d51f4bd bdbb4583 3f841155 -> 3f1c2483 3f1c2483 3e30e019", + "be5af218 3ea72a7f 3f87cb39 3ea72a7f 3d92fdce 3f535abe 3f9e134d -> 3ea72a7f 3f87cb39 3e076d48", + "3ebea372 3f44abab 3eaec424 3eaec424 3f741151 3f7661dc 3dc6d00a -> 3f565185 3f1295c0 3eaec424", + "3f366d69 3f285eb8 3f285eb8 3eab87f7 3f932a2b 3f0b9d45 3f932a2b -> 3f811096 3f285eb8 3f6a63be", + "3c3ba8f4 3d917d76 3f9921aa 3dc415ad 3ea970b5 3f63a09d 3ea970b5 -> 3d97962e 3f9921aa 3dc99a0a", + "3fb315d7 3f1cbd58 bde79ee5 3f1cbd58 3d6c12ab 3f8ba028 3f585792 -> 3f1cbd58 3fc920d8 3f702130", + "3fb53a94 3f5b91cf 3f29dfe1 bdbd0441 3f8f82e8 3e93f0ef 3eeb04f4 -> 3f9d895c 3f29dfe1 3f303390", + "3eb2ad9d 3f922288 3efab51e 3f922288 3f493798 3e9fc99f 3f493798 -> 3f922288 3efab51e 3f922288", + "3e5e41e1 3f0cdba4 be1a8984 be1a8984 be2473c3 3f0f83e6 3f0f83e6 -> 3f0cdba4 3b66a340 3b66a340", + "beedb8f4 3f843bdb 3ec5216c 3f4b7957 3f000000 3f000000 3f800000 -> 3f843bdb 3ea9cc20 3f331608", + "3eee9ba1 3f13ced1 3f13ced1 3f2df4d7 00000000 3f800000 3e800000 -> 3f13ced1 3f463a91 3f2df4d7", + "beb40f23 3f101fb0 3f101fb0 3eefda33 be070586 3f9e9c08 3f9750fe -> 3f101fb0 3ea68000 3e5eb06e", + "be311657 3f976c3c 3d9f3f4a 3f852dca 3eb1fced 3ee4cd51 3f85ee48 -> 3f976c3c 3c641c40 3f850c80", + "3e3c792e 3f8de4bf 3f2f162b 3efc77d6 3e9db0c9 bde1576f 3f064017 -> 3f8de4bf 3f2f162b 3eff6b44", + "beacf0ce 3f837770 be508056 be508056 3f63eb18 3f8dec08 3c781271 -> 3f837770 bf259b76 be8e1518", + "3e59c35e 3f9a9f97 bcf0721b bdf389a9 3f3998fb 3f5353f1 3f0c39e6 -> 3f9a9f97 3e1c196d 3cbb43a4", + "3ee3ca5a 3f5b1323 3e06447e 3ecfe82f 3da59579 3f755104 3f755104 -> 3f5b1323 3eff8cc6 3f26d8a9", + "3fb87107 3f9696f0 3f0ee363 3f48e757 be669062 3e31c639 3f347bd9 -> 3f9696f0 3f0ee363 3f48e757", + "be9112e4 bde85fb4 3daa8119 be158172 3e919915 3ea6a22f be0f7105 -> be679e24 3c6fa510 be173952", + "3ec8105f be16e2bc be16e2bc 3e38ce5c 3f76a42b bd08477f bdc93549 -> 3e92c95c bdd27ad4 3e38ce5c", + "3ea39e33 3f3eba13 3f269f5b 3e104b59 3f054d06 be64606b be64606b -> 3f3eba13 3f269f5b 3e104b59", + "3fb831f5 be24c992 be24c992 3f8986c9 3f000000 3e800000 3f000000 -> 3f4a4814 3edc5e35 3f8986c9", + "3f8ebacb 3f0afe40 3f811207 3f0afe40 3f8e7a71 3e61f940 3e61f940 -> 3f96e06f 3f811207 3f0afe40", + "3ef01114 bc8b973e bc8b973e 3f8bd532 3f7eaad2 3f803336 3f803336 -> 3eea2ee7 3eebcee5 3f8bd532", + "be115596 3ef78278 3f4332f9 3f80899b 3f7a3c11 be1c7ee0 be1c7ee0 -> 3ed39b8a 3f4332f9 3f80899b", + "be10eb1f 3f88141a 3f88141a 3f6077e9 3f5f8484 3f5f8484 3f8ac1fe -> 3f88141a 3f88141a 3f58f608", + "be0f26ef 3f8a602d be7905c7 be7905c7 be2f772d be2957af 3f132f1d -> 3f8a602d be8214af beb711c0", + "bc7ebaff 3e2d8e99 3f07b28d bc3260dc 3f9916d0 3f960dc0 3e06cf4f -> 3e1d36d3 3f05242c bc56afe0", + "be7fe49c 3f70dbfa be110a96 3db5ff2f bd2152bd bd2152bd 3e6be954 -> 3f70dbfa be2b3543 3d5b2423", + "3eba6546 3ef377ee 3ef377ee 3f5d8ce1 3e0063b2 bd8b30d8 bd8b30d8 -> 3ef377ee 3ef377ee 3f5d8ce1", + "3f526daf 3f63f518 3e0e2371 3ed8f7c3 3dabddcc 3dabddcc 3edfc04a -> 3f63f518 3e0e2371 3ede8b2a", + "3f827dca 3f225790 be11afbc 3efd4b9e 3f3dee38 3eba259f be00c203 -> 3f3e77af 3ebf3018 3efd4b9e", + "be2ee85b 3f173050 bdc3e589 3df82f22 3f6a57b9 bddad5ad 3f6a57b9 -> 3f08fc3f bdc3e589 bc6d2980", + "3fbd6ed0 3f831249 3ec49abf 3ec49abf bd98cf38 3f93343a 3f1f62e0 -> 3f831249 3fc24391 3f3cb401", + "3e865109 3ef97ae3 bd9bccd2 3f831b15 00000000 00000000 3f400000 -> 3ef97ae3 bd65db1d 3f831b15", + "3fa589ea 3f9fb4b1 be6fc6d9 3f007b15 3f860b69 bdabef90 3f147abc -> 3f9fb4b1 bd2370d0 3f1a582e", + "3f405057 bcf76769 3f8a61e5 3f25c078 3f400000 3f400000 3f400000 -> 3f0e4fe0 3f8a61e5 3f39785b", + "3f4d1243 3ee1f0f2 3f5d4649 3f7a7d48 3f68d52f 3f82af1b 3f68d52f -> 3f50fcc4 3f7d644e 3f7a7d48", + "3fbf3d85 3f989763 3f989763 3f889bba 3e96f73e 3e5d73c2 3e96f73e -> 3f989763 3f989763 3f889bba", + "3f580ef6 be501ee1 be501ee1 3dcbc9fd 3dcbe1b0 3f3fd977 3f1bc290 -> 3d564204 3f19cc88 3f076eb8", + "3f6af353 be32dab6 be32dab6 3e729773 3f14ca64 3f28cf7c 3f14ca64 -> 3f04e13a 3f1740e8 3f0d8b07", + "3fb12cc0 be1cc3ce be7582a2 be1cc3ce 3f4ebf6d be7edf4c 3f4ebf6d -> 3f969db6 be7582a2 3f969db6", + "3f142bcc 3f920629 3f7b9ac0 3f920629 3f9de038 3d930fba 3f894080 -> 3f98e241 3f7b9ac0 3f920629", + "3e17e30a 3e47900d 3e95f0fe 3e95f0fe 3f800000 3f800000 3f000000 -> 3ea0ecad 3ecba4fb 3ea5ac38", + "3fa59d5e 3f0e61c4 3e6f33dc 3c5749e0 3e6c0728 3f607e20 3f900e99 -> 3f0e61c4 3f8871e8 3fb9e565", + "3edc3544 3f7c42ce 3e7cef94 3f186244 3e6ba269 3e8e888d be2972ce -> 3f7c42ce 3e8560aa 3f186244", + "3f97507c 3f77e95a 3f06f8a1 3f06f8a1 3eb43420 3eaf4cda 3f3a402f -> 3f77e95a 3f06f8a1 3f439749", + "3ea4509b 3ed59a00 bde67bcb 3f9ee66e be1b8e3f be1b8e3f 3f3ce1c0 -> 3ed59a00 bde67bcb 3f9ee66e", + "beab4459 bcb47dfb bcb47dfb 3defc346 3f33793b 3f30e53a 3f09bd08 -> be871fc8 be85663b bcc284a8", + "3e992e00 3bb95d07 3f9268de 3bb95d07 3f64de86 bdc27c2c 3f64de86 -> 3e8af9be 3f9268de 3e8af9be", + "be8b2fc3 be593039 3eccc657 be593039 3ef28ed8 3f816396 3e892287 -> becc0df2 3e6f7dbb beaf6534", + "3e6973bc 3f488408 3d471068 3e52c2c9 3f400000 3f800000 3f400000 -> 3f488408 3e87efac 3ea8e679", + "3faaa614 3eee60d8 3eee60d8 3f80e9ec 3f855382 3f54f029 3ebea0cc -> 3f9de4a2 3f742cb6 3f80e9ec", + "bd035926 3e47876f be7275dd 3f088b36 3d95343b 3d95343b 3f36726c -> 3e47876f be7ca0b6 3f071261", + "be2ca5e1 3f9ae51d 3f404894 3f9ae51d 3ec5a7c8 bde2942a 3f8694c0 -> 3f9ae51d 3f404894 3f9ae51d", + "3f81705d 3f2d523a bdf5326e bdf5326e 3f826b07 3f90566c 3f90566c -> 3f82e8f4 3f9221e8 3f9221e8", + "3d853fa5 3f7f2c2a 3f712cd5 3f54937c 3f8ab1a0 3eb3adf8 3f8ab1a0 -> 3f804f17 3f712cd5 3f58cafe", + "3f16746c be0c2598 3e8844d0 3f058735 3c727778 3e986ab3 3c727778 -> bd437f40 3e91c25b 3f058735", + "bdf24f39 be1dd6ec 3e128506 3e128506 be3c336e 3f6d7e39 be5e803d -> be1dd6ec 3d4dd602 3e128506", + "3eb6c3db 3e34d65a 3f6694d2 be39744d 3ead16f8 3e80a87d 3e80a87d -> 3e6fdbbc 3f6694d2 bcdb3668", + "3ef564cc be7bdd30 3e469472 3f831aef 3f4dcd08 3e59db56 3f21d042 -> 3e83b320 3e4fd1aa 3f831aef", + "3fa5ebd1 3e5fafd3 3f2823da bdaa770d 3f4ee541 3f86e506 3f86e506 -> 3f7b9f75 3f95f3ae 3fb203c6", + "bce3c6be 3f5ee421 3f5ee421 3e678fc6 be5e49be 3f9e14b5 3f8e7214 -> 3f5ee421 3f5c4c3a 3e4e5099", + "3e6dbfaf 3e65dd22 3f414768 3f434977 3f369c92 3f511427 3f88d4c7 -> 3ead0b2e 3f44f280 3f557be0", + "be86dd9a 3f9f1e04 bd55d5b4 bd55d5b4 3d9a024f 3d9a024f be57e8e5 -> 3f9f1e04 bdafa5da bd55d5b4", + "3f9af4e2 3f9eaec9 bdc10f11 bdc10f11 be07ef19 3e89a963 3eed1f86 -> 3f9eaec9 3eb0d143 3f149cd7", + "3f58040c 3d9342e4 3d9342e4 bdc3315b 3da66442 3f86a0f5 3f3bdb49 -> 3da36759 3f6613e4 3f1ab46a", + "be2f8dbe 3ed16250 3f739be7 3ed16250 3f800000 3f800000 00000000 -> 3e9d80fa 3f717c15 3ed16250", + "be31e74f 3f2f26a6 3e9b8b02 3e34fac8 3f2645a1 bbff6116 3ea7f96d -> 3f2f26a6 3e9b8b02 3e1a0e66", + "3fb01685 3f286439 bdcd7121 3d39dd94 3f800000 3f800000 3e800000 -> 3f9074ea 3fb4e96e 3ea75c0c", + "3e8377df 3de14804 3f8e159a 3f39ebf7 3f1ee921 3f217b3d 3f217b3d -> 3e76ef15 3f8e159a 3f39ebf7", + "3f591def 3efc30b0 ba419c77 3efc30b0 3ebab875 3e7068e9 3e7068e9 -> 3efc30b0 3e4bc7a2 3efc30b0", + "3f691377 be42aaba be42aaba 3f9215a8 3e469da5 3f2c58ea 3e469da5 -> 3e23660c 3f188e64 3f9215a8", + "be879519 3ee4b7e0 3ee4b7e0 3dc897a4 3f79957c 3f6c27b4 3f420e85 -> 3e9d19c6 3ea4367c bd9d64ac", + "3fb236c9 3d108076 3ed9cbbf 3d108076 3f800000 3f000000 00000000 -> 3fb07149 3f077e62 3d108076", + "3f0876c6 3f34f63f 3b961f30 3f831a96 3eaef9a8 3f9a535a 3f9a535a -> 3f34f63f 3f2513f5 3f8f7b84", + "3edcbb10 be3f17d3 3ef6b00c 3ef6b00c 3d71ed03 3f5346e3 3f5346e3 -> bda5456d 3f2140ca 3f2140ca", + "3f927c19 3f700016 3f94e20e 3f700016 3f5f3258 be723051 3f68fe48 -> 3f700016 3f94e20e 3f700016", + "be96c4d4 bddc0e1b 3ea79843 bdbcb48b 3f0040be 3e7aad96 3f9f2d44 -> be92bf40 3ea79843 bef88f50", + "be199d55 3f1def49 3f2cbe0e 3f1def49 3f7313d3 be072fce be7d924a -> 3f11297e 3f2cbe0e 3f1def49", + "3ebd82f5 3f706cdf 3f9ac471 3f1fad7f 3f000000 3f400000 3f000000 -> 3f706cdf 3f9ac471 3f1fad7f", + "3f761d4a 3e661d31 3eaafcb3 3eaafcb3 3f400000 00000000 00000000 -> 3f3aceac 3eaafcb3 3eaafcb3", + "be24d287 3e484e0a 3f02bb15 3f8d2668 3f3c7928 3f9a915a be5ca642 -> 3dde6637 3ecc079e 3f8d2668", + "3e9f97f7 3f62a28e 3f466e46 3f62a28e 3f000000 00000000 3f400000 -> 3f62a28e 3f466e46 3f62a28e", + "3e564469 be27df91 3ec6140f 3ec6140f 00000000 3f400000 3f800000 -> be04bf21 3eecfb4a 3f03e1eb", + "3e9934e9 3f9bfcfd 3ea6722e 3ef17602 3f37aa92 3e5e8cef 3f8d416c -> 3f9bfcfd 3ea6722e 3f2923f1", + "be8b68c1 3f8d82f2 3f82e16a bd2db6a4 3f9ca37d 3d14382b bd443eda -> 3f896484 3f82e16a bd2db6a4", + "3ebfd311 3e8e9d6e 3ec07e89 3eed5f31 3ebf1407 3f9a1871 3f9a1871 -> 3ea0c5a6 3f2fa746 3f3daf72", + "3e5dab37 3ed525ae 3ead92aa 3f807f67 3ea0a02e 3ef157af 3ef157af -> 3ed525ae 3ebc3e44 3f807f67", + "3def5f74 bdb1d706 3f3f6e5f 3f3f6e5f 3eb69109 3e927bad 3eb69109 -> bd0f660f 3f3f6e5f 3f3f6e5f", + "bef3e612 bdb876da bdb876da 3f380ff9 3f400000 3f400000 3f800000 -> befb0216 befb0216 3f15cb3a", + "3d4e840d 3f8e5af6 bb631f39 bb631f39 3f7c0294 3ea62680 3ea62680 -> 3f8e5af6 3c562670 3c562670", + "bea22091 3f807324 bd62a425 3f807324 3e800000 00000000 3e800000 -> 3f807324 bd953440 3f807324", + "3ed3a0f1 bdc91a93 bd775067 3f14e0ec 3dba7ff2 3f4b2a62 3f234e3d -> bca3923c 3e95d0c7 3f1ad782", + "bc7fe206 3f89a5f3 3e78faef 3cf018e7 be5a62d5 3e32bbe1 3dd1ecf5 -> 3f89a5f3 3e78faef 3ce6bb94", + "3fa17101 3f085da6 3eb22728 3f085da6 3f83ef4a 3f865321 3f83ef4a -> 3f949731 3f9dc84e 3f949731", + "bea09ccd 3f56ac25 3f11fea7 3e26d31e 3e316ba5 be66e168 3e8ff11a -> 3f56ac25 3f11fea7 3e00d954", + "3f6e81e4 3f1f7e2b 3f6556a0 3e851977 3c83d22b 3c83d22b 3f469074 -> 3f1f7e2b 3f6556a0 3f3d8b2c", + "3fb15530 3e771525 3f220b65 3f787950 3f2f5fd2 3f162046 3f162046 -> 3f5b2896 3f220b65 3f787950", + "3df6fbfe 3ed9eff9 3f1814e5 3ed9eff9 3f7e136d 3f7e136d 3f4f7347 -> 3efcefc6 3f2461c5 3ef1b0d4", + "3e155a6f 3f8533b3 3e264acb 3f81e7ff 3f796acf 3f9184ca 3f9184ca -> 3f8533b3 3e9bea8e 3f842ef1", + "3fb3c29a 3f527234 3f59f152 3f888eea 3f355733 be77f74b 3f630a3b -> 3f527234 3f59f152 3f888eea", + "3f1fb0bd be0497fe 3f9b0d20 be0497fe 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3e230998 3f9b0d20 3e230998", + "bebda05f 3b9c00d7 3f36310c 3de58bba 3f211d3e 3e82bfb0 3f684374 -> be6800c9 3f36310c be3acec1", + "3f85badd 3f27fd05 3f961246 3f6be8da 3d927274 3f9adb08 bd9a0bd4 -> 3f27fd05 3f9b11dc 3f6be8da", + "3f6dc703 bc645faf bc645faf 3e3a527e 3f1d6492 3f3d7d83 3f44a076 -> 3f11ef70 3f2fbf7b 3f39f23a", + "3fa82292 3f0952ea 3ee02182 3f0952ea 3d704538 bdeff660 bdeff660 -> 3f0952ea 3ee02182 3f0952ea", + "3e37a9a7 bd772e2b 3f851f82 3f3a5109 3f141cda 3f141cda bde8c381 -> 3d5e3267 3f851f82 3f3a5109", + "be8cc782 bcd57f1c 3f4ec2bd 3e4cd4c7 3e8c492e 3f6f0b8c 3e227ab8 -> bdde5777 3f45e240 3e4cd4c7", + "3fa26712 3f54fe3f 3f54fe3f be373781 3f816a23 3f95c73e 3f95c73e -> 3f879304 3fa16940 3fc4308f", + "3ec2d78d 3ecc6bf2 bdee379e bdee379e be1b3a50 be3e8ca5 be3e8ca5 -> 3ecc6bf2 bdee379e bdee379e", + "3f6876ce 3e8cf26e 3f8599fe 3ed33d93 3f000000 00000000 3f800000 -> 3ef56c1f 3f8599fe 3f722cac", + "be6fafc9 3e7369a2 3e7369a2 3f264d2f 3f9f8bb1 3f8cf892 3f9b918e -> 3ad0b100 3d11a660 3f046664", + "3f0afa42 bd4ba2f8 bd4ba2f8 3f436981 be726d10 3ee99f7e be726d10 -> bd4ba2f8 3e666334 3f436981", + "3f4f0d1e 3f8e4c6f 3ea66aad 3f90167e 3f4a5cba 3ec540e8 3f7649f3 -> 3f8e4c6f 3ebf5b7b 3f90167e", + "becc2d95 3f660335 3f660335 bcfd19c8 3f5cf754 3f3dc500 3f098fd7 -> 3f660335 3f660335 be83d7a7", + "3ed8d3e8 3e7c5abf 3f85974b 3f85974b 3f1152cc 3f4cf73f 3f9ede50 -> 3ec3d429 3f85974b 3f904bb7", + "be10a20c 3e2d1ef5 3f8b14c0 3e29406f 3f6626db 3ede21e2 3f6fec37 -> 3d871654 3f8b14c0 3d666e28", + "be997108 3ee8c184 3ee8c184 3f508b61 3f4ad0ca 3e11cb7f 3ee890c8 -> 3eb4f265 3ee8c184 3f508b61", + "3f944e91 bd120ca1 3f374a01 3e34249a 3f583b98 3e0a3edc 3d9a4c35 -> 3f7bfc5a 3f374a01 3e34249a", + "3f04c55a 3f7a34b5 3f4e0982 3f6632f1 3d0cdb1c be4cfc0f 3d0cdb1c -> 3f7a34b5 3f4e0982 3f6632f1", + "be7aeebd 3ed3988f bc1089a6 3ed3988f 3f4bde31 3ec3b5ce 3f63c9a8 -> 3ea38816 bdd654ad 3e97cef5", + "3f9ccf10 be000cd8 3e883934 3f437c59 bbd9ffae bbd9ffae 3f438a0e -> 3ca3cb90 3e883934 3f438d24", + "bec05579 3f2319f9 3e4c487e 3f4e6446 3f91839a 3f01785f 3f299469 -> 3ee61750 3dacf589 3f4e6446", + "becf6d15 3f4bf658 3f8e3efa 3f4bf658 3f000000 3f800000 3e800000 -> 3f4bf658 3f8e3efa 3f4bf658", + "3f9a0b8d 3e5fae77 3f273156 3f273156 3f8c1912 3f8c1912 3f46570e -> 3fa2ea5a 3f979840 3f4cad87", + "3f32abfb 3ea75266 be1237c9 be674fb7 00000000 3f800000 3f400000 -> 3ea75266 3f27a14a 3ee91286", + "be19fdb8 3e9c4125 3e9c4125 3eaeb6e0 3f1d16df be5ee650 be5ee650 -> 3e84816a 3e9c4125 3eaeb6e0", + "3f9fd8ea 3e637226 3e637226 3eddfc69 3f820127 3f820127 3f0ebf5b -> 3f9b46db 3f9b46db 3f16a5f2", + "3e89f5be 3eadf42c 3f4a0a72 3f5470ed 3ef546cf 3ef546cf 3d843c27 -> 3ec12c04 3f4a0a72 3f5470ed", + "be4567ea 3f266ee2 3f75d78a 3f266ee2 3f62b79e 3f463d46 3f6b256f -> 3f1acfc6 3f75d78a 3f192fca", + "3f9ba511 bc18da3e 3f81385d 3f81b30b 3f81681a 3f1d0b36 3f81681a -> 3f9d9cf7 3f81385d 3f81b30b", + "3f924428 3f2afb6e 3f7e483e 3f969cf0 3f7ae22b 3dfd2a5e 3f7ae22b -> 3f832494 3f7e483e 3f969cf0", + "3db9ec4e 3f0c90a5 3f0c90a5 3f8d2208 00000000 00000000 3f000000 -> 3f0c90a5 3f0c90a5 3f8d2208", + "3f857d7b 3e4f1825 3e91b83a 3f33d5fc 3f673ee9 3ec695a4 3efa3f0b -> 3f6ef192 3ec8da1d 3f33d5fc", + "3c60b80b 3f20717f 3eee55f8 3f20717f 3f83384f 3f83384f be6d88f3 -> 3f21d7a1 3ef24417 3f20717f", + "3ee5c093 3f254845 3f5ee316 3f254845 3edeb0e7 3f890b9f 3e620de2 -> 3f254845 3f75dd2c 3f254845", + "3f4c2c7e 3f90f609 3e8f34ca 3e8f34ca 3e350cae 3f325391 3e350cae -> 3f90f609 3f1cb880 3e8f34ca", + "3f93c830 3f9f1d3f 3e8d1d7d 3f84601c 3f1a96fb 3f90729b bcd2525f -> 3f9f1d3f 3fa151c3 3f84601c", + "bea6d265 3f13dcd3 3e4304ef 3e4304ef 3f000000 3f000000 3f000000 -> 3f13dcd3 3db77a8f 3db77a8f", + "3fa23a99 3f85e73f 3f932c6b 3e7fb137 3f8adf94 3f010797 3e183502 -> 3f8c33d1 3f932c6b 3e7fb137", + "bec2c162 3f81fc87 3d1f19ee 3d1f19ee 3f1274de 3f1274de 3f3700ae -> 3f81fc87 be27eeae be5f89cc", + "3fbdbc9f 3e90cddb 3e90cddb 3f42dd87 3f46fe60 3e5b09f8 3f8873d4 -> 3f82068c 3e90cddb 3f9b45be", + "3f7ff88a 3f94caba 3f9e7371 3f36286f 3f8e6c4f 3dd32462 3f3bc84d -> 3f94caba 3f9e7371 3f3bc823", + "bed0548d 3f75f0c7 3f895fee 3f912257 bce8b75f 3f8ab159 3f8ab159 -> 3f75f0c7 3f88d6a3 3f912257", + "be71f39a 3e68a8f3 3f9e2b09 3ec910de 3f2985cb 3e351c4c be640967 -> 3dfed397 3f9e2b09 3ec910de", + "3e6d9ddb 3eed7cbd 3d0bd296 3e5fff42 3d05e0bf 3f0c0425 3f9f278b -> 3eed7cbd 3e1cce50 3ee9bc32", + "beb8e0eb 3eb07b6d 3f14aeee 3f14aeee 3f614510 3f614510 3f255601 -> 3e1b0b80 3ef20eaa 3f0eab92", + "beb5ecb3 3f8fbd82 bd078c2d 3ef7632d 3f150a42 3f90173e 3e42cf0b -> 3f8fbd82 bee3c20e 3ef7632d", + "be948cdb 3eebe2f7 3eebe2f7 3f90bb79 3f4e8a2a 3f99d22e 3f5eea8c -> 3eb879f3 3e7b9e5b 3f90bb79", + "3eba20d9 3f87a612 3f87a612 3deabc54 3f5047c3 bd83d177 bd83d177 -> 3f87a612 3f87a612 3deabc54", + "3f8e8286 3f9a3cb2 3d2fd8c0 be0e4ea1 3f6eb992 3f40f8b8 3f744af1 -> 3f9a3cb2 3f5599c2 3f8a0257", + "3ec1c02a 3e09a68d 3f49028a 3e09a68d 3e897fd2 3f12cbba 3f48bbe8 -> 3e3da02f 3f49028a 3ec2b426", + "3f4f04f3 3f16b9c4 3e90a7eb 3f647dae 3e851358 3f0e072d 3f2102f8 -> 3f16b9c4 3f00b138 3f647dae", + "be8a4541 bd57fcbf 3ed812cd 3eb2f515 3f32c41e 3f32c41e 3f6d9791 -> be82d837 3eb1df04 3e45eabd", + "be25347e 3f0cc443 3f0cc443 3ce7df76 3f85b12c bdc25948 bdc25948 -> 3ef0ad99 3f0cc443 3ce7df76", + "3faace37 be3afe01 3eac5247 3eac5247 bd6a221b 3c5ea0cb 3f717c67 -> bc793070 3eac5247 3f92b6fb", + "3f95c9ab 3e0e48d1 3f585a52 3f585a52 3f62b763 3f3927c1 3f62b763 -> 3f81a052 3f585a52 3f647afc", + "3e5668b5 3eb9f301 3f4f9a72 3f4f9a72 3f238f56 3f4fe678 3f9196cd -> 3ed78211 3f4faa5d 3f611a3f", + "bee4584a 3f984eec 3f984eec 3f817f75 3d80a4ef 3d80a4ef bb000ac5 -> 3f984eec 3f984eec 3f817f75", + "3fb19ce2 3f861482 3ee1f058 3ee1f058 3f138e10 3f53e49a 3f2f558f -> 3f861482 3f7a3c5b 3f4781bf", + "3eb0bca0 3f8c2b10 be2c7f6e be2c7f6e 3f0d34a1 3f7d4021 3f7d4021 -> 3f8c2b10 3e6cb94c 3e6cb94c", + "3fbe973c 3ec98ac1 3f9eab57 3f54a098 be38b741 3f2d7cb0 bd9df4fe -> 3ec98ac1 3f9eab57 3f54a098", + "be19d08e 3f96eb04 3f96eb04 3f98d4b5 3dbc9b38 3ea049e3 3f286fe7 -> 3f96eb04 3f96eb04 3f98d4b5", + "3f3abb2a 3f6b5bb9 3f71a6d7 3f39e039 3f833913 3f833913 3f60e43b -> 3f7f1dd2 3f8068e1 3f5655a9", + "bc7cbc97 3f598ec0 3ec0b30b 3f598ec0 be785bc5 3f8c11f7 be785bc5 -> 3f598ec0 3ebb0776 3f598ec0", + "3f00d44d 3f0f3133 3f23a0cc 3f0f3133 3f40dc98 bd64086e be0d652a -> 3f283016 3f23a0cc 3f0f3133", + "3f8e8317 3f91b09f 3ee8dd33 3f9f0fca 3e869a6f be1c0d08 3e869a6f -> 3f91b09f 3ee8dd33 3f9f0fca", + "3fbe57ef 3f8741dd 3f83276c 3f164749 3c9d9a9b 3ef45282 3d7082e8 -> 3f8741dd 3f83276c 3f164749", + "3fbfc245 3f19522c 3f61dcae 3f813962 3e1eaf8f 3e1eaf8f be40510f -> 3f19522c 3f61dcae 3f813962", + "3f807200 be5c11ae 3f4c598f 3f503725 3e0b3ad0 3f18d789 3e0b3ad0 -> 3e0c7ad0 3f4c598f 3f503725", + "3f774c7a 3eea34e4 3eea34e4 3edf38fe be6a2537 bdd0194c be6a2537 -> 3eea34e4 3eea34e4 3edf38fe", + "3ec2fe21 3f8952b8 3e8552ab 3e63aabb 3ebd3e6c 3ebd3e6c bba26e6e -> 3f8952b8 3e9a9ec1 3e63aabb", + "bdb4da2f be1d0a7a 3f2a24b5 be1d0a7a 3f9bad23 3e61c51a 3ec76304 -> be8c7186 3f2a24b5 be4e1f84", + "3ba3b3c8 3ec63c34 3f1a791b 3f1a791b 3f044432 3ddbebcc 3f044432 -> 3ec690fe 3f1a791b 3f1a791b", + "3ec085fb bd8d5c7d 3f62410f 3f62410f 3d9ae345 be07f2c3 3d9ae345 -> bc6fb874 3f62410f 3f62410f", + "3f7e9419 3f92bfca 3f3d2703 3e6a8a74 3f8a1844 3f84e50d 3efea765 -> 3f92bfca 3f84ae95 3efde41b", + "3f6ed88a 3f6ad251 3f23ff87 3f6ad251 3dc9e743 3f79d38f 3eb417a7 -> 3f6ad251 3f741340 3f6ad251", + "3f2001d6 bd46219d 3e9b9d47 3eec53ea 3f2eef2b 3f29bb3c 3eac2902 -> 3ed16412 3f07432c 3eec53ea", + "3f78e4fd 3f1e561e 3d1559d3 3f252474 3fa00000 3fa00000 3fa00000 -> 3f9dc1a6 3f9bb048 3f9dd9d4", + "bdab1483 3f99bef3 3f36f8e7 3f99bef3 3ead7f80 3ead7f80 3df58b0f -> 3f99bef3 3f36f8e7 3f99bef3", + "bdcc8dca 3f9f874d 3e449cae 3e449cae 3ebdbf49 3eda0005 3f7986e2 -> 3f9f874d 3e2cb3b6 3de91e1c", + "be2dca6a 3d2f8235 3dd10ec4 3dd10ec4 3ec076f6 be6930f7 3f51b6b5 -> bc6015f4 3dd10ec4 bca0caf0", + "3ef1f149 3f1f985b 3f8a24e2 3f81b59d 3f3f4311 3ed06284 3f8a4ea0 -> 3f2e8f22 3f8a24e2 3f85c5b0", + "3de9f24b 3d8f3b8f 3f8cb08a bdc7e955 3f2f0eb7 3e20a6b6 3f2f0eb7 -> 3e0f6c85 3f8cb08a bc08c970", + "3fa7d915 3f8271a8 3ea45f53 3f78b968 3f1d28a3 3f67e7b9 3f1d28a3 -> 3f8271a8 3f8b41dc 3f78b968", + "be75d924 3f65d72c 3f9d3c62 3f9d3c62 3d897195 3d897195 bde29de1 -> 3f65d72c 3f9d3c62 3f9d3c62", + "3f4a4c49 3dd49dbb 3dd49dbb 3de32c20 3f244676 3e647cb3 3ed11e5a -> 3f0763ca 3e4adb70 3eb12a2b", + "3fa83ed2 3f229b80 bc8fd239 bc8fd239 3f7ba994 3f5646d0 3f0e531c -> 3f8bd4d8 3f8d87ef 3f3c7cb1", + "3f55125c 3f382792 3f669764 3f669764 be7d69a5 bdabd5a2 3f9e7056 -> 3f382792 3f669764 3f973446", + "be99b9f4 3e88efca 3efa62a0 3d94871c 3f400000 3f400000 3f000000 -> 3dfb06dc 3ed24492 bd64a8f4", + "3f5ad63a 3f36f94a 3f85ea2b 3f0b4277 3ec7e7d3 3eb2e547 3ec2d12c -> 3f36f94a 3f85ea2b 3f0b4277", + "be0902db 3f4fe570 3f8c8ae5 3f4fe570 3f81da6e bdcbe011 be306c59 -> 3f48f6cb 3f8c8ae5 3f4fe570", + "3e80c366 3eb2d3bb 3f55a397 3eb2d3bb 3f000000 3f000000 3f000000 -> 3ec63c40 3f55a397 3ec63c40", + "3f060d61 3f9da44f 3f8de636 bc622df2 3f5e6987 3ef55edb 3f5bf2e4 -> 3f9da44f 3f8de636 3ee2fb53", + "3f3cddc4 3f202301 3f202301 3e94ca84 3c74d3aa 3f2e39d8 3f2e39d8 -> 3f202301 3f2a87fb 3f140bdb", + "3f96bf87 3f4cf64b 3f9c4841 3f9c4841 00000000 3f000000 00000000 -> 3f4cf64b 3f9c4841 3f9c4841", + "be40b33f 3f485184 3f2e113e 3d44a2a2 3e800000 3f800000 00000000 -> 3f485184 3f1ea622 3d44a2a2", + "bd51d7b2 3f9275e1 3ed3e8f1 be309b48 3f11afbf 3ef75dd1 3f4f1dc4 -> 3f9275e1 3ed217ec be6418f5", + "3edc20e9 3d41cd28 3f4bb147 3f09883f 3eeeb369 3eeeb369 3ea822e3 -> 3e68df81 3f4bb147 3f09883f", + "3fb51117 3ec29689 3e99f127 3ec29689 3f7c0222 3f9049e7 3f242f45 -> 3f9e1341 3fbc272a 3f3fea9c", + "beff8fd1 3f10a541 3f10a541 3ea80e29 be0f7e9c 3f097052 3f097052 -> 3f10a541 3f10a541 3e6578a6", + "3fbcc7be 3e4a2b0f 3e4a2b0f 3e9321ec 3e67034d be6676af 3e3473bc -> 3e74b5ad 3e4a2b0f 3e9321ec", + "3d851491 3e92326b 3f89f3d6 3f89f3d6 3f400000 3f400000 3f400000 -> 3ea1a648 3f89f3d6 3f89f3d6", + "3fb5efaf 3f54d4a8 3f7c9253 3f54d4a8 3f4ad97d 3ebd0198 3ebd0198 -> 3f54d4a8 3f7c9253 3f54d4a8", + "3f7d86fb 3f12d5c2 3e517170 3f12d5c2 3eff3585 3eff3585 3f082789 -> 3f12d5c2 3efdc167 3f12d5c2", + "3d213480 3da6d510 3e717c1f 3da6d510 3cac7f3b 3f971096 3f9ba24f -> 3da6d510 3e8bc5a5 3e012296", + "3f756613 3ebd8dc1 3f926ada 3ebd8dc1 3f0b19f0 bcc10c38 3f0b19f0 -> 3f09440b 3f926ada 3f09440b", + "3f83be49 3f6d750a 3efa60c3 3e76c118 00000000 3e800000 3f000000 -> 3f6d750a 3efa60c3 3f01f072", + "bed03ad1 3f9eff34 bd87efdf 3e97ee8d 3e992493 bdf9c493 3e992493 -> 3f9eff34 bd87efdf 3e977077", + "3fa39702 3f29645c 3f3eccd8 3f29645c 3e0ed5e0 3f79ac68 3f79ac68 -> 3f29645c 3f85057f 3f87ff69", + "3f69f51f 3f9019cd 3f9019cd 3f38c3cf 00000000 00000000 00000000 -> 3f9019cd 3f9019cd 3f38c3cf", + "3f9d4e8e 3eef7d13 3f483796 3f5a01b6 3f800000 00000000 00000000 -> 3f8f993a 3f483796 3f5a01b6", + "3dbdf921 3f968848 3ebd6280 3e4c58fd 3f7c869e 3f985095 3db89a4d -> 3f968848 3ee4551b 3e4c58fd", + "3f78ef12 3dd94a8c 3f1d245e 3f467898 bdf86f53 3f81856e bdf86f53 -> 3dd94a8c 3f801d69 3f467898", + "be80c359 3f692193 3e2af8fa 3f27a97f 3f25f3e3 3f6d269c 3f25f3e3 -> 3f692193 bcc4c0b0 3f27a97f", + "beae4689 3e6b1f79 3f7ef194 3f2602ce 3f40f5b0 3e160377 3f774ee9 -> 3d51bcfc 3f7ef194 3f0a56be", + "3edc4dd9 3ec46ab3 3f881a44 bb544da8 3f4a23bd 3ee454ff 3ee454ff -> 3f0eed96 3f881a44 3e429aaa", + "beee5527 3f12f804 3f12f804 3f3c92a0 00000000 00000000 3f800000 -> 3f12f804 3f12f804 3f1d2f92", + "be03f429 3f00663f 3e32bce8 3f8be702 be110c4b 3f131855 3f0b7cad -> 3f00663f 3dfbe6e5 3f8be702", + "3c2433b7 bdc48134 3e30b56f bdc48134 3ec5a8f5 3f8c1714 3f79ccc0 -> bdba9c87 3e3a2b72 bdae81d6", + "3f4bf5d9 3f87c512 3f4b8ebf 3f87c512 3f22ae68 be509046 bcaca341 -> 3f87c512 3f4b8ebf 3f87c512", + "be93334a 3f8cea42 3dbe72d3 3f8f9e4e 00000000 3f800000 00000000 -> 3f8cea42 be2bcca4 3f8f9e4e", + "3e00ce88 3f74dfa2 3b8becb4 3f19ec47 3d336c45 3f025da6 3d336c45 -> 3f74dfa2 3d8ad52e 3f19ec47", + "bee34a4b 3eb9e7b2 3d322c26 3f1720c3 3f54853e 3e714877 3f54853e -> 3e1f7e25 bd2b2dfc 3ef7bf9c", + "bd27cb7e 3f576f66 be6439b4 3f576f66 3f12d57f 3e550b2a 3de6e24c -> 3f576f66 be764d5f 3f576f66", + "bee87cdb 3e095d74 3e095d74 3dc43773 3f57d531 3e626cd7 3f57d531 -> be4047a4 3dc1d986 be795cba", + "3eccb049 bd8a98ab 3f72d009 3f72d009 3f7f2615 3f61560b bd8dff72 -> 3eb73603 3f72d009 3f72d009", + "bbe6ede2 3eee71e4 3d40c410 3d40c410 3f986d63 be76aed5 3f986d63 -> 3eebd414 3d40c410 3d1fbfdc", + "3f2a2a28 3efba72d 3efba72d 3e9e5229 3f83cce0 3e378963 bc10bfaa -> 3f5967de 3efba72d 3e9e5229", + "3ca5cea6 3f566bd4 3f566bd4 3f369ee7 3e34f51b 3f85fe3c 3f1f1746 -> 3f566bd4 3f578160 3f369ee7", + "3f4ac6de bdedcab2 3f978dcb 3e2da79f 3f400000 3f000000 3f400000 -> 3f11e725 3f978dcb 3f211bc4", + "3fbd65e1 3ece1408 3f491cb2 3f01dd69 bdafcdf8 3f3c9693 3f3c9693 -> 3ece1408 3f491cb2 3f58c18e", + "3fb7f8cd 3f5e4513 3d8aa262 3d8aa262 3f2e940f 3f1ce13f bcfb0a8f -> 3f5e4513 3f59e710 3d8aa262", + "bed866cf 3d01c2bc be594f89 3f805cd8 3ec09dd5 3ec09dd5 3eb909f1 -> bde95794 beebfda0 3f805cd8", + "3fa3cb9f 3f76b5e5 3f54a174 3f54a174 3ee05b9e 3efd684f 3f3bda21 -> 3f76b5e5 3f54a174 3f54a174", + "bedfbffa 3e0b295f 3f45bfc9 3f9e78cd be2844a4 be2844a4 3f9d7ff6 -> 3e0b295f 3f45bfc9 3f9e78cd", + "bdad9ed2 3f1daad8 3f891082 3f498a07 3e8db848 3f19139a 3f19139a -> 3f1daad8 3f891082 3f498a07", + "3f47545a 3f1257aa 3d25be9d bdbcab51 3f57ba01 3f1a373e 3ee53caf -> 3f485df8 3ef4bd9e 3ea80cb7", + "3f8664cb be48fa01 3f365fb0 3f8764bd bdcf987f bdcf987f 3f159867 -> bdc5e329 3f365fb0 3f8764bd", + "bc9747e9 3dc01fa5 3ecd1df2 3cfceb52 3e84f03d 3ecaca31 3ecaca31 -> 3db9da09 3ecd1df2 3cc5abe4", + "3ed1e0d1 bd69ad63 3f04015e 3e0a406c 3f9133e6 3eda30e0 3f8e57b2 -> 3edcd956 3f04015e 3f0917b4", + "3e03196b 3f91bf1e 3f855a11 3eaf40f9 3e97abf2 3f9fc8f4 3f94329c -> 3f91bf1e 3f88bc69 3ee4b5ac", + "bd98d48e 3dcdb88c 3f211d3e 3e6a8a79 00000000 3e800000 3e800000 -> 3dcdb88c 3f211d3e 3e68f086", + "3f7a37af 3f46139b bbf6666a 3f0df85f 3e53c89c 3e53c89c 3ee4fb8f -> 3f46139b 3e4ed373 3f0df85f", + "3f9d22e7 3f480482 3f644c7a 3f480482 3f5054bd 3f9d5943 3f5054bd -> 3f52392f 3fa72e9a 3f52392f", + "3f34a180 3e650f99 3f92df18 3e650f99 3f801b7d 3da24331 3da24331 -> 3f45a452 3f92df18 3e650f99", + "3f8f165a 3f9780e6 3f9780e6 3e15b9c2 3f2e306f 3f951e83 3f951e83 -> 3f9780e6 3f9780e6 3fa47d63", + "be42da92 3f7f63fc 3f67a064 be72e231 3ea8ba83 3e9e4e82 3e4ab7e4 -> 3f7f63fc 3f67a064 bea3d67f", + "becbc466 3eac8348 3f7d350c 3f80a04f 3f97b624 3f97b624 3f9e6d65 -> ba304600 3f6938e3 3f698821", + "3f6b9bb5 be3730fe bb3aeb78 3f9cfdf1 3e800000 00000000 3f800000 -> 3e5d041c b96e3a00 3f9cfdf1", + "be9a4e98 3cfe19d9 bc88935c 3f145735 bcbe5c6f bcbe5c6f 3f5b1ea9 -> 3cfe19d9 bc88935c 3efe04b4", + "3f9b0818 3f7c3485 3f907129 3f9f5e57 3f6239e4 3e75ae46 3d9398ee -> 3f7c3485 3f907129 3f9f5e57", + "3f86be92 bda61dce 3e910a3e 3e966d08 3f24f29e 3da02c26 3f24f29e -> 3f2ebba9 3e910a3e 3f29ad09", + "3ed6956f 3db1b236 3ee02d15 3ee02d15 3f800000 3f400000 3f800000 -> 3ef063a6 3f119472 3f2c6720", + "3f438b42 3f86d3fd 3f86d3fd be02f7c3 3f711e71 3f851579 3f711e71 -> 3f86d3fd 3f86d3fd 3f3071e7", + "3ebaaba2 bdc80559 3f9cfaf7 3f9cfaf7 3f16efdf 3f16efdf 3f81f4b5 -> 3e1c92c6 3f9cfaf7 3f9cfaf7", + "3f36aa7b 3ec4ebd6 3e095cd4 3e095cd4 3f5fbe9e bc0ea1c4 3ee58b49 -> 3f3bdb08 3e095cd4 3eb77690", + "3fabe544 3e8ac917 3f7866f5 bc93c444 3eeac9a9 3f9561e3 3ea7afe7 -> 3f05dae7 3f9e0494 3ee45c22", + "3db24f00 3f1e1d4d 3f345d0f 3f574ed4 3f2b292e 3e9015e2 3eb7bb70 -> 3f1f4016 3f345d0f 3f574ed4", + "3f48d2e6 3f6e7fd7 3efa79af 3f6e7fd7 3e752f1e 3e752f1e 3f1baced -> 3f6e7fd7 3efa79af 3f6e7fd7", + "3f34f124 3f02cf9e 3f5277d5 3f01b910 bdd127d7 3f9e4a3b 3e1506a2 -> 3f02cf9e 3f8ebbf5 3f01b910", + "bcbaea98 3f9262b9 3f479762 be683fe4 3dbd804e 3f4424a0 3f4424a0 -> 3f9262b9 3f479762 be7f7349", + "3d982759 3f6b47df 3f6b47df 3ee106b5 3f465bbd 3f2d2179 3f2d2179 -> 3f6b47df 3f6b47df 3eea0882", + "3f8ac651 3e57b307 3c8d9db7 3c8d9db7 3f800000 3e800000 3f000000 -> 3f88814b 3e8a0795 3f0a66f4", + "3f9702a5 3f8af56e be61f58e 3b168f31 3d9a9832 3f7a47a8 3f7a47a8 -> 3f8af56e 3f98b6b3 3f939552", + "3f86de1b 3f517dc2 3f517dc2 3f0f6ed8 3f443833 be10f801 3f443833 -> 3f517dc2 3f517dc2 3f470d3c", + "3d33cc1d 3f843696 3ea96b59 3ecb867d 3f832788 3f9d3650 3ef74cf9 -> 3f843696 3ebd961c 3ecd7268", + "bba75e58 3f4a0436 3f572995 3f572995 3e800000 3f800000 3e800000 -> 3f4a0436 3f56f42f 3f572995", + "3f429cf2 3edde416 3f522de5 3eca24d5 3f643dba 3f122315 3f122315 -> 3f481d4e 3f522de5 3f0754ac", + "3f9c5dec 3f9b0fb0 be556de9 3f88d920 3f535048 3f399358 3e704285 -> 3f9b0fb0 3f6e86e8 3f88d920", + "3f4dea9d 3f281403 3e75e54a 3e75e54a 3f1a911e bd8f6bd3 3f9aec7c -> 3f281403 3e75e54a 3f82a0c5", + "3e3c2aa5 3f26ac0e 3f0aa2a7 3f0aa2a7 bca7c60d 3e0ad3d5 3f6a4701 -> 3f26ac0e 3f0aa2a7 3f1c35cf", + "3fb3fde3 3ef73ff7 3f8d736e 3f8d736e 3f84cbc2 3f0a4ea5 3f84cbc2 -> 3fa1a0dd 3f8d736e 3f8d736e", + "3f724e3a 3e92f59c 3f6ef176 3e18a281 bd0daaba bd0daaba 3f94abba -> 3e92f59c 3f6ef176 3f8dbd0c", + "3fb7522f be1b9eae 3c6b506c be1b9eae 3f05b807 be558555 be558555 -> 3f50537a 3c6b506c be1b9eae", + "3f97c082 3e401367 3f88e2e8 3e401367 be2b3f67 3f8e40d1 3f1d678e -> 3e401367 3f8f3fc3 3f31b3cd", + "be883db5 3f59b188 3f59b188 be2cd242 3ebe1311 3f064ac2 3ecb3520 -> 3f59b188 3f59b188 bea37a12", + "bda889cb 3f9367a3 3f833867 3f3cd5ee 3f87b95e 3f07651f 3f87b95e -> 3f9367a3 3f833867 3f360982", + "3f1c568d 3f8e7f6c 3f8c573a 3f8c573a bddfa7bd bddfa7bd 3f3d8099 -> 3f8e7f6c 3f8c573a 3f8c573a", + "3f8bda73 3f2ae281 3f47cc83 3ee4640e 3f902ad5 3f841ce5 3f90fc94 -> 3f959b00 3f871891 3f992021", + "3faa33a7 3e911e24 3f8c2a2f 3eb0ad5f 3f93a195 3e9f9e34 3eaf671d -> 3fb85810 3f8c2a2f 3eb0ad5f", + "3f21f5e4 3d811ace bd0a7b8e 3d811ace 3f4e4d5f 3f4e4d5f 3de98c73 -> 3f08726e 3efeadc6 3dc32e98", + "3f8cb77c 3f47a8df 3f47a8df be504d27 3f0fb648 3e7c3b43 3f0fb648 -> 3f47a8df 3f47a8df 3f2329d6", + "bdb6b103 3f7a1257 3f7a1257 bd2484a5 3f8a6507 3f4ceba7 3f8a6507 -> 3f77b034 3f7a1257 be0f8fee", + "be274ad9 3f2c9353 3e87fbd4 3f77f21a 3f84cc61 3f84cc61 bdc480da -> 3f1d60e4 3e0ed5df 3f77f21a", + "beff73a6 bda07503 3dded430 3e710b10 3f34dddd 3f442476 3f34dddd -> bef09b96 be607140 39b23800", + "3f17c631 3ec5e9a2 3f9f74c6 3f9f74c6 3e9a9033 3f1b15b8 3e9a9033 -> 3ec5e9a2 3f9f74c6 3f9f74c6", + "3f1dacae 3f872e98 3f72b2c3 3f872e98 3f681e0b 3ef9782c 3ef9782c -> 3f872e98 3f72b2c3 3f872e98", + "3e8eaaa0 3f02c8ed 3ef0a05f 3f02c8ed 3ea0f490 3e2a913f 3e9b38f3 -> 3f02c8ed 3ef0a05f 3f02c8ed", + "3f9e5081 3e9d82a6 be0e26d8 3d0d9e81 3ee79e27 be489986 3f840ec5 -> 3ef92b35 be0e26d8 3fa248f8", + "be66c963 3f78b039 3dc82dd7 3dc82dd7 3f0c13e1 3ef5aa7e 3da3c7b0 -> 3f78b039 3c3e9890 3dc82dd7", + "3f86631c 3e50498d 3f82bd0c 3f6afb70 3f60a00a 3f4ef666 3f4ef666 -> 3f693c49 3f82bd0c 3f6afb70", + "3ea3fc92 be15a11b 3eb6f9e9 3f41bb00 3f20af23 3ed6afb2 be2eb714 -> 3dd04f2c 3ec121ed 3f41bb00", + "be8f000f be5b892e be5b892e be1f29a1 3f7cc9bc 3f4ad1d8 3f7cc9bc -> bf0cd0e0 befdb846 bef303a2", + "be81ee46 3ec83732 3dad32d8 3e439a77 3f71b176 3f79fabd 3f79fabd -> 3e805ae6 be112ca9 bc082200", + "beaab46d be6594a0 3f9be82b be6594a0 3f95836b 3eebeacf 3f86f95b -> bf303a9d 3f9be82b bf2688b0", + "3cd79b3c 3e2d4337 3e34476f bd3be395 3f036ba4 3f787211 3f787211 -> 3e3689b6 3e49b093 bc9ca4d6", + "3f53d951 3ea9cb1b 3ed2f72b 3ea9cb1b 3e9048f9 3f4b25b4 3e9048f9 -> 3ea9cb1b 3f3a4db4 3ea9cb1b", + "3dedaff9 3ed0efb2 3f1a961e be16f2ae 3f0410b7 3ec84630 be7f33ca -> 3ed75791 3f1a961e be16f2ae", + "3fa9963f be79807d 3f4e8abe 3e79971a 3eed06eb be73c2c7 be73c2c7 -> 3f3148af 3f4e8abe 3e79971a", + "3ec48666 3ee6e8f0 3ee6e8f0 bda7239c 3edac135 3f618c2b 3f618c2b -> 3ee6e8f0 3f1db671 3e9366b3", + "3dc9ac65 3eb4b235 3f8ee03c bceffb97 3f995fed bd0f796c be1f4dd5 -> 3edf50cf 3f8ee03c bceffb97", + "3e9dcb1c 3f758cdd 3df66fb1 3f8d6ad7 3f586b8f 3f1c8f97 3f586b8f -> 3f758cdd 3e8b1f72 3f8d6ad7", + "be9386e9 3f9da2b4 be76705e 3f4e8c4d 3e56cbd2 3aec3c8d 3aec3c8d -> 3f9da2b4 be9efd5a 3f4e8c4d", + "3f00ba5c 3ea4f2bb 3e60e160 3ea4f2bb 3d154c78 3f1fc104 3e845ec0 -> 3ea4f2bb 3ed89019 3ea4f2bb", + "3f26d5b5 3f276782 3f09e1a7 3f258b94 be356bb8 3f7fb1c2 be356bb8 -> 3f276782 3f56a8f2 3f258b94", + "bd661a20 3e85a0b0 3e85a0b0 bd99b932 be7b07fc 3e8cc85b 3f46aa4e -> 3e85a0b0 3e8539ca bdfba497", + "3e09e1c7 3f8d9a30 3f962ce1 bda1b268 3f3ca6ba 3f3ca6ba 3f30c0f6 -> 3f8d9a30 3f962ce1 3cc9e6ac", + "3f359384 3e0b6c0c 3e0b6c0c 3e1a1152 3f0089ad 3f040138 3f0089ad -> 3eca9afa 3ecf8603 3eccbbf7", + "3fbb2317 3f09eaae be65944c 3f09eaae bdcfc6c9 be5d4385 3f221e6f -> 3f09eaae be596c02 3f2d4cec", + "bd63f6d7 3f748b4a 3f748b4a be68211b 3f25405e 3f047d23 3f25405e -> 3f748b4a 3f748b4a be8ceb24", + "3f983415 3f7422d0 3f814d13 3f96ba32 3e2c2c6e 3f2b543d 3f56e30f -> 3f7422d0 3f814d13 3f96ba32", + "bdf0eace 3f0c838a 3f9dfb4f be22e8b0 be010214 bdfda9ba 3f6dfd71 -> 3f0c838a 3f9dfb4f be93074a", + "3ebdc937 3ee9265f 3f91cc8b 3f1b2f37 3f04e367 3f57e3f9 3f57e3f9 -> 3ef53e6a 3f91cc8b 3f31afcc", + "be458ee0 3f81596c 3f81596c 3f53a57f 3f0295ac 3f8444c8 3f0295ac -> 3f81596c 3f80c93c 3f53a57f", + "3f529818 3ebc709d bcaebfb0 3ead8051 3e835b9a 3f2a8a88 3e62cfd6 -> 3ebc709d 3f0b5302 3ead8051", + "3fbdf69b 3f51dded 3f51dded 3f8f414f 3f000000 00000000 3f000000 -> 3f51dded 3f51dded 3f8f414f", + "be2125c4 3f95a5c9 3f870a33 3f95a5c9 3f43c587 3d232937 3f9a0e05 -> 3f95a5c9 3f870a33 3f94f43c", + "3f43ac02 3f54d85d 3f361b28 3ef2a522 3f078a4b 3f078a4b bc97db99 -> 3f54d85d 3f361b28 3ef2a522", + "3f33de40 bcd1f849 bcd1f849 3f8cc917 be4adcff 3de4da9a 3de4da9a -> bcd1f849 3d912f2f 3f8cc917", + "bef055e1 3ec5022f 3f80093a 3f6b7990 3f800000 00000000 3f400000 -> 3dc49980 3f80093a 3f6b7990", + "bece488e 3ead98ba 3f3c4f34 3f3c4f34 3f22c865 3ec78eee 3e8c9a52 -> 3e60bcc5 3f3c4f34 3f3c4f34", + "3f1f637e be3156a2 be3156a2 3f000369 bcc1d181 3ebc2ce9 3f465b2c -> bda404ec 3e276526 3f2bcf42", + "3e80b885 bda35260 3e9df68c be47110e 3f0f819e 3f46c3cd 3f1cfe70 -> 3da65e0e 3eda3126 3c0dbb50", + "bc709a70 3f362cb5 3f089480 3f878ac4 bd3aaa1d 3f6c691c bd3aaa1d -> 3f362cb5 3f071d32 3f878ac4", + "be207f19 3ee164b6 3f902475 3f2c9011 3f8c36ba 3ef826a3 3f8c36ba -> 3eacd09b 3f902475 3f1ba816", + "bd398e5d 3ef5491d 3f2f63d1 be35eaa5 3f8653dc bdacabe0 3f88db66 -> 3ee80e6e 3f2f63d1 be6fc1b5", + "beb59f66 3efd1732 3e25a52b 3e25a52b 3ef11790 3ef11790 3e8e6004 -> 3efd1732 3d556f6a 3df6ca2e", + "3f9f734a 3f25f197 3dc6cd8e 3f65c221 3f91e0fd 3f09e9ef 3f83189c -> 3fa155e2 3f25b1b4 3f8714ab", + "3f96346d 3f981c0f 3eb40325 3ebae53b 3f30c0fb 3e335f75 3ea1cbfe -> 3f981c0f 3eb40325 3ebae53b", + "3f8fcf21 3ed2c358 3ed2c358 3f615043 be317069 3f280b7a 3f6c57af -> 3ed2c358 3f2fc8c7 3f6db466", + "bdf7d93a 3f5668a7 3c2f8d86 3f81554f 3f27f7ab 3e49183d 3d881de2 -> 3f5668a7 bc4095b6 3f81554f", + "3eeadd03 3e516a48 3f739992 3f739992 3e800000 3f400000 3f400000 -> 3e66c8d1 3f739992 3f739992", + "be03faed 3f5080d1 3f5080d1 3deb3df1 3f759725 3e0a6411 3f759725 -> 3f4bb91f 3f5080d1 3bc55a10", + "3ec27afe 3ecae649 3f33ada4 3f7860d7 3dfe86c1 3dfe86c1 bdce7e46 -> 3ecae649 3f33ada4 3f7860d7", + "3e8e0966 3ea6a2e3 3ea6a2e3 3f005365 3f9bfe5f 3f50b89b 3f9bfe5f -> 3f12c126 3eec36b6 3f3346bc", + "3f8ca298 3d6bb8a7 3e4aaf6b 3f1f7fe9 3f137420 3f408c40 3f408c40 -> 3f208e05 3f4e8d82 3f43cf63", + "3e85acd2 3f89c98c 3e2d73e3 be4253fa bd9809f0 be1b0968 3e9d344a -> 3f89c98c 3e2d73e3 bd76051c", + "3f44b3ff 3eefaac7 bd2c00ff 3f859c12 3e32aeff 3f84358a 3ee71292 -> 3eefaac7 3f48ae71 3f859c12", + "3f705e4b 3edc36bb 3edc36bb 3f880849 bd984828 be4a6b37 3ed276fb -> 3edc36bb 3edc36bb 3f880849", + "3e8b5dcd 3f9a7319 3f9a7319 3f8550d1 3ec5d9d5 3d3764e9 3ec5d9d5 -> 3f9a7319 3f9a7319 3f8550d1", + "3fbb5219 3d6d66a9 3f29d9bc 3c111f04 3f986de1 3ed2347e 3f9cbce8 -> 3fdba21e 3f29d9bc 3fe4da00", + "3ec114ec 3d3d35f9 3f874492 3f89ec05 3e897d4b 3e618975 3e897d4b -> 3e05298c 3f874492 3f89ec05", + "3f8924ad 3f4fb52c 3f5cc2b9 3e8c5866 be46c00e 3f09b7ad 3f191ae4 -> 3f4fb52c 3f5cc2b9 3f1f0770", + "3f9c8e8b 3f5d07d6 3f75b5ab 3f5d07d6 3f3e710a 3f3e710a 3ed39aff -> 3f5d07d6 3f75b5ab 3f5d07d6", + "3d02d7a5 3f6babad 3f4e910e 3f4e910e 3cd9759f 3f978016 3cd9759f -> 3f6babad 3f51a5a9 3f4e910e", + "3f5b24f4 3e8729c5 3eb8ae43 3dec90d2 3f8ee023 3f8ee023 3e86ce49 -> 3f7e5780 3f80f3ff 3e77d340", + "3f1b74b1 3f13ec6c 3f34187b 3f34187b 3f4d539a 3f79a75f 3f4d539a -> 3f36c80f 3f5e55b4 3f436ac7", + "3ee373a6 3f64edec 3f3bf93c 3d9767f7 3f000000 3e800000 3f800000 -> 3f64edec 3f3bf93c 3ef87cf1", + "3f235c4b 3f14982d be69b4a5 3d4136c4 3d7bd9cf 3f87e669 bdb0b343 -> 3f14982d 3f184cd0 3d4136c4", + "bd6c5a88 3f6d55e9 3f9c6d27 3d499219 3f000000 3f800000 00000000 -> 3f6d55e9 3f9c6d27 3d499219", + "3f509347 3eb9bcf2 3e521429 3ee75bf6 3f800000 00000000 3e800000 -> 3f61c790 3e521429 3ee75bf6", + "be87b215 3e4f005b 3f58e06f 3e4f005b 00000000 3e800000 3f400000 -> 3e4f005b 3f58e06f 3d69474c", + "3f2f43c9 3f39a88a be3324f4 3f39a88a 3d26b48d bd1e577a 3e314d70 -> 3f39a88a bda73260 3f39a88a", + "3f34f94c 3e2cdb03 3d4a32af be67a47c be7671b3 be7671b3 be1f0c6f -> 3e2cdb03 3d4a32af be3452e2", + "3ef8ba96 3f8ad08e 3f1ead21 3f5ad945 be71211b 3f7bf178 be71211b -> 3f8ad08e 3f4bfc38 3f5ad945", + "3f144d23 3bec8c4a 3f859e66 3eb8e772 3f96581e 3eb21933 3f96581e -> 3f2ef785 3f859e66 3f551574", + "3f019e5f 3f695f59 bd9e291e 3d665037 3f71d620 be1ad879 3f71d620 -> 3f6da870 bd9e291e 3f018db7", + "3eaeea4d 3f9475ec 3e8ad01e 3e8ad01e 3f000000 3f000000 3e800000 -> 3f9475ec 3eb2d904 3e8ad01e", + "3d06728b 3dc27f88 3f7d3a8d 3edc0955 3f2a2bec 3f1e5ca8 3f509383 -> 3de8ccbc 3f7d3a8d 3ee281b1", + "3f409c55 3f85b5fa 3f8fdcfa 3f8fdcfa 3f85ac85 bd868e1e 3e58b0ef -> 3f85b5fa 3f8fdcfa 3f8fdcfa", + "3c51b615 3f607fc2 3f607fc2 3e06e1bf 00000000 3e800000 3f800000 -> 3f607fc2 3f607fc2 3e124327", + "3f44e41e 3f941366 3f669b73 3f941366 3f9739a4 3f69e47f 3f99b086 -> 3f967f7c 3f69224e 3f9864b3", + "3f96cef6 3ddd0c68 be0c1f04 3ddd0c68 3d98b11e 3e0f4644 3f5d035a -> 3ddd0c68 3e41c5e4 3f7f78d6", + "3f98cdc1 3f241c91 3f960158 3f960158 3ef50c2d 3f0a1a08 3f4034ec -> 3f241c91 3f960158 3f960158", + "3fb2ed32 be35b1d0 3f6dd701 be35b1d0 3f65148b 3f50dba9 3f65148b -> 3fa925cf 3f6dd701 3fa925cf", + "3f3a89f8 3f88aa09 3d5ac9a2 3f8a2fbe 00000000 00000000 00000000 -> 3f88aa09 3d5ac9a2 3f8a2fbe", + "3d24e687 3eb63bd5 3e75bd90 be3e7b93 3e843366 3e843366 3f6a3fb8 -> 3eb63bd5 3e767de4 be111777", + "3f91424f 3f99fad2 3f296209 bdbf9846 3f3dda67 3f3b4ab3 3f9beb21 -> 3f99fad2 3f3db4e1 3fb28e78", + "3e927339 3f0a34f6 3f0a34f6 3f9d8d64 3f5f71b0 3f8d4115 bd3bfeda -> 3f229676 3f337b73 3f9d8d64", + "beb26916 bd7c3833 3f5bab9f 3eee8f2a 3e8e6e85 3f7d81e7 3e8e6e85 -> be384a30 3f4fe12e 3eee8f2a", + "3e8665de 3f0061f9 3f9d425c 3f9d425c be156777 3efac541 3f999342 -> 3f0061f9 3f9d425c 3f9d425c", + "3fae18bc 3f529dd4 3f529dd4 3db439cd 3f273ad2 3d1be1c5 3f30d9e1 -> 3f529dd4 3f529dd4 3f686d67", + "3f93c96f 3f852279 3f852279 3f82d813 3f92c73b 3f8bd9d2 be269b2b -> 3f94e328 3f8ce39b 3f82d813", + "3f525460 3efe0670 3efe0670 3f934e6f 3f44abba 3eaf48e2 be1d7775 -> 3f383e68 3efe0670 3f934e6f", + "be876087 3f953bef 3c87d836 3f1a2738 00000000 3f400000 3e800000 -> 3f953bef be35985f 3f1a2738", + "bead719c be0af02d 3f21ba63 3f486e5f 3e58ef7f 3f0c607d 3f4ffdd0 -> be81bf1c 3f21ba63 3f45deba", + "bd77afba 3e629c21 3e752988 3e629c21 3f357e69 be702d23 3f9a9326 -> 3e4469c1 3e752988 3e25891a", + "3e8c6330 3f0a0f82 3f0a0f82 3f9dff6f 3f37ac34 3f37ac34 3e8d30fc -> 3f169131 3f169131 3f9dff6f", + "3f093686 3efde404 3efde404 3f83fe88 3f415cc9 3f415cc9 bcb62c0d -> 3f228b4c 3f228b4c 3f83fe88", + "3e0e4995 3f88064d 3f88064d 3f270a04 3f1e3946 3f8df0c4 3da49226 -> 3f88064d 3f88d8bd 3f270a04", + "be5e4d4b 3f98478e 3e3f911c bc217d3e 3f09828f 3f9d51eb 3ea66b06 -> 3f98478e bd204634 bda91491", + "3f43da84 bd26669f 3ec6dd14 bd26669f be130681 be130681 3f8c1498 -> bd26669f 3ec6dd14 3f53e4fc", + "3f9ff211 3e6cd99c bdf6f2b9 3e6cd99c 3f4781d3 3f5e531b 3f86797e -> 3f6a8568 3f8ec1f3 3fa0a5a6", + "3e5ff053 3ee1eafc 3f1dd887 3f754aaf 3dce46d5 3ebc9104 3ebc9104 -> 3ee1eafc 3f1dd887 3f754aaf", + "bdf04182 3ed69c6d 3ed69c6d 3f9d30de 3f9cca0e be7abfe4 3f9cca0e -> 3ea636d9 3ed69c6d 3f9d30de", + "3fac3134 3f58d5c7 3f612f5c 3f58d5c7 bcc48d43 3f6e64ae bc93c82d -> 3f58d5c7 3f72f416 3f58d5c7", + "3f0bc396 3f3f6bca be7604d8 bc857fa8 3f16c830 3f47e7e1 3f16c830 -> 3f3f6bca 3ea26d24 3ea0d9f4", + "3faab3eb 3e936fef 3f7cb44a 3f7cb44a 3f714d1b 3e5cdf15 3f864caa -> 3f949acd 3f7cb44a 3f88f369", + "3f185494 3eb3a77e be722462 3eb3a77e 3f59fe58 3f9018e8 3ea0d54d -> 3f261762 3f12f918 3eb3a77e", + "3f7d1364 3c87a61f be1bc3f1 3f9a5a6b 3f336975 3e87c87d 3f9d2c15 -> 3f316935 3e8557ae 3f9d23d7", + "3eeaabbe be09b01d be09b01d 3f03dc0c 3f12cba5 3ede5135 3f853d24 -> 3e428ccf 3e0136ef 3f418f85", + "3fadc306 be08c4f7 be08c4f7 3f18ac51 3e70ea1d 3dc6b36b 3f785a07 -> 3ebbf88e 3e37c43f 3f8d4770", + "3fa754b6 3e05c3ea 3f784509 3f784509 3ee7d450 3f1a5ea5 3f5f641c -> 3f0d41a8 3f784509 3f784509", + "3f2808cb 3f07fe98 bd704edf bcdfd11a 3eb4f497 3eb4f497 3d915b89 -> 3f07fe98 3e58e8be 3d185e09", + "3f14e0fa 3ec09c24 3dfbc5ed 3e5ec9e0 3f2035da 3eaba063 3f51491e -> 3f05783b 3e7c4c39 3f11048a", + "3e31818d 3f97baf2 bd988bbb 3f3f3b54 3d564e0e 3ecc3aba 3d7adea6 -> 3f97baf2 3bf81ae0 3f3f3b54", + "3eb323ed 3ea64762 3f4685e2 3ea64762 3de5eb90 3f98db93 3f98db93 -> 3ea64762 3f6c0721 3f2103dc", + "3d98fbea 3ef822cf 3ef2a819 3e9d92a0 3e8e157d 3f3b6620 3e8e157d -> 3ef822cf 3efc8709 3e9d92a0", + "be130c6d 3f61a834 3efd8fa0 3f61a834 3f1507a8 bd6a35f7 3f120e32 -> 3f61a834 3efd8fa0 3f61a834", + "bd8cdd18 3e8d96b1 bd5f62ae 3e8d96b1 3ca76cc9 be0b28ab be3f4a34 -> 3e8d96b1 bd5f62ae 3e8d96b1", + "3e1308f9 bc1ef186 bc1ef186 3f429a78 3e8453a6 3f7011b9 3e9f723b -> 3cebf333 3e0160a8 3f429a78", + "3f9c070b 3e2501e9 3e2501e9 3f8c5dcf 3f03e36c 3d4ed8a6 3f388201 -> 3f17bc0e 3e2501e9 3f8c5dcf", + "3f7d85e4 3f3a4dd5 3ec47309 3f280df0 3e18512e 3d3e1fb2 3f04f43e -> 3f3a4dd5 3ec47309 3f280df0", + "3f843ee4 3ee9ba99 3f968bde 3eb37077 be751803 3f801500 3d07bd84 -> 3ee9ba99 3f968bde 3eb37077", + "be897e26 3e62409b 3f94ed34 3e62409b 3e32f583 3e32f583 be4b8406 -> 3e62409b 3f94ed34 3e62409b", + "3efb742d 3f7a612d 3e8c101f 3f7a612d 3f51169e 3f51169e 3f035a3c -> 3f7a612d 3f0a5340 3f7a612d", + "3faf5ff0 3dd279e0 3e8ec032 3dd279e0 3f88b32a 3f96fead 3f55dc11 -> 3fb66d01 3fc1abf8 3f8da32d", + "3f29fd39 3f6e7bb9 3e0de802 3eaa0dbf 3e0a828c be68b203 3e0a828c -> 3f6e7bb9 3e0de802 3eaa0dbf", + "3f066240 3eac0629 3d4b887a 3eac0629 be606f2a 3f5d3ddd 3e77a90f -> 3eac0629 3ef45cb2 3eac0629", + "3fbca3fa 3f8989ce 3f8989ce 3d0645ec 3f7f60f2 3f7b607b 3f1140d5 -> 3f8989ce 3f8989ce 3f521780", + "3eae29f8 be0daebc 3f1f60be 3f16e8c0 3f1f1d37 3df5d2e2 be3fbb8e -> 3df6064c 3f1f60be 3f16e8c0", + "3eba77b3 bd8ea11a bd8ea11a bd81e667 3f800000 3f800000 3f400000 -> 3ea3cbe4 3ea3cbe4 3e6e67e2", + "3f8ff894 3ea2d92b 3ea2d92b 3ee2975c bd6a4d26 3f8668c4 3f62560c -> 3ea2d92b 3f9219a4 3f7070ca", + "bce6aedf 3f5e30c4 bddb9a1b 3f5e30c4 be0eb8f3 3e6bbe5b bd805076 -> 3f5e30c4 bdef1010 3f5e30c4", + "3fb03662 3e1c52d3 3dbae233 3f01e8e6 3f99acd0 3f517a82 3f99acd0 -> 3fcc32b9 3f8bca76 3fbb17a4", + "be9de068 3eab8c76 3db58704 3ed3f9d9 3f40f358 3f95c48f bd3884f0 -> 3e52e7b0 be7ab316 3ed3f9d9", + "3f6399c3 3f8d8714 3f6b2114 3f6b2114 3f8fed9c 3f8fed9c bdaa7f02 -> 3f8fa970 3f8d00e7 3f6b2114", + "3fa652ea bd185e5e 3e5e8287 bd340148 3f1262f4 3e77a328 3f1262f4 -> 3f411113 3e7f291f 3f419576", + "bc27a8c3 3de94491 3de94491 3e0f6a0c 3d859e4b 3d859e4b 3e570601 -> 3de94491 3de94491 3e0eae74", + "3f5b0ec9 3f996aea 3eb80bc2 3f996aea be118a05 3ecf6568 3ecf6568 -> 3f996aea 3ecc06cc 3f996aea", + "beae3d22 3e8e4f43 3ea9742d 3eeef549 3f52d572 3ea7b77d 3f52d572 -> 3dbcf712 3ea9742d 3eb0c7c0", + "3f7e89e5 3f3bc859 3ea00b9a 3f3bc859 3ef24027 3f56a400 3f38f671 -> 3f3bc859 3f55df47 3f3bc859", + "be028f9c 3f869b59 3c71360c 3e7b8a13 3d9b41ee 3d9b41ee 3f2447ff -> 3f869b59 3be3342c 3e47d3aa", + "bebf7be0 3f28602d 3da4ecdb 3f28602d 3f27f909 3e974b02 3c7e07c1 -> 3f28602d 390d8c00 3f28602d", + "be9f11ee bd101376 3f1c9093 bd101376 3f040876 3f8114cc 3edd0e6f -> be534aa4 3ef9fffe be389116", + "3e9710fc 3e5e7792 bdc5e011 bdc5e011 3ec7aec7 3e625d1c 3de7915e -> 3e8954a2 bb3d3f80 bd0e55bb", + "3f4de5f7 3eccf008 3e76288e 3daf6735 3ef84638 3ed64540 3e6e82e9 -> 3eefcafa 3ec46c69 3e50ff15", + "beb488ef 3e1cff64 3f9aceb5 3e7bed7f 3f40bbe3 be461f51 3f0b6a27 -> bd6decf0 3f9aceb5 3e101ff2", + "be091083 3f809b44 3f4ee7a3 3f5eb1dc 3eee846e 3efe4720 3eece7e5 -> 3f809b44 3f4ee7a3 3f5eb1dc", + "3f287728 3f5ec59c 3e34d7a3 3f788228 3dbeca35 3f1eb547 be355dd8 -> 3f5ec59c 3eefcca4 3f788228", + "3f64a583 3f6d70ee 3f6d70ee 3d06dcb0 3f8e5cf6 3f200fb1 3f200fb1 -> 3f8bd641 3f6d70ee 3f0fdc05", + "3e89c9c4 3f01efb3 3f93f328 3f01efb3 3f98a516 3eb606e2 3eb606e2 -> 3f312082 3f93f328 3f01efb3", + "3f161f53 3e199e73 3eac474b 3eb25d1a bd9537b0 3f97390c 3f0a4b06 -> 3e199e73 3f54fc14 3eebf67c", + "be2e094a 3ef24595 3e154675 3e154675 3d3323ae 3ef56e97 3ef56e97 -> 3ef24595 3db6707f 3db6707f", + "3f51b523 3f96ce46 3f3e5d42 3f915580 bd785f23 3f4cb62f 3f3431ba -> 3f96ce46 3f4a1e02 3f915580", + "be0128ac 3f9f5a16 3e0054fa be580b46 be10ecc8 3efad6de 3f857194 -> 3f9f5a16 3da27b6f bebcf912", + "3fa99c45 3f3c65ec 3f3c65ec 3eba5c35 00000000 3f000000 3f800000 -> 3f3c65ec 3f3c65ec 3f9a7702", + "bed2bf26 3ba700bb 3f1b9809 3ba700bb 3ee9a24d 3f64b8b0 3f594e09 -> be38f7a3 3efafcaf beaf354c", + "beb1c34b be018847 3eb5f969 3e9d8a34 be37f64b be6f302a be37f64b -> be018847 3eb5f969 3e9d8a34", + "3d97ef14 3f4ac34e 3f4ac34e be3774bf be332e71 3d4f15f0 3f8e05ed -> 3f4ac34e 3f4ac34e bdab1cef", + "3f0b1bef 3f14de02 3f14de02 3f2fe708 3f99792e 3f91dc80 bd5b3243 -> 3f6ac44e 3f627e80 3f2fe708", + "be917926 3ea9071c 3f4f74dc 3f4f74dc 3dcd2e59 3ee0c484 3f917c1b -> 3ea9071c 3f4f74dc 3f37ba66", + "3facad30 3e1894f2 3f9c6e49 3f9c6e49 3f20888b 3dc17cf8 3f1f74e6 -> 3f4b4046 3f9c6e49 3f9c6e49", + "3ee12b11 3ee78d8f 3e769ecc 3f2966eb be6a552e 3f623765 be6a552e -> 3ee78d8f 3f0606b0 3f2966eb", + "3ee42b16 3e5475ac 3f5fdfd3 3e5475ac 3f400000 3e800000 3e800000 -> 3ee60402 3f5fdfd3 3e67dcef", + "3f19bd9c 3f0a2925 3f973acd 3f8622c7 3f400000 3f800000 3e800000 -> 3f2a7e6e 3f973acd 3f8622c7", + "3fa00996 3f9c7df3 3eb457d9 3dd2a421 be17d401 be558bb1 be558bb1 -> 3f9c7df3 3eb457d9 3dd2a421", + "3e60ad33 3dc2138f 3f5ecf83 3f3cece8 3f9c8175 3f444882 3f9c8175 -> 3eaf3ac6 3f5ecf83 3f5826b5", + "be3d1171 bdb7aa39 3f043060 3e946f34 3f7bf89a be71288f 3e924b78 -> be9370bc 3f043060 3e946f34", + "3efdfbb9 be6626c2 3f6a7205 be6626c2 3f4039b3 3f5df0cf 3f5df0cf -> 3e84b850 3f6a7205 3ea2337f", + "3f062797 3e2c6b57 3f66866e 3f92b95c 3d1bd941 3f34e0ef 3d90fa8f -> 3e2c6b57 3f66866e 3f92b95c", + "3f458e1f 3cc1cf2c 3dd05feb 3dc6fade 3f800000 3f000000 3f800000 -> 3f46f018 3ed172ba 3f4b3bca", + "3e5fe5c6 be44edcb 3e0c65d0 3f3b0941 be1fda17 3f1195e4 3edb66b9 -> be3cd26f 3e6d0760 3f3b0941", + "3fb4e5ae bcd6fb9c bcd6fb9c 3eecf4fe 3f9232b6 3f44da98 3f8fbd02 -> 3fd00105 3f8c7db1 3fb2a888", + "3d816313 be4fc445 3f0269e2 3f0269e2 3f73dd77 3f371fd1 3f878452 -> be05037e 3f05be64 3f0b4c2f", + "3fb25c9b 3f8fd663 3eeed005 3f8fd663 bd9e18f8 3eaf3c53 3e99abc3 -> 3f8fd663 3eeed005 3f8fd663", + "3d8ac42b 3f09f3ee 3f09f3ee 3f2db7ed 3f9048ee 3f10b43c 3ec8006a -> 3f142880 3f0a6909 3f2db7ed" + ] + }, + { + "function": "cycles_mix_dodge", + "node": "ShaderNodeMix RGBA DODGE", + "cases": [ + "00000000 00000000 00000000 00000000 3da7df17 3eb1e53a 3eb1e53a -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3edc3dda 3f3b55ae 3f5fb666 -> 00000000 00000000 3ee35420", + "3f800000 00000000 00000000 3f000000 3f000000 3f000000 3f000000 -> 00000000 00000000 3f800000", + "3fc00000 00000000 00000000 3f400000 3e72eaad 3eafbe32 3eafbe32 -> 00000000 00000000 3f800000", + "bf000000 00000000 00000000 3f800000 3e800000 3f000000 3f400000 -> 00000000 00000000 3f3a2e8c", + "3e800000 00000000 3e800000 00000000 3f9f8ff5 bc703d32 3f183223 -> 00000000 3e7f10a3 00000000", + "3f400000 00000000 3e800000 3e800000 3f13b6a3 3f447461 bc91c720 -> 00000000 3f16c899 3e7ca0db", + "40000000 00000000 3e800000 3f000000 3e63b04d 3f88722c 3e63b04d -> 00000000 3f800000 3f668203", + "00000000 00000000 3e800000 3f400000 3f0bb46f 3f4b7927 be39052e -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 bd500c85 3f0eb77a 3f0eb77a -> 00000000 3eb177d5 3f800000", + "3f800000 00000000 3f000000 00000000 3f800000 3f000000 3f000000 -> 00000000 3f800000 00000000", + "3fc00000 00000000 3f000000 3e800000 3f9e2381 3e56c1b5 3f986a01 -> 00000000 3f3abf88 3f800000", + "bf000000 00000000 3f000000 3f000000 3f35f1f6 3e529259 bc6669c7 -> 00000000 3ee821ee 3f00e80c", + "3e800000 00000000 3f000000 3f400000 3f5c1e52 3f39adda 3f39adda -> 00000000 3f1c59c3 3f6a86a4", + "3f400000 00000000 3f000000 3f800000 be7b95ec 3f49e9c1 3f8e2a2d -> 00000000 3f800000 3f800000", + "40000000 00000000 3f400000 00000000 3f778c98 3f9deebf 3f8549b2 -> 00000000 3f800000 00000000", + "00000000 00000000 3f400000 3e800000 3f000000 3f000000 00000000 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f89f59a 3f89f59a 3dd426d4 -> 00000000 3f800000 3f06fdec", + "3f800000 00000000 3f400000 3f400000 3ea56e96 3f99cc58 3f99cc58 -> 00000000 3f800000 3f800000", + "3fc00000 00000000 3f400000 3f800000 00000000 3f000000 3f000000 -> 00000000 3f800000 3f800000", + "bf000000 00000000 3f800000 00000000 3d48741e 3f85a85e 3f85a85e -> 00000000 3f28304b 00000000", + "3e800000 00000000 3f800000 3e800000 3f27911b bd9ec0b3 3ef00d95 -> 00000000 3f7b221f 3e90fed3", + "3f400000 00000000 3f800000 3f000000 3f768ad5 3cdbf974 3cdbf974 -> 00000000 3f800000 3f02a17d", + "40000000 00000000 3f800000 3f400000 3f000000 3f800000 3e800000 -> 00000000 3f800000 3f800000", + "00000000 00000000 3f800000 3f800000 3f94b5b7 3f94b5b7 bdb33e95 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3f2a3718 3e814b91 3e814b91 -> 3ebfbf13 00000000 00000000", + "3f800000 3e800000 00000000 3e800000 3f910d9c 3f9d2cc6 3f9d2cc6 -> 3f800000 00000000 3f800000", + "3fc00000 3e800000 00000000 3f000000 3eb7bdfb 3eb7bdfb bd9152d4 -> 3f0a9ec8 00000000 3ee75f82", + "bf000000 3e800000 00000000 3f400000 be42d045 3edb8814 3f946a75 -> 3e8d74b1 00000000 3ef31398", + "3e800000 3e800000 00000000 3f800000 3f83bc66 3f83bc66 3f873f3b -> 3eac57e9 00000000 3f800000", + "3f400000 3e800000 3e800000 00000000 bdef68dc 3ed00412 bd72df53 -> 3e6b5d54 3eb81897 00000000", + "40000000 3e800000 3e800000 3e800000 3f8c8834 3f8db2d2 3f8db2d2 -> 3f800000 3f800000 3f800000", + "00000000 3e800000 3e800000 3f000000 3f800000 3f000000 3e800000 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 bccca92a 3f7ef497 3f7ef497 -> 3e7cd776 3efef5ae 3f800000", + "3f800000 3e800000 3e800000 3f800000 bdf19ce3 3f88d625 3f88d625 -> 3e64fc46 3f800000 3f800000", + "3fc00000 3e800000 3f000000 00000000 3f943244 3d50a7b5 3d50a7b5 -> 3f800000 3f0a9704 00000000", + "bf000000 3e800000 3f000000 3e800000 3f000000 3f000000 3e800000 -> 3e4ccccd 3ecccccd 3e638e39", + "3e800000 3e800000 3f000000 3f000000 3f925bc5 3f0d934c 3db3983e -> 3eb33c54 3f148944 3f02de7b", + "3f400000 3e800000 3f000000 3f400000 3f15d046 3f15d046 bd9efd28 -> 3ee4204b 3f64204b 3f356fa8", + "40000000 3e800000 3f000000 3f800000 3ee92efb 3d65e685 3f60e77b -> 3f800000 3f102f8c 3f800000", + "00000000 3e800000 3f400000 00000000 3f8f886d bd13e373 3f9c752a -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3daf09c1 3f5703c3 3f81ebb7 -> 3e85b6d1 3f800000 3f01f335", + "3f800000 3e800000 3f400000 3f000000 3f8f8d1a 3eb9b9d2 3e493ae9 -> 3f800000 3f800000 3f1f4e48", + "3fc00000 3e800000 3f400000 3f400000 3e8088d3 bdfa3ba4 3e8088d3 -> 3ecd507b 3f2242e9 3f800000", + "bf000000 3e800000 3f400000 3f800000 3f806b6f 3ede038f 3e165733 -> 3e2a7af8 3f1dca21 3f6e7e1c", + "3e800000 3e800000 3f800000 00000000 3f826486 3f826486 3f7e8940 -> 3eabbc9b 3f800000 00000000", + "3f400000 3e800000 3f800000 3e800000 be3e5b41 3f71f995 be3e5b41 -> 3e60acec 3f800000 3e60acec", + "40000000 3e800000 3f800000 3f000000 3ea8f378 3ea3fa48 3f202570 -> 3f3c3748 3f800000 3f800000", + "00000000 3e800000 3f800000 3f400000 3f97f164 3f3c6097 3f75c3f1 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f800000 3f400000 3f400000 -> 3f000000 3f800000 3f800000", + "3f800000 3f000000 00000000 00000000 00000000 00000000 3e800000 -> 3f000000 00000000 00000000", + "3fc00000 3f000000 00000000 3e800000 3f8d2ebe 3ec053da 3f8d2ebe -> 3f800000 00000000 3f800000", + "bf000000 3f000000 00000000 3f000000 3f415674 3f926a00 3cd0ced7 -> 3eb9d427 00000000 3efcc747", + "3e800000 3f000000 00000000 3f400000 3eb997d2 3f900a42 3f900a42 -> 3f0cc168 00000000 3f800000", + "3f400000 3f000000 00000000 3f800000 3f83de29 3d7aaecf 3f83de29 -> 3f800000 00000000 3f800000", + "40000000 3f000000 3e800000 00000000 3f800000 3f800000 3e800000 -> 3f800000 3f800000 00000000", + "00000000 3f000000 3e800000 3e800000 3f04d067 3f3245e5 3ef6ac74 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3e09ca9f 3f8e7c81 3e09ca9f -> 3f093bb2 3f1055c6 3f093bb2", + "3f800000 3f000000 3e800000 3f400000 3e6c636c 3e841d6a 3ee0131f -> 3f266ac3 3eac83ec 3f800000", + "3fc00000 3f000000 3e800000 3f800000 3dc43735 3df2ce22 3f8b544f -> 3f157b87 3e9bafc9 3f800000", + "bf000000 3f000000 3f000000 00000000 be664f0a 3daf8f70 3daf8f70 -> 3f1037d6 3ef57a7b 00000000", + "3e800000 3f000000 3f000000 3e800000 3f94aba6 3e8fda07 3e8fda07 -> 3f346050 3f09ab82 3e89ab82", + "3f400000 3f000000 3f000000 3f000000 3e7a02ff 3f9dc41f 3e7a02ff -> 3f1cb150 3f800000 3f1cb150", + "40000000 3f000000 3f000000 3f400000 3f800000 3f800000 3f000000 -> 3f800000 3f800000 3f800000", + "00000000 3f000000 3f000000 3f800000 3f7c6719 3f7c6719 3f08929c -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f61a169 3f994546 3f1a62df -> 3f64d9e7 3f800000 00000000", + "3f800000 3f000000 3f400000 3e800000 3f000000 3f800000 00000000 -> 3f800000 3f800000 3e800000", + "3fc00000 3f000000 3f400000 3f000000 3f76bb6b 3eaa1836 3eaa1836 -> 3f800000 3f800000 3f7f250c", + "bf000000 3f000000 3f400000 3f400000 3e458032 3f4f1a4f 3f3e903f -> 3ee97bd9 3f08b425 3f0bec00", + "3e800000 3f000000 3f400000 3f800000 bd6eb6a4 3f0b952f 3f0b952f -> 3efc52dc 3f5e4d65 3f800000", + "3f400000 3f000000 3f800000 00000000 3cc78c8b 3f5e112c 3d9c557b -> 3f0261c9 3f800000 00000000", + "40000000 3f000000 3f800000 3e800000 3f62bc48 3f9444ee be178878 -> 3f800000 3f800000 3e458958", + "00000000 3f000000 3f800000 3f000000 bc76b1e0 3eba9155 3e9dba32 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3e045fe3 3f28bf01 3f6ac2ff -> 3f08d85a 3f800000 3f800000", + "3f800000 3f000000 3f800000 3f800000 3f400000 3f400000 3f000000 -> 3f800000 3f800000 3f800000", + "3fc00000 3f400000 00000000 00000000 3d64e815 3ef8b416 3d64e815 -> 3f519152 00000000 00000000", + "bf000000 3f400000 00000000 3e800000 bdd5688f bdd5688f be612298 -> 3f4a8daa 00000000 3e8fcf0d", + "3e800000 3f400000 00000000 3f000000 be6aa21e 3f951065 be385592 -> 3f3598f3 00000000 3ef4f9aa", + "3f400000 3f400000 00000000 3f400000 3f9141b0 3da0d57e 3da0d57e -> 3f800000 00000000 3f4c0432", + "40000000 3f400000 00000000 3f800000 3f000000 3f000000 3f400000 -> 3f800000 00000000 3f800000", + "00000000 3f400000 3e800000 00000000 3f00f65f 3ddc325e 3f6d1c84 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3e800000 3f000000 3e800000 -> 3f5b6db7 3eaaaaab 3e924925", + "3f800000 3f400000 3e800000 3f000000 3f810d80 be5e0797 3ed27453 -> 3f800000 3e526229 3f595569", + "3fc00000 3f400000 3e800000 3f400000 3e92cc8d 3e8a3c8c 3f141885 -> 3f800000 3ed71f53 3f800000", + "bf000000 3f400000 3e800000 3f800000 3ea3117b bdfdfeeb 3f443ae5 -> 3f259ff6 3e88764d 3f3911df", + "3e800000 3f400000 3f000000 00000000 3e254db7 3f0fcffa 3e254db7 -> 3f481310 3f14e9e9 00000000", + "3f400000 3f400000 3f000000 3e800000 3e515745 be49c149 3f051943 -> 3f62c508 3edf0a8f 3ed1d088", + "40000000 3f400000 3f000000 3f000000 3f589b2f be2519de be2519de -> 3f800000 3ec19404 3ec19404", + "00000000 3f400000 3f000000 3f400000 be142b06 3efea287 3efea287 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f400000 00000000 3f000000 -> 3f800000 3f000000 3f800000", + "3f800000 3f400000 3f400000 00000000 3ee21cc0 3f63d0a4 bdb3afbf -> 3f800000 3f800000 00000000", + "3fc00000 3f400000 3f400000 3e800000 3f78389e 3e9bf2ed 3f78389e -> 3f800000 3f800000 3f800000", + "bf000000 3f400000 3f400000 3f000000 bd2f045a 3f6e78d5 bd2f045a -> 3f443107 3f02fd54 3f02cb5a", + "3e800000 3f400000 3f400000 3f400000 3dadd43a 3dadd43a 3d8a51e7 -> 3f442996 3f442996 3f434c2c", + "3f400000 3f400000 3f400000 3f800000 3f24e0cd be0ebe9e 3f9c39e0 -> 3f800000 3f2dd399 3f800000", + "40000000 3f400000 3f800000 00000000 3f400000 3e800000 3f800000 -> 3f800000 3f800000 00000000", + "00000000 3f400000 3f800000 3e800000 3e67b876 3f99e33b 3f99e33b -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3ea236a6 3ea236a6 3f0dafe6 -> 3f6423d9 3f800000 3f30f983", + "3f800000 3f400000 3f800000 3f400000 3d7d152b 3f859c88 3f7fc732 -> 3f4ca500 3f800000 3f800000", + "3fc00000 3f400000 3f800000 3f800000 be595850 3ed00f42 3ed00f42 -> 3f11a238 3f800000 3f800000", + "bf000000 3f800000 00000000 00000000 3e800000 3f000000 00000000 -> 3f638e39 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 3df0a1f9 3dd6f635 be4c6867 -> 3f800000 00000000 3e73d4ef", + "3f400000 3f800000 00000000 3f000000 3f59ee85 3e89e410 3f44c62d -> 3f800000 00000000 3f800000", + "40000000 3f800000 00000000 3f400000 bbe658e5 3f9ef112 bbe658e5 -> 3f7c7362 00000000 3f3d568a", + "00000000 3f800000 00000000 3f800000 3f379d5f be0ab707 3f217391 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 be502166 be502166 bdc37546 -> 3f68623c 3e68623c 00000000", + "3f800000 3f800000 3e800000 3e800000 3ed671df 3f56a75f bc1697ae -> 3f800000 3f800000 3e7dab1e", + "3fc00000 3f800000 3e800000 3f000000 00000000 00000000 00000000 -> 3f800000 3e800000 3f000000", + "bf000000 3f800000 3e800000 3f400000 00000000 3f400000 3f400000 -> 3f800000 3e3a2e8c 3f0ba2e9", + "3e800000 3f800000 3e800000 3f800000 3dba28f6 3f2ef30b 3f14e0c2 -> 3f800000 3e9a5ff2 3f800000", + "3f400000 3f800000 3f000000 00000000 3f81cc29 3f81cc29 3e73f99d -> 3f800000 3f800000 00000000", + "40000000 3f800000 3f000000 3e800000 3f395271 3f395271 3f7a3896 -> 3f800000 3f800000 3f800000", + "00000000 3f800000 3f000000 3f000000 3e24ee19 3e8d89a7 3e91e17a -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 bd436bca 3f3d275b 3f805835 -> 3f7a090f 3f4afe95 3f800000", + "3f800000 3f800000 3f000000 3f800000 3f907fdd 3f57b4c4 3f907fdd -> 3f800000 3f800000 3f800000", + "3fc00000 3f800000 3f400000 00000000 3e44b247 3f734f76 3eb34473 -> 3f800000 3f800000 00000000", + "bf000000 3f800000 3f400000 3e800000 3f800000 3e800000 3e800000 -> 3f2aaaab 3f2aaaab 3e638e39", + "3e800000 3f800000 3f400000 3f000000 3eb65294 bb8835ee bdc5c7b0 -> 3f800000 3f3fccfa 3ef9f70f", + "3f400000 3f800000 3f400000 3f400000 3df94875 bdd197bd bdd197bd -> 3f800000 3f325043 3f325043", + "40000000 3f800000 3f400000 3f800000 3edee9dd 3e8fda3c 3f0290ad -> 3f800000 3f800000 3f800000", + "00000000 3f800000 3f800000 00000000 be599ce1 bdec4157 3f64130c -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f80aead be5b6f10 3f8bc6d5 -> 3f800000 3f6739ab 3f0cf852", + "3f800000 3f800000 3f800000 3f000000 3ec5749c 3f106ac0 3f4e3635 -> 3f800000 3f800000 3f800000", + "3fc00000 3f800000 3f800000 3f400000 3f6892e9 3e956947 3e956947 -> 3f800000 3f800000 3f800000", + "bf000000 3f800000 3f800000 3f800000 3f37dd87 3f37dd87 ba1925ef -> 3f3c5bb8 3f3c5bb8 3f800000", + "3e800000 00000000 00000000 00000000 3f157c11 3f2efb61 3f157c11 -> 00000000 00000000 00000000", + "3f400000 3e800000 3e800000 3e800000 3eafc15f 3d468e1d 3f093a53 -> 3eac6143 3e84d447 3ed60f29", + "40000000 3f000000 3f000000 3f000000 3f4fa733 3e64a47f 3ecb248e -> 3f800000 3f6748ab 3f800000", + "00000000 3f400000 3f400000 3f400000 bd45b2c4 3e9a3953 3e9a3953 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3e382ff6 bdc85eb6 be655dd5 -> 3f800000 3f740f98 3f663780", + "3f800000 3fa00000 3fa00000 3fa00000 3f1ac973 3f28b05d 3f19382f -> 3f800000 3f800000 3f800000", + "3fc00000 be800000 be800000 be800000 be3c3fda be094ed1 be05f70d -> be48aa53 be5521bf be560118", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3f5c7bf0 3f9b048b 3f9b048b -> 3d8f2746 3d7f1df1 3d7f1df1", + "3e800000 3f666666 3f666666 3f666666 3f370e51 3f912dad 3f9f3792 -> 3f800000 3f800000 3f800000", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f378e93 3f9803ad 3f378e93 -> 3f389c2c 3f800000 3f389c2c", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f561b1d 3f5f91ed 3f5f91ed -> 3f800000 3f800000 3f800000", + "00000000 3f3236c1 3f3236c1 be1adef6 3ec9f324 3ec9f324 3ef867a0 -> 3f3236c1 3f3236c1 be1adef6", + "3f000000 3c7fb457 3ec129ad bdfa4b04 3f977b8b 3f053e46 3f977b8b -> 3d1c93dd 3f028ed1 be994394", + "3f800000 bc3983f8 3f79b842 3f52d846 3f6312c3 3f58987e 3f6312c3 -> bdcd39b4 3f800000 3f800000", + "3fc00000 3eb7aff0 3f7398a0 bd06cf7f 3f50e536 3e6bad43 3f613c1c -> 3f800000 3f800000 3f800000", + "bf000000 3df5b784 3df5b784 3ef834de 3f5fa282 bde345bf 3f5fa282 -> 3dab04b1 3e02136d 3eacc04a", + "3e800000 3f949fbe 3f534667 bc7433a6 3f73fdd0 3e7706f4 3eb88342 -> 3f800000 3f60d5ab bc8630cf", + "3f400000 3e66d28e be1089df bdf1a1a3 3aa1b479 3aa1b479 3f3e7f25 -> 3e670948 be10ac24 be88b2ed", + "40000000 3e7d94f9 3f63ddc2 3e7d94f9 3f41e99e 3ee784dd 3e9de507 -> 3f800000 3f800000 3f256d3a", + "00000000 3f868777 3f1b3acb 3c51bfb7 3f800000 00000000 3f000000 -> 3f800000 3f1b3acb 3c51bfb7", + "3f000000 be3d9063 bd128974 bd253894 3f0bed0c 3e4da6fd 3e0c19a7 -> be826d3c bd22e4e6 bd315a7c", + "3f800000 3f8856a3 3f15841e 3f8856a3 3f184318 3f9098e9 3f9a056f -> 3f800000 3f800000 3f800000", + "3fc00000 3f41c1cd 3f759e4d 3f41c1cd 3f74a25d bbe714c5 bbe714c5 -> 3f800000 3f730c22 3f3fba9a", + "bf000000 3d56bcb0 3f4af738 3e85d9af 3f1c6c66 3f956089 3f116adf -> 3d247c10 3f002ccf 3e507c92", + "3e800000 3ea579da be02e74b 3ea579da 3f12d8e0 3f911a06 3f017007 -> 3ec12dcb be36ac67 3ebd6b59", + "3f400000 3f690eb5 3e0bd0f9 3da26b6f 3e8f02d4 3f595976 3f7bed9a -> 3f800000 3ec075d9 3e9b05bf", + "40000000 3e9735a3 3d178ca0 3e9735a3 be76909a be67b00d bdab07ef -> 3e4c1ed2 3cd0abee 3e819193", + "00000000 3f919f90 3e1f285c 3f5b8c4e 3f800000 3f800000 00000000 -> 3f800000 3e1f285c 3f5b8c4e", + "3f000000 3f933770 3f8eb67b 3e3277b7 3f834ba9 be01dad7 3f297055 -> 3f800000 3f800000 3e855ef7", + "3f800000 3f35f0f7 3f3d944b 3f3d944b 3f657340 3f0d2e8c 3e27b9e9 -> 3f800000 3f800000 3f62b6c2", + "3fc00000 3f3cdb24 3f3cdb24 be694a44 3e5cd23c 3d664b77 3d664b77 -> 3f800000 3f4e401e be7ec6f0", + "bf000000 3d80337f 3f014524 3f3c9871 3f507500 3f353e64 3f818369 -> 3d363702 3ebef257 3efa793a", + "3e800000 3eb30679 be6b3538 bdff58a0 3f38deeb 3f8ab261 3db8112e -> 3eda7782 bea14c65 be029b94", + "3f400000 bdc72a7e 3f7acabc 3f8e1e49 3f514905 3f69137a 3f69137a -> be80b4f6 3f800000 3f800000", + "40000000 3f532d0a 3cc85b14 3cc85b14 3ebbf188 3ebbf188 3ee8b00d -> 3f800000 3dbc69de 3e8982c1", + "00000000 3ece7564 3eac8c2c 3f882491 3f6248fc be3956d5 3e5a6366 -> 3ece7564 3eac8c2c 3f800000", + "3f000000 3d6491a4 3f941491 3d6491a4 3e8a62f2 3f828b3d 3e8a62f2 -> 3d842482 3f800000 3d842482", + "3f800000 3e243986 3f5b9fcf be513cf0 3f15b3d5 bc3ebe90 3f15b3d5 -> 3ec5c106 3f5918c7 befbf524", + "3fc00000 3f5ed716 be6a5321 3f0cc626 3e146984 3f01ccf3 3f8f4d20 -> 3f800000 bf74a630 3f800000", + "bf000000 3f10ba23 3f10ba23 3e853943 3f9b8e6e 3e6c090e be368e6f -> 3eb40c85 3f01c553 3e9242e1", + "3e800000 3f85c7ab bdf626e8 3f23578a 3f4174a1 3df8e2ef 3df8e2ef -> 3f800000 bdfddd64 3f2875c5", + "3f400000 3f2dcd14 3efcc0f8 3f2d03a8 3f8d9687 be431356 3f89c35d -> 3f800000 3edd27d6 3f800000", + "40000000 3e8de846 3f640417 3f9eb854 3d297d1a 3d297d1a 3f39c48a -> 3e9ab5fe 3f7896b6 3f800000", + "00000000 3e8b25a5 3f7bebc3 3f7bebc3 3f44dceb 3f7034fd 3f420991 -> 3e8b25a5 3f7bebc3 3f7bebc3", + "3f000000 3f9ea590 bd7d46c2 3f93ddab 3e800000 3f800000 3e800000 -> 3f800000 bdfd46c2 3f800000", + "3f800000 3da34024 3f89d54c 3f38bb5f 3f400000 3f000000 00000000 -> 3ea34024 3f800000 3f38bb5f", + "3fc00000 3e8abdb0 3e81c3bf 3e8abdb0 3f800000 00000000 3f800000 -> 3f800000 3e81c3bf 3f800000", + "bf000000 3eaecc31 be7fe578 3f3ab806 3ec48ac3 3f8dca3b 3ec48ac3 -> 3e92a676 be24aefe 3f1ca6dc", + "3e800000 3f1733fb 3bdbdc75 3bdbdc75 3e56b28c 3f500229 3f500229 -> 3f1f9125 3c09f41a 3c09f41a", + "3f400000 3ebdb0dc 3ebdb0dc 3f70fe4d 3f000000 00000000 3f000000 -> 3f17c0b0 3ebdb0dc 3f800000", + "40000000 3f54fdcb 3f1a027b 3f1a027b bc6b5419 3e139fb8 3e72d2ec -> 3f4f0b31 3f5867c9 3f800000", + "00000000 3f32bb6d 3f2f8611 3f9a0833 3eeab121 3f7a1c01 3f7a1c01 -> 3f32bb6d 3f2f8611 3f800000", + "3f000000 3f02a25d 3f02a25d be4b6a39 bb43b61c 3f4e282e bb43b61c -> 3f027080 3f5ab091 be4b1c95", + "3f800000 bd683fc3 be5b9af3 be5b9af3 3e800000 3e800000 00000000 -> bd9ad52d be92674d be5b9af3", + "3fc00000 3e4c016d be1cb445 be1cb445 3f06ff79 3f346336 3f06ff79 -> 3f7407ad 3f800000 bf3b72cb", + "bf000000 3f432e2c be325910 3f1015f1 3f000000 3e800000 3e800000 -> 3f1c24f0 be1e880e 3f001381", + "3e800000 3d534fa0 3f229229 be27a6e4 be16a20a be16a20a 3f97404b -> 3d4bd0cb 3f1ccdeb be6df17e", + "3f400000 3f403eac 3f809bdc 3f7de038 3f8ff5e3 3e0347b1 3e0347b1 -> 3f800000 3f800000 3f800000", + "40000000 3f8082d8 3f3a3899 3e8f38f5 3f876de6 3e2615d0 3f876de6 -> 3f800000 3f800000 3f800000", + "00000000 bd89dd0b 3d15a835 3d15a835 3f000000 3f400000 3f800000 -> bd89dd0b 3d15a835 3d15a835", + "3f000000 3f62c582 3f62c582 3f49cf72 3f88f784 3ef86180 3f2fa302 -> 3f800000 3f800000 3f800000", + "3f800000 3f4f2552 3ab20849 3ab20849 3f1248c9 3f934cb4 3f8f15fc -> 3f800000 3f800000 3f800000", + "3fc00000 3f7e5ec7 3f7e5ec7 3e1a0754 3ef07ed8 3ddfa300 3edf918f -> 3f800000 3f800000 3edf388c", + "bf000000 3f9a5383 3f9a5383 3ecc6bba 3f646866 3f1932a0 3f1932a0 -> 3f556fbe 3f6d918b 3e9d5784", + "3e800000 3e779bba 3f8b8b45 3f8b8b45 3f70afa4 3f70afa4 3f5feaf0 -> 3ea1d853 3f800000 3f800000", + "3f400000 3f0c6d1d 3f0c6d1d 3dec647b 3f7c92b7 3f4bd37a 3f4bd37a -> 3f800000 3f800000 3e92b2eb", + "40000000 3e872dee 3f74ca47 3f8687c4 be0746ed 3f983575 be0746ed -> 3e55dafe 3f800000 3f54d41f", + "00000000 3eea650a 3f629b0a 3f629b0a bd56a36c 3ed3a2ab 3ed3a2ab -> 3eea650a 3f629b0a 3f629b0a", + "3f000000 3f183bb4 3f97ebe0 3f6d6cfa 3d70e003 3f23d047 be4c5f86 -> 3f1cd854 3f800000 3f57e1e8", + "3f800000 3eb884d7 3eb884d7 3f4bf78a be7eccd4 be7eccd4 3e8d5f7a -> 3e93c0ee 3e93c0ee 3f800000", + "3fc00000 be40c90c 3f29e851 3e059fdb 3f16193b bdc7311e bdc7311e -> bfc7f52f 3f144676 3de9392c", + "bf000000 3f6ffc88 3eaf2bdf 3f8ab341 3f2cce94 3ef299a9 3d9e0d3e -> 3f336d64 3e8d9ea2 3f800000", + "3e800000 3e6a98dd bdcb3389 3f516f8c 3e800000 3f400000 3f800000 -> 3e7a3ca7 bdfa180b 3f800000", + "3f400000 3eb29f97 be28b955 3eb29f97 3f7fd93b bd1aa462 bd1aa462 -> 3f800000 be2413f5 3eadb46e", + "40000000 3f31c116 be3ffc28 3e68589e 3ecc5d9b 3d6d90f6 3ecc5d9b -> 3f800000 be592d69 3f800000", + "00000000 3f4d0526 bdb36e49 3f4d0526 3f29aa0e 3d89184d be5154f1 -> 3f4d0526 bdb36e49 3f4d0526", + "3f000000 3db86eb8 3db86eb8 3e50fd35 3f5e468e 3f187b74 3f067ef4 -> 3e22f6d9 3e0353f2 3e8db938", + "3f800000 3f060afa 3f3416bc 3e871e74 3e800000 3f400000 3e800000 -> 3f32b94d 3f800000 3eb4289b", + "3fc00000 3f9830a7 3f9830a7 3f1a474f 3f30d99c 3ec833b7 3f30d99c -> 3f800000 3f800000 3f800000", + "bf000000 3efff691 3e84513f 3f1cb9b2 3eb378b0 3eb378b0 3f31f394 -> 3ed9cab6 3e612b96 3ee89b1c", + "3e800000 3f376028 3f376028 3f9e5224 3ea4897b be7ec075 3f7a6bb8 -> 3f476524 3f2ca369 3f800000", + "3f400000 3e6cd74a 3e6cd74a be739e86 3f400000 3e800000 3e800000 -> 3f075673 3e91bf90 be95eb66", + "40000000 3f4cb170 3f349e8a 3e5f3dd7 3ec44680 3ec44680 3f58497a -> 3f800000 3f800000 3f800000", + "00000000 be3c3306 3f3af4df 3deee9c5 3e2d9619 bdc52387 3e2d9619 -> be3c3306 3f3af4df 3deee9c5", + "3f000000 3dff30c2 3f3b7917 3dff30c2 3ee97de4 3f5619ea 3ee97de4 -> 3e25486e 3f800000 3e25486e", + "3f800000 bd865b37 3f64282c 3f64282c 3e57294f 3f1f14df 3e13deb8 -> bdaa18c8 3f800000 3f800000", + "3fc00000 bdb38451 bdb38451 3e42100f 3f36f21d 3e0e1d29 3f36f21d -> 3f800000 bde2b674 3f800000", + "bf000000 3ec827d3 3f33641b be7a3ae4 3e1ec5cd 3ede10dc 3ede10dc -> 3eb9c13a 3f136bce be4da2b9", + "3e800000 3e8e6cfc 3f89b570 3e8e6cfc 3f0e1547 be5bbf61 3f69b5a7 -> 3ea55f1c 3f800000 3eb88b74", + "3f400000 3f74b86a 3f74b86a 3f23e325 3f7945e2 be5e09e9 3da1ade6 -> 3f800000 3f527d44 3f2e3398", + "40000000 3e9c3a16 3f4c0fb4 3f5995f0 bdfdb886 3f568534 3ee501e3 -> 3e7a68af 3f800000 3f800000", + "00000000 be3fc748 3f0b75c1 be3fc748 00000000 3f000000 3e800000 -> be3fc748 3f0b75c1 be3fc748", + "3f000000 3f6a0465 3f530de6 3f530de6 3f000000 00000000 00000000 -> 3f800000 3f530de6 3f530de6", + "3f800000 3c8af41c 3f940a90 3f6b33e7 00000000 3e800000 3f000000 -> 3c8af41c 3f800000 3f800000", + "3fc00000 3ed51e3b 3ed51e3b 3f64f3d8 be6641e6 3f43cdd4 3f71af13 -> 3e9f5d92 3f800000 3f800000", + "bf000000 bdfefdd5 be46e74a be46e74a 3ee01e2a 3ee01e2a 3e9a663f -> bdd1343e be232ffc be2cd79b", + "3e800000 3ea457d1 bd455d83 3ea457d1 3f273aba 3ef96d46 3ef509a4 -> 3ec46ba2 bd60bc69 3ebaadba", + "3f400000 3f094226 3daac0e4 3edcd2b6 3e800000 3f400000 00000000 -> 3f28eef4 3e432597 3edcd2b6", + "40000000 be5d9471 be5d9471 3df18da7 3e9f1861 3f835505 3f0c89f7 -> bf125737 3f800000 3f800000", + "00000000 3e01da6d 3e01da6d 3f6c9790 bdf4561c 3f394770 bdbe6cdf -> 3e01da6d 3e01da6d 3f6c9790", + "3f000000 3f376b17 3e0fe7b2 3c390b0d 3f8a6096 3ea58b45 3e48850c -> 3f800000 3e2ba7d6 3c4d208f", + "3f800000 bd61f73e bd61f73e bdd90c18 3f25f544 3f1f8bbb bd0bfbf6 -> be209ca9 be15ef3c bdd1dfe5", + "3fc00000 be67887a 3df096c6 be67887a 3f90c28c 3f90c28c 3ec1b2f4 -> 3f800000 3f800000 bf05d3c7", + "bf000000 3f9914cc 3f3e4154 3f3e4154 3f400000 3f400000 00000000 -> 3f5ea9e3 3f0a5e0f 3f3e4154", + "3e800000 3f912f21 3f912f21 bdf44b4f 3f58dab8 3f58dab8 3e31b3bc -> 3f800000 3f800000 bdff5f95", + "3f400000 3f9184be 3eb43d75 ba8bdd7d 3f655d3d 3d2347a4 3ed05047 -> 3f800000 3eb9cb7c bac94993", + "40000000 3f74b287 3f9a5c8a 3f9a5c8a 3f93a326 bdabeb79 3f93a326 -> 3f800000 3f800000 3f800000", + "00000000 3ecd4c4d 3ecd4c4d 3df5a711 3f9ebd44 3f9ebd44 3f881f0b -> 3ecd4c4d 3ecd4c4d 3df5a711", + "3f000000 3ecf9699 3e87545a 3e87545a 3f490f2b 3f490f2b 3d9c7261 -> 3f2ae8ba 3eded5f2 3e8cb424", + "3f800000 3e92e103 3ef9cd08 3e92e103 3e800000 00000000 3f400000 -> 3ec3d6af 3ef9cd08 3f800000", + "3fc00000 3f8749c7 3ebf2229 3f0d590c 3ead2bde 3f9e9896 3ead2bde -> 3f800000 3f800000 3f800000", + "bf000000 3edb40fd 3cf86332 bc64b916 3f2bdcfc 3f2554fa 3d6b8293 -> 3ea42716 3cbbc203 bc5e54cd", + "3e800000 bcfc4100 3eebc3bf 3dcaa3b4 00000000 3f400000 00000000 -> bcfc4100 3f1115ff 3dcaa3b4", + "3f400000 3f9652d3 3f780d9e bd96748c 3f8f5057 3f600410 3f600410 -> 3f800000 3f800000 be5adfa5", + "40000000 3f89f765 3f89f765 3f7edb79 3ee792db 3e6fb573 3f3a7b46 -> 3f800000 3f800000 3f800000", + "00000000 3cecd73d 3ebdb1ea 3f81e5c2 3eb82e6b 3f3e11a8 3f302259 -> 3cecd73d 3ebdb1ea 3f800000", + "3f000000 be4fb927 3f2e0c8f 3f65ffe2 be05e1f8 3f642279 bd887fcf -> be42fa24 3f800000 3f5e94fe", + "3f800000 3f6f8b23 3d17f3d0 3e03756a 3f035727 3f3e8fa4 3f187e87 -> 3f800000 3e149c77 3ea2915e", + "3fc00000 3f2390db 3f498eea 3f2390db 3f643082 bb5f8f33 3f643082 -> 3f800000 3f48883c 3f800000", + "bf000000 3f99bdb4 3f19a657 3cedfeb1 bd298291 3ee5f12c 3f748129 -> 3f800000 3efaf2c7 3ca11301", + "3e800000 3f80d36b 3f734da2 3ea35163 3f400000 00000000 3e800000 -> 3f800000 3f734da2 3eae34ae", + "3f400000 bd7c80bf 3decdaf0 3decdaf0 3ec8adbf 3e94b4ed 3e94b4ed -> bdb2d12a 3e1768d2 3e1768d2", + "40000000 3f32d5fd 3f963a7c 3ea8eca0 3f433f1e 3f43a112 3f433f1e -> 3f800000 3f800000 3f800000", + "00000000 3e5da4c9 3f6da45f 3ef51068 3d82eb30 3e415b20 3e42dd2d -> 3e5da4c9 3f6da45f 3ef51068", + "3f000000 3f41fa78 3f89b04e 3f41fa78 3f800000 3f400000 3f000000 -> 3f800000 3f800000 3f800000", + "3f800000 3f4d0d72 3e7a5f11 3f86c40b 3f400000 3e800000 00000000 -> 3f800000 3ea6ea0b 3f800000", + "3fc00000 3e28d290 3f5317cb be7cebfb 3f800000 3f000000 3f800000 -> 3f800000 3f800000 3f800000", + "bf000000 3ebcf1db 3f570b30 3f9f953c 3f4d3597 3f4d3597 3e4463a4 -> 3e86e22d 3f1983d5 3f800000", + "3e800000 3f96de89 3f6bbd56 3e967f8e 3f658842 3f36d4b2 3f36d4b2 -> 3f800000 3f800000 3eb735a4", + "3f400000 3f0841d4 bd9e0e5c bd9e0e5c 3f42f9dc 3f9bcf94 3f42f9dc -> 3f800000 bf62f8fe be384efd", + "40000000 3f0a4d06 3f81badd 3f549a47 3f51db34 3f7d5409 3d8d7cce -> 3f800000 3f800000 3f76b018", + "00000000 3f0f264a 3f0f264a 3f422d6e 3eb56877 3ddaf150 be6390a4 -> 3f0f264a 3f0f264a 3f422d6e", + "3f000000 bdcb2e8b bdcb2e8b 3f8d2404 3e412e9c 3f8a56b8 3e4eb987 -> bde057f0 be5d08ff 3f800000", + "3f800000 3f691771 3f0c140d 3f691771 be731049 be731049 bdee498e -> 3f3c608a 3ee269e0 3f50cc36", + "3fc00000 bd99dce5 3f9c6363 3e58e77e 3f0ebf2f 3f7c236d 3f7c236d -> beeb2174 3f800000 3f800000", + "bf000000 3f6aa404 3f5adada 3e4dab21 3f078e15 3ef97029 bd893299 -> 3f3985c4 3f2ffc71 3e54cbd4", + "3e800000 3de25c7c 3f836a8f 3f28bd47 3e37246a 3ee0f3f2 3f1af5fb -> 3decf4c7 3f800000 3f46d3e9", + "3f400000 3e76629a 3e76629a 3d16e082 3f646134 3f5d633f 3f646134 -> 3f3a231c 3f2f495f 3de3f77c", + "40000000 3df59e22 3f99c9d9 3f99c9d9 3f14c62e 3f20314a 3f20314a -> 3f800000 3f800000 3f800000", + "00000000 3ee75cee bd1698af 3f04560f 3f800000 00000000 00000000 -> 3ee75cee bd1698af 3f04560f", + "3f000000 3e8b9885 be1cf94c 3e8b9885 3f800000 3f800000 3f400000 -> 3f0b9885 be9cf94c 3edf5a6e", + "3f800000 3ead8146 3e8c7b69 3f14b3b5 3f84704f 3f848be6 3db87365 -> 3f800000 3f800000 3f236b95", + "3fc00000 3f807592 3f09858d 3f4bc922 be39f6fe 3ec6be10 3e156a58 -> 3f49ea3c 3f800000 3f800000", + "bf000000 be6639be 3f116494 3f116494 3f9b7922 3f4a6afe 3f9b7922 -> be0f3c66 3ed0658b 3eb4e9ec", + "3e800000 3f043cd5 3f285253 3f285253 3e800000 3e800000 3f800000 -> 3f0d0db0 3f338b03 3f606dc4", + "3f400000 3f5773c9 3ece5ca5 be4e3eff 3d1c492b 3f95cfdc 3f95cfdc -> 3f5dccaa 3f800000 bfd2fabd", + "40000000 3f19b80b 3e68e0f9 3da57f1e 3e800000 3f400000 3f000000 -> 3f800000 3f800000 3f800000", + "00000000 3e7a3ddc 3e7a3ddc 3f2142dd 3f4ec436 3f8363fb 3f4b5924 -> 3e7a3ddc 3e7a3ddc 3f2142dd", + "3f000000 3f8e401b 3f1ca1c6 3f8e401b 3f4eaa15 3ed41a01 3ed41a01 -> 3f800000 3f458cfa 3f800000", + "3f800000 be02ec0c bd66e984 bd66e984 3f3bb461 3f6b1c77 3f6b1c77 -> bef56027 bf30de9c bf30de9c", + "3fc00000 3f37cebe 3ee587ce 3ee587ce 3f2e0f23 3e016218 3f941c31 -> 3f800000 3f0d9a47 3f800000", + "bf000000 bcf7e0b8 3f66a839 3f207f3b 3e800000 3e800000 3f000000 -> bcdc55f9 3f4d074f 3f0065c9", + "3e800000 3db5c8ce 3f981ec3 3f981ec3 3aa1e322 3f332f3f be1e30fc -> 3db5d72d 3f800000 3f800000", + "3f400000 be774bc8 be01b3a7 be01b3a7 3f826772 3e56c815 3ef4f409 -> bf8307f3 be19ea03 be4a4917", + "40000000 3f80812c 3f14231a 3f80812c 3f41a802 3f9b4a94 3f873f9e -> 3f800000 3f800000 3f800000", + "00000000 be0d190e 3f61e6c2 3f9505a2 3f110989 3d482ba6 3f8b22e4 -> be0d190e 3f61e6c2 3f800000", + "3f000000 3e2ecdb4 bd9db06d 3e3c32a4 3edf2f4e 3e37580f 3edf2f4e -> 3e5f8550 bdad31b0 3e70a5e2", + "3f800000 3f7edb35 3f6dcf9a 3ec596c7 3c148b1c 3f9cb2ef 3f9cb2ef -> 3f800000 3f800000 3f800000", + "3fc00000 3e8d6e17 3e9f5d9a 3ec623ce 3f47a8ea 3f09554a 3f47a8ea -> 3f800000 3f800000 3f800000", + "bf000000 3f85905b 3f5c3998 3f85905b 3f800000 3e800000 3f800000 -> 3f3215cf 3f43c16b 3f3215cf", + "3e800000 bd73ab8c bd73ab8c 3eae9e22 00000000 00000000 3f800000 -> bd73ab8c bd73ab8c 3ee8d2d8", + "3f400000 3f4d334b 3f09573c bc125a28 be4fb12d 3eedc9b2 3f6ac074 -> 3f321b67 3f52bfdc bcea59b7", + "40000000 3f821879 bc94ab2a 3f821879 3f89aaaa be29729f 3eac6869 -> 3f800000 bc5f66dd 3f800000", + "00000000 3f33fef3 3f8856f7 3e678456 3f514e98 3f514e98 3d8be74f -> 3f33fef3 3f800000 3e678456", + "3f000000 3ede439e 3db3fe05 3ea741fb 3eec8ea9 3f2c64af 3eec8ea9 -> 3f108479 3e07ae38 3ed98104", + "3f800000 3f17c812 bdd504d6 bdd504d6 3f0244be 3f30cf7e bde1ff5e -> 3f800000 beac28ca bdbfd92e", + "3fc00000 3ea46eb8 bd985943 bd985943 3e07e34a 3cdacbab bd11e513 -> 3ecd4c48 bd9eb4f7 bd909f2d", + "bf000000 3f433bcc 3f0fe706 3f8df99e 3e5351f8 3f6490a1 3eb6918a -> 3f30f90d 3ec6fa5b 3f70fc2b", + "3e800000 be76ff7a bd978aa8 be76ff7a 3f845875 bda62b8a bda62b8a -> bea68cd1 bd948760 be72165d", + "3f400000 be4eeb98 3daa25ee be1f8ac8 3f8deb6b 3f44dadc 3ec30e31 -> bf998e77 3e48fd45 be5f5ccf", + "40000000 3ee389c0 3e2a083c 3ee389c0 3ee6bbd4 3e88b4f4 bd189fa0 -> 3f800000 3eb6713b 3ed3c1db", + "00000000 3f954c5f 3f9ac397 3cbdc1eb 3daf3af5 3f1a4917 bd450ab5 -> 3f800000 3f800000 3cbdc1eb", + "3f000000 3e926fa1 3e8b796e 3ea05c7f be247ae5 3f3fc848 be247ae5 -> 3e878cba 3edf01db 3e947093", + "3f800000 3f076650 3e70a071 3eab5128 3ddeaf9f bd0e1590 3f6387f5 -> 3f17eb12 3e688f41 3f800000", + "3fc00000 3f9bb06d bb4b7ccf 3f4aaf50 3c86b379 bde26b0b 3f729c13 -> 3f800000 bb2e8ae3 3f800000", + "bf000000 bdf0281c 3f3f3285 3f3f3285 3f90e5f2 3e0d2564 3e0d2564 -> bd995b1c 3f32dead 3f32dead", + "3e800000 3ea65668 3f98b016 3dc807f6 3f97d642 3f177915 3f49a1ed -> 3eec763a 3f800000 3df91368", + "3f400000 3f1ec577 bc8610c7 bc8610c7 3eb37243 3e544990 3eb37243 -> 3f576379 bc9ebf94 bcb5df6d", + "40000000 3f31de7f 3f8bd4bc 3f448152 be4df3c9 be290a54 bd071c67 -> 3efdb0e1 3f523f53 3f3857f8", + "00000000 3f5e260a 3eb311de 3f9bee09 3ec9650d 3e192e76 3e192e76 -> 3f5e260a 3eb311de 3f800000", + "3f000000 3ef79c02 3f33aafa 3f98c121 3ef15e07 3ef15e07 3efdedb0 -> 3f21fc92 3f6b1407 3f800000", + "3f800000 3efaebbd 3efaebbd 3ed5e225 3eaf8291 3ccc512c 3ccc512c -> 3f3ee63f 3f00ab69 3edb5ab3", + "3fc00000 3f8f0185 bddbb4e7 3c8fc62e 3e8bad76 3f53a477 3f53a477 -> 3f800000 3f800000 3f800000", + "bf000000 3f42048b 3eed5c4b 3f42048b 3f41e397 3f41e397 3f6d8617 -> 3f0cb9e9 3eac29f3 3f04889a", + "3e800000 bdc7431f be46eeeb 3f841551 3f9d5bb0 3f4dfd16 3f9d5bb0 -> be0fd6a2 be790726 3f800000", + "3f400000 bd96daa9 bc88e43e 3f2c5b75 3f07bc0c 3f8fe76a 3f07bc0c -> bdfa725f bdda3d93 3f800000", + "40000000 3ec85a94 3ec85a94 3f4f15db 3f12f34a 3d8ad824 3f12f34a -> 3f800000 3ee7c7f3 3f800000", + "00000000 3e88d5fc 3f43d329 bd66afe8 3f463a49 3f463a49 3ed768aa -> 3e88d5fc 3f43d329 bd66afe8", + "3f000000 3d8b8811 3f7821cd 3f8a038d 3e800000 3f800000 3f000000 -> 3d9f76ef 3f800000 3f800000", + "3f800000 3ee78a43 3dcbcd7c 3e9c7681 3f72a6cd 3e721098 3e721098 -> 3f800000 3e057274 3ecce63c", + "3fc00000 3f90da5c 3d8e38ff 3d8e38ff 3f800000 3f800000 3f800000 -> 3f800000 3f800000 3f800000", + "bf000000 3dc23f5d 3f0f5ca9 3f0f5ca9 3eedf0b4 3e3af13a 3f7c80e1 -> 3d9d9f37 3f035ed3 3ec00606", + "3e800000 3f980d48 3e8f0557 3e8f0557 3eeaf35e 3f1f97c2 3f3842f4 -> 3f800000 3ea96d25 3eae674e", + "3f400000 3d68f1cf 3e459784 3d68f1cf 3f15e83b 3f15e83b 3dbe5080 -> 3dcfaeb9 3eb029e8 3d7a655e", + "40000000 3f45a411 3ea488ef bddb3d5f 3f6e6a25 3f68e57e bd66c0f5 -> 3f800000 3f800000 bdc509f1", + "00000000 3e0c77a5 3f94451b 3e0c77a5 bde40d16 3ed45812 3f626f68 -> 3e0c77a5 3f800000 3e0c77a5", + "3f000000 3f5de501 3ebf7d02 bdbdc7bf bd6312b8 3f87b383 3f0baadb -> 3f57e8e6 3f4bbf35 be027c1d", + "3f800000 3e292a56 be518805 be518805 3f7da72b be5e95c5 3f86e7c7 -> 3f800000 be2c1e47 3f800000", + "3fc00000 3f4c59e9 3f1953f0 3f35ee83 3f76b9b0 3f76b9b0 3f5d8316 -> 3f800000 3f800000 3f800000", + "bf000000 be1701cd 3f81435d 3f81435d 3a1ce569 3f283aa6 3a1ce569 -> be16f63d 3f4296ea 3f800000", + "3e800000 3d423fdd 3f68fd91 3f38ba97 bda562dd bd934365 3f168cfd -> 3d3e67ca 3f64e048 3f5891c2", + "3f400000 be0885d1 be0885d1 3d048e63 3f3900a5 3ec2dd71 3ec2dd71 -> be950ac9 be3f0f6d 3d39825b", + "40000000 3f048074 3f96f014 be29e789 3f94015a 3e552dac 3e552dac -> 3f800000 3f800000 be918e8f", + "00000000 3cf07e19 3f56b304 3f2ba211 be6ab005 3f188abe bd0aaf5b -> 3cf07e19 3f56b304 3f2ba211", + "3f000000 3f510b40 3f101ffd 3f510b40 3e4200e2 bdaf959a 3e4200e2 -> 3f66eb1f 3f0a335f 3f66eb1f", + "3f800000 bd9ec452 3e2ebffa bdefd1ce 3d96a8ae bdffb839 3f293eed -> bdab5fb2 3e1b5a27 beb0eb39", + "3fc00000 3f10f4a1 3f6a579f 3f10f4a1 3f8f6448 3f8ce785 3f8ce785 -> 3f800000 3f800000 3f800000", + "bf000000 3e033aed be66d50b be1b07d0 3f4db2f0 3efbb22b 3f949d79 -> 3dbb3ca3 be3949ef bdc42cf6", + "3e800000 bc5d3480 bd75d9e5 bd75d9e5 3f3c3a30 3e6e389a 3ecb716e -> bc878300 bd82842f bd887bc7", + "3f400000 3f911a80 3f9584cc 3f911a80 3f20ed2c bdb4d74d 3f20ed2c -> 3f800000 3f800000 3f800000", + "40000000 3f7e60e2 3f9378e5 3e1a5663 3f5f67e5 3d02b16f 3eb8077d -> 3f800000 3f800000 3f093e9e", + "00000000 3e06c62f 3df88c14 3df88c14 3f989785 be408912 3dc891e9 -> 3e06c62f 3df88c14 3df88c14", + "3f000000 3f260d92 3f0cada4 3f305388 be436d97 3ca2b823 3f681b58 -> 3f179681 3f0e16e7 3f800000", + "3f800000 3e2dda08 3e836986 3f952043 3f57b379 3f57b379 3f0528b4 -> 3f800000 3f800000 3f800000", + "3fc00000 3f895c26 bdf59ce6 bdb98343 3f389ff9 3dc2b357 3f3b268a -> 3f800000 be0f3b51 3f800000", + "bf000000 3f8d9051 3f8d9051 3e401bb4 3f8b1cd0 3f3c04ac bd8e2a87 -> 3f377169 3f4f1506 3e470408", + "3e800000 3f33b4b9 bda75306 3f1a2df1 3e86ea45 bdfe0f65 3f764beb -> 3f406115 bda24a88 3f4b01f7", + "3f400000 3eb872ec bdc02cbe 3d8a22ea bd6f72ad bd6f72ad bdcf6b20 -> 3eb0b39a bdb81a59 3d80626a", + "40000000 3f16cd14 3dc234f7 3dc234f7 3e800000 3f800000 3f800000 -> 3f800000 3f800000 3f800000", + "00000000 be7bf2e4 3f929f03 3f027e3b 3f19fe0e 3ea8643c bd9c7e7e -> be7bf2e4 3f800000 3f027e3b", + "3f000000 be5afb1b 3ea4a668 3edb51d3 3f7d4fb7 3f83ee21 3f64ece6 -> bed8b479 3f29dd9e 3f4657c5", + "3f800000 3ef27715 3d9f292e 3ef27715 3f43805d 3f3121cb 3f928d35 -> 3f800000 3e812800 3f800000", + "3fc00000 be1b33ec 3d1a714f 3e572142 3ebc049b be50b973 3f475ace -> beacc48b 3cec8ed5 3f800000", + "bf000000 3f6006ac 3f98548c 3d297f6f 3f000000 3e800000 3f000000 -> 3f33388a 3f800000 3d079926", + "3e800000 bde47ae1 3f5cd024 bde47ae1 3f7620ae 3f8bd7a1 bda47a32 -> be166308 3f800000 bddffba0", + "3f400000 3ee355d1 3f3c303f 3f3c303f 3f400000 3f400000 3f400000 -> 3f800000 3f800000 3f800000", + "40000000 3f44feea bb8086ee bb8086ee 3eb0e4e3 bd57590d be461b13 -> 3f800000 bb6898b6 bb39574c", + "00000000 3f571cd2 3f0fca1f 3eb5aff8 3f7be7df 3ed80084 3f739137 -> 3f571cd2 3f0fca1f 3eb5aff8", + "3f000000 bd986ad3 bd986ad3 3f0e5c8d 3f7da19e 3f6a3e0c 3f7da19e -> be17051b be0c7a5b 3f800000", + "3f800000 3d7507cc bbcdb56f 3f021467 3ee0590d 3eef6137 3f4d3085 -> 3dda1177 bc412af1 3f800000", + "3fc00000 be0c8e93 3e8aeb8d 3e8aeb8d 3f87b410 3f87b410 3f93b8e3 -> 3f800000 3f800000 3f800000", + "bf000000 3f0c747a 3f0c747a 3f8c5dc5 be5deba1 be5de835 3f6ed7d5 -> 3f1d8635 3f1d85ea 3f3f6e7c", + "3e800000 3f072865 3f1e7154 3f0f0e7a 3f84b7df 3e9295d4 3f3c699f -> 3f3673c4 3f2aa84f 3f2f504e", + "3f400000 3f308b9e 3f6e6d0f 3ec4169b 3ebc070c 3f81f999 3f81f999 -> 3f73a7db 3f800000 3f800000", + "40000000 3f2fb457 be04ec36 be04ec36 3f2d46cd 3f7ca417 3f7ca417 -> 3f800000 3f800000 3f800000", + "00000000 bd5048e4 3f3b4cb8 bd5048e4 3f46d3b1 3eed64c3 3f931311 -> bd5048e4 3f3b4cb8 bd5048e4", + "3f000000 3f1f4a10 3f20b48f bbeffea6 3f656252 3f656252 bd18a8c2 -> 3f800000 3f800000 bbeb9aad", + "3f800000 3f183277 3f1dbd9f 3f183277 3f400000 3f000000 3e800000 -> 3f800000 3f800000 3f4aedf4", + "3fc00000 3f4ddbbb 3f4ddbbb 3f9b56b4 3db6254a 3f9ec8e2 3f9ec8e2 -> 3f6d8c95 3f800000 3f800000", + "bf000000 3dd53097 3f8f7b5c 3f72ec5c 3d8c645e 3e2349d5 be73933c -> 3dce1ff2 3f800000 3f800000", + "3e800000 3f5e6e55 3f5e6e55 3f57b790 00000000 3e800000 00000000 -> 3f5e6e55 3f6d427d 3f57b790", + "3f400000 3e876215 3e876215 3e5808c7 be65ec66 bde44eaf 3d62dc65 -> 3e67bdaa 3e79dfe5 3e6165ad", + "40000000 be4e84dd 3e8e4a2f be4e84dd 3f55096e 3f55096e be3a6375 -> 3f800000 3f800000 be176707", + "00000000 3e200047 3f821c4a 3e200047 3e002ddb 3ed8ab81 bda80755 -> 3e200047 3f800000 3e200047", + "3f000000 3f0e392c 3f4afebb 3eae17ff 3f9e0f8a 3f846afc 3eecd4c8 -> 3f800000 3f800000 3ee278ed", + "3f800000 3f5fad47 3f9efbca 3e10e01a 3f4ac04b be25c657 3f4ac04b -> 3f800000 3f800000 3f2e2054", + "3fc00000 3e1b7f22 3d7a801f 3e1b7f22 3f28e39d 3dbbf443 3ea2d1d8 -> 3f800000 3d913eb1 3e94a952", + "bf000000 3ecf6cde 3f3fad73 3f89e0ca 3f49ac4f 3f78fc6c 3f778ce7 -> 3e94cf60 3f00f67b 3f39e1ee", + "3e800000 3f3430e3 3ebc6d83 3ebc6d83 3f596f78 3f78d9e7 3f596f78 -> 3f64c469 3ef8eb86 3eef397c", + "3f400000 3f95cb7b 3f35823d 3f95cb7b 3f9b7fff 3f9b7fff 3d38130c -> 3f800000 3f800000 3f800000", + "40000000 3d6ae5c8 3f816095 3ee7b075 be3b1c57 3f9d994b 3f4c8acb -> 3d2c0783 3f800000 3f800000", + "00000000 bd3e8406 3f8e8bfe 3f2606ae 00000000 3e800000 3e800000 -> bd3e8406 3f800000 3f2606ae", + "3f000000 3e854530 3e915987 3e915987 3f974552 3f389082 3f389082 -> 3f22e203 3ee3474c 3ee3474c", + "3f800000 3f885eff 3f9b04ba 3ebe163c 3e0c76e2 3f293361 3f293361 -> 3f800000 3f800000 3f800000", + "3fc00000 3f9d976a 3f55072b be49ea80 3ec93ea6 3f9d6179 3f2d1aba -> 3f800000 3f800000 3f800000", + "bf000000 3f7abfa3 be2d1d78 bdfbf801 3f16ae50 3ec67d92 3f83f384 -> 3f41bbb1 be1101d5 bda644b1", + "3e800000 3f80d6bc 3d03ada6 bd296760 3ec23474 3f8a5164 3ec23474 -> 3f800000 3d346b3b bd3b2692", + "3f400000 3f37210f 3ee4d0dd 3f37210f 3f8cfc86 3f573be6 3e12d34f -> 3f800000 3f800000 3f4d320b", + "40000000 3f9b9f6d 3f7178c0 3f5f8146 3f07346a 3f81206c 3e253d37 -> 3f800000 3f800000 3f800000", + "00000000 3f959c5d 3ef1cc37 3ef1cc37 3ded74f9 3ded74f9 3f055938 -> 3f800000 3ef1cc37 3ef1cc37", + "3f000000 3f9a7970 3eab052e 3f9a7970 3f2dc3c9 3f8fb5c8 3f49560b -> 3f800000 3f42f273 3f800000", + "3f800000 3eacdb37 3f4a38eb be6faf0b 3edb36e1 bd9ba464 3f0338d2 -> 3f17237c 3f3bf082 bef5df6d", + "3fc00000 3ef2fa60 3d997b59 3f8234c4 3e88b538 3dc717ff be6c8021 -> 3f4aa788 3db3aef1 3f416894", + "bf000000 3d979ab4 3d979ab4 3f69df45 3e76dcae 3e76dcae be3067c7 -> 3d874bc6 3d874bc6 3f7fea61", + "3e800000 3f229b43 3f229b43 3f06f8f9 3f97de71 3f03c595 3e35421c -> 3f672daa 3f3a9f20 3f0d38d3", + "3f400000 3e5b450f 3e5b450f 3f44cf9f 3ee2c301 3f284dfe be353359 -> 3ea42a7d 3ed846c9 3f2dc065", + "40000000 be4d3a5b 3f94d436 be4d3a5b 3f8c3150 3f8a2016 3f8a2016 -> 3f800000 3f800000 3f800000", + "00000000 3eaf33a0 3ecff6b7 3ecff6b7 bdde6683 3f7e8581 bdde6683 -> 3eaf33a0 3ecff6b7 3ecff6b7", + "3f000000 3f79d9d6 3ec39488 3f79d9d6 3f433b0c 3f80fda5 3f80fda5 -> 3f800000 3f451b1e 3f800000", + "3f800000 3f1bb1d8 3e9ab7bd 3f1bb1d8 3f000000 3f800000 3f800000 -> 3f800000 3f800000 3f800000", + "3fc00000 3eadb4f6 3d8e5503 3ef6e834 3ec62026 3f01fe25 3ec62026 -> 3f4f0384 3e954e30 3f800000", + "bf000000 bd414b3c 3f816f52 3f816f52 bbef6d1b 3f92bd9c bbef6d1b -> bd4200ad 3f248c96 3f800000", + "3e800000 3f5d21d5 bd9769b7 3ed921ec 3f3f599a 3f25f8bf 3e8aff33 -> 3f800000 bdb4b38a 3ee8f133", + "3f400000 3d0e6be3 3e9ba56d 3dcd6e5c 3f8c4934 3da164d0 3f8c4934 -> 3e480440 3ea56c65 3f1040f1", + "40000000 3f286771 3f8818df 3d046555 3dcccccd 3dcccccd 3dcccccd -> 3f52814d 3f800000 3d257eaa", + "00000000 3edd31dd 3edd31dd 3de5659f 3f9fd8e8 3def1756 3ee50ba9 -> 3edd31dd 3edd31dd 3de5659f", + "3f000000 3f9c74f8 3f58a3cf 3f58a3cf 3f87622e 3f87622e 3e4ffabc -> 3f800000 3f800000 3f71207e", + "3f800000 3e9d194c 3f545cb7 3f545cb7 3f90c460 3eb1693f 3f88c35a -> 3f800000 3f800000 3f800000", + "3fc00000 3f5424f4 3e81c33d 3f5424f4 bd66fe0c 3ddc9c0a 3e004351 -> 3f43992a 3e9ac534 3f800000", + "bf000000 be050824 3f7a6179 3f9abeb7 3f69e2eb 3f85bae1 3f85bae1 -> bdb6a26c 3f247764 3f4b4b0b", + "3e800000 3e86d2cd 3f872d58 3f6f5f44 3f800000 3f000000 3f400000 -> 3eb3c3bc 3f800000 3f800000", + "3f400000 3e92d369 3f978ca5 3f978ca5 3f5ccdda 3f850122 3f5ccdda -> 3f4fe6ee 3f800000 3f800000", + "40000000 3f0225e6 3ea3eea4 3ea3eea4 3f339350 bcc47378 3eaeeef6 -> 3f800000 3e9c6df8 3f800000", + "00000000 3f7c90b7 3f42b398 3f79f0a8 3f71991d 3e03e61e 3d1c284b -> 3f7c90b7 3f42b398 3f79f0a8", + "3f000000 3f32308a 3dcf9701 3dcf9701 3f2cc8b6 3f0ad54f 3f2cc8b6 -> 3f800000 3e0e692f 3e1caa0a", + "3f800000 3f410e1a 3f410e1a 3f04823d 00000000 3f000000 3f400000 -> 3f410e1a 3f800000 3f800000", + "3fc00000 3f149bfb 3f97b14a bd6490dc 3f000000 3f400000 3f000000 -> 3f800000 3f800000 be6490dc", + "bf000000 3f4583d0 3e8a1aca 3ed5a3ba 3d337cfb 3eba83c9 3f5782fc -> 3f4147b4 3e69a6ba 3e965a55", + "3e800000 3f826a67 3f3931a6 3f5b93d0 3f007632 3ee67867 3f701869 -> 3f800000 3f50ad64 3f800000", + "3f400000 3d7396af 3d7396af 3ed77c86 be17989d 3f5efddd 3f5efddd -> 3d5b3ecb 3e2fa559 3f800000", + "40000000 3f69a91d 3f69a91d 3e739fe4 3ef28c42 3f75ae16 3e998c75 -> 3f800000 3f800000 3f183066", + "00000000 3f200d3b 3f421d3b 3f200d3b bdadd6af 3f978448 3f886551 -> 3f200d3b 3f421d3b 3f200d3b", + "3f000000 3d64066f 3d64066f 3f949fcf bae0c097 3f309852 3f794632 -> 3d63d46e 3dae0aa8 3f800000", + "3f800000 3ee9fe3c 3f32a71a 3e1cc462 3e04b5c3 3f7ab931 bdd5146a -> 3f066abc 3f800000 3e0dfe62", + "3fc00000 3e686c8b 3f73a130 3e686c8b 3f899f5b 3f6d5905 3f899f5b -> 3f800000 3f800000 3f800000", + "bf000000 be494abe 3f8e08bb 3f2f47ea 3e1a97d6 3cbe217b 3f6ca8c2 -> be3b29f6 3f800000 3eefbed8", + "3e800000 3f4471a3 3f8da7a1 3f4471a3 3f51bbcd 3f51bbcd 3f1ba91a -> 3f770aec 3f800000 3f67a8ac", + "3f400000 be1ffb59 be54c620 be1ffb59 bdf52ae9 3ecde3d2 3ecde3d2 -> be12cd31 be98542d be651164", + "40000000 3f2849e9 3f5931fd 3f5931fd 3f13a8a3 be3fb361 be192f31 -> 3f800000 3f1e0702 3f272d7d", + "00000000 3f4ccb08 bcc5bc99 bcc5bc99 3f744fa2 3f8ca8ee 3f8ca8ee -> 3f4ccb08 bcc5bc99 bcc5bc99", + "3f000000 bd96e97e bd96e97e 3f93058b 3f434a11 ba79966e 3f616d8b -> bdf3f793 bd96d71c 3f800000", + "3f800000 3f740576 3deb5d61 3f740576 00000000 00000000 3f000000 -> 3f740576 3deb5d61 3f800000", + "3fc00000 3f5fe6ee 3f8a6593 3f5a3caa 3e9c8d23 3f57a10b 3e9c8d23 -> 3f800000 3f800000 3f800000", + "bf000000 3e324caa 3e324caa 3f2f9ab6 3f84451b 3f82054f 3f82054f -> 3deb1e41 3dec7cf6 3ee8e9d7", + "3e800000 3f610a53 3da165fb 3ebafaaf 3d903596 3f541006 3f3db75b -> 3f6512a7 3dcb8d74 3ee57f93", + "3f400000 3de64d6b 3f7a1ee1 3ee90cb9 3ea8f871 3e034fda 3e034fda -> 3e190729 3f800000 3f00ec9a", + "40000000 3e49955a 3f516e67 3e49955a 3f4e310a 3f4e310a 3e3381c8 -> 3f800000 3f800000 3e9b3512", + "00000000 3ee2591c 3e4b3179 3f09bb54 00000000 3f800000 3f800000 -> 3ee2591c 3e4b3179 3f09bb54", + "3f000000 bcf3f0f5 be635466 3e1c742f 3ec08056 3f4ef39a 3ec08056 -> bd16354c bebec70f 3e40acb8", + "3f800000 bdd39e65 3f9827d6 3f9827d6 3f8c6cd7 3f93c4da 3e6622e6 -> 3f800000 3f800000 3f800000", + "3fc00000 3f9bd776 3ea649b7 3f086f11 be2527e1 bcee3c05 3f87b735 -> 3f7af7a8 3e9f565b 3f800000", + "bf000000 3ec85d5d 3ec85d5d 3ece146e 3f9c3254 3f2367a5 3b2f2040 -> 3e78e0cf 3e97e3a5 3ecdce09", + "3e800000 3ebb3721 be4fec38 3f1644c2 3f400000 00000000 00000000 -> 3ee66b3c be4fec38 3f1644c2", + "3f400000 3f7800b6 3f09d57c 3f7800b6 3f3eb49d 3eb31e99 3d396be5 -> 3f800000 3f3add15 3f800000", + "40000000 3f987f04 3f987f04 3f640013 3f21d524 3f00eac2 3f9c3d2f -> 3f800000 3f800000 3f800000", + "00000000 3f242580 3f9b0ede 3f242580 3f3d5192 3f0668c8 3d5b90bf -> 3f242580 3f800000 3f242580", + "3f000000 3f79438a 3f04b4a5 3d83c2c6 bd9b7887 be6e36b9 3f9842ee -> 3f702609 3eedc1ad 3e22936d", + "3f800000 3f8b86b6 3f92e205 3f8b86b6 3f9fbe3a 3f8a3eb9 3e70fd9a -> 3f800000 3f800000 3f800000", + "3fc00000 3da5a4f0 3eb9a4a1 3f412565 3ecc4968 be0b0dcf 3eb0d36d -> 3e4e47a8 3e9a3a5f 3f800000", + "bf000000 3ef48006 3f288790 be3ef260 3ed8c119 3f38e378 3f89db23 -> 3ec9c979 3ef7a2a7 bdf8397f", + "3e800000 3f802743 be34f137 3f802743 3f87819c 3f87819c 3f01763c -> 3f800000 be7610fc 3f800000", + "3f400000 be27c061 3f466875 be27c061 3de5feb9 3f8e9cb6 3de5feb9 -> be372e1d 3f800000 be372e1d", + "40000000 be4f29a2 3f942cf4 3f0e24c4 3f007570 3f007570 3ebd80de -> 3f800000 3f800000 3f800000", + "00000000 3df842f8 be1328f6 3f610044 3dc4d3c0 3dc4d3c0 3f054741 -> 3df842f8 be1328f6 3f610044", + "3f000000 be6e4bbb be6e4bbb 3f9b901b 3f4ad683 3f876aa4 3f876aa4 -> bec551d1 befcf3ce 3f800000", + "3f800000 3f80878b 3f80878b 3ec065cd 3d5aa297 3f69abc5 3f69abc5 -> 3f800000 3f800000 3f800000", + "3fc00000 3d8b34a5 3d8b34a5 3f966ce6 3f2aaaab 3f2aaaab 3f2aaaab -> 3f800000 3f800000 3f800000", + "bf000000 3e7b9d9b 3f8bfaeb 3f84d416 3f84c713 3f84c713 3ed016d5 -> 3e25aeb0 3f3858ba 3f5cca2e", + "3e800000 3f486ab5 bc1a7f58 3f486ab5 3f854c55 3f5a7d9a 3e9764e5 -> 3f800000 bc446775 3f586a33", + "3f400000 bd374998 3db4ccdd bd28f355 bd275ac6 3f11220f 3f11220f -> bd31d680 3e1d4552 bd92f694", + "40000000 3f821bb4 3f821bb4 3f9b9ea8 bd4a37c4 bd4a37c4 3d2c5661 -> 3f6cd4f4 3f6cd4f4 3f800000", + "00000000 3eb47461 3f9312eb 3f9312eb 3efc8412 bc02b196 3dfc07d2 -> 3eb47461 3f800000 3f800000", + "3f000000 3efaba54 3f25b887 3f24b850 3f63eefe bc86d930 3eb3391f -> 3f61f491 3f245e34 3f47aa82", + "3f800000 3e791d5f 3e791d5f 3f7a443f 3f97b50f 3f97b50f bcf4daa3 -> 3f800000 3f800000 3f7300db", + "3fc00000 3f9e1f80 bdf16fba 3de6d4c0 3e800000 00000000 3f800000 -> 3f800000 bdf16fba 3f800000", + "bf000000 3f4cd207 3e9220a1 3f4cd207 3dea6059 3f32d4db 3f32d4db -> 3f41bc19 3e5899c1 3f17ccbd", + "3e800000 3f8ed88a bd6ba2e6 3f8ed88a 3e851147 3f84dca1 3f44de2b -> 3f800000 bd9f1af6 3f800000", + "3f400000 3f50bc5b 3f29b547 3f98233e 3f76f2d5 3f76f2d5 3e946fd6 -> 3f800000 3f800000 3f800000", + "40000000 3f5f73f1 3f5f73f1 3f9f4322 bde3715f be37d07e be37d07e -> 3f36d770 3f246c48 3f6a611c", + "00000000 3f47974a 3f47974a bd5e19b1 3f868c7d be2c75ff 3f868c7d -> 3f47974a 3f47974a bd5e19b1", + "3f000000 3f15aecd 3e9eb956 3e80230a 3f914750 3f89825e 3f89825e -> 3f800000 3f2b7649 3f0a6b95", + "3f800000 3ee88f48 3f4605c6 3f6f81f0 3e587548 3f31bcc0 3f18e341 -> 3f1372bb 3f800000 3f800000", + "3fc00000 3f9b4a85 be1b46bc 3f9b4a85 3c98f520 bd9814c1 3f57ba75 -> 3f800000 be0bb6c4 3f800000", + "bf000000 3f853513 3f853513 be69ecab 3f718747 3d49969d 3f68aa1b -> 3f350551 3f800000 be20d62e", + "3e800000 3eb36953 3eb36953 3ed05d22 3e304d3c 3dbd2298 be2052be -> 3ebb7b27 3eb7a6cb 3ec883ee", + "3f400000 3ea68ab5 3c62e629 3ea68ab5 3e8ec799 3f138561 3e8ec799 -> 3ed295fa 3cc7cd56 3ed295fa", + "40000000 3f97aa4f 3f24e6ee be7756c7 3f8a167e 3e50d7ad 3f8a167e -> 3f800000 3f800000 3f800000", + "00000000 be5f3694 3f8dec48 be5f3694 3f3d58b8 3f83c8b0 3de5dbc3 -> be5f3694 3f800000 be5f3694", + "3f000000 be29d4ad 3f78f11a 3f78f11a 3f5db021 3f17eda5 3f503b9c -> be95c22a 3f800000 3f800000", + "3f800000 be7acba0 bdf27cd3 3f219c07 bba0446a bba0446a 3c797c0d -> be799323 bdf14eb0 3f241bc1", + "3fc00000 be1102f6 be1102f6 3f5e842d 3f884822 3f3f5fcc 3f1cb81a -> 3f800000 3f800000 3f800000", + "bf000000 3f264f34 3f00d0a7 3f264f34 3e800000 00000000 3e800000 -> 3f13d4a0 3f00d0a7 3f13d4a0", + "3e800000 3f9632f7 3f1e3c83 3f1e3c83 3f3665ef 3ea8e9c1 3f36959f -> 3f800000 3f2c75dd 3f4092bb", + "3f400000 3e62c31e 3f205da2 3ead0f7c 3fa00000 3fa00000 3fa00000 -> 3f800000 3f800000 3f800000", + "40000000 3f9ceae6 3f9ceae6 3f007757 3ec7c0c3 3ec7c0c3 3e4654e0 -> 3f800000 3f800000 3f51b1e6", + "00000000 bb92ef56 3ec924ef 3f00e422 3f9ca075 3d7ae243 3f9ca075 -> bb92ef56 3ec924ef 3f00e422", + "3f000000 3f2407df 3f2407df 3e8441bc 3f1bec26 3f267489 3f1bec26 -> 3f6bdba7 3f730c1e 3ebe2baa", + "3f800000 3f83d66d 3f83d66d 3e517beb bd93fda7 3ecf4fe2 bd93fda7 -> 3f75e7e1 3f800000 3e435ddd", + "3fc00000 3f71f600 3ecc3a95 3ecc3a95 00000000 00000000 00000000 -> 3f71f600 3ecc3a95 3ecc3a95", + "bf000000 3e8f6cc6 3eb44a5f 3f97beb1 3f000000 3e800000 3f400000 -> 3e657ad6 3ea0421c 3f5cb847", + "3e800000 3f6b9996 3ef9b47c be2c0907 3f8102dd 3f9a141c 3f7424a5 -> 3f800000 3f329965 be61e493", + "3f400000 3ed91b97 be418e6d 3ed91b97 3e056616 3f6d4483 3eaea4e6 -> 3ef09df8 bf1eb716 3f11df29", + "40000000 3df86197 3f7d79a8 3f7d79a8 3f800000 3f800000 3f800000 -> 3f800000 3f800000 3f800000", + "00000000 3f9a395e bdc499b3 3f9a395e be6fa749 3f26c2e0 be6fa749 -> 3f800000 bdc499b3 3f800000", + "3f000000 3ed84848 3ebbf755 3ed84848 3f1f5b4d bdc95342 3edb75ab -> 3f1d0260 3eb328fe 3f09a3b9", + "3f800000 be582b0c 3f7f21d7 be582b0c 3f436ae9 3ec6f069 3f8c7084 -> bf645ce0 3f800000 3f800000", + "3fc00000 bdea43e5 be609346 3f28c832 3f911851 3f911851 bdf7aa2f -> 3f800000 3f800000 3f0edde0", + "bf000000 3f4a68c2 bd8688f6 3e7f566d 3ebca8a0 3ebca8a0 3f9bcacf -> 3f2aeb65 bd6335a8 3e1ebc86", + "3e800000 3f8424aa 3f6fa866 3ec8e84a 3f3b2722 be61636a 3f3b2722 -> 3f800000 3f63287a 3ef5d6a0", + "3f400000 3f8a10bf 3f82fd7f 3f8a10bf 3f93917b 3e9ca454 3e9ca454 -> 3f800000 3f800000 3f800000", + "40000000 3df28753 3c73ef80 3f342362 be47bc13 3f8863c8 3e403bab -> 3dae77b5 3f800000 3f800000", + "00000000 3f9bb885 3f71214a 3e9c1dfa 3f000000 3f000000 3f800000 -> 3f800000 3f71214a 3e9c1dfa", + "3f000000 3f80bc47 3de803db 3e28b181 3f661f1a 3f7729a2 3f661f1a -> 3f800000 3e6045df 3e9934c2", + "3f800000 3f3a51a1 3f645b76 3f3a51a1 3f89f97c 3f863e29 3f863e29 -> 3f800000 3f800000 3f800000", + "3fc00000 3f91ad6d 3f886500 3f886500 3d8090bb 3f5b3032 be05d28c -> 3f800000 3f800000 3f641438", + "bf000000 3f8144a7 3d7201ce 3d7201ce 3f0a10a1 3f0a10a1 3e256448 -> 3f4ba072 3d3e9ba9 3d5fec6c", + "3e800000 3e356020 3f92fbc9 3e356020 3f153d6d 3f5d3f32 3ea6f706 -> 3e5451c2 3f800000 3e45798c", + "3f400000 3e8e1662 3e550d5b 3e8e1662 3ec438a9 3f9c6cbe 3f96747f -> 3ec76703 3f800000 3f800000", + "40000000 3ec1cda1 3cdcfcff 3cdcfcff 3f51314e bd3321a2 3f59309c -> 3f800000 3ccb36c0 3f800000", + "00000000 3d2593ac 3f03f34c 3f03f34c 3eaa6770 3f549de9 be13e84f -> 3d2593ac 3f03f34c 3f03f34c", + "3f000000 3f5f1de4 3f5f1de4 3ef79912 3e1f8153 3d64bb74 3d64bb74 -> 3f71f627 3f658683 3efeb5b5", + "3f800000 3f8a34de bcd69a8a bcd69a8a bbd2bfbe 3f8a2df8 bcef6eb7 -> 3f800000 3f800000 bcd0826a", + "3fc00000 3f1b050a 3f222278 3f989f82 3e92fd01 3f212e1b 3f212e1b -> 3f800000 3f800000 3f800000", + "bf000000 3f11979b 3f1454eb 3f108024 3f8115a8 be252b23 3f15741b -> 3ec19382 3f215808 3edfb3be", + "3e800000 3f81040e 3f81040e 3c7c483a 3eac893b 3eaf602e 3eaf602e -> 3f800000 3f800000 3c89f459", + "3f400000 bd4c7de4 3f991a71 bd4c7de4 3f4707ac 3f7babfb 3f4707ac -> bdf5400c 3f800000 bdf5400c", + "40000000 3f26df3e 3f7bca4e 3f7bca4e 00000000 3f800000 3e800000 -> 3f26df3e 3f800000 3f800000", + "bd9d26c9 3f292e66 bd597555 bd597555 bd36919e 3f84b495 bb35dc28 -> 3f29c30a bd496eee bd598130", + "3dfabfed 3f1edad2 3f1edad2 3ef786bc 3efd47e1 3f8e87b9 3f8e87b9 -> 3f2918ba 3f37ee56 3f0f4cca", + "3f1e66c5 3f844a2f 3f844a2f 3f395172 3f000000 3f800000 3f000000 -> 3f800000 3f800000 3f800000", + "bd24c819 3e48d639 3f825918 3f825918 3eb9d962 3f8eced9 be7f3416 -> 3e45f23b 3f797f63 3f800000", + "3f67daff 3f7e5fd8 3f7e5fd8 3f8d78d9 bdc20bc8 3f911c2c bdc20bc8 -> 3f6a455c 3f800000 3f800000", + "befd4c98 3dc65cce 3ed5b80e 3ed5b80e 3e1867d8 3ed8c03a 3e1867d8 -> 3db8c228 3eb0b59a 3ec70fcc", + "3fae2959 3f93f8aa bc78a8e3 3d4b39e7 3f639dc7 3f639dc7 3f6c60ae -> 3f800000 3f800000 3f800000", + "3f0352fa 3d5cf572 3f185c12 3f85d585 3f3ff04b 3f3ff04b 3f233e27 -> 3db38773 3f7795a6 3f800000", + "3f58ee1e be7843b6 3f7aa3be 3cf385aa 3ef2b87c 3f3084fe 3f17cb20 -> becf7acd 3f800000 3d74b8ac", + "bee75212 3f443901 3f4c43af 3f4c43af 3f11b7da be110f60 3e1ef0fe -> 3f1c1540 3f5a3b4a 3f3ee0f6", + "3e863335 3f178592 3f0ed92c 3f0ed92c 3dc98fe3 3f068023 3e067cef -> 3f1b88b4 3f25a963 3f13f0ed", + "3ecf17c4 3f4da43c 3cd0b304 3cd0b304 be43798f 3f9dfcb3 3f9dfcb3 -> 3f3ee6d0 3d50619e 3d50619e", + "3eedf41c 3f0b4d79 3f054664 3d054c73 3f6311ea be5b460c be5b460c -> 3f6d00bb 3ef26c8a 3cf27790", + "bd811e6e 3ea2653a 3f58fe0e 3ee77dd6 3f800000 00000000 3e800000 -> 3e98c3a2 3f58fe0e 3ee3e645", + "3fab5c4f 3d0a7bec 3d0a7bec 3f816227 3f223bf4 3e520ac0 3ea76f65 -> 3e6460fa 3d3ee886 3f800000", + "3f880902 3eb2eb85 3f9a5920 3eb2eb85 3de10b66 bd0590a0 bd0590a0 -> 3eca93df 3f800000 3eaced57", + "bebccd48 3e0ead8d 3f1dec8b 3f1dec8b 3f6dd2c5 3f8695b8 3f513026 -> 3dd48b58 3ee399f9 3ef2b67e", + "bdee5f20 bd7714c1 3ef810d5 3f83bff0 3f82cb87 3ef88b2b 3ef88b2b -> bd5cd17b 3eeacca0 3f79685e", + "3de858b0 3ec33ab2 3f8d61a5 3ec33ab2 3e8e06b1 3e8e06b1 3da91bbf -> 3ec992a9 3f800000 3ec51351", + "3f800473 3cacbf58 bd10438b 3cacbf58 3f9f467e be719ae7 be719ae7 -> 3f800000 bce97102 3c8bc424", + "3fb5c610 3da3225e 3da3225e bdfa0fb0 3f132328 3f19720c 3e881249 -> 3edde85a 3f090c4d be48d31f", + "bde455b6 3f78ee46 3f1696cf 3f78ee46 3f287312 be32e2d0 3f287312 -> 3f67eab6 3f199492 3f67eab6", + "3eb12274 3eebd25a 3f925862 3eebd25a 3f059ece 3f914576 3f914576 -> 3f0fe52d 3f800000 3f4223a3", + "bea17e4b 3f91fdd8 3e8c1be0 3e8c1be0 bd86e345 bd86e345 bde1f26a -> 3f800000 3e8f14d1 3e912906", + "3f7bc030 3f6a0113 3e132567 3f9483f6 3f2153f4 3f6fcb22 3f478d3a -> 3f800000 3f800000 3f800000", + "bdd8c0f5 3f63bc90 3f6a34e5 3f86d789 be4cf257 be4cf257 3f50fd5f -> 3f68aa3e 3f6f466b 3f783c64", + "3ed9c7c2 3f3a972e 3f3a972e 3f758dcb 3f400000 3f400000 3f400000 -> 3f800000 3f800000 3f800000", + "3f504054 bd5bf9a6 be5f83b4 3f8846a6 3eb65d22 3eb65d22 3e96df10 -> bd9adb47 be9d591e 3f800000", + "3d9f103a 3ee0a8ff bdb5478c 3ee0a8ff 3e4a44fc 3c4012de 3c4012de -> 3ee42915 bdb571d7 3ee0dd69", + "3e2a087e 3f11a70e 3f015c58 3f11a70e bd83ad15 3cc99700 3ebc47e9 -> 3f101d2f 3f01e438 3f1b1ff1", + "3f5bfe8d 3e855a2a 3f022ccd 3f022ccd 3f9138f3 3ee0b6ea 3f55fbda -> 3f800000 3f51011f 3f800000", + "be30059f be421814 3f745b0e 3ee3fe24 3f29afb3 3ed85f67 be7c652a -> be2e3dba 3f63ce91 3eee1477", + "3f8a1e92 3f9af304 3f9af304 3f060ded 3e87866a 3e89ec46 3e89ec46 -> 3f800000 3f800000 3f3cfd45", + "3f74266d 3f25c951 3f25c951 3ed63731 3f92c1aa 3f92c1aa 3cf66504 -> 3f800000 3f800000 3edc8ab9", + "3f150d7e bd0d1b97 3f64a9d1 be281d85 3f5fc707 3f9bc9be 3f9bc9be -> bd8fae16 3f800000 bf103fcd", + "3e9ceaa0 3e9492cb 3f8fde90 3f6135bd 3ee2adcd 3ee2adcd 3f05067a -> 3eabe5d5 3f800000 3f800000", + "bea0661b bc99e7c5 bc99e7c5 3f0fa0b3 3f6420fe 3e786868 3e5c2336 -> bc70a1ff bc8f08fd 3f0690a6", + "be88239c 3f004d4a 3f19f700 3f004d4a 3f34cbbf 3f361f2e bdde0f31 -> 3ed80919 3f01792e 3f041c58", + "3e15aa2a 3f3146c7 3f28bfcc 3f3146c7 3f7e1859 3e2a5122 3f57d30a -> 3f4f5b94 3f2cf421 3f4a30b7", + "3f132611 3ef79123 3f08e7b7 bdc176db 3f352f6e 3f784ea6 3f352f6e -> 3f50ad42 3f800000 be2312b6", + "bdb1facd 3e9fcafe 3ef1ad72 3ef39a32 3f34bd02 3f758a19 3f47ac41 -> 3e968e3b 3edf1536 3ee42373", + "be333ce5 3f82aac2 3ecabf16 3f82aac2 3ec539d0 3f66ec87 be6da7a4 -> 3f74d397 3eaf1984 3f800000", + "3f02c5de 3f81a073 3f967461 bd122b36 3d3de76d 3f01ec29 3f9e18d9 -> 3f800000 3f800000 bdc60805", + "bd801447 3e2306b4 3ddca788 bd74d762 3f890638 3d9c9d5b 3ed71e5e -> 3e18cbf9 3ddb9aab bd6e9298", + "beb309b7 3f325842 be03fbc4 3f21e6bb 3dd47103 bd84edf8 3f4dbd8d -> 3f2c1a22 be070c74 3efcc461", + "3e47c978 3ef0e14a 3edcd328 3f4644c4 00000000 3f800000 3f400000 -> 3ef0e14a 3f092d14 3f684103", + "be857cdf 3edf9d54 be7d6e8a be7d6e8a 3f000000 00000000 3f800000 -> 3ec5d37c be7d6e8a be490591", + "3f109b4d 3ee9d1bc 3ea4e86a 3ec66493 3e94d0ec be59bacf be59bacf -> 3f0bdfeb 3e9339a6 3eb11ea3", + "bcecbb5f 3f91f0ca 3ef95289 3ef95289 3f1cfcdc 3f2d44f1 3f7ce68a -> 3f800000 3ef48a17 3ef266fb", + "3fa5d25d be7ff0a9 3f892a0d 3ed3eb5c 3ecd1bce be56ef36 3f4f49c2 -> bf05048a 3f57ae58 3f800000", + "3f274d5c 3cb60c89 3e595ae0 3e7dcdb2 3f4cb9b8 3f2f7ba9 3f2f7ba9 -> 3d3eadc0 3ec4df29 3ee5e2a7", + "3f098b31 3f9cdfb6 3e9677fa 3e9677fa be7fa4be 3f5b9880 bcef6e8e -> 3f800000 3f0b8ca3 3e942470", + "3f28971b 3f698432 3f2b6a26 3f2b6a26 3f400000 3f800000 3f000000 -> 3f800000 3f800000 3f7f913b", + "3f14134e 3f9f6cf2 3f9f6cf2 3ee1be08 3ea9a625 3eb425a6 3eb425a6 -> 3f800000 3f800000 3f0db63f", + "3f40ba28 3f98d673 3f361d3c 3f328854 00000000 3f800000 00000000 -> 3f800000 3f800000 3f328854", + "3f899e0a 3f148605 3f3cbb03 be3450ad 3f25db3a 3f213c17 3f213c17 -> 3f800000 3f800000 bf0ba025", + "3eb01e24 3f8bed86 3f9b7008 3f8bed86 3ede480a 3f1ea0cd 3f2a7a2c -> 3f800000 3f800000 3f800000", + "3e25ea31 bda1f632 bc94bfda 3e411b54 3f8ae132 3f8addd9 3f8addd9 -> bdc481de bcb47928 3e6a4a6c", + "3f3f9b1f 3f99e0ea 3f18792b 3f12d393 3f690398 3d2a2b78 3eb5fe06 -> 3f800000 3f1d5ddc 3f480c3c", + "beadf2cf 3f926ac4 3f62a986 3f926ac4 3f6358cc 3f6358cc 3eb97506 -> 3f60f5bc 3f2e2025 3f800000", + "3f9edb83 3eb9e838 be19edb6 be19edb6 3f3a7a75 3f9c9244 3ec6469f -> 3f800000 3f800000 be942efe", + "be70184c 3ea6e627 3e250230 3ea6e627 3f283bfa 3f2660f7 3f2660f7 -> 3e909db4 3e0f3055 3e90d44c", + "3f4f10f5 3e94b0f2 3f846a95 3e92924b 3f9c9ec0 3d84d726 3f7263d9 -> 3f800000 3f800000 3f800000", + "3f1692e0 3ebb9a8f 3f94a4a2 3d5e05b6 3ec08340 3f16c019 3ec08340 -> 3ef0dfe6 3f800000 3d8e8882", + "3fb59b95 bd3797ad 3f9dad82 3f7b1612 3f800000 3f400000 3e800000 -> 3f800000 3f800000 3f800000", + "3f29b815 3f9f5aaa 3efdfde5 3f9f5aaa be34baff 3e62d5b4 3e62d5b4 -> 3f800000 3f14db5a 3f800000", + "3f2b9b69 be22521d 3f974cfd 3f974cfd 3f851e60 bd2203d6 bd2203d6 -> bf05fe2d 3f800000 3f800000", + "be34aa9c 3f7581df 3f8d4060 3f8d4060 3e800000 00000000 00000000 -> 3f6b22cc 3f800000 3f800000", + "3f204349 3f9d0151 3f595c59 3f9d0151 3f3b6849 3f3b6849 3ea69ece -> 3f800000 3f800000 3f800000", + "3f27a77f 3f3620a1 3f856e80 3f3620a1 3f141e80 3f316245 3f141e80 -> 3f800000 3f800000 3f800000", + "3e5ad460 3f77e714 3f16ea8b bde3d14f 3f07959e bd9f508e be080546 -> 3f800000 3f1472ca bddd8778", + "beac3c85 3e2ec661 3e2ec661 3ea17e2c 3f8ed611 3eeab1ae 3f98e28f -> 3dfe2558 3e176cce 3e666869", + "3f67cfa4 3ef54c61 be2960e6 be2960e6 3f97fc0d 3f97fc0d 3f817d68 -> 3f800000 3f800000 bffc3503", + "3f15ed5e bded4604 3f1cf6f7 be60edc7 be0efb2f 3e4dd2a6 3e84c0e6 -> bddb5655 3f31e83b be84998a", + "3fb9c8f0 be40427a 3f4e41c2 be40427a 3f4a926a 3f4a926a 3f875bbd -> 3f800000 3f800000 3f800000", + "bce4522e 3f6a7060 3f42f7a0 be113c34 3f8154a7 bdcbdbee 3f1422a0 -> 3f64048d 3f43827b be0eee16", + "3fa9f9d0 3f2ab4d7 3ed7e71a 3f0ca0b9 be4c9fb0 3e8a1a44 be4c9fb0 -> 3f06e853 3f283287 3ede4601", + "3f8c9d93 be0c3d82 3dc015e6 bd0b0e2c 3f095c1c be65a28f 3da60d47 -> beaacb18 3d9a1e2a bd18a6fb", + "bed8acf8 bad88b34 3f153484 3eb768ef 3f85ed08 3f263602 3f263602 -> ba96164f 3eea1731 3e8fe0a5", + "3f7de871 3f5f2aad 3f710dbb 3f9d8e57 3f997bf9 3f3609c4 bd927dde -> 3f800000 3f800000 3f800000", + "3fb3ef01 3f8a2a05 3f8a2a05 3e4ac80f 3e84c9fd 3f503eed 3e05827d -> 3f800000 3f800000 3e7849a4", + "3f74f4c0 3e35bf73 3f19438d 3f19438d 3ef03924 3f5b1b26 3ecc098e -> 3ea4e8b5 3f800000 3f77ba02", + "3e3e5ae4 3e82057a be357053 be357053 3f3396fb bcfc52ec 3e0291e7 -> 3e958524 be3467e3 be39d807", + "bcff6403 3f0471cd 3f0471cd 3f1f9fc3 3f91fe53 3f91fe53 3f8eaa8a -> 3effcb25 3effcb25 3f1a4385", + "3deac212 bd09b22f 3c458ef6 bd09b22f 3f16157e 3f7ce143 3f7ce143 -> bd139dbf 3c5ec8d8 bd1b4741", + "3e38cedd bddbb235 3f72a73d bddbb235 3f847a87 3f8e5984 3e8cf245 -> be07146e 3f800000 bde72e8e", + "bedf033e 3e84d4d4 3eba0774 3eba0774 3e037b22 3e037b22 3f9fbb8e -> 3e7b9787 3eb02d14 3e710a34", + "3e50c5d3 3f8b7c3f 3d131528 3d131528 3cf8663f 3cf8663f 3f404647 -> 3f800000 3d13ff61 3d2dad78", + "be73d2ed bdc8d238 3e3030cd 3d78dda6 3e96e83a 3e96e83a 3f40c7d9 -> bdbba6d5 3e24a2ea 3d5306e8", + "3d2aac25 3f78f957 be2b5fa2 be2b5fa2 3f5fc9a7 3e6a1e52 3f5fc9a7 -> 3f800000 be2d059a be31da11", + "3f9825b8 3f9dbe85 3d6d0833 3d6d0833 be4e9c91 bd9a137d bd9a137d -> 3f7e75dd 3d599348 3d599348", + "be6d57c1 3e5b42be 3e5b42be bbd5769f 3ee7d231 3b242ba3 3f66d546 -> 3e466f9c 3e5b222b bbb09012", + "3f9ae577 3df1f5ef 3d9b8794 3f8f315f 3f8f6dfa 3e915677 3e915677 -> 3f800000 3dece934 3f800000", + "3f12f6e5 3f99f352 3ed70c61 3f99f352 3f645871 3f57622c 3d84c3a1 -> 3f800000 3f4ff9de 3f800000", + "3f63fe4f 3f04b4b4 3f9ff61a 3ef37a2e be76da73 be027cec be76da73 -> 3eda8033 3f800000 3ec87174", + "3e92caa9 3ea7a627 3e560734 3edc4aa9 3f81eea8 3f81eea8 3ec087fe -> 3eec77f5 3e96f16f 3ef6e94f", + "3f7f91b4 3f03968e 3f03968e 3eb4ee0f bd6909bc be503d5c 3f8163a6 -> 3ef90819 3edac378 3f800000", + "3fbea50e 3ed465c6 3ed465c6 3f5d1d5d 3f02f451 3f6cebb4 3f02f451 -> 3f800000 3f800000 3f800000", + "3cb40116 3f16ad97 3f16ad97 3f94911d 3b168b2d 3b168b2d 3ef96c74 -> 3f16af8a 3f16af8a 3f800000", + "3e86c41b be61c3dd 3ec932d0 3ec932d0 3d08b7b4 3f87b737 3f9bb265 -> be63c424 3f0b8b09 3f13fa1e", + "3d12a60b be6e75e7 3f110d37 3f8940ca 3e0c76de be3ff7d9 3dd75287 -> be6fa331 3f1015a4 3f800000", + "bdae5541 3f85c281 3f85c281 3f8a5bb2 be449da2 3f43977f 3f958141 -> 3f800000 3f7b2ef0 3f7bb123", + "3f46f60e 3f857ee4 3f9fee20 3f857ee4 3f86b4ed 3f3eb73f 3f986011 -> 3f800000 3f800000 3f800000", + "3ebf3bd3 bc6f5af9 3d9cd6d6 be6d9cec 3ef85e9b 3f55e55c 3e0d1637 -> bc9228df 3de3fd04 be7a8116", + "3f54e744 3f5663e8 3f9958d0 3f1bdfa9 3ee61984 3effa6c1 3effa6c1 -> 3f800000 3f800000 3f800000", + "3fa2810d 3f9c3889 3ea60fdf 3ea60fdf 3f824fbf 3f6649cd 3f0f745e -> 3f800000 3f800000 3f800000", + "3e155c6b 3f4a78e3 3f4a78e3 3f461801 bb0aad65 3f855e58 3ed9348e -> 3f4a68e5 3f6ec21a 3f5328f3", + "3f459683 3f23ff76 3f23ff76 3f993762 3eefbef9 3f87425c 3eefbef9 -> 3f800000 3f800000 3f800000", + "3ea5e759 3cca274f 3f8d4163 3f8d4163 be2014ff be2014ff 3ed9e9c7 -> 3cc06833 3f800000 3f800000", + "beca4d69 3cae8072 be12df8b be12df8b 3f8fac22 b998d72a 3f8fac22 -> 3c71c698 be12e3e0 bdcb7ef1", + "3fb264a3 3f8b41f6 be22e9bf bdbd07ad 3f415dfd bd5626ab 3e82baed -> 3f800000 be17d931 be12bac4", + "3f475851 3f8dcbc7 bd3f985f 3f8dcbc7 3f400000 3f400000 3f800000 -> 3f800000 bde64aff 3f800000", + "3fb18f48 3f2b2cec 3da4eaf3 3da4eaf3 3f2fd654 3f2fd654 3f26529b -> 3f800000 3f800000 3f50c26c", + "3fbad47b 3eb7d21d be50c187 3cf974a1 3f63f900 3f27c94c 3f66e365 -> 3f800000 c0967d07 3f800000", + "bdb8bc26 3e916cb3 be34c228 bdd1d909 3f2eed35 3f44bc4e 3f44bc4e -> 3e88fb4a be290a5b bdc43e7a", + "3f972b71 3f805a3b 3f0dddeb be575b49 3f000000 3f400000 3f400000 -> 3f800000 3f800000 bfeba3f2", + "3edf95f1 be08ef56 3ecf342a 3ecf342a bd8b89d7 3f80c5c8 bd8b89d7 -> be04fa75 3f38c7fb 3ec93785", + "be6a2c02 3f6b4761 3f6b4761 bdb6f295 3e800000 3f800000 3f400000 -> 3f5e8e1e 3f3f7d12 bd9c29df", + "3fa8baa8 3eb91102 bd8c3eff bd8c3eff 3e800000 3f400000 3f400000 -> 3f0a0432 c0c105d7 c0c105d7", + "3f32b392 be546b73 bd8e8c00 3de48db4 00000000 3f800000 3f000000 -> be546b73 be6c0bba 3e2f8c24", + "bd9df098 3e95c1f5 be1ccf83 3f914718 3f1a683f be28a6c4 be28a6c4 -> 3e8f19f1 be1ed3f3 3f800000", + "3e38b880 3f620f91 3f2129dc 3f2129dc 3e9eb046 3ee54961 3ee54961 -> 3f6f72cc 3f2f53be 3f2f53be", + "3e58eebc 3f3dcd30 3f038796 3f038796 3f2825b2 3f96f567 3f97b429 -> 3f5c7b16 3f2f563e 3f2fa028", + "3f9633f6 3e075f56 be537efd 3f82e9a3 be1823f5 3f00aa64 3ef3bcac -> 3de68ca1 bf00e46a 3f800000", + "3fa07ea9 3e50dbbf 3d9b94ad 3f2b8476 3e2f5500 3f4c86d2 3e57e329 -> 3e84fa74 3f800000 3f69268f", + "3fb95ba3 3f543361 3e1e0543 3e1e0543 3f1ea0a7 3f1ea0a7 3f0c4e3c -> 3f800000 3f800000 3f3f75a9", + "3ea81da5 3f3f7949 3ea3ba76 3ea3ba76 3f824677 3f8ef5ff 3f824677 -> 3f800000 3f0145a7 3ef5e85f", + "3f628017 3e0b7656 3e7d9dc7 3e7d9dc7 3cbdbc6d 3cbdbc6d 3f681971 -> 3e0e6143 3e81760b 3f800000", + "3fbcc9e3 3f183dc7 be12f075 3e29f74d 3e6efc07 3f9c7904 3e6efc07 -> 3f682723 3f800000 3e819734", + "3f715ee4 bdf7d30a bd46bc77 bd46bc77 3eea85aa 3eea85aa 3f4443ec -> be5a1b7e bdaee7cb be334485", + "bedbf1ab 3e87126f bd812e17 3f6f4657 3f8c0c1b 3f6a8763 3f8c0c1b -> 3e37c52d bd3965b1 3f22c557", + "3f91d517 3f68c441 3f661fe4 bda9f05e b99df572 be75f290 be75f290 -> 3f68afcf 3f34ae96 bd856d64", + "bec8be50 3f86d22f bcdc1359 3d8cdcba 3f666666 3f666666 3f666666 -> 3f474fae bca2ac57 3d503dff", + "bea952ab 3f300360 bd2a5751 3f0cca9b 3ea1f09c bd89ec14 3e9fd373 -> 3f1f5880 bd2e38a4 3eff3be8", + "3f950f24 3f3488da 3f2fb142 3f2fb142 3f4f769a 3f721726 3f4f769a -> 3f800000 3f800000 3f800000", + "3f9673a6 3dee9395 3f89adaf 3dee9395 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3e44223b 3f800000 3e44223b", + "bdfd8c3c bcd1f1ed bcd1f1ed 3f5697a8 3e9b5c18 3ee91ce2 3e9b5c18 -> bcca57fe bcc6be13 3f4ed2a5", + "be632275 3ec28681 3f7b88c8 bdf957f3 3e0b5591 bd740bac 3e0b5591 -> 3ebcd38b 3f7ee72f bdf209d9", + "3f498169 3f2c6439 3f2c6439 3d5d01b9 3f24dc88 3f6882d7 3f7838f0 -> 3f800000 3f800000 3e6957d1", + "3edbc127 3f7d6c81 3da41f08 3da41f08 be535f6e 3f9c7f7f bd269b02 -> 3f68cc76 3e2cacb1 3da14e1d", + "3f88a3e2 3dbbb06f 3dbbb06f 3ed0306a 3f3c41b7 3f66a120 3f3c41b7 -> 3eda429e 3f800000 3f800000", + "3f15f6f6 3f21c4df 3e17b8c2 bdf1665f 3f0452df 3f1c69b9 3f343c57 -> 3f68064c 3e6c4bc4 be4d6c11", + "3fba29e7 bba31ac6 bba31ac6 3f30b378 3ee09dd2 bdbe3b5b bdbe3b5b -> bc6150c4 bb8fb147 3f1babb7", + "3f8ba5d5 3ef26fcd 3ef26fcd 3f8bbaff bd962057 3e127222 bdd41e97 -> 3ee07bd8 3f0fa0da 3f7b1694", + "3f7f5708 3e709935 3dd22894 3e709935 3e708784 3c973f90 3e708784 -> 3e9d1b7a 3dd619ec 3e9d1b7a", + "3fb225d1 3e0de17a 3f76ab7b bdab29c3 3f9d7e4f 3f9d7e4f 3f6a2b5a -> 3f800000 3f800000 3f800000", + "3eed1049 3f3f03d3 3f9fa4db 3e27ceeb 00000000 3f400000 3f800000 -> 3f3f03d3 3f800000 3e9c4019", + "3ea77b0e 3f8c592c 3f8c592c 3e1c5e17 3f000000 3f800000 3f400000 -> 3f800000 3f800000 3e4f3362", + "3e73f6cf 3f3c36b6 be1e3b3c 3dc7cb8c 3f1e2ac8 3f88345a 3f8d4b2c -> 3f5cb34d be53f820 3e078b57", + "3fb8a1ea 3f4b7153 3d0af684 3f09a510 3ef37e0c 3f677511 3f6cd2b6 -> 3f800000 3f800000 3f800000", + "3e8eb192 3f9f04c2 3f4f40f8 3f9f04c2 3efb9b68 3dea9033 3efb9b68 -> 3f800000 3f561665 3f800000", + "3ed9ce8f 3f4e5ac2 3f9881a8 3ee1b34d 3f6cb515 3f0971c4 3f6cb515 -> 3f800000 3f800000 3f3a0533", + "3e912449 3e06cd40 3f9e9120 3e06cd40 3ec09023 3ec09023 3f3a40cd -> 3e16e399 3f800000 3e29d403", + "3f62f68f 3f887d65 3f887d65 3eead517 3f36b7fb 3f36b7fb 3f8526a3 -> 3f800000 3f800000 3f800000", + "bef51f5c 3e4587db 3e4587db 3e6b4c56 be2dfcdc 3e9921c8 3f4819d9 -> 3e57058c 3e2cca09 3e2b393c", + "3fab3069 3f3e5449 3d18f7b9 3f3e5449 3f23aa19 3f8017fd 3f80d25c -> 3f800000 3f800000 3f800000", + "3eeea32b 3cfe3342 3ecedbfb 3eaf644d 3f34f818 3e1aa6f2 3f34f818 -> 3d3d8e2f 3ede85f0 3f02c9da", + "bd88b0df 3f09f9c9 3f38f663 3f38f663 3f61af69 3f292271 3f292271 -> 3f024ef2 3f312699 3f312699", + "3f98465b 3e75bcec bdf83fc9 bd8f82a9 3ee5f757 be5a0460 3ee5f757 -> 3f03ed91 bdc6142f be1a175e", + "bd8b31bb 3e0a99a5 3df9c5b4 3f3c4a6d 3f4f9dea 3e4cf605 3f4f9dea -> 3e035c0c 3df66b85 3f327448", + "3fb11566 bc239172 bde9445f bc239172 3f943c3e 3f943c3e 3dbab765 -> 3f800000 3f800000 bc3b2d49", + "3f8694d8 3f94e844 3f73ada3 3e88dc20 3f939277 3f939277 3f7eaf5f -> 3f800000 3f800000 3f800000", + "be7ad9a1 bd18a2a7 bd18a2a7 3e206aef 3ce05dcf 3e965376 3ce05dcf -> bd179e3c bd0e64cb 3e1f593d", + "3f2e2459 3ec0c449 3f0e2eb8 3f89d1e1 3f19cde4 3f5f1f78 3f813024 -> 3f22ffcb 3f800000 3f800000", + "3e670f7e 3f2f0944 3f2f0944 3ec2e638 3f400000 3e800000 3f000000 -> 3f52b147 3f398022 3edbaf47", + "3f094bf7 3f8f6154 3e84ee1a 3f8f6154 3f5c0593 3dd49ed9 3f8f5244 -> 3f800000 3e8cc49a 3f800000", + "3df362d3 3f83219f 3f83219f 3f9f5a95 3e554ca6 3f9e39fe 3f5b984c -> 3f800000 3f800000 3f800000", + "bea39a24 3f9a01d3 3f9a01d3 3ec0107d 3f9e0cdf 3f9c5f40 be123695 -> 3f5cdea3 3f5d8904 3ec93f0f", + "3f5bbf7f 3f984e4a 3f8e3422 3f8e3422 3f72c158 3d48cea5 3d7c2cfc -> 3f800000 3f800000 3f800000", + "3efb6a20 3eab61b0 3e92fe07 3f34353f 3cee0923 3f49b450 3f6c1e77 -> 3eaddcc1 3eefc063 3f800000", + "bede26e7 3f06870a 3f685220 be2c343a 3f734c01 3f937c1d 3f0a3713 -> 3ebe8011 3f1ae304 be0b852b", + "3fb11af3 3e836f99 bdb1d6af bdb1d6af 3f087da2 bd1805aa bd1805aa -> 3f7a8d9c bda926ef bda926ef", + "bd90e842 3d893518 bde843e9 bde843e9 3f02af44 bda7ed79 3ee9447f -> 3d846c9d bde99ee4 bde10302", + "3e9444d5 3e3c425e 3e3c425e 3f44f393 3e8cfc77 3e8cfc77 3f5e286e -> 3e4c927d 3e4c927d 3f800000", + "3ebff39f 3f903c9c 3d91600b 3f9ec3db 3efbd713 bd4cf49d bd01ebff -> 3f800000 3d8eb2bf 3f800000", + "3efe1731 3e8983ba 3d54d9f3 3f84113c be211b55 be25e18b be25e18b -> 3e7f1c46 3d450354 3f747af3", + "3e6debdd 3e2c6d02 be69c346 bd4d174e 3ef34665 3f70aec7 3f85c8d5 -> 3e41d2d3 be958ca9 bd876f71", + "3f913be4 3e8b50e9 bdc6a768 3f4f64af 3f80188f be5439a4 be5439a4 -> 3f800000 bda0d549 3f27e89e", + "3eaf70b5 3ed0853a 3f5c6953 3f2881cb 3f800000 3f000000 00000000 -> 3f1e9bc4 3f800000 3f2881cb", + "3f58eca7 3ea4de32 3f08424e 3f9e1a64 3f208472 3f208472 3f3719e5 -> 3f2fe201 3f800000 3f800000", + "3f24ed20 3f9b4e10 3f54bdc7 3f54bdc7 3efcd53f 3e9a71db 3f4b1af5 -> 3f800000 3f800000 3f800000", + "3e71e9f7 bdfea746 3f5c143a 3f5c143a 3f8d3326 3f317965 3f986bba -> be2c3449 3f800000 3f800000", + "3f137830 3da8f470 3f825049 3f825049 be41b01c 3f872af6 be41b01c -> 3d985ab9 3f800000 3f6b0506", + "3f264e61 3f3afabc 3f8dce81 3f85246c 3f1e5937 3eee0578 bdf54847 -> 3f800000 3f800000 3f770fe1", + "3e92469d 3f996c49 3f01dfef 3f01dfef 3ec0ebe4 3ec0ebe4 3f1d9b8b -> 3f800000 3f118ad7 3f1d9805", + "bd978ea7 3f9cc91f 3f10f5ee 3ee6b804 3f7e21e6 3f9410a4 3f0d78e0 -> 3f800000 3f0587b4 3edda774", + "3ef3e045 3f51d4c3 bdce5761 3f4fc5d4 3f800000 00000000 3f400000 -> 3f800000 bdce5761 3f800000", + "be6b1914 3f1ce84d 3f323cf6 3ee19a16 3f8d3ed9 3f8051d4 3f8d3ed9 -> 3efa61b8 3f10e3db 3eb3ffef", + "3f973f17 bdcd1511 3ccab5bd 3efee995 3f800000 3f400000 00000000 -> 3f800000 3e5eadd8 3efee995", + "3d6f617c 3f87010f be58ee0d 3e721825 be800000 be800000 be800000 -> 3f800000 be55ce59 3e6e9bac", + "3f1d69b4 be0f4438 3f800169 3f545822 3f3a0914 3f8c1331 3f3a0914 -> be817fcd 3f800000 3f800000", + "3f7c2d1c 3ebb0f53 3eac170c 3f597138 3f8fc65c 3f28ae29 3f8fc65c -> 3f800000 3f753033 3f800000", + "be87cde8 3f7862ac 3f7862ac 3e1d8dc8 3f0f1269 3d1c3a2a 3edc3c9b -> 3f5851a2 3f75e5d4 3e0d6b35", + "3ecc2d3b 3bfa18bc 3efcf513 3f91fb2a 3f22df9e 3ddd31db 3f181a2c -> 3c278fa6 3f042bde 3f800000", + "bdf662be 3f63287a 3f63287a 3d887121 3f9a16e3 3f288ac7 3f26dbb6 -> 3f466be1 3f527c89 3d7d0ab4", + "3e7463ce be12e00a 3f3864f2 3e56eb7c bc9550d4 bc9550d4 be2fb718 -> be123d2f 3f37987d 3e4e76e2", + "bd06d9b6 3f413448 3f413448 bda039f0 3f0e5692 3f37b802 3f8ba3bd -> 3f3dbb2d 3f3cbeaa bd9aabce", + "3f32a4da 3eca2295 bd8c35f8 bd8c35f8 be336bd2 be35b17c 3f4e0f53 -> 3eb41cd4 bd79868f be1ff27c", + "3f35df42 3ed70b8b be181278 3f3cf9cd 3f8645f3 3c1db7a9 3f8645f3 -> 3f800000 be191e8b 3f800000", + "3fa02129 3f8d9df2 3f8d9df2 bd4d087e 3f294822 3f72444d 3f294822 -> 3f800000 3f800000 be9459f6", + "bdfd11c7 3f8632c0 3f8632c0 bc93dada 3e0fd096 bd98d9be bd98d9be -> 3f800000 3f800000 bc953b2e", + "3ed197d1 3f809079 3f37f2d3 3f37f2d3 3f000000 3e800000 00000000 -> 3f800000 3f4ceb8d 3f37f2d3", + "3f6c1e83 3f65b7cc bd333505 be415c0f 3ece550e be4731ec 3ece550e -> 3f800000 bd17f1f7 be99dfd6", + "bc8de206 3f83f6b0 3e01f1a6 3e01f1a6 3f9be00d be04339e be04339e -> 3f800000 3e023c33 3e023c33", + "bdd826a7 3f4cab85 3f0137bf bd36b6ba 3f959c34 3f947041 3f947041 -> 3f3631be 3ee640ed bd22ca08", + "3fbb46a0 3f80977e be2db504 3f88d215 3e83ed6a be5b3800 3e83ed6a -> 3f800000 be044694 3f800000", + "3f762fbf 3d3bcda6 3efca193 3e9837ff 3f67cd5e bd447524 3f67cd5e -> 3eb5a6d5 3ef17e0d 3f800000", + "3f6331d7 3e84ec47 bd739847 3eb36cd7 3e512dea 3f9e6125 3f9e6125 -> 3ea25b5a 3f800000 3f800000", + "3e784376 bd943560 3f37a354 bd943560 bcd57a70 bcd57a70 3f1b2625 -> bd93472b 3f367c2d bdadbc7a", + "3f707b9e 3f5715c5 3e9590ab 3eb6d880 3e55c61d 3f866c17 3e55c61d -> 3f800000 3f800000 3ee37377", + "be31c5c5 3f8bc636 3f282cf1 be638c5b 3f1839cc 3e813bcf 3d85064a -> 3f7d63fe 3f211d92 be6102d0", + "3e9ae029 3e84393d be35eeb0 3e84393d 3e5df924 3f5ff030 be4df40c -> 3e8d8087 be776510 3e7947fb", + "3f703145 3f4cb581 3f57826d 3f3ad155 3f034bf5 3f32bd17 3f61dc78 -> 3f800000 3f800000 3f800000", + "3e2f5df7 3f79c25e 3e6dd584 3f79c25e 3f876178 3f417f22 3f417f22 -> 3f800000 3e889953 3f800000", + "3f81fa05 3f69974a be33c7de 3f69974a 3f55aeab 3de4030c 3f8d6721 -> 3f800000 be4ab239 3f800000", + "beae056d 3ec1dfbd 3e5558b2 3e9376cc 3ed7fd54 3ed7fd54 3ef1a640 -> 3ea98fd5 3e3a97ab 3e7e283e", + "3f919651 3f0f662a 3ee92e7f 3ecca91d 3f9b1cad 3f7806aa 3f9b1cad -> 3f800000 3f800000 3f800000", + "3fb8fe4a 3f614833 3f1815b0 be417c33 3f400000 3f400000 3e800000 -> 3f800000 3f800000 be9778b6", + "3f9569c0 3d90ddad 3f3f7a66 3d90ddad 3ea44068 3f8c5407 3f56e275 -> 3de796e8 3f800000 3f800000", + "3e3cdcce be3b7afc 3e6215e1 be3b7afc 3e800000 3e800000 3e800000 -> be448af5 3e6d0392 be448af5", + "3f9ee720 bd2db152 3eaa69d0 3eaa69d0 3f30133e 3f5cf090 3f903435 -> be948da3 3f800000 3f800000", + "3f8a3f83 3d88531b 3c8fd0fb 3f5768d8 3f952464 3f17727f 3f17727f -> 3f800000 3d472ac2 3f800000", + "3e5cde6c 3f123f65 3e44dcbf 3f123f65 3f966f94 3f9b5d06 bc3db289 -> 3f43e929 3e8556fb 3f11e221", + "3fb4bb87 3dda62ba be6f6ca7 be6f6ca7 3f3e71e5 3f270bb1 3e1261b5 -> 3f800000 c03e3ed4 be95fc5a", + "3e9f5dab 3f9aba1f 3f844972 3f9aba1f 3d87637b 3f3291ae 3f6944c3 -> 3f800000 3f800000 3f800000", + "bd20805d 3e528815 3f44d265 3e57a23f 3c96053b 3df76a54 3f794143 -> 3e52616f 3f43e4fe 3e4fb58b", + "3f02dd33 3ee7e3a3 3f95fa97 3f95fa97 00000000 3e800000 3f800000 -> 3ee7e3a3 3f800000 3f800000", + "3e853e30 3eb13c3e be15f08d 3eb13c3e ba797315 3f594960 3f0f839b -> 3eb13103 be4072e5 3ecf8250", + "3f999129 3d77bd1c 3f8644fe 3f6f8292 3e6fb946 3f21067c 3f9ac8a4 -> 3dac3f78 3f800000 3f800000", + "3f930b25 3c02dac7 3f726cd9 3f633cc6 3f400000 3f800000 3f400000 -> 3d6c5778 3f800000 3f800000", + "3f58ef75 be1dda5e 3ee68d8f be1dda5e be6122bf 3f7c51fb 3f7c51fb -> be050fef 3f800000 bf6f7ec4", + "3f914b1b be0b58df be035676 be035676 3f54bd61 3f54bd61 3f84a0cc -> c0199205 c010be53 3f800000", + "bd92e010 be1e9477 be1e9477 3f9a975f 3f3f543c 3f65dbef 3f3f543c -> be168337 be14fc79 3f800000", + "3f42eb63 3d8474c7 3dd85433 3dd85433 3f8dfb0c 3ea798a3 bd90a0d8 -> 3ed50b78 3e101287 3dcd4a5c", + "bd0117fe 3f48b42d 3f7ca88e bde04d29 3f4be17d 3f4be17d 3e2a1089 -> 3f43ca16 3f7678cc bddf222a", + "bd4c3400 3f3c1507 3eff6fce 3f3c1507 3f4acaf7 3f434cde 3f2ca8c4 -> 3f34efbf 3ef613dc 3f35f6b9", + "3f56bd77 bdb06f81 3e301b7c 3f574d06 3f69d586 3f69d586 3f9fb14e -> bebca8be 3f3c4ee7 3f800000", + "3f1aa534 3f848c65 3f7d8a02 3f848c65 3ef665f8 3f75af09 3f29a5dc -> 3f800000 3f800000 3f800000", + "3f0602fc 3e1c88f7 3f64ab11 3f64ab11 3ee5d24a 3ee33e3a 3ee33e3a -> 3e4c9d4e 3f800000 3f800000", + "3f5fcfa1 3f5333ae 3e872d5d 3ef72908 3e800000 00000000 3f000000 -> 3f800000 3e872d5d 3f5b8dd1", + "3f1b7aa4 3f9b22d8 3e8a25d2 3e8a25d2 3f9da47e be5fde62 3f42d1e8 -> 3f800000 3e73e8e1 3f006fca", + "3fb4ec63 3f4e4141 3f994fa8 3f994fa8 3f08918c 3f76cdcf 3f76cdcf -> 3f800000 3f800000 3f800000", + "be76daf4 bdb0889e 3e004ba1 3f906d16 3e3b5797 bcbfc8a5 bcbfc8a5 -> bda913a3 3e01060b 3f800000", + "3f5cafc1 be146515 be146515 3f3cbf87 3f96f59d 3f9ee8d3 3d5a93d5 -> 3f800000 3f800000 3f45d988", + "3e459cc6 3f7f1391 3f9513d5 3f9513d5 3d7ff7a2 3d7ff7a2 3e95893b -> 3f800000 3f800000 3f800000", + "3ec784f9 3f74e620 3f96a8f2 3f892da4 bd564d13 3f08da78 3f121001 -> 3f700171 3f800000 3f800000", + "3f94d8d2 3f820b38 3eea4678 3f820b38 3eaa8a84 3f87d7a6 bdacfff0 -> 3f800000 3f800000 3f6cd306", + "3f988ddf 3d7db67a 3e8d2a80 bd99a40f 3f2aee64 3f2aee64 3f566459 -> 3e9b4c1e 3f800000 c21f9cd9", + "3f4c4233 3ee043c6 3de66ba5 3ee043c6 3e180fba 3f78c7f1 3ee0fcd6 -> 3efe6873 3f003b26 3f2caca6", + "3f7a1a6b bdd389a4 3edd89e9 3edd89e9 00000000 3f400000 3e800000 -> bdd389a4 3f800000 3f12912e", + "bdb2f0e1 3f93d916 3ec260fe bd6efdac 3f31abec be6f4159 3f5b562d -> 3f800000 3ec66e03 bd5e5896", + "3fbf78be 3f1bbdac 3f0513ec bda3b2ec 3f80bbd6 be4f39c1 3f96a446 -> 3f800000 3ecc4ed8 3f800000", + "3ec9fb5e 3f538f46 3f538f46 3f91cbc0 3e1154c1 3f5b1f9e 3f072230 -> 3f601b6e 3f800000 3f800000", + "bec69f20 3e23492e 3e23492e 3d0d42a5 3f5c6d4a 3f329e43 3f5c6d4a -> 3df4cd2e 3e0080ed 3cd3c7c6", + "3f8670be 3f3d94c2 3f99014c 3f7f5ed9 bd5dea37 3ed58c1e 3f29d063 -> 3f335fb9 3f800000 3f800000", + "3e3f0af2 3f8e0316 3f8e0316 3f811560 3f356c69 bdc96a1e be279727 -> 3f800000 3f800000 3f7a848a", + "3e1a2a85 3ee23da8 3ea59d6f 3f9410b6 3f9f95e8 be0390cb 3f686b20 -> 3f0b4292 3ea278e3 3f800000", + "3f2abc4e be1cfa48 3f7636e6 be1cfa48 3f913cb0 3f913cb0 3f97f685 -> bf215525 3f800000 bf3c7cdd", + "3f5826f9 3ee60a95 3ee60a95 3f6c3769 3f874890 3d3385e9 3eae618b -> 3f800000 3eeee1ad 3f800000", + "3f9d41e6 3da57194 bc8bd61b bc8bd61b 3f4d1e1b 3f83e8c3 3f83e8c3 -> 3f800000 3f800000 3f800000", + "be98bf27 3f1d32f3 3e4d24d7 3f871084 3f402055 3f402055 3f9ff8a3 -> 3f0070fd 3e279d85 3f44c3e3", + "bdbd510b 3f9224e1 3f73e906 3f8d2d6b 3f45a0bf be242fd1 3ec5f7c3 -> 3f800000 3f77946d 3f800000", + "be009307 3e478562 3f15188f 3f15188f 3ed0e0a7 3f8105bd 3ed0e0a7 -> 3e3dcc78 3f045883 3f0dd4ac", + "3fb0d514 3f7745e2 3f7745e2 3e63bd01 3cc47b7d be02b26b 3cc47b7d -> 3f7fbf44 3f523534 3e6b8b01", + "3ee2a84f 3e4052f9 3d52ea66 3f056388 3f55174e 3f78f0f8 3f55174e -> 3e9845eb 3db92bc2 3f5338cc", + "3f438978 3f3d4b05 3f19bf30 3f93bc96 3f7e6507 3eb196c4 3f7e6507 -> 3f800000 3f5128fb 3f800000", + "3d196cb4 3f395130 3ea8385a 3f395130 3ee13362 3f21abe2 3f21abe2 -> 3f3c6be4 3eac4bbc 3f3dce9d", + "3ed2cbd6 3e9651ee 3f89b02d 3f0d6888 3e800000 3e800000 3e800000 -> 3ea79141 3f800000 3f1da217", + "3e0b3b64 3eef04fd 3f894eaf bd2f57d1 3f681c45 bceeb3a2 3ea03d93 -> 3f08508e 3f800000 bd3722e0", + "3f8d1620 bcbbe73d bcbbe73d 3e52861e 3f38edc7 3e4714d4 3f138d45 -> bde6894c bcef26cb 3f10504d", + "3f935230 3dcbdabd 3f9c8738 3f800dd1 3ec0fe83 3ec9fd12 bd87a6d0 -> 3e34084a 3f800000 3f6df77c", + "bedb8729 3f60e5d8 3f00b41e 3f44d598 bd61ec8c 3ecad5e0 3ecad5e0 -> 3f66586b 3edc0842 3f284125", + "3fa80ba4 3f9f46ad 3f132b74 bdb4463d 3f937088 be2eb6a5 be2eb6a5 -> 3f800000 3ef07952 bd934884", + "3f3f0a8d 3f94c442 3d838201 3f0f6197 3f400000 3f800000 3e800000 -> 3f800000 3e819119 3f30441c", + "3e72dba2 3efe7eac 3f99017d 3f99017d 3f2bf5fd 3f2324da 3f7c5b81 -> 3f175c51 3f800000 3f800000", + "3f5b422f 3f0ade91 3f403f17 3f2d5311 be28c7bf 3ed0ff2c 3ef7bde0 -> 3ef3618c 3f800000 3f800000", + "3fa78a2c 3f5e225c 3ed13581 3f6ddebd 3f8136fe be1f6208 be67c3c5 -> 3f800000 3eadcd0c 3f3781b2", + "3c89438f 3e430698 bb6365b8 3f4ee79b 3c4d156b bd6b9e4f 3c4d156b -> 3e431111 bb632daa 3f4ef2b8", + "bebffce6 3f839db3 3f93c6c2 3f4b8c22 3f998758 3f593df1 3d346ca0 -> 3f3591ad 3f60355c 3f483d6f", + "bee32ec0 3d2fb5da 3f1fdf22 3f7dcd1d be1f0fe9 3c35a0ce 3e582851 -> 3d3cb7b3 3f1f16cd 3f6810a0", + "3fb2032d 3ea1ba77 bc361215 3f89976d 3f5aa8d1 3f5aa8d1 be0b66c9 -> 3f800000 3f800000 3f6760a2", + "3ca10901 3e628acc 3edba5df 3edba5df 3f4d5fe7 3f4d5fe7 3df4e726 -> 3e662c0a 3edf2ad6 3edc2a5d", + "3f35b7e2 3eeb0f61 3eeb0f61 be73c214 3f9477ce 3f96388e 3f9477ce -> 3f800000 3f800000 bfac7b2f", + "3f76ed51 3f1d2316 3f8cd7fc 3f8cd7fc 3f548144 3f2b0ef8 3f8e81bc -> 3f800000 3f800000 3f800000", + "3d9ad563 3f75fede 3f75fede 3e157c82 3f1df81e be4622f3 3e6d435a -> 3f800000 3f7272eb 3e1826d1", + "3f66640b 3f5bcefd 3ef15397 3ef15397 3f3b4d0f 3f1df35b 3e07f494 -> 3f800000 3f800000 3f09099a", + "be4b9f6f 3f305401 3f8360ee 3f1f5bb3 3f981a3c 3f981a3c 3f95898f -> 3f0ea05a 3f548946 3f015117", + "bedafa66 3f7aa236 3f3dc33b 3f8ba791 be41dff0 3f0229b5 3f1b4913 -> 3f800000 3f1bde23 3f5dc62b", + "bec9ac6c bd900456 3ecca439 3e81f867 3f387937 bde44fb0 3f66d68f -> bd605a7d 3ed60a50 3e3fd018", + "be87a32a 3f541f5d 3ec991d5 3ec991d5 3f88cca0 3f0e2f34 3f70bc01 -> 3f255112 3eafb728 3ea15e91", + "3f64bc95 3f1abac6 3f42b043 3e20d96d 3da56427 3f888803 3da56427 -> 3f26c33e 3f800000 3e2d5bbc", + "3faeb20f 3f4dd21a bddc337b bddc337b 3f000000 3e800000 3f800000 -> 3f800000 be271f9a 3f800000", + "3f8d58f9 3de553dc 3f06b93c 3f0ae24f 3ec9d17a 3d58ea91 3f56055e -> 3e4b0ba0 3f0f1775 3f800000", + "bc5c1bf0 3f1ff6af 3f1b804c 3f1b804c 3f6c7bc6 3f56388e 3f059b77 -> 3f1e00b5 3f19c5c0 3f1a6b21", + "3fb1fcc4 3edceedf 3b67df83 3f6db1e0 3f0e1213 3f0e1213 3f3055bf -> 3f800000 3c7de71a 3f800000", + "3f6915ce bcd6b6a2 bcd6b6a2 3f9482ca 3f8f3a2f 3f73a010 3f73a010 -> 3f800000 be490200 3f800000", + "3f7fde93 3e2ce31c 3f2a81c2 3eb7fce6 3ec6149e 3edaba38 3e127ad6 -> 3e8cf181 3f800000 3ed6ae87", + "3fa33219 3ea5937a 3f97c83c 3f9e5c4c 3eb1a8de 3eb1a8de 3f4a0792 -> 3f147907 3f800000 3f800000", + "3f7850e2 3d16d5b1 bdeb1f1f bdeb1f1f 3f400000 3f000000 3f400000 -> 3e0a5fde be644515 bed7b2d0", + "3d8621c7 be169955 3f7f8233 be37b272 3f13584c be4f48ed 3f844f13 -> be1c7f93 3f7c2a5b be450943", + "be5b2cba bd806ad6 3b9cd0d7 bd806ad6 3ec1be68 3f84667b 3ec1be68 -> bd6d9764 3b806400 bd6d9764", + "3f3f78f3 3f1817d6 3f0f1ef6 3f08e3f0 3f12b5fc 3d9ea910 3f8e6786 -> 3f800000 3f17ec88 3f800000", + "3f842674 3e745fa1 3f9c86ca 3f94fd66 bdbf4b94 3f0b1e87 bdbf4b94 -> 3e5ee157 3f800000 3f800000", + "3f80b18d 3f8a5a9c 3f81eeb6 3f8a5a9c be530c5d 3e9c89f3 3e9c89f3 -> 3f653609 3f800000 3f800000", + "bd7c4562 3eea8710 3f3cef98 3f738e05 3eff3da1 baa5f987 3f93d1e5 -> 3ee38a92 3f3cf35d 3f6361c5", + "3ea3f8e9 3f227348 3f88ea97 3f227348 3f1f9dc2 3f9b5fb9 3f1f9dc2 -> 3f4afb68 3f800000 3f4afb68", + "bc890dc6 3e7236ea 3f998688 3f998688 be399865 3da7eae2 3f0098be -> 3e72f382 3f800000 3f800000", + "3f9169eb 3f7a1ae6 3f7a1ae6 3e678669 3f2ad0e3 3ea1623e 3f2ad0e3 -> 3f800000 3f800000 3f6f3448", + "3ee1664d 3f747437 3ebb4ac8 3f82ea96 3ebe484f 3ebe484f 3f897915 -> 3f800000 3edfedec 3f800000", + "3ebbb9cf 3f471c16 3f8fe03a 3f2045b7 3f800000 3e800000 3f000000 -> 3f800000 3f800000 3f444004", + "3dc438f1 3ec919db 3f5e6825 3ec919db 3f896f13 3e840d1b 3f896f13 -> 3ee02944 3f640abe 3ee02944", + "3f6c9334 3f68eff3 3f68eff3 3f18ccc6 3f400000 3f800000 3f800000 -> 3f800000 3f800000 3f800000", + "3fa2a51f 3f48ddba 3e379e30 3ec470e3 bd8f38ed be0ecc86 3f90525d -> 3f38793d 3e1bfa9d 3f800000", + "3ed876d0 3ea20d35 3ea20d35 3f30e3a5 be53c5d5 be2a475f 3f37db71 -> 3e950598 3e97683b 3f7e04eb", + "3dc883ee 3e1f0c74 3ea5b2de 3f6c8d32 3dae22c9 3f7f8537 3da5284e -> 3e206242 3eb7a535 3f6e6f23", + "3f0cf9c6 3f66c03d be22ae0c be22ae0c 3e977d51 3f16b530 3e977d51 -> 3f800000 be70b7eb be425885", + "3f47624b 3f0bd824 3f8c2143 3f0bd824 bc792eba bc792eba be60b9c3 -> 3f0a350a 3f800000 3eeedc88", + "be5352d3 3f27476d 3f7a1d17 3f768f30 3f086d70 3e954b5e 3ec3ec6e -> 3f16b464 3f6beac9 3f648376", + "beece2ef be3da74b be3da74b 3f134107 00000000 3f000000 3f800000 -> be3da74b be1a05d1 3ec9598a", + "3d17c0f8 3f7619f2 3f6bef36 3c994cd4 3e837716 3f469291 3e837716 -> 3f78770b 3f72ea55 3c9ac5c1", + "be9bdf77 3dc4c962 3f753221 3f753221 3e03db15 3f243f9b bdd84078 -> 3dbd5d06 3f4d20f0 3f7d56fa", + "3fb58a73 3db33087 3eacedf2 3f03a0d9 3f400000 00000000 3f400000 -> 3f800000 3eacedf2 3f800000", + "3f4dea20 3f9378ad 3ea9c778 3ea9c778 3d96bb87 3f86e8a4 3f0e1755 -> 3f800000 3f800000 3f195af0", + "3f5a4213 3ec65414 3ec65414 3f9fcec4 3e0444c0 bccb896b 3e0444c0 -> 3ededf50 3ec236e5 3f800000", + "3fba749e 3f3f3f91 be78c063 3f45eebd 3f7f0853 3f86fe92 3ef9dea8 -> 3f800000 3f800000 3f800000", + "3e886249 be041090 be5d001b be5d001b 3f8cf98d 3e867a2d 3f8cf98d -> be3ae533 be6da024 be9c60af", + "3f0b3ec1 3f6373bb 3f87e5b6 3f877d36 bc137248 3f78e146 3dba3c47 -> 3f625819 3f800000 3f800000", + "3eb5d1d1 3f97dd63 3f97dd63 3f95b12b 00000000 3f400000 3f000000 -> 3f800000 3f800000 3f800000", + "3ebb3b12 3f38dfb6 3f46418c 3f46418c 3f800000 3e800000 00000000 -> 3f800000 3f5a345f 3f46418c", + "3ebd7092 3f36e2c3 3f5f08bb 3f36e2c3 be325e30 3f8a944a be325e30 -> 3f2bd006 3f800000 3f2bd006", + "3f0c97da bd6470ec 3f3003f8 be7a3f5a 3ecc4b68 be101ef4 3f8b5379 -> bd92463b 3f2362f5 bf1b8b52", + "3ea44981 3f61f79e 3f45fc59 3f45fc59 3f4b02c7 3e3be4e8 3f8a241f -> 3f800000 3f525f30 3f800000", + "bedff2d0 3ed3bd30 3f57b33f 3ef4101e 3e8cfd96 3f21b91a 3ef5fde0 -> 3ebcfa27 3f290078 3ec9ae13", + "3f1db103 3c2bc381 3f0f2a74 3f271a79 3f98dd30 3f98dd30 3e67990c -> 3d226e7b 3f800000 3f4226e9", + "3f900079 be3a20c2 3ea083b3 be11c324 3f74e629 3f77150d 3f476fc1 -> 3f800000 3f800000 bf937670", + "3f0d1ca5 3ddbaf2b 3d33860e 3d33860e 3f66400f 3f6b9263 3f6b9263 -> 3e59d7d2 3db62897 3db62897", + "3fb15f6a 3e27aa28 3f1bb107 3f228cf7 3dbba366 3d274c6c bde27d3c -> 3e400c0b 3f25083c 3f0cf348", + "be851161 3de9ff68 bdf4abd0 bdf4abd0 3f489a03 3f489a03 3f5ea86f -> 3dc267df bdcb45f6 bdc78f8d", + "3fb5feb0 3ebefa6c bdaa187e bd91a52a be12c9f4 3f5503c5 3f5503c5 -> 3e9ea4ce 3f800000 3f800000", + "3f0f9d3c 3d769622 3f979884 3e81227f 3f3ad0df 3f69ba2b 3f6c0abf -> 3dd0c0f6 3f800000 3f05c04b", + "3f82aab7 3f092eed 3eedb06c 3eedb06c 3f3012dc 3f8a4b96 3f5a353f -> 3f800000 3f800000 3f800000", + "3f303200 3f0c9005 3f0c9005 3e424286 3f2be461 3eae6b40 3f2be461 -> 3f800000 3f379d10 3eb495b3", + "3fb96928 3c1c37d8 3edb4ac9 3f9370a6 3d251453 3f033ffb 3f033ffb -> 3c25e748 3f800000 3f800000", + "beb2898c 3e94546b 3e94546b bdf36cd7 3de5b5a4 3de5b5a4 3f381e32 -> 3e8ebf26 3e8ebf26 bdc29ddf", + "3f5b7e79 3f7ed77e 3da6898b be556da9 3f80e59d 3f80e59d 3f001ccf -> 3f800000 3f1866fe bebaea38", + "3f90d7b2 3f6dd946 be05e404 3f6360b8 3f43e0f3 3f751fbd 3f43e0f3 -> 3f800000 3f800000 3f800000", + "3f064631 3ef8d9da 3f2cc6d9 bda8cf48 3f1578e0 3f1578e0 3f4e5ae2 -> 3f3359fb 3f790bf9 be123acf", + "bda5a6f8 3b19a8de 3f44da48 3d6863a8 3f400000 3f000000 3f000000 -> 3b10df08 3f3d336f 3d5f5b30", + "3fa4b39d 3f35d394 3f33d3ef 3f33d3ef 3e70e7c8 3f98fda9 3f8be3c9 -> 3f800000 3f800000 3f800000", + "3fae82b1 3f10d6ff 3e470db2 3e470db2 3e800000 3f000000 3f800000 -> 3f5bbbf6 3f1c5506 3f800000", + "3d8722d4 3dee836b 3f6c0094 3f6c0094 be39c943 3d3fc1fc 3ed5cd91 -> 3debb114 3f6cbbcb 3f72b078", + "3f84bfb6 3ef98650 3ef98650 3eabcca7 3f851948 3eedb960 bdb68828 -> 3f800000 3f70a2d1 3e9d4357", + "bd70f2d7 3f158832 3ebd0c81 3ebd0c81 3f1f9922 3f1f9922 3f095099 -> 3f103dfd 3eb65c6c 3eb74427", + "3ea230d7 3f13e8dc 3f8e2f08 bd12e1aa 3f8fe352 3f82ed80 3f8fe352 -> 3f65b568 3f800000 bd641ca8", + "3f56dc86 3f9fc84c be71b333 3f0e90d5 3f4dc1f5 3e3956a9 3f4dc1f5 -> 3f800000 be8e7f1d 3f800000", + "3ef0aab3 3ea84e9b 3ea84e9b 3daedb32 bcb34767 bb5b4a04 3ec37b56 -> 3ea697e4 3ea80af1 3dd519bf", + "3f360a15 3f09de35 3f4673f7 3f0b7588 3f8eb676 3f8caf02 be335a72 -> 3f800000 3f800000 3ef806ee", + "bed4a195 be268a1b 3f5424bb 3e0434e5 3ef303b1 3eb5e36d 3ef303b1 -> be0b1e0d 3f38de79 3ddce01d", + "3e670ef7 3efd051f 3f64d12e 3e5380a9 3f1c6c3f 3f2f412b 3f2f412b -> 3f12bdec 3f800000 3e7a248c", + "3f9589ae be271dfe 3f2c4d89 3f82172a 3f20a1d8 3f20a1d8 3ea8bf98 -> bf1c8193 3f800000 3f800000", + "becdf625 3f26e897 3ebeddb5 3ebeddb5 3e386f19 3f8f131a 3f2c4e26 -> 3f1ba1eb 3e83aa02 3e9632f6", + "3e9451f8 3dbcf510 3b9379c1 3b9379c1 3f735291 3f735291 3e2de082 -> 3e02607b 3bcb82ba 3b9b1aeb", + "bec52aec be7f4920 3f283961 3f283961 3f000000 00000000 3e800000 -> be561151 3f283961 3f19736f", + "3f5de09b bd1f9d01 3e8ccc03 3f43e47b 3e9f8c28 3e9f8c28 3d35c5c4 -> bd5aac24 3ec0e4cc 3f4bba7d", + "bd4040f0 bdee6c01 3eaba056 3eb7f328 bde12036 3f8f2066 3e018105 -> bdefa88e 3ea31161 3eb6dd45", + "3f3efbfe 3f372195 3f976237 3f976237 be049961 3f93ee7d be4b9810 -> 3f26ff93 3f800000 3f800000", + "bedf7116 3e588552 3ef309ef 3e588552 3e67f3d4 3e67f3d4 3f908b86 -> 3e450ada 3edd2cc1 3e110aa3", + "3fb03bf1 3e9da2fb 3e4d56ad 3eacb5e0 3f0fb56d 3f6d31a3 be002656 -> 3f800000 3f800000 3e935356", + "3f12dbb0 3f946c01 3f40b08a 3f15c2f1 3f7db359 3f192183 3f7e587e -> 3f800000 3f800000 3f800000", + "bba51601 3f5169f3 3ecda5ef 3ecda5ef 3e9e59f2 bdb6f7f6 3e1ef300 -> 3f51168c 3ecdbda4 3ecd7ccc", + "beb770a4 be1d90f1 bcccf4a4 3f650507 3f5524e0 3f3212e4 be4d2363 -> bdf2b9f5 bca41119 3f76ba7d", + "3f80aad8 3ea23895 3eb4ea7d 3f14baf4 3f1d2781 3e7b966e 3f8b8c17 -> 3f53d2d9 3ef04056 3f800000", + "be411b49 3f7dedd7 3f1f568f 3e97a9a0 3e47f0f2 3f107c94 3f107c94 -> 3f74e93e 3f1002a7 3e8912bd", + "bef4327d 3ecf6414 3ecf6414 be59804b 3f95110d bd9cab81 3ebdb94a -> 3e85550b 3ed73e8d be38d59d", + "3f7e9ede 3f2758a1 3eb136e5 3f2758a1 3f1ecd63 3f90b252 3e5e9960 -> 3f800000 3f800000 3f558258", + "3fba157a 3eefdd3c 3f51fa5b 3eefdd3c bd01f1af bdf01a77 3e214fb7 -> 3ee54a0b 3f3366b0 3f1b8e96", + "3f960a0f be37b6a6 be4e1565 3f07003d 3f986511 3f759161 3ee18b49 -> 3f800000 3f800000 3f800000", + "bedd22ad 3f3e8d25 3f8e8965 3f3e8d25 bc3b0aa2 3f75e78e bc3b0aa2 -> 3f3f7edc 3f497bc1 3f3f7edc", + "3eab3266 3e370119 bd179f05 bcd3e84f be0f7b56 be0f7b56 bc8bbfe8 -> 3e2ed063 bd10d5df bcd2b4a1", + "be74b220 3f973d8c 3f973d8c 3f615805 3e0d3a2f bc225437 3e0d3a2f -> 3f800000 3f800000 3f5a2777", + "bd9bb9cf 3f114d73 3e916437 3e60cde0 3f6bc374 3c8404ed 3f2167f7 -> 3f07cb16 3e9136aa 3e568512", + "3f8d11be 3f467b33 3f7a24b6 3f7a24b6 bd5e7dd6 bd5e7dd6 3f6f5d03 -> 3f3b452e 3f6c03a9 3f800000", + "3fb33bdd 3edb5d72 bd84d976 bd84d976 3f537b1c 3f537b1c 3f0291c4 -> 3f800000 3f800000 be6867d8", + "3e24d223 3ee2c2eb 3f567875 3ebf45b0 3e3dd77d 3f4682a5 3ee38eca -> 3ee9bc75 3f750e73 3ece0277", + "3fa54e8e 3f9a019c 3f803269 3f9a019c 3f2e5034 bd834352 3f5493ba -> 3f800000 3f6ccb25 3f800000", + "3f9bc572 3f54dae5 bde7def7 3f280385 3f000000 3f400000 00000000 -> 3f800000 bfa60b40 3f280385", + "3e9c5da3 3e205a08 be2dd63c 3e205a08 3e115368 bd984c6d 3f98b45d -> 3e279dda be29f9fd 3e7c4330", + "3f608e46 3e4abf68 3e4abf68 3e978780 3f7f4333 bde07aa0 3f95d4ae -> 3f800000 3e38f6d3 3f800000", + "be378a9d be0b5a21 3f7af7b8 3f1bb948 3efa42ba 3efa42ba 3f7281ad -> be002076 3f66c05b 3f051ef1", + "3e384bc6 3d81a564 3f865f48 3db8ae69 3f74f6ca be0aa5e9 be0aa5e9 -> 3d9c9e5b 3f800000 3db449b6", + "be67c333 3d9e246e 3e1c5592 3f3058c8 be2a364b 3f1c0fee 3e8f6bd4 -> 3da4530b 3e09611b 3f25d543", + "bd48885d 3ed8eecd 3e013d12 3f6c9c47 be5cde9a be5cde9a 3ddac13e -> 3edb3f81 3e029e2d 3f6b612c", + "be62fbc7 3f084828 3d45a6ba 3d45a6ba 3e6f9edc 3f6c32b5 3e6f9edc -> 3f018fbd 3d241776 3d3be795", + "befeaf13 3f64afd1 3f01f29c 3f01f29c be05e291 bd3e4071 3f131636 -> 3f749838 3f050567 3eca2089", + "3f9824f0 3eeeafd9 3f9fae88 3eedf86a be7e1dc8 bdae1e5c 3ea3afd2 -> 3eb85185 3f800000 3f3fe9c4", + "bea99f0d 3e42974d 3e0e7a60 bdafb561 3f00ed73 3f802c4b 3f3e295a -> 3e26c443 3dd5f90b bd8d0209", + "3fba28e0 3cc21d03 bca2ad5b 3d1494c1 3e8343c2 3f385f1a 3da0a145 -> 3d1ac32c 3f800000 3d27b646", + "3e9b45d7 3e0b0479 3e0b0479 3f0d4405 3ef3052a bdca2e39 3f577ca2 -> 3e2264ab 3e06f9f8 3f3db028", + "3faec3e4 3f4e16d6 3eef5683 bdf43496 bd993107 bc4c3cca 3f98d13f -> 3f3afdec 3eeb5524 3f800000", + "3f4bf0c8 3f9fc41f 3e79021b 3f8cc0cd 3dc07bdc 3f31326b 3dc07bdc -> 3f800000 3f0ac659 3f800000", + "3f80d6ef 3ea201cf 3f6f9f86 3f190c32 3f063f78 3f694a7b 3f92cc41 -> 3f2b8fc3 3f800000 3f800000", + "3ef8f870 3ed357be 3f2ae699 3f2ae699 3f400000 3f000000 3f800000 -> 3f265572 3f61cd0a 3f800000", + "3f324b5f 3e45c1ab be7610e8 3e45c1ab 3f3edffc 3e64ad94 3f81a755 -> 3ecdb0c3 be91b16e 3f27da24", + "3f30f5c0 3ebb4fed 3f0ad0a6 3ebb4fed 3f0e6805 3f14246d 3ece4d1e -> 3f182b35 3f675d09 3f01cff4", + "3e217c7f 3f96c897 3f2c0984 3ea32760 3f0f0d12 3f45635e 3f3d1e5d -> 3f800000 3f43da12 3eb8aaf6", + "3f9f5660 3e40e664 3e0641d4 3e0641d4 3e04db3d 3f8c0e43 3f6bfaa4 -> 3e660e31 3f800000 3f800000", + "3f9182d5 3f3db175 3e8f08d1 3e8f08d1 3f19b0ff 3f0bf9ea 3f3c7ab1 -> 3f800000 3f3cfdcc 3f800000", + "3f343b07 3f77afaa 3eb41431 3e4a7846 3ed5ea9e 3f9cea4b 3e55fef7 -> 3f800000 3f800000 3e6d65c5", + "3fbd7f55 3f80058b 3f2a2530 3f2a2530 3e38b584 3e38b584 3ed839f2 -> 3f800000 3f6822ad 3f800000", + "bea5cfe9 3df83435 3e52cfa7 3d86f85c 3ee95205 3f6cc05a 3f12b041 -> 3dd848d8 3e223982 3d63b04b", + "bc863c01 be55a7ba be1481ce 3cce4c38 3f9fcf8c 3f43c0a2 bd83178a -> be515f2d be12ab59 3cce83ab", + "3f666d5f 3f6b7ab8 be46d203 bdc3bb2c 3e6523b2 be0fd862 3f5d6179 -> 3f800000 be3080c8 bedcccaf", + "3e5b01ae be7648ee 3f96766e 3f991e0b 3d146991 be52f365 3f8097ef -> be783556 3f800000 3f800000", + "bed240e4 bc822b7c 3d9c6fe0 bc822b7c 3f89f16e 3f0e7b18 3f7d735f -> bc3478c6 3d7eab1d bc3916e3", + "3e3b044d bdc02573 bdc02573 3df15b70 3f000000 00000000 3f400000 -> bdd374ac bdc02573 3e0bd506", + "3fa920b8 bd538bca bd538bca 3f608223 3f57d3f7 bdee9897 3f91a7bb -> 3f800000 bd375364 3f800000", + "be79364d 3f294b24 3e51413e 3f6e823d 3f400000 3e800000 3f400000 -> 3f0f298e 3e4540e0 3f49b1a2", + "3f7a462f 3eba92bb 3f42a937 3f42a937 3e9e47d7 3f825ef4 3f791ff1 -> 3f05b124 3f800000 3f800000", + "3f6ba5ce 3e8e9e9e be1672a4 3e8e9e9e 3f873291 3f853fc1 3f853fc1 -> 3f800000 c0613405 3f800000", + "3f379c5f be7ee8bc bdb06324 3f51e955 bdecb1e1 3f8b559a 3f21c991 -> be6b657c bec91dee 3f800000", + "3fb58452 be34751a be34751a 3ee1de57 bdabd963 3dab2468 bb572f3e -> be214480 be4cb7a2 3ee0d259", + "be3f7ce2 3f7689ab 3f9c4ea0 3f7689ab 3f02657b 3f0d7742 3f0d7742 -> 3f6118e1 3f800000 3f5f7291", + "3f7f4541 3f857ffa 3f2c958e 3f8371a5 3e20d547 3e20d547 3ed5645a -> 3f800000 3f4ca20d 3f800000", + "3f85719b be611ea8 3f16aead 3f16aead 3f1605c2 3f1605c2 3f981404 -> bf10a8d0 3f800000 3f800000", + "3fbf042d 3f6b7853 3f33ad41 3f33ad41 3f214c71 be3edc4c 3f971d60 -> 3f800000 3f0c936a 3f800000", + "3f5f7463 3f685a39 3f62ea9d 3f266ebb 3f7c0bd4 3f9792d8 3f7c0bd4 -> 3f800000 3f800000 3f800000", + "3f4e0d52 3d20fb55 3f1fac0b 3f20ca49 3f7beaf5 3f79d028 3ecd5880 -> 3e418a2b 3f800000 3f6d7054", + "be74b33b 3f93c949 3f2783b2 3f225be2 3f8e7a92 3e8d2c53 3f88ac32 -> 3f69786e 3f1d28c7 3f015a84", + "3fbde730 3f3ba6a1 3f84ea61 3f84ea61 3eb396ee 3e230919 bd1bd106 -> 3f800000 3f800000 3f7ba126", + "3f1ce912 be1fdf73 3d6803a0 3f2fac38 3e8dfffe 3f9f87a2 be032d4f -> be409dbf 3e75afd7 3f22e229", + "3e7c98e6 3f89ec4a 3f229d56 3f9f8167 3ec76632 3f432938 be529d02 -> 3f800000 3f48470b 3f800000", + "3e2b081b 3eb61b67 3eb61b67 3f412b75 3ef6cbbd 3f60bda1 3f9a3af9 -> 3ec60d51 3ed565ab 3f71d714", + "3ee0bf0b 3f5f5ef6 3f0f6319 3df1dd2f 3f213670 3f213670 3eb343de -> 3f800000 3f462a62 3e0ee4b7", + "3f5d5d07 3f7166bc 3f796392 3f796392 be401881 3e6a28bb 3e63a011 -> 3f4fb55d 3f800000 3f800000", + "3f8a56a0 3eba6cf5 be155280 3f384091 3e800000 3e800000 3f400000 -> 3eff71de be4c9adb 3f800000", + "3ee88720 bcbf6268 3f9b6e2e bd92d4cc 3daaa437 3e019896 3dcdd063 -> bcc6e94e 3f800000 bd99da69", + "3fb9b8b2 3f8fa88e 3d097cc9 3f8fa88e 3eb05087 3eb05087 be26103c -> 3f800000 3d896486 3f689699", + "bebcd9d3 be6f1aa3 3e113fc6 3e113fc6 3f46c5c4 3f46c5c4 3f73f119 -> be39df15 3de1d2d2 3dd6f2ec", + "3f043717 3ef53e55 3f97e166 3daad385 3e8c9874 3e8c9874 3f809efb -> 3f0ee2d7 3f800000 3e319040", + "3f9c46c4 3f9cce19 3e7e92c1 3e7e92c1 3efe98f4 3f925a21 3f925a21 -> 3f800000 3f800000 3f800000", + "3f3742aa 3cac46bd 3f8d387b 3cac46bd 3f9177c8 3e3f27ea 3e3f27ea -> 3de6ffc5 3f800000 3cc6d96d", + "bef14872 3e99c788 3f12ac42 3effdc84 3dd67266 3f4bf906 3dd67266 -> 3e928c47 3ed54484 3ef3d45c", + "be80aa02 3f1a226d 3eb6288d 3f1a226d 3f000000 3f400000 3e800000 -> 3f08edf3 3e994560 3f110603", + "3e99e1c4 3d182c30 3ec2c65b 3d182c30 3f94e7c6 3e805d1a 3e2dd945 -> 3d69fb30 3ed2a5b8 3d205ad6", + "3f9e6ae4 3f4e073b 3ecb7953 3e63e7b1 3f9363a0 3f9363a0 3f8627fa -> 3f800000 3f800000 3f800000", + "3ec07c2e bd337093 bdf7985c bd337093 3e800000 3f000000 3f000000 -> bd460de3 be187484 bd5cfa4e", + "3e88b8f2 3f6e96e7 3f6e96e7 3f0807d0 3f15b841 bdec34c9 3f15b841 -> 3f800000 3f6775f6 3f2134f4", + "be17c227 3f8d66ad be25dd3c 3f7f3e1c bce6bf22 3f285733 bce6bf22 -> 3f800000 be1722a9 3f800000", + "bdbd35f6 bdfb5e88 3f3919d8 bdfb5e88 3f875f79 3e831760 3e831760 -> bde4fe89 3f34d2d8 bdf58f82", + "3f53cc23 3e044e05 3f1a40bd 3eaeb60e 3f7d261a be5afa40 3f457429 -> 3f35db44 3f031092 3f7165bd", + "3fb4e314 3f04d6d3 3e42dc7b 3f31f13a 3f59003d 3dfc3f52 3e9ee01f -> 3f800000 3e6bed15 3f800000", + "3f3133e8 3f31c635 3d18ffdf 3d18ffdf 3f0f2420 3f1ec89a 3f0f2420 -> 3f800000 3d860dbd 3d799b78", + "befa39da 3f0abf2f 3f0abf2f 3f88885e 00000000 00000000 3f400000 -> 3f0abf2f 3f0abf2f 3f47d279", + "beea2463 3f64d86c 3f146483 3f64d86c 3f872f70 3efd90dd 3f872f70 -> 3f1a5087 3ef1fb35 3f1a5087", + "3fa7e5b5 3f8cd5b2 bc8da5d6 3efbcf00 3f7c095d 3e83f8cc 3f130c88 -> 3f800000 bcd60076 3f800000", + "3f3578d0 3f7b6e89 be07c78a 3edca71b 3f86333a be2083b0 3f3b323d -> 3f800000 bdf466cc 3f650fae", + "3c8b203d 3f9157e3 3c354f85 3c354f85 3f43e3c2 3d9a6690 3d9a6690 -> 3f800000 3c358b06 3c358b06", + "bec68dc9 3eda0c82 3ec65cca 3f86e663 3f400000 3f800000 00000000 -> 3ea8eb34 3e8eeed8 3f800000", + "3f90a0bc 3f682a36 3f682a36 be0c327a 3f265039 be5972c6 3d31cc3b -> 3f800000 3f3b3d3b be136d92", + "3f10df9e 3e5b1179 3e815af3 3e815af3 be42c76d 3ce12337 3cc4b468 -> 3e45c74d 3e83661d 3e832322", + "befc87c0 3ea509fd 3df46ca8 3f8f1227 3f000000 3f000000 3f000000 -> 3e8463dd 3dc41230 3f658921", + "bea6299c be3ba50b 3f156b20 3dbd4795 3eb3ee67 3f7240c4 3eb3ee67 -> be286f3e 3ee49fd5 3da9e6ef", + "3f2cd009 be4ad28e 3e96415d 3d73354a 3e8b33fb 3ed467cc 3ec71c99 -> be786a31 3ed0b39e 3da4e430", + "becdb7e7 bdcbae98 3eaf217e 3edc6a83 3f9ffe83 bd0720d8 3f9ffe83 -> bd879645 3eb17bc2 3e92b9fd", + "beb601f9 bcef8066 3dca14aa 3e8ed1d1 3f5c4f95 3f936e52 3f5c4f95 -> bcb76561 3d8f6036 3e5ab9b8", + "3f69d24d 3f882efe 3f5dd2af 3f882efe 3f8f2bf1 3ef71b78 3f8f2bf1 -> 3f800000 3f800000 3f800000", + "3f7e0592 3d55674f 3f6bd967 3d55674f 3c853dfe 3e950fe5 3e8f3bad -> 3d58e77a 3f800000 3d93b3dd", + "3f331445 bdb8af66 3e29e055 3f582594 3dc02182 3dc02182 3f5681b6 -> bdc5a80c 3e35ceb8 3f800000", + "3f011634 3e4fb32f 3e4fb32f 3f98c6cf 3e800000 3f800000 00000000 -> 3e6da8dc 3ed17a7a 3f800000", + "3fbca88e 3f7e32fc 3e25f8c1 3f7e32fc 3f6e2d3f 3f07a230 3f6e2d3f -> 3f800000 3f3d6030 3f800000", + "3e007739 3f9d5dcd 3f9d5dcd 3f1dd19f 3e27c0c3 3e27c0c3 3eb74ad9 -> 3f800000 3f800000 3f253d76", + "3fb2ee9e 3eb1157d be0d0731 be0d0731 be7fd023 3f99d529 3f99d529 -> 3e833fbd 3f800000 3f800000", + "3f2850af be3ddf8e be3ddf8e 3f079223 3f955eb1 3f955eb1 3f57e4c9 -> bf4bf1d9 bf4bf1d9 3f800000", + "3f03d79c 3ef0b117 3f952071 3f952071 3eb999f6 3d052c51 3f543f3d -> 3f13f88b 3f800000 3f800000", + "3e03aed3 3f92d169 3e102437 3f97b4f5 3f941fea 3f9c1d28 3f694797 -> 3f800000 3e2af445 3f800000", + "3f2b2782 3f087992 3f92718d 3cb148da 3f82976d bded1b70 3f82976d -> 3f800000 3f800000 3d8b6bfd", + "3e9169fa 3c0b8a9e 3c0b8a9e 3f3ab77d bd631b2b 3f0bf638 3f894e30 -> 3c0960ce 3c253120 3f800000", + "be384177 be6ea50f 3f816ce7 3f55f266 3f55560a 3f890583 3f55560a -> be4f86b9 3f590b40 3f3a0c85", + "3fbbe3de bdb08181 bdb08181 3dc7058d 3ecf9ba9 3ed35015 3d7b8517 -> be5a0521 be5fe517 3ddabcfd", + "be8cbb11 3f8b85a7 3eaa183b 3eaa183b 3f5d0629 be15ce45 3c3c8d55 -> 3f61864d 3eb1388f 3ea98eed", + "3f009f1f 3efb4b01 be67e2ff 3efb4b01 3f0ea12f 3f090e9c 3f3ec06f -> 3f2e7dbb be9e9b61 3f48d511", + "be30c9f9 bd011eca 3f5f55b5 3f5f55b5 3f35139f 3f35139f 3f9c125f -> bce62307 3f4707a0 3f387f26", + "3eb6dbe9 3f5735f8 3f9e2fb4 3eee58d9 3f873dec 3d0e7a0f bd888d07 -> 3f800000 3f800000 3ee8cdaa", + "3f01302d 3f834205 3e655932 3f834205 3df7a286 3f4d1785 3df7a286 -> 3f800000 3ec07fe2 3f800000", + "bef9e080 3f862c57 3eaf7060 be25e165 3f400000 00000000 3f800000 -> 3f447144 3eaf7060 bddef393", + "3f300a7f 3f5b243e bdf6dc73 3f23ce33 00000000 3f000000 00000000 -> 3f5b243e be3c1b8e 3f23ce33", + "3f1b827f 3f477aae 3f854003 3d21e66a 3f2901af 3f461653 3f00520c -> 3f800000 3f800000 3d68c770", + "3e3604a1 3f1f3dfd 3f33d267 3e8c7f2e bb0d8797 3f80f522 bb0d8797 -> 3f1f2e59 3f5b0cb9 3e8c7161", + "3f9a733c 3e9a68ed 3e9a68ed 3f651b05 3f800000 3f400000 3f800000 -> 3f800000 3f800000 3f800000", + "3fb12ccc 3e730fad 3f8b7120 3e730fad 3f621d53 3f155d04 3f95d90b -> 3f800000 3f800000 3f800000", + "3dd94a72 3f4ee7a1 3f99e048 3f99e048 3e1a1fa5 3f7061c4 3e1a1fa5 -> 3f524333 3f800000 3f800000", + "bda401d0 3f810bb4 3f27807d 3ee695aa 3ef3745b 3ef3745b bd336d00 -> 3f789fca 3f215b8e 3ee76578", + "3f8bf955 3f99c86a bcd853d5 bcd853d5 3d8ac7d0 3eb0be24 3f139bb8 -> 3f800000 bd2dc14a bd9260d1", + "3ebaf8c6 3f27afd8 3f863df5 3f894b0f 3f236be7 bd0212ce 3f93de8d -> 3f5aa918 3f800000 3f800000", + "be636626 bd99aa8f be2586d7 bdcdac25 3f709cd8 3f709cd8 3e6f62e6 -> bd7e4330 be08f192 bdc385a3", + "3e53ccba 3f765a55 3f765a55 be712353 3f9d649b 3e9e0a02 be657070 -> 3f800000 3f800000 be66752a", + "3e9b0dd4 3f7e41ab 3f977f2e 3f977f2e 3f8439c2 3f9d9292 3f8ab243 -> 3f800000 3f800000 3f800000", + "3fb4fe42 bda324b5 be38e16c bda324b5 3f670d54 3dd6a563 3f670d54 -> 3f800000 be590bf1 3f800000", + "3f47e39d 3f27c13f 3f531899 3f27c13f 3f9fbd84 3f9fbd84 3f6c9529 -> 3f800000 3f800000 3f800000", + "3f87bbb9 be1f348b 3f319345 be1f348b 3ec48f49 3f222977 3f222977 -> be86427f 3f800000 bef27b0e", + "3ef79b50 bca91ac4 3f9e5019 3f9e5019 3f800000 3e800000 3f400000 -> bd23bc7a 3f800000 3f800000", + "bec80605 be322a15 3e7c5032 be322a15 3f7330bd 3f154af1 3f373b18 -> be01f0c5 3e4d7ed0 be0b3b6f", + "3ecc24ca 3f269572 3f195125 3f269572 3e36526b 3e6ae6a4 3f0acef6 -> 3f33503f 3f28c070 3f54881b", + "bed65ef3 3f643828 3f6d0aa7 3f6d0aa7 3f95af82 3f5eb0ca 3e80e8a2 -> 3f1934a5 3f2dc1bd 3f566fbd", + "3f3bb479 3f988be2 3f594d36 be660a7d 3ed46eb3 3f78ba46 3ed46eb3 -> 3f800000 3f800000 bea54fb7", + "bcf04438 3ea9b3f3 3f80045d 3f3f212a 3c973aa8 3e41b6c0 3c973aa8 -> 3ea99c70 3f7e9f11 3f3f06b0", + "bba288ba be3e472b 3f340656 3f0908a7 3eb019b4 3ecd8327 3eab2333 -> be3df435 3f33aac4 3f08ce96", + "3f93a670 3e4127b5 3d903e9a 3f846f92 3e8569c7 3f57f1bc 3e869b1e -> 3e8a14d2 3f800000 3f800000", + "3f2b818d 3f34932b 3f007f6b 3f34932b 00000000 3e800000 3f400000 -> 3f34932b 3f1a595e 3f800000", + "3fb84c7d 3e19e9c2 3e9eeaf1 3e19e9c2 3e82816c 3e82816c 3ec6f9de -> 3e732685 3efb0e85 3eaeb98f", + "be96dde6 3f31d60c bd874bba 3f31d60c 3f692fec 3f692fec 3bc6b35c -> 3f0c3466 bd555519 3f3184d8", + "3f104079 3f2f9a30 3f2f9a30 3ebcc49d 3f9d3713 3ec8c3c9 3f743b10 -> 3f800000 3f61680a 3f4c1bab" + ] + }, + { + "function": "cycles_mix_burn", + "node": "ShaderNodeMix RGBA BURN", + "cases": [ + "00000000 00000000 00000000 00000000 3f800000 3f400000 00000000 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f32ec9e 3f88d6e5 3ee3a24e -> 00000000 3d08b5d0 00000000", + "3f800000 00000000 00000000 3f000000 3efbe781 3f5db148 3f2ca506 -> 00000000 00000000 3e846640", + "3fc00000 00000000 00000000 3f400000 3f49efaa 3f1d1e0a 3f8763eb -> 00000000 00000000 3f4519d8", + "bf000000 00000000 00000000 3f800000 3f866c38 3d8c4cfc 3f066433 -> 00000000 3ea2b0a6 3f800000", + "3e800000 00000000 3e800000 00000000 3f3c3a4d 3f9cc63e 3f3c3a4d -> 00000000 3e946eb8 00000000", + "3f400000 00000000 3e800000 3e800000 3f000000 3f400000 3e800000 -> 00000000 3d9d89d8 00000000", + "40000000 00000000 3e800000 3f000000 bdf9900a 3da1cd12 bdf9900a -> 00000000 00000000 00000000", + "00000000 00000000 3e800000 3f400000 3ee3d1a5 3f3ecafc 3f9244ed -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3e777b57 3ed75c92 3f966e09 -> 00000000 00000000 3f800000", + "3f800000 00000000 3f000000 00000000 3ed607db 3ed607db 3e77dc62 -> 00000000 00000000 00000000", + "3fc00000 00000000 3f000000 3e800000 3f1bee19 3f1bee19 3f8e5dd8 -> 00000000 00000000 3eb7556e", + "bf000000 00000000 3f000000 3f000000 3f46bf49 bc3ad7a2 bc3ad7a2 -> 3dcdfa78 3f2afd65 3f2afd65", + "3e800000 00000000 3f000000 3f400000 3f400000 3f400000 3e800000 -> 00000000 3eeeeeee 3f313b14", + "3f400000 00000000 3f000000 3f800000 00000000 3f400000 00000000 -> 00000000 3ec4ec4e 3f800000", + "40000000 00000000 3f400000 00000000 3e763499 3e537150 3f2df446 -> 00000000 00000000 00000000", + "00000000 00000000 3f400000 3e800000 bd802bbc 3f51bb0e 3f22d5eb -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f81cd60 3f7a5c43 3f7a5c43 -> 3be51300 3f3f4986 3efd2618", + "3f800000 00000000 3f400000 3f400000 3f800000 3f400000 3e800000 -> 00000000 3f2aaaaa 00000000", + "3fc00000 00000000 3f400000 3f800000 3f0104d8 3e9ec5dc 3e9ec5dc -> 00000000 00000000 00000000", + "bf000000 00000000 3f800000 00000000 3f1c955d 3f1c955d 3e8cf300 -> 3e2680b8 3f800000 3e882e14", + "3e800000 00000000 3f800000 3e800000 be2a65f3 3f8fa91c 3f7e1f00 -> 00000000 3f800000 3e7e9698", + "3f400000 00000000 3f800000 3f000000 bd6f31de bd6f31de 3ddcdeb1 -> 00000000 3f800000 00000000", + "40000000 00000000 3f800000 3f400000 3f400000 3e800000 3f400000 -> 00000000 00000000 3f000000", + "00000000 00000000 3f800000 3f800000 3e117bb6 3e117bb6 3f77d976 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3ef20491 be2ce461 3ef20491 -> 00000000 00000000 00000000", + "3f800000 3e800000 00000000 3e800000 3dc7ec04 3f872624 3f82a9b0 -> 00000000 3d58aaa0 3e87d362", + "3fc00000 3e800000 00000000 3f000000 bd6c1621 3e86bd14 bdb190e3 -> 00000000 00000000 00000000", + "bf000000 3e800000 00000000 3f400000 be1efa59 be326291 3f231f1e -> 3f064c54 3ebd6642 3f49d3bf", + "3e800000 3e800000 00000000 3f800000 3f9896f6 bde8bbd9 bdb6c80b -> 3e9198e0 00000000 3f800000", + "3f400000 3e800000 3e800000 00000000 3f677d73 3e375464 3f2ab06d -> 3e449618 00000000 00000000", + "40000000 3e800000 3e800000 3e800000 3f882368 3f87591b 3f87591b -> 3eab5232 3ea78c3c 3ea78c3c", + "00000000 3e800000 3e800000 3f000000 3f69f355 3f07f413 3f69f355 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3bad87a7 3f4ff07e 3f0d10a7 -> 00000000 3e3070ec 3f2d7978", + "3f800000 3e800000 3e800000 3f800000 3e3054ea 3e3054ea 3ed2b4de -> 00000000 00000000 3f800000", + "3fc00000 3e800000 3f000000 00000000 3f53350e bce5e296 bde2121b -> 00000000 00000000 00000000", + "bf000000 3e800000 3f000000 3e800000 3f9994b3 be3c8ddf 3f9994b3 -> 3e2abcd0 3f2f99f5 3e2abcd0", + "3e800000 3e800000 3f000000 3f000000 3f829c2d 3f7341c8 3f571409 -> 3e81f296 3efcc62c 3ef557fe", + "3f400000 3e800000 3f000000 3f400000 3f3790b8 3f94b932 3f99b6a9 -> 3d447a80 3f0ddc12 3f486148", + "40000000 3e800000 3f000000 3f800000 3f3d294d 3ed81cd0 3f46b21e -> 00000000 00000000 3f800000", + "00000000 3e800000 3f400000 00000000 3f400000 00000000 00000000 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 bd07e297 3f245054 3f748bdc -> 00000000 3f320a09 3e6e6d24", + "3f800000 3e800000 3f400000 3f000000 3e800000 3e800000 3f800000 -> 00000000 00000000 3f000000", + "3fc00000 3e800000 3f400000 3f400000 3f659d0d 3f701d99 3f659d0d -> 3de71720 3f396e9c 3f344ba2", + "bf000000 3e800000 3f400000 3f800000 3f3d0357 3f3d0357 3f9ebd40 -> 3eac6d76 3f476794 3f800000", + "3e800000 3e800000 3f800000 00000000 3f047b62 3f047b62 3f215f06 -> 3e16a780 3f800000 00000000", + "3f400000 3e800000 3f800000 3e800000 3f93f759 3f33e547 3def459e -> 3ea83802 3f800000 00000000", + "40000000 3e800000 3f800000 3f000000 3e800000 00000000 00000000 -> 00000000 00000000 00000000", + "00000000 3e800000 3f800000 3f400000 3f000000 3e800000 3f000000 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f8fcbc6 be1135a8 3f8fcbc6 -> 3e965124 3f800000 3f800000", + "3f800000 3f000000 00000000 00000000 3ec653de 3f10ecae 3ec653de -> 00000000 00000000 00000000", + "3fc00000 3f000000 00000000 3e800000 3e63df34 3e63df34 3eff935f -> 00000000 00000000 00000000", + "bf000000 3f000000 00000000 3f000000 3f98286f 3f9bf205 3f9bf205 -> 3ee55326 00000000 3ee0a158", + "3e800000 3f000000 00000000 3f400000 bd176f4b be757c3a 3f43cae5 -> 3ea6685c 00000000 3f3c0080", + "3f400000 3f000000 00000000 3f800000 3f4a2285 3f2e5a7b 3ca6c67d -> 3ed00802 00000000 3f800000", + "40000000 3f000000 3e800000 00000000 bde20a15 3eb362e0 bde20a15 -> 00000000 00000000 00000000", + "00000000 3f000000 3e800000 3e800000 3e959385 3f7fbac7 3e959385 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3f000000 3f800000 3f000000 -> 3eaaaaaa 3e800000 3eaaaaaa", + "3f800000 3f000000 3e800000 3f400000 3f597088 3efbcfe7 3f08d68f -> 3ed299f0 00000000 3f08446c", + "3fc00000 3f000000 3e800000 3f800000 3f27aaf4 3f7732e5 3f92694c -> 00000000 3e563dbc 3f800000", + "bf000000 3f000000 3f000000 00000000 bdc21092 3f7cf24c bdc21092 -> 3f2d478c 3f00c244 3eb51e32", + "3e800000 3f000000 3f000000 3e800000 bd8b8061 3e63ddcd bd8b8061 -> 3ea2bc8e 3ec23ca2 00000000", + "3f400000 3f000000 3f000000 3f000000 3f8d29c8 3f9f1f97 3f8fa760 -> 3f092a5e 3f13be06 3f0ac105", + "40000000 3f000000 3f000000 3f400000 3f800000 3e800000 3f800000 -> 3f000000 00000000 3f400000", + "00000000 3f000000 3f000000 3f800000 3d543c3a 3f84d446 3d543c3a -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3ed07c75 3eb6c81e bc219ce8 -> 3e942822 3f21ac8a 00000000", + "3f800000 3f000000 3f400000 3e800000 3f8c9b7d 3f0bd3ca be6ba4d5 -> 3f0b7a1a 3f0ad3af 00000000", + "3fc00000 3f000000 3f400000 3f000000 3f1372e5 3f8b5466 3f1372e5 -> 00000000 3f478056 00000000", + "bf000000 3f000000 3f400000 3f400000 be282ff4 3f6695f0 3f6695f0 -> 3f2f1896 3f4306cc 3f4306cc", + "3e800000 3f000000 3f400000 3f800000 bd30f3e4 3f40f83f 3f052c46 -> 3ea5adf2 3f3bcd5e 3f800000", + "3f400000 3f000000 3f800000 00000000 3f1afcce 3e48261e 3e48261e -> 3e9465ae 3f800000 00000000", + "40000000 3f000000 3f800000 3e800000 3f056561 3eeeb887 3f59899c -> 00000000 00000000 00000000", + "00000000 3f000000 3f800000 3f000000 3e800000 3f000000 3f800000 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3e7711ab be46aa84 3effaf15 -> 3e470b44 3f800000 3f2aa1ac", + "3f800000 3f000000 3f800000 3f800000 3ee3ffdc 3ee3ffdc 3f6e9873 -> 00000000 3f800000 3f800000", + "3fc00000 3f400000 00000000 00000000 3f89ea37 3ed497bb 3f8ad56e -> 3f46a980 00000000 3de6b7b8", + "bf000000 3f400000 00000000 3e800000 3f3155ac 3f5bd19a bd6e5c4b -> 3f488609 3d872c40 3f026f88", + "3e800000 3f400000 00000000 3f000000 3d2f6401 3d2f6401 3f50a8bf -> 3f2bde16 00000000 3ef39754", + "3f400000 3f400000 00000000 3f400000 bd809cbd 3eadf118 3effcc32 -> 00000000 00000000 3f198d2a", + "40000000 3f400000 00000000 3f800000 3e2f788d 3e2f788d 3e4ef739 -> 00000000 00000000 00000000", + "00000000 3f400000 3e800000 00000000 3f7af611 3f4baa60 3f0b38f9 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f5fba9f 3f056a84 3f5fba9f -> 3f3bb1dc 3c63df40 3e4c5654", + "3f800000 3f400000 3e800000 3f000000 3f84c4fd 3f6895fe 3eaca34f -> 3f424c90 3e32afc0 00000000", + "3fc00000 3f400000 3e800000 3f400000 be42ade2 3eccbc20 3f71237d -> 00000000 00000000 3f39e53a", + "bf000000 3f400000 3e800000 3f800000 3bf661dc 3f81c2da 3bf661dc -> 3f5539e4 3e7aae14 3f800000", + "3e800000 3f400000 3f000000 00000000 3f92660b 3f92660b 3ef6c8b9 -> 3f423855 3f0470aa 00000000", + "3f400000 3f400000 3f000000 3e800000 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f000000 00000000 00000000", + "40000000 3f400000 3f000000 3f000000 3f9037a8 3f9037a8 3f75e915 -> 3f4cf053 3f19e0a6 3eea1820", + "00000000 3f400000 3f000000 3f400000 3f800000 3f800000 3f800000 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f800000 00000000 3f000000 -> 3f400000 00000000 3f800000", + "3f800000 3f400000 3f400000 00000000 3f400000 3f000000 3e800000 -> 3f2aaaaa 3f000000 00000000", + "3fc00000 3f400000 3f400000 3e800000 3d705b6c 3ea49751 3eacd308 -> 00000000 00000000 00000000", + "bf000000 3f400000 3f400000 3f000000 be1fba57 be1fba57 3e415d91 -> 3f57712f 3f57712f 3f24ef42", + "3e800000 3f400000 3f400000 3f400000 3ecdc50e 3f2c2f5c 3ed61ed0 -> 3f34bf70 3f3a4b69 3f351b5c", + "3f400000 3f400000 3f400000 3f800000 3f444c5b bc66430a 3f444c5b -> 3f326ed6 00000000 3f800000", + "40000000 3f400000 3f800000 00000000 3e9a66b9 3e9a66b9 3f85bac1 -> 00000000 00000000 3da84780", + "00000000 3f400000 3f800000 3e800000 3f563d86 3f563d86 bd43a671 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f8ad1ee 3f04c8e1 3f0a9e47 -> 3f429867 3f800000 3eb3d9e6", + "3f800000 3f400000 3f800000 3f400000 3f337817 3f448d36 3f448d36 -> 3f24b562 3f800000 3f2ca48c", + "3fc00000 3f400000 3f800000 3f800000 3f76d9c9 3f568653 3f4a103a -> 3f3c5fea 3f800000 3f800000", + "bf000000 3f800000 00000000 00000000 bcc80e65 3f99dd23 3e0cc08f -> 3f800000 00000000 3e9a46ce", + "3e800000 3f800000 00000000 3e800000 3f879be4 3f95da82 3d9365be -> 3f800000 3d27abe0 3cbfed00", + "3f400000 3f800000 00000000 3f000000 3f8b26a1 3f048a01 be5241c4 -> 3f800000 00000000 00000000", + "40000000 3f800000 00000000 3f400000 3f66aafb bddbea3e 3f66aafb -> 3f800000 00000000 3f303570", + "00000000 3f800000 00000000 3f800000 3e2a7bc9 be31b9d3 be31b9d3 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 be4a0fb1 be4a0fb1 3f02382e -> 3f800000 00000000 00000000", + "3f800000 3f800000 3e800000 3e800000 00000000 3f000000 3f400000 -> 00000000 00000000 00000000", + "3fc00000 3f800000 3e800000 3f000000 3e22368c 3ee23a3c 3dbee616 -> 00000000 00000000 00000000", + "bf000000 3f800000 3e800000 3f400000 3e814899 bd3bb1aa 3f358242 -> 3f800000 3f01ecfd 3f4820f6", + "3e800000 3f800000 3e800000 3f800000 3f9a1ee5 3e866ca0 3e866ca0 -> 3f800000 3da4cf20 3f800000", + "3f400000 3f800000 3f000000 00000000 3f2d1125 3ea01b05 be7d8892 -> 3f800000 00000000 00000000", + "40000000 3f800000 3f000000 3e800000 3e918285 bbd12bf2 be290f32 -> 00000000 00000000 00000000", + "00000000 3f800000 3f000000 3f000000 3f165315 3f611ea5 3f165315 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f292e5b 3f9d531f 3cb796e3 -> 3f800000 3f0d27c8 3f02ce43", + "3f800000 3f800000 3f000000 3f800000 3f96552f 3e8389cd 3f59e317 -> 3f800000 00000000 3f800000", + "3fc00000 3f800000 3f400000 00000000 be414d62 3eea41fb 3f0293a8 -> 00000000 00000000 00000000", + "bf000000 3f800000 3f400000 3e800000 3f2a1b47 3f1a3607 bdf4a04a -> 3f800000 3f4a9d13 3f04e6b7", + "3e800000 3f800000 3f400000 3f000000 3f99f78f bd87da70 be2f5816 -> 3f800000 3f28bcb6 3e960130", + "3f400000 3f800000 3f400000 3f400000 3f4cc6dc 3e34df58 3f7af98a -> 3f800000 3eb1566a 3f3f0b30", + "40000000 3f800000 3f400000 3f800000 3ddce038 3e4098bd 3e4098bd -> 00000000 00000000 00000000", + "00000000 3f800000 3f800000 00000000 3f7b4a7c bd6eccd3 3f98cf4e -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f7d65e8 3d8a66fa 3d8a66fa -> 3f800000 3f800000 00000000", + "3f800000 3f800000 3f800000 3f000000 3d605767 3d605767 3f44389d -> 3f800000 3f800000 3eb2026e", + "3fc00000 3f800000 3f800000 3f400000 3f8cb763 bd54dd67 3cccb4fc -> 3f800000 00000000 00000000", + "bf000000 3f800000 3f800000 3f800000 3e8163b7 3f9d778b 3f9d778b -> 3f800000 3f800000 3f800000", + "3e800000 00000000 00000000 00000000 3f809fc2 3f845e9b 3f845e9b -> 3a9f8e00 3c0aa480 3c0aa480", + "3f400000 3e800000 3e800000 3e800000 3ebe943e 3e0165e7 3d49e378 -> 00000000 00000000 00000000", + "40000000 3f000000 3f000000 3f000000 3dc46d16 3e481c88 be6f0add -> 00000000 00000000 00000000", + "00000000 3f400000 3f400000 3f400000 3e1cdbc4 3e0d5bbb 3e0d5bbb -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f98696e 3f1f0041 3f1f0041 -> 3f800000 3f800000 3f800000", + "3f800000 3fa00000 3fa00000 3fa00000 3d6fe4eb bcd51323 bcd51323 -> 3f800000 00000000 00000000", + "3fc00000 be800000 be800000 be800000 3f000000 3f800000 3e800000 -> 00000000 00000000 00000000", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3ef94ed9 3eaa51df 3f03351f -> 3e9146fc 3ea67ce0 3e8d80d0", + "3e800000 3f666666 3f666666 3f666666 3f000000 3f000000 3e800000 -> 3f62be2b 3f62be2b 3f607e07", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3d825e27 3f8e24b7 3ec315e8 -> 00000000 3ec4c9e8 00000000", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3ea3c621 3f14b2a9 3ea3c621 -> 00000000 00000000 00000000", + "00000000 be52c0c6 3cd5824e 3cd5824e 00000000 3f400000 3f000000 -> 00000000 3cd58240 3cd58240", + "3f000000 3df535b4 3f1be807 be63c390 be1e4a5d 3ef2c308 3e125154 -> 00000000 3ef066ec 00000000", + "3f800000 be35b40f 3d8fd590 3f621fd2 bcc0de88 bcc0de88 3f6db2cf -> 00000000 00000000 3f5fd2f4", + "3fc00000 3e86fdda 3f80f0d0 3db85da5 3e9250f0 3f81082c 3f81082c -> 00000000 3f800000 3dcea218", + "bf000000 3f7d438e 3db7b3bc 3db7b3bc 3f34b257 3f6d4995 3c653366 -> 3f7d9d5d 3df96fa0 3ec7d3f8", + "3e800000 bd3b2c00 3f9ea3dc 3f9ea3dc 3f2bc57a 3f939a3a 3f939a3a -> 00000000 3f800000 3f800000", + "3f400000 3f8218e2 3ee48290 3f27e266 3f02313b 3f09cca3 be2efade -> 3f800000 3e1cac1c 00000000", + "40000000 3f052fc6 3e630a0b 3f052fc6 3f36de6e be577aae be577aae -> 00000000 00000000 00000000", + "00000000 be4ee7ac be2251d1 3f99581e be714037 3e7334e8 3ea7a66f -> 00000000 00000000 3f800000", + "3f000000 3f8f28f9 3e4e0bd6 be58b59c 3f1c26ab 3f3d6af8 3f641cc3 -> 3f800000 3da78d98 00000000", + "3f800000 3f83a86f 3f83a86f 3f438a79 3edb7c89 3f82ed88 3f931e20 -> 3f800000 3f800000 3f4b65c0", + "3fc00000 3f80d0ae 3f26c3c4 3f84ee63 3cc7669e 3d8b7fb0 3cc7669e -> 00000000 00000000 00000000", + "bf000000 3f496af6 3f4a878c 3f4a878c 3d664af8 3d664af8 3ea3526b -> 3f5aeaba 3f5bac12 3f581c98", + "3e800000 3e17ee7f 3e600c61 3f24770c 3f7feb45 bd1b6148 bd1b6148 -> 3e17dcd8 00000000 3f0463ee", + "3f400000 3f7b0734 3f32d43c 3f32d43c 3f8a5836 3f8a5836 3e049d36 -> 3f7b4ff1 3f373d40 3e06c0c4", + "40000000 3f71a3dd 3f7dd991 3ea637d8 3f784bba 3f784bba 3f3083f8 -> 3f70b86e 3f7db651 00000000", + "00000000 be4cfc12 3f2169fa 3f2169fa 3ea17148 3e215204 be27c86a -> 00000000 3f2169fa 3f2169fa", + "3f000000 3dde1d90 3f205688 3dde1d90 3ebe0efa 3e84466b 3f1f5f94 -> 00000000 3ecfe9b4 00000000", + "3f800000 3f7456b5 be335a92 3f69747c 3e800000 3e800000 3f400000 -> 3f515ad4 00000000 3f61f0a5", + "3fc00000 3f81c1ca 3d660917 3f81c1ca 3f800000 3f400000 3f800000 -> 3f800000 00000000 3f800000", + "bf000000 be1c0f25 3f5fa4de 3f5fa4de 3f89965d 3f6e7432 3f2179b0 -> 00000000 3f60b753 3f64afc3", + "3e800000 be44fc8f 3e902b00 3e902b00 be733b71 bd8d9a37 3f662dc0 -> 00000000 3c9fcbe0 3e86a71a", + "3f400000 3e978db3 3ea59818 3f2a5fd7 3eac45dd 3f0acb6c bd0cbfe0 -> 00000000 00000000 00000000", + "40000000 3e6c9eb1 3f97cde5 3e6c9eb1 3f16281e 3f7f70f9 3f7f70f9 -> 00000000 3f800000 3e692b04", + "00000000 3eddbf80 3f8f0aa8 3eddbf80 3f9aa782 3c852c7f 3c852c7f -> 3eddbf80 3f800000 3eddbf80", + "3f000000 3f433661 3c97c471 3c97c471 3d8f12e5 3e305f8b 3e305f8b -> 3f0e5d0e 00000000 00000000", + "3f800000 bd9190f2 3f7c92ba 3f7c92ba bdcdf163 3f73ec15 3f73ec15 -> 00000000 3f7c674a 3f7c674a", + "3fc00000 3f97c717 3e8326e1 3f97c717 3f8e614f 3f8e614f 3e5a6cee -> 3f800000 3eba135c 00000000", + "bf000000 3f737577 3e51f020 3f737577 3ec3c816 3ec3c816 3f9d234b -> 3f766afa 3ec90190 3f71d91c", + "3e800000 3f8fa3d8 3f681a00 3f681a00 3f61fab2 3e810a2b 3e810a2b -> 3f800000 3f629adb 3f629adb", + "3f400000 3e8aa2b1 3f2efae8 3e037719 3f26a487 3ea1a3a0 3f26a487 -> 3c476140 3eb31dcc 00000000", + "40000000 3ea4051a 3d138c57 3e1c90b8 3f9f9c67 3ea47e10 3ea47e10 -> 3f0b88df 00000000 00000000", + "00000000 3f2755a7 3f951e30 3f04d846 3f0b7297 3e939da5 3f80f708 -> 3f2755a7 3f800000 3f04d846", + "3f000000 3da34395 3d9d44bf 3da34395 3f36ae49 3f4ce1dd 3f846bbf -> 00000000 00000000 3dc34260", + "3f800000 be71db54 3f8712c6 be71db54 3f683437 3eb12e50 3f909e83 -> 00000000 3f800000 00000000", + "3fc00000 3f90253f 3efb5d3d 3f6d5d00 00000000 3e800000 3f800000 -> 00000000 00000000 3f6d5d00", + "bf000000 be300900 3f26566f be300900 3e27b569 3e94c553 3e27b569 -> 3e31c774 3f3dd08c 3e31c774", + "3e800000 3f0599bb bdd3e1dd bdd3e1dd 3edf7cd3 3f36cc72 3f36cc72 -> 3ee30f5e 00000000 00000000", + "3f400000 3f6d453b 3f6d453b 3edf84b1 3f831196 3d7d68ea 3f88208b -> 3f6d99ec 3f40cf5b 3eeca19e", + "40000000 3f87df3e 3f87df3e 3cfe2238 3f976880 3ec04c07 3ec04c07 -> 3f800000 00000000 00000000", + "00000000 3f6d3659 3f6d3659 3eb92752 3f0bad48 3e61272f 3f8c7364 -> 3f6d3659 3f6d3659 3eb92752", + "3f000000 3ebfb5f3 3f86eede 3ea51188 3f14389a 3f14389a 3f326303 -> 3e549f30 3f800000 3e4e298c", + "3f800000 3f52717f 3f9fa122 3f8a8a13 3e6d82d9 3e03bfdb 3f67d992 -> 3e6e5a30 3f800000 3f800000", + "3fc00000 3f854c53 3f854c53 3ec3c3b8 3e29dfae be6e0b76 3d01913f -> 00000000 00000000 00000000", + "bf000000 3e9bb781 3e9bb781 3ee272ee 3eb47ecb 3eb47ecb 3f44ad57 -> 3ef2d99e 3ef2d99e 3f000caa", + "3e800000 3efe3673 be2e7cfe 3f76b53b 3f4e77ee bd1fb2c2 3f4e77ee -> 3ef11c0e 00000000 3f763c52", + "3f400000 3f66538c 3f57e3b5 3cd97119 3f591d5a 3c59d389 3f591d5a -> 3f630689 3ecb6c68 00000000", + "40000000 3f7da01e 3f25493d 3f25493d 3e958e89 3da4a381 bc8751cc -> 00000000 00000000 00000000", + "00000000 3e751baf 3f56c19f bd7fa97c 3f68debb 3f10a615 3eaad767 -> 3e751bb0 3f56c19f 00000000", + "3f000000 3f12780b 3e1eb2ef 3ed2c06f 3f02836d be5d8950 3f02836d -> 3eddd102 00000000 3e61e520", + "3f800000 3eb440d9 3f32a2c0 3f32a2c0 3cab3a65 3cab3a65 3f380272 -> 00000000 00000000 3f145e4d", + "3fc00000 3d75db14 3f725520 3ee37861 3f60074c 3f4d466d 3f4d466d -> 00000000 3f6c8d68 3e564728", + "bf000000 3f93fcfb 3f009593 3f22642b 3ee70ba4 3e110da0 3e110da0 -> 3f800000 3f26d8b8 3f3e8062", + "3e800000 3ddfd36c 3f4e74d6 3f214486 3f92ee22 3f815d70 3f815d70 -> 3e106ee4 3f4e968f 3f218502", + "3f400000 3f529bc2 3f322658 3f6dfdb7 3cfdf3a2 3e958df4 3f7e64e7 -> 3eb3c3e6 3eb41188 3f6de7ec", + "40000000 3ea0ac0a 3f37d4d2 be21b574 3f959e9f 3ed41d26 3f959e9f -> 3ef96292 00000000 3e09b120", + "00000000 3f911f74 3eb3f6fa 3eb3f6fa 3e5bf484 3e5bf484 3f878532 -> 3f800000 3eb3f6fa 3eb3f6fa", + "3f000000 bcf10e1b 3e9e6c11 3f2b9404 3f95d2d9 3f25d556 3f95d2d9 -> 3d52b080 3e25b0a8 3f3235ae", + "3f800000 3ec3057f 3e77af15 3ec3057f 3f8f84fe 3f8f84fe 3d4371fa -> 3ee54c4a 3ea5d0c2 00000000", + "3fc00000 3f81cf67 3ea8dfe2 3f81cf67 3d41720f 3f02b922 3f345e41 -> 00000000 00000000 3f800000", + "bf000000 3f678e56 3f2fee3d 3f9ae840 bcc5ed13 bcc5ed13 3eacb782 -> 3f6fd58e 3f4b0c00 3f800000", + "3e800000 3eb2b502 bc9c6e09 3f02efba 3b111279 3dfe32a1 3f9ca41d -> 3e07dfcc 00000000 3f098fd3", + "3f400000 3ecc9863 3f37b1fe 3f2a1691 3f1cc130 3f8f4442 3f1cc130 -> 3e1d2558 3f3da1d0 3f06de3b", + "40000000 3f1f8469 3f3cc838 3f1f8469 3f3fcdb8 3f96c869 3ec24592 -> 3e79c300 3f4e6dba 00000000", + "00000000 3ef4a8be 3f3ab47c be1e15d3 3f8aff7b be524840 3ec879af -> 3ef4a8be 3f3ab47c 00000000", + "3f000000 3f90fb16 be0dee89 3f812fa6 3f400000 00000000 3f400000 -> 3f800000 00000000 3f800000", + "3f800000 bb1aad44 3e845d91 bdce1906 3e7d73bc 3e7d73bc 3f36541b -> 00000000 00000000 00000000", + "3fc00000 3f390ec9 3e9bcfe4 3f946091 be6af825 be6af825 bd9558dd -> 00000000 00000000 00000000", + "bf000000 bd356523 3f3bbecc 3f3bbecc be5a59aa be3e26a7 be3e26a7 -> 3eb33468 3f552635 3f552635", + "3e800000 3f6322cb 3e6b9046 3f6322cb be3a0b91 3e618990 3e618990 -> 3f570897 3d329c00 3f5c2594", + "3f400000 3ec96117 3f15f4de 3f03fb11 3e82d126 3f84a228 3e82d126 -> 00000000 3f18c267 00000000", + "40000000 bde0e581 3f12d272 3f12d272 3e1065f0 bd8fb291 3e1065f0 -> 00000000 00000000 00000000", + "00000000 3e85aeed 3ebd9d2b 3ebd9d2b 3f8acc24 3f79121e 3efd9a6e -> 3e85aeec 3ebd9d2c 3ebd9d2c", + "3f000000 3f25a2ae 3f4e675a 3eab54c4 3e9f11f3 3f709b49 be0aa0d1 -> 3eec38c2 3f4cddca 00000000", + "3f800000 3e6ac4fc 3e6ac4fc 3da5136c 3f91ef43 3f369301 3ec1d326 -> 3ea5e184 00000000 00000000", + "3fc00000 3efbcf8a 3efbcf8a be491117 bdfacc81 3f8640e4 3f5d5a11 -> 00000000 3f06c9c2 00000000", + "bf000000 3f30a239 3f30a239 3d2ed987 3eaec012 be3b50d2 3eaec012 -> 3f444bf4 3f4e2145 3e8f4a14", + "3e800000 3cdf87d1 3f566eff 3f8d867a 3db56bb5 3e5cec09 3db56bb5 -> 00000000 3f4c4bde 3f800000", + "3f400000 3e0caf85 3f6cefc5 3e0caf85 3f3e53b3 3f3e53b3 3f638d77 -> 00000000 3f68651c 3d718030", + "40000000 3f4e9a7e 3f941303 3f64a98b 3f802107 3f747f60 3d7c0671 -> 3f4eb3ee 3f800000 00000000", + "00000000 3f5ac940 3f294b39 3f3d0aa6 3ed33ab3 3f079b92 3f079b92 -> 3f5ac940 3f294b39 3f3d0aa6", + "3f000000 be3a39c2 3f7b0159 3d8c28f9 3f1328dc 3f1328dc 3f944afc -> 00000000 3f79a827 3e0c2484", + "3f800000 3f1ce781 3f768a4b be3b6516 be3eeae7 3f5b34a6 3f7c5727 -> 00000000 3f74f3cd 00000000", + "3fc00000 3f15d63c be2a9834 3e8d96ca 3f000000 3f400000 3f400000 -> 00000000 00000000 00000000", + "bf000000 3f5201f8 3f5201f8 3ec81e3d be0f2996 3f2add22 3f7e56cc -> 3f62b428 3f5890a4 3ec92068", + "3e800000 3e516455 bc3f48eb 3f717ae4 3f9c4538 3f67cc6d 3ebfd177 -> 3e7c0474 00000000 3f6eca13", + "3f400000 3e530f39 3f909123 3dda69f8 3f55c02d 3f60976a 3f35ec72 -> 3dc07170 3f800000 00000000", + "40000000 3f9909b2 be6c19e0 bdf0cc5b 3f855170 3f8ad6fd 3f5c5e7e -> 3f800000 00000000 00000000", + "00000000 3f7185f8 3f36402e 3f36402e 3ed51dfb 3ed51dfb be06539e -> 3f7185f8 3f36402e 3f36402e", + "3f000000 3f80ed4c 3e90b5ed 3e90b5ed 3f000000 00000000 3e800000 -> 3f800000 00000000 00000000", + "3f800000 3f39346c 3ef5407e 3d98dcfb 3e166b50 be0b5ed9 3f8f423d -> 00000000 00000000 3e315bd8", + "3fc00000 3e83cbc4 3f6f1f1f 3e83cbc4 3f0ba02c 3f0ba02c 3f72c3e4 -> 00000000 3f4af16c 3e47aab4", + "bf000000 3f5b0901 3f1038b2 3f1038b2 3f7bba43 3f7bba43 3ecc6c51 -> 3f5b5750 3f112580 3f2a0a75", + "3e800000 3f19b215 3eb4a32d 3f51de53 3f6f1223 3f6f1223 3f8d7936 -> 3f17f9d2 3eaf112e 3f530d22", + "3f400000 3f85f6fe 3f95089b 3f306773 bdf7ba95 3f252805 bdf7ba95 -> 3f800000 3f800000 00000000", + "40000000 3f519a78 3f93fdd1 3f93fdd1 be139b45 be139b45 3ed00d6e -> 00000000 00000000 00000000", + "00000000 3f08d116 3f08d116 3f4c97dc 3f393518 3f05b925 3f7cf630 -> 3f08d116 3f08d116 3f4c97dc", + "3f000000 3e7a1cfc 3c350473 3c350473 3f0c674c 3e237fa6 3eee33a4 -> 3cc38040 00000000 00000000", + "3f800000 3f688ea4 3ee2d99d 3ee2d99d 3f30226b 3f6f1d79 3f6680db -> 3f5ded6a 3eceb6e6 3ec34f0a", + "3fc00000 be6936e8 be6936e8 3f62cea7 be1a8604 3e2e2eb4 3f51b2b4 -> 00000000 00000000 3f57f044", + "bf000000 3ed1c5f5 be6d125b 3f9bda9e 3f99d725 3e9d6e13 3f188d9e -> 3eafd77c 3dae8e28 3f800000", + "3e800000 be75bdc8 3f57c055 3ec30ab9 3dcccccd 3dcccccd 3dcccccd -> 00000000 3f4c10f2 3e4e0b24", + "3f400000 3f732d54 3f9aa424 3f9aa424 be640dce 3ea9780f 3f8d880f -> 3ecae546 3f800000 3f800000", + "40000000 3e64013c 3e3f5636 3eaf3ebf 3f73a4eb 3f899a41 3f899a41 -> 3e0ef54c 3e95fc2e 3edb2e0a", + "00000000 3f9b6241 be24e1f8 be24e1f8 3ec41013 3ed6ab14 bc1d296b -> 3f800000 00000000 00000000", + "3f000000 3f1445dc 3f57207f 3f57207f 3f400000 3f000000 3f400000 -> 3f04e220 3f4980a9 3f5149b6", + "3f800000 3f8257d3 3f8257d3 3f8beac6 3f400000 3f800000 3f800000 -> 3f800000 3f800000 3f800000", + "3fc00000 3e2815b3 3f70858a 3f3e66d8 3f21f51a 3f8888e7 3f21f51a -> 00000000 3f71edd1 3edbc868", + "bf000000 3f1001d3 3f1001d3 3ea70df2 00000000 3e800000 3f400000 -> 3f35568c 3f2e8cf6 3ecd61ba", + "3e800000 3e4aeae9 3eba6226 3e4aeae9 00000000 3f000000 3f800000 -> 00000000 3e8bdde2 3e4aeae8", + "3f400000 3f5ca09e 3f5ca09e 3f74fc65 3f89448a 3f7a3bb6 3f754076 -> 3f5e7306 3f5c0500 3f74a0b9", + "40000000 3ef9d54d 3e15c07e 3e99ed6c 3f921b18 bc0e285e bc0e285e -> 3f19d2a8 00000000 00000000", + "00000000 3ecd15f8 3f96dd5f 3ecd15f8 3d82c372 3f806f15 3f4481b7 -> 3ecd15f8 3f800000 3ecd15f8", + "3f000000 3e112853 3f4abd9b 3ebb3dff 3e198ae4 3e198ae4 bd2755da -> 00000000 3f235eda 00000000", + "3f800000 3f3a3db3 3eb2c033 3e9eb41d 3f8df4da 3eb88363 3f8df4da -> 3f411970 00000000 3ec1701a", + "3fc00000 3ef2b404 3f4bcec0 3f4bcec0 3e8bd1da be3d23af 3f1bef26 -> 00000000 00000000 3f01d53c", + "bf000000 3f723779 be4b64b3 bd93fc12 3f800000 3f800000 3f000000 -> 3f723779 00000000 3e119b2c", + "3e800000 3da66af6 3ee0563f 3ddf9e18 3efc3946 3efb3ff0 3f2adac7 -> 00000000 3eb65e50 3ce8a700", + "3f400000 be190727 3ec24062 3e8ecbc3 3f000000 3e800000 3e800000 -> 00000000 00000000 00000000", + "40000000 3f3ac94e 3ef6b157 bdbf2626 bd87c478 3f2f42b7 3f884852 -> 00000000 00000000 3d02d940", + "00000000 3eae2f40 3cbb5d3c 3eae2f40 3f430242 3f430242 3f753c4d -> 3eae2f40 3cbb5d40 3eae2f40", + "3f000000 3e89a9ad 3f95f99c 3e89a9ad 3f5b37f9 be1db26c 3e10e0a3 -> 3e596108 3f800000 00000000", + "3f800000 3f48a080 3f48a080 3f9028f9 3f8e5b5e 3f868c46 3f868c46 -> 3f4e361f 3f4b525e 3f800000", + "3fc00000 3f67a22e 3e6181f8 3f99a82d 3f46a6aa 3f46a6aa 3f0213be -> 3f5b4d48 00000000 3f800000", + "bf000000 3ec7e569 3f21a66a 3eb059da 3f000000 3f400000 3f000000 -> 3f032890 3f2c2226 3ef37b14", + "3e800000 3efeda30 3e02a005 3efeda30 3ef11086 be02dab2 3f8ace94 -> 3ed7a59e 00000000 3f02157a", + "3f400000 3f2ec098 3f9f9103 3f2ec098 3f400000 3f800000 3f000000 -> 3f1c00bb 3f800000 3efc01e6", + "40000000 3f9fbbcd 3e631a5b 3f755ea5 bdabcbb7 3f2b237d bdabcbb7 -> 00000000 00000000 00000000", + "00000000 3f39a631 3f607a67 3f39a631 3f6e666e 3f8c92d1 3f6e666e -> 3f39a631 3f607a67 3f39a631", + "3f000000 3f2bbfd9 3f2bbfd9 3f1f8b78 3f1b11fa 3ed0b5d7 3f1b11fa -> 3f17103c 3f084b87 3f07dcba", + "3f800000 3d5fd49e 3d5fd49e 3e3bedbb 3d636c6c 3d636c6c 3f3a1f4c -> 00000000 00000000 00000000", + "3fc00000 3f94323f 3f056c73 3ec9f479 3e99ff4c 3e5f50bb 3e99ff4c -> 00000000 00000000 00000000", + "bf000000 3f4b168a 3f006032 3f4b168a 3e8715ad 3ea01932 3f99b80d -> 3f5952f0 3f21045c 3f452db7", + "3e800000 3eccc2a1 3f09cb44 3eccc2a1 3f763121 3f763121 3f7ad363 -> 3ec9c9fa 3f08a69e 3ecb332c", + "3f400000 be48bf5d 3e829315 be48bf5d be5c9c4e 3f14c607 be0abc1d -> 00000000 00000000 00000000", + "40000000 3ea8f601 3f2bf506 3f2bf506 bd33f0e1 3f68ca9d 3f0e7802 -> 00000000 3f195806 00000000", + "00000000 3e41af36 3f93af50 3f8bf8e9 3f101337 3edd6a24 3edd6a24 -> 3e41af38 3f800000 3f800000", + "3f000000 3f89b0d5 3f68150c 3f1df21b 3f000000 3f000000 3f000000 -> 3f800000 3f601c10 3efa859e", + "3f800000 3e2f3fcc 3f92ba60 3eb4fc7c 3f97a4b8 3f97a4b8 3ec7fe70 -> 3e99ca7c 3f800000 00000000", + "3fc00000 3e972a6a 3e3c27b0 3e972a6a 3f438fbb 3f583442 3f2b4b51 -> 00000000 00000000 00000000", + "bf000000 3f5b8f26 3e5fe3f6 3f911df4 3cb0d2aa 3d8951b9 3ec68ba5 -> 3f6787b2 3eef3320 3f800000", + "3e800000 3d4d6a69 3f7b318f 3f7b318f 00000000 00000000 3f400000 -> 00000000 3f799769 3f7adf87", + "3f400000 3eae1b92 3f939f91 3f35f6a0 3e7c694f 3f379b28 3f379b28 -> 00000000 3f800000 3f2208b3", + "40000000 3e95677b 3f8b765e 3f4800e3 3f90d8f4 3efea619 bdfc8d44 -> 3ee0f6ce 00000000 00000000", + "00000000 3f79185d 3f79185d 3ef823e0 3f0f650b 3f70f94f 3f0f650b -> 3f79185d 3f79185d 3ef823e0", + "3f000000 3f95fc19 3f95fc19 3f837473 00000000 3f800000 3f000000 -> 3f800000 3f800000 3f800000", + "3f800000 3f79d655 3dd487ae 3f79d655 3f5efaf6 3e1bcea3 3f201909 -> 3f78ecb5 00000000 3f762546", + "3fc00000 3bc7f94c 3ef430c7 3f154eea 3f261d1c 3f71d98e 3eb70cc8 -> 00000000 3edbfa8c 00000000", + "bf000000 3f8160d0 3f10cce8 3f8160d0 3ea16d7e 3f5c94ce 3e143c62 -> 3f800000 3f17fec4 3f800000", + "3e800000 3f85c29a 3e0741ff 3f85c29a 3f29ba2a 3ea2c9aa 3f29ba2a -> 3f800000 00000000 3f800000", + "3f400000 3efcba4d 3f893e6b 3f71bf53 3f26a0c2 3f2cf0ea 3f9cb671 -> 3ea0c330 3f800000 3f73ccc5", + "40000000 be5bd70b 3f3105b4 3f03384a 3e8cde8b bc94e3ab 3e8cde8b -> 00000000 00000000 00000000", + "00000000 be05d88d bd9515c8 bd9515c8 3f95e072 3e876058 3e876058 -> 00000000 00000000 00000000", + "3f000000 bcfb9f06 3e7151b2 3eb162b4 bd5f4214 3e916b58 3f68e303 -> 00000000 00000000 3ea190e0", + "3f800000 3f2fd322 3f2b3e05 3f2fd322 3f511bc8 3f511bc8 bd84f189 -> 3f1dd88a 3f183c5c 00000000", + "3fc00000 3e67593f 3e9ccc35 3e9ccc35 3f800000 00000000 3e800000 -> 3e675940 00000000 00000000", + "bf000000 3f872c4a 3f15624f 3ee8dd06 3d8a6482 3dd5871a 3d397d83 -> 3f800000 3f365d10 3f218744", + "3e800000 3f8249fc 3f67bfc9 3f67bfc9 3f8112ad 3f6220d8 3f6220d8 -> 3f800000 3f67053d 3f67053d", + "3f400000 be6f2f04 3f510aee 3f91ed44 3f8daf47 3f0a57f9 3f8daf47 -> 00000000 3f3857ba 3f800000", + "40000000 3eb71a47 be4f7b66 be4f7b66 3eb5f30e 3f91db26 3f91db26 -> 00000000 3d749cb0 3d749cb0", + "00000000 bc4c15bd 3f8437ea bc4c15bd 3f6ef7de be27c128 bdb622db -> 00000000 3f800000 00000000", + "3f000000 3f7a2ad5 3f9149c9 3f7a2ad5 3f90d3bc 3e69ed49 3e69ed49 -> 3f7a86ed 3f800000 3f768102", + "3f800000 3f8b335b 3f4039d1 bc1d3485 00000000 00000000 00000000 -> 00000000 00000000 00000000", + "3fc00000 3d5c1bb0 be07686e 3d1cae8c 3e9fd2c8 3f4ab301 3f3fc24c -> 00000000 00000000 00000000", + "bf000000 3dc12b33 3f86a122 3dc12b33 3d11c0c8 3d11c0c8 3ebbaf53 -> 3ec7268e 3f800000 3e9fd45c", + "3e800000 3f04fd2b 3f04fd2b 3da8a226 3e796355 3edfd2bb 3f2cdf20 -> 3ed099ca 3ee1b0e2 3aa58a00", + "3f400000 3f839ab8 3f4c7faf 3e46098c 3f94f05f 3f51b89d 3ec75447 -> 3f800000 3f446bbe 00000000", + "40000000 3f0a5337 bd9a3970 bd9a3970 3f41faca 3f816766 3f41faca -> 3dddb130 00000000 00000000", + "00000000 3d18978a 3eccdef7 3e70434c 00000000 3f000000 3e800000 -> 3d189790 3eccdef8 3e70434c", + "3f000000 be0f6788 be0f6788 3d222b68 3ec76c4f be0fa6da 3ec76c4f -> 00000000 00000000 00000000", + "3f800000 3f9de811 3f9de811 3e8afc87 3d18282c 3e49b0ea 3d905d36 -> 3f800000 3f800000 00000000", + "3fc00000 3eebc4e5 bd289d54 3f0c4348 3f800000 3e800000 3f400000 -> 3eebc4e4 00000000 3e8da41a", + "bf000000 3f9384de 3e6a1004 3e6a1004 3f22cee8 3f147730 3ec8602c -> 3f800000 3eb99650 3ed12f30", + "3e800000 be5c0104 3f61b9b0 3f61b9b0 3e800000 3f800000 00000000 -> 00000000 3f61b9b0 3f57a240", + "3f400000 3f2a43b0 3e37c7fe 3f53879b 3d0ba28d 3e8b43a7 3f89be37 -> 00000000 00000000 3f55ee6c", + "40000000 3f227eab be2dab7c 3f227eab 3d319b65 3f834bc9 3ebc62d2 -> 00000000 00000000 00000000", + "00000000 3ee2c45a be4a5b18 3ee2c45a 3f25a567 3dced87b 3f8b649f -> 3ee2c45a 00000000 3ee2c45a", + "3f000000 3ea22640 3f4e898c be3f37f6 3f8159e6 3f8159e6 3f9b6b82 -> 3ea3fc7a 3f4ecc07 00000000", + "3f800000 bdd26e9a 3e5a654e 3f3250b2 be13920b 3d48556d be13920b -> 00000000 00000000 00000000", + "3fc00000 3db821b7 3ef0361c 3d5c84a7 3f5053a2 bceb4c61 bceb4c61 -> 00000000 00000000 00000000", + "bf000000 3f75d9e9 bd5bba86 3f475a7b be74c2b0 be5bef07 be5bef07 -> 3f79bbc2 3eb0623c 3f5cc238", + "3e800000 3f47711d 3f47711d 3ecc7413 3f400000 3f400000 3f000000 -> 3f43abdb 3f43abdb 3ea084aa", + "3f400000 3de916fe 3e7e6c58 3e5b7f34 3eccebb6 3eccebb6 3e62b5db -> 00000000 00000000 00000000", + "40000000 3e900c16 3e900c16 3eaaa6f6 3f240e5c 3f94122b 3f94122b -> 00000000 3ee7e444 3efc2520", + "00000000 3f18e2c4 3f9059ce 3f9626e3 3e7aab3b 3f7e9775 3e7aab3b -> 3f18e2c4 3f800000 3f800000", + "3f000000 bde8b15b bde8b15b 3e8ce83c 3dd6476e 3dd6476e 3f8b7151 -> 00000000 00000000 3e9cc8d6", + "3f800000 3ee33d2b 3f39c78a be09595d 3f000000 3e800000 3f400000 -> 00000000 00000000 00000000", + "3fc00000 3e05e571 3e05e571 3f66ef50 3e265488 3f973b90 3f9af995 -> 00000000 3ea22ff6 3f6cf484", + "bf000000 3f933207 3f633fd5 3f933207 3f0eaebc 3f9368da 3f60a436 -> 3f800000 3f60e403 3f800000", + "3e800000 3e4ca261 baa76f0c 3e1c1e5a 3eb8917d 3eb8917d bd6d523d -> 3d42d260 00000000 00000000", + "3f400000 3f45a279 3ef69cd9 3f2b6466 3e6aacda 3ec0a68a 3eaeb96c -> 3eeb4f24 3cd57860 3eb18b6a", + "40000000 3f8929c0 3f3ecdd9 3f56bbd2 3f9a68fc 3f58dad6 3f25f0f6 -> 3f800000 3f2214f8 3ee99098", + "00000000 3e956a21 3f1dbc1e 3f80f448 3f1bf765 3f1bf765 3f1c32a1 -> 3e956a20 3f1dbc1e 3f800000", + "3f000000 3f1a8497 bd7473fa 3e623a73 3efa2858 3f579eb5 3f579eb5 -> 3eef4e82 00000000 3e1dec54", + "3f800000 be694055 3f8dc514 3f9ff4b5 3f57cd53 3ec255c9 3e561235 -> 00000000 3f800000 3f800000", + "3fc00000 3f6b5648 3f90d5d6 3f90d5d6 be1c0102 3f549a53 3f4b8d81 -> 00000000 3f800000 3f800000", + "bf000000 3e78dd75 3ee1bcf3 3ebfa407 3f427141 3f9e0620 3f427141 -> 3ea60750 3ebbb454 3ee2060c", + "3e800000 3f848026 3e74b805 3e74b805 3f4739f6 3f7926ca 3edf42af -> 3f800000 3e6f78cc 3de9a348", + "3f400000 3f3522b5 3e2f87b0 3f8009fe 3ebff259 3f15062f 3eb41f75 -> 3ee61db4 00000000 3f800000", + "40000000 3f502912 3eb1dea5 3eb1dea5 be26484f 3f250887 3f3d3a82 -> 00000000 00000000 00000000", + "00000000 3f188345 3e95e17d 3f5f3b3c 3f09166e 3d3e3ee5 3cd17180 -> 3f188345 3e95e17c 3f5f3b3c", + "3f000000 3f1ed44b bd27e6b8 bd27e6b8 3f5e8ec8 3f96f076 bd46ab30 -> 3f1809f2 3d36c070 00000000", + "3f800000 3f27590a 3dee364e 3dee364e 3f000000 3f800000 3f400000 -> 3e9d6428 3dee3650 00000000", + "3fc00000 3f09af93 3f62a092 3f09af93 3e87caea be7d5ae7 be7d5ae7 -> 00000000 00000000 00000000", + "bf000000 3f6c896d 3f8504fc 3ef12f94 3eebebdf 3e740445 3e740445 -> 3f70ab80 3f800000 3f1df07e", + "3e800000 3f503b9d 3eaebecd 3d58ecea 00000000 3e800000 3f000000 -> 3f404f7c 3e41d5a8 00000000", + "3f400000 3ef92c3c 3ef92c3c 3f63ec8d bd0b1f4d bd0b1f4d 3f417e7c -> 00000000 00000000 3f5da14f", + "40000000 3f8413a3 3f8413a3 bd278009 3f53d007 3f56d3d1 be6e53ef -> 3f800000 3f800000 00000000", + "00000000 3f9b6af2 3de5a544 3f55c3ac 3f335bfe 3f335bfe 3f8facbb -> 3f800000 3de5a540 3f55c3ac", + "3f000000 3dc91cba 3f097774 3f4dccba be40dab3 3ee70090 be40dab3 -> 00000000 3eb946c0 3f044d94", + "3f800000 3e5b4279 3f65740d 3e5b4279 3d55a0ad 3f6ad4fb 3d55a0ad -> 00000000 3f630f75 00000000", + "3fc00000 3f2cc6a5 3f2cc6a5 3f0ac3c1 3f93128d 3f93128d 3f8c1bd1 -> 3f3bfaa1 3f3bfaa1 3f19553c", + "bf000000 3ece514e 3eddd50b 3e4e0e19 3d310247 3ede406d 3f7ff4ab -> 3f189ddb 3f0eea1c 3e4e2030", + "3e800000 3e9f9032 3e60d34d 3f5bd4f8 3f3eb529 3ba415b6 3f8b531e -> 3e878f8c 00000000 3f5c9d55", + "3f400000 3ed5a032 3e211c87 3f619079 be506971 3e29c930 bce5e5e8 -> 00000000 00000000 3ef62184", + "40000000 3ddfa7e7 3d84028d 3e61130d 3e6d3962 3f9d0469 3e6d3962 -> 00000000 3eb66daa 00000000", + "00000000 be7327f9 3f929246 be7327f9 be188779 3f6d6ca7 3f8c3ced -> 00000000 3f800000 00000000", + "3f000000 3ef10e83 3f4fce36 3ef10e83 3f410ff3 3e974fac 3e974fac -> 3ecb1542 3f35994a 3e3b73a4", + "3f800000 3f01607c 3eb1a3f6 3f3e77c9 3eeadb2f 3eeadb2f 3f3db0ab -> 00000000 00000000 3f278f54", + "3fc00000 be143f9a 3f786304 3f786304 3b6d8de8 3b6d8de8 3ca9f5f2 -> 00000000 00000000 00000000", + "bf000000 3f0df154 3cb949cc 3f8e978a 3f3e84e5 3f30bcf6 3f30bcf6 -> 3f1ae02e 3e1d5430 3f800000", + "3e800000 3ee2827f 3e00221d 3f859d00 3f9228c6 3f9228c6 3f6f8148 -> 3eec49de 3e1ed1a8 3f800000", + "3f400000 3ebee1da 3f1e8ea8 3f1e8ea8 bdcd3294 3f93c7dd 3f3eeeae -> 00000000 3f28ad98 3f079b63", + "40000000 3f325eb2 3f101bee 3f325eb2 3ea99741 3e9e30bd 3edf1f83 -> 00000000 00000000 00000000", + "00000000 3f55e15c 3f55e15c 3f755a48 be0900cd 3e940c25 3f5dc7db -> 3f55e15c 3f55e15c 3f755a48", + "3f000000 3f7d7e85 3f7288e7 3f8b7d24 3f02bafb be0a7ad7 3f130c7e -> 3f7caebb 3f60dbac 3f800000", + "3f800000 3f1cad5e 3de70ee4 3f863b48 3f400000 3e800000 3e800000 -> 3ef723a6 00000000 3f800000", + "3fc00000 3d66dbde 3f2069da be732b87 be10ac88 3f738673 bc5431b9 -> 00000000 3f18e02a 00000000", + "bf000000 3eaa0665 3e5d31fe 3f8413aa 3f4a32e6 3f98be00 3f98be00 -> 3eca8af8 3e074db4 3f800000", + "3e800000 3f73d948 3f73d948 3f84798c 3eb94906 3ba33092 3ef11cdb -> 3f718ad7 3f6fd340 3f800000", + "3f400000 3e88a1de 3e88a1de bc23900f 3e800000 3f800000 3f800000 -> 00000000 3e88a1de 00000000", + "40000000 3e6b3662 3f3d965c 3df85173 3f2a9cdf 3f987646 3f987646 -> 00000000 3f4ff3c0 3eba7e7a", + "00000000 3f298c0c 3d219851 3f43e43a bc069976 3f6adfa3 3e5b6b05 -> 3f298c0c 3d219850 3f43e43a", + "3f000000 be42228d 3ef6de1a 3ef6de1a 3ea35a5b 3ea35a5b 3f6def1c -> 00000000 3e5bfd30 3eed2b92", + "3f800000 3f649799 3f0bf4f4 3f58ab21 bce45398 3e17e5a1 3e17e5a1 -> 00000000 00000000 00000000", + "3fc00000 3f80c0f7 3f1f1272 3f344570 be60666b 3f96912a 3f96912a -> 00000000 3f335820 3f441c14", + "bf000000 3f45d3ae 3f70a4d0 3f45d3ae 3f9d6f4a 3f9d6f4a 3f61b975 -> 3f3e44ea 3f6ea615 3f491320", + "3e800000 bd9b39b5 3f17d0ed 3ebdb139 bdc4ac32 bdc4ac32 3f9e35b7 -> 00000000 3ee0fd2a 3ecfa666", + "3f400000 3f76f422 3e9041cc 3e9041cc 3f9e6bda bc8eb240 3d99a791 -> 3f78527c 00000000 00000000", + "40000000 3f0b765e 3f9628d8 3f7db00b 3e9d7374 3f5abb01 3e1f212d -> 00000000 3f800000 00000000", + "00000000 3f55790a 3ef2d32f be391d79 3f334ea3 be2e4007 3e728344 -> 3f55790a 3ef2d330 00000000", + "3f000000 3ec01c1c 3f446a72 3f212cfd 3edef1f0 3f0c3972 3edef1f0 -> 3e0497d4 3f330167 3ef7c330", + "3f800000 3e533244 3f1e057e 3f823037 3f8d7ab2 bdd7c69a bca5de57 -> 3e905152 00000000 00000000", + "3fc00000 be6238f4 be2e0004 be2e279b 3f04d7ef bd2261e3 bdb0966f -> 00000000 00000000 00000000", + "bf000000 3f158f05 3ef43a3c bcdec37a 3f800000 3f800000 3e800000 -> 3f158f05 3ef43a3c 3e8182c0", + "3e800000 3e2a5574 3f8ced23 3f8ced23 00000000 3f800000 3f800000 -> 00000000 3f800000 3f800000", + "3f400000 3f507a08 3f43484d 3f43484d 3ee4c90c 3e2c44b0 3f839893 -> 3f2ec843 3ebd2eca 3f44890d", + "40000000 3f9c9b22 3e9ea9b2 3f7d88d3 3c83f86b 3f47b480 3f47b480 -> 00000000 00000000 3f7b994b", + "00000000 3f83bef5 3e424bfb bd8b2e1d 3f4b45ed 3ee6674b 3ee6674b -> 3f800000 3e424bfc 00000000", + "3f000000 3f33900b 3f33900b 3f21c117 3e233f6d 3e233f6d 3ebfb538 -> 3ef84aa2 3ef84aa2 3eedb77e", + "3f800000 be5b8843 3f76ddc1 3f76ddc1 3f7d6531 3f3341c4 3e075d49 -> 00000000 3f72f4b5 3f3ae7b7", + "3fc00000 3f9bf944 3ed05fe2 3eb8ea9b 3f819e32 3f482a80 3ede9305 -> 3f800000 3df2fb90 00000000", + "bf000000 3f4a1d51 3f3e8d68 3eb2fc50 3f9ced75 3ed77eb8 3f9ced75 -> 3f433ff6 3f4d3f78 3e888fcc", + "3e800000 3f84303a 3ed30c53 3f0719b4 3e839b61 bda8e8dd 3f2d3232 -> 3f800000 3e46c65c 3ef8ed8e", + "3f400000 3f843475 3f843475 3e579ecc 3f1b99aa 3f1b99aa 3f17a07e -> 3f800000 3f800000 00000000", + "40000000 3c97e5ab 3f47e119 bba3318c 3f96fea7 3f96fea7 3e66523f -> 3e8e5156 3f56b69b 00000000", + "00000000 bdc48a5c 3e35980c bd83a04b 3f9acb9a bd29ccec 3ee955f3 -> 00000000 3e35980c 00000000", + "3f000000 3f10eb86 3f6e290a 3f6e290a bd9ea840 3f34494a 3f34494a -> 3d72f270 3f6b107c 3f6b107c", + "3f800000 3ac9a7fa bdd34388 3ea4ddd9 3f800000 3f800000 3f400000 -> 3ac9a800 00000000 3dc49f28", + "3fc00000 3f788bff 3f855d4d 3f855d4d 3d931dfc 3f9662e0 3f86073a -> 00000000 3f800000 3f800000", + "bf000000 be5ec01f 3ea46b08 3f95662d 3f22c213 3f71efd2 3ea66b34 -> 00000000 3eadb5c2 3f800000", + "3e800000 3eb45c91 be70e80d bddb1c57 3f000000 3f000000 00000000 -> 3e84fc12 00000000 00000000", + "3f400000 3f8e4cc3 3f992ae2 3f8e4cc3 3e17723d 3d9fb580 3e72c026 -> 3f800000 3f800000 3f800000", + "40000000 3f504633 3d006230 3e8ecd18 3ee7ac39 3f463515 3f463515 -> 00000000 00000000 00000000", + "00000000 3f5485fb 3d8d0661 3f9e2456 3d3e867c 3d3e867c 3e6a4bb5 -> 3f5485fb 3d8d0660 3f800000", + "3f000000 3ee5bfae 3ef72665 bdee3564 3f71412e 3f5942fe 3d94cb0c -> 3edd6104 3ee17890 00000000", + "3f800000 3f02abbc 3edb928c 3ecf5f77 3f207ddb 3f207ddb 3f38e97d -> 3e6059b4 3db63258 3e3485e8", + "3fc00000 3f1a958b 3f778df1 be7fc4a4 3f1d4e33 3f1d4e33 be0ab2e9 -> 3d783870 3f6bf923 00000000", + "bf000000 3ea8072b 3f2ba2a6 3ea8072b 3f1d5148 bd86fedb 3edf0136 -> 3edf9c9c 3f48f752 3ef3bcd0", + "3e800000 be6205d7 be6205d7 3f884846 3f8a84ca be7e7cdd 3e0c0cb3 -> 00000000 00000000 3f800000", + "3f400000 3f5871f9 3f882152 3f882152 3f21a790 3eb043e3 bdd6c106 -> 3f4955fe 3f800000 3f800000", + "40000000 3f8e5760 3f36f60d 3e6a6f37 3f2f9df1 3f3a5f21 3e509920 -> 3f800000 3ebfac82 00000000", + "00000000 3f1c8b17 3f917cde 3f1a4775 3de0749c 3ea00663 3e965621 -> 3f1c8b17 3f800000 3f1a4775", + "3f000000 3f9f650f 3f18f093 bc7faa87 3f800000 3f000000 3f400000 -> 3f800000 3eed2c32 00000000", + "3f800000 3f506549 3f9bc4e0 3ec9709a 3f7b95bb 3f8b2b6a 3f5dc6b4 -> 3f4f8f6b 3f800000 3e9983e2", + "3fc00000 3eec2c7f 3edb51aa 3f866424 3f23064a 3f8336a5 3f23064a -> 00000000 3ee5f0d2 3f800000", + "bf000000 3e5af07c 3e5af07c be084766 bde884fb 3f4a1c6e 3e055cb7 -> 3efd6e96 3e93cd5a 3e57606c", + "3e800000 bbee3d13 3f22aa4b 3eac62aa 3f800000 3f000000 3e800000 -> 00000000 3f1554e8 3e3c0690", + "3f400000 3dbd70d3 3efe29e8 3f41f412 3ebcbee5 3e9932d1 3e9932d1 -> 00000000 00000000 3efa6d62", + "40000000 3ee1ae9b baa10810 3c92051b 3f2e5a2f 3f9a3f87 3f284768 -> 00000000 3e947756 00000000", + "00000000 3e9ac73d 3e9ac73d 3f7d9663 3f9dd69b 3f2f2bc1 3f2f2bc1 -> 3e9ac73c 3e9ac73c 3f7d9663", + "3f000000 3ed294e8 3f2664ae 3f8c8668 3e4cd8b8 3f4aee0d 3f6506ec -> 3c9a7b80 3f1c0800 3f800000", + "3f800000 be3cb307 3ebbc2f6 3f8d81d6 3f1e13fe 3f54dae2 3ef816dc -> 00000000 3e74143c 3f800000", + "3fc00000 3f2bcce7 bdbcef28 3eddac96 3f356c55 3f0aa2ea 3d966301 -> 3ed4e750 00000000 00000000", + "bf000000 be42b0a9 3efe4d4f be42b0a9 3f2d4bf8 3f293511 3f2d4bf8 -> 00000000 3f11d3c2 00000000", + "3e800000 3ed12c0a 3f59f333 3ed12c0a be42df9d 3d919ff0 3ec72d7d -> 3e21c328 3f4e70f9 3e9a93d2", + "3f400000 3f3a5264 3f3a5264 3ee4b094 3f400000 3f800000 3f400000 -> 3f2a3e05 3f3a5264 3ea34f7c", + "40000000 3e692103 3e692103 3ef76dbe 3ec51eed bd62663e bd62663e -> 00000000 00000000 00000000", + "00000000 3f703516 3f703516 3f9f9ce6 3f2df127 be142a03 3f2df127 -> 3f703516 3f703516 3f800000", + "3f000000 3df7e24d 3d484462 3d74823b 3e86aeda 3e86aeda 3eefaaa3 -> 00000000 00000000 00000000", + "3f800000 3ec497c5 3ec497c5 3f5923f6 3f6f6ebe 3ef57efd 3d54b85b -> 3eaec4b6 00000000 00000000", + "3fc00000 3ebd305e 3d4a67c2 3ce4ad9c 3f0ccaa1 3f6dec92 3dced084 -> 00000000 00000000 00000000", + "bf000000 3f39b2e2 3f975011 3ea93305 3edea16c 3d22af30 3d22af30 -> 3f49301e 3f800000 3f0c3332", + "3e800000 3d9e2964 3f4a9485 3d9e2964 3f8025e9 be52908a 3f17bbb9 -> 3d9eb540 3f33883e 00000000", + "3f400000 3e502082 3f6b3dd1 3f34ecf2 3f2aaaab 3f2aaaab 3f2aaaab -> 00000000 3f64526c 3f1be698", + "40000000 3dccff26 be34de72 be34de72 3e800000 3f800000 3e800000 -> 00000000 00000000 00000000", + "00000000 bd1ec2a4 bc84479d 3f15a725 3f5e8ff1 bd2e0d62 3e5f9829 -> 00000000 00000000 3f15a725", + "3f000000 bdce64d7 3f2083de bdce64d7 bd3e0a7d bd3e0a7d 3ef30798 -> 00000000 3e5ef478 00000000", + "3f800000 bbee35af 3e752b28 3f5f5281 3f400000 3f400000 3f800000 -> 00000000 00000000 3f5f5281", + "3fc00000 3ee70669 3f8a4728 3ee70669 3e800000 3e800000 3e800000 -> 00000000 00000000 00000000", + "bf000000 be5cb229 3f42b788 3f02c6ad 3ec6036d 3f9d2d16 3f8451f1 -> 3d8ecbd0 3f3ad58a 3f00a06a", + "3e800000 be324e11 3f5b4dd8 3f5ab240 3f929366 3e52aa7d 3f929366 -> 00000000 3f52364a 3f5c0098", + "3f400000 3dd2db7d 3f9666d1 3dd2db7d 3f14f5e2 3e25e667 3f2cd69d -> 00000000 3f800000 00000000", + "40000000 be614061 3f21a46f 3f8dcc86 bcc4f580 3f3e500b 3f4d8f6b -> 00000000 3e78b2b4 3f800000", + "00000000 3f3e02ec 3f82b21e 3ef7b108 3f7a06cf 3f7a06cf 3e2d3af7 -> 3f3e02ec 3f800000 3ef7b108", + "3f000000 3f9e12d3 3f90cb6b 3f30e949 bd91bcf6 3f399765 3f265370 -> 3f800000 3f800000 3f201e39", + "3f800000 3e37d5de be65d9ca 3f95a449 3ef06fb4 3f2f4e96 3f2f4e96 -> 00000000 00000000 3f800000", + "3fc00000 3ed51731 3f85f112 3ea7a5c9 3f1f21c3 3f4c9238 3f4c9238 -> 00000000 3f800000 3d18fdc0", + "bf000000 3f703220 3f61b33f 3da47d89 3e3e1e1f 3e3e1e1f 3f15701c -> 3f74c4d0 3f6a77b0 3e747c24", + "3e800000 3f2ac43b bda6a23a 3eec63e9 3f800000 3f400000 3f000000 -> 3f2ac43b 00000000 3ec50476", + "3f400000 3dd81e33 3f946a99 3dd81e33 3e5da6dd 3f46e998 3f46e998 -> 00000000 3f800000 00000000", + "40000000 3e9d0508 3e5e2a73 3e9d0508 3f94f7b9 3f44e4a2 3f44e4a2 -> 3ef49e74 00000000 00000000", + "00000000 bdc1693e 3d9461f0 3d9461f0 3f9cf92c 3f9cf92c be4e402e -> 00000000 3d9461f0 3d9461f0", + "3f000000 3f93f3c7 3f93f3c7 3f9144f9 3f973afb 3f655c05 3d908514 -> 3f800000 3f800000 3f800000", + "3f800000 be602a85 3ec1a274 3f968473 3f8d42d9 be4a5224 3f8d42d9 -> 00000000 00000000 3f800000", + "3fc00000 3f282e97 3f3006c9 3f3006c9 3ec434fc 3ec434fc 3f73a32b -> 00000000 00000000 3f29c7f2", + "bf000000 3f58b9f7 3f656efb 3f745751 3e965037 3f96cfda 3f72fb42 -> 3f62fa3b 3f62d5aa 3f74a153", + "3e800000 bd37833d 3f5f6929 bd37833d bd1759cd bc9cda83 bd1759cd -> 00000000 3f5444c3 00000000", + "3f400000 3f6841f5 3f88b649 3f6841f5 3e68b7ce 3e68b7ce 3e8d0ddd -> 3f4787e1 3f800000 3f4c0120", + "40000000 3f0085e8 3f4136fa 3f66db33 3f47fe40 3f9595f2 3f2330be -> 3dead298 3f510cc8 3f248b11", + "00000000 be24b315 3f77fb26 3e38f527 3f14c50b 3f70acbe 3f582a73 -> 00000000 3f77fb26 3e38f528", + "3f000000 3f5018b2 3f0e56ce 3f0e56ce be5a692a 3f19b03b 3e3504a4 -> 3f0637c1 3ee3e8b6 3e7b4e54", + "3f800000 3f726cb5 3f726cb5 3f19d696 3ee607a3 3f09c1a6 3ee607a3 -> 3f61c8b3 3f66c5ae 3de4de38", + "3fc00000 3e9341ab bd4ae358 3f56f127 3e977a5c bdb56c50 bdb56c50 -> 00000000 00000000 00000000", + "bf000000 be41211b be41211b bcbc1f5b 3f259160 be0c27f8 3f94b6ff -> 00000000 3e77fc38 00000000", + "3e800000 3f3b33f1 3f181600 3f181600 3f936cb4 3f50a23e 3f936cb4 -> 3f3db7b2 3f130bd1 3f1be25b", + "3f400000 3ef6a9d2 3ea6be5f be03c138 3e28c4cf 3cd52209 3f9762cc -> 00000000 00000000 3bf0ee80", + "40000000 3f09050c 3daa59ea 3f8008db 3f63737a 3deaf0c6 3d4e1537 -> 3ecdbab2 00000000 00000000", + "00000000 3ba405b4 be3b6ab2 3e2948e0 3e800000 3f800000 3f400000 -> 3ba40580 00000000 3e2948e0", + "3f000000 3cf1e77a 3f18bcf2 3f18bcf2 3e9049e4 3e0d2a03 3e0d2a03 -> 00000000 3e94fe9c 3e94fe9c", + "3f800000 bd5cc2dd bd5cc2dd 3f75ad8f 3e398069 3e398069 3ec72788 -> 00000000 00000000 3f6576a1", + "3fc00000 3f22a556 3eb8f8f2 3f53dbea bc8b5ec0 3da12dfd 3d34a4e6 -> 00000000 00000000 00000000", + "bf000000 3f7b484d 3f1f3ef3 3e9eadd2 3f921e03 3f921e03 bd3fbfbe -> 3f7aec52 3f17e088 3f0c0930", + "3e800000 3f13f017 3f492db1 3e69432e 3dbf4fef 3d8082a2 3ecc997e -> 3ee88946 3f3866f7 3dbb3a10", + "3f400000 3f233ed4 bd874ceb 3e37a47a 3f400000 3e800000 00000000 -> 3f0dd72c 00000000 00000000", + "40000000 3f8f00c8 3da86477 3f0c9be9 3f27468f 3f733572 3f839230 -> 3f800000 00000000 3f12b511", + "00000000 3ee9ece2 3f1861fc 3e5c14b7 3ee2c218 3f973166 3ee2c218 -> 3ee9ece2 3f1861fc 3e5c14b8", + "3f000000 3e56fa42 3f2f28b2 3e56fa42 3f87c8e8 3f87c8e8 3f946634 -> 3e6eda74 3f318b74 3e8957d6", + "3f800000 be4d27f0 3f875ff3 3f875ff3 3f800000 3e800000 3e800000 -> 00000000 3f800000 3f800000", + "3fc00000 be20d4ba 3dc2b622 3f02f636 3f8c6069 3e591fe6 3e591fe6 -> 00000000 00000000 00000000", + "bf000000 3eb7331a 3f74ba12 3eb0c8dd 3f9d8cbe 3f855e10 3f9d8cbe -> 3e8c4b46 3f747c44 3e850abc", + "3e800000 3f7854ca 3f40274a 3f68493f 3f283882 3f6a2d65 3f6a2d65 -> 3f779cb8 3f3ec361 3f67c50e", + "3f400000 3f3a02e6 3d8fe8c6 bd4f608e 3f000000 3f400000 00000000 -> 3f1004a3 00000000 00000000", + "40000000 3ed423a3 3ed423a3 3eaeda48 3f8f30ea 3ee75692 3f8f30ea -> 3f06d49a 00000000 3eef86e8", + "00000000 3d8a36da 3f803d2e 3f487546 3f6e5d83 bccb23ca 3ef36310 -> 3d8a36d8 3f800000 3f487546", + "3f000000 3f429eb9 3f46d447 3f429eb9 be1398e2 3f9e41c4 3f95000d -> 3ee121a4 3f4cdf40 3f4745fe", + "3f800000 3c8af2c0 3effe646 3ecf2c19 be165d01 be725240 bdcc3de4 -> 00000000 00000000 00000000", + "3fc00000 be34e1c5 bdf78b73 3f67e2cd 3e94c168 3e94c168 3ed2020e -> 00000000 00000000 3e3b2068", + "bf000000 3f7adf7c 3f7983fc 3f89ec88 be587b3b 3f7bee5e be587b3b -> 3f7cce97 3f799113 3f800000", + "3e800000 3f1fb4a5 3f1fb4a5 3e9b1d26 3f63da33 3f536761 3f63da33 -> 3f1cfbe0 3f1b522c 3e9106ca", + "3f400000 3f621b5f 3f18fd97 3f0c9eae 3ecc376c 3f44ba64 3ec9cf9a -> 3f499079 3f035828 3e322344", + "40000000 bd00f235 be0531ee 3d843459 3ed17771 3f123a1b 3ed17771 -> 00000000 00000000 00000000", + "00000000 3d34813a 3eec5547 3f6a2867 3f425d4e 3f8a8914 3f8a8914 -> 3d348140 3eec5548 3f6a2867", + "3f000000 3ef24309 3ef24309 3f5c7ae3 3f1502a9 3eae143f 3f1502a9 -> 3eab01a4 3e5acf78 3f5318ce", + "3f800000 3c254df6 3e998bb2 3f06e736 bdc38055 bcb00be6 bcb00be6 -> 00000000 00000000 00000000", + "3fc00000 3f8d05f1 3f38b058 3f38b058 3f81214d 3e9dc3d0 3f33fc9f -> 3f800000 00000000 3efed79c", + "bf000000 3e6047e4 3f361f41 3f1ec3cd 3ea2f95f 3ea2f95f bde3c6af -> 3ed5c916 3f48e6e9 3f417e6d", + "3e800000 bd0b8b4f 3f3d1ca9 3f3d1ca9 3f9cf0f6 3f9cf0f6 3f865cf7 -> 3cae2140 3f40b0ca 3f3deedc", + "3f400000 3ed08016 3e8d53f5 3efc13e9 be704f92 3f7a8e40 3eacc72a -> 00000000 3e8751e0 00000000", + "40000000 be5effda be3ca5d7 be5effda 3f4d9ebe 3df5d519 3df5d519 -> 00000000 00000000 00000000", + "00000000 bde8bcf9 3e5efe27 bde8bcf9 3f3b8253 3e7613a9 3e053b9e -> 00000000 3e5efe28 00000000", + "3f000000 3f1aaeb0 3f88a974 3f1aaeb0 3f9bfa31 3f2d7f34 3f9bfa31 -> 3f24aa04 3f800000 3f24aa04", + "3f800000 3b401093 3f5c667b be6b15f3 3f5930e2 3e9bb3a3 be50a95e -> 00000000 3f0aefa8 00000000", + "3fc00000 3e9224e9 3e0464ec 3e0464ec 3f844dbe be3a3038 3f873edd -> 3ea3b5b2 00000000 3e4a2cb0", + "bf000000 3eecf4e4 be7ebde7 3eecf4e4 3f068c96 3ceb6e05 3ceb6e05 -> 3f10d85e 3e234284 3f236e9e", + "3e800000 3eb381f4 3eb381f4 3ed2abc4 3ed19d38 3f77f747 3ed19d38 -> 3e73d294 3eb0e0dc 3e9e7912", + "3f400000 3f88ccaa 3f143301 3f88ccaa be238425 3ec65925 3ec65925 -> 3f800000 3e62497c 3f800000", + "40000000 3f82aeb9 3efded92 be211ea2 bdc31de8 babc5c64 3f9b15fb -> 00000000 00000000 3e3f4b84", + "00000000 3ea0ae63 3e3ca2cb 3ea0ae63 3f400000 3f400000 3f400000 -> 3ea0ae64 3e3ca2cc 3ea0ae64", + "3f000000 b9b1f82b be6c9be0 b9b1f82b 3cce0a86 3f9dec13 3f6728cc -> 00000000 00000000 00000000", + "3f800000 3e38d8e0 3f9ce929 3d66883f be258bae 3e0554b7 3e0554b7 -> 00000000 3f800000 00000000", + "3fc00000 3eb9844c 3d2abf67 3eb9844c 3f3b1b81 3e36c498 bce81e2a -> 00000000 00000000 00000000", + "bf000000 3eb301f1 3e79d857 3de429f5 3e77994e 3cfd98f0 3f8ae60c -> 3f0745a3 3efb41fe 3d933e58", + "3e800000 3e29ce22 3f3efd63 3e0602df 3dbd620a 3f84e475 3f84e475 -> 00000000 3f3f9ae9 3e0e6f5c", + "3f400000 3f648e62 3f648e62 3f69d45e 3e340262 3cab27fd 3f96f24e -> 3f3820c2 3f18b314 3f6c7507", + "40000000 be181e6f be181e6f 3f1a568b 3e52df3a 3f3720bb 3e52df3a -> 00000000 00000000 00000000", + "3f348301 be7d9f22 be7d9f22 3f9fd1e4 3eb4ad3f 3ede3b45 3ede3b45 -> 00000000 00000000 3f800000", + "3f885b9e 3f8634f5 3f8634f5 3f429564 bddf9176 3e72d32d 3e511683 -> 00000000 3f800000 00000000", + "3f9c06a5 3d91f9e0 3f0d7a45 3f86095e 3ecdcede 3dce9b20 3dce9b20 -> 00000000 00000000 00000000", + "3eec3f70 3e048ebb 3eddbe84 3e048ebb 3f000000 3e800000 00000000 -> 00000000 3e084720 00000000", + "3f4dffd2 3e40ac06 3f9656d1 3dbe3cc5 3f03641b 3de0b127 3f6a131a -> 00000000 3f800000 3cd2e880", + "3f6afa27 3f000d48 3f9477ce 3f9477ce 3f193d6f 3eb26d94 be20a025 -> 3e55a25c 3f800000 00000000", + "3e93a912 3ea5d644 3ea5d644 bc489945 3f02f23a 3d89e66b 3f02f23a -> 3e5a2504 3d99dcc8 00000000", + "bdc4b764 3ecf5d6e be77494f 3f890979 3f800000 00000000 3f800000 -> 3ecf5d6e 00000000 3f800000", + "3ef6e5a5 3f9907ed bdfc5874 3f9907ed 3df42bac 3f00ee89 3df42bac -> 3f800000 00000000 3f800000", + "3f8b2dc4 3f9f8ec2 be5f1605 3f9f8ec2 3f1da57d 3f88fc6d be6d9d4c -> 3f800000 00000000 00000000", + "3f829db3 3ec6dc76 3e307d71 3ef7c6df 3e800000 3f000000 3e800000 -> 00000000 00000000 00000000", + "be85084b bdea1e4e 3e6e1065 3ec24e5f 3f837edc 3f837edc 3f657925 -> 00000000 3e68728c 3ecaa2a6", + "3f9ac4d9 3f432e3e 3f5be7e3 3f1dda8d 3f74f0a3 3f74f0a3 3e41bc20 -> 3f3fd413 3f59ea98 00000000", + "3f30ce4c 3f586309 be5bbe77 3f30c65e 3f400000 3f000000 00000000 -> 3f501ea8 00000000 00000000", + "be628003 be0e3b81 3f8955d6 3f6aa8bc be492b4c 3e38f28b 3e38f28b -> 3dcba328 3f800000 3f6deefb", + "3fb9e3ee 3eeb3659 3e9c914b 3e9c914b 3f937e0e 3b7f4f21 3f8fa958 -> 3f0eab82 00000000 3ed2322e", + "bc8c8e94 3f86dfff 3d01be2d 3ef9af9e be77c756 bdcefc19 be77c756 -> 3f800000 3d4b48b0 3eff28be", + "3f725a3b 3de1d54c 3f120e57 3de1d54c 3ed34621 3f627baf 3f8cf345 -> 00000000 3f0495b6 3e408d8c", + "3f42f720 3f5fc54d 3f5fc54d 3ede4d15 3f29a07b 3e201a09 3e5420c4 -> 3f54a01b 3f25d875 00000000", + "bd125e10 3e0cfd8f 3eb78526 3f738530 3f7411d9 be1c65c6 3f7411d9 -> 3e0e755c 3ec483fa 3f738a80", + "3f0c9f45 3f94636b 3e850d96 3f99b6b0 3f800000 3e800000 00000000 -> 3f800000 00000000 3f800000", + "3f67bba2 3f12814d 3d154a32 3f47679a 00000000 00000000 3f000000 -> 00000000 00000000 3f189c2c", + "3df35bee be7d8fbd 3f93172c 3f999994 3f91021a 3f91021a 3f7069d5 -> 00000000 3f800000 3f800000", + "3f83a2b4 3f12b694 3e1960b0 3e4e3c03 3f7e88ed 3f7e88ed 3d6e2953 -> 3f1210f0 3e14391c 00000000", + "3ebe7382 3eb7c973 3f90740d bddea35a 3ee93d6c 3f996ad1 3f3b79f7 -> 3e48df14 3f800000 00000000", + "bea6f6d3 bd469b1e 3e1cb666 3e65f417 3f5f29b8 3f5f29b8 be5c6e51 -> 00000000 3e3f88a4 3ee3a918", + "3f3bb387 3eebe5be be2a3a1b 3f5753d8 bd3e6094 3d3ec7b9 3f6a3812 -> 00000000 00000000 3f549f17", + "3ea8338e 3f00fe08 3f44de89 3ea13535 3f74afa3 3f161c8c 3f161c8c -> 3efe3e06 3f3b9223 3e54170c", + "3f0e5a56 3f2f1f70 3f39a64d 3f39a64d 3ed31fc2 3ce70e09 3ce70e09 -> 3f07dde0 3ecddfdc 3ecddfdc", + "3ebdc1bd 3f55905e 3f55905e 3f14be7f 3b1ee8d4 3ec9335e 3b1ee8d4 -> 3f3cabcc 3f493ed5 3eaba80a", + "3ed27164 3ea7fa81 3ea7fa81 bd023247 3e52a3ce 3f4574c4 3f83284c -> 3b1ca900 3e84498e 00000000", + "3dd02598 3f507fc9 3f4ec8ee 3ee1d020 be5189d2 3f327153 3eb13707 -> 3f49df4a 3f4d38ab 3ecd70ae", + "3f8934e2 3f78ba0f bdcaff3c 3f96b8b7 3c39b07d 3efcf58e 3e4f30f0 -> 00000000 00000000 3f800000", + "3e7ed5dc 3f880155 3ef1e308 3f880155 3f7417ff 3f84905e 3f7417ff -> 3f800000 3ef44338 3f800000", + "3e0119bc 3e79d60d bcca9a8f be20622f 3f0c8f1a 3edff113 3f0c8f1a -> 3e4b2b88 00000000 00000000", + "3f7a714a 3f08c101 3f571a81 3f08c101 3e8168fb 3f806d2c 3f138ff7 -> 00000000 3f573c84 3e517e2c", + "3ec78043 3f31253c 3cc5a912 3eeee445 00000000 00000000 3e800000 -> 3efd9bca 00000000 3e7c3f8c", + "3d309827 3f954948 3f8133d5 3ea92e4b 3f9f51f2 3f919e62 3ece6694 -> 3f800000 3f800000 3ea0203c", + "3f810afb 3f82afea 3f82afea 3f752d39 3f9f2a16 3eff32ab 3daab334 -> 3f800000 3f800000 3ee2ba92", + "3f1afe8d 3f53dfdf bdd8637b 3f9cec36 3d3f402f 3d3f402f 3e8516ed -> 3f17a405 00000000 3f800000", + "bcac8084 3d35f16d 3f868655 3f868655 3f279f51 3f279f51 3f8a5d3c -> 3d5230e0 3f800000 3f800000", + "bda551ef 3f164202 be0ee39c 3f2b54d8 3f8b43ee 3f8b43ee 3f59aeb5 -> 3f158050 00000000 3f2c579b", + "3e016ebc 3f5e001f be5b25a8 3efb3970 3d8e8e9c 3d8e8e9c be4fe594 -> 3f597820 00000000 3ecc759c", + "bef76ffb 3f598c1b 3f8e97f6 3df0a5bc 3f3bc4ea 3f3bc4ea 3f77f3ac -> 3f5def60 3f800000 3e05d91c", + "3fae185e 3f6963a5 3f6963a5 be01fba6 3f445797 3f2e6cd7 3f716372 -> 3f5ee599 3f5817fa 00000000", + "3eb2f99a 3f9b8db8 3f13df7a 3ec5ca66 3ec6a0f5 3eeed97a 3f0f846a -> 3f800000 3ef62bf6 3e8cc5ee", + "3ec3a4ab 3e837df3 3f8fbf14 3f8fbf14 3f809699 3f3f7430 be2e96a5 -> 3e8428ba 3f800000 3f800000", + "3eec135a bd8a0fb8 3f4fbaa2 3f305c14 3f1f049b 3f9bfba2 3f9bfba2 -> 00000000 3f542634 3f37a703", + "3f6a6848 3f2eca31 3e2c7e06 3e94ee3b 3f3d5658 3f8f871f 3bb56a44 -> 3f155d1e 3e80cf7a 00000000", + "3f2008c2 bdb85867 3f0cee1b 3f0cee1b 3e1b75f9 3f53380f 3e1b75f9 -> 00000000 3efd9aa4 3d30d430", + "3f01d5fb 3ee9f5bb 3e92fc29 3d6db72b 3f298e27 bdd2c874 3f1cb67c -> 3eb080c8 00000000 00000000", + "3e978548 3df18021 3df18021 3f22865a 3f85e8a7 bdc49a38 3f1f8a6c -> 3e04ec68 00000000 3f16cb1f", + "3f534a62 3f58740c 3f58740c 3f3304d0 3e2db75e 3f5649e4 3e2db75e -> 3f025212 3f524f0e 3d35a8b0", + "be0c68fb 3efdbcfb bdd628f3 3f074e1d 3f941349 3f941349 3f719cc9 -> 3ef80fe4 00000000 3f083a66", + "beb82a67 3f1f5364 3e56c0ab 3e56c0ab 3f400000 00000000 3f800000 -> 3f274d49 3ed66aa8 3e56c0ac", + "3f904203 3efed8d6 3ea438e5 3e104fbd 3f2dd4cf 3f15de6f 3f2dd4cf -> 3e5a34ec 00000000 00000000", + "3f4a1233 3ed864bd 3ed864bd 3f3dcfed 3e800000 00000000 3f400000 -> 00000000 00000000 3f2d8a3a", + "3f12971a be250a5a 3d1519fd 3ea650f8 3ed96415 be2fd869 3f422d64 -> 00000000 00000000 3e5daf5c", + "be0bc909 3c2fc092 3c2fc092 3f20505a bcafaa92 bd757453 3f82b6eb -> 3e06f34c 3e0b07c0 3f20093b", + "3fa8ca0d 3f1d1dae 3e88503b be5bcdb3 00000000 3f800000 3f400000 -> 00000000 3e88503c 00000000", + "3f0b510f 3f8f2d41 3f180b0c 3f094400 3efaa361 3f38e78a 3f610d39 -> 3f800000 3f0588c6 3f00e76a", + "3ed8adff 3e640d66 3f06d4f3 3f01a9ea 3e83ff29 3f352fa3 3e83ff29 -> 00000000 3eeb7650 3e8f9eae", + "3935f116 3ea3bfb9 3e64dd13 3ea3bfb9 3f09a0ec 3e9e113e 3f9a9bc3 -> 3ea3b890 3e64c4a8 3ea3c2f0", + "3f9cd155 3e692129 3eace5e6 3eace5e6 3e3b7f7a 3f4eea82 3ee5c985 -> 00000000 3e0992e4 00000000", + "3ea92d23 be3097d7 3f8d4ba0 3f586787 3dec6dc8 3ea1eb16 3ea1eb16 -> 00000000 3f800000 3f4cd902", + "3f28be35 3f8d77a7 3f87baeb 3f8d77a7 3f7b66ae 3f7b66ae 3f835206 -> 3f800000 3f800000 3f800000", + "3f81541a 3f8b11a4 3f8b11a4 3f8ac870 3f2dcd00 be3793e0 3f7d6565 -> 3f800000 00000000 3f800000", + "3ed8eff9 3dfaa0e1 3f34eaaa 3f1811bc 3ed3f1c7 3ed3f1c7 3df14d1a -> 00000000 3f1c1d22 3eb41156", + "3f4328ed 3f8a03bd 3f7ba974 3f7ba974 3f21ba28 3f21ba28 3f372274 -> 3f800000 3f79f7ff 3f7a75b4", + "3f157a93 be100ff9 be100ff9 3db25eb1 be249f75 bde040cb 3ede4add -> 00000000 00000000 00000000", + "bed1ac61 3f22a582 3bf34d0c 3f22a582 3f318044 3f55dafa 3f55dafa -> 3f2d0fb7 3d8f98d8 3f288aee", + "3f7281d0 be40ac30 3e1a90bb be65a846 3f8ae150 be14b9d6 3f89de7e -> 00000000 00000000 00000000", + "3f6c9cfe 3c58af27 3c58af27 3f98f43d 3ea98480 bc977610 3f820db7 -> 00000000 00000000 3f800000", + "3f8e3c30 3f4bd9ad 3f57843b bd8d8601 3db3ee6e 3f988a93 3f988a93 -> 00000000 3f5ea072 3df30740", + "3f4fc285 3e39b5f8 be70dfac 3dda2211 3e8b7395 3f9659b0 3ef88422 -> 00000000 00000000 00000000", + "3f93a9ae 3f06f4ee 3f3a0393 3f2940e3 3e773034 3e773034 3ea5158c -> 00000000 00000000 00000000", + "3f8c5b45 3f4129a8 3f296a54 3f271a79 3f000000 3f800000 00000000 -> 3ee9cb50 3f296a54 00000000", + "3fa4a6db bde4101e 3f97ca29 3f97ca29 bdd0c7b2 3e6f6c57 bdd0c7b2 -> 00000000 3f800000 00000000", + "3f263c7d 3f7ac99f 3e68950e 3e68950e be2f4e31 3f476d78 3d9b5de7 -> 3f6a3bcf 3dc7f948 00000000", + "bc8505ed 3f5b28dc 3f897b3c 3f5b28dc 3e19ffe0 3f1acdb0 3e19ffe0 -> 3f5ba934 3f800000 3f5ba934", + "3f9da460 3f3d0217 3f28d6ba be7db69d 3f800000 00000000 00000000 -> 3f3d0217 00000000 00000000", + "3f81c7c5 3e66a909 3f9ed636 3f9ed636 3f4f04aa 3f59fdd2 3f93dae5 -> 3d1ed910 3f800000 3f800000", + "bdbb6d6c 3f67221d bd75c689 3f67221d 3e800000 00000000 3f800000 -> 3f68bafe 3cec83a0 3f67221d", + "3f2b37ce 3e7792ca 3e7792ca 3f2886f5 3ef801d1 3f566991 3f5260fe -> 00000000 3e18ee4c 3f1cb0cc", + "bef7725a 3e2eaf9c 3f64064c 3ef3de93 3e81572d 3e81572d bd6b393e -> 3ec80758 3f6b72b4 3f2746d4", + "3e8d5ddc 3f67ffe5 3f9d5bb8 3f67ffe5 bce4dd67 3f95c8f7 3f150a5e -> 3f5e7d00 3f800000 3f64deae", + "3df8854f 3f8aa09e 3e771afb 3e771afb 3e5a8c13 3ebee357 3f3fbdca -> 3f800000 3e371bc4 3e5eb2b4", + "3f9ac4e3 3f2fecad 3e464fb1 3f935041 3f46ec29 3d9f1710 3f817863 -> 3f125e9b 00000000 3f800000", + "be7ed05b 3dde08c9 be5ea1e6 be5ea1e6 3f86c86f 3f73031d 3f73031d -> 3dc5a260 00000000 00000000", + "3f8d3b85 3ee6ffd5 be73ccff 3d6940a8 3d004b30 3e0bddc6 3e9fa57b -> 00000000 00000000 00000000", + "be9e722e 3f960fd3 3e1c2129 3ee51767 3dbcefaf 3e158dce bd4f9c44 -> 3f800000 3ea8c502 3f154112", + "3f9b4cbb 3f45e1d1 3dc686e9 3dc686e9 3f152721 3f1121d3 3edfa8c1 -> 3f0a4286 00000000 00000000", + "3e41afa5 3f84030f 3f84030f 3d25b513 3ea79414 3ea79414 3f6d1537 -> 3f800000 3f800000 3cdbfd60", + "3fa5220d 3f96d42b 3ec3321c 3f5bba0d 3ee89f70 3ee89f70 3f820285 -> 3f800000 00000000 3f5c726c", + "be384c01 3ede2ec5 bdab8e77 3ede2ec5 3f77695f 3f5d569b be5e189a -> 3edfec0e 00000000 3f092050", + "3fb96199 bd373503 3e1e8437 bd373503 3cf219b9 3f012cd3 bd4f6942 -> 00000000 00000000 00000000", + "3e0ef32e 3f5f9406 3f302a3e 3f302a3e 3f47714d 3f524958 3ed5fd9f -> 3f5e8be5 3f2e1fbe 3f291aba", + "3f521dd0 3f8b48a0 bd90fcdd 3f8e6e03 be6e2419 3f17065f 3de3bb01 -> 00000000 00000000 3f800000", + "bba3e114 bd360239 3ee4d15f 3ee4d15f 3f400000 3f000000 3f000000 -> 00000000 3ee58632 3ee58632", + "3f376566 3f4dde64 3f4dde64 3f99438d 3f1ff503 3f8499eb 3eb8061c -> 3f3b715d 3f4f2096 3f800000", + "bde99a75 be27b3ca bd8ccf62 be27b3ca 3f3f1f7f 3f3f1f7f 3f9e2c76 -> 00000000 00000000 00000000", + "3f5a85a3 3e7a8ef0 3e7db31b 3e7a8ef0 3f93e902 3f93e902 3f9d09dc -> 3eaa9ba2 3eabfe96 3ebc04bc", + "bd8a3b29 3f6f61fa 3f380d2a 3dd532bd bacc5516 3e93c0c1 3eaeed16 -> 3f706f58 3f3b5913 3e11a148", + "bed6c1b3 be20fd25 3f5ac12d be20fd25 3f4f2a66 3f5ab6ef bdfb1057 -> 00000000 3f5ce621 3e5a5c28", + "3ef3d2cd 3e87efad 3f1481b1 3ea7bcf5 3f8ab170 3f8ab170 3f99a4f6 -> 3e965328 3f189e92 3ec5b90e", + "beff7ea9 3eaa7915 3eaa7915 3c09eb2b 3e5df173 3d96dd15 3e5df173 -> 3f053964 3f0b380e 3e92faf2", + "3f830fbb bd5485af 3f6b5130 3f7cc2a4 3f2e8f9b 3d14dbe7 be4b84f3 -> 00000000 00000000 00000000", + "3f0ff146 3eccaed0 3f41c580 3e9af8b5 bce68a00 3f1b3a7d bce68a00 -> 00000000 3f30154f 00000000", + "3f763982 3f4c98fd 3f845bac 3f6d7ea8 3f81b363 3f2938bf 3f8f5181 -> 3f4d3f08 3f800000 3f6f67a9", + "3f64598e 3f54fcae 3e20f7aa 3f54fcae 3f60e8b8 3f958a58 3f958a58 -> 3f4fc2e2 3e88cdc2 3f5a99d7", + "3f96569f 3e04d006 3eb39d1c 3eb39d1c 3f15a82b 3e06a324 3f15a82b -> 00000000 00000000 00000000", + "3f296ded 3d3748d9 3e5b745b be6a4579 3f418d63 3e18dfde 3f418d63 -> 00000000 00000000 00000000", + "3f45b1ea 3e095ad5 3e2870ec 3f08098d bcf2128b 3f86439c 3eb1657a -> 00000000 3e4798e8 3d5cebc0", + "3f5d1a3e 3f7022ea 3f940881 3f5328cb 3f4bb14f 3f8d45bc 3dc8bdda -> 3f6cbcac 3f800000 3e545008", + "3f8b188b be5b2bab 3f530706 3f530706 3f523bcc 3f89e1ea 3f8f90f8 -> 00000000 3f568230 3f5846e8", + "3f40dffc 3e97cb98 3df706e0 3df706e0 3f5039f1 3f42268a 3f7e1482 -> 3e39bae4 00000000 3deccb00", + "3f5c3aad 3ed01e1e 3edc4307 3f7a0045 00000000 3f400000 3f800000 -> 00000000 3e8c53ba 3f7a0045", + "be89133c 3f34d1a3 3e515cb5 3e515cb5 3e800000 3e800000 3e800000 -> 3f4163f7 3eaccaba 3eaccaba", + "3f1fc13c 3f830bfa 3f6f6e73 3f830bfa 3e3ea3ef 3e3ea3ef 3dd49041 -> 3f800000 3f5e555d 3f800000", + "3ea796f6 3f89d2d8 bb85eb2f 3f89d2d8 bd6e5cf1 be06827e 3f6bb110 -> 3f800000 00000000 3f800000", + "3f8f4d6c 3f697f25 3f8fb499 3f820a88 3f854225 3e9725f5 3f854225 -> 3f6a7c73 3f800000 3f800000", + "3e5604ca 3e14b410 3e750bfb 3e7de2f7 3f000000 3f800000 3f800000 -> 3d3a3d00 3e750bfc 3e7de2f8", + "3db70e09 3ed3dc97 3e2b0d60 3ed3dc97 00000000 00000000 3f800000 -> 3eb666c4 3daea948 3ed3dc98", + "3f81b7b8 3d1cf4e7 3f96a915 bd07fa95 3c853929 3f872cf3 3c853929 -> 00000000 3f800000 00000000", + "3f0f487d 3ef8fd1a 3f692e8c 3ede4758 3d0f0b87 3f1e9065 3f953229 -> 00000000 3f630151 3ef6da6a", + "3fb2e120 3e24878f 3f9a40bc 3f4f3f7d 3f4c1520 be220f15 3f4c1520 -> 00000000 00000000 3f3bf754", + "3f93cab2 3ee91474 3f94c762 3f7b2d11 3f2c31a0 3e7d4a97 be4795e2 -> 3dfe5738 3f800000 00000000", + "3f71f6b8 3f20bf30 3e3fea1f 3f20bf30 3daafda8 3e99cb3b 3daafda8 -> 00000000 00000000 00000000", + "3eee6eea 3e0a3297 3f513c67 3f8ba1d8 bdf7c007 be4d9771 be34085b -> 00000000 3f15e9f2 3f800000", + "bed0be50 3f37933c bc986423 3f272b1d 3e91d4d3 3f6deadf 3f78709f -> 3f47ecde 3c225e00 3f2839a9", + "3f20064a 3f525d88 3f525d88 3e2064c9 3d85f0ea 3f65f681 3f61fb98 -> 3f123eae 3f4f445f 3db82d78", + "3eaad025 3f6eb59a 3f9bb10b 3f6eb59a 3f170a59 bd56d057 3f9287e2 -> 3f6bf834 3f800000 3f6f818a", + "3f5b3898 3ea5f770 3f8446ec 3d4bb4ef 3e800000 00000000 3f000000 -> 00000000 3f800000 00000000", + "3f2c3bfc 3d54242f be7d983e be020af5 3edfe4b6 3f45cf51 3d455e3e -> 00000000 00000000 00000000", + "3ddddb60 3f030f5d 3f4ee471 3f030f5d bda430d2 3f797a03 3da9f942 -> 3ee50184 3f4ec1a4 3eea8f48", + "3f280753 39a0b8c3 39a0b8c3 3f9d3f2d 3ed5e05f 3e8ea2f8 3ed5e05f -> 00000000 00000000 3f800000", + "3f984049 3f8feb1b 3f8bc4fd 3f8bc4fd 3f84d209 bcadde51 3f183d07 -> 3f800000 00000000 3f800000", + "3f1e0e5e 3f4d0889 3dc6be54 3f4d0889 bdb0c7d8 3f92c255 bd81b7e3 -> 3eca7440 3e30180c 3ed73d6c", + "beec25f8 3e9dc300 bdc9633f 3f36af84 3eeb95bd 3f92e681 3f87498b -> 3ee4622a 00000000 3f34b564", + "bec95558 3f20b603 3f119c0a 3e97b88c 3f3f56d5 3f3f56d5 3f888320 -> 3f2951fa 3f1b954a 3e8e0be6", + "bec96fbd 3f861405 be7352dd 3f1a7c95 3e800000 3f000000 3f000000 -> 3f800000 00000000 3f2b2c60", + "3f1cbeb1 3ef8f878 3f808250 3ef8f878 bdadb9c5 3f498de9 3f498de9 -> 00000000 3f800000 3ed1974a", + "3ef04da5 3ea9f47f 3f2499f9 3f51791b be2a896e 3e9015f3 3f420280 -> 00000000 3eec2de6 3f4b81d9", + "be4fcb3f bdc6c629 bdc6c629 be0c162a 3f042b86 3f2a72e1 3f2cf0cc -> 3a832400 00000000 00000000", + "bdf37839 bdf7d876 3f332b7b 3f73c6d1 3f6c6f14 3e9ea346 3e9ea346 -> 00000000 3f38fede 3f74b417", + "3d61c7be 3f483116 3f483116 3f10bbc1 3f48373a 3f8cb5dd 3f8cb5dd -> 3f478364 3f487edc 3f1156d1", + "3fa69184 3f07f811 be19f1b2 3e788248 3f400000 3e800000 3f000000 -> 3e9c2de2 00000000 00000000", + "3f6af200 3f5eed27 be51bd03 3f34db95 3f5d59a7 3eb1359b 3f5d59a7 -> 3f5a3c3c 00000000 3f2a3322", + "3f6b4d60 3f55f492 3d78b5d5 3c9f0501 3f24d276 3f24d276 3f77585b -> 3f417e0d 00000000 00000000", + "3f59b5bc 3f8adc1b 3f1bffe4 3f8adc1b 3f82b662 3e5e03ae 3f78eb78 -> 3f800000 00000000 3f800000", + "3fa33448 3e70d00c 3f877f89 3f877f89 3f34198f 3ef82033 3de960dd -> 00000000 3f800000 00000000", + "3fa1dc0a 3f2e836f 3f2e836f 3edf51fb 3f6756e2 3ef5d285 3f66cf90 -> 3f2335e2 3d913798 3eb64c26", + "3fbb7982 3f78ab3c 3e42a410 bd1a9888 3f6d1ce8 3f6d1ce8 3f1175c8 -> 3f77c7de 3dbc5448 00000000", + "3e7c6f31 3e0a4184 3f1967b9 3f5cda0a bddb2123 bddb2123 3e61a18a -> 00000000 3ee5cca0 3f547d29", + "3f93b08d 3e0ee26a 3e0ee26a 3f1a5a95 3e00d4dd bdb2aa77 3f6a1cac -> 00000000 00000000 3f0f3a8c", + "3f9a53f2 3dedb7cd 3edefbb8 3f0e65bf 3e0394de 3f3eb8dd 3f3eb8dd -> 00000000 3e3d5de4 3eb7ef30", + "3db0ca9c 3f7e6cc3 be14f472 3f54ec2c bdcc58e5 3f883570 3df7784a -> 3f7e4277 00000000 3f516280", + "be83ba0a 3ec14a88 3f50eda4 3f50eda4 3f7a6e5d 3f91684f 3e4ea0b7 -> 3ec3109e 3f4f38ba 3f58f2b8", + "beb366f9 3efeb509 3efeb509 3f020ca2 be162758 3f06397c 3f949695 -> 3f2439de 3f11bb91 3ef50dc4", + "3f44c00e 3f83b8fd bd3aa6c6 3ec285ad 3f8b0ecd 3f8b0ecd 3f5d160d -> 3f800000 3c9ffb40 3e9d593a", + "3e925cf5 3ee12543 3ee12543 badb5af6 be264d20 3f644551 be264d20 -> 3e24c7b4 3ed7fac4 00000000", + "3f2d0175 3df4342a 3f4e3364 3ea47d27 3fa00000 3fa00000 3fa00000 -> 3e7c747c 3f5565f9 3ed6b722", + "bee7b02d 3ef12b06 be0baf4e 3f8f3782 3f40e675 3ea2bfdc 3f40e675 -> 3f062c22 3e06ca98 3f800000", + "3f8f3e81 be028652 3f9997a9 3f52bca2 3edf12c1 be4b1f92 3f93beeb -> 00000000 00000000 3f596688", + "3f80a02f 3ef9217c 3f213590 3f694760 3f04ef11 3e0f4ed7 3f1b9ce1 -> 3bde4700 00000000 3f5a80bf", + "3fb10250 3ed62004 3e243d7f 3f15a796 3dad7f76 3dd57713 3f39aff4 -> 00000000 00000000 3ea90ca2", + "3fbaa1b0 3ea523ac 3f9bb6df 3f9bb6df bcd1b883 3ea090fe 3e9ee471 -> 00000000 00000000 00000000", + "3ec07fd7 3f2d4f58 3f3d2ae0 3f1583b5 3f5ea28a 3f8f9c4a 3f5ea28a -> 3f290c98 3f4018fb 3f100713", + "3ea138ce 3f9ec5de 3f2ebe8d 3f9ec5de 3f8abb98 bd96e1af 3f8abb98 -> 3f800000 3f053dd6 3f800000", + "3f62d1c1 bdb28f39 3ef2cee5 bdb28f39 3f400000 00000000 3f000000 -> 00000000 00000000 00000000", + "3f536735 3f95b2f0 3f79745e 3e4c6221 3f4b5d8b 3e11f6ca 3e11f6ca -> 3f800000 3f6993e9 00000000", + "3e99506b be1024a2 3f81f24c 3f07a0eb 00000000 3f400000 3e800000 -> 00000000 3f800000 3ec98826", + "3f41c74a be2a781d 3eb0c476 3ef9071d 3b26b06c 3f3a46c5 3e4259a5 -> 00000000 3e336a34 00000000", + "3f9aeaf7 3f99619a 3efa3a80 3f99619a 3f901342 3f901342 3f44ab84 -> 3f800000 3f0e623c 3f800000", + "3ec4106f 3f3f4424 3f98c100 3f3f4424 3cc93916 be2ad689 3dddb8b2 -> 3f18ab2c 3f800000 3f1db2b0", + "3f09779a 3f110b75 be1aa490 3f110b75 00000000 3f800000 00000000 -> 3d82eca8 00000000 3d82eca8", + "3f9af09c 3e5b3924 3f83dbee 3e8b6601 3f29d576 3f013ba2 bd00178f -> 00000000 3f800000 00000000", + "3f902314 be0d4ff0 3e74180b bc5d9f72 3f000000 00000000 3f800000 -> 00000000 00000000 00000000", + "3de9a775 3f88418d 3f5357ea 3f5357ea bde54aac 3e0146bd bde54aac -> 3f800000 3f4e661e 3f4cdae5", + "3fb8e08d 3f978bb6 3f9de4d7 3df5af42 3f70822a 3f1b90a0 3f7b17ea -> 3f800000 3f800000 3dc25ed8", + "be1159b9 3e43ded7 3f7c493f 3f7c493f 3dc09d9f be46ae54 3f868209 -> 3e911d50 3f7cd308 3f7c4256", + "3f5fd6cc 3cddb359 3e3195c9 3ef0adef 3f400000 3f400000 3f400000 -> 00000000 00000000 3ea4c790", + "be317766 3f26bf7e 3f85933a 3f85933a be46cef3 3ed9b0b6 be46cef3 -> 3f360d49 3f800000 3f800000", + "be96d8c9 3eebc49f 3f80c31a 3f83e793 3f6128ac 3f6128ac 3f78458f -> 3ef53c92 3f800000 3f800000", + "3d8eeaca bdfc39bf bdfc39bf be01dd74 3d17e4e4 3f7d3093 3f97740b -> 00000000 00000000 00000000", + "be81356e 3f5e0612 3e1c997d 3f868b6d 3f747ef1 3f89c4ce bd8ac694 -> 3f5e679b 3e0b90cc 3f800000", + "be0e1212 bdd1d3dc 3f91f343 3f974484 3f262af4 3f12154b 3e4b4090 -> 00000000 3f800000 3f800000", + "3f168f5e 3f01245e 3f01245e bd2ad04e 3ebcb0d6 3f21bf68 3ebcb0d6 -> 3e58c908 3ebc29c2 00000000", + "3f8970b1 3f72126d 3f72126d 3f8fb3ad 3f1be389 3dc388fa 3f1be389 -> 3f67fd83 00000000 3f800000", + "bea97110 3e81051c 3f430605 3cc88c24 3f9e9cbd 3f08e6ec 3f9e9cbd -> 3e4034a8 3f4b28b6 00000000", + "be2890eb be4153d2 3f682214 bd0b9535 3f400000 3e800000 3f800000 -> 00000000 3f6ac185 00000000", + "be9bc12d 3f40db66 3f53f14e 3f3f1fa9 3e994528 3d08efe7 3d08efe7 -> 3f4bf36c 3f5df41c 3f4ddd7e", + "3e867d21 bda6c87a bda6c87a 3f776a69 3e26f892 3f981db0 3f981db0 -> 00000000 00000000 3f77d20a", + "3d28e553 3f251ae6 3f5d226e 3f251ae6 bbac23e5 3f88f694 3f766d80 -> 3f212caa 3f5d3c21 3f24f6f8", + "3f905d55 3f45dbeb bd16e8ab 3f931f07 3f426143 3ee38982 3ee38982 -> 3f303183 00000000 3f800000", + "3f9c7c67 be072b0a be072b0a be01c596 3ed3e3d9 3f20304a 3ed3e3d9 -> 00000000 00000000 00000000", + "3f8c40fa 3f2e353b 3f99c75e 3f509332 3f0dc181 3c2039f5 3c2039f5 -> 3ebfe1b8 00000000 00000000", + "bee9d56a 3cf025e8 3f95cc1a 3f9e0815 3e82a5c2 3e82a5c2 3e828138 -> 3e8d286c 3f800000 3f800000", + "3e85e40b 3f617d7a 3cf0dc5f be3cb631 3f8e05f0 bdb11145 3eb64d24 -> 3f625703 00000000 00000000", + "3fb1dd91 be233dbb be233dbb 3f90e37e 3f000000 3f000000 3f800000 -> 00000000 00000000 3f800000", + "3f9409bc 3ef4cbef bd93f398 bd93f398 3e8945dd 3f24c37a 3eeb6614 -> 00000000 00000000 00000000", + "3e9b2616 3f77a61e 3f77a61e 3ed1c293 3f7eb768 be7f4dde be753e64 -> 3f77a2dd 3f728fb5 3d5f9f80", + "bef5f008 3f9a455c 3e7e7a89 3e6eb161 3e800000 3f400000 3f400000 -> 3f800000 3ea87d82 3ea1718e", + "be9e5ec8 3f81eb4a 3f0965ba 3f0965ba 3f944d78 be6c5bfa 3f090e3d -> 3f800000 3f2a19b8 3f184cfb", + "3fa8665a 3f9e3d70 3f68506d 3a48d631 3f40968d 3e53826b 3e53826b -> 3f800000 00000000 00000000", + "3fb6e3d9 3e3abc88 3f304c20 3e3abc88 3f95fc11 3ed151f7 bca14a01 -> 3eafdc1c 00000000 00000000", + "3f8e5fe6 bd687a9b bdf8f900 3f455c6e 3ed29239 3e3b55c4 3ed29239 -> 00000000 00000000 3eac37ec", + "3f81f48f bd06d89e bd06d89e 3e72bb7a 3dbcb0b1 3dbcb0b1 3f9bb53f -> 00000000 00000000 3ebfbfd6", + "3f6b0844 3e8e16f1 3ee14760 3f89a72c 3f913750 3f10de22 3f4286f7 -> 3eb6bf44 3d8d1e78 3f800000", + "bdffbe8b 3e93444e 3f9fc882 3e86a22d 3f400000 3f400000 00000000 -> 3e9e4f02 3f800000 3eb086a0", + "3e5222ec 3f171628 3f6b26af 3f8b52ca 3f39962b 3efba448 3ebb2cd2 -> 3f10cf82 3f68b8d4 3f800000", + "3f70b2a3 3f8e23b7 be3a9401 3f8e23b7 bdc0743b bdc0743b 3f1ad9b6 -> 00000000 00000000 3f800000", + "bd994cd4 3f77723f 3f77723f 3e3c70cc 3f389f90 3f7f7bee 3f18c564 -> 3f779f03 3f777294 3e54ec08", + "3fbd85c8 3ec3ef8f 3ec3ef8f bcc26937 3f160113 3f55849d 3f01bf6e -> 00000000 3e39f5d0 00000000", + "3f285188 3f315530 3f315530 bdef721b 3f900491 3f99faeb 3f99faeb -> 3f375035 3f3a9850 3c6f01c0", + "3edcff92 3eb2b638 3f1bc5c1 3f1bc5c1 3f800000 3f000000 00000000 -> 3eb2b638 3f003037 3e9f4fb6", + "3ef43331 3f0adb4f 3f0adb4f 3f888a47 be11b399 3f8ff6a6 3f5e851d -> 00000000 3f116efa 3f800000", + "bea4bc77 be4753d1 3cfc6236 3cfc6236 3e800000 3f400000 3f800000 -> 3d19f4d0 3dd2ded0 3cfc6240", + "3f038fa5 3f266e0a 3f266e0a 3f2c882d 3f7649da 3f879490 3f7649da -> 3f24a61e 3f29134a 3f2adf51", + "3ecf6e10 3f8b3d15 3dc2073c 3ee5f2ba 3ce5a86b 3e616410 3f0fd849 -> 3f800000 00000000 3ea91536", + "3ebf29f3 3f212dcb 3f249f6d be260010 3f62e711 3e305cf7 3f62e711 -> 3f1cfa00 3ef77f7a 00000000", + "3f9b6a83 be71fd31 be393c00 3d9a2168 3f5cd7de 3f5cd7de be58461c -> 00000000 00000000 00000000", + "3f23720f 3e9311ba 3e9311ba 3e90203a be3181b0 3f823f84 3eeeb5a5 -> 00000000 3e971db4 00000000", + "3f8fb3f6 3f20d7e8 3e79ba15 3f20d7e8 3f42b45a 3ed718fc 3f049237 -> 3efbb8b2 00000000 3e4237f8", + "beffd86d 3f996822 3e78ac52 3f3b976a 3f9f93bc 3f0ace0a 3f8cf938 -> 3f800000 3ec4820e 3f37f122", + "3e8ab439 3f934366 3e5a0161 3f934366 3f9ed2db 3f83b41a 3ea1a22a -> 3f800000 3e604620 3f800000", + "3f3a2e33 bdb2e8f6 3f3e1784 bda8be16 3e55a834 3f01f1b1 3f01f1b1 -> 00000000 3f195256 00000000", + "3e23d34e 3f47cdbd 3ef5e9e1 3f47cdbd 3eefb2ed 3f05b908 3eefb2ed -> 3f4293d2 3edfe5d8 3f4293d2", + "beb274d5 be4f8a27 be4f8a27 bca96ddc 3f994e95 3f8b810f 3f5d9800 -> 00000000 00000000 3cccbb60", + "beec03e4 3eb437a4 3f00fab6 3f00fab6 3f54c437 3f54c437 3f3c7274 -> 3ecc2e40 3f0a274e 3f0ec124", + "3f9a2d38 bdb20a34 bdb20a34 3eb44422 3f000000 3f000000 3f000000 -> 00000000 00000000 00000000", + "3fa0605e 3f7575ce 3ee1c9f1 3f7575ce 3f58978b 3d626476 3f58978b -> 3f72f108 00000000 3f72f108", + "3f75ed4c 3e603c30 3e603c30 bb6ab3ca be0b9209 3f8af7aa 3e586a0e -> 00000000 3e8e8780 00000000", + "3fa02c6e 3f33eea3 3ea678ee 3f4034a7 be6f0ac3 bdb17d52 be6f0ac3 -> 00000000 00000000 00000000", + "be524f5a 3f7b7fd2 3ee0d531 3ee0d531 3e80f875 3e81c152 3e81c152 -> 3f7c1945 3f03815e 3f03815e", + "3f05ef9f 3f265423 be60b413 3f9a6735 3f05a300 3dde0616 3f14dd84 -> 3f086d29 00000000 3f800000", + "3fa87480 3f997d8b 3f997d8b 3f9aa07c 3f321c1d 3a91e74e 3efeb155 -> 3f800000 00000000 3f800000", + "3f494811 3e206c7b 3e206c7b 3f136620 3f957e39 3f5f4e77 3e54db65 -> 3e8291dc 3d801018 00000000", + "3e0de99e 3f2b9fe4 be6b78e1 be6b78e1 3e2c7b20 3e6331cc 3e2c7b20 -> 3f20a263 00000000 00000000", + "3f260eca 3e583c39 3f3ff130 3e583c39 3f677bc9 3f677bc9 be51baa7 -> 3e22bb8c 3f3bb302 00000000", + "3faca67d 3ea0e299 3f96432a 3f73dd3b 3ee00f4d 3f5a3934 3ebaf9eb -> 00000000 3f800000 3f2b9315", + "3f2309f1 3ef42b61 3eb1cc29 bd0cd270 3f978ba6 3f97a7bb 3f6c4ff6 -> 3f0820c2 3ed4fd7e 00000000", + "3fba1136 3f5aab5b 3f70485d 3cc48cc1 3f8a13bb 3f80ccaf 3f8a13bb -> 3f5e80ba 3f706c92 3dfe6670", + "3fbf316a 3d0473e0 bcc27c25 3da7d550 3d9089d8 3eb1c6f6 3f25e5f7 -> 00000000 00000000 00000000", + "3f2140c4 3f34d30d 3f9b8e74 3f34d30d 3f6ba3af 3f398ee3 bdd1d6c0 -> 3f30dc12 3f800000 3d1fabe0", + "be3ff8e1 3f9c0c8d bcbf98c5 3f8489a1 3f485bc7 bd8e129a 3e64901e -> 3f800000 3e170e74 3f800000", + "3f6b31b6 be6129f0 be6129f0 3d1a3f57 3f400000 3f800000 3e800000 -> 00000000 00000000 00000000", + "3fba5bd6 3f550e56 3f92b4f3 3f92b4f3 3c9c650d 3ecdd86f 3f7fd354 -> 00000000 3f800000 3f800000", + "3eb740cd 3ea17f0e 3e97a526 3f7bfacf 3f81293e 3d86de2d bd2258fc -> 3ea2a172 00000000 3f7998e5", + "3f046fdf 3e0c81db be726a88 3e8939b9 3ed25b91 3f12e6b9 3ed25b91 -> 00000000 00000000 00000000", + "3ee590a9 3f35c649 3f35c649 be4a0811 3f603e9a 3e7fa737 3e572409 -> 3f316736 3f102478 00000000", + "3ecf178d 3f7fa5ba 3f12fdd2 3dac28e4 3e800000 3f400000 00000000 -> 3f7f7e6b 3f06ba88 00000000", + "3f9ddadb 3ca4532a 3ea9af93 3ca4532a 3f726b9f 3f9ccb43 3ee14b40 -> 00000000 3ef406fa 00000000", + "3df2814c 3ecd0446 3f4a08a5 be41bf16 be27ef66 3ede1596 3ede1596 -> 3e9bf0ec 3f4627c4 00000000", + "be5d396e 3f8102a2 3f8bdad6 3f8bdad6 bd916a6d bd916a6d 3e145fdd -> 3f800000 3f800000 3f800000", + "beb02f99 3f8ace05 3f2366fd 3ef4ae8b 3ea97e8e 3f18ca9b be292918 -> 3f800000 3f2eaefa 3f209836", + "3fb6b86d 3d3803c6 3d3803c6 3f59d304 3f4c8d60 3f3ef3da 3f4c8d60 -> 00000000 00000000 3f4a776a", + "be3497e1 3f5a0fec 3ecfc89e 3f897489 3f47f1e2 3ebb2c9c 3f47f1e2 -> 3f5b7907 3eee6580 3f800000", + "3f2e3864 3f32b490 3f0cd9b1 3f1a9c59 3ea17696 3eeabb9c 3eb03d2a -> 3ede8b36 3e934a1e 3e91c7dc", + "3e90838d 3f1e03b8 bc8e9b1b 3f111459 3e07b0d3 3cabfeca 3e07b0d3 -> 3efc7c98 00000000 3eda3a76", + "bd317dcd 3ec5d8f5 3ec5d8f5 3ede135f 00000000 3f000000 00000000 -> 3ed2e52c 3ecc827a 3eea1dfc", + "3efd8d35 3ec6fd09 3ec6fd09 3ed1084d 3f61f6c3 3ea35209 3f61f6c3 -> 3eb3adf6 3d9ed460 3ebe57d8", + "3f57f018 3be55d5f 3e537f1e 3eda8b68 3f884b1e 3f884b1e 3d8ae9f3 -> 3d6f7160 3e7d99e4 00000000", + "3f368d4e be0bdb37 be0bdb37 3f0af9c7 bdeb1914 3f6950e3 3f07ac42 -> 00000000 00000000 3e9ff486", + "3ed7937a 3c8d094c 3e14c191 3f829a09 3f5ce78c 3f5ce78c 3e688e1d -> 00000000 3dbe47e0 3f800000", + "be2c5816 3f8a3153 3f87af4d 3f7ce0bd 3f899c4f 3ef0af94 3f27da2a -> 3f800000 3f800000 3f7d0c85", + "be12547c bdf4374c 3e66f35c bdf4374c 3e800000 3f000000 3f400000 -> 00000000 3e8deaf4 00000000", + "3e72134d 3f8fdcc0 3f0558b5 3f40ba9b bd007e1d 3f79a4df 3f8dc3d2 -> 3f800000 3f049f53 3f424c2c", + "3e53a359 3e3d90d9 3e3d90d9 3d70c3d0 3f575f38 3f575f38 3e6d3e13 -> 3e214490 3e214490 00000000", + "3f93b997 3f557729 3f88ea7a 3e8d2dcb 00000000 3f400000 3f400000 -> 00000000 3f800000 00000000", + "3fa93492 3e60d51e 3f1b4fc2 3e60d51e 3e25e877 3ee636e2 3ee636e2 -> 00000000 00000000 00000000", + "3ec37135 3efecf4c 3eca21db 3f91aa0f 3f9bba62 bd20e44e 3f8ae543 -> 3f0939f4 00000000 3f800000", + "3f3330e8 3dd8d4b9 3f9213ca 3d9f2816 3f7f91b8 3f7f91b8 3edf4a37 -> 3dd6abe8 3f800000 00000000", + "3fa6088b be7a5915 be7a5915 3f02f75d 3f000000 00000000 3f000000 -> 00000000 00000000 00000000", + "bed32205 3e1f291d 3e1f291d be289519 3f61ec9d 3f5de078 3e996145 -> 3e471f78 3e4c387c 3dc55d40", + "3ea503f3 3eb78970 3ed0e5af 3f8cb92f be800000 be800000 be800000 -> 00000000 3c0cd480 3f800000", + "3fa757c8 3f7c5975 3f0c7590 3ecbe30e bdd25ef4 3f19d2d7 3f19d2d7 -> 00000000 3d661b20 00000000", + "3f6a9d3d 3f8d9d17 3e9c2184 3f8d9d17 3f534990 3f534990 3eafd2e6 -> 3f800000 3e309fbc 3f800000", + "3f3a668a 3f9781f5 be5fdab7 be5fdab7 3ed57d9d 3f68d028 3f68d028 -> 3f800000 00000000 00000000", + "be944fb8 3eba4d79 3f14054a 3f14054a 3f96ba1e 3d276384 3f3d7919 -> 3ea8a496 3f2b7f82 3f1b947a", + "3ed23b73 3f978ed6 3ed5896c 3ebb1fb9 3f400000 00000000 3e800000 -> 3f800000 3c336a80 3daa3810", + "bed72071 3ef58015 3ef58015 bdb8040e 3f6c68b6 3f6c68b6 3eb7dcec -> 3efdcd6e 3efdcd6e 3e10c1ec", + "3efdbc69 3f9bbda5 3f01b108 3f9819b8 3f36bc75 3f99f565 3edbdce9 -> 3f800000 3f0d3a08 3f800000", + "bd747fe5 3f9de3c2 3efd5376 bdf11358 3f8d46bd 3f8d46bd 3e9fb808 -> 3f800000 3efbb6ea 00000000", + "3ef670c5 3d93cdb8 3f848035 3f848035 3e4d7ef3 3f93b081 3f93b081 -> 00000000 3f800000 3f800000", + "3ec1900d 3f9e3bae 3f914253 3f914253 3dd0a8b5 3f3e5566 3dd0a8b5 -> 3f800000 3f800000 3f800000", + "3f77eeef bd3ff11b 3f8326d1 3f8326d1 3f000000 3f000000 3f400000 -> 00000000 3f800000 3f800000", + "3fa11d88 be145604 3e3b55e9 3f1de725 be37163c be009f70 be009f70 -> 00000000 00000000 00000000", + "3f4dc330 3f6f384f bdb6bd26 3f6f384f 3e3deb5c 3e4289c4 3e3deb5c -> 3f4f67fb 00000000 3f4f67fb", + "be5d0c81 bdaf6d98 3ea0a8ab bdf80828 3f70b558 3f70b558 3e5e460c -> 00000000 3ea521ac 3d27d690", + "3edb961b bd0429a6 3e835e6b 3e835e6b 3f83b6e8 3f16498f 3e3cd0be -> 00000000 3dc5cd68 00000000", + "be9415fa 3f7d5280 3f41bbad 3f7d5280 3e0caea0 3f963219 3e0caea0 -> 3f7ddb61 3f3e71ff 3f7ddb61", + "3e0c2c04 3f52a032 3f3387fb 3f9f992a 3d038f65 3f3a25b7 3d038f65 -> 3f4bb22e 3f30906c 3f800000", + "be275e70 3f4950ca 3e87a0e4 3d84c6e3 be4d3953 3f1ff1f2 3d930c4b -> 3f5248f6 3e9d6068 3e4087f8", + "3ef49253 3de72243 3de72243 3f7806a1 3e273c61 3f9df383 3f9df383 -> 00000000 3e4ee5cc 3f78d3dd", + "3f8ace0f 3f84aba1 3f806a1e 3f35b6c5 3efd741f bd773550 bd773550 -> 3f800000 00000000 00000000", + "beaa77a7 3f67121f bcfaedc3 3f8a5fdf 3ef77971 3f91ad2c 3f91ad2c -> 3f6abac9 00000000 3f800000", + "3fbf7bde 3f70bacf be4de78a 3ed46c70 3e3e3cb6 3ef5d14f 3e3e3cb6 -> 00000000 00000000 00000000", + "3f9f890b 3ed52d9b 3f94ba4a 3f90b416 3df3d721 bd04731d 3effcd4b -> 00000000 00000000 3f800000", + "bbad2438 be08decc 3f768108 be08decc 3e676432 ba540575 be61c189 -> 00000000 3f768dd2 00000000", + "bdcfd269 3d28a4f3 3d28a4f3 3f5134e1 3f800000 3f000000 3f800000 -> 3d28a4f0 3db324d8 3f5134e1", + "bdb253d9 bd4bf409 3f8fa4d8 bd4bf409 3d24c392 3f55ac6d 3f3ac3b7 -> 3cff5e80 3f800000 00000000", + "3eb0ca5c 3f30c271 3f923f5c 3f9ec8cd 3f590e6b 3f3d4253 3ef141e9 -> 3f2c5dd2 3f800000 3f800000", + "3fa9458e 3f1528cb 3f1528cb 3eba8ea2 bddb61cc 3f25f476 3f25f476 -> 00000000 3e60f718 00000000", + "3f76da9e 3dd2935e 3eb8d3f9 be70070a 3efa2b79 3f99ea1d 3efa2b79 -> 00000000 3eee4466 00000000", + "3f62bf0c 3e0e3704 3d4b5a22 3e9908c1 3ed0d538 3f4a6766 3f625aa5 -> 00000000 00000000 3e600344", + "3ea6eb28 3f33827c 3f939910 3f56da0c 3f1f881b 3e2484d4 3f674583 -> 3f28cbf2 3f800000 3f558388", + "bdce657f 3f9b4d59 3f88aca9 3d8efeb6 3ead4a3a 3f0e7b07 3f0e7b07 -> 3f800000 3f800000 3de07c80", + "be048dbb 3ef6d69d 3ef0b98c 3ef0b98c 3f8db415 3f4c2fc8 3f4c2fc8 -> 3ef31caa 3ef7a68e 3ef7a68e", + "3f4cee83 3d29fefb 3f7c49d0 3f48a4ee 3e25a1e7 3e25a1e7 3f87a304 -> 00000000 3f74b79f 3f4b2ae5", + "3fb46ac1 3ec24994 3f4a43af 3d02a51e 3f266fc9 3f94de76 3f94de76 -> 00000000 3f544e3a 3e59e7d4", + "3e8c4406 3ef5404e 3ef5404e 3eb49498 3f071e0c 3ed8f4d3 3e2cec0f -> 3ecd9df2 3ec33ece 3e25bd9c", + "3ef806f1 3f32a98d bce64be3 3f58ca96 3ee83364 3f7e678b 3f0f119a -> 3f16d12b 00000000 3f4e22a2", + "bd82737b 3f8e8b80 3e3cacfa 3e3cacfa 3f77e58d 3f94d12d 3f94d12d -> 3f800000 3e33ee88 3e33ee88", + "3f6370b2 3d55991d 3f1b19e5 be4c9c87 be694eb7 be694eb7 3f8fdbff -> 00000000 00000000 00000000", + "be2c1dcf be73c367 3ec7286d 3f17b192 3f55fb01 3ecf2b26 be1ac562 -> 00000000 3ee39dde 3f289a8c", + "3dd5ac05 3f868018 3f636561 3cf0dfe1 3f78b227 3f35ad8f 3ebeb42e -> 3f800000 3f6280a6 00000000", + "3f877e8b be127a18 be5a6800 be5a6800 3e800000 3f800000 3f000000 -> 00000000 00000000 00000000", + "3f469143 3f3b4a04 3e917ebb 3f3b4a04 3ee505f5 3f911bd4 3f14c364 -> 3f07bada 3eb3ec56 3f1a37fd", + "be0c38a4 3f1af8b0 3f105d20 3f105d20 bda9221f 3f9b257a 3d3c46d1 -> 3f2803c2 3f0d0655 3f1d4349", + "bd080245 3f298fe5 3f298fe5 3f5f8204 3f9d9cdd 3e3ddc47 3e3ddc47 -> 3f28e497 3f2bd6ab 3f605d15", + "becde9a1 3f6de092 3ec675b2 3e8199ff 3f000000 3f400000 3f800000 -> 3f70e94e 3ee31aa6 3e819a00", + "3ea5a288 3f2f50b5 bda8efa1 bda8efa1 3f762cb4 3f3ec777 3e442c0d -> 3f2e4d06 00000000 00000000", + "be5f9637 3e509649 3e509649 3f4a5941 3e42d928 3e154cd6 bdf7ceb8 -> 3ea58bd8 3ea861d6 3f54e601", + "be40b69a bd996c19 3f027583 bd996c19 3f800000 00000000 3f400000 -> 00000000 3f1657e0 00000000", + "3f1cdedc 3f51c14c 3d7ff437 3f51c14c be1d897f 3f7463be be179bfe -> 3ec44886 3d122f00 3ec80f7a", + "3ec57632 3f1f41c2 be274e95 3f73a5ba 3f56cd76 3f4b8533 bd0b1856 -> 3f18daf1 00000000 3f6b7461", + "be9a219d 3e93242d 3e93b2d1 3e93242d 3e23eaf7 3f24b9e2 3f126121 -> 3edcc6d8 3eb70270 3ebccda4", + "3f2b5a7e 3f0dc63c 3f2f0b7a 3f0dc63c 3f4816a0 3ebc7fed 3cdc8a46 -> 3ef46ef2 3ee76e96 00000000", + "3f92a444 3f77d41d 3f77d41d 3eab62e7 3f86199b 3f8ab4f2 3f1ea659 -> 3f784069 3f788b0c 00000000", + "be349792 3e56e782 be0d6215 3f3ba3c5 be295286 3e19a97c bd65c310 -> 3eb06bb8 3c287d80 3f465f76", + "3e1c398b 3f9ee090 3f64796e 3f64796e be56c043 3f22eb61 3f22eb61 -> 3f800000 3f62db97 3f62db97", + "3f7f18ac 3f13dbad 3af08603 3f6f87dc 3ea1cb44 3f2f869f 3ea1cb44 -> 00000000 00000000 3f4c471d", + "3ee32870 3ea24dcb 3f0e1427 3f2ce08f 3d71cb1d 3f43ece9 bdf044b6 -> 00000000 3f00d6ec 3eb654ee", + "3edeb336 3eeb038e 3ec01182 bd9176bc bc816ed2 3c6a8e92 bc816ed2 -> 3cfc1de0 00000000 00000000", + "3fa3098a 3f4ae882 be621cf1 be621cf1 be7bf281 3ebe77e3 be65f07c -> 00000000 00000000 00000000", + "3fa699ef 3eb3e060 3f467def 3f92f6f5 be556798 3f892e75 be556798 -> 00000000 3f4b670d 00000000", + "bee876c6 3de20a57 3f379a65 3ec3feeb bd358a71 3f95eaf2 3e818c0f -> 3ecb0426 3f31800a 3f0a0366", + "3f58f4b6 3f7b7370 3f403560 3f403560 3f800000 3f000000 3f000000 -> 3f7b7370 3f114cea 3f114cea", + "3f03b391 be6b3f38 be6b3f38 3edc23c0 3f178e66 3f3a88cc 3f991a5f -> 00000000 00000000 3ef6e34e", + "3f778024 3ee1e5c9 3ee1e5c9 3e0809cc 3f75f258 3db67cfd 3f75f258 -> 3ed69b40 00000000 3dc9fd30", + "becc340b be1f50ff 3f60ff97 3f9f798e be39a465 be39a465 3f408178 -> 3e5ba584 3f6aed44 3f800000", + "3f79bd20 3f2f142c bdd7abef bdd7abef 3e800000 3e800000 3f000000 -> 00000000 00000000 00000000", + "3f78edab 3ec13c22 3f8d8fdb 3f52f164 bdaf3342 3ed6c123 be760188 -> 00000000 3f800000 00000000", + "bcf0c2ba 3f932f5f bde31bc9 3f978cc3 3e894353 3f0ef451 3dd7ddcd -> 3f800000 00000000 3f800000", + "3fb333c1 be082e2a bbb909b2 be157ed9 3e4018bb 3e9e377c 3e4018bb -> 00000000 00000000 00000000", + "becd3f91 3f987579 3f069891 3f987579 3f57efad 3f00a7bb 3f57efad -> 3f800000 3f1ac7c5 3f800000", + "3f15dc25 3f5c3644 3f5c3644 3f6d7efb 3f9aec31 3f071573 3f071573 -> 3f6022a8 3f4e88fb 3f666caa", + "beeb8041 3e9e4503 3f19ef77 3f19ef77 3f83705a 3f83705a bddd68e5 -> 3e99d7fc 3f18a88b 3f3c64c6", + "3f2cdb3e 3e628b06 3e628b06 3f87b15c be24c551 3f46623e be24c551 -> 00000000 3da74718 3f800000", + "3fa7bb5e bda88916 3f6c8e40 bda88916 3f4a6d90 3f7bd902 3f0680b5 -> 00000000 3f6c2227 00000000", + "3f52ae90 3d7c2aa9 3f0b471a 3f0b471a 00000000 3f000000 3f000000 -> 00000000 3e66a968 3e66a968", + "3f98ed7d 3e84998e 3f7dac72 bbcf842f 00000000 00000000 00000000 -> 00000000 00000000 00000000", + "3ef4ec0b 3f8e4466 bdd2f210 bdd2f210 3f0cf2de 3da5bbd7 3f73bbdd -> 3f800000 00000000 00000000", + "3fb846bd bd96f2da 3eaf49eb 3f993bfd 3f800000 3f400000 3f400000 -> 00000000 00000000 3f800000", + "3fbd6e6e 3f145abf 3f030b85 3f145abf 3effcd24 3f64817a 3f64817a -> 00000000 3ed6dc9a 3f0002f2", + "3fabb9e4 3f82fba4 3e13b20d 3f7725a4 3e800000 3f400000 3f000000 -> 00000000 00000000 3f651b72", + "3f41370b 3f0cfc03 bc7fcbfa bc7fcbfa 3d54eef2 bd63392c 3d54eef2 -> 00000000 00000000 00000000", + "3d94e4fc 3f8c936d 3f8c936d 3f3fd664 be45e61f be45e61f 3e8d0660 -> 3f800000 3f800000 3f3c4505", + "beee9131 bd98f32b 3f8357b4 3f8d18eb 3e16c79a 3f6d25d3 3e16c79a -> 3e6c7388 3f800000 3f800000", + "3fb23062 3ee4fa30 3f59c9c3 3f5207ad be43ab28 3f7b92bd 3eadd36f -> 00000000 3f58d878 00000000", + "3f9aa94a 3e0249fa 3e839cd0 3f9d0472 3aeafb47 3aeafb47 3f9781d2 -> 00000000 00000000 3f800000", + "3ec6c996 be5dfc83 3ec4f805 3ec4f805 3d3cf9de 3f02323c 3f74d5f3 -> 00000000 3e7560ec 3ebf8af6", + "3f9d416e 3f8749cd 3f8989b8 3f8989b8 3e9d9952 be67cf40 3e9d9952 -> 3f800000 00000000 3f800000", + "3e8a3262 3f32cf28 3e86c31d 3f32cf28 3eaaad5d 3f7e424a 3f7e424a -> 3f21df3a 3e861182 3f32aad0", + "3f8acc16 3eecb1f4 bcf3c303 3f8e6398 3dd92b2b 3f0ad215 3f293a6f -> 00000000 00000000 3f800000", + "3f81222a be1fb190 3f0ce49d 3f64ec10 3f3c006d 3f753bba 3f3d6c89 -> 00000000 3f07caeb 3f5b4a7a", + "bd740692 3e9b4a05 3f8475d8 3e9b4a05 3f916637 3f8ea463 3f8ea463 -> 3e986076 3f800000 3e98d76a", + "3f98b1a7 3f514ea3 3f28f596 3f28f596 3dc1b93f 3f45f05a 3dc1b93f -> 00000000 3f08ace0 00000000", + "3f3905a4 3f095155 3f1f58e6 3f93aa7a be7df306 3f87bfde 3f014977 -> 00000000 3f236630 3f800000", + "be8ce0be 3f4e95b3 3f6e75af 3f128b37 3eff55d6 3d49318d 3dc43615 -> 3f549318 3f7218e1 3f2859ab", + "3ee5da8c 3f121f97 3f121f97 3f89176b 3f87851f 3f7225b2 3f7225b2 -> 3f14f268 3f0f6342 3f800000", + "bcd4b445 3f9e5a2c 3f90ef5f 3f9e5a2c 3f0c3969 3f8f05d3 3e55e9e0 -> 3f800000 3f800000 3f800000", + "3fb08e21 3f01b007 be148549 3f01b007 3f000000 00000000 3f400000 -> 00000000 00000000 3e7cd258", + "bee340f5 3ee974fc 3e441d64 3eedb678 3f387a3c 3cde4e8a 3e55f137 -> 3f0417fa 3edee546 3f1a7f16", + "3eb93b1e 3f80dccd 3f80dccd 3eee0859 3e0ead26 bd75fe4c 3f9204e6 -> 3f800000 3f800000 3efb4f34", + "3e780d6c be07d0ce 3ebae656 3ddb4c67 bcae41a9 3ecebed2 3f1a9aa7 -> 00000000 3e8405b6 3c49c740", + "3dfb1bde 3f93a62a 3f93a62a 3f6bbed2 3f980dd6 3dfbc928 3f7f85f6 -> 3f800000 3f800000 3f6bbda3", + "bd1bc12d bd6d9be7 3f1d9cf1 3f1d9cf1 3f200c6c baba53d5 3f200c6c -> 00000000 3f2138e2 3f1efee0", + "be95cdbf 3f84be0a 3f391e52 3f84be0a 3ec8e58e 3f4ed789 3f816034 -> 3f800000 3f3ce393 3f800000", + "bd8f7d6a 3f65cf29 3f046134 3f967e6a 3f9c81d5 3f253ee5 3f253ee5 -> 3f6564e1 3f076034 3f800000", + "3f9e4466 3f60efef 3f51afed 3f51afed 3f800000 3f800000 3f800000 -> 3f60efef 3f51afed 3f51afed", + "bed6a49c be6b375f bdaf99f8 be6b375f 3f6ccc44 3ea1f9a8 3f6ccc44 -> 00000000 3e1fdc70 00000000", + "3fafefb4 3f9d4e96 be1db81c 3e58b84e 3e8cf966 3f9e1ee2 3e8cf966 -> 3f800000 3e031694 00000000", + "bedfc2af be685c8d 3eea5921 3f894067 bdec9191 bdca0e33 bdca0e33 -> 3e336544 3f22354c 3f800000", + "3fac5bf7 3f76025c 3f2dff2c 3f2dff2c 3f3e01be 3f3e01be 3f2700d0 -> 3f70b282 3f0265a5 3ecba578", + "beeac703 bdff8a13 3f8e7091 3e40374d 3cebfa4f bd7cebfd bd7cebfd -> 3e631d90 3f800000 3ee84a0a", + "3eacd89a 3f60edda 3f60edda 3f466295 3f8e1683 3eeb20c2 3f4e673e -> 3f620acf 3f59fd7a 3f425a68", + "3fb35b44 3c996d55 3f4637a8 be3de09b 3f01b47a b8b2bee0 b8b2bee0 -> 00000000 00000000 00000000", + "3d856a8c 3f3061e3 be122ce5 3f336528 3ec4fc16 3d276934 3f85b4e0 -> 3f2d0ed6 00000000 3f339df2", + "3f359374 3f35b079 3f35b079 3f46d732 3f882882 3f6dada2 3f882882 -> 3f38e746 3f31b724 3f495016", + "3f40090c 3f8fbfe3 be0b6725 3e7027f0 3f46befd 3eb945e9 3eb945e9 -> 3f800000 00000000 00000000", + "3e501f5d 3eeb5ef7 3eeb5ef7 3f68f6f9 3f4b979a 3e2c4cd5 3f4b979a -> 3edf5c80 3eb31834 3f67f6f5", + "3f764d49 3f852c96 3f80ef1a 3f852c96 3f1d1083 3f62c48a 3f66211b -> 3f800000 3f800000 3f800000", + "3f839f52 3eed3fef bde4d220 3f93cd02 3daf8862 3e46c73b 3e46c73b -> 00000000 00000000 3f800000", + "3f8d8f8b 3f8636d7 3ea43447 3f39c468 3f5e1685 3f58e219 3f58e219 -> 3f800000 3e3af558 3f2b7c38", + "3eacf5c2 bdece1ea 3f64368b bdece1ea 3eee62fc 3eee62fc 3f885432 -> 00000000 3f5e1778 00000000", + "be67d66a 3e39a68e 3edd2601 be71e2ba 3ed352a3 3ed352a3 3ebffd76 -> 3e8e0476 3eff47fe 00000000", + "3f7f36e2 3da4c8ce 3e2dea9a 3da4c8ce 3f2a8374 3e2dffb8 3e74d98d -> 00000000 00000000 00000000", + "3e9daa6e 3f198984 3f198984 3f4625e4 3eeb7d30 3f095716 3eeb7d30 -> 3f051902 3f087a1f 3f3a9b8a", + "3f85814e 3f305cd0 3f858a09 3f305cd0 3f5050af 3eca2e13 bd8f2407 -> 3f1d28ee 3f800000 00000000", + "3fa0f30b 3f596478 3a85e8c5 3f122fa5 3f2bcb42 3f509f98 3f2bcb42 -> 3f3e295b 00000000 3e897686", + "3fb5c740 3f006013 3f5069b9 3cd7867f 3e800000 3e800000 00000000 -> 00000000 00000000 00000000", + "3f8b3306 3f8548a7 3f8548a7 bd8b4b1c bd965bf3 3ecc5e66 3e1a0da2 -> 00000000 3f800000 00000000", + "3f00b28a 3f542df7 3ec8772b 3f542df7 3f5e357a bbc2c135 3e29adf3 -> 3f5110a7 00000000 3f3485d4", + "3f56f3f8 3f8fae96 3e83987f 3f0d4171 be51e772 3f00b338 3f00b338 -> 00000000 00000000 3e6c0290", + "3f849222 bd03711f be6cabfe be336541 3ef00903 bd663792 bd17bf90 -> 00000000 00000000 00000000", + "bec3220e 3e891af9 3f2fc29f 3f8a612b 3ee3df92 3e1bb703 3e1bb703 -> 3eca8d6a 3f435b90 3f800000", + "3f8ffcc4 bda9db22 be707448 bda633d2 00000000 3f800000 3e800000 -> 00000000 00000000 00000000", + "3d97e314 3f9617c0 3f90af8c 3f05689e 3e69db8b 3dd883c4 3f02e2af -> 3f800000 3f800000 3f00cc52", + "3d95127d be6259f2 3f89ee9b 3f62d498 3f10f599 be32ba8c be32ba8c -> 00000000 3f800000 3f601a7e", + "3f6acb97 3f220a65 3eb740dc 3f220a65 3ec3e62f 3f3d11c1 bd0ebd07 -> 3e1d8618 3e1f1d38 00000000", + "3f131e68 3dad491b 3f92cb22 bb5d9264 3ce11990 3f840ecd bde94234 -> 00000000 3f800000 00000000", + "3f3fb088 be3c7046 be3c7046 3f14dc67 3f850f29 3f12c6ac 3f12c6ac -> 00000000 00000000 3ec520e0", + "3f8c4879 3f146ef7 3eef78a1 3f146ef7 3e62bc52 3f483180 3e62bc52 -> 00000000 3e99ebd4 00000000", + "3f82b16b 3f958db9 3f8e098c 3f8e098c 3c49ed1c 3c49ed1c 3e0d1765 -> 00000000 00000000 3f800000", + "3f227372 3f80958e 3eb8efc6 3f4534b5 3f800000 3f800000 00000000 -> 3f800000 3eb8efc6 3ebe374c", + "3f0fce88 3f4528ba 3f1bd82e 3f1bd82e 3f677773 3f3adb4a 3f677773 -> 3f41cfac 3f09ee40 3f16255a", + "3e5e0472 3eb08f39 3f67d3cf 3e18eb98 3e3fe0d6 3e3fe0d6 3f80d108 -> 3e51a39c 3f62a85b 3e1a1f98", + "be6e4bc8 3f22e534 3e00e054 3e5a48c3 00000000 3e800000 00000000 -> 3f3478bc 3e82f1e6 3eb9318e", + "3f73ec33 3f927f60 3f3bb9b1 3f3bb9b1 3f7b2f3c 3e67d57a 3e1d0acc -> 3f800000 00000000 00000000", + "bed61612 3f6d66b8 3f6d66b8 3f8ad86f 3f8be9ca 3f8f5ceb 3f8f5ceb -> 3f6ca5ec 3f6c6b24 3f800000", + "bea525d7 bd9de056 be3b87db be3b87db 3f9d7174 3f018942 3f9d7174 -> 00000000 00000000 00000000", + "be4a053a 3e3bb95e 3f919c12 3f8fd177 3e8c6b86 3e0843ac 3f4eb816 -> 3e923b6e 3f800000 3f800000", + "3e11fbd8 3e58f788 3f0dabbb 3f0dabbb 3f000000 3e800000 3f800000 -> 3e1b0684 3efff750 3f0dabbb", + "3f4eefec 3f91170c 3f91170c be1b2f61 3f000000 00000000 00000000 -> 3f800000 3f800000 00000000", + "3f201d55 3e1515a6 3f9d1860 3e1515a6 be7508c5 be7508c5 3f3f4678 -> 00000000 3f800000 00000000", + "3f997dda 3eafcc54 3f869bf1 3f869bf1 3f8ab171 3f8ab171 3ebe4a30 -> 3ece6948 3f800000 3f800000", + "3ef38d18 be6b397a be3fdef2 3f09c3d1 3cdf5594 bdb65ebc bdb65ebc -> 00000000 00000000 3d2ad1f0", + "3e88fdd4 3e487b2f 3f9ad81c 3f9ad81c 3d75bc01 be50fcb7 3d75bc01 -> 00000000 3f800000 3f800000", + "bead2b7b 3cf6efb9 3d44668e bdfdc273 3f400000 3f800000 00000000 -> 3dd89710 3d446690 3e23fe60", + "3f7d4682 3e8a004c 3e4c069b 3f83587d 3ee2cd2d 3e0de3b6 bcc5ddb3 -> 00000000 00000000 00000000", + "3f0c06ba 3f9efabf bd4e9cd9 3e10d4f5 3f3fb15d 3f51cdd6 3f3fb15d -> 3f800000 00000000 3b995700", + "bd64658f 3f1b3778 3f1b3778 3f67d528 3ef281f6 3f80c22d 3f80c22d -> 3f1e171e 3f1b2ef0 3f67d31c", + "3f956125 3ef3cef8 3f74459e 3ef3cef8 3f25f97b 3f763a8b 3f25f97b -> 3de48588 3f73b9a4 3de48588", + "be23d518 3e3bb649 3e3bb649 be431614 3f5c7aeb 3f8e161a 3f5c7aeb -> 3e4ddfa0 3e2cb938 00000000", + "bed24721 3e3bc8e8 3e3bc8e8 3f3b62ad 3f666666 3f666666 3f666666 -> 3e5cc5f0 3e5cc5f0 3f3e179f", + "3d5c2f55 3f88938b 3f89025f 3e15333d 3e12503d bdf91411 3f1d8ab4 -> 3f800000 3f800000 3e02bb68", + "be0c5dbb 3effe395 3ed31214 3effe395 3e735854 3f507635 3ed95161 -> 3f0c0f72 3eda8a5e 3f094efe", + "be02596c 3f996f55 3f833139 3c8dcaaa 3e5e8aea 3f8c10b7 3f501bed -> 3f800000 3f800000 3d2484a0", + "3f20fbed 3f960f2d 3ebc7fc4 3f2db000 3f6be24e 3f24db87 3f6be24e -> 3f800000 3e3e5be4 3f2968a2", + "3da95147 3f0ca78f 3f2aa3be 3f2aa3be 3f6545e6 be6c549f be6c549f -> 3f0ba678 3f20f846 3f20f846", + "be7440f4 3f958aea bd530c53 3f5418d0 3e1ea323 3e1ea323 3f625f9d -> 3f800000 3dffc030 3f5546bb", + "3f506c49 be78379f 3f1081e6 3de912cc 3ea8c042 3ea8c042 be3763c0 -> 00000000 3d285a10 00000000", + "3f8e73b5 3e3c4e36 3f963c9d 3e3c4e36 3e876cd4 3e5bb6c0 3f9ff2f0 -> 00000000 3f800000 3eb8fd8e", + "3f84407f 3f2d8031 3f36a939 3f8f50a2 3f88eecb 3f88eecb 3db7f082 -> 3f330ca0 3f3b97f1 3f800000", + "3f2e31c8 3f952b24 3f952b24 3d2f92f1 3f83f707 be4451fe 3e9c2d65 -> 3f800000 3f800000 00000000", + "3ea14bed 3d1dedbe 3f85f65b 3f85f65b 3bccd147 be087076 be087076 -> 00000000 3f800000 3f800000", + "3f6fcfe3 3d91dd17 3e694c35 3f7e26de be71a84c 3f9ca169 3e7210a7 -> 00000000 3eb92314 3f798201", + "3f923033 3ea14e0b 3ea14e0b 3f27e90c 3f996914 3f98bcc8 3f393f6b -> 3ee21f1c 3ee0b716 3efe8f76", + "3f29a944 3e61a6d0 3e61a6d0 3f8ad254 3ebe4b4a 3eab88ac 3dc95a00 -> 00000000 00000000 3f800000", + "3e7c7a31 3f88d335 3e2fa627 bdba8297 3f561b42 bda070a7 3d63d10a -> 3f800000 00000000 00000000", + "3f56ccbd 3ed7494c 3ed7494c 3f1399ae 3f6fb141 3e2f60bd 3f6fb141 -> 3ec68816 00000000 3f0d7aaf", + "3f1a9574 bdf4fc39 3f10fa00 bdf4fc39 3f7b4158 3f927eb7 3f927eb7 -> 00000000 3f19e2d4 00000000", + "3f619241 3e131516 3f65b5c7 3e862250 3f162437 3dfb07a7 3f8f4d67 -> 00000000 3f0c1dee 3eaa251c", + "3e0c5993 3f41bb46 3cf1f9c9 3f41bb46 3caf3df6 3f5733da 3f5733da -> 3f3815f6 3c00e580 3f405750", + "3f2efe70 3f578eb8 3f578eb8 3e6f2a91 bde30ab8 3f1f5179 3ee0fa0e -> 3eafe376 3f497bcc 00000000", + "be826ef9 3f54b61a 3f5a051f 3f04c0fa 3b4337f4 3f4c534a 3d045d30 -> 3f5d7ab8 3f5be0a6 3f1d20b9", + "3d946146 bdb15150 bcd8195a 3f551411 3f459104 3f459104 3ec8274a -> 00000000 00000000 3f5318ce", + "3fb917c5 3d05b156 3f4bb850 3d19585d 3f980cbf 3f3f31ad 3f980cbf -> 3e750ebc 3f2d8806 3e78ebc8", + "3fa95661 3e044e09 3ef9d388 3f81af8e 3d9544fe 3f8b0e46 3f1da654 -> 00000000 3f0a5b22 3f800000", + "bd699ec3 bd2fe5db 3dcadd72 3eb77eb0 3e706429 3f3ba3e4 3e84484e -> 3a308400 3de68ba8 3ec4d3a4", + "3f10cfe1 3e99cc7b 3f549a83 3f3be7ab 00000000 3e800000 3e800000 -> 00000000 3f34a030 3f09ba2f", + "3ee2912e 3f63285c 3f303301 3f283fb3 3f800000 3e800000 3f000000 -> 3f63285c 3f088eea 3f0f5120", + "3f2082a5 3d886678 3f7cc67e 3ed9fe82 3edbb873 3f974c61 be1284b1 -> 00000000 3f7d1b0d 00000000", + "3df58c93 3f997a9a 3f997a9a 3f367dc2 3f1dd39b 3f62c54b 3e2c1ef2 -> 3f800000 3f800000 3f2e58ca", + "3ecda21f 3dadd096 3dadd096 bdd5e8e6 3ef592cd 3f8433b2 3f9e95da -> 00000000 3dc63410 00000000", + "3de7f0b0 3eb745ad be443b3c 3de1fbdb 3f371c3d 3f8dbadc 3f8ef989 -> 3eac51a2 00000000 3df9cf08", + "3f3ee0ed 3f26e7c6 3ed4e4bd 3f26e7c6 3f8249d7 3f8249d7 3f2afe29 -> 3f2813d2 3ed8d40a 3f099671", + "bedfa299 3f2084b7 3ed0376d 3f8bcf0e 3f1b0f28 3e9e2cc7 3d8cda0f -> 3f2e8bf6 3f0b537a 3f800000", + "bede1aa0 3f84a4ab 3f8f37c5 3f84a4ab 3f6b8428 3f2e8aaa 3f6b8428 -> 3f800000 3f800000 3f800000", + "3f9f2a9a 3f799bd0 3f8b0972 3f96f584 3f8b241e 3e3ef750 3f2b4f44 -> 3f7a3b9b 00000000 3f800000", + "3f2e08d1 3f450819 3f450819 3ec813dc 3e17f215 3df7425d 3df7425d -> 3ee7e686 3edacf7c 00000000", + "3f221714 3f264a8c be62eb04 3f264a8c be630173 3f702ae4 3ecebe05 -> 00000000 00000000 3edfc7c8", + "bec08dd1 be0f22ac 3e0235b1 3eb475dd 3f15f70b 3d9ff748 3f15f70b -> 3c62b340 3eb42834 3ee12508", + "bd236fa4 3f51ea71 3f51ea71 3f8ac5fc 3f94d62e 3ee92911 be161fdc -> 3f519d50 3f52e55c 3f800000", + "3f03f2f3 bd9f38d2 bd9f38d2 3e0d31d8 3e866314 3c212cbb 3ed649de -> 00000000 00000000 00000000", + "3e9eeecd 3f9994df bdb435a2 3f873f30 3ed5dfee bca86371 3ed5dfee -> 3f800000 00000000 3f800000", + "3f8dd161 3ef0dc5f 3f98e2a5 3f98e2a5 3e175855 be552b9d 3ec0d2a8 -> 00000000 00000000 3f800000", + "3e966127 3e8ae47b 3e18fdec 3e18fdec 3f803567 3f966299 3ea86b33 -> 3e8b122e 3e438ba8 00000000", + "3f2296ae 3f6f14f9 3dfb9c40 3f6b0629 3e800000 3f400000 3e800000 -> 3f5fb16a 00000000 3f57f1af", + "3f903887 3d1e36d6 bdf51b61 3ed2e385 3edf4f5c 3edf4f5c bd891841 -> 00000000 00000000 00000000", + "3f5589b8 3ee5d5df bd701cd7 bd701cd7 be2a11cb be2a11cb 3ec29f87 -> 00000000 00000000 00000000", + "3f85862a 3f9150c8 3f7ee35c 3f9150c8 3f797fff 3eb6bf12 3f949539 -> 3f800000 3f7c9f49 3f800000", + "3f4d5932 3c5ac2f6 bdaaeaaa 3efeac27 be54e484 3f68812f 3e910778 -> 00000000 00000000 00000000", + "bd95744d 3f73cc9f 3f923872 3cff1a6c 3f839bfa 3f8c4855 3f839bfa -> 3f73c62e 3f800000 3ceebcc0", + "be6fcada 3f067e76 3f04c4e5 3e72f7c6 be107c7d 3f3ff16f 3cceda3b -> 3f201d9a 3f0b9715 3ec20eaa", + "bec489d5 3db98d70 3ee44322 3db98d70 3e5bac84 3de305f7 3e5bac84 -> 3e9a410a 3f163b36 3e9a410a", + "3ec584d9 3f849929 3f42710f be54969d 3f9ccf49 3f3d46a0 3f8d76c6 -> 3f800000 3f3b8f5c 00000000", + "3faa4750 3f1fb417 3f69c31f 3f9027d3 3f99c83a 3f99c83a bde4cf7b -> 3f340db6 3f6e762f 00000000", + "3e93cdb6 3f96b9f7 3f96b9f7 3f4cb8b2 3ec357de 3da0df85 3b7a7c56 -> 3f800000 3f800000 3f3805c2", + "bd9d0c32 3f8cae6c 3f321fb9 3f321fb9 3ebb871d 3f750dda 3d23ccd4 -> 3f800000 3f3260e0 3f3776bc", + "3f95a6e8 3e2b6647 3e52f34b bd85b6bd bdbd8d77 3f934b6e 3f44e596 -> 00000000 3ea662b4 00000000", + "3f609c5d be7824b3 3ebb0f0b 3f8e8c34 3ee80184 3e9026ba 3f8b7940 -> 00000000 00000000 3f800000", + "3e3b1c16 3f811b27 3f811b27 bdd036b6 3f1fe3a2 3cc2cd46 3f23d416 -> 3f800000 3f800000 00000000", + "3f58d3a2 3f98c438 be3716b7 3f16d1ac 3f8fc96f 3f9b3c28 3f85da99 -> 3f800000 3a9d6000 3f1abdc8", + "3f5e705e 3f7fd85e be260ac2 be57b547 3eecf873 be33af2e bdc035aa -> 3f7fb5ad 00000000 00000000", + "3ec70826 3ca2d311 3ca2d311 3da2693f bcbca8c1 3ee98685 3f140480 -> 00000000 00000000 00000000", + "be138235 3f9e5a0e 3e04b8ab 3f86177f 3f400000 3f000000 3f800000 -> 3f800000 3e409a74 3f800000", + "3effddb2 3f271589 3f9e99c3 3f271589 3f5d5c1f 3df19fdf 3f9cbf0d -> 3f20a2ae 3f800000 3f300e6b", + "3ebee576 3f38412d bd88f05e 3f38412d 3f859d89 be4f06c3 3f97e191 -> 3f3968c3 00000000 3f3cebb7", + "3f5a8949 3eb5984d be0d3557 be0d3557 3f8749c1 bddc63e9 bdf32100 -> 3ec4e8fc 00000000 00000000", + "becdebd9 3e7505f0 3f710edc 3e7505f0 3f0db730 3f6db4a7 3f0db730 -> 3eb5cc60 3f7179ba 3eb5cc60", + "bea7d926 3d8bb4a2 3f94ac79 3d8bb4a2 3e2a43fc 3e14bb88 3f184357 -> 3e8954a6 3f800000 3e35bdd0", + "3f8541de 3ced6515 be4a71aa 3f9d2be3 3e800000 00000000 3e800000 -> 00000000 00000000 3f800000", + "3f91ea52 3e6b8ae2 bd894935 3f1886dc 3f5fed44 bd9fd7f4 3f54bdad -> 3dd057b8 00000000 3effad80", + "3f9102a8 3f29a912 3ea82bce be6ba89a 3e800000 3f000000 00000000 -> 00000000 00000000 00000000", + "3fa290b6 3e0c0e29 3c69fd6c 3e0c0e29 3eedac87 3f4d358d 3e008083 -> 00000000 00000000 00000000", + "bedab384 3f690e2f 3f690e2f 3e832d09 3f5aedae 3f5aedae 3ea3e0b8 -> 3f6a645a 3f6a645a 3ed8e2da", + "3f2a4631 be34dea3 be34dea3 3f89934a 3e340af9 3eaf83ec 3ebd2f21 -> 00000000 00000000 3f800000", + "3f000000 3fc00000 40000000 40400000 bf800000 bf800000 bf800000 -> 00000000 00000000 00000000", + "40000000 3fc00000 3f000000 40200000 3f000000 3f000000 3f000000 -> 00000000 00000000 00000000" + ] + }, + { + "function": "cycles_mix_hue", + "node": "ShaderNodeMix RGBA HUE", + "cases": [ + "00000000 00000000 00000000 00000000 3f5c8ef7 3f5c8ef7 3e012ad4 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3e410065 3e84b484 3e410065 -> 00000000 3e000000 3e000000", + "3f800000 00000000 00000000 3f000000 3f800000 3f800000 3f400000 -> 3f000000 3f000000 00000000", + "3fc00000 00000000 00000000 3f400000 3f9e2bcd bd45bca7 3f905870 -> 3f900000 00000000 3f27c5ce", + "bf000000 00000000 00000000 3f800000 3f2e44d7 3ea2e5a7 3f2e44d7 -> bf000000 00000000 3f800000", + "3e800000 00000000 3e800000 00000000 3f89fe44 be261d77 be261d77 -> 3d800000 3e400000 00000000", + "3f400000 00000000 3e800000 3e800000 3f3c96fa 3f930d87 3f949688 -> 00000000 3e7a9234 3e800000", + "40000000 00000000 3e800000 3f000000 bc76ddc3 3f92715a 3f805ad7 -> 00000000 3f400000 3ec19508", + "00000000 00000000 3e800000 3f400000 3f912baa 3ea6bcdf be701995 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3f2cc276 be29c0da be57e3b2 -> 3f000000 3e1a0bbc 3f000000", + "3f800000 00000000 3f000000 00000000 3e800000 00000000 00000000 -> 3f000000 00000000 00000000", + "3fc00000 00000000 3f000000 3e800000 3e8fa11f 3ef9ad66 3ebc1f5f -> 00000000 3f000000 3e423848", + "bf000000 00000000 3f000000 3f000000 3df4290d 3df4290d 3daee425 -> be800000 3f000000 3f400000", + "3e800000 00000000 3f000000 3f400000 3f649a08 bdc0786d 3d248ca4 -> 3e400000 3ec00000 3f168643", + "3f400000 00000000 3f000000 3f800000 3f0f4ff2 be52c9fb be52c9fb -> 3f400000 3e000000 3e800000", + "40000000 00000000 3f400000 00000000 3e9a8f30 3e9a8f30 3ebca872 -> 00000000 bf400000 3fc00000", + "00000000 00000000 3f400000 3e800000 3f85c550 bddd2079 3f39f283 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 be139176 be57c863 bde75e3a -> 3e82d7c0 3ec00000 3f200000", + "3f800000 00000000 3f400000 3f400000 3f8da1c1 3f5fddb8 3e6ae3ec -> 3f400000 3f0d35e0 00000000", + "3fc00000 00000000 3f400000 3f800000 3d5d0280 3f9a2dbd 3d5d0280 -> 00000000 3f900000 bf000000", + "bf000000 00000000 3f800000 00000000 3f770492 3ed756e3 3ed756e3 -> bf000000 3fc00000 00000000", + "3e800000 00000000 3f800000 3e800000 3f8aac49 3f6a8540 bc0451c0 -> 3e800000 3f7630d6 3e400000", + "3f400000 00000000 3f800000 3f000000 3ea4fcca 3ea4fcca 3ef088b3 -> 00000000 3e800000 3f600000", + "40000000 00000000 3f800000 3f400000 3f400000 3e800000 3f000000 -> 40000000 bf800000 3e800000", + "00000000 00000000 3f800000 3f800000 3f5b9c00 3edeeb12 bdd5d88b -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3f544ea1 3e0ec9c6 3f03510e -> 3e800000 00000000 3d8a9a40", + "3f800000 3e800000 00000000 3e800000 3ed7d6a0 3f0235be 3f0235be -> 00000000 3e800000 3e800000", + "3fc00000 3e800000 00000000 3f000000 3f765e84 be5c7747 3eec1bf7 -> 3f200000 00000000 3e392220", + "bf000000 3e800000 00000000 3f400000 00000000 00000000 3f400000 -> 3ec00000 00000000 3f400000", + "3e800000 3e800000 00000000 3f800000 00000000 3f000000 3f000000 -> 3e400000 3e800000 3f800000", + "3f400000 3e800000 3e800000 00000000 3f598dc5 be1b1a6a 3f81d7c3 -> 3e64e58a 3d800000 3e400000", + "40000000 3e800000 3e800000 3e800000 3e1e2cc7 3e0ce7f4 3e0ce7f4 -> 3e800000 3e800000 3e800000", + "00000000 3e800000 3e800000 3f000000 3f7a37e3 3f2acae2 3f2acae2 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 bd48c9c6 3e69e699 3f9890a3 -> 3e800000 3e9c9e08 3f400000", + "3f800000 3e800000 3e800000 3f800000 3f55bf69 3f55bf69 be1f1f9e -> 3f800000 3f800000 3e800000", + "3fc00000 3e800000 3f000000 00000000 3f31bd00 3ea242f1 3f0d211f -> 3f200000 be800000 3eee7c40", + "bf000000 3e800000 3f000000 3e800000 3f46db2b 3edd2797 3f46db2b -> 3e000000 3f200000 3e000000", + "3e800000 3e800000 3f000000 3f000000 be005867 3edac02a 3eb7997b -> 3e800000 3f000000 3efc0635", + "3f400000 3e800000 3f000000 3f400000 3f800000 00000000 00000000 -> 3f200000 3ea00000 3ec00000", + "40000000 3e800000 3f000000 3f800000 3f89569a bdf5526e 3f89569a -> 3fe00000 00000000 3f800000", + "00000000 3e800000 3f400000 00000000 3e9640aa 3d385f01 3dec6657 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f658a63 3f658a63 be7028ed -> 3f000000 3f400000 3e800000", + "3f800000 3e800000 3f400000 3f000000 3f89d537 3f026215 3f7551dc -> 3f400000 3e800000 3f254390", + "3fc00000 3e800000 3f400000 3f400000 3f545332 3f18ddf9 3f23a4eb -> 3f800000 00000000 3e0b346c", + "bf000000 3e800000 3f400000 3f800000 3f000000 00000000 3e800000 -> be000000 3f800000 3f980000", + "3e800000 3e800000 3f800000 00000000 bcde0178 bcde0178 3f398040 -> 3e400000 3f400000 3e800000", + "3f400000 3e800000 3f800000 3e800000 3f038422 3ddc21ef 3f038422 -> 3f500000 3ee00000 3f500000", + "40000000 3e800000 3f800000 3f000000 3f534135 3ecbc51e 3f534135 -> 3fe00000 bf000000 3fc00000", + "00000000 3e800000 3f800000 3f400000 00000000 3f000000 3f800000 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3c1e14c8 3ea97d34 3ed162b5 -> 3e800000 3f6d4420 3f800000", + "3f800000 3f000000 00000000 00000000 3d96f147 3f293289 3d96f147 -> 00000000 3f000000 00000000", + "3fc00000 3f000000 00000000 3e800000 be4ad512 be4ad512 3f9db033 -> be800000 00000000 3f200000", + "bf000000 3f000000 00000000 3f000000 3f000000 3f400000 00000000 -> 3f155555 be800000 3f400000", + "3e800000 3f000000 00000000 3f400000 3f61e165 3e9557c8 3f61e165 -> 3f100000 00000000 3f400000", + "3f400000 3f000000 00000000 3f800000 3eef1c4b 3f566c04 3f566c04 -> 3e000000 3f400000 3f800000", + "40000000 3f000000 3e800000 00000000 3f9d9300 3df4c337 3df4c337 -> 3f000000 be800000 00000000", + "00000000 3f000000 3e800000 3e800000 3f000000 3f000000 3f000000 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3f89bbbd 3f006d60 3f89bbbd -> 3f000000 3e800000 3f000000", + "3f800000 3f000000 3e800000 3f400000 3ed3ac50 3dcdbfae 3ed3ac50 -> 3f400000 3e7fffff 3f400000", + "3fc00000 3f000000 3e800000 3f800000 3ea5bc07 3f82d7a7 3f5e8257 -> 3e000000 3fb00000 3f40e78c", + "bf000000 3f000000 3f000000 00000000 be001f12 be4f3f89 be001f12 -> 3f000000 3f400000 be800000", + "3e800000 3f000000 3f000000 3e800000 3f3e8c66 3f3e8c66 3f9f923b -> 3ee00000 3ee00000 3ea00000", + "3f400000 3f000000 3f000000 3f000000 be22fc3d bddbe2ab bddbe2ab -> 3f000000 3f000000 3f000000", + "40000000 3f000000 3f000000 3f400000 3f928333 3f33cff2 3f877219 -> 3f800000 3efffffe 3f26f9b4", + "00000000 3f000000 3f000000 3f800000 3f89d949 3eb0de0c 3f89d949 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f000000 3f800000 3f000000 -> 3e800000 3f400000 00000000", + "3f800000 3f000000 3f400000 3e800000 3f734627 3e3a769f 3f43a70d -> 3f400000 3e800000 3f21011c", + "3fc00000 3f000000 3f400000 3f000000 3f7eae7a 3f7eae7a 3ed8c4c1 -> 3f600000 3f400000 3efffffe", + "bf000000 3f000000 3f400000 3f400000 3f800000 3f400000 3f000000 -> 3ec00000 3f500000 3f600000", + "3e800000 3f000000 3f400000 3f800000 3f11f5ec 3f5f606a 3dfc3f58 -> 3f131643 3f500000 3f600000", + "3f400000 3f000000 3f800000 00000000 3f720f0b 3e25a0e0 3f720f0b -> 3f600000 3e800000 3f400000", + "40000000 3f000000 3f800000 3e800000 3f800000 3f800000 3e800000 -> 3fc00000 3f800000 3e800000", + "00000000 3f000000 3f800000 3f000000 3f2116a4 3ec61146 3ec6eada -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3f7aca0a 3ef7f362 bd704f97 -> 3f400000 3f617768 3f200000", + "3f800000 3f000000 3f800000 3f800000 3f400000 3f400000 00000000 -> 3f800000 3f800000 3f000000", + "3fc00000 3f400000 00000000 00000000 3e7813ac 3f46812d 3ebf94b2 -> bec00000 3f900000 3e8e85b8", + "bf000000 3f400000 00000000 3e800000 3d20ef5e 3d20ef5e 3f50832e -> 3f900000 00000000 00000000", + "3e800000 3f400000 00000000 3f000000 3ef4d0df 3f776c44 3f980af5 -> 3f100000 3e041e30 3f100000", + "3f400000 3f400000 00000000 3f400000 3ee0d4b8 3f84de7b 3f9111f2 -> 3e400000 3ef874f4 3f400000", + "40000000 3f400000 00000000 3f800000 3e800000 3f000000 3f800000 -> bf400000 3f2aaab0 3f800000", + "00000000 3f400000 3e800000 00000000 3f1ebf6c 3f87f2d5 3f87f2d5 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f9b6f2e 3f8c8b0e 3f85a4ee -> 3f400000 3ea886a6 3e800000", + "3f800000 3f400000 3e800000 3f000000 3f800000 00000000 3e800000 -> 3f400000 3e7fffff 3ec00000", + "3fc00000 3f400000 3e800000 3f400000 3f19ca82 3e3e97ea 3f19ca82 -> 3f400000 3e7ffffe 3f400000", + "bf000000 3f400000 3e800000 3f800000 be2dc564 3f042843 be2dc564 -> 3f800000 be000000 3fb00000", + "3e800000 3f400000 3f000000 00000000 bdddede6 bdddede6 3f96fc74 -> 3f100000 3ec00000 3e400000", + "3f400000 3f400000 3f000000 3e800000 3f86c0a6 3e8afaf3 3e8afaf3 -> 3f400000 3ea00000 3e7fffff", + "40000000 3f400000 3f000000 3f000000 3f2aaaab 3f2aaaab 3f2aaaab -> 3f400000 3f000000 3f000000", + "00000000 3f400000 3f000000 3f400000 3ef61bdf 3f1d1865 3eb34a9c -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3eb70633 3ef3f37b 3eb70633 -> 3f200000 3f400000 3f400000", + "3f800000 3f400000 3f400000 00000000 3f3f84b8 3f00f480 3f71604f -> 3ed5b310 00000000 3f400000", + "3fc00000 3f400000 3f400000 3e800000 3eb3d827 3f2ce81b 3eb3d827 -> 00000000 3f400000 3e7ffffe", + "bf000000 3f400000 3f400000 3f000000 3eb9e16e 3e832a5c 3eb9e16e -> 3f400000 3f600000 3ec00000", + "3e800000 3f400000 3f400000 3f400000 3f9ac362 3f91873b 3efd0b22 -> 3f400000 3f400000 3f400000", + "3f400000 3f400000 3f400000 3f800000 3f7f3732 3f93359d 3f44cb74 -> 3f5cb977 3f700000 3f500000", + "40000000 3f400000 3f800000 00000000 3f4b79c6 3f4b79c6 be495396 -> 3fa00000 3f800000 00000000", + "00000000 3f400000 3f800000 3e800000 3eb6d54c bd20344b 3f8748c5 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f3653ac 3f82a934 3f66b482 -> 3f200000 3f800000 3f2731ea", + "3f800000 3f400000 3f800000 3f400000 3f876c44 bdc91b53 3e09cb07 -> 3f800000 3f400000 3f4ce260", + "3fc00000 3f400000 3f800000 3f800000 3f23b2b2 3f23b2b2 3f229828 -> 3f900000 3f800000 3f200000", + "bf000000 3f800000 00000000 00000000 3eefcc29 3f8417f9 3d2c70c6 -> 3fa470dc bf000000 00000000", + "3e800000 3f800000 00000000 3e800000 3f6dd03f 3f2d7c21 3f2d7c21 -> 3f800000 00000000 3e400000", + "3f400000 3f800000 00000000 3f000000 3f48838a 3ef01c8f 3ef01c8f -> 3f800000 00000000 3e000000", + "40000000 3f800000 00000000 3f400000 3f400000 3e800000 00000000 -> 3f800000 3f2aaaaa bf400000", + "00000000 3f800000 00000000 3f800000 3f9c2c50 be0446ec 3f492021 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f93b03f 3d20058d 3f93b03f -> 3f800000 3e000000 3f000000", + "3f800000 3f800000 3e800000 3e800000 be800000 be800000 be800000 -> 3f800000 3e800000 3e800000", + "3fc00000 3f800000 3e800000 3f000000 3ec9272e 3f678303 3f6ea35f -> be000000 3fa89129 3fa00000", + "bf000000 3f800000 3e800000 3f400000 3eeaa7e0 be263cc1 3f21deab -> 3f8a8285 3e800000 3f200000", + "3e800000 3f800000 3e800000 3f800000 3ef3ca30 3f9eec65 3f9eec65 -> 3f500000 3ee00000 3f800000", + "3f400000 3f800000 3f000000 00000000 3f1f3eb2 3f0a2525 3f1f3eb2 -> 3f800000 3e000000 3f400000", + "40000000 3f800000 3f000000 3e800000 3f48b43f 3f48b43f be5a6df6 -> 3f800000 3fc00000 3e800000", + "00000000 3f800000 3f000000 3f000000 3f13526c 3ecd7ae9 3e838c39 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 be645e03 be645e03 3e2b3b49 -> 3f400000 3f000000 3f600000", + "3f800000 3f800000 3f000000 3f800000 3f9631f0 bb13ee4a 3f6b94a0 -> 3f800000 3f000000 3f646fd4", + "3fc00000 3f800000 3f400000 00000000 3ed29519 bdabfd87 3f5f3de8 -> 3e8dde80 bec00000 3fc00000", + "bf000000 3f800000 3f400000 3e800000 3e908472 3f83a04f 3f1479ff -> 3fb00000 3f200000 3dcd85a8", + "3e800000 3f800000 3f400000 3f000000 3ed1fbba bd1edf07 3f702d35 -> 3f6eb423 3f300000 3f200000", + "3f400000 3f800000 3f400000 3f400000 3f57bc23 3eee8b82 be6c1792 -> 3f800000 3f5f25ea 3f400000", + "40000000 3f800000 3f400000 3f800000 3de4490a 3f3fa82c bd8e00bd -> 3f1c4ad4 3fa00000 3f000000", + "00000000 3f800000 3f800000 00000000 3eff5f9c 3eff5f9c be7c5f7b -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 00000000 3f000000 00000000 -> 3f200000 3f800000 3e800000", + "3f800000 3f800000 3f800000 3f000000 3e370d21 3ebd30a6 3f98481c -> 3f000000 3f1826de 3f800000", + "3fc00000 3f800000 3f800000 3f400000 00000000 3f000000 3e800000 -> 3f200000 3f800000 3f700000", + "bf000000 3f800000 3f800000 3f800000 3f96b974 3f0573b8 3f96b974 -> 3f800000 3f800000 3f800000", + "3e800000 00000000 00000000 00000000 3e177365 3ef621d7 3f558a30 -> 00000000 00000000 00000000", + "3f400000 3e800000 3e800000 3e800000 3f85ee27 3f69db4d bd30e6db -> 3e800000 3e800000 3e800000", + "40000000 3f000000 3f000000 3f000000 3f400000 00000000 3f000000 -> 3f000000 3f000000 3f000000", + "00000000 3f400000 3f400000 3f400000 3f4e0195 3df0f664 3f8820ae -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f393f54 3f8cb42d 3f393f54 -> 3f800000 3f800000 3f800000", + "3f800000 3fa00000 3fa00000 3fa00000 3d8335d2 3e3a44ab 3f31fb08 -> 3fa00000 3fa00000 3fa00000", + "3fc00000 be800000 be800000 be800000 3f23f5bf bce3cbb8 3f23f5bf -> be800000 be800000 be800000", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3e00ff3f be7029f4 3e6ca672 -> 3dcccccd 3dcccccd 3dcccccd", + "3e800000 3f666666 3f666666 3f666666 3e0c8eef 3eaa526d 3f1024cf -> 3f666666 3f666666 3f666666", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3eec3889 3f8661fa 3ec01c06 -> 3eaaaaaa 3eaaaaaa 3eaaaaaa", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f92d3f1 3f2c2c21 3f7dc234 -> 3f2aaaab 3f2aaaab 3f2aaaab", + "00000000 3f8dc5fe 3f8dc5fe 3dee0640 3f082441 3caf26df 3d43612e -> 3f8dc5fe 3f8dc5fe 3dee0640", + "3f000000 3ef51ec2 3ef51ec2 3f4d4c9a be27b643 3e518481 3e518481 -> 3ef51ec2 3f23edfe 3f4d4c9a", + "3f800000 3f2fbb91 3f25e6f4 3f0d8373 bd9c2027 3f0dd11a bd9c2027 -> 3f0d8373 3f2fbb91 3f0d8373", + "3fc00000 3f801471 3f6bd037 3f538dcf 3f88d90f 3f6bfc58 3f8f6168 -> 3f6ef170 3f476c9c 3f8b3b36", + "bf000000 3f9b180c 3f23afaa 3f9b180c 3f01cb86 3f22ac7d 3ded653b -> 3fa425ea 3eb4dee6 3fbfb828", + "3e800000 3c8cc334 3f3068d8 3c8cc334 3ea748ce 3f96e18c 3f96e18c -> 3c8cc338 3f3068d8 3e3d9b24", + "3f400000 3e37bd51 3f432f9b 3f4d1d47 3f3753d0 be122419 be4e3801 -> 3f2551ca 3eb5c367 3eab75a2", + "40000000 3f9e9192 3f9e9192 3e2bccfb 3e800000 3f800000 3e800000 -> bf673ca8 3f9e9192 3e2bccf1", + "00000000 bd918b9c 3c967677 bd918b9c 3f80f303 3f80f303 3f6965ef -> bd918b9c 3c967677 bd918b9c", + "3f000000 3e08ed19 3daa6f97 3e08ed19 bce61f84 3f910223 3f910223 -> 3dde24e5 3dde24e4 3e08ed19", + "3f800000 3f32bc16 3f84f95c 3f32bc16 be16bff8 3e889a4b 3e538ef3 -> 3f32bc16 3f84f95c 3f7d4438", + "3fc00000 3ea7cc73 3f567d20 3f567d20 3f0fd7db 3f9bbfc7 3f0fd7db -> 3ea7cc76 3f567d20 3d94d638", + "bf000000 bd9f5229 bd8be004 bd9f5229 3e0dd8eb 3f72632f 3e81f515 -> bd9f5229 bd8be004 bda0b536", + "3e800000 3dfc3d01 3dfc3d01 3f2e03ae 3ddb0b1d 3f8d6a9e 3ddb0b1d -> 3dfc3d00 3e864d47 3f0a64aa", + "3f400000 3f2e5ba1 3f2e5ba1 3e9946df 3f1045de 3edf1205 3f86f12d -> 3ee870e6 3eca22f8 3f15ed94", + "40000000 3ea8f2b4 3ea8f2b4 3ec6a4d2 3f8e9b7e 3f433977 3f8e9b7e -> 3ee456f0 3ea8f2b4 3ec6a4d2", + "00000000 3f06c783 3f06c783 3f93b1d1 3f605222 3f96fc57 3f96fc57 -> 3f06c783 3f06c783 3f93b1d1", + "3f000000 3f6d57e0 3f9ff936 be76f7e3 3eb25889 3f90e2c3 3eb76d2a -> 3eaf99e6 3f9ff936 be6d4d1b", + "3f800000 3e360dc4 3eb191d3 3f7d5d3f 3f4e0eaa 3f4e0eaa 3f133e9b -> 3f7d5d3f 3f7d5d40 3e360dc4", + "3fc00000 be17ae11 3f53a066 be788e9f 3df65ea6 3f764b04 3d640dfb -> be33e3ef 3f53a066 be788e9e", + "bf000000 3f6b7f5e 3f9c7269 3f6b7f5e 3f8f8baa 3f870b70 3f710c93 -> 3f44cca4 3fa39786 3f6b7f5e", + "3e800000 3f2053e2 bcc16c28 3f911a7b 3e0a8728 3f6c58f2 3f6c58f2 -> 3eed7822 3e88096a 3f911a7b", + "3f400000 3e8a6a38 3f7f4eb9 3f7f4eb9 3ebd1e62 3e3b0411 3cb828e1 -> 3f50c852 3f342bd0 3ee77706", + "40000000 3f39246c 3f898d49 3f19395b 3f792006 3f7d350e 3f792006 -> 3ef29c90 3f898d49 3f193959", + "00000000 3d2b9b68 3f477721 3d2b9b68 3e497fcb 3e497fcb 3efa0743 -> 3d2b9b68 3f477721 3d2b9b68", + "3f000000 3f7b3d5d 3f7b3d5d 3f5d01d7 3f7db730 bcc33ec1 bcc33ec1 -> 3f7b3d5d 3f6c1f9a 3f5d01d8", + "3f800000 3f91eb8a 3f936abd 3f93a795 bd7b7f19 3f65419c 3f65419c -> 3f91eb8a 3f93a795 3f93a795", + "3fc00000 bd907db0 bd907db0 3f67f2c5 be28d037 3eb19864 bdcc7f46 -> bd907db4 3fb27a01 bebedafe", + "bf000000 3f94f5a4 3dd82e4e 3f94f5a4 3d09b727 3f861dbd 3f861dbd -> 3fd8af04 bed8d9ea 3f94f5a4", + "3e800000 bbe06e23 3f85acb2 3f8905bc 3f7ce703 3f7ce703 be618312 -> 3e866471 3f8682f4 3f4d1863", + "3f400000 3f865379 3dd896cf 3eedef11 3d031f13 3f0b8e3e 3f0e2bf9 -> 3eaeefc0 3f4cb831 3f673b18", + "40000000 3dc4de2c be7f9511 3e90a291 3e2da5d7 3f96ee2a 3eea138f -> bf18664e 3f5087d6 bef50043", + "00000000 3f8f7fb5 3f68715c 3f9c4608 3ed79302 3ed79302 be195b31 -> 3f8f7fb5 3f68715c 3f9c4608", + "3f000000 3f9b71f2 3f4c837b 3f4a9bfb 3f6527aa 3f6527aa 3f643ddc -> 3f9b71f2 3f80d9d8 3f4a9bfb", + "3f800000 3f188e36 3d300c6d 3f091a9c 3f8bd95f bdc808e2 be7beaa8 -> 3f188e36 3dd5844b 3d300c70", + "3fc00000 3e002ec3 bda084c2 bda084c2 3db9b4d9 3e8a8b66 3e64c1ab -> be387af3 3e686755 3e166125", + "bf000000 3f8b24ca 3f46afc0 3f46afc0 bdc3271b 3ee695a4 3e6c94ff -> 3f9f0b3f 3f1ee2d6 3f2ee242", + "3e800000 3eceb74b 3eceb74b 3f6bbe0a 3f797d19 3ec4c145 3f9495a1 -> 3f008415 3eceb74c 3f6bbe0a", + "3f400000 3ea58f3e be6bb238 bd91f45d 3f46f967 3f01bf0f 3f01bf0f -> 3ea58f3e be6bb237 be430434", + "40000000 bdbf7334 3f91ac1f 3f9adff4 3f000000 3e800000 3f000000 -> 4020db8d bfa99a87 3f9adff4", + "00000000 3f62c65d 3f9804a6 3f0172b9 3e5d302f 3f485038 3e3480f4 -> 3f62c65d 3f9804a6 3f0172b9", + "3f000000 3ef82770 3f59396c 3ef82770 3f7d3e08 3f45b6bc be1d6fcf -> 3f2aa692 3f5062c3 3ef82770", + "3f800000 3f55dab5 3f4c9b3d be7e5718 bd864cc7 bdbceedb bdbceedb -> 3f55dab5 be7e571c be7e5719", + "3fc00000 3dc3fe7b 3dc3fe7b 3f2c6f3c 3eefbd2d be7a064b 3f6781f1 -> 3f222513 3dc3fe75 3f2c6f3c", + "bf000000 3f392ff7 3eb8abf5 be58cf39 3f471daf 3f49c7c2 bd150129 -> 3f3ab2b8 3e37a3f1 be58cf3a", + "3e800000 3f46978f 3e9f6897 3e9f6897 3e5608c0 3e6b41c6 3e73ec1d -> 3f28debe 3ec99e36 3edada39", + "3f400000 3cfecdb7 bdc27dc4 3cfecdb7 be2b2aa2 3f88e754 be03d703 -> bd81f178 b9d8de00 bd77dc10", + "40000000 bd13401c bd13401c 3f9576da 3f0a4822 3f0a4822 3f8abad6 -> bd134010 bd134010 3f9576da", + "00000000 3e461815 3f096bbc 3ed43a61 3f3f1018 3e489c71 3f3bb790 -> 3e461815 3f096bbc 3ed43a61", + "3f000000 3e63a426 bd9e3991 3f93a677 3f3fe657 bd9383a3 3daf49ca -> 3f301afc bd9e3990 3f27fb90", + "3f800000 3ee8ca58 3f396316 3ee8ca58 3ec747f1 3f17e1db 3ec747f1 -> 3ee8ca58 3f396316 3ee8ca58", + "3fc00000 be3d3868 be3d3868 be7305b3 3f5b3a56 3f5b2586 3f5b2586 -> be3d3868 be86f62c be7305b3", + "bf000000 3f1cb304 3f3e0511 3c043f86 3e39c639 3e39c639 3e984230 -> 3f6a0407 3f8dff8d beb7d217", + "3e800000 be1040d8 be1040d8 3e2774de 3f02ac7b 3cc8dba4 3eacf647 -> bd84a6d5 be1040d8 3e0bc5b6", + "3f400000 3e8ae4fa 3eba1412 3f6c0599 3e481869 3f5ef21e 3f29ad04 -> 3e8ae4f9 3f4846b5 3f458931", + "40000000 3cba2165 3dc4140b 3e162459 3f6026f5 3f2c376b be2b417f -> 3e8a8243 3e18e144 bdcf3800", + "00000000 be6a2024 3ee9a845 3f69c6a6 3f1b8db7 bbdccfa2 3f4e581d -> be6a2024 3ee9a845 3f69c6a6", + "3f000000 3f2bf084 3ee8fb2a 3ee8fb2a 3e13400a 3ed84799 3e13400a -> 3f10370d 3f10370c 3ee8fb2a", + "3f800000 3e974014 3cb60830 3e974014 3f000000 3f800000 3f800000 -> 3cb60830 3e974014 3e974014", + "3fc00000 3eb05a6f 3eb05a6f 3dd17b78 00000000 3f400000 3f400000 -> bc99eeb0 3eb05a6f 3eee5838", + "bf000000 3f24d4de 3f24d4de 3da90741 3f59f017 bd4e98bb 3d284584 -> 3f24d4de 3f6caed9 3d5d6157", + "3e800000 3ee992be 3f64004b 3ee992be bcb65b25 bda60e38 3f5f6c1e -> 3eed00a2 3f483290 3f10971a", + "3f400000 3d8f2702 bdeeed64 3d8f2702 3e93ce48 3f90c25b 3f6c3269 -> bd8f684a 3cbe87a0 3d1092a9", + "40000000 bd8a1c64 bdddbbf3 bd8a1c64 3e9c1629 3f8a1eaa 3f8a1eaa -> be18adc1 bcd9f354 bd8a1c64", + "00000000 3ed1132a 3f856f04 3eb70be8 00000000 3e800000 3f000000 -> 3ed1132a 3f856f04 3eb70be8", + "3f000000 3f7633a8 3e90c360 3e90c360 3f943dc4 3f772a35 3f44ce53 -> 3f7633a8 3ee894c7 3e90c360", + "3f800000 3d99a522 3f16b00e 3d99a522 3f7a3bd6 be38221a be2bd297 -> 3f16b00e 3d99a520 3da49250", + "3fc00000 3e19f651 bd629a5e bd629a5e 3f62963e 3eab36de 3f91f30f -> 3d57c49c bd629a5b 3e81a262", + "bf000000 3ed6dcfc 3f7cdabf 3b400a9b 3efb622e b8e88eae 3efb622e -> 3e0ae176 3fbd740c befa9a9f", + "3e800000 bd7dcd0e 3f16a34f bd7dcd0e 3f1f1dcf 3f1f1dcf 3f3be51f -> bd7dcd0e 3eda068e 3dce19b9", + "3f400000 3f2c84f5 3f9b1422 3d977416 3e275b9c bdd01964 bd08d82a -> 3f89dfb8 3eb779e4 3e964537", + "40000000 3f9351b2 3e9881b6 3ebc84f2 3f9100a2 3f59932e 3ef6536f -> 3f9351b2 3fa1b4a0 3e68fcf0", + "00000000 3e41d670 3f832b34 3ec13346 3ebea6f4 be590043 3d744323 -> 3e41d670 3f832b34 3ec13346", + "3f000000 bc4b7c65 be537a70 3f39046e 3d4399ca 3f0a6482 3d4399ca -> bde03235 3e8425d2 3e8425d2", + "3f800000 3f16b6a3 3f34d863 3f92066c 3f45394f 3f45394f 3f91e46c -> 3f16b6a3 3f16b6a3 3f92066c", + "3fc00000 3f523e4f 3ef10803 3ef10803 3daba927 3f7c6370 3f9beeda -> 3e974db6 3f638abe 3f7f1b76", + "bf000000 bd4bc8b7 3e31c2db 3e31c2db 3e800000 3f400000 3f800000 -> bd4bc8b8 3e57e108 3e31c2db", + "3e800000 3df052fd 3df052fd 3f979a24 be3f5609 be045183 bd53f487 -> 3df052fe 3e6cb0f5 3f979a24", + "3f400000 3eb9e547 3cd8fdbd 3eb9e547 3f55ea76 3f8ba88e 3e65d810 -> 3e93cb3d 3e8ecfec 3de294dc", + "40000000 bdef8b2e bdabb52a 3f2c2a0b 3ebd7d54 3ebd7d54 3eb0b62b -> 3fbb22be 3fb6e55d bf680cd5", + "00000000 3edc9f36 3e04b454 3f9ea5f7 3f4ebefb 3d9085ec 3d9085ec -> 3edc9f36 3e04b454 3f9ea5f7", + "3f000000 3f9a7253 3f377552 3f377552 3f666666 3f666666 3f666666 -> 3f9a7253 3f377552 3f377552", + "3f800000 3f9dd7bb 3f9dd7bb 3f874e1e 3eec0375 3eec0375 3f85a053 -> 3f874e1e 3f874e1e 3f9dd7bb", + "3fc00000 3ea25f05 be30d8de be30d8de 3f2275b9 3f1832b3 3f1832b3 -> 3ea25f05 be30d8de be30d8de", + "bf000000 bd5289e0 3dfa80d5 3f82e20e be1a47cb be1a47cb bd30a978 -> bd5289e2 3e5631dc 3f82e20e", + "3e800000 3e35f9e2 3e35f9e2 3ed24efe 3f20bb6e 3ec964c3 3e7b5676 -> 3e71a2e8 3e4d0cca 3eb47a7b", + "3f400000 3e0f1d3a 3e8b01bd 3f8a1a8b 3dbee69c 3f3ec02d 3f3ec02d -> 3e0f1d37 3f608808 3f8a1a8b", + "40000000 3ceb92c6 3f1a95a5 3f840459 3f8933b1 3f8d387a 3f8d387a -> 3ceb92ba 3fbabde0 3f840459", + "00000000 3de40f93 3f5ef2c9 3f46f824 3f8017d8 3dbd7a78 3f8017d8 -> 3de40f93 3f5ef2c9 3f46f824", + "3f000000 3f3d64d6 3f627bc2 3f9a7e33 be0fe9fa 3f831ac2 3f4a790b -> 3f3d64d6 3f85de0a 3f9480e4", + "3f800000 3f9d94dc 3f98f2a9 3f98f2a9 3f000000 3f400000 3e800000 -> 3f9b43c3 3f9d94dc 3f98f2a9", + "3fc00000 bc40d0e0 3e461ce9 3efc0d46 3f4c654b 3d3039ca 3f302a47 -> 3f3e8b96 bdea440e 3ec38a0b", + "bf000000 3f3320cb 3e1b375b 3f3320cb 3f2ed4ee 3f2ed4ee 3ec9fab2 -> 3f3320cb bdfadd1a 3f794a45", + "3e800000 bdd3c691 3f9939c4 3f984a15 be2580ff be2580ff 3e236100 -> bdd3c691 3f5f3872 3f988601", + "3f400000 3eab59e7 3ddde866 3f70aad5 bb7c8ffc 3ef089e7 bb7c8ffc -> 3e28e41b 3f3b6f63 3ea1f0fe", + "40000000 3f062bca be1c0390 3f460111 3ebcca4f 3ebcca4f 3f2c84b9 -> bf542d92 be1c038e 3f460111", + "00000000 3e29cc10 3e29cc10 3f99c654 3e539d45 3f0b614a 3e539d45 -> 3e29cc10 3e29cc10 3f99c654", + "3f000000 bdca5ba2 3d27d9e7 bdca5ba2 3e43e86f 3d7a0db0 3e43e86f -> bcecdd5c bcecdd5e bcecdd5c", + "3f800000 3cacc988 3f82a1a3 3cacc988 3df29147 3f91a2cf 3f91a2cf -> 3cacc986 3f82a1a3 3f82a1a3", + "3fc00000 3ee37da7 3f8783b2 3efdafd6 bd633187 3f5b58a7 3f5b58a7 -> 3ee37daa 3f8783b2 3fab8f90", + "bf000000 3f4d200b 3d9ef305 3f724ae8 bd33b786 3e297266 3f3a0369 -> 3f94e070 bd25957e 3f724ae8", + "3e800000 be5527ff bd7b36cc be5527ff bceea48b 3ebdfd7e 3f71c3d4 -> be5527ff bda9e114 be2f916c", + "3f400000 be1bed92 3f6de12e 3d96efe4 3e800000 3f800000 3f800000 -> be1bed93 3f6de12e 3f372062", + "40000000 3ef11e88 3de3a21d 3de3a21d 3f400000 3f400000 3e800000 -> 3ef11e88 3f54aa45 3de3a21d", + "00000000 3e9c3327 be3c13bd 3f14d0f2 3f7b663d 3f7b663d 3f986105 -> 3e9c3327 be3c13bd 3f14d0f2", + "3f000000 3f18e38f bd8be10d bd8be10d 3e800000 3f800000 3f000000 -> 3e87676d 3e87676e 3d2e9272", + "3f800000 3f00548c 3f0f602b 3f0f602b 3f542ae8 bdd9f889 3eb92627 -> 3f0f602b 3f00548c 3f07dc30", + "3fc00000 3ea58026 3f9971b4 3ea58026 bd0c6276 bd775df0 bd775df0 -> 3fd17a8a bdea8cc0 3ea58024", + "bf000000 3e735b92 3f8d88d0 3e735b92 3f975906 3f5af7cd 3f975906 -> be4919e6 3fc5177f be4919e6", + "3e800000 bdf00ca3 3ed3ae61 3c0d28a0 bd40df8d 3f427e68 3f148f14 -> bdf00ca2 3ed3ae61 3da47dff", + "3f400000 3b27f1d8 3f1ccf74 3effedc5 3f506e58 3f8a42d9 3f2ff41a -> 3e19e8ab 3f1ccf74 3e01eeb8", + "40000000 3f49959d 3ec6e0ef 3eae50a9 3d5b9690 3d5b9690 be766209 -> 3f49959d 3f97dd61 3eae50a7", + "00000000 3f7622e5 3f0df1ca 3f0df1ca 3f515499 3f460143 3f515499 -> 3f7622e5 3f0df1ca 3f0df1ca", + "3f000000 3f10988c 3ef3ac33 3e054d52 3f8111dd 3f8111dd 3f3fb519 -> 3f10988c 3f053753 3e054d52", + "3f800000 3f512ab0 3f8b5305 3f512ab0 3f418935 3f89c431 3f89c431 -> 3f512ab0 3f8b5305 3f8b5305", + "3fc00000 be20463e 3f75a9a5 3f75a9a5 3f94a2bc 3f94a2bc 3eb1fc24 -> 3fc2439f 3f75a9a5 bf36ef29", + "bf000000 3f52dde4 3ecaf81c 3ecaf81c 3e90b777 3f1ade3e be25b6e3 -> 3f69daec 3e3b2c8c 3ecaf81c", + "3e800000 bd8285a4 bd8285a4 3f2893e5 be3822a7 be11f652 3f9d03d9 -> bd8285a5 bd71712e 3f2893e5", + "3f400000 3f2aedfc bdf9afd9 3da1680c 3e071e45 3e071e45 3f6888fc -> 3d9a9818 bdf9afd7 3f053dbd", + "40000000 3f61dde9 3f5541e1 3f5541e1 00000000 3e800000 00000000 -> 3f48a5d9 3f6e79f1 3f5541e1", + "00000000 3f8763ea 3f6e1257 3ca36007 bd213ec5 3f926545 3f926545 -> 3f8763ea 3f6e1257 3ca36007", + "3f000000 3f83f3b1 3f9a46bf 3e3a67c0 3f01c95a be4f7a55 be4f7a55 -> 3f8f1d38 3f3193b7 3e3a67c0", + "3f800000 be4b2c86 3f001170 be4b2c86 3e28f24c 3e0d6550 3db1e864 -> 3f001170 3e84ee3f be4b2c8a", + "3fc00000 3e6c3e01 bd01a142 3f80c534 3f06f5c3 3ea265e0 3f8a0ec8 -> 3e88706d bd01a146 3f80c534", + "bf000000 3f52e0bb 3f68be5e 3eabdd6e bdf3dea1 bdf3dea1 3ecb2c87 -> 3f88acde 3f991319 3d486e38", + "3e800000 3f977686 3f19b158 bda03ee9 bd419d74 3f48ec2f 3f48ec2f -> 3f5e2fd2 3f3f0045 3e72d576", + "3f400000 3f1dc0eb 3e98b3fe 3f3cd594 be486fc3 be486fc3 3ea45544 -> 3ec16775 3e98b3ff 3f3cd594", + "40000000 3f967a97 3e2e954f 3e0dac98 3f9a26a9 3f4c9e86 3e97b588 -> 3f967a97 3fa0b108 3e0dac94", + "00000000 3f35424a be3c19e8 3f4cd840 be2f81e4 3f161e52 3ea1c9dd -> 3f35424a be3c19e8 3f4cd840", + "3f000000 3f73fab5 3f93b039 3deb6f6e 00000000 3f400000 3e800000 -> 3f08b451 3f93b039 3e93820a", + "3f800000 3ef732ef be43ec32 3ef732ef 3f400000 3e800000 3f800000 -> 3e842549 be43ec31 3ef732ef", + "3fc00000 3eda2b0f 3e1c5a0a 3e1c5a0a 3f991bec 3f813f58 3e8b3679 -> 3eda2b0f 3ef5cf96 3e1c5a0c", + "bf000000 3f1542f6 3f2aaa69 3ed82b35 3ef772cd 3f6312aa 3f943846 -> 3f29d9a4 3f373b95 3e999666", + "3e800000 3f8b7953 3d4f971f 3d4f971f 00000000 00000000 00000000 -> 3f8b7953 3d4f971f 3d4f971f", + "3f400000 3f6b7db3 3f6b7db3 3f884739 3e051c82 3f4d7918 3e051c82 -> 3f6b7db3 3f83a521 3f74c1e3", + "40000000 3f4f4cc5 3f242e39 3eded93f 3f829954 3ecd2485 3ebfbcd4 -> 3f4f4cc5 3e84e22c 3eded93f", + "00000000 3f690221 3d7ca4f3 be4844fa 3f04afad 3e68b8fb 3f04afad -> 3f690221 3d7ca4f3 be4844fa", + "3f000000 3f529171 3df00906 3df00906 bd180b16 3f77c029 bd180b16 -> 3ef09292 3ef09292 3df00908", + "3f800000 3f134e01 3f3a8ca7 3d9b0b3d 3d852138 3f858f81 be4c5cf7 -> 3e5bd9d8 3f3a8ca7 3d9b0b42", + "3fc00000 be2e6071 3e220cdc 3eabcf09 3ef13d86 3ef13d86 be478622 -> 3f16a756 3ed93356 bed8afdb", + "bf000000 3ee3c64a 3f9685ab 3f9685ab 3f3f7d8f bdf201c0 3f3f7d8f -> 3da27864 3fc54fb7 3f9685ab", + "3e800000 3f5c8288 3e443291 3ec238e9 3ee5f6e1 3ed41e80 3ee5f6e1 -> 3f5c8288 3e443291 3effebf3", + "3f400000 be25a15e be25a15e 3ed36782 3f960ce2 3f4ae7a8 3f904032 -> 3e89d975 be25a15c 3eb91216", + "40000000 3f931c9c 3e3b7b88 3f7d9133 00000000 3e800000 3e800000 -> bf487b74 400764e4 3fa7709e", + "00000000 3e892631 3e892631 3f15c395 3e517ff4 3e8b6a01 3e27fa13 -> 3e892631 3e892631 3f15c395", + "3f000000 3f56508e be0d6bb8 3efcfb54 be1fc9fe 3ede16e6 3ede16e6 -> 3eb2f5a0 3eb2f5a0 3f2a671c", + "3f800000 be045198 be045198 3eb1bebd 3f68a129 3f27eb03 3f27eb03 -> 3eb1bebd be045198 be045198", + "3fc00000 3f2d9e4b 3f45441e 3f2d9e4b bc2b2a15 3da95136 bc2b2a15 -> 3f2d9e4b 3f45441e 3f2d9e4b", + "bf000000 3deeeaa7 3f1336b5 3f1336b5 3f9c5bc8 3f9c5bc8 3f5518d5 -> bde67ad9 3f1336b5 3f4de365", + "3e800000 3f7d0752 3f67a978 3f6a1940 3f4d9df7 3e97ec6d be75318b -> 3f7d0752 3f6a68ae 3f697d4e", + "3f400000 3f4a3b63 3f49b451 3f49b451 3f5193a0 3f9723b2 3f5193a0 -> 3f49d616 3f4a199e 3f49b451", + "40000000 be4157b2 3e9c317d be4157b2 3f78b4a4 3ed49580 3f13bde5 -> 3f4c876a bf2ec498 3dca16ac", + "00000000 3f880b45 be23561f 3f609e24 3f96da50 3f507ec6 3de52171 -> 3f880b45 be23561f 3f609e24", + "3f000000 bdf4f8d1 bdf4f8d1 3ecb8a7f 3eaaaaaa 3eaaaaaa 3eaaaaaa -> bdf4f8d1 bdf4f8d1 3ecb8a7f", + "3f800000 bdeda6d0 3eca6d4a 3f1e2299 3f000000 3f800000 00000000 -> 3e806dbe 3f1e2299 bdeda6d8", + "3fc00000 3ed8f44f 3f798b74 3f8e4b3e bdb3eb36 be5b3c64 be5b3c64 -> 3fba5253 3e17c608 3da35ff0", + "bf000000 3f1e7a2f 3db6acb9 3f1e7a2f 3f4bd2ee 3f3e4b63 3f3e4b63 -> 3f1e7a2f 3db6acb8 3f624c7b", + "3e800000 3f6f26e4 3f6f26e4 be2f1a51 3f3d7f26 3f71d0f4 3f71d0f4 -> 3f286b86 3f6f26e4 3dd7a64e", + "3f400000 3f30ae30 3f38c3d1 3ecd595f 3f9a220d 3dc94dee 3f9a220d -> 3f36be69 3ef664f0 3f243e08", + "40000000 bcefa8eb 3f9621db 3f9bee3f 3f33a9b3 3f24163a 3f24163a -> 401dcd91 bf9d9f23 bfa36b87", + "00000000 3eb57543 3eb57543 be1c3527 3dd6fe02 3d80b33f bcd89f34 -> 3eb57543 3eb57543 be1c3527", + "3f000000 3f0cc336 3f5eff46 bd8fa6d6 3ec65c2d be4837df 3ea1af4d -> 3f35e13e 3ecd0a6c 3eaf6eca", + "3f800000 3ea5c042 3f1dc4f7 3de7b7be be7fcd18 be7fcd18 3f2859d2 -> 3de7b7c0 3de7b7c0 3f1dc4f7", + "3fc00000 be176c55 3e12d812 3e12d812 3f0c1d8b 3f17d712 3f17d712 -> be176c58 3e12d812 3e12d812", + "bf000000 be194568 3f1a3ea6 3f999ea6 bd74af3a 3f9bc34c bd74af3a -> be194566 3e9b7ea6 3ff00250", + "3e800000 bdb43098 be5a7788 3f4f7099 3f8a2ff7 3f14904e 3f8a2ff7 -> 3e0bde60 be5a7789 3f4f7099", + "3f400000 3f9d0cdd 3ecdd3fd 3f98617a 3f3e2674 3f40088e 3f40088e -> 3f1bb5ed 3f82a6e6 3f9be204", + "40000000 3f319381 3f93f69e 3f5d17c2 3e9d464e bdb0aa5d be677e91 -> 3fcf237c 3ef2915c 3f060f40", + "00000000 be5eb9bb 3f7e0adb 3f54553b 3f7d0c1b 3f7ca3aa 3f3bbf4d -> be5eb9bb 3f7e0adb 3f54553b", + "3f000000 3ce824c9 3f94b8c6 3ed81bc0 3d097675 3f325262 be2648a0 -> 3e216a2e 3f94b8c6 3e669e0c", + "3f800000 3f4abc5a 3f0f99af 3f0f99af be761580 3f425024 3e78ee63 -> 3f0f99af 3f4abc5a 3f2c34aa", + "3fc00000 3f1cf809 3f6b9954 3e1c5ea8 3f39c139 3f39c139 3f21bd53 -> 3f8974fd 3f6b9954 3e1c5ea6", + "bf000000 3e7c9501 3e7c9501 3c5563cb 3f000000 00000000 3f400000 -> 3e923a65 3eba1a32 bdd4924b", + "3e800000 3f5de73e 3f5de73e 3f8e7c04 3ee2e481 3f24128b 3ee2e481 -> 3f5de73e 3f6dab70 3f8699eb", + "3f400000 3f6c4d49 3f6c4d49 3ed5f18a bda18137 3f953548 bda18137 -> 3f0b4de6 3f6c4d49 3ed5f18a", + "40000000 3c25073b 3f907f3e 3f907f3e bbcfd6ec 3f2b46c8 3f927bfd -> 3c2506d9 3e5175f8 3f907f3e", + "00000000 3f6faec4 3f2991df 3eb4fc39 3f9933e3 3f9933e3 3e05e5cf -> 3f6faec4 3f2991df 3eb4fc39", + "3f000000 3f1d1852 3e97a76f 3efff6ed 3f31c33b 3f61001d 3f61001d -> 3ee8ec0a 3ee8ec0a 3f0e89e4", + "3f800000 bdd08c48 bd845641 3f9767d7 3f86f417 3f98ef07 3e26680d -> 3f810776 3f9767d7 bdd08c50", + "3fc00000 3f25c7b5 3f4d8730 3ee3aa4d 3f000000 3f800000 3f400000 -> 3eafb7be 3f4d8730 3f369aae", + "bf000000 3f029578 3f029578 3e922b22 3f000000 3f000000 00000000 -> 3f029578 3f029578 3e922b22", + "3e800000 3f220fa1 3f220fa1 3ea2252f 3f585bf7 bbe0d5f3 3f26f18d -> 3f220fa1 3f0dd05f 3ec17718", + "3f400000 3e193f8a 3ecd6b56 3f03c9f8 3f8b5d08 3f8b5d08 3f607b09 -> 3ed8d6e5 3ef909ca 3e76b9a0", + "40000000 3f62ea2d 3f62ea2d be31f720 3ef54891 3f4f45b0 3f03e810 -> bf9df2de 3f62ea2d 3d6ee9c0", + "00000000 3f46b943 3e7dbb29 3f46b943 3f6266b2 3f04fcdb 3f04fcdb -> 3f46b943 3e7dbb29 3f46b943", + "3f000000 3e927fa6 3e18ec92 3e5e2ff2 be63b406 3f4b181f 3f9ebd69 -> 3e5ef5ef 3e49904a 3e80cbd0", + "3f800000 3e444bdc 3e51f7c9 3e444bdc 3d0c4cb2 3f21c797 3f21c797 -> 3e444bdc 3e51f7c9 3e51f7c9", + "3fc00000 3f111490 3efa3e7e 3efa3e7e 3f915f85 3f74a47b bdc8d84b -> 3f111490 3f16b08a 3efa3e7e", + "bf000000 bb64eeb8 3f9b11b5 3f710c26 bd497681 3eb38ce2 3f93e269 -> bb64eeda 3fcf0390 3f4e8084", + "3e800000 3f96abb1 be5596bb 3f96abb1 3e5eab00 3eae1823 3ec0b339 -> 3f54a81e 3d70212c 3f96abb1", + "3f400000 3f58ac66 3d3b2963 3d3b2963 bda9f12b bda9f12b 3ecd4a0f -> 3e7bc428 3d3b2964 3f256df2", + "40000000 3f9a795e 3f9a795e 3f7e365d 3f2f44c3 3f8fb3bb 3eaf4227 -> 3f778030 3f9a795e 3f7e365d", + "00000000 3f96b3af 3eda77ce 3f9fece5 3c227d02 3f942573 3e566aec -> 3f96b3af 3eda77ce 3f9fece5", + "3f000000 3f101e4d 3f3f40b5 3f101e4d 3f400000 00000000 3f400000 -> 3f27af81 3f27af81 3f27af81", + "3f800000 3f495a3f 3eba743f 3e6686a0 3cdf00f5 3f9c4c21 3f7bf641 -> 3e6686a0 3f495a3f 3f2cd700", + "3fc00000 3e6dc6ad be410941 3e6dc6ad 3f2f1fca 3f2f1fca 3ee4a6fe -> 3e6dc6ad 3ee29752 becc389c", + "bf000000 3f64a4e7 3f337bbd 3f337bbd 3f12c2b8 3f1d342a 3f6b90ff -> 3f7d397c 3f3097c3 3f1ae728", + "3e800000 3d5f4028 3f7b0742 3d5f4028 3f400000 3f800000 3f800000 -> 3d5f4024 3f7b0742 3e9271a5", + "3f400000 3d0112b8 3e87516c 3f523468 3f8a5185 bd0aa82e 3f61eb01 -> 3f1fab98 3db7b872 3f374100", + "40000000 3f193013 3f27153a 3e915288 3f993400 3f9767b2 3f94fb4c -> 3f34fa61 3ead4c20 3e915288", + "00000000 3f294e6f 3f294e6f 3dca18ef 3ef3ae12 3e9093c5 3f13623e -> 3f294e6f 3f294e6f 3dca18ef", + "3f000000 3ec4560a 3f0e9ddd 3ec4560a bd69f75c 3f7d7dbe bd69f75c -> 3ec4560a 3f0e9ddd 3ec4560a", + "3f800000 3f4c8dbc 3f83c05b 3f2eb91b 3f93dba8 3efec996 3ec5098d -> 3f83c05b 3f3bb90c 3f2eb91b", + "3fc00000 3f915e0e 3f5c2e18 3f915e0e 3f000000 3e800000 00000000 -> 3f915e0e 3f888c4e 3f38e716", + "bf000000 bd71e8f2 3f877ce4 3d7e61bd 3f27a7b6 3eb7a07b 3f27a7b6 -> bf1e2abb 3fcf02fa bedf4774", + "3e800000 3ec849db 3f96cef2 3e1ca44c bcb0b241 3f80cb38 3f80cb38 -> 3ea9cbee 3f96cef2 3ed18c8e", + "3f400000 3e8c62aa 3e8c62aa bce109fd 3ef19db8 3f41157f 3f41157f -> 3d446194 3e8c62aa 3e4b8baf", + "40000000 bd15d415 3f71d5ad 3f2c1f4c 3f19d774 bdb28c0c 3f19d774 -> 3ff6844d bf824818 3f9bc607", + "00000000 3dbf700b 3cc4464d bde1fb54 3f12483f 3f5d1f0e 3f12483f -> 3dbf700b 3cc4464d bde1fb54", + "3f000000 3f920689 3f59ed62 3eef77a2 3f824b65 3f824b65 3f99e024 -> 3f4de472 3f28d49a 3f4de472", + "3f800000 3ee148f1 3ca836c2 3e762bf3 3e99bb45 3dbceba9 3ef10cf6 -> 3e8086f4 3ca836c0 3ee148f1", + "3fc00000 3f824cf7 3f8bd057 3f824cf7 3eb5dd40 3d42fbed 3ed9b5a7 -> 3f8decbc 3f7b168e 3f909207", + "bf000000 3f8c917a 3ea7c478 3f8c917a 3f800000 3f800000 3f800000 -> 3f8c917a 3ea7c478 3f8c917a", + "3e800000 3f6fc80d 3e25b698 3f45df4e 3f90c4eb 3f90c4eb 3e1d67ae -> 3f6fc80d 3eb60880 3f1ec2e4", + "3f400000 3ed3d372 3f49c348 3f424d30 3f91deef 3e1ad217 3ee47bf9 -> 3f31cce4 3f01e01d 3f157857", + "40000000 3ee0a457 3f268dfe 3f268dfe 3f0f2f7e 3e86127f 3f0f2f7e -> 3f5cc9d0 3e685968 3f268dfe", + "00000000 3f8ef184 be4143ac 3da38411 3db408da 3e379388 3e0a79b4 -> 3f8ef184 be4143ac 3da38411", + "3f000000 3f6f2745 3ea8573a 3ea8573a be5a864b be4599d3 be5a864b -> 3f21a971 3f21a971 3ea8573a", + "3f800000 3e76c631 bdf94686 3ea9165f 3f8ce0e2 3f8ce0e2 3f84deb5 -> 3ea9165f 3ea9165e bdf94684", + "3fc00000 3f38d08a 3f38d08a 3f60651d 3e8df904 3f6f25ca 3f5323ea -> 3f38d08a 3f742f66 3f5681bc", + "bf000000 3e5d56e7 3f9d9db9 3d8cfb82 3dc29d3b 3ec07694 3dc29d3b -> 3e9461bd 3f9d9db9 3d8cfb82", + "3e800000 3f865247 3f989893 3f7a570f 3f818323 3f25bb6f 3f25bb6f -> 3f8ae3da 3f91bd50 3f7a570f", + "3f400000 be4b3fc4 3f0084d4 3eafcfc2 3f8b7fe2 3e6cf9b0 3f8b7fe2 -> 3ea75f46 bcbf5800 3eecbb2e", + "40000000 3de7a022 3f1ae3d4 3f1ae3d4 3f05ac28 3edcfa98 3edcfa98 -> 3f8c69d2 bec1f798 bec1f798", + "00000000 3eeb97c4 3f3c4f7d 3f3c4f7d 3e800000 3e800000 3f000000 -> 3eeb97c4 3f3c4f7d 3f3c4f7d", + "3f000000 3f4bdf84 be707cab be707cab 3f22ec3e bd3d7fb8 3ea42fb4 -> 3f4bdf84 be707ca9 3d2d3a94", + "3f800000 bd1719cc bdc7004a bdc7004a bd012908 3f6ca93f bd012908 -> bdc7004b bd1719cc bdc7004b", + "3fc00000 be645007 be645007 3f35bfe6 bdd7f225 3dadf185 3f7848ef -> be645007 3ccb1348 3f35bfe6", + "bf000000 3e7c13b2 3e7c13b2 3f22d385 3e862d9f be4c5b2a be4c5b2a -> 3d51da04 3e7c13b2 3f54bad1", + "3e800000 be72b06e 3e5d7a09 3f38a2d5 3e294271 3f5c4be4 3e294271 -> be72b06d 3eaf5f2e 3ef69e32", + "3f400000 bdad5937 3f7e31a6 3e84d2a6 3f400000 3f400000 3f800000 -> bdad5934 3e3d3034 3f4f3f91", + "40000000 3e31ac57 3e31ac57 3f9fee2d 3f3d3a24 3f8a1fd3 3f3d3a24 -> 3e31ac57 4014d367 bf67062e", + "00000000 3f95e73e 3d649f4f 3f95e73e 3f63e55e 3e72312f 3e72312f -> 3f95e73e 3d649f4f 3f95e73e", + "3f000000 bdcfab45 3f01aac6 3e6f225c 3f052323 3f3d3144 be584ab0 -> 3e07b220 3f01aac6 3d874cb8", + "3f800000 3f1f613f be351c21 3f242456 3ede039d 3e9013cb 3f869795 -> bc7883c0 be351c20 3f242456", + "3fc00000 3ea0a565 bdac3076 3e10d256 3f97c6da 3e4236a5 3f58aef3 -> 3ea0a565 bdac3076 3e495a4a", + "bf000000 bd4b5aa3 3f4eb20f 3c6da1b7 3f8fd5f0 3f83c9dc 3f83c9dc -> bef4d30d 3f9e32f6 3d3ec9f3", + "3e800000 bd22984e bde53fc9 bde53fc9 3ed13395 3e3a7434 3f7c95cd -> bd57be8d bde53fc9 bdc042e0", + "3f400000 3edfbe0f 3f42c77b bcf070c7 3f41b5c8 3f95c809 3f0f2126 -> 3e8ec72c 3f42c77b bcf070ba", + "40000000 3e8fa20a 3f19210b 3f19210b 3f8f0017 3f8f0017 bd42aa0f -> 3f6a7111 3f19210b bd17f010", + "00000000 3ebf274b 3f6481a5 3ee6dede 3f400000 3f800000 3f000000 -> 3ebf274b 3f6481a5 3ee6dede", + "3f000000 be57e035 bdcb68cb 3f8df149 3f000000 3e800000 3f800000 -> 3c15c3c0 be1eca50 3f8df149", + "3f800000 3f84e4ed 3f3f45d9 3f84e4ed 3f7aac12 3f7aac12 3f8115be -> 3f3f45da 3f3f45da 3f84e4ed", + "3fc00000 3f689a64 3dcdecd0 3f689a64 3eba83e3 3eba83e3 bdd6fa08 -> 3f689a64 3fa80465 be9b6198", + "bf000000 3f8c011f 3f8686be 3f8686be 3eb35b39 3f998b38 3f998b38 -> 3f8ebe50 3f83c98e 3f83c98e", + "3e800000 3e4df090 3f7869ab 3d0471dd 3f50ca59 3e6a831d 3f50ca59 -> 3ec96f0c 3f3c6108 3e889f82", + "3f400000 3e06501c bc2ba2d7 3dd22a91 3f10e448 3f9785db 3f10e448 -> 3ccc4328 3dc41b13 3c91cd84", + "40000000 3f3d949f 3f3d949f 3f1fdfe1 3f21798d 3d8b43bc bdb83d04 -> 3f3d949f 3f0f3099 3f1fdfe1", + "00000000 be10cc1a 3ed5fdf6 3f4f0d01 3dde0248 3f014d16 3f014d16 -> be10cc1a 3ed5fdf6 3f4f0d01", + "3f000000 bc1b63aa bc1b63aa 3e0c9ac2 3f400000 3f000000 3e800000 -> 3d82e488 3cdef023 3d82e487", + "3f800000 be4b71fb 3e080e7d 3e63d35f 3f7b5f7c 3ec0d973 3f7b5f7c -> 3e63d35f be4b71fb 3e63d35f", + "3fc00000 be779e01 3eb9a38b be779e01 bd53cbf0 3f605982 3f605982 -> be779e04 3eb9a38b 3f2a2e69", + "bf000000 be109356 be59c8df be59c8df 3f755e2e 3f062bb9 3f8580c1 -> be0a9ce6 be59c8df be7e63a4", + "3e800000 3f822da9 3f94079d 3f822da9 3efb104f 3efb104f 3f760922 -> 3f822da9 3f8f9120 3f86a426", + "3f400000 3e318692 3f0df26d 3f751a8b 3e5e89fe 3f7f3788 3e5bac41 -> 3e33ae10 3f5b5084 3ebd1fbe", + "40000000 3eb4fc06 3eb4fc06 be561180 3eed02ba 3efeda7f 3e907881 -> 3e2fbddc 3eb4fc06 be56117e", + "00000000 3f6efcff 3e492d0c 3f6ca6c3 3f3c14e7 be2d82d2 3f3c14e7 -> 3f6efcff 3e492d0c 3f6ca6c3", + "3f000000 3f63a779 3f769ff6 3f769ff6 3e0825b6 3e0825b6 bd4aa5e8 -> 3f6d23b8 3f769ff6 3f6d23b8", + "3f800000 3ea5500f 3ea5500f 3f5d74b8 3f9cfc30 3f98aefa 3f9cfc30 -> 3f5d74b8 3ea55010 3f5d74b8", + "3fc00000 bd81f8c4 3f47ceb8 3f967a6c 3d403461 3ebee6f4 3f21dfa6 -> bd81f8b6 3f0ca416 3f967a6c", + "bf000000 3f84e986 3e7be101 be58a9ee 3e01ee8a 3e01ee8a 3e45505e -> 3fd4e8e8 3ef3133c bf562940", + "3e800000 3edb81fb 3f945010 3ed9693d be22e431 3ee45109 3f0a454f -> 3edafbcb 3f9125fc 3f1baf7f", + "3f400000 3e67aa8e 3cacb6c9 bd866543 3f840ffd 3f37c02b 3f088ad0 -> 3e67aa8e 3d17c13e bd866543", + "40000000 3f7121c4 3f382447 3d83cdee 3c06ad2f 3e67e819 3e67e819 -> bf502e48 3f950fa0 3fe8e4e5", + "00000000 3f7dae37 3eaea6a1 bdbfcf8a 3e629725 3eee940c 3f583aec -> 3f7dae37 3eaea6a1 bdbfcf8a", + "3f000000 3f406d13 3cf8f4a7 3f406d13 3f8b0f51 3f6b85d6 3f6b85d6 -> 3f406d13 3cf8f49e 3ec834b8", + "3f800000 3f9ba6f8 3f9ba6f8 3df714c2 3f7a786d 3e20c5ab 3e20c5ab -> 3f9ba6f8 3df714c0 3df714c1", + "3fc00000 be02adcd 3f91f90d 3e4ff124 3f8dee0e 3f8507db 3f8507db -> 3fe32070 bf42fa3a be95fea2", + "bf000000 3f1deced 3f0e461a 3f1deced 3f7cb4a3 3f8b827e 3f8b827e -> 3f25c056 3f0672b0 3f1deced", + "3e800000 3eaa4fd5 3f279f6f 3f5a9852 3e800000 00000000 3f000000 -> 3ecbabef 3f13018e 3f5a9852", + "3f400000 3e1b9a65 3f52b221 3f22184f 3f2e0df3 3f4c96d4 3f2e0df3 -> 3e1b9a65 3f52b221 3e8b660d", + "40000000 3f98d2eb 3f98d2eb 3dad8edd 3ebdd92c bdd3d829 bdd3d829 -> 3f98d2eb bf83210f 3dad8edd", + "00000000 3eaa9408 3f5cfc91 3f71826c bd24b6c2 bd24b6c2 3f8be532 -> 3eaa9408 3f5cfc91 3f71826c", + "3f000000 3f19ea14 3f8b81c2 be36289e 3e800000 3f800000 3f400000 -> 3e58bfd8 3f8b81c2 3e7a9456", + "3f800000 3f863eb0 3f863eb0 3f1dfa02 3f93d6d5 3f5d3efb 3f93d6d5 -> 3f863eb0 3f1dfa01 3f863eb0", + "3fc00000 3f94d60d 3f9931eb be119275 3f124677 3f8a77ae 3f077078 -> bf240cb8 3f9931eb be11927c", + "bf000000 3f00a65c 3f594bea bdc34c3f 3e800000 3f800000 00000000 -> 3f2ef7a0 3f594bea bdc34c40", + "3e800000 bd8185cb 3e649145 be2e5407 3e2995ad 3f9af199 3f9af199 -> bdb84e5c 3e649145 bd933568", + "3f400000 bc9b2f73 bc9b2f73 3edf1c4b be0d5007 bbc9b38f 3f4702eb -> bc9b2f69 3cf732f9 3edf1c4b", + "40000000 3f4f29b3 be24f425 3e1a89d2 be780edf 3f687bb2 be0c32e6 -> bf90d1e4 3fe3c837 be973f11", + "00000000 3f25d9b3 3f328d6a 3f4f570c 3e8248d9 3e8248d9 3f544f9d -> 3f25d9b3 3f328d6a 3f4f570c", + "3f000000 3e44101a 3f60ee0d 3f60ee0d bdbc4927 3db44b13 3f64f68b -> 3e44101a 3f19059e 3f60ee0d", + "3f800000 3eb6cabf 3e9a6dce 3f2aa313 3f8fa72c 3f8fa72c 3f42c39c -> 3f2aa313 3f2aa313 3e9a6dce", + "3fc00000 3f497950 3eaa1d9f 3eac337f 3eb36c23 3d8a6876 3eb36c23 -> 3f497950 3eaa1d9f 3f81948c", + "bf000000 3e88de53 3f876dfb 3f0e5faa 3f188e91 3f188e91 bd9e660a -> be031cf2 3f876dfb 3f3357ea", + "3e800000 be44d764 3ed1f97d 3f816548 3f179a6f bdfa8f25 bdfa8f25 -> 3dde5208 3e84e032 3f35ca76", + "3f400000 3e65facf 3e62af66 3f327261 3e3e1174 bd8c877e 3f96d395 -> 3e96ff0c 3e62af66 3f327261", + "40000000 3f86a54e bd90cd5e bd90cd5e be2a11b9 3f455214 3eaf8ca6 -> bf98befa 400b2bb9 3f931354", + "00000000 3f221b50 3f846368 3f846368 be3e20c4 3ea935d8 be3e20c4 -> 3f221b50 3f846368 3f846368", + "3f000000 3f84319e 3f6b1cf5 3f6b1cf5 3d981d64 3f8b23dd bdc440f1 -> 3f7bdaf4 3f79c018 3f6b1cf5", + "3f800000 3f966852 3f966852 be3ce30c bd2c20b5 3e9d1700 bd2c20b5 -> be3ce310 3f966852 be3ce30f", + "3fc00000 3f1e2b98 3dff79c2 3f07cf9b 3ec157ed 3ec157ed 3eed7224 -> bdf977c0 3dff79c0 3f295996", + "bf000000 bd9164dd 3f466415 3f466415 00000000 3f400000 00000000 -> bd9164dc 3f466415 3f995637", + "3e800000 3f966330 3e3f7290 3e3f7290 3ea7eac1 bd76c5d2 bd76c5d2 -> 3f966330 3e3f7290 3e3f7290", + "3f400000 3f9a0e0e 3f80a787 3f463ef9 bd77d06e 3e50bd7d 3f1febea -> 3f61b642 3f74cd0a 3f8c526a", + "40000000 be56af87 be46cd84 3ec5f050 be3cd615 3f4a372d 3f8fed04 -> be56af87 3f299d4a 3ec5f050", + "00000000 3f8b3088 3f50ce82 3f46e6e0 3f8cd50a 3e58e75f 3f82ce49 -> 3f8b3088 3f50ce82 3f46e6e0", + "3f000000 3f545fc6 3f967737 3f967737 00000000 3e800000 3f400000 -> 3f545fc6 3f87b4c6 3f967737", + "3f800000 bbf2e7d6 3e73876c 3ed56cf5 3f7b0290 3f7b0290 3f4debff -> 3ed56cf5 3ed56cf5 bbf2e780", + "3fc00000 3eb8f132 3eb8f132 3eba4df5 be7c6327 3d167e7c 3e97746b -> 3eb8f132 3eba026a 3eba4df5", + "bf000000 3e7f1461 3e7f1461 3f77cf88 3eea36b8 3edd77b6 3ed6cbfb -> bde200fe 3e009f6a 3fa9ea60", + "3e800000 3ea9ab76 3f9c6260 3eed173a 3f80ce5d 3f80ce5d 3f46e1d0 -> 3f0dd17c 3f9c6260 3edc3c49", + "3f400000 3f0f54c8 3ec77a62 3f03b222 3f6868dc 3f94c639 3f6868dc -> 3edd462e 3f046ee2 3ed774db", + "40000000 3f9a497b 3d94eb7b be454f95 3f809022 3f69dff8 3f4c8bb2 -> 3f9a497b 3f8d0064 be454f9f", + "00000000 3f90c636 be270bf6 be270bf6 3f17a905 3f01ffbd 3f01ffbd -> 3f90c636 be270bf6 be270bf6", + "3f000000 3f4b69c9 bdc7b3fd bcbfbf1a bddbe89f 3e65f26e bddbe89f -> 3eb27349 3eb2734a bd77a3c9", + "3f800000 be147a91 be147a91 3f1af85f 3f800000 3f800000 00000000 -> 3f1af85f 3f1af85f be147a90", + "3fc00000 bcacedf2 3f8ca151 be7dfab5 3f90ef17 3e0cddb3 3f90ef17 -> 3fd44bd6 bf6bdf56 3fe2d1a5", + "bf000000 3f6e1873 3f8ef9a2 3e277a49 3f8d4363 3f6eb47b 3f8d4363 -> 3f562b0a 3fcbfece bea0578e", + "3e800000 be4489a0 3e7a09fa be27a3f0 3e6ea899 3f3fbde8 3f3fbde8 -> be4489a0 3e7a09fa bd7ce1d6", + "3f400000 3deeaa09 3f67094d 3eee53da be65eeb0 be05d412 be05d412 -> 3deeaa08 3f67094d 3f4b1175", + "40000000 bd4070d7 3f812108 3eb30aa2 3f9dd400 3f6abe9a 3f9dd400 -> 400422cc bf8d2816 3fd57f68", + "00000000 3f4a53c6 3e5ae104 3ecb6147 3f9525aa 3f29e88a 3f8eb6c8 -> 3f4a53c6 3e5ae104 3ecb6147", + "3f000000 3e877484 bd8075dc 3f997cbb 3f041e6c 3f95bbdf 3f041e6c -> 3dceae1c 3f11755e 3f11755e", + "3f800000 be276193 3f0b0c71 3f017539 3e159495 3f17a602 3f3a83e0 -> be276194 3ec1815a 3f0b0c71", + "3fc00000 3ebbbb20 3ebbbb20 3e248842 3ddd8e7c bddfa694 3f92cd50 -> 3de3a60c 3d6c4510 3ef0769f", + "bf000000 3f878acb 3f3963a6 3f720fcc 3f135bce be591542 3f79e4b9 -> 3f8ec3a2 3f3963a6 3f638ce7", + "3e800000 3f9e3a4f be3cad32 be58e4b5 3f800000 3f000000 3f400000 -> 3f9e3a4f be43bb14 bcfc6e88", + "3f400000 3f9a3b7c bd084208 3f2ece5c 3ed331ed 3ed331ed 3f2404c4 -> 3e8d754c bd0841fc 3f898668", + "40000000 3f65d8a3 3e868e0d 3f4f93d1 3e3778b0 3f3b6c32 3e3778b0 -> bebe952a 3fc4351f be920b86", + "00000000 3f473da5 3f473da5 bdf93b2b 3e2a1577 3eaacb03 3e2a1577 -> 3f473da5 3f473da5 bdf93b2b", + "3f000000 3f25ab84 3f25ab84 bd753539 3f338999 3f913565 3e3d137d -> 3ef8cd8e 3f25ab84 bd75353a", + "3f800000 3ee8329f be43a402 bde9a625 3f714b8a 3f96ee44 3f4438bb -> 3dabf484 3ee8329f be43a402", + "3fc00000 be4d5f8d 3f23b4a2 be4d5f8d 3dc65b04 3dc65b04 3f62076c -> be4d5f8e bf1ede26 3f879d72", + "bf000000 3f3bfdd0 3e669762 3f5076ac 3f4e1f37 3f90ce2d 3f90ce2d -> 3f7d29cc bd8e148c 3f5076ac", + "3e800000 3ed6fdae 3f85cc2b 3f49b22c 3f498aba bd5751cb 3f67eeed -> 3f0e9036 3f6391f6 3f5a2bb6", + "3f400000 3cf5eccf 3ecf9580 3cf5eccf 3e18e9f8 3f94ff38 3f6e304f -> 3cf5ecd4 3ecf9580 3e7cae8c", + "40000000 3f0016a4 3e9c4e6d 3f0016a4 3f7d03eb 3edd9363 3f770e2b -> 3f0016a4 3e9c4e6d 3ef7ce8e", + "00000000 3f33db08 3e178a1d 3cdb2b92 3f44e292 3dbc88d7 3dbc88d7 -> 3f33db08 3e178a1d 3cdb2b92", + "3f000000 3da8cf04 3df1ccf2 3da8cf04 bdcbb2ed be261544 be261544 -> 3dcd4dfb 3dcd4dfc 3da8cf04", + "3f800000 3f94d085 3f94d085 3f6708ca bdb230ee bcdb5a05 3f964078 -> 3f6708ca 3f6a3732 3f94d085", + "3fc00000 3f3257ab 3f4eca90 3e81f3d9 3f712443 3f712443 3f83dd9d -> 3d04b0d0 bcbdccc0 3f8ad971", + "bf000000 3f2891b4 3f2891b4 3f543a12 3e292ca6 3f456f21 3f456f21 -> 3f2891b4 3f12bd85 3f543a12", + "3e800000 bd7772e7 3f1241d3 3f1241d3 3e1d2a8d 3e2ed9e3 3e93e9ec -> bd7772e7 3eddf74a 3f1241d3", + "3f400000 3f3b2d88 3c2d7425 3f679e62 3f102783 3f9a40e5 3e98e33a -> 3ec5d6dd 3f2e643e 3e6fbfd4", + "40000000 3f1470d6 3f1470d6 3dfe489d 3f400000 3f000000 3f800000 -> 3dfe4898 bea9bd60 3f848c4c", + "00000000 be318c64 bd7b9d98 bd57e49d 3d8e2bbe 3d8e2bbe 3e8d6549 -> be318c64 bd7b9d98 bd57e49d", + "3f000000 3f132160 bd1e3d85 3f132160 3f862e87 bdf6f469 bdf6f469 -> 3f132160 bd1e3d81 3e893d88", + "3f800000 3ef9da3d 3d26bdd3 3f7e91b3 3f29e950 3f29e950 3f97352e -> 3d26bdd0 3d26bdd3 3f7e91b3", + "3fc00000 3f8bcc68 3e9d25cf 3dcf7cfb 3f298ad0 3f015b19 3f298ad0 -> 3f8bcc68 bac40b00 3fcb36b5", + "bf000000 3e869827 3f43dfa6 3e869827 3ca0f223 3dbee946 3ca0f223 -> 3e869826 3f43dfa6 3e869826", + "3e800000 3f82b5e1 3ea11e1f 3f82b5e1 bbf4a026 bbf4a026 3f27f1bd -> 3f583496 3ea11e1f 3f82b5e1", + "3f400000 3f29bcb3 3bf4710a 3f09f6a1 3f400000 3f400000 3f000000 -> 3f29bcb3 3eff8f7e 3e0fb148", + "40000000 3f4736a0 3f4736a0 be6787ec 3f5a5769 3f70570b bdc89449 -> 3f1c9844 3f4736a0 be6787f4", + "00000000 3ed25898 3f4a64ae 3ed25898 3f076cd5 3f4be465 3f076cd5 -> 3ed25898 3f4a64ae 3ed25898", + "3f000000 3d96da84 3f838930 3d96da84 3ea85e46 3f8a4116 3c9c4e39 -> 3e5a05a4 3f838930 3d96da82", + "3f800000 3e83d987 3db69bd8 be633940 3f82a608 3f011c70 3f011c70 -> 3e83d987 be633940 be63393f", + "3fc00000 3f03f43c 3f611eda 3f611eda 3f978abf be57f784 3ef0b1d8 -> 3f87da14 3eaabdda 3f199a36", + "bf000000 3f0cad5d 3e6ddd3a 3f0cad5d 3f21cc4c 3f21cc4c 3f9b58a5 -> 3f354864 3e6ddd3a 3f0cad5d", + "3e800000 3efc880a 3e9c00ac 3efc880a 3f5375cb 3f006775 3f3d2f0c -> 3efc880a 3e9c00ac 3ef60f16", + "3f400000 3ec2ae03 3e57121e 3f9d0fcd 3f9b5246 3f0cc6fb 3f0cc6fb -> 3f81f6ba 3e571220 3eedb698", + "40000000 be268cb6 be268cb6 3f92a075 3dd3aa3d 3f9815f6 3f25d1f1 -> be268cb8 401d0941 be21ad10", + "00000000 3e1d4fee 3f120e40 3f878454 3f7cc52d 3f746649 3f234ae8 -> 3e1d4fee 3f120e40 3f878454", + "3f000000 3f2e6343 3f2e6343 be3fa96f bdd8fbb9 3f5fd45a 3e8282a7 -> 3e7cf1ce 3f2e6343 bcdffb80", + "3f800000 3c9aafdd 3e8ba43d 3efdd8c5 bca26d75 3ef14b3c bca26d75 -> 3c9aafd9 3efdd8c5 3c9aafe0", + "3fc00000 3f8ea3ac 3f9ba0a8 3f9ba0a8 3d987c48 3d987c48 3d90e1e6 -> 3fa21f26 3f9ba0a8 3f88252e", + "bf000000 3f598cd0 3f3e685b 3f9bc0e9 3e6e472c 3c3f9313 3f6dba14 -> 3f588702 3f3e685b 3f9bc0e9", + "3e800000 3f029dab 3f6c8128 3f6c8128 3f6f7f80 3f6f7f80 3ea84237 -> 3f1d168a 3f6c8128 3f520849", + "3f400000 3f3cd3c5 3f8fbd01 3f549ae4 3f38af2a be1b8f7e 3e853808 -> 3f83683a 3f557d54 3f65af36", + "40000000 3f609360 3f917f90 3f609360 3f1ee5f1 3f1ee5f1 3f8498ea -> 3f609360 3f1e27a0 3fb2b570", + "00000000 3f0d63a5 3e746c4b bd9c3527 3f85fa3c 3ee2a1bf bcc5bef4 -> 3f0d63a5 3e746c4b bd9c3527", + "3f000000 3f91d76d 3edeaa4f 3e293e11 3e8a33d7 3c32355f 3e8a33d7 -> 3f91d76d 3e99a4ab 3f26ff2f", + "3f800000 3ea9e90a 3f808d09 3ea9e90a 3f52c0b3 3ea941ef 3ea941ef -> 3f808d09 3ea9e908 3ea9e909", + "3fc00000 3eb29eec 3f3a073a bdf858b0 3dcf4fbe 3f822149 3f82a186 -> beb670b8 3f38a468 3f934831", + "bf000000 3f346fe7 3f346fe7 3e605363 3d5257d6 3f6315e9 bdeae450 -> 3f684efc 3f346fe7 3e605362", + "3e800000 3ef4ebab 3f1760f7 3f1760f7 3f800000 3f800000 3f000000 -> 3f01b09e 3f1760f7 3f10262f", + "3f400000 3f9cd4e5 3db3141e 3db3141e 3f3dee73 3f70e25e 3f981889 -> 3ebe68ac 3eef9b66 3f70d7f8", + "40000000 3ed7269d 3e2ec60e be1df6f2 3f71f1ac 3ef0b86f 3eb89fb8 -> 3ed7269d be8714fb be1df6f0", + "00000000 3d721747 3d721747 be755c7a 3f400000 00000000 3f800000 -> 3d721747 3d721747 be755c7a", + "3f000000 3f268df4 3f6defa9 3f268df4 3e76d316 3f0c1ebd 3f0c1ebd -> 3f268df4 3f6defa9 3f4a3ece", + "3f800000 3f698b53 3f2b260f bcec7e2e 3f63f0ed 3d8a64ba 3e4602b7 -> 3f698b53 bcec7e40 3deb8df0", + "3fc00000 3f29b6dc 3d9db4a0 3e0f75d9 3e800000 3e800000 3f400000 -> be5d2640 3d9db4a3 3f6ca38f", + "bf000000 3ef922e4 3f2ab30e 3ef922e4 bd894d1d bd1958f5 3f434c77 -> 3ef922e4 3f40f13c 3ecb0148", + "3e800000 be7d9364 bc3ca341 3ec4dd01 bc7de329 bc7de329 3f8ea84d -> be7d9364 bd907901 3ec4dd01", + "3f400000 3e388583 3dd54750 3e388583 3f944bcc 3dd83dd2 3dd83dd2 -> 3e388583 3dd54750 3dfc383e", + "40000000 3e94660b 3f0fdd28 3f9654b3 3e1c1117 3e1c1117 3f84ff55 -> 3e94660f 3c911ca0 3f9654b3", + "3f6d9b36 3e38b0d8 3f2b3e27 3f51c839 3f7369f8 be395564 3f7369f8 -> 3f4606d7 3e5ca2da 3f51c839", + "3fbf9272 be7c61bb 3ccc60ec 3ccc60ec 3f8f0a47 3f99f2cb 3eaabcf7 -> 3df59a72 3ccc60ec bec33563", + "3f21956e 3f35dcfc bd6628a6 3f35dcfc bbdb6f4b bdd89b95 3ede32e6 -> 3ea175ab bd6628a9 3f35dcfc", + "3f341c4e 3c1b26af 3e84255b 3ca3ba1d 3ec849d0 3f368843 3f368843 -> 3c1b26b0 3e84255b 3e4002e6", + "3e58dc16 3f9cc4bb 3df68ecc 3df68ecc 3f057e62 3f0938ec bd4645e1 -> 3f9c05bc 3eb562b0 3df68ecc", + "3f37133f 3ea48a0e 3d82e249 3d82e249 3eee223b 3eee223b 3f1ed015 -> 3e0c8acb 3d82e248 3e7dfa76", + "3e8422c9 3e16207c 3f156ff3 3db81086 3f238d84 3f38a06e be798a57 -> 3e7e8372 3f156ff3 3db81086", + "bd0fbd83 bcfd0da8 3deff71d 3f033df8 3f800000 3f000000 3f000000 -> bd4ca849 3dfa9b40 3f08200f", + "3ec0a3a7 3dbfbc99 3dbfbc99 3ed729c0 3f833701 3ebe7e58 3e30c0eb -> 3e5db528 3dfa9e2a 3e983e52", + "3eb072b8 3f823c6e 3f5a7406 3f823c6e 3edfc27b 3edfc27b 3e40aa6f -> 3f823c6e 3f68ef1a 3f75fdc8", + "3f137d27 be43214b 3f65f7e4 3f8caa03 be764ea9 3d7cad99 bdae14b8 -> be432148 3f81c774 3f3d049d", + "beb95880 be1d948c 3f967198 3eef5ecc bdac3f59 3da5f3a4 bdac3f59 -> be1d948c 3f967198 3f3145d1", + "3f661250 3e243504 3e26bf9f 3e26bf9f 3f400000 00000000 00000000 -> 3e267dba 3e2476e9 3e2476e9", + "3f9a55ce 3f12968a 3f12968a 3f4615ae 3f027fc1 3f8f0ff3 3df28eed -> 3f2ae796 3f50ae06 3f07fe32", + "3f3e4c24 3e8d338f 3f7048bf 3f2945c7 3f7e856f 3f69dfdc 3f7e856f -> 3f44bc1c 3ee44cd6 3f5e0f1a", + "3ec13a6d 3d87974f 3db6aee3 3db6aee3 3f2cfcef 3f2cfcef bdbae021 -> 3d995d12 3db6aee3 3da4e920", + "3fac7d68 3f4e566e bccde062 3e66e22d bc097f8d 3f4ef263 3f4ef263 -> bea0c6b0 3f8c2561 3f80ff28", + "3f7ae820 bdc4cd53 3f8c72e2 3ee9ed2c 3f6e6c17 3f4fa682 3f4599fe -> 3f8968e5 3e5cbed8 bdae4528", + "3e89855e 3f89a8c7 3e9018ce bdbc2e27 3ede23ed 3ede23ed 3efe8fc2 -> 3f430d19 3e398397 3e62fac0", + "be7b4da6 3f773d25 3f984232 3f773d25 3df92384 3f70ec3d 3df92384 -> 3f773d25 3f984232 3f773d25", + "3f9f512f 3f80c5fb 3f8deff5 3e8ece5e 3e8c1555 3eda2d2d bd9ed6e1 -> 3f523bcf 3f8deff5 3e8ece5e", + "bdabbed8 3e866f6b 3f547423 3f8e01e1 3e800000 3f400000 3f000000 -> 3e866f6b 3f4e73da 3f928d70", + "3f66dfd9 bc802e4b 3e413d45 bc802e4b 3e626eab 3eb13ae2 3e626eab -> bc802e45 3e413d45 bc802e45", + "3eb5b7cf 3f15bce0 3ebae1a7 3dc69814 3f61eec9 3f5fb61d 3f61eec9 -> 3f15bce0 3e8a2cce 3e8a510f", + "3fb3be98 3ef2fbea be36a1f7 3ef2fbea 3e24e771 3f0f22d1 3e24e771 -> bee27564 3f3d102a bee27564", + "3d18c197 3f988bdc 3e8660e0 3ea42de0 3cbc7b1f 3eb12a1c 3cbc7b1f -> 3f941c32 3e981f87 3ea3115c", + "3e4bb1c6 3ee71c5b 3e8c7c2c 3ee71c5b 3de433d7 be329ee3 be2bd994 -> 3ee71c5b 3e8c7c2c 3ed5801d", + "3f2c93de 3e8bcdba 3f849d85 3efc0c1d 3ea57651 3ea57651 be6f4914 -> 3f49943e 3f849d85 3eb0615e", + "be502c55 3f50e8c9 3f7731d8 bcfbbf61 bd8f0fdb be19d0c5 bdfa1524 -> 3f49204a 3f95860d bdcfff0b", + "3f99bb9b 3ddc380e 3f22eb63 3ddc380e 3e800000 3f000000 00000000 -> 3ed9aa72 3f22eb63 3ddc3812", + "be5c9c07 3e8abe5a 3e976a5f 3e8abe5a 3e678f92 3f962b07 3f1f7213 -> 3e8abe5a 3e976a5f 3e89999a", + "3f8be3c8 bdea07ac 3e487c3f 3f5b0d50 3ea7137b 3ea7137b 3f835a90 -> bdea07af be1281db 3f5b0d50", + "3f3ad465 3f01f4d5 3e0684c4 3f01f4d5 3e800000 3f000000 3e800000 -> 3e6ea092 3ecfdbc3 3e6ea092", + "bd2c2a8c 3f24d727 3f24d727 3f281f34 00000000 3e800000 3f800000 -> 3f24d727 3f24ce53 3f281f34", + "be09f449 bd95ea83 be68da16 3f957b01 3e8962cb 3f4eba52 3f379647 -> bd56bee6 bed4a9e0 3f998390", + "bea0a91c 3f9d3475 be3a6f2b 3ea6840c 3eacf450 3d33cac9 3f99af94 -> 3fc774a6 be3a6f2c 3d2b9860", + "3fa51fb2 3f83c6af 3de7f044 3f3567e3 3d8c0d96 3f8425f5 3f3811d6 -> be1c25f0 3fa5ca71 3f3d02cb", + "3fad5e0c 3f98061c 3f29fbbf 3f2e9e56 3e800000 3f400000 3e800000 -> 3ef4eee8 3fafc842 3f28572e", + "3f77e72d 3f576395 3f3da608 3f4607e8 3f800000 3f400000 3e800000 -> 3f576395 3f4e441f 3f3de9e7", + "3ee9f4d8 be4b3823 bd0974d1 3eab9cd1 3f000000 3e800000 3e800000 -> 3d39e7cc bddf0b2a 3dbb0f18", + "3ed70bec 3e53c194 3f30be94 bd965ee6 3f784378 3d66379c 3f0a8d00 -> 3ed1e0b8 3ebd3ac8 3dc671d6", + "be0ea18a 3f8b9de5 3ed4ced9 3f8b9de5 3d085810 3f8cf484 3d085810 -> 3f97a740 3ea4a96c 3f97a740", + "3e1d8fef 3f3ce0af 3f652e2c 3f191f8f 3f01cf83 bdf88f7a 3ef3a196 -> 3f43143b 3f597a3e 3f243e9b", + "3ecef981 3f86f022 3ef77f3b bcdd3a49 3f98e5ad 3f36e8e7 3f36e8e7 -> 3f86f022 3e8ddb8b bcdd3a3d", + "3f98669e 3f2b51d3 bd0c3d03 be47fc84 be1ee4bd 3ebafce8 3e9e7cf0 -> beb85f7a 3f4da641 3f3952ab", + "3fa515ca be1d52ec 3ed09d02 3f632004 3eda073f 3f31b4cc 3f048650 -> be1d52f2 3f835abe 3b8b5d00", + "bd971a05 3e068327 3f8319b6 3f500629 3f800000 00000000 3f400000 -> 3d861c95 3f8b8852 3f503e30", + "3fa6174e 3f191d13 3f2c2575 3e113000 3f9445ff 3f082818 3f8c6e4d -> 3f31cf69 bc842960 3f4355a4", + "3e8a5b4b 3f0d7386 3f2b6a8d 3ef07f8d 00000000 00000000 3f000000 -> 3f07b8cb 3f1d96e6 3f06136e", + "be83ed62 3f5ca0a3 bd6d642e 3f12bbf1 3e92c81c 3f84d68b 3e92c81c -> 3f8ca65d be9704b5 3f3c5dc2", + "3f849623 3ed79278 3ed79278 3f2b79a2 3f4338c4 3eef7345 3e1c3273 -> 3f2dc1da 3f0ddd97 3ed3020a", + "3f8a855e 3eac1b4b 3f82e355 3f64a111 bdbad6e4 3e9ff060 be266b0c -> 3ee532e6 3f82e355 3e94ab2a", + "3d492329 3f6a669a 3f6a669a 3f88d4fb 3f000000 3f400000 3f000000 -> 3f6a669a 3f6c542e 3f87de31", + "3f5d29bd 3e9fabab 3f91addd 3f91addd be3479a9 3d16551d bda81fe0 -> 3e9fabac 3f91addd 3f3d6a94", + "3ec519ed 3e8d4784 bcc528f0 3f63e237 3f500297 3f33336a 3f80de0f -> 3e94406a bcc528eb 3f63e237", + "3f6259b5 3f5ba2b3 3f860ca5 3f5ba2b3 3c555b32 3f8da86f 3f8da86f -> 3f5ba2b3 3f860ca5 3f833e30", + "3f5866eb 3c718ddb 3c718ddb 3ebd42fc 00000000 00000000 3f800000 -> 3c718de9 3c718de9 3ebd42fc", + "bd6cee09 3f0bed8f 3f1d02e4 3f0d138e 3e9b4cf6 3ecf0325 3ecf0325 -> 3f0bed8f 3f1d02e4 3f0c2797", + "3ed63073 3e0bc46b bcd2d384 bcd2d384 bc981ebf bc981ebf be4b068a -> 3e0bc46b 3d2c90b6 bcd2d385", + "3f3367fe 3dc8ecc8 bc92cae9 3f5332d5 3f9671ea 3e8f6034 be0240f9 -> 3f1b8609 3e2ac432 3e6fe60c", + "3e912b78 3eb74ccd 3da2167d 3eb74ccd 3f211fc5 3f6de49b 3f6de49b -> 3e8ed145 3e22024e 3eb74ccd", + "3fa94205 3f47d239 3f47d239 3dd34577 3f009210 3f2658fa 3f33bff8 -> bdebe480 3f0bc5b7 3f7fb778", + "bed62d1e 3f3ce241 3f3ce241 3aa34648 be0a6ff7 be0a6ff7 3f1f068c -> 3f85e1a8 3f85e1a8 be9d1eda", + "bd769fd2 3f75ff1d 3f9c200d 3edb5ddd be3c86f4 3f9ea55a 3ef66bca -> 3f7e343f 3f9c200d 3ecff6e2", + "3d7b8f7d be18249b 3ec988cd 3f755643 3efff0cd be797c55 3efff0cd -> bda50e85 3eb87c22 3f755643", + "3f8a1a2e 3f56c152 bdd54478 3f9a82ff 3f3e5244 3ef65928 3f3e5244 -> 3f9e3b52 bdd5446b 3f9a82ff", + "3e8b1ef8 3f140e4d 3f48c9bb 3f48c9bb 3f8217c3 3f37599e 3f8217c3 -> 3f226260 3f3a75a8 3f48c9bb", + "3efb1772 3e65c206 3e7c1c4e 3e65c206 bdd67d60 bd2be443 be2064b3 -> 3e6ab83e 3e7c1c4e 3e65c206", + "3e1e5d97 be2135a7 3e48f351 3f76031d 3f942371 3f8bff9a be3a4292 -> 3c7e8b80 3e9cd315 3f49bb85", + "bea86cd7 3ed490c1 be08c6e2 3e230729 3efb2777 3f4a5445 3efb2777 -> 3f187e4d bea0cf4b 3e82d340", + "3e8c1dd4 3ed99cd0 bc564cfd 3ed99cd0 3f8881e0 bd247987 3f803aec -> 3ed99cd0 bc564d05 3ed60684", + "becdc667 3ee17987 3ee17987 3ec74f3b 3ee00a13 3e67b62d 3e67b62d -> 3ee17987 3eebfd9a 3ec74f3b", + "3f4bc0b9 3ee7ec4a 3f22dc59 3f14bbbe 3f800000 3e800000 3e800000 -> 3f1949ff 3efb10fe 3ef54cc4", + "3fb3533a 3f546e51 3f8a7c4b 3f546e51 3f4b70d7 3eac8719 3f911424 -> 3f843281 3f3a8d44 3f976cd2", + "3f804368 3e2089f3 3e16c7b9 3e5e4e8e 3ee2f334 3ee2f334 3e0b8b5d -> 3e5e6f15 3e5e7438 3e16a20e", + "3df8e7be 3f653dd9 bd6d2116 3ef92a54 3f9b164a 3f148083 3de3c9a0 -> 3f653dd9 bc0ba468 3ed747c8", + "3fbcd24c 3ef8f2bd 3ef8f2bd 3f040848 3eafa655 3dba0dcc 3e33f4b4 -> 3f079fb0 3ef8f2bd 3ef94554", + "bd995b52 3f684c3d 3f684c3d 3f1e52e5 3f9c8b6e 3f9c8b6e 3efe9048 -> 3f684c3d 3f684c3d 3f1e52e5", + "3fbecddf 3e08e56e 3e08e56e 3f64c8f2 3f88fe85 be73b7c1 3da9e9f8 -> 3fa21fb6 3e08e574 3d1ea680", + "3f9dc30a bdd54c9e 3e470562 be3806c1 3f240103 3f240103 3e455bc1 -> 3e870c06 3e470562 be3806c2", + "3fb620c3 3f838177 3e2e2f74 3f982286 3e2620d0 3f975bd1 3f125d55 -> be450a30 3fcf42f4 3ea462b6", + "3f918f5f 3f940a85 3f8fbc11 3f9e7cd4 3f6eb332 3da8097a 3efaed13 -> 3f9febb6 3f8fbc11 3f95c2ca", + "bedcd52d be00d6a1 be00d6a1 bd881876 3dc9e426 3f0c9b38 3f0c9b38 -> be00d6a1 be1b0ee8 bd881876", + "3f00b11a 3f97e7e0 3f61d1b3 3f810f6d be3e910a 3f38d4aa 3f3fac68 -> 3f844d63 3f83f3d9 3f8c8b74", + "3e951503 3f4cf1e9 3f92b1ff 3f5df8ea 3e8972ce 3ee4d30d 3f904729 -> 3f4cf1e9 3f887eae 3f72c482", + "3d9c76ee 3f29eb40 3f95b0bb 3f18708c 3f400000 3f800000 3f400000 -> 3f289563 3f95b0bb 3f18708c", + "bc81ff4b 3ec65d02 3f9fb5e4 be5099ff 3ebfba3c 3e570668 3ebfba3c -> 3ebf5f9a 3fa2a8a1 be682fe7", + "3f23da70 3e970c3e 3f8148ce 3f909f47 3e800000 00000000 3f400000 -> 3ef23e1d 3f0d691b 3f909f47", + "3daee6db 3f056353 3f056353 3d177ccb be11e9bb 3f194ae0 3f194ae0 -> 3ef59c31 3f056353 3da0683a", + "3ee4ca5b 3dba9284 be7448de 3f501449 bcab473a bcab473a 3e321c3b -> bd663ce4 be7448dd 3f501449", + "3f5069fc 3f786cbf 3ebbbd72 3e95c5e6 be6a087a be6a087a 3ccb6d08 -> 3ed649e2 3e9cd498 3f582ac1", + "3f03e97d 3efcdf33 3efcdf33 3ecdb366 bc4c32cb bc4c32cb 3ed4611d -> 3ee490c3 3ee490c3 3ee601d6", + "bdde6419 3f853c40 3f853c40 be45c7db 3e1ef9a2 3f02178e 3e1ef9a2 -> 3f96634e 3f853c40 be45c7db", + "3f652a06 3db76a3b 3f416a9e 3f416a9e 3f8cabf9 3f8e2a8b 3f8e2a8b -> 3db76a37 3f416a9e 3f416a9e", + "bef5a872 3f5a7056 3f6a5b35 3f5a7056 3f400000 00000000 3e800000 -> 3f52cd36 3f71fe55 3f57e4a1", + "3dfcdd40 3e0bdd47 3ea2ca2a 3ea2ca2a 3f37b103 3f3cf484 3f37b103 -> 3e0bdd47 3ea2ca2a 3e97531f", + "be5d0899 3ea7dde7 3ea7dde7 3e4520d5 be5dde74 3edeeca9 3f62bf57 -> 3eb6d375 3eadfa48 3e2735b9", + "be97aac3 3f87ffab 3f87ffab be52afe8 be3ddeff 3f3b4139 3f5b2d16 -> 3fb81612 3f8dc169 bf14d8c8", + "be93615b 3e9b9b9f 3f6aeb2e 3e9b9b9f 3f94decc 3f7fc418 3f8e91dd -> 3e025004 3f8c127e 3e389eee", + "be60a494 3f988780 3f93c8ee 3f988780 3e4445db 3f1b5776 3e312834 -> 3f99867c 3f92be7b 3f9991f3", + "beed8ab0 3f74e862 3ee9e987 3ee9e987 bc6bdfc3 3ef2765f 3f71eef9 -> 3f9822a8 3ead87d8 3e665f58", + "3fac6891 bdee7383 bc2f364f bc2f364f 3f7fa002 3f7fa002 3f72fdd5 -> 3cd4e9f4 bc2f364f be1cca66", + "3f47aa88 3e477da6 3e477da6 bdcf53ab be40a2c7 3f22892d 3f22892d -> bd13cff4 3e477da6 3e04c7ce", + "3e256f98 3f6c5b78 3f6c5b78 3f8c91e2 3f2f5df3 3f01cdde 3f45880b -> 3f71397d 3f6c5b78 3f8c91e2", + "3f32abe8 bcf5a6bb bcf5a6bb 3e89fa8c 3e50672a 3f0cceae 3f0cceae -> bcf5a6c0 3e37533f 3e89fa8c", + "3f2e6f5c 3f8334b7 3e3e0d3a 3f8334b7 3f95b158 3f95b158 3e8fdd79 -> 3f8334b7 3f41f134 3ee7f712", + "3f09d862 3f7a0f79 be417523 bd9d8cc3 3f800000 3f800000 3f800000 -> 3f7a0f79 be417523 bd9d8cc3", + "bef72049 3f0ee554 3efcf93f 3f39c476 3f9c23ed 3f324c74 3e56fa1d -> 3ef467f6 3ee16776 3f56615b", + "3df9456d 3e70802e 3e70802e 3f83df50 3e4462a2 3e83ee4d 3e83ee4d -> 3e70802e 3ea9d134 3f83df50", + "3f4b83c7 3f92113b 3d998952 3f8ec280 3f400000 3f000000 3f000000 -> 3f92113b 3d99894e 3e9396da", + "be8f1dbd 3effcaac 3f4e1088 3d3f4f17 3e800000 3f400000 00000000 -> 3f0e37b8 3f4e1088 3d3f4f1a", + "3f94211a be6b8537 3f748150 3f748150 bd6736d1 3eb91faa 3f21ccd2 -> be6b853a 3ed5297a 3f748150", + "3e378710 3d1925d6 3d788210 3d1925d6 3f7acfa0 3e1e6a04 3f294eff -> 3d2a3d25 3d676ac1 3d23a4c4", + "bea09765 3f09b535 3f09b535 3f03d896 3f0e43cc 3f1faaee 3f1faaee -> 3f0b8be2 3f09b535 3f0201e9", + "3d84763c 3f297b0f 3f5c4d74 3f84b1f3 3efb9e5f 3ebcb609 3ebcb609 -> 3f2faf1a 3f5903f5 3f8197ed", + "beee30e8 3dd54998 3c19f442 be60b403 3e15bbc1 3e15bbc1 3f94f562 -> 3e82655e 3ded44ba bebd6cf9", + "3fbfe83b be5658f8 3f4deb77 3f4deb77 3dad6bc5 3e3193d1 3f22f50b -> be5658ef bef12f26 3f4deb77", + "3fb289a8 bc902c6e bc902c6e 3eff7114 bcaef200 3ca567fc 3ebca235 -> bc902c4b 3d7273ff 3eff7114", + "bdbceb21 be1a5240 be1a5240 be3ec2ae 3f91d826 3f91d826 bd2d17d4 -> be1a5240 be1a5240 be3ec2ae", + "3ebf0f7f 3f3865de 3eb019f2 3eb019f2 3c5b60fc 3f838ff2 bda00697 -> 3f176b7f 3ef8021a 3eb019f2", + "3fb0f9d8 bd18c1b5 bdec2b90 bdec2b90 3f8ef842 bd2b85e3 bd2b85e3 -> bd18c1b5 bdec2b90 bdec2b90", + "be9a8e6c 3da059e0 3d7430af 3f418bf6 3f7368e5 3f7368e5 3ed35d47 -> be0152fd be1a39ee 3f775d7c", + "3f023907 3e852992 3f900171 3eefc03e 3f682695 3d1a5716 3d1a5716 -> 3f333806 3f2f5fa6 3eb987fc", + "3e142dd0 3eab24a5 3f321a7f 3ed99692 3f0966ab 3f0966ab 3f005aae -> 3ec5ec49 3f321a7f 3ed2de07", + "3f29d6ff bca2a322 3ee00fed bca2a322 3f679e85 3f679e85 bd9eab2f -> 3e913ae2 3ee00fed bca2a31b", + "bece12c1 bd96fe73 bd8a05b0 3e74703a 3f8a3ac5 3e228f8b 3e228f8b -> be4c444a bd84cd1f 3eba9aa5", + "3f303073 3ebea003 3f53d9ca 3f82c1dc 3e814fc8 3ebacb3a be6a953d -> 3f3c138e 3f760804 3f1320b6", + "3fa9a557 3f4ff127 3f4aa98a 3f1f3b6f 3edd12ba 3e57483b 3f1efc88 -> 3f32333e 3f111a11 3f5fca48", + "3e80dc87 3ea44bca 3f9e941e 3f8f64f1 bde4987a bdefc15b 3f9a9821 -> 3ea4c85a 3f810136 3f933747", + "be8ebad2 3ed1e902 3d4104ed 3f17794e 3d642544 3f9bf9c9 3f9bf9c9 -> 3f02d9b0 bdd66572 3f17794e", + "3cb36e3d 3f9ccf46 3f616cf5 3f616cf5 3edaeb95 3f71f969 3edaeb95 -> 3f9bd803 3f635b7a 3f616cf5", + "be6e738c 3f3f4a97 3e78637a 3f9d5c8f bd3f1b37 3f5a1908 3f58d74b -> 3f5d6039 3c514780 3f9d85b2", + "3f68ed69 3f0f2800 bd7831ac 3f8b5861 bde8cc51 3e3bf776 3f667b94 -> bb9b1a80 3e7bd1d5 3f8b5861", + "be16dd31 3f97c091 3f3595b8 3efd0549 3e44937c 3f4860e8 be44acb8 -> 3f9fa75e 3f239f66 3efd0549", + "3df4418e 3f27704c be62f86e 3f665020 bdf83fa2 3e9484f1 bd80acf7 -> 3f0cb398 bdb40dc8 3f48efe5", + "be60dd6f 3f08e0cd 3f9f2e96 3f58ef26 3e961ef8 3eccf946 3e6326fb -> 3ef1e2d0 3f9f2e96 3f6a8399", + "bea1bfee bdb6859a bd622efe bd622efe 3f8de032 3f8de032 3f0d0eea -> bdcc74c0 bd622efe bd3650b1", + "3f01c0d9 3e934e0f 3e3fa427 3e9002a6 bdabda5c 3c1af688 be4e53d8 -> 3e87c13d 3e73d4ac 3e6f2bbe", + "3ed4fd69 3f7b2125 be633138 3f6755da 3ec13ac8 3f9b290f 3f51ab0c -> 3ef610d6 3e8e98d8 3f333ce6", + "3f5909fa be2914d6 3f139033 be74b066 3f289983 bdfa551d 3f289983 -> 3eed582b bdeb3c60 3ee7974b", + "be52bd76 3f63393c be498c11 3f902ce7 3c8859a9 3f0b3d49 3f0b3d49 -> 3f8e2d92 bef032d4 3f902ce7", + "be0953ab 3f07290c 3f07290c bd45f312 3f84f2c3 3ee43dd2 3f84f2c3 -> 3f07290c 3f1af214 be00a0e5", + "3e545ac6 3f9b8a74 3f6b7681 3f8e9789 3f1132c5 3d128036 3f858295 -> 3f97d62d 3f6b7681 3f9146fa", + "3f218164 3f3ded8e 3ea0a0db 3e4db390 3f515195 3e2af304 3e2af304 -> 3f3ded8e 3e785ae8 3e4db390", + "3f4ecbac bd20e73a 3f2d509d 3f06a984 3f0e8cdc 3d9bb171 3f0e8cdc -> 3f0a11ef 3dc981d0 3f25e2bb", + "3ea989b9 3d92cd9f 3d92cd9f bded6f79 3efcf117 3f2ebe22 3f051a9e -> 3c1c90cc 3d92cd9f bddbf3c7", + "3f830119 3f6c24d0 3f2ccdbe 3f6c24d0 3f81abed 3eb79980 3f87ceff -> 3f67b806 3f2ccdbf 3f6c24d0", + "3ede7e7d 3f25fc58 3f0bbbed 3e6cdad0 3e692598 3eaacd57 3eaacd57 -> 3eef2c8a 3f172458 3ed3398e", + "3f70ddbe 3f560781 3f246835 3eb9b14c 3f175fb1 3f175fb1 3e7144ea -> 3f560781 3f531888 3eb9b14c", + "bee54023 3f96ddf0 3f1b262d 3f028016 3f122db0 be5dbfa0 be5dbfa0 -> 3f96ddf0 3f262f8d 3f028016", + "be9922ee 3f81b4b8 3e254db2 3ebe302e 3f800000 3f000000 3f800000 -> 3f81b4b8 3e254db3 3e37ca48", + "3fa7ec62 be4107f9 3eb997b8 bccdb14e 3e933a21 3ee3ae12 3f0aa295 -> be4107f8 3db1d7b4 3ef77d2f", + "3f9bdbe7 bdad7185 bd8f1e6b bdad7185 be751a62 3f7a1e4f 3f7a1e4f -> bdad7185 bd8f1e6b bd8884ca", + "3f545d21 3ea95e33 3f97b305 3e431c52 3f661fd6 bcefb368 3eb84d35 -> 3f850f14 3eb85b8c 3f0959ba", + "3ea63b4e bdfe4863 bddfdccb bdfe4863 bdab68db 3f549840 3f549840 -> bdfe4863 bddfdccb bdf467fb", + "3e9d18db 3dcaa194 3f7f32c2 3f7f32c2 3f44967b 3f7fc8f6 3f7fc8f6 -> 3dcaa193 3f7f32c2 3f7f32c2", + "3f85bc43 3e357e8d 3ee8a87c 3f4e518c bdec791d be38af85 bdec791d -> 3f5587b7 3e28c6e2 3f4e518c", + "bd05887f 3f436038 3f06a338 3f19d89c 3f556067 3f9dc3b3 3f9dc3b3 -> 3f455b21 3f04a84f 3f187e02", + "3f638e2a 3f09469e 3f899524 be4a29ae 3ebb0278 be257184 3ebb0278 -> 3f81ec08 bd659d40 3f6ef9b0", + "3fa556d4 3eb836c6 3f83a3ea 3f82f227 3f1d1a84 3f029ac0 3f97f307 -> 3efbd5ae 3e28b1b8 3f83d7c5", + "3f9e08fe bceecfea 3f606cb5 3e9ffab9 3f635cb4 be5c2d89 3e991642 -> 3f8b6b1f be778024 3ed2d636", + "bde87563 3f9f8943 bdc5f80b 3ec48f5b bcf0277e bcf0277e 3e3283cd -> 3fb30c7c bdc5f80a 3e927016", + "3fad1d3a 3dd41127 3ed26036 3d33341c 3ddcb67b 3ec465d4 3e32610f -> 3cb9c0f4 3ed26036 3e2741fa", + "3dcfd6d6 3f4a3f6d 3f37b0ff 3ea7cad1 be34223f be651779 be415aa3 -> 3f4a3f6d 3f2d9053 3eb953c4", + "3f904672 3eafd257 3f06bdbc 3f883e22 3e68f4b3 3f61a7d6 3e1fd06f -> 3ed8cace 3f90fff2 3e80e268", + "bdfd096d 3f4f4f0c 3eb11d75 bdfbefd3 3edc4dac 3d776964 3edc4dac -> 3f4f4f0c 3ecec7b3 be73fc9e", + "3c06acff 3f101ad0 3ed96db5 3eeff7b9 3fa00000 3fa00000 3fa00000 -> 3f101ad0 3ed96db5 3eeff7b9", + "be38f83d 3f23ad11 3f9f432c 3f23ad11 3f0c497c 3d4f7fc2 3ea138a7 -> 3f07b47c 3fad3f76 3f14d0c8", + "bcf47252 3e2f81f0 3f659aa8 3eb4c026 3e800000 3f000000 3f000000 -> 3e2f81f0 3f659aa8 3eac7106", + "be80f9a4 3f862543 3e6af33a 3eb56678 3e3188a6 3e8da54a 3dad6d58 -> 3f945860 3cbe6680 3ec580da", + "3f521b7f 3f94e5f2 3deb9201 be169dc1 3f69d5d4 3f69d5d4 3f148f09 -> 3f94e5f2 3f79b09b be169dbd", + "3e69e13f 3f3bc48c 3f54ae88 3f3bc48c 3dcbe73f 3f071745 3f029c90 -> 3f3bc48c 3f54ae88 3f4139bc", + "3f2a7fd6 3f85a1b8 bd3de848 3f54935e 3e850391 3eea6da1 3f16adb7 -> 3ea2b702 3ec84030 3f78ff99", + "beb5dd66 3f81d2a5 3e370ac9 3eb53875 3f3824fb bcaf3d45 be1eb71f -> 3f81d2a5 3e089aaa 3ed5150c", + "3ec7fd47 3f790db1 3efca925 3f17a233 00000000 00000000 3e800000 -> 3f491e08 3efca925 3f3dafac", + "3f6966ac 3f69dab7 bcced79c 3f69dab7 3eed706c 3d45a6e3 3eed706c -> 3f69dab7 bcced793 3f69dab7", + "be5c3de3 3f1b4605 3f946a93 3f1b4605 be47f754 3f0fdf49 3f08f24d -> 3f1b4605 3f946a93 3efbd454", + "be379da4 3f7e31a1 3f1dc589 3f203f7a 3f382896 3f8c2deb 3f6414c2 -> 3f87bde5 3f0c7b60 3f18cc47", + "bedcb822 be6fb8b2 be6fb8b2 3f25b20d 3f368e11 3db6cdef 3f687575 -> bf0609f4 be6fb8b1 3f25b20d", + "3c8672bd 3e457c78 3d1a0a4a 3e457c78 3f2472fd 3e5776e0 3f34c8b0 -> 3e452681 3d1a0a4a 3e457c78", + "bedcf6a7 3f015612 be007a7b 3f015612 3e83cd0e be2d6f19 3f93f7bb -> 3f3093d9 be007a7a 3f015612", + "3c2bdfc9 be140b0e be131563 be131563 be22ed08 3f4b3790 3f4b3790 -> be140b0e be131563 be131563", + "3e0519d4 3f46ed04 3e48167b 3d8f394e 3e800000 3e800000 3e800000 -> 3f46ed04 3e48167b 3d8f394e", + "3edaa308 3f1f8f85 3f1f8f85 3f03b607 3f0c15a6 3f8e5e0b 3f89f1b1 -> 3f13ab0c 3f1f8f85 3f0ee04e", + "befa6956 3f1201d9 3f7069e9 3f1201d9 3f6467c5 3f0c4359 3f9d2c5c -> 3ef54202 3f8f4b12 3ec7ab3a", + "3ea22f64 3f5048cb 3f6f79b3 be5be511 3e8a899f 3f92510a 3f92510a -> 3ef9c90c 3f6f79b3 3e193175", + "3d934149 3f51070f 3f61b901 bdbcd2fa 3f2d677c 3ecf4d4d 3f3e4060 -> 3f4ebd90 3f4fcbb2 bcb5a214", + "beb5b78f 3f17f16c 3f575736 3f374c67 3f756e0d 3e521ff9 3e521ff9 -> 3f017136 3f6dd76d 3f426d4f", + "bee685ea be473588 bdab038f 3f388578 3f98dace 3e3199ad 3f98dace -> bf1b4de4 bd094126 3f388578", + "bed5718f 3d942141 bdd5e873 3f4971b9 3f90ebab 3f90ebab 3efbc5a9 -> be66f8fe bef3ba41 3f9448e5", + "3ea4767e 3f2ef51f 3e72999c 3db5098f 3f3f3eb2 3f3f3eb2 be3a4967 -> 3f2ef51f 3ec2bc24 3db5098f", + "3f983ce1 3ecfde67 3f2e1643 3f74a2f4 3f98318e 3ebd846b 3f4a4579 -> 3f87a3ca 3eb54d06 3f231e3c", + "3fb00a27 3efec379 be677bcb be677bcb 3eb6373f 3f929ed3 3f998009 -> befecbcb 3f34abc9 3f44e8af", + "3f6aef2d b9e0f1ac 3eb1805b b9e0f1ac be4df78c 3f892e1c 3d72461f -> b9e0eed1 3eb1805b 3d84875a", + "3d841186 3ec058d7 3dbd41dc 3f6a617f 3f919d8c 3eaa6ebb 3eaa6ebb -> 3ed22c0c 3dbd41dc 3f5ccac1", + "3f129891 3ea75cbe 3f9d4326 3cdee59a 00000000 3f400000 3f000000 -> 3e1f00af 3f9d4326 3ef8c244", + "3f8e11b2 3f6167e9 3e6923fb 3f6167e9 3f2521cb 3f84cbd7 3f84cbd7 -> 3e1faa0c 3f73c665 3f6167e9", + "be883b87 3ea447f7 3e3e714e 3f2d1c78 3f9d7fcd 3f236d62 3f9d7fcd -> 3e67bd9b 3e3e714e 3f2d1c78", + "3e9bfab3 bcd13000 3ebd88ad bcd13000 3f800000 3e800000 3f000000 -> 3dc29957 3e7f9eae 3c7003a8", + "be3ccb56 3f279731 bdd4fa11 bdd4fa11 3f0e95f6 3eb01879 be33ce55 -> 3f279731 be501051 bdd4fa12", + "bee40bab 3f65239c 3f8cfa9b 3f26eb87 3cb58745 3f0709e3 3f0709e3 -> 3f806d00 3f8cfa9b 3ee75d30", + "3f89fdff 3eb02cc2 3f822d9b 3e32d5c3 00000000 3f400000 3f800000 -> 3e254a33 3f4a3c60 3f8a9864", + "3dc322ca 3f431b99 3ecae3e6 3f431b99 3edea9c1 3edea9c1 be125357 -> 3f431b99 3edcbd23 3f3a2efb", + "3f886f2d 3deba721 3edda5de 3deba721 3e800000 3f000000 3f400000 -> 3deba721 3e86eb43 3ee85ef8", + "3e0b2024 3f4a2e8b 3c8cf832 3f4a2e8b 3f0b4280 3e602b22 3e2ce25b -> 3f4a2e8b 3cffc2d2 3f2f4f9a", + "3f826fa6 3f145784 bc1daf73 3e8e0d17 3f627651 bd910ede 3f9a8715 -> 3edb1906 bc1daf87 3f15d038", + "3f8f154f 3e050579 3f79d882 bc4be0aa 3f6370ce 3f9e1d48 3f9d7d86 -> bcef59e0 3f79d882 3f89d7db", + "bd6caca6 3f438278 3f02a2b4 3f438278 3e8c399f 3f89bdb6 3e8c399f -> 3f474219 3efdc627 3f474219", + "3e87156a 3f7022bb 3f7022bb 3f0812b9 3f34be53 3f1e2486 3f4711f6 -> 3f63d771 3f54ae28 3f23874c", + "3fb160b5 3f1150fd 3ddd8600 3ddd8600 3f6fd316 3f83c92c 3f95d9b2 -> bd8d7bb0 3eb8accc 3f3eb133", + "3f7c9ba0 3f99a12e 3b3c77a7 3f05acbc 3f83654e 3f9592c2 3f0027bf -> 3f72f3a5 3f97994e 3c1fda40", + "3fa3a7cb 3f00cb1b 3e9a97fe 3e9a97fe 3e89fbfb 3f11cbbd 3f98dafa -> 3e7bcef0 3ec5517e 3f0f235e", + "be80a841 3f099ae3 be55ebf5 be55ebf5 3f8d4f10 3f370b30 3f370b30 -> 3f099ae3 be55ebf6 be55ebf6", + "3f5fbe4a 3ea9ca07 3f8bbd71 3e7ba88e 3f6acc02 3f188d53 3f5f1adb -> 3f7ef634 3eb467a4 3f6148c8", + "3fb34de5 3e6e8756 be24e2e7 be24e2e7 be099d2a be099d2a bdd030f4 -> bea34a5d be24e2e4 3ec81c94", + "3f9be208 3f6614ad be0f1ee7 3f513c9e 3eae6567 3f504a0c be119ef5 -> 3e8bb5ec 3f8fff52 beb24ea0", + "3e252c01 3ee84c4b bdb3a463 bdb3a463 3eeaa180 3eeaa180 3f6288f8 -> 3ebb9587 bdb3a464 b9c95300", + "bee5c69f 3f1106d7 3f17119a 3f1106d7 3d43eede 3eab3fbd 3f09c5da -> 3f1106d7 3f1831fa 3f0e50af", + "3f6f6748 3f4b6e7f 3f88dea2 be7c0e1f bdbaf562 3e029877 bdbaf562 -> be36f5d4 3f88dea2 be7c0e20", + "3ecf57fa 3f2b09b5 3f248880 3f248880 3ec9b299 3f48f218 bdeb3156 -> 3f29e4aa 3f272adb 3f248880", + "3fb06ac1 be7878af 3df9e221 be7878af 3d5f1cd4 3f6d2ee8 3e8d9ed2 -> be7878b0 3df9e221 bdeabe82", + "3ecc8c52 3cfec7e2 3cfec7e2 bc8d6c92 be72e4b5 3f6ec144 3e1e1aed -> 3c40fccc 3cfec7e2 bc30e036", + "3e0a38bd 3f9cafbc 3f68b477 3f9cafbc 3eca4504 bdf80dd6 bdf80dd6 -> 3f9cafbc 3f68b477 3f973dfa", + "be0de189 3f2980f0 3eec3e93 3e9eafff 3e800000 3e800000 3e800000 -> 3f2980f0 3eec3e93 3e9eafff", + "be8221c1 be6a6bd2 3f84366b 3f5b9ebe 3f95ef12 3f1a5c66 3f1a5c66 -> bf0cb53a 3fad438e 3f912ade", + "3f997138 3f790c71 3f4d3d9e 3e049b27 3f249d69 3f930a79 3f249d69 -> bd1c3070 3f80e0cb 3e049b29", + "3f8b6bd8 3eb79209 3f5b05ce 3e7509db 3f878dd3 3ee87190 3ee87190 -> 3f66603a 3e3cbb08 3e7509dd", + "3f4adb0a 3f7e7504 3f803498 3ee5c716 3eadb3ab 3d72e661 3f415083 -> 3f3cfb56 3f1044a4 3f630816", + "bda59818 3e5c0ebd 3e0afc17 3e0afc17 3e3deb8f 3f7206a5 3e876d4f -> 3e629ce3 3e046df1 3e0a4d8f", + "3f93c97a 3e79d41d 3f0229de 3f0229de bc1a7782 3e8eb6e9 3f9cfa7a -> 3e79d41c 3e8c7016 3f0229de", + "3e9388d7 3f0fcbca bca6500b 3e2e2e8e 3f800000 3e800000 00000000 -> 3f0fcbca 3cb1269b 3dec002a", + "be95452e 3eeaf4bc 3d0da0fd 3f65f630 be0b0a8a 3f9c8486 3ebc79b0 -> 3f1525b2 be5e71ff 3f8741f6", + "3e8ba4a3 3d6accba 3eec497b 3ef18aa7 3f807ae4 3eaa2763 3f592054 -> 3e2e7248 3eb3d8d0 3ee4212a", + "3f55e6c4 3f198b9c 3f50d8fa 3f523113 3f6d9c2a 3f441d51 3f34cf71 -> 3f48e058 3f2f6481 3f22dc57", + "be012c8f 3f30c68e 3f14f0c7 3ded166f 3f149f21 be326b92 3f99bfeb -> 3f39269d 3f23fd8b 3d31325e", + "be2c059c 3e3a458f 3e1f0ac2 3e1f0ac2 3e433ae2 3f98a9d7 3f9145ea -> 3e3ed896 3e1a77bb 3e1abb35", + "3fba33f6 be396ff1 be396ff1 3e54f840 3e3364dc 3e49d37a 3e3364dc -> be396ff0 3ec51098 beb74c70", + "3ee83c2d 3f405a3a 3ee9244a 3f81a1eb 3e7d78a1 bc86b863 bc86b863 -> 3f5eb3f2 3ee9244a 3f428a8c", + "bbbe452b 3f272848 3e9d575a 3f272848 3ef8a1bd be610e79 3eb25074 -> 3f272848 3e9d575a 3f2741e4", + "3f467dce 3f25406a 3c2f2d28 3f25406a 3cf498d6 be6ad3c6 3cf498d6 -> 3f25406a 3c2f2d49 3f25406a", + "beac73de 3f246146 3ee0fe49 be7718d5 3f7c062d 3f76d6f7 3f28b66f -> 3f246146 3ec785de be7718d5", + "3fad4c12 3f7437aa 3f01910f 3f7437aa bd5d261b 3f62ec4a bd35816f -> 3eb1fcb2 3f8e6530 3eb52ea2", + "3dd52db4 bd910fe9 3f0d6c98 bd910fe9 3f3a6baf be486b9c 3f3a6baf -> bbc31cb0 3ef9a1a8 bbc31cb0", + "3f27e692 3f4b0de9 3f4b0de9 3e1f786d 3d2498f6 3e106b94 3ec54558 -> 3ec00d7f 3efe9b0f 3f12e545", + "3f130823 3ee5030e 3f8d7e0f 3f3b5c57 be25b43a 3e2ce3f6 be25b43a -> 3ee5030d 3f8d7e0f 3f118460", + "3f013199 3f8aba77 be7045c0 3f8aba77 bc64773d 3f361881 3ee008ab -> 3ed63da8 3edc8954 3f5529f6", + "3f102529 3f016e68 3f9d1da7 3f84b535 3ec993c4 3f89c5d6 3f89c5d6 -> 3f016e67 3f9d1da7 3f927380", + "3e8dbfc6 3f23ee2d 3efbd9ca 3f871425 3e081bc1 bcf431a0 3dcd135d -> 3f4156f8 3efbd9ca 3f830e6c", + "3f34d494 3e324ab6 3ed71f11 3f75d634 3f8c8c9e 3f9a910a 3f8ad324 -> 3e7096da 3f4d3c0c 3ecf5734", + "3f78cb18 3e818753 3e4b34e0 3e4b34e0 3f31369b be2d94ea 3ec51156 -> 3e818753 3e4b34e0 3e6e2072", + "3d133770 3f3f9150 3f3f9150 bde75369 3f9a6298 3e9426d4 3e9426d4 -> 3f3f9150 3f37a4a3 bde75369", + "3f6e42d7 3f882791 3e74db17 3e2d3a11 3f40419d 3e5a0e3a 3f4a2c22 -> 3f80ff80 3e3230af 3f803871", + "3f2d75bf 3ec3ca35 3de6606d 3f81dee7 3f87e2a5 3f92bc09 3dd1ccbb -> 3f42da6e 3f3947a6 3ece846c", + "be8c3e2d 3f2d7ccf be5fe54a 3f7f71a5 3d9758ee 3eec5176 3d9758ee -> 3f6c56fa bf0d4664 3faa5f5b", + "3fb66e8e 3ecd453e 3ecd453e 3f3482da bdf09633 3f12255d bdf09633 -> 3ecd453f 3f55a0b6 3e8b0987", + "bec454d7 3f9f02cf be4b2e45 bd7b9e06 3eef0fe2 3e5578ae 3e276a08 -> 3f9f02cf be8f84af bc11d2a8", + "bd5bd85e 3f132ede 3f2c529f 3f132ede 3ebef3a2 3e178188 3ece927c -> 3f11feb0 3f2dac0c 3f11d571", + "3e8e1ab5 3f1c0382 3ec7d8f5 3f1c0382 3e23e1a3 3f24cbdb 3f9f9d6c -> 3f0c7232 3ed5b3e6 3f1c0382", + "3f7bfb6c be775432 3f72e743 3f72e743 3f84b33e bd825838 3f84b33e -> 3f6e1ee0 be6432a4 3f72e743", + "3f8bac48 3eaf743d 3eb95260 3f96b19a 3f021d95 3f2e64bc 3f2e64bc -> 3eaf743b 3fa03610 3f96b19a", + "3f9c4873 3f932556 3dcecc1b be108a9c 3f5b4018 3f6e287d 3f9f2749 -> beda4b30 3dd968f7 3fb7a6ce", + "3f228d70 bd897321 b9b43695 b9b43695 3ed792e8 3e029912 3e6cafcc -> bcca7b10 bd2f1127 bce38968", + "3fa4ad03 3f3db5e8 3f114b08 3f3db5e8 3ed68e1b 3f95f1a7 3f9c58c7 -> 3f0490f0 3f46e007 3f3db5e8", + "becec5bf 3f81711e 3f96fea3 3f81711e 3f000000 3f400000 3f400000 -> 3f81711e 3f96fea3 3f7179b5", + "3f9da8ea be10b18d 3eba1ec2 3d3a9d1c 3ebd7ede 3e67f1e6 bd765d03 -> 3ef602ec 3e1fbbbb be3d082d", + "3e15330f 3f10e376 3f10e376 3f65e07c 00000000 00000000 00000000 -> 3f10e376 3f10e376 3f65e07c", + "3f27f802 3f2ea239 3f8c0abe 3f2ea239 3e8f721f 3e8f721f 3eb54608 -> 3f2ea23a 3f52e524 3f73d292", + "3fb52cd4 3f8aae90 3f4cd437 3e584fa0 3f9127b0 3f8e81a0 3f9bae8f -> 3dc6d2b0 bd08c830 3fb90fd2", + "3fb11d67 bbb36101 3f51fb66 bbb36101 3dffacf0 3f322c7a 3dffacf0 -> bbb3615e 3f51fb66 bbb3615e", + "3fb6ed39 3f1dd169 3f596132 3f669bdd 3f7fd01d 3f730294 3ecba62e -> 3f82ec16 3f63a301 3efd2a32", + "beb661a3 3f068709 3f15d705 3f8f90a5 3f71c3f8 3f1a4574 3eea8611 -> 3ea05634 3f0b22c7 3faabe9c", + "3f00ddd0 3f4de5f4 be3308fe 3e2668ca 3f7b3cac bd6eba93 3c518389 -> 3f4de5f4 be3308ff 3cd82738", + "3f770fe3 3d323d5b 3f9236a4 3f34f5fe 3e978e99 3ca71fb0 3f7edb2b -> 3eafbbb7 3da7afb0 3f904480", + "be966ec0 3f0265a2 be47c29f be47c29f baa992e1 be29cb56 be3409a1 -> 3f0265a2 be53e87e be47c29f", + "3f4c8b76 3f0fc22f 3f53c668 3eb8f8f9 3f6b6899 3f1bd3f8 3f1bd3f8 -> 3f461a9a 3ee8ed08 3eb8f8f9", + "be8081ee 3f9641a3 3f80c6ae 3e20c0b0 3f8cb047 3f8cb047 3e7e8d88 -> 3f9641a3 3f76c4fb 3e20c0b1", + "3e061707 3f80c663 3f7f7389 bdb424df 3f1a5d94 3ea6c021 3f9088e3 -> 3f69886f 3f5b0d50 3d627f6e", + "bec98d5a be63bdcd be63bdcd 3e920380 3e9b274a 3df84097 3f481062 -> be8e0aae be63bdcd 3e920380", + "be4487e8 bd8a4e72 bd8a4e72 3ebe7d1c 3f909941 3f94d9c0 3f94d9c0 -> bd8a4e72 be1b8b5e 3ebe7d1c", + "3e07be1a 3f2682e7 3f26317b 3eff8327 3ef399ca 3f62de0d 3d7f7cd1 -> 3f23f3b3 3f263c46 3eff8327", + "3ed425ba 3e530f49 bd817670 bd817670 3f360ef1 3f360ef1 3f9849e2 -> 3dc1923b bd81766f 3d462bce", + "3f94c208 3e15fb87 3f5f0f95 3d53527a 3f000000 3f000000 3f800000 -> 3d144d22 bda698a8 3f808be9", + "3f698cee 3f8e4f5f bd58dfb8 3f758911 3f800000 3f000000 00000000 -> 3f8e4f5f 3ef4eae3 3d12a740", + "bec34d6e 3f54235c 3f308aec 3f5749c1 bd968eeb bd968eeb 3c9d0cad -> 3f61b74d 3f308aec 3f5749c1", + "3d0d89b3 3f386e96 3f386e96 3e290b6f 3ed6f953 3f437783 bdab7b2c -> 3f367074 3f386e96 3e290b6f", + "3f327799 3e386b0b 3e386b0b 3f4224fe 3ea1e49a 3e6934d5 3f9b1aa1 -> 3e5d872c 3e386b0c 3f4224fe", + "3f436738 bc83d916 3f8cdd4f 3f8cdd4f 3f02269a 3f96e1ac 3f9a353c -> bc83d905 3f88cb0a 3f8cdd4f", + "3f69c966 3f00abb3 3f4b7e9a 3ed80d42 3ea274dc 3e57b59f 3ea274dc -> 3f450084 3ee89e99 3f4335ee", + "bd8bde9e 3f32d031 bd51cdd9 be033df0 3f236034 3ec6c7fc 3f38be4e -> 3f366e75 bd3c479e be3d0dcd", + "3db58044 3f0c86a8 bdd7faaa bdd7faaa 3c8217c9 3f2e54d4 3f74c24e -> 3efb5be5 bd83f5ca bd4269fd", + "3f809eb3 be165494 bdb1dfab 3f2dca34 3f800000 3f400000 00000000 -> 3f2ed045 3ef347c3 be1a6cdc", + "3fa56db9 3ee7c245 bc16d5b5 3ed077f2 3f1e4803 3f800833 3f800833 -> be13b8ae 3f1673f8 3eee91b8", + "3e9e63aa 3f9305a9 3f9305a9 3f8098f6 3f60b43a 3e03267d 3f5df306 -> 3f9305a9 3f8d5288 3f863726", + "3e7124cf 3f2b52d5 3e04bec7 3f8a4045 3e95153e 3e95153e bdfd3a6f -> 3f44179f 3eb4f86f 3f5b3404", + "3f38d96f 3f8829d2 3db6e91e 3db6e91e 3f30e660 3e8109ce 3f140b00 -> 3f8829d2 3db6e922 3f1cbd5e", + "3f1a8b6e 3ea3cb8d 3f02f4f6 3e881dca bc33c514 3f875f44 3f8a750c -> 3e9315f3 3f021e8b 3ed40f1a", + "3f61f716 3f81ddf8 3f9eb477 3e878f53 00000000 3f800000 3f400000 -> 3eb499f2 3f9eb477 3f69096c", + "3e8d7cd4 3e752601 3f0bdaf7 3e752601 3ef8d33b 3f2fa9f9 3ecc0597 -> 3e87c813 3f0bdaf7 3e752600", + "3e9044aa 3ef8b5bf 3ee278b4 3ee278b4 3f974dad 3df7614c 3df7614c -> 3ef8b5bf 3ee278b4 3ee278b4", + "3e4250df bc0a33ae 3f94336d 3f94336d 3f000000 3f000000 3e800000 -> 3e59fbf3 3f94336d 3f6fbf0e", + "3f9f3d4e 3db784b8 3e742c16 3db784b8 bd7b6983 3eda4ced 3edf1ed7 -> 3db784b9 3e7094f1 3e8caf58", + "3f132a39 3f8b297c 3efa5cd1 bdf871a6 00000000 3f000000 3f400000 -> 3ec8f24a 3f19ef0c 3f12cb9e", + "3f9c1af9 3f47d895 3f47d895 3f30c94c 3e30570f 3ec0fa46 be3f979d -> 3f3da399 3f47d895 3f30c94c", + "bed88f98 3f86212c 3e89d690 3e26093a 3e2c385c 3e2c385c be109ef4 -> 3f86212c bd7655a8 3e26093a", + "3ec2a1fd be4bdd09 3f2d05fb 3f0e57ed 3f000000 3e800000 3f400000 -> bd064594 3eafc051 3f1a0195", + "3f9731b5 bdcb81c1 bdcb81c1 3f855611 3f77fdfa 3efce2d5 3e9ac0e4 -> 3f9fcd55 3e9394b5 be9cbd80", + "3e07f914 be210bd2 be5f36ae be5f36ae be796123 3f1cc5f8 3f1cc5f8 -> be294d18 be56f568 be56f568", + "3e039488 be065fa7 3f8f7ae5 3f50e3d6 3f8427d7 3f07cf74 3f07cf74 -> 3cf316c0 3f75c52a 3f31bb55", + "3f43432c 3f5899f6 3f41dd84 3f5899f6 3e946bce 3e946bce 3f4ccb91 -> 3f474274 3f41dd84 3f5899f6", + "bc4237ae 3f211441 3f5bc066 3f211441 3f8891e4 bdbe990b bcbf4219 -> 3f206234 3f5c7273 3f21098e", + "3f9e31bd 3f5bc736 3f82a781 3f82a781 3f095fbd 3e78d53f bdba81e3 -> 3f878d7c 3f6d4c8a 3f51fb3f", + "be8599ca 3f669158 3efc522c 3f7197e7 3f368552 3f5e6aa6 3f5e6aa6 -> 3f80e7e5 3ec01441 3f7197e7", + "3f469828 3f57489f 3f9cfba7 3f57489f 3ea4b6cd 3e93449e 3e93449e -> 3f91eb31 3f6d698c 3f57489f", + "3f2d79c0 3ea1e6ad 3f8b5fdd 3f8b5fdd 3e562f3e 3e7c34da 3e7c34da -> 3ea1e6ac 3f8b5fdd 3f8b5fdd", + "3f9b2f36 3efc6a4f be40bacb be40bacb 3f9e9d27 3f8c06e8 3d6e454e -> 3efc6a4f 3f093f8d be40baca", + "bc0c756e 3f12abc0 3f12abc0 3eb58a66 3f81f89a 3f81f89a 3f944eb6 -> 3f13266f 3f13266f 3eb49508", + "3df272f1 3f8455df 3f9f1e3f 3f2ebdac 3f93f4ba 3f9290ff 3f55bd08 -> 3f87818d 3f9ed4b5 3f2ebdac", + "3f9aecd3 3d87e592 3f3c8713 3f0cc936 3f1e6c63 3f836c01 3f1a7ecc -> 3dc41d61 3f3c8713 bd10de60", + "3f8768a4 bbe8bbb3 3ed5c42f 3ed5c42f bdd245b1 3efc73ca be5df375 -> 3d854d10 3ed5c42f bd01c268", + "3f87a586 3f116ede 3f8cabf6 3f7f31f9 3f14d81f 3dc7b5b8 3dc7b5b8 -> 3f90bb36 3f095060 3f0ae043", + "3fb335c3 3d031cfe be6aca45 3ed5ace9 3f724d47 3f7022e8 3f633902 -> 3f124d7c 3f0bc811 bef9d961", + "beef9d79 3e5bc241 3d9f7b52 3e5bc241 3f800000 3f400000 3f400000 -> 3e5bc241 3d9f7b52 3e8ea4bb", + "bed34208 bdfd773f 3ee1fe7c bdfd773f bce369ab 3edd3b5f bce369ab -> bdfd773e 3ee1fe7c bdfd773e", + "3f40a9a3 3e2c2ac1 3f9f7246 3ec7ec8b 3f8565bd 3f0424d1 3e3f1f44 -> 3f7aa4df 3f3f4206 3e647f78", + "3f283a20 be145a46 be145a46 3f475638 3eafb584 3f7e7740 3e921f4a -> bdc358e0 3eec8d03 3e2fe494", + "b9b2fdef 3f5eb25b 3f135053 3f5eb25b 3d131307 3f324360 3f7076d4 -> 3f5eb8f2 3f134b82 3f5eb25b", + "3f0a6a24 3e440624 3f2ff7a3 3e440624 3ef5fee7 3f8bba1a be166250 -> 3ea78db9 3f2ff7a3 3e440623", + "be85cc4a be5c9c22 3f49bff0 3ea45a22 3f1aea0a be3e7003 be3e7003 -> bef49312 3f867138 3eec2069", + "3f5ddac7 3ec393cb bda22599 3f43281f 3f02f72c bd9c34df bd9c34df -> 3f362b73 bda22596 3d077140", + "be16f583 3ef6a136 3f0dac03 3f69793f 3f400000 3e800000 3e800000 -> 3ed6267b 3f1060cd 3f79b69c", + "bdce8cad 3f920bdf 3e0b5a2e 3f149a07 bddc108a bddc108a 3f9c8c85 -> 3f9f04dc 3e0b5a2e 3f062147", + "3fb32eeb 3f92e2f1 3f1ee143 3e360339 3f8fac19 be1f922a 3f65df37 -> 3f92e2f1 3a2b4400 3fa6012e", + "3da9317f 3f95b964 3f7020f6 3f2dcccd bd4ff932 bd4ff932 3f3356a7 -> 3f9088b6 3f6aa62a 3f382e29", + "3f51386f 3efc8c5d 3f164e76 3efc8c5d 3f9647b0 3e38bb13 3f930a99 -> 3f11ea3d 3f02aa67 3f116a35", + "3fb812bd 3f00478f 3f1a4007 3f41d537 3ecce687 3f4bc3da 3f020278 -> 3f00478f 3f532c48 3efa694a", + "3f9634b4 3f25f973 3e251281 3df69900 3f987e6c 3d42ec51 be5403d6 -> 3f25f973 3e6790fe 3df698fe", + "3f5da94c 3d713586 3f36f083 3f867755 3f1467b8 3f9a4035 3f1467b8 -> 3d713582 3f80b2e4 3e4481cc", + "3fac640b 3f05559c 3f9aca4a 3f99bb33 3f2851c0 3c86222a 3f2851c0 -> 3fb959fd 3e906c6c 3f9b284e", + "bee47504 be5a2086 be5a2086 3f70f667 3f1a34f6 3ed0df8b 3f2f450e -> bf132d02 be5a2088 3f70f667", + "bed9de58 3f80cda3 3f80cda3 3f5e92bc 3f346214 3f346214 3f18a80b -> 3f80cda3 3f80cda3 3f5e92bc", + "3eb295c0 bc24dbc1 3f60654b bc24dbc1 3f162653 3e9b726c 3f162653 -> 3e992ed8 3f113a70 3e992ed8", + "3fa440b5 3f826f27 3d0e3b7c 3f174f29 3f7701ed 3eef8285 3eef8285 -> 3f826f27 3d0e3b88 bdfb93f8", + "3f6bbe03 bd8d1eba 3f9cf543 3f3f064f 3e8f8370 3f82705e 3e69988b -> 3c2023f8 3f9cf543 bb906180", + "3f5e892b bbc4bf6b bbc4bf6b be36b83f 3db8b617 3e248ec0 3e248ec0 -> be1fa36e bbc4bf6b bce9d660", + "3db02a72 be533432 be533432 3f101577 3dd9a464 3e58737c 3e58737c -> be533432 be0f7602 3f101577", + "3f707fb3 3f9bbdf7 3f85e84f 3e70d0c9 3f8f5a0d 3f4c41cf 3f8f5a0d -> 3f9bbdf7 3e918cd2 3f942266", + "3fb3499e 3f0d1cf3 3f693615 3f0d1cf3 3f400000 3f000000 00000000 -> 3f870e88 3f3e360c 3f0d1cf3", + "3ef13974 3f9c1f7e 3d9adb80 3ee35089 3ed30809 3e61e493 3f2b1871 -> 3f694ba4 3d9adb81 3f4f387f", + "be34c9a9 3f2ec8e5 be70cbc0 be70cbc0 3f8b8c10 3df5a4f8 be5db04c -> 3f2ec8e5 be8dc2ce be70cbc0", + "3e1a09e6 3f7679a4 3f7679a4 3c252d29 3f9aae53 3f78f1da 3f9be072 -> 3f751403 3f51c95a 3e1d13f9", + "3ec73bf2 3f8c3fb9 3f92e22a 3f92e22a 3f08a3cb 3ef6a5b8 3ef6a5b8 -> 3f8ed4a3 3f904d40 3f904d40", + "be8ddc14 3ef4fdb5 3f4b31cf be4e9263 3f400000 3e800000 3f400000 -> 3ec845c4 3f88e6b2 bef4805c", + "3ea14197 3f2f1811 3f0585d9 3f2f1811 3e752d54 3f32c76f 3f5f951c -> 3f220043 3f0f004f 3f2f1811", + "bdab9f13 3e7418c8 3f972846 3edab2b8 3f86f935 3f872409 3e946902 -> 3e235ad0 3f972846 3ee2cc1d", + "3ea3129c 3f6a0b6e 3f3cb0f9 3f6a0b6e 3d351efd 3f35210f b9adc72c -> 3f5c8238 3f4b22eb 3f5b997c", + "3e297081 3f180fa1 3f914093 3f180fa1 be5c9380 3f1aaa93 be5c9380 -> 3f180fa1 3f914093 3f180fa1", + "3fa7ec14 3f177c6b 3cf85fd1 3f67d886 bd44bf24 3e94151d 3f3a78a6 -> be144250 3f07742b 3f67d886", + "3f8fdfb0 3f1ef17d 3e132c15 be4e9a82 bd7d1e92 3ea2b54c 3ea2b54c -> be9b88f6 3f2e1776 3f390f58", + "3f81b200 3f7382d0 3f996fe4 3f7382d0 3e519eb3 3f73f15d 3f35007b -> 3f7382d0 3f996fe4 3f8f4ed7", + "3e8ce49e 3f71b768 3e345925 3e541003 3f6c7928 3ee825fe 3ec384a6 -> 3f71b768 3e50ecdc 3e4b55d8", + "3fbb2dd5 3e8dc5f8 3e8dc5f8 3f814127 3f8d7004 3f3c731b 3d65e346 -> 3faca076 3f78c474 bd7dba20", + "3ee6c9a3 3e15b8fe bd153ea1 3e15b8fe 3f400000 3f800000 00000000 -> 3e00a55b 3d3bfb8b 3d82d4e6", + "3f14710b 3f03c13d 3f95c4bd 3f40e644 3f000000 3f000000 3f000000 -> 3f03c13d 3f95c4bd 3f40e644", + "3eb4a32e 3f68c88a 3f81a3b9 3f68c88a 3e777486 3f9d5fbb 3f9d5fbb -> 3f68c88a 3f81a3b9 3f722199", + "3f04ed82 be387f37 3f93dba4 3f93dba4 3ef7d99b be55a21b 3ef7d99b -> 3f03603f 3eec6e74 3f93dba4", + "3fb9bbdd 3f7bed80 3e06f124 3f08cede 3ed563fa 3f6dfa1b 3ed563fa -> be815bbc 3faf2bd4 bd4c1440", + "3fb861fa 3f5701df 3f18b2a5 3f96e85e be521b5d 3f419162 be521b5d -> 3efa8094 3fb7c005 3eae06ae", + "bd8ec606 bdfaecb7 3f4d1d85 be71c92a 3d1b4249 3f0cacb0 bd9064a1 -> be024d1a 3f4d1d85 be71c92a", + "bed8dfb9 3d7fdc32 bd59372b bd59372b 3efca69b 3f99c492 3f8ee724 -> 3de41f8a bdd0cd06 bdc4c943", + "3fabb2f3 3f8c34ad 3f8c34ad 3e87cc72 3f7f6b1e 3ed7ed07 3e83da1e -> 3f8c34ad 3e6a5874 3e87cc73", + "bec4b2a4 bd850a09 3f717b6b be41f35c 3f6c40b4 3ea951a9 3f6c40b4 -> bee79493 3fb070d0 bf1fe30c", + "beb6392a 3f46a2bb bdf4146a 3f827224 3d9e8d42 be64ef08 be64ef08 -> 3f307a7a bdf41466 3fb64d30", + "3f551f52 3f94985e 3f862f59 3f94985e 3f533ec9 3ea2c4b8 3ea2c4b8 -> 3f94985e 3f862f59 3f88993a", + "3f648d0c 3f7c93f3 3f7c93f3 3f9ff01f 3ebf840d 3ebf840d be426f4b -> 3f9c547d 3f9c547d 3f81e59c", + "be97e6aa 3e43115f 3e43115f 3f1a78fb 3f000000 00000000 3f800000 -> 3e045894 3e43115f 3f1a78fb", + "be4a9fda 3f80d6d3 3f80d6d3 3e96eee8 3f9a5def 3f670f5d 3f82e8cf -> 3f80d6d3 3f92dde4 3e74c14c", + "beb851b6 3e4e5282 3f97e71b bda51685 3f517df2 3db82572 3f517df2 -> be1ce148 3fd24d4e bf096f36", + "be08b82a bdddddb7 bdddddb7 3f2e3315 3d43a310 3d385657 3f79917b -> bdde8188 bdddddb7 3f2e3315", + "3f23f5d3 3f1a4edf 3d733960 3f71e7d3 3f1b55ba 3f6000eb 3f283b85 -> 3e826dd8 3f20660a 3ef7f5bf", + "3f505179 3eeb7393 3f789b39 3eeb7393 3f000000 3f400000 3f800000 -> 3eeb7393 3f435ace 3f603a9c", + "be477cfe 3f96c0f2 3f220e2c 3f693b0c 3f34f2d7 3e16fe5b 3f19161c -> 3f96c0f2 3f220e2c 3f613720", + "3fa62c6b 3d69500b 3f15c69e 3f65f9ac be57fca9 3f8e9d91 3f8e9d91 -> 3d69500e 3f7de4a8 3f65f9ac", + "befea724 be354e30 3f500e2a 3f500e2a 3e8a6aa6 3f64dfeb 3e8a6aa6 -> be354e30 3f500e2a 3fa70a2d", + "3f8965a2 3f1896f3 3f6d5280 3f2c3ebb 3f4e7313 3e5a8ae6 3e5a8ae6 -> 3f738af7 3f125e7c 3f17258c", + "3fa94cd8 3f52d4df bdf24e44 3f89eba4 3ee33ee4 3f869ec4 3ee33ee4 -> bed82cb6 3fbb4ed4 bf011028", + "3d528c2e 3f9424bf 3e1de2ee 3f833b71 3f1f5ca8 be0c960b 3e119b9e -> 3f9424bf 3e1de2ee 3f7fdb98", + "3f4d8fa4 3e525fc3 bdc6ba56 3e525fc3 3f66682c 3f544956 3f66682c -> 3e525fc3 bdc6ba57 3e525fc3", + "bed85bc0 3f16b55c 3f5fdfeb be5973b8 3f1f507a 3f57d7dc 3f559f59 -> 3f6d5dd2 3f5fdfeb bf2751fe", + "3e22b7f8 3f755516 3e2f7fcc 3e2f7fcc ba8466b0 bd8fb7e1 3d513cab -> 3f67945b 3e2f7fcc 3e97c659", + "bec517f5 bce38478 3f3767b9 3f3767b9 bd44f479 3f94229e 3f577d7f -> bce3846e 3f3767b9 3f4a9a8f", + "bc38ea4c bcc7edd4 3ebbe677 3e9c49d1 3f4449ca 3f4449ca 3e07cc87 -> bcec1de3 3ebbe677 3e9e317c", + "3f84b0de 3eee90f9 3eafd12c 3f27f3da 00000000 3f800000 3f000000 -> 3ead8479 3f2ae2ce 3efced7c", + "3ee86fcd bd3c9713 bd3c9713 3f6e2a9b 3f9b9672 3f9b9672 be530edb -> 3ecb5f72 3ecb5f72 3ef962e2", + "3fafb01a 3f0533af 3f0533af 3f777c77 3f400000 3f800000 3e800000 -> 3f6dc6d8 3f910836 3eb53f74", + "be6ad048 3f9e6530 3d680cd4 3d680cd4 3f800000 3e800000 3f800000 -> 3f9e6530 3d680cd1 be5b41fb", + "3f96d6b6 3f15c5f4 3f223e1d 3f223e1d 3ea3c1cd 3f884ea6 3f8870c4 -> 3f15c5f4 3f2238dc 3f223e1d", + "3e996383 3f984d06 3e7645fb 3f984d06 bd4f2334 bd4f2334 3f3d6ad7 -> 3f67cac2 3e7645fb 3f984d06", + "3f631a5d 3e342d64 3f4733c0 3f047f7d bd8485b5 bd590545 bd590545 -> 3e342d64 3f4733c0 3f3fac33", + "3df2580a 3f7ef812 3f731a6e 3f9d4c49 3ebd9938 be5dee98 3f0523b0 -> 3f822711 3f731a6e 3f9d4c49", + "3eb9d709 3f927cb7 3f927cb7 bd7640fd 3e684687 3e684687 3f0281d9 -> 3f350c24 3f350c24 3ec11275", + "3f3739bc 3f8ffa44 3f8ffa44 3f295944 3f8d94a7 3f4fcd97 3e0d7ab9 -> 3f8ffa44 3f8311be 3f295945", + "3e3e8c0c 3ede9f45 3f65d6d7 be7bfc10 3f8b5ecf 3f7bd53d 3dd44f0f -> 3f055def 3f600687 be7bfc11", + "be802749 3f4fa6cc 3f4dca7a be5b0c73 3f000000 00000000 3f000000 -> 3f4fa6cc 3f8780ef bef0e372", + "3fb750fa 3f12d5c6 3f736e9f 3f121b0d 3f3f9a4b 3f3f9a4b 3f42bc09 -> 3f11ca5d 3ed01726 3f8ebf0d", + "bec4ebb7 3e9c0fbb 3e516f5c 3e516f5c 3f2164e4 3f065373 bd467630 -> 3e9c0fbb 3e30175c 3e516f5c", + "3f0ebb42 3d27d198 3cc81752 3f89da29 3ec372a4 3f8c8cc0 3f8c8cc0 -> 3d020836 3f1c7bf2 3f89da29", + "3f01f1a1 3f9f331c 3f9f331c 3f97be28 3f000000 3f800000 3e800000 -> 3f9cad21 3f9f331c 3f97be28", + "be4850e8 3f3fe9db 3f3fe9db 3f8a7100 3f12a95e 3f12a95e 3f125be5 -> 3f2f4aad 3f2f4aad 3f92c097", + "3ea4f981 3f89db04 3f72096a 3e9b0154 3f91255a 3f91255a 3ece1be6 -> 3f89db04 3f7ce31e 3e9b0154", + "3e737db5 3f9b1c93 3f93ef41 3f13b9ad 3f7fba28 3dbb00d7 bda689cb -> 3f9b1c93 3f8568a7 3f13b9ad", + "3d42d6b6 3e8789e9 3f74be3b 3e8fca09 3f682071 3f9b97df 3ec51256 -> 3e921da2 3f74be3b 3e8f6591", + "3f9f63b9 3ef4018b be7723e3 3e652b7b 3f6f0995 3eabd687 3f00194f -> 3ef4018b be7723e3 bddf89ee", + "3f4c84de 38098c25 3f306a2f 3f45660b bd9c01e5 bd9c01e5 3f9660a5 -> 3809777f 3e0deee4 3f45660b", + "3f8c0a88 3f6efcf9 be065f90 be28c993 3edd279f 3ee3b05e 3ee3b05e -> be894bf2 3f8450ad 3f84b847", + "3f246a53 3f2aedb3 3da8e36b 3d6a0887 3ed88416 3f7f22fb bc87929d -> 3ee42a50 3eeaa96f 3d6a0881", + "3fbda314 3f3ca169 3eba00be 3e0b64e3 3ef323ad 3f639aaa 3ef323ad -> be1cd06c 3f6aadfe 3e0b64e3", + "bed31e22 3ea97844 3ec1668b 3f7d5af7 3ef168f9 3f88792b 3f2dc4b2 -> 3ea97844 3e006bc6 3f955337", + "bee5edce be35fe0d 3ecca4bc be35fe0d 3ed96f0d be1cee4f 3f3e93dc -> beb07835 3f28b466 bedfc316", + "3fb84f51 3f1c3e22 3ebfdd2b 3ebfdd2b be764814 be764814 be781314 -> 3f1c3e22 3f36c64e 3ebfdd2c", + "be581603 bdff7490 3f241f22 3ee77d78 3e800000 3e800000 00000000 -> be929b5a 3f241f22 3f12e877", + "3f3e687b 3dcaa24c 3ea27de3 3d69ee4f 3ebf297e 3f98af6b 3f98af6b -> 3d8aea51 3ea27de3 3e8059be", + "3f6c543f 3f22f43a 3f89cc6a 3f5bb789 3f8591e7 3f2ea0ed 3ef28c68 -> 3f857885 3f51a550 3f2750ce", + "3f83e5c2 3eafcb27 3f6ee11e 3f6ee11e 3e957ef6 3f9949e8 3f9ed843 -> 3eafcb28 3f67c35c 3f6ee11e", + "3e3c2579 3f10f4d7 3f1b4d3e 3f10f4d7 00000000 3f800000 00000000 -> 3f10f4d7 3f1b4d3e 3f10f4d7", + "3f6a1a6c bb1b7061 bb1b7061 3e89e7f2 3f400000 3f000000 3f400000 -> 3e7c034f bb1b705c 3e89e7f2", + "3f5efcdc be462e65 be462e65 3f61f165 be2a5205 3f0865f8 3dd76075 -> be462e66 3f3e6ae7 3e9e540c", + "3d3f225a be67aedf 3f53fd05 be67aedf 3f71dbab be4e4e0f 3f1038d5 -> be354da8 3f4764b7 be461106", + "bea8690e be4ab475 3f47773e 3f47773e be675db8 bc0aab8d 3e932164 -> be4ab476 3f76e25a 3f47773e", + "bea3bc5f 3f62a5f9 bd849ebd 3ef05b9c 3e80ceca 3f66ba73 3f9cad01 -> 3f98372f be891704 3eac42c1", + "3f323a06 3f90620b 3f90620b 3e53dee7 3e452ffd 3d8d456e 3f0850d8 -> 3f285ffc 3ef93518 3f592144", + "bda5f312 3e13122a be74f48b 3e13122a 3eb42af2 3ea9f141 3f23b372 -> 3e30c624 be74f48b 3e13122a", + "be7c6713 3f447b55 3f03342d bdcb2d26 3e800000 00000000 3e800000 -> 3f447b55 3f29cdcb bea02cb0", + "3ee0437e 3ef8b182 3ec21c0a 3ef8b182 3c029999 be40f5e7 be40f5e7 -> 3ef8b182 3ec21c0a 3ee0c8ec", + "bed7c2ac 3f8ac064 3d6c5b12 3f78f636 bda4983a bda4983a 3dbe0a26 -> 3fc21c1e 3d6c5b0d 3f6cef2c", + "bea33762 3e5878ac 3ef5cde4 3e7b4374 3f8308e7 3e994a08 bd13d360 -> 3e00c33c 3f09e360 3e832d63", + "3ebe7bce bdc21bfe 3f23bd5e bdc21bfe 3eb04207 be10b3dc bc650070 -> 3e36b921 3ebb972c bcbd7cf8", + "bede3fb3 3eaa835b 3f279b70 3f39128c 3eff73d9 3eff73d9 3e47118c -> 3e27b6c8 3f20069f 3f646688", + "3f2f9b83 3f02ac2b be5fac61 3ebc3c43 3f4b8aa2 3c46558d 3f4b8aa2 -> 3f02ac2b be5fac61 3eee62de", + "3f3eb1ca 3eee2909 3e87035f 3eee2909 3f800000 3f400000 3f800000 -> 3eee2909 3e87035e 3eee2909", + "3f4ffd16 3f9a27de bdef40c0 3f4275b5 3f943e1c 3eb47729 3f2e6a0b -> 3f9a27de bdef40c0 3ef8a6d5", + "3e08c9d8 3f1b4a39 3dc4b208 be1d6393 00000000 3f800000 3e800000 -> 3f014a32 3e282fae be03638c", + "3f6b48e6 3f0ef815 3f6c9184 3eacca15 3f68ab2e 3f2c146a 3f68ab2e -> 3f64fe95 3ec517da 3f606aa2", + "3f99dff5 3f676ae7 3f676ae7 3e6fafd4 3e800000 3e800000 3f800000 -> 3dca08d0 3dca08d0 3f850ae1", + "3ec9523d 3f73e886 3f7f946b 3f703a0f 3f9fd4a0 be74e0ae 3eb034b6 -> 3f787f61 3f798afb 3f7297f1", + "3f9d103a 3e79bd8a 3f409616 3f065a7f 3ec35a37 3ec35a37 3dc85fff -> 3f5e235c 3f409616 3e386bfe", + "3f6242e5 3f90789b 3f90789b 3f4fdfca 3f88519c 3f388e94 3f88519c -> 3f90789b 3f594aa6 3f8bc32d", + "be01adde 3d6dfa4d 3f3804f6 3d6dfa4d 3f800000 00000000 3f800000 -> bcd180da 3f4d70a2 bcd180da", + "3ebf7200 3f4873e4 3f728cae 3f728cae 3f084a34 3f084a34 3f7676b7 -> 3f4873e4 3f62cf0f 3f728cae", + "3ec09fea bd64126c 3f344f4f 3f344f4f 3e9c865a 3f8f1233 3f530027 -> bd641272 3f344f4f 3f19d9ce", + "3e2da846 3e085d2d 3e085d2d be2963e2 3e800000 3f400000 3f400000 -> 3da90621 3e085d2d bdeb138b", + "3f001e30 3eec97f4 3ebb2e5c 3eec97f4 3f10f085 3f0a23e6 3f0a23e6 -> 3eec97f4 3ebb2e5c 3ed3dd54", + "3e762679 3f400bce 3f400bce 3f439f70 3f745409 3e03435a 3f90c22c -> 3f40c129 3f400bce 3f439f70", + "be0cf8c6 3dc400fc 3dc400fc 3f042306 3f800000 3e800000 3f400000 -> 3d1aeb3c 3dc400fc 3f09137f", + "3f45240b 3edf6581 3edf6581 3f229ee7 3ec7ec6c bddcd5d6 bd727652 -> 3f16e9a6 3edf6581 3efe779d", + "3cfb1689 3e0ed053 be6d3cef 3e2239fc 00000000 3f800000 3f800000 -> 3e032a3f be60fe89 3e2239fc", + "be062368 3dbaa593 3f0fe2c5 3f80b138 3f82777d 3f82777d 3f99bee6 -> 3dbaa594 3f1fad88 3f80b138", + "3ec3959b 3e53c553 3e24ea90 3f7450ed 3f800000 3f000000 3e800000 -> 3efc1850 3e862d80 3f26bc98", + "bd6882a1 3dae2715 3dae2715 3dedc21d 3dcccccd 3dcccccd 3dcccccd -> 3dae2715 3dae2715 3dedc21d", + "bc1775ea 3d8ae6bc 3ecbbab7 3ecbbab7 3f000000 3f000000 3f400000 -> 3d8ae6bc 3ecd4aad 3ecbbab7", + "3e3790a6 3f325af9 3f325af9 3ee873ff 3f7ca555 3f7ca555 3f9c053b -> 3f2737ce 3f2737ce 3efeba56", + "3fb11607 be2f762e be0aaaac be0aaaac 3f400000 3f400000 3f400000 -> be2f762e be0aaaac be0aaaac", + "3fa03409 3f7fd595 3f99eec0 3f99eec0 3f9fcec5 bdd45bdc be37311d -> 3fa07a51 3f762cd4 3f72be74", + "3f84b087 be2ca562 3e071e81 3e071e81 3e307f6d 3e0c176a 3f3db962 -> be19e03b be37ebf5 3e071e81", + "3fb0a138 3db1e755 3f74fa15 3db1e755 3f400000 3f400000 3f400000 -> 3db1e755 3f74fa15 3db1e755", + "3f431f8e 3f86564b 3f956ce1 3d1bf53a 3f0f2921 3f69abd5 3f373e45 -> 3e8ea3e4 3f956ce1 3ed6a9a1", + "3f690e15 3e9e4b5b bd9a0a4b 3f0dd157 3eb2c05d 3edb715a 3dab38ac -> 3eccd75d 3efec30d bc9a2f20", + "3e2fdf98 3ea05ef8 3ea05ef8 3eb76da5 3f85dca4 3d8fe9d4 3f3ad0db -> 3ea454c3 3ea05ef8 3eb62533", + "3f36179b be52aa68 3e8827a3 3f7d4fe7 3ed6da74 3ed385c9 3f932860 -> be4af9f3 bd8e7588 3f7d4fe7", + "beddf750 3f9d47dc 3f2c467d 3f2c467d 3f7be2ed 3f92fece 3f7be2ed -> 3fbc1f87 3edd2e4d 3f2c467d", + "3f704d6d 3f62a111 be79b418 be79b418 3e800000 00000000 3f800000 -> 3db90cb8 be79b41d 3f50e79c", + "3c5ddaf0 3f9e9145 3f3c7248 3f6b3f8e 3ec331ad 3de9af7f 3f7ff3b9 -> 3f9df57e 3f3c7248 3f6c5b6a", + "be7d264d 3f9997d2 3f99ca8c 3f99ca8c 3e819c8e 3d9b66f5 3d9b66f5 -> 3f998b48 3f99d716 3f99d716", + "3f1857c4 3d5f2ea7 3d5f2ea7 bcfef748 3e96e6c6 3f27ec34 3b0dbdc3 -> 3cd7c65f 3d5f2ea7 bcfef74a", + "3f9669b1 3ea35933 3f667fb5 3f010619 3f55c3df 3f15e30c 3f15e30c -> 3f804771 3e5e75b4 3e92c43c", + "3f4ee760 3f87c68a 3f2e962a bb4c2d68 3f9f0c85 3f999df2 3f9f0c85 -> 3f87c68a 3e035a10 3f5b51cd", + "be1c3652 3eee1602 3ebffc36 3f1178cd 3f5e5ff6 3e1670b0 3f5e5ff6 -> 3ee605c0 3ebffc36 3f1178cd", + "3f851441 3f7669b4 bcdd5cbc 3f7669b4 be5efb3a be2b74ba 3eb33fd7 -> bd87c250 3d835df8 3f7669b4", + "bec108fa 3f0aa15b 3e011be1 3e011be1 3f20ba9d bdf3ef96 3e56b61b -> 3f0aa15b 3e011be1 3d6a0a68", + "3f1b411d 3f6fc833 3df4cf67 3f96bfd1 b9978c14 b9978c14 3e2536c1 -> 3ee1d7f3 3df4cf61 3f96bfd1", + "3e63c61d be71ff77 3f121134 3f8f460e 3eb780a0 3f232bf0 3f232bf0 -> be71ff78 3f3150a1 3f8f460e", + "ba92763e 3f4ae47e 3f4ae47e 3ea45e30 3f12298d 3f851812 be5a1d9b -> 3f4af16a 3f4ae47e 3ea45e30", + "becbb2ed 3f428612 3f428612 3b9682a6 3e9f413d 3f41e9cc 3e9f413d -> 3f87b939 3f428612 3b9682b4", + "be7e89dd bd2ff1fa 3f5ca82a 3f5ca82a 3edab123 3f64bcef 3edab123 -> bd2ff1f7 3f5ca82a 3f8b1eac", + "be72a18a 3f41ee0c 3f283a00 bc5bab18 3f4abae8 3f4abae8 3f3a7827 -> 3f41ee0c 3f2222e5 bc5bab17", + "3ef0adfa 3da85031 bdb7bfcf bdb7bfcf 3e2e60e7 3e2e60e7 be22a9fe -> 3da85031 bc120570 bdb7bfcf", + "3f1981d6 3f8f21bc 3d9648c5 3f8f21bc bb146d01 3f215b73 3f92d3e3 -> 3efbbf58 3ed61e04 3f8f21bc", + "be5f69d7 3f918ace 3f14eaec be3b2f90 3f3be9b4 3f81303b bdcf19ba -> 3f9aadca 3eebccdd be3b2f90", + "3f6287e2 3f7ea5e1 3f7ea5e1 3f8f32ab 3f55a224 3ef03b4c 3f95e54b -> 3f86a28e 3f7ea5e1 3f8f32ab", + "3ef7cda7 3e5aff6c be41690c 3e97c1ca bc5499cc 3f04fe4f bc5499cc -> 3c9b2b00 3d3c62d0 3d7c0750", + "bde62c1e 3f8c08c5 bd9d31ce 3f26a280 3eae7fd2 3eae7fd2 be11bb79 -> 3f8c08c5 be555647 3f3b922e", + "3f946122 3f5299f7 3f5299f7 be2871e3 3e681b38 3e107588 bb135f31 -> 3f5299f7 3eca21ce be2871e8", + "3fb0466a 3f332d4c bdec76d8 be2996b3 3f2133bf 3f2133bf 3f8df2e5 -> befbed60 be3cf532 3f835f27", + "3fa5108b 3ece0d64 3ece0d64 3e1d338a 3f7118c6 3f9e78e6 3f8bc390 -> 3da6c784 3ece0d64 3ea1e0e6", + "3e7864d3 3f4c88ef 3e798eff 3eb73758 3d75b5ac 3e8d6c1e be76e4d8 -> 3f3e1f79 3ec1bd80 3ea90a81", + "bd015d63 3e894b00 3edb9715 3f376e28 3f5dd120 3ed5c5d7 3e85703c -> 3e820ae0 3edc4fc8 3f3b0e38", + "3e3c4069 bdec86df 3f90d7b8 3f1b9c78 3f6e7784 bc1d0ba6 3d907eb1 -> 3de90037 3f66fe8d 3efd21e7", + "3f5a7f88 3e71b424 3f6e6615 3f6e6615 be195ba4 be195ba4 3f37a6ce -> 3e71b426 3eacfeb0 3f6e6615", + "3f485fbb 3f33b7a0 3f74ea09 3ee3316e 3f7ad897 3f40b7b5 3f7ad897 -> 3f66bf63 3f0e2166 3f58615a", + "3ec88b3b bc05f672 3f2187cf bc05f672 3f861ff0 3d868e4d bd75c95a -> 3e77fc0b 3ed16d3e bc05f684", + "3f98f282 3ee5bd57 3f6e4429 3ee5bd57 3e15a278 3f643c86 3f643c86 -> 3ee5bd58 3f6e4429 3f83287d", + "3e817d7f 3f55a155 3f2aee79 3f2aee79 be7df396 3f8942d6 3dc92b82 -> 3f4ad4cd 3f35bb01 3f2dc365", + "3fbfcb5a 3f527c70 3f31d58b 3f720725 3f000000 00000000 00000000 -> 3f80dfc3 3f31d58b 3f11d726", + "3f37a644 3f38d2de 3f38d2de 3e295d28 3ef6bbd6 bc6858e0 3da7873b -> 3f38d2de 3ea537fa 3e787846", + "be207b4a 3f3a6630 3f3a6630 3eb4b04c 3eac6088 3f60334b 3eac6088 -> 3f4973f2 3f3a6630 3eb4b04c", + "3f0d48d7 3e0a589c 3f7ce1e8 3f2fe95c 3f0b7400 3f64f611 3f2d896c -> 3e0a589d 3f7ce1e8 3f0fca8c", + "be3d10f1 3f155a84 3f155a84 3f75e12d 3f696e26 bd94371f 3d274288 -> 3f038810 3f155a84 3f82d36c", + "3f5ef380 3f4fe233 3f74be08 3f74be08 3ee30987 bcc98444 3df4e900 -> 3f6ffbe5 3f54a456 3f5e87ec", + "3f2bb235 3f4425fd 3efceb5c 3f4425fd 3cf45805 3cf45805 3f839148 -> 3f1568b5 3efceb5c 3f4425fd", + "beefaff3 3f2df3bd 3f9b564c 3f9b564c 3f800000 00000000 3f000000 -> 3edbe4ed 3fbb56ef 3fab569e", + "3ec320cb bd590ec0 be64d911 3f920510 3ecd9f2e 3f012472 3f1e3bab -> bdf19983 3cc0d730 3f920510", + "3f6330e7 3f908ef3 3ea8db93 3d945444 3f8997e4 3f8997e4 3f30bfa2 -> 3f908ef3 3f850a86 3d94543e", + "bd1837e5 3f96bf40 3e8fad4c 3f4a85c4 3f4980ec 3f89c5aa 3cec075e -> 3f97ecde 3e7d3724 3f4f610c" + ] + }, + { + "function": "cycles_mix_sat", + "node": "ShaderNodeMix RGBA SATURATION", + "cases": [ + "00000000 00000000 00000000 00000000 3eea85c2 3ebc8558 3f8c7e60 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3ed2646a 3ed2646a 3f9dcf2e -> 3d2aa67c 3d2aa67c 3e800000", + "3f800000 00000000 00000000 3f000000 3e5c13a8 3e5c13a8 3f3d23c7 -> 3e14efc4 3e14efc4 3f000000", + "3fc00000 00000000 00000000 3f400000 3e8f5998 3ebd5b78 3e8f5998 -> 3f5a06a0 3f5a06a0 3f400000", + "bf000000 00000000 00000000 3f800000 3f546ebe 3f76a276 3f76a276 -> bedc7fcc bedc7fcc 3f800000", + "3e800000 00000000 3e800000 00000000 3eadcb1a 3f1efb3d 3f89a8bc -> 3ca19950 3e800000 3ca19950", + "3f400000 00000000 3e800000 3e800000 3f878fa4 3dd932fe 3f878fa4 -> 3c99d040 3e800000 3e800000", + "40000000 00000000 3e800000 3f000000 3f385b32 3f66ee86 3f385b32 -> 3f4c5e5d 3f262f30 3f000000", + "00000000 00000000 3e800000 3f400000 3f8c8754 3f8399fb 3f8399fb -> 00000000 3e800004 3f400000", + "3f000000 00000000 3e800000 3f800000 3ebb3cc7 3f39c4c9 3ebb3cc7 -> 3e810312 3ee0c24e 3f800000", + "3f800000 00000000 3f000000 00000000 bddd95e0 3f8c76c2 bddd95e0 -> bd49ec60 3f000000 bd49ec60", + "3fc00000 00000000 3f000000 3e800000 3e9f5580 3edebb8a 3e92cbcf -> 3efd151e 3f000000 3efe8a8f", + "bf000000 00000000 3f000000 3f000000 bcb078d8 3cce91e8 3e88f9d1 -> 3ca4e870 3f000000 3f000000", + "3e800000 00000000 3f000000 3f400000 3f8fa228 3ebdb5e5 3f03d449 -> 3d7d97d0 3f05487d 3f400000", + "3f400000 00000000 3f000000 3f800000 3f800000 3f000000 3f000000 -> 3ec00000 3f2ffffe 3f800000", + "40000000 00000000 3f400000 00000000 3eedbdcf 3f500892 3f627460 -> 3f4991d1 3f400000 3f4991d1", + "00000000 00000000 3f400000 3e800000 3f800000 3f400000 3f400000 -> 00000000 3f400000 3e800004", + "3f000000 00000000 3f400000 3f000000 3f389e06 3f7cfa55 3f8a708a -> 3e800588 3f400000 3f155644", + "3f800000 00000000 3f400000 3f400000 3f688a05 3f69b7f7 be1f50d8 -> be02e0c6 3f400000 3f400000", + "3fc00000 00000000 3f400000 3f800000 3f822d6e 3dfc679f be6c3b3f -> beae35c4 3f2a3948 3f800000", + "bf000000 00000000 3f800000 00000000 3e995259 3c8de700 3f04f3a7 -> bc889e00 3f800000 bc889e00", + "3e800000 00000000 3f800000 3e800000 3ed3bd32 bd558817 3d727462 -> bd011560 3f800000 3e67cc00", + "3f400000 00000000 3f800000 3f000000 3f91b519 3f9b8da3 3f9b8da3 -> 3f33d8e4 3f800000 3f59ec72", + "40000000 00000000 3f800000 3f400000 3f000000 3e800000 3f800000 -> 3f000000 3f800000 3f600000", + "00000000 00000000 3f800000 3f800000 3e755d18 3f545ad7 bdc9a48e -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3eeab007 3f625467 3f625467 -> 3e800000 3d84ba10 3d84ba10", + "3f800000 3e800000 00000000 3e800000 3e14d492 3e14d492 3ee0dcff -> 3e800000 3da97058 3e800000", + "3fc00000 3e800000 00000000 3f000000 3e6e5f52 3e79d755 3f44fea9 -> 3eba1506 3e685418 3f000000", + "bf000000 3e800000 00000000 3f400000 3f000000 3f000000 3f800000 -> 3e00000a be400000 3f400000", + "3e800000 3e800000 00000000 3f800000 3f9eea7e 3f03b01a 3f03b01a -> 3ea7c6a0 3dd42350 3f800000", + "3f400000 3e800000 3e800000 00000000 3f6bb93b be40fbe9 3f6bb93b -> 3e800000 3e800000 bd1d3028", + "40000000 3e800000 3e800000 3e800000 3ecb9b3c 3e92a5a4 3ecb9b3c -> 3e800000 3e800000 3e800000", + "00000000 3e800000 3e800000 3f000000 bdb76fdb 3f8cb0fd 3f8cb0fd -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f93d281 3f991b85 3f93d281 -> 3ef95f49 3ef95f49 3f400000", + "3f800000 3e800000 3e800000 3f800000 be626f12 3f8ee93a be212252 -> be4acee8 be4acee8 3f800000", + "3fc00000 3e800000 3f000000 00000000 3f856f04 3ec45f10 bdcc998d -> 3e5b3322 3f000000 bd933378", + "bf000000 3e800000 3f000000 3e800000 3f98ffde 3f6082b1 3f98ffde -> 3e442c70 3f000000 3e442c70", + "3e800000 3e800000 3f000000 3f000000 3f000000 3f400000 3f000000 -> 3e8aaaaa 3f000000 3f000000", + "3f400000 3e800000 3f000000 3f400000 3ecd7e43 3f95c3e0 bddd5f86 -> 3c2c9830 3ec2b25a 3f400000", + "40000000 3e800000 3f000000 3f800000 3f80de6a be29a776 be29a776 -> bf144154 bd580de0 3f800000", + "00000000 3e800000 3f400000 00000000 3ed97260 bda9dbb4 3f8c6bb2 -> 3e7ffffc 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3ec84492 3f5a635c 3ec84492 -> 3e9808dd 3f400000 3e9808dd", + "3f800000 3e800000 3f400000 3f000000 00000000 3f400000 00000000 -> 00000000 3f400000 3ec00000", + "3fc00000 3e800000 3f400000 3f400000 3f0dd3db 3f6a6de2 3f6a6de2 -> 3f0e3cc5 3f400000 3f400000", + "bf000000 3e800000 3f400000 3f800000 3f266705 3f2d6390 3f266705 -> bdd6bd40 3f21b81a 3f800000", + "3e800000 3e800000 3f800000 00000000 3f3a9d81 3e43d96a 3da6297f -> 3e8aaf4c 3f800000 3ce3f140", + "3f400000 3e800000 3f800000 3e800000 3e800000 3f400000 3f400000 -> 3ea00000 3f800000 3ea00000", + "40000000 3e800000 3f800000 3f000000 3f400000 3f400000 3f400000 -> 3fe00000 3f800000 3fbfffff", + "00000000 3e800000 3f800000 3f400000 3ec7608f be059340 3f1bf295 -> 3e800000 3f800000 3f400004", + "3f000000 3e800000 3f800000 3f800000 3f0bc189 3f0bc189 3f901bc7 -> 3ebc2250 3f800000 3f800000", + "3f800000 3f000000 00000000 00000000 3f2fefce bdb17c2d 3f8f97cb -> 3f000000 bd1e3630 bd1e3630", + "3fc00000 3f000000 00000000 3e800000 3f0c933a 3f0c933a be29252c -> 3f000000 be670580 3e0c7d40", + "bf000000 3f000000 00000000 3f000000 3eba51dc 3f4f6d17 3f4f6d17 -> 3f000000 bde5f378 3f000000", + "3e800000 3f000000 00000000 3f400000 3e64a5ef 3f6593d5 bdee45fb -> 3efbd93f bcc745e0 3f400000", + "3f400000 3f000000 00000000 3f800000 3dbb45aa 3e18f2e3 3e4246f8 -> 3f2e44ee 3eb913b8 3f800000", + "40000000 3f000000 3e800000 00000000 3f526684 3f5a4363 3f9e2710 -> 3f000000 3f1524ae 3f2a495b", + "00000000 3f000000 3e800000 3e800000 3f673b95 3f94634c 3e95c9e6 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3e6092ca 3f4b271d 3e6092ca -> 3f000000 3e46bf8c 3f000000", + "3f800000 3f000000 3e800000 3f400000 3d6b74ad be6e2e55 3deba18d -> bec427d1 bfc213e8 3f400000", + "3fc00000 3f000000 3e800000 3f800000 bbab2910 3eb54f5e 3c64b6d5 -> 3e70e55c be16a808 3f800000", + "bf000000 3f000000 3f000000 00000000 3f4163dd be4ee798 be4ee798 -> 3f000000 3f000000 3d88f1e8", + "3e800000 3f000000 3f000000 3e800000 3ec81b87 3ebb2527 3ebb2527 -> 3f000000 3f000000 3e9bdab1", + "3f400000 3f000000 3f000000 3f000000 bd9c15b0 be66b64d 3f5773c6 -> 3f000000 3f000000 3f000000", + "40000000 3f000000 3f000000 3f400000 3f425af6 3eade824 3f425af6 -> 3e2f327e 3e2f327e 3f400000", + "00000000 3f000000 3f000000 3f800000 3f9aa972 be06c236 bc26230b -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3e346cd9 bd7b3b44 3e346cd9 -> 3ee9b893 3f400000 be05aca0", + "3f800000 3f000000 3f400000 3e800000 3ef94094 3ef94094 bcf34703 -> 3eb449a4 3f400000 bd3b65c0", + "3fc00000 3f000000 3f400000 3f000000 bd828b6b 3f86e356 3f87e5e8 -> bea294f5 3f400000 bea294f5", + "bf000000 3f000000 3f400000 3f400000 be4a6601 bcc852c5 be4a6601 -> c011fd28 3f400000 3f400000", + "3e800000 3f000000 3f400000 3f800000 3f963296 3f52547b 3f71a236 -> 3f0ccfb6 3f4667d9 3f800000", + "3f400000 3f000000 3f800000 00000000 3f7a0d8a 3f2c0e35 3ebce14e -> 3f2441df 3f800000 3e91077c", + "40000000 3f000000 3f800000 3e800000 3f1fd8ae 3f1fd8ae 3f6f92ce -> 3f87344b 3f800000 3f8ace70", + "00000000 3f000000 3f800000 3f000000 3ea872a8 3ef83680 3ec87768 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3f38bc02 3f0116f4 3f93d7fa -> 3eefc360 3f800000 3f3bf0d8", + "3f800000 3f000000 3f800000 3f800000 3f20fd6a 3d56749c 3d56749c -> 3daa8270 3f800000 3f800000", + "3fc00000 3f400000 00000000 00000000 be7fe1bb be7fe1bb 3f431a01 -> 3f400000 bebcdc48 bebcdc48", + "bf000000 3f400000 00000000 3e800000 3ea721a4 3f598480 3ea721a4 -> 3f400000 be138658 3e1da679", + "3e800000 3f400000 00000000 3f000000 3cb468ae 3eea29d8 3ee3e2de -> 3f400000 3c13eca0 3f00c53a", + "3f400000 3f400000 00000000 3f400000 3f69ecfa 3d92b17e bda5bc58 -> 3f400000 bd4c0c18 3f400000", + "40000000 3f400000 00000000 3f800000 3ed5c916 3ec50848 3d9ba419 -> 3f574bf9 3eba5fc8 3f800000", + "00000000 3f400000 3e800000 00000000 3f000000 3f000000 3f000000 -> 3f400000 3e7fffff 00000000", + "3f000000 3f400000 3e800000 3e800000 3e800000 00000000 3f800000 -> 3f400000 3dfffffc 3dfffffc", + "3f800000 3f400000 3e800000 3f000000 3efac4cb 3f9695b4 3efac4cb -> 3f400000 3e9fde66 3f07f79a", + "3fc00000 3f400000 3e800000 3f400000 00000000 3f800000 00000000 -> 3f400000 bdfffffc 3f400000", + "bf000000 3f400000 3e800000 3f800000 3f9081f8 3f4fc03c 3f9081f8 -> 3f2bff39 3c7f66c0 3f800000", + "3e800000 3f400000 3f000000 00000000 3e515089 3d86100a 3f817058 -> 3f400000 3f010924 3c46dbc0", + "3f400000 3f400000 3f000000 3e800000 3f6e526b 3f6e526b 3f1c7ebb -> 3f400000 3f174772 3edd1dc8", + "40000000 3f400000 3f000000 3f000000 3f000000 00000000 3f000000 -> 3f400000 beffffff beffffff", + "00000000 3f400000 3f000000 3f400000 3f1515ed 3ea33e34 3e633673 -> 3f400000 3effffff 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f5d8086 3f5d8086 3e89931f -> 3f33e00b 3ecf802c 3f800000", + "3f800000 3f400000 3f400000 00000000 3f218ebc 3f7651cb 3f5bf1d4 -> 3f400000 3f400000 3efbdc3c", + "3fc00000 3f400000 3f400000 3e800000 3f0ae9ad 3f0168bf 3f6eb605 -> 3f400000 3f400000 3ef84252", + "bf000000 3f400000 3f400000 3f000000 3f920247 3f55bb37 3f920247 -> 3f400000 3f400000 3ef37911", + "3e800000 3f400000 3f400000 3f400000 3b1340fd be6c2711 3ed703fa -> 3f400000 3f400000 3f400000", + "3f400000 3f400000 3f400000 3f800000 be255eb9 3f8c76a7 be1cd61d -> 3d9df488 3d9df488 3f800000", + "40000000 3f400000 3f800000 00000000 3eec54b9 3eec54b9 3f84f5f9 -> 3f78e0da 3f800000 3f638368", + "00000000 3f400000 3f800000 3e800000 00000000 3f400000 3f000000 -> 3f400001 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3ce71b93 3ce71b93 bdf953bc -> bee85d0c 3f800000 bff42e86", + "3f800000 3f400000 3f800000 3f400000 3e5d1e3a 3f5d6e07 3f9e3749 -> 3e32e39c 3f800000 3e32e39c", + "3fc00000 3f400000 3f800000 3f800000 3f400000 3f000000 00000000 -> bec00000 3f800000 3f800000", + "bf000000 3f800000 00000000 00000000 3f8777a8 3eebd5a8 3eebd5a8 -> 3f800000 be5ed5a8 be5ed5a8", + "3e800000 3f800000 00000000 3e800000 be723aee 3f0e7435 3f0bf35d -> 3f800000 bdd9a710 3e2e6158", + "3f400000 3f800000 00000000 3f000000 3e31f456 3f9ce714 3f9d4bfc -> 3f800000 3dd93718 3f0d9372", + "40000000 3f800000 00000000 3f400000 3e66562a bd941773 3e91009d -> 3f800000 bf02ba1c 3f1f5179", + "00000000 3f800000 00000000 3f800000 bd269807 bd269807 3f8093ae -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f400000 3f800000 3f400000 -> 3f800000 3f080000 3ec00000", + "3f800000 3f800000 3e800000 3e800000 3f0c3aa6 3f058015 3f3e3870 -> 3f800000 3f33aa68 3f33aa68", + "3fc00000 3f800000 3e800000 3f000000 3eb5760a 3f4a0fb9 3ec74da9 -> 3f800000 3f0c6cea 3f32f348", + "bf000000 3f800000 3e800000 3f400000 3e15c8a3 3e15c8a3 be197254 -> 3f800000 3f632152 3f766070", + "3e800000 3f800000 3e800000 3f800000 3f12e436 3f21641f 3f12e436 -> 3f800000 3ed48012 3f800000", + "3f400000 3f800000 3f000000 00000000 bdd96e82 3f79dad4 3f933ee9 -> 3f800000 3eee47b4 bd8dc260", + "40000000 3f800000 3f000000 3e800000 00000000 00000000 3f800000 -> 3f800000 3e2aaaa8 be800000", + "00000000 3f800000 3f000000 3f000000 3f8b6e43 3f9804e5 3f8b6e43 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f9617fc 3f9617fc 3dbc9a4f -> 3f800000 3e941ae6 3f2506ba", + "3f800000 3f800000 3f000000 3f800000 3f7fd062 3ee585e4 3f016b4e -> 3f800000 3ee5b09e 3f800000", + "3fc00000 3f800000 3f400000 00000000 3e9fe002 3b833a5c 3db91720 -> 3f800000 3f413b31 3c9d9880", + "bf000000 3f800000 3f400000 3e800000 3ecfccbe 3f59cac2 3f9f9e4a -> 3f800000 3f3cc7bc 3e595cd8", + "3e800000 3f800000 3f400000 3f000000 3f405a25 3cdf6c98 3f840caf -> 3f800000 3f30d892 3ec3624a", + "3f400000 3f800000 3f400000 3f400000 baf549cf baf549cf 3f4e1845 -> 3f800000 3e3e36f8 3e3e36f8", + "40000000 3f800000 3f400000 3f800000 3ed58ac4 3ef036e4 3ef036e4 -> 3f800000 3f83932b 3f800000", + "00000000 3f800000 3f800000 00000000 3f25b347 be2f082a 3f5e13ba -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3da11422 3da11422 3f79c05b -> 3f800000 3f800000 3e2946f4", + "3f800000 3f800000 3f800000 3f000000 3e4b8e9c 3f3cf61e 3f94b703 -> 3f800000 3f800000 3e2f33fc", + "3fc00000 3f800000 3f800000 3f400000 3f336ba9 3f918de2 3f918de2 -> 3f800000 3f800000 3f0cac45", + "bf000000 3f800000 3f800000 3f800000 3f029a34 3f945bdc 3f029a34 -> 3f800000 3f800000 3f800000", + "3e800000 00000000 00000000 00000000 3f4772ee 3f88d44c 3f88d44c -> 00000000 00000000 00000000", + "3f400000 3e800000 3e800000 3e800000 3f400000 3f400000 3f000000 -> 3e800000 3e800000 3e800000", + "40000000 3f000000 3f000000 3f000000 3f400000 3e800000 3f800000 -> 3f000000 3f000000 3f000000", + "00000000 3f400000 3f400000 3f400000 3f8172a6 bd8d7398 be20818a -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f292886 3f602635 3eeff159 -> 3f800000 3f800000 3f800000", + "3f800000 3fa00000 3fa00000 3fa00000 3eb5288a bd9b9cae 3eb7caaa -> 3fa00000 3fa00000 3fa00000", + "3fc00000 be800000 be800000 be800000 3e41ccd7 3e41ccd7 3eeba819 -> be800000 be800000 be800000", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3e9128e4 3f17d87f 3f8fa9aa -> 3dcccccd 3dcccccd 3dcccccd", + "3e800000 3f666666 3f666666 3f666666 3f3c8a8f 3f3c8a8f 3f245f62 -> 3f666666 3f666666 3f666666", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 00000000 3f800000 3f400000 -> 3eaaaaaa 3eaaaaaa 3eaaaaaa", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab be050b21 3f1ca405 be050b21 -> 3f2aaaab 3f2aaaab 3f2aaaab", + "00000000 3f45da43 3ef91b40 3f950435 3f7fe0a5 3f441e82 be21637a -> 3f45da45 3ef91b40 3f950435", + "3f000000 3ec9889a 3f620238 be7c4fd7 3f5dc736 3e07f5b9 be2364f9 -> 3ed2d396 3f620238 be51695b", + "3f800000 3f5f44a5 3ef69dd6 be5a7c29 be800000 be800000 be800000 -> 3f5f44a5 3f5f44a5 3f5f44a5", + "3fc00000 3e10b3bb 3e10b3bb 3eeeaaf9 3f265543 3f265543 bd3d736a -> bdf6a444 bdf6a444 3eeeaaf9", + "bf000000 3ec9b7f0 3e8360ee be3f7829 3f8a0147 3f7dbaea 3f7dbaea -> 3ec9b7f0 3e444492 beec51dc", + "3e800000 3e72ac84 3f9493fc 3f817685 3f692d25 3efee1b9 3f3138d8 -> 3eac34fe 3f9493fc 3f8384d4", + "3f400000 3f2713e8 3f2713e8 3f7c825f 3e778bf8 3f22ccdc 3e778bf8 -> 3ee3858f 3ee3858f 3f7c825f", + "40000000 3eec80bd 3f350843 3e04f950 3f64c8a5 3f81febd 3eca74f2 -> 3f15e481 3f350843 3ed774c7", + "00000000 3f08ba08 3f08ba08 3e17592c 3f97909d 3f97909d 3f4c012a -> 3f08ba08 3f08ba08 3e17592d", + "3f000000 be49eb32 be5731e7 be5731e7 3e982d12 3ea8afec 3f7a3942 -> be49eb32 be0a4c15 be0a4c15", + "3f800000 be0a939d be0a939d 3ea75ae0 3f8c8a9a 3f8c8a9a 3eb5fe02 -> 3dd8b6cf 3dd8b6cf 3ea75ae0", + "3fc00000 3dbac00d be535813 3e307453 bd834238 3e67b4df bd834238 -> 3e113ac1 3cf59f27 3e307453", + "bf000000 be4c2a21 3f91570a 3f91570a 3f0a1b6a 3f80c705 3f0a1b6a -> bf1a7f1c 3f91570a 3f91570a", + "3e800000 3e4f1be2 3e4f1be2 3ee34e20 3e8cf00b 3da4520d 3da4520d -> 3e3c7576 3e3c7576 3ee34e20", + "3f400000 3ea8fdf5 bd3abfe9 3ea8fdf5 3e137907 3f817d49 3f8d857c -> 3ea8fdf5 3caac5e6 3ea8fdf5", + "40000000 3f9a9cb0 3f9a9cb0 3f024e28 3e65c50d 3ed66f43 3f34ce18 -> 3f9a9cb0 3f9a9cb0 3e845b20", + "00000000 3f1d3ac1 3ce601e3 3f1d3ac1 3d2fc5a7 3f3275f0 3d2fc5a7 -> 3f1d3ac1 3ce601ea 3f1d3ac1", + "3f000000 3f0a5da9 3e4cd666 3f17c480 3f90b46f 3f90b46f 3f9d9837 -> 3f103d53 3ebe9054 3f17c480", + "3f800000 3f3487f9 3f5289fa 3f3487f9 3ea2af11 3ea736fb 3ea736fb -> 3f4cd589 3f5289fa 3f4cd589", + "3fc00000 3f567b77 bd5f9739 bd5f9739 3de0bc14 3dfc3df1 3de0bc14 -> 3f567b77 3f92d02c 3f92d02c", + "bf000000 3f4bbecd 3f4bbecd 3ef4be92 3f0eea2b 3f0eea2b 3ec3ebc2 -> 3f4bbecd 3f4bbecd 3ee375c3", + "3e800000 3f39634a 3f589f91 bd0818d1 3ea2919c 3f5bad06 be7ac2ee -> 3f3789e2 3f589f91 bdaeacbe", + "3f400000 3f82ac16 bdd763fe 3f034a40 3e67b25d 3f78726c 3f78726c -> 3f82ac16 3e1bdea3 3f210471", + "40000000 be2c60e4 3e529b94 be2c60e4 3d39d4eb 3d39d4eb 3e480d7c -> 3e87192e 3e529b94 3e87192e", + "00000000 be4aef5b 3efe422d 3efe422d 3f412c43 3f7b5994 3f7b5994 -> be4aef5b 3efe422d 3efe422d", + "3f000000 3f3cec01 3e897f31 3e897f31 3dfc98b4 3f4684bd 3f4684bd -> 3f3cec01 3e4597e2 3e4597e2", + "3f800000 3f81c61c 3e1d5950 3f81c61c 3f9afbdd 3f0abfb8 3f0abfb8 -> 3f81c61c 3ee85c07 3f81c61c", + "3fc00000 3be6a632 3e9b6476 3e9b6476 be57f325 be57f325 3f5c8b80 -> bdeb70a1 3e9b6476 3e9b6476", + "bf000000 3e83bfdb 3e83bfdb be3a7dbd 3f809c5b 3e5c0dc7 3f967ddd -> 3e83bfdb 3e83bfdb be97e8ae", + "3e800000 3f7ffd32 3f8756c9 3f411dbd 3d2e89e9 3e035089 3f40211a -> 3f7792cb 3f8756c9 3f14ade4", + "3f400000 bdd03eed bd90a946 bd90a946 3e862791 3f35914c 3e862791 -> bd384980 bd90a946 bd90a946", + "40000000 3f90b1f8 3f90b1f8 3f5bb252 3df4d2ee 3f1e25d0 3df4d2ee -> 3f90b1f8 3f90b1f8 bed76505", + "00000000 3da372b3 3f171206 3da372b3 3d9b92ae 3f958737 3f756829 -> 3da372af 3f171206 3da372af", + "3f000000 be665374 3b8893a5 bbb206e5 3f84bc5e 3edf8cd1 3edf8cd1 -> bde4876a 3b8893a5 ba330cab", + "3f800000 3f9058a7 3f67fe04 3f2a5da7 3e9b10f6 be339cf9 3eba2da2 -> 3f9058a7 3ea74094 bf0b419d", + "3fc00000 3f6d90e3 3f9bf789 3f6d90e3 3f0f9e84 3f938b72 bd571f07 -> bf0c1a10 3f9bf789 bf0c1a10", + "bf000000 3f977ad4 be44f013 be5c6e8c 3f174c27 3f815e70 3f174c27 -> 3f977ad4 bf23762a bf2b3d76", + "3e800000 3f05d6f9 3eea9eb1 3f16fa0d 3f08c25c be238a78 be238a78 -> 3ee255e7 3e9965a7 3f16fa0d", + "3f400000 3f73c532 3f73c532 3efa5535 3f6839fa 3f6839fa 3ed87eaf -> 3f73c532 3f73c532 3ee90695", + "40000000 3f2d15bf bd091eaf 3f9bd0e1 3f9285bf 3e9da28e b9d491c1 -> 3f3467d6 3d059667 3f9bd0e1", + "00000000 3edd2d2d 3edd2d2d 3eb7096b be54ed57 3f94e265 be54ed57 -> 3edd2d2d 3edd2d2d 3eb7096b", + "3f000000 3f87fc33 3f8526b6 3f87fc33 3ec23342 3f9b3449 3ec23342 -> 3f87fc33 3f2fb074 3f87fc33", + "3f800000 3d3b5bf0 3f18a51b 3f18a51b 3f81afff be6b37a8 3f7957f4 -> be0a6d8d 3f18a51b 3f18a51b", + "3fc00000 bdbab935 3f83a593 3f02ce67 bc559f53 3eeb808a 3e401c57 -> 3af32e86 3f83a593 3f0dd06a", + "bf000000 3d3c2562 3d3c2562 3f304c46 3e97ac4d bd401ec3 3f4a5b4b -> 3db6f454 3db6f454 3f304c46", + "3e800000 3e8711ab 3e76bc0e 3f5a18de 3f5e568a 3f24f7cf 3f955746 -> 3ea35b91 3e98c157 3f5a18de", + "3f400000 3f6d76cb 3f8e6056 3f6d76cb 3f000000 3e800000 00000000 -> 3e6d76cb 3f8e6056 3e6d76cb", + "40000000 3f1579b4 bdfdecfd 3ef97571 3f68aad3 3f9e29c9 3eefc5ed -> 3f1579b4 3f110abf 3f14deb8", + "00000000 3e1c77bb 3f938edc 3e8b6b27 3f53e21a 3f0f4455 3f53e21a -> 3e1c77be 3f938edc 3e8b6b32", + "3f000000 3f8bdc56 3f81c3de be7a7e40 3f0b7951 3f0b7951 3f1c1811 -> 3f8bdc56 3f865fae 3ebb5093", + "3f800000 3e08117c 3f38b1ff 3e08117c 3f70791c 3ec1484c 3f8b517c -> 3e801e33 3f38b1ff 3e801e33", + "3fc00000 3f9f22d5 3ecaf9a8 3f88995c 3eddf4d4 3f0aa626 3eddf4d4 -> 3f9f22d5 3fa5b161 3fa07fd6", + "bf000000 3efd4249 3dc243d1 3dea6319 3f790f0e be2a1fc3 3f02f30c -> 3efd4249 3e3cf268 3e4c823c", + "3e800000 3f0f2fdd 3f0f2fdd bd9023b0 3f9eed76 be7eb506 3f9eed76 -> 3f0f2fdd 3f0f2fdd bda5797e", + "3f400000 3f24a508 3f792e84 3eb4a25d 3f50a529 3f9b5e5a 3f6e55e1 -> 3f435fbb 3f792e84 3f141083", + "40000000 3f91e731 3f9971cf 3f9971cf 3f2b17c1 3f9c1648 3f705cd2 -> 3e325872 3f9971cf 3f9971cf", + "00000000 3edaefff be36b622 be36b622 bdbaa171 be388d3c bdbaa171 -> 3edaefff be36b621 be36b621", + "3f000000 3f4e9416 3ec4e844 3f4e9416 3f660f09 3f7eae0a 3f660f09 -> 3f4e9416 3f0e87d5 3f4e9416", + "3f800000 3f9a70f4 3f9a70f4 3e908d7c 3f5ea147 3f8e7614 3e85541c -> 3f9a70f4 3f9a70f4 3e908a61", + "3fc00000 3e0a2cd8 bdc17391 3e683797 00000000 3f800000 3f000000 -> 3e33a79f 3d417391 3e683797", + "bf000000 3f2d8c02 bdb527aa bdb527aa 3f910d56 3efca9b8 3efca9b8 -> 3f2d8c02 be8f81e9 be8f81e9", + "3e800000 3f5c5716 3edd70d6 3edb183b 3f39feca 3f950adc 3f66fedc -> 3f5c5716 3eeb4303 3ee91046", + "3f400000 3f7e0966 be76b78a 3f68841b 3f967b35 3f0b4a79 3f0b4a79 -> 3f7e0966 3e918500 3f71ae14", + "40000000 3f75de8a 3f4ae0e0 3f75de8a 3e800000 3f800000 3f000000 -> 3f75de8a be9fe334 3f75de8a", + "00000000 3f3838d8 3f3838d8 3f713ad3 3f800000 3f400000 00000000 -> 3f3838d8 3f3838d8 3f713ad3", + "3f000000 3d3c6598 3f2cc519 3d3c6598 3f0da2d7 3f0da2d7 3e8576e4 -> 3e3a59ff 3f2cc519 3e3a59ff", + "3f800000 3f518297 3f518297 3f8366df bd2f42e6 3f125f6b 3f8884c8 -> bd28b144 bd28b144 3f8366df", + "3fc00000 3d193b47 3e068dd9 3d193b47 be3f76b2 3f6c9a7a be3f76b2 -> bd6ff0ea 3e068dd9 bd6ff0ea", + "bf000000 be5ad8cb be5ad8cb 3f894eff 3f000000 00000000 3f400000 -> bea42296 bea42296 3f894eff", + "3e800000 3f45b822 3f4a4703 bd786de4 3f9f379d be62180e 3cc7b8ec -> 3f459cd6 3f4a4703 bda4f89d", + "3f400000 3ea0dad9 3e776e8e 3e776e8e 00000000 00000000 00000000 -> 3ea0dad9 3e9791f5 3e9791f5", + "40000000 3de04013 3f5c6bf4 3f1e1e0b 3f01cd09 3db2d236 3ec3a30a -> 3e3f8a5b 3f5c6bf4 3f248c03", + "00000000 3e94568b 3f5998b8 3f605e29 3f92b0b4 3f0dda32 3f76503e -> 3e94568a 3f5998b6 3f605e29", + "3f000000 bdb8124c 3f06833e 3eaf0804 3e515b82 3edac278 3f254eba -> 3d1ca446 3f06833e 3ec29a4a", + "3f800000 3f2d7bfa 3e230012 bc9095c5 3f96e086 3f9ee589 3d8012c3 -> 3f2d7bfa 3e4a8b73 3d0bd4c3", + "3fc00000 3d98469b 3f35cafc 3d98469b 00000000 00000000 00000000 -> 3f839608 3f35cafc 3f839608", + "bf000000 3f9c31be 3f18dcb9 3f18dcb9 3f950dbc 3f1bf80f 3f1bf80f -> 3f9c31be 3f1392a6 3f1392a6", + "3e800000 3ecfd244 3ecfd244 3d8ccb31 be0eb5d0 3e07e518 3e8cfa48 -> 3ecfd244 3ecfd244 3950af13", + "3f400000 3f60a1fe 3ee44a65 3ee44a65 3f9d6577 3f9d6577 3f7b1620 -> 3f60a1fe 3f22ea73 3f22ea73", + "40000000 3eccb1cf 3eccb1cf 3cbe1677 3f2510c6 3caec171 3f5ed4f0 -> 3eccb1cf 3eccb1cf bb6c726c", + "00000000 3f994ed6 3ed2e616 bd11e4da 3e084b2e 3f86d0e5 3e084b2e -> 3f994ed6 3ed2e616 bd11e4e7", + "3f000000 3eac399c be50c02c 3eac399c 3e800000 3f000000 3f400000 -> 3eac399c bd3bde38 3eac399c", + "3f800000 be58dbdf be58dbdf 3f312d9c 3f0e31c5 3e0075c4 3f0e31c5 -> 3e201092 3e201092 3f312d9c", + "3fc00000 3f9e8fc4 3f9e8fc4 be4b0033 3f7673df 3f7673df 3e2ab8a5 -> 3f9e8fc4 3f9e8fc4 3ed781c6", + "bf000000 3f602b1a 3dc277f3 3f9a8e99 3f9909ee 3e5bb073 3f44b985 -> 3f5b858b 3d0baaf9 3f9a8e99", + "3e800000 3da1a2e8 3f913774 3f02bb2c 3d96699d 3d96699d 3f9f0dbd -> 3d9b8f1b 3f913774 3f02483e", + "3f400000 3f932f70 3f48be95 3f932f70 3f3a95ac 3dac5436 3f3a95ac -> 3f932f70 3e975984 3f932f70", + "40000000 3e21253d be136ebb be136ebb be1ba9b3 3e00ca3e 3f92fb33 -> 3e21253d 3dd18882 3dd18882", + "00000000 3e9cc472 3f87dfb0 3f963ec1 3f299514 bd7b74fa 3f86f001 -> 3e9cc471 3f87dfb1 3f963ec1", + "3f000000 be60ea91 3f22d6c9 3f22d6c9 3f1e759f bd1a93be 3f915eaf -> bdf68f6f 3f22d6c9 3f22d6c9", + "3f800000 3f015830 3f93254a 3f778741 3f19e7f5 bc5e375a 3d35e023 -> bcd4746d 3f93254a 3f50f9fe", + "3fc00000 3f8cae46 3f0fda12 3f9ed45f 3ed1a25e 3edbddbe 3f3e416a -> 3f918f83 3f3e95cb 3f9ed45f", + "bf000000 3f1c349f 3f1c349f 3df69e50 3f6ed692 3f501a27 3f6ed692 -> 3f1c349f 3f1c349f bdae7c89", + "3e800000 3f99708d 3e29b48d bd6a63e8 3f5c2a1e be69bb63 3ec64cc8 -> 3f99708d 3de5877b bdfacaa8", + "3f400000 3f4dbad3 3ec48fd8 bcb40719 3e0f96e2 3da7d7cd bc0bd1f8 -> 3f4dbad3 3ebf4de1 bd2cc02b", + "40000000 3f3211ce 3f3211ce 3ee164a8 3f3b608e 3f8744ea 3f8744ea -> 3f3211ce 3f3211ce 3f05f7e6", + "00000000 be4cd30d 3f1936f2 3f6f3f5d 3eeddc8e bd61774b 3f5fe28c -> be4cd30a 3f1936f4 3f6f3f5d", + "3f000000 bdad8438 3f91f932 3f841013 3f962449 3f962449 3ef8058f -> 3e45c1c3 3f91f932 3f8737b0", + "3f800000 3f9553a4 3ec9b3be 3f357652 3f800000 3f800000 3f800000 -> 3f9553a4 3f9553a4 3f9553a4", + "3fc00000 3f02fbb6 3e78da76 3f02fbb6 b8ba7c7c 3f8fe6eb 3f87f4e0 -> 3f02fbb6 bdf8fa51 3f02fbb6", + "bf000000 3e9a7311 3f889ad2 bd43332c 3d8197aa 3ee08e15 3db65c72 -> 3e6e0254 3f889ad2 be180916", + "3e800000 3e976eae be6ee294 3f67da4c 3f63f07d bdcd3945 be24d9aa -> 3e9c32ca be5d157b 3f67da4c", + "3f400000 3f49c76b 3f2c80fb 3f49c76b 3dea7488 3e12724d 3eded81b -> 3f49c76b 3ea5dc8f 3f49c76b", + "40000000 be6713ca 3f0b838f 3f0b94c7 3f95d6cf 3dc8ca32 3cc7f63b -> 3e7e5c85 3f0b8e24 3f0b94c7", + "00000000 bda36356 3d89aeef bda36356 3f9347b0 3f2f6d43 3f2f6d43 -> bda36354 3d89aeef bda36354", + "3f000000 3eeabd44 3cdb634b 3cdb634b bdff086f bd04ef87 bd04ef87 -> 3eeabd44 3f649917 3f649917", + "3f800000 3e925dd5 3eb43c00 3e925dd5 3e553464 3e8cd0e8 3e553464 -> 3e88717b 3eb43c00 3e88717b", + "3fc00000 3edecd39 3f60aaad 3edecd39 3e4f3295 3e4f3295 bc9149e9 -> beaa7a46 3f60aaad beaa7a46", + "bf000000 bdb2ef54 3f0ee1f2 3f8b9e72 3f0bf70e 3f2f5462 3f72130b -> bee48d9a 3ecaa90b 3f8b9e72", + "3e800000 3f8ab37c 3f8b8a48 3f8b8a48 3f135f13 3f868676 3f114a95 -> 3f75ba83 3f8b8a48 3f8b8a48", + "3f400000 3f2e4681 3ef3b725 3f9bb5cd 3f6575f4 3f6575f4 3f1b3d17 -> 3f5e79ad 3f3c7ada 3f9bb5cd", + "40000000 be359603 3eb55bbe be359603 3ef37242 3ea0b645 3f9dc12e -> 3eb72c0f 3eb55bbe 3eb72c0f", + "00000000 3ec3602b 3f916977 3f916977 3e8fafdc be0b3904 3e8fafdc -> 3ec3602c 3f916977 3f916977", + "3f000000 3f72f069 3f89c693 3e38913a be68201e be68201e 3f93bc54 -> 3f6bd00e 3f89c693 bc7f4544", + "3f800000 bd9dd8d5 3f98a640 3f98a640 bd8cb59b 3f8e4cbd be41c46a -> be4fdc2f 3f98a640 3f98a640", + "3fc00000 3d786a5e 3ee2260c 3e9cf450 3dcf9858 3eda4a5d 3eda4a5d -> 3e023fcb 3ee2260c 3ea909ec", + "bf000000 3f6acbc5 3f991e5f 3f6f711d 3e7a8892 3ec99b83 3f6bd322 -> 3f9bc36d 3f991e5f 3f9b9766", + "3e800000 3f9643ba 3eeb5cdf 3eeb5cdf 3ec758d2 3ec84d13 3f323989 -> 3f9643ba 3f024781 3f024781", + "3f400000 bc0c05e4 3e3e7bfa 3f0d3019 bde8d1c8 3ee56168 bd6dade6 -> bddb552c 3df94134 3f0d3019", + "40000000 bdcf9f94 3d7f932d 3f71b8bc 3f37044d 3f37044d bc704ca2 -> 3d804743 3e4d89cc 3f71b8bc", + "00000000 3f8471be 3f650acc 3f650acc 3f400000 3f400000 3f400000 -> 3f8471be 3f650acc 3f650acc", + "3f000000 3da4f44f be052d51 3da4f44f 3e808a21 bca5f15a 3ec0283a -> 3da4f44f bd89a0ec 3da4f44f", + "3f800000 3f6be83d 3dbd3df0 3f6be83d 3f6bc239 bd8fd6f3 3f8ee654 -> 3f6be83d bd6d7569 3f6be83d", + "3fc00000 be4c6778 3f04eb2c 3f04eb2c 3e100e59 3f8735d8 3f8735d8 -> 3e5069b1 3f04eb2c 3f04eb2c", + "bf000000 bd382d49 3dc431ff 3ed52315 3eeebc5a 3eeebc5a 3f65de71 -> be33bedc 3ba66071 3ed52315", + "3e800000 3ea965b2 3ef6e31e 3ea965b2 3f400000 00000000 3e800000 -> 3e7e188c 3ef6e31e 3e7e188c", + "3f400000 3e716c2f 3ebd6147 3f698945 3efd3e38 be382d93 3efd3e38 -> be4269b2 3ceaa82c 3f698945", + "40000000 3d87ab5c 3e54bbeb 3d87ab5c 00000000 00000000 3f000000 -> bd87ab5a 3e54bbeb bd87ab5a", + "00000000 3f84a8ab 3f8736ba bdf9ac68 3e800000 00000000 3f400000 -> 3f84a8ab 3f8736ba bdf9ac5f", + "3f000000 3ecee5d4 3dbd3caa 3d1892a5 3f394272 3f394272 3f9f14c7 -> 3ecee5d4 3e34c657 3e0b8b46", + "3f800000 be7ba64f be70873e be70873e 3f580089 be664c7a 3e6af15f -> 3d803963 be70873e be70873e", + "3fc00000 3f93ca68 3f93ca68 3eae4550 bca60205 3da4d040 bd45ef9e -> 3f93ca68 3f93ca68 bf9ae727", + "bf000000 3e328b68 3e51c64a 3e328b68 3f81e46d 3e93c744 3e93c744 -> 3e6dfbfb 3e51c64a 3e6dfbfb", + "3e800000 3f75b367 3f75b367 3ed86f10 3dd37b37 3dd37b37 3f95f446 -> 3f75b367 3f75b367 3ead2768", + "3f400000 3f7f1e9d 3e3aaad4 3f7f1e9d 3f8572f5 3f8572f5 3f9fd450 -> 3f7f1e9d 3f2b6cdc 3f7f1e9d", + "40000000 3f34dd1a 3f123939 3ba4eedd 3f8c68fa bdbda7ab 3e23950c -> 3f34dd1a 3f0bd5f6 bdfe9aed", + "00000000 3e5bf689 3f9f7c9a 3e5bf689 be3c3d82 3dfbe483 be3c3d82 -> 3e5bf689 3f9f7c9a 3e5bf689", + "3f000000 be0684be 3eabede7 3eabede7 3f800000 3f400000 3e800000 -> bcc23722 3eabede7 3eabede7", + "3f800000 3ea1945c 3f8d616e 3f8d616e 3d162384 3f58236f be5a9984 -> be8efd94 3f8d616e 3f8d616e", + "3fc00000 3dbf8ddd 3f9d59df be0e2fe3 3f573747 3f72ebfb 3f72ebfb -> 3fcfb184 3f9d59df 3fd9fe6c", + "bf000000 3f5f96e6 3f212a6d 3f17de47 3efe5c86 be223167 3efe5c86 -> 3f5f96e6 3f8123a9 3f83b8fe", + "3e800000 3f2964c5 3e23f086 3f2964c5 3f96d297 3f6a0fe6 be60713a -> 3f2964c5 3db6e3c3 3f2964c5", + "3f400000 3eabfd33 3eabfd33 3e482253 be4d78dc 3f43d4bb 3f4deb69 -> 3eabfd33 3eabfd33 bc6527e4", + "40000000 3f3c7170 3f3c7170 3f493af5 3e53fd62 3f57699e 3e53fd62 -> beb2da7a beb2da7a 3f493af5", + "00000000 3f840bb3 3d3e2ade 3f3668b6 bda7a25a bd8fabdf bda7a25a -> 3f840bb3 3d3e2ae4 3f3668b8", + "3f000000 3e934372 3ddfb0f8 3e9dfd08 3e2a0d09 bd965371 be146763 -> 3e8914cf bda3e876 3e9dfd08", + "3f800000 3f9a6041 be1bf098 bdcd65b3 3f13a212 3f2737c4 3f898b37 -> 3f9a6041 3f25b332 3f2b2cee", + "3fc00000 3f4dd37b 3f0f1c44 3ea1f1ac 3c0a3eeb 3c0a3eeb 3e9ae10b -> 3f4dd37b 3eacda5d bdfefe21", + "bf000000 3f28345b 3f2ca8b9 3ef79be7 3dee1203 3db13d69 3f96cd75 -> 3f2d4542 3f2ca8b9 3f335d81", + "3e800000 3ecf326d 3ea6f089 3f555739 3f000000 3f000000 3e800000 -> 3ed8ffd8 3eb28a36 3f555739", + "3f400000 3f8440ed 3d6ae27c 3de2ae1e 3ed48fcd 3f86fc72 3f82c652 -> 3f8440ed 3ea388c9 3eb7829c", + "40000000 3f96f343 3ebc3c80 3f96f343 3f07c26a bdd6fd27 bdd6fd27 -> 3f96f343 bf55a406 3f96f343", + "00000000 3f8b9a3a 3f7ea8ac 3f8b9a3a 3f259398 3f66a27d 3ee154b0 -> 3f8b9a3a 3f7ea8ac 3f8b9a3a", + "3f000000 3e6d2301 3f7ed832 3f4ab337 3f2aaaab 3f2aaaab 3f2aaaab -> 3f1d1079 3f7ed832 3f64c5b5", + "3f800000 3f81b2e4 3f9fae5e 3e220962 3e58d1b3 3ebd33b6 3edbfbf8 -> 3f8e43e2 3f9fae5e 3f1d6236", + "3fc00000 3f91a667 3f91a667 3eaa74c7 bdffe551 bd8d51a0 bd8d51a0 -> 3f91a667 3f91a667 403b267e", + "bf000000 3f8daa98 3f80a3f3 3ef24034 3f8db303 3f5364a6 3f306738 -> 3f8daa98 3f7cd85a 3ebb0391", + "3e800000 3f60508d bdc50fc9 3cfbd3f4 3f99755c 3eb83204 3f826db5 -> 3f60508d bbd2ca92 3dded5fe", + "3f400000 3f39ac76 3e03a050 3f39ac76 3f92344e 3f8a4e70 ba625ba1 -> 3f39ac76 3d01f125 3f39ac76", + "40000000 bd197d2f 3f0d85b1 3f20ceda 3e8821ff 3e8821ff 3f966dbb -> 3ea4b642 3f17edcd 3f20ceda", + "00000000 3f23cfa7 3f23cfa7 3f28c803 3e800000 3f400000 00000000 -> 3f23cfa7 3f23cfa7 3f28c803", + "3f000000 3f60bcd6 3f3a31db 3f794350 3f9c8847 3e6476b9 3f9c8847 -> 3f456081 3ee7abad 3f794350", + "3f800000 3f1826f9 3f01d546 3e6fe4a7 3f3af42c 3f3e1a67 3f3e1a67 -> 3f1826f9 3f178abb 3f15a1b1", + "3fc00000 3f2d1c66 3f2d1c66 3ec49ce0 3e800000 3f800000 3f800000 -> 3f2d1c66 3f2d1c66 3d7c36e9", + "bf000000 3f68872e 3cd57c9b 3f7744a9 bcc6fbc3 3e4fedb2 3e92fe89 -> 3f695f8d 3da3bd00 3f7744a9", + "3e800000 3f3fd02b 3f15e1ba 3eb34561 3f8a1864 be51ca44 be51ca44 -> 3f3fd02b 3f08f2dd 3e687b62", + "3f400000 3de3fe56 3f2f4d15 3ef548e5 bdabb03d 3f951046 bdabb03d -> bc15bd14 3f2f4d15 3edf291d", + "40000000 bccfce68 3f456634 3f95d120 3e85eff4 3f59cd3b 3cf86568 -> 3dded026 3f50de84 3f95d120", + "00000000 3d20e752 3d20e752 3f05c88a 3f66f371 be3a9a5f 3f36b10c -> 3d20e754 3d20e754 3f05c88a", + "3f000000 3f2d628b 3f2d628b be7b1c91 3dcdea43 3dcdea43 3f711516 -> 3f2d628b 3f2d628b bdb110b0", + "3f800000 be58001e 3f96feb9 be58001e 3f9afeaa 3ed398e2 3f9afeaa -> 3ece2301 3f96feb9 3ece2301", + "3fc00000 3f8babd9 3e5793e2 3e5793e2 3f88d18d 3f91b5f4 3f91b5f4 -> 3f8babd9 3fb73f75 3fb73f75", + "bf000000 3ecb7954 3f3c8cdc 3e4056e6 3be50990 3f151be8 3f75894b -> 3ee857d5 3f3c8cdc 3e8ee16c", + "3e800000 bdf3ed2b 3e1d0247 bdf3ed2b 3e940313 3f2a8ffe 3e649d60 -> bd9ca38a 3e1d0247 bd9ca38a", + "3f400000 3e979c74 3c94ba4a 3f8f004c 3f6a6b13 3f09efb7 3f2d8f44 -> 3f277f28 3efec212 3f8f004c", + "40000000 3f39816a 3e1a79cd 3f21ea0d 3f872deb 3f5fd2c0 3f96978f -> 3f39816a 3f6d188a 3f41ca98", + "00000000 3ef0cec3 3ea66d1a 3ea66d1a bcb461bd bcb461bd 3f2fa4b1 -> 3ef0cec3 3ea66d1a 3ea66d1a", + "3f000000 3f84ea20 3f84ea20 3f92dce3 3f93e492 3efb0c9c 3f93e492 -> 3f433d60 3f433d60 3f92dce3", + "3f800000 3e03e72a 3f1a8f4a 3e4db689 3e800000 3e800000 3e800000 -> 3f1a8f4a 3f1a8f4a 3f1a8f4a", + "3fc00000 3eb18383 3de33de1 3eb18383 3fa00000 3fa00000 3fa00000 -> 3eb18383 3eeddd88 3eb18383", + "bf000000 3f05e32a 3efb5d45 be1dffca be75ef11 3de10462 be75ef11 -> 3f05e32a 3f03ac26 3eae2aac", + "3e800000 bdab8778 bdab8778 be6f7073 3f9b7c70 3f77158e 3f77158e -> bdab8778 bdab8778 be449d98", + "3f400000 3f8959c0 3f665d0f 3d003b66 3ede02a5 3ede02a5 3f6aebf0 -> 3f8959c0 3f758c99 3ec6b5bf", + "40000000 3f93e163 3f93e163 be2e1260 3f02b207 3f02b207 3db8ddb3 -> 3f93e163 3f93e163 3f141ad8", + "00000000 3cde2f75 3ee6dae5 3ee6dae5 3ecf9775 3ecf9775 3f940443 -> 3cde2f73 3ee6dae5 3ee6dae5", + "3f000000 3f01c43d 3e11ea82 3f01c43d 3f946ad1 3e2500b5 3f083cbf -> 3f01c43d 3dda0ccc 3f01c43d", + "3f800000 3e8155bb 3f644d19 3f644d19 3ee33e40 3df9ac77 bda5c17c -> be268710 3f644d19 3f644d19", + "3fc00000 3ec18ba0 3f88dc7d 3f9901ea 00000000 3e800000 3f400000 -> be418ba4 3f7b51f3 3f9901ea", + "bf000000 be5bdc57 3f0bc807 3f0bc807 3c93d676 3c93d676 3f11f8ce -> bea951ce 3f0bc807 3f0bc807", + "3e800000 3ed924b1 3ed924b1 3f197e7c 3e0bda3c 3ce2b58a 3e0bda3c -> 3eb268b0 3eb268b0 3f197e7c", + "3f400000 3f7c501b 3dd7bc9b 3f56918a 3eb4fc38 be307ff5 3eb4fc38 -> 3f7c501b beab0fad 3f43b9c9", + "40000000 3f50b240 3edf2acd 3d909455 3f284371 3f9e7ab0 3e6fa4bd -> 3f50b240 3f055cc6 3e734a0c", + "00000000 3e9b39d6 bbf7c685 3e9b39d6 3f3de57c 3de662b7 3ba49602 -> 3e9b39d6 bbf7c668 3e9b39d6", + "3f000000 3f816b9f 3f9dd970 3f816b9f 3f18c155 3f1a994a 3f80fa74 -> 3f5ee508 3f9dd970 3f5ee508", + "3f800000 3f23b9cc 3f53872d 3f53872d 3f720622 3dc36bc9 3edb1333 -> 3daacc19 3f53872d 3f53872d", + "3fc00000 3f0dc857 3f94e9bf 3f0dc857 3f67a673 3eef3ea6 3e2274ad -> 3ceddb32 3f94e9bf 3ceddb32", + "bf000000 3f7d1535 3e2c9871 3ef50daa 3e08eea4 3f83be01 3f3d4c26 -> 3f7d1535 3e412145 3efb7041", + "3e800000 3e9b6eb1 3f952a99 3f2d7b12 3f911904 3f911904 3f4cde4f -> 3edde17f 3f952a99 3f404879", + "3f400000 3d50fac3 3f802ea8 bdab07e7 3f82628b 3f1a642e 3f2a35c6 -> 3efda846 3f802ea8 3ed8fc37", + "40000000 3f03e802 3f4bcc5f 3f03e802 3f90a101 3dc16ac8 3f90a101 -> bec3ad0b 3f4bcc5f bec3ad0b", + "00000000 3ef6ca40 3f4d0096 3f4d0096 3ef1d4d3 3d5060e0 3c72bfbe -> 3ef6ca41 3f4d0096 3f4d0096", + "3f000000 3f076a75 3f8a0596 3f7d09c7 3f83895d 3f9aa390 bdfefc34 -> 3e55ef78 3f8a0596 3f6fa284", + "3f800000 3f655695 3e637a37 3f6797b0 3f21f646 3f711e85 be136048 -> 3f6425db be0d8da5 3f6797b0", + "3fc00000 be300388 3ea59d3b 3f441019 3f68ca07 3f994a42 3dac94e4 -> 3e2ac88a 3ef76b08 3f441019", + "bf000000 3f9222ea 3f9222ea 3f41355b 3f45f3ff 3f7c2971 3e93ef4e -> 3f9222ea 3f9222ea 3f76f22d", + "3e800000 3f779ca5 3e7d2574 be77bbdc 3f800000 3f800000 00000000 -> 3f779ca5 3e91034f be39cce9", + "3f400000 3bc75753 bc116ff2 3bc75753 3f7c7002 3f0e01b6 3f991ea9 -> 3bc75753 b8d9081b 3bc75753", + "40000000 3f851986 3f851986 3e9bd999 3f78a62d 3f8ebb25 3f78a62d -> 3f851986 3f851986 3fc0e877", + "00000000 3ed660fc 3f3a684d 3ed660fc 3e301ee7 3f7f90fa 3f7f90fa -> 3ed660fc 3f3a684d 3ed660fc", + "3f000000 3f9805a9 be5740f9 3f72ddc5 3e800000 3e800000 00000000 -> 3f9805a9 bdd740f9 3f777754", + "3f800000 3e4aa2d4 be0f4174 3e4aa2d4 3d844752 3f72b640 3e1875a7 -> 3e4aa2d4 3c5cdfd1 3e4aa2d4", + "3fc00000 3f507614 3c7e5574 3f5826e8 3ef4672c 3ef4672c 3f4369de -> 3f579829 3f48c4b6 3f5826e8", + "bf000000 3f9b1ded 3f9b86ea 3f9a0138 bd8c7a09 3f67192f 3f67192f -> 3fb1743d 3f9b86ea 3fecea76", + "3e800000 be4e5ec2 3e4ac13e 3ee4973e 3e1e2e00 3e548428 3ee43238 -> bde65425 3e6db9e5 3ee4973e", + "3f400000 3f416afa 3f416afa 3f98661c 3f0b1f8b 3ec8827b 3c832e06 -> 3e5c5c74 3e5c5c74 3f98661c", + "40000000 3f4b7690 3f4b7690 3dee2811 3f0b30f3 3d0f4ee8 3d0f4ee8 -> 3f4b7690 3f4b7690 bc656689", + "00000000 3f800928 3e8c196e 3e9df08c 3f9a71b0 3e9e6483 3f9fa42c -> 3f800928 3e8c196f 3e9df08d", + "3f000000 3f562654 3f64fcc0 3f94962e 3f9d2433 3f96c848 3ebfd5a0 -> 3f186c31 3f324ab0 3f94962e", + "3f800000 3f465675 be48b02e be48b02e 3f77a0a1 3f77a0a1 3f7069bd -> 3f465675 3f408f30 3f408f30", + "3fc00000 3f819768 3e88aaab 3f851ce1 3f466839 3f7b8e0f 3f7b8e0f -> 3f855f46 3f8c667d 3f851ce1", + "bf000000 3f2a7dba 3ef5beee 3f81fd87 be623ff3 3eb23478 3eca7557 -> 3f80ffb0 3f80789d 3f81fd87", + "3e800000 3ef57d18 3eb2ef22 3f613ea3 3eddb487 3eddb487 3f47fd4c -> 3f016c20 3ec4a054 3f613ea3", + "3f400000 3da2af82 3f9ac538 3f9ac538 00000000 3f000000 3f000000 -> 3ca2af71 3f9ac538 3f9ac538", + "40000000 3f2ed617 3f5dcfbb 3ef7dccc 3eb8d819 3f7d2680 be21224f -> 3db002d6 3f5dcfbb bf428641", + "00000000 3e0b939f 3f54d739 3e9f9180 3ea0e378 be41a17a be423329 -> 3e0b939f 3f54d739 3e9f9181", + "3f000000 3f483682 3f56a209 3f483682 3dd7549f 3e17df85 3e27300a -> 3f29374a 3f56a209 3f29374a", + "3f800000 3eca59d6 3e0fbb3a bc98d54d 3ece8153 3ece8153 3f14c0b7 -> 3eca59d6 3ea43cce 3e8c74cb", + "3fc00000 3f92b50b 3e8d346e 3f92b50b 3f568953 3f875834 3e8b2aa1 -> 3f92b50b 3e9bac35 3f92b50b", + "bf000000 3ea7a468 3f768144 3f3b47f3 3e3efa7f 3f95ca46 3f95ca46 -> 3ed42d69 3f768144 3f43632e", + "3e800000 3f21ae4c bde682b4 3f21ae4c 3f84d4a6 3ec9d190 3ec9d190 -> 3f21ae4c bcc83a0a 3f21ae4c", + "3f400000 3e048d4f 3eb13beb 3eb13beb 3e13c5d3 3c1756ef 3e13c5d3 -> 3d489e75 3eb13beb 3eb13beb", + "40000000 3e8614c1 3e8614c1 3ed6af7b 3eda474c 3f2834eb 3f9e0976 -> 3ce2de4a 3ce2de4a 3ed6af7b", + "00000000 3f5eda32 3f269382 bbd48f22 3d11ac2b 3d11ac2b 3f9e8fc2 -> 3f5eda32 3f269381 bbd48f24", + "3f000000 3f6b94b5 3f3540d4 3dd88faf 3e97f707 bda211e9 be768ab9 -> 3f6b94b5 3f18d4cb bea40742", + "3f800000 3c8b7200 3ca1c49b 3ca1c49b be05595d be05595d 3d826ec3 -> bd256292 3ca1c49b 3ca1c49b", + "3fc00000 3f4c841c 3f4c841c 3eaff66a 3f7a7167 be5f7622 3f7a7167 -> 3f4c841c 3f4c841c bee0d7d6", + "bf000000 3f73004b bb96664b 3f6dea60 3f400000 3f800000 3f800000 -> 3f73004b beb9c69f 3f6c015d", + "3e800000 3f911667 bb6f4d94 3f5df2fe 00000000 3e800000 00000000 -> 3f911667 bb337922 3f5e0105", + "3f400000 3f83c8f1 3f49543b 3ec520f9 3f34a344 3f4a4c14 3f956db1 -> 3f83c8f1 3f5a8393 3f101f7e", + "40000000 3efdd21e 3e562ebe 3c4f0978 3f9a92c9 3de7dd33 bdcf8bca -> 3efdd21e 3e1449f2 bdc44855", + "00000000 3f94f150 bd43ba2d bd43ba2d 3f90c339 3f0b2e5f 3ec64e13 -> 3f94f150 bd43ba1a bd43ba1a", + "3f000000 3ea231d9 be2f9a7f 3f87f605 3ea1af92 3ea1af92 3eb596ba -> 3f278177 3ec6379d 3f87f605", + "3f800000 3f4d221d be7024ec 3f391f90 3f47b950 bdc6140d 3f155d3b -> 3f4d221d bdcb7176 3f3bbc0f", + "3fc00000 3f9ee4df 3f9ee4df 3e609e81 3cd5fdc6 3ee9c905 3ef080c1 -> 3f9ee4df 3f9ee4df bbc8d2e8", + "bf000000 3e941a71 3f6b1f19 3e941a71 3f000000 3f400000 00000000 -> 3ede27ac 3f6b1f19 3ede27ac", + "3e800000 bcd874fa 3f39a856 bdf33586 3f1a05d9 3f230366 3f1a05d9 -> 3e1c3ee5 3f39a856 3da86dff", + "3f400000 3f8ae452 3e84450d 3e84450d 3bc23cfc 3f3c9a7f 3ed810c6 -> 3f8ae452 3d91ae07 3d91ae07", + "40000000 3f7ffb71 3f3e58ef bdeb5d1e 3f8a8d4a 3f2a2d8d 3f9d0abc -> 3f7ffb71 3f85d60d 3f996847", + "00000000 bd9f8e59 bd828da5 bd828da5 3f9c4c7e 3f893435 3f893435 -> bd9f8e58 bd828da5 bd828da5", + "3f000000 3f9b7be3 3f9b7be3 3f48b742 bdc93e7a 3f936c57 3f31a26c -> 3f9b7be3 3f9b7be3 3eae2f54", + "3f800000 3f0ea449 3edab8d2 3edab8d2 3f696365 3f912765 3e8ff10e -> 3f0ea449 3e0d7351 3e0d7351", + "3fc00000 3f585367 3f2af936 3f585367 be746ec6 3f4e34b7 3f4e34b7 -> 3f585367 bf35a5c1 3f585367", + "bf000000 3ef6c45b 3ef6c45b 3ef05eb3 3f6787fc 3f6787fc bc54d2aa -> 3ef6c45b 3ef6c45b 3f3529da", + "3e800000 3f7d5dad bddec2f7 be0751a9 3f172b1b 3f172b1b 3f9c0243 -> 3f7d5dad 3d27c107 3caa1ae6", + "3f400000 3f9b98c5 3f765981 3f765981 3f30141a bdcc0bfc 3f6aed56 -> 3f9b98c5 3e10fdce 3e10fdce", + "40000000 3d928c1f 3d928c1f 3f99307e 3f86174d 3f1375ec 3f86174d -> 3f9f4dd6 3f9f4dd6 3f99307e", + "00000000 3f828a3b 3ea7e669 3f828a3b 3f6352ca 3f2548a9 3f6352ca -> 3f828a3b 3ea7e669 3f828a3b", + "3f000000 3f8d8231 3f2a3a45 3ef6d356 3f2985c3 3e30ab81 3e0bec19 -> 3f8d8231 3f134183 3eb5d00b", + "3f800000 3e8785ba 3f78d52f 3f04fa0d 3eb7b05c 3f242e41 3f3c6a1f -> 3ef2977e 3f78d52f 3f273aeb", + "3fc00000 3f49bf2c 3f49bf2c 3f299338 3f4719d3 3f2a966d 3f2a966d -> 3f49bf2c 3f49bf2c 3f2e7e8c", + "bf000000 bd3ef0f5 3f9cd3ce be71416a 3f697dbc 3f870d9f 3f870d9f -> bf1c381e 3f9cd3ce bf6209f5", + "3e800000 3f4413a8 be0ed202 be02507f 3f1b05d8 3ebb6bf0 3f3f7dd5 -> 3f4413a8 bc329177 b9dc7d9b", + "3f400000 3ec06710 3edb1c1c 3db7236d 3e3621c6 3f1cf45e 3c31a2c7 -> 3ebb8f2b 3edb1c1c 3ce5a27a", + "40000000 bdb775bd 3efbf8a7 bdb775bd 3eaf9b0b 3f18b50d 3eaf9b0b -> 3f27cf45 3efbf8a7 3f27cf45", + "00000000 3f3684c4 3f9edcfd 3f75be0c 3f2075fc 3f72fb77 3f8ccfc9 -> 3f3684c4 3f9edcfd 3f75be0b", + "3f000000 3f401eb1 3f8ff517 3f8ff517 3f03e945 3f5a336c 3f5a336c -> 3f371685 3f8ff517 3f8ff517", + "3f800000 3f94557c 3f48c90b 3f48c90b 3deb85dd 3c572122 bd2cf120 -> 3f94557c bed9d705 bed9d705", + "3fc00000 be12b8e6 3dc36dd1 3dc36dd1 00000000 3f000000 3e800000 -> 3d92b8e5 3dc36dd1 3dc36dd1", + "bf000000 3e9bd50b 3f991fbf be65be83 3f468992 bde59dd3 3f468992 -> 3e93917d 3f991fbf be8008db", + "3e800000 3f921ed4 3e5973c1 3f82f5d9 3e800000 3f400000 3e800000 -> 3f921ed4 3e824058 3f83a572", + "3f400000 3dee612b 3f9d65a2 3d352efc 3f87e8e1 3f9819fd 3f8d9695 -> 3f5bf106 3f9d65a2 3f55cb0d", + "40000000 3f0f0f75 be121f84 bdfd3eb4 bd213fdc 3f2f0b70 3e9033e9 -> 3f0f0f75 3da075da 3dbb2c2a", + "00000000 3f988d48 be6bb5f2 3f988d48 3d402f48 be7026a5 bd146674 -> 3f988d48 be6bb5f1 3f988d48", + "3f000000 3e15f294 3f883f9e 3f883f9e 3f400000 3f800000 3f000000 -> 3eadbc43 3f883f9e 3f883f9e", + "3f800000 3e2f22fa 3ec0e378 3f9a4cbb bcd376bf 3e075411 bcd376bf -> be711bc5 3d51378f 3f9a4cbb", + "3fc00000 3f9e0a44 3f61e044 3ed1d5ed 3f7b6906 3f806ce4 3f806ce4 -> 3f9e0a44 3fb27238 3fcdcf37", + "bf000000 3f7adbe4 3f394a84 3f595492 bd382c2a 3f261b98 bd382c2a -> 3f7adbe4 3f8f5073 3f869332", + "3e800000 3f4db2a9 3f84cdf8 be1035a8 3f400000 3f800000 3e800000 -> 3f52c8ef 3f84cdf8 bd27051b", + "3f400000 3df135f8 3e309815 3df135f8 3f921531 3f921531 3f21901f -> 3dcec888 3e309815 3dcec888", + "40000000 3f66cb7e 3b35a025 3f66cb7e 3f304dc9 3f88c88c 3db95d8b -> 3f66cb7e 3e198bb5 3f66cb7e", + "00000000 3ed65fa2 3ee452a6 3f795328 3f47a70c 3f47a70c 3eab3f4e -> 3ed65fa1 3ee452a4 3f795328", + "3f000000 3e23f668 3d4c0bf8 be432335 be64d875 3eba1560 be64d875 -> 3e23f668 3d83b091 be13faa2", + "3f800000 3ea0394a 3eb8e2d8 3f5b27c3 be6fb948 3c2bd2b9 3c2bd2b9 -> c198e15a c18ab6f3 3f5b27c3", + "3fc00000 3f776ca9 3f3b0872 3f3b0872 3f75f2e8 bc8c8d14 3f874393 -> 3f776ca9 bec71592 bec71592", + "bf000000 3dfdf5db 3dfdf5db 3e716d5a 3f8c3a0c 3f72403b 3f8c3a0c -> 3dac6662 3dac6662 3e716d5a", + "3e800000 3f092bec 3ed023db 3f7d3b69 3f400000 3f400000 00000000 -> 3ee9db07 3e9c1ae4 3f7d3b69", + "3f400000 bd723f90 3f9b5e5a 3f7d99d2 3f800000 00000000 3f000000 -> bc723fba 3f9b5e5a 3f7f9785", + "40000000 3f80fd8c 3f87907d be384d41 3eb7d30e 3f60679c 3f60679c -> 3f8780d1 3f87907d 3f861659", + "00000000 3f09bd53 3e6c64d1 3e6c64d1 3f35c6c9 3f858f88 bde61e6c -> 3f09bd53 3e6c64cf 3e6c64cf", + "3f000000 3f3397f6 be33764f 3f679e58 3f8d1939 3f3e1bea 3f286aa0 -> 3f44d1e3 3e3abb1e 3f679e58", + "3f800000 3ec8f7e0 be5dbc28 3ec8f7e0 3f63f612 3ec3999e 3f115d82 -> 3ec8f7e0 3e2c7063 3ec8f7e0", + "3fc00000 3f4072f1 3eab46a6 3eab46a6 00000000 3f000000 3f800000 -> 3f4072f1 be2b46a8 be2b46a8", + "bf000000 bd515441 3f3ca97c 3e8ee5cb 3f7e2a5a 3f398d24 bdde426a -> bd1503c8 3f3ca97c 3e934729", + "3e800000 be7e7d97 3f858a48 be7e7d97 3f0eb4f4 be010729 be010729 -> be7b3ce6 3f858a48 be7b3ce6", + "3f400000 3c355c46 3c355c46 3c3cb2a8 3f58e884 3f9be7dd 3f58e884 -> 3c0fca12 3c0fca12 3c3cb2a8", + "40000000 3c20e54d 3f248cca 3c20e54d 3f400000 3f400000 3f800000 -> 3f744f9a 3f248cca 3f744f9a", + "00000000 3e496a61 3e62e2a4 3e496a61 3f9a1c7c 3f8001ca 3f136ff4 -> 3e496a61 3e62e2a4 3e496a61", + "3f000000 3b062786 3f48959e 3b062786 3f39edd8 3f3172ac 3ead0cb7 -> 3e3bbce9 3f48959e 3e3bbce9", + "3f800000 3f9166b2 3f9166b2 3f59ab18 3f9ff43a 3e52a662 3f44de53 -> 3f9166b2 3f9166b2 3e3f7c11", + "3fc00000 3f78d2cb 3f415afe 3f1520f7 3f0f72b1 3f0f72b1 3c76d55f -> 3f78d2cb 3e94f60a be810f1d", + "bf000000 3e7e6547 3e7e6547 3f9e883a bdc3540a bdc3540a 3f5eae7c -> 3ee18fb7 3ee18fb7 3f9e883a", + "3e800000 be6d3ced 3f84b5df 3f809118 3f4f498e bdccff2f 3f55183c -> be51d86a 3f84b5df 3f80a778", + "3f400000 3f2825ff 3f57e2d9 3edb0c57 3f800000 3f000000 00000000 -> 3f0347df 3f57e2d9 3ddb0c57", + "40000000 3f611f14 3f1c862d 3f1c862d bde02cbe 3f4d1b3a 3f4d1b3a -> 3f611f14 bf5a096d bf5a096d", + "00000000 3eb4f27a 3f25ec1d 3e1d3d0c 3f61cb94 3f2d155e 3d099659 -> 3eb4f278 3f25ec1d 3e1d3d0b", + "3f000000 3ed1b282 3d0c96ab 3ec8fe3b 3f477b7e 3f477b7e 3f1a7619 -> 3ed1b282 3e33f1c3 3ecc45eb", + "3f800000 3ef0e103 3ef0e103 3e5fc426 3f400000 3f000000 3f400000 -> 3ef0e103 3ef0e103 3ea09601", + "3fc00000 3f7fce6a 3f18ac29 3f7fce6a 3f4ec803 3f1a7b8f 3e217f25 -> 3f7fce6a bbb557d9 3f7fce6a", + "bf000000 3d085e28 3d085e28 3ebff721 bd593098 bd593098 be453762 -> bf2186f1 bf2186f1 3ebff721", + "3e800000 3f9aae3f 3f9aae3f 3f51c52b 3f400000 3f000000 3f000000 -> 3f9aae3f 3f9aae3f 3f50e34b", + "3f400000 3f4974e3 3e10815a 3e10815a 3f8acb24 3f8a5398 3f87b202 -> 3f4974e3 3f1cc056 3f1cc056", + "40000000 3b5d431d 3b5d431d 3d0abe0c 3d494ba1 3f77dab4 3f77dab4 -> 38831efb 38831efb 3d0abe0c", + "00000000 3f8f0664 bde934ef 3f2f0686 3e9aced1 3f61cb61 3f61cb61 -> 3f8f0664 bde934e9 3f2f068a", + "3f000000 3f6af937 3eae1768 3ed44b2c 3f6babcb bc4b8dd1 3f6babcb -> 3f6af937 3e27bfcd 3e85b9e1", + "3f800000 be1f9bcc bd56e298 3f6b70c3 3ee39168 3f17b1b0 be61b929 -> beaf2b6c be621d6c 3f6b70c3", + "3fc00000 3a97bc86 3f6e7f3d 3a97bc86 3e99e6ed 3f10da6e 3f3c053e -> 3f124421 3f6e7f3d 3f124421", + "bf000000 bd5a674a bd5a674a 3f961a72 3f000000 3f400000 3f800000 -> bebf0dd2 bebf0dd2 3f961a72", + "3e800000 3f32075a 3e7b5d62 bcfc774f 3f7be74a 3f7be74a 3f2f4d88 -> 3f32075a 3ea6817e 3dc8729b", + "3f400000 be420efe 3ef4729c 3de3f806 3e24995b 3f5b0965 3eba94be -> 3ca2f783 3ef4729c 3e67b24e", + "40000000 be40d6ff 3f634559 3f05a8cd 3f789094 3f5a2e0c 3f789094 -> 3fdf980e 3f634559 3f970027", + "00000000 3d831488 3e523663 3f486a6f 3f1df81c 3ed8ada3 3f027cc5 -> 3d831487 3e52364f 3f486a6f", + "3f000000 3f41847d 3f5d9a99 3f41847d 3e4285f3 3f884ffc 3db8a3ec -> 3ed44739 3f5d9a99 3ed44739", + "3f800000 3f32ffe6 3f73feef bd98c218 00000000 00000000 3f400000 -> 3f37b78a 3f73feef 00000000", + "3fc00000 be27bad6 3f1ed6b7 3f1ed6b7 3ed3c720 be1f7588 be1f7588 -> be897714 3f1ed6b7 3f1ed6b7", + "bf000000 3f90d605 3d8d5adc 3f07752f bd0d38d0 3f22affc 3e5b4247 -> 3f90d605 3e097298 3f10ebf4", + "3e800000 3f932353 3e36ad69 3f98d87a 3ea02ee8 3f4f51fa 3f228ecc -> 3f938917 3e7f1a29 3f98d87a", + "3f400000 3ece2040 3eb5c4b9 3eb5526c 3f98c71e 3f6e2555 3f09523b -> 3ece2040 3e68e715 3e659d75", + "40000000 3f229e74 3f701ebe 3f8c2100 3f829d3b 3e9d7f92 3f00412f -> 3ccb478d 3f3acd7f 3f8c2100", + "00000000 3f410b7c 3f5ad1ab 3f9134f8 3f631021 3d12a2d2 3bc530da -> 3f410b7c 3f5ad1ab 3f9134f8", + "3f000000 3f229f72 3f8d7dfb be10a50f 3f79ec95 be638d65 be638d65 -> 3f1d4ba0 3f8d7dfb be49261d", + "3f800000 3d76d7bf 3f3ea932 3d76d7bf 3f03b394 3f03ffd4 3f03b394 -> 3f3e3b0f 3f3ea932 3f3e3b0f", + "3fc00000 3f255660 3f7c552b 3f658502 bcf062d4 bc1b1d3a bcf062d4 -> 40884f51 3f7c552b 3fec0fb9", + "bf000000 3f29a80e 3f29a80e 3ea8fe10 3f5edf0d 3f94c3a6 3f8e7559 -> 3f29a80e 3f29a80e 3e7cce69", + "3e800000 be30b33a be573fed be55714e 3f1821bb 3f3a74e7 3f9ce762 -> be30b33a be36da60 be369089", + "3f400000 3f96bb45 3f96bb45 3ee987d1 3f413b78 3f413b78 be530595 -> 3f96bb45 3f96bb45 be0225b4", + "40000000 3eef892b 3f006ccd 3f7c88b4 3e810755 bd0caa73 3e810755 -> bf3c986d bf1fd4d2 3f7c88b4", + "00000000 be344c45 be11cc91 3f055af1 3ef969b7 3e4f998f 3ea75033 -> be344c44 be11cc86 3f055af1", + "3f000000 3f38334a 3f4bae25 3d1452af 3f6c98be 3e3c01f2 3f6c98be -> 3f39c359 3f4bae25 3dc6ee8d", + "3f800000 3f90cae2 3f616c60 3f974e9f 3f123645 3f123645 3e1813ce -> 3f8468a0 3e9d607c 3f974e9f", + "3fc00000 3f7de056 3f7de056 3f95e537 3f400000 00000000 3f400000 -> befde057 befde057 3f95e537", + "bf000000 3eaca6f3 be5a05ea 3f6f2a7d 39f58388 3f0b9bcc 39f58388 -> 3e902d8a bea3b905 3f6f2a7d", + "3e800000 3cb90061 3e0489ee 3f470924 3f1b8bc6 3eef8796 3eef8796 -> 3e2a981f 3e819143 3f470924", + "3f400000 3f4a76b3 3effedd0 3f4a76b3 3f047859 3f047859 3f2c339a -> 3f4a76b3 3f14cdb8 3f4a76b3", + "40000000 3f8f35ab 3e0ea153 3f0c78df 3f2f0593 3f88b4d2 be176977 -> 3f8f35ab bee5ee19 3e533af6", + "00000000 3ef1fb67 3ec47ed0 3ef1fb67 3f3fbf26 3e1d0a20 3f58e64d -> 3ef1fb67 3ec47ed0 3ef1fb67", + "3f000000 be360616 be074d8e be360616 3ebeaf2a be774033 3ebeaf2a -> bd3c9b60 be074d8e bd3c9b60", + "3f800000 3ee0287c 3e9d134b 3ee0287c 3f8a6b1d 3ce3b3de 3f81e338 -> 3ee0287c 3c385f85 3ee0287c", + "3fc00000 3f8a2cb8 3f8a2cb8 3f9a8b6e 3f20b6a8 3e41cb4c 3f20b6a8 -> 3bcbc4db 3bcbc4db 3f9a8b6e", + "bf000000 3f1d6362 3ec35770 3f8c648a 3f800000 3f800000 3f000000 -> 3f0efe55 3e989e9e 3f8c648a", + "3e800000 3ed64cfd 3e14cb4f 3ed64cfd 3e8f8f4d 3e8839db bdb080eb -> 3ed64cfd 3d9d525c 3ed64cfd", + "3f400000 be639703 be639703 3f7ed132 3f97b2f9 be2dbed6 be2dbed6 -> be265755 be265755 3f7ed132", + "40000000 be411744 be411744 3eb9dbbc 3f7334eb 3f7334eb 3f94a78b -> 3f484f51 3f484f51 3eb9dbbc", + "00000000 3f1d9286 bd33c2b8 3f1d9286 3f88b737 3e76e932 3f88b737 -> 3f1d9286 bd33c2bf 3f1d9286", + "3f000000 bdc2f58b 3f274f8a be287b87 3f6b570c 3f6b570c 3ed14e31 -> 3de79f87 3f274f8a 3d811f09", + "3f800000 3f8ed9fc 3f5ce523 3f5ce523 3f98b248 3eef7a40 3f98b248 -> 3f8ed9fc 3ee0099b 3ee0099b", + "3fc00000 3e960359 3ec3080f 3f71b3f7 3efa92ef be741b60 3efa92ef -> bf561a17 bf188dea 3f71b3f7", + "bf000000 3ea9651e bba76a61 3d547368 3f764e00 3f4bb7fd 3f764e00 -> 3ea9651e be13f44d bd82cf40", + "3e800000 bda5cd76 3e537fb5 3e2b420c be2d9400 3f72f69f 3f2873ad -> bd8f3d42 3e537fb5 3e2cccce", + "3f400000 3f4d04b6 3f6286c3 3f19e605 3e10363b bbccffdd 3f8fcd1a -> 3f2a8e80 3f6286c3 3e161d3b", + "40000000 3f1bfc4a 3d434504 be3a09f7 3f037bd2 3eb3c759 3eb3c759 -> 3f1bfc4a 3f65b10b 3f81e51e", + "00000000 3db6ad55 3d942b9a 3d9b4332 3f400000 3e800000 3e800000 -> 3db6ad55 3d942b9a 3d9b4332", + "3f000000 3f27c016 3f27c016 3f946a44 3e15c202 3f56c81c 3f7c6735 -> 3ed3c79e 3ed3c79e 3f946a44", + "3f800000 3f840727 be0defb8 be2b2517 3f4f249b 3f4f249b be25b7ad -> 3f840727 be3515f5 be533fa8", + "3fc00000 bddbf05d 3ef60e32 3e3c97e6 3f786c21 3f388a54 3f388a54 -> 3f16d52e 3ef60e32 3f090b6d", + "bf000000 3f7777eb bdef4c4c 3f7ba0f9 3f7b046c 3de02b4d 3f8eb823 -> 3f77109d be64e0b6 3f7ba0f9", + "3e800000 3ddac2b9 be2248d4 3ecac743 3f8bc353 3f8bc353 be4c4b3d -> 3df1c23d be0c3d17 3ecac743", + "3f400000 3f73b010 3f8af59b 3dcc7cd5 00000000 3e800000 3f800000 -> 3f71165b 3f8af59b 3ccc7ce2", + "40000000 3f9cd1eb 3f94b1c1 3f94b1c1 3f2e4018 3e81c224 3f2e4018 -> 3f9cd1eb be7f5393 be7f5393", + "00000000 bdc69fd8 3ee4ef17 3f34b94a 3f27ff07 3e45c8de 3f27ff07 -> bdc69fd9 3ee4ef13 3f34b94a", + "3f000000 3f9b6369 3f146e93 3e6bfedc 3f5b0c58 3f9d03ae 3f5b0c58 -> 3f9b6369 3f474ccb 3f09e3a9", + "3f800000 3f68c421 3f68c421 be2f6524 3f800000 3e800000 3f800000 -> 3f68c421 3f68c421 3e68c421", + "3fc00000 3d88c373 3f581959 be0b1ccd 3e440b24 3f7ceb9e 3f073fb8 -> 3ed89a73 3f581959 3ea067b0", + "bf000000 3d8432f8 be0879d9 3d8432f8 3e9cf485 3ee03f6f 3f39f0eb -> 3d8432f8 be5aa9af 3d8432f8", + "3e800000 3f82232f 3cb3cfcf 3cb3cfcf 3f955c42 3f4c34be 3f83f7b7 -> 3f82232f 3e42c81a 3e42c81a", + "3f400000 3eda440d 3f5a09a2 3f3c7b1c 3f6f64ba be7178b9 3f6f64ba -> bd5f427f 3f5a09a2 3f1b133e", + "40000000 3dc4d62a 3dc4d62a 3e80028b 3eaf5362 3f2c419d 3eaf5362 -> 3e2229e0 3e2229e0 3e80028b", + "3ef3b855 3efece92 3eef4046 3f6d2aca 3f644bbf 3f41ed01 bcbc056f -> 3e8f0773 3e6f1af0 3f6d2aca", + "3f66ab73 be011fba 3f7e3d9b 3f30f103 3e8e01c8 be253afe 3f765dfb -> be266a79 3f7e3d9b 3f2e6d1e", + "3fa40aec 3f97fe81 3f694f80 3f97fe81 3f267a99 3f068475 3e9ed1b5 -> 3f97fe81 3ef044c8 3f97fe81", + "3fbdb39b 3ea1a89b 3f81b969 3f9943b3 3f159214 3f159214 bddb7519 -> bef490bc 3f591467 3f9943b3", + "3f09e347 3ee625da 3f826b43 3ee625da 3f800000 3f400000 3f800000 -> 3f1e766a 3f826b43 3f1e766a", + "3fa2b21d 3e02c2f1 3f98badb 3f98badb 3e98fad9 3d93860f bd7b8e4c -> beb15510 3f98badb 3f98badb", + "3f935bda 3f112e48 3f27a601 3f27a601 3ee492df 3ee6c195 3ee6c195 -> 3f293898 3f27a601 3f27a601", + "3f838f0e 3f40c8e3 3f835372 3f9972e1 3e696838 3e696838 bbd656eb -> bd669776 3f365080 3f9972e1", + "3e04a2f4 3f331902 be06401d be06401d 3dc6a578 3dc6a578 3f0f1ae1 -> 3f331902 bdc98551 bdc98551", + "3f850fcb 3f481280 3f22a726 3f481280 3f1dcfd8 be1cefcf be69f662 -> 3f481280 bea7094b 3f481280", + "3f1b6e44 3e661c97 3f9cb650 3f9cb650 3e800000 3e800000 3f400000 -> 3eac1044 3f9cb650 3f9cb650", + "becaad05 bde1a80e 3f372496 bde1a80e 3f4fbff8 3f847825 3ead6355 -> be7c61f2 3f372496 be7c61f2", + "3e877c4f 3e092cd5 3f705487 3e092cd5 bdbdf1f8 3f98cf52 3ee02098 -> 3da239dc 3f705487 3da239dc", + "3f5ac021 be4d76cd 3f12f19e 3f12f19e 3f9d98cb 3e2aa824 3f5c52b8 -> 3d1859e3 3f12f19e 3f12f19e", + "3fad83e2 3ea4d2c5 3ea4d2c5 3e1b4aa5 3e800000 3f800000 3f400000 -> 3ea4d2c5 3ea4d2c5 3d61fc62", + "3f1b19f4 be6c46ed 3eb1264f 3f7232a1 3eb70bb9 3f926205 3db945f7 -> bd3ac6aa 3ee17c67 3f7232a1", + "3f56f1cf 3efd59bc 3efd59bc 3f4ecd80 3f47691f bc027695 3f49f2aa -> 3d948022 3d948022 3f4ecd80", + "3f8911d5 3f30f3e4 3f40c611 3f30f3e4 3d85310a 3d85310a 3e9af306 -> 3dfe95ef 3f40c611 3dfe95ef", + "3f8fbdc4 be1b0666 3f77febb 3e86808c 3f15afa3 3f15afa3 3f8cc4af -> 3f18d58a 3f77febb 3f3c037a", + "3e26dc9b 3ec7f88c 3e9c7e56 be7db0c5 3e7363ad 3f5cbbb7 3ec536e4 -> 3ec7f88c 3ea0702f be4262e9", + "befa7d3e 3f65f433 3f9902d7 3f9902d7 3f400000 3e800000 3f400000 -> 3f924668 3f9902d7 3f9902d7", + "be225c5d 3e7813d1 3f7b0c06 3e7813d1 3f9fb0b5 3f834e5d 3f9fb0b5 -> 3e1c7e10 3f7b0c06 3e1c7e10", + "be36c954 3d638b01 3d638b01 bc9d220a 3f800000 00000000 3f400000 -> 3d638b01 3d638b01 bcb92e77", + "3f5dd6fe 3f5a8150 be7bfa6e 3e61ce3c 3ee6dd3f 3ee6dd3f 3cfae3a9 -> 3f5a8150 3c8e8e4e 3ebe8fbb", + "beb6bd95 3f49e724 3f49e724 3ef8c7ea 3f5d2d49 3f7a9378 3f7a9378 -> 3f49e724 3f49e724 3ed25c1a", + "3f9c2208 3f959013 3f9b188d 3f018165 3f800000 3f800000 3e800000 -> 3f939f3c 3f9b188d 3e8441ae", + "befadcce 3de994bf 3edfe35b 3f286c1f 3f2c57d2 3f2c57d2 3f77c23c -> bd5e6220 3ebcec35 3f286c1f", + "3e74eeee 3f997a97 3f313939 3f4f3c45 bd88a3db 3f0e0ede 3f0e0ede -> 3f997a97 3efc02ae 3f27dd9b", + "3ec88150 3e43de42 3f817ced 3f817ced 3f7f88ea 3cd04cdb 3f5a9937 -> 3e017f74 3f817ced 3f817ced", + "3f4de066 bd105660 3f404735 bdffe11d bc1b3c3d 3f47c44b 3dbefce9 -> 3d461d66 3f404735 bd023d7b", + "be94b7dc 3f3d4fb5 3e89d220 3d37eecb 3f07f35c 3e99352c 3f69259b -> 3f3d4fb5 3e6bc052 bc4ede5f", + "3f277875 3f3dacbd be38a3a9 be148df2 bc4d3524 3e5d4e40 bc4d3524 -> 3f3dacbd bdb93b27 bd7033f2", + "3fb55ce1 3f9db92e 3f0bc136 be761c66 3f3b9add 3f34143d 3f40d254 -> 3f9db92e 3fbb7690 3fdd88e1", + "bee4d5fb bc5223c2 3f9f7726 3f9f7726 3f22b31b 3f5e442b 3f5e442b -> beda3027 3f9f7726 3f9f7726", + "3f8c93d9 3f66a694 3f578df2 3f66a694 3f8d5388 3eeed05d 3eeed05d -> 3f66a694 3eabaa30 3f66a694", + "3dc7078a 3eb90366 3e318361 3bf2e5e2 3f33ba50 3f557111 3e36fc74 -> 3eb90366 3e353717 3c68f66a", + "beb4d64d 3f8776fc 3f793656 3f8776fc 3f9169e5 3f26f69e 3f5053f3 -> 3f8776fc 3f8d2605 3f8776fc", + "3fbdb8d2 be66fefd 3f310f99 3f476de1 3f982783 3f982783 3d0cb597 -> 3e118e91 3f393fa7 3f476de1", + "3f094b3c be5c2b28 3f12b7e4 be5c2b28 3f400000 00000000 3f800000 -> bdcc2eb2 3f12b7e4 bdcc2eb2", + "3f6b481b 3f97f2ee 3f94395a bc5f7778 3f9e7340 3f10409f 3f87e2a1 -> 3f97f2ee 3f95cdb6 3efdb616", + "be1578e1 3f4c95ec 3e735b7f 3f21f4b3 bd622fe3 3f5d3608 3f676013 -> 3f4c95ec 3e8f16d6 3f252171", + "3f758936 3f45e870 bdb53ea0 3f45e870 3f0aff63 bd178084 3f0aff63 -> 3f45e870 bd5db621 3f45e870", + "3fb97d3c 3cb7e05d 3f13290c 3e9408ac 3f7d4bb1 3eba0dbb 3eba0dbb -> 3e977b21 3f13290c 3edc70a2", + "3fba0938 3e499e58 3e499e58 3f52f97e 3f000000 3f000000 3f000000 -> 3f8de396 3f8de396 3f52f97e", + "3fb801a0 3db46bad bdcc5963 bdcc5963 3de24ae5 3ea44665 be28ded5 -> 3db46bad bcaf9631 bcaf9631", + "3f7947c7 3f45bcf1 3f45bcf1 3f9b8573 3f994164 3f994164 be7de2d3 -> be661d9c be661d9c 3f9b8573", + "bedee9d7 3f9cf7c9 3d2fa00f 3e4526fb 3f3aeb34 3e4a4c7c 3f3aeb34 -> 3f9cf7c9 bda9cf60 3da942b1", + "3dc758a6 3dca320f 3f3dcd11 3eb9d4b3 be019d19 3f43d508 3f43d508 -> 3d9e0f24 3f3dcd11 3eb35549", + "3edb7453 3cf036aa 3ee8c3dd 3ee8c3dd 3d8696f9 3f4c9469 3f44f389 -> 3d06432e 3ee8c3dd 3ee8c3dd", + "3f57394d 3f081a86 3e3ea178 3f081a86 3e32271f 3f4e5853 3e1a7025 -> 3f081a86 3de80270 3f081a86", + "3ee4bf76 3f68c659 3f68c659 3f1e8d48 3dd24edb 3dd24edb 3f1249e4 -> 3f68c659 3f68c659 3ed4cec2", + "3fb5dd7b 3e8c47c5 bdaf4fef 3e8c47c5 3f19d883 3f19d883 be46842d -> 3e8c47c5 bdb76925 3e8c47c5", + "be970360 bb9f7018 bb9f7018 3f0d929a 3e9ae7f9 3f8c8ed3 3f828108 -> bd51e25a bd51e25a 3f0d929a", + "3f649e16 3f694c61 3f241e17 3e1c783d 3f6ba02f 3cc996cb 3f6ba02f -> 3f694c61 3f19a809 3d1c11e2", + "3e39d808 be55e36e bc977541 be55e36e bd957a1e 3f449136 3f449136 -> be2ebe5c bc977541 be2ebe5c", + "bc3e54a3 3e8d12f3 3f82679a 3f82679a 3e870ef1 3e4afaec bd63e0ac -> 3e8ffdab 3f82679a 3f82679a", + "3f95618b 3f423195 3f740184 3f423195 3e90b814 3f2b90e2 3f9ef1d7 -> 3e0186ab 3f740184 3e0186ab", + "3e4aee7a 3de80de7 bd92340c 3ed53483 3f87be6f 3f87be6f 3f79726b -> 3e2d4655 3c983afe 3ed53483", + "3e7a8174 3f57f61b 3f55f610 3f55f610 bd884da2 bcafdb7f 3f6e558c -> 3f57f61b 3f1dd794 3f1dd794", + "3f90fb34 3f2ca0d5 3f82bf7f 3f74073c 3f800000 3e800000 3f000000 -> 3e4c947d 3f82bf7f 3f5c264b", + "3f72ddc6 3f88a603 3f578f3f 3f88a603 3f6f2782 3f51bc67 3c79a290 -> 3f88a603 3d749a5e 3f88a603", + "3f83532b 3f37d8a4 3e91c24d 3efcfc7e be73f89e 3dc65f0e 3bfacce1 -> 3f37d8a4 bfe8ed51 bf17f376", + "3fb0c83e 3f12812a 3f88b4cf bd979a29 3f59c830 3f59c830 3f0f4aa0 -> 3f84db54 3f88b4cf 3f7fad07", + "3f5dc89c 3e8d99ac 3f078246 3e8d99ac 3f50a750 3f3d9f02 3f50a750 -> 3ee84da2 3f078246 3ee84da2", + "bedb201f be2772e5 3f813e04 3f813e04 3f7e15b0 3dcd842f 3dcd842f -> be8ded3e 3f813e04 3f813e04", + "bec8240a be6ecbd4 3eee0fbb 3eee0fbb 3f8d8839 3c0e28e2 3cffbc18 -> bea6cd0f 3eee0fbb 3eee0fbb", + "3f90c522 3e4554b2 3f59c1f8 3e4554b2 00000000 3f800000 3e800000 -> bcced3de 3f59c1f8 bcced3de", + "3f97748a 3f4284a8 3f8a2cc6 3cd576d7 bdb6f18b be085233 be085233 -> 3fa9ff43 3f8a2cc6 3ff30bcf", + "3e41c71f 3e6f3f37 3f21a6fc 3e4449d5 bd527b25 3e6263bb 3f5172d0 -> 3e46b183 3f21a6fc 3e17754d", + "3f9c2681 3f85c1d6 3f85c1d6 bc9e6557 3efa8ebd 3eb00887 3eb00887 -> 3f85c1d6 3f85c1d6 3f665e8c", + "3f38a7a3 3f98f46c 3f8eef9e be29ea41 3f0738db 3efd217a 3f0738db -> 3f98f46c 3f95c1a3 3f42b0c4", + "3ef253e8 3eae8e52 3f409f22 3f409f22 3ea0c8bb 3f18034e be20ea9a -> 3daebe4d 3f409f22 3f409f22", + "3f97fcb4 3f84e290 3ed476ec 3f84e290 bdb0d5b7 3f164afe bdb0d5b7 -> 3f84e290 be84a46b 3f84e290", + "3f62e196 3e931ce5 3f342cea 3f342cea 3f1c0879 3f95bf32 3f524437 -> 3eb71e36 3f342cea 3f342cea", + "3ef1fc20 be530efe 3f142240 3f142240 3e9bc738 3f82bb59 3e9bc738 -> bcdf0d17 3f142240 3f142240", + "3e993ed8 3eff3480 3f85c469 3eff3480 3f2f8978 3f8c74a1 3f8c74a1 -> 3f0b72a3 3f85c469 3f0b72a3", + "3f80d46c 3f175d78 be1315f1 bd2d5c0d 3f400000 3f000000 3f800000 -> 3f175d78 3e98d2b8 3ead7d41", + "bd78d6a6 3ef8b14f 3d39af9a 3f863012 be4502f4 be4502f4 3f8c1ae1 -> 3efcb2e2 3d72d1f6 3f863012", + "3fb906f5 3f5e3e44 3f2829f3 3f0fc7cb be0e180f be0e180f 3e6bb8c4 -> 3f5e3e44 bed91ec1 bf80db51", + "3f68034c bda981b5 3f42cc60 3f42cc60 00000000 3f800000 3f800000 -> bbfe1fcc 3f42cc60 3f42cc60", + "3fa41d76 3e64f6e1 3f831250 bda75240 3e58b4f8 3f4db710 3f2e21ad -> 3f0cba97 3f831250 3ebcd5ca", + "3f3e72ca 3d846e27 3f83563c 3f8ed39c 3f1256c7 bc7558d0 3f1256c7 -> bbaa01f1 3f8292c9 3f8ed39c", + "3f7d14fa 3f4c94ab be24b193 be24b193 bcfc64e9 3e5000ce 3e5000ce -> 3f4c94ab bdf92a96 bdf92a96", + "3ef52665 3f312ae6 3f312ae6 3f2be6f1 be4bd88e 3f893bdb 3f66959e -> 3f312ae6 3f312ae6 3e93afc6", + "3c76f7f2 3e8a9b25 bddc4b48 3f2dd5b9 00000000 3f400000 3f800000 -> 3e8b0975 bdd8f934 3f2dd5b9", + "3f711ef7 3de0d0e6 3d2a73e1 3e1484ef 3cffcd4c bd683598 bd683598 -> 3c420012 be7b7e76 3e1484ef", + "3e7ed954 3f915ce9 3f5719a0 3f915ce9 3e800000 3e800000 3f000000 -> 3f915ce9 3f45be84 3f915ce9", + "3eb532f3 3f2e9469 3f3a03c6 3f3a03c6 3ec2f832 3e4dbaf5 3e4dbaf5 -> 3f138711 3f3a03c6 3f3a03c6", + "3f6048ad 3f453acc 3f58f193 3f58f193 bdf0628f 3f7ef061 3ef2b4bc -> 3c021d89 3f58f193 3f58f193", + "3f7382b7 3d8a95ff be27f071 3ef12464 3f000000 3f800000 3f400000 -> 3e9e3916 3e5d2f37 3ef12464", + "bde70939 3f4f6769 3f1d9d9c bd0ef7b1 3f516856 3f048ab2 3b00fcd3 -> 3f4f6769 3f1d5ee8 bd1fff24", + "3eb877c8 3f9a17a1 bb048703 3f9a17a1 bc25c425 3f72e89a 3f72e89a -> 3f9a17a1 bbc1f105 3f9a17a1", + "3ca7cd17 be3d3027 3eb0c608 3eb0c608 3e81e55c 3f4c9ef7 3ebf1225 -> be3703a6 3eb0c608 3eb0c608", + "be44238d 3f8630cb 3f61fad5 3f87c8cf 3ed882e4 3f680412 3f825180 -> 3f86f2d2 3f77a8c1 3f87c8cf", + "3ef3ae65 3eeb3c7e 3ea1b984 be5e8f7d 3f040d81 3e40da55 3e40da55 -> 3eeb3c7e 3eb5a1d8 bd0b86fd", + "3fae46ba 3f89bf2f 3f89bf2f 3eae6996 3e612f2d bbf75c0a bbf75c0a -> 3f89bf2f 3f89bf2f be319daa", + "3e4de126 bd880430 3f876c81 bd880430 3f800000 3e800000 00000000 -> bd5956d5 3f876c81 bd5956d5", + "beb470f9 3ee99e98 be4ae929 3efed9cc 3c388662 3e6bb3db 3edfd44e -> 3ee759e3 be8b864e 3efed9cc", + "3e8a308b 3e84e8c4 be52b231 be3199ad 3f1a5207 3f8f5600 3e8c7b02 -> 3e84e8c4 be083ffb bdd8a649", + "3f8f00d8 be498eca 3f9ce63b 3f04e6c2 3ed531dc 3ed531dc 3e5c9ea0 -> 3f3b4d15 3f9ce63b 3f7af730", + "3f4f0a99 3f2c321e 3f88a761 3f88a761 3d69d66e 3d69d66e 3f8e3226 -> 3e31299f 3f88a761 3f88a761", + "3e757087 3e6425a5 3db3b7d3 3e6425a5 3f800000 00000000 3f800000 -> 3e6425a5 3d88a458 3e6425a5", + "3f2ce865 3eb29de1 be62dc5b 3efc941b 3f000000 3e800000 3f000000 -> 3ed355d6 3dc1ece1 3efc941b", + "bea22b91 3e7fa55a 3f262388 3e474e28 3f000000 3f000000 3f400000 -> 3e3bcb9f 3f262388 3df43657", + "3f8792c9 3f65382c be1e59c9 3f53f3ff 3ee7d549 3ef63142 3ee7d549 -> 3f65382c 3f66f6af 3f6554da", + "3bc237d7 3e3c8797 3e3c8797 bc6ca280 bdcfc34a be5abd7a bdcfc34a -> 3e3c8797 3e3c8797 bc4595d3", + "3e96fa8f 3f6120e1 3f6120e1 3e525db1 be12bb12 3f1a1fad 3efb5bda -> 3f6120e1 3f6120e1 3daa4363", + "3f50e5da be399448 bccb5220 be7b4393 3f16496d be171ce9 3f87a3d8 -> bd1883cb bccb5220 bd2d5ee5", + "bea293d8 3f034af2 3f55cf1a 3f034af2 3e818057 3f552d81 3f552d81 -> 3f185c7c 3f55cf1a 3f185c7c", + "3e3ae204 3ea847e2 3f31eda5 3f958106 3a6100a7 3e7264c8 3a6100a7 -> 3e89f6fd 3f2962fa 3f958106", + "3f1e40de 3dd50ec4 3dd50ec4 3ef96891 3f6530f1 3f712376 3f2ee7b6 -> 3e842b05 3e842b05 3ef96891", + "3ec8e9f9 3f5fc809 3f3c8d04 be66db1c 3eee47dd bdefbd54 3f9880d5 -> 3f5fc809 3f3e4e33 be2ec700", + "3f7e7842 3f36c003 bd9c8e52 3ecc7d54 bcba7d49 3f550907 bcba7d49 -> 3f36c003 bca2c3b9 3ed80404", + "3f336f58 3f1517c0 3e48c721 3f1517c0 3dd26e11 3d04bd47 3d04bd47 -> 3f1517c0 3e3fe37e 3f1517c0", + "be3385f7 be277ee8 3f9336fb 3e90b5d3 3f000000 3f400000 3e800000 -> be84d79a 3f9336fb 3e609527", + "3f134719 3f4bb559 3f51e550 3df8aefa bc8721d8 3f1ee4ab 3f9e2bbf -> 3f4b08a7 3f51e550 3d397050", + "3f87b878 3f2c5b73 3f2b389f 3f497021 3e80b74f 3f97f4a9 3e80b74f -> 3e24a835 3e0b9cc6 3f497021", + "3f47011b 3f463c62 3f463c62 3f3fe22d 3f8c7913 3f8afb39 bd0a2a2e -> 3f463c62 3f463c62 3e17eff0", + "bcd25707 3bf6e2ad bd8acb39 3bf6e2ad 3e311a89 3eacbba5 3f36a066 -> 3bf6e2ad bd8e741f 3bf6e2ad", + "be136d00 3e7e78b3 3f57868b 3f9f65e6 3dc9876c bcbe7698 3f11706e -> 3e954f81 3f5bfe0a 3f9f65e6", + "be0fb491 3f3efe73 3e28f353 3f3efe73 3f9f0e00 3f9f0e00 be122ea3 -> 3f3efe73 3e4cfa4b 3f3efe73", + "3f821892 3f199daf 3e12ea2a 3f8004b7 bd76e041 bd76e041 3f55a970 -> 3efecfaa bd9b2717 3f8004b7", + "be6e060a 3f039ffd 3e3c350b 3f039ffd 3dd99946 3dd99946 be6c100e -> 3f039ffd 3ef8be88 3f039ffd", + "3f66057b be7f01c1 3f2f2aab 3e56463b 3e14d2fb 3e14d2fb 3ecf4471 -> 3e48251b 3f2f2aab 3edef666", + "3f7cbb08 be60eeda be60eeda 3f9ef3f6 bdcb2a33 3d64e244 3e274c90 -> bf3f484e bf3f484e 3f9ef3f6", + "3e95488e 3dd1679d 3dd1679d 3eb2ed34 be0c36f5 3f8ce01a 3f8ce01a -> 3d74c5d3 3d74c5d3 3eb2ed34", + "3f8caadd 3d21d024 3d21d024 3f7f3f06 3f294796 3f294796 3f056ccb -> 3f5c17a0 3f5c17a0 3f7f3f06", + "be30eeee 3eb16ec9 bdabe4dd 3f2af97d 3f6036a3 3f6036a3 3c731a3c -> 3eadd4e4 bdcd9953 3f2af97d", + "3f8946ea 3f10d445 3ec63bd7 bd9e277b 3e40da90 3ded860f 3e40da90 -> 3f10d445 3f0391cc 3ec22b44", + "3fa2bee0 be1f45cc 3f982870 3f2a94d1 be5065dc 3f0c3611 3e85e026 -> bf04f6a6 3f982870 3f06624d", + "3fac1ddf 3d9dd772 3f8f345e 3f8f345e 3f1a58dc 3f56563f be2aa052 -> bea6e46e 3f8f345e 3f8f345e", + "be2fa6f3 3c92c59a 3ec6df7f 3ec6df7f 3f9fc681 3f259f5e 3f9fc681 -> bc5de5d4 3ec6df7f 3ec6df7f", + "3f7d43fd 3ee74416 3f10ad12 3f637114 3f74664d 3f74664d 3f5a985b -> 3f4a7d6d 3f50f8a9 3f637114", + "3f9a6141 be7f4aa7 be7f4aa7 3ecf6f9b be553f9b be553f9b 3f429508 -> bda8f5bd bda8f5bd 3ecf6f9b", + "3f61c5a5 3f0f2e6d 3f700348 bdff9bde 3e800000 3e800000 3e800000 -> 3f649444 3f700348 3f4fe65f", + "3eb1814c 3f0a5ab2 3ee6c5cf 3ee6c5cf 3ed66964 3f7ca2a2 3e24dcc2 -> 3f0a5ab2 3ea66ab4 3ea66ab4", + "3f66a882 bb41de73 bb41de73 3f32e1d0 3d76496e 3ea444d8 3f2b4f53 -> 3d66840c 3d66840c 3f32e1d0", + "3efd1827 3e84186b 3f6aafee 3e23c497 3f486911 be6d22a1 be6d22a1 -> 3d947c7c 3f6aafee bd59d458", + "3de5d1fa bd70342b bd70342b bdaea8b4 3f401990 3db48309 3db48309 -> bd70342b bd70342b bd9ca472", + "be1969e1 3f0d94f8 3f745515 3efa72d2 3f11b274 3f433c3c 3d90cdc4 -> 3f1ad6af 3f745515 3f0c9766", + "3fb141bf 3ea407d0 3da387da 3da387da 3da78ff6 3eb51478 3eb51478 -> 3ea407d0 3d934419 3d934419", + "be6be8ba be1ca666 be1ca666 3f3c6ac8 3f110c55 3ee45ee3 3ef1e6a4 -> bea4b65e bea4b65e 3f3c6ac8", + "3f19bcfa 3f6b79af 3f82b737 3ebb28e9 bdef8ec3 3f8c3c8b 3ef24d24 -> 3f603165 3f82b737 3da4f469", + "3f73232d bdca1459 3f8d6e99 3f8d6e99 3dfa2c16 3f67db0a 3dfa2c16 -> 3e0bdc62 3f8d6e99 3f8d6e99", + "3e82ed22 bdb31deb 3f8a063d 3f8a063d 3df42330 3f885e0a 3e742f34 -> bd0c4066 3f8a063d 3f8a063d", + "beca66ff 3f9ff0a3 3ebd71c4 3ebd71c4 3e3696e6 bcf7dd05 3efc277e -> 3f9ff0a3 3f0befb7 3f0befb7", + "3f9ff2b1 be1d2d0e be1d2d0e 3f4ed527 be7157c2 3f5c0123 be3ffc62 -> be744b66 be744b66 3f4ed527", + "3f66d826 be155398 3f819167 3f35c032 3f96b78c 3f96b78c bdfdf966 -> bde23a6b 3f819167 3f381d27", + "bef56df3 3dd3ac0e 3dd3ac0e bd2092db 3f30633f 3f30633f bcd0ca80 -> 3dd3ac0e 3dd3ac0e bd6609f1", + "3f4c2a16 bd7e0223 bdd7e109 3eff0ada 3e61ee77 3f269e96 3f220f79 -> 3e106117 3de81815 3eff0ada", + "bebe48b4 3b61e300 3f6b6004 3d91bdc0 3e03dded be2fca90 be2fca90 -> 3eeba684 3f6b6004 3efd07d6", + "3fbe867f 3f895dcf 3f154079 3f154079 3e800000 00000000 3f000000 -> 3f895dcf be91d01b be91d01b", + "3eef5a0e 3e845988 3f599439 3e845988 3e800000 3f400000 3f000000 -> 3e8a49c4 3f599439 3e8a49c4", + "3e00d357 3f9fd91c 3f9fd91c 3f5617d2 3f000000 3f800000 3f800000 -> 3f9fd91c 3f9fd91c 3f4f44ca", + "3e604683 3d33e749 3f5939e0 3f5939e0 3f7511a2 be53fed9 3f7511a2 -> bbc0facf 3f5939e0 3f5939e0", + "3f876a10 be26f88e be33f696 3eb19533 3f400000 3e800000 00000000 -> 3c965a4b 3c26c9a7 3eb19533", + "be785581 3deeb59f bc523028 bc523028 3f800000 3f000000 3f400000 -> 3deeb59f bcf65c8b bcf65c8b", + "3fb9861b 3f5a1e27 3f9bb87d 3eb929f1 3e816156 3f223fb8 3e810cff -> 3f6d72a3 3f9bb87d 3f09e9fe", + "be4ebe2a be33d498 be33d498 3f347a43 3f8af3fb 3f408471 3f408471 -> be9e8d94 be9e8d94 3f347a43", + "3f4ce072 3ea82e68 be7d927c 3f8184f4 be577db4 bcd6ed00 3f966751 -> 3eb6f22f be47263e 3f8184f4", + "bea6672d 3eec9681 bca8d038 bca8d038 3f4d53ab 3f8ab3d0 bcb9b468 -> 3eec9681 bcc5f104 bcc5f104", + "3fa3db18 be2e01d3 3f5e185d bdd5f0aa 3e800000 3e800000 3f800000 -> 3ea686c4 3f5e185d 3eb80c0f", + "3e360d78 3f89b887 be5fc17d bd0b715c 3f633f42 3c1c4d09 3f993e96 -> 3f89b887 be366a15 3a16d9c7", + "3f6fdb26 3dc89518 3f004587 3f3a3919 3f842f87 be7c9888 3f842f87 -> be20621c 3ed1ac1f 3f3a3919", + "3f4b8b43 3f73eb2f 3f08fe7c 3e4546de 3f8f5bbe 3efa432d 3f170e19 -> 3f73eb2f 3f21f447 3ebd7de3", + "3f95524b 3d7d1452 3e644c6f 3ef7517e 3f973ad5 3ea367b6 3ea367b6 -> 3e11551b 3e8b7bb1 3ef7517e", + "3f53213f 3e987d87 3f3f2fc2 3e987d87 3f244fce 3f0d55da 3f0d55da -> 3f14fde4 3f3f2fc2 3f14fde4", + "bea3c9b5 3f5c1461 3ebc7c18 3f3b4536 3ec96aa6 3ceeeac6 3ceeeac6 -> 3f5c1461 3eee5781 3f41c518", + "be8a84c8 3f43f0a8 3ec3f079 3f95f7de bd5c8b33 3f9f558c 3ed94fa9 -> 3f536537 3efff831 3f95f7de", + "be80d9e2 3dd1deab bd378e20 bd378e20 3f59aa70 3eb7b4a1 3eb7b4a1 -> 3dd1deab bd89299a bd89299a", + "bd6a2cca 3d90e43a 3f7eb8bf 3ee2c120 00000000 3e800000 3e800000 -> 3d992cdd 3f7eb8bf 3ee3fdd6", + "beda4934 bde0d8b6 3f9e1dcb 3f9e1dcb 3f9c1218 3f3340aa 3f9c1218 -> beeb0678 3f9e1dcb 3f9e1dcb", + "3fb9fa84 3ee7ab45 3ee7ab45 3e8f39e5 3f99861e 3e67755d 3f0b9377 -> 3ee7ab45 3ee7ab45 bb386378", + "3f48193e 3d155599 bd0485db 3d155599 3f800000 3e800000 3f400000 -> 3d155599 3878bd1b 3d155599", + "3f60f458 3f07def4 3f07def4 3ed522b7 3e97b19a 3e97b19a 3f618e78 -> 3f07def4 3f07def4 3e544952", + "3f1385b7 3f0d6122 3f4bedf3 3f59472d 3f6f62d2 3f66ad68 3eb118a5 -> 3ed471e5 3f45bf0d 3f59472d", + "3ece4bc3 3f00508e 3f7b03a6 3f57c7f1 3e0dc276 bdfb1560 3e0dc276 -> bd4f4592 3f7b03a6 3f2f372d", + "3dfd660c 3f68608b 3f65c194 3f68608b 00000000 3e800000 3f000000 -> 3f68608b 3f495417 3f68608b", + "3e825c43 3f2ea631 3f6c467c 3e463d3e 3f4e9e3e 3efae4b9 3ecb8e2c -> 3f3443d4 3f6c467c 3e85262d", + "3f75c489 bcf7d81e 3e9d4df7 bcf7d81e 3f241c01 3f48e02c 3f5de10a -> 3e5e2818 3e9d4df7 3e5e2818", + "3f394c47 3f771547 be44805c be44805c 3f314189 3efce37d 3f29ac98 -> 3f771547 3ee404dc 3ee404dc", + "3f8cc2af 3eb77e5e 3d9754a8 bd0ec158 3ea29ccc 3f2b1d1a 3f4d3a50 -> 3eb77e5e 3e5bbb05 3e23718a", + "3ef3b07a 3f2929de 3f49f8fc 3f74c0e7 3ed8f526 3f0486b4 3e546d18 -> 3f075493 3f36d308 3f74c0e7", + "be87f937 3f5f388a 3f80cef8 3f5f388a 3e800000 3f400000 3f800000 -> 3f84b2fb 3f80cef8 3f84b2fb", + "3eeb28ef 3f6b3859 3f95e31b 3f8738b1 3eb33bd7 3f8333fd 3eb33bd7 -> 3f2e34e0 3f95e31b 3f72b864", + "3f88b652 3f6ae080 3f6ae080 3e8f725d be320054 3f0d280f 3f0d280f -> 3f6ae080 3f6ae080 bea7ef8b", + "3f9393c9 3f25cb97 3f8e513e 3f25cb97 3eb72e21 3eb72e21 3dcb3773 -> 3e8350f1 3f8e513e 3e8350f1", + "be9f9652 3f346557 3ee79be1 3f03cd62 3f4731ce 3f696a4b 3f7bb1b3 -> 3f346557 3ed6ccd7 3efaf57f", + "beaf8bc6 3f9c6d46 3e8f783e 3e8f783e 3eacabe5 3f4cef9e 3ece19e1 -> 3f9c6d46 3e4c9048 3e4c9048", + "3fba2107 3f40d36a bcefff0d 3f98f03d bd453f62 3e39ea07 3ed938c0 -> 3f328c1c be3c51cf 3f98f03d", + "3f8ee656 3ed88768 3ed88768 3e68e420 3f448404 3e9f2cf3 3ea62162 -> 3ed88768 3ed88768 3e28b138", + "3fb9652f be2adbad 3f78bbfd 3e11bbea be2f8a75 3ee44f31 be5c9190 -> bf1adf74 3f78bbfd be3510a3", + "befe3444 3f84fb08 3e121289 3e121289 3f358fef 3e24d61d 3f358fef -> 3f84fb08 3dc56d11 3dc56d11", + "bd91efd6 be21cc72 3e602cf7 3de01836 3f882950 3e9e67ff 3f8c93b9 -> be31d402 3e602cf7 3dd6c7fd", + "3eaa2af3 3e6df473 3e6df473 3f9bc6eb 3eaeb57f 3eaeb57f bc999948 -> 3e081c0b 3e081c0b 3f9bc6eb", + "3fb6eb52 3e86e95b 3e1f76ab 3e86e95b 3f9fe303 3ea82155 3ea82155 -> 3e86e95b 3d03cc1f 3e86e95b", + "3f98b84e bdd752d0 3eb4d8d1 3f3c530b 3f532bf5 be1cbb8e be1cbb8e -> be11fa23 3eac220a 3f3c530b", + "3e8a888c 3d614c50 3f2a9f06 3f48de7f 3e800000 3f000000 00000000 -> 3d2456a8 3f2a0112 3f48de7f", + "3f4614c0 3ddc6991 3f70fe4c 3f919ae5 3dcccccd 3dcccccd 3dcccccd -> 3f678ef6 3f8beca5 3f919ae5", + "3fb1c4ad 3e305c8a 3f2d4b70 3f7d200d 3f5ce7f5 3e96cde5 3f327151 -> 3ecdb32e 3f43bc27 3f7d200d", + "3fa75842 3f15e48f 3edce64e 3f15e48f 3f22a7f1 3f22a7f1 3f8b8211 -> 3f15e48f 3ea09525 3f15e48f", + "3f384db1 3f780645 be43e277 3f2854e1 3f0403de 3ebbebfc 3f0403de -> 3f780645 3ee2c002 3f53e4dc", + "3ef3c473 3ee02b98 3f4ee901 3f4ee901 be1ddc9d 3f939cca be1ddc9d -> 3e3634c5 3f4ee901 3f4ee901", + "3e3eb9ef be3604c3 be3604c3 3f7d6152 3f800000 3f000000 3f800000 -> bd56eaa2 bd56eaa2 3f7d6152", + "3f908e1f 3f23a57d 3f00518e 3f00518e bd43be2c 3f8647ca 3f8647ca -> 3f23a57d bdc81f2a bdc81f2a", + "3f06a2bd 3f2302c1 3f902f1d 3dabe838 3ee38716 be2ef6fe 3ee38716 -> 3f02500e 3f902f1d be407f39", + "be83cd38 3f99cd55 3f733681 3ee22d1b 3f4f62eb 3eeaa014 3e2e07ff -> 3f99cd55 3f7759c3 3efb2cd1", + "3f62543b 3f8056b1 3f8056b1 bdc1a898 bd9d0556 3f41e430 3f41e430 -> 3f8056b1 3f8056b1 bdce386d", + "3f35c9a0 be009f13 be009f13 3f8ab287 3f2e67fe 3f5a6f3b 3f2e67fe -> 3f13f468 3f13f468 3f8ab287", + "3f376ef6 3dea9121 3e40fd8b 3e40fd8b be31f191 3ebde427 3f96a2a3 -> 3c4d3874 3e40fd8b 3e40fd8b", + "be6a5052 bdb18eb1 3eda6e5b 3e91f37c 3c5ba0ae 3f719e9c 3f719e9c -> bddd06a9 3eda6e5b 3e8ef445", + "3fbbc512 3f460b30 3f1c5556 3f460b30 be49695b 3f699bab be49695b -> 3f460b30 bf079ec3 3f460b30", + "bef62b9c 3ec0ac11 3f9a4909 3ec0ac11 3f3b3440 3f72332a 3f3b3440 -> 3ddfd9ea 3f9a4909 3ddfd9ea", + "3f59e683 3f1544a7 3f9f7cb7 3f6fcfa4 3f956c4e 3db3ccee 3f82458c -> 3e2a88ed 3f9f7cb7 3f3e11b3", + "3f5ac4e0 bda46a81 3e9eb946 bd9aa53b 3f934a64 3f9978ba 3f47966c -> 3e24712b 3e9eb946 3e264ff7", + "beb48c01 3f338806 bdc19cdf 3f96a6ad 3e23d9cd 3f810d4d 3f80e0c2 -> 3f2a07cc be466477 3f96a6ad", + "beac35aa 3e8b7a52 3de7c6ee 3de7c6ee 3f91f392 3f91f392 3f8ec15f -> 3e8b7a52 3d7c625b 3d7c625b", + "3eab3415 3e2b862e 3c955e59 3e8a0eb7 3f3e7a31 3f06d820 3d836c7e -> 3e2c390d 3ca3203b 3e8a0eb7", + "3eced026 be1d8099 3eb81a48 3eb81a48 bd309f37 3e125474 3df4b482 -> be0ac307 3eb81a48 3eb81a48", + "bd424c33 3f1c9bc7 3f519e65 3f564dc9 3f800000 00000000 00000000 -> 3f240991 3f5238d4 3f564dc9", + "3e9ae443 3f527554 3f436eb7 3f527554 3f79f720 3eff1c28 3f46f5dd -> 3f527554 3f28cc93 3f527554", + "be927c94 3f87c1c2 3f87c1c2 3f666ea0 3ef86e30 3f32640a 3f0be664 -> 3f87c1c2 3f87c1c2 3f724508", + "3efaa0de 3ebae870 bc9ddb0d be51c1ca 3f9b6c7b bd9cb234 bd9cb234 -> 3ebae870 3d26f17e bded37ff", + "3f3a5bfc 3f94223a 3f546e67 3f546e67 3daf5f92 3f7d1d41 3f9d540f -> 3f94223a 3e91a0d3 3e91a0d3", + "3f48b106 3f22f76b 3ee27124 3ee27124 3f14e086 3f8c6041 3f9535a1 -> 3f22f76b 3eb06548 3eb06548", + "3fbe7bfb 3f03b74c 3f634078 3f634078 3def4f0f bcc2390c 3def4f0f -> bf04ea94 3f634078 3f634078", + "3f8e7eb2 3eedfaf7 3f9225a6 bce4a5b7 3f6bfdb9 3f42b506 3f99211b -> 3f7352e0 3f9225a6 3f4fae85", + "be041786 3f984f47 3e98cc56 3f0d66d0 3f59a045 3f59a045 3f0c5fd1 -> 3f984f47 3e73a203 3f0252a7", + "3f557e41 3e8c55b7 3e8c55b7 3f51c7cb 3ec8658b 3f35b84e 3f9a06c6 -> 3e891c22 3e891c22 3f51c7cb", + "3faa9c1f 3f0bb688 3f0bb688 3eabbf33 3da6ac0e 3da6ac0e 3e68bee8 -> 3f0bb688 3f0bb688 3e185dc7", + "3ee0e8e7 3e540e99 3e540e99 3ecadf21 3f979ea5 3eb4b3c7 3f979ea5 -> 3e2c02b4 3e2c02b4 3ecadf21", + "3fb071fb 3f6dbc15 3f6dbc15 3f753f78 3f05f2e6 3f0d05d6 3f0d05d6 -> 3f672222 3f672222 3f753f78", + "3f610c0f 3d186c73 3f91237e 3f52977e 3eece56b 3eece56b 3f22ebff -> 3f3aac7b 3f91237e 3f826f8c", + "3eda6685 3edb3cd1 be3abfe0 3f1ea82d 3f77fdfd 3f36d2bc 3f81ed66 -> 3efb7dbc 3da6bddd 3f1ea82d", + "3d3c1cad 3f355c66 3d60b323 3d60b323 3f7c932c 3f7c932c 3e8082c8 -> 3f355c66 3d78488b 3d78488b", + "beb725ee 3f5feed5 3f648d22 3f5feed5 3e80b5d5 3f047d1b 3f92864c -> 3f8f0a8b 3f648d22 3f8f0a8b", + "bd2185d2 3e449d84 3f1544d9 3e5e041a 3f11da2f 3f95b864 3f95b864 -> 3e40e672 3f1544d9 3e5a895e", + "3f915a07 3f4e16a3 3f7693fc be7e2137 3f7151d1 3f7151d1 bdf91241 -> 3f52ca99 3f7693fc bddc1960", + "3e74e2c8 bc9989d3 3f37eab6 3f37eab6 3f4cb070 3f17cc22 3f17cc22 -> 3de7bcbe 3f37eab6 3f37eab6", + "3fb6d4fe 3f668529 3e5e8383 3f668529 bdc56a48 3f661178 bdc56a48 -> 3f668529 be6c9671 3f668529", + "beee7f02 3e91789d 3f1e9957 3ef65728 be562c40 3f0d4458 3f0e2657 -> 3f0671a8 3f1e9957 3f14a1d8", + "3f37dd64 3d5ddc5f 3f2d04fa 3f2fb99e 3f549e71 3f2243ba 3f3eed2d -> 3ec87413 3f2e7688 3f2fb99e", + "3fad7e71 3ec7f7df 3e32ac5c 3e871a94 3f1188f6 3f1188f6 3f5d9bb1 -> 3ec7f7df 3e923f23 3ea87882", + "3dee8a03 3f111f4e 3f111f4e be7632d5 3e644a1a 3f6b5ee7 3f6b5ee7 -> 3f111f4e 3f111f4e be4920d8", + "3f9947cc 3e6fcf9e bb12c3e2 bd0bcfd4 be2c8383 be2c8383 3f4968c8 -> 3e6fcf9e bc9cc555 bd5a5c77", + "bc3bf38a 3f8998f1 3f13e75d be345520 be753527 3f0d4a66 be753527 -> 3f8998f1 3f143e1b be30ec21", + "3fbc8783 be4a11a5 be4a11a5 3d5ac5f9 bd384997 3e254145 bd8d6994 -> 3d745a5a 3d745a5a 3d5ac5f9", + "bddc8b58 3f0f314f 3f9d28e5 be044655 bcfc6f9b bde9dcbe 3f90ddcd -> 3f0f1ee7 3f9d28e5 be04dbcf", + "3f0a123a 3f713ad4 3f3f1851 3f3f1851 3edce4b5 3e2be8a3 3e2be8a3 -> 3f713ad4 3f0aa807 3f0aa807", + "3f14149b 3e394299 3f2d0364 3edf3a1b 3efc6b9f 3f84538a 3f84538a -> 3e868054 3f2d0364 3ef384b1", + "beb6bfad 3f8d1e0a 3ed6ab62 3bb41179 bcbcca2b bcbcca2b 3dba7cbe -> 3f8d1e0a 3ef70d5b 3ddb3c41", + "bea9bf91 3e5ec5ef 3f7f4012 3db062f4 3f7a6a32 3f05bf64 3f05bf64 -> 3dba2a64 3f7f4012 bd7d736c", + "3fb611b5 3ed0f1cc 3f20e2db 3f18efc9 bd39916d 3ef7b41e 3ef7b41e -> be831f2c 3f20e2db 3f00fa0a", + "bef2794c 3d4acaa9 3f2eb547 bd5c1242 3e203f75 3f991e3e 3f3e83db -> bc0ed792 3f2eb547 bdf8bcd8", + "3eade336 3f8cb117 3ddcd59a 3db69e1e 3f5322cc be3b921b 3f70fe73 -> 3f8cb117 3bdf288c bc614f39", + "bdbe6a49 3f990709 3f32138b 3dc5a4f3 3f845a0c 3ef9dd96 3f845a0c -> 3f990709 3f2d0317 3d5927b7", + "3cea1b7c 3e9f0b01 3ed50d05 3f42297e be39170e 3f81a6d3 be39170e -> 3e988481 3ed00ffa 3f42297e", + "3fa054d3 3ec542ae 3f3b1771 3f3b1771 3f28c902 3f3b1b1f 3f867477 -> 3ef45beb 3f3b1771 3f3b1771", + "3d7375b7 3f0e8047 3f4ddbe1 3f5008c4 3f9f319c 3f8dace0 3e0a1e10 -> 3f075f40 3f4d9f4c 3f5008c4", + "3d7b6533 3ef3a7f8 3ef3a7f8 3f826620 3e5b0f84 be6396a1 bd853b9e -> 3ec37121 3ec37121 3f826620", + "3eabd9f6 3f0ada5b 3f0ada5b 3e5cca25 be223794 3e682bcf bd30c33f -> 3f0ada5b 3f0ada5b 3c836f92", + "3fb8664f 3ec0d073 be4e4438 3ec0d073 3f4bf32e 3f058886 3f6228c3 -> 3ec0d073 3ed1735b 3ec0d073", + "3f6d1f32 3f9b25ee bd2670c2 3edfa8df 3df75b42 3cad9736 3cad9736 -> 3f9b25ee 3e46a257 3f14ffbb", + "3fbd6306 3e9acc6d 3e9acc6d 3e10f7bf 3edbeffd 3ee8a227 3f8d2657 -> 3e9acc6d 3e9acc6d 3dd9d592", + "3f81402d 3e0ac251 3e0ac251 be3c1eb4 3f8f4089 3f2b92de 3f40055b -> 3e0ac251 3e0ac251 3dab7e12", + "3ec27291 3ebf0b4d bb88b703 3dbcc01e 3f87b667 bddd2b0a 3f87b667 -> 3ebf0b4d bc8b709e 3da9277f", + "3f91e7ed bd1a66ba bd1a66ba 3f76b462 3f90534d 3f94637d 3f702559 -> 3f64e777 3f64e777 3f76b462", + "3f4c635a bdfe6ef0 bdfe6ef0 3f5f3388 3efe757e 3f6a9953 3efe757e -> 3eb476af 3eb476af 3f5f3388", + "3f771b6d 3f1c1985 3d88293c 3f1014ba bd90c52d 3f8d5f78 3f83a842 -> 3f1c1985 bd10d68e 3f0dd3ef", + "3f4b6464 3f05df82 3f05df82 3f42eeb3 bd4baad7 bc99c052 bc99c052 -> 3fdae8f1 3fdae8f1 3f42eeb3", + "3f6798e1 3f064b3b 3f8e163d 3f064b3b 3f0738dd 3f448447 3f19553f -> 3f3db34f 3f8e163d 3f3db34f", + "3f9bbd4b 3f1b0046 bd8826d4 bd8826d4 3f368b49 3f77ed46 3f27b9e2 -> 3f1b0046 3f034603 3f034603", + "beb5791b 3f65e668 3f23f681 3d882104 be23ffb4 3f14202e 3f14202e -> 3f65e668 3f2cd11b 3e366824", + "bc1dc058 be35e49d be35e49d bd568048 3e08d1ed 3f61d8c4 3f6addfc -> be3791b5 be3791b5 bd568048", + "3d81958d bc9bb75d bc9bb75d 3ef8f439 3f800000 3f000000 3e800000 -> bc25b55f bc25b55f 3ef8f439", + "3f8b391c 3e3b45ba 3e41e1ee 3f15fa38 3f400000 3f400000 3e800000 -> 3e49154c 3e4f78d7 3f15fa38", + "3ef256b0 3d12ffe1 3f85b587 3f85b587 3f400000 3e800000 3f000000 -> 3e3c1ed7 3f85b587 3f85b587", + "3f8487a9 3f3a9867 3f2c55fc 3f3a9867 3f7ba9bf 3f6f3ecd 3f6f3ecd -> 3f3a9867 3f319126 3f3a9867", + "be26e1ff 3eba9533 3eba9533 3f8c15d2 3f61d34c 3e9082c1 3f61d34c -> 3ebbc591 3ebbc591 3f8c15d2", + "3f73fba8 3f32a3c1 3daf2304 3f8f668d 3ef59772 3ef59772 3f54fefd -> 3f6a763e 3f1e9c9e 3f8f668d", + "3ec87f83 be7d612a 3e1f115c 3f46f869 3ed76873 3f6c7717 3c050bcc -> be176aaa 3e5cf34f 3f46f869", + "3edb18de 3f917edd 3f917edd 3f59e5a8 3f400000 3f000000 3e800000 -> 3f917edd 3f917edd 3f26293b", + "3f90e21a be3e7975 3f8704d9 3f8704d9 3f89f73c 3f89f73c 3f9d5211 -> 3f892a93 3f8704d9 3f8704d9", + "3f1ca98b 3f0ba37c be3afa88 be3afa88 3f68e21e 3e925589 be78c8e6 -> 3f0ba37c be23d7dd be23d7dd", + "3d3fccd5 3c6402d3 3ebbdc2b 3f619a56 3f96bb35 3f340da4 3f96bb35 -> 3d1b4979 3ec3253c 3f619a56", + "bdcd4d5b 3f4b79f1 3c3f88a8 3cdb9c8e 3f886c99 3f5f7cef 3f5f7cef -> 3f4b79f1 bd56a2a8 bd13a505", + "bed76cce bd9c98f7 bd9c98f7 3f2dbfd1 3f0a3fdc 3eea7c5f bb484d5a -> bddb2d24 bddb2d24 3f2dbfd1", + "3e804c63 3f93688c 3f93688c 3f22de25 3f650999 bcd06e0c 3e2c839d -> 3f93688c 3f93688c 3eefe8f6", + "3ea12e76 3f9275f2 3f9275f2 3e7a6716 3e0d18ef 3eba23ed 3e0d18ef -> 3f9275f2 3f9275f2 3e9bafc7", + "3f798a59 3f953058 3f953058 3f0c2c02 3e473ab3 3e5bb2dc 3e473ab3 -> 3f953058 3f953058 3f85a4c5", + "bd6fb065 3f1e2c31 3e9912a0 3ef28cd8 3ec274ae bd047405 3ea664fb -> 3f1e2c31 3ea39b3d 3ef74fa7", + "3f8f9dc6 3f6c74a5 3f09ff7d 3f09ff7d 3f8c3b8c 3f03c351 3f8c3b8c -> 3f6c74a5 3ed79ba9 3ed79ba9", + "3f4eb5ee 3f86330d 3f40bb1e 3eaa8f51 3f7d4bfb 3f99d73a 3f8e6361 -> 3f86330d 3f6e0039 3f42d5b1", + "3e1296b3 3f0dfad5 3e78381a 3ca5db48 3db3e210 3f19bdfd 3eb5b796 -> 3f0dfad5 3e7d6ea6 3ced3c8f", + "baae0c60 3f6d03c5 3db48df8 3ead949f 3f800000 00000000 3e800000 -> 3f6d03c5 3db4cb58 3ead9f61", + "3da29447 3f523c53 3f39d188 3f523c53 3e9010d5 3f38e199 3f72e358 -> 3f523c53 3f300457 3f523c53", + "3e173c77 3e420e88 3db2d7ed 3e8f53cb 3e8a0ce1 3f0ff288 3ee9e487 -> 3e45632c 3dc10827 3e8f53cb", + "3f93c2cb 3bcd0235 3ee802cd 3f8abc82 3f2278d3 3f2278d3 3f86b8e6 -> 3f40e550 3f63f848 3f8abc82", + "3f0c3a90 3ea2f733 3ef704a9 3ea2f733 3e800000 3f000000 3e800000 -> 3e8d5a42 3ef704a9 3e8d5a42", + "3ec02fcf 3f4faba9 3f4faba9 3e5404c2 be19f11d 3d4a930b bd37cccd -> 3f4faba9 3f4faba9 bf4bd7f1", + "3f937cf1 bd1ad680 bd9e4adf bd1ad680 3e1ff711 be3bc7da 3ee1a939 -> bd1ad680 3cf4dd0a bd1ad680", + "be7b6a85 bc4e9e56 3f930604 be1b9f53 3f97b166 3f0fe85f 3f1f8e3d -> be2954ac 3f930604 bea567e6", + "3fb9d322 3d5acd0d 3d5acd0d 3e311cb5 3e099ef8 3dbcfe84 3f9a0f7f -> bb9fe70b bb9fe70b 3e311cb5", + "3f93bbe2 3f8ffa4a 3f0f01ba 3f8ffa4a 3f233cd1 3f108288 3f233cd1 -> 3f8ffa4a 3f881624 3f8ffa4a", + "3f2faced 3f9a4a74 3f1df7a4 3f9a4a74 3f82e463 3e1a83a9 3e1a83a9 -> 3f9a4a74 3ea19fb3 3f9a4a74", + "3f96a766 3f6448ea bdd9d9ab bdd9d9ab 00000000 3f000000 00000000 -> 3f6448ea 3c9a393c 3c9a393c", + "3f9f6b51 3f874f40 3f239fef 3f53cb15 3da61fe7 3e4cf347 3da61fe7 -> 3f874f40 3ec0de62 3f2eda13", + "bed03380 bcd944b3 3f4a6373 3e6b9ea7 3df6749d 3ecf264f 3df6749d -> be081e45 3f4a6373 3e20e147", + "3f0cfc6f 3f1f151d 3f1f151d 3e0497c8 be159565 3f19b1e7 be159565 -> 3f1f151d 3f1f151d bccd9367", + "3e10866c 3d81ee67 3f8d7769 3f8d7769 3f94c901 3f819f96 3f819f96 -> 3e42f486 3f8d7769 3f8d7769", + "3f29ac35 3e5053fa be686c94 3f8c8411 3eadba38 3f743a72 3f91a865 -> 3ee7269b 3e0fc7e8 3f8c8411", + "3f86ebe4 3ef6a93b 3db7e8dc 3db7e8dc 3df17658 3df17658 3f2d210a -> 3ef6a93b 3dab5d6e 3dab5d6e", + "3f44ca9d 3f66951e 3f66951e 3f960a2c 3e2f0e56 be2a35e7 be2a35e7 -> bf2af610 bf2af610 3f960a2c", + "beccf98a bdf24cd5 3f061c65 3f061c65 3f7cc486 3e4828a6 3e4828a6 -> be542ac2 3f061c65 3f061c65", + "3f85143b 3f62c380 3f62c380 3e830e51 3f3fe100 3e269ec6 3f3fe100 -> 3f62c380 3f62c380 3e425363", + "3eb69fd5 3f241f9e 3ec7292b 3f5d2504 3f2e0828 3f3890a9 3dfc82a4 -> 3f19ca57 3e9b1a20 3f5d2504", + "bee9281b 3f1c81b1 3ed05dc8 3ed05dc8 3f02e4bf 3f982306 3edcdc2a -> 3f1c81b1 3efb8544 3efb8544", + "3f752f63 3f01b7b5 3f9fd85c 3f01b7b5 3f91c62d 3ef60a2a 3ef60a2a -> 3f06ad02 3f9fd85c 3f06ad02", + "bdd0ae8b 3f6c9b11 3ef6d60e 3f551d38 3eef542f 3f6f6bd5 bcd074c2 -> 3f6c9b11 3f08a657 3f57dc3f", + "3f55ee97 3f0eda68 3f22bfb9 3f22bfb9 3f12689b bcb1fa75 3f6ac023 -> 3da2051d 3f22bfb9 3f22bfb9", + "3e8f08dd 3e8625ae bc1ddab6 bc1ddab6 3f375e73 3f1afcde 3f1afcde -> 3e8625ae 3d60f732 3d60f732", + "3face5f9 3ee8d4b1 3f9b81b1 3eae0471 3f000000 3f400000 3f400000 -> 3f80cf58 3f9b81b1 3f798d21", + "be70716b 3ec269d2 3f53ce98 3f53ce98 3f3387dc 3f9c1c8a 3e3049c7 -> 3ee205cc 3f53ce98 3f53ce98", + "3f50e1fa 3e1cefb1 bc9c3d01 bc9c3d01 3ee77555 3f571bb3 3ee77555 -> 3e1cefb1 3d829891 3d829891", + "3e5264c9 3f93283e 3e97162e 3f93283e 3ece223e 3f52a923 3e364155 -> 3f93283e 3e9233ce 3f93283e", + "3ed42c7e 3f96c9f5 3f81c847 3f96c9f5 3f400000 3f800000 00000000 -> 3f96c9f5 3f180025 3f96c9f5", + "befefe65 3f80f40e 3ca2ae7f 3f015402 3f7930a7 3f2ae3b3 3f7930a7 -> 3f80f40e bea0f0c4 3eaba2b4", + "3f9cb860 3f65248a be3eb227 3f1b7d54 3def52e2 3f2da1d6 3def52e2 -> 3f65248a 3e6c2387 3f37e1bc", + "be8750ea 3ec69dba bd9626e6 bb1eee1d 3f86cce0 3f1ce2b7 3f86cce0 -> 3ec69dba be1c028f bd8df49e", + "be1b8da5 3abd65e8 bd4347f8 3a85b777 3e063dd2 3e063dd2 3f9e60f0 -> 3abd65e8 bd610a84 3a7af5e6", + "bed9fc31 3f670e07 3f1022b3 3dd72a93 3f951024 bdf59782 3ec195e6 -> 3f670e07 3f1952c7 3e41e7d9", + "be1af11d 3f9975d6 3f412d90 3f05cbcd 3f800000 3f800000 3f800000 -> 3f9975d6 3f2ff7b0 3ed7337d", + "3e9581b6 3f920ad1 3e6ff604 3f920ad1 be31f268 be41a194 be31f268 -> 3f920ad1 3f0747ce 3f920ad1", + "be1d423a 3f8a300e bcfa5577 3f8a300e bced3ab3 3f53ff42 3f53ff42 -> 3f8a300e bcf1488f 3f8a300e", + "3f30bbb7 3f435499 3dab0bc3 3e6588b2 3c75fba1 bc181f2c 3f42853e -> 3f435499 3c9f1e82 3e317c2f", + "3f31b2d1 3f082165 3eaae69a 3ebbacb9 3f5ba8f6 3ec48e9e 3ec48e9e -> 3f082165 3e88d3be 3e9f3d65", + "3dc3c659 3f3863af 3f3863af 3f5e068f be5c5bc0 3e113c92 3f9a6356 -> 3f22f9f3 3f22f9f3 3f5e068f", + "3e03d8db 3d86f69f 3f9af0c4 3f80ee15 3f86b7a7 bdb26f5d bdb26f5d -> 3d365324 3f9af0c4 3f8071a8", + "3f2f5d42 3f4acecc bdbb19a9 3f2feef3 3f7c6266 be1bee33 3f954c1b -> 3f4acecc bdcc0851 3f2fae93", + "3ecf0b80 bda3ad78 3f85841e 3ec0cb31 00000000 3f400000 3f400000 -> bd42fa6a 3f85841e 3eca9d6d", + "be27df2d 3d10ec59 3d10ec59 3f890eeb 3f1bf322 3f2a1af4 3f92e427 -> bd54fde7 bd54fde7 3f890eeb", + "3f60c77d 3f0ca3fb 3ecf719e 3f0ca3fb bde5db1c bde5db1c bdbee239 -> 3f0ca3fb 3f2159b6 3f0ca3fb", + "3f91e33d bc7e8dbb 3ed0bb05 3eaf10e2 bd9e1c0d 3f9b822b bd9e1c0d -> bce017c7 3ed0bb05 3eae2039", + "3fac88ed 3f858566 3f858566 be538c6b 3ef28057 3f4e0601 3f5841e3 -> 3f858566 3f858566 3f5c380e", + "3fbb63df 3e06615e 3f2e8d43 3ee500bc 3f8b2578 3eacdf2b 3f608bb4 -> 3e7f2091 3f2e8d43 3efeb921", + "3f778eca 3f87ba1f 3f7af760 bd6a50d4 3f87d5f6 3f5867f7 3f87d5f6 -> 3f87ba1f 3f857a2a 3f509e7d", + "3f6e44c8 be73187b bd7bcb04 bd7bcb04 3d79757b 3f4fe520 3f88a9a3 -> bca16fbb bd7bcb04 bd7bcb04", + "3f908c88 be731a4d 3f03b3f4 3f1cdece 3dfd6ff9 3f233e1a 3f51b4a6 -> 3e0a7a57 3f0ebbe0 3f1cdece", + "3f5723fe 3f611350 be210904 be3ac5ea 3f50e240 3f93a4cb 3f05fd92 -> 3f611350 3ea3b398 3e9cc149", + "3f1c2bf3 3ee863ff 3f81569e 3f81569e 3e800000 3f000000 3f800000 -> 3ea98628 3f81569e 3f81569e", + "3e288709 3f141728 be0ffbe8 3f5fff00 be42006f 3eb8251b 3f09c599 -> 3f1207fc be2c32b7 3f5fff00", + "3f5d1cf4 3f429dd9 be534e74 3e5b9904 3d593bd8 3f89aba6 3f89aba6 -> 3f429dd9 3b8b7cb9 3eaaaf95", + "3fbe0af8 3f2a4b48 3f33f4a1 3f33f4a1 3e8ffb94 3e8ffb94 3dfc292a -> 3e09bff8 3f33f4a1 3f33f4a1", + "3f878984 bd65e72c 3c864f41 3c936b61 3f000000 3f800000 00000000 -> 3b589a31 3c90d23b 3c936b61", + "bef37df4 3f9e9d2f 3f174556 3f2b96c9 3e800000 3f800000 00000000 -> 3f9e9d2f 3f5f35f5 3f6ab8a9", + "3f9b9d29 be32a58a 3f28f455 3f28f455 3f4b6de7 3f93cf65 be2dd741 -> bda47f30 3f28f455 3f28f455", + "3f9616ca 3f72abbb 3f72abbb 3db16d6e 3d75928c be69b621 3e493384 -> 3f72abbb 3f72abbb bfa72d3f", + "3f3587ff be0bfa4b 3ebc6d72 3f37cf75 3f95245c 3f21c45c 3f21c45c -> 3e7207d4 3f0551f4 3f37cf75", + "3f752e77 3d7b81f0 3d7b81f0 3f9c845b 3ee4c882 3f18eb95 3ee4c882 -> 3f60eed3 3f60eed3 3f9c845b", + "3ecebb1f 3f6e4e6b 3d3d4706 bdb97099 be2adb01 3e726378 3eafd85f -> 3f6e4e6b bda467d4 be7243a1", + "3dba24b6 3c02dcdf bb28ed65 bb28ed65 3f2717f2 3e83fd8b 3f9847c6 -> 3c02dcdf bb0f439a bb0f439a", + "3f80bf63 be287ac2 3edb50fa 3eb4cc59 3e53a6df 3e53a6df 3f8d7551 -> 3da6ff98 3edb50fa 3ec4c8f4", + "3f26083c 3f6ade3a bd21232e 3dcd0d02 3f3fffe6 be734423 bd780b96 -> 3f6ade3a be4f285d bd2018d3", + "3ec643c8 3f5e2fa2 3f7fe59e 3f7fe59e 3eb7b7c6 3eb7b7c6 3eef59ac -> 3f54353d 3f7fe59e 3f7fe59e", + "3e9bedf9 3daff45e 3e1499e4 3f925a13 3e800000 3f800000 3e800000 -> 3e1653a4 3e4f75ae 3f925a13", + "3f329026 3f8586aa 3f549287 3e3df3eb 3efc9122 3f3dabd1 3f4872eb -> 3f8586aa 3f6978c1 3f03b772", + "3d1bf040 3d819dd3 3d819dd3 bdb0ef97 3f12d160 3e57ce51 3e57ce51 -> 3d819dd3 3d819dd3 bda862ef", + "3f7ee916 3ea51139 3ea4dc0e 3ea51139 3f579c10 3ce5b90c 3f26af20 -> 3ea51139 3c459356 3ea51139", + "3ec24358 3f4b0e4a 3e93d5a2 3f4ec825 3f8cea70 3e2aa898 3f8dcf86 -> 3f4a99ab 3e66b1eb 3f4ec825", + "bdf79b8e 3f840b94 3f840b94 3f40b3b4 3f49bc86 3f3afe8f 3f867505 -> 3f840b94 3f840b94 3f41cc2e", + "3eb6a84e be696009 3f0919e4 3e86cbcf 3f800000 3e800000 3e800000 -> bdca69cd 3f0919e4 3e9e5d40", + "3eebd6af 3f828b69 3f899b08 3e2e5ea4 3efc4be5 3efc4be5 be427d7a -> 3f807160 3f899b08 bdcaca43", + "3fb9a4fa 3ec11ef9 bd0603a0 bd0603a0 bd39b8e4 bd39b8e4 3f6e8e08 -> 3ec11ef9 bc42b595 bc42b595", + "3dff6065 3f1ba143 3e80157a 3e80157a 3d2e6c4e be1eb5d5 3ebd028b -> 3f1ba143 3e3fa24f 3e3fa24f", + "3eec4f2a 3f833aa1 3f444ac9 3f833aa1 3da4a1b7 3da4a1b7 3f588825 -> 3f833aa1 3eea6a5d 3f833aa1", + "3f953447 3f811619 be6b603d be6b603d be416234 3f890f98 be526380 -> 3f811619 be3ffb00 be3ffb00", + "3f20e58c 3eb05d30 3ed0faf4 3ed0faf4 3ecb0031 3e892244 3e892244 -> 3e9a3f1c 3ed0faf4 3ed0faf4", + "3db57ce0 3f3b0e50 bda13f15 3c90c765 3e8eb0a9 3f39fade 3e8eb0a9 -> 3f3b0e50 bd402bb4 3d3b306d", + "bdfa6be5 3f1fc533 3e926130 3f1fc533 3f7644bd 3f94ab75 3f7644bd -> 3f1fc533 3e83eacf 3f1fc533", + "3e138589 3f48d3a4 3f48d3a4 3ebf95ab 3f9121c4 bd8e6891 bd8e6891 -> 3f48d3a4 3f48d3a4 3ea06f7f", + "3eaa9ed7 3f9d4009 3eba747d 3f9d4009 3f2fc4e7 3f2fc4e7 3f5c28a8 -> 3f9d4009 3f11d570 3f9d4009", + "be806e07 3f5a637b 3f867d96 3f50f729 3e646095 3ee7ce7c 3f978985 -> 3f7bdc4f 3f867d96 3f78abfb", + "3fb8e854 3f99a0dc be4d9674 bd9b479e 3ed0c23a 3d9aed01 bd3ee319 -> 3f99a0dc bddf0ea4 3c0079f9", + "3f493f5b bdb114ab 3f89e06a 3f96e834 3f6bab01 3f6bab01 3daeb8fe -> 3d8a0816 3f8b7605 3f96e834", + "3f6d06e3 3e9739ef 3f587259 3f1f5fff 3f9c846e 3f1768ad 3f9c89ce -> 3ecd0bce 3f587259 3f2a47b1", + "3f61f12f bd235915 3f2c9574 3f2c9574 3f7d641d 3ef3837e 3f0c46c9 -> 3e8ffc31 3f2c9574 3f2c9574", + "3cb00e66 3f4cb0c3 bdbc47f5 3f163915 3f89ea0e 3ed1e637 3f89ea0e -> 3f4cb0c3 bdaad826 3f16be3d", + "beb6410c 3f0a188e 3ebb0d20 3f0a188e 3ed1b96f 3ed1b96f 3f2e1da1 -> 3f0a188e 3ec26ca9 3f0a188e", + "be8ddbe3 3f8b7df2 3e314b90 3dc63cf9 be213df3 be5cfc9e 3d5816c2 -> 3f8b7df2 3fab465f 3fadec06", + "be260e9a be36e80a be36e80a be612324 3e78c649 3ca8f958 3e3406b7 -> be36e80a be36e80a be81906e", + "3faddea1 3e3c6d82 3f7eb593 3ee7dad7 3f323a05 3f323a05 3d30744e -> 3c90e568 3f7eb593 3eaeed4b", + "bdf8d6a3 3f9f68ab 3dc8b167 3f9f68ab 3f333345 3f9b662f 3f6d715b -> 3f9f68ab 3cb99572 3f9f68ab", + "3fa95ddb bd8cc4aa 3eb76502 be1342d5 3eea9653 3c80f3ca 3dcb6345 -> 3ddb0430 3eb76502 3d8087d8", + "bea311a5 3e2db0e8 3cec1eaa 3cec1eaa 3e954a58 3e8aceb0 3f5f7781 -> 3e2db0e8 3caddfea 3caddfea", + "3f3eb35e be552a51 3f2065e7 3f648b93 be0c7c4e 3e4d977e 3f58b663 -> be24bd09 3f235353 3f648b93", + "3f85b635 3f38ff81 3e331913 be0ac843 3df7a884 bdd89625 3ecbae81 -> 3f38ff81 3e0c77f5 be474def", + "3f8750d0 be09348d be33b429 be33b429 bd05052e 3e119b9d be221693 -> be09348d 3e2bbc11 3e2bbc11", + "3e92c9e0 3e7ca13a 3f044b9b 3da6935d 3f69c10a 3e89cfd1 3f0b0a29 -> 3e84c760 3f044b9b 3dd04379", + "3ec5b990 3f4dbcaf 3f83ce6b 3f81a311 3dd0c144 3f2bc2bd 3dd0c144 -> 3f0dc056 3f83ce6b 3f7e7a2d", + "bebfbd33 be158188 3f9f39ce 3f6e2e2d 3e6bfc84 3e6bfc84 3f8722cf -> be9acfc1 3f9f39ce 3f652676", + "be724b88 3ea7a44e 3efdf0ca 3f060ba7 3ecf2c62 3f088a86 bd3a7105 -> 3ed4b8e2 3f022544 3f060ba7", + "3f87a082 3f6aca29 3f593196 3f6aca29 3f9dc7e9 3f4c9814 3f802b8b -> 3f6aca29 3f145aba 3f6aca29", + "3e5076f3 3f24a4cb 3f41343f 3f41343f 3f83ee0c 3f83ee0c 3f52c5f8 -> 3f228b70 3f41343f 3f41343f", + "be291609 3e5a41d9 3f6b2d6f 3e5a41d9 3e23cff1 bd50a124 3e23cff1 -> 3e97e086 3f6b2d6f 3e97e086", + "3f89aa29 3d514f4e 3f4a48ee 3d514f4e 3e527035 bd93151f 3e85c862 -> be73233f 3f4a48ee be73233f", + "bc030e58 3f748cfd 3e5c6ee3 3f748cfd 3e844ea3 3f9726d4 3ed130f7 -> 3f748cfd 3e5c7bef 3f748cfd", + "be7377c3 3f712444 3f643e26 3e7005c5 3ea0d26a 3eb3d757 3dc6db20 -> 3f712444 3f64214f 3e69b1c9", + "3ebba729 3f8d3d11 3f0bfcdf 3f8d3d11 3f000000 3f800000 3f000000 -> 3f8d3d11 3f0c723a 3f8d3d11", + "3fb2cded 3efb0869 be0feb64 3efb0869 3f064b4f 3f064b4f 3f943553 -> 3efb0869 3ebb6f8c 3efb0869", + "3f4e14b0 3f821d6b 3f2a486c 3f821d6b 3e3d6364 3e7f5aca 3e7f5aca -> 3f821d6b 3f3c92cf 3f821d6b", + "3f42b478 3f895e8d be35764e 3ed12854 3f4a26be 3e980eab 3e9be977 -> 3f895e8d 3e8773ce 3f24b217", + "3e247c83 bd7fb937 3f7a6bda 3f1ae894 3e64abeb bdd7f38c bdd7f38c -> be01a326 3f7a6bda 3f1504ec", + "be54be8d 3e1a2b19 3f73879a 3f6786cf 3f80b8fe 3e368fbc bddc034d -> 3e4fd144 3f73879a 3f684fdd", + "bed6b4a9 3c65618d 3f9bf756 bd419f4a 3f6840c7 3f6840c7 3f15e05c -> bea3246a 3f9bf756 becb2d3a", + "3ef098d0 be2597c4 3f67162d 3f0fe484 3eeb6dea 3eda4e73 3eda4e73 -> 3e9d7f68 3f67162d 3f3656d6", + "bc957fde 3d7a5228 3f3a8664 3f3a8664 3ee3b205 3f84820e 3ee3b205 -> 3d677e06 3f3a8664 3f3a8664", + "3f32cc70 3f1a1eb7 3e119e92 3f8b0868 3f0bb0ae 3f2f7e7d 3f9f0b83 -> 3f38d290 3ec0886a 3f8b0868", + "bed5e4aa 3eb2884c 3f00a2c2 3eb2884c 3eab4900 3f9c0a99 3f2fcda0 -> 3edf9f2f 3f00a2c2 3edf9f2f", + "3f822e3b 3f152a13 3e9be853 3f152a13 bd8fda85 bd8fda85 bdf69aba -> 3f152a13 3f815e4c 3f152a13", + "3f078bbc be0a244c 3f4b0489 3f4b0489 00000000 3f400000 3e800000 -> bd81ff7e 3f4b0489 3f4b0489", + "bda68f4a 3d7486dd 3d7486dd 3e3efdc7 3f9caba0 3d94c54c be6f7fcf -> 3d8a24a0 3d8a24a0 3e3efdc7", + "3ddb3bb1 3f95c02d 3f804614 3f6cbba4 be58e01a 3f0c2586 3c9ee3dc -> 3f95c02d 3f66b7b5 3f46fce4", + "3f608de9 3f42fc6c 3ed0c7a4 3ee01309 3f9f1aea 3ef46fec 3e62de95 -> 3f42fc6c 3e2d3b22 3e6071ac", + "3e968070 bdeb4868 bdeb4868 3f6fb1e8 3f400000 00000000 3f000000 -> bda61f20 bda61f20 3f6fb1e8", + "3f575b52 3f08e00a 3e9cf132 3e9cf132 3e800000 00000000 00000000 -> 3f08e00a 3d47552b 3d47552b", + "3f7cce21 be7ce57e be7ce57e 3cc0d369 00000000 3f000000 3f400000 -> bb49fd31 bb49fd31 3cc0d369", + "3f084443 3ebdc947 3ebdc947 3f86206c 3f000000 00000000 3e800000 -> 3e31877c 3e31877c 3f86206c", + "3f43ffdd 3f564db5 3ed1a979 3f50d482 3e985f4f 3f62b87e bdc09569 -> 3f564db5 3ce4c160 3f4bf237", + "3f8d549f 3d4fbfa4 3e873cc9 3d3fb051 3f84f571 3f88385b 3ea6a204 -> 3db3525c 3e873cc9 3dacad88", + "be8840b3 3e6976fa 3e6976fa be3d2634 3f5db281 3ea5235f 3ea5235f -> 3e6976fa 3e6976fa be834ffb", + "bd3edeba 3f11db10 3e114c39 3e114c39 3ee1c96f 3ea48fbf 3ee1c96f -> 3f11db10 3e0440eb 3e0440eb", + "bec52739 3f3df236 3f5f4b8c 3f4d5688 be3f36f5 3e793589 be3f36f5 -> 3fa487da 3f5f4b8c 3f8c1f7e", + "3f291e49 3f863857 3f9f3826 3f3ab3de 3f917e8d 3f62abc8 3f2548c1 -> 3f857d59 3f9f3826 3f36da7d", + "3fa844b8 3f1d9e10 be27e9fe 3f613fd4 3dbc5d69 3f05a2ec 3d591e63 -> 3f3331a2 3e2d1930 3f613fd4", + "3fabc807 3f0cf71e bde81977 bde81977 3f80f506 3f88c87a 3f47a255 -> 3f0cf71e 3f13fa5c 3f13fa5c", + "bd98dc30 3f9a144f 3f9a144f 3ea3a3b8 be38ef6d 3ee148f4 3ee148f4 -> 3f9a144f 3f9a144f 3ec2bc04", + "3f09f194 bddb031f bddb031f 3f6c4861 bdecee2e 3e317575 3e317575 -> bec33cbc bec33cbc 3f6c4861", + "3f9e3df5 3def7190 3eb79b3e 3def7190 bdeeb89b 3e2a9b73 bdeeb89b -> beacf29b 3eb79b3e beacf29b", + "3faed9c3 3f91eb84 3f91eb84 bd9203af 3eb26020 be4798fa be4798fa -> 3f91eb84 3f91eb84 bf585d3c", + "3d91ce6e 3f790420 3f03adac 3f7ba476 3f683d0b 3efa977b 3f32e7c6 -> 3f7905c1 3f03f826 3f7ba476", + "3fb675f8 3e92402f 3f28351e 3f28351e 3f5bdafa 3ef21eab 3f5bdafa -> 3ec9d4cd 3f28351e 3f28351e", + "3ebd8056 3e87d1ba 3eb401e9 3eb401e9 3f39b581 bcf1a836 bd8c6d95 -> 3e1e813e 3eb401e9 3eb401e9", + "3e9d064c 3f00cff0 3f6751f3 3e75fe7d 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f20400f 3f6751f3 3ee32969", + "3e9c6de5 3f73918c 3f9939d0 3eea48bd 3dd6c120 3f45af02 3dd6c120 -> 3f6be74b 3f9939d0 3ebc21fe", + "3f410659 3ef406a9 3f5f8770 3e756db4 3e32cca9 3f6d6fda 3ed2803b -> 3ee1d48c 3f5f8770 3e3b4b0d", + "3f2e289b 3e8349db be20b842 be2bbf01 3f4f0082 be142ddd 3f4f0082 -> 3e8349db bd9c012b bdadbf76", + "3f8abf29 bc9550af 3f374042 3f374042 3f000000 3f000000 00000000 -> 3ac894f0 3f374042 3f374042", + "3fa58156 bd9470e1 bd9470e1 3f9b423f 3f484289 3f6deb24 3f6deb24 -> 3fabb1a2 3fabb1a2 3f9b423f", + "3f56b9fb 3f5028c6 bdc6e54e 3f132419 3dbcea18 3f8ae4f4 3dbcea18 -> 3f5028c6 3d2d57e3 3f1c7cfe", + "3f79178e bbad1268 be4773b7 3c641c33 3f000000 3f800000 3e800000 -> 3c4c4d2f baf4ff27 3c641c33", + "3fac46a0 3eec966c 3f367215 3eec966c 3f9ff3bd 3f9622c8 3f0e21ca -> 3e885c53 3f367215 3e885c53", + "3f9e1d98 bdfbbb94 3f8bd2e4 3f3fd904 3ea8d1f9 3e0c4e90 3ef3910a -> 3ed5ccab 3f8bd2e4 3f66e572", + "3f2e29ee 3f17b806 3ed8c9f4 3efe8418 3f61e35d 3d9586d4 3ed78bc9 -> 3f17b806 3e2cc409 3eb4e3a0", + "3fa752a4 3f35bc4f 3f15883b 3f8ee563 be4795f3 3f293c0f 3f293c0f -> be4e9ca4 bf1c15e2 3f8ee563", + "beb5c35f 3eb0e770 3dc8170d 3f48b8d8 3f7d6e40 3f7d6e40 3f9ccc1f -> 3e65527e bdbd91d9 3f48b8d8", + "bdb0c581 3ef16232 3e9eb429 3e9eb429 3ed9b1ea 3ed6dfc9 3ed9b1ea -> 3ef16232 3e97d658 3e97d658", + "3f538c43 3f85f12a 3f1061a8 3e17cf53 3f84b3bb 3f84b3bb 3f80b26b -> 3f85f12a 3f72d9ae 3f5d46ff", + "3ef1e77d 3f0029d5 3f97e730 3f0029d5 3d4b14e8 3f15aa3c bd708cec -> 3e54c3ad 3f97e730 3e54c3ad", + "3fbf4b94 3f9ba02d 3f49eb6f 3f49eb6f 3f1edc7a 3e392d7e 3f1edc7a -> 3f9ba02d 3e0ed422 3e0ed422", + "3f31c880 3e80307c 3e7c3dfd 3f9fa31a 3f3880fb bdf5df31 bdf5df31 -> bd827446 bd8d55f8 3f9fa31a", + "3f92e372 3ef90fff 3f9068a6 3f9068a6 3f800000 3f800000 3f400000 -> 3f66338c 3f9068a6 3f9068a6", + "3f83ae01 3f5670b4 3f8cbcfe be37f6d5 3f570ccd 3f570ccd 3e38361a -> 3f6cd1f2 3f8cbcfe 3e7d5509", + "3f378abe 3f57c3d5 3f57c3d5 bc10d8d1 3ec56d27 bdd1e90b be2f1264 -> 3f57c3d5 3f57c3d5 be8a75c9", + "be186a68 be20da8e 3e71f807 3f234d3d 3e800000 00000000 3e800000 -> be38cbb3 3e65dfbe 3f234d3d", + "3e8bfd6a be046773 3e0a94bb 3d4c8d0e 3f47bd39 3f2faf32 3f11b4a0 -> bd891fd0 3e0a94bb 3d8f7a38", + "3f3be664 3f28d625 bcd7f866 bcd7f866 3e7cb74e 3f9c3a6a 3f9c3a6a -> 3f28d625 3dba18ba 3dba18ba", + "becb2227 3ee86fe4 3f92f329 3efa3dbd 3f116f9f 3f116f9f be6bb9a7 -> 3f519365 3f92f329 3f55cced", + "bee4d549 3f23a2f3 3f7e678b 3f23a2f3 3e987344 3f20ef72 3f59adc1 -> 3f44f4d3 3f7e678b 3f44f4d3", + "bee3a0df 3edc269f 3f93f171 3f0b91bd 3f800000 3f400000 3f000000 -> 3eba7adb 3f93f171 3efacfec", + "3fb3a45c 3f2b2fb9 be669703 3f2b2fb9 3b777511 3f0c5d08 3b777511 -> 3f2b2fb9 3dc74cf8 3f2b2fb9", + "beab964a 3ec3770f 3ec3770f 3f915e3b 3f400000 00000000 00000000 -> 3f027c5a 3f027c5a 3f915e3b", + "3ee20a6c 3e8183bd 3e8183bd 3f163707 3d6e956e 3dad0594 3d6e956e -> 3ea3c867 3ea3c867 3f163707", + "3f9469dc 3ef3b2e6 3f315c52 3f315c52 3e800000 3f000000 3f000000 -> 3ea6c7ee 3f315c52 3f315c52", + "3eea0c3a 3a65eb63 3f8d3269 3dce992c 3f77f8ed 3f82cad2 3f77f8ed -> 3ef4fcb5 3f8d3269 3f090033", + "3f009111 bbd8ec7a 3f830892 bbd8ec7a 3f6c3c17 3f3c5551 3f6c3c17 -> 3ed02a4d 3f830892 3ed02a4d", + "3f9305ce 3ef40d6b be4532d3 be4532d3 3f000000 00000000 3f800000 -> 3ef40d6b 3cea73da 3cea73da", + "becd882e 3ea5d6fe 3f9e6257 3ea5d6fe be0d9835 be4e57ea be4e57ea -> be8a343d 3f9e6257 be8a343d", + "beb68860 3ed83d42 3f3e7d9a 3f21523f 3f41e0c0 3f41e0c0 3f3d9d26 -> 3ea07e98 3f3e7d9a 3f177378", + "3f0723ec 3f8233b0 be22353a be22353a 3f64bab7 3f39a5a9 3f7d9eed -> 3f8233b0 3ea2f495 3ea2f495", + "3f940bbc 3dc61026 bc6febe2 bc6febe2 bd78c88b 3eb36124 3eb36124 -> 3dc61026 bc8c122b bc8c122b", + "3f4aef0d 3df20bc0 3df20bc0 3db0ee5c 3f666666 3f666666 3f666666 -> 3df20bc0 3df20bc0 3de48c5b", + "3f64e832 be469052 be469052 be3e5f72 3e7d4aa5 3e7d4aa5 3f919f40 -> bd6819ba bd6819ba be3e5f72", + "bdf2738b 3dc7b18f 3cf1964b 3cf1964b bdb23940 3e93127a baacb1dd -> 3dc7b18f 3d156ae7 3d156ae7", + "3fabb92e bac25f0d bac25f0d 3ef14c2e 3f8dcf8d 3cff5333 3ed4c59e -> 3c95dcaa 3c95dcaa 3ef14c2e", + "3f80f2ea bb339406 3e9e9e10 3f9cdeff 3f506f2a 3f091af1 3f303c3e -> 3f4fe915 3f6ad6dc 3f9cdeff", + "3fb468d3 3f5df5a4 3f5df5a4 3f2f0db2 3f9c1777 3ebdf7d4 3f9c1777 -> 3f5df5a4 3f5df5a4 3dbc118c", + "bea23d6b 3e423121 3e42754b 3eb8cb17 3e9f681e 3f50d847 3f32a1f3 -> 3e530819 3e5345b7 3eb8cb17", + "3f93eae4 3ec27db5 be17c3a3 3f5c0bc7 3f000000 3e800000 3f400000 -> 3f1e763a 3eb554fe 3f5c0bc7", + "3e925e04 3f88e413 3f88e413 3f8c6e6a 3f375a8d 3f5b28ec 3f375a8d -> 3f835815 3f835815 3f8c6e6a", + "3fb286f3 3f83ecc5 3f81ff08 3f81ff08 3f000000 00000000 00000000 -> 3f83ecc5 becd42b3 becd42b3", + "3e90de99 bccf97fb 3ee1b2bf 3f2380b6 3f2204c4 3f229769 3f229769 -> 3e25cada 3efe4406 3f2380b6", + "bee6ae9c 3f494663 3de7b5be 3f494663 3f266084 3f0b6d23 3ed6b36e -> 3f494663 bd83fcef 3f494663", + "3f8a1c53 3f86d3df bdac7867 bc623600 3f696b0c 3f9bcd44 ba052b45 -> 3f86d3df 3bca6dbc 3d91634e", + "3f2bdd59 3ea3d00d 3f5fe19f 3f5fe19f be780b09 3f2f55dd be4bf609 -> bdd1e81c 3f5fe19f 3f5fe19f", + "be0bd545 3e089051 3e089051 3db1e826 bd547cf0 3f0b0c34 3f53ad82 -> 3e089051 3e089051 3dcc8a80", + "3bc1a7bf 3e368e0a 3f59becd be04b8df bd9d5fbe be112ad1 3f9825b0 -> 3e36abf1 3f59becd be048d3d", + "3f5eb6db 3ec2c2fb 3f02a4a9 3eb75f18 3f37db51 3f779233 bd54dbdf -> 3dc07f44 3f02a4a9 3cba0961", + "3f6348ee 3e514832 3e398631 3d27c5fa be2c48ab 3f159ea6 be2c48ab -> 3e514832 3e2ca4af bd432254", + "3effe7c0 3f95cd9f 3f9f32fe 3f9f32fe 3f000000 3e800000 3e800000 -> 3f656dc5 3f9f32fe 3f9f32fe", + "3efa386d 3f82fd70 3e55d419 3ef8df54 3ddcbed7 3f2a2abc 3ddcbed7 -> 3f82fd70 3e405f2f 3ef1cbba", + "3fa5079c be426fcb 3f725358 be4e09a8 3f9be6a1 3f9be6a1 3d74a070 -> 3e014274 3f725358 3df1c544", + "3fa99ce3 3f24dd33 bdb72426 3f9a3c39 bd03f870 bd03f870 3dd12d8e -> 3ef4426d bef2ff9f 3f9a3c39", + "3c9c0e1e bda827a6 3f2df651 3f6c4bf9 3efcf764 3d26864c bc325740 -> bda5bebb 3f2e08fd 3f6c4bf9", + "3f10a129 3f94fc32 3f9f7833 3f94fc32 3f103fa5 3f103fa5 3e85c847 -> 3f552fa2 3f9f7833 3f552fa2", + "3eed4f34 3f4f0410 3f4f0410 3e7e385b 3f96f472 3f03abfa 3f03abfa -> 3f4f0410 3f4f0410 3e97e3a1", + "3eb0a916 3f60ae90 3e803b97 3f46bf08 be2e456d 3f64b4ff be2e456d -> 3f60ae90 3dd9ce06 3f40c98e", + "3dfb1488 3f9a8935 be512bd2 3f9a8935 3eb3f771 3ea93787 3eb539bc -> 3f9a8935 bd280476 3f9a8935", + "3e3f8936 3f00f6df 3e7295f5 3f7a0171 be40463c 3f5b42ee 3f9aac50 -> 3eea230c 3e282538 3f7a0171", + "beceaeb9 be09c60b 3dff138a be09c60b 00000000 00000000 3e800000 -> be4163bf 3dff138a be4163bf", + "beaf8909 3eeef2cf 3f949995 3f949995 3f853731 3f853731 3f78318a -> 3e8308c2 3f949995 3f949995", + "be8d4339 3f894ec6 3f894ec6 bd66bb7e 3f49ddf3 bdaa9aa1 3f9a4a58 -> 3f894ec6 3f894ec6 bd529d25", + "3ed58b50 3f337bc6 be411d90 3f337bc6 3e589def 3f40de80 3e589def -> 3f337bc6 bce3f613 3f337bc6" + ] + }, + { + "function": "cycles_mix_val", + "node": "ShaderNodeMix RGBA VALUE", + "cases": [ + "00000000 00000000 00000000 00000000 bde346fe bdc460a5 3ec6c8ac -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3ef1e7a0 3f0070b1 3ef1e7a0 -> 00000000 00000000 3ec070b1", + "3f800000 00000000 00000000 3f000000 3f4f9def 3e1cf8eb 3f1a5913 -> 00000000 00000000 3f4f9def", + "3fc00000 00000000 00000000 3f400000 3f6e306a 3d00ce2d 3e38435c -> 00000000 00000000 3f82a450", + "bf000000 00000000 00000000 3f800000 bd0e4cd0 3e76adfa 3f8994fc -> 00000000 00000000 3f766b04", + "3e800000 00000000 3e800000 00000000 3f50c8f6 3e413edb 3e413edb -> 00000000 3ec8647b 00000000", + "3f400000 00000000 3e800000 3e800000 3e062b06 3e062b06 3f69fc68 -> 00000000 3f3f7d4e 3f3f7d4e", + "40000000 00000000 3e800000 3f000000 3f4d0ef5 3dcdac9e 3f4d0ef5 -> 00000000 3f0d0ef1 3f8d0ef5", + "00000000 00000000 3e800000 3f400000 3f9a0332 3f99ddd9 3e98b61c -> 00000000 3e800004 3f400000", + "3f000000 00000000 3e800000 3f800000 3f3afaad 3f3ae94c 3f3ae94c -> 00000000 3e5d7d56 3f5d7d56", + "3f800000 00000000 3f000000 00000000 3ef50bbc 3ef50bbc 3f1476d7 -> 00000000 3f1476d7 00000000", + "3fc00000 00000000 3f000000 3e800000 3f03a1fa 3f03a1fa 3f331708 -> 00000000 3f4ca28c 3ecca28c", + "bf000000 00000000 3f000000 3f000000 bd96cd74 3f540ed7 3f44295a -> 00000000 3eabf129 3eabf129", + "3e800000 00000000 3f000000 3f400000 3f382fe8 3e15024e 3f3de46b -> 00000000 3eff4c20 3f3f791b", + "3f400000 00000000 3f000000 3f800000 3f002b6b 3e69ffed 3f002b6b -> 00000000 3ea0208b 3f202090", + "40000000 00000000 3f400000 00000000 3dd7741f 3de5cbf4 3f2b5723 -> 00000000 3f16ae46 00000000", + "00000000 00000000 3f400000 3e800000 3f198552 3f8a6d36 3f198552 -> 00000000 3f400000 3e800004", + "3f000000 00000000 3f400000 3f000000 3f000000 00000000 3f800000 -> 00000000 3f600000 3f15555a", + "3f800000 00000000 3f400000 3f400000 3f3b8e0f 3f3b8e0f 3f930374 -> 00000000 3f930374 3f930374", + "3fc00000 00000000 3f400000 3f800000 3c8bcb13 3d07dd49 3d07dd49 -> 00000000 beace4e2 bee68682", + "bf000000 00000000 3f800000 00000000 3f70d384 3e854bc3 3f70d384 -> 00000000 3f83cb1f 00000000", + "3e800000 00000000 3f800000 3e800000 3f4b8bf6 3e560c7a 3f37f2f1 -> 00000000 3f72e2fe 3e72e2fe", + "3f400000 00000000 3f800000 3f000000 3eab3729 be598479 3f40e95e -> 00000000 3f50af06 3ed0af06", + "40000000 00000000 3f800000 3f400000 3f6d61b6 bde5667c 3edab4aa -> 00000000 3f5ac36c 3f241291", + "00000000 00000000 3f800000 3f800000 3f90e9c4 bd5ab9b6 3f90e9c4 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3f02cb84 bd9d10cc 3f02cb84 -> 3ec2cb84 00000000 00000000", + "3f800000 3e800000 00000000 3e800000 3f6912f5 3eab2cc8 3f3c81a8 -> 3f6912f5 00000000 3f6912f5", + "3fc00000 3e800000 00000000 3f000000 3ecee693 3ecee693 3f8f3ecc -> 3f36de32 00000000 3fb6de32", + "bf000000 3e800000 00000000 3f400000 be656b45 3c67c4d6 3eb00900 -> 3ea2a930 00000000 3f73fdc0", + "3e800000 3e800000 00000000 3f800000 3ecdf76b 3f959a28 3e61dc72 -> 3e85668a 00000000 3f85668a", + "3f400000 3e800000 3e800000 00000000 bcd40040 3f3ee894 3f969dd2 -> 3f71ecbb 3f71ecbb 00000000", + "40000000 3e800000 3e800000 3e800000 3f96dd13 3f96dd13 3ede7c83 -> 4006dd13 4006dd13 4006dd13", + "00000000 3e800000 3e800000 3f000000 3dbe1c34 3ea40ede 3f7a206d -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3ee7e1c9 3ee7e1c9 3f6be9b8 -> 3e8ea33d 3e8ea33d 3f55f4dc", + "3f800000 3e800000 3e800000 3f800000 3f9c7bcb 3f3cc76e ba42bc32 -> 3e9c7bcb 3e9c7bcb 3f9c7bcb", + "3fc00000 3e800000 3f000000 00000000 3f54ecac 3dce09cb 3dcfc64c -> 3eff6302 3f7f6302 00000000", + "bf000000 3e800000 3f000000 3e800000 bc8f8f0b 3f361def 3d0f41b2 -> 3e49e211 3ec9e211 3e49e211", + "3e800000 3e800000 3f000000 3f000000 3f1ffbbe 3e6cd8b2 3dfa2643 -> 3e87fef0 3f07fef0 3f07fef0", + "3f400000 3e800000 3f000000 3f400000 3e34ad40 3e34ad40 3f40c3bd -> 3e8061de 3f0061dd 3f4092ce", + "40000000 3e800000 3f000000 3f800000 bdb95874 3f0af9cd bbb4e02b -> 3caf9cd0 3d2f9cd3 3daf9cd0", + "00000000 3e800000 3f400000 00000000 3f400000 3f400000 3f400000 -> 3e7ffffc 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 bc982d51 3d8a2159 bc982d51 -> 3e0b82c7 3ed1442b 3e0b82c7", + "3f800000 3e800000 3f400000 3f000000 3e448b70 3f095d7f 3f40ad12 -> 3e807361 3f40ad12 3f007361", + "3fc00000 3e800000 3f400000 3f400000 3f67b3e6 3efc294c 3efc294c -> 3ea7b3e5 3f7b8dd8 3f7b8dd8", + "bf000000 3e800000 3f400000 3f800000 3f1d06c0 3ef10e9c 3f1d06c0 -> 3e98be50 3f651d76 3f98be50", + "3e800000 3e800000 3f800000 00000000 3f38c13a 3f5ceb18 3f39462e -> 3e773abe 3f773ac6 00000000", + "3f400000 3e800000 3f800000 3e800000 3f800000 3f000000 3f800000 -> 3e800000 3f800000 3e800000", + "40000000 3e800000 3f800000 3f000000 3f362030 3ebf56c0 3f5fde66 -> 3e3fbccc 3f3fbccc 3ebfbccf", + "00000000 3e800000 3f800000 3f400000 3f800000 3f800000 3f800000 -> 3e800000 3f800000 3f400004", + "3f000000 3e800000 3f800000 3f800000 3f6f1fa4 3f6f1fa4 3f5292fe -> 3e778fd2 3f778fd2 3f778fd2", + "3f800000 3f000000 00000000 00000000 3f4a4d3c 3ed3328d 3eea5ec9 -> 3f4a4d3c 00000000 00000000", + "3fc00000 3f000000 00000000 3e800000 3ec5b556 3ec5b556 3ef3e2bc -> 3eedd41a 00000000 3e6dd41a", + "bf000000 3f000000 00000000 3f000000 3f2c0ec8 3f2c0ec8 3ef4f3ea -> 3ed3f138 00000000 3ed3f138", + "3e800000 3f000000 00000000 3f400000 3f8e9049 3f3e1a7c bd8797b8 -> 3f0f8572 00000000 3f574824", + "3f400000 3f000000 00000000 3f800000 3f8c9b47 3f58af38 be59456f -> 3f097475 00000000 3f897475", + "40000000 3f000000 3e800000 00000000 3f800000 3f000000 3f000000 -> 3fc00000 3f400000 00000000", + "00000000 3f000000 3e800000 3e800000 bcf45383 bcf45383 bd516423 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 be6f4c55 be6f4c55 3e820686 -> 3ec10343 3e410343 3ec10343", + "3f800000 3f000000 3e800000 3f400000 3f3552a3 3f3552a3 3f225915 -> 3ef1c383 3e71c383 3f3552a3", + "3fc00000 3f000000 3e800000 3f800000 3ef830e7 3f0975ba 3eee0440 -> 3e1c6130 3d9c612e 3e9c612e", + "bf000000 3f000000 3f000000 00000000 3ec36798 3f1ddbca 3f4e832d -> 3eb17cd3 3eb17cd3 00000000", + "3e800000 3f000000 3f000000 3e800000 3ec0bf86 3f5a7858 3d253359 -> 3f169e16 3f169e16 3e969e16", + "3f400000 3f000000 3f000000 3f000000 be3009c7 3f721e9d 3f940d4b -> 3f7e13f0 3f7e13f0 3f7e13f0", + "40000000 3f000000 3f000000 3f400000 be446282 3f958544 3f444ff0 -> 3f875c5a 3f875c5a 3fcb0a88", + "00000000 3f000000 3f000000 3f800000 3f400000 3f800000 3e800000 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3e58fa39 3eadc6fd be5e478e -> 3eb9ed00 3f0b71bf 00000000", + "3f800000 3f000000 3f400000 3e800000 bd3983b7 3f3ce5e0 3f716933 -> 3f20f0cc 3f716933 3ea0f0cc", + "3fc00000 3f000000 3f400000 3f000000 3f92d357 3f516a31 3db2f0eb -> 3f65a6ac 3fac3d02 3f65a6ac", + "bf000000 3f000000 3f400000 3f400000 3f456a6a 3f436f2a 3f456a6a -> 3efc63b8 3f3d4acb 3f3d4acb", + "3e800000 3f000000 3f400000 3f800000 be7f12ba be63f9cb be7f12ba -> 3eb1c063 3f055049 3f31c063", + "3f400000 3f000000 3f800000 00000000 3dcccccd 3dcccccd 3dcccccd -> 3e266666 3ea66666 00000000", + "40000000 3f000000 3f800000 3e800000 3f8a0597 3f876114 3f8a0597 -> 3f140b2d 3f940b2e 3e940b2e", + "00000000 3f000000 3f800000 3f000000 3f8c7a58 3f570f5d 3f8c7a58 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3e8e4ce7 3f5acd4d 3e8e4ce7 -> 3eed66a6 3f6d66a6 3f320cfc", + "3f800000 3f000000 3f800000 3f800000 3f000000 3f400000 00000000 -> 3ec00000 3f400000 3f400000", + "3fc00000 3f400000 00000000 00000000 3f963d97 be509d95 3f8930da -> 3fb15c62 00000000 00000000", + "bf000000 3f400000 00000000 3e800000 be30940a be30940a 3f433c59 -> 3f3e61d4 00000000 3e7dd7cd", + "3e800000 3f400000 00000000 3f000000 3f1e77a0 3f1ab6e3 3ed90bac -> 3f379de8 00000000 3ef4d287", + "3f400000 3f400000 00000000 3f400000 3f51ef36 3ec04f0b 3e5c7d8e -> 3f4d7368 00000000 3f4d7368", + "40000000 3f400000 00000000 3f800000 00000000 3f800000 3f400000 -> 3f400000 00000000 3f800000", + "00000000 3f400000 3e800000 00000000 3f2bdfb6 bc7874ee 3f83e66b -> 3f400000 3e7fffff 00000000", + "3f000000 3f400000 3e800000 3e800000 3ebd92bf 3f0caf58 3f0caf58 -> 3f2657ac 3e5dca3a 3e5dca3a", + "3f800000 3f400000 3e800000 3f000000 3f5fb8ae 3f861879 3f5fb8ae -> 3f861879 3eb2cb4b 3f32cb4b", + "3fc00000 3f400000 3e800000 3f400000 3f5ea0f9 b9c2b91a 3f5ea0f9 -> 3f6df176 3e9ea0f9 3f6df176", + "bf000000 3f400000 3e800000 3f800000 bc960e53 3f0ad0d5 3f8b0734 -> 3f37ba9d 3e74f8cc 3f74f8cc", + "3e800000 3f400000 3f000000 00000000 3f957b41 3e478176 3f7afae3 -> 3f5abda0 3f11d3bf 00000000", + "3f400000 3f400000 3f000000 3e800000 3d9e2271 3f75a92b bcf58a52 -> 3f683ee0 3f1ad495 3e9ad495", + "40000000 3f400000 3f000000 3f000000 3f5be6f5 be394717 3f5be6f5 -> 3f77cdea 3f2533f1 3f2533f1", + "00000000 3f400000 3f000000 3f400000 3e9d918b 3f9b90ac 3f861d75 -> 3f400000 3effffff 3f400000", + "3f000000 3f400000 3f000000 3f800000 3e800000 3f800000 3e800000 -> 3f400000 3f000000 3f800000", + "3f800000 3f400000 3f400000 00000000 3f8516d1 3f77c6b6 3f77c6b6 -> 3f8516d1 3f8516d1 00000000", + "3fc00000 3f400000 3f400000 3e800000 3f22e307 3f693a07 be65e470 -> 3f7dd70a 3f7dd70a 3ea93a06", + "bf000000 3f400000 3f400000 3f000000 3f302274 3f5fc5b7 3f38e65d -> 3f301d24 3f301d24 3eead184", + "3e800000 3f400000 3f400000 3f400000 3f98e938 3f83b694 3f83b694 -> 3f5c749c 3f5c749c 3f5c749c", + "3f400000 3f400000 3f400000 3f800000 3f7df85a bd6d79eb 3ef75b44 -> 3f3edbb3 3f3edbb3 3f7e7a44", + "40000000 3f400000 3f800000 00000000 3ebe0515 3f67db78 bd5e725e -> 3f1bc934 3f4fb6f0 00000000", + "00000000 3f400000 3f800000 3e800000 3e800000 3f400000 3f000000 -> 3f400001 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f92ec99 bdc409a4 be29ec3c -> 3f4e3172 3f89764c 3f09764c", + "3f800000 3f400000 3f800000 3f400000 bd79d5b8 3e05e079 3f482993 -> 3f161f2e 3f482993 3f161f2e", + "3fc00000 3f400000 3f800000 3f800000 3f000000 3f400000 3f400000 -> 3ef00000 3f200000 3f200000", + "bf000000 3f800000 00000000 00000000 3f000000 3f800000 00000000 -> 3f800000 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 3f1c4cda be081fc8 be122629 -> 3f671336 00000000 3e671336", + "3f400000 3f800000 00000000 3f000000 3f729423 3ecda901 3f80eccc -> 3f80b199 00000000 3f00b199", + "40000000 3f800000 00000000 3f400000 3f61a8eb 3ed7b820 3e8c112a -> 3f4351d6 00000000 3f127d60", + "00000000 3f800000 00000000 3f800000 3efd8cb1 3e35bdb3 3f917636 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3ebda8a2 be4fa6a8 3e1fd211 -> 3f2f6a28 3e2f6a28 00000000", + "3f800000 3f800000 3e800000 3e800000 3f18c5ed 3f8082e2 3f18c5ed -> 3f8082e2 3e8082e2 3e8082e2", + "3fc00000 3f800000 3e800000 3f000000 3f8d088e 3f320a6d 3f320a6d -> 3f938cd5 3e938cd5 3f138cd7", + "bf000000 3f800000 3e800000 3f400000 3f029a8f 3f9439ad bdd3a2f6 -> 3f6bc653 3e6bc653 3f30d4bc", + "3e800000 3f800000 3e800000 3f800000 be3fdec0 be3fdec0 3d93c3cc -> 3f449e1e 3e449e1e 3f449e1e", + "3f400000 3f800000 3f000000 00000000 3ed8699b 3f661ee8 3ed8699b -> 3f6c972e 3eec972e 00000000", + "40000000 3f800000 3f000000 3e800000 3ced95ed bd8ca47c 3f8f158d -> 3f9e2b1a 3f1e2b1a 3e9e2b1a", + "00000000 3f800000 3f000000 3f000000 3f1e38f1 3f13c2dc 3f1e38f1 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 bd1525e1 bd1525e1 3f9ca89e -> 3f8e544f 3f0e544f 3f557e76", + "3f800000 3f800000 3f000000 3f800000 3f400000 3f800000 3f400000 -> 3f800000 3f000000 3f800000", + "3fc00000 3f800000 3f400000 00000000 3f46975d 3f46975d 3f407c12 -> 3f29e30c 3efed492 00000000", + "bf000000 3f800000 3f400000 3e800000 be1dec81 bd7a8b40 3edfe817 -> 3fa402fd 3f76047c 3ea402fd", + "3e800000 3f800000 3f400000 3f000000 3f000000 3f400000 3f800000 -> 3f800000 3f400000 3f000000", + "3f400000 3f800000 3f400000 3f400000 3c6cf7bc 3b96d8f8 3ce9c15a -> 3e8af510 3e506f98 3e506f98", + "40000000 3f800000 3f400000 3f800000 3f8b9163 3f3c0357 3f58b9a5 -> 3f9722c6 3f62b429 3f9722c6", + "00000000 3f800000 3f800000 00000000 bc1e20db 3f4e5db5 bc1e20db -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 00000000 3f000000 3e800000 -> 3f400000 3f400000 3e400000", + "3f800000 3f800000 3f800000 3f000000 be470c7f 3f4742d0 be4e83e0 -> 3f4742d0 3f4742d0 3ec742d0", + "3fc00000 3f800000 3f800000 3f400000 3f800000 3e800000 3f800000 -> 3f800000 3f800000 3f400000", + "bf000000 3f800000 3f800000 3f800000 3e053c16 3e053c16 be774523 -> 3fb7ac3f 3fb7ac3f 3fb7ac3f", + "3e800000 00000000 00000000 00000000 3f026395 3efdeb53 3f95b884 -> 3e95b884 3e95b884 3e95b884", + "3f400000 3e800000 3e800000 3e800000 3f000000 3e800000 3e800000 -> 3ee00000 3ee00000 3ee00000", + "40000000 3f000000 3f000000 3f000000 bde78d14 3f13acbc 3f09320b -> 3f275978 3f275978 3f275978", + "00000000 3f400000 3f400000 3f400000 3ef6a456 bd16bc29 bd16bc29 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f80ace2 3e07e5d0 3f80ace2 -> 3f805671 3f805671 3f805671", + "3f800000 3fa00000 3fa00000 3fa00000 00000000 00000000 00000000 -> 00000000 00000000 00000000", + "3fc00000 be800000 be800000 be800000 3e4b8937 3d36bcc6 3f8ddf06 -> 3fe4ce89 3fe4ce89 3fe4ce89", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3ef184eb 3f67ac90 3f6aa36e -> be9dd6a1 be9dd6a1 be9dd6a1", + "3e800000 3f666666 3f666666 3f666666 3d0cdd53 bd9f32f8 3f4019e0 -> 3f5cd344 3f5cd344 3f5cd344", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa be4f06b5 bd7d808c 3ea00f7a -> 3ea2b646 3ea2b646 3ea2b646", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab bdc953d6 3f0b82be bdc953d6 -> 3ed8b5a2 3ed8b5a2 3ed8b5a2", + "00000000 3ecd1290 3e4397cd 3ed5ed1a 3f334db2 bd96a377 3f463218 -> 3ecd128f 3e4397cd 3ed5ed1a", + "3f000000 3f012c4a 3f6f5dbd 3f21847f bd50d3d6 3f77ba47 3f77ba47 -> 3f036ddb 3f738c02 3f2456ae", + "3f800000 bdc3d68d 3f6331c5 bdfcc44c 3e800000 3f800000 3f400000 -> bddcab10 3f800000 be0e6848", + "3fc00000 3ecad513 3f3a284b 3ecad513 3f257dbf 3f804f78 be2f8e61 -> 3f1eff5e 3f91ed21 3f1eff5e", + "bf000000 3f7ae905 3f9794ef 3f7ae905 3f400000 00000000 3e800000 -> 3f9474ba 3fb35f66 3f9474ba", + "3e800000 3e190a0c 3e8334a5 3f294b53 3f000000 3f000000 00000000 -> 3e0fb4f9 3e7668d0 3f1ef87e", + "3f400000 3d79efb9 3f8f2836 3e596036 3e800000 3e800000 3f000000 -> 3d12496d 3f27941b 3dfe7564", + "40000000 3f9276c1 be6f2ac3 3f75a943 3f0ae19f 3f65e1db 3f5d1aa0 -> 3f26d634 be0837a6 3f0bea80", + "00000000 3f021030 3f89efb6 3f8ba8f1 3de55b8c 3f6e5b54 3f6e5b54 -> 3f021030 3f89efb6 3f8ba8f1", + "3f000000 3f0575e8 be7ba2d0 be7ba2d0 3f0f7890 3e4a6d2d bd124ece -> 3f0a773c be82895b be82895b", + "3f800000 bd411c41 3ee149b5 3c3f3dd6 3f3a840c 3f14e9b4 bd9c4228 -> bd9fe03e 3f3a840c 3c9e5466", + "3fc00000 bd163fbe 3eb80306 3eb80306 3eb9ffe0 3e9d64ce 3efba218 -> bd6911fd 3f0eb8d0 3f0eb8d0", + "bf000000 3ee4f153 3f8be010 3f8be010 3e6d13d0 3f0fb7b7 3f0fb7b7 -> 3f0e4d95 3fade22a 3fade22a", + "3e800000 bda4309b 3e4af824 bda4309b 00000000 3f000000 00000000 -> bde2afca 3e8c1d0e bde2afca", + "3f400000 3e813314 3f407cb7 3f407cb7 be2d8a40 3f1af422 3e012922 -> 3e5c9c14 3f245647 3f245647", + "40000000 3c030c50 3eca45a4 3f1f1a2f 3f635649 3f915383 3f2723c5 -> 3cade0b0 3f8630a6 3fd319ee", + "00000000 3f81d8ca 3f86be9e 3e1c2b2f 3f270c3c 3f270c3c 3ecd1897 -> 3f81d8ca 3f86be9e 3e1c2b31", + "3f000000 3f2d5e6c 3f5ed0c3 3f2d5e6c 3f8c50cc bca5ce7c bca5ce7c -> 3f43dc8f 3f7bb92e 3f43dc8f", + "3f800000 3f9ddd74 3f260199 3f260199 3eaaa83e 3e36bd7f 3f1705a6 -> 3f1705a6 3e9ecf73 3e9ecf73", + "3fc00000 3ef08474 3f7b9803 bcac2ed4 be7f944d be7f944d 3f9dd6cf -> 3f2634be 3faddc35 bcedf7ff", + "bf000000 3dc01672 3e0213a9 3dc01672 be7f82dd 3ed80229 3ed80229 -> bc76d419 bca72558 bc76d419", + "3e800000 3f8c8088 be33eb52 be470473 3f52b592 3e9bc370 3e9bc370 -> 3f83b718 be28aacb be3a922b", + "3f400000 be6b993f be771df6 3ebee015 3f9b4cbf 3f512434 bd3888bc -> bf1e7d90 bf263d38 3f806790", + "40000000 3f54f7cf 3f9d8a29 3f9d8a29 be5a77d4 be5a77d4 3d8836a2 -> bf3df362 bf8c8355 bf8c8355", + "00000000 3e77d984 bd716255 3f405dde 3f04a248 3f04a248 3f360196 -> 3e77d977 bd716251 3f405dde", + "3f000000 3df7c5d0 3df7c5d0 3f4ec960 3ea600c8 3ea600c8 3f65cdb5 -> 3e02c7f4 3e02c7f4 3f5a4b8a", + "3f800000 3f8c3884 3f8c3884 3f357c3e 3e8271c6 3f3098be 3f53d17e -> 3f53d17e 3f53d17e 3f091390", + "3fc00000 3eeb42e0 be775f08 3f6fa987 3f009f72 3edb7476 3f009f72 -> 3e0f8584 bd96e8be 3e9234cf", + "bf000000 3e4b35f9 bd7a8683 3e4b35f9 be2a5e5c 3e992ece 3e49eb8b -> 3e17a228 bd3af065 3e17a228", + "3e800000 3f5961c1 3f2e08bc 3e9f8f41 3f1814b7 3f7a8864 3f7a8864 -> 3f61ab6a 3f34ab51 3ea5a491", + "3f400000 bdd476d4 3daa40ba 3daa40ba 3f96c697 bda0f5dc 3f94f139 -> bf907033 3f677be8 3f677be8", + "40000000 3f5fb9f5 3f993be9 3e9c22dd be3c8e1d 3eb45b5e 3f35df25 -> 3e273f50 3e6519e0 3d6970a9", + "00000000 3f0065d4 3ed72e5c 3f36864c 3f5a9127 3f28f3b3 3f5a9127 -> 3f0065d4 3ed72e5b 3f36864c", + "3f000000 3f0998a2 3e530751 3efca4cf 3e800000 3f400000 3f800000 -> 3f44cc51 3e96e9a4 3f34ac45", + "3f800000 3e3aafbc 3f59308b 3f7ee8a8 3f169cbd 3e88ad2c bc8fad96 -> 3ddc9b42 3f005373 3f169cbd", + "3fc00000 3f8ba799 3f8ba799 3ef8c45e bca4fceb 3f221705 bca4fceb -> 3ecef5de 3ecef5de 3e385455", + "bf000000 3dc39f98 3eda4f1b 3e544d59 be7d9946 3ee19a2b 3f0717af -> 3dac617a 3ec05ef9 3e3b13ee", + "3e800000 3f2b1ffc 3f660f82 3f139d27 3e800000 3f400000 3f400000 -> 3f240c1e 3f5c8ba2 3f0d8239", + "3f400000 3e2ad549 3e2ad549 3f70ba01 3f94b36f 3f0f398f 3f94b36f -> 3e48ff81 3e48ff81 3f8d9dd3", + "40000000 3f7fc8aa 3e2607ca bd486cb8 3f400000 3f000000 00000000 -> 3f003756 3da67386 bcc8eed8", + "00000000 3f3e8957 3f95fc73 3ea20cab 3ebee5b2 3f5b89d4 3ea38e61 -> 3f3e8958 3f95fc73 3ea20cab", + "3f000000 3ee81cf1 3f12a45f 3ee81cf1 3eb9d7c6 3f89bc12 3f89bc12 -> 3f270904 3f530e42 3f270904", + "3f800000 3f3a89d7 3dc3d825 3dc3d825 3f7463ed 3f300c65 3f7463ed -> 3f7463ed 3e004a8c 3e004a8c", + "3fc00000 3f93fe40 3e8dd93a bc29fec0 3f9f9279 3f6c6d00 3c485089 -> 3fa55c96 3e9e7ef1 bc3df2aa", + "bf000000 3ee1fde3 3f98eb28 3de2b629 3cc9f992 3f93df31 3cc9f992 -> 3ee5b887 3f9b7124 3de673ea", + "3e800000 3e941949 3f3e78bc 3f83ef37 be39557d 3f1b695c 3e03695a -> 3e84e16e 3f2ae63c 3f6cc129", + "3f400000 3f145aa4 3ebea555 3f145aa4 3f400000 3e800000 3e800000 -> 3f3516a9 3ee8b645 3f3516a9", + "40000000 3ebfff64 3f617370 3e9a0ffa 3f66add7 3ed71686 3f7df591 -> 3ef08dcc 3f8d3bd9 3ec1065e", + "00000000 3c088c65 3e8b774a 3f7c7cdb 3e798451 3e2527bd 3f510dfd -> 3c088c7b 3e8b7746 3f7c7cdb", + "3f000000 3ed7dc40 3f4d48b5 3f4d48b5 3f2db1dc 3d7e913e be3047e8 -> 3ec74082 3f3d7d48 3f3d7d48", + "3f800000 3f9c914d 3f9aaba3 3eddcc6b 3f000000 00000000 3e800000 -> 3f000000 3efce5e7 3e35542c", + "3fc00000 3f8f4c08 3e0aa508 bd213220 3f00ffe9 3f00ffe9 3f90fdbe -> 3f91d699 3e0d1a7a bd240e01", + "bf000000 3e32dd9f 3ed39df8 3e32dd9f 3f808305 3f808305 bdaaab50 -> 3d4c370f 3df19ba8 3d4c370f", + "3e800000 3f6730db 3f982327 3f982327 3eb3cae0 3eaca29c 3f4a9110 -> 3f53df04 3f8b6c7f 3f8b6c7f", + "3f400000 3f8db64c 3f9d33cb 3e9a326d 3f7a8f96 3f7a8f96 3e8cfb35 -> 3f704277 3f8542cb 3e82b698", + "40000000 3f37dd7c 3e642748 3e642748 3f9a8d5d 3c886929 3e283d2b -> 3fd92bfc 3f06bdcb 3f06bdcb", + "00000000 3f8bb340 3ea4e0ea be230575 3e800000 00000000 3f000000 -> 3f8bb340 3ea4e0ed be230575", + "3f000000 3f32b1e1 3e9346db be716f52 3f400000 3f800000 3f800000 -> 3f5958f0 3eb3222b be92d446", + "3f800000 3e626406 3f6b2eaf 3f6b2eaf 3f800000 3f000000 3e800000 -> 3e766e1c 3f800000 3f800000", + "3fc00000 3f2e7466 3f2e7466 3d21a3f4 3f99dcfa 3f86c1f6 bdd4d4e6 -> 3fbb2e5e 3fbb2e5e 3dad6e93", + "bf000000 3e82ba60 3e82ba60 3eb8f968 3f8a3fc1 3f80361f 3f8a3fc1 -> 3aae4845 3aae4845 3af69a00", + "3e800000 3f249d9d bdbf6153 be035f73 3f03bbc1 3ecc4f81 3e660fac -> 3f1c6526 bdb5d2ad bdf99ff0", + "3f400000 3f2e97e3 3f2e97e3 3f8f83b2 bde8bbc1 bde8bbc1 3f20a21a -> 3ee9dc70 3ee9dc70 3f403b6c", + "40000000 3f8bc6d1 3f966a25 3f8bc6d1 3f6b4d2e 3e7e6af6 be04d22e -> 3f1dc43d 3f29c612 3f1dc43d", + "00000000 3dab999a 3e770ada 3e770ada 00000000 3f000000 3f800000 -> 3dab9999 3e770ada 3e770ada", + "3f000000 3f97ac6a 3ec2ebb7 3d2a5ce0 3f4f486c bdfce468 bdfce468 -> 3f7f50a0 3ea40e95 3d0f6332", + "3f800000 3f523ddb 3f523ddb 3d426f46 be55b213 3f47432c 3f5fb898 -> 3f5fb898 3f5fb898 3d4ee690", + "3fc00000 3f9aff83 3f9aff83 3f0e04bb 3ef7ec63 bdca3b65 bdca3b65 -> 3df78e38 3df78e38 3d62d33b", + "bf000000 3e0b785b 3f2acdfb 3e5eddf4 3f400000 3f400000 3f800000 -> 3dd15fc9 3f0034f8 3e274903", + "3e800000 3f9c6cc2 3f30832b 3f4ffecc bdc982db 3e6a6eed bdc982db -> 3f794a12 3f0ca6af 3f25bce2", + "3f400000 3f575eae 3f7dfa79 3dfe03d8 3e800000 00000000 00000000 -> 3ebd176b 3edefd3c 3d5f0574", + "40000000 3ef8a40f 3ef8a40f 3f8b1cc2 3f5c8d0b 3f8fbc22 3f003151 -> 3f04951f 3f04951f 3f945b82", + "00000000 3f12cc9a 3e025e94 3f5251fd be492b98 3e4c8398 3f045026 -> 3f12cc9f 3e025e95 3f5251fd", + "3f000000 3e3d69a9 3e3d69a9 3e880e3f 3ead6056 3e366a2a 3eed7931 -> 3e82010b 3e82010b 3ebac3b8", + "3f800000 3eb8aa83 3f5a128a 3f5a128a 3f187628 3f6799b1 3f187628 -> 3ec41f25 3f6799b1 3f6799b1", + "3fc00000 3eb374fa be6bbbac 3e446f95 3e81d1d7 3ddc937f 3ddc937f -> 3e52008a be09edb1 3de5defc", + "bf000000 3e333eba 3eaa203a 3ea279cb 3f92361b 3dbdaa33 3dbdaa33 -> bd1ceb35 bd94ef7c bd8e3cfe", + "3e800000 be1056c9 3e4bfdb3 be1056c9 3e43df53 3e43df53 3f6d5145 -> be8a164e 3ec327c6 be8a164e", + "3f400000 3f3fa5ff 3f3fa5ff 3df53ff9 be03483d 3bb80bc0 3bb80bc0 -> 3e43f646 3e43f646 3cfac51a", + "40000000 3b891834 3f926516 3b891834 3ef4cc9e 3ef4cc9e bcddb85c -> ba33c3d7 be3ff638 ba33c3d7", + "00000000 be12531d bc96176c be12531d bde293d4 bd3323c4 3f6991b1 -> be12531d bc96176c be12531d", + "3f000000 be53e016 be53e016 3e89c388 3f8e40a0 3f1b9312 3f1b9312 -> bf07dfb0 bf07dfb0 3f30b182", + "3f800000 3f008915 3d36a7e3 3d36a7e3 3daab7c1 3ef60889 3ec6db62 -> 3ef60889 3d2ed02e 3d2ed02e", + "3fc00000 3e698e39 3e698e39 3d27af1c 3f800000 3e800000 00000000 -> 3fb1671c 3fb1671c 3e7ebca6", + "bf000000 3f8e9dae 3f8b47e5 3f8ef818 3e59c11c 3e59c11c bdb26037 -> 3fc8590e 3fc3a9a7 3fc8d812", + "3e800000 3ef46870 3e3ddb51 3f971d26 bc219052 bd8fd981 bc219052 -> 3eb6cbac 3e0dfefd 3f620a29", + "3f400000 3f43e233 bdd89966 3f43e233 3f2ebefc be502b0e 3ece65d1 -> 3f3407ca bdc711cc 3f3407ca", + "40000000 bdd81c13 bdd81c13 3f0a7347 3ebf514a 3f6e99f1 3ebf514a -> be8430f5 be8430f5 3fa9604e", + "00000000 3f13f86a 3f13f86a 3d2360b7 bd96ea99 3f9472b6 3f9472b6 -> 3f13f86a 3f13f86a 3d2360ad", + "3f000000 3f74cb43 3f261505 3f261505 be7a4a21 3f9c5b4f be7a4a21 -> 3f8b6078 3f3d1f4e 3f3d1f4e", + "3f800000 3f965f8a 3f965f8a 3ec47184 00000000 3f400000 3f000000 -> 3f400000 3f400000 3e7ad2d4", + "3fc00000 3f636bdd 3f064661 3f1bac30 3f31bfe7 3f31bfe7 3f25a6f8 -> 3f18e9ec 3eb4915a 3ed157b3", + "bf000000 be216e6a 3f40e0da 3f40e0da 3f954a01 3f954a01 3da86523 -> bdea6565 3f0c0747 3f0c0747", + "3e800000 3eebd950 3f6d9b82 3f6d9b82 3edff569 3edff569 3f2b553a -> 3edb6722 3f5d09f0 3f5d09f0", + "3f400000 3f129c12 bcf6e1ec 3f129c12 be4b5a43 3e935733 3f8eb734 -> 3f7ab9d2 bd531ab0 3f7ab9d2", + "40000000 3f803367 3f812c21 be3261ca 3da8fd86 bdc2a5f4 3f9db4de -> 3fb8d6fd 3fba3d9b be809872", + "00000000 3f5b4b1a 3f8a7807 3f2c02c4 3a08638f 3a08638f 3f9414f0 -> 3f5b4b19 3f8a7807 3f2c02c4", + "3f000000 3e99ca49 3f63198a 3f16fe91 be156214 3e1186d0 3d20183e -> 3e326d73 3f03bd9f 3eaf2f14", + "3f800000 3f000eb8 3f000eb8 3f9fcdbc bcca1d7f bdab9f0a 3f2bc917 -> 3e89a8b9 3e89a8b9 3f2bc917", + "3fc00000 3d161169 3f762655 3e85be00 3eb448f4 3ebada31 3d8464a3 -> 3b2674bb 3d8883d4 3c9458df", + "bf000000 be78168b be031f14 3e3a6932 bb908bae 3f66498a bb908bae -> 3e70d4c5 3dfe9265 be34f548", + "3e800000 be3545a5 3da2b5bd be3545a5 3d66a140 3f173316 3f834ede -> bf3446c0 3ea1d0f2 bf3446c0", + "3f400000 3e109fb6 bbf21e4a 3ec7f116 be4e2bf9 3f1f5c01 3f1f5c01 -> 3e510f5b bc2eff16 3f108324", + "40000000 3eb021f3 3f4a07af 3eb021f3 3f1dab40 3e5c6e2b 3f6c9760 -> 3eec6508 3f879388 3eec6508", + "00000000 3dffaa7b 3eb9a289 3e763610 3f9c06f2 3f9c06f2 3df0bf47 -> 3dffaa7d 3eb9a289 3e763612", + "3f000000 3f1d71d7 3f8756ce 3f1d71d7 3e80a9be bd98957b 3f5e99d6 -> 3f0f7653 3f76a3b9 3f0f7653", + "3f800000 bdc0462d 3ee85353 3d8b820f 3f64285f 3f8bdb98 3e4492d9 -> be677e96 3f8bdb98 3e27f715", + "3fc00000 ba4cb3f9 3ed482f7 3ed482f7 3f9be88f 3f9be88f 3d21a05d -> bb47ae90 3fcf4c77 3fcf4c77", + "bf000000 3f851b2b 3f97d49f 3f4bac58 3f5a4857 3f6c856a 3f6b4891 -> 3f93d234 3fa89d94 3f623080", + "3e800000 3e902675 3eb748c6 3e5add84 3f9afe04 3f3cf047 3f3cf047 -> 3ee602fa 3f123a4c 3eae9d6c", + "3f400000 3f7d064b 3e72262e 3d6a2592 3e87c271 3f9369f0 bce24d5e -> 3f8e303d 3e8813b0 3d839476", + "40000000 be6f88e1 3ece7c12 3f1ff49b 00000000 3e800000 3f000000 -> be0fd3d2 3e77f72c 3ec016ca", + "00000000 3f746b00 3f746b00 3e15c3f6 3d9fcb4b 3d9fcb4b 3f8be91b -> 3f746b00 3f746b00 3e15c3f7", + "3f000000 3f18b6ba 3f18b6ba 3f15a009 be58df19 3f17ad20 3f17ad20 -> 3f1831ed 3f1831ed 3f151dec", + "3f800000 3f0ebaa3 3f0ebaa3 3f6392ec 3f25b700 3f25b700 be2450fc -> 3ecfdd6e 3ecfdd6e 3f25b700", + "3fc00000 3d0ef3ce 3f4fcb3f 3f837508 3f2570d2 3f2570d2 3f747303 -> 3cffc8fc 3f39e736 3f6b377c", + "bf000000 3eac4f36 3ee94253 3f439957 be4fb4f3 3e3c57f3 be4fb4f3 -> 3eedb972 3f20e807 3f86ed82", + "3e800000 3f8a9303 3f0b4731 bdbd4126 bd66a5ed 3ea56d66 3ea56d66 -> 3f648a31 3ee5b359 bd9c0fac", + "3f400000 3c0326e0 3edaaf74 3f923de1 3f5fa4e2 3f9ab5c8 3f9ab5c8 -> 3c08d934 3ee42ecb 3f9897ce", + "40000000 be2031b5 be2031b5 3f8229bf be6ba00f bd36bc1d be6ba00f -> 3e2e400d 3e2e400d bf8d9581", + "00000000 3ee70800 3d840d80 3f043b4b 00000000 3f400000 3f800000 -> 3ee70805 3d840d80 3f043b4b", + "3f000000 3f99f7c5 3f81ef77 3f38df73 3eb53695 3ecb11d8 3f715d61 -> 3f89533b 3f67c7e2 3f24e3b7", + "3f800000 3f8859e1 be5a28be bde6ea82 3f2e3da1 3ef885e0 3ef885e0 -> 3f2e3da1 be0b6416 bd938aae", + "3fc00000 3f19c9ab 3f80ffac 3f19c9ab 3f8ddc66 3ef530f6 3f10e33f -> 3f30c9e2 3f944ac3 3f30c9e2", + "bf000000 3ee30b86 3f5ea4b5 3ee30b86 3f4d7008 bda1d571 bda1d571 -> 3eebd168 3f673f0c 3eebd168", + "3e800000 3f4bb04b 3f4c10a9 3e7e363b 3f5954bb 3f5954bb 3f6c48ad -> 3f53ba7d 3f541eaa 3e841f7b", + "3f400000 3b8a3577 3f1d56bb 3f9793e1 3ee27312 3f7a6fd3 3f94225c -> 3b87da20 3f1aa870 3f94febd", + "40000000 be017b19 be3432f7 3e4fc516 3f9bc8e7 3ed89e5b 3e75b5bd -> bfb1fbb0 bff7b325 400ecc96", + "00000000 3ecd7e7f 3e5856f2 3f54aec3 3f20075c 3f1ed42d 3e77e1b3 -> 3ecd7e80 3e5856f2 3f54aec3", + "3f000000 3ca4c00e 3e87091f 3e6071f8 3f008aca 3f911fde 3f911fde -> 3d5a3f25 3f32e226 3f14a9a5", + "3f800000 3f847528 3e313631 3b86442a 3e0650cf bd950bcc 3e0650cf -> 3e0650cf 3cb3b28e 3a082664", + "3fc00000 3f0071d3 be7740e0 3e8ef78d 3d586033 be515e36 bd81db5a -> be2fbf93 3da927f4 bdc39e79", + "bf000000 3f6c7755 3f082cbe 3f082cbe 3ef2a47b 3f84b9cb 3f84b9cb -> 3f5df935 3effa85b 3effa85b", + "3e800000 3f807eb8 3f807eb8 3e5d548d 3f9acfa3 3f6e5d63 3f6e5d63 -> 3f8712f3 3f8712f3 3e68a99c", + "3f400000 3f52e380 3f3d943a 3f4867db 3f8e10fd 3e977f10 3f8e10fd -> 3f84e92e 3f6ef613 3f7c9bac", + "40000000 3f936e3f 3dd0bc63 3f6ca6c0 3f724778 3f637c67 3f4f77cb -> 3f3db272 3d8649f0 3f183f83", + "00000000 3f4fe781 3d7ae789 3f04ffe4 3f357dd3 3f3f491e 3ef6a516 -> 3f4fe781 3d7ae792 3f04ffe6", + "3f000000 bc90b476 3de1872d 3f922502 00000000 3f400000 00000000 -> bc6fc272 3dbad659 3f722502", + "3f800000 3dd9d3d8 3f8a8737 3ed5619a 3f459dd2 3f330338 3f459dd2 -> 3d9b5ec8 3f459dd2 3e9832e3", + "3fc00000 3f6c88c2 3f2cfd5d 3eb49679 3f9b7c0f 3f03aa48 3f03aa48 -> 3fae17e6 3f7ea59f 3f04ea71", + "bf000000 3ea673a5 3ce2e956 bd1f95f3 3e58b70f 3f35c2a0 3f98d394 -> bddfe6c0 bc189d34 3c56aa65", + "3e800000 3e898ae4 3f88d9ee 3e898ae4 3f400000 3e800000 00000000 -> 3e7e8e68 3f7d46e5 3e7e8e68", + "3f400000 3dfe02de 3f9de29c 3f27597c 3f75e9a9 3f8e8c95 3f12ff73 -> 3deb81a3 3f926217 3f1b2874", + "40000000 3f0f8e54 3e81ed24 3f0f8e54 3dd9da44 3f3175a8 bd331783 -> 3f535cfc 3ebf4bb6 3f535cfc", + "00000000 3f27de1a 3f3a71e6 3ec73615 3f15382a 3ea5964b be54e59c -> 3f27de1a 3f3a71e6 3ec73614", + "3f000000 3f8b04c9 bd8893fc 3f8b04c9 bdb1ba63 3f98e49a 3eaec79e -> 3f91f4b2 bd8f64c0 3f91f4b2", + "3f800000 be75df13 3e8845b3 be75df13 3f01a8a2 3f59c227 3f65e729 -> bf4f672d 3f65e729 bf4f672d", + "3fc00000 3ee62095 3e44f4fb 3f5edd5f 3f87cef6 3f80cf57 3f875ba6 -> 3f18d1ba 3e82cac4 3f93ff19", + "bf000000 3f1f716d 3f1f716d 3f8f51d7 3da70641 bde58664 3da70641 -> 3f695b9f 3f695b9f 3fd1c290", + "3e800000 3f947075 3f25ac32 3edb3305 3f92fdd8 be212208 3f6736e1 -> 3f9413ce 3f2544c9 3edaaa32", + "3f400000 3e443fe1 3f6ade03 3f6ade03 3e800000 00000000 3f800000 -> 3e517e37 3f7ab781 3f7ab781", + "40000000 3f1ba18e 3f3da9a9 3f1ba18e 3f831ff8 3f5af68b 3f7a975b -> 3f8960cb 3fa76b1c 3f8960cb", + "00000000 3f4667fd 3f73d569 3f73d569 3ef7b9f9 3f7cf156 3f7cf156 -> 3f4667fd 3f73d569 3f73d569", + "3f000000 3d86f90d 3e52a747 3f548319 3f000000 3e800000 3f800000 -> 3d94c87c 3e683513 3f6a418c", + "3f800000 3f594a08 3f594a08 3f50f18d 3e0832bf 3e0832bf 3f6fb7c9 -> 3f6fb7c9 3f6fb7c9 3f6682c7", + "3fc00000 be1dba32 be131032 be1dba32 3f0c1f58 3f313f1a 3d391821 -> 3f986eb2 3f8e2057 3f986eb2", + "bf000000 3f0fcec4 3f90884b 3eeb9b98 3f2890e4 3ec8159e 3f1c8b59 -> 3f2dc805 3faea837 3f0e5b8b", + "3e800000 3e0d5ad6 3e22e26c bd3297ad 3f6bbd27 3f6bbd27 3f7792ce -> 3ea06eda 3eb8de50 bdcab24c", + "3f400000 3f3820ae 3f7ba693 3bf62701 3f287a74 3ee1ef2a 3f3c2d12 -> 3f154b9c 3f4c0b73 3bc79613", + "40000000 3f1d737f 3f1d737f 3e1886c2 3e800000 3e800000 3e800000 -> bdeb9bf8 bdeb9bf8 bce43d6a", + "00000000 bdfa70cf 3e9b5f6b bdfa70cf 3f666666 3f666666 3f666666 -> bdfa70d0 3e9b5f6b bdfa70d0", + "3f000000 bd1ac5cd 3ec2effb 3ec2effb 3e2bf0ca be6f6b72 3f543548 -> bd75df08 3f1ad6a3 3f1ad6a3", + "3f800000 3f9d9f01 3f111ed2 bc9c805b 3f50863a 3f81781f 3f81781f -> 3f81781f 3eee6703 bc808cb3", + "3fc00000 3de62ba3 3f94ed99 3f6d8c73 3f8e4a9d be655389 3ef74c2c -> 3dd6c8ea 3f8af920 3f5dab7e", + "bf000000 3f6d2d4d 3f6d2d4d 3f044294 3e800000 3e800000 3e800000 -> 3fa1e1fa 3fa1e1fa 3f348ba8", + "3e800000 3ef5770a 3dc90551 3f3f713b 3f1c217f bc44c73b 3f99fc9f -> 3f0d68ce 3de79c77 3f5c933c", + "3f400000 3de576ee 3f074854 3f5a6456 be7fbbe0 be7fbbe0 3f4939ac -> 3dd7efd1 3efe9d3b 3f4d8456", + "40000000 3f115151 3f11d54d 3f115151 3f9915f3 3f2fa9d2 3e845465 -> 3fe86e26 3fe94140 3fe86e26", + "00000000 3f5ecbcf 3f5ecbcf 3f725a3c 3f07a65e 3f092f18 3f092f18 -> 3f5ecbcf 3f5ecbcf 3f725a3c", + "3f000000 3f7a69ce 3f9b274b 3f9b274b 3f842318 3f842318 bdcfb50a -> 3f67d6e3 3f8fa532 3f8fa532", + "3f800000 3f10961b 3e87e4ba 3f10961b 3e800000 00000000 3f400000 -> 3f400000 3eb474dc 3f400000", + "3fc00000 3e961cf0 3e87e2de 3f027ea0 3f69e26f 3f3f3317 3f3f3317 -> 3f2441ae 3f14b075 3f8eca2b", + "bf000000 3f783868 3f783868 3e09e6fb 3f778ba3 bde2e321 3f784350 -> 3f7832f4 3f7832f4 3e09e3f3", + "3e800000 3c0e0652 3f750dc1 3f93d1db 3f24807c be540420 3e2e7b73 -> 3bfc8d1d 3f59e100 3f836d74", + "3f400000 3ef6a02b 3f9bd587 3ea9b58a 3f77ad3c 3ed1635a 3f77ad3c -> 3ed0a5df 3f83d658 3e8f9361", + "40000000 3e8aaf0f 3e8aaf0f 3e4d8199 00000000 3f800000 3e800000 -> 3fdd543c 3fdd543c 3fa3fc7f", + "00000000 3f6d8b8b bd986721 3f4513a6 3f409a6f 3eb7857e 3f409a6f -> 3f6d8b8b bd986728 3f4513a0", + "3f000000 be095151 3dc121de be095151 3fa00000 3fa00000 3fa00000 -> bf74af89 3f2c121e bf74af89", + "3f800000 3eb38ae1 3f9e9f28 3f3fd550 3f75d399 3f75d399 3f36a7ed -> 3e8b1fdb 3f75d399 3f14a5f8", + "3fc00000 3f0b2a4f 3f274ff7 3f65b402 be0ed0c4 be0ed0c4 3e667ef4 -> bd89b972 bda5947f bde3532c", + "bf000000 3f570867 3f609d4b 3f01131c be800000 be800000 be800000 -> 3fb09793 3fb875f8 3f540031", + "3e800000 3f93c3c7 3f4ee06c 3f4ccaa1 3f3df217 3e280417 3f3f66cb -> 3f86bfae 3f3ca75a 3f3ac093", + "3f400000 3edaa963 3f9a5158 3f22cc1e be035d55 3f95a9b8 3f95a9b8 -> 3ed5b707 3f96d3a0 3f1f1d4c", + "40000000 3f5b1401 3f62fb43 be2bfeb2 3f000000 3f000000 3f000000 -> 3de01099 3de825e8 bcafe8ee", + "00000000 3f3bf414 3f72979c 3f3bf414 3edd5878 3f7cfc6f 3e8bef31 -> 3f3bf414 3f72979c 3f3bf414", + "3f000000 be438296 3f8362b2 3f9fa025 3ebf4aeb 3ebf4aeb bd6920f1 -> bdfe158f 3f2abf84 3f4f72e0", + "3f800000 3e41a342 3e41a342 3dfc542b bdfaa6d7 3e9b6a30 bdfaa6d7 -> 3e9b6a30 3e9b6a30 3e4a8545", + "3fc00000 3f0fb028 3d63973a 3e9a8838 3f75cd92 3ee603b5 3ee603b5 -> 3f946e24 3deb1a1b 3f1fa1d5", + "bf000000 3f33c5d0 3f478237 3f33c5d0 3dcd378e bd90c6a4 3e9aa1ad -> 3f6ad347 3f824d73 3f6ad347", + "3e800000 3f14f8b1 3f14f8b1 3d973bdf 3f534d07 3ec7b2a8 3f440373 -> 3f248dc7 3f248dc7 3da70d8d", + "3f400000 3e8b6e02 3e8b6e02 3ee764d8 3f9bf133 3e83c1b4 3e83c1b4 -> 3f1e6063 3f1e6063 3f836b34", + "40000000 3ed16db5 3ed08ea1 3ed08ea1 3d46e7b0 3f1d63f0 3f1d63f0 -> 3f521106 3f513144 3f513144", + "00000000 3ec31da3 3f95d49e 3ee0f70a 3f893a14 3f893a14 3e980c6d -> 3ec31da5 3f95d49e 3ee0f708", + "3f000000 3e6790fb 3d6fa917 3f2d3e83 be1adf2a 3d8a237e 3d8a237e -> 3dfea597 3d03c613 3ebe82f3", + "3f800000 3f7e8294 3f9f9f8b 3f8da30d 3f942fd7 3f942fd7 3f8fe6f3 -> 3f6c4686 3f942fd7 3f837d3d", + "3fc00000 3f8a2f42 3f8ef92e 3f95db2e 3f3ef7e8 3dd8dd53 3f6adb5d -> 3f3aa9b7 3f4121b8 3f4a6dde", + "bf000000 3f95081e 3df214d3 3f95081e 3f698888 3f4f50a2 3f698888 -> 3fa52a0b 3e0624a7 3fa52a0b", + "3e800000 3cb12f26 3f80761a 3f8af1fb 3f1649f3 3f84e581 3f1649f3 -> 3caf4195 3f7e2065 3f896edc", + "3f400000 3f3e2226 3dd4958f 3f90c3e4 3dfcc335 3f97b08d 3f9b3380 -> 3f4869d0 3de013f8 3f989799", + "40000000 3f6b219a 3e956bd5 3e956bd5 3f6242e2 3e7963b3 3f886a91 -> 3f9b4455 3ec55689 3ec55689", + "00000000 3f637007 be304a18 3f1a9654 3e371dd9 3d5d56b9 3e9cbda8 -> 3f637007 be304a11 3f1a965c", + "3f000000 bde58c63 3f82b6dc be42850f 3f000000 3f400000 3e800000 -> bdc7114a 3f62b6dc be28b0ac", + "3f800000 3aca93d0 3f8f878e 3eb3511f bdec01ba 3e3655e2 3ed3e1e0 -> 3a1585de 3ed3e1e0 3e045b39", + "3fc00000 3f9f263b be7cacc8 3f819f92 3ed72403 3f2f81dc 3ed72403 -> 3ed0391e bda54b2c 3ea997bd", + "bf000000 3f0ce58e 3f0ce58e 3f0d318b 3f8fcf80 3e0ff0fd bd787a62 -> 3e87ac74 3e87ac74 3e87f5a0", + "3e800000 3eadc9c9 3da41829 3f84dfa5 3f000000 3e800000 00000000 -> 3e974493 3d8ed486 3f674f78", + "3f400000 3f0b0bf1 3d9be3c5 3de31eec 3f8936f6 3f8936f6 3f9165f4 -> 3f7cdbea 3e0dbe86 3e4e82f0", + "40000000 3f8c2626 3e95f674 3e95f674 3f968766 3f968766 3ec679e9 -> 3fa0e8a6 3eac2d18 3eac2d18", + "00000000 3f3a491d 3eff866b 3d5db690 3e957e7a 3f82308d 3d3284e3 -> 3f3a491d 3eff866c 3d5db693", + "3f000000 3ebdc706 3d3cf061 3ed4e0e4 3f9a1638 3f40ae41 3f9a1638 -> 3f38cf5c 3db7fe56 3f4f4e71", + "3f800000 3f0d781b be2f6df1 be2f6df1 3f115c46 3f33ca21 3f5d8d0b -> 3f5d8d0b be895e1a be895e1a", + "3fc00000 3dca0dd0 3dca0dd0 bd8a82e8 3e174f5b 3f88cc6c 3e174f5b -> 3fc6e234 3fc6e234 bf88568a", + "bf000000 3cc0ac7d 3cc0ac7d 3f942055 3f5082b2 3c89f75c 3f058e61 -> 3cdd34c3 3cdd34c3 3faa0fd4", + "3e800000 bd4eb82b 3e217a3b 3e2ca142 3f800000 3f800000 3f800000 -> bde6cbd1 3eb448ed 3ec0bc79", + "3f400000 3f74c41e 3f2a0fd4 3f2b1a13 3d4b746c 3e0da4e1 3f7d9dec -> 3f7b6778 3f2eac87 3f2fbdfe", + "40000000 3e885830 3e62c9b5 3e885830 3d72a85a 3d72a85a 3ed4ccad -> 3f10a095 3ef090a8 3f10a095", + "00000000 bde4c5d7 3f52686f 3f52686f 3f9b39c4 3f3e83eb 3f9b39c4 -> bde4c5d7 3f52686f 3f52686f", + "3f000000 3f4b02d7 3d8e78ec 3d8e78ec 3dc13258 3f917436 3f329d30 -> 3f76f5a2 3dad50aa 3dad50aa", + "3f800000 3d6f587d be564aa3 bd3b6ab7 3f400000 00000000 3f400000 -> 3f400000 c02be6e4 bf1657ee", + "3fc00000 be38cf12 3f572e40 3de990d3 3e37138b 3e37138b 3dc239ab -> 3d05c38a be1bbf30 bca90dd3", + "bf000000 3e32ada9 be42a038 3e32ada9 3f400000 00000000 00000000 -> bde7f704 3dfcab19 bde7f704", + "3e800000 3ee9b794 3ec17cc7 3ec17cc7 3eb69d71 3e9488bb 3f5eee28 -> 3f0f6062 3eed64ed 3eed64ed", + "3f400000 3f9287c8 3f2658b1 3eb7164e 3f000000 3e800000 3f000000 -> 3f2943e4 3ec027e2 3e537e6d", + "40000000 3f4b5c7d 3f4b5c7d 3ebe517b 3f4123df 3f9436b2 3f460912 -> 3fc2bf26 3fc2bf26 3f364195", + "00000000 3f7b6b41 be20c49c bd1ffadd bd52ada9 bd9095dd bd52ada9 -> 3f7b6b41 be20c499 bd1ffae6", + "3f000000 bd5a2502 3edf8695 be0fc33a 3f5dd277 3f8b88b5 3f318bdb -> bdbeb616 3f436a5a be7b5dd0", + "3f800000 3e0a2cad 3f92e745 bdd1069c 3f4bbbe3 3f727746 be31b6b3 -> 3de40f05 3f727746 bdac7ffe", + "3fc00000 bc022623 3e805353 bc022623 be428ec4 3ebb9b01 3ebb9b01 -> bc5c551e 3ed93ed8 bc5c551e", + "bf000000 3e9171c1 be4a5eb2 be6378f1 3f69b0aa 3f8f27ad 3f69b0aa -> be084970 3dbda0d6 3dd5267a", + "3e800000 bd835929 bda351fd bd835929 3f1ea295 3f86e170 3f6b4a8c -> 3e5c8170 3e891701 3e5c8170", + "3f400000 3ecb2fac 3f0edd67 3f7097f1 3f763779 3d3fb839 3f9f4bed -> 3efc9728 3f319a21 3f958bf0", + "40000000 3f8750fe 3f9bd1e0 3f8750fe 3f033111 3f23355d 3f027bd2 -> 3d4d5323 3d6c6fa0 3d4d5323", + "00000000 3f206336 3f8fe8f6 3f8fe8f6 3f000000 3f800000 3f800000 -> 3f206335 3f8fe8f6 3f8fe8f6", + "3f000000 3ef53a17 3f4f88ac 3ef53a17 be24b6aa 3f0a2b75 3f0a2b75 -> 3ecc3eeb 3f2cda10 3ecc3eeb", + "3f800000 3cab0bd3 3eae0c0c 3cab0bd3 be5c5ef3 3c46cb0c be61011d -> 3a435d90 3c46cb0c 3a435d90", + "3fc00000 3f9c95e3 3f9c95e3 3f2039d9 3e2e212d 3ee2ae8d 3eb328a3 -> 3d56d070 3d56d070 3cdbcef7", + "bf000000 3f8bdcfd 3f9f3af0 3ef46623 3efff713 3f4698dd 3e9575e0 -> 3fa62f32 3fbd3231 3f11324a", + "3e800000 3f53f77a be6c17c6 3ea5c60c 3e800000 3e800000 3f400000 -> 3f4ef99c be668876 3ea1dea4", + "3f400000 3f84d6dd 3e3ddd72 3f73c1d0 3f400000 3f000000 3f800000 -> 3f8135b7 3e38ad6c 3f6d18da", + "40000000 3f8ebe10 3f98fb08 3f98fb08 3e1523c1 3e475d2d 3ed2e0cc -> beb17079 bebe2a88 bebe2a88", + "00000000 3e91aa3f 3df3dfe0 3f6b27b3 3f9ae441 3f0ee4f8 3f7bc569 -> 3e91aa47 3df3dfdd 3f6b27b3", + "3f000000 3f5998aa 3f5c905a 3f31f7f0 3e8296a9 3e8296a9 3e993b47 -> 3f129736 3f1496ff 3eefc9c8", + "3f800000 3f09c16a bdbe6880 3f09c16a 3f000000 3f800000 3e800000 -> 3f800000 be30ec88 3f800000", + "3fc00000 3f98d1af 3f5d7a4f 3f5d7a4f 3f0e6ee0 3f591ec4 3f2ddc22 -> 3f2cdc77 3efa8641 3efa8641", + "bf000000 3daf3df8 3f70f2c8 3daf3df8 3f5e74b8 3d0160a7 3f8d19cb -> 3da03d83 3f5c5261 3da03d83", + "3e800000 3f2ed6fe be241ea3 3f7719dd 3f5435df 3e3727d7 3e57e997 -> 3f28ab09 be1e538b 3f6e60de", + "3f400000 3db83e6c 3f80753c 3f80753c 3f9033f9 3ea66469 3f590675 -> 3dc92e51 3f8c444a 3f8c444a", + "40000000 3e4b8fe3 3ed3b3a8 3e69ece7 3ecfbc0f 3f9a2303 3f74133d -> 3f7587bb 3fff591c 3f8d13a6", + "00000000 3f096406 3f6ac3fc 3f6ac3fc 3f8aff11 3ecdd8e7 3f940ca4 -> 3f096406 3f6ac3fc 3f6ac3fc", + "3f000000 3e06ab34 3d59dfc0 3e06ab34 3f3891b7 be474380 3f3891b7 -> 3eda3c84 3e308979 3eda3c84", + "3f800000 be6a17da 3c988593 be6a17da 3da9757a 3eb77e8c bd933a65 -> c08cd0b1 3eb77e8c c08cd0b1", + "3fc00000 3e86b87b 3ec90885 3e86b87b 3f0453f9 3ea2449d 3f0453f9 -> 3ec6acca 3f143bd5 3ec6acca", + "bf000000 3f317999 3f5baee0 be012c1b 3f781a9f be071414 be071414 -> 3f25fead 3f4d7900 bdf1a21b", + "3e800000 3ea0e68e be5a1445 be5a1445 3e33c693 3f9a804d 3f45ca66 -> 3f09969c beba7b85 beba7b85", + "3f400000 3e1e26bc be7e8c40 3e6ce092 3f5b91ee 3eac681b 3f5b91ee -> 3eefa9c5 bf40df16 3f337b7b", + "40000000 3f195367 3f195367 3d8affa7 3e94ac9f 3d18ef96 be2fe9de -> bc94d900 bc94d900 bb06f060", + "00000000 3f12c7f2 3f10152d 3f10152d 3f5f98d8 3f0e6e52 3f13d8c9 -> 3f12c7f2 3f10152d 3f10152d", + "3f000000 3f546469 3f2c87fd 3f2c87fd 3f9df713 3f9df713 be62ade6 -> 3f8414a4 3f56959b 3f56959b", + "3f800000 3f807564 3f807564 3f36ee7c 3f87a75d be639027 3f87a75d -> 3f87a75d 3f87a75d 3f412d8c", + "3fc00000 3f8010ff 3f0c60f7 3f0c60f7 3f000000 3f000000 3f000000 -> 3e7fbc04 3e0c2913 3e0c2913", + "bf000000 be3bd6ec 3f097340 be3bd6ec 3f20e13b 3f522775 3f2a7c84 -> be0a2930 3eca324b be0a2930", + "3e800000 398c1af6 398c1af6 3f7b08d5 3ef9850f 3f317b72 3ef9850f -> 3981d75c 3981d75c 3f68a57c", + "3f400000 3f277528 3eff8ab9 3f42c296 3e8b5816 be19258d 3f731384 -> 3f469d67 3f178b45 3f66ff48", + "40000000 3e4a1b39 3f1d806a 3f9d5884 3e7ee043 3f0ccc8f 3f9d1fc5 -> 3e498970 3f1d0ec9 3f9ce706", + "00000000 3f9a31a8 bd62f740 3dc59eca 3f8ebaff 3f8c651b 3f8c651b -> 3f9a31a8 bd62f745 3dc59ee8", + "3f000000 3e4025f6 3e4025f6 3f65a6d3 3f9d4438 3f9ce0d5 3f9ce0d5 -> 3e63a87c 3e63a87c 3f880bd1", + "3f800000 3ec0fed1 3ee0d6a3 3f87a47a 3e1672af 3f5b7756 3f5b7756 -> 3e9c217f 3eb5e439 3f5b7756", + "3fc00000 3e5b3553 3f5d4fbb 3ea2bc75 3f770224 3e972bb7 3f90a69a -> 3ea01cb6 3fa1a5f8 3eedba82", + "bf000000 bd0b2460 3f6f8ff5 3f8a58da 3f8c97bb 3e1ab518 3f1f90a2 -> bd0a033b 3f6d9e3b 3f89396a", + "3e800000 3e9bd105 3e3f8ec3 3f624222 00000000 3f800000 00000000 -> 3ea0efec 3e45da4c 3f69b19a", + "3f400000 3f97a8d5 3f555e90 3f81c6bc 3f0621c9 3f0a46d6 3f5179a7 -> 3f68efa8 3f23dbd1 3f47534f", + "40000000 3f321ea3 3edde59b 3f534bf9 be2ba68c be2ba68c 3ed980ea -> 3ca76e71 3c5094ed 3cc69e20", + "00000000 be38d168 3d4b7379 be38d168 3ce43d8d 3ce43d8d 3ecdc603 -> be38d168 3d4b7379 be38d168", + "3f000000 3f039c61 3f0456d3 3f0456d3 3f800000 3e800000 3f400000 -> 3f4119dc 3f422b6a 3f422b6a", + "3f800000 be23a02b 3ded2f2d bdd845ca 00000000 3e800000 3f800000 -> bfb09b24 3f800000 bf696df4", + "3fc00000 3f859937 3f859937 3db7a0d0 3f8715ce 3f8ea388 3f8ea388 -> 3f9328b0 3f9328b0 3dca4442", + "bf000000 3e014490 bb1810d8 3f57a079 3ebc29a3 bdca6cf0 3e47f5d2 -> 3e25b366 bb42ecee 3f8a3327", + "3e800000 3f59c54b 3f8bb3d1 be020c99 3f96970a 3e995449 3f9aac2b -> 3f5f9aca 3f8f71e8 be05887b", + "3f400000 3f8530db 3f7a3c4b 3f8530db 3f080d04 3f36bb8a 3f36bb8a -> 3f4ba516 3f3f4d26 3f4ba516", + "40000000 3e8b0b37 3e8b7229 3f9c2fc8 3ed8ad89 3f84e304 3ed8ad89 -> 3e431e1c 3e43ae8b 3f5b2c80", + "00000000 3d3e0255 3f8c8360 3f8c8360 3f1eff47 3f678d7d 3f1eff47 -> 3d3e0266 3f8c8360 3f8c8360", + "3f000000 3d0e0884 3d0e0884 3f86befa bce158c8 3f95a265 3f94d0bd -> 3d15e146 3d15e146 3f8e30b0", + "3f800000 3dc52572 3e53cbe7 bd56fdff 3f000000 3f400000 3f000000 -> 3eb2b819 3f400000 be42e59c", + "3fc00000 3e5cf03b 3f5d8dd8 3f5d8dd8 3f12da05 3f61af4f bda4d98d -> 3e631e07 3f63c00a 3f63c00a", + "bf000000 3f9c4168 3f43b7b5 3f7a0482 3e035e7b 3f2eba70 3eb6a164 -> 3fbeb380 3f6edccd 3f9890fc", + "3e800000 bd9ba23c be6541f7 bd9ba23c 3f1fd7bd 3f440c10 3e5a7875 -> 3e09af3a 3ecad13f 3e09af3a", + "3f400000 3eb1e416 3eb1e416 3f62ac8c 3e9ef09c 3f584b46 3f2c2a8c -> 3eabc80a 3eabc80a 3f5ae397", + "40000000 3f5fa376 bdbd3036 3ec43057 be2d7ad6 3f9e640d be2d7ad6 -> 3fccf65f be2d639e 3f33ce18", + "00000000 3f222e56 3d48fcf5 be278b7c 3f91af2e bb98d082 bb98d082 -> 3f222e56 3d48fce9 be278b7d", + "3f000000 3f06cb2b 3f9f34bf 3e91737b 3f800000 3f000000 00000000 -> 3ef32a95 3f8f9a60 3e833238", + "3f800000 3f9d24a0 be433202 3f9d24a0 3f702b49 3e9d3f65 3f9a208b -> 3f9a208b be3f72f5 3f9a208b", + "3fc00000 3f501977 3ecbe3ff be6e90b0 3f9cc673 3d5214af 3f6801b5 -> 3fb7234e 3f336f14 bed1f305", + "bf000000 3ed88910 3ed88910 be4bd646 3eae5058 3d9b7901 3d9b7901 -> 3eeda56c 3eeda56c be5fb5b6", + "3e800000 3f8c2177 3f5c5ede 3f833327 3f62df2f 3f311632 3edc340b -> 3f8574ff 3f51e01e 3f79e724", + "3f400000 3e8d65f2 3ea2f286 3e8d65f2 3f1092df 3f1092df 3f687c00 -> 3f28faae 3f42bb51 3f28faae", + "40000000 3d3617d0 3e201d76 3d3617d0 3f4ec5f0 3f4ec5f0 3f34f152 -> 3ed464d9 3fbac241 3ed464d9", + "00000000 3f3699c6 3f063594 3f891747 3f901220 3ec0d8fc 3e784683 -> 3f3699c4 3f063594 3f891747", + "3f000000 3f533cd4 bd73ac2f bd73ac2f 3f709595 3f709595 3f353ccc -> 3f61e934 bd824cab bd824cab", + "3f800000 3f9d0d26 3f2a107d 3f9d0d26 3f02e99c 3efcdfdc 3efcdfdc -> 3f02e99c 3e8dc280 3f02e99c", + "3fc00000 3f4af2b3 3f24b3f1 3f24b3f1 3f9ed9f4 3f9ed9f4 3ec61dee -> 3fbb8a41 3f9832d2 3f9832d2", + "bf000000 3f52df7d 3f52df7d 3ebc3bae 3e46f783 bc117c19 3f0164df -> 3f7b9ccc 3f7b9ccc 3ee09945", + "3e800000 3eab0403 3f19cd13 3f19cd13 3e7ab161 3f63fb1f 3f987b79 -> 3ed50952 3f3f978a 3f3f978a", + "3f400000 3ec3d653 3f0422ed 3f9b8ab6 3e3c6030 3e3c6030 3f49f3e5 -> 3e904fa6 3ec2bda2 3f653c47", + "40000000 bd72b423 3f87519a 3f87519a bd32f535 be013a04 3f097864 -> ba76f84b 3c89b280 3c89b280", + "00000000 3f9d8e58 3f8bd907 3f9d8e58 3e501d0a 3e501d0a 3b36f3c0 -> 3f9d8e58 3f8bd907 3f9d8e58", + "3f000000 3eb14041 3f2be923 bd3a12c8 3f7bad10 3f8a6ef8 3f056779 -> 3ee75bff 3f60638a bd72dff9", + "3f800000 be228ba2 3f304282 3f817926 00000000 00000000 00000000 -> 00000000 00000000 00000000", + "3fc00000 3f5e3614 3f91b3d5 3ecc87ab 3ead7139 3f6d2067 3f86cedd -> 3f4549e4 3f815c62 3eb59727", + "bf000000 3f78be1e 3e728efa 3f94a0ef 3f27e501 3f8b4b51 3f72a81e -> 3f8046e2 3e7a2cde 3f994bbe", + "3e800000 3edff118 3edff118 3dd96afc 3f89a9eb 3efa2607 be11dd66 -> 3f18cf5e 3f18cf5e 3e145bbf", + "3f400000 3f5297ed 3f5297ed 3f17d275 00000000 3f400000 3e800000 -> 3f44a5fb 3f44a5fb 3f0dc4cb", + "40000000 be1f6209 3ea1c6a4 3f911294 3f1a7bc0 3f122674 3f1a7bc0 -> bc256d18 3ca7e8fc 3d9692c0", + "00000000 bdc2ff41 3f03a2c3 3d9bd1e7 3f0cb913 3e87368d bd1cce83 -> bdc2ff3e 3f03a2c3 3d9bd1e3", + "3f000000 3f3b95af 3ea51a8b 3f85091d bd22d5b7 be79fce7 3f5f45e2 -> 3f2c7f7a 3e97d335 3f74ac0e", + "3f800000 3e8fc15c 3e8fc15c 3d215801 3d13264d 3f0e3a13 3f09b52e -> 3f0e3a13 3f0e3a13 3d9fa0d6", + "3fc00000 3eccd14b 3f4313e5 3f4313e5 3f307eec be7cf65a 3f307eec -> 3eaf8d93 3f273470 3f273470", + "bf000000 3f7df03a 3efd6238 3f49403c 3f328c91 3f564e6e 3f26b8f5 -> 3f88e090 3f089404 3f58f499", + "3e800000 3f8ccd01 bd93ff99 3f8b3048 3ede44ee 3f917615 3e270c8f -> 3f8df746 bd95392b 3f8c5725", + "3f400000 3f344de2 bca93a15 3d807021 3eae140d bdbfc9ae 3f6f2eae -> 3f60767a bcd2ac3b 3d9fe4de", + "40000000 3f5f422a 3f5f422a 3f993e02 3ea8318d 3eeb915a 3ea8318d -> be4ea308 be4ea308 be8dd554", + "00000000 be1195ca 3e81f8e0 3f9b220c 3f99f138 3f99f138 3f918473 -> be1195cb 3e81f8d4 3f9b220c", + "3f000000 3f05eb61 3f7efa7f 3f7efa7f 3d974a20 be65ce3e 3f6e90b9 -> 3f019bf4 3f76c59c 3f76c59c", + "3f800000 3f462131 3f89ef75 3f89ef75 3e01cdf2 3e01cdf2 3f7ccf49 -> 3f359138 3f7ccf49 3f7ccf49", + "3fc00000 3f1affd3 3d282415 3f4cec0e 3ee5fb79 3e887017 3e887017 -> 3e53dd60 3c65d3cf 3e8c0d28", + "bf000000 3e6f7742 3e6f7742 3dba0b46 3f37a57e 3f342869 3ec2af77 -> bc018180 bc018180 bb493abe", + "3e800000 3f98985e 3f171b6b 3f1a62fa 3f752706 3f752706 3ed59d61 -> 3f911727 3f0facf1 3f12cb35", + "3f400000 3eb0168d 3dd7ecef 3eb0168d 3f07b839 3f07b839 3f46ca77 -> 3f2b1aab 3e51d067 3f2b1aab", + "40000000 3ef8fa44 3f8cc6a7 3bfb232f 3f49fd3e 3ee97161 3f6ff4db -> 3eaf6950 3f465c68 3bb0eee0", + "00000000 3ee3a0f6 3f80499e 3f2df730 3dfd3b35 3e463e08 3f58bb12 -> 3ee3a0f6 3f80499e 3f2df731", + "3f000000 3c4668c1 3e9acf77 be1c480f 3f5b29c0 bde11455 3f9e825f -> 3cfcc08f 3f45363d bec715fb", + "3f800000 3f38529b 3ec3df38 3f5c4837 3f800000 00000000 3f000000 -> 3f5635be 3ee3a1c0 3f800000", + "3fc00000 3e0ee1dd 3e0ee1dd 3e58d3e5 3ed2763d 3f66331b 3e9e9376 -> 3f51ae3d 3f51ae3d 3f9f1916", + "bf000000 3f89fa9d be7bb2f7 be5ce6ef 3de73060 be49a717 be49a717 -> 3fc7be69 beb62f4c be9fe4b3", + "3e800000 3c7ca524 bcc5c554 3c7ca524 3f311ea5 3f3ffa0d be65856a -> 3e4bd1cb be9f8cd3 3e4bd1cb", + "3f400000 3ec70780 3f10b0d8 3f03fd53 3da1f39f 3e8c8ec6 3d5f5313 -> 3e7485cd 3eb1c380 3ea228c3", + "40000000 3f89dc51 3f9b5625 3f617e5f 3de125ca 3ee95a70 3de125ca -> be893df4 be9aa3b4 be607b56", + "00000000 3f071bd4 3f17f2fd 3f17f2fd 3f800000 00000000 3e800000 -> 3f071bd4 3f17f2fd 3f17f2fd", + "3f000000 bd9efe24 be586742 be61f1d0 be368e9b 3e43f4ce be368e9b -> 3d68eb78 3e1e832a 3e25804c", + "3f800000 be6c0a3c 3f97837c be24010c 3f815243 3f815243 3d1485bd -> be497799 3f815243 be0bfb7e", + "3fc00000 3f885efc be21f531 be21f531 3f3b4c2a 3f3422eb 3f3b4c2a -> 3f109344 bdabb389 bdabb389", + "bf000000 3d93b725 3f8cd7fb 3f8cd7fb 3e8155b3 3e8155b3 3d67998f -> 3dcc9e0a 3fc31942 3fc31942", + "3e800000 bd853204 bd853204 3e248ac0 3d934cc8 3f9a5963 3e24aab3 -> be2ee483 be2ee483 3ed80d6b", + "3f400000 3dfdbb3d 3dfdbb3d 3f01fde0 3eb5743b 3f20018c 3eb5743b -> 3e14d5c9 3e14d5c9 3f1880a1", + "40000000 3f8c36b7 3f1b14e1 3f1b14e1 3f9e91ba be4fe313 3e64ec01 -> 3fb0ecbd 3f43af71 3f43af71", + "00000000 be4fdc67 be4fdc67 3f80a5d4 3ecc6f9d be2c58cd 3ecc6f9d -> be4fdc67 be4fdc67 3f80a5d4", + "3f000000 be1f3d29 be1f3d29 3f9749a7 3e0b3e87 3e0b3e87 3f929bbd -> be1cc6bb be1cc6bb 3f94f2b2", + "3f800000 3f4e3a37 3f2b9ce0 3f2b9ce0 3f400000 3e800000 3f000000 -> 3f400000 3f1fc5fe 3f1fc5fe", + "3fc00000 3f081849 3e1e83f8 3f8119b3 3ed1f5c3 3f3faa22 3c212b7d -> 3ea6fa71 3dc27c92 3f1e6581", + "bf000000 3d34ea9a 3f9fc24b be287c0b 3eb5f700 3f612e1b 3eb5f700 -> 3d4f9ff3 3fb757e9 be415b68", + "3e800000 3f36e101 bda0e172 3f8aaeac 3e3a4513 3e3a4513 3f7a5e28 -> 3f326dca bd9cf749 3f874ec6", + "3f400000 3eb15149 3f86bebb 3e32edfb 3f96706e 3dbbd55d 3dbbd55d -> 3ec0ce95 3f928401 3e428f57", + "40000000 3ed27be9 3f52f20f bd2f55b2 3e3812cb 3f2e88c8 3e3812cb -> 3e89d223 3f0a1f81 bce59c89", + "00000000 3ed6ff20 3f8bc542 3ed6ff20 3c620090 3f1ef48f 3c620090 -> 3ed6ff21 3f8bc542 3ed6ff21", + "3f000000 3f40b865 3f762125 3f40b865 3dccfddd 3e65b019 3dccfddd -> 3eedae91 3f17c696 3eedae91", + "3f800000 bd9c623c 3e93d55d 3f9498c7 3edc0e21 3eb4e839 3f9873f0 -> bda0712c 3e97ab6f 3f9873f0", + "3fc00000 3f623924 3eed66a4 3f623924 3e52e985 3eaeb87a 3f80a230 -> 3f8864ff 3f0f2241 3f8864ff", + "bf000000 3f994b08 bc83a5af 3f5fe92a 3f000000 3f000000 3f400000 -> 3fb5f08c bc9c3fb7 3f84e07d", + "3e800000 3f81e4c4 3ee7f277 3f00cd6c 3f8cfdd8 bdb3aaab 3ee3efdd -> 3f84ab09 3eece6c6 3f038dba", + "3f400000 bd2ab6c6 3f1af85d 3eb79a71 3e800000 3e800000 00000000 -> bcbf1c10 3ead7c2e 3e4d8a06", + "40000000 3e79cf4e 3e0608eb 3e0608eb 00000000 3e800000 3f400000 -> 3fa0c616 3f2c868a 3f2c868a", + "00000000 3f955684 bdcfab47 be202e02 3e705d15 3f89c3d4 3f89c3d4 -> 3f955684 bdcfab38 be202dfe", + "3f000000 be6e67b0 be6e67b0 3ee0ad63 3ebac86e 3ea96457 3f8734bb -> becb117f becb117f 3f3f6014", + "3f800000 3dbd6560 3f83fa70 3f2ee1ba 3f9a6f80 3f9a6f80 3effd724 -> 3ddd9f9c 3f9a6f80 3f4ca3b0", + "3fc00000 3f98ac28 3f9ca884 3f8d3e54 3e0e613c 3e0e613c 3f89bdf5 -> 3f7a0a43 3f8048ae 3f675278", + "bf000000 bde980d3 be3d1c3f 3f36a122 bdce3a74 3e4ec950 be3a1c99 -> be1e9a49 be807332 3f78188a", + "3e800000 3ecd7065 bd74f27e 3f455fb3 3f2d3adf 3f44db6d bd3e15a0 -> 3ecd4df6 bd74c96f 3f453ea1", + "3f400000 3eb612a6 3d8fa9f0 3f6f400d 3f2389e1 3f62a5f5 3f62a5f5 -> 3eaee151 3d89fd0d 3f65cc7b", + "40000000 3f2ceebb 3f2ceebb 3f6da5de 3f92f940 3f92f940 3f2e1c35 -> 3f7ede68 3f7ede68 3faf1f91", + "00000000 3f963fc8 3f8bf503 3f63157e be54503c 3e880c32 bd4977b9 -> 3f963fc8 3f8bf503 3f63157e", + "3f000000 3e8994e1 3e8994e1 3f842e29 bcef170a 3e9aa907 3e9aa907 -> 3e31d39a 3e31d39a 3f2ad86b", + "3f800000 3ef8d77e 3e455f98 3e891e00 3d07f474 3d07f474 3f9b59f8 -> 3f9b59f8 3ef6708f 3f2b3438", + "3fc00000 3ef75260 3e9c9008 3ef75260 3eebd966 3f893947 3ec8aac1 -> 3faeeb9e 3f5d75de 3faeeb9e", + "bf000000 3e896971 3e896971 3d171246 3ee0653b 3f65f066 3f65f066 -> bd3e91e0 bd3e91e0 bbd18379", + "3e800000 3f690200 3f318dd3 3f938c4e 3f2378cf 3ebe20ce 3f30f855 -> 3f51b091 3f1fc911 3f84c845", + "3f400000 3f007586 3ef60e2d 3ef60e2d 3f000000 3e800000 3f400000 -> 3f301d62 3f28ab20 3f28ab20", + "40000000 3f0928a3 3d7adc76 3d7adc76 3f817635 3f817635 3e002405 -> 3fbe5818 3e2e1175 3e2e1175", + "3f733c6a 3eb26d7b 3f760a3b 3eb26d7b 3f2a5386 3d2cf5b8 3cf53323 -> 3e7c8409 3f2e19ef 3e7c8409", + "bea1d976 3f88c16e bca18b9a 3f6ef8f8 3f1ddda5 3e954dd5 3f1ddda5 -> 3f9b08b7 bcb722f6 3f8774e1", + "3f98f3d0 3ed96eb0 3f2604c9 3f6a5fa8 3dda2873 3f935a6e be18b0dc -> 3f0e285c 3f59162b 3f993be1", + "bed70360 3f963b3e 3e836e5e 3f058dfc 3f426a78 be5b1e79 3f426a78 -> 3fac7f9d 3e96e960 3f195991", + "be288e76 3f6c412b 3f42451a 3f6c412b 3d14fa89 3f31ca19 3f02d559 -> 3f75e0d6 3f4a2ef3 3f75e0d6", + "3faa0a12 be18364d be18364d 3f4f067a 3f59c7b9 3f59c7b9 be6609b7 -> be22b76a be22b76a 3f5d4ffa", + "3e99c17f 3f456304 3f609597 3ed749e2 3f800000 3f400000 00000000 -> 3f4dadb5 3f6a04c2 3ee05516", + "3f12549b bd14627c 3dbdad24 3ec68232 3eda7a79 3e570afd 3e20ae3a -> bd1cead0 3dc8954c 3ed1ec64", + "3fbedda5 3f90ca40 3f90ca40 3f8dd008 3e21da2a 3d9ac2c3 3e8c738d -> be160804 be160804 be12f235", + "befdc885 3ebe96ae 3f867261 3f867261 3f400000 3f400000 3e800000 -> 3ed99a6e 3f9980f4 3f9980f4", + "3f977f6d 3ee13c2e bdabdf2c 3ee13c2e 3f471c89 3e9ddc4c be41217b -> 3f56fd5c be240dbb 3f56fd5c", + "3f113212 3f4d3d61 bd132cb2 bd132cb2 3f3a3ef8 3f3c59b3 be25d443 -> 3f43a91e bd0c4e3f bd0c4e3f", + "befd45bc 3eafef50 be0b1723 3ec11c0d 3f0ad9ce 3ef59061 3ef59061 -> 3e89cfa2 bdd9e6af 3e9743a3", + "3f119764 3df00d06 3ed72d6d 3f9cd598 3e6054db 3e6054db 3e81cf4c -> 3d83c772 3e6c3fbd 3f2c3152", + "3f415908 3f8b0259 3e7e139f 3f8b0259 3f57e30f 3f4f6fb1 3f4f6fb1 -> 3f6717ba 3e53312a 3f6717ba", + "3e926261 3f783ba1 3f83738b 3ea8713d 3e55f82d 3e4d1cd5 3e55f82d -> 3f3fb3af 3f4b07e5 3e821511", + "bd7514e7 3e849ca8 be2d74bc 3f4dbfc3 3f800000 3f800000 3e800000 -> 3e82ac8f be2aebd1 3f4abe0a", + "3f9bd4dc 3f44ccac 3f9ab5ed 3ee3071a 3f36bdce 3f3020af 3f36bdce -> 3ec56b0b 3f1b326e 3e63bdcd", + "3f0eba97 3d4576da 3f1c18ea 3d4576da 3f753b09 3e10216e 3e10216e -> 3d822a16 3f4dcacf 3d822a16", + "bd857af9 3e36a6c4 3e2ac6f8 be77f368 bd0ece36 3f3ed431 bd0ece36 -> 3e10ce5d 3e07646b be449352", + "bc9a05c1 3f538fe3 3f3796ed 3f538fe3 3f2cd19d 3f491356 3f491356 -> 3f53c25c 3f37c2ba 3f53c25c", + "bb17e1c1 be01143d bca32fdf 3f4cac37 3c67f6fa be577416 be577416 -> be015f73 bca38f20 3f4d237f", + "3fa58833 3f206dd8 3f4ae500 3f33d73c be2de65c 3e837c10 3f5f013d -> 3f34fe2e 3f64e6cc 3f4ae48b", + "3e653bdf 3f50bb9e 3f50bb9e be5f679c 3f215d49 3f5f1d37 be6113a0 -> 3f53f3c8 3f53f3c8 be62d9ae", + "3f49632e 3ea6b141 be3b4a5e 3ea6b141 3f6dd389 3f12b2b7 3f963bab -> 3f7e25db bf0ec6c2 3f7e25db", + "3f4db6d1 3db91754 3f59acb1 3f59acb1 3f1540f2 3f7380b2 3f45ab58 -> 3dcabd38 3f6e6de8 3f6e6de8", + "3eff5de4 3f7f9d52 3e949b0a 3eb512b5 00000000 3f400000 3f400000 -> 3f5fe2ce 3e8228e2 3e9e98d7", + "bdc1864b be437a66 3ef2f6f3 be1fe664 bda8901f 3df1387b 3f370586 -> be3a1ef9 3ee7559d be183ef4", + "3f36234a 3f8c8917 3d78aeac 3f47d19f 3eea0257 3f03c120 3eea0257 -> 3f2ed5f8 3d1ab05b 3ef89698", + "3ea7b408 3f9027a5 3f533851 3f2aa8e5 3e904ae5 3e1a08b1 3e1a08b1 -> 3f5981a2 3f1f5931 3f00bfbd", + "bdd75fbf 3f8479ca bb3f5d4c 3f1b6fb4 3f71ce38 3e985ecb 3f60bdcc -> 3f85b15b bb411f2d 3f1cdd43", + "3ec68130 3ef2c98f 3e9617db 3ef2c98f 3f89b0f3 3f89b0f3 3f4a52cd -> 3f351885 3edfe8ee 3f351885", + "3f11f57a 3f0dc49d 3ead49a4 3eb114de 3eadd9f8 be5cb662 be5cb662 -> 3edcffc8 3e871135 3e8a0635", + "beca494b 3f59f44b 3f62935d 3f59f44b 3f83d171 3f48e44a 3e0ea7ff -> 3f4bde80 3f53eef0 3f4bde80", + "3e5205ae 3e2724cf 3ebfdfc8 3ebfdfc8 3ee04f9d 3edf0ef0 3ee04f9d -> 3e2cf069 3ec686e5 3ec686e5", + "bec602c7 3df6269c 3f45ce18 3f5c1db1 3f000000 3f800000 3f400000 -> 3de6a1ac 3f39557c 3f4e3cfa", + "bd0fdb2c 3e9790a1 3e12c6fa 3ea5d54d 00000000 00000000 3f000000 -> 3e94abb1 3e0ff971 3ea2aa9c", + "3e8ee607 3f6beaf6 3e608b2c 3e608b2c 3f512dcf 3f39c5f9 3f991791 -> 3f7f8770 3e733598 3e733598", + "be8380f8 3f890359 3dc0e482 3e7d0323 bde03dac 3f01af6b 3f01af6b -> 3f9b8cb1 3ddafd31 3e8f9f06", + "be0a8deb be709b0c 3f1fd517 be709b0c 3f652f74 bdd3e5b5 be33b5b3 -> be627abb 3f1672cc be627abb", + "bebccc17 3f8daca9 3d720fbe 3d720fbe 3f4946c4 3ed6c4f3 3f4946c4 -> 3f9cce6c 3d85f532 3d85f532", + "3fb02b1c 3ed9c825 be4a18f7 3e73f411 3f9a3e24 3f01fba7 be27d21f -> 3fbfcc4a bf31fc2a 3f56d8cb", + "3fbfe2dc 3ed86739 3ed86739 3f3d8d11 3ea314c3 3d77636d 3d77636d -> 3d7c5d8a 3d7c5d8a 3ddd0d08", + "be6f92b9 3d9268aa 3f8decfa 3f8decfa 3f7b621a 3ec3886d 3ec3886d -> 3d9653b6 3f91b94a 3f91b94a", + "3d328be7 3e4df3cf 3ee58f7e 3e4df3cf 3f1786b4 3f599d45 3f476bda -> 3e55fedf 3eee8694 3e55fedf", + "3d6e06b5 3f728dae 3e499ca4 3f728dae 3f1b2bc7 3da907c0 3f1b2bc7 -> 3f6d79b9 3e45641d 3f6d79b9", + "3f8dd814 3f5837c4 3f084c87 3f47cfc3 3f1168f9 bd45daef 3f1168f9 -> 3f09c070 3eadabd8 3efe9941", + "3f38151b 3f9abb5c bdc507e5 bdc21f93 3e8ce0df 3f87fc44 3f3720d4 -> 3f8d4077 bdb3dd9c bdb135f9", + "3f39781a 3f692f36 3f5ef809 3f520be0 3f8b8e52 3f5d97d1 3e92a21b -> 3f853aab 3f7ec8fe 3f7004c7", + "3e4cf8c8 be711581 3f0a26fa 3c6ad2a5 3db8186f be4990c5 be4990c5 -> be48dd6b 3ee635b2 3c43a6eb", + "3e40eb2c 3f86322e 3f083a67 bd8e9635 3f358c95 bdb91b48 3f358c95 -> 3f7c07f5 3effd8fa bd85e507", + "3e03b79c 3f82a426 3f00a047 3f92491d 3f51e205 3f99eaa6 bdbbaf03 -> 3f83848e 3f017d39 3f934465", + "3ee5a6a8 3f4b92e9 3f066f5a 3f8620c0 3ef58db6 3f886413 3e0ecfe5 -> 3f4d1d4d 3f0773cb 3f872499", + "bea19748 3e41289c 3f89ceff 3f9cc560 3f400000 3f000000 3e800000 -> 3e58ca4b 3f9aab21 3faff366", + "3f6de094 3e9ecbf9 3f942f15 3f990ed4 3e87a9d9 3e87a9d9 3f0d8367 -> 3e1ee8a0 3f1449d3 3f192a74", + "3f8f118b 3f9d3707 3e8e950d 3e8e950d 3e352604 3e09f1c9 3f2b4c62 -> 3f1a72d2 3e0c12c1 3e0c12c1", + "3d89e20f 3f10e959 3f33946b 3f45d3b5 3f0ac272 be1de12c 3f0edaf7 -> 3f0e3352 3f30385a 3f422040", + "3f6403c9 3f9223fe 3e35df56 3f22ff51 bd8210c9 3f58cca3 3f58cca3 -> 3f610d03 3e0c09c9 3efb0272", + "bd975ec5 3f78ee7d 3d8286b7 3f5bc601 3ed005aa 3ed005aa 3f32aded -> 3f7e1fbe 3d853fb6 3f605b8d", + "3f541497 3f3e8cc4 be714f8f 3f24807b 3dbadbfd 3f16d061 3f66c8d4 -> 3f5fe1bd be8dc2d3 3f414702", + "bdb5c502 3f086994 3cdcaa31 3f086994 3f95a330 3ea0d210 3ea0d210 -> 3ef3ea4c 3cc54853 3ef3ea4c", + "bee431c2 3f965781 bdf9d96a 3ecb1f60 3f000000 3f000000 3e800000 -> 3fbcd2dc be1ce691 3eff1d54", + "be692392 3f43ae0d 3ec0060f 3e729043 3dedf1fd 3f71bf8e 3dedf1fd -> 3f3930f7 3eb5bb24 3e658fd8", + "3f65978f 3f0a2f50 3f19bd23 3f860721 3ed321bf 3ed321bf bd51243e -> 3e7c3e5e 3e8c516a 3ef4a7cd", + "bed08a0c be08f37a be08f37a 3eba0fbd be3d4a60 3d07d118 3d07d118 -> be3ba459 be3ba459 3efeee1a", + "3f743daa 3f178dbb 3f178dbb 3f1fe8f8 00000000 00000000 3f800000 -> 3f6e7068 3f6e7068 3f7b9611", + "bc6f4c8b 3f251507 3ed27554 3e947b33 be6c6c6d 3dfe202c be6c6c6d -> 3f270781 3ed4f0d3 3e963b8d", + "3d87246e 3db736ba be0945a5 3db736ba bb93ff93 bdc2907a 3f8bc0f0 -> 3e1f5680 be6ec42e 3e1f5680", + "bed7157a bd110cd1 bd110cd1 3f6350f9 00000000 00000000 3f400000 -> bd1a844a bd1a844a 3f7226f4", + "3e54bb9d 3e99f6a0 3ccfcc42 3e99f6a0 00000000 00000000 3e800000 -> 3e9491cf 3cc884a2 3e9491cf", + "3db35bf5 3f9d0fec 3f9e9fe8 3f9d0fec 3e800000 3f800000 3f000000 -> 3f9a6815 3f9bf14e 3f9a6815", + "3ee24a1b 3ee18f95 3f9969ee 3ee18f95 be157ce8 bd0f9042 be157ce8 -> 3e75e874 3f2740b7 3e75e874", + "3eaca65e bddad981 bddad981 3f63c658 be5fc98c be5fc98c 3f2933c1 -> bdc7df54 bdc7df54 3f500611", + "3f6cd0e6 be7cbc9c 3f8c3ce6 3f1f764e 3ddc1eff bd82e7f6 3ddc1eff -> bd27805c 3e39e2ad 3dd35e04", + "3fae0a60 3e973e94 3f6d08e9 3f6d08e9 3f86a0a9 be484ac2 3dfc076a -> 3eb332b5 3f8c6c1a 3f8c6c1a", + "3f3320ec 3f9ef1a1 3f89dd8d 3f97683e 3f369c9a 3f7f61e7 3eb1dd88 -> 3f891363 3f6dcb72 3f829374", + "3e9ec868 3e5e40f2 3f1930cc 3e7bd4cf 3f400000 3f800000 3f000000 -> 3e864172 3f3912fb 3e981f59", + "bebee179 be407aad 3f8eed17 3f6f233c 3f400000 3f400000 3f000000 -> be580a1a 3fa06bbc 3f863459", + "3f647b52 3e4871cf 3f9b1fda be7033a2 00000000 3f000000 3f400000 -> 3e044259 3f4cb602 be1e7de7", + "3f61ccd3 3f834f76 3f834f76 bd91aaa0 3f321b74 3f0f2927 3f321b74 -> 3f3c13c2 3f3c13c2 bd50a3b7", + "3ea86ca4 be3d4737 3f63e9db 3f889a5a be717b26 3e5af0af be717b26 -> be0b7d13 3f27f5f6 3f4956cc", + "3f924780 3efcb4f6 3efcb4f6 3f80c220 3f6ec7ec be3b52c4 3f374d81 -> 3ee7b20e 3ee7b20e 3f6c1af8", + "bec08313 bd434d00 bc1917ad 3d36f079 baee724e 3e227b1b be41ca8f -> bafb347c b9c4ea3a 3aeb4e20", + "be5ffe4a 3f96388d 3f3b0b6a 3f3b0b6a 3f8a5f72 3f8a5f72 3e8501c8 -> 3f98d005 3f3e4586 3f3e4586", + "3f7675db bd0efc63 bdb0216c 3f83f661 3f1971c8 3f3ac865 3f30f042 -> bccd8073 bd7d22ec 3f3da84d", + "be7361ab 3f71bcac 3f992fd4 3e03605d 3f1bdbaa 3f782e13 3f1bdbaa -> 3f7ca678 3fa01a3c 3e094eb9", + "3ed4b372 3f6b434e 3e0cd6f8 bd5b0ba4 3f7f600f 3e841686 3e841686 -> 3f739e42 3e11d774 bd62d322", + "beb52cd1 3f652062 bd1c07f9 3f914663 3e66e58f bdbb03d2 be4004cf -> 3f930c66 bd484648 3fba77f0", + "3c590e61 3d850721 bd134192 bd134192 3f98e7f9 3ed57e08 3ed57e08 -> 3da3ad45 bd352ee9 bd352ee9", + "3fae89b2 3f05caee be6df0c3 3ebd5e10 3f86befc 3f86befc 3df8d89c -> 3f9f6a25 bf0dc0ed 3f61a1da", + "be9b0234 3f379869 3f379869 3da52909 3e9d41d0 3f7fac62 3e9d41d0 -> 3f21c60e 3f21c60e 3d91879c", + "3e45fa72 3f2fc3ee 3f1db315 3f009513 3f000000 3f800000 3f000000 -> 3f3f471c 3f2b9e17 3f0bee38", + "be35832e be751f40 3f995690 be751f40 3f1bcdcc 3f1bcdcc be4159d2 -> be853fb2 3fa6b5b7 be853fb2", + "3e2b88de 3e202275 3f198435 3f198435 3f337cbf bc810648 3f337cbf -> 3e24ac30 3f1dddee 3f1dddee", + "bd1d2ff5 3f99d6f0 3f40f5f6 3d872e78 be2f13ef bdccd3cb bdccd3cb -> 3fa03c0f 3f48fb65 3d8ccd14", + "3e592f57 3f9fef45 3f1f7556 3f9fef45 3e5841e1 3e5841e1 3eaa2d45 -> 3f870969 3f06a276 3f870969", + "bedc3f21 3f89ae4a 3f46f609 3f4bf6b1 bdbda582 be19f91e 3e8f77e4 -> 3fb57a5a 3f83203c 3f866c41", + "beecfb4b 3f93e521 bd84b1f6 3f3f695b 3d8ae28b 3f199b3a 3f199b3a -> 3fb4ccdc bda237e8 3f69ffb2", + "3e878618 3c721e82 3f964e3e 3f964e3e 3f6a67c9 be12c7aa 3f6a67c9 -> 3c640142 3f8d8b20 3f8d8b20", + "be811db8 3ef00bd5 3f379a85 be7f68b3 be3145aa 3d0442c2 3f72e583 -> 3edc7f45 3f28a6af be6a9bd9", + "be8bc5ff 3f330d76 3f77f867 be7f4143 3e8f8ccf 3e8f8ccf 3f302756 -> 3f413593 3f85c9b8 be89b7df", + "be04a171 3f65764a 3f65764a 3f8e312a 3f800000 3f000000 3f400000 -> 3f686dae 3f686dae 3f9007bd", + "3eb994e5 3de4a100 3f0854dc 3e0c9644 3eec55db bd42702a 3eec55db -> 3dd99684 3f01bf6e 3e05cc39", + "3f13d1df 3f4617a0 3f58a7b3 be11f9a4 3eb96e34 3e3023ab 3c43c5d1 -> 3f04a891 3f1116f0 bdc3836a", + "3f8b0ff6 3e17b7b6 3f74749e 3dd8ef98 bda19b08 bd5b0248 3c794e77 -> bc27c4d1 bd8728be bbefe320", + "3e62b88e 3f4e5bcd 3f4e5bcd 3f923aef 3cb03dcb 3f968b44 bdd56b53 -> 3f4fb4d8 3f4fb4d8 3f932f70", + "3f9f16a8 bdee50f4 3f8375f2 3f9a6185 3f4bd55a 3f337d97 3f5dbd12 -> bd9ad57e 3f2ad1e6 3f489a39", + "3fba6d2a 3f5f0ccc 3ef8c75e 3ef8c75e 3f10beca 3f80e8cf 3f10beca -> 3f88d83a 3f18a131 3f18a131", + "3f3e1b59 3e8baccf 3f0a7d1f 3e8baccf 3f2ee90b 3eae8d22 3ea78ff2 -> 3ea6f41d 3f25891d 3ea6f41d", + "3f2b2ef2 be46b359 3f7d02fb 3f7d02fb 3e76279c 3e102e99 3e76279c -> bdc44c6f 3ef9f3fc 3ef9f3fc", + "3faa8bf3 3f05bfb3 3d813744 3ecf9c92 3f513ab3 3ea04116 3eded265 -> 3f6a5195 3de26092 3f35dc4f", + "3fb5200a 3f49c131 3f903c3f 3dc248c5 3f800000 00000000 3f800000 -> 3f299e92 3f7285fb 3da356bc", + "3e8c93de 3db68868 3e478a3b 3f95f866 3f848a2d 3efc7718 3efc7718 -> 3db0b532 3e412c27 3f912f3a", + "3ef1a2ca 3f8f104a 3ed49b94 3f8f104a 3f74845e 3d0c080c 3f8dc783 -> 3f8e7520 3ed3b4fe 3f8e7520", + "3f6a0b90 3edd2e22 be46b445 3edd2e22 3db44bed 3db44bed be18ab28 -> 3df0b571 bd583f8c 3df0b571", + "3f97e32d 3c2a8914 3c2a8914 bde9ba92 3f98558f 3ece920a 3f93d200 -> 3fb483a5 3fb483a5 c17767c0", + "be0e28b2 3f6cd680 bdbc86c0 3f4bfbfb 3eb6d093 3effb9c8 3f66a102 -> 3f6db32a bdbd366d 3f4cba03", + "3e92babb 3f473021 3e936e0b 3f2764e1 3f051924 3afcc09d 3f051924 -> 3f343f78 3e856949 3f177a29", + "3ece433f 3ec25b1a 3ec25b1a 3f7f5f83 3e800000 3f000000 00000000 -> 3e9b4d9c 3e9b4d9c 3f4c0f5a", + "becc65d0 3f834ed0 3f90049c 3f1e47a5 3f32071e 3cb6a5ec 3f5bc2c0 -> 3f8fbbbe 3f9da570 3f2d41f8", + "3fbb7283 3f98fcf7 3f3ecc8f 3f3ecc8f 3f2b3412 3f2b3412 3f819c7c -> 3f6d8233 3f141ab5 3f141ab5", + "3f93eb6d 3ed3f8f0 3f0c7063 3f801e60 bc3b6355 3ecababc 3ecababc -> 3dffa9ea 3e2962ce 3e9a86b6", + "3f2af7cc 3f878022 3f907474 3f907474 3f8f6d1e 3f624882 3f624882 -> 3f86db2b 3f8fc496 3f8fc496", + "3fa526a6 3e5c58ef bd882dad bd882dad 3e36bf60 3e36bf60 3f873fb5 -> 3fa6826e becdcfb6 becdcfb6", + "3fbef93f 3f957f35 3e3ccd16 3f957f35 3df8260a 3f8a4dec 3df8260a -> 3f84cc42 3e27b636 3f84cc42", + "3ef0882f 3f1ce6cb 3f2f49e3 3f83bd99 3f277be1 3eaad89d 3f6fa703 -> 3f163c3a 3f27d755 3f7c4965", + "3f6f760b 3f5af9f0 bdfc970d 3f3829dd 3f1dd088 3f8f0f18 3dcb55c0 -> 3f8ce3df be228472 3f6cfb9c", + "3f6ff4a2 3ed3716a 3e93d4f0 3f173299 3f400000 3f400000 00000000 -> 3f0476aa 3eb939bc 3f3d715a", + "bef2ba84 3f832f42 3db62abb 3db62abb 3f2aaaab 3f2aaaab 3f2aaaab -> 3f98ebf6 3dd45a08 3dd45a08", + "3e87b2bb 3dcab9d0 be3af416 3ed1f161 3f800000 3e800000 3f000000 -> 3e0c03c4 be811f18 3f10ffd6", + "3f9bc927 3e86ff26 3eba7711 3eb48596 3f88df45 3f88df45 be2e660f -> 3f628dca 3f9c76ed 3f977a3d", + "3da4f931 3f4b09ec 3e26f315 bdc17083 3f55587d 3e70c2bf 3f55587d -> 3f4bde78 3e27a1db bdc23afd", + "3f8d2be0 3e79105e 3f18f319 bcc92a72 3f6728dc 3f63c207 3f6728dc -> 3ec2c36d 3f6f3521 bd1d4ed8", + "bded2756 3ef09ae1 3f1603ab 3f23bf92 3f5eb9c6 3f5fc103 3f5fc103 -> 3ee66528 3f0fa60a 3f1cccc0", + "3fa8fd6b 3f55b03c 3ef2be37 3f860da4 3edbbeab 3edbbeab bcdd46f7 -> 3e3cbcdb 3dd6665f 3e6ccd4a", + "3fb6a40a 3f176092 3ec686db 3f176092 3f3b65ad 3f220a13 3f167d46 -> 3f4ac5fd 3f04f736 3f4ac5fd", + "bd4bab15 3f81a2e7 3f189bb3 3f359ad6 3f12274f 3e8af288 3e8af288 -> 3f8472dd 3f1beb3d 3f398b6b", + "3e59c5fe 3f0bd881 3e731795 3e731795 3f80de14 3f38878d 3f80de14 -> 3f24eaca 3e8f5633 3e8f5633", + "bc0156a6 3f80d633 3f2de6e3 3f558997 3e800000 00000000 3e800000 -> 3f8199e6 3f2eef0a 3f56cdf2", + "3f876fcd 3f4c05b6 3eb064a9 3f66f485 3e2aa3bc 3f8ef52d 3f8b3f35 -> 3f7f64ee 3edccee7 3f908de6", + "3fb48ea0 3f5c2837 3f491761 3f725100 bdcf7cbc 3cce09c5 bdbe3143 -> bea44a58 be961010 beb4d39d", + "3f777638 3daa845f 3daa845f 3f4938a2 3e93de39 3e93de39 bdf6139f -> 3d048008 3d048008 3e9c5bd5", + "3f7b6b22 3f5353f7 3f758603 3f0fa8b1 3f8fc9fc bdda179e bdda179e -> 3f76e0a6 3f8f69a6 3f27d342", + "3f429fea 3f817614 3e152410 3e6008e8 3f9c4f28 3f9c4f28 3c647b8b -> 3f95df5b 3e2ca7a6 3e81adb7", + "3f0d01e3 3e82c056 3efb21c1 3f9e1b6a bde7250b 3f387b52 bde7250b -> 3e497f52 3ec181a1 3f73a795", + "be94cd80 3e4ab09c bdb35979 be5d57cb 3f9def56 3f0cc191 3f9e996f -> bdd64e1c 3d3da08e 3dea06f1", + "3f5ff589 3f39fdba 3eb25ad3 3f61b1d4 bc23870f 3e19f94e 3e19f94e -> 3e4c1ed3 3dc3bd61 3e77b1aa", + "3bc415b2 3f6e33ca 3f6e33ca 3f9af36c 3d2f32cb 3d35f3ae 3d35f3ae -> 3f6cd446 3f6cd446 3f9a0ec3", + "3fb66ce9 3e1599f5 be2cce06 3f44ddc4 3f84ed3a be75b0e3 3dc4aa72 -> 3e6050f5 be818dd7 3f9397e1", + "3f7ca314 3f3a70a9 3f9c2ad7 3e8f6130 3f4b5b41 3f7d4133 3f48e60c -> 3f17a317 3f7e07e3 3e693ac6", + "3e56b17b 3f88dc2b 3e9d366e 3f88dc2b 3ec46c5d 3ec46c5d bda4a9c3 -> 3f6cec37 3e8813ef 3f6cec37", + "bd575abf 3e890ac8 bb4b41d0 3e890ac8 bbc36fb3 3e1758fa 3e1758fa -> 3e8c44c7 bb500b5a 3e8c44c7", + "3f8b4c85 3f9b84b2 3da992cf 3f4ece85 3efc5953 3efc5953 3d8813df -> 3edbb65d 3cef91ae 3e9215e7", + "3fb97167 3f29da1d 3f320cb1 3f320cb1 3f9ae8d8 3f0e4a14 3f0e4a14 -> 3faffbbe 3fb87a13 3fb87a13", + "3f86b648 3f96c5f5 3f085aa2 bcaf9539 be797647 be797647 3e193a3d -> 3dc4067e 3d314748 bae4480f", + "3f3e73fe 3e456c80 3f0bd20c 3f678a51 3f9bc39c 3f53ceee 3f788adc -> 3e7829c8 3f2fc160 3f918621", + "bec2bf17 3f1e8200 bd51d070 3f6a5810 00000000 3f000000 3f000000 -> 3f39de11 bd7607a5 3f89658f", + "3f8f6693 3ea2a746 3f92dac1 3ea2a746 3f8a9658 3f1cf887 3f199b57 -> 3e986523 3f8997b3 3e986523", + "bd3f598b 3ea9e2c3 3f092a9e 3f092a9e 3ef98c9b be36e2ba be36e2ba -> 3eaa9a4f 3f09bed0 3f09bed0", + "3f95f1a5 3f9670c8 3f93c782 3f5500eb be57864e 3f053c4c be57864e -> 3ed0fd64 3ecd4afa 3e93f362", + "3ed9db47 3f26ab96 3f7d5b58 bd7a1b7f 3f4eeb02 3edd61a9 3e3ad9c9 -> 3f19abde 3f6998d8 bd6699e6", + "3f681b7c 3e215965 3f3981e8 3f9f06fe 3f2f7d62 3f2f7d62 3e094e90 -> 3dbf8d50 3edc3b77 3f3ccba2", + "3dc97fb3 3f9545e5 3e95e7aa be180bde 3ebe9f6f 3f2c07d8 3f2fb87d -> 3f8f3b12 3e8fd649 be11e453", + "3ec4ef8a 3f844733 3ea9c6a3 3e95a0f7 3d323eb1 3f1b0089 3f646dfd -> 3f7aa917 3ea0dbc9 3e8dc504", + "3e0d3bde be008aa5 3f8d3b18 be323da3 3f84b6ee be7de4dd be7de4dd -> bdfef201 3f8c0e66 be30c222", + "3f0c855e 3ef8496a 3f22e3aa 3f836658 3e800000 3f000000 3e800000 -> 3eb2614e 3eea0dbe 3f3cce86", + "3f872d53 3ec318bb 3d55d68d be1be30d 3f800000 3f800000 3f000000 -> 3f847137 3e112a3d bed3a62f", + "3f884343 3e7418d6 3f850e1f 3ef06bb5 3f9e6ab1 3f494ea6 3f66f7ef -> 3e92d05a 3fa00dce 3f109a4b", + "3e340a82 bdd26317 bdd26317 3f153945 bdca5fcc 3f8778b7 3f8778b7 -> bdf08f44 bdf08f44 3f2a9fe4", + "3c0e4459 be65228c 3f2f666a 3f2f666a be582081 3f9595c6 3f9595c6 -> be6689fb 3f30798c 3f30798c", + "bdc41580 3db7a365 3f40442f 3f44728d 3f949698 3f4a8db5 3e66883e -> 3dae9f76 3f36d3ce 3f3acda1", + "3e939721 3ee84ae9 3ea59955 3f3e7069 3f4934ee 3f4934ee 3f96eff4 -> 3f07bccd 3ec1881c 3f5e8fd1", + "bef1653c 3f7f265f 3f46bfb5 3f7f265f 3e8e34a5 3f6aa6f2 3f6aa6f2 -> 3f846834 3f4e46da 3f846834", + "be113f12 3d7c793d 3d7c793d 3eb1f2c2 3eb80147 3f28d426 3f28d426 -> 3d5c5532 3d5c5532 3e9b4b76", + "3ef9722c 3e36802b 3d1b4519 3ef72fa8 3cac9e1c 3cac9e1c 3e79658b -> 3e0a70ec 3ceb91a2 3ebb829c", + "3e7e2019 3f6b18ab 3ed66320 3f6b18ab 3d905109 3e7546c4 3d905109 -> 3f3ff85d 3eaf0f57 3f3ff85d", + "3e3c969e 3f8c3317 3e720d25 3f0403c6 3df4951e 3f9e0ceb 3f219bdc -> 3f8f7cb5 3e77ba2e 3f071c43", + "3eb6b607 3f7f976d 3eae7629 3f5e51a3 3ec1b371 3f19c3f9 3f19c3f9 -> 3f5b410e 3e95a88e 3f3eb63c", + "3f6e9a48 3e8f0f91 3d4eb907 3d4eb907 3f0092bd 3f948b51 3f9f1d52 -> 3f96bb5f 3e59ceb9 3e59ceb9", + "3f41f776 3f59acd7 3f8e1781 3f8e1781 3f400000 3f400000 3f400000 -> 3f242cef 3f565675 3f565675", + "3f7a3e7f 3dd74085 3c7e517a 3c7e517a 3f60c35a 3e98ba95 3ea4b977 -> 3f5c5084 3e022656 3e022656", + "beab72bc 3e9416c6 3f6f5793 3f2d7901 3ee24771 3e877dea 3f439a2c -> 3e9d26bf 3f7dfd21 3f3816a3", + "bdd41da2 3f9f209e 3f8dd264 3f8dd264 3f692f8a 3e97e4f7 3e97e4f7 -> 3fa38866 3f91bf86 3f91bf86", + "3e813368 3f3fc1a3 3f3fc1a3 3edcd73c 3f481987 3f481987 3f88a8d8 -> 3f54569f 3f54569f 3ef48b63", + "bee6b82e 3ecee826 3ecee826 3f9f1c2c 3eab2686 3f758fe5 3eab2686 -> 3ee43201 3ee43201 3faf7b14", + "3d46bf35 3f5e2306 3f5e2306 bcd03a2c 3e19a53f 3e19a53f 3f56c165 -> 3f5dc756 3f5dc756 bccfe42a", + "3d20ce95 3f61e66a 39f368a9 3ed566bc be1ae21d be1ae21d 3c182bb7 -> 3f591feb 39e9f47c 3ecd1c94", + "beff082b 3f9b44c4 3f81e325 3dbbf896 be3125f2 3f7242a5 be3125f2 -> 3fac45f7 3f901cbe 3dd08ea2", + "3e112b6e 3de76bdd 3de1a67d 3de76bdd 3edeb877 3f930fc3 3f045168 -> 3e850c22 3e81bac5 3e850c22", + "be397b92 3cee5c5e 3e844369 3cee5c5e 3f783c93 3f6c7964 3f96bc4d -> 3c296d8f 3dbc06d8 3c296d8f", + "3f21c489 3f642418 bd825302 bd825302 bdff7d93 3e9876af bdff7d93 -> 3f042617 bd16fa7d bd16fa7d", + "3f85ecb2 3f7213bd 3f198098 3f198098 bdeb0602 3f54c903 3f54c903 -> 3f536dee 3f061187 3f061187", + "bd9c0077 3f31e550 3f92ca12 3f92ca12 3f800000 3f400000 3f000000 -> 3f33a159 3f943877 3f943877", + "3f190a98 3f104a88 3f104a88 3f026756 00000000 3f800000 3f800000 -> 3f53129c 3f53129c 3f3ec1fb", + "3f157191 3f3b1032 be22042c 3f578a12 3f4d6fb4 3e60bb9f 3f4d6fb4 -> 3f35f1da be1d9543 3f51a43e", + "3f772fc6 be13e0f4 be13e0f4 3ecb14ef 3e45d3bc bc074ce0 3f9c4046 -> bede4461 bede4461 3f989ea2", + "3e00888b bdd552ab 3f664202 bdd552ab be18c953 3f4a5650 3ed93059 -> bdd2137c 3f62c0d3 bdd2137c", + "3f7085e1 3d931127 bb91f35f bb91f35f 3f5cb76c 3f5cb76c 3f54884a -> 3f507be8 bd4ee6bf bd4ee6bf", + "3f3b5ffc 3e168d09 bd1ebe37 3e168d09 3dc5640c be5277cf 3eee8177 -> 3ec2bfc8 bdcd58a6 3ec2bfc8", + "3f94f11e 3f0c16b9 bd8454d5 bd8454d5 3f32c725 3f32c725 3e9520d2 -> 3f391b98 bdaedb8c bdaedb8c", + "3f95f1db 3f8922c3 badb62b2 3f8922c3 be1073f5 be1073f5 3d183851 -> be0f8246 396597db be0f8246", + "3f54a2e6 bdade835 3f8a92a3 bdade835 3f400000 3e800000 3f800000 -> bda2e2c2 3f81ca7a bda2e2c2", + "3f493dfa 3ed67754 3f07d21a 3f177d4c 00000000 3e800000 3e800000 -> 3e6a32dc 3e945139 3ea56d7a", + "3c21a841 3c2c3b2f 3f4e1a76 3c2c3b2f 3f98773a 3f02a8db 3f02a8db -> 3c2d0bd5 3f4f1418 3c2d0bd5", + "3f956bff 3f641991 3eac10ed 3f4915ee 3f572fd7 3cd90ac9 3f8c0313 -> 3f905b63 3ed9ca45 3f7e856c", + "3f108149 3d8db029 3f5cd5a1 3f5dc236 3e865f3a 3dc1b3a1 3f5b8c57 -> 3d8ce412 3f5b978c 3f5c82cb", + "be23135d 3f02162c 3f7ae44f 3f7ae44f 3ef700ac 3ec50e62 3ed914ea -> 3f0c9b05 3f8796f1 3f8796f1", + "bed28f48 3ed74885 3f1fb9e9 3ed74885 3f9dbdfe 3eca60f9 3e4ae9c0 -> 3e80f299 3ebf5770 3e80f299", + "3f0c99ab 3f73a298 3f646345 3f646345 3f612a0e 3eb0c581 3f612a0e -> 3f697d96 3f5ae0ca 3f5ae0ca", + "3f7c53fe 3eb62299 3eb62299 3e294bf3 3f4cc398 3f961c4d 3f717959 -> 3f949c4e 3f949c4e 3f0a229d", + "be6942ff 3f3f1be1 3ed06a8d 3ed06a8d 3f585818 3eae6c26 bd39d7e5 -> 3f395c47 3eca25ae 3eca25ae", + "be2a4d43 3ec7393b 3e60bd28 3ec7393b bd853275 bd853275 3f983974 -> 3e83172b 3e13e139 3e83172b", + "3fa656b8 3d1e6398 3ead06fe 3d1e6398 3d32898a bd7fdb24 bdabbcf8 -> bba72490 bd369712 bba72490", + "3f9205e3 3f88f51c bcd07bbf bcbe726d 3ecbd431 3e4aa9da 3e4aa9da -> 3e9b6456 bbec8b82 bbd814cc", + "3f349c35 3f5eecc9 3ea51c4e 3f5eecc9 3eedd957 3e76af48 3eedd957 -> 3f158d3e 3e5d8858 3f158d3e", + "3eff63a2 3f20d572 3f20d572 3e998939 3ef8710c 3f9a5841 3e9a5f7a -> 3f6a95d2 3f6a95d2 3edff0e8", + "3f590373 3f94231a 3f9f6ee2 3f94231a 3f930413 3eec841a 3f930413 -> 3f8a5b52 3f94e82e 3f8a5b52", + "3fa2735f 3f4053a9 be186e36 be186e36 3f58ce17 3f2620bf 3e6b4d94 -> 3f5f64ad be310d6f be310d6f", + "3dc59dee 3f02ec0e 3f9ca324 3f9ca324 3dc2f1a2 3dbdfd1a 3de6ca10 -> 3eeee7a2 3f8eea2e 3f8eea2e", + "3f2755e3 3f45e641 3f41f35f 3f0f2717 3e800000 3f800000 3f800000 -> 3f6be08a 3f672baa 3f2a9fd0", + "3fbc7605 3f459874 3f3a8454 3f95bc26 3eced3ee 3f8dacb0 3f8dacb0 -> 3f35ef37 3f2bbbe1 3f89de02", + "3fb84235 3e1d628b 3f5123f9 3f5123f9 3eed41c6 3efb89a5 3efb89a5 -> 3d8623a5 3eb24024 3eb24024", + "be76526b 3f416711 3f95e170 3f78adc1 3f8cdb0f be0e7c49 3f8cdb0f -> 3f443433 3f980d32 3f7c47de", + "bd1bade5 3f301b65 be1799ea 3f63603b 3e8df2bb be250aa8 be250aa8 -> 3f34b60e be1b908e 3f695203", + "be928cb8 3f8a1dbd 3ed25ef8 be093690 3f62a609 be169b63 3f4e54ee -> 3f91365c 3edd2df5 be10434d", + "3dab0fe4 3f0b492c 3ecdd21a be71f26e 3f800000 3f400000 3e800000 -> 3f1508d8 3edc39ea be8170c8", + "bc8a957c 3ea4b9bb 3ea4b9bb 3f7dbc60 3f400000 00000000 3f000000 -> 3ea56750 3ea56750 3f7ec7bd", + "3f83c48c 3f7a5ac6 3ef6dfa4 3ef6dfa4 3f23a813 3ebd6033 3ec3bce6 -> 3f211ac3 3e9edd50 3e9edd50", + "3eabfe6c 3eb8bc9d 3f002adb 3f800753 bddf9b50 bddf9b50 3dc49618 -> 3e80a270 3eb27d3c 3f324bbe", + "3ed67384 3f9a60fd 3f9a60fd be5fd117 3f2a9741 3f913b31 3f36cfec -> 3f968c20 3f968c20 be5a430d", + "3f9f85f8 bdf1ae42 3f599ea4 be569fe3 3f69dc8b 3f840b15 3f69dc8b -> be18ff3c 3f89c3df be87de77", + "3fbe83e4 3f4a1b87 3dc46b39 3f8b9675 3eae65c5 3efff824 3eeb29ab -> 3e1cc94d 3c985f8b 3e589280", + "3df338de 3f843d81 3e893285 3f0b9a35 3eed2d60 3ee917c0 3f8e6fec -> 3f857385 3e8a7427 3f0ce178", + "3f7c6a4f be1265ee 3efe0a4b be1265ee 3f718de9 3f718de9 bcd28b55 -> be8a474f 3f6ff356 be8a474f", + "3e83a5f1 bbafe797 3daa7469 bd39766e 3ed57f51 3e9c96b3 3f8e9b7f -> bcb807d5 3eb2541d be42079a", + "be590c20 3dbd2a51 3f6e94b4 3ea60ae4 3f76d9bb 3e0bee82 3f76d9bb -> 3dbbc68a 3f6cd3fa 3ea4d29b", + "3f8a5ff8 3d95d38a 3f9a74e8 be0afae9 3f41c8cd 3e49ab05 be7ffad8 -> 3d32ec67 3f3873e8 bda5f87c", + "3fa32123 be5c71a7 bc0993d2 bc0993d2 3f568b1f be4733a6 be4733a6 -> 41db87ca 3f8901de 3f8901de", + "3fb4a4c1 3eec709e 3f4d7b5e 3f3fa33b 3ed4e4b4 3ed4e4b4 3f198baa -> 3e9819b4 3f042f70 3ef68f09", + "3e74d80e 3f424846 be19dfbf 3f424846 3e800000 3f000000 3f800000 -> 3f510a12 be258fd3 3f510a12", + "3da97cb3 bd96b64f bd96b64f 3e184cff 3f40b2f8 3f40b2f8 3f2a1ca4 -> bdc95d02 bdc95d02 3e4b7c60", + "3f81816c 3f56371f 3f42ddba be1e7600 3f7c3f38 3f8d4863 3f7c3f38 -> 3f8daf4b 3f80e30e be519dbf", + "3fb4e11c 3eaa9217 3f0857d5 3eaa9217 be6f0bd6 3f009487 be6f0bd6 -> 3e9cd8cb 3efabf10 3e9cd8cb", + "3f71d36a be526d9e 3f95707a 3eb8e019 3e224bff 3ea6b9cf 3f91a843 -> be4d65c5 3f91dddf 3eb4749d", + "3f97b3a5 3f0cccb4 3f0cccb4 3dd1e445 3f95cb50 3f0cbf48 3ef0724b -> 3fa47ee2 3fa47ee2 3e75372f", + "3f6ebd4f 3f681754 3f681754 3f7c345d 3f692349 3f17d2b3 3f692349 -> 3f57ba60 3f57ba60 3f6a6c63", + "3f42d384 be0279da 3f15a7c6 bce408c8 3e84d148 3f92bfa8 3ec72e65 -> be61ea89 3f818ffb bd456b16", + "3ed28779 3f606b94 3f606b94 3f9af9fc 3f6bd3e6 3e9cd02b 3e9cd02b -> 3f4a5a04 3f4a5a04 3f8bbc9a", + "3f6f0ff7 3da5ac93 3da5ac93 3f974455 3e688269 3e688269 3f0035a3 -> 3d190d8b 3d190d8b 3f0bbe47", + "bed08b9b 3f82918b 3f1e7c77 3f1e7c77 3f3a7fc5 3f399b1a 3e6a7a68 -> 3f91c4e5 3f30efda 3f30efda", + "bdcdb305 3efe2e4c 3f02274d 3ee16663 3f87719c 3e0b9f29 bd8ea5f5 -> 3ee29365 3ee80960 3ec8ebac", + "3f0eb057 3f64f202 3f9c5294 3f9c5294 bd52a6e5 bd52a6e5 3f6606e8 -> 3f433955 3f854c3c 3f854c3c", + "3c7554b1 3f7d5079 3f7d5079 3f225df1 be446e2e 3f5a3547 3edce9d1 -> 3f7cc9e6 3f7cc9e6 3f2207af", + "3f04d081 3ec0e4e7 3e208883 3f759566 bd6a7697 3f9815a5 bdc41d0c -> 3ed8c487 3e3466d0 3f89fd34", + "3f05c91a 3f66c5c5 be3e8fb5 3ecedf04 be1a38cb bb375089 3f4d20ee -> 3f595efc be337ebb 3ec2db8c", + "3fb0e395 3d77ab7e 3d77ab7e 3e3cb6fa 3e83ab7a 3f1de5ec 3e83ab7a -> 3e835cec 3e835cec 3f482fd8", + "bec26ac7 3f2639df 3f2639df 3f4124b3 3ed68e00 3d4936a6 3ed68e00 -> 3f424985 3f424985 3f61bf9c", + "bc48b374 3e9fa9fd 3e055502 3e48a76f 3f146094 3edea151 3e71b4a6 -> 3e9dfc14 3e03ee00 3e468b2a", + "be9d6c99 3eab6be1 3e3750fb 3eab6be1 3f2ef442 bd8e234c be3ee199 -> 3e69159a 3df94214 3e69159a", + "becbacec 3f8a15e0 3f8a15e0 3ea509c8 3f9aad3b 3f9aad3b 3ee8ee2f -> 3f837c42 3f837c42 3e9d265f", + "3f9ccc49 3f6bb992 3f746d55 3c98aacd 3f0a2aa6 3f3e4ac2 3f39866f -> 3f2bc571 3f321ccc 3c5e7ec6", + "3edf8be3 3f20dffa be126332 3e78ca38 3f99f33f be754cd3 3f72150f -> 3f61117b be4ccccb 3eae082b", + "bd40fdd6 be5a3669 3dc3d4ca 3f1f778a 3f2ca512 3f499ed2 3f2ca512 -> be577ea6 3dc16460 3f1d7b16", + "3ad8601c 3f9d550d 3f64596b 3f8306e3 3eb709aa bc8def2d bc8def2d -> 3f9d25e7 3f6414fd 3f82df9f", + "be2dd5af 3f52a6f9 be25f705 3e2436bf 3f17b7ba 3f462277 3f17b7ba -> 3f54c6f9 be27a39a 3e25debf", + "3f74d5f7 3f9cb731 3f9cb731 3f54e847 3f054be0 3f9340ca 3f889545 -> 3f93aa6f 3f93aa6f 3f489cd3", + "3f475232 3f0389b2 3e8d8ff8 3e0a2e29 3f8911b5 3e1ab2ac 3f8d205d -> 3f78e25d 3f05ed05 3e82b9ea", + "3f77b1b9 3ee0fdd2 3e8e4932 3ee0fdd2 3f8f80ef 3e8ca39f 3e8ca39f -> 3f8cac35 3f31eca7 3f8cac35", + "3fa4efc1 3dd4128f 3dd4128f 3e387749 3ed5fe8d 3da16936 3f95890a -> 3f55df93 3f55df93 3fba084a", + "beac0866 3e0fa338 3ed6fd89 3e0fa338 bda71dbe 3d872e07 3e462737 -> 3e29a89f 3efdf006 3e29a89f", + "3f9c4123 be66b312 3f81bfa5 3e723bc9 3f27d827 3f27d827 3f6b5b55 -> be4c8029 3f66072e 3e56b992", + "3f917d87 3ea09363 3d90c184 3f9bf9c7 3f400000 3f000000 3f000000 -> 3e34c9dd 3d22fa34 3f2f9c04", + "3d8cee0e 3f113885 be1c6ad2 3bb4cb90 3f4ee681 3f27f317 3f27f317 -> 3f157714 be20fd27 3bba13e3", + "3f171683 3f8a585f 3e4d4e74 3f601d0d 3f9346ae 3f64e9b6 3f9346ae -> 3f8f9db8 3e5520ea 3f68a6eb", + "3e481de9 3ebf96ee 3ef9449d 3ef9449d 3f20129c 3f7ffdb6 3f7ffdb6 -> 3ee70d0b 3f164dff 3f164dff", + "3e49306c 3f62f999 3eab4166 3ec29b82 3f97cf4b 3f97cf4b 3da4fac8 -> 3f72089c 3eb69e0d 3ecf84c4", + "3fbaea60 be589255 3f5d21ff 3dd52239 3e800000 3f800000 00000000 -> be8537f5 3f880638 3e031a95", + "bdd6a91d 3ed9e748 3efefdb2 3ed9e748 3f0bae39 3f85aab2 3f0bae39 -> 3ec0da59 3ee1ad45 3ec0da59", + "3fa60480 3db685c9 3f4573fc 3e557c39 be6147ca 3eb6fa42 be6147ca -> 3cdde96a 3e701078 3d81c734", + "beeb85d3 bc19fb6e 3ef79cba 3dd3d944 3f4466c3 3f4466c3 3daa8ac7 -> bbe0e5a6 3eb4d2e2 3d9ab4eb", + "becfef7d 3e98d263 3f3e396d 3f857105 3f8f2d37 3f5699e9 3f082c8e -> 3e944b40 3f389696 3f817ce1", + "bdf6a4fd 3dbcc436 bc370c24 3f48f08d 3f4c4256 3f79a3ff 3cb401a4 -> 3db741a8 bc31b45e 3f431313", + "3f4382b0 3e992337 3f99d59e 3f04faed 3f400000 3f800000 00000000 -> 3e857f32 3f861ab6 3ee7d97f", + "3f9e53f8 bcf4d75c 3e97f03a bcf4d75c 3d36994e bde1a1d8 3d36994e -> 3ac8420b bc788b24 3ac8420b", + "bd1cf17a 3f441ad0 3f9c32ce 3f9c32ce 3f848113 be7edd1d 3f848113 -> 3f453e9c 3f9d1b39 3f9d1b39", + "3ddf7512 3e703308 3f86cc09 3e703308 3f9b16b8 3ecc90f8 3f9b16b8 -> 3e742505 3f8902d4 3e742505", + "be7254aa be3abdbc be24a9f1 be24a9f1 3deb6a66 3ee5333a 3f69f2c2 -> bef10a7a bed48b48 bed48b48", + "be251612 be30282a 3f100076 be30282a 3f767431 3e9a5964 3e18bf00 -> be1bf39e 3efef834 be1bf39e", + "3df7d5f2 3df5fe5a 3f2d28ec 3df5fe5a 3f03571f 3c07e958 3f03571f -> 3deecdde 3f281960 3deecdde", + "3f7cbd20 3e8d5b95 3f392cf5 3e8d5b95 3f0f83b7 3f9ea018 3f9ed74c -> 3ef13881 3f9dff3b 3ef13881", + "3f7f8e5a 3dc2924b 3f870a75 3dc2924b 3f000000 3f000000 3f800000 -> 3db871c1 3f800320 3db871c1", + "3fbb01df bd85a525 3ed7b457 3ee72051 3e2588c3 3e74352e bd0aaa55 -> bca62c5c 3e061a46 3e0fb0b7", + "3f5a4a47 bd4bfdcf 3f8cd060 3f8cd060 3f2327ea 3eed16fe 3f64cf1d -> bd2b5e5e 3f6c96e8 3f6c96e8", + "3f915857 3eeb17a3 bdd505d5 bdd505d5 3dbe1634 be276555 bddf19ff -> 3d30d590 bc203bd2 bc203bd2", + "3ef3e13e 3f96c27a 3f96c27a 3e829c40 3f8e9319 3f8e9319 3f10aa4d -> 3f92dc64 3f92dc64 3e7e771e", + "be893614 3f7e135b 3f5e5728 3f39af75 3f1300eb 3f1300eb 3f2be3af -> 3f8a0ce5 3f719d53 3f49c82d", + "beee2bfa 3f48725d 3f29f551 3f48725d 3f85bed4 3f85bed4 3f436683 -> 3f294259 3f0f83b1 3f294259", + "3e11fa14 3f5ea369 bd855d21 bda42a69 3f29c17c 3ed61e79 3ed61e79 -> 3f571981 bd80d913 bd9e9b5d", + "3e97dac8 3e96d7f8 3f0f22ad 3e81f7b2 3f2b8f5e 3f2addf0 bdc63869 -> 3e9fba63 3f1790e1 3e899f5a", + "bec4ae23 bdd95050 3d096dbf be287e18 3f9171f7 3f99b743 3f9171f7 -> 3fa7f20d bed46aae 4002371d", + "3f81c85d 3ef0c53f 3ef0c53f 3f999c96 3f061766 3ed4bcea 3e14c792 -> 3e4e6529 3e4e6529 3f03ae20", + "3f5f9249 3f8e8ace 3db8cfe5 3e9b4bc3 3f86937b 3f74f58b 3f8318e5 -> 3f8795cf 3dafcabb 3e93b768", + "3f7f849d 3f334178 3ee1b1e5 3f1eefb4 3edbeab7 be48ad06 3f31b0df -> 3f31b1a0 3edfba77 3f1d8d2f", + "be946567 3e7128e3 3f825f8e bde699d8 00000000 3f800000 3f000000 -> 3e726e9b 3f830fa5 bde7d157", + "3eb04073 3efba900 3e906be8 3f6c4452 3f9d2e83 3f7b5cf5 3e3c8f8b -> 3f0c25db 3ea0dad3 3f839352", + "3f2d931e 3f3b34f3 3ede0492 3f169e9d 3f324e91 3cb1e141 3e8b9470 -> 3f352c26 3ed6dc84 3f11c3ba", + "bdcf575c 3f9e45f5 3f5b5f60 3f5b5f60 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3fa9fa36 3f6b984a 3f6b984a", + "bec507a8 bdcb5304 3f577ead 3f47781d 3f68e0e9 3f32293f 3ef5aeb3 -> bdc50337 3f50ce1f 3f4146ea", + "3f07f3a2 3cab2396 3f0a0ab9 3f2ae4bf 3e800000 3f000000 3f000000 -> 3c9453d4 3eef4891 3f141d4c", + "3f090ee4 bce6ecb5 3f57c38f 3f57c38f 3f863144 3f863144 3f40b047 -> bd0289d8 3f73efb2 3f73efb2", + "3fbef0fe 3f20572b 3e57f3b0 3f20572b 3f19157a 3f19157a 3f2f9a91 -> 3f371bf4 3e769e17 3f371bf4", + "3e5933f2 3e6ee3ca 3eebb0b4 3f9aa41a 3f35341c 3f35341c 3f6f0174 -> 3e636043 3ee054ac 3f933013", + "3fbc30d5 3f0f7dfa 3d94fd95 bda56be7 3ef38666 3ef38666 3e08311d -> 3edf16b8 3d67a327 bd80975f", + "bed776ac be10369e 3f1c5a4b 3e9ff933 bd3fad05 bdf8b221 bdf8b221 -> be518d5d 3f63310c 3ee873e7", + "3d7a7565 3f692636 3f4aea7d 3f6cea61 be4ddba8 3f1af19f be217925 -> 3f643775 3f469f7a 3f67e739", + "3f5a7be6 3f8a8284 3f078521 3f8a8284 3e26555d 3e554980 3f17c1cd -> 3f2a1d28 3ea67121 3f2a1d28", + "3f6acc9e 3f6af936 3f31a551 3f6af936 be050cda be050cda 3f7c24d1 -> 3f7ab8cb 3f3d8d4a 3f7ab8cb", + "3eba8553 3edce000 3f05c014 3f1509a2 3f2f8a68 3e9493bd 3f2f8a68 -> 3eeb2f0c 3f0e6a3a 3f1eb150", + "bef46075 3f9be47f 3ecdd057 3f219f41 3f2b4bf1 3ed876f5 3f2b4bf1 -> 3fbd6b87 3efa13e9 3f4461b9", + "3ecb616a be223cdb 3f903b50 3ea69ef8 3f800000 3e800000 3e800000 -> be1afc2e 3f89c8b5 3e9f2c24", + "3fa57c4c 3f806368 3df78c1b 3f806368 3e8367ec bcb5299c 3f5473cc -> 3f4778c3 3dc04d57 3f4778c3", + "bedd3984 3f9fbff3 3d015f65 3d015f65 3dbb65ad be753ce3 3dbb65ad -> 3fdfb6b8 3d352c67 3d352c67", + "3f88920e 3f8ff360 3eb7e3c8 3f8ff360 bca2639e bca2639e 3f3f8e64 -> 3f391aef 3e6c766e 3f391aef", + "3fa581f4 bdbbeffd 3eb66a8e 3eb66a8e 3f2cb6dc 3f6a51b0 3f6a51b0 -> be8e4ede 3f8a2099 3f8a2099", + "3f7b2928 3e07fab2 3e07fab2 3f996886 3f24f607 3f4bcb02 3f24f607 -> 3db65da9 3db65da9 3f4dbd90", + "3f99998a 3e482619 be34fe55 3e482619 3ec00951 3ec00951 3f544273 -> 3f74b428 bf5d48c4 3f74b428", + "3e4e652f 3f522f93 bd824cbb 3f5f1bab 3f4cf93a 3eb8dd4d 3ef942bf -> 3f4ebe0f bd802a3f 3f5b73f2", + "3e83ee07 3e052d25 bdabbd0b be4d6b7b be7c0603 3f17342d 3f92b7ee -> 3ec8a72b be816070 bf1ac007", + "bd645297 be362421 bdaafe32 bdaafe32 bdd29de6 3f336f1c 3f784f5d -> be9b1f6f be11a0d8 be11a0d8", + "3e90c7ab 3f8ce440 3db2652b 3f2b3517 3eb08b1d 3eb08b1d 3f4f8b0d -> 3f826522 3da51ac7 3f1e73c5", + "bddbf020 3f12b02a 3f9b4d05 3f12b02a 3f800000 3f400000 3f800000 -> 3f15751a 3f9e3b95 3f15751a", + "3d2b47cc 3dd78d61 3f949f94 3dd78d61 3f2dc718 3eb6d894 3eb6d894 -> 3dd3cee9 3f920ab5 3dd3cee9", + "3f46e60c 3ed619f7 3e961ac4 3e961ac4 3e14fe02 3f7a5c07 3f7a5c07 -> 3f5a64e6 3f191d38 3f191d38", + "3f48cd08 bdcbe737 3f5fdf41 3f90fd9c bd09a7a8 bd09a7a8 3f7445b7 -> bdb2b14d 3f443150 3f7e20cf", + "3f084770 3e1d5a37 3e1d5a37 3f8406dd 3f915a01 3f063b09 be7957f7 -> 3e25ce6d 3e25ce6d 3f8b1ec0", + "3fa1745e 3f00c9a4 3f00c9a4 3e38bd29 3e34634a bd8ccee4 bc045054 -> 3db9c938 3db9c938 3d053ffe", + "3e216be5 3f486f0f 3f486f0f 3c20df1a 3f2bd641 3f2bd641 3d6b538d -> 3f43ed06 3f43ed06 3c1d40d6", + "3f6efbc5 3dbcfd0d 3e9f8aee be1cb7d5 be3d2695 be3d2695 3e837910 -> 3d9df2c3 3e8556b6 be02fa60", + "be7be410 bdb18b2d bdb18b2d 3ef173eb 3e6e1d23 3f443dd6 3f9e6c1a -> bd55318c bd55318c 3e90f7bc", + "3ca03fe9 3effb7ed 3d18e84e 3f227b5c 3e4146ec 3e4146ec 3e72dd8e -> 3efc95e4 3d1708bc 3f207dbd", + "3fbc1188 3f1574dc 3f1574dc be28e67c 3f000000 00000000 3f400000 -> 3f53f70c 3f53f70c be6f8a80", + "3f3815fc 3f88d26a 3f565d47 3f8f82fc be4b6c5e bda5819d 3f415537 -> 3f5169b4 3f240c3b 3f5ba6e2", + "3e28eb5e 3e930731 3f7ed98c 3f70fd86 3f8833c7 3eb2df27 3e12a6cc -> 3e94b2e0 3f80df70 3f73ba8a", + "3d543acf 3dba1b7a be7255d2 be7255d2 00000000 3e800000 00000000 -> 3dcafe3c be84294d be84294d", + "3f63ee44 3daf6e30 3f82552b 3f822f1d 3f30a767 3f5a01c5 3f5a01c5 -> 3d95de62 3f5eaf29 3f5e6e25", + "3f30efec bdf595af bdf595af 3f88d77e 3f31fb5a be3e5647 3f2ebfb9 -> bdba3b07 bdba3b07 3f4f89cc", + "3f3e7372 3f781bcd 3f781bcd be70ba11 3effe9aa 3e96669d 3e96669d -> 3f1eb8b2 3f1eb8b2 be19ffcd", + "3f6e7f51 be6a7de7 3dfcfa7a bc56e55b 3f86a884 3deace22 3f86a884 -> bfea928c 3f7d10c0 bdd6f828", + "3f95b0ca 3f92bb16 3f8fd16f 3ebb24b1 3d9ebfde 3f620638 3f2dca7b -> 3f5698b5 3f52562d 3e88d9ac", + "3ea5a4e7 3ef5b1a4 3e618dcf bdbe9844 3f532395 3e45d656 3f532395 -> 3f176959 3e8b0003 bdeae981", + "bd6cf290 3e0dda9c 3effbde7 3e0dda9c 3f03b946 3f84c07d 3f03b946 -> 3e05057c 3eefd16d 3e05057c", + "3e8eb004 3f64c4d2 3f87c9e2 3f64c4d2 be01dc4e 3f9e3dab 3e9bbd90 -> 3f6f4f7e 3f8e0bb7 3f6f4f7e", + "3f2266c4 3eb5d83b bdc11bef 3f577bd6 3f3a7549 3f268e9f 3e085ec0 -> 3ea64e46 bdb09b9a 3f45120a", + "3e950811 3f103fbe 3e8104e6 3e8104e6 bd774002 bd774002 be694eee -> 3ec386d6 3e2ee208 3e2ee208", + "3eafc86f bd3e7807 bd3e7807 3f2ddf82 3f6c62ba be56be58 3f6b7103 -> bd55fac3 bd55fac3 3f4355d4", + "3f0583e7 3f28714f 3e727bf6 3e727bf6 3f800000 00000000 3f400000 -> 3f561b8e 3e9a1c6c 3e9a1c6c", + "3fba0e48 3f353af4 3f8ff9ae 3f97f16f 3f1efbd8 3f032801 be2835d8 -> 3e5e79d9 3eb0be03 3eba85fe", + "bc1da321 3cb50a09 3d9f8f21 3d9f8f21 3f800000 3f400000 3f400000 -> 3ca06c79 3d8d63be 3d8d63be", + "be7b9161 3cb0c3d9 bdb40609 3f9ee761 3f2e051e 3f2e051e 3f95919f -> 3cb35032 bdb69f31 3fa13279", + "3f9f1777 3f5d2661 3f2cf9d7 3f5d2661 3f051f70 3e137975 3f530b4e -> 3f5096e6 3f2326cd 3f5096e6", + "3f086ed4 3f33be38 3edb8bfb 3f33be38 3e9950e9 bdd91a36 bdd91a36 -> 3ef99c0e 3e98714e 3ef99c0e", + "3fbcbdca 3e2028dd bdf3327e 3ad1a018 3f402fa0 3e8c36fd 3f402fa0 -> 3f843160 bf48bb0b 3c2d0522", + "3fa5215e 3e49ca4d bdc03ced 3f62852b 3ecb3e40 3f681a62 3e9f7d72 -> 3e5034da bdc659b5 3f69b8f9", + "bef7fe0f be076ac4 3f8095dc be4c6777 3f5b1251 be293a82 be293a82 -> be112256 3f89cff1 be5b1254", + "3f774eb7 3ee7e02e 3f8fff8a 3e2cc369 3f9d87d1 3f4663a5 3d69b6fc -> 3efced2c 3f9d1230 3e3c7293", + "3e970057 3e9201a9 3f11ac4d be0992b4 be3c350b 3e8e4b88 3f4bf106 -> 3ea33b07 3f22db9c be19cd64", + "3f3a8c2f 3ee3d11b 3d1a22b5 3e154029 bb0da942 3f5b8875 3f5b8875 -> 3f3ee093 3d8124a7 3e7a19bb", + "be68b0ed 3f58fcf0 3f3fe558 3f30cff6 3f000000 00000000 3f000000 -> 3f6d359e 3f51c767 3f414a2b", + "bec1b26c 3ea89f2d 3ea89f2d 3e854b34 3e456a4a 3ed8af00 3bccccd4 -> 3e967076 3e967076 3e6dd765", + "3f4058ad 3f54bbad 3f54bbad bdae771b 3edd5a09 bd72ece5 3e226281 -> 3f080d54 3f080d54 bd5f27fb", + "3f974c33 3f29d433 3f2cdc48 3ba7de59 3f81ba19 3f81ba19 3df01fc0 -> 3f8731b6 3f899b86 3c05a240", + "3f5b8745 3f33cd36 3c91a54e 3e472b85 3f807e4f 3f807e4f 3da13803 -> 3f75fd8d 3cc742b4 3e883e93", + "3f7d9d70 3f4394c0 3eed5c50 3f553b96 3d582807 3d582807 3e8ed3be -> 3e856d6c 3e21ee0c 3e917839", + "3facefc7 be3bff71 3e40f2b1 3ec3468f 3f000000 00000000 00000000 -> be857dcf 3e89019e 3f0aa8c0", + "3ebb5f8e 3f78ac2c be5520e6 3f9c1f8f 3f738b33 3eb1d0e2 bcd407f1 -> 3f64a61f be43f78a 3f8f8d4a", + "3f907ebe 3f8e3cb5 3f95360e 3e1c01c9 3f862532 3f7170f9 3f210a6c -> 3f7c0ca6 3f84342c 3e0a399c", + "3e18bea3 3d30e20f 3e5fb788 3f2322fa 3f0f814e 3f7cff7d 3f12c37a -> 3d3f6aa6 3e721941 3f308a70", + "3fb0d694 3ccdc0e0 3ccdc0e0 3f8573bb 3f83d06e 3e53596b 3f710251 -> 3cca43a6 3cca43a6 3f833072", + "be310518 3f1433f3 3e978c84 3f2a35d0 3f1f1dfd 3e1eb248 be31d5b9 -> 3f15df65 3e99419d 3f2c20bc", + "3ed54176 3e89bc92 bc96e847 be5be002 3f0438d2 3f8ed3d0 3f0fc248 -> 3f1f29c3 bd2e61d7 befe1443", + "3fa4f0d5 3f9794b1 3f9794b1 3f93d44c bd1b7925 bd1b7925 3f25d682 -> 3efc69a7 3efc69a7 3ef62a67", + "bccdc56b 3f4f74f0 3ef9a7ec 3e5baec5 3f494e20 bd96918f 3f494e20 -> 3f4f9c80 3ef9d788 3e5bd8aa", + "3f6e1fe7 bd30ab2f 3e069cee 3e959bac 3ec744eb 3f8df2f2 3f90a688 -> be21f89f 3ef6d418 3f89296c", + "3f5944b2 3db2bfd7 3ede92b3 3ea93f24 3f254fa1 3f3e676e 3f60b31b -> 3e26ad48 3f4f8a6e 3f1dd0e2", + "3f1fc347 3f675580 3f675580 be680356 3f38dd81 3e5487fc bde712f3 -> 3f4a5586 3f4a5586 be4aed92", + "3f957e39 3f5d767b 3f7f5ec8 3f9c8f60 be4eb5bb 3eb3fade be4eb5bb -> 3e149809 3e2b5837 3e5217bf", + "bebf96b1 be6f40b5 3f3c4ac7 3f81e4b4 3dd3d65d 3ece1736 3ee87d63 -> be905c2d 3f63390e 3f9cbff3", + "3e825e30 be74c4b8 3f8f6943 3f58f67d 3d8cfdbd 3f6f036c 3ce439eb -> be6a6140 3f895312 3f4fc123", + "3fac18c5 3ef1657a 3f8a63b5 3ef1657a be6c9526 3cdfe47f 3cdfe47f -> be15ea82 beabe3d2 be15ea82", + "be965516 3f745fc6 3f745fc6 3f842aed 3c01d866 3f3dac8e bc2edfac -> 3f8451ff 3f8451ff 3f8f20ee", + "3f04d905 3f908bc0 3f16fdc3 be5f7ee9 3e1d9689 3ebe699f 3f3e8cd8 -> 3f6df478 3ef890c1 be37f649", + "bd8592cc 3f5ae2ee 3f32da6f 3f97aa0a 3ef85650 be79eb87 3ef85650 -> 3f63518f 3f39be40 3f9d81ba", + "3fb3e6d3 3f756c08 3f756c08 bd61aee1 3f6c4238 3eca64f3 3f4c1463 -> 3f688b08 3f688b08 bd55d701", + "3f4f723e be2fa5fb be2fa5fb 3e00040c 3ee9b4ef 3f4a5b33 3f4a5b33 -> bf69517a bf69517a 3f2a0bf5", + "3e86ce0e be2c42c9 3debd1cf be2c42c9 3f4eb58b be15683a be15683a -> bede7a18 3e984828 bede7a18", + "3f9c0c26 3f98d1d3 3efe8c8e 3e2006f7 bcea1c7e bcea1c7e 3edf62af -> 3e8a63db 3de68392 3d10eac6", + "3e54ae4c 3f1cdc80 be678cb0 be678cb0 3f449260 3f0de854 3f449260 -> 3f251bea be73b971 be73b971", + "3d509045 3ec87fcc 3ec87fcc 3f7f6ce5 bd3b5bfb bd3b5bfb 3f007ccd -> 3ec36cf3 3ec36cf3 3f78f63c", + "bde9c555 bd74eb84 bd74eb84 be31ee12 3ea0de5e 3f21e26a 3f21e26a -> be0e2208 be0e2208 bece8399", + "bd5911f2 3f8f31ac 3e0a82a5 bcfb0249 3f84aa44 bd576e2e 3f84aa44 -> 3f8fc085 3e0b0ccf bcfbfcb9", + "3ebbc1ba be368232 3dee3fc9 3d8a7c81 3e907177 3e907177 bd41d596 -> be8af177 3e3560dc 3dd2dbcd", + "3f596fdc 3bd9fff4 3bd9fff4 3f1ff768 bd9e87b0 be058c96 3f2239bc -> 3bdc9d64 3bdc9d64 3f21e29e", + "3fba0f1c 3dd727b3 bdc38bb9 3f95d830 3d612a43 3f03a497 3e79ad8d -> 3c9f2623 bc90a4f1 3e5dada8", + "3f93f57c 3e4bc562 3f69bf8e 3f4c34d8 3f3414b1 be146f54 be146f54 -> 3e15b0ec 3f2bb667 3f1602ce", + "3efc82f6 3f044725 3f044725 3f818d8a 3ce57008 3f58d2b8 3f828070 -> 3f04c176 3f04c176 3f820556", + "3f61aafa 3f55ab8d 3f4c76f7 3ce0dab2 bcfb6fd0 3f9285ce bcfb6fd0 -> 3f8dd1ff 3f87b5da 3d153e60", + "3f12e58c 3f759370 3e36393f 3f63fde5 3d8da2cc 3f5ebbf9 3f96b3d7 -> 3f8ace46 3e4dfeaf 3f80dde2", + "3fa666ad 3e2ccdc8 3f633ea0 3ec6f610 bcaf3e88 3ee9a7aa 3ee9a7aa -> 3d7e98b2 3ea7671d 3e129141", + "be86aa88 3f74d21e 3eb72ef9 3e6610b2 3e800000 3f000000 3f400000 -> 3f815b5a 3ec19421 3e731ee9", + "3fa44060 3ec8a1a5 3e5cb964 3ec8a1a5 3d5bbf19 3f694da9 3f39d0ed -> 3f877bd4 3f150d55 3f877bd4", + "3f45bd2d 3f80784e 3f9de7ff 3f80784e 3f8b5f56 3f60c831 3f8fb4c1 -> 3f6f17a5 3f92f012 3f6f17a5", + "be46df03 3f96f92c 3e14557b 3e2feef6 3e800000 3e800000 3f800000 -> 3f9b6f5b 3e18b7b1 3e3521ed", + "bdaa1529 3ef7da01 3f235766 3ef7da01 3f17600c 3f17600c 3e71a592 -> 3ef95c0b 3f2455cf 3ef95c0b", + "be4e7221 be1617f5 3ea48a74 3ea48a74 bde5dba8 3f2510e8 3f875002 -> bda1a11e 3e312fe1 3e312fe1", + "3f7f02e2 3eba5f79 3e8dd7ce 3e8dd7ce 3f85cff6 bdacf43e 3f43d5f7 -> 3f8579ba 3f4b2b28 3f4b2b28", + "3f1e9bdc 3f39dab7 3f39dab7 3eaa2a64 be37bfc1 3ecf506f be37bfc1 -> 3f06ed81 3f06ed81 3e771369", + "3fb6fd58 3f217502 3f83e9fb 3f217502 3eaf46c4 3eaf46c4 3e404c55 -> 3ce9f106 3d3f22a8 3ce9f106", + "beb663dc 3f0e4e4c 3ef2b10d 3f0e4e4c bd02f096 3daf84ff be3c5a9a -> 3f392f12 3f1de88c 3f392f12", + "3e2fed01 3ed144d3 3ed144d3 3f6a2b0a 3e9037f0 3ee1c0db 3e89d508 -> 3ebea57c 3ebea57c 3f555478", + "3fb982bb bd4ea917 be70c2a7 3eda7837 3f89f1e7 3f89f1e7 3d6f4363 -> be25e77c bf414763 3faf6258", + "3c5c3d38 bbc57c4d 3e01f60b 3f9bb831 3f9ae7fb 3ea0a1ca 3f9ae7fb -> bbc578fa 3e01f3bb 3f9bb565", + "3f07e481 bdd194db 3f5d6fb8 3f3e8b56 3f9dc4c1 3f8c20ba 3f2091dc -> be006ded 3f87b1a8 3f6986f3", + "3f94a6ff 3f871d9b 3f3c6fe0 be489e1c 3f8e5b56 3f99d858 be05ca42 -> 3f9cddf5 3f5ac5b1 be68e9e6", + "3fa1bf81 3f550bac 3f928c53 3f928c53 be499413 be499413 3e66c6ec -> bc4b57e9 bc8bdfd0 bc8bdfd0", + "3f5d8197 3f574696 bd053bb4 3e86c459 3f400000 3e800000 3f400000 -> 3f4322de bcf18998 3e745186", + "3fa2949b 3d3a49ee 3eaa2dd6 3eaa2dd6 3f400000 3f000000 3f400000 -> 3df1cae2 3f5ce208 3f5ce208", + "3e901e79 3ef26484 3ebc52b2 3f0af66e 3f7152f1 be067360 3f991612 -> 3f223edc 3efc1ba9 3f3a077d", + "3f793ab1 3f31c8b4 bd9affec bd3944db 3f45aae9 3f9f24d3 3e13cac2 -> 3f9d492b be0920eb bda3e837", + "3f23ffc4 3ea2c5b4 3f22ed84 3e2bbe14 bc30f7eb 3f2c2791 3f2c2791 -> 3ea8ad6e 3f28d6b2 3e31f921", + "bde53d47 3f3915dc 3f9bd7e9 3ef1ed04 3f82abd6 3f67c0b5 3f82abd6 -> 3f3c6e82 3f9ea937 3ef64cbf", + "3f669013 3f8b8492 3e2555b2 3f8b8492 3f9b3db0 3f773504 3f773504 -> 3f99adbc 3e361da9 3f99adbc", + "3e149f03 3f7e5a26 3d1d2ae4 bdec4d3d 3ed49641 3f7ea0e2 3f47df8a -> 3f7e646a 3d1d312d bdec56cf", + "3f4c24a9 3e7ab459 3e7ab459 3f9eb219 3edff308 bbb6646a bbb6646a -> 3df2a176 3df2a176 3f1995c4", + "bd3a8c9a 3f97ddc8 3f884fec 3eb9c726 3ef3f587 3e8abbbf 3e8ca368 -> 3f9c0157 3f8c06f6 3ebed74f", + "3f82d938 3f9a38c2 3f9a38c2 be719146 3e800000 3f400000 00000000 -> 3f3d689f 3f3d689f be145772", + "3fb6207d bd524f68 bd524f68 3ceada02 bccdb7f8 3f84201f 3f096c4f -> c026f64d c026f64d 3fba71f7", + "3f1ecf3a 3f22e710 3f22e710 3f102d59 3f4b3ea0 3f03dd28 3f03dd28 -> 3f3bedc3 3f3bedc3 3f26539b", + "3f232ea3 3ede4380 3f07a499 3ede4380 3f8c4149 3f8c4149 3d99e87d -> 3f3ac9b3 3f63fc53 3f3ac9b3", + "3e957366 3f892dd9 3f99446f 3f892dd9 be47d7b8 be47d7b8 3e14f478 -> 3f4c00c3 3f63eda1 3f4c00c3", + "bcd5bb05 3f8507d2 3e4a920e 3f200c0f 3f800000 00000000 00000000 -> 3f85296b 3e4ac538 3f20347d", + "3f103b2a 3e360838 3f96e60e 3e360838 3d6d2eaf 3edf02f5 be3df2a7 -> 3deabbd3 3f429627 3deabbd3", + "3fa60cf6 be01ca44 bd998e81 3f0b0aaf 3f0316aa 3e6d5c97 3e6d5c97 -> bdf05181 bd8e2986 3f00b96b", + "3ef6a305 3f7e7f8d 3f7d887a 3dd4a1c8 3eed5eda 3f9de6cb 3ed6640a -> 3f8e03c8 3f8d79e9 3ded4e26", + "3fa65e34 3f0e634f 3f821955 3f61f660 3f88862a 3f92d0eb 3f92d0eb -> 3f262b1d 3f97d3b9 3f83d9b5", + "be2033de bdd00756 3efb6bbe 3f96e089 bd0737d1 bd0737d1 3ed287c7 -> bde53891 3f0a8449 3fa63f4b", + "3eda2bf2 3f37c3f2 3f1ecb12 3f91e162 3f4e273c 3f862a59 3f4e273c -> 3f317a22 3f195c04 3f8ce372", + "3f95b77d be510b3b 3ea6bb25 be510b3b 3ee40449 3d041727 3e5a6b8a -> be9575a9 3eee6a24 be9575a9", + "3f3d4995 3f03aac3 3f84af62 3ee5e1fc 3f400000 00000000 3f800000 -> 3f003abc 3f81388e 3edfe184", + "3f939981 be1226a0 3f4a44de be1226a0 3ef5c04e 3ef5c04e 3ebd01ea -> bda0004e 3edd6ffc bda0004e", + "be1a21f0 3eaa5baf 3f12705d 3a9292d0 3e4bc4b3 3f9feb56 3f939a6f -> 3e8bfeab 3ef0ad75 3a70e3fc", + "3e72293e 3e6e7ac6 3e9fba3e 3ed4631c 3f3ef16c 3f99fc59 3da74de3 -> 3eacd1cf 3ee78011 3f19e93e", + "bebd855f 3e06020e 3e99f82e 3f13d52f 3f7d22e9 be759783 be759783 -> 3dc55931 3e62bea9 3ed9b51f", + "3f4b18cf 3e97bf26 3f4f43c2 bdc25102 3ea463b9 3f3e70a0 3ec918e8 -> 3e8df95c 3f41eab4 bdb5cd68", + "3eafd44b bd17e56b 3f8fe541 3c34f555 3f3c89ff 3f6b3f28 3f89ce7c -> bd15b04e 3f8dcdf2 3c3253e7", + "3f7b0af4 be34d469 be34d469 3e52f0d6 be3956a1 3e1f6b75 3f713972 -> bf4ba95d bf4ba95d 3f6d9310", + "bee02f20 3f6313a2 3e6ef09b 3f6313a2 3f2666ca be03c2db 3f2cd095 -> 3f7ad5f7 3e83f859 3f7ad5f7", + "3c9ebe86 3f81dea6 3e991b17 3f303993 3f504683 3eb18c37 3f816835 -> 3f81dc5a 3e991862 3f303677", + "3f8034af 3e8172a6 3f66ec25 3e286e9e 3f9cfd9c 3e8b5f08 3f8cebe6 -> 3eb0153d 3f9d0eb4 3e651c93", + "3decdfb9 3f76b79f bdc3565f 3f2602da 3e8e6364 3f3ad06a 3f3ad06a -> 3f6fc9f0 bdbdda05 3f215962", + "3fa2a37c 3eb5a25a 3e983223 3eb5a25a 3e9fe9f2 bde93e58 3f139c1d -> 3f22fa8f 3f089061 3f22fa8f", + "befd21fa 3eba585b 3f431f01 3f9a0910 3f424836 bdb1f097 3f831507 -> 3ec812d5 3f517efb 3fa5622c", + "bee899f4 be48371e 3f06484c 3f8ec375 3e09bed4 3f9afdc0 3d163188 -> be406cc1 3f010eaf 3f89355e", + "3edeac95 3eb8b724 3f32a02a 3b884d75 3f7860c1 3f64692a 3e07838b -> 3ed815e9 3f50f62f 3b9f735a", + "be159ce8 3e047a14 3f508d4b 3e047a14 3f9bc802 be40637b be40637b -> 3df5d538 3f41805d 3df5d538", + "be4ba0e3 be70a666 3ee4ea58 3ee4ea58 3f59d0ed 3f6f2a69 3f75b70f -> be39c57d 3eb0b67a 3eb0b67a", + "be798c71 3d836489 3f8cee36 3f9897da 3f87a5e1 3c4614a6 3c4614a6 -> 3d86f2d6 3f90be96 3f9cb904", + "3eb40a00 3e277408 3e277408 3f862d87 3f0f7b55 3d163c31 3f0f7b55 -> 3e0c0d9f 3e0c0d9f 3f6071f6", + "3f164120 3f8c3f5f 3f929bcc 3f2f3f48 3e8e4268 3ca2cb77 3e8e4268 -> 3f1bccf6 3f22ddfa 3ec2ae81", + "3f0551c4 3e863406 3f814510 be73600b be7594a3 3f9ceb74 3f9ceb74 -> 3e9526f9 3f8fab57 be873e13", + "3f812a78 3f5bee94 3f49e571 3f49e571 3c9b6597 3ef7b7df 3f811a89 -> 3f814729 3f6d5a55 3f6d5a55", + "3fa27b16 3f7e8cbe 3f8f081b 3f7e8cbe 3f800000 3f800000 3f400000 -> 3f5c978b 3f77e6c9 3f5c978b", + "3fb9c832 3ea8c071 3f485f90 3f8953aa 3f03fca3 bc88f07f 3e5940be -> 3da6194a 3e453922 3e872afc", + "3f80feea 3e824551 be2e896c 3e824551 3f4b8a3f 3f4b8a3f 3f12d4c3 -> 3f4c9de1 bf0912a0 3f4c9de1", + "3f097a70 3e8709da be3ab7d0 be3ab7d0 bc10bdb8 3f179a3a 3f6e0fcd -> 3f1f1ad0 bedbfe97 bedbfe97", + "3f1feea6 3f5f9f09 3efc3cfc 3f5f9f09 3e95d659 3f89fccf 3e95d659 -> 3f802a0d 3f1090c8 3f802a0d", + "3d480335 3f07bd09 3f9b433f 3dad1177 3f929892 bdf2ca8d 3f929892 -> 3f075e50 3f9ad6e8 3dac98ab", + "3f4456c6 3f6a335f 3d5708df 3dcd4b2d 3f881d75 be10c3e5 3f881d75 -> 3f83af05 3d71d082 3de6dc37", + "be8a54b7 bc578a0d 3d7594ca bc578a0d 3f3f6361 3f3f6361 3e9cd728 -> 3ce22df9 be00da2d 3ce22df9", + "bee59a2c 3ef96429 3ef96429 3f7c32f3 3f00acf0 3efec7c5 3efec7c5 -> 3f181576 3f181576 3f99cbcb", + "beebf68a 3f3e94ef 3f07b557 3e206ef4 3f8bd7be 3f077edd 3f8bd7be -> 3f158456 3ed4ef2e 3dfbbab6", + "bef2b17e 3f6643ae 3f6643ae 3e689801 be6ac0d8 3f946a61 3f015196 -> 3f46b60a 3f46b60a 3e48b8a5", + "3fb4af50 3c45ab72 3f7cb132 3f7cb132 3e3c87d6 3f88ab6c 3f9de37f -> 3c85aa5f 3faadf20 3faadf20", + "bec2ab5d 3f210313 3e396f78 3f210313 be280134 3f7f6e96 be708411 -> 3efa3979 3e101714 3efa3979", + "bda9972d bd806d6b bd806d6b 3ecc1d42 3dd7d3d2 3f1fdaca 3f1fdaca -> bd74cf35 bd74cf35 3ec28ac9", + "3fa07ea6 3f330557 3f3bf7f3 3f3bf7f3 3f2e2675 3f19180d 3f2e2675 -> 3f2284f2 3f2aa46a 3f2aa46a", + "bec14e21 3f3c6b8d 3f3c6b8d 3f21a6ed 3f2b6b2e 3f97e5ef 3f97e5ef -> 3f10dc23 3f10dc23 3ef88f7e", + "beccbd3e 3f3a3358 bcebd655 bcebd655 3f1007a9 3f1007a9 3f44b263 -> 3f3600d9 bce68582 bce68582", + "bd906124 3f9ecc00 3ce6dfae 3ce6dfae 3eefec60 3eefec60 3ec093e7 -> 3fa5c360 3cf1009b 3cf1009b", + "3fa6754f 3f19ee96 3d3a42d0 3d3a42d0 3f239f7a 3f05b0b6 3f239f7a -> 3f2688e0 3d4982ad 3d4982ad", + "bec9f13e 3f89b6e6 3f876944 3f89b6e6 3e3a23b4 3f5bcab9 3e3a23b4 -> 3f94afc4 3f923328 3f94afc4", + "bee7c24e 3ca6f78f 3dab6987 3ca6f78f 3f6de38c 3eb35724 3f6de38c -> bd95243e be991cb6 bd95243e", + "be81bb57 3f9f653d be0f3178 be0f3178 3dae831a 3dae831a bcb06d5e -> 3fc50514 be30fe3c be30fe3c", + "3f850758 bd5d1e18 3ef58a94 bd5d1e18 3dd391c0 3f8f81ad 3f547107 -> be042337 3f92bb9a be042337", + "3d42e401 3f93f6df 3f9aba32 3eec6334 3ccc78bf 3e9ba567 3f9833cb -> 3f93d976 3f9a9b71 3eec3438", + "bac1965f 3dbd5af0 3f909196 3f1158c2 bab83f5e 3f32e559 3f32e559 -> 3dbd7640 3f90a66e 3f116db6", + "be137905 3e99c148 3e99c148 3ead7acb 3e50fbb0 3f9a1cd6 3f9a1cd6 -> 3e426d4c 3e426d4c 3e5b5e87", + "3f02a7d6 3ef82863 3f374ab5 3e9f794a 3f8c1626 be506cc6 3f8c1626 -> 3f1d8d0c 3f68bcc8 3eca7e7f", + "3d109772 3f4cd8f9 3f4cd8f9 3f40f862 3f976bec 3e82c525 be77e3e5 -> 3f504e8e 3f504e8e 3f443a9e", + "3fa59e4a 3f8949ab 3ef10d08 3f8949ab 3f42eb2a 3f36a9a1 3f1f675c -> 3f2b820c 3e969149 3f2b820c", + "3f241bd7 3f593054 3c9ea358 3c9ea358 be746b32 be3cb2a3 3ed7377c -> 3f12f139 3c56a865 3c56a865", + "3f229794 3e991c5b 3e991c5b be065362 3f8b09de 3f41864c 3e47e522 -> 3f4c8c04 3f4c8c04 beb37384", + "bedfe845 3f49851d 3eeb7ed6 3f49851d 3f874a3e 3ed3dc2c 3ebb9c6f -> 3f2b5196 3ec833cd 3f2b5196", + "3f7295db bd546b1e bd546b1e 3f576b3e 3e2ce726 3cdd5093 3cdd5093 -> bc4e1584 bc4e1584 3e50fec7", + "3f963270 3f8b5a6a 3efbda04 3f9d3e51 3f81f7d7 3eddb3d0 3f5cee3e -> 3f5dfa88 3ec89703 3f7a79f4", + "bef42287 3ebdd7da 3f5f1efd 3eb17dd0 3f800000 3f800000 00000000 -> 3eb080fd 3f4f718a 3ea50523", + "bebf7e1b 3cf8f818 3f81a8a3 3f7c0d2f 3f835f1c 3d0f8484 3ca47160 -> 3cf7bd3d 3f8104a5 3f7ace63", + "3f72e834 3f7ff186 bdcf8850 3ef2bbd4 3debf456 3debf456 3e2f8118 -> 3e5ae373 bcb17c83 3dcf975e", + "3fb46233 3c18993a bcbf37a1 3ea40047 3e5200ac 3eb93df9 3eb93df9 -> 3c347386 bce21e5a 3ec1ef56", + "3f684d9e 3e829607 3e829607 3f106919 3f7e1563 3e1eaf51 3e5eac1c -> 3edc9474 3edc9474 3f73ee7d", + "3f3a2680 3f810253 bcc938f6 3ec60abe 3e800000 3f400000 3e800000 -> 3f520358 bca3c8c8 3ea13216", + "3e9b025e 3f883b04 3ebc32ac 3f883b04 3ebbe6a2 3dafb847 be03686d -> 3f5a6aa2 3e96de19 3f5a6aa2", + "3f81ff30 3f3f01f1 be4b2d68 bdf52c5c 3ec04cfa bd98fd78 3f98b46b -> 3f9998dc bea36222 be452776" + ] + }, + { + "function": "cycles_mix_color", + "node": "ShaderNodeMix RGBA COLOR", + "cases": [ + "00000000 00000000 00000000 00000000 3f887273 3f887273 3e0b5525 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f3d0c62 3f7ab73b 3dd80a71 -> 3dc1086a 3e000000 3e0dc982", + "3f800000 00000000 00000000 3f000000 bdf688bf 3f968494 3f968494 -> bd51a6f0 3f000000 3f000000", + "3fc00000 00000000 00000000 3f400000 3f94e2f8 3f63802c 3f32cc17 -> 3f900000 3f5c08ac 3e99db9c", + "bf000000 00000000 00000000 3f800000 3d80ea14 3e0bd22a 3ed1f3b6 -> bd9d304c be2a7cca 3f800000", + "3e800000 00000000 3e800000 00000000 3f400000 3f800000 3f000000 -> 3d400000 3e800000 3d000000", + "3f400000 00000000 3e800000 3e800000 3ef478eb 3ef478eb 3f996cb3 -> 3d98f84c 3e0c7c26 3e800000", + "40000000 00000000 3e800000 3f000000 3f892f78 3edb22ca 3f892f78 -> 3f800000 3e18ed40 3f000000", + "00000000 00000000 3e800000 3f400000 3f0b5151 3f0b5151 3eb8b7a6 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3f0bbd32 3f0bbd32 3f7ff015 -> 3e8bc5e3 3ecbc5e3 3f800000", + "3f800000 00000000 3f000000 00000000 3ea5c6b1 be58fa2b 3f472f0f -> 3e55101e be0b6f38 3f000000", + "3fc00000 00000000 3f000000 3e800000 3f2bc13d 3f2bc13d 3f0ee69d -> 3f400000 3f000000 3eff7d64", + "bf000000 00000000 3f000000 3f000000 3dea973a 3f8498c3 3f112c75 -> bce27548 3f000000 3f1cf6fb", + "3e800000 00000000 3f000000 3f400000 3f543319 3f8077f2 3f8077f2 -> 3e1e91bc 3f100000 3f400000", + "3f400000 00000000 3f000000 3f800000 3e5f2249 3f830909 3f85fe8a -> 3e1fdd2b 3f5bc28f 3f800000", + "40000000 00000000 3f400000 00000000 3c2cc0fc 3f609815 3f9751e8 -> 3c5b3240 3eb9f208 3fc00000", + "00000000 00000000 3f400000 3e800000 3f6d62e2 3e67acea 3e53fd98 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 00000000 3f800000 3f800000 -> 00000000 3f400000 3f200000", + "3f800000 00000000 3f400000 3f400000 3e791306 3c37c32d 3e791306 -> 3f400000 3d0da770 3f400000", + "3fc00000 00000000 3f400000 3f800000 3f7f29c1 3e01c3f8 be5886ce -> 3fc00000 be3cb698 bf5176b8", + "bf000000 00000000 3f800000 00000000 be66466d 3ebd1bf0 bd511d8c -> 3e9bdd0e 3f800000 3d8d8aa0", + "3e800000 00000000 3f800000 3e800000 3ecf11f0 3d81b769 3e8c71cd -> 3e800000 3f4a05e3 3eb6d0c6", + "3f400000 00000000 3f800000 3f000000 3e2bc5f8 3e2bc5f8 bd8bd7f1 -> 3f400000 3f800000 be389ee8", + "40000000 00000000 3f800000 3f400000 3e800000 3e800000 3e800000 -> 00000000 3f800000 3f400000", + "00000000 00000000 3f800000 3f800000 3eec5481 3eec5481 3f1d1bd2 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3f87719e 3f9e06ca 3f87cb7d -> 3e6db54e 3e000000 3ddbfc33", + "3f800000 3e800000 00000000 3e800000 3f58df1a 3f9a020b b6c56c30 -> 3e343f5c 3e800000 b5a40000", + "3fc00000 3e800000 00000000 3f000000 3f9cf2c5 3f5993c5 3f5993c5 -> 3f200000 3f0515ac 3e8a2b58", + "bf000000 3e800000 00000000 3f400000 3f800000 3f000000 3f800000 -> 00000000 be400000 3f400000", + "3e800000 3e800000 00000000 3f800000 3ebf9aeb 3f048aa9 3e1621dd -> 3ebc8514 3e800000 3f521f9c", + "3f400000 3e800000 3e800000 00000000 3e7433d2 3ec21c1f 3f2d2bf5 -> 3e03b03b 3e2b9b79 3e400000", + "40000000 3e800000 3e800000 3e800000 be7a0592 be60b4b8 be60b4b8 -> 3e9cd76c 3e800000 3e800000", + "00000000 3e800000 3e800000 3f000000 00000000 3f000000 00000000 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f800000 3f800000 3f800000 -> 3e800000 3e800000 3f400000", + "3f800000 3e800000 3e800000 3f800000 3f66293e 3ec42d74 3ea3d63a -> 3f800000 3eda3388 3eb63ad8", + "3fc00000 3e800000 3f000000 00000000 bc81d48e be5dd5f1 3f10afd1 -> be15891c bf099820 3f400000", + "bf000000 3e800000 3f000000 3e800000 3d6fd513 3df59c5c 3e5f568c -> 3e9da2fe 3f1ccf0c 3e000000", + "3e800000 3e800000 3f000000 3f000000 3f6be538 3c36edb4 3f6f1ea1 -> 3e9f2314 3ec0c3d8 3f000000", + "3f400000 3e800000 3f000000 3f400000 00000000 00000000 3f800000 -> 3d800000 3e000000 3f400000", + "40000000 3e800000 3f000000 3f800000 3d3223fd 3d3223fd 3efa9f09 -> bd941280 bea504a0 3f800000", + "00000000 3e800000 3f400000 00000000 3f0d5ab6 3f1e2c23 3f47c07e -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f36120e be5f9c41 be5f9c41 -> 3f000000 3e850c77 3c218ee0", + "3f800000 3e800000 3f400000 3f000000 3f94473a 3f7429b7 3e6746ff -> 3f400000 3f1e142c 3e15bc7a", + "3fc00000 3e800000 3f400000 3f400000 3e5ac1c0 3d85e997 3f4bfab9 -> 3e34dd4a be90bb64 3f400000", + "bf000000 3e800000 3f400000 3f800000 3f6c831b 3f6c831b 3d0f1024 -> be000000 3f200000 3fbd9499", + "3e800000 3e800000 3f800000 00000000 3ebd497e be5cac01 3ebd497e -> 3ee00000 3f1ab1b9 3e800000", + "3f400000 3e800000 3f800000 3e800000 3f06eb53 3eb68258 3eb68258 -> 3f500000 3f41dcab 3f11dcab", + "40000000 3e800000 3f800000 3f000000 3edbdb9c 3f8a3013 3edbdb9c -> 3f0ba624 3f800000 3e974c48", + "00000000 3e800000 3f800000 3f400000 00000000 00000000 00000000 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f000000 3e800000 3f800000 -> 3ec00002 3f200000 3f800000", + "3f800000 3f000000 00000000 00000000 3f842b3e 3f842b3e 3f380245 -> 3f000000 3f000000 3eb2346e", + "3fc00000 3f000000 00000000 3e800000 be6c26a8 3eadf536 3f006d1c -> bf184344 3f02090c 3f200000", + "bf000000 3f000000 00000000 3f000000 3e68c1a3 3f8c8bc3 3e6fb516 -> 3f32c055 be800000 3f325b0a", + "3e800000 3f000000 00000000 3f400000 3e9c63cb 3f9bcebb 3e9c63cb -> 3ed816f6 3e400000 3f1c0b7b", + "3f400000 3f000000 00000000 3f800000 3f7edc2c 3ef1d24b 3f7edc2c -> 3f600000 3eb62d66 3f800000", + "40000000 3f000000 3e800000 00000000 3f530903 3f940b6c be121e2b -> 3e59d900 3f400000 bdfcab10", + "00000000 3f000000 3e800000 3e800000 bdf88bed 3f307579 bdf88bed -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3f400000 3e800000 3f000000 -> 3f000000 3e555555 3ed55555", + "3f800000 3f000000 3e800000 3f400000 3e89705e 3f84377e 3f88f1f9 -> 3e40b136 3f395ee3 3f400000", + "3fc00000 3f000000 3e800000 3f800000 3ede5f9a 3f5de15d be58123e -> 3f006d41 3fb00000 bf5d7c92", + "bf000000 3f000000 3f000000 00000000 3f8e73d3 3e0ec986 3f8e73d3 -> 3f000000 3f37fb30 be800000", + "3e800000 3f000000 3f000000 3e800000 3f9ef32c 3f9ef32c 3f4c9026 -> 3f000000 3f000000 3e892ed3", + "3f400000 3f000000 3f000000 3f000000 3e11b864 be18a168 be18a168 -> 3f000000 be891ad8 be891ad8", + "40000000 3f000000 3f000000 3f400000 3d0b023d be2e6bda 3d1d16dc -> 3f53cd70 c0e52f0c 3f400000", + "00000000 3f000000 3f000000 3f800000 3e9f350f 3e1f5c62 3e81b803 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3ecbd4b9 be7fb6d7 3ecbd4b9 -> 3f200000 3e0f20d0 3ec00000", + "3f800000 3f000000 3f400000 3e800000 3f000000 3f800000 3f400000 -> 3ec00000 3f400000 3f100000", + "3fc00000 3f000000 3f400000 3f000000 3f466b92 3f97e715 3c0928d6 -> 3ef831ec 3f400000 be77dfa0", + "bf000000 3f000000 3f400000 3f400000 3f38d058 3f85c124 3f38d058 -> 3efb5a5d 3f400000 3f5dad2e", + "3e800000 3f000000 3f400000 3f800000 3f47f7c4 3ef55dc6 3f47f7c4 -> 3f200000 3f3743d2 3f800000", + "3f400000 3f000000 3f800000 00000000 3f74b1de 3efa0672 3efa0672 -> 3f600000 3f22175c 3ec42eb8", + "40000000 3f000000 3f800000 3e800000 be49eec6 3f8baa81 3f8baa81 -> bf5c8868 3f800000 3fe00000", + "00000000 3f000000 3f800000 3f000000 3f2f6922 3f2f6922 be0051b5 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3f2af2a0 3f6abe1c 3f4eeffa -> 3f1d36cd 3f800000 3f50d6a3", + "3f800000 3f000000 3f800000 3f800000 3f2c8888 3f6fcce2 3f6fcce2 -> 3f383054 3f800000 3f800000", + "3fc00000 3f400000 00000000 00000000 bd97cae2 3d79b205 3e748f40 -> bf3960a4 3e930624 3f900000", + "bf000000 3f400000 00000000 3e800000 3eac3fe9 3eac3fe9 3f4c8f18 -> 3f7794d8 be21aca0 00000000", + "3e800000 3f400000 00000000 3f000000 3f800000 3f000000 3f400000 -> 3f400000 3dc00000 3f040000", + "3f400000 3f400000 00000000 3f400000 3f800000 00000000 00000000 -> 3f400000 00000000 3e400000", + "40000000 3f400000 00000000 3f800000 3f9f9752 3f978851 3f745ca5 -> 3fa00000 3ff312bc 3f07fb16", + "00000000 3f400000 3e800000 00000000 3f3678b2 3c8d6acc bc323b61 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f1a998b 3f3e4671 3ef5aca8 -> 3f2e0028 3f000000 3ebbf363", + "3f800000 3f400000 3e800000 3f000000 3f16d3f3 3e70218f 3f975b94 -> 3ebf53f5 3e184e28 3f400000", + "3fc00000 3f400000 3e800000 3f400000 3f7ffa35 3e46c66f bd2830f3 -> 3f400000 3dbf489c bed7a76c", + "bf000000 3f400000 3e800000 3f800000 3e800000 3f800000 3f800000 -> 3f800000 be000000 3f800000", + "3e800000 3f400000 3f000000 00000000 3e36fdd7 3f349f13 be1e34e4 -> 3f1c2850 3f100000 bd282c52", + "3f400000 3f400000 3f000000 3e800000 3f6174f0 3d2cfa5a 3f312700 -> 3f400000 3e1b9ed4 3f0125d9", + "40000000 3f400000 3f000000 3f000000 3e800000 3f000000 3f000000 -> 00000000 3f800000 3f800000", + "00000000 3f400000 3f000000 3f400000 3f7f3de3 3e2f06dc 3e4853c2 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f16509c 3f47cc9b 3f47cc9b -> 3f404c56 3f400000 3f800000", + "3f800000 3f400000 3f400000 00000000 3f6ce845 bcb15f6f bcb15f6f -> 3f400000 bc8fc000 bc8fc010", + "3fc00000 3f400000 3f400000 3e800000 bcf1a7cc 3f87457e 3f87457e -> bed013f8 3f400000 3f800000", + "bf000000 3f400000 3f400000 3f000000 3f3b95ad bd8023f1 3f3b95ad -> 3f400000 3f941940 3ec00000", + "3e800000 3f400000 3f400000 3f400000 3f800000 00000000 3f800000 -> 3f400000 3f100000 3f400000", + "3f400000 3f400000 3f400000 3f800000 be3d1b61 be2914e4 3f652610 -> 3d063380 3d495160 3f800000", + "40000000 3f400000 3f800000 00000000 be0423f2 3f962176 3f120635 -> bf7854b0 3f800000 3f78ff6e", + "00000000 3f400000 3f800000 3e800000 3f590375 3f76d022 3f949b6a -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f05fa7f 3f05fa7f 3f6aac07 -> 3f2913d9 3f4913d9 3f400000", + "3f800000 3f400000 3f800000 3f400000 3f09c1ef 3f09c1ef 3e902890 -> 3f800000 3f800000 3f05f290", + "3fc00000 3f400000 3f800000 3f800000 3f976087 bd5282e6 3e677e19 -> 3f900000 bf10b00c be5a6290", + "bf000000 3f800000 00000000 00000000 00000000 3f800000 3e800000 -> 3fc00000 bf000000 be000000", + "3e800000 3f800000 00000000 3e800000 3f2e4bb8 3f7eb268 3f2e4bb8 -> 3f6bcc00 3e800000 3eb79801", + "3f400000 3f800000 00000000 3f000000 3f8a5378 3f8a5378 3f12aa01 -> 3f800000 3f400000 3f05c965", + "40000000 3f800000 00000000 3f400000 3f54f413 3f08cf7f 3f388e1c -> 3f800000 3fa4772d 3f7bb8f6", + "00000000 3f800000 00000000 3f800000 3f800000 3e800000 3f400000 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f70da13 3ef1c72d 3eddca92 -> 3f800000 3ec07e02 3e6bbd9a", + "3f800000 3f800000 3e800000 3e800000 3f6928de 3d41ee89 3e4bb9f0 -> 3f800000 3d54edf0 3e5faef8", + "3fc00000 3f800000 3e800000 3f000000 3e494715 3f5b17a5 3f5b17a5 -> be1f3940 3fb00000 3fa00000", + "bf000000 3f800000 3e800000 3f400000 3f3311a7 3f3311a7 3f6713f0 -> 3f8e6790 bc4c3800 3f200000", + "3e800000 3f800000 3e800000 3f800000 3f800000 3e800000 3f800000 -> 3f800000 3e800000 3f800000", + "3f400000 3f800000 3f000000 00000000 3e8f17ba 3e63e1d1 3e8f17ba -> 3f800000 3f38e27b 3f400000", + "40000000 3f800000 3f000000 3e800000 bd341d9c 3f243a51 3f243a51 -> bf918c42 3fc00000 3fe00000", + "00000000 3f800000 3f000000 3f000000 3e1218d4 3f5078a6 3f8bbfd6 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f5acca5 bc60f928 3eb9b7bc -> 3f800000 3e77c634 3f1652cc", + "3f800000 3f800000 3f000000 3f800000 3f230779 3f230779 bdc72a61 -> 3f800000 3f800000 be1c5f38", + "3fc00000 3f800000 3f400000 00000000 3f53f65d be1ae254 be1ae254 -> 3f800000 bf262610 be8c4c1e", + "bf000000 3f800000 3f400000 3e800000 3df93577 3ef39b91 3cfc7aed -> 3fafa1d2 3f200000 3eaf6ad1", + "3e800000 3f800000 3f400000 3f000000 3ef63e39 be679f6b 3ea32e45 -> 3f800000 3ee3ccc7 3f0a6961", + "3f400000 3f800000 3f400000 3f400000 3eec1c3f 3eb1d681 3eb1d681 -> 3f800000 3f409d34 3f409d34", + "40000000 3f800000 3f400000 3f800000 3f9773d6 3f9773d6 be55adcb -> 3f800000 3fa00000 bfad25cc", + "00000000 3f800000 3f800000 00000000 3f7a8d9f 3f8741ad 3f9e2658 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3e800000 3e800000 3f800000 -> 3f200000 3f200000 3f200000", + "3f800000 3f800000 3f800000 3f000000 3ea77274 3f9d1eb9 3f9d1eb9 -> 3e8869c0 3f800000 3f800000", + "3fc00000 3f800000 3f800000 3f400000 3e800000 00000000 3f400000 -> 34800000 bf000000 3f900000", + "bf000000 3f800000 3f800000 3f800000 3f090b47 3f090b47 bdf05c4b -> 3f800000 3f800000 3fce07f8", + "3e800000 00000000 00000000 00000000 3f8146a6 3f50ece5 3f50ece5 -> 00000000 00000000 00000000", + "3f400000 3e800000 3e800000 3e800000 3d59b9d8 3f94e3e7 3d9e4f49 -> 3d918c44 3e800000 3d9984b6", + "40000000 3f000000 3f000000 3f000000 3f9a8756 bd47f660 3e53d74e -> 3f000000 bf0a5a24 bea84372", + "00000000 3f400000 3f400000 3f400000 be1ea716 3f501d32 3f8aa56b -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 bdaa7bff 3eb3973b 3eb3973b -> 3ec33ec6 3f800000 3f800000", + "3f800000 3fa00000 3fa00000 3fa00000 3de92cc3 3ecae7c7 3f57b481 -> 3e2cf550 3f16817d 3fa00000", + "3fc00000 be800000 be800000 be800000 bdac72b6 bdac72b6 3ef62095 -> 3e434314 3e434314 be800000", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3f662c00 3ee2b891 3f662c00 -> 3dcccccd 3e006242 3dcccccd", + "3e800000 3f666666 3f666666 3f666666 bc0db5e4 bc0db5e4 3f80f956 -> 3f2c4e39 3f2c4e39 3f666666", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3cad6aeb 3cad6aeb bbbcae39 -> 3eaaaaaa 3eaaaaaa 3c7b3580", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3c0f5dab be42f1d2 3efe8ff7 -> bf24a8d3 bf96ae8e 3f2aaaab", + "00000000 3e979655 3f645fd8 3e979655 3f587de9 3f83b239 3f83b239 -> 3e979655 3f645fd8 3e979655", + "3f000000 3f6dc125 3f6dc125 3f85a258 3fa00000 3fa00000 3fa00000 -> 3f6dc125 3f6dc125 3f85a258", + "3f800000 be229510 3f4ccab0 be229510 3edae6f6 3f73dafd 3f62ab1c -> 3eb7d5f8 3f4ccab0 3f3e5ba2", + "3fc00000 3f0a6064 3e0288fd 3eb6604c 3f9ffc10 3ef99a48 3f9ffc10 -> 3f0a6064 3e8148b7 3f21f883", + "bf000000 3f97b1d6 3ed3b2da 3f30da79 3f910843 3ee6b20e 3e7d4aa5 -> 3f97b1d6 3ec4e6c4 3f682a0b", + "3e800000 3f0216e0 3e77e380 3f6c08b4 3f000000 3e800000 3f000000 -> 3f1c9355 3e97f77d 3f6c08b4", + "3f400000 3f8171eb 3f96a029 3e2e75de 3f9a0561 3f94cc61 3f94cc61 -> 3f91549a 3f92cb84 3f652e50", + "40000000 3f567056 3f065cb2 3f065cb2 3ddb3eb8 3ddb3eb8 3db5b2da -> 3f567056 3f9341fd 3f5d11a8", + "00000000 3f2bf0f3 3f890471 3f983312 3f0511dd 3f0511dd 3e885ec6 -> 3f2bf0f3 3f890471 3f983312", + "3f000000 bde5bb42 be4be35b be4be35b 3f3def9e 3efd16fc 3ecf7c1b -> bde5bb42 be0c356e be05504e", + "3f800000 be544dd6 3dbbb347 3e4f9f47 be2a9805 3e02eb2d 3ee6197b -> bd99ede8 3d6c4277 3e4f9f47", + "3fc00000 3e9c9d04 3f65bc07 3f8cc1ab 3f7ae7dc 3e5ccb1b 3f2fea49 -> 3fbf8ee0 bdafc178 3f1b4e30", + "bf000000 bd060800 3f25f23a 3f8068f3 3f70d466 3f8555fa 3f8541c9 -> bf008820 3ef104c8 3f8072ac", + "3e800000 bdcf20e9 3f15fb9f 3f23a8c7 3e6ccaf0 bdca45c1 3e621bfd -> 3dabf8df 3ebe0632 3f21d036", + "3f400000 3d39aa70 3f8e15fe 3f569e94 bcbcd647 3f725773 3f70796e -> bc127b40 3f8e15fe 3f84921f", + "40000000 3eddfe8a 3f31f559 3e3499cb 3f624571 3f1b28eb 3f64468f -> 3f71cb67 3e7fd6b0 3f9b621f", + "00000000 3f99b60e 3ef77f18 3e9e88a2 bd6c989f 3f1bfb40 3f555a6a -> 3f99b60e 3ef77f18 3e9e88a2", + "3f000000 3ef3b88e 3f9d706d 3f9d706d 3eb1074b 3f96aea3 be212a5b -> 3ed6580d 3f9d706d 3f0863de", + "3f800000 3e81e7cc 3dbdb665 3f8ff6cf 00000000 3f400000 3f800000 -> 00000000 3f57f236 3f8ff6cf", + "3fc00000 3f6a37bc 3e8275f7 3e306782 3efead7e 3f46cef1 3f90ea2b -> 3e14ff38 3f50608a 3fa4a355", + "bf000000 3c8f59c2 3c8f59c2 3e35353e 3f666666 3f666666 3f666666 -> 3c8f59c2 3c8f59c2 3e35353e", + "3e800000 3f7fadf1 3a650f03 3ef3ed9b 3e93f162 3f459977 3f81b216 -> 3f51fce2 3e437166 3f1b6496", + "3f400000 3f23fb57 3f1cedd6 3f1cedd6 3f18fde5 be657596 3f18fde5 -> 3f23fb57 bcdc38a0 3f2237f7", + "40000000 3f1dddc0 3f0cecd8 3f5c778c 3f5d987a 3f18b843 3f5d987a -> 3f8d88ac 3f22f56e 3f5c778c", + "00000000 3f23bc34 3f601735 3f23bc34 3f48f4a1 3f57ec1e 3f8d5b64 -> 3f23bc34 3f601735 3f23bc34", + "3f000000 3f6cd1a6 3f8fac4e 3f6cd1a6 3f46893b bddf6c57 3e468f3b -> 3f830a90 3ef6ece6 3f1a54fa", + "3f800000 3f1bdf58 3f1bdf58 3f6533ab 3d97dcfd 3d97dcfd 3f8cb741 -> 3d775bf0 3d775bf0 3f6533ab", + "3fc00000 bd9528bb be66bf66 3d326b25 3f17d9ee 3f90d57b 3f17d9ee -> 3d90ba6d 3e3647e2 3c4c5a30", + "bf000000 be123ac5 3f743a55 be123ac5 3f88dcb2 3f86f6a9 3f18bf4b -> bf30f334 3f75ebfe bef5f5a0", + "3e800000 be2fb5ef 3eb56bf6 be2fb5ef 3e800000 3f000000 3f800000 -> bdda35e9 3e9ebe78 bd2449e0", + "3f400000 3f0dec8f 3f1e5d03 3e92a993 3f280be2 3cadb196 3f280be2 -> 3f1a40e6 3e2db574 3f091af4", + "40000000 3df40dd1 bd752692 3f92821b 3d578a05 3e574ed9 3ed27773 -> 3e320d3a 3f9d8a14 3f92821b", + "00000000 3eebdbcd 3e033260 3eebdbcd 3f9cbe01 be4c4322 be4c4322 -> 3eebdbcd 3e033260 3eebdbcd", + "3f000000 3e6c51bf 3f9ba493 3f5f3445 3f9f50a0 3f9f50a0 3ef15952 -> 3f392ecb 3f9ba493 3f2a8c70", + "3f800000 3f157ec3 3f157ec3 3f023798 00000000 3f400000 3e800000 -> 00000000 3f157ec3 3e4753b4", + "3fc00000 3eed6103 3eed6103 3cdce00e 3f6541b2 3ebbc049 3f80af6c -> 3ec67bdc 3cb2f9f0 3f2e9542", + "bf000000 3e57910a 3f8fcc5e 3be95cf4 3da5ef22 bdf9ec3f 3ea56ab1 -> 3e331a0d 3ff2dae0 bf0d1047", + "3e800000 3f81a15d 3f81a15d 3ebb66f9 3f87a341 3f6313b3 3f87a341 -> 3f81a15d 3f78b34f 3f07174c", + "3f400000 3e958138 3f93bd73 bd94a48f 00000000 00000000 3e800000 -> 3d958138 3e93bd74 3f58f708", + "40000000 3f731de3 bd417743 3f388488 3dc12f31 3f9037b8 be4976c5 -> bf4a68a7 3ff9299d bf86b61f", + "00000000 3f437bf5 3f437bf5 3ee7f56d bddec6f0 be73629f bddec6f0 -> 3f437bf5 3f437bf5 3ee7f56d", + "3f000000 3f6ea681 3f63fd85 be2ed018 3f400000 3f000000 3f800000 -> 3f50d1b1 3f2da863 3ec2f27c", + "3f800000 3e145ccc be1f6c2c 3efd8483 3f464e5d bddcb30e 3e506c6c -> 3efd8483 bd8d12a8 3e0539d0", + "3fc00000 3ee11b46 3e126b97 3f94e29e 3f9d7574 3f691f06 3e8abef1 -> 3fc33084 3f9c2b69 be49f7a8", + "bf000000 3f642b36 bd56743f 3f0aad8b 3f400000 00000000 3e800000 -> 3f642b36 bda0d72f 3f29fd1c", + "3e800000 3f02bae6 3f42b0b9 be0f94af 3f3d5631 3f07c898 3f1a0ebf -> 3f12b85b 3f34ec69 3d4ae998", + "3f400000 3f70f7cf bd86b9c8 3f2e66ea 3e9de1be 3ebe84fd 3f0fcc0b -> 3f1f74ba 3ee706ea 3f605396", + "40000000 3e3cdebc 3eac433c 3f35352e 3f6e237a 3e2d24e4 3f6e237a -> 3f9d9956 bda20bac 3f35352e", + "00000000 3eb305a0 3f8786e6 3e749a26 3dad995a 3dad995a 3f069ab4 -> 3eb305a0 3f8786e6 3e749a26", + "3f000000 3e0cdda7 be6c8afb 3f987456 3e2d21e3 3e2d21e3 3f640f65 -> 3e3a2b48 bb224240 3f987456", + "3f800000 3e9be244 3ef5523f 3f7418fb be707594 be707594 3f8056a5 -> be64acc0 be64acc2 3f7418fb", + "3fc00000 3f8bf047 3f749d4a 3e83e358 3f9f2fa3 be373c89 3f8bf4f8 -> 3f8bf047 bf36b66a 3fa810ce", + "bf000000 bd9d17b7 3d270627 3f9ff1fa 3f7b3b28 3ce41f4a 3f6ebe42 -> bf3d666c 3d31eb6c 3fa3eb9d", + "3e800000 be36968f be4aa6b8 3f3ba3d0 3e9ee605 bd489a72 3f95f50c -> bdae77d5 be1fd525 3f3ba3d0", + "3f400000 3edd75c4 3f865194 3edd75c4 3e20c292 be3c137c be3c137c -> 3f652916 bf288dae bf5007c2", + "40000000 3f965533 3e9ccd17 3f965533 3ecc9234 3dc67007 3f8cf3e3 -> bea4f620 bdcbeb1c 3f965533", + "00000000 3f99c57f be628b88 3e5a27ae 3e4c9e69 bda43032 3e4c9e69 -> 3f99c57f be628b88 3e5a27ae", + "3f000000 3f73f7c9 3e205816 3eddb5ca 3f46e0af 3f7dc525 3e9c82c0 -> 3f5994f4 3f0e06e8 3eba1674", + "3f800000 3f9e8c57 3f9e8c57 3f4e6fe3 3ec2c869 3f96ef28 3f98deec -> 3eca044e 3f9c8a2b 3f9e8c57", + "3fc00000 bc65ff91 3f1e8359 3f1e8359 3f4d0670 3f4ad634 3f4ad634 -> 3f6f9104 3f1bf9a3 3f1bf9a3", + "bf000000 bd8f623e bd8f623e 3f5bb68f 3ebbec32 bca74602 3eaeeaa7 -> bf08bdb3 bda62ed3 3f6350f6", + "3e800000 3ebcb003 3ddd773d 3ebcb003 be7da427 bdd12e07 3d97344e -> bd05f2b0 bd3ddf22 3ebcb003", + "3f400000 3f2d66f4 3f2d66f4 3ec84ca5 3f4ed5cb 3d883b19 3f4ed5cb -> 3f2d66f4 3e583b28 3f1b16cc", + "40000000 3f3f4eba bd48c9bf bd48c9bf 3f0b17bc 3f9d5b33 3f9d5b33 -> bdb1a1f8 3fc59508 3fc59508", + "00000000 3f0cc855 3f889ba3 3f9b8f79 3f6a69b3 3f64362a 3f124063 -> 3f0cc855 3f889ba3 3f9b8f79", + "3f000000 3f0bb78c 3f0bb78c 3ebaa173 3ed656d6 3ec8c420 bdfb27e1 -> 3f0bb78c 3f074b0e 3dd18ba4", + "3f800000 3f87d050 3b418c8b 3e63aede 3f6c667f 3ea74113 3f26b529 -> 3f87d050 3ec02d6f 3f3f8cac", + "3fc00000 3f4ebcfa 3ebce9ce 3f37bc91 3f19e3ed 3eeedcf0 3f19e3ed -> 3f4ebcfa 3f4170bb 3f5a3d2e", + "bf000000 3f23a451 3f966844 bd282d35 3eb93fe0 3dea83db 3eb93fe0 -> 3ebe1c6b 3fc9cf61 bf262c81", + "3e800000 bb7ec157 bd7c4d9a 3e417cde 3f42981f baa59547 baa59547 -> 3d358bce bd3d8c86 3e110912", + "3f400000 3e6fa083 3c4ff86a 3f941130 3f9e7334 3f93dd18 3ec927e0 -> 3f6d13d0 3f5012f8 3f108625", + "40000000 3f2ed5d0 3f74fd7e 3f67d769 3f000000 3f000000 3f000000 -> 3f2ed5d0 3f74fd7e 3f67d769", + "00000000 3db35d6c 3f88559d 3f30a87f 3f656d76 3ed1ed89 bca9984d -> 3db35d6c 3f88559d 3f30a87f", + "3f000000 3d5a6d81 3f59df50 3f43a4ac 3e68b2c9 be7676ba 3f07cbdc -> 3e55f985 3e6e07e0 3f4ec1fe", + "3f800000 3efe7c57 3dc08d08 be0ef069 be3e68c6 be3e68c6 3f6c227a -> bdcd34f4 bdcd34f0 3efe7c58", + "3fc00000 3f21408a 3ee4f9c3 3ee4f9c3 3f65365b 3ed3bab3 3f65365b -> 3f21408a 3e59e1e9 3f38a25e", + "bf000000 3f89a752 3f9c0975 3f9c0975 3f97e64a 3f070014 3efb1e47 -> 3f807640 3fc762d5 3fc9cf86", + "3e800000 3f23dba4 be43b32e 3f23dba4 00000000 3f000000 3f000000 -> 3ef5c976 3c88aa10 3f23dba4", + "3f400000 be4a3b7d be731f8b be4a3b7d 3f9840a2 3f9840a2 bd8020dd -> be4a3b7d be547480 bd2a5268", + "40000000 3e9372f0 3d5ea10b bd88db18 be5e072a 3f55c64f 3f947a11 -> beca925c 3eb87751 3f248e53", + "00000000 3f97b1f9 3f97b1f9 3edc6ac3 3d97aaca bdbbf478 3f9ede58 -> 3f97b1f9 3f97b1f9 3edc6ac3", + "3f000000 bdbc60a0 3f09a834 3dd12e2d 3f42479b 3f94081b 3f83856b -> 3e0591ca 3f09a834 3e947382", + "3f800000 3e8e5610 3dd901e8 3e8e5610 3f0f9f00 bcf4a4d2 bcf4a4d2 -> 3e8e5610 bc727498 bc7274a0", + "3fc00000 3f6a2ea1 be345634 3f6a2ea1 bdbf294c 3f8ad777 3f44c51f -> bf13519d 3fbae85c 3f03d368", + "bf000000 3f9f30e8 3f9f30e8 3f5200ef 3f800000 3f400000 3f000000 -> 3f9f30e8 3fb31705 3f6b68f2", + "3e800000 3dfd46e8 3dfd46e8 3f8cb18f 3f257a21 3d8b490d 3e4bd85f -> 3ebc2eda 3df92b88 3f68b46d", + "3f400000 3da9b2c7 3e3b5a93 3f0f5d8c 3d7dbe89 3d7dbe89 3f73faac -> 3d44ad46 3d95973b 3f0f5d8c", + "40000000 3f9daf8b 3f9b06da 3f9daf8b 3eaae68a bd686beb bd686beb -> 3f9daf8b bfd0a3a2 bfd34c53", + "00000000 3f01ffbe 3f9db6fb 3f01ffbe 3f4e664b 3f18c3e2 3f6a9d60 -> 3f01ffbe 3f9db6fb 3f01ffbe", + "3f000000 3eb76144 3f39cea6 3e16ee1d bde58de3 3e8caacd 3e8caacd -> 3cfe2ad0 3f39cea6 3edf8a2e", + "3f800000 3f020c27 3e87b336 3e89e97b 3ebc1e27 3f0fda25 3ebc1e27 -> 3eaa10b1 3f020c27 3eaa10b1", + "3fc00000 3f175ce5 3f175ce5 3f16475a 3f400000 00000000 3f000000 -> 3f175ce5 be975ce6 3e98726b", + "bf000000 3d133dae 3f24389d 3d133dae 3f51d87a bdfd62de bdad0d99 -> be889d0c 3f815cd2 3db224fe", + "3e800000 3f61bf37 3c36ca2a 3f60ab64 3e800000 3f000000 3e800000 -> 3f458750 3e6a50b1 3f44b872", + "3f400000 3f96cb6f 3f2d5a0f 3f3df53d 3f813b65 3f52bd23 3f813b65 -> 3f96cb6f 3f63c384 3f88d73b", + "40000000 3e0428fc 3eb1fae5 3eb1fae5 3e9cfbc1 3f897eca 3f897eca -> 3d8e17b2 3eb1fae5 3eb1fae5", + "00000000 3f26e461 3e68d03f 3e68d03f 3f484d1c 3f3e4d41 3f3e4d41 -> 3f26e461 3e68d03f 3e68d03f", + "3f000000 be323f2d 3f14241a be0b013b 3ef3d084 3f9669a7 bd15264d -> 3cf78aa0 3f14241a bd9d5dec", + "3f800000 3f271fea 3ebb3882 3ebb3882 3ed42431 3f47b66c 3f76d921 -> 3e8fa082 3f073656 3f271fea", + "3fc00000 3f14aeb8 3f488aaa 3c685f32 bd9e2749 3f323d1a 3e9ba4a0 -> bed76944 3f488aaa 3f018607", + "bf000000 3f6fbf99 3f162fb9 bdb5503b 3ef554c8 3f6ddfee 3f6ddfee -> 3f94e743 3ed2cf92 bf19ded7", + "3e800000 3e2f7ebb 3ed55391 3e2f7ebb 3f7178d0 bbe16930 bbe16930 -> 3e6e48d5 3e9f9b1b 3e02d7e9", + "3f400000 3f9769b0 3f9769b0 3ddf556c 3f76c1a1 3f76c1a1 3f6605a7 -> 3f9769b0 3f9769b0 3f5ab226", + "40000000 3f1fec83 3f67f722 3f1fec83 3e800000 3f400000 3e800000 -> bca8f840 3f67f722 bca8f840", + "00000000 3f78666c 3e882fa0 3f88bb18 3f998792 3f9fef3d 3f998792 -> 3f78666c 3e882fa0 3f88bb18", + "3f000000 3f71d18b 3ed23099 3ed23099 bdcc1dac 3e090847 be11273c -> 3df6dfe8 3f2d74ec be970df3", + "3f800000 3f8ff434 3e813160 3e2c5bce bdb19d63 3f9f2743 bdb19d63 -> bda0a6f0 3f8ff434 bda0a6f6", + "3fc00000 3f5ebf52 3e18789d 3f5ebf52 bdeae1ea 3d4702b8 bdeae1ea -> c0610448 3f9d87f4 c0610448", + "bf000000 3f900b28 3e38cd50 3ee63384 3f9a3ee4 3e0f518f 3e0f518f -> 3f900b28 3e52488a 3f1bebc8", + "3e800000 3ea49acc 3cff1590 3ea49acc 3f000000 3e800000 00000000 -> 3ea49acc 3d822171 3e76e832", + "3f400000 3f17b135 3f01c016 3ec3a6fc 3ef43996 bdc6377b be160f0e -> 3f17b135 3d15a780 bd27eb70", + "40000000 3f8ced9a 3f42a9ad 3f83c654 3d7692f0 3f2d47e2 be1b4be9 -> bf67b8d4 3fb8865e bfc2ecf0", + "00000000 3dfbd1f5 3f65c2e0 3dfbd1f5 3f7c6f0c bcad0351 3f0a0b9c -> 3dfbd1f5 3f65c2e0 3dfbd1f5", + "3f000000 3f3ea81f 3f4d8158 3e4bbf8f 3f46eb7d 3cb5b51a 3f6ec664 -> 3f34ee18 3ed26476 3f00389e", + "3f800000 3ea62d86 3f9070ae 3ea62d86 bd241acc 3f8cd349 be2ceb55 -> bd285148 3f9070ae be315ba6", + "3fc00000 3e583579 3ebee0ef 3f3d85c9 3f48c075 be7441c4 3f48c075 -> 3f80a0ff bf063148 3f3d85c9", + "bf000000 be289616 bda80ebb 3f45a119 3f92bfc2 3f611518 3f92bfc2 -> bf2208d4 bed69525 3f45a119", + "3e800000 3eab2729 3eab2729 3f425d6c 3dd7a7fe 3dd7a7fe 3f2d3c0d -> 3e8f7cbf 3e8f7cbf 3f425d6c", + "3f400000 3ec0fa2e be34d992 3ec0fa2e 3d479320 3ec28b4d 3f99c90e -> 3dd874a4 3d3955cc 3ec0fa2e", + "40000000 3f8ccedc 3f8ccedc be0be937 3f2355d2 3f2355d2 3f9865cf -> 3da1b130 3da1b130 40158d70", + "00000000 be4143c4 be4143c4 bd3694af 3f9fdb03 3f9fdb03 3f269040 -> be4143c4 be4143c4 bd3694af", + "3f000000 3ecb66f9 3ec8c3e5 3f93dbde 3d486502 3d486502 3e6c0dd5 -> 3ea47662 3ea324d8 3f93dbde", + "3f800000 3e38ff43 3e38ff43 3f557f92 3f2db1d6 3f59e315 3f1329da -> 3f2a3232 3f557f92 3f103305", + "3fc00000 3d94083b 3f8c08c5 3f8c08c5 3f0c4a2b 3f0c4a2b 3e32d312 -> 3fcd6ce6 3f8c08c5 bcc51fc0", + "bf000000 3f375f2a bd3b8aca 3f0987c2 3f6b6008 bdee8858 3d229f9d -> 3f375f2a bcbef686 3f4a5618", + "3e800000 3f57affd 3f57affd 3e614363 00000000 3f400000 3f400000 -> 3f21c3fe 3f57affd 3ec05144", + "3f400000 3ed70e04 3d4f2d72 bd9179c4 3f962f87 bc2c330d 3ea5f1d8 -> 3ed70e04 3c20f1c4 3d8dd8c0", + "40000000 bd8b50fd bd8b50fd 3f52e76a be800000 be800000 be800000 -> bd8b50fd bd8b50fd 3f52e76a", + "00000000 3e46e0bc 3e46e0bc 3f2f7dd0 3f1b3593 3f1b3593 3f2191f2 -> 3e46e0bc 3e46e0bc 3f2f7dd0", + "3f000000 3f7730b5 3f2ddebe bdea81cd 3eaf3594 3eaf3594 be7be1cd -> 3f7730b5 3f5287ba becefe9a", + "3f800000 3d686d39 bde0a5ed 3ee03f7e 3f04d33a 3f2d987c 3f04d33a -> 3eab94d0 3ee03f7f 3eab94d0", + "3fc00000 be528229 3f9d7191 3f9d7191 3f0545b9 3f0545b9 3f766d9d -> 3f8ce0fd 3ec40048 3f9d7191", + "bf000000 3f0a72b1 be726c2a 3f7002bc 3f41f535 3dfa5f65 3f1fb8f6 -> 3eaf5557 bedc8b61 3f8298ac", + "3e800000 3e029c74 3e029c74 3ec7dac6 3f000000 00000000 00000000 -> 3e45e2ba 3dc3eaae 3e95e414", + "3f400000 be78d9f7 3f859c1f be78d9f7 3db0853d 3ecface4 3f8abce1 -> 3ac49000 3f0dcdfe 3f38dc8f", + "40000000 3ec790c5 3d995050 3ec790c5 3f2342d7 bd6a10f6 bd6a10f6 -> 3ec790c5 be142f8f beeb5479", + "00000000 3ecc3ae6 3f79dad3 3f4e682c bdb1e474 3c61b76e bdb1e474 -> 3ecc3ae6 3f79dad3 3f4e682c", + "3f000000 3ea5139f 3f968473 3ea5139f be09d6fb 3df7624d 3df7624d -> befcedb5 3f968473 3f3fc95a", + "3f800000 be6c0253 3d9c25cc 3d9c25cc 3f000000 3f000000 3f400000 -> 3d503264 3d503265 3d9c25cc", + "3fc00000 3eb0e1b3 3f6ffbfe 3f6ffbfe 3ec11830 3f6e5397 3f6e5397 -> 3ecb3736 3f6ffbfe 3f6ffbfe", + "bf000000 3f096457 3f585765 3f585765 3eb80da9 3eb80da9 3f501021 -> 3f1e3e6b 3f8a5580 3f585765", + "3e800000 3d057535 3eac2427 3dd3f1fc 3f8f0dfc 3f4e7e1b 3f8f0dfc -> 3dde301a 3ea02a67 3e258cd2", + "3f400000 3f35cbc3 3f20299a 3eedc3e1 bd9c1ef1 bd41175d 3f170a40 -> 3ddea888 3de92bb8 3f26114e", + "40000000 3f101cb0 3f101cb0 3df1575e 3dd1f206 3edc1c4f 3dd1f206 -> be96c478 3f101cb0 3e1a3e1f", + "00000000 3f930db6 3f898445 3f9e2885 3f2b0b21 3f5fd8c8 3f9b3b8a -> 3f930db6 3f898445 3f9e2885", + "3f000000 3f204e4d 3f06fb94 be117a31 3efe350f 3db70959 3efe350f -> 3f204e4d 3ea3d6c4 3e77df81", + "3f800000 3f9ded05 3d1e5c29 3f9ded05 3f9c43c6 3f914012 3f914012 -> 3f9ded05 3f92cb57 3f92cb57", + "3fc00000 be0aaa58 3f9f64e6 be0aaa58 bad9e79a 3f8458eb 3f9941e9 -> 3d855a84 3f7d8bd0 3ff7c1ff", + "bf000000 3f6a90c2 3f0b0412 3d459bb9 3f9e6022 3ed2881a 3f9e6022 -> 3f6a90c2 3f298c1c bec5838f", + "3e800000 3f93cc6e 3eba107b 3f9914b9 3f4efaea 3f541a47 3e8128d6 -> 3f9431e4 3f12508a 3f7ced0f", + "3f400000 be25c51f 3f8b33d1 3f8b3712 3eb437c3 be2303f9 3f43218f -> 3eac244c 3dcfe700 3f8b3712", + "40000000 3f9b2be9 3f3d2ac0 3f3d2ac0 bc7e1c26 3e81eeaa 3e81eeaa -> bfae2371 3fd7c272 3fd7c272", + "00000000 3de23a6b 3de23a6b 3f8e48a3 3f1410ed 3ede9e8d 3ede9e8d -> 3de23a6b 3de23a6b 3f8e48a3", + "3f000000 be33ec23 3ee0ffbd 3da051bb 3f271230 3f271230 3e2a5a36 -> 3e0709ab 3ee0ffbd 3dc2de60", + "3f800000 3f7f3c9b 3f55d847 3efdcca7 3f993a3d 3ecda637 bd837aa3 -> 3f7f3c9b 3eab4762 bd5b0278", + "3fc00000 be3f87f8 3f88e8b2 3f87a9d0 3e972da9 3ead5ec5 3ead5ec5 -> 3fbf0c0e 3f88e8b2 3f898823", + "bf000000 3eeb4db3 3f16876e 3f28c885 3de6ae9d bda5ee3f 3f78d4c5 -> 3f26b2b4 3f68d3f8 3f28c885", + "3e800000 3ed75557 3e1be58f 3ed75557 bc4b60b8 bd3f0384 bd3f0384 -> 3ed75557 3f025a14 3f35df0a", + "3f400000 3f42f91a 3f668d90 be461f64 3eff3f22 3f1d130b 3f1d130b -> 3f3d3ca4 3f668d90 3f208835", + "40000000 3f61c5b7 3f487cd5 3f1ff21a 3f318a9b 3ee70f66 be680612 -> 3f61c5b7 3ebaaf42 bf99bc97", + "00000000 3f45697e bd75af11 3f45697e 3f9f575c 3f6510b3 3f9f575c -> 3f45697e bd75af11 3f45697e", + "3f000000 3f452e48 3ed674f1 3db03f64 3f67c961 3f67c961 3e9e834b -> 3f452e48 3f183460 3e32e8a2", + "3f800000 be131760 3ec54f1b 3f9a231f be2cd73d 3dea5e67 be2cd73d -> bfe3581f 3f9a231f bfe3581f", + "3fc00000 3f0c09a9 3eec2327 bd405d2f bce7755b 3f9176b8 bce7755b -> be967b8e 3f1705b4 3b49f7c0", + "bf000000 bd1baf69 be31e426 3b16d60c 3f2aaaab 3f2aaaab 3f2aaaab -> bd1baf69 be31e426 3b16d60c", + "3e800000 3f1e0873 3f993819 3f9f00b8 3f2dccda 3f2dccda 3d122872 -> 3f4606b2 3f9aaa41 3f72aeca", + "3f400000 3c04666a 3f8e74fe 3f8e74fe 3dfbf3b4 3f429e47 3f83a75e -> 3dd09b7c 3f652b6d 3f8e74fe", + "40000000 bd559bf3 3f9de6bf 3d97b27b be7cb709 3d5b11f7 3d5b11f7 -> c1355143 3f9de6bf 4019292b", + "00000000 3f82327f 3e7867c7 3f1d6be6 3f5568ed 3f41c65f 3f20ef3b -> 3f82327f 3e7867c7 3f1d6be6", + "3f000000 3f8c8a62 3f341e44 3f1734d7 3e800000 3f800000 3f400000 -> 3f2facfa 3f669984 3f350237", + "3f800000 3e49585b 3f467c8a 3ec03a3a 3f800000 00000000 3e800000 -> 3f467c8a 00000000 3e467c8a", + "3fc00000 3da39614 bcd72507 3f96682a bd0af719 3f690562 3f7428d4 -> bdd23380 3fd8ffb7 3f96682a", + "bf000000 3ee0ef98 bcb91df4 3ed27545 bd6ecd0f bd6ecd0f 3f7908a2 -> 3f2c1278 bca9d430 3ecb381c", + "3e800000 be1d88a9 3e445a75 bdbe15b8 3f800000 00000000 3f000000 -> bd8a1fc3 3e1343d8 bd3af35a", + "3f400000 3a83ff22 be1aa856 be1aa856 3e940180 3f91f681 3dd17acc -> 39e86130 bd17905c bd1a614c", + "40000000 be514c61 3f805ea7 be514c61 3f000000 3e800000 3f400000 -> 3fc5526a beab28e0 400d736d", + "00000000 3f6bac98 bd1b20e2 3f1b83a9 be411bb4 3f19bdbb be411bb4 -> 3f6bac98 bd1b20e2 3f1b83a9", + "3f000000 3f9e1ca5 3f200858 3f200858 be112fe9 3d53b154 be112fe9 -> bf89d29f 3f6e20d1 bfb0dedc", + "3f800000 3f3ff1e4 be2a9ef2 be2a9ef2 3e800000 3f400000 3f000000 -> 3e7fed30 3f3ff1e4 3effed2f", + "3fc00000 3f837333 3f900ebb 3f837333 be1a1161 3ec267a7 3f9cd171 -> bf38862e bd21e440 3f965c7f", + "bf000000 3f9a514d 3f942971 be2e2f54 3ed69e73 3ee81e73 3f77d88c -> 3fc611ad 3fba1c88 bf5ba30d", + "3e800000 3f85abd2 3f85abd2 3f58b944 3f8ed17f 3f94623b 3f8ed17f -> 3f846af4 3f85abd2 3f62df20", + "3f400000 3f11749f 3f5070ee 3f5070ee 00000000 00000000 00000000 -> 3f11749f 3f5070ee 3f5070ee", + "40000000 3f953b64 be161509 3f763591 3eb741fa 3ebd2c09 3e002fe4 -> 3f8be69a 401e9cb4 be2fdaac", + "00000000 3eef63b4 3eef63b4 3f6ce964 3f9701b0 3f289c7d bdce54da -> 3eef63b4 3eef63b4 3f6ce964", + "3f000000 3f9dfd8c 3f9dfd8c 3f892daf 3e1b9d0b 3f144e33 3f8a8916 -> 3f342c7c 3f728e7c 3f93959e", + "3f800000 bdfb3c61 3f647880 bdfb3c61 3f3ac24a bde4b155 bde4b155 -> 3f647880 be0be290 be0be294", + "3fc00000 be027414 3f7baddb 3f7baddb 3e800000 3e800000 00000000 -> 3fc4e9a6 3f7baddb befbadda", + "bf000000 3e89aa32 3f7606d3 3eb0c9aa 3d9867e8 3d9867e8 3ecf1178 -> 3ea13a2d 3fad33d7 3d193d60", + "3e800000 3f677061 3f9f8e46 3f6d02e8 3f799b00 3f238b6c 3f799b00 -> 3f7d5b6c 3f91cd74 3f80c4a8", + "3f400000 3f827617 3f9564bd 3f2c6588 3e9a2b38 be791abd 3f27f4d8 -> 3f2813fd bd0649e0 3f85983f", + "40000000 3d969815 3f7b40ea 3f4e5398 3e8cb008 3e5afc36 3f9a9666 -> 3ebf036d bf224606 3f94171e", + "00000000 bd9906dd bd9906dd 3f22e3a8 3d4b1c13 3d4b1c13 be63af65 -> bd9906dd bd9906dd 3f22e3a8", + "3f000000 3f86b190 3b638f37 be299f46 3e800000 00000000 3e800000 -> 3f86b190 3ae38f37 3ee2fb4f", + "3f800000 bd9e382a be536e24 3e853df6 3ead6866 3f909050 3f909050 -> 3d9fd3c2 3e853df6 3e853df6", + "3fc00000 3efed0cc 3f4ce238 3efed0cc 3f723dfb 3f7d8518 3f723dfb -> 3f65f346 3f4ce238 3f65f346", + "bf000000 3f8dc72c 3f7f37ef 3f8dc72c 3f36e33f 3f966b39 3f36e33f -> 3fa99254 3f710cba 3fa99254", + "3e800000 be227641 3e3e624f 3f599294 bca23422 bdfb0a31 3f571c2d -> bdfdf262 3dde18fe 3f599294", + "3f400000 3d0ec105 bdcbe55e 3d0ec105 3f73994a 3f73994a 3ddf2875 -> 3d0ec105 3aa3c280 3c3fcb72", + "40000000 3e2f8d33 3f15e855 3e2f8d33 3f400000 3f400000 00000000 -> 3f7fed5d 3f15e855 be2f8d33", + "00000000 3ceffbf0 bd9ccbd5 3f92bcfa be5d1142 3f690f18 3f690f18 -> 3ceffbf0 bd9ccbd5 3f92bcfa", + "3f000000 3f694f44 3ed5a830 3f2041b7 3f8cc2f0 3f8cc2f0 3f88ca3c -> 3f694f44 3f2a11ae 3f417de8", + "3f800000 3e10d40f 3e89b9c6 3f8d3993 3d38f612 3d38f612 3ecbfb5e -> 3e000e5d 3e000e5d 3f8d3993", + "3fc00000 3e2c4d0f 3e2c4d0f bd6f8da6 3ecbde28 3eb68e37 3eb68e37 -> 3e2c4d0f 3e114858 3e82b04a", + "bf000000 3ec61ef6 be148060 be148060 3ef39336 3ef39336 be1a327d -> 3ec61ef6 bed26fc3 be200a88", + "3e800000 be539bc3 3e0be73f 3f802af1 3ef0f306 3f0b9f35 3ef0f306 -> 3d79e7a4 3eb4a1a8 3f778c18", + "3f400000 3f11d315 bcd4719c 3f11d315 3ed2498f 3e6941ec 3ed2498f -> 3f11d315 3e6bfdb8 3f11d315", + "40000000 3ee2cc36 3d690843 bd892f0f 3d82709e 3d82709e 3f2c107a -> beb7d086 3cddaa7e 3f73f218", + "00000000 3f26f368 be7cd501 3f58d9be be07d8b2 3f963049 3f9e72ba -> 3f26f368 be7cd501 3f58d9be", + "3f000000 bc1c08b9 3e1b74da bc1c08b9 be5cb18d 3f46aeb4 3f46aeb4 -> bcd3aff2 3e1b74da 3d91b44f", + "3f800000 3f6a6e91 3f075c1b 3f6a6e91 be308ec5 bda1a7b8 3f60e576 -> be380b34 bda88270 3f6a6e91", + "3fc00000 3f7cff88 3e938edf 3e2a3fad 3f3f335b bc85ba43 bc85ba43 -> 3f7cff88 be34bc6e bdec9ace", + "bf000000 3f52e54b bd7a400d 3f52e54b 3ef8def1 3f35048e 3f9a2940 -> 3f88e49a beaabd6e 3f52e54b", + "3e800000 3f92d6f5 3ebf8b18 3ebf8b18 3f00a8a6 bd86e077 3f00a8a6 -> 3f92d6f5 3e78d4b7 3f113fa4", + "3f400000 3f2d69e9 3eacb01a 3f2d69e9 3f23e21c 3e06b6c9 3e06b6c9 -> 3f2d69e9 3e41414b 3e8c2994", + "40000000 3f4e1a2c 3f40ad12 3f8ef128 3dfd35cc 3d2a3402 3f8d126a -> bf0df5e2 bf2b1e5e 3f8ef128", + "00000000 3f13a20a 3f6a24be be539d8b 3f5cf7ca 3f5cf7ca 3f213ed2 -> 3f13a20a 3f6a24be be539d8b", + "3f000000 3f62b356 3f34b9ee 3f58ec7c 3dac9118 3f088353 3f904d69 -> 3ef3a500 3f0ffa9f 3f5dcfe9", + "3f800000 3f28dfea be06eb63 be38747c 3f5d8961 bd8afeae be40d1f4 -> 3f28dfea bd53e86e be12fc01", + "3fc00000 3f29f9e5 3f64f8e1 3e8cb675 00000000 00000000 3f000000 -> bea9f9e6 bee4f8e2 3f9a23da", + "bf000000 3f903fd6 3f754884 3d321421 3ee7b776 3ee7b776 3ee17528 -> 3f903fd6 3f5facf0 bef750f4", + "3e800000 be0c5548 3f0a8e25 bdfa874a 3b67b4c4 3eaa2ed8 3b67b4c4 -> bdcf8d57 3f0a8e25 bdb8f2e2", + "3f400000 3f823597 bda31e06 3f823597 be408fa2 bdd58556 bd8d6ca4 -> 40153e8a 3f90e484 3f823597", + "40000000 bdf2d613 3f9fe40a bdf2d613 3e8a8113 be23aa2f be23aa2f -> 40277aba c02e69e1 bfadc258", + "00000000 be07c17c 3e97054f be07c17c 3f400000 3f800000 00000000 -> be07c17c 3e97054f be07c17c", + "3f000000 3ede87b7 3f49bfad 3edde5a0 3ed81b03 3ed81b03 3f19bd03 -> 3efd0fae 3f2bc5c0 3f1c593e", + "3f800000 3f5ad6ae 3d8931df 3f5ad6ae 3f8e3642 be490526 3e9e596a -> 3f5ad6ae be1aaab8 3e73abe8", + "3fc00000 be30ff02 3f3db3d9 3e960b95 3e387300 3e387300 3e84655d -> 3f5c56ec 3eceba3d 3f770ae0", + "bf000000 be0d826d 3f9e4c1f 3f2bad33 3f96fa0f bdd79d45 bdd79d45 -> bf535d08 3ff482bc 3f87d274", + "3e800000 3f6855da bcf9fad6 3f64248d 3e04116f 3f4fc457 3f76aa4a -> 3f3606b8 3e2c42e1 3f6530e0", + "3f400000 3f5cad37 3f5cad37 3f9ad1a9 3f8580db 3f17621d 3f8580db -> 3f8fb2e6 3f3ad59c 3f9ad1a9", + "40000000 3f7f8cb0 bc58874e 3f353610 3f0b82fe bdff003d 3f605a74 -> 3e791668 be8a767d 3fa4f1a8", + "00000000 3f08a0a5 bd4c7d47 3f53803a 3ce75c73 3e98ac6a be546e17 -> 3f08a0a5 bd4c7d47 3f53803a", + "3f000000 3f24af18 3ef154a1 be31d840 bd58f472 3f905c98 3f905c98 -> 3e9cf31f 3f0eacb4 3e707210", + "3f800000 3e55e3a9 3f078db9 3f09a6b4 3f5a86da 3f326c3c 3f326c3c -> 3f09a6b4 3ee0c76a 3ee0c76a", + "3fc00000 3f5f80d8 3f2921d3 3f38dcb0 3f84b477 3f942208 bddca2c5 -> 3f3c962e 3f7ab05a bef747b0", + "bf000000 3f833070 be747926 3eeb69ea 3f3b7c1a 3f8a2a51 bd9a898e -> 3f984778 bf5eddde 3f39bb30", + "3e800000 3f30724f 3eb3a39d 3f8d6fa5 3f5174a2 be6bf91a 3edabfae -> 3f4b0d8e 3e3dc9a0 3f7914fd", + "3f400000 3f8db7a8 be514cd5 3f11b27a 3f69f425 3f69f425 3f8ce0a1 -> 3f775ec2 3f236e21 3f79001a", + "40000000 3f871785 3f8f1601 3efb342b 3e2284b6 3f908827 3f908827 -> bf3dbcc8 3f8f1601 3fdf5ef7", + "00000000 3e3c3c29 3f90c91a 3f845689 3f9b0511 3ed32d1e 3f9b0511 -> 3e3c3c29 3f90c91a 3f845689", + "3f000000 3ef34e89 3f59b6c6 3f5e184a 3f000000 00000000 3f400000 -> 3f06dbbd 3ed9b6c6 3f5e184a", + "3f800000 3f3b49c4 3f3b49c4 3f3a6559 3ef6c3c2 3dfcdd23 3ef6c3c2 -> 3f3b49c4 3e3fead0 3f3b49c4", + "3fc00000 3f170ca9 bd6c3d17 3f170ca9 3f62bc79 3f62bc79 3ec1f1f4 -> 3f170ca9 3f69f4e6 3dab0738", + "bf000000 3f0390ce 3f705761 3f0a5cda bd16fb1b 3e2d1958 3f877c5a -> 3f498886 3faaa904 3eaebf2d", + "3e800000 3d8b7690 be21274a 3f4b8fea 3ef57d35 3f91b1fc 3f95f997 -> 3e079988 3d99c6c0 3f4b8fea", + "3f400000 3ebda605 3f37c10f 3ebda605 3f10cf48 3f8f5e17 3f31d6b5 -> 3eba9d31 3f37c10f 3eda5d2d", + "40000000 3e45fb32 3e45fb32 3f436440 bd2cf203 3e0ab7f9 3f0a44b0 -> bea016df 3e421330 3f436440", + "00000000 3e1e7b07 3e1e7b07 bdb2cb94 3eaf9a58 3eaf9a58 3f641779 -> 3e1e7b07 3e1e7b07 bdb2cb94", + "3f000000 bd281b8e 3f3355d7 bd281b8e bde9b423 bde9b423 3eecf515 -> bddae657 3e871dfa 3ea8d41e", + "3f800000 3f9c4fa6 bdb7ded8 3dcf23f8 3f000000 3e800000 3e800000 -> 3f9c4fa6 3f1c4fa6 3f1c4fa6", + "3fc00000 3eff8ca0 3f50553b 3f9a4c6a bdc82a59 be2d16d9 be2d16d9 -> 3fc7810b 402e1932 402190c0", + "bf000000 be7fce48 3f447b29 3f40ac19 3dce0e32 3f4a3775 3dce0e32 -> bed8e176 3f447b29 3f8a3f63", + "3e800000 3f79002a 3f6eab4b 3f79002a 3f3ae446 3ed0d4f9 3f15af06 -> 3f79002a 3f55c7e6 3f6c9b7b", + "3f400000 3dd53b6a 3f5a162d 3f881127 3f0cfe9b bdd454b8 3ea19f6d -> 3f52c396 3d80ced8 3f39039f", + "40000000 bdc2e902 bdc2e902 be6be5c7 3f985ed8 bc9c76ae 3d876acf -> bdc2e902 3dc92a2e 3e611231", + "00000000 3f928ab7 3ee54b62 3f928ab7 3ef7f687 3cb50542 3f61e757 -> 3f928ab7 3ee54b62 3f928ab7", + "3f000000 3ea76632 3f8f3e24 3f8f3e24 3f49c880 3f4dcb10 3f99455e -> 3f0823e8 3f6f6832 3f8f3e24", + "3f800000 bdd32426 3c07bcc9 3f91a04a 3f000000 3f800000 3e800000 -> 3f11a049 3f91a04a 3e91a04a", + "3fc00000 3e742917 3da24311 3f798ccc 3d7e822c 3ea66b38 3f0ae3a0 -> 3d459d14 3f561e7a 3f798ccc", + "bf000000 3d06fee9 3f4160d1 3f0423c2 3ee0336f 3f6a2de2 3f02b966 -> be0683d7 3f4160d1 3f103c46", + "3e800000 3e83bf90 3edea8f4 3f9cf0f8 3f800000 3e800000 3e800000 -> 3effc0a4 3ece3af5 3f7f0793", + "3f400000 3f8ec120 3ebf1d54 3f8ec120 3f000000 3f800000 3f000000 -> 3f327168 3f6e055a 3f327168", + "40000000 bd8eda2c 3f923194 3f470e5a 3eae2acf 3f7fd0ab 3eae2acf -> 3f58ec5c 3f923194 382f4000", + "00000000 3f84cf35 3f1ab654 3f1ab654 3e6e0f96 3eb29153 3f64ba20 -> 3f84cf35 3f1ab654 3f1ab654", + "3f000000 3f726214 3f85a601 3d88f097 be403e06 be631d7f be631d7f -> 3f7ed70b 3f91c53b 3f26737f", + "3f800000 3f9362d0 3f9362d0 3f9d1c51 3f000000 3f000000 00000000 -> 3f9d1c51 3f9d1c51 00000000", + "3fc00000 3f70e7d7 3f27dc30 3f5f313f 3ebd61f3 3f3f5b4c 3ebd61f3 -> 3e69733c 3f8ab6d5 3e867036", + "bf000000 3ec973e4 bcc28123 3e295116 3f67420e 3f67420e 3f8a8f7a -> 3eda1f68 be4c9512 3d5216f4", + "3e800000 3ec5b2ce bd984fce 3f920775 3ea651c2 3f721662 3ea651c2 -> 3ec66fbb 3e6af0fd 3f742000", + "3f400000 3f578515 3ebc6ebc 3e8eefce 3d9dd4dd 3eb24090 3e4f2093 -> 3eb35232 3f3931a7 3edf8ee0", + "40000000 be19bb9d 3f35f614 3eda278a 3f8afa40 3f5b004c 3f8afa40 -> 3fc92d87 3ed18c28 3f7ed863", + "00000000 3e24f3ce 3f0ed842 3e24f3ce bdf4e6eb 3f23ce92 be26001b -> 3e24f3ce 3f0ed842 3e24f3ce", + "3f000000 3f9e36e9 be0b5ff5 3f3ba9c8 3d8d8a91 3f51f912 3d8d8a91 -> 3f2b8bc0 3f0ccaeb 3ed65376", + "3f800000 bb915f3b 3f7c8fd8 3f7c8fd8 3f8508bf 3cfdd289 3f8508bf -> 3f7c8fd8 3cf0f000 3f7c8fd8", + "3fc00000 3f5fb9ae 3f9dbe5a 3f9dbe5a be07c736 3f9135c2 3ec40b3b -> bf272c9e 3f9dbe5a 3bfd7a00", + "bf000000 3f2efe06 3e8eb253 3e85ab84 3e85c2c1 3e486a6d 3e486a6d -> 3f2efe06 3e25e56d 3e0ad100", + "3e800000 3f215bd6 be4938d6 3e2b2c80 3f026e38 3f3ae561 3f995521 -> 3f0a2d22 bd524ecc 3e90de9b", + "3f400000 3f14cc7f bda11c7e 3d0e751e 3e10f40b 3e10f40b 3f8d2169 -> 3e4e1c1c 3d14b03c 3ee3a668", + "40000000 3f92eab0 3f9e7308 3f9e7308 3f8ee001 3f8ee001 3f70ac76 -> 3fa9fb60 3f9e7308 3f58eb30", + "00000000 3f76ce45 3f3625f1 3f76ce45 3e239cd0 3eb56ac1 3eb56ac1 -> 3f76ce45 3f3625f1 3f76ce45", + "3f000000 3f0b231a 3f0b231a 3ecc18e7 3ec20e32 3e6df05c 3f32e88b -> 3ed6987a 3eb965fe 3ef12f8e", + "3f800000 3f93cd7b 3e4cc140 3f93cd7b 3db2b66a 3f6cafaa 3f6cafaa -> 3ddf3340 3f93cd7b 3f93cd7b", + "3fc00000 3f531c84 3f78b2e6 be7f353a 3f6a37dd 3eeb1323 be1d4142 -> 3f85bf0c 3e7b6d68 bdf5b94a", + "bf000000 3f5886d8 be368b79 3d5e65e9 3f59c851 3f59c851 bd983034 -> 3f5886d8 bf30b7b9 3df27436", + "3e800000 3d944d6c 3f4a177a 3d944d6c 3eb392ba 3f25feeb 3f25feeb -> 3e24ec96 3f4a177a 3e80da41", + "3f400000 3f9fc9e4 be67fe89 be67fe89 be5dfc7e bce229b2 bce229b2 -> 40f53e56 3f612eee 3f612eee", + "40000000 3eaebe50 3f071ebb 3eaebe50 3f504e6b 3f4dde75 3f4dde75 -> 3f36de4e 3f03f541 3f33b4d4", + "00000000 bcb292ab 3f611ff3 3ef030f1 be28a403 3f050557 3f41ad3e -> bcb292ab 3f611ff3 3ef030f1", + "3f000000 3f73d070 bd3c2f68 bd01e640 3defcda2 3f0453f9 3f3dbd29 -> 3f0d2a91 3e9e4799 3eebb20c", + "3f800000 3f82c477 3eb66408 3f9c828c 3f892479 be6ee3d1 be6ee3d1 -> 3f9c828c be885028 be885028", + "3fc00000 3f10179a be3605e8 be3605e8 3f0f7eae 3f807a67 be730d7b -> 3e429e0c 3f6ee424 bde2dd0a", + "bf000000 3e7d48e8 3f64b107 3f917d5d bdc429c6 3d4ed598 3d4ed598 -> 3fb97971 3f458c2e 3f917d5d", + "3e800000 bd553e7f 3f1cd7d1 3f1cd7d1 3f3268a7 3f3268a7 3f46a087 -> 3dc9ca16 3f18da0e 3f1cd7d1", + "3f400000 3ee3800f 3f42ea8d 3d569c2c 3f7e64f6 3f057760 3f7e64f6 -> 3f2e9fec 3efad9b0 3f158a5b", + "40000000 3f0e29f0 3f897de4 3f897de4 3e09daa6 3ea44753 be400208 -> 3eb12d0e 3f897de4 c0151880", + "00000000 bdb84bc6 be484e26 be484e26 3f31227a 3eeab13d 3f155ce7 -> bdb84bc6 be484e26 be484e26", + "3f000000 3e27d54b 3efa7f4f 3dbaf5de 3f11b6ad 3ee035c7 3f86991b -> 3e5b8236 3eb1685c 3e949e64", + "3f800000 3f8b1c36 be5a974b 3f8b1c36 3d8c87bf 3f038f6f 3e74af30 -> 3e149850 3f8b1c36 3f015cf1", + "3fc00000 bdf29005 3f45874e 3f45874e 3f9ce5e6 3f9d52d0 3f996268 -> 3f9b536c 3f45874e 3f3e1c24", + "bf000000 bc732014 3f3355a0 be282195 bd068e4a 3e0c8c95 bd068e4a -> 3d7c33db 3f3355a0 be265a67", + "3e800000 3f4ed973 3d9c2d64 3d9c2d64 be725eb5 3f66a5b8 3f24378a -> 3f0d8d49 3e84b53c 3e4dd6fa", + "3f400000 3eed5c71 3eed5c71 3e6004cc 3f81b874 be60659d be426e16 -> 3eed5c71 3d26c5e0 bc2b38e0", + "40000000 3f9a2752 3f25e937 3f9a2752 3f3266d9 3e413d79 3eca41f2 -> 3f9a2752 3b883580 3e24e818", + "00000000 3f85e8cd 3f8817a8 be02f1aa 3f06d0d9 3f06d0d9 3f75a746 -> 3f85e8cd 3f8817a8 be02f1aa", + "3f000000 3f5029e7 3f64bd47 3eced5c3 3f400000 3f000000 3f400000 -> 3f5a7397 3f3e9dbb 3f261414", + "3f800000 3e98a382 3cd7d801 3cd7d801 be35183b 3f9d0ae1 be35183b -> bd300428 3e98a382 bd30042c", + "3fc00000 3ec49bc9 3f0cdf60 3eac19ea 3ee1bc26 3f756d2f 3f7cb7c2 -> 3e34e2d0 3f06c6a6 3f284896", + "bf000000 be48ce08 be48ce08 3e17727d 3f6ff617 3f3ec80f 3f3ec80f -> bebc7725 beb4b4a7 3e26f779", + "3e800000 3e872fa7 3f3a8810 3f81378f 3d8ba7a1 3f4594a1 3f6cc658 -> 3e5dd53c 3f41cff0 3f81378f", + "3f400000 bcf9d604 3e53f153 3e28ee93 3f249874 be72d279 3d46f616 -> 3e17264e bbb47d60 3d58f7e0", + "40000000 3f6f8443 be71f03e 3dca5dc8 3d5572b1 be305cce 3f95a736 -> bf5a2a63 bd214dd8 3fe2de66", + "00000000 3f3ed4cd 3f3ed4cd 3f7ea7e4 3f2de8a7 3f3df87c 3f45e9a7 -> 3f3ed4cd 3f3ed4cd 3f7ea7e4", + "3f000000 3f23e3e8 3f6d3e4e bd9357df 3f7a0e86 3e4311fa be1ae5f9 -> 3f48911b 3f0dc189 bddca1f4", + "3f800000 3ee9a62f 3dd789ab 3f444526 3eea6bd4 3f90ebfb bd8ae7b3 -> 3e9ebd8a 3f444526 bd3c1f20", + "3fc00000 3f55fb5d 3f20943f 3f20943f 3f42b002 bd433090 3f42b002 -> 3f55fb5d bec8cdde 3f70aeec", + "bf000000 3e5dbbfe be4f5198 3dc32025 3f574b4c 3f5b1553 3f574b4c -> 3e5fa6e0 bed2ec32 3d1593fb", + "3e800000 3f349231 3f92f07d 3e87b081 3f363021 3c0748f9 3f363021 -> 3f50e5e3 3f5d42f4 3ef8b4de", + "3f400000 3f88d254 3ec995d5 3ec995d5 3f400000 3f000000 00000000 -> 3f88d254 3f22050e 3dc995d4", + "40000000 3f609d81 3f974af1 3f21c0a8 3ecdccc4 3f1ccf91 3f87e410 -> 3c9051c0 3e3a53f0 3fddb58e", + "00000000 be2e487e 3f8eb02b be2e487e 3e800000 3f800000 3e800000 -> be2e487e 3f8eb02b be2e487e", + "3f000000 3ed03af9 3ecaaa71 3e525492 3e800000 3f000000 3f400000 -> 3e8ad1fb 3eaabe35 3e9cb2a1", + "3f800000 3e89d9de 3f934ef8 3f934ef8 3f2490d8 bddb1ffa 3f321f31 -> 3f8818f9 be3537e8 3f934ef8", + "3fc00000 3f8e8b3c 3f9b6759 3f897875 3e97a403 be2c1494 3f5247f7 -> 3dcc7300 bf7ac86e 3fa45ecb", + "bf000000 3f42040f 3d8e604c 3f42040f 3f726afa bd67cf4e bbfb9f7c -> 3f42040f 3e01f90b 3f91e7be", + "3e800000 3f16956d 3f1b9323 3f1b9323 3e4a00dd 3e4a00dd 3f695c82 -> 3ef2b58f 3efa3220 3f1b9323", + "3f400000 3ebb6e66 3f1cf4e4 3f0a6a7b 3f862f4c 3f862f4c 3da4bc9f -> 3f0d2578 3f1cf4e4 3e2e8bc6", + "40000000 be5ffa73 3eb3ca79 3f59c222 3f26d350 3f287de1 3f287de1 -> 3ff39a26 3faccf84 3f59c222", + "00000000 3d9b6618 3f277361 3f7ce27f 3eecdd10 3e2cccec 3e2cccec -> 3d9b6618 3f277361 3f7ce27f", + "3f000000 bcc8fa92 3f62e71b 3f62e71b be3daaee 3e2ed732 3e27afa1 -> befc6cea 3f62e71b 3f5e42a0", + "3f800000 3f19df16 3f7178d3 3f26d8be 3e517179 3e517179 3f25a4ad -> 3e98a953 3e98a952 3f7178d3", + "3fc00000 3f89c284 bdfd647b 3f85adec 3e936074 be22df0c 3f898bcf -> bdd871a0 be35569f 3f8bccd0", + "bf000000 3f96448f 3f530129 3d6a9671 3f47fcd4 3f24724b 3f31f656 -> 3f96448f 3f40f1b1 bedf738b", + "3e800000 be050074 bd0ff052 be050074 3d6c71ee 3d6c71ee 3f0f6e2c -> bdc95b3f bcdf52bf bdd97eb8", + "3f400000 3f7018c4 3d110162 3f3d1be5 3f4c8047 3df23806 bd44d0f8 -> 3f7018c4 3de76910 3e11c854", + "40000000 3f9b41a3 3f19ff2d be11a16a 3f99912b 3e229d8e be1f7602 -> 3f9b41a3 be8f96d4 be30ccb6", + "00000000 3f6dd3f8 3f680990 3f6dd3f8 bd21a7e9 bdc6f54f bdc6f54f -> 3f6dd3f8 3f680990 3f6dd3f8", + "3f000000 3f569302 3f19941f 3f19941f 3f919612 3f6afbd8 3efc736e -> 3f569302 3f235f71 3ef69921", + "3f800000 3e8030bf 3f3e5ca7 bdbf1504 3f3fc16a 3f103a59 3f1295f2 -> 3f3e5ca7 3f0f2e03 3f11853a", + "3fc00000 3d5e0520 3f8874fb 3ea37b41 3f65091e 3f65091e 3f4f7e50 -> 3fc93764 3f8874fb 3fa4ff93", + "bf000000 3f1a96af 3edbc531 3eef3109 3e800000 3e800000 3f400000 -> 3f4e1e3f 3f0b101d 3ecc32de", + "3e800000 3eb6dc98 bdeed571 bdeed571 3dc1f499 be3c8937 3e7cf226 -> 3e9aac5c be1db62e 3aef20c0", + "3f400000 3f5723a7 3f9a5208 3f9a5208 3f8ca597 3f981645 3f8ca597 -> 3f85ed37 3f9a5208 3f919d44", + "40000000 3f174c46 3f174c46 be6f9dae 3f2bd325 3f457e3f bd68d2f5 -> 3edff040 3f174c46 3e166f06", + "00000000 be03a2e4 3f7d94ac 3f7d94ac 3f8b8254 3d9d9cc3 3f6cb728 -> be03a2e4 3f7d94ac 3f7d94ac", + "3f000000 3f548125 3d2651f7 3f548125 3e800000 00000000 3f000000 -> 3f1f60dc 3ca651f7 3f548125", + "3f800000 3f52a613 3c623a11 3f52a613 3f400000 3f400000 3f400000 -> 3f52a613 3c623a11 3f52a613", + "3fc00000 3e16bef4 3ee1f5b2 3f064727 3ef2c5d3 3f4a08cd 3ef2c5d3 -> 3ecc5824 3f10ed4e 3e578174", + "bf000000 3df43f78 3e3ee898 3df43f78 00000000 3f000000 3f800000 -> 3e372f9a 3e6ea2c0 3daf769c", + "3e800000 3ee2d04b 3e3ad853 3f761acd 3e13ca31 3ef8cb51 3f08c5d3 -> 3ecb59ee 3eb5fc2c 3f761acd", + "3f400000 3f3b81aa 3f1aeb49 bd2b0a83 3f400000 3f000000 3f000000 -> 3f3b81aa 3f047ba7 3eb62956", + "40000000 bb8e3c33 3f5a2bba 3f164102 3f67820d 3ebda56d bda32065 -> 3fdab9f6 be1dccf0 bf3cafa8", + "00000000 bdab8b67 be4e3bd5 be4e3bd5 00000000 3f800000 3f000000 -> bdab8b67 be4e3bd5 be4e3bd5", + "3f000000 3e941f5d bb74bea3 3e941f5d 3f9febe7 3f82a060 3f82a060 -> 3e941f5d 3dee2753 3e868e42", + "3f800000 3f77aa58 3f903f6f 3e83853c 3e800000 3e800000 3f000000 -> 3f103f6f 3f103f6f 3f903f6f", + "3fc00000 3f991e3e 3f6e8cde 3ecf3f8c 3f270f4e 3d5e38e4 3f888e61 -> 3effba6c bebfd484 3fcbc56b", + "bf000000 3ea9fba6 3f1d7d78 3f1d7d78 3f52b938 3f52b938 3f9b50ff -> 3e94235e 3f36d127 3f1d7d78", + "3e800000 3f17efd8 3f17efd8 3f3cff49 3e961a4e 3ed31d09 3f948060 -> 3efbc8e4 3f02bed1 3f3cff49", + "3f400000 3f4f5533 3f4f5533 3f6bad07 3f18073d 3f890e4f 3f890e4f -> 3f15ddcb 3f649712 3f6bad07", + "40000000 3f8d64a3 3f84c72c 3f8d64a3 3f98e1d2 3f96b523 3f7ae88d -> 3f8d64a3 3f91fc66 3f3551c0", + "00000000 3f6a3a19 3f6a3a19 3f476ab8 3e7d03bc 3f8a572e 3ea71f7b -> 3f6a3a19 3f6a3a19 3f476ab8", + "3f000000 3eed3e90 3f22079f 3d253d6f be59d8f2 be59d8f2 3d10da2c -> bfd60694 bfcb2c7c 3eac5b76", + "3f800000 3f040f46 3f040f46 3f539176 be5b8e6a 3f47287f 3f47287f -> be693cc8 3f539176 3f539176", + "3fc00000 3f240897 3f2fbeb7 3f2fbeb7 3ea53462 3e04fdd9 3ea53462 -> 3f3599c7 3d91e160 3f2fbeb7", + "bf000000 3f8b5a93 3f8b5a93 3e468644 3edc025e be66781d 3f7d2c80 -> 3fb2c182 3fe0e346 be81d073", + "3e800000 be24f35c 3f33993f 3efe237d 3e800000 00000000 3f800000 -> bd9da06a 3f06b2ef 3f0c339f", + "3f400000 3c843ab2 be5a6057 3d254988 3f39e3bb 3f9469fb 3f189176 -> 3cbc532d bcbcd268 3cd21435", + "40000000 3dc1d042 bd4259b4 3e896ed4 bdff60bf 3f92d2b4 3f92d2b4 -> be1cab05 3f15946f 3e896ed4", + "00000000 3f20056c 3f8ee5b3 3ec4ea12 be490024 bddec905 3f800785 -> 3f20056c 3f8ee5b3 3ec4ea12", + "3f000000 3f143780 3f1fe0c9 3f143780 3f54008f 3f0c34da 3f0c34da -> 3f1a0c24 3f04ce68 3efdf386", + "3f800000 3d851268 be78fc55 3e9c581e 3ec76cdf 3f66fccc 3f81c20d -> 3df04920 3e8b2846 3e9c581e", + "3fc00000 3f6ec789 3f6ec789 be5e0929 3e800000 3f800000 3f000000 -> bdeec788 3f6ec789 3f4ed6d0", + "bf000000 3f5c46b9 3f5882ec 3f4fec5f 3f24c587 3ed68197 be7822f0 -> 3f5c46b9 3f7d1377 3fb0acda", + "3e800000 3e5b515a 3f88779e 3e5b515a bdec48b1 bdec48b1 bd738beb -> 3f2d8515 3fa88ca0 3edab620", + "3f400000 bd1a2075 bd1a2075 3f454e64 3f5d623b 3f844e0f 3f5a5f2b -> 3ef2cba9 3f119249 3f2b72bb", + "40000000 3f22803b 3f22803b 3f1af70d 3e1e65c0 3e1e65c0 bce17f58 -> 3f22803b 3f22803b bf54ccc1", + "bec4e7dc 3d754adf 3f991b09 3d754adf 3f1804ec bdd069a4 3f9f0746 -> be0c3d16 3fd8cf62 bec112a8", + "3d6c45a3 bc97f104 bc97f104 3f31a5c0 3f67fd4d be124d13 3f414477 -> 3cb8bcf4 bcc2e031 3f2fefe2", + "3e126fcc 3e1665bf 3f37fdb4 3d0017ef 3f3d3aa4 3f3d3aa4 3ed5f093 -> 3e6a22dc 3f37fdb4 3dade0b2", + "be7a848d bcefb985 3f204b93 3f742100 3f9ac05a 3f184cf8 3efd8aea -> be8a1946 3f2a1f03 3f8bb208", + "3eb2d3f2 3f959561 3dc05c29 3ee263c6 bdb2f89c 3f7ff80a bdb2f89c -> 3f398b28 3ef04689 3e810d95", + "beb85596 3f53de67 bc3baefa 3ee5e827 3f9a1bcb 3f9a1bcb 3e957285 -> 3f53de67 bea088b9 3f09d8d4", + "3f45acdc 3de0b008 3f8d94c4 3f8d94c4 3e8065f8 3f251700 3f8cad00 -> 3e612974 3f40cf8e 3f8d94c4", + "3fb1953b 3e63b24c 3ec112b4 3ec112b4 3f7a3c69 3f45fd7c 3f7a3c69 -> 3edfc31a 3e89259f 3ec112b4", + "bee267d7 3f0d6333 3ecdd69c 3f0d6333 3c55ee2e 3e03e380 be7c5422 -> 3f45920f 3eabd129 3fa1c31c", + "3c7defe1 3d59c974 3ef61008 3f27a980 3f400000 3e800000 3e800000 -> 3d7ffd3b 3ef3fb35 3f25ee01", + "3f958e97 3eb622a7 3e19ea1f be62852b 3eb1e969 3eb1e969 3f4de47f -> 3df514b0 3e1df7a3 3ee7e252", + "3f17c41c 3ef16671 3ee50e29 3f25d6c3 3f43f75c 3f43f75c 3f4f1fb2 -> 3f0e29f2 3f0ba692 3f25d6c3", + "be4e12ef 3e8851f4 3f890865 3e8851f4 3f84de70 3d08f662 bdbb7e14 -> 3dd5c848 3fa3b8b4 3ead7b78", + "be0391ca be1be4d4 3f9a0968 be1be4d4 3ef05d8d bde0db1c 3f2597cf -> be916b28 3fb13007 bea720cf", + "3fb11fb1 be2c5dd1 be079625 3f455ffb 3f85cb41 3f85cb41 3f861d26 -> 3f90813b 3f8ebd89 3f455ffb", + "3ed91049 3f07311b 3f07311b 3f91d096 3ef6abe2 3edb687c bdcbc70f -> 3f498394 3f3bd95b 3f0e7545", + "bdb9fa7e 3f9dd9fd 3d8079a3 3d8079a3 3f800000 3f400000 3f800000 -> 3f9dd9fd bc7ef928 bd326b44", + "be830fb0 3e0db93b 3e60b71b 3ec0b35c b991f7e2 3cb0217d 3f065488 -> 3e320dde 3e8b1901 3ec0b35c", + "3f33ef36 3d333100 3f67f475 3d333100 3f9ebb6d bd99a5ec be4c04e6 -> 3f265c91 3e6c3b28 bdb6ed34", + "befde356 3e9bf3ab 3ea38db1 3f8bc9f3 be4c0c43 be4c0c43 3c8a5114 -> 40db1941 40dbcf31 3f8bc9f3", + "3f7677a8 3f1eb202 3f8a3c49 be7c6ecc 3f8f223f bdabc9a6 3f8f223f -> 3f880aee bd1abe60 3f83e9c0", + "3ef5e5cf 3d7dd9fb 3f9e09e1 3e896dc6 3f8c53e4 3f09e5b6 3f09e5b6 -> 3f200c47 3f6edc92 3edc9954", + "be37ab65 3f9ba56e 3f452368 3f062c4a 3f021dbe 3f021dbe 3f83d4ff -> 3fa9c95f 3f4cf1a2 3ecccedc", + "3d126f38 be02ad16 3ea7bd8c 3ea7bd8c 3eae491e 3f4cd56e 3f4cd56e -> bdf1cdc4 3ea7bd8c 3ea7bd8c", + "3e70002a 3f5eb711 3ef5161f 3f372b96 3f23d1f4 3f1946bb 3f0dd24d -> 3f5eb711 3f0ea952 3f396dd6", + "3f86f461 be107ce3 bddb18c4 3d93429b 3e5e59d9 bc6a1d9b 3f0fe1ce -> 3d175ea4 3b7e9e00 3d93429b", + "3f09d024 3f8c23b9 3f1da7d2 3f95d5b1 3e2f3e2f bc85acfc 3f2aca57 -> 3f2ac715 3e89ad6c 3f95d5b1", + "bdd65b57 3e925bf8 3f99a5b8 3e925bf8 be0301ac bc825f77 be61d080 -> bf31b80c 3f99a5b8 bfb66aca", + "3fbf7143 3f47902a 3f47902a 3e2188bd 3ef72556 bdfc4cf1 3ef72556 -> 3f47902a bf2f1662 3f8b3ad3", + "3f935506 3f90c76e 3e87c20e be594fd9 3ea895b0 3e86153b 3ecdfea9 -> 3f6507be 3f4eb03f 3faabf7a", + "3e5ed254 be383f68 3f209120 3f209120 3e7458bb 3f72855b be158b77 -> bdd9e814 3f209120 3ef07bad", + "3d61539b 3f0bd55d be62801d 3f8f0e68 3f80c679 3f95cd4d 3f80c679 -> 3f11abd5 be171523 3f8df3a0", + "3f6e870e 3e2d91c3 3e2d91c3 3ecad1d9 3eac13c7 3eac13c7 3e7cfe12 -> 3ec2e66e 3ec2e66e 3e98c31f", + "be7e155a bd2b72f5 bcd6460e bd2b72f5 3f12310e 3f12310e 3f7d8dbf -> bd46a9be bcecc949 bd3b6820", + "be5d37ac 3f687bb5 3f16c7e4 3f687bb5 3f8642e8 3e61f606 3f9459e5 -> 3f6d40d9 3f2dcac6 3f687bb5", + "3d5c8a67 3f88912b 3f88912b 3f18f40d 3e16f138 3f86a1e4 3f9f16fe -> 3f821602 3f876fc7 3f1f6c99", + "3fae73f1 3f9f4861 be2f136b 3f319227 3f607345 3f93f2e3 3f93f2e3 -> 3f55bab2 3fe107dd 3fb8ddfc", + "3eaa0ecb be29d757 3f480b92 be29d757 3f73e311 3e2411bd 3ed80492 -> 3e18588d 3f10c6a8 3b88bd80", + "3fb1ee76 3f7acf55 3f7acf55 3f6d4ea8 3db388d2 3db388d2 3f5b7a6d -> be78c15c be78c15c 3f8009df", + "3f3c8d36 3f84c209 3f7510bd 3f60f002 3f834764 3f8927ea 3f834764 -> 3f809171 3f82105c 3f7671f0", + "3e90eacd 3f2d8b81 3f2d8b81 3f6cd0fa 3f487f6d 3eb27633 3f84ce75 -> 3f2f056e 3f12f142 3f6cd0fa", + "3f92b916 be14a60e 3cb14af8 3dab1678 bdceaeec 3f55e5bb 3f55e5bb -> 3c1e6500 3dbda14b 3dab1678", + "3f2fb3f0 3f820807 3f7ceb3e 3bf73e35 3ec92eb2 3f9ac042 3f814009 -> 3f0b9536 3f80e937 3f15af28", + "3f6822e5 be7a9c04 3ee6893a 3f93b54f 3f821cce 3f6ea237 3f821cce -> 3f8304e4 3f8032d3 3f93b54f", + "3f563c17 3e52bbc0 3f494e25 3d0cfc17 3f92bbad 3f8141e5 3eb0bcf0 -> 3f310ee9 3f353dd5 3e50a971", + "3fa9418a 3f84fb1e 3c398b8b 3f84fb1e 3f895827 3eeb3aae 3eeb3aae -> 3f84fb1e 3f15a5dc 3e81b80c", + "3f1a2d62 3f65e2c8 3f5b5e30 3f4dc233 3f621a94 3f621a94 3f8e3355 -> 3f49818e 3f455296 3f5c4a14", + "3f86c329 3f69d045 3f96eb4f 3f96eb4f be688f27 3f989269 bd91352b -> be91cd3e 3f96eb4f be0b65a8", + "bee26907 be3687e3 3f99ed02 3f9cfe13 3f5c6b35 3f2ed5b6 3f2ed5b6 -> bf4ca889 3fa6ed47 3fab5982", + "3f56af14 3f80da03 3f779a01 3f0ad6dc 3f1d6ce9 bd119c5a 3f1d6ce9 -> 3f80da03 3ddbbd18 3f6e8508", + "3f81cce4 3d1e63e4 3e0c2490 be5f0d12 3d7c8a38 bd972f5c bd851ae3 -> 3e0d8e98 be2c205e be12ab5e", + "3f464d3d 3e8a1ccd 3e4786ba 3f5c128f 3f3184ff bd74fe13 3f354c69 -> 3f367b8c bc49ed60 3f5c128f", + "3f7690a6 3eac32e5 3f829847 3f911137 be089e07 3e225cdc 3e225cdc -> bf67f540 3f9088ab 3f911137", + "3f367fe2 3de85a91 3f7b1c36 be73d4c4 3f358ee6 3f937de6 3f4da3d2 -> 3eed09e0 3f7b1c36 3ed695fe", + "beaf4797 3f3941cf 3f353c2e be186fea 3f034b54 3f034b54 3df7c31f -> 3f3941cf 3f33dbb2 be843b55", + "bed04da8 3ed5ac07 be51a1c1 be5e2093 3f320eef 3f007532 3ec71272 -> 3ed5ac07 bed22cb2 beccd814", + "3f38796f 3f20a8d3 3f20a8d3 3ef586eb 3e91a974 3e91a974 3f09c4dd -> 3ed42e10 3ed42e10 3f16124a", + "3f37f7dc 3f8740dc 3f8740dc 3f824a95 3f13072e 3f9b8c76 be062a61 -> 3f27fc66 3f8740dc 3e517334", + "3f835096 3f119753 3f978bb7 3db8a187 3f70ff3e 3f05dbf1 3f514c64 -> 3f9995cc 3f24dc05 3f86b8e8", + "3e4c9139 3e35e321 3e35e321 3f9c33cd 3e20846c bd186904 3f447824 -> 3e448a6d 3e057293 3f9c33cd", + "3faaffc8 3e97456d 3e97456d 3ef7ad46 3f998eee 3edae0d1 3e82e4d5 -> 3f0c0800 3e062e19 bccb1080", + "3f8e3058 3f734bb7 3f734bb7 3f167db7 3f70727b 3f70727b 3e1a1055 -> 3f734bb7 3f734bb7 3dd4e1fc", + "bdde9d3f 3e979db0 3e979db0 3d92edbd 3f650299 3f04bf43 3f4f233c -> 3e979db0 3e9e8b1d 3d4e8c50", + "3f218b06 3f8b9f3b 3f2eeebf 3f8b9f3b 3f9e3be0 3d6b34e8 3f9e3be0 -> 3f8b9f3b 3e91760b 3f8b9f3b", + "beb2e385 3f1b362c 3e1b852e 3f355e89 be7d5a71 3f19ef1d 3f84391c -> 3f609e78 3d793ce4 3f355e89", + "3f0e12dc 3e22b265 3e9203d3 3f062ac6 00000000 3e800000 3f800000 -> 3d90cee9 3e4c6b80 3f062ac6", + "bea8d7c3 3f506452 3f64e4cf 3f23e2a8 3d8813d6 3eba051b 3dc0665f -> 3f83a795 3f64e4cf 3f466986", + "3f984775 bdb2a18f bda40e2f 3d648673 3e624db3 3f98250e 3f98250e -> 3ceca0ec 3da70ddd 3d648673", + "be8bb4ad 3f07e341 3c878d6a be16194f 3f8f2f05 3f6801d6 3e4fcacc -> 3f07e341 bdc52fbe be59f5c8", + "3f8aacb4 3ef6bfc5 3f10accb 3f10accb 3f228378 3f228378 3f5c0101 -> 3ed2fc47 3ecf6ec8 3f10accb", + "3ed5da0d 3f2701b0 3f68fddc 3f2701b0 3e7de274 bdfc09a4 3e7de274 -> 3f429132 3eaebe72 3f429132", + "bea6475c 3f7421de 3f7421de 3f79fc95 3f98c1bb 3f8f7a32 3f5a7d64 -> 3f723b24 3f7729ad 3f888e5a", + "3fbfdab8 be71a69a be771ecc bdc70e81 3f2bdb32 3f2bdb32 be4a4d6f -> bce507c0 bccf33b8 3dbb1b19", + "3eacab61 3f15a9b3 3f15a9b3 3ed45509 3f86c79d 3f9307c3 3e700a62 -> 3f11751d 3f15a9b3 3ea1531e", + "beafd652 3f2ef39e 3e0455e0 be0aec17 3ee1a90d 3ee1a90d 3f77e434 -> 3f4fb014 3d88c8ee bed57bf8", + "3e680e28 3df4a422 3f955e57 3f955e57 3f8dc0bd 3ea7a725 3f9a551c -> 3eaba964 3f796c7a 3f955e57", + "bcdf3569 3f8bf4d6 3f8f9b5a 3f8f9b5a 3eb6b6a2 3f84a683 3eb6b6a2 -> 3f8e6c22 3f8f9b5a 3f922c1d", + "3f8b3d47 3e82745d 3f0fbbf7 3f94d465 3ebc5f62 3e25e96b 3ebc5f62 -> 3f9f08c9 3f01f917 3f94d465", + "3ed35f9f 3f0c8cd2 3ee32ee7 3ee32ee7 3ec62154 3ea1a63d 3ea1a63d -> 3f0c8cd2 3ee4131b 3ee4131b", + "3f6254e7 3ec740b0 3f706f00 3ec740b0 3d7d7db2 3f67c5a8 3d7d7db2 -> 3dd09c8c 3f706f00 3dd09c8c", + "3ed28780 3f782973 3f91d449 3f1a941e 3f000000 3f400000 00000000 -> 3f621254 3f91d449 3eb608ea", + "3f791e3d bc952bf1 3f906f6d 3de9a4b4 3e539c87 3e4ebf28 3e539c87 -> 3f8c7d66 3f8d3440 3f8cf1ef", + "bd9e682d 3f59dde1 bdacd043 3f5dc629 3f8d4f1d 3f0c761a 3f8d4f1d -> 3f599083 bdfe6206 3f5dc629", + "3f82f9cb 3e942ee4 bdabf491 bdabf491 3f963096 bc6d2d15 3ec02c07 -> 3e942ee4 badf0c00 3dc6028b", + "3f3f249d 3e8d9e1a 3e35f4cb 3e8d9e1a 3f5706de 3ee2b39f 3ee2b39f -> 3e8d9e1a 3e1d940f 3e373cb4", + "becb54ac 3f5adad2 3f6e0edb 3f670fde 00000000 3e800000 3f000000 -> 3f98e263 3f8ea9ff 3f64489c", + "3f524522 3de81f4a 3f67c32a 3f14be4a 3f5b36f2 3f5b36f2 3f22a827 -> 3f438b8d 3f67c32a 3f27d196", + "3e657438 3f067c47 3f9f6239 3f067c47 3f26153e 3f0b9e57 3f24fa90 -> 3f2fc755 3f99b15d 3f2f4dc2", + "beb3ac49 bcd5b63d 3f3789d7 bcd5b63d 3f1907fd 3f1907fd 3e86d5a7 -> be92dc3c 3f3789d7 be15965b", + "3fbdbad4 bd8ca7d7 bd5b1565 be627442 3d100d44 3f1cdc0f 3f1cdc0f -> 3cea0dfc bd5b1565 3ce034c8", + "3f3a3c44 bd9fea6b bd9fea6b 3f9069de 3f9877b7 3f9bed69 3f74ff84 -> 3f4801c8 3f4cab47 3f73c80f", + "3f602587 3ed7d484 3f47060c 3f448b20 be53ba56 3daca314 3eea2f68 -> be82b19a 3e638448 3f46b70c", + "3f858e91 3f888f55 3ec57c37 3ec57c37 3f46a943 3f46a943 3d93c968 -> 3f888f55 3f8c5854 3db1b448", + "be545479 3a3c9b14 3f1cd547 3d3598ea 3ef71407 3ef300ef 3df0d5ae -> be0130a8 3f1d5e91 3cb8eb59", + "3f82c308 3f286cc6 3e56f2d1 be0ac7ab 3c248466 3e8bacf8 3f22fca0 -> bb6ba000 3e9121a4 3f2ccebe", + "3f7b919f 3d82dff2 3d82dff2 3e276b89 3f012bfa 3f04b8f0 3f012bfa -> 3e2140e4 3e25a7a2 3e2304cb", + "bec69016 3ebfa02b 3f8bfa10 3f8f2e19 3f830f58 3ea666a9 3ea666a9 -> 3daf5238 3fb0a315 3fb51524", + "3fb9178c bc86d323 3f2336a3 bc86d323 3d4695d7 3d4695d7 3bb86515 -> 3f6de414 3f2336a3 3dea2e51", + "3f02d3b6 3f8ec585 3f7afbea be71c199 3f878cf3 3f6eee74 3f4ef394 -> 3f8ec585 3f7b544e 3ea3afa4", + "3f950875 3ea89263 3ea43dff bdec07f2 3f34d616 3e9569a9 3eb5f490 -> 3ea89263 3dd860de 3e58e0ed", + "be3cb5f1 3f4cf5cf 3f726f46 3f4cf5cf 3f9b15ae 3ebe8c21 3f9b15ae -> 3f460dda 3f88b1c7 3f460dda", + "3f46f2c0 bd6aa9d3 be77aa09 3f669e47 be12d984 be12d984 3f9f27a8 -> bdbf83b9 be09e08c 3f669e47", + "3f0b80dc 3f596a6c 3e31f754 3e31f754 be4ebc9e be0a1f20 be4ebc9e -> 3f8a22d8 3f0ab956 3f45949a", + "be6ed46d 3f43118a 3f43118a 3dfd2446 be39347a 3e0c0f9f be39347a -> 3f965cd4 3f43118a 3ec65dd4", + "3f6f55a3 3f69accc 3f8720bf be596929 3f9ecc8a 3ee06dd6 3ea8e5fa -> 3f85efed 3ed5baca 3e7e93ef", + "3f97abca be040850 be19c08b 3ecd1b9a 00000000 3e800000 00000000 -> 3cc35590 3f00a0a8 bd97b8f0", + "3f30e976 3f3ec2e8 3f163c61 3f3ec2e8 3f8d4311 3f495be9 be206e0e -> 3f3ec2e8 3f0c5e8a 3e20e024", + "3eec70d7 3f6af67f 3f99c639 3f8690d9 be1d1b6e 3f266c54 be1d1b6e -> 3eb9e090 3f99c639 3edea814", + "becbe580 3ecb223d bdcd052e 3f027dbd 3f7ada3f bd1d65f6 3f7ada3f -> 3eb418ad be072e83 3f027dbd", + "3de509c2 3f353689 3f89e2f5 3ebd1775 3f88035b 3e79faff 3e79faff -> 3f3fc9c5 3f7c0476 3eb61d8a", + "3f0a124b be0c251b 3ea6c7d6 3e69daa3 3f86a243 be560fb3 be62a00e -> 3de6b064 3debce5a 3d8bbf40", + "3f0cde45 3e5c7812 3f17738e 3f3e4bd6 3e81ac7b 3f921a99 3f921a99 -> 3e401722 3f2cd38f 3f3e4bd6", + "3f69e873 3f95e39c bd380f41 3f95e39c 3f144f7a 3f10eb16 3ee04aa4 -> 3f95e39c 3f85534b 3f68fcba", + "3f7f5676 be7e42fb be7e42fb 3f303ade 3f000000 3f800000 00000000 -> 3eaf71f6 3f2f9c0f 3ae96c00", + "3f36d7c4 3edd6095 3f8838a3 3f738239 be3f2937 3ed2f4b1 3e41badc -> be62211a 3f8838a3 3f1eefaa", + "3f4bd0ea 3ef8a382 3f19e245 3f848f6b 3e00115b be52cff2 3c2443a8 -> 3f6c6b48 bf9e0b04 3e8ded8a", + "3f9995eb 3f8c0dca bd301dab 3e449193 3eee44a2 3ebd5f47 3f593b67 -> 3f005505 3f14b26c 3fa3232f", + "bef850c4 3f84853b 3e32c553 3f31a76e 3f800000 3f800000 3f000000 -> 3f84853b be78b267 3f478b1d", + "3ee48d38 be4c63a3 be4c63a3 3f9c3430 bca40186 3f78da8b 3f05dc0f -> bdf947e1 3ede55d8 3f77f748", + "3fbdb567 bb2a9641 bb2a9641 3f8b907f 3f000000 3f000000 3f000000 -> bb2a9641 bb2a9641 3f8b907f", + "3f409869 3c72a6bf 3f8e8ffd 3f7a97dc bdbc8bf8 3f84483d 3f8cadbf -> bd883c47 3f882934 3f8a4941", + "3e9a2f7b 3ddf33db 3ce15218 3e8a9ec4 00000000 3f400000 3f000000 -> 3d9bfc8f 3dce5850 3e796922", + "3fa73f86 3f8fdcd6 3f8fdcd6 be050a90 3f0f38ef 3f8c91a0 3eb85f73 -> 3ece9918 3f8fdcd6 3f057961", + "3fa79f8b 3f8b534f be09892a 3e4edfd4 3f800000 3f000000 3f000000 -> 3f8b534f 3f411928 3f2671d6", + "bee0dde4 3f615cff 3d979f62 3f742a02 3f778d31 3f182571 3f8ddf7d -> 3f66c8ef bdf1c962 3f742a02", + "3f1798a2 3f9ba816 3f19152e 3f9ba816 3f992144 3f5d1202 3f5d1202 -> 3f9ba816 3f4380d2 3f820456", + "3f5c8e42 3e0ae366 3e7dd5ea 3e180c66 3f800000 3f800000 00000000 -> 3e6debb0 3e7dd5ea 3ca86a00", + "3f9eca07 bdfe580a 3ec213c0 bdfe580a 3ed961bb 3f60518f 3f60518f -> 3e83f3e0 3ec213c0 3f00071c", + "3fa972ab 3e167bb6 3e167bb6 3f9fa946 3f400000 00000000 3f400000 -> 3fcd4538 bd42e9c0 3f9fa946", + "3ef99ae4 3f6f21a2 3d64eea4 3d64eea4 3f038aec 3f99f8b1 3ea894ae -> 3f2c59da 3ef7d2d0 3e1cf8c0", + "3da0a06e 3e3ba734 3e39f499 3e39f499 3f800000 00000000 3f400000 -> 3e3ba734 3e2b5eec 3e3668be", + "3fabb6cd 3f7b8854 be17f56b 3f4afc0e 3f42b456 bdb03c20 be473083 -> 3f7b8854 bdc9a22d bf1b9fe0", + "3f9b1e0c 3f971984 3d19e8b1 bde61e9f 3f8b380e 3f8b380e 3f2982a4 -> 3f971984 3fb61784 3f650bd0", + "3faf3cb5 3e992771 be753557 be753557 3f24b617 bd9ff94e bd9ff94e -> 3e992771 3d1e52cc 3d1e52cc", + "3eef1362 bca9d69a be21bd5b 3ca19135 3ef45002 3f07d9b8 3f880806 -> bbe2a318 bda303b8 3ca19135", + "3f779e5d bdaaecc2 3e84480a 3f6fc1bc be18e0b9 be18e0b9 3f5252a7 -> be2b5d67 be1fe7b2 3f6fc1bc", + "3f7d75b8 3e6204d1 3e7dfa91 3e0b6858 bd96383c 3f86f1e9 3f9630a3 -> bc57a030 3e647455 3e7cd78a", + "3f4f0d05 3f4d860f 3f4440f1 3f4d860f 3f83f42d 3ef6e68b 3f45be9c -> 3f4d860f 3ee69071 3f23d994", + "3ed8a883 bdd085ee 3f966f49 3f966f49 be2615fe 3f3830c5 3f3830c5 -> be2ef1ac 3f966f49 3f966f49", + "3f4ddc77 3e550026 be3fc6e1 be0b7957 3f000000 3f000000 3e800000 -> 3e550026 3e05b917 3d694ce0", + "3ed8e504 3ec1dac3 3e998cd3 3e998cd3 3f5ed20f 3f5ed20f 3c8757ae -> 3ec1dac3 3eaa9fbb 3e341f8e", + "3f1ebb8c 3f8a7558 3f610ad8 3f9fd573 3e27d85a 3e45cd2f 3f71febe -> 3f0b956f 3efc0425 3f9fd573", + "be7969b2 3f9bf0f1 3eec4f32 3eec4f32 be6d5938 3f0ed45c be6d5938 -> 3fd1b3e2 3e8df01c 3f327def", + "3f85a2a7 3f74577f 3edb2911 3f8c5feb 3f68e3ab 3eab3d25 bd2406b7 -> 3f8d2d16 3ecdde6e bdca1a50", + "3f04c113 3f81427e bd3ffd2f bd3ffd2f 3f14a628 3e6e4316 3f14a628 -> 3f81427e 3e3fc59b 3f0048ad", + "3f8ae4eb 3f87678d 3ec6e458 3f2f0fd8 3e8f9c2b 3f966d95 3f966d95 -> 3e3c57f8 3f8eb26a 3f8b7aa4", + "3f0dd123 bda78b34 3cfe394f 3f27de7a 3f4c40e5 bd9d2170 3f8b6409 -> 3e6b2bf4 bc4089e2 3f27de7a", + "3f5afaf5 3bf43c17 3d350764 3d350764 3e93368d 3f36e736 3deaeb54 -> 3c8576cb 3d350764 3c4c284c", + "bd9b61eb 3e037763 3f66fea6 3e037763 3f13f54a 3e7ab772 3f8585a1 -> 3dcd3310 3f746827 3d8ead22", + "bec0c4dc 3f7ca3d0 3ef2338c 3f0e3aa1 00000000 3f000000 3f400000 -> 3fade131 3ece9096 3ec95178", + "3f64bfe3 3f524c67 bc30d926 3d4823f3 3e800000 3f800000 00000000 -> 3e8aba48 3f3b9e60 3baa6f50", + "3ea78807 3f74a484 3f733fec 3f74a484 be04f6aa 3f91b585 3f91b585 -> 3f1b7659 3f73b49a 3f74a484", + "3f4a56bf be49a502 3f44b719 3f2e5736 3f60b98b 3f95efd1 3e84319f -> 3ed3e693 3f44b719 3e8da122", + "3ec74add 3e113b50 3f0806f8 bddd8636 3f1636cf 3f7cee9c 3f7cee9c -> 3e567b58 3f0806f8 3e102451", + "beacff76 3f9b34a0 3f3420f6 3f9fd5f3 3ecd9ca4 3f30c726 3c2dd5dc -> 3fb03d64 3f04faaa 3fd50325", + "3dba9ddb 3f054e75 3e89ae0b be6c641f 3e775132 3f98a725 3d998021 -> 3ef73d1f 3e956dad be53cc14", + "3f9af97c 3f8a0298 3f5fabfc 3f24614f 3f5e52bd 3e33e23e be5ca9cd -> 3f8a0298 3da3b310 beeb210e", + "3f59db00 3f8d6aab 3ea35374 3e995ad7 3f026569 3ee1f7fa 3e98e6e9 -> 3f8d6aab 3f5cb818 3f188aa0", + "3d229025 3ee3d622 3eeb3f18 3ee3d622 3f51645c 3f51645c 3ede2c80 -> 3ee4216b 3eeb3f18 3edfbf4c", + "3f6a9507 3f3068cc be59db95 be59db95 3f8d892c 3f4f1825 be716b93 -> 3f3068cc 3ee36992 be1c1779", + "be90ee87 3f53dd24 3f77e816 3f53dd24 3f800000 3f800000 3f800000 -> 3f53dd24 3f77e816 3f53dd24", + "3ef68c79 3e2b4d27 3e2b4d27 3f0a0527 3c827a0c 3f9b8d9b 3f9b8d9b -> 3db8981b 3eb154ba 3f0a0527", + "be62b3da bdf29b2c 3f35fdae 3f35fdae 3f2a8cab be25c1c2 bd83fcfa -> be9aa92a 3f681248 3f622ded", + "3f447274 3f2e92cc 3f0f9745 bd02e842 3e4a3438 bd8dbd78 3e4a3438 -> 3f2e92cc bd58c880 3f040f32", + "3f2daafa 3f3c0bce 3e73338a 3f5406cd 3e2fa282 3eee623a 3e2fa282 -> 3ee2ee18 3f236406 3ef25ad1", + "3fbb14de 3f2d3b65 3f3ef462 3f44b43b 3ea99f26 be11b529 3f7dba01 -> 3d811e08 bf016a44 3f44b43b", + "be929f9d be679a96 3eeae7bb be679a96 3f923550 3f607ce0 3f607ce0 -> bed83c3e 3efa8843 bec89bb6", + "bd024ac1 3f9b1508 3d8560b3 3e81e035 3dfef5f3 3c7ea705 3f7f9af7 -> 3f9f6671 3d886449 3e648ca7", + "3fb80211 3f9e9039 be13d6c0 be13d6c0 3e803439 3e803439 3e9b874a -> 3f6d084b 3fc3fbd9 3fec07ec", + "3eff662b 3e4b3e98 3f83005b 3e9026ee 3f9bf923 3f1243ff be570015 -> 3f1c28ba 3f4096b6 3d59a734", + "3f6b1c4f 3f1a09ca 3f92a642 3f92a642 be460399 be460399 3ec033f3 -> befc5f04 bee5a4e4 3f92a642", + "3fb865e2 bcab6d0e bcef7686 bcef7686 3e57dd37 3f8a4434 bdfba1d1 -> 3b5ab318 bc8d72c2 3c859982", + "beffdedb be4ca696 3e7440e6 be4ca696 3f478597 3f9dbb70 3f0119dd -> bec0103b 3e7440e6 beb2706e", + "3f5b4ee1 3eb9a238 3eb9a238 3f9a636d 3e8239ed 3e5a9b24 3e8239ed -> 3f8ae970 3f6b52d9 3f9a636d", + "3f563acd 3f19f70f 3f9eaba6 3f14692b 3f38b56f 3e7880f6 3f3227e7 -> 3f915784 3f0d197f 3f8c2d96", + "3eee0413 3f25a6b2 bdec0c98 3f8cd5f1 3f000000 00000000 3e800000 -> 3f5b9608 bd7ca1b9 3f583350", + "3f90aac7 3f93b5f0 3f93b5f0 3f87c498 3e800000 3f400000 00000000 -> 3e91a864 3f93b5f0 be0d6db8", + "3f89c787 bd159ded 3ee3edd6 3ead227c 3f2f3389 bc7c5870 3f90797c -> 3e9630af bd261898 3ee81d8c", + "3ec233da 3f84e9d1 be2fcf28 3f84e9d1 3f303d92 3e993e0a 3f5fcad5 -> 3f74670a 3ce7afa0 3f84e9d1", + "bce41873 3f9c3579 3f9c3579 3f8993ba 3f5722c3 3f20122e 3f20122e -> 3f9c3579 3f9d5277 3f8a2be9", + "3f781d91 3f3d9e36 3f6506eb 3dc96548 3e862927 3e2ddae7 3e2ddae7 -> 3f63d032 3f16e0d0 3f109989", + "3fa016df bd102cf3 3ecf93d9 bd102cf3 3f800000 3f400000 3e800000 -> 3f041143 3e8eac60 3e0ad833", + "bee285ae 3f18019e bdfc297c 3f18019e 3f800000 3f400000 3f400000 -> 3f18019e bebfcf03 3f28d1b8", + "be964dab 3f4b4db9 3f7904af 3f4b4db9 3f1044f3 3e5aaa90 3e5aaa90 -> 3f3de230 3f9335d5 3f6b492a", + "be9e2b2c 3f26affd 3f2d3502 3f4ba8c5 3f800000 3e800000 00000000 -> 3f1b4419 3f52fc68 3f854983", + "bef2992f 3f9cfdde 3f8e269c 3f9cfdde 3f943308 3f973115 bcc07b78 -> 3f9e76c4 3f871e6d 3fe8dba2", + "3fae0e4a 3d4d841e 3f6fce7a 3f3d97ad bd8b9bee 3f21c35e 3f9b0f7b -> bdb7c5ad 3ea79dfc 3f80efe3", + "3edc6483 3eeaafd0 3f8023e5 be5dfe05 3f504016 3f906b6a 3f906b6a -> 3f125eb5 3f8023e5 3e9d6aac", + "3f9ac10f bda44f7e bda41bd8 bda44f7e bd1a73a1 3e8eb8c6 bd1a73a1 -> 3cf4bba8 bda41bd8 3cf4bba8", + "bd55bbb0 bda83cbd bc869c9a 3f892957 3f35b968 bd8b193c 3f2901ef -> be11c408 bc439e07 3f89a98e", + "3e89dd98 3e854b9c 3e5cc93d 3e854b9c 3f6a055d 3e5c5e63 3e021483 -> 3e854b9c 3e323c08 3e4cc810", + "3fa9a82f 3f2cd113 bd17a79d 3f9ac9c5 3f98cec3 bd189bb2 3e0198c2 -> 3fb10ac3 bd1b8a4f be650048", + "3f2c7a1d 3f226d0d 3ddb11ef 3ef3e92e bcab501a 3f57adec bcab501a -> 3e491bb8 3eecbbd7 3e144ad4", + "be9bb6b7 3e4f3d0a be499b43 3f9dae8a 3f9fadb6 3f2c3c16 3f4dbdf8 -> bde2c1d0 beeae9ca 3faebe16", + "be1f5aef bd380f75 3f9d077f bd380f75 3f400000 3f400000 3f800000 -> be47cc33 3fa32376 be78abeb", + "3facd5b8 3eec61b8 3eec61b8 3f17d7c8 3f865f60 3e734295 3f9a4a22 -> 3f0929cf bb7ddc80 3f17d7c8", + "3fa6b601 bd98e9b7 3e607329 3f382a84 3f1c28fa 3f1c28fa 3f669989 -> 3f2836c3 3f117694 3f382a84", + "3e1ae174 3f946651 3f089d86 3f089d86 3ba2c400 3ee50801 3f2811b5 -> 3f7c3f76 3f128a07 3f20d7e0", + "bd79f7d3 bdf4577a 3cac1fc8 3cac1fc8 3e8e7b78 3f47e543 3f7a24e8 -> be020025 3cae3bf6 3cac1fc8", + "3f910888 3f5ac3a5 3ea425cc 3f5ac3a5 3ec5f601 be5f5e69 3e189939 -> 3f5ac3a5 bf16c452 3e84da2a", + "bdfb560f 3e85af7e 3f31a952 3f7e28de 3f7b0ee2 3ee8e4da 3ee8e4da -> 3e2f6b3b 3f38ff4d 3f877119", + "3f572bc1 3f45f3c7 3eb400a2 3eb400a2 3f000000 3f400000 3f000000 -> 3f0e7deb 3f34bc3c 3efa8cc1", + "3f058502 3f094ad0 3d883dfa 3e2ddb9a 3f36ffa4 bdfbd329 3f36ffa4 -> 3f094ad0 bc856a78 3eb8cd7e", + "3fa4b5d2 3f43ec60 3f8325b5 3eb67727 be6ee335 bd06f799 bda0d3c9 -> 4111d68e 3f8325b5 40428dc5", + "3e34a97f be5d7bf5 3da09545 3f4245a1 3f273ce7 be3d2611 bdef4bf2 -> bd353bb0 3cdae1f4 3f19ddda", + "3ed38bf0 3f221a97 b9ad7ebc 3f221a97 3f8e54be 3f2c9962 3f3e9cf3 -> 3f221a97 3e223e47 3f0bf9ab", + "3fbbebf6 3f5a0b40 3f5881c0 3f5881c0 3d36a676 3f08188c bd46057f -> be967264 3f5ac376 bf02775e", + "3fa9017f 3f9b60ac 3f9b60ac 3ebd11ec 3f83f052 bd90ace9 3e4ca419 -> 3f9b60ac beff5878 3e450f5a", + "3ea97c71 be58a773 3cc3765b 3f675335 3f1a084a 3e38bf8b 3f69b6ea -> 3d63bd8c 3d99c0b2 3f675335", + "3f0c3665 3f00dab8 3f00dab8 be212730 3e800000 3f000000 00000000 -> 3ebb2272 3f00dab8 bd91c708", + "3f117cc2 3e3d565b 3f69a6ae 3e3d565b 3f9c8a29 bd360c7b 3f9c8a29 -> 3f193851 3ec01404 3f193851", + "be84f364 3ec6264c bdc81ade bdc81ade 3f565501 3f96aaa6 3f360590 -> 3ed50159 be64f099 be3c31c2", + "3fad9770 bde53784 3edb5305 3edb5305 3f892d58 3f6579c1 3f0e4dd0 -> 3f1eed6e 3eaaab2b 3e185234", + "3f5ebdcd 3e9f2ec7 3e9f2ec7 3f6ed035 3f08b434 3ef2eb6b 3f334b00 -> 3f28c52a 3f171a73 3f6ed035", + "3f9bbef2 be680949 3ed6419d 3f48b645 3e858b90 3f004145 3e881c64 -> 3f0bb87e 3f5cff67 3eac29ed", + "3f239dc5 3f99a1c4 3f403b22 3eae5251 3ea59e08 3e9efe7c 3ea59e08 -> 3f99a1c4 3f80f2f1 3f63d59a", + "3da66ba9 3f41db8b 3f86b8b2 3f0724c9 3f88a77c 3f8dce94 3f8dce94 -> 3f47343f 3f86b8b2 3f120e8e", + "3f153ec4 bd9b0889 bd9b0889 be163d5b 3f162008 3f838bcb 3f475180 -> bd687302 bd9b0889 bdc1c6ee", + "3f8c4162 bbe8788b bbe8788b 3f201bdf 3f5c8466 3ea4b4cc 3f5c8466 -> 3f2f9cc9 3e836267 3f201bdf", + "3f9cdd56 3c854948 3f109cfd 3f915e82 3d0740a6 be1451f0 3da2ca85 -> 3f131311 c02a7789 3f915e82", + "bd9ebf36 3d44d313 3d44d313 be11fc74 3e1b13b4 3f796724 bc3b8106 -> 3d51b59b 3d44d313 be1d41d7", + "3faf2e6b 3f75f968 3f34be08 3f75f968 be0a4be9 3f88277d be0a4be9 -> bf0568ca 3f87026e bf0568ca", + "be2ab80c be47837b be47837b 3db9333f 3f891b75 3e8e8ee9 3e8e8ee9 -> be7836d0 be6cc9fc 3dd00ce8", + "3fbc25c1 3e13cc94 3ec622bd 3f287ad5 3c552f0b 3c552f0b 3f3d9316 -> bd502e90 be28cd9a 3f287ad5", + "3f318543 3edeb341 3ed64dd2 3ed64dd2 be69e1b7 bd19ed63 bd19ed63 -> 3ffbb647 3edc2053 3edc2053", + "3f8b453a 3f766d32 3dfddcc1 3f4e1f0a 3e800000 3f400000 3f400000 -> 3e875a96 3f84aa49 3f79f9b6", + "3f352595 3f40e45b 3f3b190a 3e51b1bd 3f851f17 3f851f17 be06183c -> 3f40e45b 3f3f32a4 bbedc9e0", + "3f7eec54 3e6762e5 3f9aa64f 3e3449d6 3f80ce93 3d3393dc 3f3aa15c -> 3f9a1eec 3d6b8420 3f5f5246", + "3eb74531 3dce2f7b 3dce2f7b be170546 be65fdbe 3f9e0906 be65fdbe -> 3d6de92b 3dce2f7b bdcf5a06", + "be4b1586 3ee800d9 3e3722dc 3e3722dc 3f0da41c 3f5dcecb 3f53edc2 -> 3ef8a215 3dfedd90 3e038806", + "3d5c5b22 3f8f425b 3e68021d 3f8f425b be597ba9 bdfa374c 3f9bbb7a -> 3f8634f0 3e5555d2 3f8f425b", + "3f916c6b 3d77277d 3d77277d bda5cf5f be6f5ec7 3f773ed2 3f773ed2 -> bccb3666 3d77277d 3da2f807", + "3eb243bd 3e7b2c4f 3f917548 3cc5a966 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3e7b2c4f 3f917548 3cc5a966", + "be881a9a 3d2b9b2a 3e918ec7 3ef46ff8 3f5635f2 3e96df5f bd3cc7f7 -> bd974d1f 3ea15e4b 3f1c7f52", + "3fad5f46 3f8302f7 3eb524fe bd3f5ac5 3f6d40a8 3f2d23ee 3e8e625e -> 3f8302f7 3f62e494 3edd7818", + "3f74b171 3d7fa749 3f62ddda 3f62ddda bce21e68 3f0f54b2 bce21e68 -> bd1fc1bd 3f62ddda bb2b9f00", + "3ea5e8fa bd396677 3d9811cb 3d9811cb be548e1d 3cd57745 3ee34257 -> bd2b694e 3d535ee4 3d9811cb", + "3e527f7c bdb35b7a 3e3341a1 3f92aff9 3f35f03a 3f35f03a 3f1597d6 -> 3e29fc5d 3ebfd194 3f8d539e", + "3fbc99cb 3c450093 be52068b 3f02aefb 3f20b184 3f8f5315 be48b3b4 -> 3ed4f99a 3f5969df bebf2716", + "bebbd269 3e8b8109 3e8b8109 bcc78436 bd258043 3eb8e09e 3f8efe38 -> 3ec087d8 3eae2365 be08708a", + "3f47f2c5 3f87a3c0 3f87a3c0 3f9c3d49 3f331564 3f331564 3f003309 -> 3f97baa2 3f97baa2 3f7321d2", + "3ecd8a0d 3ebb0bba 3f53ad78 be3c22f2 3e8900c5 bd8df6f2 3e8900c5 -> 3f0cf494 3ed15ff1 3e634be4", + "3d45144d 3e8ab7e7 3ebdea7e 3e8ab7e7 3f6c1d6d bdfa7426 3f9e0e30 -> 3e8ade8b 3eb3df89 3e8d2e87", + "3f13cb02 3f937a65 3f937a65 be105bca 3f861c5c 3d9abcc0 3f76fce9 -> 3f937a65 3f08f3e4 3f0d8c54", + "bde54fed 3f7f7417 3e3b26b8 3f8ea495 3df53acf 3f4bbea7 bd412b5e -> 3f8ba00e 3da0aaf0 3f9f8f95", + "3f09601e 3eeed10b 3f8704c7 3f63d967 be7e48c9 3eff7dc8 3e47a31b -> bd863efc 3f8704c7 3f2231d7", + "3fbd9e8c 3f801740 bd860b91 3ed2eb0d 3edc59dc 3f90d82d 3e54ac0d -> 3da813c0 3fc1c976 3d971410", + "beb23ff9 3f9e8cdb 3f068bed 3f8f308b 3e7092b0 3f9ee59f 3cb692a2 -> 3fcb4d5a 3e8dfba6 3fc00c9e", + "3f4f8d0b 3f973733 3f005e47 bd11e401 bcd644be 3f5582e9 3f5582e9 -> 3e462ff8 3f86be9b 3f737820", + "be30b94d 3f8b2d51 be6f4138 3f8b2d51 be396955 3f00f8bb be396955 -> 3fabd441 beec59c2 3fabd441", + "3f930a90 3f2cab76 3f42f0e6 3f2cab76 3d8824d7 be49c688 3e9426e1 -> 3dce16b8 bf357f4c 3f46410b", + "3f17abee 3f938957 3c931b00 3f938957 bda538ea 3ec4baae 3e480b92 -> 3ea717aa 3f30b1cb 3f5122c3", + "3dec4297 3f19e228 bc66d7da 3f19e228 3f000000 3f400000 3f800000 -> 3f1101e0 3d21f926 3f19e228", + "3f7fa23d 3f84c4dd 3ed4fde0 3ed4fde0 3f11b33e 3f11b33e bdebe11e -> 3f84c4dd 3f84a7bd be560718", + "3fbcfdcd 3ee7a31d 3f441c0d 3f8002ae 3c36bd8d 3f2256e4 3e3ab50d -> be42273a 3f8e48c2 bd54dd40", + "3f4e18fa 3f1567c1 3f4b785a bdbb3d64 3f76e99d 3f45a6c5 3f45a6c5 -> 3f40ee62 3f2aca08 3efd20d3", + "3f3ea808 3f17a9b2 3f242926 3f180e0c 3f93417b bde8144f 3ee6d64f -> 3f20f87e 3deedf58 3ead7322", + "3e51db87 3dace32e be39c037 3ebea753 3f08256b 3f8f8815 3f0415c5 -> 3dd39470 bd8b13bb 3ea98f37", + "3e39c960 3e267110 3f69ec70 3efe8640 3f1e9b74 3f1e9b74 3f7f6244 -> 3e71ad58 3f59d734 3f129d30", + "3f85679e 3f94e2ac 3bb10688 3e8ac7e6 3e21bc84 3efeda1f 3e2cc717 -> 3eabce88 3f9b2493 3ecc89e8", + "3f2c7a72 3f98ba01 3f83f98a 3f83f98a 3f4aa5ca 3e8177b8 3e8177b8 -> 3f98ba01 3f17daec 3f17daec", + "bedb7b39 3e3d7ab8 3f95968a 3e3d7ab8 bd5edac8 3f80b315 bd5edac8 -> 3e953b59 3f95968a 3e953b59", + "3d6642aa 3e091c1e 3e8b4cf8 3f087e94 3f9628b7 3eecaed8 be1dedc2 -> 3e201840 3e89845c 3effa002", + "3f1bbb55 bc7bb0b5 3f624d7e 3e86d802 00000000 3e800000 3e800000 -> bbc52914 3f624d7e 3f2412cb", + "be8b097f 3f1b9114 be4f0c1f 3f1b9114 3f43b8cd bcdd5bf1 bcdd5bf1 -> 3f1b9114 be80a66a 3f474e15", + "bdf65c97 3f1f45d4 3d984ff2 3ed002b9 3efa5474 3f7e7044 3de621ee -> 3f2901d9 3c0addd0 3ee4b362", + "bde8fcbb 3ecb87a6 3eb4ac3d be404645 be63f646 3ea76fec be27be55 -> 3ef27233 3eb21290 be3ef3a2", + "3fae8e40 3f3fc2eb 3f3fc2eb 3e7b4764 3f9127e3 bda0b3ff 3f4d88db -> 3f3fc2eb beafaee2 3f224b34", + "3fbdeeb6 3de00cf7 3e45d50c 3f716ca5 be17e74c 3ede6256 3e94c477 -> bf07e6a1 3fa72746 3ef5abef", + "3d299e17 3e2c512a 3f843c02 3f843c02 3f5490df 3e2e4bd9 be7ab592 -> 3e50fd0d 3f7fc315 3f7a49ab", + "3f8f342e 3f262851 3f9a94a2 be5f0d20 3f31372d 3f31372d 3f00e310 -> 3fa312d6 3f9a94a2 3f811723", + "3f483296 3e1f1631 3ed96025 3e1f1631 bdf0b869 be709fbe be709fbe -> 3ebb54c6 3f419daf 3f329800", + "3ee3fbf1 3f4fe250 3f4fe250 3ef811da 3c560dda 3e86f6d5 3f400d7c -> 3ee9dbbb 3f13d7b4 3f215f11", + "bef2689e 3f06c33a 3ecea015 3ecea015 be24ec37 bd830936 3f1900dc -> 3f57c29a 3f1f0e92 3eb0d858", + "3f0ed978 be07f9b9 3f8c1a90 3f6b23bc 3f9d5d3e 3f8fb6cd 3f8b2047 -> 3f0d5514 3f855285 3f722a93", + "3f026301 3ed3c7c5 3ed3c7c5 bdb43bfd 3eaaa961 3d98bd94 3eaaa961 -> 3ed3c7c5 3e800cd8 3e2b82ca", + "3ebacbdf 3f859fb6 3ec52d46 3eed67b5 3f400000 3f800000 3f800000 -> 3f72df4f 3f201f1c 3f2ce5b4", + "3fafbca4 3f374634 3f374634 3f5840c6 3eaa1bd4 3f0b510c 3f5063b7 -> 3e535234 3f0223f9 3f5840c6", + "3dccae00 3d29a700 3e261942 bc95fc7e 3f0ca5fe 3f42c38d 3f0ca5fe -> 3d48a5e6 3e261942 bb9c60d0", + "3f898a7e 3e445dbe 3e445dbe 3e7900f2 3f91084b 3d1275c3 3f68f4ff -> 3e7ced60 bbc62f00 3e44536b", + "3f2ee58c 3f481517 3f481517 be562f5c 3f000000 3f400000 3f400000 -> 3f1a8482 3f481517 3eef75ec", + "3f6ed0b0 3f06dafc 3d68f719 3d68f719 3f41e2ef 3f41e2ef 3e54fed3 -> 3f06dafc 3efd8f79 3e0e1c7c", + "3f907744 be43da1e 3f8752fd 3f14b61a 3d133029 3d133029 3d8d672b -> 3f25478a 3ef8545a 3f8f2aca", + "beff78d2 3e8bfec9 3e8bfec9 3f6a2c6f bac363a2 3ef620bb 3ebf4bcd -> 3ed292bc bd3ebc80 3f821a1f", + "3f760921 be5399ea be6050c4 be5399ea 3f3a597d 3f17e65c 3f59f288 -> be361e19 be1677b8 be5399ea", + "becf07a6 3f7f92a7 3f53e73a 3f68efe3 bdb7a854 bdb7a854 3e4323c5 -> 3fcbc5de 3fad1bec 3f5fc8be", + "bdc11165 3e98e0d3 3eb4d0de 3e98e0d3 bd3dbd16 3f5250af 3f5250af -> 3ea8405c 3eb4d0de 3e963e97", + "3effed4b 3f30e950 3d1388d9 3ef51611 3f1c018d 3ede6cd4 3ede6cd4 -> 3f30e950 3e874d8e 3ef8a851", + "bd8f98c5 be66fda9 be7418be be66fda9 3f27e00f 3f969cde 3f798511 -> be6e2926 be7503fc be69c55c", + "3f62c9f8 3d685fb6 3f9fc466 3d685fb6 3e1b26c8 3f6efca4 3f9adda9 -> 3e146d3b 3f7ee0e1 3f8e5d8d", + "3f4a418c bcdb1e7a 3de4f18d 3d283cfc 3d1f6015 3f6c87f2 3d1f6015 -> baf882f0 3de4f18d 3c4a376e", + "3fbfb7da 3f9a85eb 3bc819ee 3f7e467c 3f2b5178 3e1e5369 3f1df856 -> 3f9a85eb 3ed455f3 3f961f68", + "beefff06 3f52eba5 be10ad8f 3f53380e 3f3d31d9 3ec94978 3ede1fbb -> 3f52c7d4 bed39528 3f7c1b46", + "3f46998a 3f1d76a6 3d81de9d be454d30 3f15e0af 3f001ed6 3f15e0af -> 3f1d76a6 3ed820b2 3ede31d6", + "3ec57559 3f56a621 3f4bc5e2 3f2eb7ec 3f6385b3 3f6a8042 3f7da1c0 -> 3f4e208d 3f49b930 3f3e1e3a", + "3e93a86b 3dc30d0e 3cfd3a63 3f5ec825 3f800000 3f000000 3e800000 -> 3ea332a7 3e1705d8 3f2e9856", + "3f097e4e 3f64cf92 3f86394e 3f883ea5 3f832ef5 bd923cac 3f832ef5 -> 3f7c4516 3ee42512 3f883ea5", + "bdebdabf be046598 3f801ec7 be5934d6 3f27e9af 3e8108c1 3e8108c1 -> be84d750 3f8934ad be8fc983", + "be486dc7 3ece1528 3ece1528 be3d60c7 3f22d839 bd942f2c bd942f2c -> 3ece1528 3efb01f4 be5944d6", + "3f80bff7 bc7fa86b be72a379 3f1f3c50 3f9e84ff 3e518d51 3f15780a -> 3f20311d 3dd6931e 3e952871", + "3eeaebec be215577 3e8bd156 3e8bd156 3f400000 3f800000 3e800000 -> 3c0eb950 3e8bd156 3e376806", + "3f918886 3f54eecc 3eaa55a6 3f677d5b 3f836614 3f018d7b 3f836614 -> 3f6a0815 3eec2b37 3f677d5b", + "3f8d35a0 3f88cf11 3efb88ea 3e1587ad 3d048e39 3d048e39 3ea13154 -> 3c32a680 3d906530 3f94ff9c", + "be696523 3f993029 3f993029 3ee02fd5 00000000 3f800000 00000000 -> 3fbc1a80 3f993029 3f09a46e", + "be55f76b 3d2c12bb 3f84607e 3f84607e 3f800000 3f000000 00000000 -> be2946a5 3f923505 3fa0098c", + "3f9905f4 3dba00ec 3d90f859 3dba00ec 3ecc9f18 3f1a6c63 3f1a6c63 -> 3d5decd2 3dc20681 3dba00ec", + "3e9ddab5 3f0e3f04 3f1ae8de 3f1ae8de be0a9a98 be0a9a98 3f87b18f -> 3eb895a8 3eca1a60 3f1ae8de", + "3fbb58bb 3eb00139 3f969c44 3eb00139 3f71f654 3f94cf51 3f94cf51 -> 3f9ed0a7 3f969c44 3fc80a0e", + "3e1b84d5 3f3a099c be3dd40a be3dd40a be4af53c 3ef09e4e 3eeff52b -> 3f11de06 bd3fece4 bd412aa0", + "3f1574ce 3f2c166b 3f2c166b 3e80fe75 3f7b0ea4 3f7b0ea4 3f030dd8 -> 3f2c166b 3f2c166b 3e9e932f", + "beceae9a 3f8041c8 3f5dbff1 3f3adfd2 3f000000 3f400000 3e800000 -> 3f9183da 3f4fb761 3f63cb77", + "bec35f3e 3f25a994 3f797fc9 3f25a994 3f2e30f5 3ef9e901 3f868103 -> 3f273a74 3f963d9c 3f05abe6", + "3e270be1 bd987f83 3eb72bdc bd987f83 3f6349f4 3f46c6bc 3f82033a -> bc392850 3eb02204 bb818d60", + "3f8320af 3ee716c2 3f465f0b 3d0c6f43 3f6b364d 3f75cce4 3e3ec119 -> 3f3fa423 3f465f0b 3e1cd9bd", + "3faca727 3f71a178 3f939052 3f939052 3eb38f76 3eb38f76 3f821051 -> 3e546760 3e09c110 3f939052", + "3d4b6b33 3f2f2ccd 3f3ceb18 be4441f4 3e800000 3f400000 3f800000 -> 3f28d225 3f3a92a2 be14fb6a", + "be71bf80 3f01ac5e 3f468dca be656798 3f3cd892 3f4391c7 3f35df3e -> 3ee60bf5 3f468dca bee4f724", + "3f267516 3f8d5e90 3f8d5e90 be23f0a4 3f976571 3f976571 3f913d1c -> 3f8d5e90 3f8d5e90 3f2207e0", + "3d668c28 3f8c5cae 3f72bb08 3e1bf186 bcc28866 3f84da9d bcc28866 -> 3f8447e6 3f74de7d 3e11b851", + "3eda0014 3f956520 3f26618d 3f956520 3f249ba7 3e9109ef 3f80f5d5 -> 3f7cc37c 3f034f2a 3f956520", + "3f5938bc 3e2175ef bdf54820 3f5c39b5 3f86b5f4 3f3e1ea6 be2b2711 -> 3f40fb05 3efe7056 3c6ba900", + "bdc6428d 3f2f68b7 3db87423 3db87423 3f131e94 3eaedd55 3eaedd55 -> 3f2f68b7 3d7327a4 3d7327a4", + "bdc018c5 3e635aab 3f8566f3 3f803dc0 3f000000 3f000000 3f800000 -> 3e46a0dc 3f8ba895 3f7f83a6", + "3f12e296 3f467077 3f1bbfad 3f467077 3f5725ee be5a5182 3f0c3cf2 -> 3f467077 3e1600c4 3f1ecbd2", + "3fa1fd31 3ecb4a96 3f58741b 3f3f585f 3f000000 00000000 3f000000 -> 3f76f085 be65e85c 3f5f1eec", + "3f14f740 3f0fea70 bdcd5908 3f0fea70 3f8ff166 3d64ae79 3d64ae79 -> 3f0fea70 bcd261a0 3e80a885", + "be92c3ed bc9c58fb 3e5ada17 3d05a883 3f5d5ccf 3f7de427 3efdd9c8 -> bd9faf33 3e5ada17 3c3a17da", + "bedadec4 3dadfaf3 3f520b40 3eb7b9e3 bd63323f 3cb661fb 3df2585b -> 3e9243f3 3f8d785c 3e255f3b", + "be5502c6 be74cdb5 be74cdb5 3f54add3 bd12d0aa 3f8b4d47 3f1e969b -> be90f30b beec588c 3f67bcaa", + "3f5c1858 3f300571 3ed65c05 3e79a363 3f82ed71 3dfe5741 3dfe5741 -> 3f300571 3e059ff6 3dd90428", + "3d547191 be0b2dc0 3f7e5173 be0b2dc0 3f70e881 3f8fa1b3 be07c6ac -> bdaf6ca0 3f7e5173 be0a31d0", + "3ef8a9bf be2ea8d7 3f25a48d 3f25a48d 3f000000 00000000 3f800000 -> 3d8e202c 3eaa63dc 3f25a48d", + "bd381b05 3f5517e4 3f70cd28 3f4f9f27 3f800000 3f800000 3f400000 -> 3f53d911 3f70cd28 3f50d611", + "3fa4259d 3f09a67f 3d3ba7f4 3f09a67f 3e9dca3a be0d9d5e bbff9908 -> 3f09a67f bea50d1c be2d5c18", + "bee70f87 3b8d0aff 3f4291f7 bd24495f 3f6e82bb 3d77a4bf 3d77a4bf -> beac6abc 3f8a5700 bda4cc79", + "3fb609b8 3f5bdb51 3e781420 be58b38d 3ec7e850 3f4a1dc3 3ec7e850 -> 3e773eb4 3f8f3eda 3f317ff2", + "bcb99b18 3e628a55 3f5358dd 3f5358dd 3f4c7399 3f4c7399 3f35fa0e -> 3e5484e6 3f5358dd 3f53df9e", + "bea63002 be74284e be74284e 3f70d941 3e3d1ec3 3f8757e5 3e91468d -> bebd035d bf1f0716 3f9505ed", + "3f5cb468 3f155958 be058934 3ec38f6c 3f27ae51 3f077a81 3f27ae51 -> 3f155958 3ec6db06 3f0e3d34", + "3f961211 be383da1 3f3bf606 be503e00 3e28818d 3e28818d be3c254e -> 3f644ffc 3f3bf606 bf6d1415", + "be3eed57 3f228aaf 3ef47a53 bdc6d906 3f9ccca2 3f9ccca2 bc70c0b6 -> 3f228aaf 3ee572e0 bde903db", + "3f44722a 3eb7a05f 3e8928b0 3eb7a05f bdd4f7f0 3f6de8a5 3f83ec34 -> 3d6400b8 3e9ef701 3eb7a05f", + "bec56bb9 be13d9ca 3f0676f8 3e943b8a 3f16461e 3d9bdd7c 3d9bdd7c -> bece203a 3f33972b 3ebff1e8", + "3d6fd6d7 3f6b7289 3e45b7ea 3e45b7ea 3f7a9586 3e4d8786 3f52d92c -> 3f6b7289 3e4572e6 3e688ae0", + "3f6921ef 3f9ad407 3f2c0738 3f9ad407 3f075fee ba9933cb bdb25500 -> 3f9ad407 3d6be460 bd963260", + "bd8518d0 3f157f2b 3f157f2b 398ad5c4 3f45b611 3f82aaad 3f45b611 -> 3f17dcae 3f157f2b bce8e662", + "3fb0535c 3eb8667f 3f1027d2 3eb8667f 3e70ac6a 3ee8dea6 3f409c18 -> 3dd9caa8 3e833d0f 3f23c55f", + "3ee725ec 3f74f439 3f6b1223 3dc9a0b3 3f0d49bf be2e530b 3d9159f9 -> 3f74f439 3ebdab22 3de05e48", + "3e0fb66b bda7f457 bd09f225 3e739e0b 3f8a7795 3ca16e60 be0e56f8 -> bd180139 bce8307a 3e4d08a2", + "3e000665 3f251010 3f998148 3f287999 3f5581ac 3f5581ac be715eb9 -> 3f36cf43 3f998148 3f089032", + "3e858602 3e8568ed 3f1d84e7 3f1d84e7 3f5dd005 3f5dd005 3ed5dd60 -> 3eb4c6c1 3f1d84e7 3f083e5f", + "3fb8346e 3f05f105 3e412820 3f757585 3d7c3a0f 3f29bc14 3ec07172 -> bdd00d10 3fa604a7 3eb8efec", + "3f328c49 3f9ab955 3f61f096 3f71da19 3f400000 3f400000 3e800000 -> 3f9ab955 3f8e1765 3f111d06", + "3f10b664 3f6909c5 bd9208aa 3f74c391 3e2edfc7 3f8d2262 3f8d2262 -> 3ef57881 3f026cec 3f74c391", + "3f9d3666 3f9fac49 3f93e7da 3ef4cf50 3eb62b4d 3f4aee88 3f811bc4 -> 3e82f2ce 3f70bd5d 3fb6256d", + "3fa01f8a 3f1ee2b0 3f145f41 3f9bb87a 00000000 3f400000 00000000 -> be1f7f48 3fb02ec8 be9c51f4", + "beaca11c 3ea53f55 3ea53f55 3e7e7042 3f0df23e 3ef1a0f0 3f8ea8c7 -> 3ec13e9d 3ec55f03 3e64cb7c", + "3fbc619d 3f9d8ebd 3f3ad4df 3f3ad4df 3ef37091 bdafe1b8 3f33916f -> 3f25b66a bf10ea0f 3fbbd0ac", + "3f6ae28a 3f8b5482 3e118ac9 3e118ac9 3f89c0ee 3f9314e7 bd3d69c7 -> 3f8338f7 3f8156af bce939e8", + "3f8328da 3e4acc4d 3f34b59d 3f9c014c bc776370 3ea930a5 3ea930a5 -> bd7dc384 3f9da027 3f9c014c", + "3ebe725a 3e692328 3e2b3607 3e692328 3e800000 00000000 00000000 -> 3e692328 3dd70d7a 3e126b0a", + "3e6c5eb0 bcb41b40 be4b5eca bd8dd205 3f870b02 3e2f9a79 3e2f9a79 -> bcb41b40 be1d4562 bd5d8bfa", + "be06b155 3f772e16 3f551e1e 3e52d86a 3f92721f 3f0756d2 3f44c181 -> 3f772e16 3f62206c 3e1736c2", + "3e4f1670 3f7e8797 be4cee08 be4cee08 3f400000 3f000000 3e800000 -> 3f7e8797 bcd1c3b0 bdbdb4e4", + "3f9f2ad2 3f993feb 3f993feb 3e094ae7 3f57fa2f 3f5b4ad2 3f815594 -> 3f7398c1 3f787b29 3fba62e8", + "3eb0cfb7 bd2288ac 3f9aca01 bd2288ac 3f800000 3f800000 3e800000 -> 3ec883f8 3f9aca01 3da09d10", + "3f1129d5 3d20c065 3d20c065 3f3e4697 3f5c9cbd 3f5c9cbd be5fa568 -> 3ee07d4c 3ee07d4c 3e5c2520", + "3e90228e bde55303 3f3787df bde55303 3f92cff8 3f8b4c4e 3d704577 -> 3df8909d 3f34e2e5 bd8fa090", + "bedb3405 3f446f7d 3f059e6c 3f446f7d 3f88c898 be27391c 3eec94fa -> 3f446f7d 3f4bad5c 3f742bac", + "be3e899c 3e41aa37 3f44c392 3f3522a6 3f939325 3e9a5b16 3e9a5b16 -> 3da680d0 3f5fcd73 3f4d4412", + "3cfa1a89 3f881eae 3f8165f8 3eea96fc 3f6e49e6 3e0071d9 3f6e49e6 -> 3f881eae 3f7c03fb 3ef40d00", + "3f475e79 3f121ef2 3f295c89 3f295c89 3f9e640e 3f8048a8 3f9e640e -> 3f243866 3f104a62 3f295c89", + "3e3dd468 3ee96401 be2dc762 3f84c136 3f7dcc15 3efe139a 3f7dcc15 -> 3f104857 bd2c0f04 3f84c136", + "3f4e0ac0 3f2a4152 3f2a4152 3ef91fe4 3dc596f6 3dc596f6 bdbd76ec -> 3f2a4152 3f2a4152 bed62c9a", + "3f96f4bf 3d71993e 3f83bf14 3f18c80b 3f999901 3ebfc21f 3f999901 -> 3f9a0532 3e46ede0 3f8dac92", + "be544e56 3f83e37b 3f9dd268 3f996918 3ec277d4 3e4c9b3f 3e4c9b3f -> 3f7d0610 3fad545f 3fa800eb", + "3ddfd8dd 3f4b1285 be39cc77 be39cc77 00000000 3e800000 3f400000 -> 3f34e060 be07e574 bd996a25", + "3d5a4dba 3f23d409 3ece072a 3e48baba 3f400000 3f400000 3f400000 -> 3f23d409 3ece072a 3e48baba", + "3f0893a9 be556e9c 3f8c3ea9 3f8c3ea9 3f400000 00000000 3f800000 -> 3eaeae2c 3f02d8f5 3f8c3ea9", + "3f8a582c 3f1c41b7 3f646945 3ed1c129 3ec053c9 3f403512 3e9bacdd -> 3eddc4bd 3f646945 3eb6ff4f", + "bef6a029 3ecff60c be3f460e 3ecff60c 3f29abd0 3f5ffc24 3f5ffc24 -> 3ee8407d bef1e08c 3ecff60c", + "bd0f05ec 3e0d4ad3 3ec82e9f be5d14c9 3f989be3 3f989be3 3f12b9af -> 3e043efe 3ec82e9f be6b8572", + "3f53c666 3d1eef97 3f522af7 3d1eef97 3f9abb09 3f801b61 3f4d5e33 -> 3f2f939a 3f3440ab 3eea30c3", + "3fb989d0 bc7be254 3dc1539f 3f5f8969 3f2413e0 3f808244 be7b6f5b -> 3f509eeb 3f9c942d bf33babd", + "3f946fee 3f154682 3f9a5b54 bd82fba7 3eadd3ef 3e82785f 3efff96e -> 3f5b47df 3f052f1b 3fb44f31", + "3f83943a 3eb51f0e be5ef64a be5ef64a 3f5ddfea 3f807eac 3f6947b8 -> 3e9bae55 3ebd4d83 3eac2025", + "3f2fda8b 3f119b31 3f271540 3d20f3df 3ecf1a0c 3f90abc0 3ed25ca6 -> 3ead526e 3f271540 3e337cb9", + "3f88d434 3f1f47c1 3f1f47c1 3f907fb2 3f13a1b9 3f9bfad9 3f7d14f3 -> 3f07364e 3f94f8f6 3f66b0f5", + "be8672a0 3f654788 3e900448 3bec8cdd 3f4185b7 be079765 3d6956dd -> 3f654788 3ecaed38 bc0d0bc6", + "3ee232ea 3f2a4baa 3e8adc2f 3e9f68ed 3f40a26a 3f9e13d9 3f9e13d9 -> 3f0ce6b9 3ee3fbda 3eef746d", + "bcd7cc70 3e4df3dc 3eae2ffd 3ec884b2 3f2041e2 be32c220 be32c220 -> 3e48d045 3eb43fbe 3ecf4605", + "3f5b06de 3f557a33 3f82ed85 3f82ed85 be4e9491 3f136539 be4e9491 -> be3eab44 3f82ed85 be22b878", + "bdad82bd 3f98a492 3f2334f6 3f98a492 3f8d0e6e 3f816d4c 3e9a0731 -> 3f98a492 3f194d54 3fa20b71", + "3f72a47c 3f108234 be6044da 3f108234 3ecedb60 3f95cb40 3f95cb40 -> 3e5b4e64 3f060b04 3f108234", + "3f2b7054 3f33325d 3f8d6f08 3dd4b619 3f0f4a98 3f87addf be3fbf43 -> 3f1f38b2 3f8d6f08 bdc57317", + "3f59133d 3f5584c2 3f6cc230 be5ad399 3f8a6a94 3f76816d 3f725913 -> 3f693993 3f56c3ec 3f276ed1", + "3df9f550 3f6654b8 3f6654b8 3f49da40 3c676a8a 3f961efa 3c676a8a -> 3f4a8ec0 3f6654b8 3f318e15", + "bedf8bbb 3f73107a 3f73107a 3f91abdc 3f5bac6a 3dd892d9 be2eb7aa -> 3f5dfc46 3fa6c1b3 3fddeb76", + "bd2254f4 3ed38e41 3ed38e41 3eda8875 00000000 3f000000 3e800000 -> 3edbf0a5 3ed34777 3ededd0c", + "3f8b964d 3f91a762 3e8c96ee 3f91a762 3e2236d7 3e2236d7 3f32d6bb -> 3e36aa60 3e8358cb 3f91a762", + "3f461842 be467a30 3f9e0f0e 3f176839 3ee0811c 3e8d8970 3e8d8970 -> 3f696406 3f61b7e6 3f3c764c", + "3fae95fc 3f9defff 3ed1406d 3f7eb5d8 3f85ef85 bd002756 bd002756 -> 3f9defff be4bd862 bed32b74", + "3e3f2c01 3efce896 3e8bc880 3d12cbd2 3f035f0b 3f035f0b 3da7c397 -> 3efce896 3ea0e719 3d33afaf", + "3fa11870 3f6fcd84 3f6fcd84 3f3004b9 00000000 00000000 3f400000 -> be780310 be780310 3f8025bb", + "3eb77272 3f1266f4 3eb823d2 3f4cf083 be0d6246 be7af923 be0d6246 -> 3f276034 3f3d6d36 3f4cf083", + "3f27fd37 bdbe9636 3f92798a be0ff9bb be2e8e18 3f67e729 3f4e533d -> be317558 3f92798a 3f1ea897", + "3f2d7f59 bd164a49 3f3893e2 3f23f24b 3ec773e3 3efb7fac 3ec773e3 -> 3ec05b62 3f3893e2 3f180aa6", + "3f806901 3e44eacb 3ee80fff 3ee80fff 3f860510 3f88a592 3f860510 -> 3ee403d6 3ee80fff 3ee3963d", + "3fb463eb 3db0bfe6 3f94aca9 3f9deadf 3e5de68b be6559d3 3f670fcc -> 3ec3a4a2 bf682842 3f9deadf", + "3f2d00e0 3f602886 3eb0e84d 3f602886 3ede482b 3f29794f 3f66670e -> 3f11bf09 3f0c1a4e 3f602886", + "bec985aa 3f9d8cf4 3db834fe be7de443 3ec675e3 bd711aad 3ec675e3 -> 3f9d8cf4 3e4bb100 bf547a98", + "3fa8eae4 3e97b156 3f04f762 be4e876b 3ebc22a7 3f8cb067 3f310585 -> 3e09aa49 3f04f762 3efdcbf8", + "3f13c469 be24d9dd 3ef2c249 3e00625b 3f900411 bd2ad438 3e1ea261 -> 3e528d59 3e42e188 3db9bb3e", + "3f8202f5 3da92ce6 3da92ce6 3ed676ea 3f84ae67 3dac9e1b 3d87894c -> 3ed92b92 3d086238 3ca898c0", + "3ec04ea2 3f29b006 bd15f8d9 3e5c88de 3e1b99c9 be697ab1 be697ab1 -> 3f29b006 becaf929 be74d586", + "3eb8e341 3f0d1350 3d18e1b1 3f0d1350 3f9df91d 3f9df91d 3e9b6da5 -> 3f0d1350 3e643169 3ecd533e", + "3ddb8c30 3f9a2cfd be2696f3 3f9a2cfd 3ec26899 bdde4304 bca55b65 -> 3f9a2cfd be3a85c7 3f88c4f3", + "3e44efa5 3e8169ab 3ee405cd 3e8169ab be4b164b 3f30beb6 3f6f1a17 -> 3e3e6c92 3ed895fa 3e9460a1", + "3faf13f5 bc36cc34 3f9cc527 bba75b9a 3f7bfd84 3d1fb8b3 3d1fb8b3 -> 3fd6f473 bec4a8d8 3d8bc2d7", + "3f187d4c 3f685fea 3df84212 3f685fea be4bac57 3f633a3c 3f9d9431 -> 3e8f307e 3ee0b0de 3f685fea", + "3fa51c07 3e732d76 3f179f07 3e732d76 3ecbf062 3f3cd441 be6c1c67 -> 3eaffa66 3f179f07 be9d86b3", + "3fa8b9a5 bce9319f 3f9445d4 3f95bfa1 3d76ddbf 3f464dba bbf54a79 -> 3e0423f4 3f9637d5 bec635a0", + "3fb9df21 3f57806d 3f5d6b86 3e90f984 bdbdfcf0 3e951582 3f1171d7 -> bf15eed3 3e815b3e 3f9060bc", + "3fa1f5f1 3e005171 bd81fb06 3f84fb78 3f746459 3f799666 3f774196 -> 3fa081b1 3faa6b98 3f83691e", + "3f580569 3ddde765 3ddde765 3ecc3314 3f400000 00000000 00000000 -> 3eb4f948 3c8a9ddc 3d7f1d50", + "bd977f9b be1e0478 3f9a97b9 be1e0478 3f058249 3f058249 3f85ebb0 -> be574f2b 3fa05402 be8298b9", + "beddcf71 3f28e912 3f0b1bc8 3f800644 00000000 3f800000 3f400000 -> 3f72161c 3eb0e4f8 3f8de3e9", + "bd7fd6f3 3eaf2f72 3f01b7fa 3f1673ff 3f400000 3f400000 3f000000 -> 3ea7552c 3f006c6f 3f1995e9", + "3f1e1c92 3f88e842 3c2d0ae2 3eaba51c be1c0426 be24eb4e 3f404675 -> 3e8cca04 be0ceafe 3f49ee47", + "3f24c42e be428901 be428901 3f732526 3f8c1d2c 3e9057d1 3ba7f8a2 -> 3f0b2916 3db7c652 3eaec542", + "bef8f18c 3f1d2333 3f755c50 3f755c50 3f6ff460 be23266d 3f6ff460 -> 3ee47bd4 3fc07807 3f755c50", + "3ea49333 3eeccd64 3f9280be b9ee91e8 3c1bec0e 3f1c43ef 3e664ae7 -> 3ea39f53 3f9280be 3e0a7baf", + "3f269bdb be2e77d9 3e28870a 3ee2ebfc 3dc67b08 3f065fdb 3f065fdb -> bbcc5e40 3eb11b9c 3ee2ebfc", + "3f0de34e 3f9ff163 3f9ff163 3f7cd5a3 3f191546 3f407f88 3f6293a9 -> 3f83303f 3f929c11 3f90ffb4", + "3f55bae4 3f932bdf 3f0f5901 3f0f5901 3f8b62c7 be4ca7a8 be4ca7a8 -> 3f932bdf bdab75c8 bdab75c8", + "beeaa6f7 3d45a14b be5d7f33 3f0521f9 3f29bdc9 3f2304f7 3f523aaa -> bdfa037c bf0010eb 3f0521f9", + "3e9a634c 3f37b1d1 3f37b1d1 3e5abef3 3f220b22 3f220b22 3f86f56b -> 3f218eaa 3f218eaa 3ebb2cc4", + "3f77ad83 3dc6b814 3e56a0b2 bdbeffe0 3f800000 3e800000 3f000000 -> 3e52e168 3d6b8f38 3dc970fc", + "bd86228a bd96c142 3ebe3b41 3ebe3b41 3f429e34 3f4a02a7 3ed84ca2 -> bdd0a468 3ebe3b41 3ec4053e", + "3f3499d7 3eb29af4 3eba95da be324a4d 3f0d1f5d be7294b6 3f983ed3 -> 3e6338ec 3d65e6d8 3e52c00f", + "3f9341aa 3f8a3395 3f8a3395 3f7b7c2a 3f400000 3e800000 3f400000 -> 3f8a3395 3e80d34c 3f8c136a", + "bd1b6f42 3f80f11b 3e1623f5 3e1623f5 3f88f2c4 3e4274e5 3f4033ff -> 3f80f11b 3e14e3e2 3e005e6b", + "be4c29c3 be5a30bf 3ee31da6 3ee31da6 bbe359c2 3e06e491 3efdda7b -> be823676 3f022ef2 3ee31da6", + "3f81ef67 bd01ed83 3ddac9f5 bd01ed83 3f400000 3e800000 00000000 -> 3ddf142c 3d0d72ec 39fb6e80", + "3dac09d6 3f847301 be11dd6c 3f6f0e43 3eb6ff67 3f560d1b 3ed6bef5 -> 3f7c287f bd326914 3f6622f5", + "3f227ec8 bd5ddb6e bd5ddb6e 3e1c1969 3f62300e 3f8dd74f 3f9cc298 -> 3d4ce640 3d8aca4e 3e1c1969", + "3f8ba5e2 3f153b85 3de0528a 3de0528a 3e1ea39a 3f6d95ca 3f9b4757 -> 3ce6c7a0 3ef4025a 3f2042cf", + "3f33cba8 3f8d4c7f 3f2195d3 be27f447 3f097f0b 3f2bb4a5 bd04e685 -> 3f730e04 3f76934f bdb0cd2a", + "3f00009f 3f1d1291 3ec39d88 3eec4d67 3f400000 3f800000 3f400000 -> 3f097027 3efee19e 3eebf4a0", + "3fa258b0 3eb11ad3 3f83b2a3 3f376784 3f5d9067 3e9f209e 3e9f209e -> 3f9b27e0 3e452740 3e8d8147", + "bea9cc29 3d906e5c 3f0668be 3d906e5c 3eb719a2 3f62bc46 3e021472 -> 3cc16028 3f0668be 3d8d2f08", + "3f9ce7e5 3ea23a90 3f093dc1 bd6db220 3f061889 3f953faa 3f953faa -> 3e650938 3f093dc1 3f2b96c0", + "3fb30614 3f789666 bd91d3e4 3f789666 3f400000 3e800000 3f800000 -> 3f21aae3 3ebc5f67 3f789666", + "3f6eac37 3f9c7fa3 3f9c7fa3 3db32761 bde56c40 3f8180b8 3f8180b8 -> bd3200a0 3f9c7fa3 3f92a9f5", + "bdb8f10a be496cde be105711 3f2ee506 3f654a45 3e0f76d5 3e37f0c0 -> be8d6500 be2741a3 3f3b8550", + "3efa8e78 bca6c52a 3f4c2b02 3f4c2b02 3f7f94e3 3cf024e5 3f7f94e3 -> 3ec28117 3ed66072 3f4c2b02", + "beae004d 3e510b4c 3e510b4c bdc3d639 3f6b9cb4 3f6b9cb4 3f17f1c5 -> 3e510b4c 3e510b4c be3102b2", + "be5aa571 be2840d7 3f80bfdc 3f7e3677 3f46b2d1 3f34c5ca 3f364959 -> bed40d80 3f833ac5 3f8106b6", + "3f35b148 3f8a5dcd 3d5e741c 3f8a5dcd 3ddeddc7 3f98b3af 3ddeddc7 -> 3ec47b90 3f487167 3ec47b90", + "3f8abb2e 3f883a84 3f6a0601 3f883a84 be72a747 3e87a0b7 3f3c3ad1 -> beec0638 3ead8940 3f883a84", + "bdf4a9bf 3e1a359a 3e1a359a 3e1e3624 3dcccccd 3dcccccd 3dcccccd -> 3e1a359a 3e1a359a 3e1e3624", + "3f517a87 be30ff98 3ed02bf0 be30ff98 3f000000 3f800000 3f800000 -> 3e0a2d4c 3ed02bf0 3e9a4267", + "3f9e4526 3f8c21fe 3e31dfe5 3e89ece8 3ee3a851 be2a8fbb 3ee3a851 -> 3f8c21fe bf0c54fe 3fa51e27", + "3fb9acd9 3f93717a 3eb4c13b 3edc4f66 3edae6b4 3f424d79 3edae6b4 -> 3ed82b14 3fc18494 3f3f5262", + "3f22a991 3f1f582e be6658a3 be6658a3 3f4ddda4 3f40315d 3e38cec0 -> 3f1f582e 3e930dc0 3bdd0200", + "beb66b9c 3e99a2ac ba7623aa ba7623aa bd082a60 3eabe3d9 3e330672 -> 3ed5cb60 bddd9022 bd694295", + "3f8937fb 3f570af7 3f26d5dd 3f570af7 bdb6df38 3ed9542d 3ed4c06b -> be7fee4c 3f5a83c8 3f523005", + "3f855bb5 3f34ed63 3dec70ad 3dec70ad 3ee70e42 3f6b5abf 3f6b5abf -> 3ea9e914 3f3b4390 3f3b4390", + "3f3f8632 be39d32d be2d5aa8 be39d32d 3ed07947 3e7cfaa1 3f457fd4 -> bde680d5 bdaa6260 be307eb8", + "bd3d618c 3ef4086c 3ed9fd25 3eb25bfc 3e800000 3e800000 3e800000 -> 3ef4086c 3ed9fd25 3eb25bfc", + "3f736ead bc1fe19a 3f85f0ae bd3782de 3e38e6a9 3f156333 3f156333 -> 3e9d65c3 3f85f0ae 3f7e2a96", + "3f221ad4 3f57a091 3f79318a 3f8ff5fa 3f572a83 3f572a83 3e912f67 -> 3f82b3ed 3f88dbc8 3f271d22", + "bc17aac3 3f8e571c 3f6d1bb9 3f87ef09 3e0aeb04 3f7c706b 3ef36df9 -> 3f8f7a05 3f6caafc 3f888e88", + "3e2b2ca7 3e825443 3eeae711 3eeae711 3f20f8dd 3f20f8dd 3f7debd1 -> 3e856fa2 3edc875d 3eeae711", + "3f532634 3ef69c4a 3ef69c4a 3e4126cb 3e9541a4 bd872509 3dfce546 -> 3ef69c4a bbb59b80 3e4e294e", + "be950701 3f110a33 be0e464f 3f92754c 3f5e046d be6367ee 3e8c1609 -> 3ecbfec0 bdc0b75d 3fafa382", + "3f97a1ed 3f4d7674 be20f00e be20f00e 3ec2c7eb 3f3c5b3d 3f604718 -> 3e878458 3f53d78c 3f7ad356", + "bdc151eb 3f607343 3d4060c4 3f607343 3f9c164f be12ad66 3d359f3d -> 3f607343 3d7a5b4d 3f74dde1", + "3fa09bfa 3f653916 3f653916 3e024e6a 3f95554d 3f40c063 be361c55 -> 3f653916 3efe7374 be509270", + "3e84a457 3a8732f3 3d3f7ae5 be548591 3ea11764 3f270d55 3f225a9e -> 3bd8632d 3d3f7ae5 be11696b", + "3f237394 3e92d538 be333eb2 be333eb2 3da80011 3f872a6c 3da80011 -> 3df17636 3df56680 bd48f050", + "3ecfb197 bcb72cde 3f91ceff 3f5e3eaa 3f0b8a03 3f91bd1f 3e1592c7 -> 3e54eab5 3f91ceff 3f134448", + "3ee996b6 3f4ebab0 3f13cafc 3f13cafc 3f7347a5 3f684271 3f95b3f1 -> 3f3d0c8e 3f198795 3f2eae6b", + "bdc8a2db be6ab75e be6ab75e 3e65b73c be5e9dd8 be5e9dd8 3f94fcb7 -> be7d81e6 be7d81e6 3e65b73c", + "3e9e7b76 3f9f8505 3f82b6fb bdec5ef6 3f55979e 3f55979e 3ea98851 -> 3f9f8505 3f8ba182 3d965398", + "bea4f1d0 3dc9a4be be79d27c 3dc9a4be 3d880336 3f351fb6 3f351fb6 -> 3e0240de beb56473 3dc9a4be", + "3fbdf869 3e847f62 be5019dd 3e85e96f 3f412612 bd661504 bd661504 -> 3e8698b8 3d8e5082 be1f4230", + "3f742f89 3f736de8 3f736de8 3e397095 be77b4e5 3e3ac7f1 3f947418 -> be14c810 3e3f01fc 3f6a55ab", + "3fb86d60 3f37011d 3f35ae96 3f37011d 3e97952a 3d63485e 3e97952a -> 3f37011d bdf560b8 3f37011d", + "bedcbccf 3ed674da 3f9183cd 3f4acc66 3e7ca45d 3f053f61 3e841605 -> 3ebbf745 3f9183cd 3f640ab8", + "be79ca8a 3f06704d 3e0e72a4 3f9381c2 3ed23afb 3ed23afb 3e148457 -> 3ebe897c bddd5346 3faac785", + "3f1f105e 3f7438ae 3f90b760 3f90b760 3f3b68bd 3f0edae8 3f0edae8 -> 3f882814 3f76adc2 3f76adc2", + "bea7d0b9 3f73a9ab 3e519d8c 3f94c43d 3d922f63 3d922f63 3ec0a324 -> 3f988344 3e4c50aa 3f94c43d", + "bef513c9 3ea231ae 3f11b885 be2a151b be6c7692 be7e15da be6c7692 -> 3e48a7bc 3f0c85ca bf04a01f", + "bead1742 3f84d33d 3f315584 be33fc3d 3ed7e1b8 3f8b0be4 3ed7e1b8 -> 3fa04cbe 3f137a26 bebe2232", + "3f93b873 3f7598d8 be1e1b3b 3f7598d8 3cb65a47 3d12f59d 3f338028 -> bde6b8b0 3da4be8c 3f7598d8", + "3f9da164 3f7ebef6 3f9b7766 3f9b7766 3f83b1ea 3e4d08fd be6ccc08 -> 3fa1f83d 3c22aa00 bf1e0a22", + "3eb32c25 3e6bb288 3ec37b90 3e8774b1 3f52ebba 3d8005ea 3f8acbd3 -> 3e809612 3e830497 3e9c7645", + "3f70ac31 3eca1e52 3f00378a 3f00378a 3f8f863b 3eeedda3 3eaf77af -> 3efd2e90 3e675206 3e321324", + "bde67406 3dde43e5 3f936b7d 3f936b7d 3f2f7c02 3e0f5a67 3f6526df -> 3cb013f4 3fa16a00 3f936b7d", + "3fbc9c23 3f0c44ab bca6afe2 3f0c44ab 3e91ed82 3e91ed82 3e7a211f -> 3f0c44ab 3f512763 3edd6fd8", + "3f6e32c4 3ce9711a bdff9f52 3ce9711a 3e4eff87 3d921f46 3d921f46 -> 3ce9711a 3a320600 3c39cbc8", + "be17d07f 3e3fec11 3e9da565 3e3fec11 bc970e3f be7e8159 3f8dd934 -> 3e5d2751 3eba4287 3e2da1bb", + "3f8c9eb8 3f9a08b3 3f7d16b0 3f9a08b3 3f9fa3e0 3f31c471 3e70f051 -> 3f9a08b3 3f237ba0 3e05e770", + "3f655b54 3f7f8076 3f96bacb 3f193fc6 3f3536c8 3f3c804a 3f4d5cad -> 3f847576 3f8ba46a 3f8f0464", + "3cf29f7b 3f9ce92a 3f2364d7 3c584032 3e1b7922 be5551bd be195fe7 -> 3f9ce92a 3f11cd52 bcbc7c47", + "3ed7f242 bca99c6d bca99c6d 3f6c63f1 be559bda 3d2f6029 be559bda -> bff468b2 3ec14673 bfae8856", + "3f085edf 3f7fdf82 3e9f11cc 3f7fdf82 3f0f3dc5 3f6b109c 3f0f3dc5 -> 3f4aa102 3f2d7842 3f4aa102", + "bbfab60a 3e15d001 bd7481c2 bd7481c2 3f9e8239 3f9e8239 3bc35faa -> 3e15d001 bd7af668 bd766652", + "3da7c197 bd674a6a 3ee5a931 bd674a6a be2001d2 3f70c65b bbe21d68 -> bd6d5927 3ee5a931 bd557305", + "3f04a51a 3f8fb224 3f8fb224 3e3ce2eb 3f800000 3f400000 00000000 -> 3f8fb224 3f7a2a04 3db60831", + "3f8f7a8e be2b05de be2b05de 3eeb4030 be6c20af be632966 be632966 -> 3f0e3952 3f090516 3eeb4030" + ] + }, + { + "function": "cycles_mix_soft", + "node": "ShaderNodeMix RGBA SOFT_LIGHT", + "cases": [ + "00000000 00000000 00000000 00000000 3b972b92 3ed757a0 3ed757a0 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f57dbd4 3da16c13 3f57dbd4 -> 00000000 00000000 3ea0f270", + "3f800000 00000000 00000000 3f000000 3eeeeef3 3f440833 3eeeeef3 -> 00000000 00000000 3ef7777a", + "3fc00000 00000000 00000000 3f400000 3f11ce41 3f9d9dee 3f9d9dee -> 00000000 00000000 3f94a8d7", + "bf000000 00000000 00000000 3f800000 3eef3965 3eef3965 bb9e0b9d -> 00000000 00000000 3f800000", + "3e800000 00000000 3e800000 00000000 3f777b8b 3f777b8b 3b6cb0b6 -> 00000000 3e96672a 00000000", + "3f400000 00000000 3e800000 3e800000 3f43fbf5 3f084704 3f8117b8 -> 00000000 3e84a7f2 3ec93aaf", + "40000000 00000000 3e800000 3f000000 3f236e4b be535580 be535580 -> 00000000 be8f4010 be535580", + "00000000 00000000 3e800000 3f400000 3f814970 3f7c189c 3f814970 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 3e6f8843 3eb8ea53 3e6f8843 -> 00000000 3e6557e0 3f800000", + "3f800000 00000000 3f000000 00000000 3f43b759 3ee659b1 3f81aff8 -> 00000000 3ef32cd8 00000000", + "3fc00000 00000000 3f000000 3e800000 3f41d61e be105e3d 3e16408d -> 00000000 3c9dca90 3d52113c", + "bf000000 00000000 3f000000 3f000000 3f2a49a7 3e76a62e 3f954ed4 -> 00000000 3f10959d 3eaab12c", + "3e800000 00000000 3f000000 3f400000 3d292f9f 3f28ce72 3ebf5f08 -> 00000000 3f0519ce 3f3cf874", + "3f400000 00000000 3f000000 3f800000 3f6d73fb be74d583 be298fc3 -> 00000000 3e642fef 3f800000", + "40000000 00000000 3f400000 00000000 3f80b0d8 be3fa012 be3fa012 -> 00000000 3e7047f0 00000000", + "00000000 00000000 3f400000 3e800000 3e32daa2 3dca8259 3e32daa2 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 bd8092ef bdf746ba bdf746ba -> 00000000 3f223458 3eb08b94", + "3f800000 00000000 3f400000 3f400000 3f0bb1db 3f73cb1b 3f73cb1b -> 00000000 3f6b6c2a 3f6b6c2a", + "3fc00000 00000000 3f400000 3f800000 3e8beefc 3daf9d7d 3d955553 -> 00000000 3f045913 3f800000", + "bf000000 00000000 3f800000 00000000 be5ad060 3eb7b535 3f9dbf83 -> 00000000 3f800000 00000000", + "3e800000 00000000 3f800000 3e800000 3f000000 00000000 3e800000 -> 00000000 3f800000 3e680000", + "3f400000 00000000 3f800000 3f000000 3f800000 3f000000 3f800000 -> 00000000 3f800000 3f300000", + "40000000 00000000 3f800000 3f400000 3e800000 00000000 00000000 -> 00000000 3f800000 3ec00000", + "00000000 00000000 3f800000 3f800000 3f796c80 3e83c07d 3e30a8fd -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 be520e47 3f951182 be520e47 -> 3df13aa5 00000000 00000000", + "3f800000 3e800000 00000000 3e800000 3eb3162d 3eb3162d 3f6bfb88 -> 3e4650a1 00000000 3ed0fca6", + "3fc00000 3e800000 00000000 3f000000 3f8cad03 3e08dd2a 3f662652 -> 3f1642a3 00000000 3f4c9cbe", + "bf000000 3e800000 00000000 3f400000 3f42cda9 3f3a2979 3f42cda9 -> 3e4de5c1 00000000 3f337970", + "3e800000 3e800000 00000000 3f800000 3f82bfd0 3f717b11 3f8ff132 -> 3e9907ee 00000000 3f800000", + "3f400000 3e800000 3e800000 00000000 be155e33 3de299fd 3f38b92a -> 3d8bfb04 3e0fdda8 00000000", + "40000000 3e800000 3e800000 3e800000 3ea668bc 3f41c87b 3ea668bc -> 3df33a30 3ee2acb8 3df33a30", + "00000000 3e800000 3e800000 3f000000 3daab296 3f8d5283 3daab296 -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3f800000 3f800000 00000000 -> 3eb00000 3eb00000 3f280000", + "3f800000 3e800000 3e800000 3f800000 3f740987 3f24c2f7 3f24c2f7 -> 3ed70725 3e9b9239 3f800000", + "3fc00000 3e800000 3f000000 00000000 3f907c09 3f907c09 3edbfc01 -> 3f1a8b8a 3f78ba0c 00000000", + "bf000000 3e800000 3f000000 3e800000 3f6cc42f be04508d be04508d -> 3e2e6cdd 3f284509 3ebc678d", + "3e800000 3e800000 3f000000 3f000000 3f000000 3e800000 00000000 -> 3e800000 3ef00000 3ee00000", + "3f400000 3e800000 3f000000 3f400000 be0b9be6 3f4dcde1 3f1001b7 -> 3d91784d 3f1d2d34 3f44807b", + "40000000 3e800000 3f000000 3f800000 bcd364ad 3f917202 be001f4f -> be13d170 3f917202 3f800000", + "00000000 3e800000 3f400000 00000000 3f681f1f 3f3baf4d 3f8610d3 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 bdcb9b44 3d974fa5 3f2d66f0 -> 3e0ce972 3f2b8bde 3e91069a", + "3f800000 3e800000 3f400000 3f000000 3e8b8ba9 3e8b8ba9 3eadeb65 -> 3e28a8be 3f2a2a30 3ed6f5b2", + "3fc00000 3e800000 3f400000 3f400000 3d8b5855 3d4b70f6 3f47f5af -> 3be61b00 3efe4df2 3f687a34", + "bf000000 3e800000 3f400000 3f800000 3f2b983d 3e042480 be19a7bb -> 3e5f4dd2 3f51ce4a 3f800000", + "3e800000 3e800000 3f800000 00000000 3f54faaf 3f54faaf bdcb3a04 -> 3e8fef01 3f800000 00000000", + "3f400000 3e800000 3f800000 3e800000 3f6ed9b5 3f6ed9b5 be758272 -> 3ebe5a76 3f800000 3d2bcd40", + "40000000 3e800000 3f800000 3f000000 bdfa8743 3f2bb427 3f2bb427 -> be5df2b8 3f800000 3f2bb428", + "00000000 3e800000 3f800000 3f400000 3f3e555b 3f46cdae 3eae5b36 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 be655e2a 3ec25a84 be655e2a -> 3de9fcb0 3f800000 3f800000", + "3f800000 3f000000 00000000 00000000 3f6ee615 3f6ee615 3f45bdc0 -> 3f37730a 00000000 00000000", + "3fc00000 3f000000 00000000 3e800000 be6df699 3e1a8ff3 3d101dea -> bd49e3c8 00000000 bc3bbcb0", + "bf000000 3f000000 00000000 3f000000 3f5d5664 3f94d998 3f3cd3bd -> 3ed154ce 00000000 3ee19622", + "3e800000 3f000000 00000000 3f400000 3f800000 3f800000 3e800000 -> 3f100000 00000000 3f3a0000", + "3f400000 3f000000 00000000 3f800000 3f9dcebd be47d25f 3ecbb4e7 -> 3f465b0d 00000000 3f800000", + "40000000 3f000000 3e800000 00000000 3f62eb69 3f62eb69 3f694252 -> 3f62eb68 3f0a308f 00000000", + "00000000 3f000000 3e800000 3e800000 3f7eabb3 3f93a5c5 3f7eabb3 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3f203baf 3f811384 3e7bd0d3 -> 3f080eec 3eb0cea3 3edf7a1a", + "3f800000 3f000000 3e800000 3f400000 3f223c1a 3f3be7b7 3f862ac2 -> 3f111e0d 3eacedc9 3f74a011", + "3fc00000 3f000000 3e800000 3f800000 3f55862c 3f206416 3e181f69 -> 3f4024a0 3ea47098 3f800000", + "bf000000 3f000000 3f000000 00000000 3ea3f057 3f33c9ab bda4109a -> 3f0b81f5 3ee61b2a 00000000", + "3e800000 3f000000 3f000000 3e800000 3de25fc9 be5d7cc0 3de25fc9 -> 3ee712fe 3ed22834 3e5a9c7e", + "3f400000 3f000000 3f000000 3f000000 be6de774 be34c2be 3ece1f38 -> 3e66c935 3e7c36f8 3eed4bb5", + "40000000 3f000000 3f000000 3f400000 3ec07d28 bdd66b1f 3ec07d28 -> 3ec07d28 bdd66b20 3f282ef0", + "00000000 3f000000 3f000000 3f800000 bd2061fd 3f96b706 3f4340fa -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f930186 3f613a1f 3f146207 -> 3f2980c3 3f523ae6 00000000", + "3f800000 3f000000 3f400000 3e800000 3e3c6d6f 3ee0c998 3ee0c998 -> 3eaf1b5c 3f3a25cc 3e689732", + "3fc00000 3f000000 3f400000 3f000000 3f8ffc8a be7063ab 3e9244bd -> 3f77fad0 3eac63f8 3eadb38c", + "bf000000 3f000000 3f400000 3f400000 3c9548f3 3f9a59c4 3f220378 -> 3f1ed56e 3f1e1e56 3f399f5a", + "3e800000 3f000000 3f400000 3f800000 3e8fa00b 3e9377bc 3f988f8f -> 3ef1f402 3f3ae99d 3f800000", + "3f400000 3f000000 3f800000 00000000 3f875f13 3f4d658e 3f38f87a -> 3f35874f 3f800000 00000000", + "40000000 3f000000 3f800000 3e800000 3f9750d2 3f9750d2 3f216458 -> 3f9750d2 3f800000 3eb21684", + "00000000 3f000000 3f800000 3f000000 3f7d7876 3e264005 bdcb9909 -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 be2e9eb1 3f8590bc 3d55d29f -> 3eaa2c2a 3f800000 3f2a8178", + "3f800000 3f000000 3f800000 3f800000 3eff757d 3f0145c7 3edc75b7 -> 3effbabe 3f800000 3f800000", + "3fc00000 3f400000 00000000 00000000 3f10537d 3d406c82 3f10537d -> 3f492ef4 00000000 00000000", + "bf000000 3f400000 00000000 3e800000 3f6c1d7f 3f895b82 3f895b82 -> 3f2bba78 00000000 3e11f6bc", + "3e800000 3f400000 00000000 3f000000 3ec25aeb 3f774ea9 be2a5939 -> 3f3d1c43 00000000 3ed55a6c", + "3f400000 3f400000 00000000 3f400000 3ecc47db be45cb60 bd726508 -> 3f38ba1c 00000000 3f17bd3a", + "40000000 3f400000 00000000 3f800000 be18f65a 3df5b5ac 3df5b5ac -> 3e86a3a0 00000000 3f800000", + "00000000 3f400000 3e800000 00000000 3e3eb9c6 3f2786ce 3f6ff946 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f8a462f 3f4203ab 3db1bd25 -> 3f5bda52 3e98c160 3e30a9bc", + "3f800000 3f400000 3e800000 3f000000 3f10f397 3e0b419b 3e5c9061 -> 3f465b58 3de87134 3eb72418", + "3fc00000 3f400000 3e800000 3f400000 3eb18095 3eb18095 3eb021bb -> 3f29ec2a 3e27b0a8 3f29897e", + "bf000000 3f400000 3e800000 3f800000 3eb66c94 3f9edc15 3ed6b2e1 -> 3f46e5d2 3de36bc0 3f800000", + "3e800000 3f400000 3f000000 00000000 3ea0d650 3b29dfc2 3ea0d650 -> 3f3b8a0c 3ee02a78 00000000", + "3f400000 3f400000 3f000000 3e800000 00000000 3f800000 00000000 -> 3f1c0000 3f300000 3de00000", + "40000000 3f400000 3f000000 3f000000 3f414052 3f414052 be747a93 -> 3f70f03c 3f414052 be747a92", + "00000000 3f400000 3f000000 3f400000 3d3dfac5 3d3dfac5 3f2cbba1 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f138a2d bda09080 3f342866 -> 3f43a9e8 3eb5f6f8 3f800000", + "3f800000 3f400000 3f400000 00000000 3f713635 3f713635 3de9b68d -> 3f6a7454 3f6a7454 00000000", + "3fc00000 3f400000 3f400000 3e800000 3e42aec4 3f68be6b 3f66e427 -> 3f136093 3f7aeb1c 3ef3c0ac", + "bf000000 3f400000 3f400000 3f000000 3f76ce0b 3f75379f 3f6e6e32 -> 3f29b95e 3f2a0592 3ec8c8e7", + "3e800000 3f400000 3f400000 3f400000 3fa00000 3fa00000 3fa00000 -> 3f520000 3f520000 3f520000", + "3f400000 3f400000 3f400000 3f800000 3f97cd02 3f927591 3ed7eac3 -> 3f716350 3f6e6221 3f800000", + "40000000 3f400000 3f800000 00000000 3eff1bae 3eff1bae 3f8cd9ff -> 3f3faa60 3f800000 00000000", + "00000000 3f400000 3f800000 3e800000 3f900c98 3e96163e 3e96163e -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f1d1007 3dc78f63 3dc78f63 -> 3f457302 3f800000 3ecc78f6", + "3f800000 3f400000 3f800000 3f400000 3f999755 3dde92b6 3f999755 -> 3f8198c0 3f800000 3f8198c0", + "3fc00000 3f400000 3f800000 3f800000 3f58defa 3f607720 3f58defa -> 3f71fd6c 3f800000 3f800000", + "bf000000 3f800000 00000000 00000000 3f87a178 3ee4035b 3f87a178 -> 3f800000 00000000 00000000", + "3e800000 3f800000 00000000 3e800000 3f2baf22 3f6e5771 3f2baf22 -> 3f800000 00000000 3e8830d6", + "3f400000 3f800000 00000000 3f000000 00000000 00000000 3f400000 -> 3f800000 00000000 3f180000", + "40000000 3f800000 00000000 3f400000 3f90a657 3f8b8e41 3d756f92 -> 3f800000 00000000 3ed70274", + "00000000 3f800000 00000000 3f800000 3eb6b40e 3f8a99e3 3f2db4e9 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f800000 00000000 00000000 -> 3f800000 3e200000 00000000", + "3f800000 3f800000 3e800000 3e800000 3f134da5 be28d893 bdc55722 -> 3f800000 3a2ec980 3cd7fd4e", + "3fc00000 3f800000 3e800000 3f000000 3f000000 3f400000 00000000 -> 3f800000 3ec80000 3e000000", + "bf000000 3f800000 3e800000 3f400000 3f52054f 3f8227ef 3e88abe8 -> 3f800000 3e1cc41a 3f4b2fe2", + "3e800000 3f800000 3e800000 3f800000 3f94e459 be4663d4 be4663d4 -> 3f800000 3e3d66a4 3f800000", + "3f400000 3f800000 3f000000 00000000 3f542a93 3f542a93 3eef8a76 -> 3f800000 3f1f8ff8 00000000", + "40000000 3f800000 3f000000 3e800000 3f899cb8 3f899cb8 3f174fb4 -> 3f800000 3f899cb8 3ea2f78e", + "00000000 3f800000 3f000000 3f000000 3f3600fe be0e98be 3ed3d7e7 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f310497 3f95a9c3 3f98551a -> 3f800000 3f2ad4e2 3f611fe9", + "3f800000 3f800000 3f000000 3f800000 3e715680 3f4ec6fa 3ee935e9 -> 3f800000 3f27637d 3f800000", + "3fc00000 3f800000 3f400000 00000000 be748eb4 3dcc6a09 3e6bf8d0 -> 3f800000 3f065f74 00000000", + "bf000000 3f800000 3f400000 3e800000 3f0a4fe3 3f09b163 3f9b702d -> 3f800000 3f3e2ebd 3dedaf78", + "3e800000 3f800000 3f400000 3f000000 be11cfad be11cfad be475ade -> 3f800000 3f309522 3ed38a52", + "3f400000 3f800000 3f400000 3f400000 3f400000 3f400000 3f800000 -> 3f800000 3f520000 3f640000", + "40000000 3f800000 3f400000 3f800000 3f536c4a 3ed17065 3e12c017 -> 3f800000 3f2e8a24 3f800000", + "00000000 3f800000 3f800000 00000000 3f400000 3f400000 3e800000 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f400000 3f800000 00000000 -> 3f800000 3f800000 3e200000", + "3f800000 3f800000 3f800000 3f000000 3c01be31 3f843f64 3eb70115 -> 3f800000 3f800000 3edb808a", + "3fc00000 3f800000 3f800000 3f400000 3f7f2e86 3f00e280 3f574f63 -> 3f800000 3f800000 3f711ca8", + "bf000000 3f800000 3f800000 3f800000 3f9041f7 3e87c018 3ec5194f -> 3f800000 3f800000 3f800000", + "3e800000 00000000 00000000 00000000 3f5dd3c6 3f5dd3c6 3efea16c -> 00000000 00000000 00000000", + "3f400000 3e800000 3e800000 3e800000 be2d39a7 3f8df47c 3f45b037 -> 3d7d1f22 3ed7b30c 3ea7331f", + "40000000 3f000000 3f000000 3f000000 3f2ed1ce 3f5c66a3 3f229513 -> 3f2ed1ce 3f5c66a4 3f229514", + "00000000 3f400000 3f400000 3f400000 3e800000 3f000000 00000000 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3e9655bf bd63c70b 3e9655bf -> 3f800000 3f800000 3f800000", + "3f800000 3fa00000 3fa00000 3fa00000 3f5dc72e 3f8cfc8d 3f082d7c -> 3f82b1c1 3f5fc450 3f9d71c9", + "3fc00000 be800000 be800000 be800000 3e7cc373 3e7cc373 3f6af4cb -> bc4f73c0 bc4f73c0 bf24457e", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3ec43dbd 3efbb494 bd654db3 -> 3de2502d 3dce5898 3e19a3ab", + "3e800000 3f666666 3f666666 3f666666 bcc08da8 3f89a5d4 3f89a5d4 -> 3f605e84 3f6d073e 3f6d073e", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 00000000 3f800000 3f400000 -> 3e2aaaaa 3efffffe 3ed55554", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3eb36a5a 3f86c3b7 3f74ffb0 -> 3f08a10b 3f943c32 3f895532", + "00000000 be6abd2d 3e34f015 3f7622fc be3b53b2 3f197247 be3b53b2 -> be6abd2d 3e34f015 3f7622fc", + "3f000000 3f3f0701 3f951979 3f977df4 be77dc0c 3f9f09b1 be77dc0c -> 3f1b0d02 3f82d9e1 3fac1fa6", + "3f800000 3edb13ab be452f6e 3edb13ab 3e51d6a9 be18688f be18688f -> 3e911ba0 3dd7f0c9 3de1b868", + "3fc00000 3e5be043 3e064e0a 3e064e0a 3ec97181 3f9c1c4a 3f37efec -> 3e24ae56 3ec11c18 3e52cbf1", + "bf000000 3f17d46a 3f7509a2 3d5b55fe 3f7d5b92 3ef165b6 3f82e4a8 -> 3ef3272e 3f755640 3cddb25c", + "3e800000 3f7d0d6d 3f108262 3f108262 3f9162a7 3f9162a7 3f7f2977 -> 3f7dfa8e 3f248466 3f2023e0", + "3f400000 bdf9f856 3efe6a52 3e2d3f05 3e1fa783 bcdb0900 3e1fa783 -> bd526927 3e99491a 3dc5e9c8", + "40000000 bde2fd46 3f678670 3ec03778 be18aaad 3d625bd2 bd821e4b -> 3e55d66e 3f4025f6 be1ccdac", + "00000000 3ee8eeee 3f34e463 3ee8eeee 3f5e1fc1 3f085739 3f5e1fc1 -> 3ee8eeee 3f34e463 3ee8eeee", + "3f000000 3f82dbcc 3f9ed726 3f661e1d 3c822418 3f200bb1 3d5f2d8b -> 3f8445fb 3f9a0cba 3f5bc0a4", + "3f800000 3f34ed5b 3edeb46a 3cb3864b 3f69db0b 3f69db0b 3f9fe01b -> 3f60ce38 3f236288 3d5d48bf", + "3fc00000 3eab6474 3e8b6ba6 3f9f9adf 3ea3a062 3f0291e1 3ea6d5e1 -> 3e5b5c00 3e8e79d3 3fb431a8", + "bf000000 3eba076b 3f8bd9c4 3eba076b 3f1055c4 3f914fd1 3ee33fcc -> 3eb278bc 3f941363 3ec0ae00", + "3e800000 3e68c927 3e68c927 3f680bd3 3e800000 3f800000 00000000 -> 3e524d6c 3e8ae04e 3f629e3a", + "3f400000 3eba13b0 3f59621b 3e59ef68 3f96c2a1 3f96c2a1 3e51c112 -> 3f194111 3f7ab91f 3e0dfb42", + "40000000 3f0877c5 3f0877c5 3e92a4b1 3e800000 3f000000 3f400000 -> 3e917ef4 3f0877c5 3efb493f", + "00000000 3e914b92 3f962f60 3f962f60 bdce382c be25f70f bdce382c -> 3e914b92 3f962f60 3f962f60", + "3f000000 bd26b27d 3f77e300 bd26b27d 3eba0c76 3f12ba58 3eba0c76 -> bd0efedc 3f787621 bd0efedc", + "3f800000 3f3ecc18 3efa9dc3 3efa9dc3 3f2aaaab 3f2aaaab 3f2aaaab -> 3f4efeee 3f12a1cd 3f12a1cd", + "3fc00000 3f7c325d bca3ba56 3f7c325d 3ee8a8b6 3ebcb22e 3f11ea64 -> 3f7baf30 bc43bd56 3f7cfbbe", + "bf000000 bdbd3bc8 bdbd3bc8 3f02acee be67dea4 3e92bbe7 3e6de908 -> be29b358 bde9596f 3f13cc73", + "3e800000 be6a1e8c be108b1e 3d8582e8 be34b146 3ef9d66f 3ef9d66f -> be08d439 be0f8d00 3d84c2a1", + "3f400000 3d0559e2 3f8d1bba 3f922e94 3db901fe 3eb876da 3f9cf05d -> 3c584cf3 3f902308 3f77221a", + "40000000 3f7abef6 3eb876eb 3ed8165c 3f81e0ec 3e2e58aa 3e2e58aa -> 3f82ab95 3d669030 3dcd7500", + "00000000 3f82bf80 3f82bf80 3e656b35 be5c0a32 3f257ceb 3e0635a8 -> 3f82bf80 3f82bf80 3e656b35", + "3f000000 be751c90 3db7c476 3f8f31f7 3eaaaaaa 3eaaaaaa 3eaaaaaa -> be427b26 3d9be344 3f920742", + "3f800000 3f7719e0 3f7719e0 3f8a18a4 3df37898 3ed51a03 3f112b80 -> 3f708dc5 3f75a965 3f88a297", + "3fc00000 3f99c7fb 3d23abe0 3f7bcb46 3f984620 3f4a3f77 3f4a3f77 -> 3f3365b3 3d9631f0 3f7f64bd", + "bf000000 3f2e2636 be416167 3f2e2636 be04fe0a be04fe0a 3f921011 -> 3f51389b bea9182b 3f0a7398", + "3e800000 3ebce394 3f7db0ab 3f74d5c8 3e3df925 3f7b5e96 3ef9be4b -> 3eaa253f 3f7e3dde 3f74c514", + "3f400000 3ddfbce3 3e623484 3ebe429f 3f9fede8 3e092ce1 3ebf878c -> 3e5fe3d0 3e0170f7 3ea7ad98", + "40000000 3e0f06c2 3ea5fa0d 3f46357d 3f400000 3f000000 00000000 -> 3e8509b1 3ea5fa0d 3ed9702a", + "00000000 3f325d7f 3f9aca5b 3f325d7f be10ad5a be10ad5a 3f3d93b2 -> 3f325d7f 3f9aca5b 3f325d7f", + "3f000000 3e52b4f5 bcc92be4 3e52b4f5 3f95f0fd 3f7daf14 3f7daf14 -> 3ea188c5 bd172e67 3e926f15", + "3f800000 3f4134e5 3f484e1b 3e73cfc2 3e81ca55 3f0c0d63 3e81ca55 -> 3f29d7b2 3f4c688a 3e183af7", + "3fc00000 3f5a46b2 3f8085a9 3f5a46b2 3f87c614 be007866 be02324d -> 3f883122 3f81817a 3f1dc28f", + "bf000000 3ed8c993 3f767cbe 3f768716 3f000000 3f000000 3f000000 -> 3ed8c993 3f767cbd 3f768715", + "3e800000 3eda6139 3f99f212 bdcfceea 3f800000 00000000 3e800000 -> 3ef9b050 3fa1bf2d bdb3324c", + "3f400000 3f0a5255 3f908d25 3f908d25 be380331 bd68e36b bd68e36b -> 3e92fd4c 3fa02a06 3fa02a06", + "40000000 3f93bc97 3f1d845c 3ea78180 3f9cdad8 3e9b9ab6 3f9ae435 -> 3f23458a 3edbfa28 3f73d04c", + "00000000 3f77d7a7 3e11f04e 3f37a881 3f53bcc7 bb7760a6 3efd5644 -> 3f77d7a7 3e11f04e 3f37a881", + "3f000000 3f1e01b8 bc8d6d30 bdd634a5 3f800bbf 3ee652f2 bd8ea05b -> 3f3c4512 bc863636 bd1ed86e", + "3f800000 3e19447c 3f682fa9 bcfc7ebc 3bc35be8 3f2a475a 3bc35be8 -> 3cc3f471 3f6f51fb 3a15ba16", + "3fc00000 3f1dd1a7 be6532d3 bc40a2d2 3f4b7b78 3f4b7b78 bd98173c -> 3f535bbc beeea881 3c0f2324", + "bf000000 3f2bfb30 3f83829f 3f695033 3f400000 3f400000 00000000 -> 3f1ddec6 3f846970 3f73a6c1", + "3e800000 3ec1b543 be25cc96 3ec1b543 3f400000 3f000000 3f000000 -> 3ed0c2be be25cc96 3ec1b543", + "3f400000 3f742bac 3f9517cc 3f2c869b 3ef287df 3f2d6edf 3f2d6edf -> 3f73b9b1 3f8e8d70 3f3b8069", + "40000000 3f15dd27 3ec0e5b4 3f8ab72f 3e9e97b4 3c71c9ce 3f925ef8 -> 3ecd298e bda1ce44 3f59a5ae", + "00000000 3ee4b5fb 3ddbc032 3e59c303 3f5fd956 3ec26cf2 bb5f3cf7 -> 3ee4b5fb 3ddbc032 3e59c303", + "3f000000 3e9ab4e7 3e9ab4e7 3f599c93 3ec75f86 3e2909df 3f6a07d9 -> 3e8ec42d 3e6d18b3 3f67208e", + "3f800000 3f504b23 3e88c00e 3e88c00e 3eba2b61 3eba2b61 3f21c244 -> 3f45b494 3e5ad27f 3ea32f0e", + "3fc00000 3f81df17 3f4f5244 bbcd21e1 bdf624ff 3de2f5ce be6a8e98 -> 3f856780 3f214b52 3bf65662", + "bf000000 3d39106b 3f9b6f62 3f988f8b bd9447c0 bd9447c0 3f42f6d8 -> 3d8f1ac5 3f885d81 3fa037d0", + "3e800000 3f977d97 3f92d260 3f92d260 3f800000 00000000 3f800000 -> 3f908a4a 3f983819 3f8d6ca7", + "3f400000 3ec6dca1 3f397afe 3f8c3fff 3c02668c 3e909a9e 3ec8c01a -> 3e5a3142 3f28ce43 3f8e6c2f", + "40000000 be4f7e14 3f92a91a be4f7e14 3f400000 3e800000 3e800000 -> bee483b8 3fa80aa4 3d282d20", + "00000000 3e7f59f6 bdb4cbcf be2f3675 3ed82428 3f91ebe6 3f27e831 -> 3e7f59f6 bdb4cbcf be2f3675", + "3f000000 3f831f72 3f015967 3f831f72 3f83e96a 3e73fe61 be4d47eb -> 3f816cf2 3ee1338e 3f855d18", + "3f800000 3eef84b6 3eef84b6 bd8e2494 bdfb35ea bdfb35ea 3ca221f4 -> 3e218e39 3e218e39 3af64e94", + "3fc00000 3e647d4c 3f67d70b 3e50e6ba 3d823e77 3f31d975 3d823e77 -> bb79ce40 3f749f26 bc0cce28", + "bf000000 3e8e525b 3e16c720 3f392864 3f25be6b 3e076657 3f1c93e5 -> 3e7e5794 3e4610a1 3f33701e", + "3e800000 3f69fbd3 3ef72b40 3f05892b 3f98de77 3f3f3246 b9926dc9 -> 3f70f820 3f037980 3eeb1d17", + "3f400000 3f328871 3e51d3a9 3e850226 3de2bc4d 3ebf735d 3ebf735d -> 3f12fc64 3e324703 3e64c777", + "40000000 3f89e7f9 be7bfaf9 3f805253 00000000 3f000000 3e800000 -> 3f9f4071 be7bfafb 3f80a4db", + "00000000 3d64b808 3f880854 3f1110cb 3f94fcbd bd9ef67d 3f94fcbd -> 3d64b808 3f880854 3f1110cb", + "3f000000 3ed00df1 3eb59219 3eb59219 3f919009 bd9ab5e8 3f19e703 -> 3f0f60ca 3e6441cd 3ec16d58", + "3f800000 3f220f52 3f86dd9f 3f0c274e 3f4a12b2 3f4a12b2 3ec6d539 -> 3f447957 3f82adf0 3efbfb30", + "3fc00000 3f0d4530 3ef97e8e 3ea7ca02 3e5699a5 3f9cc864 3ebb249a -> 3eac36dc 3f83ea6d 3e748e4e", + "bf000000 3e2f7e7a 3ee752e5 3e2f7e7a 3e407005 3f8a099a 3f8a099a -> 3e5cdffe 3e9df966 3db6c380", + "3e800000 be240bf8 3f2e3052 3f05e5ae 3e67c6db 3f884f92 3e67c6db -> be0a0134 3f3de99b 3efa514e", + "3f400000 3f58bb63 3f58bb63 3e89ff10 bda548a0 3f508f30 bddb3bcb -> 3f3bc622 3f686ca3 3db8d4fe", + "40000000 bdf96497 3f2e4f76 be34bac9 3f9ceea4 3f9ceea4 3f2a96fe -> bf04bb83 3fa7ec33 bea11ce8", + "00000000 3ea21761 3eb9a9c4 3f3ebcda 3e800000 3f000000 3e800000 -> 3ea21761 3eb9a9c4 3f3ebcda", + "3f000000 3f2f5c79 3f2f5c79 3f9fe1c9 3f9e054e 3e75a769 be11d2ad -> 3f57ef7e 3f20fe5f 3fb976eb", + "3f800000 3f9cc189 3ecc7fcf 3ea42ac6 3f400000 3e800000 3f400000 -> 3f8b25dc 3e8f16e4 3edbee74", + "3fc00000 3f2865bd 3f421329 3d9e7f7c 3e800000 3f800000 3f000000 -> 3efa5b67 3f843f2a 3d9e7f7c", + "bf000000 3f45ec8b be189ff7 3f957b99 3eeac924 3d9fb106 3d9fb106 -> 3f47c8d0 be62a309 3f8ae517", + "3e800000 3c0321c8 3c0321c8 3f81424c 3f57cbe0 3f80b4e5 3f80b4e5 -> 3c19702a 3c2402fa 3f80f008", + "3f400000 3f025a28 3f3f5823 3f15107c 3ef248fd 3f4480c0 3ef248fd -> 3eff9020 3f52bdde 3f129000", + "40000000 3f838139 3ef4a765 3ef4a765 3e3da95f 3ef4d22e 3f407625 -> 3f8809e1 3ee97f33 3f3aa96e", + "00000000 3f004936 3ef40528 3ef40528 3d55f270 3f1dcb62 be0610ef -> 3f004936 3ef40528 3ef40528", + "3f000000 3def6fe9 3e7b21b7 3d201077 3f737482 3eda94ff 3c2e4efa -> 3e276618 3e6d4790 3ca99792", + "3f800000 3f9cc176 bd92f7f6 3f9cc176 3f6526de 3d5b90aa 3f6526de -> 3f80ed2e bb4ae48e 3f80ed2e", + "3fc00000 be556d75 3f969863 3ecfd369 3f32a36c 3f59b230 3f32a36c -> beb73d0b 3f754df3 3f0c8bfa", + "bf000000 3f295303 3f4a9207 3d5b53ff 3f800000 3f000000 3f000000 -> 3f0ca8dc 3f4a9206 3d5b53fe", + "3e800000 3e053608 bdf7a9c9 3e053608 3f78b204 3f3cc609 3f3cc609 -> 3e20873a be0c4ec6 3e12f74e", + "3f400000 3eef2ce5 3f70f688 bde532a5 bda112bf 3f801590 3e9bc375 -> 3e808dfc 3f7b97a0 bd9a5bd6", + "40000000 3e492d3d 3f8769d8 bd9f8f42 3c8218cf 3c8218cf 3e21a43c -> bddfb8c5 3f9699d2 3d17a666", + "00000000 3f059125 bcf32e7e 3e0d7ecc be50f341 be50f341 3e566a64 -> 3f059125 bcf32e7e 3e0d7ecc", + "3f000000 3f68a8e7 3f5071a9 3b338e2a be107bff be1dfda6 be49fd52 -> 3f5b0f88 3f371bdc 3a5acf48", + "3f800000 3f9c0b2b bdd03760 bdd1d9f9 3f86b366 3ee867fc 3f31443a -> 3f6c8d8c bdbb134d be157300", + "3fc00000 3f90304e bd501367 3f050102 3f5508f5 3dc93fd4 3f5508f5 -> 3f7c0858 3c5dbf1a 3f44aec7", + "bf000000 3f4809e6 3f4809e6 3d84f793 3ef8f1a1 3e8de162 bc44fd4d -> 3f48a42c 3f51c905 3dc4a10a", + "3e800000 3f107e1a 3e6db68d 3e6db68d 3f5cc066 be317c55 3da8f6cf -> 3f1be4e0 3e304314 3e479c32", + "3f400000 3ebf98ee 3ef38423 3ef38423 3f400000 3f800000 3f800000 -> 3eec8f3e 3f29a4d8 3f29a4d8", + "40000000 3e01621f 3f9eea2c 3e01621f 3b9f6382 bd547f2d bd547f2d -> bdbcfa2a 3ff3a45e bdf04a0d", + "00000000 3f4986b0 3ecf9f1b 3ecf9f1b 3f997097 3f997097 3f1d4c5a -> 3f4986b0 3ecf9f1b 3ecf9f1b", + "3f000000 3f7767e8 3acec3ae 3f7767e8 3f7d3557 3f7d3557 3e317124 -> 3f7b77d6 3b19ddbc 3f74b13a", + "3f800000 3e07416b be5dba8a 3e07416b 3d0a1643 3f75893f 3f75893f -> 3cce3e30 beeab576 3e730c9a", + "3fc00000 3f536961 3f536961 3eedb035 3e88699b 3e88699b 3ecbbe55 -> 3f399c28 3f399c28 3ec6b24c", + "bf000000 3f4d9278 3f5aacb6 be5deeec 3e8d2300 3f24311d 3f216139 -> 3f56a821 3f562acb be3ab946", + "3e800000 3f0322f9 3f0322f9 3f6d69b2 3f194a20 3f077d80 3f92ba79 -> 3f064bc1 3f041284 3f72fbbc", + "3f400000 3e7a02e9 3ef496e5 bd5b20c3 3f371ec2 3f2f20de 3f4e2c52 -> 3e9b8586 3f0beec9 bda26f22", + "40000000 3f472c0f 3f8dc522 3e627843 3f9bc8aa 3e6d6843 3f923bef -> 3fa2fe30 3f9e2110 3f29ef83", + "00000000 3e4203fd bd7c6e25 3ea9b528 3f400000 3f400000 3f000000 -> 3e4203fd bd7c6e25 3ea9b528", + "3f000000 bd7c8575 3f4cad9a 3f4e8410 3f33bade 3f8c57ca 3f7d7287 -> bd9958db 3f6526c5 3f6213cb", + "3f800000 be1043ce 3e93b0ca be1043ce 3f400000 3e800000 00000000 -> be628f40 3e3e4b0c 3ca298b6", + "3fc00000 3e5543fc 3e5543fc 3f574830 be800000 be800000 be800000 -> be26a53e be26a53e 3f0a3d02", + "bf000000 3f8cecf2 3f8cecf2 3f249910 3f578ac7 3f7ba0fb 3f578ac7 -> 3f91cabd 3f93cc48 3f108065", + "3e800000 bdd7220a be2566ac 3ebda354 bd69106f 3f3354eb 3f178a94 -> bd94efc0 be38a988 3ec320ba", + "3f400000 3f4ea33d 3e064ddc 3f58c7b0 3f6fda3a 3f321d3f 3f321d3f -> 3f68c03f 3e28918e 3f62883b", + "40000000 3f62ad31 be676bb1 3f80b3ec be75bd76 3e8bd8e2 3f8580a5 -> 3f15d2c3 3cd05240 3f7e55fc", + "00000000 3f6d36a9 3f86e153 3ed7da87 3e35d015 be266415 3f23f84f -> 3f6d36a9 3f86e153 3ed7da87", + "3f000000 3f41bcb5 3c8ce162 3f41bcb5 3f9503b5 3f7be768 3d3656a6 -> 3f61086a 3ccfe4d4 3f2c4660", + "3f800000 3e83fdaf 3f47c697 3f47c697 3eacf181 3eacf181 3cad827e -> 3e486a30 3f398a66 3f1dc227", + "3fc00000 3ea9f06e 3e119eff bc001ad6 3f800000 3f400000 3f800000 -> 3f2a1eca 3e6f4e34 bca0e1dc", + "bf000000 3f26de55 3edadf44 3f26de55 3e0d0be1 bd5f1d76 bd5f1d76 -> 3f3bea4e 3f102d03 3f47151f", + "3e800000 3eff6e11 3eff6e11 3f9e2e13 be5ccfb8 be5ccfb8 3f3588c5 -> 3ed1a124 3ed1a124 3f9a47c5", + "3f400000 3e263991 bddd8a9d bddd8a9d 3f970ffd 3f80739b 3f98b8b2 -> 3e9a24e0 be4b7c3e be6e65de", + "40000000 3e480365 3f89e109 3f8516d0 3f09ec53 3f09ec53 be30cb38 -> 3e60f7bd 3f883aa7 3f935388", + "00000000 3f2bd600 3f960a5e 3f2bd600 3f08ef5d be691339 be691339 -> 3f2bd600 3f960a5e 3f2bd600", + "3f000000 3da148e9 3da148e9 bd9ad253 00000000 3f400000 00000000 -> 3d2dfc82 3dc66e3c bd0f1e1c", + "3f800000 3f18a3c2 3d908720 3d8ff09a 3f529970 be17d45c 3f6572f0 -> 3f4068b3 bc6d13d9 3dfa0114", + "3fc00000 3f8ea813 3f8612d4 3f8612d4 3f5f0606 be060fb1 3f988b83 -> 3f78ef05 3f921d62 3f71be10", + "bf000000 3f9fa290 3f9fa290 3f7775ad bd831184 bc5c4d9c 3f9f8c4d -> 3f89621e 3f8b60b3 3f714c1a", + "3e800000 3f76ab1e be6f5a6b be6f5a6b 3d2fa55f 3f80c2fb 3d2fa55f -> 3f749d04 be9d0747 be2bdc14", + "3f400000 3f5b9c42 3e0e9dc8 3e0e9dc8 3ed2af13 be1fb1c3 be1fb1c3 -> 3f577748 3caeaf81 3caeaf81", + "40000000 3f9f9b7d 3f9f9b7d 3f4b8b0b 3edd9587 3edd9587 3efe8cc5 -> 3faa344d 3faa344d 3f4b1215", + "00000000 3dd205e0 3f79e18e be6df85f 3f300888 3f8fb3c1 3dbdb01e -> 3dd205e0 3f79e18e be6df85f", + "3f000000 3f589c6d bdf95fd5 3f589c6d 3f4cc5be 3f7f81d4 3f82e439 -> 3f629b22 be425a4c 3f6a0736", + "3f800000 3f395787 3f395787 bdb495ed 3f6dcaed 3f91e85e 3f6dcaed -> 3f65389c 3f7acfc5 be2e9239", + "3fc00000 3e94d853 3ef23085 3d93dc37 3ec451b0 bdde33b7 bdde33b7 -> 3e5fda6b 3c934e98 bd4d23d2", + "bf000000 3f31c36c 3f73f5e4 3f140934 3eedf45a 3eedf45a 3e825b00 -> 3f33ad99 3f745d6a 3f235b51", + "3e800000 3f9eb0b0 3f9eb0b0 3f011ff9 3f820894 3f84a4b1 3f820894 -> 3f94e033 3f947ce6 3f11a1ca", + "3f400000 3f21a757 3ee1ea84 3f21a757 3f43d661 3c72a1d0 3f55f484 -> 3f39558e 3e860bc0 3f3fa8a0", + "40000000 bdb2b188 3f54a12a 3f54a12a bd7fe60c 3f4d8205 3f112ef8 -> 3e0136d6 3f8020b0 3f5e4d28", + "00000000 3f1736b5 3eaf8cdd 3dd7c4cc 3f800000 3f800000 3f800000 -> 3f1736b5 3eaf8cdd 3dd7c4cc", + "3f000000 3f7db7bc 3f909349 3f7db7bc 3f94fbf8 3e233e66 3f94fbf8 -> 3f7f3831 3f96f39e 3f7f3831", + "3f800000 3f859c38 bdbbcfec 3f4e07bb 3f8805bd 3e877443 3e877443 -> 3f7e0a42 bd368779 3f3b17dd", + "3fc00000 3f895832 3f895832 be1d3565 00000000 00000000 3f000000 -> 3f986273 3f986273 be1d3566", + "bf000000 3ef5c2aa 3f219719 3eed116d 3f7e0546 3f91c731 3f91c731 -> 3eb6d9d6 3ef708bc 3e9bbcbb", + "3e800000 3d8071cf bd876ee5 3ebc856e 3f23db8d be3892cf 3f23db8d -> 3d88e03d bd2ca55a 3ec4dcde", + "3f400000 3ea0cab5 3e81082c 3dcabad1 3e4c0e8a 3e4c0e8a 3f7da7b9 -> 3e5e13cc 3e2afdbf 3e289bb3", + "40000000 3f8c874f 3f8c874f 3f3f539d 3e6785ef 3f495c71 3f495c71 -> 3f9b9937 3f798612 3f76bb39", + "00000000 3dd5c0db 3d7cef7b 3ed51998 3b8496b7 3b8496b7 bd996a7f -> 3dd5c0db 3d7cef7b 3ed51998", + "3f000000 3f4e3c46 3e949e57 bda0a737 3edb3733 3f4dd159 3edb3733 -> 3f4b5aeb 3eb4ae7a bd9434ac", + "3f800000 bdd2baaf 3e29cd24 3f1fb4a0 00000000 3e800000 3f800000 -> 3c2d76d0 3dc5f544 3f5bc762", + "3fc00000 3f82ecb2 3caf14db 3f367e3d be5adeb4 bda61904 3f011dac -> 3f895473 bc773b6a 3f372da8", + "bf000000 3f477507 3ec71e1e ba985730 be0ddbca 3f382815 3e86c35b -> 3f639654 3eac6cf5 babc7492", + "3e800000 3d803730 bd8499af 3f7da7ab 3f760d0f 3e18bf77 3f760d0f -> 3d9bed62 bd57ab0d 3f7e30d1", + "3f400000 3ed194ac 3dc6101e 3f7778de 3f727144 3f727144 3f83d6d3 -> 3f124b96 3e1f0414 3f7e069e", + "40000000 3eeafa45 be09ede8 bd8ef74b 3e70400c 3ce6de3d 3ce6de3d -> 3e4809b6 3e1d7192 3d91af51", + "00000000 3f199a6c 3f87763c 3f87763c 3f048968 3eca4410 3f048968 -> 3f199a6c 3f87763c 3f87763c", + "3f000000 3f24663b 3f24663b 3f562090 3f278fa6 3e813422 3f8834e7 -> 3f2d7d66 3f15d4dc 3f69e279", + "3f800000 3f937a16 3f860efd 3f9a94b3 3f0f08b6 3e30ba69 3f421a13 -> 3f90d757 3f8a36b1 3f8a00dd", + "3fc00000 3f9c60d3 3f20bc53 3e9c4c55 3e1b2ed5 3f9eddaf bdbbfb86 -> 3fc09ee8 3f92dd17 bd91eb72", + "bf000000 3e931fbb bdf109f4 3ea2a790 be4ec5bf be4ec5bf 3f3f13a5 -> 3edcb822 be571259 3e874f33", + "3e800000 bdb15e52 bdb15e52 3c8c765b 3e6a4795 3e6a4795 3d36d98e -> bd973bb5 bd973bb5 3c5a0f81", + "3f400000 3d45aa51 bdc02e38 3d45aa51 3f08634c 3ea5adc7 3eb81c6e -> 3d4ee949 bd888e1b 3d1e0b29", + "40000000 3f9266ff 3f9266ff be3a9d94 3f2d431d 3f98ed8e 3e0e267b -> 3f83844b 3f2fd1e8 3e042062", + "00000000 3f277daf 3f5489c0 3f5489c0 3f57b274 3e52de0c 3f1fab24 -> 3f277daf 3f5489c0 3f5489c0", + "3f000000 3f18dcef 3f18dcef be6c6c0b 3cbbbe15 3f03429c 3f03429c -> 3ef6f6ac 3f19a5b6 be7020c8", + "3f800000 3f8cf2ef 3f502a7b 3f502a7b 3ecb8d48 be4c1e92 3ecb8d48 -> 3f8fdeca 3f19c353 3f483273", + "3fc00000 3e72bc6c 3e72bc6c 3f207da3 3e8e1cdf 3f8aa066 3f8aa066 -> 3dee4e68 3f0da9f0 3f849beb", + "bf000000 bd49ed7e bd49ed7e 3ef725da 3f138b7a be2f20fd 3f74c70b -> bd39c048 bdac0d91 3ebcd434", + "3e800000 3f34000d 3f54fe29 bdf3ae27 00000000 3e800000 00000000 -> 3f26a40f 3f508522 bdaf82fd", + "3f400000 3d85f4d0 3f71332b 3d85f4d0 be40148f 3f33f52e 3ea96e96 -> 3b1ab6b0 3f7571f5 3d4c68df", + "40000000 3f844f9a 3e8d4f4f 3f8a3144 3f9d2289 3e08c4f1 bdb37b3b -> 3f6eaede bc8a6220 3fa40eda", + "00000000 bdf34649 bdf34649 3e00450f 3ecec645 3f565c34 3f6d5e4c -> bdf34649 bdf34649 3e00450f", + "3f000000 3f6a11c9 bccc08a8 3f34dc8a 3f63ad59 3e7d00a9 3f63ad59 -> 3f71e07e bc97248e 3f4987dd", + "3f800000 3f0c94ae 3f0c94ae 3d0a4014 bdd893d7 3e832620 bdd893d7 -> 3e7f2cc5 3edb56ce bbbcb203", + "3fc00000 bd00100c 3f687161 3f73ea70 3ec7a25d 3f03b8b2 3ec7a25d -> bca8e3fc 3f69602e 3f701cf4", + "bf000000 3f9849c5 3f9849c5 3e011769 3f46c534 3f46c534 3c4adc20 -> 3fa046d0 3fa046d0 3e381a72", + "3e800000 3ef41c06 3f9693f0 3ef41c06 3ef89d52 bd29119b 3edab019 -> 3ef33032 3f9dc422 3eef749c", + "3f400000 3f023b5c 3f0b3d99 3f0b3d99 bd05682c bd05682c 3f8b4393 -> 3e9e3dcc 3eb10430 3f4340d6", + "40000000 bd627cf4 3f0f163f 3e0863b8 3e633619 3f44e261 3f44e261 -> 3c1d9b90 3f5303a5 3e83d155", + "00000000 3f9dd317 3f2553a0 3e372b41 3e802a81 3e802a81 3e6aadfa -> 3f9dd317 3f2553a0 3e372b41", + "3f000000 3f9372b8 3f86c1ca 3f9372b8 3f9195cd 3e23c067 3f774359 -> 3f852b35 3f892d1f 3f8902dd", + "3f800000 3f7043f3 3f07c13c 3f23ea37 3e09a5d4 3e7f79db 3e09a5d4 -> 3f6577d4 3ecf9d31 3ef19c18", + "3fc00000 3e3700fb 3f8e4600 3e3700fb 3f666666 3f666666 3f666666 -> 3eb5ae51 3f76787c 3eb5ae51", + "bf000000 3f909db2 3f909db2 3f5c1fbc 00000000 3f400000 3f800000 -> 3f873ac2 3f954f2a 3f4cb326", + "3e800000 3ef13b22 3f9f9623 be387622 3e800000 3e800000 3f400000 -> 3ee148c4 3fa48254 be53ac37", + "3f400000 3ed2e752 3e656894 3e25980c 3f6f984c 3f6f984c 3e8e40a2 -> 3f120053 3eace75a 3deeab40", + "40000000 3f368353 be221c37 3f03493e be6946a8 3e0f0388 3e0f0388 -> 3defe6f8 3dd9139c 3e1c66c4", + "00000000 3e6f6c64 3e6f6c64 3ecc80a1 3f31912b 3f8c191e 3f0c3b75 -> 3e6f6c64 3e6f6c64 3ecc80a1", + "3f000000 3f805ad0 3f805ad0 3f9971c9 3f0430b5 3f0430b5 3ecef593 -> 3f805952 3f805952 3f9c5db8", + "3f800000 3f784c4e bd97034e 3f70098d 3f232b42 3f17eff9 3f73d86b -> 3f7a59bf bdb5561c 3f7d9559", + "3fc00000 3ea6ae65 3f7955b0 3edec3d4 bdeb074b 3f97d731 bdeb074b -> bda29926 3f835990 bc952fa0", + "bf000000 bda0bc4c 3ec5ba9a bda0bc4c 3f0944e0 3f5c5985 3f8735cf -> bd9a7580 3e99f24c bd00973c", + "3e800000 3e0586e5 bdb8a041 3f4c6cc5 3e3880ba 3f525c37 3f525c37 -> 3de5eaee bdd90092 3f530cc1", + "3f400000 3f50f9c4 be1351d7 3ebd9b10 3d831ee1 3f1053e9 3d831ee1 -> 3f37df4b be237108 3e5f0eb8", + "40000000 be58ec8f 3e869179 3f227e00 be353310 3f7cc6c4 be353310 -> 3ef772e6 3f23fc5a 3be36000", + "00000000 3e0a7a40 be5b5343 3e1e4a61 3f999e3f 3f3f1f79 3f520743 -> 3e0a7a40 be5b5343 3e1e4a61", + "3f000000 3f387e45 3f7b9c99 3f5f0e6e 3f41c1e0 3e8d816d 3f41c1e0 -> 3f45baf5 3f7aa5b0 3f666df2", + "3f800000 3f09ccae bd905fb8 3f09ccae 3ebbe432 3ebbe432 3f232ade -> 3ef1be8e bd4e82da 3f1b47ba", + "3fc00000 3e90562f 3ed18895 3ed18895 3f400000 3f800000 3e800000 -> 3ede126c 3f459a9e 3e696485", + "bf000000 3f4b4ada 3f4b4ada be72a318 3e7f5b82 3e7f5b82 3c3dee11 -> 3f55c858 3f55c858 bec29c87", + "3e800000 3ed43dc0 3ed43dc0 3f28d7ee 3f562d0f 3f562d0f 3f00fb02 -> 3ee927de 3ee927de 3f28f41c", + "3f400000 3e983849 3f865b50 3f9fab94 3e69b324 3e69b324 bdd51275 -> 3e593a70 3f8913a8 3fc37714", + "40000000 3f0c432d be3de1ad be6ed1f1 3e5b0069 bc888e2f 3f0797c3 -> 3e875ec2 3e89a7ae be88e16c", + "00000000 3f31bbba 3f60f780 3ef9f20a 3e8cb2e6 3d48fddd 3d97f7be -> 3f31bbba 3f60f780 3ef9f20a", + "3f000000 3f50ad87 3f50ad87 3dd27d21 3f800000 3e800000 00000000 -> 3f63f712 3f4708c2 3d681f52", + "3f800000 3ecce270 3ee3ccd5 3f6b9a1e 3f212ceb 3f89fff8 3f89c00e -> 3eecbcc2 3f3b0084 3f809e09", + "3fc00000 3f322daf 3f322daf 3f8ee2f1 3f4edeb2 3e7f0727 3f2a7bb0 -> 3f643d88 3f09669a 3f869d04", + "bf000000 bdd38c83 3ef0c424 3ef0c424 3ece4692 3e50b088 3ed93e67 -> bdea375c 3f0b45da 3efa6bc2", + "3e800000 3f34561e bca65d44 bca65d44 3e5a601d 3f323c93 3f323c93 -> 3f2cb1d4 bcb704ec bcb704ec", + "3f400000 3f1b1dc7 3f1b1dc7 bd51b1bf 00000000 00000000 00000000 -> 3eda8a80 3eda8a80 bc317d0d", + "40000000 3e02abf7 3dad3b92 3eda9ba8 3f000000 3e800000 3f400000 -> 3e02abf7 3bea7320 3f2bf04a", + "00000000 3f0f484b 3ed1361b 3ec98efd 3f8808da 3f9758a6 be126b38 -> 3f0f484b 3ed1361b 3ec98efd", + "3f000000 bdc5f8c7 3f096084 3dbb3d2c 3f81e259 3f68b633 3f68b633 -> be1adc6d 3f236a1a 3e006965", + "3f800000 bdb4b8a2 bdb4b8a2 3f978659 3e559fc7 be36eb3e be36eb3e -> bd04381d 3d2c6b70 3fbd5285", + "3fc00000 bdf9ea12 bda2465c bdf9ea12 3f400000 3f400000 3f400000 -> be661c80 be12cfee be661c80", + "bf000000 3f90e7c5 3f81a383 3f81a383 3eb34363 be4f2a8d be018206 -> 3f8e097a 3f80791c 3f809955", + "3e800000 3f1fd05d 3f1fd05d 3ed4e53c 3f554afb 3e47515a 3e56db6b -> 3f29d121 3f16a56f 3ec2d9bc", + "3f400000 3f135c93 be3b60b4 be3b60b4 3da07c3c 3eceeb41 3eea05c0 -> 3ed79efa be1b8108 be2d1af6", + "40000000 3eeb448b 3eedab26 3eedab26 3f6ff682 3b162ce6 3b162ce6 -> 3f64dcca bcfd9ff0 bcfd9ff0", + "00000000 3ed0b20a 3f391aec 3edf5ce8 3efe6222 3efe6222 3dffdbb1 -> 3ed0b20a 3f391aec 3edf5ce8", + "3f000000 be671847 3f90196c 3f90196c 3f34cc04 3e95d2a8 3ca61ae2 -> be90c174 3f93db9c 3f98cb3e", + "3f800000 3d7f2466 3dd0fe96 bdad094f 3f55195c 3f1816a5 3f9bc184 -> 3dcf1a15 3df44fce be5d09ce", + "3fc00000 3f9c045e 3f9c5197 3ec8b24e bdc9a665 3f33f452 3f87c570 -> 3fd95421 3f87433c 3f4afb1c", + "bf000000 3f02d08c 3cfb82e5 3cfb82e5 3f5e9bc5 3f9d6499 3f5e9bc5 -> 3ed65910 3c1344f0 3ca16a5a", + "3e800000 3d81442c be3b0868 3f936bad 3f99ec2b 3f4da76e 3f4da76e -> 3dabce71 be5c94b8 3f90073a", + "3f400000 3f4f0b54 3e56845b 3e56845b 3f000000 00000000 3f000000 -> 3f4f0b54 3daeaac2 3e56845c", + "40000000 3f725f87 3f725f87 bdf87c6f 3ec5f05b 3f3b4e67 3e84526d -> 3f6c855f 3f7e5417 3c25ed48", + "00000000 3ec00542 3f440c3d 3f440c3d 3f1784d9 3da20f95 3e51021f -> 3ec00542 3f440c3d 3f440c3d", + "3f000000 3f48d144 3e65a346 3e9a3988 00000000 3f000000 00000000 -> 3f332c74 3e65a346 3e48ae2a", + "3f800000 3de3e0fe 3f81f4b7 3f32ad54 bb61be27 3e1aeb91 3ef0bd4a -> 3c3faf67 3f835742 3f2f75be", + "3fc00000 3bdec8f6 be25cd8f 3f1c6e37 3f1ce7b2 3f2fa0da 3f2895ff -> 3c14de3a be88aa20 3f395e46", + "bf000000 3f4c0528 3f9caa79 3f3edd9b 3f000000 3f000000 3f400000 -> 3f4c0528 3f9caa7a 3f32b9a0", + "3e800000 3ecc2c7f 3ecc2c7f 3f8e8343 3f8b3212 3f79fc51 3f79fc51 -> 3ef03b0e 3ee96b9b 3f8aa9ba", + "3f400000 3f094515 3f609337 3f45b165 3f3412c3 3f3eebf3 3f7db80d -> 3f1cb1e6 3f6abd1a 3f66dc80", + "40000000 3f7fb2b5 3de41368 3dd49b3c 3f87e1cc 3f4b7d32 3f87e1cc -> 3f803010 3e69915a 3ea026f1", + "00000000 3f81be13 3eccf7f3 3e8dd66b 3f8fedd2 3d081a8c 3f94dd53 -> 3f81be13 3eccf7f3 3e8dd66b", + "3f000000 be3cccbd 3f561ae8 3f561ae8 3d98e627 3f5ac44e 3d98e627 -> bdbb60d4 3f628742 3f4733a0", + "3f800000 3eb4fb57 3f9b8383 3f9b8383 3f8469cb 3f470f70 3f8469cb -> 3f190783 3f88f4ba 3f6f8fc7", + "3fc00000 3f9dac05 3cad42bf 3f9dac05 3f800000 00000000 3f000000 -> 3f4db16f bc224470 3f9dac06", + "bf000000 be3a13cd be75019f 3f4fa246 3f18b257 3f5054f1 3eef683b -> be24dd3e be15baac 3f50e7b9", + "3e800000 3f90971a 3f24d52f 3f24d52f 3f1260a6 3f0deeea bdc7cb72 -> 3f8feae6 3f266e20 3f134b58", + "3f400000 3ee9ed21 bd653572 bd653572 3e800000 3e800000 3e800000 -> 3eba487d bd0a7212 bd0a7212", + "40000000 3f009373 3f4df45c 3f83308a 3f51d5c1 3f863840 3d3010e9 -> 3f5268c9 3f9326f3 3f892a6c", + "00000000 bd74d0a5 3e91de7a bd74d0a5 3f8dcfde 3f8dcfde 3f54f666 -> bd74d0a5 3e91de7a bd74d0a5", + "3f000000 3f8309e2 3e3796f6 3e3796f6 3f8270f1 3f81b40e 3f81b40e -> 3f816c85 3e82774c 3e82774c", + "3f800000 3f316216 3f04aae5 bcde86c2 3f12def8 3dd02f31 3f4a5922 -> 3f396a08 3ea37e66 bd31a538", + "3fc00000 3d965313 be53791c be53791c bdcc8796 bdcc8796 3f5141a9 -> bd48afd0 3e77b036 bee336ed", + "bf000000 bddb56d5 bddb56d5 bdf51101 3f57dc7c 3f94e537 3e94e6bd -> bd87ff76 bce92208 be173b3e", + "3e800000 3f78dfaf 3f94c846 3f94c846 3f3b2689 3ed17c84 3eb2f1c1 -> 3f79ac94 3f95e12d 3f9699a0", + "3f400000 3e525788 3de23fe3 3f905756 bd658a77 3f9b79f0 bd658a77 -> 3d8de1d8 3e5cff0b 3f9fb5f0", + "40000000 3f9529f6 3f8932dc 3de58f0d 3df21727 3f92800a 3f563b07 -> 3fbad42a 3f5f8edc 3e7c17e4", + "00000000 3ec4128d bddd496d 3f885720 3f71fced 3f71fced 3f9a1597 -> 3ec4128d bddd496d 3f885720", + "3f000000 3e5e9848 3f7d3e48 3ed2d5d5 be19c5c3 3f2a7e9e 3f2a7e9e -> 3ddaa939 3f7db22a 3ee76bd6", + "3f800000 3f68a73f 3f68a73f 3eabc549 3ef43194 be0210c2 bd0fec8b -> 3f67acbf 3f4e0bba 3dc66c52", + "3fc00000 3ddde1ea 3e4dc989 3f15a030 3f843518 3f099b0b 3f843518 -> 3e868a10 3e604bf2 3f790434", + "bf000000 3f8421a7 3e796103 3e796103 3f66840d be68ad64 be00221d -> 3f85d6dc 3ec1489d 3eb7a761", + "3e800000 bd932ba2 3f3d6d00 bd932ba2 3e800000 3f800000 3f800000 -> bd7ee782 3f49bdb8 bdba9b64", + "3f400000 3f1c972f bdbf4401 3ea92e01 be599cea 3f8910f5 3d84c709 -> 3eb73436 be392a52 3e3e799c", + "40000000 3e88ee15 3e05d4bc 3e88ee15 3eeb1ce6 3eeb1ce6 3f2d2953 -> 3e711f7a 3de5b172 3ecfb683", + "00000000 3f05e3da 3f84bd94 3f84bd94 3e9297f7 3f135979 be6dc7fd -> 3f05e3da 3f84bd94 3f84bd94", + "3f000000 be65c12e ba9fecc5 3cbaeb35 3f8d68c5 3f3db3fe 3f3db3fe -> bec7f02c bac684ac 3ce6f182", + "3f800000 3ef20d60 3ef20d60 3ce05e9a 3e7aa61b 3efb0181 3e7aa61b -> 3eb0e88d 3eef9006 3c61f408", + "3fc00000 be57aea0 3f30adc0 be4f5ebb 3f48bf25 3f9de947 3f550689 -> bedb23b4 3f949604 bee3eae3", + "bf000000 be0e7da3 3f222038 be0e7da3 bd88781b bd88781b 3a94f846 -> be6a7757 3f43d016 be5f772d", + "3e800000 3e75cbc4 3e149406 3f8e37b7 bdebadf9 bd710f20 3ec9bb29 -> 3e3c594c 3de22bc3 3f8f0e08", + "3f400000 3f2575b6 3d872a73 3e7e8c2d 3f4efd0d 3f4efd0d 3f0642ed -> 3f408b28 3dc1984f 3e82c851", + "40000000 3f9a4005 3eed8e86 3f9a4005 3eefbe77 3eeee10a 3e1da47e -> 3f9e447d 3edc864e 3fc6098f", + "00000000 3f86e1b7 3f9443a7 3f86e1b7 3f896da8 be417dcc 3f896da8 -> 3f86e1b7 3f9443a7 3f86e1b7", + "3f000000 3f160566 3f134245 3e596405 3f019850 be1763ed 3e3d5ecb -> 3f166874 3ed578a0 3e237046", + "3f800000 3d5e5295 bd8a4aa9 3d5e5295 3f800000 3f400000 3f400000 -> 3dd849fa bdd41b46 3da3b9a2", + "3fc00000 bd4c797e 3e2baf26 3f9182fc 3ea5631e 3f85a772 3f85a772 -> bcb4fc26 3eca7c30 3f62065c", + "bf000000 3f260d44 3eca6af7 be2ae2aa 3f800000 3f000000 3f400000 -> 3f08e13c 3eca6af6 bdf211c6", + "3e800000 3f65b31f be71da4a 3ea06b5a 3e724656 3f217c26 3f217c26 -> 3f62977d be82b3ee 3ea79fa7", + "3f400000 3e02c77a 3e02c77a 3eefd9a6 3f50336e 3e9a5ac8 bd033955 -> 3e386314 3dc19ddf 3e8a1b08", + "40000000 3d7bf181 3f2bac07 bc2acdc9 3ea1ebee 3de2e728 bd4ad2e8 -> 3c9c50fe 3ea7445a 3c508c88", + "00000000 3f981792 3e997555 bca932b8 bde80f7a 3f9e5448 3f9e5448 -> 3f981792 3e997555 bca932b8", + "3f000000 be0d37a2 3d9363d8 be73ef7f 3e16254b 3f79af3c 3f28584d -> bda8ddad 3dd4682e be91c4c0", + "3f800000 3e65afa7 3e65afa7 3f2d905b 3ea208c6 3f07e8f9 bd8f0c31 -> 3e244a12 3e70b246 3edbbb5b", + "3fc00000 3e89b0a3 3f7fa6e8 3f4f211b 3e592b82 3e592b82 3d34d1dc -> 3dcaf85a 3f7f5a0e 3f190de0", + "bf000000 3f45db8c be0b383d 3ec1b5ce 00000000 3f800000 3e800000 -> 3f5c5381 bd70956c 3edfd0cc", + "3e800000 be0fdf37 ba4a50d2 3e41b16e 3f000000 3e800000 3f800000 -> be0fdf37 ba3101b9 3e68f4f9", + "3f400000 3f4abfb3 3e2da8f7 be0333a2 3ec55754 be641bb3 3edaf493 -> 3f438047 3c8a88da bde646b0", + "40000000 3ef0fdbb be0d6e03 be0d6e03 3f3a4286 3f3a4286 be68bdbb -> 3f328e1e be8ffa66 3ea36afc", + "00000000 3f59c8fc 3f6de329 3f9506a4 3ef6aa60 3edb4ee5 3ef6aa60 -> 3f59c8fc 3f6de329 3f9506a4", + "3f000000 bde261cf 3eea3e64 3d32198e 3e800000 00000000 3f400000 -> bda387d4 3eaab4ba 3d5cb053", + "3f800000 3e92d928 3e92d928 3f918997 3f8e2f60 3f426ab9 3d1e1e1d -> 3f096543 3ec930e0 3fa3f030", + "3fc00000 3f4b13f5 3ed99375 3f4b13f5 3f800000 3f400000 00000000 -> 3f850675 3f1bb4e7 3f0c1b02", + "bf000000 3e2cbe71 3dab2b00 3e6d69c6 3ed5f454 3ed5f454 3dc5a55d -> 3e388960 3db80cae 3e9b7fbb", + "3e800000 3f8e3024 3edbd5b6 bdebe2a2 bdf0e399 3e572704 3e572704 -> 3f930e1d 3ec9a6f0 bdc5c1c3", + "3f400000 3f14592c 3f8ae07e 3e7b871f 3f6557bf 3f6557bf 3e032d57 -> 3f396435 3f83de8c 3e11adff", + "40000000 3f6f787e 3f11fe39 3f6f787e 3f400000 00000000 3f400000 -> 3f7eeeca 3da42dc8 3f7eeeca", + "00000000 3f9c9cd0 3e1ed24b 3f9c9cd0 3e800000 3f800000 3e800000 -> 3f9c9cd0 3e1ed24b 3f9c9cd0", + "3f000000 be44a951 be44a951 be4fa11c 3f93d3fa 3f67ca59 3f91450d -> beaf1884 be91da7c beb717f5", + "3f800000 3f6b049a 3e254d86 3ef852b4 3e0580bc be4b4323 be4b4323 -> 3f5cc73c bce2c553 3e0b562c", + "3fc00000 3ed1ed7c 3f8394fb 3e926a05 3f37b15b 3f50807f 3f50807f -> 3f11616b 3f801bb6 3ef50a32", + "bf000000 3f1c35f3 be468bd7 3e212559 3f4fda5c bd056745 3f3d5a70 -> 3f09379a bea264dd 3e009a67", + "3e800000 3f0081f2 3f072926 3f072926 3f091d97 3f8ee951 3f8636d5 -> 3f01a5a4 3f1ad3ac 3f18a8cb", + "3f400000 3f4bc609 be41a657 be41a657 3f058af7 3e44f251 3e2a50b4 -> 3f4d1fac bdaec1e6 bd9cca97", + "40000000 3d37504e 3ed2f482 3d37504e 3e997559 3f8d3dec 3ea24ca6 -> 3c2c210c 3f7f2dab 3c5c8238", + "00000000 3f7394c5 3e8bfa52 3f909cb1 3f02f1e8 bdc287b2 3f4a7183 -> 3f7394c5 3e8bfa52 3f909cb1", + "3f000000 3f074c39 3f3407ac 3e915465 3f931184 3f931184 3f0a569a -> 3f30b26b 3f56b396 3e958862", + "3f800000 3e9696d6 3f1766f6 3f8dee4e 3ed9ae0b 3ed9ae0b 3eb00873 -> 3e86ad7c 3f0e2473 3f92c18f", + "3fc00000 3e2bc27b 3eccf281 3eccf281 3c639815 3c639815 3f279044 -> bd12d4a5 3d4da45c 3f02f75a", + "bf000000 3d1767aa 3f92877b 3ebc3f1b 3e800000 3e800000 3e800000 -> 3d3bdb67 3f8d39f2 3eda014a", + "3e800000 3f9d14f2 3f0bb4c1 3f43632e 3f718561 3d85cd93 3f88612c -> 3f952b34 3efbd37f 3f507790", + "3f400000 3f106da7 be07384a 3f28d741 3f950e62 3f950e62 3f154941 -> 3f4f2b6e be8fe634 3f3002b0", + "40000000 3e74091b 3f2c15c7 3e74091b 3f36071e 3f36071e 3ebb3997 -> 3ec879b6 3f5bb43b 3e102993", + "00000000 3ec342b9 3f8d017c 3ec342b9 3f467ea2 3ef1f297 3f467ea2 -> 3ec342b9 3f8d017c 3ec342b9", + "3f000000 be2da621 be2da621 be60445e 3cfa722c 3f22ea15 3f719871 -> bd9c9eae be49591b beacc9c6", + "3f800000 3ee1d22e 3f3895e0 3ee1d22e 3efcce16 3e9c310a 3f92e793 -> 3ee03ee8 3f24827c 3f42a9b6", + "3fc00000 3e4f7aa3 be6cb4d7 3f564677 3f66df91 bd8392a5 3d3063db -> 3ecb766d 3e804c33 3f2666a4", + "bf000000 3dfcf0e4 3f2d1aa8 be631c36 3e3aa215 3f4395cd 3f897a65 -> 3e21b139 3f1e4e4b bd87a57c", + "3e800000 3e09f527 3da16433 3e09f527 3f940f98 3f874a40 3f940f98 -> 3e31279e 3dcacb1b 3e31279e", + "3f400000 3f9de2fe 3c097873 3f6f61fe bdbe2297 3d4f35fb 3f8bfcf1 -> 3fbeab4e 3b364eb2 3f7d383c", + "40000000 3f7f98e2 3ed4ff7c 3f4aeb80 3f5b3b3c 3f7e3f08 3f591d1b -> 3f8015d3 3f652edc 3f82c088", + "00000000 3e9d8e66 3e9d8e66 3f6b0b69 3f29be58 3f29be58 3f8b4ca4 -> 3e9d8e66 3e9d8e66 3f6b0b69", + "3f000000 3f8c4c3c 3f4357fe 3f8c4c3c 3f85f02f 3f644312 3f85f02f -> 3f84eecc 3f557890 3f84eecc", + "3f800000 3f977a04 3e5de71f 3f977a04 3f9a2127 3d29e966 bdafe79d -> 3f60b3d9 3d7a078e 3fb8081a", + "3fc00000 3f9a0174 3f98da94 3f98da94 bdf46259 3f49d813 bd90db62 -> 3fd423fe 3f7e5726 3fcbabd4", + "bf000000 3f7a788c bdf96ee4 bdf96ee4 3e91f32f 3f960a65 3f960a65 -> 3f7ba237 bcf561a8 bcf561a8", + "3e800000 3f9c9603 3e663ed7 3e663ed7 be10c267 be10c267 3ee7de78 -> 3fa7cce0 3e2d02f3 3e620a25", + "3f400000 3f2630e3 3f92c87d 3f26fc20 3f9adfa4 3f9adfa4 3de53d3d -> 3f64475f 3f77b0c2 3f052fae", + "40000000 3f8abd1f 3f7dfe61 3f171421 bc862182 3f99fa9f bc862182 -> 3fa2c7cd 3f81cba4 3db979b8", + "00000000 3f33bb32 3f8917ed 3f33bb32 3f48cc11 3f48cc11 3f2eceb8 -> 3f33bb32 3f8917ed 3f33bb32", + "3f000000 3f838c49 3f87cde6 3ea5d707 3decaa68 3ecfdc6c bc62549f -> 3f84f325 3f889532 3e587572", + "3f800000 3f31f82a bd618d19 3ebc7a8e 3f3ce1d3 3dfe5948 3f9609f9 -> 3f4bc56d bc3ac164 3f2e4afa", + "3fc00000 3f7cc749 3e964f52 3e907ab2 3e802593 3df30411 3df30411 -> 3f7a653c 3d66ad54 3d4eabc4", + "bf000000 3f10bd23 be7d0241 3d7e82ea 3f800000 3f800000 3f000000 -> 3ee29275 bdbe7ee4 3d7e82eb", + "3e800000 3e01701f 3f17f4d3 bdc8f145 bd41f098 3f3f3468 bd41f098 -> 3dc4fbd4 3f1f9487 bd8c8dd2", + "3f400000 3e879a07 3e879a07 3f675a6c 3f9a9406 be639e22 3f3d745a -> 3ef16ab5 3d5cc744 3f6f5fab", + "40000000 bdde0871 3ee3a04d be000f73 00000000 3f400000 3f400000 -> 3e07168d 3f3106e2 be881160", + "00000000 3eedbd51 3f09ae8d 3e15f216 3e800000 3f800000 3f400000 -> 3eedbd51 3f09ae8d 3e15f216", + "3f000000 3f0d9bae 3f95d390 3f0595da 3f96541a be03025c 3d03e2b7 -> 3f3848d6 3fa5de80 3ecf67fa", + "3f800000 bbd72c66 bdd1673c 3e5c9f0e 3f890566 3f1aca09 3cb0d0c1 -> bc6724f2 be00daf2 3d5c04ef", + "3fc00000 3e1d45e6 be4a6cce 3e276e95 3f6496f2 3f2fe862 3f7b0de9 -> 3e9d1860 bea94492 3eb8b2f5", + "bf000000 3f3f00c5 3d88c355 3e191553 3f98daa1 3f24433f 3f24433f -> 3f1d56e3 3d6d5e3f 3e06a3fe", + "3e800000 3f3c65f4 3e9b130a 3f023dc1 3ef1ea03 3ef1ea03 3e464984 -> 3f3bb6c2 3e99965a 3ef0e1a5", + "3f400000 3f70fa4b be7054b7 badbadc9 bd28b146 3e2e18b4 bd28b146 -> 3f657fa2 bdbae84c b9a432ee", + "40000000 3e23b363 3f85546f 3f85546f 3f7b804c 3f832125 3f832125 -> 3ed68c22 3f735de2 3f735de2", + "00000000 3ed2b1fc 3f6abb9b bda80509 3ee965ac bdd75e41 3f83228e -> 3ed2b1fc 3f6abb9b bda80509", + "3f000000 3f9caefe 3f08f73c 3e6923ba 3e800000 3f400000 00000000 -> 3fa5761d 3f18e323 3e0f1c1e", + "3f800000 3e8d602a 3e0fd3ff 3ea51dac 3f85baf9 3ee352ab 3f9e79ee -> 3efce089 3e01fac0 3f252076", + "3fc00000 3d2fec00 bc000e44 3d2fec00 3f66751b 3f551374 3f83d370 -> 3dbd098a bc805c8f 3dddc8c2", + "bf000000 3f4c499b 3f86ad35 3f4c499b 3f47d3ea 3f917b74 bd4bc854 -> 3f40b586 3f8b2602 3f62f94c", + "3e800000 3e7722a6 be7e3492 3f62f50a 3e8308e4 3f54391e 3e6df7f7 -> 3e60412f be993385 3f5f8312", + "3f400000 3e6497b5 3f3aeeb2 3f3aeeb2 3f823fd3 3f823fd3 3e4612ff -> 3eb738f8 3f62163e 3f23bd8e", + "40000000 3df76edb 3f715d9f 3f9938d4 3f000000 3f400000 3f000000 -> 3df76edb 3f7f29d7 3f9938d4", + "00000000 3f62702f 3f9d52ac 3f2e14d1 3f15e425 3c18af6f 3c18af6f -> 3f62702f 3f9d52ac 3f2e14d1", + "3f000000 bc39d426 bdb4057f 3e0b6fb8 3f1d9e9c 3e8f91bb 3f4ce62c -> bc4f92be bd8903f8 3e2f9e2f", + "3f800000 3f82e020 3f00fbeb 3cff59e2 3f2f03a9 3f9e2d98 3f9e6bc2 -> 3f81cbac 3f5f2816 3d9b156a", + "3fc00000 3f9f249e 3f7a0e5e 3f043ef5 3f7392d8 3f0b3774 3e9de93f -> 3f5566f6 3f7ad1bd 3ebf0193", + "bf000000 3f7cb855 3f7e77d2 3ea45cf1 3f61c7a0 3f384caf be28beb4 -> 3f7b7bbb 3f7e2218 3eee8d8d", + "3e800000 3f386ce7 be2a1db7 3ec0bc6f 3e4286c4 3f87704c 3ddeef9b -> 3f306ea8 be617986 3ea93b4b", + "3f400000 3ef6a43e 3ef6a43e 3f859cc8 3e536aad 3d58f020 3d58f020 -> 3ebe5b86 3ea0ecdc 3f898a77", + "40000000 bdae77aa bdae77aa 3d832732 3f87ff20 bde213b5 bde213b5 -> be961c2c 3e0fe57e bda88eda", + "00000000 3f77b438 3f77b438 3f1932d9 be42bdcc 3f316f25 be42bdcc -> 3f77b438 3f77b438 3f1932d9", + "3f000000 3eadc766 3f5cb617 3df19a5b 3ed2edc5 3f2f6ef3 3e132e3e -> 3ea3ac65 3f625938 3da5ae83", + "3f800000 3ed1cf23 3ed1cf23 3d42c509 be7ab5d5 3f754172 3f754172 -> 3d4ab6d7 3f219faa 3db65a65", + "3fc00000 be1989d4 3e7a060a 3ef52093 3e97cc83 3e9beb17 3d05a8a9 -> bd36f4e0 3e0b345b 3e03f687", + "bf000000 3dfcb948 bd197baf 3f479f3d 3cc61161 bd9fa5a7 3e977df3 -> 3e33116e bd758358 3f50986f", + "3e800000 3f6b18d3 3f4a2428 3f24cff6 3f7c0e43 3dbb7c4a 3ec3711d -> 3f6fbf86 3f4174b8 3f21572c", + "3f400000 3f34c37a 3f34c37a 3f464e4e 3f09b7e0 3e3d25fa 3ea067b6 -> 3f37c9e6 3f1ba3aa 3f39ca14", + "40000000 3f97f3ae bc74ac24 3edf26f3 3f970ab7 3e91a825 3f970ab7 -> 3f153868 baf4cf50 3f8d6597", + "00000000 3f533e16 3e33980a bdb6acfa 3e659207 3eae05b6 3eae05b6 -> 3f533e16 3e33980a bdb6acfa", + "3f000000 bdf94fcf 3ea806b9 3f00abdb be572c0d 3f9ac9e2 3e87ed65 -> bccadd2a 3ef817e4 3ee35345", + "3f800000 3f577d1e be0ab68a be0ab68a 3e800000 3e800000 00000000 -> 3f467041 bd6fd86c 3c96529c", + "3fc00000 3f92adf6 3f92adf6 3f1374de be324ac7 3e466bc1 3efcbfe3 -> 3fbdf801 3fa65835 3f12440a", + "bf000000 3e90b6e3 bdbd4890 3f0ff46a be264059 bd57f820 bdc6482c -> 3ed57977 be17c99b 3f358ebf", + "3e800000 3f11025a 3f32d18a 3eebb401 bc94618b 3f9785ae 3e99e049 -> 3f00b8eb 3f45400a 3edf0495", + "3f400000 3e612043 3e967b18 3e967b18 3e99c185 3e19dfa9 3f9178ff -> 3e2c8440 3e3d7b1a 3efbed50", + "40000000 3f82586c 3f42271a 3f42271a 3f820644 ba40b202 3e9c2128 -> 3f7ad5c8 3ec86854 3f1d8e26", + "00000000 3f3ff705 3e97555f 3e97555f 3f2d1ec7 be669942 be669942 -> 3f3ff705 3e97555f 3e97555f", + "3f000000 3f8bb2ab 3f8bb2ab 3f12f508 3f88d68b 3e132f5f 3e4cc042 -> 3f846ed2 3f903f10 3f002ce0", + "3f800000 bd5c670f 3e904533 bd5c670f 3f000000 3f000000 3e800000 -> bd5c670f 3e904533 bcd08afb", + "3fc00000 3f90af64 3f90af64 3f127d2a 3f8feb74 3f8feb74 3e6e9c13 -> 3f5ab748 3f5ab748 3ec09874", + "bf000000 3e8d08c9 3f9886b1 3f8dec4c 3f8228d6 3f4cc763 bd365612 -> 3e306f71 3fa14a9a 3f85845f", + "3e800000 3e8918e5 3e8918e5 3f19aea4 3f4c66d6 3f6b35ff 3f97b6f6 -> 3e9813c4 3e9e1e30 3f2eba63", + "3f400000 3dc383b0 3e3f450f 3f9d0ee4 3f000000 3f000000 3f800000 -> 3dc383b0 3e3f450f 3f825128", + "40000000 3f9e8b6b 3f9e8b6b 3ee3aaca bbada22f 3f2018b7 3f2018b7 -> 3feb036d 3f8b9221 3f118977", + "3f6b920a 3ef5473f 3f841af5 3e213632 3f80470b 3f80470b 3ce502c6 -> 3f35aef2 3f803086 3d2cd53d", + "3f5a0d4e 3f206f3f be5c95b0 3f206f3f 3df31e62 be481037 3e7dc081 -> 3ef31108 3dc20364 3f06b446", + "bcf2b9fa 3e506ccc 3e537b5e 3f8be3aa 3e4f4fbd 3f19cedd 3eb08e63 -> 3e535a1e 3e527abb 3f8bc514", + "3ebbd895 be5e16fe 3f54b0bb 3f54b0bb 3e56fb34 3f65d701 3e56fb34 -> be2491b3 3f5f319e 3f4d082e", + "3eda6671 3f87074b 3f87074b 3e648c78 3f4666d0 3f48a20b 3daa30ea -> 3f8549f9 3f853bdc 3e256774", + "3f87bc14 3f177012 3f92c2d4 3f1aa74f 3f000000 00000000 3f400000 -> 3f177012 3fa9925e 3f3b1da8", + "be84feb0 bd9533f5 3f1fca3d be486a4d 3f400000 3f000000 3e800000 -> bd8069be 3f1fca3d be678a06", + "3f42e794 3f0363a1 be247c10 3f0b5c31 3ee1b819 3ee159e7 3ee159e7 -> 3efb4263 be131567 3f05928e", + "3ea1eecb 3f293914 3f293914 3f97f209 3e9a6d8f bd7073ef 3f52c173 -> 3f220658 3f14f365 3f922211", + "3fa92e96 3caf9a7e 3caf9a7e be09c0dc 3e8e7d90 3f9c1dcf 3e8e7d90 -> 3c15cb1a 3d7b414b bd38a649", + "be9bd981 bd8340f6 bd8340f6 3f19204d 3f1a4f9b 3f1a4f9b 3e34c03d -> bd7507a6 bd7507a6 3f253e89", + "3eebb030 3f8916fb 3f8fc36b 3f8916fb 3f42743e 3e9c4d58 3ef956e8 -> 3f86c35d 3f92eff3 3f8934d4", + "3f90eb69 3f834fd3 bc84b8b2 3ed17b4c 3e6a350f 3e6a350f bdf79cff -> 3f856619 bbc77d15 3d8dd868", + "3d1da189 3f7d70bf 3e3a0b3a 3e3a0b3a 3f4cf78d 3f91c9b3 3f4cf78d -> 3f7d7fc2 3e4187fc 3e3d911d", + "3f45c828 3c55cd85 bd9a34f2 bd9a34f2 3f22ea74 3edab206 3e731b5b -> 3c8122ed bd8789e8 bd2dda5f", + "be4664e1 3f9ae976 3ebe37e2 3f9ae976 3f5ab476 3f586da7 3ea5aed6 -> 3f9f6235 3eae3790 3f98af89", + "3f6c7d80 3f4ab90d 3e3f053b 3f45577f 3b823269 3f89502b 3f3d068d -> 3f240ef2 3eb1ba10 3f5941c6", + "3f2427b5 3f173f32 3f84d23c 3f84d23c 3ed94398 3f79fc7b 3f34dffd -> 3f113df4 3f81c394 3f837efe", + "3f7b8ac6 3e4bfc49 3e4bfc49 bdef9975 3f716dc2 3f82fb7d 3d9df46f -> 3ead1c27 3eb9fc4f bc098b8e", + "be709095 3f20eb38 3f2cbaba 3f96d97f 3f29fb3f 3e74e664 3f5b2f4f -> 3f1c504f 3f339d7e 3f9b5b36", + "3f8c7d7a 3f71f22f 3e653f86 3f71f22f 3f7daf61 3f7daf61 3ec2f70f -> 3f802164 3ed2806a 3f6e7862", + "3b63fce2 3e004855 3ed091ee 3e335728 3f7b675e 3e29f1fc 3e29f1fc -> 3e00a8ad 3ed04863 3e32ff24", + "bd5cb67b 3ed2632a be0bc1db be0bc1db 3e7a6146 3f012f71 3ee1c1df -> 3ed5ccc1 be0bad91 be0cc4b2", + "3ece24df 3f9a3945 3d8a785e 3d8a785e 3eac8961 3f01b242 3eac8961 -> 3f9e5f0a 3d8b28b9 3d730b88", + "3f146065 3e0f991d be3800f7 3f8a23c8 3e6db945 bd811845 3e419023 -> 3dd287b5 bd295345 3f8e15a1", + "3ec19d79 be2f2e9f be2f2e9f 3f0dbabc 3f26f324 3f254f06 3eade7a2 -> be46c9fe be45cb5d 3f060ebc", + "3eb76952 3ef87239 3f75ad4e 3f75ad4e 3dced99c 3bc8f1f6 3e4a43cd -> 3ed3e336 3f722bf0 3f7387b4", + "3fb67cdc 3ecb435d bc2c9d70 bc2c9d70 3f000000 3f800000 00000000 -> 3ecb435c bcd2a6b6 3b982516", + "be9752ed 3d58fbb9 3f51762c 3c09f2dc 3f5742ac 3f3de81f bdb8b4f0 -> 3d2f9485 3f4c04c0 3c39ab48", + "3f0c80b0 3f6370e9 3f747319 3f6be698 be5b0544 be5b0544 3eb9d876 -> 3f4f8ef0 3f6bce8e 3f691d77", + "bd375cdf 3f5137c4 3f482c2f 3f2828e6 3f5fd169 3f5fd169 3f035df6 -> 3f4fefc5 3f46b5b1 3f281781", + "be9192e1 3f5f8f7e 3f8b755d 3f8b755d 3f8adeaf 3f0ead2a 3e872a85 -> 3f56234f 3f8bdd8d 3f89c874", + "3f2c034e 3e1bc936 3e8d4f1a 3e6bb2f9 3f6ca41f 3f0eb1d0 3eb8e23e -> 3e671d5b 3e95336c 3e49d48f", + "3fb4b322 bda1e859 3f75e56f 3f4f452d 3f1a3c7e 3f49cf54 3f64f75e -> bdd4760e 3f7dcbee 3f7b3466", + "3eaf55bd be2240d1 be2240d1 3f8d9d14 bcc9bd25 3e3a6b6c 3ef0b73b -> bdbd6e19 bdf2a4b8 3f8debea", + "bea8a35b 3f1d202e 3f8b474f 3f1c91f6 3f7e1097 3eaefaac 3f7e1097 -> 3f097088 3f89ffcf 3f08d7ea", + "be8b6cc9 3f1b9482 3d40013d 3e2e83a8 3f8c455d 3f06d5a6 3f87fe09 -> 3f07c653 3d3d580a 3e022ad6", + "3e48d233 3f3beebe 3f4f4448 3f4f4448 3f7a0a41 3f8fb392 3f7a0a41 -> 3f4546a4 3f58e72d 3f56a4f4", + "3fabdfb2 3f541cb2 3f541cb2 3f8e2464 3e800000 3f400000 3f400000 -> 3f3bb2b1 3f6c86b1 3f83992c", + "3f9784ae 3e925fdb 3f45d40b 3ecca742 3e9ddcee 3f87ad27 3f87ad27 -> 3e45e212 3f80b635 3f37c263", + "be8c7d6f 3d6a9f01 3ea2fc8d 3ea2fc8d 3f9874c2 3f4ecaa9 3f809fc0 -> 3d16bd06 3e90387b 3e843410", + "bec66c91 3f420f3c 3f261e2d 3f9e562f 3d139830 3f969b97 3d5c41a5 -> 3f52f1e3 3f0787a5 3f915b80", + "3f2a6b27 be47ae7f be47ae7f bd756d06 3f7a3ff4 3ecd1188 3f7a3ff4 -> beafb278 be281418 bdcd685e", + "bece87e6 3eaeb8af 3d9416fc 3f8e5ca3 3eb87f45 3eb87f45 3f0faf36 -> 3ebbb06b 3da39177 3f8f26c2", + "3ec686fb 3f0311e0 3f0311e0 3f9155e0 3efb253f be1346b7 3f77575b -> 3f02997a 3ec6449e 3f8a3837", + "3f19d0c4 3e8e9c18 3e8e9c18 3f86e457 00000000 3e800000 3f400000 -> 3e2194a8 3e5f666c 3f84b5c2", + "bed24078 3daf92bc bbed45a4 3ea3b51f 3f3e7b8d 3f3e7b8d 3d2e4c56 -> 3d8f654c bbbd5d72 3ecd8bf3", + "3e91277a 3f89a975 3eddff53 3eddff53 3d9902f1 3e66d7b6 3efc3214 -> 3f8c2aef 3eca6bed 3edd77b4", + "bda35480 3f3c11dc 3debfd78 3f3c11dc be6173ea 3ed56e90 be6173ea -> 3f41cd60 3deec24e 3f41cd60", + "3ee45b64 3d3b4d5e 3f4dbda5 3d3b4d5e 3f0df775 3f0df775 3f0cdb55 -> 3d44002a 3f4fb4de 3d434f36", + "3ee78edd 3f147776 3f84e280 3f0542dd 3d6f4ead 3f2e9b52 3e83dd15 -> 3ef71d80 3f840cb7 3eee7fac", + "3f86fc43 3f9c4da1 bdff1459 3f9c4da1 bdb130c0 bdb130c0 3ec5724c -> 3fc70ecf 3d4789d8 3fa4a3c6", + "3ec0ed62 3f838711 3f0f2d9e 3f810792 3e1d2c92 3e4937e5 3f833b40 -> 3f847964 3f00beeb 3f809e66", + "3f4c23e5 bc4cdd14 3f0af67d 3f0af67d 3d41ec33 3f0fb25c 3f968d24 -> bb5c7afa 3f112ce7 3f4f797c", + "3ed47be0 3d949f34 3d949f34 3f1645b7 3e40e534 3ef6c516 3e40e534 -> 3d61f098 3d928f36 3f06383c", + "bdb05527 3f8fea7d 3f2752d3 3f90e2b7 3f249254 3f249254 3ef1d7bb -> 3f905b2f 3f25e5d1 3f90cb6a", + "beef6585 3ea06bff 3f7e214d 3ea06bff 3f0975b9 3f97ed53 3f0975b9 -> 3e9c9d81 3f7cf00a 3e9c9d81", + "3faacc8f 3f7bce3d be0a79ba 3f976ab2 3f1aafe5 3c6c5044 3f1aafe5 -> 3f7cf412 3d8279e7 3f8fb5d4", + "3eac184c 3f928ff4 3e3f5451 3f928ff4 3e800000 00000000 3e800000 -> 3f962263 3e0b0905 3f962263", + "bdab3d11 3c9bb48b bc874f89 3f8a5a80 3f40802c bd1458eb 3f40802c -> 3c954502 bc93a4ef 3f8ad334", + "bcfab233 3f986ac3 3ee5168a 3f87fbde 3f800000 3e800000 3f800000 -> 3f994e8b 3ee70664 3f883e51", + "be8f031a 3f0fa6d9 3e8afea3 bdf11d54 3ee49f2c be32279b 3f726340 -> 3f1188f4 3eb11eec bdadd7bd", + "3f1e2641 be76f271 3d42dbe1 be76f271 3f400000 00000000 3f800000 -> beaacf72 3ca06a34 beda25ab", + "3fbab07e 3f00d6cb bdb75416 bdb75416 3efe4927 3d612285 3f7618e2 -> 3f0036c9 3d17eff8 be620e57", + "3fbb1774 3ef7d973 3f8aa777 3f8aa777 3cb26216 3f1a1709 3f1a1709 -> 3e0a2c9f 3f873740 3f873740", + "3eb64313 3f9ce4d2 3f8fbff6 3cdaa792 3f585941 3f5ccdd7 3e0b2d8c -> 3f94311e 3f8b2f47 3ca37d38", + "3f03c0bb 3dba96ff 3f98be02 3dba96ff 3f81d02b 3f43506e 3efa58cd -> 3e0a2bfd 3f90c04c 3db8a996", + "be00bf85 3daeeb90 3f824d80 3daeeb90 3f8c7d07 3edd05b4 bdc301b4 -> 3d96e17e 3f824331 3dc6dd77", + "bed9352b 3f82e543 3f51b9bd 3d861882 3f800000 3f000000 3e800000 -> 3f8426d8 3f51b9be 3da0ad63", + "3fa176b7 bc903c10 be562568 3ea76c07 3eba44b0 3e90e41a 3e96fa80 -> bc3b9b06 bd90c53f 3e5a3a00", + "bda8fa6f 3e7f88c1 3e7f88c1 3f4735e9 3f400000 00000000 3f000000 -> 3e779f7a 3e87ada7 3f4735e9", + "bed2059b 3f5f7ce2 3f2bd12a 3f5f7ce2 3e165027 3e1726cc 3e1726cc -> 3f67b666 3f3c26be 3f67b184", + "3faf3a3c 3e6ab730 3f956a8a 3f956a8a be1ff022 bda5b813 bda5b813 -> bdb4a256 3fbd2d90 3fbd2d90", + "3f696470 3f13a961 3f45483e 3c5780cd 3f24a456 3f24a456 3ee3ecfc -> 3f23f876 3f51177b 3c423d8c", + "3de6b649 3f9e5977 bdb171e6 3e5030bf be795254 3f2d535b be1b8353 -> 3fa4a381 bdb922fb 3e37d48e", + "bb8e4440 3f3c8cce 3f990b50 3f990b50 be7dae79 be7dae79 3f9f2fae -> 3f3cdf60 3f98d98a 3f993cd0", + "beccb733 3f6800e4 bab4ae3f bab4ae3f 3ede85af 3f246521 3f336d00 -> 3f6923fe baa01c77 ba979dc1", + "3f8c3fb0 3ef58217 3e64717c 3ef58217 3f83f24a 3f9bc29f 3efa3e53 -> 3f4513d8 3efda0d3 3ef25c1a", + "3eeb5941 3f7cb99d bca0c320 3f7cb99d 3f48e6e0 3f94d7ee 3eb5a181 -> 3f7d924c bd0252f7 3f7c4b18", + "bea8297a 3df76ff2 be55f077 3df76ff2 3e2a8777 3f839075 3f48cd4f -> 3e138b7b bdf885de 3dcecc8f", + "3eaab1ad 3f9afe04 bdfbec26 3f046df5 3f400000 3f000000 3f800000 -> 3f958b44 bdfbec27 3f19bda0", + "3f5abafc 3f8f9500 3d197b49 3f5e3d71 3ee6d9f8 3ee6d9f8 be79be57 -> 3f910c93 3d0d14f4 3f38fbfb", + "3f75910a 3e9c58df 3f8ae9b7 3e9c58df 3f86d92d be5bd040 be5bd040 -> 3f07d619 3f9b26a9 3c6e2f5d", + "3f161313 3f8f2a0c 3ef39a68 3ef39a68 3e800000 3e800000 3f000000 -> 3f9422bc 3ece2c29 3ef39a68", + "3f611705 be18e149 be66ace0 be5133cf 3f9526a5 3f9526a5 3f60b799 -> beb33681 bf0c544f bebc4ae6", + "3e07845d 3eaf5d97 3f3953b4 3cc879db 3f000000 3f800000 3f400000 -> 3eaf5d98 3f40190e 3cd56abe", + "3e70996a 3f9bd410 3f4c4961 3f8b73a8 3d164aba 3f369e2c 3d164aba -> 3fa3344e 3f506c8b 3f8e2b09", + "bc95fab6 bcd5d0ef 3e898f9f bdf878c2 3f5b6ea4 3f634977 3e2394f7 -> bcd2f26b 3e8821e3 bdfbf163", + "3f97f0f4 3f29f829 3f4ac4f8 3eeb0030 3f53bf6b 3f53bf6b 3f5364d1 -> 3f5654de 3f6b83d6 3f26a9ca", + "3f4391c5 3e2b4f85 be75656e 3ea5546e 3bacef37 3ed56fdb 3bacef37 -> 3d7def28 be4ec201 3e216db0", + "3f7cb190 3ec132cb 3e52af88 3ec57292 bcc6c068 3eb918cf 3df68cf8 -> 3e096313 3e24f005 3e551455", + "be21624b 3f5672d8 3e5e64b0 be23d505 bdbd2a49 3f8c1a10 bdbd2a49 -> 3f5cf299 3e3dc487 be4750f6", + "bec3de5f 3f0fbbe5 3f447143 3f447143 3f2e9b07 3f5f53f0 3ec81c73 -> 3f06f43c 3f376bf1 3f484264", + "3f25e84a 3d18af76 3f828a92 3e7dbbfe 3f74102d 3f67dad9 3f67dad9 -> 3d6f108a 3f812db0 3eb10c21", + "3f655c36 3de454c4 3f5ff940 3e722c2f 3dc5ee9e 3dc5ee9e 3f834230 -> 3d236738 3f4bb8da 3ed02201", + "3fbb8df6 3f52a839 3e5a0944 3f8b4480 3f72d76a 3f765858 3f72d76a -> 3f81dab2 3ee14335 3f764d3c", + "3f53d224 3f63eb13 3f10a1c4 3ded9ed8 3f67f5bf 3e3a8610 3e3a8610 -> 3f74b842 3edf12dd 3d7e4592", + "bec1bbe9 3f3318a6 3f3f83e7 3e55b9cc 3f8b5aff 3f29024d 3f29024d -> 3f1b2060 3f39aac1 3e413950", + "3ebae5ff 3f4328f1 3f4328f1 3e8b567e 3e4f014e 3f434ad9 3f1a0e34 -> 3f39130c 3f4c0f90 3e92dfb4", + "3fb67f7c 3f938618 3f938618 3f2c76e9 3f016654 3f016654 be4a7634 -> 3f932c48 3f932c48 3e71fdfe", + "3fa8af04 3eadef6d 3f91ea17 be0c70c9 3ebaf63a 3ebaf63a 3f23e2fa -> 3e851e8b 3f992c13 be47724e", + "3f0c5c1b 3ea59956 3ea59956 3dc9435a 3f1710f5 3f6e5361 3f6e5361 -> 3eb0ab2f 3eda8b9c 3e0f8390", + "3f806225 3f815afc 3edfa802 3f815afc 3f34055f bdcd6a05 3eb59799 -> 3f80cc0c 3e0ff592 3f81c136", + "3f5cec86 3f6e2281 3f9244df 3f6e2281 3f897298 3ef26be8 3f897298 -> 3f7e97e6 3f933981 3f7e97e6", + "3fb3dbb9 3f43088d 3f43088d 3f930840 3eff8b0f 3f6e9345 3eeeb89b -> 3f42eabc 3f7b69fc 3f951b0e", + "3f9521ce 3f68c448 3f3ba911 3e9cb908 3f000000 3f000000 3f000000 -> 3f68c449 3f3ba910 3e9cb908", + "bc94edd7 3f25d253 3f8a3033 be1aa725 3e28970d bdd905b0 bd5e2947 -> 3f2688a9 3f89f229 be1e3d7a", + "bce76ec2 bd090991 3db22023 bdf10a2d 3f123d99 3f81525d 3f123d99 -> bd08779b 3dad6fa3 bdeff484", + "3f97a81a 3f611888 3e92fc36 3ec01689 3e800000 00000000 3f800000 -> 3f50ff80 3d36a36f 3f272566", + "3ebbf544 3f40e41d 3f441296 3f40e41d 3e124148 bdfe62d0 bcc42e2b -> 3f346bd2 3f2f0978 3f2e993f", + "3e4f911e 3f3a9ea2 3f3a9ea2 3f0d53fc bd673e32 bd673e32 3eecaf8d -> 3f2f35c2 3f2f35c2 3f0c5c23", + "3c161fb2 3f8a2f3c 3f6de343 3f6de343 3f0e0814 3f062987 3eabccea -> 3f8a2c68 3f6de529 3f6dd646", + "bed33329 3f6e4097 3cf3046a 3f83db65 3f851767 3f851767 3f695f04 -> 3f66e59b 3c8a021d 3f8534cb", + "3f72ce8a bd898e57 3f483a42 bd898e57 3d18e7b0 be634002 3d18e7b0 -> bb8b89c0 3f0c7d82 bb8b89c0", + "be17a631 3e91efa8 3e91efa8 3f3fb318 3e6294c2 3f132da0 3f132da0 -> 3e9a8cd4 3e8f9ef7 3f3ea195", + "3e9bf9c9 3e9a871c 3e9a871c 3ec2f37e be2f5275 3ec654a8 3ec654a8 -> 3e5ccfb3 3e931fab 3ebaaaa0", + "3fba04af 3f1b45fd 3f8bde83 3e87a75f 3f93226d 3efd5cc0 3f81ddaf -> 3f874d70 3f8c103a 3f0e64d1", + "be4e479b 3f4b5894 3f0bb670 3efd916d 3f5cddc1 3f4d1e71 3f829703 -> 3f453bbb 3f040294 3ee2bdf8", + "3e4f007e 3eef006b 3eee1aa4 3ee36766 3ddc6b1b 3ddc6b1b 3f14d28c -> 3edac91e 3ed9e5d4 3ee78f86", + "3fbce55c be7a660a 3ef25928 be7a660a 3f400000 00000000 00000000 -> bef02bb4 3dd7f542 3e517cae", + "be0dca35 3efb1731 3f787d18 3f787d18 3f8e377f 3e6ca388 3e6ca388 -> 3ee5700f 3f790818 3f790818", + "3f97c6b1 3e368e9b 3e54a205 bdd666ee 3f749852 bca7b5c3 bbbdd159 -> 3eac4aba 3b95b228 3d0b633c", + "bed16289 3f5b7fc6 3f5b7fc6 be4c59ee 3e127da5 3ee71beb 3f6cbddc -> 3f64a2d2 3f5cbe58 bdee5f5c", + "bef8abbf 3f98cac0 3f910fb0 3e971ec8 3f5ff2ac 3f59101f 3f5ff2ac -> 3fa390ef 3f979874 3e60aebf", + "3f6a2db2 3f87f88d 3e8d3d25 3f865435 3f8b969a 3f586dd7 3f8b969a -> 3f7da557 3ecddfcf 3f7e4e64", + "3d9b152a bde0d046 3e01043f 3f938e36 3e9e5bb9 bdf8206a 3f9a0ad0 -> bdd99b94 3decd150 3f912762", + "3fab7422 3f9ed955 3e4b2ca2 3e4b2ca2 3f5652a1 3f8abb25 3f5652a1 -> 3f7887fe 3ee4f394 3eaf25b0", + "3f311c3e 3f061321 3f8c97b7 3f8c97b7 3f70d990 3da79c0f 3f61562c -> 3f2d060e 3f949872 3f8550dc", + "bd45da93 be608a01 3e312775 3f87e3d8 00000000 3f400000 3f000000 -> be6dc379 3e2d9d9f 3f87e3d8", + "3ee29181 be23339b bde31466 bde31466 3f3c2e14 3f8825e0 3f8825e0 -> be4a9148 be3075b4 be3075b4", + "be7711d1 3f9f3eaf be53677f 3f1b7bde 3f99f8f8 3f3dbae2 3ccb4e6e -> 3fac6e12 be35ba09 3f297b8f", + "bea9e97d 3f874ba2 3ed9994f be35d355 3e4b0b71 3eeee75e 3f980083 -> 3f85c051 3edc5f2e bda83eec", + "3faaed8d 3ea2fc3b 3f403f37 3f403f37 bbdf01c1 3f9bef09 3eaa360a -> 3cc9a5e8 3f8e0ac4 3f2ad27e", + "3f00c499 3d8005f5 3f8a3fd7 3f6ca213 bd801afa 3f2845ac bd801afa -> 3cf066f8 3f887f5a 3f628085", + "3f67f07a 3f2c33aa 3f8769e1 3e241179 bd904845 3ded2369 bd867501 -> 3ee3df2b 3f8cdfb5 3cb6c4a9", + "3f99960d 3e80fd04 3e80fd04 3f3e8887 3f8e2dfb 3e3c0f46 3f8e2dfb -> 3f0735d2 3ddef044 3f82f9c0", + "be7c458c 3f56b7f3 3f8aea99 3f0b36a9 3eae9435 3f17a3e5 3f1977e1 -> 3f596e7c 3f8b7498 3f0819b6", + "3e5a5145 3ec27c77 3d2df8ac 3ec27c77 3e56c985 3f26eaf3 3f26eaf3 -> 3eb38f32 3d38c509 3eca4dee", + "3faa10c4 3f04594b 3f924085 3ee56df3 3f000000 3f000000 00000000 -> 3f04594a 3f924085 3df4c8c0", + "be114b68 3f2c6bcf be64c186 3ebaa205 3f21ccbb 3f051fe7 3ea22acc -> 3f2a4fe0 be632a8a 3ec0cd12", + "3f996282 3f8c4647 3f275298 3f275298 3ea031ef 3d4b658b 3d4b658b -> 3f924e95 3ed1883a 3ed1883a", + "3d943d3a 3e7c0aa6 3f86cff5 be61d448 3ef6186f 3f24d418 3ef6186f -> 3e7b826e 3f86a9b4 be610eae", + "3f361f20 3f15aeac be09b858 3f9f2927 be0ba29c 3f920b71 3f920b71 -> 3ebacb76 be8c1b29 3f77a5ea", + "3f41d81e 3f862872 be623ca6 3ecde74f 3f31a923 3f06e6d1 3f4de613 -> 3f84430c be6d83ac 3f0350a4", + "3f063931 3f594d1e 3f99cb7d 3e092d62 3f6f7e7d bc1c6178 3eb5918f -> 3f684da2 3faa5ae7 3dee2256", + "be4fc120 3f429265 3edc4e3b 3bc19bfe 3f3f33ef 3f89ff7d 3efc3310 -> 3f3de509 3ebedcf6 3bc23065", + "bd0e38e0 3e338936 3f8eaa88 bcc2a6a2 3f400000 3f800000 3f400000 -> 3e30f72d 3f8f3bd6 bcbf30f6", + "bd8ce691 bdc65125 3f54de22 3e584f77 3f96703d 3f96703d 3f0852ce -> bdb21adb 3f5188fd 3e578c0f", + "bee250bd 3ed62187 bdd34a18 3ed62187 3cb5bfdd 3cb5bfdd 3f9059cb -> 3f056062 be1adfb7 3e90ff56", + "3e6a65c6 3f85720a 3e0af55a 3e0af55a 3ec0c105 3e5bc896 be3d8139 -> 3f85c43a 3df6892c 3dca9523", + "be9e7247 3f9583fc 3f88d1c1 3ed474ac 3e4e0e1b be1c4e4c 3f9f9971 -> 3f90de3d 3f8502ec 3e9aff8a", + "3e1faa19 be76fb62 3f48ff3c 3f48ff3c 3f8b617d 3f951497 3e3012e1 -> be97a3da 3f51f2cf 3f44943f", + "bea705ab 3f355c09 3f355c09 bd19dfd5 3f5f128d 3f7f3ed0 3f0e2e01 -> 3f288c1c 3f24362c bd141ad3", + "bdaf4a9f 3f578d39 3f578d39 3e15bcb9 3e6c895f 3f8556e2 3e3b01f1 -> 3f591eb7 3f5464b8 3e1caec8", + "3f909520 be063ae0 3f6d7486 3f6d7486 00000000 00000000 3e800000 -> 3d150ede 3f5a0678 3f63bd7e", + "3fb10b09 bdf7d1b3 3e5c5dc7 3e5c5dc7 3f9ba6d2 3f6665be 3f9ba6d2 -> bec78561 3ecddcfc 3f0cbb16", + "3f3404b0 3e77bc14 3f871a21 3f871a21 3f4a1b37 3d94a20d 3d94a20d -> 3ea21893 3f8b9bb4 3f8b9bb4", + "3ddb9414 3e24c0b9 3f777066 bdbe7269 3eade486 3eade486 3f60d8d2 -> 3e1fffb8 3f77278f bdcf5539", + "bc9eab45 3f969659 be00191c be00191c 3edf7e75 3daa0efb 3da002dd -> 3f96859e be026d0d be027410", + "3fab1f1d 3f084f64 3ee680e4 3f48cac1 bdd8d339 3ea03a2c 3f7dbcc3 -> 3e044719 3ea71eac 3f80d44d", + "3f5a9719 3f97cd76 3f0f985c 3f0f985c 3f7b51f6 3f92a3c0 3f7b51f6 -> 3f809483 3f551c6f 3f437693", + "3fb18d48 3f5593a1 3f5593a1 3f9f7da0 3f74971c 3f74971c 3e88bbf7 -> 3f8125c5 3f8125c5 3fb8d909", + "3fa19925 3ed864fb 3f17b101 3f6bd5b3 3f9a4a06 3f099d34 3f895d93 -> 3f5b752d 3f1d8d65 3f835c21", + "bc8d0510 3f8e83eb 3f8e83eb 3f2a33b4 3f9cf7bf 3f935bbb 3f301cfe -> 3f8eeb60 3f8ee0af 3f29d536", + "3eb018bd 3f8e082c bd6eb359 3f8e082c 3f95c0d8 be5625f5 3ece865b -> 3f86db47 bce6f4e8 3f8f1120", + "be9f187a 3e603def 3e603def 3f9896d4 3e060889 be10813f be737b4c -> 3e843543 3e9302d2 3f8b262e", + "3fa0742b be6266d5 3f1fe686 3f0e3796 3f743cbd 3e8577cd 3f859e11 -> bf0746df 3ef7c57a 3f6468bc", + "3fa34e56 3f05f8f6 3f05f8f6 3f448cd3 3f851c12 3e927160 3eeabde5 -> 3f5df3dd 3ec6358a 3f3fb6e0", + "3dfc40bf 3f151f88 3f151f88 3f2ce752 3e800000 3f400000 3f800000 -> 3f114a00 3f18f511 3f33d0fe", + "3f937edb 3ede4668 be3221a3 bcb020d9 3f0e756c 3f0e756c 3f4dd25e -> 3eeea58f be4d59d3 bd171640", + "3ec3c7c7 3f72e3ff 3f639cc0 3e8923b0 3f2c6960 be2a9cb4 3f5df6ed -> 3f748a72 3f56beb6 3ea55300", + "3f85c4d4 3eedeed9 3f1c2aaa 3eedeed9 3f9e9c72 3eb112f7 3eb112f7 -> 3f595965 3f088b5f 3ec4e59b", + "3f5510bd 3cd4e847 3f915338 3f915338 3f22debf be455216 bd1b79dd -> 3d01f687 3fa80169 3fa2f064", + "3e8fb1b7 3f861a40 bd41b953 bd41b953 3eb2847a 3f2f4b2a 3f3db45b -> 3f86a548 bd56c32c bd5d2c4e", + "3f1856f3 3e081ea5 3f19b0f9 3e6c2f1f be3301ea be3301ea 3f68e8a3 -> 3d2551e8 3ed0b930 3ea26766", + "bcb5f5c9 bd934557 bd934557 3e512eba 3f5e3f9e 3f5e3f9e 3db8b0d7 -> bd90b065 bd90b065 3e543680", + "3dcf6ec3 3f100842 bdab34b8 3f50fb29 3f000000 00000000 00000000 -> 3f100842 bd986a67 3f4d17ec", + "3f1cd596 3f2c16a9 3ec260b7 3f2c16a9 3f6f825f 3ec2446d 3f8eca7d -> 3f4a317c 3eb0904e 3f56a1be", + "3f9ad789 3ec3837a 3ec3837a be342619 3e7795f2 3e7795f2 3f9dc05f -> 3e700630 3e700630 bf0ae2ca", + "3e21d6ae 3f299a2f 3eebc40d 3f7f5f34 3f0d08a4 3e357245 3f88a01a -> 3f2a8600 3edec96a 3f7f7bf8", + "bde5a9cd 3f847aa8 3e0f050a be210cad 3f58177b be57aa03 3f96e5bd -> 3f84d640 3e22a148 be04abdd", + "3ef202ec be7e46e2 3ed4335a 3eb2e702 3f9bd83b 3f2495cb 3f2495cb -> beeacb97 3ee4fcc6 3ec2a07d", + "be8663e1 3f96ffcf be436176 be436176 3eabd3fc 3ef93546 3ef93546 -> 3f94a85f be45003c be45003c", + "3f51e6ab 3f87db8e 3f53ac7f 3f160dc7 be25dca0 3eb5d164 3eb5d164 -> 3f90e939 3f4af73c 3f074c9d", + "3d2bedce 3df5abd6 3f784959 3f1f6a7b bceb3a34 3f3c5579 bceb3a34 -> 3dec1337 3f786f3d 3f1cbf14", + "3f261ee9 3f9d0436 3f45584d 3f45584d 3f84158d 3f4dc176 3f9e7e96 -> 3f8471f0 3f572b2a 3f70aa91", + "be9516ab 3f45dfe4 3f850c3d 3f9fb88b 3f5289bc 3f5289bc be32eefd -> 3f3d704a 3f860872 3f902ac4", + "3e8c3d57 3f7e5ebe 3f0fcb27 3f6c5141 3e85234a 3e85234a 3e8555cf -> 3f7e283d 3f07822c 3f69eeca", + "3e81f572 3f4bf0dd 3f4bf0dd 3f5f5733 3d37fdc8 3f23f76e 3f23f76e -> 3f425c1b 3f4ee616 3f615f70", + "3e427ae2 3edea590 3edea590 3e3f5709 be720d8d be720d8d be0c2e43 -> 3ebb73a2 3ebb73a2 3e19b344", + "3bf8ca10 3d03f31e 3f2e0c6d 3d03f31e 3f8ee3ad 3f52705f 3f8ee3ad -> 3d052511 3f2e522c 3d052511", + "3f39ad6f 3f91171f 3f9baa62 3f749e9a bc5c72a8 3f0e0473 bc5c72a8 -> 3f9f84e5 3f98fe42 3f6c851c", + "3f07da78 3f87e5a8 3e02ee08 3f66b194 3f7940c5 3f7940c5 3f55a236 -> 3f83aea9 3e3c554a 3f6eca40", + "3f9ba76f 3f0a0f22 be4532c2 3f4fa575 3f4caf8c 3ee888d2 3e1352e8 -> 3f3865db be2afc04 3f2dad04", + "3f8579f1 3eee06db 3f81dade 3f20df5a 3f249fd3 be3ce6d2 3f97ff78 -> 3f0a03cf 3f848a93 3f769546", + "3f2e17f9 3f1f077f 3f2ce848 3f24d362 3e18ac49 3e18ac49 3f1d0468 -> 3f024773 3f121f34 3f2de02c", + "beee80c9 3c0d00ac 3f9212d0 3f9212d0 3f779640 3f779640 be15889e -> 3ba0548e 3f9b0cc3 3f85a8d8", + "be2c5522 bd93e862 3dea89ec 3f0fd171 3f7d0872 3f7d0872 3f84ae16 -> bd73ac6e 3dc865da 3f046fae", + "be0b8377 bd314e38 3e07e66c 3f206681 3f949f4e 3f007f14 3f007f14 -> bd0ffb78 3e07d67b 3f205e67", + "3eed672b be0a4652 be0a4652 3ebb0213 3f4c6399 3f393752 3f393752 -> be35b460 be2acdd8 3ed39c6f", + "3edcd44f 3ee178e3 3f64acd4 3ee178e3 3ebd9740 3f7c1339 3f703cd2 -> 3ed35abf 3f6ee139 3f0898aa", + "be054591 be64e2ee 3f40fc00 be64e2ee 3de8ffda 3ef21beb 3f673e63 -> be80853b 3f4151e1 be477cf1", + "3f8addca 3f8816cf 3f6cc731 3f8816cf 00000000 3f000000 3f400000 -> 3f916b65 3f6cc731 3f836c85", + "bee51f16 3f2c5561 3f9a3aa8 3f2c5561 3df90a6c 3dc59218 3ef38a9c -> 3f3f687c 3f8ed0a6 3f2d8f64", + "3f40e7ab 3f8d72cd 3e152d0f 3f05445f 3eab469a 3f982d94 3f8a9120 -> 3f912799 3e8cbea3 3f3d5c57", + "bedf947d 3ec8ed6e 3f3d83ac 3f3d83ac 3f37900d 3edccc9e 3edccc9e -> 3eb1c988 3f40783c 3f40783c", + "beb453c2 3e8a1884 3e09e797 3eb76332 3f143a7f 3d9d21c6 3d9d21c6 -> 3e847b84 3e2d7c05 3eda7b29", + "3f2d804b 3f27ad01 be31946f 3f9e156b baf480e0 3f704334 3e9a73bb -> 3f00525c be96b862 3fa8127b", + "3f88caa5 3f98e043 3ef646b0 be31f191 3e800000 3f400000 3e800000 -> 3fa8c069 3f1d495f bd84ad12", + "3f4b6d01 3f451f36 3f81c7bc 3f49362d 3f5d9716 3f5d9716 bc95d2a7 -> 3f5f768c 3f80bb43 3f25bdae", + "3e1d0fb0 3f37452d 3f37452d 3f9d4f7c 3f5146e8 3f5146e8 3f8b995e -> 3f3c5758 3f3c5758 3f96c8b7", + "3cdb803c 3d97d6b2 3f319b3b 3f319b3b be442d17 3f5dfabe 3ef2983a -> 3d92a0e9 3f32ad24 3f3187b2", + "3fa84a49 3f16b53b 3f16b53b 3d9d687c bd0a3aba be150d98 bd0a3aba -> 3e7ed791 3e35f17b bcba2413", + "3f31f247 3f03f42b be0107b1 3f39b335 bd667d91 bd667d91 3f896043 -> 3ea503f0 bc856385 3f6256f8", + "bda11cbc 3e6c4cce 3f1c567b 3f3e6ab8 be055c78 be055c78 bd83d8f9 -> 3e7e5301 3f225f79 3f42bfa2", + "3e28bae7 bda72b9a 3f477339 3e180c0c 3f000000 3f800000 3f800000 -> bda72b99 3f4eb5b5 3e2d6171", + "3e9299bf 3d061e4d 3f565d84 3d061e4d 3f9785d0 3cad1d65 3f19cdf2 -> 3d38ea46 3f4cce06 3d0d9b4b", + "3fb8555d 3f6650c3 3e93c859 3e134fed 3c487468 3ef5a21d 3ef5a21d -> 3f45da36 3e8da6e2 3e0bf50d", + "3ee768b2 3eb1e27a 3eb1e27a 3eef2835 3f800000 3f000000 00000000 -> 3ee659b0 3eb1e27a 3eb58e24", + "3e27581e bddca7cd bd9f815d bd9f815d 3e8d1a46 3e8d1a46 ba6ea33c -> bdcaba35 bd92e51b bd835b79", + "3f9e8249 3f31e2a1 3f2d38f6 3ed6bc7e 3d8ce940 3f43a61e 3f92d38d -> 3eefd620 3f51e176 3f4f457d", + "3fb05a34 bbadd93c bdd16793 3f88b5e6 3f2d7909 3f35a06f 3f35a06f -> bc01b20f be2b5176 3f83572a", + "3f8ffbe2 be085f7f be085f7f 3e9f719c bd9ea05c 3e9723ac 3e9723ac -> 3d80c645 bd8256ae 3e59b675", + "3f5cb433 3db9ddd2 3ecf82a5 bdc12773 3f20a0e6 3f79df80 be2d6f5b -> 3ddf019c 3f1a67be 3ccb3574", + "3f1d5c88 3e0fa5fe 3f487e21 bc943e74 bd699ed3 bd699ed3 3e4e407a -> 3d6c4dcb 3f2ab8fa bc39af90", + "3f19adb1 3e42e297 be5a21b4 3f5d0a82 3f9f7ca3 3f91e331 3f2cadd7 -> 3ea81b5c bed2aed6 3f635db4", + "3dee600e 3f34ca13 3f3457b8 3f3457b8 3f0ccde0 3f0ccde0 be1bd98e -> 3f356864 3f34f695 3f2c4032", + "bdc11e48 3e22581a 3ebd620b 3e22581a 3f4c61fa bc2f7115 bc2f7115 -> 3e1aa843 3ec8e064 3e2f805e", + "be836e38 3dc1b99a 3f0a8523 3dc1b99a 3f27cd45 3f232551 be61104e -> 3db3b96d 3f060a21 3e01456c", + "3f3d5d59 3f46dc87 3e5f0a34 3f46dc87 3ec1c14f 3ec1c14f 3ea4f7a0 -> 3f3ee0e5 3e3fa99b 3f3b2fbb", + "3f8c35d3 3ef1a276 3f47129b 3f8e50a8 3f8a8765 3eb950ab 3f902b58 -> 3f4a32da 3f39af04 3f70f3c2", + "be6ed32a 3f553d1d 3f8aca5f be7e529d 3f13de1c 3ed9e34f 3f13de1c -> 3f53f306 3f8a625f be72d45a", + "3d68fb73 3f435393 3f629f0f 3f99ef51 3f8aeabb 3f8aeabb be342a7c -> 3f4668a9 3f645a5b 3f9c554c", + "3facaea5 3e83c320 3f22f921 bdb066ee bde31565 3f986fb0 bd83ac4a -> bd6c3360 3f88afe1 3d66a089", + "3f32bc5b 3f2c5120 3f2c5120 3f260423 be60a340 3edd01c6 3f85d535 -> 3ee77814 3f26f0ef 3f5278c2", + "3eb88e9f bbbbf51d 3f3be887 3e1fb1c4 bdb4e24d 3f240bcf 3efd8791 -> bb578f9c 3f40fb59 3e1f39bc", + "bec741c6 3f507e02 3f7a8ab4 3f3af185 3d8e0c9d 3eacd87d bcf45d63 -> 3f5d760c 3f7b3794 3f4fbd5c", + "3f35c321 3f92377d 3f92377d 3f40f49c 3f1334fc 3e02c3ee 3e02c3ee -> 3f8fffee 3f9d37d2 3f27d56f", + "3f83ccbf 3f9ac1d8 3eb41b6d 3eb41b6d bc8418d6 be5a6f94 be5a6f94 -> 3fbd2472 3c89a406 3c89a406", + "bef69187 3f3c62c7 3f423c41 3f0d6573 3f8a5bba 3f357cc4 3f357cc4 -> 3f208bd6 3f38ce09 3f00a87e", + "3e808f22 3eb0ae2a bda3d132 3f071f8f bd055050 3f6e054a 3e831f78 -> 3e91bc1a bdca002c 3efe9e07", + "3b6d28af 3f9ed8f4 3f480241 3e9fd2b0 bbc16bb7 3e1c2383 3e1c2383 -> 3f9efcd6 3f47e616 3e9f8be7", + "3f16e1e6 3e08efbb bd6a5f4b 3d38ef17 3f426e92 be2ee67e 3f426e92 -> 3e2d38f4 bc19c81a 3d6ef306", + "3eea7788 3f95469b 3c044244 3ee69c26 3ec10f8c 3f984c3a 3f984c3a -> 3f9811c2 3c572552 3f1b57b4", + "3f8a34ac 3f6d33b7 3e41f039 3f101caf bc8dcd1f bc8dcd1f 3e9f3540 -> 3f59be99 3c928e93 3eeccc1e", + "bdad5f00 3f27736d be3ab54b bda2c9f1 3f6d35ae bda9d097 3f5986dc -> 3f23447a be507ea0 bd986253", + "3f3a3ab4 3e413144 3f154095 3f2b6042 3f800000 3f800000 3f400000 -> 3e999bc9 3f4286b1 3f3ffb3f", + "be38e67b 3f43dc3a 3f43dc3a be57a9e2 3f8f5564 3ee0f97b 3e051788 -> 3f398fc1 3f44ddfd be7a8d57", + "3fb574c3 3cfa3c82 3eb00102 3f02281f 3f945bc2 3f2a3ba1 3f2a3ba1 -> 3dafe272 3ee6073c 3f20155e", + "3e6e8e39 3f2a671f 3f930a81 3eebdc38 3ea73c4d 3f94da91 3eeb7888 -> 3f25cce8 3f8c48ed 3ee97bd7", + "be46ddc9 3e610b56 3e610b56 3f908528 3f9589b0 3ede7351 3f830f2c -> 3e337808 3e65835e 3f9450d0", + "3f5086ec 3f99cb25 3f10009d be115205 3ec92fbe 3f3dc9cd 3f3dc9cd -> 3f9f32de 3f28c62f be5291f3", + "beb37a6c 3f277114 3f09c494 3f7d4617 3eadd2e7 be02a281 3eec3ecd -> 3f2df5a2 3f25c349 3f7d58c5", + "bd90d035 3dd18a65 3dd18a65 3f0e21be 3d0ff246 bd34c6b9 3ee7b7db -> 3ddde805 3de003e5 3f0e8e49", + "bef7f4ff be436012 3f567032 3f567032 bdddf653 3e9d11a2 bdddf653 -> bea63c10 3f5cf432 3f6af3fc", + "3e0794df 3f4dc239 3f94e5ca 3f4dc239 3f400000 3e800000 3f800000 -> 3f506e97 3f9681c7 3f531af5", + "3fad5c7f 3f665b94 3f665b94 3f952d31 3e255656 3e255656 3d847b8f -> 3f5132d4 3f5132d4 3fb24734", + "3f3cc079 3eec9217 3f618ee4 bd3fc236 3f6184a1 3f11e80c 3f4a1d25 -> 3f1a0764 3f645322 bd8aba54", + "3f94cc2f 3dab91ae 3f3a7e6b 3dab91ae 3f413517 3f413517 3f92119b -> 3e0454ac 3f587ade 3e4af2eb", + "3e4481b3 bc9f8c08 3f015928 bc9f8c08 3f22cdaa be69aad1 bd340a65 -> bca808b4 3edeed4b bc7b2dcf", + "3f9519f0 be318354 3f167577 be318354 3f800000 3f800000 3f800000 -> bed21149 3f5eb6e2 bed21149", + "3f698179 3e13d9c1 bcfb965f 3e13d9c1 3efea95c 3d00e3eb 3efea95c -> 3e133f51 bb6f8ed0 3e133f51", + "3f5d24bb 3e860af1 3e860af1 3d08a591 3f9ca708 3e643730 3e643730 -> 3f00e4d0 3e2d54ca 3c92ce6c", + "beb2257e 3eab6299 3f5f7aff 3f40e583 3e8faca9 be73eb59 be73eb59 -> 3ebccaae 3f6e1055 3f59528a", + "3eacf268 3ec0015c 3e608c3b 3ec0015c 3f4f33d6 3f4f33d6 3f63aaf5 -> 3ed9164a 3e829839 3edf9167", + "3f9b20b6 3f86032b 3ef3ef93 3f86032b 3f8cf6b2 be13f520 3f8cf6b2 -> 3f79ad2b 3db1b18f 3f79ad2b", + "beb53f7a 3f34b586 be756220 3e2e94a4 3f123c74 3f77988d 3f123c74 -> 3f320754 be10c599 3e2746e2", + "be2bb86c 3e8c7213 3db4d802 3e8c7213 bba8b198 3eb5fc44 3f0e13be -> 3e9db694 3dbcd66d 3e8a90e1", + "3daf2e7c 3f985126 3f985126 3f8415fb 3f000000 3f400000 3f400000 -> 3f985126 3f971454 3f83e7d1", + "3f63aa44 3edc085b 3eb076fc 3eb076fc 3f0688ea 3e8ee6e2 3e8ee6e2 -> 3ee1babd 3e83076d 3e83076d", + "3d738526 3f34949d 3f4d05d0 3f4d05d0 3f1af6bf 3d52330c 3f11bfe1 -> 3f353f2f 3f4ad837 3f4d5bfb", + "beaccd17 3f707e3b 3f173f68 3f4419aa 3f445c5c 3f445c5c be5fcca8 -> 3f6dde06 3f0c179e 3f5a5af7", + "be0bdb23 3f9cbc6d 3f16b43c 3f9cbc6d bdcd72cd 3f6b914a bddcb5cb -> 3f96f74c 3f0f96e7 3f96e4f6", + "3eebfcf9 3f5b41ac 3e08c423 3f360fc1 3f800000 3f400000 3f000000 -> 3f69c2ea 3e241343 3f360fc2", + "beb39eac 3f010e7c be4dbd1a 3e94ebac 3e77f937 3e77f937 be444d83 -> 3f0ca24e be7a6fdc 3ec82c73", + "3f5677e3 3e251ef9 3ecc98f0 3e251ef9 3f4160fe 3f9a80c6 3ec8acc3 -> 3e606258 3f2f0ff0 3e0c0bca", + "3f77b6a5 3d78ad33 3ed81797 bdd6b8eb 3f84818d 3f84818d 3f20f61b -> 3df54dd1 3f2cb945 be08eaec", + "3f89421b 3eaaa6ad 3f1b6a64 3f2272fd 3e65dbc4 3f9815c5 3e65dbc4 -> 3e4ed797 3f7589e3 3efebd63", + "3fb15e30 3ebb2f53 3ed6d2c8 3ed6d2c8 3f0b18b2 3f0cb8bf 3f90da98 -> 3ec97336 3ee7feda 3f588d1e", + "3f658c6d 3f4d52be bc6a6793 3f4d52be bcadc4b0 3f9b3e45 3f868984 -> 3f2754ed bd06962f 3f757dbc", + "bea0cb45 3e5f3d14 3e5f3d14 be403e24 bd97d074 3f742ad8 3f742ad8 -> 3e8f186c 3e2d7b82 bdfe5391", + "3ee2fdda bd899f7f 3f810539 3f810539 3f3a9c52 3f3a9c52 be3535ca -> bda77046 3f80cfc5 3f81a346", + "bdde99a2 3f0b68de 3e12738d 3efe56da 3f91f720 3f55ae4d 3f636700 -> 3f02924d 3e0951ee 3ef38918", + "3e5cedc0 3f93eab8 3f1861ac 3f9f789e 00000000 3f000000 3f000000 -> 3f98e1f0 3f1861ac 3f9f789e", + "3f7e1bbe 3f545313 3f55ea57 3f9d7770 3e2bc62c 3f4baf7e 3e2bc62c -> 3f3c6e6b 3f6a8e26 3fb56075", + "3facb774 3f6a2ab9 3f81af9f 3f6a2ab9 3ed7d01e 3e5c267a 3f8ef52b -> 3f65efc3 3f82fffc 3f85b4dc", + "3e68a553 3f875a4b be2a7c65 3f2ef3b5 3f000000 00000000 3f800000 -> 3f875a4b bdfa9ba4 3f3b8932", + "3f641a9b 3e94f77d 3d4e733a 3f216121 00000000 3f800000 3f000000 -> 3ddb6840 3dbe90dd 3f216120", + "3eccc49c be1ffb96 3e8c528e be1ffb96 3dc86f83 3f5f426e 3f0e4ac5 -> bdc8f7c6 3eaaa434 be283e39", + "3f6335e4 3f8ad5ac 3f880afa 3ebe24f8 3dd645c1 3f0d0cb5 3dd645c1 -> 3f931512 3f8744f7 3e548311", + "3d6ea25b 3f32876d 3f32876d 3f8eff9c 3ec3d918 3ec3d918 3f157c4f -> 3f31ca17 3f31ca17 3f8ed5a9", + "bd623800 3e2ab45d 3f94fff0 3e2ab45d 3dcccccd 3dcccccd 3dcccccd -> 3e30fd51 3f93eb72 3e30fd51", + "3e11e25d be615b1e be3b611a be3b611a 3f800000 00000000 3f400000 -> be84436f be1bcca8 be4b2b52", + "3f4eca56 3ed5290e 3ef3dd79 3ed5290e 3f0992d5 3f0992d5 3ea01e46 -> 3edcad56 3efb94bf 3eaf84f6", + "3fa84030 bdb8dc0c bdb8dc0c 3f8e04db 3f079487 3cb3750e bdc64559 -> bdc88c63 3d08e9e8 3fa66c5e", + "3ecfc79e 3f445759 be52a6f0 3e0d4238 be7594e9 be6a5fbe be6a5fbe -> 3f28ddbb bd71962a 3d8a7068", + "bea3f636 3f8a530a 3f8a530a 3cb014de 3e800000 3f000000 3f000000 -> 3f8889b4 3f8a530b 3cb014df", + "3f1b2190 3f6b2790 3e7dc280 3f6b2790 3f400000 3f000000 3f400000 -> 3f70f4cc 3e7dc280 3f70f4cc", + "3fa3d5fd 3f2f4cda be3a1610 be3a1610 3f40061c 3e9a4f9c 3e9a4f9c -> 3f52ade2 bd948fa4 bd948fa4", + "3e24b429 3eb7dfe7 3e867d0d 3e867d0d 00000000 3e800000 3f000000 -> 3ea4ebbe 3e7d0703 3e867d0d", + "3edda9c2 3f55af39 3f5a7ad2 3f5a7ad2 bda4af32 3e793cc7 3f9ffb93 -> 3f43eef7 3f535d78 3f6f454b", + "3f8a5054 3dbce9aa 3f9b7eb0 3f9b7eb0 3f132b61 3f421f32 3f08be27 -> 3dd8aa0b 3f88d9b9 3f990798", + "3f17fda1 3d576f20 3ece80fa 3d576f20 3f70f0d6 3f70f0d6 3f7ff7bc -> 3da12d97 3f07869d 3da84a8a", + "bd9fbdf1 3f842d7c 3f274b19 3f9af0a0 3d825030 3f232cd6 3f347905 -> 3f83e24e 3f260d02 3f9bfb8f", + "3fbb7bc0 3ebd99a6 3c341c0d 3dde54e6 3f0eec24 3f2e7f18 3f0eec24 -> 3ed1fca2 3c89715e 3e00166a", + "3d24618e 3f9930f8 3f707099 3f707099 3f2ee8a4 3f2ee8a4 3f93366f -> 3f98bf74 3f70a79f 3f7133d1", + "3ece2b22 3f82c05a 3e914762 3f4fa02c 3f79fcd4 be3d5187 3ed725a0 -> 3f81ac3e 3e2fc512 3f4d1ac4", + "beee4a6f be32e488 3f0f56fd 3f0f56fd 3ef63489 3ef63489 3f63c6b9 -> be36a282 3f10768e 3ef0e8d5", + "bed870e0 3e9cc277 3f518868 3db2cba5 3f9ab5a1 3f9ab5a1 bcfd20d7 -> 3e372f5a 3f3abec2 3dfc0b1a", + "3cdd79b1 3f56469b 3d1cea00 bcf15cc5 3ea31e4e 3ea773e5 3f8f23a5 -> 3f55eee8 3d1b80c0 bcf9ab48", + "bedfc0bd 3f7df102 3ec798cf 3f7df102 3f000000 3f400000 3e800000 -> 3f7df102 3eacfc4a 3f7e633b", + "3f875866 3f6fe77e 3f92de8a 3f92de8a 3f04f8a6 3e4e91e8 3f9a9fcd -> 3f708611 3fa086b3 3f64e786", + "3d46f2cd bdb8740d bdb8740d 3ca6838b 3f400000 3e800000 3f000000 -> bdbd561c bdb391ff 3ca6838b", + "3ef5c39b 3db78712 be2f2ba7 bd3f3e40 3d89b538 3f0da8fd 3f4d36d9 -> 3d6439b3 be39adca bd793468", + "3f9cab00 3ef0f564 3e74562a 3e778994 3f0aa669 3f9b3c60 be715366 -> 3efdf2e8 3f0e3c15 bdb4f7f0", + "3ec291fb 3ed41d25 be55979b be55979b 00000000 3f400000 3e800000 -> 3ea4e69b be835236 be248acb", + "3f9a1bf9 3f59200e 3f59200e 3dd7f34f 3f307b42 3f307b42 3f8e0883 -> 3f682930 3f682930 3e79c43f", + "3e5bc563 3e60d3f3 3e60d3f3 3f84018e 3ea411a7 3f447337 3f5dd819 -> 3e534dfa 3e74f760 3f835b22", + "3f259d45 3f895e10 3ecd99a8 3f44e14d 3f25c749 3e3961b7 3e8ba3cb -> 3f8772ac 3e9ad2a4 3f3782af", + "bed9b28f 3ee712dd 3e15fd1b 3f9a4e75 3f063595 3f2406ef 3f0610c8 -> 3ee47566 3e06ab03 3f9af209", + "3d30c72f 3f948c88 3f6fe2c9 3f6fe2c9 3f2bb8fc 3f575e9f 3f2bb8fc -> 3f943288 3f7054a9 3f701bc6", + "bd5dd8a5 3d3e92b7 3ed7217b 3d3e92b7 3ee0c650 3ee0c650 3df927c0 -> 3d3fc605 3ed7f470 3d460521", + "3f00ad42 3daadd70 3f968000 3f968000 3e4ac800 3e4ac800 3eb206a5 -> 3d76a586 3f9e87ea 3f9a8cdc", + "3f098c33 3eb6494f 3f860bd1 3f800cf3 3f99c77c 3f99c77c 3ee7d2d7 -> 3f0761b5 3f814618 3f800d9b", + "3f976a53 3e017e1b 3f952352 be49970d 3f1ec7fb 3f008120 3f529a10 -> 3e21abc5 3f9505ee bec0e32e", + "3f65080d bcd35fd0 bcd35fd0 be26ace5 3f568cc5 3f0eb7ac 3ed6cf0c -> bd2b4566 bce9adc9 be0ac6d1", + "bed66ee5 3e706053 3f95e90e 3f95e90e bde0256e 3f38214f 3cabb38f -> 3ea723f2 3f9a9f88 3f8b9d1e", + "3f8815b8 3f712f62 be61b498 bc77d3fa 3f6496eb 3eff52f0 3eff52f0 -> 3f7cd8b5 be60ee9e bc771f29", + "3eb9a287 3f5136d9 3f5136d9 3e977219 3e188c58 3e188c58 be08f8b1 -> 3f477b52 3f477b52 3e4cde05", + "bddb1fcc 3c8fb525 be70a76b 3f13c300 3e4508f7 3f1bae71 3f6ee165 -> 3c990019 be69c6e5 3f0df8a9", + "3ec3f0ad 3ead80e3 3f0c1705 3f0c1705 00000000 3e800000 3e800000 -> 3e819af9 3effe7e4 3effe7e4", + "3c081a2b 3ea36097 3f973a39 3e15b0a2 3f255a6b 3e82a5e5 3f255a6b -> 3ea3a5a0 3f9756cc 3e15fff2", + "3f8d0dd9 3ead1e44 be786d46 3ead1e44 3ec2e146 3f8ab171 3e86704e -> 3e8ef8b4 bf215c56 3e6251ad", + "3e4a9b85 3f597f72 3f12882a 3f12882a 3d9e7954 3f733eeb 3f733eeb -> 3f5406f8 3f1db1b1 3f1db1b1", + "3fab7b96 3f985e90 3b477c78 3f985e90 3f891949 3d6d6981 3d6d6981 -> 3f57f618 ba1044a0 3fbaba4e", + "3f1281b4 3f3ee58e 3eae1ca4 bd989a43 3f4877d1 3f648a73 3f648a73 -> 3f4ea050 3ee1c35e bde24fe4", + "3f09baf7 3ea16e65 3e45313d 3ea16e65 3f400000 00000000 3e800000 -> 3ebf2a3f 3ddf0ff0 3e83b28b", + "3f455f90 3f1f662f 3f54ee64 3f1f662f 3e1097e5 3f0bd6ff 3e9ed00e -> 3efc3e36 3f577c67 3f0dcb36", + "3e58e10e 3ec5717a 3f3fac68 3f3fac68 3f59ab7a 3f84e4b5 3f59ab7a -> 3ed770fa 3f4aa772 3f46d1cb", + "3e66e790 bd6e8def bd6e8def 3e8c072e 3df75e02 be22c07a be22c07a -> bd436171 bd2388bf 3e5b97c1", + "3f1f33f3 3f668c11 3f9d8b76 3f82edc4 3f878a41 be3ef57f be3ef57f -> 3f767b48 3fbc97f8 3f857c96", + "3fa7e868 3f5704ce 3f519cbb 3f519cbb 00000000 00000000 00000000 -> 3f29ddc0 3f1fc9b6 3f1fc9b6", + "3de7c389 3f77a60a 3ef88f0d 3dab9cc3 3ea651ef 3ea651ef bd5958e3 -> 3f77540d 3ef37d1d 3d97ee42", + "3d696293 3f16aa02 3f8de694 bda27ddb 3f97e7b2 3f2fba71 be7ddd0e -> 3f1b840a 3f8d92c3 bd938b28", + "3ebbee02 3f49ef39 3f3f4668 3edd69df 3f9d0f0c 3f9d0f0c 3ec74e9c -> 3f60b212 3f5915d8 3ed332eb", + "be5fee62 3e48335d 3e79a7cc 3e76eb83 be0dca6d 3f02a80d 3f88018b -> 3e752cf1 3e78cc73 3e48d13e", + "bdf0658e 3c0f5911 bd6d5f11 3eecae3a 3f99a4b4 3f8bb20f 3f8bb20f -> 3beff8bf bd4a81c2 3edb02e6", + "3fae09f9 3f9f8f63 3f9447b2 3f9f8f63 3d16e3a6 3f92d612 3ebce013 -> 3fd11c6e 3f55def3 3fad9606", + "3ea5a979 3f239dca 3f681b01 3f681b01 be788f2a 3ea6d830 3f0fed68 -> 3f073cc1 3f65aa0e 3f68fa4c", + "3fa56320 3e5afad3 3f82eb7d 3f607d6b 3f8d3b86 3f168280 3f168280 -> 3ef3b3cf 3f823dc5 3f66c4ba", + "3fbc1bee 3da34f5f bda4dad0 3da34f5f 3f8a49ba 3f51e306 3f9b2be5 -> 3e51d69c be262921 3e6ef876", + "3f0f9bad 3f2e4fce 3f31a836 3f31a836 3f04c8e9 3f04c8e9 3ef0e5ab -> 3f2f7a66 3f32cc12 3f2fdb98", + "3f59d993 3f8c413b 3e5d3f3f 3ef69651 3f12c0e2 3f91bfbe 3f91bfbe -> 3f8a94a4 3ecce366 3f40c418", + "3f15e789 3d725c6e be606914 be5cdccd 3f000000 3e800000 3f000000 -> 3d725c6f be104ee3 be5cdccd", + "beaf7adc bd0d8b4a 3f947130 bd0d8b4a 3dc61373 3f0924f2 3dc61373 -> bd36063f 3f9505ca bd36063f", + "3f367456 3f2408b4 bceb39d7 bceb39d7 bdad1349 bdad1349 3f00189b -> 3ee5df9c bb8674e7 bceb5aff", + "3ed0c9b4 3f9138af 3f885c5c 3ecb3641 3f23ee9e 3dfbbfc4 3dfbbfc4 -> 3f8efc1a 3f8b1997 3ea58573", + "3e1ab6cf 3f96a979 3f708e72 3f30ca9f 3ea2ffdc 3ea2ffdc bd6aeb43 -> 3f982048 3f6fc289 3f279430", + "3f3ac7b4 3f797768 bda2faa7 3f797768 be0fa877 3f3f8db3 3f73ae52 -> 3f73848b bde2b7e5 3f7daa26", + "3f555ba3 3f810b5d 3f97355e 3f810b5d 3f669194 be3d4a1b 3f9bfcea -> 3f805758 3fb68184 3f7f90f4", + "3eaf03a2 3e782d5a 3e55ab98 3e55ab98 3f72cdcf 3f00d850 3f72cdcf -> 3e98e974 3e560d44 3e84c12e", + "3fa6aca6 be1d44ff 3f8b71d5 3e278712 3f455f6b 3f5842c9 3f5842c9 -> be8ea714 3f803ffe 3e92ab49", + "3f3e799b 3f9c560f 3eddd946 3f90e5ba 3f8ac410 3e209033 3e209033 -> 3f7c81f1 3e9da41e 3f9aaa90", + "becd7559 3f9eeaba bd965fcb 3f6a6b8c bd8a8d24 3e9f23c3 3e2b9bc6 -> 3f8d6dfc bdaee1cc 3f6fb127", + "bec9196b 3f8f99a2 3f45ffe0 3f45ffe0 3e800000 3e800000 3f800000 -> 3f8c29c0 3f4ecf30 3f346141", + "3d3674ea 3f0be992 3eef194d 3ecd2c9a 00000000 3f800000 3f800000 -> 3f091611 3ef4c698 3ed2a6b8", + "beead83e be184b1d 3ec468e5 be184b1d 3f22cef6 3ddfae33 3d59edf5 -> be0278d8 3eefcf54 be5fff6e", + "3ed7c2e8 3f1b4bc1 3e807cf8 3e776fd6 3e4b06ec 3e3020cd 3f2075d9 -> 3f0bc2b4 3e4bc3ad 3e85bec1", + "3f4b7280 3f162248 3f7201ec 3f95b4aa be42fccb 3f3a9851 3e3e1b73 -> 3ea40120 3f76d1da 3fa263c4", + "3fb6736e 3e573bbe be7a4399 3f94b7ec 3eae42b0 3e4ba1b6 3f534745 -> 3e09dd8d 3c88c120 3f7cca01", + "3f8b6759 3f33a119 3f0be954 3da64373 be5820d7 be5820d7 3dd5ab41 -> 3ec14359 3e26948a 3c8a6a5a", + "3dd3f1b2 3f204f91 3f204f91 3f5b201c 3edc4d07 3f5c4709 3f5c4709 -> 3f1f7230 3f24c808 3f5d7af1", + "bef3233a 3ecc58fb 3c3fb788 3f81d8e7 3da8a0c8 3ea4ace3 3ea4ace3 -> 3efd0e22 3c5fd0a3 3f8187a2", + "3f73089f 3f92576c 3f92576c 3f8975dd bd2d9c16 bdf4bf20 be5598fc -> 3fa7efc9 3fab01d7 3f972111", + "bb02849a 3eb079dd bdd35be2 bb9cbf02 3f7fbbda 3f98c138 3f98c138 -> 3eb03f06 bdd2b705 bb9c4fa7", + "3f3c238b ba14a1a2 3e3d6174 3f61a717 3effd496 3effd496 be24e876 -> ba148f19 3e3d4e37 3f47a975", + "beecbd79 3f73029a 3f73029a 3f8744c2 3f4dde40 3f920b5e 3f546319 -> 3f6f8aaa 3f6bb37d 3f899c32", + "3e3ab41e 3f3defe2 3d1f10c8 3d99bd2f 3f8970e1 bde999ed be5b26e4 -> 3f48312e 3cf9a940 3d696e0a", + "3c546df1 3eac29d0 3eac29d0 3f252614 3e2af64f 3e2af64f 3d7c9672 -> 3eab2d2b 3eab2d2b 3f247b89", + "bd7c4a23 3f779a03 3f779a03 3f19fb52 3eb9d7e1 3ee623c4 3f867d3c -> 3f77bd1d 3f77a6f3 3f15d1a3", + "bbcf3624 3f20015e 3e883f68 3f1c0438 3f224ce4 3ecdb423 be62d1cb -> 3f1fe757 3e885f35 3f1c9290", + "3fbd2ea8 be1967f4 3e960fe6 bd7e0c38 3f81542e 3f81542e 3f420cac -> bed1c248 3f1b0d28 bde5e882", + "be1f35f6 3f4a7f88 3f52520c 3f52520c 3ebbb8f5 3ed623e5 3f83e1c2 -> 3f4c40cc 3f53464c 3f4c21b4", + "3f8a4154 3b64bb6c 3f9c886b 3f2a32aa 3e2cf9bc 3e2cf9bc 3f536051 -> 3a836c86 3fb57d24 3f52550c", + "3fb6c5d1 3f649fe2 3f80bf3b 3f2f77a9 3f662205 3df27817 bbffbdcf -> 3f803d5e 3f8190da 3ebed636", + "3f951097 3f165bfd 3ae42181 3ae42181 3f35b1c2 bdd7306e bdd7306e -> 3f34abb3 ba39a0b6 ba39a0b6", + "3ec6a9fa 3f011914 bd86c7c8 3f78e4b1 3ed8e61a 3f43cfa2 bcc29a76 -> 3efa9c4e bda44f2b 3f7615c3", + "3f63e4aa 3f9903ad 3f0df685 3f9903ad 3c2012fd 3f58c2b9 3ecbb156 -> 3fb31d28 3f350023 3f9e7415", + "3e797bbb 3f257380 3f8c45e1 3f257380 3eeb5a59 3f325b4f 3ef6492f -> 3f244d1e 3f8afbdc 3f24e8ff", + "3e4e4f12 be728c87 3d6eea6d 3f0f726d 3e3ad8fc 3f7152c7 3f49cbc0 -> be4c2a17 3d8b85e1 3f16c5ce", + "3f875cf1 be10e528 3f21f100 3f5b583e 3e732ee8 3e732ee8 3ed008f6 -> bd543e11 3f00e7ad 3f551f28", + "3eeb7415 3f457971 3f177cc0 3f9f9d86 3e54059b 3f00e067 3f9d81b7 -> 3f394f7f 3f17ae9c 3f85206d", + "3fa5bafb 3d6b1429 3d6b1429 3f29b34d 3e6b6122 bda60885 3f0eebbb -> 3ca024c6 bcc4b050 3f3255ae", + "3f59caa9 3f70edd3 3f05f04e 3f948341 3f2b55c2 3f4df15d 3f508a35 -> 3f7503a8 3f2705af 3f87c5be", + "3f9b4c8c 3ed543b8 3ed543b8 3eb51be2 3f400000 3f400000 3f400000 -> 3f106005 3f106005 3efc1cf0", + "3fb4a2b0 3f08d73a bd4b86f1 3f4362d0 3f74092b 3f47d87f 3f47d87f -> 3f5a536c bdba6065 3f6807d6", + "3dfa6851 3f467403 3ed649eb 3f069d26 3f6cbef1 3f1c3115 3f1c3115 -> 3f4b1654 3ed9a4eb 3f08552f", + "be97aa0b be713e0e be713e0e 3f4a91ad 3e800000 00000000 3f000000 -> be8eb1f7 bea4c4e8 3f4a91ad", + "3e25c290 3f753f40 3f8b0489 3f8b0489 3f17acd1 3f0f047e 3dc65d71 -> 3f758e35 3f8aca5b 3f8c945a", + "3fb801f0 3f72091a 3e848b13 3f35769f 00000000 00000000 3f800000 -> 3f5f0e4c bc8ab894 3f80b549", + "3fb678c5 3d9d026a 3e0dd034 3f95d247 3f94bf39 3f94bf39 3f1c66eb -> 3e5755fd 3eba382a 3f8dbdfd", + "be497cf6 3f30a502 3f30a502 bce30c0f 3f9d43a4 3e6a6315 3f9d43a4 -> 3f20f19b 3f367c8b bca023ca", + "3f91a5b2 3e102d1c 3eaf5087 3f2db4d9 3f5efdce 3f680161 3f680161 -> 3e78c836 3f0cf399 3f615574", + "bea87a4c bd1c72b2 3ce05497 3ce05497 3d2a6f81 be439bc7 3f89bc9c -> bd4d726c 3d21c737 3c8d9c7c", + "3ea7e9e6 3f7ddf44 be77ac6d 3f154094 3e45d454 3f589874 3f589874 -> 3f7d728e be9ebf09 3f236127", + "3d87576e 3df5ceb3 3d2ab63b be2c9e98 3f9ef937 be732547 3f9ef937 -> 3e058289 3d1ac431 be4066c7", + "3fbb72af 3f460d26 3f1af6d9 3ef3a04b bd78fdb3 3f4e3920 3f4e3920 -> 3ef8d572 3f51b2ee 3f32f4a9", + "3e0853c9 3eeb60e1 3eeb60e1 3f6b4a55 be219775 3f5d5a03 3f968e45 -> 3ed51ad0 3ef7b9d4 3f6eb7b0", + "3eee088e 3f8a6e8f 3ebbc381 3ebbc381 3f95820d 3f3e2880 3f3e2880 -> 3f836c8e 3ed69bc4 3ed69bc4", + "3f32ebda 3f55bdf6 3f87f0b0 3f87f0b0 3dcf2e92 3dcf2e92 3f3b7fd2 -> 3f42126c 3f8ca436 3f853358", + "3fae60a7 3e40f01a 3ecf83a5 3ecf83a5 3f3304e3 3f79f299 3f898b96 -> 3e8afb72 3f37d7f4 3f485b08", + "3f33fad5 3f13550c 3f6d4c29 3f089847 bca4277c bd80fdac bca4277c -> 3ecb33fb 3f5f92f6 3eb403e8", + "3f2110af bcdda6a5 3edd0e73 3cd21ebb 3f4305de 3f97f945 3f97f945 -> bd1452d6 3f24d8b9 3d4196e1", + "3fa3a6d4 3ecd17de 3ecd17de 3ee193c0 3f665fff 3ec4aab6 3f665fff -> 3f256745 3ea8a9dc 3f314f1a", + "3f93feec 3f9e76d2 3f576f27 3f4d2fc9 00000000 3f000000 3f800000 -> 3fca120a 3f576f28 3f7c46c1", + "3f1ec582 3f650f5f 3f8e5a52 bdb16433 3f93894c 3f890ce5 bdb99336 -> 3f7892d1 3f830d96 bc90b6c0", + "3f44f998 3dc38808 3dc38808 bdf3773a 3f557daa 3f39bf22 3f39bf22 -> 3e0f35ff 3e00766f be290356", + "3fa1753c 3f22460e 3f22460e 3ef30e5e 3e341f24 3e32aa7a 3f99f6b7 -> 3ee364d4 3ee2f7bc 3f6ab7a3", + "3fb40a52 bc6d8c34 3f199052 3eed5d6e 3f030a61 3ecc9e4a 3ecc9e4a -> bc759984 3f08376c 3ec96bac", + "3f8d4e49 3f65b648 3e770a41 3f65b648 be38631a be38631a 3f72f94f -> 3f424b1e bd09a0da 3f7d1a43", + "3f9a1061 3c902d29 3e0eff0c 3f4ad9bb be01b938 3d32f252 be01b938 -> bc0afece 3bfb62c4 3f0b5119", + "3f9fbd33 3d432bec bd989e62 3cc669d8 3f39c03f 3e97a420 3f22c0b0 -> 3d95e9eb bd0a617e 3d0401b1", + "3e87c95e 3dea24ec 3f92f722 3eaf722f 3f9bcc85 bdaeb05f 3f74b773 -> 3e1c83e2 3f99b9be 3ecb55d9", + "3f42a038 3f8a9992 3e83913d 3e66b027 3ed3da0c 3f754f4e 3eb6bbbe -> 3f8c1ad0 3ec7ae99 3e3fcd47", + "be75d9b3 3f8026cc 3f301248 3ebbdf20 be1fa15e 3cbd2fe9 be1fa15e -> 3f801a90 3f3ca904 3ee15443", + "3ea5f8bd 3f675557 bd01dd69 3f97855c 3f800000 3e800000 3f000000 -> 3f6e8f16 bcd84c31 3f97855c", + "3f9d127e 3f66bc39 3f66bc39 3f146c13 3f3fb36a 3f3fb36a 3ec2a034 -> 3f74a440 3f74a440 3f0212ae", + "3f932f86 3eaf2f2b 3f8c6102 3f8c6102 3b56a0c8 3b56a0c8 3f8767a9 -> 3dae23a8 3f9be33f 3f75ec66", + "3e6628da 3d2a0cb6 be49437a 3f471836 3ec4887c 3ee84ca8 3f91dfb4 -> 3d218a2d be44409c 3f53d1e2", + "3e569c86 3f555fd1 bdb78de7 3ed32219 3f12f4c9 3f12f4c9 3ef23093 -> 3f567a1d bdbdc317 3ed1bb00", + "3f165184 3e9b5938 3d7a64a5 3e811de9 bdd46319 3f3d7865 3f3d7865 -> 3e1d41dc 3d9e5794 3e9c5822", + "befe0181 3e80e439 3f8116c7 bdd768c3 3de1d1f5 3de1d1f5 3df661cc -> 3ea62fbe 3f80aa0e be188c88", + "bdaba8b9 3ef81d67 3f1c9dbf 3f866268 3e25395d 3f06a070 3f890fd9 -> 3eff5fdf 3f1c5a34 3f870699", + "3fa1f1d0 be38e570 3f892eac 3e3bb38c 3f5ddac9 3e94593b 3f5ddac9 -> bec1b260 3f8e6b05 3ea4f4b0", + "3af569eb 3f8ec195 bc53531b 3dc48160 3ea97a78 3ea97a78 3f00e507 -> 3f8ec440 bc53306e 3dc481f8", + "3f1ff119 bca511be 3f9f0ac6 3e7f38db 3ec56c97 3eb0ad60 3ec56c97 -> bc8cff0c 3fa68244 3e63d492", + "be98506c 3f5b1b16 3f2ff513 3e929961 3f79b000 3da76112 3da76112 -> 3f522cdc 3f3da612 3eaca2d6", + "3e3ef012 3e2a17d8 3f608187 3f608187 3dacb8bb 3ec89271 be3df9b0 -> 3e141b3d 3f5f6414 3f5971f1", + "3c900e23 3ec15473 3e4fa345 3dead649 3e416725 3efd59cb 3efd59cb -> 3ec00361 3e4f9b8f 3deacc99", + "3f84e6f3 3f839195 3db13dd5 3f839195 3f8d1720 bdb94b7d 3f8d1720 -> 3f7df648 bc2a3d5c 3f7df648", + "3f5189cf be2b41af 3e6c8626 3f20b7ce 3f3e02d3 3f717637 3f3e02d3 -> be7a85f6 3eb83f41 3f38702c", + "be9f5826 3c3cbfe2 3c3cbfe2 3e8e3b11 3ea35772 3f01fec5 3f1acff5 -> 3c51c42b 3c3bd82e 3e8788c6", + "3eda2b11 3e88f74d 3ea341b4 3f93b92e 3f446d4c 3f82e50e 3be88229 -> 3e9fd1ca 3ed4c892 3f9d48f8", + "beaab4f7 3ea15d27 3e5f754c 3ea15d27 3efe7ce3 3d9c2e57 3d9c2e57 -> 3ea194de 3e8868f4 3ec096c5", + "3ee7a717 be74df08 be74df08 3f9e8b9f 3f85fc36 3ee5219e 3f85fc36 -> bec57f56 be66765e 3f8bd38e", + "3f0ce8bc be1bf316 bca221b0 bca221b0 3f83b492 3f8f5839 3f8f5839 -> be824b38 bd097aca bd097aca", + "3cea163b 3e514010 bddc1bfa bddc1bfa bda88da0 3eb027a5 3f363bfe -> 3e4bb5ac bdd9efce bddf0f87", + "3f49e6f6 3e6d80a4 3f51e7a7 3f9ab7fa 3f096216 3f66d12b 3f6983e7 -> 3e780c86 3f69d947 3f85b8c9", + "3f1224e8 3e8e1182 3ef27475 3f443fc3 3f56362c 3f91f3a6 3f56362c -> 3eb58958 3f27e178 3f55dc72", + "3fb26f6a 3f2db47e 3f2db47e 3f91ee58 bd145e80 bd145e80 3f47387a -> 3eb47253 3eb47253 3f821310", + "3f077278 3f3240ef 3db9b9c8 3f3240ef 3c8ce656 be320719 3f79d2e3 -> 3f1698ba 3d029a99 3f4d8392", + "be33a1da 3f640c83 3f8f739d 3f8f739d 3f399dc0 3f399dc0 3f7f4f81 -> 3f621530 3f90d1a9 3f927917", + "be9b2269 3ea2f9f1 3e24db7f 3ea2f9f1 bdc567e2 3f7f4368 bdc567e2 -> 3ecb20dd 3df660d9 3ecb20dd", + "3df6fd7c 3e992e5b 3ec4eb8f 3f41d493 3f164e04 3ef6f7bc 3e9babf3 -> 3e9b6fe7 3ec4678e 3f3f9b05", + "3f28160a 3f54c061 3f6803e2 3f8535e5 3f0e0cf7 3e89a4db 3e89a4db -> 3f57578c 3f616aa0 3f86db4c", + "3d1c1f74 3f8f0c08 3ee0cd95 3f8f0c08 3f81e559 3d4a6a17 3f59250e -> 3f8e6317 3edc78c2 3f8e99c2", + "bedc4889 3e37e91d 3f57d860 be382ca3 3eac2382 3eac2382 3dbd91ac -> 3e4d2cf6 3f5c9dee be822dce", + "3d524dc4 be2daebe be2daebe 3d86120a 3f6badd6 3f4fbd58 3f19a33f -> be3674ef be342e1e 3d875be5", + "3f540107 3f594308 3f594308 3f59bf04 3e800000 3f000000 3f800000 -> 3f4ba615 3f594308 3f74b11f", + "bd9efb8f 3e99b6fc 3f42ab23 be330d56 3ed644e3 3f523401 be3ac311 -> 3e9b1372 3f4057ea be4956b2", + "3d05c711 3f0933be 3f9fecd5 3f0933be 3eb6e4de 3eb6e4de 3f5ac2f7 -> 3f089bb9 3fa04c13 3f0aad37", + "3f9ccfe7 3f9126dc 3f9126dc 3f9f5324 3f165f7d 3f8556a2 3e7fb44b -> 3f8cfca5 3f6eac08 3fb73c6c", + "3f5087f0 3f40febf 3f6cb80f be02a70b 3f2c6d09 3f2f9a66 3f2c6d09 -> 3f4e6c86 3f721ebb be2c4db8", + "3e72dd70 3f15f596 3f15f596 bd4bae9d 3e55f9b0 bb23a41c 3f0c527a -> 3f0d624a 3f072748 bd509054", + "3f02fd01 3f815cd7 bd3fa575 3edf4962 3e99813f be071c8d be071c8d -> 3f81a511 bc77a3f4 3e8ddc69", + "3f8b5187 3f561054 3f561054 be690866 3f22e191 3c5e587c 3f931107 -> 3f6076f6 3f30eeb5 bf1f49ac", + "bef58dcf 3f2d7188 3f0a6cf1 3f0a6cf1 3f6b76ab bd405cfd bd9c86dd -> 3f16ec06 3f2bc7b3 3f2d93b1", + "be2cf47a be5cea44 3f8a2dd4 3f333689 3f5a8bfc 3f82e028 3f5a8bfc -> be3cd362 3f8c1e4e 3f2cca57", + "3c7f4dd4 bd8312c6 bd8312c6 3f9120ad be304bc0 3f4a8631 3f898499 -> bd8026e2 bd8456af 3f90c7b1", + "3d3e6765 3f4ac4f7 3f953fc6 3ea93685 be53eaa9 be53eaa9 3f4b4f6d -> 3f47ff8e 3f96e0a9 3eac4fbb", + "3f9c7094 3eac1ff4 3d0a17b2 be4246db 3e05adbb be45224c 3f64222f -> 3e09e0a4 bcaf917e becfa237", + "3c1aec87 3f4187df 3f8a4cda 3f81567f 3f000000 3f400000 3f800000 -> 3f4187df 3f8a3f62 3f815339", + "3ec397fb bc6e757f 3eaf8dc9 3f6f532d be4c232d bd0c1355 3f90dc31 -> bbda605e 3e807849 3f76d95a", + "3f8727bd 3eeca4d4 3cc27dc9 3eeca4d4 3f1c2052 3c21185f 3f5937e6 -> 3f051617 b983729c 3f2527ce", + "be8d5703 3f2b00ba 3f12acfe 3f2b00ba 3f602ea2 3f602ea2 bd8bc702 -> 3f1f39ba 3f05aebf 3f3cd0cf", + "3f2b436c 3f84c9a9 3f49d4f8 3f84c9a9 3f800000 3f400000 3e800000 -> 3f817707 3f581dfe 3f8672fa", + "3fbb93fe 3e5b89e0 3f8588bc 3f78a455 bddd1556 3ee27505 3e9ac0cb -> bdaf8e99 3f8682af 3f747ff8", + "3f0bf450 3f7f6b46 3e8df7c1 3f5d671e 3f365a3e 3f365a3e 3f2c0cc8 -> 3f7f8db9 3ea5c94e 3f630841", + "3e0c2fa2 bd37b1dc 3e966b4a 3e966b4a 3f000000 3e800000 3e800000 -> bd37b1dc 3e8f25d5 3e8f25d5", + "3e4e55c5 3cae3f01 3f7344a7 3e206d4e 3f651402 3f02918c 3eea63ac -> 3cc961d4 3f73512d 3e1e202b", + "3ca8d54c 3eeb4b22 3eeb4b22 3f73e25d 3f83ee65 3f933c87 3e8bed5f -> 3eee1343 3eeeb3b5 3f73c6c0", + "3e86d23b 3f048c90 3f9f2f3a be727ee2 bddeb22b bddeb22b 3e2a3ab5 -> 3ee01d53 3fab9e17 be3dc703", + "3e49a2a5 3f375354 3f99c4c8 3f66fcad be4406c8 bdf1d6bf be4406c8 -> 3f292777 3fa14dcc 3f60d76c", + "bde00d55 3f3aa174 3f8bea37 3e9c8652 3efc22a0 3ed5dd8d 3ed5dd8d -> 3f3ab6d5 3f8bae2e 3e9e7b40", + "be355686 3f69c96b 3f69c96b be05d76e 3f3778e9 3f9461ae 3f3778e9 -> 3f683add 3f650ce7 bdf47450", + "3e78d1f6 3f9c973c 39d52993 3f9c973c 3f477768 3f477768 3f76faf3 -> 3f97d872 39f211ea 3f94b0cf", + "3f65b779 3f0277aa bdd6d172 3e7b3e8a 3f42b93b 3f36f772 3e5f4803 -> 3f206493 be1923a1 3e1b4e1c", + "3f9e3c46 3f6247bd 3f6247bd 3e4d6181 3f882ff7 3e92c596 3e922038 -> 3f837468 3f546c94 3dec884c", + "3db14788 3da13998 bd34185a 3da13998 3f991548 3f1bf1ad 3f1bf1ad -> 3db31f14 bd37a5ec 3da4082a", + "3fb4131c 3f80dae4 bdaefc29 3e9d0327 3ea444f7 3ea444f7 3f950f03 -> 3f8149f7 bd1e79f5 3f344732", + "3e1ed8dd 3f17c946 3ecd309a 3f17c946 3f800000 3e800000 3e800000 -> 3f215f10 3ec3a72b 3f12fe62", + "befecdb7 bdc5514d 3f1f8999 bdc5514d 3f000000 3f800000 3f000000 -> bdc5514d 3f019ede bdc5514d", + "3f81f8b2 3f4b3cab 3ee2dc29 3f33254e 3e800000 3f400000 3f000000 -> 3f35f864 3f11807a 3f33254e", + "3e061f9c 3f22580d 3f9e743f 3e8ab5c3 bd0a00bd 3dc67cd7 3f113086 -> 3f1a0a5f 3fa26f54 3e8c7d27", + "3f4e9398 3f905a42 bd645f3f 3f905a42 bd124583 bd124583 3f383cd9 -> 3fa04bf7 bb9f5add 3f89d07a", + "3f86df23 3ec1233d 3f13fe51 3f14cea4 3e7b4ba9 be38ea33 3f498ace -> 3e809a81 3e69c47f 3f3a874d", + "3f1b4d19 be0b1981 3f37ddad 3f49d0ac 3f226b61 3f226b61 3f91edd9 -> be24df7e 3f40513e 3f6afcf4", + "bbb6c310 3f572141 3dc9f64c 3f133e43 3f800000 3e800000 3f400000 -> 3f56f037 3dca7843 3f13119b", + "3f8b93bf 3f727be6 3f8a9d03 3e368344 3f000000 3f800000 3e800000 -> 3f727be6 3f7c2931 3dc97a41", + "3fb6f670 3f9df5b5 3f4a32f3 3f4a32f3 be11a6a6 3f47c03f 3f1bb382 -> 3fe1d771 3f6c3f64 3f575824", + "3f81a01f bc8cedef bd8cb8bb 3f583486 3ede139a 3f99f33c 3ede139a -> bc73623f be31634c 3f53b1ec", + "3fbc6e3a 3e84587f 3defd54f 3f5b41cd 3f7c9e67 3f13bd65 3e2d3c94 -> 3f087f95 3e0ff3e0 3f3c9af2", + "3f3d7117 bdc77db8 3f58d07a 3ef85137 be268333 3e36e02a 3f728a4b -> 3bf33584 3f4906fe 3f26802e", + "3f879a8c 3f2956d6 3d943010 3d943010 3e41a647 3ede521b 3e41a647 -> 3f039428 3d81074f 3ce68cb1", + "be3a2703 bd88bf3a bd88bf3a 3f3873a2 be25e0df be25e0df 3cd93138 -> bdabdb90 bdabdb90 3f415387", + "be91572a 3f8a1113 3f8a1113 3f0a3102 3f0a40a1 3f9cfa10 3f9cfa10 -> 3f8a5047 3f8e8b6c 3edfee62", + "3c73fa03 3f5a0b7f 3ebc7530 3ebc7530 3ead6041 3f396100 3f0e6437 -> 3f59e3b9 3ebd40b3 3ebca83b", + "3f992ad5 3f921501 ba12dea8 3e3e4b72 3f92fa86 be57353a 3f83eb4b -> 3f642174 39cdc712 3ec1854d", + "3f014fe3 bce9f33c bce9f33c 3c0ba093 3e99582a 3f2aeb06 3f2aeb06 -> bcb9358e bd095a43 3c2312f0", + "be001bb0 3f64377f 3e273fb1 3e76c599 3f400000 3f800000 3f000000 -> 3f62aadf 3e15be14 3e76c599", + "3f7d0f45 3ee7a031 3f98091d 3ee7a031 3f5316db 3ec3db74 3f5316db -> 3f1c8210 3f9eaa68 3f1c8210", + "3fbedb7d 3f4ecbcd 3e074bd0 be2d6d50 3f3a3f00 be6ef06f 3f37c2f2 -> 3f69c3c2 bdf2fc51 be989446" + ] + }, + { + "function": "cycles_mix_linear", + "node": "ShaderNodeMix RGBA LINEAR_LIGHT", + "cases": [ + "00000000 00000000 00000000 00000000 3d3d6c50 3eb8e80c 3f8ee6b9 -> 00000000 00000000 00000000", + "3f000000 00000000 00000000 3e800000 3f5e2b48 3f0aa1ed 3f0aa1ed -> 3ebc5690 3d2a1ed0 3e9543da", + "3f800000 00000000 00000000 3f000000 3f8602d7 3e992fb8 3e992fb8 -> 3f8c05ae becda090 3dc97dc0", + "3fc00000 00000000 00000000 3f400000 3eacefb9 be686e10 be686e10 -> bef930d5 c00b94a3 bfb72946", + "bf000000 00000000 00000000 3f800000 be3e6bd4 3f0940a7 3f6af083 -> 3f2f9af5 bd140a70 3f150f7d", + "3e800000 00000000 3e800000 00000000 3f9b374a 3f51e71f 3ddc460b -> 3eb66e94 3ed1e71f be48ee7d", + "3f400000 00000000 3e800000 3e800000 3e87c9aa 3e9ab254 3f924566 -> beb45181 bd3fa410 3f9b6819", + "40000000 00000000 3e800000 3f000000 be2d3e9c be63ac2f be6bc61f -> c02b4fa7 c028eb0c c01af188", + "00000000 00000000 3e800000 3f400000 bd5f4958 3f331d63 3f331d63 -> 00000000 3e800000 3f400000", + "3f000000 00000000 3e800000 3f800000 be7574a1 be3f7f90 be7574a1 -> bf3d5d28 bedfbfc8 3e8545b0", + "3f800000 00000000 3f000000 00000000 3f05169a 3f374ddb be7fd506 -> 3d22d340 3f6e9bb6 bfbff542", + "3fc00000 00000000 3f000000 3e800000 3d41ded7 bd535351 bd91ef60 -> bfadd31c bf93cfd0 bfbb5ce2", + "bf000000 00000000 3f000000 3f000000 3f9619e9 3f2b7b3f 3f282b34 -> bf2c33d2 3ea90982 3eafa998", + "3e800000 00000000 3f000000 3f400000 3e8fd757 3f565707 3f565707 -> bde05152 3f2b2b84 3f6b2b84", + "3f400000 00000000 3f000000 3f800000 3f359dbf bc94ab45 bc94ab45 -> 3ea0d93d be8df00e 3e641fe4", + "40000000 00000000 3f400000 00000000 be701808 3e3ce3f7 3e3ce3f7 -> c03c0602 bf031c08 bfa18e04", + "00000000 00000000 3f400000 3e800000 3f9f49b9 3f0b4deb 3eb447f2 -> 00000000 3f400000 3e800000", + "3f000000 00000000 3f400000 3f000000 3f800000 3f000000 3f400000 -> 3f000000 3f400000 3f400000", + "3f800000 00000000 3f400000 3f400000 3e966ea4 3f3bc617 3f3bc617 -> bed322b8 3f9bc617 3f9bc617", + "3fc00000 00000000 3f400000 3f800000 3f1d5dd7 3f3bc4de 3f3bc4de -> 3eb0330a 3fb9a74d 3fd9a74d", + "bf000000 00000000 3f800000 00000000 3e2f941d 3e2f941d 3f702af7 -> 3ea835f2 3faa0d7c bee055ee", + "3e800000 00000000 3f800000 3e800000 3ed07abf 3f04abed 3f042bb5 -> bd3e1504 3f812afb 3e842bb5", + "3f400000 00000000 3f800000 3f000000 3f340540 3f9d39f3 3f9e17f2 -> 3e9c0fc0 4005eb76 3fcd23eb", + "40000000 00000000 3f800000 3f400000 3ecb45cf 3ecb45cf bdd88fae -> bed2e8c4 3f168b9e bfd623ec", + "00000000 00000000 3f800000 3f800000 3f180fc8 be4f2fed 3f8bac63 -> 00000000 3f800000 3f800000", + "3f000000 3e800000 00000000 00000000 3dca4553 3ea2b9a5 3ea7abb2 -> be1add56 be3a8cb6 be30a89c", + "3f800000 3e800000 00000000 3e800000 be009101 3f8a7389 3f9cbfdc -> bf802440 3f94e712 3fd97fb8", + "3fc00000 3e800000 00000000 3f000000 3f6c565c 3d672866 3eb76095 -> 3fc2818a bfaa5436 3d9886fc", + "bf000000 3e800000 00000000 3f400000 3e2dc37b 3f8196aa 3f4bf07b -> 3f148f21 bf032d54 3ee81f0a", + "3e800000 3e800000 00000000 3f800000 3c3c9cd4 3c3c9cd4 bca478ce -> 3bbc9ce0 be7a1b19 3f3d6e1d", + "3f400000 3e800000 3e800000 00000000 be430e6b 3f23e22b 3f5b2a21 -> bf492568 3eeba681 3f08bf32", + "40000000 3e800000 3e800000 3e800000 3dd59c84 3dd31791 be4b1f91 -> bfaa98df bfab3a1c c022c7e4", + "00000000 3e800000 3e800000 3f000000 3ea4ce27 3ea4ce27 3ed2d17a -> 3e800000 3e800000 3f000000", + "3f000000 3e800000 3e800000 3f400000 3e2eea44 3f4bf4d8 3ee6f421 -> bda22b78 3f0bf4d8 3f337a10", + "3f800000 3e800000 3e800000 3f800000 3ec08594 3e452b21 3ef4dbe7 -> 3b059400 bebad4e0 3f74dbe7", + "3fc00000 3e800000 3f000000 00000000 3f000000 3f800000 3f800000 -> 3e800000 40000000 3fc00000", + "bf000000 3e800000 3f000000 3e800000 3f400000 3e800000 3f000000 -> 00000000 3f400000 3e800000", + "3e800000 3e800000 3f000000 3f000000 3e1bc677 3f9e583f 3e1bc677 -> 3d9bc678 3f5e583f 3ea6f19e", + "3f400000 3e800000 3f000000 3f400000 3de1fb73 3e8df90d 3f317275 -> beab41b4 3e29eb28 3f8515d8", + "40000000 3e800000 3f000000 3f800000 3d87dfff 3f9022b9 3f9022b9 -> bfbe0800 40404572 40604572", + "00000000 3e800000 3f400000 00000000 bde8f74e bde8f74e 3f55cd11 -> 3e800000 3f400000 00000000", + "3f000000 3e800000 3f400000 3e800000 3f905600 3f905600 be5a90c4 -> 3f60ac00 3fb05600 beed4862", + "3f800000 3e800000 3f400000 3f000000 3f5f1136 3f024191 3f024191 -> 3f7e226c 3f448322 3f048322", + "3fc00000 3e800000 3f400000 3f400000 3e930f55 3e930f55 be6d7ecb -> bec6d200 3de4b800 bfb90f8c", + "bf000000 3e800000 3f400000 3f800000 3f000000 3f400000 3f000000 -> 3e800000 3f000000 3f800000", + "3e800000 3e800000 3f800000 00000000 3f000000 3f000000 3e800000 -> 3e800000 3f800000 be000000", + "3f400000 3e800000 3f800000 3e800000 3f8971ba 3f36b588 3f738ab0 -> 3f8e2a97 3fa90826 3f6d5008", + "40000000 3e800000 3f800000 3f000000 3f422910 3f422910 3e2fa4da -> 3fa45220 40022910 bf505b26", + "00000000 3e800000 3f800000 3f400000 3ed8b777 3eb480a2 3f11b817 -> 3e800000 3f800000 3f400000", + "3f000000 3e800000 3f800000 3f800000 3f519c1f 3f519c1f 3e90a3f5 -> 3f119c1f 3fa8ce10 3f4851fa", + "3f800000 3f000000 00000000 00000000 be6d3174 3f39960e 3f39960e -> bf7698ba 3ee65838 3ee65838", + "3fc00000 3f000000 00000000 3e800000 3ea4d18b bd7f8ecc 3f85f093 -> bd0c5b00 bfd7f564 3ff1d1b9", + "bf000000 3f000000 00000000 3f000000 3f8febc1 3f3affb2 3f0537c9 -> bdfebc10 be6bfec8 3ef5906e", + "3e800000 3f000000 00000000 3f400000 bd28d89e 3f9aff1f bd28d89e -> 3e6ae4ec 3eb5fe3e 3ef57276", + "3f400000 3f000000 00000000 3f800000 3f914546 3f10fff1 3f10fff1 -> 3fb9e7e9 3dcbff4c 3f8cbff5", + "40000000 3f000000 3e800000 00000000 3f82a8d3 3f7c5bb2 3f4d27e1 -> 402551a6 400c5bb2 3f9a4fc2", + "00000000 3f000000 3e800000 3e800000 3e43e642 3d982eb1 bcbcda54 -> 3f000000 3e800000 3e800000", + "3f000000 3f000000 3e800000 3f000000 3ea1822e 3e2290f6 3f8eaad3 -> 3ea1822e bdbade14 3f8eaad3", + "3f800000 3f000000 3e800000 3f400000 3f20f078 3f9c7e23 bca652e0 -> 3f41e0f0 3fd8fc46 be94ca5c", + "3fc00000 3f000000 3e800000 3f800000 3de23847 3f065876 3efb023c -> bf2b2ae4 3ea612c4 3f78835a", + "bf000000 3f000000 3f000000 00000000 3e6bf260 3ead84de 3eb44b57 -> 3f450368 3f293d91 3e176952", + "3e800000 3f000000 3f000000 3e800000 3f370d27 3f1572ff 3f370d27 -> 3f1b8694 3f0ab980 3eb70d27", + "3f400000 3f000000 3f000000 3f000000 bd8d179e 3ed97bed bd8d179e -> beb4e8dc 3ec639e4 beb4e8dc", + "40000000 3f000000 3f000000 3f400000 3f4d1522 3f8dfdcd 3f049d27 -> 3fda2a44 403bfb9a 3f52749c", + "00000000 3f000000 3f000000 3f800000 3f5f5c45 3f913ff9 be426eb3 -> 3f000000 3f000000 3f800000", + "3f000000 3f000000 3f400000 00000000 3f028885 3ec1ffa4 be78d1fc -> 3f028885 3f20ffd2 bf3e347f", + "3f800000 3f000000 3f400000 3e800000 3f4e9e88 3f4e9e88 3e978039 -> 3f8e9e88 3fae9e88 be21ff1c", + "3fc00000 3f000000 3f400000 3f000000 3f8fbac0 3f851819 3f9dad2f -> 40179820 4017a426 402c83c6", + "bf000000 3f000000 3f400000 3f400000 3f97ad35 3f1feccc bd45aca1 -> be3d69a8 3f201334 3fa62d65", + "3e800000 3f000000 3f400000 3f800000 3d57729c 3edc31d2 3d57729c -> 3e8d772a 3f370c74 3f46bb95", + "3f400000 3f000000 3f800000 00000000 3f09aff5 3f1e019a 3d13698a -> 3f0e87f0 3f968134 bf322e1b", + "40000000 3f000000 3f800000 3e800000 3e1c3cfe 3ecd118c 3f958963 -> bf63c302 3f1a2318 403b12c6", + "00000000 3f000000 3f800000 3f000000 3f3e954f 3f9e74ed 3f3e954f -> 3f000000 3f800000 3f000000", + "3f000000 3f000000 3f800000 3f400000 3e800000 3f800000 3e800000 -> 3e800000 3fc00000 3f000000", + "3f800000 3f000000 3f800000 3f800000 3f43fa24 3f8bade4 3f43fa24 -> 3f83fa24 400bade4 3fc3fa24", + "3fc00000 3f400000 00000000 00000000 be232d4c 3ea11b82 be7b23a5 -> bf9d30fc bf0e56bd c00f16af", + "bf000000 3f400000 00000000 3e800000 3e800000 3f800000 3f800000 -> 3f800000 bf000000 be800000", + "3e800000 3f400000 00000000 3f000000 3f80d50f bd861b7e 3f80d50f -> 3f806a88 be90c370 3f40d50f", + "3f400000 3f400000 00000000 3f400000 3eb20c97 3e6cda04 3e23f11d -> 3f058971 bece5c7d 3e75e9a8", + "40000000 3f400000 00000000 3f800000 3f070b0b 3f98d500 bdf57e90 -> 3f5c2c2c 4031aa00 bfbd5fa4", + "00000000 3f400000 3e800000 00000000 3f39508a 3f636b03 3eb5ddb3 -> 3f400000 3e800000 00000000", + "3f000000 3f400000 3e800000 3e800000 3f7802ee 3f7802ee 3e1e5722 -> 3f9c0177 3f3802ee bdc351bc", + "3f800000 3f400000 3e800000 3f000000 3f190a6f 3f4bb1f0 3cb62cc5 -> 3f7214de 3f5763e0 bee93a68", + "3fc00000 3f400000 3e800000 3f400000 3f8f92b9 3ebbb7ca 3f8f92b9 -> 40275c16 be19b144 40275c16", + "bf000000 3f400000 3e800000 3f800000 3e275d62 3c11b2bb 3c11b2bb -> 3f8b1454 3f3db935 3fbedc9a", + "3e800000 3f400000 3f000000 00000000 3eb9acf2 3f78d93c 3e17d48f -> 3f2e6b3c 3f3c6c9e be3415b8", + "3f400000 3f400000 3f000000 3e800000 3f78207c 3f2ca68f 3f2ca68f -> 3fba185d 3f42f9d6 3f02f9d6", + "40000000 3f400000 3f000000 3f000000 3e800000 3f000000 00000000 -> be800000 3f000000 bfc00000", + "00000000 3f400000 3f000000 3f400000 3f43288f 3f2ecb56 3f2c7d99 -> 3f400000 3f000000 3f400000", + "3f000000 3f400000 3f000000 3f800000 3f9516b5 3f1bfc87 3f28ea71 -> 3fb516b5 3f1bfc87 3f947538", + "3f800000 3f400000 3f400000 00000000 3f329a31 3dc755f1 3f2b195c -> 3f929a31 bd62a840 3eac6570", + "3fc00000 3f400000 3f400000 3e800000 3e3f2848 3f870d49 3f43edbc -> be428728 401a93ee 3f85e49a", + "bf000000 3f400000 3f400000 3f000000 3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3f6aaaab 3f6aaaab 3f2aaaab", + "3e800000 3f400000 3f400000 3f400000 3f1e068e 3f3f145b 3f8d7f40 -> 3f4f0347 3f5f8a2e 3f86bfa0", + "3f400000 3f400000 3f400000 3f800000 3edd1cb3 3f2f936b 3edd1cb3 -> 3f25d586 3f83ae90 3f65d586", + "40000000 3f400000 3f800000 00000000 3e4e6629 3f8df45a 3e3820e5 -> bee333b0 405be8b4 bfa3ef8e", + "00000000 3f400000 3f800000 3e800000 3f4b79d5 3f4b79d5 3f035387 -> 3f400000 3f800000 3e800000", + "3f000000 3f400000 3f800000 3f000000 3f8b77ba 3e35c830 3f88c82f -> 3fab77ba 3f2d720c 3f88c82f", + "3f800000 3f400000 3f800000 3f400000 bd2efa09 bd2efa09 3beb0627 -> beabbe84 bdaefa10 be714f9c", + "3fc00000 3f400000 3f800000 3f800000 be5d336a be5d336a 3f54d72a -> bfb2f348 bf92f348 3fff42bf", + "bf000000 3f800000 00000000 00000000 3f000000 3f400000 3f400000 -> 3f800000 be800000 be800000", + "3e800000 3f800000 00000000 3e800000 3ebca29c bcdbff20 be2a7cb7 -> 3f6f28a7 be86dff9 bdaa7cb8", + "3f400000 3f800000 00000000 3f000000 3da699ce 3da699ce 3e1f89f1 -> 3ebe79ae bf20c329 bc8588c0", + "40000000 3f800000 00000000 3f400000 3e800000 3e800000 3e800000 -> 00000000 bf800000 be800000", + "00000000 3f800000 00000000 3f800000 3f8929ef 3d4b85fb 3f674118 -> 3f800000 00000000 3f800000", + "3f000000 3f800000 3e800000 00000000 3f843ad5 3f6da34a 3eae09df -> 3fc43ad5 3f2da34a be23ec42", + "3f800000 3f800000 3e800000 3e800000 3f898aea 3f904993 3dcbf76f -> 40098aea 3fc09326 bf0d0224", + "3fc00000 3f800000 3e800000 3f000000 3f0a0909 3e46f614 3e46f614 -> 3f8f0d8e bf2ac771 bed58ee2", + "bf000000 3f800000 3e800000 3f400000 3d0e4ba4 3e67bcdc 3f863f64 -> 3fbb8da3 3f0610c9 3e4e04e0", + "3e800000 3f800000 3e800000 3f800000 3f3d43f8 be21d529 3f3d43f8 -> 3f8f50fe bda1d528 3f8f50fe", + "3f400000 3f800000 3f000000 00000000 3f9e0659 3f380e15 3f380e15 -> 400684c3 3f541520 3ea82a3f", + "40000000 3f800000 3f000000 3e800000 3f400000 3f800000 3e800000 -> 40000000 40200000 bf400000", + "00000000 3f800000 3f000000 3f000000 3e800000 3e800000 3e800000 -> 3f800000 3f000000 3f000000", + "3f000000 3f800000 3f000000 3f400000 3f4d385e 3f3ca08a 3f366cd5 -> 3fa69c2f 3f3ca08a 3f766cd5", + "3f800000 3f800000 3f000000 3f800000 3f876ff0 3f7e1cf0 3f146190 -> 40076ff0 3fbe1cf0 3f946190", + "3fc00000 3f800000 3f400000 00000000 3e96f990 3f80c2c5 3f94a29d -> 3ec4ecb0 40112428 3ffde7d7", + "bf000000 3f800000 3f400000 3e800000 3e3bd290 3ef06716 be4572d4 -> 3fa885ae 3f47cc75 3f715cb5", + "3e800000 3f800000 3f400000 3f000000 00000000 3f000000 3f800000 -> 3f400000 3f400000 3f400000", + "3f400000 3f800000 3f400000 3f400000 3f6a1122 3ea5c2d2 be696707 -> 3fcf8cda 3ef8a43b beaf0d48", + "40000000 3f800000 3f400000 3f800000 3cb373e4 3ecc28ee 3ecc28ee -> bf699184 3eb0a3b8 3f1851dc", + "00000000 3f800000 3f800000 00000000 3eeac6d9 3e0d9ffc 3eeac6d9 -> 3f800000 3f800000 00000000", + "3f000000 3f800000 3f800000 3e800000 3f6a4922 3f6a4922 3f7ad4a5 -> 3fb52491 3fb52491 3f3ad4a5", + "3f800000 3f800000 3f800000 3f000000 3efe84c1 3d4e065d 3f2b5f4a -> 3f7e84c1 3dce0660 3f56be94", + "3fc00000 3f800000 3f800000 3f400000 3da5ef23 3f836752 3da5ef23 -> be838ca4 40251afb bf01c652", + "bf000000 3f800000 3f800000 3f800000 3e800000 3f800000 3f000000 -> 3fa00000 3f000000 3f800000", + "3e800000 00000000 00000000 00000000 3e58bbd5 3e4fef9c be04da26 -> be13a216 be180832 bea1368a", + "3f400000 3e800000 3e800000 3e800000 3f06ac8b 3f88ef9c 3efbf1c8 -> 3e9405a1 3f8d676a 3e73d558", + "40000000 3f000000 3f000000 3f000000 3f42646f 3eba8cbf 3f42646f -> 3fc4c8de bd2e6820 3fc4c8de", + "00000000 3f400000 3f400000 3f400000 3e800000 3f400000 3f000000 -> 3f400000 3f400000 3f400000", + "3f000000 3f800000 3f800000 3f800000 3f5d92fe 3f5d92fe 3ebd5fb0 -> 3faec97f 3faec97f 3f5eafd8", + "3f800000 3fa00000 3fa00000 3fa00000 3f944c34 3f5815b4 bda0b3c9 -> 40244c34 3ff815b4 3dbe9870", + "3fc00000 be800000 be800000 be800000 3f0a302c 3e09f594 3e09f594 -> be05bdf0 bfac43e8 bfac43e8", + "bf000000 3dcccccd 3dcccccd 3dcccccd 3f8a7af5 3de8b9e2 3de8b9e2 -> bef6b8a1 3ef904bb 3ef904bb", + "3e800000 3f666666 3f666666 3f666666 3f5565d4 be2cfb29 3c8f8c65 -> 3f888ca8 3f10c701 3f28a498", + "3f400000 3eaaaaaa 3eaaaaaa 3eaaaaaa 3f862749 3edb8ed8 3f9be2ef -> 3f93e598 3e6801dc 3fb47f10", + "40000000 3f2aaaab 3f2aaaab 3f2aaaab 3f77a2f6 3f5e2520 3eb09353 -> 40224da1 4008cfcb 3d3d1510", + "00000000 3f90f47a 3f881345 3e956af6 3f9d9e2d 3f49e095 3f9d9e2d -> 3f90f47a 3f881345 3e956af6", + "3f000000 3f945058 3f945058 3f57ac64 3f86ef19 3f86ef19 3d6a59ad -> 3fdb3f71 3fdb3f71 3ecca3fe", + "3f800000 3e20bdab 3e20bdab 3eb5c1e6 3f91bf3d 3f91bf3d 3f94336f -> 3fb7962f 3fb7962f 3fd5d758", + "3fc00000 3da49725 3efe699a bdc7d124 3e35d354 3e35d354 3ea98f73 -> bf630e9c bef0d968 bf1aa2f8", + "bf000000 bd55664f 3ed59d5c 3f062c88 3f42a28c 3dfd73cf 3f90649b -> be9ff1e2 3f4b2034 bdd4e570", + "3e800000 be5f731f 3dc11730 3dc11730 3e2a6b57 3f08152a 3e2a6b57 -> bec51eba 3de16bd8 bd947d78", + "3f400000 3f6fec0a 3eb9860e 3f633403 3f98ec70 3f98ec70 3f169873 -> 3ffd58ad 3fb3c42c 3f828c58", + "40000000 3c089dcd 3c089dcd 3e8fc37e 3f8ed1f5 3f8ed1f5 bda04600 -> 401e2c88 401e2c88 c0021050", + "00000000 be2b1926 3d29c5ef be2b1926 00000000 3f800000 3f000000 -> be2b1926 3d29c5ef be2b1926", + "3f000000 3f2cef07 be6fb804 3f2cef07 3f000000 3f000000 3f400000 -> 3f2cef07 be6fb804 3f6cef07", + "3f800000 3e328859 3e2947e2 3e860c82 3f05cab3 3f7d5185 3f6449a0 -> 3e60ddf1 3f927a81 3f85ccc0", + "3fc00000 3f9b8514 3e84bfee be2a16b1 be1ec083 baf40d93 baf40d93 -> bf40063c bf9f870e bfd5f9e0", + "bf000000 3f57877e 3dd55916 3f2b7610 3f287ab8 3f5a8c16 3f287ab8 -> 3f2f0cc6 be7f83cd 3f02fb58", + "3e800000 3eed1011 3e95949c 3f023a95 3f000000 00000000 3f000000 -> 3eed1011 3d2ca4e0 3f023a95", + "3f400000 3f22f843 3ea19954 bd39b585 3f5eec90 3f1556fa 3ed4d2c5 -> 3f98ad8e 3ee19e42 be2ff512", + "40000000 3eb66232 3f83842f 3eb66232 3f59cdb8 3ef4dfbe 3e3a4168 -> 3fe133fc 3f70c7da bf6a8d7f", + "00000000 3f9e51c2 3f11985e 3f93b6fd 3ec6365a 3e88715a 3f9ca6fb -> 3f9e51c2 3f11985e 3f93b6fd", + "3f000000 3f889af7 3d02659d 3f889af7 3f0cdbab 3f32a1a2 3eec2b1b -> 3f8f08cc 3e6b1fef 3f83a5be", + "3f800000 be0ec3ec 3e3f8cac 3e3f8cac 3f8ed3f4 3f4ed381 3f8ed3f4 -> 3f8bcf6a 3f4d8a2d 3fb5997e", + "3fc00000 3f098568 3f53b599 3ec876a9 00000000 00000000 00000000 -> bf767a98 bf2c4a67 bf8de256", + "bf000000 3e542da2 3e542da2 3f4fac6d 3d6e3c48 3d6e3c48 3f3d2fe0 -> 3f2627a4 3f2627a4 3f127c8d", + "3e800000 3e84151c 3e84151c 3f3a1b3d 3e8b1000 3ec989ea 3e74777f -> 3e133a38 3e51b422 3f18aa2d", + "3f400000 3f58b13d 3f38e3c0 3f38e3c0 3c69108b 3d834d24 3eb01bbd -> 3df13d00 3d8c11b8 3ef9f11c", + "40000000 3f9b3564 3f26da9e 3f9b3564 be6025c6 3e3ee367 3f57780c -> bfd4dd80 bf1a41fa 402512be", + "00000000 3f8b4cb1 3d7d5fdc 3f8b4cb1 3f8b02dd 3e87c4fe 3f8b02dd -> 3f8b4cb1 3d7d5fdc 3f8b4cb1", + "3f000000 3f52e33e 3f6cc968 3e808a5e 3f8b683b 3f6eff2f 3f93fd8a -> 3fb4d9da 3fade44c 3f684043", + "3f800000 3e598b38 3e598b38 bd440965 3f127f15 3f96ebda 3f127f15 -> 3eb6c1f0 3fc9091b 3dc5ec9e", + "3fc00000 3df9cc81 3ddb8d3b 3f8d2d67 3f722d95 3d814861 3d814861 -> 3fbae128 bf9a099a be54a838", + "bf000000 3e5c4d83 3f8fb92f be3f02a6 3e800000 3f800000 3f400000 -> 3eee26c2 3f1f725e bedf8153", + "3e800000 3f320e16 3eb14e96 3f9df59b 3ec8b0c5 3eeff94d 3f45ac16 -> 3f243a47 3ea94b3c 3faf60a0", + "3f400000 3e52ffeb 3e52ffeb be6ffceb 3e9040d3 3f912375 3f6b2ea5 -> bdf87b3a 3f94152d 3ec98d7a", + "40000000 3e6dc55d bdeab1e4 3eae4453 3f3b7e27 3f754f45 3f910dd8 -> 3f94b4fa 3fdbf36c 4037e43a", + "00000000 3f302363 3ed03be3 3ebf1490 3f654bdb 3f654bdb 3f552e01 -> 3f302363 3ed03be3 3ebf1490", + "3f000000 3ef19cbc 3f93671d 3eb4c9f7 bdbe0c4b 3e5e781f 3d9732c6 -> bdf79958 3f5e6c42 bd95a55c", + "3f800000 3e8b3935 3e8b3935 3f8ddd00 3f7e86d8 3e3d1023 bdd5ee0a -> 3fa15525 beb7b6a7 bdce0c10", + "3fc00000 be1b1fa8 be34233c be34233c 3d9b8be2 3f156ea4 3f69fe9a -> bfb639bb 3d9a18e8 3f887980", + "bf000000 3f221f58 3f388215 3f388215 3f918c25 3e720cfd 3e2b51d0 -> bb78f200 3f7bfed6 3f86d6d0", + "3e800000 3f959a28 3f1c19e5 3f959a28 3f25584c 3f645f87 3f06070a -> 3f9ef03b 3f4e49a8 3f971bea", + "3f400000 bd5e9404 bd5e9404 3e1533fe 3f74f6aa 3ecda688 3f1edabe -> 3f2188bf be4eb169 3ea72a39", + "40000000 3f5969e9 3f0fa991 3f5b236b 3e387458 3f595028 3eb980c5 -> bedc437e 3ffa7518 3e9c49ea", + "00000000 3f9c6454 3e9627cb 3e9627cb 3f9d8eed 3f83c9bf 3f9d8eed -> 3f9c6454 3e9627cb 3e9627cb", + "3f000000 3f3093fc 3f3093fc bd91d68d 3f059735 3f30aa42 3f30aa42 -> 3f362b31 3f613e3e 3df37b83", + "3f800000 3f68ad70 3ebb842f 3f09f4be 3f509aed 3f38537f 3f8f3649 -> 3fc4f1a5 3f4e6916 3fe366f1", + "3fc00000 be72f6f6 3f92e737 3f92e737 3dde3734 3dde3734 3de04a1d -> bfb4b485 bcdb9bc0 bcc2b900", + "bf000000 3f57418b 3f83c02b bcc12ee5 3ed5a9f7 3f299394 3e0ec6d7 -> 3f6c6c90 3f5decc2 3eac89a6", + "3e800000 be5897ae 3cb6be9c be5897ae 3e64c054 bdba440a 3f4f6dd5 -> beb31bc2 be8bdc97 bd66f010", + "3f400000 3ea703ad bdc5cdd9 3ea703ad 3d8289d4 3d8289d4 3f75dd86 -> bea808a3 bf403fe3 3f822710", + "40000000 3f8f33fe 3eb0e13d 3f8f33fe 00000000 00000000 3f400000 -> bf619804 bfd3c7b1 400799ff", + "00000000 bdc7b84b 3f18747a 3c1e0a0c 3ecbf34a 3f31c6c7 3e72d431 -> bdc7b84b 3f18747a 3c1e0a0c", + "3f000000 3f7b649a 3f871158 3f6cb005 3f000000 00000000 3f800000 -> 3f7b649a 3f0e22b0 3fb65802", + "3f800000 3f8d7885 3f4bc259 3f14166a 3edbe41b be5e66c9 3f7a134f -> 3f76d525 bf23710b 3fc41e84", + "3fc00000 3eb12f59 3e1ee4a1 3f1ddc7b 3b70fc2a 3b2ae453 3b70fc2a -> bf924ab0 bfab2315 bf5f5091", + "bf000000 3f86bf5d 3f0e43e4 3e03dba7 3f800000 3f800000 00000000 -> 3f0d7eba 3d643e40 3f20f6ea", + "3e800000 3e479428 3f9c4200 3f473f87 3f9995c6 3f871557 3e34e422 -> 3f0b7ad0 3fbfccac 3f1ddc0b", + "3f400000 3f0f83ef bcb7fcd1 3f14a703 00000000 00000000 00000000 -> be41f044 bf45bfe7 be2d63f4", + "40000000 3f1bee6a bdf13a94 bdf13a94 3edc22ce 3f91b2f9 3de326a7 -> 3ea8680c 401bdc1d bfd649ff", + "00000000 bcd75abe 3e8e45c4 3f9ba5aa 3c136339 3c136339 be461729 -> bcd75abe 3e8e45c4 3f9ba5aa", + "3f000000 3f035013 3e95c471 3e95c471 3ebeaa18 be30afb2 3ec6b6cf -> 3ec54a3e bec29367 3e38f680", + "3f800000 3f12bb9c bd91c946 bd91c946 3d752573 3d752573 3e800f33 -> be9d3f6c bf73947b bf1229f6", + "3fc00000 3db91f73 3f0412de 3f031c72 3ccc6b47 3ccc6b47 3f805b6c -> bfaad902 bf68c314 4001503e", + "bf000000 be4487fe be4487fe 3f6a6f18 3e1e4638 be0a4e63 3f5e3f14 -> 3e1d31ca 3ee2e333 3f0c3004", + "3e800000 3ea7b796 3f91796f 3ea7b796 3ef3b9c4 3e718550 be649afe -> 3ea19478 3f8091c4 bd0b7950", + "3f400000 3e9c7a7f 3f12b01c 3e8c8f85 be544b58 be544b58 bd8028e9 -> bf415f00 bef9d848 bf11bfea", + "40000000 be1351e9 3e0fded4 be1351e9 be21b110 3e41c1bd 3e41c1bd -> c031a163 bf8d2348 bfb1895f", + "00000000 3f4edfc5 be4f2d8c be4f2d8c 3f1ffaf9 be256013 be256013 -> 3f4edfc5 be4f2d8c be4f2d8c", + "3f000000 3f6cae48 3d1b3381 3dea07ee 3f732382 3e7edb9b 3e7edb9b -> 3fafe8e5 be5a5784 be0c206d", + "3f800000 3f9670ef 3f9f7dfe 3f9670ef 3ec8fab2 3ec8fab2 3f422558 -> 3f75dc90 3f83fb57 3fd89647", + "3fc00000 3e99b57a 3e99b57a 3f6e71c9 3d54e94e 3e1d4b46 3e73dd83 -> bf859cc2 bf3d2ccf 3e155fb0", + "bf000000 3ecde1d0 3f8ce810 3e83554f 3e1eebd2 3edd6a3e 3ebfbdcd -> 3f3f35f4 3f958d80 3ec39782", + "3e800000 3f8871a2 3f16e67e 3f16e67e 3f02e1d0 3d75b778 bdbf2eb1 -> 3f892a16 3ebd2874 3e95e726", + "3f400000 3f52cee8 3f8bc07a bdfee5c8 3eb79c30 3f071ae5 3e3ce83c -> 3f1c840c 3f9114a6 bf1905a2", + "40000000 3f1d4a7c 3ee07c0d 3f1d4a7c 3f7f4ecd 3f8a2a2a bd304711 -> 4026a16c 403063d6 bfc763a4", + "00000000 3f83fb0e bcc473af 3db27572 3e4bbf4d bdf15358 3f145b81 -> 3f83fb0e bcc473af 3db27572", + "3f000000 3f53c375 3f2dbac0 3f53c375 00000000 3f400000 3f800000 -> 3ea786ea 3f6dbac0 3fa9e1ba", + "3f800000 bca3af10 be37b1eb bca3af10 be7668ae 3f8f2366 be7668ae -> bfc028e8 3f87508f bfc028e8", + "3fc00000 3f3c6026 3f8ebb5a bd3bfea0 3f0261fb be61899a 3f0261fb -> 3f438617 bf85d83e bc933f20", + "bf000000 3f60c18e 3f60c18e 3f62c791 3f2aa4be be1e0a8c 3e8441e3 -> 3f361cd0 3fc42218 3f905350", + "3e800000 be33ae93 3d8d8e9f 3f9cb7eb 3f000000 3e800000 3f000000 -> be33ae93 bd64e2c2 3f9cb7eb", + "3f400000 3f9e4267 3f7de5aa 3f5fd480 3f327a12 3ce4a375 3f67a2ea -> 3fc41df4 3e913aa6 3fbda470", + "40000000 3e3efcdc 3d347b6c 3e3efcdc 3ebb422d 3eae9f31 3f8c24be -> beb378de bf1779e7 4024394a", + "00000000 be399f9e 3f1d2e74 be399f9e bda42c6e 3f49d556 bcba0f9b -> be399f9e 3f1d2e74 be399f9e", + "3f000000 3eda44c2 3ed3379c 3ed3379c 3f8ce9ed 3f96e037 3e5eac8e -> 3f837b1e 3f8bae1e 3e051bc6", + "3f800000 3e01acab bceb21a2 3f6d3813 3f85e779 3f96a19f 3f85e779 -> 3f9c0487 3fa996b7 4001357e", + "3fc00000 3f2210ee 3f2210ee 3f7cabb7 3f7a31a0 3ecc7ea9 be41f248 -> 40042974 3ea99dd7 bf8a6500", + "bf000000 3f20a93e 3f50c832 3e38e499 3c841ff0 3f656773 3f158c23 -> 3f8e441f 3ed6c17e 3dc5681a", + "3e800000 3f39d09c 3f39d09c be56e3ec 3f1ae974 3f9792fe be681999 -> 3f474556 3f88b1cd bf12bc2e", + "3f400000 bdee04b0 be2b848e 3e84418f 3f4f9443 3f1d6ebd 3f8cffa7 -> 3eb33b9d 3ba27c00 3f948fde", + "40000000 3f389e0c 3f389e0c 3f8d68a1 3d84c2cd 3f334ad4 3f4ba3db -> bf828047 3fc2e4ae 4012582c", + "00000000 3f9c2990 3f59a849 3f95b9a0 bdccb796 bdfbb6a5 bdccb796 -> 3f9c2990 3f59a849 3f95b9a0", + "3f000000 3f9b7975 3f9b7975 bdb1ff14 3fa00000 3fa00000 3fa00000 -> 3ffb7975 3ffb7975 3f29c01e", + "3f800000 3f1dbe50 3f412ff3 3f412ff3 3f285bc3 3eb24603 3f285bc3 -> 3f6e75d6 3ee6ebec 3f88f3bc", + "3fc00000 3f83ab39 3f83ab39 3f6d8483 3f0f9b74 3f0f9b74 3ea20f8b -> 3f9b1467 3f9b1467 3ec137a6", + "bf000000 bd09f83a 3ed9e498 bd09f83a 3f85e533 3f377bbb 3e8194ed -> bf1469ea 3e55da44 3e5a5818", + "3e800000 3f12bcd3 3d9c5f8a 3ef15bbe 3e3435a5 3f15f71f 3ea2aec3 -> 3ed2870f 3df43c06 3ec2b320", + "3f400000 3f21e525 3ec119b3 be3d9850 3f99c76c 3f20d71c 3ee0c300 -> 3fd79db4 3f11cf84 be8da7a8", + "40000000 3f67582d be432a6e 3ef05813 3ebee9b1 bdf44648 3ebee9b1 -> 3eca571e c02abb70 bd200948", + "00000000 3f6525d2 be5f2b7a 3f799c18 3f2c83fb 3f2c83fb be590714 -> 3f6525d2 be5f2b7a 3f799c18", + "3f000000 3f4936e3 3e97ead1 bbc7f836 3ed02c0b 3f7cf67c bdbb3b4b -> 3f314ce8 3f48ebe4 bf18f759", + "3f800000 3f907c4d 3f0a8d3f bd57ce0f 00000000 3f400000 3f000000 -> 3e03e268 3f8546a0 bd57ce0f", + "3fc00000 3e0c7f0e 3e60e554 bca45d13 be172174 be172174 3b3780cb -> bfe71caa bfdc8fe2 bfc17e32", + "bf000000 3ea9f998 3f070e7e bd850bff 3f000000 3f400000 3e800000 -> 3ea9f998 3e8e1cfc 3e3d7a00", + "3e800000 3edba94f 3edba94f 3de0aed9 3ef997da 3f99e2ac be230dc5 -> 3ed8753c 3f47b754 be612f76", + "3f400000 3d8b761e be1948ee 3f91d4f3 3e7af618 be7727b5 be7727b5 -> bea0e9e6 bfa18090 3cdf6040", + "40000000 3e061a88 3edb8b27 bd886d88 3e95943e 3e95943e 3ea64f64 -> bf3350e2 bece23e1 bf446ee9", + "00000000 3f398c38 3e91af6e 3daf893c 3e800000 00000000 3f400000 -> 3f398c38 3e91af6e 3daf893c", + "3f000000 3ed81ed3 3f64f931 3f64f931 3f9dcd53 3f3337e8 3e8ccd21 -> 3f93d508 3f8c188c 3f2b5fc2", + "3f800000 3f9bc74e bd83ce00 3f9bc74e bdcba5f4 be563a7f 3e607339 -> 3c94a400 bfbdcb80 3f27c838", + "3fc00000 bd86af73 3f9ae9c0 3f9ae9c0 bdde7309 3ee82f97 bdde7309 -> bff22089 3f890d71 bf1d97a4", + "bf000000 3f8c9389 3f4fd001 3f4fd001 3f09a809 be40e45a be40e45a -> 3f87bf84 3fc0048c 3fc0048c", + "3e800000 3d5dd28a 3e3dd95f 3d5dd28a 3d61451d 3e96ae1c 3f3632dd -> be2c62ba 3da90ef6 3e23da5c", + "3f400000 3eef323f be54e4af 3ddbcf91 3f14fbca 3f14fbca 3e9b8c9a -> 3f1712ce bdadfbe6 be3f726a", + "40000000 3da822c7 3e0c8e11 3da822c7 3e048416 3e048416 3f43c7ac -> bfb33bc9 bfac2c33 3f921184", + "00000000 3f815114 bd3b8bbd 3f815114 3e993149 bd2bb72b bb5c8fdf -> 3f815114 bd3b8bbd 3f815114", + "3f000000 3ea6a274 3f38acd9 3e705d06 bd813083 3f85c890 3eb80503 -> be735358 3fa21efc 3dc0ce18", + "3f800000 3f1ddd2e 3f74e305 be6b8063 3d96657a 3f77d4f1 3d96657a -> be7225d0 3ff24674 bf8aa35d", + "3fc00000 3f151b53 3f458e8c 3f2e9988 3f059c3d be4a72b7 3e5f43ad -> 3f25f00a bfa923be be27cedc", + "bf000000 be3d96d6 3e053d9f 3e053d9f bd328284 bd328284 3f08336d -> 3eb784e5 3f2c7790 3dc8dfd6", + "3e800000 bdc27012 3f9e084b bdc27012 3f1f08fe 3f8adbd4 3b52f55d -> bd0c9834 3fc37635 beafc90f", + "3f400000 3f76895a 3f0e226d 3df7b8e3 3f8ef532 3f91d88e 3f593967 -> 3ff1b478 3fc1d60c 3f24cd36", + "40000000 3f7a1ed0 3f39427f 3e7908b3 00000000 3f000000 3f400000 -> bf82f098 3f39427f 3f9f2116", + "00000000 be7e5221 3e9f5011 3f508332 be6ff6d1 3ee38728 3f9501a3 -> be7e5221 3e9f5011 3f508332", + "3f000000 3f9b38c2 bd254d18 3f9b38c2 3e730b0b 3e730b0b bdc7b6dd -> 3f733447 be9b241d 3f1d7aa8", + "3f800000 3eb55b62 3f2bcf8b 3f2bcf8b 3e647338 3f59e6e7 3f568e60 -> be4c62cc 3fafceac 3fac7626", + "3fc00000 3f0ae18f 3f6463d6 3f0ae18f 3e800000 00000000 3e800000 -> be5479c4 bf1b9c2a be5479c4", + "bf000000 3f7f7c7a 3f1695ec 3f1695ec 3f87aa35 3e8ba31d 3f87aa35 -> 3ee05020 3f50c45e 3ce83040", + "3e800000 be628ccc 3f258db5 3f40434a 3ef9fbdd 3e4aeb94 3e4aeb94 -> be6890ef 3efdd64f 3f19a0bc", + "3f400000 3e6c6b05 3e6c6b05 3f82a97c 3ec11a46 bde2cbd8 3f8c3261 -> 3d3ee75c bf2f6b77 3ff4f50e", + "40000000 3f99c91f be5f413e 3e1e8b68 3e1c87e2 3d7c236b 3f91b8cf -> be3f9780 bffc63bb 402d5a54", + "00000000 3ee95a8c 3ebfd36d 3ebfd36d 3ef86e72 be6ea30a 3e2667d8 -> 3ee95a8c 3ebfd36d 3ebfd36d", + "3f000000 3f025649 3f5eb69a 3f1e3bfe 3e8fe52e 3f994d68 3f994d68 -> 3e9491c0 3fc8a8b5 3fa86b67", + "3f800000 3f059335 3f059335 3ebb04ff 3ec91d4d 3db0824b 3e75b62b -> 3e9d6104 be9c9870 be1e89aa", + "3fc00000 3ef9daaa 3c84cef5 3f7902fd 3f889017 3f94127b 3d7b101f -> 400c1378 3ffe4aad beafd3fa", + "bf000000 3f43b8d0 3f92abaf 3f59e8bc 00000000 00000000 3f000000 -> 3fa1dc68 3fd2abaf 3f59e8bc", + "3e800000 3eb6857e bcb7411c 3f41a7c0 3e668028 3cca006f 3cca006f -> 3e604b10 be85240e 3f04cfc2", + "3f400000 3cf99668 3dab92d9 bd691380 3f2d87b4 3f376bed 3d060018 -> 3e983082 3ed1287d bf420136", + "40000000 3f262583 3f766661 3e301e0b 3f8f2bfd 3def8176 3f809b19 -> 4047e15b bf11d8e3 400c3813", + "00000000 bcd56a72 3f9417c5 3f9417c5 bcfe0c34 3f73d85d be50647a -> bcd56a72 3f9417c5 3f9417c5", + "3f000000 3f584ef2 3f61465c 3ebfe6a8 bd831887 3dd57cab 3d6fa670 -> 3e8fd7c2 3ef7ebe3 bd889228", + "3f800000 3e314685 3f750ecf 3f89008f 3f8b1d40 3e02e9f6 3d9b0578 -> 3fac6351 3e5a0f28 3e6309f0", + "3fc00000 3f49791c 3e93d146 3f49791c 00000000 3e800000 3f400000 -> bf3686e4 beec2eba 3fc4bc8e", + "bf000000 3f93ec80 3f93ec80 3efd0204 3f76ba71 3f7eb792 3f76ba71 -> 3f311e8f 3f29216e 3cf8d220", + "3e800000 3e80b719 3f973b5b 3f8e5701 3f95be28 3f3ace66 3e6382e4 -> 3f1619b4 3fa5eef4 3f791e5e", + "3f400000 3f4c5961 3f4c5961 3f82c5e4 be0e0333 be0e0333 3f99ffd7 -> be239f4c be239f4c 4004e2d3", + "40000000 3a961da0 3a961da0 3f9b9f97 3e5aab6f 3e5aab6f be15ec91 -> bf9284c1 bf9284c1 bfaf56b1", + "00000000 3d2f6831 bdcebeff 3d2f6831 3dcccccd 3dcccccd 3dcccccd -> 3d2f6831 bdcebeff 3d2f6831", + "3f000000 3e94dcce 3e4b87b9 3e94dcce 3e932144 bcb367a5 be27306a -> 3d9ff848 bea5729e bebebb66", + "3f800000 3f5bebf5 3f441c19 bdb649eb 3f65c9cd 3f1ce65e 3f1ce65e -> 3fd3bfc8 3f7de8d5 3e0c0dfa", + "3fc00000 3e2d056c 3f9fe789 3f9fe789 3ecf2683 3f87f0d3 3f1dd59d -> bdf02704 403bdd01 3fcca7f4", + "bf000000 3f92ffdd 3f860189 3f564fca 00000000 3f800000 3e800000 -> 3fd2ffdd 3f0c0312 3f8b27e5", + "3e800000 3f4614af 3e87b400 3e87b400 bde19173 3e0fae90 be188bcf -> 3eeff730 3dae7e90 bd7377a0", + "3f400000 3f01f812 3d3c8b29 3f01f812 3f8466c2 be263740 3f3d5c99 -> 3fa7962c bf728c05 3f5e02f8", + "40000000 3f8cbfd6 3e7f761f 3f6429e0 3f892c20 3f2b2906 3f0e6bf8 -> 4058b82b 3f6c81a0 3f8eece0", + "00000000 3ec83809 3d4867e2 3d8649b9 3f4732d1 3f4732d1 3f3f2dd4 -> 3ec83809 3d4867e2 3d8649b9", + "3f000000 3f7b70e4 3f7b70e4 3f8dcb76 3ed953ba 3f0e3892 3e79778f -> 3f681ac1 3f84d4bb 3f59f4d0", + "3f800000 3f85ea51 3f3418ad 3f2f95b4 3f699bd4 bdd8fc03 3e04fbb5 -> 3fef8625 bf022653 bd5ec720", + "3fc00000 bcf90027 3f632427 bdb0b886 be5c26b6 3e3d6423 3f832ba5 -> c00b3942 bd6d0be0 3fbe7767", + "bf000000 3f5cb16f bd9daf05 3ddc376b 3f9a32a6 3f174c92 3e04dad0 -> 3e21308c be2c09ca 3ef4a073", + "3e800000 3efe90fc 3f2a7c91 3efe90fc 3f90dfa9 bd4483e6 3f919a48 -> 3f502827 3ec8b0e4 3f50e2c6", + "3f400000 3eeb52c9 3ea09881 3ea09881 bd233e2d 3da76c60 bd233e2d -> beb348df bea09edb befe0327", + "40000000 3e645d15 3f009de3 3e8e0005 3f9fe4b1 3e2ec823 3f20acce -> 404e0f33 bf5099f9 3f49b33a", + "00000000 3f2083fa 3f2083fa 3f91a2ef 3d6d0cf0 3f37395d 3d6d0cf0 -> 3f2083fa 3f2083fa 3f91a2ef", + "3f000000 3c7c1df5 3f73f524 3f85b06a 3f4d6e65 3f36fdc2 3f5cd602 -> 3ea2bdba 3f957973 3fb41b6b", + "3f800000 3e513907 bd1586f4 bd1586f4 3f70bc0a 3d931f62 3f9e1c83 -> 3f8ae32b bf649097 3fb78cce", + "3fc00000 3f1a86fc 3f54f9f7 3f54f9f7 3f800000 3f000000 3f800000 -> 4006a1bf 3f54f9f7 40153e7e", + "bf000000 3f1bad77 3eb29dfc 3eb29dfc 3e4e4af6 3f743c75 3f816876 -> 3f681aba bdd76bb8 be2607b8", + "3e800000 bd77a0ae 3e8da94d 3e8da94d 00000000 00000000 3f800000 -> be9ef416 3cda94d0 3f06d4a6", + "3f400000 3f73e0ad 3f10ae72 3f4f9a1a 3e8a6ee9 3f95ffa0 3e8a6ee9 -> 3f1bb3dc 3fc956a9 3eeeda92", + "40000000 3ebd6a63 3dfe826e 3ee593c6 be2a6255 3e4ac374 be2a6255 -> c012eb49 bf8ab61f c00de61c", + "00000000 3f9c70cc 3f6f779e 3f9670a3 3f21f2f7 3c7fe307 3f21f2f7 -> 3f9c70cc 3f6f779e 3f9670a3", + "3f000000 3f14d333 3f14d333 3f6bd831 3f400000 00000000 3f000000 -> 3f54d333 3da69998 3f6bd831", + "3f800000 3f2cdfce 3e7b5ab6 3e7b5ab6 3f3c5c7c 3f3c5c7c 3ee692ec -> 3f92cc63 3f378fa6 3e15a666", + "3fc00000 3cc9e0f9 3f734358 3f1f2f9d bd446481 bcbe370c bd446481 -> bfcf41e8 bf1e91d0 bf82d19e", + "bf000000 be120512 3f5d33f0 3f89a3a6 3f63ab22 3f63ab22 be591916 -> bf082c66 3ef3119c 3fe4c6c9", + "3e800000 be688ad8 3f02e392 3f02e392 3f5cbf5f 3ed69ecd 3eef8fe0 -> bd3c3068 3ef1168a 3efd8f14", + "3f400000 3e6c6f8b 3f931a22 3f18b61b be06a3d9 3ed18e75 3ed18e75 -> bf37618e 3f81af8e 3eebc1e6", + "40000000 3f8815fb 3f6c9174 3f8815fb 3f3f4e55 3f3f4e55 3f724035 -> 40035952 3ff4e564 40364b32", + "00000000 3f9dfe05 be2f4998 3c44e408 3eae78e0 3f4ac8ac 3f4ac8ac -> 3f9dfe05 be2f4998 3c44e408", + "3f000000 3d283b53 3ec0ccba 3f68506c 3f94ea33 be304800 3f94ea33 -> 3f34581b be975746 3fc91269", + "3f800000 3f87f864 3f77670f 3f87f864 3e3125a5 3ef04f5b 3e3125a5 -> 3ed10734 3f67b66a 3ed10734", + "3fc00000 bdc0f792 3d2a60a8 3e926b01 3f0c9192 3ba344c0 3f09950f -> 3d595c3c bfb8c32d 3ecbe95b", + "bf000000 bdf7851a 3f8fb27a 3d7d879a 3f2a20b3 3f825226 3f825226 -> be9222ac 3f1ac0a8 bee997a5", + "3e800000 be3c3a24 3f147405 bdd2dc65 00000000 3e800000 3e800000 -> bede1d12 3ee8e80a be696e32", + "3f400000 3f631f3f 3f631f3f 3e46395a 3ba78789 3edda15d 3f80a73c -> 3e145754 3f495845 3f73840a", + "40000000 3f2182f4 3ece897d 3ece897d 3f204161 3e7e1b2c 3f204161 -> 3f91443c bf1aa016 3f684a42", + "00000000 3f0092c3 3f0092c3 3d76ce9f 3ee98d10 be04e37b 3ebf142c -> 3f0092c3 3f0092c3 3d76ce9f", + "3f000000 3f839bea be49499d 3ee86482 bdc96917 be467b73 3f89f8ea -> 3edc1562 bf63f144 3f84120a", + "3f800000 3ed623f5 3f370978 3e9750bf be1dcba1 3e007f7d 3e007f7d -> bf63d3d6 bd0b6ca0 bee82fc5", + "3fc00000 3e6a76a4 3e0563e1 3f810c26 3f6eb0c9 3f6eb0c9 bd00f054 -> 3fc35802 3fb6b5aa bf1614c4", + "bf000000 3f36d846 3f213475 3f213475 3eb54bc7 3f846a14 3f91837e -> 3f5c3262 3dc30268 bbe94380", + "3e800000 3f72142f 3f083e76 3f828a3f 3f0a9e68 3f0a9e68 3f33b8f9 -> 3f776363 3f0d8daa 3f8f787d", + "3f400000 3d1028fd 3d1028fd 3cbdc6c1 3f5086ca 3f3b7446 3f3b7446 -> 3f01ccbf 3ec461f2 3ebe393e", + "40000000 3f82b83f 3f4dfd79 3f0cee79 3f981c27 3f981c27 3f8da854 -> 4071946e 4063b7ac 403e8c46", + "00000000 3ec588df 3f90dabc 3ec588df 3d91f096 3c5bbcf7 3c5bbcf7 -> 3ec588df 3f90dabc 3ec588df", + "3f000000 3f79a018 3f924312 3e68498e 3f800000 3f800000 3f800000 -> 3fbcd00c 3fd24312 3f3a1264", + "3f800000 3f9ff8c1 3f9ff8c1 3e85e915 3ed301e2 3f5a55fb 3ed301e2 -> 3f8979b2 3ffa4ebc 3dafb364", + "3fc00000 3f41ade2 3f41ade2 3ef4c72d 3e3329f9 3f82154b 3e3329f9 -> be5fca90 40138b69 befe79df", + "bf000000 3e1615e0 3e59e3f0 3e1615e0 3ec20e7f 3f5555b9 3ec20e7f -> 3e88fc71 bdf6e5e8 3e88fc71", + "3e800000 3e4e50db 3ef17f04 3ef17f04 3eef7b1c 3f710cfb bdb10541 -> 3e3dcbf7 3f314600 3e36bcb8", + "3f400000 3e2cfaff 3f88e3b3 3f88e3b3 3f35df88 3f35df88 3e899900 -> 3ef81c18 3fb14b59 3f38fa26", + "40000000 bd569f79 3eb209e7 3f4327aa 3f400000 00000000 3e800000 -> 3f729608 bfd37d86 be736158", + "00000000 3f8c1603 3d01e781 bd246cfb 3ecb3345 3ee967fa 3ecb3345 -> 3f8c1603 3d01e781 bd246cfb", + "3f000000 3f80c66a 3f8e24e1 3f80c66a 3f400000 3f800000 3f000000 -> 3fa0c66a 3fce24e1 3f80c66a", + "3f800000 3f9c1a78 3f871a09 3f871a09 3f800000 3e800000 3f800000 -> 400e0d3c 3f0e3412 40038d04", + "3fc00000 3f535e9d 3f892984 3f24ed10 3ef5f216 3ef5f216 3f686059 -> 3f4449be 3f819f14 3fef070e", + "bf000000 3efc173f 3f3c5b8d 3e9a8b5f 3ec0bddf 3f2a6059 3ec41be8 -> 3f1dacb0 3f11fb34 3ed66f77", + "3e800000 be0d0611 3f1db38e 3f1db38e 3f7cc05b 3f81b8f1 be0c679c -> 3dd8f54a 3f5f6c7f 3e984d35", + "3f400000 3f024f1a 3df8a234 3df8a234 be4cb5f5 3eb92f1e 3f9b5753 -> bf0a7522 bdb04318 3f988d1f", + "40000000 3f4b2572 3f4b2572 3ef777ed 3cf76650 3cf76650 3f1034bf -> bf8af6e2 bf8af6e2 3f3c8ef2", + "00000000 3d8d1d4e 3f0a388b 3d8d1d4e 3f862ea7 3f27eb4e 3f27eb4e -> 3d8d1d4e 3f0a388b 3d8d1d4e", + "3f000000 3ee21558 3ee21558 3de4a74d 3f489160 3e904d7e 3f489160 -> 3f399c0c 3e64c5ac 3eca4c93", + "3f800000 3efa4cdf 3e942333 3f9b7031 be592c45 3f25eb69 3f25eb69 -> bf6f6fb2 3f15e86c 3fc15b9a", + "3fc00000 3f9eb832 3f10f3c6 3f10f3c6 3f656c2f 3ef48db2 3ed9c399 -> 401b6d3c 3eff90a2 3eaf3257", + "bf000000 3f849361 3d48dc13 3f849361 3f000000 3f000000 3f000000 -> 3f849361 3d48dc13 3f849361", + "3e800000 3f8fdd69 3d535c50 be232648 3f53e2d6 3f9fcfae 3f9fcfae -> 3fa4d61e 3eda0ae6 3e5c1870", + "3f400000 be135f3e bd8c7f82 be0955d4 be282cbc 3e9e63a8 be282cbc -> bf91f44b beb58a64 bf90b31e", + "40000000 3db1201e 3f4a5854 3f4a5854 bda4f1d6 3e6f3aa7 bda4f1d6 -> c00f153a be8cda08 bfc4104c", + "00000000 bd29f460 3f8d0dc7 3de013ba 3f6a56a1 3f7c451b 3e6b5d5b -> bd29f460 3f8d0dc7 3de013ba", + "3f000000 3e828abd 3e0001b8 3f824ae6 bca160ba bca160ba 3f8e6eef -> be878b4f beca1530 3fd0b9d5", + "3f800000 3eadcfd7 3f9fc379 bddf938e 3e82ff03 3f59bf33 3e82ff03 -> be186446 3ff982ac bf18f36f", + "3fc00000 3e8421c0 3e95d884 3f5c99d3 3f49ecb5 3f7daf34 3eabc972 -> 3f8feb80 3fe1fcef 3ebc8ffc", + "bf000000 3eefa177 3eefa177 3e356059 3f988e9b 3f44edd7 3e0b9a31 -> be6531ea 3e4b8b92 3f0a718a", + "3e800000 be68370b 3f7d5c9d 3e853ae8 bd8000d9 3f4d7959 3f6d5cec -> bf020dd0 3f920ca5 3ef297d4", + "3f400000 3d0f04af bd2a1fd4 3f628f3d 3e88098f 3f9e3883 3ec9c07f -> bea21114 3f8803c5 3f39df9c", + "40000000 3f867385 3f5ae5cb 3f5ae5cb bdb38ff9 3f887caa 3f887caa -> bfa67079 4047b2c7 4047b2c7", + "00000000 3da3a871 3eae9eec 3e7d6648 3f4dc737 3ef2973f be106c19 -> 3da3a871 3eae9eec 3e7d6648", + "3f000000 3c080d2c 3c080d2c bdb74d46 3f21b4b5 3e4b4aab bd8671c0 -> 3e0f53a7 be961a41 bf27b7e1", + "3f800000 3f22e532 ba9812b9 ba9812b9 3f400000 00000000 3f800000 -> 3f917299 bf802605 3f7fb3f7", + "3fc00000 3e5e4771 3e5e4771 3e774373 3f3e0ad8 3f8030ab 3f3e0ad8 -> 3f71b264 3fdc5aef 3f77f165", + "bf000000 3dab8789 3effd17b bdf38d33 3f3c77ec 3e760019 3f3c77ec -> be1c1bec 3f4268b8 beb5d325", + "3e800000 3f8f53cf bd4ab327 3f7a576b be367c2b 3e8f50b0 be367c2b -> 3f47d818 be235c1a 3f2387e6", + "3f400000 3f2e7a66 3f9109d1 be3aed02 3f853b2d 3e899a32 3e899a32 -> 3fbf15f6 3f494748 bf07879b", + "40000000 3c4a809f 3f86efc3 3f92f570 3eefd8b6 3eefd8b6 3dc3bc6b -> bde9248c 3f6d90f2 bef06dd4", + "00000000 3f828718 3e1ef310 3f820c75 3e427e4b 3f33a9fc 3f2190f2 -> 3f828718 3e1ef310 3f820c75", + "3f000000 be10c27b 3eb094aa 3eb094aa 3f800000 3f400000 3f400000 -> 3eb79ec2 3f184a55 3f184a55", + "3f800000 3e68544e be1d1dca 3f213153 3f7a9b5f 3f6de1b3 3f6de1b3 -> 3f97a5e9 3f347bf4 3fbe7a5c", + "3fc00000 3f9c52a8 3d2f3b48 3d2f3b48 3f6268b6 3f905178 3f905178 -> 4017f7dc 3ff66e42 3ff66e42", + "bf000000 bdd1a145 3e6b7854 3e6b7854 3f830e38 3f830e38 3f8891cb -> bf205099 be967cb6 beac8b02", + "3e800000 3f635a9c 3f635a9c 3e89ddf7 3caebbf8 3c504a88 3c504a88 -> 3f26158c 3f24fb31 3cd1f210", + "3f400000 3f18b9c6 3e96fbb2 3e23ab58 3f3e3250 3ef76ce2 3e537690 -> 3f76053e 3e8a1f05 be8f9168", + "40000000 3e0bb21b 3ee70743 be435930 3f173fcb 3f4bd16a 3da99f93 -> 3effd766 3fd164a5 bfee0341", + "00000000 3f07cc72 3f07cc72 3f1ab264 3f3963a4 3da9506d 3f0205a0 -> 3f07cc72 3f07cc72 3f1ab264", + "3f000000 3f615def be2d0311 be0a898f 3f010143 3f20e23b 3c6c0d82 -> 3f625f32 bd25e894 bf1ef22e", + "3f800000 3f8e02b8 3f8e02b8 3f1607f5 3f057b70 be507e4f 3f057b70 -> 3f937e28 be987370 3f20fed5", + "3fc00000 3f3d6c6c 3f28a2a3 3f63990c 3f01c8de be44e4db 3f20c8a3 -> 3f42c706 bfb58480 3fa2f97a", + "bf000000 be3b2f7b 3f86784f 3f1a2e4c 3f959a8d 3e992a7b be6823a5 -> bf5a00f9 3fa02db0 3faa1b9a", + "3e800000 3f82cab8 3f1dca97 3eb56cf2 bd4d445c 3eef9062 3f2652ac -> 3f3f2b4d 3f19aeb0 3edbbf9e", + "3f400000 3f84f2bb 3f84f2bb 3edde23c 3deb3217 3f3946d7 3f86ddfa -> 3eebfdb4 3fafe7dc 3fa1c586", + "40000000 bcc43df5 be11e3e7 3f1f4622 3ec3581d 3ec3581d 3ee5ca2f -> befee36b bf1dc8c0 3ed5b500", + "00000000 3f2641f9 3f46ee26 3f2641f9 3ee44e3f 3e109735 be19afcc -> 3f2641f9 3f46ee26 3f2641f9", + "3f000000 3d508ace 3e3cf0be 3d508ace 3f560faf 3f824e1e be41b427 -> 3ec630b8 3f33d86c bf23645d", + "3f800000 3f5ed4f1 3de5ace6 3f513065 3f8d95bb 3f087ee6 bcd9a129 -> 40054af7 3e36cda3 be71a6b4", + "3fc00000 3f895676 3f895676 bdcf796d 3f995c72 3e972e9d 3e972e9d -> 404ab5e6 3eeae5b0 bf372942", + "bf000000 bde98113 bde98113 3dd8a336 3f6b4d29 3f6b4d29 3f1c3a86 -> bf087d4b bf087d4b bb930fa0", + "3e800000 3da4ffbd be28c7b9 3f00686b 3f000000 00000000 00000000 -> 3da4ffbd bed463dc 3e80d0d6", + "3f400000 3eb58baf bcc508c6 3f758374 3f3a77c5 3ee16286 3ee16286 -> 3f32797f bde8f30e 3f5e8d58", + "40000000 bd7ca7af bd7ca7af 3cf59846 3f0699a5 3cd5f3ee 3cd5f3ee -> 3d29c191 bffa85fe bfeeca60", + "00000000 3f2d2976 3f2d2976 3f8583bc 3f44b584 3ecf51eb 3e28b422 -> 3f2d2976 3f2d2976 3f8583bc", + "3f000000 3f43770b 3f43770b 3d7de8bb 3f8aab4b 3f8aab4b 3f0047b9 -> 3fac66d0 3fac66d0 3d813226", + "3f800000 bd95e5d8 3f80ee6f bd95e5d8 3f400000 3f400000 3f800000 -> 3eda868a 3fc0ee6f 3f6d4345", + "3fc00000 3f95fdb3 be7de8db bd8248f4 3f000000 3f000000 3f800000 -> 3f95fdb3 be7de8db 3fb7db71", + "bf000000 3c7de801 3ec08a70 3ed3d7f9 3f7faba6 3f7faba6 3f74796f -> bef7680c bdfb3370 bd28d728", + "3e800000 3f14235f 3f14235f 3f3893d9 3f5b8d74 3f6bf9d6 3e349f23 -> 3f41ea19 3f4a204a 3f0f27be", + "3f400000 3f674f0f be34b589 3f7097dc 3f975bcc 3f1c1304 3f975bcc -> 3ff6b13a bc443710 3ffb55a0", + "40000000 3f91eac6 be63d3ae be63d3ae 3ec88cfa 3ddf1db5 3f921aa5 -> 3f34ef80 bfe4b309 4015f80f", + "00000000 3ee25f13 3f097ed9 3d981f6f 3f10aef6 3f920d9c 3f10aef6 -> 3ee25f13 3f097ed9 3d981f6f", + "3f000000 3f426489 bd85e268 3f426489 3f87f963 3f852314 3f80a7ae -> 3fa92ba8 3ef313b6 3fa1d9f2", + "3f800000 3eb51bc2 be7fa533 3f6a5133 3e800000 00000000 3f800000 -> be15c87c bf9ff4a6 3ff5289a", + "3fc00000 3f68daac 3f21c816 3f68daac 3ee4036f be0d4413 3ee4036f -> 3f3edfd2 bfa4157d 3f3edfd2", + "bf000000 3ee0fc69 bdd9e179 3ef3b351 3f000000 3f800000 3f400000 -> 3ee0fc69 bf1b3c2f 3e6766a2", + "3e800000 3e1c1837 3d45e78c 3f89aed2 3f70cde3 3f1d43a6 3f7064cb -> 3ebed9fe 3dd8025e 3fa5c805", + "3f400000 3f191309 3bfb83d5 bd52ed93 3f4b4311 3f6849d5 3f4b4311 -> 3f84fbd1 3f1e65c8 3ec76b81", + "40000000 3eb48761 3f0dfb66 3f0dfb66 3f5d4829 3f5d4829 3f9aa192 -> 3fe7b22a 4000c702 4058c1fe", + "00000000 3f4713e5 3ed246e8 3f6af317 3f400000 3f800000 3f400000 -> 3f4713e5 3ed246e8 3f6af317", + "3f000000 3f44482b bd6c8ecb bd6c8ecb 3eac71b7 3eac71b7 3f2d3422 -> 3f1a8106 be624045 3df359aa", + "3f800000 3ea89ce7 3ed83132 3ed83132 3e98a2c2 3f768705 3ea8e5d4 -> bd987654 3fac9352 3da7f368", + "3fc00000 3f5a4c97 3f967205 3f5a4c97 be580104 bd6b95df bd6b95df -> bfa3da16 befe9020 bf51df83", + "bf000000 3f3b3847 3f9977bf 3f3b3847 3ed0d635 be6d820a 3ed0d635 -> 3f52cd2c 3ff72800 3f52cd2c", + "3e800000 3f3b634c be6f70f9 3f3b634c 3f52c389 3f2faa61 3ebe1d10 -> 3f64c510 be101c37 3f2aea90", + "3f400000 3f0a8683 3d80dff4 3f00a691 3f800000 3f000000 3f000000 -> 3fa54342 3d80dff4 3f00a691", + "40000000 3f0f58fe be536996 be536996 3f2aaaab 3f2aaaab 3f2aaaab -> 3f9d01d5 3eeba08d 3eeba08d", + "00000000 3e2b0792 3eaed5f5 3e2b0792 bdf83fde 3e7d0155 bdc6989e -> 3e2b0792 3eaed5f5 3e2b0792", + "3f000000 be3eb6aa 3e34ab21 3d358029 3f4014e3 3f71061f 3f02c1ab -> 3d8339c4 3f1e30e7 3d619ad9", + "3f800000 3ebb924d 3f32fc69 3f32fc69 3edd9e03 3f829a58 3e9f635b -> 3e6d9ca6 3fdeb2e4 3ea4bf88", + "3fc00000 bd83ea89 3f50489a bdd027a1 3f556ad4 be09e27e 3f1f0bbb -> 3f6fc32b bf8b90a3 3e863c7a", + "bf000000 3e16ca33 3f6f15bf 3eb834b7 3f7123de 3f7a77e5 3f496220 -> be96e2a2 3ee93bb4 3d95c1dc", + "3e800000 3f720c63 3f7abd97 bd9615b5 3f1e82c3 3f25f412 3f25f412 -> 3f80a6e2 3f86dbd0 3a5d4980", + "3f400000 3f64ecf3 3f13afd8 3f7caa30 3f8e845a 3f15b96b 3e1bb2da -> 3fe83d00 3f3445f8 3eee1a84", + "40000000 3f04cd74 3f330cbb 3f330cbb 3db8fc4a 3f447b0c 3f447b0c -> bf8f5a34 3fe27c76 3fe27c76", + "00000000 3f3d4557 3dda3aa0 3f3d4557 3ed90902 3f954073 3ed90902 -> 3f3d4557 3dda3aa0 3f3d4557", + "3f000000 3f8c2b9b 3f86bb56 3f8c2b9b 3f101f26 3f9690d3 3ea4f048 -> 3f943b2e 3fdd4c29 3f6acf5a", + "3f800000 bd096383 bd096383 3cccff13 3f3f7b94 3f09ef0c 3f0ead25 -> 3eecc1e0 3d347dfd 3e0f090a", + "3fc00000 3f9a577c be415b72 be415b72 3f4ff8d2 3efaa626 3f1d7460 -> 4009265c be61768e 3e20190e", + "bf000000 3f9831b5 3f6e7655 3f9831b5 3f9015dc 3ecb64d9 be59c2b1 -> 3f1037b2 3f8461f4 3ff36a0b", + "3e800000 bd7a1c59 3f75eff8 bd7a1c59 3ed3c6a1 be12f9ac 3f290bae -> bdd580ea 3f2390c2 3c9c822e", + "3f400000 3f30da41 be728a79 bde65cff 3f0b9a55 3e11a65b 3f0b9a55 -> 3f4241c0 bf46043c bd364206", + "40000000 3f98b9b1 3f7dcc8b 3f72f01f 3ee5fb4f 3ee5fb4f 3f9ca0e6 -> 3f7d6a00 3f49c329 4075fdd4", + "00000000 bdeab1e7 bd76b559 3f682a79 bd5c8ae9 3ed9be8f bd5c8ae9 -> bdeab1e7 bd76b559 3f682a79", + "3f000000 3e5ee120 3e5ee120 3ef528c1 be621a3c 3e14df02 3f6f56f4 -> bf00ce47 be0c3fde 3f69eb54", + "3f800000 3ed9d884 3e95edb5 3ed9d884 3de2ab53 3de2ab53 3f5672ed -> beb4d1d2 bef8bca1 3f8ce90e", + "3fc00000 3e883a76 3dc7488a 3dc7488a bd9b0764 3f9d5b36 bd9b0764 -> bfbb02c4 40124315 bfd09cd9", + "bf000000 3f573495 3f87bf59 3f43caa6 3f63b118 3f63b118 3e6eacd5 -> 3ee706fa 3f2bcd9a 3f840fb8", + "3e800000 be08e7b9 3ebc81f2 3ebc81f2 3f5a65f9 3d00b6d4 3d00b6d4 -> 3d2f90e4 3e091abe 3e091abe", + "3f400000 3ee9c7da 3ee9c7da 3f90bc27 00000000 3f800000 3f400000 -> be963826 3f9a71f6 3fc0bc27", + "40000000 3db6165e 3f38a703 3f2f848e 3f149ee4 3f6b736c 3f6b736c -> 3ed27cb8 40199d2d 40175490", + "00000000 3f8c3978 3f655030 be4f8758 3f9a2124 3f9a2124 bd1fab37 -> 3f8c3978 3f655030 be4f8758", + "3f000000 3f28b93a 3d9e737c 3f9d45f3 3eeebba3 3f905d58 3eeebba3 -> 3f20170c 3f348920 3f98f4dc", + "3f800000 3f05148d 3da324b0 3da324b0 3f87efab 3f87efab 3db93e28 -> 3fd2699c 3f9a11a1 bf3d4be0", + "3fc00000 3e2d974c 3d14c4c5 3f1f4914 3ec10d24 3ec10d24 3e78f957 -> be4c19dc beaa3ffb be17efa8", + "bf000000 3f6fa742 3f6fa742 3f66169c 3ed57889 3eedd0bc 3e64cb27 -> 3f82757f 3f78bee4 3f9671e9", + "3e800000 3e2e2261 3e2e2261 bde0b809 be77c459 3ee8fc36 be1e8220 -> be4dbfcb 3e171e97 bedfce8a", + "3f400000 3f1c5821 bc609ba8 3f83c6f9 3e788085 baf3c368 3f87c7d0 -> 3e66214a bf443942 3fef72b1", + "40000000 3ec54ea3 3efab4c1 3f7aa197 3e1d8903 3f33bfe5 bc617431 -> bf7fcfaa 3fa62cfa bf89bad6", + "00000000 3f8efca3 3f96e9b7 3f9fb6b3 3f806af1 3edc1a6e 3f8e5e12 -> 3f8efca3 3f96e9b7 3f9fb6b3", + "3f000000 3e7e79c3 3f9446c4 3e60b6c3 bd8adabd bd8adabd 3f865f57 -> bea379ce 3f173230 3f44ec5f", + "3f800000 3db32c62 3f57fcb1 3f57fcb1 3f800000 3f000000 3e800000 -> 3f8b32c6 3f57fcb1 3eaff962", + "3fc00000 3f781b74 3df0bbf6 3f14ca0f 3f800000 3f800000 3f800000 -> 401e06dd 3fcf0bbf 40053284", + "bf000000 3f3ba1d3 3f3ba1d3 3ebf779b be428981 3e6532f8 3f5fe438 -> 3fb6221a 3f812a8a ba21aa00", + "3e800000 3f613bba 3ef93752 3ef93752 3eb04083 3f63b69f bd77e65f -> 3f4d4bdb 3f2e76f8 3e5371d8", + "3f400000 3e936b0a 3f4210d9 3e936b0a 3e42ba02 3f79f509 3e26429d -> be3512e8 3fbc8034 be5fc604", + "40000000 3edca52a 3eba4a19 3eba4a19 3e800000 00000000 3f000000 -> bf11ad6b bfd16d7a 3eba4a19", + "00000000 3efe6819 3f434a0d 3f60232d 3d09486c 3f3aa2e1 3f8cb51a -> 3efe6819 3f434a0d 3f60232d", + "3f000000 3e92e7b0 3f105421 be7df1af bde4bbae 3f1a7646 3f767fb3 -> bea6473c 3f2aca67 3e5c0d1d", + "3f800000 3f81f528 3ec146ad 3e89d152 3f2f9610 3f4aee38 3f2f9610 -> 3fb18b38 3f767fc6 3f2414c9", + "3fc00000 3f9e5402 3df3aa46 3df3aa46 3f649d10 3f97796b 3f649d10 -> 401a9fcd 400ad372 3fa6263c", + "bf000000 3f8590c4 3f8590c4 3f241f80 3ef86065 3e911f3c 3f95b44d -> 3f8778ab 3fa148f5 bce92340", + "3e800000 3ea5371a 3f6a5c7b 3f6a5c7b 3e800000 3f000000 3f800000 -> 3e4a6e34 3f6a5c7b 3f952e3e", + "3f400000 bc8fd080 be16f062 be16f062 3f9a7cd8 3f8010b3 3f8010b3 -> 3f857c02 3f1a7600 3f1a7600", + "40000000 3d1c990e 3ef80f3b 3ef80f3b 3f6b89ab 3f274233 3f274233 -> 3fdbf81e 3f8c8835 3f8c8835", + "00000000 3f67d094 3f9d1e78 bdbd3431 3f815aca 3f368507 3f368507 -> 3f67d094 3f9d1e78 bdbd3431", + "3f000000 3ec8b948 3f456820 3ec8b948 bde31dd2 bde31dd2 3f1244b0 -> be601c58 3e241198 3eed42a8", + "3f800000 3f4edbb8 3f9429e9 3eb18dfc bd582c27 bd582c27 3f028511 -> be985398 3d54e4e0 3ebba240", + "3fc00000 3e29a309 bd93d3fe 3f929cf4 3f295636 bd0b6a53 3e77be93 -> 3f266b64 bfd64f38 3ebe11ae", + "bf000000 3f47773b 3ea66b1d 3d362cd5 3f8fc9b9 3f10265e 3f84974b -> 3e1f8f24 3e861e61 befb9791", + "3e800000 3e106405 3f970b9f bd50de6c 3f582cd0 3f4ba0a6 be080fec -> 3ea05ed2 3fa9f3c8 bebc1fc8", + "3f400000 bd54ae71 3f9acae3 3f9acae3 3ed555e0 3f953a42 3f77a364 -> be3529fc 400d5123 3ff4856e", + "40000000 3f0d121f be05eea1 3f3459b1 3efbfc3b 3f1898a3 3e4e0a28 -> 3f050a95 3e81cdc8 befb384e", + "00000000 3f8cb98d 3e6876a4 3f8cb98d 3e0e7569 3dd938db be090f30 -> 3f8cb98d 3e6876a4 3f8cb98d", + "3f000000 3d662577 3f8c2929 3eda32a1 3f400000 3f800000 00000000 -> 3e9cc4af 3fcc2929 bd97357c", + "3f800000 3f84f408 3f9f1e24 3f84f408 3f0c8acb 3f589d6c 3f25c041 -> 3f917ed3 3ff7bb90 3faab449", + "3fc00000 3ea8b568 3f3beed1 3ea8b568 3f837365 3f837365 3eee37b0 -> 3ff48789 401428cc 3e66b8f0", + "bf000000 3e2901bf 3f83af3f 3f83af3f 3e62ee68 3f27d154 3e62ee68 -> 3ee309ac 3f5f8d2a 3fa75172", + "3e800000 3e16fd04 3e0bcaa1 3ec771cc be01cd74 3f2f3b05 3e86c6d2 -> be29e9b6 3e6a40ab 3e8ad535", + "3f400000 bdc1b4ac 3f24dbeb bdc1b4ac 3f97eff6 be4abf3c 3f988bb0 -> 3f6f994c bece5796 3f716c7a", + "40000000 3f83f9c6 3d41f1f1 3f8ebf1e be055cda 3f589fbe be055cda -> bfbeb4a6 3fb74f0c bfb3ef4e", + "00000000 3edf71a5 3f464027 3edf71a5 3e60885d be5e44e4 be5e44e4 -> 3edf71a5 3f464027 3edf71a5", + "3f000000 3f871cfd 3e032fbb 3df01221 3f0893fe 3e760966 3f0893fe -> 3f8b66fc be06c6df 3e1a5908", + "3f800000 bcac67f3 3e46301e bcac67f3 00000000 3f400000 00000000 -> bf82b1a0 3f318c08 bf82b1a0", + "3fc00000 3ed3fdc2 3ed3fdc2 3f38a612 3e6730fa 3ec62dc8 3b86b2df -> bed138c6 3d9a1c68 bf4431be", + "bf000000 3f342e8b bd598162 3bce7b36 3f165e21 3f8c7e60 3d2f1767 -> 3f1dd06a bf2694d6 3eed5700", + "3e800000 3e9de317 3eeffd7d be74e04c 3f400000 3e800000 3f400000 -> 3edde317 3eaffd7d bde9c098", + "3f400000 3f04f987 3e7ee9c9 3ef35ba2 3e044846 3f1692fe 3cdd1d6d -> bd16b5f0 3ec32dde be6fd338", + "40000000 3c996ef9 3e0a38eb 3c996ef9 3deb7dcb 3e5f5755 3e376258 -> bfc2bad1 bf7e1a71 bfa1e918", + "00000000 3ed99948 3d44cc92 3f5457a6 3e283e2e 3f4d4f69 3eb9da40 -> 3ed99948 3d44cc92 3f5457a6", + "3f000000 3f95446c 3f9de92d 3f95446c 3f8ff89b 3f7a5607 3e836e19 -> 3fe53d07 3fdb1430 3f6c3fe4", + "3f800000 3e4b3286 3d1c1455 3ed37c94 bd31423d 3f9e1cc4 bdd84c3b -> bf635ba6 3fc11a2b bf4c54c4", + "3fc00000 3f3c6adc 3f00d0f5 3e84aed0 3f82e7f0 3f673b3b 3f71c455 -> 4013769f 3fdb4152 3fcbd234", + "bf000000 be2f5642 be2f5642 3f0df64b 3f800000 3f800000 3f000000 -> bf2bd590 bf2bd590 3f0df64b", + "3e800000 3eb30df8 3e3477df 3eb54e5a 3efae502 3f9a9ba2 3f9a9ba2 -> 3eb08079 3f07b99a 3f3542cf", + "3f400000 3ef5cda7 3e8e099d 3ef5cda7 3e3613fe 3ed678db 3ed678db -> bb51ad80 3e1f7dcb 3eb782f0", + "40000000 bdc8a1a4 3e8a6bb4 3e8a6bb4 3f62202b 3f461324 3f461324 -> 3fb7b63c 3faec135 3faec135", + "00000000 3f4ce5e9 be6d24b3 be0b6275 3f6c4e19 bdc66fdf 3f45e5e6 -> 3f4ce5e9 be6d24b3 be0b6275", + "3f000000 be5bd282 3f92fdbb 3f224eec bc846a2c 3f0cacea bc846a2c -> bf3b17f2 3f995430 3df15cd8", + "3f800000 bdbe1808 3ece042f 3eae24e2 3d87a3a9 3f56ec49 3edee39d -> bf75da17 3f8a6d55 3e57d838", + "3fc00000 3f984e8b 3f984e8b 3eda74c6 3f09ba97 3e145b47 3f09ba97 -> 3fa6e66e 3dff0c60 3f0a6a28", + "bf000000 3f9481b5 3f7d8d18 3f9481b5 3f44dbe3 3c8d7923 3f44dbe3 -> 3f642787 3fbc90a8 3f642787", + "3e800000 3dc2d83b 3f3cadaa 3dc2d83b 3efd574f 3d913ed5 3f230eb8 -> 3dbd86d9 3f05c197 3e27898e", + "3f400000 be39cd98 3eb0d653 be39cd98 3db00512 bd824c80 3db00512 -> bf4d7273 bf00032e bf4d7273", + "40000000 be39b138 3f8e7c90 3ed861e7 3e1654b6 3da0ca9d 3ea36023 -> bfcc0bcc bf12a192 be9a1d8d", + "00000000 3e94ea3e be6bcd3d 3edbbf5f be666e09 3ef159a8 be666e09 -> 3e94ea3e be6bcd3d 3edbbf5f", + "3f000000 3f3576fd 3e3bc294 3f3576fd 3f08e483 be19f0e9 3e079854 -> 3f3e5b80 beef172a 3eaeba24", + "3f800000 3f190b4b 3ea792fb 3f409aa3 3f38f151 3f527be5 3f9a1906 -> 3f8576f6 3f78c148 400a3faf", + "3fc00000 3f1fc406 3edcf535 be0caa72 3f659fe4 3f77c52d 3f77c52d -> 3fe851d9 3feae511 3fa21276", + "bf000000 3e3689ce bdaaaae9 3e3689ce 3f2aa315 3f2aa315 3eb144b0 -> 3c3fd7a0 be7fe1c8 3eaa0037", + "3e800000 3f102d54 3dec4292 3dec4292 3f89fb41 be53d26d 3ee1358d -> 3f5a2895 be73c7ed 3daeadac", + "3f400000 3f391b54 3ecc8232 3f391b54 00000000 3e800000 00000000 -> bcdc9580 3cc82320 bcdc9580", + "40000000 3f16a3b8 3f70fc21 3f70fc21 be51bc7e 3ed5442c 3ed5442c -> c00ec632 3f1b8479 3f1b8479", + "bc24c1fd 3dc0c4e0 3ee848c8 3f9785fe 3e5d02f8 3f8e5f86 3e5e94af -> 3dcc794a 3ee1fab5 3f984042", + "beb35961 3f948a67 be406aa5 3f6a9c0e 3f1053f5 3f9cde5a 3f734e58 -> 3f8ed233 bf323a74 3f19d404", + "3f279a12 3f33278b 3f5dc24b 3f33278b 3f000000 3f000000 00000000 -> 3f33278b 3f5dc24b 3d38d790", + "3f25b4c6 be03e243 be03e243 3ea774ee 3f50cdf1 3ed9f114 3ed9f114 -> 3e8f460e be666c3b 3e6c5fe4", + "3f031423 3d1961ac 3d1961ac 3f5bfe04 bce071b8 3f7ba78d 3f7ba78d -> bf00acc6 3f083709 3fad4f79", + "bb9d2656 3f2bfbcc be20c66c 3f2bfbcc 3f84e230 3f5ab75a be2c764d -> 3f2aa984 be24416c 3f2d9ff7", + "3f3b01a9 3f662e7e 3f97ce37 3f0aac2f 3ddcc9ff 3f1dc86b 3f2b6eda -> 3ea6fe28 3fad8fcf 3f4a20b2", + "bebaec7b 3d4aa47b 3f4cb8a4 3e72bd82 3cef9336 3d243a9d 3d243a9d -> 3ec95226 3f91581e 3f12a6f9", + "3f6431ed 3f033aae bc0b4c51 3f033aae be3b0712 be3b0712 3ce15f05 -> bf3452a0 bf9cdd40 bea8d1ec", + "be1c5812 be6a5d9c 3f56a029 3f56a029 be3ff3d7 3eaea30c 3f57882a -> bc9b41d0 3f630c52 3f3be59e", + "3ef49fe6 3f3ef846 3f8ac90e 3f8ac90e 3e61520e 3f961963 be6d9313 -> 3ef4f81f 3fdd0f08 3ec50208", + "bd992e43 3f866818 3f9e2371 3f9e2371 3f548ed2 3f548ed2 bd32766c -> 3f801504 3f97d05d 3fa88be7", + "3f0da0b9 3e99dc81 3f741aa7 3f741aa7 3efe86ba 3f12ae35 3efe86ba -> 3e983b10 3f846301 3f7349ef", + "3ebff57d 3f3bef96 3f3bef96 3f046e55 3f5c2fa5 be2519e3 3f5c2fa5 -> 3f8087c4 3e7406ba 3f498e48", + "be3e79fe 3ebc930a be634e8e 3ebc930a 3f66c89d 3f7b2708 be002780 -> 3e603255 becd48ee 3f19d351", + "3ed81c75 3db5ffa0 3f9c82b2 3db5ffa0 be6c6286 3f42ca91 3eb533a4 -> bf0731a1 3fb8b3de bd0d26b2", + "3f5f752c 3e1b03bd 3f843ab2 3f02995c 3f6ad063 bddf4891 3f6ad063 -> 3f6139c3 bcf72c40 3f9e8918", + "bc91d910 3f37767c 3f0bc4a7 3f3e1783 3e61f0dc 3f4084e9 3f4084e9 -> 3f3a0260 3f097887 3f3bcb63", + "3ef8667f 3f4667e2 3f4667e2 3f68eacf 3f000000 00000000 3f400000 -> 3f4667e2 3e946945 3f938237", + "3e605ddd 3f409f82 3ebe1441 3f7f2e56 3e9eb325 3ee1269d 3f81ce12 -> 3f2b4dc7 3eb08f7e 3f9c6d63", + "3fb9eaed 3f430746 3f430746 3e76c13a 3e800000 3e800000 3f400000 -> 3d11c590 3d11c590 3f779b3c", + "be1c853d 3f071fed 3f41fa10 3f2e1475 3e344071 3eed6932 3eed6932 -> 3f207a9a 3f44d175 3f30ebda", + "3fbe4aee 3f9ba779 3f9ba779 3df042c9 bd3d0b98 3f6cf6ed 3f2e3151 -> bed0d0d0 401ed2e5 3f2760d6", + "3f169a5d be24298a 3f6a16c3 3f6a16c3 3e919b3d 3edf612e 3edf612e -> bed3f7fb 3f56e608 3f56e608", + "3fa69e9c 3f9273cd be29521c be29521c be800000 be800000 be800000 -> bf4ef43a c0078c17 c0078c17", + "3f9b6f2d 3df1a404 3ec32d82 be530769 3dd2a07f 3f308feb 3f1120b1 -> bf58b886 3f5787aa bd328ecc", + "bdcf6d49 be0f1936 3f32788e be0f1936 3f624453 3e3b2411 3ee8271a -> be5eb868 3f42ec16 be056fee", + "3e4f1dec 3e3b9356 3efcc9ca 3f8e7ea9 3f4fa54c bdc69269 3f00ea99 -> 3e9e39a2 3e8125e1 3f8eae1c", + "3f50d3f5 3f28cb26 3f28cb26 3eee2d1f 00000000 3f800000 3f800000 -> be20233c 3fbccf8e 3fa3f542", + "3faa7c8b 3f930ca8 3e0de9d4 3e6318d0 3f8f097c 3e53d411 3e53d411 -> 4032cbd4 bf246cc1 bf0f2102", + "bdc86d20 3ece0fb9 be4037e8 3ece0fb9 3da11b92 3da11b92 3ec8cd93 -> 3ef848de bdd78b3d 3ed8dd74", + "bec21986 3e39c47b 3f39dc54 3f39dc54 3f800000 00000000 3f000000 -> be4a6e91 3f8d748c 3f39dc54", + "beb794d4 3e777bf3 3f956e95 3f6e54b2 3f09940d 3f9dcdee 3e99eb49 -> 3e5c0258 3f2453ae 3f897763", + "be842a81 be3dfd80 bd05795d 3e8cd8d7 3e8b97ba 3f96fb60 be7c62fa -> bd8b96a1 bec44f66 3f2914e8", + "beb0e3e2 be102e4e 3e0c57a0 3e0c57a0 3e800000 3f400000 3f800000 -> 3d02d650 bd123108 be557024", + "bce58da7 3e96998e 3f977fe8 3f977fe8 3f85ce09 3f802a45 3c2ad173 -> 3e86f392 3f93e753 3f9b02f9", + "bd525505 3f8a4c56 3f86d684 3f22f0fb 3ddcc594 3f992d0b 3f992d0b -> 3f8f7437 3f7b5be4 3f109fd7", + "3f632070 3f2b0295 3f2b0295 3f79f3e4 be4ac55f be4ac55f 3f2e0ff4 -> bf121135 bf121135 3fa5d7ee", + "be89fcfc 3d433f4c 3ee9e366 3d433f4c 3e6fc7f7 3ec87a02 3e6fc7f7 -> 3e438ad2 3f03e87d 3e438ad2", + "be635175 3f8693f5 3f158b7a 3f158b7a be6d1782 be6d1782 3eb81e66 -> 3fb02698 3f68b0c0 3f258075", + "3fa6bd0a 3e139fad 3f8bbfbb 3f8bbfbb 3e2051b4 3f8ba1af 3e2051b4 -> bf4026cc 4028653f 3e49c2fc", + "bcaa4176 3f875b12 3ec691e7 3f875b12 bdce1e83 bda4dcc5 bda4dcc5 -> 3f8a8d2d 3ed2ec91 3f8a71bd", + "3f394067 3f860064 3f93b521 3f93b521 3da58b69 3f84b0d4 be554b72 -> 3ee16674 3ff71f43 3e03f510", + "3e3171f8 3f6b7d9d 3bc18399 3f514e97 3f7ef43e 3e5c55ab 3f7ef43e -> 3f8bbea7 bdbe1263 3f7d4e49", + "3712d534 3f214d5e 3f813e4c 3e9fa866 3e94f8e1 3edbfbce be134773 -> 3f214d21 3f813e42 3e9fa6ec", + "3f9863dd 3e646e27 3e646e27 bd815655 3cbfb701 3f23c626 3e9e064a -> bf696842 3f0e49f6 bf04cfc3", + "3e926a74 3e2c9954 be206e8b be206e8b 3eddabbc 3f5be24a be4a0034 -> 3e0554aa 3d471a0c bf0e32e4", + "3fbfaf4c 3f53a904 3e7f317b 3dbe5b91 3f9d158a 3f25bdba 3f9d158a -> 40404fe0 3f30d5f5 4011587c", + "be9fdbda 3ed5c581 3e6236d5 be56cf4d 3f001061 3f001061 3e8446cb -> 3ed5b10c 3e620dec bd712af0", + "3f9d4db2 be5bc062 3f81c241 3f81c241 3f6661b3 3e907e49 3e907e49 -> 3f44b3dc 3ef4f770 3ef4f770", + "3e35af54 3f38f2ae 3f4f093b 3f34b074 3e1966ff 3ee9e974 3f9380c3 -> 3f1922b5 3f4b1df7 3f6ff3ae", + "3e64ec0b 3f90dd20 3ea10faa 3ea10faa 3f01d471 3f72e266 3f186fe7 -> 3f9145d9 3f03e59d 3eb6e9dc", + "3f7b77c4 3f765f31 3f74b082 3f74b082 3f7ba561 3f2071b1 3f2071b1 -> 3ff4a497 3f9a36e7 3f9a36e7", + "3eea2c9f 3f97bd1a 3ef39b0f 3f97bd1a 3e926bf2 3f0b01bb 3f0b01bb -> 3f7d5bfd 3f03df08 3f9cc5da", + "3fb146e6 3f95472a bb433580 bb433580 3f73f4ef 3f8fa386 be2582b4 -> 401af00c 3fdc36dd bfeaf71b", + "3d8e5643 bdf8fd15 3cdcaf94 bdf8fd15 3ead9399 3dce92dc 3d95c4a2 -> be13687e bce9ce66 be3940fb", + "3f61d5af 3f23a6e6 3e9ebfdf 3e47ec2a 3f88bb89 be5a3003 3f90fcfb -> 3fd22685 bf72b2e8 3fa7e16a", + "bef024b2 3ec2a317 3cbbd2a2 3cbbd2a2 3eaefd89 be2c75c6 3f3d8204 -> 3f075082 3f2662b7 be4f507f", + "3f939313 3eecbb76 3f478473 3eecbb76 3f20abd9 3f20abd9 3f4eb7c7 -> 3f41b386 3f896d1f 3f95f05f", + "3e389d16 3d0af57a 3f06dc6a 3e9eb7d9 3f82795d 3f8df316 3f8df316 -> 3e627d72 3f3f12f6 3f079279", + "bdf5fce1 bdd120d8 3f911d38 be29e5b9 3efa52da 3f31ac14 3f7f9af3 -> bdcbac87 3f8b25e0 be924188", + "be635ff1 3f9c5990 3ecee0b5 3f9c5990 3f2daef8 3f046dc5 3efe25ec -> 3f9234bf 3ecaf1b6 3f9c8e32", + "3f81b4d3 bcfd8460 3e80b058 3e80b058 be351f4a 3f2f8b19 be351f4a -> bfb38d3e 3f20b2de bf8f6b16", + "3d049aa4 3e918a96 3f4660a0 3e362e76 3f82109d be5ce676 3f82109d -> 3ea2a6d3 3f3a8394 3e5866ef", + "3f9def5c 3f28652e 3e19b30c 3e19b30c 3f292afb 3f1d9554 3f1d9554 -> 3f86fe4b 3ededb72 3ededb72", + "3f793265 bd9a213f 3f7678eb 3f7678eb 3ea1f875 3c1e0e2a 3ea1f875 -> bedd9802 3c055740 3f1af112", + "3f89c8b0 3f6cdfc8 3ec79a10 3f6cdfc8 bd43fee0 3f826b26 bd43fee0 -> be8221b4 3fc0e427 be8221b4", + "bd763ed1 3f61ad8e 3f86ba3c 3f77c03e bd4aa752 bd4aa752 3f2f86ee -> 3f729758 3f8f2f21 3f720954", + "3e937e90 3e00aedb 3f924b01 3f924b01 bd9d2a44 3f0e4416 3f0e4416 -> be5394bf 3f966714 3f966714", + "3e27330b 3e6b7dfb bdeb771d bdeb771d 3f91aa12 3f2e94d4 3e9db9f8 -> 3ee06b72 bd638b3a be35ead6", + "bea992ed 3f0634c8 3f4604c3 3f4604c3 3f3c6bb9 3f3c6bb9 3f1637c8 -> 3ebc5dfb 3f1dfef8 3f374d30", + "be1f543c 3bf064c1 3bf064c1 3f8c0b99 3e800000 3f000000 3e800000 -> 3dae5a88 3bf064c1 3f9600dd", + "be950177 3f9bb98e 3ec3d55d 3f9bb98e bde89d58 3f4799f0 3f35cf7f -> 3fc9703a 3e60f6b4 3f8c1084", + "be926f17 bd8b474f 3f274d91 bd8b474f 3f4389cc 3e9f4cf7 bdc650bf -> be602b3c 3f42f59a 3e8bf94a", + "3f2e86ed 3d86576f 3f6d0d1c 3d86576f 3c01805d 3eb1a749 bd7cd0e9 -> bf1af9b3 3f37a385 bf334767", + "be2c4032 3f98bcb2 3f98bcb2 bba37982 3e926be9 3f287bf3 3e926be9 -> 3fa1f411 3f91ed56 3d893e5c", + "3eacf0e6 3f966c87 3f96f49c 3ed9ec8d 3f98830d 3f98830d 3efd8f3e -> 3fd237de 3fd2bff3 3ed8467f", + "bed4e1da 3f8ae931 be3efd9b 3f42ab1a 3f1adf5c 3f1adf5c 3f56b8d8 -> 3f7f79b5 be8c3028 3ef51b0a", + "3dfb692d 3e0ba6ef 3e0ba6ef 3eb90445 be56895a 3ea880d0 be56895a -> bd1ae76c 3dc16038 3e3fa7c0", + "3ed0f29d 3e18f4fe 3f31a76a 3dd65d74 3f6dcb41 3e834366 3e7a4e22 -> 3effb4e4 3efd7f60 bdd4d39a", + "3e1f0499 3f66653b 3efa22fc 3f25e873 3e85fa4b 3f895923 3f904afa -> 3f53724c 3f2aa12c 3f57c876", + "bd61413f 3f80c925 3dde8a78 3dde8a78 3d592ef8 3d592ef8 3f282b6a -> 3f871415 3e219cbf 3dbb3213", + "3effc1f9 3e892f38 badbd82d be5c0499 3f84af2f 3ed97da8 3f84af2f -> 3f4dd4b1 bd9d536f 3ea477de", + "bea68466 3f965116 3d90d2db 3f965116 3adb3d24 3d45e9b0 3d45e9b0 -> 3fbfce89 3ebaa1a1 3fbbec50", + "3f55be94 3f25baf4 3f564f3a 3f927265 3ef2415c 3eb5997d 3d1b21e2 -> 3f1a411a 3f18308c 3ebeae18", + "3fa9c514 3f8f306e be0bceee 3f8f306e 00000000 3f000000 00000000 -> be54a530 be0bceee be54a530", + "be6e3bb8 3f72558d 3dc3cd78 3f56128a 3e8a6b7f 3f2dca2b 3e8a6b7f -> 3f86d836 3c4ad770 3f716d69", + "3f918f9d 3f16ffcd 3f977644 3eba4b4f 3f8d957f 3e32708d 3f39a4ee -> 3ffbf4b2 3ee28650 3f6040ac", + "3f3df888 3f3d333c 3ee6d749 3f3d333c 3f000000 3f800000 00000000 -> 3f3d333c 3f98b216 bb454c00", + "3fac0d17 3f661ec3 3f44b896 3f44b896 3f800000 00000000 3e800000 -> 400f8e3c bf136198 3dc55bf8", + "bed1f357 be7f4005 3f8bebf0 bc11bb23 3f4116d5 3ee7ab6c 3e29a721 -> beea6308 3f90e8fb 3e87d424", + "3fb0e8ce bd6af70b 3f72de98 be7baf81 be3b4f32 3f50b6aa 3f69726c -> bff8f8ea 3fe8fd42 3f648e5c", + "be19ca9d 3effe2bc 3dcafa63 3dcafa63 3f64cf76 3f240513 3f67171d -> 3ec352f5 3d68d872 bcb2fcf0", + "3f9e9504 3e271d15 3efc4b0a 3efc4b0a 3ecb2609 3f016d9b 3f7fee21 -> bdbd9a7a 3f01af6f 3fdd91a2", + "3fae9c95 3f9f5484 be542c7a be542c7a bd62dc29 3eae7b44 bd62dc29 -> be8a7e78 bf243f46 bfdc79b1", + "3f98b420 3f90d262 3d95a347 be6ff819 3e07e4fb 3f0991ac 3e07e4fb -> 3e829830 3e262540 bf8e2b59", + "3d251058 bde689f0 bde689f0 3eb65fc9 3f807ff5 3ebf8dc1 3eee28ed -> bd935cc2 bdfb50d0 3eb4efb1", + "3f98109c 3f94b1e7 3d6806a5 3d6806a5 00000000 3f400000 3f400000 -> bcd7ad40 3f269106 3f269106", + "3d730217 3f733ddd 3ee3746c bdcc3bfc 3dd036a3 3f29b4bc 3e8f4ec0 -> 3f672452 3eed5a25 be00dc49", + "beb5d6fd 3f650496 3f94fc11 3f94fc11 bd83c1bb 3f5fb2c3 3cbc830d -> 3fa5d174 3f65fe60 3fc05a34", + "3e961b8d 3e659400 be38e0b1 be38e0b1 3f07e76d 3f05ae6b 3e85d0dc -> 3e781dce be2b8d74 bea4151e", + "3dd3b920 3deaa29a 3e0678a2 3e0678a2 3f823271 3e4cf07f 3f823271 -> 3e62d030 3d8df75a 3e73f786", + "3e0b1b13 3eace2b5 3eace2b5 3d93c720 3f842dae 3f1d16be 3f842dae -> 3ef6fabc 3ebcb122 3e5e139d", + "bebe13dc be5e65a8 3dd709b0 be5e65a8 3f65cea0 3e2a333b 3f65cea0 -> bf0330aa 3eb4a6aa bf0330aa", + "3f2c41c4 3ee8eddb 3eeaff12 3eeaff12 3df843fe 3df843fe 3f57a7eb -> bd607788 bd4fedd0 3f6b7636", + "bdc25aaa 3f47905d 3edc8748 3d558ced 3ebbc634 3e107bff 3ebbc634 -> 3f4e09dc 3eff67ce 3d9e926d", + "3fbb18e0 3f87197d be67279d 3d9cd3b1 be36f6bd 3f9313f4 3f9313f4 -> bf6db6c8 3fd5f9a3 3ffcabd2", + "bde08325 3f09a6bd 3f1d1531 3f58b32f 3e8bf6d7 3f697af2 3ec371cf -> 3f165f2c 3f05f4ca 3f5f569d", + "3e50ff6f 3e3c5e5b 3f2c76cb 3e3c5e5b bcec52e0 3f19ea73 3f6f6dce -> bd02c018 3f370af8 3eb92794", + "be9b35c2 3f6b6b64 3e986623 be54ea41 3eb451c5 3eb451c5 3f317970 -> 3f812e4b 3ec64885 bea672f6", + "3e0f4b1a 3e57ed3f 3f18381c 3f18381c 3ecfaedc 3d1e7e11 3e02da3e -> 3e3ce1bf 3eee561a 3efb1a3e", + "3f6cd9d9 3f9a6887 3f9a6887 3f81a796 3f0942a6 3f0a61d0 3f0942a6 -> 3fa2f9d9 3fa40388 3f8a38e8", + "be9c6724 3e0b2de3 3e5a5717 3ec06d20 3f9317ad 3f9af9ad be1bff82 -> be8578ae be624f4f 3f463dc5", + "3f823c68 3d8a1ce6 3f7e1ec2 3f7e1ec2 3f05778f bd9009e7 3ef2d2f3 -> 3de31d02 be2bf640 3f70b6c9", + "beb26ac4 3f5faad7 3f8fc599 3e831c44 3efc2ea7 bdc962f3 bdc962f3 -> 3f60ff6b 3fc525f6 3f2c4edd", + "3e44fa93 3f4a5362 3e69715d 3f8c541a 3f400000 3f400000 3f000000 -> 3f62f2b4 3ea5f753 3f8c541a", + "3f20f7b2 3f4ed2c5 3ebb8115 3c2314e2 3f1af9cf 3f711e90 3f8734d8 -> 3f70bf3b 3f6c01a4 3f35a406", + "3e67f486 3f911264 3f911264 be440b58 3da41682 3da41682 3ee7c2e5 -> 3f717277 3f717277 be5a01a2", + "3d3e3c7e be7e5b92 bd244444 3ec764fd be53a4d6 3dcb41b7 3f57095c -> bea0c9be bd9e5f07 3ed7905e", + "3f379ba7 3f36ec32 3f420ea8 3f271534 3f7c9c44 3f136f50 3f136f50 -> 3fb4d592 3f5def6e 3f42f5fa", + "3c798239 3d8fcd4d 3dd7efd0 3f01549d 3e8c5c5c bd83320b bd83320b -> 3d81b6ad 3db4c096 3ef9dd6b", + "3edeb459 3ef5cc0b 3f06c8d2 3ef5cc0b 3f3b3029 3f8ffa8c bdd58997 -> 3f2e637c 3f88f806 bd3ac9f8", + "bed790ca 3f91c6f8 3f22d3da 3ed4bb2c be6198c1 be6198c1 bbfeef05 -> 3fdf6a06 3f9f0cfc 3f57d351", + "3f0a65ee 3ed516e3 3eed6b7b 3f00decc bde2d214 3f21d4e6 3dba0455 -> be7a097e 3f1b4a36 3d79cf78", + "3eeae502 3e95ffc9 3e95ffc9 3e82145f 3f2103eb 3f8a81c6 3f2103eb -> 3ed29604 3f53ba70 3ebeaa9a", + "3f239885 3e3d631b 3f44cff5 3e27946c 3e134ffa 3f22e74a 3f22e74a -> be8a5bcc 3f716c14 3ead0274", + "3f082d58 3f63a5f0 3d396f82 3f845978 3ea3776f 3ea3776f 3f2066b3 -> 3f326cff be1687e2 3f9595c4", + "3f80e94a 3f2094d6 3ba21f8a 3ba21f8a 3f06189b 3f0b9a2f 3f0b9a2f -> 3f2cdc45 3dc5173f 3dc5173f", + "bec8acb6 3f8fe8c2 3ed48ffe 3f8fe8c2 3f8a8c75 3f9907e6 3e513055 -> 3f2af176 be0531e8 3fad9493", + "beb1b10a 3f4a6eb5 bdadb45f bd1c2e86 3f57b9ab 3e6ba398 3e6ba398 -> 3f0d8aab 3dd1f1a7 3e18c762", + "3fa803a1 3f59d6d1 be615f5a 3f59d6d1 3bea6414 3e88e417 3f675ae0 -> bee2c392 bf54afd8 3ff4959c", + "3f52c9f4 3f968792 bdca8cda 3f8f4768 3f15b6de 3f9bcb24 3f4d6e95 -> 3fa868b5 3f8a814d 3fcf0934", + "3f1d5ff1 3f8d6b8e 3f186989 3f83f8ac 3e9c009b 3e9c009b 3ea3bf75 -> 3f5d5e01 3eb5e0dc 3f4f3b30", + "3f95f78a 3f3acb9b 3ef3ab59 be691acf 3e0ec41a 3f0d808f 3ea8a89b -> bdec0a50 3f197933 bf209b58", + "3f51e5e6 3eef4365 3eef4365 be284917 3e800000 3e800000 3f800000 -> 3d6aebf8 3d6aebf8 3f27d3a0", + "3f362e2f 3f0fc0e8 3f4dbc8f 3df59187 3e05534f 3f1808dc 3e05534f -> 3d1035d0 3f6ff1d4 bed016b4", + "3f826608 3ef24d76 3ef24d76 3f266546 3f852a55 3f84870d 3f852a55 -> 3fc97f9e 3fc832f0 3fe01ee4", + "bed21fa7 3e1e57fe be4f9c21 3d69e91b 3f838fb4 3f0e1ef8 3f0e1ef8 -> be8ea4f2 be7df8ba 3c41dad4", + "3f9df5bf 3f5d2c3b 3c26be44 3f8d7c8d 3f5f52df 3ed33a94 3ea44491 -> 3fe438c6 be529489 3f29c516", + "3f22e865 3eeb7e5a be6bae44 3eeb7e5a 3f275b62 3f275b62 3f00a1ac -> 3f27d64a bd0d4744 3eed19e0", + "3f97bd7d 3f202c1b 3f8568a4 3f32b5a9 3df909fa bd39a6de 3db34f7b -> be8b0086 be8058d0 be8f4206", + "3f990e4a 3f027986 3f027986 bd3014b5 3f800000 00000000 00000000 -> 3fda4b0d bf2fa30e bf9e8ef0", + "3f27b8c9 3f87b504 3f87b504 3ef00ae6 bdc2d543 bdc2d543 3f955d30 -> 3e8f8f9e 3e8f8f9e 3fabdd8a", + "3e9c9142 3f6367ba 3f1591e1 be0f7e86 3f9640ab 3eeb51b4 3ed6f29f -> 3fa67436 3f0f3ee8 be41b56a", + "3f9bee4e 3e4c1fd4 3ebe4ea2 3ebe4ea2 3ea443df 3f9c63cc 3f9a0bc7 -> be72e292 400856af 40057bbc", + "3fb223e7 be39e815 3f16e5e2 3f16e5e2 3f154b6c 3e1751c3 3e0812b6 -> 3d4cbb14 bec82bb2 bedd63a8", + "3ed282fa 3f50c43b 3ce4b332 3e7283cb 3f478253 3e772879 3e99a5ef -> 3f85c8dc be3d31e8 3d945e98", + "3fa7c425 bc195587 3e94b1ee bc195587 be1e6606 3e731b17 3ebf0321 -> bfdcddc6 becbbcc4 beaf25ae", + "be4b5fa9 3f1d9784 3f906324 3f7a5a9e be3323d3 3ee3a63e 3ee3a63e -> 3f62397a 3f9333dd 3f7ffc0f", + "beb697f0 3e23d2c5 3f7b31b2 3e23d2c5 3e66f77e 3eb46011 3eb46011 -> 3eb622ce 3f8b14ff 3e87d9f9", + "3f29b2d8 3f866643 3f866643 3e460abb be1ef75f 3f23ea16 be1ef75f -> 3e39a600 3f9e34e3 bf2ce057", + "3f3302a2 3d43edc2 3f130d20 3f130d20 3eaec27d 3f325740 3f325740 -> be323ff2 3f59742c 3f59742c", + "3f5e92dd 3f74e885 3f8f9aa9 3f8f9aa9 3f19b828 3f19b828 3f930d2c -> 3f90d0b6 3fa5f71d 40100266", + "3ee9eb4f 3f69bad9 3b847903 3b847903 3ea74dec 3e7889b9 3f91025d -> 3f41350c be6c990a 3f15142c", + "3e878adf 3f6fff00 3f50ea13 3f6fff00 3ecd9a2f 3e3b8907 3ecd9a2f -> 3f62a77c 3f25f763 3f62a77c", + "bdca4e22 3e8c758c 3e8c758c 3f456072 bc50a74f bc50a74f 3f8985f5 -> 3ec052dc 3ec052dc 3f285360", + "3da281fb bdb71632 3e8c0e49 3eda8d6d 3f85c77c 3e81bfae 3f174fb9 -> bb3cf100 3e700a2b 3ee1f392", + "3f085467 3f7f32c6 3f7f32c6 be43b2e3 3f6aa31d 3f24b94a bd0d4970 -> 3fb86333 3f9327ee bf42a8d3", + "3f7e7142 3efe31a3 bd0643d1 bd0643d1 bdead501 3f99cb60 be3dd66b -> bf39b23e 3fae4ce7 bfb2966f", + "bc8c65df 3ec166e6 3f8ca3fe 3ec166e6 be5a6bfe be5a6bfe bdf2b655 -> 3ecdeb94 3f8fc529 3ecc41b5", + "3f6c4087 3f4e824b 3f4e824b 3f11bd23 3ef7f13a 3f42f351 3e9698ab -> 3f4712a5 3fa50a54 3e41dd3c", + "bee191e3 3f9397ce 3f65fc27 3f9397ce bdb9e12e 3f155c53 bdb9e12e -> 3fd638d4 3f5329d6 3fd638d4", + "3fa1c89e 3f051013 3f9ae9a6 3e76e014 3f4d846b 3f946df6 3f8d12f5 -> 3fa48216 40382b76 3fe1b14c", + "3ec4398a 3ede87c6 3e1a1947 3e1a1947 3f217fa7 3bac1f4d 3bac1f4d -> 3f08f126 be6a3a59 be6a3a59", + "be9a7dcf 3f80311d be0f305f 3ec917bd 3ecde0fe 3ecde0fe 3f18c408 -> 3f87c0ef bda5639a 3eab338c", + "bea32b06 be1ce8cc 3f746216 3ea648a6 3f8ff7fc 3f8ab73e 3eec78a0 -> bf0d2adf 3f1523a0 3eb2bb20", + "3f4de8c5 be407072 3f04b549 bde6c56e 3ddab12c 3f425329 3ddab12c -> bf520b34 3f6f6716 bf3ec7c5", + "bcd1eee0 3f210952 3d6e97be 3b170611 be06303e 3dbb74bc bd21adc0 -> 3f2950f3 3da22c04 3cf56259", + "3f92bdd8 3f43a604 3eef4185 3e8021c8 be5f932f 3f800d32 be5f932f -> bf61fd6a 3fceac7a bfb2c945", + "bd72ab5d 3eee50eb be1d2a3d 3f87e9f1 be643281 3f8a9006 3ed5563d -> 3f0d15af be63d84c 3f892d79", + "bec5da7b 3f40f155 3e4df590 3f8bb7d7 3f63a9ea bc5f33c7 be3372d4 -> 3ee7d50b 3f191ca7 3fce8486", + "3f008b39 3eae9615 3eae9615 3e8900a8 3f567874 3f567874 3f560868 -> 3f2e218c 3f2e218c 3f1ae650", + "3e9cba3e 3ea908cc 3e8a98cf 3ea908cc 3f0cff29 3f2b90ec 3f9ca004 -> 3eb8f2af 3ebff0d2 3f45ee30", + "be4b8176 3efeb6e7 3efeb6e7 3f75cb8a be252d90 3f8794a0 3f8027d1 -> 3f42a5a6 3e8ce8cc 3f42cb86", + "3f8e57a2 3eefdc1f 3f0f8c8a 3eefdc1f 3ea66b05 3f3dcda0 3f388435 -> 3da27ba4 3f8c80b2 3f75a0c8", + "be44ef3d 3d34e948 3f6081f2 bdae14f7 3f8a7358 3f4f44ce bd1ab354 -> be37dd39 3f420491 3df989f9", + "be7ee290 bdb793de 3f3ba045 3e710359 3ed45855 3f8f2f55 3f3b2c64 -> bd414bc3 3ed99275 3df65d0b", + "be857b10 3f8deb4f 3f8deb4f 3eb2d419 3f800000 3e800000 3f400000 -> 3f591916 3f9e9ab1 3e602d22", + "be01bbf4 be2c5bb2 be2c5bb2 3f2c572e 3f9bd6b3 3f9b6340 3f22b7ed -> beb34314 beb2ce10 3f238b18", + "3f3c3748 3f989976 3eaff620 bd9c2176 3f882c4c 3f882c4c 3f77ffd6 -> 40015cd9 3f961dc4 3f1cef67", + "be5a2fdd 3f3a9eae 3f3a9eae 3eb525e1 3e800000 00000000 00000000 -> 3f55e4aa 3f712aa5 3f111ee8", + "3f9cafa5 3e6ae43c 3f404356 bd87cb04 3b5048fb 3f40b1c8 3b5048fb -> bf7ca84d 3faf531d bfa42d5e", + "be838a0c 3f921c1c bcdff13b 3f2d30c5 39ee4dbb 3e9b74a0 3e9b74a0 -> 3fb2f6f8 3d96a9d9 3f47058a", + "3f59f40e bddbb55d bddbb55d 3f3dbd0b 3de9ac68 3e5804bb bdb12aa9 -> bf43ae40 bf1975c0 be83d90e", + "3f53ba39 3f55022d be673e0c 3f55022d 3f13751f be2dfacf 3f9541e5 -> 3f75318d bfaabdf0 3ff787c0", + "bdac0f83 3f5a6219 be4c050a 3f90a785 3edf852d 3f875035 3e19bb06 -> 3f5d1ca9 be95f0bb 3f982de5", + "be874c9d 3ef02d1a 3ec3e4fe 3f485cfa be0b5909 3e452915 be0b5909 -> 3f4e2646 3f0b8be3 3f8f3659", + "3f96933f 3d79eb1a 3e2b9ecb 3f59f8fe 00000000 3f000000 3e800000 -> bf8ec3e6 3e2b9ecb 3e86cb7e", + "be8f0005 3f2f5f51 bd247fbc 3f84d846 3f67bcf0 3e60769e 3f997813 -> 3eead98a 3deefba8 3f25bc64", + "3f987fbe be30b1e2 3f9bb3a4 3f9bb3a4 3f09a5f4 3ef38a30 3ef38a30 -> bda97898 3f944779 3f944779", + "3fb2a799 bde7a710 3f975e91 3eba458b be161627 be1911a0 3f2ad98a -> bff580df bf216488 3f54c004", + "befe9b3c bd907bda 3f0e9ada 3f8d4297 3e800000 3e800000 3f000000 -> 3e365d4f 3f4e41a9 3f8d4297", + "be80c2fc bd4f1000 3e36a6bd 3f5671cb 3ef105fc 3db4bcde 3db4bcde -> bd12ccae 3ec55c54 3f85bb23", + "be158200 3f19a24a 3f5f52eb 3eab65e2 3f800000 00000000 3f400000 -> 3ee88394 3f8259b6 3e860562", + "3eab6340 3e89b052 3f57d967 3ea1596a 3e34cb3a 3f67fda2 3f01fab8 -> 3d568ff0 3f8ebc12 3ea3ffe5", + "3ec51ff7 3f5f7b4a 3cd2588f 3f8b5836 3e4fa742 bd7df5fd bde151b2 -> 3f24e4b7 bed06c2e 3f1e7070", + "be3edab2 3efd03ef bd9331b7 3e00a473 3f8c839a 3e77e719 3f67d387 -> 3e8aeddc 3cc6c988 bcd15770", + "3f1ad9d4 3f873397 3f70acc5 be3d8513 3f84e95e 3d46f50f be56df77 -> 3fda91a2 3ec9bc10 bf859bdd", + "3d65e6ce 3f01cd8c be1b850f 3f7635f3 3eec3af6 3eec3af6 3e917593 -> 3f00b17b be1ff554 3f70019b", + "3f4b6fcc 3f6adc3c 3eaafb6c 3f20ca02 3eb32e86 3e9ff41e 3e9ff41e -> 3f2dd094 3d12a580 3ea8ed48", + "3f84df5f 3f79a7ed bd108663 bd108663 3e2aa053 3e2aa053 3f28981a -> 3e90f176 bf3a3798 3e967dfc", + "becdce5c 3f397616 3f340839 3f397616 3e918551 3e9c71f5 3f903839 -> 3f65debc 3f5c0cb8 3e61eadc", + "3f8b0fe8 3f8083c1 3ea377cb 3f1fb6ec 3f000000 3e800000 3e800000 -> 3f8083c1 be65500a 3da53820", + "bbb34399 3f2ef807 bdd9ec77 3f3c1f1c bd878411 3df4491a 3ec17d37 -> 3f308e01 bdd1647c 3f3c76a8", + "3fad3908 3f4c7f91 3f327280 3f4c7f91 3f510d6b 3d0ddcd3 3f3ed48e -> 3fd3f008 bf10001c 3fbb470f", + "beed37c9 3f6d909e bde10624 bde10624 3f52a9b7 3f8bf6a0 3ef521d6 -> 3f20f77c bf28e884 bdb8bdf8", + "3f6a2e2a 3f7a9bcd bd212987 3c3dced0 bc5bbca0 3e9ec8e5 bc5bbca0 -> 3d225940 bec600fe bf6d7efe", + "3ed87ec4 3f93a4f6 3f9d27f9 3d8980f6 3f04227b 3f6ca49a 3ec2b287 -> 3f956488 3fcb1850 bd0bbbde", + "3f0ca921 3f6fc28f 3f1da7a0 3eab3c7c 3e201bc6 3f57bfd5 3e5d5fc5 -> 3f0f15ea 3f7e1563 3cb8cda0", + "bd8a80c1 3f7df6fe 3f7df6fe 3f9d1095 3f7802e8 3f7802e8 be28835c -> 3f6dbb83 3f6dbb83 3fa891fe", + "3eafd8ec 3ef3805e 3f26cb36 3ef3805e 00000000 3f400000 3e800000 -> 3e074ee4 3f52c171 3e9b93e8", + "3f58860b 3d6bba0e 3f2dde5a 3f2f6161 3ede8b66 3f02c1ad 3f8ddf8a -> bd590458 3f328811 3fdb6b76", + "be81f623 bc8e409d 3f279a32 3f572b5f 3f4d81f0 3f1e4fa6 3f57ae28 -> be2f2c12 3f1836eb 3f2aa850", + "3f926ea8 bde69014 3f8732ab bde69014 3ede328a 3bf533d8 3f2d8be0 -> be86fb2c bd90af70 3e96c7a9", + "3e9c2502 bd867a8e 3f3bd9b7 3f8b9eda 3f000000 3f800000 3e800000 -> bd867a8e 3f84f61c 3f703474", + "beffc377 3f57262c 3f57262c 3f796c75 3eb0b75a be7e84c0 3f59be6e -> 3f7ec11f 3fcb4d06 3f1fc340", + "3f86e0cd 3f341ca1 3f341ca1 3f64ea5b 3f800000 3f800000 3f400000 -> 3fe0ef1e 3fe0ef1e 3fb5e594", + "3e48df1f 3f5b7e9c be7d1a7d be7d1a7d 3f400000 3e800000 00000000 -> 3f749a80 beb0c506 bee2fcce", + "3f85e71e 3f909a86 be7c4250 be7c4250 3d88acbc 3f659480 3f97361e -> 3e649584 3f1576da 3f96ef1d", + "3f2d0ac8 3f8191f4 3eeb75be 3f8191f4 3ee03f64 3f25825b 3f7dd29a -> 3f6dad68 3f287037 3fd69e92", + "be8e02ab 3e5ba730 3f954f2b 3eeda069 3f77448b 3eb1b563 3f01d481 -> bd33f778 3fa02ab8 3eeb98a0", + "3ed6a5e1 3dd63c77 3f6ab1a2 3f6ab1a2 3e66041a 3e66041a 3ed7e2b9 -> be01510e 3f2f95d0 3f59e066", + "be9df5d3 3f648fbf 3f555e31 3f555e31 3e2fb91e 3cc0cf19 3f543d65 -> 3f8c37ac 3f9050ac 3f2163a6", + "3eef99c2 3cb7bc17 be01a050 3dc6fad5 3f000000 3e800000 00000000 -> 3cb7bc17 beb89d09 bebddb0d", + "3f499ded 3f360d5f 3f8a0c3e 3f286040 3e8d94af 3f1ac768 3e8d94af -> 3eb7e10d 3f9f2354 3e9c86cf", + "3d15d67b 3f43fa3a 3f0f1726 3f17cbba be2ca77b be5d65cc be2ca77b -> 3f377461 3f01ad10 3f0b45e1", + "bdd165a2 3f5cee96 3f967acc 3dbe65d6 3f7e505b 3ac5ffce 3e87be0e -> 3f431a26 3fa38707 3e1061b5", + "3fa23e6d be616605 bda9e63a be616605 3f55d261 3f55d261 3f895728 -> 3f2136bb 3f445375 3f9dbf66", + "3f216eb6 3f2ab06d be16186b be754252 3f34f716 3d74aa99 bbf3afdb -> 3f6d7d06 bf33abae bf6125f6", + "be202fd7 3f8a4ab2 3f890d26 3f6cf643 be30e2d6 3f3ab460 3f3ab460 -> 3fa53b9a 3f7fbc72 3f5a9869", + "be70f9dc 3f11946f 3f99f215 3e3e9d3f 3f400000 00000000 3f400000 -> 3ee6ea67 3fb81150 3d8c40a2", + "3d77acc2 be61e1e4 3f115e5f bddd13a4 be7eb20e 3eef7ea4 3eef7ea4 -> be9f4d25 3f105ee0 bde50f9e", + "3e9b5f2c bde8477c bce7c697 3f869f70 be567500 3e8588bb 3ee69767 -> bf0b42aa be31a04f 3f82c47e", + "3f12a488 3ed24e09 3f99b4ae 39362571 3f400000 3f000000 3e800000 -> 3f327948 3f99b4ae be928dc3", + "3f5d7b3b 3da440b1 bbf74931 3da440b1 3f9ed402 3f20aac2 3f094e40 -> 3fae5962 3e5a5ece 3e128898", + "3f5ec531 3f4f4410 3c72c476 3ea9dd97 3f9690da be492c0a be492c0a -> 3ffe4a9e bf9940d9 bf615df8", + "3ec30935 bdd64940 3f10dd74 be48432d be225563 be225563 3f81c11f -> bf1b38fb 3d836d08 3e488093", + "3f874cba 3ecaae63 3ecaae63 3f51eac4 3f887903 3e9b5c86 be6c3e09 -> 3fcbe1be bca13190 bf398a34", + "be0a635b 3f502e6f 3f502e6f 3e1a9416 be46a37a bddd69ee be46a37a -> 3f8019b6 3f7a4256 3ead5406", + "3f5b0ae4 3d345121 3f65f8a8 3ee782e9 3f985798 be1ddc6f be1ddc6f -> 3f9ccfeb be626d88 bf2ad296", + "be7984ee 3d4965ab 3f6a394d 3e93fa56 3f534d4c 3f8537ef 3e832ef5 -> bde012ea 3f26c1f4 3ed0ce68", + "3f5eb370 3f6a687c 3f72829d bcd5f56c bd751547 3f0e2614 3df16129 -> bd6f17b0 3f85903f bf30e43f", + "3e8b7bdf 3bd81e9c be35cee6 3bd81e9c 3e266bf4 3f9b3c18 3f9b3c18 -> be3589a5 3e57df4e 3eca3794", + "3ecaec43 3f6a5c0c bd57b69b bd57b69b 3eb393a2 bdad857c 3f4e6011 -> 3f4c1207 bf0422fb 3e4292e3", + "3ed126f9 3f9e6b58 be3ca00b be3ca00b 3f612d68 3f3ec059 3eb09764 -> 3fc61dc6 3c839270 be9f3084", + "3e3833f4 3f0a5360 3ebe502c 3f065379 3f0dec42 3f303533 3efb7905 -> 3f0f55b1 3ee10031 3f0582fd", + "3f78661f 3f47a214 3f47a214 3f98ad17 be35f3c1 3f27691a be072eb6 -> bf090a66 3f8a0e94 bd0a1880", + "3fb342b2 3f60a9f9 3f97b4a5 3f1b807f 3f4daf95 3ecd0138 3ecd0138 -> 3fdd2102 3f67fe6c 3ea82b42", + "bed7fce2 3ec94666 be17ba7d 3f534c0b 3f891ec3 be4384f9 3e327678 -> bdb5f770 3ede9a8c 3f8cd305", + "3f4ef5b4 3e6d6263 3f9ad74d 3e89d83d 3f7e4ca2 3f7e4ca2 3f275cf3 -> 3f83c72f 40007918 3f049145", + "3fb74a53 3f015622 3f015622 3f3e6a0f 3f800000 00000000 3f800000 -> 3ff7f564 bf6d3e84 400b3fad", + "3e6dbe3e 3f8720d7 3f8720d7 be7482b6 be1b85a2 be1b85a2 3f21505f -> 3f40c456 3f40c456 be36a263", + "3edc6839 3eedb0f2 be058278 3f823026 3ecbb267 3dcad378 3f905cfa -> 3ec0a8f7 bef38161 3fc760c4", + "3f4f2f10 3ed64777 3f03c1a8 3f4fb0da 3f04dea9 3e3de6be 3e3de6be -> 3ee60b36 3bb56b00 3e9ab410", + "bef4f5fb 3eee45da 3e80f84d 3eee45da 3f2d304f 3f66fd49 3f6c2fae -> 3e97caec be0840e2 3d79d878", + "3f56389f 3f42bf4d 3e246ff5 3d27723c 3ef39285 3f200d0d bd304ec4 -> 3f385908 3ebd7ff9 bf5e3295", + "3f0e08ae 3f8cd9d1 3f8cd9d1 3f95a869 3e7ca1d9 3f381a7d 3f084826 -> 3f51c020 3fabfa69 3f9a40b6", + "bda98010 3f0a66fa 3f8581cf 3f0a66fa 3f000000 3f400000 00000000 -> 3f0a66fa 3f8035ce 3f1f96fc", + "3f00de16 3f9b428f 3e8456a6 3e8456a6 3f35a77a 3f35a77a 3f72e399 -> 3fb644d8 3ef05fca 3f35d642", + "bd16d67e bd8220cb 3f8f8ed3 3f039f64 3ea3d613 3f811c65 3f85a57e -> bd4df3cd 3f8ac32d 3ef2ba1f", + "3f1476a9 3f0012c4 3eb426d4 3f0012c4 3e1e74aa 3f46d37c 3f46d37c -> 3dcc746c 3f2c399a 3f5238f4", + "bee24664 3f662413 3f3a60b1 3ea22b05 00000000 3f800000 00000000 -> 3faba3a2 3e927afe 3f4238b4", + "3f67db64 be13dca9 3f50fdea 3d80819d 3df9a84d bd2f0ced 3df9a84d -> bf544b5a be2abb40 bf1f43fc", + "3d657db4 3eb59cd6 3d1f1e56 3d1f1e56 3f5d3cda 3eb155b8 3eb155b8 -> 3eca8224 3cb132c6 3cb132c6", + "3e93c7f1 3f90a8c1 3eeb717c 3ec0b403 3ecf9b0d 3d6d8123 3f49e228 -> 3f89acd0 3e5199c0 3f0b0093", + "bec239ed 3f34bcba 3f34bcba 3f1203e9 3f402aba bd8ec1ba be0b8df0 -> 3f040dd4 3f91b1ca 3f86cc94", + "3f4e3fd0 3f2adb54 3f33963e 3f33963e 3e800000 3f400000 3e800000 -> 3e8776d8 3f8d5b13 3e98ecac", + "bed479c6 3ecc8c4b 3e9d78c8 3f75d677 3f9052a0 3f1d08dc 3f9052a0 -> bdf878ec 3e5a8cf8 3ee10268", + "3d8c7302 3bd1cd0b 3f28acec 3f67821f 3f4fc637 3f75073f be6a8aba -> 3d494a94 3f38ba0e 3f4de8eb", + "bddc553a 3e5b4df3 3f7f47ff bd1b284a 3f1009b0 be259494 3f61c05b -> 3e4d8049 3f91dd6a bdf5d7d7", + "3ea4c311 3f9d6b63 3dddcdea 3dddcdea 3f800000 3f400000 3f800000 -> 3fc69c27 3e89d503 3edc368c", + "3f43fb37 3f57e08f be716188 3f4cc1f2 3ddf24f0 3f9d9753 3f4fbd75 -> 3e7a697c 3f62400c 3fa36c89", + "3f3556ec 3f8fe1ee 3f8fe1ee 3f9b716d 3f9ec8cd bd5f729d 3f9ec8cd -> 400b151f 3ead47e6 4010dcde", + "3f2c13cd 3f8a8e09 3f8455c0 3f8455c0 3f424d09 3ed1e144 3e70e847 -> 3fb71eec 3f69ab48 3f2d8f0c", + "be814e2e 3f053a58 3ed78192 bdc8f56c 3e7e96bd 3f841623 3e7e96bd -> 3f25bb82 3e1be390 3cec4f90", + "3f6b0b79 be3b5fe9 bda0220b 3f98128c 3f800000 3e800000 3f000000 -> 3f3c337f bf0989fe 3f98128c", + "be9ab7e0 3f4de67a 3f255676 be4bb7a7 00000000 3e800000 3f800000 -> 3f8da135 3f4c046e bf0049da", + "3cf31773 3f0bf5ed 3e20d787 3eb03334 3f800000 3f000000 00000000 -> 3f138ea9 3e20d787 3ea101bd", + "3f8a0e7f 3e8b2d05 3e8b2d05 3f7e8cfc 3f27414b 3f2d3314 3ea65b2f -> 3f1a4430 3f2716e2 3f1ddd24", + "3ea04649 3ef0d5d7 3f6f491d 3ef0d5d7 3de97530 3de97530 be350a6c -> 3e6a33c7 3f316b23 3d3f1b90", + "3f26e16d bdd32c78 3f9e4ea9 3f9e4ea9 3e7b4851 3e7b4851 3e55c47e -> bedebfcf 3f67a2fa 3f5b68b8", + "3f8c0842 3f31a69e 3f31a69e 3ea224ac 3e800000 3f000000 3f400000 -> 3e167970 3f31a69e 3f5d1a98", + "3f91d3ba 3f65cd1e 3f65cd1e be6dfcdb 3f9de436 3e9f0798 3f1be3ac -> 40246b1c 3eeea6a4 3c819bd0", + "be875c92 be31d96e 3ce504f4 be31d96e 3f356ddc 3f262f44 3f873c86 -> be916d39 bd508940 beef976b", + "3f8348a2 3e0e719f 3f5c7787 3c4a3d49 3f7e0bfa 3f7e0bfa 3cd49cab -> 3f9315fc 3fef838c bf75c73f", + "3f1a3fcb bd246469 3e5fdafd 3ec96955 3f90f378 3cb8a149 3cb8a149 -> 3f38d442 beb6aa36 be3a5cbe", + "3f931c20 3f3b0506 3edd27b8 3edd27b8 3f2a70c2 3ddff8e0 3ddff8e0 -> 3f8e4955 beee9444 beee9444", + "3ded1031 3f3edd3a bd60e729 3f3edd3a 3f8abae8 3ef78b81 be35204a -> 3f61771c bd708fee 3f16bf8e", + "3f066746 3f8156bd 3f8156bd 3f78698a 3f400000 3e800000 3f800000 -> 3fa2f08e 3f3f79d7 3fbf6868", + "3f4410f9 3f6b4597 be184a60 3f94b5b9 3f9593be 3f9593be 3ef7cc0d -> 3ff8b860 3f601890 3f919190", + "bea8ac30 3f741a84 3f1de496 3f838113 3f063af2 bd5bbf65 3d522860 -> 3f6fffa4 3f7b4744 3fa95860", + "3f51b1c9 3f5315f2 3d89dfcb bdf76adc 3e904b44 3f3fef96 3f17b93c -> 3eef2ba2 3ef3f3f4 3cfe0178", + "bcc97200 3f9536e0 3f591bb4 3f8339af 3f23dec9 be77a798 be77a798 -> 3f945511 3f6272c8 3f87e539", + "be1be27a 3cef8f3d 3cef8f3d 3ede6f0a 3f443364 3f847af3 3f8474de -> bd5473fe be08da31 3e8b1066", + "3e686c22 3f88f534 3f7b5f0f 3f73291f 3e630970 3da77a4a 3da77a4a -> 3f71936e 3f4ac4e0 3f428ef0", + "3fa58f79 be4cd5ff 3f993b74 3f60425e 3f12802a 3f9f2906 3f12802a -> bc566680 4047b346 3f880f22", + "3f9e4f1e bd08985e bd08985e 3f4e4282 3d8fd921 3d8fd921 3f0f37c8 -> bf8c56c3 bf8c56c3 3f73e708", + "3e606bbf 3f90fd21 3f2edd76 be4f9458 3eafce7f 3f3ef217 3ea7314f -> 3f88337f 3f4a749f be8eb74a", + "be587681 3f1411ad 3ca7a590 3f1411ad 3e097c3b 3ba8cf64 bceee13b -> 3f3ba73e 3e6b303e 3f4d5740", + "be8806f3 3f60b2cb 3db5d5f2 3f507643 be0de40e 3f3a86cb 3db9d5d3 -> 3f9bc7c2 bd05e744 3f8410f4", + "be088028 3f28c74c 3d9eedd7 3e91fe89 3f725883 3f776a02 3f888e25 -> 3f0a4b2a bd3f8518 3e093dba", + "bceb4c9b 3f8bcaba be30fbd6 3f7cec9b 3f1e883f 3e1c7b6d 3f1e883f -> 3f8aea38 be1c8f85 3f7b2b98", + "3fb874a5 be0e1b7e 3bda6677 be0e1b7e 3f4c2216 3f85d163 3f57816d -> 3f37e5e2 3fca13a2 3f58acb6", + "bed63cf7 3f1825ea 3f670388 3f670388 3f0bfab0 3ef192e1 3f882b66 -> 3f0e1f81 3f6d0cdc 3edc7134", + "3f6cf585 be019acc 3eee1264 3ece3774 be5069e2 be5069e2 3f846c6a -> bfb6e87c bf566112 3fb238ff", + "3fb5979c 3f54eac5 3f92623e 3f54eac5 3f3cdb1b ba4a3907 ba4a3907 -> 3fc0cb4c be8df45c bf16d3e5", + "3f89a439 3f9db60e 3f710b1d 3f710b1d bd210a6b 3f751eb9 bd210a6b -> 3d93f180 3ff676b4 be5f8b3c", + "3f1f0d06 3e2599fe 3d972609 3d972609 3e4f4622 3f97253c 3f97253c -> be550be4 3f6b76fe 3f6b76fe", + "3eac41f0 3e46edee 3f93680d 3e46edee 3f92e01d 3f92e01d 3efb1c16 -> 3f214354 3fcb2bf9 3e405927", + "be7e0973 3f2c94bc 3f237d20 3f237d20 3f9d7b94 3ce74c05 3f9d7b94 -> 3e9fa158 3f5f6965 3e8d7220", + "3f8e9ffb 3e8f6349 3e45db8b 3e8f6349 bd5f35bb 3ea43a82 3e5d61e8 -> bf74a526 be532ba1 beb46f53", + "3fafbcf1 3f055b2c 3ef306a1 3edc20c5 3e080c2c 3e3a7c91 3f8558c1 -> bef973f4 becbe391 3ff5739b", + "3f412301 3f712885 3ee1f587 3e2eef31 3f22952c bd84d12b 3f414a88 -> 3f92ab73 bed26a67 3f0e4008", + "bef706fb 3f2ff7b2 3f176108 3f0bac5c 3ef755d5 3e8cb864 3e8cb864 -> 3f3425e8 3f4effa6 3f434afa", + "bea21f00 3e28e9a9 3e28e9a9 3da3bbbd 3ec9be03 3f2b2602 bdf38f0f -> 3e6da251 3d6e7236 3ef19d71", + "3f0ee36c 3ca74b2c 3f1af69c 3f822fa0 3f54f37d 3f1d2f90 3f48b391 -> 3ec81ecf 3f3b8b3b 3faac3d0", + "3fb64cec bc8d9532 3f4b1464 3f80cf29 3e800000 3f000000 3f000000 -> bf3ab996 3f4b1464 3f80cf29", + "3f93ddb2 3f46be05 3f4458d3 3f1ad27d 3f2f2704 3eea068c 3f8be549 -> 3f99d77c 3f2af648 3ffcc2ca", + "3f8ca014 3f673cdb 3f673cdb 3f8cfb97 3e90a7fa 3e97e5f1 be29f9e1 -> 3ed9d2aa 3ee9bc54 beb94fd4", + "bea390a2 3eb3c2ce 3eb3c2ce 3f38ef19 be7b0ebe 3ebcff1c 3ebcff1c -> 3f53c3c7 3ede923a 3f4e56cf", + "be7ce71e 3f8c550a 3f7e4f0f 3f545ee7 3eb1c579 3e09e9a8 3eb1c579 -> 3f95fe12 3f964083 3f67b0f6", + "3f8571a6 3f84357c 3f84357c 3d3567b0 3ef38d42 3ebecc5c 3f35a53d -> 3f7b70b1 3f44716c 3ef66241", + "be978379 3ea23f09 3f71278c 3ea23f09 3f505699 3f505699 be5bf4b5 -> 3e064cb8 3f419b36 3f3d6cd4", + "3dfd0301 3f11e4aa be3cabc0 3f894ea4 3f62755c bd8da75a 3f62755c -> 3f2a3873 bea656a1 3f957888", + "3f97441e 3f100f72 3f100f72 3d214205 3db7662d 3ef6fab4 3f38d40e -> bed09384 3f056665 3f1064ed", + "3ef18bac 3f69d39c be7342af 3d1b1171 3f800000 3e800000 3e800000 -> 3fb14cb9 bef2672e be4ac750", + "3ecd20b0 be52786a be52786a be2404a4 3e87b6dd 3e2fef15 3e87b6dd -> bec99e22 beefe070 beb2643f", + "3e65248d 3f9ae9da 3ee09a03 3f940e63 bd8c08c5 3f43d453 3f59bef6 -> 3f74b513 3f0ea850 3fa8238c", + "3ebf38ae 3f94c3f8 3e2af096 3f3f28ee 3f666666 3f666666 3f666666 -> 3fbb0281 3eee726f 3f85d300", + "be0a8b89 3c958ff6 3de058fb 3de058fb 3f9e91fc 3dacba1a 3eca0a9e -> be3a06f8 3e635969 3e0d602e", + "3e409be5 3f62c80b 3f9a58d8 3f62c80b 3efc80b3 3f9ae8e6 be617112 -> 3f621fa4 3fbc8bdc 3f1d6d4f", + "bd173e8f 3eb6342b be62d20f be598498 3f800000 3f400000 00000000 -> 3ea34c59 be75b9e1 be33b4f4", + "3f962355 3f95a053 3f83eb17 bd0f39d9 3f9baab3 3eb4b13b 3f952653 -> 40365581 3f2f8116 3fc34706", + "3f74461b 3ed7fcce 3f485ef3 3e974251 3f400000 3e800000 3e800000 -> 3f662174 3e9c77cb be3a0794", + "3f9fa9cc be467bbc 3ed929bb be467bbc 3f5b4d92 3f5b4d92 3ea7ad2c -> 3f322804 3fa82de8 bf1fcafc", + "3f5a6388 3e02fb11 3df96e6c 3f9d3549 be3aac29 3f5fda41 3ddafdeb -> bf84a22d 3f42b80c 3f0ebb62", + "3e1374a1 3f47f92b 3f454f5e 3f454f5e 3f800000 3f400000 3e800000 -> 3f6cd653 3f57bdf2 3f32e0ca", + "beb09a7b bd64d035 3f2049e4 3f999162 be1282ae bd25911e 3f96d1bc -> 3ec68995 3f7fba9c 3f3b599a", + "3ea60298 3f29491c 3f8f4c4f 3f08c166 3f800000 3f400000 3f000000 -> 3f7c4a68 3fa40ca2 3f08c166", + "bee54cf2 3e102bc2 3f74c9f3 be74dfd5 3dc6863f 3f4c773e 3f4c773e -> 3f007731 3f304c4d bf01b59b", + "3ee25fcd 3e896e6c bdc4ca80 3e3c87be 3f7aa30f 3e3083e2 3f7aa30f -> 3f31290e bec5872f 3f1b93c8", + "3f1bf86b bdf117d2 3f896aa4 3f896aa4 3f562e32 3f187d98 3ea5181d -> 3e95c070 3f985673 3f5b72ab", + "3faba589 3f41c313 3f41c313 3cd0e4c8 3f0a8727 be4991e9 3f94b6de -> 3f5dff6a bf8e5766 3fe67749", + "3faaff8f 3d7954fe 3f3287da 3d7954fe 3f60cb08 be414fd0 be414fd0 -> 3f89198f bf924b9f bfe3c4e4", + "bd4519b0 3e96df07 3e96df07 3ec5034d 3f000000 3f800000 3f000000 -> 3e96df07 3e7c77a2 3ec5034d", + "3f4b895a 3f11b560 3f7afb18 3f7afb18 3e46b302 3e46b302 bc1fb1ef -> 3da94a68 3efcde0a 3e2de7fc", + "3f3f5b68 3eb5bd96 3eb5bd96 3f35b9c5 3e800000 3f400000 3f400000 -> bc99dd20 3f3a8c7f 3f8ab3bc", + "3fa5a1f5 be3bd289 3f84a3d8 3f4eb306 3e1889dd 3e1fa78b 3e3c7918 -> bf8bc399 3e153f10 bc27e6c0", + "3f838acb 3f80d9bf bd8c9d5e 3f80d9bf 3ed154fd 3f9a2bda 3ed154fd -> 3f51bdde 3fb08b79 3f51bdde", + "bedfaf90 3d7f4840 3d5eb5f8 3d5eb5f8 3f489869 3f489869 3f62d664 -> be3de822 be460cb4 be90e254", + "3f601cb3 3f89fee8 3f901570 3f725d64 3f706d6e 3f98418a 3f98418a -> 3fec6b43 40154df6 4009da96", + "3f364c4d 3d973df0 3e0895ed 3d973df0 3e868110 3ea04b0b 3ea04b0b -> be87396e be0806c5 be44fdba", + "bd8210b0 3f21656d 3f551985 3dd91075 3f300d9c 3f300d9c 3f8c4c10 -> 3f1b4aea 3f4eff02 3cf80840", + "3fbc5d44 be3ebae7 3e9ffbfd be3ebae7 3f5e7864 3ef6dc5b 3f5e7864 -> 3f665c98 3e8515f7 3f665c98", + "3f06c611 3f8beca2 3e9783ce 3e274a56 3f8166a3 3e983b97 3e983b97 -> 3fd0c948 3da9067a bd4ce824", + "bd779e2b be3e668f 3dedb4d6 3dedb4d6 3f79bd4d 3f79bd4d 3f9efed2 -> be7946fd 3d6fe7f3 3cd7bee8", + "be2cd2dd 3f34d90e 3f8a573d 3f9e9303 3d884890 3d884890 3f93cd3c -> 3f5a4db5 3f9d1191 3f82498e", + "3f0d31ab 3f9e9fe6 bc6a075d 3e9d90a2 3ee6f064 3ec2f17a 3e93b11e -> 3f97b6ab be1553d7 3d985ed8", + "3d7326eb be73aa0f 3f2d4e3c 3eaaea96 3f922e90 3f922e90 bdcb8aec -> be259b5e 3f40d1e8 3e867b1a", + "bdf2277d 3f21b343 3edaafe3 3f4dbfd8 3f3a5a97 3e92805d 3f94ce68 -> 3f13e69a 3ef494c6 3f25a3be", + "3f29b6c5 3f951279 3ef66cf0 3ef2a8eb 3f84b01d 3f84b01d 3f630e5f -> 3ff02514 3f98add6 3f7caae0", + "3f8a6f81 3f165eb2 be4c6eb7 3f85a447 3ef744e3 3ef744e3 3eaaff8a -> 3f0ced5c be723410 3f2f5a02", + "3f32e56b 3f99e0b0 3ee7e143 be1071d2 3f9b4bc2 3f647bd5 3f647bd5 -> 400cbcd6 3f803078 3ed0a7b3", + "3f840f12 3f5c45ff 3f97e34b 3ed1ca3e 3d241ba8 3f7d61b0 3d241ba8 -> bdb57150 400c9f66 bf0a0f0a", + "beadbe52 3f13192d 3f13192d be6ac971 00000000 3e800000 3f000000 -> 3f69f856 3f3e88c2 be6ac971", + "3d760cb0 3e574ff4 bdcc3ce8 bdcc3ce8 3f91529e 3f435c7f 3f0bf3ab -> 3e92bcb0 bd8b7eb0 bdc0c02a", + "3f09c493 be55033b bdff58da bdff58da be238bbd 3f869351 3f384482 -> bf6b0710 3ef00208 3de5250c", + "bea03d58 bd340494 3eeb615b bd340494 bd865626 3e380e52 3f86efe3 -> 3e9ec248 3f290216 bec81c48", + "3f25cad7 3e796a6b 3f8bdec8 3f8bdec8 be2a9b00 3ea575ad be2a9b00 -> bf1eaec6 3f5d1aab 3e6ad0bc", + "be3d624e 3e7d79a0 3f6731c4 3e844160 be74cf7e be74cf7e 3e41faaa -> 3f055a62 3f9696df 3ebf1264", + "3f9a5ea2 3efd44cc 3f9e9049 3f9e9049 3f5f7304 3f30b602 3f635a08 -> 3fb26e25 3fd94f47 400b3107", + "3f2ab4c1 3f2129d1 3ef57c09 3f2129d1 3f6c768b 3e949248 3f14a2f2 -> 3f98e836 3e4c6d38 3f3caf5f", + "3eb1be2f 3e51085f 3f3417bc 3f303349 3f400000 3f800000 3f800000 -> 3ec16347 3f867b6a 3f848930", + "3ef8f101 3ecb1d17 bdd8502a 3ecb1d17 3e7fa56f 3e7fa56f be48f438 -> 3e1cf11c beb2b894 be8f88cd", + "3f91c10f 3ec51f3c 3f00aec9 3f00aec9 00000000 00000000 3e800000 -> bf40f280 bf22d355 bd889230", + "3fa950d9 bd7e5bea 3efbb7c0 bd7e5bea 3e800000 3e800000 00000000 -> bf393698 be2dd3e4 bfb143b8", + "3fb3e249 3ed66b71 3f5e193c 3ed66b71 3f898dd6 3f5b6ddb 3f898dd6 -> 40022bd0 3fef89e0 40022bd0", + "3fbf9e44 3e136dba 3e136dba 3f8cb6f7 3f403dfd 3f6ba1dd 3db38285 -> 3f65334a 3fb38e54 be0a7fb0", + "3f8f6887 3ef73b25 3e6b8de7 3ef73b25 3ee9f515 3f9266d2 3f9266d2 -> 3ec5d6c0 3fd6160f 3ff6731b", + "3e28a259 3f892723 3ddab822 3f4813ce 3ebe9176 3ebe9176 3f04b1ad -> 3f83c3e2 3d848410 3f499f98", + "3fb05e5a 3f99bdea 3e91fb4c 3e91fb4c 3f51a248 3e8b8b6f 3efd2a77 -> 40051c9d beaef0f2 3e8a2be6", + "3e00f3af 3ddd410a 3f9705e4 3f9705e4 3eede8d2 bd6110b8 be628a74 -> 3dcb076b 3f8521f4 3f7f8b40", + "bd4cdefa 3f4f7a17 3f4f7a17 be0afcc0 be0e0294 3f534a6f 3f9270c9 -> 3f5fd535 3f47251b be4cf66e", + "3f7550ec 3e4f74b3 3e50217c 3f272541 3f400000 00000000 00000000 -> 3f2e85a3 bf41488d be9c5756", + "3e4e084b 3ed747a7 3f887f1b 3f887f1b 3f08fd45 bdb703d3 3df38013 -> 3ede83bf 3f544773 3f69bbb2", + "3f46cc03 3ec635f9 be4bb0c8 3ec635f9 3f000000 3e800000 3f800000 -> 3ec635f9 bf165234 3f94f380", + "3f90124d 3f87bac8 3f33edaa 3f33edaa 3f1f79c7 3ecdd63f 3f11b336 -> 3fab2848 3ef6ef0a 3f5bc5f3", + "bc22d5c5 3f3053ab 3f3053ab 3f2dea03 3f800000 3f800000 3e800000 -> 3f2dc854 3f2dc854 3f2f2faf", + "3f1bb814 3f573965 3f573965 3f8b3052 3ee1afc2 3ee1afc2 be54932e -> 3f44c903 3f44c903 3e680650", + "3f4f826e 3edd8d3d 3e6fd0ee 3edd8d3d 3e051682 3e051682 be5468c9 -> be2b2d3a bebb3b63 bf36d24a", + "bd937a1e 3e3b91f1 3f2fcba9 3f18140d bd99d6fe 3f9debca 3f41fc9b -> 3e88317e 3f14be10 3f0e932b", + "3ea9f4ce 3ebebd4b bd5d29ca 3ebebd4b 3f8d639c 3f4c56ef 3f49fcb2 -> 3f46202c 3e136f1e 3f107d38", + "be001190 3eeb9e71 3edd395a 3f2ba7bc 3f8742d4 3f648483 3f8742d4 -> 3ea451d6 3eaaf033 3f08016e", + "3f80d27c 3e83f066 3f94e098 3f94e098 3dc51d34 3f2eca09 3dc51d34 -> bf0e146f 3fc3f792 3eb3691c", + "3ef6f46d 3eade266 3f5584a7 3f7c2d93 3e0cfd35 3f4baaa4 3f4baaa4 -> bc222200 3f8f4170 3fa295e6", + "3e8bb61b bdec2357 bdec2357 3eb9f355 3e699cee 3e699cee be2d18ed -> be86ffbf be86ffbf bafe9b00", + "3e5e72c5 3f79962d 3e816be9 3e816be9 3e89241e 3f689204 bda06b30 -> 3f5fc42f 3edc496a 3ac5eb00", + "3f581676 be0a544f 3e9f187c 3e9f187c 3f6e24ee 3d442f68 3f6e24ee -> 3f175c92 bee7ae22 3f84bef2", + "3e4cf5b0 3f5c2d53 3f5c2d53 3ed02993 be4b1687 3ed8a26e 3f09d344 -> 3f149ccc 3f544c3d 3ed8075b", + "bd44d832 3ee52c37 3ef527e3 3ef527e3 3dbd0d24 3e86c9d4 3e86c9d4 -> 3ef93c50 3f00672f 3f00672f", + "3ed0dc38 3d8872e0 3f5e59b7 3f8fd05d bddd9704 3e174e73 3e174e73 -> bedbf1d4 3f14c814 3f560f18", + "3ea30d76 3f94a564 3f94a564 3f28244b 3f400000 3f000000 3f800000 -> 3fa90713 3f94a564 3f79ab06", + "3fa67392 be1d225f 3e2bba8d 3f33fce9 3e8c24e4 be189230 be189230 -> bf3df15b bfc29616 bf7c1de7", + "3efde021 3f8495af 3d28c312 3d28c312 3f73673b 3f356a60 3f356a60 -> 3fbdceb6 3e7e1458 3e7e1458", + "3f59b811 3c48c6f0 3c48c6f0 3e2d6d9e 3f9e3176 3ee4ad54 bd919429 -> 3fa1c8dc bda0ccea bf4d507a", + "3f801774 3f8908d0 3f05e5bb 3f8908d0 3e800000 3f800000 00000000 -> 3f11fa2c 3fc30a52 3d8f15c0", + "3f48cb37 3f6c42dd 3da99842 3da99842 3f93da58 be7cb0b9 3f8a7cfc -> 3ff9abb8 bf8b58c1 3f7ee620", + "3e5d1481 3eb4536c 3e114d10 3f7faa15 3f202f24 be1eed24 3f661ee3 -> 3ed01eb2 be10672a 3f95e140", + "3f15c581 3ed0e3f6 3ed0e3f6 3f023a10 3f51e31c 3f8753c1 3f51e31c -> 3f4842b4 3f87ae8b 3f620ac8", + "befea11f 3f4307c1 3f94287e 3f341613 3f400000 3f400000 3f400000 -> 3f035f79 3f68a8b4 3ee8db96", + "3f97f18b be7977c0 3f3c0576 be7977c0 3f73bef4 3f9f7e92 3f35353b -> 3f546d6e 40205ce2 3e7fd1dc", + "3eac5e3c 3f9676ea 3e2b5779 3d567b9c 3d983a03 3d983a03 3f89bbbb -> 3f638e96 bdf44afa 3ee1648a", + "3e44d8da 3f503d45 3f503d45 3ed9213d 3f72c2b0 3b3f14cc 3e5f9a6d -> 3f7c5c67 3f1f5086 3ea1b0b9", + "bd987094 bdebbce5 bdebbce5 3ef5f90b 3f109504 3f6432a4 3d49de27 -> bdff7c6f be318894 3f0c29c5", + "3fbdc558 3e74562f 3f918c05 3f36a278 3e2e88ea 3f7fd829 3f7fd829 -> bf3d1384 40278b26 400c6dc2", + "bc03926c 3f3af8ef 3f552abd 3f3bc5a7 3f6632c1 3f421db9 3f6632c1 -> 3f3954bc 3f541ae5 3f3a2174", + "bed2e327 3f8b37bc 3f8b37bc 3eafcf20 3ecd475a 3eb8b476 3ecd475a -> 3f95a9da 3f99e68a 3ed9979a", + "3f9cc106 3f4ff300 3ec02a11 3f828322 3f86be4b bd54e75d 3e2c2493 -> 400a9f5a bf7a0466 3e53b138", + "3f07e968 3f957644 3f957644 3f80dac5 3ec904ae be35550d 3f7b6b1f -> 3f86ddef 3ee5c112 3fc260c9", + "3f302a00 3f2f2ce0 3f2f2ce0 3f9ed1a3 3ed34994 3f472a17 3f472a17 -> 3f106820 3f888f0d 3fcfca40", + "3d682cfd 3ea092d5 3e946a0c 3dba34b5 3e36e235 3e36e235 3f088bff -> 3e8deb08 3e81c23e 3dc1f515", + "3e86f422 3f467c1e 3e1b1a7d 3e1b1a7d be4e201e be4e201e 3f448a5d -> 3ecfaf69 be5f7729 3e95d0d2", + "3f86e852 3f2348b3 3f985042 3f5c30d1 3e56be80 3d068088 3e56be80 -> 3cd454e0 3e5220d8 3e7e2b14", + "3f9f0c7f 3f823dd3 3f9f6e1d 3f823dd3 3f1f50a3 3f831fc9 3f68196b -> 3fa9270c 40231f18 4001cbc8", + "be42a2c0 3e52caec 3f88967c 3f93ddfc 3f90cdad 3f9997a7 3f9997a7 -> bd0bc80c 3f4d0f16 3f639e16", + "beb9f597 3dc0f3c6 3e794632 3e794632 3f980b5d 3f62b812 3f980b5d -> becf95c2 bd1642d0 be832f9b", + "bc92c911 3f957645 3ce43539 3ce43539 3d5a2545 3f73fd7c 3f295f5b -> 3f9782df 3c3e63c8 3cb4c378", + "3d0d20d3 3f93338c 3f5a05f8 3f813fdb 3f93fcd2 3f294027 3f159e59 -> 3f98fd2d 3f5cddac 3f81fe8b", + "bdecef4c 3e083beb 3f07ea46 3ebb5d79 3f69f786 3f69f786 3f9fad23 -> 3d18a2b8 3edecaee 3e45a0db", + "3ef569a5 bd2004cb be3d6de6 3f7dadd7 3ef5ebda 3f8387bf 3f892449 -> bd6d5054 3ea43c2d 3fc4f4d4", + "be1f38e9 be15aece bdd6c54e 3ecfa47e 3f1490f1 3f1490f1 bc4512bd -> be2f43fe be04f7d7 3f10959e", + "3f8535b8 be31e520 3f9d3533 3f9d3533 3f92932d 3f25cb67 3ecf58bf -> 3f95a285 3fc48a68 3f83e419", + "3fbc28a0 3e75127a 3efff520 3ec9b25a 3e0892d6 3e0892d6 bd412347 -> bf56ab20 bf13f52e bf9b7a9a", + "be9466bb 3f790561 3f406243 3f790561 3ec28841 3f77a317 3ec28841 -> 3f856b2a 3ef60fef 3f856b2a", + "3ebda674 3f9d93f0 3e341ae7 be261b53 3f400000 3f000000 3f400000 -> 3fb548be 3e341ae7 3cbc5908", + "3eb64c60 3f93c0d1 bc3727a4 3f94bba9 3d3293f8 3ea24ead 3e3b5289 -> 3f544e1a be10e284 3f6faa46", + "3f5c8ad5 3f84a2ea 3f84a2ea bbd5d347 3eb859b7 3f3c7aed 3e1cd259 -> 3f4b8c12 3fb8bd5a bf1aa994", + "3ee046e5 3e9cfad8 3f8cd09c 3e9cfad8 be4c2135 3f9e1ffb 3f35c383 -> be9cb6d8 3fdf46a8 3efb2ec4", + "3f6924f6 3af8f45f 3af8f45f 3f13459f 3de91c81 3de91c81 3f93529e -> bf339556 bf339556 3fe16742", + "3fb037e1 3f94c83f be3a08ea be3a08ea bdb0e2f1 3ef2c173 3ef2c173 -> bee78128 be817c09 be817c09", + "3e9767fb 3f97a27c 3f0275a6 3f0275a6 00000000 3f000000 3f000000 -> 3f6390fa 3f0275a6 3f0275a6", + "3fa5e080 3f703c4c 3e8152f2 3d328298 3f931205 3f931205 3f049a18 -> 4027b600 3ff7a296 3db8aca0", + "3d5e1032 3f6991df be383e76 3eedb13c 3d5df066 3e00b863 3e00b863 -> 3f5d31e5 be61cd81 3ed8e9b6", + "be869bff 3df32150 3f280268 3f280268 3f400000 3f400000 00000000 -> bc50b570 3f065b68 3f6b5068", + "3fae269b 3f3ff197 3da13bbd 3e9ff725 3f9fd390 3f9fd390 3f879b84 -> 40325ce5 40076a5d 3fead7ca", + "3f5f49a4 3ed537e2 3ed537e2 3f24a642 3ea8ad59 3e6711e6 3e5582bd -> 3df38e98 bd7e82b8 3e09e710", + "3e888ed1 be070f74 bc234add 3f9b5dd8 bdf99466 3e6c5b37 bd211280 -> beed5f10 be1d3dff 3f6d158c", + "bddbe21d 3e37a480 3f993b0a 3e2e7be1 be6a6770 3e67deaa 3ee0359b -> 3eabf578 3fa0bfea 3e3c22fd", + "3facc586 3f4ff2b6 3f4ff2b6 3f5dff51 3f400000 3f000000 00000000 -> 3fbe5c1e 3f4ff2b6 bef71776", + "3caed590 be2ec765 be2ec765 bdb14584 be6f0582 3e548f2a 3d7c40b8 -> be4ed5e9 be3b8f6d bdd798b4", + "3fb40f7f 3f4b0597 3eee5e44 3eee5e44 3f0863b3 3f0863b3 be42ec81 -> 3f62a006 3f0ec992 bfbd04f9", + "be704a24 3f35c2f3 3f35c2f3 3f744049 3e47a32f 3e47a32f 3f1601b4 -> 3f5a6922 3f5a6922 3f69ec4d", + "be718f7b 3f314a47 3f9629dd 3eacce07 3f31fd56 3f981ad9 3f740075 -> 3f19b486 3f593112 3dfd6254", + "3fb90e84 be205d0b 3f55142f 3f9229ef 3f800000 3e800000 00000000 -> 3fa502e3 3de02d58 be9b9254", + "be040101 be2a7f11 3f8ee933 3f9d8f34 3f000000 3f000000 3f000000 -> be2a7f11 3f8ee933 3f9d8f34", + "3f8dab87 3ead22c6 3ead22c6 3eb8b24a be108e2d 3f17c96c 3ee93bee -> bf8a626a 3f0b38e5 3e864d4e", + "3f116d7e 3e3e49a5 bd0eb9a6 3e3e49a5 3f22af87 3ef1a28f 3f22af87 -> 3eadf5d8 bd88a562 3eadf5d8", + "beae9f16 3f96b304 3f5c66b5 3f5c66b5 b73ed51f 3f39adca 3f39adca -> 3fc25b0b 3f350ebe 3f350ebe", + "3f45ccec be422fee 3daada88 3f86ed2c 3ec6a3a4 be40876b 3e730b60 -> beb9bbf2 bf7ad2c5 3f25f293", + "3fa64cbc 3f5140bf 3f2f07d2 3f5140bf 3e800000 3f400000 00000000 -> 3e2bd00c 3faaaa47 bef6b172", + "3e0b48db 3f8d563c 3f900a29 3ca57777 be348ffa 3f4143af 3f35a5d5 -> 3f6b9290 3f98eabe 3d9e1f1a", + "3f4cd0b6 3e9bc546 3f5f55ba 3f5f55ba 3f284dfc 3f284dfc 3f68c6cb -> 3f0e60a4 3f8fe9de 3fc37eb3", + "3f88a65a 3f528336 3f528336 3ea620a6 3f82e479 bddb54a3 3f673150 -> 3ff814fb bef2a678 3f97b2ab", + "bdbbe706 3f22af76 3f3fc2e2 3f22af76 3eec3786 3dd50c90 3f925cc7 -> 3f24801f 3f525cbf 3f04756a", + "3fa58c36 3f181a20 3e16c687 3e16c687 3ed4097b 3eff17fd 3ed4097b -> 3ebe7c61 3e12163f bd99526e", + "3ecd98d7 3e9bee37 3e9b359b 3eae8a07 3f000000 00000000 3e800000 -> 3e9bee37 bdc98cf0 3e0f7b37", + "3f9bf00b 3f37d491 be51bdd2 3f7eacd3 3ef94e34 be3b5863 3f75df42 -> 3f2facb6 bfef36dd 400777e8", + "3fbed2da 3f82c013 3f80e452 3d80643e 3daaf81f 3f7fe984 3f7fe984 -> be61b448 401fcad4 3fc6b799", + "3f4aaf3a 3ef983ff 3ea99f09 3ef983ff 3ebb78c2 3ebb78c2 3f850d28 -> 3e8d00c1 3df46f2c 3fabb84a", + "3eee745b 3f4ce70e 3e993b58 3f786594 3f2d2d45 3f932be7 3f932be7 -> 3f76fbad 3f678ee8 3fc9ab68", + "3e8b9c8a 3f1e2d3a 3d31ff7d 3ecf307c 3f000000 3f400000 3f800000 -> 3f1e2d3a 3e381c69 3f2d6683", + "3f4fe917 3e183e68 3ed895a4 3e183e68 3e6637a4 bc1bb815 3f2353a1 -> be98ba5f becf2404 3ebee25a", + "3f0ad826 bdad32f9 bdad32f9 3e33d8ac 3f949df7 3f5bbf61 3f8cf644 -> 3f21ec05 3e9bbdc8 3f53ed1a", + "3d5ab3fa bd4b0dcd 3f9a25c1 3f376610 3e93acfa 3f2a7636 bd22fbb8 -> bd93cc54 3f9c6a29 3f28a456", + "3f9a3eff 3f7f9dbb 3f86832c 3e1e5812 bd948324 3d383d8b 3f065873 -> bec33bf2 bd3b7100 3e5b8461", + "3f932f6a be4ca4bf 3e98ca72 3f382e37 3f315ccb 3dcfbe16 3f315ccb -> 3e797211 bf1e414a 3f94d9f6", + "3f258351 3ebfc6b0 3f779cfc 3dfcc316 3f000000 3e800000 3f400000 -> 3ebfc6b0 3f24db54 3ee4b416", + "3cf5357f bde2781c bde2781c 3f8b99e3 3df16377 3f68aadc 3f68aadc -> be08a909 bdb0576a 3f8ebbee", + "3c7b8d62 bc78afea 3dd88b65 bc78afea 3ed8e18b 3f1e277c be2faa04 -> bc8f9031 3ddff3bc bd12a2ea", + "3eb497ba 3e7ebdc7 3f9c70ed 3f9c70ed 3f400000 3f000000 3f000000 -> 3ed9aac0 3f9c70ed 3f9c70ed", + "be95e6e4 be535446 bcdf2a75 3f36f9b8 3ec56e5b 3b381529 3f70d650 -> be0ebd16 3e871ca9 3ee9ce6d", + "3f312539 3f2c49c4 3f2c49c4 3f475918 be7d84a9 3e0599ad 3f5fb35b -> beb92480 3e257784 3fa5e578", + "3dcd03ee 3f844518 3f844518 3e8513f8 3f7482bb 3f3d227a 3f3d227a -> 3f8feee7 3f8a63ca 3e9d8ebe", + "3f82a8dc 3f52d682 3f5b62a0 3f26c2c8 3f3c93da 3eb15d8c 3f3c93da -> 3fa74154 3f0b1de6 3f913778", + "3f9aa25d 3f6ebbf9 3f6ebbf9 3e4ec12d 3f0d74e3 3ee120e5 3e38f0a5 -> 3f879faf 3f497064 bf11de61", + "bdd40960 bdb7b0b0 3f9d47ee bdb7b0b0 be70b646 be70b646 bb5da2bb -> 3d800892 3fb0c382 3c6e3eb0", + "3fa8fed2 3f930197 bd4058fd 3ea8f576 3f8a6712 3f41f298 3e14c044 -> 402bbc32 3f221dd2 bf1b50ac", + "3ed49786 3f78466f 3f7de667 3f7de667 3f309719 3f89189e 3f7a30fc -> 3f905029 3fbba6da 3fb1afa5", + "3f5daade 3f76d1b2 3d478b69 be56fb01 3e7dc548 3ef6178f 3f8c32e0 -> 3f07052c 3c791c04 3f522c5c", + "3f09de86 3eb2ef53 3e88c890 3eae1605 3e63d7ee 3f3a41aa 3f794569 -> 3d4f3710 3f0323d7 3f59aa20", + "3f9593bc 3f0a1bf4 3f8a3936 3f76856c 3f9476e7 3f9476e7 3f09a051 -> 40053ae2 4027d080 3f868271", + "3f9ed152 3f85624b 3f1f632d 3f85624b 3e0fd945 be4f9eec 3e0fd945 -> 3e197ea0 bf8f86a8 3e197ea0", + "3b87f48d be624eb7 3f9445d0 3f9445d0 3e76c8c6 3eecc988 3f0d56f6 -> be64821d 3f943b9c 3f9453fb", + "bc29e949 3f94b682 3e8d9716 3f94b682 3de31632 3ecbf52e 3f1058eb -> 3f95bef8 3e8eab6b 3f948b1c", + "be4766a9 3f95a517 3d5f22b7 be0e811d 3f789266 bcfd9f3b bcfd9f3b -> 3f7c551a 3e85c40f 3d8a7ca8", + "3dbb2afb 3eec8200 bdc23daa be439eb4 3f5aa8ba 3e15f067 bc92407e -> 3f06d31e be234c60 be9245d0", + "bdb94bba 3f64c378 3f64c378 3ebb1514 3f4e15bb 3f4e15bb 3e86180a -> 3f56a245 3f56a245 3ed12440", + "be6b75d5 3ee4155f 3f9aae24 be4e8092 3f850b73 bc399146 3f9bbfe4 -> 3e4a2595 3fb8c78c bf080386", + "3ec55258 3d434b3f 3f46ca70 3f46ca70 be20722b be783258 3e889203 -> beeabeac 3e51367c 3f18c369", + "3f25ad40 be502efa 3f143c81 3f54ade3 3f352c1e 3f78b1be 3f78b1be -> 3d8638c4 3f983a7e 3fb8732f", + "3f4b8819 3f5ecdac 3ee1343c 3f524d54 3f400000 3f400000 3e800000 -> 3fa248dc 3f565e2a 3ed9128f", + "3f459364 3ec8b56d 3ed2dab9 3f2ccbdb 3f811c5a 3f954fe1 3c9b776b -> 3f96adf7 3fb865db bd8a3e10", + "be732b21 3f6668bc 3f948cf3 3e75cc2f 3f2a3da9 3f2a3da9 3e90451d -> 3f5258e9 3f8a850a 3eaff6b4", + "be221033 3ecb5e8a 3ef45bbb 3ef45bbb 3cb03253 3cb03253 3f722c21 -> 3f0c7526 3f20f3be 3eac1494", + "3f90438b 3f84b6b8 3f205493 3f84b6b8 3f08fd6a 3f8a9b05 3eae749c -> 3f8ed88e 3ff855d2 3f2d8598", + "3e7a5d92 3f2ac276 3f7abbc8 3f1e057e 3ea92817 bd0b81f4 3f13a020 -> 3f1586d0 3f37e0e4 3f279e44", + "3eeaa751 3f1184dc 3f9478ca 3e2215b0 3f400000 3f400000 3f400000 -> 3f4c2eb0 3fb1cdb4 3ec65e80", + "bef89588 3f8b599b 3d6dd6d1 3e12c227 3f92b404 3f1babec 3f5f4d60 -> 3eec2ba2 bd401495 be5f6857", + "3f06a20a 3d66e460 3f914b08 3f914b08 3f471c2d 3f08788f 3edfcf01 -> 3eb27395 3f95bf7f 3f88d405", + "3e2937b6 3f101356 3f101356 3e97aaf2 3e976a7a 3e976a7a 3ef27db9 -> 3efd95f0 3efd95f0 3e9333f9", + "3eef24d9 3f8704c0 3ecac204 3f9d3281 3ec9d73a 3f6d4745 3f9a043c -> 3f74bd92 3f4b7646 3ff1496a", + "3ee2717b 3f9acb0a 3f30becf 3f433695 3f7a9fe6 3f8fec24 3f7a9fe6 -> 3fd106cc 3f9f114d 3f97d70d" + ] + } + ] +} diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/ramp.json b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/ramp.json new file mode 100644 index 00000000..c235fcb9 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/ramp.json @@ -0,0 +1,2212 @@ +{ + "oracle": "tools/cycles-oracle/oracle.py (Blender 5.2.2 LTS, build d13f752e3b9c, Cycles CPU, 1 sample, Emit bake, float Non-Color images)", + "blender": "5.2.2 LTS", + "build_hash": "d13f752e3b9c", + "platform": "Linux", + "encoding": "each case is 'operands -> results', every scalar a float32 bit pattern in hex, colours flattened as r g b", + "family": "ramp", + "functions": [ + { + "function": "cycles_ramp_index", + "node": "ShaderNodeValToRGB CONSTANT", + "table_entries": 257, + "stops": [ + [ + "3c600000", + "3d000000" + ], + [ + "3d380000", + "3d800000" + ], + [ + "3d9c0000", + "3dc00000" + ], + [ + "3ddc0000", + "3e000000" + ], + [ + "3e0e0000", + "3e200000" + ], + [ + "3e2e0000", + "3e400000" + ], + [ + "3e4e0000", + "3e600000" + ], + [ + "3e6e0000", + "3e800000" + ], + [ + "3e870000", + "3e900000" + ], + [ + "3e970000", + "3ea00000" + ], + [ + "3ea70000", + "3eb00000" + ], + [ + "3eb70000", + "3ec00000" + ], + [ + "3ec70000", + "3ed00000" + ], + [ + "3ed70000", + "3ee00000" + ], + [ + "3ee70000", + "3ef00000" + ], + [ + "3ef70000", + "3f000000" + ], + [ + "3f038000", + "3f080000" + ], + [ + "3f0b8000", + "3f100000" + ], + [ + "3f138000", + "3f180000" + ], + [ + "3f1b8000", + "3f200000" + ], + [ + "3f238000", + "3f280000" + ], + [ + "3f2b8000", + "3f300000" + ], + [ + "3f338000", + "3f380000" + ], + [ + "3f3b8000", + "3f400000" + ], + [ + "3f438000", + "3f480000" + ], + [ + "3f4b8000", + "3f500000" + ], + [ + "3f538000", + "3f580000" + ], + [ + "3f5b8000", + "3f600000" + ], + [ + "3f638000", + "3f680000" + ], + [ + "3f6b8000", + "3f700000" + ], + [ + "3f738000", + "3f780000" + ], + [ + "3f7b8000", + "3f800000" + ] + ], + "cases": [ + "3c7ffff9 -> 3d000000", + "3c7ffffa -> 3d000000", + "3c7ffffb -> 3d000000", + "3c7ffffc -> 3d000000", + "3c7ffffd -> 3d000000", + "3c7ffffe -> 3d000000", + "3c7fffff -> 3d000000", + "3c800000 -> 3d000000", + "3c800001 -> 3d000000", + "3c800002 -> 3d000000", + "3c800003 -> 3d000000", + "3c800004 -> 3d000000", + "3c800005 -> 3d000000", + "3c800006 -> 3d000000", + "3c800007 -> 3d000000", + "3d3ffff9 -> 3d000000", + "3d3ffffa -> 3d000000", + "3d3ffffb -> 3d000000", + "3d3ffffc -> 3d000000", + "3d3ffffd -> 3d000000", + "3d3ffffe -> 3d000000", + "3d3fffff -> 3d000000", + "3d400000 -> 3d800000", + "3d400001 -> 3d800000", + "3d400002 -> 3d800000", + "3d400003 -> 3d800000", + "3d400004 -> 3d800000", + "3d400005 -> 3d800000", + "3d400006 -> 3d800000", + "3d400007 -> 3d800000", + "3d9ffff9 -> 3d800000", + "3d9ffffa -> 3d800000", + "3d9ffffb -> 3d800000", + "3d9ffffc -> 3d800000", + "3d9ffffd -> 3d800000", + "3d9ffffe -> 3d800000", + "3d9fffff -> 3d800000", + "3da00000 -> 3dc00000", + "3da00001 -> 3dc00000", + "3da00002 -> 3dc00000", + "3da00003 -> 3dc00000", + "3da00004 -> 3dc00000", + "3da00005 -> 3dc00000", + "3da00006 -> 3dc00000", + "3da00007 -> 3dc00000", + "3ddffff9 -> 3dc00000", + "3ddffffa -> 3dc00000", + "3ddffffb -> 3dc00000", + "3ddffffc -> 3dc00000", + "3ddffffd -> 3dc00000", + "3ddffffe -> 3dc00000", + "3ddfffff -> 3dc00000", + "3de00000 -> 3e000000", + "3de00001 -> 3e000000", + "3de00002 -> 3e000000", + "3de00003 -> 3e000000", + "3de00004 -> 3e000000", + "3de00005 -> 3e000000", + "3de00006 -> 3e000000", + "3de00007 -> 3e000000", + "3e0ffff9 -> 3e000000", + "3e0ffffa -> 3e000000", + "3e0ffffb -> 3e000000", + "3e0ffffc -> 3e000000", + "3e0ffffd -> 3e000000", + "3e0ffffe -> 3e000000", + "3e0fffff -> 3e000000", + "3e100000 -> 3e200000", + "3e100001 -> 3e200000", + "3e100002 -> 3e200000", + "3e100003 -> 3e200000", + "3e100004 -> 3e200000", + "3e100005 -> 3e200000", + "3e100006 -> 3e200000", + "3e100007 -> 3e200000", + "3e2ffff9 -> 3e200000", + "3e2ffffa -> 3e200000", + "3e2ffffb -> 3e200000", + "3e2ffffc -> 3e200000", + "3e2ffffd -> 3e200000", + "3e2ffffe -> 3e200000", + "3e2fffff -> 3e200000", + "3e300000 -> 3e400000", + "3e300001 -> 3e400000", + "3e300002 -> 3e400000", + "3e300003 -> 3e400000", + "3e300004 -> 3e400000", + "3e300005 -> 3e400000", + "3e300006 -> 3e400000", + "3e300007 -> 3e400000", + "3e4ffff9 -> 3e400000", + "3e4ffffa -> 3e400000", + "3e4ffffb -> 3e400000", + "3e4ffffc -> 3e400000", + "3e4ffffd -> 3e400000", + "3e4ffffe -> 3e400000", + "3e4fffff -> 3e400000", + "3e500000 -> 3e600000", + "3e500001 -> 3e600000", + "3e500002 -> 3e600000", + "3e500003 -> 3e600000", + "3e500004 -> 3e600000", + "3e500005 -> 3e600000", + "3e500006 -> 3e600000", + "3e500007 -> 3e600000", + "3e6ffff9 -> 3e600000", + "3e6ffffa -> 3e600000", + "3e6ffffb -> 3e600000", + "3e6ffffc -> 3e600000", + "3e6ffffd -> 3e600000", + "3e6ffffe -> 3e600000", + "3e6fffff -> 3e600000", + "3e700000 -> 3e800000", + "3e700001 -> 3e800000", + "3e700002 -> 3e800000", + "3e700003 -> 3e800000", + "3e700004 -> 3e800000", + "3e700005 -> 3e800000", + "3e700006 -> 3e800000", + "3e700007 -> 3e800000", + "3e87fff9 -> 3e800000", + "3e87fffa -> 3e800000", + "3e87fffb -> 3e800000", + "3e87fffc -> 3e800000", + "3e87fffd -> 3e800000", + "3e87fffe -> 3e800000", + "3e87ffff -> 3e800000", + "3e880000 -> 3e900000", + "3e880001 -> 3e900000", + "3e880002 -> 3e900000", + "3e880003 -> 3e900000", + "3e880004 -> 3e900000", + "3e880005 -> 3e900000", + "3e880006 -> 3e900000", + "3e880007 -> 3e900000", + "3e97fff9 -> 3e900000", + "3e97fffa -> 3e900000", + "3e97fffb -> 3e900000", + "3e97fffc -> 3e900000", + "3e97fffd -> 3e900000", + "3e97fffe -> 3e900000", + "3e97ffff -> 3e900000", + "3e980000 -> 3ea00000", + "3e980001 -> 3ea00000", + "3e980002 -> 3ea00000", + "3e980003 -> 3ea00000", + "3e980004 -> 3ea00000", + "3e980005 -> 3ea00000", + "3e980006 -> 3ea00000", + "3e980007 -> 3ea00000", + "3ea7fff9 -> 3ea00000", + "3ea7fffa -> 3ea00000", + "3ea7fffb -> 3ea00000", + "3ea7fffc -> 3ea00000", + "3ea7fffd -> 3ea00000", + "3ea7fffe -> 3ea00000", + "3ea7ffff -> 3ea00000", + "3ea80000 -> 3eb00000", + "3ea80001 -> 3eb00000", + "3ea80002 -> 3eb00000", + "3ea80003 -> 3eb00000", + "3ea80004 -> 3eb00000", + "3ea80005 -> 3eb00000", + "3ea80006 -> 3eb00000", + "3ea80007 -> 3eb00000", + "3eb7fff9 -> 3eb00000", + "3eb7fffa -> 3eb00000", + "3eb7fffb -> 3eb00000", + "3eb7fffc -> 3eb00000", + "3eb7fffd -> 3eb00000", + "3eb7fffe -> 3eb00000", + "3eb7ffff -> 3eb00000", + "3eb80000 -> 3ec00000", + "3eb80001 -> 3ec00000", + "3eb80002 -> 3ec00000", + "3eb80003 -> 3ec00000", + "3eb80004 -> 3ec00000", + "3eb80005 -> 3ec00000", + "3eb80006 -> 3ec00000", + "3eb80007 -> 3ec00000", + "3ec7fff9 -> 3ec00000", + "3ec7fffa -> 3ec00000", + "3ec7fffb -> 3ec00000", + "3ec7fffc -> 3ec00000", + "3ec7fffd -> 3ec00000", + "3ec7fffe -> 3ec00000", + "3ec7ffff -> 3ec00000", + "3ec80000 -> 3ed00000", + "3ec80001 -> 3ed00000", + "3ec80002 -> 3ed00000", + "3ec80003 -> 3ed00000", + "3ec80004 -> 3ed00000", + "3ec80005 -> 3ed00000", + "3ec80006 -> 3ed00000", + "3ec80007 -> 3ed00000", + "3ed7fff9 -> 3ed00000", + "3ed7fffa -> 3ed00000", + "3ed7fffb -> 3ed00000", + "3ed7fffc -> 3ed00000", + "3ed7fffd -> 3ed00000", + "3ed7fffe -> 3ed00000", + "3ed7ffff -> 3ed00000", + "3ed80000 -> 3ee00000", + "3ed80001 -> 3ee00000", + "3ed80002 -> 3ee00000", + "3ed80003 -> 3ee00000", + "3ed80004 -> 3ee00000", + "3ed80005 -> 3ee00000", + "3ed80006 -> 3ee00000", + "3ed80007 -> 3ee00000", + "3ee7fff9 -> 3ee00000", + "3ee7fffa -> 3ee00000", + "3ee7fffb -> 3ee00000", + "3ee7fffc -> 3ee00000", + "3ee7fffd -> 3ee00000", + "3ee7fffe -> 3ee00000", + "3ee7ffff -> 3ee00000", + "3ee80000 -> 3ef00000", + "3ee80001 -> 3ef00000", + "3ee80002 -> 3ef00000", + "3ee80003 -> 3ef00000", + "3ee80004 -> 3ef00000", + "3ee80005 -> 3ef00000", + "3ee80006 -> 3ef00000", + "3ee80007 -> 3ef00000", + "3ef7fff9 -> 3ef00000", + "3ef7fffa -> 3ef00000", + "3ef7fffb -> 3ef00000", + "3ef7fffc -> 3ef00000", + "3ef7fffd -> 3ef00000", + "3ef7fffe -> 3ef00000", + "3ef7ffff -> 3ef00000", + "3ef80000 -> 3f000000", + "3ef80001 -> 3f000000", + "3ef80002 -> 3f000000", + "3ef80003 -> 3f000000", + "3ef80004 -> 3f000000", + "3ef80005 -> 3f000000", + "3ef80006 -> 3f000000", + "3ef80007 -> 3f000000", + "3f03fff9 -> 3f000000", + "3f03fffa -> 3f000000", + "3f03fffb -> 3f000000", + "3f03fffc -> 3f000000", + "3f03fffd -> 3f000000", + "3f03fffe -> 3f000000", + "3f03ffff -> 3f000000", + "3f040000 -> 3f080000", + "3f040001 -> 3f080000", + "3f040002 -> 3f080000", + "3f040003 -> 3f080000", + "3f040004 -> 3f080000", + "3f040005 -> 3f080000", + "3f040006 -> 3f080000", + "3f040007 -> 3f080000", + "3f0bfff9 -> 3f080000", + "3f0bfffa -> 3f080000", + "3f0bfffb -> 3f080000", + "3f0bfffc -> 3f080000", + "3f0bfffd -> 3f080000", + "3f0bfffe -> 3f080000", + "3f0bffff -> 3f080000", + "3f0c0000 -> 3f100000", + "3f0c0001 -> 3f100000", + "3f0c0002 -> 3f100000", + "3f0c0003 -> 3f100000", + "3f0c0004 -> 3f100000", + "3f0c0005 -> 3f100000", + "3f0c0006 -> 3f100000", + "3f0c0007 -> 3f100000", + "3f13fff9 -> 3f100000", + "3f13fffa -> 3f100000", + "3f13fffb -> 3f100000", + "3f13fffc -> 3f100000", + "3f13fffd -> 3f100000", + "3f13fffe -> 3f100000", + "3f13ffff -> 3f100000", + "3f140000 -> 3f180000", + "3f140001 -> 3f180000", + "3f140002 -> 3f180000", + "3f140003 -> 3f180000", + "3f140004 -> 3f180000", + "3f140005 -> 3f180000", + "3f140006 -> 3f180000", + "3f140007 -> 3f180000", + "3f1bfff9 -> 3f180000", + "3f1bfffa -> 3f180000", + "3f1bfffb -> 3f180000", + "3f1bfffc -> 3f180000", + "3f1bfffd -> 3f180000", + "3f1bfffe -> 3f180000", + "3f1bffff -> 3f180000", + "3f1c0000 -> 3f200000", + "3f1c0001 -> 3f200000", + "3f1c0002 -> 3f200000", + "3f1c0003 -> 3f200000", + "3f1c0004 -> 3f200000", + "3f1c0005 -> 3f200000", + "3f1c0006 -> 3f200000", + "3f1c0007 -> 3f200000", + "3f23fff9 -> 3f200000", + "3f23fffa -> 3f200000", + "3f23fffb -> 3f200000", + "3f23fffc -> 3f200000", + "3f23fffd -> 3f200000", + "3f23fffe -> 3f200000", + "3f23ffff -> 3f200000", + "3f240000 -> 3f280000", + "3f240001 -> 3f280000", + "3f240002 -> 3f280000", + "3f240003 -> 3f280000", + "3f240004 -> 3f280000", + "3f240005 -> 3f280000", + "3f240006 -> 3f280000", + "3f240007 -> 3f280000", + "3f2bfff9 -> 3f280000", + "3f2bfffa -> 3f280000", + "3f2bfffb -> 3f280000", + "3f2bfffc -> 3f280000", + "3f2bfffd -> 3f280000", + "3f2bfffe -> 3f280000", + "3f2bffff -> 3f280000", + "3f2c0000 -> 3f300000", + "3f2c0001 -> 3f300000", + "3f2c0002 -> 3f300000", + "3f2c0003 -> 3f300000", + "3f2c0004 -> 3f300000", + "3f2c0005 -> 3f300000", + "3f2c0006 -> 3f300000", + "3f2c0007 -> 3f300000", + "3f33fff9 -> 3f300000", + "3f33fffa -> 3f300000", + "3f33fffb -> 3f300000", + "3f33fffc -> 3f300000", + "3f33fffd -> 3f300000", + "3f33fffe -> 3f300000", + "3f33ffff -> 3f300000", + "3f340000 -> 3f380000", + "3f340001 -> 3f380000", + "3f340002 -> 3f380000", + "3f340003 -> 3f380000", + "3f340004 -> 3f380000", + "3f340005 -> 3f380000", + "3f340006 -> 3f380000", + "3f340007 -> 3f380000", + "3f3bfff9 -> 3f380000", + "3f3bfffa -> 3f380000", + "3f3bfffb -> 3f380000", + "3f3bfffc -> 3f380000", + "3f3bfffd -> 3f380000", + "3f3bfffe -> 3f380000", + "3f3bffff -> 3f380000", + "3f3c0000 -> 3f400000", + "3f3c0001 -> 3f400000", + "3f3c0002 -> 3f400000", + "3f3c0003 -> 3f400000", + "3f3c0004 -> 3f400000", + "3f3c0005 -> 3f400000", + "3f3c0006 -> 3f400000", + "3f3c0007 -> 3f400000", + "3f43fff9 -> 3f400000", + "3f43fffa -> 3f400000", + "3f43fffb -> 3f400000", + "3f43fffc -> 3f400000", + "3f43fffd -> 3f400000", + "3f43fffe -> 3f400000", + "3f43ffff -> 3f400000", + "3f440000 -> 3f480000", + "3f440001 -> 3f480000", + "3f440002 -> 3f480000", + "3f440003 -> 3f480000", + "3f440004 -> 3f480000", + "3f440005 -> 3f480000", + "3f440006 -> 3f480000", + "3f440007 -> 3f480000", + "3f4bfff9 -> 3f480000", + "3f4bfffa -> 3f480000", + "3f4bfffb -> 3f480000", + "3f4bfffc -> 3f480000", + "3f4bfffd -> 3f480000", + "3f4bfffe -> 3f480000", + "3f4bffff -> 3f480000", + "3f4c0000 -> 3f500000", + "3f4c0001 -> 3f500000", + "3f4c0002 -> 3f500000", + "3f4c0003 -> 3f500000", + "3f4c0004 -> 3f500000", + "3f4c0005 -> 3f500000", + "3f4c0006 -> 3f500000", + "3f4c0007 -> 3f500000", + "3f53fff9 -> 3f500000", + "3f53fffa -> 3f500000", + "3f53fffb -> 3f500000", + "3f53fffc -> 3f500000", + "3f53fffd -> 3f500000", + "3f53fffe -> 3f500000", + "3f53ffff -> 3f500000", + "3f540000 -> 3f580000", + "3f540001 -> 3f580000", + "3f540002 -> 3f580000", + "3f540003 -> 3f580000", + "3f540004 -> 3f580000", + "3f540005 -> 3f580000", + "3f540006 -> 3f580000", + "3f540007 -> 3f580000", + "3f5bfff9 -> 3f580000", + "3f5bfffa -> 3f580000", + "3f5bfffb -> 3f580000", + "3f5bfffc -> 3f580000", + "3f5bfffd -> 3f580000", + "3f5bfffe -> 3f580000", + "3f5bffff -> 3f580000", + "3f5c0000 -> 3f600000", + "3f5c0001 -> 3f600000", + "3f5c0002 -> 3f600000", + "3f5c0003 -> 3f600000", + "3f5c0004 -> 3f600000", + "3f5c0005 -> 3f600000", + "3f5c0006 -> 3f600000", + "3f5c0007 -> 3f600000", + "3f63fff9 -> 3f600000", + "3f63fffa -> 3f600000", + "3f63fffb -> 3f600000", + "3f63fffc -> 3f600000", + "3f63fffd -> 3f600000", + "3f63fffe -> 3f600000", + "3f63ffff -> 3f600000", + "3f640000 -> 3f680000", + "3f640001 -> 3f680000", + "3f640002 -> 3f680000", + "3f640003 -> 3f680000", + "3f640004 -> 3f680000", + "3f640005 -> 3f680000", + "3f640006 -> 3f680000", + "3f640007 -> 3f680000", + "3f6bfff9 -> 3f680000", + "3f6bfffa -> 3f680000", + "3f6bfffb -> 3f680000", + "3f6bfffc -> 3f680000", + "3f6bfffd -> 3f680000", + "3f6bfffe -> 3f680000", + "3f6bffff -> 3f680000", + "3f6c0000 -> 3f700000", + "3f6c0001 -> 3f700000", + "3f6c0002 -> 3f700000", + "3f6c0003 -> 3f700000", + "3f6c0004 -> 3f700000", + "3f6c0005 -> 3f700000", + "3f6c0006 -> 3f700000", + "3f6c0007 -> 3f700000", + "3f73fff9 -> 3f700000", + "3f73fffa -> 3f700000", + "3f73fffb -> 3f700000", + "3f73fffc -> 3f700000", + "3f73fffd -> 3f700000", + "3f73fffe -> 3f700000", + "3f73ffff -> 3f700000", + "3f740000 -> 3f780000", + "3f740001 -> 3f780000", + "3f740002 -> 3f780000", + "3f740003 -> 3f780000", + "3f740004 -> 3f780000", + "3f740005 -> 3f780000", + "3f740006 -> 3f780000", + "3f740007 -> 3f780000", + "3f7bfff9 -> 3f780000", + "3f7bfffa -> 3f780000", + "3f7bfffb -> 3f780000", + "3f7bfffc -> 3f780000", + "3f7bfffd -> 3f780000", + "3f7bfffe -> 3f780000", + "3f7bffff -> 3f780000", + "3f7c0000 -> 3f800000", + "3f7c0001 -> 3f800000", + "3f7c0002 -> 3f800000", + "3f7c0003 -> 3f800000", + "3f7c0004 -> 3f800000", + "3f7c0005 -> 3f800000", + "3f7c0006 -> 3f800000", + "3f7c0007 -> 3f800000", + "bf000000 -> 3d000000", + "b3d6bf95 -> 3d000000", + "00000000 -> 3d000000", + "33d6bf95 -> 3d000000", + "3f800000 -> 3f800000", + "3f800001 -> 3f800000", + "3fc00000 -> 3f800000", + "be1fcf50 -> 3d000000", + "3f372f07 -> 3f380000", + "3f55b0b9 -> 3f580000", + "3f9ab211 -> 3f800000", + "3ee4eab9 -> 3ee00000", + "3f9af960 -> 3f800000", + "3f853672 -> 3f800000", + "bca560eb -> 3d000000", + "3f9d4279 -> 3f800000", + "3f15cae6 -> 3f180000", + "3e49744b -> 3e400000", + "3f8c4cd8 -> 3f800000", + "be6f32dd -> 3d000000", + "3f409c7d -> 3f400000", + "3d54d9be -> 3d800000", + "3f614ccc -> 3f600000", + "3de0bc56 -> 3e000000", + "3f0cef3f -> 3f100000", + "3f8fbb16 -> 3f800000", + "3f8c1b11 -> 3f800000", + "3e13691f -> 3e200000", + "3f0ce1dc -> 3f100000", + "3edb9c6e -> 3ee00000", + "bd2dcd11 -> 3d000000", + "3f42ac4b -> 3f400000", + "3f83b6a2 -> 3f800000", + "bd5e16e3 -> 3d000000", + "3d192d4c -> 3d000000", + "3f4d579c -> 3f500000", + "3c819ca6 -> 3d000000", + "3f30a53f -> 3f300000", + "be12658a -> 3d000000", + "3e8ee3e4 -> 3e900000", + "be7dacee -> 3d000000", + "bdf69724 -> 3d000000", + "3f1ddc25 -> 3f200000", + "3f88365c -> 3f800000", + "3f218b56 -> 3f200000", + "bde44ae4 -> 3d000000", + "3f8793f1 -> 3f800000", + "3f517eb8 -> 3f500000", + "3f585a7c -> 3f580000", + "bdca7602 -> 3d000000", + "3e0bc24a -> 3e000000", + "3ec703b0 -> 3ec00000", + "3f3d217c -> 3f400000", + "be1d577b -> 3d000000", + "3f3769b9 -> 3f380000", + "3f424485 -> 3f400000", + "3f7d3f2a -> 3f800000", + "3d3d26fe -> 3d000000", + "3e9538a0 -> 3e900000", + "3f156c87 -> 3f180000", + "3f9d338e -> 3f800000", + "3f47c31f -> 3f480000", + "bdc2a7ea -> 3d000000", + "3e6c5aa1 -> 3e600000", + "3cd50ef5 -> 3d000000", + "3f21b6da -> 3f200000", + "be5b89c3 -> 3d000000", + "be141ff4 -> 3d000000", + "3f8370cf -> 3f800000", + "3f441e84 -> 3f480000", + "3f3a652c -> 3f380000", + "3f264417 -> 3f280000", + "3ed33bdc -> 3ed00000", + "bdeaf739 -> 3d000000", + "3f18134c -> 3f180000", + "3efac3a9 -> 3f000000", + "3f033b31 -> 3f000000", + "3e983298 -> 3ea00000", + "3f49eb8a -> 3f480000", + "3eecfb51 -> 3ef00000", + "3f18701e -> 3f180000", + "3e813760 -> 3e800000", + "3f5a4175 -> 3f580000", + "3e8b8230 -> 3e900000", + "3e15a5e7 -> 3e200000", + "3f13b0b3 -> 3f100000", + "3f8fcf0f -> 3f800000", + "3f0755e3 -> 3f080000", + "3f7235fd -> 3f700000", + "3f8b9550 -> 3f800000", + "3f7e1f6f -> 3f800000", + "bdda6f11 -> 3d000000", + "3ed9fb17 -> 3ee00000", + "3f9cc24d -> 3f800000", + "3c6b7913 -> 3d000000", + "3f3e7fbb -> 3f400000", + "3f81b688 -> 3f800000", + "3e0a1d45 -> 3e000000", + "bc724f53 -> 3d000000", + "3f6a9146 -> 3f680000", + "3c4c2f36 -> 3d000000", + "3e561151 -> 3e600000", + "3ee77ea4 -> 3ee00000", + "3eff5fc4 -> 3f000000", + "be7dfc79 -> 3d000000", + "3ec43a34 -> 3ec00000", + "3f8650f6 -> 3f800000", + "3f6788e7 -> 3f680000", + "3ebaea81 -> 3ec00000", + "bdf23c11 -> 3d000000", + "3e0a16ee -> 3e000000", + "3f8a7274 -> 3f800000", + "3f2918f0 -> 3f280000", + "3ec54e20 -> 3ec00000", + "3f549a26 -> 3f580000", + "3f7377e5 -> 3f700000", + "3eea860a -> 3ef00000", + "3effa6d0 -> 3f000000", + "3f1e732a -> 3f200000", + "3d65305d -> 3d800000", + "3eb3b001 -> 3eb00000", + "3d4389f3 -> 3d800000", + "3f7c44a6 -> 3f800000", + "3f7d350e -> 3f800000", + "3f5ac133 -> 3f580000", + "be0b71f7 -> 3d000000", + "3efbfb10 -> 3f000000", + "bd844a07 -> 3d000000", + "3f9d52b7 -> 3f800000", + "bc03402e -> 3d000000", + "3f6be37a -> 3f680000", + "3e5e2382 -> 3e600000", + "3f86eb4b -> 3f800000", + "3be25f71 -> 3d000000", + "3f7b1ec6 -> 3f780000", + "bdc3849a -> 3d000000", + "3f809288 -> 3f800000", + "3f3d6203 -> 3f400000", + "3f99b866 -> 3f800000", + "bdd9ba68 -> 3d000000", + "3d270991 -> 3d000000", + "3eaae0b5 -> 3eb00000", + "3d3200a9 -> 3d000000", + "3e8847f5 -> 3e900000", + "3ef6e37d -> 3ef00000", + "3d6020d9 -> 3d800000", + "3f54b126 -> 3f580000", + "3f3eec69 -> 3f400000", + "3f56f278 -> 3f580000", + "3f75d033 -> 3f780000", + "3f9396b7 -> 3f800000", + "3e90a10a -> 3e900000", + "3ebaa0ff -> 3ec00000", + "3f850358 -> 3f800000", + "3f8e0e32 -> 3f800000", + "3f98c535 -> 3f800000", + "3f34c93a -> 3f380000", + "3ec5eecb -> 3ec00000", + "3f5b4aa4 -> 3f580000", + "3f7e7364 -> 3f800000", + "3ed5946d -> 3ed00000", + "3f3a0ae0 -> 3f380000", + "3f850bcb -> 3f800000", + "3eea85c1 -> 3ef00000", + "bdb55b90 -> 3d000000", + "3ca04321 -> 3d000000", + "be7af79a -> 3d000000", + "3ece4734 -> 3ed00000", + "3ef73aa4 -> 3ef00000", + "3f892643 -> 3f800000", + "3f5b023b -> 3f580000", + "3f92d4e6 -> 3f800000", + "3f727f32 -> 3f700000", + "3f21bd32 -> 3f200000", + "3f7d35b3 -> 3f800000", + "3f5606f1 -> 3f580000", + "3f6db770 -> 3f700000", + "3de06234 -> 3e000000", + "3f141a0d -> 3f180000", + "3e8f6dd6 -> 3e900000", + "3ec51a79 -> 3ec00000", + "3f5e81cd -> 3f600000", + "be7c3981 -> 3d000000", + "bdc8af3c -> 3d000000", + "3e90ae54 -> 3e900000", + "3dbd5ca6 -> 3dc00000", + "3f95a4fc -> 3f800000", + "3f9fa759 -> 3f800000", + "3f6b87b3 -> 3f680000", + "3f3122fe -> 3f300000", + "3f07660a -> 3f080000", + "3e8747fc -> 3e800000", + "be40b863 -> 3d000000", + "3f1e9aff -> 3f200000", + "bcf42c79 -> 3d000000", + "3f60289c -> 3f600000", + "3f78d9b1 -> 3f780000", + "3e4ca842 -> 3e400000", + "3ebaa2fb -> 3ec00000", + "3f874124 -> 3f800000", + "bdaf7593 -> 3d000000", + "3f818e92 -> 3f800000", + "3f8a6d93 -> 3f800000", + "3f7652d8 -> 3f780000", + "3f76b1b1 -> 3f780000", + "3f69b46d -> 3f680000", + "3e88fe05 -> 3e900000", + "bd0c0e35 -> 3d000000", + "3f649de2 -> 3f680000", + "be3dcd79 -> 3d000000", + "3f2d00d3 -> 3f300000", + "be45d1b4 -> 3d000000", + "3f68b817 -> 3f680000", + "bdf1ca8d -> 3d000000", + "3f90cc42 -> 3f800000", + "3de4d1e0 -> 3e000000", + "3f54ec08 -> 3f580000", + "3ebeb216 -> 3ec00000", + "3f045017 -> 3f080000", + "3f4b02bc -> 3f480000", + "3d9cc3d3 -> 3d800000", + "3f9a2faf -> 3f800000", + "3f12e935 -> 3f100000", + "3d9da914 -> 3d800000", + "3ec94768 -> 3ed00000", + "3f83a2ed -> 3f800000", + "3f8cc870 -> 3f800000", + "3f0b0d79 -> 3f080000", + "bd2e541e -> 3d000000", + "3eaeba97 -> 3eb00000", + "bd5a343a -> 3d000000", + "3d22d700 -> 3d000000", + "3f07ebe6 -> 3f080000", + "3ef09b9a -> 3ef00000", + "3f140193 -> 3f180000", + "3f81a90b -> 3f800000", + "3f3e02bd -> 3f400000", + "3ebab17a -> 3ec00000", + "3f2ff0a6 -> 3f300000", + "3f60d216 -> 3f600000", + "3f406aeb -> 3f400000", + "3f9604fc -> 3f800000", + "bd82c2d1 -> 3d000000", + "3ee04a2a -> 3ee00000", + "3ea65491 -> 3ea00000", + "3e24a846 -> 3e200000", + "3f47ddf8 -> 3f480000", + "be243bad -> 3d000000", + "bd048d3a -> 3d000000", + "3d9b7510 -> 3d800000", + "bc6f0e81 -> 3d000000", + "3f7bd128 -> 3f780000", + "3f613b14 -> 3f600000", + "3e7872ce -> 3e800000", + "3f81f3d1 -> 3f800000", + "be080e19 -> 3d000000", + "3f29e8eb -> 3f280000", + "3f21e689 -> 3f200000", + "3f627d94 -> 3f600000", + "3f8a3fae -> 3f800000", + "3f3a2062 -> 3f380000", + "3e93048e -> 3e900000", + "3dd661c2 -> 3dc00000", + "3ea6cd0a -> 3ea00000", + "3f854031 -> 3f800000", + "3f03e692 -> 3f000000", + "3f955d20 -> 3f800000", + "be495491 -> 3d000000", + "bd5b8c95 -> 3d000000", + "3d4e289c -> 3d800000", + "3ebf1290 -> 3ec00000", + "3f12e31f -> 3f100000", + "3f5ae12d -> 3f580000", + "3f472933 -> 3f480000", + "3e955dbb -> 3e900000", + "3da0f409 -> 3dc00000", + "3f7e1097 -> 3f800000", + "3f5c09db -> 3f600000", + "3ef41b99 -> 3ef00000", + "3f20ee6e -> 3f200000", + "3f1ee70e -> 3f200000", + "3f4569e0 -> 3f480000", + "be1b5599 -> 3d000000", + "3f9a0247 -> 3f800000", + "3e95ef59 -> 3e900000", + "3e530d2e -> 3e600000", + "3f8343bc -> 3f800000", + "3e0119ad -> 3e000000", + "3ef43a20 -> 3ef00000", + "3f4aae69 -> 3f480000", + "bd27fa98 -> 3d000000", + "3f18629c -> 3f180000", + "3f6538e1 -> 3f680000", + "3e521a6b -> 3e600000", + "bdac30ac -> 3d000000", + "bdf87785 -> 3d000000", + "3edf8339 -> 3ee00000", + "3f0dcd10 -> 3f100000", + "bd363a76 -> 3d000000", + "3ec546e8 -> 3ec00000", + "3f11cec4 -> 3f100000", + "be5a0a2f -> 3d000000", + "3f6a51c5 -> 3f680000", + "3f76b3a9 -> 3f780000", + "3ebec017 -> 3ec00000", + "3ec535a6 -> 3ec00000", + "3f69226e -> 3f680000", + "3f8bae04 -> 3f800000", + "3d23ceb2 -> 3d000000", + "be5b468c -> 3d000000", + "3f08c35b -> 3f080000", + "3d55684b -> 3d800000", + "3f567c35 -> 3f580000", + "be371b7e -> 3d000000", + "be6bbcfd -> 3d000000", + "3f282774 -> 3f280000", + "3ea947e3 -> 3eb00000", + "be0069f0 -> 3d000000", + "3ed027af -> 3ed00000", + "3e595c32 -> 3e600000", + "3f8c422f -> 3f800000", + "3e52c616 -> 3e600000", + "3f8e8a9b -> 3f800000", + "3e89a93d -> 3e900000", + "be702ce1 -> 3d000000", + "3f9a0a8d -> 3f800000", + "be7dd6b4 -> 3d000000", + "bdf4ed5b -> 3d000000", + "3f01cd40 -> 3f000000", + "3f49ef03 -> 3f480000", + "3f6ec231 -> 3f700000", + "3f839fff -> 3f800000", + "3f8f70ca -> 3f800000", + "3f6c82a6 -> 3f700000", + "3e73a595 -> 3e800000", + "3f464a4f -> 3f480000", + "3e6cbe4a -> 3e600000", + "3f5735d6 -> 3f580000", + "3f35d855 -> 3f380000", + "3f14b1ff -> 3f180000", + "3f394e68 -> 3f380000", + "3f535527 -> 3f500000", + "bd2cb203 -> 3d000000", + "3f609183 -> 3f600000", + "3f834377 -> 3f800000", + "3f4d5280 -> 3f500000", + "3f7b55b7 -> 3f780000", + "3f8cac37 -> 3f800000", + "3f3be5c8 -> 3f380000", + "3e8a15b8 -> 3e900000", + "3e33a5a5 -> 3e400000", + "3f72f2d7 -> 3f700000", + "3f2e3163 -> 3f300000", + "3f37a5de -> 3f380000", + "3ef7ba4c -> 3ef00000", + "3eb6d038 -> 3eb00000", + "bda5e8e1 -> 3d000000", + "3e1f16b3 -> 3e200000", + "3eba0b4c -> 3ec00000", + "3f995eef -> 3f800000", + "3e33b8ab -> 3e400000", + "3f00588e -> 3f000000", + "3f8253c2 -> 3f800000", + "3f03773f -> 3f000000", + "3f823310 -> 3f800000", + "3e898145 -> 3e900000", + "3dbf9453 -> 3dc00000", + "3f48c4ac -> 3f480000", + "3c5da665 -> 3d000000", + "3f33e45a -> 3f300000", + "3ec05dc6 -> 3ec00000", + "3f890804 -> 3f800000", + "bd83e421 -> 3d000000", + "3f539104 -> 3f500000", + "3f870a17 -> 3f800000", + "3e27ced0 -> 3e200000", + "3f254909 -> 3f280000", + "3f771d62 -> 3f780000", + "be2362f0 -> 3d000000", + "be1f00a6 -> 3d000000", + "bd1f3a17 -> 3d000000", + "3f577329 -> 3f580000", + "3f260a41 -> 3f280000", + "3f7866ac -> 3f780000", + "bdf56eb3 -> 3d000000", + "3f50b30e -> 3f500000", + "3f68c912 -> 3f680000", + "3efa8c1a -> 3f000000", + "3e08c142 -> 3e000000", + "bdcf0974 -> 3d000000", + "3f9f395f -> 3f800000", + "3e35d1ac -> 3e400000", + "3dea7f73 -> 3e000000", + "3f29f280 -> 3f280000", + "3f0deb07 -> 3f100000", + "3f025501 -> 3f000000", + "3f0988e7 -> 3f080000", + "3f2847c5 -> 3f280000", + "3f86695e -> 3f800000", + "3f182339 -> 3f180000", + "3f4cd0f0 -> 3f500000", + "3f49ff51 -> 3f480000", + "3f8cfe39 -> 3f800000", + "3f7b073e -> 3f780000", + "3f581677 -> 3f580000", + "3f8e75c2 -> 3f800000", + "3e943aee -> 3e900000", + "3f8cc012 -> 3f800000", + "be4b480b -> 3d000000", + "be05eddd -> 3d000000", + "3f5b88e0 -> 3f580000", + "3f98d086 -> 3f800000", + "3f36ca94 -> 3f380000", + "bdcf385e -> 3d000000", + "3d8db42c -> 3d800000", + "3eee7ea1 -> 3ef00000", + "3f062c40 -> 3f080000", + "bc785f7c -> 3d000000", + "be092a1b -> 3d000000", + "3f669342 -> 3f680000", + "3d511935 -> 3d800000", + "3f2bea02 -> 3f280000", + "3f8cc9e6 -> 3f800000", + "3f5c920e -> 3f600000", + "3e55df2e -> 3e600000", + "be29e1b9 -> 3d000000", + "3e817af6 -> 3e800000", + "3f81e168 -> 3f800000", + "3f903adb -> 3f800000", + "3f6a7a76 -> 3f680000", + "3f8d9e63 -> 3f800000", + "be0d7cb9 -> 3d000000", + "3f230949 -> 3f200000", + "3efdc995 -> 3f000000", + "3f8a26ad -> 3f800000", + "3f4b7a9b -> 3f480000", + "3f2d8ec7 -> 3f300000", + "bdb48a27 -> 3d000000", + "3f077245 -> 3f080000", + "3eef470b -> 3ef00000", + "3f14bd15 -> 3f180000", + "3e80929c -> 3e800000", + "be0326d8 -> 3d000000", + "3df26a22 -> 3e000000", + "3f975d3b -> 3f800000", + "3f69dc61 -> 3f680000", + "3e918a21 -> 3e900000", + "3ea125b5 -> 3ea00000", + "3f459907 -> 3f480000", + "3f86cbf1 -> 3f800000", + "bc95f007 -> 3d000000", + "3f2fa81a -> 3f300000", + "3ebaaa25 -> 3ec00000", + "3f74f104 -> 3f780000", + "3ec39bfd -> 3ec00000", + "3f09b670 -> 3f080000", + "3e9ba745 -> 3ea00000", + "3f0e33f4 -> 3f100000", + "3f9cf728 -> 3f800000", + "3e39e944 -> 3e400000", + "3e2443b8 -> 3e200000", + "3f146bbc -> 3f180000", + "3f8b268d -> 3f800000", + "3d6b0e8e -> 3d800000", + "bcf7b119 -> 3d000000", + "3ef6bb30 -> 3ef00000", + "3f9f0ed8 -> 3f800000", + "3f0f5ca8 -> 3f100000", + "3e91b422 -> 3e900000", + "3f2b0c8f -> 3f280000", + "3f411f38 -> 3f400000", + "be3822b3 -> 3d000000", + "3e5e498f -> 3e600000", + "3f2314a0 -> 3f200000", + "bdc24dff -> 3d000000", + "3f002095 -> 3f000000", + "3f4869b3 -> 3f480000", + "3f868fe1 -> 3f800000", + "3f90bfda -> 3f800000", + "be09ba4e -> 3d000000", + "be77d447 -> 3d000000", + "3f210930 -> 3f200000", + "3f367375 -> 3f380000", + "3f4fda84 -> 3f500000", + "3eb01a91 -> 3eb00000", + "3e869415 -> 3e800000", + "3d8d9d02 -> 3d800000", + "3f9a9189 -> 3f800000", + "3f92be09 -> 3f800000", + "3f95e5e4 -> 3f800000", + "3f16994d -> 3f180000", + "3f2536a9 -> 3f280000", + "be2dab63 -> 3d000000", + "3e699fa2 -> 3e600000", + "3d09ba4a -> 3d000000", + "3f8a4d04 -> 3f800000", + "3f4c737a -> 3f500000", + "3f7295ce -> 3f700000", + "3f96c47b -> 3f800000", + "3f6a70ab -> 3f680000", + "3ca55c48 -> 3d000000", + "3f8e36ee -> 3f800000", + "3dd3dddd -> 3dc00000", + "3e04a59c -> 3e000000", + "3f92ef06 -> 3f800000", + "be178c6d -> 3d000000", + "3e92896f -> 3e900000", + "3f80a5e0 -> 3f800000", + "3f7f7ffe -> 3f800000", + "3f0f0a00 -> 3f100000", + "3e4752d8 -> 3e400000", + "be745050 -> 3d000000", + "3f59cdd5 -> 3f580000", + "3f25ebd7 -> 3f280000", + "3f98bd6a -> 3f800000", + "3f61e4f5 -> 3f600000", + "3f4a5885 -> 3f480000", + "be5000f5 -> 3d000000", + "3f28b942 -> 3f280000", + "3e8410df -> 3e800000", + "3f2b3e5f -> 3f280000", + "3ee93adf -> 3ef00000", + "3f08e143 -> 3f080000", + "3f8cf031 -> 3f800000", + "3f947314 -> 3f800000", + "3ee63409 -> 3ee00000", + "3f078618 -> 3f080000", + "3dd06344 -> 3dc00000", + "3f6983cf -> 3f680000", + "3efdb11e -> 3f000000", + "3f854d8f -> 3f800000", + "3f07e256 -> 3f080000", + "3eec40e8 -> 3ef00000", + "bdaebbed -> 3d000000", + "3f29c688 -> 3f280000", + "be6445cb -> 3d000000", + "3ee10b75 -> 3ee00000", + "3f9a1c33 -> 3f800000", + "bc0c4a98 -> 3d000000", + "3ef3f121 -> 3ef00000", + "3f98b958 -> 3f800000", + "bd024119 -> 3d000000", + "3dbfefdc -> 3dc00000", + "3e97b097 -> 3e900000" + ] + }, + { + "function": "cycles_ramp_index", + "node": "ShaderNodeValToRGB LINEAR", + "table_entries": 257, + "stops": [ + [ + "00000000", + "00000000" + ], + [ + "3f800000", + "3f800000" + ] + ], + "cases": [ + "3b7ffff9 -> 3b7ffff9", + "3b7ffffa -> 3b7ffffa", + "3b7ffffb -> 3b7ffffb", + "3b7ffffc -> 3b7ffffc", + "3b7ffffd -> 3b7ffffd", + "3b7ffffe -> 3b7ffffe", + "3b7fffff -> 3b7fffff", + "3b800000 -> 3b800000", + "3b800001 -> 3b800001", + "3b800002 -> 3b800002", + "3b800003 -> 3b800003", + "3b800004 -> 3b800004", + "3b800005 -> 3b800005", + "3b800006 -> 3b800006", + "3b800007 -> 3b800007", + "3d8ffff9 -> 3d8ffff9", + "3d8ffffa -> 3d8ffffa", + "3d8ffffb -> 3d8ffffb", + "3d8ffffc -> 3d8ffffc", + "3d8ffffd -> 3d8ffffd", + "3d8ffffe -> 3d8ffffe", + "3d8fffff -> 3d8fffff", + "3d900000 -> 3d900000", + "3d900001 -> 3d900001", + "3d900002 -> 3d900002", + "3d900003 -> 3d900003", + "3d900004 -> 3d900004", + "3d900005 -> 3d900005", + "3d900006 -> 3d900006", + "3d900007 -> 3d900007", + "3e0bfff9 -> 3e0bfff9", + "3e0bfffa -> 3e0bfffa", + "3e0bfffb -> 3e0bfffb", + "3e0bfffc -> 3e0bfffc", + "3e0bfffd -> 3e0bfffd", + "3e0bfffe -> 3e0bfffe", + "3e0bffff -> 3e0bffff", + "3e0c0000 -> 3e0c0000", + "3e0c0001 -> 3e0c0001", + "3e0c0002 -> 3e0c0002", + "3e0c0003 -> 3e0c0003", + "3e0c0004 -> 3e0c0004", + "3e0c0005 -> 3e0c0005", + "3e0c0006 -> 3e0c0006", + "3e0c0007 -> 3e0c0007", + "3e4ffff9 -> 3e4ffff9", + "3e4ffffa -> 3e4ffffa", + "3e4ffffb -> 3e4ffffb", + "3e4ffffc -> 3e4ffffc", + "3e4ffffd -> 3e4ffffd", + "3e4ffffe -> 3e4ffffe", + "3e4fffff -> 3e4fffff", + "3e500000 -> 3e500000", + "3e500001 -> 3e500001", + "3e500002 -> 3e500002", + "3e500003 -> 3e500003", + "3e500004 -> 3e500004", + "3e500005 -> 3e500005", + "3e500006 -> 3e500006", + "3e500007 -> 3e500007", + "3e89fff9 -> 3e89fff9", + "3e89fffa -> 3e89fffa", + "3e89fffb -> 3e89fffb", + "3e89fffc -> 3e89fffc", + "3e89fffd -> 3e89fffd", + "3e89fffe -> 3e89fffe", + "3e89ffff -> 3e89ffff", + "3e8a0000 -> 3e8a0000", + "3e8a0001 -> 3e8a0001", + "3e8a0002 -> 3e8a0002", + "3e8a0003 -> 3e8a0003", + "3e8a0004 -> 3e8a0004", + "3e8a0005 -> 3e8a0005", + "3e8a0006 -> 3e8a0006", + "3e8a0007 -> 3e8a0007", + "3eabfff9 -> 3eabfff9", + "3eabfffa -> 3eabfffa", + "3eabfffb -> 3eabfffb", + "3eabfffc -> 3eabfffc", + "3eabfffd -> 3eabfffd", + "3eabfffe -> 3eabfffe", + "3eabffff -> 3eabffff", + "3eac0000 -> 3eac0000", + "3eac0001 -> 3eac0001", + "3eac0002 -> 3eac0002", + "3eac0003 -> 3eac0003", + "3eac0004 -> 3eac0004", + "3eac0005 -> 3eac0005", + "3eac0006 -> 3eac0006", + "3eac0007 -> 3eac0007", + "3ecdfff9 -> 3ecdfff9", + "3ecdfffa -> 3ecdfffa", + "3ecdfffb -> 3ecdfffb", + "3ecdfffc -> 3ecdfffc", + "3ecdfffd -> 3ecdfffd", + "3ecdfffe -> 3ecdfffe", + "3ecdffff -> 3ecdffff", + "3ece0000 -> 3ece0000", + "3ece0001 -> 3ece0001", + "3ece0002 -> 3ece0002", + "3ece0003 -> 3ece0003", + "3ece0004 -> 3ece0004", + "3ece0005 -> 3ece0005", + "3ece0006 -> 3ece0006", + "3ece0007 -> 3ece0007", + "3eeffff9 -> 3eeffff9", + "3eeffffa -> 3eeffffa", + "3eeffffb -> 3eeffffb", + "3eeffffc -> 3eeffffc", + "3eeffffd -> 3eeffffd", + "3eeffffe -> 3eeffffe", + "3eefffff -> 3eefffff", + "3ef00000 -> 3ef00000", + "3ef00001 -> 3ef00001", + "3ef00002 -> 3ef00002", + "3ef00003 -> 3ef00003", + "3ef00004 -> 3ef00004", + "3ef00005 -> 3ef00005", + "3ef00006 -> 3ef00006", + "3ef00007 -> 3ef00007", + "3f08fff9 -> 3f08fff9", + "3f08fffa -> 3f08fffa", + "3f08fffb -> 3f08fffb", + "3f08fffc -> 3f08fffc", + "3f08fffd -> 3f08fffd", + "3f08fffe -> 3f08fffe", + "3f08ffff -> 3f08ffff", + "3f090000 -> 3f090000", + "3f090001 -> 3f090001", + "3f090002 -> 3f090002", + "3f090003 -> 3f090003", + "3f090004 -> 3f090004", + "3f090005 -> 3f090005", + "3f090006 -> 3f090006", + "3f090007 -> 3f090007", + "3f19fff9 -> 3f19fff9", + "3f19fffa -> 3f19fffa", + "3f19fffb -> 3f19fffb", + "3f19fffc -> 3f19fffc", + "3f19fffd -> 3f19fffd", + "3f19fffe -> 3f19fffe", + "3f19ffff -> 3f19ffff", + "3f1a0000 -> 3f1a0000", + "3f1a0001 -> 3f1a0001", + "3f1a0002 -> 3f1a0002", + "3f1a0003 -> 3f1a0003", + "3f1a0004 -> 3f1a0004", + "3f1a0005 -> 3f1a0005", + "3f1a0006 -> 3f1a0006", + "3f1a0007 -> 3f1a0007", + "3f2afff9 -> 3f2afff9", + "3f2afffa -> 3f2afffa", + "3f2afffb -> 3f2afffb", + "3f2afffc -> 3f2afffc", + "3f2afffd -> 3f2afffd", + "3f2afffe -> 3f2afffe", + "3f2affff -> 3f2affff", + "3f2b0000 -> 3f2b0000", + "3f2b0001 -> 3f2b0001", + "3f2b0002 -> 3f2b0002", + "3f2b0003 -> 3f2b0003", + "3f2b0004 -> 3f2b0004", + "3f2b0005 -> 3f2b0005", + "3f2b0006 -> 3f2b0006", + "3f2b0007 -> 3f2b0007", + "3f3bfff9 -> 3f3bfff9", + "3f3bfffa -> 3f3bfffa", + "3f3bfffb -> 3f3bfffb", + "3f3bfffc -> 3f3bfffc", + "3f3bfffd -> 3f3bfffd", + "3f3bfffe -> 3f3bfffe", + "3f3bffff -> 3f3bffff", + "3f3c0000 -> 3f3c0000", + "3f3c0001 -> 3f3c0001", + "3f3c0002 -> 3f3c0002", + "3f3c0003 -> 3f3c0003", + "3f3c0004 -> 3f3c0004", + "3f3c0005 -> 3f3c0005", + "3f3c0006 -> 3f3c0006", + "3f3c0007 -> 3f3c0007", + "3f4cfff9 -> 3f4cfff9", + "3f4cfffa -> 3f4cfffa", + "3f4cfffb -> 3f4cfffb", + "3f4cfffc -> 3f4cfffc", + "3f4cfffd -> 3f4cfffd", + "3f4cfffe -> 3f4cfffe", + "3f4cffff -> 3f4cffff", + "3f4d0000 -> 3f4d0000", + "3f4d0001 -> 3f4d0001", + "3f4d0002 -> 3f4d0002", + "3f4d0003 -> 3f4d0003", + "3f4d0004 -> 3f4d0004", + "3f4d0005 -> 3f4d0005", + "3f4d0006 -> 3f4d0006", + "3f4d0007 -> 3f4d0007", + "3f5dfff9 -> 3f5dfff9", + "3f5dfffa -> 3f5dfffa", + "3f5dfffb -> 3f5dfffb", + "3f5dfffc -> 3f5dfffc", + "3f5dfffd -> 3f5dfffd", + "3f5dfffe -> 3f5dfffe", + "3f5dffff -> 3f5dffff", + "3f5e0000 -> 3f5e0000", + "3f5e0001 -> 3f5e0001", + "3f5e0002 -> 3f5e0002", + "3f5e0003 -> 3f5e0003", + "3f5e0004 -> 3f5e0004", + "3f5e0005 -> 3f5e0005", + "3f5e0006 -> 3f5e0006", + "3f5e0007 -> 3f5e0007", + "3f6efff9 -> 3f6efff9", + "3f6efffa -> 3f6efffa", + "3f6efffb -> 3f6efffb", + "3f6efffc -> 3f6efffc", + "3f6efffd -> 3f6efffd", + "3f6efffe -> 3f6efffe", + "3f6effff -> 3f6effff", + "3f6f0000 -> 3f6f0000", + "3f6f0001 -> 3f6f0001", + "3f6f0002 -> 3f6f0002", + "3f6f0003 -> 3f6f0003", + "3f6f0004 -> 3f6f0004", + "3f6f0005 -> 3f6f0005", + "3f6f0006 -> 3f6f0006", + "3f6f0007 -> 3f6f0007", + "3f7ffff9 -> 3f7ffff9", + "3f7ffffa -> 3f7ffffa", + "3f7ffffb -> 3f7ffffb", + "3f7ffffc -> 3f7ffffc", + "3f7ffffd -> 3f7ffffd", + "3f7ffffe -> 3f7ffffe", + "3f7fffff -> 3f7fffff", + "3f800000 -> 3f800000", + "3f800001 -> 3f800000", + "3f800002 -> 3f800000", + "3f800003 -> 3f800000", + "3f800004 -> 3f800000", + "3f800005 -> 3f800000", + "3f800006 -> 3f800000", + "3f800007 -> 3f800000", + "bf000000 -> 00000000", + "b3d6bf95 -> 00000000", + "00000000 -> 00000000", + "33d6bf95 -> 33d6bf95", + "3f800000 -> 3f800000", + "3f800001 -> 3f800000", + "3fc00000 -> 3f800000", + "3f8fada0 -> 3f800000", + "3f9edd1f -> 3f800000", + "3eb92d08 -> 3eb92d08", + "3e99c7e3 -> 3e99c7e3", + "3ef90319 -> 3ef90319", + "3f1b3df9 -> 3f1b3df9", + "3eaa6a1e -> 3eaa6a1e", + "3d897831 -> 3d897831", + "3e4fc74b -> 3e4fc74b", + "bd42534b -> 00000000", + "be404eae -> 00000000", + "3e5228c4 -> 3e5228c4", + "3f802fb3 -> 3f800000", + "bdea5ca9 -> 00000000", + "3f05fa00 -> 3f05fa00", + "3f48eadd -> 3f48eadd", + "3ec6bfd0 -> 3ec6bfd0", + "3dcbbe30 -> 3dcbbe30", + "3f868775 -> 3f800000", + "3f9a5a54 -> 3f800000", + "3eada0b2 -> 3eada0b2", + "be008569 -> 00000000", + "3f3ecea3 -> 3f3ecea3", + "bc4a6130 -> 00000000", + "3f880792 -> 3f800000", + "be138a7f -> 00000000", + "3f0fa5b4 -> 3f0fa5b4", + "3f65ae01 -> 3f65ae01", + "3ef2fb22 -> 3ef2fb22", + "3efba6c8 -> 3efba6c8", + "3c0fba13 -> 3c0fba13", + "3dfc06ac -> 3dfc06ac", + "3e2f5e41 -> 3e2f5e41", + "be487b4d -> 00000000", + "3f220f13 -> 3f220f13", + "bde9df97 -> 00000000", + "3f8e2f15 -> 3f800000", + "3e412f7d -> 3e412f7d", + "3f438f37 -> 3f438f37", + "3f2f27ea -> 3f2f27ea", + "3ee59aa2 -> 3ee59aa2", + "bd1c70a7 -> 00000000", + "3f7f3981 -> 3f7f3981", + "3d0bfb1f -> 3d0bfb1f", + "3f8d0c85 -> 3f800000", + "bcec3864 -> 00000000", + "3f8659fd -> 3f800000", + "3f80fae2 -> 3f800000", + "3f8447ed -> 3f800000", + "3f98fdd5 -> 3f800000", + "3de3e4ed -> 3de3e4ed", + "3f223b18 -> 3f223b18", + "3f7c1235 -> 3f7c1235", + "3f9e1de7 -> 3f800000", + "3f50c9b9 -> 3f50c9b9", + "3f5e0ab9 -> 3f5e0ab9", + "3f0cb84a -> 3f0cb84a", + "3ed57d54 -> 3ed57d54", + "3f9ad24d -> 3f800000", + "3f8a1c3a -> 3f800000", + "bdeb2c7c -> 00000000", + "be62a84d -> 00000000", + "3e7470d7 -> 3e7470d7", + "3f593d9f -> 3f593d9f", + "3e3df8a5 -> 3e3df8a5", + "bdb28d7c -> 00000000", + "3e8e5e28 -> 3e8e5e28", + "3eabb7bf -> 3eabb7bf", + "3f019d94 -> 3f019d94", + "3f86ba25 -> 3f800000", + "bd55a546 -> 00000000", + "be303a22 -> 00000000", + "bbdbc5f8 -> 00000000", + "3e224d02 -> 3e224d02", + "3f3f252d -> 3f3f252d", + "3f1f04cb -> 3f1f04cb", + "3e99627a -> 3e99627a", + "3f33d504 -> 3f33d504", + "3f450cde -> 3f450cde", + "3f476dc9 -> 3f476dc9", + "3e9d805c -> 3e9d805c", + "be3ff459 -> 00000000", + "3f91adad -> 3f800000", + "3f78cad6 -> 3f78cad6", + "3f6d8d20 -> 3f6d8d20", + "3de2ef26 -> 3de2ef26", + "3f69b70c -> 3f69b70c", + "bbde5443 -> 00000000", + "3f093b12 -> 3f093b12", + "3e62586c -> 3e62586c", + "3f15ea52 -> 3f15ea52", + "be2e6c3b -> 00000000", + "3e0dd38a -> 3e0dd38a", + "3d1508fd -> 3d1508fd", + "3f386d36 -> 3f386d36", + "3e5b84ee -> 3e5b84ee", + "3e6a4436 -> 3e6a4436", + "3f972b75 -> 3f800000", + "3f3502d9 -> 3f3502d9", + "be59d271 -> 00000000", + "3ebbe402 -> 3ebbe402", + "3ea9d516 -> 3ea9d516", + "3e12d40e -> 3e12d40e", + "be448f19 -> 00000000", + "3f26746d -> 3f26746d", + "be54e894 -> 00000000", + "3f4b2368 -> 3f4b2368", + "3f1dd942 -> 3f1dd942", + "3f0b238d -> 3f0b238d", + "3e5b613e -> 3e5b613e", + "3ede7a43 -> 3ede7a43", + "be684e94 -> 00000000", + "3f9e0fcf -> 3f800000", + "3f402f54 -> 3f402f54", + "3e64c595 -> 3e64c595", + "3f9b926f -> 3f800000", + "3f6265c0 -> 3f6265c0", + "be5c5376 -> 00000000", + "3f93abbd -> 3f800000", + "3f2d3345 -> 3f2d3345", + "bd81ee42 -> 00000000", + "3d853052 -> 3d853052", + "3f27c2e4 -> 3f27c2e4", + "bdbdba9f -> 00000000", + "be5bec88 -> 00000000", + "3f8b5e70 -> 3f800000", + "bdd48fd0 -> 00000000", + "3ebc09ba -> 3ebc09ba", + "3f098929 -> 3f098929", + "bdea513e -> 00000000", + "bd389d8a -> 00000000", + "3f432888 -> 3f432888", + "3b6cc10b -> 3b6cc10b", + "3f1ed4d8 -> 3f1ed4d8", + "3f26504a -> 3f26504a", + "3f36a73f -> 3f36a73f", + "3ebd5c3d -> 3ebd5c3d", + "3e8f3763 -> 3e8f3763", + "3f65d7d8 -> 3f65d7d8", + "3f38000d -> 3f38000d", + "3e3774d1 -> 3e3774d1", + "3f01e7d8 -> 3f01e7d8", + "bd8e49dd -> 00000000", + "3f28b7d2 -> 3f28b7d2", + "3f01ebc9 -> 3f01ebc9", + "3f32d4fa -> 3f32d4fa", + "3f3701c3 -> 3f3701c3", + "3ef780e8 -> 3ef780e8", + "3eb06d45 -> 3eb06d45", + "3f5c2a24 -> 3f5c2a24", + "be7b3f4e -> 00000000", + "3f06e3c0 -> 3f06e3c0", + "3ebb673f -> 3ebb673f", + "3f02b206 -> 3f02b206", + "3f7b8d02 -> 3f7b8d02", + "3f366e1c -> 3f366e1c", + "3f5f298a -> 3f5f298a", + "3f6e7868 -> 3f6e7868", + "3e07afef -> 3e07afef", + "3f90748f -> 3f800000", + "3f52a041 -> 3f52a041", + "3f9bc35f -> 3f800000", + "3f5c6d07 -> 3f5c6d07", + "3f3bf79e -> 3f3bf79e", + "3f91591b -> 3f800000", + "3f089f8f -> 3f089f8f", + "3f76d0b4 -> 3f76d0b4", + "3ebd530d -> 3ebd530d", + "3f6de86c -> 3f6de86c", + "3eefcdcf -> 3eefcdcf", + "3f161254 -> 3f161254", + "3f6cac97 -> 3f6cac97", + "3f1e5d6e -> 3f1e5d6e", + "3f4ac1a1 -> 3f4ac1a1", + "3f00b222 -> 3f00b222", + "3f8cc3b0 -> 3f800000", + "3f3e8616 -> 3f3e8616", + "3d68dac6 -> 3d68dac6", + "3f81b345 -> 3f800000", + "bdcbe7ba -> 00000000", + "3f0485e4 -> 3f0485e4", + "3e9f9d20 -> 3e9f9d20", + "3f980d0c -> 3f800000", + "be1ab09d -> 00000000", + "3f4576ec -> 3f4576ec", + "3f82a0f7 -> 3f800000", + "3f4045f8 -> 3f4045f8", + "3f87cf29 -> 3f800000", + "bc3a5353 -> 00000000", + "3f8055c9 -> 3f800000", + "3f2eaad6 -> 3f2eaad6", + "3f1fa454 -> 3f1fa454", + "3e10a22f -> 3e10a22f", + "3f7e2c58 -> 3f7e2c58", + "bd8e7d58 -> 00000000", + "3e9d0e23 -> 3e9d0e23", + "3e92ee8d -> 3e92ee8d", + "3f077223 -> 3f077223", + "3e7004fd -> 3e7004fd", + "be6ba2bb -> 00000000", + "3e17c805 -> 3e17c805", + "be25284e -> 00000000", + "3ef717cd -> 3ef717cd", + "3f3cbdc7 -> 3f3cbdc7", + "3c18d2b5 -> 3c18d2b5", + "be0d5090 -> 00000000", + "3f18b6da -> 3f18b6da", + "3f91ca73 -> 3f800000", + "bd9b71d7 -> 00000000", + "3f9e8912 -> 3f800000", + "3d65f830 -> 3d65f830", + "3f88149a -> 3f800000", + "3d918ac8 -> 3d918ac8", + "3f87c571 -> 3f800000", + "3f313a3e -> 3f313a3e", + "3f037c81 -> 3f037c81", + "3f343204 -> 3f343204", + "3f2b9434 -> 3f2b9434", + "3f5ef8cd -> 3f5ef8cd", + "3f8ec19f -> 3f800000", + "3ee65ece -> 3ee65ece", + "3f6e2119 -> 3f6e2119", + "3f36fb3c -> 3f36fb3c", + "bd78c2da -> 00000000", + "3ebb4ba3 -> 3ebb4ba3", + "3e9d54cc -> 3e9d54cc", + "3f2997a9 -> 3f2997a9", + "3f3c9bd8 -> 3f3c9bd8", + "3f68c72d -> 3f68c72d", + "3f95bfc0 -> 3f800000", + "3ee31b4e -> 3ee31b4e", + "3f74264d -> 3f74264d", + "3f8a1079 -> 3f800000", + "bd05ed90 -> 00000000", + "3f74a1c8 -> 3f74a1c8", + "3f189c0d -> 3f189c0d", + "3f3bd457 -> 3f3bd457", + "3d457620 -> 3d457620", + "3f0799e1 -> 3f0799e1", + "bdfa9cbe -> 00000000", + "3f7aee38 -> 3f7aee38", + "3f6ecbce -> 3f6ecbce", + "3f7c1150 -> 3f7c1150", + "3f1bb70b -> 3f1bb70b", + "3e5688d6 -> 3e5688d6", + "3ca1d7e1 -> 3ca1d7e1", + "3f284f65 -> 3f284f65", + "3f9baaed -> 3f800000", + "3ed8b42d -> 3ed8b42d", + "3defcf26 -> 3defcf26", + "3f60121a -> 3f60121a", + "bdab7a86 -> 00000000", + "be30b653 -> 00000000", + "be03cad0 -> 00000000", + "3f74d4cb -> 3f74d4cb", + "3f3ae13a -> 3f3ae13a", + "3e205b1e -> 3e205b1e", + "3f7a0620 -> 3f7a0620", + "3e06ac9f -> 3e06ac9f", + "3f5b16b9 -> 3f5b16b9", + "3f888fa6 -> 3f800000", + "3f06384d -> 3f06384d", + "3f2ce6cc -> 3f2ce6cc", + "3f86de1c -> 3f800000", + "bd5070df -> 00000000", + "3f91e89d -> 3f800000", + "3e070da1 -> 3e070da1", + "3c8137db -> 3c8137db", + "3f98a189 -> 3f800000", + "3f7be678 -> 3f7be678", + "3e5ddf6a -> 3e5ddf6a", + "3dfe3384 -> 3dfe3384", + "3c91fc1a -> 3c91fc1a", + "3e68eada -> 3e68eada", + "3f6a9c36 -> 3f6a9c36", + "3f30f4cb -> 3f30f4cb", + "3c869fc7 -> 3c869fc7", + "3e5e7beb -> 3e5e7beb", + "3eb347db -> 3eb347db", + "3f934eaf -> 3f800000", + "3f4da92d -> 3f4da92d", + "3f01b6a8 -> 3f01b6a8", + "3e950fb1 -> 3e950fb1", + "be2ddff7 -> 00000000", + "3f152457 -> 3f152457", + "3f9d385d -> 3f800000", + "bde8e72e -> 00000000", + "bde4e65c -> 00000000", + "3f1f0a2d -> 3f1f0a2d", + "3e9ff05c -> 3e9ff05c", + "bd802afa -> 00000000", + "be3df47b -> 00000000", + "3dce1971 -> 3dce1971", + "3f3f616e -> 3f3f616e", + "3f4fe23f -> 3f4fe23f", + "3f6fc899 -> 3f6fc899", + "3f820364 -> 3f800000", + "3f8a0f31 -> 3f800000", + "bd9f080d -> 00000000", + "3e3c576c -> 3e3c576c", + "3f853089 -> 3f800000", + "3f82d074 -> 3f800000", + "3f7eb837 -> 3f7eb837", + "3f32ebdb -> 3f32ebdb", + "3f1598cf -> 3f1598cf", + "3f688f5b -> 3f688f5b", + "3f36f1b4 -> 3f36f1b4", + "3dd9447d -> 3dd9447d", + "3f7eba59 -> 3f7eba59", + "3e028dab -> 3e028dab", + "3f8c8c82 -> 3f800000", + "3e7b36c4 -> 3e7b36c4", + "3f8cbe70 -> 3f800000", + "3f9772b1 -> 3f800000", + "3f78204b -> 3f78204b", + "bd8d13ef -> 00000000", + "bdd60d4a -> 00000000", + "3bc0ce55 -> 3bc0ce55", + "3f494703 -> 3f494703", + "3ec3a5c5 -> 3ec3a5c5", + "3e5997fd -> 3e5997fd", + "3ed66377 -> 3ed66377", + "3e36ac9b -> 3e36ac9b", + "3f55c53b -> 3f55c53b", + "3eeff65b -> 3eeff65b", + "bda3bf70 -> 00000000", + "3e96621c -> 3e96621c", + "3f9911a9 -> 3f800000", + "3f4bea4a -> 3f4bea4a", + "bd6524bf -> 00000000", + "bca7a452 -> 00000000", + "bd1f12d9 -> 00000000", + "3ecccb4c -> 3ecccb4c", + "3efeff9c -> 3efeff9c", + "3f7af069 -> 3f7af069", + "3f494989 -> 3f494989", + "3e8ac2ed -> 3e8ac2ed", + "3f7c3409 -> 3f7c3409", + "3f92e970 -> 3f800000", + "3f746d27 -> 3f746d27", + "3f51a530 -> 3f51a530", + "3ec7aa5c -> 3ec7aa5c", + "3e53ad72 -> 3e53ad72", + "3ef403b4 -> 3ef403b4", + "3e683452 -> 3e683452", + "3f97227c -> 3f800000", + "3d5dbda5 -> 3d5dbda5", + "be5b4cf7 -> 00000000", + "3f25f8ed -> 3f25f8ed", + "3f0ca512 -> 3f0ca512", + "3f8e7fe8 -> 3f800000", + "bce296a4 -> 00000000", + "3f885e9b -> 3f800000", + "3e45894a -> 3e45894a", + "3e78c33b -> 3e78c33b", + "3f4e6304 -> 3f4e6304", + "3f563860 -> 3f563860", + "3f9a41c4 -> 3f800000", + "3dd94bdd -> 3dd94bdd", + "3f418a51 -> 3f418a51", + "3e2aa5d8 -> 3e2aa5d8", + "3f7783d7 -> 3f7783d7", + "3f92e035 -> 3f800000", + "3eed5271 -> 3eed5271", + "3ebb58a0 -> 3ebb58a0", + "3ec29ff6 -> 3ec29ff6", + "3f76d97a -> 3f76d97a", + "3ea5c788 -> 3ea5c788", + "3f8f46b3 -> 3f800000", + "3e7c90c7 -> 3e7c90c7", + "3f664da6 -> 3f664da6", + "3ef31c8a -> 3ef31c8a", + "3f80a294 -> 3f800000", + "b836e53a -> 00000000", + "3f3243ab -> 3f3243ab", + "3f18788f -> 3f18788f", + "3e7dcf56 -> 3e7dcf56", + "3eaad3d8 -> 3eaad3d8", + "3f8a06b5 -> 3f800000", + "3f9b5617 -> 3f800000", + "3e086aa6 -> 3e086aa6", + "3f93e05f -> 3f800000", + "3ec94214 -> 3ec94214", + "be29fe1d -> 00000000", + "3f03d5ef -> 3f03d5ef", + "3f3c6a52 -> 3f3c6a52", + "3eae2c39 -> 3eae2c39", + "3f9b953f -> 3f800000", + "3f89ba3a -> 3f800000", + "bd6f28d1 -> 00000000", + "3ebab195 -> 3ebab195", + "3f9ff14b -> 3f800000", + "3f2570d8 -> 3f2570d8", + "3e58501f -> 3e58501f", + "3f7a3f57 -> 3f7a3f57", + "3f2d7f78 -> 3f2d7f78", + "3f2017ca -> 3f2017ca", + "3f8df266 -> 3f800000", + "bd1360bd -> 00000000", + "3f994828 -> 3f800000", + "3f7fe1a0 -> 3f7fe1a0", + "3e0c926c -> 3e0c926c", + "3f733082 -> 3f733082", + "3eaaca4f -> 3eaaca4f", + "3f44e7c7 -> 3f44e7c7", + "3ee54e9b -> 3ee54e9b", + "3ec68eb7 -> 3ec68eb7", + "3e115d15 -> 3e115d15", + "3f3e55a7 -> 3f3e55a7", + "3ed7308c -> 3ed7308c", + "3f2f54ac -> 3f2f54ac", + "3ec789db -> 3ec789db", + "3f99964f -> 3f800000", + "be7a0026 -> 00000000", + "3f9f80c2 -> 3f800000", + "3b3a91c1 -> 3b3a91c1", + "bb1d26ca -> 00000000", + "3ee8643e -> 3ee8643e", + "3eb3c743 -> 3eb3c743", + "be2fbe60 -> 00000000", + "be4e2a19 -> 00000000", + "3f58e74e -> 3f58e74e", + "3f46733c -> 3f46733c", + "3f580176 -> 3f580176", + "3f75956f -> 3f75956f", + "bdbf6749 -> 00000000", + "3f79d058 -> 3f79d058", + "3f8a2dfe -> 3f800000", + "3e74ee1e -> 3e74ee1e", + "3e111202 -> 3e111202", + "3ef08859 -> 3ef08859", + "bd69be5d -> 00000000", + "3f8f3258 -> 3f800000", + "3c0a8c45 -> 3c0a8c45", + "3eef032b -> 3eef032b", + "3e530228 -> 3e530228", + "be514cee -> 00000000", + "3f95fe19 -> 3f800000", + "3ea5540f -> 3ea5540f", + "be7038df -> 00000000", + "be6a1ccf -> 00000000", + "3f5c4c73 -> 3f5c4c73", + "be061063 -> 00000000", + "3f97f08c -> 3f800000", + "3f65485e -> 3f65485e", + "3cd02570 -> 3cd02570", + "3f09bc25 -> 3f09bc25", + "3f9f6040 -> 3f800000", + "3d0d8910 -> 3d0d8910", + "3e88cfbf -> 3e88cfbf", + "3f03af56 -> 3f03af56", + "3f6bb847 -> 3f6bb847", + "3f92ee2e -> 3f800000", + "3f89bfaa -> 3f800000", + "3dca5f8c -> 3dca5f8c", + "3f493f96 -> 3f493f96", + "3f7efc04 -> 3f7efc04", + "3f0fc26c -> 3f0fc26c", + "bafde2f9 -> 00000000", + "3efc8dee -> 3efc8dee", + "3f0aacd3 -> 3f0aacd3", + "bde9ab53 -> 00000000", + "3e279308 -> 3e279308", + "ba441d7c -> 00000000", + "3f220e6f -> 3f220e6f", + "3f8144e2 -> 3f800000", + "3cab9116 -> 3cab9116", + "3e96334a -> 3e96334a", + "3e06fc53 -> 3e06fc53", + "3f97abd2 -> 3f800000", + "3d58a2b0 -> 3d58a2b0", + "3f02652a -> 3f02652a", + "3f112af7 -> 3f112af7", + "3f4be1af -> 3f4be1af", + "3f100e1a -> 3f100e1a", + "3f44f961 -> 3f44f961", + "bde091c3 -> 00000000", + "3eee0d52 -> 3eee0d52", + "3ef5d244 -> 3ef5d244", + "be6f71b5 -> 00000000", + "3efb252e -> 3efb252e", + "be24237f -> 00000000", + "3f4eb060 -> 3f4eb060", + "3e01a695 -> 3e01a695", + "3d7fb1ef -> 3d7fb1ef", + "3f67b134 -> 3f67b134", + "3e78e6ee -> 3e78e6ee", + "3f5cca7a -> 3f5cca7a", + "3f3ace64 -> 3f3ace64", + "3f84cf4a -> 3f800000", + "3f32e962 -> 3f32e962", + "3f0c7f5c -> 3f0c7f5c", + "3dcc985c -> 3dcc985c", + "3f26a3d1 -> 3f26a3d1", + "3f3d7b42 -> 3f3d7b42", + "3e64ed43 -> 3e64ed43", + "3f635678 -> 3f635678", + "3f56b055 -> 3f56b055", + "3e9955f7 -> 3e9955f7", + "3f77137e -> 3f77137e", + "3e5cbb7f -> 3e5cbb7f", + "3f6097b1 -> 3f6097b1", + "3d914b14 -> 3d914b14", + "be4a8d7f -> 00000000", + "3f574d78 -> 3f574d78", + "bccaadb8 -> 00000000", + "3f2cbfac -> 3f2cbfac", + "3ee20677 -> 3ee20677", + "bce0eac9 -> 00000000", + "3f81e1d4 -> 3f800000", + "3f81ef5c -> 3f800000", + "be5a5360 -> 00000000", + "bd0cd3a7 -> 00000000", + "3f1a4628 -> 3f1a4628", + "bce988f0 -> 00000000", + "3c44d486 -> 3c44d486", + "bd0f6857 -> 00000000", + "bddecb48 -> 00000000", + "3e817c5b -> 3e817c5b", + "3c1a6377 -> 3c1a6377", + "3f6b4ba0 -> 3f6b4ba0", + "3d393c72 -> 3d393c72", + "3f88fed4 -> 3f800000", + "3eb8efc4 -> 3eb8efc4", + "3e11da8c -> 3e11da8c", + "3f513014 -> 3f513014", + "3f62ad8c -> 3f62ad8c", + "3f4806bc -> 3f4806bc", + "3ed2424e -> 3ed2424e", + "3ec5f1e7 -> 3ec5f1e7", + "be2adc79 -> 00000000", + "bc34b739 -> 00000000", + "3f840e13 -> 3f800000", + "3eb5ad13 -> 3eb5ad13", + "3e1d8cbb -> 3e1d8cbb", + "3e042bb1 -> 3e042bb1", + "3f5764cb -> 3f5764cb", + "3f865a97 -> 3f800000", + "3f945289 -> 3f800000", + "3f9beda4 -> 3f800000", + "3f19824f -> 3f19824f", + "3ddd46a6 -> 3ddd46a6", + "3f8ac0f1 -> 3f800000", + "3f1bb726 -> 3f1bb726", + "3de4619e -> 3de4619e", + "3e9049fd -> 3e9049fd", + "3eebe0ae -> 3eebe0ae", + "3d1f1634 -> 3d1f1634", + "bd968b80 -> 00000000", + "3f2e3466 -> 3f2e3466", + "be241ce9 -> 00000000", + "3e014b91 -> 3e014b91", + "bacf645d -> 00000000", + "3f2bf053 -> 3f2bf053", + "3ec35cc1 -> 3ec35cc1", + "3ce5f169 -> 3ce5f169", + "be103799 -> 00000000", + "be34b971 -> 00000000", + "bdffd60b -> 00000000", + "3f140f2a -> 3f140f2a", + "3f889326 -> 3f800000", + "3f398cd8 -> 3f398cd8", + "3da8fcb6 -> 3da8fcb6", + "3f88d7b9 -> 3f800000", + "3f48152d -> 3f48152d", + "3f0fbebc -> 3f0fbebc", + "3f4f700a -> 3f4f700a", + "3f818e2a -> 3f800000", + "3f1879e0 -> 3f1879e0", + "be5bb23f -> 00000000", + "3f778db4 -> 3f778db4", + "be779e7d -> 00000000", + "3f77028a -> 3f77028a", + "be3d179a -> 00000000", + "395262dc -> 395262dc", + "bde49e1a -> 00000000", + "3f2b86ac -> 3f2b86ac", + "3e9bb7ad -> 3e9bb7ad", + "3f3b96ab -> 3f3b96ab", + "3e952544 -> 3e952544", + "3f3f8c31 -> 3f3f8c31", + "3f98dcce -> 3f800000", + "3f9747ff -> 3f800000", + "3f04e22a -> 3f04e22a", + "3f5b4121 -> 3f5b4121", + "3eedcd58 -> 3eedcd58", + "bd8b22bf -> 00000000", + "3eb597ae -> 3eb597ae", + "3f42483d -> 3f42483d", + "bda70ddf -> 00000000", + "3f8f9846 -> 3f800000", + "3f131184 -> 3f131184", + "bda5899e -> 00000000", + "3f086a48 -> 3f086a48", + "3d6fa511 -> 3d6fa511", + "3f935b34 -> 3f800000", + "3e477f98 -> 3e477f98", + "3e326a62 -> 3e326a62", + "3f6d358a -> 3f6d358a", + "be3506d9 -> 00000000", + "3f20c9bd -> 3f20c9bd", + "3f9859a9 -> 3f800000", + "bdd7061d -> 00000000", + "3e84dd1f -> 3e84dd1f", + "3f8ee60b -> 3f800000", + "3f0c26b2 -> 3f0c26b2", + "3e8b9800 -> 3e8b9800", + "bd2c45ce -> 00000000", + "3f2d6180 -> 3f2d6180", + "3f861e42 -> 3f800000", + "3f8ea82b -> 3f800000", + "3f997cf5 -> 3f800000", + "3f13211b -> 3f13211b", + "3ecf693b -> 3ecf693b", + "3f1d9101 -> 3f1d9101", + "3ee658ac -> 3ee658ac", + "3f95acfa -> 3f800000", + "3f2982a6 -> 3f2982a6", + "3eaaafb8 -> 3eaaafb8", + "3ef352dd -> 3ef352dd", + "3f0b856e -> 3f0b856e", + "be74d8ca -> 00000000", + "3efe2f66 -> 3efe2f66", + "3efb3533 -> 3efb3533", + "3e910691 -> 3e910691", + "3f646370 -> 3f646370", + "3f9a4612 -> 3f800000", + "be1cad7e -> 00000000", + "3dcc8aeb -> 3dcc8aeb", + "bddf5d1c -> 00000000", + "3f880022 -> 3f800000", + "3f8144ee -> 3f800000", + "3f07f96f -> 3f07f96f", + "3e4f9610 -> 3e4f9610", + "3f3c2967 -> 3f3c2967", + "bd23f0fd -> 00000000", + "3f1fb4f9 -> 3f1fb4f9", + "be7ee331 -> 00000000", + "3f42b5ca -> 3f42b5ca", + "3e23f15c -> 3e23f15c", + "3f028c73 -> 3f028c73", + "3f0a2471 -> 3f0a2471", + "3d2bbbd6 -> 3d2bbbd6", + "3f577729 -> 3f577729", + "bca3c370 -> 00000000", + "3f92770c -> 3f800000", + "3f9c223b -> 3f800000", + "3f00d6f4 -> 3f00d6f4", + "bdf391d8 -> 00000000", + "3f99427c -> 3f800000", + "3f5a1aae -> 3f5a1aae", + "3f88f318 -> 3f800000", + "be284341 -> 00000000", + "3f63e069 -> 3f63e069", + "3f0c118b -> 3f0c118b", + "3d644bca -> 3d644bca", + "3f9cfe7e -> 3f800000", + "3f586277 -> 3f586277", + "3f490299 -> 3f490299", + "3f982be7 -> 3f800000", + "3f963834 -> 3f800000", + "3f9cf84c -> 3f800000", + "3ede9435 -> 3ede9435", + "3f94b07e -> 3f800000", + "3f29e30e -> 3f29e30e", + "3f0f1163 -> 3f0f1163", + "3f747b9c -> 3f747b9c", + "3e33265e -> 3e33265e", + "3de5163a -> 3de5163a", + "3f3b5952 -> 3f3b5952", + "3f474a76 -> 3f474a76", + "3f1a7480 -> 3f1a7480", + "3f965a3e -> 3f800000", + "3eae9db1 -> 3eae9db1", + "be1beb51 -> 00000000", + "3ed933b5 -> 3ed933b5", + "3f1d2bcb -> 3f1d2bcb", + "3e5a34e5 -> 3e5a34e5", + "3edb65f0 -> 3edb65f0", + "3f5dc849 -> 3f5dc849", + "3f626a8e -> 3f626a8e", + "3e27f9b6 -> 3e27f9b6", + "3d9d30eb -> 3d9d30eb", + "3f130bb6 -> 3f130bb6", + "3eeaab89 -> 3eeaab89", + "3f8e11ec -> 3f800000", + "3e5f8e6f -> 3e5f8e6f", + "3ec49893 -> 3ec49893", + "3ec3a6c3 -> 3ec3a6c3", + "3f48496e -> 3f48496e", + "3e4f27be -> 3e4f27be", + "3ee2272b -> 3ee2272b", + "be318e4f -> 00000000", + "3f64ab1a -> 3f64ab1a", + "bddbe4fc -> 00000000", + "3f781c33 -> 3f781c33", + "be50120e -> 00000000", + "3f21c4b0 -> 3f21c4b0", + "bdcc7bfe -> 00000000", + "3e4a76d1 -> 3e4a76d1", + "3f60c4d0 -> 3f60c4d0", + "3f7bb7d5 -> 3f7bb7d5", + "3f3b6c58 -> 3f3b6c58", + "3f291bc0 -> 3f291bc0", + "3f380a1e -> 3f380a1e", + "3f993fe4 -> 3f800000", + "3f48bd38 -> 3f48bd38", + "3dcd69a6 -> 3dcd69a6", + "be076f1f -> 00000000", + "bd9a78d0 -> 00000000", + "3f5e812c -> 3f5e812c", + "3f9c0e16 -> 3f800000", + "be385c44 -> 00000000", + "3f9d8a55 -> 3f800000", + "3eb6bb13 -> 3eb6bb13", + "3f5edc81 -> 3f5edc81", + "3f439a7e -> 3f439a7e", + "3f6f60b6 -> 3f6f60b6", + "3ea10b2a -> 3ea10b2a", + "3f57b9f5 -> 3f57b9f5", + "3f4917f7 -> 3f4917f7", + "3f1b0e01 -> 3f1b0e01", + "3f99da4d -> 3f800000", + "3f973d4e -> 3f800000", + "3f64459a -> 3f64459a", + "3f272c82 -> 3f272c82", + "bdf3cfd6 -> 00000000", + "3d265455 -> 3d265455", + "3e737566 -> 3e737566", + "3f94bbc8 -> 3f800000", + "3ed78b8a -> 3ed78b8a", + "3f6176cb -> 3f6176cb", + "3ec32343 -> 3ec32343", + "3f01443a -> 3f01443a", + "3e23b327 -> 3e23b327", + "3ee61a65 -> 3ee61a65", + "3f2863b3 -> 3f2863b3", + "3e440ab5 -> 3e440ab5", + "3f4e0dbc -> 3f4e0dbc", + "3f8da033 -> 3f800000", + "3f8360c7 -> 3f800000", + "3e097a39 -> 3e097a39", + "3ea20829 -> 3ea20829", + "3cb869c0 -> 3cb869c0", + "bd80eaf0 -> 00000000", + "3e8dc739 -> 3e8dc739", + "3eb14bc6 -> 3eb14bc6", + "3e5cab18 -> 3e5cab18", + "3eb5eaa5 -> 3eb5eaa5", + "bd8c8583 -> 00000000", + "3f669306 -> 3f669306", + "3f81f161 -> 3f800000", + "3f713b95 -> 3f713b95", + "3f2e7f87 -> 3f2e7f87", + "be01bddb -> 00000000", + "3ee2e9a1 -> 3ee2e9a1", + "3e3f535b -> 3e3f535b", + "3f491613 -> 3f491613", + "bda88e83 -> 00000000", + "3f950310 -> 3f800000", + "bd6a6744 -> 00000000", + "3f99d64a -> 3f800000", + "3f115340 -> 3f115340", + "3e083bae -> 3e083bae", + "3f8905a1 -> 3f800000", + "3f896e90 -> 3f800000", + "3f7a8539 -> 3f7a8539", + "3e0e5760 -> 3e0e5760", + "be552710 -> 00000000", + "3eb05f72 -> 3eb05f72", + "3f96376c -> 3f800000", + "3f7b22ce -> 3f7b22ce", + "bd38b7ec -> 00000000", + "3ef96088 -> 3ef96088", + "3e124072 -> 3e124072", + "3f5d6991 -> 3f5d6991", + "3e91809c -> 3e91809c" + ] + } + ] +} diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/rgb-to-bw.json b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/rgb-to-bw.json new file mode 100644 index 00000000..592b8ace --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/cycles-oracle/rgb-to-bw.json @@ -0,0 +1,1040 @@ +{ + "oracle": "tools/cycles-oracle/oracle.py (Blender 5.2.2 LTS, build d13f752e3b9c, Cycles CPU, 1 sample, Emit bake, float Non-Color images)", + "blender": "5.2.2 LTS", + "build_hash": "d13f752e3b9c", + "platform": "Linux", + "encoding": "each case is 'operands -> results', every scalar a float32 bit pattern in hex, colours flattened as r g b", + "family": "rgb-to-bw", + "functions": [ + { + "function": "cycles_rgb_to_bw", + "node": "ShaderNodeRGBToBW", + "cases": [ + "00000000 00000000 00000000 -> 00000000", + "00000000 00000000 3e800000 -> 3c93d9ca", + "00000000 00000000 3f000000 -> 3d13d9ca", + "00000000 00000000 3f400000 -> 3d5dc6af", + "00000000 00000000 3f800000 -> 3d93d9ca", + "00000000 3e800000 00000000 -> 3e371553", + "00000000 3e800000 3e800000 -> 3e49908c", + "00000000 3e800000 3f000000 -> 3e5c0bc6", + "00000000 3e800000 3f400000 -> 3e6e86ff", + "00000000 3e800000 3f800000 -> 3e80811c", + "00000000 3f000000 00000000 -> 3eb71553", + "00000000 3f000000 3e800000 -> 3ec052f0", + "00000000 3f000000 3f000000 -> 3ec9908c", + "00000000 3f000000 3f400000 -> 3ed2ce29", + "00000000 3f000000 3f800000 -> 3edc0bc6", + "00000000 3f400000 00000000 -> 3f094ffe", + "00000000 3f400000 3e800000 -> 3f0deecc", + "00000000 3f400000 3f000000 -> 3f128d9b", + "00000000 3f400000 3f400000 -> 3f172c69", + "00000000 3f400000 3f800000 -> 3f1bcb37", + "00000000 3f800000 00000000 -> 3f371553", + "00000000 3f800000 3e800000 -> 3f3bb421", + "00000000 3f800000 3f000000 -> 3f4052f0", + "00000000 3f800000 3f400000 -> 3f44f1be", + "00000000 3f800000 3f800000 -> 3f49908c", + "3e800000 00000000 00000000 -> 3d59be10", + "3e800000 00000000 3e800000 -> 3d91d57a", + "3e800000 00000000 3f000000 -> 3db6cbed", + "3e800000 00000000 3f400000 -> 3ddbc260", + "3e800000 00000000 3f800000 -> 3e005c69", + "3e800000 3e800000 00000000 -> 3e6d84d7", + "3e800000 3e800000 3e800000 -> 3e800008", + "3e800000 3e800000 3f000000 -> 3e893da5", + "3e800000 3e800000 3f400000 -> 3e927b41", + "3e800000 3e800000 3f800000 -> 3e9bb8de", + "3e800000 3f000000 00000000 -> 3ed24d15", + "3e800000 3f000000 3e800000 -> 3edb8ab2", + "3e800000 3f000000 3f000000 -> 3ee4c84e", + "3e800000 3f000000 3f400000 -> 3eee05eb", + "3e800000 3f000000 3f800000 -> 3ef74388", + "3e800000 3f400000 00000000 -> 3f16ebdf", + "3e800000 3f400000 3e800000 -> 3f1b8aad", + "3e800000 3f400000 3f000000 -> 3f20297c", + "3e800000 3f400000 3f400000 -> 3f24c84a", + "3e800000 3f400000 3f800000 -> 3f296718", + "3e800000 3f800000 00000000 -> 3f44b134", + "3e800000 3f800000 3e800000 -> 3f495002", + "3e800000 3f800000 3f000000 -> 3f4deed1", + "3e800000 3f800000 3f400000 -> 3f528d9f", + "3e800000 3f800000 3f800000 -> 3f572c6d", + "3f000000 00000000 00000000 -> 3dd9be10", + "3f000000 00000000 3e800000 -> 3dfeb482", + "3f000000 00000000 3f000000 -> 3e11d57a", + "3f000000 00000000 3f400000 -> 3e2450b4", + "3f000000 00000000 3f800000 -> 3e36cbed", + "3f000000 3e800000 00000000 -> 3e91fa2e", + "3f000000 3e800000 3e800000 -> 3e9b37cb", + "3f000000 3e800000 3f000000 -> 3ea47567", + "3f000000 3e800000 3f400000 -> 3eadb304", + "3f000000 3e800000 3f800000 -> 3eb6f0a0", + "3f000000 3f000000 00000000 -> 3eed84d7", + "3f000000 3f000000 3e800000 -> 3ef6c274", + "3f000000 3f000000 3f000000 -> 3f000008", + "3f000000 3f000000 3f400000 -> 3f049ed6", + "3f000000 3f000000 3f800000 -> 3f093da5", + "3f000000 3f400000 00000000 -> 3f2487c0", + "3f000000 3f400000 3e800000 -> 3f29268e", + "3f000000 3f400000 3f000000 -> 3f2dc55d", + "3f000000 3f400000 3f400000 -> 3f32642b", + "3f000000 3f400000 3f800000 -> 3f3702f9", + "3f000000 3f800000 00000000 -> 3f524d15", + "3f000000 3f800000 3e800000 -> 3f56ebe3", + "3f000000 3f800000 3f000000 -> 3f5b8ab2", + "3f000000 3f800000 3f400000 -> 3f602980", + "3f000000 3f800000 3f800000 -> 3f64c84e", + "3f400000 00000000 00000000 -> 3e234e8c", + "3f400000 00000000 3e800000 -> 3e35c9c5", + "3f400000 00000000 3f000000 -> 3e4844fe", + "3f400000 00000000 3f400000 -> 3e5ac038", + "3f400000 00000000 3f800000 -> 3e6d3b71", + "3f400000 3e800000 00000000 -> 3ead31f0", + "3f400000 3e800000 3e800000 -> 3eb66f8d", + "3f400000 3e800000 3f000000 -> 3ebfad29", + "3f400000 3e800000 3f400000 -> 3ec8eac6", + "3f400000 3e800000 3f800000 -> 3ed22862", + "3f400000 3f000000 00000000 -> 3f045e4c", + "3f400000 3f000000 3e800000 -> 3f08fd1a", + "3f400000 3f000000 3f000000 -> 3f0d9be9", + "3f400000 3f000000 3f400000 -> 3f123ab7", + "3f400000 3f000000 3f800000 -> 3f16d985", + "3f400000 3f400000 00000000 -> 3f3223a1", + "3f400000 3f400000 3e800000 -> 3f36c26f", + "3f400000 3f400000 3f000000 -> 3f3b613e", + "3f400000 3f400000 3f400000 -> 3f40000c", + "3f400000 3f400000 3f800000 -> 3f449eda", + "3f400000 3f800000 00000000 -> 3f5fe8f6", + "3f400000 3f800000 3e800000 -> 3f6487c4", + "3f400000 3f800000 3f000000 -> 3f692693", + "3f400000 3f800000 3f400000 -> 3f6dc561", + "3f400000 3f800000 3f800000 -> 3f72642f", + "3f800000 00000000 00000000 -> 3e59be10", + "3f800000 00000000 3e800000 -> 3e6c3949", + "3f800000 00000000 3f000000 -> 3e7eb482", + "3f800000 00000000 3f400000 -> 3e8897de", + "3f800000 00000000 3f800000 -> 3e91d57a", + "3f800000 3e800000 00000000 -> 3ec869b2", + "3f800000 3e800000 3e800000 -> 3ed1a74f", + "3f800000 3e800000 3f000000 -> 3edae4eb", + "3f800000 3e800000 3f400000 -> 3ee42288", + "3f800000 3e800000 3f800000 -> 3eed6024", + "3f800000 3f000000 00000000 -> 3f11fa2e", + "3f800000 3f000000 3e800000 -> 3f1698fc", + "3f800000 3f000000 3f000000 -> 3f1b37cb", + "3f800000 3f000000 3f400000 -> 3f1fd699", + "3f800000 3f000000 3f800000 -> 3f247567", + "3f800000 3f400000 00000000 -> 3f3fbf82", + "3f800000 3f400000 3e800000 -> 3f445e50", + "3f800000 3f400000 3f000000 -> 3f48fd1f", + "3f800000 3f400000 3f400000 -> 3f4d9bed", + "3f800000 3f400000 3f800000 -> 3f523abb", + "3f800000 3f800000 00000000 -> 3f6d84d7", + "3f800000 3f800000 3e800000 -> 3f7223a5", + "3f800000 3f800000 3f000000 -> 3f76c274", + "3f800000 3f800000 3f400000 -> 3f7b6142", + "3f800000 3f800000 3f800000 -> 3f800008", + "00000000 00000000 00000000 -> 00000000", + "3e800000 3e800000 3e800000 -> 3e800008", + "3f000000 3f000000 3f000000 -> 3f000008", + "3f400000 3f400000 3f400000 -> 3f40000c", + "3f800000 3f800000 3f800000 -> 3f800008", + "3fa00000 3fa00000 3fa00000 -> 3fa0000a", + "be800000 be800000 be800000 -> be800008", + "3dcccccd 3dcccccd 3dcccccd -> 3dccccdb", + "3f666666 3f666666 3f666666 -> 3f666675", + "3eaaaaaa 3eaaaaaa 3eaaaaaa -> 3eaaaab5", + "3f2aaaab 3f2aaaab 3f2aaaab -> 3f2aaab6", + "be34c42d be34c42d 3f8a2f70 -> bdafd13d", + "3f94c6b2 be6514bf 3f94c6b2 -> 3e2f2d83", + "3f328346 3e02979b 3e882848 -> 3e8471e7", + "3f9e1e69 3f446f1b 3f446f1b -> 3f5de8bb", + "3f70cffb 3f70cffb 3f5c3433 -> 3f6f532b", + "3f828fc0 3d81869f 3ec5ed02 -> 3e947f39", + "3f75dfb1 3f855fee be43de04 -> 3f6f84af", + "3e2336ec 3f6f4518 3e2336ec -> 3f36bd99", + "3f4dd0e6 3f377f01 3f4dd0e6 -> 3f3dda8d", + "3f20777e 3f9225ed 3f68f38a -> 3f81fd77", + "bd900dbf 3f048bd5 bd900dbf -> 3eb35401", + "3ee0a8e9 3ee0a8e9 3f50b401 -> 3eee932e", + "be4db501 3f12362c be4db501 -> 3eb3d60b", + "3e986067 3ec0b22d 3f847e4e -> 3ed078c0", + "3f80a11f bd0fc7b3 bd0fc7b3 -> 3e3e82e7", + "3f87c04d 3f773208 3f039388 -> 3f740475", + "3f086e61 3f086e61 3f0640c3 -> 3f084628", + "3f0c5d1f 3cddbfb0 3f0c5d1f -> 3e33be66", + "3f244378 3f244378 3f94cb24 -> 3f2de382", + "3f10a87a 3da766d5 3f987647 -> 3e877a08", + "3d1c3860 3f2ed635 3b1d3ee6 -> 3efe5112", + "bdd07ec6 3d26702b 3f9ed8c7 -> 3dc6a9b1", + "3e2a86b8 3f8d2875 3f8d2875 -> 3f67599c", + "bd9662d0 bd9662d0 3ecc919e -> bd20e962", + "3f7d2a2d 3f30437f 3f7d2a2d -> 3f462aef", + "3d41665c bdb61ebb 3d41665c -> bd4d6826", + "3f934551 3f50cde7 3f965496 -> 3f69aabf", + "3eb18154 bd646111 3eb18154 -> 3d7124af", + "3f958962 3f958962 3f8f1031 -> 3f9511c8", + "bd35d643 3f634f54 3f634f54 -> 3f308efc", + "3f6aa237 3f434291 3f434291 -> 3f4ba1f1", + "be0f9781 3efbe6a4 bd85b987 -> 3ea278c0", + "be5ce926 3ec8d36a 3f5be2d9 -> 3e97e2bb", + "3f61d13c 3f045b6e 3f35daf5 -> 3f1bcdd1", + "3f88d5cd bd88bbbb 3f88d5cd -> 3e837404", + "3f037ac5 3f3f5b64 3e9fe859 -> 3f2a9518", + "3e464b3f 3f143445 3e464b3f -> 3ef038e9", + "3f29f8f5 3f29f8f5 3f046818 -> 3f2742bb", + "be33dcad 3e964e8e 3e930e6e -> 3e45fa0c", + "3f535bb4 3f535bb4 3ecc8dae -> 3f4b7bc9", + "3f31645d 3f31645d 3e956128 -> 3f29fa54", + "3f9b8cd3 3f0559c5 3e54d958 -> 3f255ca4", + "3f818b56 3f0e72ed 3e8ff7bd -> 3f222a06", + "3e05d1e9 3f9887e7 3e05d1e9 -> 3f63b325", + "3dad12a1 bccf4589 3dad12a1 -> 3bc3cf20", + "3f744953 3f919f8c be74c3c1 -> 3f7fd159", + "3f8d3f8f 3f8d3f8f 3f4fd144 -> 3f8a8d81", + "3db1afff 3f57a9c4 3db1afff -> 3f208fe0", + "3f492cd6 3e59dbc8 3ea682ce -> 3eaf7aa9", + "3f07fe94 3eb1ead9 3eb1ead9 -> 3ec5ebbb", + "be1cf212 3f0bebe5 bd0918dc -> 3eb63622", + "3eb80ce8 3eb80ce8 be63b8d2 -> 3ea28b26", + "bbefc5fa 3ef8adf6 3ef8adf6 -> 3ec30110", + "bdad310d 3e947454 3f16677a -> 3e6d5bd6", + "3f5de4f2 3f00a769 bd54075c -> 3f0a3c6e", + "3f19f1f3 3f19f1f3 3e6aa0d0 -> 3f1310f0", + "3e17497d 3e212523 3f7dd35c -> 3e5cb687", + "3e613f84 3edab5c4 3f8cc9eb -> 3edd04c5", + "3f2c9b9a 3f881599 3f2c9b9a -> 3f73cf96", + "3f020d05 3f6a22a1 3f020d05 -> 3f4c7d2c", + "3f1877bd 3db4aebd 3ea73d8b -> 3e5a7054", + "3f98faa6 3eb076d8 3eb076d8 -> 3f06877f", + "3f880d8a 3f972503 3e4ee8b7 -> 3f8ae42a", + "3ef6b98e 3ef6b98e 3f53abed -> 3f01bce2", + "3e8753d2 3f854df7 3f88d236 -> 3f60d044", + "be1322ac 3cef0347 be1322ac -> bca45616", + "3f8b508c 3deed1c3 3f27cb09 -> 3eb96bc0", + "3f3034ff 3c28d0f7 3c28d0f7 -> 3e1e2e74", + "3ed58b4a 3ea3c8ab 3f853476 -> 3ec901b7", + "3f8dddfa 3f9781d9 bdd4909c -> 3f898f88", + "3f6b8d95 3e022b0e 3e022b0e -> 3e976b99", + "3eb1dc39 3f6517ce 3c66d26d -> 3f3702b8", + "3ee1ebd3 3f903997 3ec35b72 -> 3f6d5cac", + "be31135e 3f83b503 3f83b503 -> 3f45fd2c", + "3f958ea4 3f276837 3f958ea4 -> 3f4cebf3", + "be214b05 3ed1cf81 3ed1cf81 -> 3e940c59", + "3f8ebf89 3f70054e 3f8ebf89 -> 3f7cf94f", + "be767468 3f8f734b be767468 -> 3f3ba20d", + "3d88d5b1 3d88d5b1 3f7bc03f -> 3e082d34", + "be4293e5 3f10ef6f 3f10ef6f -> 3ecf8bae", + "3f9f1b31 3e84d003 bc9a986c -> 3ee59d5e", + "3f7b1e3e 3f43c51a 3f43c51a -> 3f4f8a10", + "3f70df56 3e9df053 3e74c8df -> 3ee039ff", + "bdbedeae 3f8bdf1c be6a6c9e -> 3f3ec265", + "3e2b78ee bd471726 3f3b6cf6 -> 3d5bf4b7", + "3f92fda4 3e18cd34 3f8f5437 -> 3edd0d7c", + "3c3512f3 bda499c0 3c3512f3 -> bd5e8a65", + "be55d80c 3ee223da 3ee223da -> 3e9b5179", + "3de1a2e2 3e9034c0 3de1a2e2 -> 3e6e65cc", + "3f7746ea 3f7746ea 3f27ec6f -> 3f718c6a", + "3f5026d7 3f80b2aa 3f2131f0 -> 3f6ffad8", + "3f659946 3f659946 3ed00b34 -> 3f5c8881", + "3f800217 3f137249 3e6cc8e1 -> 3f242968", + "3f48f24a 3f48f24a 3f48b674 -> 3f48ee05", + "3f260264 3f260264 3f042d6a -> 3f23912c", + "3ee39a6c 3e1c836b 3ee39a6c -> 3e71973e", + "3f2d5606 3e6b43f4 3f2d5606 -> 3eb6dedb", + "3f36f3cb 3e0013c3 3f4a735e -> 3e98d5c2", + "3f1ea804 3f0eb349 3f0eb349 -> 3f1217e5", + "3b55781d 3f95b266 3b55781d -> 3f565acb", + "3f8cc03e 3f68d665 3f8cc03e -> 3f76b2e9", + "3f980bed 3f53d24d 3f21fa6b -> 3f63d80c", + "3ec5f41e bb9b69e8 3f6f3e1c -> 3e15cc5f", + "3f85d3f3 3f85d3f3 be489880 -> 3f74b681", + "3e52e377 3e52e377 3f4bb009 -> 3e7e7bb3", + "3dfbeaec 3f826c28 3f9c5a55 -> 3f57d1be", + "3e5d1a47 3eb9cb0a 3e5d1a47 -> 3ea45caf", + "3eadaecb 3f543de8 3d9dbbb0 -> 3f2bad97", + "3f464d36 3f1f4e07 3f464d36 -> 3f2a6998", + "3f85d00d 3e733e18 3f85d00d -> 3eef6fae", + "3cba1ad0 3cba1ad0 be3d16ee -> 3bfdd96e", + "bdca2613 bdca2613 3f9a5c7f -> bb941470", + "3e3972ab 3d0d57a2 3d0d57a2 -> 3d8682bf", + "3f316f4e 3dc6d760 3dc6d760 -> 3e6532c5", + "3f9afed6 3edf1bfa 3dd936a7 -> 3f13a823", + "be548127 3f49c39c 3f49c39c -> 3f13908e", + "3e44f954 3e44f954 3f6be87a -> 3e7ae0a0", + "3ea40f0d 3f285517 3f285517 -> 3f15fb2d", + "bdb75840 3f8223f4 3f9532fd -> 3f4ad053", + "bd08d8c7 3e1e2902 3f1be3e0 -> 3e16da64", + "3f8e478e 3ee894ce 3f8e478e -> 3f24380c", + "3ddca232 3f788613 3edecd11 -> 3f3fa4aa", + "3f410346 3eea260a 3f5adb3e -> 3f0c91e1", + "3f994d28 3e8c208f 3f994d28 -> 3f097003", + "3f21c823 be26958e 3f21c823 -> 3d825f80", + "3f5f4a7d bdf7ea45 3f56d4b1 -> 3e234ecf", + "3f631197 3f208a82 3f208a82 -> 3f2eb006", + "3f16153b 3f9c23bf 3f9c23bf -> 3f8ae528", + "bdf283b2 bdf283b2 3e4eb56d -> bdc32942", + "3d086232 3f232e87 3d086232 -> 3eee42ca", + "be727f8b 3f366bea bda3cbe8 -> 3ee82f9c", + "3d960add 3f747110 3f747110 -> 3f4473c0", + "3f804796 3f4c468f 3f804796 -> 3f5b2af9", + "3f2ee04c 3f77ef34 be67247f -> 3f52542d", + "3e193121 3f39cc3c be0185ef -> 3f0aaece", + "3f09980d be393bc6 be393bc6 -> bce683d4", + "3e827e56 3e827e56 3edfd751 -> 3e893b8e", + "3f2e5a57 3edbb970 3f2e5a57 -> 3f003b36", + "3f7fca4d 3da4abe4 3f2ee990 -> 3ea37a92", + "3f688f7e be4823ab be4823ab -> 3d20e520", + "3edebd06 3f462093 3e67f59c -> 3f298ff8", + "3eb22b2c 3e69b6f0 3e69b6f0 -> 3e81e504", + "3eb3ede5 be4e7a63 3eb3ede5 -> bd34ab99", + "3f9fe093 3e7af98a 3f9fe093 -> 3f07f2d8", + "3ef3e74c bd0b6ce1 bd7fc556 -> 3d945d6c", + "3e265efa 3f48d646 3f0e4c5a -> 3f22bfe4", + "bda9a0da 3f0bf530 bda9a0da -> 3ebc1baa", + "3f11af89 3f11af89 3f91d6e4 -> 3f1c39b9", + "3f98f3f0 3f15770d be440200 -> 3f286719", + "3e363e3f 3e932e10 3edafe2f -> 3e8c71ba", + "3f9649bc 3ebb949d 3e134606 -> 3f05a5ec", + "3d2f551d 3f011ef0 3f452b14 -> 3ed9d0a7", + "3e9c8bbf be7db53f be7db53f -> be052f38", + "3f38fd2f 3e230ff4 3f4e5a3f -> 3ea6c650", + "3e886b1e 3f66b3aa 3f9eb6df -> 3f4a692b", + "3e977b59 3e977b59 3f0c45bd -> 3ea0cca4", + "be397b41 bdf1493c 3dd09906 -> bdec61df", + "3e93183a 3f981973 3e93183a -> 3f6e8092", + "3eaa219b 3f725008 3f725008 -> 3f50e041", + "3ef115c4 3f59ef8b 3ef115c4 -> 3f3e31fc", + "3e4715b5 3f475e13 be7e5fdb -> 3f1492e2", + "3f86973d 3f71062c bdbab335 -> 3f63ed3e", + "3f6413e0 be658dcd be611a61 -> 3c5927c2", + "3f4afb19 3f883f54 3f4afb19 -> 3f7cb1fc", + "3f3dd2fa 3f99d4cd 3f99d4cd -> 3f8d4d8a", + "3f172ab4 3ed9627a 3f8745a0 -> 3f0168a0", + "3f91d500 bd3898d8 bd3898d8 -> 3e53bd95", + "3f8bc784 3e607b9d 3eec2f03 -> 3ed8366c", + "3dc08939 3e899a7d be7b8b1e -> 3e472157", + "3f79a8ec 3f79a8ec 3f7d9ff6 -> 3f79f244", + "3dc40e14 3dc40e14 3f501355 -> 3e170971", + "3f3a12aa 3d8282e5 3d8282e5 -> 3e51a533", + "3f6ce683 3f46f649 3f8b2075 -> 3f54c0f3", + "3e736386 be62075d 3f1d3c7a -> bd80faa8", + "3d133702 3f14dd90 3f14dd90 -> 3eee55c0", + "3f2a942b 3e85b731 3ecf671a -> 3eb7254b", + "bc46d584 3f89114f 3f0b845a -> 3f4d76ec", + "3e8f816e 3e8ccf9f 3e8ccf9f -> 3e8d6256", + "be05d9b3 3f49b04a 3f49b04a -> 3f17afbd", + "3f3cc3c8 3f1b7e0b 3f9d899b -> 3f2e1696", + "bda8c163 3f1d1e92 3f05b683 -> 3eeb11b3", + "3f3712ae 3f81ac4c 3f81ac4c -> 3f7320af", + "3ef8c0c2 3f94e0d4 be378b53 -> 3f6c14b6", + "3f180c8b 3eccf599 3f180c8b -> 3ee9328a", + "3e5598ac 3f7ae347 3e5598ac -> 3f42a311", + "bcd000f0 bcd000f0 3f883987 -> 3d5a354e", + "3f6300fe 3f6300fe 3df1950c -> 3f54cbce", + "3e6e6ea8 3e6e6ea8 3df66c74 -> 3e661d49", + "3f0789bc 3f6a0f98 be3b06e0 -> 3f40d69d", + "3f6ccc84 be5b12d1 3f4a0a0b -> 3dce2894", + "3eda96a9 3f63afaa 3f63afaa -> 3f4a82fc", + "3cad00c4 3f79f2eb 3f79f2eb -> 3f45f328", + "3f9d8d6b 3eb14a08 3eb14a08 -> 3f08cc8a", + "3f190d46 3f95d795 3f190d46 -> 3f80f5a0", + "3f80db9d be7d9326 3f433496 -> 3dbc71f2", + "3f396dd6 be76c363 3ecbaea4 -> 3c2a6300", + "3e265e83 3efe0f2d 3e265e83 -> 3ecd6394", + "3f1fd620 3d4b4156 3f1fd620 -> 3e5a724c", + "3f83d7b2 3f719c9d 3e8228f6 -> 3f698fb4", + "3f8d61cc 3f620d86 3f8d61cc -> 3f7234ca", + "3f8b9511 bd35ad48 bd35ad48 -> 3e49af12", + "3d0e6ce5 3e5e0613 3ee12e9a -> 3e46de6c", + "3f590ed5 3f90a687 3f590ed5 -> 3f865cb1", + "3f92c3bc 3f25c0a8 3f25c0a8 -> 3f40ec4b", + "3f1e3b4c 3f1e3b4c 3f98553b -> 3f28cda3", + "3f88e41a 3f5f2473 3f88e41a -> 3f6d90ff", + "3ecb1772 3e13add7 be31a17c -> 3e33298b", + "3ebf2414 3f2562a7 3f2562a7 -> 3f168a47", + "3ee9138b 3f7fccf9 3f3d2f46 -> 3f5d610b", + "3f991133 3d5b09e5 3d5b09e5 -> 3e97c007", + "3f47bacf 3e0ab75c 3e0ab75c -> 3e8b8cf7", + "3d977af4 3f4dbaed 3d977af4 -> 3f188672", + "3f854d79 3f81924a 3f854d79 -> 3f82a264", + "3f8ecff3 3f2d6bf1 3f4620f6 -> 3f471071", + "3f1870a6 3f92f26c 3f43316c -> 3f805855", + "3e5ef38a 3ec56bfd 3f31f90c -> 3ebe973e", + "3ec1fb26 3eef8064 3ec1fb26 -> 3ee2893d", + "3f9f506d 3f9bdc15 3ef760dd -> 3f95cea5", + "3f4119d1 3f801e2f be165cea -> 3f5d9955", + "3f9a5420 3f8d4410 3f214392 -> 3f8baa95", + "be684675 be684675 3f8eb257 -> be0517f4", + "bcdaad93 3dc32e60 bcdaad93 -> 3d780827", + "3f98ca22 be0cb84f 3e805b0b -> 3e31ce72", + "3f8dd1dd 3f96ceeb 3e685924 -> 3f8c1b49", + "3f2cf8fb 3f8cbb6e 3f8f04a7 -> 3f815cce", + "3e52d5f4 3ebf444b 3ebf444b -> 3ead031a", + "3f872b43 3d13afc3 be720aa1 -> 3e6ede8a", + "3f03fd92 bd0a97c7 3f43678d -> 3e0fe9c6", + "3f3a9163 3d6e3f27 3d6e3f27 -> 3e4d9547", + "3f54279d 3f39b55f 3f54279d -> 3f413dcc", + "3f4c2213 3f5d18c6 be578e0e -> 3f45a34c", + "3ba40d10 3f2838cd 3ba40d10 -> 3ef15824", + "bdb831bb 3eb66dce 3f934205 -> 3ea3331a", + "3f4ff68c 3f69ee2e bd20c32a -> 3f52cba6", + "3eb3ecd1 3f24e2fe 3eb3ecd1 -> 3f0f8bcb", + "3f94f7eb 3f94f7eb 3e4d6407 -> 3f8c114e", + "3f85dfee 3f96c661 3f85dfee -> 3f91f61b", + "3e0910a3 3f3b0966 3e0910a3 -> 3f0f85e3", + "3d8908fe 3f774e02 3d8908fe -> 3f35be63", + "3f8e182c 3f2fc15e 3f2fc15e -> 3f46d00e", + "3e4492dc be324115 3f60fdcc -> bca5b188", + "3f55d50b be394e8c 3e57d67c -> 3d81dd76", + "3e1b7149 3f5ac7a4 be3bf532 -> 3f2155e9", + "be580131 3f68ece4 3e0fc9fa -> 3f1db182", + "3f3e884b be1aaec7 be3e9b0a -> 3d16b213", + "3f562700 3ed6a43a 3f1b0997 -> 3f057b74", + "3f5adb3e 3d45c45c be026152 -> 3e5418b0", + "3f198bc4 3f074fe8 3f074fe8 -> 3f0b3082", + "3f71e2d0 3f25a676 3f25a676 -> 3f35dc70", + "3f7e2a56 3f833667 3f7e2a56 -> 3f82094d", + "3f34733d 3f5fabb9 be16dea4 -> 3f439c3b", + "3f977152 3f977152 3f34664f -> 3f930582", + "3e60ff3a bd16a455 3f7d7b98 -> 3dbc374e", + "3cabd9fa 3cabd9fa 3f6eb97e -> 3db1bc19", + "3f8f9b0d 3f3254fc be37f3fa -> 3f394a34", + "3f34e179 3f72a7b2 3e26f2ce -> 3f5703ce", + "bdf1614b 3e4afcb5 3eac2122 -> 3e105c16", + "3ee46861 3f62e7c4 3f6db08a -> 3f4bb829", + "3f0ab740 3ed7d0cc 3f0ab740 -> 3ee95db4", + "bd5ea255 3ef0aaef 3eedd398 -> 3eb75eb0", + "be063779 3f2c3751 3f2c3751 -> 3f007622", + "3f9f9976 3f170b65 3f170b65 -> 3f3acd05", + "bd33584d 3f9599b4 be0d2891 -> 3f510c4d", + "bd3304d6 3f931cc8 bc7ca5e6 -> 3f4fc1a3", + "3f6dca1f 3f95c9f2 3ea22423 -> 3f875518", + "3f4a92be 3f365114 3f365114 -> 3f3a9fcc", + "3f2874cd 3f4f5bce bd76bb70 -> 3f3700ec", + "bdd0d8b8 3f3de445 bdd0d8b8 -> 3f005e71", + "3f833cba 3f9e73d1 3f12afc2 -> 3f928573", + "3ec9f5bb 3f94c5f2 3d455bf0 -> 3f6b28a8", + "3e23a223 3dc329bd 3f795baa -> 3e3096ea", + "bd68f888 bd68f888 3f88dd32 -> 3cc80da4", + "3ce395e0 3f78fc21 3f78fc21 -> 3f458db2", + "3f4f9c3e 3f501ecd 3ec91d7e -> 3f483f30", + "3e71b537 3dc5196a 3f063f75 -> 3e20a4a2", + "3d538e49 3f68c891 3e390798 -> 3f2ca16d", + "3f398d0d 3f0f0f95 3e4812ba -> 3f11610a", + "3ec87284 3ec87284 bd8e32ad -> 3eb76907", + "3ee569bb be3a6cb0 3f31bdb1 -> 3c790d14", + "3ec7ec6d 3e8b5b8c 3f2edfda -> 3ea76cd6", + "bdb9e9b2 3ea5bf94 3ee1a33e -> 3e79e38c", + "3f3e0a03 3f807da3 3f867490 -> 3f739bc0", + "bd56b899 3dba10c2 3f4b575a -> 3de3ad64", + "3f2b10ef 3f7145e6 3f64a64a -> 3f616ee7", + "3f44b93a 3f919519 be65c4da -> 3f75ea93", + "be464a85 bd78941b 3f122be3 -> bd3197da", + "3f50472b 3f7b3107 3f205036 -> 3f6b8183", + "3f86fa93 3f293ba1 3ef4e99b -> 3f3b4630", + "3f97d5f3 3f1dc041 3f1dc041 -> 3f3cc790", + "3f8f6e40 be565bfb 3f95c8b4 -> 3e3131f4", + "3f7d62ae 3d8c83e8 3f6bd9f5 -> 3ea6ef96", + "bbd4a12f 3f91b08d 3f97d72d -> 3f65f4b1", + "3e7511d2 3e2c4eac 3e7511d2 -> 3e410852", + "3f265084 3f265084 3f493f74 -> 3f28d62d", + "3f426453 3f9ce68b 3f426453 -> 3f8be51b", + "3f94825d 3f8aff7a bdbf9fcd -> 3f821f0d", + "3ee502a3 3eeb45c9 3ee502a3 -> 3ee97d37", + "3f285219 3f5d0979 3f285219 -> 3f4e059e", + "3efd1887 be1c1b8f be1c1b8f -> bc746ef3", + "3d2d5ad2 3f48928e 3f417854 -> 3f1fb6da", + "3f8f8c20 3f0e56f7 3f8f8c20 -> 3f379218", + "be21ee12 3f116c82 3f1d5538 -> 3ed5816d", + "3ec31fc5 3f439887 3ec31fc5 -> 3f27ac40", + "3f8d5576 3e33157d 3f49d25c -> 3ed563e2", + "3f9c51d3 3f9c51d3 3d0338ec -> 3f9154a7", + "bdea51e8 3eaccd06 bdc70590 -> 3e571123", + "be419b08 3eeb8b65 3f0f3ef4 -> 3ea88d80", + "bd256a88 bd8a08bd 3f873485 -> 3c9f796c", + "be640549 be640549 3f61cf57 -> be125a22", + "3f63e536 3ecad479 3f63e536 -> 3f0970d3", + "3f884f7a 3f884f7a bd8ac724 -> 3f7bb005", + "3d195919 3f98b7b9 3ed0365f -> 3f63fddc", + "3e9b859e 3e9b859e 3f346ee6 -> 3eaa58b3", + "3f8389c1 3f5f0509 3e66deea -> 3f5b9a97", + "bdfc69ba 3ebfc0e4 3d5cabd5 -> 3e7b6b2a", + "be7db110 3e776bfc 3e776bfc -> 3e0cdda1", + "3f5b9c4a bdbc2250 3f5c2466 -> 3e371684", + "bde6785f 3e841516 3f215333 -> 3e530144", + "3d253232 be28ab8a 3d7c3e3a -> bdd6962e", + "3f7a3acc 3f7a3acc 3f4ef45b -> 3f771b14", + "3d4fa7fb 3eb7008f 3eb7008f -> 3e959bc1", + "be448d57 3ed6405c be448d57 -> 3e7a77bc", + "be421c8d 3f619f72 3d4304af -> 3f17eb64", + "3eabcce5 3f87c94a 3eabcce5 -> 3f5aaffb", + "be31fd4d 3eee6f70 bd5c8279 -> 3e959ba1", + "3f36eeac 3ebd1330 3f36eeac -> 3eef6e32", + "3e03c7c6 3f791cf8 3e03c7c6 -> 3f3b8ab7", + "bd866188 bdf51ff3 3f4530f4 -> bd33fd00", + "3da7b5d6 3f3cdc76 3e638228 -> 3f0fa1ab", + "3f1c3748 3f4724e5 3f4724e5 -> 3f3e041f", + "bd9ecc7d 3f9b58ca bd9ecc7d -> 3f588b6e", + "bdff1ff9 bdff1ff9 be324ad7 -> be033993", + "be3cdb9e be3cdb9e 3f751596 -> bdd0e6bc", + "3f3bd0fb 3f45972e 3e3c3b47 -> 3f38a51d", + "3f4cf0e5 3f84177d 3f4cda3b -> 3f774d9f", + "3f68b301 3f707abd 3f68b301 -> 3f6e437d", + "3e989925 3e989925 3f81ecfa -> 3eb319c4", + "3da80916 be5a8ece 3f9200b5 -> bd587876", + "3f890f71 3f890f71 3ed44117 -> 3f82ff1b", + "3ec1de76 3f2a608c 3f2a608c -> 3f1ac2b1", + "3eacb50a 3f83eb46 3eacb50a -> 3f5548fc", + "3ed8b18f 3ed8b18f 3f2e4123 -> 3ee235bc", + "3e9a1fce 3f7f4d2a 3d5ad278 -> 3f47f51b", + "3f8d4763 3f13ab56 3e2e8b69 -> 3f28d76f", + "3e821fa5 be1820e1 be1820e1 -> bd80e1ff", + "3f328b26 3f69c501 3f69c501 -> 3f5e06ce", + "3ec48451 3ec48451 3f22bea5 -> 3ecdd3f3", + "3d27d8c1 3f49db20 3ea60f89 -> 3f189604", + "3f38a0d0 3f37298b 3f3c17da -> 3f37d484", + "3f37a313 3e929d31 3f36580c -> 3ed1474a", + "3f57d64b bd7bff66 3e365d80 -> 3e17b11b", + "3e25bb6a 3f4f554e 3e25bb6a -> 3f20146b", + "3e1405fc 3ea9e041 3e1405fc -> 3e8e922a", + "3f6f0caf 3f77a6de 3f4dfbca -> 3f72d093", + "bdcef8c9 bdda80b6 3f180f3b -> bd60e97a", + "3e8bf24d 3f5f4578 3f5f4578 -> 3f3eaca6", + "3c905b75 be6c3416 be6c3416 -> be3623fe", + "3f7eb33f 3e9e9ef7 3e86df48 -> 3ee77efc", + "3ecedcb2 3e5ebf2e 3ed36bf2 -> 3e8ae6a1", + "3f31f5ef bd9126b7 3f31f5ef -> 3e16da04", + "3e4e6d16 3f1d89e9 3e4e6d16 -> 3efebb65", + "3e3b1aff 3f8f94cb 3eeb63a2 -> 3f5fd01a", + "3dcef8e9 3f658a13 3eda2d08 -> 3f31893e", + "3f864848 3f8eebb3 3f527b20 -> 3f8a5d1e", + "3f690205 be6e8a9f bd2a3718 -> 3cc42254", + "3eacbdd8 3a8e6a73 3f3c3dae -> 3e009e12", + "3e999d6d 3f212443 3f17b3ac -> 3f0e870f", + "3f42404d 3f9207f2 3e9edaad -> 3f7fe9c9", + "3f7dd4a6 3f7dd4a6 3df61b5d -> 3f6dba20", + "bb4ade68 bb4ade68 3eb62bd8 -> 3cbae52b", + "3e8b1a49 3ed07dff 3c7a8eb3 -> 3eb34047", + "3ea98712 3ea98712 3f959a64 -> 3ec87d7b", + "bd3a9d2d 3f5e5c02 3f0ffa0e -> 3f26f046", + "bd6679a2 3f9e00c0 3f0dc600 -> 3f692b6e", + "3f5c2c13 3e339bb8 bd8d48e1 -> 3e9b4f45", + "be06b03c 3d17dd86 3d17dd86 -> 3aa0697a", + "3ede9430 3d467e7d 3d467e7d -> 3e05bac8", + "3f732a45 3f15c194 3f732a45 -> 3f305cb6", + "be0521b3 3f0f710e 3f0f710e -> 3ed3b9f8", + "3f3fcef9 be171c1a 3f3fcef9 -> 3ddced5f", + "3d079d06 3e91cfea 3f47fff2 -> 3e88c313", + "3e795a4b 3f4b0160 3e5518d6 -> 3f2248e4", + "3f9f85d6 3f84f372 3f9f85d6 -> 3f8c8504", + "3ed61e22 3e63d059 3f79bf09 -> 3ea30d60", + "3e6cd6cd 3f20978a 3e9a8575 -> 3f0504b4", + "3f63b064 3f83e915 3f919c23 -> 3f810ede", + "3f392e3c 3f392e3c 3e07ec13 -> 3f2e43e7", + "bd3cbf06 be1f2c47 3f9e3a58 -> bd01f1b4", + "3eee695f 3eee695f 3e07acc9 -> 3ee218fe", + "3f8842ac 3d9c8403 3decd6f2 -> 3e9427cf", + "3f042329 3f7d4a33 3e885f41 -> 3f562a49", + "3de0e8a7 3de0e8a7 3f2f1fe9 -> 3e1ae833", + "3f1e1f8e 3f1e1f8e be4c7b0c -> 3f0f047f", + "3eb5fcc0 3f8f4047 3f8f4047 -> 3f74ee00", + "3f77fdfb 3ea5ec78 3ea5ec78 -> 3eec1b8e", + "3f9782db 3ef2897d 3f41473a -> 3f251d7c", + "3f6ea794 3e6951c3 3f9c1e5d -> 3ee6022f", + "3e98e8de be7863b6 3f7cc1ec -> bd1e7d46", + "3f87fa56 3f7816d1 be1d7f80 -> 3f68695c", + "3f2e2529 3f0c5834 3f0c5834 -> 3f138831", + "3e834fbd 3e834fbd be5a44d9 -> 3e63e803", + "3f03ed15 3ea8fcab 3d08166d -> 3eb23009", + "3f0018fc 3e20a8b0 3f36d49a -> 3e8a5308", + "be48410f 3f8b4b58 3ec8a0c5 -> 3f43d59f", + "3f5cf429 3f5cf429 3f8ebe74 -> 3f619ce5", + "3f06a034 3f492523 3e6259f7 -> 3f30908f", + "3ea1cfd4 3e35df5a 3ea1cfd4 -> 3e5e3f76", + "3f8f8141 bd98adf4 bd98adf4 -> 3e3802d2", + "bd9a1f7e bd9a1f7e 3ec26d1d -> bd2db432", + "3e81a55e 3ec10c0c 3f896abc -> 3ecd4fa5", + "3ed1fa4d 3e315c84 3f306227 -> 3e8589d3", + "bd885128 bd885128 3ec08700 -> bd0dc26e", + "bca65883 3ea48633 3f942122 -> 3e9e3a37", + "3f076d8b 3f8c0d5b 3f076d8b -> 3f6ee56b", + "3ee6d378 3f3c642e 3f4ab22c -> 3f2de7fa", + "3e1947ba 3e1947ba 3f60a5da -> 3e4f161e", + "3e2f00e5 3e2f00e5 3f202f78 -> 3e50a068", + "3e5d3ce8 bd4493ca 3e5d3ce8 -> 3cdef3ea", + "3f1a711a 3f36bb78 3f1a711a -> 3f2eaca8", + "3cd77ebc 3cd77ebc 3e8ef3fe -> 3d3687cc", + "3ded7274 3f342c79 3ded7274 -> 3f094f0a", + "3f1ab678 3eabd95b 3eabd95b -> 3ec91a75", + "bdb25c9f 3ed1d8bf 3f8bc527 -> 3eb4f4ab", + "be39c977 be352b6f be352b6f -> be3626d3", + "bdb878ec 3ec1b00f bdda18ef -> 3e798dae", + "3f88b9b1 3f8113e6 3f884b56 -> 3f83399b", + "be47f165 3f910d3b 3f910d3b -> 3f59c994", + "be27fe1b be27fe1b 3f305a60 -> bdd1e0e9", + "3e485e0b bdad70b9 3f8f59cf -> 3d7d8285", + "3f27c77c 3f27c77c 3f582cce -> 3f2b45f2", + "3f9ea496 3eb3d678 3df716b8 -> 3f06011c", + "3f7e2b35 bd4c3900 3f7e2b35 -> 3e7d116a", + "3f924d4d 3e2c48f9 3e5cc857 -> 3ec20395", + "3ebcbcaa 3f61fc63 3f61fc63 -> 3f45ffc6", + "3f78a310 3f06a10d 3f78a310 -> 3f271a30", + "3f19b59e 3e9a14b2 3f8e221b -> 3ed89b6a", + "be1cd439 3f6ee809 be1cd439 -> 3f1fb0e6", + "3f7f99e8 3f585c2b 3f7f99e8 -> 3f638990", + "3f845977 3f14aa91 3f788639 -> 3f348c6c", + "3f58c1a5 3d3dfa96 3d3dfa96 -> 3e5dc253", + "3f34f17f 3f9b3ce6 3f34f17f -> 3f88ca62", + "bb6f1d3c 3ebdf4b0 bb6f1d3c -> 3e875185", + "3eb85d00 3f6c9eff 3f6c9eff -> 3f4de868", + "3ee098a1 3e317623 3e905af2 -> 3e73460d", + "3f53c00f bd6597c7 3f4f5145 -> 3e46ec5f", + "3f89c743 3f89c743 3e98d9b3 -> 3f829730", + "3f235f44 3ea82b8b bc19d586 -> 3ebd66d0", + "bd962531 bdb5f874 3f9f2aed -> 3c2e48d8", + "3f409f43 3d412d3d 3f409f43 -> 3e7dff87", + "3f2e0f58 3f3c2ed2 3ec2aa0a -> 3f329f08", + "3f1c848c 3e1a5c89 3f3e5080 -> 3e953d50", + "3f02788f 3f02788f 3f96af37 -> 3f0ecf04", + "3f122232 bc644e76 3f617d3f -> 3e33346a", + "3f74ecc3 3f009a5d 3f74ecc3 -> 3f21bc3b", + "3f053e91 3f96eb85 3f96eb85 -> 3f84fec1", + "3f2a8bc2 3d61b450 3d61b450 -> 3e3d7c96", + "3f726619 3ec3fbc4 3f29ee03 -> 3f05e44e", + "3f867845 3f867845 3f52d2fb -> 3f845f47", + "3f03e573 3f7f8638 3f03e573 -> 3f5c4fb5", + "3e089bf2 3edab156 3e089bf2 -> 3eafdb8c", + "3f99f4cb 3f91a1c5 3db1f060 -> 3f89b102", + "3f902dcc be5f5bf7 3db237d8 -> 3db7ea78", + "3f9cb0cd 3ea9787e 3ececec0 -> 3f06b3c4", + "3e17b7d1 3dddaa73 3f8422fa -> 3e3bd704", + "3f93be1c 3f93be1c bd4f6d80 -> 3f889bde", + "3f648959 3f0fb9c1 3e8d958b -> 3f1c7e9d", + "bd85069f 3edf49b4 bd85069f -> 3e963753", + "be532985 3f5bd8cf 3f8b8f46 -> 3f26271c", + "3e7472d1 3f194891 3f3099eb -> 3f075e26", + "3e23d4c1 3f040994 3edde4a2 -> 3ede4bb2", + "3f7f1644 be2a2cca 3d6505c9 -> 3dc6ca75", + "bd45d8e6 3efbde8e 3f117e3d -> 3ec3e0a5", + "3ec10c8d 3e89ea4f 3ed01810 -> 3e9ab494", + "3f82bcf9 3f82bcf9 3f1f7eac -> 3f7e1d42", + "3db960f8 3e549a8c 3f7d080a -> 3e74d33a", + "3f3c0824 3f6c664a 3f89866c -> 3f64e7bc", + "3e311ac6 3f44bd24 3ea23010 -> 3f1bf884", + "3e2dcc89 3e2da0e1 3e2dcc89 -> 3e2dad5c", + "3ecaa659 3f1376e0 3b8fa11f -> 3efe2d5c", + "3ed4f606 3f864d12 3f7604b3 -> 3f687fa4", + "3f56f57b 3e9cd740 3f56f57b -> 3eea9f3b", + "3f6f7725 3f97995d 3f54dbfe -> 3f8d8ff2", + "3f1948c2 3e564d47 3da42b02 -> 3e90c84c", + "3f024a77 3e9aaa43 3f8435d5 -> 3ecc3337", + "3f8d6d40 3f8d6d40 3e96345a -> 3f85ed86", + "3f48518f 3f28d976 3f48518f -> 3f31d023", + "3e672781 3f809047 3f809047 -> 3f56bd81", + "be267285 3f3b948d 3f417e8d -> 3f0b45b0", + "3dc35a12 3f185b9d 3dbb801a -> 3ee7b133", + "be71f0a9 3c624044 bde390c5 -> bd46305c", + "3f8c2fe4 3f8c2fe4 3f79e9ec -> 3f8b1674", + "be4aad9d 3f7663d7 3e794c77 -> 3f29ef83", + "3e07bbf1 3f814d5f bd971df3 -> 3f3ecc3e", + "3e78b4b0 3f8c68e2 3f512062 -> 3f6526e4", + "3f66d56c be684837 be684837 -> 3c5726d8", + "3ed24797 3da00538 3ec7fae7 -> 3e2f85bb", + "3f911019 3f4a121f 3f911019 -> 3f6326df", + "3f8885c4 3ed28743 3d7de021 -> 3f067cbb", + "3f774591 3f774591 3ec433f2 -> 3f6c80c3", + "3f0d18f7 3f0d18f7 3e2815a6 -> 3f05f1ef", + "3f6d2001 3f2daccd 3f4ff52e -> 3f3da460", + "3ec064c1 3f864fd7 3c980c10 -> 3f54e8de", + "3f3ac611 3f6e76f1 3ddf9756 -> 3f54468f", + "3f5d40ea 3f78ea9f 3f8306bd -> 3f73fb9c", + "3f8418fd 3f8418fd 3f5eee46 -> 3f829bb6", + "3ec4fb6d 3ee0dcc5 3ed8a33c -> 3eda5725", + "bc336b49 3ebcfe34 3ebcfe34 -> 3e939d17", + "3f9cbbb4 be6ee188 3f9cbbb4 -> 3e3a4cf3", + "3f5edcd7 3f5edcd7 3e89d435 -> 3f53bfba", + "be2699a7 3f68e207 3f37688d -> 3f2aef5c", + "3ca377e3 3ca377e3 3f751fa7 -> 3db37c6a", + "bd4721af 3f9fa260 3f9fa260 -> 3f78bbc2", + "3f790197 3f9d4717 bca7e30b -> 3f8ac3d7", + "3f4a008d bd69f0e1 3f4a008d -> 3e3c51dc", + "bdfcefa1 bde0e7b5 3f63fc18 -> bd25eac4", + "3f027313 be3b8809 3dbae425 -> bc8353c4", + "3f5873b1 3e94b57c 3e94b57c -> 3ed123d7", + "3f1786a3 be007cf0 bdaa6634 -> 3cf6b810", + "be07cafb 3f364441 be07cafb -> 3ef15d25", + "be1bff57 3e0ec122 3f977612 -> 3e1c65ca", + "3ec7856c 3dee95c0 3dee95c0 -> 3e32c742", + "3f44eda7 3c9bbad0 3c9bbad0 -> 3e36d35a", + "3f995343 3e399658 3d43c602 -> 3ec68aa5", + "bc22216f be0051f0 bc22216f -> bdbd5049", + "3f3a9563 3f3a9563 3f971765 -> 3f42eddd", + "bd6d1e7f bd6d1e7f 3ec1304b -> bcd8da61", + "3f507c84 3f59f643 3f507c84 -> 3f574363", + "3eafed84 3eafed84 be29de72 -> 3e9d187a", + "3f2124e1 3f2124e1 3f4e77d8 -> 3f246a91", + "3f6ae6a8 3f806274 3f806274 -> 3f7c1e90", + "3f92ee88 3f4e4cbc 3f4e4cbc -> 3f60eb60", + "bdf77129 3f46dfd8 3f46dfd8 -> 3f160256", + "bdc1ddfd 3d5c1f6c 3eda9d13 -> 3d493c6c", + "3f2336bb 3f2336bb bd1aa001 -> 3f16bbc1", + "3f1b01a9 bd916f97 bd916f97 -> 3d952c3e", + "be1b7856 be1b7856 3f8b5800 -> bd7f1402", + "bce56569 bce56569 3ee0a442 -> 3bba93c0", + "3f9de5ba 3e3bb5e6 be07278b -> 3ec48b5f", + "3f080838 3f080838 3f21dc41 -> 3f09e598", + "3d2f2a9c 3eace24b 3eace24b -> 3e8cc734", + "3f952dc0 3ee5f321 3e2c55a8 -> 3f14c77c", + "3e956dba 3ec9a607 3e956dba -> 3ebac65c", + "bc96b8c7 3f789c2b 3f238aae -> 3f3c9a6b", + "bce9a6f0 3ef639ed 3f73baea -> 3ed02de6", + "3f7893fb 3f68eead 3f98e4a9 -> 3f7184dc", + "3f87e300 3f87e300 3f8de066 -> 3f8851bc", + "3f0bcc9a 3f397bc8 3f07e090 -> 3f2c302e", + "3ef2054c 3f83cac8 3f83cac8 -> 3f694488", + "be5d2e4d 3f750b0c bde65d83 -> 3f216919", + "3f8b7256 3f8b7256 3e6c7b97 -> 3f838387", + "3ec63b97 3ed4b8e5 3ed4b8e5 -> 3ed1a434", + "3f64ca7c be377998 be377998 -> 3d488dbc", + "3f28067f 3ef09c8a 3ef09c8a -> 3f0273f2", + "3f35cb81 bd8a1f76 3d328c64 -> 3dd8eadc", + "3f3ea133 3e87022f be3044a8 -> 3eab430e", + "3f8f9c51 3f8f9c51 3b83cdf2 -> 3f8547c0", + "3f420c71 be68a158 be23aebb -> bc5232cb", + "3f230856 bc833cae 3f887635 -> 3e4dbfaa", + "3f908cef 3ee095e7 3f152e18 -> 3f188d5e", + "3f577b8e 3f5fccb5 3f62cd43 -> 3f5e3f82", + "bdd680ec 3f1f1e6b be59da22 -> 3ed053bd", + "bd6dcbef 3f8b2512 bd6dcbef -> 3f42ca77", + "be79ec24 3f9689c5 be79ec24 -> 3f458627", + "3f9c93ea 3f0ad062 3ea88d0d -> 3f2bf2dc", + "3f1bfccc 3efbe298 3f9f5053 -> 3f123deb", + "3f15a737 3e163c88 bd98869a -> 3e653a31", + "3f451063 3f451063 3ed5baf5 -> 3f3e8d71", + "3f3e0a8b 3f937614 3f937614 -> 3f884f7a", + "3f1e5f55 3f1d24f3 3f1d24f3 -> 3f1d67d7", + "3f9e9cf2 3f9e9cf2 3f92a559 -> 3f9dbfd0", + "3e5594a5 3e13469e 3ec98e02 -> 3e33d825", + "3f9130d2 3dc1914a 3f78bbc8 -> 3ec203c8", + "be01f257 3f613893 be01f257 -> 3f17d160", + "3f90adfc 3f15c817 3e1f7590 -> 3f2b86b6", + "3f842a7e 3f842a7e 3bbab382 -> 3f755acc", + "3ec1d14e 3ea01711 3ef0ee97 -> 3ead1926", + "3db4c89b 3db4c89b 3f02a0d9 -> 3df32d05", + "3ec83563 be526780 be526780 -> bda10a3d", + "3f62be89 3f6b56a0 3f9761da -> 3f6e60fc", + "3c090729 3ded8457 3ded8457 -> 3dbea76b", + "bdcc7a98 3f2e113c bdcc7a98 -> 3eea6a24", + "bd24958f bd24958f bc28b7f8 -> bd1bbf66", + "3f997cee 3db63a9f 3f997cee -> 3ecf7448", + "3edb0deb 3e8b0d60 bce4c066 -> 3e90fe46", + "3f5b3f6e 3f5b3f6e 3f429576 -> 3f5977aa", + "3f92a4b9 3f5cae5a 3ec45e10 -> 3f6346d5", + "3ee3cf7c 3ee3cf7c 3f390b66 -> 3eee150a", + "3f5eab5c 3f5eab5c 3f8952b5 -> 3f626c04", + "3f200bf2 3e57f9a8 3f97056e -> 3ebce780", + "bd8cf8c9 bd8cf8c9 3f2b98f9 -> bc7d8530", + "3ebf07f9 3dee113f b9da1c0d -> 3e265701", + "3f4397e9 3f8a119f 3f8c06c2 -> 3f81a599", + "3f08bf6a 3d957d71 3f6de84f -> 3e6e77bc", + "3f81c618 3ea977f6 bd0dfd78 -> 3ee64c1d", + "3ba0ec72 3e2d427e 3ba0ec72 -> 3dfaaf4e", + "3de3057e 3f1a66ef 3de3057e -> 3eed0350", + "3f45adde 3f57b731 3f982ac2 -> 3f5a4735", + "3f26fc10 3f26fc10 be75b412 -> 3f167ec6", + "be2b6165 3f901617 3f9f12da -> 3f5bf313", + "3f5f5cb3 3f8ffbae 3f9884a8 -> 3f89bb12", + "3f3240a7 3f3240a7 3f7c3f15 -> 3f379834", + "bd766b74 3d7ca9e4 3e91ac27 -> 3d546e44", + "3f98b606 3cc9fa77 3f98b606 -> 3eb70412", + "3f3adb09 3f219964 3ea45151 -> 3f213c1e", + "b7c55606 3f99257e 3f3a5b9e -> 3f6880ef", + "3f8b8711 3f5b8bf3 3f8b8711 -> 3f6c7f2f", + "3f43d453 3f43d453 be748c3e -> 3f314749", + "3ef77d2c 3efe8bae 3f813dd1 -> 3f07febe", + "3f8cc7b3 3dd7751f 3f8cc7b3 -> 3ec6eaae", + "3f1365bb 3f1365bb bd501c40 -> 3f07d147", + "3f0e940d 3eccb621 3eccb621 -> 3eddd144", + "3e03da31 3e03da31 be1fd8be -> 3ddd9678", + "3e60f284 3f6bbe3a 3f8b7d96 -> 3f48b1d9", + "3ebc899d 3dc36163 3f11b891 -> 3e40203c", + "3f61f21a 3f1c3b83 3f022abc -> 3f292cb5", + "bd408abb bd408abb bddb5a52 -> bd525036", + "3e25fe0e 3f811449 3e6c1b61 -> 3f45b65f", + "3f7a747c 3f7a747c 3f0462c3 -> 3f71ee78", + "3ec0a072 3ec0a072 3deac16d -> 3eb6f524", + "3f90538a 3eae689e be291a06 -> 3ef162aa", + "3f26f9b2 3f26f9b2 be0d8b03 -> 3f185dd5", + "3d69ca39 3f186c05 3d69ca39 -> 3ee256bc", + "3dca29a6 bde8e78a 3f390db7 -> bc059e14", + "3f81e8e8 be317c4d 3f1cf1e8 -> 3e0b6152", + "bd79784d 3f977d4b be640998 -> 3f514001", + "be7c8023 be7c8023 3f86b2f7 -> be1c7a4a", + "3f85542c 3f159061 3df5cbc6 -> 3f25e22a", + "3f43a0b2 3f993269 3d7712af -> 3f82eb0c", + "3eb7edd1 3f43b97a 3ea07091 -> 3f25529a", + "3e0d071b 3f2b5aeb 3ebf2eda -> 3f08f229", + "3f5ce2f3 3f5ce2f3 3f0ce3dd -> 3f571c90", + "3c9ecf7f 3f921589 3c9ecf7f -> 3f525d00", + "3f304ff2 3e3a8725 3e3a8725 -> 3e946a0d", + "3f9cd536 3f9cd536 3e5d20c5 -> 3f93819d", + "3e6bc71e 3f813bad 3f813bad -> 3f580a54", + "3e68d07c be6e093a bd265d65 -> bdf77762", + "3da19c82 3f89e8c3 3f49f6ab -> 3f5821fc", + "be260bcd 3f900079 3f900079 -> 3f59efa8", + "3ee0ed7a 3ef2a81a 3f4b0f65 -> 3efab01a", + "3f355a64 3f355a64 3f83b644 -> 3f3b4738", + "3c349d0c 3e59593b 3e59593b -> 3e2d8846", + "be01d871 bbd0b965 3f20061f -> 3c5ef6cc", + "3f4ba815 3f20cc94 3f20cc94 -> 3f29e997", + "3e7fdc2a bcf81b66 3f3b64ec -> 3dacae1a", + "3f830f13 3f830f13 bdb57bd3 -> 3f718eab", + "3f137a0d 3e85adce 3f06ded5 -> 3eb1cb86", + "3ec2b028 3f3d88d0 3f3d88d0 -> 3f29ee6c", + "3f9fd83e 3f8c5353 3f0cbebc -> 3f8b6d13", + "3f95a24f 3f95a24f 3f12c93c -> 3f902150", + "be46a66f be3ca13f 3eef633a -> be0e9436", + "3ef221ae 3f1db92d 3f617ccf -> 3f1ad21d", + "3f89123f 3f8a194d 3f2d5b28 -> 3f862b13", + "be09ba2f 3f7380b8 3f047ac6 -> 3f306362", + "3ed301b2 3f677a07 3f7de738 -> 3f4e4f1f", + "3ec2c506 bdeebb1d 3f6046af -> 3d78eab6", + "3e5be7cd 3f330ea9 3e5be7cd -> 3f0fb71a", + "3eb986f5 3f0c5edf 3f0c5edf -> 3f023f64", + "be4098de 3f8819d9 3d00d537 -> 3f390368", + "3ebb00a0 be4d5f69 3f812469 -> 3be794c0", + "3f96d36a 3f83af83 3eb20237 -> 3f817630", + "3f58f0a8 3eaff2cf 3f657b3d -> 3efb3a02", + "3f6bc675 3f74fe43 3f2c6d5b -> 3f6dcb6a", + "3ee3a6fd 3eb35a5d bde36671 -> 3eac9243", + "bd051e14 3ee8b79e 3d317745 -> 3ea47ed3", + "3f6a85a5 3f03f6de 3f98132e -> 3f2633e9", + "be2b6540 be2b6540 3d3155b7 -> be1bd253", + "3edadd95 3f81e30a 3e931d86 -> 3f565cb8", + "3f291723 3cb00cd5 3cb00cd5 -> 3e2125d6", + "3ddc5bfe 3f25d968 3ee453da -> 3f04b58d", + "3f10259b 3f989d58 3f989d58 -> 3f877d13", + "3f90fe02 3f8043f8 3efcb578 -> 3f7e3f39", + "3ec35883 3e8557f3 3f65ea84 -> 3eaa190f", + "3f7ccc8a 3f7ccc8a be1cdc1f -> 3f67b7ca", + "3f2f1889 3e807619 3e807619 -> 3eaf9c27", + "3ed851f7 3ed851f7 be1709b0 -> 3ec34070", + "bc62d088 bdbe5bcf bc62d088 -> bd9036d0", + "3e7c52b1 3e7c52b1 3f01e624 -> 3e87cf28", + "3e89f879 3e89f879 3f2a9c02 -> 3e98a4ce", + "3f4becd6 3eaec677 bd374ff3 -> 3ed21087", + "3e7a3baa 3edce904 3e7a3baa -> 3ec1a016", + "3ed0191d 3ed0191d be124b06 -> 3ebbcb62", + "3f92eae2 3f3368b6 3f92eae2 -> 3f540059", + "3f6b1534 3de5fc4e 3f6b1534 -> 3eaf09ad", + "3f1f1055 3f47ad94 3db0613a -> 3f3237eb", + "3e51ca67 3e51ca67 bdc43337 -> 3e3b9039", + "3f2a6eee be5eb499 be5eb499 -> bcf317d3", + "3b248a58 3f92d1fd be284c6d -> 3f4f1a12", + "3ebda3c3 3ebda3c3 3e7eaf94 -> 3eb9247b", + "3f20faab 3ea50795 3f20faab -> 3ed1ba63", + "3ec809db 3eba4f79 3f91acb8 -> 3ed9d89a", + "3efaa150 3efaa150 3f98cce6 -> 3f0a549c", + "3f0e2f3d 3ef7ac01 3f5f0e11 -> 3f06e68c", + "3f1a7c2b 3db9da0b 3f1a7c2b -> 3e72777b", + "3f803146 3f42bfa3 3f8bd0c5 -> 3f55fba3", + "3f25c127 3f001de6 3f001de6 -> 3f081ec3", + "3f977f75 3f6cd9d9 3f977f75 -> 3f7fb0fc", + "3f3381e6 3f5e3610 3f1fe953 -> 3f50a221", + "3f8c875b 3f9eef79 3f3abd55 -> 3f9649ca", + "3f8c72aa 3f647c22 3f845b38 -> 3f723ec0", + "3f8a23be bd3c5e38 3f60e41f -> 3e85208e", + "3ddd3f47 3e2c55ef 3e2c55ef -> 3e1f36a5", + "bdd4c9e6 bdd4c9e6 3f918c79 -> bc6a72e0", + "be304d9d bdd76163 3f3b9116 -> bd715e09", + "3f253565 3f253565 3e973437 -> 3f1ebd63", + "3eab70db bcc960c3 be4e15c3 -> 3d201e82", + "bdf7e6ce bdf7e6ce 3f7e57b6 -> bd263922", + "3f09507b bcae0b1e 3e109763 -> 3ddf58b4", + "3f879fbe bc94c149 3e32076a -> 3e664417", + "3f723997 3f8c41c6 3f723997 -> 3f86cddb", + "3f8d7841 3f3b243a 3f763e33 -> 3f53c75e", + "3f865159 3f9e7516 3f6fdc53 -> 3f968b0a", + "3ef9b94d 3f50a83a 3f50a83a -> 3f3ed6d6", + "3f00bea9 3f15f6ba 3e4b0a43 -> 3f0a4a47", + "3f949d13 3f041a10 3f3e518d -> 3f2b6ab8", + "be21d760 3e7df071 3f7b8b72 -> 3e5bd5a3", + "3f6056a2 3f981448 3f6056a2 -> 3f8cb634", + "3f50c323 3f50c323 be6d039d -> 3f3d69e6", + "bda64b38 bda64b38 be4cbe3d -> bdb7d9c8", + "3f057ae4 3f107593 3e10be06 -> 3f064ee8", + "3f6f56f3 3f6f56f3 3f79b1e4 -> 3f701662", + "3f0f94f2 bd7bc15d bd7bc15d -> 3d912339", + "3f082e27 3f204478 3f204478 -> 3f1b254f", + "3f5ffb0d 3f22855f 3e590028 -> 3f27c604", + "3ec2c8ec be54d603 bcd5c5f1 -> bd8e9c35", + "3f9c312a be5fcb3c be728eb4 -> 3db04721", + "3f638776 3f5982e9 3d68364d -> 3f4cfc9c", + "bdec5dc6 bdec5dc6 3f1f847c -> bd7e595d", + "be1ef158 3efaeca4 3f8a8ad7 -> 3eca8fc8", + "3de276b5 3ebadd72 3f292b03 -> 3eaa1ab0", + "3ee01fb9 3e73c6d3 3ee01fb9 -> 3e970226", + "3f96a337 3f96a337 3f1d8b85 -> 3f917316", + "3f1b2003 3eb34d96 be323fad -> 3ebbc4ea", + "3f2374d2 3ebb572a 3eb14fa5 -> 3ed84b8c", + "3e2ce75d 3f8855d7 3f8855d7 -> 3f5fe1ca", + "3f03af91 3f702a49 3f702a49 -> 3f591935", + "3eaad032 3eaad032 3f91acd9 -> 3ec88c78", + "be622dec 3f19fbcb 3f11d83e -> 3ed94258", + "3f885e34 3e661c05 be213c81 -> 3ec073c3", + "be5825b9 3ea3e091 3ea3e091 -> 3e541996", + "3f286841 3f9156fe 3f94a9ee -> 3f84947a", + "3f1cb92f 3f1d77d2 3f1d77d2 -> 3f1d4f53", + "3f206846 3f77ac4b 3f9c99d3 -> 3f69d90e", + "3f9db06d 3f8c22c4 3f8c22c4 -> 3f8fde54", + "3f32370d 3f28bd7c bd258517 -> 3f1dd390", + "3f656924 3e95b937 3f656924 -> 3eedc3bb", + "3f850c8b 3f850c8b 3ed97adf -> 3f7ebcf7", + "3f9f8dfb bdae90b0 bdae90b0 -> 3e4ab289", + "3d5dac31 3f89c4a4 3f89c4a4 -> 3f5be48c", + "3f464eba 3f3200cc 3f464eba -> 3f37c960", + "3f082052 3f7d257b 3e495ea4 -> 3f559f63", + "3f62b469 3f37e26c 3ece4e4d -> 3f3b2963", + "3f716d3c 3f5e1fda bd6b5963 -> 3f5121a1", + "3dc2052f 3f06b523 3f06b523 -> 3ede70f7", + "3e42f1fc be4dc191 3e83883a -> bdad6987", + "3f7c658d 3f726b35 3e8c5b33 -> 3f681b2e", + "bd37d5cc 3ed849e1 3efea2e3 -> 3ea82df3", + "3ce0bc1a 3eb6dda1 3f98d02d -> 3eb1e508", + "3edf1f07 be56e62a 3f005156 -> bcadf82e", + "3e92534b 3f71986d 3e92534b -> 3f419ee3", + "bdc054aa 3e61b0ea 3e61b0ea -> 3e1d4085", + "3f7fa173 3ed676d0 3f30688f -> 3f0fc813", + "3f7c0697 3f88682e 3f49f098 -> 3f83a37b", + "3f7f1b51 3e781f3b 3f7f1b51 -> 3eea0cb4", + "3f5fc67c 3f5fc67c 3ed25293 -> 3f573664", + "3ea8681d bdd73add 3f8813ab -> 3d927e64", + "3e9cf557 bd9b6004 bd9b6004 -> 3bb2a60d", + "be7755b4 be2e905a 3f6fe23c -> bdd8541d", + "3de424fa 3dc8e819 3dc8e819 -> 3dceb2da", + "bdb263aa bdb263aa 3e20773b -> bd8e5797", + "3f3f897e 3e2c704a 3e2c704a -> 3e9557a4", + "3edda547 3ec3001f 3e829f63 -> 3ec404d3", + "bd999b2a 3e82e616 be56e395 -> 3e1b6280", + "bdabf90b 3f3b1926 3f426f2e -> 3f0f45ca", + "3e435161 3ebcc8e8 3d5a662f -> 3e9dc002", + "3f966e43 3f642bd9 3ccbb7b7 -> 3f639d95", + "3f71f472 3f95b5dd 3f71f472 -> 3f8d86c7", + "3e89b9ed 3f9de8e1 bdcba74e -> 3f6eab62", + "be0fcf34 3f216540 3e149431 -> 3edcec70", + "3e00dc23 3ece84ab 3ece84ab -> 3eb04e0f", + "be3df65c 3c92ec61 3c92ec61 -> bccf772d", + "3f5c2c48 3f5c2c48 3eada32e -> 3f528bc5", + "3d0b140a 3f972e21 3d0b140a -> 3f5ab6f6", + "3c06167b 3c06167b ba112f1c -> 3bf78162", + "3ee0328d 3e6a7064 3ee0328d -> 3e93b0bb", + "3e1bb6db be1dfa4f bd62ae2f -> bda7ec0e", + "3f73ea91 bdb36867 3f73ea91 -> 3e55bf3c", + "3f2f10fa 3f3afbd8 3f40cf1a -> 3f38ded0", + "3bd6e80b 3d9b6d08 be7dfbd8 -> 3d1aae40", + "3f21e4f9 3f61810a 3ef717c2 -> 3f4c9e27", + "3ceeff16 3f35b140 3d58e6c4 -> 3f0481f0", + "3edabce2 3ee01864 3ee01864 -> 3edef4cf", + "be7e9de0 3f40385a 3f2583ab -> 3f07e22a", + "3f0c6491 3f15bb73 3f53e037 -> 3f183b97", + "3f7a5911 3eb7b26a 3f7a5911 -> 3f08fe87", + "3f9225c5 3e4a0edf 3e4a0edf -> 3ecbda67", + "3ee15bdf 3f094d9f 3c6cdfd6 -> 3ef4d833", + "3f5b8a21 3f5b8a21 3c9a0536 -> 3f4c09c0", + "3f851ea5 3f8a09c4 3f851ea5 -> 3f88a329", + "3ea9bd9c 3f1f160c 3f8752df -> 3f175be8", + "bc89ac97 3f10ecbb 3f10ecbb -> 3ee26301", + "3e9b6494 3e9b6494 3efe0006 -> 3ea28303", + "3ea328f2 3f008e6d be1e3281 -> 3ed4dce8", + "3f0591b0 3f9c6457 be1bb7c6 -> 3f7948f4", + "bd50492a bd50492a 3f90b8fe -> 3d0d1593", + "3f53e576 bdc8fd02 3e0940ec -> 3dec894f", + "be5081fe 3de3c571 3f1e1455 -> 3da584c7", + "3f418b47 3ec55792 3da1028a -> 3ee25955", + "bda2ec6f bda2ec6f 3f52ba46 -> bc6ba98c", + "bd56ea2f 3f997000 3f9c3d16 -> 3f6f2b80", + "3d890c28 3e109f87 3e109f87 -> 3e00710c", + "3e038a01 3e038a01 3f8f6c79 -> 3e4ce052", + "bdc3ec96 3e7cc9e9 3e7cc9e9 -> 3e3234a4", + "3e8cf34d 3eea1791 3e68f82e -> 3ecdcbdb", + "3f01fa5f 3eeb1500 3eeb1500 -> 3ef05f17", + "be3532a1 3f87a469 3f4b77d8 -> 3f47121d", + "3f4798da 3d6e5640 3ee217a4 -> 3e75069d", + "be226ecc 3f9fff21 bdf42828 -> 3f5a02d6", + "3e926bac 3f720c30 3deab10d -> 3f3eca4c", + "3eef9354 3f3c90ab 3f3c90ab -> 3f2df0c7", + "3edf751a be7bc55e 3edf751a -> bd530d8f", + "be60eebf 3f1820ce 3f1820ce -> 3ed7a524", + "3f7419ae 3f91ff39 3dde48b8 -> 3f835e3d", + "3f2cb1b0 bd8a0d7c 3ebfdc63 -> 3dfa71e9", + "3e7d5fcb bdf618f9 3f1a8c3e -> 3c281684", + "bde340e3 3f02a945 3f31c282 -> 3ec87994", + "3e5d2eea 3f87ecf3 3e5d2eea -> 3f522b69", + "3f040caa 3c09e98a 3f040caa -> 3e1c9cab", + "be5b3304 be5b3304 3e10ad9b -> be40ee20", + "be2b09ad be2b09ad 3e78067c -> be0cc8df", + "3f5915dd 3f68a14d 3f68a14d -> 3f65532d", + "3ef7d90b 3ee84f48 3f5b2fd9 -> 3efa7d82", + "bda833e3 3f5cb356 3f17f794 -> 3f24569c", + "3f3130a0 be19e03f bdf0859c -> 3cffd888", + "bde6ac23 3ec045e7 3f34314d -> 3e974330", + "3e4e4343 3e4e4343 3dd68889 -> 3e471dbc", + "3f83e9f4 bd2bed0e 3f9327fb -> 3e8b533a", + "be0eacc1 3f8bc05b be0eacc1 -> 3f3dbb6f", + "3f850b12 be020453 3f83ab9a -> 3e5161f4", + "3f933a1f 3e06c73b 3f933a1f -> 3ed7ef35", + "3f12273b 3f9c7f70 3f12273b -> 3f84bca9", + "3ecfb1ca 3f0cdf13 3ecfb1ca -> 3f02536c", + "3f5fb051 3f3f744f 3f3f744f -> 3f464f0e", + "3f21877d 3f21877d 3eb2171d -> 3f1c4bec", + "3f8ffd04 3f9371d8 3f8ffd04 -> 3f9275da", + "3f465569 3dfcfd7d 3eb1a83d -> 3e8e67bd", + "3f09ba39 3f71964d 3f397d8e -> 3f5773f5", + "3f9fce07 3f1f026c be17d829 -> 3f32f08c", + "3f7d1ec5 bd29d4c2 3f7d1ec5 -> 3e8102da", + "3f1af969 3f708ce7 3ebbc8e9 -> 3f53c423", + "3f220a0f 3f220a0f be299e30 -> 3f1347b4", + "3f4db184 be4da24b 3f4db184 -> 3dae9400", + "3f662350 3f662350 3f5c2a2b -> 3f656b0e", + "3f568af7 3f8ef910 3e3c5990 -> 3f7d84e8", + "3f11625b 3f556e39 3f556e39 -> 3f46f622", + "3f0db154 3f4e175e 3f566e5a -> 3f40fff9", + "be317467 3f448c53 3f8e2242 -> 3f17a75e", + "3f5aa18f 3ea4bb14 3f98a787 -> 3efedf1e", + "3f25bf7c 3f87fcc3 3f9b03de -> 3f7c2264", + "3f8f94bd 3f1235f3 3f1235f3 -> 3f302ec1", + "3e9fc53a 3e9fc53a 3edfdf1c -> 3ea465f1", + "3ea6d2f0 3e0b9893 be79ada9 -> 3e18c1a2", + "3f91084f 3f9d456b 3f860302 -> 3f98fd5f", + "3e8f57aa 3f9a6370 3e8f57aa -> 3f713def", + "3f1f45df 3ef2bf8c 3f1f45df -> 3f042b45", + "be0b2b84 3f5a481c 3f5a481c -> 3f2477eb", + "3e3c0d0a 3ef94227 3f81bb57 -> 3eebb7da", + "3e412e1f 3e412e1f 3f29ef03 -> 3e644e59", + "3f513675 3f9fe0dc 3f9fe0dc -> 3f942022", + "3ead7db9 3f3ad4f4 bd93e017 -> 3f16ba38", + "be66d8de 3eb8429a be66d8de -> 3e45cd3f", + "3f932a12 3f839828 3f839828 -> 3f86e7c0", + "be30caf8 3e4a9db4 be30caf8 -> 3dbd18d4", + "3f04387f 3ec6b409 3ec6b409 -> 3ed4ae95", + "3f9cb42b 3f9cb42b 3e9f3612 -> 3f9443b8", + "3f7196fd 3f067069 bb601f89 -> 3f137476", + "3f421fd2 3f41c1cb 3f41c1cb -> 3f41d5d6", + "3f523e75 3ead64ee 3f523e75 -> 3ef3c64a", + "be2499de 3f800559 3f9d41e0 -> 3f451196", + "be7e769d 3c9c1b60 3f607bed -> 3cc55e30", + "be4115a7 3f81be0c 3f0bcdcb -> 3f39676a", + "3c17d73d 3f7fb0ca 3f7fb0ca -> 3f49d354", + "3f87cc9c 3f87cc9c 3f21628c -> 3f83d232", + "3f48433a bca0aea3 3f48433a -> 3e55cce1", + "3e2a9f05 3e775b1e 3f80c611 -> 3e8fc6f2", + "3f6e6a81 3f6e6a81 3ecf7cce -> 3f64b1a3", + "00000000 00000000 3f800000 -> 3d93d9ca", + "00000000 3f800000 00000000 -> 3f371553", + "3f800000 00000000 00000000 -> 3e59be10" + ] + } + ] +} diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/device-bounds-lavapipe.txt b/packages/cultmath/tests/CultMath.Tests/fixtures/device-bounds-lavapipe.txt new file mode 100644 index 00000000..42706157 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/device-bounds-lavapipe.txt @@ -0,0 +1,253 @@ +# renderer llvmpipe (LLVM 20.1.2, 256 bits) +# identity glslang-tools 15.1.0-2~ubuntu0.24.04.2; mesa-vulkan-drivers 25.2.8-0ubuntu0.24.04.4; dxc libdxcompiler.so: 1.9(1-0d3ee6b5)(1.9.0.1); apt snapshot 20261016T000000Z +# route index glsl tolerance exact cases worst u1 NaN-class mismatches result sha256; written only by CULTMATH_WRITE_DEVICE_BOUNDS=1 +lavapipe-glsl 0 float cultmath_snoise(vec3) ulp-bounded 86 88.5 0 546a5fd0ec6ff9e958b281791d2ea75409e8085d07eca0578ca31c373251cbd3 +lavapipe-glsl 1 float cultmath_snoise(vec2) ulp-bounded 141 111.71875 0 2ceef683245300198343565b581de6978efdc92970ee8ae1b8f4b2fcfb732cbb +lavapipe-glsl 2 vec4 cultmath_snoise_grad(vec3) ulp-bounded 68 617.5 0 cb8b652fde6b9b11fa9f5a6e120a3fed7ead5b69db2ccf981240c9b098343984 +lavapipe-glsl 3 vec4 cultmath_fbm_grad(vec3, int, float, float) ulp-bounded 11 2812 0 7cfbaadc05c186be8122ee5cbd8f4932b256d2cb0239acbd7ba6290f8976ca06 +lavapipe-glsl 4 vec4 cultmath_ridged_grad(vec3, int, float, float) ulp-bounded 9 3510 0 937908e0e35a863a1dc80c624c0f384461db28500aa5de2010a292d61a13368b +lavapipe-glsl 5 CultCellular cultmath_cellular(vec3) ulp-bounded 199 1 0 ec144b78ccb06b565bdcb514f941f1823bb2cb8ec519b45f8a034ef50ef1b871 +lavapipe-glsl 6 ivec3 cultmath_pcg3d(ivec3) exact 256 0 0 a410be8431cbc976fd6b7af9c83a71858d0f9ccb9e7f2c8fda94d5ca2db62176 +lavapipe-glsl 7 ivec4 cultmath_pcg4d(ivec4) exact 256 0 0 d22bad50369da1bb343cfa0457565fa795a9374dd354c7cedeaa84b1f4fcb5e1 +lavapipe-glsl 8 vec2 cultmath_iv_point(float) ulp-bounded 256 0 0 4345669b712d86cc70869adee43d1b371bb5acbf767fd0ad4c96e6bdd2167eae +lavapipe-glsl 9 vec2 cultmath_iv_add(vec2, vec2) ulp-bounded 256 0 0 71fb79c72089090255803a20bdda0ab592b71edf7e4ff2e35a1e4407bb203f91 +lavapipe-glsl 10 vec2 cultmath_iv_sub(vec2, vec2) ulp-bounded 256 0 0 a94e8e5a7315fe885499a0984755d2fc8dfaaa0a2cd776ae70d06fa061e5526e +lavapipe-glsl 11 vec2 cultmath_iv_neg(vec2) ulp-bounded 256 0 0 c659fe8af49f9d27717efae94578fcd76a0d8db173755b008c10314e71509018 +lavapipe-glsl 12 vec2 cultmath_iv_mul(vec2, vec2) ulp-bounded 256 0 0 1bef7438c091e05e39918e961e2154161ffb86192f35917ea344250560803ce0 +lavapipe-glsl 13 vec2 cultmath_iv_scale(vec2, float) ulp-bounded 256 0 0 f7cabee9534c5867efaa66ded529feab679065fed8e277d48804f8a127cfb1da +lavapipe-glsl 14 vec2 cultmath_iv_abs(vec2) ulp-bounded 256 0 0 06b1b8506452333155949472f815ce84542614e434633f4824ff708377b6b622 +lavapipe-glsl 15 vec2 cultmath_iv_min(vec2, vec2) ulp-bounded 256 0 0 a324b35cb4a7c5fa0c95050814175df5d8279efe4359f3898e14208cc87ecaaa +lavapipe-glsl 16 vec2 cultmath_iv_max(vec2, vec2) ulp-bounded 256 0 0 d68412262ca234c1da130fc5217ba6856da3e92e435c28c1fbdbf3692a89e1fa +lavapipe-glsl 17 vec2 cultmath_iv_sqr(vec2) ulp-bounded 256 0 0 dbbb0e0df015456393452377d689732428a9a8e24d8e2b407ee9620593b4c46b +lavapipe-glsl 18 vec2 cultmath_iv_sqrt(vec2) ulp-bounded 256 0 0 95bd15d1b283713fc632ced350f5da1b89f8f73e6618329773db1b52acd29991 +lavapipe-glsl 19 vec2 cultmath_iv_clamp(vec2, float, float) ulp-bounded 256 0 0 abe9daf24930a5e3a49ec994c4cae3a0c27b9d019d6d93ec1963ec3daad664a0 +lavapipe-glsl 20 vec2 cultmath_iv_saturate(vec2) ulp-bounded 256 0 0 0f844ef8c4d9a9f748c80677bbbfc36b5f6e682eb87c2d46e7e20635d5f55c26 +lavapipe-glsl 21 vec2 cultmath_iv_smoothstep(float, float, vec2) ulp-bounded 256 0 0 3d5944a4c43feb91d6786924e0f5439c05285d28ff1f500b5582893758dd4ce5 +lavapipe-glsl 22 vec2 cultmath_iv_lerp(vec2, vec2, float) ulp-bounded 256 0 0 96b09e90a3fbbfe81379a29a23b676e490bc7dc6bb731450197707e6cf4c573f +lavapipe-glsl 23 vec2 cultmath_iv_snoise_ball(vec3, float) ulp-bounded 242 54 0 570eb031260c8f4aab42edc57a5fa1d0da70e8a4e6f0b4bf68208c15506f7cb5 +lavapipe-glsl 24 vec2 cultmath_iv_fbm_ball(vec3, float, int, float, float) ulp-bounded 250 56 0 9e7017426314537f84c58dcdd1f85188cbe8f4dd9ababed887f60776cf861ebf +lavapipe-glsl 25 vec4 cultmath_iv_frustum_ball(vec2, float, float, float, float) ulp-bounded 198 1.6457063576593662 0 327c306aa4d06aecbb2681d8808c6dbf0567e87b54a6067c68001e36b3e52169 +lavapipe-glsl 26 vec2 cultmath_iv_exp(vec2) ulp-bounded, platform exp 7 7.526057804152758 0 b4af8232dc3dd782cc6d790e928ede0f6ba6dfdffd6c71dd9494fb58973e485c +lavapipe-glsl 27 CultPhasor cultmath_phacelle(vec3, vec3, float, float) ulp-bounded, platform exp, sin, cos; across platforms |diff| <= 2^-20 max(|v|, 1); on a device |diff| <= 2^-18 max(|v|, 1) 0 18.5 0 705b4c18027a0838218645e9368c3749ae4b5bf75e0485985725e8e72b73ab88 +lavapipe-glsl 28 float cultmath_snoise(vec3) ulp-bounded, on the simplex tie set 127 112 0 6929326e4f27726d7bbdbac3a7823209e2ecfcd301018ef164527c4c1a9f7ae8 +lavapipe-glsl 29 vec4 cultmath_snoise_grad(vec3) ulp-bounded, on the simplex tie set 102 546.5 0 6173a812fd4059fa19bce84d34858c6035cdda98aa21a2b210e611cbd58c29d6 +lavapipe-glsl 30 vec3 cultmath_af_point(float) ulp-bounded 256 0 0 7aa8ec07c8804cc92400c8a5c0f0d301db2ca4b7c4593a40c4223df306dab4c8 +lavapipe-glsl 31 vec3 cultmath_af_symbol(float, float) ulp-bounded 256 0 0 041476b7fda30584d1b555d8ee5ffbf29f111d8fa97f0a47acba8c16641e222f +lavapipe-glsl 32 vec3 cultmath_af_from_iv(vec2) ulp-bounded 256 0 0 306fe58a3268199fc8fd845a32d956f349a790422fa5c87d5a0824636cb55424 +lavapipe-glsl 33 vec2 cultmath_af_range(vec3) ulp-bounded 256 0 0 6245eeba19473d69d0d8155e20e2e6089a6843140723d23ed5d501064023a44a +lavapipe-glsl 34 vec3 cultmath_af_add(vec3, vec3) ulp-bounded 256 0 0 cb1cb3fc69224837342de767525d332687b9d3e17b3de255c28e2f0f65f32640 +lavapipe-glsl 35 vec3 cultmath_af_sub(vec3, vec3) ulp-bounded 256 0 0 a8fad8ea86cf61841430293fdd9840a54008160250114040380c9634c63bb17e +lavapipe-glsl 36 vec3 cultmath_af_neg(vec3) ulp-bounded 256 0 0 e485acf8ee21c6d880621cc6216b3b2a78318f56f5864b33c5509be27e22a694 +lavapipe-glsl 37 vec3 cultmath_af_scale(vec3, float) ulp-bounded 256 0 0 8b0c8a540fea82fe058efc42ffa38dbd69850e579cefe5fdbc4c164b715ec15d +lavapipe-glsl 38 vec3 cultmath_af_add_iv(vec3, vec2) ulp-bounded 256 0 0 620f747e6ba53014c9714a8dbfaa3ff93f281c80938bd035ef64657e3bdc1a16 +lavapipe-glsl 39 vec3 cultmath_af_mul(vec3, vec3) ulp-bounded 256 0 0 9dd029d56132560877ea155cf09e1b9519c2721acac462b10ac64afe7d01e134 +lavapipe-glsl 40 vec3 cultmath_af_snoise(vec3, vec3, float) ulp-bounded 53 90.75 0 bdfd575faf2016af642b9280ecf77e34673babf2420362537ae5d1dba7cebe64 +lavapipe-glsl 41 vec3 cultmath_af_fbm(vec3, vec3, float, int, float, float) ulp-bounded 28 97.5 0 188d2e6eb49daa0eda38ed0c9b947b8b9f2c0a4c426665bdd25c72efa477933e +lavapipe-glsl 42 vec3 cultmath_af_frustum_axis(vec2, float, float) ulp-bounded 256 0 0 9a6daac34242d264db9dedc40c8c074ea0fd188af9c04bb1658d0693111eabee +lavapipe-glsl 43 vec4 cultmath_af_frustum_ball(vec2, float, float, float, float) ulp-bounded 256 0 0 45522a4b8e0e31f90e9e9e3af245182305ca8bb27abf1ab61b04f6c35b606112 +lavapipe-glsl 44 vec2 cultmath_iv_snoise_ball(vec2, float) ulp-bounded 244 46 0 edcfa49ec6c1e01fdb920c3265a79ca781e2edefdfe8a11f9cae3bf985b3687d +lavapipe-glsl 45 vec3 cultmath_af_snoise(vec3, vec3, float) ulp-bounded, reach 1e-6 to 1e-3 75 46.9375 0 1a66868821ee19096da857fe52df70207f0d9daa20d5939440edf1ad8f4c0455 +lavapipe-glsl 46 vec3 cultmath_af_fbm(vec3, vec3, float, int, float, float) ulp-bounded, reach 1e-6 to 1e-3 27 102.5 0 42246db4e19a1da20433517cdc7016dda375ea70dc90d1a777679bfd76fb59e8 +lavapipe-glsl 47 float cultmath_cycles_divide(float, float) ulp-bounded 256 0 0 87f143c57806ad52c3295cde67e97f31e39c8572b8c0a4b8c577e6fcd8ecbebf +lavapipe-glsl 48 float cultmath_cycles_power(float, float) ulp-bounded, platform pow 136 4.918926113980705 0 0e62db5ea32fdb9fdd3a9b135a914ddadd3231bdee0ff15c709102b26bb89186 +lavapipe-glsl 49 float cultmath_cycles_logarithm(float, float) ulp-bounded, platform log 146 4.94622778071426 0 5b2bf1411512c7e5a3f4b335a16fc3ba00ba0784bb87acb14b7d1b9dd551b2f3 +lavapipe-glsl 50 float cultmath_cycles_sqrt(float) ulp-bounded 256 0 0 6d4beb34e93ae304b3d9d30f203fb6c2ba222affc0efc35bb5441528e9062a9a +lavapipe-glsl 51 float cultmath_cycles_inverse_sqrt(float) ulp-bounded 256 0 0 71aadd5bd384b9ca2eb89827de53af810a1350b02177de1987e9405e4a6e9ad8 +lavapipe-glsl 52 float cultmath_cycles_modulo(float, float) ulp-bounded 256 0 0 cf055cafcb5b2d4789a0a2d5cfbc8bc79f52df646b60f5e47db3f994680949e9 +lavapipe-glsl 53 float cultmath_cycles_floored_modulo(float, float) ulp-bounded 256 0 0 b781fd31c3671b332d7c726f1ef38c28119d0cda26f45a8a8f788127e73b60cd +lavapipe-glsl 54 float cultmath_cycles_wrap(float, float, float) ulp-bounded 256 0 0 76c0b9fc35952c0557b4c1bd51d970851de7faa427dc6772a5cbad8851c9b4f8 +lavapipe-glsl 55 float cultmath_cycles_snap(float, float) ulp-bounded 256 0 0 1211752ef48e46517f14eee689ada2e425688e0e7b1f3e10491d0099b19c7a96 +lavapipe-glsl 56 float cultmath_cycles_pingpong(float, float) ulp-bounded 256 0 0 968ec85b73586bc37d1a0ce850c48b9ba55f9de42b0f05dee908fa307300887c +lavapipe-glsl 57 float cultmath_cycles_smooth_min(float, float, float) ulp-bounded 256 0 0 9e5ef2547c138970e8edcaf669a1f43e54982b7f113ace2e1ca0ba7712bfc052 +lavapipe-glsl 58 float cultmath_cycles_smooth_max(float, float, float) ulp-bounded 256 0 0 25e92186c7fcfd8692595b6be6fbb16add05cc97b9347129e46dccefe518f6ea +lavapipe-glsl 59 float cultmath_cycles_compare(float, float, float) ulp-bounded 256 0 0 525e89cb65b42d49ebecdc542a82e5833aa5abc12de0baf85dcb5d628966f1f6 +lavapipe-glsl 60 float cultmath_cycles_round(float) ulp-bounded 256 0 0 ace31f9ef6b3990cfd2deafd3bb831393b17a5c605de645d351096dd37469ecf +lavapipe-glsl 61 float cultmath_cycles_trunc(float) ulp-bounded 256 0 0 ff8954688fa6017fdb94e9f2d76f1bebd4403dc961185b5e911a13341107f3b6 +lavapipe-glsl 62 float cultmath_cycles_fract(float) ulp-bounded 256 0 0 8f9ca486ba15de9d17103ab201c42a2e71d8b813752690c503971786abdf20ee +lavapipe-glsl 63 float cultmath_cycles_sign(float) ulp-bounded 256 0 0 6d4d58598959072125f811e50a6b4cb399946ffb53bcc12d66e985e3ae1f7237 +lavapipe-glsl 64 float cultmath_cycles_map_range_linear(float, float, float, float, float) ulp-bounded 256 0 0 153c7636170f2c2df751da7d4108b264048a0c2441eea4175a07d52283bc34f8 +lavapipe-glsl 65 float cultmath_cycles_map_range_stepped(float, float, float, float, float, float) ulp-bounded 256 0 0 75391d2c4ae437bbb7de824fff0ee2a4cface26160589a2546051fd7fe6302ea +lavapipe-glsl 66 float cultmath_cycles_map_range_smoothstep(float, float, float, float, float) ulp-bounded 256 0 0 202bd26423a4ffe30698d093ab79a6d3aa0d388402f8a0059733695bcbc7bef8 +lavapipe-glsl 67 float cultmath_cycles_map_range_smootherstep(float, float, float, float, float) ulp-bounded 256 0 0 fb98cb86965fda6c1e8b4f348009a997bfa8b38ba78c85a6c7c5aa3daff2c9b5 +lavapipe-glsl 68 float cultmath_cycles_clamp_minmax(float, float, float) ulp-bounded 256 0 0 13093e4a629a5f7eaeafa6dca36af46692d323ebc7565bfc052195c13d820d9c +lavapipe-glsl 69 float cultmath_cycles_clamp_range(float, float, float) ulp-bounded 256 0 0 801145eabd38a9b92f5fb81aa5d9d4c6a9a977c8514f753e92a039f66099dbbb +lavapipe-glsl 70 float cultmath_cycles_mix_float(float, float, float) ulp-bounded 256 0 0 555151462568cdf0c4557c44b299fc5085149dbe7f9b8e77995b0ae84094701b +lavapipe-glsl 71 vec3 cultmath_cycles_mix_vector(float, vec3, vec3) ulp-bounded 256 0 0 024dfa0de6980161524c7d26c0ccbac06769764b7b1f05e1ddaa2de3d26f5e9e +lavapipe-glsl 72 vec3 cultmath_cycles_rgb_to_hsv(vec3) ulp-bounded 256 0 0 eec7cf189745ddc1c001297a42ab404b4186607f32a38a3b053122104f7c7b38 +lavapipe-glsl 73 vec3 cultmath_cycles_hsv_to_rgb(vec3) ulp-bounded 256 0 0 1391d6304ba96b5f271c1fc66935785bf496d40c6a66d07669dbd9b36b7fd0f2 +lavapipe-glsl 74 float cultmath_cycles_rgb_to_bw(vec3) ulp-bounded 256 0 0 d3c13195d2fd31e8fe5d0a8127d2650fe7b54ab0681d259735b891ef6c48a3d0 +lavapipe-glsl 75 vec2 cultmath_cycles_ramp_index(float, int) ulp-bounded 256 0 0 62dbe8cdbd7a7cc64367dbe49f6554ee6660ba686bff145ec043f6932bea1f4e +lavapipe-glsl 76 vec3 cultmath_cycles_mix_blend(float, vec3, vec3) ulp-bounded 256 0 0 98d559290d1eea28711099f58334c3013ded3d8055ffe2c460463fd8e6920e8a +lavapipe-glsl 77 vec3 cultmath_cycles_mix_add(float, vec3, vec3) ulp-bounded 203 1.280824945387952 0 a6eb4ea72d93fadd76258113bcec9e2aa6a3557f7ffbbd018591b411826372e5 +lavapipe-glsl 78 vec3 cultmath_cycles_mix_mul(float, vec3, vec3) ulp-bounded 256 0 0 d8c88a3734b9a6298dbfddafb2f4261639d9292f2c3282bd2de93ac87dc64aff +lavapipe-glsl 79 vec3 cultmath_cycles_mix_screen(float, vec3, vec3) ulp-bounded 256 0 0 18a96f09e992efa4ffeccb6882a25d0a95eddd5c552f38081f9e9cbaeb302ba2 +lavapipe-glsl 80 vec3 cultmath_cycles_mix_overlay(float, vec3, vec3) ulp-bounded 256 0 0 0d432008ddc87cf7c9728417be9dc5fbfbbff109b70696606c069bedb6f34455 +lavapipe-glsl 81 vec3 cultmath_cycles_mix_sub(float, vec3, vec3) ulp-bounded 224 0.9887614915449221 0 43f38c46c85ec8e9bd50c40d273090301b56e45072d396e6840aba4b85d36ea0 +lavapipe-glsl 82 vec3 cultmath_cycles_mix_div(float, vec3, vec3) ulp-bounded 256 0 0 595b729b984c7eafac49d571e213b70cab0cc3961c0875fd44f14f0eef712f6b +lavapipe-glsl 83 vec3 cultmath_cycles_mix_diff(float, vec3, vec3) ulp-bounded 256 0 0 0f1494d72ef1aa26250df833c36c0059bfabc957ad46939f48095714f44724ab +lavapipe-glsl 84 vec3 cultmath_cycles_mix_exclusion(float, vec3, vec3) ulp-bounded 256 0 0 49ac2faf217ebce63ea6f21aef3d865936106f1f461258d8f1dc0ebbc87ddb6e +lavapipe-glsl 85 vec3 cultmath_cycles_mix_dark(float, vec3, vec3) ulp-bounded 256 0 0 446ec94675d81f6d228b70c79d9d857898f26522dd274305ae3c9dcf01e79d2e +lavapipe-glsl 86 vec3 cultmath_cycles_mix_light(float, vec3, vec3) ulp-bounded 256 0 0 a2d1efef2a24fc3d55a9fc05aec5396e9e8360ff3e2f5f2c3987b828d21600b1 +lavapipe-glsl 87 vec3 cultmath_cycles_mix_dodge(float, vec3, vec3) ulp-bounded 256 0 0 f75638b3350d6d10342c679b22051f854fe21cf886c7e1ec337ec66ec5b4e208 +lavapipe-glsl 88 vec3 cultmath_cycles_mix_burn(float, vec3, vec3) ulp-bounded 256 0 0 96405c0838ddd0d2201909253f0a120ec1f73bed7d196d1c74f63ec36a28646b +lavapipe-glsl 89 vec3 cultmath_cycles_mix_hue(float, vec3, vec3) ulp-bounded 256 0 0 3a010be30109d2782af0eb52c0d71b668caa30ed9817fbcfa2763a424f0d5235 +lavapipe-glsl 90 vec3 cultmath_cycles_mix_sat(float, vec3, vec3) ulp-bounded 256 0 0 0d5fded68d4f56dcfe97fd5e2aee9644ac0d176572c069bc9aa8afa29a83ddaf +lavapipe-glsl 91 vec3 cultmath_cycles_mix_val(float, vec3, vec3) ulp-bounded 256 0 0 8b4f5e0be561175c0417791b42ed18dc2c8a0330d6f98421f6dcc89bfe152a81 +lavapipe-glsl 92 vec3 cultmath_cycles_mix_color(float, vec3, vec3) ulp-bounded 256 0 0 00067b1567bcd6c07a81fa5002f145dfca22437a3f3df5389b2665334d14909b +lavapipe-glsl 93 vec3 cultmath_cycles_mix_soft(float, vec3, vec3) ulp-bounded 157 1.9750388068880254 0 ed7c5508ca0543cc20a5f0c5624e75e3ca2a2d6044d481816eeda2edc50c0592 +lavapipe-glsl 94 vec3 cultmath_cycles_mix_linear(float, vec3, vec3) ulp-bounded 256 0 0 672435cc30bcbbb253cce7316ee0712b1a18f06924bc89cea2d3388dd164a15d +lavapipe-glsl 95 float cultmath_cycles_arcsine(float) ulp-bounded, platform asin 154 2734.286809678319 0 f28f3ed0a53ffeebdfa84865d2d3d41590e6b46fc1578d40e1215e2a9e1af585 +lavapipe-glsl 96 float cultmath_cycles_arccosine(float) ulp-bounded, platform acos 79 1046.8674409774287 0 22a2c38ab5a232cdbb33cf0c133362581a398f64a4d0d5d6dd89dc5af06bd890 +lavapipe-glsl 97 float cultmath_cycles_arctan2(float, float) ulp-bounded, platform atan 6 25.5 0 2c60447d80186f6dc9726f19c09fa96ec3f66d8f5688968da533d9195ea463c4 +lavapipe-glsl 98 mat3 cultmath_snoise_hessian(vec3) ulp-bounded 30 1358.4375 0 62bbafb8420ed5aaa0ce11d1470ca98945e690b186c33a1e7cf4d71478396465 +lavapipe-glsl 99 mat3 cultmath_snoise_hessian(vec3) ulp-bounded, on the simplex tie set 110 1317.4754224467295 0 0efd9b3a637b46033ed0351f64de274db4d9ce05bb83dd1ce57afb3ceaea26bc +lavapipe-glsl 100 float cultmath_integral_clamp_linear(float, float, float, float, float, float) ulp-bounded 256 0 0 84bf9c9a2126b3114a692507cc54f58d313afc33de8a1cac83969cc508433cbe +lavapipe-glsl 101 float cultmath_integral_clamp_linear(float, float, float, float, float, float) ulp-bounded, lo above hi and infinite bounds 256 0 0 ff999094d7794aa525e0f9f9a067aa21408a59559aa546cace3b1bb4a8c7f96d +lavapipe-glsl 102 float cultmath_integral_clamp_linear(float, float, float, float, float, float) ulp-bounded, zero-length spans and flat infinite clamps 256 0 0 c3cc48f4edcac6801b9223f12d289934916431bdfaea8f68af33a1b833ab9860 +lavapipe-glsl 103 SpanNoise cultmath_span_fbm(SpanPath, SpanStage, int, float, float) ulp-bounded 7 1012477.3459086476 0 97c531c3a690e056d95e949e243ae74111d4a93a39fd22c0358a103b3bb14bc1 +lavapipe-glsl 104 SpanNoise cultmath_span_ridged(SpanPath, SpanStage, int, float, float) ulp-bounded 8 948534.9108393334 0 54fd229d69439ff3318690b7802143f8410dc7ece30ad0d56ccc4b68bf39bec2 +lavapipe-glsl 105 vec4 cultmath_snoise_grad(vec3) ulp-bounded, coordinate bands 1e-4 to 1e2 116 249.5 0 fff9658a8ec055766c9327ee9b680cf7fb83736c472ae90a11e50d6d2a053fdc +lavapipe-glsl 106 vec4 cultmath_snoise_grad(vec3) ulp-bounded, coordinate bands 1e2 to 4e6 70 11866336.625 0 833484714ebcea59d86e0fbc2eaa4ae247c29541703763989e6758547dbf6db8 +lavapipe-glsl 107 mat3 cultmath_snoise_hessian(vec3) ulp-bounded, coordinate bands 1e-4 to 1e2 120 980.7417469278579 0 3ea43dabe0091ea8e994c1dfc65c7274ed38b9343d4d1d06f7caa09c806c91df +lavapipe-glsl 108 mat3 cultmath_snoise_hessian(vec3) ulp-bounded, coordinate bands 1e2 to 4e6 46 164827710.09171063 0 0984abe5fff2e2df93b053a5b5dbdd4eacd816d26144d8352497614e45159c07 +lavapipe-glsl 109 float cultmath_distance_to_segment(vec2, vec2, vec2) ulp-bounded 256 0 0 56d4972116081037d01476cb26a7981a35e9a949eb739df87e331fef9a25e424 +lavapipe-glsl 110 vec2 cultmath_segment_closest(vec2, vec2, vec2) ulp-bounded 256 0 0 fb6b7e9038f9138584d8d0c427578088f06ae21d7510d20e899cac3c3833dbd9 +lavapipe-glsl 111 float cultmath_distance_to_segment(vec3, vec3, vec3) ulp-bounded 226 1.60911149933558 0 ad66ebd8fb9d743d5c74491a7657f92d1cfa04b76ae65e090112e369881cf0ce +lavapipe-glsl 112 vec3 cultmath_segment_closest(vec3, vec3, vec3) ulp-bounded 214 32 0 4cdb6d7124e502786a4c4b082da3b94b8bde1e2082d14efa8245cbbe6b10a978 +lavapipe-glsl 113 vec4 cultmath_power_border_step(vec3, vec4, vec4, vec4) ulp-bounded 214 43 0 fdfdff73434a146489b002af5e80663658b2dd7b86105a7e65bdab755ab54a5e +lavapipe-glsl 114 vec4 cultmath_power_score(vec3, vec4) ulp-bounded 207 1.4619722193127032 0 dc1aa639ae1dc44003a0f5d8c7c99b2e3d7f51b158c96b3c3bd7a9f7df6d927e +lavapipe-glsl 115 vec4 cultmath_multiplicative_score(vec3, vec4) ulp-bounded 234 1.5529504197086745 0 ee1af26ac82489e8d363e7a6b6b59da7dacfb397d4bc9a723dd68607a69da41a +lavapipe-glsl 116 CultSiteCells cultmath_site_cells_insert(CultSiteCells, vec4, int) ulp-bounded 256 0 0 bfad8b369011cfbf14644fec68ce65620694fcbf3cd3804f54953d55587313fc +lavapipe-glsl 117 vec4 cultmath_site_cells_border(CultSiteCells) ulp-bounded 228 1.069496760346883 0 d7b478bef7e6f80902d0b5b255cb4fca30757ff6b9d25dac2030b037a8d342ce +lavapipe-glsl 118 float cultmath_gabriel_margin(vec3, vec3, vec3) ulp-bounded 201 2 0 6a80fbef486de496a08b7c8e7f9f65e2cc0f5b9f93abe50c43e84ad88d1ed034 +lavapipe-glsl 119 vec3 cultmath_lattice_site(vec2, float, float) ulp-bounded 256 0 0 84df739c336796638dcf0a99c328a4b8c150c25d80e02248d4b6d023dc13161f +lavapipe-glsl 120 float cultmath_lattice_weight(float, float, float, float) ulp-bounded 231 2.0671110200639147 0 434cdf5603abc2942aa624b9d2e98d5f1231706c86180a80439bc8b72bdd066e +lavapipe-glsl 121 float cultmath_lattice_distance(vec2, vec2, float, vec2, float) ulp-bounded 256 0 0 ba3fa3bdb4f5f5b2478a4ddfb2e08f2f425e997778a716884e43b13d6ed050b5 +lavapipe-glsl 122 float cultmath_lattice_smooth_step(float, float, float, float) ulp-bounded 256 0 0 6cbeddde536b12e83873f2e5ac60d16bef22049d2a7dea61af0ff1e0d5b84740 +lavapipe-glsl 123 vec4 cultmath_power_border(vec3, vec4[128], int) ulp-bounded 188 65.72121683891783 0 8427c2b99109a4f59ff745fdb87f261deb1cbae34ce99bc1ae05ebb7f9963b4d +lavapipe-glsl 124 vec4 cultmath_weighted_lattice_cells(vec2, float, vec4[128], int, float, float, float, float, float, vec2, float) ulp-bounded 179 3 0 fd3b58c4e2ba8a7bf801a1e6cdff82468abcb368442bc98b2583fda9d2e6f823 +lavapipe-hlsl 0 float cultmath_snoise(vec3) ulp-bounded 94 122.6875 0 5d41c14241a13124f2e1b49f230f5df0c48d0d69fb1be9ef2f33dc1702bf0b0a +lavapipe-hlsl 1 float cultmath_snoise(vec2) ulp-bounded 204 1 0 81d9c62726afdccbbe4ffef173b5c92731eb6bf5927b3979d653e50dbd5d4064 +lavapipe-hlsl 2 vec4 cultmath_snoise_grad(vec3) ulp-bounded 71 617.5 0 f7e9ed1707cdb015efaba0e0150193309da0d4c125349518f8b7c60a17b25790 +lavapipe-hlsl 3 vec4 cultmath_fbm_grad(vec3, int, float, float) ulp-bounded 8 5043.031516667752 0 d60ec63e283433334da31e8f7ab396f6bfac473ed3a59e50f1db0db320ba37b9 +lavapipe-hlsl 4 vec4 cultmath_ridged_grad(vec3, int, float, float) ulp-bounded 12 3510 0 3a545af386da2e9c04f665e1fc42120e687b0f832c9afdad3a87ecdddf813a20 +lavapipe-hlsl 5 CultCellular cultmath_cellular(vec3) ulp-bounded 199 1 0 ec144b78ccb06b565bdcb514f941f1823bb2cb8ec519b45f8a034ef50ef1b871 +lavapipe-hlsl 6 ivec3 cultmath_pcg3d(ivec3) exact 256 0 0 a410be8431cbc976fd6b7af9c83a71858d0f9ccb9e7f2c8fda94d5ca2db62176 +lavapipe-hlsl 7 ivec4 cultmath_pcg4d(ivec4) exact 256 0 0 d22bad50369da1bb343cfa0457565fa795a9374dd354c7cedeaa84b1f4fcb5e1 +lavapipe-hlsl 8 vec2 cultmath_iv_point(float) ulp-bounded 256 0 0 4345669b712d86cc70869adee43d1b371bb5acbf767fd0ad4c96e6bdd2167eae +lavapipe-hlsl 9 vec2 cultmath_iv_add(vec2, vec2) ulp-bounded 256 0 0 71fb79c72089090255803a20bdda0ab592b71edf7e4ff2e35a1e4407bb203f91 +lavapipe-hlsl 10 vec2 cultmath_iv_sub(vec2, vec2) ulp-bounded 256 0 0 a94e8e5a7315fe885499a0984755d2fc8dfaaa0a2cd776ae70d06fa061e5526e +lavapipe-hlsl 11 vec2 cultmath_iv_neg(vec2) ulp-bounded 256 0 0 c659fe8af49f9d27717efae94578fcd76a0d8db173755b008c10314e71509018 +lavapipe-hlsl 12 vec2 cultmath_iv_mul(vec2, vec2) ulp-bounded 256 0 0 1bef7438c091e05e39918e961e2154161ffb86192f35917ea344250560803ce0 +lavapipe-hlsl 13 vec2 cultmath_iv_scale(vec2, float) ulp-bounded 256 0 0 f7cabee9534c5867efaa66ded529feab679065fed8e277d48804f8a127cfb1da +lavapipe-hlsl 14 vec2 cultmath_iv_abs(vec2) ulp-bounded 256 0 0 06b1b8506452333155949472f815ce84542614e434633f4824ff708377b6b622 +lavapipe-hlsl 15 vec2 cultmath_iv_min(vec2, vec2) ulp-bounded 256 0 0 a324b35cb4a7c5fa0c95050814175df5d8279efe4359f3898e14208cc87ecaaa +lavapipe-hlsl 16 vec2 cultmath_iv_max(vec2, vec2) ulp-bounded 256 0 0 d68412262ca234c1da130fc5217ba6856da3e92e435c28c1fbdbf3692a89e1fa +lavapipe-hlsl 17 vec2 cultmath_iv_sqr(vec2) ulp-bounded 256 0 0 dbbb0e0df015456393452377d689732428a9a8e24d8e2b407ee9620593b4c46b +lavapipe-hlsl 18 vec2 cultmath_iv_sqrt(vec2) ulp-bounded 256 0 0 95bd15d1b283713fc632ced350f5da1b89f8f73e6618329773db1b52acd29991 +lavapipe-hlsl 19 vec2 cultmath_iv_clamp(vec2, float, float) ulp-bounded 256 0 0 abe9daf24930a5e3a49ec994c4cae3a0c27b9d019d6d93ec1963ec3daad664a0 +lavapipe-hlsl 20 vec2 cultmath_iv_saturate(vec2) ulp-bounded 256 0 0 0f844ef8c4d9a9f748c80677bbbfc36b5f6e682eb87c2d46e7e20635d5f55c26 +lavapipe-hlsl 21 vec2 cultmath_iv_smoothstep(float, float, vec2) ulp-bounded 256 0 0 3d5944a4c43feb91d6786924e0f5439c05285d28ff1f500b5582893758dd4ce5 +lavapipe-hlsl 22 vec2 cultmath_iv_lerp(vec2, vec2, float) ulp-bounded 256 0 0 96b09e90a3fbbfe81379a29a23b676e490bc7dc6bb731450197707e6cf4c573f +lavapipe-hlsl 23 vec2 cultmath_iv_snoise_ball(vec3, float) ulp-bounded 244 54 0 f36530a4cd8c9fdc1c73e7ddb6782cd11cbf8493e2ee7b0656e818812504267e +lavapipe-hlsl 24 vec2 cultmath_iv_fbm_ball(vec3, float, int, float, float) ulp-bounded 252 75 0 a1677ea42ce91a5d2b6f83fa7c44879b7a184ed4631108d7a1c6e710bf26ff02 +lavapipe-hlsl 25 vec4 cultmath_iv_frustum_ball(vec2, float, float, float, float) ulp-bounded 198 1.6457063576593662 0 327c306aa4d06aecbb2681d8808c6dbf0567e87b54a6067c68001e36b3e52169 +lavapipe-hlsl 26 vec2 cultmath_iv_exp(vec2) ulp-bounded, platform exp 7 7.526057804152758 0 b4af8232dc3dd782cc6d790e928ede0f6ba6dfdffd6c71dd9494fb58973e485c +lavapipe-hlsl 27 CultPhasor cultmath_phacelle(vec3, vec3, float, float) ulp-bounded, platform exp, sin, cos; across platforms |diff| <= 2^-20 max(|v|, 1); on a device |diff| <= 2^-18 max(|v|, 1) 0 18.5 0 705b4c18027a0838218645e9368c3749ae4b5bf75e0485985725e8e72b73ab88 +lavapipe-hlsl 28 float cultmath_snoise(vec3) ulp-bounded, on the simplex tie set 144 99 0 be76512b18eb678194dad0c4726c0aef9ba34012b60b79d24c2df27989707145 +lavapipe-hlsl 29 vec4 cultmath_snoise_grad(vec3) ulp-bounded, on the simplex tie set 111 546.5 0 124d4be07cbb66edab644e649c081cb7c8be5d99b6c1d84fec5d7ef65c76ed0f +lavapipe-hlsl 30 vec3 cultmath_af_point(float) ulp-bounded 256 0 0 7aa8ec07c8804cc92400c8a5c0f0d301db2ca4b7c4593a40c4223df306dab4c8 +lavapipe-hlsl 31 vec3 cultmath_af_symbol(float, float) ulp-bounded 256 0 0 041476b7fda30584d1b555d8ee5ffbf29f111d8fa97f0a47acba8c16641e222f +lavapipe-hlsl 32 vec3 cultmath_af_from_iv(vec2) ulp-bounded 256 0 0 306fe58a3268199fc8fd845a32d956f349a790422fa5c87d5a0824636cb55424 +lavapipe-hlsl 33 vec2 cultmath_af_range(vec3) ulp-bounded 256 0 0 6245eeba19473d69d0d8155e20e2e6089a6843140723d23ed5d501064023a44a +lavapipe-hlsl 34 vec3 cultmath_af_add(vec3, vec3) ulp-bounded 256 0 0 cb1cb3fc69224837342de767525d332687b9d3e17b3de255c28e2f0f65f32640 +lavapipe-hlsl 35 vec3 cultmath_af_sub(vec3, vec3) ulp-bounded 256 0 0 a8fad8ea86cf61841430293fdd9840a54008160250114040380c9634c63bb17e +lavapipe-hlsl 36 vec3 cultmath_af_neg(vec3) ulp-bounded 256 0 0 e485acf8ee21c6d880621cc6216b3b2a78318f56f5864b33c5509be27e22a694 +lavapipe-hlsl 37 vec3 cultmath_af_scale(vec3, float) ulp-bounded 256 0 0 8b0c8a540fea82fe058efc42ffa38dbd69850e579cefe5fdbc4c164b715ec15d +lavapipe-hlsl 38 vec3 cultmath_af_add_iv(vec3, vec2) ulp-bounded 256 0 0 620f747e6ba53014c9714a8dbfaa3ff93f281c80938bd035ef64657e3bdc1a16 +lavapipe-hlsl 39 vec3 cultmath_af_mul(vec3, vec3) ulp-bounded 256 0 0 9dd029d56132560877ea155cf09e1b9519c2721acac462b10ac64afe7d01e134 +lavapipe-hlsl 40 vec3 cultmath_af_snoise(vec3, vec3, float) ulp-bounded 54 61 0 052ba44c08e92f1a9176d99c99c3939686c8e05f1398c3a184e0edf246cd565c +lavapipe-hlsl 41 vec3 cultmath_af_fbm(vec3, vec3, float, int, float, float) ulp-bounded 32 99.125 0 21f78108b9704a4b6dca1f74445c4a07f0fe235b222100c083346eae69833a3e +lavapipe-hlsl 42 vec3 cultmath_af_frustum_axis(vec2, float, float) ulp-bounded 256 0 0 9a6daac34242d264db9dedc40c8c074ea0fd188af9c04bb1658d0693111eabee +lavapipe-hlsl 43 vec4 cultmath_af_frustum_ball(vec2, float, float, float, float) ulp-bounded 256 0 0 45522a4b8e0e31f90e9e9e3af245182305ca8bb27abf1ab61b04f6c35b606112 +lavapipe-hlsl 44 vec2 cultmath_iv_snoise_ball(vec2, float) ulp-bounded 253 0.5 0 401da9e2e59377ac82a602dc86614e9c0418ee2ee8d38eecea45b5406ebca611 +lavapipe-hlsl 45 vec3 cultmath_af_snoise(vec3, vec3, float) ulp-bounded, reach 1e-6 to 1e-3 79 35.59375 0 9e9d24960b0514ee1fa795aead7629b8a61b65eec94aa1f25a94c0c754a1d992 +lavapipe-hlsl 46 vec3 cultmath_af_fbm(vec3, vec3, float, int, float, float) ulp-bounded, reach 1e-6 to 1e-3 24 122.75 0 7f941b1f0c76d9f2121027a555ae7f2a741cc164402f0df75237198ac97f850b +lavapipe-hlsl 47 float cultmath_cycles_divide(float, float) ulp-bounded 256 0 0 87f143c57806ad52c3295cde67e97f31e39c8572b8c0a4b8c577e6fcd8ecbebf +lavapipe-hlsl 48 float cultmath_cycles_power(float, float) ulp-bounded, platform pow 136 4.918926113980705 0 0e62db5ea32fdb9fdd3a9b135a914ddadd3231bdee0ff15c709102b26bb89186 +lavapipe-hlsl 49 float cultmath_cycles_logarithm(float, float) ulp-bounded, platform log 146 4.94622778071426 0 5b2bf1411512c7e5a3f4b335a16fc3ba00ba0784bb87acb14b7d1b9dd551b2f3 +lavapipe-hlsl 50 float cultmath_cycles_sqrt(float) ulp-bounded 256 0 0 6d4beb34e93ae304b3d9d30f203fb6c2ba222affc0efc35bb5441528e9062a9a +lavapipe-hlsl 51 float cultmath_cycles_inverse_sqrt(float) ulp-bounded 256 0 0 71aadd5bd384b9ca2eb89827de53af810a1350b02177de1987e9405e4a6e9ad8 +lavapipe-hlsl 52 float cultmath_cycles_modulo(float, float) ulp-bounded 256 0 0 cf055cafcb5b2d4789a0a2d5cfbc8bc79f52df646b60f5e47db3f994680949e9 +lavapipe-hlsl 53 float cultmath_cycles_floored_modulo(float, float) ulp-bounded 256 0 0 b781fd31c3671b332d7c726f1ef38c28119d0cda26f45a8a8f788127e73b60cd +lavapipe-hlsl 54 float cultmath_cycles_wrap(float, float, float) ulp-bounded 256 0 0 76c0b9fc35952c0557b4c1bd51d970851de7faa427dc6772a5cbad8851c9b4f8 +lavapipe-hlsl 55 float cultmath_cycles_snap(float, float) ulp-bounded 256 0 0 1211752ef48e46517f14eee689ada2e425688e0e7b1f3e10491d0099b19c7a96 +lavapipe-hlsl 56 float cultmath_cycles_pingpong(float, float) ulp-bounded 256 0 0 968ec85b73586bc37d1a0ce850c48b9ba55f9de42b0f05dee908fa307300887c +lavapipe-hlsl 57 float cultmath_cycles_smooth_min(float, float, float) ulp-bounded 256 0 0 9e5ef2547c138970e8edcaf669a1f43e54982b7f113ace2e1ca0ba7712bfc052 +lavapipe-hlsl 58 float cultmath_cycles_smooth_max(float, float, float) ulp-bounded 256 0 0 25e92186c7fcfd8692595b6be6fbb16add05cc97b9347129e46dccefe518f6ea +lavapipe-hlsl 59 float cultmath_cycles_compare(float, float, float) ulp-bounded 256 0 0 525e89cb65b42d49ebecdc542a82e5833aa5abc12de0baf85dcb5d628966f1f6 +lavapipe-hlsl 60 float cultmath_cycles_round(float) ulp-bounded 256 0 0 ace31f9ef6b3990cfd2deafd3bb831393b17a5c605de645d351096dd37469ecf +lavapipe-hlsl 61 float cultmath_cycles_trunc(float) ulp-bounded 256 0 0 ff8954688fa6017fdb94e9f2d76f1bebd4403dc961185b5e911a13341107f3b6 +lavapipe-hlsl 62 float cultmath_cycles_fract(float) ulp-bounded 256 0 0 8f9ca486ba15de9d17103ab201c42a2e71d8b813752690c503971786abdf20ee +lavapipe-hlsl 63 float cultmath_cycles_sign(float) ulp-bounded 256 0 0 6d4d58598959072125f811e50a6b4cb399946ffb53bcc12d66e985e3ae1f7237 +lavapipe-hlsl 64 float cultmath_cycles_map_range_linear(float, float, float, float, float) ulp-bounded 256 0 0 153c7636170f2c2df751da7d4108b264048a0c2441eea4175a07d52283bc34f8 +lavapipe-hlsl 65 float cultmath_cycles_map_range_stepped(float, float, float, float, float, float) ulp-bounded 256 0 0 75391d2c4ae437bbb7de824fff0ee2a4cface26160589a2546051fd7fe6302ea +lavapipe-hlsl 66 float cultmath_cycles_map_range_smoothstep(float, float, float, float, float) ulp-bounded 256 0 0 202bd26423a4ffe30698d093ab79a6d3aa0d388402f8a0059733695bcbc7bef8 +lavapipe-hlsl 67 float cultmath_cycles_map_range_smootherstep(float, float, float, float, float) ulp-bounded 256 0 0 fb98cb86965fda6c1e8b4f348009a997bfa8b38ba78c85a6c7c5aa3daff2c9b5 +lavapipe-hlsl 68 float cultmath_cycles_clamp_minmax(float, float, float) ulp-bounded 256 0 0 13093e4a629a5f7eaeafa6dca36af46692d323ebc7565bfc052195c13d820d9c +lavapipe-hlsl 69 float cultmath_cycles_clamp_range(float, float, float) ulp-bounded 256 0 0 801145eabd38a9b92f5fb81aa5d9d4c6a9a977c8514f753e92a039f66099dbbb +lavapipe-hlsl 70 float cultmath_cycles_mix_float(float, float, float) ulp-bounded 256 0 0 555151462568cdf0c4557c44b299fc5085149dbe7f9b8e77995b0ae84094701b +lavapipe-hlsl 71 vec3 cultmath_cycles_mix_vector(float, vec3, vec3) ulp-bounded 256 0 0 024dfa0de6980161524c7d26c0ccbac06769764b7b1f05e1ddaa2de3d26f5e9e +lavapipe-hlsl 72 vec3 cultmath_cycles_rgb_to_hsv(vec3) ulp-bounded 256 0 0 eec7cf189745ddc1c001297a42ab404b4186607f32a38a3b053122104f7c7b38 +lavapipe-hlsl 73 vec3 cultmath_cycles_hsv_to_rgb(vec3) ulp-bounded 256 0 0 1391d6304ba96b5f271c1fc66935785bf496d40c6a66d07669dbd9b36b7fd0f2 +lavapipe-hlsl 74 float cultmath_cycles_rgb_to_bw(vec3) ulp-bounded 256 0 0 d3c13195d2fd31e8fe5d0a8127d2650fe7b54ab0681d259735b891ef6c48a3d0 +lavapipe-hlsl 75 vec2 cultmath_cycles_ramp_index(float, int) ulp-bounded 256 0 0 62dbe8cdbd7a7cc64367dbe49f6554ee6660ba686bff145ec043f6932bea1f4e +lavapipe-hlsl 76 vec3 cultmath_cycles_mix_blend(float, vec3, vec3) ulp-bounded 256 0 0 98d559290d1eea28711099f58334c3013ded3d8055ffe2c460463fd8e6920e8a +lavapipe-hlsl 77 vec3 cultmath_cycles_mix_add(float, vec3, vec3) ulp-bounded 203 1.280824945387952 0 a6eb4ea72d93fadd76258113bcec9e2aa6a3557f7ffbbd018591b411826372e5 +lavapipe-hlsl 78 vec3 cultmath_cycles_mix_mul(float, vec3, vec3) ulp-bounded 256 0 0 d8c88a3734b9a6298dbfddafb2f4261639d9292f2c3282bd2de93ac87dc64aff +lavapipe-hlsl 79 vec3 cultmath_cycles_mix_screen(float, vec3, vec3) ulp-bounded 256 0 0 18a96f09e992efa4ffeccb6882a25d0a95eddd5c552f38081f9e9cbaeb302ba2 +lavapipe-hlsl 80 vec3 cultmath_cycles_mix_overlay(float, vec3, vec3) ulp-bounded 256 0 0 0d432008ddc87cf7c9728417be9dc5fbfbbff109b70696606c069bedb6f34455 +lavapipe-hlsl 81 vec3 cultmath_cycles_mix_sub(float, vec3, vec3) ulp-bounded 224 0.9887614915449221 0 43f38c46c85ec8e9bd50c40d273090301b56e45072d396e6840aba4b85d36ea0 +lavapipe-hlsl 82 vec3 cultmath_cycles_mix_div(float, vec3, vec3) ulp-bounded 256 0 0 595b729b984c7eafac49d571e213b70cab0cc3961c0875fd44f14f0eef712f6b +lavapipe-hlsl 83 vec3 cultmath_cycles_mix_diff(float, vec3, vec3) ulp-bounded 256 0 0 0f1494d72ef1aa26250df833c36c0059bfabc957ad46939f48095714f44724ab +lavapipe-hlsl 84 vec3 cultmath_cycles_mix_exclusion(float, vec3, vec3) ulp-bounded 256 0 0 49ac2faf217ebce63ea6f21aef3d865936106f1f461258d8f1dc0ebbc87ddb6e +lavapipe-hlsl 85 vec3 cultmath_cycles_mix_dark(float, vec3, vec3) ulp-bounded 256 0 0 446ec94675d81f6d228b70c79d9d857898f26522dd274305ae3c9dcf01e79d2e +lavapipe-hlsl 86 vec3 cultmath_cycles_mix_light(float, vec3, vec3) ulp-bounded 256 0 0 a2d1efef2a24fc3d55a9fc05aec5396e9e8360ff3e2f5f2c3987b828d21600b1 +lavapipe-hlsl 87 vec3 cultmath_cycles_mix_dodge(float, vec3, vec3) ulp-bounded 256 0 0 f75638b3350d6d10342c679b22051f854fe21cf886c7e1ec337ec66ec5b4e208 +lavapipe-hlsl 88 vec3 cultmath_cycles_mix_burn(float, vec3, vec3) ulp-bounded 256 0 0 96405c0838ddd0d2201909253f0a120ec1f73bed7d196d1c74f63ec36a28646b +lavapipe-hlsl 89 vec3 cultmath_cycles_mix_hue(float, vec3, vec3) ulp-bounded 256 0 0 3a010be30109d2782af0eb52c0d71b668caa30ed9817fbcfa2763a424f0d5235 +lavapipe-hlsl 90 vec3 cultmath_cycles_mix_sat(float, vec3, vec3) ulp-bounded 256 0 0 0d5fded68d4f56dcfe97fd5e2aee9644ac0d176572c069bc9aa8afa29a83ddaf +lavapipe-hlsl 91 vec3 cultmath_cycles_mix_val(float, vec3, vec3) ulp-bounded 256 0 0 8b4f5e0be561175c0417791b42ed18dc2c8a0330d6f98421f6dcc89bfe152a81 +lavapipe-hlsl 92 vec3 cultmath_cycles_mix_color(float, vec3, vec3) ulp-bounded 256 0 0 00067b1567bcd6c07a81fa5002f145dfca22437a3f3df5389b2665334d14909b +lavapipe-hlsl 93 vec3 cultmath_cycles_mix_soft(float, vec3, vec3) ulp-bounded 157 1.9750388068880254 0 ed7c5508ca0543cc20a5f0c5624e75e3ca2a2d6044d481816eeda2edc50c0592 +lavapipe-hlsl 94 vec3 cultmath_cycles_mix_linear(float, vec3, vec3) ulp-bounded 256 0 0 672435cc30bcbbb253cce7316ee0712b1a18f06924bc89cea2d3388dd164a15d +lavapipe-hlsl 95 float cultmath_cycles_arcsine(float) ulp-bounded, platform asin 154 2734.286809678319 0 f28f3ed0a53ffeebdfa84865d2d3d41590e6b46fc1578d40e1215e2a9e1af585 +lavapipe-hlsl 96 float cultmath_cycles_arccosine(float) ulp-bounded, platform acos 79 1046.8674409774287 0 22a2c38ab5a232cdbb33cf0c133362581a398f64a4d0d5d6dd89dc5af06bd890 +lavapipe-hlsl 97 float cultmath_cycles_arctan2(float, float) ulp-bounded, platform atan 6 25.5 0 2c60447d80186f6dc9726f19c09fa96ec3f66d8f5688968da533d9195ea463c4 +lavapipe-hlsl 98 mat3 cultmath_snoise_hessian(vec3) ulp-bounded 33 2377.8799856935966 0 a64853839f394cc7c367ba5e107caa8bb396f07cf202263aa917095dd1c939f7 +lavapipe-hlsl 99 mat3 cultmath_snoise_hessian(vec3) ulp-bounded, on the simplex tie set 132 1317.4754224467295 0 9066a49e50731881583ffca16c949171bb61578a1dfd497c54dafe773ab49488 +lavapipe-hlsl 100 float cultmath_integral_clamp_linear(float, float, float, float, float, float) ulp-bounded 256 0 0 84bf9c9a2126b3114a692507cc54f58d313afc33de8a1cac83969cc508433cbe +lavapipe-hlsl 101 float cultmath_integral_clamp_linear(float, float, float, float, float, float) ulp-bounded, lo above hi and infinite bounds 256 0 0 ff999094d7794aa525e0f9f9a067aa21408a59559aa546cace3b1bb4a8c7f96d +lavapipe-hlsl 102 float cultmath_integral_clamp_linear(float, float, float, float, float, float) ulp-bounded, zero-length spans and flat infinite clamps 256 0 0 c3cc48f4edcac6801b9223f12d289934916431bdfaea8f68af33a1b833ab9860 +lavapipe-hlsl 103 SpanNoise cultmath_span_fbm(SpanPath, SpanStage, int, float, float) ulp-bounded 3 1024946.5723514018 0 f6395b9f2609d914894c35b442719be3cc3e11d07c5f0bae5a8719651e60cd4e +lavapipe-hlsl 104 SpanNoise cultmath_span_ridged(SpanPath, SpanStage, int, float, float) ulp-bounded 7 948534.9108393334 0 2adfdc4e6c81ee0bc7bb7869c55207f5033b4176104bc36dce1528ae0a5fe39b +lavapipe-hlsl 105 vec4 cultmath_snoise_grad(vec3) ulp-bounded, coordinate bands 1e-4 to 1e2 119 423.1430718408491 0 a94c38d1baa651a6faa510920cbe9d1f9528c0adb863ba6e35d835588ad00a58 +lavapipe-hlsl 106 vec4 cultmath_snoise_grad(vec3) ulp-bounded, coordinate bands 1e2 to 4e6 73 13116827.1875 0 9ad0fd577b26aa717534c0693df97ee41bcded0768f442739b98f505e4a2a430 +lavapipe-hlsl 107 mat3 cultmath_snoise_hessian(vec3) ulp-bounded, coordinate bands 1e-4 to 1e2 122 980.7417469278579 0 0977fa6f446e4f916a9b938ce24ea32df6aa912dc991c182014d309dc0efb1cb +lavapipe-hlsl 108 mat3 cultmath_snoise_hessian(vec3) ulp-bounded, coordinate bands 1e2 to 4e6 51 164827710.09171063 0 c87f8a091b11770f7ffd8f01cf421f3fa139b58b7bcfbb6afa171ad5bca10c7b +lavapipe-hlsl 109 float cultmath_distance_to_segment(vec2, vec2, vec2) ulp-bounded 256 0 0 56d4972116081037d01476cb26a7981a35e9a949eb739df87e331fef9a25e424 +lavapipe-hlsl 110 vec2 cultmath_segment_closest(vec2, vec2, vec2) ulp-bounded 256 0 0 fb6b7e9038f9138584d8d0c427578088f06ae21d7510d20e899cac3c3833dbd9 +lavapipe-hlsl 111 float cultmath_distance_to_segment(vec3, vec3, vec3) ulp-bounded 226 1.60911149933558 0 ad66ebd8fb9d743d5c74491a7657f92d1cfa04b76ae65e090112e369881cf0ce +lavapipe-hlsl 112 vec3 cultmath_segment_closest(vec3, vec3, vec3) ulp-bounded 214 32 0 4cdb6d7124e502786a4c4b082da3b94b8bde1e2082d14efa8245cbbe6b10a978 +lavapipe-hlsl 113 vec4 cultmath_power_border_step(vec3, vec4, vec4, vec4) ulp-bounded 214 43 0 fdfdff73434a146489b002af5e80663658b2dd7b86105a7e65bdab755ab54a5e +lavapipe-hlsl 114 vec4 cultmath_power_score(vec3, vec4) ulp-bounded 207 1.4619722193127032 0 dc1aa639ae1dc44003a0f5d8c7c99b2e3d7f51b158c96b3c3bd7a9f7df6d927e +lavapipe-hlsl 115 vec4 cultmath_multiplicative_score(vec3, vec4) ulp-bounded 234 1.5529504197086745 0 ee1af26ac82489e8d363e7a6b6b59da7dacfb397d4bc9a723dd68607a69da41a +lavapipe-hlsl 116 CultSiteCells cultmath_site_cells_insert(CultSiteCells, vec4, int) ulp-bounded 256 0 0 bfad8b369011cfbf14644fec68ce65620694fcbf3cd3804f54953d55587313fc +lavapipe-hlsl 117 vec4 cultmath_site_cells_border(CultSiteCells) ulp-bounded 228 1.069496760346883 0 d7b478bef7e6f80902d0b5b255cb4fca30757ff6b9d25dac2030b037a8d342ce +lavapipe-hlsl 118 float cultmath_gabriel_margin(vec3, vec3, vec3) ulp-bounded 201 2 0 6a80fbef486de496a08b7c8e7f9f65e2cc0f5b9f93abe50c43e84ad88d1ed034 +lavapipe-hlsl 119 vec3 cultmath_lattice_site(vec2, float, float) ulp-bounded 256 0 0 84df739c336796638dcf0a99c328a4b8c150c25d80e02248d4b6d023dc13161f +lavapipe-hlsl 120 float cultmath_lattice_weight(float, float, float, float) ulp-bounded 231 2.0671110200639147 0 434cdf5603abc2942aa624b9d2e98d5f1231706c86180a80439bc8b72bdd066e +lavapipe-hlsl 121 float cultmath_lattice_distance(vec2, vec2, float, vec2, float) ulp-bounded 256 0 0 ba3fa3bdb4f5f5b2478a4ddfb2e08f2f425e997778a716884e43b13d6ed050b5 +lavapipe-hlsl 122 float cultmath_lattice_smooth_step(float, float, float, float) ulp-bounded 256 0 0 6cbeddde536b12e83873f2e5ac60d16bef22049d2a7dea61af0ff1e0d5b84740 +lavapipe-hlsl 123 vec4 cultmath_power_border(vec3, vec4[128], int) ulp-bounded 188 65.72121683891783 0 8427c2b99109a4f59ff745fdb87f261deb1cbae34ce99bc1ae05ebb7f9963b4d +lavapipe-hlsl 124 vec4 cultmath_weighted_lattice_cells(vec2, float, vec4[128], int, float, float, float, float, float, vec2, float) ulp-bounded 179 3 0 fd3b58c4e2ba8a7bf801a1e6cdff82468abcb368442bc98b2583fda9d2e6f823 diff --git a/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json b/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json new file mode 100644 index 00000000..f2ab1f19 --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/fixtures/glsl-parity.json @@ -0,0 +1,32775 @@ +{ + "generator": "GlslMirrorTests.GoldenFixtureMatchesCSharp (packages/cultmath/tests/CultMath.Tests); regenerate with CULTMATH_WRITE_GLSL=1", + "seed": 20261002, + "points": 256, + "encoding": "each case is 'arguments -> result', every scalar a float32 or 32-bit integer bit pattern in hex, vectors and structs flattened in field order", + "functions": [ + { + "glsl": "float cultmath_snoise(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "c22f3f7f c241f026 42086d0e -> 3dc3bd61", + "c1eeb062 4191e9f8 41d64d04 -> 3e64f99c", + "40a655e0 c2139bac c1a6578d -> bf33f2f0", + "c247c91e 4244cbbc c11bf440 -> bd94807e", + "422464e0 40031be0 c16a63b4 -> bf03f8bf", + "c20850d4 42014d2a 41214454 -> bf253813", + "4203a578 c1e6e5c0 c230f931 -> 3cb3484b", + "c204e06e 4209e452 4113c120 -> bd526702", + "417aabb0 41e621a8 4107cc30 -> be069d04", + "41ee9a64 4131eed0 c16156a0 -> 3f16616a", + "c20c7df7 4124d148 41e464c4 -> 3e265e07", + "42309e74 c0d5b1f8 c118c484 -> bdbe1f67", + "423fbf28 c1a46420 4134cc04 -> beaaad1a", + "c1b93680 41163fc4 c235e117 -> bf0d1bf5", + "401b4390 c1911e9f c21e8891 -> bc24123d", + "c19c6a0a c0263960 c1fcc4a4 -> bcc0935f", + "41081530 c21add9e 41e81abc -> be4f9154", + "400bae30 c15f8b3c 420fe162 -> be88fbc4", + "41ee68d4 421da0f0 c203d478 -> 3c936ddf", + "c1c90676 408fe720 421de426 -> bebdf28e", + "c1fd9913 41cafb14 3ffd1420 -> 3ef38d65", + "422d29e2 420cb4da c131a258 -> 3e205d5a", + "413b423c 423bc66c c2251802 -> 3e5b5f8e", + "42339834 c2000ffb 4037f3a0 -> bf26310c", + "42431e16 40c205b8 413bf4b8 -> bf304da7", + "c243181a 4165ad60 40273a10 -> 3dd06d33", + "bf90e4e0 c16c8038 c195172a -> bcdb1b7b", + "c11eaa88 c1e57032 be26ae00 -> bf18743d", + "40dce7d0 414b1c94 c1cdd1be -> 3ebd3149", + "422a5100 c20e95f6 407a8d00 -> 3cb43550", + "c1d4b951 41b884c4 41c7a21c -> bd8d01af", + "41ae9db4 c225ceb7 42081266 -> 3ce24194", + "402364a0 4112295c c0544290 -> bd354345", + "41abc00c 4195f4d8 3eeafe80 -> 3efe97fd", + "c2214a50 4159b460 422d325c -> 3f1850f1", + "c1bee3b6 4059ccd0 41efb8f0 -> be9d1ff1", + "c1ce379b 41e49908 c1c794d2 -> bcef933c", + "4166dfa0 41d007d8 c1f5c61d -> 3e3d4f85", + "4101beec 41e1bc34 4081ad10 -> 3f281a82", + "c23f70b2 c159cc60 c1dc2499 -> 3e768a7a", + "c20d7fb7 4198ff20 42025c64 -> bd8aa5e9", + "4099f970 41abe9b8 c0a292e8 -> 3d69b9d6", + "41df5c5c c1b8618a c01f0910 -> bb368569", + "41ddd590 bfa9cc80 c2331efe -> bdd74923", + "c2304836 41db31a8 4183cb0c -> 3e5e637a", + "41f73cdc c19cc0a5 40f6d678 -> 3dd3615a", + "40d137a8 c199e256 c222d5a8 -> 3d3af417", + "c0b62ac0 4192d99c c16389e8 -> bf0f7369", + "c1a9198b 410fadc4 423c3e78 -> 3e7e9da4", + "40b5a0d0 c21120e1 c19d599f -> be566e46", + "c1a04678 3ed37d80 c1da0522 -> bee19a4a", + "c1ce63b9 40dafde0 42467adc -> bea14422", + "418ef334 409bb418 4228783c -> 3e7a446e", + "bfcf68a0 bfe40120 c1bc64da -> 3f150f10", + "c18c65ec c0606960 c1a0ca32 -> 3efec306", + "c1f156d8 41080074 42426b16 -> 3d39d23c", + "403376c0 41d9a298 c00c1950 -> be16c8bd", + "42395ad2 c08cbd30 c23181ec -> bec4aeca", + "c2133ca4 41a28b44 c244ed3d -> 3cae78f7", + "c04c1230 c1c0681a c215f694 -> bf15377b", + "c0090d50 c1de0bdb c2130fe4 -> 3ed331dc", + "c20343c1 c00f1fc0 42410aa2 -> bdbb4889", + "4201e394 41fdd34c c1eb8dce -> 3e149ec6", + "4186d554 c213db2c 41cc5254 -> 3e321ce0", + "41798a50 c2275dc6 42022ede -> 3d1ad50c", + "42035cc6 c2189262 c1e1193b -> 3d9529f7", + "c2307d61 c223e15a c24614ac -> bf05d482", + "4241d360 c23c8351 c157c8b4 -> 3cce7384", + "420214c4 c182fc1e c234c15e -> 3e8e9010", + "c20380a5 c21bf538 42121a1a -> be848e89", + "42436818 c1e78a85 c1a8aadf -> 3ecf0ef4", + "41ecdda0 c245ea71 c1c03436 -> 3debbc6e", + "c2132289 c20aef35 4242eb66 -> 3e3971fe", + "c192df75 c14a3bfc 41d62cec -> bf234d0f", + "41e063fc 420fccc2 4162b1e0 -> be2cf959", + "41b22a84 c19a0f80 c148e780 -> 3ee88a9c", + "c1d76194 c19d32d2 41076010 -> 3ec66de4", + "41e73ec0 c1110f04 c20452b3 -> 3d22da8e", + "c217e1e8 bf190d00 c1f50539 -> bef2d374", + "41d5c494 c1756218 c20f73ed -> 3e62c125", + "422dcc00 417590e8 41a5bdbc -> 3e97d5a9", + "c17f8404 41900520 4227ea18 -> 3f4ed95a", + "c0581670 420ff3c4 c2297356 -> 3e1d42d8", + "40d247c8 419cfe9c 423a5cd2 -> bea571f0", + "c1d6f008 41c1e4b0 41ad5b4c -> 3dc3100e", + "c1d25644 c1ecbd3d c2045013 -> bf1148ef", + "41b2c2b4 c21f007e c23c764f -> 3ec43235", + "418af104 42303024 41f54860 -> 3dbea278", + "c1af7bd4 c1f06e8d 41f0fd00 -> 3ee84840", + "c21802bc 418ca170 3f8f3880 -> be2581c7", + "c22d977f c1581348 41f4d2a4 -> 3f143b1f", + "420a5f54 c13ceeec 41b01990 -> 3b575500", + "c22fc869 c0bf6810 c20035ce -> 3f3d8497", + "41b184c4 c1c2d2af c0a7dc28 -> 3e87a525", + "c1a18d16 41840c7c 412b9d20 -> 3efdab43", + "413decc8 40b8bb20 418593c8 -> bf0054c1", + "c09802c8 4219493a c1a80b2c -> bea2a0b0", + "c23e3289 c2367f12 c1ccb010 -> 3f3112f1", + "c21afd9e c1bf5904 41aa6824 -> bebdd8e1", + "42203aae c2302317 bff8c520 -> be1d86e6", + "c2189468 c175faac c1fcb9e7 -> bf1e0747", + "40d09738 bcfc4800 c186f7c0 -> be61a0b7", + "c2080c7f c1375d60 c15f47b0 -> 3e2e23fd", + "4246a0de c20162b9 41d31cc8 -> bf372c50", + "4243e5bc c2476107 420a68da -> bec8db55", + "410214dc c14703cc c1b3ac31 -> bdcf84e8", + "c1f08630 41818dc8 4162c558 -> bf26bdaa", + "c2124b66 4185fb38 41ea0efc -> be556ab9", + "c1df014c c23764f5 c18f0b80 -> bee4e6d0", + "40c60ac8 41bab9e4 c2178f38 -> 3eec0065", + "c245274b c2080317 c13f27ac -> bf230ddf", + "419f20b4 41255b28 42241554 -> bbe18975", + "c1bd3d23 41ba4d1c c205da3a -> bed2487a", + "c1b339ad c083c280 c2031144 -> 3e279977", + "c19ac85c c08d09a8 41a557e4 -> 3dd624a3", + "4026c060 c23a1844 c2371e0a -> 3def8300", + "c1230388 4047d2b0 421a1472 -> be0369ab", + "c0c7aea8 41a0fb8c c123a7ec -> be62f324", + "42078882 4241b700 418f0770 -> 3f02a2cb", + "c12d91c8 c179b1cc c085d498 -> bb99d007", + "c243f620 411cc8a0 41732ed8 -> beb86cad", + "c1d08568 4243c828 c2415fa2 -> 3da788fb", + "c13a9ec8 c1a75540 c122df40 -> be0be87f", + "422e5386 c191b872 416461f8 -> 3da00b8a", + "c21bfbde 422959be c1ed8199 -> bda65fc5", + "c043d660 420318c8 c1e6c25d -> be8915af", + "c225a474 419c26a8 c2454cb1 -> 3f489f5e", + "c1b0cf6c c2067dc5 c1ee4073 -> bdd8fe5d", + "c1d34754 40de7448 c08406e8 -> be4347b6", + "42412010 421007da 413e7f28 -> bebd5e17", + "c1d6dccb 4214c5e0 c131b3f8 -> bf632789", + "41a5c0b4 c1bb4d6d 42105588 -> bd3c7d7e", + "40023050 c22d217a c05695d0 -> 3ec3b678", + "41981728 c20eec48 41c324b8 -> bd4c1408", + "41666718 c0714680 c1e54d38 -> be80eca2", + "c1ce081a c189f3ec 41de480c -> 3dda780c", + "c1f4525d c150e864 c20961c8 -> 3dbbbb45", + "c051b190 c19b7ffc 416e00e0 -> 3f2c3f71", + "c09b6f18 41b8e32c c0d28090 -> 3e1034e0", + "c0a0a080 c2469f0a c1001984 -> 3f031311", + "40b909d0 c11f1f08 c0dd93c8 -> bf1a07b5", + "41df50cc 41a383d8 c0ad10c8 -> 3e309c9a", + "c1c4f507 c11b70e0 417c01d8 -> 3e39459c", + "c17c5954 42339f94 41d07484 -> 3d5dc230", + "41c41060 c126c024 40a7fcd8 -> bed28bbc", + "c1bdbe19 4157fa10 41a12d44 -> 3ca546f1", + "42438662 42456064 c1ce6f00 -> bebdf519", + "4190b638 41e6927c bf6f8380 -> beeb58a5", + "c06fe6e0 41d35964 40d42ef0 -> 3df90763", + "41c02594 c1c36388 405e7b30 -> bdcb29db", + "c0ead328 c22bc8eb c22e8270 -> becb5b60", + "c23562fc c21315a6 41c1b6f4 -> 3f23e147", + "c1957657 4211f160 41ce5358 -> 3ed499af", + "41d5f6fc 42437676 4229e240 -> 3f2ecabf", + "c217dc6e 420ced26 c0fecd68 -> 3dea1f49", + "c1267028 41b1b970 4223f00a -> 3e25100e", + "c2217f62 c1f91dad c2218cee -> 3eb9c032", + "41ba3294 c079a720 c243ff6d -> 3f4798d8", + "c200cee2 4216c61e 4133bbfc -> 3e9eaf39", + "42300b96 c192b25a 42301538 -> 3e5f5cb7", + "4217d808 3fae5680 c20d2a73 -> 3e14d2fa", + "c216e73e 42264410 42176880 -> bdf27620", + "419d7964 419ed658 c1bd34c4 -> be1d1c2c", + "41f84840 4233dc20 41d81a4c -> be10b521", + "42316cf8 c1deea37 c2461614 -> bc9bea4d", + "c1923382 40c1bc48 422e5c18 -> 3e84ca45", + "c22be462 c22d6263 c2373005 -> be1d3fcb", + "417a5750 416648b0 c22d22ee -> bdace4f1", + "c0c45af0 419b18a0 412f4620 -> beccadca", + "c2328304 42136be6 c1c3b78a -> 3e0f493a", + "c2141386 c14b1b04 409a5468 -> 3cb81859", + "41fe28e4 421b2376 c01fc3c0 -> be7f8af9", + "41de1968 42470ad0 422ea916 -> 3dc1cc72", + "4085eea0 419f4e88 c23e8e74 -> 3e661e77", + "416a29b0 c1ab4706 c1d0d5ec -> bed8d156", + "c18b3426 41e758a4 c1d04aae -> 3e17f846", + "c245e958 42104ae0 c192e2d7 -> be27faaa", + "418d25d0 4213eff8 c1c7ed94 -> bd45b2b6", + "421f4540 c1dd7b97 4213e088 -> 3d448b06", + "c2280786 41934840 c1de9080 -> 3db85c7b", + "c1b8d212 4164fed0 4203ff46 -> 3f050672", + "c244be9e 41906f4c 40f51708 -> be6e773a", + "c1de7ad1 c215a77b c1853122 -> 3ec665f6", + "403e6280 407d98b0 40c965d0 -> be52d108", + "4247b302 4035dca0 c15426a0 -> 3f30ba22", + "c240a192 c243f49a c1632948 -> bd1e9e17", + "42034808 c21af14b 4221dffe -> 3eaab8a1", + "c1502484 c23499ab c244defa -> 3eadb8c5", + "422f95a6 c0953368 3ea4a380 -> be87ed8a", + "c1a17d52 4227cf32 4183c280 -> be6a6a26", + "41288cec 419e2874 c195329f -> 3cc2f024", + "41abe2ac c1b5b247 c2319871 -> bf434d3f", + "c1f51b74 415d2430 41289360 -> 3c4db14a", + "4181e454 c21e5cab 4182a79c -> 3ee59531", + "4222733a c01cf810 c18f1d56 -> bd03bc6b", + "41cac3b8 418dbfcc c17db74c -> be3da819", + "421912de 4217e6d0 c1e59262 -> bf2789f9", + "3f955b60 c1c69f1b 40e4ab58 -> be5011f2", + "c192507a 421fa01a 41176584 -> be8ee03b", + "4200de40 c22c5444 c1da43db -> be33f83b", + "c22aa668 42298142 c1eaed5d -> 3dd35a8b", + "41870c5c 4229c2ec 4208c552 -> bd80259c", + "c1c873ed c1ac7ca9 c1c39226 -> 3cfe207b", + "c196e26c 4201ec28 c14cf694 -> be9d809f", + "41ca21ac c205aa22 c24494a0 -> 3e2577fc", + "c1cee7a3 c067c5b0 40e9aea8 -> 3daaebc9", + "41955f60 c1fb9868 41dcf35c -> 3dbe0a21", + "c20748e6 c107461c c238179d -> be07ba0d", + "c09aac70 c222879e c0ace1c0 -> 3e5f2fc2", + "41c1a28c c12399b4 c149e4f0 -> be9676e1", + "c0771d10 c14dafe8 40dcea80 -> bdf24cc3", + "c142e4f0 410e6244 c1ffbbd7 -> bf700ceb", + "c089ac18 c1d225e9 40a36ca0 -> 3eb80f2f", + "c0053fc0 3ecde880 c12b8718 -> 3eed151c", + "c225a4c0 40e420a0 c2320558 -> 3e425f48", + "42087474 41cf3408 c225a56c -> 3e5609fe", + "40c95050 c229b46c c0cf1c60 -> bddf812a", + "c23f5c75 c211d171 421977f0 -> 3f5929d9", + "c09cdcd8 4224a27e 3f54b180 -> b9d5e094", + "c2055f12 c1e24888 42044a8a -> bedd9fbe", + "c12679dc 3f3d3140 421aa818 -> beaf9a4c", + "4218b028 420c009c c0953ef0 -> bf3767c9", + "41f24a18 c148d7b8 40f5ea68 -> 3ddbc89d", + "4203494c 41e38364 c1dad2ce -> bf50e8ed", + "c23f37be c1e9f8a5 41912ff4 -> bd1fbf7e", + "c13a9230 c229a426 4209aa66 -> 3eee46a1", + "4241edba 4130d7f8 c1844344 -> 3dc93e47", + "c15fdb30 c20058c6 c18e6402 -> 3f4178ab", + "422f6a50 c0c0aae8 c1d33512 -> 3ec9729a", + "41944ac0 422ae260 418dec28 -> 3e1554d9", + "41899e9c c1a7ace4 c23feeb0 -> bd993dcd", + "41b04614 c226b585 4246a70c -> 3c3cd44f", + "3f1d8880 c1eca9d2 41b106f0 -> beea0162", + "41228a1c c238b097 c138c03c -> bdcd7eac", + "3f675180 41bbc17c c1a6ec3c -> be18a787", + "c1e8f44b 4247db4a 422b2ae2 -> 3deb7931", + "c1ee4015 c22cf70f 420646a4 -> 3c5f9f1c", + "418350c4 c1fe9997 412a96f8 -> 3ddbd2b8", + "bec9ea00 c239a7ab c18964ec -> bec175c3", + "40ced0c8 423145da c10fa820 -> 3ec9e0e7", + "c1e21aa9 c2190054 c0a8c268 -> be69f384", + "421fc73a c2098602 bf19f700 -> 3e7d371d", + "c1eaf56d c19eb58f c21646ce -> 3dc16373", + "4193e1dc 4216e552 4214b0c2 -> 3daefa73", + "c216d912 c13ad330 40e734a0 -> bf1cee17", + "42340e6c 420c6bec c0b1cc28 -> 3eeadd22", + "c23bbbe3 41b7c8e8 c0bf8530 -> bd953604", + "c1998ad6 bfd752c0 420fd96e -> 3eb6b020", + "4208af6e c244d914 c21c89a6 -> 3eb65277", + "c10a51bc c1dc9247 c2350dda -> 3e6f462d", + "4186b300 42309c08 c1bf3583 -> be260dfe", + "c1972500 c1394094 42284fbc -> bef0df4a", + "422ee83e 412f5834 40fb3600 -> 3f16fa11", + "41ede37c c246ff6f 419e6c20 -> be8961d3", + "41f2e360 3fdde0c0 c1f7b8c3 -> 3d118acb", + "423995e2 40840ba0 41eed000 -> bede1533" + ] + }, + { + "glsl": "float cultmath_snoise(vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c23a40d6 4092ee00 -> 3ecf1315", + "c1fc2730 42198710 -> bd00e19e", + "40595fc0 c1e53d38 -> be186764", + "423c069e 4223b816 -> 3f23739c", + "4156e904 410c3910 -> bebe7508", + "c230e835 c20cacee -> bb67bb5f", + "c13778d8 41ea3370 -> 3eba9904", + "c22911a4 c22938f4 -> 3e9f5ae5", + "c2416893 422e494a -> beaba2d8", + "41312e14 41f972d8 -> 3f4031e0", + "42479b5a 41725b60 -> 3f118d48", + "c242d9d3 c1ced440 -> bec4f21a", + "42125fba c1d55b43 -> bf1458c2", + "41b5c7c8 41c1b290 -> 3e98bad3", + "3ee47300 423a5664 -> 3f579d68", + "41876ba0 4217198c -> 3ef8dadf", + "c055a870 c197e34b -> beb1da3b", + "c1414e64 418eb238 -> 3e97fa39", + "421105be 41e3a4e4 -> 3ef4ae49", + "c113e7d0 c234fc26 -> 3f174bfd", + "c17e6478 c02083b0 -> 3ea4a4ba", + "c1aad508 c1709810 -> bf312920", + "40a5f208 c0df6288 -> bf19d55e", + "c10cc02c c1e8324e -> 3e4f6230", + "41411ed0 41b55548 -> 3e16b891", + "3daf3200 c1c44b56 -> be11ec0a", + "c16ad68c 41b7900c -> 3ea8dbb1", + "41ef994c c13b5eb8 -> 3e7e8521", + "40537930 42315688 -> 3f36d7fa", + "c240d8aa c19f78c5 -> 3f200ead", + "bfb05000 c1d9a553 -> be56e19f", + "c118433c 4186c7bc -> bea269de", + "42275874 c20001c2 -> baca3050", + "41915b30 c229ec90 -> bc7e25c3", + "c10a4abc c121ab00 -> bf1b4e85", + "c1e47d65 c1d67609 -> bf3ba9de", + "403433d0 40ca3d58 -> 3ec85501", + "c03ad740 401a3960 -> 3ecf425e", + "c157fa90 41829864 -> 3ecccb28", + "4197af3c c0cd9fa8 -> 3e5566f6", + "4200826a 3fdfa160 -> bd24f929", + "c2176e6d 41de3c80 -> 3f25752c", + "c0601350 c1089214 -> 3e434b48", + "401cf300 41bdbae8 -> bf00dd52", + "3f883680 42468414 -> 3f0be9f2", + "c20dde77 4227af36 -> 3f4195d7", + "41d55638 c21d3d91 -> 3c7097ef", + "40c432d0 c21ac675 -> bcd9e766", + "c22bf76d 413cc678 -> be93a671", + "c0dbf3c8 c14cfff4 -> be926a38", + "41c6cc2c c18286f8 -> bf0dba64", + "41ecf310 c1de9b16 -> 3f23e003", + "3f9d2ac0 c1b8dac4 -> bed1e9e5", + "41b52e2c 41e80568 -> bf21f444", + "c1c1150e c1b3addf -> bef6ed6c", + "c240d909 4213eb62 -> bf5dcf5a", + "c1c5022e 41036d2c -> 3d87f9ee", + "c003ecd0 423b8076 -> 3f2ffe30", + "c21d643c 414b43c0 -> 3e8b1660", + "c1ed35da 3ebe7d00 -> 3ec0a748", + "4178bc38 4231d024 -> bd056a43", + "40ce8de0 c1045b10 -> bf0c1e05", + "c1c51893 c1a3dbd1 -> 3e46996d", + "c05e6210 c0fbf988 -> 3f2a90e7", + "c2473eb0 c1639bfc -> bea66771", + "c09327f0 41c59f7c -> bf3be812", + "c1d66aac c191d0c9 -> 3dfb1150", + "4195cbe8 bfc74340 -> 3f2c9e6a", + "41b10708 421fdf1e -> bf679a28", + "c1bb962b c1f327a6 -> 3d8b9a0c", + "419688c8 41bb98f8 -> 3d67ed41", + "c0098050 c1d3cebb -> 3eb105cf", + "423f5d1e c1b393b3 -> 3f2d236c", + "41846098 c1fc605c -> 3e6cc5bf", + "414c04f0 41141794 -> beb85357", + "c2456239 c0b642e0 -> 3d9831b5", + "c108cdd4 422b048e -> be2458ee", + "41ad21e8 41f32be4 -> 3df830bf", + "41d9d590 c141bed4 -> 3eb8d354", + "423b3ebe c1e25182 -> 3ee49774", + "41f2f180 c19bd36e -> 3f396f40", + "41e682c4 42205c78 -> 3f4fba2c", + "42008e10 c1b7518e -> 3ce9a76d", + "415c82e0 422e674e -> 3e9c4579", + "421df556 4245fb4c -> 3df5320a", + "c1ca061c c1ea86b5 -> bf3c39a3", + "c15d8fec c245071a -> bebf97b8", + "41fc7130 42286292 -> be894a35", + "c0597d60 c1888dcc -> bf6f1644", + "c0c39f10 423f3d90 -> 3e4ae246", + "414f872c c1af6be6 -> bf5a368f", + "41eaff28 c1111250 -> 3e187bcf", + "c16e1318 c2439ca1 -> 3f05d625", + "c185f99a c19c73c7 -> bf29b3a8", + "41221a9c 42195002 -> bf1d43b6", + "41a9b63c c17c3320 -> 3f302997", + "422ca05e c234a254 -> bccd6744", + "c12c3248 c13b4798 -> be411a10", + "42328b1a 40f85c10 -> beaca107", + "c109d5b0 41a60bc8 -> bc4b6545", + "415c55bc 41b79200 -> 3ee032ce", + "c1a84b07 415417bc -> be813be1", + "c177dc34 41efc244 -> bf23b34f", + "c2276462 c114b16c -> 3ef6f9cc", + "c21b3409 41ec5cc4 -> 3eafad51", + "c181a470 c0b67290 -> 3ea8acb2", + "4230042c 4244012e -> be33cc5a", + "410bd5d4 4012eb20 -> 3e38e6af", + "3f92d6a0 c141e824 -> bcca46ae", + "409f09e8 41f85560 -> beff379d", + "422f5406 c1854ac8 -> bef6232a", + "c1843eb4 c2435aad -> be6bdad4", + "c1adbfa2 422209ba -> 3ee4dae7", + "c1b3c775 c195834d -> 3ecec9a7", + "413815e0 c0d7ac20 -> bf04b4ba", + "423dd778 421b5ca8 -> 3f365159", + "42262e86 41b90c74 -> bdd85d24", + "c17f5f78 422018ca -> 3f01f866", + "42446f90 c207865b -> bf288195", + "c22e4d87 40a4d0c8 -> bf488e4a", + "422bc7c0 422a2f8e -> bf24cfd7", + "c1f60bb4 41f4b08c -> bef0f54b", + "409111d8 c1b8ad20 -> 3f2fef6f", + "c11c43d4 42309f32 -> bdb7abbc", + "c0797c90 4213c4bc -> 3f2153a0", + "42149764 40d82920 -> 3f3c0210", + "c23cd5bb 41257f8c -> bf1d720c", + "41d763bc c19c8a59 -> 3ee81d7c", + "c1285e98 c1b195ad -> bbe505bf", + "c1706904 c0c00640 -> 3f3dbb4b", + "401c4dc0 41d6ba88 -> bedb1c02", + "41e99c5c 418f82f4 -> bf262d83", + "420056ea c0a17700 -> 3f17b0fa", + "40303290 c1e90419 -> bf1ecec2", + "416f6438 4195b954 -> 3f267c7d", + "404bf220 c16f8bc0 -> bf025a95", + "c1945905 42474724 -> 3e6ddd5c", + "421862f0 c242db87 -> 3e8cf21a", + "c20f9f8b 40388600 -> bf48b7fa", + "c057ce90 c2428941 -> befdfefc", + "3e8d5780 c18505d6 -> bdceedeb", + "420cd622 41c48178 -> bf13d89d", + "40c398c0 c114b6ac -> bf383e28", + "42103262 c19662bb -> 3e2632af", + "4238d45a c23992b2 -> 3e70e2aa", + "3f0c1c00 41aa74cc -> bf3d538b", + "41f927cc 4146cd04 -> 3ee49a39", + "c23d2ac3 c2079584 -> bf743bfe", + "c2129e9f 3fa71580 -> 3f165a80", + "4242015c c221aee5 -> bf14b7be", + "41c14c90 c1f51dd1 -> 3e803abf", + "c1a673b6 41db171c -> 3ed25651", + "c181f4cc 4007a550 -> 3f244144", + "c1c59cb5 c23c1ce0 -> 3f3e27a6", + "41b1f9e8 41cd1acc -> bf2cc582", + "c206a5a2 42125ffa -> 3f1cd2e7", + "41f96424 c1832200 -> 3ea41e15", + "422ee488 c1f77072 -> 3eb62be5", + "42268722 c235728f -> 3f22e8ce", + "c218b19d c109edb0 -> bf175de1", + "410e7af4 c1e396f6 -> 3dccf526", + "c1caacce 4135aefc -> 3ed93df5", + "c1fea78c 41ff0978 -> 3f1fc63b", + "407892b0 4198407c -> 3eefde77", + "423c71e8 41aff0e4 -> bf24a2d0", + "4217c318 414c9f28 -> beb4e35e", + "408c3828 c14f3810 -> 3c4c7c54", + "c1b65f13 c198acd0 -> 3e811444", + "c2374910 c228b56b -> 3ea4c230", + "c1131378 c238073d -> 3f4b6b51", + "c20a5f50 42044f42 -> 3ebbbc7b", + "410f46bc c1eb7217 -> bf13bd7a", + "421512ee 415f41d4 -> 3e18f640", + "42208854 c01db1a0 -> 3f148866", + "41959d70 42068d76 -> be4960d2", + "c1cc394c c2252c10 -> 3e871fa1", + "c12856dc 40e3e640 -> 3f058470", + "3f2c9780 40271c30 -> bd6c52ba", + "4232c77e 418eb4cc -> beacb0ec", + "41137d4c 3ff01c00 -> bf517658", + "4240f12a 40c88b40 -> 3f231185", + "c2308ec8 c246fb80 -> 3ed11cb1", + "4216ca4e 40632950 -> 3f337bd2", + "c18e4e12 c0bbff58 -> bf368e3f", + "c22e6177 414cebc4 -> 3eee0400", + "c20c6f29 42073c8c -> 3ee84c2d", + "415d4940 c228aa60 -> bf1870d9", + "c1c03839 41ce9ef4 -> bf0d7e6d", + "41498b58 c2379d5c -> bef8f48c", + "41c0b19c 4086de20 -> bf3795bc", + "4226fc66 c22e9bbb -> 3f17fb29", + "c246ae7b c2121b8e -> 3ec697fc", + "c01eae70 41e9de50 -> 3f48f065", + "c1d58500 423d0a3c -> 3ee1cbb3", + "42117f9e 41c4bd68 -> bf590c72", + "c15c7798 c15a8dd8 -> bee2db5d", + "bfb297e0 421bba42 -> 3ef3c3ca", + "c230f866 41123d24 -> 3f2fca18", + "41d9bc18 410b34b8 -> 3efe6978", + "c18906b2 c1823f4a -> bf2c8121", + "c1921103 c07f7c00 -> 3ec56140", + "c10de68c c2306c39 -> bf215d6b", + "4195f93c c11564cc -> be8a0d21", + "c0a3f2f8 c192d6ac -> bf010f75", + "c196ce38 41c6c5c4 -> 3f0ec591", + "42200eee 422264da -> be38b652", + "422f0196 c233fc71 -> bdac16c1", + "412211e4 42278ce6 -> 3f32fd53", + "40bdff20 42298cc4 -> 3f3e88f7", + "402ef670 c22624da -> 3e7cf7a1", + "c19e15d6 c170c514 -> 3df4b1c8", + "40f803b0 c1918055 -> be85acca", + "c1bb4e51 41e4689c -> bf2b4784", + "c16cbad0 41c73018 -> bea9b72b", + "c23fb1fa 4186a938 -> 3e8b1460", + "42427170 c2386a59 -> 3f47ce00", + "41a9cbfc c11a1e2c -> 3eaec4b6", + "c1dc3775 c0885ed0 -> bf2e98ec", + "417377a0 4231bdbe -> 3e885bcc", + "c0a8c160 c22c91b4 -> bec2d17d", + "c17a49e0 4226a8d6 -> 3f11cdbc", + "4180e2b0 c219e344 -> 3baa372b", + "420a4fc6 c08c1600 -> bf388e6c", + "c0ed2868 c0ccc270 -> 3f480896", + "c1a9946d c210854b -> bf28d264", + "c23b309c 420b5146 -> be85a38f", + "c2302239 c1ccbcff -> bf1a2a1d", + "c23a14ba 423b28c4 -> 3f3a2b5c", + "421907ca c222b979 -> 3ef316e0", + "41ea75e0 4220c852 -> bf2f7c3f", + "c2322a80 419fd328 -> 3f15c168", + "c1a372b8 41651120 -> 3b2c91af", + "41d1e2e4 42107946 -> 3e57580f", + "c1f50248 40589210 -> beff7102", + "42021f4a c20e6fac -> be909220", + "c1baa207 41380898 -> bee5bd3e", + "c015b0f0 c083f728 -> beb11933", + "41c0db3c c136cf08 -> 3f1cda6b", + "4196bac4 c071c460 -> beba750d", + "c030ff10 41f7b730 -> bf333c46", + "c1609a98 4226699a -> bf205072", + "c079dbe0 4218d350 -> 3f0a3f18", + "415a14dc c210dfd6 -> 3e9c1475", + "423fb7e0 c04bb830 -> 3f278e04", + "c151cb44 c1c288fd -> bd938f0b", + "40ef62e8 40bcbb08 -> 3ea5c06c", + "c20b7d33 4090fc10 -> 3e77ff64", + "c2426734 41660fd0 -> 3ef7e0bb", + "414188cc c240d2f0 -> 3f163b0c", + "c16b52d8 4241d680 -> be816f9c", + "c1be0338 421cd1d2 -> 3f01d8c5", + "413121a0 c20e5a8a -> bebcd718", + "4214cbb8 c104cb08 -> bdf89065", + "c14d4eac 412172b0 -> 3f11920c", + "3e99f180 416e7c20 -> 3e5dc77d", + "c1b0693d c0fedf88 -> be74dc4d" + ] + }, + { + "glsl": "vec4 cultmath_snoise_grad(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "414159e0 42415f5a 408777c0 -> bfc283b9 be845996 403c134a be8fa30e", + "c210941b c1d0f15a c10a32b4 -> 3f8879d3 3ece0782 bf9417e9 bebaf6fe", + "c24540ef 41474524 4218c166 -> c0107e33 3e84b23d 406156ad 3f0b904e", + "41b474bc c206040e 40db1e48 -> c016cdbe bec9f4a3 3fd31714 bd97fc37", + "40dd1fb8 41a62f38 c0680a60 -> bf828288 bff020bd 3f9b4203 be2d525b", + "422c856e c0b0bd88 c2211654 -> bfda3a71 401f2363 3e76bccd 3db9aee8", + "41d3d418 418860a4 c21c4790 -> 3b9b54a6 3f81f2e0 3f0d7a69 be140daf", + "bf9cce40 4096e998 c04f8780 -> c0932f88 be352dd4 40167f4e 3e3816a2", + "c19bbd9b c1928668 c243f868 -> 3fc18357 3fb40f7a bffa5af4 3ed5aaed", + "c1e0900d 41d4e7a8 c1429330 -> bfc158ef be6ec42b 40010051 3cfcb479", + "423a109a 41afdc50 423ef01e -> 3fe14a57 be713f9b beef1416 3dd80d87", + "c20a37b2 422f40e8 c204dc8c -> c082494a 3eec8b30 3f249f22 bed26a45", + "c246cf75 42162ce8 c1180d84 -> c058de17 bf0800da be546d56 3d8ac329", + "c1ea2240 c2439201 41b6b404 -> 3d52317f 3f0295b0 3f4f70c3 bd564a82", + "c21eeae5 406c4060 41b5abbc -> bf0901c3 bf96028e 3fa4a150 be05284b", + "c2371b61 40f00c00 c2064be4 -> bf2b1b45 3faeab20 3ebe6a94 be405e66", + "42354de4 c0bec8c0 c2098ba3 -> 3f2fba6b bf172ae3 3f75dfed bdfb6b3b", + "c116d724 4219b4fc 412e6c40 -> bfb8d25d 3f2c6b78 3fe6d2b8 be16ed51", + "c19728c2 c212c315 c0cbeed0 -> 40250a36 4000c857 bfa85cef 3eac45a4", + "c22a1890 42054ab2 4228ca88 -> 3e9ddf01 bf93cc09 3fd4e524 3db4dc74", + "c11a5114 41e60e2c 420f5d74 -> 3f174946 3fa8b399 bf92e39b 3e95810f", + "3eb31900 41d05388 c0af91b0 -> 3f7c81d1 bf85b173 401ec50e beed210e", + "4111cea8 c108915c 41d7ad68 -> bfbf7bf1 3ef1ae29 bf756b8c 3e949501", + "c1a34834 422b54e4 40dddb40 -> 40235187 3fcb8828 3ed54e6a 3ed87052", + "4199da18 40b7d958 417f0950 -> 3d58466a 3faebacd 4005fea3 3e858257", + "c13e8644 c137ee34 c243e6d2 -> 3e42b9dd 3f72d579 3ff98eee 3ed176ca", + "41c06350 c1bd86d9 41c17698 -> bc0ff503 3f2e4d68 bfdb4ae1 3c9075a7", + "420a537c c1bb2bd5 c18b6626 -> 3f7b76ff 4027fb29 3fe09427 3e48de70", + "c1de3251 40be3320 4206392c -> bef709cb bf9a1c46 4084aecc bd77fb34", + "c152abc0 42095cb0 41f407fc -> 3f9e219c c059ff5a bfa632a4 bef43ef9", + "41b9429c 422b491c c2371dcb -> bf8b7b56 40433d3b bf187932 3f210296", + "bfd9bce0 41f30648 c1dd3231 -> be343aae 400809d6 bfc72cb5 3eab8e8d", + "4213fc8e 411ebba4 41dd3480 -> 3e2b7294 3f309ea7 404f1e48 3f34fe70", + "c1ae6fd6 c09c7850 c207da2a -> 408217df bf55e8a7 402ed8cd be958d33", + "c1288a60 417bc7f8 3f9a40a0 -> bf6f4f5c bdbf8ba4 3ea55906 be16b50f", + "410ae3d4 41aaba54 c18a8c5c -> 3f305906 bfee6f69 bffce034 bcde502b", + "4233d8ba 422c0d30 41c670ec -> bf16828f bfc2f289 bf296ead 3d757478", + "c0ecb840 c1849472 40e070f8 -> bf3804f0 bf3550ef bf7efd4e bea09a41", + "c1ffe18b 40b8c200 4009d010 -> 3f484c46 3fe7800e bceda50c 3f413ab2", + "40510880 c1af014b c1ef393d -> 3ff4f8f3 3f7b07b6 c07b1101 3f14b5f2", + "412f5280 c1ddc2cc 40e3f7e0 -> 3edbcd7d 3e8cd07b be20f13f 3f6074e1", + "4239d2b8 40cdd4b8 c247f439 -> 400191e3 3f26632a bf23af81 be421986", + "402d9340 c1e88a19 41caf00c -> 3e73881e 402a1ba1 bf55a3d0 bd83dbd5", + "c0cd2498 3f8c3c40 41e4ab14 -> 3ff6282b bfab9663 3fc5afac bece0e18", + "c1d50226 c084b360 41f9973c -> beb2ba88 3eeed41f bd15acf3 3dfa3092", + "410255d8 c09c4f60 412de060 -> 3eae8566 bfd439b3 401e1069 3f1b61c2", + "41faf5cc 4158b78c 420a6938 -> c06fe526 3c77d226 bff6e217 3f14977d", + "3f5fd640 c1020eac 42254f7e -> 3eadff8c 3f5558c1 c02415c8 be5546d2", + "c231347a c19b8f54 41164d50 -> bf9edad8 be1e19ea 3f3c79e4 3d96ebc5", + "c032beb0 c19dba46 c1cb2a35 -> bef2d54a 3efdfd31 bf41aeae bd125578", + "41a193cc c18227f6 c191a0e2 -> 3fe43304 bfad607f 3c777eae be5c3d7d", + "40f1b700 4189e6ec c1d95b48 -> bfdd3e0f bf57165d 3e45b39a bebcddab", + "410e9b6c c0dfaa70 c222c89a -> 3dde43d8 bf8983dc 4048012f bf1cc4fa", + "3f98c7c0 c230203f 3ed11c00 -> 401a5ff0 3f46a1c1 bea5aba7 3e7a5165", + "40ea0e60 3fafa9c0 c10152c8 -> bf532996 bf4935c8 3e5954b0 3d46f9fe", + "4238e2ee c1f62bea 42164c32 -> c015d71d bf8b6378 3f0b1daf bf244bc4", + "41ce8504 411de714 c21d5dd4 -> 401ab373 40427d6e 4053def7 3e86bfd7", + "422524ea 41af2b44 416945e0 -> bf8b3068 3ecb8d8b 3f5d0f4a 3e319045", + "c1681758 c21faaba 41f3448c -> 3f27ca21 3f5a3319 3f88901e bd90ba75", + "417cbdf0 42230730 c1c0fb7c -> bfc982b5 bea41ee2 3f777a2a bf175517", + "c1161e34 c231fae2 42229816 -> 40669423 bfbcc43b bff0f466 3eb7f79a", + "3f434840 41bb2310 c2028a23 -> 3f02ee61 bf5c946e 3f000033 bc3c6771", + "c04da050 417d2038 41e4ec3c -> 3f0c1928 bfb1d1d6 badeed24 3e376d00", + "4105e508 4244ee9c c23f949e -> 40514768 3fee4ac2 3f91a293 beadde13", + "3fc81620 c19e96ad 40f27108 -> c018615c bf1ebcfa bbdb23f6 bdc9a83c", + "c17ce400 422e3d8e 4221ff06 -> 3fc043b9 c00652a3 3ef0a249 3f22cb31", + "bf16f3c0 c2221768 c21ab1b5 -> be1e1f1d bf90905f bfaf28d2 3f5777ef", + "41ae8e44 41ab2328 41a35234 -> 3fa2b9e1 c02935f0 bf86a238 be9de484", + "c2103746 41e749f8 413d5990 -> bedac8bc 3fb79194 3f8ded5b 3ea8c971", + "4189bc30 c1df8694 40e4f178 -> c0b13b97 bfdf75d3 bcc21274 bdf1ab56", + "c0f27f50 422c7760 40103820 -> 401da2a5 3fa4cb55 3e083317 3f1e4a46", + "4205b524 c21db235 c246255d -> 3f8d57e4 40953f97 c003698b 3ee03cfb", + "411c2884 c22dcb56 41dfd78c -> 3f23da60 3feff431 3f9635dd 3ee92d6e", + "c1cb951e bf10c380 405a1fe0 -> 40854c0e bf2999e7 405a5ae7 bd902530", + "c22429ec c20236c0 412a2ca0 -> 3f3a9b15 bff5bb46 bd742c53 be426c7a", + "c225c936 c1246f1c c1047c24 -> bffd2ac8 3fba2e4f bf215851 be7a279b", + "c22bfcaa c242ccd6 c205e848 -> 3fa805bd 3f190f2d bee663cc 3c32b823", + "421fa340 c20674b5 41fa3d30 -> 3fb8bf85 3f69f9bf 3fb74b93 3eb448aa", + "c20dcc09 419662a0 c17e31d4 -> 3feefb73 be760b44 bfa09912 3ed02814", + "c1ee2207 c152ee64 4231ec8c -> bf5ac1f9 3f8e5c3f bf718e8a bea8c4b3", + "40b0fbc0 41ec8fc8 c0c7a548 -> 400c7cc9 3eaca3ca bf83cf3b 3f09403f", + "c1e45020 c20836d4 c22f88c3 -> 3f155b19 3f7f688c 3e837ead 3db4af2d", + "be181f00 4191171c c1f33243 -> bfb1e348 bee4ab12 3ee99335 bcc9b722", + "40e39be8 41c379bc 421408e4 -> c0129945 bfa385f1 3eb0cdf6 3e903312", + "c215ecc1 c1c92280 4120ae98 -> 3f387a9f bee2edfd c04f1782 3e4bcc8c", + "40fd6268 414dc438 407c8530 -> 3f8b5645 403c8626 c06f15d6 bec0ba65", + "c220e20f c2326e10 c12cfcf8 -> 3e49b7d6 bf2fa2f0 3fb32f1e 3ba8f4b5", + "c1ef1527 41236b04 c1e9ece7 -> bf39afba bd9e8231 bf5117c9 3e270cc1", + "c115e624 4020cd70 41d5d828 -> 40098dca bf54b134 be2be60d bf3dbf28", + "41a7c9d4 41970258 c1038e18 -> bff26007 bfbcf90d c0006cc8 3ea257c0", + "4182ce30 c127936c 419de084 -> 3ef19329 404957ce bf28d945 3e892bf8", + "4205ff3a 41982bf0 419eea1c -> c07b8e83 3e71b89b 3feb920e be23fde4", + "c221695a 4215fe24 c241ffec -> bf46ad68 3e927925 400f90d8 3ea60fdd", + "40909f58 410b3ba0 41acb158 -> 404142ee bf943be6 4015c62f 3e4cf8b5", + "c1df0bce bde05000 c1b9136a -> 3f7075f8 404c61cb bf355f18 bf241576", + "c1a3e258 41db2004 42261c8a -> 401a1ab1 3e9e4d2b 3f498f65 3ea392fb", + "c1e61a1c 40d43d50 c2303fbc -> 3ffa1e37 bf2dfcc4 bf0c4c43 beca6d33", + "41f15670 c21e2ef4 c1949b13 -> c024821d c0348ebf bf175522 3eb9e398", + "40a95e58 c16957d0 c1f525bb -> be3d44a1 40a783b5 3f6129cc 3f0a60ef", + "c1d7fc6a 41f6a2f0 4156f158 -> bf739ff0 c03db8f4 3f444889 be980d0b", + "c1a4e9ad 41e705f0 42450a5e -> 3d96a193 bede4c17 3e79b65f 3dbf999d", + "41de94c8 42230c66 c171791c -> 400c4bed bf73d276 beb025c2 3e966348", + "c202e75e c1a7d7f5 40bac640 -> 3fbe908e c00d59b1 3d97eb87 be8dd7f6", + "4220b698 bfdd4b20 41cae5d4 -> 402e193b 403bab19 40145e1a 3e9d4751", + "401c8400 40a85030 c053cf80 -> c00d6511 3f0406eb bfa0e107 3ea6dca3", + "418cd02c 423ffb54 c21eb517 -> 3fd19adc bfbf0b56 bec2bf59 bed3e44c", + "422f9340 c21b885d 41c8f9ac -> bfa37f4b c0658cf0 3f87a9d0 bf0007f8", + "420ccf88 be870480 c217067d -> 3fd9cee2 c0182ec6 3f37c956 be917347", + "c1628f24 4210bbe2 c1a76bcd -> bd9ec9b4 c0271ded bf806815 3ebb0c17", + "c13b08d0 c1ae5923 c1832828 -> bf97398a bf9acb13 3fdef325 bee35ff2", + "3f01fb00 421294dc c22d5355 -> c02f31e5 bf99dcc5 bfd5f970 bdbfcebd", + "c13ef108 c1c6ee7c 41ee97e0 -> bf16d21f 3fb68ee7 3f880f1d 3e89bb7d", + "41b29c98 c0b68260 41120dcc -> 3f0991d7 402d79bb bfa3fc52 3f2966b6", + "4227d492 c21709ce bfd080a0 -> 3fed784f 3feabe67 3eb6c37f 3e5e96c9", + "c164f0f4 c197874c c2268dfc -> bfba921e 3e1a7e54 3e915d8e bdbd116f", + "c19b654c c1b23a11 40a63830 -> be8777ce bfb9af02 3db46577 3ea4e2cc", + "420aef6e 4216c3b6 c1494520 -> bff4feaa bf82d787 bf762bc2 bd97be00", + "c223ddc6 c1a722ed 419db3ac -> 3f70210d bfd79ec7 bf5ce4f2 bee15fe9", + "42193f80 c0ba22f8 c1a6de00 -> bcae8fa7 c0981f7b 400337e7 be581b10", + "421410dc c1004748 c235af7c -> bf38eea2 bf28f1e8 3e5420fb 3d8eb8dd", + "c230a860 41e7b5a8 c244bf69 -> bf8e742e 3f53f80b bd091802 3cacd62f", + "c1de2649 c1254554 413a032c -> 3f8e922d 3f08ee11 3f92994a 3f0df07b", + "41958c7c c20e7b7e c19efd7a -> 40659eef bfee266a be8c3cff bd2e1380", + "4186ee2c 423519c8 406cb9f0 -> bfb35807 3f8acc36 bfb14a90 be6f15fd", + "3f98eec0 c2404150 42438170 -> be7048c3 40263431 400e60fd 3f1cccbf", + "c1b9fe4a befa1d80 c1fa94c6 -> bf33da87 bfd3f1ec 3fe0ceff be4091fd", + "c2387880 c232f124 410763ac -> 3f9544ee 3f82a5e1 bfaa8afe 3eeb6446", + "41bf0628 4064e5e0 c117c120 -> 3e70a4ed bfab5c60 bbd75e06 be374825", + "4238bd34 c1086938 40f13298 -> bfc65ba7 3e324395 3f4d2cab be0d74d1", + "c150b4ac be7bc200 41f79a44 -> bf02591f 3f55cb71 bf51eacb 3f4ff1b5", + "3f2ebc00 420d3d70 c23ebe7a -> 3ed94950 3ff0bfd9 4006df48 bc4002bd", + "40919770 42107cf0 c185c946 -> bf45ed78 3f089f0d 3f6ada58 3da7fb52", + "c01c49c0 c2122918 42258dae -> 3f18286f c00c347a 400e7c5e 3e1396e3", + "c050ec80 413e1c70 c212a18a -> 3e74aea4 bd8f99c0 3f11f548 bd935070", + "c1c7747b c20087a8 4229a9ee -> 3f89cf03 bf900216 3f2a6393 be407b47", + "4206e318 40fad620 c1b6a04d -> 3fb5b484 bf79334e c048ba80 3f076475", + "41a6b0cc 4138fa90 4232afda -> 3f8ed92c bdcd7cf6 3ff2d297 be51a014", + "c21e249d 4204895c c15482b8 -> bf841e29 3f06a507 3e4caa07 bd8acfa5", + "c0788670 c19056e7 c1c4e710 -> 3cd40656 3fdfead4 3eb1905e 3e3c397c", + "4124c378 c1bfa0b0 4240c8f8 -> 3f3ea9f9 401813a8 bf5d2d82 3f09f7b1", + "c237a587 c192192c 416a0110 -> bfcebb53 3f5b9304 3f85ed97 3d5a4754", + "bf52f780 c20743da c22023a9 -> c0221ace 3fe97faf bee8675d 3ee17fb1", + "3fb14320 423a9488 c208be42 -> 3fd8e677 bffb507e bf8306ea 3ef9ee71", + "41799850 41e98af0 c15f2c88 -> 3f1b9192 bef1738f 3f2c5ca8 3e2a00e4", + "c1b5b024 40e4b240 c0d3c1f8 -> 3f55e43a bfed427d c0518a31 3eed406d", + "c09c2c60 bf9855e0 c164a7e8 -> 3fd50a46 4014e14d bdd49bd6 be20fd21", + "bff346c0 c21625e5 42068aee -> be0a1934 bf81618c be3f2534 3ca38f3d", + "c19d130f 4180f4dc 4218c59a -> 40646f24 3d3d355a 3f67f4e1 3dc31f63", + "42111d48 c11c81c8 c23f4bec -> c089257e bf6c67d6 3ddaace5 bf343571", + "417988d0 c22644ab 40854320 -> c00d2156 3fa63b43 3f11408e 3ee3fa65", + "c228711b 42150a86 4215a740 -> 401a5809 bfa1f183 bfd42d5c 3f0a14b8", + "422cc4b6 c0eb4a00 c19ed89d -> 3faae513 bf6bf90d 3fff4360 ba8d8790", + "bfa439a0 41cf2344 c24143cf -> c0726886 bf252abd 4013f97f 3e382fb3", + "4201cd98 c18d4e00 413318ec -> c07dff8b 3ef096a7 bffa2938 bee48c3f", + "c21a91e4 c2330dae 4201792e -> bf8352bd 3ec3e236 400d6b8e bf1f7860", + "4109ebf4 4204b376 c1c019d7 -> c01defd0 3f946655 bf5e0790 bdc07aea", + "422d5792 c24402db 4204973c -> 3ed4bb96 3feda904 bebdfe0e bd5c78c1", + "421eb672 c21734ec c211aa74 -> bfb4331d 40232753 bfbee30c 3f11ff1d", + "c20dc1f6 41bdc804 4179e3e8 -> 4031cee1 3f1e6914 c093f528 bd4a5482", + "41d37554 414e5b6c 41cfb934 -> 3fdd44f5 c00ace3c bfc08f03 bebe4b05", + "c228d7bd 420f27e4 4218d934 -> 4022d58d 4027d1db bf5b6c23 bdccb8c2", + "413a6568 40f6b978 4227baf2 -> 3e0028fa 401383b4 3f098e0a bf2c94af", + "bfae4c40 c17e7320 c20e0078 -> 3f17b522 400b4547 3e6d9ccd 3e960947", + "c2130bf1 42399c40 41b75760 -> bfae4657 c0140d5a 3f77e814 3efaf448", + "c17f98ac 417a60d0 41f10238 -> 3e6be0e2 402e3727 3f95e312 3e6d89d4", + "c1dc7699 c1f7ef46 412e2078 -> c03687b6 bea297c4 be44197a bcee6ac3", + "c230b394 c1b2bb6c 40e160c8 -> bf463fcb bfb06e27 c01c8d55 3f15b483", + "41d18200 41b21548 c22a41d0 -> bfb80001 c010c997 3fc5eb99 be94ba54", + "41a82254 c1fe4f1b 41c87ee4 -> bfa6ed64 c0818a1f 3faa639b bea40371", + "41bea368 41e50d58 41976580 -> 3f988779 bfef83f0 3f5a2684 be612566", + "41686ae0 41b24714 c2140539 -> 401600ef 3fccd158 bfc74a6b bec49159", + "c1c240cf 41c54aa8 c05cee50 -> 3f475fd3 401083ed 404339fa 3eef74bc", + "41b7da10 be959f00 c01e4dd0 -> be13c854 bf61f81b 3e775b3b 3e1e20a1", + "4221be3c c22012a2 bf6bf0c0 -> 3ee970ce bfd01465 bfba3bc5 be50922c", + "c21a0c73 41f0c704 c2359f1c -> bea776fe 3c0c88f4 3e85a75a be32dfd6", + "c21f1474 40b4e4f0 c05cd200 -> 3f2e09cd c02786a5 bf22626c 3ece3eee", + "c184571e 42287956 4096dd28 -> bf6c398e 3f1d23a7 bdda2e92 be11eff4", + "c2350f24 41a4dc7c c16c2dc0 -> bf74bc16 bfb1db27 3cd5969c bce7a58f", + "c1f89eff c193317a c211e2bf -> bfa0287b c0339645 bd55d7c2 bcf3e3bf", + "41f63608 42228830 c128050c -> c066fd26 bf228785 bfb64f83 bef9024c", + "c2048480 41c677d8 40aee468 -> 3d064c84 3f931331 c000d264 bef1b5cb", + "c08d99b8 bfa4d520 c1cf0e90 -> 3f433248 bee215da bf30ea69 be15e77a", + "411ec3a0 c226c5c4 4223f2e0 -> 400d76b8 3f4defe0 bf6d082f bdb7fe0a", + "c1836000 bf0a1580 419a6734 -> 3f4a8479 c02542e7 3f6b5dfa 3eb4388d", + "c2129304 c20a71cf c2014b14 -> beaf8e77 bfac9147 beb6d833 bf59d902", + "c2282424 416b35c8 4228a722 -> 3fd63f53 3e1a4690 bfe787bd 3eca8b19", + "c23ca2b4 412c9678 4148ef54 -> c03abc3d 3f4a6506 bf2861db be7fd8fd", + "c1abe6dc c11a0af8 42120d54 -> c007c724 bd887b1e 402713d5 beacdfd4", + "c20f28e6 411ca76c c2414ab4 -> c09831c3 3f50bc2b bedc3060 3bfb86d7", + "41de0c70 c22cd0e8 c0de0f80 -> c01b1c82 c011e19c bfbec372 3e8439ef", + "c187d84a 4228d206 41113248 -> bfd1e61e c005a113 c034d69e 3dd061fc", + "c227e39a 41bc8578 c16d3a30 -> 3fc6237b c0785ab6 beb8cba2 3edc0bca", + "422e73b0 417e9b10 c194ebad -> bf96ff03 40936de7 bf9fc6ab be2c14bb", + "41f3d058 3e9d5180 c029d9e0 -> c05cfcf4 bf2ab396 3fa4a91f bda5a7b3", + "40b1fff8 42478470 c0eaf2a0 -> bd45ef52 3f1eefd2 c01f8bf5 bed52b76", + "420da80a 422583e0 40a70068 -> bfbd942c 3fd1bbe3 bf4ba357 be92b03d", + "c201c05c c21c2b5c 418733a4 -> 3e834769 3d25edbb be90233d bd4b59f3", + "c1e513c3 41df7b70 c1a13adc -> c05425c8 bec9f9a9 3f2c74cc bb0b65da", + "41d785d0 42196eee c1790560 -> bf309829 3f669d40 3f3d2c30 3ecb081c", + "41979e6c c19514a3 421baf7c -> 3deaf415 c05a8a48 3fc9e67d 3f16e51f", + "c1dc792a 4200aab0 c241f4dc -> bf2ea52a c0152911 3fc6835a bf0018eb", + "c004b310 c245c3db 40e82d28 -> 3f525312 3fa1ef90 c030695a 3ca519ae", + "c21f18f7 c232af6a c102d228 -> c007b7fd c021c5cb 3f3db6ea 3e99c1f9", + "42020378 c20e97d4 424326ae -> 3f6b78a7 3fe44f18 3f74c6be 3e8fd014", + "412c73e0 c1dd15c1 c21e1505 -> 3fe57c38 bfffa749 bfa81379 bef0f96c", + "c20b268e 41b79924 c1181cb8 -> 3f757848 bfcbf14f 3e91cfcb be2c879b", + "c0c4a2b0 c1a9a1de 41934bf4 -> 3fbe57a4 3f052a41 bfa5368e 3ec2997d", + "c062ac00 41231a4c 42375a74 -> 3c367fab bfe88ccd 3f2b96fe bdc31a50", + "41d14880 c2196244 c20eebb2 -> bea1570e c032c2cd 3f18c3db bd6e1fb4", + "c1a62c01 c1974d04 420cd3cc -> 3f70f552 3fe13609 3f73d0b5 3f4cff68", + "c2450d34 c1cab70e c1773ba8 -> 4018e354 bd78a440 3e03a9c5 3cb119b3", + "c0f12a90 41009304 41911fe4 -> bf5b58dc bf4640b5 bfc688cf 3ea7a478", + "c0854610 c22974d0 4245484c -> 3e3077e9 3f31e415 c01e0c93 3d0c5036", + "420d9c06 41c98200 4210334c -> c01e9b27 c00aecd6 bfe178f1 3e834164", + "c2126b6a c16f0f50 423a6c78 -> bfd1dda5 3f90688e bf74eec7 be2fa65e", + "4190e648 41296498 40b244c8 -> 4019d62f 3ea83805 bf484717 3d7ad9d8", + "c1f510d2 413ba5d8 c20a5da4 -> c011b409 3f469f11 c03b340f bef15a1e", + "422fc5d6 c1c738e6 c23db963 -> 4008589d 3f928d65 bf84bf7c bc917e33", + "c1ebecfd 41cfdc58 c1e037c5 -> bf56e7d9 3f9ef23e 400db2c9 be11c87e", + "c2314f50 41ae2120 421b9e68 -> bec21f10 402ba7f7 bfce4123 3f03dbfb", + "c0e07550 41f7fa10 41c1ee2c -> 3fa7688a 403a4f30 3e57b11d 3ec3aab5", + "40d3bd48 41fe2158 421ec3b4 -> 3f8140ed bfe830f5 c00a0f6c bf01ec49", + "4163d668 c1fd7b6a 41654178 -> 4029e64e bffa80e9 3ea36a47 bedd8786", + "c0f527b8 419b0468 41750588 -> 3d308fcc 3f908c35 c0188609 3a154349", + "c10d3de8 41073e88 4066e110 -> 3f1d114e bd0abdfe bd65f7de 3d3b7008", + "420172b0 c1877eae c1c6eb30 -> 3febd92c 403c361c 3fdd8095 bdf37743", + "4244edfc c227cee4 3f8892e0 -> 40110031 402be3f2 3f9d7aba bf10410d", + "410b2edc c2208d97 419ae014 -> 3f2751b9 bcd409df 3fd00bbc 3e02b423", + "419e62e4 c22cd30a 424640ea -> 3f9033cf 3f5e12b2 400c80c0 bd940c94", + "c1902b10 c1e05da8 42003696 -> 3fe9f31e bff392a5 be9dbe8e 3e97fd56", + "c07542c0 c11d65c8 c162157c -> 40361a04 bee37bff bc8c13a7 be2cae62", + "c21e561c c0f2aa80 4230c3f8 -> 3ff1e95f 3ff9f80d 3fc893ea bf04a2c5", + "c218c3cc 40d8e770 4052b7f0 -> 3e7d152a becf5933 3e217f54 be528e2d", + "c22c573b c2388276 c0f74928 -> c0083499 bfc08315 3ea66f58 beef5f06", + "4224f83a 41d8391c 42296742 -> bfa0be54 c03a8416 bfd76290 3b4dba24", + "3dc1f200 40315510 418527d4 -> 40312d8b bf0d0627 be8840d2 be6f6e0a", + "bf84ee80 c13da4b8 c0e293f8 -> bfe9a2f0 c00f5e87 bf376603 3f2bf86f", + "423b59b4 c22e3d4b 415b7dcc -> bd653f3d bfc313d5 3f0ec0f2 bd20ee18", + "c14298b8 420925a0 41a91540 -> 3fc24ca8 be5ee1a1 bf4c0c80 bcf439b0", + "c23478f1 42134638 41c7c76c -> c004cdb2 bfd8abbe bfc79eb6 3eecc8a9", + "422082c8 c18de9c0 4239711e -> 4087fc41 be9a8f3b 3f75ae02 bd578ea4", + "420119ca 4238af36 c1a648b2 -> bf6f10c7 bf032662 3f58764a 3f13db72", + "c1a4727c c199f2bb c207db0e -> bf92fb18 bf0d338c 3fc20459 be189e53", + "4116a864 41a46cf8 41d24778 -> 40537644 bf8689fe 3f1b924c be83d5e0", + "41aebdd4 42294536 c2374c6e -> 3f48c164 3f5d1a92 bf1acd52 3cb6ca3f", + "c224d244 418ba6f8 c189544a -> 3f01a79e 4025e094 be855fca 3f231e68", + "41d81190 c1f25f11 4080bd30 -> be4671b2 3e505614 c0027cb9 3f3d3887", + "c188a5fe 420411ec 42073a5a -> 3cb7dc4d bf3843cc 3f00b5de 3e0ce4f1", + "c12ddbb0 bf2b7880 c1823850 -> bfe66676 bfb425d6 4099ea3e be2f28b9", + "41b13658 41b4a024 41021440 -> bfa049a6 bf457a08 3f91f402 3dd6eeb9", + "c1d78d50 c22c4adb 419fad6c -> be8e2e35 403de25d bfc61038 3e4b02cb", + "41e28f94 c204da03 41ace4d4 -> bef1b49d 3ef66226 40055b7e be927dc1", + "c082d220 c2242190 41f6dab0 -> bfbc80c3 c0302d91 3ea48a34 bf507c23", + "41522e64 c1eacb91 c1dfe2a4 -> 3fefc663 bf02049f 3d6e40f4 be9cfa75", + "3f1bbe00 421e2e74 418cc0ac -> c082200e bfb1d733 3f35c55f 3f1530ab", + "4185138c c1c80a66 c20f8281 -> 3be36ee6 3fcb2d90 3f7b2eef be6b7425" + ] + }, + { + "glsl": "vec4 cultmath_fbm_grad(vec3, int, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "4118af88 c1a7a7d3 c204addd 00000004 40000000 3f000000 -> 40719fd8 c07c5fe4 40cdafd8 3f2fa97f", + "c13b2cec c1b10373 4188eb80 00000004 40000000 3f000000 -> c01b8792 bcca1a40 3fd8c305 bd01dff0", + "c1e867dd 40e6ae40 bf41b2c0 00000004 40000000 3f000000 -> 40859093 3eb645e8 4031bcaf 3ea94661", + "c215c93b c0db7a50 c04a2e90 00000004 40000000 3f000000 -> bfad7980 be6570c0 3fbfbd6c bed152fa", + "4235f7ce 40e95cb0 4102da44 00000004 40000000 3f000000 -> c0b970ba 3ff679c7 bed54bba be34e22b", + "40fcff18 c15a3cf8 415a055c 00000004 40000000 3f000000 -> 408001b9 c054681a 4098ddce bdc95e37", + "c22eb2fa 422e1720 41cc3e74 00000004 40000000 3f000000 -> 3f4a6a40 40eb7d01 40958799 bf098676", + "c18b7db0 414e2000 4107d430 00000004 40000000 3f000000 -> c015b428 3f3a147f be15d2b4 bf60e2f6", + "3ffd1060 c21082d2 42443640 00000004 40000000 3f000000 -> c02316e0 3f9445ee c088cfa2 bde5275e", + "c18fee12 42013e08 422de378 00000004 40000000 3f000000 -> c0146f0b 402fff82 bf4e169a 3de5674c", + "c20725fc 41b3fe9c c1cd515d 00000004 40000000 3f000000 -> 401d5ef0 c0950cf2 c0b3a0ff 3e061897", + "c1f3334c c21590b5 c0cee030 00000004 40000000 3f000000 -> 40575831 3f977e8d 3f319cc0 bf4be29d", + "c10b344c 420b0494 41e86dbc 00000004 40000000 3f000000 -> 3fad611c 3f0cc06c 3f9f42e2 3efe2f4d", + "c23c9f0a 40ebddc0 411940d8 00000004 40000000 3f000000 -> 3f5aa199 404a04d3 3faa1910 bd181aaa", + "c1dd0d96 c1852212 417d36f0 00000004 40000000 3f000000 -> 3f362bba c08e754b 40447734 3f54611d", + "c17fbefc 418d2798 4155ba88 00000004 40000000 3f000000 -> 4049ff74 bf7e64e8 3ffa7bfa bee55145", + "415d6078 422acf16 404bdb20 00000004 40000000 3f000000 -> bef92570 3e8f33e8 c028dc0e bd67db19", + "c2382102 4124f300 c19438a7 00000004 40000000 3f000000 -> c0cba0f4 4058eaea 3f8cf5bb be9ab9f0", + "c13686e8 c1b82a8d 4181482c 00000004 40000000 3f000000 -> 3ffc488a bff26e29 c0c807bc be3c13ba", + "41057454 42114c42 c20ffee7 00000004 40000000 3f000000 -> c05a9513 405bc594 c0c71330 bf179132", + "41907f00 421bc31a 41c72f7c 00000004 40000000 3f000000 -> c0198ed4 bf4fe6b4 3f03b184 3ee43c08", + "40b8ade0 42395cc0 41a522d0 00000004 40000000 3f000000 -> c0191031 bfbd0bfa c022aec8 3eb86305", + "c1dbf475 41cf22e8 c0aa1db0 00000004 40000000 3f000000 -> 3f824dbc bfab9a6e 3ef38818 3e112a02", + "c20d6d69 c205930b 3fcd85e0 00000004 40000000 3f000000 -> c0ccf921 befcdf1c 3fe48bf5 bfa0173d", + "420a4a7a c23a13ef c15d925c 00000004 40000000 3f000000 -> c0a64506 c05d8974 3f542ee4 3e7cb472", + "c20830fc c21f380d c1a3cdf0 00000004 40000000 3f000000 -> 40d96645 c083e0a4 c00a384b 3ee43020", + "422aa752 c20027be c07169e0 00000004 40000000 3f000000 -> bf8db6a2 c00a9202 bf4bd594 3e8c0d4a", + "c164e18c 419161b8 421e6ef2 00000004 40000000 3f000000 -> 4045d2d2 4020c085 3f91bbea bf27128c", + "c11b68e8 c21704fa c2173d71 00000004 40000000 3f000000 -> c0b56c28 3f0cc1ba 4006c15f befe5ee4", + "422b73a4 41f81028 420e8492 00000004 40000000 3f000000 -> bf5efd39 c088c3ed c09604bc 3c8844c8", + "41daffc8 4203d5d8 4241b850 00000004 40000000 3f000000 -> bfaeb305 40389ec0 bee2f008 bf15cfc6", + "4170d710 c1737a2c 4193713c 00000004 40000000 3f000000 -> 3f1c63f0 4088ed85 c10a832a 3eabd2c1", + "420ab876 4184c6f0 c14fb724 00000004 40000000 3f000000 -> 3ff916f8 bf217280 bfc3449c be7284eb", + "4234bc54 c219f585 42270256 00000004 40000000 3f000000 -> 4015fb41 3f8d22dd bf59552f bdb58c62", + "c1fa9b4f bf4e9e80 41d0c444 00000004 40000000 3f000000 -> c00a4e41 3fa1e8ce 400c3336 bf6f4af1", + "c241ae7d c1f4d6f7 40da8578 00000004 40000000 3f000000 -> c074a8c0 bf9f1082 40aec20b 3e1c7918", + "42354844 c1dae17d c204dd3a 00000004 40000000 3f000000 -> 40104aac c058e102 bfcf37b1 bc3268c5", + "c155d3c4 417ad710 4192e800 00000004 40000000 3f000000 -> 403a735f 410fd4ce 3f8004d2 3d50b7b5", + "418e2f6c c18d103a c1e9db81 00000004 40000000 3f000000 -> c031fc7f 3de98220 bffca1b8 3ed3ed1e", + "420d28cc c20a100a 420861ba 00000004 40000000 3f000000 -> bf531198 406c96dd 40715ee6 bf20476d", + "41073b5c c1a2dbc0 42338960 00000004 40000000 3f000000 -> c02b8f27 3ffcd0a1 3fc9b653 3e835d9a", + "4110dee4 c14bb530 c182d1c6 00000004 40000000 3f000000 -> bf4124fe 3f41071a c07329bd bea20819", + "404b3de0 c1f3d697 41959538 00000004 40000000 3f000000 -> 3f985ae2 c028883f bfe02eff 3b34e866", + "418dc594 c195d2e4 c0ccdc28 00000004 40000000 3f000000 -> bd1f17f0 3f88da62 40b16212 3e9ca913", + "422a06d2 423deafc c22e3239 00000004 40000000 3f000000 -> 4121709c c0eeac6c 4073671a beb4dfd8", + "408f3858 c203eabb c1f82957 00000004 40000000 3f000000 -> bf97e4e3 4093030d 3fe68ad0 bed459b5", + "c211f32f c134aef0 422b6680 00000004 40000000 3f000000 -> c06487b8 3fdde56d bfa77694 bd428a4c", + "40ab8f00 423e2b62 4105e34c 00000004 40000000 3f000000 -> bf148e84 c079808f bf8a8428 3e947796", + "4196c398 c1142cac c202dfec 00000004 40000000 3f000000 -> be05e115 40458a24 bf635592 3e226587", + "c19f775d 423d1e0e c23e566f 00000004 40000000 3f000000 -> 40311fcc bdbbfd90 bff9b814 3d447710", + "c0159a20 42458fa8 3f8e7040 00000004 40000000 3f000000 -> 3f8707c5 403c40fc bf4bc9b4 bddd2048", + "403b07d0 c1544a0c 41fef0b4 00000004 40000000 3f000000 -> bf80aab8 40b921c2 c010f34d bd798ac6", + "423b78f6 4119ea7c c2184d2d 00000004 40000000 3f000000 -> c0a59b02 c0ef19bc 40f0cbd8 3ca26a67", + "c0f1a7e0 bfcc4b60 42477fd0 00000004 40000000 3f000000 -> becf2ea8 40aba947 40061982 be03aca2", + "42188614 c1b3350f 422578b4 00000004 40000000 3f000000 -> c0248df3 3f858698 407fc064 bd267fcd", + "41b97c94 c0bbde10 41919590 00000004 40000000 3f000000 -> 401bf2ed be8c5c28 40ce6776 3db6ee9b", + "413e98e0 c212cf55 c20a9d62 00000004 40000000 3f000000 -> 3c594580 bfab178a 3f97391c be0d5cdc", + "c240d915 41ae37f8 41d63764 00000004 40000000 3f000000 -> 40a66ca2 3fb56885 c0e68c9c 3f0fa1e5", + "4224fb3a c23ba309 c18f3282 00000004 40000000 3f000000 -> c02a3e25 bf83ed6a 40e192f4 3f448b2c", + "c157bdc4 4220d5ec 423a1de0 00000004 40000000 3f000000 -> 3f12f798 3ff2757a beec9920 3eb5740d", + "c20688f6 c1d720e7 c1de12b5 00000004 40000000 3f000000 -> c00550d9 bfc4e2e8 3e302f80 be11fe5f", + "41824214 c1ef8727 c190f237 00000004 40000000 3f000000 -> 3f1208ae 40bc4f34 c0136b24 be0f09b9", + "4229f0fa c126a6b0 412bf604 00000004 40000000 3f000000 -> 3fe53206 c06c7c11 40512de1 bd819439", + "c1cb5527 40f370a8 40ecd528 00000004 40000000 3f000000 -> c05a007e bfe6997f c01ab8eb bee9ecdb", + "c22bc77e 41a88398 4221369e 00000004 40000000 3f000000 -> 400c2720 40709041 c0831561 3eb2edea", + "422be6b2 4189d79c 419f8bd0 00000004 40000000 3f000000 -> 3fea4c43 bff08da0 c0126644 bd97f793", + "4188003c 4236a380 423a7096 00000004 40000000 3f000000 -> c097df29 bd918c20 3ddd7cb0 3e80f152", + "bf6aacc0 41913c34 4207ed64 00000004 40000000 3f000000 -> c0f11604 c008214a bfc3aac2 bedf0ed1", + "421446f2 c0840460 c1b318a5 00000004 40000000 3f000000 -> bfd5acf0 3f5386f8 404a6ee5 3e8ebf6f", + "41c2afa0 413ad50c c182def4 00000004 40000000 3f000000 -> c0f0d5d1 be9a5674 40259f0c bf50948b", + "be6e6500 4125a1a4 419b4964 00000004 40000000 3f000000 -> 408a4fcb c0330540 3fdbc6ac bf0b3479", + "c20a6b0c c1bf580a c1c5a3cf 00000004 40000000 3f000000 -> 4063aacf 406c45ee 3fb4ff38 be30a380", + "41dd1258 c1e135ef c229d6f4 00000004 40000000 3f000000 -> 40aa19e7 40252554 406e4605 bef8862b", + "4117c738 41f59aa4 c235d216 00000004 40000000 3f000000 -> 40792732 c093c2de bde5ac90 bcbc9178", + "c22a32ba c14abcd0 40b614b0 00000004 40000000 3f000000 -> bcaa7340 3e7d263c c0116fe7 3ee9bc36", + "40fe3fc8 4232ee6a c24525d1 00000004 40000000 3f000000 -> 3ed5dba0 40a0e22a bfaea6bc 3e79646d", + "4211e514 42411488 c1623b58 00000004 40000000 3f000000 -> bdebd870 40036744 bff748ea 3ed3cd9b", + "4142835c 419c20e0 4232326e 00000004 40000000 3f000000 -> bf49dbe0 c0f16006 403ba02d beb48569", + "4247ad48 418a4378 409e8b98 00000004 40000000 3f000000 -> c09c8565 403f1cfc 3f47585a 3eb1fad0", + "c13bdafc 41e9b430 41c179f0 00000004 40000000 3f000000 -> 408c5074 bff2ab84 3fe5d98d 3f399d55", + "c236ecc8 c1fecdac 41df4220 00000004 40000000 3f000000 -> 40a2a0b9 bfd0031b 3f5ee21d 3da40a50", + "c1b72609 41c687a0 423d05ac 00000004 40000000 3f000000 -> 401ffa1b 3ff68ae8 40076b12 bc565c2d", + "4217f5f4 4226a38e c0a09170 00000004 40000000 3f000000 -> bfa1aba6 bfb0626a 3ffafcc5 bf70bf4b", + "41702210 c20aa279 c093c9d8 00000004 40000000 3f000000 -> c08a7d8a 3fc712fc 3f957e9e bed44ebc", + "41467370 c229f1b1 c20c29d2 00000004 40000000 3f000000 -> 4062f490 40926930 40464493 3da4bef8", + "422842ae c105dfe0 c1996566 00000004 40000000 3f000000 -> 40641dfe c0eac1d5 3f9309d4 3c9df665", + "c1adaa63 c1a7020c 3f922120 00000004 40000000 3f000000 -> c065905e 3ffcf8f8 405acb78 3ecc9fbf", + "c1b8cd04 421772ba 415682f0 00000004 40000000 3f000000 -> c0181362 c0222401 c02217b9 bedf4af3", + "423f1f5c 421670c4 422357f8 00000004 40000000 3f000000 -> 4040179a 407cbe5f 40850bf7 be50a995", + "41c6e488 c20a1855 410cc8f8 00000004 40000000 3f000000 -> bffa6904 3f80ff5d bf286047 be83b6f7", + "41a2b94c c12a0058 c0eba878 00000004 40000000 3f000000 -> 3e4b1a20 3faf29e9 404b1e70 bdc697bc", + "c18527da 40a6f4b8 4148d0a0 00000004 40000000 3f000000 -> 3e923cdc 3f5e3d25 3f3bc88c 3ea96d78", + "c1bae64d 41f2c094 414833ec 00000004 40000000 3f000000 -> c049d728 c094acf9 3cef2c80 3d9718b8", + "4106f3a8 419fa40c c23bb524 00000004 40000000 3f000000 -> 40483521 bfe30e30 4080fd1b 3ebba8b2", + "40b762f0 c1e446e2 4203b700 00000004 40000000 3f000000 -> 3eebe2aa c02b325f 3e84f150 bea886e6", + "4221ea64 424703fa 41400884 00000004 40000000 3f000000 -> 401150f8 4083b896 be9d66eb 3f3a54bf", + "41ecb880 c2289564 c1c2cc97 00000004 40000000 3f000000 -> bfe46297 405d6788 3eedbb08 bed882e1", + "c1cef7b4 c220218d 3db63a00 00000004 40000000 3f000000 -> 40fd2bac 3e0ca780 3f7771d1 3ef9d618", + "c1d7a821 41daf374 c19db323 00000004 40000000 3f000000 -> bf9f56cd c0831915 3ea59424 bf5f2e51", + "c20dffac c1a564c1 4214d30c 00000004 40000000 3f000000 -> 40d8c056 bfdc0d32 beb1ab6f 3f067dac", + "c22e524c c2137c51 41d177c4 00000004 40000000 3f000000 -> c09570bb be7df6d2 400752ef bf794d32", + "4210bb94 4232abe0 41cfbb38 00000004 40000000 3f000000 -> 3edd5df2 4054651d 402357c4 3e096c9e", + "c23d042c c1a79e70 4012fb90 00000004 40000000 3f000000 -> c057f93d 400fbf1a 406dec40 bf0fd047", + "401a2060 4176d750 41349ef8 00000004 40000000 3f000000 -> 3e23dec8 c0f30289 c07d520c bf5ea7b8", + "419280a4 419edbc8 4112b3d0 00000004 40000000 3f000000 -> 3fb94478 3f6d196c 3f448ca4 3f5faac2", + "bff73a40 41a95a44 41832c58 00000004 40000000 3f000000 -> bfa31237 40738afe bf4a891f 3ecb4754", + "41f3d378 c22acb09 42176cc8 00000004 40000000 3f000000 -> bfa7056c 3fe9ca0e 402301ba 3e85738c", + "c1a95451 42351606 c22982f0 00000004 40000000 3f000000 -> bec2c500 c0872c75 bf4502d6 3ea90351", + "c186ceec c0727800 c1a4bd12 00000004 40000000 3f000000 -> 3fa09c8e bec3cad8 403aced1 3c23b2ac", + "422a2fd2 c21ebfdc 41dec9bc 00000004 40000000 3f000000 -> 408d6b8b c07de6c2 bf9f8508 3e27372e", + "c18de48e c217737a 3f825560 00000004 40000000 3f000000 -> 3df86140 beee4704 4019613e bf6aa720", + "41ca73dc 4000f350 40da72b8 00000004 40000000 3f000000 -> bfa23ed8 bfb4d6a0 3f4b1ff0 3dc2ea29", + "c1b8e20e 419c6190 c1b99ea1 00000004 40000000 3f000000 -> 3f42df94 bfffbde1 c0acc4da bf791707", + "c22c269c 4216ee90 41a5a664 00000004 40000000 3f000000 -> c09495f8 c0a093ee 4021f048 bf0d898a", + "c2212d97 c1b68b8d c0f259c0 00000004 40000000 3f000000 -> c1086ae0 40227204 3e101cc0 3f26dfd4", + "4165c7e0 40ba1ea0 c11e3dc8 00000004 40000000 3f000000 -> 4055a127 40c79e3c 4010cb96 be70886c", + "4223ae2a 41c7cb84 c22f3368 00000004 40000000 3f000000 -> 3f23d258 3fc98b31 bfc15f9e 3e3ceece", + "415e410c c17fa5a0 c1dfceb0 00000004 40000000 3f000000 -> 408b5b1c bf87241a c10e7c50 bf0aa12e", + "42456644 41dcafbc c2009256 00000004 40000000 3f000000 -> 3ee56a40 c0802eec 40d7c7b8 3e6b2318", + "41947da4 404230a0 bfc59420 00000004 40000000 3f000000 -> c02bcd9b 3fda51c4 c04533a8 3f105222", + "c05c3d90 c21f33ff c1fa1eb7 00000004 40000000 3f000000 -> 4080f89a c0131e9c bf8704d9 3f0321ee", + "41c395b4 c1eed768 405294e0 00000004 40000000 3f000000 -> 4021195f 40136d49 407cf0e8 3e9569ae", + "c21eeaee 422c0664 c200a150 00000004 40000000 3f000000 -> 4027d8f9 c052a417 40317586 3e5fa84d", + "c23ea162 c1e69196 c24183a8 00000004 40000000 3f000000 -> c07f15e9 3e5a4752 bf9d635e bf35cda9", + "c1266a0c 41bc20b0 c1f37332 00000004 40000000 3f000000 -> 3f3c07b8 3f8bce9e be546960 be83a783", + "c203666a c1f6f922 4190b794 00000004 40000000 3f000000 -> c09e31c2 401e601c 40148c9e bd234feb", + "41732120 41964d28 422194ac 00000004 40000000 3f000000 -> 3fd443c6 4013fac6 c0cf88d2 3eafa404", + "421d30e8 c2417e56 c16a9674 00000004 40000000 3f000000 -> 3e207870 402e1318 c00d31a9 bdbb0dbd", + "41ad3088 4192faec 41e0ebdc 00000004 40000000 3f000000 -> 3f922eb6 3f9a38ae 3fac4a2e bbbc0d90", + "c1a80bfa 41cfa758 41c36eb0 00000004 40000000 3f000000 -> bfce4a7c 4080b78e c04161ca 3ce6003a", + "c1307d54 41054098 c205f240 00000004 40000000 3f000000 -> bff180c4 c0af54af bd916c58 beabd2f7", + "41e2baa0 412674f0 41dc451c 00000004 40000000 3f000000 -> 40c23a6f 4072fac8 40687514 3df21c59", + "3ffc51c0 c16be1c8 c22bda12 00000004 40000000 3f000000 -> 3f8d4fa0 408b8418 bf15e9b8 bda2a365", + "421c8b7a 4082e720 414cf5c0 00000004 40000000 3f000000 -> 40038344 40199cee c09343dc be50a682", + "c1dddc44 421a4f8a 4072e8c0 00000004 40000000 3f000000 -> be80b60e 40af223a 40866d74 3da6dd9b", + "c235afc0 c1cdaa74 412818fc 00000004 40000000 3f000000 -> 406a31c9 3e280ee4 c038d282 3e31ecc8", + "c23e2dbf 4200ccac 410751b8 00000004 40000000 3f000000 -> bedd0c22 c0566b1a c044be14 3f36da3d", + "be6e2000 c23a8975 4208fc78 00000004 40000000 3f000000 -> 3fbf3ea1 3fcc295e c01dcf8a 3e248dba", + "4100facc 40e859f0 c225b5a9 00000004 40000000 3f000000 -> c09b43aa bfcf26fc 40a4a82e bed50e15", + "42059642 c23ccd6a 3fe2daa0 00000004 40000000 3f000000 -> 409ecc87 c070c2b5 bd979e78 3e90e3eb", + "41c966c0 41fa3620 c203cd47 00000004 40000000 3f000000 -> c04fb496 c0dc085c 3fe7be9e be7649f2", + "c0d2c548 4155f7c8 414d9c3c 00000004 40000000 3f000000 -> c1037971 40057e85 3ef3d382 3e5a0b50", + "420c6e9a 413420b0 c2138ce4 00000004 40000000 3f000000 -> c088a555 3f5ed7fb c025d9ca bec3445f", + "c0fee140 4172dc20 42077be0 00000004 40000000 3f000000 -> c021f18c 4013ccda c01f2bfa bf2c27bb", + "4130d774 41d0799c c20d3652 00000004 40000000 3f000000 -> 403fb850 bf1ead25 40477b20 bd8ce43c", + "c1b35188 41883e14 c213cde1 00000004 40000000 3f000000 -> c0a3199c 3d79f2c0 bf329bd6 3f382e76", + "41fc57ac 41889008 c0bd6a80 00000004 40000000 3f000000 -> 3f0d807b bff37964 c0ae0530 3e779051", + "c2019051 c1bbb07c 422f06fe 00000004 40000000 3f000000 -> 40b6f230 3ee5d398 3d6b0f40 bd9ba618", + "c2081d16 421ccecc 409eccd8 00000004 40000000 3f000000 -> c0979f13 c037a524 c028cc27 3e8feb70", + "c18ddd70 c1edc2c5 c23b6e02 00000004 40000000 3f000000 -> 3fd4e086 40de25a2 3f854129 3e4097d0", + "4197b070 41949898 c18c560e 00000004 40000000 3f000000 -> 40612ddd c0467a52 c0404484 3ef09f0f", + "40a878c0 c21027e7 41b683ac 00000004 40000000 3f000000 -> 40a022a6 bf86d1dc 3f2af90d bda3f56e", + "c087aa50 41e6d50c c1c65cd0 00000004 40000000 3f000000 -> c0043118 c06cd194 bfa0d8af bebaf532", + "4223c77e c1f43cb1 41508a68 00000004 40000000 3f000000 -> 3f27aa97 4091fdc5 40d51226 be6232bf", + "c026cdd0 4126b9a4 c203ea5a 00000004 40000000 3f000000 -> c0b119e0 bfff0bec c01360e1 3e184e49", + "41c4b118 421adc04 c1b58c87 00000004 40000000 3f000000 -> c08f8809 40d1e891 3f815966 be4dfe38", + "419c6594 c19c3114 4220ec34 00000004 40000000 3f000000 -> c06320e9 bfdb9466 bf9a82e2 bf4cd386", + "42361838 c2409595 c16455bc 00000004 40000000 3f000000 -> c0badf42 4005d3ae bf435e81 bef68548", + "c2293bdb 40f21d88 40979a70 00000004 40000000 3f000000 -> 403fe7e4 bf81f5fa 40039980 3e08ef6b", + "c1d5a888 c1b47727 41c15e50 00000004 40000000 3f000000 -> bfd43abe 3fec4ef2 c031176c bd31abe2", + "c228728c 4035d520 c11059c4 00000004 40000000 3f000000 -> 3fd7ee39 3f831058 c02d1fab 3ee650cb", + "c2201ee2 41b89740 423a6abc 00000004 40000000 3f000000 -> 403d69b3 c08612f1 403f262a 3f1290cc", + "3fb4dd00 c230d93c 414192d4 00000004 40000000 3f000000 -> 3c14ba00 c075ecbc bf8f546e 3d92d95c", + "c101e0a0 41fe990c 4218b482 00000004 40000000 3f000000 -> 3ccb6f48 3f8fa07c 3fc8cfd7 3e2a60f3", + "42176086 42226458 c0199a30 00000004 40000000 3f000000 -> 406aa4ce c0493499 3eee6fec 3ee6b58f", + "41f8602c 41a1b918 4180f2b0 00000004 40000000 3f000000 -> 3fe65f43 c0b297b5 bfab0600 beaa4684", + "41d5e2b0 c109d68c c2460d38 00000004 40000000 3f000000 -> beb176f8 c08cee13 bf33b73c 3f02f41b", + "c1b2c043 414b79f8 421f3726 00000004 40000000 3f000000 -> c0b10ba4 bed816e0 409e291c becb6389", + "c2145a36 41bb8000 4185c3c4 00000004 40000000 3f000000 -> bf9c4a61 bf2cecb8 bf215406 3f2b55a3", + "423aea68 c01b50d0 40cca340 00000004 40000000 3f000000 -> 40d1c5ba bc8bd440 bff7a192 be93d41c", + "c1ff62f2 c1dc420b 3fb4c340 00000004 40000000 3f000000 -> c05caeb4 bf714bba bfe86cef 3e8d2a58", + "3f844e20 42043a0a 418508ac 00000004 40000000 3f000000 -> 40b9cd6a bfa66f2a bf2b8808 bf2f85ca", + "c1df8de9 c14937e8 421562c8 00000004 40000000 3f000000 -> c04577be bfbdc990 be0e7480 be390a5e", + "c1ecaa2c c1d69cb4 4203b540 00000004 40000000 3f000000 -> bd8086f0 402d4cf1 40114111 3cd02bb0", + "41735420 c1b2aa1c bfaca200 00000004 40000000 3f000000 -> 40afc6f1 4042d6d0 bf5bc13c bcb18eb4", + "c23fc850 c229484f c21af9ee 00000004 40000000 3f000000 -> c0110866 c0673a80 c06605aa 3de96683", + "42188434 c1bad7e1 42156724 00000004 40000000 3f000000 -> 4089ed3d c0a1cd06 bf9c87bb 3ea51fbd", + "421a79f6 c05c59c0 42103a10 00000004 40000000 3f000000 -> c08d49aa c0081df1 40162dc1 3e242417", + "41bd78bc 41f1db28 42207ed4 00000004 40000000 3f000000 -> bf74a815 3f8ed3be c0b4708a 3e9b6922", + "3f964d00 423c3b52 42468ba2 00000004 40000000 3f000000 -> 4084ec2f 400962c6 c078e719 3e8efeec", + "c1a0ee4a 4095e3f8 41036f44 00000004 40000000 3f000000 -> 40951681 3facc3de c01a73fa 3ea4a62e", + "c2312fb3 c1d18d5e 4115b62c 00000004 40000000 3f000000 -> 3e9b3fd8 4092bc05 3f67cfee bed83eac", + "c153c65c c15307a4 c229d5b1 00000004 40000000 3f000000 -> c05b2e8f 3d14509d 4059cb35 3e0bd33d", + "41f7c40c 410fdc2c c189aaf4 00000004 40000000 3f000000 -> 401e1cec 3f47793e 408bc51a 3df1cd75", + "41e62d24 40ca3370 c1fe4e93 00000004 40000000 3f000000 -> 3f092620 3f9af46e bf83e916 3d5df26b", + "c201c276 41472b60 c16f31d0 00000004 40000000 3f000000 -> 3f199dcc c01b605d 4074a84b bf04f648", + "c10d8f24 c21c91e6 417c2140 00000004 40000000 3f000000 -> 3e603160 bf8310ba be8dce40 3e2c8dca", + "40aede78 c22599cc c1e89238 00000004 40000000 3f000000 -> bf9b9db4 bf87d807 c08652a2 3f2899f3", + "41985a88 c1a456dd 41cf492c 00000004 40000000 3f000000 -> 4018b10b c0a7234a c0850444 bd1780f6", + "4175b028 41dacc24 c23cb38b 00000004 40000000 3f000000 -> 3ff2d00c c09b821a 3fd0031d be344ac8", + "41d40b04 41a70d48 c11a2534 00000004 40000000 3f000000 -> 4014cfe2 c0a0d4b6 3f83ecfe 3f0d149c", + "4216d728 42222210 4193ea4c 00000004 40000000 3f000000 -> 3f147d1a 3fe2c653 bffc01ff 3ecce6b2", + "c1ca4d25 411812e8 c2388e5f 00000004 40000000 3f000000 -> bfe54d34 bfd10a02 c08496d4 bec6f5b3", + "421d2d66 4174a518 41a6f334 00000004 40000000 3f000000 -> 3d53b84e 41049f07 401eb644 be2c7b49", + "c239243c c22b5dd3 418d3a0c 00000004 40000000 3f000000 -> 40aaab74 bfe3daff 4043c14e 3f22cc5a", + "4091e4f8 c2209c9b 4220f3f6 00000004 40000000 3f000000 -> bf33433a 3ede4d68 c08c9ff0 beffef54", + "418ec2b4 40c3f6a8 c200dd43 00000004 40000000 3f000000 -> c0391a89 c02bf3a8 3eb633d0 3effb8a9", + "40a25a40 c21fe9cf 4210cd38 00000004 40000000 3f000000 -> 402c05b2 401a67d1 409094a2 3f043015", + "c180f95c 41c35a18 c07a9b40 00000004 40000000 3f000000 -> 4081f4b7 c0898981 bc144700 3c8b2442", + "c14b6c48 c15573d8 423164c0 00000004 40000000 3f000000 -> 400d50e0 bf9840c1 bf04d676 3e182abb", + "4205c8f4 41ab44c0 41176014 00000004 40000000 3f000000 -> c0d46cda 3ee91cec 400000d5 3ed223a7", + "c2352227 c236237c 42187066 00000004 40000000 3f000000 -> 3dfa72e0 408786de c01963ad 3e281f58", + "4229b3d4 42243f6a 417c9180 00000004 40000000 3f000000 -> 3ed3ac88 3f65e74a c088cb9a be25b176", + "be8e3780 422b641c c23c39e3 00000004 40000000 3f000000 -> 40ccb3fe bf608f7a bf491d78 3ed627dd", + "c1967c2a 3fedda40 c08dd968 00000004 40000000 3f000000 -> 3f0a0c28 400c1864 4092bfe0 bbf7da04", + "42338eb4 3fe00140 c2423bf9 00000004 40000000 3f000000 -> bf9c146b 401fc01b bfd8cadf 3f170f38", + "40519df0 c20e0f5c c1f31da6 00000004 40000000 3f000000 -> 3fec542a bf0c20d2 406c2877 be70629b", + "420eb0a2 423e0ab0 c1e63187 00000004 40000000 3f000000 -> 40809f5c 40d0ae85 402d1f5f 3e0eeaba", + "420c29b8 c1e48b8a 412dc1c8 00000004 40000000 3f000000 -> 409d73d8 40600ced bef043be bef5127b", + "40854bd0 40753d60 c2078afd 00000004 40000000 3f000000 -> 3f9b76c0 4089fee0 bff00e5d 3e8251c3", + "c1dcc24b 4215b480 c1d93c9f 00000004 40000000 3f000000 -> c091b658 c0489ffa c08eae54 be816009", + "c221f31f c2309b90 422f86e8 00000004 40000000 3f000000 -> bfb1d0ea bf6b3701 40bd4849 bdea4120", + "c21a5e6a 4243fdea c23d3a57 00000004 40000000 3f000000 -> 3f74d39c c005729b c054bf5b 3e3aef87", + "41ec593c 4142232c c1f9b809 00000004 40000000 3f000000 -> 3fe5b186 c115e50b 3f2a623c be56dffc", + "c1cc60d3 c1ff046f 41546ae8 00000004 40000000 3f000000 -> c0883b9f 40625177 40d60bb2 3e707c27", + "c20ca360 c1d0ed46 41029d80 00000004 40000000 3f000000 -> c01f4530 400da160 40c948b0 bdd47c44", + "c115de6c c1302d8c c1daa5fd 00000004 40000000 3f000000 -> c003a8ae 40d9ac3a bdfab11c bed9f7f6", + "c0ab6dd8 42080b0e c1de9b34 00000004 40000000 3f000000 -> c082200c 40adcdff 4055275c be1b98b2", + "41c5e724 423f1854 41bf2f60 00000004 40000000 3f000000 -> c013c6df 3ead47b8 3fe8c572 3ea75881", + "c13c3ce0 c1f297be 4204224a 00000004 40000000 3f000000 -> 3fff5bb4 3f1285ea 4030ff34 bf23b822", + "c1b60019 c13bd698 c14c51b0 00000004 40000000 3f000000 -> bfb2f3c4 4080030c bfa66262 3e929c10", + "bea85200 c1b57692 c2325064 00000004 40000000 3f000000 -> bf0bbdb0 bf6e1ac8 c081bcf8 bf0b93f6", + "41f0c8d8 c1e295ec c07f59e0 00000004 40000000 3f000000 -> 3fa8bfb2 c08b97c8 c04a7a67 be928f60", + "3fd7bd80 4205ed1e 40302210 00000004 40000000 3f000000 -> 3ff41792 401f7496 bef7901c 3f00837e", + "4242fe5e 41bdda80 40167d80 00000004 40000000 3f000000 -> c037d40c bf0d7aa3 bf1de4ac 3da10a69", + "c244b2cf 4133842c 41eb19cc 00000004 40000000 3f000000 -> 4073414c be1574b8 c0514736 3d8c033e", + "40fe6410 41a19a30 423e30de 00000004 40000000 3f000000 -> 40b3f9ce 4083b144 be829ff0 3da460fd", + "c23d36ed c211deec c20ca0c8 00000004 40000000 3f000000 -> bf702828 c00bf16e 40d7e71e bf39c340", + "422dc802 41de192c c23a568f 00000004 40000000 3f000000 -> bfc7a19e be334c43 40878c4f be8eb25a", + "c24550b5 c1739ac4 c227b3e4 00000004 40000000 3f000000 -> 406f8c94 3f34e80d 3e10d310 be90d1aa", + "c1f02190 41b9619c 41ea9394 00000004 40000000 3f000000 -> 403b8a2c 40d7221e c044e2b5 3f32b625", + "c1f2b93f 4012caa0 c1d1031c 00000004 40000000 3f000000 -> c0c7f01d bf9b4342 c048dc28 3e3fb926", + "41fc70d0 41c64074 42233912 00000004 40000000 3f000000 -> c01b8cf3 4050a541 c0bbd73b beb25108", + "40fb58f0 c1741f30 c23f2bad 00000004 40000000 3f000000 -> bfbde2a8 3fffd822 3ffa69cd 3eda8773", + "c2176302 421bca7a 40b03be8 00000004 40000000 3f000000 -> c0b97938 bf85f834 3ef97358 3e0b9f76", + "419f55c4 c08360c0 c21ee232 00000004 40000000 3f000000 -> 3f3ff0a2 bfacf4e4 4010d3cc bf401e32", + "419e951c 41bf4cc0 c15722dc 00000004 40000000 3f000000 -> bf1844a6 3e19d438 c0d63b7e be58a62f", + "42320ac8 41f2488c bf063d80 00000004 40000000 3f000000 -> 3fc535c8 c013338f be2cce18 bd85f6e0", + "420df16c c1cb923f c1ca2d76 00000004 40000000 3f000000 -> 408ac5b3 3e8441f8 40fa4668 3d388ede", + "c1dce748 40c73ad8 bee3ef00 00000004 40000000 3f000000 -> 40691798 c0115d22 3f9fbde7 3f01b603", + "c23ff9d6 41eb6a44 42139bbc 00000004 40000000 3f000000 -> 3fa35b05 40e4786f 401dc9f3 bc7c8764", + "c14106ec c1926299 c21ec3ae 00000004 40000000 3f000000 -> 3f9189b1 3f9c4443 3fcefd9e 3e2e873b", + "41bb70b0 41e8b5f8 c1e47ed3 00000004 40000000 3f000000 -> 3f44b784 3f6606ec 4040bb28 bf143734", + "c1ac2d32 c1f5d66c 4211c0d0 00000004 40000000 3f000000 -> c01d338a 3beeb6e0 402dc61c bdf16ca6", + "421a53d6 c2479e9c c168ac70 00000004 40000000 3f000000 -> bff5c5ac 3ff97e63 400fbbd0 3e7890cd", + "42355c8a 42222c16 c1cb52cb 00000004 40000000 3f000000 -> 40d19544 bee3ab6c 3fe68be6 3f3f7bfe", + "41155eec c1d3c5c0 c1910ea5 00000004 40000000 3f000000 -> 406cc4f8 bdd55d70 c01937b2 3f0543f8", + "422c8ba4 c1993686 412dcbb4 00000004 40000000 3f000000 -> 400236fd 3eef459a c0b888c2 3e1da049", + "41ac29a8 c1c43721 422b8c88 00000004 40000000 3f000000 -> c0b0d76a bf875f46 4013d804 bf351afb", + "c1a13a80 c17d382c c1b2146c 00000004 40000000 3f000000 -> 40718e96 bf89f056 4089f4ae 3e36dac0", + "4244952e 4112b02c c1fb8e40 00000004 40000000 3f000000 -> 3f7f446e c084c4f2 bf4f8925 bd0afe96", + "c10bfc40 40bb27a0 40aa1898 00000004 40000000 3f000000 -> bfd3e954 408df202 bf52cec0 3f442fdb", + "c20ac768 41c1bd70 40e7de30 00000004 40000000 3f000000 -> c07fd71b 400312d1 3fb19826 bf7d548b", + "c099a6a0 4239f28a 418671d4 00000004 40000000 3f000000 -> 4010b748 3f00e024 c00f0a1d 3f0a8f0f", + "421b5d38 c10a7b64 40948cb8 00000004 40000000 3f000000 -> 3f8cc813 3fa8381e 3e3cc348 be8b92b0", + "3decf000 c230490e 41f185c4 00000004 40000000 3f000000 -> 3fb30742 bf5d0c18 409c2600 bf38454b" + ] + }, + { + "glsl": "vec4 cultmath_ridged_grad(vec3, int, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c20feddb 422094e2 c17fd4d4 00000004 40000000 3f000000 -> 404718ec c0643e2f bf9650f4 3f49a955", + "c2476d55 4150d284 c18a6b8c 00000004 40000000 3f000000 -> 4036f044 40bbbe95 be16d928 3f505676", + "c201408c c2248579 bfb5f360 00000004 40000000 3f000000 -> bf69961b 3dfc4800 bf0881ab 3fcbcabc", + "c1bfae64 418352e4 c22f15bc 00000004 40000000 3f000000 -> bfa88d6e 4011ec01 bfcf15a7 3fb08f7f", + "c2025036 c0cd5348 c0a2b7c0 00000004 40000000 3f000000 -> c0c99f9c c04edc46 c0328d31 3fbc9b67", + "422ecace c1a5578d 4121a2fc 00000004 40000000 3f000000 -> be8f06bf c0457f62 bfdcdf9e 3fc3a10a", + "418f0fe0 c02ad1b0 c0b81c78 00000004 40000000 3f000000 -> 3d94c500 3e0eef46 c035b2e9 3f950bbe", + "41f123a4 41f047e4 c206b2a2 00000004 40000000 3f000000 -> 403a55fa 3ffee79a 4008a70b 3fa2e591", + "418ab5a8 c20f7372 c1b7aad3 00000004 40000000 3f000000 -> 40ecff51 c0a0f518 c0aa61ce 3f83e537", + "4170ff08 c236d194 421e0396 00000004 40000000 3f000000 -> 40e0b8bc bf8ea3ef bf00df14 3fcde1b3", + "c22f1eaa c1e4c34b c1f3a505 00000004 40000000 3f000000 -> 4099b400 3fd94a14 bf2cc80e 3fdd0053", + "c2153659 c208af65 c0bf1760 00000004 40000000 3f000000 -> bfc0c20c 3f456c08 3fff02fa 3f9663f0", + "422eeb00 42440282 4238776a 00000004 40000000 3f000000 -> bf37f62a be699d48 c0c193ae 3fae5c01", + "420f6ea6 c1d37d06 c0415930 00000004 40000000 3f000000 -> 400b8dd0 bf143882 3fa59342 3f937a03", + "c22d0d53 421d0fcc c228caba 00000004 40000000 3f000000 -> bfd7c7c0 c0a12c92 4085e67b 3fc86583", + "3f823060 c1b1c93c 4039cf30 00000004 40000000 3f000000 -> bf54efeb be3a4000 3e9d2b2c 3f654e39", + "c1e0e03b 4234926a c217f313 00000004 40000000 3f000000 -> bfdb47cd c0fb14b1 40b1acc1 3f9180e8", + "423228d8 4200ee8a 41099038 00000004 40000000 3f000000 -> 4015e1c2 3fb5645c bf18329e 3f8aa71e", + "c160e640 c180ff5a c21f8f11 00000004 40000000 3f000000 -> 3f074f29 c04e1852 c02e7c0a 3f88a0ba", + "c2014292 c1899054 bf8afda0 00000004 40000000 3f000000 -> 3f689c00 c0c2c63b 402c2b28 3f860b87", + "c231605c 4027fb00 c235b3e4 00000004 40000000 3f000000 -> 3f89275a c083eae0 40931276 3f89845d", + "4111333c c1f17111 c09fa740 00000004 40000000 3f000000 -> 3f5e3f0a 4052c2fc 4068b892 3f7ecae8", + "4212bcc6 c23519dc c1b1f607 00000004 40000000 3f000000 -> 408e1689 bfdc786e 3f9a9a59 3fa72295", + "c244740d 4247dfce c19d5c92 00000004 40000000 3f000000 -> 4025f679 c01936ce 3f8330b0 3fa5ce9b", + "415fc554 4200194a c1d1dd30 00000004 40000000 3f000000 -> c026c4e8 bf9e1df0 3eb207ac 3fcae4d7", + "423d1204 41bb3e4c 42231428 00000004 40000000 3f000000 -> c0281b72 400d7152 402cff7c 3fa7ac79", + "c225e7e9 c206b6ae 4211712c 00000004 40000000 3f000000 -> bf92e953 3f277f22 4083e796 3fb961e7", + "41c11b48 c0da80f8 c2236400 00000004 40000000 3f000000 -> 402ad6aa c043cc0a bf9535c3 3f97ad98", + "41dbed50 c2194782 c12d40b8 00000004 40000000 3f000000 -> 409f28fe bebd0560 c07dbf2d 3fbcb519", + "412f25c0 41d6066c 41ffa090 00000004 40000000 3f000000 -> bfd0312e c0471400 40e19e88 3fbbbece", + "c180a7b4 41d05b24 41819558 00000004 40000000 3f000000 -> 3fd9cf27 4037754c c01d9cfc 3fdaa9ff", + "c0330a90 41f19e04 41a7839c 00000004 40000000 3f000000 -> 3f9f3593 3f839573 c0462cb1 3fb44252", + "c0f30d80 c015a220 419b90a4 00000004 40000000 3f000000 -> bfc32a9c 3f5c1c60 3e6727e4 3faaf18f", + "414ca8b8 416552f0 c1d79583 00000004 40000000 3f000000 -> c07f94c1 3f6fff3e bf362df9 3f905ad5", + "c1c6d013 c1e7f822 4234b29c 00000004 40000000 3f000000 -> bfae8952 c0e66e2f 3fbbff6b 3fcc2c90", + "41fd766c c19b90fa c2472ac1 00000004 40000000 3f000000 -> 3fd08c2e bf758741 c04febad 3f9c59ac", + "c172b568 c1352e50 412784b8 00000004 40000000 3f000000 -> bf4c7bb2 bfef6c50 406ff99c 3facb390", + "c1f54671 c2235aa9 c206117c 00000004 40000000 3f000000 -> 3fa61001 4067a97e 3e2d1d38 3fa11eec", + "4148db9c c193dc00 c2223031 00000004 40000000 3f000000 -> bf5ac728 bedcb004 40d45cd1 3fa66da4", + "4235b01a 41fcac4c c2277106 00000004 40000000 3f000000 -> 3ffa198d 3f530e12 3efd5c66 3fc7e25c", + "c230a4ba c1c21953 c1b03a24 00000004 40000000 3f000000 -> c07f73a0 bebd8fa8 40578c76 3f866630", + "c0865a58 4187bf9c c1d09b87 00000004 40000000 3f000000 -> 40150a7e 40c3d334 40874532 3f9e2388", + "41621c30 c204de02 c240b5b8 00000004 40000000 3f000000 -> c0178777 bf1edcf6 4043f35e 3fb56dfc", + "4034f9b0 409b9d98 c1c20d74 00000004 40000000 3f000000 -> beacc3dc beef40de 403377a0 3fde5282", + "c1e56857 c08890c8 3ffe92c0 00000004 40000000 3f000000 -> bd4606e8 40124c7e c0b5dbad 3fc7f12f", + "4154efb8 bf814a40 c1dea81b 00000004 40000000 3f000000 -> 4091a7fd 4000cb47 bf2d4a6c 3f757079", + "c210169d 42373b74 41f901f4 00000004 40000000 3f000000 -> c087d3c3 bfc05e52 3fe5db41 3fb065a4", + "c13095b4 c1bf126b c13ec4dc 00000004 40000000 3f000000 -> 3fa4585d 40765fac c041f50f 3f8a6684", + "c1e421ce c20db0a2 41871074 00000004 40000000 3f000000 -> 3fa5540e c02b37aa 3f8a9822 3fb50d57", + "be91ec00 420a9872 bfa85fc0 00000004 40000000 3f000000 -> 41035970 c0a9ff5a bf10f894 3faa5bb4", + "4137c7f8 c0411ca0 41809f70 00000004 40000000 3f000000 -> bfa7bdec 3efe5840 408527d9 3fae2fc8", + "4134e568 40de7748 c1367a6c 00000004 40000000 3f000000 -> c0375c9d 40d98758 bfbe174a 3fe36717", + "42345252 41eac680 40812108 00000004 40000000 3f000000 -> bf42a664 40403bb4 402b7992 3fb285c3", + "41aa00c4 c201cbd6 c210ea7a 00000004 40000000 3f000000 -> c108423e 409d2501 405da022 3fbfac94", + "42418af8 4200030a 420740b8 00000004 40000000 3f000000 -> 3f1512e8 3efcc177 c0841891 3f9e99de", + "c1746060 424010f4 4156ddbc 00000004 40000000 3f000000 -> 402cb948 40862a1e c04cb3bd 3fa6800d", + "4167e7b8 4244faf8 42021c52 00000004 40000000 3f000000 -> c070e14a c09aa2c5 405e44f5 3fcc4b73", + "421523de 41fb8d70 420f1ab2 00000004 40000000 3f000000 -> be0f5f60 40716df4 40442d51 3fcb48f7", + "c1b7e402 41870164 42467c8c 00000004 40000000 3f000000 -> 40165fda 3f4afd8e 409d1224 3f819d7e", + "421f9424 c1cd74c8 40190700 00000004 40000000 3f000000 -> 3f9b7740 3f7af71e 3d9b4f20 3fa30367", + "40e15010 c20e551d c18eece6 00000004 40000000 3f000000 -> c012b794 c02188c5 c0312198 3f9f4bae", + "4048d450 42255d9c c2287a82 00000004 40000000 3f000000 -> c00677e6 404f85aa c05ed7dd 3f81cea8", + "411aa634 412049e8 421b1efe 00000004 40000000 3f000000 -> 3fbaa3b5 bfc1536d c04afeec 3fb91f60", + "c2126ccf 4191d338 419d24d8 00000004 40000000 3f000000 -> 3f230048 be9b267a bf9233bc 3fcc9142", + "41910fa0 c0e8b7f0 41e20e90 00000004 40000000 3f000000 -> be1ff9e0 bfa91b4f bf7f6d92 3fbb3c25", + "418ad6e8 c116c190 c0bc6200 00000004 40000000 3f000000 -> c068af50 3ff8faa7 3fa74cec 3f6bb446", + "40887080 42130730 c205c194 00000004 40000000 3f000000 -> bff6edd2 3eac4f2f beb08e0a 3fa53ee8", + "c23a2f34 420ce23a 420d9d7a 00000004 40000000 3f000000 -> bfe88805 40611a7e 40327597 3f6f5d56", + "41814160 41c19c40 41789df8 00000004 40000000 3f000000 -> beeacfe6 bec90980 be61a874 3fb67f6a", + "41f26a10 c17b5298 42204e36 00000004 40000000 3f000000 -> 409f72c6 4096f7e7 c08b05ed 3f9612d0", + "c1306c98 c23341d3 40a0ed28 00000004 40000000 3f000000 -> bf45fcf4 c075d2be c03249e7 3f8068b4", + "c2416c4e c20f29a1 c23b76b8 00000004 40000000 3f000000 -> 40f28842 c0010de6 c11a2a18 3fcf2c02", + "41fd17f0 c0981270 4222a56e 00000004 40000000 3f000000 -> bf634538 bfb9709e 3e94035f 3f81cb1b", + "41cf7678 41c87cb4 c1400620 00000004 40000000 3f000000 -> c079b4d6 c081efef 40861e3e 3fbe0176", + "41c530e4 3f8cd7a0 c197dd4a 00000004 40000000 3f000000 -> 400f6ebc 40127d4d 40341a19 3f98391d", + "c214761b c1f6c7e9 c1348928 00000004 40000000 3f000000 -> c006c4ef 3e4ae17c 3e61ff20 3fb79df2", + "c229ec96 411a8a28 c1bd9dd4 00000004 40000000 3f000000 -> 400f3009 407b7304 3f402e36 3fcdbce0", + "40b04660 c165e7b4 c1470650 00000004 40000000 3f000000 -> 3e807de4 3fa9d7c8 409a2d42 3f7fbda7", + "c162b7f0 40659360 c1a66eaf 00000004 40000000 3f000000 -> c034b0a0 c0cb209a 402f3794 3fe36f7c", + "c0513ec0 4213ec94 c2037084 00000004 40000000 3f000000 -> c0899395 bf27cf00 c06ced67 3fa3131a", + "c0f51000 41eae90c c1c231c0 00000004 40000000 3f000000 -> c054f570 c110db3d 406033d1 3fbd26a1", + "4242d0c8 41c35cb0 4150adc0 00000004 40000000 3f000000 -> 3f84aedc 3e650d3c c09331a5 3fcc8410", + "c20d8b38 4183e83c c1abdaba 00000004 40000000 3f000000 -> c01bde11 c0950623 be09f2dc 3f78ca20", + "41c8fc00 420edf7c 423551ec 00000004 40000000 3f000000 -> be57da00 bf24b5a0 3f256480 3fc8a2f7", + "405ce520 41e2a5ac c219372a 00000004 40000000 3f000000 -> be396680 bc12f480 3fbd776a 3f8f2e62", + "41e47fe8 c1a98f4a c17e120c 00000004 40000000 3f000000 -> c08e6163 bc0c2580 3f972113 3fe1231f", + "408c60f8 40516cb0 40a190b0 00000004 40000000 3f000000 -> c00fbb8a bf90645c 3ef93224 3fc410d8", + "c1b96c6f 41b6433c 41c511a4 00000004 40000000 3f000000 -> be9d6b70 c04794a9 c09b0317 3f7aaa5f", + "415c7488 4205dc0e 419c7034 00000004 40000000 3f000000 -> c0325f7a c026bba6 3fdd0186 3fa0e373", + "c20220c6 417d06b8 4129f4a4 00000004 40000000 3f000000 -> bfb272b0 c0cfae24 4026fe10 3fd7d982", + "41bf8140 c1718068 41044474 00000004 40000000 3f000000 -> c01ff306 4079577c 3ffac84f 3fcf7f07", + "41bc2be4 c183458a 4236c9d4 00000004 40000000 3f000000 -> 407f5667 c02a0918 405a6f47 3fd3ed5d", + "c216e8a8 41cf8f50 41d570cc 00000004 40000000 3f000000 -> 4061a11c c0257d94 bfe91c78 3f97de98", + "418fcbd4 4241151e 402a7ec0 00000004 40000000 3f000000 -> 40798616 3feeafa4 c0f3b71c 3fbbae09", + "c21f34ed c18cd52e 41bf861c 00000004 40000000 3f000000 -> 3fb3376a 40151f99 bf47b93c 3fa958b0", + "c19841ab c23fc586 40e999e8 00000004 40000000 3f000000 -> c0b238b7 403115ca bfc89626 3fe73142", + "c1c114d5 40e89088 c1c9be4a 00000004 40000000 3f000000 -> 3f9d36f6 3f3c0756 c086c39a 3fa08cc1", + "42344d2c 42295ff6 c182546e 00000004 40000000 3f000000 -> bef84538 405630bc 40810f6f 3fca794e", + "41417598 c209ebc9 c22dad16 00000004 40000000 3f000000 -> 4026c61a c04c0876 bf5f5e1a 3fa7e84b", + "3f8bca00 c1713164 4223d24a 00000004 40000000 3f000000 -> 3fa9fad1 4041700a 409e8c65 3fc53010", + "422df356 423c958e c2454d90 00000004 40000000 3f000000 -> c0848916 c0206c5a 40b8fa10 3f96edbc", + "418f2af4 c243429e 3f4fe580 00000004 40000000 3f000000 -> 40a08673 40a4471e bff21aa8 3fd7296a", + "c14efcc8 41ef70c0 c0a85330 00000004 40000000 3f000000 -> 3f0ee1da c106970c 408125c8 3f498874", + "c20800ff 41825134 40370b10 00000004 40000000 3f000000 -> bf5bd4b5 3fe28ceb 3f2597a8 3fbcbf89", + "40ee18b0 4211a634 40a00d70 00000004 40000000 3f000000 -> 3e83bfc8 c0310f18 40176286 3f978736", + "c23e75d7 c205814a c119cf30 00000004 40000000 3f000000 -> c0473355 c056a1ce 4064108d 3fbb74f9", + "c2453a3e c1898414 41fb4328 00000004 40000000 3f000000 -> 3d585610 402186a4 c05c3380 3fbc1e63", + "c216fb24 422669a4 c225d062 00000004 40000000 3f000000 -> bfd8d0d6 bff55e2c 3ff9a560 3f097b86", + "c1628ec8 41e6e6e8 c0ee0080 00000004 40000000 3f000000 -> bf04423e 40414a20 406644b0 3f91e19c", + "c1cb8959 c21a4774 c1ff6df7 00000004 40000000 3f000000 -> 4053413f bec832b8 3f634b48 3f9441a9", + "421c76ec 4132e424 c10faff4 00000004 40000000 3f000000 -> c059cadc 41138eb0 4078f83e 3fde8a3d", + "420ee61c 41c3e528 c2438072 00000004 40000000 3f000000 -> beec4010 c0bb8377 bf329fda 3fa1717d", + "3ffeafa0 c0f65338 c1964ff2 00000004 40000000 3f000000 -> 400ccb20 3e2c1609 410233c6 3fdb0fb2", + "c1d6f911 422f9e5c c1defbce 00000004 40000000 3f000000 -> bece9af0 c09e7b39 c021a726 3fc43845", + "c215c25c c220896c 4223e976 00000004 40000000 3f000000 -> c04952bf 40cd48cd 3fb5f1d0 3fdcec2b", + "41af6054 c145d7ac c230463e 00000004 40000000 3f000000 -> 40878b96 bf02479f 4068b6c0 3f70887e", + "41e5a838 411b4cf4 42439582 00000004 40000000 3f000000 -> 3f8b39f0 c013059e be3a9f58 3f726e62", + "41818d6c 3ecc4680 c23f8a50 00000004 40000000 3f000000 -> 3fb36ddf 3fc85612 c090d437 3fb12797", + "c221cf4a 41f9dcf4 c231d415 00000004 40000000 3f000000 -> 3f46aa72 c0046a62 3fb509ca 3fd615f4", + "422882d4 c18f8da8 c1dd6c24 00000004 40000000 3f000000 -> c054dc8e 3f18670e 3d977020 3f5fbe2a", + "c2270059 c215fa85 4193ffa8 00000004 40000000 3f000000 -> 3fde0722 c0b0acd4 40a49729 3fa13fda", + "c1baa6d5 c1b8efd3 c233906f 00000004 40000000 3f000000 -> 3fd8dcda c0896764 3f74a1b2 3fc53d99", + "c218a350 41adb9f4 c2184c61 00000004 40000000 3f000000 -> c0a7a1c5 4016b630 bd6b67ac 3f8e7b1d", + "40782200 3eca5680 41c29238 00000004 40000000 3f000000 -> 3f89d28c bf8bfc9a c0629459 3f8b7e84", + "c2234bd4 41dc8498 c1318198 00000004 40000000 3f000000 -> 408e16f4 403bd988 4069407e 3fa16196", + "41147dec 4246c738 41fde620 00000004 40000000 3f000000 -> 3eb8bf67 40426c4e c08916db 3f8cae9c", + "c201b9d8 415eb090 c10c5a84 00000004 40000000 3f000000 -> bfa835de c0234294 404cb694 3fcae572", + "c155e74c c084c640 3fdca9e0 00000004 40000000 3f000000 -> bdc47f08 40acc577 bf865357 3f9cef46", + "c1f698fa c1d89f96 c21cdf84 00000004 40000000 3f000000 -> 3ed9f67a 3f709720 3f2ef514 3fbc7774", + "c13186b8 41d16acc 422d041c 00000004 40000000 3f000000 -> c0ece2d3 beaaec34 c00199b0 3fc1517f", + "423653a2 411dcaa8 c21f0392 00000004 40000000 3f000000 -> bfe1b397 400511b8 c0889788 3fcbf134", + "c22471e7 c20c7c2f 41fb31c8 00000004 40000000 3f000000 -> 3fac0ee0 4003d654 c111646e 3f8410e2", + "40682440 420f910e 4203ee7e 00000004 40000000 3f000000 -> 3fa283e0 be110a88 bee4a9f4 3f87efaf", + "420f79e6 41214de4 417eb468 00000004 40000000 3f000000 -> c04d004a c0143860 c0b147ec 3f9f6110", + "42300624 c1c95c0a c222c16f 00000004 40000000 3f000000 -> bfb1e66c c0e232c9 3ffb5663 3f87444d", + "c1cb6736 40e09448 41b6ac84 00000004 40000000 3f000000 -> 3ea7e8c8 bf87de0a 408f09b8 3fcdd90b", + "41535860 3e889d80 41fc4e80 00000004 40000000 3f000000 -> c031d92e 406c5e3a 3ddb1c70 3f9f518a", + "c1d18e48 41c47958 41911a10 00000004 40000000 3f000000 -> 3f1e5351 400e7fc0 407b2e0b 3fcbd01e", + "41f8c11c 41acf2f4 41853c84 00000004 40000000 3f000000 -> 4008064d 4082d813 40611dbd 3f997aac", + "c204e57a c22a06ee c238281e 00000004 40000000 3f000000 -> 40837ddd c06b0d11 c084d72c 3fc0c0a7", + "42314f16 41b77cbc 42362792 00000004 40000000 3f000000 -> bf9a3613 3f7ed181 4017d6b4 3fb80a43", + "c1faa0f8 4104b9f4 42222204 00000004 40000000 3f000000 -> 408f71b5 bf8e6382 40cb9e7f 3fb3290c", + "416132b8 c246d9ed 414af9e8 00000004 40000000 3f000000 -> 3f4f455d c0652f3c bf4d8ee2 3fba415c", + "40f035b0 c23162c9 c210c9d6 00000004 40000000 3f000000 -> 40037148 3fe84fa2 c00decfc 3fdebf79", + "42430492 c192677b c238a755 00000004 40000000 3f000000 -> 3f40faa2 c082f128 3eca101e 3fa7a972", + "41ca7884 c0ebffb0 c1e7d585 00000004 40000000 3f000000 -> bf8173ac c0488fb2 c0896110 3fc9cb66", + "c0f2ca10 4232671e 417e76b0 00000004 40000000 3f000000 -> 408e3848 40798524 bfd62564 3fb09df2", + "c140d718 41cd9078 c1c0b7a7 00000004 40000000 3f000000 -> bf5b652d 40844dea c0ca92dd 3fd31542", + "c2192326 41ae358c 420d35fc 00000004 40000000 3f000000 -> 3f266f23 c10e78ba bf0b419c 3fac3c1c", + "c0fc84d0 c1b1a4ec c0d7ad40 00000004 40000000 3f000000 -> be729f70 c00b8dfa 3fc6699e 3f6b8564", + "c20d0560 c1526108 41e32ff8 00000004 40000000 3f000000 -> bff58a71 c0305c9f c023b168 3facf8a8", + "41e82d38 42262ad0 4214951c 00000004 40000000 3f000000 -> 403231bc 40c29f8d 40028a36 3f8f7fa2", + "41a30b14 41caad3c 418446fc 00000004 40000000 3f000000 -> bfa3e2b2 3ff651af 4093b872 3fa8a3b0", + "c1f9c6e4 4127fedc 40d763b0 00000004 40000000 3f000000 -> 40b00b87 3e041649 3f8686d8 3f9b96f6", + "c21f6838 c23130a0 c0ac5fe0 00000004 40000000 3f000000 -> bf55e6d8 bf9b0a89 c031f3a2 3f9ac39f", + "418de230 c1c79769 c0e47cb0 00000004 40000000 3f000000 -> bf47071e bee77bc0 409f82f5 3f96e4aa", + "4164d170 c230dbb4 c1a80d23 00000004 40000000 3f000000 -> c07fcdef bfa363a6 403e2046 3facaa86", + "c08bb7d8 41c2e790 c2146e0b 00000004 40000000 3f000000 -> bf6cd0fe c014f588 4091cec9 3fa5edee", + "c13f1728 40cc26d8 423cf622 00000004 40000000 3f000000 -> c0bf8394 bee1acae c025e1db 3fce40ca", + "419d06cc c22c2d56 421213b8 00000004 40000000 3f000000 -> c0b842a2 bf681908 4030d86e 3f86f760", + "c23313fb c1e0456f 41b3f114 00000004 40000000 3f000000 -> 4004a9e6 bff28b87 c07d4cd2 3fd19a53", + "c1f497bb c0e79f48 41966af4 00000004 40000000 3f000000 -> bfc24331 c079fd6a bda58890 3fb3fd5a", + "c1698748 c1f22418 c11d7a38 00000004 40000000 3f000000 -> 40947279 3f1fc022 bf0c1f5c 3fbfb825", + "c2053c71 c2344946 418a52d8 00000004 40000000 3f000000 -> 402dd345 40432d49 c0a8ce5c 3fc775f2", + "408f8df0 c1d2eba1 c17e6264 00000004 40000000 3f000000 -> 40609113 406e766e c10e6be1 3fae3df9", + "c2234ecb c1b19b1a 419ff1b4 00000004 40000000 3f000000 -> c08e0e07 bf31f46d 3e0fd0cc 3fcc4ba1", + "41fa6054 c0c0a1e8 c0519850 00000004 40000000 3f000000 -> be072c78 404c49c5 40a932d6 3fc7d95b", + "c0f1d360 41de7614 c1dfed85 00000004 40000000 3f000000 -> bfd21281 bee67500 c082cf3e 3fc9c76a", + "c20eef17 4198e334 4147cfd4 00000004 40000000 3f000000 -> 3f9daa7a c015c4f4 40976286 3fc7fa83", + "41781820 c1108e68 c16d6828 00000004 40000000 3f000000 -> c064c192 3f98f042 bfb26640 3fdf1bc0", + "421f9efa c244fddd 419307ec 00000004 40000000 3f000000 -> 3f2a7504 bfeaae34 c0e03af5 3f9f02a2", + "41f01f90 c211cf77 c1377648 00000004 40000000 3f000000 -> c04d3265 c058cdaf c084b1d2 3fa93cbb", + "4208f3ec 4222e3a6 414f0d28 00000004 40000000 3f000000 -> 3f7c1a16 40764999 bfed2054 3fbc9f41", + "41ce7d14 c18d5a2e c232b9a9 00000004 40000000 3f000000 -> c0d19af6 c0ebb958 bf3d57e6 3fc08039", + "c23d3108 c018f340 c244926e 00000004 40000000 3f000000 -> 402c348c 401f2984 3fe0eaf2 3fb84158", + "413b4010 42249746 3f3a6640 00000004 40000000 3f000000 -> bcce7980 3f686e30 c0918ed7 3fb83acb", + "41e65518 c1a8edfc c1ab5b30 00000004 40000000 3f000000 -> bfd7dd24 4014db7c bcace5e0 3f7ce58c", + "c1b60570 4219533c 414f9b9c 00000004 40000000 3f000000 -> bf8a2a46 405af386 3ec1639c 3f742a6f", + "c1234b14 414c99c4 c0baee10 00000004 40000000 3f000000 -> c03d1a07 bf06433a 3fc7ba56 3fad8cd9", + "3ef7a580 c2335cc6 41bd34f8 00000004 40000000 3f000000 -> c0b4b824 40a971af bf1bdce0 3fca65d6", + "c22ebe7b 419f3050 41e6231c 00000004 40000000 3f000000 -> bf914dbd c09aa6a8 c0865c7f 3fcaf898", + "c2340484 c1b9b6d4 c2374b69 00000004 40000000 3f000000 -> c0234901 bf0309f0 3f8af55a 3fc7c656", + "4243a576 41c3c3f0 c21fa65a 00000004 40000000 3f000000 -> 3f2f2580 4045cd32 4086f1a8 3f87d35d", + "423644fa c1c88572 c14ec4c8 00000004 40000000 3f000000 -> c02e79c4 3f810a2a 3f72f558 3fb9651c", + "c22bca6f c2320e61 c2196725 00000004 40000000 3f000000 -> bfbc99be bff3090c 3fbafd7c 3fbdd46e", + "c1097f70 c1242590 c19e6b83 00000004 40000000 3f000000 -> 4005ebcf bfce8a17 be855304 3fca1427", + "c1e6c8a8 40240e50 41dfb4ac 00000004 40000000 3f000000 -> 3ff42693 c0844240 402bbd40 3fc03a3b", + "c218f5a5 4212db7a c217ac9c 00000004 40000000 3f000000 -> 3fcaf2b9 bf05bd9f 4006a2e4 3facf540", + "c22dac72 414a86c8 c2165119 00000004 40000000 3f000000 -> c030ff8e 4092ab66 3fb56e01 3fb02cce", + "c23262f2 c11c75d0 3f428600 00000004 40000000 3f000000 -> be889c30 c04779fd 40a37392 3fc71f35", + "42318032 c181f6bc 420e406c 00000004 40000000 3f000000 -> bf20a374 3fcdf12e c0806b68 3f66b710", + "421d28cc 419bfa0c 4146eb04 00000004 40000000 3f000000 -> bfe54590 bf2d24d6 bf14ce88 3fd3af41", + "c1bb966e 423ed37c c1e96792 00000004 40000000 3f000000 -> c050c02e bfd03225 3f3ca737 3f9c7c8d", + "423ab8fa 414caa38 c2054ab2 00000004 40000000 3f000000 -> 3f6c93fc c0a2ae2e c01c7c31 3f87062f", + "c115c030 4204e594 c2383446 00000004 40000000 3f000000 -> bf33278e 3f8b0668 c089e371 3fd8438c", + "4226039a c1ee7091 4203619c 00000004 40000000 3f000000 -> bf9b0298 bf2b7178 bfe8f93f 3fdb4c00", + "3fa9c160 42418d18 c1d7a057 00000004 40000000 3f000000 -> bf92b816 bfa70052 bf002f7c 3f9cb250", + "c2102800 c1a558c1 40262550 00000004 40000000 3f000000 -> 3f9ca51e bf48e824 40146c9d 3fbb5c5f", + "4236c028 4232372a 4204bcae 00000004 40000000 3f000000 -> bf810cac c00e2997 3feebead 3faaa108", + "41857c54 4241a7f0 41620b90 00000004 40000000 3f000000 -> 40401c84 3fa34a2e 4025a531 3fbd1459", + "422705b0 422e0868 c17c0250 00000004 40000000 3f000000 -> c06fe9ab 405fe58b c051a3d3 3fc8491f", + "41153e38 c2433b37 4224b8a6 00000004 40000000 3f000000 -> 403f8abe c00a45dd 3fc2c342 3f95fafd", + "3fc1cc40 c200f33d c1602d98 00000004 40000000 3f000000 -> 3f4a4420 c00e2496 be108b4a 3f8b3b26", + "bf4879c0 c20c94a4 c0fee6f8 00000004 40000000 3f000000 -> bfabb014 3f884cd2 4044a390 3fb485c3", + "c22281f9 c1cc3a9e 421f1658 00000004 40000000 3f000000 -> 400279a0 c05ed5de bf9d8534 3fcc0e75", + "41349418 41a8f4d0 c23a0a1a 00000004 40000000 3f000000 -> 40b6f5ed c061e89c bfffe8ba 3fc31808", + "c2277856 c20bb00c c0f13030 00000004 40000000 3f000000 -> 4047704b 4052d716 406d090b 3fbaff23", + "c1a3656d 40827810 c102aa2c 00000004 40000000 3f000000 -> 3fc0103f c06765ea c0194596 3fbfc04d", + "c1b24b7a 41f35060 c2364efe 00000004 40000000 3f000000 -> c08cceb2 c057c390 bf5381e4 3f068a0a", + "c18843d4 422e68a6 41c78bb8 00000004 40000000 3f000000 -> 3fe133cc 406ec9f8 3d177640 3fb65a26", + "41e9fc28 411dda78 42452b8c 00000004 40000000 3f000000 -> c0cc4987 4011c4cc c011bf86 3fb1e8b0", + "40d64a98 c2344cb5 419a444c 00000004 40000000 3f000000 -> bfa10904 3ef72b24 bf8cc006 3fbc031a", + "4201b5e2 41fa80cc 420020cc 00000004 40000000 3f000000 -> 40faff46 c032144b 3d951890 3fb7d03c", + "c214ecea c1202b24 c23e450c 00000004 40000000 3f000000 -> c0671420 bff998e2 3f28cba8 3fcb860e", + "c0492fd0 c23f900d 420621bc 00000004 40000000 3f000000 -> 3fbe4293 40753ba2 bf55f460 3fba397d", + "41f81968 c235a608 c2348f12 00000004 40000000 3f000000 -> be17535e c0319bad bf9119d1 3f4ebb5c", + "414d2ff4 c179937c c1d4867b 00000004 40000000 3f000000 -> 40b5d676 c0588518 bf9e8d3f 3f91eb4e", + "41ed8d90 4108da04 420557fa 00000004 40000000 3f000000 -> 406cde2b c02f2929 404b7aad 3f9f3c84", + "c1e2ae2a 4142e198 c1291a6c 00000004 40000000 3f000000 -> 40f831a9 bf912122 c050000f 3fcb142e", + "4229a9f8 c1931569 c1e9c6d0 00000004 40000000 3f000000 -> 40924fcc c042d9a5 bf6361ec 3f7c7320", + "421307a2 c1fb9f67 c1ceb7c6 00000004 40000000 3f000000 -> c0328769 c07c5aed 3fe85ece 3fbe731b", + "4130baf8 419fc00c 409fa5e0 00000004 40000000 3f000000 -> c0e2b87a 400333c6 c0deb02b 3fbdb37a", + "c0e84350 402b4b40 c1f3a133 00000004 40000000 3f000000 -> c0c088da 3faa1f96 409c3b2d 3f604c91", + "c1ec179c 41e6de48 421f3a02 00000004 40000000 3f000000 -> 3e8c9ac0 409291e2 bfe46acc 3f7e1fce", + "c1e455ca 42357494 41c8b578 00000004 40000000 3f000000 -> 3fdd36c3 bf225174 40158a26 3fcf425c", + "c11f83e8 4202e048 3ffbe200 00000004 40000000 3f000000 -> 404f4ab4 3fcc27c8 bf89e7a5 3f71b1b3", + "4104cee8 c0532700 41ce9c70 00000004 40000000 3f000000 -> c02120e6 c0f3d537 bf8a7c5c 3fa7e3c8", + "42464014 41a12434 41133614 00000004 40000000 3f000000 -> c0ef075a 3e7314ac bfe23d9d 3faae50b", + "3fc12320 4246374c c242bfe2 00000004 40000000 3f000000 -> bfe26f74 bce73d60 3ebecfd4 3fd379dc", + "c2082c6f c16f7e64 c0e828e0 00000004 40000000 3f000000 -> 40282e88 408777a7 40936413 3f92c1dd", + "c1a12e80 42200bec be9a7280 00000004 40000000 3f000000 -> 40c0bd28 407b36e0 c0106d75 3fa8e4d2", + "413410cc c1bfe91a c1e4762b 00000004 40000000 3f000000 -> 4025e1ca 402f0953 c05d8ad1 3fd286d2", + "41e22db0 420f3e46 c18ee028 00000004 40000000 3f000000 -> c0bb09e8 3fc8a343 bfd4bc8b 3fc1880b", + "c1aba603 c13bab88 3ff4a860 00000004 40000000 3f000000 -> 4026c90c 40755e65 400b8715 3fd42020", + "420d4188 c0f541a8 40b15fe8 00000004 40000000 3f000000 -> 403dd933 3f7468a2 3e47a3a8 3fa4ca6a", + "c182fa80 4103c6b0 415307b0 00000004 40000000 3f000000 -> 4044c306 4075c81d c0abf918 3fbd36dc", + "c22702c2 41fd13cc 41ebb040 00000004 40000000 3f000000 -> bff992d1 bfe7f14f c047dea6 3fbf7bb1", + "4215da56 c17e2708 420ba7bc 00000004 40000000 3f000000 -> bfe700e8 be13d052 4015eb4f 3fce8c04", + "c0a18d08 4214c78e bfcc39a0 00000004 40000000 3f000000 -> bf176118 c07c2786 3fc22330 3fc2e6b2", + "416f5a60 c221da5b 41a35174 00000004 40000000 3f000000 -> 40df6862 bf7de1ce c0b8631f 3fa8ad06", + "406b49e0 c1b9b7f8 c2016bb2 00000004 40000000 3f000000 -> bf2bd234 be25dca0 bfcaf460 3f50dd37", + "41d66904 42228b72 421b6338 00000004 40000000 3f000000 -> 403461cb 4091c421 40574824 3fd78b1a", + "c11e4460 412343a0 419ad244 00000004 40000000 3f000000 -> c0419d36 3f69bcac 403ce78d 3f9a3ad2", + "40695d20 413c20b8 423ba202 00000004 40000000 3f000000 -> c0765c02 bf62eada c0005575 3fad8c53", + "c1f161bb c1a1f28c c226478e 00000004 40000000 3f000000 -> be1f6090 3e69d870 40483bd1 3fb6d51c", + "c1d0ae14 c20f0174 c1b18b63 00000004 40000000 3f000000 -> 3f8b9082 bef81e2c bfde3c5c 3f8ff454", + "c2395e77 c20079a7 c10ae984 00000004 40000000 3f000000 -> be83aac0 bea813c8 3eba41fa 3fe46018", + "c13e0738 c22929ae 40596810 00000004 40000000 3f000000 -> bfdba32e c0923ebb 3f4cfd58 3fbd7121", + "41548b14 c0f38cb0 40bcad78 00000004 40000000 3f000000 -> 3efe8f04 40003dfc c0d01e92 3f9dadf2", + "416c8d80 c206ca2c c132f070 00000004 40000000 3f000000 -> 40857097 4086fb64 3e0bb9c0 3fb837b8", + "41b84d70 c212bfbf 41d23140 00000004 40000000 3f000000 -> c00293cd 3eced468 3f8e9433 3fcfbc48", + "413b9cc8 41c6f0c4 c21a0ee6 00000004 40000000 3f000000 -> c0810aa9 3f9cbb44 40b2931b 3fc26783", + "c17bbc2c c225f2fa 3fd98b40 00000004 40000000 3f000000 -> 40aa14e4 40517f5c 40208d86 3fb2d3f1", + "4185918c 422e13da 424020c6 00000004 40000000 3f000000 -> bf2ad675 c0a6ff98 406ea093 3f82f9ae", + "422f58ca 40933b68 c1f0fc90 00000004 40000000 3f000000 -> 3ee9e5e4 3fbeddc9 bf8e5abf 3f8005fe", + "4202361e 418d1664 c236907d 00000004 40000000 3f000000 -> bff278d5 40806ca4 3ffdd53e 3f9953b4" + ] + }, + { + "glsl": "CultCellular cultmath_cellular(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "41d3de94 c1e7b52f 41b79204 -> 3e314244 3ef597a3 bf5c3642 3f757ae0 bd81641f bfb3fdd7 3f9c2abc 3ce7f740 3ed72af6", + "c1eb3838 4134d438 42269f4c -> bf319c63 3d2a24e2 bf380ecf 3ee2808e be4dc6dc 3e0146a8 3f9100a5 3f004a00 3eb754c2", + "c1a739ca c209c994 c1f7649c -> 3f64fb87 3e181e95 3ed7eec6 3eeb93f9 bedeb74e bf3e4cf1 bf8a69ee 3d5836a8 3f7f2564", + "4163f730 c211ee42 bfe05f00 -> 3f0e3ea6 bf10a76a bf1c222e 3ece71c4 3da9a5b0 bdf94ac8 3e866772 3ebf84ae 3e82f232", + "c18864ec 41ca9710 c0c32760 -> bf2f9248 bebaeaee bf212bcc 3f543d38 3f97f1a9 3ebddb7c 3fbf57c3 3cb9ff60 3e88e6e2", + "c19bb584 41f4de34 bfc70260 -> 3f5a0da7 3e98c7a7 bedc7bf2 3f06db14 beebb173 3e88d07f 3f9407b7 3e3ae904 3f5be013", + "c1eaed3d 41019fbc 409c72c8 -> 3eb6f1ac bf0fd222 3f3f024c 3f3b0d3f beb0d25d bea5cd0e bf9aed45 3e594768 3f47ee8e", + "423bc758 421e9802 c2310e79 -> 3e85e4c6 be5cb2b1 bf70da39 3e886bf5 3e9115c2 be074899 3e360a88 3ef025f9 3e7ad68c", + "41d0dbec c1509cf0 c1cd1aff -> 3c4d565b be319e99 3f7c1959 3f3eabef bf37def2 3f1c6050 bfc56490 3d00e830 3f7885d9", + "c0d6d930 c0b6d4c0 4046ee60 -> 3eb3ed6a 3e92c309 bf642966 3f27f941 be064387 3e31c2b4 3fe02a12 3b79b000 3f5a48b5", + "c183d66e 41f5d950 41c60670 -> 3f132f6d 3e74a012 bf4854ac 3f462f4c be522012 bf015141 3fd61b5e 3d22ffd0 3e020528", + "3fc4c580 42193416 4235106c -> 3dfb082e be6c99a4 bf77169b 3f01ab95 be446f75 3dbc695c 3ff9fd7c 3b705800 3e82d7de", + "417deb88 401c2d40 4000b340 -> 3f347f2d 3f338d8f 3dd64fa7 3efbd69a bfbed462 be7c9af0 3ea11675 3db7ec40 3f7d6d79", + "420a7954 c18af7d0 411507d4 -> 3f5a8925 be64af66 bef0e957 3ea809f5 bfa94f86 bef6843b bd7c81a8 3ebe8afb 3ea6591e", + "4229a368 41a02650 4233fb48 -> 3e14c2a2 3f75b1af be762a21 3f5667c5 bdc0f380 bfe8be54 be8a1dec 3d2b5550 3f0139db", + "c23a30ae c182098a c1fe6f5f -> bf7ccdc5 3c4ee3a7 3e20c9af 3e9b22d9 3fd2edf8 bf0abade bf309120 3ef81a03 3e40bb6c", + "40842d90 4154ce34 41bff0a4 -> 3eed729e 3f3bcf86 befe4e2f 3f4573da becfd657 3e850122 3f187c70 3db3e038 3f14a8d4", + "41ab7398 413eb2f0 c221dcbd -> 3f08761d bf542d92 3e2e1dde 3ee33147 bfb63922 3fa38e31 be78e03b 3d9f67e4 3f06486c", + "bf07b580 41ec4fe4 c194e532 -> 3f54d41c 3f090e19 3e18a039 3ee033ac bfe286f9 bf1c0e7f 3e41022f 3ec58d96 3dab4668", + "4189aef4 c0b05090 c1cd476e -> 3f210e54 3e40e71c bf410ec2 3f0fab11 bfbe4873 3ea21f58 3f5a4810 3dc7f910 3d9bb8d0", + "418a5998 420f3e40 41aa2208 -> 3eb2e919 3f6c7ac2 be208f05 3f3d4934 bcb97f30 be66f89c 3f4b3496 3e30f084 3e0f9c6c", + "417f7b30 c19a2dfa c189b5d2 -> 3f57634b 3de8163b 3f074958 3ee43994 beb8670c 3db53425 bfb0d600 3ec6aa84 3f08faad", + "41bbf3a0 41fb4ebc 42141772 -> bd414e31 3eb451bb 3f6f4b14 3f5a318d 3e0cbb33 bead2a57 bff71ca3 3cccf560 3f26dad9", + "bfaeab00 416aa968 c1aea773 -> bf0237df 3cd17cde 3f5c4f46 3ed7189a bebe658c 3e22b9d7 bed9137c 3dd3e1f0 3f2778e1", + "4239bcba c15fbfcc c1c43850 -> 3f353c78 3f3212f2 3dfa526c 3eb7d9ea be9bbf70 bfc6c8c4 3e49a08e 3e803122 3eb577dc", + "42364c66 c235dc10 c1f2f650 -> 3ea7f9ec 3e06ec09 bf6f7772 3ec331ba bf525f36 beadb1fc 3dba2568 3ecae102 3e1cad40", + "c21d09c1 41b53d48 c23b2277 -> bdc30b22 bf3f83e3 bf281e1a 3f26dd88 be4ae32b 3fc889a0 3e26d186 3db339c0 3e163378", + "c22f55d0 421c9f28 41f7e3b8 -> bf150a41 3f054b9d bf1fdc50 3f5632fa be8d1988 bd7d3f70 3f5b2baf 3cb00160 3ec73376", + "41e8ed24 41416bf8 c1f9802c -> bc17c03c 3f62a3e6 3eee07b2 3f1a3337 3f357c8f bf1fb22a bf909d0f 3c7ee6c0 3e84cf06", + "41737fd0 c23fbafe c224f3db -> be991ef1 bf650646 3ea9f7d1 3ecd2b02 3fa62483 3f5b0e72 be9d1770 3ee61f26 3f092173", + "415e0c10 4242a368 c228331b -> bf36aa62 3ebc02a2 3f18bfce 3f35c7ab 3faf2c38 3daf5244 3c072780 3e1a7388 3f40a45e", + "c1b2a22a c202b376 c04ba280 -> bf164455 3f36bad8 3ec39bbf 3f001d88 3f2f4dac bfa3059d bf9a392e 3eda938c 3e9e86fc", + "421830f0 c1bc76c9 c12b5768 -> bef6b801 3cb1b0e0 3f603fc1 3ed93b2c 3f9b7afb be0ad3e4 bfc5fd86 3dbce740 3f3754ac", + "414358c4 c1a054fc 40153de0 -> bf092bc0 bf0add9f 3f25a3ba 3f672f0d 3d8d98fc 3fa9f79a bf86dcf2 3d93b168 3ee7204c", + "c1969e44 c23204f7 42428932 -> be93c075 3d415e0e 3f74cf8b 3f1692cf bd5de438 3e153c20 bff016a1 3d389240 3ee65932", + "c0859f98 41c7fa24 c1c0c6a1 -> 3eac3cc8 3f62d84f 3ea33aa3 3ef81a2f bebc4767 bfdbd254 3e71e34a 3e6c1972 3f242b60", + "42083f6c 40794c50 41c80800 -> 3eb5fcc9 bf4a3178 beffec17 3ed12844 bf73c102 3fc160d5 3e17078c 3eb07348 3e4c5050", + "c218f770 40cf09d8 41aeae94 -> 3d8fb200 be9b6205 bf734399 3e775b52 3f2400fa 3c43ab20 3fcb917d 3f16e4a8 3f4258c2", + "c1e70281 41320a6c 423a9f18 -> 3e80567b 3f211c3c bf3c5027 3e81b85b 3f232624 befc8013 3f966302 3f193778 3f501626", + "42211f2a 4213683a 41951c08 -> bf291d1f 3f25cf7d 3ec25abb 3f2523ec 3fc113ea bf053e62 3e0a721a 3cd7d500 3e375c80", + "c2101ad3 c226e625 41eac4b8 -> 3f6e0ca8 be1c3f84 beab60d4 3ee4059f bfdb4118 3e84675b be8e68a6 3ea00acf 3f198225", + "41e21698 420b07a4 41800de8 -> 3e303564 3ec96bb1 3f6732de 3f3c3e2b 3f2e394c be7a24a7 bece012a 3e9004ae 3d15e5c0", + "c1ee413f 41961b9c c1fa78f9 -> 3f2f3070 bf287b59 3ea0bb22 3f092994 bfcc70fa 3ee3c61c 3d0c1bb0 3cb16240 3ec111d6", + "41e53c00 c229e48b 41e0bea8 -> 3f4a530d 3f178e89 3e218f8e 3f1ca33e bf6bb3b0 bfc6143e bed84f90 3da074b8 3f04a2b1", + "41f2b564 bfbbfe40 c0e9b6f8 -> bdd8be7d bf2c42fa bf3b6ca5 3e9cf594 3f8bc3b4 3f0e4d24 3f1d2f18 3f281bd2 3ed2fb68", + "3f626b00 41c7f2a4 4206a420 -> 3f43bfc6 bed31c46 3efd95d8 3eefb7d7 bf30be0a 3fb45f78 bf060968 3f01610e 3f4b1e78", + "420168aa c185aaf6 42145dec -> bf7a95bf be1ba749 3e0c3997 3f02cc06 3f3edb12 bf133ce8 3f02383c 3e99d906 3f629c09", + "422ba33a 41f94110 bfe9f860 -> bf7024ad 3e9726a6 be39b644 3f6b9e65 3fa182f6 bf504c76 bf1c2f04 3b7f7000 3ecacd44", + "c181efb6 4007a760 c0f9eea8 -> bf202e23 3f446dad 3e0fe604 3ec0d2cc 3f8da9fe bf6f610c 3f384fac 3eac8c66 3f451c49", + "c15e2994 c22dcfd5 40c64f78 -> bdc008b9 bf118853 bf513ca5 3f3df35f bf2ed3a8 bd737fe0 3f5def8d 3e421000 3f717ea2", + "3e26c100 423f11c6 c1268e78 -> bf1b9ed7 be1b5fcc 3f4785e7 3e9d69dc 3f9a766e bef45d2c be913d5f 3e8af708 3f7cabc3", + "41a53844 bfe1df80 c1e288b1 -> 3d084a06 befdc654 3f5e2d8d 3dba6d5a bd8c220c 3fa43e54 bfbdd960 3ec53cec 3f72281c", + "41b7e304 403a5910 c1ea1936 -> beaf970a 3f6f9fc7 3da1a712 3ee4bcc6 3f868585 bfae4723 3ef829ae 3e9aeb42 3f719645", + "c18afb84 c1c326a6 c22f10bc -> bd558ac2 3f18b0fa bf4d0b63 3ef2e4c6 3f0c1857 bf9b3588 3fb4eed8 3eb34a48 3e5d8678", + "c22b26d4 c2325e95 c0686b00 -> bf500699 3e4993c5 3f0c6f17 3ec17453 3e6b1374 3ef04e8c bdab1b08 3ed2df51 3f789f87", + "423ba4ae c194a445 c2283ed2 -> be4a2740 3e85fd1a bf71dac6 3f236ba7 3f92fc74 bec62be5 3f9d2461 3e84baae 3f06137b", + "c1a6e3ae 41a1ea28 42108948 -> 3e89acd0 bf6311ec 3ec036ec 3eb97af1 3d3ce870 3f2cfdc1 bfa67d40 3f052d90 3f183004", + "c2140509 c2284980 4063db40 -> 3f65b8c9 3e80a5e7 beb9c17e 3eef0237 bf2bb5e6 bf7b3550 be905d80 3e94c2c5 3f349712", + "41fc6030 c1e77c1c c1b70d5d -> 3e4aba11 3ee85edb 3f5e6a31 3f1292f8 be0994c4 3e1418fa bfd56dfe 3d2cfc10 3e95f736", + "c1969bc1 c0afe6c0 c18ae5a2 -> 3e529c28 bf167abc 3f484c86 3f1f0a59 bf63c385 3f8411fe bfae3b86 3d168800 3d8a9e10", + "c1d1766f 420869c6 4143768c -> 3f558579 3f00cd9c 3e67aaf4 3f102aeb bfaa1b7b 3e33e638 bf44ca81 3e615a4c 3d570d30", + "4147e650 c1ac1181 c220f652 -> 3d4d1338 beab1157 3f70f28c 3f1846a4 3f5d67ae 3e35e3d3 bf11b498 3ea0275c 3eb76474", + "c137f438 c2214170 c246d0f6 -> 3da5ad83 3f0da90b bf54399b 3ec7a586 3e2bb9dc bf239efe 3fe59b62 3d68d208 3e68c048", + "c1e7e50c 41df3054 c1df587d -> be43549c 3f3e31a5 bf243fad 3f255bb3 bd812740 bf948e6c be6c6138 3d4bc750 3e9dc7bc", + "414ec2f0 be8cca80 c2294228 -> bf52c00b be4bd1c4 bf081a51 3e9529ba 3f0153f4 bdd4984c bebbc684 3e3c4e9e 3eaefb50", + "41f6dd50 420eca10 41cdfe3c -> 3e264558 3f49ff05 3f17ad1b 3f40525c bf1f014b bfd69f44 bf21d07c 3cfcc3c0 3e2760bc", + "c240c913 c1527220 c1ea66d1 -> bf77d75c be800f6b bc52e278 3f319d1b 3ff77824 3efbe344 3de5a0ca 3db60fd8 3f55ce3b", + "c17bfc0c c22c188e c15b13a0 -> bf4d067c 3e176d3f bf148d20 3f19c1ed 3fc1cd50 bd8c589c bdedef08 3cea9400 3f2d32f6", + "41a08150 c14d50dc 421f5b46 -> bf6624ce 3edefcca 3d3ca10c 3f455c62 3fd1ecff bf7c4e11 3ead97ce 3d642650 3ea5a4e6", + "42101eae 421c6c08 c1b6a1dc -> 3eb281f0 3f612321 3ea5ed7d 3ea98441 3e6e027c bfd014c0 3a521200 3f1d7ed6 3ef56e3a", + "42324256 c1030278 c2265d97 -> bf45a02e 3ef15cfb 3eda5237 3ee137fb be61d1a8 bee09adc bf0b4f0f 3dbf101c 3e475734", + "42186636 c224c28a c107f464 -> bedea61f 3ee26133 3f48d35b 3f17faac 3faedec5 bda90fb0 bf57a28d 3e818020 3f44da1f", + "c0bf72f8 c0a90340 41d75458 -> 3f55f9d2 bf073510 be1953be 3f378c7a bfbea82a 3f4abd9e 3f5beaca 3e68ac30 3f27fe63", + "c1564174 410686ec c1e22166 -> bf24fcb4 3f3cd825 3e4e0828 3f239123 3f8f2c8b bf0a2016 bf879104 3c133b00 3ead7cd8", + "c2296ddb c2277f51 42295ce8 -> bf56d1f3 3f0a6940 bd73013c 3f0f1781 3f91187c bfb38bd5 beb4dbc0 3e566b40 3f73123f", + "4160d618 3d947600 41034050 -> 3f5c3ccf 3ebfdd45 beb0f507 3e3cc1f0 bf0db192 bf798f74 3f8acc3b 3dc529dc 3f404110", + "c0840120 c2453e8e c16a2074 -> 3eb4cb9d 3f2609a5 bf2c9d4c 3f5581dc bf376206 bfca04f0 3f1cf39e 3cb73ca0 3e8b6564", + "3faf4640 c1a5099a c2296051 -> be8d5bbb 3f1103f0 bf46c613 3ef2807a 3f7235ce bf87e236 3faa2e42 3de5a8c0 3f2c12c2", + "c2183f68 421e43cc 41d904a8 -> 3f1cb952 3f3617b3 beb0d0b8 3f198932 bf9e8866 bec643a2 beba31e4 3e584070 3d1e67a0", + "c1c0bae9 4229b8ec 42254b76 -> bf6e14e2 3e97cc4c 3e5e70f6 3f330a60 3fe4766c bf483f97 becc9de0 3ea4283c 3dedc1d0", + "c1f0a334 401e4450 c1eb5af1 -> 3f2a8da8 bf3c548f bdfa5835 3e8b3b6b bfb5ae38 3ea167b8 bec4782f 3e0edebc 3ee5c8ae", + "41b8fff0 c1bc69ba c15e9cdc -> bf7b43ae 3d896881 be379df4 3f0531c2 3ff023c1 be17a68c be853558 3e5053b4 3e46a980", + "c2114ea8 41c6950c c1115c2c -> 3d7ba4e3 3f7f4fcb bd239f1c 3cf21ea7 3eca2b99 bff15f5c bc272a90 3f575d73 3ddeeba8", + "418175e0 c1528be8 c1105624 -> 3f4ca097 3d08b1a1 3f1997b2 3f37cc2d bf32dc30 3ecf8c91 bfbf184e 3e03a5fc 3cbcb120", + "424354f2 41731d28 41e3837c -> bf661ca2 be80af76 beb7c9e0 3f0244ee 3f4a96aa 3f98557c 3d018590 3da45048 3f46ec45", + "4243dd4a c1bb2250 424366c2 -> 3f3791f1 3f31a52d 3d85ea34 3f17e709 3e5759c8 bf25da3d bedf941c 3e826cbc 3f06e1c1", + "c0c10e90 c22ff4e0 4214618e -> bdd014eb 3f6bfa9f bebf8e40 3f0c98a1 bf1f6ee0 bf06ff2f 3f708451 3d97b178 3ee22b14", + "c192e99b c11d84bc 4219aa98 -> 3ebc20fb 3f12ef43 bf3b584b 3f4e02ab bb668980 bfb7e85e 3f8a9581 3e07e970 3f0dc38e", + "42273730 c0d9bee0 c2163bd1 -> be25b83d 3db70fc9 3f7b963c 3eedeb7a beccb8dc bf079472 bfd77573 3e8b8b76 3e3cff7c", + "c244fd46 41d14b3c c1f60cab -> be659d21 bf417882 bf1d82fc 3f02742f bf104806 3f8dd61c 3f8f6a0c 3da5e900 3f73fd77", + "41660250 c1ff21d5 40126aa0 -> beb07456 be023f1b bf6e19a7 3f3b7c9e be9a743a 3f56799d 3f9aa57e 3e346638 3e11d6c0", + "420e5eb6 c2053ec4 c230428a -> 3d6a3b56 3f008501 3f5ceacd 3f095e43 3eb4ea12 3d295e80 bfcc3002 3e8bbfaa 3f0c019c", + "c243633b c177b74c 41fd6b18 -> bf733f61 bd1b92cc 3e9e6493 3eb48839 3ef0d753 bf51de34 bdffdbb4 3eba3a43 3ef4a980", + "40c82100 3ec21780 41c9ff68 -> 3e325e32 bf3a3351 3f29eea4 3f03600d 3e8e2f51 3f2db679 3e686304 3e0d2250 3e5c1e4c", + "c202d8e0 41ed89d8 415d91b0 -> 3f38fc61 3c925255 bf30e7a4 3f0472ae bf9f5a3a bdd3bb0f 3fc50d6f 3e482a00 3f2afd18", + "42318d6c 40225410 4162cfa8 -> 3f30ad2d beebad72 bf0ef3de 3e858786 bf748676 bdd8a618 3fab63c6 3ea454e2 3f7e613b", + "c1a6441e c2141cb2 414f53d0 -> bde20fac 3f7a3041 3e392e0f 3ef75044 3e0e3532 bf20b421 bf8f0479 3dfbb728 3f54f591", + "41e23720 41ff88b8 4211adcc -> bf50246d 3f006055 be976c8f 3f49686c 3fa3d5f6 bf6e34ca bef47c5b 3c3bdcc0 3f75ce00", + "c2371619 42192334 c216ba8d -> bd8a0d6a beb5f932 bf6ea983 3f3673d5 3ecb19e6 3f9b6294 3fa9a4ff 3d5dabc0 3e9dc762", + "c18eb01e 41fa9190 420502fe -> bf61f1f9 beef908e 3d3b3ef6 3f2fc4d2 3f26a7a0 3d9c7750 3f584774 3e84af50 3d8d6088", + "c1d2d6cc c2145162 4242a4e8 -> bec7be28 bf677da6 be31b4a0 3f1254fa bdb47744 3fe41e51 3e19a34b 3d2a4540 3eed377c", + "c1e2a16a c240c5a2 c1fa241e -> 3f2eb528 3e45c941 3f347783 3ec5e68f bf3fe37d bf6cf31f bce0ade0 3ed3fc5d 3f523b37", + "421ac3cc c21309c4 bfbf3e40 -> bf265cdd 3ebf3104 bf2978ef 3f1a89ef 3f0e8d36 bfaea716 3f41f9f3 3da0c458 3e7771b8", + "41b40890 423f4084 42285caa -> 3f5ce620 3e348326 bef28349 3f2322bd bfbb6b34 3e6c2918 be5b1c02 3e1bb040 3f4793b3", + "c2034eca 4216da0e 40b43790 -> 3f4a258c bf165a01 be35dcda 3f4c920e bf92425d 3d0761c0 3f6e6ea8 3dbe3348 3f66e42c", + "c2189e28 c20e9bed 41276798 -> 3e601a04 bf714808 3e815012 3f074e00 bf6f32a5 3f766652 bf736c67 3e604484 3e8b01a6", + "c1cb73a8 423da9c2 4222a2e4 -> bf191fb6 bf4cd801 bd351b26 3f0e9183 3f9f1086 3f96f519 3f354785 3eb1a096 3f621288", + "bfddf760 41ac4990 41530940 -> 3f783428 bd60799c be746daa 3de6f056 3c0473c0 be09919a 3ea9505c 3f081c17 3dca6060", + "40c925b0 42106502 c15d5520 -> 3ef5f639 bf5c6448 3e2b8ae0 3e8fd48c bf972c17 3eaf8d58 3ea572bd 3e5a1fd8 3da6bb48", + "417de378 41fae9a0 c1acc3ee -> 3f74f880 be5fb276 3e43ded2 3eb7ac27 bf396b88 3ee88606 3f409686 3e707a56 3f216c90", + "422e7802 4197e9a8 404c9650 -> bf35a27a bddcb381 bf3247b0 3ec88aeb 3f9e0eae 3f3aca48 3deccd50 3de8d694 3f423b18", + "4241b28c c18b20f4 c148a9bc -> 3e29d0ee 3f6068d2 3ee74adf 3f311ef9 3e189a3c bfe874bd bea215d5 3c8bbbe0 3f28546f", + "41d4b598 423677d4 41df151c -> beb4887c be5c5c55 bf692329 3edc89d8 bed9b7e2 3f57d1ea 3f620140 3d8bef24 3f0b1ae0", + "c09c4c30 c2313661 c12b43f0 -> bf6c3ad6 3eb5ce08 be194502 3f01475d 3f1490ba be8d4a6c 3f8afe16 3e2ee420 3f64dfec", + "c2095224 40d6cd40 c20b5d37 -> 3eee8392 3eb15259 bf507432 3f0435d6 bd9e3d80 bf7b31f8 3fbdb354 3e18be70 3f14b959", + "41a6f090 4131a96c 4230ea50 -> bf1e8982 bec5a9e5 bf2f06c3 3ec4531d 3ea3eec4 3f2c2acc be67f1c8 3e844c9f 3f273541", + "c199b24a 4229880e 41bf7e40 -> bd87f60d 3e03ead1 3f7d4c1d 3ef05ce0 bf00224e 3f1f2175 bfaa24c9 3eaa3ae8 3f03055b", + "3fed7180 c2299e3b 42079f06 -> bf0260cf bea07f30 3f4d2d64 3f01cb39 3fa661a5 be28de64 bed69d23 3e8f0d4c 3ea9625a", + "422a601c 41cb08a8 c109d8ac -> 3f69af1e 3d2006c9 bed01cde 3f42648f bfa2e66e 3f46ea1b 3f5bd5ba 3c0cb680 3f28ac89", + "c16875a0 41762a50 c2092aa4 -> 3f2afe95 3eef2fc9 3f144e0b 3ea82d5f bf4cb37a 3e813021 3dd22038 3edaa281 3f0d1858", + "4202433a c1d96a20 c190fd27 -> bea74d6b be4546e4 3f6cde03 3efbfb17 3e88f873 bf32b138 bef2f021 3e1cba8e 3f101cea", + "c1ef2ff7 41e7188c c1a9689f -> 3f6d3698 3ebed780 3d4ad69a 3e8e7554 bf6ccf60 bfae232e 3ddaa785 3ed60f4e 3ee3a63c", + "c131b2e8 c1fa02ad 40a35440 -> 3f08debc 3f0d3fbc 3f23dd1e 3f1ea8a0 bf9e8824 bfa036ad bf42df0d 3dfe5be8 3f1a49c5", + "c1fe9d3e c16be3d0 c1fa2784 -> 3e5350a2 3f726180 3e7ce041 3f01eadd bf140fe4 bfbfe4f6 3eff81b4 3dd07d98 3f79ac76", + "42024f5a 41eb9f64 4226e024 -> 3e1f9cc1 3f299601 3f3b932d 3f1178a2 3e322d63 3e4d91c8 bf8eb578 3e23aafc 3ec66f04", + "3fae7bc0 c18b3b2e c20cb4e0 -> bf21e897 3e648112 3f3de3db 3f148f45 3f9c3cb0 be42c5e3 3d87d580 3e479124 3d9d40f8", + "bffc0f00 420dac6e c1c80ab0 -> bde6ae51 bf0e95e1 bf52a6b5 3e91a55f bf22761e 3f995cd8 3f7f5eac 3ef98c27 3f297cdb", + "c100fe5c c16eb7f8 421becc2 -> 3d07796d bcea1180 3f7fc15e 3ebd42ce bf3977d1 3f05e12d bfc34f22 3dbb78a0 3e2c285c", + "408ef738 c103ce28 41364c3c -> bf753dbd be526f98 be4cf0ff 3f0d69e2 3f52575c bef51064 bf042fc8 3d8df7d8 3f37a3c4", + "419a54bc c230ad8f 40e75988 -> bf0fef56 be201065 bf4fe35a 3f2df493 3fb55966 bdb1dae0 3fa2b04c 3dd32478 3f3512f2", + "42384bba c10e1f2c c19e257e -> bf3823e3 3f2fb13f 3ddca153 3f18f06f 3f05f16a bf97dea5 bf737ef1 3d3ea6e0 3ec0dc74", + "4142d4c8 4148cd08 42037eae -> beeeaf2f bf15e29a 3f29c9aa 3f143261 bd8a7d54 bdd7f1c8 bf934bb4 3df80da0 3e9df6cc", + "c22a5268 423645d8 41de9ac4 -> 3efb3ce9 bdb6a1c9 bf5de395 3f0ee372 bf191435 3f3aa8ce 3fd05664 3e807664 3ce2cc00", + "42115718 c19035fb c0f4a278 -> bd2895d4 bdfcb7ae 3f7dd32b 3f159f22 bf52997d 3f1b4df9 bf595d16 3d01db60 3f100061", + "c12e00e0 c2158a86 40e40810 -> 3f1bdd19 bf0b2a90 bf13e725 3f30f93c bee76cd2 bec1e392 3f6e526c 3e716e74 3f751430", + "40a69720 419a3868 c1aedbd9 -> 3ca6aff5 bf0eb670 bf547765 3f3a60ff 3eebedf7 3eeff857 bd2ccb00 3e57cde8 3f6bcb27", + "4228bee2 c10c4f0c c0e6f0a8 -> bf3334e9 3f1a543d 3ec3feb3 3f01d49e 3f357117 bf8b8dc0 3efb0bbd 3e8f7528 3f537bc2", + "c1bb8295 4215c312 41efbc4c -> 3f2f7c7a 3f1850c9 3ed6da94 3eb00d61 bfbd8100 bd7ed5a0 be04b470 3e76d6de 3f01b028", + "4222dab2 c115f4c0 4216f8ec -> 3e33b105 be6626bd bf755f2f 3f045683 3f2e64f6 3f1719a1 3fa94651 3e3ab620 3e744a98", + "c0e35aa0 417a2470 c14e00c0 -> 3f39100f 3f0e0eb7 bed2c8ac 3eff71b2 bfa707c4 3e56a71c 3f304eba 3e6f9b28 3f50fc57", + "418b7140 419cd1cc c21453c8 -> 3deda972 3f37246f 3f30630d 3f2e8227 3ed473de be8711dd bfb3f8b7 3e5a1b08 3f6b161e", + "423f7f56 c1df34b4 42308ed8 -> 3f232845 3e812e06 bf3a65a2 3ed09bc7 bf896a9e 3f213a5c 3f67e756 3eab7a93 3f547c4a", + "4219fefe c1eccbb1 c204638f -> 3f5f66c4 bee80732 3e3a451c 3f10ded1 bfbbf9e0 be6d2734 bf19f602 3abbae00 3e9a7db4", + "c2249e8a c0c1cdc8 c14f8db8 -> 3ee4687d be5af4a8 3f5e7ab9 3ed5179b bd9bfdd0 bddffd5c bfdebb30 3e60136e 3f511ab4", + "c150090c 413b21bc 405c76c0 -> 3e300e52 3f60e4df 3ee43920 3f363c72 3da325b4 bfddbf56 bf66bc8b 3e0b495c 3f726a40", + "42028ef8 c23cbf5f c1dc46ef -> bf5f3ece 3e00df54 bef2272c 3ed691a2 3ea347a2 be9752c8 3fa4efec 3e9a4fd0 3ee2581c", + "c1912886 42450c04 41b3e084 -> bf5dc098 beb6837b 3eb34428 3ea1d2d5 3fc3899c bdb63244 bf741bca 3e357ea4 3eb935ec", + "c185fe06 41d8d6fc 416998d0 -> 3f7cc2d0 3d765719 3e163ea1 3f60956e bfab5ade 3f341c61 3eca2a68 3ddd8db0 3e3c2210", + "c20e36ba 419c1a0c 406b5250 -> bf7e96af 3da38e72 3d8b2cda 3f05ff1f 3fde3ac6 bdfd5687 3f19f2cc 3da4ce90 3ef3d4be", + "3e878d80 41abb4fc c1e09f1e -> bf59a2be bf05dc12 bd7e2250 3f537a9d 3fdfd518 3e999f78 3ee1584c 3d1a2730 3f354efd", + "423485c2 416863b0 c1a0868b -> bec98c97 bef2cb4d 3f499a07 3ef7aaa6 3f7f5e7a 3f5e8384 bfbd6aff 3d8a0df8 3ef85c50", + "c114c9b4 c1f8c312 4145f070 -> 3f45d35c 3d888529 3f2195d4 3f113596 bf84f7c2 3e232168 3e9c9fbc 3e153c58 3d51e500", + "c1a48110 c10bfe38 42220fd4 -> bf0db45d bf551bad bccc45b5 3ef5ca21 3f994062 3fba4392 3ef079be 3cd67e30 3ec0dad0", + "414fc8b4 4185a7cc bf8fbe80 -> 3eb07a32 3f25a0a3 bf2e1e81 3f1718bb 3e9f4792 bf8d24a4 3fa41ab4 3e92db9e 3f386de8", + "c21b0a5e 42055d6c 423d25f6 -> bd1ed136 bf738535 be9ca811 3f2a1512 bf0d70da 3eaef89e 3f558582 3e433b6c 3f373da4", + "c230faa8 421e40f8 c1c20abd -> 3e36ed62 3f6ac210 3eb692cb 3ec029ef 3ea490a3 bfc94f95 bf6c18ec 3e31ca0a 3f4a1140", + "c1bbd290 c227b444 c142f740 -> 3cdd68b8 bf78e352 be6e16e0 3f23842f 3f48c9ab 3f79cfdd 3f512a53 3c901d20 3f390339", + "41747190 c21bd712 4182fa30 -> 3f1b87d8 bf0ab798 3f14ac63 3ef7c8e7 bfb2c681 3e95e2d9 bf9232ec 3e10b8c2 3f17d818", + "416a3e40 c17d216c 4229fd6a -> 3f384674 bec8e2c9 bf12981e 3f1e0033 bfa42569 be1c84aa bd482ee0 3d17e470 3f2db4c7", + "bfd73f60 4205b610 40258a00 -> bf29200d bf26dee7 3ebea656 3f267dbd 3f8f141b 3de3d7e0 bf8a0fa3 3db1e6e0 3d8ad980", + "c1189934 c13c4078 bf880ae0 -> bf397ebb 3e394c6d 3f2a3d68 3f007fd8 3f548e29 3f40d51c bf80bb16 3e5b6960 3f5d36aa", + "4233ec00 c211244c 41eb5ab4 -> 3f1cd5c4 3e8f46da 3f3d3a05 3f319a94 bf3bbb17 3f135c59 bf9f1301 3dfbe378 3eebf90c", + "c22ba028 4239302a c0e6b040 -> 3e8bf794 3f7275d5 3e2c1b92 3f3e5be8 bf57a031 bfe0cb04 bca99f98 3dd12ad0 3f19ccba", + "42244b52 404cf800 413900c0 -> bea9ecfe 3f6c2ca5 3e498d7f 3f4b917e bf1c883e bf9d7ffd bd95c967 3d80c7f8 3f46e8ba", + "c1906695 4196f320 c18b8fc2 -> bc8cccc3 bed00bf9 3f69df0d 3f021d20 bca5596d 3facc6ab bf9f1759 3e99a986 3d860718", + "c1d32393 c1dfe94c 422f0e12 -> 3f6b0efe beca2b37 3d016906 3f3b4fb1 bf45834e beb79879 bf2c2b76 3cbe1520 3f2afd1d", + "418a807c c2253c12 41ef981c -> bf585938 3e9294e1 3ee726d8 3f1dad3e 3fa12df6 bf91fa18 bf4419be 3d232190 3de28620", + "c1b08afc c1d20f38 41563b0c -> be99fdcb 3f591411 bedf782f 3f4cd60e 3f7f033c bfba2779 3d4fe9d0 3d2981d0 3f02f2df", + "42086e42 c1a12d48 405effd0 -> 3e799ab4 3f62918b becb108e 3eb84485 3f0556ab bfbb806b 3f2d9166 3e6b9952 3e761a58", + "4158fe88 41d07c08 420ae6d2 -> 3dd78f08 bf26f58d 3f402f0c 3f04523e 3ebe5436 bde7fea0 bf976067 3e5b28bc 3f376229", + "419efd64 41f8f2e4 40fa5310 -> bf6e7470 be1ec742 bea884c6 3f4587b3 3fcd46e1 bd25bf00 3f858675 3e0d89ec 3dd51558", + "c1412334 c1dbcf0c c1ac37f8 -> be9210e9 3f074aba 3f4cb0d1 3eb3da13 beb7e27d bf2e592a bfc640f8 3ebbe2b5 3f7e3967", + "4247c262 c206f65e 419d0370 -> bf3d91f1 bf108832 bebaa6c0 3efa1c55 3eb25252 3f8e2a5a bec05942 3ed3ac9b 3f72040e", + "c2008764 4242a580 422d10ce -> 3f0324af bdeeb415 bf59d2da 3f1ba40d be33c94c be6af406 3fdd0186 3e8374a4 3f4856a4", + "4203d0a8 c168d268 409be1e8 -> 3f511954 3ee30017 3ebd02fa 3f26943c bf8e660d bf0b7648 3f14aa14 3e0d4f84 3ec66eb6", + "41d20400 c18560a0 c0fa8510 -> 3e25d28a 3f72900b 3e8d2632 3f13d470 bea7bda2 becc8abc 3f0b519b 3e4509c0 3f2e17d3", + "c181760c c10f7aa0 c21753b6 -> bd93fc81 be56f507 3f799c8b 3f2dc41b 3ec1fabf 3f527754 be7c2118 3d765730 3ddc2dc0", + "4242ef58 41f80b90 41c5e444 -> bdb8c999 3ee467a1 3f63f2ae 3f307bdb bf234e9e beeb6d9c bfc9b0bc 3d7206c0 3f449d39", + "41b51924 c215e0d0 c20e0882 -> 3f58844c bef19122 be7f1e4e 3f35d34d be933a60 beaa4472 3d3b19e4 3e73dda0 3f4a77f8", + "420e30e8 c21c8241 42077258 -> 3cdd3025 be533585 3f7a6664 3e1650c6 bf39c755 be83c73e bfc2f0d8 3f5b1494 3eea98ec", + "c1c08546 c0cefe50 c1ee1bb3 -> bed2875d 3f608309 3e7e8db6 3ebed304 3f9ddad8 bed8ec84 3dc494c0 3ebcf3d8 3f3181d4", + "41010c98 c1e666c1 41b0ac18 -> bf43ec29 beee2085 bee3cf23 3ef19216 3e516228 be969afd 3f466c86 3d7510f0 3edc0b50", + "c2390a33 42301582 c069eea0 -> be13e90c 3f47a823 bf1be73e 3f48be45 3cdb372c bfe2c284 3f2964e4 3c8360a0 3e133954", + "c237abe5 c1d2a857 c230fe48 -> bf11f91b bf3ac06b 3ec16889 3e98b3ec 3f0c4e46 bcbc1c60 3e8f9f7b 3e973bbc 3f63cea3", + "c1cee74d bf0e17c0 c21fe192 -> bf485f2b 3eb5baaa 3f02e278 3ec783f1 3fb401c6 bf62e2f8 bf8ad6d6 3ef57bad 3dc02cc0", + "4212bb40 c0a0b138 42192cfc -> 3dda7c64 3f66a8a2 bed7486b 3e0140d1 baac94c0 be96a2de 3f9aaa0f 3f084bad 3f5a8200", + "c225ed7a c22893bf 423a19ac -> 3d7b55e9 bebb27df 3f6dc3f6 3eaba08a bf8591dc 3f0813c1 bf572204 3e431590 3f6e5c8d", + "c21abf60 c1a20aaf c16f8d50 -> 3f028bc2 3edb7ba4 bf3eeb9a 3f36ef84 bf26fe47 bf86b2a0 3fc1d847 3de72df0 3f7ada64", + "41b47510 41a91eb8 c2478c54 -> bf291f1c 3f37eb13 be5eff38 3f2b0aee 3ef8405e bfd9eedd 3e7633db 3e3d6928 3ef79c6e", + "42045842 4174aa88 c22006b6 -> 3e7f9464 3e99c1f1 bf6bad02 3ed2b693 bf330259 3f0ac700 3f1fab1a 3d95d02c 3dcf7838", + "c210137a c20e6e85 c232741c -> bf71030b 3ea4bd12 bdce3c31 3f39f170 3f0d93ba 3f197d0f 3daa9e39 3df11088 3e8a03ac", + "420f0f60 4227bb3e 40a42a50 -> 3f2653c3 3f26a9e1 bec8f161 3ef6bb06 bf39eb16 bf0c410b 3fb12ce7 3e04a390 3f1b27e6", + "41b83d4c c1c8e4fa c20f0139 -> be4a4f44 bf6be012 3eab5b4e 3f3bd558 3d5bbe48 3e2dc860 3e9e2f58 3d475c30 3e5f6f24", + "42032632 41b41868 c12b1748 -> befe3b50 3f1448c7 3f257f4b 3eafc4d0 bed6c59e be8b7bb9 bec6b14e 3ed810ee 3f68261f", + "42374e48 c1a21e42 c2028a7c -> 3f254324 3f42e394 3d793f48 3f0af663 bf8371a2 bf3436a7 bf7bc6dc 3ea768de 3f10e726", + "c22e556d 41c4c5fc c19383b2 -> beb73d38 bf6e8134 bd805742 3eb0fb5a 3e2ff487 3f8706fa bf698036 3f064fbd 3f0a766c", + "416b4ec8 420fd152 418c6ab0 -> bf2af088 3f358334 be682aff 3f0bf34e 3fa6c11e 3d3cae50 3ec7853a 3e3c0978 3f68451a", + "c1be6aff 41d83cc4 c23bee82 -> bd4df0eb beecfdd6 bf628f29 3f45b9f9 3f1801f7 bea2fc84 3f989740 3d5c17e0 3f72d47d", + "421558aa c20d8342 c210da72 -> bef3ed3f be0cfb3c 3f5e4d9c 3f220e8e 3ebec18f 3da8aed4 bfee4331 3e83e3c4 3f2c26f2", + "420cd57a 420e089e 3d751000 -> 3e94ff11 be04d49a 3f72a8a4 3f1d8de0 bf6fb666 bf20ed86 bf8512b2 3b05b500 3f584273", + "41afc4c0 c1eac4e8 c1aa2a3e -> 3d039468 be74c2c1 3f787184 3f2aaa24 3ee35a05 be9df990 be909942 3d4ec4b0 3b2d3100", + "c15a60d0 42206794 c222e5a7 -> bf3987a4 3f2b9951 3e23639e 3f51a8b4 bd860cb8 bfa1fe76 be9c5d7c 3d0c60d0 3e540968", + "c2468a2c c13a0c1c 40f06310 -> bf57aa48 3e7b52da bef5934d 3e586a08 3fd53882 bf3b660a 3e40069e 3ed7bece 3eece5c0", + "409cc920 c2116366 c1ef4754 -> 3f3028ba bf16a600 bed956b4 3eb4f894 bfd1047e 3f65a7e7 3ea1219c 3e825290 3f019973", + "41c05c6c c1c22757 c16a7fcc -> be95fb07 bf04b181 bf4dae7e 3f35c829 3fa1f48f 3ea276d4 3f6c1e5e 3d9315b0 3ed44f80", + "40e6fbf0 c20a0da8 c247f636 -> bf31d595 bdf6a0ae bf358ce9 3f23f293 3f91ea34 3f8049c9 3f5d4926 3d23fb80 3f7df300", + "c20158d8 41811fe8 423a2c5e -> bd996592 3f7f2850 bcfe0040 3f263c4f 3e577763 bfef43a9 bee07096 3e9ca20e 3f13a9e6", + "41946b0c c1fcf6e5 41eab2a0 -> 3e9ec768 bf1329ed bf41d87b 3f24fff6 bfa72494 3f23ab02 3f30c5e3 3df24490 3e6bcc8c", + "c0f1e060 42172206 c14a3398 -> 3e2402f1 bd229aa2 3f7c7d96 3e414137 3ee02a72 3cee0daf be3d4bbc 3f0f6fff 3ef9cc38", + "c23e859a 4241b6b6 41da7d00 -> bf106d37 bef03252 3f2def56 3ea10171 3fa5fd3e 3f14245d bbfb7180 3ed7e333 3f081982", + "c10a8110 4217492c c129ec6c -> 3f6bf64e bd72a849 bec43e51 3f067611 bfc594c8 3f578ea4 3eb8768b 3eb3688e 3f3c7e05", + "41630608 c21cbc2f 3fedd500 -> bf5348d7 befe6ca9 be89495f 3ebf638b 3f586f1b 3f0d8466 bf3ae7a4 3c1e2380 3f7d6077", + "c21db0b2 411799f0 c125dad8 -> 3ece6853 be347e42 3f65e38a 3f179607 bf4ca6d4 bf082d72 bea09ddc 3e3c1f68 3e567484", + "c227a4d6 c22fcb42 c15c67e8 -> bf38e2d8 3f2939ae be50753f 3f33a70a 3fd74a02 bf389761 bd9118e2 3e921890 3e8df7ce", + "41c06388 c220c571 41b26970 -> bee85f7d 3f60279a 3e294c76 3f3fe381 3e862fec bf915842 bf8e4d3e 3d70c4c0 3f2dc65a", + "c0226ff0 4009c4a0 3fa641c0 -> 3f187f9c 3f4a26d2 3e16764d 3f16251b bf5bc7cc bdae1218 3f031b9b 3e7ac340 3f2f78e3", + "418d62e4 c19f0da8 42448a66 -> 3effbe0d bee00764 3f3f68ea 3f2ec285 3e5cc49e 3f84efcb bf8d65c9 3d62b070 3d917988", + "c210e43b 418c5ca4 c1f50ead -> bf6a64fb beb66101 be3efc5c 3ee1b134 3f953c48 bf0b0312 3f0b9a2e 3e11b6e0 3f3ce8ac", + "40610e90 c23a5325 c23ee702 -> 3f5a6f4e 3ef195f8 be6360f5 3e988797 bf0f2852 bfb16dfd bd671fe4 3ebafc33 3f1f7d3e", + "bf1b9b80 422fa3d8 c23eba71 -> badb176d 3f201e4d bf47bea2 3f29b110 3c3a6cca bf941078 bd88f948 3e84d1e6 3ec2a5aa", + "41af4e7c 423ffb6e c120e6f8 -> bf1a7780 3f3e8d9d be927fc2 3f5610f4 3f24b79e bf273c1a 3fa3fd54 3d698290 3f4e8cf3", + "41f19bc0 c211c698 c1c15925 -> bf36957c 3e92aabe 3f23c5aa 3f3d8e28 3f3788eb 3f294019 bf758da4 3d5254f0 3f705f94", + "41f5aee4 c220934c c20c577d -> 3f1a7cf9 bf1bf0b8 3f03ba24 3f4cc8fc bcb42fe0 3f466f60 3e905418 3c005500 3e4b77a8", + "4205f166 c056fcf0 40c05ef0 -> 38aed89a bebce466 bf6df0e7 3f184564 3e3ee819 3f9a4bc2 3ed414ce 3eab01b0 3ef8e2ce", + "41260200 c221b402 41216cdc -> bf6e7ad1 3eb779c2 bd7bc121 3f0c1de1 3f2e489f bfa6b0a2 be1d05f1 3e052878 3d29b6b0", + "4125195c 423203c0 c225b602 -> bf2cd99d bf265f6d 3eb2a66d 3e43a51f 3f17a77f 3fd1460a befff9a8 3eb75a9a 3f69e9de", + "c22bdb6a 4233eaf2 c165e910 -> 3f7572fa be908c79 bd031941 3f347b7f bfe4fa9b 3e182fbf bf0262fb 3dbafb68 3f714072", + "4210410c c174dc30 41927b14 -> 3f3f92a3 bf10cd26 beb1688a 3ede876b be8cc4a1 3ed3f072 3f9b6aac 3c8449c0 3f2f78cb", + "41e16838 c1b37813 c1edca4c -> beadd4a1 bebccb06 bf5d8513 3eedcb75 3fa8052c 3f0a1364 3f8289e9 3e6e925e 3ef76bbe", + "c1efe78b c21d4f66 c22a690a -> 3e258253 bf22df66 bf411f71 3f04a910 bf44e19a 3f98bae6 3e4083bc 3d89e1d8 3f76a919", + "bed52b80 4132f6f0 41790a88 -> bf7cd75d 3c696bec be1fb30e 3f13d5e5 3ed0e34a bf192bfc 3f3960c6 3db8c6c8 3ed25020", + "c14af118 c15d3054 c227c6b0 -> bf594e0c 3f05c97c 3da317e1 3e99c6ec 3dad73f0 bf4070d0 3f05f969 3e406c6c 3f3cd8af", + "42391fc4 422f63e4 42390126 -> be9cf025 bf30b536 bf27c9d3 3ef91e0d 3e12f9be 3efa09c3 be9ee2c0 3e2176a2 3e8f9118", + "c061eb60 4186031c c0f68350 -> bf27d626 3f395d82 be5b54b9 3eb375e6 3f3e91d1 bf20451e 3f9a4aaf 3eab99fc 3ce5f3a0", + "c159d9d8 4208c00c 4205e8fc -> 3f74bfbd 3e896d9c bdf1a309 3f1c24b6 bf16eb6c 3f1ee3eb be1ffd2e 3e46e50c 3e1aa0b4", + "c0dc0bc0 4059b450 40ff12a0 -> 3f33f861 3f35737a bd6e8364 3f1168bc bfc1c3e4 bf27e4cf bf0653dd 3e8f5f0c 3ebd4770", + "411475c8 422cca92 c22456e6 -> 3da77776 3f3778c6 bf314d3e 3ef61bd4 3de32b8e bfc243e0 3fa1333d 3e7835d4 3eedf452", + "422ecf00 c0f49820 4243b8e6 -> bf2e07d8 bdf08734 bf395337 3eb60973 3e35f4b8 3ed2d9c4 3fc4bf24 3ef3e521 3e138ed4", + "41857fa8 420f6632 4154c9e8 -> bec6d2dc 3f697a2f be07270e 3f2661e2 3d905960 bfed0cdf 3bf59af0 3e0dc848 3f77bf02", + "41ad1170 c23fe63b 420ff572 -> bf5f6548 3efa0a54 bb16e9a2 3efbe848 3fc81158 be1b1364 3f247a9a 3eab495e 3da02e00", + "c231c76c 412b2cd8 4244bc1a -> bec73d97 bf69d702 3df40fa6 3f12ee2f 3e7917eb 3f8ef053 3f595988 3d27fb40 3f5fe448", + "c229ee74 c180c888 420dd276 -> be9c7885 3f72fcd0 bd9a5b1b 3eff54ff 3ebe99e4 be6e82a0 bf1e895e 3e9301f7 3f0aaeb4", + "4221c93a c1d78674 41bb3028 -> bd8190cc bed56d11 bf682237 3e8c87f7 3d42371b 3fa9ef4f 3efd0238 3f0083b6 3f5b6e1e", + "40021e70 41609a48 c2456022 -> bf77a773 bdcde2d9 3e6e077d 3f5019b9 3fe57676 3ea7e3ff 3e91a6cc 3cb4cc20 3e7fa96c", + "c216b728 41290d2c c1ae2d39 -> 3f25a030 3f17e8be 3ef52cdd 3ec3464d bf0f4608 bf10ebfd 3f0456c4 3e87ca13 3f0b6640", + "422d5626 bea43f00 3f023a40 -> bef007e8 3f37e959 bf039028 3f21aef1 3f8440cc 3ddb3020 3f061c82 3e1bc2bc 3f354742", + "420b5490 c16f29b4 41c15164 -> 3e979713 bf7427d0 3d562da9 3f13c88b bf605bcc 3f702f95 3f430ef0 3e1113ac 3e84891c", + "4144e214 412bbb24 c20219f7 -> 3f4fd4ed 3ea9e9f6 3ef5f62c 3e64c04b bc9e60e0 bf184c64 3d8efc60 3f2f05c0 3e3b7a30", + "4241eddc 40bc3550 c1f95e7f -> bf23bd13 bf2bedaf 3ebf7b41 3f310262 3f8e949c 3f99e79f bf89c588 3e3536b0 3e34f7e8", + "4185137c 41a507cc 3ea6db80 -> bf4ca8a8 3f0d69c3 be71c370 3f2ea6fb 3fd512d2 bd76c150 3eaa15e1 3b711400 3d6f02a0", + "c0a7c950 c1cad1e8 42274a1e -> bf48b0ee bbf56b47 bf1eeb61 3ee0665d 3f6d2a88 3f0b565e be57dfcc 3c21a820 3f738cad", + "c21ef44b c1115d24 c22fc9a8 -> bf7acb9a 3e3c971c 3da2ef11 3f163eba 3ee8ed6e bf378080 3f15a0fe 3e03ea50 3f606b4e", + "c0dc6418 c1a91004 3e922780 -> beeac8ce 3ed8f065 3f47f93c 3f08c5b5 bebc50e2 bf5dfc94 bede394c 3e67f834 3f5f7919", + "42401686 402b54f0 c19d4302 -> becd2a47 3f5d6f7a 3e9aa666 3f3868f4 3f9b2b97 bf746772 bf612033 3e4562b8 3f2bfdbe", + "420a4a40 c22b0474 c1a6b804 -> 3f16bcf8 3e1dd245 bf4b1e6f 3f5e7f97 bfb3bd1f bec69fcd 3fa9590a 3ac8b600 3f457c4c", + "c226f6c4 41fb0c50 41fe5360 -> 3e31ad13 bf26afd5 3f3d26e4 3f3286f2 3f1b2a28 3f82794a bf9f6aaa 3e8010c6 3ebb62d2" + ] + }, + { + "glsl": "ivec3 cultmath_pcg3d(ivec3)", + "tolerance": "exact", + "cases": [ + "a5802853 2e4c61bd 6f1aee13 -> 5ef3f2f8 1300bb2a f26b8884", + "f0dd3375 800b6194 f46f75ce -> 98dedf7c e3440ec1 6e7308b0", + "aab7c655 431c7074 0950579e -> a9522a1a 6f6d524e b7fe0bad", + "f4b15c4c 192739ef bfb7785c -> 3bfe2c44 a3cdd8c3 29f2365d", + "0049270e 6970b9f0 637f71f3 -> 29d7e66b de94b678 14aec4fb", + "8ef51b31 a0a3ade2 85350bc6 -> a49ab220 3ed42d8d 6aacc27a", + "ede197a9 307190ac 8200551b -> febd639b 808dc02f 36d843f4", + "f835260f 1962a846 282f9f61 -> 91f1b9eb 4a6a0b97 84066aa1", + "63ba1e86 7ff5e977 7f43acf5 -> 130c42d5 42a7bddf 1a945724", + "b0760be4 e26426c0 efe9ee8c -> 225351af 6669e5ee e9da87a1", + "6c48ef7c 53dcbbb4 778b86bb -> 724f7f33 3e6e4395 8702ab01", + "04817697 dc503ce9 f495f920 -> 7ca54127 04e0390b 820ee16d", + "fe063242 04a3416b 14976739 -> 0573d4f4 0efe13b5 70c93b8f", + "0141072a b91187f1 545da004 -> 83900e30 9b5e0750 3600ed63", + "4480e233 8bc75099 a0214aeb -> 8406f8b7 904e2111 ce73787c", + "a118943c e72b6c00 cc7a3d57 -> b504f141 e5ec4f39 5613ce01", + "2926095a a8f2bff7 57fe4ab2 -> 06a60563 0e00a946 3eaa37c0", + "0142bd6f bcb1bd53 8f11f989 -> 253fde12 a3d974a5 ad573004", + "60e4c07a d679d0b6 ed9854dd -> c6c30283 0c2e1c16 44f808d2", + "390e5e96 fd529208 89030f76 -> 7349a07e 7f47dc62 659b7554", + "23db7e6c b9ff2497 67b1bfb0 -> 32895174 4586a1cd 20962f6a", + "47911e2f 37fa2ee4 8d01947b -> b8ba139f 80771b6a 6dd07b11", + "e55d7f28 b434e4ef bcc48402 -> 3f610c35 018c36bf 547a33a1", + "ae871a3f 0d350a25 e7107045 -> 0ec4c949 fb3e8052 c39c3903", + "ecd8d190 6c0e0ae6 8899a48e -> 942a61ad e0e42a88 f727a744", + "dbb8d10c aaafe956 a28d03f8 -> 8e04f1ec de6b4de8 65742fc1", + "3c4f337e ca90cc9d a800e6e5 -> 53b76bbd fd2ae411 ead2eea3", + "a436737a 406713b6 eeb66874 -> ee6b9060 55561171 c118632c", + "df7e6f5f 648f3a13 92635274 -> 7cd39f6b 0d9fdcf2 db742dbf", + "6c336bf9 71bd96a8 53db36ef -> 7feeddce beb19bd7 c3bf8d63", + "20e645ec 5a1eb841 39677590 -> 6e6322a5 5e7f3190 1aa9d58b", + "72fa495e dd806f4e 084f35a6 -> 8c7646a5 164458d8 3cc2014e", + "01cd7990 4cf191cf 04ab6776 -> db8e0a34 401fe77f cdcf7837", + "93edddde 21b1bbd7 f3f9a84e -> bfbc929d f4423ca9 9d90fa42", + "d8d42d7d 838c3779 71715dea -> 245533a7 35ac8100 0c047f88", + "a46c7258 b99adede ea8c5415 -> 2ff94b5f b6960454 3a086c33", + "454a3a7e b6315998 91be7a1f -> fa4bc82c efc29ae1 04d7dcef", + "900a7245 6c20bfc8 49a34771 -> fb7370ca f91570ba 35a3d745", + "fae54c30 c144dd04 d28a7c90 -> acc77713 22f3aa43 40ef6455", + "1304b076 f0fd21cd faecb030 -> c8f7ffd3 ab2ed6e0 e456bdfc", + "0c7a2cec 4b8c5902 dd1996e6 -> 752c99ad 2146719e 873ee5df", + "629602c9 fa54b7fe 2881dce3 -> ea0683b6 1ef40a7a 0446e193", + "b41532a4 43a9d94d 69a35ec2 -> 736570cb 5c6db64a baaaef09", + "16d5a635 f0ccd982 81d6e2c3 -> a9e3211e 3a357bcb d4dd1680", + "5b514e99 8aadf57d 6db41699 -> 174482bc ec159a1c 91671e23", + "d20cfaf7 2a771a66 2afef156 -> 8df170b4 ba6433cb 94f63270", + "f7407867 7f2130c6 58fe135d -> aee07fff d9cb9c92 55875a19", + "4cd271a0 aa1a884c 1019558d -> 02f8f81c 58e82dfe dbebfbbd", + "5e45fe72 5da9faaa bfad53f2 -> ae3d3d91 2f5e273c 4ac6038f", + "aea21ed8 8e72a4e5 d2de2f7e -> f07d0180 cf69d8cd d30689f2", + "8fca62ca ec9f641a 6208a98f -> 95fff0a9 1b46e598 80f2f751", + "d5561d24 f665ed79 44a653a5 -> a823b1a3 4a8029d3 34439682", + "6add8d06 ed665705 a2dc62bc -> 9c4e7e86 b9000ef4 17fa3cc8", + "1d2491a1 6f76152e 462f4ae9 -> 2f702be4 8f874f4d 47967d69", + "8f83a831 2dcf3c2f e8204261 -> 74c7d84a 4ac195f1 1631f940", + "f3024d8e 3a609e1d e99c8520 -> 83256e06 98497568 32f32bc1", + "352df90e 13165ba4 3ef042dd -> 9b71b5c2 5da3c7b3 8ce2c70d", + "6f426d0b ff077e6b 3a269358 -> bc674895 dd953722 5eedc6dc", + "f91e1581 056080c5 c4a241f2 -> b0d385af 4eea0f05 1f6f0226", + "cc1f16d4 880e917d b8f76246 -> aae39909 3c7c9b1c 1e353c32", + "0c90b876 b5328f05 c7dee6aa -> ae768b65 08c7e87b 4f73ea09", + "b83fadf8 8626ecba 11769878 -> 72d257ac d37ae66f af9f1093", + "75f3bc5f cd3919fb 0d331de2 -> 1efe00a8 a09fe327 fae33775", + "271cbfcd b137aeb2 0a199c73 -> 9e9ab855 6f6d36dc 8b6e5f55", + "bce5ad76 74df79da 27e94942 -> b3d88837 f1ce5ce4 449ed0e8", + "dd14148e b1bb219c 0ef4ca93 -> 5abf21e5 6b6df56c bde97e6b", + "9d614a01 9ef9e6a4 13c8b87f -> f172ecf2 83d0b3c9 348342bc", + "c9c2f55a 86bd48da 728f86b1 -> 5ef16077 1477235c 5f5e930f", + "08a3c19a 99730b9d 442e9ab3 -> b2927362 82c8ec45 0a1c535a", + "f5ae8c60 f06b4089 81fb1351 -> bd36539f e0945596 d9f77ac0", + "e0765e1c 672a1155 ab2f9c68 -> d66f5b5a a868b22a f1ea371a", + "866ebd3a 8d55bbfc a094c7c4 -> b1a4e7ef a52a1a58 89564f7f", + "4c01fedf 012a94c6 477c13a1 -> a7159e01 28f008d9 a9e87d20", + "ec1c4924 ce151755 765234e3 -> ad2214c6 dde02c66 d2e51e16", + "3c167436 05b403d7 d054dce2 -> d27c43be 6bef679b 700473d5", + "15ad277f cfe1bed6 4d05c3f1 -> 70219ce7 ae373747 5282bb5c", + "bc16d896 c5aac81f bc06e325 -> fa6c9f1b f3bbbbf2 91dabe16", + "b8eb948c 126bc2b6 7ee75764 -> 427fd81c 9b92db8e e7ff3ecc", + "cf154454 475b868c 29c34c1f -> 462e1891 dc9e91af 824eccb3", + "61bbc14d 527826a0 e4e0c98a -> a765286f fd40b16b 90497a6c", + "41dff613 f3b3fd74 77d7d78c -> ee12eb6f 7404d51a b214b618", + "2ef1aee3 6d879605 5fcbf123 -> b4d44f99 fa96965a d4497f2f", + "409ec91d be6929ee 740c5ef2 -> d977518c 8b5be7ee b36b6a6f", + "dc597464 a6e4c23b 6b44d245 -> 4ea08072 25d843cb 01e52911", + "38c1a9d5 84cb991c 945c51eb -> 9918e2da 66b2cf63 fd2eaa86", + "78863656 bc17d67a 6fcec722 -> 3bfcd8b4 0c2f8ed2 e39b1c3a", + "2a4c5e81 0346eafe a774aa8e -> 759c71b4 f9a7b363 4b3f37d5", + "e3e6554a 06d069eb abfe0aa6 -> 26a1c574 eb06ebf8 ec0acb96", + "36de23b2 705c7886 0d71376a -> 03dcf627 f697bda2 a42ed50a", + "23b290a8 8de31d72 c6349636 -> 1eea8734 45c1c02e ecb01181", + "3f3f1e53 ed011e94 3da60174 -> 0c0adc9e 9a8d961e 45d71b69", + "db7375d9 8d99cd81 aef9d6e4 -> 5df4eb2e 2bf68fb2 3f8cb039", + "881378a6 5c0e1a70 5ff91867 -> 1c5bae37 504bc6c3 6c88e1db", + "bdc1a1df d2f58c4e ff34dc4d -> a282eaa8 1fec6005 cb1c8a6c", + "87bf8c10 fa9fd306 e62b2735 -> 8cf33b1c 8adabeb5 c185e371", + "747a8577 e54411f3 e746e0d3 -> 06491014 dd3a62a8 78467e66", + "92ba1981 c2e77d97 c5a5b740 -> 24ad6d9d 225d3a65 dc920899", + "aad7dffe 15631096 a0a7d30e -> e9c37cee d0a18450 f4c3bfc4", + "0a77ac1f 65d41a8d 00fedc5e -> 69b852af faa3c3ef f4c1dd4e", + "b63f052a 8982bc30 0caa35a0 -> dc1b097a aa98cd77 51c9bece", + "b865a035 694286e1 997b176d -> 27d8cfab f6266f9f 5c732caa", + "fb36e6e9 cd0ad10f 946f70a1 -> 23e56cfd ea10b96f e2290032", + "336dcc01 1f808e33 a1820b9b -> 68c54a31 56821d1d 18ca5ca6", + "6fd763c9 41e9551c 52eab6d1 -> 4740612e 6636f85f e0903bb9", + "442d799c 661047a3 42ba81a4 -> a225db06 4fca17fe d841d1b8", + "6ac5aa20 f57b347b 723b7d5f -> ce501731 0fa77854 21401bb0", + "67a80ec8 8aa632e8 4c0e5851 -> 40dfa90f 766a7447 aec086ab", + "0ecdba60 a0b4748f 4e28c81f -> fa8a4d10 189d9600 005b92fe", + "bf8ffb5d d2e4ea72 1ded093c -> 35f66b09 1188daab 8170fe3b", + "a584d5b5 743f705e 043724b3 -> 18d25808 064aa672 d57e95da", + "03e6bd71 d74976c5 effa7d9f -> 38e1d891 30a38fcc cf35036e", + "c1bab43d e9d2fc6a 8b8830c5 -> 3a6ea6a6 dfbde340 6eb2af0d", + "d06d5f0d 5b5aaa33 34cf8945 -> caad2aaf 11ec1e69 1a0cd268", + "6fad328a db44d6c9 85a4a96b -> b3ae46c8 d85a02ef 7ea717dd", + "6004ffad 41947037 b9c72748 -> 4236f2af c2b36e90 4a882e44", + "810f4ed3 088c5cfa 27854e0d -> d282043c 9a5c96fe ecb41a96", + "b4cf6726 7fa6fd3e a13b4876 -> 35073bb4 8d2cf358 fd427a2d", + "626957d4 79294d95 de01cb29 -> 2de4e3e4 f4bdfbcb 30714a40", + "f6197719 b0d26d23 d56369a3 -> b4dcf4e1 459c9e1b b7cedf4f", + "4ee5ce05 b05d98b3 45d01a04 -> 220bb2ed 8635fbd8 f8a8bdb9", + "b5855a4f 4c80f04a 2d5fbb7b -> c4f97b2e e5c18033 b59f5322", + "b6d1ea45 1ce60a3b 02d19a32 -> 04e125dc 4f119ff5 d0d0bd92", + "bc68c60b b7a14134 f4ef6b99 -> 1ae14823 06d34fa0 3a4785fc", + "5bf0173c 77369f84 e4a2f07a -> 1b6a28ba 8a1c3ae1 30b48b25", + "1f10ce62 dd3e5077 32d307d3 -> 7f97e083 0df09b22 04d91e69", + "326e3326 dcd77957 f73e3026 -> 2f9b2174 f40ca51d f3b72918", + "9111f12c 66bfdc7b edcd72e0 -> 4415c490 c980bebe 40ebd15d", + "3c9ba6b5 f658a2f3 6d69ff37 -> b6525f29 d5585a72 4b1beab5", + "14b4ef95 f4a3c32c 8852f2d8 -> 3ab331ea 8ba3f795 7f535d07", + "7f9a0e7c 7da4a3d2 f7222c0c -> e3b8644b e3cf2688 9d1a06a1", + "0457d9cf 7b06c340 26dbdc99 -> f98dab9b 1a488b8e 8a40d8ca", + "28ae61f1 ec5112d2 85a1e4bb -> d6187644 a85be492 dec6bdca", + "80841de1 7271cfb7 d488e76f -> ea591d83 d099d7c4 a16784a6", + "3018846c 9f7a8738 e93c40fa -> 6f40050f 07b27015 4b730b08", + "fa43bff9 801998b2 f6c3bf40 -> 169881e0 8f3836ff a8aa65a2", + "481e605b ce631e70 b248158f -> 8f5f8ac5 217c89b4 937a511f", + "791da67b 09c09c88 5aa8484e -> bcc084c8 f0a737dd cdc7945c", + "858313d4 6b3b88aa 9615396c -> 8c62af28 f9486f3e 480b8267", + "b1461289 36f0cdd9 9d577599 -> c29cbb61 810c54e0 1f28fe69", + "7eeacab4 06f1a81a 06114d5f -> fe2891d5 60312a1c 12af6fa0", + "0b57be71 3184a9f8 c582a5c1 -> 05305d39 ddf135e9 10e5fad8", + "1ef8fd55 3c28688d 09f48f49 -> 7e7a150b 65d89db5 11013adb", + "60fff9d6 4111dbd0 e5e715f9 -> c9f052a4 13f8cb48 3be35dfb", + "61fddb37 a0e33c1b 1342dc02 -> 274e716b a74df4c2 e963b777", + "6f691b92 79847598 0864ce49 -> 3d09679a da45d001 a8ed8e78", + "6d8b7de2 2abccbf0 8cee8725 -> 9d27a88b 0dd54959 499f2b3c", + "01246a87 579bdabd e4329f67 -> 99080336 477cf3c3 6eda4a1b", + "31a45199 8d6cb692 ce1bec63 -> b211b51d 12a7e40e 9a91afbe", + "d3ee2bff 55a91999 b4307bda -> f8362998 0e90e132 3d636a9d", + "7eb78e3e cc914388 821417d5 -> 2ee65ebf 54e9434b f7c29447", + "db535a54 9038852b ef96d428 -> e3e9c258 ae3bc175 194901d2", + "b013ccb2 3e9dd446 d3480641 -> 34dcb151 c7631d0e d2ebecb6", + "2d0eaf48 d0d77e7e 60755b88 -> 83bf81d9 3b53b8f6 e7ccc1c8", + "1a211e99 03563f4d 18675dbd -> c5bfa911 bd59a1f4 36c8ca7a", + "f7b332c9 807f3d04 2d34bc24 -> 96e61484 72914bec 10cd6b7e", + "6087f35e f0c3ffbb d7a23841 -> 89ce0495 a090cc98 2785beba", + "01f702a0 bfa3e819 93a464af -> eb0c52d4 57f88feb 20ff3706", + "725b68fb dba9934b 55386ec8 -> 952926a5 f23c35c8 0983055f", + "0bf2e9c7 e7374a3a f550dca6 -> f6be9295 58017940 09ef755c", + "fe1337f8 bde79224 55e5b488 -> a974a856 e1a119bd 4b14c7a3", + "3f23852e 07def34c 4c93389a -> af296c3b 67a389b9 d76b0471", + "824afeaa 6c95a612 9498bc31 -> 59f3ae16 f205532b 7c7c3385", + "02218061 46c5b1a6 a9d030a6 -> f3f885eb a31d11ec fb0f74b7", + "ed0004d8 160bf106 9c51891e -> 39f2a44d e133d6d7 c294b3eb", + "9ef54e37 ae5afac1 af93f49a -> 352dc726 808465e1 2d381fb5", + "80cad8db 8273e4ad 8b3483ec -> 90f8aafa b5802bb5 da94e31d", + "74f170da 32636f67 b4fce951 -> c013d27e 7803bb78 4686f832", + "b5b98fbf da0dfbfb 91305c32 -> 20e26d52 9ca152fc 6cc21c19", + "fbfb1673 fa0e6202 257117d3 -> d6f68963 b95cd0a6 dacf0ac1", + "0f18dafd 8363a43c 9c40450b -> cc4d69c7 24c70c3c 48736dc8", + "81413415 0a49d079 6ea5c55c -> 4a72c56f 9b237f91 3f5434f7", + "0f77705b 7166a143 11946a48 -> eeb96d83 59061bd8 f92232c1", + "98f2b9ad 8b6e617a 81a1c397 -> eadddba0 685603bb 98795093", + "75e9704f 00c72b63 406c7b84 -> e65be4c1 e8354ae1 d16f380e", + "464abc6b dbeb282c f3e18f1c -> 18ab2c5e f83a621c cc8e8f26", + "0f746ce8 49d1414c 5533cfa0 -> 1c498195 dd6fad3d 23892c8c", + "8fc73d8e d08dc816 7c4db9b8 -> 15931558 e23623b4 c853306a", + "331664ba 962d7d67 419a71cd -> 5e6a1232 5b782ba5 193bd46f", + "21bf60d1 87df63df 89e5f157 -> 6368ee0b b5ab1f38 9b7f7d5d", + "a3cac1f8 8728df40 a5f170c0 -> 17a77c87 6f34208b 4836c33b", + "7dcc7c53 5acbc39e d4bf83ec -> 80eeb406 ec8d7e6d b6603e99", + "a1326e35 69d98ff7 2b509baa -> 0afe0b9d 0d6e557d 234fec03", + "e9dbbe4c a7083207 7a119a80 -> 42ad911e 0b3796ac ff38c981", + "6b329bea eb0d02c9 ba8444d6 -> 3e7ecc53 2750269e 17485411", + "f9d3f893 12d3e33a 7931c7f5 -> 8ec6dbe2 878bb3a6 c1e56477", + "e717a654 b0216aa9 f9bbcc77 -> 8e4a2740 e9683248 acce0648", + "2d19abaa 1e0f847c 817ac6e4 -> dd181838 7f6f79a2 d4311ae2", + "8375d7be b7c11ec8 20e1a075 -> 6512c687 170d3d36 ac9d26e7", + "35826549 57853229 b5ede9f4 -> 00824c75 be3ec061 1934eb00", + "fcdaa6d9 62c09937 6cedf64d -> 2bd9522c 73705f58 2068a3c6", + "8a2d6ad4 1874785c b616358d -> cfcf7333 757ebed9 936a78a9", + "0492827d 6b948cec b437ef91 -> e73c83b2 5cb3415d 32c43a4c", + "a6f30986 958d4792 bed908a7 -> 5b1fb7f8 c630182b b64d4b41", + "afafed35 c87315b4 05d4a8c0 -> f627105e a7a05888 1ae161cd", + "2c17d0c9 8f1e058f ebcb7795 -> 86046358 522582b9 4bc1c0cb", + "7150cc1e 530e70b1 94a68af8 -> 30e7aba8 33edf9ad 66ecd5cd", + "177fb91c 75037243 e0e2fe30 -> bd904885 94eb9be5 d70d8192", + "18acc144 e8748e7e d75250ae -> 4b436c42 fe193fc2 433f8d84", + "f95c1ab4 810b9a9a 8e134329 -> dc857104 230cdcc9 b651af37", + "e4baf8f7 e25e2501 c5db43c5 -> 6ac3c0b2 f3b146ea becaa735", + "7f7a90bf 6a95d7b9 13959c7e -> 4118b4a4 4c76bc1b 95107c71", + "6706c2cc e152e34b b280ed61 -> ae3aa734 a7ce69eb bc978a4d", + "118b0c2c bca07eae 75e5d3c1 -> 2dc3a59e ce96fcd2 97b65003", + "81ad2b76 6e80048f a7dbedaa -> 1f6e4380 e94a98fd e7669ab9", + "47347164 870fe0c9 d00773da -> 23d7f5c7 e457d463 4ad8c0a9", + "3d6cda5e a3d720fb a7983aba -> 71775816 ae006c56 07b954e0", + "37816896 e2f99fd2 36693bdb -> 76a963cf a5a1f047 e0d4ccbf", + "215e679c af588532 4aa70e98 -> 983b8dbe 066b954f 059014fa", + "4711f1de 715a2c5e 04435dca -> cd8fa57c 48f957f9 a1146af0", + "443c11fe 4da67889 5e3744bc -> 83d1f7c0 4953158d 75fbd3e9", + "67fb152a 5dd6d727 ae08d74e -> 737a6872 54a5dbb6 c2444216", + "b14f82e8 2005f77e 5df4415f -> 4bd35146 ddf9fb87 c6f49a60", + "c7cdb415 583e9642 f087f17c -> 3d0b1440 5cf9f7a8 849b1055", + "da997fcc 4a77a2be 018b0ba2 -> 2f83cac2 12200772 870eb846", + "12bf4883 ef59d700 7e0b49b3 -> c4104c54 67744354 5f3c4d0f", + "2babfe63 eaf6399a 4ea527f1 -> a4902eb0 53359813 fb16c6a4", + "c2f88b24 dab74675 fa9573ca -> e0faa2a8 f392d8b3 8dab85dc", + "59790891 d824e450 efc91d00 -> 75f2b0e5 cd94223a abfa6be4", + "533e53d4 3f2c0c1e b0dea375 -> 501f0f84 22ca25ff b83bcb56", + "33ff4865 1cdeb9a7 f82ba0b3 -> 64ad5a47 d69ea8ac 0730b57d", + "d8109d28 aec7993b 1e610bfc -> 2bed6ebc 6c8bb625 a81846b9", + "6d9b023b 86f29087 e965bc4b -> 597998d5 b10b6f3f 1947f170", + "c464896d 92512418 25f81690 -> 7db8ad46 ffa479e9 6e30fa7e", + "024e1366 64ccc878 5d6da113 -> 450ffb53 3402383c 77833e1d", + "b568617b 73d82f50 956fd35f -> e9393b8d 1a52ac95 2e3bbd0a", + "7b20bce7 81099f7c 70228c20 -> 007153b6 924c1cf9 243ba1d8", + "d5d508a1 5ea3db7f fee59e7c -> 376a02e1 9aa93623 4d31ca98", + "438356e7 5a0015bd 3126d1dd -> ab196c92 578a0ce8 378a6aed", + "7d6f00ba 4291df75 315f94ab -> 0aa4241e c3941f69 64a47984", + "87d94b40 bf6918e7 b45551a6 -> e090427c 1dd483c0 1e0da852", + "27228632 2f12aa42 bae19d35 -> f6c0ef29 c094947e 69705a41", + "f64911cd 1d320517 db16b2bd -> 6cde6b0b 62b7a36c a28e45c0", + "25e248a3 dd107cbb 10920bb4 -> 3a522ad4 84a27f6f 6a5efc40", + "cc8f257a f23d1be8 d38316f9 -> 3326eb2c c8d054c4 1c58ddd1", + "23895273 57fa3819 502e8790 -> 4512b8a1 79e19f46 6a64d9b0", + "d930e30e 778c0d5c 9a422009 -> 0fcc4383 8f532d71 ff5af66c", + "478161d6 b21f2ea5 2cc7cf39 -> 5f63e2bb cfc4669a b4aefffc", + "db6539c7 4001b685 8d89b320 -> c7ff97b3 18079941 884bbabf", + "bf2508bc 4347f482 efa96402 -> c398310a bed8c7ea f0a5a863", + "ae4b8e0c 17322f75 6f68eb17 -> 71a83f93 d06bc683 a5b52f44", + "35463ed0 2317b2ae a0864510 -> a9099a6e 3d9c6f49 4e858555", + "94cab282 f05032b6 26b75a86 -> d9278679 0b045553 4e6bddf5", + "7c8d9b96 98aeee21 f28f6233 -> 36c5d522 07337835 ca3ef7ad", + "ba5c8dad 8fae2578 5a50eeb9 -> 19a49539 6b9ebd36 e6a9b83f", + "a6ff6899 560ce4df d287ec79 -> 0cad0949 8d9959e7 57120eae", + "d9c6e66e 41282e41 e8869ffd -> ea98c1bb 6540e695 56169b6a", + "e5371b10 e8539210 8b64c8e0 -> d6bbf583 82d998e9 769f75fe", + "2c421a25 63369dd7 86652171 -> ef680c2e 912b7c1d 70171057", + "afbf449c 67a68464 9c35f0e5 -> 68fb67c7 f41ef2d0 a09c4f0a", + "720460db 143a1978 d8171e35 -> 90ab2817 d4fca390 c5fd9d6e", + "6878e782 793dafa5 3f4b20ab -> ae7409cf 5424ad50 fa1fad13", + "e1273be7 4f37dbaf cae69874 -> 8fa1ceb7 77546ed5 087ad93b", + "1daa5239 b0e26945 9039c979 -> 7234d2f7 d2ee54ca 460d0aad", + "6309f157 c8f43bc2 6fb984b9 -> efcd8573 733f24d2 d3bdc59d", + "f6ffc69f c5b62eac 79863517 -> a093491d 290a6a4e bedfb5f3", + "d5fd5271 7bc86b3d 1903029d -> 6a195bd7 64db8239 6e441fd5" + ] + }, + { + "glsl": "ivec4 cultmath_pcg4d(ivec4)", + "tolerance": "exact", + "cases": [ + "5282da0a 1c0b9c58 446e3e11 5a6d8498 -> 7ad5acf5 bfa99213 1ddf75b7 2fd1385c", + "b347420f bbcee2eb a36d7978 d688485f -> af6e5c04 c30f8fb0 f570b858 75b760a5", + "79cd3223 77c753e6 3b8188a3 1608d623 -> e1a2f55f 1841915e e83ab622 3a149c5e", + "4e59a8c7 e8832f75 7f119d48 92091a7b -> e42dd7fe d6c6477f 4603ab4b 42d5a384", + "d4db7a6d adf18936 62ee955a ceb4a8d5 -> bef3459e c1aab385 a7e110e3 e5fd57de", + "51f9fffb a112cfe3 ffd372cf c71a7583 -> 2213da42 afd5ecda 9ffb76f6 cf98837a", + "54c3ba3b 44248f4a 8eedfe1d f2215ee3 -> fb95d9ba 9d99cf40 4d16ef35 4b9c1b45", + "7730347d 0c397af4 511b0861 281ad340 -> ff979306 253e5192 cdc0d38d 37ee9b32", + "0ff04e1e 8b81fea6 849b66bf 32515267 -> 0a5bac11 4cc7ed11 6a7c354d 468b80e4", + "00e3f563 95e89d0e 91556e7f 853f16c4 -> f5d15e45 858f318e f0bc49b4 384748f0", + "af84d765 83c75067 ccfce930 bc410570 -> 03ddd9d9 931d8c04 6d68a022 9b68596a", + "88213420 94a3089b 7c3d52a4 7d58e2ec -> 0d8a0142 731003be 9752c542 dd18dfc1", + "df8dbf10 7b28b79b d9d6b6ef cf51742e -> 76dd6ba8 58583b48 2576f30a 14030c6e", + "6271735f b74ad6b1 8d25c33f e9bf790e -> 2a2e26c5 cb3b3ea3 9f6c698c 98500915", + "d9a2c34a 6a926262 f2c794d1 dd71fef7 -> 6f081526 c8189c5f 1ec7b529 75fc0142", + "b45ed9ea 5ef64dac 5b8d9457 8ae6ee1b -> 6cf7c320 a2eafa06 81907499 d17bd088", + "2bfa85a8 52823385 0fc718ca f276eaad -> bc5ccc5f e9d8c788 09062b99 1b75741c", + "3abb1fa7 f8229bde 5ba89d83 a4a756de -> 6264a739 c8c265a9 631acf48 559517a0", + "c91d2896 1b7332b7 f4549636 3b507a09 -> bd1c4622 25744196 1a67b1c7 ab72607a", + "9931e8c0 dad4b987 031a2340 cdb465d7 -> f416c46b 5a4d4c56 a64bbb34 183ec8c8", + "5db518dc e43bec5d b79806df 5c794b4a -> 509bc767 5fd3817c a38dfee9 4d3c7efb", + "b501f8bb 2af63d40 ca11685e f0161636 -> 39f132fb 395ef884 d8c0b288 68dc541d", + "4af27256 775e637d aaf24fbb 7efabf6e -> 784a235d 22b03af4 cc234186 ef049054", + "99c1fc50 7e8061f9 9b36c9c7 6b509468 -> edb0f656 30358476 12bf5aaf b8c85d7a", + "3c13e6ef 027fd32e 9fc3b25c eb7359e5 -> 4717f4c5 07b36df6 527546a6 1296c299", + "dd5cb7fd 58b82ecc 6cb148c1 d3485271 -> c407acb1 e73638b1 6328708e 918ea277", + "8053b977 cb1444bf 0b0eed69 1ce2e020 -> 1968683d b1238fcd 9c96d867 3eb9f8fa", + "c0ebbf59 94f244a7 cd8e5443 379f89cc -> 13f4f0b9 84cd4264 27132526 787a10f2", + "10d7164e 62c50323 c026be33 6f64772c -> ac124381 5bfaace7 b2725bfb 370e1266", + "928af7a3 c63246f4 875552fa 27a1b6e1 -> 8bef317c 348ed446 3181c5ec 968a88a5", + "bcdbbf33 0084a1f2 58bf2c79 d2c11ea9 -> a1bc1733 010337cc 7a7633f4 1553488e", + "7909f398 a17aa335 e100d13c ac80e208 -> 959faa13 56ce06e1 c3736a41 fd0a3e2c", + "b8951719 8153573f c64d732e 649bc077 -> 7fba3d15 e94fd37c 3e4f360f 4948f02b", + "66260a77 13a36c6f e3f31fed ec586ff8 -> 1c7911ef 97088df5 e5f5a261 dd7fb3a9", + "a030a2e5 ea983603 a43c3f21 6493f30d -> 4d3fff4a 2335a34f 8e5e0cc2 e64dadcc", + "45698d2b 26f7d04a 13caef8e 21e6597a -> bcafa4c9 7dd9b4ca af758ef0 6eb2aea2", + "1dee7bd5 f167ab53 70ca579f 1013e6e8 -> d7b008ed ce6049fe 51b42d6f 1ce2b32d", + "756f9f3c d6e755e6 a96b4cd1 4a2c6dc2 -> 6a15b875 9d999a60 de57da23 e0a8a067", + "6286061c 78fbdc8b 2698d156 6a972451 -> 6a8385c2 6b6fe948 e2c0711b 83df9559", + "c92ee3c9 cb60b2ea 65be195b 79910a9e -> 4a32c4c1 890e446f 05c2ebaa 70ccf0b9", + "ade02678 7bb2d7c5 38474de4 a12d175b -> 756a932a 43693bc0 7fd1f5c8 01d2b381", + "113360b4 62f6acc5 7f482b22 aff5bc7b -> a1c89f62 09d46599 a1660b81 c0224054", + "325f478b 98da5a75 1d9d60f9 f524644c -> 7c25240d bac1a5f7 85979857 be82e09d", + "08dbaf86 d98b7e73 87067072 af4fc238 -> 5bb8eb7c 8fcdbc57 320cf6a9 93856036", + "866862db ed66e00c e8154a0d 861cfcdb -> 1d108255 b87cdf67 dccadcc5 080f2ded", + "cfeacc1d 6c84866d 1822252a 1fc1e884 -> 901db5cb 96be0a2b 8501815a 1cf438f0", + "f7fc9173 f538700a 33ca6f46 31ef6bf6 -> 94597f2b e88eb156 92829450 cad443fe", + "a8ac9c4a 1fbe5caf 0fed70b9 c6c30f13 -> 36299106 48d1dd9d 0c5d7f73 f4dbe4e0", + "f1b6caed 6f037bf4 92be265b e61eb67b -> 925de2a4 a19fb7b9 2c0d476d cc1df6e6", + "7aea7c1c 54cd9f27 c8561416 f54c7b45 -> 92365952 215c4fb8 f5aa8dd2 b0ba0428", + "4fcc587b ef46c8f7 48257f73 d94ae4d9 -> 7e63cf39 ab729ef5 e2ad4737 e9a3ef8f", + "d8638ecf e2edafec fe2bfb22 1c36a31d -> 0831b492 1bea5992 cf54fb4e 6c8f9ded", + "f27794d5 3956296d 12f88f42 b64bb703 -> 3f8cf2fb 83163a42 988b08e2 4cf809c2", + "68f2041b 76061dfb 1fe0986c 89b884b8 -> aa47336d 6931496d 7077ed4d be490cc9", + "b1d656d5 87134b98 caa2f3f4 7620d1d6 -> 5a72edca 0be5a253 49a14a37 20235a80", + "61c20733 7e1fdccc c16dc054 0ef8e123 -> ef695fb4 3175faaf a0499058 262060b7", + "e135116b b6b06642 09e613c3 8c18eaf4 -> c0092a9e 0c399557 4a257703 c7024b26", + "da35ea0e f2cbc22e 69b985ad 6508cd1f -> fd20627e ac3b2038 1634b7de b1ce69b1", + "919fc283 70e3dee3 383d41d8 cb5e1b39 -> 29dc8128 2c194a2d 5d03112d 06e16f00", + "381d6349 2de8fb9b 841a4245 923360db -> 41911c83 eb8f8c3f 142e9840 459101c8", + "6b01c8ce a60210fc ee3832a9 0a3112bd -> ec906b30 7e44d625 bc150b4c c00ad8fb", + "db085ca7 7aa4fbdc 35e2712d 44d00bb5 -> fcd31f00 53afe935 b8b66d7c 9109e5c5", + "faeeb6b7 e5c61c99 96101d6f 11834403 -> b1e5f4cf e77920a7 46c35726 de09d261", + "362cc992 aeb1ac83 4d1f864a 59e10039 -> d52752a2 2a53cbfc 83d702d5 84e72a7a", + "768db913 63290caf ac11b172 3abd3cc7 -> 9e84ddd8 5f3349b3 50438358 c0c53e0a", + "7eca16d0 43fda921 01229571 148f4afb -> f3c0ba41 f413863c e744d700 43877b05", + "ba0373ac 23cd2f93 26e044b4 242e6017 -> 2582718c a7b93517 55c437c2 c3fa8c34", + "1ac2541a 7ee5207f 1b8d7104 0601a0f5 -> 95663f54 b843379d f0a485a4 9b3ca6b0", + "b6bb09c7 a58b0542 44ccefa5 a01884e6 -> 1acbc07f 35aa1515 16450d35 3ea19625", + "89226a17 c93300b6 9dfa1477 21e0c7d0 -> 4cec37bb 95cddff5 24b1b02f 59490ab8", + "95b16d69 c6e31096 273b6c9a 3dcfa91f -> 61f0e1e2 7834fab5 76fc0ac0 7e110f36", + "5ae79b0e 22b19973 3111c28a 9a08f809 -> b55f8313 b3fab109 b8109a59 d188903e", + "e83ee951 4bd2552e 092a3636 4b5a774b -> 9496938c 14eb6663 107d3833 a1ebd983", + "1a2bb6dd 536d5520 016889c0 9d07b761 -> c998d4e5 e9ae84f1 6d09a193 9896ba51", + "1519c9ed d764a2d1 51faa799 cd4c6572 -> c1b4509c c3868da4 e0fe5c28 0457f14b", + "582564e6 5be4daf5 64aa84b1 dbf75c4f -> b9d84611 23776268 c825d00f 424dcfa8", + "32be6273 cb93ebbf 3099a36c b69c9d96 -> 7da7be20 6546e2d7 2a023f32 bce2e0e8", + "8a338ac3 38e09d75 3c28c00e c31059b4 -> 8a776419 961fd3d6 0e26a9de d4be8b0d", + "c4cd7011 f8260d1f 7f37efd6 21b7d833 -> 2dc88384 1c365a2f 88cd8aa1 092732ff", + "375b076d 13082281 01ddf9fe a60a1686 -> 9100c292 9ec2d71d 1d9a973c ae4e018e", + "2aaa25a9 5b6c77d5 dc6adf12 924347ee -> 3b6598e5 3193c16b b1098a0e 0104ee3a", + "62f42577 649a0f3f 85eb50d4 8279df08 -> 5f04ec68 2bfdccd8 86fd3659 70849337", + "a0d2db98 949078d1 3b19cb6b 4fd25909 -> 92f1e3a1 36347a41 a2f62a5d 444dffc9", + "2162a744 bf63bde0 dc54e219 f5523c5d -> aa6a7d14 438e0235 cd0b05e5 985413e6", + "208697c3 d2218267 abc7a900 a0aebb07 -> 840cea27 a404dbac f276fc15 96c5db6c", + "e9617a19 de39eacd d9098bc6 6ab71adf -> 0900a09e 1f97afce fda6279f c6b54dbe", + "149d5331 f21fb8df 3948d902 1c1e2d25 -> b4424b02 fa307130 d62f9ba4 7e69ad27", + "3490b333 e3149cfc d59b430c c544945d -> a34e4c26 ec4d6fc0 325b9721 c9c56f42", + "ee9e2412 36f78e98 d3b3864b 54483f12 -> 321925a5 ca8656d0 10fbddaf 1552b3e8", + "79ad3019 b64f3f27 7d8853d2 ffc8953b -> d6c6dbc7 1cbed898 3e96dab3 cd98d1a5", + "9b16d0ac 09d8dc11 b18a503b e834c3f7 -> 5433814e 6859954e 6bb45486 4cf9ade9", + "ba758841 0335009b 61b638ff da332c14 -> 59a20b9a 9b516939 5bbfea6b ff3b2223", + "6eb7fdb5 ae398ba0 1342233c 30e3966f -> dad59afb 31c9e3cd 27ef90aa 8e041f31", + "163f4d5b d0cdab2d d00a1e1a f22c972d -> a3c9045d 45470ab1 274817bd 24c64240", + "34072e17 6f0ba764 ba925344 38287ed1 -> 91981422 8e2d0f16 4d69ad42 fe15b9ca", + "7bbabe2d 52e19288 bd749374 7ed54f61 -> 7ee7c8a8 63dac721 bcf5aa45 b99a95f0", + "75712265 dd119ba1 e51c6b9d 43e6d230 -> 0591ec4c 29e8ba3e eca3175c 7fdc6474", + "cd776474 dd1bbbe5 cd64161b 76ea1322 -> ea055805 92fa2918 4d52d433 080dc6b6", + "14af5820 6bf29009 e3af3925 fe15afa0 -> c4b44ed6 923820bd c0e2fe04 5c16d243", + "62ff67c7 e84a442b 7f697e0e 0c517980 -> cac0d45e a1e19173 10e6b067 d4430ff6", + "2e7f6f57 2899c04a 9876994a 2d031612 -> 84e73b7d d322fbe3 16e825e4 902abffb", + "fe24649c eb901091 a14c69ec 83084cab -> 5028e70e 76165091 4370066c ba317a88", + "e6d27991 751a609e 485bf0e4 ae0004fc -> bf5bc4b2 afc4baf1 da534e52 127a294e", + "ff918c9d 7f61056e 551134ec 1334a0a8 -> 291c5a91 66115545 e7015941 2801a6f1", + "2eaa7c84 72a181ae aed966f5 ac76ba08 -> 88e6bee7 ead08c90 25d46f6c 7d8f2ccc", + "0e4b4013 e5e7cff3 4a645984 f1937286 -> 6bdd80d7 8e1fc98f 05a73bda d3c4764c", + "253b23d2 69fd033d ce0082ef e66b2478 -> d79fab57 eb084e9d 68c48f32 4c2b218b", + "6ee197f1 d2d1553a 2c11f627 8dd0f795 -> f2515c92 ef8a9e9b 4a1968ac 86e1de6f", + "b6c717fb 5bc73a2d db99f3e4 cf2c342e -> 09147e07 5d693252 a02cf3ed 8d403645", + "44459fe6 870e29b0 b736ac14 4c387fed -> e3b47e33 a6ce3e6f 9913522c f1537946", + "2761b359 ac8a6698 56bf4545 596f40ca -> ef131a63 e03ffec0 abe43828 b14e4898", + "275e9c26 fd274103 e3e1b5c4 c2d5999e -> 606948a3 4d7a37ec 36323cce 52b798a6", + "cd7cb5b5 76aa5627 e44ea083 2791cde3 -> db848a31 7cf06923 e898b738 a394e897", + "9b1874d6 dcab07b4 0c228cce fd2b6886 -> 6bede8b7 5339eab8 6db2e154 26b06107", + "45c466e7 f5a68d76 60dcbf71 959ff269 -> 6f283761 aa04c07b 9587ac15 de39703f", + "2f91f0c5 899e7dc1 08649d6a 33c24733 -> 33472e6a c1e69436 c77d18e5 d517f426", + "b14c6248 712653e7 1b7266ac 6d447a3a -> 38729db4 36e29259 b7362c68 865a93a8", + "0bd75d8c a591ad33 0845102c 1d738c97 -> f6505c2a 0fe3e1b9 7595089d 71345827", + "dbd10129 869ab4b5 1774ad8b 791c27c6 -> 2bc46fef 143c422e aaef513f ed0f4e57", + "91673066 11d1372c 7a4aecd3 ee66d5fc -> 784f3223 0a3c365e b16690e4 a5cf4f45", + "665a2a9a a89224bd fb3b1693 4152746e -> a9e6a874 4b47d58c 40081a3b facc6484", + "c90ba92d 6cd16d28 586ad7a8 eaa6309f -> f94d9a62 2331ba6f 1b528c70 414185c2", + "eb426bcf a6cc8907 7844ce52 0b02d246 -> fcdec043 76c7e9ec 10203859 6f7acd61", + "da2338b2 fec858db 86fbdf31 3c6a5771 -> 3c0455a5 16ce0123 e7d88902 e23213f0", + "d8215807 a9b75724 5bdfec90 2cae7567 -> e45cb24b f43a242d 9a2a2318 993831af", + "9b3e9090 40f1225a a84fd17f 273f4829 -> ecd06c53 608ecded a3da6b51 91cbde9a", + "bc4e58c1 ab3d557a 50fbe11e 85075cc8 -> 87774758 912f1b90 7a8c6940 e6d98263", + "8a2559cf b8b32990 ee338665 41eaee1e -> e4f24cb3 72f816c5 53bfb387 e886d421", + "e8c62930 8079ba7d 57749143 20643c60 -> 8c4f526a 8ebc22ce 4f54c10e 9b4c294f", + "e7c051fc 7d8f4a1c 7aebabaa 3281d38c -> 160cbfae b3cec701 4635cc17 f2cfb8f3", + "4a3cebe9 7eb548d1 d0fe6efb 10ac2455 -> 6026dd9d 55e66f66 aa2acf35 0ceda93f", + "93c7c1f5 118cf185 9702e790 7f5e647e -> 2fc13667 9a90d096 a0425aa1 8fe7da1c", + "8374b1c2 2c96a87c 5230f4cb 9698fbca -> 36c7e0ab c45e3391 fdb32865 623fd8a1", + "8ad72e26 1d1d1b67 31b92656 d06e4f16 -> 787d3c84 99aeedf7 5c995c41 7ceda439", + "e545fa57 490bc96a 00363b8b fbd175b8 -> e3870e5d b44677e2 541befb5 4cac3427", + "8582bca1 fafe479f 839ab9dc 7b768ce1 -> b5cb86f0 19f97580 894b6aaf 1399a1ed", + "b755cba0 3d4343b9 1a9baa7d 01f49830 -> 30d1aaee 1f6954a7 5f6aa06e add2ffdf", + "a90af28a 91b1bf44 69f0729e b922eed4 -> 2ef656eb 19142fef 6f82fcb6 012a359e", + "7c399b5c 73ea0db4 afa60958 659faf82 -> 8a2631f4 c4d7bcdf 26af8087 68bdd3fb", + "09927ccb adf67c91 cefc669c c6a5d68d -> 03c7dec0 a9d5c34f 13d89981 dedc2dbf", + "8b2787af 404913e1 fc193279 140ca8b5 -> 2852591c ebb9566c 6564b827 9b4b7135", + "8ecd4ebf 7a7b5a79 70259acf d9c429d8 -> 2deea220 13344894 3347001a 0280e7ba", + "bfed0329 2f6fa99f 1dd61b4d d18008b5 -> 22e9df47 ac1d9513 3efac874 fce3db23", + "3219af89 9c67d831 ec0e76aa 9ccbff38 -> d4e6bf82 595b6fa5 ffb01720 629d153c", + "f0645031 49da137f 476fc831 27275f44 -> 743ab7ea 1612c403 5ba7fd22 122c9057", + "b1280a63 fb5ce240 cc8d5de9 d20e281e -> 1f6db4c8 ca36aab2 9c236609 c4d7171a", + "89d1766e 0b2de9f6 f1b1ea68 ba6d7278 -> 82a7d95f 0ac76459 5a812dfa 6dbf8ff2", + "903cc9d0 67e617bd 5ecee47f 20cd6f90 -> ff052882 adb1e6c9 64220554 7a30211f", + "ae5fd183 d85b4d7e 845e150a d4ab60e8 -> 9740c96c c261c51d 486ff70e b74265f4", + "cd33d3af 4aa8b234 00fda026 98b66a46 -> 1f10cb4e c384d793 2c00a26a 44048ffb", + "7139f927 0802c135 2b85c76c f516c756 -> f7b6bd80 979e9e36 cd773471 170b6f3b", + "45530a5e a415f106 44f73221 a4fc5570 -> f129955e ec910ed3 fe1e8755 6e518ebe", + "e1a25abf b61a6716 06ba9ab5 b78b6c9d -> 8efac9a2 66618d32 cfed9ad7 5e055f5d", + "cc0f82f0 2443e17d aacf3094 6e3a1a42 -> 7a39b43f 960e2bad 3d52ff58 bb745e8d", + "c1bcb9a3 73810351 0dd89cb8 f106c790 -> 824b423f c2eb300f e1cacadb 8bf4505a", + "565ad393 1fecf88a 815b7df9 4e3e80d0 -> 0a947096 8de235a6 18f3a79e 2768a62e", + "1a997001 bfb29ec0 b6eb6902 7cffc79c -> 8406a0ec 006fc954 4e97519c 4d1bc88e", + "570d1614 ff440fdd 981fee84 e56ea13c -> 4f1a9378 41855a1d ac00bc33 d855d7ad", + "9397c12d 639fa5c1 4eeb5f75 2b23faf2 -> 02cdef6d 60be8ab8 4362437f 35590005", + "c4d51a8a 842c3dbb d73b2394 e3048972 -> 6eae9ffe 286d78b6 58ce4a7f fe205a23", + "d64649cd 7e178b01 269a25c9 13b46f4c -> 76cb078c 350c30a0 b055c892 d56598bf", + "672bedcb 684024f2 6b65123f 5d9c2a06 -> 88706321 6cb68bb3 bec1c0ff 3e618ffa", + "e2aeda6d cb68acf1 25d20d34 de8b95ef -> e86305c3 2190cf33 813be083 338a5c2d", + "66881f94 8451632f 19473d9b 7fc347c7 -> da4fb4d0 d2e14ba7 bce01702 63eae04c", + "b098ade7 f62c25c5 8bdf4d5f c82ea272 -> 893cdb27 7b1d4d96 c39e5834 1a306784", + "6b6c9960 799f8ee9 cc89b56d b9286f62 -> 4a109aab 1c2a263c b1716b79 5244db64", + "d932cca0 3186f0d0 72ddae73 04acbce0 -> f1cb01e0 9d6c7299 e61a13f6 c22e0bdb", + "126fade8 5cfc954a c44e04cf 0fe108de -> 177bec91 79d4bc37 5e87ad1e 8cffd36e", + "b4ca68a8 adf17e01 5197cdc9 8ffe1cad -> 702b5b8f 9811ad90 83c9454b cd14f477", + "f64fe856 1416dff4 8c2c8ad0 4b6cb5ea -> 9ed01ead ae52ebb5 7ca8f3b0 aaf0f814", + "47392dc3 e221f9c6 7ca0c068 c34599e0 -> f12187b4 849dcdf3 66c91041 1dfe2fe4", + "51906928 218c4b98 7a101493 7955aba1 -> 7d5a5c5f 20ea08d8 a641702b 145a77f1", + "2a965667 c74316fe c8605b1e f1d89058 -> a05d17be f295d20d 7c3ce107 80e712a8", + "d850b6fe 5d934f8c 09611d3f b78cc316 -> b98d8407 2c469e19 429bab1c af03ae27", + "cc382b64 aeafc65a 312b2f7d 3c637c26 -> e55dcd82 611b1c17 f949afb2 9a2698fd", + "7bedaa40 4397830b 0813e4eb b3cb98e3 -> aa71f805 6fa22999 a53dfa88 417d68bc", + "063a0097 40c45784 9b3aff47 dac5ac27 -> 99825b64 63597d19 6e3f82c6 f3323b63", + "0dc7efb8 59e6c848 c5136ef9 d771c85c -> c79fa76a 9033767d 5c89ebee 34c98f22", + "fae614c5 bedbac7f b2084380 6b38342b -> db81ec9f 2316c32d e56902df 7a552400", + "0437d631 7ee08fed 6e182158 8ae6e212 -> 1eacb2dd e4848c71 91e44390 15d21a08", + "e0f1f1f9 92ebfe5d 588db76c 1028c378 -> c1781c74 f9d568c0 da4db30e 4863f832", + "a517b742 11faac16 cb9bd0b3 77c925bc -> 5d2a9dc1 0ef43102 d9d09f5d 10de8873", + "886f0a86 7ef0ba6e c60e9846 1c706505 -> c113e1b7 3f7cd5af 3be23b63 bc9f0f4e", + "f384b7e1 d0ffb35b ae421433 d88e97fa -> 63486e63 e02093ab fabf7741 359d0fd6", + "2b97e571 8dafc2bb a3a79dbc 5fb0a2c7 -> 77fbb227 d54703a7 cd19bd4b 7517aeb1", + "1c75c3ee e0fad0ba 479863ba 67e72f86 -> 703ad6bd b2988cc7 0120d706 a3b4fb2e", + "0e3e0c7e 1fef824b 0b2c0f8c 8d57d9ef -> 6998ff94 409e2508 8088847c 4c48c9f0", + "a94536fc 053258d8 99c5328f ee9492ea -> b8f98a9b 887392e5 e60bcd64 8d355b52", + "14554841 9b1db952 38b4f399 a9d71be4 -> 95d850ff 8bd2ed39 4dc068e2 e0a0569f", + "d45779f1 c100666a ccbe4028 650e8d08 -> da7bdcd7 08b480e2 536f0d25 7cff607c", + "3c91c929 af803e03 9235a639 787f162d -> 1de71482 a93a24b6 acff8728 0b587d7c", + "3aa51470 8ef96605 11ae3dd2 f65bfc48 -> 81caf356 3272e72c a5ca6163 c6b9a903", + "4c8f8d8a 82243c09 75dbc15f 207db1b8 -> 90afa019 5e91b080 58650822 a83dbd27", + "76366575 c8e98d88 5aa426d3 e67aa0ea -> 532d85c6 db7f31ef 6379c163 69f408f6", + "5b5e83d1 887d0a6e 9f14ccfc 5f6412e3 -> 047dfcd1 08004eaa 4db16230 9a1851c3", + "15d0702b 4c71e057 c0fed737 b0fddf05 -> 3b8f0dd3 b837e8d2 fd839da6 3f0b5b6b", + "056de593 f0992071 0c6394d7 c41e8150 -> 21ddee60 093e5822 6de119fc 8c4a3db9", + "354ff595 f0d7c33b 0d9bfd09 c8b001ca -> d8ae99b2 16d78d9d 341a5dd3 2e0ab794", + "0c03bf44 408ccd92 3418ee7b 0a1f9bed -> fdd6c4d1 4a5d1fa5 fce27ae1 d5b20494", + "8d8d504a 23786d33 eba1a599 e0cadf08 -> b229379e 2a39483d 7d4f3056 84753821", + "8fc2fd79 76ac40ad 074ad969 4017db5b -> e361da34 447940e0 b3412315 3e18c699", + "e86c65e3 a4e2cf75 831b71e8 bdf92447 -> d05970c8 dd49c53f 95cdceb2 7eca4bc9", + "e461dc8f f8d7ea02 864f3ade b40c4c7b -> b87309e7 3eb0ac45 767e8ab3 35115f4d", + "49d52eb4 6ef84d86 084d4274 b89ccbf7 -> 395efcb6 0cfbe646 4c10b5d9 74c764b5", + "aceba8b7 3e4e33bf 05b8af3c 1ca8820f -> 1a92e3e2 90f7652b 28c5e666 56d78311", + "9b8cb196 d95a7510 1e19ad0b bc61cb64 -> d5da5cd3 40ba3204 333086c7 e587b0e7", + "93cdf082 f8b083b0 f9d63982 42480da0 -> e40ab36b c1c14f97 c1a9ca00 617d9f2b", + "94e9e30c c325d283 b6ddebaf 274b91b3 -> 6349e2c7 34d6f6c8 beab0aca b27fc31b", + "545e331b e4729c81 728aa8dc 13b2d102 -> cccdefb7 7ef5adb2 42f6dae9 e753fa3e", + "f429fd30 c9fd4f65 6a237100 91e2a50d -> 1f2c3d51 9ef8b01d c06b6843 65c176dd", + "0b45e840 8e0765d8 ee5b9d5b 21d452a1 -> 66e1fe58 c5db0a11 6f23c9c3 65425b45", + "ef18a39f 9483f05e 73c67486 f538b6e0 -> e4a93057 d8f6eaed b7b7591a c6389a96", + "96579849 bc06abc3 800f8253 4f0f2a37 -> 3ee30459 1205ac85 5a642d79 47743cad", + "89a5e40e 6009d2b7 b1438ea4 75509592 -> affd8955 faf477c3 070cffad 14640659", + "7c57ddbd d2df2bb1 6ff49790 6cfb5885 -> af1edfae 2e861d59 f3aa028a a5aa6aef", + "114ac4c8 18cdc7b6 8007607c 88c8f31b -> 9a056093 cc11714f 788bb755 ab3fe67d", + "28776f6f 7f1463ff 6fa2d7ee d199301e -> cd6f077d 3d99ae75 036c7c00 2bb33c9d", + "5e4f5037 f819c66e 84867437 80673c06 -> e9dec034 cec8a966 7b15dfa1 5f2cff58", + "69899795 e1146731 3720f133 ed6e7ae0 -> 648d8be4 e5f39fe4 a79c47cb 0224c067", + "3b0a773c a6502f27 011b48cc 00c4c0d5 -> 674a9196 b1f88c8b 2250768b ca418f2a", + "dae51200 2a739e7c a5892215 47d718d6 -> 06ec973a 9d191258 d55fdb75 ca0da93d", + "9fe3eff0 3d7449a4 212502a2 829eb72b -> 5bd3d6bd 37bbcd46 b139d3c3 23c40c5f", + "b26095ce 2a26e41b 5983c1a8 8f8cb3e7 -> b3902532 0074b0c1 c5efbab7 d0e20781", + "df14f133 f8ecd5fe 2972f478 70418eee -> b591d253 8c940ba5 bda7c20b 39f587e8", + "8f898707 503779c1 2475a636 a31ac374 -> 98a86463 f9c71b4f 19361c17 e876cca2", + "6c2b0600 05278489 ce709a64 1f7828de -> 7d52b01c a4a2fd53 f8c72c62 3e42ec9f", + "4dbd36ca 9ae71aad eec83595 2466ffcf -> 0a8b4859 2bf014fb edba9bde 5691c099", + "b7fdb6aa 7a54cea4 2c1fca55 b03ddc0a -> 952023ef 5eb2e381 bda2b278 f3419f68", + "b47d925e 0e42e4cb d88e88fb e2142621 -> b16f5cd8 ad6b9622 eccad7c3 b27daed1", + "048c70b7 a0348557 0ccbf3c0 07e45a95 -> 97d76341 489991e2 01bfb0f8 b1584b49", + "e100f05f a938de7a 16959b0b 11b8d749 -> af6fe1cf 3825c46c 46c66ddd c347dfcf", + "65947844 84fe52f8 6a0417e0 f5c92714 -> 8c757528 66e8f2bc b44dc8cc 9b6d0f90", + "55f45c69 d02578fb fa6abd70 1bf00f73 -> 346c84d6 c0fc7e0e 147a75f2 215c8e80", + "869d8919 1b1d2ad1 5502c583 f9a47e0c -> ac817ccc 9469732f 6f9c0430 b6a6d103", + "96e47c48 7d0095ca b37460fc b2280b5a -> 7418d18c 4726c8cd 63dd9c1f 7a914238", + "f7352f56 31951246 c0a45a8d 80bd9438 -> 19719c23 647125d6 fdce1303 25d0d1ff", + "699967f0 5dd8e4de 453bd06f 077da4e2 -> 48b4a01a 97a53e36 5a8d3cd1 88b190fe", + "27c19413 18c22ccf ca85376b 66a57345 -> 33e0c86e 2b5aa53b 2bc94cec b89717ee", + "c94b7de1 b5a5bbcb bc1afeab 83b35987 -> 50c03a8a 550bd10d 344d4651 f19a35d1", + "ad1dffca 0e40ecff a94673f4 54043ee0 -> 1b23c381 3fe21451 bb7878dc 703b895b", + "7c8ff5e0 33ce219a ed3f2658 f24fde8e -> 37b50f2f 7e79f66e dafcad5c efbdb9c4", + "9a3bbdad 40ac92b8 24db536d 456fb1a6 -> 827ba5dc d62bb280 9b42f92c 7abde2e4", + "6bf538b8 33acf0d5 dfe4323f 7fc1d843 -> dbd54ac8 a818485e 2bf3b9be 3274bcfb", + "1aa68eb4 e6d0014b 6297afec 3ff6e541 -> 46eea90c 1756eb3a 08cc2d93 92b807f7", + "6f62fe4e 1e334380 40832c20 6239e018 -> e994460f c57f81b2 15c7729b 0856ac3d", + "e59a6648 e90211a3 9ee3e09c 737b88bc -> 9e0fb8df 50e3c6d5 a1b3ed44 3c45c1f9", + "907fa4de 47055dd2 821e5455 6ed09732 -> 57b5efd7 2becb71a 977d9680 994476a2", + "57b478f3 dc96fe5c 01198456 ea54c923 -> 74a181f6 32afe5cf 161b86c7 219cd49d", + "26593f3b 19c16380 14e177bf ac09a935 -> 7fed3db8 704ca09c 052cfac4 23e68077", + "5a60786c 831faf6a 947db340 994b698c -> fee5a8bc 10ef1615 30a63306 c6865aaf", + "52067ff4 df349777 0d7db081 78514be8 -> c8232746 58471f94 7c4cdb54 581447c9", + "1b0530a8 064ffe64 052ce14c e4ae8542 -> 873e226e 86daead9 e31dad7e f13fc486", + "3c6c268e 373b9d97 a6991ed9 0aebcd32 -> e8c3aa26 d8aa9b73 0d9c4f7d 47349a2e", + "25d1134a c04144e9 3fde0400 f17291f5 -> 1b6cd397 f624b69b d020f38e c9ff2fa4", + "0548d552 7b3850fb a3670abe 03c38379 -> 164ca20a 96541a1d 1fb1108f c7eb5df0", + "52284f3a ffffa516 611b3be7 c1cd8b81 -> dcf45def 241cd402 6c6c5d66 399ab4ea" + ] + }, + { + "glsl": "vec2 cultmath_iv_point(float)", + "tolerance": "ulp-bounded", + "cases": [ + "4195d92a -> 4195d92a 4195d92a", + "411f5b66 -> 411f5b66 411f5b66", + "c168068f -> c168068f c168068f", + "413cdbdc -> 413cdbdc 413cdbdc", + "4156b6d8 -> 4156b6d8 4156b6d8", + "40a0b4b4 -> 40a0b4b4 40a0b4b4", + "408cea18 -> 408cea18 408cea18", + "418fe948 -> 418fe948 418fe948", + "416852a0 -> 416852a0 416852a0", + "c1447099 -> c1447099 c1447099", + "3f6fbfc0 -> 3f6fbfc0 3f6fbfc0", + "c18764db -> c18764db c18764db", + "413e7cd0 -> 413e7cd0 413e7cd0", + "c1678826 -> c1678826 c1678826", + "417de13c -> 417de13c 417de13c", + "41918e98 -> 41918e98 41918e98", + "c154117a -> c154117a c154117a", + "40a7d508 -> 40a7d508 40a7d508", + "40986130 -> 40986130 40986130", + "c188da98 -> c188da98 c188da98", + "c13f3249 -> c13f3249 c13f3249", + "c15dfa90 -> c15dfa90 c15dfa90", + "3e025800 -> 3e025800 3e025800", + "c17229f4 -> c17229f4 c17229f4", + "c19b10f7 -> c19b10f7 c19b10f7", + "c03976c0 -> c03976c0 c03976c0", + "3fb31840 -> 3fb31840 3fb31840", + "417b72c4 -> 417b72c4 417b72c4", + "40f49858 -> 40f49858 40f49858", + "c13d1aa9 -> c13d1aa9 c13d1aa9", + "c0fa3d0e -> c0fa3d0e c0fa3d0e", + "c1001d90 -> c1001d90 c1001d90", + "3fda0f10 -> 3fda0f10 3fda0f10", + "4191df4c -> 4191df4c 4191df4c", + "41556c50 -> 41556c50 41556c50", + "411ffaae -> 411ffaae 411ffaae", + "c173fcae -> c173fcae c173fcae", + "c0e8316a -> c0e8316a c0e8316a", + "4053ba78 -> 4053ba78 4053ba78", + "c057b8c0 -> c057b8c0 c057b8c0", + "c0b5beec -> c0b5beec c0b5beec", + "c19bdc7c -> c19bdc7c c19bdc7c", + "c141c0aa -> c141c0aa c141c0aa", + "3f9b6b20 -> 3f9b6b20 3f9b6b20", + "41514ab8 -> 41514ab8 41514ab8", + "4190cda4 -> 4190cda4 4190cda4", + "c13bf50e -> c13bf50e c13bf50e", + "3e146c00 -> 3e146c00 3e146c00", + "4182d732 -> 4182d732 4182d732", + "c1918db5 -> c1918db5 c1918db5", + "4107c726 -> 4107c726 4107c726", + "c16e6259 -> c16e6259 c16e6259", + "c09dfb4c -> c09dfb4c c09dfb4c", + "c05d3a28 -> c05d3a28 c05d3a28", + "c0cba552 -> c0cba552 c0cba552", + "4149ace4 -> 4149ace4 4149ace4", + "c122adfa -> c122adfa c122adfa", + "c19aee4d -> c19aee4d c19aee4d", + "4132fdca -> 4132fdca 4132fdca", + "c06badf0 -> c06badf0 c06badf0", + "c1830457 -> c1830457 c1830457", + "410b0248 -> 410b0248 410b0248", + "c11a799e -> c11a799e c11a799e", + "40cada90 -> 40cada90 40cada90", + "4178adf0 -> 4178adf0 4178adf0", + "c130e673 -> c130e673 c130e673", + "3fafa340 -> 3fafa340 3fafa340", + "415abe38 -> 415abe38 415abe38", + "c0f9e8e8 -> c0f9e8e8 c0f9e8e8", + "c1621970 -> c1621970 c1621970", + "415719e0 -> 415719e0 415719e0", + "4160073c -> 4160073c 4160073c", + "c190820d -> c190820d c190820d", + "c13de139 -> c13de139 c13de139", + "41092a48 -> 41092a48 41092a48", + "c1477950 -> c1477950 c1477950", + "4191e30c -> 4191e30c 4191e30c", + "41974dfe -> 41974dfe 41974dfe", + "c10374ad -> c10374ad c10374ad", + "c18bde9a -> c18bde9a c18bde9a", + "c13268a2 -> c13268a2 c13268a2", + "c195f755 -> c195f755 c195f755", + "419ae230 -> 419ae230 419ae230", + "40bacf28 -> 40bacf28 40bacf28", + "be9c3a00 -> be9c3a00 be9c3a00", + "c14ebc2e -> c14ebc2e c14ebc2e", + "4187700c -> 4187700c 4187700c", + "c16d6f94 -> c16d6f94 c16d6f94", + "40932280 -> 40932280 40932280", + "c19a204a -> c19a204a c19a204a", + "3e2a2a00 -> 3e2a2a00 3e2a2a00", + "c17e2014 -> c17e2014 c17e2014", + "3fc74c00 -> 3fc74c00 3fc74c00", + "c15025e6 -> c15025e6 c15025e6", + "c0dfcb04 -> c0dfcb04 c0dfcb04", + "40b43c80 -> 40b43c80 40b43c80", + "4122c0a4 -> 4122c0a4 4122c0a4", + "3fc69070 -> 3fc69070 3fc69070", + "40b57ef0 -> 40b57ef0 40b57ef0", + "40846258 -> 40846258 40846258", + "c0516488 -> c0516488 c0516488", + "c0ad668c -> c0ad668c c0ad668c", + "c140b9da -> c140b9da c140b9da", + "4127c7d4 -> 4127c7d4 4127c7d4", + "c13a354a -> c13a354a c13a354a", + "4167bfec -> 4167bfec 4167bfec", + "c186af20 -> c186af20 c186af20", + "c1511c6e -> c1511c6e c1511c6e", + "40ff0e5c -> 40ff0e5c 40ff0e5c", + "c15e5958 -> c15e5958 c15e5958", + "4165e6c8 -> 4165e6c8 4165e6c8", + "c11149f8 -> c11149f8 c11149f8", + "410d9810 -> 410d9810 410d9810", + "410abafe -> 410abafe 410abafe", + "c14882da -> c14882da c14882da", + "c18d0d02 -> c18d0d02 c18d0d02", + "41153de6 -> 41153de6 41153de6", + "40903d9c -> 40903d9c 40903d9c", + "c155b0ea -> c155b0ea c155b0ea", + "41076a1c -> 41076a1c 41076a1c", + "c0ff8d16 -> c0ff8d16 c0ff8d16", + "c0727008 -> c0727008 c0727008", + "c12ed309 -> c12ed309 c12ed309", + "c108b3e0 -> c108b3e0 c108b3e0", + "40b67bd0 -> 40b67bd0 40b67bd0", + "411539f4 -> 411539f4 411539f4", + "c0f1c48c -> c0f1c48c c0f1c48c", + "416f21cc -> 416f21cc 416f21cc", + "41720448 -> 41720448 41720448", + "c18879fd -> c18879fd c18879fd", + "c028e7d0 -> c028e7d0 c028e7d0", + "c0542fd0 -> c0542fd0 c0542fd0", + "c0d846f2 -> c0d846f2 c0d846f2", + "40f4b450 -> 40f4b450 40f4b450", + "40b937dc -> 40b937dc 40b937dc", + "41644aa4 -> 41644aa4 41644aa4", + "4154cb30 -> 4154cb30 4154cb30", + "c1320374 -> c1320374 c1320374", + "c0218c80 -> c0218c80 c0218c80", + "40a6bc8c -> 40a6bc8c 40a6bc8c", + "c180aef8 -> c180aef8 c180aef8", + "411ffc86 -> 411ffc86 411ffc86", + "c033db10 -> c033db10 c033db10", + "bfc0ab30 -> bfc0ab30 bfc0ab30", + "c15a275c -> c15a275c c15a275c", + "c12c0d62 -> c12c0d62 c12c0d62", + "c097704a -> c097704a c097704a", + "414e2e84 -> 414e2e84 414e2e84", + "419c2e7a -> 419c2e7a 419c2e7a", + "c115cb7e -> c115cb7e c115cb7e", + "4182702e -> 4182702e 4182702e", + "c1655e28 -> c1655e28 c1655e28", + "c0a2fa12 -> c0a2fa12 c0a2fa12", + "4189aaac -> 4189aaac 4189aaac", + "c0fc1094 -> c0fc1094 c0fc1094", + "c19bde8f -> c19bde8f c19bde8f", + "c167e03c -> c167e03c c167e03c", + "4183fd04 -> 4183fd04 4183fd04", + "c1737614 -> c1737614 c1737614", + "bf76f3c0 -> bf76f3c0 bf76f3c0", + "400288c0 -> 400288c0 400288c0", + "c13c800b -> c13c800b c13c800b", + "c10320b8 -> c10320b8 c10320b8", + "40a0f654 -> 40a0f654 40a0f654", + "410be09c -> 410be09c 410be09c", + "c0143510 -> c0143510 c0143510", + "418d6cc0 -> 418d6cc0 418d6cc0", + "c196610b -> c196610b c196610b", + "c188f078 -> c188f078 c188f078", + "c0d99afc -> c0d99afc c0d99afc", + "c12ee535 -> c12ee535 c12ee535", + "3ee82b40 -> 3ee82b40 3ee82b40", + "c14f7e13 -> c14f7e13 c14f7e13", + "3fb78680 -> 3fb78680 3fb78680", + "40919018 -> 40919018 40919018", + "4000f3b8 -> 4000f3b8 4000f3b8", + "41982d60 -> 41982d60 41982d60", + "4129425c -> 4129425c 4129425c", + "c16e8c84 -> c16e8c84 c16e8c84", + "c062d2d8 -> c062d2d8 c062d2d8", + "c0be1bd0 -> c0be1bd0 c0be1bd0", + "bee21900 -> bee21900 bee21900", + "4176c4d8 -> 4176c4d8 4176c4d8", + "408f9f90 -> 408f9f90 408f9f90", + "c155d455 -> c155d455 c155d455", + "c104dbcc -> c104dbcc c104dbcc", + "c191c776 -> c191c776 c191c776", + "c07de348 -> c07de348 c07de348", + "c08f3b1e -> c08f3b1e c08f3b1e", + "40a8b218 -> 40a8b218 40a8b218", + "410c2ae2 -> 410c2ae2 410c2ae2", + "41866896 -> 41866896 41866896", + "c17e8d60 -> c17e8d60 c17e8d60", + "4193860e -> 4193860e 4193860e", + "c186a1f5 -> c186a1f5 c186a1f5", + "417b221c -> 417b221c 417b221c", + "bfe71610 -> bfe71610 bfe71610", + "41428e14 -> 41428e14 41428e14", + "411c09fc -> 411c09fc 411c09fc", + "410ae5e8 -> 410ae5e8 410ae5e8", + "c106e6e2 -> c106e6e2 c106e6e2", + "c0bdec1e -> c0bdec1e c0bdec1e", + "41200f74 -> 41200f74 41200f74", + "40ca54e4 -> 40ca54e4 40ca54e4", + "c1937324 -> c1937324 c1937324", + "c084c202 -> c084c202 c084c202", + "41950ff4 -> 41950ff4 41950ff4", + "41579228 -> 41579228 41579228", + "c0eae566 -> c0eae566 c0eae566", + "4121bac8 -> 4121bac8 4121bac8", + "c1940bef -> c1940bef c1940bef", + "c0a24534 -> c0a24534 c0a24534", + "4136868c -> 4136868c 4136868c", + "41053ea2 -> 41053ea2 41053ea2", + "c1706155 -> c1706155 c1706155", + "c18c2684 -> c18c2684 c18c2684", + "c0e689c8 -> c0e689c8 c0e689c8", + "40ea1f00 -> 40ea1f00 40ea1f00", + "bfcd8410 -> bfcd8410 bfcd8410", + "c03d0e60 -> c03d0e60 c03d0e60", + "c082fcb2 -> c082fcb2 c082fcb2", + "3fd29290 -> 3fd29290 3fd29290", + "40b5b6f0 -> 40b5b6f0 40b5b6f0", + "c018e7e8 -> c018e7e8 c018e7e8", + "408e0f40 -> 408e0f40 408e0f40", + "c0f76cbe -> c0f76cbe c0f76cbe", + "c068c518 -> c068c518 c068c518", + "c1368a30 -> c1368a30 c1368a30", + "bfde5a30 -> bfde5a30 bfde5a30", + "410da5f2 -> 410da5f2 410da5f2", + "c1817028 -> c1817028 c1817028", + "c1523355 -> c1523355 c1523355", + "c19963d0 -> c19963d0 c19963d0", + "c065c9b0 -> c065c9b0 c065c9b0", + "c171cdd4 -> c171cdd4 c171cdd4", + "419ff414 -> 419ff414 419ff414", + "4118dfc6 -> 4118dfc6 4118dfc6", + "c12e6598 -> c12e6598 c12e6598", + "403ad838 -> 403ad838 403ad838", + "412c8cac -> 412c8cac 412c8cac", + "c0ddf76e -> c0ddf76e c0ddf76e", + "c13b2113 -> c13b2113 c13b2113", + "c185030f -> c185030f c185030f", + "40ad4f54 -> 40ad4f54 40ad4f54", + "4071c3a0 -> 4071c3a0 4071c3a0", + "c0c5650a -> c0c5650a c0c5650a", + "c169b561 -> c169b561 c169b561", + "c0879804 -> c0879804 c0879804", + "41576d70 -> 41576d70 41576d70", + "c19a7b71 -> c19a7b71 c19a7b71", + "40399bf8 -> 40399bf8 40399bf8", + "412e0dbe -> 412e0dbe 412e0dbe", + "c0c782d4 -> c0c782d4 c0c782d4", + "c0e964d6 -> c0e964d6 c0e964d6", + "c0e7377e -> c0e7377e c0e7377e", + "411ec6cc -> 411ec6cc 411ec6cc" + ] + }, + { + "glsl": "vec2 cultmath_iv_add(vec2, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "41062738 410635b8 c192c576 c18f17b8 -> c11f63b4 c117f9b8", + "4199a15f 419e2ee5 c09ac88d c097c1bb -> 4165de78 41707cec", + "40a715f6 40eb5662 c0bcd4a7 c0bc9741 -> bf2df588 3fbafc84", + "405c2e68 405c3548 c0e25ac8 c0e25868 -> c0688728 c0687b88", + "c17be971 c17763af c18024da c1802306 -> c1fe1992 c1fbd4de", + "bfdd3e44 bfdd3abc 415d50c5 415d5973 -> 4141a8fc 4141b21c", + "c152013c c15200c0 c09c2fad c09baed7 -> c1900c89 c18fec16", + "c160c98d c160b891 414eefb8 41542c70 -> bf8ecea8 bf48c210", + "c182f2f0 c182e3be c10662ed c10629b3 -> c1c62466 c1c5f898", + "c15947be c13fc916 413421da 413556f6 -> c0149790 bf272200", + "41514853 4151baad 419743f5 419ac89f -> 41ffe81e 4201d2fb", + "419b4f11 41a05963 41423f7c 41480f94 -> 41fc6ecf 42023096", + "40f804ca 40f8d2d6 40cc6ef7 40d26249 -> 416239e0 41659a90", + "c1346b72 c13469a2 c10830be c102f288 -> c19e4e18 c19bae15", + "bfec51e5 bf84691b bf9a2ef2 40c1d00c -> c043406c 40a0b5c5", + "c0f3c9ed c0235e56 c009847a c0093826 -> c11c4615 c0964b3e", + "c1946e84 c193041a c10a32b3 c10a2e01 -> c1d987de c1d81b1a", + "413e584b 416da15d 4183d249 4183d6d7 -> 41e2fe6e 41faa786", + "41825883 4182ade5 c10ef8b0 c003136a -> 40eb70ac 416496f0", + "c196ecc6 c196ebfc c11205d4 c111d6ce -> c1dfefb0 c1dfd763", + "c13d4346 c139d656 411b31ff 411eb969 -> c008451c bfd8e768", + "40ceb843 40cebe4d c074420c 4026ecac -> 40292e7a 41111a52", + "c185d9c3 c1852939 4194c6f3 4194db15 -> 3feed300 3ffb1dc0", + "c115ea42 c103ebf8 c153eac5 c128a44f -> c1b4ea84 c1964824", + "c192f5fa c1919fec 40f37ab8 40f3a588 -> c12c2e98 c1296d14", + "bf820f0f bf6ba1e1 4169bb18 4179b918 -> 41597936 416afefa", + "402e2979 402ebfe7 411b1855 411fd263 -> 4146a2b3 414b825d", + "412a97cc 412aa8d0 40df90a0 40dfbd08 -> 418d300e 418d43aa", + "3ecabb36 3ecb03ca 41270674 412c7e3c -> 412d5c4e 4132d65a", + "c148f2fa c13c94ca 40ba98b6 40fe1552 -> c0d74d3e c0762884", + "c156a37e c15692b6 c16d5f74 c16d5866 -> c1e20179 c1e1f58e", + "4189279d 41897337 419caef9 419caf9b -> 4212eb4b 42131169", + "c0e5179f c0e45279 4187e568 4187f668 -> 411d3f00 411dc394", + "c0a3aeeb bf3b9568 418b21b2 418c09aa -> 41446bee 41862cff", + "410dfa35 4163347b c17fa90d c17f9fff -> c0e35db0 bfe35c20", + "c056556e c01cc2e2 c148378a c13e397c -> c17dcce6 c1656a34", + "41837778 41847424 4178b6ff 4178b8d9 -> 41ffd2f8 42006848", + "c191bca4 c1917ed4 40f41e73 40f42fcd -> c1296a0e c128e5c2", + "4191cf05 419c88e3 c14d77de c14d757a -> 40ac4c58 40d73898", + "bfb20328 bf9fd6b8 416d5dda 416d5e9e -> 41571d75 415963c7", + "c07e0cb5 c072e12b c0a2e77e c0a2d052 -> c110f6ec c10e2074", + "c081726b c0815b15 41860bb5 4186b157 -> 414b5e34 414cb524", + "c13808d6 c138066a 4185daa4 4185de4c -> 40a758e4 40a76c5c", + "40e27e0f 40e2d311 c020c433 c0204aed -> 40921bf6 4092ad9a", + "c16e6e22 c16e5122 c0d36a50 c0d34cf8 -> c1ac11a5 c1abfbcf", + "408065bd 40bf2373 c1947de9 c189c711 -> c168c8f4 c133fc68", + "41352754 413854a4 c0661139 c05f8f97 -> 40f7460c 410070be", + "411907c7 41262c7d c163f6e6 c163f460 -> c095de3e c0771f8c", + "c18830f6 c188309e 4163efad 41708563 -> c031c8fc bffedec8", + "c09e4867 bfce2225 c0b4fc84 c0b0e3b8 -> c129a276 c0e46c41", + "40fdd29f 40fdeeb9 41754a04 419153c6 -> 41ba19aa 41d0cf74", + "40463a89 40473f47 405f5994 4063d6cc -> 40d2ca0e 40d58b0a", + "c0a0198c c07c55f0 c197c36c c197c2cc -> c1bfc9cf c1b74d8a", + "c1035730 c1025490 c0352d89 c031cd17 -> c130a292 c12ec7d6", + "40732c14 4076aa2c bd69b8c8 3ee16899 -> 406f8531 40896ba0", + "4172dbb1 4172ebb7 41547c9e 4154b62a -> 41e3ac28 41e3d0f0", + "c19f2302 c19a11c2 c1508458 c14e398e -> c203b297 c2009744", + "3fb2214e 3fcb2172 4191dc55 4191deff -> 419cfe6a 419e9116", + "c19e5620 c19b6250 408fea54 40900a1c -> c174b716 c16ebf92", + "418cb9a8 418cbafc c1217cd1 c1216707 -> 40efecfe 40f01de2", + "c18fa2eb c182a1a5 c161a3cf c10d64b1 -> c2003a69 c1c953fe", + "41249712 412497c6 4167a484 41683d4c -> 41c61dcb 41c66a89", + "40945f1c 4094804c c15c9ee1 c1388861 -> c1126f53 c0dc9076", + "c08238fa c07c4e5b 411ac812 411ae88e -> 40b3572a 40b7a9ee", + "bf82715f bf7dbd41 41696084 417ce6dc -> 41591258 416d0b08", + "c14781b5 c0cc306a c1978f0b c193fbef -> c1fb4fe6 c1c7080a", + "415742b6 4167cb1a c1846db9 c183c6f7 -> c04662f0 bffe16a0", + "418f3977 418f3a35 4085c42e 40863ca2 -> 41b0aa82 41b0c95e", + "c1003a9f c100380d 40d6decb 40d6e00d -> bfa659cc bfa64034", + "c18955bd c166a72a 40665430 41230a74 -> c159166e c087396c", + "417d0c92 418026b7 c19b1f44 c19b1cd0 -> c064c7d8 c057b0c8", + "bf81af9e bf81a6e2 414eada4 414ed1b4 -> 413e77b0 413e9cd8", + "4196dd70 4196e06c 415b4e38 415b9790 -> 42024246 4202561a", + "c10b74af c10b3a87 c18624f6 c1862432 -> c1cbdf4e c1cbc176", + "41465848 4146c310 c1993c27 c153e5b6 -> c0d8400c bf522a60", + "41931382 419318aa 4029d915 402bf69b -> 41a84ea5 41a8977d", + "410645fd 410f44f7 4035b463 4035ce6d -> 4133b316 413cb892", + "418fa0fa 41924c1a c110e90c c10f8880 -> 410e58e8 41150fb4", + "412c4d76 4169364a 4185c87c 41869bd4 -> 41dbef37 41fb36f9", + "41888080 419225dc c121dd00 c117485c -> 40de4800 410d035c", + "41984be6 419ac696 4087a954 4093af14 -> 41ba363b 41bfb25b", + "c113b155 c113aeeb c170f89f c14d7ac9 -> c1c254fa c1b094da", + "c18703cc c1868c28 c12fb479 c12da4dd -> c1dede08 c1dd5e96", + "41385370 413e8d90 c19f29b9 c19e2eb3 -> c1060002 c0fb9fac", + "c181c834 c1817e58 be827102 3e296303 -> c183d1f8 c1802b92", + "3f06bf00 3f1bbf80 c0241af7 c023f799 -> c0026b37 bffa0f72", + "41928a09 41928def 40ab2691 40ab5e0f -> 41bd53ad 41bd6573", + "3edcc476 3ee9588a c18dfde7 c106ae98 -> c18a8ad5 c0fec7a7", + "c12e32bb c12e203b 4197d752 4197db7a -> 41017be9 410196b9", + "40bc0219 40f6194f c12a602b c129556d -> c098be3d c0392316", + "407288cd 40839919 c158c363 c1589a91 -> c11c2130 c116ce04", + "bf7d38e5 bf4e47db 413c385d 413c39a3 -> 412c64cf 412f5525", + "4183d0e3 4183d77d 3e9d256a 3ea46596 -> 41864579 41866913", + "c0ea7d4f c0e90c91 c1202523 c11ffd91 -> c18ab1e5 c18a41ed", + "c11827dc c1181266 41247c45 41247cbf -> 3f454690 3f46a590", + "3ec7fe6b 3f9dc0e5 c0b73a36 c0b40006 -> c0aaba4f c08c8fcd", + "c0991e7d c099127f c087daeb c08733cd -> c1107cb4 c1102326", + "4117b43d 411ffb1b 418f62e9 418f6647 -> 41db3d08 41df63d4", + "c1353033 c0d0f90a c178a464 c166308c -> c1d6ea4c c1a75688", + "c0494af6 c049487a 41391bb0 41392974 -> 4106c8f2 4106d756", + "bfc68445 bfc0757b bfea91b2 bfea6d2e -> c0588afc c0557154", + "41946721 419889eb 40dd2cf6 40e6f97a -> 41cbb25e 41d2484a", + "c1865f32 c185c112 419fb005 419fb8bb -> 404a8698 404fbd48", + "c181acd1 c181aa33 c197193c c18dba82 -> c20c6306 c207b25a", + "c0c91a7a c0c71172 c199d452 c199d0e8 -> c1cc1af0 c1cb9544", + "c11a914f c11a7e8d c0b9436c c0b93dac -> c1773305 c1771d63", + "c0bb727c c0bb6138 c15de2a2 c15dc1a2 -> c19dcdf0 c19db91f", + "c07452a9 c0735657 419831c6 4198348a -> 41734ee2 4173937e", + "400b1f53 400c487d c00a3b8a 40c8f61d -> 3c63c900 41078d2e", + "c0d886b3 c0d88229 40a49766 40a987ca -> bfcfbd34 bfbbe97c", + "4006c642 401a4e6e c0987e01 c0987877 -> c02a35c0 c016a280", + "411aea3d 411cfc2f c1611567 c16114a1 -> c08c5654 c08830e4", + "417bed00 417bfbe8 c010773e be7c4f20 -> 4157cf30 41780aac", + "c19acc0b c19a5f93 c1910ab4 c19109ca -> c215eb60 c215b4ae", + "c14cfb69 c14cf083 41610776 41666aca -> 3fa06068 3fcbd238", + "40647d1f 4064ae41 c10626e1 c10382a7 -> c09a0f32 c094ae2e", + "406d707f 408e2a29 412c3a12 412eda92 -> 41679632 4175efa6", + "40d95079 40d9520f bf2f632d bf2f2553 -> 40c36413 40c36d65", + "41899fe9 4189b07b 40efa308 40f1b1b8 -> 41c588ab 41c61ce9", + "41906958 41906b28 c04d19af c0301cb1 -> 416d8c44 4174cf24", + "c175796a c1757826 beff0787 befee179 -> c17d71a6 c17d6f32", + "419603f6 419604ba c13a20e5 c13a206f -> 40e3ce0e 40e3d20a", + "c073b3b3 c072e0fd 414387e3 41438895 -> 41069af6 4106d056", + "c1264da6 c0c5942d c190848c c1908068 -> c1e3ab5f c1c1e573", + "c08210b8 c06506c1 bf80b472 40c42dbc -> c0a23dd4 402354b7", + "416082c5 41610c5b c0aa9601 c073c19f -> 410b37c4 41241bf3", + "4152bb7f 4152c511 418928b8 418a5c44 -> 41f28678 41f3becc", + "41641f0b 41648c2d c18ac323 c1062fb2 -> c0459cec 40bcb8f6", + "41660998 41660b50 4062f3cf 4064c931 -> 418f6346 418f9ece", + "41450264 4145067c 40df3c4f 40e01b41 -> 419a5046 419a8a0e", + "400ed34e 4037da32 c127a0e9 c12799cd -> c103ec16 c0f34681", + "c11f0d9c c11ecee2 4180a9b4 4180a9ec -> 40c48b98 40c509ec", + "c0d5b954 c0d5499c c15b6b86 c15b66b6 -> c1a32418 c1a305c2", + "40a0009a 40a09aa6 4172489e 41741aa2 -> 41a12476 41a233fa", + "41064ffb 41093151 c119e54c c1151d86 -> bf9caa88 bf3ec350", + "c14a8b9f c1495c77 c17dde53 c13e4883 -> c1e434f9 c1c3d27d", + "c12dac7a c11aa46a c148b1c0 c148aee8 -> c1bb2f1d c1b1a9a9", + "c0d2d6f4 c0d0e3b4 bfef8675 bfef63eb -> c1075c49 c1065e57", + "c18bf94c c18bf8cc c06e605e c06e5bc2 -> c1a9c558 c1a9c444", + "c11508b7 c11506b7 4058d7e5 40596dcb -> c0bda57c c0bd5688", + "c0e80964 c0410491 c0fd841f c0fd10a5 -> c172c6c2 c12ec977", + "c12333d6 c0641a79 c0acb2aa c0ac5c4e -> c1798d2b c10f34c5", + "c161674f c0caf822 4132c095 4132c313 -> c03a9ae8 409a8e04", + "41581eba 41ab5e6b c145a55d c05c8ce4 -> 3f93cae8 418fccce", + "408aa721 408ac717 c19ea55b c19e8625 -> c177f726 c177a8be", + "c12359a0 c11be282 40cc4174 40e496f4 -> c074e398 c0265c20", + "41806a62 41aec3aa c15f8ded c15eac7d -> 40051b5c 40fdb5ae", + "c19438f4 c18d1484 c0c8c8a1 c0c6675f -> c1c66b1c c1beae5c", + "c193dc4b c181be89 c0e2124c c0e20220 -> c1cc60de c1ba3f11", + "c115634f c10ec7c9 406b2f99 406b5857 -> c0b52ed2 c0a7e366", + "c01a52a1 bfcccc3d 41878c9d 41879947 -> 41688492 41759906", + "4131b088 4131bcf8 c1147fb6 c1147ea6 -> 3fe98690 3fe9f290", + "412fa3e6 412fd5ae c061182c 4002373c -> 40eebbb6 4150637d", + "c16a9f63 c16a9d21 c1669004 c1641686 -> c1e897b4 c1e759d4", + "c11c4fd2 c11ba14a bfe13a1e bfe04362 -> c1387716 c137a9b6", + "413e9491 41520e7f c0b7d2e3 c0b73985 -> 40c5563f 40ece379", + "40ab2a51 40ab32ff c1830787 c1830717 -> c13079e6 c13074ae", + "40c80563 40c806bd 40eca209 4120faf3 -> 415a53b6 41827f29", + "410d7b43 41144085 419bab3e 419bd872 -> 41e268e0 41e5f8b4", + "41467232 414680de 419e8eb9 41a08137 -> 4200e3e9 4201e0d3", + "40ec4e05 40ec4fd3 412deccf 41303639 -> 419209e9 41932f11", + "c0f50a26 c0f4bca6 c089f25c bed6afc4 -> c13f7e41 c10113d1", + "41109ef0 4114e770 c1a1416c c19cf79c -> c131e3e8 c12507c8", + "c1151442 c1150f4e bfb6c7ee bfa41cb2 -> c12bed40 c12992e4", + "c040284f c03ebce1 410f1930 41104428 -> 40be1e38 40c129e0", + "c13c38b2 c13c347c c04a4828 c02d5038 -> c16ecabc c167888a", + "40fcdbb9 40ffec97 c131aaf8 c1317e00 -> c04cf46e c0461ed2", + "c15a81bb c156cd69 41271283 417c75bd -> c04dbce0 4016a150", + "3f33eff0 3fbe4ac8 40ebb375 40fc98ab -> 410118ba 411615ae", + "c193c49a c1905efa c162b55e c162aefc -> c2028fa4 c200db3c", + "41290d42 4129103e c121e3dc c03e9b37 -> 3ee52cc0 40f2d2e0", + "c1b015f9 c16bc767 40969ce4 4097beec -> c18a6ec0 c11fe7f1", + "c11a2c81 c11a1465 c1921604 c1920ba4 -> c1df2c44 c1df15d6", + "405c9754 405d740c bf94579e bf910ae2 -> 40126b85 4014ee9b", + "40b58b0d 40b58c63 4188deb0 418bc9b4 -> 41b64173 41b92ccd", + "c1518136 c151809e 4124303c 41243104 -> c03543e8 c0353e68", + "4164f8b7 4164f981 c1346667 c133f547 -> 40424940 404410e8", + "3f544fa0 3f9e0f90 405a6713 406e8d3d -> 4087bd7e 409eca82", + "c0e2764e c0e199f2 41457047 414570e1 -> 40a86a40 40a947d0", + "416a214d 416a6f43 40ecf75f 40faad51 -> 41b04e7e 41b3e2f6", + "41978cfc 419a7ac4 c1696838 c157f5ea -> 408b6380 40b9ff3c", + "40a52a16 40a608ba c0b45577 c0b452d5 -> bef2b610 bee4a1b0", + "c0f66e66 c0f6655e c17e4759 c17e46ef -> c1bcbf46 c1bcbccf", + "413b9bf0 413bd818 c18cb9f3 c1891869 -> c0bbafec c0acb174", + "c05735be c0570ca2 c19cde9c c135a96a -> c1b7c554 c16b6c92", + "41227c94 41227e68 419ab00f 419b13e1 -> 41ebee59 41ec5315", + "41295f75 412974ef c19a6669 c19a65c3 -> c10b6d5d c10b5697", + "409600ae 40967f7a 4094b4f0 4094bbe8 -> 41155acf 41159db1", + "c0bd92ac c0bd89e8 4115bf05 411610af -> 405bd6bc 405d2eec", + "41492a85 419111fd c03b0cce c03a9792 -> 411a6752 41737e16", + "40fdb1d5 40fdb4fb c14c59a6 c14c49d6 -> c09b0177 c09adeb1", + "4096cf14 4099997c 416d7932 418d4a4f -> 419c705e 41b3b0ae", + "c04cb0c6 c04cacca 4094f573 4097b00d -> 3fba7440 3fc566a0", + "c0ce8958 c0c38cbc 419038bb 419e2c39 -> 41392cca 415a9214", + "411176cb 41134999 c1924ffd c1924a83 -> c113292f c1114b6d", + "bf9d1be7 bf9cdb79 bfdfeb7f 3ef48f7c -> c03e83b3 bf3f6f34", + "3fe31c2a 40b3824e 40bda0ad 40c0657b -> 40f667b8 4139f3e4", + "40fd3601 410051c3 415e430d 415e9b93 -> 41ae6f07 41af76ab", + "415dbc3b 4165f1e5 c10abc38 c10849c2 -> 40a60006 40bb5046", + "418edb02 4190945e 4185f86c 4185f9fc -> 420a69b7 420b472d", + "c01fa98e c01fa272 40e6086e 40e7a44a -> 409633a7 4097d311", + "414d1f1a 414d1fae 415a2d54 415cdb1c -> 41d3a637 41d4fd65", + "c1402268 c1151b8e 4113f60c 4113ff7c -> c030b170 bd8e0900", + "4181fd32 4181fe3e 418071fa 4180923e -> 42013796 4201483e", + "40aa0770 40aa24e8 410d6abe 41129a72 -> 41626e76 4167ace6", + "418c6d46 418c7552 c14f40de c13c7078 -> 4093335c 40b8f458", + "c12d1676 c12d1424 41147fcf 41161da5 -> bfc4b538 bfb7b3f8", + "c047d136 c047832a 417f7a4d 417f7b23 -> 414d8600 414d9a58", + "40d459e2 410c76fb 415e8e4b 415ea345 -> 41a45d9e 41b58d20", + "3f043efc 40b82538 c19090e0 c1900c38 -> c18c6ee8 c14405d4", + "c1886524 c18864ec c0cd7c31 c0a837af -> c1bbc430 c1b272d8", + "416f3e3a 417071a6 400fe704 4026f3bc -> 41899bfe 418d174a", + "414c5b1a 41676c56 c19f5489 c19e17a9 -> c0e49bf0 c0a985f8", + "418d54f7 418d5771 c127dd5a c127dbbe -> 40e59928 40e5a648", + "41832352 41944b76 c0f5de55 c0eeb45f -> 410b577a 41313cbc", + "c1021b9f c10214f9 c14a1af3 c118c32d -> c1a61b49 c18d6c13", + "419ade5e 419ca4a6 404c4254 404c44ec -> 41b466a8 41b62d44", + "c1047d71 c1037bcf 4164dd13 416952e5 -> 40c0bf44 40cbae2c", + "c1183847 c118359d 40324161 40ef8780 -> c0d74fde c001c774", + "4194b800 4194c7d4 418bd51b 418d5495 -> 4210468e 42110e34", + "4065dbf2 4065de0e 412612d8 41274ac8 -> 415f89d4 4160c24c", + "c0d7a3c7 c0d79331 c1732c73 c172ca01 -> c1af7f2b c1af49cd", + "409d6693 40ab8965 c07e33d9 c066eef7 -> 3f726534 3fe047a6", + "40aa442a 40aa8486 c12190b9 c10a86e1 -> c098dd48 c0551278", + "41342319 41347153 4150f371 4150f7cf -> 41c28b45 41c2b491", + "419e54ac 419ea6dc c05336b8 c0530d38 -> 4183edd5 41844535", + "419b0d09 419b14bb c0ab996c c0927d20 -> 41604d5c 416ceae6", + "406186a8 4061bc78 c15dfbe8 c15cfc78 -> c1259a3e c1248d5a", + "4187dc4c 41896394 c18657a7 c18652cf -> 3e425280 3ec43140", + "bf51a9d1 bf25fa6f 401c11e0 403733d0 -> 3fcf4ed8 400db534", + "3ffa20f9 3ffa2bc7 c064a1d7 c0605e29 -> bfcf22b5 bfc6908b", + "c15d2302 c15d20bc c19884a5 c183aff3 -> c2038b13 c1f24051", + "41767e7e 4182f33d c15e8a4a c15dfb36 -> 3fbfa1a0 401fad10", + "3fe7ee5a 4011d173 40cbc488 40cbc658 -> 4102e00f 410a5789", + "4085521b 40861f35 406ae6b2 406ae8ae -> 40fac574 40fb938c", + "4176b282 4176c75e 41784e7c 41785fcc -> 41f7807f 41f79395", + "4009c343 4076c75d 40f26585 4173d0e6 -> 411ba393 4198c15f", + "c148b9dc c06313e6 c0bfff28 c0bffb44 -> c1945cb8 c118c29c", + "41798eb4 41799004 409a9bca 40f68a76 -> 41a36e4c 41ba6aa0", + "c18468bf c16b6fd0 c17b4250 c163260c -> c20104f4 c1e74aee", + "c11a70ad c119f9b1 416d13d6 417b92aa -> 40a54652 40c331f2", + "c160fa38 c15e484c c19d7d72 c19d7b8e -> c206fd47 c2064fda", + "419f0d10 419f0d4c 40d9eead 40d9ef83 -> 41d588bb 41d5892d", + "c18ebbb8 c18e48f8 41598c8d 41599103 -> c087d5c6 c08601da", + "c1360650 c1360534 419caae3 419cb201 -> 41034f76 41035ece", + "c0ae581b c0ae5611 3fd5cf8d 40a2558d -> c071c870 bec00840", + "c0086f78 c0086d78 4097a7e1 409839b7 -> 4026e04a 402805f6", + "c18a17c0 c184967c 4190e135 4195775b -> 3f592ea0 400706f8", + "c0c53610 c0b1e5c4 4124be56 4124e416 -> 4084469c 4097e268", + "bfcea6ac bfce9cb4 c173e79e c12c95e2 -> c186de3a c1466978", + "4157d9d6 41594f4a 41998a90 41999030 -> 4202bbbe 42031bea", + "c0e5c4f5 c0e597e7 c1863852 c1862e06 -> c1bfa98f c1bf9400", + "c11908fa c118c0c6 40e15f50 40e16060 -> c0216548 c0204258", + "415e9412 417244b6 bf9054c4 bf903abc -> 414c897a 41603d5e", + "414910d2 41a0cca7 c0c6c56e c0c6c1a2 -> 40cb5c36 415e387d", + "c197bd24 c1973f34 c175b018 c175aa58 -> c2094a98 c2090a30" + ] + }, + { + "glsl": "vec2 cultmath_iv_sub(vec2, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c19f4813 c17fe5b2 40bdfd30 40be16a8 -> c1cecdbd c1af7225", + "413ad844 413b1ea8 411e992a 411e9ac6 -> 3fe1ebf0 3fe42bf0", + "4183bf2c 4183bf94 bfc8d4d1 bf58969e -> 418a83e1 41904ce1", + "c1804556 c1803f1c 405ba2f3 405ba80d -> c19bba58 c19bb37a", + "418bc4c9 418bc9d7 c1482612 c145f1d6 -> 41eebdb4 41efdce0", + "c1961d7e c15eb3c1 41784541 4179080f -> c20950c3 c1eb7c81", + "c10aa6ae c1096a7c bf215912 bf1a986e -> c100fd27 c0fea9d6", + "412135f3 4121369d 41810639 41810b67 -> c0c1c1b6 c0c1abaa", + "bf9fce69 bf2f136e c128b716 c1288d2e -> 41149361 411dc5df", + "40f27750 41064134 3faaf7d6 4020bdd5 -> 40a21866 40e1c472", + "41006cdc 410166cc c18097f8 c1708ee7 -> 41b87de2 41c14b5e", + "c0c758b9 c0bd3a37 c18698c3 c185ae49 -> 4127b036 412e946a", + "c08d5784 c08d4998 c146bf55 c13df0fd -> 40ee8a76 41001a89", + "c0a869a8 c0a78738 c167a797 c167a611 -> 4113713d 4113e3fb", + "c1966174 c19660b4 c19b767c c19b7410 -> 3f225380 3f22b900", + "4193fa47 4193fe89 c0ce0c33 c086360d -> 41b587ca 41c78196", + "c15bcbd2 c15bc834 c1029eab c10287f1 -> c0b287c2 c0b25312", + "c18cc814 c18cc660 c0813d4e c0813872 -> c158f3ef c158ee19", + "41135f26 41137dd6 418841f9 4188a22b -> c0fbca60 c0fa0c38", + "41509818 41509930 c148d675 c147807f -> 41cc0c4c 41ccb7d2", + "bfa4e38d 3f831f8d c181d924 c18193e4 -> 416e8b56 418a0b1d", + "415ce1bb 415ce42d 41424aef 41a6737c -> c0e00a7a 3fd4c9f0", + "408fbddf 408fc139 c0a55216 c0a2942a -> 41192904 411a89a8", + "412b6dcf 412b80d9 4160e965 416128bb -> c056ebb0 c055a230", + "c1466884 c14661f4 40bbdb06 40bbe022 -> c1922c4a c19227bc", + "c082295b c067142a 4004479f 40045921 -> c0c455ec c0b5ade4", + "415e1a57 415e1b01 c1bf9520 c16a16d4 -> 41e41896 42175150", + "401b2c14 4021d95c c131f872 c0ba423d -> 4103ec24 415a6ec9", + "418831e3 41884ec5 410b7a71 410b7b97 -> 4104e82f 41052319", + "c1641628 c143b13e c197f798 c197f762 -> 4097b138 40d87be4", + "c10e8ed7 c10e8091 40e0af3d 413e6e0e -> c1a67e72 c17ed830", + "413e62c2 4150da86 c0911285 c090c377 -> 4183623f 418cb1e4", + "3f6b05cb 3f721df5 c0c89172 c0c5dfe6 -> 40e3409f 40e6d531", + "c01db4c2 c01db27e c151f017 c147470b -> 411fd9da 412a8378", + "c108baae c0b86fcd 40ba947a 40dbe506 -> c176ad31 c1398224", + "c1839e58 c148fae4 c03e6ce8 c03e6b18 -> c157a1ea c1195faa", + "4155c2d8 4155fac0 40cdbd22 40cde546 -> 40dda06a 40de385e", + "408986de 409e2ef2 c113eac4 c113d8bc -> 41589c2b 4163023d", + "c1373d63 c1348b71 4174511a 41745256 -> c1d5c7dc c1d46e46", + "419e1175 419f020f c087d89e c087d766 -> 41c0074e 41c0f836", + "40c42e39 40c83fc7 bf96bff0 bf96b850 -> 40e9dc4d 40edefc3", + "c11ca89f c1176939 bfa3956e 3fe6238e -> c1396d11 c102f68b", + "c14ef4a0 c0e330fc 412bd224 412bdc70 -> c1bd6888 c18eb551", + "c13e6a9d c13e655d 4169014b 41691aed -> c1d3c2c5 c1d3b354", + "417184e5 41787f23 c17dd077 c17dae0b -> 41f79978 41fb27cd", + "c15eefa6 c15eeeee 412ef8a6 41393882 -> c1cc1414 c1c6f3ca", + "c13374ea c133746c c0b6269c c098979c -> c0ce5238 c0b0c23c", + "c16247bf c16246a9 41299abf 412f1905 -> c1c8b062 c1c5f0b4", + "be88488c be0943e8 c1612cd7 c1609045 -> 415c4e01 415f07c7", + "c006b3cc c0065544 411f8d05 411f8edf -> c1413bd2 c1412256", + "4183f276 41892f22 c18481cc c182de30 -> 42036853 4206d877", + "41757095 41c11b7e c19d02e2 c1246180 -> 41cce90a 422f0f30", + "41339a7b 4134423d c137da5b c137d171 -> 41b5b5f6 41b60e4c", + "3ed672bb 3ed68145 417434e9 4175ec67 -> c16f38d1 c16d80df", + "41567081 415c1137 41626861 41626f27 -> bf3fea60 becae540", + "c0da79b7 c0ceab4d 4120bbfa 4120beb6 -> c186fdc9 c18408d0", + "c14a4cae c14a4bda 4135d020 41370f24 -> c1c0ade9 c1c00dfd", + "c188ac4a c188a114 41839afc 4183f718 -> c20651b1 c2061e08", + "417802da 41b64e6b bfb6fab7 bfb5dbc9 -> 41875f2a 41c1be16", + "4193481d 419348eb 412b6759 412b6d2f -> 40f64616 40f654fa", + "4179238a 41794246 c19cb2d2 c19ba4ec -> 420c1b58 420ca9fa", + "416dcc1d 416e5053 c14258cb c141ea87 -> 41d7db52 41d8548f", + "411a02b5 411ad60b 40dab8d6 40ea6eda -> 40132d20 4035e680", + "bda17630 bd38c39f 413e1ea1 413e2313 -> c13f65ff c13ed765", + "c1acbfd8 c18b8b0a c049c85c 3fb65238 -> c1b824fc c164a3fd", + "c13dfdd9 c13d1cdd 4186bb62 4186d97e -> c1e5d86a c1e549d0", + "40897e94 4091bc44 c1077e61 c106b5df -> 414b7529 41505c83", + "3fe283b9 3fe64fc7 40b44d6b 40c11855 -> c0887767 c07572f2", + "418cba8b 418dc5a1 c10f0e98 c02d9e89 -> 41a26e5c 41d54ced", + "4100e91d 4100eae3 c1069c45 c1027de7 -> 4181b382 4183c394", + "41696064 41696d34 415752ad 41580a93 -> 3f8aae88 3f90d438", + "40da6fca 40da75d6 c195cec1 c1959f4b -> 41cc3b3e 41cc6c36", + "c14fbbab c14fb3c1 c09e2e56 c09e2d16 -> c100a520 c1009c96", + "409bf606 40cc3c92 c1976a03 c1975f95 -> 41be5d16 41ca7928", + "bff15ec0 bfe76080 c19bbc41 c19bba6f -> 418ca483 418d4639", + "c1395457 c1362f17 418d3de6 418d416a -> c1e9eb96 c1e85572", + "414d4c2d 41973775 412ae5ff 4151028d -> be6d9800 410388eb", + "c16b9a19 c152c35d bf8cd9a3 3fc72ea3 -> c1823ff7 c1412829", + "4098043c 40b6abb4 c197c988 c17a1d39 -> 41a30fac 41c57475", + "4106f055 4107152b 41281241 412850fb -> c0058298 c003f458", + "40acd192 40d33e96 c0b00671 c0aff00b -> 412e60ce 4141a284", + "c1755a7f c1739301 c186829f c18681ed -> 3fbd4ad8 3fcb91e8", + "4076303d 40763223 3e4e3b08 3e4ea6f8 -> 406945ce 40694e72", + "c17724aa c1772352 bf9d874d bf9d6433 -> c1637824 c1637268", + "c0b7a61e c0b4ca9e 40a54a37 40b12e39 -> c1346a2c c12d0a6a", + "c09dafc3 c09daac9 c0e44309 c0e41b43 -> 400cd700 400d3080", + "4120c334 412138bc c093236f c03b87e2 -> 414fa52c 416aca74", + "412bb2ee 412bb49a 40a6fcbf 40a6fe71 -> 40b0676b 40b06c75", + "41496fae 414aa78a 3fcb0330 3fcc3fb0 -> 412fe7b8 41314724", + "c103ec39 c100f131 c16d94df c16d89a9 -> 40d33ae0 40d9475c", + "416efdbc 41738f04 c10d4dda c10d4bd6 -> 41be24c9 41c06e6f", + "c0d5af09 c0d56bdb 412d1ac1 412dccd3 -> c18c522c c18be857", + "c0fde022 c0bcf2e6 3ff1571b 3ff16445 -> c11d1c9a c0f948ad", + "41247ac4 41247b7c c18cda1d c18c9e2d -> 41dedb8f 41df17db", + "be6f2109 be6efdf7 3faeb1d4 3fc00dcc -> bfddf1ed bfcc9193", + "c13de1eb c13ddbc7 c0d07e85 c0cfbe5b -> c0ac057b c0ab3909", + "c096b951 c096347b c0f78530 c0f5f628 -> 403e79ae 4042a16a", + "4022181e 40221be2 4181cf61 41847273 -> c1605ede c15b17ca", + "bfc63914 bfc5886c 41558bdf 4159d691 -> c1729db4 c16e3cec", + "41719da7 4171a109 c19eb92a c19eaade -> 420bbcd9 420bc4d7", + "40f2e763 4120d76e bf81ca39 401a0c2c -> 40a5e14d 413110b5", + "403ecb1f 40410e41 c101976e c0ed526d -> 41265bfe 4131dafe", + "3f2502e7 3f250e19 4180e4db 4180e97d -> c17782cc c17778d4", + "c1749928 c1741414 c185bb15 c1846fd3 -> 3fa233f0 3fbb10b0", + "c0cc3cec c0aa4750 410ceea0 413aa420 -> c190614b c1621248", + "c187d5d1 c187d2cf 41949378 41949750 -> c20e3690 c20e3324", + "4189ef0e 419723da 40cbe614 40cc42b4 -> 412dbcc2 414854aa", + "c1388677 c13867ed 409415b9 4094330f -> c1814fff c1813965", + "c199381e c19936b8 4181e0da 4181e97e -> c20d90ce c20d8bc9", + "410b4955 410b8393 416cec59 4188f40f -> c1069ec9 c0c2d18c", + "c16967c5 c16899b3 c1994daf c198ff15 -> 40912cca 40940356", + "c154cf7e c1524ed6 3e97d080 40d11740 -> c19ead8f c1570d5a", + "c1182f2b c1182b4b c0d70b8d c0d709ab -> c032a956 c0329612", + "c039be79 c039b877 c10489be c1041a2a -> 40ab5518 40ac3740", + "418472ef 41847725 418fd50d 41937713 -> bff04240 bfb5de80", + "41482908 417823f0 400d1ef1 400d274f -> 4124df34 4154dc34", + "c0342992 c02e52ee c14dc883 c0e52302 -> 408b0e39 412233c8", + "4062e228 408568f4 416e5074 41982c5e -> c177a032 c12b9bfa", + "416f0dd8 418c5c94 4122f9ef 4123bc31 -> 4096a34e 40eb7e72", + "c138669a c1381fd4 c184b625 c184aea3 -> 40a1ed58 40a298ec", + "c11d52b3 c1183cf1 c160ffbe c160ff40 -> 4087591a 4091859a", + "c1929ba9 c19230f7 4159828e 418896d9 -> c20d9941 c1fef23e", + "416f1f0c 416f51f4 c06411c8 c062dc98 -> 4193eb19 41942b33", + "bf7bbc94 bf7b8f6c c198caf2 c198c7ae -> 4190e9c9 4190ee77", + "41913d71 41a5495b c184c53e c1842756 -> 420ab264 4215074c", + "c09049d4 c08b8b70 c0b06d38 c0af607c -> 3f78b540 3f938720", + "c1127518 c11247ba c155fdc4 c155260a -> 408561e4 40876c14", + "c0c011c5 c0ac53f3 c110333f c10fdb3f -> 403f4972 40682516", + "c14fcfcf c14d3501 bf88db61 bf88c8ff -> c13eb6af c13c1995", + "411da6e6 411e70ee c18b396b c16aaefe -> 41c42af2 41da71e2", + "41058285 41059763 c1873ba2 c1873a0e -> 41c9fb50 41ca0754", + "c0c30d3f c0c25861 c015a197 bfec43d3 -> c087fc4a c06f0f2b", + "41667b6c 416714d4 3fffbcea 4000299b -> 41467105 41471d37", + "c0b1e6e1 c0b0cb23 41870e58 41881c34 -> c1b495ec c1b34121", + "c0d23c8e c0ccd93e 411bc368 411e1eac -> c1839e7a c1811804", + "c09d6f4e c09d46b2 4001a0bd 4001a6f3 -> c0de42c8 c0de1710", + "c1871cca c1398e59 c119e5df c1027a0d -> c10bbf87 bffd43d0", + "40d3d554 410ee28a be87823f be7d8283 -> 40dbc168 41131e9c", + "41339fae 4133a3b6 416bfe71 416bff27 -> c0617de4 c0616aec", + "401158db 401166a5 c164d897 c15460ad -> 4178b6e4 41849920", + "419384dd 4193a117 40d0ea54 4102b1d2 -> 412457e8 413ecd04", + "c16431ca c11183c0 c17e97c9 c17b08e3 -> 3fb6b8c8 40da2812", + "40fb9e13 411a09ab 4147a427 4147a579 -> c093acdf c03669f0", + "413b9995 413bf0a3 3ed1dd01 3ed578ff -> 4134edcd 413561bb", + "4106a5a0 416d8f60 c19547ca c195328c -> 41d8855c 420607bd", + "c146bb63 c144d6c9 c1b4af7b c15e3fe6 -> 3fbc2418 4124882d", + "c1993fb3 c1993f07 400423f2 40042e9e -> c1a9c587 c1a9c385", + "408bc014 40d8829c c18a8198 c18a8068 -> 41ad706d 41c0a23f", + "c03f2c2a 400bc57a 40839bae 411af201 -> c14abd0c bff6e3c4", + "40c14af5 40cc590b 4182757c 41827790 -> c12449a6 c11ebe72", + "41588dc5 415a5103 c182171d c1694d01 -> 41e0ed63 41ef3f9e", + "c18c94bc c18c8214 40c407a3 40c4267d -> c1bd9e5b c1bd83fd", + "40f08c4b 40f18cb5 c11c54e3 c11ad1af -> 41898bea 418a8d9f", + "c163b6f8 c15a7ea0 408eb14c 408edd94 -> c19592e1 c190eba3", + "c099863a c08fe052 414dfc69 414dfdc7 -> c18d6072 c18af649", + "c0ddb6fa bfe4fd48 c19cda29 c18fc865 -> 4130b54d 418e8a54", + "4132fd4f 41362645 4064af62 40abb11f -> 40ba497f 40f9f4d9", + "413b065f 413c0c3d 410926ea 410927fa -> 40477994 404b954c", + "c19488d4 c188ec2c 401fc286 4024feba -> c1a928ab c19ce47d", + "3ba34e68 3bc3b198 41881928 418937c8 -> c1892d93 c1880ced", + "bffef22c bffec054 bf82bae7 bf82aa79 -> bf788f66 bf780ada", + "40980f56 4098cb22 c1a17f5c c19d962a -> 41c39a00 41c7b224", + "c0d82c18 c0d80930 bf056418 40b8015b -> c14816ba c0c75cad", + "416ea3a8 417f3760 412df431 415f258f -> 3f77e190 40a2865e", + "4047ff25 4048249b c18be7f0 c18bd30e -> 41a4d2f3 41a4ec83", + "412b1317 413b8ba5 3f62e455 3f6300ab -> 411ce30c 412d5d60", + "41364560 41364868 3fd2669e 3fd2e7a2 -> 411be86c 411bfb94", + "c1473c9f c1473c0d 415db4f8 415db868 -> c1d27a84 c1d27882", + "412c068e 412c0a52 40c59d9a 40c5a276 -> 40926aa6 4092770a", + "c02d0e48 3df7def0 c130f4dd c130e651 -> 4105a2bf 4132e49b", + "40a45f04 40ef4b9c 3f44faa3 3f4a861d -> 408b0e40 40d6ac48", + "419c457f 41a10711 c141c14c c141b9f0 -> 41fd2277 4200f3dc", + "c199c5dc c19810a6 c19e9927 c19e9651 -> 3f1a0ea0 3f511020", + "c16941fa c1689482 415dfda6 4160c30a -> c1e50282 c1e34914", + "4109178a 41092dde c0b98e19 c0b90423 -> 4165999c 4165f4ea", + "4188dc33 418aed05 3ffb6850 3ffbd290 -> 41723e14 41766d00", + "bf53441a bf513866 c1484f6c c143a22c -> 41366dea 413b3be6", + "c1625c79 c15f5335 c03c68b8 c02acae8 -> c137a9bf c1303907", + "c192df7f c18e398b 4100f7a7 41375b1d -> c1ee8d0e c1ceb55e", + "c10adf99 c10aded3 c16be85b c16be7c7 -> 40c2105c 40c21310", + "41987a53 4198801d c1024ee2 c101a66e -> 41d94d8a 41d9a78e", + "c1989f10 c197a2be c19065c5 c1906265 -> bf83cab0 bf679f20", + "c0c82657 c0c82575 c018cbcf c018c541 -> c077876d c0777f1b", + "3f8126ec 3fe4d3b4 c1098630 bf892700 -> 400526f6 412620a6", + "c0e056a4 c0e04ca4 419b9323 419c8745 -> c1d49cee c1d3a64c", + "402332d1 4025520f c17ea345 c17e876b -> 4193aa10 4193fbe4", + "c128f8d9 c128e931 c14cdac5 c14cb901 -> 400f00a0 400fc650", + "410ab142 415d75be c0b05bae c0aa0762 -> 415fb4f3 419ad1ca", + "c135db6c c135ca18 bfaa3dd1 bf95cc4f -> c12321e2 c120825e", + "c09293f4 c09292d8 c11e9038 c0fc487c -> 40536910 40aa8d98", + "c11743aa c0803594 c0c09bee c0c097ba -> c05bdf34 4000ccb4", + "c13638c9 c1362a59 c15e1ae4 c15e11b8 -> 401f63bc 401fc22c", + "c0acdb7b c096891d 4050b399 4050b717 -> c10a9b83 c0fee2ea", + "c18a97df c18a49e3 bfb08550 bfad9310 -> c17f7d5c c17e831c", + "c16b911b c123c013 c10b3b2d c105ac83 -> c0cbc930 bfc42730", + "c0254074 c017a38c bfc2e535 bfc19a2b -> bf88e6bd bf58c3c6", + "40a8e351 40c29fb7 418170b1 418172fb -> c12e744e c1219186", + "c0fbaf26 c0ebebde 4065c96f 4065fc51 -> c13756a7 c12f684b", + "418cb8b6 418cb996 c10b85b2 c10993fa -> 41d182b3 41d27c6f", + "c187d5d4 c12a7607 c180cf23 c13ce438 -> c0a58ee0 40ae507e", + "c173c5cc c13aff40 c19cf1d3 c19cf197 -> 408c3ac4 40fdc8cc", + "c0b1afd0 c0b19634 406117c2 407546be -> c1162998 c111110a", + "41195c88 41995fa0 bff3b6fb bff14d45 -> 41378631 41a89b10", + "4118bc5c 4119dc6c c04b5f33 c03da8bd -> 4148268b 414cb439", + "c0571afe 400b37fe bbf7c535 3bee4535 -> c0579221 400bb3e1", + "c0cd01ca bf99a958 4192c105 4193f413 -> c1c73486 c19c5b9a", + "c14d83ae c14d7904 c18bff9e c146d3e7 -> bed5f8e0 40950c70", + "c1392aaf c11d13a5 c0e93398 c0e92850 -> c0892d0e c021e764", + "4132ac73 4132c659 3fe2006f 3fe79871 -> 4115b965 4116864b", + "40c76748 40c7f7f8 c19353f3 c1934953 -> 41c52325 41c551f1", + "c146ea2a c146e5d6 c0bfc43c c0bfa614 -> c0ce2e40 c0ce0770", + "c1090d62 c1090b74 40168eb0 40170320 -> c12ece2a c12eaf20", + "4100fee1 4102f2e7 c16bb0dc c16bac7a -> 41b655ae 41b751e2", + "bfe43eb6 bfb3100a 3f5decac 3f5e3f54 -> c029af30 c0110330", + "418fd1b4 418fe0f4 415596fb 415597fd -> 409416d6 409455da", + "c152a78c c14fc84c bfa83e8a bfa83ad6 -> c13da031 c13ac07b", + "40e476dd 40e481c3 40e0e936 40e129ca -> 3dd344c0 3de62340", + "c1a40b45 c18c1f8b c19cbde1 c19cbd91 -> bf69b680 4004f2b0", + "4182def0 4182e030 c1232f6f c1232b55 -> 41d4749a 41d477e8", + "4068bff4 4073c7cc c0c0e0c6 c0c0df6a -> 411a9fb2 411d6256", + "410ab057 411448a1 c128a6c9 c126be51 -> 4198b754 419e77b5", + "410af772 410af8ee 412b416b 412b4241 -> c0012b3c c00121f4", + "41589bd9 4158ad07 40490f48 40493938 -> 41264d8b 41266935", + "3fb5306a 40fad18e c153aa98 c152e112 -> 4169871f 41a889b0", + "411807c9 41181c3b 40ac6704 40ac68ac -> 4083a6e6 4083d172", + "bfd25e53 bfd2446d c0d72b91 c0b41af7 -> 407f06c4 40a29a76", + "4089233b 408925b5 c101f88c c101eb1c -> 41467cba 41468b66", + "bf903642 bf8fb17e 40a29ef5 40a2b98b -> c0c6c71c c0c68b54", + "c19b8768 c1946f7e c0bb2b7c c0bac744 -> c159ab2e c14b493e", + "c08ca035 c024ff66 c104bf47 c103a861 -> 4075611a 40b6fedb", + "bfe27181 bfd37edf 3fbcc784 3fe55afc -> c063e63e c0482332", + "c0f1d2ef c0e3c43d c0bda154 beee9740 -> c0e2e97b bf988ba4", + "419a83f4 419d3f0c bfbfd9fe bfbf9d62 -> 41a67dca 41a93cac", + "c19bfb45 c19bf59d 405893f6 405bf61a -> c1b77a08 c1b7081c", + "c066e1b9 c065fa37 c19de6bf c19ce171 -> 4180053a 41812778", + "41496296 4149b88a 4066540e 4068ca02 -> 410f3016 41102386", + "40fcaecb 40fcc285 c12698be c110fbf0 -> 4187a9ab 41927d00", + "40808014 4092fe6c c1828f6b c15a2c2b -> 418d361a 41a74f06", + "c19135c7 c1913555 4053bf1b 409fdf92 -> c1b92dac c1abad38", + "40aee04a 40b445a6 bfca5194 3f641028 -> 40925e45 40e6da0b", + "40e107b8 40e13588 c0f6235d c0e0b0f3 -> 4160dc56 416bac72", + "4165af30 4165cd70 c10a7c8d c102c26b -> 41b438ce 41b824fe", + "c146281b c134599b c1be695e c1798bdc -> 404d8f04 41487921", + "415a1ff0 415dcd30 40aecd18 416ac334 -> bf851a20 410666a4", + "c198a246 c198a200 c19f1cf7 c19f1ca3 -> 3f4f4ba0 3f4f5ee0", + "bf9577b2 bf89862e c0cd0cfa c0cd00c2 -> 40a7a2d6 40aaab6e", + "404d2349 40520977 c165a12f c11128cd -> 4144719f 418d11c6", + "40e41e5b 40f41f3d 417e74cd 41848cf5 -> c1170abc c104652e", + "418c5dc1 418c5eab 418e6864 418e93e0 -> be8d87c0 be826e40", + "c16bc8a7 c156655b 40ca2d88 40ca4f98 -> c1a8783a c19dbe10", + "419b93ca 419be522 408c3e1a 40aba166 -> 416156e1 4171ab37", + "411cb333 411cb551 c192910c c19281e0 -> 41e0db7a 41e0ebb4", + "c0ecd770 c0e93620 414d6793 414f4dad -> c1a2dcb2 c1a10152", + "40b640af 40b6d449 c06f10da c06f0ca6 -> 4116e381 41172e5b", + "c19ce58f c19ce509 c14a2974 c14a1ee6 -> c0df5870 c0df413c", + "c1557fac c15569e4 c18f5841 c18f2d3b -> 4091b594 40928d3c" + ] + }, + { + "glsl": "vec2 cultmath_iv_neg(vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "418113e2 4181173e -> c181173e c18113e2", + "c1935b26 c1906118 -> 41906118 41935b26", + "41113eca 411149da -> c11149da c1113eca", + "415c8211 415c860f -> c15c860f c15c8211", + "c0afae98 c0a7bc48 -> 40a7bc48 40afae98", + "c1a5ec7c c16f9759 -> 416f9759 41a5ec7c", + "4196e2ff 41974b6d -> c1974b6d c196e2ff", + "bed2c222 becacbde -> 3ecacbde 3ed2c222", + "3f27cd86 4007cb1e -> c007cb1e bf27cd86", + "40a40114 40a402fc -> c0a402fc c0a40114", + "41858d3a 41859312 -> c1859312 c1858d3a", + "c1722476 c171b448 -> 4171b448 41722476", + "40fc2b5f 411f4868 -> c11f4868 c0fc2b5f", + "bfe2d22b bfe2cb15 -> 3fe2cb15 3fe2d22b", + "40b46e02 40b4ac06 -> c0b4ac06 c0b46e02", + "c15c9f83 c15a0ab9 -> 415a0ab9 415c9f83", + "bfa68027 bfa66c19 -> 3fa66c19 3fa68027", + "417c7fd0 417d0440 -> c17d0440 c17c7fd0", + "c1807932 c1807042 -> 41807042 41807932", + "40bc1f64 40bc208c -> c0bc208c c0bc1f64", + "41296ec5 412b8e93 -> c12b8e93 c1296ec5", + "c1553de0 c0d805b8 -> 40d805b8 41553de0", + "c0836715 c082cdc3 -> 4082cdc3 40836715", + "c179f24f c179987d -> 4179987d 4179f24f", + "4058e6fd 407b31e3 -> c07b31e3 c058e6fd", + "411e5819 411e6b17 -> c11e6b17 c11e5819", + "40986c20 41498da8 -> c1498da8 c0986c20", + "3fe9be9b 3ff88065 -> bff88065 bfe9be9b", + "c1731822 c1721f76 -> 41721f76 41731822", + "4194dcee 41a57f36 -> c1a57f36 c194dcee", + "414d64eb 4159c15d -> c159c15d c14d64eb", + "c00c056e 40d74e47 -> c0d74e47 400c056e", + "3f5cde4d 3f5fcef3 -> bf5fcef3 bf5cde4d", + "bf9a4d1c bca02100 -> 3ca02100 3f9a4d1c", + "3fc12e2c 41237502 -> c1237502 bfc12e2c", + "c0cd1af0 c0cd1214 -> 40cd1214 40cd1af0", + "c149917b c148010d -> 4148010d 4149917b", + "c0f6efe9 c0f6d813 -> 40f6d813 40f6efe9", + "c1928f3a c1928df6 -> 41928df6 41928f3a", + "c1833ac1 c183363f -> 4183363f 41833ac1", + "40ba22f4 41679fce -> c1679fce c0ba22f4", + "c01e6b22 3f04cc88 -> bf04cc88 401e6b22", + "408f2d1f 40b96409 -> c0b96409 c08f2d1f", + "4187bdaa 4187f686 -> c187f686 c187bdaa", + "408d14cf 408d2a01 -> c08d2a01 c08d14cf", + "c0992171 c0977daf -> 40977daf 40992171", + "c0de2ba1 c0c3bd5f -> 40c3bd5f 40de2ba1", + "c1835232 c0f3f682 -> 40f3f682 41835232", + "c18a4ada c18a46d0 -> 418a46d0 418a4ada", + "c0d1dc8a 3ff46ac8 -> bff46ac8 40d1dc8a", + "41964f56 41965572 -> c1965572 c1964f56", + "414d037d 414eadb3 -> c14eadb3 c14d037d", + "c0722eb8 c06ef2f8 -> 406ef2f8 40722eb8", + "c161f308 c161f16c -> 4161f16c 4161f308", + "40dbb808 40dbc758 -> c0dbc758 c0dbb808", + "bede54b0 40c1fcbb -> c0c1fcbb 3ede54b0", + "bfc4afd2 bf9020ce -> 3f9020ce 3fc4afd2", + "c1836563 c16c8462 -> 416c8462 41836563", + "c10050d2 c0fa2290 -> 40fa2290 410050d2", + "c0b5f67b c0ac1d15 -> 40ac1d15 40b5f67b", + "c0a8cecd 4088c54d -> c088c54d 40a8cecd", + "c13d2273 c13d0763 -> 413d0763 413d2273", + "40729c9d 40988642 -> c0988642 c0729c9d", + "416cbb00 416ce558 -> c16ce558 c16cbb00", + "c081f4ee c081d4f2 -> 4081d4f2 4081f4ee", + "c136a3ad c1297adb -> 41297adb 4136a3ad", + "410a8e76 410a8fd2 -> c10a8fd2 c10a8e76", + "c100f5f2 c100a564 -> 4100a564 4100f5f2", + "c16830ff c1437fdb -> 41437fdb 416830ff", + "bedccbfa bedca806 -> 3edca806 3edccbfa", + "40d1a21b 40f3c04d -> c0f3c04d c0d1a21b", + "414ad73c 414aefe4 -> c14aefe4 c14ad73c", + "4107ba29 4107ecd3 -> c107ecd3 c107ba29", + "c1886799 c18776cb -> 418776cb 41886799", + "40ddf42a 40de25c6 -> c0de25c6 c0ddf42a", + "40eee37a 40ef3b9e -> c0ef3b9e c0eee37a", + "417a0f54 41813d76 -> c1813d76 c17a0f54", + "c07183f4 40679ed4 -> c0679ed4 407183f4", + "c1832985 c18301bf -> 418301bf 41832985", + "419e6fce 419f50d2 -> c19f50d2 c19e6fce", + "40d20f6d 40e2de93 -> c0e2de93 c0d20f6d", + "410d0aa7 410d2299 -> c10d2299 c10d0aa7", + "c19a0ae5 c19320f9 -> 419320f9 419a0ae5", + "c12296e6 c1227c5a -> 41227c5a 412296e6", + "c04879c3 c03cf0bd -> 403cf0bd 404879c3", + "40e29cf0 40e31098 -> c0e31098 c0e29cf0", + "c151c214 c151b878 -> 4151b878 4151c214", + "c19a73bf c19865d1 -> 419865d1 419a73bf", + "c15b74e8 c13f72b4 -> 413f72b4 415b74e8", + "40c23d7e 40c244aa -> c0c244aa c0c23d7e", + "410e7aa8 410e8274 -> c10e8274 c10e7aa8", + "4112d105 4112d1af -> c112d1af c112d105", + "40948fc8 40bc2e38 -> c0bc2e38 c0948fc8", + "413cbcf8 41987ef8 -> c1987ef8 c13cbcf8", + "4088040b 40882695 -> c0882695 c088040b", + "c0ae07aa c0a2e7f2 -> 40a2e7f2 40ae07aa", + "415c0bf6 41825ca5 -> c1825ca5 c15c0bf6", + "c0b44622 bf81159a -> 3f81159a 40b44622", + "c184d89a c184adfe -> 4184adfe 4184d89a", + "c110bc11 c09aad16 -> 409aad16 4110bc11", + "c15492c0 c14eb49c -> 414eb49c 415492c0", + "c1465239 c14651b1 -> 414651b1 41465239", + "40e55bcf 40e56b91 -> c0e56b91 c0e55bcf", + "c12b3cfd c129259f -> 4129259f 412b3cfd", + "4105879d 4118cc83 -> c118cc83 c105879d", + "413ca588 413cac28 -> c13cac28 c13ca588", + "413afe87 414c8989 -> c14c8989 c13afe87", + "4176a4cd 4176d553 -> c176d553 c176a4cd", + "c19c4a1b c19a514d -> 419a514d 419c4a1b", + "410df6be 410dfb62 -> c10dfb62 c10df6be", + "41808087 41808551 -> c1808551 c1808087", + "4123d9a6 4123daee -> c123daee c123d9a6", + "c14300af c0a610aa -> 40a610aa 414300af", + "400b0ce5 400b3bbb -> c00b3bbb c00b0ce5", + "416484d0 416485f0 -> c16485f0 c16484d0", + "406bbdd6 4081f1d5 -> c081f1d5 c06bbdd6", + "3f2b7407 3f8cdedd -> bf8cdedd bf2b7407", + "c19add0e c19adcd4 -> 419adcd4 419add0e", + "c18c4eae c1898fec -> 41898fec 418c4eae", + "c0afa1af c0af6471 -> 40af6471 40afa1af", + "405831a7 40585349 -> c0585349 c05831a7", + "c1281034 c119c6a2 -> 4119c6a2 41281034", + "3f9a9c95 3f9aaaab -> bf9aaaab bf9a9c95", + "4180bf45 4180bfb7 -> c180bfb7 c180bf45", + "419e90a3 419e90d9 -> c19e90d9 c19e90a3", + "4185d3f6 4185ea1a -> c185ea1a c185d3f6", + "411ac12a 411ac2b6 -> c11ac2b6 c11ac12a", + "c1a4ff72 c18c1630 -> 418c1630 41a4ff72", + "419230e5 4192317b -> c192317b c19230e5", + "411672f1 411c23d7 -> c11c23d7 c11672f1", + "40b04ba2 412b0033 -> c12b0033 c0b04ba2", + "412926a9 412b93d7 -> c12b93d7 c12926a9", + "c1339ef0 c1339dea -> 41339dea 41339ef0", + "410c8a6a 410c8b6e -> c10c8b6e c10c8a6a", + "4127b546 414dfade -> c14dfade c127b546", + "c0c178ce c0c15c8a -> 40c15c8a 40c178ce", + "c0ec4695 c0ec1a07 -> 40ec1a07 40ec4695", + "409f45b5 40a44b1b -> c0a44b1b c09f45b5", + "c1b2edd5 c179de09 -> 4179de09 41b2edd5", + "402ffec6 403008aa -> c03008aa c02ffec6", + "c18ac71a c18a8f80 -> 418a8f80 418ac71a", + "c111c6af c0e767f3 -> 40e767f3 4111c6af", + "c153bc1a c153b872 -> 4153b872 4153bc1a", + "41977c99 419792ab -> c19792ab c1977c99", + "4102452d 410246c3 -> c10246c3 c102452d", + "c1acf166 c1625e2f -> 41625e2f 41acf166", + "4194e3c4 41965b50 -> c1965b50 c194e3c4", + "40d9eb4f 40df1661 -> c0df1661 c0d9eb4f", + "be53a926 bdbb1db4 -> 3dbb1db4 3e53a926", + "4034ba52 4035e03e -> c035e03e c034ba52", + "c08be38d c0441366 -> 40441366 408be38d", + "c10f9471 c10f92d1 -> 410f92d1 410f9471", + "40c27d21 40c61c6f -> c0c61c6f c0c27d21", + "c182d402 c182c0be -> 4182c0be 4182d402", + "bede6cb5 beda284b -> 3eda284b 3ede6cb5", + "4126e1da 419b9083 -> c19b9083 c126e1da", + "3f5ae8e1 3f700e1f -> bf700e1f bf5ae8e1", + "40b7bb3b 40b7c50d -> c0b7c50d c0b7bb3b", + "4082a161 40f5fe0f -> c0f5fe0f c082a161", + "bfa8fddc bfa8f944 -> 3fa8f944 3fa8fddc", + "c17c3f26 c17c3016 -> 417c3016 417c3f26", + "c0a32ae4 c09b9e44 -> 409b9e44 40a32ae4", + "414e8c77 414eaae9 -> c14eaae9 c14e8c77", + "c0d01608 c0c97dc4 -> 40c97dc4 40d01608", + "40331894 4133044b -> c133044b c0331894", + "c164aa46 c1647acc -> 41647acc 4164aa46", + "c0865d70 c0865a40 -> 40865a40 40865d70", + "411f63d0 411f6a90 -> c11f6a90 c11f63d0", + "c138e94b c138e62f -> 4138e62f 4138e94b", + "c13f90f1 c13e9331 -> 413e9331 413f90f1", + "c180b553 c18014d5 -> 418014d5 4180b553", + "418580f4 4185890c -> c185890c c18580f4", + "c123e054 c123df7e -> 4123df7e 4123e054", + "bff5005e bff3ef42 -> 3ff3ef42 3ff5005e", + "c19d292b c19d01e5 -> 419d01e5 419d292b", + "419de90f 419e9529 -> c19e9529 c19de90f", + "c1635ab5 c16289cb -> 416289cb 41635ab5", + "c0c69859 c0c695ef -> 40c695ef 40c69859", + "c008c764 c0024bec -> 40024bec 4008c764", + "c101fa77 c101f047 -> 4101f047 4101fa77", + "c112d38a c1129ab2 -> 41129ab2 4112d38a", + "410c72e5 410cfb4b -> c10cfb4b c10c72e5", + "c125b747 c12564f7 -> 412564f7 4125b747", + "40755567 407601c9 -> c07601c9 c0755567", + "4155e3cd 41560cdb -> c1560cdb c155e3cd", + "c19e9c2e c19e6db6 -> 419e6db6 419e9c2e", + "40d4db7c 41224842 -> c1224842 c0d4db7c", + "41899917 4189f18d -> c189f18d c1899917", + "c0854e48 c0854cb8 -> 40854cb8 40854e48", + "c0460c91 c01d3fcf -> 401d3fcf 40460c91", + "415df45c 419f16ba -> c19f16ba c15df45c", + "40c4b6c2 40c4c0de -> c0c4c0de c0c4b6c2", + "419ca0d5 419d1f0f -> c19d1f0f c19ca0d5", + "c123a90d c10608c1 -> 410608c1 4123a90d", + "412d4d6a 413051f6 -> c13051f6 c12d4d6a", + "413c3aca 413e063e -> c13e063e c13c3aca", + "4151db7a 4189a403 -> c189a403 c151db7a", + "c109b327 c1061b09 -> 41061b09 4109b327", + "4165a424 4165d394 -> c165d394 c165a424", + "c18a52ba c183b884 -> 4183b884 418a52ba", + "bfae45c8 bfae4018 -> 3fae4018 3fae45c8", + "3ff82298 40032894 -> c0032894 bff82298", + "bff8c675 bff37a8b -> 3ff37a8b 3ff8c675", + "416ff67f 416ffcc1 -> c16ffcc1 c16ff67f", + "4074dd59 40a1b213 -> c0a1b213 c074dd59", + "40fd6b22 40fdb59e -> c0fdb59e c0fd6b22", + "c15342b4 c1527e8e -> 41527e8e 415342b4", + "c0b6e842 c0b6c97e -> 40b6c97e 40b6e842", + "412f988d 41301c77 -> c1301c77 c12f988d", + "3ee11edc 3f3365d2 -> bf3365d2 bee11edc", + "c1487a5a c1403aaa -> 41403aaa 41487a5a", + "40a80497 40a80b09 -> c0a80b09 c0a80497", + "4085dc64 4086296c -> c086296c c085dc64", + "4050283f 4083d2d9 -> c083d2d9 c050283f", + "409ac386 409ad3ea -> c09ad3ea c09ac386", + "4026fbec 412d7425 -> c12d7425 c026fbec", + "419848ab 4199a9a5 -> c199a9a5 c19848ab", + "c1160759 c0e0eb46 -> 40e0eb46 41160759", + "c070b067 c070ada9 -> 4070ada9 4070b067", + "412a4afd 412aa373 -> c12aa373 c12a4afd", + "40ea3dd3 40ea3efd -> c0ea3efd c0ea3dd3", + "c154a4ee c0e9d9ec -> 40e9d9ec 4154a4ee", + "41923416 4192497a -> c192497a c1923416", + "c01b1e3c c01ac944 -> 401ac944 401b1e3c", + "bf85d92c 40c84deb -> c0c84deb 3f85d92c", + "417d1667 417d2f79 -> c17d2f79 c17d1667", + "417ef783 417f1e0d -> c17f1e0d c17ef783", + "40597439 4073fbd7 -> c073fbd7 c0597439", + "c055d45b c0555f85 -> 40555f85 4055d45b", + "c19ea771 c19ea70b -> 419ea70b 419ea771", + "4189fc38 4189fcc8 -> c189fcc8 c189fc38", + "40943b04 4094697c -> c094697c c0943b04", + "c1633c45 c15d38dd -> 415d38dd 41633c45", + "c05e41ab c05b9cc5 -> 405b9cc5 405e41ab", + "c125e548 c1257ac4 -> 41257ac4 4125e548", + "4181134a 4184a5de -> c184a5de c181134a", + "41168c5e 41168d12 -> c1168d12 c1168c5e", + "c19fe3be c19fe26a -> 419fe26a 419fe3be", + "bdfb0d90 3defa790 -> bdefa790 3dfb0d90", + "c131cd0c c131c8e8 -> 4131c8e8 4131cd0c", + "4191a682 4191aa1e -> c191aa1e c191a682", + "c1330921 c1303f9f -> 41303f9f 41330921", + "c0ad3a1b c0ad1cc9 -> 40ad1cc9 40ad3a1b", + "c1854283 c1849975 -> 41849975 41854283", + "c18dff36 c18d6bd6 -> 418d6bd6 418dff36", + "bfd932b6 bfd92dca -> 3fd92dca 3fd932b6", + "c1946ac7 c1919bcf -> 41919bcf 41946ac7", + "3fb08ad7 3fbcb789 -> bfbcb789 bfb08ad7", + "c09b282c bffc6f91 -> 3ffc6f91 409b282c", + "4143a7f2 4143ae96 -> c143ae96 c143a7f2", + "418d9279 41ac1353 -> c1ac1353 c18d9279", + "c17ed03f c17ecf31 -> 417ecf31 417ed03f", + "c18b9784 c18b9624 -> 418b9624 418b9784", + "407f074c 40b9292a -> c0b9292a c07f074c", + "c0877482 c0870406 -> 40870406 40877482", + "c134f2eb c12cde51 -> 412cde51 4134f2eb" + ] + }, + { + "glsl": "vec2 cultmath_iv_mul(vec2, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c1694f46 c158b172 c1805b78 c17c99c3 -> 4355d0d3 4369f5ff", + "413269c5 41905796 41954606 41a1caae -> 435010ba 43b672b9", + "40903929 40bd9c3f bfbc0b38 bf9f7d48 -> c10b470d c0b3b42a", + "c1a13239 c18e87a9 40f26bc6 40f26ce2 -> c318a609 c306f83f", + "3eed17eb 3ef27f95 411dbd6f 411f7f5d -> 4092171d 409715e3", + "412d3a30 41964adc c1390ea7 c1390e03 -> c3594966 c2fa7110", + "c161b7d5 c161b5c5 405817e3 4058281d -> c23e967a c23e866e", + "40f166da 40f172e6 c1482b45 c145eb3f -> c2bcca93 c2baa1fb", + "c0c8e980 c0bc9df0 41779cca 4177a316 -> c2c25948 c2b66fe8", + "405685d4 40a69a4e 41138768 4113cdd4 -> 41f740a1 4240611d", + "414d0e3b 419d243f 408edb0d 408ee033 -> 4264dab5 42af6774", + "bffff3d5 bffe194b c18dd90f c18dd73b -> 420cc990 420dd251", + "bf8032bf bf67f442 c12dc815 bffe2118 -> 3fe64256 412e0cfa", + "40e41b45 40e7eda3 416d1ce8 416d1fc0 -> 42d34701 42d6d3c4", + "406c9fd6 406ca33a 3f96d142 3fcc93de -> 408b6713 40bd1ac1", + "c0a3340f c087b0d9 c15fe66c c15fbee2 -> 426d3074 428ebd3f", + "409c9a51 40cd4917 c0e415ab c0e3f919 -> c236e679 c20b7537", + "419baa29 419bcf77 c05524bd c048a7a3 -> c281b9fa c27405be", + "40dea32f 40debd51 40ce8876 411bd61d -> 42339dfd 428796ec", + "c0a83cb1 c0a83b37 40571eb7 406f3799 -> c19d3533 c18d5dea", + "c1854e8a c1853b60 410eb922 410eba52 -> c314a52d c3148e92", + "417c2fd8 417c33e8 418e22bc 4191cf5c -> 438c04c1 438fa5af", + "415a927e 4160d82a 40b89773 40ba446d -> 429d9a99 42a39928", + "c0e7c3d6 c0e7c2f6 c18b93b0 c18b92e2 -> 42fcb7ab 42fcba14", + "414a97b3 414a9c8d 3f2cf6fe 3f4af442 -> 4108e163 4120a0d9", + "c17dcede c174fe18 c13dc11f c13dc095 -> 433597e5 433c2132", + "c150e380 c14cce88 c0ec1221 c0ebd1db -> 42bca97b 42c0a085", + "41517f09 419f922c 413f6495 414034f7 -> 431ca017 436f9d49", + "bfd3106a becb05d6 3f9e9394 4120cebe -> c18494b6 befb8548", + "c18b902c c18b8fc6 3ddb3ff0 3dfc7810 -> c009a360 bfef0db3", + "4176abb4 41781664 bfc23afa bfc1f346 -> c1bc3a1f c1bae1db", + "41319274 4157ad34 c0d16829 c0ca6a13 -> c2b06c28 c28c6723", + "c12904ba c127b1bc c1843d6a c1843c36 -> 432d3e2c 432e9df8", + "c01c0980 40a1ed30 40862041 40864727 -> c123b0af 41a9de51", + "c1486fbe c1437018 41850fd3 41851231 -> c3506098 c34b2aa2", + "4174fbf8 41762140 413881ca 4160596e -> 4330914f 4357b313", + "418611dc 41861288 c189ecc7 c189ac79 -> c39077d8 c39033c4", + "c0acda4c c0acd85c c190e560 c18be91c -> 42bcedbc 42c3ab56", + "41078d06 41078e02 411118a2 4111bd5a -> 4299a7d7 429a5765", + "c12ef0c9 c0c59dce c1354006 c13532dc -> 428bdfd5 42f7b7fd", + "c0ccbc84 c0c730a8 c16529d5 c16517a7 -> 42b240ee 42b74617", + "41721c77 4174d279 c19d65c3 c19d256b -> c3968666 c3949ed8", + "c1369dd3 c1368ff9 413ed9cb 413ef525 -> c3083802 c3081a2c", + "c1654374 c16537e2 4015338c 40157184 -> c205d5ec c20597ae", + "412c2751 412d7783 c0c67ed7 c0bbf0c9 -> c2868062 c27cc548", + "413731ac 41507a7c c0fc40f4 c0fc3ba8 -> c2cd6d77 c2b47f96", + "3f92095e 3f929822 c014dfc0 c013a600 -> c02a8028 c0287426", + "c1216cc6 c1216bb2 c190459a c19041bc -> 4335ec0e 4335f226", + "bf464f54 bf2817ac 416d19eb 416d201d -> c137b051 c11baeef", + "c036ab99 c034dde7 419f9da3 419fa265 -> c263d0e9 c2618a63", + "c181ded4 c1814df2 c109ce28 c109cd58 -> 430b34dd 430bd1aa", + "c111473d c10cc3eb 4095b255 40961b6b -> c22a5e9a c224a02d", + "3f370113 3f39eead 411dec7b 41232db5 -> 40e1c96b 40ed0855", + "405c1ccb 405e77c5 be4ba366 be2a529a -> bf30f6f8 bf127224", + "c122bfcc c00f7102 4140155c 414102a4 -> c2f5688d c1d74173", + "c13e1548 c13d2954 c11ef090 c11eeeb8 -> 42eadfcc 42ec0783", + "c11c2b33 c11b5691 4174a726 417558ba -> c315ab78 c31473ef", + "c04dbda1 c04d7a8f 41775f07 41776951 -> c246d69a c2468d86", + "40571462 4057184e 408b02e8 408b0f50 -> 41699505 4169ae20", + "400ce9d0 400d04f0 416a51db 41819f8a -> 4200fac7 420ecebe", + "4106dce6 4106dd6a 41863b72 41925b0a -> 430d6de3 431a3479", + "c0d5b574 c0d58984 40505475 4123f893 -> c288e20b c1adc62e", + "c173ea65 c173ce0d 417a25c1 417a6ddf -> c36e9b96 c36e3b2d", + "40f1d152 40f25cd6 c189fb3d c189910d -> c302a189 c301f209", + "c0e89de5 c0e89913 413de44d 41455493 -> c2b34e5b c2ac8871", + "4144a449 4144a56f c19f61b3 c19f5fc1 -> c374db98 c374d72d", + "3f7e58da 3f821113 c173f42e c17361e6 -> c177e489 c171cf9b", + "41817315 41817723 418f2b10 418f2bb8 -> 4390ca1e 4390cf51", + "c19bc3e8 c14fd061 415ac804 415acb64 -> c3852095 c33199d1", + "40914fb2 4091b1ae 4121da09 415b1cef -> 4237bdc4 427966ef", + "4151d8c1 41869ad4 c06a66b4 c06a63bc -> c2767f0c c24021e1", + "c03041e6 c02f45da 4068ad60 4068b560 -> c1203899 c11f4e01", + "c19df23a c19df1ca 4185a63b 4185baf9 -> c3a50468 c3a4ea5a", + "c0166159 c01657e7 c196823a c1957d5a -> 422f958e 4230d313", + "c19c258d c198013b c1095acc c0d12abf -> 42f864c6 43278ef4", + "c12ef81c c12ef594 c19357a0 c1837498 -> 4333aeb4 434968b8", + "c067c05f c02eb281 c0c0a61e c0b2dfc2 -> 4174219f 41ae66a9", + "4034ea46 40b0c8a5 4178a1ae 41966b35 -> 422fb536 42cfbf32", + "c0e5ef97 c089e459 414e7443 417d560d -> c2e38b12 c25e68be", + "408dc086 41212449 41291f0e 4129202e -> 423b4a95 42d4ea6b", + "41328228 4199e7cc bf1dd5ea 3f72b2aa -> c13dc785 4191e888", + "c0cb9dd7 c0c9e475 4074af32 410f5be4 -> c2640c83 c1c0f7ea", + "4189f1d7 4189f471 c168a66a c1447a26 -> c37abe68 c353bdf5", + "c1918a86 c1571193 40e599d0 40f1c598 -> c30973be c2c0e3f1", + "415f3c81 41601fcf 40a52ac3 40aa50fd -> 42900749 42951c07", + "c18df482 c17a7094 3faae136 3faaee4a -> c1bd9101 c1a72b14", + "c168b422 c168b3a6 c191e316 c1917096 -> 43843418 43849c73", + "c1048a12 c1048812 418cb8ba 418cb92e -> c311b6c3 c311b418", + "419922c5 41992573 419a575f 419a5ad1 -> 43b8a65c 43b8adb7", + "40c534aa 40c53fa6 bee9f0ac 3ff2b7cb -> c034405e 413b03c8", + "c16cbe71 c16c8f03 413d2d99 413d4f7f -> c32f121e c32ecfb8", + "410dbaa5 410dbb73 413eb6e8 413eeb0c -> 42d32b93 42d36682", + "c13b1d7a c13b1b58 c191f614 c191f524 -> 43555b51 43555f1e", + "c0e7639a c0e7603a c19e58ab c19e586d -> 430f1d4f 430f1f9e", + "c00515cc c0048da4 41018d2a 41019ebe -> c186c504 c18628ef", + "3d725d59 3d73d2a7 40b03573 40cdce1d -> 3ea6d2c7 3ec403ff", + "c10c1d01 c10c1bc3 4166aad8 4187badc -> c3149322 c2fc7ce4", + "4190e714 4191072c c18cb3e9 c18ba5ed -> c39f6bb0 c39e16c6", + "c1988e3d c193b1f3 3ea9e618 3f0e2174 -> c12965ab c0c40a72", + "c18a1c17 c18a1af1 c08194ad c08192ab -> 428bcd66 428bd0ba", + "c1363aea c1341ff4 c0ca6ea8 c0ca6a10 -> 428e6bd7 42901942", + "c18645fc c17b229c 41102e60 412e8a08 -> c33717ee c30d70f6", + "c16ad0ad c0fc0316 413e1074 413e19a4 -> c32e5e65 c2bb1a7d", + "3f6b9e8d 3f6bd9f3 c0a2c24c c0a2c144 -> c095f2ed c095cc36", + "4128a59e 4128a60a c17f7a9e c17d58c4 -> c3284e2b c326e627", + "c1746457 c136f51b bfd0b6cd bf6f07a6 -> 412ad44c 41c7400a", + "c1860efd c185f53f c17f8619 c17e7c11 -> 43852a40 4385cf27", + "408f16aa 408f3d96 418f2903 418f2f5d -> 42a0092b 42a03bce", + "419ab7ff 419bc785 c186b2b4 c16647f0 -> c3a3ee5c c38b2cc9", + "412b8c3c 412c0d00 40fea06a 40ff5fde -> 42aaa0a2 42aba161", + "c0c33010 c0c32ed0 400fca1a 412ced7a -> c283d95b c15b427a", + "40a735d0 40c452e8 c185fb82 c172c7ac -> c2cd7fe7 c29e934a", + "c09519be c0942fca 4182031c 4182038c -> c2977247 c2968423", + "c193cf36 c18de40e 4183c767 4183cde1 -> c39833cf c3921471", + "c15cd10f c15ba41b c18b03c7 c18922ff -> 436b51b2 436fd18a", + "4103b281 4103b603 c138b7de c10f3d30 -> c2be12d7 c2936061", + "c19a03ac c199c3de c122776c c0e17198 -> 43076961 43437c57", + "c185ef64 c185b21c c11f0e10 c11f0580 -> 432618fd 43266e15", + "c0fe0eea c0f99a56 c10e729e c10e70cc -> 428ae196 428d5e05", + "c11dda37 c11d719d c16efb90 c16ef018 -> 4312f349 43135bfd", + "c0e7d8fb c0e7c839 c14dac20 c14daa7c -> 42ba35b1 42ba44a4", + "c083a998 bfc79d62 c11f668b c11f61e1 -> 41788e24 4223f625", + "40fe52db 411106cf 410de9fc 410deddc -> 428cfc16 42a0cf00", + "c030b678 c030b448 412b7ae1 412b7d7f -> c1ecc106 c1ecba7b", + "41350d35 4141d35b 419591f0 41959300 -> 43538fcc 43627ea1", + "3e8a9896 3e8b1f6a 410ea514 413b0de4 -> 401a7405 404b4efe", + "c127ed94 c1255340 41280425 412836e3 -> c2dcafd4 c2d9029e", + "bf0d6820 3e8723c0 c1921a1b c190377f -> c09a4057 4121679b", + "c021d94f bfdf18c2 c0b9925f c0b90afd -> 41214278 416aa528", + "c19d7dd3 c19d7cfb bfed425d bfed3263 -> 4211ebb4 4211f650", + "c1216fbf c1216ecb c1490e71 c1490507 -> 42fd8652 42fd93b1", + "412f0172 412f023a 4155223f 41552c51 -> 4311b39d 4311bb26", + "4166e8e8 4166ea78 c0d184a9 c0d0c64f -> c2bcfd15 c2bc501c", + "c0643536 4096028b 4134e558 4134e6e8 -> c2214341 42540230", + "3e39ebb6 3e3cce4a 416d002f 417abf21 -> 402c1f5a 4038ee6b", + "c17f94b4 c1685bfc 40cb6ae3 412d67c6 -> c32d1f18 c2b8a1f5", + "41287216 412872ca 411da7a5 41209017 -> 42cf788d 42d34d1c", + "40d95cf9 40d97f3f c15fc02e c15c2d70 -> c2be191e c2baf27a", + "c0f4467c c0c72e38 417d06f5 417d42eb -> c2f1a983 c2c4de17", + "c19acd57 c19a96a5 c17643ab c1764049 -> 4394b394 4394ea3d", + "4145af3f 41461ba1 4013b3a8 401435c8 -> 41e41cb9 41e5632f", + "c00d2f5b c0087cb5 c1597df0 c1592912 -> 41e78f36 41efe531", + "419ed972 419edca6 418af223 418e0dbd -> 43ac6eed 43b04dd5", + "c126d3a2 c1235f40 c19a0669 c199edf5 -> 43447792 4348befa", + "c0b4d50b c0b4c581 3e180454 3f1365ab -> c0503c4c bf56b0a6", + "c0f62ce4 c0f6264c 4089d8af 408b6301 -> c2060994 c2048ad7", + "41935e5d 4195185b c1646060 c1602828 -> c38501d2 c38109af", + "c183edf2 c183e27c c1800b6d c1800b2b -> 4383edfe 4383f9b9", + "c1529fe6 c14db27a 41983cdc 41996cc0 -> c37c7614 c374a5be", + "c11051f1 c1103e93 bf1ebf59 bf1e84e7 -> 40b2a302 40b2fce4", + "41779378 41779e68 40c6c61b 40c73b45 -> 42c03ba5 42c0b577", + "c0931f8b c092a489 c03f5300 c0329100 -> 414c92ed 415be878", + "4146d27e 4147398a c18ac29f c185a7d7 -> c357f8f3 c34f9b6c", + "41985f46 41987156 416f526e 41718832 -> 438e7202 438fd3cc", + "4170c859 4170c8df c06e3241 c03bf83f -> c2600a04 c230cbd6", + "c03c7486 c03aea9a c0a2202a c09ca2fe -> 4164bbf0 416eb2d5", + "c1836ef6 c1474e6b 3fd96d3c 3fe02b84 -> c1e62edd c1a94684", + "40f21dd0 40f26260 c165dc35 c165dbab -> c2d9a27f c2d9646c", + "412d77f7 412d8815 41592330 415923b8 -> 43132288 43133090", + "3f837775 3f8390ab c15f8d78 c15edad8 -> c165c773 c164e3f4", + "c12737c1 c126c8d3 416e02a8 416fc200 -> c31c9bc5 c31b106f", + "c10fe873 c10fd42f c195a3d0 c18edb2c -> 432085ab 43283cc2", + "414e0e63 414e254d 412523b8 41252b48 -> 4304ec06 430500e5", + "4184780b 41872a79 41287758 4128a5a8 -> 432e5911 433216ad", + "418326d3 4183270d c1053184 c104da84 -> c3087950 c3081fef", + "41661822 4187f337 41968eac 4196aa70 -> 43875260 43a0060a", + "c0cdb69a c0cdb522 419bfd0b 419d890d -> c2fd2e3b c2fab001", + "3f88b490 403a9738 c1807e1a c17bfba4 -> c23b4f0b c1868f6a", + "41569685 41818b3e bf6a2030 40836256 -> c16cf321 4284f807", + "40716f1c 408ecfc2 c0b44783 c09443c1 -> c1c923f2 c18bd422", + "416c4670 41761408 410e3b57 410e4fcd -> 430345d7 4308cbd2", + "406c17ca 40cdc42b c17c66cc c17c65ee -> c2cadfba c268c56c", + "400df691 400eda4f c1784e9a c177b0ec -> c20a8f59 c2095b02", + "41744b1a 41789726 40ada49c 40add5c4 -> 42a5b3d6 42a8cdb9", + "3f206575 3f24c90b c114415a c1143bea -> c0bedc97 c0b9c063", + "c0c16854 c0c122d8 c160d730 c0e2759f -> 422ad980 42a9dddc", + "c121cf74 c121cea6 c09582d3 c09581ad -> 423cfe7a 423d00de", + "c1606cc2 c14b853a 4144f1eb 4144f405 -> c32ca931 c31c9254", + "40aed24c 40afbedc 4062ca23 4062d1dd -> 419adfb1 419bb691", + "c15a05f1 c157bd09 413fd159 41401b9f -> c3239bfb c321a676", + "417b4450 419f1d98 c17ef2ef c17ef147 -> c39e765b c37a3a98", + "41197214 411acbd8 4148eaab 4148ee15 -> 42f0db91 42f2fe6e", + "c11e037e c11e0014 c041e4a1 c041dabf -> 41ef4a22 41ef5b81", + "bcb369a8 bcaef658 bffc892c bff8e174 -> 3d2a18bb 3d30fc24", + "3f11d32f 3f93ec48 c182a95b c1821c93 -> c196ffb0 c1143b09", + "3e33d374 3e34128c 417c3df4 4181cb76 -> 40312fab 403698ed", + "3fa34782 41064e78 417337de 41735da2 -> 419b2082 42ff5b37", + "c18104f2 c180c36e c158c7d3 c12e3df3 -> 432f47fb 435a81c3", + "40a8a02d 40cf653b c10d12a8 c10cdc40 -> c26493bd c2399159", + "c10a35a6 c10a341e c12fc5f1 c12c82b7 -> 42ba432b 42bdcb14", + "c1232468 c123205c 40e060e9 41715e8c -> c319d186 c28efa11", + "c0843c4c c07ce04f 40b60808 40b6eec0 -> c1bcfc63 c1b3cf67", + "c192db43 c192daa1 4090ae6f 409107c9 -> c2a66550 c2a5fe16", + "3fc4886f 3fc4b811 418652ce 4197f3ca -> 41ce3df8 41e987d0", + "c1983216 c19823b6 beaf75af 3ebc69af -> c0e00739 40d0a068", + "4103303a 41036462 c1867425 c181d815 -> c30a0450 c3051411", + "419c847e 419cea5a 3e755ab6 3eff7c25 -> 40960242 411c9988", + "416b0c0d 416b0c9b c13b8d11 c13b60bb -> c32c33bb c32c0a9e", + "3f8290f3 3f84634d c0e374fe c0e3596a -> c0eb411b c0e7e844", + "c11f3ce8 c0c15478 c122bea6 c049c367 -> 41985ee3 42ca7643", + "c0dc69ba c0dc208a c12e9370 bf7056b8 -> 40cea913 42964ece", + "4171535f 417f18e1 c0c4a1b2 c0c44106 -> c2c3f02c c2b90121", + "416c4d1a 416c7ba6 c0bbc3d3 c007857a -> c2ad7337 c1fa2fbb", + "409217e0 4092b6d0 418ce11f 41977079 -> 42a0cb0e 42ad9494", + "c178608d c1786003 419563df 41a54855 -> c3a05c69 c390f0c7", + "c18b9c02 c1328759 409d05a8 409d06a0 -> c2ab4494 c25b01e7", + "4179d3f8 4179d860 41746397 41746501 -> 436e7f39 436e84cf", + "41829a3a 4183e5d6 402f7ac9 402f8057 -> 42330c23 4234d87a", + "c194ba0d c1945d73 c013852c c01347a4 -> 422ab65c 422b6867", + "c189e2b7 c189e227 4169224b 41692685 -> c37b2830 c37b229c", + "c1449b34 c14499fc 414870f5 4148bf23 -> c31a2c0b c319ef0c", + "40a178fa 40a190ae 413b31c5 413b32ab -> 426c2586 426c4953", + "bf879713 bf839fcd c1442851 c1441e7f -> 4149ac0e 414fca0a", + "418879a3 4188a98d 41512437 41514099 -> 435efd39 435f69d0", + "412b2e55 412b4233 c17c096d c177f23b -> c3289b78 c325cbad", + "4181a106 4181a43a 3e2c801a 3e2de7e6 -> 402eb21b 403022d6", + "415b3746 415b4362 41729153 41729265 -> 434fb6b2 434fc316", + "c19bccfe c19a8190 41233382 4123340e -> c346a668 c344ff2a", + "c160c1f4 c152acf2 40d584cb 40d58635 -> c2bb7734 c2afb72e", + "c162582d c1625563 c09042dc c08d2174 -> 42798d36 427f196d", + "c08113af c0372d12 40ab2396 40ab8192 -> c1acf2f5 c174e923", + "c0046109 c0043177 c14dcc8c c14cc432 -> 41d37975 41d4d6f4", + "4102ae33 4102af29 3fd57a01 4007f8af -> 4159f270 418ad2a3", + "4198ebc9 4198ed77 c1309f5b c0a4c112 -> c35304e7 c2c4d4c3", + "40654321 406ab46f 409151d2 40917746 -> 4182244c 41855d8d", + "c0694bb5 c052cd3b c194d6b4 c1894350 -> 42620e84 4287a36e", + "411ba844 411bab20 c175aa14 c175a814 -> c3156231 c3155e3c", + "413e2f03 414acbad c132dc3c c1313dde -> c30db015 c303ac77", + "418f6cc7 418fb689 c114a792 c114a666 -> c326e732 c3269039", + "40864f29 40865187 41323946 41331f92 -> 423b022e 423bf724", + "c1767bf8 c1766c34 c0ebb620 c013747f -> 420df045 42e2f328", + "c181ca2d c181c9e9 c1afc24a c164a557 -> 4367d74e 43b2376b", + "bf0877d2 be2ab3b7 bfe0a1d6 bfd8844a -> 3e905fd8 3f6f7e3a", + "40078336 4007865a c14c6080 c1470a64 -> c1d8644c c1d2b8fe", + "411ebd1c 412f10a8 40d7e793 40d7fc05 -> 4285e06a 4293b355", + "c14f1754 c14f16ac 41017cc5 4144d95b -> c31f3db1 c2d17eb6", + "41366e50 41866020 41352180 413579ac -> 430113de 433e83a9", + "4184cd5e 4184cf92 c0c1a77e c0c0a966 -> c2c8eec4 c2c7e3ce", + "4144511b 414451f5 c1350da9 c1350c6b -> c30ad86c c30ad6de", + "c0d98a09 c0d9870f 4114ed38 411b4ed8 -> c283f993 c27d174d", + "c171d3bf c171d1b7 40bba9aa 40bbac16 -> c2b1483c c2b14475", + "c0e68dd9 c0e0113f c19c2cd8 c1850f8e -> 42e8ed26 430ca6d3", + "c0df2b7b c0dd13c9 c0e975b5 c0c84457 -> 422cf279 424b8530", + "c0449cf7 c0429859 c0a1d821 c0a1d637 -> 4176094a 4178996a", + "401e607d 401f9283 c183b899 c183b779 -> c2243613 c222f9c4", + "c1272daa c125e7ba c18c27e4 c18c2272 -> 4335a219 43370e0c", + "c108e844 c01646b8 41222075 41229303 -> c2ade334 c1be579c", + "41593487 415935a9 c0a35943 c09dbe6d -> c28a98e7 c285d6c8", + "c1a19e41 c16ac0de c15b5835 c15b5793 -> 4349234c 438a7a11", + "c089ec3a c0837c16 40831d81 408324e7 -> c18d4f87 c186af4d", + "416816da 418ae2e3 c1665d71 c16645e5 -> c379f513 c350c3e6", + "4170084f 4170e411 c18819d2 c18812cc -> c3801175 c37f2c14", + "40f33ebc 40f34304 3e2c1868 4023e6ea -> 3fa38557 419bbf18", + "c198c381 c1980da9 bf4f787b bf425785 -> 4166dcab 41779bf5", + "c1875f42 c1875216 41137e03 41139905 -> c31c193b c31bed7d", + "4182374b 4182b6a5 c18f1e7f c18f1b55 -> c3922731 c3919594" + ] + }, + { + "glsl": "vec2 cultmath_iv_scale(vec2, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c14964a3 c1454919 3ff4d8d0 -> c1c09e7c c1bcb0c2", + "bf801a8d bf7ee327 bfa7b39e -> 3fa6f905 3fa7d667", + "40b16d65 410c1e96 403421fe -> 4179b0f4 41c53039", + "417e3caf 417e43f1 bf9afb3c -> c199ee67 c199ea02", + "c024e649 c00e2837 bf39e34c -> 3fce728f 3fef79a8", + "41365d3e 416062ea beda6b40 -> c0bf723d c09b97cd", + "413d22b6 4141f516 3edf4070 -> 40a4f0d8 40a92550", + "bdebc5f7 3c94cfdc be51bc50 -> bb73d654 3cc12a0e", + "bfaa9cc3 bf9b59bd 406bab38 -> c09d1003 c08f0347", + "c1a74fcf c1838089 c005d22f -> 42097b7e 422eeba9", + "c10aa88c c10a941e 402d3cec -> c1bba9cc c1bb8e25", + "4180b9f6 4180bb4e c01cc28a -> c21da7ee c21da648", + "41438f62 4145277e 406dd60e -> 4235af42 42372a69", + "c0bb74f5 c0bac83b 3f87eb88 -> c0c70e4a c0c656e0", + "c198555b c198547b bfa3d910 -> 41c2fde7 41c2ff06", + "c16bb226 c16bb0d2 bf884872 -> 417af144 417af2af", + "41821fd6 419f6d76 be244f50 -> c04ca708 c027096b", + "bfefaa1f bf9f6ac1 bf927a70 -> 3fb66e41 400921a6", + "40e62ef8 40ef2d00 c062d988 -> c1d3f0f6 c1cbf90f", + "c11695ff c116958d 3fe8a5b4 -> c188d968 c188d900", + "c0a1818e c09c1796 407140aa -> c19833c2 c19319a2", + "408f01fb 4092c2e5 4051f6ea -> 416a9519 4170bd55", + "3ec659eb 3edf5b15 3ebf7bd0 -> 3e145d05 3e2710fb", + "c1362416 c13623a0 bfdcfdc8 -> 419d3b2d 419d3b93", + "bf38ee46 bf349bfa c009b73e -> 3fc25180 3fc6f7c5", + "4186df32 41870faa bc442f00 -> be4f0194 be4eb74b", + "c16a04e7 c169f133 3dda1480 -> bfc75aea bfc74a21", + "406f0b1d 406f0f43 c0771523 -> c166bb77 c166b776", + "411b3586 412fe96a 3f242568 -> 40c709ef 40e19678", + "bf3e9e00 bf3e4c80 be57f490 -> 3e20880b 3e20cccc", + "c168cc6a c167fa1c 3f3e1190 -> c12cd7af c12c3b8b", + "c1661e9e c0d432c4 402363ce -> c212df36 c1876f0d", + "40ce9662 40cef31e 3dce62c0 -> 3f268cb3 3f26d776", + "c03789b2 c02f58be 3f038540 -> bfbc95fd bfb42b5c", + "41490793 4150c72d 404db8a6 -> 42218c11 4227c616", + "c180b91e c103fced bfbe7fbc -> 41446f27 41bf933d", + "c1748b49 c16a43a7 c011f60e -> 4205917b 420b6df0", + "4015919c 401598f4 3fae8750 -> 404bf00d 404bfa11", + "c13da8a8 c13091d2 3f051ba0 -> c0c53a2d c0b79da0", + "4189b7c7 4198b379 40153c8c -> 42209112 42320926", + "c0d9aeaa c0d9ad86 bfb98890 -> 411dc284 411dc358", + "c1889b08 c1889a86 be7f07a0 -> 408815fd 4088167f", + "40f4f0ef 40f4fea9 be84b1d8 -> bffdfb04 bffdecc9", + "c06197a4 c06176dc c05f348b -> 414494d0 4144b165", + "419a286b 419cd27d 3fdc2a38 -> 42049428 4206dec0", + "418cc54b 4192a5e1 bfa017aa -> c1b76a76 c1b010a4", + "c17686e4 c1757b92 402fdff8 -> c2295de4 c228a63d", + "c115b0be c1159836 beaea588 -> 404c1c5f 404c3dd7", + "c11b0b5d c119cbb7 bf34a690 -> 40d90e9b 40dad1bc", + "41872854 41872898 c01bff8c -> c224b8ff c224b8ac", + "c1202004 c11a97ba 3ee67ae0 -> c090299f c08b2e85", + "410d8386 410d84d2 3f3d84e8 -> 40d18724 40d18910", + "c1274a40 c11e97c6 3fa24f98 -> c15421ff c1491ab5", + "c02cc2ce c02aa1f2 3fefabbc -> c0a1bdc3 c09fbfa8", + "415ab2ce 4160a51a 3c2fba00 -> 3e161f21 3e1a3415", + "c1600727 c15edca1 bf17f324 -> 410447ce 4104f8fe", + "4191baef 4191bf41 c07b379a -> c28f062c c28f01ef", + "c13ec27a c125eeae bfd56ee2 -> 418a5776 419f0a6f", + "418f59a5 418f5a13 3fb19668 -> 41c6e268 41c6e300", + "415de36d 4170c593 39cc8000 -> 3bb1402d 3bc055d4", + "c1908903 c18aef89 c00ea7a6 -> 421ad7b5 4221154e", + "c111bd9d c111bb19 3ed6ef00 -> c074b923 c074b4e9", + "3e9ed994 3e9fedec 3f5614d8 -> 3e84d6d1 3e85bde9", + "c17442df c16efb6d c0729a68 -> 426279d1 42677a8a", + "40e8d9c0 40f12420 c0620460 -> c1d4e603 c1cd9436", + "c17a0d1c c179d9a6 3f90d614 -> c18d787a c18d5b5d", + "4191ece3 4191ed99 c07cf598 -> c29031e2 c290312e", + "41802de9 41b6da07 40046e1e -> 42049d9e 423d2e25", + "c148fa3a c148f9a2 403d3bba -> c2148fa1 c2148f30", + "c11c76dd c110b81f c06d755a -> 42063ccc 421121c4", + "41861541 41862647 405d858e -> 42680c99 42682a0f", + "c15aa5c0 c15a86bc 3ff10278 -> c1cdd826 c1cdbaf2", + "3ef09e19 3f0b4d73 3ee66830 -> 3e588ff8 3e7ac08e", + "418efaff 41904b51 bfc4e088 -> c1ddf071 c1dbeb26", + "4141ec18 41594ee8 3efa4900 -> 40bd97dc 40d47506", + "419a6ca3 419acedd c0306582 -> c2555734 c254cfd7", + "c13756da c11e68d0 3f9362fc -> c1531b86 c13666df", + "c1a33b0f c1884cbd 3fd37f6c -> c206daed c1e1362f", + "be715eb7 be712349 401aa9ce -> bf11d314 bf11af2c", + "bfbede0d bfbed533 c040021d -> 408f217a 408f281d", + "40ea0ea6 40ea1c1a bd88f880 -> befa845c befa75f7", + "402edc4c 402eed54 bfb896e0 -> c07c4359 c07c2ac9", + "c1824002 c181e7f2 bfc5cdbe -> 41c8bfc9 41c947df", + "c0e3d8b2 c0e0c35a 403105d0 -> c19d8dff c19b6c2c", + "c184bd59 c184bd21 be9050e0 -> 4095a8a4 4095a8e3", + "40fdaff6 40fdb56a c03b687d -> c1b9bb12 c1b9b714", + "c14193e1 c1418fa7 bcde1980 -> 3ea7eddb 3ea7f185", + "41090940 410909d8 405e877a -> 41ee3d15 41ee3e1e", + "c0b581f5 c03c8086 be2ffa50 -> 3f01942c 3f798aa0", + "c130f64b c12d9b15 bfc7ec1e -> 418793ad 418a32ac", + "418aa675 418aa6d3 bdc886e0 -> bfd936c3 bfd93630", + "c03005d3 c02fe2cd bf4ccb9c -> 400cb49f 400cd0a4", + "414a499b 414a5125 3f84b9a0 -> 4151c143 4151c914", + "c13bfc6c c10f102a c07b249c -> 420c594f 42386b60", + "4142cf0e 417b745a c0043a19 -> c201e10f c1c93df2", + "41137b39 416a31fb 404beb16 -> 41eaf44a 423a8cb2", + "c12ce57f c11da1f7 405010e0 -> c20c85dd c2001dfd", + "40d7250b 40d73665 40445c02 -> 41a505af 41a512ff", + "3fd29f26 4109fd53 c013c494 -> c19f4cd9 c073263d", + "4011ed90 4011fa00 bfbc3000 -> c0569dee c0568ba5", + "4149003a 416bc24e 4039858c -> 4211aa05 422ada67", + "c19f5fa0 c19f4d64 3ebfca70 -> c0eeccbf c0eeb16d", + "c0b8c0f5 c0b2cce7 3ff6f410 -> c132398f c12c7b5c", + "c19591c0 c180fb42 4052d1b4 -> c2765829 c2546f88", + "c0361295 404c5d95 bfbf5b0a -> c098c27f 4088189d", + "bfc9ee31 3f0c2ce2 c04198ac -> bfd402de 4098b500", + "40f5653c 40f8629c 406173b6 -> 41d81ce5 41dabef0", + "bf773ac8 40ec51a9 403ca41c -> c0362da8 41ae2376", + "c0821a03 c08208a9 4011ce08 -> c11432e1 c1141f1e", + "4069c93d 4095fa42 bfcfa26e -> c0f34908 c0bd9e0e", + "c1474df3 c14745dd c0589df8 -> 42289de9 4228a4c1", + "c0ef0500 c0eeb2f0 c074976b -> 41e40fbc 41e45e24", + "c16f81c4 c15427a0 3e22f940 -> c018794f c0070fa3", + "40f93e6f 40f9c091 bfd41978 -> c14eec51 c14e8080", + "c15b7440 c15b711c 4053de22 -> c2359f3d c2359ca3", + "419e46cf 419e4829 bfc3965a -> c1f1dbda c1f1d9ca", + "40342b76 403433ca c04b1ef6 -> c10efadc c10ef441", + "c18bba13 c175f99e 3f27cfb8 -> c1372f85 c1213d6c", + "c09ee58e c09ed506 40441e28 -> c17374f1 c1735b9d", + "419da210 419e77bc c040222b -> c26ddde7 c26c9d2c", + "412303be 412c6872 4033b9d4 -> 41e4e3e5 41f2145c", + "c05c6d9c bf8543c7 3f7bf1b8 -> c058ef9a bf832749", + "415649c0 41564d70 3ee58090 -> 40c01b96 40c01ee4", + "c105e5e3 c105d15d c076524c -> 4200c234 4200d5f4", + "bf4df8d8 410f6aee c031342e -> c1c68c54 400e9309", + "40bc8ba7 40bcf691 401d5b02 -> 4167c959 41684cc8", + "4191710b 4191866d c04c1276 -> c268033b c267e124", + "bf780cd7 bf780329 3fa586c0 -> bfa062d7 bfa05c95", + "c143df75 c143de2d bf5721c8 -> 41249970 41249a84", + "c028afb8 400efcb8 c038be96 -> c0ce602f 40f377c3", + "c166e429 c166e1c5 c003a3f4 -> 41ed72cb 41ed7541", + "c0d012c2 bff1521a 3fbeeed0 -> c11b3006 c033fc0e", + "c020a7cc c00919d4 bfcbec32 -> 405a6bf3 407ff292", + "c105e729 c105e495 407211b4 -> c1fd3b8f c1fd36ae", + "4121e0d4 4121eb10 401a3f1c -> 41c3124f 41c31ea4", + "c1851bf6 c184e3de 403b7a36 -> c242f5f0 c242a3c8", + "c04640d3 c02a2e0d 402cfaba -> c105f5b9 c0e5fb3b", + "c187c632 c187c5e0 c019a3c5 -> 4222f83d 4222f89f", + "c1988c95 c198870d 3fe12800 -> c2062b65 c2062688", + "c146cf94 c146c84c 400dd98a -> c1dc528b c1dc4a7a", + "c12e1426 c12dffa8 bffc7548 -> 41ab9760 41abab96", + "c054db71 c054d20f c02061d6 -> 4105549f 41055a80", + "4130a3db 4130a849 c05eac5c -> c219a8e0 c219a505", + "bfa6c54b bfa6a255 3fd6fcd0 -> c00c0d9e c00bf042", + "3e1e8f1f 3eba1170 c003159a -> bf3e8d3f bea2613c", + "c170f75c c16a630e 400236a0 -> c1f5220f c1ee70a1", + "4166a49b 4166a60d 3f6484f0 -> 414de25f 414de3a9", + "3f9361d6 3f9368ea c014f350 -> c02b8984 c02b8147", + "c0fe5024 c0fe4e70 c045a710 -> 41c45851 41c459a2", + "c1924785 c19238b5 3f961e88 -> c1ab8eb4 c1ab7d55", + "41954c40 41955000 be96bd90 -> c0afd6e0 c0afd276", + "3f73c0a1 3f73ce1f 4023cdec -> 401bf7b8 401c005b", + "410c55a0 410c6940 c03e7fd8 -> c1d0f878 c1d0db43", + "40928419 4092a09f bfe09356 -> c100a0ef c10087e9", + "410ddcb7 417383b9 3e3acd40 -> 3fcf0834 4031b0f2", + "c16eb44d c16d94e3 bf7f233c -> 416cc801 416de673", + "41860118 419dcd30 3f01f678 -> 41080f22 412038a5", + "4194f5d9 4194fee3 c0381ce8 -> c256500c c256430c", + "c1589be3 c153975d bfe888d4 -> 41c03244 41c4c10c", + "c191ccf8 c191cc32 c052e7d0 -> 42703b0d 42703c54", + "c18a8e77 c186db01 402b8490 -> c239a9d2 c234b43d", + "c051afbb c04fa475 40680406 -> c13e0a8d c13c304d", + "c1639c5e c0c118c5 3f4f1dd0 -> c13825f2 c09c3984", + "c042cccd c0421673 bf6806a4 -> 402fe961 40308ea7", + "40a1c13a 40a1cf1e 401a38ba -> 4142e429 4142f4e6", + "c0df6acd c0d17eab c0498db4 -> 41a4f06a 41afe686", + "40ee6ca4 40ee72ac bd3ab040 -> beade37b beaddf15", + "4118a9a1 4118aabf be3b3020 -> bfdf42d9 bfdf4137", + "c1856514 c18564de 4058d0ce -> c261f42d c261f3d1", + "c0e2ec51 c0e2b99b bf8bd570 -> 40f7af9e 40f7e704", + "3fe18c23 3fffe29d c00f11dd -> c08f0171 c07c1a09", + "c193735d c1930aad 3f1a3f60 -> c131afcd c13131a6", + "c00b4a31 c00ac41f bea4ea98 -> 3f32c99b 3f337658", + "3fc1b053 4081dff3 3f314530 -> 3f861f42 4033dde1", + "412f2e2b 412fe92d bdef60e0 -> bfa47d42 bfa3ce65", + "c14eeb10 c14ed6bc c0557124 -> 422c7414 422c8507", + "c0e5a8bf c0b60371 407170c6 -> c1d89907 c1aba96c", + "c1557108 c15557c0 40625d9c -> c23cbbd5 c23ca57a", + "406fe84a 40703526 3f9587b8 -> 408c2163 408c4e48", + "c0b6088b c0b5e1a1 baa81000 -> 3beecee0 3bef01f8", + "c1a72a9e c185d55c 3f7ea2b8 -> c1a6468a c1851ec2", + "c13b4cbb c11475d9 3feff79c -> c1af91cc c18b299e", + "c1565b24 c154fc5a 3fd10f34 -> c1af0d23 c1adeeac", + "c144c2b7 c11a1711 bf9e96da -> 413eea12 4173c83d", + "40bba57a 40bba89e bfd4b7ba -> c11bee51 c11bebb5", + "414ff321 419cfb60 3ee1c500 -> 40b764b6 410a71bd", + "418fbfa2 41aafa66 3fa5be38 -> 41ba22a6 41dd64de", + "4117958a 418e07ab 3e42aac0 -> 3fe688db 40580116", + "c08a856f c08a4409 bfbb8a44 -> 40ca94c0 40caf492", + "c10dee27 c10da887 c015c7c1 -> 41a5c33f 41a614b8", + "41895f36 41895fc6 c067d08c -> c278caa9 c278c9a4", + "4192f782 41935e1a 406a1556 -> 4286627d 4286c04c", + "4193b808 41941abc 3f9e9670 -> 41b704c7 41b77f11", + "4120ab39 4120abaf 4001586c -> 41a25b8d 41a25c04", + "c09aef5e c09aec5a 40661442 -> c18b3f51 c18b3c9b", + "40a13379 40a2797f c0045e3e -> c12804eb c126b3c5", + "40bb80df 40c41e79 bf851d12 -> c0cbf434 c0c2fe7d", + "c182efea c182e20e bf117e84 -> 4114c571 4114d532", + "41584d0c 415850ac 4061760a -> 423e7f74 423e82a5", + "c1869865 c1721431 bcdf7480 -> 3ed34dc1 3eeaf801", + "c0958723 bff6d094 c0381688 -> 40b17ba3 41570c94", + "be08c21c be05a4e4 40183ef0 -> bea2a9c0 be9ef585", + "c1038553 c0fe5bbf 3f1d05d8 -> c0a15789 c09c0413", + "c114476c c07b4e50 bf142e38 -> 401176a5 40aba81f", + "418012bf 41801605 404aa34a -> 424ac0f7 424ac626", + "4182df6b 418308f1 403d9962 -> 4241dab7 42421839", + "4028f0ea 4053ef36 40388f62 -> 40f3978f 4118caa3", + "c1886ea0 c18751fc 40052608 -> c20deb7c c20cc365", + "414b8669 41646a87 3fe31550 -> 41b48921 41ca9d7a", + "40976405 4097675b bf98f75e -> c0b4ef55 c0b4eb58", + "c1a2bed9 c1927a07 3fc35fd0 -> c1f86891 c1df938b", + "c15abcdf c15aa9cf c041109a -> 4224e833 4224f694", + "404caa52 40b8d58f 40222492 -> 4101a105 416a2318", + "c15ebe59 c15eac5b 402aa1bc -> c2147720 c2146b22", + "40d2e15d 40d30013 3ff64758 -> 414adf54 414afce0", + "418d8d39 418d8f0f c03fcf50 -> c25420be c2541dfe", + "bf5fd134 4061d72d 3fe96d2c -> bfcc14db 40cded27", + "c189c1dd c1896a51 c056daa6 -> 4266a87b 42673b6e", + "40ae2738 40ae5148 bff6aec4 -> c127f91c c127d094", + "c09c4196 c095ed36 beab1ed0 -> 3fc86efd 3fd0e53c", + "c188cf65 c186cf41 3f04b088 -> c10dd28f c10bbfa7", + "c12f5b8d c12f4b93 c0550f48 -> 4211e458 4211f1a4", + "41137bb7 411bafa1 405076a2 -> 41f031ba 41fd8db1", + "412e9a99 412ea71f 3f220b20 -> 40dd0ad7 40dd1ab1", + "c18ee43e c18ec9be bf013b10 -> 41102934 411043f6", + "c1975709 c1973fe7 bfbea73a -> 41e14875 41e16ae9", + "c1a5b2de c18dca2e 3f9745e0 -> c1c3d376 c1a791e9", + "4076bfa9 4076c407 c01d1966 -> c1176eb4 c1176c06", + "400c9529 40f3ba0c bfa879fa -> c1206639 c03909bd", + "408cb339 408e018f 407ba066 -> 418a4be1 418b9481", + "4168d584 4168db6c c00dd0ac -> c200fea9 c200fb64", + "c0b52bf1 c0b529f7 3f988214 -> c0d7dc4b c0d7d9f0", + "c1144d00 c1140d04 407e3b2c -> c21346ad c2130722", + "40c87b03 40c883bd bed22bb8 -> c0249e4f c0249725", + "c1396876 c12f4666 3f86dae8 -> c1435671 c138a974", + "c160bf7d c160beff c04ad97e -> 423215a6 4232160a", + "40b5dc69 40b9682f 405cef02 -> 419cf334 41a002a2", + "418e771e 418e842a 40073ed0 -> 4216878b 42169554", + "4146848b 4146ea7d 3f419028 -> 411619b6 411666cb", + "c0a5fc12 c0a2a846 bf83a64a -> 40a74b88 40aab79d", + "411ef843 411efa05 c00f7524 -> c1b22ccf c1b22ad6", + "416df976 41930f11 c05e93c4 -> c27fb7e6 c24ee7b1", + "c0bcf878 c0b36640 bf9dbfe4 -> 40dd185d 40e8e40f", + "413352d2 413d45aa 407195ac -> 422939cf 42329d3e", + "c0e9ffb0 c0e9ca3c 3fc22290 -> c131735b c1314ad2", + "c140ad6c c1408d90 bfb36e64 -> 4186f604 41870c58", + "401c9e16 401e1d6a 405c5ace -> 4106cf69 4108195d", + "c1626dbc c0ea1605 4053945e -> c23b23ad c1c177d1", + "c19c79af c17a5129 403dea6e -> c2682a41 c239b325", + "bfd61ee8 bfcf16d8 3f471ae8 -> bfa68888 bfa11086", + "c19ac8c2 c1826300 402bb3b8 -> c24fa186 c22ee754", + "4051034e 40d7c5f1 c0578182 -> c1b5a466 c12ff383", + "c12d8b14 c12d7dbe 4033dc18 -> c1f3dae6 c1f3c828", + "400c9815 4047741b bfb70918 -> c08e9b15 c0490b6b", + "4115e023 41342ffd 40334c00 -> 41d1f06e 41fc6618", + "41928a76 4193a536 407ef1aa -> 4291efb7 4293094c" + ] + }, + { + "glsl": "vec2 cultmath_iv_abs(vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c1889861 c187aeb5 -> 4187aeb5 41889861", + "c17f5b90 c17f526c -> 417f526c 417f5b90", + "41467e93 41468065 -> 41467e93 41468065", + "c0181fcf c015aba1 -> 4015aba1 40181fcf", + "c159fa8b c159ec93 -> 4159ec93 4159fa8b", + "411bf84c 4195b1ea -> 411bf84c 4195b1ea", + "c15c1f7c c12b1c04 -> 412b1c04 415c1f7c", + "c1663a76 c15d5c96 -> 415d5c96 41663a76", + "4105286c 4125c794 -> 4105286c 4125c794", + "c16af54d c16655d1 -> 416655d1 416af54d", + "bfef5312 bfe0e16e -> 3fe0e16e 3fef5312", + "41967337 419673b5 -> 41967337 419673b5", + "c0b915b4 406a6a88 -> 00000000 40b915b4", + "40e608f2 40e996e6 -> 40e608f2 40e996e6", + "bf86296a bf861d96 -> 3f861d96 3f86296a", + "c18bd319 c18bd273 -> 418bd273 418bd319", + "c1189a26 c0e70e05 -> 40e70e05 41189a26", + "c0e120f5 c00e203e -> 400e203e 40e120f5", + "bf125782 3e888883 -> 00000000 3f125782", + "c1859bde c182e788 -> 4182e788 41859bde", + "c14a473e c14a2218 -> 414a2218 414a473e", + "416bdc98 4196a364 -> 416bdc98 4196a364", + "c048b3d2 bf8fad1c -> 3f8fad1c 4048b3d2", + "c0d3ca7a c06770d4 -> 406770d4 40d3ca7a", + "c1509a64 c15099f0 -> 415099f0 41509a64", + "c19bf04c c12c059c -> 412c059c 419bf04c", + "41289b7a 41750efe -> 41289b7a 41750efe", + "3fdc3459 3fdee187 -> 3fdc3459 3fdee187", + "40b4dba0 40b4dcb8 -> 40b4dba0 40b4dcb8", + "4134155f 41471ef1 -> 4134155f 41471ef1", + "c0322bd1 bfab79be -> 3fab79be 40322bd1", + "c1924336 c19242da -> 419242da 41924336", + "c128f0da c11f5bd2 -> 411f5bd2 4128f0da", + "40ffe6f4 4100040a -> 40ffe6f4 4100040a", + "3f0459f1 3f04a40f -> 3f0459f1 3f04a40f", + "c14ac6ca c0e3f15c -> 40e3f15c 414ac6ca", + "4130003b 41303a8d -> 4130003b 41303a8d", + "3ea5fbb1 3ea616cf -> 3ea5fbb1 3ea616cf", + "40f44ae6 40f44c52 -> 40f44ae6 40f44c52", + "40a31ec4 40a6d2e4 -> 40a31ec4 40a6d2e4", + "408fde6a 40aafc1e -> 408fde6a 40aafc1e", + "c026e712 c0258e1e -> 40258e1e 4026e712", + "419ca4e0 419ca55c -> 419ca4e0 419ca55c", + "c10eb34f c10e9b01 -> 410e9b01 410eb34f", + "c10ce927 c09a1752 -> 409a1752 410ce927", + "c1033e5a c102e1cc -> 4102e1cc 41033e5a", + "419c49ae 419c4e5a -> 419c49ae 419c4e5a", + "c11b58ef c11b4155 -> 411b4155 411b58ef", + "c0e65441 c09d4f4f -> 409d4f4f 40e65441", + "40e047cc 40e96f74 -> 40e047cc 40e96f74", + "c1591434 c1591378 -> 41591378 41591434", + "c0ff4a58 bfb58992 -> 3fb58992 40ff4a58", + "412436a3 412439a5 -> 412436a3 412439a5", + "c137ab29 c1378599 -> 41378599 4137ab29", + "c039c69b c0382a85 -> 40382a85 4039c69b", + "412e1db4 412f998c -> 412e1db4 412f998c", + "c0848076 c08479ae -> 408479ae 40848076", + "c146b348 c14366dc -> 414366dc 4146b348", + "c08542dd c082c507 -> 4082c507 408542dd", + "c18d4b2f c18d49c1 -> 418d49c1 418d4b2f", + "bf5e3c32 bf5cdf0e -> 3f5cdf0e 3f5e3c32", + "419cf4b2 419db102 -> 419cf4b2 419db102", + "4181b581 41883107 -> 4181b581 41883107", + "41933524 419378a0 -> 41933524 419378a0", + "c1510f70 c1510cf8 -> 41510cf8 41510f70", + "40feb3ee 41134f25 -> 40feb3ee 41134f25", + "c0f59a20 c0333ea0 -> 40333ea0 40f59a20", + "bffb0866 bff1bada -> 3ff1bada 3ffb0866", + "c078e179 c0776b77 -> 40776b77 4078e179", + "40f70161 410ed558 -> 40f70161 410ed558", + "41523c62 417c9f3e -> 41523c62 417c9f3e", + "418188f1 418fb27b -> 418188f1 418fb27b", + "c1647e42 c15f5464 -> 415f5464 41647e42", + "c18c7307 c183fced -> 4183fced 418c7307", + "c186f011 c1862fd5 -> 41862fd5 4186f011", + "418ed765 41948687 -> 418ed765 41948687", + "414828a1 4148b9ff -> 414828a1 4148b9ff", + "c14148ea c12e27f6 -> 412e27f6 414148ea", + "c190a7cf c18989e9 -> 418989e9 4190a7cf", + "c1ae9e50 c16571b8 -> 416571b8 41ae9e50", + "c13ab99b c13513bd -> 413513bd 413ab99b", + "c133c5ea c133bc8e -> 4133bc8e 4133c5ea", + "40f5a678 41590f10 -> 40f5a678 41590f10", + "c1308b5b c1303aa7 -> 41303aa7 41308b5b", + "41134516 411547b6 -> 41134516 411547b6", + "c13b8c0e c0efe294 -> 40efe294 413b8c0e", + "416ce86d 416cef13 -> 416ce86d 416cef13", + "c0f85056 c0f55612 -> 40f55612 40f85056", + "c050f7fc c050ef94 -> 4050ef94 4050f7fc", + "c00b0db0 c00afa80 -> 400afa80 400b0db0", + "4104bd78 4104bfec -> 4104bd78 4104bfec", + "c044d926 c03fd4da -> 403fd4da 4044d926", + "c169a65d c1156ccf -> 41156ccf 4169a65d", + "c1a5f87c c1962f66 -> 41962f66 41a5f87c", + "410e8edb 4110fd6d -> 410e8edb 4110fd6d", + "3ef0bc5c 3f162dd2 -> 3ef0bc5c 3f162dd2", + "c051f089 c0344647 -> 40344647 4051f089", + "4084d144 4084d5fc -> 4084d144 4084d5fc", + "40d0ce0e 40d6d80a -> 40d0ce0e 40d6d80a", + "c1851993 c18517af -> 418517af 41851993", + "bf770427 bf587299 -> 3f587299 3f770427", + "c188a8a1 c1887fed -> 41887fed 4188a8a1", + "c0d38cea c0d38bc2 -> 40d38bc2 40d38cea", + "417f81a8 418053c0 -> 417f81a8 418053c0", + "c13f2c42 c13d2d5e -> 413d2d5e 413f2c42", + "c0c13b93 c00c33ca -> 400c33ca 40c13b93", + "c0df381c c0afc71c -> 40afc71c 40df381c", + "c114d5b4 c114d4ea -> 4114d4ea 4114d5b4", + "c10a92a2 c1080756 -> 41080756 410a92a2", + "c18e6095 c1842851 -> 41842851 418e6095", + "418f562b 418f63e9 -> 418f562b 418f63e9", + "4115ed03 4115ee3d -> 4115ed03 4115ee3d", + "c17d2216 c17a661a -> 417a661a 417d2216", + "3d61e63a 3d63e1c6 -> 3d61e63a 3d63e1c6", + "40b0f9c3 40b0fea5 -> 40b0f9c3 40b0fea5", + "41866c35 418ba923 -> 41866c35 418ba923", + "c18d7657 c18d7295 -> 418d7295 418d7657", + "4117405d 4117418b -> 4117405d 4117418b", + "c1a031fe c1562b10 -> 41562b10 41a031fe", + "c123c4a7 c123c1bb -> 4123c1bb 4123c4a7", + "c191ef78 c191d0e0 -> 4191d0e0 4191ef78", + "40c7e85f 40c7eb21 -> 40c7e85f 40c7eb21", + "c127a87a c1262090 -> 41262090 4127a87a", + "c1147ea4 c1131354 -> 41131354 41147ea4", + "bfb2bf5f bfabd1c1 -> 3fabd1c1 3fb2bf5f", + "416a9d42 416a9dce -> 416a9d42 416a9dce", + "40574a5e 40576c22 -> 40574a5e 40576c22", + "c1233658 c12334dc -> 412334dc 41233658", + "4135ebd8 4198f8c0 -> 4135ebd8 4198f8c0", + "c0c082ab c0b7adad -> 40b7adad 40c082ab", + "3f5230f0 3fbcd728 -> 3f5230f0 3fbcd728", + "418a8579 418a85d3 -> 418a8579 418a85d3", + "40f20973 40f6c405 -> 40f20973 40f6c405", + "4165d0ce 4165d1fa -> 4165d0ce 4165d1fa", + "c180af77 c180adeb -> 4180adeb 4180af77", + "4197e456 4197ec96 -> 4197e456 4197ec96", + "c0b7beca c02427ec -> 402427ec 40b7beca", + "413111e9 4131a89f -> 413111e9 4131a89f", + "4104c2b8 4106fd6c -> 4104c2b8 4106fd6c", + "41639bc1 41642dd7 -> 41639bc1 41642dd7", + "c0d6cf50 c045c8a9 -> 4045c8a9 40d6cf50", + "40db253b 40db2795 -> 40db253b 40db2795", + "c1218b99 c0da4795 -> 40da4795 41218b99", + "c154f26d c145d0e7 -> 4145d0e7 4154f26d", + "c19e0f73 c19d0075 -> 419d0075 419e0f73", + "c1390cf0 c1390b92 -> 41390b92 41390cf0", + "408d9665 408f83ab -> 408d9665 408f83ab", + "40b5a0b8 40b5b588 -> 40b5a0b8 40b5b588", + "3cc3702a 3e0948fb -> 3cc3702a 3e0948fb", + "c05e3e90 c05770e0 -> 405770e0 405e3e90", + "4117b8ed 4117bc17 -> 4117b8ed 4117bc17", + "beaa5ae5 bea8e81b -> 3ea8e81b 3eaa5ae5", + "40368856 4039f38a -> 40368856 4039f38a", + "40a0fa4c 40a95e04 -> 40a0fa4c 40a95e04", + "bf4d1b98 beb0a4d0 -> 3eb0a4d0 3f4d1b98", + "c078d1cf c078b3e1 -> 4078b3e1 4078d1cf", + "c17f1e34 c164fd12 -> 4164fd12 417f1e34", + "c0f43858 c0f05524 -> 40f05524 40f43858", + "c18903ac c1784a31 -> 41784a31 418903ac", + "411eef9d 412cda73 -> 411eef9d 412cda73", + "bfe74a3c bfe74364 -> 3fe74364 3fe74a3c", + "c1854d13 c1851d51 -> 41851d51 41854d13", + "418bb033 419da455 -> 418bb033 419da455", + "40f2f7b5 4112e84d -> 40f2f7b5 4112e84d", + "c11ad0f5 c11a550f -> 411a550f 411ad0f5", + "c19c6c5d c19c6bb5 -> 419c6bb5 419c6c5d", + "c136dd90 c136d636 -> 4136d636 4136dd90", + "412ef373 412ef789 -> 412ef373 412ef789", + "c04cd83d c04c54c3 -> 404c54c3 404cd83d", + "3f067d70 3f85a4a8 -> 3f067d70 3f85a4a8", + "c110df8b c11064bb -> 411064bb 4110df8b", + "c0f3e86e c0f3d4ce -> 40f3d4ce 40f3e86e", + "c163de94 c1009cca -> 41009cca 4163de94", + "4197acc2 419d422e -> 4197acc2 419d422e", + "c1230fd0 c1230f44 -> 41230f44 41230fd0", + "c1489ddb c145662b -> 4145662b 41489ddb", + "415e6c3b 416098c5 -> 415e6c3b 416098c5", + "c1618c7f c15dd5d1 -> 415dd5d1 41618c7f", + "c181f245 c181f205 -> 4181f205 4181f245", + "c0e43580 c0d9e208 -> 40d9e208 40e43580", + "414fea42 415dfb76 -> 414fea42 415dfb76", + "c0ed85f5 3fb88bf4 -> 00000000 40ed85f5", + "410d307a 410d3dbe -> 410d307a 410d3dbe", + "c19ce34a c18ac458 -> 418ac458 419ce34a", + "c189d927 c189d86b -> 4189d86b 4189d927", + "c144e83b c13f2937 -> 413f2937 4144e83b", + "c0e441ba c0e440be -> 40e440be 40e441ba", + "c0251e50 406c2ad0 -> 00000000 406c2ad0", + "411a19fc 412b9ce8 -> 411a19fc 412b9ce8", + "c11eb186 c11eb116 -> 411eb116 411eb186", + "414f7bae 419042d5 -> 414f7bae 419042d5", + "40732b0e 40734322 -> 40732b0e 40734322", + "c0f70315 c0f6d4bf -> 40f6d4bf 40f70315", + "c11fbba7 c11e5845 -> 411e5845 411fbba7", + "c17fd0b0 c17fcf64 -> 417fcf64 417fd0b0", + "c17c4edf c17c2501 -> 417c2501 417c4edf", + "c1934491 c1897101 -> 41897101 41934491", + "41822cf2 4182638e -> 41822cf2 4182638e", + "c18992aa c1898a84 -> 41898a84 418992aa", + "3e6e0e38 4085f74e -> 3e6e0e38 4085f74e", + "41868e13 41868ed1 -> 41868e13 41868ed1", + "40ff666c 40ff6a44 -> 40ff666c 40ff6a44", + "4151da5e 41523eea -> 4151da5e 41523eea", + "c0e5790b c0b6ad21 -> 40b6ad21 40e5790b", + "c177d8c2 c177d510 -> 4177d510 4177d8c2", + "4185f6b4 4185fc38 -> 4185f6b4 4185fc38", + "412a4b1e 412a5b5e -> 412a4b1e 412a5b5e", + "4131412c 4160fd34 -> 4131412c 4160fd34", + "c143f7c7 c143f40d -> 4143f40d 4143f7c7", + "40e967e8 40e9a200 -> 40e967e8 40e9a200", + "c18fe1ef c18fbd5b -> 418fbd5b 418fe1ef", + "40ea90fa 41653eb3 -> 40ea90fa 41653eb3", + "c1a22b60 c19a9fd6 -> 419a9fd6 41a22b60", + "40c70930 40c817e0 -> 40c70930 40c817e0", + "c17a2f19 c17a2e87 -> 417a2e87 417a2f19", + "41790bc7 417948b9 -> 41790bc7 417948b9", + "c11e5ed2 c11e4bf6 -> 411e4bf6 411e5ed2", + "c187a5ee c18197b2 -> 418197b2 4187a5ee", + "c125ade1 c1255b7f -> 41255b7f 4125ade1", + "c08fa4d3 c045d2cb -> 4045d2cb 408fa4d3", + "c19c5eda c19c4584 -> 419c4584 419c5eda", + "c030cc51 3f417d44 -> 00000000 4030cc51", + "c155d8ae c141bef2 -> 4141bef2 4155d8ae", + "40a62e5f 40b56669 -> 40a62e5f 40b56669", + "c19ed88a c19ed84e -> 419ed84e 419ed88a", + "c1193b8a c0e3993b -> 40e3993b 41193b8a", + "40afffe9 40b006cf -> 40afffe9 40b006cf", + "416bdcf3 416c38c5 -> 416bdcf3 416c38c5", + "c0d2c198 c0c45f3c -> 40c45f3c 40d2c198", + "c16d3f7b c16d3ee1 -> 416d3ee1 416d3f7b", + "4142240e 415a2202 -> 4142240e 415a2202", + "410f4f16 410f502a -> 410f4f16 410f502a", + "c0fe3cdf c0fd6505 -> 40fd6505 40fe3cdf", + "c19558c8 c1953aaa -> 41953aaa 419558c8", + "c12a27db c12a2737 -> 412a2737 412a27db", + "40bd27ac 40cbf89c -> 40bd27ac 40cbf89c", + "412898ea 41462a8e -> 412898ea 41462a8e", + "c0b73df6 c0b29c7a -> 40b29c7a 40b73df6", + "41900783 41a04305 -> 41900783 41a04305", + "4137f166 4137f4da -> 4137f166 4137f4da", + "c17a2b30 c13a2188 -> 413a2188 417a2b30", + "3c050013 3c09ffed -> 3c050013 3c09ffed", + "4117df65 4117dfdb -> 4117df65 4117dfdb", + "413e1528 413e160c -> 413e1528 413e160c", + "bfc0e30a bfb19896 -> 3fb19896 3fc0e30a", + "c027ef85 c025a49b -> 4025a49b 4027ef85", + "c0d7eefd c0d7b3ab -> 40d7b3ab 40d7eefd", + "c19dc2ed c19dc15d -> 419dc15d 419dc2ed", + "40f8e653 40f9300d -> 40f8e653 40f9300d", + "4084c409 408e969f -> 4084c409 408e969f", + "4137403e 41374472 -> 4137403e 41374472", + "c052ecbf 4059a5af -> 00000000 4059a5af", + "c0b5f342 c0b3f89a -> 40b3f89a 40b5f342", + "c185f3ea c17e925c -> 417e925c 4185f3ea", + "4150e868 4150eea8 -> 4150e868 4150eea8", + "be676cbd be4dd943 -> 3e4dd943 3e676cbd" + ] + }, + { + "glsl": "vec2 cultmath_iv_min(vec2, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "41719018 41a2d1b0 4155ad74 41849d6e -> 4155ad74 41849d6e", + "c0d567fe c0d109d2 c0c42fd2 c0c4188a -> c0d567fe c0d109d2", + "40836c8e 412dd5cd 4195ccf0 4196cae8 -> 40836c8e 412dd5cd", + "408496ba 40849af6 c07bf68a c07b34c6 -> c07bf68a c07b34c6", + "415da65c 415da9b4 418bad2d 418c58b7 -> 415da65c 415da9b4", + "c11d81d5 c11d80ad c0e2d86e bf8065a8 -> c11d81d5 c11d80ad", + "c0507d7e c04d75f2 41187d70 411880a8 -> c0507d7e c04d75f2", + "4186213c 41862178 c125b89f c125b307 -> c125b89f c125b307", + "c191451e c142dbe0 402d0c25 402d99ab -> c191451e c142dbe0", + "bdb31932 bdb268ce 415a723a 415a731e -> bdb31932 bdb268ce", + "c191e878 c191e09c c1a1c595 c197a7eb -> c1a1c595 c197a7eb", + "c13fd8d9 c1166ca7 c0b13345 c0b1296f -> c13fd8d9 c1166ca7", + "c15dc2f8 c159de38 418b70d6 418cc516 -> c15dc2f8 c159de38", + "c11cede1 c0c83e57 c13e5b76 c120dd42 -> c13e5b76 c120dd42", + "bdf35bb0 406f560e bf99af4d be4e2196 -> bf99af4d be4e2196", + "4178cb1a 4178cdee c0a82525 c0a09df7 -> c0a82525 c0a09df7", + "410bcb68 41140df4 be2ef368 3b60da20 -> be2ef368 3b60da20", + "40401290 40401480 41835563 41876335 -> 40401290 40401480", + "c0ef5026 c0a7adc6 bf4d5638 408165e7 -> c0ef5026 c0a7adc6", + "c186cbe1 c1862c0b 410f24b1 410fe9ef -> c186cbe1 c1862c0b", + "c1514fff c150a865 c198ce8c c198cb3a -> c198ce8c c198cb3a", + "c188620a c1879c3a 4188ee8d 4188f0df -> c188620a c1879c3a", + "4110096b 41160581 415a4155 415b88b3 -> 4110096b 41160581", + "409d507f 409d51d1 c160d79d c13a4d4f -> c160d79d c13a4d4f", + "418e75dc 418e7fa8 c1818d77 c18153b9 -> c1818d77 c18153b9", + "c099763a c08daa1a 40b44afe 40b44f32 -> c099763a c08daa1a", + "4126b53e 4126b932 c0fc49af c0fbd70d -> c0fc49af c0fbd70d", + "c0a7096a c0a6f2b6 40f0c3d4 41658c3e -> c0a7096a c0a6f2b6", + "c16f67a4 c11987c8 40a1ca69 40a20207 -> c16f67a4 c11987c8", + "c1630edb c1630d09 407e2f0e 407e3632 -> c1630edb c1630d09", + "414959ea 41496516 417bce94 418df292 -> 414959ea 41496516", + "c151b0a6 c1519cfe c174785f c1746b79 -> c174785f c1746b79", + "40f16343 40f815fd 419b4a3c 419f7a40 -> 40f16343 40f815fd", + "bf2e9cf9 bf2e3bc7 c15f0050 c15eae76 -> c15f0050 c15eae76", + "415ffce5 41842ea2 bffc7d7c 3ef8e0f0 -> bffc7d7c 3ef8e0f0", + "c10425d0 c103a626 415a3b53 415a7d25 -> c10425d0 c103a626", + "4183ac88 4196b1f8 c093dc37 c08c195d -> c093dc37 c08c195d", + "c07ec9dd c034f103 410a5a23 411d7f0d -> c07ec9dd c034f103", + "40c0befa 414e8f73 40e07c5e 40e07ee2 -> 40c0befa 40e07ee2", + "41364b12 4143103a 41963e7b 41965991 -> 41364b12 4143103a", + "c186c784 c186c74e 41159e55 411b004f -> c186c784 c186c74e", + "c1021b24 c1021a90 c0708167 401db267 -> c1021b24 c1021a90", + "413c3e40 413c4108 bf1b881e bf1afde2 -> bf1b881e bf1afde2", + "40b74cda 40c435d6 4155b909 4155c897 -> 40b74cda 40c435d6", + "c00b08bd c00979b3 41862543 41862b89 -> c00b08bd c00979b3", + "418f851e 418fa5fe 41626c1e 41850611 -> 41626c1e 41850611", + "418a90fd 418a928b c19de067 c19d931b -> c19de067 c19d931b", + "4016a730 4016aa40 40d39bf8 40d39e98 -> 4016a730 4016aa40", + "41836e47 41836ead 413f8b7c 413f9718 -> 413f8b7c 413f9718", + "4126e182 4126e376 c1803834 c1469e3d -> c1803834 c1469e3d", + "c08b39f5 c08ac7eb 4174fd1b 41750445 -> c08b39f5 c08ac7eb", + "c0dd0639 c0dc5677 c154e7bb c154e73d -> c154e7bb c154e73d", + "c16a89b2 c16a7002 40c1e8c0 40c20870 -> c16a89b2 c16a7002", + "41654e9f 4168fe41 bf86ee0e bf6656e3 -> bf86ee0e bf6656e3", + "c181ed4b c1643797 412e4c7a 412e4e1e -> c181ed4b c1643797", + "c1b49eda c179f50f c0881760 c0702851 -> c1b49eda c179f50f", + "3d1730cd 3d392733 c0bc318a c0b94e16 -> c0bc318a c0b94e16", + "4186c701 418731e3 400d0fbf 400d4a01 -> 400d0fbf 400d4a01", + "c0d5f9c3 c0d5f8dd 4181b140 418202c0 -> c0d5f9c3 c0d5f8dd", + "40105983 401a0eed 400252bd 4003b3f3 -> 400252bd 4003b3f3", + "c1c17656 c171adc1 c0975fd9 c09757b7 -> c1c17656 c171adc1", + "c0792ba7 c078d1c9 c12673c7 c1266d6b -> c12673c7 c1266d6b", + "4050c9c4 4050d44c c16bd061 c1384f83 -> c16bd061 c1384f83", + "c0aec45a c0aec346 4178ea1c 41791f74 -> c0aec45a c0aec346", + "c196c970 c196c860 40e8fc94 41485506 -> c196c970 c196c860", + "c178cc54 c17794c8 c182612a c181aa70 -> c182612a c181aa70", + "4142bb77 4142d051 4193aed4 41a27f74 -> 4142bb77 4142d051", + "40f567b2 415aad33 c186af49 c1867a57 -> c186af49 c1867a57", + "c0f5c432 c0f5a88e c178993c c17898a6 -> c178993c c17898a6", + "405df2d1 405e034f c0d07d00 c0d07838 -> c0d07d00 c0d07838", + "c163fa34 c163f8a6 c19f7a64 c19a6adc -> c19f7a64 c19a6adc", + "c0a723a9 c0a1352f 418eef84 418ef6b0 -> c0a723a9 c0a1352f", + "c1745488 c173ea38 beb7da58 beb1bea8 -> c1745488 c173ea38", + "4177e1df 41799f71 c0ba7290 c0b9fb3c -> c0ba7290 c0b9fb3c", + "41776669 4182f79b c0865a79 c08658cf -> c0865a79 c08658cf", + "c0af4594 c0aeff84 bf9a61da bf891fa6 -> c0af4594 c0aeff84", + "c186d27a c184960c 406f5e78 406f61a8 -> c186d27a c184960c", + "417855e4 418bccd6 414c1d2e 4162429a -> 414c1d2e 4162429a", + "4142fb1e 41447ad2 40e6b435 41865f3b -> 40e6b435 41447ad2", + "402a96f4 402ae31c c13441a7 c1343f55 -> c13441a7 c1343f55", + "c08ab12e c08307a6 41165b07 411665c9 -> c08ab12e c08307a6", + "bfc37b41 bfa8b4bf 4065fb96 407a641a -> bfc37b41 bfa8b4bf", + "418f5c68 41915858 c1727212 c16354b6 -> c1727212 c16354b6", + "414383f6 41438dc2 4134b6b7 413e8229 -> 4134b6b7 413e8229", + "40b89d94 40b8e164 40dfc4ad 40e8098b -> 40b89d94 40b8e164", + "c197e5bb c181a3e7 c084aebd c0849e53 -> c197e5bb c181a3e7", + "40b85d88 40bef840 408c1ca9 408c34ef -> 408c1ca9 408c34ef", + "41449510 4144ae60 4169b180 416ac190 -> 41449510 4144ae60", + "403b978b 403bb2d5 40d10d85 40d9cc93 -> 403b978b 403bb2d5", + "40c1d862 40c1df7e c158b911 c15886a3 -> c158b911 c15886a3", + "c18d182b c16ba0b1 c17bb2fb c17bacf3 -> c18d182b c17bacf3", + "4110206c 41102114 c198e926 c1988d94 -> c198e926 c1988d94", + "4142c1ba 4142c266 c0bd734b c0bd6c8d -> c0bd734b c0bd6c8d", + "40c627cc 40c7af6c c1832209 c182dcd5 -> c1832209 c182dcd5", + "c10d534b c10cf29d 409f6434 40bff2c4 -> c10d534b c10cf29d", + "c18e89ec c18e837c 417b1857 417c91e1 -> c18e89ec c18e837c", + "4147b634 4148d34c c1329661 c131904d -> c1329661 c131904d", + "408b865e 408b890a c17c5d17 c17c0e73 -> c17c5d17 c17c0e73", + "c131e6a2 c131de76 405eb5d0 405ec110 -> c131e6a2 c131de76", + "4134900c 413492b8 3fad43be 3fbae462 -> 3fad43be 3fbae462", + "40b37b5a 40b37d66 bf3b1616 bd873554 -> bf3b1616 bd873554", + "c19f0f78 c19cfbd0 4182e5a8 4182e5f8 -> c19f0f78 c19cfbd0", + "c15da6c3 c15da425 c06be6af c06bda21 -> c15da6c3 c15da425", + "4000e834 40014f9c c0be0b12 c09f7d66 -> c0be0b12 c09f7d66", + "419fa013 419fec01 c04b31f2 c04b27fe -> c04b31f2 c04b27fe", + "414c43b1 414c96d7 4185746d 4188084f -> 414c43b1 414c96d7", + "417f8f95 4197c20e 41938061 419393cf -> 417f8f95 419393cf", + "417e33dd 41a0305e 410f1e33 410f1fc5 -> 410f1e33 410f1fc5", + "418c9d2a 418c9d76 c18a73e0 c11ca994 -> c18a73e0 c11ca994", + "414608cd 41460a9b 405e0967 405e10b9 -> 405e0967 405e10b9", + "40cc1ba8 40cc2280 c06d43da c06c2706 -> c06d43da c06c2706", + "40b2abb0 41200958 4173a52c 418a2976 -> 40b2abb0 41200958", + "41768e49 41827e0b c1547b69 c154726b -> c1547b69 c154726b", + "411aee7d 411b0e77 41370ca2 41370fd6 -> 411aee7d 411b0e77", + "c161a928 c153a8b4 4151c310 4151c488 -> c161a928 c153a8b4", + "410da7ec 410e3f74 c183ae88 c183aba0 -> c183ae88 c183aba0", + "c0207ab9 c0204be7 c1285a0e c127b98a -> c1285a0e c127b98a", + "c140de9d c140bad3 4192b487 41a4af71 -> c140de9d c140bad3", + "4188a77c 4188ad4c be3f26ba bd174d16 -> be3f26ba bd174d16", + "c18ed305 c18ea389 c19dd2a0 c19dd266 -> c19dd2a0 c19dd266", + "419c842c 419c84d0 bd33b8c8 bd313338 -> bd33b8c8 bd313338", + "41233c29 41238997 c0a1ae84 c09fa41c -> c0a1ae84 c09fa41c", + "c16424ce c0c2866b 414ac775 414ac7fb -> c16424ce c0c2866b", + "c0fedac5 c0fe167b c06adfb4 c06ad6ec -> c0fedac5 c0fe167b", + "c1815573 c18153df c19c9f69 c19c8a0f -> c19c9f69 c19c8a0f", + "40f522e2 40f569e6 40d070b1 40d18d87 -> 40d070b1 40d18d87", + "4142d6e2 4142e37e c0cb810e c0caecaa -> c0cb810e c0caecaa", + "417405b6 4174080a c1724a29 c16e0485 -> c1724a29 c16e0485", + "412a2717 413e4e05 c1732375 c1710f1b -> c1732375 c1710f1b", + "c1ad4a67 c1894a3d c0a205a5 404468fa -> c1ad4a67 c1894a3d", + "41846243 41865079 c11161b5 c1115cc5 -> c11161b5 c1115cc5", + "bf0137b4 40c70476 40307005 4031975b -> bf0137b4 4031975b", + "4174a305 4174ba6b 3eb78ae8 4031df43 -> 3eb78ae8 4031df43", + "bfc75f7d bfba1863 c0ed0658 c0e9c4a4 -> c0ed0658 c0e9c4a4", + "c0e1f0e5 3ff5e054 c0bbf7a5 c0bb58a3 -> c0e1f0e5 c0bb58a3", + "c18bf58c c15612c2 40e5ec6c 40e5eedc -> c18bf58c c15612c2", + "4164fba6 4164fd82 c126fa83 c126923f -> c126fa83 c126923f", + "c0c8302c c0ad1c64 c16c1619 c16c135b -> c16c1619 c16c135b", + "41015811 410158a3 bf061786 bf060fba -> bf061786 bf060fba", + "c176b4b0 c1766e42 418583f3 41920ac5 -> c176b4b0 c1766e42", + "40f76711 4128d390 402ff1d1 4032cd0f -> 402ff1d1 4032cd0f", + "408effb6 408f0df2 c1315213 c1314ee1 -> c1315213 c1314ee1", + "3e0d181a 3e35f3e6 c1484fbb c1484f31 -> c1484fbb c1484f31", + "4045c228 4045c428 4120fb9f 419b02a4 -> 4045c228 4045c428", + "419f000c 419f01a4 c0b57de2 c0b4fc36 -> c0b57de2 c0b4fc36", + "4110b59e 4110b6be c180f624 c180f584 -> c180f624 c180f584", + "c1331b0c c132fcac c1505127 c15014c5 -> c1505127 c15014c5", + "c1759bdb c1758ec1 c09d5a13 40770d76 -> c1759bdb c1758ec1", + "c18ee9e2 c18e9d66 41129827 41129d8d -> c18ee9e2 c18e9d66", + "c0bb687c c0bb63e4 bf3ba39e bf1ef962 -> c0bb687c c0bb63e4", + "4182bfdf 4182c049 4192cacf 419e9f71 -> 4182bfdf 4182c049", + "407c1661 407c1bff 4058aa20 40699f50 -> 4058aa20 40699f50", + "c159673c c158efa4 c1ad781a c186dee6 -> c1ad781a c186dee6", + "c183bf3c c18380ba c1790f6d c176822b -> c183bf3c c18380ba", + "413b5fdd 413bbe33 c0f39faf c0f39309 -> c0f39faf c0f39309", + "c18c1582 c1850442 c18c1ddd c18c1bbf -> c18c1ddd c18c1bbf", + "c1955013 c1954e11 41967562 419675ce -> c1955013 c1954e11", + "c108c145 c10619cd 4097f6d0 40cf0d78 -> c108c145 c10619cd", + "40f0b432 4101343b 3f92b0a0 3fadc7e0 -> 3f92b0a0 3fadc7e0", + "c1791de3 c179156d bd879576 bd86d48a -> c1791de3 c179156d", + "4136dd2d 413750af c1124c95 c110358b -> c1124c95 c110358b", + "c10b79b9 c10a9325 417f837f 41803e80 -> c10b79b9 c10a9325", + "c07be4e5 c07be05b c0811a82 bfbeab38 -> c0811a82 c07be05b", + "41599898 41599f80 3fbb1206 3fbb1efa -> 3fbb1206 3fbb1efa", + "419ca7b2 41a29a72 41404975 4140727b -> 41404975 4140727b", + "c168ba59 c1680d57 c0856bdd c08431db -> c168ba59 c1680d57", + "4161ce44 4161d134 c1255529 c125409d -> c1255529 c125409d", + "4194ee03 4195117d 3f9588c7 3f9b4139 -> 3f9588c7 3f9b4139", + "4197b636 4197b82e bffce3b8 bff25648 -> bffce3b8 bff25648", + "3f23d051 3f27d26f 41865a43 41868fb5 -> 3f23d051 3f27d26f", + "c10127db c100f827 40ce51b9 40ce59e7 -> c10127db c100f827", + "c13caaea c132acf0 c19dc6fd c19da2bb -> c19dc6fd c19da2bb", + "c1386264 c1383366 40d4c34b 40d4eabd -> c1386264 c1383366", + "bfc050b3 bfc0468d 4198663f 41986a61 -> bfc050b3 bfc0468d", + "c18466a8 c17f1fd4 412d096c 412d0ae8 -> c18466a8 c17f1fd4", + "c0f64ea0 c0f44a40 3f3658b4 40d2fdaa -> c0f64ea0 c0f44a40", + "3f40b250 407cad8c 41819651 4182e837 -> 3f40b250 407cad8c", + "410d3ee4 416ab7f4 40830bf5 4085103b -> 40830bf5 4085103b", + "416294de 4162a4aa c1811621 c17b87a5 -> c1811621 c17b87a5", + "4168ea11 4168edff c0fb45ba c0fb4352 -> c0fb45ba c0fb4352", + "c15e6e18 c14fd120 c16e8567 c16d9515 -> c16e8567 c16d9515", + "41341c27 41341ff1 c193f37e c180c88a -> c193f37e c180c88a", + "c1330bf0 c1330842 bf3cf5c6 bddd83d4 -> c1330bf0 c1330842", + "40c62294 40e966b4 c153f6ce c14c16d2 -> c153f6ce c14c16d2", + "414b46db 4150c7cd 40b48fb8 40b4ad80 -> 40b48fb8 40b4ad80", + "4161481d 41616313 40c77fda 40c78ff6 -> 40c77fda 40c78ff6", + "41459ba6 41459d0a bf33e3af bf33c0d1 -> bf33e3af bf33c0d1", + "419ed8de 419edc9e c0b4f793 c0257122 -> c0b4f793 c0257122", + "c000fe63 bfe30d1a 418f2a36 418f784a -> c000fe63 bfe30d1a", + "c02e6abb c02e6835 c151ae07 c151927d -> c151ae07 c151927d", + "41554fe5 4155507b c047d1c3 c041315d -> c047d1c3 c041315d", + "c0111ee2 bf1f03ba 417a72fb 417a73ad -> c0111ee2 bf1f03ba", + "c164fba0 c164e0c2 41808d09 41808e47 -> c164fba0 c164e0c2", + "c014fbd0 40d7f8a8 c12d5e8f c11d5573 -> c12d5e8f c11d5573", + "c17a9310 c157095c 411ad9d4 411ea5b4 -> c17a9310 c157095c", + "40cc5622 4127a933 413bc17a 4194fca3 -> 40cc5622 4127a933", + "413b3dab 413cb32d c14443a8 c049ecc2 -> c14443a8 c049ecc2", + "416531ea 4168573e c1027b14 c0ea41f4 -> c1027b14 c0ea41f4", + "3fb243e2 3fb2921e bfbdf96a be5857b0 -> bfbdf96a be5857b0", + "418cf066 418cf0c6 4106f198 417272e8 -> 4106f198 417272e8", + "c1367cc5 c1363e33 c19fa8f1 c19e7d4f -> c19fa8f1 c19e7d4f", + "c0bee12f c0bed425 c0ca5939 c0c9b3cb -> c0ca5939 c0c9b3cb", + "c0266234 c026593c c09aa5a8 c0989158 -> c09aa5a8 c0989158", + "c104e88c c1046ad4 408cade5 40ff62ab -> c104e88c c1046ad4", + "c15f188c c15ecad8 4133a822 41584516 -> c15f188c c15ecad8", + "be0286b0 4040dc7b c149c47b c1495945 -> c149c47b c1495945", + "c18dd229 c18dd15f 409bd8d8 409bed58 -> c18dd229 c18dd15f", + "3f01417d 3f048103 41663deb 41663efd -> 3f01417d 3f048103", + "c18b533a c185028c bfccf8e9 bfccac17 -> c18b533a c185028c", + "41863d97 41864115 40947b1e 409659da -> 40947b1e 409659da", + "c12dbacf c1127ff1 4005ef57 401d6a09 -> c12dbacf c1127ff1", + "c111cfe5 c1096a4f beacabd6 beac97aa -> c111cfe5 c1096a4f", + "40999eab 409bd4e5 40d84a75 40d923fb -> 40999eab 409bd4e5", + "c1451319 c1033049 c034e3f4 c034a5ec -> c1451319 c1033049", + "c11f34d9 c11e930f 40431e36 4043364a -> c11f34d9 c11e930f", + "4097c62d 4097c7db 418f719f 418f71dd -> 4097c62d 4097c7db", + "c107c1cd c107b557 befd905e beeab422 -> c107c1cd c107b557", + "c1940f45 c193fedf 418fcda4 41aaab7c -> c1940f45 c193fedf", + "4158de89 4158e657 4097c31f 40a0c501 -> 4097c31f 40a0c501", + "c0c9f535 c0c9392f c13cedbe c13cdeba -> c13cedbe c13cdeba", + "409fc830 40a27450 406ce640 411007f8 -> 406ce640 40a27450", + "4120d11d 4120efcf 41597d64 41597fbc -> 4120d11d 4120efcf", + "c0bfeaaf c0bfe65d c198e9cf c198d547 -> c198e9cf c198d547", + "40d9b5be 40d9f952 418b1f0b 418b20d1 -> 40d9b5be 40d9f952", + "417e41ce 417f1542 c0e23ea6 3f88ceb8 -> c0e23ea6 3f88ceb8", + "c15a896c c0bbc598 c19fffa5 c19ffc65 -> c19fffa5 c19ffc65", + "402ed1b0 40592510 3fc09254 4122bbc6 -> 3fc09254 40592510", + "c10370ef c0f6efd3 41943de6 419a90a2 -> c10370ef c0f6efd3", + "c0ed81dc c0ed70dc 4089b258 4089b390 -> c0ed81dc c0ed70dc", + "c076878a c07685d6 c135149b c0f4a6aa -> c135149b c0f4a6aa", + "bfdd9858 bfdcfa88 c16eeb06 c14034d6 -> c16eeb06 c14034d6", + "c0b6a56e c0b3c182 c129baa5 c1296cf5 -> c129baa5 c1296cf5", + "c0e51657 c0e49c1d 4132dd72 4142da7e -> c0e51657 c0e49c1d", + "c190e83e c190e594 c18e7c2b c18d1a13 -> c190e83e c190e594", + "4057797e 40584482 c11963dd bf72d8f0 -> c11963dd bf72d8f0", + "4103f3b2 4121282e 415f89bc 4161585c -> 4103f3b2 4121282e", + "c1526f22 c1526870 c1849bf1 c18485cd -> c1849bf1 c18485cd", + "4116fe9e 4149e7b6 411dc4d4 414d4594 -> 4116fe9e 4149e7b6", + "c10d57b5 c10cc2ff bf768c0c 403f5893 -> c10d57b5 c10cc2ff", + "4149ae5c 4149afc4 4130b0e6 419bf701 -> 4130b0e6 4149afc4", + "3f94ace7 3f94ca39 40b2b0a0 40f72e10 -> 3f94ace7 3f94ca39", + "418f34e5 418f3667 4114b9d9 4114bb07 -> 4114b9d9 4114bb07", + "c16e4faa c1095606 c0c6dead 400d3daa -> c16e4faa c1095606", + "40ace256 40acf5ea c14b1635 c14966c3 -> c14b1635 c14966c3", + "bf1856c3 bf0980fd 410dfa21 410dfbaf -> bf1856c3 bf0980fd", + "bef34ee0 3f68d070 40e61150 40e67940 -> bef34ee0 3f68d070", + "409050fd 40f2942b 3f4a1f8f 3f5642f1 -> 3f4a1f8f 3f5642f1", + "40fca91d 40fcad1b 41548f05 4154f2d3 -> 40fca91d 40fcad1b", + "3fbc564c 3fbd6374 bfd8fd7f bfd2ac81 -> bfd8fd7f bfd2ac81", + "c18601d8 c10604a4 3fd1381c 41368b54 -> c18601d8 c10604a4", + "c088199e 40a2810e c1496d98 c1364302 -> c1496d98 c1364302", + "c01dd802 bfbdcf9d c119f819 c119f7ab -> c119f819 c119f7ab", + "c10e3a6c c09bda09 c02a3784 c02a15dc -> c10e3a6c c09bda09", + "c09ddd5a c0883ade bf75f758 bf2447a8 -> c09ddd5a c0883ade", + "3ed5641d 3ed641e3 c1366c93 c1366bd9 -> c1366c93 c1366bd9", + "40c3a781 40c3af6f c0873ddc c0873c0c -> c0873ddc c0873c0c" + ] + }, + { + "glsl": "vec2 cultmath_iv_max(vec2, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c194544c c1340640 c004b050 c0049270 -> c004b050 c0049270", + "4149d0a7 414c8301 c05168e1 c04f5b3f -> 4149d0a7 414c8301", + "4175fe64 417ca674 40865c72 408783f6 -> 4175fe64 417ca674", + "40825c59 40c56247 418f15b4 419dbd98 -> 418f15b4 419dbd98", + "40b00ee8 40b147d0 c14183cf c1354c03 -> 40b00ee8 40b147d0", + "4101fb03 41031cad c18557e6 c17f3e49 -> 4101fb03 41031cad", + "417cfb14 4183646a c1ab12c8 c182df1c -> 417cfb14 4183646a", + "412ba26b 412d7df1 c0c643b8 c0c62598 -> 412ba26b 412d7df1", + "407f12f2 407f1a5e 40f05d89 40f126d7 -> 40f05d89 40f126d7", + "c0bf8be8 c0bf8b04 c14ab8d9 c14693f3 -> c0bf8be8 c0bf8b04", + "c00d0eb4 40186de4 c0a5db6b c09f605d -> c00d0eb4 40186de4", + "c1887502 c1218b38 c1896620 c188096c -> c1887502 c1218b38", + "c10fa43c c10f89ac c06124a1 c0611cbf -> c06124a1 c0611cbf", + "419c5157 419d4ca1 c0adbd61 c0abc617 -> 419c5157 419d4ca1", + "41717175 417556e3 c0c0f88d c0c0f6eb -> 41717175 417556e3", + "4095886f 40965261 4114382a 4114420e -> 4114382a 4114420e", + "c09b5837 c09b4081 4183a701 4183e56b -> 4183a701 4183e56b", + "c14f8322 c14f0d14 3c9259c4 3e243fc8 -> 3c9259c4 3e243fc8", + "c0da5fb0 c0d90828 c1163034 c10aa340 -> c0da5fb0 c0d90828", + "c14210d9 c141d65b 40040015 40d862f6 -> 40040015 40d862f6", + "40ec485e 40ec8af2 40d2805e 40d2d96a -> 40ec485e 40ec8af2", + "c13f6e6a c13f69e4 c13228e5 c0412dc4 -> c13228e5 c0412dc4", + "412a5cab 412a5e81 4072ef47 4080e32c -> 412a5cab 412a5e81", + "40ca3a0e 40ca3d92 c18b07c0 c18b077c -> 40ca3a0e 40ca3d92", + "c13f94b3 c13f9375 c11cadc9 c0f321f6 -> c11cadc9 c0f321f6", + "c18e25e3 c18d8a99 bfce1e12 bf480c9c -> bfce1e12 bf480c9c", + "41600c7e 416cf232 41440482 41445b96 -> 41600c7e 416cf232", + "c0c9e935 c0c6f27f c0b28ad4 c0b1fa3c -> c0b28ad4 c0b1fa3c", + "c18a9bc3 c18a8377 c09fa6ae c09f9a66 -> c09fa6ae c09f9a66", + "4148c8f9 4148da1f c187c747 c187c5d3 -> 4148c8f9 4148da1f", + "41844d64 41a80110 41139503 411395b5 -> 41844d64 41a80110", + "41711020 4183b9a8 419749cd 41974bef -> 419749cd 41974bef", + "bfd21e7e bfd1e3e2 4035d8f4 4035de2c -> 4035d8f4 4035de2c", + "c1652cea c15cf74a 4171b5c9 4171b737 -> 4171b5c9 4171b737", + "41734d2a 418df433 3ff055df 3ff1f0a1 -> 41734d2a 418df433", + "c09c4c2e c03c6b63 40b1377d 40b13d7b -> 40b1377d 40b13d7b", + "412c9616 412c985a 4087b934 4087c6ac -> 412c9616 412c985a", + "41156b87 412c1f19 c14cce9a c1264cac -> 41156b87 412c1f19", + "c19964ac c19963ec 417f61be 417f6382 -> 417f61be 417f6382", + "415ced0a 415d2346 41794e9d 41794f33 -> 41794e9d 41794f33", + "41449a26 414642ba c19de98c c19de8f4 -> 41449a26 414642ba", + "c198df54 c198db3c c0fec1be c0fe9f36 -> c0fec1be c0fe9f36", + "3fbe19bf 3fbe6041 c1160d7e c0985745 -> 3fbe19bf 3fbe6041", + "412fee65 4132fb8b 412b69fa 412b6b76 -> 412fee65 4132fb8b", + "c105f509 c104f93b c1139d6d c10b0d25 -> c105f509 c104f93b", + "c134c281 c12da4bf bffd87d7 bfebbd69 -> bffd87d7 bfebbd69", + "c19440d6 c191df2a c1866ad1 c1866a81 -> c1866ad1 c1866a81", + "4156f9e6 41601032 c117a8ed c11738c5 -> 4156f9e6 41601032", + "419d1478 419d6270 407ce03a 409e14cb -> 419d1478 419d6270", + "41603d92 41611866 c15fec77 c15f5be7 -> 41603d92 41611866", + "415e5412 415e5e7e 4103a1e2 41040e6e -> 415e5412 415e5e7e", + "3e914460 3e928320 c1805803 c1804a65 -> 3e914460 3e928320", + "c0d47ed4 c0b8d27c 41569aea 4156a626 -> 41569aea 4156a626", + "c1611000 c1610dda 4145061e 41450722 -> 4145061e 41450722", + "c15f7c80 c15f5cba c18f3918 c18f3034 -> c15f7c80 c15f5cba", + "c14cb260 c14ca9b0 bf9307e2 be96dbf6 -> bf9307e2 be96dbf6", + "c1a50526 c198f198 418d4856 418d4c7a -> 418d4856 418d4c7a", + "c1ad8dee c16b6020 c11d7fbe c114ea46 -> c11d7fbe c114ea46", + "c081b0d0 c057dc20 4155dcd9 4193f8f4 -> 4155dcd9 4193f8f4", + "c1b3fa84 c179cf61 c1777f27 c16d0481 -> c1777f27 c16d0481", + "406906e0 40809780 40f456ed 40f4587b -> 40f456ed 40f4587b", + "414d6950 41a337e8 c0e98a78 c0b23de0 -> 414d6950 41a337e8", + "4104ecde 4105a8b2 40bd3b1d 40bdf933 -> 4104ecde 4105a8b2", + "bf6dd812 3ebfa524 c0dbbc0c c0d92184 -> bf6dd812 3ebfa524", + "411fb488 415f3108 bf5ae0dc bf20aaa4 -> 411fb488 415f3108", + "c0eb19ac c0b99f08 c0e6fab7 c0e6bc95 -> c0e6fab7 c0b99f08", + "3f8908a9 3f8911d7 41736b2a 41738c66 -> 41736b2a 41738c66", + "c133eaf5 c111c74b c18e5381 c18e51d1 -> c133eaf5 c111c74b", + "c11be3b2 c11bd840 41142f2d 4114858f -> 41142f2d 4114858f", + "403e22a7 403f0089 416d4db0 416d4e40 -> 416d4db0 416d4e40", + "be0a84b1 be0a374f 40063761 40088ebf -> 40063761 40088ebf", + "c0f360b7 c0d7aaa1 c11ed82b c11d82d5 -> c0f360b7 c0d7aaa1", + "c0210118 c020c2a8 c1648df1 c1648c97 -> c0210118 c020c2a8", + "bf109561 bf0c065f c04d1699 c025ad17 -> bf109561 bf0c065f", + "c08586b9 c08567f7 3ef5407e 3fea1ba0 -> 3ef5407e 3fea1ba0", + "c199f806 c152115c 4050dd84 409c9866 -> 4050dd84 409c9866", + "bf6dd1f0 bf686c10 c1355964 c135551c -> bf6dd1f0 bf686c10", + "c18b3873 c174ce6e c19d9529 c19d862f -> c18b3873 c174ce6e", + "c1906b3f c1904519 c1502f2c c150288e -> c1502f2c c150288e", + "c1124a4d c100f327 c1904ac6 c18c50f8 -> c1124a4d c100f327", + "41576580 415771e8 417921a1 41a00897 -> 417921a1 41a00897", + "40c1fed4 413c5d52 40eb3ce1 4106d488 -> 40eb3ce1 413c5d52", + "412c373a 41915a33 c189e676 c189e266 -> 412c373a 41915a33", + "417e649c 417e654c 418a1485 418a7a5b -> 418a1485 418a7a5b", + "befe005c be0ed049 c19c3714 c18cfdba -> befe005c be0ed049", + "40355c67 40355f49 bea30649 be7b556e -> 40355c67 40355f49", + "c10031b6 c0e9b5e1 c18e67e4 c18e6798 -> c10031b6 c0e9b5e1", + "c10fc260 c10fbee4 bf9043d9 bf850567 -> bf9043d9 bf850567", + "c120f261 c112c14b 4198acb3 41a095f5 -> 4198acb3 41a095f5", + "c19ce277 c19b09f7 c173dbc1 c1732d9f -> c173dbc1 c1732d9f", + "412b27ec 412b560c c0ca0837 c0ca050d -> 412b27ec 412b560c", + "4138af18 41417cec bf7ce0f0 bf7cda10 -> 4138af18 41417cec", + "3f4d2b17 3f73a7e9 411f228e 4120540a -> 411f228e 4120540a", + "412dabaf 412dafc1 c15b24fb c14d4713 -> 412dabaf 412dafc1", + "41421223 41422fd5 3ff6911c 40f79731 -> 41421223 41422fd5", + "417bf85c 417f5ba4 3f8f2c46 3fadc65a -> 417bf85c 417f5ba4", + "3cdd3822 3d55e7ef 419ff98b 419ffa41 -> 419ff98b 419ffa41", + "c18e51fd c18e510b 3ee2885a 3fd8bdaa -> 3ee2885a 3fd8bdaa", + "4067acbb 4069f175 c183bdcb c183bc7f -> 4067acbb 4069f175", + "410453db 410472cd 4130e281 4131e643 -> 4130e281 4131e643", + "c10356e3 c1035627 3ea752c3 3ef8713d -> 3ea752c3 3ef8713d", + "c0831e9c bf7e3920 414b1d47 414b1e19 -> 414b1d47 414b1e19", + "409b1278 409b1ad8 419dfcb7 419f4361 -> 419dfcb7 419f4361", + "c18f6b83 c18f6a1d 40a591c7 40a59471 -> 40a591c7 40a59471", + "417112e3 4174833d 4094d166 4094f03a -> 417112e3 4174833d", + "411ec8d2 411ee4f6 418fa089 418fb28b -> 418fa089 418fb28b", + "c18f1b22 c156a088 419abd20 419ac148 -> 419abd20 419ac148", + "c178e65e c178e5ec c18639e7 c1861dbd -> c178e65e c178e5ec", + "4072e8ec 4072ec34 40af492e 40e55bda -> 40af492e 40e55bda", + "c17398e1 c145fd9f c127a5a4 c125ffa0 -> c127a5a4 c125ffa0", + "4080ab66 4110465d bfba28e6 3ec9b798 -> 4080ab66 4110465d", + "c17da38e c152810c 412b2baa 412b61d6 -> 412b2baa 412b61d6", + "412f8a00 419bc918 c10c0e25 c10c0d7f -> 412f8a00 419bc918", + "4125d050 41262404 41252b31 416a84ff -> 4125d050 416a84ff", + "c17ed370 c17ed1c8 3f9dd4c1 3fa22dff -> 3f9dd4c1 3fa22dff", + "41847fc7 4184fb0d 418f3f12 41902dae -> 418f3f12 41902dae", + "c172ff20 c171e3a8 c1b5a540 c15a41ad -> c172ff20 c15a41ad", + "bd92015c 3f422a2c 41585a3a 41b2294b -> 41585a3a 41b2294b", + "c03a9376 c03a918a 40b1159a 40d45b66 -> 40b1159a 40d45b66", + "41739d92 41739ece c11f178f c11f123f -> 41739d92 41739ece", + "c1587cc0 c1577c64 c09871c7 c0986e51 -> c09871c7 c0986e51", + "41111a3b 41111ae1 40d77698 40d77a60 -> 41111a3b 41111ae1", + "c124d230 c11d9e3c 411bfbd7 411bfc71 -> 411bfbd7 411bfc71", + "c0baf3f0 c0ac2340 40f05af8 40f05dc8 -> 40f05af8 40f05dc8", + "4193ae46 41a6522e 41140778 41152750 -> 4193ae46 41a6522e", + "4153d348 415ffbc0 418505a2 41850642 -> 418505a2 41850642", + "c193b0ea c193aaf4 40887048 40998c90 -> 40887048 40998c90", + "41465da5 41465e13 c1910bb9 c1910b81 -> 41465da5 41465e13", + "416cb404 416cc254 c0c826a3 c0c7f58d -> 416cb404 416cc254", + "c15a895a c145775a 41776387 41776491 -> 41776387 41776491", + "41627875 418e9135 41158e91 4121f6d7 -> 41627875 418e9135", + "c1a1fe58 c1845dc4 409ff404 40a965e4 -> 409ff404 40a965e4", + "c0dfa72f c0ddf401 414b6907 414b6979 -> 414b6907 414b6979", + "c0b2f25f c0aab6e5 c0970bb3 c096c5ad -> c0970bb3 c096c5ad", + "40b7c3dd 40b7d973 c184518d c1843347 -> 40b7c3dd 40b7d973", + "c09f1ae9 bf5d56b8 c0e2c176 c0e2b3d2 -> c09f1ae9 bf5d56b8", + "40e3a8fc 40f33d0c c1572d11 c1572c55 -> 40e3a8fc 40f33d0c", + "c08da2b8 c08d7d28 418a42ad 418a4413 -> 418a42ad 418a4413", + "419b17f7 419c89b1 4093a26b 410f5bf2 -> 419b17f7 419c89b1", + "c19583b9 c19582b9 c18ddb58 c18dda7c -> c18ddb58 c18dda7c", + "4092ec80 41089fd0 c04daafb c04d8865 -> 4092ec80 41089fd0", + "c148fb2a c148fa84 40b6d1b9 40b6d8d7 -> 40b6d1b9 40b6d8d7", + "41600dcb 41a0fa77 40e1b643 411e657a -> 41600dcb 41a0fa77", + "4117acbd 4117f7cb 40144b2a 411fd1c2 -> 4117acbd 411fd1c2", + "40655a75 40675b1b c181f194 c181eae8 -> 40655a75 40675b1b", + "411f5665 412092df c1476dde c04ab59a -> 411f5665 412092df", + "408dbc6b 40937ff5 c19af8d4 c198105a -> 408dbc6b 40937ff5", + "c19c1aeb c19bf493 c0bbef42 c0bada46 -> c0bbef42 c0bada46", + "c162093b c0f5ae9a 412c6730 412cf4d8 -> 412c6730 412cf4d8", + "3df7bce7 3df82319 c18e0099 c18cab2d -> 3df7bce7 3df82319", + "c1a00cb6 c146c434 c17071c9 c1703689 -> c17071c9 c146c434", + "409a0be3 409a0d35 c035fd9b c032fc75 -> 409a0be3 409a0d35", + "419e0874 41a05bd4 c0d09008 c0cf1238 -> 419e0874 41a05bd4", + "c1945619 c18f9e8f c0a031fc c0a02fc4 -> c0a031fc c0a02fc4", + "40928da0 4092fc28 40c1b054 40c3334c -> 40c1b054 40c3334c", + "c1abd822 c187ce64 c14feb63 c14f8d73 -> c14feb63 c14f8d73", + "4084c3ef 4084ccb9 40c52157 40dd36a9 -> 40c52157 40dd36a9", + "40e9f7c9 40e9fc2f bf884c24 bf82723c -> 40e9f7c9 40e9fc2f", + "c0183c9f c0171ab1 c140d698 c134fba0 -> c0183c9f c0171ab1", + "c041ccfa bf391e1a c0a34f32 c0a0ff56 -> c041ccfa bf391e1a", + "c132619a c131f370 410952b8 410962f8 -> 410952b8 410962f8", + "c17f4968 c16b2a70 bfc4143b bfc11a05 -> bfc4143b bfc11a05", + "405684bf 40673681 417b96cd 417b97cb -> 417b96cd 417b97cb", + "c071cc64 c06f258c 40a01cc8 40a02230 -> 40a01cc8 40a02230", + "413ee543 4141d1fd 415209f3 41523a35 -> 415209f3 41523a35", + "c09f6653 c0996dad 415282e8 416f7068 -> 415282e8 416f7068", + "c13c8ad0 c12b783a c182a242 c181e296 -> c13c8ad0 c12b783a", + "3fe5e260 3ff2d100 40a290d6 40b3006a -> 40a290d6 40b3006a", + "c18f22f8 c18f2274 c0efcb46 c0ee4eee -> c0efcb46 c0ee4eee", + "c144e034 c1267e78 c0c68cbd c0abfc37 -> c0c68cbd c0abfc37", + "411c38e6 411c3c8e c18b8931 c0efebb1 -> 411c38e6 411c3c8e", + "c11e328a c11e0afe c18721fa c1508785 -> c11e328a c11e0afe", + "414faa39 414faae7 4193746c 419b8564 -> 4193746c 419b8564", + "c1aad322 c171c5a8 c14469ac c1435026 -> c14469ac c1435026", + "408aefdc 40cd2a2c c17f67ec c17f5930 -> 408aefdc 40cd2a2c", + "40ff9d2e 4122b5d9 414d29fb 41aacd6e -> 414d29fb 41aacd6e", + "c1900c9c c1900b72 c1983d30 c1983476 -> c1900c9c c1900b72", + "c13974bf c1397391 41742dee 41a47e0d -> 41742dee 41a47e0d", + "c101d61a c101d56a 40d9c3d6 40d9caf2 -> 40d9c3d6 40d9caf2", + "c0117606 bee7ebce 4053094a 4092a56b -> 4053094a 4092a56b", + "40e5ff38 40e60568 412c6425 412ce8db -> 412c6425 412ce8db", + "408bdfae 40ba81a2 40fd5760 40fd59c8 -> 40fd5760 40fd59c8", + "4172de4e 417b712a 417f46e2 417f5eb6 -> 417f46e2 417f5eb6", + "412305df 4123068d c197704d c1842b23 -> 412305df 4123068d", + "c117bc26 c117b7f4 418fe411 418fe4bb -> 418fe411 418fe4bb", + "c0b30753 c0930569 4100d3d2 41083412 -> 4100d3d2 41083412", + "c181320a c18131c2 c09adc1a 40a408e2 -> c09adc1a 40a408e2", + "c10715fb c107158b c182c905 c178810a -> c10715fb c107158b", + "c116a085 c1169653 40a7692d 40a93cdb -> 40a7692d 40a93cdb", + "c180b2e2 c180978e c0b4eb1b c0b4e121 -> c0b4eb1b c0b4e121", + "c0841d6c 3ebf0248 c01aef24 c019972c -> c01aef24 3ebf0248", + "c1455d5a c143db5a c1465405 c1464c79 -> c1455d5a c143db5a", + "41985220 419fc49c 4187ec35 4187f07b -> 41985220 419fc49c", + "4180a0f1 4180df2f c0523a60 bf4846c0 -> 4180a0f1 4180df2f", + "bfa0c722 bfa0c21e c0743233 c06ddf6d -> bfa0c722 bfa0c21e", + "c0dfadbe c0d5c38a 412eee5f 41571671 -> 412eee5f 41571671", + "40b8b45b 40b8b77d c183d9f1 c183a911 -> 40b8b45b 40b8b77d", + "c060edcf c05ec581 4125c9ac 413e8888 -> 4125c9ac 413e8888", + "41581bf5 415f7763 40be54c9 40bed997 -> 41581bf5 415f7763", + "c0b2de79 c0b2d117 3fca7519 3fce9267 -> 3fca7519 3fce9267", + "4158906a 415897be c19c429f c19c0561 -> 4158906a 415897be", + "c18c1a0c c17f8458 416db280 4178c878 -> 416db280 4178c878", + "414e9d75 4157cdd3 c185887e c1858814 -> 414e9d75 4157cdd3", + "c19c5eb5 c19756ab 417393e1 417d16e7 -> 417393e1 417d16e7", + "c16fe1a6 c16edfc2 414cdefa 414cdff6 -> 414cdefa 414cdff6", + "3d9c32a4 3ee68fd7 4159b8de 415a2242 -> 4159b8de 415a2242", + "c19b1251 c19b11c3 c04bc0aa c04bb516 -> c04bc0aa c04bb516", + "415e7e6f 415e7ee1 3f466f71 3f46c7cf -> 415e7e6f 415e7ee1", + "bfe3e788 3fc60608 4126bfe6 4126c0ea -> 4126bfe6 4126c0ea", + "40ee3ca3 40ee598d 413660dc 4147a620 -> 413660dc 4147a620", + "c128b075 c128a021 40b710bd 40bd810b -> 40b710bd 40bd810b", + "c051e4bf c0392921 414bf25f 414bf371 -> 414bf25f 414bf371", + "4144d961 41741b4f c0fb9e58 c0db7260 -> 4144d961 41741b4f", + "c0470249 c045ad37 419e58bb 419e5995 -> 419e58bb 419e5995", + "c067d3e0 c064f840 c0b0368d 4078b75a -> c067d3e0 4078b75a", + "c05f399c c0487484 41815a37 418bc179 -> 41815a37 418bc179", + "c13a9e2a c11bddee 4023821e 40238842 -> 4023821e 40238842", + "419b46d8 41a43130 c18edc48 c1853222 -> 419b46d8 41a43130", + "41274433 412744ad 415974ff 41597881 -> 415974ff 41597881", + "c189e832 c189e692 c18d0dc7 c18d0773 -> c189e832 c189e692", + "c1145d9e c11449da c11eaaff c081d1d2 -> c1145d9e c081d1d2", + "40ee7470 40fb09d0 4142338b 41423425 -> 4142338b 41423425", + "41827512 4183adaa 40d7cfd3 40d7d4c5 -> 41827512 4183adaa", + "414ab5e3 415b71f5 c08e44c2 c08ce65a -> 414ab5e3 415b71f5", + "c0953a8b c057531a c039baa1 c03565bf -> c039baa1 c03565bf", + "c16060ad c15b1615 c184f38f c184f341 -> c16060ad c15b1615", + "4150026e 41508352 c1938780 c19370c6 -> 4150026e 41508352", + "408cf72e 40b035e2 c18e7adc c18e77f6 -> 408cf72e 40b035e2", + "bf95ebc8 bf95d138 4110d7d5 4110d8df -> 4110d7d5 4110d8df", + "c1004fed bf980fd8 c16c10f3 c16b79a3 -> c1004fed bf980fd8", + "c18f1f27 c18ec32b c13cba6d c13c9fd9 -> c13cba6d c13c9fd9", + "c1818bc4 c148af40 41833498 41b43998 -> 41833498 41b43998", + "409ec670 409ee4b8 41378954 41379050 -> 41378954 41379050", + "4120b7d5 41212f8b c1641677 c16306c1 -> 4120b7d5 41212f8b", + "c11e9eeb c11e9357 c16dfa8a c16df6d2 -> c11e9eeb c11e9357", + "40e60541 40e6520f c067b028 c067aae8 -> 40e60541 40e6520f", + "405153dc 405252c4 40ea9c94 40f02d04 -> 40ea9c94 40f02d04", + "c1873053 c1872927 c165aa4b c1656e93 -> c165aa4b c1656e93", + "40b8a16e 41184e39 3ee47f06 3f13a27d -> 40b8a16e 41184e39", + "be83179c 3e1b6737 415efb5a 418cda4f -> 415efb5a 418cda4f", + "3f04b07c 3f04c144 413657f6 4136668e -> 413657f6 4136668e", + "c19d7f98 c194aeb6 c096d234 4040bd88 -> c096d234 4040bd88", + "c1940fb9 c1940e67 415222b0 415223e8 -> 415222b0 415223e8", + "4130b540 41806f88 4153fb0b 4157221d -> 4153fb0b 41806f88", + "c17293e6 c172928a 4130e762 41361b0a -> 4130e762 41361b0a", + "c12ec17b c12ead4b 41731754 417326c4 -> 41731754 417326c4", + "c151d381 c151bb5f 3fb9173a 403e3113 -> 3fb9173a 403e3113", + "41998e11 4199e0e7 c18b2b89 c18acff3 -> 41998e11 4199e0e7", + "c08531ee c085282a 40e32384 40e6459c -> 40e32384 40e6459c", + "408c13cc 408c165c c18979b9 c18393c3 -> 408c13cc 408c165c", + "4191b4fb 41947a2d 40225e5a 40ca4be3 -> 4191b4fb 41947a2d", + "bf4789bc bf477e84 405e71c0 40817460 -> 405e71c0 40817460", + "c18d7b96 c17d36e0 3da194b5 3db4d94b -> 3da194b5 3db4d94b", + "418d5009 418d51e7 40edfb7b 40ee0195 -> 418d5009 418d51e7", + "c13f0a98 c13eaf30 c1695723 c165dbb9 -> c13f0a98 c13eaf30", + "c11f3dc0 c11ca530 419ef4b0 419f4280 -> 419ef4b0 419f4280" + ] + }, + { + "glsl": "vec2 cultmath_iv_sqr(vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c18130bc c1812a64 -> 43825780 4382644d", + "40fc3f58 4100388c -> 42788cc5 42807131", + "c118c87a c118c250 -> 42b64ea5 42b65d5c", + "c1902b76 c1902b32 -> 43a2613f 43a261d8", + "c198320b c19831d3 -> 43b4f669 43b4f6ee", + "411b0a6e 411babda -> 42bbcb43 42bd531b", + "40b9936b 4146d3d2 -> 42068666 431a6c58", + "41563721 415638df -> 43334037 43334321", + "411e0973 412ece99 -> 42c31f55 42eebafd", + "41239249 4123940b -> 42d10739 42d10bb7", + "c19abbe7 c198ec5d -> 43b6b311 43bb0d38", + "40627e8a 40628fb6 -> 414863aa 4148820e", + "3f93e153 3f9821cd -> 3faad917 3fb4d050", + "c084a0f0 c0849cd8 -> 4189643e 41896cb9", + "41937bb0 41939338 -> 43a9ee90 43aa24ce", + "3f4f83d0 3f5081b0 -> 3f28366e 3f29d300", + "4106d46e 4106d5a6 -> 428e0627 428e08b8", + "414c5694 414c59ec -> 43231a19 43231f70", + "c11a4682 c0215717 -> 40cb5d51 42b9f1d0", + "bfa02e48 3ee0b822 -> 00000000 3fc873c5", + "41429e3a 4143056e -> 4313f432 43149146", + "c0f16a42 c0352e3c -> 41003a69 4263a93c", + "c0023b6f c0023041 -> 40846a16 408480d5", + "c008cf9e c008b662 -> 40920494 40923a81", + "40acce8f 40accf81 -> 41e94c6e 41e94efb", + "41825525 41827933 -> 4384b52c 4384fea2", + "41654494 4184b18e -> 434d53c3 43898f2b", + "be0fdd46 be0226ba -> 3c8456b6 3ca1b1e7", + "410600ea 41067aae -> 428c49ea 428d4952", + "c1844b0f c17ed4d9 -> 437dab10 4388bafb", + "413cbc39 4175587f -> 430b24fe 436b2282", + "c18d01d2 c18c15ca -> 43994fae 439b5603", + "bf0a902d bf072513 -> 3e8eb03f 3e95ff83", + "41443bc9 414692e7 -> 43166b9a 431a0792", + "c164acea c161bfc6 -> 434712aa 434c4476", + "412a9174 4138c004 -> 42e34b01 43055496", + "c11344e5 c0b50226 -> 41fff814 42a97063", + "c0e4870a c0e2f116 -> 42492e8e 424c00d1", + "c1011382 c0fc34b4 -> 427877cd 42822955", + "41231bf6 4123368e -> 42cfd93d 42d01d09", + "c18d8a23 c18d88dd -> 439c8019 439c82ea", + "c024b8fe 403cd51e -> 00000000 410b49b5", + "3e3a5741 3e3a92bf -> 3d07a2e8 3d07f992", + "c062dee8 bffafd11 -> 4076133f 41490e54", + "407aeffe 407b88c2 -> 4175f99d 41772575", + "c001777e be33591c -> 3cfb4b78 4082f34a", + "416d250e 4174871a -> 435bada1 436991d1", + "c1a9d2e4 c1920966 -> 43a69d71 43e1503e", + "c061df18 c03a6af8 -> 4107bf9d 414749eb", + "c0050cbd c0050a93 -> 408a47fa 408a4c7a", + "c0c7fc46 c0a29592 -> 41ce8348 421c3a2d", + "c1a31e10 c14354cb -> 43150a49 43cfde98", + "c1299d8b c1299bf3 -> 42e0be8c 42e0c2c5", + "c1935692 c12ca9d0 -> 42e8e940 43a99912", + "bf8fef0a 40a08172 -> 00000000 41c94420", + "c1702d51 c1702c89 -> 43615389 43615500", + "4115c1f2 411d0c2e -> 42af36ad 42c0afe2", + "40fb1af0 41019538 -> 42764dd5 42832f73", + "c07317c4 c07311cc -> 4166cacb 4166d620", + "c17b1e52 c17aed62 -> 4375f480 43765478", + "41823ac2 41b9e3e6 -> 43847f75 4406fb2d", + "c1971c98 c1928eca -> 43a7ce5c 43b2657d", + "c16e4ddd c12b6731 -> 42e5860a 435dd4df", + "4183e7ff 41848d59 -> 4387ee82 43894424", + "418112a5 41812ebb -> 43822797 43826042", + "c173e7fa c173144e -> 4366cf8e 43686237", + "c13fe745 c138ae33 -> 43053ae0 430fdaea", + "c19eb0d0 c19ead68 -> 43c4b504 43c4bd76", + "c18aede0 c18a9a4e -> 43961572 4396caa5", + "41088e20 4108b138 -> 4291aea2 4291f98c", + "418b89d4 418bb048 -> 43981ded 439871cf", + "c106d63d c104494f -> 4288b75d 428e09f6", + "c113cfc1 c1139e2b -> 42aa3e0e 42aab080", + "c177469b c1774471 -> 436ed524 436ed953", + "c1954c3c c195437a -> 43ae0f3c 43ae23a9", + "bed5ca7d bed40883 -> 3e2f9e19 3e328a94", + "40c04277 40c043a9 -> 421063c4 4210658f", + "c19668aa c1965670 -> 43b092d1 43b0bda4", + "41324c7e 4132615e -> 42f85cec 42f89718", + "4141aae0 4141b988 -> 43128318 43129946", + "c13d6a4c c13c7a90 -> 430ac43e 430c2620", + "c188a9bc c188a8e8 -> 4391e7cc 4391e991", + "4157bae8 41590818 -> 4335cb7a 4337feb9", + "416015f6 4160166a -> 43442670 4344273b", + "411184c2 4111d212 -> 42a56f51 42a61f4a", + "40506fc6 40bb54d5 -> 4129b5d3 4209150b", + "c087e9f9 c075fdc6 -> 416c5fb9 41905135", + "bf5bc206 bf4f0afa -> 3f2772c1 3f3ca589", + "40e2a486 40e2f152 -> 4248a6e6 42492ef8", + "bf86d07a becb9d9a -> 3e21f353 3f8dfdd3", + "41413982 414c5fe6 -> 4311d7c3 432328fa", + "3ff06b2b 3ffa4655 -> 4061c91d 4074ad71", + "41877dab 4190b819 -> 438f6b90 43a39f41", + "417b2a5b 417b2d5d -> 43766c15 437671fc", + "40ff2f14 41017a12 -> 427e5ed3 4282f881", + "bfcba001 bf95b77f -> 3faf1e3b 4021f726", + "410c6482 410c8eca -> 4299fc2b 429a58f9", + "c14bb775 c14b95d9 -> 4321e6fe 43221c77", + "c0975277 c0974ca9 -> 41b2d70d 41b2e4c6", + "413f5bc6 4143b8aa -> 430f0a12 4315a2d8", + "402a2043 402a25bd -> 40e21dba 40e22c49", + "c0570865 c0520bdb -> 412c5774 41349f1a", + "41070851 4108c2c3 -> 428e738b 42921f07", + "4161f8d2 41944f17 -> 43477753 43abd716", + "4007d5fd 4009a863 -> 409026c7 40940b51", + "41080f4a 41083176 -> 4290a07f 4290e92e", + "4166252a 416625ce -> 434ee6cd 434ee7f4", + "bb7b22ec 3c3998bb -> 00000000 39068e19", + "c19e57c4 c19e1a2e -> 43c348a7 43c3e0e8", + "c14aa316 c14aa28a -> 432064e9 432065c7", + "40eed2a3 40f694a5 -> 425ecc54 426d8203", + "c0f5d865 c0f5d55f -> 426c121a 426c17e8", + "41918dc6 41a7d796 -> 43a583d2 43dc15f7", + "c191f485 c10aec54 -> 4296c749 43a66dd0", + "3fc9ca28 3fc9d418 -> 401f0f12 401f1ebd", + "c15b8567 c15af8df -> 433b4cce 433c3d84", + "404d5c98 4084cc5c -> 4124bd6d 4189c6c4", + "c144b63a c13f4e2a -> 430ef5bb 4317278b", + "c1175088 c01a45e6 -> 40b9f058 42b2e034", + "416989db 41699c65 -> 43550c3b 43552e0f", + "414e1dad 419b963d -> 4325f3c6 43bd1e8c", + "40995394 40995cc4 -> 41b7aa04 41b7c008", + "41807d85 41807e0b -> 4380fb85 4380fc92", + "4167c4ed 416bcbbb -> 4351d4fb 43592fab", + "417d6cc2 4182fddf -> 437ae026 43860da4", + "c0c83e4c c063ec18 -> 414aec8c 421ca166", + "4198b0d3 419ecf45 -> 43b624e9 43c50902", + "4193fdf1 41aa6b97 -> 43ab1b3d 43e2e624", + "413e01ce 413e0f4e -> 430d06ae 430d1ab9", + "40390ea7 408664dc -> 4105c62e 418d1b7c", + "c082cb56 bee62fa0 -> 3e4ef99c 4185a64a", + "c08da637 c08d082d -> 419b6404 419cc109", + "c0d53675 c0d52db7 -> 4231851b 423193aa", + "413b0ef1 413b0fcf -> 4308aed5 4308b019", + "4153af2a 4162ac86 -> 432f0a37 4348b511", + "c184f719 c184f6c9 -> 438a1eda 438a1f81", + "408a0fe0 40c47660 -> 4194ea3d 4216c57a", + "c1759f4a c16ec906 -> 435eba65 436baa47", + "c18db936 c18db894 -> 439ce9b0 439ceb17", + "c1544e59 c11c89d3 -> 42bf7087 433011db", + "c1988431 c1984ec9 -> 43b53b4e 43b5ba7d", + "c185d20f c17cc00d -> 43798aaa 438be7e0", + "410c310f 410c3a5d -> 42998b64 42999fc6", + "3e5fa364 3fb48d34 -> 3d435e11 3ffeadbe", + "413e3090 413e3ea8 -> 430d4c1f 430d6111", + "4182d356 4182d3b2 -> 4385b6a4 4385b760", + "c0986161 c098600f -> 41b5646c 41b56790", + "412f48e2 41a0932b -> 42f00973 43c97095", + "403d1f53 403d29fd -> 410bb744 410bc706", + "416e901f 417363f1 -> 435e504b 436766e3", + "c10f1cb1 c0fe1227 -> 427c2807 42a00222", + "41581f72 415820de -> 43367514 4336777b", + "40ce3769 40ce6117 -> 42261d39 42266066", + "c11c7f01 c11c7d13 -> 42bf5159 42bf5610", + "40c69197 40c6a439 -> 421a0588 421a2272", + "41524056 41574022 -> 432cad9d 4334fcc9", + "c183a4bd c181a12f -> 438347ae 43876407", + "410d4310 41724344 -> 429be5e2 4365433e", + "414b383c 414cbe94 -> 4321523c 4323c04a", + "41185109 411851df -> 42b540a9 42b542a6", + "4064a7be 4133f638 -> 414c3b38 42fd047e", + "c1151455 c1145233 -> 42abde4b 42ada159", + "4176b86c 4176b90c -> 436dc6f4 436dc829", + "40c4fe5e 40c7d092 -> 4217967d 421bf5ed", + "41949c53 41949d3d -> 43ac8a3f 43ac8c5e", + "c1764460 c146d574 -> 431a6ee1 436ce77b", + "c132943f c131f8a9 -> 42f77396 42f924fb", + "4098f225 4098fcdb -> 41b6c0e2 41b6da7c", + "3fce02b0 41208dfa -> 4025c853 42c9638e", + "c16b3452 c16b149c -> 4357ded8 43581919", + "c19afb05 c19ae99b -> 43bb7bc7 43bba5f0", + "c159df4e c15930e4 -> 433843ec 43396c55", + "bf80995b bf8074a5 -> 3f80e9b4 3f81336e", + "4190bcc7 41934a25 -> 43a3a9d6 43a97c78", + "c147f756 c1024916 -> 42849c9e 431c3277", + "c187a2b2 c112f9f0 -> 42a8c414 438fb9fe", + "c06672a2 c01af19e -> 40bb8f2c 414f722e", + "c19c9a12 c19c92a4 -> 43bf8618 43bf9845", + "3fa784b5 3fa7ef6b -> 3fdb3cd2 3fdc547b", + "c1327486 c13053f6 -> 42f2e71c 42f8cc7f", + "40eb079f 40f1e7a9 -> 4257c6fe 426495fe", + "c1538191 c152d3b3 -> 432da001 432ebed7", + "c18d7c00 c14c9397 -> 43237b8e 439c63a8", + "bf6ffa1e bf5c97e2 -> 3f3e1567 3f60f4f8", + "c18ce2c2 c18c46ce -> 4399bb0a 439b119a", + "c102818c c0d5e518 -> 4232b707 42850fa7", + "bfbcade5 bfbbde9b -> 4009def8 400b0fde", + "c1912c19 c19125ab -> 43a49763 43a4a5f8", + "4146ba0b 414eea2d -> 431a4450 43273db7", + "c18dace8 c18bc3bc -> 43989c48 439ccfd9", + "c19df92e c15d7944 -> 433f9a99 43c2f72a", + "c0c3c2f8 c0c3c1b8 -> 4215b0b1 4215b29a", + "4192071d 419208a3 -> 43a6983b 43a69bb4", + "bf9c0325 bf9a9f9b -> 3fbac8d4 3fbe27aa", + "3e558bc2 3e59143e -> 3d3221dd 3d381353", + "40f3ce4c 40f3f8cc -> 4268314b 42688245", + "412796c8 41282490 -> 42db6c23 42dce004", + "40f4fdd6 40f52b92 -> 426a74dc 426acc6d", + "c1370cfd c134ab63 -> 42ff02ec 4302e392", + "c0704b86 c06d337a -> 415bc85a 41618db2", + "4114a642 4114c6f6 -> 42aca151 42aced4e", + "40afe5c0 40b6b650 -> 41f1b7d5 420267bc", + "4090f4a3 40911d85 -> 41a42842 41a484e8", + "3f17ec5d 3f17fa23 -> 3eb45160 3eb47213", + "4128a083 412e63d9 -> 42de2621 42ed97c4", + "bf2644f8 3e80c970 -> 00000000 3ed7fb08", + "c1255d32 c1247e2c -> 42d363cd 42d5a289", + "3fc70ff4 4000ce86 -> 401ac9ce 40819e59", + "c0e738db c0e7350d -> 4250d0c8 4250d7a8", + "3df062a0 40ad74f6 -> 3c61b912 41eb0e94", + "bfa1fac0 bfa1f360 -> 3fcce80c 3fccfab6", + "c18bbeb1 c1871503 -> 438e8e56 43989145", + "413d4b3d 419842be -> 430bf82e 43b51ea6", + "c1a11bd5 c1627fb2 -> 434865b6 43cac80a", + "40d31e6e 40dce552 -> 422e1b2d 423e9af2", + "c185474a c185459e -> 438ac2d2 438ac64d", + "c0d3c4f7 c0d271e1 -> 422cff08 422f2e47", + "418c9562 418f1ab2 -> 439a6775 439ffdab", + "c0f1f71d c0e9cbdb -> 425584b7 4264b333", + "c04836dc c04074f4 -> 4110afa3 411c95c4", + "40cbcf78 40cc2668 -> 422242b0 4222cd3c", + "40a32179 40c0fa57 -> 41cfe749 42117877", + "412ed9c4 4161358c -> 42eed97f 43461f2b", + "c17f8f45 c17f8a65 -> 437f1500 437f1ebc", + "41765a05 41ad4eb5 -> 436d1121 43eaa6f2", + "c1966683 c19665fb -> 43b0b756 43b0b895", + "c18b2e69 c18b04ad -> 4396fc28 439756dd", + "c18ae566 c189438a -> 439332b7 4396b83f", + "c10f751a c0c7d174 -> 421bf74e 42a0c811", + "4131d1d3 413468c1 -> 42f707a4 42fe46f5", + "c114c666 c113c58c -> 42aa98ee 42acebff", + "c0857273 c0857099 -> 418b1c61 418b203d", + "40a38394 40a3a18c -> 41d0e1a4 41d12e3c", + "bffb1539 bfc8c1e7 -> 401d6f8c 407642a0", + "40546974 409fdf36 -> 41303ed4 41c7ae0f", + "c0571b14 c04d32ac -> 41247a31 4134be7e", + "40b05918 4134cb00 -> 41f2f540 42ff5c32", + "c109405e c1093f84 -> 42932a16 42932bea", + "c02fe663 c02fbecd -> 40f14cd5 40f1b995", + "4155b620 41af1b14 -> 43326893 43ef8c10", + "415e04d8 417c95c0 -> 43408c67 4379372a", + "419c11dc 419ee31c -> 43be4b8b 43c53a40", + "40d5c4fa 40d5c5ce -> 42328160 423282c2", + "c183d642 c1627e29 -> 434862ff 4387c9f6", + "bfe728d9 bfe6d547 -> 405023ed 4050babe", + "c08d4095 c08cd08f -> 419ae98d 419be069", + "417a850c 4183b95a -> 43752821 43878e71", + "c0c2128b c0c20ff5 -> 42131c30 4213201c", + "c19d43bf c19cb5d7 -> 43bfdc3e 43c13854", + "c155e91b c15567bd -> 4331e5cb 4332bdbb", + "c01058ed c00fd413 -> 40a19d3a 40a2c853", + "408e459e 408e48d2 -> 419e229c 419e29bb", + "3fd3deb1 3fd509af -> 402f58d9 4031491e", + "c0a37e08 c0a37b08 -> 41d0cbcf 41d0d378", + "c14f2db0 c14f2d40 -> 4327aa35 4327aaeb", + "c12c675a c12c66c0 -> 42e83476 42e83615" + ] + }, + { + "glsl": "vec2 cultmath_iv_sqrt(vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "418b2194 41929180 -> 40857317 4088f84b", + "412d5f3e 412d8e52 -> 4052ac5e 4052c8f6", + "4023bf3d 40350d33 -> 3fccbdec 3fd749e4", + "c07a34ab c0718115 -> 00000000 00000000", + "c14378f0 c1422990 -> 00000000 00000000", + "c1170d65 c116fc97 -> 00000000 00000000", + "c0c946b2 402c9fb4 -> 00000000 3fd237de", + "40e841d5 413a7e0a -> 402c6bb6 405a7fe0", + "40854637 40854d29 -> 40029c4b 40029fb2", + "c19710f5 c18681ff -> 00000000 00000000", + "c1796cdb c1792b6f -> 00000000 00000000", + "3fd7bffa 3fdb50e6 -> 3fa62e3b 3fa78c61", + "c135dc70 c110735a -> 00000000 00000000", + "c1549741 c1548d8b -> 00000000 00000000", + "40a4e746 40a4e822 -> 401148e0 40114941", + "40fbd1da 40fc62d6 -> 4033890a 4033bcb1", + "c18fcccc c18fc060 -> 00000000 00000000", + "bf44dc18 bf44c568 -> 00000000 00000000", + "c1afdd7d c18972d7 -> 00000000 00000000", + "3fa667a8 3fa6eeb8 -> 3f91f1d2 3f922d00", + "c1575453 c1568845 -> 00000000 00000000", + "c10d69fd c0da2e12 -> 00000000 00000000", + "c174a8a7 c1749d4d -> 00000000 00000000", + "40d00e75 40d1df3b -> 402330d7 4023e6b7", + "40c6edac 40c7750c -> 401f921f 401fc862", + "c0848d47 409abcaf -> 00000000 400cbc29", + "4190743c 41908250 -> 4087fa76 40880117", + "4187264f 41876b7d -> 408386b8 4083a85e", + "c11f4475 c11f39ed -> 00000000 00000000", + "c1577336 c152c062 -> 00000000 00000000", + "3f3dc9a8 3f3de698 -> 3f5c6bea 3f5c7cb7", + "419f4eff 419f50d9 -> 408ecc7e 408ecd53", + "416d6327 41802418 -> 4076849f 4080120b", + "c111fa40 c111f8fa -> 00000000 00000000", + "3ea819aa 3eef3956 -> 3f12afa9 3f2efcd5", + "4184f333 4186b275 -> 40827397 40834e4d", + "40bcc173 40cb2d5d -> 401b6fed 40214410", + "40fd9806 40ffe2aa -> 40342aa8 4034fa94", + "c16ac26a c166acc2 -> 00000000 00000000", + "c102e78f c0079fd5 -> 00000000 00000000", + "c13a3d7c c1384ad8 -> 00000000 00000000", + "4098c044 4098c72c -> 400bd435 400bd75f", + "beb14d62 bbcae7a0 -> 00000000 00000000", + "be540ab8 3d5c1ee0 -> 00000000 3e6d6226", + "c0ccc3ea 3f8d53ca -> 00000000 3f867fa9", + "4160c70a 4167cb66 -> 406fe19d 407398c8", + "411fcac1 4138daf7 -> 404a4112 405989d6", + "4142dd7d 4142de1b -> 405f59c1 405f5a1b", + "3fd51a1c 3fd52624 -> 3fa5285d 3fa52d06", + "41981d91 4198244b -> 408b89aa 408b8cc0", + "c19af23a c19a69c2 -> 00000000 00000000", + "c192efa7 c192ef5f -> 00000000 00000000", + "3e5e848c 3fe89b6e -> 3eeeac27 3fac8cf5", + "c0cff9bf c0cfef59 -> 00000000 00000000", + "40d77c4e 40d7ab52 -> 40261429 40262646", + "c0a85bac c0a61940 -> 00000000 00000000", + "4183737a 418375ca -> 4081b6cd 4081b7f1", + "c0124cc5 3f6e01d4 -> 00000000 3f76d6f5", + "be450b64 3f76ded9 -> 00000000 3f7b64d1", + "40fa8a1d 40fa9093 -> 4033140f 4033165e", + "c0ec7667 c0e9a791 -> 00000000 00000000", + "40d20e61 40d39187 -> 4023f91f 40248ff5", + "412dfa6e 412dfe12 -> 40530a93 40530cc8", + "4175af88 41844124 -> 407aca31 40821c1e", + "4187946d 41893f87 -> 4083bc42 40848b1f", + "c1969a28 c19699e4 -> 00000000 00000000", + "4103d739 4103d81f -> 4037b70e 4037b7ae", + "418c1762 418d724e -> 4085e8c6 40868e2e", + "40404bef 404626f1 -> 3fdddfaa 3fe139f7", + "40c97fd8 40cf82e8 -> 40209940 4022fa13", + "c0a7fdf5 c0a7e9ff -> 00000000 00000000", + "c19b4016 c19b3f90 -> 00000000 00000000", + "40873edb 40875525 -> 400392aa 40039d81", + "414ac583 414bc445 -> 4063d62b 4064651e", + "c0ecca74 c08402f8 -> 00000000 00000000", + "3f4cdfed 3f9ef18a -> 3f6503df 3f8ea295", + "c072832d c0355c93 -> 00000000 00000000", + "419bc4e0 419be124 -> 408d341b 408d40ea", + "417fc1e1 41802647 -> 407fe0ef 40801322", + "c11cb2cb c11c9f45 -> 00000000 00000000", + "418d592f 418dadfd -> 4086823b 4086aa8e", + "c1038f5f c1038ef1 -> 00000000 00000000", + "c0e36a3f c0e33e49 -> 00000000 00000000", + "415bb4c4 4175ea74 -> 406d28e8 407ae842", + "c11f1a83 c10687e1 -> 00000000 00000000", + "c10ec66d c0a1f3db -> 00000000 00000000", + "c15e289d c15e27f5 -> 00000000 00000000", + "4146c39a 4146c43e -> 406192ee 4061934b", + "403a5047 403f8e09 -> 3fda6510 3fdd7201", + "41893d0b 4189737d -> 408489ec 4084a434", + "c0a3af4d c0a38653 -> 00000000 00000000", + "bfd62284 bfd61e3c -> 00000000 00000000", + "c16780e4 c16773e2 -> 00000000 00000000", + "401e69f4 40c0b1b6 -> 3fc96150 401d0ced", + "c1863b4f c185f103 -> 00000000 00000000", + "411d44f6 411d45e2 -> 4048a6be 4048a755", + "c0d0a1c4 c0d07f90 -> 00000000 00000000", + "40f51440 41158398 -> 40311dbb 4043a439", + "419a880c 419a8848 -> 408ca437 408ca453", + "41262881 412630a7 -> 404e3e69 404e4378", + "c0d9fb20 3f2a22c4 -> 00000000 3f50b2a2", + "c107e4ba c1074424 -> 00000000 00000000", + "4043bb55 404ac2fb -> 3fdfd8bf 3fe3d4bf", + "40429147 40430de9 -> 3fdf2e0f 3fdf757f", + "41856280 41b1517c -> 4082aa26 4096a785", + "4162a432 4162b406 -> 4070dfb2 4070e81b", + "402db0ab 405b26b5 -> 3fd2ddd1 3fecdc30", + "4193e512 4194b79a -> 4089969a 4089f865", + "c18b21bb c18b1d15 -> 00000000 00000000", + "416a6850 416a68d8 -> 4074f748 4074f78f", + "40d4d513 41486c3e -> 40250d9a 40628363", + "4122a346 412c947e -> 404c0c17 4052310a", + "c182b7bb c182b3e1 -> 00000000 00000000", + "40210c3c 407a2864 -> 3fcb0c20 3ffd0fe1", + "c123661b c060d94b -> 00000000 00000000", + "c18e4fcb c18dc935 -> 00000000 00000000", + "414cf16d 4150807b -> 40650da7 40670894", + "c18c45ef c18c320d -> 00000000 00000000", + "c1a365bc c1770e99 -> 00000000 00000000", + "c00d1c6b c00a3f35 -> 00000000 00000000", + "410f898c 410f8f54 -> 403fb0f8 403fb4d4", + "4187d56b 4187d65d -> 4083dbd2 4083dc47", + "40c9b2a0 40ca2428 -> 4020ad7c 4020daae", + "be94768d be6314e6 -> 00000000 00000000", + "c0b257ed c0b25503 -> 00000000 00000000", + "41306251 41362d13 -> 40547ed6 4057f4c9", + "c167bd5d c15fef83 -> 00000000 00000000", + "3f4a7081 3f5020bf -> 3f63a664 3f66d383", + "c138217b c1376b9b -> 00000000 00000000", + "c03aa7ff c03a6481 -> 00000000 00000000", + "c19945e3 c194e8d5 -> 00000000 00000000", + "c190b354 c190b312 -> 00000000 00000000", + "417ac1e3 417acd85 -> 407d5d79 407d6359", + "bff8d4e1 3fbf6061 -> 00000000 3f9c8339", + "4104ea23 4105ff19 -> 40387635 40393601", + "4001d324 4001da1c -> 3fb64e19 3fb652fe", + "41506e24 415081c4 -> 4066fe6a 4067094a", + "c101bf5f c1012e75 -> 00000000 00000000", + "c1972cb3 c1960f37 -> 00000000 00000000", + "c180884d c17dc0cb -> 00000000 00000000", + "412734b3 4127352d -> 404ee499 404ee4e5", + "bfa38809 bfa35f97 -> 00000000 00000000", + "c149976f c14981d9 -> 00000000 00000000", + "c04e01e0 c04dfd80 -> 00000000 00000000", + "c1611fa1 c15fa845 -> 00000000 00000000", + "c14a2fd2 c1498896 -> 00000000 00000000", + "3efd3ae8 3efd7098 -> 3f340991 3f341ca6", + "c06f7542 407b5912 -> 00000000 3ffda9ce", + "c165f9ce c130dcd0 -> 00000000 00000000", + "c125b0ba c12594ae -> 00000000 00000000", + "418a860b 418b34fd -> 4085286b 40857c66", + "415dc07d 416ccc53 -> 406e42ea 40763642", + "401225f4 401e1e9c -> 3fc16d47 3fc93166", + "416e48cf 417fcef1 -> 4076fbc1 407fe777", + "c019c914 c019c73c -> 00000000 00000000", + "c01c2fea c016dd26 -> 00000000 00000000", + "c04c0458 c021c198 -> 00000000 00000000", + "401df6c1 401df8af -> 3fc91809 3fc91944", + "c1188124 c10206ac -> 00000000 00000000", + "415615b1 4156f577 -> 406a1b2d 406a9567", + "416d6bab 416d991d -> 4076890b 4076a0a2", + "41250d80 41250f10 -> 404d8e7b 404d8f74", + "c097c956 c097c832 -> 00000000 00000000", + "408bd9ee 40965b92 -> 4005cb64 400abaab", + "4155961e 4155a692 -> 4069d562 4069de63", + "c0dcb0e7 c0dcad71 -> 00000000 00000000", + "c097448e c0885512 -> 00000000 00000000", + "4112b415 4112b727 -> 4041cb3e 4041cd45", + "c15e77bc c15abdfe -> 00000000 00000000", + "40ca9d92 40cc0e66 -> 40210af5 40219d46", + "bfdc96bf bfcdf481 -> 00000000 00000000", + "40ba25e0 40ba29f0 -> 401a5c1a 401a5dc9", + "c15f4700 c15daa98 -> 00000000 00000000", + "c1843ee0 c17fa7f7 -> 00000000 00000000", + "401aad4c 401c70b4 -> 3fc6fd9e 3fc81f29", + "40fcedb6 40fd1d32 -> 4033ee1e 4033ff01", + "c18b168e c188bc30 -> 00000000 00000000", + "be395d2f be0e37d1 -> 00000000 00000000", + "414e1368 41564b58 -> 4065af7a 406a3881", + "c05f8ad8 c05ca758 -> 00000000 00000000", + "c192dfb6 c192de08 -> 00000000 00000000", + "4197b7cb 4197b899 -> 408b5af4 408b5b53", + "40e9ceaf 40e9ed71 -> 402cfec6 402d0a27", + "c144b8a7 c13ff569 -> 00000000 00000000", + "c194ecb4 c194db1e -> 00000000 00000000", + "4164e581 41669baf -> 407211b8 4072f8fc", + "c152cbc5 c152be21 -> 00000000 00000000", + "c1837b6b c183775b -> 00000000 00000000", + "4127b48f 4129b131 -> 404f33a5 40506cee", + "41912ec4 41979914 -> 40885225 408b4cd8", + "4182b73a 41939ce2 -> 408159ca 40897501", + "c164d871 c164c283 -> 00000000 00000000", + "3f968376 410abea5 -> 3f8acd11 403c76c3", + "c18f3c08 c18cdff8 -> 00000000 00000000", + "c127ceea c127ca9c -> 00000000 00000000", + "c0c49fdb c0c44085 -> 00000000 00000000", + "c1197e73 c1197ca9 -> 00000000 00000000", + "bed46d7b bed33485 -> 00000000 00000000", + "40af529e 40b0b12a -> 4015cde2 4016635b", + "c020eb88 bf799f60 -> 00000000 00000000", + "c0756fd9 c074ce17 -> 00000000 00000000", + "4108c32f 4108c639 -> 403b1cde 403b1ef2", + "40a52b1a 40a52d76 -> 401166be 401167c8", + "c150ddab c1463b21 -> 00000000 00000000", + "4085d0db 4085dd55 -> 4002e029 4002e642", + "41273f0c 412743a0 -> 404eeb00 404eedd5", + "41310608 413358f0 -> 4054e15d 405645e6", + "4075c698 4075d308 -> 3ffad5f6 3ffadc4f", + "c193ac6d c1929081 -> 00000000 00000000", + "bea8fcaa 3c806a98 -> 00000000 3e003541", + "c11a9978 c11a1452 -> 00000000 00000000", + "c01baacc bf81ab48 -> 00000000 00000000", + "c19331fd c1930f47 -> 00000000 00000000", + "c0c585b7 c0c58461 -> 00000000 00000000", + "414026b4 4152da0c -> 405dca2f 406854ee", + "409c19ed 409c2683 -> 400d5aa2 400d6055", + "c1580cc7 c1580b07 -> 00000000 00000000", + "c09ebfcc c09d37b4 -> 00000000 00000000", + "c18b6e89 c1278b5a -> 00000000 00000000", + "410a54a2 410b0e4e -> 403c2eb5 403cacd5", + "413b804a 413b8c0a -> 405b16f5 405b1dd3", + "c1836577 c1836541 -> 00000000 00000000", + "c012039f c011fbb1 -> 00000000 00000000", + "40aa48cb 40aeb065 -> 4013a2d3 40158884", + "3fa3474d 3fa3c073 -> 3f90912e 3f90c6c6", + "c1296198 c1296124 -> 00000000 00000000", + "c1988cd0 c1941f1a -> 00000000 00000000", + "3fc3c5f9 40985272 -> 3f9e4ce1 400ba1e9", + "4182fd98 4197dc6c -> 40817c96 408b6bc6", + "c16a634f c16a5fef -> 00000000 00000000", + "411d8450 411d8658 -> 4048cf24 4048d070", + "418c4a24 419380e4 -> 40860106 408967f8", + "4091f48c 40934a1c -> 4008aee1 40094e72", + "c191a1e0 c1902c84 -> 00000000 00000000", + "c11c4331 c11c425f -> 00000000 00000000", + "c1980d40 c1980cc8 -> 00000000 00000000", + "41522076 419e6715 -> 4067ee99 408e6468", + "41528a08 41a02a18 -> 406828d5 408f2e8f", + "c05f4ffc c05e1914 -> 00000000 00000000", + "c0c4a0c6 c0370905 -> 00000000 00000000", + "4143f85a 414a30ae -> 405ffba1 4063827e", + "3ed4a575 3ee5138b -> 3f24fb22 3f2b3c6b", + "40447dd7 404be949 -> 3fe047dd 3fe479dc", + "c13b8977 c13b5975 -> 00000000 00000000", + "3ff262ea 3ff56976 -> 3fb023f4 3fb13c83", + "4070aea6 4070d27a -> 3ff83915 3ff84b8e", + "4155d7ce 41569642 -> 4069f954 406a616e", + "4135030d 4137fbc3 -> 405743dc 40590659", + "c0ca7196 c0ca582a -> 00000000 00000000", + "c0cfe7a5 c0241266 -> 00000000 00000000", + "c1a4046a c14515f8 -> 00000000 00000000", + "c0a451f9 c0a3967b -> 00000000 00000000", + "c107379c c10734ea -> 00000000 00000000", + "c180cfcc c180cf5c -> 00000000 00000000", + "4154c7da 41569a86 -> 4069645e 406a63c2", + "beeb428b bedd6df5 -> 00000000 00000000" + ] + }, + { + "glsl": "vec2 cultmath_iv_clamp(vec2, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "be2ae9ac be297554 c17b22bf 3f346da0 -> be2ae9ac be297554", + "40a42325 40a4b22b c19d7006 3d2ed2b6 -> 3d2ed2b6 3d2ed2b6", + "c0ecb93a c0e80616 c1b31873 419c3981 -> c0ecb93a c0e80616", + "bfd52e3e bf874342 c19896ee 411745bb -> bfd52e3e bf874342", + "c14d0c1d c14d03d9 c115d628 40376a0a -> c115d628 c115d628", + "c18a0a2e c189dd20 c0952918 41a5b17d -> c0952918 c0952918", + "c0c517ae c0c51666 c19d7dd6 4125d972 -> c0c517ae c0c51666", + "3f1d6100 3f1d8280 c1280a61 41bb42d9 -> 3f1d6100 3f1d8280", + "419b7a07 419b7abd c0b64fc4 4171b13e -> 4171b13e 4171b13e", + "c15da06c c153e0e4 c1c2ef8f 41b2b201 -> c15da06c c153e0e4", + "c184a78f c1849651 c11f2d40 41368bbe -> c11f2d40 c11f2d40", + "41713f6b 4172afcd c1c6cf76 4154bd03 -> 4154bd03 4154bd03", + "4186e8dc 418a1180 c036c460 41652b83 -> 41652b83 41652b83", + "419b7728 419b8660 c16908fc 3f2f137d -> 3f2f137d 3f2f137d", + "c05654b9 c052fbe7 c0fe43e4 416bd5aa -> c05654b9 c052fbe7", + "c130e24e c12136d8 c14d779f 408c25df -> c130e24e c12136d8", + "c18ee31a c18ee1ae c0a3cbf4 410f4bef -> c0a3cbf4 c0a3cbf4", + "419a8b59 419bb62f c19ca0ee 4129123c -> 4129123c 4129123c", + "c12cd6d2 c125880e c1c22f69 4188c5f2 -> c12cd6d2 c125880e", + "416a7799 416a909f bf9ebe40 41970c10 -> 416a7799 416a909f", + "c1967ad2 c194743e c14cc307 419f37d3 -> c14cc307 c14cc307", + "c11c32ff c11c328d bf9ec620 4174a937 -> bf9ec620 bf9ec620", + "40eb2334 40fc13f4 c1a28a3b 41770d4e -> 40eb2334 40fc13f4", + "c1882079 c1880191 c108f424 40e5e5a3 -> c108f424 c108f424", + "417f0f90 417f4760 c16ed945 418df8ac -> 417f0f90 417f4760", + "413bc18b 413e86f1 c1352bf2 40eaf727 -> 40eaf727 40eaf727", + "3db1c0f7 3ddc1909 c1848b6c 40cb313b -> 3db1c0f7 3ddc1909", + "c0cda994 c0bec5dc c1a7d0ac 3fbf2fe7 -> c0cda994 c0bec5dc", + "3fc9be82 40bc6a60 c13154ec 415e10d2 -> 3fc9be82 40bc6a60", + "c0f79a4e c0ee8f0e c0013558 3f94d730 -> c0013558 c0013558", + "c13497d1 c134946d c104d4b0 40c0041a -> c104d4b0 c104d4b0", + "c00ea341 c0084b5f c1826c3e 419ffb92 -> c00ea341 c0084b5f", + "c18a4366 c1862ca6 c0abde8c 412fd2c0 -> c0abde8c c0abde8c", + "41915f28 4191626c bf80f430 411a1572 -> 411a1572 411a1572", + "c16a7cb3 c16a78dd c18d4481 419e91cd -> c16a7cb3 c16a78dd", + "40d45ba8 40de10d0 c192b2b0 41bf5abf -> 40d45ba8 40de10d0", + "405697a9 40569ec7 c1c32261 406c9334 -> 405697a9 40569ec7", + "41729925 41729a7b bf116b80 40a6c4dd -> 40a6c4dd 40a6c4dd", + "3e9aae31 3e9dc74f c14b30d5 4174c5d9 -> 3e9aae31 3e9dc74f", + "4199845b 41998b61 c072e720 41b4a3e9 -> 4199845b 41998b61", + "c176a81f c175e0f9 c1a410ae 41716039 -> c176a81f c175e0f9", + "418ddd66 419119a6 c1b2e97f 410d1b2f -> 410d1b2f 410d1b2f", + "419582d3 4195844d c1676270 40392092 -> 40392092 40392092", + "c0846295 c0845f13 c179460d 4150938d -> c0846295 c0845f13", + "418407f7 4186e851 c1098634 40fe5f9c -> 40fe5f9c 40fe5f9c", + "403fb52e 403fc592 bffd4810 41c25f77 -> 403fb52e 403fc592", + "41289eb6 4129d7f2 bfd9d330 416f2d26 -> 41289eb6 4129d7f2", + "411f011c 411f1790 c16dd464 41a550a0 -> 411f011c 411f1790", + "c0c500f1 c0c4b78b c100f18e 4053bbb4 -> c0c500f1 c0c4b78b", + "3f10bd6d 3f45a813 c1c65274 41ac7e2d -> 3f10bd6d 3f45a813", + "c199d5c5 c19802f5 c1a3dfd4 418d8541 -> c199d5c5 c19802f5", + "40c70f8b 410409c7 c0967e9c 41187e15 -> 40c70f8b 410409c7", + "4179e52f 41b5f6d0 c0f420ac 40d6e807 -> 40d6e807 40d6e807", + "40c062d4 40c1d1ac c18656e2 41b70939 -> 40c062d4 40c1d1ac", + "40951ecd 409527c3 c080c9b8 4114ac1c -> 40951ecd 409527c3", + "4138f6aa 413983de c11e4c88 4177c8d3 -> 4138f6aa 413983de", + "412981f9 412b047f c0b86610 3e1ca474 -> 3e1ca474 3e1ca474", + "c0033ce4 c003218c c1c70e36 40cb378e -> c0033ce4 c003218c", + "40f4a639 410935a4 c18cd45f 41b4aac4 -> 40f4a639 410935a4", + "c199cc1a c199c9b8 c18dcf47 41b491f9 -> c18dcf47 c18dcf47", + "4129080f 4129f041 c118a4bc 419b960d -> 4129080f 4129f041", + "40c3bde6 40c3c1da c1a4db7a 41a33262 -> 40c3bde6 40c3c1da", + "c18eb4b7 c1898361 c141ac1a 40f72088 -> c141ac1a c141ac1a", + "414e2cb4 41509dbc c1b964f9 414dd8b1 -> 414dd8b1 414dd8b1", + "c18ab76a c18a3472 bfbafc30 400984b4 -> bfbafc30 bfbafc30", + "c186cfb6 c17c8670 bfd81450 4193036e -> bfd81450 bfd81450", + "419502d8 4195239c c12da6b8 41ab6d61 -> 419502d8 4195239c", + "c12a1ca9 c129e60f c026bfa8 41214e89 -> c026bfa8 c026bfa8", + "41646d2a 41989373 c11d417d 40befd8d -> 40befd8d 40befd8d", + "416e3268 4181ee24 bf563220 417bb26e -> 416e3268 417bb26e", + "c0c50d72 be9aa858 bfb35300 41894251 -> bfb35300 be9aa858", + "410fef0b 4114c15d c164037e 3fd35dff -> 3fd35dff 3fd35dff", + "4106ccec 4113b120 c0832e1c 41374ad7 -> 4106ccec 4113b120", + "c1122227 c1121dd1 c0976074 41bfcfbd -> c0976074 c0976074", + "405b229c 40c1157a c09657e0 40a9b027 -> 405b229c 40a9b027", + "40356ebb 4035aee5 c1275a64 417ee03e -> 40356ebb 4035aee5", + "416aabe8 416aad68 c1732e00 41b19409 -> 416aabe8 416aad68", + "c19c627e c1908328 c115cbe6 40c0ca70 -> c115cbe6 c115cbe6", + "40722665 4072621b c1055216 405dafde -> 405dafde 405dafde", + "41678a1c 41679114 c1c6b822 40d80975 -> 40d80975 40d80975", + "c19ca737 c19c6695 c1acb651 41354095 -> c19ca737 c19c6695", + "4063336e 40642fe2 c1adaebd 418e5eff -> 4063336e 40642fe2", + "c1712405 c16e5dd5 c117cb49 3e140be4 -> c117cb49 c117cb49", + "c19dce77 c19912a5 c1bc55f1 402113dd -> c19dce77 c19912a5", + "c0a405b5 c0a3e9b3 c0904e90 417671c4 -> c0904e90 c0904e90", + "c0fc0142 c0fa5cc2 c1c0c25c 41b1480f -> c0fc0142 c0fa5cc2", + "c15d1713 c15b9439 c05a3f48 41bfdefb -> c05a3f48 c05a3f48", + "3fb56b0b 3fd2d135 c1b48c82 4114d13b -> 3fb56b0b 3fd2d135", + "4170d19c 4171a3bc c19fbfa7 3fe3863f -> 3fe3863f 3fe3863f", + "c14b6f6b c14b6d9f c1be59c2 412ba6a9 -> c14b6f6b c14b6d9f", + "4198e6e0 419aea78 c0bdfeb4 4118d16f -> 4118d16f 4118d16f", + "c138301c c1362e14 c19aa70c 41a80af0 -> c138301c c1362e14", + "c11dfa99 c11ce599 c0baad40 415e031c -> c0baad40 c0baad40", + "c03c4882 c03bb5fe bf57c940 413b82f0 -> bf57c940 bf57c940", + "bfba66b5 bfba2c6b c18c84f2 41c6c805 -> bfba66b5 bfba2c6b", + "403d4db5 403d599b c1a54a2e 4135439d -> 403d4db5 403d599b", + "40015870 40017510 c1ae3a3e 413ce3f9 -> 40015870 40017510", + "c00c1d54 40ce28d2 c00257d8 40c2bb20 -> c00257d8 40c2bb20", + "c11a9db5 c11a78ff c111f114 41796d4d -> c111f114 c111f114", + "41316e69 41346a83 c102f274 4156668e -> 41316e69 41346a83", + "c0a89455 c0a89343 c0ebb7f8 41c274b3 -> c0a89455 c0a89343", + "418193b1 4181fcff bfae7710 4142a6b2 -> 4142a6b2 4142a6b2", + "403330bd 40509b03 c11d0178 41ba6bd6 -> 403330bd 40509b03", + "4153e44a 4153e50e c067b9a0 41a1bf23 -> 4153e44a 4153e50e", + "3e872c37 3e88f9c9 c086cd3c 41c10f8a -> 3e872c37 3e88f9c9", + "bf29607b bd8df228 c18e971b 40d56d37 -> bf29607b bd8df228", + "40bc200d 40bd7293 c18cb2e6 3f66e0e0 -> 3f66e0e0 3f66e0e0", + "412340b1 412355df c0f8a1b4 41a1e434 -> 412340b1 412355df", + "40319fa0 405aa970 c115c1c8 415c3ac4 -> 40319fa0 405aa970", + "bfa9a330 bfa981f0 c134f6d2 3e550b4b -> bfa9a330 bfa981f0", + "c0fec5b5 c0f99187 c0259fc8 41a42329 -> c0259fc8 c0259fc8", + "c1116602 bf08a9e0 c16b115a 40a358ea -> c1116602 bf08a9e0", + "3f3c2838 4005c8b2 c1b09d88 413c16c1 -> 3f3c2838 4005c8b2", + "414bc019 41514167 c1bef8ec 417583e0 -> 414bc019 41514167", + "411720e4 411760c0 c1870ac2 4118ee9f -> 411720e4 411760c0", + "c13eee46 c1068c5c c0d6d0b8 40ba6b9d -> c0d6d0b8 c0d6d0b8", + "c1961087 c18e3e7d c1810f04 3fdefade -> c1810f04 c1810f04", + "c0368d10 c0365670 c183a124 40f44c44 -> c0368d10 c0365670", + "411d13e1 4131f877 c107134a 41a9b9c9 -> 411d13e1 4131f877", + "4164f70c 41654efc c034b8c8 41843645 -> 4164f70c 41654efc", + "c1790521 c17903f1 c147b26a 41b9bf33 -> c147b26a c147b26a", + "c12f80a9 c12f7b91 bea90200 41ae039f -> bea90200 bea90200", + "410a686a 410a68e2 c0949b80 3f353239 -> 3f353239 3f353239", + "4170f16d 4170f42b c0bdeb00 411d6f50 -> 411d6f50 411d6f50", + "41829c54 41844590 c0b21090 4168aeae -> 4168aeae 4168aeae", + "40a885ba 40a8b00e c0b3a388 40b8934c -> 40a885ba 40a8b00e", + "bf9827f1 bd3e69e0 c0e93a34 41c7e5a2 -> bf9827f1 bd3e69e0", + "c191992d c1919735 c0c36404 40d7fa1b -> c0c36404 c0c36404", + "3ffa7356 400a8e25 c191b746 40756fbf -> 3ffa7356 400a8e25", + "c0857213 c048d5ca c1c68db0 41a4db1c -> c0857213 c048d5ca", + "4146fa0c 41476694 c1815106 4126c3e1 -> 4126c3e1 4126c3e1", + "bec66eb5 bec48a4b c164719e 416e994b -> bec66eb5 bec48a4b", + "c18ca018 c18c9b94 bfc6cce0 409ba747 -> bfc6cce0 bfc6cce0", + "40f1cb06 40f1e692 c1c221ee 4199a6f1 -> 40f1cb06 40f1e692", + "c0ea7125 c0ea5ecb c15e548a 4125b260 -> c0ea7125 c0ea5ecb", + "c07991da 4097b8e5 c08bf50c 414fe6d1 -> c07991da 4097b8e5", + "c11c8b3f c11bb39d c1514879 40aa339c -> c11c8b3f c11bb39d", + "417b2ae2 417cf246 bec0c540 402ccfbd -> 402ccfbd 402ccfbd", + "40555e28 4112a0d6 c0b79f04 406b56b3 -> 40555e28 406b56b3", + "419c8784 419c9438 c0cfb5d8 4088d0b6 -> 4088d0b6 4088d0b6", + "c0963357 c096305d bfc37b80 419b422f -> bfc37b80 bfc37b80", + "c11afc4d c119f647 c12796b3 40c4f0f9 -> c11afc4d c119f647", + "40ab7f75 40ac8c1b c082c728 405dc627 -> 405dc627 405dc627", + "c0b680ee c0b38d3e c1893fa4 41a4c8c2 -> c0b680ee c0b38d3e", + "40b4b104 40e3d704 c1a7d43d 41bd37af -> 40b4b104 40e3d704", + "41578269 41578757 c0eddfa0 41348c24 -> 41348c24 41348c24", + "c115a92e c0fe3075 c138a9fb 41932920 -> c115a92e c0fe3075", + "3dd8d0a0 402bc19b c0b0c6e8 41bfaa95 -> 3dd8d0a0 402bc19b", + "3f97cb57 3f981769 c1c1af06 411f6be5 -> 3f97cb57 3f981769", + "c190834b c19082ef c193c6b1 418af900 -> c190834b c19082ef", + "41943b43 41943e2d c128a800 411c4587 -> 411c4587 411c4587", + "4120e024 413c26b4 c0c873b4 3fca5af4 -> 3fca5af4 3fca5af4", + "4037df54 41047103 c14cff93 4078e8c4 -> 4037df54 4078e8c4", + "c148f8d5 c139fe1f c1852559 408537b0 -> c148f8d5 c139fe1f", + "c0690a91 c06749af c14aff32 412b81be -> c0690a91 c06749af", + "c19f6b4b c191f42d c0e6f44c 41966dab -> c0e6f44c c0e6f44c", + "40f7861a 4123203f c11c6d52 4008aabb -> 4008aabb 4008aabb", + "3f12a142 408ae0f8 c0b39530 41745423 -> 3f12a142 408ae0f8", + "40390768 403a65a8 bedb9100 41727401 -> 40390768 403a65a8", + "40b04c92 40b06a4e c10085fe 412efb43 -> 40b04c92 40b06a4e", + "c1865b44 c1862aa4 c1b4b742 416b53aa -> c1865b44 c1862aa4", + "c088d213 c084a0d9 c0bf7b58 41931492 -> c088d213 c084a0d9", + "4183fbbd 4194e723 be89b0c0 416057b0 -> 416057b0 416057b0", + "3fc32196 403e7325 c1033254 403cd363 -> 3fc32196 403cd363", + "3dc4f408 3fb968e0 c1056182 41b2e56f -> 3dc4f408 3fb968e0", + "c129bc97 c12664a3 c14744ed 4190d5f8 -> c129bc97 c12664a3", + "c165e1de c13f32be c126ca54 419256a7 -> c126ca54 c126ca54", + "4143d101 414acfcf c13c80bb 401bbb03 -> 401bbb03 401bbb03", + "4145a9e1 4145aaa7 c1825548 415b19af -> 4145a9e1 4145aaa7", + "411f3b42 411f3cf2 c180855a 402112b8 -> 402112b8 402112b8", + "c183b601 c1621dca c1aab18f 418b4517 -> c183b601 c1621dca", + "41884d78 41884fe4 c1bd1616 419409d2 -> 41884d78 41884fe4", + "412b462f 414d0621 c1b6a298 41a24ff5 -> 412b462f 414d0621", + "40accfc6 40c77e1a c19ffd2e 412690d7 -> 40accfc6 40c77e1a", + "41976b6c 41977a4c c16915e6 414f39c2 -> 414f39c2 414f39c2", + "c1930f99 c1930f4f bff348f0 40a89900 -> bff348f0 bff348f0", + "c0ff9ca6 c0a36abe c0c66570 41487ac4 -> c0c66570 c0a36abe", + "bf23b573 bf239a0d c17c50b8 411e8701 -> bf23b573 bf239a0d", + "bfa3f3d1 bf9b4f8f c0b27424 41118c12 -> bfa3f3d1 bf9b4f8f", + "3e2ae7e8 3f9db1e3 c0a16cd4 41bf45ec -> 3e2ae7e8 3f9db1e3", + "41410dad 415b4093 bfc75450 41bd51d0 -> 41410dad 415b4093", + "40aeb6f8 40bb0c20 c15b3d6a 3f1db462 -> 3f1db462 3f1db462", + "413eaa80 4183ddc8 c12a35e5 4116a004 -> 4116a004 4116a004", + "40ee2322 41103b83 c1bbf400 400dbfab -> 400dbfab 400dbfab", + "41798558 41a2f4c8 c17ffca9 3f59ea16 -> 3f59ea16 3f59ea16", + "bfc2eb5a bfbb6fc6 c194c3e7 4185f1ef -> bfc2eb5a bfbb6fc6", + "bea24df7 bd094848 c18373ba 3ffe92d3 -> bea24df7 bd094848", + "c1a3bd10 c1979a9a c021b6f0 40863d62 -> c021b6f0 c021b6f0", + "403cda9e 403e2502 c0f33d64 409e154f -> 403cda9e 403e2502", + "c1a1a0fc c147f2a1 c12c39fc 4177a77d -> c12c39fc c12c39fc", + "c0277023 c00bb47d c10d8522 415cd6da -> c0277023 c00bb47d", + "c02695ec 40d2bd5e c0f78228 417bcbd5 -> c02695ec 40d2bd5e", + "3db31e6a 3eba5966 c16a4697 4168ae33 -> 3db31e6a 3eba5966", + "c020d848 bfecf4af c14a8498 40d6fec5 -> c020d848 bfecf4af", + "405dc69d 405dea73 c15b9bb6 41be2956 -> 405dc69d 405dea73", + "c0a0d4cd c0a09937 c1c486f8 3ef0ca72 -> c0a0d4cd c0a09937", + "c1957c64 c1956646 c09df7e4 40c3d3a6 -> c09df7e4 c09df7e4", + "c174b05c c153c880 bd87d200 41c26fb4 -> bd87d200 bd87d200", + "c0b32c32 c0a2f7da c1226282 41930f38 -> c0b32c32 c0a2f7da", + "4180f7fc 41839ebc c1b00302 41493014 -> 41493014 41493014", + "419e7def 41a17049 c12a6f77 40ff2667 -> 40ff2667 40ff2667", + "c0481e97 c047df69 c0de1db4 41a1f881 -> c0481e97 c047df69", + "41957446 4195904a c11b9f2e 41a4a6fc -> 41957446 4195904a", + "3f7e6f7a 3f8f1443 c1970fa9 3fd8873e -> 3f7e6f7a 3f8f1443", + "41054d98 41077f08 c1405b7b 4064f9d9 -> 4064f9d9 4064f9d9", + "c146772c c14631c0 c14d8e67 41809a3d -> c146772c c14631c0", + "40f435f9 40f4bb07 c19cee16 418ce8d8 -> 40f435f9 40f4bb07", + "c1581265 c14e28ef c17f5ed1 41b0843f -> c1581265 c14e28ef", + "c1869c3f c13548bd bf9d11b0 41843d0c -> bf9d11b0 bf9d11b0", + "413c8382 41417b86 c12139d6 418f2722 -> 413c8382 41417b86", + "4031b314 413f80e3 c1907c84 418f3c28 -> 4031b314 413f80e3", + "c11eed7c c11eea72 c15daf91 41958b84 -> c11eed7c c11eea72", + "be317752 be0598ae c1c2f0c1 40dfd353 -> be317752 be0598ae", + "c18371df c10c599f c1896d92 415d9fca -> c18371df c10c599f", + "c152bcad c10a8627 c114d275 41c3f313 -> c114d275 c10a8627", + "c17eccad c17ecc2d c1101c73 40a70bc5 -> c1101c73 c1101c73", + "c18cc046 c1893e8c c101e9a8 41675ac0 -> c101e9a8 c101e9a8", + "40d558a6 40d7fe22 c1922766 3e9422a3 -> 3e9422a3 3e9422a3", + "c19a6979 c1921921 c1587bcf 409df059 -> c1587bcf c1587bcf", + "c159f893 c14ea705 c173780c 414ec343 -> c159f893 c14ea705", + "419ebe28 419eeac4 c19e54bd 4180c070 -> 4180c070 4180c070", + "4115303e 4115314a c0f1e8ac 4088f831 -> 4088f831 4088f831", + "40acd66b 40ad256d c1626105 41ad81d2 -> 40acd66b 40ad256d", + "c189eef5 c188f557 c11a71f7 41854d69 -> c11a71f7 c11a71f7", + "c0bc35c1 c0bc33f3 c10bc86c 41515431 -> c0bc35c1 c0bc33f3", + "bf90d977 3f8540f7 c1b7ff44 41b68a4b -> bf90d977 3f8540f7", + "c11b6e09 c11b6d8f c196225b 4118a693 -> c11b6e09 c11b6d8f", + "3f38af1f 3f38c7e1 c175ae55 4136e1d5 -> 3f38af1f 3f38c7e1", + "3fca950e 3fcaa0d2 bed46dc0 417db36e -> 3fca950e 3fcaa0d2", + "40f36075 4189362f c151b898 41c4c49c -> 40f36075 4189362f", + "c1964afb c1960729 bfb5a4c0 40d8af23 -> bfb5a4c0 bfb5a4c0", + "c1606f1d c1604559 bfbc81e0 41254e5a -> bfbc81e0 bfbc81e0", + "c14e1177 c13f6dd9 c078dd40 401f342a -> c078dd40 c078dd40", + "c1828bd7 c1621609 c1c46464 404e4f94 -> c1828bd7 c1621609", + "c08fe80c c08fcf68 c1755a81 418fe089 -> c08fe80c c08fcf68", + "4154befb 4154ce8d c10abb3c 414fe2a9 -> 414fe2a9 414fe2a9", + "c1bb1a1c c17ba458 c186683c 41bfe384 -> c186683c c17ba458", + "3fb2bc18 4114e6b5 c064b878 410ecccf -> 3fb2bc18 410ecccf", + "4067584b 40752395 c14af879 41c6f8e5 -> 4067584b 40752395", + "4183498b 418c2d4d c0bd6608 41ab16e8 -> 4183498b 418c2d4d", + "c18ed0ea c182b2dc c1a190d2 419126fa -> c18ed0ea c182b2dc", + "c11298bb c1128dab c1846ff1 4186502c -> c11298bb c1128dab", + "c189ba73 c175814f c196abf4 414d86ff -> c189ba73 c175814f", + "40824a0a 4095a3f6 c1a9b982 418ef3c9 -> 40824a0a 4095a3f6", + "41606dee 4160a3a2 c1940a61 408a14eb -> 408a14eb 408a14eb", + "c1a8c9ac c1500c8c c0b06a30 40a7db37 -> c0b06a30 c0b06a30", + "418b29f7 418b6205 c1456ca3 4135135b -> 4135135b 4135135b", + "c09f72fb c09f71e9 c19f0b31 4167616f -> c09f72fb c09f71e9", + "3fa2f33d 3fa8bec3 c10d4c94 41c747a5 -> 3fa2f33d 3fa8bec3", + "c189b8b2 c14e12ac c19640ac 4190f3d9 -> c189b8b2 c14e12ac", + "40aee670 40b50690 c055b018 419bdd63 -> 40aee670 40b50690", + "411512f5 41152843 c0c9e0c0 41a759ab -> 411512f5 41152843", + "3e672aa8 3f800a6b c1ab31d9 41484189 -> 3e672aa8 3f800a6b", + "3ff6fc70 40013d68 c0aea074 4011939f -> 3ff6fc70 40013d68", + "c1ae89df c15a7f5a c0a79314 419cb40f -> c0a79314 c0a79314", + "411dcaa3 41486c9d c18cc5f2 3fdf6d06 -> 3fdf6d06 3fdf6d06" + ] + }, + { + "glsl": "vec2 cultmath_iv_saturate(vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "40bc1486 40c318aa -> 3f800000 3f800000", + "419a0e2e 419a0eae -> 3f800000 3f800000", + "c179e2f4 c179e084 -> 00000000 00000000", + "3fc89b82 40b6ab50 -> 3f800000 3f800000", + "c1508402 c14fc220 -> 00000000 00000000", + "3fab170a 3faca716 -> 3f800000 3f800000", + "c1764563 c17644f9 -> 00000000 00000000", + "bf78f6c9 bf619df7 -> 00000000 00000000", + "4117b12a 411b42da -> 3f800000 3f800000", + "418b912a 418c586e -> 3f800000 3f800000", + "417000f1 41754f77 -> 3f800000 3f800000", + "c1ab2523 c1823cd3 -> 00000000 00000000", + "411f2b2d 41202153 -> 3f800000 3f800000", + "418cbd4a 418cbe56 -> 3f800000 3f800000", + "c1689139 c1683a6f -> 00000000 00000000", + "418c0468 4190b918 -> 3f800000 3f800000", + "c0c2406c c0a378ac -> 00000000 00000000", + "c16d074e c16d0670 -> 00000000 00000000", + "c0b47325 c0ad5443 -> 00000000 00000000", + "41115a1b 4111740d -> 3f800000 3f800000", + "c1486a6c c148653a -> 00000000 00000000", + "c0dee8a4 c0dee7ac -> 00000000 00000000", + "c18dc2b9 c18db521 -> 00000000 00000000", + "41983fea 4198404e -> 3f800000 3f800000", + "3e61c21f 3e62c3e1 -> 3e61c21f 3e62c3e1", + "c19203ad c19202f3 -> 00000000 00000000", + "418e0a4b 419086f1 -> 3f800000 3f800000", + "c170b4bc c11b3ce0 -> 00000000 00000000", + "40b20bca 40b20d16 -> 3f800000 3f800000", + "c0dc2b86 c0da4a4a -> 00000000 00000000", + "c1367050 c13627e8 -> 00000000 00000000", + "413490ab 413a36bd -> 3f800000 3f800000", + "404d6895 408005fe -> 3f800000 3f800000", + "c18dc100 c18db8fa -> 00000000 00000000", + "416d092b 416d3835 -> 3f800000 3f800000", + "c12cada4 c12cacb8 -> 00000000 00000000", + "418d4ab1 418de7df -> 3f800000 3f800000", + "c06abff5 c05e310b -> 00000000 00000000", + "c09bcb44 c09bca4c -> 00000000 00000000", + "41761db1 4176402f -> 3f800000 3f800000", + "3ff25b0c 40902bad -> 3f800000 3f800000", + "403ea7c7 40fcae24 -> 3f800000 3f800000", + "c078ab20 c0193290 -> 00000000 00000000", + "41424e3d 41459023 -> 3f800000 3f800000", + "40879c1b 4087a2ed -> 3f800000 3f800000", + "c03e54db c03e1205 -> 00000000 00000000", + "c0cbdae8 c0cbd4e0 -> 00000000 00000000", + "c166f869 c15f306d -> 00000000 00000000", + "c02cad63 c024f50d -> 00000000 00000000", + "c04220ca c041f8d6 -> 00000000 00000000", + "c0f9ba0e c0f38b4e -> 00000000 00000000", + "c14904aa c1490376 -> 00000000 00000000", + "4170db8d 41b34f2e -> 3f800000 3f800000", + "c154bf36 c154a1f6 -> 00000000 00000000", + "c1083315 c107779b -> 00000000 00000000", + "4027ec87 403064c9 -> 3f800000 3f800000", + "c1834d83 c132f752 -> 00000000 00000000", + "419799bf 4197a315 -> 3f800000 3f800000", + "413abb35 415699c3 -> 3f800000 3f800000", + "c10c6e6c c102db9e -> 00000000 00000000", + "41977c6e 41978fd6 -> 3f800000 3f800000", + "4105ea55 410a3deb -> 3f800000 3f800000", + "418dbde8 41a980f0 -> 3f800000 3f800000", + "410d5477 41188a3d -> 3f800000 3f800000", + "c035f85b c0271365 -> 00000000 00000000", + "c1357d30 c12b289c -> 00000000 00000000", + "40645d06 406b51da -> 3f800000 3f800000", + "c1978fbe c16d5ab4 -> 00000000 00000000", + "40fbf2f5 40fd993b -> 3f800000 3f800000", + "419654e7 4196788d -> 3f800000 3f800000", + "40d59aa6 40d615ca -> 3f800000 3f800000", + "c0a14be1 c0a149f7 -> 00000000 00000000", + "4085538b 40a5d545 -> 3f800000 3f800000", + "c1552243 c154faa7 -> 00000000 00000000", + "c1499959 c136ed03 -> 00000000 00000000", + "41874a57 4187f85d -> 3f800000 3f800000", + "c0df6525 c0d85427 -> 00000000 00000000", + "c11a8b4a c0c0e7b8 -> 00000000 00000000", + "418e23eb 418e6451 -> 3f800000 3f800000", + "c17b6835 c17b6763 -> 00000000 00000000", + "c1240d89 c123e53d -> 00000000 00000000", + "418bfb71 418ced27 -> 3f800000 3f800000", + "c1039e51 c0e53e31 -> 00000000 00000000", + "c1956949 c194f905 -> 00000000 00000000", + "416a2db2 416a2e6e -> 3f800000 3f800000", + "40abda67 40abecf9 -> 3f800000 3f800000", + "416560ef 417eb6c1 -> 3f800000 3f800000", + "c183eebe c1838a4e -> 00000000 00000000", + "c199cce7 c1988cd1 -> 00000000 00000000", + "c189bfca c189be12 -> 00000000 00000000", + "411a2f7c 411a4250 -> 3f800000 3f800000", + "402dfbdd 4035e503 -> 3f800000 3f800000", + "411e726d 4120f183 -> 3f800000 3f800000", + "c095c680 bf1e4344 -> 00000000 00000000", + "c0fbbf1b c0fbb995 -> 00000000 00000000", + "41990502 41990702 -> 3f800000 3f800000", + "c08b765b bf52252a -> 00000000 00000000", + "c13d3ccd c13d33c9 -> 00000000 00000000", + "bee8d895 3e316d2a -> 00000000 3e316d2a", + "41213b36 413384ea -> 3f800000 3f800000", + "412a4215 412c41b3 -> 3f800000 3f800000", + "3f9f9f10 3f9fb130 -> 3f800000 3f800000", + "c14ed30e c14be34a -> 00000000 00000000", + "4104adf0 41051f28 -> 3f800000 3f800000", + "40387599 4063a0b7 -> 3f800000 3f800000", + "417a00a4 417a0e7c -> 3f800000 3f800000", + "c09afe2e bf425fd4 -> 00000000 00000000", + "c1107602 c0adad94 -> 00000000 00000000", + "41529230 4152a298 -> 3f800000 3f800000", + "4167bed6 416b492a -> 3f800000 3f800000", + "c0a4819d c0a47ea3 -> 00000000 00000000", + "c1261606 c121047a -> 00000000 00000000", + "c188c147 c188a22b -> 00000000 00000000", + "411f4b71 41874a0f -> 3f800000 3f800000", + "40996f4a 40c1a486 -> 3f800000 3f800000", + "c192afb8 c192ab8c -> 00000000 00000000", + "416e6eb2 416e76ae -> 3f800000 3f800000", + "c0538dd3 c053872d -> 00000000 00000000", + "4140bd2f 4140f151 -> 3f800000 3f800000", + "c01b766f c01b7171 -> 00000000 00000000", + "4169229a 419f42db -> 3f800000 3f800000", + "c0cbf4e4 c0ca65d0 -> 00000000 00000000", + "c111c9d6 c10e1b22 -> 00000000 00000000", + "412b3abd 412bd13f -> 3f800000 3f800000", + "40676d7e 40679d52 -> 3f800000 3f800000", + "c01b194e c01b0ce2 -> 00000000 00000000", + "417c9fef 417ca131 -> 3f800000 3f800000", + "c01f58ff c0133691 -> 00000000 00000000", + "c0b70a60 c0894cc8 -> 00000000 00000000", + "c189d643 c185b20d -> 00000000 00000000", + "4146d8f2 414ecade -> 3f800000 3f800000", + "415caa1b 4166d605 -> 3f800000 3f800000", + "410e59b5 41109547 -> 3f800000 3f800000", + "c02afad0 c02aeef0 -> 00000000 00000000", + "3e466470 3e476390 -> 3e466470 3e476390", + "c179b369 c179866f -> 00000000 00000000", + "416e7369 4179880f -> 3f800000 3f800000", + "411836c9 41186e0f -> 3f800000 3f800000", + "412a8af4 41300594 -> 3f800000 3f800000", + "c0402463 c03f7fbd -> 00000000 00000000", + "40d75ffd 40d781ab -> 3f800000 3f800000", + "c09c3612 c09c0bce -> 00000000 00000000", + "c0bb26d8 c06e0170 -> 00000000 00000000", + "c0b649a7 c09e31c5 -> 00000000 00000000", + "41463edc 41508d54 -> 3f800000 3f800000", + "40ca3f2d 4156c3da -> 3f800000 3f800000", + "c0cafb3d c0c1440f -> 00000000 00000000", + "c10ce379 c10cdfbf -> 00000000 00000000", + "c182a652 c182027c -> 00000000 00000000", + "414731bf 4149ea79 -> 3f800000 3f800000", + "c127afc3 c12628b5 -> 00000000 00000000", + "c19d6b0f c19d5835 -> 00000000 00000000", + "c14ad600 c14ad56a -> 00000000 00000000", + "c1035fea c1035e28 -> 00000000 00000000", + "c0b4325f c0b43169 -> 00000000 00000000", + "4174883f 417807d9 -> 3f800000 3f800000", + "c0785b4c c0692074 -> 00000000 00000000", + "c188473f c1880abb -> 00000000 00000000", + "c0b2456a c0b1220e -> 00000000 00000000", + "c0b8aa75 c073d05d -> 00000000 00000000", + "c119ea0a c116cc92 -> 00000000 00000000", + "c0c2e7fa c0b24b2a -> 00000000 00000000", + "bffba88f bffb9831 -> 00000000 00000000", + "c18bdfaf c18bddf7 -> 00000000 00000000", + "beff1dbb bee38d45 -> 00000000 00000000", + "c0d560b0 c0d55960 -> 00000000 00000000", + "41759830 418112f4 -> 3f800000 3f800000", + "c158ce39 c158cd47 -> 00000000 00000000", + "c13a2270 c04ca060 -> 00000000 00000000", + "c159fe1c c159e750 -> 00000000 00000000", + "40358737 4035a149 -> 3f800000 3f800000", + "c0781d5a c0355156 -> 00000000 00000000", + "41714482 41714586 -> 3f800000 3f800000", + "401d82b9 402bd2f7 -> 3f800000 3f800000", + "408e883a 40a9b206 -> 3f800000 3f800000", + "4152f0e8 41543fd0 -> 3f800000 3f800000", + "c16f5753 c1102f9f -> 00000000 00000000", + "c095845b c092efbd -> 00000000 00000000", + "c1254ae1 c1254235 -> 00000000 00000000", + "418d6bb3 418d6c09 -> 3f800000 3f800000", + "4195e2d1 4195e38b -> 3f800000 3f800000", + "409e995e 40c3c4c2 -> 3f800000 3f800000", + "40e2a587 40ec2a09 -> 3f800000 3f800000", + "412e8677 4130b599 -> 3f800000 3f800000", + "3f0ff364 3f0ffa1c -> 3f0ff364 3f0ffa1c", + "c14d2fd4 c14d10c8 -> 00000000 00000000", + "c0bf0a34 c0bf0908 -> 00000000 00000000", + "c107f3db c107f355 -> 00000000 00000000", + "c125bc71 c124d4c5 -> 00000000 00000000", + "416a3aa5 416a5853 -> 3f800000 3f800000", + "4040a8ee 40414012 -> 3f800000 3f800000", + "401661bc 402b3304 -> 3f800000 3f800000", + "41057145 410e85e3 -> 3f800000 3f800000", + "4188facd 41b0790f -> 3f800000 3f800000", + "c0880370 c085793c -> 00000000 00000000", + "415391eb 415392a5 -> 3f800000 3f800000", + "c1922656 c192258e -> 00000000 00000000", + "c0990487 c0985f3d -> 00000000 00000000", + "4080d0f4 4084221c -> 3f800000 3f800000", + "c17154da c1715182 -> 00000000 00000000", + "c12406ac c0ac9828 -> 00000000 00000000", + "c15d4227 c15b3fad -> 00000000 00000000", + "4087bbaa 40885566 -> 3f800000 3f800000", + "c12badec c12bab0c -> 00000000 00000000", + "40d605da 40d63b1e -> 3f800000 3f800000", + "c0d1ed92 c0c8c732 -> 00000000 00000000", + "c082583f c08014cd -> 00000000 00000000", + "bfa8a7a2 bf9f02de -> 00000000 00000000", + "bf01a570 4088e97e -> 00000000 3f800000", + "c192b198 c15dedb3 -> 00000000 00000000", + "40ee2452 410f356f -> 3f800000 3f800000", + "c150cd5a c105dae0 -> 00000000 00000000", + "c15230ec c1522f18 -> 00000000 00000000", + "c0d639c3 c0d62d8d -> 00000000 00000000", + "40aad1b4 40d649cc -> 3f800000 3f800000", + "c052af6d c048b383 -> 00000000 00000000", + "c041ce38 c0310468 -> 00000000 00000000", + "c18afe69 c189c0eb -> 00000000 00000000", + "c151bd27 c0fd72a6 -> 00000000 00000000", + "c1813b85 c1813763 -> 00000000 00000000", + "3e0339a8 3fb28ceb -> 3e0339a8 3f800000", + "c1124e24 c1124d8c -> 00000000 00000000", + "c1262bc9 c12629bf -> 00000000 00000000", + "40c03037 40c0eed9 -> 3f800000 3f800000", + "40ac8935 40ce8cc3 -> 3f800000 3f800000", + "41839134 418546d8 -> 3f800000 3f800000", + "3e696628 3e6a57d8 -> 3e696628 3e6a57d8", + "bf6a39f9 bf649447 -> 00000000 00000000", + "41032f7b 410334bd -> 3f800000 3f800000", + "c0055403 c003c9bd -> 00000000 00000000", + "c19fa29e c1248af6 -> 00000000 00000000", + "bd3fac20 3fc678e1 -> 00000000 3f800000", + "418c781e 418f06d2 -> 3f800000 3f800000", + "c11a42fa c1143a74 -> 00000000 00000000", + "bf1ca7b4 3f4c9ff4 -> 00000000 3f4c9ff4", + "c0d0b223 c0cd56e9 -> 00000000 00000000", + "414d4bda 4165a646 -> 3f800000 3f800000", + "c09c3f5b c00f726a -> 00000000 00000000", + "40249dba 4024ae26 -> 3f800000 3f800000", + "40f803b0 40f804e0 -> 3f800000 3f800000", + "bfe74dd8 3e3024c4 -> 00000000 3e3024c4", + "4027ddef 4089bc89 -> 3f800000 3f800000", + "4181beb5 41867067 -> 3f800000 3f800000", + "c16af231 c16aec17 -> 00000000 00000000", + "c13cb78d c13b2347 -> 00000000 00000000", + "418a9661 418a969f -> 3f800000 3f800000", + "be8aefc6 be151c74 -> 00000000 00000000", + "c1676dcb c166c707 -> 00000000 00000000", + "c0fdff3b c0fd8a8d -> 00000000 00000000", + "c183ab53 c183455d -> 00000000 00000000", + "414a7f03 418b2a87 -> 3f800000 3f800000", + "4191cbd9 419ba813 -> 3f800000 3f800000", + "bfa9036a bfa88f96 -> 00000000 00000000", + "414ef720 415283f0 -> 3f800000 3f800000", + "4133bcd3 413536dd -> 3f800000 3f800000", + "41814688 41818afc -> 3f800000 3f800000" + ] + }, + { + "glsl": "vec2 cultmath_iv_smoothstep(float, float, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c13cd084 412662c3 419ef0b8 419ef4f0 -> 3f7fffff 3f800000", + "c16bccd3 4186bbaf 4188ec18 4188ede8 -> 3f7fffff 3f800000", + "c12cc9ff 3f39e923 bfa4f840 40002c40 -> 3f6b42d5 3f800000", + "c02510f8 4101246e c17a05b7 c17a0091 -> 00000000 00000001", + "c0f1ee68 41b1cccc 40538010 405387b0 -> 3e9aae73 3e9ab14d", + "c1b1cb87 4076f26a c15c315b c15b5961 -> 3e7d6bb8 3e8012e2", + "c032c390 4199afa1 c09db187 c09a6071 -> 00000000 00000001", + "bfe7e270 41397a24 bff9f51b bfeb08e5 -> 00000000 00000001", + "c0f46ecc 412b4f53 bf00907f bf008041 -> 3eac26a6 3eac292f", + "c116ba06 41af3c0e c179c720 c1779138 -> 00000000 00000001", + "c146de94 41b3fa31 4190018e 419daf9e -> 3f745d21 3f7b5f33", + "c1658247 3fd82143 4186d27c 4186d390 -> 3f7fffff 3f800000", + "c19fefa8 4172804e 418b4141 41a297b7 -> 3f7fffff 3f800000", + "c1c5eadc 419a2958 c08811e3 c087d56d -> 3ee58fca 3ee5b09e", + "c19420f1 4134ebde c0a34b23 c09e197d -> 3ed9897e 3eddadd5", + "c18ce2e9 4101e988 c1187e47 c1187ceb -> 3e6f8416 3e6f8876", + "c1296f83 41b31e84 c13a6730 c13a0d00 -> 00000000 00000001", + "c083ac7c 3f436876 404ea87a 4090467b -> 3f7fffff 3f800000", + "c0b1f598 41bee8c1 40a75e08 40a76758 -> 3e9c1578 3e9c1c8a", + "c1a36911 40f801e1 c17e84fd c16a34cb -> 3d8d2163 3ddfc899", + "c074a218 40bb22bb c078fa89 c078b857 -> 00000000 00000001", + "c14b2d77 415fdb87 400298dd 40c629a2 -> 3f13fcf0 3f4b3421", + "c1c11a44 40361f2d 414c73f5 414c76e3 -> 3f7fffff 3f800000", + "c147502a 413bc079 c0d6669e c0d66042 -> 3e126022 3e12694a", + "c110bd1e 41ad6970 c113709b c112b84f -> 00000000 00000001", + "c0625e28 41351b58 c0f4c913 c0f4c349 -> 00000000 00000001", + "c1c617f0 40705bb5 c1761e38 c1761d70 -> 3e81b94a 3e81ba76", + "c1abfe13 40921e95 c1729e88 c1195170 -> 3e181398 3edf32f0", + "c1852d09 415d7d55 413cc6b3 413cc789 -> 3f7cb36d 3f7cb39b", + "bff9a3f0 41bc170e 408fb6f1 408fb7ef -> 3e2373d1 3e23753c", + "c18d76b5 40e44b8e c035bfda c01bcd66 -> 3f252fc4 3f2b2d04", + "c19dc96e 412a5611 c0e6d857 c0e6bbe1 -> 3ebd0bfd 3ebd21cc", + "c1172f6b 413516f3 403ab87d 403af6b3 -> 3f2438a4 3f2449f8", + "c1c00923 416b0541 4193deca 4193f1fa -> 3f7fffff 3f800000", + "bfef85a0 40ba67bc c0f10a85 c0f0e097 -> 00000000 00000001", + "c15e51d5 415ad1ab 4126fb82 41440b16 -> 3f7639f3 3f7e05f7", + "bff5e9b0 41ae061c 412b90f9 4181be33 -> 3f0d11c3 3f5c8fc5", + "c1023bfa 40d8b03b c11e961f c119a8a9 -> 00000000 00000001", + "c1950b3a 40cabc7f c1284c94 c1271fe4 -> 3e7e0f2d 3e810400", + "c1c442d0 416ae01b 4192758d 41931f4b -> 3f7fffff 3f800000", + "c08793d4 41a17451 c03223a0 c020a6a0 -> 3c273673 3c6a2abd", + "c11c2264 41aef502 4180e2d3 418535e5 -> 3f69a0f4 3f6d64ac", + "c1236526 41204053 c16ade73 c1666981 -> 00000000 00000001", + "c1148528 40d85b70 4028a843 404ae1fd -> 3f55eaa3 3f5f4385", + "c1474c48 4168e4ca 413ef450 413f0910 -> 3f793c66 3f7942de", + "c1245e1d 4114ae56 40ab1e1b 40ab4ccd -> 3f64f8f1 3f650b61", + "c1a0aab7 41af0e75 c18fdda4 c1890670 -> 3bedfb96 3c684d52", + "c182146d 411b9fcc c09f41a9 c09f198f -> 3ecdc0f4 3ecde558", + "c1912494 41919c9a 3ec0570e 3f075579 -> 3f03a8b8 3f05464a", + "c1b15b44 401a14a2 c12502a5 c12501ef -> 3ef280a0 3ef28205", + "bf7c33c0 40104e04 c0b7bdde c0b7aab6 -> 00000000 00000001", + "c1ad20b3 4162d4bd c1ab515d c1510a52 -> 38f9f2c5 3e13ffdc", + "c0ff511c 4144ed2f c18936ce c18917a4 -> 00000000 00000001", + "c0a8fe24 41771c1a 419e3262 419e5ab2 -> 3f7fffff 3f800000", + "c1a54c0a 40043eee bf1be6a0 be0e887f -> 3f7631b5 3f793c6c", + "c0950ee0 4044ffe2 c083e5bb c083dd4d -> 3c614600 3c621e26", + "c1c300b7 419fb52a c0a02948 bfe8e001 -> 3ecfc629 3f035913", + "c0c0af9c 41bb20a1 40a9529f 40a9a9d9 -> 3ea8f735 3ea93a9b", + "c183fce4 41960334 c099a5ce c098a60a -> 3e83b70c 3e845198", + "c1c4f4aa 410ffd00 c1365cef c1341d19 -> 3eaf49bd 3eb25be8", + "c09afa04 3ff5acf8 c185f5d7 c16cfa9e -> 00000000 00000001", + "c1887797 41bbd615 3fefa56b 4004170a -> 3ee6ae8a 3eea4ca5", + "c0d53df0 3fa7ee2c bfbb5414 bfbb4f6c -> 3f38931b 3f3894b5", + "c11dbd2c 414b1de0 c1361d1a c11d7bd6 -> 00000000 35c95189", + "c0f56c0c 4076726b c120ce60 c120bad0 -> 00000000 00000001", + "c1a98608 4086b08f c134228d c12b9e9f -> 3eada327 3ebd1a57", + "c0602910 41853035 c1812711 c18126bf -> 00000000 00000001", + "c1988406 414649cb c035c5e2 bfd5f23c -> 3f060bfa 3f143d66", + "c056a888 41ac3640 41870eec 418aed68 -> 3f689238 3f6ceb1f", + "c1c47c08 4157df90 41764307 41764421 -> 3f7fffff 3f800000", + "c19621f8 4197a307 c157ba4c c15243bc -> 3d5a92a3 3d76162f", + "c1531c5b 4170bdb6 41344621 414b7903 -> 3f737941 3f7b100f", + "c141d9cb 4159275c 413371df 4153cf69 -> 3f79ee3a 3f7fdf0f", + "c1b1c410 41b032cc bf7d3772 bf559ace -> 3ef08a33 3ef338db", + "c06d7808 411021d8 419e700a 419fe386 -> 3f7fffff 3f800000", + "c07b8cd0 414c33c0 c04f2dfe c04f14b2 -> 3ba4dd88 3ba5970c", + "c11c734e 4181f959 c15acd93 c152593d -> 00000000 00000001", + "c1281fd3 41471d43 414cb9c5 414cbc2b -> 3f7fffff 3f800000", + "c19226d0 4082656e c1845c9c c1844974 -> 3c8abda8 3c8c359e", + "c1c7c42b 414f6936 c1114cbb c11144bd -> 3ec23dee 3ec247c8", + "c0562d48 40d34e0b 3f48d21e 3f8a6b91 -> 3ebf7bf9 3ed5f356", + "c0f7f538 4168f700 40794e38 4144b636 -> 3f086bf9 3f789d37", + "c1767566 40e825f9 41750f3e 41782702 -> 3f7fffff 3f800000", + "c13714aa 40ba73a6 c1286bb8 c120824c -> 3c05784e 3c9b12ed", + "c1842e5e 41b9e4b1 c185e18e c17710f3 -> 00000000 3b0eb3ee", + "c161262a 3fb0ab36 c11e5994 c11e5914 -> 3e37dd73 3e37dfe8", + "c0dd9b00 41826cff 3f6cbc74 40cdccea -> 3e87e65b 3f1c95f5", + "c0a4653c 4004d00c 40aef6d1 40af1cb7 -> 3f7fffff 3f800000", + "c1b68859 4193de1a 413625cb 41376621 -> 3f6be86f 3f6c51fa", + "bea411c0 4190e919 3ff41567 3ff419d9 -> 3d24f176 3d24f662", + "bfa802e0 408fe734 c0b24c5a c0b23566 -> 00000000 00000001", + "c11b03b1 40821d86 408e62d1 408e640f -> 3f7fffff 3f800000", + "c0000ba0 410b0fe8 c18e5e24 c18e5dac -> 00000000 00000001", + "c167b485 41344196 414450dc 41567624 -> 3f7fffff 3f800000", + "c1c5b093 414a4b5e 4196e4b7 4196e509 -> 3f7fffff 3f800000", + "be742c80 4196d6f3 c146351c c1462808 -> 00000000 00000001", + "c10aa010 415ce82c 4011dc46 4054144a -> 3ef603ae 3f0cab3f", + "c15d01e7 4184dfed 41201c0c 4122004c -> 3f610f64 3f62115f", + "c1774879 3fe4404a 416fe48b 416fec75 -> 3f7fffff 3f800000", + "c0f46ca8 41c09d7d c074e956 c070db6a -> 3d234223 3d287c72", + "c1bfd28b 415e4f27 c1970b1d c196e7fd -> 3d4aa188 3d4beddf", + "c1c26b4d 416204c4 418354cd 41848d47 -> 3f7fffff 3f800000", + "c00287f0 41c2ee39 402af4a6 402c971a -> 3dac47d4 3dae06bf", + "c0c597d0 414be675 c1947bd7 c19479f1 -> 00000000 00000001", + "be85e940 3fbfa917 40ae2996 40ae2b3a -> 3f7fffff 3f800000", + "c122e809 41a1a7fa 40630026 40631f3a -> 3edb1202 3edb1e2d", + "c12198f5 4130398a 40f2febb 40f32c7d -> 3f6e0576 3f6e1396", + "c129afbc 416177f4 c1757763 c17576ab -> 00000000 00000001", + "c1b3e0a2 41247a5d 419efdec 419f1c74 -> 3f7fffff 3f800000", + "c0db3454 4194b2b5 c11151db c11150b9 -> 00000000 00000001", + "c1100521 41baa489 4175ec06 41764ac2 -> 3f591655 3f594a7e", + "c1b48b89 40d82990 41550b9c 4179b784 -> 3f7fffff 3f800000", + "c1c0ef2d 41884fca c115db4b c113796d -> 3e962ae4 3e98ba99", + "c1869924 4109f87f 4195a186 4195a482 -> 3f7fffff 3f800000", + "bf52b4e0 419a8569 415fd941 41613b4f -> 3f53c619 3f550ca9", + "c047c7f0 416129dc c18c881f c18c7bf5 -> 00000000 00000001", + "c062e4a8 414f730b c0989d72 c0987386 -> 00000000 00000001", + "c142ea07 4170863b bfa78367 bfa74bb9 -> 3eb3e27e 3eb3ee4a", + "c0aa701c 415b1214 c05284a5 c045d19b -> 3d02e281 3d1c729b", + "bff40950 40396331 c15ab503 c15aa395 -> 00000000 00000001", + "c1286371 41a392d7 c10ea8eb c0bea2ae -> 3bffd503 3d70ec31", + "c18ccec9 4140c112 4108ef74 41128aa0 -> 3f76334b 3f792f48", + "c15e9168 4198e2c2 c08702e4 3fd063ee -> 3e54d64d 3ee96b0d", + "c02bc408 41891eac c137850a c137840c -> 00000000 00000001", + "c04c5188 4153eb10 40917bdc 4093fc8c -> 3ee99b2d 3eed3ff2", + "c0310240 414fe340 c0b44c45 c0b3d313 -> 00000000 00000001", + "c19d262b 3f0aa3ca 41582c38 4164c8e0 -> 3f7fffff 3f800000", + "bff10620 40f679bf c108bffe c0d7cbf5 -> 00000000 00000001", + "c11a497f 4152042b c19d572a c19d56c4 -> 00000000 00000001", + "c1963bf8 40855985 c18d3818 c18d2880 -> 3be552b8 3be86122", + "c0a24638 417a0f1b 417a7575 4181a3e6 -> 3f7fffff 3f800000", + "c1ad429c 414d90e4 c0bba6c1 c0bba41f -> 3edf9903 3edf9ad3", + "c1851d8a 4109483f 4137bef0 4137e524 -> 3f7fffff 3f800000", + "c1478204 4167de6c c022bc4f c022b911 -> 3e9d1b76 3e9d1cd0", + "c158956d 41b00330 40e65341 40e66687 -> 3f1fbde3 3f1fc438", + "c1124b87 41bc6d41 4153d707 4153d8f9 -> 3f43a85a 3f43a998", + "c159c69e 41768f8d c0ce0dc4 c0cdd558 -> 3e1cb33f 3e1cf8ba", + "c10115f2 4079934f 414f5b74 4154c134 -> 3f7fffff 3f800000", + "c1539892 40beaa17 413423b4 41342c48 -> 3f7fffff 3f800000", + "c11767e3 41746aa6 c10255f4 c0fa8338 -> 3c065500 3c4d1276", + "c104b210 41954100 c00f9e0b c00a7255 -> 3e039f45 3e06d7ff", + "c13fa665 41b6fc2f c0c00746 c0c0060e -> 3da00f5f 3da01149", + "c1b64755 41bdccfd 407c854b 407cf7a5 -> 3f1c7b2e 3f1c899c", + "c14d5044 419ce5b8 410bd5bb 4129fb39 -> 3f3d057c 3f4ff12d", + "c0a4afcc 41988cb6 c104f6eb c10458d9 -> 00000000 00000001", + "c1a509d0 41c528bd c0426944 c0425c7c -> 3eabd593 3eabd8cb", + "c14200b7 400291a0 4187548f 418758c9 -> 3f7fffff 3f800000", + "c0a17524 4089c502 c05675bc bfcfc289 -> 3db16815 3e9b8d90", + "c1281a42 41c3ed20 40375400 40b3cad0 -> 3ea7197e 3ee1eac7", + "c1491c36 40c7a007 4091e4c5 4093825b -> 3f7a3e32 3f7a92dc", + "c192b72f 40f398df c110f1b6 c109efee -> 3e959851 3ea19f9a", + "c13118ef 4137c746 c1361259 c131bd3b -> 00000000 00000001", + "c1497c41 41b94b4e c00b8575 be5aaeb0 -> 3e51f6ec 3e8da089", + "c1885636 419c9ab4 3f645cb2 3f934247 -> 3ef82487 3efd8fc6", + "c1878f46 40d52d3e c18ac9ee c18aa9be -> 00000000 00000001", + "be4cfe80 400b53ec c1473cb6 c10a2136 -> 00000000 00000001", + "c143873a 41963eea 4138b33e 41393fc6 -> 3f5ca94e 3f5cf70f", + "c1a44f68 41aacf69 c0b6dcf6 c0b52c02 -> 3e92fa8d 3e93dd9c", + "c1aa5f59 41966b07 c1316a09 c10d773f -> 3e254d7f 3e6b0123", + "c0ea9004 418b283d 409b1c1d 409b1dab -> 3efa4033 3efa41b9", + "c05baae0 40bd20b3 41185dff 413ce5d1 -> 3f7fffff 3f800000", + "c0ee4b70 4167a284 3f2f937b 3fd30c22 -> 3e9f1631 3ebf4019", + "c15a5c26 41b8b6e6 40286144 4028789c -> 3ed47f30 3ed486b6", + "c1a363d8 408c45d5 3ff8ffd5 3ff919ab -> 3f79112c 3f79124a", + "c1ba631b 41110aa8 c13da118 c12c7ac0 -> 3e92d6db 3eaa8d86", + "c103d4ac 418e5cd3 3e7775dc 3ecefe12 -> 3e7f337e 3e83d5fc", + "c12c87fd 41b91810 41063dca 4107536e -> 3f18ea06 3f19ab05", + "c13b2431 41830b3b 4197abfc 4198c194 -> 3f7fffff 3f800000", + "c10de268 3e8bf609 4030cefc 40573004 -> 3f7fffff 3f800000", + "c187e81b 4111e3d5 c15b7a40 c11243fe -> 3d30ca9e 3e5dea68", + "c19b9743 41c675cf c18f0d6d c18f0993 -> 3b70c1c2 3b7153f9", + "c18e591a 404b45ba c1131722 bff0e62e -> 3ebbb9db 3f5a8028", + "c19f4f78 3fe4e796 4141657a 41417b06 -> 3f7fffff 3f800000", + "c15086d2 41a307e5 c0930cf0 c0930848 -> 3e22eda0 3e22f2b0", + "c0d954e8 4047010e c1042c27 c0efe285 -> 00000000 00000001", + "c0526b78 41c0976b c11e91c0 c10ec630 -> 00000000 00000001", + "bfa6b570 41bbe007 405ac41f 405ad001 -> 3dc28dfd 3dc29c2f", + "c1207d01 419e9ca8 41630d2b 41684f35 -> 3f681463 3f6a9c20", + "c1aa54f2 40e40215 404f20bd 405edc33 -> 3f72edc8 3f7474cf", + "c10877fa 40ca8ed6 c0bb2b53 c0baa709 -> 3dafdc5c 3db1d6f8", + "c12e6fa7 41938f7f c0aff742 c0af52a6 -> 3db6b5cd 3db7f9d2", + "c06b3ed0 417c9724 c16cc4e4 c1562228 -> 00000000 00000001", + "c115ad00 412a444d c19748e0 c19746ea -> 00000000 00000001", + "c1bba97d 412f0a64 c18ba786 c18ba37a -> 3da53f3d 3da55946", + "c0d9d1d0 40cb4874 c0f729b9 c0f6fc3f -> 00000000 00000001", + "c1375e24 40978e51 c0a1701a c0a113c6 -> 3eb15b4e 3eb1de42", + "c19d77f5 401e40c9 c142a98c c142a5be -> 3e88d173 3e88d8d7", + "c199c3fc 418d667c bea88f93 be9c666d -> 3f049db5 3f04dcf4", + "c0b7adbc 41ac481d c137d7a1 c137d5c9 -> 00000000 00000001", + "c11fed9f 41a0cad4 418eacf6 418eb4ca -> 3f7bde92 3f7be20d", + "c0a6af80 419710e2 3fed08ba 3fed20c6 -> 3e544e37 3e545826", + "c0bb59a4 41848eab 40af960e 40bb098a -> 3f023809 3f085775", + "c19bb80b 4101f51f 419015b0 41902b50 -> 3f7fffff 3f800000", + "bfac1540 3e0258a5 417ff84d 41800b6a -> 3f7fffff 3f800000", + "c17e7c67 41be7a5a c1260598 c11c97ec -> 3d580db6 3d82d699", + "c161c014 41becfd5 3fff5ecf 40bd807c -> 3ec642ba 3f0a9e9f", + "bfd47a60 415cd801 c03e45b8 c03e3548 -> 00000000 00000001", + "c19b07b5 41ba957e 4088e296 4106f5f1 -> 3f14a6f9 3f3857ef", + "c18a5c6f 41c61bf2 3fee71be 402dda41 -> 3eddeb01 3eed6de0", + "c10ebe76 40a0b967 40b8289e 40b9f49a -> 3f7fffff 3f800000", + "c15918bd 41420b81 41898747 41a4b915 -> 3f7fffff 3f800000", + "c0c2b750 400bbf35 3f523964 3fbef74e -> 3f6d70ca 3f7aed1b", + "bf7747e0 41a7a84f 41296dd5 412c33eb -> 3f0a6389 3f0d69e4", + "c131991e 409979fb 416761ff 418005d1 -> 3f7fffff 3f800000", + "c1a8ba02 417aff96 c126b8ce c126b402 -> 3e50944b 3e509e9d", + "c1989487 41308c25 bf10d762 bf1021de -> 3f2b4610 3f2b4ea2", + "c1059b24 3f2a7314 c1991fad c15231bb -> 00000000 00000001", + "c15cdc1b 40361284 41140ae8 41140d94 -> 3f7fffff 3f800000", + "c18a6fef 418b9e03 c12f4c43 c0a99542 -> 3db405bc 3e8d0dff", + "bee91200 418a8970 c165d0df c14a901d -> 00000000 00000001", + "c1c35c63 41841352 c1272916 c1270600 -> 3e8a4475 3e8a697b", + "c1a6cbc8 3e8e5283 c0a94636 c0a94316 -> 3f540888 3f5409ea", + "c1b20d2f 418fee73 40a63fd6 40a640d2 -> 3f42d2d6 3f42d31a", + "bf7714a0 412c5964 c0efa784 c0efa688 -> 00000000 00000001", + "bc9f4000 4188c1a6 c129c8d6 c122a3ce -> 00000000 00000001", + "be6b3700 41654b51 c102a8c1 c0cdfc35 -> 00000000 00000001", + "c1b29b84 41719ba7 c0ebffba c0ada992 -> 3eb3d67c 3edae35e", + "c027ef70 41ba0eec 41638a6e 4163dfb2 -> 3f382ccf 3f3874a4", + "c155e21c 411d4d19 c146afef c14576a1 -> 3ba0433e 3bbab194", + "c19f8292 401eecab c1732063 c1701e09 -> 3dec2f2c 3dfd9f85", + "c108735a 41c40943 4159e626 4160e61a -> 3f3eeb0f 3f435da5", + "c14e6f7a 418f22d9 c15272d1 c12ba631 -> 00000000 3c69798f", + "c175dfc7 40e0bb77 4190667a 41906cce -> 3f7fffff 3f800000", + "c15b0b2d 412ce48b 41635805 4163a0d3 -> 3f7fffff 3f800000", + "c1836a9b 411c8a68 c10d92a3 c10c8a2d -> 3e4f53a8 3e527206", + "c1038af8 414befb1 c1325e6c c1325b30 -> 00000000 00000001", + "c059d110 4084f5fb 3ffd5e4a 40031e7b -> 3f4c94bf 3f4f70a1", + "c197ed48 419335c0 412f5582 4161de7e -> 3f659bf6 3f76aff3", + "c12f7933 416a2bc4 c1893fb6 c1893f7a -> 00000000 00000001", + "c0da2908 416bb4db c0aeaa50 c0ae6038 -> 3c3b53dd 3c3dc606", + "c16efc88 413936ce bf93cc6a bf84bcf6 -> 3f079c39 3f094fa2", + "bf066360 415f1d06 c19c631d c19c62d1 -> 00000000 00000001", + "c138e0aa 41941c05 c13374b6 c1214672 -> 39c640f3 3be4dd45", + "c09037ac 41602fb5 419aca08 419acb2c -> 3f7fffff 3f800000", + "c0c0e6f4 41854c05 416923af 41693391 -> 3f79e10c 3f79e6ac", + "c1a6ef30 417d5694 40abfeb9 40b1a337 -> 3f4d7a86 3f4ef987", + "c1550285 3fa476ba 4106305d 4128c723 -> 3f7fffff 3f800000", + "c17f8bf7 41a8f692 4109cf8c 411331cc -> 3f3c4edb 3f41abe5", + "c1c275f9 41b1a9dc c159f357 c159eed7 -> 3e094a24 3e0950b9", + "c1c08d79 4172df96 c13fbd5a c13faf76 -> 3e6779b7 3e6796af", + "c1a904a6 414eeab9 c1966b4b c1962aab -> 3c5a97ee 3c606c1d", + "c1471a03 3d6fcdb6 c18658e0 c18658ac -> 00000000 00000001", + "c11f517b 41b869c7 c11ee045 c11edf71 -> 360d132b 360f2551", + "c0dc0cd4 3f930697 c1350026 c129c75e -> 00000000 00000001", + "c08ad500 41a4aaf5 c1827431 c13f616c -> 00000000 00000001", + "c08f20a4 4066ecf2 40d76628 40e0bbd8 -> 3f7fffff 3f800000", + "c1c46c31 41400f95 41110ec8 4159b280 -> 3f7b4e5e 3f800000", + "c16f999d 419b1f83 c178748c c1787232 -> 00000000 00000001", + "c15595f4 415f4c8d c15932b9 c1566a9f -> 00000000 00000001", + "c11ecbb2 405acf9d c16213c6 c161bd12 -> 00000000 00000001", + "bf382300 41932b1f c1165c0d c1161bd3 -> 00000000 00000001", + "c122c6f2 41845e7d c1b73b38 c16cc878 -> 00000000 00000001", + "c1070dee 411c1c6d c097827b c09778dd -> 3ddc3e19 3ddc5f05", + "c157c95a 40da4615 bf19b614 bf19aeac -> 3f326b5e 3f326be2", + "c0776a58 4106f015 bf3909ba bf390146 -> 3e266f10 3e267232", + "c19c364c 406e0257 4054681e 40956a11 -> 3f7fc670 3f800000" + ] + }, + { + "glsl": "vec2 cultmath_iv_lerp(vec2, vec2, float)", + "tolerance": "ulp-bounded", + "cases": [ + "41469202 4146934e 40729cfb 4072a825 3f6215c1 -> 409987c9 40999198", + "4047727b 40477d95 40eef7b8 40f6ac18 3f2e77d9 -> 40c29b1c 40c7e4a6", + "41920a3e 41920aca 417297b7 41729db1 3dcca9a7 -> 418f912c 418f9213", + "c0b88e68 c0b7fa4c 41410a23 41411335 3c2fac75 -> c0b271a8 c0b1dbc4", + "c0b91ba7 c02cab62 40f4a9f2 40f4b186 3d9607c4 -> c0a0dc2c bfdb6524", + "c166d429 c1565443 c1177a3f c1147841 3dffd8bc -> c15efa1d c14c0a5a", + "c12ccc50 c11812d6 c169174c c168d700 3f20f8d8 -> c15fbdda c13dd3e1", + "be8facaf be8f9051 4167b171 4167b2b7 3dacf23e -> 3f774662 3f77577a", + "c132e1bd c12e4531 3f8e222d 3ff2a9f3 3ea2078b -> c0ec37d4 c0d81f6d", + "c080565b c08052a1 408ffb93 4090082d 3e00e955 -> c03c1d10 c03c1180", + "40347d1a 40354506 41724ed3 4173b83d 3edd3efc -> 41023ef6 410322b6", + "4183ea2f 418400e1 c07bf317 c07bee49 3f3b1dd7 -> 3fc69298 3fc90e30", + "4116b5d8 41499b08 c1951155 c1949c4d 3edee28d -> c085ad12 3ed38e20", + "c18b73c8 c13db247 c01d363d c0168163 3f1b60c9 -> c13b9fb8 c02d03c4", + "c107c39a c1065900 4101f15d 4101f4cb 3f496015 -> 409043f4 40955902", + "41013e7c 4101586c 41746a68 418d8f74 3f2c6b78 -> 414ebee0 4168fbce", + "c199606f c1995e9b c1972292 c196c834 3f0de496 -> c198235f c197ee71", + "41291bd9 417be437 3fefeea9 3feff237 3f37679e -> 3f222580 411839c5", + "c185f261 c1843f23 412bd7ee 412bf42a 3e9e4f6a -> c104fa7a c1007e1c", + "c0e4e4a5 c0deb867 419b8ebf 419b9975 3e3af08f -> c01547e0 c0069ec8", + "c007f20c bfeb23c7 c19dddc2 c19cbaea 3f56400e -> c188d076 c183a4e7", + "419881df 419b7ce5 40e94552 41051a8f 3f3ae7b6 -> 41232089 413976c4", + "40044742 40063a7e 3f7ceb1d 3f8011b1 3f35d0a8 -> 3fa3b52e 3fab857c", + "401048da 4091aacb c0932f99 40a26601 3f1b3e10 -> c052e59a 40c86661", + "c145c067 c145964d c081d625 bfa845ab 3f05daff -> c10061f4 c0d25f62", + "4089bd37 40b26861 c0f8d9dc c0ac9dc0 3eed12c5 -> bff0626c 3f8acf94", + "c191a4cc c1919598 4025c018 4038ace8 3e6461de -> c1591b3f c157e7ed", + "c0dac4f8 c0dabe54 c087723a c07c6e25 3f12b1e0 -> c0ab09b1 c0a5b518", + "c176a0d0 c17699ba 411c5e7e 411c686e 3e285151 -> c1346417 c1345a34", + "405f761d 405f7e63 c0c4cc67 c0be98dd 3f395fc9 -> c05f6289 c0565925", + "bff93805 bff9255b 419a8e2a 419e70f2 3f7dcd7b -> 4199172c 419cf3bc", + "c1909e5c c1909a54 c172aff3 c172ae89 3e5a8ac7 -> c18ba795 c18ba28a", + "c15964bd c159449f 414c92c4 414ca72c 3f2f6578 -> 408f416a 408fc99a", + "c17130be c12b141a 4153a16e 4153a562 3ec321f9 -> c0beaa6c 3dc0bf80", + "c078271c c076a4f4 4148cdf5 41490403 3efbc6bd -> 40860f12 40876442", + "418d22aa 418eb22a c15f881b c158eaff 3f6f81f8 -> c141ddc8 c135a33a", + "bf325714 bf2c772c 40e3b32e 40e3b7da 3c3fbad2 -> bf1b014e bf150f5c", + "417bfc1d 417c1e9b 4151553f 41568e41 3e3322f8 -> 41747ff4 41759260", + "c1897e75 c1897e0b c1067901 c10613c3 3ed34118 -> c1590308 c158d816", + "4116cb45 411703c7 c0766832 c070953e 3f7c887f -> c06bc5d4 c064460c", + "40cb69fe 40cb870a c15ee071 c15ed693 3ea43a60 -> be1b2240 be158c20", + "419893ac 41989d9c 40263d0a 402658b6 3d445253 -> 41924208 41924c9d", + "c08cbc33 c08cb985 c08328f4 c0832304 3f3b0546 -> c085bf67 c085b66d", + "40ebdf2b 40f61b15 40d783bb 40d7a765 3f4a9353 -> 40d3aa23 40e61b70", + "413b696e 413b6aae c16e202e c16e1fa6 3e9f1f2c -> 405ca398 405caad0", + "c0c9af89 c0c9a8b3 c0d2ca48 c0d2c958 3f4186c3 -> c0d096a9 c0d089f2", + "3f1ee353 3f1f5c2d 40149c4b 40338765 3e8da089 -> 3f8b9e83 3f9d0688", + "c1515b10 c1514ab0 c094c115 c04e8ed6 3d0eb358 -> c14ca7ca c14bcc0d", + "3fd1419e 40395011 40553527 40613d19 3f48ee1d -> 3ffd0b75 408bfd2d", + "4194c2ba 41966b8e c178c3a5 c16ff767 3f396dec -> c0c926bc c0b0f5d0", + "c1975f06 c19259ea c18b58a7 c1834cdd 3e46451a -> c19603cf c18e770c", + "401e2817 401e3569 c1915c4e c1371719 3f7a72d0 -> c18dc936 c1323fd7", + "413b41ca 413b4236 4007f8fd 4009c473 3f084ac0 -> 40d351dc 40d3cd76", + "c168c70c c167fca4 409dc051 40fdb9af 3f0ec006 -> c06dbd98 bffb8fc0", + "c0a92046 c0a9068a 41583b9c 4158478c 3e705052 -> bf5fbcf8 bf5e91f0", + "41971fa3 41976999 bf89cc2b bf8999f5 3eafc6f4 -> 41405e90 4141276c", + "40e533ec 40e535ac 405f5338 405f7fe8 3f389d89 -> 40906eea 4090820b", + "4123d860 4123db7c 4128484e 41291d42 3f36feca -> 41270225 41279fb3", + "419d1779 419d194f c05e3f56 bfd301f4 3e78100a -> 41609c10 4167b29b", + "400c161a 400c3966 c181428d c18141b7 3f25e20d -> c11b35be c11b261e", + "c0368ad0 c0368920 c1316dd4 c1316a28 3eb67d35 -> c0b93893 c0b934d0", + "40ec6335 4137175e 41355680 41366ad8 3e623653 -> 40eb9ce3 41454768", + "c191520f c18e8485 417a5681 417c67af 3e9936e6 -> c1026ea9 c0f50f92", + "4110dcf9 41110d6f c11b202a c11000ee 3f46c061 -> c0b05fbc c09e6e8c", + "41907899 41967b9f c174c672 c174c32c 3f1112e9 -> bfa29c70 bdbdac00", + "c15f1563 c13dde43 419b6b83 419b6be1 3f2e101a -> 40eabaa6 412d2a81", + "4103c7a3 4103f895 c0c08d31 c0bdbab7 3f6a247a -> c099f546 c096a50c", + "40c77a6d 40fc2b03 c0cc204a bfefe30a 3f7c5bbe -> c0fa5337 bde5d6c0", + "4155f0cb 41561615 c1417513 c1416455 3f2a216c -> c0639b4c c0627684", + "c10b8842 c10b7ba2 41485396 414941ea 3f040855 -> 400ee698 40111ed0", + "c166500b c1664fa1 c0dcaffd c0dc83f7 3f2fe6c2 -> c113e1a0 c113d1cd", + "4099e0e2 40ef1d36 c1930554 c191f828 3e3756ef -> 3e38cc00 40560c7e", + "4147c730 418a2644 40ffdff3 412af1c6 3f03cd8a -> 40f6c96a 4182ba16", + "40ac6c71 40ac9f17 c10067f0 c0f5c37f 3f1f714e -> c03e1316 c02fab8a", + "41753c28 41753ca8 c0df9267 c0c55ea1 3f712568 -> c0b6250c c09d7488", + "402e3441 4033236f 413cabf6 413d47b2 3e91c0fa -> 40a90639 40ac8a48", + "4172f4cb 4172f585 c02dbbfb c02ab565 3f0a300a -> 40b0b9bc 40b18d08", + "4103a5de 4103a6fe c1ab76d4 c19195ca 3e85afbc -> 3ef76ba0 3faa03b0", + "4132591f 41428ded 412a3206 41335eb6 3de924c3 -> 412f933a 4142abb4", + "417d7365 41804aa6 c1011a89 c0df5a9d 3cf408af -> 4171f620 4175b4d0", + "41447ef6 41acf9dd c18ff11d c1584c5a 3f21f02b -> c14c733c 40a9a930", + "c1735fa2 c170001e 3fe5d166 3fe728da 3df1dfc9 -> c153a2d9 c14fd847", + "c187a5e0 c187a54c 3f85d364 3f8675dc 3e994dbf -> c1390e84 c13906ee", + "414df6c9 414e7d2f c140f518 c140df14 3f4f2491 -> c0ea7f5a c0e8756a", + "3ff01ab2 3ff0dace c07c2b7e c07b1392 3f54dcb2 -> c03dc27b c03c29cf", + "c185bea5 c185bb39 404fa8a6 405dca2a 3d323aa3 -> c17d97a5 c17d6926", + "4183671d 41836b77 419c0187 419c38c9 3eb8c64c -> 418c4690 418c606e", + "414cf4cc 419044e2 bfc2b919 3fdd3199 3ed5b993 -> 4094b3a8 4156864e", + "c1931cc1 c192b2c1 4066c575 408df645 3e3d7157 -> c16545ad c161d51e", + "4100f2a8 4100fc5c c02974a9 c0284997 3e954e00 -> 409df600 409e3aac", + "c0866355 c085c04b 415bb171 41bc4438 3ef73444 -> 408e55a5 41135d6e", + "4030b1d3 40368e6d 40cc436a 40cc45f6 3f0cedb7 -> 40968bc0 409b187f", + "4171b7ef 4171b8f9 4170bac2 4170d4c6 3e546bc3 -> 41718333 417189da", + "4146c58e 4146c6e2 c1b25131 c1682efa 3ed3e7eb -> bff8cf40 3fa34f38", + "4172529f 41725309 c1259c5a c0be79d4 3f44aac5 -> c08e2192 bf880048", + "c1a0feff c19c558b 4096cdb7 4096de59 3e0519f7 -> c187c669 c182814a", + "413b8985 414d9f5b c16bd598 c16bb618 3f25f407 -> c0c54756 c0898032", + "bffbb2b4 bffb4b6c 419cab01 419cab37 3f4a6cbc -> 41712326 41713a98", + "c10463da c1045914 c0761b30 c075bd10 3f0a2c9b -> c0bc5450 c0bc19bc", + "41925812 419410da c12709d5 c125d197 3ebfb3b2 -> 40ee89b0 40f8eac6", + "407ecaf9 407ee377 bfe202fd bfe1fde3 3ed37225 -> 3fcdb832 3fcdff86", + "c086dff7 c086da95 c1941e8d c1941ba9 3ef5117f -> c130f53e c130ee7e", + "410f424b 41834bd2 c0f2061a bf177534 3f3e4bf1 -> c10de44f 41151092", + "c1a0dbb2 c1687698 be6239f8 3e12ebf8 3f41ae18 -> c1148483 3f4ac130", + "3ede79da 3edea9a6 c1944b31 c194496b 3df7345c -> bfed7f66 bfed6e92", + "406f2374 40754c7c 418e288b 418e3a91 3f4ee734 -> 4170029e 4172e8a8", + "c0d077fe c0cf4aa2 c19da6b7 c187d807 3f07ca91 -> c1588121 c1407806", + "4038b793 403918ed c19ca9ba c14f5cd4 3e81da2a -> c0341639 bf903a0a", + "c1082334 c1081ac8 4125c6ee 41267326 3f794126 -> 411dca2a 411e8276", + "c1099647 c0bd183e c0293cf8 c0222de8 3ef20534 -> c0e1c9f2 c042b41f", + "c19c92f5 c19c918d 3ef444a8 3fddf516 3f5d11a0 -> c0109630 bf9612a0", + "bf037ae5 bf033a9b c1333b89 c0ea6aea 3f518046 -> c1142ece c0c2caea", + "413eae0e 413eb32a 40bd87a0 40bdf0f0 3e1070d8 -> 413125d3 41313315", + "c12285dc c0b0e388 3edc8341 3ee476bf 3e2f3942 -> c112359b c06da632", + "40f12e44 41171bde 3fb10b85 3fb38f9b 3ef041c8 -> 407044b3 40d21ba8", + "c1212338 c1210b6c 3ef25ded 3ef2f793 3f4d53d3 -> bfcf2998 bfcdb3b0", + "41058aac 41058d4c c1078d25 c09522f2 3f4c2902 -> c0a22302 c001a9e0", + "c18b6f5c c10f780c c1323587 c13234fd 3d3133cf -> c18c2fbc c10b1d30", + "c0a16af1 c0a168bb c14fab2d c14fa8fb 3ee94ce0 -> c10a8fda c10a8d3e", + "c18aae47 c189bcb5 c0cfd62e c0cf924a 3f2b72ac -> c12277a4 c11f3a32", + "c092a412 c09266a6 419efd9c 419f1d1c 3f42ab9a -> 41602575 41608b6b", + "c15e3491 c15bdf93 c189f633 c189ea99 3f1d815b -> c1805860 c17cde2f", + "c16c2e6e c167d9d0 c18e876c c18e86a6 3de0a8a4 -> c172049c c16d3636", + "4084fd4e 40d88cb2 41136e06 41158bfa 3f7893f7 -> 40d10770 413ceb42", + "c0ee3021 c0e2a0ab bf02243e beff7384 3f4c16af -> c00cf822 bfc5de84", + "409d176d 40a52e93 c08e1b11 c08e1a37 3ecd642c -> 3f874948 3fb4a2a6", + "40ab7567 40ab7661 c16e65c6 c16d8e9a 3ed54365 -> c0451eb6 c043b572", + "c0d4e6f4 c0d4e184 417f00d5 417f034b 3f24936f -> 40fbd2e8 40fbdefe", + "bed721f8 405a00df 416d4fec 416d7cfc 3f68ae7c -> 411f6fc5 418a3bd3", + "40efe249 40efe377 c18cd562 c18cd512 3f51b23d -> c1510740 c15105a8", + "c15e6a6d c135222b 41087d89 4108acef 3eb3dbe7 -> c0ddad59 c05bf518", + "40b2d254 41054402 40801b55 40853043 3e09c59a -> 40a03293 41023223", + "bf84e8cc bf84b294 c1a14374 c1691ce1 3f7b3694 -> c19e6a9b c16509c4", + "c1742b6e c1732dee 3e874328 3f13bfac 3f46a921 -> c050b614 c03a2224", + "c0aa2179 4045bbc2 bf7d4038 40e2cb77 3ede0b78 -> c0e2bc75 410780c0", + "c097257f c0482011 c186cac6 c186939e 3de0e40e -> c0c75d5a c08e93a0", + "406cde6d 4074fcf3 c0bc62ad c0bc5bdf 3e5d9f38 -> 3fcc9b22 3fe061c4", + "4121039c 412110d0 4109e651 4109ea17 3f3e18aa -> 410fcfd6 410fe9a6", + "c00c0f6c c007e9d4 c11ab41f c11ab399 3e2cdd47 -> c05d9484 c058bb5c", + "c1127035 c0eb8aba 4186d1b7 4186eda9 3f4a26c2 -> 411f7b23 4152f543", + "c16db51d c16d0fab c0b2355f c0b22501 3eb1a532 -> c13a5f2f c1397d7f", + "c140267c c1401896 40ab474d 415346ba 3f730ce8 -> 408f1264 413eec6a", + "414c8493 415e2805 c1761c91 c17564d7 3f0a59a1 -> c0423160 bfa7ea98", + "414b63a2 4178f4be 4170c751 41782ddf 3e6b3060 -> 414982d2 41819f23", + "413e2616 415859ea c1252970 c0885100 3ea8eb2d -> 40808f7e 4103217b", + "41816f3f 4184df5d 3fcf7ccd 4031c34a 3e0f74fd -> 416145ec 416bb46a", + "3d9f06a0 4080a206 40bdda7e 40c78ff2 3f7b10aa -> 3ffa19d1 4120f4a8", + "c188b1d8 c188adc4 c1887466 c1786d77 3c882703 -> c188b0e4 c18878aa", + "c00db8bd c00934a3 4117558a 41175c4a 3f68c2f2 -> 41055aa0 41078893", + "40afe50c 40b070a4 4111a990 4112116c 3ea17e7d -> 40d421a6 40d51aca", + "c0ec1986 bed09998 c1476629 c1476231 3f78d9f6 -> c198c5a6 c0ab299e", + "c108d029 c108cbe5 c0c22e7e bfcb9728 3edfccb5 -> c0eeea35 c0b03c7e", + "bfadda24 bf49dff8 417fda3b 418c724e 3ecbe096 -> 40aa5853 40d7c645", + "41848a13 41848b51 c04f986c c04c02e4 3eef6626 -> 40e9b9dc 40ea97a8", + "405015ff 40876300 c1931c5a c1900e0c 3f48be5c -> c167c696 c14705aa", + "c1215ed9 c1215d75 c1883689 c188362f 3f3139d1 -> c16e41ba c16e3ee2", + "c0cc51b0 405e0ec0 c1886389 c18824d1 3f3cc729 -> c1ac1f92 c08be17e", + "4044f39f 4061c4e1 c0011c94 bfcca999 3f31c979 -> bf460634 3e8f6228", + "415d2fdb 417b88e5 c1581519 c157ec37 3f0b1fdf -> c003c494 3f5fc3c0", + "40f5f9ba 40fbb0ee 4170fd40 4185f420 3f7eba62 -> 416d8f31 418705c3", + "bf3fbab5 bf3fb1cb c14de7be c14de744 3f38cdd8 -> c117f9ad c117f860", + "4006aebe 40c82101 bf8fe427 bf8e66d9 3f396606 -> c04f4b16 407b2785", + "c14ce1a8 c14cdfd8 c0b71eb3 c0b71205 3f793a96 -> c0bd20dd c0bd0d5d", + "bf92677e bf66b884 c047638b c0475e45 3f50cd78 -> c03cc8e2 c02095f1", + "c14d2305 c147fc55 40dbc3f7 410c1394 3f1927b9 -> bf9e0890 3ed15ba0", + "411710d0 41197aa8 40b9ddf8 40b9e3f8 3db7d0c0 -> 4111a1a9 4114433a", + "40798378 40799598 c12d581d c12d575d 3e58131a -> 3f4a27e8 3f4a8240", + "c04a1bdc bff23b48 c18f835f c1897ddb 3e081fb0 -> c0a950a4 c0707772", + "40cb7054 40cb806c c192ada0 c192ad6c 3f03bcf9 -> c0cb3518 c0cb1c4c", + "41196be5 4119eb6b 4187cf52 4187eb0a 3d8d5956 -> 41218b7e 412217a5", + "c19a6c17 c19a6941 413d7e30 413d7ec4 3f4fc0a7 -> 40bf1c28 40bf31a4", + "4132fc52 41330eea c0e29a4d c0e238f7 3f7be526 -> c0d95f48 c0d8b5bc", + "4195ffa2 419604ae c1009dff c1008d09 3e01c649 -> 4175ac2e 4175b9b4", + "418a178a 41a367be c0fa033f c0fa0221 3f0963dc -> 4006cfb8 40df0074", + "40c32cbc 40c705e4 4018fb36 4115a6ae 3e206f2d -> 40affa23 40d7564b", + "41872725 4188bf6b 40f9bb6f 40f9e4c1 3f5bafdc -> 410ec25c 4114c15a", + "c129bc5e c123fc08 c133e2d8 c133e17e 3d941510 -> c12ae2b6 c124b7d2", + "c0a79709 c0a73837 c140445b c1403dcf 3edcd1da -> c102a859 c10261aa", + "c17cbfcf c17c4231 40ac564c 40c94e84 3e2818ca -> c14531ad c1423eba", + "c0fd4f96 bfd1a4e8 40f214d2 411e483b 3f0b23a9 -> c03a8040 4100a967", + "4159a147 4159a519 41680f68 418a799c 3ed47f69 -> 415f9ce2 417243ca", + "c07ef034 c079c48c 413f1acf 41642139 3f62fe07 -> 41211516 414459d3", + "c1748b3f c1721d91 419a2cde 419aa972 3f3ea3a0 -> 41256121 412a5751", + "c11b1b83 c11b1ab3 c1431e1e c14316be 3f41ecb2 -> c1396b16 c1396412", + "400b4b32 401fa31e c18bebcd c18b2911 3edcc885 -> c0ce1e2f c0be3f75", + "c18a36bc c1231115 415b1022 416be4fe 3f46ae46 -> 3fa122e0 416a8b77", + "418071d4 41a95574 414635c1 4155acb7 3c943922 -> 417e590f 41a8f15e", + "c1962b72 c18cd408 c0deea3d c0d6026f 3f2bbede -> c13a27f7 c117f3b1", + "41377b50 4138d4a8 c0dde206 c0ddb1c2 3e9f7bc8 -> 40b6b3d7 40ba4cb6", + "bf9ffc57 bf9b2fe9 c1837a89 c1837a2f 3f68110a -> c170c96c c16fa408", + "c0ef94a9 c0da565b bfa86428 bfa857b8 3f7c3158 -> c003ecaa bf3e3c50", + "c166a746 c166a572 c0fdb305 c0fd1293 3e844ba1 -> c14bd55d c14bbe56", + "c03d627e c0221292 c19899ca c198992a 3f6be184 -> c1919d30 c18b0d51", + "c15777fd c1449241 c149aa91 c148e043 3f3309d1 -> c15b082f c13a5d9b", + "c01d354c c0009444 3e573434 3e946066 3f78431a -> be9bc638 3f277470", + "41976599 419774bb 41064d49 41065813 3f76455d -> 410c976f 410cdd32", + "408cf5ec 40de368c 412cea85 415e4c6b 3ee8f1f3 -> 40c53428 41342ded", + "c13fa2c2 c13f4216 40f53a02 410cf74f 3f60e454 -> 40a830c8 40c9dabc", + "4184bf41 4185091f 416d495e 416d8392 3e754617 -> 41814cbd 4181af45", + "c18c82fa c18bfeac c12cf2f3 c12cb74d 3e08995a -> c1855f45 c184c557", + "40c60744 40c62b8c 4000da9f 400133f1 3eecb63c -> 408831fa 40887bae", + "4068e617 40690619 41779b46 41779d7a 3c434dc0 -> 4071ed65 40720de4", + "412a1150 412a44f8 c19a63c3 c19a25a3 3f1dd492 -> c0fa8e40 c0f94e0c", + "3db3a340 407c87c6 c17124bd c16e8deb 3f3875af -> c159d766 c0db8933", + "41023db7 41023f25 c0a4ff23 c09e97fd 3f48b9ab -> c012464c c00831a8", + "41829389 419263c7 c187c8c5 c187be6d 3f6876f6 -> c17b4fea c13ee484", + "c06374b2 c0636c1e c10e9326 c10e90d4 3e9d4d5f -> c0a6662c c0a65f24", + "c0eff23d c0efcd6b bfc64f8d bfc46213 3f5d2d2b -> c0173206 c015d396", + "418d5104 418e02c4 3ff25766 40392aed 3de6988e -> 417e106d 4180b490", + "be564c82 be383f7e c0b3609e c08dc942 3f306948 -> c07cadb5 c045b286", + "c163af1e c163708a 405602c5 406d464b 3edc1abb -> c0d5d197 c0d01e85", + "bf937944 409b37a1 41792d15 417a394b 3f0791cb -> 4090d84f 415be1a6", + "41145a98 41145df0 3fec68fe 3fec9bc2 3f19cba8 -> 4099f28c 409a04e0", + "409c4cf1 409c512f 416afca5 416b0043 3e9b9c45 -> 40fba111 40fba8cc", + "c1336d46 c1331f64 40e662a4 40ff2dbc 3f4720f8 -> 4046057c 406ec178", + "c176531a c175702e 403aab38 403e2bf8 3e93f102 -> c121ebdb c1208696", + "c01c5f62 c01aad3e c119edd0 c11707f4 3f437d4b -> c0fe37d3 c0f84bfb", + "41978ca3 41980785 4019e129 40339b47 3f42d0f5 -> 40c9f880 40d7241c", + "c0b762a6 c0b6e03e 4163c36d 418cfcca 3e07543f -> c0460812 c0283864", + "4126927b 41269325 c0e41a3b c0e4121d 3efb201d -> 3fe77288 3fe78a58", + "c0bf53bd c0bafe6b c149a369 c14911fb 3ef03e08 -> c11267f1 c10ef4c8", + "40e8b900 40fa2290 41211121 416c1f7f 3ea0cf3f -> 40ff560c 4122aeb2", + "419f2d10 419f3db8 c0c9a12c c0c98de8 3db8f9ca -> 418c3d94 418c502c", + "c141e893 c101b655 417c5b32 417cbba6 3f205d32 -> 4035b5e4 411612e7", + "c18b08c3 c18a6a2f c162749f c1623bf9 3f726e6c -> c1665d49 c163be23", + "4132643d 41335f97 41343377 4136e881 3c8ffafa -> 413267f6 413373e9", + "c1883a1a c1883750 c0a0cf63 c0a0cdcd 3f6fcd85 -> c0b92724 c0b9100c", + "41483d8c 41484a64 41211316 4121166e 3d99a116 -> 41454c75 41455a84", + "c132dad7 c12a542b 40a75abd 40a7b34b 3f43730c -> 3f7127c0 3ff1eaf8", + "4197f45f 4197f501 408b80b5 40b1d4c3 3f628e71 -> 40c15b5a 40e34baa", + "415955d4 4159580c 415dc277 415eedf9 3ed915ab -> 415b351e 415bb744", + "412f701f 412fd701 4124199c 41252554 3f309172 -> 4127573e 4128bdbc", + "c19055b1 c1379c66 c1754b19 c137fc9b 3e758727 -> c197bac9 c11e82c4", + "412d33ed 412d345f c1096c91 c109589d 3e8e0812 -> 40ae10ca 40ae1cff", + "418f5459 418f55c7 4107bfc2 4107e86e 3ecc66cb -> 41626872 41627caf", + "c11dde4f c08e17d6 4117a4be 411b034e 3f78dde1 -> 406a775c 41691dd1", + "409df883 4119808e 419337b2 41984e42 3e36410f -> 40d02352 4141a8e0", + "4188bd08 4188cd34 413fd36f 41422b91 3e263061 -> 41821a39 41825db8", + "c0d6afb3 c0d50b65 c147830d c1470c09 3f71a8e4 -> c1431fb5 c14116d3", + "c117d92b c116912d 410915ab 41091879 3f7e2afc -> 4105beab 41084f17", + "4190df11 419a1d13 c1091698 c1084d5c 3f6fe3fe -> c0ff19b0 c0b60408", + "40da22a2 40da9cbe c0050e93 c005027d 3dd29a3c -> 40bcd037 40bd5781", + "414d97ba 4155a696 c182bfa0 c1820722 3c04856b -> 4149bfdd 4151e265", + "c186cadd c0eb79c5 c082de10 c0662321 3e9fee96 -> c17d3f2d c04e0034", + "c08b58eb c08b5021 40c2c047 40c2c671 3f71c9f2 -> 40b02c0d 40b042f7", + "c0f81982 3e64c730 c1339e63 c13350e1 3e0abc42 -> c114de9b be7a6ea8", + "4119e1e4 4119e7dc 403281ee 40412482 3ba2e88f -> 411956cf 41196177", + "416ad79f 416d9901 c05de02f c009dfe1 3f01e387 -> 40ac4b1e 40c9e914", + "c023efd3 3ffd7f46 40a315e4 40a48544 3eab65a8 -> bfc25b39 4091e391", + "406c3922 406d5ace 40794292 407af44e 3f3f1fd0 -> 40751c88 40785a48", + "c1144e74 c1144b52 4190a935 419faa17 3f1a08b1 -> 40e60294 41051464", + "41270d24 41270fbc c17999b9 c1781c6d 3f07fc52 -> c0591b90 c055e184", + "40f37d89 40f38747 419da4b5 419da507 3eb9890f -> 413fdf68 413fe647", + "4072c1b8 4072cd08 c04dbef7 c0484d29 3e0e54a8 -> 40346939 403537d7", + "3ffcaa3c 4002a542 404d8c48 404da3c8 3f51d34e -> 403bb98d 4043a5f1", + "bfd350c2 bfc95c3e c17eca1e c165499a 3eb4384c -> c0d67a30 c0c128d4" + ] + }, + { + "glsl": "vec2 cultmath_iv_snoise_ball(vec3, float)", + "tolerance": "ulp-bounded", + "cases": [ + "42368d6a c13bbc84 41bc0454 3fb57e94 -> bf800000 3f800000", + "4212e198 40cbcec0 c1c23f76 3fb7d5f8 -> bf800000 3f800000", + "c22bf0db c1ccd7de 41a6f8d8 3f8949ca -> bf800000 3f800000", + "420661d0 c1a60ee7 41fdb588 3f0e5767 -> bf800000 3f800000", + "422f8640 410fc954 c204cfde 3fbd7437 -> bf800000 3f800000", + "c0f11528 c23c7a7c c2434da2 3f3118f7 -> bf800000 3f800000", + "c1f2e3b6 41a20c3c 411a55cc 3fbe8bb8 -> bf800000 3f800000", + "c23a010c c20f33aa c1fdb69e 3d9fed1b -> bef85cca 3f423b6d", + "c1b77660 c1ce9199 40ef66a0 3f1da819 -> bf800000 3f800000", + "bfff2740 c1acf18f c203a3af 3fcc7d26 -> bf800000 3f800000", + "c181e23e c0a06d78 c16f2060 3f2f4717 -> bf800000 3f800000", + "c0df1ad0 c24257f9 41b7d004 3f13940e -> bf800000 3f800000", + "c1094fac 408656e8 4005afd0 3ffd01aa -> bf800000 3f800000", + "423589b4 c21fc601 422aeea0 3fed7813 -> bf800000 3f800000", + "c14e85fc c130df5c 3f9f1720 3ea905bd -> bf800000 3f800000", + "423ae466 3fa66200 419261dc 3fed9dc0 -> bf800000 3f800000", + "c22f90a0 41881efc c1bbb28b 3f982893 -> bf800000 3f800000", + "41ae1770 3f74b8c0 41ee110c 3fa7b8c4 -> bf800000 3f800000", + "c101a7f0 c1512468 c11c5a6c 3ff98d02 -> bf800000 3f800000", + "418e9b38 4187c908 42261d5a 3ebb0a34 -> bf800000 3f800000", + "423d1e1a c1992387 c187fdbe 3f7c8cdc -> bf800000 3f800000", + "4141c564 c1f45a9e c2261cc7 3eae9cf0 -> bf800000 3f800000", + "c1946eda 416b93b8 422ea960 3e3a80e3 -> bf800000 3f800000", + "41d91d00 c2457f28 420494d6 3fd321ca -> bf800000 3f800000", + "41d582c4 c0f85730 c1af430e 3fc29fa4 -> bf800000 3f800000", + "41c70298 c211c29a 40e0dbe8 3fe7985e -> bf800000 3f800000", + "41c384ac 42125bf4 40dddfd8 3f95b340 -> bf800000 3f800000", + "419ea138 42350398 c1c88b68 3fb38b11 -> bf800000 3f800000", + "c0255310 c187dac8 c1f68545 3fa8a8bb -> bf800000 3f800000", + "c1fd9c23 c1f80651 c19a5d15 3fddd94b -> bf800000 3f800000", + "4108b110 c221e416 c1b03beb 3e111679 -> bf558d8e 3f800000", + "40e94c20 41a593d4 4219708a 3f5374ca -> bf800000 3f800000", + "40722110 40f86c98 c1e9acb2 3f03316a -> bf800000 3f800000", + "c131e7d4 c209efce c0d4d978 3fd657b6 -> bf800000 3f800000", + "41bea580 c0eec080 41c6e380 3fc15d65 -> bf800000 3f800000", + "41485ad0 3c835000 c0345ca0 3f3977e0 -> bf800000 3f800000", + "c123557c c1d3a13b 413a4f38 3f620ae0 -> bf800000 3f800000", + "41fb86f4 c202e154 4162a790 3f93beda -> bf800000 3f800000", + "c219dc5c c108f8d4 c2021f1d 3fa7567c -> bf800000 3f800000", + "420e5b5c bc34e000 c186a0a6 3d9b44b3 -> bf16e2a0 3f1e411c", + "4240eb6a c2095930 c2354f42 3e780049 -> bf800000 3f800000", + "41c3b3e0 424561ca c196181c 3f2381e6 -> bf800000 3f800000", + "421eadca c1688d60 4228236a 3fc1f9dd -> bf800000 3f800000", + "c0bba748 40a5e090 c1cef40c 3e2f92e3 -> bf161964 3f800000", + "414586d4 42271d0e 4189f854 3f2cf0b5 -> bf800000 3f800000", + "c223c9e4 c0b85ad0 411d46c4 3f3b0f3c -> bf800000 3f800000", + "422e63ae 41519470 c20fcb23 3ff97433 -> bf800000 3f800000", + "42402f4e 41dffedc 4240855a 3ef487cc -> bf800000 3f800000", + "c22287bd 41a8f2a8 41da53f4 3f700e36 -> bf800000 3f800000", + "c09502a0 c16e2350 413bac30 3f4f3c94 -> bf800000 3f800000", + "42293b70 c1a20da0 408e70c8 3f6b884b -> bf800000 3f800000", + "c1c6097c 42199fe4 c211c68c 3f905098 -> bf800000 3f800000", + "c202c42f c2243af8 c23bfc52 3ff029e6 -> bf800000 3f800000", + "4202f888 4245b58c 4232c252 3f8a469c -> bf800000 3f800000", + "40baa8e8 41915ab0 c1fc414e 3e69a4ea -> bf800000 3f800000", + "420d2cee c181a09c c1812962 3e6fe965 -> bf800000 3f800000", + "c14aa2c8 41918ab8 41832378 3fbaf57d -> bf800000 3f800000", + "41df2430 41da2c28 4152f0bc 3f0b9955 -> bf800000 3f800000", + "c19f9bf9 c1b99959 c1090538 3fcb0f0e -> bf800000 3f800000", + "421f268e c2109520 c21af7dd 3dd692ca -> bf7b89c6 3f2fad88", + "beea2c00 40f66a50 41f110dc 3fe41ea0 -> bf800000 3f800000", + "41c7f780 c236b8f3 c10e69e8 3e4c7f23 -> bf800000 3f800000", + "41d36e08 c1d59995 42241ac8 3fc59853 -> bf800000 3f800000", + "c205682c 3ebb1c00 40a4df48 3f95d7ac -> bf800000 3f800000", + "42378de0 c0e70220 c225707c 3f921c17 -> bf800000 3f800000", + "c1dfe3af c1176138 41e3aaf8 3f4d2466 -> bf800000 3f800000", + "c087b938 41ce324c 415c312c 3f8f44f8 -> bf800000 3f800000", + "40ffb6c8 c20a7a9c 416340d8 3f57146a -> bf800000 3f800000", + "40dd29b8 c212e472 413d24ac 3f0d76ab -> bf800000 3f800000", + "406a7420 c0a7f7b8 c1553590 3f293677 -> bf800000 3f800000", + "c1b74053 40ce7818 423a5abe 3f8bd0ba -> bf800000 3f800000", + "4210fb4e 421009de c21dad4c 3fcc03f7 -> bf800000 3f800000", + "41ad2ed8 4203b2f2 4205af0c 3f70cf4a -> bf800000 3f800000", + "c23324a4 408691e8 4204b5a2 3e3954bf -> bf800000 3f18d1e8", + "41e9ef9c c11e7534 c0d4f498 3ffe01eb -> bf800000 3f800000", + "c11714f4 420ca052 3ff97c00 3f9c557c -> bf800000 3f800000", + "41118bf8 bf73ddc0 c1ede5c9 3d8c11e0 -> bd762900 3f800000", + "421a2d0c c1b38777 c2349b83 3f82f982 -> bf800000 3f800000", + "c22f92e0 41ccfe84 c1a053e2 3fa7e1c7 -> bf800000 3f800000", + "c0c19868 c1d112ce 4072a6f0 3f99024d -> bf800000 3f800000", + "417319c8 4208507e 42092dca 3fc033a1 -> bf800000 3f800000", + "c1905352 c203369a c153c478 3d61a9c0 -> be650587 3f276475", + "c19f3429 40345360 bfd30540 3e8b5e3b -> bf800000 3f800000", + "c2426064 c148bff4 4229d57e 3f56ddc2 -> bf800000 3f800000", + "c235fcdc c1675b88 4235fbe4 3f3e9d56 -> bf800000 3f800000", + "417bf308 c22b2991 42248ec0 3f61e0ff -> bf800000 3f800000", + "41e09cec c18dbb94 c1119940 3f17ae44 -> bf800000 3f800000", + "c1ce07a4 c2018983 4170dc08 3f8dd1f4 -> bf800000 3f800000", + "42113844 42066270 c17f8f64 3f90a432 -> bf800000 3f800000", + "c2448d78 41d70ff0 c1a7496d 3f56ad3b -> bf800000 3f800000", + "c216de59 c201c5de 41ba2cb4 3f37156e -> bf800000 3f800000", + "41e9a8e0 42251fee be896280 3fafcafd -> bf800000 3f800000", + "4204a9c4 4218168a 4130f004 3e2d2cae -> bf800000 3f58ee06", + "c1ad0a96 c205a055 4230023a 3f947e6b -> bf800000 3f800000", + "422bc1be c11cb574 423bf572 3fff2bb6 -> bf800000 3f800000", + "41d25f6c c22b4d37 41e3ad94 3e80484c -> bf800000 3f800000", + "42170e32 422be6a0 c1b5e76b 3eb6cae1 -> bf800000 3f800000", + "c23a4c24 c1605318 c10ecc08 3f0d99e4 -> bf800000 3f800000", + "c22e322b 406624d0 c1c8adc6 3f76dda1 -> bf800000 3f800000", + "c1807fd6 40ad3750 416e1ae0 3fde3696 -> bf800000 3f800000", + "420234fa 41b1f924 c064dac0 3f39a1a8 -> bf800000 3f800000", + "40d1d3e0 40d49970 c1b7f2ff 3fb28011 -> bf800000 3f800000", + "421e6036 41d05848 4158a21c 3f9b5482 -> bf800000 3f800000", + "41ef2510 c1a4b1b2 4179a788 3dd32d91 -> bf13fd28 3f800000", + "c12e72a4 412c9bac c00265d0 3fdcc5ab -> bf800000 3f800000", + "41604e90 c1909fe0 4173a508 3f71ba59 -> bf800000 3f800000", + "c0436750 c1847e52 c2402a00 3fbf740c -> bf800000 3f800000", + "4226b68e c0860320 c1cfa023 3f404b47 -> bf800000 3f800000", + "41ca97d4 c21f3915 c20380d8 3da7d9c1 -> bf0ce864 3f414878", + "412c01d8 c0f876c8 40bda7a0 3f1f82ed -> bf800000 3f800000", + "417f8088 40f19d90 c1ae4615 3f0c626f -> bf800000 3f800000", + "41b38564 41f35a30 c01175c0 3fc53f00 -> bf800000 3f800000", + "4217f86c c1f18b81 c223a0b8 3fbb4c1a -> bf800000 3f800000", + "c22a32b8 41e531d4 c1d9ca3b 3f81aced -> bf800000 3f800000", + "c22becae 4244f3ca 421d1c1a 3eed214c -> bf800000 3f800000", + "4095e970 400ee170 41e04414 3f604e92 -> bf800000 3f800000", + "3fff86a0 c1bfe497 420d53fc 3fb277c2 -> bf800000 3f800000", + "c216d800 4138daf8 c0b48cb8 3ff7f830 -> bf800000 3f800000", + "c2348e08 c204a162 c1ede4a6 3e056fca -> bf158d87 3f800000", + "c2392ce5 c14279dc 41c5f7b4 3faa5a9d -> bf800000 3f800000", + "420ed832 c1c8a15d 42131ffe 3fb806db -> bf800000 3f800000", + "c1547eb0 3f65b140 c19f64e8 3ff77de4 -> bf800000 3f800000", + "4215ac08 4183f47c 423c1fd2 3f9d855d -> bf800000 3f800000", + "403d50e0 c1898964 41d37bb0 3e8d1a1e -> bf800000 3f800000", + "41ec2350 4209bc5c 41cb1708 3f6dd794 -> bf800000 3f800000", + "42345920 41e03a10 416bfab8 3f078e84 -> bf800000 3f800000", + "41cb97ac c21712e8 41924e64 3fe7f7fb -> bf800000 3f800000", + "41062cf4 c206c510 c044e300 3fb11fb9 -> bf800000 3f800000", + "c1cc1020 c1da00b2 c1497a34 3f1891b0 -> bf800000 3f800000", + "41773870 c22f5a45 c22bbfba 3cbc2c13 -> bea75872 3d1fd730", + "4237c028 421aa0fa 42011f92 3f6a9b89 -> bf800000 3f800000", + "41685bb0 420361bc c0c316e8 3fb87e0f -> bf800000 3f800000", + "c1197ce4 c22de45c c1b8636b 3ec5c2c3 -> bf800000 3f800000", + "41475814 c1ad724a 41ab86a4 3e1e49e4 -> bf800000 3f800000", + "4122c28c 4125793c 4239b078 3efb2394 -> bf800000 3f800000", + "42026f92 c1288478 c13b60f0 3fb61469 -> bf800000 3f800000", + "c1f36f24 c1b123ee c14fad10 3f1ad87d -> bf800000 3f800000", + "423599dc c0550050 bfdb8240 3fbbd2ec -> bf800000 3f800000", + "41daf82c 41c24c28 3efa6b00 3e04a41c -> bf800000 3eadf9d6", + "4236fd76 c1f85e26 413eab08 3fed1321 -> bf800000 3f800000", + "41929fe8 4238f08a 3e4de200 3f84d214 -> bf800000 3f800000", + "421d6ca6 c1b2c9e0 c22d243b 3ff63525 -> bf800000 3f800000", + "3fa78a60 c1a2336e 419cba74 3dd3371d -> bec7f0e7 3f800000", + "c2210abd 42024d0a c1fc1443 3f909e71 -> bf800000 3f800000", + "3ebc9b80 c21b5185 c1be3559 3f3be2f6 -> bf800000 3f800000", + "c08597f8 c2113843 41d5399c 3feff853 -> bf800000 3f800000", + "4103dedc 406625e0 c101955c 3fe1bc28 -> bf800000 3f800000", + "41dea40c 41702cb8 c218424a 3f533064 -> bf800000 3f800000", + "4241b38c c238b9a2 40c51a40 3fdd2291 -> bf800000 3f800000", + "421d1100 4211b82a 41fe08e4 3feb52e2 -> bf800000 3f800000", + "c1e6db78 c1127164 41e73224 3fa82c41 -> bf800000 3f800000", + "41d8a584 c0da5ef8 4159daa0 3ff2af2e -> bf800000 3f800000", + "40b981a8 42301390 40c1f778 3fd88985 -> bf800000 3f800000", + "422aeb98 c1c5fc42 c04e2e70 3f8beb2a -> bf800000 3f800000", + "c1f35889 40cee8b0 422e77e2 3f37417f -> bf800000 3f800000", + "420f0066 c1fba859 c1fd41e1 3fdcf0be -> bf800000 3f800000", + "c200d76d c1ad04fa c22d43c0 3df4714d -> bf800000 3eb521ea", + "c1bcac7f c18f1254 4189a08c 3fa3ba91 -> bf800000 3f800000", + "c1a4abed c17b2028 c209e961 3dcdd711 -> bebc5798 3f800000", + "c1734554 c21c16c5 c20561f5 3e9ab5ee -> bf800000 3f800000", + "421febb6 c0394630 c18d0088 3fd693ae -> bf800000 3f800000", + "c22433c0 c1b52288 bfc17c60 3fbb5bc9 -> bf800000 3f800000", + "40e14a20 c241e4ef 41865698 3f281c92 -> bf800000 3f800000", + "422b4048 c0802eb0 c22f5309 3d58fc10 -> bf08a931 3e9eb1e9", + "c1dbf6d2 422a67ec c0075000 3f79847c -> bf800000 3f800000", + "c1582078 40f63e18 41930a98 3ef2e26a -> bf800000 3f800000", + "c1b9796d 42287de2 40a52780 3f959f50 -> bf800000 3f800000", + "c22114c0 c1033104 c1f14ce7 3e31255d -> bf800000 3f800000", + "c12303d4 41e4689c c0870b70 3f460560 -> bf800000 3f800000", + "4210ac18 c1777d98 41dac9cc 3fe78450 -> bf800000 3f800000", + "41ef12cc c183eadc bf8f4be0 3eff405e -> bf800000 3f800000", + "41752e28 c1798e90 41a9018c 3fd594b6 -> bf800000 3f800000", + "c1aeea02 c2144fd1 4201e4c2 3f582e85 -> bf800000 3f800000", + "415178ec 418f9198 41e49764 3f25791b -> bf800000 3f800000", + "41e5cca4 c22539a2 40dfd960 3eacbac0 -> bf800000 3f800000", + "41b19398 4220407c 415719b8 3e9c7d39 -> bf800000 3f800000", + "41fd8308 41030330 422bf4e0 3e927a8f -> bf800000 3f800000", + "c2472468 418c305c c20645a7 3fe139b2 -> bf800000 3f800000", + "c20afcfa 40ee8948 419697b4 3d783d2a -> be94a519 3f2cccb4", + "c224bdde c0d04b28 4105b754 3fec9647 -> bf800000 3f800000", + "c1e805c5 41adea20 c19daeb9 3ff7d4ee -> bf800000 3f800000", + "41153bf4 41dd2598 c08f9dd0 3fb802f9 -> bf800000 3f800000", + "4247e89a c2120560 411eb9e4 3fc65cf8 -> bf800000 3f800000", + "41dc4adc 41285a24 c1fe1feb 3fe5f490 -> bf800000 3f800000", + "41a08848 c182dfc8 c0d996a0 3e1315f4 -> bf800000 3f800000", + "c109620c 40dba650 4204d448 3f9b37ac -> bf800000 3f800000", + "4239f5d6 423200c4 c1b8788c 3de8daf1 -> bf800000 3e87fcb4", + "42447cf4 41ccbcc4 c1d43c62 3f349079 -> bf800000 3f800000", + "3eac4500 416950f8 42375140 3c264d95 -> be20fe00 3b920130", + "411c5f60 418516bc 40bd3448 3da7ac80 -> bf4efa59 3efdb8d2", + "c2154b7a c1e702be c20edca0 3fde04f9 -> bf800000 3f800000", + "c229964b c130ad84 c21e4170 3f8c2b4f -> bf800000 3f800000", + "c12c7b84 41e805dc c188ada6 3fc07a13 -> bf800000 3f800000", + "c246d690 3f9c62c0 3f7fdc00 3fa43a0b -> bf800000 3f800000", + "421a20ca 419d6ba4 c246bac5 3fa60025 -> bf800000 3f800000", + "3f33c4c0 c1220330 41b5f294 3efa16db -> bf800000 3f800000", + "422018d0 c1ca827d c1b6e59e 3e8518f4 -> bf800000 3f800000", + "416b1520 c200e4b0 c19f9dd9 3d8e7d1b -> be8fb422 3f53d7eb", + "41ddd324 c12d8630 4231d636 3ed02d3e -> bf800000 3f800000", + "c0ed74b0 4239f34e 404091c0 3f935660 -> bf800000 3f800000", + "42084236 41b1ae78 418357e4 3ece6de1 -> bf800000 3f800000", + "c0ea5650 bfda0700 c170e6e8 3ffdbc18 -> bf800000 3f800000", + "c211ab30 c1926e27 c2184c0f 3fe6a861 -> bf800000 3f800000", + "41828c44 42245850 4055fa40 3fba687a -> bf800000 3f800000", + "bfcf5520 421f9928 423ac826 3fd44a0c -> bf800000 3f800000", + "c218b892 423ded62 42202734 3edbfaf6 -> bf800000 3f800000", + "bf85c4a0 c1a41f33 423dc872 3f9c8ea5 -> bf800000 3f800000", + "40d866f8 c19a52d9 c1e3922d 3feba4d5 -> bf800000 3f800000", + "c205534a c0e6dfe0 41f61804 3fc8f795 -> bf800000 3f800000", + "41bba684 4027f450 41fdaa04 3f55cb5a -> bf800000 3f800000", + "421ef87c c1afd084 42457c60 3f291d02 -> bf800000 3f800000", + "c23098a2 c120c3c8 c14e3570 3fddd1fc -> bf800000 3f800000", + "420f3ed0 c1e2be34 41af470c 3f86ebd4 -> bf800000 3f800000", + "42472b28 41a0bc50 c08931b8 3fddab54 -> bf800000 3f800000", + "4200b00a c0a0cee8 41a95058 3e878855 -> bf800000 3f800000", + "3f59d540 41be7694 c0f4bb68 3fd42d72 -> bf800000 3f800000", + "c21f6dfc c1f0f313 41bb6aa0 3ef15f68 -> bf800000 3f800000", + "c21eb3b1 41c6cf9c 42456210 3ff523ff -> bf800000 3f800000", + "c2273bd8 409ef8f0 422cb278 3fd68a3a -> bf800000 3f800000", + "42407102 40e156c8 c209a18e 3e394ece -> bf800000 3f800000", + "42297dc4 c21cc8cf 41ca9858 3f33e7ef -> bf800000 3f800000", + "410ccc38 4196fd50 42290252 3f6e9c08 -> bf800000 3f800000", + "423c4a3a 4230b72e 423947ce 3f12023a -> bf800000 3f800000", + "41fbae34 41942064 422381b4 3ea39a32 -> bf800000 3f800000", + "420eaf2a c20601de c1d92b4f 3fdc19a8 -> bf800000 3f800000", + "4184337c c211af7b 41d289e8 3e615f38 -> bf800000 3f800000", + "c1dd8253 41d13ae8 c0b05f40 3f65a435 -> bf800000 3f800000", + "41d75760 413ea868 4219e3d2 3f00db8d -> bf800000 3f800000", + "c1a4f09f 41429578 c1e971e8 3f4d31b5 -> bf800000 3f800000", + "4241ef1e c22b0366 c1cf69a3 3f537276 -> bf800000 3f800000", + "c1b2f7b7 c1b93279 c1bc5039 3ea5c2bb -> bf800000 3f800000", + "41e44000 41a6e9e0 c20ed107 3f4b4b53 -> bf800000 3f800000", + "416175a8 41d9ea8c 42408084 3fd0f363 -> bf800000 3f800000", + "c17cfe00 c1a304eb c0f0b788 3fc9bd81 -> bf800000 3f800000", + "c1783708 4165d4a8 c214d2de 3fd398a2 -> bf800000 3f800000", + "c1cceae0 c0249b70 419d45b8 3f342aa8 -> bf800000 3f800000", + "c2312ca5 41a9853c 42446570 3ec607cf -> bf800000 3f800000", + "c0136da0 3f546400 c20231ed 3fc8cb46 -> bf800000 3f800000", + "4229b2f4 41fcadfc 41057310 3f4b4a10 -> bf800000 3f800000", + "421478a2 4122bf40 c18c91fa 3f83c454 -> bf800000 3f800000", + "413db9e4 c234bfde 41f5dd40 3fff2d2c -> bf800000 3f800000", + "415ca654 c22c8f0e 4223c4b0 3fff62bc -> bf800000 3f800000", + "c1f28763 c0ff3190 c231c21a 3f2edbc1 -> bf800000 3f800000", + "4231cf76 c10929b0 c2047736 3fcd5709 -> bf800000 3f800000", + "40e61f48 422537c2 c21e3e39 3e174beb -> bf800000 3f49cf31", + "41ae1f00 4233fd3e 4227ead0 3e883e1c -> bf800000 3f800000", + "411c9cd4 c1f2641a 421cbfec 3f86b975 -> bf800000 3f800000", + "41aa4190 c23cc9eb 4226b49c 3fbe4769 -> bf800000 3f800000", + "c19083b1 41358cec c1e9b1be 3ec8d60a -> bf800000 3f800000", + "41858f54 419fd8e4 41aaed18 3ffd0c29 -> bf800000 3f800000", + "41f1fbd8 42455b48 4246756e 3dea39ba -> bf21c8a3 3f800000", + "c09762b0 42055420 4207e318 3f829dbd -> bf800000 3f800000", + "416b38d0 41e11dd0 4201ef12 3ff5499c -> bf800000 3f800000", + "be88fb00 c1c74cc0 41ed74cc 3fab349c -> bf800000 3f800000", + "c214aab0 418bc58c c121c324 3f61e19d -> bf800000 3f800000", + "c2014efa c13a9344 c1ac2d42 3ead49ae -> bf800000 3f800000" + ] + }, + { + "glsl": "vec2 cultmath_iv_fbm_ball(vec3, float, int, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "3eb29880 c196090f c23f4433 3f29ac23 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1eae31a 423d3e5c c211f9ce 3fdf4669 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1f07d92 c219a0a2 c1b74111 3fb97222 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423587d0 42113b7a 418ff060 3fc3c202 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1645498 c13cf5d0 42179b50 3fee7415 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1ed71fb 423773be c1cb5739 3e0d345b 00000004 40000000 3f000000 -> bff00000 3fe9780e", + "41fd51ac 407b5e50 c22d0ae2 3ffe0362 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c19f458b c1b5ca2d 41f962c8 3f56b8f0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41a6e3d4 4202ef34 40aa5130 3e900ac9 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41f930a4 3f5db780 c19d2226 3fac8fb5 00000004 40000000 3f000000 -> bff00000 3ff00000", + "416a22d8 4235179c 41ceff50 3f436e84 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423ffa28 c22af9d1 41abd2d4 3f07ff4d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4245ea96 4156f084 c2268f37 3fcb80a1 00000004 40000000 3f000000 -> bff00000 3ff00000", + "3edff000 c16aa200 423a3f38 3f8b8ab9 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c22d58eb 42355744 3fb86cc0 3faad2f2 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4222493e c20edeb1 40e3d1f0 3fed39a4 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c19ca40b 420cbcba c241bdb3 3e81f930 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1981d58 407dfff0 42353ac4 3fd944f3 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c228ac61 c1ebe910 c1abedac 3f006dcd 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1f017d4 4211c5b8 c22495a0 3fbe84f7 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4201cc7a 41f1b690 4246fa4e 3faaaf78 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1f8abbf c2413d16 4225e2de 3f360e9f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4210affc c244a74d c22a8ee3 3fdbb367 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4245b378 415a597c 41d68d34 3f80f649 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c13d8a88 4204d95a c2291f4f 3e839ee7 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2313c1e 410d4334 42362882 3f692705 00000004 40000000 3f000000 -> bff00000 3ff00000", + "419102bc c1d40666 41ad35b8 3f1966c3 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c22cb1aa 41ac1fa0 c1780a90 3ecf764b 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4211ece4 41d84180 42090c14 3e55097b 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c20dd900 4221d922 41bdf858 3f13471d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "422ed9dc 41804fc8 c1bc2ebb 3f1a8abe 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c05911e0 c222064a 420dc084 3f625e7e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c0c9d910 41e14384 4213920a 3f3c749d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41e5ca10 42382cf2 4195bd8c 3ef24492 00000004 40000000 3f000000 -> bff00000 3ff00000", + "420ab2c8 40877dc0 42421fbc 3ff44778 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c19fafe2 4138b9d8 c1aa67d9 3e9684c9 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4182b6b0 42148fc0 4245542a 3ee5b45c 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41eb149c 4183b14c c162fe68 3f7450a6 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c22222d3 41e7eb3c c1f738db 3f4b2ca8 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c18d2fac 41763f88 42439bb6 3f9626f0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c13f0edc c1b444c9 4210ef8a 3f12f72a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "420a7dc6 423ee2a0 c1080eac 3fe78839 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c226be06 412a4194 c1c289a6 3f9a6dd4 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4227b968 41e29db4 4242c302 3f24dee2 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c14a90c4 c218b78a 415cf528 3f984a2a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c21f5a74 4150b72c 416ccbc8 3fc5bd5d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c0f4f520 c12cc8c4 c1b584e2 3fff51a1 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41d792c0 c1a77a72 42251384 3ec5e1db 00000004 40000000 3f000000 -> bff00000 3ff00000", + "40aaa020 c1219fb4 40eb8848 3d56bf1e 00000004 40000000 3f000000 -> bfc80532 3f5b852c", + "41ca7dd8 c247e07f c19fbb31 3fafb3b3 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c08b64a8 c2246bca c20faf42 3ec05ae7 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1138a20 41cc123c 40b85690 3f1f9ba0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41f26538 4213b82c c23ebfd1 3ed2a4d9 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c241ad69 c1290db4 bfc3bc80 3fc01176 00000004 40000000 3f000000 -> bff00000 3ff00000", + "414aaaa4 c223fcaf 42114b38 3f68b313 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41a34a24 c103cc50 c212096b 3fcae792 00000004 40000000 3f000000 -> bff00000 3ff00000", + "419af9c0 c22e67b9 c2341cbc 3f8543c6 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1e84460 42387890 40db63c8 3f3f2e98 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41fe4c1c 4234c494 c210b44a 3cd7a996 00000004 40000000 3f000000 -> be97be92 3f9b1541", + "bf845e40 c07c6f60 c158c500 3fab249f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4205c2fc 4238af3a c1f48667 3fe674ac 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1b9facf 41a5e7a0 c2012fb1 3ea33998 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4225b5f8 4201628c c12180d8 3fa9caca 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2112bb6 420a7272 4240d3a4 3da0f2ce 00000004 40000000 3f000000 -> bf83fa27 3ff00000", + "42359da0 c172b9d4 bf20be40 3f3031a6 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41a44bb4 c2391683 c21f4f7c 3fd7867f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c19f6898 41700f80 c1341964 3e03cc83 00000004 40000000 3f000000 -> bfd5bfcc 3ff00000", + "c1c31e46 c032f3b0 c1bf9d22 3eaa85ee 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41b46920 c1f41a0c 413fb3e0 3fbe166b 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1dd5fc1 c1d43539 401fc9b0 3ffc8122 00000004 40000000 3f000000 -> bff00000 3ff00000", + "421ac7f8 421c4bd4 4129ad78 3f45e4b8 00000004 40000000 3f000000 -> bff00000 3ff00000", + "40c6c630 422230de c1d32ff5 3ff8c5cc 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423bf0ee c2203aca c2308c4a 3e9131da 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423abc02 c23fb670 42393264 3fcc16f8 00000004 40000000 3f000000 -> bff00000 3ff00000", + "420ffeb6 c16bf500 411f15f4 3f9e2032 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1900baf c21abdb5 42212692 3f629199 00000004 40000000 3f000000 -> bff00000 3ff00000", + "40c988e8 c1d5a3ab 422f070c 3ff135ef 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1daf50f c1d04466 41fc6cc0 3fb82d31 00000004 40000000 3f000000 -> bff00000 3ff00000", + "420154f0 3f3cfd40 c08a1638 3fd0919c 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c0dc0f08 41ac6a80 c1b03d73 3f4a876b 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1099094 c106e7dc c22262ec 3ea0de49 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c10a8bc4 c2185a14 c1f094c7 3fb4771d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1d67ed2 4201137a 4218f720 3fdeee13 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41587f94 4222fde4 41851dd0 3fc61f87 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42432542 c20679d3 42014a26 3f28b46c 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423b29d4 c1a4f295 41c45c48 3fbaf65e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1ace253 c1808910 c19192d8 3f6b60ee 00000004 40000000 3f000000 -> bff00000 3ff00000", + "40cc62b8 c20ca7a3 c1569280 3e945f66 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c22ade87 c1ecaab0 c1ed3a47 3fe780a8 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2405aca 41c4f5d8 c23c77de 3f6365f8 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c23a8772 c1d5c7ed 41a84174 3f4ecd7a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c164654c 4231e900 c22667a8 3fea77e8 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4208650c 41926f14 4202b4c4 3f091b75 00000004 40000000 3f000000 -> bff00000 3ff00000", + "421ceb1c 423436ac c0e877e8 3e771578 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41882fcc c159d838 42151cd0 3e18a8f1 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41f0deb0 41bfdb20 c20fa156 3e2bfba5 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c08a3f40 41be5b54 41ee57cc 3f5ce44f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41a33610 41d1b594 41cbc0ec 3ef7da01 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c21201f5 c141042c c1a39be5 3fbc3a77 00000004 40000000 3f000000 -> bff00000 3ff00000", + "410597f4 c17d0f6c c14b4e28 3f2dcc60 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1c3b9be c11c81e0 413d8c08 3fe181db 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c18eb8d0 c2209c91 c1c64348 3e7b5adc 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41dd734c c226b249 c1d4c78d 3fa7cad4 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42155e1c 4235e68a 41646f68 3f16a2c0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c22342a1 414ae1fc 4232b9e6 3f9e975d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c20d42e6 41748c68 c1e687f7 3e226daf 00000004 40000000 3f000000 -> bff00000 3fe1c714", + "422b5714 410829bc c213061a 3f835f6a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41781270 4199c670 406af290 3f284f89 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42445d7c 40576fb0 41fefcec 3f4c6497 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2177571 c1bfec43 41d18944 3f37a0a9 00000004 40000000 3f000000 -> bff00000 3ff00000", + "bfb61640 418c8230 4176ee60 3f9ef63a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4033e900 c2203acd c152cf1c 3eb8f987 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41bd4638 c24758f0 416541b0 3ff4eb55 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c127f708 41cae6e4 c1f62e89 3f9a4a7c 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1f7b8f8 407d8bf0 4234fdb8 3fbc939e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423a6988 41bf646c c0519ce0 3e2e2f95 00000004 40000000 3f000000 -> bfc67fcb 3ff00000", + "4094f470 4222407a 41837b90 3f2e1fe9 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c21197eb c1cce7ed c202ff90 3fd4f346 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4211f3de 410d94f4 c212964b 3f716539 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42476780 4111bad0 40a25d90 3fd43a02 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1e28394 4234e266 41dd1210 3fa75179 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2346d32 410006b0 422d5982 3ef35ef0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c17dc704 c1e30321 c1e92769 3f94fa63 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c199e7b3 c23dd487 c12c537c 3fbf2529 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1e94a34 40df2968 c22a513d 3f9f674f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c0cfc4b0 c23c9ae7 c2365094 3f7c67bd 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4203a6a0 41f939d4 c2234660 3fce7f4e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "414026f8 41b0d974 41266218 3f99769d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42438d0c c2169429 3ffb5e60 3cea8023 00000004 40000000 3f000000 -> bf16d493 3f6d6f4a", + "4239292e 41fb114c c239bc61 3ff76fbe 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423ce6f8 c0e96200 424758e2 3feb7971 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c239e042 41113a7c 401a75a0 3fd6ebea 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1f30bc9 c134cd84 c1bdbdc8 3f5bad8a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "3fd7fe20 422b4d9c c129d628 3ec14e82 00000004 40000000 3f000000 -> bff00000 3ff00000", + "422332fa c1ad1c15 4201b6ee 3ef37d45 00000004 40000000 3f000000 -> bff00000 3ff00000", + "bf96fe60 c2154380 413b812c 3f9eda37 00000004 40000000 3f000000 -> bff00000 3ff00000", + "413397a8 412eddf0 41149310 3ebce69e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "3f142180 c1427008 41e2e7d0 3f4a2a8f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "405a18d0 c21cee1e 41705c80 3c8b45e2 00000004 40000000 3f000000 -> bd97a84b 3f66d6ce", + "c23bf3c8 c2163a39 c0884550 3ef4784f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1aa14e0 c1c61d8c 41308b9c 3eef1579 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c085a310 c201e9d0 c2270b21 3dfa38b6 00000004 40000000 3f000000 -> bff00000 3fe413bf", + "41b7c2c0 c186fc56 c21dabd7 3fadf069 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4243d1b8 41ee9b74 c00ab2b0 3fd8722b 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41f7e6ec c1432290 c199f88a 3f5a44a9 00000004 40000000 3f000000 -> bff00000 3ff00000", + "424729dc c17fe3d8 c1851042 3fd15bce 00000004 40000000 3f000000 -> bff00000 3ff00000", + "412562d8 42134edc 421de0c8 3f51a95b 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1b1930a c136a4d0 c208b31b 3fc89ee7 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42027aa0 41097bb4 42340052 3ef1e643 00000004 40000000 3f000000 -> bff00000 3ff00000", + "3fd33340 c1397354 c2072a18 3f5fe71a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "402c29d0 404e5530 c0920888 3eb3212a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1b5e055 c21e4350 c117fddc 3fbc6743 00000004 40000000 3f000000 -> bff00000 3ff00000", + "414ef434 41f3d950 c1f17f95 3fa6fa09 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41fd8418 c23b70ec c1cfa3b6 3ff285e7 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4227795c 41ea1990 414f91ac 3f97159b 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1af9530 418a8d9c 41e211ec 3f30388a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c202cb10 c18e3214 420d3c9a 3f4ece7f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "420b4d68 c1ce03fb c188de44 3f5a25ff 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1e33d18 42143400 421fa5a4 3f6e8f38 00000004 40000000 3f000000 -> bff00000 3ff00000", + "421a481c c20856d2 40903240 3f7fa0db 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c06b1ae0 c2087309 41dfe208 3f726c89 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1f9d2d2 3f1e0200 423aab26 3fcb7ec1 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1773cdc c246ee33 c1924512 3fb958ee 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41cb7d80 40e6c928 c20965ae 3fda9178 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41c7b8b8 c21bcba4 c2476640 3ff34efc 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1c6ffd1 c2477242 421b066a 3f463b6e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c01a4360 41d9dfd8 c0cc64b8 3ff2482f 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2131691 41dbd338 c22f5995 3fc278a1 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1c9f2fe c213b79b c2155190 3e7a073e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "421d55cc c19881bb c2098c03 3faac142 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c16710c8 c230aef3 c230bdfe 3fd87d20 00000004 40000000 3f000000 -> bff00000 3ff00000", + "422a208c 41281038 41892310 3fa4ddca 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41ab3360 c235d62a 41acd058 3fc67a67 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c208f092 411775a0 c1c9c824 3f6c9ee3 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1b6f2e5 c12b381c 4246ee0a 3f54d2b0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c22bfb60 c23fe2e3 4182043c 3f922723 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42306b62 40b86a58 c0179b10 3f9fb43e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c0aeaa58 c23a0e20 42382602 3f6191c5 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4235c05e c184464e 4117b44c 3ec600ec 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42314bbc c2373532 c0761810 3fdef4b3 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c21fa19d 41e9d630 c1d6174b 3e32d8d7 00000004 40000000 3f000000 -> bff00000 3fd46f06", + "c2307e8f c1aadaa7 412302fc 3fa72feb 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42192c76 4183dbb8 420c21e4 3f80274d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1965dce 41c09aa4 411ae120 3f2bd7f6 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c126c440 bfa0a540 4221d038 3f3c6b09 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2148241 c234e4d3 c1f144cc 3fade68e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c225fc2e c1b36a1d 42005360 3fd2b589 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4247f056 c232131d 3fee9b00 3eeb3b67 00000004 40000000 3f000000 -> bff00000 3ff00000", + "422c937a c21569b1 c1946f70 3f0e647d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41e65188 40f21420 3f98b780 3fa7a040 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42364c8c 42015d36 41c093cc 3fc7dc37 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1fc6007 c07fdce0 c214b3de 3edb2734 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41be4924 c1c0633c 41edc034 3f6980fa 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c211056a c22274c1 41c1b3f8 3ddbaaea 00000004 40000000 3f000000 -> bfb94bc9 3ff00000", + "41163600 40aa6450 c2474439 3fc87be8 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c05c0b30 41df1c54 4174e310 3fd4055d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c20d86fc 41419894 40dc82b8 3ebe71e2 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c0ebd7b0 c190c27f 4097af70 3fd1f95e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423e351a c1c810fb c10ce530 3f1c8020 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c19a5d72 c1037d00 bf0a0b00 3fa00d55 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c20d0130 412b814c c225f1fc 3fbd8ee0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1c1e66e c22edc0f c2233ed6 3fd670fe 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1390eb0 c1bef5dd 41931810 3ef0ac8d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "40ec35e0 41b71e78 c1f8cd2d 3eb58679 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c203db8d 42250a52 41570f58 3f90520b 00000004 40000000 3f000000 -> bff00000 3ff00000", + "421c71da 42311158 41e5dc08 3f5693ee 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41a9b0e8 423ed3ac bffc8660 3fe338db 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41918918 c0ca3460 41c4e3e0 3eb4b596 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2308b49 c1451768 4158dec0 3fdbc68c 00000004 40000000 3f000000 -> bff00000 3ff00000", + "419b004c 422516d2 40e19658 3e2b99a2 00000004 40000000 3f000000 -> bff00000 3ff00000", + "403a4fb0 41b91038 41f0fcec 3ea96320 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41584ae8 c195cc94 c1caf49e 3efceca3 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c22fa1e7 c1d3ef5d c21203ea 3f4a1c1d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41e2b9d4 422c6dfc 41bb1f8c 3ed2244e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41ffe4a0 41851064 c23cb681 3f0fd469 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41042090 c1ec83d4 c209bc50 3ff292eb 00000004 40000000 3f000000 -> bff00000 3ff00000", + "3fc26440 3f47d200 c201987f 3eca2312 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c222a873 c1878b20 bfd83880 3f041923 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c17ca1e0 40a37618 c23a3b23 3ea40c32 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c20f6d1e 4143b82c 41e2e630 3f4ca0a2 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41b89bf8 c1d51421 4202a4fa 3f64ec38 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c19e8543 c16d541c c12bc0ac 3e8312f1 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4164a980 c0ddae48 c2389355 3d649ea0 00000004 40000000 3f000000 -> bfa7dca9 3f90cc57", + "4219cd52 c1a80ca4 3d99dc00 3f267284 00000004 40000000 3f000000 -> bff00000 3ff00000", + "40f22358 420d7b98 416fb358 3e82e195 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2114dcb c23446e5 c20ab1af 3fbb00f0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41c99428 4216ee74 c2331092 3eee4b69 00000004 40000000 3f000000 -> bff00000 3ff00000", + "421ea91e 40ed3038 c22ea569 3ecab18a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4219151a 414e2b00 409f5908 3f32d155 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1439b94 41a70eec 41691608 3ea7deb0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c219f08c c2349f3b 40ad11b8 3fa9ad30 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1a66476 c08dcdb8 c14afec4 3dd79d7e 00000004 40000000 3f000000 -> bf97cb6e 3ff00000", + "c233de2b 41a7bbf0 4106954c 3f137fb1 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423d0136 4179fe98 c1bde6ee 3fae7e33 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c227d862 c2217eae 419be448 3f59807d 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1a088e9 c207de52 c1d744c7 3e0dd72b 00000004 40000000 3f000000 -> bfb7133e 3ff00000", + "c154417c 42086866 c20e1d28 3f03155a 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41c01d1c c20b4546 4232cdca 3fddedf0 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1e993d3 bfaf6a80 c2431c03 3e35c328 00000004 40000000 3f000000 -> bff00000 3ff00000", + "bef48d80 bf6fc140 c0c550e0 3f17e10e 00000004 40000000 3f000000 -> bff00000 3ff00000", + "3ed71200 c247ee6c c1fe675b 3ebfe346 00000004 40000000 3f000000 -> bff00000 3ff00000", + "424400b4 41dc8698 c1dbf9e3 3ee84a63 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c1560724 42135640 c1b92ad3 3f104d89 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c2426aaf c1df12d5 4211ac9e 3ff470b2 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41fe0654 bfbc4440 c1a3c497 3f670c21 00000004 40000000 3f000000 -> bff00000 3ff00000", + "c197391e c2190243 c1966166 3fe607df 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41d2205c 41add0bc c2281ecc 3f7912fe 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41666ea8 c20244e7 c1fb0408 3f970774 00000004 40000000 3f000000 -> bff00000 3ff00000", + "417cadb8 c122469c 422820c8 3f195968 00000004 40000000 3f000000 -> bff00000 3ff00000", + "423f555a c2366d8b c2287c5a 3f9785e9 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41399560 42274d64 421bc45a 3fdf3279 00000004 40000000 3f000000 -> bff00000 3ff00000", + "42195024 41846bfc 420d27a4 3ffca3f4 00000004 40000000 3f000000 -> bff00000 3ff00000", + "4143603c c23109c9 c1b76371 3caad5d3 00000004 40000000 3f000000 -> bf7b111c 3e6a832e", + "c1f3b972 4242f084 4242205a 3f4628b4 00000004 40000000 3f000000 -> bff00000 3ff00000", + "41968490 c1ad3591 c0f22840 3f0bd3ed 00000004 40000000 3f000000 -> bff00000 3ff00000", + "419cc42c 41bf0d0c 4103e728 3ec4ecc5 00000004 40000000 3f000000 -> bff00000 3ff00000" + ] + }, + { + "glsl": "vec4 cultmath_iv_frustum_ball(vec2, float, float, float, float)", + "tolerance": "ulp-bounded", + "check": "enclosure and tightness: from the arguments (mx, my, z0, z1, fp, warp) compute in double zm = (z0 + z1) / 2, c = (mx zm, my zm, zm), |c|_1 = |mx zm| + |my zm| + |zm|, r = (z1 - z0) / 2 sqrt(mx^2 + my^2 + 1) + z1 fp + warp and d = |GPU centre - c| (Euclidean); every case must have r + d <= GPU radius <= r + d + 2^-19 (r + |c|_1). Report the largest ulp distance per component as for any ulp-bounded family; only the two bounds fail the check.", + "cases": [ + "3eba7b90 3eb7145c 427992e9 42ba552a 3c779789 3f90a589 -> 41e2a26a 41de7fa1 429b8f4f 419e80d6", + "3f73f64c 3f0c1560 4222d6fe 4297c95b 3d2b135d 3f4911fc -> 425e3d89 41ff38c0 426934da 41f0be8c", + "bf0b3bac bdf4d708 3fcf79e5 40cf912e 3d3114bd 3e3e1d32 -> c00d1a19 bef82057 4081b7d4 40500a91", + "3f3a6c22 3e316390 42b4bb59 42c660ce 3ca20ba7 3fabaad2 -> 428a094c 418358f4 42bd8e14 410d060f", + "be31a3d8 3d899d70 42748f85 42bfc55b 3cfe1a00 3fce5929 -> c159ec11 40a8d228 429d068f 41b20e9c", + "3f4a9c78 3f411d36 4206979d 42890daa 3c1cb84a 3ed166e1 -> 4221bb7f 421a26c5 424c5978 41d73c63", + "bf6a8307 bf066589 428944ec 428eff1a 3b87959a 3f7e8c43 -> c2805ed0 c21322c4 428c2203 4057d762", + "3e53d0f0 bc876000 41751d2c 4233d09e 3c035ac7 3efddf6e -> 40c77b7a befefc0a 41f117e9 417fd2f9", + "beed4c2a beb0f3c0 42239431 428e1c3a 3d333100 3ffeee4d -> c1cf8ad7 c19ac388 425fe652 41b427bb", + "bed8bcb0 3c3e8000 41e413bf 4298518b 3c26e20b 3fc469e0 -> c1b13b43 3f1bc6db 4251567b 41e1777c", + "3f687470 bedf98e0 4177bf60 42360b63 3d258870 3ff533f9 -> 41dd8aa6 c155198b 41f3fb3b 41c88b16", + "bf62de25 3d7a4040 41c9076e 42835586 3b3af21b 3fa07ae9 -> c220ed38 40318369 42359762 41e46bc0", + "be3ee140 3f1d3204 424a7a45 428de3fc 3ceaff9c 3fe71569 -> c1354881 42154ad0 4273211e 417ea87a", + "3d155040 3f242db2 4216395d 425ede18 3caf3282 3f15b6a9 -> 3fd99b9b 41ef459f 423a8bba 41491a58", + "be5186a0 bed461aa 3eb176b7 418ad2a2 3ca8146d 3faf1262 -> bfe7c7e9 c06af099 410d987d 41317a97", + "3f571914 bf527068 4068a7bb 42464d73 3babcf63 3fcc9d21 -> 41b2d633 c1aef697 41d4d7ef 42153b67", + "bea098aa bf7e7b00 4288d592 429c4d84 3cdbcdc2 3fa0cc15 -> c1b7e4bd c291b2d4 4292918b 41262439", + "3f7ea95c bdadf0f8 41da358f 4284b466 3c2226dc 3e0a9e8e -> 423a4728 c07e7771 423b41ca 41e3353b", + "bca1cf40 3f438e26 42ba9a04 42e0c8f8 3cb28a08 3f434e6d -> c0020326 429d206a 42cdb17e 41739f77", + "be5c8f00 3e3a3608 42ab0a9e 430099fa 3c27696a 3f83e9c8 -> c1b87a7e 419bbfec 42d61f49 41c5cbfd", + "3f692462 3ede1ca8 41439ca8 422240ba 3d367174 3ff75747 -> 41c04d51 4137343b 41d327e4 41beeaf2", + "3e3b5de8 bcc485a0 428cd979 42d37f82 3b5555d3 3f91e546 -> 4180f120 c0073e06 42b02c7e 419b8e6a", + "bf0ff773 beb4875a 41e48a22 4283d273 3c964fe0 3ff81378 -> c1d486fc c1854029 423cf4fc 41cc7754", + "bf759152 3e6e00c0 411b7809 4261d395 3d2e1d59 3f86f841 -> c1fde838 40f615e2 420458cc 4211296a", + "3f007a50 3d9d4c50 4282ea47 42c450a8 3cd80964 3f831c17 -> 422439d0 40c910b1 42a39d78 41af98b7", + "3f636f84 bd16e440 42a01495 42b0f436 3c452c66 3fd19c95 -> 4295b6cf c046a7a8 42a88466 41058ed4", + "3c5cb300 be0de0f4 4262f0a1 429011d6 3c1cf805 3fb554e5 -> 3f5e06cc c10ebb65 4280c513 411d49fc", + "be8b8962 3f1140b4 42a3c75f 42c8185d 3c06d0b1 3e63702a -> c1c655c1 424e75b1 42b5efde 413c603a", + "bf4e97c7 3e94f9d8 41b4cb94 4285cd78 3d2c585b 3f96285a -> c210746b 415055d0 4233005d 4204b12a", + "be25d7fc bf757789 42ad6f1f 42e8db86 3d272309 3f34556b -> c1839a72 c2c2c993 42cb2552 41d16b3d", + "bec0915a 3f600790 42c04fbd 42d38210 3d1c330e 3f94e70e -> c217e150 42b0b1c0 42c9e8e6 413d3025", + "3f0a1670 bf664628 4108b80d 41fede26 3c45ec62 3fef5ae7 -> 412e59b0 c1915f6c 41a19d16 41992df4", + "be486fe8 3edbaa80 422ab7b0 4278545e 3cea40d8 3e078533 -> c1240c4c 41b3c934 42518607 414a2433", + "3ed58464 be65965c 421673f1 42818d9f 3ce4afc5 3fe18959 -> 41aacbf8 c137a6d2 424cc798 4194c7c0", + "beda2f86 bf623449 42802552 429586c3 3d199c25 3edfd7ad -> c1eca815 c2755aa0 428ad60a 412ba98b", + "3f674cd8 3f533df0 427626cd 42908fcf 3d4b8e48 3f013f1d -> 4271d09c 425cd846 4285d19b 41495e4f", + "3efcbb28 bf27f8d8 400fbbc4 4161b481 3cf35cdc 3e66b496 -> 40812616 c0ababf2 4102d1b9 41051545", + "bf726bfc 3e85765c 422265b0 425c792a 3cc69f42 3e81bc02 -> c2354815 41479acc 423f6f6d 413c3ed0", + "bf2de8d0 bf7015c3 42340781 42aa1aec 3d356d0f 3f5b0cde -> c230b549 c273f2de 42820f56 420d08c3", + "3f7412de 3f099c24 42184c5f 42287042 3d395b8a 3fb43acb -> 4218e5b6 41ac6892 42205e50 40c9c110", + "3f61efa0 3de59850 41f11e40 4292e041 3cd31933 3f27ae99 -> 4236d3e6 40b9c9de 424f27d1 41fc315b", + "beb8555c bf20097a 42902d49 42a1926c 3d03734f 3f4c5975 -> c1dc27bc c23f2322 4298dfda 410c0d6b", + "bf691e1b bd69e000 429ef423 42b94118 3cd404b3 3fed5642 -> c29cb877 c09d3ad1 42ac1a9e 41527036", + "bd47db10 3f7e4e1c 4265e4eb 42a6530b 3b34e8d7 3fb7ed3c -> c05b95b7 428bb463 428ca2c0 419e41b1", + "3f09c3fc bf32be2e 4032a729 414285bd 3c443705 3ee68bed -> 4080b78c c0a700bc 40ef2f87 40dad7f2", + "3f3e9f40 3eaa481c 41d63aab 422aa228 3c737515 3d98b369 -> 41ced0e7 4138bf66 420adfbf 412f4330", + "3f1fb802 bf2dc82b 413ae66e 41795cfe 3d46b83f 3f17c941 -> 410817ba c1141357 415a21b6 4080218a", + "be405494 3f791cc8 421c39c0 42265819 3d1af6d1 3f5410aa -> c0f257f4 421cf210 422148ec 4085d752", + "3e8877d8 3edafaec 41ca49f0 423fc5a2 3cf8189f 3fe87ee7 -> 411c25c2 417a8ee2 4212754d 417f43ec", + "bf3d965a be144368 42494b41 429ee0fa 3ba1a96f 3f3a1e60 -> c24032cc c1164e27 4281c34d 419adaa1", + "becc395a bf3bfe4c 42bde57c 42ef73e5 3c781d3b 3ff98f12 -> c22b41b4 c29da564 42d6acb0 419f44e5", + "bf3c61c8 3ee8b028 418d320e 425e105f 3cb92445 3f364f56 -> c1d75c30 41850173 421254b3 41d7fe89", + "3f1f518a be517dec 402f6f49 418520cc 3bb331ca 3e08bdb7 -> 40c0ff0b bffdc68e 411b0eb5 4108873c", + "beaf9b28 3edfeb30 421e2147 428c5912 3ce33d4f 3f862e96 -> c196823f 41bfeaa9 425b69b6 41a42f23", + "3f7230fe be255068 40c7692d 41c1736c 3c1b21c0 3fde40b6 -> 41662e07 c01d1d82 41734db7 41667a4c", + "3d8d7cd0 bf0a62ac 40cee4ba 42305acc 3d1f49ef 3fd6618e -> 3fdf8631 c15a9f99 41ca3763 41c68156", + "be9ca544 3f523dac 428913c2 42b299b0 3d3c1bd5 3d6d10c0 -> c1c1297c 4281a02a 429dd6b9 418fb2e1", + "bf05e0c4 3f408168 41d2f10d 428e5765 3d03997b 3ed42d63 -> c1cc08fa 4212b15a 424313a8 4204514f", + "3f437482 3f3426f8 42004794 42577efe 3c511304 3f41a29a -> 42033c5b 41f1ebf3 422be349 41894800", + "3f7005ae 3ec05170 4267bdef 429e6929 3cd6611c 3fe1d7a1 -> 428094da 41ce0d59 42892410 41979fcc", + "3f53b14c 3f0be0ca 4257fad5 428ac0d7 3c37bddf 3ee28024 -> 424c09b3 4206d1f7 4276be42 4140c8a2", + "bed4a09a bf61eb11 42784d7c 428f119a 3d3ea961 3ec9afe4 -> c1ddf24d c26bd1e4 42859c2c 41254876", + "be7248cc 3f53a884 42a01b57 42c4b295 3c99cc55 3fad8b25 -> c1a8d810 4293804c 42b266f6 417447e1", + "bef485c8 bf5894a5 429b8756 42f0f2e8 3cc3db31 3f2bf933 -> c23d59da c2a7b6ad 42c63d1f 42054dae", + "3dc53f20 bf4d87cc 42c333f6 4303e17f 3d20930f 3e3756fa -> 4130d09b c2b83d9c 42e57b7a 41db217d", + "bef74dce 3f57eea6 421b85ce 429e0d80 3ccde299 3e949ec7 -> c1e3cdbf 4246e7db 426bd067 41f22740", + "bcacdba0 3f5caf3a 4282b80a 4286e9b2 3cf797dd 3f954671 -> bfb35c8e 4264fccf 4284d0de 4092de01", + "3e31d288 3ec55ca4 42b838f1 42c48bbe 3b3809b0 3f2e3fbd -> 41843e91 4212c693 42be6258 4089a73e", + "3e1f74b8 3e52f818 41fb696e 4298f538 3c07c796 3f6410d6 -> 41066c52 4131d96d 4257cf94 41c65214", + "bf4a5ad3 bf61a4da 41ed6d75 421f7761 3d1b9c7c 3e7e4ada -> c1dbe314 c1f531a9 420b170e 411a852d", + "bf027502 3e5acab0 41dcaf58 4258884a 3d3e9953 3c94d55b -> c1a69322 410baec2 42236ffb 418d9f16", + "3f1e1676 3e216db8 4224eeaa 4293fe26 3d3385fa 3f62ec26 -> 420e50ba 411152a8 4266757b 41bc71dd", + "bf736034 bf0fa2e2 423d88ab 42646dd4 3c5c35b7 3fc8cd4c -> c246ad06 c1ea82a0 4250fb40 41194085", + "be2e61d0 be1966c8 4090d234 42113fd8 3bb35275 3eb8f1cc -> c05e8b55 c043c4e3 41a35a1e 4186db1f", + "3f0d4866 be91f542 42979500 42f5dbcc 3d0f1823 3f627d75 -> 425b5786 c1e299a7 42c6b866 4203b3be", + "3f32b786 bedb4b24 418a02c0 422ed72c 3d233756 3fff31a2 -> 41aa3b61 c150e1d2 41f3d88c 41a6afc1", + "bec4a242 bf6357ae 42987da8 42f3b000 3c814be6 3f736e2b -> c2182708 c2afea16 42c616d4 420a648b", + "3f5b6fd6 3f586726 4291640e 42e86e34 3d338823 3ff1d23f -> 42a1edf6 429fb0d2 42bce921 42242731", + "3f71bb6a 3f5227fa 429e6e2b 42d19c23 3d219f6b 3f2b21d0 -> 42adc392 429710f6 42b80527 41ca62c6", + "bf571be5 3e6056a0 4247ddfd 425acec2 3d1ab4de 3f92b3dc -> c22fe65a 4137726a 42515660 40cb2247", + "befe8cbe 3f3b65d2 42b02b2b 43088db7 3d252d55 3f972a0b -> c25f5d85 42a470a1 42e0a34c 421c31af", + "bee9f5ee bc10fec0 4229656f 42845ab2 3d3591a6 3ed87261 -> c1c65db9 bef5df13 42590d6a 4183a56d", + "bf74a6a3 3bbe4800 4132b52b 421e76e1 3d10edb7 3ebd7165 -> c1c222b5 3e16fdfb 41cb242c 41ab91ae", + "bdbcb4e8 3f4fa734 4240a4c3 42b1a182 3d46cb93 3fc9a29c -> c0c9f0b3 425e3723 4288f9f2 420081b3", + "3e9a07a4 bea68b80 42470a0d 42b74464 3cb8733e 3ebf7eae -> 41aa259a c1b7f8b3 428d64b5 41cab2ce", + "bb97c700 bf12b63d 41f16809 421e914a 3d076a8a 3f65854d -> be2592f8 c1a00c54 420ba2a7 40f532d3", + "3e41ffb8 3f6b1d62 413bd8e1 4194788f 3cf59dda 3f42f7ea -> 4037b046 415e9e89 41726500 40bfbca1", + "3d31c600 bc0daf80 40209f69 41fc56df 3cc8ee2d 3f125a99 -> 3f3d2c8a be16c594 41883566 417e03d9", + "bf0d995f 3cb47540 42b4834e 42d3f16b 3d03572d 3fd96e5a -> c2591369 400a52e8 42c43a5c 41613f5a", + "bf50e9b9 bdfc7750 42b31956 42bc6cfe 3c833420 3f700442 -> c295f658 c13539c2 42b7c32a 40af09a3", + "bf502f2f be070110 40976663 4184461b 3d48761c 3fac4249 -> c10a591d bfb36ed9 412a1fb4 411cd1fc", + "3f5214c8 3f2a7fda 42a88172 42eac3b2 3d4782eb 3fbf740f -> 42a577ba 42864aa8 42c9a292 41fa8548", + "bf5ceff2 bebaa414 41f5ef3f 420f0fcf 3c6fd64a 3f732bfa -> c1e597bb c141f3e7 420503b7 409d4b51", + "3f06eb94 bf5c3ca2 42a99885 42bebc80 3cfbcfe3 3ff02e01 -> 423de816 c29aff34 42b42a82 41450d63", + "bedca1a2 bf2209ae 426550b5 429fd72a 3ba232e4 3ee3808a -> c1ec92e5 c22dbf13 42893fc2 4171126d", + "3dd8a5c0 3b56ea00 42801f2f 42c0e718 3b1289d0 3ea8b8d9 -> 4107d693 3e86c058 42a08324 4186a5d7", + "bea988de bedb58cc 424ef45d 428a9d1f 3d09673f 3fa81207 -> c1a052d1 c1cf6de9 4272174e 415a092f", + "bde784e0 3df98600 4256f0e3 4275e52f 3c4a7fb0 3f254dc3 -> c0d0622e 40e096b8 42666b09 40aa7e82", + "3dae8d40 3f7bbcc0 416c94c3 420f41ee 3c878a8c 3eff1685 -> 400a01c4 41c70857 41ca671f 417dd268", + "3e77b7a8 3f43a826 42a40d21 42aee283 3d42dc23 3fcb95b2 -> 41a3fc2f 42818595 42a977d2 41138c90", + "bf4cc979 bda99760 42933734 42d13e49 3bb68839 3f71e998 -> c28e9314 c0ec2456 42b23abe 41ab6b73", + "bf48e6a4 be22514c 41dc85bc 420aafde 3d1cf156 3c36242d -> c1c35dec c09dd8aa 41f8f2bc 40bc8638", + "3f6a846e be33a5fc 422013ff 42465eec 3d1d55a9 3dd96f64 -> 42242f3c c0fb8ac4 42333976 4108e86c", + "be4a1c98 bf3d78dc 42bb9479 42d4985e 3d3a38c0 3e5819f8 -> c19df80a c2941704 42c8166c 414ebf0b", + "bf5984a7 bf3c2fe6 418a515e 4213694a 3abc478f 3ea484ed -> c1b803f5 c19f33b8 41d891f9 417163ad", + "be9f0948 bf0c24c6 42060978 428b3068 3c4f048a 3ed8bd2e -> c1801a7b c1e1c55d 424e3524 41b4f9ac", + "3f576772 3f258474 4234bc5c 4241a76d 3b203676 3fd32f32 -> 421d828b 41f21005 423b31e4 4083ee46", + "bf677596 be4b73e0 41b546a7 41edece4 3cbdd74a 3fead377 -> c1bd8208 c0a693cf 41d199c6 40eb27a4", + "3f32f38e be101180 4138693a 424782ac 3d10e1bc 3fd2493a -> 41abb0d2 c08a3917 41f59cfa 41d7ab9c", + "3f36ff22 3f333640 425bfa20 42ad0686 3cdf9f14 3ffa2888 -> 424a4e9b 42461f7b 428d81cb 41d4df09", + "becc5fc4 3eddabb8 421dd3a0 4234b70b 3d235cf7 3f8a215e -> c1872293 41929266 42294556 40c671b7", + "3eaf3d20 bf06f7bb 41818740 41ccc480 3c5edce2 3ff1ca69 -> 40e4d59a c1303f26 41a725e0 40f953ce", + "3e507960 bea7016a 4106300f 4160a610 3c26d80f 3f822982 -> 40121c0e c06a17aa 41336b10 408608bb", + "3f4267b6 3f5e0efe 4286131d 429f914d 3cde39ad 3f98dd6c -> 425efd8e 427eb5c6 4292d235 41515ce0", + "bf684c68 3e1f20e0 424ff7a2 429b4b09 3d310d0c 3f4d684b -> c26b4598 41212a4d 4281a36d 41acc146", + "3ea60f1c bed69d58 41df2a6d 424e6d06 3d1c8fba 3f2938d3 -> 414e4838 c1854ca9 421f011e 418068cf", + "be0d5b44 3f5e0986 427183ee 42bd638c 3cc113b8 3ee76fd4 -> c12b413b 42868009 429b12c2 41cc2802", + "3f032efa 3ea574e4 417fd8e6 41c3f0ce 3c08b29f 3f3d6832 -> 4125f5a6 40d1517b 41a1eea0 40bd4456", + "3ef433fc 3efa6288 4281a92d 4285c8df 3d19d31d 3f9c804c -> 41fb4e32 4200d563 4283b906 409f7882", + "bec57db6 bf68a26d 418c8a3d 4265a500 3b64d728 3ee0d619 -> c1675e70 c208453b 4215f50f 41e511e4", + "bf75b100 bf2f08fe 42151d13 42968cd4 3cd7be4c 3ffaecc2 -> c2580ad5 c219e99d 42611b5e 42053838", + "3eaa3fe8 bf3ea02e 426556ce 42bdeb19 3d0bc9a0 3f096c57 -> 41ca8ffa c262ce48 42984b40 41e06b41", + "3f4f633e bf1cf456 423991e3 428932fa 3ccc9f37 3fe14abf -> 423a4fdc c20d0105 4265fbec 419a6b26", + "bdfdaf88 3f40b98c 42253c54 42432b8c 3d1eb6ab 3e752f0c -> c0b292e3 4207a990 423433f0 40dac5e6", + "3f01a7e8 3e780e20 42581c66 42aec09d 3c0a2600 3fb7e5ef -> 420f3bb4 418903fa 428d6768 41aa5dff", + "bf304d18 3e895da4 42ad2a68 42d38f7c 3d088ea1 3f1fd6ca -> c28479d4 41ce7035 42c05cf2 4180b244", + "3f352cac 3f7e1f50 415aadc0 41b4f5df 3cceb02c 3d99a7d4 -> 414d72ec 419015d4 41912660 40f686f2", + "3f18125a 3f78da5c 40cb4e94 41cab204 3be1a410 3f8ea160 -> 41169989 417671bb 417d85a9 417ad4f9", + "bf34409a 3f39e924 425b02b3 428affeb 3c9379eb 3ec4277f -> c22ef99a 423477bb 42788144 4141f5b3", + "3f1d37a2 3f3dc374 4219b180 424c35f4 39e26e74 3fe79703 -> 41dbccb9 4204a691 4232f3ba 41298ae9", + "bdf44b38 3f7fabae 42c02677 430ace14 3cf4c524 3dc3aee5 -> c16023c4 42ea93f3 42eae150 420a2ecb", + "be473f94 3d2de880 42531f52 42716594 3cf21237 3f809221 -> c13019d9 4019b465 42624273 40d4afc9", + "3efa1934 bef69a6c 42155ecc 42606496 3c90e8c0 3fc9d999 -> 41b692cd c1b4059b 423ae1b1 415f1119", + "bf62c0d3 be815848 424241e0 42c36550 3cd4f595 3f1b943d -> c2818d6d c193cc87 42924320 4212309d", + "bf284e22 3f38c27c 41dce214 42754831 3cec966d 3fcba4cc -> c1e9de21 42005db1 4231dc9e 41d7573b", + "3f5b6d56 3e4fb4c0 42c5f03b 42dd11ea 3d175bb0 3f811735 -> 42b392e5 41a9fb49 42d18112 414ccb26", + "bf58ad78 3f62885e 421bf330 421ef427 3d4810ce 3f9d6120 -> c205444a 420b53fd 421d73ac 4070e914", + "bf70bbde 3f7e54fc 41daed7a 41ecf107 3ce1e14f 3e4bf610 -> c1d65791 41e2730c 41e3ef40 403b1dc1", + "3f23344c be0b1b3c 424f735c 42a33f5a 3c2151ff 3fa209f3 -> 422a331a c111119e 42857c84 419ea8c5", + "be24d2f0 bdad4c98 42405e06 42a1e00b 3d0c1142 3fbc6520 -> c1262647 c0aeb162 42810787 41a77489", + "3f0b775a 3eea0f40 42bce7a8 43030c31 3c37a7c5 3ffd1f13 -> 4275b349 424e2c73 42e18005 41cf32a4", + "3ccd9680 3cd63780 4250733d 42bf14de 3c756c9c 3f51f0d3 -> 3fed2775 3ff71ba1 4293a73e 41bfd66d", + "be4e69c0 bf6a578c 421efb33 42a6879d 3d4329c3 3f85aff2 -> c1465dd2 c26134e6 42760536 420b584a", + "bf702991 bf3f43e2 41f8c92b 421f956a 3d2f3da4 3e9427ca -> c205343e c1d42ad3 420dfd00 410dd7b6", + "bee40158 beaa91d8 4222ade1 426a0c65 3d264d31 3f0fca3f -> c1b0abfe c1842adb 42465d23 41525397", + "bf73c865 be23eeb4 41cfeb1f 426aa46e 3c47d659 3efe38a3 -> c221389d c0d8d3c6 42294cff 41bf5d06", + "3eae619c becee1c8 429adde8 42b74c81 3cda6951 3d9990a6 -> 41e659c3 c208a430 42a91534 4128ee29", + "3e21ad98 3f668342 41579c48 41971e48 3c21d25c 3e9cafb4 -> 40238643 4169252b 41817636 4085220b", + "bf071c06 3dc95610 424a2252 42c4e2da 3d005723 3f8e8dff -> c21d404c 40ea54c2 4294fa02 41fb184b", + "be1851a8 3e45d968 42aeaa15 42fea5a0 3cba9d5a 3fe3a2ff -> c17f7043 41a5e576 42d6a7da 41ca158d", + "3e294510 bf3036f4 428c589f 42a4578d 3d2d0da9 3fe0d3ca -> 41497680 c251ba86 42985816 41494082", + "bf32bf6e 3efbc45c 42a003cb 42aee3fb 3c253572 3fa7a677 -> c269d797 4224af10 42a773e3 40e2a1d4", + "3efe0ff4 3efcad90 426dd177 4292342a 3cf4cc3a 3fe7b877 -> 42038d99 4202d618 42848e73 41452db9", + "bf7a7965 bf295a1c 415d613e 41d3fc5a 3bc87a44 3f0664d9 -> c19ddaf7 c15575c4 41a1567c 4127c14f", + "3f0d4fda bf5e5f50 429ed973 42e515ee 3c3bd066 3fa55483 -> 425623d9 c2a87d02 42c1f7b0 41de6b15", + "be7fdc74 3f3db342 42a8b8f1 43009b84 3d0fcb74 3f40bffd -> c1d4da6a 429dd035 42d4f7fc 4205690d", + "bea7e01c bea4b8f4 412a4d12 41bb793d 3d440e6f 3f666e84 -> c0b2c6e4 c0af6b52 41884fe3 4110f3b4", + "be966274 bf532fa0 420be4c9 429af20a 3c2d6339 3fe1107f -> c1841c56 c239861d 4260e46e 41f696d2", + "3f6ce8ea bf31c0ff 42c7f3ce 431460da 3d21ac1b 3f120fce -> 42e5d59f c2ac71fb 42f85ac1 422dbef9", + "3f00df9c beae8788 4067a1c9 41cc9399 3cbe6a10 3fc76c5f -> 40eb1fc9 c09f35f3 416987d2 416ff8af", + "bf54e4f9 bdd29d80 424f7372 426e4ba1 3d1e826f 3f28bc74 -> c2395876 c0b75c7e 425edf8a 40ffd630", + "3f1f7382 3f39f60e 4093ca91 4178292a 3d3fdee4 3f03f214 -> 40c89849 40e9f1fc 41210739 410c77f1", + "3f19671c 3f02a0e6 41aa3dbc 425e9ee4 3d3859cc 3d877a71 -> 41b8685c 419d07c8 4219dee1 41c38c6a", + "3f53a9cc 3f5a2264 42ab2654 430351e3 3d17930b 3e196331 -> 42b354a6 42b8d030 42d8e50d 42220f3e", + "3e95908c be3e6674 4103e4b1 4210a074 3bdd11b8 3f3e7228 -> 40cf8563 c0841718 41b199a0 417c1f53", + "bea292c2 3f4b52a8 42af1761 42cfc26a 3c0dd300 3f823647 -> c1f3214d 42980929 42bf6ce6 414a9edb", + "3f5d2424 bf1a1148 41fbc156 4201d229 3b048cc6 3f3198e2 -> 41dce17a c199e2d6 41ffb2d4 3fbcd2fc", + "3f2af89c 3efaeba4 41ad7e3e 426b2afe 3c0b556a 3d8ab058 -> 41d6fe16 419dc378 4220f50e 41c54612", + "bf5a7d38 bf5f1844 422c1293 422c8af9 3cd7a64a 3f89aad0 -> c2130f5d c21628f4 422c4ec6 401372e8", + "3f58c6fe bf295088 428ddb47 42ba3150 3cd07a34 3f3ba454 -> 428ae4d0 c258f783 42a4064c 419af92c", + "bf00ffdc befcac32 42920e49 42d5638c 3d338b8b 3da24fd9 -> c2352029 c23162ea 42b3b8ea 41cad7b7", + "be70e5b4 bd5c9f80 4269a1fe 42bb28dc 3d1ad4bb 3fb36bc5 -> c18f057f c082fc0f 4297fcee 41b83d3c", + "3ee05348 3f49ab34 42b1868e 42e468ae 3b87a5ff 3ffe9ac3 -> 4231dab2 429fe428 42caf79e 419cb4b3", + "3f37b66e 3f4ed99c 41bf7f1e 41d2a285 3cc70b15 3e0d2a4d -> 41904a4e 41a27673 41c910d2 40227bec", + "3f627c2e bea4c6e2 4214e1b3 42586c08 3ca59ed6 3b8d9b84 -> 422197ea c16b2199 4236a6de 414b1864", + "3f196b94 bcb9ae00 428a47c7 42e9088e 3d1e1759 3fc90806 -> 425e870b c006a8b7 42b9a82a 4206c21a", + "3e6f5490 bf2dbda0 42adbf21 42bf689c 3c93d98f 3fb202ae -> 41aab05b c277d255 42b693de 4108dac1", + "bdcc0168 be853b62 41f78cd5 4286c48b 3c6913c3 3fa1b424 -> c09cb6c2 c14cb189 4244a7c0 41a916b9", + "3e99da60 be2ec77c 410ed285 42329b06 3cefb9ab 3f9a9f16 -> 4100cc6b c0925123 41d64fa7 41ab4f60", + "bf3e86ac bf196622 4299b68f 42dbd3f6 3d15cd09 3f898ff5 -> c28b00a8 c25fd4d0 42bac542 41dfa502", + "3eac15a0 bf690f4e 40e2b494 4210a7e8 3d391f41 3f08a12b -> 40e8932e c19d7df5 41acfe7a 41b36e8a", + "bf7aff66 3f0b0850 4145434b 418b9917 3d36b33b 3feb984a -> c1699307 410161a0 416e3abc 40cee096", + "bf3f83d5 3ebabc18 4259e958 42a34a5c 3cf50cc6 3e6b9217 -> c24bab3a 41c695d4 42881f84 41a2c319", + "3f053692 bf12a241 40b63931 422ac5c0 3d0ce444 3ffd0dfa -> 41496eeb c15dba0f 41c18ce6 41d6b2c2", + "3f53deb4 bf545fde 42b4dd8d 42bd9810 3d27efb7 3f92324b -> 42994c9b c299aa10 42b93ace 41064047", + "bf775306 3f695bf8 422c20e6 426e67b0 3cd0a526 3f213766 -> c2464f76 423b1ce6 424d444b 417ec08e", + "3e8072d4 3f3cc4d2 423aae25 424318d0 3d135c9a 3f82f40e -> 413f8eb9 420cc1d0 423ee37a 4083913c", + "3c977140 3dc4a660 42514dff 4272f32e 3cf16286 3fe6ee8d -> 3f85c541 40adb3e9 42622096 40fa3a5b", + "bf617357 3e2d4ec8 427154d5 42ba00e8 3d388b6f 3f846e27 -> c287095f 414f9c26 429955a9 41d9532a", + "bd18c3a0 3f5b33ee 420f400c 421f9233 3d08e15e 3fd18a61 -> bfb4b43d 4201a5a5 42176920 40b50751", + "be8cac80 3f5867d6 42be6415 42f58879 3b8ebd6f 3fefa3e1 -> c1ef8b1b 42b84034 42d9f647 41a6cfb2", + "bc9af820 3f16e2ba 418bd2eb 41e7aa1a 3d3c00b5 3fba90d0 -> bee0e144 415af443 41b9be82 41173533", + "3e986e38 3edf8778 42460dae 42997b76 3c3e3b3b 3e8ea7cb -> 41965a15 41dc7b20 427c824d 41848a50", + "bd8c7390 3efba588 4246e2b4 42475b34 3ac08d91 3ef0a89e -> c05a7da1 41c3bc1a 42471ef4 3f1be83c", + "3f6fb12a be8ba324 40b2a4c5 424cd2b1 3d2e1ecf 3f948cd2 -> 41d4aee2 c0f7ce2e 41e3274a 420ccd43", + "3f6a2f64 3db44b70 41a16ef4 425242b7 3d0b3ede 3fcbdb00 -> 42051747 404ceda8 42117d18 41cafa67", + "3df43e70 3f6a7362 42394d59 4297540e 3d0ae34a 3fcb3647 -> 40e8c67b 425f7125 4273faba 41c0f94b", + "3ee99940 3f29128c 42856d7b 42dcd89a 39a8e24c 3ebafdbe -> 4221a2ee 4269f9ee 42b1230a 41e36792", + "bf74639c 3f5fafbe 428b8d18 42a16246 3cfc828a 3fec04c5 -> c28fa49f 4283798d 429677af 41542173", + "beb67832 be8ee122 42b31132 42fac2fd 3cef369b 3fb8be7e -> c2192f55 c1efe5b3 42d6ea18 41c63b6b", + "3f432e66 3e1ff0e0 42bcf8ad 42f858f8 3c600f47 3f3f62cb -> 42a6b639 41889c98 42daa8d2 41aa0bb1", + "3d6391a0 bf7f618e 407fe383 421bab2d 3d49b348 3f0ba7f7 -> 3f9898db c1ab3f26 41aba965 41d92420", + "3eb4d508 3f420ee8 40dd5182 42284269 3c61acce 3ec9f321 -> 410a6566 419484b4 41c3ec99 41bf11f1", + "3e0bb358 bf4fe0a3 420fee13 429f31de 3d364503 3fe9baf7 -> 40fc4a4e c23bb4eb 426728e8 420677c9", + "3f44010e 3ef4f694 42b9acf7 42d59835 3c860463 3f2339a8 -> 4298d94d 423f0741 42c7a296 413c9db0", + "3f4d5a46 3f2f7bce 42162435 42952e9a 3d109a2f 3e4b9de0 -> 4233e2e4 4219b8af 426040b4 41ee228d", + "3f32af80 bf3b2a36 425f715a 428d0936 3c8e69a3 3bd47f6c -> 42306c17 c238cb4e 427cc1e3 413a7274", + "bf367bc6 beb3db08 42be6b94 42e8e685 3cde349d 3fbc97c3 -> c296e084 c214b44c 42d3a90c 4191943f", + "3f351a78 3e737e68 410bc39f 422e8e58 3bf66112 3f7a77a1 -> 419434a1 40c7433b 41d17f40 41b8aa11", + "be8cd402 bf7b6c19 4289ba60 428ced3a 3d11b3d4 3f8867b8 -> c1994a6d c288d5ff 428b53cd 4096dd79", + "bddf41a0 bf00a5e2 42872368 42cf2a88 3d235b84 3e9180d9 -> c11542d2 c22c04c6 42ab26f8 41c54f29", + "3f4bcb94 3f5efe1e 418b7eeb 4283c160 3d2ef13e 3e8eefd0 -> 4204a642 4211251d 4226a11b 4222399a", + "3e8e637c bee62fb4 42959286 42b92dee 3d15588f 3f90be93 -> 41ba30d7 c2167fa4 42a7603a 41693759", + "3f6c026a bdab7c80 419ec1f8 41eb77fc 3caeaf54 3fb4fa94 -> 41b5b892 c0040a38 41c51cfa 410932f0", + "bf090815 bf1807e2 428adfda 42e36e1e 3c9b943d 3fb2502c -> c244134a c2598993 42b726fc 41ff2e89", + "be36147c 3f22685e 4229aa09 422ec50b 3d2da1f2 3e47fa55 -> c0f4fa88 41da82b6 422c378a 4033f41c", + "beb04164 be1cf30c 425309a6 42ba84c6 3cd81a81 3f9b25bd -> c1c91131 c1330b1b 429204cc 41ca7fb9", + "3e015378 3f4512dc 42990ac0 42f7ba71 3b4760af 3fdf9b82 -> 414a7609 429a42a2 42c86298 42009606", + "3ef761f0 bf7ca7fe 41e0c7b6 4209025e 3b6e3514 3f016556 -> 4171010b c1f62449 41f96639 40a6796c", + "bea8c484 befc0758 42a4b77b 4302c794 3cc83f75 3f981bc2 -> c20c82cb c251d4e2 42d52352 42021a28", + "bdd4e1b0 bf799930 425ef466 429f3044 3ce4cd55 3d966382 -> c0e113c9 c283f2e3 4287553c 41980349", + "3edd2fc8 3e68e568 422b4ee7 4296a852 3ac4ac73 3f1c5306 -> 41cc2cf9 4156fc0f 426c4fc6 419676b7", + "bf6c65b3 bf32b0ae 42ba4f75 42f57a84 3d00dcce 3f8a58d3 -> c2c75cdd c296b237 42d7e4fc 41dc8ed4", + "3f624a5c bedba3d2 4167eea2 425e1c30 3beea70e 3f3e7e65 -> 41f79668 c1704fa3 420c0bec 41ef485f", + "be2b7528 bed8e920 429552e9 42a66d1e 3d0d77f3 3f97f848 -> c15379c5 c205c4c8 429de004 410c27f2", + "bee72e0a be8fea76 42bb1d07 430c346b 3c94c541 3f839f1e -> c25318ef c20369fb 42e9c2ee 41eff0b0", + "bf66dc3d bf53e573 420325b0 428a67aa 3c3e5f4e 3f63f710 -> c237f28d c228d64c 424bfa82 41f3cb95", + "bdde21f8 bf51171d 42c3b27e 43129879 3b8da9ea 3feb7ab3 -> c1541b0d c2c7a6e9 42f471b8 420837f2", + "beb70c1c 3ef96f0c 427a5053 4299785b 3aba11cd 3ecf35f6 -> c1c739ec 4207bd7f 428b5042 410c8b89", + "bdcc8170 3e827c54 42adbca8 42c03de6 3b4d254d 3f0a0149 -> c1122e5a 41ba8afa 42b6fd47 40b45e04", + "bed6ae6c 3db8e9c0 42b8bae9 430611ed 3c9a6899 3fab29f6 -> c23de363 41238ed0 42e26f62 41d46eb9", + "be854e4a bf4a1108 429ddace 42c7999c 3cde951d 3f8ad607 -> c1ba22cc c28d12d2 42b2ba35 418aef9e", + "bf12d47c bf129400 40b1ee60 42220661 3c9a0b00 3dd65745 -> c1535fa7 c15302d2 41b8442d 41badb30", + "be59ebb4 bdf03f38 41a377f5 42770bd2 3d2e1010 3ff2518f -> c10bf009 c09a4640 422463e6 41ce43e0", + "3f6fbad6 3f7b8508 420578c2 428c0e56 3cc635a8 3fbc0891 -> 4241a62d 424b2c37 424ecab7 4208439a", + "3e951670 3f3a7a70 4028e196 40b0fd27 3cb3d3ef 3faf8a5c -> 3f983fe8 403e6eeb 4082b6f9 40552b32", + "3d3185a0 3e64c430 428f3c5f 42ae3c36 3cf82dd1 3ffab316 -> 405c2614 418dd958 429ebc4a 4148bc27", + "bf3d0a9f 3f4eccc8 41a18289 41c2d0de 3b6ab514 3fd00f17 -> c183902e 418fec13 41b229b4 40998f95", + "bf34612c 3f009f30 41caacca 42844b79 3d222462 3f9e8fc1 -> c200eae4 41b7da37 4236f6ac 41f6c0f6", + "bf5e3503 bd942bb0 428b2ab7 42ecde78 3d316137 3f44da12 -> c2a332eb c0d9a57c 42bc0498 421928b9", + "bea85958 3e8bf354 427922db 42820aed 3d1e2583 3fada402 -> c1a76f77 418b30e7 427e9c5a 40ab6191", + "3d0a91c0 bf305956 429b34bd 42c01d2c 3c127ff5 3fc35c69 -> 403bffe5 c26f4184 42ada8f4 41598122", + "bea77dc2 bf552054 42a7475d 42bdb7fc 3d0e9d0e 3ff219f9 -> c1e991f2 c2949ac5 42b27fac 414b8a1a", + "3efb5c1c 3f45312c 42b84ff0 42ec599d 3cf02406 3fbb4e29 -> 424e84cc 42a203a3 42d254c6 41b4615b", + "bd1432a0 3f28a31c 40ec522d 41dd8a66 3d4b1806 3ff95d84 -> bf227362 4138db1b 418c4f79 4177c56f", + "3f7af83c 3db6e620 429538fa 42b660b8 3d4789ee 3ff7ec0c -> 42a28ad1 40ece95a 42a5ccd9 4190158b", + "be929a90 bf58f981 4154d95b 421dcad3 3ce841d3 3fea08e3 -> c0f1ac1f c1b2d6a2 41d3012a 41a3e5b0", + "bf6d1840 3f0eb766 4265c805 42a3d8fe 3cc4f2af 3fb52249 -> c28113b0 421b6486 428b5e80 41ab4450", + "3f10f92a 3f2efadc 4299a986 42e4a639 3c3ef190 3ffb0f59 -> 425880f6 4282a86b 42bf27e0 41e2e2bb", + "bd979428 3f2170ec 40a6ef64 42470814 3ceae80f 3ff13f6a -> c00233ed 418aaca5 41dbe600 41ed89fb", + "3e57c750 bf473a54 4183cd3a 426240d9 3c9ba809 3fa1edc2 -> 40f6409a c1e35d3e 421213bb 41e0b2f6", + "bf77285e bf7d6e99 41309743 4259b5bd 3d31b344 3f9e9930 -> c1fcd020 c2019d8e 4202edc7 42227e76", + "3f20891a bf0dfefe 41ffb971 42015bdc 3cc66812 3fce847b -> 41a14d1e c18eac5f 42009c4a 402901ac", + "bf2f4a96 3f7c215a 420c1793 425530f5 3cff70e8 3e997e01 -> c1f1e783 422df8b6 4230a444 4181da37", + "bf1686a4 bf04f04c 41fb087a 428b474f 3d31e84b 3ea2c24d -> c1ed9792 c1d1d503 424a096e 41dd4108", + "3f559eca bd8b2348 4249a0d0 426f9e4e 3d3bed26 3f691ae3 -> 4238199b c06fd215 425c9f8f 411da3b1" + ] + }, + { + "glsl": "vec2 cultmath_iv_exp(vec2)", + "tolerance": "ulp-bounded, platform exp", + "platform": "Ubuntu 24.04.5 LTS; .NET 10.0.12", + "cases": [ + "41202b2a 4120314e -> 46ade79e 46ae2a6b", + "c0d1a016 bfb9db96 -> 3abb4cbc 3e6fb77f", + "bf8fdd04 bf8cd5fc -> 3ea6664d 3eaa61db", + "40024c0a 40b9ecd3 -> 40f51721 43a6d60d", + "4197c9d9 4197cafb -> 4d25c5b1 4d25dd2e", + "418b9b87 418b9bc1 -> 4c10a577 4c10a991", + "40ceb567 40cf50f9 -> 441fb557 4422c533", + "c0d71f2c c0d71180 -> 3a9dbd63 3a9e00d8", + "41149716 4115dd36 -> 4628ae10 4636a8d3", + "406d8085 406d9a7b -> 422392dc 4223d546", + "bef5bff4 bef5b08c -> 3f1e6964 3f1e6e2a", + "40750628 40750e38 -> 4237f95f 42381090", + "c0e728c3 c0e719d5 -> 3a3f1fca 3a3f790c", + "c18aec70 c13b5136 -> 32f6c219 370a21a5", + "41902341 4190380f -> 4c7ed262 4c80b63b", + "c176d7d2 c174bd5e -> 3456290a 34743f6f", + "c10d5076 c0d80228 -> 39190e2c 3a996ddd", + "c11b8847 c11b8125 -> 387bc1f8 387c324f", + "c06ec60d c06eb253 -> 3cc46278 3cc49f0b", + "bebf1b28 3fff14ca -> 3f3040e5 40eac236", + "41284f27 412dd379 -> 4710a018 474c2b74", + "c14fa678 c14fa5ac -> 361b0a4e 361b1209", + "c0fad4ed c0fab9bb -> 39ceb51b 39cf6513", + "c17de632 c17db6c8 -> 3409c9b1 340b6464", + "414f6c8c 41531eac -> 48d06242 490343fa", + "40e7d966 413623fd -> 44af2f87 47aba695", + "4070804e 40800e69 -> 422b6be7 425ac6f1", + "41939c17 41977345 -> 4cc4a616 4d1ee90f", + "40b28176 40b2921a -> 43844fa5 43849487", + "409c38a3 409c42f5 -> 4303e1fe 43040c90", + "c0d1e402 c0cc5be6 -> 3ab9c0d3 3adcce50", + "41947227 4195082d -> 4cda50ce 4ceae88e", + "c19594e2 c1958d68 -> 32023b0e 3202b4fe", + "40f50c60 410a2aac -> 4504502d 45afdbe3", + "c140d47e c140d36a -> 36c3be27 36c3cb5a", + "4157dcae 41587a42 -> 49308d18 493779c5", + "c18e5e55 c18b41ad -> 32a06b8f 32ecb2ea", + "bfbee7f0 bf3151e0 -> 3e66724b 3f00101e", + "41583ab2 415903ee -> 4934a680 493dbf51", + "4155faca 4155fb46 -> 491cf494 491cf956", + "c1642b98 c15d8292 -> 352bff46 3582660f", + "c170f311 c170e907 -> 349ac48d 349b25c9", + "40d7b019 40d7b79f -> 44537137 4453a2f5", + "c197fc9c c196e2aa -> 31c0d460 31dd4a53", + "417d6191 417e0607 -> 4ae63cd8 4aefab93", + "408b17d2 408b1c2e -> 429a709b 429a85a9", + "4070bc94 4070f07c -> 422c0da3 422c9969", + "3fbb7abf 3fbb87c1 -> 408a7002 408a7e16", + "411a81e4 411c27dc -> 46742941 468753f5", + "c1bc5882 c167813d -> 2e8314cf 350ba3e2", + "4080a820 4080c3b0 -> 425eebc5 425fac1c", + "c13b3160 c132dfce -> 370b358e 376a223e", + "41565c23 4156610d -> 4920baf8 4920ec5f", + "4154b6dc 417c728c -> 49110553 4ad92fd3", + "c13cf6ed c13cf369 -> 36f93c12 36f972de", + "417e9504 417e9654 -> 4af82f45 4af843a3", + "c03dd70d c036ea23 -> 3d52ed7e 3d6b086f", + "c189a001 c188ae87 -> 33111f87 332348b9", + "3f52dca6 3f8c44ed -> 4011d8fd 403f7897", + "417629fd 4187c3a2 -> 4a92a631 4bb2ef53", + "c1091e4a c1091d4e -> 3946f2f5 3946ff35", + "417f141f 41818095 -> 4b0000e3 4b2399cf", + "bf91ec53 bf59891a -> 3ea3be49 3edae43d", + "4184d364 4189dc9c -> 4b77dc1a 4be8937a", + "c14bf8de c14be10a -> 36431c63 36443fd0", + "c193ea76 c193e75e -> 32206043 32209e56", + "be900eda 3fad7536 -> 3f41378f 407825b7", + "c08794db c025ce1a -> 3c6cc82d 3d99886a", + "3ec7f803 3ecc0d7d -> 3fbd2902 3fbeacd1", + "c012cb8e c0119f12 -> 3dcea215 3dd27533", + "c0daaa3f c0daa5c1 -> 3a8d34be 3a8d4894", + "c050634f c039c7b1 -> 3d1ddc02 3d60bdf3", + "409cd424 409dee6c -> 43066900 430b1f58", + "408cef3e 415094cd -> 42a3968b 48e003a2", + "c14e4c28 c10ce1c8 -> 3628b807 391d3f60", + "40752252 4075256e -> 42384a67 4238535d", + "40fd9a10 40fda0f0 -> 452cdb86 452d00af", + "41036130 41040d3c -> 456620f1 45700037", + "c077e68c c074d5f4 -> 3caa48ab 3cb2a306", + "c1147257 c114703b -> 38c40310 38c41ceb", + "c1048df6 c1048c9c -> 39844f07 39845a37", + "40dfedd6 410d03dd -> 4488c689 45d22042", + "c1624386 c15f0030 -> 3541c354 356d98cb", + "405e12af 40636bf1 -> 4200886a 420bbc84", + "c14500ef c144fb45 -> 3696ccaf 3697021d", + "c17d28a2 c17d267e -> 34105085 341063d7", + "c123eec5 c123a46f -> 3814ecdd 3817a718", + "3eddffe7 3ede4019 -> 3fc57a2b 3fc592f1", + "40c3acf4 40c3b46c -> 43e24452 43e2792a", + "c1a9f6d8 c165a819 -> 30230d14 351cbd2c", + "4184c5e2 41aaf14e -> 4b763af9 4ee31c73", + "3f9ec35a 3f9f0406 -> 405d3bd5 405dabba", + "40c71490 4165a95c -> 43fbab24 49d1201c", + "3fc1015d 3fc19163 -> 40908b7c 40912e7d", + "c17ee168 c151c9c2 -> 34019755 3607a61b", + "c0c3c1df 3fa3ddfc -> 3b107367 40663bd7", + "c17826ef c17819e9 -> 34455621 3445f704", + "c159be3f c159b8bf -> 35a50371 35a53c36", + "c0020079 bffad0ae -> 3e0650d0 3e104fe8", + "bf44e41c 40b3c1d4 -> 3eed4658 43899686", + "41864aa6 41864b9a -> 4b94d9e9 4b94eba8", + "413cd099 413cd103 -> 48023ffc 4802435d", + "414b49e2 414b9486 -> 48a0ebfd 48a3e196", + "414771e6 414778e2 -> 487d1ce3 487d8b7a", + "40dd96fa 40dfcc76 -> 447e4461 4488382e", + "416ded4c 416df1fc -> 4a2f472a 4a2f7a8d", + "bf429f16 bf41ceea -> 3eef6343 3ef0263e", + "c154a284 c1548980 -> 35e3142d 35e4784d", + "40394b3b 403a4ab5 -> 4190b309 4192f92f", + "c181b997 c181b831 -> 33c2cb42 33c2ed54", + "c1708f7c c1708764 -> 349e939c 349ee3ea", + "c006ab5a c0067636 -> 3df9bcce 3dfa8c83", + "4138ad4a 4138af22 -> 47c922dd 47c93a0e", + "c1aaddba c18114f2 -> 3011aaed 33d319ca", + "c1052891 c1051da3 -> 397ed0c3 397f7f11", + "40f07cfb 40f07f15 -> 44e57ad1 44e589e6", + "40a83277 40a834e1 -> 433fbe6b 433fcce4", + "c1970cb1 c18a3aaf -> 31d8cba2 330690ee", + "c1664f64 c16597a8 -> 35167759 351d5e8f", + "c016aa8e c01673a2 -> 3dc28157 3dc3288b", + "c152f8e3 c152ed29 -> 35fbf1e6 35fcaad3", + "40c4c97f 40c707f1 -> 43ea43a1 43fb47f7", + "c19a2cb6 c19a29e4 -> 3192b092 3192e454", + "bf5cb30b 3e91dd16 -> 3ed833f5 3faa30d9", + "c173577e c162d986 -> 3485462a 353acbab", + "40c3d3a0 40c3d490 -> 43e35669 43e35d14", + "bf70eaa9 bf6e8997 -> 3ec7c912 3ec9a69e", + "4156037d 41593933 -> 491d4a01 49403b2d", + "40edd117 40eebf99 -> 44d3199b 44d95626", + "c13a6ff3 c13611a9 -> 3711f0d7 373fc165", + "c0886ac7 c004b4a2 -> 3c66adc4 3e00c274", + "41915f3c 41917138 -> 4c94aa97 4c95fa47", + "416c02e9 417a49a7 -> 4a1b802a 4abdc33b", + "404d6730 404df460 -> 41c61e4c 41c7d540", + "c11e8199 c11e6ff3 -> 38510e1b 3851f534", + "c1357761 c13576b7 -> 37471dab 374725f1", + "419b9eea 41a2b6d6 -> 4d85d234 4e22655d", + "4199121e 41a4bcae -> 4d42976e 4e511dca", + "403ceedf 40ad4180 -> 41992a72 43609544", + "c10ac2eb c109be27 -> 39338851 393f5577", + "40b06b2d 40b0756b -> 4377ea0c 43783974", + "4146c423 414736b5 -> 4872998b 48797b3f", + "40a579c5 40ad2ef3 -> 43301c69 43601338", + "40867c7c 40868924 -> 4285bb91 4285f082", + "c11b8dde c11b6a62 -> 387b6a13 387d9a15", + "c15e5062 c15b8992 -> 3578044a 3593823d", + "c0f20ac4 c0df35c8 -> 3a080645 3a7504c4", + "4175e861 4175f5af -> 4a9051a2 4a90c9d8", + "c0d0b202 c0d0a082 -> 3ac0d2ae 3ac13c40", + "40f23807 40f24359 -> 44f23b80 44f29142", + "40bcb7fe 40bcbac2 -> 43b60e43 43b61e01", + "3fec5a99 403a96c4 -> 40cace61 4193a841", + "4058f90a 406037f6 -> 41ed6007 4204ea3f", + "c19c9154 c19a637e -> 315987b7 318ed16a", + "c083c2e8 c083c20c -> 3c85670b 3c856aa2", + "c1927ebc c189bbdc -> 323f8b7c 330f29a6", + "c13bc94e c138e5ba -> 370623e5 3720af66", + "c1903287 c1903073 -> 327f45d2 327f882c", + "c18dcc20 c18da0d0 -> 32ac4a91 32aff94d", + "41241856 41241c9a -> 46de4628 46de8174", + "c149a219 c1498cf3 -> 3661d2b7 3662fdfc", + "c17daadb c15be833 -> 340bcc6f 359023d4", + "c1526edf c1515197 -> 36024a19 360baffd", + "410f5073 410f5735 -> 45f2990a 45f2ff98", + "418081a1 4182dfcb -> 4b107375 4b4234b8", + "be2f2f61 be2a219f -> 3f57bec7 3f58d00a", + "c147088e c14707c6 -> 3684d52f 3684dbae", + "418415d1 41847393 -> 4b61f244 4b6c87da", + "40cca9b9 40ccaa97 -> 4415d180 4415d592", + "418103b8 418103fc -> 4b19ec9e 4b19f1bc", + "40915d28 4106f73c -> 42bbdf9c 458ff907", + "415a09c0 415a1148 -> 494a45ac 494aa4fb", + "c0d79718 c0d76aa4 -> 3a9b728e 3a9c4b17", + "c022fa3b c0152575 -> 3da077df 3dc72e06", + "4100d622 4104fde6 -> 45444f18 457e8659", + "c1356667 c110c6bd -> 3747f160 38f68d2d", + "3ebbca75 3ec9858b -> 3fb8b6cf 3fbdbc1c", + "c19237e7 c192310d -> 32464918 3246f335", + "419707fd 4199690f -> 4d16cce4 4d4b07b9", + "40ab2960 40ab2a60 -> 43525b19 435261ad", + "4171dd3d 417d47d3 -> 4a602e46 4ae4cb97", + "4131b591 4136ef6f -> 47822040 47b4644a", + "3e10a062 3f06df68 -> 3f936ad1 3fd8c755", + "409828ee 40982db2 -> 42e85391 42e8762f", + "411800b7 41189eb9 -> 4650c83b 4658fe59", + "3fd45d75 3fd4636b -> 40a8259a 40a82d71", + "400f4bec 402d8b74 -> 411624f8 4170dcbf", + "3fd386e5 3fd3cdbb -> 40a70caa 40a76938", + "bf91ee69 3fa50909 -> 3ea3bb9e 40685834", + "3f29298b 3fff963a -> 3ff7d963 40ebb013", + "c16d1803 c16d1739 -> 34c4f0fc 34c4fab4", + "3fc7105d 3fc73ac3 -> 40978d13 4097bf50", + "c00692a2 bffc4cbd -> 3dfa1d56 3e0ea5e3", + "41500857 41554a31 -> 48d87662 49165507", + "c19c5c71 c19b7aa9 -> 315f3881 31793cc7", + "bf8bdf6c 40b3764b -> 3eabab4a 4388533e", + "c0cf7436 c0737944 -> 3ac87344 3cb67ab6", + "c180611b c152db2e -> 33e679ea 35fdc764", + "c168c603 c168c403 -> 3500fedf 35010f02", + "411b944b 411d77cd -> 46828a0c 4692e51f", + "4111ea58 4111f560 -> 460eb64f 460f18d8", + "418942a2 41894466 -> 4bd7bb33 4bd7ead7", + "c165800d c1657c43 -> 351e4765 351e6ce7", + "c0ff15d8 c0e732e0 -> 39b4fa92 3a3ee36f", + "418b2695 41913acb -> 4c089e3d 4c920b63", + "4141eb39 4141ec7f -> 4833310b 48333f51", + "c1618094 c14fd848 -> 354b353c 36192a8e", + "416d127a 4181d013 -> 4a2628ec 4b2a1365", + "c12c2882 c12b27f0 -> 37b22074 37bda432", + "c132c5f9 c10872dd -> 376b9d70 394f73c3", + "415a1b25 418b5009 -> 494b220b 4c0b695d", + "c1664144 c1663f72 -> 3516fc69 35170d99", + "4193287c 4193c44c -> 4cb9db17 4cc88c31", + "40e35323 40eb070d -> 4498166f 44c17aa3", + "407ae7f7 4083215c -> 4249af1d 4270d60b", + "c16c6d87 c16c5279 -> 34cd4fbb 34ceac0d", + "c1854c1f c14bc377 -> 33794569 3645abde", + "c1878438 c174a2d0 -> 333ce31c 3475d61f", + "c16e15b2 c16dfe3c -> 34b91d2a 34ba2d63", + "c186191d c1861537 -> 33618758 3361f55c", + "c0ee532b c0ee51a1 -> 3a18c798 3a18cef4", + "4125bcb1 4125c2ef -> 46f64bf5 46f6ac20", + "41435826 4143a7e2 -> 4843e39d 4847bd60", + "4141e5b9 4142f0c7 -> 4832f37d 483f01e0", + "419f32eb 419f39c5 -> 4dd14cf3 4dd20083", + "40cb4342 40cdb75e -> 440f676c 441ad4f1", + "4165e3b7 4182eb9d -> 49d4204a 4b43547f", + "41079ed6 411a174a -> 4595fc6e 466de380", + "c16a9ed5 c15ab975 -> 34e5dd5c 359b327a", + "c12f9849 c12e8603 -> 378fb266 3799a604", + "3edb505a 3f136953 -> 3fc471ac 3fe3a921", + "c1506cd1 c15060a7 -> 3613b61c 36142695", + "40b9f7e9 40ba784f -> 43a70fe1 43a9b37f", + "419521ae 41952506 -> 4cedda1d 4cee3d9e", + "41074ff8 410750a8 -> 45932031 45932685", + "40d9f8c3 4115426e -> 4463159f 462fe2c7", + "c0b7ab40 40806080 -> 3b52c17e 425cfafe", + "4005e1fc 40640484 -> 41019b63 420d0b33", + "c1762c19 c1416a91 -> 345f546a 36bcb364", + "c0e1be65 c0e0b257 -> 3a625df5 3a69e58a", + "412e612d 412e62c3 -> 47535b4e 47537044", + "40e4c428 40e4dcb8 -> 449f1864 449f92b3", + "419c93fb 419d0c35 -> 4d96d4f0 4d9ff38c", + "bf4f1957 bf4e8269 -> 3ee3ffea 3ee48680", + "c144d67d c144cba1 -> 36985ed0 3698c65f", + "40fcf00d 40fd1413 -> 45294e9f 452a0da4", + "c170377a c16f9c1a -> 34a2054c 34a848e7", + "4119be6c 411dc410 -> 4668c871 4695a7d5", + "41732663 41737c65 -> 4a72f06f 4a78182a", + "40690b7e 40697ad2 -> 421891cf 42199c1e", + "beb85bd2 be97a02e -> 3f329775 3f3e61d7", + "41325a08 4187bbc4 -> 4787750a 4bb23fb3", + "406ea634 40909ea6 -> 4226883c 42b78e0b", + "c18b47ee c16b52c0 -> 32ebfa26 34dbfc84", + "c11e1519 c0deff46 -> 3856aab4 3a76a784", + "40c786cc 40c7941c -> 43ff33d9 43ff9e1c" + ] + }, + { + "glsl": "CultPhasor cultmath_phacelle(vec3, vec3, float, float)", + "tolerance": "ulp-bounded, platform exp, sin, cos; across platforms |diff| <= 2^-20 max(|v|, 1); on a device |diff| <= 2^-18 max(|v|, 1)", + "platform": "Ubuntu 24.04.5 LTS; .NET 10.0.12", + "cases": [ + "c01d8630 41b2cd8c 41ea274c bfa19894 40aeb6ce 40918978 3e9be843 3f000000 -> bf74d9fb 3fb71956 bf35fe4e 3f21280a c01277e2 403b5fe4 40464bbd bd5b4455", + "c2234cf7 4237b112 419ae0c0 c0acbcd4 bf60f9a0 bfeb2b08 3ebf0a10 3f000000 -> c0d0048f 3f228da3 bfc85f60 3edaf41b c0171c80 be137f8c be1c92a3 bf5747bf", + "41cc0920 42390a28 c1c4714d 4095ff5a 40ae1422 40138f40 3ea0019d 3f000000 -> c0626854 c06c83d4 bfb294eb be676f09 bfcf7e6e 3d2e218b c0200a4a 3f167e2f", + "42370b68 c2438846 c1e6efa5 c03373ff 402d665c 4013a940 3e578396 3f000000 -> 3d678d11 3e4c172f beeb5835 be30e395 3f0a6332 3ede254b bee8e250 3eae4126", + "c08f5578 411586a8 42413a4c c019de34 3fc5c70c bf08ccf0 3f5a6e2e 3f000000 -> 401e1cfd bfc4bac6 bf58739f 3f279e2b bcc6aac3 3f322772 3edf42e6 3df7608b", + "c11d6390 41b27d04 c17248a0 402cdca8 c0bf8bd5 c0829639 3effad62 3f000000 -> bf03c0db 3ff17078 3f87ac38 3f75d4e0 3fe2b4b6 c0cfb86d c0697330 3e8ede55", + "c114785c 41ee8f54 3f8c8d40 bf6775d0 3fa2f210 c04f602b 3cc8f8e9 3f000000 -> 3fca86f2 3f6577fa c01a4f40 bec279f7 3f5a1dbd bf3c2a09 4028e32f bf207dbd", + "c211a0fa 41530bc8 c121f734 40a8c3f0 40b21602 40a4ff6c 3f048cf0 3f000000 -> 40c38039 40992e68 408dfc05 3a08c9d8 3b50ece4 3b23b31a 3b17bbad bf7ffffe", + "41a9de18 41022de0 c2149dfc c04ff8bc c0709652 c09be326 3f22f44d 3f000000 -> 403bf7c9 40419292 408b5124 3e679c10 bf2e9566 bf33ca05 bf816597 3f795da6", + "c156c260 41a86c28 41c868c0 4064de10 40964edc 3e7448e0 3eb4f280 3f000000 -> bf8c32e0 bffb8ca7 3d8b13de 3e438cc7 3f323542 3f99dc06 40017862 3e874112", + "c1d068b3 42225982 c205c8f0 40ad9ff8 3ec5dd80 40707e58 3f0ce75b 3f000000 -> c0349e81 3f3fc530 bfaf1dbc bf18915a c08caaaa 3eac5ccd c005c769 3e9225e7", + "c1e59fe1 41a04784 4208ac42 c0920956 bee7b4a0 c07134a5 3ea378b1 3f000000 -> bf3feef3 bdb8ba0b bfa29638 be587b15 3f3930d2 3ef203a1 3fff1a53 bdbfd9a5", + "42389eb6 4106e060 c15fbf54 3ffd6f00 3e9e6f60 bffcb888 3f3075cd 3f000000 -> 3f332fdc 3c8560b8 bfe1216d 3c2f34ca 3bf5488d 393690af bc9a1676 bf7ffc41", + "c20f4cf6 c1dfe857 bed31800 40717ea8 c0a6b312 408b5396 3d29b33a 3f000000 -> bfdb8d4f 403490e4 3fb46b68 3e471378 bd600a14 bfbec46f 3fc2be3f 3eaf81a2", + "c224ee6a 41d06018 414aa3f8 4024db50 40215b48 40036b94 3f657d0a 3f000000 -> bff064ec 3f7da25d 3e056ae2 be8ac707 bf782c47 bed3745c c00c9402 bcacdb39", + "41b4d2e4 c1d569b9 4242f024 bf523eb0 c0933fbf 40b37860 3effacc8 3f000000 -> be71736c bd8a544e 3c17c22f 3f7aa6b3 bf04a68a c05faf26 40b9af6e bd872883", + "421867b6 c1aa947d c21c327e 402c6040 409cb72c c00c5822 3ecef6a5 3f000000 -> 402c1659 40ac0e18 c01c7aba 3e2e0e0e 3eed75dd 3f6d6a7b bed7ec61 bf7c4657", + "c2158204 c12f6f30 c212cbea bfce6068 c0725f30 3ffc14b0 3dc82c17 3f000000 -> bf1395df bf305c8f bd010deb 3c80722f 3faded2e bcab6bdf 3e04aa20 3d81745f", + "41949b58 4187ba84 c210eb56 becef150 40aceb96 3ddc8e80 3e004e03 3f000000 -> 3f1c001d bfbfd00c 3f9c703f bf46ef9f 3ee14306 c015c255 3facb8b2 3e843e47", + "422ff3b8 c1e3f97a c117efcc 4041ae24 3e35fc40 bf6d0858 3e712c37 3f000000 -> bfdb3c1a bdd2c0db 3f47d294 bf103816 bf957c53 bd8fb3dc 3f083fd8 3f5382c9", + "c16e4c30 c14b7fe0 c1d54085 bf8b652c bfca9a04 c06e21c5 3e857f24 3f000000 -> bfff4d45 3eda6caf c0881cdc 3e7adfa2 3e134e36 bfc64ff6 bec024d1 bf36ee7d", + "422d5612 c135cecc c224002b c0836a40 3f0bfd30 3fd2bf48 3f762107 3f000000 -> 4058e898 bf411a76 bfb68041 3eaab85a bf996e7b 3e8897c4 3f0117dc 3f715983", + "c14fd0a4 bf22c600 c17192b0 3e9dd3c0 c0bd4f62 40656694 3d24f368 3f000000 -> beff75fe c0d75ce4 4082d09b bcb4fe19 3c34a7be 3e184c99 bdb90498 bf7ff000", + "40cb6f18 420bdb7a 423a18e2 c0802b55 beff9dc0 bfc16eb0 3f70ee13 3f000000 -> c05a7f35 3bd810da bfa0cad2 bf57161c 40a94183 bc275f6f 3ff91c8a bf0ad490", + "c22b4d81 41a392ec 423ce770 bfa3e2d8 409774fa c07e6f32 3f46714c 3f000000 -> bfdd6fa6 c021e2ac 3f2cb532 bdb4ffec 3f462d16 3f9d4611 bd304b02 3e837570", + "c240fbd4 421fd45a 42368e94 4072edd4 be9e9f10 408168ea 3f409e77 3f000000 -> be0c201f 3e503fdd 3f593961 beb7f078 bfceca04 3fd3e1ed c01a947b be971b5a", + "c1ad5e19 c234eb2b c1992a12 bf925044 408ec268 c0811449 3f11dc15 3f000000 -> 3ce1b4ed bf8e626e bf3702ca 3e813a39 bfef3d1c 3ee5ef0e bf8e2b47 3ea3bffa", + "41b11cb4 c2319747 c1daccd8 3dbfd100 3fbeaea8 c06a0c7a 3f499901 3f000000 -> bd08f86d be126b45 3f3e0a22 3f7b45e0 3e2fb5ee 3f3bd519 c073ca22 3e43df83", + "401448f0 c1b97248 c1cd9516 409d535c 40729590 c00a8b84 3f5c91a7 3f000000 -> c02190d3 c0074540 3fcc5f79 bf5d6668 c08b293c c0690647 4030083b 3f0085c2", + "419185b0 c218e79b 41d39378 3fe82ab8 bec18960 c070f0d1 3eb484b2 3f000000 -> bff7009f bf8500a5 bee6158c be3828fa bf6a662c 3eccb98c bf6cdf5c 3dbafc39", + "41168240 c12bcd00 41a77fd8 3ec9a8f0 40b14a60 c022edc0 3e8f8133 3f000000 -> bf4d6951 bfced089 3fd09f28 3e4b56a7 bf235d91 3faeeb49 3f05c7de 3ed2998b", + "41f18d48 417ab7a8 41d12f88 3f850ee8 c05e8ec5 bfc59408 3eb36176 3f000000 -> bfd29c74 3fd88088 3fe1c9a7 bed46ebc bf931609 3f5efd4d 3fb82d63 3f5cc8b1", + "416d82f0 41c49bb8 421a3306 c0306d62 40b5cea4 40bb4472 3efd1e3a 3f000000 -> 3f8d136e c0ac0e05 c0871c46 bf11f6d0 3f43d331 c06ed382 c03b8b60 3f524f79", + "415235f8 41aab240 4222a50a 3ff32d18 3e55d580 40961338 3f19f48d 3f000000 -> bf5d50c2 beaba634 c00d26d8 bf5a88cc bfb55d2e bf0ca9d7 c06757b1 3f055641", + "422bfc72 408d09e0 41cadff4 bf949404 40b76420 c05932ce 3e0260c0 3f000000 -> 3e1ad712 c0700bfc 4035036a 3e345710 3f873541 3ed84397 bf4514a3 3f2c6e39", + "4182b7f0 3fdb3500 423dfe3e 3ff98528 409c70a4 3db12680 3f38a282 3f000000 -> 3ef90c71 3fbabdde 3cffa967 3f70ef28 3fad5f13 4081ff52 3db1f9b3 bead0d2a", + "413263c8 bfec49e0 c18d8a1c 3fa248b0 40ac1f40 3e0a2c00 3d090b54 3f000000 -> bca80779 3e97874d be698984 3ed80cf6 400f1075 3fccdce2 c02c14f7 be947a34", + "c14cd5dc 421796b6 c13e9a50 bd739d00 c06779b4 40898cda 3f76729b 3f000000 -> 3dc4e9ea 401d4ac1 c064800e 3d4e6b1f 3f0e7a24 bd288139 bf8f7aa8 3f1baa65", + "418f6740 41f235c8 4215cd42 bf2b2258 bf9e2864 40096424 3f5f39ba 3f000000 -> be5562ac bf1d54e0 3f6bf72d 3f43aa38 be7cebc0 bf3a7b3d 3f8bd79c bf25145c", + "c21af350 c244d836 c1fd5079 c04d5704 c084cb9b c054b65e 3f7c2c02 3f000000 -> c02a3303 c06ce177 c052a8f5 bf0fe3fb 3fe753f7 4020fab9 400f290a bf53bc0b", + "c1d91797 422434ca 412c86c4 c0a6a1ff be700520 4051c5d0 3ca2ec6d 3f000000 -> bf1cff92 bda671ee 3ec4b46b 3f7e5aae c0ac3c44 bf369954 4057cba2 bde7da35", + "c1d68924 4105a85c c232ef2e 3f547b60 bfb8f8a0 3f50ae20 3f0ed843 3f000000 -> bd6ae04d 3e01e51e 3e889d50 bf7356a6 3e33b352 bec6c2fc bf510b30 be9f06e2", + "41841508 c14ba5c8 42234a50 405641f4 bfd89908 c080c7a1 3f7bf0dc 3f000000 -> bf3b659f 3ec0b685 3f5fef14 bca2d5fe beed41b9 3fcc95eb bf9ffd2c 3e6bca16", + "41ab7d88 c21fcf04 c1e179b7 3dfeaf00 407c2510 40861d2c 3eff6bda 3f000000 -> bdcb6bb1 c05d2a17 c0889194 3f1af01f 3d9aa858 402825d1 404fa971 3f4bca27", + "c028a180 c2101cd1 c14b29b0 4061d5b4 c022a6e0 c0ad68f3 3e12c886 3f000000 -> 40663b25 bf6aa5f7 c09d9806 3eca8ae2 3f001429 bfbc0b57 c013a1d4 bf1b5a3b", + "423b61ee 41da6f74 c0e340e8 402786a0 c09f560e 40aa08d4 3ee514bd 3f000000 -> bfb36e85 3f46f4b1 bf106e8a 3f005d21 3fa2e925 bff0bd92 4082f0a6 3ea0c372", + "c1e09e66 4200bc6e 42160ccc c0b94bf0 c09563b1 c00edb9a 3ee5217f 3f000000 -> 3f5e70d3 be3daa49 bf60e2d7 bf7f2f3e 40a22522 4058004b 407f97ff 3d6acf26", + "415844f0 c1b3e51b c09452b0 4062b54c c0a9938e c0bfa747 3f03a752 3f000000 -> c07e79d5 3f9abc5e 40b3b865 bec9329d bf4d4643 3fcc1b8d 4055427f 3f135eda", + "41f8079c c13085d0 40b23b40 3fe9b53c 40a2c5bc 3e812310 3f421804 3f000000 -> 3f9a888b 4048fc90 3f2853bf bea6db97 bf8b3b40 c06871cf 3f4b592b bf27064d", + "c0b3c8c0 418fb67c 41dc16dc c09ceab9 3e6fd6c0 bf831b38 3f32576b 3f000000 -> 4041fbf6 3f30df22 3fa02073 bf35b78a 40437cf4 3f323e29 3fa15e3f 3f3451ab", + "411f7b4c c004d920 c22fa918 c02da068 c055a0e8 3ee19bd0 3efd8284 3f000000 -> 3f9817c5 bf273561 3feaa15a beceee3b 3f36eacf 3f6dbac9 3fb6cd63 bd3d9141", + "c1b116e6 c17b269c bf359880 4026ec70 3ed8af80 c0ac483c 3f56a6d4 3f000000 -> bfc59e8c bf8b6c76 406a4bac beedc8bf 3d8c6f6d 3f194605 401f620f 3f57d242", + "4211d5bc 4227bfec 42478b8c c04f7fc3 c0adc1ad 3fc640d8 3e2238a6 3f000000 -> c0065870 4085e896 bddecf21 3ef51ec6 c001e4e3 c0942e30 3f93742c 3ecffd80", + "c13a9b48 4215507c c22d9bc0 c0821bca bf704af0 40115710 3f468136 3f000000 -> c0918384 bf52e975 4012a5ad 3c75cf34 bd8bbcac bc4a8a30 3d0cd357 bf7ff8a0", + "c20f1ece c21ffea2 422a7012 3f8c7660 40995902 4040ac00 3d116056 3f000000 -> 3dd24475 3f0257e2 3e94b0e7 3f7ee7e0 3f8dad6c 40afa654 40486001 bdbd2806", + "41ecb608 c12b84f8 40081f90 40813ce6 bedc1030 c0b8a6e8 3f0809c3 3f000000 -> c02fa8c1 beab3a7f 40960677 3eae650f 401e01bb 3f4be807 c061dff9 3f3e784e", + "c23557cd c22ee236 422dec0c bfab14f0 beba5920 40a129c8 3f14486e 3f000000 -> 3edf63e2 3f89ad66 3f62bc48 be82f506 3ecb6c7d 3fb2124c bf4d3800 3dd416de", + "41d036a8 41dcffc4 42109e0a beabf9d0 405b51f8 3eeade20 3e5d7f17 3f000000 -> 3f07ea04 bfa56fed 3ea81b0a 3f2ee322 3ece768c 3faf645c 3f384e15 3e505428", + "412987c8 4245f2a6 c21ae699 406671d4 40856e34 4028c024 3e0bb6ab 3f000000 -> 3f36a476 3feda490 4014acd0 becb2833 bf62aeef c0067f23 bff1138a bf226e54", + "c1cd9608 40d5cc60 c215a3ae 3fd0c7dc c0193c75 4068b26c 3d8cb1c1 3f000000 -> 3d10422e 3e40f172 bfb70337 3dd36d87 3e9b9b68 bf061072 3ed68cdd 3dae5656", + "402a1290 c00f66d0 c12ac7e8 3f7ffab0 3fa8dc78 3fc31a68 3eac67a8 3f000000 -> 3e849364 beeb2a60 beb11aa9 bf096646 3e28a9a7 be9596b3 be614fcc 3f5800d1", + "41f86560 c21387cc 41da0bb0 40ad9c34 404f0380 c06955a6 3ec38ca3 3f000000 -> 4051060c 4049a136 c06c3932 3d6e93ca 3ec49aee 3eeeeaf1 be2756e4 bf199aea", + "c18cfd0a c22e2df9 c2183993 c0944ff9 c05cafc6 407522c0 3e427d9e 3f000000 -> bed10aec bf8a4c66 be3b9a2f 3f4c99f9 c05992f6 bfe5ef19 40b04277 3b9e4922", + "c1234f94 c1125db8 c2396684 3fb34320 c01a0df2 bfa15770 3f4dba61 3f000000 -> bf06b0b0 3f9ab722 4015f0a2 bef806f6 bf0ed8df 401d45a2 4033805d bd94d008", + "becde100 41f71f74 41ca27ac c07e0eb0 c0932f6e 3e016a20 3e6f4d36 3f000000 -> bfd75631 c004ac1e beb4ac39 3f5e9e60 c03da0d3 c069aa76 bf1f1a4c befcccbd", + "c1a11363 c04affc0 421b7918 c0791c48 409de748 4091c1ec 3f4ba35d 3f000000 -> c082f030 bf2e5549 3fc22296 bea4b41a 4020d624 3f92c389 bef4f62e bf176b8b", + "42117a74 c17fb1c4 420b2de8 c0a2138a 3e90ae40 4043760c 3f6b5429 3f000000 -> 3f357a64 3fe93e1a 3f995c83 bf49b691 405b25af 3f11d84b bfe6e01a be9351e1", + "3e678500 c2456a1b 400dcaf0 c09e4658 40b9c7d6 4091723a 3e03bb08 3f000000 -> bfce6c50 3fd00387 3f9bfd05 3f75addb c0b03212 40b18dab 40852572 be8fe9d9", + "c22c5efe c1652dd8 423aa5d4 c01183cf c04dc713 3ecb62c0 3ea10842 3f000000 -> 3dea2095 3e3771af bd19b328 bf7fba6c 401ea6d5 40789d53 bf504d96 3d3cb169", + "c18e2f0a c2400dfe 41e254b8 3feac4b8 400e93b8 c087137a 3ccdb1ae 3f000000 -> bfee5ffa 3f0532af 40811089 be0c8abf 3ce87098 3f4b5598 3f7990fc 3f5a06b9", + "411a0808 c1d76557 422f40c2 c0187e55 40a8cf74 bfa217c0 3f08c39f 3f000000 -> 3fa8459b bf44e415 3fac528a 3e6f3f61 be2930ac 401bd788 bf1e6729 3e589a03", + "c22caafd c1f928d8 407832b0 4053dc44 3fd7bc78 40939954 3f7e644d 3f000000 -> 3e1e1f8e bfbbd6ee bf3cd4af be587210 bfc0cf54 beac3507 bf05c38c bd7a7df4", + "41f1f3ac c1d791b3 c22773b6 c08cf745 3fca6460 c097a92e 3e6b17cf 3f000000 -> 3fb2c595 bf287dd8 3ea01096 3e248278 bffb4423 be4af11d bf458e45 3e88ae50", + "c21b6485 4228d344 42120b42 400995a0 bfebd108 be6a24e0 3f0a9adc 3f000000 -> 3f0a5e61 bf117da5 be163445 bf6a971a bf9e5cce 3fa68385 3eabe881 beccf8ee", + "c18fbce6 c22dfc75 c0efbca8 4081c10a 3fa33a00 409759ea 3f67ef0c 3f000000 -> bf3f410e bf22565c 3f2ec5e2 bed5b35d c03d3bcc bf0b39ee c00f3505 be7c1db3", + "41dc9120 41066fb4 41e51bb4 c0af079e be40fae0 3f9102d0 3a428d58 3f000000 -> 40858dd5 3fa1c560 bfc5d334 bf01413a 40289b75 3f7b7b03 c01d7e4a 3f0b485f", + "c204b70a c0e6eab0 405ddf70 3f8cb560 3fe47360 c009a082 3f05139d 3f000000 -> 3e0506c1 3fb50296 3ddaf7a8 3da04aa2 be4289ee 402cda41 c04a45dd befee595", + "41e775b8 41a13c24 3fff4440 c0ab4f3c c0af6a4b 4062f6d0 3ef83151 3f000000 -> c0938b46 c0791d1e 402f4bb1 3ddd00cd bf001f3a bed8524c 3e983873 bf7e814d", + "c1990bdd c22aca80 4143abc0 3f8f0ed4 409ecb36 40bd3d24 3f3f7d18 3f000000 -> 3e7c42ad c02acd31 c02ad591 3f5df0f6 bedb68e4 40948f0c 40949653 3eff2bcd", + "c21697f6 c21a8540 422f2efa c0b2df61 40bc3f6a c09e501f 3cdafb54 3f000000 -> 404b0750 bff7ce6c 3f54574b 3e692377 bf9b078c 3f74d3af 3f4e90a2 3e170af8", + "416a6ce0 c1a40321 c224844e c0875f12 3e02c380 c050400e 3f717c7e 3f000000 -> 3f5bfafd bf578513 3e09b82a bf210791 40546be4 bf3e6ade 3fbb2d42 3ea4603f", + "bf13d980 c187a568 c224fbf8 4017ddcc c08280e5 c0b7b521 3f07efce 3f000000 -> c035c7e9 4046f7b2 408de22d 3eda80e7 3f27ddb6 c0458a5f c0085163 3f5ebdad", + "c15a6a20 42220e4a 41e33738 3f41c650 c09a217d bf71f350 3eef1ccb 3f000000 -> bf9232a6 bfd661c0 bf881c2f 3dd9ae5b bf511ebb bf7d8751 be02f9d2 be208642", + "3f8ccd80 c2065d14 c09c9e60 3f596790 3f9c0e48 c03de55e 3d3713ad 3f000000 -> 3d8701f5 bf856906 3ee69b79 3f589fb3 bd5be9b1 3f9dc717 bed7dece 3ecce28f", + "c194b02e 411abbf0 40b7bf58 3ff375b4 c04d0045 bda99740 3e123c80 3f000000 -> 3fe78ed8 c042110d 3ef8a224 bf318c2d c036b693 4081fc19 3f83136c beb7e53b", + "c1158174 c0dc0c78 42229080 3ec7f980 3f4cdb70 3efea3f0 3f5080f0 3f000000 -> 3e73860e bd68f779 be9c8d3b 3e9f1250 3d9f3286 bc984bc7 bdccaeef bf7354c9", + "41c2106c 405e6e80 421e2858 40429838 40b4f244 c0595821 3f429101 3f000000 -> bf08a4d0 3f0467fe bf3d3d16 3e670e91 3d3e3def 3ed61720 4047141f 3cdd6ce6", + "c1e92711 c20a6ca2 c038e830 409660e8 3fffb930 3f377180 3e0ac49b 3f000000 -> 3f558c3c 3f2b69c1 bf308c3f 3f2c6b1f 4072bb10 3fa110d8 3e8db4f1 bb866fe9", + "c213a47c 415c3df4 40f57130 409d128a 40b6d2a8 409910e6 3e38682c 3f000000 -> c0609695 c0375c02 c08b0570 bf2306eb c0194810 c0870187 c045b923 3f3d16a2", + "41bafc9c 4040c1d0 c2384dcc 40a3ff3e 3eaf13d0 bfabbbf0 3f74f97e 3f000000 -> c09ae81a 3fbb6006 3f9d6de1 be502d30 bf6b220d 3db0f756 bed9d3fa 3f554e4a", + "c0270280 42170b1e c23bc9c1 3ec43160 4091d758 3fea50c4 3f44b72e 3f000000 -> bdf61ce9 406c7377 3fccac48 baeddb4e 3fab5485 3db1b1bb bfd68e22 bf307c0c", + "414ef014 40b21ee0 41fde9c0 3fc84534 c0b2469e c0255f52 3dd83a99 3f000000 -> 3d054e09 bd9dbe7f 3e93b33e beed3ddb 3f6c8450 407824b2 3d04c278 3e29c43d", + "c0b72308 c2257991 41d5836c 3f4c8c90 40a66b74 c0bd330a 3e8d23ff 3f000000 -> be960ca6 c0053936 3e27d95c be06b313 3fb1cec1 bfbd90a3 bf792711 3e1a0b33", + "41eadde8 c1883b50 41459bb8 3f8b2318 3fdb6564 3fce6960 3c10f1a3 3f000000 -> 3e2a07ce 3e976bc2 3e862015 3f7ac176 3f4ec396 3fb8224e 3fa31a12 be4e34e9", + "c2462536 420e7624 42028568 bf2ff7c0 407c85d8 4068c688 3f3c1252 3f000000 -> bf98ace4 bffc1d44 c0491ccb 3e8a3a95 bd352040 3f921df4 3ef19767 3f2e5386", + "c1b2ef80 c0be2610 c16083bc 405c2de8 409c59fe bfcc2428 3f006614 3f000000 -> 4005d507 404199d8 be0bb2fe be922beb c0366336 bf9059ee 3d024f4a bf452778", + "c2273460 41cf728c c1b112be 40a91946 3faf023c c0a363ec 3e94f933 3f000000 -> 4085d5e3 3f12b892 c073a0f3 3f26a5f3 40658a97 3efba42a c050ec85 bf42549f", + "c0b3d290 c1b61f04 c15f370c 3f921720 bfb6efc4 400b367c 3f2e2988 3f000000 -> bfa65b5f 3fa0ff42 bf233ab0 3e6e63eb 3f0c7d89 bf44156f 3fcdcd5c bf00936d", + "40994630 c114c2bc 42308a12 c04a0406 c0b90626 40475a34 3f1fec4e 3f000000 -> bf19ea83 bf56db87 3ef47061 3f7cc248 c06f8376 c0a72c5c 403e3083 be226d82", + "419f9b74 42446f7a c1f9de1a c0611312 be625da0 bfc641f8 3e2a6f08 3f000000 -> 400ee70d be6ba7b2 3f33d83e bf22f77c 3febeadc be42856c 3f1473dc 3f456d95", + "41692cc8 c114756c 41dfea20 c0b5ee8a 3fd75800 405283c0 3f362b17 3f000000 -> c05275e1 3edb82ec bf503b09 bf580669 40930788 bfe983dd c0866d83 be87e41f", + "40e14890 c1783ecc 41705b40 c0b4e735 3f37f220 40275588 3f0f92a2 3f000000 -> c098015d 3f9e4ea3 403885e9 3ed705d2 c00cae84 3f12839b 3faac6ed bf685485", + "41061698 c05acd50 420b0b0c bf200920 c09137fb c0ab22d1 3f3a7a8c 3f000000 -> 3fac4705 405d74ef 3fc6b2e6 3f1823a6 bf7c495e c01de987 c09a3534 3efb88e0", + "c23a9414 c102ac08 409f2568 40956024 3fa5276c 4090b6aa 3ec3d45c 3f000000 -> c03644f7 bfc427a8 c068d345 bf289191 c033cf05 bf5aef0d c070d206 3ef8745d", + "41d6939c c2239a52 41babdd8 c08d2c84 401c5920 c0902ebd 3f4c4e64 3f000000 -> 3f6d1340 bfbaa59f 3ebe7a7e 3d867d94 be1b76eb bf281843 be7ba74c 3df2a956", + "42120dd8 4100f4b8 40dc7408 4038dc1c 409c595e 40b3fdaa 3f7a3d3f 3f000000 -> bfc33673 bffef515 c03c889a 3f270b90 4074c748 408c812d 4083588d 3e5d753d", + "c22f20fc c1a7197a c1e98d2e bf002348 c0affda8 c0a7797e 3decf621 3f000000 -> 3eec79c4 4099377f 406dddce 3f115d84 bea3210e c0536376 c02416ab 3f52b98c", + "4021c4e0 c17fe868 41cf392c bfd76bc8 c00cdb5a bf3e7170 3f1cb7da 3f000000 -> 3f2dcc2a 3f315cd7 3f09d94c bf19b99a bf9c3b88 3f07253b be70219d be6aa357", + "42438da6 c1d7df3c c2111ca0 c0b373da 40988b36 c0033d45 3f4d5bb2 3f000000 -> 4012b7e4 3f5c743d 3c8db636 bd901a7a 3f8ab549 3eb60a09 3fc49512 3dcd570a", + "c1c4eac1 4226b7e4 421e9d8a 4088d1b2 3f8f6600 4049ccb8 3f37fac1 3f000000 -> 3f3d1fc2 3ea8dcef 3f66ca8d 3f7646e5 40269fb6 3f94c5f7 404b5579 be8bc43e", + "421a15fe c1b106e9 41a5c304 c05b22b2 c09f207a 4040b7e4 3f78ac19 3f000000 -> 401a7e7d 406f51b9 bfdd05ac 3e8588b6 bef1ea6b 3e268e1e 3fbae05e 3f581092", + "c2151e44 c17d52f0 c0ddba10 3f4a3c20 40706050 c0331dc2 3e78c661 3f000000 -> bf1b45e1 bf02a724 3e3068a7 3f672b51 40029c9f 4055188c bfdd893a 3e2cd55a", + "41c8bf8c 423dc256 41da160c bfad9708 400f3ee4 c0713c62 3f60520b 3f000000 -> 3ff3a6ef c01c8623 bf00ae11 bf0f27cf 400efeae c01a4744 3ffdc24a bd54a470", + "c16f4cd0 c0daa6f0 41a66bfc c0bc31d8 3fd67130 c0795b57 3f4eee55 3f000000 -> 409b4569 bf558889 4035a6c3 3f3c6aff c0a8cfb3 3f68277a c0457df7 3f2d4e1e", + "c1491284 c196c840 41232e90 bf1eb940 c018bfb3 bf9e27f0 3f23db16 3f000000 -> 3f7f5350 3f838185 3fa294d9 bf1ee30d 3e5c5e79 bfa98a5b 3de4aca0 3d74a95a", + "c22f76a5 c23344eb c20df755 c04e9a64 400fabc0 3fd84688 3f5c96fd 3f000000 -> 40692189 bfd19f2f bf6b430d 3e8f7457 bf7755c8 bfdd4632 3f8d9965 3f6983dc", + "421b651e 41a53544 c05432c0 c09fa4f1 c0a80fc1 3f35f930 3f00bf43 3f000000 -> beea3767 3fefb99c 3f8ccf09 be2a0d41 3e1760b8 3f94851b 3ecd7130 bdd8dab9", + "4230f58c c2166d7f c04463c0 409c3a0e 3f6c2460 40837d10 3f08e72a 3f000000 -> c01c16d9 bf07400b bfedb2cf bf27bdda c07c9495 3f425d8b c0178264 3ee3df2e", + "420ad16a 4247ab84 c1ec31a2 bf25e630 3f684cf0 c081635a 3f40bc64 3f000000 -> bf6bb447 bf53d21f 3e84eba6 3e5d36f7 3f1bfc0a 3fd5cb13 bf978f7d be81d8e3", + "c23bf09c 42037d1a c219000d 3e120000 408dfb1a 3f9e0710 3f30893b 3f000000 -> bfcc7bb5 bec50c07 3eaf8922 be220b89 3e3c8770 bf9a0da0 bfc9e61d bd94d272", + "42290740 414c0974 c2099996 40bfc992 3f0a8170 c0ba676a 3eec84b5 3f000000 -> 40441441 bfd4da9c c018e65b 3f6ae859 408ffe01 3ff9e5cd c08eb6a7 bec5f101", + "41b42100 c1cf0dad 422a4290 3f6d6070 3fb24cb8 c01572c8 3edd262d 3f000000 -> beef1c7a bdcfe77d 3f564c05 bf2dbd7f bedcf473 bdc01e16 3f46065a 3f3c0450", + "c1f9ed42 c212ee20 4084c5e8 402c3734 3f27c7a0 c097921e 3e5b707e 3f000000 -> bf819ee5 bea0058d 3fde8951 3ec594a4 3fd7a293 3e0c6676 c0415a62 3ead3500", + "c232f06f 4230217c 41e3fdc8 c09533bf be88b040 c096381b 3f5bbbfd 3f000000 -> c06f242b bf14e793 bfc4ff22 3ee388d2 c0392aab bf64486a c039cbce bf168559", + "42171d88 c1710c80 40e79c20 c06c15b7 40af3d62 4070a218 3ca26c6a 3f000000 -> be6a59e7 3f6608c5 3ffb9f73 3dc14ee9 bf84c37f 3efa15df 400c80ba bd8df087", + "beb7ed80 c195594f 4222f52c c0b3cba0 407bc8f4 c0a408c9 3df99e44 3f000000 -> c0a288e1 40708608 c09d54d0 3ed96bd0 c01878a2 3fe1a1a0 c013970b bf67c57f", + "41ce64b4 c1b0b6c0 42137d78 40b07670 4089560c c0098416 3f57b1ee 3f000000 -> 409cba32 4044130f bfbef7a6 3efc4b56 40318153 3fde1194 bf5848d9 bf5ec312", + "419cd674 40f339b8 41e61d2c c00dfbb4 bcec1e00 be97c570 3f5eb300 3f000000 -> bfa4ebea 3e859d5c 3e755616 3f1e14e6 bf817970 3e51caf5 3e409af2 bf495c61", + "4195c1c0 c14e61e8 421b328a c0a624ce 409bd0b0 3f9f2634 3f58ed6d 3f000000 -> 3f937937 bf6a804a 3b690f70 3f7a8584 c0af5603 408b6729 bc8a8bf6 3e52b61d", + "421cbc4a c16ac3d4 c13885e0 3ff55734 bdc29c00 bf8701d0 3f30f16d 3f000000 -> bff16ed0 3f48f783 401d00b8 be5a52d8 3fdb6fb6 3b230683 3f603255 bf0297ea", + "41ff7d0c 41568e44 4199f70c 402e28f4 c0b38955 c09c837e 3e96ddb7 3f000000 -> 3ff7467f c08bec22 c06b205c bf1a5df9 bfbae8e8 4053873e 4031ba08 bf4c38f2", + "4180f9b8 4226816c c20b3bf0 3fb87bc0 405d13e0 c0b9f0eb 3e3a1a5e 3f000000 -> 3ee60b4f bf9b697a bf6b936c bda6b11c 3fa4d0d8 c028f33d 3fc6aa15 bda01ac2", + "41daab54 41e3c9dc 4216fd1e befd6810 bff8ca78 c0866f6b 3f4f287e 3f000000 -> bf78e253 bfe0c602 bee3de0b beccb74e 3fb6d047 bf19d2b0 4008c649 be462eb9", + "4230ebd4 c2403d60 4239c78e 40a213ca bebd2560 c02d2cec 3f5dbc34 3f000000 -> c0bf4bfc bf8ed97d 401ee005 3f1971b3 408f3ecd 3f55ef55 bfedef63 3f4ceab3", + "422a5594 bfcc21e0 c1a026ad bfce7e18 409cfe68 c085df3e 3f606e87 3f000000 -> c02d78d1 40a81587 c0586130 3de16393 bfbc01ea 401f46e5 3f9472c3 bf79e8d7", + "4230c3a6 c221ecf1 410d5e50 bed62c80 bfb3e364 3f6731b0 3cd4cd10 3f000000 -> bbdd1df0 3cc38920 bd02a4ba 3f7fa877 3e058efd beec36ce 3f1dd271 3d53a192", + "c090cf30 41bcdcf8 c0a8df38 c092b93f 3f86e9d8 3ffe6900 3df2b147 3f000000 -> c0a8149d bf85af97 4003f5b3 bc90ae16 3f003f8f be7cff91 3f8d1c80 bf64ce2e", + "40db50f0 3f385a80 c1ef3909 c084d7d2 c036a212 4092ad64 3f6086da 3f000000 -> bef5fbc3 bf9d8919 4003dcd1 3f1ce771 c06da7a2 c0146115 40588b76 be543cc8", + "413783c4 41b667f0 41f3c170 3f424800 407425f0 bf5ba028 3f3c421a 3f000000 -> c015292a c0219f94 3f821a9d 3ebf7882 bf47c247 3fbbab23 bf04da17 3e1452c5", + "c0d8ec28 420cd766 c1c45dde 40918b88 408bee54 c015b7ce 3f54d854 3f000000 -> bfb50e58 bedc5db0 bf3c38a8 bef299df bfb7a02f c0241e8f 406e8512 3dbd8bc1", + "4197a3bc c1a8b4e9 42457220 40aec63a 3f6552f0 40598640 3ef9a0ed 3f000000 -> bfaf855b bf010a7a bf633e16 3f765eb0 409b6d80 3fe48991 40493a79 3e8b1c20", + "c1ad57b7 3fdc6ee0 41f355d0 40927334 3fa73d28 403e3220 3eb6eff5 3f000000 -> bf6d0f7f 3e4f7034 c0833b58 be18dcc9 bfb9ada4 3eb4ace0 bf8ea70f 3f198fad", + "423ebd88 c22076d2 c1e6cab8 3fe13dc0 c0311946 40bfdb84 3ea78895 3f000000 -> 3f0821df c0431559 40e07c7b 3e483e55 3dd92881 bf1b9935 3fb30cd9 bf7b0ebe", + "c15483a4 41e2edb8 4220c264 3f47a178 c087a5c5 c020d313 3cb89c14 3f000000 -> c000b46a 3ed9bd91 3f8b13c6 bef25c20 bfa8218e 4034d6d6 40147392 3e9c6f34", + "42199716 c1f5d9f0 c1d0e49e 402b9848 bfd62764 c0238681 3f610546 3f000000 -> c02dcfc8 3fabac9b 3ef7a840 3d98d223 bfa0e9c0 be35a763 bf35cc8c 3d489da4", + "c1e18843 c1ea1d4a c1f0de9a 40100934 c09a15bb bfa9b9b0 3ea9a9fc 3f000000 -> bfedbc48 4041fa37 3fa3c95f bf2ce41f bfd9b49b 4031a25a 3f95fcaf 3f3ccc46", + "c1e75efe c247ca30 41917d6c c05f78a5 400ae5d8 bfbb4348 3ee9250f 3f000000 -> 3fbbc938 bf63c8c9 3f5c342f bf6d0d7f 406647ec c00baa52 40070473 3ec14ee3", + "41ca9c70 c236c993 c1d61825 3f91ebd8 c0156ed7 3d4f0700 3ea50dcd 3f000000 -> be2ded4d 3f293293 be97a457 bedbf082 bda57901 3ea0f91e be104557 3f672d3b", + "3f0bac40 c2235044 c12fbf78 bf5d7ee8 bdb4d580 bed6e9f0 3ecc771d 3f000000 -> bcc0b1ef 3b6388a9 3e1d37ca bf60c54b bd30bcf4 3bd0b11f 3e9032e0 3ef5107f", + "c18c5f22 40d0e9c0 c208d1fb c0414db8 bef23af0 be853f10 3f423e80 3f000000 -> 3f9f5cd2 bf89a54c 3fb99ee5 3de3410e 3e101ef2 bcacae0e bf22ac7d beed1c82", + "421c97d2 c242f60f 4237a34a c07cedd0 3fa927c0 40be66f4 3e202557 3f000000 -> bf7861a7 3e63b5ad 3fc16f81 3f7971d1 c0868b6f 3f76b1b3 40d19003 be663f9c", + "41e28214 c1dff8a2 c16675e8 bed18b00 409e6748 3f4e5c30 3e05d941 3f000000 -> bf52ff06 40809974 3f97be2e bebe104e 3ea8b4bd bfcda5f1 bef2a865 bf6db52c", + "c20c2366 c245663c c214a0c5 c0aad26e 40593d60 3f2dec80 3f366ed6 3f000000 -> c0a9bbed 4081e8c9 3f70011d bd97cbb8 3fa470e3 bf618115 be2e2972 bf7e74d7", + "c219be60 41f70120 c1c0480b 3fa2f66c 40a30034 40a5e626 3f62e153 3f000000 -> bf2663c1 401936d2 402ec5b1 be1913e6 3f3aa917 bfd2c7bf bf59a145 bf07d43a", + "c0cf3b38 40190b00 423849a4 c056d2cc 40998320 4016fc14 3f5c9db1 3f000000 -> 3f8dc83a c00b68e5 bf262904 bc704ba6 be832c7d 3f8554e7 bebbab2c 3ed4df04", + "c23bd384 c1b55ebb c0f22070 4015fd48 3dcdc700 c08043a7 3f38ea04 3f000000 -> c018c7ad bf2c4c08 407497f6 beaa6cba bf57b810 be7346b7 3facad94 3f7166e0", + "4214ac0e c23a5265 4238cd32 3f762b10 4098c5dc c031b044 3e33140b 3f000000 -> 3f186dcc 3fceda1b bf6f0696 bf6efc3a bfc678e3 c086aad3 401b9d09 beb78b1c", + "40bc1ba0 c23c3137 c1f57a92 40087b40 40a1ee80 c0ae4880 3f469d92 3f000000 -> bf044bd6 c00a237b 3fbe7e23 bd559266 3df17c0d 3ebf6267 beab2ba6 3e1930e7", + "c1eced40 419f8ea0 40ce9fc0 400e9378 c0a77f34 c03087fa 3eb21f49 3f000000 -> 3e805e09 c006be5f c018befd bee68d6d bea44c27 3f51fce7 3f0d08c5 beed7183", + "419ce5fc c1279c7c c1cb8284 c0bb1bd8 408e4d7c c0317624 3df42990 3f000000 -> 40d473a6 c081f15d 4030a9a7 be3a28c4 3f9d1c13 bf402ff7 3f02a4b5 3f7bbbed", + "41ba9240 41a34694 c1603c74 c02d30d4 bfa7fb28 40bc473c 3e79d0d3 3f000000 -> bee94a00 be985718 bf196cf0 bf16564e 402c7e7f 4007a505 c03c6075 bdedd750", + "41dba5ec c1a1e26b c23d9d70 c0b5c5a8 3ffaf928 402254f4 3f605f74 3f000000 -> 4084be0b bfd1174d bfcbd2f7 bf1263c7 40390e1e bf91bf04 bf8e1329 3f5203ae", + "bf0f8640 41d60ddc 40883ad0 40b794a0 3fe71a28 c09effd0 3f539b97 3f000000 -> bfaffc52 bf5a47b6 400b5847 bf5a7b6e c09c0249 c006d443 40b5fcb9 3ecc4088", + "40ec4a90 420fe7f8 c244238f bf2a4d88 40980056 bfc0e1c4 3e33c544 3f000000 -> bf78cc22 3fb49484 3ee7cec5 3da1eb09 3fad4658 bfa8db20 bfa7d7cd be97247f", + "415e52ec 41ad1ce4 40d7aa40 c0b5879f 40bfe2f0 c0aaa047 3f535887 3f000000 -> bfee62ad 3ff4ec56 3fa1a4bc bf0ce290 401452d1 c09c6b79 403f20cd be2b6ddc", + "c18ba900 420551d4 c11ad980 3ebed490 c0aa8fba 3ec3e0c0 3edbcac5 3f000000 -> 3f97c9c0 4046a558 3f7d2b66 3d81e967 bd866e58 be7c9574 be25dd5b 3f239634", + "c11d1de8 40771690 417e6ad0 bf98f5f8 3f348c58 beaf7b70 3e4e9226 3f000000 -> bed036bc 3e08ad66 be6dbc71 3dafba24 3d0f7434 bc3c556a 3ca3cb5c 3f7f0e4f", + "414c47cc 41a26ec8 c23a227d c056f220 c0737683 c01f432f 3e2332b7 3f000000 -> bfdc38b8 bfb54418 bf5928c8 bf3104a3 3fe251c0 403e2bdc 40401d65 be090696", + "4209bb50 c16fae3c 4203f8aa bd7f9000 3fb1feac c0a5bbaa 3e0adcc1 3f000000 -> 3eb143f3 3ffac051 c014a408 bdd44645 bf05c2ca bf2d7f49 3f86124f bedb4630", + "41020160 c08495c0 4247bf62 3ffb6d68 3fef2b00 c0ac759c 3e2d0629 3f000000 -> 3f9dc932 3fbc95ef c0a53cd9 bf137fd0 bf5e758f bf84f10b 4068f71e bf513c94", + "422db51a c2104247 c0a98d80 3f915910 3f261120 bf9dbac4 3e302b00 3f000000 -> bf0924bb bd9c4a69 3f16e273 3d8961a2 3d1386ed 3ba81f49 bd224eee 3f7f6c61", + "c18f12e0 c16ef90c c2365760 bffa44d0 409abf46 40b5f32c 3c38c3ab 3f000000 -> be853e27 3f811c8a 3ee21cfd bece44f5 3f41eef9 bfafe117 c0893e6d 3c98ccc6", + "c242a8f3 40517c50 41f5b700 40733c64 404a02a0 3fff4718 3ef65227 3f000000 -> c02dda72 bfd30ff8 bf89d51b bf0a1a18 c03d3488 bfd45a81 c02d2396 3f448659", + "bfd853a0 40ea87b0 c2397f13 bf387b28 bee064a0 c01e7568 3f520f7a 3f000000 -> bc240b38 be52e55c bf0fd68e 3f725341 bcf0c64e bf1ac56a bfd31e3a bea51997", + "c227fbe0 417f6d50 41bd6194 409ac6cc bf7410e0 c0b36b81 3f31831b 3f000000 -> 40a2c131 bfc09ff1 c0babbbf 3e2e85ed 3f613468 be8544a2 bf81312d bf7c412a", + "40cbcd60 410c3cd0 4148cac8 3fc60a68 4097cd18 40bb22e4 3f05ee90 3f000000 -> 40085878 40936972 40bb20cd 3e32fc7e 3ec1a31c 3f515a7c 3f84e10d bf7c0f1b", + "4247d2b4 41e4a010 c208e7d5 402380c8 c09baed6 c09041ce 3f11621b 3f000000 -> 3f8e75e3 bfa2086a bfa3c375 3f1f1939 3fae7dd8 c03ec76d bfc1c893 bd28b1a1", + "422a5582 c1f6383c 420aca60 4096c970 bfb11d80 40104964 3ee6ffa1 3f000000 -> 4067264f 3c19936e 3fa74666 bf0672a5 c045dd09 3f849cef bf094798 bec147d2", + "40d36610 c10eca74 c20a20c4 c09d3791 c09833fd bfe41c58 3e76e785 3f000000 -> bf353260 bf08f646 be182f0f 3f7e9763 c0d7036f c0a285ef bfb495f7 bdd68ccf", + "4198ccd4 c19a1053 c0d332a8 be57d3a0 40a95eac c00be024 3ee63a16 3f000000 -> 3f2205eb 403ebadc bf487752 bf4465e8 bf41c95b c0641f00 3f6fc41a bf2434e3", + "42320892 c1feae66 c1f9c684 408d3438 40095dc0 40afd7c6 3ef792cb 3f000000 -> bfe8ace2 bf5b35a5 c0044a07 bef8ad56 c0153a3e c010d751 c016a53b 3e35bfd1", + "41e601dc 421768c2 41b5a474 bfc95dd0 c07df1ce c03df7e4 3e1de7f8 3f000000 -> bfd25bca 3ca5561d 3f9306d7 3eb216af bef1b3a8 bfc39485 be42ec99 3c62a2db", + "c05088f0 421be66c c243d816 c0b23abb bfee40cc c045f621 3f7f646d 3f000000 -> bf705371 bec54772 bf292b6f 3f7af7f9 c0954746 bff5146a c05228ce be4a04f7", + "c2013e30 c03ac890 40757420 4060022c 3fd0a7e8 c02761f4 3e9dfb41 3f000000 -> 3f229860 3fbbb9cd be2e986f be09eb42 3f0cab3b 3f16b897 3f5d86d8 bd017017", + "c00a7cd0 41b2fd00 c1d7a213 c0850d82 406b5c88 c0929868 3f7b1287 3f000000 -> 3fbebf76 c057717e 4013c62d 3f2454b6 c036cf71 3fea6b3e c068b1c1 3f2ba4d3", + "c243c4eb 417eb688 c23e0491 401e1380 403099d8 40b391a0 3f474f40 3f000000 -> 400bfacf 4083cbf9 40a2e376 bf0e5734 bfbb47fb c0305543 c059ee64 bf54c792", + "404e4a10 c0e797e8 41b157c4 40a6c4ea c09a0b24 c09ea02b 3e64f321 3f000000 -> 4093444d c09ab7f9 c0659141 be4d1fc6 bfbabc58 bed4cacb 3fb73ce6 bf4a6663", + "c103ba54 c0f471f8 c0aaf5b0 3f93bb80 c0a2f502 bf135898 3f44a829 3f000000 -> be060f36 bfb4cb50 be42d2df bc376352 bb8d8407 3cdebcc3 3f15e1a3 bec043f4", + "41a8aaac 416f15f0 c2299568 c0af7b1a 40071180 c0799cb0 3e9e489d 3f000000 -> 3fb918ac bfc7c10e 401fcde3 3e2906a8 bfdf07fa 40083c98 bf5fde91 3e25d9fc", + "c20a15bd beae5e80 c1e3af64 bfd29cb0 c08c638b c07ac99a 3ee9e6dd 3f000000 -> 3f4391ef 3fb0e78f 3fec0d2d bf4b4b1f 3f5775ae 40749efa 4042f9ef 3e8dabfc", + "c1d78e6e 42422c7c c187f954 3fb08b84 c02d1963 c057c07a 3f250871 3f000000 -> 3f6c5286 bfd5ad0c bff00194 3f5cc47a 3fc945d4 c035fc30 c04c6901 bf019b21", + "c236b98b 41fd56c0 420ef404 3ee35200 c06a219e c09f5ebc 3d789758 3f000000 -> be13c42d c0408230 c03d0f4a be571e81 3ec66089 bf45a439 3efd7cbb bf3b845d", + "c19fe682 41e31b58 40b77378 4031468c 3fff4aac c05cc0e8 3e9977ff 3f000000 -> 3f9c3314 4011b56f c01e2cc7 3f19ad40 40204e76 40868514 c018c422 bed35d1c", + "c24417da 423390d8 41823f70 c0ab3bd4 4060bff0 bebbf960 3ec14078 3f000000 -> 409a37d3 c042455e 3f2cd0ce 3ed1ab70 c05074fc 3fa60dd1 bea3210b 3f2dd460", + "422c69c0 3f20e500 40e484b8 40b25868 409ec4a2 404cdc10 3e3f9b39 3f000000 -> 40a1be65 40973bd8 4064ae91 bcf040e4 be17dc3a be0dfe13 bdd6b547 bf7fe3cf", + "c0c5d5d0 c219620c 42407f2a 40672f60 c04d15ab c090906b 3f2aeacd 3f000000 -> 3ee65e0c 404a626b be98913b 3ebc7b04 3fbd4895 bf49ff12 bf401597 3eb5dc34", + "42051a1c c1e112d7 3f1a1b80 be6cce20 c09d6f9c c0412f74 3f5acb36 3f000000 -> bf8205c5 bfdb21ff bfd37e40 3ed876b8 bf58e3a4 c01c8d91 bff37350 becc745c", + "41aa2b2c 417ce778 415349cc bec36360 40b0fba8 c083acda 3e62161c 3f000000 -> 3f360908 c0a390e1 40295271 3edb639f beaca7e2 401b235b bfa098fb 3f674eb1", + "c239645c 4185c73c 40c2bfe0 be5d9540 403fbeb0 c032c761 3de5b1b4 3f000000 -> bc78e501 c0333266 3f388fc4 3dc4e1d2 3fcc0c35 bf8872bc 3e297f0a 3f3ccabe", + "c197b069 c1ab3928 40e82f58 c027aae2 c00b9984 408f73fa 3f5ca89f 3f000000 -> bf12a568 c0016e70 40308da9 bf1e4ef9 3fe10fff 3fe796db c043ee39 bf080e8f", + "4185df70 40f37a38 422bec12 bf4d13f8 c09dd009 3fcae72c 3e3542a9 3f000000 -> 3fd461d9 3ed7c63c 3f59fdc4 bd28239d 3f63ee2f 3f59ad7c 3e9780e8 3e804315", + "41b83484 c20948b7 40eab878 401b9f2c c0564fb7 3e8bf890 3e5f8fc5 3f000000 -> 3dff97ed bfeb584a be2988c0 3ee1ef26 4009072c bfc1d168 bfd795dc 3dc08d3a", + "420b49b6 422fbe24 bec06380 40adc8fc 3fa86b80 40b311ea 3ecda5ee 3f000000 -> c07e66b9 c0059c3f bfd74385 3f16a1f1 402bfc8a 3daf08b7 40a89a12 3f104404", + "c0a22d58 c0fec698 c190c199 be4d45c0 4088d346 3f2a7710 3f05b9cd 3f000000 -> bfa7a613 408ae9e2 3e373e20 be1b2bac 3e4d9c2b bf2a5e44 bce0bc21 bf7d0b32", + "422d1328 422d6282 c1f0c36c 4050ba4c bfc02ed4 40bd33e2 3d39d5b1 3f000000 -> 409edc90 bed8a956 40a231dc 3e2c166a bf68567d bfc54d4c 4007a02f bf76f711", + "c2273568 41a1ccc4 c23a0489 408ecbb0 3e9995c0 c0af30b5 3e9cce91 3f000000 -> 3e873f98 bd71677a 3de51ebb be84e2bd bfffcb88 3f9cbd06 3f4ca756 be08b640", + "3f858ac0 424300ee 41df77d0 3eb07340 403bb98c 40973b68 3eeca164 3f000000 -> 3dfaa501 be582042 3f13be1b bf6061ff bf1cffc1 bff35d69 c0750801 be4dc4d3", + "c1756ae0 c229794e c188b4b4 402030bc 409c6210 bef3f840 3e5f40ff 3f000000 -> c040e02e c07f14e7 3f1d72ed bf111cf4 c004b64c c02f83a2 3ed8ac06 3f52e607", + "c209b7e6 41313378 4233faaa c04d469d c0a29518 3fed8930 3f4c2d81 3f000000 -> beaab748 bed3efd7 bf545af8 bf04ebdb 3f9c37e7 401c85c7 3fb13d8d bcbd0dfc", + "c1dd5675 c1491cec 422c5734 4084e3d8 3eb8ba60 c07b2c3d 3f442865 3f000000 -> c04595bb 3ee6196a 40292293 bf381f14 bfc6c159 bfc82800 4019a52f 3f20c6a6", + "c1d2507c c077c3e0 c227b828 c09f7e7c 40a242a0 c09b5e7a 3f705ae0 3f000000 -> c090b276 40a29943 c06f2e4e bf0625d5 40320ccf c04813f3 401327fe bf5a099d", + "c0d6ce00 407e34b0 4235d490 c0950981 3ff84dec c0a8e257 3f1608e1 3f000000 -> c03c00ac 3ea1ef7f c041bc69 beead960 40181511 c00c665c 40940081 bec47b0e", + "420edbd2 4213f8a4 c22eb859 bec6dc50 3ec73660 407b6750 3f6d2051 3f000000 -> 3e9509a0 3f0e98a2 c0241151 3f36d780 be9815b3 bf1182fe 40276c11 3f332da9", + "c223667d c225ff34 415ea3d4 bf1e8c60 bfaa4c04 3dd5aa80 3e92ff72 3f000000 -> 3f1d6979 bee9bdd3 beff057f be95961a 3e4059d5 be0ecfab be1bd013 3f74d49c", + "413520a0 420b64b4 41921efc c05b5dc1 4029a30c 401678e8 3de04541 3f000000 -> 3e519ec4 bee0a927 be91cfb8 3f7e59b3 bfe5b178 40762c98 401fc637 3de81f56", + "41380bc4 c1c94463 414649dc 40ba1f70 bfcf8424 c0299fe2 3f390b6d 3f000000 -> 3fb61a66 c027a579 c02e92f1 3d09ecb9 40109a20 3f875e20 bc81bf2b be8cb958", + "c22b966d 4246261a c217aae1 bf82a248 3f91128c c05d921e 3ebb7c1a 3f000000 -> bffbe4d3 403cca92 c0712475 3ef2cfa3 bf87afe1 3fcb6439 c001e544 bf616197", + "3ee01000 42130f8e c1428140 40bf1842 bfed2720 40828c1e 3e151a3c 3f000000 -> c000583a 3f59d55a bfed76d7 bf6cca17 c09c2c92 40048896 c0907a2e 3ec2983d", + "c145f42c c0bb08e8 415a04c4 3ecd5a00 3f852b68 3fe922e8 3f51d5d1 3f000000 -> bed83b5f bd89baca 3f6bba4c 3e9cbc6e be0b107a bcb127b4 3e979a44 bf73b5b3", + "4198fd2c c1b675db 421f0198 40a941f4 bfd07b28 be8ffaa0 3e77edc4 3f000000 -> c0828a2f 3f794475 3f83f80e 3ef09e78 400b00df bf04b6e7 bf0c8677 3f61f7dc", + "41426b58 c0c25688 bfda62e0 c07f5722 3f141cd0 c063c153 3ca7acc0 3f000000 -> 404111db 3f26356e 40827751 3e7d6520 bf453d4a be29cc5e bf8548a2 3f7809c6", + "c224254f 3fea7a80 c23aa004 406250b8 c01bc08c 40a1a282 3ddee173 3f000000 -> 3ea5b584 bff2a66e 405fb6c2 bf4065cc c038a012 40003379 bfd5b921 beb0bfe7", + "42405528 c19ca065 c1e29eda bfbf92c8 4088b056 40b22326 3e747ad6 3f000000 -> bf3d1192 bebb7f44 3f3f7d5d bf02f6bb 3fc3405a c05302c0 c0862d00 becac4b3", + "41f57dd8 42431146 c09bee40 4055a838 3fc39d50 409ad06a 3ec27477 3f000000 -> 4079617d 3fabe365 40a8fdd2 3ea3ab10 3fa843df 3ee7f4f5 3fe40c3c bf729161", + "41b2c214 c1dd58f3 c02544c0 c04f3926 40346d38 c0905c16 3f620363 3f000000 -> bfb7152d be4a31d4 c013843e bf4f2173 40582ab5 c02ff1ec 408cf24e bdfe21e6", + "c0e52d10 421e32c8 42040bfa 4064653c 3fd1b318 c08ff242 3e92c2e6 3f000000 -> 3fd3177a 3f94dcc5 c00c76c3 bed9a5fd bf6d6b6c 3fc3313d 3fdd4b2e befb2843", + "42294b0e 412484d4 41befe50 c021a9be 40314c70 4021ece8 3f35dd14 3f000000 -> c00d6ea3 4004b53a 400ba01d bd23a6f2 bf9460ec 3ed131ba 3d70ceb0 bf4c2887", + "423b1544 4190a20c 40d19768 3dcc3800 3e1ba600 c0beb4e7 3f508cbf 3f000000 -> bfc9acf4 3fdd15a5 be9e6d06 3f11bc01 3fb9246c 3f8f3841 c06379c9 3d2e42ec", + "c09ae0b8 c23b5550 c13113fc 40a19c44 c0196226 3fd81300 3ebb7d00 3f000000 -> 3f49278a bada5100 bfca8df6 be8e0490 c00bdedd bfb048b4 be6778bd 3e8e0a9c", + "c1a3ff64 40bda240 40ce6920 3f3f48f0 4063fd30 c052759e 3f0d6d4e 3f000000 -> 3fae6fa2 403c9b58 3dc42885 3f31d2b1 3c8aeb7f 3f7dcaa7 bfe535aa be1c1843", + "c1120be8 c1356da0 40f93db8 c05778e2 40821568 40ad9be4 3f6235ac 3f000000 -> 4048150c c001d8cb c0a22786 3ee7fc7e bfcaf663 3e8548d7 4031cd73 3f259945", + "c1383fb8 41aa0624 bf90aa00 4098411c c06c4c15 40021778 3f41782c 3f000000 -> c0acf6e7 406374a9 bfdcf47c bd15df43 bea0354c bbffb3e8 bea19208 3f58dcb2", + "40881408 422378c8 41b17ea8 c0554d28 c091a72f c0a5ce0a 3f7a0e60 3f000000 -> c0101919 bf9ae321 c03ce2bd 3e380a5c bf844d98 bf53e851 bf477512 bf1b3db8", + "42118818 c0bd7838 42169c9e bffb8898 be3ee040 40a1746c 3f20d3ae 3f000000 -> 3f2bc9d9 bf70eead c034deee 3c6efce6 3efc10da 3f136b94 3f1ef384 3e963716", + "c2369313 c2024dfc 41b5c988 40a6a7a0 be39d7a0 c0835858 3f0f19c1 3f000000 -> 40b6284d bf17c534 c0863005 be5ff5ca bfa35031 3e0811d7 3f709c9c bf79cd59", + "c1a4a724 42430b36 c1a8e6ee 40058f8c c0ac50ca 40a5829c 3d88b77f 3f000000 -> bed25962 bff6fcd2 3ff7c99a 3e0ff477 bf297e8c bea6924a 3f10e1d0 becfae02", + "c190b0c1 42204050 c23e410a c0968b08 40b4f904 3fa9a5f8 3f40a26f 3f000000 -> 40857c43 c0aa193a bf4d8505 bf02d7d7 401ec093 c04a4bb6 bef46bea 3f5c0959", + "4170ee00 42090dd0 c17ffe98 40074b8c c0836cc5 3f687328 3f0b7e09 3f000000 -> c0046046 402f536a bfc50270 3e9bd151 3fc00ae8 c000ac49 3f9ca688 3f04ec25", + "4232539e 41a11634 42194746 bfdfce54 c0b3d889 c03bda06 3eaebc57 3f000000 -> bef834a3 3d55f4e9 bf4a62e4 3f4ef17c bfb30196 c081e6eb bf9c933c be837555", + "407510d0 41d12bd8 4238ffde 401f5168 3e0c8260 c068e4c0 3e7e4cff 3f000000 -> 3fd784a2 bfd9df18 bfe8fe65 3ece32b4 3f159759 bfe183d1 bfbcece7 bf435b24", + "42286d90 c0d669b0 409abdb8 c0a55665 c08b50a6 409d7328 3f0b70f0 3f000000 -> 409f4eb2 3fd59c64 c0a1cfd2 3ebdbccc bf6a8504 c0345791 3fb43350 3f67637d", + "40808538 420cdda6 c1d96028 3e21ff00 c011ea23 409049de 3ec93506 3f000000 -> bea31741 bf95c98c 3fb2f070 3f5fbbe7 3f7413b0 bf87054b 408474c4 bda142aa", + "c186b798 c1346e60 c1c1bc24 c004c3f0 3f7cca10 c0ba966c 3eb25d32 3f000000 -> bf5ea3d1 bf17a595 bf07cc86 bf175dba 3f97106c bce874fc 40284694 be111a86", + "c1aaffc6 c116eaf8 c1904f01 c0b87841 4006df40 402d2a4c 3f47e57d 3f000000 -> 3fe2a698 bf7fd8cc bf80fca3 bf1c08c1 4085b579 c004ce71 c032ce1f 3f213d89", + "c210559c c22f40e9 c11f2ce0 bef6b0e0 bf849088 3d4b6300 3f3ac13d 3f000000 -> beaf70e5 bf105e10 be064829 bda9fd9a 3ce9cd31 3d40642e 3c32f36a bf7f1ddb", + "c11093ec 41e95144 412ac560 c0b81c1f 3ffe6cf8 c0bfec5a 3ecfb1e0 3f000000 -> 3fd42658 bf560945 40677723 be22be66 3f1f2328 3f0f1db6 401a756e 3ee47007", + "420bad72 4177dd68 420871a2 402a3910 bfb8db88 40ac257e 3e53a602 3f000000 -> 3da61c89 3f646b2a 403a8407 bd32a950 3e4a2167 bec97eba bf606b13 bf3749a3", + "c14939ec 41a3bbe0 c13f7e3c 40a4cad0 c073b7e8 409996fa 3f22837d 3f000000 -> 406fb95c c04ba0bd 40908492 bf0ed481 c0212a5a 4008e5eb c0425142 bf54738a", + "c23d1277 c1d90192 c2341210 beec0460 c07243fe 404aa258 3ecd4fb2 3f000000 -> 3ee93428 407a3e36 c04b7377 3e609676 bdd1b1b5 bf61040b 3f36f0e4 3f79c456", + "41e83d20 42031b24 c232aa82 40982f10 bfc5339c 3ffb17a4 3f6c05e1 3f000000 -> 40812bdf bfe484b2 3fac3cf5 bd1971e8 bf9264b0 beba5e27 bffaa777 bf3604c8", + "4118ef14 4171c258 c19abc2f 409ffe06 c0baaa12 40aa007e 3edfc5fa 3f000000 -> 3fa27adf bfc62049 3f5ad200 bf31592f c0664301 4085500c c05eefc1 be76e087", + "41c89bcc c0099220 c1a1a0a1 c01cb2fe 4054df54 3f63cfd0 3f43d27a 3f000000 -> bfbfd9c0 c00802d4 c00278c7 3e7948b7 bf86d4f0 bd7c57da 3f28b741 bd40d775", + "c1647b68 c23feba9 40447e20 c04e905c 3f9fff30 c09ba360 3ec3bf57 3f000000 -> be753bd3 3d9e4c0a bef57eb2 bf7eb18d 40172199 bf431be4 40974ace bdcea3c6", + "40c94b68 40b61b48 40bcad48 be685880 c04a7b0f c0be365d 3d713c40 3f000000 -> bf180eb6 3fef3945 4050470c bf5059aa bf156518 4077e618 40ad4a5a 3eefc5c3", + "4202dc38 41e63848 42022206 c0bce9fa c02540d7 c0255520 3f47559a 3f000000 -> c084d4fc bfadaba0 bf72e71b bddc8f95 3dda9c31 3fbc9547 3f9a20cf bf31ddcc", + "c23292a4 c22a8178 c2430002 c07e63c5 40af967c c0681e7e 3e8d9922 3f000000 -> c075f932 4021c599 bff901fa bf2674b0 40528333 c00a732d 3fd51bfd bf427ed1" + ] + }, + { + "glsl": "float cultmath_snoise(vec3)", + "tolerance": "ulp-bounded, on the simplex tie set", + "cases": [ + "42101793 c21be86d c0ff4367 -> 3f0b6571", + "c16005b2 420bfe93 c00016ca -> bf1b7d58", + "4186163c 414c2c79 c250f4e1 -> bf293e3d", + "c1ae4edc 41b1b124 422cd892 -> bf166489", + "41d3f056 c0207d52 c1cc0faa -> 3d672c77", + "423e12a4 c221ed5c 422a12a4 -> be138760", + "416b0c20 416b0c20 416b0c20 -> bf264714", + "c25d17e3 420ee81d 420ae81d -> 3e556a08", + "c2355597 c2355597 c2355597 -> be2d7849", + "41e69d22 c244b16f c18962de -> 3f0ba67b", + "415a0446 418d0224 418d0224 -> 3ec0e014", + "41ae8e8a c00b8bae c248b8bb -> 3d493310", + "c2485705 c1a8ae09 425fa8fb -> 3e9a4c72", + "41800913 c24bfb76 4230048a -> 3bbee378", + "c22b1eb5 41e1c296 c031eb51 -> be9071e1", + "c18a1c64 c1821c64 41fde39c -> 3e240f96", + "4244307a c14f3e18 c1d79f0c -> 3e306bb5", + "4169ecf1 c1cb0988 c136130f -> 3ea5029c", + "41ccb06d 419cb06d c24da7ca -> 3f257dfa", + "411a57b1 410a57b1 c2156a14 -> bf3db042", + "4150e9b2 c1f78b27 c18f8b27 -> 3f0241fb", + "c2365216 c2365216 c2365216 -> 3e35ef14", + "c131e43e 40fc3783 423b86f1 -> bf1e07b3", + "40c44913 c22f76de 40a44913 -> bf4c78fc", + "423cf8a3 c22b075d c16c1d72 -> 3ea06505", + "c1d80ea9 c2480755 4277f8ab -> bc97fd7b", + "417015b4 c13fea4c 41d00adb -> bf1a70d1", + "40f2862d 422650c5 c209af3b -> bf1e6f15", + "41591060 420e4419 41291060 -> beb85e22", + "41258130 40eb0261 418ac098 -> bdce06a0", + "c21e6e11 bfcdc22c c1ccdc23 -> bf031bce", + "c253d27d 42382d83 c17f49f5 -> 3effb419", + "c21588dc 418cee47 418cee47 -> be0736c5", + "c2414913 4272b6ed c2194913 -> 3daafcdf", + "411e7ebc 411e7ebc 411e7ebc -> bf1a70e3", + "41eb3975 bf18d15c c2066345 -> bf39607e", + "c2104c35 4217b3cb c2144c35 -> bf2ba806", + "423e2ce8 c1f3a632 4091673b -> bf2bbf73", + "c18450a5 c1bc50a5 c19c50a5 -> bcba69ae", + "c13de9ce 41c10b19 4228858c -> bf2dc157", + "c1e087a7 414ef0b3 419f7859 -> bebaad19", + "4148840b 42222103 c0aef7ea -> 3ef9cd78", + "415c7b06 c1c9c27d 41f63d83 -> 3f1ba7b7", + "41706f52 41506f52 c1b7c857 -> 3eaa73d8", + "c1ae4ede 4244d891 c1ee4ede -> beb1d769", + "4245906d 41eb20da c2226f93 -> 3e516a38", + "4246696e 3fcd2dca c2519692 -> bf21ac15", + "3ffc0680 3ffc0680 3ffc0680 -> 3da12b7b", + "c17970b8 c17970b8 c17970b8 -> bdc659ec", + "41448f7c 41448f7c 41448f7c -> beec41ef", + "41b19451 c1b66baf 41e19451 -> 3ec02c55", + "c0d7aa13 419a157b c216f543 -> 3e7bc777", + "412fcde2 c2200c88 3ffe6f0e -> bdaeb7c8", + "c1776ed9 4272244a c251dbb6 -> be07428f", + "40f1dd80 c1171140 422e3bb0 -> bf10a782", + "c18ed0b8 c1e6d0b8 41325e90 -> 3f538113", + "c161daab c171daab c188ed55 -> 3f13ab84", + "41158c14 41158c14 c24a9cfb -> 3e663427", + "c122dc27 c1b96e13 c1d96e13 -> be88a4e2", + "c1865805 4189a7fb 41434ff7 -> 3e910bed", + "c21b0cd0 c16c333f 4191e660 -> 3e16f485", + "c19cf121 41361dbf c2227890 -> beaeb612", + "c209415c c241415c 42875f53 -> be680992", + "c21b0567 4224fa99 41a1f532 -> becad777", + "42170a3e 42330a3e c238f5c2 -> 3ee36a71", + "3eb417aa c15a5f43 4165a0bd -> be63e4b0", + "40c4a547 bf5ad5cb 41d92952 -> 3da73820", + "423ade7f 414b79fd c1648603 -> 3ea2aeb1", + "c240f7da 40308262 410c2098 -> bed4246e", + "c2022372 c2062372 4231dc8e -> bf172d7e", + "40248770 40248770 40248770 -> be2ec0a5", + "c204003d 421fffc3 c1a80078 -> bf15791a", + "4137bc74 4137bc74 4137bc74 -> 3d36d618", + "42068770 42068770 42068770 -> 3f513c53", + "41d7cdea 410f9bd5 41a7cdea -> 3e689353", + "c21e7b0c 424984f4 420984f4 -> 3e061bff", + "3e79bd34 c0b83216 c2230642 -> 3e51e14d", + "c15b8000 42492000 c0f70000 -> 3eac7579", + "4103a583 425ce961 c227169f -> be8bcee8", + "c103030e c254c0c3 42073f3d -> beaf9b54", + "c2292eeb c052eeb4 4185a22a -> 3e8933d8", + "41cfa5a5 4197a5a5 c1f85a5b -> be637b3a", + "c250604b 42279fb5 422f9fb5 -> bdabc3f3", + "4152e045 c23b47ef 4230b811 -> 3e55b150", + "c213eecf c213eecf 420c1131 -> be0970da", + "421a9019 c145bf9b 3f240650 -> be2c524c", + "c19ef057 c17de0ae 41810fa9 -> bdac05ca", + "42383bea 41a077d3 c15f1059 -> be58075b", + "41bde07d 410bc0f9 415bc0f9 -> bed6b808", + "41e491cf c25db718 41b491cf -> 3e886641", + "c1eb0107 c1eb0107 c1eb0107 -> be6cca06", + "41de9035 bf96fca9 41c69035 -> 3dd23862", + "c22c4e3d c08271e5 c0a271e5 -> 3d1f3e05", + "423e028a 423e028a 423e028a -> bc1c0cdd", + "40b928db 4223251c c1d9b5ca -> 3f1e16ca", + "c2014e41 c2014e41 c2014e41 -> bec05c66", + "41ff41e6 c2045f0d c20c5f0d -> 3f0e016f", + "bf2a562a c216a959 bfd52b15 -> bc384e7c", + "421a3eae bfb82a34 c201c152 -> bed37477", + "c1b197e7 421b340d 422f340d -> 3e601579", + "421089b4 c213764c c10dd930 -> be60fb64", + "41923de8 c23ae10c 42551ef4 -> bf3050af", + "42197d8a c15a09d6 42017d8a -> becb6e4d", + "c2711f54 41edc158 41ddc158 -> be5b0f68", + "408b5ae3 40eb5ae3 41ead6b8 -> bd731314", + "4104b872 41b25c39 c12b478e -> bdce4bd7", + "c0d7cfdb c21ef9fc 41da0c0a -> 3e3f15df", + "c08d3c18 c08d3c18 c08d3c18 -> bf2d81e5", + "41917cab c21b41ab 41d97cab -> 3c4bbbcd", + "c221f754 c221f754 c221f754 -> bd050888", + "42283674 c20bc98c 4100d9d1 -> 3ebbe2a1", + "c22597a8 422a6858 c1bb2f51 -> 3e9afa10", + "41d0607c c22bcfc2 c0fe7e11 -> 3f4e3ac0", + "c2259259 c2259259 c2259259 -> bf247382", + "418e86fb c132f209 421b437e -> 3d37ca3f", + "421fc48b 424bc48b c2703b75 -> bf2562e8", + "c2490014 4097ff65 41ddffda -> 3dbd20e9", + "bf51393e 41817636 4142ec6c -> bf204705", + "41823060 41823060 41823060 -> 3ecb15f4", + "c11f8655 41c03cd5 c217e195 -> 3e8c4780", + "bfbdad7e c21ded6c c1dbdad8 -> 3f424213", + "c22d901e 420e6fe2 c01901e2 -> 3f43c67b", + "c1c44b71 c21625b8 408ed23d -> beb7f85c", + "c1b1e64d 42070cda 418e19b3 -> bca9f381", + "40200b98 c221ff47 415802e6 -> bf14b271", + "4245c3a5 c23e3c5b c18478b6 -> 3eaaaae8", + "c1d07d24 423bc16d c1d07d24 -> 3f45bba3", + "c1f1ed69 c228f6b4 414c252e -> 3ef59315", + "41dc4067 42022033 41c44067 -> 3f189496", + "41062f23 42098bc9 c1ace86f -> bea03aa6", + "c044da87 423bb257 c1b09b51 -> be53cb4b", + "c1fc4795 40cee1ad 3eee1ace -> 3eb6234f", + "c246e1ee c02e1ed8 41f23c25 -> be0c5173", + "c1a5ade4 421d290d c1cdade4 -> 3d5e4963", + "c0bdc0a4 c07b8148 c18f7029 -> bf10fe60", + "c0031290 c0031290 c0031290 -> 3ee05a50", + "c1efc584 c20fe2c2 41d83a7c -> 3d9c3f64", + "416b5282 c2152b60 419da941 -> beb7ed0c", + "416f7238 41cfb91c c1208dc8 -> 3f171acd", + "420962bf 41358afd c1e53a81 -> 3e00e9ab", + "401593f2 401593f2 c1c54d82 -> 3f4a8d0a", + "c12b2c0e 424534fd c21acb03 -> be6822e6", + "4229e0a7 c1087d64 41dbc14e -> bdab02fb", + "c17fe3a0 c253f8e8 42300718 -> 3f23b7af", + "c112b183 4207539f bf958c1a -> beaf3a80", + "3ded3800 3ded3800 3ded3800 -> bee5cda7", + "c21c0e8f 420ff171 411fc5c5 -> be6168a5", + "bd4ce000 bd4ce000 bd4ce000 -> 3e82b9c1", + "41838569 41170ad2 41fb8569 -> 3f240593", + "c215fba5 419408b7 4256045b -> 3c3dad93", + "3c9f8540 c247ec0f 425413f1 -> be3eb00b", + "c210c7d9 41e6704e 42173827 -> bd9bee88", + "41b346dd 3ed1b733 420da36e -> 3f04704b", + "c27c598e 425ba672 419f4ce4 -> bf1402b0", + "4254b1db 4220b1db c27b4e25 -> be8332e5", + "418b924a c091b6d6 c1dc6db6 -> 3ee60369", + "c2249c82 c2249c82 c2249c82 -> bebd6e1f", + "c1b437e1 4221e40f c19c37e1 -> 3e6fbebe", + "42233417 41fe682e c18197d2 -> 3f168a66", + "c23035f3 422bca0d c150d7cb -> bf38341c", + "41056ce9 c246a4c6 40cad9d1 -> bf215446", + "41081618 41081618 41081618 -> bc709d14", + "420f9d92 418f3b23 c268626e -> bdbaca65", + "41889cd8 42044e6c c0fd8ca0 -> beeaa472", + "419a514a c17b5d6c c17b5d6c -> 3f4f7c0d", + "41e0f7c8 41e0f7c8 41e0f7c8 -> 3f165bc4", + "c2872ab7 4209aa93 4241aa93 -> be5d983d", + "42110b49 c1c5e970 c1a5e970 -> 3f3b2457", + "423f83db c2347c25 41ff07b5 -> be7a25e0", + "421cc314 421cc314 421cc314 -> bf0a9dc8", + "c280f5e8 41bc2861 42561431 -> be640c2b", + "c20dc9e2 41e46c3c c1a393c4 -> bf0f9ed7", + "c1e7f348 c247f9a4 423c065c -> bf4592c1", + "c15eb9a2 c22fae68 bf6b9a20 -> bcf2caab", + "c2225674 4106a630 4231a98c -> 3e276dff", + "c2421a2f 422de5d1 4225e5d1 -> be90cad4", + "c1f95e3c 417d438b 3f5438a5 -> bd0369e9", + "c14fec50 c14fec50 c14fec50 -> bc567060", + "c22cf9eb c113e7ab 41de0c2b -> 3edd24bf", + "4265d5e1 40aeaf05 c2562a1f -> be025648", + "c24b6498 4084db43 42709b68 -> bf0a43ed", + "423b1dc4 c1e9c478 c218e23c -> 3e46ca3c", + "c1ef8dc0 3f872410 3d6481f4 -> bebaea2f", + "421fc6b1 c1b8729f 422fc6b1 -> beb0c33a", + "4218ecf2 4153b3c9 c26b130e -> bf0d26cb", + "424c354a 404354aa c19f956b -> bf0c9e1e", + "c1cf8846 419077ba 418077bb -> 3e616f89", + "c1a3ff57 c1c3ff57 425a0055 -> 3f05fb97", + "c219e6b0 42221950 41686541 -> bd816643", + "41303855 42380e15 c1a7e3d6 -> bdf4eb5d", + "bfb870ae 4108f1ea bfb870ae -> 3ea3ae40", + "404f37b5 3f9e6f6a 4113cded -> 3f2a92fe", + "c2115d0f 421ea2f1 c0cae879 -> 3f253dba", + "bfca4aef 41f35b51 c0652578 -> 3ef5ec53", + "41b2b778 41156eef c21ea444 -> 3f1a2098", + "4215aa76 4215aa76 c18cab13 -> 3d3ff1fd", + "c252919c c202919c 42756e64 -> 3ef79322", + "41c56405 c2494dfe 423ab202 -> 3f2782cc", + "421fbab9 41df7572 c2784547 -> be6e18b0", + "c11595df c15595df 421a9a89 -> bdade9b9", + "4215a576 4215a576 4215a576 -> bf1500a9", + "c2522b83 c2162b83 4275d47d -> bea62919", + "41864888 c181b778 414c9111 -> bf1d8636", + "4208be28 4208be28 4208be28 -> 3e630eaa", + "c13c3b2a c2630ecb 4258f135 -> bed23ace", + "41d5816e c1d27e92 4216c0b7 -> bf12e53b", + "3d720330 422c3c81 c10f0dfd -> be3a7f99", + "42440e8c 3f81d176 c247f174 -> bd218a91", + "c100b3eb 41b7a60a c2082cfa -> bf0a4668", + "c1fd42fb c12a85f5 41357a0b -> 3cc79e6a", + "3f84c825 41984c82 42042641 -> 3f510a19", + "40af4f00 40af4f00 40af4f00 -> 3da81a63", + "c18cf6da c1d4f6da c194f6da -> 3e967d0c", + "c2116e6f 422a9191 40691904 -> 3d8a1212", + "41b10615 c186f9eb 3f90614a -> 3e5fdd89", + "4166c912 c1dc9b76 c1849b76 -> beb32302", + "c256c622 425d39de 40539de2 -> 3de49603", + "c14b3284 3e99af84 40e99af8 -> 3e2a0de4", + "c210d227 c210d227 c210d227 -> bf3dffde", + "41fe886c c1a97794 c1997794 -> bd3dcd05", + "42500487 c197f6f3 c197f6f3 -> 3f2bb88a", + "c1d06501 41bf9aff 416f35fd -> bf14f7e2", + "41b9842d c2133de9 c1967bd3 -> befc3d51", + "c19d86ac c19d86ac c19d86ac -> 3e668e81", + "4018047e c1dcff71 41830090 -> 3e947be4", + "41413526 41e89a94 c1df656c -> bd99ba6e", + "c15465b4 c24d196d 4206e693 -> 3ee814c9", + "41808a15 c1df75ea c19775ea -> be98ffbe", + "c100580f 420be9fc 409f4fe2 -> bf021486", + "41bc93d8 c1cb6c28 421a49ec -> be589124", + "c0755e14 c22355e2 bf55784e -> 3b8da7e6", + "c23ee69b c09734d8 41ca32cb -> be66d015", + "41cb0a8b c2567aba 41061516 -> 3f1de475", + "4129a175 c1565e8b 41d4d0ba -> 3e93ad2e", + "c21599bc 41199912 c1b33377 -> 3da12c84", + "40f18c6e 40f18c6e 41c4631c -> bf1545cf", + "c1dd71cc c1dd71cc c1dd71cc -> bf003f5c", + "423f09e6 c22cf61a 411c2797 -> be40ab00", + "417cdde4 c199910e 41ce6ef2 -> 3f19f6dd", + "c208c2d0 c210c2d0 42233d30 -> 3e26b927", + "c1a2b7e9 402a40bf c1c2b7e9 -> bf1dc80e", + "c2385bfc 422ba404 bdb7f888 -> 3e90e108", + "c0c850d6 4222f5e5 c2210a1b -> 3f0504cd", + "420d1a56 c256e5aa 41246958 -> 3d5e142e", + "c1918cbe 422739a1 c218c65f -> 3de67fa8", + "c0954e4a c23ea9c9 411558db -> bbc538f3", + "c23a1a31 c1dc3462 4225e5cf -> bf01edaa", + "c1adf1d0 41920e30 41c20e30 -> bf029729", + "c253c185 41e87cf6 41d07cf6 -> bf17759d", + "42481a96 c1ffcad5 c18fcad5 -> be414b1a", + "c257434a 4102f2da 4260bcb6 -> bf19fcc3", + "c094b308 c094b308 c094b308 -> 3f4c791d", + "c1cdc2e0 418a3d20 c195c2e0 -> be6a789c", + "42264043 c01bfbd6 41a48085 -> bef2a965", + "4210fac4 4210fac4 4210fac4 -> be800215", + "c160b7ee c2142dfc c042dfba -> bed354c3" + ] + }, + { + "glsl": "vec4 cultmath_snoise_grad(vec3)", + "tolerance": "ulp-bounded, on the simplex tie set", + "cases": [ + "c23acaaa c23acaaa c23acaaa -> 401052c9 3f0f16a7 bcbff362 3e0fd123", + "c25f203d 4200dfc3 41f9bf86 -> c002a42c 3fe43930 bfc80ae3 3f28af46", + "417a38d0 417a38d0 417a38d0 -> 4021c916 c01f15f9 becc73d1 be72b3c3", + "41d8995e c217b352 3d995d5e -> 3f5ba362 403ba6d9 400dd8ac 3e1dbd57", + "c1cdab59 4280952a c236d5ad -> 3fdbe5ab 408b8779 40183995 bec6de00", + "c1df605f 41513f42 41e09fa1 -> 3ee2b2ae 3ffd7d1a 3ebd27bc becd2159", + "41046bc0 41046bc0 41046bc0 -> 3e8d739e 3fc850ad 3f84baea 3dacafd4", + "421fd4d7 c1885653 c1905653 -> bf13f661 3ffd3295 3fa13f1d 3ef60904", + "4193e077 bf03f11e 4211f03b -> bf5a2722 bff6615b bfbfe7d0 bf36b29d", + "c135363e 406b2706 3f2c9c19 -> 3f88875d 3f8e18ff bfd68db4 3ec25bf5", + "3fbad472 c02295c7 c19452b9 -> c0b172f2 3ff7d196 3fa80473 3dce4aee", + "423ab63f 40f5b1fa c0aa4e06 -> c0994cdd c002adfc c02ea8f9 bdded0ee", + "41211cec 41211cec 41211cec -> 40648992 bf9400d0 403eb853 3efc8a00", + "41b80fec c0dfc04d c1b7f014 -> 3f4a3c57 400ca9ca c0129dad 3dcd5a1d", + "c2034030 c2034030 c2034030 -> bfc5b121 3f96408e bf890e26 3f0f06e8", + "c23970b6 421e8f4a c192e16b -> 3ef895b9 c038b63a 3fe20dfd 3e6b5583", + "c161b020 422793f8 c1c0d80f -> bf79bfc1 3fa30ad2 40a6b947 3ed356a4", + "c020441e 3fbf77c4 423dfbbe -> 3f2393c8 40b84bd6 c023eac0 bc82c6fa", + "c1f07fd5 c130ffaa 40be00ac -> 3f2fbdb6 402c4d24 c074df7b bdd62088", + "c24a9048 c20a9048 42496fb8 -> bff7047b 3fa2df38 3f6247a0 bf2f6ba2", + "c2414d22 412acb75 4262b2de -> 3f2c0542 c0946cd5 c07e5e45 bd829d92", + "4124abc8 4124abc8 4124abc8 -> bf7d3ba6 3ef86dca 3f660c9e 3f1072f8", + "c1c9be73 41d6418d 412c8319 -> 4048f97f 4048f97f c03460c6 be50c78f", + "42295f25 c10a8369 c246a0db -> c0b7d205 bf221d02 4023eab4 bd16719e", + "41227e6f 41d13f38 c17d8191 -> c0cc3984 bef546a1 3c52b5d9 3d9850c7", + "41b52981 40b4a605 c1f2d67f -> bf1af97a c0b57e97 4023e8e4 3da689a2", + "c1bc8ea1 4231b8b0 419b715f -> bf760574 c0a18b55 3f1259ea 3eff09a9", + "422868d7 c18f2e51 4198d1af -> bf98e393 bfc09ac5 be701e25 bee13aa0", + "42458cb1 c24a734f c1cce69e -> 3f1530ea bf51103a bf46cbf7 be8d3595", + "c21757f4 4230a80c 41895016 -> 3f2a6072 c094dd92 c07f30ba 3ca7511e", + "c2534bdb 4112d096 4204b425 -> becb5029 401d6289 bcb2b330 3f2709ab", + "c2787f22 425780de 41a701bd -> c0be3c0e 3f410c59 bf6bae55 be91d135", + "412dfb4e c16204b2 c22c812c -> 40395b10 3feb361c 3ed2b53d bed6ee38", + "c1cbe510 424e0d78 413835df -> c0b74d90 bf2085f7 4023ea86 bd4e210d", + "c1896aa4 41be955c c1a16aa4 -> bee53a16 bfde5181 3ff0a2b7 3f2260bd", + "4175c4cf 40eb899e c20a8ecc -> 3fbd2b6b bf5b4360 3fddb876 bf0356c9", + "41de3b35 42131d9a c220e266 -> c08a1945 4052b53a bf92a3df 3e0d5300", + "42405631 c213a9cf c13ea73e -> 40718601 c0493d45 3f642778 be42cea4", + "425731a7 41ce634e c23cce59 -> bf7f5cfa 3fb604c6 bea7e7c5 bf18be56", + "4098304d 427b060a c278f9f6 -> bf30aea2 bfb18a0d bfda4980 3ca5b37d", + "c13bf1a2 c18df8d1 c1bdf8d1 -> 3e454a06 3faab43f 3e12d8ff 3ede4d67", + "40da4fa0 c1816c18 c218b60c -> 3f0d2784 3f0d2784 c0cf4861 3d762401", + "c0152670 41cd5b32 c0ca9338 -> bd78718d 40283d33 bf6cab10 be50cb98", + "41ac4a8a c25ddaba 419c4a8a -> bf464f75 4036480c c0090c92 3e7122fc", + "c1f92d69 c1f92d69 c1f92d69 -> 3f8f1c99 bee1b3d0 3f41d9d6 3f4ee9ac", + "c1b642e5 41c1bd1b c1b642e5 -> 3f38e746 3f38e746 c0bce62b be8437b4", + "411ecf07 c1a8987d c17130f9 -> beed16b8 c08631c5 3f6f9544 bf1a1b13", + "42739224 c1b8dbb8 c2386ddc -> 3f2c1b6d 40455831 c098180f bd929e67", + "c0630a75 c21230a8 424dcf58 -> 3e3c7a14 c059b44a 401b5119 bea48961", + "423da984 c0d2b3e4 c1b4acf9 -> 3fabe9d9 401fcf03 405d87f2 be479240", + "c265def6 41688427 421a210a -> 40576b48 c0935f8b bfa45ada bdaf915d", + "c20801a2 c20401a2 4217fe5e -> bf82da2f c018d9d7 3fe7dba4 3da28c2a", + "401f0a79 c060f587 418be14f -> 405ea10e c0048e10 c084dfe4 3d2a5460", + "422ec79c c2153864 c18a70c9 -> 404f2ea9 3f292231 c0a45e99 bd151acd", + "c1c1d74d c22ceba7 41fe28b3 -> bfa60e4c c0730a5f bff61026 3f0e2ae7", + "c1bb8e8d 424e38b9 c1071d1b -> 3f4158ea 3f415858 c0b94424 be8ec97c", + "4235c4a6 c1ac76b3 c2563b5a -> 3ff226bf 40710acc 4020c4d6 3e81ce88", + "421820de c17f7c88 41a841bc -> bf0f0420 c03b809b c002228b 3ecd4759", + "41f78cfc 407c67de c150e608 -> 3fcb6e71 be689ec6 c05a065d bf1a3e60", + "422ccfc6 c12cc0ea 420ccfc6 -> bf3d7ecc 4038c65d c006e892 3e700be4", + "420e7ae5 c219851b c166146d -> 40aad885 3ef531d7 c023c08e be2e20b4", + "424053f6 424053f6 424053f6 -> 3f947526 c098ce67 bea5da3e bef927ab", + "42662514 c245daec c23ddaec -> 3e3294e1 3fadc9c8 4000c557 bf1b8d41", + "415a02d5 425e80b5 c2417f4b -> 4005b7c6 3ecead0e 402b2dc3 3df42dda", + "c1ac0cc6 408fcce8 4219f99d -> 3fbad271 bf1551a7 4009423d 3f1fc671", + "c2002bc1 421bd43f c2402bc1 -> bf6b3ea5 4037aa2b c01592ea be70c4d4", + "c26180af 422a7f51 40f3fa88 -> 4018ae51 40077174 4074322a 3ed62f73", + "4131d958 4131d958 4131d958 -> 3e052188 3e0681f2 c011d54a bf4785f2", + "421ce193 c0b8f364 4200e193 -> 4046c9f4 4046c9d8 c03453fd 3e58d8b5", + "c1a73963 423c634f 41018d3c -> be2de0e4 bf810173 3bc8f9b5 3f1cd89d", + "c21d747b c229747b 42768b85 -> c093f1f4 4057b3cc bfa57414 3da5fe25", + "422e0da1 3f036817 c221f25f -> bfea2043 3ff95074 bf5b92f9 bf179153", + "42465de8 42465de8 42465de8 -> c04546f5 4063fa71 3f4b2769 3e4ffd8c", + "c2558aae 41e4eaa5 3fceaa40 -> 3f73caea c080e5f1 c059f3e5 3ec742af", + "425e4891 c265b76f bfb6edd2 -> 3f7e6459 3f384c0d 3f71d93f bef89218", + "c233c183 42841f3f c24bc183 -> c077bb48 bfad0978 bffda5ab bf09babc", + "42764950 c20db6b0 c215b6b0 -> 403266d0 3f2fa211 c08159d3 3dcc9604", + "40b75282 423aea50 c0e8ad7e -> c082b517 3fecaba9 3fad63f5 3e53b670", + "c24c92de 410db48a 425b6d22 -> c0b7a388 3ff8a412 3fa6b524 bd73bbc8", + "413d1124 3fe88920 41a68893 -> 400244c3 c0155f26 3fd5a407 be4df706", + "c1b6549d c22b2a4e 4224d5b2 -> c08b83e8 bfdbdae4 c018340b bec6f420", + "4120f008 4120f008 4120f008 -> 4077ad83 bf83014a 405087bc 3edc3bcf", + "423ea770 4246a770 c284ac48 -> 40521628 3f281cad c0a80d42 3b87a509", + "421d5cb3 c15a8d32 3eae59b1 -> bef953cc c0ccc5b5 3bbb43c7 bd4b41f7", + "c223cc65 c17f3194 41f06736 -> 3f6f4d2e c0822359 c05c4376 bec19408", + "409ffe00 409ffe00 409ffe00 -> 40045877 409a674c 403075f7 bb1a675e", + "c170afa8 c0815f50 c20c2bea -> 3ff60996 c05a954a 407b1e90 bdea6488", + "4115e543 4057950e c20286af -> bfd49c68 40364011 bf07cb8c bf18e442", + "c2382835 4233d7cb c0e141a5 -> 3fe79c1e c03553fa 3f2715b7 bf16d605", + "c1f5e848 40a85ee1 c216f424 -> beef1900 beef18fb c04a518b bf374cad", + "4155549e 4135549e 4182aa4f -> 405f30cc c005ea02 c085ea0e 39fde108", + "41318042 bff3fdf1 c079fef8 -> 3e88705c 40988a5e c022f623 be7bce51", + "41357cf3 c21ea0c4 41457cf3 -> c05ef4f1 400558f0 40857b0c 3cdc8290", + "41676cb6 c108934a 41f3b65b -> bf59afe1 bfbc0762 bfcf3e57 bf2bcf8b", + "41393b88 42264ee2 c251b11e -> 3fb70412 c03bd5ad c018eab9 3f163ada", + "42084341 41510d05 c25bbcbf -> bfae28c9 bfb29c2d bf69bb0e 3f13c0f1", + "c12cc191 c23b3064 41819f37 -> bf634fe8 c0006104 3f8f1317 3d39cc43", + "40af1a48 40af1a48 40af1a48 -> c0b36d15 bf14a543 4023e539 3dd87fc4", + "41e6d375 c2349645 c2209645 -> bf1c29e8 c0b5e1e0 4023e963 bd9b3ab0", + "42068a0c c175d7d1 c135d7d0 -> bf1d9bb4 bf1d9be0 40c8731c be2ca06c", + "40041d57 c11ef8aa c1df7c55 -> 406e0d68 bf8b97ac 40479241 3eed80b7", + "421b9677 c2106989 c1a8d312 -> bfb63828 407d0730 bda287a2 bf0ddef3", + "42136374 c2409c8c 41bec6e8 -> 405ff438 405ff438 c034a44d 3d6e0a13", + "c1c511a1 c1ed11a1 42017730 -> bf39fc17 3fd61b94 40bbe20b 3e73abb9", + "4207c02f 423fc02f c2343fd1 -> 3eb9c922 bfc22cde 4069c466 3f16a984", + "4229a7b3 c1f4b099 c1196132 -> c07f5e75 bfee0ee0 3f4d93d1 bf198848", + "41a12108 41a12108 41a12108 -> bf07c935 c005f8af 40427a80 3df1af83", + "c0b37808 40ec87f8 c1fcde02 -> 3ffce781 3f4466e0 40128b6b 3d0a997a", + "417e6bb8 417e6bb8 417e6bb8 -> 40843171 bfaf28bb 3bd2e9ca bf0af4fb", + "c1942e99 c1185d32 3ef459c2 -> befef937 bff5c156 40031999 3f20ef59", + "4211707d c11a3e0a c1dd1f04 -> 4094622a 3ff6875d 4026a3a7 3e80d524", + "41b1b20a c0326fac 41736415 -> 3fcb781d be9f4a74 3e2777fe bf4efd66", + "3f9f5936 40a7d64d c22b0536 -> c09986e5 3ff375aa 3fabff0d be32ee4b", + "419c31ed c1379c25 41ac31ed -> 3f13f3e5 c00c3635 bf07c190 3e29957f", + "4224fe59 c20701a7 41d1fcb2 -> be4c9140 3facb4aa 3ff70f32 bed63d1f", + "41ee1ec8 c214f09c 40f87b20 -> 3ff50a16 c0a104ff 3faaf23b 3e21f21f", + "c1dc4e04 c1289c07 4225d8ff -> bf1e47bc 3fc08e6c 3f9d355f 3f00a006", + "41058091 41258091 c1ed3fb8 -> bf934a5f 3ebeb548 bf429e94 bf4ea0cd", + "40e6d3b5 c25b2589 41b9b4ee -> 408823a7 3fd1ba3f 4012b795 3edacd0d", + "41adf624 41adf624 41adf624 -> bde611e0 bd1cb601 3e038041 3dcd4edd", + "428eef15 c24621d4 c24221d4 -> 40243fab 3f90b617 3fa98640 3eff74d0", + "4221d60f c18c53e2 c24229f1 -> 3f589e6f c0885cd3 c067dd81 3ea0a968", + "c24871ce c20071ce 425f8e32 -> bf419836 bf419836 40b928a2 3e8f14de", + "41cfb3b8 41cfb3b8 41cfb3b8 -> c0a7bdff c0350055 3e41a40c 3ea11c8c", + "c2798a0f 427275f1 4159d7c4 -> bdd02373 3f628cd1 3cb1b6f1 3f1f45ff", + "c1f0dd9c c1a0dd9c c121bb38 -> 4049f35e c03ceb52 3f1c6437 be61a037", + "c1d76516 42244d75 41889aea -> 4019684f 3e690704 3f0d917a bcb4a4fd", + "c1c29b78 c1fa9b78 c14536f0 -> bf1f19d6 3feb5294 40c4966d 3d604727", + "c1422a78 417dd588 418eeac4 -> c0c5064f bec03b03 3dd9cca4 be582e5f", + "41f5c1a2 420ae0d1 c1823e5e -> 40b64e5a bf57b22f 3f4ad6f9 3eb10fcb", + "c18ab573 410a951a c1a2b573 -> c0ca2372 bfdc2ea5 3b69d609 3d2d83c1", + "c22f6b01 c22f6b01 c22f6b01 -> bfc3a2fa 40410e60 bf90f89a 3e69c10c", + "42126692 42126692 42126692 -> 407ee67a bc5665d4 c020acf5 3e99b241", + "421ce8c2 41e9d183 c12c5cf9 -> bf27ebde c0033068 bfc95f51 3f112da1", + "4244e20a c24b1df6 41d9c415 -> 403985d5 c043a800 bf134a2b 3e653955", + "c24ca519 42335ae7 c1629462 -> 3f1605e4 c0cd02b8 bf94c07e bd1bc5b0", + "c1df4511 c03a288c c12e8a23 -> 404578c4 c064a1b8 bf4c5ad6 be4f6c31", + "42321e25 c22de1db 41843c4b -> c0470b69 be7dd5de bfa75abd 3d976422", + "bfbb3b4c 42162625 40b1312d -> be99aba6 bf714fe4 bf230b4d 3f3ea0ca", + "c1b6a318 c20f518c c15d462f -> bff900a4 40baadf2 bfa606af 3c1d0a3b", + "c28a0e93 4233e2dc 4247e2dc -> 3ea13555 402b8b6a 4032727f 3ecab3d5", + "c1c96066 c1b16066 c20cb034 -> 3d4e87d6 402e6eb7 3ea5d0cb bf210d81", + "c1ee493a c1ee493a c1ee493a -> bffd00f1 bf29ccfe bfc72cec 3f1f6539", + "423c93cd c1eed866 41e1279a -> 402d39dc bf0e23ca bfe7c0fb be7018eb", + "c235b891 c05b8916 c01b8916 -> bea5d46f 3f8b56de bfb3745c be0f019d", + "c1924a83 422adabf c1d24a83 -> 3fcc2603 3fcc2595 409920a6 3ed6bcd0", + "c232a0b5 c1fd416a 421d5f4b -> 4060e1f4 4060e1f4 c034a493 3d2846ac", + "c20b955b 422c6aa5 42006aa5 -> c01aa60c bec55416 be851f06 bd8b78b3", + "3ff8cc80 3f719900 c081cce0 -> c05fdfb9 c039f7d9 c0222698 beb0dfe0", + "c24616b9 c1d42d73 421de947 -> bebcbed8 bfead9e7 4009904b 3f223499", + "c1c64ae4 425cda8d c23b2573 -> 3e9b05c2 bfcf417b be3705d7 3f4e33e9", + "42171c86 42171c86 42171c86 -> 3b0c0bc2 3f863254 bf2b788b 3f164873", + "41df9f54 41d79f54 c110c158 -> 3e85372f bfd56562 be610c04 bf4e2e19", + "41704893 4180244a c247eddb -> 3f2d035d c0167bef 3e862848 bf2a32e8", + "4240cc4b 3e4c4a52 bf4ced6c -> 408cc795 bf4861aa 40701a62 3e82b079", + "418d6ca7 c1ca9359 c1aa9359 -> 405eddd8 c00520ed c0855041 bd01b4e1", + "414d5175 411d5175 c210aba2 -> bf8e40ea c01cf194 3fe0da91 3d9880ee", + "416c6b88 416c6b88 416c6b88 -> 400776f9 3d1678b2 3f2d5655 beb1e6f1", + "c112c540 c1a162a0 c208b150 -> bc9cedfc 4003ef82 40324adc 3f144df7", + "41d58a10 41ad8a10 c2493af7 -> c094b9b0 bff78f49 c0273263 be7a69b6", + "c21fc111 42403eef 42283eef -> c04058bd bf8e0527 3fa15c09 3f32b9b6", + "bed70a84 c215ae15 c1a35c2a -> 3e53f75a c09b56f8 3f20f7a4 bef1dc13", + "4218ba02 4218ba02 4218ba02 -> 3f376eac 3fc90a14 bf986d3f bf1ba274", + "c18d2939 424d6b63 c22e949d -> c0c956a9 3f20cfa0 bf8d08de be189ee8", + "c21c3076 c21c3076 c21c3076 -> c0844975 3f677f60 c0604495 3eb71e70", + "40f657b2 c1ca6a14 4256caf6 -> be777e3d 403ea154 c00fcf70 bea9d831", + "c20c2821 421bd7df 41d7afbe -> 3fd05647 c04112ba 3eee4f8a bf183824", + "42281c68 42281c68 42281c68 -> 3fdca504 bf31b95c 40be91fe 3e4e0f8d", + "421efefd c174040d 41d5fdfa -> 3f41651d 3f41651d 40653cc6 bf2ad41e", + "c11a38ce 422971cc 41c2e399 -> c067830c bfce9f7c bff6ef15 3ee337f0", + "4269ab2a c27654d6 4146aca6 -> 40237656 3fe2df99 40311398 be880f11", + "42487cdc c2038324 c2038324 -> 3efba243 40abe99c c023c70b be27ae72", + "3febfddf 420f5fef c1a14022 -> 3f188e04 c00d2f9b 3e4d95de bf2a2747", + "c22698f8 41159c21 4192ce11 -> 400d9f41 bfd98cab 3f9da3dd 3f13303f", + "40dd1ed4 c1d0b84b c1e0b84b -> 3f6d8318 3f6d8318 c0a5b78f beb869d0", + "c217ddeb c03ddeb1 425c2215 -> 3fa6873e c004bcf0 3f60f066 bf2d1587", + "c2134451 c09a2281 c1de88a0 -> c0c7eaae bfd6cba9 3d10f898 be081179", + "427a6ecc c1eb2266 c21d9134 -> 4045da41 400618c0 407e89d1 3e86f3bd", + "4101912c 4101912c 4101912c -> 3fef2043 c088a9e2 3fada502 be4d3aa2", + "416f1bcc c1e8721a c0c1c869 -> 3e4d00f9 bfce4efa 4057d0aa 3f1a68c1", + "bfd45400 bfd45400 bfd45400 -> 3f663143 bfeb202c 3f1248e5 bf2f384d", + "c1d025df c21412f0 40bf6883 -> 4003d8fa c05e55cd 4084553e bd5193c3", + "40d6a221 41a5a888 41f5a888 -> c04c13d2 bf2a27a8 40a0762f 3d51ffac", + "c14ab103 c0d56206 c1955882 -> 401c2ae7 3f94a4c6 bf5763db 3f141b9e", + "419444af c1fbbb50 41cc44af -> bf13a0c5 bf165a4e 3fc8c685 bf4d21dd", + "c1a6c93f 42409b60 c19ec93f -> 3f0e23d3 402e7369 be99480f 3e21c0b5", + "4273bd9c c2822132 414ef670 -> c05f40c3 c05f40c3 3f0ef4d0 3f06554d", + "425eb2d1 c2194d2f c2494d2f -> 3f864097 4014fb12 bf918e3e 3f18d9dd", + "4233dc77 413f71db c2042389 -> c0b0d116 bf0cb025 4023ddc1 3e049d63", + "4188541f c24bd5f0 41f0541f -> bfb3a8cf 3ee77f73 bc120676 3f503a10", + "42019299 c159b59b c22e6d67 -> 3f68fd3c c0b02c58 bf319ae4 bec485bd", + "c1fe49d1 400db178 c17c93a1 -> c0aa7b81 bef300de 4023be41 be30400d", + "c1fab43e 41cd4bc2 40f52f07 -> 3f4f4a5e bf072d63 40157608 bf34417b", + "4196efa1 c238882f 424b77d1 -> bf19469b 3f960838 be188c9e bf521670", + "c21a422f c1a4845c 425dbdd1 -> c07fd687 3fb452f0 3d6a68c0 bf0d37d8", + "c2627bae 4286c22a c1d4f75b -> bfc2118d 3f532e99 c0b39da4 bea50053", + "c187f3ea c1eff3ea 4120182b -> 3fccecce bff55146 3f408ab8 3f192291", + "40ec0dc2 421d81b8 c0d3f23e -> be93264d 404d5c90 c01de457 bea52c08", + "c13ebe6d 42205065 c11ebe6d -> 3e596a5a 4093c660 c022a333 3e84d2ae", + "c16d9d7b c1eecebe c1b6cebe -> 3ec5d3f1 3fc2faef 40371821 3f1d8b03", + "c103e181 c230f860 423b07a0 -> 409b5eeb bff3de40 bfabc17c be2f1f68", + "c13e1132 c09c2263 4083dd9d -> 3f30edae 3f30ed90 c0c04dc6 3e721259", + "c1b8ec0c c1c8ec0c c180ec0c -> 405f6c78 3fefa135 404c20d5 be4700dc", + "c20134a9 c174d2a4 c164d2a4 -> bfc6f6ef c0c15e61 3e03cf5c be805010", + "41da95ca 41052b93 bfd6a364 -> 3e29eb39 3fbbabb2 3f8084d1 3f446eb1", + "c206ce67 42093199 42013199 -> bfa62996 40087a6d bf5cc459 bf2c639b", + "4229adb3 41eb5b66 c1b4a49a -> 4027e8d0 4027e8d0 c0331921 be94bdc9", + "c1ce5182 bf4a3033 c21328c1 -> bff563cf 405a714b c07a9f25 bded9d0e", + "c18d4bc5 40aad0eb c20aa5e3 -> 3f95f3af c02ca88c 3f63e8f5 3e73d9c1", + "c18f5136 41d0aeca c1cf5136 -> be13625f c08db126 40222572 be8c65bb", + "4251ef9f 4215ef9f c26e1061 -> 3fa97ac3 bfd4717a bfbd2c51 be30d06c", + "41df6857 3f6d0aea c0a25ea3 -> bff42bac 409cc77b bfab903c be2c0dc4", + "402db957 414b6e56 c18a48d6 -> c0ba752c be6647c4 3e77bd86 be9fd9ab", + "c1a193ea 41f66c16 c1b993ea -> bfd47bce 3ddfa79f 3fc081ec 3ea873bc", + "42266905 c20596fb c20196fb -> 3fcbd4d1 3e652430 3ff4fc93 3f01cabb", + "c18de16a 40887a55 41da1e96 -> 3e9d5ba9 409c1b7e c0232bcb be701f9e", + "413c022a 3fe0114d 41ae0115 -> bdc01632 be05b5d6 bf890896 3f263a81", + "c250542b 4203abd5 418757ac -> bf245aae c09019ed 3f4e5349 bf121e22", + "bf6dd748 41e89146 40a24517 -> 3f8b2f90 bf8bb7c7 c09cf330 beed68c8", + "420b9e3e c22861c2 c22861c2 -> 404e378e 3f9e08a5 3fe23d60 be8d4f0d", + "413183a0 413183a0 413183a0 -> bef317ed bef317e1 c04b0c88 bf3701b0", + "42513853 c222c7ad 4124e14a -> bf2f9606 3ee5eb97 4017a261 be3c08bf", + "421033d0 c281e618 424c33d0 -> beff81eb bf1f2bf4 3fcabcca 3e042f68", + "41116c49 41e8b624 c1d749dc -> bf6fe628 bf6fe689 40a4a170 beba3049", + "4123be4b 4123be4b c03106d0 -> bf85b17e 3f94b3dc 40a0b93e 3ee409a4", + "41a17d38 41a17d38 41a17d38 -> bd6234b1 bf6c7400 401cd761 3e20a134", + "c206e35f 424d1ca1 3e8e506a -> 400a0fe8 bfdfae2a 3fd5b7a7 3f26de2d", + "c2139432 c2139432 c2139432 -> 3f2089a2 c0778c6e 3f803b42 bf0d5366", + "c0cd9e79 c106cf3d 42164c31 -> c07c9fa3 404c5f28 bf78d5cc be3559b4", + "41c100e2 40e40386 c22b7f8f -> 3ed7dd22 c02b0424 3fcad2e0 bf2d4e8a", + "42230ced c04f3127 4098676c -> c0626452 3f95e344 c03cb9d0 3effb025", + "c22b6037 42289fc9 41d13f92 -> 3ea908be 402fbe9a 3f13ad5c 3f1861cc", + "c1226b75 c1226b75 41d6ca46 -> bff8d9d7 40b960f3 bfa65223 3d2304b9", + "400b6327 41996c65 421cb632 -> befc6f63 3ff83926 be2f5ac8 bf283133", + "c1062ade 41bcea91 42167548 -> bf2a0de7 c023a9d4 4065ed25 3ddec8f2", + "c1cff936 41c806ca 418006ca -> c0bab1ea 3ff9012a 3fa605be bc0cd7af", + "c1e3242d c106485a 42626de9 -> 400c9250 3e00ffb4 3f24ce7b 3f4721f0", + "4182f92c c21e836a c19d06d4 -> c033ebfa c0a70c98 3e4cc8d1 bea57a20", + "41800c7e c1bff382 41b00c7e -> 3e2de8a4 3fc164e6 c0344986 3e0bfdd1", + "c23e7c5e 422983a2 c159f178 -> 3efa0ae3 40aba62c c023c57f 3e294e21", + "42157598 3faeb310 c15a299e -> bf03b9ea bf03b80b 3fcc22d9 bf4e57a7", + "c2107687 420f8979 c2387687 -> 3feed40b 3f4e600f 3e769654 bef61d79", + "bee9463b c20dd28c 420a2d74 -> c0552489 408ed5a0 3f9ba948 3dec2fe2", + "42401820 c18fcfc0 40a0c0ff -> bf2981fb 40172dad c022cd13 bea270c8", + "411a4518 411a4518 411a4518 -> bfaf3d3e bfb128c5 401b29f4 bebbea12", + "c1af9776 42483445 40434455 -> 3ef824a6 bf73200b 3f2b14d5 be521161", + "40f91788 40f91788 40f91788 -> 401966d2 3ef494ea 4027a253 bcca160f", + "416f44db 40de89b6 c170bb25 -> 4036c56c c0333bce bee2b43f be695215", + "c02288c7 4221d773 c256288d -> bfdddc0e 403ae0e3 bf10a541 3f175582", + "410ad0f1 423ab43c c2654bc4 -> 3f2233c8 40b7d965 c023eaaf 3d12b808", + "c1ed68d2 bfd68d20 4182972e -> 3fcb2b83 c009f5a0 bf9d6643 3f127fc9", + "4257e7fd 414f9ff4 c2441803 -> 400299cb c05dd0b2 408360db bd8437c7", + "c2160c0f c0b06075 c1ac181d -> bf213218 c0b78598 4023ea9d 3d38aa90", + "414f9c31 426fe70d c26c18f3 -> 3fd9032a 3cb7522e bf9d1762 beb0b6cb", + "4256e995 c229166b c225166b -> c03e87af 404ed03a 3f250ae5 be5f05f6", + "40b5fd99 4206bfb4 41a57f66 -> 4007362a bf7b6b1a bf118d1e 3f2d6b64" + ] + }, + { + "glsl": "vec3 cultmath_af_point(float)", + "tolerance": "ulp-bounded", + "cases": [ + "c100e863 -> c100e863 00000000 00000000", + "c157318a -> c157318a 00000000 00000000", + "3fe21080 -> 3fe21080 00000000 00000000", + "40170740 -> 40170740 00000000 00000000", + "c10f7504 -> c10f7504 00000000 00000000", + "41180cbc -> 41180cbc 00000000 00000000", + "c1577606 -> c1577606 00000000 00000000", + "40af8864 -> 40af8864 00000000 00000000", + "c0006dc0 -> c0006dc0 00000000 00000000", + "40fea250 -> 40fea250 00000000 00000000", + "411f93f6 -> 411f93f6 00000000 00000000", + "419e382c -> 419e382c 00000000 00000000", + "c06c0b10 -> c06c0b10 00000000 00000000", + "41886cbe -> 41886cbe 00000000 00000000", + "40732908 -> 40732908 00000000 00000000", + "c0d8619c -> c0d8619c 00000000 00000000", + "c1607274 -> c1607274 00000000 00000000", + "408b9b40 -> 408b9b40 00000000 00000000", + "3ff0ee20 -> 3ff0ee20 00000000 00000000", + "41692bc0 -> 41692bc0 00000000 00000000", + "40a5c5f0 -> 40a5c5f0 00000000 00000000", + "402690c8 -> 402690c8 00000000 00000000", + "41326d56 -> 41326d56 00000000 00000000", + "411bb610 -> 411bb610 00000000 00000000", + "c03c2cd0 -> c03c2cd0 00000000 00000000", + "c10162e3 -> c10162e3 00000000 00000000", + "c169c276 -> c169c276 00000000 00000000", + "c0cccb2c -> c0cccb2c 00000000 00000000", + "c149162d -> c149162d 00000000 00000000", + "c1926dea -> c1926dea 00000000 00000000", + "c14ac648 -> c14ac648 00000000 00000000", + "c190b787 -> c190b787 00000000 00000000", + "4153a474 -> 4153a474 00000000 00000000", + "414332f0 -> 414332f0 00000000 00000000", + "c14e198b -> c14e198b 00000000 00000000", + "c0b05794 -> c0b05794 00000000 00000000", + "be7d3100 -> be7d3100 00000000 00000000", + "410da948 -> 410da948 00000000 00000000", + "41731d34 -> 41731d34 00000000 00000000", + "41206a28 -> 41206a28 00000000 00000000", + "407e7480 -> 407e7480 00000000 00000000", + "419dbc20 -> 419dbc20 00000000 00000000", + "3fde4680 -> 3fde4680 00000000 00000000", + "c09c7f94 -> c09c7f94 00000000 00000000", + "4018a490 -> 4018a490 00000000 00000000", + "40625700 -> 40625700 00000000 00000000", + "c0357360 -> c0357360 00000000 00000000", + "c157aec4 -> c157aec4 00000000 00000000", + "3e1a6400 -> 3e1a6400 00000000 00000000", + "c18b9397 -> c18b9397 00000000 00000000", + "bfb0efd0 -> bfb0efd0 00000000 00000000", + "c184437f -> c184437f 00000000 00000000", + "c0ad8f06 -> c0ad8f06 00000000 00000000", + "418e7d26 -> 418e7d26 00000000 00000000", + "410f9790 -> 410f9790 00000000 00000000", + "4115736a -> 4115736a 00000000 00000000", + "c0933dc0 -> c0933dc0 00000000 00000000", + "41408c00 -> 41408c00 00000000 00000000", + "c16b32fc -> c16b32fc 00000000 00000000", + "4198f6f0 -> 4198f6f0 00000000 00000000", + "40839e64 -> 40839e64 00000000 00000000", + "414eef90 -> 414eef90 00000000 00000000", + "bff92d10 -> bff92d10 00000000 00000000", + "c06cfe70 -> c06cfe70 00000000 00000000", + "3f2176e0 -> 3f2176e0 00000000 00000000", + "41010306 -> 41010306 00000000 00000000", + "c1573420 -> c1573420 00000000 00000000", + "40839498 -> 40839498 00000000 00000000", + "411ef306 -> 411ef306 00000000 00000000", + "c12b09f6 -> c12b09f6 00000000 00000000", + "4157c3f4 -> 4157c3f4 00000000 00000000", + "c0386ef0 -> c0386ef0 00000000 00000000", + "4112b06e -> 4112b06e 00000000 00000000", + "413db39a -> 413db39a 00000000 00000000", + "c1167161 -> c1167161 00000000 00000000", + "40aed570 -> 40aed570 00000000 00000000", + "c199124e -> c199124e 00000000 00000000", + "c07d4b80 -> c07d4b80 00000000 00000000", + "c14a7314 -> c14a7314 00000000 00000000", + "41585f0c -> 41585f0c 00000000 00000000", + "416bf9f8 -> 416bf9f8 00000000 00000000", + "4196f628 -> 4196f628 00000000 00000000", + "415730dc -> 415730dc 00000000 00000000", + "c171eeff -> c171eeff 00000000 00000000", + "40450898 -> 40450898 00000000 00000000", + "c1811fa5 -> c1811fa5 00000000 00000000", + "40eab0ec -> 40eab0ec 00000000 00000000", + "4176aa28 -> 4176aa28 00000000 00000000", + "c186324f -> c186324f 00000000 00000000", + "c00e33d0 -> c00e33d0 00000000 00000000", + "4198b98c -> 4198b98c 00000000 00000000", + "40f6fe78 -> 40f6fe78 00000000 00000000", + "40637110 -> 40637110 00000000 00000000", + "418097aa -> 418097aa 00000000 00000000", + "c161650a -> c161650a 00000000 00000000", + "4130ad92 -> 4130ad92 00000000 00000000", + "3fd4ef20 -> 3fd4ef20 00000000 00000000", + "c168f794 -> c168f794 00000000 00000000", + "4167a8c8 -> 4167a8c8 00000000 00000000", + "41652620 -> 41652620 00000000 00000000", + "c040d880 -> c040d880 00000000 00000000", + "4150d8dc -> 4150d8dc 00000000 00000000", + "c05a8728 -> c05a8728 00000000 00000000", + "c1128c7c -> c1128c7c 00000000 00000000", + "c12eeb24 -> c12eeb24 00000000 00000000", + "c194011f -> c194011f 00000000 00000000", + "c0b66eda -> c0b66eda 00000000 00000000", + "402e1380 -> 402e1380 00000000 00000000", + "40e6d758 -> 40e6d758 00000000 00000000", + "c183e994 -> c183e994 00000000 00000000", + "41079806 -> 41079806 00000000 00000000", + "419ada00 -> 419ada00 00000000 00000000", + "4095fe28 -> 4095fe28 00000000 00000000", + "c1039209 -> c1039209 00000000 00000000", + "c17a0c17 -> c17a0c17 00000000 00000000", + "40a7c5c8 -> 40a7c5c8 00000000 00000000", + "419bdf5a -> 419bdf5a 00000000 00000000", + "c0da6d46 -> c0da6d46 00000000 00000000", + "41537e3c -> 41537e3c 00000000 00000000", + "c04ea520 -> c04ea520 00000000 00000000", + "c19a2ab8 -> c19a2ab8 00000000 00000000", + "c10dde4a -> c10dde4a 00000000 00000000", + "3f62ee80 -> 3f62ee80 00000000 00000000", + "c0fb0008 -> c0fb0008 00000000 00000000", + "c11c7d0c -> c11c7d0c 00000000 00000000", + "c163bb46 -> c163bb46 00000000 00000000", + "41590800 -> 41590800 00000000 00000000", + "4151811c -> 4151811c 00000000 00000000", + "40be3148 -> 40be3148 00000000 00000000", + "bee3de80 -> bee3de80 00000000 00000000", + "c1819995 -> c1819995 00000000 00000000", + "4176d2f8 -> 4176d2f8 00000000 00000000", + "3fc822c0 -> 3fc822c0 00000000 00000000", + "c0df3266 -> c0df3266 00000000 00000000", + "c05dab50 -> c05dab50 00000000 00000000", + "c1926f73 -> c1926f73 00000000 00000000", + "40123860 -> 40123860 00000000 00000000", + "4026f560 -> 4026f560 00000000 00000000", + "417cfc24 -> 417cfc24 00000000 00000000", + "3fca2330 -> 3fca2330 00000000 00000000", + "4118f824 -> 4118f824 00000000 00000000", + "c1762c6c -> c1762c6c 00000000 00000000", + "c13cc183 -> c13cc183 00000000 00000000", + "419db744 -> 419db744 00000000 00000000", + "4114db06 -> 4114db06 00000000 00000000", + "419ddf8a -> 419ddf8a 00000000 00000000", + "c187bfec -> c187bfec 00000000 00000000", + "c10391b3 -> c10391b3 00000000 00000000", + "413b3b6a -> 413b3b6a 00000000 00000000", + "3f2b8120 -> 3f2b8120 00000000 00000000", + "4138eee0 -> 4138eee0 00000000 00000000", + "c1382b7a -> c1382b7a 00000000 00000000", + "c0f8eba4 -> c0f8eba4 00000000 00000000", + "c012b7c0 -> c012b7c0 00000000 00000000", + "41597b90 -> 41597b90 00000000 00000000", + "c16257d4 -> c16257d4 00000000 00000000", + "c0faac1a -> c0faac1a 00000000 00000000", + "c17921c6 -> c17921c6 00000000 00000000", + "c19b07b8 -> c19b07b8 00000000 00000000", + "c18597ef -> c18597ef 00000000 00000000", + "c1410a40 -> c1410a40 00000000 00000000", + "3f9a3bb0 -> 3f9a3bb0 00000000 00000000", + "4186361e -> 4186361e 00000000 00000000", + "c1457560 -> c1457560 00000000 00000000", + "419db000 -> 419db000 00000000 00000000", + "4150c50c -> 4150c50c 00000000 00000000", + "c00d4158 -> c00d4158 00000000 00000000", + "c10567b8 -> c10567b8 00000000 00000000", + "4173d8cc -> 4173d8cc 00000000 00000000", + "c18a9698 -> c18a9698 00000000 00000000", + "c188559b -> c188559b 00000000 00000000", + "c047fa98 -> c047fa98 00000000 00000000", + "c028cb20 -> c028cb20 00000000 00000000", + "c105c628 -> c105c628 00000000 00000000", + "40e6bd30 -> 40e6bd30 00000000 00000000", + "4180eb7e -> 4180eb7e 00000000 00000000", + "c1888e64 -> c1888e64 00000000 00000000", + "3f960300 -> 3f960300 00000000 00000000", + "403693d8 -> 403693d8 00000000 00000000", + "c1183c20 -> c1183c20 00000000 00000000", + "c18a1db6 -> c18a1db6 00000000 00000000", + "3fe4cdb0 -> 3fe4cdb0 00000000 00000000", + "c194dd26 -> c194dd26 00000000 00000000", + "c16b9f6f -> c16b9f6f 00000000 00000000", + "40ffe45c -> 40ffe45c 00000000 00000000", + "4174f850 -> 4174f850 00000000 00000000", + "404d2328 -> 404d2328 00000000 00000000", + "c18126db -> c18126db 00000000 00000000", + "bf114c40 -> bf114c40 00000000 00000000", + "c1151300 -> c1151300 00000000 00000000", + "41187728 -> 41187728 00000000 00000000", + "c0094088 -> c0094088 00000000 00000000", + "3ffe6640 -> 3ffe6640 00000000 00000000", + "41482c04 -> 41482c04 00000000 00000000", + "c0cb62b6 -> c0cb62b6 00000000 00000000", + "c13a4f54 -> c13a4f54 00000000 00000000", + "c14298aa -> c14298aa 00000000 00000000", + "c19ba612 -> c19ba612 00000000 00000000", + "c19ff8bd -> c19ff8bd 00000000 00000000", + "41820afc -> 41820afc 00000000 00000000", + "3ff87b50 -> 3ff87b50 00000000 00000000", + "4135e7e0 -> 4135e7e0 00000000 00000000", + "c05da9f8 -> c05da9f8 00000000 00000000", + "4110689a -> 4110689a 00000000 00000000", + "c01272e0 -> c01272e0 00000000 00000000", + "c0aa24f6 -> c0aa24f6 00000000 00000000", + "4132074e -> 4132074e 00000000 00000000", + "c19b57d5 -> c19b57d5 00000000 00000000", + "4127f378 -> 4127f378 00000000 00000000", + "418bd24a -> 418bd24a 00000000 00000000", + "c1889d86 -> c1889d86 00000000 00000000", + "412fe994 -> 412fe994 00000000 00000000", + "3fc9ca20 -> 3fc9ca20 00000000 00000000", + "41222cb0 -> 41222cb0 00000000 00000000", + "c19b7a38 -> c19b7a38 00000000 00000000", + "40c4b818 -> 40c4b818 00000000 00000000", + "be3f8f00 -> be3f8f00 00000000 00000000", + "41380bac -> 41380bac 00000000 00000000", + "beacf180 -> beacf180 00000000 00000000", + "c179984c -> c179984c 00000000 00000000", + "c12283bd -> c12283bd 00000000 00000000", + "c0c20540 -> c0c20540 00000000 00000000", + "4143ad0c -> 4143ad0c 00000000 00000000", + "4091d798 -> 4091d798 00000000 00000000", + "c0db48ac -> c0db48ac 00000000 00000000", + "40a349d8 -> 40a349d8 00000000 00000000", + "416e3494 -> 416e3494 00000000 00000000", + "409b4268 -> 409b4268 00000000 00000000", + "418ff59a -> 418ff59a 00000000 00000000", + "bf9290b0 -> bf9290b0 00000000 00000000", + "41046fa4 -> 41046fa4 00000000 00000000", + "c18ce852 -> c18ce852 00000000 00000000", + "3f958ed0 -> 3f958ed0 00000000 00000000", + "40d31df8 -> 40d31df8 00000000 00000000", + "4108b474 -> 4108b474 00000000 00000000", + "c10a234c -> c10a234c 00000000 00000000", + "c16bfbcc -> c16bfbcc 00000000 00000000", + "c0f445d0 -> c0f445d0 00000000 00000000", + "40f1fa90 -> 40f1fa90 00000000 00000000", + "c0d5f6ae -> c0d5f6ae 00000000 00000000", + "c17d0eff -> c17d0eff 00000000 00000000", + "4027e1d0 -> 4027e1d0 00000000 00000000", + "c0d48260 -> c0d48260 00000000 00000000", + "3ffa3530 -> 3ffa3530 00000000 00000000", + "c143d7f4 -> c143d7f4 00000000 00000000", + "419446c8 -> 419446c8 00000000 00000000", + "41823b4e -> 41823b4e 00000000 00000000", + "413da018 -> 413da018 00000000 00000000", + "413f2074 -> 413f2074 00000000 00000000", + "40efe534 -> 40efe534 00000000 00000000", + "4108aee8 -> 4108aee8 00000000 00000000", + "c06a9158 -> c06a9158 00000000 00000000", + "3f61b6a0 -> 3f61b6a0 00000000 00000000", + "4179a6d4 -> 4179a6d4 00000000 00000000", + "40cd336c -> 40cd336c 00000000 00000000", + "c13fedf5 -> c13fedf5 00000000 00000000" + ] + }, + { + "glsl": "vec3 cultmath_af_symbol(float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "41991d6a 403fa9b6 -> 41991d6a 403fa9b6 00000000", + "c083e620 4049be5c -> c083e620 4049be5c 00000000", + "be51c380 c05b99e6 -> be51c380 c05b99e6 00000000", + "c18b4d6e c005ba72 -> c18b4d6e c005ba72 00000000", + "c12ccb11 c09bb534 -> c12ccb11 c09bb534 00000000", + "c122c845 406faa44 -> c122c845 406faa44 00000000", + "c19343e2 40132edc -> c19343e2 40132edc 00000000", + "3f657d80 c048db56 -> 3f657d80 c048db56 00000000", + "c18078ce c05a6c36 -> c18078ce c05a6c36 00000000", + "c19e44a7 3fe7079c -> c19e44a7 3fe7079c 00000000", + "c19b60b8 c01b999c -> c19b60b8 c01b999c 00000000", + "c04cf108 bfac63d0 -> c04cf108 bfac63d0 00000000", + "410d2e50 c087b5c2 -> 410d2e50 c087b5c2 00000000", + "414e80c0 c0180766 -> 414e80c0 c0180766 00000000", + "4124ff00 c000ec04 -> 4124ff00 c000ec04 00000000", + "3fc09f90 3fb21608 -> 3fc09f90 3fb21608 00000000", + "c19e855c 3e0a2680 -> c19e855c 3e0a2680 00000000", + "c0f8bc40 bfd74b04 -> c0f8bc40 bfd74b04 00000000", + "4183e814 406f3eec -> 4183e814 406f3eec 00000000", + "41584bb8 408f4574 -> 41584bb8 408f4574 00000000", + "3d135000 c092435f -> 3d135000 c092435f 00000000", + "c0e7dc90 c04c6d8c -> c0e7dc90 c04c6d8c 00000000", + "410b55d6 c09599d5 -> 410b55d6 c09599d5 00000000", + "412427dc c08a0734 -> 412427dc c08a0734 00000000", + "c1566540 3e8c51f0 -> c1566540 3e8c51f0 00000000", + "c0f36576 bfaef0c0 -> c0f36576 bfaef0c0 00000000", + "41763020 40998af2 -> 41763020 40998af2 00000000", + "c1492c84 400dd470 -> c1492c84 400dd470 00000000", + "c09a3414 c095e094 -> c09a3414 c095e094 00000000", + "c181b7fa bf4f6e28 -> c181b7fa bf4f6e28 00000000", + "c0d43550 40416c88 -> c0d43550 40416c88 00000000", + "3faa3470 408a1078 -> 3faa3470 408a1078 00000000", + "bf77e580 3f885970 -> bf77e580 3f885970 00000000", + "416cb4fc 3e86aea0 -> 416cb4fc 3e86aea0 00000000", + "c041cc10 c04602a5 -> c041cc10 c04602a5 00000000", + "c110ab7e c0303088 -> c110ab7e c0303088 00000000", + "c0e56fda c08d8a1a -> c0e56fda c08d8a1a 00000000", + "c14d0f82 4096e2a6 -> c14d0f82 4096e2a6 00000000", + "418c2a56 c026ceb5 -> 418c2a56 c026ceb5 00000000", + "40bcf084 3ff0c3f4 -> 40bcf084 3ff0c3f4 00000000", + "c0e726c2 40228f28 -> c0e726c2 40228f28 00000000", + "c180d113 c02c8b3e -> c180d113 c02c8b3e 00000000", + "419c635c c05073af -> 419c635c c05073af 00000000", + "4122dae6 c098104f -> 4122dae6 c098104f 00000000", + "c0dc6224 3f5735c0 -> c0dc6224 3f5735c0 00000000", + "4190ba44 40739150 -> 4190ba44 40739150 00000000", + "4132aee0 bf4f6300 -> 4132aee0 bf4f6300 00000000", + "40914b20 3ffe4d90 -> 40914b20 3ffe4d90 00000000", + "3ec65680 bf901e74 -> 3ec65680 bf901e74 00000000", + "410310ce c078d6e0 -> 410310ce c078d6e0 00000000", + "c157e8a6 c02cadf6 -> c157e8a6 c02cadf6 00000000", + "40b8c938 4097ceb2 -> 40b8c938 4097ceb2 00000000", + "c11dca43 c084c11a -> c11dca43 c084c11a 00000000", + "c1926039 40514454 -> c1926039 40514454 00000000", + "41402568 c036f1d2 -> 41402568 c036f1d2 00000000", + "41357fc4 c0664b54 -> 41357fc4 c0664b54 00000000", + "c09472d0 bf6f47b8 -> c09472d0 bf6f47b8 00000000", + "c1802414 3f4d58c0 -> c1802414 3f4d58c0 00000000", + "41030eb0 bffc5c6a -> 41030eb0 bffc5c6a 00000000", + "418dad1e bffe1554 -> 418dad1e bffe1554 00000000", + "416151d0 405cd59c -> 416151d0 405cd59c 00000000", + "c140f91c 4059bf8c -> c140f91c 4059bf8c 00000000", + "c127772c bf88799c -> c127772c bf88799c 00000000", + "c00b7da0 4080906a -> c00b7da0 4080906a 00000000", + "c00ee710 be436480 -> c00ee710 be436480 00000000", + "bfc36b30 3f018f90 -> bfc36b30 3f018f90 00000000", + "3fb103f0 3eba7900 -> 3fb103f0 3eba7900 00000000", + "3f825500 c08372b5 -> 3f825500 c08372b5 00000000", + "c179d574 c0713f8b -> c179d574 c0713f8b 00000000", + "41989f84 40812476 -> 41989f84 40812476 00000000", + "c16bb33c 4088cb48 -> c16bb33c 4088cb48 00000000", + "c1304606 c0773f40 -> c1304606 c0773f40 00000000", + "41404dac 4047bfdc -> 41404dac 4047bfdc 00000000", + "be0d5200 bfa2fe66 -> be0d5200 bfa2fe66 00000000", + "c0e7212e c0955851 -> c0e7212e c0955851 00000000", + "419e0c0c c03b9f17 -> 419e0c0c c03b9f17 00000000", + "c00da5d8 bf779228 -> c00da5d8 bf779228 00000000", + "c11a28b0 bfe97c80 -> c11a28b0 bfe97c80 00000000", + "c195da6e 4042a510 -> c195da6e 4042a510 00000000", + "41171490 4066728c -> 41171490 4066728c 00000000", + "40b2ba68 c065e145 -> 40b2ba68 c065e145 00000000", + "c09603d2 bfe7489c -> c09603d2 bfe7489c 00000000", + "41217b94 c02ae422 -> 41217b94 c02ae422 00000000", + "40872858 405e7778 -> 40872858 405e7778 00000000", + "4173e370 c09cb15f -> 4173e370 c09cb15f 00000000", + "bf96a2e0 3f5138e8 -> bf96a2e0 3f5138e8 00000000", + "c0deda76 c0937758 -> c0deda76 c0937758 00000000", + "c153576e 4087dda0 -> c153576e 4087dda0 00000000", + "409a3740 c084dcee -> 409a3740 c084dcee 00000000", + "c1934710 bf3cdc20 -> c1934710 bf3cdc20 00000000", + "417df878 c088b01b -> 417df878 c088b01b 00000000", + "4052c5a8 bf642480 -> 4052c5a8 bf642480 00000000", + "bf04e620 c01cce4f -> bf04e620 c01cce4f 00000000", + "c17c32a4 c06bfafa -> c17c32a4 c06bfafa 00000000", + "c10e882f c03af71f -> c10e882f c03af71f 00000000", + "c18d9848 bff8f50a -> c18d9848 bff8f50a 00000000", + "c090a838 c0753384 -> c090a838 c0753384 00000000", + "c117144a 409d1704 -> c117144a 409d1704 00000000", + "3fe4c3d0 4081af24 -> 3fe4c3d0 4081af24 00000000", + "c0b175a8 3f2cc738 -> c0b175a8 3f2cc738 00000000", + "c13bd452 3fbea680 -> c13bd452 3fbea680 00000000", + "beac5480 bff45bb4 -> beac5480 bff45bb4 00000000", + "40208ef0 bf60d888 -> 40208ef0 bf60d888 00000000", + "4173ce24 bf71eb20 -> 4173ce24 bf71eb20 00000000", + "c12a8d1b bfd3c7e0 -> c12a8d1b bfd3c7e0 00000000", + "40fc4c40 408f0280 -> 40fc4c40 408f0280 00000000", + "41293330 bff368d0 -> 41293330 bff368d0 00000000", + "41943d08 3f2af5a8 -> 41943d08 3f2af5a8 00000000", + "4015b548 4097039c -> 4015b548 4097039c 00000000", + "4154aa10 bcdb0e00 -> 4154aa10 bcdb0e00 00000000", + "c16eb17e be8386c0 -> c16eb17e be8386c0 00000000", + "4033fe98 3fddb520 -> 4033fe98 3fddb520 00000000", + "4190e6e8 c05659d8 -> 4190e6e8 c05659d8 00000000", + "c1435daa c03a39b7 -> c1435daa c03a39b7 00000000", + "4130259a c04d8577 -> 4130259a c04d8577 00000000", + "c099ba74 4009bd56 -> c099ba74 4009bd56 00000000", + "410f00f8 be8dff60 -> 410f00f8 be8dff60 00000000", + "c13362b6 c0215ac8 -> c13362b6 c0215ac8 00000000", + "405009c0 c01120bc -> 405009c0 c01120bc 00000000", + "415ed324 c0880c20 -> 415ed324 c0880c20 00000000", + "c0a138e8 40004824 -> c0a138e8 40004824 00000000", + "417e9224 408dade0 -> 417e9224 408dade0 00000000", + "3edc5800 c0793590 -> 3edc5800 c0793590 00000000", + "3fd29250 c0874fda -> 3fd29250 c0874fda 00000000", + "c15dad96 3ffc5c98 -> c15dad96 3ffc5c98 00000000", + "c02cfd20 3f3a4508 -> c02cfd20 3f3a4508 00000000", + "c188a5e5 4068fb48 -> c188a5e5 4068fb48 00000000", + "c01872d0 40149c88 -> c01872d0 40149c88 00000000", + "c186d632 404bc2cc -> c186d632 404bc2cc 00000000", + "c0b7f754 bf8304dc -> c0b7f754 bf8304dc 00000000", + "c134d879 3fdc0fb8 -> c134d879 3fdc0fb8 00000000", + "40a6bf38 c08e83d2 -> 40a6bf38 c08e83d2 00000000", + "41917ca4 409a3464 -> 41917ca4 409a3464 00000000", + "c130fbf7 c0050ce4 -> c130fbf7 c0050ce4 00000000", + "c18328d9 4009d4da -> c18328d9 4009d4da 00000000", + "419b5d7e c00971f4 -> 419b5d7e c00971f4 00000000", + "c170cbec 4024c252 -> c170cbec 4024c252 00000000", + "c17119a8 bf3be688 -> c17119a8 bf3be688 00000000", + "4043f410 3fa347c8 -> 4043f410 3fa347c8 00000000", + "c1580830 405b0360 -> c1580830 405b0360 00000000", + "409ea7b8 c074bdf4 -> 409ea7b8 c074bdf4 00000000", + "c18e4610 c0870458 -> c18e4610 c0870458 00000000", + "411db9d0 40449184 -> 411db9d0 40449184 00000000", + "40b61240 406605b0 -> 40b61240 406605b0 00000000", + "c195d19c bdffe7c0 -> c195d19c bdffe7c0 00000000", + "c153ae64 40283fa4 -> c153ae64 40283fa4 00000000", + "41856d78 befd5370 -> 41856d78 befd5370 00000000", + "4164c038 40015bb0 -> 4164c038 40015bb0 00000000", + "c1898bbe 405b99c8 -> c1898bbe 405b99c8 00000000", + "419c313e 3e93cfc0 -> 419c313e 3e93cfc0 00000000", + "4177c668 c020a0d1 -> 4177c668 c020a0d1 00000000", + "419bd8fe bf1e09c0 -> 419bd8fe bf1e09c0 00000000", + "41077350 c061cd54 -> 41077350 c061cd54 00000000", + "c0028b48 bfec1c38 -> c0028b48 bfec1c38 00000000", + "411a14f0 c09b918a -> 411a14f0 c09b918a 00000000", + "c15c607d befa8240 -> c15c607d befa8240 00000000", + "40c795f8 3e100f40 -> 40c795f8 3e100f40 00000000", + "412f29b6 c0800d42 -> 412f29b6 c0800d42 00000000", + "409527f8 3f05a138 -> 409527f8 3f05a138 00000000", + "c0f582e8 c061983c -> c0f582e8 c061983c 00000000", + "c0cd40b0 bfae034e -> c0cd40b0 bfae034e 00000000", + "c11969ab 3f835b18 -> c11969ab 3f835b18 00000000", + "3fec19f0 c03184a7 -> 3fec19f0 c03184a7 00000000", + "c0a899c2 3fddbd04 -> c0a899c2 3fddbd04 00000000", + "4180010c bf49d560 -> 4180010c bf49d560 00000000", + "c0b7c44a 4015633e -> c0b7c44a 4015633e 00000000", + "40b282d4 3faafbb0 -> 40b282d4 3faafbb0 00000000", + "41919e7c bfa016a4 -> 41919e7c bfa016a4 00000000", + "c16c6ff2 3f95eca0 -> c16c6ff2 3f95eca0 00000000", + "c0aaf800 3f7e1c90 -> c0aaf800 3f7e1c90 00000000", + "c0b59754 bfddd188 -> c0b59754 bfddd188 00000000", + "c1740f40 c09a4012 -> c1740f40 c09a4012 00000000", + "c0d73d7e 400ba1e4 -> c0d73d7e 400ba1e4 00000000", + "c17b8b58 bf789818 -> c17b8b58 bf789818 00000000", + "40e257bc 4024dabe -> 40e257bc 4024dabe 00000000", + "c1849c26 3e380360 -> c1849c26 3e380360 00000000", + "3fb2d9c0 4059fab4 -> 3fb2d9c0 4059fab4 00000000", + "c146e5b0 3e6c8100 -> c146e5b0 3e6c8100 00000000", + "419c646c bf93f71c -> 419c646c bf93f71c 00000000", + "417afa54 bde10140 -> 417afa54 bde10140 00000000", + "41327f8e 40307eac -> 41327f8e 40307eac 00000000", + "c05840d0 bfe6eb70 -> c05840d0 bfe6eb70 00000000", + "40c97e20 bf470ef0 -> 40c97e20 bf470ef0 00000000", + "41476e50 c098d96e -> 41476e50 c098d96e 00000000", + "40170fe8 bf8195f2 -> 40170fe8 bf8195f2 00000000", + "41962ab8 409fced8 -> 41962ab8 409fced8 00000000", + "c1491bb2 4005b768 -> c1491bb2 4005b768 00000000", + "4139336c c09bdbca -> 4139336c c09bdbca 00000000", + "c122f268 c024e987 -> c122f268 c024e987 00000000", + "c112b3b5 4051e158 -> c112b3b5 4051e158 00000000", + "c175f94f 4094ec92 -> c175f94f 4094ec92 00000000", + "419ed952 c064d8a6 -> 419ed952 c064d8a6 00000000", + "c0d27a18 40589da4 -> c0d27a18 40589da4 00000000", + "c140f7fb 403f46b6 -> c140f7fb 403f46b6 00000000", + "c00e71e8 bf2e2c58 -> c00e71e8 bf2e2c58 00000000", + "c091a858 401d8b9c -> c091a858 401d8b9c 00000000", + "410ffbfc 40718c08 -> 410ffbfc 40718c08 00000000", + "414d0798 3f52d6a8 -> 414d0798 3f52d6a8 00000000", + "418393b8 403f6678 -> 418393b8 403f6678 00000000", + "c0b27e6a 4083127e -> c0b27e6a 4083127e 00000000", + "418219cc c084ec3e -> 418219cc c084ec3e 00000000", + "415c1600 c00e092a -> 415c1600 c00e092a 00000000", + "41388550 c0846afd -> 41388550 c0846afd 00000000", + "c0d6c82e 4050a3d4 -> c0d6c82e 4050a3d4 00000000", + "c18f9c5c c04f2e1c -> c18f9c5c c04f2e1c 00000000", + "c10e458a 401db262 -> c10e458a 401db262 00000000", + "c17747da c08b7383 -> c17747da c08b7383 00000000", + "c0a21d74 4048a668 -> c0a21d74 4048a668 00000000", + "4132cc08 c011378d -> 4132cc08 c011378d 00000000", + "419ae3aa 404c216c -> 419ae3aa 404c216c 00000000", + "c130cbc2 c09bec34 -> c130cbc2 c09bec34 00000000", + "4047a678 c06eb0f0 -> 4047a678 c06eb0f0 00000000", + "c19bfb67 c0313630 -> c19bfb67 c0313630 00000000", + "c1105e4e bff54f78 -> c1105e4e bff54f78 00000000", + "4178afd0 c03b823c -> 4178afd0 c03b823c 00000000", + "c17edf04 bf096380 -> c17edf04 bf096380 00000000", + "417455ac bfb1b162 -> 417455ac bfb1b162 00000000", + "4186d6e0 c0961069 -> 4186d6e0 c0961069 00000000", + "c1723cda 400bbbce -> c1723cda 400bbbce 00000000", + "c0babbf0 c0206713 -> c0babbf0 c0206713 00000000", + "3e803780 bfa3379a -> 3e803780 bfa3379a 00000000", + "411e7f6c c0146e5d -> 411e7f6c c0146e5d 00000000", + "c15d458c 3fb2f2e8 -> c15d458c 3fb2f2e8 00000000", + "40a9a6ec 3fcdc600 -> 40a9a6ec 3fcdc600 00000000", + "3e26b100 c09dcf69 -> 3e26b100 c09dcf69 00000000", + "4141e9a0 3fb0bdf8 -> 4141e9a0 3fb0bdf8 00000000", + "41499f24 3ed4fae0 -> 41499f24 3ed4fae0 00000000", + "40ede17c 407c0c00 -> 40ede17c 407c0c00 00000000", + "3e87bcc0 400ac6f0 -> 3e87bcc0 400ac6f0 00000000", + "c116125c 3f26ee08 -> c116125c 3f26ee08 00000000", + "41478854 c0985e2d -> 41478854 c0985e2d 00000000", + "418bfa00 405c4984 -> 418bfa00 405c4984 00000000", + "c188278c 40541358 -> c188278c 40541358 00000000", + "41695cb0 402190d8 -> 41695cb0 402190d8 00000000", + "c16494c7 bfc9dbd0 -> c16494c7 bfc9dbd0 00000000", + "40f5c684 c08c77e3 -> 40f5c684 c08c77e3 00000000", + "41861336 40162e66 -> 41861336 40162e66 00000000", + "c0efc09c 4060d00c -> c0efc09c 4060d00c 00000000", + "c11657d4 bff3500a -> c11657d4 bff3500a 00000000", + "41974a4e bfa2e084 -> 41974a4e bfa2e084 00000000", + "4067d968 3f917d60 -> 4067d968 3f917d60 00000000", + "4142bd80 40744ea4 -> 4142bd80 40744ea4 00000000", + "c075af70 beb9f000 -> c075af70 beb9f000 00000000", + "40a80ff8 bfcc935e -> 40a80ff8 bfcc935e 00000000", + "40e06d20 c0972f1e -> 40e06d20 c0972f1e 00000000", + "3f7a1480 bf740f20 -> 3f7a1480 bf740f20 00000000", + "bff18eb0 4038e688 -> bff18eb0 4038e688 00000000", + "c01fbda0 be341ea0 -> c01fbda0 be341ea0 00000000", + "c0263f40 40811af4 -> c0263f40 40811af4 00000000", + "c1441f46 bfe2b1c4 -> c1441f46 bfe2b1c4 00000000", + "41301cc2 407342a0 -> 41301cc2 407342a0 00000000", + "3f377c80 c0587754 -> 3f377c80 c0587754 00000000", + "c0ed0428 401ad968 -> c0ed0428 401ad968 00000000", + "410c3892 c08647a0 -> 410c3892 c08647a0 00000000", + "c12d8054 405620b4 -> c12d8054 405620b4 00000000", + "40a4c7a8 c0421a14 -> 40a4c7a8 c0421a14 00000000" + ] + }, + { + "glsl": "vec3 cultmath_af_from_iv(vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "4104ebdf 413378c5 -> 411c3252 00000000 3fba33f2", + "4197e194 4197e394 -> 4197e294 00000000 3a04bf1d", + "c1337a3e c1337976 -> c13379da 00000000 38de6f48", + "c01cca84 c0158a7c -> c0192a80 00000000 3d680373", + "c1404a76 c13f9ed2 -> c13ff4a4 00000000 3cabbc09", + "c187533f c1875279 -> c18752dc 00000000 3956ea68", + "414b6b37 414b7669 -> 414b70d0 00000000 3ab4b6ed", + "408a824b 408a85f5 -> 408a8420 00000000 396ed430", + "c10d3886 c0ed17bd -> c101e232 00000000 3f3565c9", + "c056b53c c0564be4 -> c0568090 00000000 3b52e5ad", + "c176f478 c1741d08 -> c17588c0 00000000 3db5e3b8", + "406e6178 40829b34 -> 4079cbf0 00000000 3e36a885", + "c1820399 c180b57f -> c1815c8c 00000000 3da71520", + "4024b8c4 4031ccec -> 402b42d8 00000000 3dd143e4", + "411c1508 411cfdd4 -> 411c896e 00000000 3ce8dfa0", + "c182c9d8 c16bff08 -> c178c95c 00000000 3f4ca646", + "c08195f2 c081724e -> c0818420 00000000 3b0ed0cb", + "40cc912d 40ce966b -> 40cd93cc 00000000 3d0155f5", + "41491e26 4149249a -> 41492160 00000000 3a51a492", + "c117d836 c117b7ea -> c117c810 00000000 3b817bec", + "bfc13aab bfb6bcd5 -> bfbbfbc0 00000000 3d27dee2", + "c17167ea c1716092 -> c171643e 00000000 3a6ec5a0", + "4141d33c 4141fd74 -> 4141e858 00000000 3ba940ff", + "c0c7d0d8 c0c7cfb8 -> c0c7d048 00000000 389c7d0e", + "c16b1d21 c169b42d -> c16a68a7 00000000 3d3488b2", + "41353eca 4135671a -> 413552f2 00000000 3ba19ab4", + "c0510e5d c050eae3 -> c050fca0 00000000 3a8e5087", + "c18648f9 c186485d -> c18648ab 00000000 392cc91f", + "c1031961 c10310cd -> c1031517 00000000 3a8a4633", + "c17f1a84 c17ddffe -> c17e7d41 00000000 3d1d52f2", + "bf562c5e bd73e218 -> bee56a80 00000000 3ec6ee57", + "4168fcdb 416bce1d -> 416a657c 00000000 3db457de", + "c05e4d83 c05e349d -> c05e4110 00000000 3a480e4e", + "410a51af 410ac559 -> 410a8b84 00000000 3c6776b1", + "40a23995 40a23b03 -> 40a23a4c 00000000 38c123b0", + "c0ebc3c1 c0ebc22b -> c0ebc2f6 00000000 38d9bc3c", + "402ca56f 402ca7f1 -> 402ca6b0 00000000 38a5e540", + "417e925a 417f511e -> 417ef1bc 00000000 3cbee3ea", + "3f8a3515 3f8ae6cb -> 3f8a8df0 00000000 3b31c75d", + "41813a8b 418390d9 -> 418265b2 00000000 3e15979d", + "c10148fd c1007d15 -> c100e309 00000000 3ccbf829", + "3f91114d 3f9124f3 -> 3f911b20 00000000 399dc125", + "4128571f 412e3175 -> 412b444a 00000000 3e3b4d79", + "c046afa3 c046a82d -> c046abe8 00000000 3971dabf", + "c1223e78 c1212826 -> c121b34f 00000000 3d0b3324", + "c116edf2 c116075a -> c1167aa6 00000000 3ce6aade", + "c16a61a6 c16615f4 -> c1683bcd 00000000 3e0979ea", + "4177d404 417c1844 -> 4179f624 00000000 3e088bf0", + "410a5c85 410abc2f -> 410a8c5a 00000000 3c3f76af", + "41577b2e 4158921a -> 415806a4 00000000 3d0b8389", + "40d0928a 4105fc53 -> 40ee4598 00000000 3f6d98f6", + "c07e1b42 c07e16de -> c07e1910 00000000 3910786d", + "c1148d0b c10dbea5 -> c11125d8 00000000 3e59cf12", + "4153e3da 415404f6 -> 4153f468 00000000 3b84da02", + "c0a8de2f c0a72281 -> c0a80058 00000000 3cdde18e", + "bd972560 40ae28ee -> 402bcc58 00000000 4030859a", + "c0b7a179 c0b7465b -> c0b773ea 00000000 3bb669e8", + "c13a76d0 c0c240e9 -> c10dcba2 00000000 4032ace6", + "c123050d c11d4c6d -> c12028bd 00000000 3e37168c", + "4171a43b 4176bb75 -> 41742fd8 00000000 3e22eb1b", + "4148438c 41499b3c -> 4148ef64 00000000 3d2be49a", + "c12497a5 c12496d3 -> c124973c 00000000 38e692f5", + "412fe85d 413ab07f -> 41354c6e 00000000 3eac8395", + "4178971c 4190c71e -> 41868956 00000000 3fa3dd11", + "c162637e c1625eba -> c162611c 00000000 3a1c098e", + "414af8b3 414af975 -> 414af914 00000000 38db5f2f", + "3ebd7340 3ec00ac0 -> 3ebebf00 00000000 3b25e600", + "c19dd647 c19db3f1 -> c19dc51c 00000000 3c09a6eb", + "c167616a c1671e66 -> c1673fe8 00000000 3c0641d8", + "4174b643 4174b6ed -> 4174b698 00000000 38c896de", + "417423d8 41742480 -> 4174242c 00000000 38c68490", + "4125c05f 412ad8b9 -> 41284c8c 00000000 3e230deb", + "419fc511 419fcce7 -> 419fc8fc 00000000 3afd3f34", + "c147b2fc c140b936 -> c1443619 00000000 3e5f3bdf", + "c0c7e582 bf954638 -> c06d3710 00000000 4022940d", + "c0254660 c02544a0 -> c0254580 00000000 386a5466", + "406bdb29 406be317 -> 406bdf20 00000000 3980b7c6", + "4121b3e4 4121b534 -> 4121b48c 00000000 39321b53", + "408ddea6 408e07ea -> 408df348 00000000 3b255704", + "c0fd9af4 c0fc8090 -> c0fd0dc2 00000000 3c8d41da", + "4116ac26 417026b2 -> 4143696c 00000000 4032f554", + "c1297450 c12971dc -> c1297316 00000000 39a24ba2", + "4112a44e 41133c02 -> 4112f028 00000000 3c97c668", + "c01c1fa4 c01c1dac -> c01c1ea8 00000000 3882e0fd", + "c094a2c1 c04b175d -> c07a2e70 00000000 3f3c5c94", + "413e2f18 414f8668 -> 4146dac0 00000000 3f0abb50", + "41457ba4 415ec09c -> 41521e20 00000000 3f4a289f", + "414654b3 41521145 -> 414c32fc 00000000 3ebbcac4", + "414d894b 414e5be5 -> 414df298 00000000 3cd2b3cb", + "c18c9306 c18c66de -> c18c7cf2 00000000 3c30e64a", + "40390b34 40391a3c -> 403912b8 00000000 39f1f234", + "bf838ad0 bf836810 -> bf837970 00000000 3a0b41c5", + "41289fae 413adac2 -> 4131bd38 00000000 3f11d95b", + "bfc6e47c bfc5f644 -> bfc66d60 00000000 3b6e50dd", + "3febc758 40a6d9da -> 4061cbb0 00000000 3fd7d032", + "414dea2c 415d97ac -> 4155c0ec 00000000 3efad9bb", + "c1662aa0 c1660bf4 -> c1661b4a 00000000 3b76462b", + "c14d2d19 c1041555 -> c128a137 00000000 40122fbb", + "4142bd5c 41447b44 -> 41439c50 00000000 3d5f0048", + "41969e37 4196d515 -> 4196b9a6 00000000 3c5bc36b", + "41719d23 4171a04d -> 41719eb8 00000000 39d20d02", + "c0e06397 c0de05d5 -> c0df34b6 00000000 3d177783", + "c16d9b9c c16b6344 -> c16c7f70 00000000 3d8e1d6d", + "c1530702 c149c5fa -> c14e667e 00000000 3e941226", + "c133c0db c0551893 -> c0e90700 00000000 407cf599", + "c10d0f63 c10d0e7b -> c10d0eef 00000000 38f9a1ec", + "c11930e9 c1011801 -> c10d2475 00000000 3f40c7d9", + "418acccc 418bba1c -> 418b4374 00000000 3d6d6177", + "bf7dfc63 bf7df31d -> bf7df7c0 00000000 38965bf9", + "c0dac064 c03bc918 -> c09c5278 00000000 3ff9b7e7", + "c18f34e5 c18f3473 -> c18f34ac 00000000 3903e69d", + "c03a4ab9 c03857f7 -> c0395158 00000000 3c796ca5", + "419fdc52 419fdc8e -> 419fdc70 00000000 389ff724", + "40d4ddad 40d5753b -> 40d52974 00000000 3c17a8af", + "4030e6b6 40afb00d -> 408411b4 00000000 3fae7990", + "419593b9 41959623 -> 419594ee 00000000 3a1f2cb1", + "4033df13 4038b0fd -> 40364808 00000000 3d1a4023", + "40640da1 4064a7bf -> 40645ab0 00000000 3b9a3a95", + "41515e4a 418223d7 -> 416ad2fc 00000000 3fcba612", + "c1881f10 c1881dec -> c1881e7e 00000000 399a81f1", + "40a5b67e 40b0e952 -> 40ab4fe8 00000000 3e332ea2", + "c18f0c17 c18e29eb -> c18e9b01 00000000 3d623de2", + "409686be 40abfd7a -> 40a1421c 00000000 3eabb68c", + "3f3fc0a1 3f409bdf -> 3f402e40 00000000 3adb5613", + "c01ea3fb c0163b25 -> c01a6f90 00000000 3d868e9d", + "c006d9be bfad2743 -> bfdd6d60 00000000 3ec118b5", + "c12d1e94 c12d1dd4 -> c12d1e34 00000000 38d5a3d2", + "c04f7580 c006f7d0 -> c02b36a8 00000000 3f10fb94", + "4114d64d 412b2903 -> 411fffa8 00000000 3f32965b", + "403dfb10 403e0170 -> 403dfe40 00000000 394ef806", + "4192250c 41957b68 -> 4193d03a 00000000 3e559bac", + "c16095e9 c1605b7f -> c16078b4 00000000 3bea184b", + "c19c1df6 c19c1d86 -> c19c1dbe 00000000 390383bf", + "be8891c0 3d849902 -> bdced6ff 00000000 3e29b811", + "c122ba2d c121ebad -> c12252ed 00000000 3cce9457", + "411cc4d2 411df6c6 -> 411d5dcc 00000000 3d1903df", + "4191c1bc 4191c494 -> 4191c328 00000000 3a3a8e25", + "c10a03f4 c109ee8a -> c109f93f 00000000 3b2bda04", + "c1a1064b c19711db -> c19c0c13 00000000 3f1f4842", + "416d3e2e 416d4442 -> 416d4138 00000000 3a463511", + "be827828 be7e5ab1 -> be80d2c0 00000000 3b52b7f4", + "c1bb2c17 c17809d6 -> c19b9881 00000000 407c9d0e", + "c032503f c0324151 -> c03248c8 00000000 39f044a0", + "419b0415 419b542b -> 419b2c20 00000000 3ca052d5", + "c16b31f2 c15eb87e -> c164f538 00000000 3ec79916", + "40b932c6 40b9340a -> 40b93368 00000000 38ad9341", + "c11fb5df c07a61ec -> c0de4e5a 00000000 40423af0", + "c1646837 c12bc8a5 -> c148186e 00000000 3fe27eba", + "4014398f 401c9d81 -> 40186b88 00000000 3d864059", + "4074f671 407909cf -> 40770020 00000000 3d026fa4", + "c11e0eb3 c10b1cbd -> c11495b8 00000000 3f17904e", + "c199cd1a c180bf00 -> c18d460d 00000000 3fc8716a", + "415d3a58 41833304 -> 4171d030 00000000 3fa4af43", + "414ccc73 414cccdd -> 414ccca8 00000000 3883999c", + "412bbd47 412bbe6d -> 412bbdda 00000000 391dbbe7", + "411ade0b 41632c01 -> 413f0506 00000000 40109c25", + "41929bf3 4192a635 -> 4192a114 00000000 3b25454c", + "409d7acc 40a0b094 -> 409f15b0 00000000 3d4d7706", + "410695f6 410698da -> 41069768 00000000 39bd34c7", + "c1a4e4d7 c19acc9b -> c19fd8b9 00000000 3f21850a", + "c1a5bc8f c14dc94a -> c186509a 00000000 407b5ffb", + "401d9b65 401f01cb -> 401e4e98 00000000 3c333cf0", + "417a8e91 41800c94 -> 417d53dc 00000000 3e3156e0", + "c17008f6 c0a430df -> c12110b3 00000000 409df0a4", + "c192d411 c192c4c5 -> c192cc6b 00000000 3b75e5a8", + "4135c796 4135eb9a -> 4135d998 00000000 3b906af6", + "c131a02c c13191a8 -> c13198ea 00000000 3ae9a340", + "419442a1 41963f5f -> 41954100 00000000 3dfe6864", + "c0fc01d4 c0fbfec4 -> c0fc004c 00000000 394be00f", + "c17f663c c17e8474 -> c17ef558 00000000 3ce1e7ed", + "c114836d bf768210 -> c0a3eb8e 00000000 40851b5f", + "41200f2e 41200fee -> 41200f8e 00000000 38d401fe", + "41981756 419b0d6e -> 41999262 00000000 3e3d8ad8", + "c1a8a951 c1489276 -> c1867946 00000000 4088c056", + "c0d7f925 c0d5372f -> c0d6982a 00000000 3d308440", + "c1406810 c14043aa -> c14055dd 00000000 3b91f834", + "409150d7 40a9ab79 -> 409d7e28 00000000 3ec2d5ba", + "bf47a777 bf46f149 -> bf474c60 00000000 3ab646f5", + "c11ee6d3 c11d7787 -> c11e2f2d 00000000 3d37afee", + "c19eef5e c19eedec -> c19eeea5 00000000 39c2eef6", + "4096ce09 40bf9d97 -> 40ab35d0 00000000 3f233e98", + "41930c6e 41931f7a -> 419315f4 00000000 3b98f31f", + "c0f9653c c0f909b4 -> c0f93778 00000000 3bb74e59", + "41040c46 4106d69e -> 41057172 00000000 3db29a37", + "c0f70d58 c0195af9 -> c0a1dd6a 00000000 402a5ffb", + "c102960b c101103d -> c101d324 00000000 3d42ef29", + "c18a41c9 c18a1c6d -> c18a2f1b 00000000 3c15b521", + "c00474db c0046fe5 -> c0047260 00000000 3920d1d3", + "c12dc27f c12d32c9 -> c12d7aa4 00000000 3c8fcbb8", + "bef4649c bef3f9e4 -> bef42f40 00000000 39d5ad19", + "40a3f920 40a409d8 -> 40a4017c 00000000 3a86640a", + "40d4dad7 40d573b1 -> 40d52744 00000000 3c18f4ae", + "c14ff822 c14fd1ba -> c14fe4ee 00000000 3b9a07fc", + "4129f846 412a3e02 -> 412a1b24 00000000 3c0ba290", + "4150d776 4154c07a -> 4152cbf8 00000000 3dfa47a6", + "c048a23e c0313cd2 -> c03cef88 00000000 3e3b2c29", + "c18e9d3c c1545a17 -> c178ca48 00000000 4011c109", + "41846a38 4184de78 -> 4184a458 00000000 3ce8a138", + "c1983990 c1982d2a -> c198335d 00000000 3b479073", + "411dd735 411efa1b -> 411e68a8 00000000 3d117cf0", + "c19e66da c19e496e -> c19e5824 00000000 3bebfe67", + "40904532 40908bce -> 40906880 00000000 3b8d5c23", + "c10747e9 c1059c19 -> c1067201 00000000 3d55f074", + "c0e469a3 c0e463c9 -> c0e466b6 00000000 39bed1a7", + "c0dc442f c0dbffd1 -> c0dc2200 00000000 3b88f311", + "c18ef03d c18abfc3 -> c18cd800 00000000 3e86117c", + "c18451e6 c1743803 -> c17e6de8 00000000 3f235f51", + "3fd593aa 3fd68076 -> 3fd60a10 00000000 3b6ce6d0", + "c15d537c c15cc98c -> c15d0e84 00000000 3c8a0baa", + "c150d04f c1177491 -> c1342270 00000000 3fe56f60", + "40b816f0 40b827b8 -> 40b81f54 00000000 3a86f828", + "4149b509 414e88f7 -> 414c1f00 00000000 3e1a80fa", + "3f38657b 3f4dd385 -> 3f431c80 00000000 3d2b711e", + "bf1f7bc5 bf1f5c3b -> bf1f6c00 00000000 397cef7c", + "bcdd8000 4042cd20 -> 3fc11220 00000000 3fc48838", + "c192388d c17f8e35 -> c188ffd4 00000000 3f938c26", + "410850a0 41466b80 -> 41275e10 00000000 3ff86be3", + "c14ebf01 c14ebb0f -> c14ebd08 00000000 3a017afc", + "40bee0cf 40bef541 -> 40beeb08 00000000 3aa44ef5", + "c1577504 c1564e60 -> c156e1b2 00000000 3d135f77", + "c189115f c188501b -> c188b0bd 00000000 3d415522", + "c1747cba c17437e6 -> c1745a50 00000000 3c09e51f", + "409297c4 409adacc -> 4096b948 00000000 3e0431b6", + "408ceebe 408d05da -> 408cfa4c 00000000 3ab96d06", + "c08dc506 c08c1d62 -> c08cf134 00000000 3cd3dadc", + "c08579c6 c08437ba -> c084d8c0 00000000 3ca10e58", + "c173f891 c15b94b9 -> c167c6a5 00000000 3f431fb4", + "41866291 418a87b7 -> 41887524 00000000 3e84a6ea", + "40252358 40cd7c44 -> 409006f8 00000000 3ff5d563", + "4168db49 416e3d37 -> 416b8c40 00000000 3e2c4179", + "c1739fd2 c1739c5e -> c1739e18 00000000 39e49cff", + "40aa2983 40aa9dfd -> 40aa63c0 00000000 3be91ea7", + "c0f02106 c0f019f2 -> c0f01d7c 00000000 39e64084", + "419a5528 419a56e0 -> 419a5604 00000000 39e5a56e", + "40b88455 40b8afe3 -> 40b89a1c 00000000 3b2e9458", + "40f6f313 41217dba -> 410e7ba2 00000000 3f981113", + "c0cdfe51 c0c87c83 -> c0cb3d6a 00000000 3db03cf8", + "41585a38 41585af0 -> 41585a94 00000000 38d30b5e", + "c163d816 c163b9c6 -> c163c8ee 00000000 3b7363d8", + "c18d15d9 c180e221 -> c186fbfd 00000000 3f433c9a", + "4197cf46 4197d132 -> 4197d03c 00000000 39ff7d13", + "40a49c60 41695544 -> 411dd1ba 00000000 40970731", + "3ca6fad8 3da0eb4a -> 3d4aaa00 00000000 3cee5950", + "40e906b6 4137e6d1 -> 41163516 00000000 4006c71a", + "419d2dfb 419d4c4d -> 419d3d24 00000000 3bf32d4c", + "4048bf51 406616ef -> 40576b20 00000000 3e6abdd6", + "c0637be9 c0623937 -> c062da90 00000000 3c216738", + "c052ad0c bf0b8bd2 -> bff59000 00000000 3fafca32", + "4192b1be 4194e366 -> 4193ca92 00000000 3e0c6ea7", + "c16b33f9 c16af9d3 -> c16b16e6 00000000 3be90d9a", + "40ffe513 41002977 -> 41000e00 00000000 3bdbf615", + "40bab098 40bab1f8 -> 40bab148 00000000 38bbab20", + "414c8967 414d2e71 -> 414cdbec 00000000 3ca523a6", + "c14e81cd c14e0d6f -> c14e479e 00000000 3c68efa0", + "4195c5e3 41a94f19 -> 419f8a7e 00000000 3f9c4a59", + "407ce2c7 407cfc59 -> 407cef90 00000000 3a4d8cfc" + ] + }, + { + "glsl": "vec2 cultmath_af_range(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "4158c790 c095f5c1 3ee73bea -> 410692bd 41957e31", + "4187ff2c bf1d78e0 3e1ed5f4 -> 4181d5b0 418e28a8", + "41896304 40260a98 3c962126 -> 4168f83e 419e49e9", + "c18da13d c0444cc2 3a934ca7 -> c1a62d2c c16a2a9a", + "41270838 409ceada 3caabb56 -> 40b07abc 4175d311", + "4174b35c c043205a 40b48d39 -> 40d34922 41bfe114", + "c184263f bedeef60 3ad295eb -> c187a54f c180a72f", + "40bd19e0 c068963f 3d63848c -> 400e0f49 4119960e", + "3ff85750 40012d54 3a4457c0 -> bda1c01b 407d6551", + "4199a976 bf9fa36e 3ad9881f -> 418fabcf 41a3a71d", + "41886cc2 c077275a 3fc02270 -> 413b0b4a 41b353df", + "c0c5c820 407bde5c 3c022872 -> c121fc3b c00f2f94", + "4111de08 3e8a7d30 3c907749 -> 410d41da 41167a36", + "c0e1a408 40254ef8 3bf0c6fe -> c11a43e5 c08ec047", + "4198e74c 3fb6a0f4 3abde733 -> 418d7a3b 41a4545d", + "c02491a0 c00a63d0 3fb43bf6 -> c0c489c2 3f7fc10e", + "c18dad62 c002fafa 3b44f6c9 -> c19e12f3 c17a8fa2", + "c1908d49 4039ee20 3a06fa86 -> c1a7cc25 c1729cd9", + "419f31a8 c045c560 403e9b9e -> 415d4af6 41cfbdd5", + "c14b80f8 bf9e1920 3ef6e4fb -> c166fb52 c130069e", + "bfbc3d10 408fb98e 3c0885df -> c0bf0d21 4041dd32", + "c13a7ce8 c06c1bff 3982e0b5 -> c17584fd c0fee9a6", + "c0a02e28 bf584ee0 399fd698 -> c0bb3a8f c08521c1", + "c185312e c05d2aac 3e6032b9 -> c1a296f3 c14f96d2", + "3d265400 40288586 3e9e8577 -> c039bcf1 403eef91", + "416b7d08 3fd97cb0 3cf17f31 -> 414fd4a2 418392b7", + "c0ea9704 c077d0ae 3c49bcd1 -> c1337228 c05c9370", + "c0c62ed8 408756d8 39839a6c -> c126c3e9 bffb5775", + "418f7eaa 4071f418 3b87836f -> 41626f48 41adc5b0", + "40f6f4a4 bfc28ebc 3ea6c151 -> 40bbe4cd 4119023e", + "bf175de0 3eeaf800 3a145f69 -> bf867f84 be06f2dd", + "410814ca 4066b5a0 3f8e3a1d -> 40728045 41538983", + "419c811a 402c4b84 3d14085f -> 4186ad9a 41b2549a", + "c15e3e39 c08c86aa 400c7037 -> c1a3ced8 c0e9bd83", + "41150ede 409783cc 3a04c6be -> 409295ae 4160d2e5", + "40a33820 3ef1f8e0 390f6b11 -> 40941768 40b258d8", + "c00ee540 c06d19bb 3d251680 -> c0bf49b6 3fc191da", + "c07dba28 4069ca88 3b087282 -> c0f3d375 be9e6b24", + "c0e8395e c0747036 390dc884 -> c1313955 c05c0023", + "c0fa99ea c0197a3c 3af15922 -> c123b319 c0adcda2", + "4123f010 3fe8dd38 39641810 -> 4106d379 41410ca7", + "c08758ca 3f7c4e10 3de1f207 -> c0aa6a5f c0488e6b", + "3f333c80 4038918a 40511789 -> c0ae6d08 40db3c28", + "4178f744 40727ad4 404c0672 -> 410956db 41b44bd6", + "419a5668 c0570d49 393ea966 -> 417ee8a8 41b5387b", + "3fff09e0 3f8fb36c 40b2d0e2 -> c096fb56 410b4023", + "418c7cc8 bfe53d76 3b93b5d3 -> 417c3f57 419ad9e5", + "c1027e12 c020cc5f 3aa221a2 -> c12ab646 c0b48bbd", + "c14bd88c c08503aa 3e817d9a -> c1893330 c1054ab9", + "41779818 bf879d12 3f03ed2c -> 415e6592 4188654f", + "4135166c 3fec9e50 3d0fb33f -> 4116f2e2 415339f6", + "c11a8370 bf845c98 3c008d09 -> c12b2f31 c109d7af", + "41407c40 bfce8978 3bf58502 -> 41268c52 415a6c2e", + "3fa5cb10 c07997ba 3f1f70cb -> c04e8e7b 40ba2cc6", + "c1706750 3f0d3db0 3aead95f -> c1794292 c1678c0e", + "409a12f0 bf506d68 3ea46203 -> 406b7e2e 40be66c9", + "c1387889 402c0214 3d0a782f -> c1640394 c10ced7e", + "c1877054 bfac8d08 409f10ce -> c1b9fd64 c129c689", + "41871d76 becc8ef0 3c700a0c -> 4183cd30 418a6dbc", + "415f614c c037d3d9 3d1893f7 -> 4130d3b1 4186f773", + "4188f0ee 3fa73760 3c197f6c -> 417cd47e 4193779d", + "c15955ec c07c1f27 3a74b181 -> c18c30cd c11a4a3e", + "c08aa5dc 400f3040 3f2fddf9 -> c0e839ca bfb447ba", + "40dd7130 401f64fc 3b18f772 -> 408dab80 41169b6f", + "403ec808 bf6eff48 3a949689 -> 4002f593 407a9a7d", + "40381db8 c05216c1 3e965fab -> bf33145f 40ce8044", + "4195b374 3f1c77f8 3e5a4a7d -> 418f1b15 419c4bd3", + "41995e52 3fe02144 3e09020d -> 418a4a2f 41a87275", + "c1289040 4003f714 3b81f288 -> c1499e50 c1078230", + "40328500 bfd17cbc 409a204c -> c06a7a1b 4113e107", + "418ea48c 40908d7a 39df5331 -> 41550086 41b2c8d5", + "4166d93c 3f85af0c 3ccc4b93 -> 4155bd26 4177f552", + "c0ad6508 4094774e 3c90320e -> c121364e bf42eb9f", + "c18de01b c02da39c 3e9896fe -> c1a5f6f4 c16b9282", + "418adb68 3ec676f0 390390f6 -> 4187c141 418df58f", + "c12b685c 3cb6ac00 40c6920a -> c1878664 c08f87e0", + "41122b80 bfbf9904 3b352617 -> 40f45a05 412a29fe", + "411956c4 4073fa60 3e3995f6 -> 40b2e38d 41593bc2", + "415f06d4 408f929c 40bfcad9 -> 405d6006 41c35ad3", + "412c30b2 40879d2a 3c239595 -> 40d07251 4170283b", + "416f95fc 404e0bd4 3c0db4d6 -> 413bef88 41919e38", + "4153bd70 40116f80 3f783dbb -> 411fdda4 4183ce9e", + "c16170ac 4008d8c6 3f834917 -> c18a0809 c12ed147", + "41142c6a c03b460e 3a8f5a8b -> 40caacc0 41430274", + "c1238a5c 40839390 3b96865c -> c1656703 c0c35b69", + "4196afce c0917d17 39fbebc0 -> 41649f01 41bb101c", + "4087248c c09e93f2 3a8931eb -> bf3bc05b 4112e091", + "c0b1c740 405a75c0 4108382c -> c18bdca7 40cbe41b", + "40bdbd5c c03c0dae 396c220a -> 403f6936 410de30f", + "bf83f860 c09c16cc 3e429dbc -> c0c329de 40812dae", + "3f741880 3f747320 39267ffe -> baca4d13 3ff44b13", + "c1903d9a c04b5632 3c31103a -> c1a9be8d c16d794f", + "c0f6746e c07e069e 3f922728 -> c14d00d1 c025ce77", + "c131ace9 c084fbd8 3f60036d -> c181158e c0c25d6c", + "c15bef5c 409eff8c 3a07e3c7 -> c195b8aa c10c6d63", + "c1863adf bd47b800 40e2a536 -> c1bf4814 c11a5b53", + "c0e766e0 4071a738 40524366 -> c164ae26 be2e2e8d", + "414c494c c0576194 407ce334 -> 40ae700c 41a0ad49", + "c1429ff6 3e0799c0 40fff4fe -> c1a25c78 c0810df7", + "c07c7e18 c04b213e 3d251931 -> c0e519ec bf3b2161", + "41112970 3fde1cc4 3ea4ebe1 -> 40e07cdb 41321473", + "c16249a4 c03b151c 3deadcc6 -> c189725b c131ae93", + "c154b9a5 c0430f28 3ee1cc33 -> c18645f0 c11ce769", + "41883884 3fd133a8 40a49d36 -> 4123fbe0 41be7318", + "c0e03b36 bf9581a0 407ed79e -> c14283c2 bfedbb9b", + "c0582b50 c03cf444 3fd5970f -> c0fff59e 3f9f2938", + "415b9498 3f2d51b0 3eb7db9d -> 414b0091 416c289f", + "c17fb2ac c05ccb9c 39f7099a -> c19b73ca c1487dc4", + "412192e6 4002f838 3c6ce0ff -> 41009994 41428c38", + "c172adf0 406224c4 3e62bc7c -> c1976113 c13699ba", + "c03d1600 4081f2a8 408017c7 -> c1304ac3 40a37f86", + "c1061dd2 bd359600 3c39bf4d -> c10701e0 c10539c4", + "c18438e7 c09cd2dc 3f62080a -> c1b27de9 c12be7ca", + "3f9ee310 408421f2 3b4f03a6 -> c0390631 40abf4a1", + "c125aa12 bf8848f0 3a9a4084 -> c136b80d c1149c17", + "4193897c bd664600 3f4bfa65 -> 418cb67c 419a5c7c", + "419fc934 40336adc 3b648142 -> 418954a9 41b63dbf", + "c168e099 3f152f88 3df324f2 -> c17419ea c15da748", + "41466c00 3fa1b838 3d204e57 -> 4131949d 415b4363", + "402b6cb0 bf87b914 3d062565 -> 3fcaef03 407161df", + "c14ce136 c09105da 3ba7cde2 -> c18abc97 c104493f", + "c18cd970 bb92f000 3f1cacbf -> c191c80e c187ead2", + "c1990718 c094ffe5 402f8633 -> c1d437e5 c13bac96", + "3ebabbc0 bfdb320c 3a770139 -> bfaca20d 4004fff6", + "c18e4ec4 bff08f98 3e406a95 -> c19ed89d c17b89d7", + "c0637c58 4065f764 3f244cf6 -> c0f9438d 3f2e39a5", + "41868ee8 403a7ff0 3a93826f -> 415e7924 419de13e", + "40c23e44 c072405a 397305fd -> 4012383b 411db036", + "c0b27b58 c00664e7 3bb3aee0 -> c0f5dac6 c05e37d3", + "c0f8df6c be489d00 400e00af -> c1231260 c0ab9a18", + "417b1ff4 3e4b3040 3df61bf8 -> 417606eb 41801c7e", + "c108de78 bfbe84ce 4009011f -> c142ef66 c09d9b15", + "4192921a c04bf732 403cd329 -> 4142f185 41c3ab72", + "bfdd3910 408c9094 3ca37487 -> c0c48259 402bcba3", + "417b49b4 bdc86e80 3c945c85 -> 41796e99 417d24cf", + "c1774395 c0862188 3adf2414 -> c19d2db3 c1342bc4", + "41933ce8 bf8169d6 3f2f1fa4 -> 4185ad44 41a0cc8c", + "41248120 3fbb7ab8 3dd2ed63 -> 410b6be2 413d965e", + "c1049ea9 3e8ffd40 40877170 -> c14cd758 c07197e9", + "c113edd2 3fff1598 3a924ae0 -> c133d522 c0e80d03", + "c06793a8 400a6188 3d71199e -> c0badcd7 bfb2db45", + "c19a1c02 3f956bd8 3f8dd432 -> c1ac500e c187e7f6", + "4049ea90 402c40f0 40cc0526 -> c0bd306e 41438d7f", + "4138c0ea bef01a50 3e7b6a9f -> 412d5261 41442f73", + "416b33dc beb9d860 3fe94ce6 -> 41483b6b 41871626", + "41202aa4 4025d570 3e12c5c1 -> 40e8d449 414beb24", + "409b6c08 c021fa17 3a91a9fe -> 4014cba6 40ec723d", + "c17efa3f bfc5d30c 3986026d -> c18bdadf c1663ec1", + "c17e9728 c069612e 4014f431 -> c1af164b c11f01ba", + "c19bb65a 409de01a 3fa6df13 -> c1cd9c5f c153a0aa", + "418d0d7c 3ff2240c 3cd29ced -> 417b6d14 419c646e", + "40ec1328 c090e11d 3aaae573 -> 40364e8a 413e7f86", + "4181ee56 406f81b8 401521b0 -> 4122b3bc 41b282ce", + "40b69fdc 3eb20e40 3b6d1c67 -> 40ab6148 40c1de70", + "c10966ed c052471b 40ab6fd8 -> c189d859 3d62d73b", + "c18384f2 40794d48 3a56f771 -> c1a2b053 c148b322", + "412044bc 3ed9b5b0 3f332ce7 -> 410e4435 41324543", + "c103ce75 3fbcb858 3c95b664 -> c11bb065 c0d7d90b", + "c19fe15e bff5d554 3bea0c03 -> c1af4d5f c190755d", + "bf8d08a0 40852f92 3cd1187b -> c0a942dd 40457d19", + "418b5f28 3f279d58 3f41b7a7 -> 41801477 4196a9d9", + "c167c357 405ea5f4 3f290188 -> c194fe7f c12589af", + "c1428f69 c04ad5ba 3c460091 -> c1757667 c10fa86b", + "40a53e58 405c4df8 402a1022 -> bf6f865c 413436bd", + "4124fc7a 4099330c 3eba2f25 -> 40a522d7 41776788", + "417e6228 404a6cb0 3a425972 -> 414bc3df 41988039", + "c1692344 c09bc6a2 3ade1b3c -> c19b86cd c11b38ef", + "40f3fa78 c017b16f 3c931741 -> 40a78e95 4120332e", + "c18eb623 3fbbd2d4 39298a7b -> c19a73af c182f897", + "c1968372 3feb98a0 3efe9351 -> c1a93754 c183cf90", + "41617490 bf2a0908 40c55d29 -> 40e84aac 41a761e4", + "c08a20f4 4004919e 40e0bacb -> c1569254 4098e2c1", + "3fb7da20 c061a396 3b87e612 -> c005fa8d 409eea56", + "c14b9c51 407b8584 3eae6aad -> c187f88c c1074789", + "412a713e c0725a72 3e9ec32d -> 40d1c8f3 416bfe03", + "4175d680 3eb9a880 3e61cfe4 -> 416c81ec 417f2b14", + "4119c0c6 c07e24e6 3ceb5259 -> 40b383ab 4159bfb7", + "c1421287 bfd0fba0 405182d7 -> c1884961 c0e72498", + "c1293a70 c0233eee 3b55483a -> c152178d c1005d53", + "c0e01180 c0852b89 3a84d1f0 -> c132a2b6 c035bb27", + "410e34d6 c0558885 3d000f77 -> 40b0a531 41441713", + "40e2bd78 40312a9c 3c393422 -> 4089cb7c 411dd7ba", + "41889892 bfabe616 3b1575e9 -> 417baaf8 41935ba8", + "411b69ac bfb13234 3e623a5e -> 4101ba71 413518e7", + "41604aa4 40913c88 39d132df -> 4117aaab 4194754e", + "3fc97460 4087c5fe 3a05e9bd -> c02ada41 40ba2751", + "4121a0c0 c05342c7 39bb0bd2 -> 40d99d15 415672f5", + "c0a28074 c006c7a8 3da4dd6f -> c0e877cd c0391238", + "c1218037 3fc70e30 399fe2b4 -> c13a6349 c1089d25", + "c18e64ea c05bd60a 3ca7aa28 -> c1aa09a1 c1658067", + "40d5835c c038fbfc 395a0f88 -> 4072072e 41190191", + "c171a99b bece8940 3edc0b79 -> c17efe51 c16454e5", + "c13b3af6 c08376be 3bacf66c -> c17d0c04 c0f2d3d0", + "c107e77d 409252b0 3a3ac740 -> c15113cd c07aecb4", + "c083bccc 409f2b8c 3f024a40 -> c11998da 3faee06d", + "414e9864 bfc4ba58 3c06831a -> 4135df6a 4167515e", + "4134ff32 3ffb2e0c 3b836942 -> 411588f6 4154756e", + "c159103e 3f395a00 406d9d54 -> c19006a3 c1121337", + "c182fbe8 bfc115e0 401b35bb -> c1a27407 c1470791", + "4185b660 bf348438 39d3e559 -> 41801161 418b5b5f", + "c0ee56a8 406dfaf8 3a91b6ab -> c132aeab c06e9ff4", + "414603f0 c087ac00 3a147139 -> 41022b8d 4184ee29", + "4086b990 4011f440 3cf25417 -> 3ff3343c 40d0a611", + "c08841a8 bfd72d00 3fbfc672 -> c0edfe93 bf8a12f3", + "413e2e10 beb3be20 3a979d0d -> 41388b56 4143d0ca", + "418cc61e 40984f16 3b3d01eb -> 414d58cb 41b2dfd7", + "41597d00 bf406268 3b6669f1 -> 414d6865 4165919b", + "4108f26c c011c906 3ca3f6d8 -> 40c85c48 412db6b4", + "c165648a 3d747b00 3e1f9f77 -> c168d792 c161f182", + "c160383c c095d8e6 39bb1e17 -> c195931b c1154a40", + "415fcee8 c006a7b7 3e4b9617 -> 413af692 4182539f", + "c1312892 4097a1ec 398c2ab6 -> c17cfab0 c0caace7", + "4193a28e 3f6076a8 40816fae -> 415885c3 41bb023b", + "40684548 c034c466 3dfcb1b3 -> 3f2e6ce7 40d277ab", + "4178bef0 bf8dbff4 3bd9588d -> 4166ebb5 41854915", + "bf144660 bfae7c9c 39b4c3d9 -> bff8ab28 3f48c98f", + "4100d3dc c05f840e 3bf0a5fa -> 4091a971 4138d300", + "40597790 c0870820 38dd365f -> bf526a22 40f3c4d4", + "4147bf40 3f7f8900 3dcbf030 -> 41362ec2 41594fbe", + "411f5010 3fd6d0f4 3d9114f4 -> 410353bc 413b4c64", + "3ef6ab80 bee357e0 3e9b33f1 -> be87e077 3f9d4dde", + "c094df28 3ee08220 392aa209 -> c0a2e8a9 c086d5a7", + "c14fba16 3f3d5a88 3ce9ab6e -> c15c04a2 c1436f8a", + "c16e928e 40992390 3c0f2aa1 -> c19da41a c121dce8", + "c0a59bb0 c0209452 3a8e8fc9 -> c0f5eed1 c02a911d", + "40f46b60 4050337c 402651c5 -> 3fe4a294 4157d70d", + "c1814d4a 3fc7bfb4 3a06e346 -> c18dca5c c169a070", + "3f9efa10 bf043060 40229155 -> bfe840ec 40898d43", + "4117e2e4 c0168efe 3a95c1d2 -> 40e474d5 413d8b5e", + "40c67808 bf639f50 3bf3015c -> 40a9c750 40e328c0", + "bf119960 c0380af2 407e5dbe -> c0ed6793 40c9013b", + "c0be4df8 c086d205 3f253352 -> c12ce33f bf8b55ce", + "41870444 3d4ba100 3fd7e676 -> 41724005 4194e885", + "c0e3c766 bff314a0 3f636a54 -> c11e7cf6 c08a94e0", + "409513bc 3f3d99a8 3a3e56a8 -> 407ab512 40acccef", + "419b2b32 c036d444 3fb297e3 -> 41724e3e 41bd2f45", + "413e4bc0 c072766d 3f3ee155 -> 40eb7ffe 41836bc0", + "410aad0c 3fc3d548 38f026f9 -> 40e463c2 41232837", + "c038e898 4099eb0e 38e3ed6b -> c0f6604d 3ff5ded6", + "4149d3c8 3fbb5b10 3b22eaa6 -> 41325e29 41614967", + "4153a8ac 3e509e60 3a2afaf5 -> 4150637a 4156edde", + "c1751d32 3fb50e10 3f2d5414 -> c18b4a24 c153a61e", + "bfa1a580 c099d36e 3a3a755e -> c0c242ae 4062dfdc", + "c00beb20 402c2d26 3b82f7bd -> c09c2ceb 3f020e56", + "c193fc68 402f491e 3bafe505 -> c1a9f095 c17c1077", + "c0bcb5ac 4084aab2 40168d32 -> c1465388 3f19ddbe", + "41059d76 40218c80 393b6042 -> 40ba731f 412e015d", + "c0963712 4064f044 3b389010 -> c104632b bf8e9f36", + "407ecb50 402c395e 3d80632f -> 3f9d1d7c 40d783f1", + "4182964a 40878996 39a1726f -> 41416671 41a4795b", + "4123057a c07bcb40 3ffb4f24 -> 4089516b 4180b11f", + "4029c1f8 bdb18c00 3f636d55 -> 3fd6b469 406829bc", + "40a25930 bbb1e000 40934e11 -> 3eede93a 411ae9e6", + "c0707518 3e28b140 3a7794a7 -> c07b0fb5 c065da7b", + "40cae8b4 bfbd72ec 3bbcd5cf -> 409b5cb4 40fa74b4", + "bfeab1b0 3fe54bb4 401f1fa2 -> c0c38f36 401c6cbc" + ] + }, + { + "glsl": "vec3 cultmath_af_add(vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "40d43ce8 c087efa9 39613e6a c16aec62 c07bc9ac 403cc5ae -> c100cdee c102ea40 403cc980", + "c12da602 bf04ef28 3e52a901 416eafe0 3e32ffc0 401334ae -> 408213bc beb05e70 40205f5a", + "c13bb855 3f1a7af0 399ddbc6 c188bb12 3ff3ff78 3e522b2e -> c1e6973c 40209e78 3e5281fe", + "bfc3dff0 be934a60 3b29878b 400ff980 40107892 3c43020f -> 3f382620 3ffc1e8c 3c6d6ec2", + "418d570e bffc8a8c 3ac6433a 416372b0 400f701e 3d0a596e -> 41ff1066 3e8956c0 3d10abb8", + "418c1916 c062f6f7 3993b387 40e6d1c4 c024f1e0 3fdf597a -> 41c5cd87 c0c3f46c 3fdf63ba", + "c195fd6e 3f9be3b8 411ffb75 4194aff8 bfcfd300 392c8a53 -> be26bb00 becfbd20 411ffc2d", + "c16eadd8 40227cbc 410204a5 c18cb723 c04064f0 40c11ba2 -> c2020708 beef41a0 416292a5", + "c18039b0 3f5ba9f0 3e4f8fe4 40f2c80c 409d92e4 3a8f8f7d -> c1070f5a 40b90822 3e50b29e", + "40773020 c079dfec 3bb7222b 40c1a4c0 c0459a7c 3f85d8af -> 411e9e68 c0dfbd34 3f869061", + "40ca3f3c bfa23160 3ed550f9 c15b9017 408b3ed8 3bedb0ff -> c0ece0f2 40456500 3ed9091a", + "4134ba24 3e86f640 3b7f2baa c121ac83 c092bda4 39679e62 -> 3f986d08 c08a4e40 3b86feeb", + "40cff3f0 bcedf700 39f4164e c126d9ec bf354f20 40e76b14 -> c07b7fd0 bf3cbed8 40e76efc", + "c02b2300 40741c60 39ac403a c10ceaec 4023e60e 3a00dc23 -> c137b3ac 40cc0137 3a5b731f", + "415c62ec c02131da 3a188197 4174845c c0853193 39f197d6 -> 41e873a4 c0d5ca80 3a8d1e63", + "bd35a200 bf999a7c 3c68e268 c1427d2d bff77f5c 40d446dc -> c14332cf c0488cec 40d4bb79", + "c0e7495e 40967120 3f9ed448 408ca048 c00e286b 3e6d5e06 -> c035522c 401eb9d5 3fbc803f", + "40b0b778 40613920 3d57e1b7 406ce3b0 c0974af9 3cf57942 -> 411394a8 bf9ab9a4 3da9546e", + "c1883885 bfb6b418 3e8131bb c09ca770 c03464df 3b680d8b -> c1af6261 c087df76 3e830524", + "41005bee bf9beaee 3df9a294 405b39e0 bfefe608 3e8b6aa6 -> 41372a66 c045e87b 3ec9d529", + "c133bc4f 40801ae6 3c85c395 c1495d70 401f091e 3e4fb998 -> c1be8ce0 40cf9f75 3e6079ad", + "40b10314 beac46d0 3a6adb4b c153aefe 40866562 3ca1aa3e -> c0f65ae8 407741ea 3ca91842", + "c15e0335 404ee720 3dd554cc c0327270 3fb572b0 40545d57 -> c1854fe8 4094d03c 405b0860", + "40707f70 c01ed5fd 3aa6c604 40c9c314 4044f564 3edbafeb -> 41210166 3f187d9c 3edc5814", + "bff42e80 c07261e9 3a28fcd5 c172bccc bd364700 408c6a78 -> c188a14e c0753b05 408c6ff3", + "c0c3a420 40158cd8 3e46a2db c16bb081 bf8be71c 3bfd0bde -> c1a6c148 3f9f3294 3e4e90cd", + "c12c85a6 bef236a0 39ac72e6 417513d0 40915bb0 3d828091 -> 40911c54 40823846 3d83315a", + "c0f9c412 40819efa 3c7ba656 c132561c c0305084 3c1a67e2 -> c1979c12 3fa5dae0 3ccb2fa7", + "41040458 c0130774 3ef6488c 41085452 409d574e 39530ecd -> 41862c55 4027a728 3ef6656a", + "bfada460 3f1d8898 39983863 410a4b08 40152860 3e0c14b3 -> 40e92cf8 403c8a86 3e0c6367", + "bc8b5800 3e33e540 40e4a528 c118520b 404e2310 3a5feeb0 -> c11897b7 40596164 40e4ac4f", + "4140f4b4 c099295a 3c6e6b9a c12f5d00 c04016f6 3a672177 -> 3f8cbda0 c0f934d5 3c7d014d", + "41407ce8 40070c0a 3b49894a 40cce260 bfbc78dc 4050bb94 -> 4193770c 3f233e70 4050ee4f", + "c106e449 c02c2fb4 4042fec1 412ae39e bf5b0490 3aaf5b82 -> 400ffd54 c062f0d8 404314cf", + "c1451b66 3fabb33c 3f0343b1 4077c928 3fd40818 3fb312e4 -> c107291c 403fddaa 3ff4b527", + "c1099e9a 3e12f540 3ecaf927 bf73b040 bf954d06 3c79eb8e -> c118d99e bf82ee5e 3ed2c9e3", + "40668a98 c09247ff 39884958 c11f62ba bf4d2b40 3a87e4fa -> c0cb8028 c0abed67 3aab6ec8", + "4193ecac be49ea80 396bd992 3ff28820 4083ebb4 3b25e98f -> 41a3152e 407b38c0 3b362c2c", + "41287054 4043da44 3a9103bf c146770c bf3b42c0 3d04b260 -> bff035c0 40150994 3d093ebb", + "41137c6c 4014d6b4 39abdc8e 411d21e8 c0899b52 3a642e9d -> 41984f2a bffcbfe0 3a9faee8", + "c00e8148 c03cfd96 3bc4cffc 408460c0 408d20ce 3e89076b -> 3ff48070 3fba880c 3e8c1b20", + "bf9c84f0 bfe09024 3b8e7751 4166f998 c08998bb 3b683910 -> 415368fa c0c1bcc4 3c019706", + "414c9c90 c093c0c8 3f917426 40f7d8d4 40430a48 4095f582 -> 41a4447d bfc8ee90 40ba52c4", + "c15ce12a 3fb92730 3ed04fa5 bfc622b0 405581f4 3ffe4ed9 -> c175a580 40990ac6 401931bb", + "409a176c c08193c7 398f927d c134c749 401d4890 3e37c6e7 -> c0cf7726 bfcbbdfc 3e3810c0", + "c0d50cdc 405c80bc 40ea3685 417cd170 40443d98 3a9c0e1a -> 41124b02 40d05f2a 40ea4074", + "415e58f0 bfb4ae0e 3d4b892d c0935466 c0870f2f 3db1be07 -> 4114aebd c0b43ab2 3e0bc513", + "4190f802 4080bb60 3ef51586 417f4b04 bfa62738 3c0fa76d -> 42084ec2 402e6324 3ef9976a", + "40f479ec c09437ff 408b615c c153de0c 3f680c50 3c5b4fb0 -> c0b3422c c06e6cea 408bcf1f", + "bfadc600 409a9202 3beaed49 be202280 409a9254 3fd942cb -> bfc1ca50 411a922b 3fda2e1f", + "407ae6c0 c01ec955 3da07483 40e25f8c 3e8c0040 3aafbedc -> 412fe976 c00d494d 3da33a22", + "c0d0a62e 4087e590 3abcaf85 4075a160 405d9378 3c8af860 -> c02baafc 40f6af4c 3c96d82a", + "c086846c 402cc908 3d8b999e c16a1d46 3da97480 40912003 -> c196afbe 403214ac 40934e9d", + "c170e1ef 400dc0b0 3ed79b31 40fe9e48 3e87de00 3eb3756a -> c0e32596 401ebc70 3f4588f4", + "410eb658 c056a862 3af3c399 3ff38710 bf35d748 3fa7f302 -> 412d273a c0820f1a 3fa83075", + "415c3250 bfbe4d0a 3bf80550 40f76d28 40379c1c 3facc0f7 -> 41abf472 3fb0eb2e 3fadb9be", + "c19d27f2 c00f3fc2 3bf590ac 3ed7bd00 3f1e7870 3c8a58a9 -> c199c8fe bfcf434c 3cc7e690", + "c15b8ff8 c08195b1 3a6b441d bf394dc0 402f642a 3fa2625f -> c16724d4 bfa78e70 3fa28050", + "416583d0 bfd736f4 3cc1b901 c01a2b08 bfa33d36 3b051cb7 -> 413ef90e c03d3a15 3cd27a6e", + "c17282e4 407f6a8c 3ed8cdee 416cb6d0 40913cb6 3bd56500 -> beb98280 410878fe 3edc24ac", + "4196e814 40393c0a 3cf69113 c06b62f0 40213608 3cf43d53 -> 4172f76c 40ad3909 3d757bdc", + "c1899183 40010736 4103b0b0 411a0700 c06fcd62 3abdad44 -> c0f2380c bfdd8c58 4103b6af", + "401051f8 3f90c050 3a249d89 c10d3537 3ed6f8e0 3c6b6e69 -> c0d24172 3fc67e88 3c75d8cd", + "3f3bc040 c025b4c9 3c12f286 c02af188 3ff1da20 39a05bfa -> bff802f0 bf331ee4 3c17fffc", + "c0c17d98 bf750bb8 40fadd5a c176dfa4 3f38e5e0 402fdecc -> c1abcf38 be709760 41296680", + "c17f8ff4 c06706b6 3b85f69d c19c18d9 3ec76e10 3f3a7832 -> c20df06a c04e18f4 3f3b8696", + "418ff028 401f48c2 3baa4e07 40fa8518 bf61c760 397170fb -> 41ce916e 3fcdadd4 3bb2b506", + "41580d20 c074832d 3a8d5887 c124b308 407560c0 3f206182 -> 404d6860 3c5d9300 3f20a86c", + "c17ebea1 405ab254 3bc7f729 c103ec38 bfbe0a62 3ebb93c1 -> c1c1556c 3ff75a46 3ebeb6ed", + "41971a7c 3ec46450 39a6b792 c081c96e c08d0cf8 3bb34612 -> 416d5041 c080c6b3 3bbe4871", + "3f241e80 4091de50 39e886fc c1818253 3fb32de0 4108a229 -> c178c2be 40bea9c8 4108a418", + "4183224c 3ee23190 397631ca c0907ef8 bfda2b14 3f6c76e5 -> 413e051c bfa19eb0 3f6c8729", + "c183bbba 404e7978 3fb34f54 c0e8d304 3f74d9f0 3d92a978 -> c1bdf07b 4085d7fa 3fbc7ad7", + "4179f3c0 c07c0bc3 3d24b7b1 c1338928 c09c1081 3ee60e13 -> 408cd530 c10d0b31 3efaa6c0", + "3f9d3120 40445c44 3f5da9cb 408c3138 c0933354 38d32724 -> 40b37d80 bfc414c8 3f5db0e4", + "40dc2634 3f031430 3e8fbedc 419e92d0 c04cff5e 3c9c08f7 -> 41d59c5d c02c3a52 3e998321", + "418dc79c 401b11c6 3cc90297 c133076b bfd5ef3c 3ba2c4f9 -> 40d10f9a 3f4068a0 3cf1c276", + "40ed1db4 400980dc 3d14fc8b 4023d450 c03c74c5 3d34b070 -> 411f83ee bf4bcfa4 3da4dbea", + "41757128 3fc53cf4 40a577c0 3f96f5f0 3da4f100 40ba5b0a -> 418427f3 3fcf8c04 412fe982", + "41511ca4 c00234ee 40a70d3d c08172c8 3f2554d8 3fbb86e0 -> 41106340 bfb1bf70 40d5ef17", + "c140c528 bfffa80c 3d07e9a0 c188776a 4009ad6c 3f47878a -> c1e8d9fe 3e1d9660 3f500805", + "c17dcc58 c0824e89 3e27d9f8 c0a228fa bf9ff16e 3fec9147 -> c1a7706a c0aa4ae4 4000c6b4", + "c1823ad3 3fd9f658 3f3c489d c14bbe3b 3eaf4000 3b493f05 -> c1e819f0 4002e32c 3f3d13d9", + "c13440b9 40955888 3dcfd49d c11a82dc 4010a772 3c0b4ccb -> c1a761ca 40ddac41 3de14c31", + "c18d7a6a c064cba4 392c52c8 411770de c053f705 4026ad73 -> c10383f6 c0dc6154 4026b06b", + "3efe7d80 3ee244c0 3a4ad175 40b95668 c0992122 39189b8c -> 40c93e40 c08afcd6 3a73a0dd", + "41566db4 3f8efb58 411f7ff0 4115a272 bec9f4b0 39bfffda -> 41b60813 3f38fc58 411f8191", + "41770880 3dd0b4c0 3b22d2fb c1836754 bf22ae78 3fc5b9cb -> bf7c6280 bf0897e0 3fc60b4d", + "c14cfa08 3fb9b5bc 3f25e773 40bafef8 c04c78aa 3dc7dad5 -> c0def518 bfdf3b98 3f3ee365", + "c12b965c 408cdeda 3d98406c c1744e06 c09afd00 3d956aaa -> c1cff231 bee1e260 3e16dc30", + "411687e8 bfaa7a6e 408560a5 41264346 4066f798 3fb695f1 -> 419e6597 4011ba61 40b30658", + "40e0d048 bf048368 3e339f89 411a0f74 bfc457de 4083267c -> 41853bcc c0034cc9 4088c3a6", + "c101754f be1e32a0 3d0b07e1 beeae880 bfa316bc 3a9d4709 -> c108cc93 bfb6dd10 3d0ffc1d", + "c17b9c51 4095ecea 3ead98db c13c8ed8 3f11ab98 3d2a32b4 -> c1dc1594 40a8225d 3ec2e357", + "c172ad82 406a746c 3bd7b2eb 404c61a0 bf5ef9c0 39859ac1 -> c13f951a 4032b5fc 3be082c6", + "bfd54100 400abbbc 3dc3addd c03a9678 409f8d44 399a44d2 -> c0929b7c 40e4eb22 3dc44e0c", + "c14731a6 c06f3ac5 3e34a4be c0049e00 bf5cdb30 410bb34e -> c1685926 c09338c8 410e85fd", + "c1471115 bf1c25f0 3b4ba548 415978c0 bfc21666 3e9a8e09 -> 3f933d58 c00814af 3e9c25c7", + "c182a5bf 401bc0e8 3d8d171e c0b53a8c c09c58db 39346f97 -> c1aff462 c01cf0ce 3d8d7d98", + "416a9914 3e98b610 3f8f78d6 c07f50a8 3fb1e190 41164530 -> 412ac4ea 3fd80f14 41283462", + "bfa814a0 c0815822 391d8053 402cf5a0 c00b486d 3e105efd -> 3fb1d6a0 c0c6fc58 3e10884d", + "c0de1ab4 406d304c 3cdc5e1c c0603bf0 c000259f 3adf937c -> c1271c56 3fda155a 3cea6faf", + "402a4f08 3fcb1660 3d73642c 410b6abe c09abee2 39cbbb61 -> 4135fe80 c04ff294 3d750a52", + "c12fd8b2 c00c2643 3d1f4a97 40d6ad88 bdf38300 3e640588 -> c08903dc c013c25b 3e85ecf2", + "3f0b6fa0 c080056c 3eac34a1 3ffa5c00 3f1b0540 3cb4d2d1 -> 402009e8 c0594988 3eb78296", + "c10a5940 4038a284 3cdfa554 40c615c0 4099ed8a 3b7ec187 -> c01d3980 40f63ecc 3cff91e3", + "4190ebd4 3f9b630c 3a1f1d70 40d7dcf0 3e0861a0 3cc889fe -> 41c6e310 3fac6f40 3ccdb761", + "c13997ce 3fe586fc 3c8751fa c0e4ccac 403acef8 3bbe33e5 -> c195ff12 4096c93b 3cb70deb", + "be9c8e80 c060d1a9 3d172502 40f5c700 c04ffb78 3bc9efdb -> 40ebfe18 c0d86690 3d30712b", + "bf6fc740 403fa6a8 3ddfc1ca c0abc622 c08ebcc9 3a56270c -> c0c9bf0a bfbba5d4 3de17209", + "4187d572 4031a724 3b68abcb c19a80bc c06db5bc 3d137c88 -> c0155a50 bf703a60 3d220a95", + "4125daf4 4083c470 3e7a509b c12868d8 40299318 3c1ab7b0 -> be237900 40d88dfc 3e81fef1", + "41939ab8 3f10e350 3f307e78 c1932270 bed88b70 3f8da25b -> 3d709000 3e127660 3fe5e1a7", + "c12f65e1 c044e2b1 3b635b53 c0bcab58 c08de806 3c3bc166 -> c186ddc6 c0f0595e 3c74f9c4", + "4191b7a0 3f6b0cf8 3def23b4 c16d4298 c04df8ad 3a5406c2 -> 4058b2a0 c013356f 3df0cea9", + "41068da4 3f5eeae0 3d8ccb22 4197be44 401c4394 3ef45081 -> 41db0516 4053fe4c 3f0bc399", + "c154aa82 c0449657 3d684e2d 418a5754 3f1efad0 4020f96c -> 4080084c c01cd7a3 40249ac9", + "40e02608 c01c7b9c 3c07e673 c1743c34 4013ae14 3dfd363a -> c1042930 be0cd880 3e071ba6", + "40670da0 bf22de50 3ba7918e 413f4b66 c0667d31 40020a1a -> 41790ece c0879a62 40025e3a", + "416f9c3c 3f380248 3ece4938 417edc08 c08c385c 3d45c609 -> 41f73c22 c06a7026 3ee7065a", + "417e99e0 3fa63b18 3eee6394 be211500 3e884c20 3a4b3707 -> 417c158c 3fc84e20 3eeecb69", + "4151a5a0 409bdc74 3f93b35d c195c5a9 406e65a0 3b0a4ef5 -> c0b3cb64 410987a2 3f93f8ff", + "c11ad8cd c004148b 3e1115f3 c0387f98 3fe32ea0 3f818d6e -> c148f8b3 be93e9d8 3f93b09c", + "c1970424 4057ab74 40014654 419e6924 3ec7cff0 3f02f9cc -> 3f6ca000 4070a572 402204e4", + "41597c58 4083a120 3c8d14f2 4103c1f8 c0800fda 3a3e8742 -> 41ae9f28 3de45180 3c933516", + "c19b4c1d c013868a 39ecf54b c19b86e7 c094f59c 4092a983 -> c21b6982 c0deb8e1 4092ad9c", + "c1623b78 c04d68a8 3ee1c245 c13c3d22 c005e1d5 3f05dcd4 -> c1cf3c4d c0a9a53e 3f76bff9", + "4143d670 3f153ae0 3d872138 c187666a 3ed12190 3fd9f7a9 -> c095ecc8 3f7dcba8 3fe269f8", + "c12bf57d bf090f78 403dbb8b 418665d0 406ce450 3aae7116 -> 40c1ac46 404aa072 403dd18a", + "40e0e3b4 4080e3cc 3995342e 419d6154 3fc7fea0 3df43005 -> 41d59a41 40b2e374 3df4d56d", + "4113a078 c0721c57 402ec640 40b36488 c09a798c 3dd401bf -> 416d52bc c109c3dc 403566b7", + "c16a5576 c023caff 3b017295 40fd7ae8 c00be46d 3cfe6f57 -> c0d73004 c097d7b6 3d075a56", + "c188e7a8 404e34d8 3d5c6950 c174dffe c0470426 41002b59 -> c201abd4 3de61640 410107eb", + "c14e23e4 4028492e 3be94ed1 40814118 be824450 3e3d3f37 -> c10d8358 401800a4 3e448c88", + "c10e2641 c081b1ec 3c229d46 4181fb44 bfceff50 39eee0ad -> 40eba08e c0b571c0 3c2a4878", + "415a7d9c c05cfe22 3d28699a c1774c62 be7dd9c0 3a37af8d -> bfe67630 c06cdbbe 3d2b4de3", + "41641c90 c055dbd5 3d4fba2a 41937b4e 408dc450 3b47aefe -> 4202c4cb 3f8b5996 3d5c56f0", + "405f02b0 3eaa6870 3a2f49c0 c0852d70 405e9aec 39361bb4 -> bf2d60c0 4073e7fa 3a5deffb", + "40e4ad1c 3f154760 3ebdaa52 c17987b8 4048e690 403b5c0f -> c107312a 406e3868 40531197", + "c12356c8 c06d0014 3e303512 c12a4b90 bfb04ef6 408335ad -> c1a6d12c c0a293c8 4088b792", + "c13da8f9 c02e4c01 40585641 c16e7682 40643fdc 39e182b2 -> c1d60fbe 3f57cf6c 40585dc9", + "419833fa 4092be8a 3bb1fcad c09d5a76 c018fc8e 3908f2cf -> 4161bab9 400c8086 3bb6c6bc", + "c01a5a30 c0351a82 3fa100f7 c1886894 c09b9010 40a2c01f -> c19bb3da c0f61d51 40cb00a0", + "beef8c80 40747078 3ae0dd8a c0be34a4 c02e6003 3f4b47e8 -> c0cd2d6c 3f8c20ea 3f4bb8dc", + "c051fa40 40140552 3ba5bb98 40a5c3c4 406c0a64 3baf02b6 -> 3ff31a90 40c007db 3c2a7ecb", + "3f60e500 3f9cd03c 3f856575 4097a224 40249f96 3ec13a8f -> 40b3bec4 407307b4 3fb5b470", + "c08b8aec bece4690 3e77774f c193bc92 bf4bfab0 4032d09d -> c1b69f4d bf998efc 4042487e", + "41009d00 bffdf870 3b490617 40f3e820 3fda1da8 3dc593d4 -> 417a9110 be8f6b20 3dcbe40a", + "c1888534 c05285a2 39c6eadf 4103c1ce 401d30d4 3cce8a17 -> c10d489a bf555338 3cd1b923", + "40e0df08 40617158 38d202a0 c16f79d7 4006080c 39de006a -> c0fe14a6 40b3bcb2 3a0ca434", + "4136fe64 bfc4f3da 39935c5c c19f8801 40634474 3e1f6b41 -> c108119e 4000ca87 3e1fb79a", + "c13373f6 404d9860 3ca3143a c17d1417 3fe9e89c 3d719ec1 -> c1d84406 40a14657 3da1a482", + "c116a2cf bf000d00 3ca6855f c0b63940 3fc0915c 40886eaf -> c171bf6f 3f808adc 4089155d", + "bf31fe60 40118d60 395358fa 411c1a42 3f0fb120 3e9dc69c -> 4110fa5c 403579a8 3e9de28e", + "c12cfd94 404a4c80 401b1fcb c0e238d0 408db0c8 40564da7 -> c18f0cfe 40f2d708 40b8b6f7", + "4109c0a0 c0164b9f 3f106fd8 40034ab0 c01e7789 39765913 -> 412a934c c09a6194 3f10803f", + "413fab2e 3fff5a04 3c8be434 40cb6628 be94bfe0 3fe16e1b -> 4192af21 3fda2a0c 3fe39e5b", + "c16844d6 409604d8 3ce27463 401ddd68 bf166d90 3b451339 -> c140cd7c 40833726 3cfb3727", + "c19a038a bfe8e7b6 3a85d543 c188441a 3fb74c20 41020d0d -> c21123d2 bec66e58 41021169", + "c18b5dfb c0928def 3f6429cc c08a3ab6 402ded90 39244fa3 -> c1adeca8 bfee5c9c 3f643599", + "41276408 407da870 401def58 400c5ea8 bf8da970 3c4896f0 -> 414a7bb2 4036d3b8 401eb837", + "41427990 40088a84 3a7ef47b c090183e 3f14e0c8 40b5eda4 -> 40f4dae2 402dc2b6 40b5f5bc", + "bf5231c0 404f2d04 3afb217f c1387ff4 3f88be2c 3db0fbc7 -> c145a310 4089c60d 3db4f0ac", + "c139f609 3fd71628 3bf54f3d 40500ce0 bffa2aa8 3e082503 -> c105f2d1 be8c5200 3e0fd1af", + "41020594 3fb491a8 3e03dc18 412bb474 be0715c0 3a93b4e2 -> 4196dd04 3fa3aef0 3e050893", + "c10a1e89 bf6cdde0 408b40d1 c06ce288 407e4f0c 3d98e27a -> c145572b 40431794 408da483", + "41969fd0 3f528e08 3da1b646 c1895cee 4024fdc8 3edf38fc -> 3fd42e20 4059a14a 3f03d3a0", + "c180a01a 3fa80a18 3f2150cf c11f7300 3f726ba8 3fa0325b -> c1d0599a 40109ff6 3ff0dbb3", + "4110554e 4061c3fc 3c75abf7 c13e48cf c04b2752 39ad0fca -> c037ce04 3eb4e550 3c7b216b", + "40d2201c c04c9f2d 3dba507b c11d9e95 40611214 3f0d197f -> c0523a1c 3ea39738 3f2463d2", + "413d319a c0949d72 3ab1e889 419be7fa c07ded97 3a14935e -> 41fa80c7 c109ca1f 3b0097f0", + "c19891e4 c088f53d 4089106d 40e8cb90 c025bf92 390b28c5 -> c13cbe00 c0dbd506 408911b1", + "c19d7de7 c0673c2c 4063b3ac 40bc1b9c be2bc960 3e6e0ed1 -> c15cee00 c071f8c2 407294ef", + "41698178 bef43b60 3932d79d 41419548 c092506e 3e178c01 -> 41d58b60 c0a19424 3e17c0b0", + "41301f48 c085eadd 3aae96d5 414f5cf4 401bb750 3ec51711 -> 41bfbe1e bfe03cd4 3ec5c8eb", + "419a80e6 400ade32 3ee638a3 4153fbf4 c00feb78 3ed11c1e -> 42023f70 bda1a8c0 3f5bac78", + "3d5e3a00 c0791028 3d32e2dc 408bc890 c02e4f38 3d28312a -> 408d8504 c0d3afb0 3dad8f93", + "417b9b10 c092083d 3dea70bd c064da30 c0434d00 392dc64b -> 41426484 c0f3aebd 3dead191", + "c1442aca c09a7edf 3e9c8296 4185ec12 bf8e4018 3c22aa07 -> 408f5ab4 c0be0ee5 3ea1993e", + "41013486 409dce28 411349e6 406cc4d8 c0384f55 3906a997 -> 413c65bc 40034cfb 41134a84", + "41883fe8 c04080bc 3b9031ed c13a103e 3ffec7fc 3d2ad296 -> 40acdf24 bf82397c 3d3cdf4b", + "c103d5d7 c04ef7c4 40050df5 c147ab64 c062d06e 3bee701b -> c1a5c09e c0d8e419 400585a3", + "c1630d02 c01c62d0 3aae1930 3f7288a0 4082fd1c 411e628e -> c153e478 3fd32ed0 411e6818", + "c198dc74 bfad5458 402d954c c14c2500 3fa70f7c 3edaac56 -> c1feeef4 bd489b80 4048eb63", + "c1999798 c08b6b2d 3b8f39cf c0d81026 c06d3892 3b286bff -> c1cf9ba2 c10103bb 3be47ffa", + "4112d2b6 4082d682 4047a976 3e815000 3feac8f0 3911751c -> 4116dd36 40bd88be 4047ac06", + "c143d8d4 3feb5698 3bad2a08 c183ef56 c07560b4 39015841 -> c1e5dbc0 bfff6ad0 3bb22aa8", + "c14c9a72 c09e3fb2 4011f073 c0e06c54 402ee528 39f3091f -> c19e684e c00d9a3c 4011f86c", + "c1502e4c c04df403 3989966e 419dfb2c 3f33a880 3fdcfb72 -> 40d79018 c02109e3 3fdd0463", + "c1698f24 401ca4d0 3d8ed4a8 40835250 c046e10e 3e18bda9 -> c127e5fc bf28f0f8 3e602ad5", + "c1429c03 4094191e 3934b29c 4050dc60 bed3f0d0 3ac811da -> c10e64eb 4086da11 3ae04be0", + "bf875cd0 3fb1d100 3d94be26 c14269b8 bfd9fd44 3aafc265 -> c1535552 bea0b110 3d9783fc", + "40c5c82c 408b12e2 3ae3bf97 416bcc84 c09fc547 3e089ef9 -> 41a7584d bf259328 3e0a6be5", + "4162e25c 3ffa0df0 3b3aefdc c1434486 c05bd9c7 40b655c5 -> 3ffceeb0 bfbda59e 40b66d35", + "c14129e4 4016dc5c 3ba1c513 c18f8dd5 bfa4ccb8 409df144 -> c1f022c7 3f88ec00 409e19fd", + "bfce3010 3f69f810 3cf37527 41065132 407abd58 3a19fd82 -> 40d91660 409a9dae 3cf85c5e", + "4196b4fc 3f7cb9e0 3d5e2cdb 40aca044 4060b570 39f63b31 -> 41c1dd0d 408ff1f4 3d60361a", + "401c2840 40991db6 3fdfba8d 4165532c bfcddb78 3e1a3ab9 -> 41862e9e 404b4db0 3ff30293", + "407e9138 c0155ba6 3f066940 418df834 401ec6ca 3cf1797e -> 41adca5b 3e16b240 3f0df673", + "c0c81450 c09fabbe 3f89aa7e c1813d52 bf953e0c 3ed2b735 -> c1b34266 c0c4fb41 3fbe593b", + "417ebfa8 bf473fc0 3b0ed4d9 40aaf218 40175c4a 3efba3aa -> 41aa1c5a 3fcb18b4 3efcc43f", + "4113c290 408e4972 392bae87 c181db44 407e628c 3c27a5e6 -> c0dfe7f0 4106bd5c 3c2a9257", + "c186fbca c0336dc5 3fd5089a c15bb82b 3fab62d4 3a4b7a6a -> c1f4d7e0 bfbb78b6 3fd52317", + "c17e4f2e bfccfa24 3c1d73e4 4101fe88 bef5ffc0 39aedb23 -> c0f8a14c c0053d0a 3c23122f", + "c1436fb3 3e249980 3fd2bc6f c19fc5cd bfab494c 4035f1f8 -> c200bed3 bf96b61c 408fa864", + "c0c33dea 406fe498 3a9c592e 414f592c 4017907a 3c649edb -> 40db746e 40c3ba89 3c785df6", + "416aadd0 4088c880 3ad48ab5 c17978ba c06e6f60 3c19d5f0 -> bf6caea0 3f0c8680 3c346d37", + "406d6fc0 3d56b580 3be5b98d c0ca2f3a 4069e7f8 3d33b783 -> c026eeb4 406d42ce 3d507513", + "40bf8cdc c04851fc 3be072ad 40a44270 409dea46 392d1b53 -> 4131e7a6 3fe70520 3be642fb", + "c0de4924 c0433ee2 40e31aac c157a670 bf1c5d00 3aa5d283 -> c1a36581 c06a5622 40e32547", + "417ccc20 40134e2a 3d9fd3aa c15eac68 401de870 39081670 -> 3ff0fdc0 40989b4d 3da01b12", + "c1488683 c01d50c1 3cd49268 c058cf60 c00665fb 3eae628a -> c17eba5b c091db5e 3ebbae4b", + "418b85d4 409d94c6 3a9736c8 c19f5aa3 c0795d65 40ad436b -> c01ea678 3f83984e 40ad4cf0", + "4116b37e 4061a7e8 3e37596b c0ecfaac bfbea410 3a4e476b -> 4000d8a0 400255e0 3e3828c1", + "3f71dbc0 400c3fd4 40234672 c1521090 bcc12100 3d51cdc4 -> c142f2d4 400abd92 40268ded", + "bfd35540 40025440 3ce2ffdb c19919c8 c03644db 3c1eca44 -> c1a64f1c bf4fc26c 3d194821", + "414a47d8 bf17dea0 3f1ec780 c0c4784c c05c911a 3de935f5 -> 40d01764 c0814461 3f3beef3", + "c1916699 c02a05bc 40438224 40cdad60 3ff62b18 38d44017 -> c13bf682 bf3bc0c0 4043840b", + "4153ebc0 bfe0de94 398acbb2 c1987a94 bf3967b8 3daefbac -> c0ba12d0 c01ec938 3daf8aa9", + "4032c440 3f4d25d8 3c00ce23 c080eb9c 3fa46bb8 39101093 -> bf9e25f0 40057f52 3c031bb6", + "c165921b c09b3af9 3f1b3d2f 418d1930 40921b68 3daf0b37 -> 40528114 be91f910 3f311eda", + "c13487da 40849f9e 3f44fad7 4149afd8 c048fd20 3e646eb4 -> 3fa93ff0 3f808438 3f7e16b9", + "c1478d36 bf8e20b8 3e9cd065 c1936b8d c013b024 39c8fdfb -> c1f73228 c05ac080 3e9d06f8", + "c10b66a8 4068470c 390ecaa8 4173650c bfcbf8a0 3a40d185 -> 40cffcc8 40024abc 3a66a682", + "bfda7920 bf25d600 3b1d52f8 4180b3b6 bef72500 3e19560b -> 41661848 bf90b440 3e1bcf41", + "c19a2ede bf550960 3f935710 4113c9cc c03caa0c 3a041469 -> c12093f0 c071ec64 3f93680b", + "41630738 c07cff94 3b206b65 c0f26390 bf1285d8 3f466c67 -> 40d3aae0 c090d085 3f470d91", + "c130c367 c09ae20c 3a00ef29 c059ef00 40569810 39238e68 -> c1673f27 bfbe5810 3a2dcef6", + "417907d0 3e9c4150 3b6af2b6 c1181382 c0750f27 3f2c1fa5 -> 40c1e89c c06186fd 3f2d0b3c", + "c19fc0d7 c018f729 3e70c30d 405511e8 be27e7a0 3d25a562 -> c1851e9a c02375a3 3e8d18a2", + "c0f2d0ca bfebde8c 3ca8a632 c1650349 403e0d94 3f338403 -> c1af35d7 3f903c9c 3f38cab1", + "4164c7c8 bedab820 3a596aa3 401150b0 c049de51 3a2e4aac -> 41848dfa c0653555 3ac65f87", + "4158f040 4096e590 3c4eaa0a c120ac0a 3fc850ec 3b89a304 -> 406110d8 40c8f9cb 3c89d167", + "c194d066 c09269b2 3dcc9aea c1280842 c09bd033 40812ecd -> c1e8d487 c1171cf2 4084618e", + "c0e10fd4 4023b5c6 3b4e7fb3 c1910e2b 40134b7c 40a85d93 -> c1c95220 409b80a1 40a877aa", + "bfad0c20 c0123d43 3e028996 41241724 c09fe4b1 39e25679 -> 410e75a0 c0e90352 3e02fed5", + "c0ec9b16 c085e00f 3aa32ebc c0a76ecc 3f12f1d8 3bfe6c93 -> c14a04f1 c06703a8 3c13dd1c", + "41631cc0 bfd698b6 3bafd95b c16255d6 bf440f08 3a0c0a5b -> 3d46ea00 c01c501d 3bc16ea0", + "c0c5f360 40212a5c 3dd7ad27 c0c082d8 3ef72a40 3c838e00 -> c1433b1c 40400fa4 3df89851", + "4186dcf0 c088b012 3b55a5c4 3fd48540 404b84a0 39286c92 -> 41942544 bf8bb708 3b61665c", + "bf9c3ca0 4046e420 3edd46e3 c126b36d c0830527 406b469a -> c13a3b01 bf7c98b8 408377dc", + "3fde8450 c0859371 40e5be8d c1046550 408ad0c0 3d995366 -> c0d1298c 3e27a9e0 40e823f7", + "c17c668c 3fd42d30 3cda1daf c131fca0 bf964a00 3e81b45f -> c1d73196 3ef78cc0 3e8f59af", + "4040b2e8 c04e3214 3b967089 c15d58eb 4000dd5c 40f95625 -> c12d2c31 bf9aa970 40f97be9", + "c0cd2686 c0756019 3ed38ba1 c14cd605 40565d44 408adb00 -> c199b4a4 bef816a8 409813eb", + "414f9cb0 402f21cc 3b085cc0 c14e2976 407fd030 3f0a7c53 -> 3db99d00 40d778fe 3f0b0526", + "40c12320 3f93a058 3ad40bff c02be1d8 3f83b340 3ba5d2e5 -> 40566468 400ba9cc 3bdb0234", + "c1506eca c08f4a30 3f9d840b c196841a c023dae1 40257a1b -> c1febb7f c0e137a0 40743ccb", + "4191f262 3fff6d00 3e90bd93 409c0a54 409531f8 3e22a01a -> 41b8f4f7 40d50d38 3ee21167", + "41059e42 bfec5d54 39b8c74a 411f3c64 407fdfd8 40ed1cec -> 41926d53 4009b12e 40ed2007", + "c1467e86 bfaeb2e2 3ae2cfae c192011f bea01000 3a25b22f -> c1f54062 bfd6b6e2 3b1cd9c4", + "c0f1a556 4088e176 3f2d2fb3 411897d0 3f35c740 3f2f97e2 -> 3ffe2928 409f9a5e 3fae640d", + "c01c47f8 c064dad2 3d9973bc 419d4b34 40998af0 3e3448d4 -> 4189c235 3f9c761c 3e8083af", + "c15967be bff3161e 4013ac5d 415a0ec8 c030bac9 39f9312b -> 3d270a00 c09522ec 4013b443", + "c1282e1b c03e6878 3f8b65b8 409e0918 be9e3dc0 3dab1186 -> c0b2531e c0523030 3f961720", + "40afa324 4080aa96 3ec19aec c11497d8 c02479f0 3ace3e64 -> c0731918 3fb9b678 3ec269de" + ] + }, + { + "glsl": "vec3 cultmath_af_sub(vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "c1822c5d c06c6c8c 3da954e2 40ca1250 400bca78 3b79ce30 -> c1b4b0f1 c0bc1b82 3db1319b", + "c17577bb c034b30b 39e64c6a 41875d04 c04ae8d8 3fa86375 -> c2010c71 3eb1ae68 3fa872e9", + "c18b1ecb 400b07d6 3b9bf8c7 bfcb57b0 3f629090 3db5ee20 -> c17cd2a0 3fa4c764 3dbfb643", + "c17f24fc bfc11a9e 3a02dd69 c1782aea 40442bdc 3b0c849d -> bedf4240 c0925c96 3b2d8c2a", + "c0bc7c56 3ff05194 3ca0f276 c14bb870 c07f39c4 3e626cc0 -> 40daf48a 40bbb147 3e768e4c", + "c18f72c0 c0527a26 40490343 c0d27d8a 407eef24 3fe19eb9 -> c135a6bb c0e8b4a5 409ce97f", + "c18afdf3 3cc78d00 3dba0fda 40106250 400f8684 38e13d31 -> c19d0a3d c00df76a 3dba5321", + "c19dcef6 bfedd046 39034d06 419abf8e 3f150888 3f131283 -> c21c4742 c01c2a45 3f131d59", + "c120bc9e c04ec377 3b7250f4 c16f7a8f c05572db 403c9754 -> 409d7be2 3dd5ec80 403cd408", + "c1801724 4099e918 3b88b5a5 c0e9f1ae bff97158 39154507 -> c10b3571 40d8456e 3b8ddb82", + "4164d790 408b205a 39c85b9f bfcebfa0 406d9f88 38f04c84 -> 417eaf84 3f2284b0 3a065ac7", + "4187cfd2 40130130 3f9f1db2 bf0c6f40 bf86de20 398d3893 -> 418c334c 40567040 3f9f2737", + "419f6034 3ee61380 3e085ccb c16a96e9 c07c8cfe 3ced1a79 -> 420a55d4 408ca7b7 3e2609e3", + "c12219e9 bfa77a90 39e8ef41 41045a32 408a8218 4085d368 -> c1933a0e c0b460bc 4085d744", + "c0b928ca 40884a88 38dd3af9 c19e3a20 c029107d 40772c4b -> 415fdfdb 40dcd2c6 40772e68", + "3f80d690 401efcf0 3a7e28ac 401c2338 3ffe8200 3f62d21b -> bfb76fe0 3efddf80 3f6311d2", + "41797188 3ef1d050 3c8646c0 c19d8877 c08d1043 3fb1c0cb -> 420d209e 409c2d48 3fb3db33", + "418a8be0 40280a58 3f50cc52 c12e63ff c06e3af8 3e033c11 -> 41e1bde0 40cb22a8 3f719d8e", + "c113d8cc 40953450 4018c94a 41545398 c0896f77 409919de -> c1b41632 410f51e4 40e57ed0", + "41805d82 c05f82a2 38d66e9a c14502f9 c07d4390 40aa9ef9 -> 41e2defe 3eee0770 40aaa013", + "c19db3b3 408609f2 3cf15e1c 41807dde 40938f1c 3e2e5537 -> c20f18c8 bed852a0 3e4c8a13", + "4178cd44 bf212190 3fd9a1c5 4156a65c c0240871 3d7d0609 -> 40089ba0 3ff7801a 3fe18a24", + "c190322a c02708fc 3b687a9a c0feb49a 402f4274 3a3a2c0d -> c1210a07 c0ab25b8 3b8bfe26", + "c16521e6 c06e3066 3f7a9704 c095a400 4017648c 3b11ff6e -> c11a4fe6 c0c2ca79 3f7b2a0e", + "c192a11c 3ff78e78 3e7b15f2 c118bcd6 3fcc9b8c 3d61455d -> c10c8562 3eabcbb0 3e99b4d2", + "41380948 3ffce900 3c86537d bdc91400 c09fd4c3 3a03d879 -> 41399b70 40df0f03 3c8a976e", + "c0d3a16c c095f1ff 3f822432 c168e869 bfce6286 3e917afd -> 40fe2f66 c044b2bb 3fa68354", + "41304944 bf29fca0 3ed1f0b1 c0e9b394 4034b7ea 3fb7f7e6 -> 41929187 c05f3712 3fec74cf", + "40a142bc 3f802aa4 3bfb393b 415442b0 c08ff08a 40f3fe48 -> c103a152 40affb33 40f43d41", + "c161c58b 3f9ed530 3a55dd9a c1307537 40663df4 3b0ee9c0 -> c0454150 c016d35c 3b44b837", + "4195dc12 3fa31434 3f44ea9f c1014234 c090b175 3d5c40cf -> 41d67d2c 40b97682 3f52b0c3", + "c17644a2 3f04b750 3acc2198 c153685a 40953b36 3f03eea3 -> c00b7120 c084a44c 3f045521", + "c0a7e48e c09e1cbe 3f61b979 c17b3d64 3f89c974 3b56687f -> 41274b1d c0c08f1b 3f6290f7", + "3ff0ae70 400f9792 4065cabc 415db1d0 3fad439c 39508b4c -> c13f9c02 3f63d710 4065ce40", + "c1527746 4091e34c 3e30b86a bfab79e0 bfbf993a 3bf9d506 -> c13d080a 40c1c99a 3e388b95", + "41928e20 c0795b7f 3a3d2e79 3faca900 c054a08c 3eb88613 -> 4187c390 bf12ebcc 3eb8e6e7", + "418451cc be674880 3c0b12e4 c14f11fc c03e9528 3aba4722 -> 41ebdaca 403020a0 3c22dcc2", + "406e2610 bedfb250 3e1714eb 40ac28f0 bebe5840 392e99ff -> bfd457a0 bd856840 3e174109", + "c1481407 c0934413 38fd6b6b 4172cba4 3fe2e9f0 39f92f7d -> c1dd6fd6 c0cbfe8f 3a24c8b2", + "c0b770ac c071f9aa 4111fe63 410b3160 c06ecaee 39971781 -> c166e9b6 bd4baf00 4111ffa9", + "417f2d7c 3fbe5538 3a85662c 4167b4a8 c0388499 3ff3cf9e -> 3fbbc6a0 408bd79a 3ff3f136", + "403521a0 40567898 3fc68b14 c18721e4 c043e0fa 39ead170 -> 419dc618 40cd2cc9 3fc69a9e", + "41857ffa bfa5b06a 3d2725c9 40e70a7c c01dd7b4 3a4df89f -> 41177ab6 3f95fefe 3d2a6859", + "c03d99c8 3ebba210 3cef34a2 4083fa54 c00d5b36 3b69ed03 -> c0e2c738 4024cf78 3d0642d3", + "c0b333f8 c086d7b2 3c6fd8a5 c194642b c04eb288 3931c797 -> 414f2e5a bf7bf370 3c72d78e", + "410c5c58 c0428dca 3bb963df c103f2bf c00e3f76 3d6fda69 -> 4188278c bf513950 3d838c65", + "c196b82e 4013d4da 3adb1482 4131ccfe c08b99f8 3e0ce244 -> c1ef9ead 40d58465 3e0ea19e", + "c13c0ea6 c079d040 3fd90303 41772c98 4093e5d8 3b5fea8c -> c1d99d9f c10866fc 3fd97423", + "4090f354 3fe184d8 400ce4f9 41485034 c005682e 3db70826 -> c0ffad14 40762a9a 40129d73", + "407d1388 c002cfb1 3be6d34c 417a3ee8 3ca75300 39f2a062 -> c13afa06 c0041e57 3bf66b62", + "c0457678 3eb085f0 3e47d69c 413b0df2 bfb5403e 411c3b48 -> c16c6b90 3fe161ba 411f5abc", + "413302de 3f9de564 3998a2f1 4195f63e 3fc1eb34 3d279a51 -> c0f1d33c be901740 3d28d378", + "418b04e4 3fbd9920 3cbda048 4169d53c bf83e85e 3a38715a -> 4030d230 4020c0bf 3cc36e6c", + "bfb4ea50 be8634c0 39c85525 c16f1da7 bf450800 3d02cc76 -> 4158805d 3f01eda0 3d046b32", + "c14e84ec 40820612 40550b51 41269596 3ff990c0 41023f89 -> c1ba8d41 400743c4 41378282", + "c14a4593 c067af45 3ab6e835 c1789c7b bfb9aac8 3d356d45 -> 40395ba0 c00ad9e1 3d3b29a4", + "419648a0 bf5c7260 3f1213e2 415eac04 c07bd642 3ba20571 -> 409bca78 4044b9aa 3f135875", + "c1371a11 3fb91a58 390b53f5 c0c4eacc 4072466c 3e28d390 -> c0a94956 c015b940 3e28f858", + "c174e764 40156fa2 404749c1 c13fef39 bf3c8f38 39112b2f -> c053e0ac 40449370 40474c2c", + "c19aad12 c0023ff7 39bd23b7 c15b5fea 3f9325b8 3c953241 -> c0b3f474 c04bd2d3 3c983877", + "c18216ca c099c95d 408c4d83 c17928fc 40363210 3d17517e -> bf304980 c0f4e265 408d7c40", + "c10432c2 404ea640 3b3f9593 418df670 407d4400 4103a5fe -> c1d00fd1 bf3a7700 4103b21a", + "c0516b58 3f956d68 3be0d5ff 4131abf0 4083fe36 3f47b07f -> c16606c6 c03d45b8 3f49734d", + "bf741ca0 4053f07c 39105c18 c118f0df 3fb6f9f4 40cd5fbe -> 4109af15 3ff0e704 40cd6101", + "c1854a21 409ad4d4 3eb9254f c13f8f08 c081a12c 394d8c7d -> c0960a74 410e3b00 3eb940bf", + "c0525da8 4047f128 3f7cdce6 c10083dd 4022d998 398ee472 -> 4097d8e6 3f145e40 3f7cef28", + "c0654550 c07df114 3fff30e7 3ee4fe80 c08f2152 39470877 -> c080f290 3f014640 3fff3753", + "c0bfad62 c050d444 3fc5b759 4184fe0a 40346b9e 3f8ef703 -> c1b4e962 c0c29ff1 402a57ab", + "40ce0b20 c0270613 3c084950 c0d5bc2e 3fe7c3c0 3f547363 -> 4151e3a7 c08d73fa 3f5695ae", + "c041c7e8 4054c34c 3bf9e8e6 419568ca c0974a5e 3f813ba2 -> c1ada1c7 4100d602 3f823681", + "41413054 c08251dd 3edf733d c129c8a0 3e842250 3988d2c5 -> 41b57c7a c08a9402 3edf98e0", + "c14a2820 c073d6f8 40031a91 c10caccc bfaa057a 3f8e6746 -> c075ed50 c01ed43b 404a4e5a", + "4185eadc 4094cb20 3f47b8bf 419712c6 408372e8 3cb5cf85 -> c0093f50 3f0ac1c0 3f4d6773", + "c170d2e8 c0549055 3a8608be 4180a786 3ecb5b40 3ff3917e -> c1f910fa c06dfbbd 3ff3b426", + "40df4dec c084dca9 39edd73b c19b28ed 406fee1c 408260da -> 41d2fc68 c0fcd3b7 408264de", + "4106cc2c bf108ba0 397b8850 c18d16a6 4005f7a0 40c9d4b3 -> 41d07cbc c02a1a88 40c9d6f0", + "c0dc90e0 c0760e10 3e31bd6b 4122d8d0 40142434 3e534465 -> c18890a0 c0c51922 3ec283dc", + "418f2430 bf989b46 40125ed6 403f5880 bf5acf38 3ec2d9e1 -> 416e7240 beaccea8 402aba5a", + "c19e485e bef4bc40 4081dbdf 41824f88 405ba47c 3ffd7bf8 -> c2104bf3 c07a3c04 40c13b39", + "407d2988 407fe14c 3d6e84e3 416e24e0 3f1a41b0 3c8356e5 -> c12eda7e 405950e0 3d981f5e", + "4190a1c6 c053d646 3ad9ccd3 418ce36a 3f321c20 4084d641 -> 3eef9700 c0802ea7 4084e3ef", + "411549d8 40660300 3af8c3ba 414bd208 3fb8dbfc 3f72581f -> c05a20c0 40099502 3f72d4e9", + "414da9c8 bfa75770 3c791ef9 3fc7dba0 40918356 3a236624 -> 4134ae54 c0bb5932 3c81cd01", + "419ae388 c0801796 3e65fb66 c058f158 c09ce08f 3c54c079 -> 41b601b3 3f6647c8 3e734d67", + "c19fe398 40422d1c 3dcd9dcd c13557f3 becbbd70 3f8ed003 -> c10a6f3d 405ba4ca 3f9baa4a", + "c06e3f20 bee36a80 3d74c750 c13b9629 40419544 3d84f112 -> 41000661 c05e0294 3dff5a86", + "c04fe150 c09dbf38 3f919e9c 418f6e40 405a8c48 3d745c48 -> c1a96a6a c10582ae 3f994274", + "bfca9810 c04862c5 3f8bfe07 c16f1668 c084855e 3cbfe0ba -> 4155c366 3f814fee 3f8efe06", + "c0453f70 c08cd889 40aa0c53 c0879056 40785dd0 3ca47abe -> 3f93c278 c10483b8 40aab0ec", + "412d4320 3ebbff00 3a23f8cb 414db548 408cc700 3f2d6c8a -> c001c8a0 c0810710 3f2d95f4", + "c0e230ea 3e2a1cc0 3c224ff6 c009ded0 bf6278b8 3a668858 -> c09d4182 3f867ff4 3c30d063", + "c1266da2 3f927fe8 3d8bba70 416f50fc c0730c38 40af38a1 -> c1cadf4f 409e2616 40b167d3", + "c0c2e494 c0948ab9 3b00200d c1764eb5 40918b56 3fa68a38 -> 4114dc6b c1130b08 3fa6cae6", + "4093164c 406f4f38 3ec61cc7 c16f1796 403bf7ea 3c248088 -> 419c515e 3f4d5d38 3ecb4363", + "41693bb4 c09be3cf 3d8ce3ea c181af09 bf236530 3b0bb83b -> 41f64ce3 c0877729 3d915338", + "c077c178 3f794988 396311a2 c191974c 3f9fe9f0 3b89f906 -> 41653e3a be8d14b0 3b918670", + "c15c3180 c09b6da7 3f40c6a6 40983e60 40775738 3cba6acb -> c1942858 c10b8ca2 3f469bbc", + "41824898 3efaf940 409fad80 419f2ac4 c0912af1 3fe9a2cc -> c0671160 40a0da85 40da1652", + "c13e84f8 3fc723ac 3da642d4 c0d16da0 c03bd5e0 396033e4 -> c0ab9c50 408fb3db 3da6b7e6", + "c1906ef6 c04200de 3ed2c7ad 419fa0a6 3f513258 3c216367 -> c21807ce c0764d74 3ed7d811", + "409b4cd8 c0630f8f 3a4c24b3 c0feacba be95f530 3d2885fd -> 414cfcc9 c05050e9 3d2bc6ac", + "41739190 bffc8764 3c39b0ca 418aad08 4092f166 40a1610c -> c0072200 c0d2133f 40a1bdff", + "c190cce0 409eb5fc 410a79f7 c1227d79 c033a8c5 3adb3db8 -> c0fe388e 40f88a5e 410a80e9", + "bfc90e00 406ae630 40d9942c 4109c1a2 407b26e4 3f4cbf9f -> c122e362 be8205a0 40f32c44", + "40eb585c c08a9cc7 3c137e64 c19fa59e 409ed7aa 3c625377 -> 41da7bb5 c114ba38 3cbb3230", + "40828134 c05b72cc 3c6e60a6 c09ddc10 409f3c62 3f022ad3 -> 41102ea2 c1067ae4 3f05e575", + "c10463ee 3f87cf18 39812726 c0551900 c0753c07 3f05cb21 -> c09e3b5c 409c91ca 3f05dbec", + "c0160960 c013df0b 3e9b4d0e 40b4ee74 c0071d0f 3a93f998 -> c0fff324 be4c1fc0 3e9be218", + "c186dc9c 40419f8c 40f738c1 bf5eee20 3ec31860 3ebfbcd0 -> c17fca56 40293c80 41019a62", + "c02d9358 4081f264 3af0b2c8 c082f740 3f95faec 3c2b50ad -> 3fb0b650 4038e752 3c497827", + "c16b86de 4072dcc8 3b5ee874 419a7fe2 bfd7cd0c 3f831c11 -> c20821a8 40af61a7 3f838cc9", + "3ea33bc0 3fdaa88c 411d018f c1226ec8 4090f33a 3dee5cd5 -> 412788a6 c034922e 411ede60", + "c155850a c091edc0 3f104e4e c1315f8c c010bc06 3e062c91 -> c01095f8 c0131f7a 3f31d9c6", + "c1850d16 c0926586 3f469b78 c14c95e8 408736fe 3a7436ec -> c0761110 c10cce42 3f46d95d", + "bffd9090 c070d086 3dfee5e5 410b71b8 408e3b66 39966329 -> c12b23ca c10351d4 3dff85cc", + "beec5880 407d17b4 410cda31 40df45c8 c009bf62 3ac97d59 -> c0ee0b50 40c36b8b 410ce093", + "c0207ca0 bed410e0 409be95e 417c5970 c06aa2a4 3dfc20ca -> c1923c4c 40502088 409fda16", + "c1383507 4054b590 3fe27d0c c0ad8f92 bff0d3ae 3cf2214c -> c0c2da7c 40a68fb4 3fe645fa", + "4194a218 c03a0548 3e146873 40a58738 bfeec2e6 3d98fb0b -> 41568094 bf8547aa 3e60e9a3", + "40a12ed0 40908784 40c2e2e2 c17802cf 3ea58ea0 3a8f2fa8 -> 41a44d1c 40862e9a 40c2ec13", + "c14ad490 4039a828 3edb4b83 41822f98 4024f3fa 394b4f78 -> c1e799e0 3ea5a170 3edb68a3", + "409f0b2c bda4fdc0 3f200cea 3f03b060 4036bf9c 3f989acb -> 408e9520 c03be78a 3fe8a18a", + "40edfcec c04673a0 4060d030 c159ab2a 4095cf90 399415b1 -> 41a854d0 c0f90960 4060d552", + "c0c752a4 c0847524 3f92bfd6 c1701464 40222d88 3ef29f6d -> 410c6b12 c0d58be8 3fcf683a", + "bfd06690 4065d9a4 3da67285 c05b79a8 c0907a42 3b97b6c4 -> 3fe68cc0 4101b38a 3daff2f0", + "c10c879b bfe038b4 4088e44e 41131d7c 40072e04 3baa936b -> c18fd28c c0774a5e 40890f27", + "417ab134 bff92874 3977918b 413aea58 4019b2a0 3fa0f9d0 -> 407f1b70 c08b236d 3fa101da", + "41165aaa bef7b6b0 3c577b6f 414adab8 408de292 39d96d1f -> c0520038 c09d5dfd 3c5e67b2", + "40d3e1d8 beadeb70 41044fc8 416ab664 402ba682 3c8b8bb9 -> c100c578 c04163f0 410495a1", + "c0855ea0 c08d6016 391ff77b 419d30b2 bf064ff0 4047255b -> c1be885a c0792c30 40472856", + "bf7aa660 c0399bfe 3c8712e0 c03d36c8 c02b3d60 3ca4cec8 -> 3ffd1a60 be65e9e0 3d15f311", + "4178fa08 4091f07c 3ccab81b 40288990 c0145c5c 3e530a87 -> 414ed7a4 40dc1eaa 3e6c668c", + "c19b0497 3f05b158 3bafcea1 419d6d9e bf8cde1c 3b538b75 -> c21c391a 3fcfb6c8 3c0d6cee", + "c0f17e0c 3fb630ec 40729f4a bfd4c840 401f30ac 3da76207 -> c0bc4bfc bf88306c 4077da85", + "c0c07cac bf5cf7f0 3d7895e4 bf4d0100 bfd46668 3e3c87c8 -> c0a6dc8c 3f4bd4e0 3e7aaed1", + "c0f78ad4 408027e8 3ff909af c14f58be bfead686 3d37507f -> 40a726a8 40badd8a 3ffec49b", + "c09e1d00 bff4af4a 3aa375de 41942f94 4088f058 410a489b -> c1bbb6d4 c0c61c2a 410a4ddd", + "40b9679c c08018bc 3a7fb86a c0e586de 4060bf90 3a9d8c09 -> 414f773d c0f07884 3b0ffbdb", + "c17fc6fa bf762a30 3e60af69 41165642 3fe640d4 3f87e4a6 -> c1cb0e9e c030aaf6 3fa3fb7e", + "419a82ec c09a88af 3ca5d29f 416703ac c08787ae 3f9ed8ca -> 409c0458 bf180808 3fa1704a", + "41814f68 bf68d7a0 3e03e9ff 41507030 c01a1834 3be1ea52 -> 4048ba80 3fbfc498 3e0afa83", + "41433398 40594f90 3ac5ae44 414a147c 3f93d378 3985626f -> bedc1c80 400f65d4 3ae75c63", + "c1859116 bfc23c58 3ebf1c49 4189182a 4048b328 3e341649 -> c20754a0 c094e8aa 3f0c9628", + "c093ac0c c096bd73 3d85042b c0cbfa10 bf9a122e 408f4d60 -> 3fe13810 c06071cf 40916185", + "419b1fa6 3f379150 3aa62838 c18f29e6 c0445e97 3b4df027 -> 421524c6 407242eb 3b91cabd", + "c189f25c 3e1edd00 3abe44b3 c07ee848 c08d1fd6 3d20fd7e -> c1542aa6 409216be 3d270182", + "c0ac600a 404c43a0 3fcbf809 41534b1c 3e208fa0 38efbcb7 -> c194bd90 40423aa6 3fcbfc82", + "4199b14a c009db74 3f5fdfc5 405f1928 3fc2f0dc 3b95253a -> 417b9c4a c06b53e2 3f610b54", + "c182f21c c08e953d 3a88714a 4147d130 be7264c0 39353dba -> c1e6dab4 c0870217 3aa33b78", + "c11c01d6 3f226f68 39131e8f 40f579b0 405a30e4 3e8c3dc4 -> c18b5f57 c031950a 3e8c52b7", + "c161db92 40218764 3e2ea74c 418b98c0 401df930 39a5bf30 -> c1fc8689 3d638d00 3e2f021f", + "415f30dc 3fe92fcc 3b37273f c142ded0 3f218160 41161021 -> 41d107d6 3f986f1c 41161bb8", + "41457b68 3f0b7b78 3d16e2ba 400249d0 bfb2bf38 399c94ce -> 4124e8f4 3ff87cf4 3d18282d", + "c1653460 bf830dfc 407d0f49 4178f0d0 4093c836 3a017f6c -> c1ef1298 c0b48bb5 407d17ff", + "c1814aae c01bb5e8 3924a2fd c149b3d2 c063b83d 3cf612f6 -> c0638628 3f9004aa 3cf765a8", + "bed79300 3fde264c 40f915b4 c15e1cbd 3fea4d58 3f27c326 -> 41576025 bdc270c0 41070722", + "c0ac7c52 c091e775 3d481209 40f11fa0 4018956c 40e2db62 -> c14ecdf9 c0de322b 40e46bbc", + "c1927175 407cfa98 3cea78d5 c13a3412 c09ed51d 4082207e -> c0d55db0 410ea934 40830b1e", + "3faf7b40 40036bb6 3a87d489 418b0068 3eff89c0 3c86e092 -> c18008b4 3fc6f4fc 3c8f8102", + "412b9792 c01acc62 3f65a980 3e9c48c0 4059c6d8 3ce73b1d -> 4126b54c c0ba499d 3f6ce46c", + "c18c8c1b 3fd1c960 3d48969c 413bfd02 4003ddc8 40336929 -> c1ea8a9c bed7c8c0 40368c05", + "c19ad19b 3fc73050 4011aaf2 411ffa8a c0492f63 3b7a0920 -> c1eacee0 409663c6 4011ea05", + "40129c08 beee2180 3e4a7203 418fc5b0 405dd3b8 3961940b -> c17ae45e c07b97e8 3e4aaf5c", + "40bcad6c 40779eb8 3af16c3c c174e6b6 3fc0b988 3c801dd6 -> 41a99eb6 401741f4 3c8f63c5", + "c104d6fa 3f0d0a50 39d9aac2 3fb2d710 bf93689c 3c5a491e -> c11b31dc 3fd9edc4 3c61441e", + "4197454e 4064df94 3a88e443 c190c1df 3fa35008 39774681 -> 42140396 40133790 3aacb6d6", + "c02dbe68 c020dfed 3a6798aa 40824ff8 c04490dc 3bb42405 -> c0d92f2c 3f0ec3bc 3bd151e9", + "c18fdeae 4035f4dc 3d227f08 41778c28 bf9d4c60 399f196b -> c205d261 40824d86 3d23e2cc", + "4135d448 404c0c34 3c3b1530 410f6126 40668b90 40bb1176 -> 4019cc88 bed3fae0 40bb6f12", + "c1284539 408de740 38f47fd4 c18045f5 3c53fe00 3a1507ea -> 40b08d62 408d7d41 3a361404", + "412a2b46 be3fe160 3b1409f0 c008eb80 40316ff0 3b8f17d3 -> 414c6626 c03d6e06 3bd99ab9", + "c177faec 3dc55800 3fac7903 4058cb68 3e2faf80 3dc8128f -> c19716e3 bd9a0700 3fb8facf", + "41717904 c09168a2 3e972c0a 41819b58 c08a94ac 40093d0e -> bf8ded60 be5a7ec0 401c229e", + "4186207a bf718c88 3a4b7302 c19749bd 40208698 3d8a7b50 -> 420eb51c c05ce9ba 3d8c25cf", + "c19bb66a c020d688 411b4280 c11fbdea 4046c17c 3e86e31b -> c117aeea c0b3cc02 411f79b2", + "c18c6b97 bfd5c762 3f0b9dd2 c193bf31 4056fcb4 3eb90cfc -> 3f6a7340 c0a0f032 3f6824be", + "c187476a 3f84fb08 38e379fe c14555f3 402f8714 400b2c2f -> c09271c2 bfda1320 400b2e18", + "c112de67 c0405e91 3b5342b3 4148ac3c 405de820 3f977ae3 -> c1adc552 c0cf2358 3f97e56f", + "c11a076c bfd6f7d4 401a6f2a c161dffd c04cccde 399db19f -> 408fb122 3fc2a1e8 401a743a", + "41975938 4018bec0 3ee5dd2d 41030cf8 bf2b3830 3d33f177 -> 412ba578 40438ccc 3efc5d25", + "c0d8c5ec 4067c300 3ea033e6 c16545b6 3e70a0a0 3a5a7911 -> 40f1c580 4058b8f6 3ea0a28b", + "41606790 4058f768 3a928667 419a612a 4051c584 3ca9482b -> c0a8b588 3de63c80 3cb27b61", + "4165e2f8 401196e6 3e12f720 c0f28c94 40244aec 3d6a12fc -> 41af94a1 be95a030 3e4d817b", + "c116d1bf c0401912 3c2794e4 c14b08d0 409d24c2 3cca4004 -> 4050dc44 c0fd314b 3d0f1071", + "4144e1ac 40848468 3a1891d7 40c229ec c08b1868 39a0a220 -> 40c7996c 4107ce68 3a6c9162", + "4199f8f4 bfa33796 3a3b3e7e bf5c1880 40670d04 4068babc -> 41a0d9b8 c09c5468 4068c6e3", + "c1543a35 c06d98b0 3e756d03 c174cd6e 40942256 38e534c7 -> 40024ce4 c1057757 3e758c52", + "40865590 c00ec9c1 3d0814fe c05d8530 c007c2f7 3c95f54f -> 40f51828 bde0d940 3d531778", + "bfb6f560 3fcff16c 4101fd02 c14d69d6 bf188528 3ac03f7a -> 41368b2a 400e1a00 4102031a", + "c16efae0 c0615a27 40110700 c132d421 bfd44ec4 3de42961 -> c0709afc bfee658a 4018286b", + "c1960541 c040ad63 3f3d1583 c1780beb c09f97ca 3c9acf32 -> c04ffa5c 3ffd0462 3f41ec5d", + "c104f269 bf98b6fc 4009910e 410c51b6 c0650c14 3e0d45d6 -> c188a210 4018b096 401265c2", + "41704dc4 c0620450 3ac88423 c0875ec8 3f473198 3ebe9ee9 -> 4199fe94 c089e85b 3ebf6a6b", + "4197bf6a bf877a10 3e0a859a 41004cf0 c0480c61 3c2958db -> 412f31e4 40044f59 3e151e72", + "c17635df 40415bc0 4092609e 418c0044 bfbd8d52 3ebc545f -> c2038d9a 40901134 409e2639", + "c192dab4 408f4cf6 3f70a08f c18ab4ea c0846176 3f2917f5 -> bf825ca0 4109d736 3fccdc9c", + "c12a377b bd992980 3b1c86b4 c190515f c0726ee4 405bd425 -> 40ecd686 406da598 405bfb81", + "405c4968 401ccfa0 3d23b525 c0badf98 bffb6f32 3b40765f -> 41148226 408d439c 3d2fca48", + "419ed462 4014b484 3d911dc4 c15b99c6 c02252f6 40a055e2 -> 420650a2 409b83bd 40a29ab0", + "419a9aba bfd8aee6 38ef7369 c0a55c88 409f14fa 3a81cb85 -> 41c3f1dc c0d540b4 3a94a7cd", + "3f6dbd20 bfb9e5e2 39120c48 c15ddd48 3fe40e40 3a757dd5 -> 416cb91a c04efa11 3a8f416c", + "415554f0 4045b798 395284ef bf8a7e60 c05977e9 398bf682 -> 4166a4bc 40cf97c0 39ffac8e", + "c01d4a38 408810ca 3b17cdc9 410c3340 c076c568 3c857ba8 -> c13385ce 4101b9bf 3c989c12", + "4174d1b0 402739ec 3cfec80c 40b144f0 408d2be4 3e00437e -> 411c2f38 bfe63bb8 3e201f6e", + "c1647248 4075e460 3ea4a051 4162f908 c0854fa4 3f198933 -> c1e3b5a8 410020ea 3f6bdbb2", + "41219310 406876c8 3cf5a9fd c187876e 3e840b80 3f2df027 -> 41d850f6 4057f558 3f359f69", + "41722d5c bf2c4178 39626208 c0deaa6a 3e53b480 3cf388a8 -> 41b0c148 bf612e98 3cf57b6e", + "c12adb94 3e6f8900 3d949d48 bf1bc3e0 400bb8c8 3b843615 -> c1211f56 bff98070 3d9ce6b5", + "40d5c794 c016fdcb 3a9e1f14 4030ebf0 bdeffe80 3ac6053e -> 407aa338 c00f7dd7 3b3274bc", + "41006154 40763958 3c3fa001 c06866a0 c09cb580 3f6ecf09 -> 413a7afc 410be916 3f71cedf", + "be925c40 40992df0 3ed93b06 c0f9abd8 400d1d24 3b4829a3 -> 40f08614 40253ebc 3edaccaa", + "406623c8 bfb08764 3c22bd70 3e85b9c0 405a05e4 3e83296b -> 40556c90 c09924cb 3e884062", + "c09f48fe 3f109b90 3ad1371e c19ebebc bf7207d0 3c4907f7 -> 416dd8f9 3fc151b0 3c63706a", + "c190d3cd 3fca93ec 3a31024c c0993d28 c047eac0 3f9fe603 -> c1550906 40969a5b 3f9ffcbd", + "3fc93480 c04aa7ed 3bf590be c119e348 bf9ee062 3e244b97 -> 413309d8 bff66f78 3e2bfb6f", + "c0bc6278 be9dc7f0 3c541c1f c1115a40 40553dac 3d520a46 -> 404ca410 c068f6aa 3d838c1a", + "412c39f4 4088fd2c 3f845927 c10fe4e1 407cbad0 3bc5f77a -> 419e0f6a 3ea9fc40 3f851fc7", + "4186f5ac c0594a04 3c56888d 3fb11800 c0442084 4091ec09 -> 4177c858 bea94c00 40925776", + "419e78b2 3ffbbd9c 3ccc0c1a 419eab08 bfb0e41a 3bbc9acc -> bcc95800 405650db 3cfb399c", + "40a3ee50 c077f44e 3f66f38c 4181fc2e 402a0384 3d46a33d -> c1320134 c0d0fbe9 3f735eea", + "41870d4a bfd9278e 410882a5 4125580a c05da0f6 3bebf5b3 -> 40d18514 3fe21a5e 4108a035", + "c11a0fab c07e4a40 3ed3b85d 40fe3e7c c029b76b 3cc7a0d3 -> c18c9774 bfa925aa 3ee034d5", + "4093079c 402e3d46 3f27ec19 41462f20 bed44f50 390f5302 -> c0f956a4 4048c730 3f27f5c7", + "c0853b98 c09e7e38 410e4507 c01189b0 c016d4ad 3e7edfef -> bff1db00 c02627c3 41124095", + "c1587334 bfb70e98 39b47efa c1897834 3fb95d30 3ecd490a -> 4069f4d0 c03835e4 3ecd7708", + "412098c4 40684198 3a2a1f29 c115e9a7 bfbbfee4 3d882845 -> 419b4136 40a32085 3d8988cc", + "c0a6600c c0576cb6 38e2be20 c18f614a c00fcd54 399544c5 -> 414b928e bf8f3ec4 39d4e02d", + "c13a900c c0022ddb 3ca6fa9d c19f6435 bf985b78 3db5985f -> 4104385e bf58007c 3ddf5ba2", + "4062ef98 404bc808 3e3ec2f0 4128e75e 3dd2c500 3f234703 -> c0e056f0 404531e0 3f52f86e", + "3ff263d0 be583000 39603c6f c0f70904 3f772d00 3f768228 -> 4119d0fc bf969c80 3f7690e8", + "c116fa2c c0471f42 3c9f778e c19f2463 408f433e 3bed2886 -> 41274e9a c0f2d2df 3cdae5d5", + "c0ece638 bfc12516 3c4c2f40 c140bf74 bf1a8360 3b43f3e3 -> 409498b0 bf67c6cc 3c7d427b", + "c1997bd7 bfc7b670 3ee320a6 417f4ed8 c029d260 40dcb41a -> c20c91a2 3f8bee50 40eae67b", + "c134e537 c059aaca 40f2ca05 3f368620 be3ac500 3fad7a8d -> c1404d99 c04dfe7a 410f146c", + "c18ab1d0 409bd8b2 3bbde2f7 c07c2488 400bc9de 40167256 -> c1565a7e 402be786 4016d191", + "bd724e00 c08bd5c2 3d8bd125 c1398f65 40383798 398dd39d -> 41389d17 c0e7f18e 3d8c6866", + "40aa4528 c03c4747 3bb5f29b c1833863 3fef5564 3917549c -> 41adc9ad c099f8fc 3bbb8194", + "c152ec0c bf8d094c 3c004e3e c0b49a5e 401bdf0c 3a31e10b -> c0f13dba c06263b2 3c0b98a6", + "c195e878 3fbdfb40 3ada1d05 c1808c24 c0834fa6 3c79de12 -> c02ae2a0 40b2ce76 3c8aa166", + "414d3fe8 401d9d74 3eafb8a6 40a84130 408b8d6e 40cb7ba4 -> 40f23ea0 bff2fad0 40d6774e", + "c199d239 40844b04 3e11ca63 3fe5c950 400032dc 3bfa5f94 -> c1a82ece 4008632c 3e19a333", + "41121abe 404697b4 3d77315c 40b6fdec c015d3bc 391225d8 -> 405a6f20 40ae35b8 3d77cc6d", + "40981b08 c06e7471 3cbda82b 418e20d0 bfc35726 39971c7f -> c150341c c00cc8de 3cc02316", + "c0060948 4004e98e 3ad83497 c148c5ef bfa67066 396abcdc -> 4127439d 405821c1 3af746d9", + "40a66860 bf7f6818 40eb7c48 c16cadfd bf8d9e98 3929360c -> 419ff116 3ddea8c0 40eb7dd1", + "c09a7640 c09f7f01 3b123bd8 c08f12dc c089662a 3f3cd30b -> beb63640 bf30c6b8 3f3d6564", + "c07cfb18 3fa0b594 3e8f7b30 c19f50e5 3fa73024 40946289 -> 417f6304 bd4f5200 409d5a66", + "408d085c bf8e9fcc 3c05fc64 c1362588 be525cc0 40cf2d5f -> 417ca9b6 bf68a868 40cf708b", + "419465c2 4070fe48 3c21bf34 4093696c c04a5d17 3ab5d1ac -> 415f16ce 40ddadb0 3c38ccf1", + "410b02c0 4055217c 3d559847 401b5d68 4084c27c 3b4f6e3c -> 40c856cc bf518df0 3d62964d", + "c077a470 3f7b22f0 3c508273 3f1530c0 c01745eb 3b096e29 -> c08e7850 40560ea7 3c72fd3c", + "4125d70a c02c690f 39499e8b 40ff2bb0 3edc0330 3ed02f82 -> 401904c8 c047e975 3ed04973", + "c079c0a0 bf0b8220 397e9fb6 c0f2ea00 3f42d788 41012652 -> 406c1360 bfa72cd4 4101275e", + "40eff5c0 bf5a9920 4080893e c19c70af c0557982 3d161b32 -> 41d86e1f 401ed33a 4081b5b7", + "40b6a23c 4029102a 3f9d0dd3 c192c9b8 3fdae7a8 3aca1970 -> 41c07247 3f6e7158 3f9d412b", + "c12cb990 4059e9e0 3eb717a5 c08d88c0 3f7d1d40 391877af -> c0cbea60 401aa290 3eb72bd9" + ] + }, + { + "glsl": "vec3 cultmath_af_neg(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3efc0ac0 c081676f 39dcef73 -> befc0ac0 4081676f 39dcef73", + "c17458ea bedfe490 3ae60300 -> 417458ea 3edfe490 3ae60300", + "4181bea0 c016ca53 3b988793 -> c181bea0 4016ca53 3b988793", + "40e29ec4 c037db20 3efba417 -> c0e29ec4 4037db20 3efba417", + "c15f2030 bf6e2100 3afc5f9a -> 415f2030 3f6e2100 3afc5f9a", + "401eda20 406edc78 3d01ebd0 -> c01eda20 c06edc78 3d01ebd0", + "c09a7dcc bf8a0f7a 3c6be155 -> 409a7dcc 3f8a0f7a 3c6be155", + "41829a4a 406e01f0 3d00bee8 -> c1829a4a c06e01f0 3d00bee8", + "c008d338 400b6a78 3d809c4e -> 4008d338 c00b6a78 3d809c4e", + "414c45b4 be9d84c0 3ea699b5 -> c14c45b4 3e9d84c0 3ea699b5", + "c19c6e18 c09bd5e4 3fdaf64f -> 419c6e18 409bd5e4 3fdaf64f", + "c191beec 403eaaaa 3ccef4d8 -> 4191beec c03eaaaa 3ccef4d8", + "416421b0 3f314f30 40c6150f -> c16421b0 bf314f30 40c6150f", + "40dc1108 c07c5ea0 404f3bad -> c0dc1108 407c5ea0 404f3bad", + "c14d4b76 409500de 3d6a2cd1 -> 414d4b76 c09500de 3d6a2cd1", + "c186922e 40798cc0 3b08fc23 -> 4186922e c0798cc0 3b08fc23", + "4199d34a 3fd71fd0 40db8808 -> c199d34a bfd71fd0 40db8808", + "c139556f c09cc2be 3a8da2bd -> 4139556f 409cc2be 3a8da2bd", + "40811a2c 3f855780 3aac3dd7 -> c0811a2c bf855780 3aac3dd7", + "40a09834 3fdbb7c8 3efc058f -> c0a09834 bfdbb7c8 3efc058f", + "40f24048 c0846439 3f721cc9 -> c0f24048 40846439 3f721cc9", + "40a7cebc 3fd45724 3a82a2fd -> c0a7cebc bfd45724 3a82a2fd", + "417aab4c c07ba257 3de353b4 -> c17aab4c 407ba257 3de353b4", + "4130e6d8 400394d8 3b58e883 -> c130e6d8 c00394d8 3b58e883", + "3fd6a7c0 4004b898 3b315857 -> bfd6a7c0 c004b898 3b315857", + "3f978b60 4012800c 40597cfb -> bf978b60 c012800c 40597cfb", + "418f5f50 bfaa20e2 3fb08496 -> c18f5f50 3faa20e2 3fb08496", + "c102d8f6 40589f20 3f81bbed -> 4102d8f6 c0589f20 3f81bbed", + "4116891c 40407940 38d8d03d -> c116891c c0407940 38d8d03d", + "40b31230 bf102bc0 3a73ece7 -> c0b31230 3f102bc0 3a73ece7", + "c11baa72 c02c2a6c 4044e2bf -> 411baa72 402c2a6c 4044e2bf", + "c13342ac 409a742e 390317c6 -> 413342ac c09a742e 390317c6", + "c17b9572 3ef66960 3b4ea273 -> 417b9572 bef66960 3b4ea273", + "c0bdcaba c047cfa8 3f52bc88 -> 40bdcaba 4047cfa8 3f52bc88", + "40c65e00 c03d4043 40cfbae4 -> c0c65e00 403d4043 40cfbae4", + "40d10974 3fd7ab38 3b55e65c -> c0d10974 bfd7ab38 3b55e65c", + "41867c16 c089322a 40183c16 -> c1867c16 4089322a 40183c16", + "c0e9a1fe 3fe31af8 3b5a6eb3 -> 40e9a1fe bfe31af8 3b5a6eb3", + "41835da0 bf880dc6 3ae3446e -> c1835da0 3f880dc6 3ae3446e", + "419e1362 407d5e40 40077fa0 -> c19e1362 c07d5e40 40077fa0", + "c142090c c01eddcc 3e53d510 -> 4142090c 401eddcc 3e53d510", + "c058c758 3e491480 3cc161a2 -> 4058c758 be491480 3cc161a2", + "c06fbce8 bfe3d0b8 3ed72f65 -> 406fbce8 3fe3d0b8 3ed72f65", + "c11512ed bf45e480 3a521ad5 -> 411512ed 3f45e480 3a521ad5", + "40885414 3f768ff8 3a4e89ca -> c0885414 bf768ff8 3a4e89ca", + "c191a8b0 3fb3f014 3e17c487 -> 4191a8b0 bfb3f014 3e17c487", + "4158c470 c088fdd0 39f0554f -> c158c470 4088fdd0 39f0554f", + "410017c8 400c90ec 3bee8913 -> c10017c8 c00c90ec 3bee8913", + "c0e85992 408c9346 3d6ffc55 -> 40e85992 c08c9346 3d6ffc55", + "406e2e50 bff3fbd6 3db45b36 -> c06e2e50 3ff3fbd6 3db45b36", + "412dd162 c077bc38 3e3ada16 -> c12dd162 4077bc38 3e3ada16", + "c02770a8 c05cdc50 40993420 -> 402770a8 405cdc50 40993420", + "c1733982 c0269f2a 3e87b1cd -> 41733982 40269f2a 3e87b1cd", + "bef886c0 c01b8c0b 3bb0eef3 -> 3ef886c0 401b8c0b 3bb0eef3", + "4047c6c8 3fc41630 3e331c67 -> c047c6c8 bfc41630 3e331c67", + "40f8f1ac 400704f8 3985649c -> c0f8f1ac c00704f8 3985649c", + "c16fd2e3 406a0ca0 3f153e8d -> 416fd2e3 c06a0ca0 3f153e8d", + "40917218 c05c9daa 3fa8b5b4 -> c0917218 405c9daa 3fa8b5b4", + "41150eae bd083500 3d3b84ad -> c1150eae 3d083500 3d3b84ad", + "c105f0cb c0810286 3da35083 -> 4105f0cb 40810286 3da35083", + "4186bb96 40488534 38f28adc -> c186bb96 c0488534 38f28adc", + "c1691f07 bd391380 3b67f446 -> 41691f07 3d391380 3b67f446", + "3f921f90 c051f9cd 3c83f4d7 -> bf921f90 4051f9cd 3c83f4d7", + "c1244eec 4087f412 3c25970f -> 41244eec c087f412 3c25970f", + "418fd878 bfbeeeb8 3f9807bb -> c18fd878 3fbeeeb8 3f9807bb", + "4136e5ae c071d9ea 39615327 -> c136e5ae 4071d9ea 39615327", + "410f4498 3f9eb4c0 3ab59e4a -> c10f4498 bf9eb4c0 3ab59e4a", + "bf8d0b20 bea50c50 3c87765c -> 3f8d0b20 3ea50c50 3c87765c", + "4156ee2c c05ae7ae 40c4766a -> c156ee2c 405ae7ae 40c4766a", + "4152150c 40011528 3e4831f0 -> c152150c c0011528 3e4831f0", + "c0760c98 4052b74c 3a07b3be -> 40760c98 c052b74c 3a07b3be", + "c17d3c4a 3f2b1280 3c876602 -> 417d3c4a bf2b1280 3c876602", + "c0d4af2c bf13bd18 3a21199f -> 40d4af2c 3f13bd18 3a21199f", + "c0ce5c96 c055cb1d 3d4b109b -> 40ce5c96 4055cb1d 3d4b109b", + "40b2d260 40747c08 40a1f3e9 -> c0b2d260 c0747c08 40a1f3e9", + "c0bd2c44 3fd21040 3f86bc07 -> 40bd2c44 bfd21040 3f86bc07", + "c19d1b45 408f1480 3bf48100 -> 419d1b45 c08f1480 3bf48100", + "bfafa460 3f2b2a70 3cbd8640 -> 3fafa460 bf2b2a70 3cbd8640", + "c0bd6db0 bf039dc0 3baf102b -> 40bd6db0 3f039dc0 3baf102b", + "40308058 c0000d36 3b9f9b7c -> c0308058 40000d36 3b9f9b7c", + "c0bd3cb4 40002ee8 3cb7dd1f -> 40bd3cb4 c0002ee8 3cb7dd1f", + "41353bca 4059343c 399d9fce -> c1353bca c059343c 399d9fce", + "c11aceae 405ced38 3f54f414 -> 411aceae c05ced38 3f54f414", + "c0a4bcac bef615e0 3e8056d5 -> 40a4bcac 3ef615e0 3e8056d5", + "4182cb38 bf931a3c 3c9fceab -> c182cb38 3f931a3c 3c9fceab", + "40f245a0 4054f56c 3dadd37d -> c0f245a0 c054f56c 3dadd37d", + "3de87e00 be27bb00 3cf157c5 -> bde87e00 3e27bb00 3cf157c5", + "c15df840 404c4b94 3f17baeb -> 415df840 c04c4b94 3f17baeb", + "c10a7494 408c38b4 3b0665ac -> 410a7494 c08c38b4 3b0665ac", + "40d98aa0 40217a8e 39cc87d7 -> c0d98aa0 c0217a8e 39cc87d7", + "c1809bfe 40298852 3a07048f -> 41809bfe c0298852 3a07048f", + "414cec08 409bb808 3cae75e9 -> c14cec08 c09bb808 3cae75e9", + "c189f923 40642d68 392b49e8 -> 4189f923 c0642d68 392b49e8", + "415cf3a4 c081e3ba 3f9f2401 -> c15cf3a4 4081e3ba 3f9f2401", + "c199752a 3fb04f9c 3cf5184a -> 4199752a bfb04f9c 3cf5184a", + "40f94778 3f11d420 3a548d8e -> c0f94778 bf11d420 3a548d8e", + "c19b4276 3fd04cb0 3df5c4e7 -> 419b4276 bfd04cb0 3df5c4e7", + "41264450 c08ad872 3f9a6bce -> c1264450 408ad872 3f9a6bce", + "415bf32c c040a61b 4022c343 -> c15bf32c 4040a61b 4022c343", + "410a04e4 bb9f4000 404d2cf2 -> c10a04e4 3b9f4000 404d2cf2", + "4155442c 3f61b010 3998c251 -> c155442c bf61b010 3998c251", + "40d42fec c011265a 3e8b7831 -> c0d42fec 4011265a 3e8b7831", + "3fbfbb60 c083aacc 3c20f371 -> bfbfbb60 4083aacc 3c20f371", + "419d8fc2 3f9a2a2c 40f35cea -> c19d8fc2 bf9a2a2c 40f35cea", + "3fdcd500 3fc9baac 3c1139e1 -> bfdcd500 bfc9baac 3c1139e1", + "40dfea98 c06b0ded 3a53c74c -> c0dfea98 406b0ded 3a53c74c", + "c119ff97 3f639ec8 3c03fedd -> 4119ff97 bf639ec8 3c03fedd", + "c1863586 3fc69470 39930bb8 -> 41863586 bfc69470 39930bb8", + "3dc47600 bfcef89a 3e9fa9ab -> bdc47600 3fcef89a 3e9fa9ab", + "c0dea116 40987c6c 3f5e0854 -> 40dea116 c0987c6c 3f5e0854", + "40588aa8 bfbbee54 3bc7c364 -> c0588aa8 3fbbee54 3bc7c364", + "c1657b07 c09c2844 3d0ab028 -> 41657b07 409c2844 3d0ab028", + "4110a83a bfba0494 3bd9d851 -> c110a83a 3fba0494 3bd9d851", + "414536d0 c05b53b2 3cb4194b -> c14536d0 405b53b2 3cb4194b", + "413554e8 c098d237 392aa221 -> c13554e8 4098d237 392aa221", + "40b2b63c c035564f 3c34b2ca -> c0b2b63c 4035564f 3c34b2ca", + "c03b7528 c0540222 3960d9a6 -> 403b7528 40540222 3960d9a6", + "40ff7f18 bedfdc30 4064a773 -> c0ff7f18 3edfdc30 4064a773", + "3f4c6760 4021af38 4093fe72 -> bf4c6760 c021af38 4093fe72", + "c19ef0c6 c05770f5 40973bc8 -> 419ef0c6 405770f5 40973bc8", + "419c3ddc c038b809 39be6763 -> c19c3ddc 4038b809 39be6763", + "408dd94c bf6c0c98 3b0e2a1f -> c08dd94c 3f6c0c98 3b0e2a1f", + "40989600 bf7ba960 3e2d1611 -> c0989600 3f7ba960 3e2d1611", + "41757f3c 408fa68a 3f46d7bd -> c1757f3c c08fa68a 3f46d7bd", + "414ad5a4 bef9b330 3c6bc43c -> c14ad5a4 3ef9b330 3c6bc43c", + "418418e0 c001bff5 3e1538dc -> c18418e0 4001bff5 3e1538dc", + "c190de85 40682dcc 39d4b575 -> 4190de85 c0682dcc 39d4b575", + "c106388d 407f8cc0 3f8bff54 -> 4106388d c07f8cc0 3f8bff54", + "410dae5a 40766320 40434b1b -> c10dae5a c0766320 40434b1b", + "c0092ea0 3f9b7d08 3b01d381 -> 40092ea0 bf9b7d08 3b01d381", + "403aab00 400e89c6 3a6d2917 -> c03aab00 c00e89c6 3a6d2917", + "c0341f30 404cbb14 40abb3a6 -> 40341f30 c04cbb14 40abb3a6", + "c0b7cdde c05197bf 3df26676 -> 40b7cdde 405197bf 3df26676", + "41300500 c09977f1 3f9811a6 -> c1300500 409977f1 3f9811a6", + "412843e4 3edd1bd0 3aa4af7c -> c12843e4 bedd1bd0 3aa4af7c", + "c1078c8a 4074e9e8 38de42ee -> 41078c8a c074e9e8 38de42ee", + "bf572b40 3f892968 3c9af5d5 -> 3f572b40 bf892968 3c9af5d5", + "c0ff99be 4091edbe 3b50a9fc -> 40ff99be c091edbe 3b50a9fc", + "41487bf0 3ffd6888 3b6e2aa8 -> c1487bf0 bffd6888 3b6e2aa8", + "c0fa92e0 40793e4c 3d286ec9 -> 40fa92e0 c0793e4c 3d286ec9", + "c0a5f032 c0516959 3f4bdcb4 -> 40a5f032 40516959 3f4bdcb4", + "c091a4bc bff25706 3ab133d9 -> 4091a4bc 3ff25706 3ab133d9", + "405e16c0 bf904522 3e12e3e7 -> c05e16c0 3f904522 3e12e3e7", + "bf128f40 3f1062c0 39dc7772 -> 3f128f40 bf1062c0 39dc7772", + "c19a3807 c011c20a 3fd07989 -> 419a3807 4011c20a 3fd07989", + "c0f77410 3e8c1c80 3bc5b323 -> 40f77410 be8c1c80 3bc5b323", + "406128c8 bf2b1478 38d7592b -> c06128c8 3f2b1478 38d7592b", + "417ac978 40959388 38f74bf8 -> c17ac978 c0959388 38f74bf8", + "41429110 c0118863 3f2e7486 -> c1429110 40118863 3f2e7486", + "417a0d6c 3f94f880 39d5612b -> c17a0d6c bf94f880 39d5612b", + "40ab5240 c08f4ec0 3b2a89e3 -> c0ab5240 408f4ec0 3b2a89e3", + "c1829d82 bf740b98 3fdd7551 -> 41829d82 3f740b98 3fdd7551", + "c194e18c bf9dd37c 3abe9466 -> 4194e18c 3f9dd37c 3abe9466", + "419df6c0 4000edc6 3cf5a8d0 -> c19df6c0 c000edc6 3cf5a8d0", + "c0a1a748 409ddb20 393c1922 -> 40a1a748 c09ddb20 393c1922", + "c0d8d13a c00b5cd0 3e8651dc -> 40d8d13a 400b5cd0 3e8651dc", + "bfd5e390 3d86bf40 3a3ae422 -> 3fd5e390 bd86bf40 3a3ae422", + "4191e8fa 400a6c5e 3c9c9534 -> c191e8fa c00a6c5e 3c9c9534", + "3f520880 be5c1920 3a8b6dd1 -> bf520880 3e5c1920 3a8b6dd1", + "412a2d52 3f527250 392287bf -> c12a2d52 bf527250 392287bf", + "bfcf57f0 3ffaf088 3f372230 -> 3fcf57f0 bffaf088 3f372230", + "3ec0f680 40612dec 3d080075 -> bec0f680 c0612dec 3d080075", + "415aadd8 4088657c 400b58c4 -> c15aadd8 c088657c 400b58c4", + "419e521c c011f6f0 3a148d10 -> c19e521c 4011f6f0 3a148d10", + "c170e5b8 3f7172c8 3ee9471d -> 4170e5b8 bf7172c8 3ee9471d", + "3e8d9740 3e39d1e0 40ed9054 -> be8d9740 be39d1e0 40ed9054", + "419456e6 be8832a0 410f30e2 -> c19456e6 3e8832a0 410f30e2", + "c185779f bf2cd888 39b99adc -> 4185779f 3f2cd888 39b99adc", + "41906b0e 3fe3ae58 3b9c9db7 -> c1906b0e bfe3ae58 3b9c9db7", + "41512688 3f3691d0 4088c358 -> c1512688 bf3691d0 4088c358", + "40b613bc c013f06b 3f7045b1 -> c0b613bc 4013f06b 3f7045b1", + "c1438de3 3eaec3f0 38df2dd8 -> 41438de3 beaec3f0 38df2dd8", + "410fab4e 406924a8 3a059b16 -> c10fab4e c06924a8 3a059b16", + "3fee2eb0 bde2ce80 3bc57694 -> bfee2eb0 3de2ce80 3bc57694", + "414a5cac bebb0550 3ac352f8 -> c14a5cac 3ebb0550 3ac352f8", + "c1999e4c 4054b7ac 39d5832f -> 41999e4c c054b7ac 39d5832f", + "410fb64e c09ba619 40cabe72 -> c10fb64e 409ba619 40cabe72", + "c12c0135 40417f88 39b77c79 -> 412c0135 c0417f88 39b77c79", + "c190bbc6 bf9df77e 3b083d3e -> 4190bbc6 3f9df77e 3b083d3e", + "40ce35d0 3f14c660 3a424194 -> c0ce35d0 bf14c660 3a424194", + "c1543ff3 c09b3c58 3bc30338 -> 41543ff3 409b3c58 3bc30338", + "418d4118 bfbccb4a 38d94c4d -> c18d4118 3fbccb4a 38d94c4d", + "c0b818c2 40895416 3951a833 -> 40b818c2 c0895416 3951a833", + "4110d79c 4034c16c 3e3e5efd -> c110d79c c034c16c 3e3e5efd", + "4154e87c bf546028 4105cf3e -> c154e87c 3f546028 4105cf3e", + "40abf864 c0154be8 40dff963 -> c0abf864 40154be8 40dff963", + "41701958 408a095a 3fd823aa -> c1701958 c08a095a 3fd823aa", + "c137198b c07e8fc5 3d7bbdb2 -> 4137198b 407e8fc5 3d7bbdb2", + "41950eae bf63d3b8 3cb02956 -> c1950eae 3f63d3b8 3cb02956", + "40edad98 c0621656 3a20cafa -> c0edad98 40621656 3a20cafa", + "411ac71e c08bb7cc 3b5e80ab -> c11ac71e 408bb7cc 3b5e80ab", + "419598ca bf9bf470 3cc01f08 -> c19598ca 3f9bf470 3cc01f08", + "c19fa724 406fda78 39bc1be6 -> 419fa724 c06fda78 39bc1be6", + "c12bcc8f 3fd19f94 40520744 -> 412bcc8f bfd19f94 40520744", + "c18c3a44 409f6f58 3abba5e9 -> 418c3a44 c09f6f58 3abba5e9", + "c0f7ae4c bf81d362 3c0a54cc -> 40f7ae4c 3f81d362 3c0a54cc", + "c1706d3d bf5dcf00 39b9bbde -> 41706d3d 3f5dcf00 39b9bbde", + "c1037c23 4037018a 3e0b5558 -> 41037c23 c037018a 3e0b5558", + "c0db917e 40916ccc 406a173c -> 40db917e c0916ccc 406a173c", + "413e35dc 4098326a 40a32c38 -> c13e35dc c098326a 40a32c38", + "3fbb4b70 3fda39a4 3f511369 -> bfbb4b70 bfda39a4 3f511369", + "4180d7fc 409b0840 3ec99c9a -> c180d7fc c09b0840 3ec99c9a", + "c0c2f534 4069b6e8 39240f54 -> 40c2f534 c069b6e8 39240f54", + "3ed5bc80 3faa94f0 3c1557ea -> bed5bc80 bfaa94f0 3c1557ea", + "4165258c 3fb7cbd8 3b0eb630 -> c165258c bfb7cbd8 3b0eb630", + "418d8800 c05ea503 39ada273 -> c18d8800 405ea503 39ada273", + "c0de0376 3fcbe908 38f1fbf6 -> 40de0376 bfcbe908 38f1fbf6", + "c18603c2 3f1d1020 3eedc8ca -> 418603c2 bf1d1020 3eedc8ca", + "c190bdf6 bf06f300 3b1fd3e7 -> 4190bdf6 3f06f300 3b1fd3e7", + "40e5a858 3fb1f4a0 3c57419f -> c0e5a858 bfb1f4a0 3c57419f", + "401d2ca0 c03d8422 40486d79 -> c01d2ca0 403d8422 40486d79", + "c1538a4d 3ff99408 41141678 -> 41538a4d bff99408 41141678", + "c172af00 c05a2480 38f5b5b6 -> 4172af00 405a2480 38f5b5b6", + "3ef82c00 4092d1ba 3d3e4106 -> bef82c00 c092d1ba 3d3e4106", + "c0c4953c 3f91c9bc 3f4b8e6f -> 40c4953c bf91c9bc 3f4b8e6f", + "410b768a bf2286c0 3a06fef1 -> c10b768a 3f2286c0 3a06fef1", + "c0b4480c bf91b17c 3f837ce7 -> 40b4480c 3f91b17c 3f837ce7", + "4145858c be964360 3b7a0d9f -> c145858c 3e964360 3b7a0d9f", + "41894d42 bee47880 39b82ebd -> c1894d42 3ee47880 39b82ebd", + "c1904f74 40632be4 3d46c079 -> 41904f74 c0632be4 3d46c079", + "c0157768 3fd76274 3ab11e7c -> 40157768 bfd76274 3ab11e7c", + "40936bfc 408fb15e 3c65ccd1 -> c0936bfc c08fb15e 3c65ccd1", + "be9380c0 3ff15fb4 40b11687 -> 3e9380c0 bff15fb4 40b11687", + "c110700c 404dbf00 41138d90 -> 4110700c c04dbf00 41138d90", + "c1831e55 40493ce8 3ea2d561 -> 41831e55 c0493ce8 3ea2d561", + "bf56aa20 4016431a 40aec135 -> 3f56aa20 c016431a 40aec135", + "41910dd2 bfd9e4ec 38ed67e1 -> c1910dd2 3fd9e4ec 38ed67e1", + "c1698cc3 bfe60f9c 3af0dbee -> 41698cc3 3fe60f9c 3af0dbee", + "409b5b2c 4021c59c 3eed5d61 -> c09b5b2c c021c59c 3eed5d61", + "40541550 c02624d2 3acecb9f -> c0541550 402624d2 3acecb9f", + "4175da2c c089080c 3b59809f -> c175da2c 4089080c 3b59809f", + "bf6ff0e0 c0897064 3b39dbfd -> 3f6ff0e0 40897064 3b39dbfd", + "c0f6ba64 4013ff64 3e581088 -> 40f6ba64 c013ff64 3e581088", + "c0bf19ac c02fed6f 3f0c95c5 -> 40bf19ac 402fed6f 3f0c95c5", + "c1440046 c084d9fe 3d886735 -> 41440046 4084d9fe 3d886735", + "4145ff20 400bc234 3e439bc3 -> c145ff20 c00bc234 3e439bc3", + "40943e80 beffd6c0 3ecd39b9 -> c0943e80 3effd6c0 3ecd39b9", + "c1588660 c0815d46 3d2d1878 -> 41588660 40815d46 3d2d1878", + "3f874290 bff7a22e 3bb41522 -> bf874290 3ff7a22e 3bb41522", + "419774c6 409e0434 3a7b211e -> c19774c6 c09e0434 3a7b211e", + "40fb14a4 40832f52 3c8ea506 -> c0fb14a4 c0832f52 3c8ea506", + "4105c2d2 bf8c946e 3f0f772b -> c105c2d2 3f8c946e 3f0f772b", + "40f19fc4 3f9184cc 3f063e8c -> c0f19fc4 bf9184cc 3f063e8c", + "c06684a0 c0520d70 38da6f3d -> 406684a0 40520d70 38da6f3d", + "c10b22f7 3f8350f4 39aeed08 -> 410b22f7 bf8350f4 39aeed08", + "c117c988 408d39c2 3ac5141e -> 4117c988 c08d39c2 3ac5141e", + "40f0d594 4047ae78 391bcdd9 -> c0f0d594 c047ae78 391bcdd9", + "c1875b32 4095730a 3f65218c -> 41875b32 c095730a 3f65218c", + "3f42b3e0 400e608c 40f2db8f -> bf42b3e0 c00e608c 40f2db8f", + "41329144 40900c50 3f2912a2 -> c1329144 c0900c50 3f2912a2", + "418d9c98 bfd48d7c 3ef92b62 -> c18d9c98 3fd48d7c 3ef92b62", + "bfa0d7f0 3fc5d1b0 3b76c3ca -> 3fa0d7f0 bfc5d1b0 3b76c3ca", + "c1002637 be1c3180 3e984442 -> 41002637 3e1c3180 3e984442", + "41499930 c072d0c4 39aefc40 -> c1499930 4072d0c4 39aefc40", + "4183ee7e c03c3f97 3b215064 -> c183ee7e 403c3f97 3b215064", + "410aea1e 40729c98 3cef6591 -> c10aea1e c0729c98 3cef6591" + ] + }, + { + "glsl": "vec3 cultmath_af_scale(vec3, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c04b7280 c0174e26 3bdb8610 c0465c1e -> 411da3c4 40ea79c6 3caa3b15", + "c109813e c04ba610 3a29032c 3f740248 -> c1031069 c0421c18 3a23e6ef", + "418dbc48 3fc9fd4c 3a699a57 3fabbb98 -> 41be2942 40078036 3a9ff1b6", + "412f24a4 40831f50 3e54cdf3 4075bde8 -> 42281ffe 417bbc79 3f4c4a9f", + "bfa6d2d0 40583950 3b0c439a 4020c66c -> c0518a1f 4107cb6a 3bb08c11", + "418f5fd0 4039470e 40d128f4 beb1d5b8 -> c0c731e1 bf80b4ce 40114c14", + "3fd0af80 406ed19c 3e92a609 405c02e0 -> 40b3592a 414d3ed1 3f7c11e2", + "c1569360 402725ac 3d14f0a7 401a9a7e -> c2019626 40c9e311 3db3f8b3", + "415bc3f4 be2f2880 3bcb2c4b 3fbf0ad8 -> 41a40082 be82b6a3 3c17f1b6", + "c081962e 40532c58 3937e56c 3ee3ed20 -> bfe6c066 3fbc03ec 38aa45e0", + "c0f7696a c094abef 3bee0858 3f915e9c -> c10c7e25 c0a8d8a8 3c0762f5", + "c1035aae c0975f81 3928c3b8 c0140c4e -> 4197ed7a 412f14fa 39d22a12", + "c016a7d0 408a57cc 3efc0dbe bef42b00 -> 3f8fb140 c003f2eb 3e70684a", + "bffb14d0 c08b2db8 3d59b415 3f862d50 -> c0039956 c091e522 3d643c43", + "c0ff55b0 4082c264 3d940e76 bf343c54 -> 40b3c46c c0381efe 3d5082aa", + "bec4a980 c02b69e2 3c9947dd c022f0e2 -> 3f7a589f 40da3497 3d432741", + "c162c4c9 bf8f5310 3fa95e3b bfd64152 -> 41bdca5d 3fefe803 400dc06b", + "400342f0 4098a180 3da4f2fc 3f8cc214 -> 4010583c 40a7d811 3db567a9", + "4138fed0 4006afae 3d0ce3ec 40534600 -> 4218ac9b 40de4f41 3de8a361", + "c053d138 bfe4fce6 3a28e98d 3de21840 -> bebb12c4 be4a3cf4 38964e6a", + "41545d14 be471620 3ce3157d c0090262 -> c1e34f93 3ed51963 3d732e1e", + "c198ba8d c0890aec 3bba6676 400e7f82 -> c22a0719 c11890a2 3c505392", + "418c180e 4011918e 3c0b85d4 bda196a0 -> bfb0db1d be37c461 3a308679", + "c11aca90 3faf1ab4 395e403c c059d575 -> 4203b6c5 c094ffa4 3a46833b", + "404f5028 c046178a 3cf837c0 40503f16 -> 4128a437 c12123f1 3dc9f4d2", + "c13e504d 40205d5c 3e4b4e18 be92b940 -> 405a2707 bf37d294 3d690f7f", + "c0be91bc c07f5e8a 3e38e9b1 3ff64924 -> c137567d c0f5adce 3eb1e7d4", + "4013df50 3fa98bb0 3a999848 40757616 -> 410dc8ed 40a290e4 3b93b528", + "411df382 c08d6f06 3da30245 c07af655 -> c21ad7c9 418aa684 3e9fd41d", + "411be890 c031e8ee 3a239224 c05a258e -> c204daea 41179a74 3b0e0d81", + "c19426a1 c091470c 3bbeaf11 4025cc22 -> c23fe610 c13c2d45 3c77ecc7", + "4068c580 c082dbd2 3c0120ea c0320ba2 -> c121e3e7 41360595 3cb3c88a", + "40b9daa8 bf2c21c8 3b953249 c00be3d0 -> c14b1e3a 3fbc1f0b 3c2346d8", + "414fe1a0 c01cbd91 3b6bab82 c05666a0 -> c22e19f2 4103454d 3c462ed0", + "414d6eb8 c09832c0 40232889 4057edf4 -> 422d46f0 c1806017 41099ef7", + "c04bc148 3f8d6c08 3aa610c8 bfc755fa -> 409ea7ad bfdc3cf2 3b01b9b5", + "3f0c0f00 bf6f07f0 3f0554e9 c0198a04 -> bfa800f3 400f5c9c 3f9fef68", + "c18de15c c08e44de 3b93f4ac bf906b3e -> 41a01467 40a084ac 3ba7b778", + "c195efc5 bf46c490 400ec9ed c02fce90 -> 424defc6 400880c0 40c41ef7", + "c0831366 4056e0b8 4014beb9 bff5b528 -> 40fb9ca4 c0ce3d1f 408ec3ef", + "410ddd98 bc16fe00 399d16a1 c03fffc7 -> c1d4cc25 3ce27cbd 3a7249e1", + "c0fefb3a 409bd6b2 3a1b6f6b bd87e4a0 -> 3f075a33 bea572c9 38286d7d", + "411dfcb4 bc2fa400 3a6690e6 3fe07ce8 -> 418a8a33 bc9a0533 3acc5a17", + "c0cbdda0 c0282171 3e3da2bc bf1670dc -> 406f9b78 3fc59b6f 3ddee49c", + "41504a5c c090c19a 3b68eb97 c021a3b6 -> c20383f7 4136cca8 3c13c25e", + "c0c2e880 c04d4f9c 399da94a 3f37e368 -> c08c0157 c0137a4a 39692e24", + "c17ed510 4097433e 3a786b98 bf47c3f0 -> 4146daab c06c1216 3a45e14f", + "c092b35c c05d188c 3e86214e 4078719a -> c18e5edb c15691e4 3f822ccb", + "c15f472f 3f9b2e38 3a832e5f 4057b88a -> c23c25bc 4082c3ae 3b60470b", + "3f1b5a00 c0816c5d 38dcf80a 3e5a93c0 -> 3e04a44d bf5d01f3 37c49c25", + "c11eb3f7 c01ef476 3c974152 3eec52b0 -> c092812a bf92bcb4 3c0bb802", + "416a98e8 3f8efd18 39015aa2 40169b20 -> 420a03c0 40283de2 39aac3f7", + "412c0d7c bf118278 3b945c28 bf99a400 -> c14e848f 3f2ea863 3bb28101", + "3f8313e0 3ff1dca4 40693c76 3eadee20 -> 3eb21cb6 3f245314 3f9e76e1", + "c0772cb0 3d625480 3908ed09 bfb0068e -> 40a9f50d bd9b9fe4 3941b017", + "413aaa9c 40215f36 39b24c72 3f3d10c8 -> 4109dc32 3fee5bbe 3988eb66", + "4149c6f0 c03db0a5 3d8dd901 3fe0c350 -> 41b12804 c0a68b49 3df921ef", + "c19416a5 40149ab4 4066b1c5 3feb6b50 -> c2082edd 4088a84e 40d4263e", + "c192358a 40356ab2 4092b9c2 c04ecca2 -> 426c37e8 c1128cdf 416d0dd9", + "4110999c 3ec23a20 3ed38e3f bda1f620 -> bf36f742 bcf5c295 3d05d8a2", + "41916d5a bf7cfc88 3e16cf56 40626bf4 -> 42809fdd c05fc19f 3f0566e7", + "414ef404 bfd4e02a 3ca2c6ed be9af010 -> c07a81b8 3f00d679 3bc52c01", + "4105b414 3fc9bd48 3d1f231f c07b0fc2 -> c2031fca c0c5d901 3e1c1b02", + "c188d708 3fe1d7f4 3ef24be8 ba756000 -> 3c83291b bad8785d 39e83fd2", + "c162ff36 40670188 3f03ed8b 3fa6dc14 -> c193f4a2 40969196 3f2bfc63", + "c1920b59 c000ce4a 3f1be9d3 c06d3dc6 -> 428757bf 40eebc1f 40107e4e", + "3fa2c240 3f81a0c0 3b6048d7 3ff7f2dc -> 401da3d3 3ffb1a25 3bd95e81", + "41244700 404a62d0 3f9ad306 403b2474 -> 41f02e83 4113f300 40625d0d", + "4134ab2a 3ea947a0 3bf1e884 bf604734 -> c11e4805 be944dc1 3bd4403e", + "c1742612 c056fc30 3f330ff4 be16d960 -> 400fdd9e 3efd5ca1 3dd30835", + "411c23d6 c07c353e 38ece3e6 bf768c94 -> c116602e 4072e5a9 38fe8856", + "c136d725 40808d66 3e46941e bf888b48 -> 41430b8c c089221e 3e53d9a0", + "c1907f1e bf2d1608 40b59155 403ae012 -> c252f5aa bffcb303 41848aa8", + "413d2144 c08cb5b2 3c8bedae 3f9f74c8 -> 416b9be0 c0af4a14 3cae795b", + "40b8a358 3f784a00 3c38c46b c00e49e2 -> c14d3fc9 c00a00b4 3ccd8292", + "c1976a55 400b33bc 3eac7901 40490dce -> c26dd54e 40daa641 3f87766a", + "415a4b0c 3fc30890 3ab39510 3ea10640 -> 40894e87 3ef55a4b 39e44ce2", + "c0fc6a74 bfc701a2 3c043463 407663fa -> c1f2f0df c0bf894a 3cfec4b6", + "c1828fda c0191106 407bd08f 40601870 -> c26494ab c105fd82 415c6ed6", + "c1079448 bf9d09c0 3fa5843b 3f852f28 -> c10d1206 bfa365fc 3fac38bc", + "418dff9e 408cddd0 3e968fe2 bfb3ec00 -> c1c79946 c0c601ea 3ed3a6c1", + "4169e368 40907dc2 396abd17 3fe35748 -> 41cfb463 410050c6 39e1738d", + "c1844d10 400b7838 3f09dc91 3e305f20 -> c0364c48 3ec02cf3 3dbdf765", + "41225526 3eefecb0 3c99e16a c072731e -> c219bd7d bfe339a2 3d91d06c", + "c07ee2f0 c0748b44 3d49d85d 3efdb6e0 -> bffc9c5c bff25c53 3cc812cc", + "40df3350 c07457d6 395ab73b 3fd0d0ec -> 41360fd8 c0c74ec6 39bb3523", + "c18fac34 4096413a 3f3b98a0 3e8e0eb0 -> c09f7386 3fa6c19a 3e503477", + "c165911a 3db49140 3be18eb3 bfeea8ba -> 41d60434 be28560c 3c52b30c", + "412fc890 40337130 3b218428 c053a6a3 -> c21154bb c1145b18 3c063f84", + "c1986126 bf981204 390f78a8 404772d4 -> c26d6fbc c06cf46e 39ff1638", + "4052dff0 3d5aa600 3c965e4d 3f2dd500 -> 400f30ca 3d14781a 3c4c3ed2", + "407b9c70 40664b78 3ab41230 3eb8de10 -> 3fb5b2b2 3fa64e02 3a02b74e", + "4143e34c 407b359c 3d46e453 c028d403 -> c2012f64 c125ab3a 3e033540", + "4158d21c c0195aa6 40c02050 4026ac0e -> 420d29f7 c0c7afb2 417a2c61", + "4170dd74 409cb9ba 3b18596f 404ab3f6 -> 423eb810 41783172 3bf33ced", + "c14dbc48 3eb4d010 3da403e0 3f1f3778 -> c0ffe909 3e60e8cf 3d4c0c28", + "c0bf8a1a be53e780 3f0adc72 40724ffa -> c1b54c63 bf48930a 4003702b", + "c11426d4 bfa8c80e 38d83727 c076262d -> 420e7368 40a24969 39e43cde", + "c182fc90 3fbeb2fc 40fced52 c02973f2 -> 422d681d c07c750e 41a76b5b", + "40d3ca20 be574620 39b0e8f1 c01e1cb2 -> c182ce7d 3f04f569 3a5ebef1", + "411adaa0 c02e2ae9 3ee1105c c0009ef8 -> c19b9af2 40af0337 3f62297d", + "4196e6a2 c041b9b8 3c628f02 3de9ebc0 -> 4009e2e0 beb1046f 3acf54db", + "414fcd60 bef19530 3a9384e1 c06e9164 -> c241a6f4 3fe121e6 3b8b0aba", + "c17aedea c06bf316 3eb7c9d1 c067e804 -> 4263501a 4155be31 3fa67fe9", + "4187e17a 407001c0 3ac30824 c0431524 -> c24f17f1 c136e527 3b9698fb", + "c177b368 c01d3c25 3b1e5655 befe3788 -> 40f5f9bc 3f9c23c8 3a9e590e", + "41798338 3e387000 39831367 c01ed2b6 -> c21acc5c bee4d9de 3a2c6d24", + "c10c473e 403774c0 3a25895c bf522d50 -> 40e6568a c0169e3e 3a0a4b4e", + "4175d7f8 c085bb9d 3a1a438f 4066bee6 -> 425d975c c1711491 3b0f7336", + "41444b00 bfd72348 3ddbe538 c031a2ab -> c2083496 40954819 3e989a16", + "c18fa175 c02b2457 3a11042f 4021a310 -> c235600f c0d81dbb 3abda32b", + "c15af646 4095f410 40668cd2 406b2e5e -> c24927bb 4189c234 4153cd58", + "418c26d6 408a6750 3ada8df0 4014b5d8 -> 4222d403 4120cc14 3b808b64", + "c1238bfe 409bbaf2 3981060a bdca85e0 -> 3f8161fd bef665e7 37d8143e", + "419065c8 c005f854 3bcc34cc bebe3e50 -> c0d69d60 3f471dd5 3b1838ae", + "c174a9d5 c027742b 3ac0ac51 c06c85e6 -> 42620c88 411ab6ad 3bb41521", + "c104a4a6 40484068 3a1345bf c072c55a -> 41fb93cd c13de742 3b0e5e8f", + "4198c34a 40269d32 3ad09309 3f3ddb78 -> 41629649 3ff721c9 3a9cb25c", + "c113f251 c085ee87 3964f13a 4042c0c0 -> c1e11a0c c14bc733 3a386327", + "c17c52be bec81260 3b24bd40 4057af44 -> c254963d bfa89068 3c0ba59d", + "40889198 c07309d9 3aee07dd bf9b562a -> c0a5bc3d 409378c4 3b110b85", + "3fd84500 bfa6e298 3a1872be 404b81a8 -> 40abec40 c084aa34 3af3910b", + "c19ec362 3fd4df20 411ef560 3e035dc0 -> c022f03e 3e5a7844 3fa323ad", + "41975c24 c05e5230 391d82ea 40202768 -> 423d61c6 c10b1597 39e11914", + "419fb89a c0794208 3d28b3bf bf9ebde2 -> c1c614cf 409a8fa3 3d5155c7", + "414bf5d8 4076b4e4 4101fbfc c0250c6c -> c2037f5a c11f0e90 41a79b90", + "40f5f744 3fc22f14 3d26209e c02c8bf4 -> c1a5c899 c082e1ca 3ddffdee", + "418606b6 c0416166 3c050302 bd9e9d00 -> bfa614ad 3e6fa16b 3a2534eb", + "c19c9af6 bf1f9400 3fdb8979 407eb336 -> c29bcf61 c01ec48e 40da6cc3", + "419bb072 40768050 3cf6d3e2 4058a3b8 -> 4283c071 415099e8 3dd10823", + "40ccc520 c01e6fc8 39070a7e bfc174c2 -> c11abe02 406f7511 395982c1", + "4126fa22 400f8fa6 3e0079b0 c044801a -> c2002b10 c0dc63a3 3ec53fd3", + "c1913dc6 c01cc8c4 40231678 407d8c3c -> c28fd99d c11b484c 412186e7", + "418c269c 408b3a24 39aac672 3fe28644 -> 41f8072e 40f664b2 3a20c9ce", + "c1677d39 c08842c4 3e4370f3 4047f410 -> c234cf09 c154db9d 3f18aad3", + "415eb918 409cc664 40fa3db3 401caee8 -> 420850f6 413fe804 419928b3", + "c109f9f4 3dbaa640 3d09e0fd 3e90bb70 -> c01c033e 3cd30c5a 3c1bf0e8", + "c0f89f4e c093e0c2 3fad355d c045a5ad -> 41bff37e 41645752 4085ba7e", + "4092dbf0 3f7f8f50 3e883b83 3f07aba0 -> 401ba8e1 3f076fe8 3e106635", + "4168a4d0 3fdab8b0 3c46a8de 406f8996 -> 4259aee7 40cca7f9 3d3a1f49", + "c195c261 bf722910 39c9581d 3fa7bd18 -> c1c440d8 bf9eaba8 3a0a5e99", + "c0eac23e bf910b8e 3d6ca53f c05954f6 -> 41c74c90 407645dd 3e48edd9", + "c0d31478 c06f9674 3ffcf19c 40531ebc -> c1ae1336 c14595c5 40d099d3", + "c12d6e35 3f86bdd8 3978ffa5 3fae22dc -> c16bf10b 3fb74ec4 39b1768c", + "c110c470 c035ca8f 390e89bc bffe2b4a -> 418fbb62 40b47db7 39995279", + "c133e99a c085007f 3f905bba c07bc806 -> 4230f29d 4182cf68 408dfb3c", + "c0366490 402b0ed2 3c02dbef bfa5bdc4 -> 406c2c09 c05d7eb5 3c298e28", + "c11ff27b 3eb9fcc0 3ff8bf1c be857078 -> 4026be7e bdc1e40b 3f01a8c5", + "40c98840 3ff10510 3ffb1cde beeb1dc8 -> c0391785 bf5d5bb0 3f66a101", + "416ec02c bfed030c 3ce55d4d 404ba30e -> 423dea74 c0bc8860 3db68dce", + "41922a46 bf337230 3a836fbc c023c75c -> c23b057c 3fe59ae6 3b2b35d4", + "c14d9ec2 408474fa 402a32fe c07b272a -> 4249ba1d c181f2f5 4126fa56", + "3f7d0440 c09b3785 3b3dfa25 3f971898 -> 3f9555d0 c0b73952 3b60afed", + "40b896b8 c0566e9a 3f0e3eef 40653030 -> 41a54191 c13ff94d 3ffeb33a", + "407318d8 c07a795c 3ac43cd1 3eca0060 -> 3fbfd1f6 bfc5a421 3a1b9b0c", + "c19e038d c036e8c0 3fab8f56 4018f824 -> c23cd68b c0da96fa 404d07b1", + "c1148591 bf8a9260 3af699bf 3ea6c820 -> c041856e beb48e7c 3a21809a", + "411de914 3fa9a070 3f775434 406afdaa -> 4210f384 409bb4bb 406308bd", + "4110f9ae c06d7ad6 3b43b313 4013f58e -> 41a794dd c1094153 3be3235a", + "4175d77c 3fa6d174 3fb3cf86 3df2e440 -> 3fe940e5 3e1e46bc 3e2a9b07", + "4174afb4 bfa51b74 3f956940 c0079c5a -> c2019e19 402eeca2 401e4c19", + "c123ea7a c0398042 3fa7368c bd75db00 -> 3f1d6ba0 3e322670 3da096af", + "418c9678 40837cce 3fdd83f2 40076138 -> 4214b17a 410b117f 406a4a2e", + "c186786c 408cd5da 40379082 3ff86214 -> c202782d 4108a520 40b21aaf", + "4085b654 bf7c3a98 4068dd6a 4012eebe -> 41197d5d c010c4a4 4105a785", + "40cb8f50 bfc76050 3b06f07a 4048ccd8 -> 419faad8 c09c62c7 3bd47683", + "c13484aa bfd52606 4080ea48 3dfa3840 -> bfb07138 be5055f7 3efc027e", + "416cc100 40933152 3959d5bc 406de462 -> 425c01e4 4188c7f9 3a5c73a0", + "c10d5e16 400cf26a 3e5d72ab 3f8a7100 -> c118e63d 401871c8 3e6f862b", + "c07e0780 3f672ee0 3d73aa55 c0626aa6 -> 4160ac73 c04c77b1 3e57863f", + "402f6ef8 4027ef92 3dd0154a 402bf2c6 -> 40ebaafc 40e19892 3e8bc563", + "41365314 c09591f3 401f431e 4012a4ca -> 41d0e17d c12b5b08 40b675ed", + "c1280dc2 3f064c60 3a5b59f6 be0e17d0 -> 3fba8e87 bd9515b6 38f6902b", + "410b9c5c c09262da 3ff35221 3e9bff20 -> 402a259c bfb2677a 3f144581", + "c17ab3b1 4086cc8a 38ffa031 4052206e -> c24dc729 415d49b9 39f2750a", + "c106f5f1 bff5d648 3e04c8ad 40756ea2 -> c20163b3 c0ebb051 3efe9fe7", + "415e54dc 40751fa8 3cdab8bb bf8fd202 -> c179cf94 c089b5c5 3cf5e920", + "c11134a6 c01bf3b5 3ba7a6f1 c078c071 -> 420d1828 41178953 3ca34148", + "415dd0b4 4062d1ac 3aa216ed 404b1344 -> 422ff530 4133ed55 3b824e4a", + "411b6d84 bf3b2600 39b457b9 c0211a36 -> c1c39f94 3feb8c1f 3a698e16", + "bfea0780 c069d84d 3b209b0f bfbae9c2 -> 402adf25 40aabcaf 3b6b06c4", + "41304ade 3f4efa68 3adfdacb c006e04e -> c1b9c34f bfda18d9 3b6d702c", + "41693d28 c06d7f85 3d309599 be27bf60 -> c018d541 3f1b9fbb 3be78337", + "403b2a08 3fb8f038 3f3273ab bff52830 -> c0b33c9b c0311aee 3faae504", + "c1668227 3f9c3014 410c1151 404dc2be -> c2394593 407b12a1 41e128fd", + "3ff223e0 3e491300 3d16f465 40765190 -> 40e8fb9f 3f417852 3e1140fc", + "c1392c12 c052f7ac 3e1b1c55 403a3bc0 -> c206b53d c1197930 3ee1b30a", + "414f6b9c 4092ee96 3f72517b 3fb9bc80 -> 41967d7e 40d53536 3fafd026", + "4148ec1c 405461fc 3c9c4c36 c030e482 -> c20ad5ac c112c0f0 3d582bc0", + "c1965f8c bff9785e 3a89187a bfef0f92 -> 420c6c59 4068f68c 3b027228", + "40aebd10 c020d001 3cf4e2bf c0362a80 -> c178aed8 40e4dd26 3dae4d3f", + "4112d1fa 4067da20 3c83683b c01885ee -> c1aef2f8 c10a22cf 3d1cb3cf", + "c1848f7a 409283e6 3f1baf14 c0422207 -> 42490cb2 c15e36dc 3fec20cd", + "c01d9068 c03c8674 3e1eb280 405e8b1a -> c108f8d8 c123e309 3f09f63b", + "409b4a24 c00211fd 39b34b3e 3f573b58 -> 40828f44 bfdab685 3999a2be", + "418e5494 bf961320 3c3d257b 404f7ffa -> 4266bb15 c07348fa 3d198d62", + "c0d4e3c2 405d2484 3e59e04a 3ff70da0 -> c14d7315 40d56a00 3ed2457d", + "c147715e 3f921c88 3aba3964 402b61a0 -> c20584c8 4043a18e 3b7b9dbf", + "c0519d80 400e0454 3b0b1680 bfce459c -> 40a8e5bc c064dc33 3b60b192", + "c1982735 bfa7907c 3aeda598 bf9b3d1c -> 41b8881e 3fcb38f6 3b11a67d", + "4112c360 bf290c98 3f46b16a 403b830c -> 41d6ffb0 bff7a579 401189cb", + "c13e7d10 3fdf39c8 3ad6ddb3 3f5e3b60 -> c1255ca2 3fc1c7e1 3abc014e", + "c143f8c4 3e5bb9c0 3d3dcc73 3feeeb08 -> c1b6e532 3ecd106b 3db12e01", + "c1411628 3f7cf380 3b851f1f bffc2640 -> 41be2ea9 bff9257d 3c03856f", + "415733fc 3f65fe78 3f907e11 40448ac6 -> 42253875 40309381 405dde6f", + "c1421ed1 3fffb8dc 38f5a2ff be68a940 -> 40306c44 bee86898 37f8ed56", + "411181d4 4087101a 3ea70cb4 3fddbf50 -> 417c13a3 40e9fbab 3f10b448", + "418cd254 bfcd737c 40636e14 bffdb782 -> c20b90cf 404b9e67 40e1672b", + "c19192fc 4025602a 40192157 3db13b40 -> bfc990a3 3e64fb87 3e54077c", + "40861998 3eecc1a0 3ea76d90 3fa31b94 -> 40aae17c 3f16d8ca 3ed55a63", + "40835530 c08dbccf 3d5fb82e 3faaeb3c -> 40af5e80 c0bd433e 3d95639d", + "c1861784 bce67600 3e1bc099 40237c98 -> c22b4478 bd932d4c 3ec6f447", + "c07fa318 c09c4999 3ca7da58 bf05c680 -> 400595f3 402356d7 3c2f7fc7", + "4015ec08 bfa932fc 3a1659a5 c070e0d7 -> c10d10f4 409f3467 3b0e54cb", + "c04c3470 bff7d246 3a01b2ee bfe0fba0 -> 40b37699 4059cb93 3a6638de", + "4196f006 3e8712c0 3e612cf0 4035672e -> 4255e914 3f3f6d65 3f1f92f5", + "408e7ea0 c00c3003 3e8d6724 bef62870 -> c0090430 3f86cc48 3e07f848", + "410ebdb6 404700cc 3e34001e bfd706be -> c16fca2c c0a726e9 3e973367", + "4177a298 c05f347c 3b2709f7 c038842a -> c2327cb6 4120e0f5 3bf28045", + "c15e84db bfc41222 3c131881 c00a2768 -> 41f02bbd 40539fe9 3c9f0666", + "c1092ffa 40756118 3b7a55c6 405b5fe2 -> c1eb1eda 415245f7 3c572f51", + "417165c0 be7b5ae0 3e9685d0 3fb585a4 -> 41ab2af5 beb23a78 3ed57925", + "40888f14 405d9838 3994c343 bfce7682 -> c0dc44b3 c0b2b712 39f62ff9", + "c06d2720 bf4616d0 3e8c6064 c058f966 -> 4149000d 4027e43b 3f6df52e", + "c08e8f0a 3ff740a0 3946dbdf 40199a62 -> c12b12eb 40945abb 39f64cba", + "4145ba38 c042397f 399ed699 3f36ae28 -> 410d18e7 c00a9902 396dad40", + "c0afdcfc c051bb47 3d6071fb bf3dce70 -> 408263f7 401b8064 3d266fb0", + "c1844e2e c09c2116 401bb2a7 c05a69a3 -> 4261c257 4185349a 4104d6b3", + "41850a88 4082c99e 41166f3c c052cda4 -> c25b1b04 c15764e6 41f7c05f", + "c1399e00 4019960e 40f5e4b1 c03a6f33 -> 42072d6c c0dfb37a 41b31318", + "405f76c0 c09c7d55 3fbba006 4040eacc -> 41286605 c16bdb0e 408d6455", + "410d0760 bfbf3548 4025be41 be923160 -> c02112d0 3eda6288 3f3d4d2c", + "bfba2d60 c03cc562 3f119c63 bea75440 -> 3ef361be 3f76c5c6 3e3e5a49", + "c1059cc5 3f680350 3c512d72 c0525ec9 -> 41db9824 c03ea89f 3d2c0332", + "4137c30e 401169ec 3d8a3cbd 3fd1ce70 -> 41969a6e 406e5979 3de2a174", + "4188dd78 c008bd31 3db80d31 3f41b8b0 -> 414f2369 bfcef290 3d8b4e0b", + "41961634 c09a8144 3c0621ce bc30d000 -> be4f526c 3d556cd0 38b9cad4", + "c03861a0 3f7e48f0 400938f7 3f983714 -> c05b4345 3f973204 40232ece", + "410a4514 40864f5a 3a97bc47 401890b4 -> 41a4ce58 41201611 3b36c4dc", + "c0aef744 c0338776 400d616b c079dcb0 -> 41aac556 412f3986 4109fdcb", + "c106a0d7 c0854c73 40a75403 40435406 -> c1cd7167 c14b69f8 417f580a", + "c118e47e bf51bc20 3f508580 bfb312d4 -> 4155e606 3f92b5f7 3f91dd2c", + "bf0014a0 4081c498 3b51ff55 be0d3230 -> 3d8d48f0 bf0f2571 39e7f610", + "c150904b c011c5cb 3a8ffe76 bfcbd4fe -> 41a60ff2 40682241 3ae85989", + "c04c2a30 c0274796 405d535d 3fd00fd8 -> c0a5eeea c087f484 40b3e18c", + "4195c23e bf947ad8 391f511e 403a867a -> 425a3b98 c0585e80 3a0290bf", + "c0ce5746 c07e801b 3f04f7df bf83925c -> 40d41941 4082cd0e 3f08ae6d", + "c09c44f0 3f9dbf48 3ed9f02d 3f0a8810 -> c0292070 3f2ab9e9 3e6bdf7e", + "41655ae0 3f09e8d0 3c4346a6 40304312 -> 421dea91 3fbde861 3d069cba", + "c0c964b4 4005e6dc 3b985c98 3ed0afa0 -> c0242bfc 3f5a4edf 3af8d4f3", + "c1299b43 c08d99ae 38ee76f8 3e37eb80 -> bff3b406 bf4b763d 37c0e967", + "c10129a6 bf9523a6 3cc135f3 bee620d8 -> 406837fb 3f061129 3c2dbfe9", + "410764a4 4083c434 3bfd92dc c04029a4 -> c1cb4302 c145d12c 3cbea2fb", + "c0f1011a c055fadb 392e011e 404fb076 -> c1c38604 c12d9956 3a15fd76", + "c190eccc c0869977 3d53c72e c02eb6b6 -> 4245d0c4 4137b8bf 3e1097cc", + "40dff668 bf64af30 40ae4238 403a7f42 -> 41a3285d c02698f7 417de5a0" + ] + }, + { + "glsl": "vec3 cultmath_af_add_iv(vec3, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c14cfbf6 4015715c 3e079ba3 40762a88 40b8c0bc -> c1000676 4015715c 3f8c4aed", + "c0ae338e 4092a69c 3eb7d309 41819edf 4181ab55 -> 412c306d 4092a69c 3eb965c7", + "bfa2d6b0 40835bec 3befb189 3f057a33 3f16cf4d -> bf3788a0 40835bec 3d28a475", + "4191b318 3fa39a5c 3b4d8b6a 40cc680d 40cd177b -> 41c4e309 3fa39a5c 3c63521b", + "c122dfc9 3f817268 3af98ae6 40f61a4f 40f73c91 -> c01e2844 3f817268 3ca0d023", + "3ec4a940 403e2d6e 3b07cd20 c1556f56 c1556c46 -> c14f4884 403e2d6e 3b22216d", + "4170a038 404f908c 39baa597 c1620566 c161f036 -> 3f6a56a0 404f908c 3b41f94e", + "402593f0 4025d0f8 3fef1dd0 405e1d4a 405e76f6 -> 40c1ef08 4025d0f8 3fef77ec", + "41911d98 3fd561a4 3aa42457 4190566b 4192cb65 -> 42115740 3fd561a4 3e1e94e9", + "c16a9032 3ea7f220 3d3de3b7 3ef9464e 3f12c759 -> c16214de 3ea7f220 3db78a33", + "3f9e7370 bf9f1f5c 3f112411 bf51c87b bf320485 -> 3ef600c0 bf9f1f5c 3f21063f", + "40492b58 be659b40 4091bdad c1796839 c17951df -> c1471236 be659b40 4091d448", + "402ae328 3ff99948 3d5839ae 411343a6 4113ab8a -> 413e3062 3ff99948 3d862167", + "40b82940 404021e8 3ab0ad97 c1527845 c15277db -> c0ecc6e0 404021e8 3aba3f6b", + "c1426ac6 402f0ff8 3ebade69 c0f0d2ed c0efa73b -> c19d44a8 402f0ff8 3ec43fc3", + "4049bd98 bf979118 3b51b905 419e7313 419e82ad -> 41b7b293 bf979118 3be70c3f", + "41989384 c01716ad 3f100333 404542ea 404fdaf6 -> 41b1e562 c01716ad 3f253513", + "3c3fa000 c08871e4 3e0f5c36 3f4bac8b 3fba8f1a -> 3f91b1f0 c08871e4 3ef120af", + "c18420a8 40518978 3f063644 c12d2c21 c12054e9 -> c1d780ea 40518978 3f6cf2a3", + "c11a9175 c071cb96 3ce490f7 bf84e009 bf84d9f7 -> c12b2d15 c071cb96 3ce5724c", + "c0d56436 bff735b4 3bd3c710 3eef823e 3ef42242 -> c0c64712 bff735b4 3c34063e", + "4124be76 3fd0efe8 3c7eeb31 4195e3ac 4195e400 -> 41e84311 3fd0efe8 3c80806f", + "c141ec9e c04f02f9 4099eee6 4115b19d 4115cecf -> c030b1a0 c04f02f9 409a0c41", + "c0fc6112 408e63b2 40d6d1fd c1a43fff c148992a -> c1c35e8e 408e63b2 412b5ca5", + "4033e1a8 c052926e 3e9dce6a c0b2bd99 bfed82fb -> bf68f2c0 c052926e 400b16d7", + "c0a7e880 c0968525 3cbdd936 3fa0c00e 3fa0fd32 -> c07f61b0 c0968525 3cc591aa", + "bfde2820 407b2d4c 3faea1e6 418d5507 418d555d -> 417ee560 407b2d4c 3faea5cd", + "40d983c0 40809694 3acb881b c15d54dd c1321629 -> c0b5e746 40809694 3fad2e79", + "4157b7f4 3fad12b8 3e4e4072 bf015747 bedf9973 -> 41502ed4 3fad12b8 3e715953", + "418360d4 407a37c0 38eb199c 416be125 416c45c3 -> 41f96a8e 407a37c0 3c4bd9a9", + "c0eeb1b2 c05ba444 3c28971b be8bd2ce be7cec64 -> c0f703fa c05ba444 3cbf4753", + "c1581fad 3f8ba4bc 40bed57a 407980f1 4079830f -> c119bf2d 3f8ba4bc 40bed62a", + "4111c8be c04640ed 405b4fe3 41087344 4109c554 -> 418d7285 c04640ed 405df486", + "c0fa33d8 bfc08fbc 4116a717 40ef3dc8 40f96fb8 -> be3ba300 bfc08fbc 411933a6", + "c07d76c0 400450b2 3f456b95 c13fd35f c13fd13b -> c17f2ffd 400450b2 3f457ea2", + "418b3786 3dd01d00 3a924c21 41597c11 41597c7f -> 41f7f5aa 3dd01d00 3a9ec23b", + "bf62bfc0 c099b22a 3dd6c8ee c1a31fec c17574d5 -> c1960329 c099b22a 40284d08", + "c10020c0 bdcd2dc0 3b985c1a c03bbf6c becc27a0 -> c11ac94c bdcd2dc0 3fa2d343", + "c18c8840 408ef4b2 3e23b860 c1560445 c15601bb -> c1f789c0 408ef4b2 3e2415dc", + "40bbf1c0 40121256 40ad0299 41818f17 4181934d -> 41b08da2 40121256 40ad0b61", + "401c2618 407d9064 3b8102a0 c1545735 c1545637 -> c12d4d30 407d9064 3b85db2d", + "4088ace8 bf9a64ec 3a867094 c0c0df2c c0bf1b9c -> bfdd41f0 bf9a64ec 3cea4104", + "40c2bed8 bf809316 39c5aeec 406e1ffb 407180b5 -> 411d5382 bf809316 3cdb6282", + "41052d14 3f5c6690 3fed4f9d 412f12b6 412f1d6e -> 419a2293 3f5c6690 3fed7b85", + "41494f80 c09adaf2 3d45023d 414532f6 4147baba -> 41c7e32c c09adaf2 3e0243ab", + "bfea38a0 c08ae2c0 3deaaa3a c192c6cc c192887a -> c1a14b2d c08ae2c0 3e04f45b", + "c13ba348 3f22c218 3b5aa28b 404512cd 40461ef3 -> c10a3d10 3f22c218 3c3ced2b", + "40510e78 40006d00 3c77bc88 41986420 41986db0 -> 41b28ab7 40006d00 3c8f550e", + "418688da c007d278 41044828 4183385b 41833b35 -> 4204e151 c007d278 41044b3e", + "40ce7218 405421ec 39344ef0 409abdcc 409b504c -> 4134bc92 405421ec 3c159f21", + "c18c9061 406fc0f8 3a401aff 409b1310 409ba190 -> c14b739a 406fc0f8 3c1ad707", + "3fe5fb50 bfb37efc 3d0f8f46 3f89224c 3f99c7b4 -> 403bb828 bfb37efc 3dccf5b5", + "3fd0dfa0 402b3c58 3a265b42 41621a30 41622f10 -> 417c4094 402b3c58 3b52a01d", + "c183a88c c081a188 3d48d46a c189ca49 c12b490a -> c1f35ff3 c081a188 4053bb3e", + "c19d9ff7 c05fe282 401be9f7 c01a8c5a c01a2136 -> c1b0ead0 c05fe282 401c2003", + "3f890fd0 c095914f 3e0aaee1 bf258410 40e53782 -> 408a8774 c095914f 408149a2", + "409d2e00 c099f3ce 410fc49b 4069076f 4069ff31 -> 4108f7d4 c099f3ce 410fe3ad", + "c0d6c884 bf8c0f94 3e858e4e c18307fe c154b0ab -> c1ac624b bf8c0f94 3fe6e21e", + "c131fce3 c0454ad4 405ca620 c0ca5871 c0accbff -> c187e300 c0454ad4 407a330b", + "c15e2aa4 c06e8ac7 39ea88f2 402fad6c 402fb5a4 -> c1323e42 c06e8ac7 3a3b6bbd", + "4029f070 c0043f58 4041b741 40ca5814 40cade94 -> 410fc9c6 c0043f58 40423e12", + "418360e0 409f20b6 3eed86e4 c13b0c2c c0f4c124 -> 40d816c2 409f20b6 401f0879", + "3efc4140 4015642e 408ad953 3fff667c 3fff69c4 -> 401f3c38 4015642e 408ad9d2", + "3f603900 40312eac 3d8fcc0c c0536431 c053625f -> c01b5508 40312eac 3d8fed75", + "40fd6d60 bf623db8 3c35b701 c1221fd0 c11a04bc -> bffadcb0 bf623db8 3e87609f", + "414a0ae8 c024b008 3d2a840e 40bbac60 40bbb598 -> 4193f1b3 c024b008 3d2ced08", + "c080a67e 4080caa4 394bc8f6 c0166ffe c015b392 -> c0cbaf62 4080caa4 3bc33041", + "c0da534c c0717886 3b968206 c16185bd c160d849 -> c1a72c54 c0717886 3cd36216", + "c0d34b5e 3fc95468 3c5a86b9 c13b1640 c13af390 -> c192554c 3fc95468 3c903283", + "beec2240 c016e0e7 3bc92a16 c0bba35c c0bb90c4 -> c0ca5c34 c016e0e7 3beece81", + "c09eb2a2 3f1476e8 3ebb66ef 40177ed2 401888ce -> c0256174 3f1476e8 3ebf8f9c", + "c15cf475 4075ff10 3e285a0a 41850120 418619cc -> 403899dc 4075ff10 3e6e8af9", + "40d6e390 be8839d0 398e2e84 c190cbe7 c19078a3 -> c135d2c2 be8839d0 3ca8fc3a", + "408c9980 3fe0e87c 3cdcbe33 c169a619 c1660add -> c1218bbb 3fe0e87c 3e0f05ed", + "c08107d4 bf0e4550 3c50f8b4 41790999 417ccd5f -> 413a6792 bf0e4550 3e058f54", + "c192f9c3 409bb6ea 3a84e9be 416b2889 416b3007 -> c06b1cf8 409bb6ea 3affb173", + "4003af38 40766f78 3a3a8965 c0b725af c087b159 -> c03b27d0 40766f78 3f3e00ce", + "415a8f08 c0468ba1 3cfe2194 419fc40a 419fc802 -> 420686c5 c0468ba1 3d034187", + "c00ca2d8 be51bb60 3c42e19f be0d5fe8 3fe66cdd -> bfaee540 be51bb60 3f7b24a6", + "4167618c 3f34d2c8 3bfb7125 40e1edb1 40fa1f67 -> 41af3269 3f34d2c8 3ec57f4f", + "41482ab0 40320492 3aa4c7c0 40c564eb 41075852 -> 419e980a 40320492 3f92c1a6", + "418a1c02 c06868c5 3fa254dd 41765b09 417684a7 -> 4202a9f7 c06868c5 3fa2fcfd", + "c154624a 3fea7128 3f41956b 40d30d41 40d30f37 -> c0d5b658 3fea7128 3f419e41", + "41350250 bffc39d8 3eb831f2 c1393067 c13527a7 -> be0a6dc0 bffc39d8 3ef8bfb7", + "c04c9e78 c04e7aba 3cde8c8e 41736ad1 4173704f -> 414045f2 c04e7aba 3ce44787", + "41864be8 c0969b34 404b37f3 c19991ab c1904cc1 -> bfea34e0 c0969b34 40704c11", + "bf9941c0 3f8c4d1c 3d1a64d5 c182b45f c1829405 -> c18c384e 3f8c4d1c 3d3ae1d7", + "412ee73c 3fd36cf8 3ce096a0 bfbedd0a 3fe25e4a -> 41311f50 3fd36cf8 3fd42085", + "4102f7cc bfa7821c 3dee9f21 407aa1c6 407aa65a -> 4141a0d0 bfa7821c 3deef119", + "41279eb6 40026d62 3f104346 c00d363f c00d3261 -> 410451a2 40026d62 3f104bd3", + "4015f9e0 4066096c 3a2b9dcb c19e38e8 c19e2c9e -> c18b7387 4066096c 3b72145d", + "40ad4ad4 c00589e8 3ba3544e c09307e4 3f97114e -> 406d5218 c00589e8 40391e17", + "4180b736 c028a337 3f5a09d7 c19b03e0 c16d77b4 -> bf828a70 c028a337 4047a2f7", + "4015dca8 c0548aa7 3e86a387 c12fe8af c12fdb55 -> c10a6ad8 c0548aa7 3e877c0f", + "c174b42c 4049d2c8 3a8f4754 c13553c3 c0718ceb -> c1b6c7d6 4049d2c8 4071f39d", + "c18fb348 3f241890 40321b95 413a26ba 413a7bee -> c0ca2a78 3f241890 4032c653", + "c135d595 c00d545f 3c9b39c0 41932b13 41932ee5 -> 40e108c6 c00d545f 3ca31511", + "408d9cb8 bf093308 3d10b403 410eb2e0 411f83b8 -> 415de9a8 bf093308 3f0f938f", + "bf38edc0 bfdf29e0 3914983f 4002f60d 4002f7b3 -> 3fa976e0 bfdf29e0 394e756c", + "bfa327e0 3f54ac68 3d4faf22 40d4831a 40d5f3f6 -> 40ac7190 3f54ac68 3d95f98e", + "4070a578 c099a8f4 3d2cb9fc c18ae188 c1343ae1 -> c128d59a c099a8f4 4045c3d5", + "411babb0 3fc22c78 3fe909c9 c1966eae c19667d8 -> c1112ad6 3fc22c78 3fe94172", + "c189305c bf79bd80 3d62227c 419c0f3e 419fe84a -> 40265b40 bf79bd80 3e9768cb", + "409d8598 4033d544 3facef50 414b86f4 414b9764 -> 418d28fc 4033d544 3fad3224", + "c1783c15 3fca9938 40af9a1b c073345d c021f963 -> c19570e6 3fca9938 40c3e916", + "413ae0c6 40367198 3e446b0e c0f2c661 c0f1abc7 -> 40838878 40367198 3e56185f", + "bfa48d50 c0989c5c 3aa97654 c12b2889 c1077efb -> c12de56c c0989c5c 3f8ed172", + "c14283ac 4022abaa 3b7197d6 c19f35a4 c19eec28 -> c200295e 4022abaa 3cb197fd", + "4192dc10 3f7191c0 3ccd062f c03e6b98 c020d0e8 -> 4179d090 3f7191c0 3e833d9c", + "c1868fbe 403170f6 391fc6a8 41495dfd 41497d8b -> c0876370 403170f6 3b83d303", + "40ef8b80 4024713a 3ed2ddb1 c0c570f4 c0c50b84 -> 3fa93510 4024713a 3ed60a80", + "418b6e62 c088faf4 39ade173 c0e48235 c0e47cbb -> 41249d08 c088faf4 3a33fe33", + "41929d0c 409e7062 3d505596 3e065cc4 3fd46c48 -> 4199c6cb 409e7062 3f50a7b4", + "c1909400 c04cb712 3b34731b c170fdba c1702f9a -> c2046faa c04cb712 3ce5152f", + "416c1724 bea589e0 3fa73855 c0f706db c0f6d21d -> 40e141cc bea589e0 3fa7a254", + "3f35f7a0 c04db2a9 3d1c9532 40e84a00 40f88d70 -> 41039556 c04db2a9 3e95b096", + "c19b4819 401f07f2 3fcf37fd 4185a359 418fc1df -> c004abe8 401f07f2 40101679", + "4106fd1a bfffd0d2 401a3fe0 41356b62 41801563 -> 41b0e417 bfffd0d2 4097dfae", + "c1708dc5 3fc00bf0 4111a4ff 4157cc42 4158ba26 -> bfc25488 3fc00bf0 41121c0b", + "41946bac c08f0373 40c3b924 40698fef 407a8f51 -> 41b2ada0 c08f0373 40c7f946", + "417f9798 bddb9c80 4069b771 c110ad37 c1101e77 -> 40de6382 bddb9c80 406ad540", + "c1338904 408acaca 3c44a75c 418e2a3d 41a7b1df -> 41025318 408acaca 3fcdc778", + "41248f6c 3f0dfa30 3c45ad7d 404d7b81 404d84bf -> 4157ef74 3f0dfa30 3c4a9195", + "c139cdda c05de6ed 3de02bd5 4101425f 4101441d -> c0622a70 c05de6ed 3de0a2ed", + "411ec068 bffb3bc6 3c8b4c2e c14660cb c1462f6d -> c01e1ed0 bffb3bc6 3cbccbe4", + "c133eed5 be777760 41071903 4122aa70 4122d270 -> bf898328 be777760 41072d17", + "bfb4cd10 c0325e70 40823e89 c1a58527 c198916d -> c1aa581b c0325e70 409c2660", + "3f8265a0 405707a4 3d8cd14f c04343b2 c03ccb8e -> bffda9a0 405707a4 3df457d1", + "4131678a 4075f1ac 40391db6 418d23e9 418d257b -> 41e5d877 4075f1ac 403924d3", + "402fcec0 c02a69dd 3c3b2a70 40f01ab8 40f04548 -> 41240bb0 c02a69dd 3c660c31", + "4146be48 bf0c3420 3af7d215 c06adebe 3f9484fc -> 4132aac0 bf0c3420 401aafe0", + "4074d5e0 c0922fd6 3ed15765 41653305 41653e83 -> 4191371e c0922fd6 3ed213f3", + "411bee72 408f7e8e 3e500a15 405c3e9c 405d36e4 -> 41531d22 408f7e8e 3e57d1ab", + "3fb76ed0 3faaedc0 3c3efeb0 411786ea 4119a7d6 -> 412f853a 3faaedc0 3da025d4", + "c0a1aaf6 3f5bae28 3a5733de c17f615d c17f4aab -> c1a815c0 3f5bae28 3b6dba4d", + "4168cebc bf62a268 3d0942f4 c1a29f44 c194cade -> c09d36cc bf62a268 3f65dc3f", + "419b3d84 c08b6ed5 3b49bb6b c0662f77 c060a659 -> 417da04e c08b6ed5 3d3dd751", + "c199c64c 40951c84 3c974d55 c18ad30b c18acf8f -> c2124bcc 40951c84 3c9eba8c", + "bf353a00 c07740ca 3eb4383a c178d0bd c159def5 -> c174ab79 c07740ca 3fa8d64f", + "41526a6c c03175d0 3b5e247f 3df2f93f 3e8ec6b0 -> 41559880 c03175d0 3dab0a22", + "418b3e68 404d0fbc 3e6dad45 c1a804d0 c15f835c -> bda4d700 404d0fbc 406fe7cc", + "c1302d42 c0181511 3a1adfe0 c17343e7 c17342f3 -> c1d1b858 c0181511 3a4452d4", + "c14a21ee 3ec33790 3eb36213 c19c9ddf c19c970d -> c200d5b6 3ec33790 3eb442e3", + "40e59838 3fc0f950 3aea2b63 419f935f 419fac2d -> 41d905d4 3fc0f950 3c013fd5", + "4032d358 c04ca450 3bb244f3 be9f9b4d be9f57b3 -> 401ee428 c04ca450 3bbae82e", + "c11994b2 4070f6c8 393517bd c1245251 c123af55 -> c19ecac2 4070f6c8 3ca4a9fe", + "40b4891c c07c849e 38d1e1c1 c0dd9a43 c051bde2 -> 3f0a6410 c07c849e 3fe97a55", + "c15694b3 bf8b58fa 3ac3ae77 c0155ace c014f032 -> c17bde13 bf8b58fa 3b9c20f7", + "41248878 40477a78 3b9831e1 419dcfda 419dd046 -> 41f0144c 40477a78 3b9d38be", + "418e22b8 bf73cd60 3e9f7d10 4153cba5 4153ced3 -> 41f80956 bf73cd60 3e9fb5a1", + "c14e123a 409723fe 3b612ad1 c183bd26 c183bcb0 -> c1eac608 409723fe 3b6bb378", + "41232120 be88ca40 3a5274b4 41851ae3 4187ec81 -> 41d81442 be88ca40 3e354511", + "c0c24814 c03674f2 40648139 407f660c 4080296a -> c004b3b8 c03674f2 4064f7cf", + "c186cea8 3ec2dd10 3b9d9e24 c180936a c1809264 -> c203b0c8 3ec2dd10 3ba7592e", + "c1078766 bf572928 3f8d6d4a 40ab191a 40b1737e -> c0419100 bf572928 3f9a2267", + "41253a5a 405dfd14 3bc0dd5d c032cba9 c032bb97 -> 40f112e4 405dfd14 3bd15dc7", + "41635ea8 c04e32e8 3a9e878c c18af503 c18aea83 -> c04a0378 c04e32e8 3b78bfcd", + "40d7f924 403edee8 4067b3d3 c0fe3dc9 c0fe38c3 -> bf990888 403edee8 4067b918", + "40f50928 c039771e 3b74c14d 4114b30a 4114b386 -> 41879bee c039771e 3b7a73a6", + "3fd7eb50 40805d8e 3eedf3fb bfd6eb90 40d25864 -> 40844994 40805d8e 4092e90a", + "c07058c8 c08a221a 3dcdf273 40c7ccd5 4110d4d2 -> 40791db0 c08a221a 3fc0995b", + "4127b80e c0574398 3e680a8c c036832f c0364711 -> 40f43d8c c0574398 3e69ef01", + "41829206 c073a22f 3f1136e6 40fe5edc 411d05fa -> 41c99f60 c073a22f 3fbff6e6", + "c152f122 409f7c34 3fd631df c1201e2e c115a300 -> c1b6e8dc 409f7c34 40000feb", + "c10c7c37 3fa1acfc 391cfb1e 418cf35c 418d1714 -> 410d8e39 3fa1acfc 3c11c2f2", + "c1870824 c07f09d7 397c76fb 409bc3d3 409bc6fd -> c1402d94 c07f09d7 39edea29", + "41647f40 c0776a70 3f6b9698 c0254e23 bfd598da -> 41427bee c0776a70 3fb04da2", + "4137a2da 3f45f670 3d2d5f25 c14fe814 c14ea32c -> bfbd1630 3f45f670 3da7f13d", + "3e500b00 c06e9a6c 3cd50028 419c4ce3 419c5081 -> 419deec8 c06e9a6c 3cdc923a", + "40389b10 becf9530 3dbbab36 4164c5b3 417f577d -> 41901aae becf9530 3f6c05eb", + "3fe02800 c08df1e5 3cc33fea 413c0e2d 4141483f -> 415ab036 c08df1e5 3e3fb1d5", + "41331352 c0955959 3e4bd629 c12db3a6 c11b672e -> 3f685e80 c0955959 3f455a5e", + "40cd83cc c0840df3 3939172b c0f1c494 c0f128ac -> bf8fcb50 c0840df3 3c1effa0", + "413c8e7c bfde076a 3b58c22d 41898bb1 41898c23 -> 41e7d328 bfde076a 3b62e0ba", + "406e4500 be89e4f0 3e6188a8 40e3f787 40e40789 -> 412d9104 be89e4f0 3e628d66", + "c15de1cb c06447ef 393348f5 40ce4568 410d9abc -> c0c70626 c06447ef 3f99e659", + "4097c4c0 3dba2a00 3a803ebc 413119fc 41324848 -> 417d9382 3dba2a00 3d1b4315", + "41406308 3fb09af0 4116cfae 411c2dd0 411c2e48 -> 41ae488a 3fb09af0 4116d015", + "4122558c 40859c48 3b294d7f c0ecabb8 c05c88a1 -> 40973314 40859c48 3ffd2408", + "c0528fc8 c0871887 3a3d1fcd 3fa588fc 3fa7f144 -> bffe6270 c0871887 3c26021e", + "c122d587 c05c7182 3e527937 41470911 4147106f -> 4010dce4 c05c7182 3e53698e", + "c1895f31 bf8f90a0 3f783632 3fc7e57c 3fcf0de4 -> c1794f2c bf8f90a0 3f7f5fcf", + "40aeb680 409bbe18 40dee740 c0aaa726 c0aa9f96 -> 3e026440 409bbe18 40deeb2b", + "c15f0f6a 40791a64 3b15a3b6 4116a498 4119aab8 -> c08dcf84 40791a64 3dc63e21", + "c15bbefb bfd77408 3d810628 41859059 418597eb -> 403da524 bfd77408 3d84d9dd", + "40e0b164 c045ff0e 3b5945a8 4118e415 41325ffb -> 418afd5d c045ff0e 3f4cba7c", + "c187d85f 4096ef2a 3d183872 c129e1e2 c1279b20 -> c1dc37a0 4096ef2a 3ddde235", + "bfbd6100 405dc448 3c0d367f 3f866eab 3f8a9e15 -> bed36a80 405dc448 3ccc9278", + "c05f5298 405a0524 3c9a8644 c14391e3 c14372d9 -> c17b5704 405a0524 3cb9cefd", + "412ad95a 408fa91e 40729da7 c157d680 c14cc988 -> c01ddaa8 408fa91e 40845bfc", + "3f920d50 4043e974 3c720e7e 41716e9c 41717b4c -> 4181db4f 4043e974 3c85fc0c", + "4184723e 3f74f6c8 3f0822aa be0e799e bd8298c3 -> 4183a278 3f74f6c8 3f11c974", + "417340ac c085346d 39235ef8 40febe7a 40ff7e96 -> 41b967f8 c085346d 3c4336d3", + "40d2f9d8 be8bea30 3eeab853 411380e2 411aa82a -> 418048b9 be8bea30 3f2e9814", + "c0f9a768 3caeb600 3f07fb5f c129b719 c129b06b -> c19343bb 3caeb600 3f0832a8", + "c0eb883e 4070fee0 3bdbe3fe 3fd129a7 3fd81599 -> c0b66056 4070fee0 3d0a46d0", + "41110674 c010132e 39f1a2b3 419d16b9 419d1e27 -> 41e59daa c010132e 3b183ddd", + "c1139a31 3ec16200 3e1c5381 418aaa09 418dbb3f -> 4104cb17 3ec16200 3eb053d9", + "416b162c c07f2078 40339a9b 418fdf6b 4190e9c1 -> 4202f7d6 c07f2078 4037c4d9", + "c0dad798 40415ed8 3f19eae0 410a3cb8 410ffc38 -> 3ffd8560 40415ed8 3f47e7cd", + "c103a95e c0355297 3a4f798a c016e996 c015979a -> c1293984 c0355297 3c3634b7", + "c1978de1 c08c75a0 3a81a8e6 3fa857b0 4117703a -> c158de2a c08c75a0 40826d9e", + "c1940d32 c02c9577 3a88a5b2 4189420d 41974b77 -> bef19c00 c02c9577 3f60dc63", + "4086a7b4 4090534c 393550e9 c090225a c09019b6 -> be976540 4090534c 3a39e81e", + "c16eaf57 4056fe34 3f6f4ae8 c1a20d68 c1919360 -> c2089408 4056fe34 3ffb7792", + "c13db33c 3f9001d8 3f6e6b68 40289206 40ca7cfd -> c0ec0378 3f9001d8 4031cf1b", + "3f0dd080 c072b8f6 3e2ba483 415378d2 4153804e -> 415c5998 c072b8f6 3e2c9bc0", + "3ecb2140 c0818964 3e92a9e9 3f8f7446 3f8fcbfa -> 3fc26870 c0818964 3e935a30", + "c13aaef0 bfce732a 38d696b3 4190e30d 4192e1e7 -> 40d22c08 bfce732a 3dffaffb", + "40af5748 407e8ebc 409e1ce3 c17e7844 c17e77c4 -> c126cc60 407e8ebc 409e1daa", + "c09c24cc 4022ed6c 3be3bfb3 3f176b8e 3f2cb832 -> c087e290 4022ed6c 3d46e49a", + "bfd53c90 bf464890 3a2613b4 40490769 404927d7 -> 3fbcf2b0 bf464890 3ad56e81", + "c05c72b8 c014f6c8 3db068be 410d6d76 410dc776 -> 40acfb90 c014f6c8 3dc6f116", + "41854f48 3f5acf60 3bf09a7a 40fe0e26 40fe36b2 -> 41c4d7e3 3f5acf60 3c215ee5", + "3eccd440 c019da19 3d222852 c1a5bf58 c132136e -> c178626d c019da19 409aafea", + "41388a3c 4055b748 3fc6d0e2 c0cce677 c0ccdb71 -> 40a43384 4055b748 3fc6e771", + "c0f883ec 3fde63dc 3e92b16a 407024ac 40733034 -> c07f5d68 3fde63dc 3e9ee0c5", + "4125ef9c 4021802e 39e79c74 c129c0ca c11ad38c -> 3e695c40 4021802e 3eef0f82", + "c1840a69 408b266a 39c03fc3 c1263f75 c101c0b3 -> c1ce0a73 408b266a 3f920859", + "418d23ec 40211214 3b260717 bf534e02 be31f3f8 -> 418924c0 40211214 3ea81fac", + "c18f841a 3e7ba7c0 3ad04392 41285925 4128e68b -> c0ecd0b8 3e7ba7c0 3c9a8eab", + "c174384c c0298ffc 3b0ced88 3e9b4507 3fa09bfe -> c167c178 c0298ffc 3ef4b1af", + "409f424c 3f57cd20 3fa1ea3b c10d0878 c03da150 -> bf697400 3f57cd20 40861ad0", + "4119b164 3f4216b0 4112ff2a c14bea47 c1464bdf -> c03da6bc 3f4216b0 4115ce78", + "c156e19b bedf0dd0 39e195c7 418174d1 41817887 -> 40302ef4 bedf0dd0 3ab19167", + "40406730 c06214e6 3aeb25a0 c12ca02b c12c9f65 -> c0f90bf8 c06214e6 3afa4906", + "c19443ec 3f082b50 3bb9d72c 40457381 40457faf -> c1772972 3f082b50 3bc69dbe", + "4134038e bf2a2f70 408b9bbd c184474a c1842e5c -> c0a8e430 bf2a2f70 408bcdcf", + "3f77f980 be10fbe0 3de4a29e bffc40ca bffc29b6 -> bf803880 be10fbe0 3de55cdb", + "3dfbf400 c076c407 3f21aba4 c0ec6e1e c0ec6a66 -> c0e87c72 c076c407 3f21bbb6", + "c0ac7ba8 4025c85a 399c764c 41316490 4132f764 -> 40b7e04c 4025c85a 3d4ab67f", + "40736620 bf82c7d8 3b9c33a7 bfe90106 40319793 -> 4088f8d4 bf82c7d8 40135a4e", + "4196ee4c 409af944 391f206d bfdf496a bf8f7056 -> 418b787e 409af944 3e9fc917", + "c18934d6 c02a85a8 3ad7b8ba c14dc065 c14dbd6b -> c1f0144a c02a85a8 3b0684ef", + "c0f78582 3fbd43f4 40587ffc 412bf55f 412bf8d1 -> 4040d15c 3fbd43f4 4058872a", + "40e45c48 405dff88 3e75a967 4111ff10 411ad628 -> 41844c60 405dff88 3f0424fd", + "bfc91160 bf911030 40983b6b c181834b c17e83a2 -> c18cf3a4 bf911030 409cbeae", + "c10e5030 bed5e5a0 3d94eef9 4198d543 41997669 -> 4123fb7c bed5e5a0 3de590f4", + "c095310c c080ae26 3c45069b c15d5ea8 c15d1990 -> c193ea51 c080ae26 3ca7e40a", + "3fcc6880 bf00fdc0 3a0bc580 40f568bf 40f56b49 -> 41144212 bf00fdc0 3a38c1a9", + "c1138271 406d8984 3da59e58 c16f0f16 c159c228 -> c1bbf588 406d8984 3f3f1de9", + "410b2034 406208f8 3b8c3867 3fdf9819 40b7818a -> 4146fa18 406208f8 3fffc3fe", + "411eda00 400df704 3dce454b 41286f0c 4128cc98 -> 41a3bbe9 400df704 3de5b8f7", + "405992c8 c090608a 409bb4fd 412f3fd8 412fa860 -> 4165d8ce c090608a 409c1dcb", + "4090a614 3fce5ec8 3b0a0416 40623497 408d3634 -> 4107e72a 3fce5ec8 3ee1f52b", + "c13a6674 c02b9ed9 3f1286ac c0e4e3a4 c0df84ec -> c195c04c c02b9ed9 3f28035f", + "c12d926c 4000f530 4105821d 40ae96c5 40af6213 -> c0ac286c 4000f530 4105b506", + "40655140 404345d0 3f6a71aa c14b123d c0ac9046 -> c0aeb1c0 404345d0 40921883", + "c04164a0 c06b8d26 40fabdb3 c193033a c18795b0 -> c1a57909 c06b8d26 4108cc97", + "40cee0ec bce11000 3e3b8975 40c9a190 4104e5c0 -> 415c4bba bce11000 3f97c5c9", + "beb63b40 3df97880 3beb4968 c1399632 c13928d2 -> c13f115c 3df97880 3ca861b8", + "408a9c58 3f884574 41025fc4 c0bc5454 c0b87a40 -> bfbf2bc8 3f884574 4103565a", + "bf140f40 c07ef286 38d91218 418e644f 4190ae91 -> 418ae8f6 c07ef286 3e12b586", + "c1910d98 401806f4 40d33646 c11e8348 c0eaa031 -> c1d60270 401806f4 40fc69d3", + "41331ee4 c01bdd50 3e54b02c 4140f3a3 4140f46d -> 41ba0976 c01bdd50 3e54d2e9", + "bf41fd00 3fe97ca8 3a8cd91a 412bc041 412bc207 -> 411fa154 3fe97ca8 3aac0a4a" + ] + }, + { + "glsl": "vec3 cultmath_af_mul(vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "41075bac 3f4af898 3967eae5 bfbe3570 c05d8722 3ec408e6 -> c1492496 c1f3b01c 40c939a5", + "c0d94220 402f4f90 3a15cdde 416d3958 409a98ca 3fa69caa -> c2c952e2 40fa03d8 41cd308c", + "c01ec080 3fca088c 3cdf5746 c0e2cd42 c06d77bb 3914903a -> 418ca53a bffdd898 40c4d91f", + "c0aa1fdc 4035ee2c 408585f8 3faab210 bfa8e69c 3f80a3bf -> c0e2defa 412ce582 41d9b797", + "c186392d c029d48a 3fe03804 403288d8 c05dcd2e 38dc3ebb -> c23b3702 424af9bc 41a13fd4", + "418847ec bf7f73e8 3a99ba0f c12e8e34 4081796e 40597fca -> c339d92c 429f9f9b 4282af9c", + "c1958961 3ecd8a20 3f70d183 4197ea98 400a85e0 40d27f52 -> c3b17a21 c203564e 43188e0b", + "414802c4 bf5c8c20 4048295a 41923b8a 404bd2d0 38dfcf7a -> 43648030 41c08296 428bbfb0", + "c0ed9a00 4015d44c 3bbcc67f 40c2c048 40590fa0 41053c59 -> c234c12a c12ef540 42b2bc31", + "c13e0ef2 c04dfa95 3a952dbb c11426b6 bf96a8a8 407c8497 -> 42dbfac2 422f2100 427d7c87", + "416b780c 4026bcba 3e01a3e2 c161d454 408e54c0 3da83447 -> c34fb7cf 41e57dd8 4175f08a", + "408b95f0 c03921ec 3f156a6f 404f0088 c00653df 3db40ca0 -> 4161bd0e c194179f 411df92e", + "c1293bd2 bf89ca3c 3964f06c 4193590e 400d537c 40bcdbe2 -> c342d071 c22cbc32 428e5259", + "4180721a c070e96e 3c455b28 415b8c0c c01c90cc 3c4cab89 -> 435c4fc1 c2b5dbec 411a6c3c", + "40c2c284 c010d04d 3d82ccee c12cf620 c0983fa1 3edb8a92 -> c28395f0 c08fe5c4 4175e023", + "40f99ee4 402913f2 3a2159ff 41704c98 c07ba2db 40c0a18c -> 42ea4fa5 411019f8 42928705", + "c0c8cab2 3fd3ae30 3cb56e3f c0eb57aa bfc2a7ca 3ddfe5a7 -> 423896d4 c027b0b4 40652b54", + "c11e73b4 401572de 3c87f222 412880e8 bf559028 3c8c6ae9 -> c2d0976f 42036a82 401632c7", + "41853558 c024c10d 3c9e83cd c11b7e45 bfaa15d4 3b00da3a -> c321d201 403915e8 406b0a03", + "3dfa6000 c0980a01 3d0974b9 c13f41c5 bd4d6580 3e680c81 -> bfbb0df3 426326c6 3fe06645", + "c199026a bf9a7dce 3a606d70 c1976e04 4076f0b0 3d2e957e -> 43b5045c c24bcdc1 40b16590", + "c030ba50 bfb310d4 3b2f725a c17860dd 3f962ee8 3946888b -> 422b775c 4193d0ab 3fd7ee0d", + "bf183be0 3f5a4028 3f416a20 414563ec 3f67ff10 3d269488 -> c0eac2fe 411fa934 412de241", + "41981b2c 4078e05c 3ff7279d c176e15a bfeec1a0 3f4f4062 -> c392b002 c2beef7e 4273038e", + "c113c47c bf1ec928 3c1e64ad 417f707c bfa3504c 3986abaf -> c31371a5 3ff0c620 3f75f3d0", + "bffc2300 c0652394 3a3a6b2d 413eb9aa c003a700 40defa0c -> c1bbd8d7 c21a814a 42383686", + "c049a270 c02f97ad 3fdd9800 4185c7fe bfd6a104 3948e40a -> c252bdd3 c2226460 4211d225", + "c158c8fc 4042cb8c 3e08ee9c c07b29d8 402e0578 3f4fc3ff -> 4254b07e c2432497 41b5ea64", + "bf2d55e0 3ff921a4 3c730c3e 419aa898 c02f781d 3ddbbd96 -> c1516fa0 421def40 40be4ccd", + "4148e610 40826e42 395fbf8d c07391d0 4024e874 3c8e25b5 -> c23f24cf 4186baa9 412cae3e", + "c16d86af 3ea30780 410add15 c13db36a 3fce4704 3cc3120f -> 433002e7 c1dd97f8 42ebefc3", + "41766fb8 3fef8530 3b3ac2a4 41447f74 bf9066ec 3bdaf83c -> 433d283a 40b35d34 4010f46a", + "40def454 c08dacd3 3d785eff 41406f60 4090f3d2 3d0fd72c -> 42a7983f c1ad8176 41abb0ab", + "c15be5b4 406b05f8 3e5b17ec 409373a4 bf56e898 3e7ab7f1 -> c27d5077 41e3ab80 410909e3", + "40bd09d4 bea6ac80 4073b763 40248a80 409ae9cc 3c0c930f -> 41730123 41de1711 41ef19a7", + "4180e48e c09ac214 3cb327c1 c080419c 403916ac 3f80b566 -> c281269f 4283f4ef 420ce477", + "c189fdae 40927536 3a08559e c160138b 3e2c5d40 398b26a1 -> 43719102 c2860048 3f48aa40", + "beba3fc0 3fe15658 3b61cc45 c189d59a bff451f4 3a368a76 -> 40c88f0a c1ed1870 405b5fad", + "c1902367 c09bc4a7 40bdc775 40113910 c020fec0 40354d7d -> c223885c 42091c92 42f480db", + "41345abe 3e0bf800 39c6d918 c0f34e94 3f0f1eb0 3a73d332 -> c2ab697e 40a866c6 3db8c1fa", + "40179a00 bfe565d2 3ea7a3b1 41815d48 40815b2c 3bea23cc -> 421937af c19b3d33 415e5197", + "417e1790 c0106508 3b0f7bcc 4123e24e 40146aba 4117907b -> 4322a99f 415b7e52 4331166f", + "c0aba8ce c09de915 3bb919b4 40501568 c0707430 3f005048 -> c18b8782 40838654 41bdf549", + "c0a5fa82 3f48c080 3a223c84 411e7302 3e1696c0 40e4d91c -> c24d765a 40e0195d 422b4fae", + "c02de1a8 bfc50a54 3f30fa49 40467590 3f9708e8 3b1c5d86 -> c106cc62 c0ff56a0 409934b6", + "40ec66f8 4025abf0 3c2738d5 418fd77c 3f6817d0 3a7a7cee -> 4304d482 4254f767 402328cf", + "c097583a 3f5dcdd0 3f390b22 418bb9ca c051c2c5 391c6cea -> c2a5357b 41f511e5 418ead1c", + "418028ec c004291e 3b27254c 4192fbd8 c045dd55 3ad45deb -> 43932ad6 c2aeefc2 40ceff62", + "3fcd12c0 c03faa9c 3c10fb07 c09eff34 408caafc 40f6f00a -> c0febc04 41af61fb 4243286c", + "c194ad2e 40477380 3f8946b0 4114921a be8e6830 3d7d11a1 -> c32c91f1 42086dbe 41487ec0", + "4083ac38 bfe70ba0 3e43fdce 419d9c40 c0892896 40ea9c51 -> 42a221f8 c254cb30 4264882c", + "406f69b8 bf560d80 3c44ae45 c15d3898 c0404e87 3d47cdba -> c24ee331 3ea40800 403c0eed", + "4195d2ee bf29c358 3c2fe6d1 c170e8a1 405e2128 3aa7519b -> c38cfde5 4295f87f 4021a3d1", + "40f2a1d8 be8b80d0 3a1c8e33 3f853960 c094027b 3c485a15 -> 40fc88ec c20d6a50 3fae0b93", + "4177237c bff499d4 3f9fcd70 c041d320 408484aa 3f49106b -> c23b1d92 428b817a 41fbd268", + "c08cd5d8 3fbf8394 39c3d11e c13746b2 bfd4c50e 3feaf31d -> 4249a784 c11d2a65 41551490", + "c09bb4f2 40828cac 3aa91601 c0f565a4 bfabc57c 3f3ec367 -> 421541fe c1c60bed 41427429", + "4150ab88 bf924a20 38d4250b 41611b54 bf6c95d8 3d0aa1e0 -> 43377d09 c1e10ee6 3fc4de2c", + "403692a0 4083c724 40d4cd46 40594478 c0925f6a 411ef560 -> 411af31e 3f6e6c10 434f2701", + "c07872a0 c0876888 3b288100 c1271889 c07beafd 3f263125 -> 42222a96 426de372 41afb25b", + "c15d972e c053b0c8 3d04f369 40af2ad4 40293254 3d661236 -> c2979f6b c25ae100 411f93f1", + "c044a078 4022ec8e 39a5a0b5 4008bf60 401cf1d8 409ebecc -> c0d2107a c006104c 42087629", + "419fb53e bf97f884 39b39ae3 c0989bbe 3ffff748 3e39d1e9 -> c2be698c 423655cf 40c6e034", + "c055d368 c094fbeb 404d7d2b c0eee1aa 4061e690 38d76050 -> 41c78707 41b7b360 424ef1de", + "41494020 404343f4 3dde13df c1766299 4046d5f4 3afc6ce8 -> c341b122 c0fcf5b0 41384285", + "40350f98 c066c1f0 3f825cfb bfce9d80 c05d1ba4 3a7bfe78 -> c09221f1 c07d0bfe 418d02e2", + "c111cd41 c046e9e1 3e02ebad bffa5e30 bf36f238 3e3c8717 -> 418e9816 414976aa 409ac0e6", + "c070ab88 c09a4598 3a326b05 c197dabc 3f5b9a80 3e4f6ce6 -> 428ec2d0 42b0921a 40bc67d7", + "417b3070 c098e764 3bfb16d0 40a6be14 404e5c50 3970160e -> 42a39bea 41cdc7f7 41779f4c", + "41672334 4059d9a8 3b79eb31 baf84000 404e5548 40c835eb -> bce023e3 423a44ba 42f5617b", + "418db78a bff58b0c 40a7b8c7 415b8328 409a75f8 3ddae775 -> 4373093c 426cc0fc 42da4090", + "c167fc89 3ec9f170 3ab25a5d 4183524c c07a809e 3d12a2bd -> c36e019c 427ce709 4006b819", + "c1964440 4094eb74 3ddb2a31 c1211570 40825d08 3fbfabc5 -> 433d1b03 c2f6bf14 425ee973", + "4156dea0 4038f59a 3aa3b8ef 418ea198 c0319308 3f6044a2 -> 436f6e3d 41643a88 41b2bcea", + "41733b3c 408cf26e 3b7c0de4 4112f77c 3f7c2478 3b73d912 -> 430ba2ec 425db947 408e6a76", + "41736564 402e3a80 3bdf9805 40cf7478 3da8a500 39d19b6f -> 42c53db8 41973609 3e8d716e", + "4105d764 3f2147d8 391d45b0 401ba290 40784710 3932c60c -> 41a2bcce 4207ee9f 401c93e4", + "c02787d8 409a45ea 406ca684 416a4dc4 3f7f9e28 3ff6e7df -> c2195510 4287f886 42a845bb", + "bfadbef0 3f907144 4093f89f bf409180 3fd2333c 391a059d -> 3f82b1f4 c044fced 414ed1a5", + "4119910a 409f15f2 398c8359 c15c8e24 409423f4 392a82eb -> c3044de9 c1c0c718 41b82d8a", + "c1072df6 bf6bd018 40a2243d 41840a58 c0966064 3b9d7c32 -> c30b7252 41c3fe7c 42dfad95", + "c163db50 bfa8857a 3c9e2830 bf144400 3ec89970 3bacbbc8 -> 4103f751 c09a256c 3f1de00f", + "413fe8e0 c0100a05 404ce216 c1514b21 3de4a4c0 3ad0c835 -> c31ce571 41f63b56 422a0ca9", + "416ff2e8 c09b8944 3ba5624b bfcd1d40 c01750a4 4107a160 -> c1c040ee c1dd5860 4333e213", + "c09829cc bf81230c 39b5d155 c0d53db2 40871498 3d132b79 -> 41fd7ee5 c15597d8 408f07d4", + "c194e246 3f099620 3dccf1d4 419dc0e8 c011e964 3ccde34e -> c3b77deb 42541c2c 407a4cac", + "c17c8c9a 3e6095a0 40b8345f 4045b3d8 400e2916 3abc62f1 -> c243099e c20988c2 41f8b251", + "c08018ba 4099c630 3974ddf9 4062de00 3fe81c10 3c10d12e -> c16309d3 411c682c 410cb0af", + "c16b4ed8 3f2b70b0 3cdc6fa4 415cec60 c00c810b 40b1de2a -> c34b1107 42262284 42af098c", + "410109c0 405275b0 3a0a134f 4191b24a 3ea14ca0 3e124101 -> 4312e0c8 4279b82f 402ab966", + "c12ddc03 4046c388 3c8b7783 418ebc3e befbfd90 41074c8b -> c341dfc3 42730997 42f04498", + "411c5e0c 40446714 38d8e655 c04a3240 c08a5f44 410d5859 -> c1f701ce c24fd1bf 42fd6eef", + "c1076b78 c0017a0d 3b3c9fde c17a2cf2 c08ccba6 3b2a7483 -> 430456ba 4289be76 410fc844", + "4183d584 403b3398 3ec6adb5 410bfd42 c03f5001 3bc38a8b -> 43102eb5 c1bd5996 4156ac53", + "c197f6ba c046b0ec 3b185df9 40c15f34 c00587f2 3c86a8ec -> c2e5930b 41a6fa40 40db8364", + "c0d2430c c05ff12e 410f4e13 c0e50842 bfc16e10 40673049 -> 423c1cc2 420be4b8 4317a813", + "41369634 beec26c0 3d367596 c183c41a 405c5974 4016d23c -> c33bf574 423b8c10 41f47a6b", + "c0917778 40073db8 3d009bad be054500 3f115f60 410335f2 -> 3f17748d c036cf9b 42605999", + "40c92c20 3f6cdac0 3f32cecc 416739a0 c0922339 3efdacac -> 42b5b419 c1756cac 41ab6d48", + "41843824 3dc4d740 3de4748f c182dc7a 4086b2f8 3b04a372 -> c3872cc3 4287fead 402eea01", + "4107c718 c08228c7 3d1adea9 4018f9d8 c084b585 40778ccc -> 41a24573 c233a97c 4283a346", + "419f9e04 40958c54 40b18006 c0994256 bfe1864a 3ddbcb64 -> c2bf1d9a c266253a 423f3eec", + "412216e8 404f3338 40b04581 415bb980 bfd68e02 3ce63eb2 -> 430b1f0c 41dbd4da 42b5acf0", + "4163b254 3e913d00 3e154fe5 c1061271 409e0cc6 3e9fc10e -> c2ee7f7e 4287d266 40fd5d3e", + "40df27d8 be82d940 39b33c13 c11f1637 bf6bd1a8 3fc92bff -> c28aad1d c0788017 41399fdc", + "c0fd5bf8 3ff89e54 3d3d43ce c1142526 bf9e9e92 3f11b321 -> 42929def c102c386 41087b2c", + "c0b49022 405105d0 3e0a2e75 4051a030 bca88e00 3db55f4a -> c193daa8 412d0415 3fa80d01", + "c19521fd c00ec8c6 3b108ed2 c157e090 c07add44 3aa431dc -> 437b84ba 42ce5806 410cf553", + "413a1bd8 c089a49b 3a49b2a6 c1735ebe c0296b49 3c166765 -> c330ed4e 420a8a00 4138bf39", + "40a473fc bf4899e0 39a48d2b 414aada8 4076aa88 3de8061f -> 42823313 411e1884 406c9257", + "4146dd64 401e523e 3d80695b c179e541 c086f997 3e0ff06a -> c3421f6d c2b61fa8 415c82ee", + "c18893d5 be1c3f40 3c8dd2c7 c141d0e0 be1fe700 3d0a70fc -> 434ecdc6 409074a4 3f51b807", + "4168c988 c010b5b8 3914d73d c19223fa c01bce77 3ec4ecdf -> c384e3a6 40bc5170 413f935a", + "c032e1e0 3dee8f80 3bde9c47 4177cef0 bec99080 3ba085ef -> c22d2889 4039e2ce 3e2c200b", + "40cf6904 c04b4f3e 3ca17d1f c166291a 3fb341c0 40bd6229 -> c2ba79a6 425b18c3 427825b0", + "40c22c34 3ed85240 40a293dc c19b23af 402d8aa8 3f10e650 -> c2eb57a9 41042a20 42effdd2", + "c19666f1 4087d0a4 3a811e92 40b21848 c0835c73 3e05e134 -> c2d143af 42c997f6 41a39038", + "412e03d2 3f6fb2e0 3dad4663 40db7518 c01c2845 40cd2af3 -> 42952cdd c1a0ec7d 429eb239", + "c0b074d4 3f5a07c0 3a2f6135 c0969ad0 bf9133c2 3bf2434a -> 41cf9e54 400fce9c 3f823212", + "c12391fd 4087873a 3b31e97a c13247b9 bf066708 4040ff65 -> 42e3d2ab c2274bee 423774ed", + "c152ccc0 408a80ba 3fd6238b be8a95c0 3ee8c830 40a45e9c -> 40643b5e c0e52b9a 42cb5c82", + "40255fa8 405f10e4 3d05aa6f c10ce3ea c09bbd09 3b9600f5 -> c1b60716 c22d1158 418b7f15", + "3f3b7e80 403a3b66 3c536fbd 411b9b6e c07634e4 400a69d4 -> 40e3eedb 41cbdbc8 419a323a", + "41219f90 409cfcfa 40890441 bdc7ff00 40321150 39453bd9 -> bf7c880e 41dd0298 41cfe09e", + "41392f30 c0139c7c 3a1d64c9 402c94f0 402d4a9e 3fdd8046 -> 41f9aee2 41c8f439 41f22765", + "bfb93d50 404579d8 3cc69c85 c0fc634c bea138e0 3a1f30a1 -> 4136a034 c1bf0b43 3f962d65", + "41324b82 c00da780 3936928f 40b77be4 c07b9d5e 3c328a7e -> 427f9486 c2620147 410d95e5", + "bfd3a980 c085ab40 3d941c12 415517bc 4068fab0 3dc29fb7 -> c1b02fa7 c2769bde 4187f2e6", + "41908456 3c529600 3f8cb5fb c04d7398 be9f3a50 3c9dbdb4 -> c267f674 c0b5183b 4087d024", + "41964184 3fdd8678 3a1b6a44 41397c40 40027c24 3b1d67c2 -> 4359bc8b 42696d1c 4065836c", + "4137531c 409f1958 39805c6d 40c686d0 404a43c0 3a8a7515 -> 428e2ad2 42861cbd 417bb949", + "41635538 c0361672 3b86396c c1161847 4094a7f6 3fc32973 -> c305497e 42b963a1 421d2124", + "414c0d84 c07a1e62 4027d398 3f412300 c0938d67 3e9a8691 -> 4119f216 c2770423 4217a3ff", + "bf2dd160 40920bba 3c2e3409 4019e5c8 3f943924 3b11d872 -> bfd0fc4d 412303b7 40aab4fd", + "c1936392 c091e562 3ba3942a c19998a0 bfd5695e 3f72eb88 -> 43b0dcc3 42ec8167 41ec27f7", + "c19f553d 409c67a0 3d9931b6 412e1e2e 40646ad4 39b95065 -> c358bd70 c18f2624 41944624", + "c0d9fede 40424768 3b0c82c7 c0aa2024 4098e142 3e331093 -> 4210de9e c242bd0c 4181f97c", + "c11137c9 3fee41e0 3d45b680 4196e85e 3f812b28 3bce10e3 -> c32b34ff 41cfa020 403a0af1", + "403b53e0 befc7940 3e17c0e2 bfd3bd70 bff74d54 3f0bdbae -> c09af0c1 c09adc2a 405bc0cb", + "416d4cb0 c02f2653 3c043c06 41454e3c 3f941518 3f3960be -> 4336e488 c184b827 41800537", + "4169aaf0 40568678 4024ea1e 3f8a66e0 c0176dcd 40f2254c -> 417ca818 c1f7716c 432c303c", + "c11869c1 c0910855 3aef4d74 412f6760 c046ee61 3ac4e120 -> c2d0dbad c1a09d9d 4162277e", + "c033f7c0 c075cd04 40fa3ee5 412457b0 c0084ec6 408e61bd -> c1e710b8 c205d6c8 43298e37", + "4114f560 c08a4bf0 3c86a5e0 41999504 bf0818e0 40259d31 -> 4332bab7 c2afd5e1 4217c230", + "c158c864 3ede69a0 3e838ef0 415177ac 408068c0 3e119a1b -> c33160f0 c242ba46 41029c7c", + "411219d6 3e5b2560 3a63faf1 be6a3200 3ca27e00 3a074dc9 -> c005a827 3e0759c6 3c1829df", + "412a72e4 401d7b5c 3c54e351 401c07e8 40063a7e 3d719418 -> 41cfc68d 41e2bc30 40bfce97", + "c17b3fb0 403f6d96 3b051161 c0817f7c c096bcdf 3a6bf555 -> 427e306c 42777698 4161fd49", + "412c0fc4 c0770b02 409f1c1e bff72c20 c087d393 3d60bef8 -> c1a620de c218c442 4240a94c", + "c0db2246 407680e8 3c0f4a02 419fe1e2 bfabd580 3ecbb815 -> c308dba4 42ac5666 4119e3a3", + "c103f53c bf2785b0 3a0bf686 409bcb44 c091593b 3e5f6e92 -> c2209c84 4209196c 409d6f63", + "c190cf89 408b556c 3df07ce4 415718e0 409cf268 3d4f8d85 -> c37358bc c1f1f396 41c53bd7", + "3e8d9c80 c0520c9a 3bca41f8 4178f968 406e69b8 3e316666 -> 4089b993 c24829c9 414f67e3", + "409af680 4027f75c 3d190d33 beb60e00 c08d4c0b 3f5d2279 -> bfdc6771 c1b286ca 4191fe3f", + "40f4d168 c00f00a6 3c8ae4d9 40b334dc c05617a4 3df8906e -> 422b60f9 c2186c52 410d3fdc", + "4122af60 402aaf20 3c029bf5 4101c9be c01508c8 3b1bb72a -> 42a4f528 c002ce60 40ca6066", + "c069de60 be125500 3f1591ce 406fffb8 bfbe415a 3999e335 -> c15b4038 409ca8ce 40517a36", + "4044e168 408a7b72 39d9655c c0821ad0 408e56cc 40534cff -> c1481e2b c07a54cc 422ecb7b", + "c1468b34 bf1a2a30 38f291fc 411a007c bf9b6ef8 3dd4bfba -> c2eee03b 41145b06 40056516", + "c13c81f4 4041bb34 3bf8e64b c0b57d54 4089be76 3f33a0fb -> 4285a42b c287c3d8 41bc0466", + "c131fa32 bf6ce5f8 3f351a51 419f14f8 c085cb3f 3aac51e9 -> c35d31f2 41e0dae8 41a74aa2", + "c1593040 4042a328 40558cff c1857724 be48efe0 3c0cc203 -> 4362764a c2404b1f 42645cb1", + "417c6c24 c0974258 3c3a23ef c04a51e0 40848b9a 39deda7c -> c2477e0f 42a09418 419d5d77", + "40d198a0 c00489e3 3b9558b8 3fd7a040 befed2f0 3ed9a8b4 -> 41308a62 c0d7f3d6 4096a356", + "408559c8 c09ba88f 3c0ee802 41314838 bcda2600 3cac008f -> 4238b163 c258088b 3ed527cf", + "417f6544 c08fdc77 3d74b6c5 419ae8f0 bfa40bbc 40a7bf79 -> 439a8b4e c2d70532 42e51a68", + "c0e1ce22 3f4c39b0 3fe5e46d 417fda84 c027dd28 3a046ddf -> c2e1ad12 41fa1e6e 420e1d01", + "419fb4a4 c07b9cec 40c8857f 40a11050 405d9458 3bbaf1be -> 42c8f591 4245501e 4286097c", + "c144fa22 40361282 40314a4e c11fba5e 3ff8ea0c 3e1dc394 -> 42f5cd82 c2515d3e 422557d4", + "c0200e50 3fe6238c 40c392c2 c191d837 bf8905e8 39664476 -> 42365e94 c1f0ce2e 42efc714", + "4156cf14 bf94f0f2 3b6013d9 c018ff58 c04a538a 3c674792 -> c2006136 c21ea50b 4079d4b4", + "41543148 40834d24 3e41f213 bfa80650 c080d6b3 3b9a068e -> c18b4593 c26b20aa 418ce978", + "c1101c5a 4028f1cc 3945f5e1 c145b8ae 3edc5600 3baabc62 -> 42de9b8f c211fd0c 3f9980da", + "412a6e78 4099125e 3a340199 c194334c 3f590968 3ebbb8dc -> c3455408 c29f2ad8 411ba86d", + "40426010 3fbe3f40 3bc560a1 4185ab78 3eeeaba0 3e93bc63 -> 424afc33 41d2000d 40069cf2", + "419bbbfa c00d36a4 3a613fe2 4134d2c4 c08b7a48 3fee8c24 -> 435c00c6 c2db923f 424818a0", + "4155b300 3f16a468 4083db02 3f96d400 403c56e0 4098fcd4 -> 417bcfb4 421ffe02 42d228e5", + "40fa9808 401006a8 3e8b93b9 400a6ce0 40983100 408fbea7 -> 41878088 42287272 426c6652", + "4052ce30 c0224ae6 39fd2660 4091bca0 c00e1ee5 3c41d53a -> 41700439 c196e7e8 40b68267", + "4180500a 403f35ac 3f7ca93f 40707900 40692824 3d4253a9 -> 42710f5e 428b508e 41991a47", + "c188540e 40846d2a 3bd7c0be 41944c6a be478be0 3f9d8526 -> c39df293 42a01184 41d8046a", + "c1618899 bd9de3c0 3ea19df8 c13f480d bfb6d760 41055f92 -> 43288464 41a87471 42fa381f", + "c04bd040 c0286c0a 3a5a370f c12bdf82 bfcb6538 3ffea0e4 -> 4208d60d 4205510e 417c3829", + "c197c35c c0990199 3e6d63d4 c03ec4b8 bfd2b934 3b4fb6ef -> 42622f3a 4235ee6e 41105371", + "400d8558 bfa2ccbc 38d52a7c 412e3910 407432b0 3b0b18bb -> 41c0a05b c0ad2f8c 409b9494", + "c18e54ee c0266b40 3e980a08 c08fac6e bee3eb20 40219768 -> 429fc29e 419cc205 425b6ffc", + "4038d4e8 4014b330 3adad9bc 416c36a8 bf6f70c0 3cd5c2b8 -> 422a8bbc 41fccdda 4015783b", + "c12c6322 bf9808cc 4032da04 c15e5aa1 c0442d9f 39284c52 -> 4315baff 42462159 424c2efa", + "c12c758c 3fd8ff2c 3c9f1f0f 418c84be 3f2e93e0 3fd0acc6 -> c33d536a 41b36a5f 41af06fe", + "4167cf34 3fbe1224 3d9fd1ef c18badc2 bf6b2208 39b529f5 -> c37cf5b0 c21cef5d 4033733f", + "414aa0fc bf9f8352 3de7bb55 c027bdb0 c0629e32 39ca1106 -> c204c529 c2264eba 40a3b10d", + "c1069f4e c0958eec 3f4e8c1b c0fb5d60 3fcbd684 3de28407 -> 42842f4c 41ba823a 4184d173", + "40937898 c05bbd62 3df47def c1469378 c0434e0c 40bcc0fa -> c264c872 41e4644c 4271daa4", + "c06401c0 bf791020 3a4ea7a3 41934d8e 3ed574f0 3a968b43 -> c2833214 c19b3190 3ed9fb69", + "4144ed80 c075b355 3e69fb0e 4161559c 3e82d4a0 3f8abac0 -> 432d5698 c24bb043 41b00bfa", + "c0fd74c6 3db21800 3b88e723 c1686e3b c08f3529 3915fb83 -> 42e61ef6 4208bb49 3ef08fcf", + "416e72e8 403d8c4a 3ac4d2fd 412e2138 406844ac 3a2702ea -> 4322310b 42aca306 412c82e0", + "c119c434 40889c92 38ec1099 415f4e14 bfe165a6 3c3b1d79 -> c30620cf 429902ae 40f5b274", + "c12eada6 3fdcc558 3c97f0c5 409f1e40 3fc349d8 38df4600 -> c25924fc c10148a8 40303808", + "41891330 406405e0 3fbca694 c081a9d6 3fa24628 3913cd82 -> c28adb37 40e924b6 4145c4bc", + "c00bc0d8 bf1fd3b0 3d0c85df 4197cbe8 c09f7a26 3a145ae2 -> c225bc20 bf76b6b0 407bd79d", + "c109e17f be5d5780 39adf822 4057ce10 bfea0cc4 3c215873 -> c1e876bb 41707492 3ef7cf9d", + "410c0e04 3fb1bcb0 3d4ccabd c19a147d 40005f50 3df2c9c7 -> c3289748 c112fa52 40a1d257", + "c13ee136 4092cfb8 3f69f891 c1197294 3fa00688 3febd301 -> 42e4d410 c26ba885 423f09ec", + "c0bbbb26 3fe36cf8 3ff44169 c0e7ffa6 c03a949b 3a7ae4ef -> 422a2158 408716ea 41c4b203", + "c141aa40 be85c150 3a384a20 c13c7b59 bfdddd26 3c5b5ecb -> 430e9657 41c075e0 3f20c76b", + "40c4d150 c0095c02 40875fda 416639d0 3f24be40 3fd82fe1 -> 42b10080 c1d76547 42ac44bb", + "c0f6952c 3fb6bdb0 3bc3ed30 c18e6747 4081c08e 38f5940d -> 43092a39 c262a194 40bd76e7", + "bfafde20 408327ac 3a1d6b93 c133e5c1 c041f3b4 3e6000e6 -> 41772c4d c227ad29 415a06f9", + "c127ea5c c0497da1 3f93e4b7 40c51f4c 3f9aeac4 3b88887c -> c2814be0 c20061a4 4146350c", + "c1039152 40950f2a 3b129379 41828e92 bf90c478 3fd2a7d3 -> c3063223 42aaa31b 41d414f3", + "c12d438c 3e0895c0 3b6e767b c176c24f bfad2344 3c432faf -> 4327026b 41497324 3ebe9acf", + "40f29014 bfca360e 3c19ab06 418eee6e 4090ec02 41026ede -> 43076dd5 40c352c8 42a439e7", + "bdb89100 c0010f06 3f39e274 415b2540 4061fbf0 3b4bf328 -> bf9dfee6 c1df80f7 419d1b83", + "c1930b62 40991dc0 3b1ee50b 3d659200 4095b782 3a05ab42 -> bf83dd0b c2ab74c1 41b34811", + "40906390 409fec80 3e56cce0 4081b074 3f272c88 3dc9647e -> 41924b63 41b99b53 40a69bb7", + "40418e00 bf80cf76 3af95e06 3ef6e880 405074fc 3c15a8fa -> 3fbaae3d 4115d80e 40549728", + "4100f9aa bfbe72ea 3d59c240 4119eb3e 3e9691b0 3ff0e7e0 -> 429b1776 c13f1587 41984a99", + "c110ec3a c005c736 3abe1706 41536368 c05bff36 3b868b5e -> c2ef55f4 406136b8 40e82bd9", + "40047f68 bef5b480 39bfeb6e 4196d18c 406b33e8 3c34806f -> 421c1e37 bfb82880 3fe66747", + "4029d8f8 4011d6e2 3d5aa36d c152c224 3c85f600 3bdaf014 -> c20bd4ca c1efc8dc 3f464e86", + "41208cb6 c083c818 3f43d016 413d5ea0 bfa50d48 3d6fd838 -> 42ed8675 c276b862 4181c92c", + "4110e358 409b6bcc 3cbd09ad c09984ca c065d46c 3d045fad -> c22dc60e c25f47a2 4190af69", + "41223b10 c0000202 3c902461 c047af20 c02e2e34 3e782e29 -> c1fd15c8 c1aad648 4107e26b", + "4182f258 4034ce60 3fd339ad c0caab96 c09023d0 39c13591 -> c2cf55fc c2b73e48 41f4f117", + "bf111280 3f8580cc 3d3aed62 415e5ed0 408ea082 39a1b8ec -> c0fc078b 413f84a9 40af94e7", + "415ddd68 3e9dde70 3fe28349 c14cb464 409caf44 3c83aded -> c33168c5 427fce12 42044995", + "c186f943 be64ada0 407e8c97 40e4d544 c07d7ff3 3a3acae6 -> c2f14ce2 42827628 4234620f", + "4160086c c0521dc2 3b6b8c26 408dda00 c03497f7 3d8ce691 -> 427846d5 c2584192 4127acef", + "4192fc7c c0639df8 3d0192bd 416be420 c018a6d5 3ec9ca12 -> 438770c1 c2c08420 418d71d6", + "3f5bd280 bf6875f8 39239165 40d13050 bff3206e 3f2e9607 -> 40b3a057 c0f22558 403b96d8", + "c1991250 4072848c 3926271f c0a04444 3eab0180 3de5f0cf -> 42bfa887 c1caf394 4075c80e", + "40c2f588 3f3bbdd0 3b6976f9 c19d7c8d bfc7f286 3f103fd9 -> c2efdedd c1bfa188 40a23a39", + "412476cc c02c85f1 3e7d1d10 40dd5e08 bdabc6c0 401cdd88 -> 428e36f7 c19c14b1 420974ad", + "414163d8 407001d8 3c0c37d8 41949738 407865d4 3f82057c -> 43607fea 42e921a9 41f6bf19", + "407a6420 4098fca6 3b11a05e c16c82eb 3fcb1ce8 3da38350 -> c267545a c280ec8b 410512c9", + "c0795430 bf5a2ab0 3a348c77 c15df988 3fc91e88 3aaebb68 -> 425830b5 40b6762c 3fad93d4", + "c16c6d62 be7d5740 3e1f22dc 4100ae18 4092b91e 3e2ae528 -> c2edaef3 c28b7c18 40b42b29", + "c11b698a 40907908 3f80d2e5 411fe870 c07892ad 3915ea56 -> c2c22751 42a5b1fe 41fc0a62", + "c1930863 405f0e24 4077cb85 c1591eae 40673450 3c7545f4 -> 43796776 c2e36179 429f01e9", + "c0993ed0 c08da988 410ff0ae c1274869 403144d8 3d74df05 -> 424846a4 42041481 43045392", + "c0cbe5be 3e5fdae0 406f94c7 41132370 3f86b7e4 408d52a7 -> c26a624b c096449c 42a8777d", + "40535d20 3f84e0a8 3d969da2 bfed6970 3ed8e320 38fd28bf -> c0c40444 bf06c6a6 3f1b9c27", + "c126abed c07f4a3e 4074baef 411adfc8 400497fa 409a4d34 -> c2c9aa3d c270c56a 430d1a79", + "c19fbe27 405eb098 40099633 c1277c78 c0833912 3f8fe14f -> 4351056d 4235d631 4294b8f7", + "40d07698 c025365f 3d6fddc8 4114d76e 402ea5e0 3dcc5f8b -> 427267fa c0c794fc 410a9a3e", + "c12a2334 407adb08 3e9eba85 c185726c bfb2be16 3c79d766 -> 433160ab c24a226e 4134dfc3", + "41131796 3e8b9830 3bb07050 416dc9e4 c054eed8 3d0dafed -> 4308a0d6 c1d4470a 3faa9a91", + "bfd85d80 3f5e71a0 3b5e7b62 418064be 4086c6a0 3f21cca5 -> c1d907ca 40da6fc5 40ab2460", + "3f3de580 3fb101a0 3bb88a2b c18eaa87 c027cc1a 408d59e2 -> c153a797 c1d4d8a2 4152699f", + "40f1b5d8 c07e7667 3c6ca313 c17d1f52 c08a8bee 3bd6fd10 -> c2eefe49 41f19402 418ca681", + "c09f5f3a 405fffdc 3fb6bc9a 4197843e c03389fb 3e36ef25 -> c2bca6fe 42a08500 422a8791", + "c0e8dcf0 c05bc716 3f016b63 bf4e4f20 c09c1be7 3a500519 -> 40bba9c2 421911e6 419d14e7", + "40677690 c06d4631 3e81972a c0b4e20e 40338f38 3d062279 -> c1a38bc1 41f8d392 414ca642", + "3e23a480 402771d2 3b837a8c 413bc27a c03706ea 39f6ee63 -> 3ff00af4 41f1f6b9 40f15889", + "c12032a6 c04cce27 3e3eff23 412c5174 bf877f8c 3aff7019 -> c2d7aa00 c1beecd2 40b3d77b" + ] + }, + { + "glsl": "vec3 cultmath_af_snoise(vec3, vec3, float)", + "tolerance": "ulp-bounded", + "check": "the arguments are (cx, cy, cz, ax, ay, az, radius, ...) and the result is the form (x0, a, e). Enclosure: for eps in {-1, -0.5, 0, 0.5, 1} and d in {0, +-ex, +-ey, +-ez, (+-1, +-1, +-1) / sqrt(3)} (15 directions), form the point p = c + axis eps + radius d in double and round it to float32; the device's own reference value at p must lie in [x0 + a eps - e, x0 + a eps + e] with no tolerance, so a device whose gradient error exceeds the allowance fails. Tightness: with L = 7.9640074 and, for each octave (one for af_snoise), R = |axis| + radius, B = L R + 2^-14 + 2^-12 R + L 2^-20 (|c|_1 + R), the width |a| + e must be at most B + 2^-16 (1 + B). Report the least slack of each side, absolutely and as a fraction of e; only the two bounds fail the check. The reference value is cultmath_snoise(p).", + "cases": [ + "c2461d0c 41488940 c07e9320 bb68fabd be288e0f 3e232bc5 3ca64a9f -> beffc1bc 3e2be983 3fe1e5c0", + "c154200c 417938f0 41050be4 bde44cd9 bddb2245 3cefa790 3b3cd34c -> 3ee504ba 3cf9f4d3 3f388bad", + "c067faf0 c21c93b2 c1c94dfa bb35db00 3bdae5af 3acd2c25 3bdacdef -> bee953ce 3ca5297e 3d0ac7e2", + "c236ea4a 410362cc 415990ec 3d0b18b8 bd8f1cf1 3d9a37a6 3cf87170 -> 3de3c2dd 3d3e2c82 3f0fc8df", + "41d1f6dc bfdc3340 c01f20c0 3b9f7bd8 3b1c31c3 3b41665a 3c1cdc28 -> 3f41ec30 3c66bd58 3d14219e", + "4191738c c1a2f3c2 c211c115 be007580 3cb352be 3ddaed92 3b42ecb4 -> bd614cfc be8b1bbd 3f4dc0fa", + "3f58f200 c22835ab 41acfdb0 3aa2ac08 bcd45342 3cd46062 3ad20095 -> 3f16b968 3d46a2fe 3d3be191", + "c23e1102 c20a1325 42300caa 3dd9fbdc 3e906f25 3e1c9070 3bfbb52b -> bdd23a0d 00000000 40304b61", + "417f3760 c23a4512 c24726ba 3b6a246f bc701b24 bb364517 3e51e0fa -> 3d83ad16 bb88b1ff 3fc75cfb", + "c01dbe40 421a002e 416d56d0 3a3436ce 3a1b036b ba653da9 3ca8bed4 -> 3def6ebd 3b1f6279 3d81dd42", + "41f68280 c07bd660 c1f9b8cf bc9f0747 bbb189f2 bd545910 3d9d7708 -> 3bc135aa 3db9a1d4 3f2b2b56", + "40956248 c1211810 c15cd0bc 3c37df98 3c70c3ab 3c47e6e8 3da03b19 -> 3d884938 bb29a7d2 3edc142c", + "40657ae0 41f62314 c1f905f5 398ab1f8 baa8afa5 3a0f968b 3baeab17 -> 3f2e43bd 3b20efbc 3c504002", + "414e5270 421006ac c22be7f5 bc100185 3d2f3fe6 bcb9a388 3bb26407 -> 3df30361 3e6aabd0 3dedd0bd", + "c23cd8ee c094c010 c21dae02 3b1742d1 bb465fce bb7ff518 3b7014cc -> 3f3487af bc0b7258 3c7a90a7", + "c2457338 c19d12f9 4243f768 3b094bb0 3b0c5426 bae289aa 3de14cc3 -> bda277a3 ba9df30b 3f07633a", + "c1eda426 4232d426 bf842a20 3d6e9677 3ee29130 3ecb07d5 3d0e5d6e -> bd926e3d 00000000 40a109d0", + "420b8d12 42277864 c241d9fc bb8b87b9 bb7be31b bbfd72ef 3d55b614 -> 3c32f06c bbaf9848 3e69c045", + "c21949eb c2243ab9 406cc5c0 3a60f1e7 b99916ea 3b4a7e0e 3c5eadae -> be7426b6 bc2b1393 3d8470e2", + "41f25fd8 423ff36a c210e38c bb1cee61 ba026a59 ba8666bb 3dd016ed -> be7865e2 bb927307 3ef81ed1", + "418913f8 c194ae3b c0d6a1a0 bb3ee6e1 bbf513ce 3bfc3faa 3aad7ebf -> be80db84 3c1a9f75 3c1a6b8d", + "4005b130 40604800 c14d245c be3b4149 3c9bd311 3e1a08e0 3d3aa021 -> bd92cb87 00000000 4010518c", + "c23fa949 c169e48c c23503f9 bd2635e4 3e025995 bdc43cd5 3dcdd83c -> be833861 00000000 4007176e", + "c23898cc c22c052e c1fde2c4 3cd4e3c5 3c60fc4c bc5a14f8 3c46a1ca -> bcd1eb00 bb51e190 3da0e1c0", + "402b9f10 c1b6589a 41e97638 3ab5bdc8 3a78c21b ba617814 3e277459 -> bcc51abc bac7aac2 3f85f606", + "c13f5754 bf4f8a00 419a70d4 baaf2e19 bac6af50 ba1a8d15 3ba6785a -> bdee80f9 3b174562 3c4bf8b9", + "c20b69fe 40164180 c1d86af0 bd53cc85 3d5c6035 bd5f4972 3d9b9f19 -> 3e8bdc90 3c6819c0 3f74171b", + "c203634e 41991848 c0dfc318 bbe00bc5 bbd99f71 bbae32ca 3e3c248c -> bec70efe 00000000 3fc67e64", + "c1e6994a 423c2d46 c17476dc 3db0b4a3 3db9803d 3d5b9834 3b6cc85b -> bdc7a7d3 bdec47b1 3f0d5d76", + "c2108c9f c1d9e95f c1140ac0 bdb7e96d be379935 3d8008c0 3a8658d1 -> be99a951 3dff0554 3f9edca4", + "41c8c984 42287b38 c0d8eff0 ba368f94 ba8820c8 bbf13e8b 3e9ed55e -> 3e92e363 00000000 4021f862", + "4216f750 c221e5ae 421de69e baa07b01 3b7c486a 3b0e6264 3ba00190 -> 3db84cc3 3bbd76bc 3ca4d4a4", + "c1a6912a 420dc904 4212ab1c 3a4e0501 b82b28d8 384e8cd9 3c385796 -> 3d097d77 3a9615eb 3d0d364b", + "4213545e c23edb34 41cc0434 bae8753f 3968304e ba027252 3aff73f0 -> be86120e 3a6be24a 3bba5aac", + "c2383c25 c0ec7700 411ff5ec 3aa828e8 3b24cf8d ba46ed11 3e046e28 -> bde900db baf3e614 3f26885d", + "423bab08 c0f20580 423482c8 3d2ffeee bc57d0c8 3d1a7ad1 3bb46f25 -> bd5314ba bdf70cd4 3e09ea49", + "400d15b0 c20b09c3 40cfe558 bc0d2c21 3a74e62b bbab27ff 3ba5b7c6 -> 3e637557 bca6a5f5 3cb423ee", + "c110db14 c236d9e8 c095c2e8 3ba5c372 3c1c1005 3bd6db0b 3c073f50 -> 3e1551c0 bb4782d7 3cb04755", + "419054a0 41e5ef50 c1d94ebe be3a6cd1 3c1df6c1 3d43e7fc 3c55d7c3 -> 3eb77933 3eb99f10 3f94a1fd", + "c0485400 c2262c96 c20c00f0 39d1b4bc 3b702cd2 396c2885 3ca2e941 -> 3e8ccea5 3b98e540 3da97437", + "c1efaf29 bff800c0 4170aaf0 3aa313a4 3aa82145 3a8d4fe6 3cbf194c -> 3e95d663 3b48aa42 3d898483", + "c21c36ef c18096a4 41e2e49c bc0b52cf 3d54c0d0 bd373713 3b1cd69d -> 3f3b5fa3 3dab6e35 3e15ee19", + "419e6c00 4132cf0c 423d9cc8 ba92f360 3a9d0bc0 bad31b43 3a8b1925 -> 3db757fd 3b8e70ae 3b788dde", + "4110c100 c20b4c54 42376d04 b9f8081f baec2544 3a6a9dfd 3cfda902 -> 3e817738 bb3522b2 3dd75fe4", + "4005daa0 423ce684 c1d85827 bb0ccf78 3a9f9603 ba69a2b5 3d980c0e -> bd4c51d8 3b18b086 3ecc4eb0", + "42170b4a 41b165f0 420b6f2c 3e135d33 3e848883 3e9d0dbb 3cc6b565 -> bd905ee4 00000000 4065c012", + "423ed542 c24425d0 40cfc8e8 3e7a403e bd177d2e bde887ad 3c044d25 -> be19ba00 00000000 400ecfc5", + "c03ce630 41615f38 c09466b0 be1f0994 3dc8791b bdfe0dcf 3ab967cc -> befcf22b be8d1524 3fb18f4f", + "413c1438 c1d6d80f c21442ab 3bf8037d 3c62a5d2 3c7d3979 3a9095ad -> bdc2ea43 3b52acb8 3c885256", + "c1cbdf45 c1af0a8f c1ee1ef0 bc70779e bc4e0a08 bbd9d7c5 3d8b5886 -> be3d4f50 3d1698b9 3eca30d4", + "c2066e8c c0adde88 c211a60f b9701cbd 3bc4611e 3b61488a 3ad6158e -> 3ebb0280 bc58369a 3c078557", + "41708008 421d6fa4 41b2cfec bc7b6783 3b2852a4 3c17c23f 3ad88e55 -> 3ee3d64a bc6ae034 3c84da52", + "411cb1c0 41ea3e18 c19a0bee 3c4bd09f 3ac871cb 3c4ef413 3ac2a3b4 -> 3cd8c2c2 b8980738 3c427481", + "c234ef43 409d4800 4191aa18 bcb41dbf 3d051048 bc78d941 3c33d094 -> be476ac7 bb7e1eb8 3de57f20", + "c15fbc08 41dbdbd0 417b9a00 3c4642cc 3c9a5a7e 3ba520ce 3e2ad83c -> bdb4b597 3ce3e183 3f9cde09", + "40c81df8 c233d3b8 41f24084 bde0da0c bcdb392b 3dd043b9 3d9eb6de -> 3ef89b09 00000000 3fea113a", + "413bcf8c c2175d9b 4207bb36 3b11a2de 3b148d68 3b4fec6d 3d4cc1a8 -> 3e123c18 3a7b9697 3e1cca12", + "417e6560 c22b16bd c18b9796 be88a602 be98b4fb 3e6f36ca 3def151e -> bdca3873 00000000 4093e0e0", + "40eb0298 c18174c0 c2010d5f 3c55a985 bc66ec78 bb30973d 3e469b20 -> 3f09d9f0 00000000 3fd98c3f", + "c1db627e bfc819e0 422df468 3d33cb1b 3db00301 3d90d868 3d4547ec -> bd12dc7b 3e7f3350 3f6d2849", + "41d19738 4240f01e 4241df82 baf84eb6 badc07dc 39eb1f8b 3d13e7c9 -> bea963c4 3b5fa641 3e0bfda0", + "4217564e c23cc902 4229bdb2 bbbea7d3 3c224243 3c862003 3cb28ccb -> 3e36edd0 bcf152a1 3dae2029", + "c1e71165 c23920e4 c1c0a3f0 bdcea1e3 bd882118 3dfe865a 3ce6b4f4 -> 3e42159b bea074eb 3f9941f5", + "41a16ef0 4244d05c 4246e72a 3b8d6f19 bb882ac8 3ba14d85 3da3f6ae -> bd288bc2 bcb31ff7 3f070b9b", + "c1f11599 41a1d298 c200f4c8 baf5db3f 3a822815 3a819e1d 3c9e49b2 -> 3f220bef bb30afc2 3d9e0174", + "41b8710c 4120c12c 40f17428 be13f2f3 3e0e7319 bd05f369 3d28fd3d -> be9d7ddd bcea9e04 3fe6a576", + "41daf308 c0c29420 4004a140 3cefc569 bd931cfe bc986562 3c6b5814 -> bf29921f 3e2d4608 3e94b84e", + "c203afdd c0a724c0 c105f72c ba921d35 ba07a165 3a26e424 3dad29ee -> bd9f1336 bb1138e6 3edf1ae8", + "c213b6d3 c1e07e58 c12fecfc bc131ab1 3c6c6758 bc7d84fa 3cac4cbc -> 3f407e64 bd12855c 3dcbefe8", + "c1927cc8 41e24e34 c2178187 3ceb5583 3d4df474 bc5987a3 3e65b2ea -> 3e4576e1 00000000 4010aa24", + "40df9728 c121b880 3ffb9120 3b7009ee bbf8177a bc4c53d6 3b44b6c6 -> 3ebc6a0f bcdc2448 3c818ee0", + "c18b1cd2 41c7305c 4237b4ea bca4fe75 3c8d3b75 bc510041 3c59f049 -> bcbe0cea bd4f5060 3d98c41a", + "4214c838 4210ae70 41b7898c bd234dec 3e0a0c97 be7374e4 3b59a2af -> bf25902b 00000000 400e8774", + "c23dbc19 c23bb1ed c1437c1c 3e6dda75 3e084e79 3dcab699 3b8025ea -> 3b4d9c60 00000000 40138924", + "c22d3698 4091dda8 bfd3f3a0 3d3c7512 bce72037 bd898f01 3ea41de4 -> 3f30225c 00000000 404f54c1", + "c1e89b2e c1e566c7 c1253604 3c9b290b 3d326f0c bd495713 3d68e16b -> 3eb863f7 bd985cf5 3f13fb7f", + "c115b664 41a3f9f8 41dbb560 be15aad9 bcf0e501 bd178a26 3e65849c -> beada6ca 00000000 4040934a", + "c1c7aa59 c18ab8ae c13a5c84 3cf0a949 bd14dd77 bca5d747 3d271b55 -> be27a594 3d205051 3eb39507", + "c228b0ce 41bfeda0 40d7c418 bd9185de 3d2169ba 3cdfb897 3cfe60ea -> beb264a0 3e7064f2 3f0598a1", + "41e974fc 41f10dac 41b5fdb4 bad5534b b9e22fe0 3a1aec7b 3b97bab0 -> be569e9f ba58ebe8 3bc2737d", + "420a4b28 41b65324 3f0d3c40 3b493b4a 3af2d71e 3b5bfd80 3d44df10 -> bd845d10 bc978a5f 3e92ffbd", + "c2199e96 41349b78 c09e53c8 3c830a94 bacff359 bc6e8e39 3b02b5dc -> bd9754bf bd62eaf6 3cb18235", + "422ed30e 41f02b68 41441b78 be0d9b6b bd120669 bc841a38 3dc0ab09 -> 3e984c6f 00000000 3ff28118", + "c226aa00 c1de6476 c21e3ee0 3bc211c2 bc059799 3af3b56d 3e169144 -> 3e1f1425 00000000 3fa074a5", + "41cbed00 c211335e 41d5e5d4 39b17b3d bac8d1a3 3a079327 3bd89512 -> bee348ed ba330dee 3cfab285", + "41c20bf8 4231cfd6 41656fe0 bc9c8205 bcc52336 3c04f6fd 3c0388ff -> 3ebddd3b 3dfa1cea 3daf55ec", + "419e6654 413a4e10 c1a766e8 3c72014e 3c0d9cf8 bcad2490 3c5f22a0 -> beb758d4 bbc47048 3d8d3000", + "c1bec7ff 41dbadc8 c21b1465 3d04c245 3c6f4f69 3d9e8aaf 3e967551 -> be81cf31 00000000 4041411a", + "c2360bc5 416c6ec8 41aa80b0 3d5e9dbd be11072b 3bacbd99 3e52530a -> 3df7e87c 00000000 40361b13", + "c2088cf8 c190f5ea c2107112 3b42cbb9 3b888ab3 3882f305 3ea5cc71 -> bee83861 00000000 4027b6ca", + "41284d20 41d77904 41b22688 3ac8d5db bad43629 3ae95cd7 3ac3f043 -> 3c063524 3af3b259 3b0fcdf0", + "c21f2073 c1744ad0 420624b2 3e1b19f9 3e075ce7 3d31140c 3b37d223 -> bd0bd4b8 bcdb1738 3f9b0e32", + "c238b6f6 41b76a7c 4024eb80 bb8d2a5a 3cbc84eb 3c2cac28 3d96da5b -> bd426809 bbd01c9c 3f080ba6", + "c220c5af c0d27478 c17a076c 3b1cab54 3c4c2c9c 3bd2361d 3c1f3eb8 -> becea382 bd0fba39 3d44d8ed", + "c1b910af c1fdf482 c214e6f1 3e44115f 3e29976b be89a146 3ee18b90 -> bf0ee728 00000000 40ce666b", + "418817f8 416d8870 419d4c80 bbb4cdca 3b5c320a 3bd56cef 3b9b02d9 -> 3eed274f bc0c01f8 3ca5b97e", + "41941eec 423d3358 c1d8d373 b9bd960e 3a9c4163 b7fa1b60 3e08ab34 -> beb34fd1 3a41f8b3 3f531484", + "c2168529 c23b8cee c2472bf5 3c0cf5dd ba9192d3 3a077900 3c032136 -> 3e3d9be1 bb33d8d1 3cda7278", + "41a7a27c c042cb10 409e1cb8 3d982804 3d7c44e4 bd4bc004 3b8aa8de -> bf11f9e3 bd753a06 3eb8f5c5", + "41b4f950 4094dfa0 4222d724 bdd54ab9 bd5d5669 3bb8aaa5 3c424679 -> 3ee01606 bd9fd59b 3f006951", + "40931578 c2227e8e 4200759e 3b38a853 3bca6587 3d13fe74 3c079d08 -> bd7eae4f 3cd9cf37 3d9d85e0", + "419a9f5c c17f1628 41dda9cc 3dcf8831 3c0f179d bda599c2 3b617f36 -> 3df095f7 3e4575be 3f006ffe", + "c211f2d0 c15cae20 415411b4 bd601a65 bd7f1bfd bb9ee6fa 3ebebc1f -> be79e8e7 00000000 40683ee6", + "4180ddd0 4246c5ac c18a90a8 be23d443 3d871d1d 3d631891 3e27c2dc -> 3f21be68 00000000 40302d37", + "3f882560 4126dec0 422c5a04 3c74695d 3d30f3bd 3cf0ba21 3b0e5c10 -> beaefc97 3e032fcf 3dc21075", + "c02822d0 c1e86fed c2230915 3c66bed2 b9b12103 bb11f07e 3b633f78 -> bf0129cc bc194b5e 3c9f7c2c", + "c1a8a6fd 41a6ab94 417b0200 3d1d3dfe 3d92a53f bd68b9f0 3c80fb36 -> bedd5b69 be0d6581 3ee151bd", + "41478814 42138c00 4226e714 bc662621 bc9bc27f bc2cbc93 3efa51a7 -> be16f938 00000000 408338a8", + "418bd498 4236c60e c1963a36 3a2d1955 3a6a96bf 39b0573a 3b636f23 -> bd336746 3a14a726 3bb3e782", + "40d3d170 3f46ba80 c1d9c5af beaeaa31 bea80cff 3eb10a19 3b3ef3d5 -> befb4c94 00000000 409628bc", + "40dccbd0 c2154916 405b3710 bbd334e6 3bbac905 bba13c2d 3d96f1ed -> 3d939d7b bc1c6444 3e8e975a", + "c1642930 bfa01020 c246a026 bdfe3fe0 bd819d25 3dc161af 3bd55366 -> 3d320f5e 3edf7889 3f5e31b7", + "421c7172 c2217063 41d47108 bea4aba1 be8a8b65 3dd55d3e 3d77ee79 -> 3e9b2c99 00000000 407ba151", + "c2081690 c08a6df0 c1f5806c 3a03e975 ba8cb461 b9c137b1 3d268bbd -> 3e44952a 391d7cda 3dd468d4", + "4214f352 41c43118 423d1856 3a23b83c bb12a342 3b06fdd0 3df31b6a -> bf25c2dc bbdebc64 3f4a6f31", + "41f63d94 4140e298 4208f704 3a00e75b 3a88f374 baa2c48d 3be40608 -> 3f088596 3b683da2 3cca1fdd", + "416185d8 422a94e0 c233df1c be0e36ea 3e9568e2 3e94ab29 3c0864ad -> 3de8a823 00000000 4061bf89", + "400d8070 4215b484 c20a9a44 3c83a0fe 3d15e402 bcf67ffe 3ab505b3 -> 3f108c97 be2bd979 3da4173a", + "c23249c7 c1141638 422395b2 bb1be944 3b280fd0 3ae8c8b6 3e7cb1cb -> be504ab6 00000000 3fffaa3a", + "c20fafd1 4246e468 c1f727d0 bbedf519 b952789a bcf26f18 3c3c1330 -> bef6d5d0 bdc377eb 3db6284a", + "c1b4883e 42186e12 400eb340 bcfa19e0 3b1eee2a bcaac181 3e6b8f66 -> 3ec09b54 00000000 40082beb", + "41c80f04 4152f960 412e8478 3da64a41 bcf238ad bdd27caf 3e299e4e -> 3ea43568 00000000 4018e694", + "400082a0 41e861e8 c23293d8 3b36740e 3b50c28d bb6f08f1 3e8e71a8 -> bdb53598 00000000 4010b211", + "c1bd629b c2064924 41da62e4 3b51ee3e ba277008 3b9bd6f3 3a995e48 -> bf1ea68d 3bfaba5b 3baf3876", + "4208034e 41d0bf40 c1988c87 bc52c6bb bcb9fe69 3dd6c040 3ce3bc45 -> bf2b0b66 3d9e04d5 3f12d8cb", + "c22a26dc c23a4fd1 400f7cd0 bd2d8a20 3d398e2c bd585660 3df3d9a2 -> 3e7efdba 3d4fd63a 3fa3cb61", + "4230e6b4 c1516060 c2398356 bb966b0b 3cd17747 3b35f247 3c1de448 -> beafa1e5 bcd6807c 3d6b3e01", + "420c2c7c 413b283c c11da73c 3a635301 bac7bc3d bac72621 3be2d489 -> 3e0647b4 bae522ee 3c66b598", + "418d59a4 4106166c 42298a48 bac96baa ba7f6a72 ba027edc 3add6d83 -> bf2aadff bbaa6035 3bec7ab0", + "424579a8 3fefb240 c20e85dc bd1ab186 bd237e99 3dbfa61e 3c1d71d5 -> 3bd36372 be348758 3ed3c104", + "c214117d c24654ed c18d0e04 bb419bc4 bb8b46a3 3b230d3d 3a9845af -> bd5c0811 3bd8ca8b 3bc76c41", + "c1dab1b1 4231f4ec 4240bbd8 be3836c6 3da2e882 3de41e35 3a898647 -> 3e708668 00000000 3fe7a1b2", + "423a6c60 c1e706fe 423d24f6 3ce37bfc 3cd45875 3c45460b 3db383ae -> 3ebffccb bdb84e88 3f3c8d57", + "c243ace1 4234c018 41227774 3ddd3038 3e070574 3e992165 3c979210 -> be931683 00000000 4038f2fa", + "4207481a c238ffec 42386962 3d492c41 3cd841e1 3da8f812 3beac839 -> 3f3f9277 be2af61a 3eaae5c3", + "c247458f 421fe4e6 42119ae6 ba8d4252 384c54f6 baf5460f 3bc40fbb -> 3ca4795e bb59ec3f 3caad9eb", + "41b84a60 c2119d62 420f3114 ba0ff365 bacf0af2 ba2ee129 3b505186 -> 3e96a23c 3a0b9b4c 3c46c3ea", + "c1a19673 41269ea8 c0eaca98 3c0b959d 3baa142b bba00380 3ccb0a9f -> 3efe1c98 3ca68f7b 3dc55fe4", + "423b2f60 3f9fe560 c244a2c0 3e76612b bee455d4 be6ce64a 3c03c5d5 -> 3e9ed054 00000000 40900abb", + "c19dde82 4179c890 4082f928 bab05f88 399466d7 b88f3f89 3cb65ef8 -> bd169103 3b03b723 3daf1223", + "4220b8f0 c194f8c6 c1f4a4d1 3ca1e3c2 3c8a2995 bcc9b013 3d2d15b8 -> bf0976b4 3cc21604 3e930ccf", + "416e6110 41dc0254 c0b24d40 bab827f4 b95238e2 39913f5f 3c0b6863 -> 3f0a34c8 3ad81f90 3cdb0e81", + "40991a58 c173c4f0 c20c1439 3a2059c9 bda96ffe 3c0209d7 3d90302b -> beab6ba4 bc400612 3f4e836e", + "421493b6 4010eba0 42157204 3d2b8798 bd249858 bdad1cd7 3da8c766 -> bcdc4ac9 bdbe0608 3fa57af1", + "c215d020 422b0300 409cb420 ba98edb8 3c241776 3baa9c33 3b397237 -> bdf859de bc270ac6 3c7559bf", + "c09b9548 c11609e8 c1738bbc 3dad4868 be9f6923 be9cf21c 3e43a829 -> bede6957 00000000 40a22051", + "c220e48c c1f2c5d7 403261d0 bc3ec6a0 3d4260b1 3dc0859e 3e481c1c -> ba9fb3cd 00000000 4019a648", + "41d8bec8 3f7d6a80 4183dae8 3bd94245 bb425991 3bcf1cb5 3c047989 -> 3ed37c3c 3a120bd0 3cc1dcaf", + "418708b4 41bbb970 c2428eec 3b95876e bb8d48fc 3b8b6b24 3dc23a4d -> 3e71a554 bb5f0ea8 3ef685db", + "4192d928 4240ff34 c1b265f4 3a450673 398be58c bac81f1b 3dd39944 -> bebc9c1c bc0132f9 3f4dc5ec", + "c12dc124 c23c826d 4176f508 3c4f2603 bbb71e25 bc267653 3c28d02a -> 3edacc8d 3cad9768 3d6b55bb", + "422cb184 41a05ed4 418af244 be8613cf bdfe4619 be477460 3b1ed346 -> 3eacc7d9 00000000 40334330", + "bdb1f200 c2435ccc c19f1efb be2e6acd 3e1f5f60 3e43f3c4 3ee85d00 -> 3f0db625 00000000 40c0137b", + "c193b465 41ec8688 c2348ff2 ba6ea8e2 3c5ea012 bc475611 3b6062e2 -> bea7f541 bd2ccddf 3cd1e050", + "c0e85ac0 422787b0 422f4b80 3da8b635 bd478f2d 3cdfb604 3bccbf0d -> 3f07a4ce bebd0546 3eb01bda", + "c068d8a0 415d7a88 c17844b8 b9e59311 3b4ccaaf 3a1bdd52 3c0f8f9c -> be8e5e5e 3bb7c696 3cbc1009", + "41c1c6cc c2122734 411cb694 bd0bb139 bd2e476d 3ca448d5 3ce670aa -> 3dd7ce20 3bd6aadd 3e828b82", + "c222f113 41883ff0 c1fd734f be279492 3e973366 3ec0f228 3aa0ef47 -> 3f07533a 00000000 40814961", + "40b7e8a8 c01b6e50 40260770 ba6632fc baaf414e b8d98f86 3ae633cd -> 3e31ed05 b9981e00 3b82987c", + "c07de5e0 c24573a7 c11a6110 39c3daab 3c0d9e31 3adad382 3c364a94 -> 3e25418a bbd8e6fc 3ca653c9", + "c1e49928 419f94e4 41ab1988 bb566b12 ba5b4115 3be54c59 3b74dab1 -> 3d060a92 38702640 3c42d6ca", + "c1ac4267 c11d9628 41f48890 be7fbf54 3d66ec76 3eda7b6b 3d67176e -> bb846395 00000000 408d3918", + "41bd3934 c1968bc2 41716528 bda159cb bdf7a5bc 3eba3768 3c454cc7 -> bea90450 00000000 404d9de3", + "416b01a8 3f3c3dc0 c1d52023 3b54f734 bb67ae0b bba189ef 3c1e5ec7 -> 3e745d03 bc5b6615 3cf84127", + "c215784e 41ec8568 41dc0330 bd202111 3bcb07f1 3cba70d8 3b0093c9 -> beb086c9 3df66766 3d95b530", + "409ebf80 c194dac6 4232ec82 3d102c57 3b584f9a 3eb55e60 3e88624e -> bedc109f 00000000 409ea23c", + "c23927b0 41cbdeb8 41bd8348 bb3df507 3a0f0828 3b5a04eb 3e5d7cb9 -> 3eec0e81 3b5e0630 3fd701c0", + "41c540a0 c1951c17 41996e60 bda1b354 3d368ef1 bce30019 3b0d9fb0 -> 3c80e5b9 3d644aac 3e879df3", + "c1489ae4 c0bd9300 420f3432 3c07fc7a bb948996 3ab478e7 3b407c1b -> 3d787853 bbb67f21 3c4598be", + "40fea4b8 4087e7c0 c1087014 b9b1598e 3acf89fe 3aa4da57 3b1fe7f1 -> 3a970728 bb2b91e1 3b809a06", + "41636128 c183ca50 c1d94b9c b963b0c9 3a75c9ad ba1e69f1 3cf522e1 -> be8608d9 bae9b985 3da80968", + "41f80184 422412b8 4217c560 3dcb6925 3df04fe5 3dd72d76 3e80b1e6 -> 3efdfdde 00000000 405f16c5", + "422583d6 4201585c 41401ef0 3a0a0e77 b974d35a bab884ed 3d99025b -> 3f518b0d bb8c0d0a 3ec0db74", + "c1ea3768 40cb7bc0 413d8494 bc983448 3cb4a4e5 bb077615 3e09ac4b -> 3e6758ea 3c0b3296 3f85e401", + "c0a12468 409a9a10 c20b7a16 bd042127 bd98f070 3dc313ab 3cf3bf9d -> be1397ec be159edf 3f3afccd", + "c20aea0f c196ee48 413f822c bc8a0c99 3df84873 bdbd184a 3d5bfcb1 -> 3e3e8a0c 3e6fc26d 3fac6a2f", + "416f45e8 4024ab60 c20254c2 bc41bc5a 3ca0a608 b912e455 3b6cb69f -> bcb75721 bba9ac1b 3cbd8f2f", + "c1dcde97 405d03d0 420beb6a bdf95a09 3dda683b bd4ba50f 3e94c781 -> bdacd2ad 00000000 406a7469", + "c0a82100 c22391cf c181c02c 3b8c77a9 bbee11e2 ba28fafe 3d0e4a28 -> beb07d40 3c01300d 3e0e36f9", + "c216b2c6 c22a4617 423120be 3ba529a1 bb8acf04 bb8d2ed1 3c83f9e7 -> 3f10580c 3a753e68 3d701324", + "c1be9eed 423f13e4 4219f088 3cc2c84d 3d274f82 bbad8d0a 3d8d721b -> 3da46a90 bdb84453 3f171580", + "c233e861 4231e500 417a1520 bb686b9a 3e38ad4a bdb2f14b 3c43d66a -> 3d9b99b7 3df1ba5c 3fa28a85", + "422bd5e6 41a5e550 c0e21d20 bacea02d 3c1f3918 3beaf795 3d56b130 -> bdcc2910 bc09d068 3e95084e", + "c22c6a16 412599e0 c08e6c68 3b5c0ef1 bb630f15 ba93b3f7 3ef0300f -> 3eb39ea9 00000000 4071ac24", + "c19c617d c11ba4b8 411da408 3b4d6b75 3b07199b bb2d549f 3d08122a -> bd87e2f3 bb54e136 3dbbf40b", + "41616198 417a9120 c1b5af49 bd5dd42d 3cb680e2 be233b5d 3bbed10f -> 3dafc5b0 3e5340f8 3f5e3436", + "41bf2ccc 408c03c0 c118d9dc 3a9d0c25 3ab7d2d5 baf48cd0 3bbe5476 -> 3c7c10a2 bb25a5d9 3c27aceb", + "c21637f6 c1c996e2 40e0be00 b99e2351 baad5d5d 3ac4926b 3e7cf616 -> bdf16ec9 00000000 3ffdf7f7", + "40acd768 41858cf8 411513ec ba6e2f3c bab6f428 38def2c1 3b51a499 -> bdf9cd2c 3b25ab3b 3c35d096", + "3fed8c80 421257a8 41b984c8 3d44faee bdea39fc bd521db6 3cc30896 -> 3da093e7 bba91a30 3f39249e", + "40275560 c2032930 401f1160 3b443b4e bb24a0c5 bb6ec9c8 3c8423ea -> be4f0b62 bbe4885c 3d3a0be1", + "c14337f8 c1939123 c21cb19d bcfeae16 bd2791a6 bd0dd7c9 3c8a3000 -> 3c3f0b74 bdbac0a2 3e514b66", + "41f0cf74 c1354c3c c1a8fd07 3d8abeaa 3d90f579 bd886028 3d560868 -> 3e6d9f0e be96773c 3f749793", + "c2429aaa c1e20e23 410fdf20 be83e19b be29abf1 3d593a9d 3b051f85 -> 3e7adf3c 00000000 401f83df", + "423b08d2 c22fdd9a 41162f4c 3ad07900 3a3e4eb4 bb70eb25 3bb18299 -> be100548 ba56f4bf 3c0dab51", + "bfdc5860 c20da416 41aa15a4 3e9ff348 3e847c72 be9d0338 3c863215 -> 3f258785 00000000 4085cab1", + "41b8af54 c1b20f6c 4239e3c8 3b5358e6 3aad6b92 3a27c9ea 3cea46ea -> be00c12a 391bb04e 3dd2dbcc", + "c213fc40 421b67c6 c1b94d77 3c3753d9 bc734322 bc29be17 3b0953bf -> be94b48e bc687abc 3cc7fdb7", + "41beb8ec 4245b5ca 41751f10 b8d2e890 3ac71c2b 3a9a0dc9 3b869f0f -> bee54054 bb4559ca 3c06db06", + "c1bff79c c241338a c1eaa6fd bd976991 be00a1bd 3d3e5f52 3afa3b20 -> 3ec9623d 3eb4baf6 3f2c7690", + "c1edd443 c20fef81 c1e93388 bda413e1 bdc10586 bd2bce42 3c2a5736 -> 3e2b7586 3e08df3d 3f10e72e", + "3fd11400 c2323537 c21575d8 bd42e357 3ca941c6 3c9f1605 3b8fe28d -> 3f120a03 3e2d271c 3deb5f61", + "420196a6 4115c874 c1fa169e b9ffb342 3a534341 3a791457 3e4ccfa4 -> bea107e3 00000000 3fcd56cc", + "bfc69300 41bdf404 c2305a89 bc978c7a 3d12abae bd19b81f 3a8ec908 -> be215327 bcc9ff7c 3db7e7dc", + "c1cac5a9 c2064184 c1807842 bceb3bfa bad30653 3ca4baae 3ca260cb -> bd81d10b bc8adbaa 3dcdb9da", + "41232c90 c1b2be18 41190a14 3be1b75b bc56c78d 3c3cc2ac 3d888808 -> 3e3391a5 3cfa8d08 3eb5aebe", + "c0c7d398 423b7a9e 42466902 3d71a61c 3c9fe543 3d43edae 3bd38aad -> 3f3fa311 3d513dae 3e597f8c", + "c205dd82 c165fd64 c15a7f94 bc9d431f 3c43ee41 3d008ff8 3e0d1ebf -> 3edb1868 00000000 3fb3ff04", + "41e76678 c21af7ae 40298460 baa08ad4 bb14defb babbe422 3c1052f2 -> bda13306 bae883be 3d0aa108", + "41d71ddc 41a59318 c12308e8 be2e8b0e 3d44c4b0 beb4f67b 3c9323b1 -> 3f541e72 00000000 4052b0d0", + "41fc69d4 c13a3ee4 c1ba481e 3bc5e457 3b13065e bc3429de 3d2fc02b -> 3d845c36 3c8761ba 3e17b218", + "c192b304 c2383a15 c1351380 bd5abf9d bd0260ec bcf566fa 3e96b51f -> be68728a 00000000 40394068", + "c1aca0b8 41f2a800 4151ed0c ba37ca9c 3cf58f8d bbf35092 3c51f94b -> 3e261a96 bbe7f2e2 3dabdbc3", + "41d59bac 4169b068 4224a870 bb056f3e 3b3fab2d 3b805980 3d36cc22 -> be688573 3b954814 3e30cebb", + "c1c2fa04 421f8c22 41c10d30 bccf2c4d 3cc7f122 be0dce5a 3b69c5ef -> 3e65af67 3e6ee93a 3f1a773f", + "c23cec4c 4228bccc 4201bfb4 3a843f80 39230961 baf55fa1 3cb88ca1 -> be0c2037 3aa4aacd 3d2b8fae", + "c0eeadf8 bfd086c0 419c6464 3c9ee37f baee8a88 3cb0e6de 3aa284bc -> 3ec1b1fa bc674aa4 3d005a5a", + "4235463a 420ebfae 416db430 3a16fb15 3a9e5944 b9f2cea5 3c853ade -> 3e87b5c2 3a5e56fb 3d0907e4", + "c23562a4 41dcb048 c0f3f440 394fccc2 b983d1ce b83d273d 3da67eb3 -> bec8ea51 b8eace08 3ef5066b", + "41bf2d28 c0eabe50 41332f9c 3d02aa9b bc9d8ffc 3c9a72d1 3b96a3c1 -> bf03530c 3de42ee1 3d98c92e", + "c1155cb0 c10efb44 41ed32d8 bd974378 bb20a400 3d2d801d 3e105d68 -> 3e602e32 3d040628 3fc18c59", + "422b1754 41a5612c 4210d558 3ce93242 3d035bd4 3b094e3f 3b367a35 -> 3dbc19f1 3d4905f8 3d84fcd7", + "40c329e0 c146c284 c2085825 be31dc53 be50e555 3e51d88d 3ec706c6 -> 3db6cb49 00000000 40b90cc9", + "4243e704 424338fc 41d3d5a0 3c7a0bd5 bb903808 bc9776d8 3dbdbc37 -> 3d0c398b 3c98e2a2 3f018e5c", + "c2252e6a c11ae1f0 418c3858 bb91353c 3a870507 bb1604d9 3d030631 -> be2fee50 bbfb1b78 3dd9f4ca", + "c224c69d 414c721c c1acd3aa 3d0b979b 3e10232b 3dbb05ae 3de1f18d -> be1503ea 00000000 400f8b2d", + "421e0ce6 c0a8b6d8 c243c2de bd03a3f0 3cf59a17 bcd5a601 3c2ccd2c -> bebf64ad bda6233d 3e0ad3f6", + "c0cc27e8 4206f2e4 41d8423c 3ab92905 bafecea7 3b38bfdc 3cda80a6 -> bddfb159 bb35ffb7 3dd34d16", + "414de710 c2128c0b c01640e0 bc254755 bc45e1d0 bcac29ee 3ec8602d -> bebc1ef2 00000000 4054e467", + "c2201cfe 4122c6a8 41dd3948 3c147a28 bc526849 bbb0bef9 3abd9726 -> be60b16f bc5bbe60 3c4761c9", + "c1e8edaf c244b358 41223c84 bb301a46 b88b4467 3b81231f 3b4af11d -> 3d1bf59d 3c080b88 3c32c356", + "c1c36e59 c1a2edc6 42027b8c 3b33f959 bb5e708f 3b356599 3e871420 -> beb920cf 00000000 400926d9", + "4190137c 41cca28c c1f7128c bae1812b bc162ac0 baf755f2 3d48ba28 -> be32dc85 3c31f3fd 3e4d4862", + "c1718858 c233d8ac bff265c0 bc59910c 3bcfe2a8 3b9e6f0e 3bbcb75a -> bed721df 3c7205f5 3cf896f6", + "bfe0a840 41a8c2b0 423e41d4 3c7cab55 3c032a7b bd7d8fd7 3b145f10 -> 3db8ea2f 3dbe60f0 3e05b928", + "c03b0740 c1a43b25 c1b88de9 b9001163 3a4efc0e ba4f9bc2 3a89e062 -> 3db4fd18 bb3e3d24 3b829fc3", + "41d6efa4 4217e5fa 41e80124 3edcacd0 3eb70573 3dc8f8d4 3ec18d90 -> 3ee4cdb6 00000000 40f14053", + "40bc5620 423e26fa c23334e8 bc02192e bba1e241 bbf05824 3d15392d -> 3cebfb60 3c339561 3e49bda3", + "4180eb54 408eb1c0 41c553cc bad3a44d bad31177 ba54cfc9 3b163b32 -> bd9db823 ba664a9e 3b73ad59", + "413a86bc c2301c0d 4247eae0 3b2af1ff b9ad38ab badf6e7c 3ca1de3a -> 3d53d5a3 3b90cdbe 3d97675b", + "42283fd8 c02d4ce0 419c2700 3b6eb148 3ab57258 bae00e1c 3d28bd87 -> bf48e082 bc22c8e0 3e294e19", + "c21dd324 c23f9961 c2091b10 b9febcc6 3ce0b479 bd0fc9e0 3bb1868a -> 3c1ab991 3bd3b354 3d988d29", + "c1ceb757 4198c930 c1708a10 be4dee66 be859196 3e55efa9 3d6b78d8 -> bf43b721 00000000 406427b5", + "40e91718 417a8270 c14dcd6c 3e58e9cc bcf20852 3e847b8f 3b0a6d23 -> be5916ae 00000000 402c3640", + "41e9d014 40e69e30 c1034778 3969c314 3c91fe86 3c374f8b 3a8ee9ad -> bc3cc926 3c97b892 3c8b28f6", + "c1dae051 c20c931f c2425fe1 3ad973d9 3a360394 3a03445e 3e236e37 -> 3d529c6e 3a85d7e6 3f72eaad", + "4231cb58 41b668d8 42270488 bba77add bb2f58dc bae84f97 3e92fa8c -> 3edb6c95 00000000 40157490", + "41012484 c2369a2e 418ce520 baf6be46 ba3c4749 3aeb1332 3d768676 -> be58290a 3bcf3624 3e931d23", + "c2337fae c2393715 4200e490 bd94d81d 3d36a176 3e2a01ac 3c78a1a7 -> 3e590b84 3d3e3574 3f94b700", + "c247fc0d c1836620 41898648 3ed884b0 3e81b803 3e278634 3e740ba4 -> bec03c1b 00000000 40c122ed", + "c240e0ab 40b16498 4237afaa 391ff3aa 3a73fc50 bb22910a 3cc01aac -> be98ac14 3843e420 3db7dc5c", + "c1e44db8 3f423340 423905d6 bc553488 bab6d05e 3c08716c 3e1f65a7 -> bc8fb0f5 3bc1f562 3f722cf8", + "c0cfea50 c1680478 c2368762 3e6b16e3 3e094688 bd299219 3c260a75 -> befa6cc8 00000000 400e5825", + "4238038e bffee4e0 c1a4e745 3cc7d463 bcce20bc 3db744ee 3e0587df -> bec23c1a bd0efd54 3fdeb630", + "c16d8a98 41ec8c54 c1e59844 bc012e78 3c24970e bd857b20 3c290ee4 -> bec731fd 3dacd1dc 3e478e2a", + "c245c1d5 c1942f0a 41a6638c 3d4ea696 bdb5a227 bdb3f7fd 3ceb09ea -> bf5c99fe be175a98 3f491d77" + ] + }, + { + "glsl": "vec3 cultmath_af_fbm(vec3, vec3, float, int, float, float)", + "tolerance": "ulp-bounded", + "check": "the arguments are (cx, cy, cz, ax, ay, az, radius, ...) and the result is the form (x0, a, e). Enclosure: for eps in {-1, -0.5, 0, 0.5, 1} and d in {0, +-ex, +-ey, +-ez, (+-1, +-1, +-1) / sqrt(3)} (15 directions), form the point p = c + axis eps + radius d in double and round it to float32; the device's own reference value at p must lie in [x0 + a eps - e, x0 + a eps + e] with no tolerance, so a device whose gradient error exceeds the allowance fails. Tightness: with L = 7.9640074 and, for each octave (one for af_snoise), R = |axis| + radius, B = L R + 2^-14 + 2^-12 R + L 2^-20 (|c|_1 + R), the width |a| + e must be at most B + 2^-16 (1 + B). Report the least slack of each side, absolutely and as a fraction of e; only the two bounds fail the check. The reference value is cultmath_fbm_grad(p, octaves, lacunarity, gain).w, and B is the sum over octaves i of gain^i B_i, where B_i is B for the centre lacunarity^i c, the axis lacunarity^i axis and the radius lacunarity^i radius.", + "cases": [ + "411c537c 420ffeae 4078d1a0 3cdfc7fe 3ced8823 bd581451 3bd5bfdb 00000004 40000000 3f000000 -> 3f1c017f bdc20710 3fd28f0a", + "c2172004 410ab7d0 c1f2ca42 b9a78fc6 ba1d7262 3a8c08d4 3e338f4e 00000004 40000000 3f000000 -> bea9d56b b95ec7d0 40b0b5dc", + "4115776c c2005a28 c21c7d94 bb82d4de bbf99288 bb14556b 3e706f99 00000004 40000000 3f000000 -> 3e0cb256 00000000 40f88286", + "c1dc368a 41869c94 4226de20 bcfe94ff 3b70c570 3c88304e 3d6c7520 00000004 40000000 3f000000 -> bf10b24d 3d77694a 401c02c7", + "c203bcc0 41cb2bbc c209d08b 3d98457a bd489b84 bdcfb707 3d19027b 00000004 40000000 3f000000 -> 3d8f1a2c be4d5c90 40a085a5", + "41e45754 42248ae6 411d2fac bd7d08bb be3dbc00 3e5fb94c 3dbc85a8 00000004 40000000 3f000000 -> be1bcf46 00000000 414455cf", + "c0ff5658 4216c372 c1aea658 bc0f34a6 3c62e6bc bbc51abb 3d16dd85 00000004 40000000 3f000000 -> 3db396b2 3d0fb0eb 3fadba4a", + "3eaaf500 4180ac44 c105a4e0 3a9cdb0e b920ef6e ba380c9d 3d088bb6 00000004 40000000 3f000000 -> 3e9e0360 bb918bc6 3f415ce1", + "4201700c 408d4338 42173afe bd1957c4 bd11a659 3d45b37c 3bf04183 00000004 40000000 3f000000 -> 3dbb520b 3dbf9818 3fe2b61b", + "c20c49a6 40291410 40962208 baaa709c b949a8bd 39947c97 3b1fa49a 00000004 40000000 3f000000 -> be925bbe 3a69b13a 3cf09453", + "418bdb28 c1f8333f c211ebc4 ba84873a ba463c1f b95ca930 3b5a553a 00000004 40000000 3f000000 -> bf770906 3b95ac4f 3d265141", + "c07870c0 40f13610 c1c85790 3b1283eb 3b36b039 3abd56b7 3bffdb24 00000004 40000000 3f000000 -> 3d822045 bc9bcf63 3e0c25ca", + "413c9a20 c23a522a c236024b bdc256ec bd305cf0 3d093814 3bb9292f 00000004 40000000 3f000000 -> beb0848a 3e05dd8c 403e106a", + "421c32d8 42387e66 c1af30cc bc15aee6 3d74e834 bd35d262 3a901e4e 00000004 40000000 3f000000 -> bf049507 bd8d8e0e 3fda9ede", + "c20eaff6 c1b56412 c10f2d70 bcb56591 bd29e076 bcd5a70f 3cad2e7c 00000004 40000000 3f000000 -> bda46ee0 3dc371cd 3fe8522a", + "c223bb64 41939ad4 c2054531 3cc10801 3c94f8ed bb0df003 3b6a1616 00000004 40000000 3f000000 -> 3e312a49 3d449980 3f01f0ee", + "41ecdc4c c1e2ecba 41ae504c baa38c97 3b90982b 3c1dffdf 3be0462f 00000004 40000000 3f000000 -> 3d881847 bccf5634 3e3f7746", + "41081668 420ea82c c1cf6363 bbd07906 3b82b3d6 3b750849 3cbc359b 00000004 40000000 3f000000 -> 3c0f8e9a 3b831b8a 3f070a26", + "c10886cc c1d48d63 c237c876 3b2755b3 bd04e56a bd167c20 3c8b3546 00000004 40000000 3f000000 -> 3cb79922 3e79e8a4 3fc50d28", + "41c549ac 40ad6cf0 41b487b4 bc78b86e bcb6a67e bbbb5f82 3ae26484 00000004 40000000 3f000000 -> bf25ff3f bdbb9878 3ed45f13", + "be8bae80 c229817c 42168f44 bb01345a 3b0875c2 3a0ef65d 3c7fd6ec 00000004 40000000 3f000000 -> 3ef5653e bc729d21 3edb26bf", + "c18533dc c21f8bfe c2291deb 3c75a994 3c89ab5a bb0e449f 3be0ad70 00000004 40000000 3f000000 -> be030eba 3ced209d 3ed41ab6", + "42287142 41822030 c212ee17 3d00286c 3d3a3436 3ca70d22 3dbd32ca 00000004 40000000 3f000000 -> 3e915cf4 3d8731fe 408ea808", + "c1eba852 c1be364e 415db64c 3e74ab13 bd22f014 be4840b7 3cd9de60 00000004 40000000 3f000000 -> 3e4f34fc 00000000 412c4558", + "c03eef80 c20adb80 41fe5c14 3eb261dc 3d2ed9e9 be4f2d0b 3d59cb57 00000004 40000000 3f000000 -> 3de797f8 00000000 4169a53e", + "4181b764 411d948c c1c836c3 3c6d35eb 3ab92f87 3a843a10 3dfc3962 00000004 40000000 3f000000 -> be51e980 3d343773 40874690", + "c219ea1f c1066980 411c8900 3cc2c99a 3c51cdbe bc1fbebf 3d3d3d98 00000004 40000000 3f000000 -> 3f37dd86 3becb908 3feec4d8", + "c11747d0 c20ca374 c244a40f bea1618a 3e22ed86 bcee5530 3e951a5f 00000004 40000000 3f000000 -> 3e8898e5 00000000 41a48846", + "42442582 409e6848 4245239e bda85104 bc0e8ace bcb8f19f 3c250714 00000004 40000000 3f000000 -> 3eadbadf 3dc9675a 4014ff27", + "c123d224 bf259680 42463fec 3a3dde01 babdeb21 3aabd6a4 3d7429e7 00000004 40000000 3f000000 -> bd9e4602 bb32844d 3fb31ae7", + "41b66cec 4211bb12 41daf39c 3cab930c 3b9ef4de 3bdaec73 3dcdb7c9 00000004 40000000 3f000000 -> 3d7f76c2 3d994a22 40714ada", + "4202cc30 c1eedf0b 40e05e58 3c1488c3 bd3f0b41 39fc484d 3ee10a01 00000004 40000000 3f000000 -> bf143d2e 00000000 41784a5a", + "c213337c c1825a24 c0b80728 3ae06722 3c0753d5 3b743588 3d6b9e8d 00000004 40000000 3f000000 -> bee90a95 bc5732b8 3fd3acc1", + "c243a17e c1daf546 c210a96c 3bdee19b bc217553 3c6824f7 3b39b092 00000004 40000000 3f000000 -> 3d4dace2 3e09c90c 3e7270f2", + "c10df350 c16e9b00 c1c8ea76 3b92303d 3b913dd4 bb927456 3c58fb7d 00000004 40000000 3f000000 -> 3f0b8c5d 3ad46f70 3e988bf1", + "423296a6 c1c6e3ca 4230a43a 3e96b5c1 3de42fdd 3e7d2deb 3b016bd0 00000004 40000000 3f000000 -> be8b11b8 00000000 414d1209", + "424489da c2414dd9 c23b602a 3b70c6de bb267566 bba1fd58 3ecb270b 00000004 40000000 3f000000 -> be882fb2 00000000 414db6b4", + "c1cc6650 c2173e2d 409bad30 bbaa0af1 bcdb880d bd247759 3d7f487e 00000004 40000000 3f000000 -> 3e938264 bdca314e 404c24dc", + "c1e34d41 c11bd9a0 c1782270 bb4520aa bae77110 bb384961 3b84c9fe 00000004 40000000 3f000000 -> 3d8e1b40 3c2a59b9 3d966dbf", + "c1ca1942 c23d39f4 bf029600 3b8c41e0 3b106e20 3b5fccdd 3c1b94a7 00000004 40000000 3f000000 -> bf26dd3c 3cae430a 3e4cf68f", + "c1267c64 c23c717d c0c0a6d8 bd81f5f6 3d06ddcd bcb414ab 3b0666f5 00000004 40000000 3f000000 -> be709ffd 3d31fd14 3fdc8746", + "c1c947d7 c1aadb76 c23cbf72 bd1b72b3 baf5d1cc 3e035db1 3dfcc1b7 00000004 40000000 3f000000 -> bf4845aa 00000000 41032705", + "c1cd979f c1b277ff 41bdb4e0 bc07bdf0 3bc1f212 bc94d0c4 3de96f8a 00000004 40000000 3f000000 -> be3c9e4e 3be7a95c 408009ea", + "4232f882 41f52f90 c2355fd8 3d9271cc 3d9172a4 bdb00051 3d14a05c 00000004 40000000 3f000000 -> 3f521f0e 3dbf640f 409c8ce4", + "c15a902c c1fab89a c1ef6846 3bbfaefb bbabc19a 3a6049be 3cd54597 00000004 40000000 3f000000 -> bebeb15e 3aac906c 3f26f904", + "c23bcbdc c1d87d68 4230c31a bd83e10a bd40e6d3 3da20469 3ddeecaa 00000004 40000000 3f000000 -> 3f8edc0a 00000000 40e19e49", + "c234dd23 41b040d0 c22fbcc4 3cd334f5 bc644858 bcd9368a 3de10869 00000004 40000000 3f000000 -> 3e69ba9e 3d803067 408da2c3", + "42377f12 418e6760 41d721e0 3b0eb82f 3acbdba7 bb365e5e 3c860ebf 00000004 40000000 3f000000 -> 3eaa7286 bba2a423 3ecd69d0", + "c20ccc7e c09e8f00 c0f24d40 ba9e563f 39da0c06 bb2e59a2 3ebd30c4 00000004 40000000 3f000000 -> 3ebb9461 00000000 413de01c", + "41c25fcc c1e5b6b7 c07eba00 3a2527b8 ba184cec 394943db 3d808514 00000004 40000000 3f000000 -> 3e2705be ba8ce326 3fc82fb6", + "422fde8c c1a640d7 41b087ac 3a4e0054 399e043c 3a0003d7 3aed7f91 00000004 40000000 3f000000 -> be81ba06 ba65e97c 3cfd6775", + "c2149916 c0b07e18 c0a3bdb0 3887bc26 ba550c0d 3a8b272d 3c68e036 00000004 40000000 3f000000 -> 3e8ac2bc bbbf2d7f 3e7fcb3c", + "4225e29e bf44cf40 4127cb64 3d9bfc92 3d2a5b7b bc04426d 3c9e49f7 00000004 40000000 3f000000 -> 3ded1620 3ca6bc60 402f0b19", + "418e42d4 c21c207c 41f34ba8 3d592b51 3daab19f bd9c1fa4 3d5cf5df 00000004 40000000 3f000000 -> bedddc4c 3d445dfc 40a788e3", + "c218f1ed c21ec03c c138a8d0 3be10d36 bb9c4122 3b788abe 3d026c59 00000004 40000000 3f000000 -> 3f544f07 bb308b88 3f5cc15c", + "41f1f754 c1891084 c236bbcc be15fac3 3e422392 bce56cbc 3ce18e2c 00000004 40000000 3f000000 -> bd84f716 00000000 41090701", + "c1851b76 c23ab103 c2080ec0 3ac83244 3b11ce25 3b115b03 3b95dd08 00000004 40000000 3f000000 -> bf389656 bc51612a 3d92788d", + "420405ee c1cc8666 c11ba998 3cea263b 3d2fbfa9 bcaccf37 3b2168a8 00000004 40000000 3f000000 -> be056936 3e2bf367 3f9266c6", + "c134a4dc 41f5e4a0 422e947e 3c11079d 3a3c6129 3a9d0fc8 3d8ce42f 00000004 40000000 3f000000 -> 3db34a97 ba72b87c 40124739", + "41e0b1dc c234b7a2 4233680e 3c053f76 3bc92a3f bc00568a 3d94dbc6 00000004 40000000 3f000000 -> bedbca2d 3d135bc2 4016edab", + "419176a4 c1b754a1 c13adbc4 3da35925 3db19a6e 3dd8896f 3bdeb1ae 00000004 40000000 3f000000 -> be140a2c 3e085bd4 409726cc", + "c1a440cf c20ffaa2 4011de90 3d0fdb5c bd3502aa 3ce9e87c 3e6690c8 00000004 40000000 3f000000 -> 3f0be84b 00000000 41130af8", + "c237bde3 421f4634 c07e0180 bbd08915 bbe50f3f 3b41cacb 3e1acfe4 00000004 40000000 3f000000 -> be204d5f 3c589908 409f55e0", + "bf896f40 c0049b30 c0f01c28 3d37b07c bce0367d 3c3c765e 3b79fa70 00000004 40000000 3f000000 -> 3ed17233 be48385e 3f8ffb3e", + "421c494e 41aaa140 4232a7ac 3b1bc953 3a322380 bc1122f9 3ce43c6f 00000004 40000000 3f000000 -> 3da43514 bb0616fb 3f2baf0e", + "42175292 414d2140 c215dfd5 bd8fd165 3d6aecf2 3d4a4ff1 3d9ce7b6 00000004 40000000 3f000000 -> bf36ed0d 3d868ea6 40ac8226", + "c1b0fdd2 c2291c77 bf991b60 bd9983d4 bdcd1673 3cf442c9 3d8739ba 00000004 40000000 3f000000 -> be1dcbc2 00000000 40c67817", + "40c87c08 40f32a88 c1abf512 baa2ef7f bb831d5b ba6aca33 3a8fd1b4 00000004 40000000 3f000000 -> 3f42ae20 3ba64d34 3cd437fd", + "4097f6e0 c19a0a22 41c649a4 bac6b4ca ba86ed60 ba410d2d 3cd8d4f6 00000004 40000000 3f000000 -> bf3f72b6 3bef905a 3f1ee1be", + "40f5fef0 422a0d2a c0c98ac0 3c2eae2b bc59bfb3 3c0aa4ee 3d1a6b3e 00000004 40000000 3f000000 -> 3d16c7e3 3d9de831 3fb35611", + "415035b0 41b5a8c4 c1374cdc 3d9c060c 3db531a3 bdead4db 3e4d0732 00000004 40000000 3f000000 -> 3ead9ab2 00000000 41397e32", + "c229ac66 c1b5de74 42357e04 be69f671 3ecd9be6 bea8e569 3d39a28d 00000004 40000000 3f000000 -> bdf96add 00000000 419c42f5", + "c1ff5411 c21bd882 c210fa43 bd549937 3d0f6cb8 3c18dc4c 3a99c6d9 00000004 40000000 3f000000 -> 3ee1da62 3e7d93f9 3fb100d2", + "41cb1a2c 423870ac c2013c28 3a5ce20a bb1c13ca 3b1ee37e 3cea75d9 00000004 40000000 3f000000 -> 3d269dc6 3bb40300 3f1ba0c8", + "41d9e464 41a0fa94 41ab67e0 3d7116bd 3cd00be8 bd2fdf7a 3da7d2a4 00000004 40000000 3f000000 -> be85143e 3d43d7a8 40994b5c", + "c1cac9fe 421e2dca c2371229 bdb08185 bd82b8fd bdb16dce 3d2ab264 00000004 40000000 3f000000 -> 3d9154df 3dfe6ec5 40a96d25", + "41fd83f0 42016df2 c1cdacaa 3dbfffe8 bdc374a6 bc92e18e 3e890e37 00000004 40000000 3f000000 -> 3d64fd94 00000000 414d49ff", + "c205ca8a c1606a2c c23c16c8 3d67d977 3ded8794 bdb23d0c 3e59beb6 00000004 40000000 3f000000 -> bf08c549 00000000 413bc6c5", + "bff03ba0 c1093fa0 c1f052e0 bc4e7a21 bb9f73ad 3c4b9813 3ccc00b4 00000004 40000000 3f000000 -> bd2eebf3 3d405ca8 3f611504", + "421ade98 c0e3b290 c0a12a90 3afc5cba 3b045372 3b17603b 3c480e98 00000004 40000000 3f000000 -> bdab8b47 bbf0eb80 3e5c9ce0", + "418240c0 40f64790 c10c3058 3df2ae14 bdf7c941 3d1eae4f 3d7f99fc 00000004 40000000 3f000000 -> bdbdfd18 3b2e3084 40e6ff49", + "c1b406b5 41fc1bec 405bdb60 3bde1568 bbb217ef bcbbd99c 3c5808db 00000004 40000000 3f000000 -> bf43c50d bcbe6da6 3f1edf41", + "4166e980 c1ffd0bc c13c16fc be2efa14 3e081ab6 bda387be 3c4fb685 00000004 40000000 3f000000 -> be67fc48 00000000 40f834f1", + "c2242daf 41b49f7c 4219fe2c 3bb0f7aa bc3c4955 bc22543b 3c95fae2 00000004 40000000 3f000000 -> be595a64 bc9c4132 3f1ae475", + "41556784 414ba754 c204e145 b98f7dbb b8bd070d 3aade21e 3c90c46f 00000004 40000000 3f000000 -> bd90727f 3ba44422 3eb84292", + "41d03c0c 405e1cf0 c1c60785 3c45ff78 bc173ac0 3c4adc98 3cb15136 00000004 40000000 3f000000 -> bf37474a 3c594a64 3f504fd9", + "c13ccdb8 c23a1648 413c7d78 bc0eb46b 3c83ec9e bc40c023 3e8316fe 00000004 40000000 3f000000 -> bdd993ce 00000000 410da223", + "c1d041d6 c246760a 419686b4 bb5be93a bb361775 bb943699 3b028a06 00000004 40000000 3f000000 -> bdbe74d9 bc955d8f 3d6bc9ec", + "4127864c c22d5136 421a85be ba166083 3a7c6a4e 3a87654d 3b3da2f8 00000004 40000000 3f000000 -> 3e9066ff bb12e24f 3d1d9900", + "c1a8d5b4 422831fc c216125e 3adf7cd6 3d1403ca 3b51cc8b 3e6c424d 00000004 40000000 3f000000 -> bc525770 00000000 41082a35", + "420908a6 c12f5a80 c22a1a67 3b920fbd 3c9f363a bd091319 3e0cf1ac 00000004 40000000 3f000000 -> 3f54b1af 3dd0989b 40b0c7e5", + "c14579b4 c1b3547a 420a16ec 3bf763d4 3b7da53e bb9575d9 3d07c0a4 00000004 40000000 3f000000 -> 3d22982e bbcadc76 3f7ea837", + "4030fd10 c20f5980 42092180 bd5515bb 3de948c8 bd8ea10b 3c5f2217 00000004 40000000 3f000000 -> bf11160b bdc067ed 408e4bf8", + "c238511b c0a9ea10 c1e0665d 3ba54046 3b4c0d0c bb411075 3c104895 00000004 40000000 3f000000 -> bdc964ee bca0f31c 3e483a80", + "c0445af0 41fa5a18 c11c12b0 bd9db44f bcc1d296 3c579407 3e8c2982 00000004 40000000 3f000000 -> bf0edfe3 00000000 41352a42", + "4225cc26 c2225436 41501db0 be8f3834 3d6f936d bdaaebbd 3d5eb176 00000004 40000000 3f000000 -> bd8cbc96 00000000 41338247", + "411485a0 40c57c18 c2243a7e bc1a7bc9 3b9af474 3a80b769 3ecfc4b5 00000004 40000000 3f000000 -> be4fb387 00000000 4154452e", + "c217c05c 41778088 4106289c b8885eb7 3a7a4344 bace5f60 3dcfa3b6 00000004 40000000 3f000000 -> be25ac6e 3a19bc8d 4035157a", + "4220e7f6 bef0af00 423271da be5d6948 3d90c874 bd4d1b49 3b201707 00000004 40000000 3f000000 -> bb612ed0 00000000 40f008c6", + "40f6c250 42300a56 421d1f5e bb0e366d bac902cd badca25e 3c8e304c 00000004 40000000 3f000000 -> bdd38c54 bb943dda 3e8a3e2b", + "c22f7f7d 40f5b168 41f1b1c8 397280f0 3b2a6234 ba872054 3dce86ff 00000004 40000000 3f000000 -> bd005989 3b4a8604 403c11a4", + "c1bb65fe c0cb79d0 41453ab8 3c342f8d baa7a691 bb3f8190 3b2e2cdb 00000004 40000000 3f000000 -> bd17f51e bc281275 3dcf9d93", + "c2409be0 421ad8c6 c23552aa 3c512ad4 bc0741f7 bc1db66c 3a8aa963 00000004 40000000 3f000000 -> be01052c bd693f44 3e297c8c", + "c217944c 42324ea4 41efb8c4 3aaa51b2 ba3e226c 3a5fa69c 3e13d388 00000004 40000000 3f000000 -> 3e9369d7 bb1c69b6 408ca7a4", + "c16dd4a0 c2161616 c238bbb8 3e81f7fc 3e706cde be2c0998 3e8e8ffa 00000004 40000000 3f000000 -> be969c26 00000000 41a8f6be", + "c1f628bc c1ecc8a9 41a540b4 3e0eb5c7 3e128dc3 bd41fa29 3b0380ac 00000004 40000000 3f000000 -> 3ec5d8cc 00000000 40d36afb", + "3ffe1900 41bc7720 c1e3b349 bb8a3a10 3b5ea705 3bc6e9fd 3d66046c 00000004 40000000 3f000000 -> 3d18bda5 bc9131e1 3fe13312", + "c200dd4a 41ea7378 c23a88ed bcccd3df bccd7e23 3d09dcf5 3ebee519 00000004 40000000 3f000000 -> befe117a 00000000 41570078", + "41ad79cc 4201637a c21970ac bc1f7965 3afe1001 bd228b52 3af04ad1 00000004 40000000 3f000000 -> 3e208181 3d110ee0 3f36a57e", + "4196af18 c20f817f c0e2d0b0 3bc45404 3b2de722 bc56553f 3b249da9 00000004 40000000 3f000000 -> 3ede3592 3cb61a04 3e1a81bd", + "41239a48 41961b08 410b28b0 bac2d6bf ba077ccb 38c70206 3d837891 00000004 40000000 3f000000 -> 3d0d4b5c 3ace0db9 3fcacced", + "c1a0330c c12f9d68 41b64970 3b0b10a0 3a10198f 3a9593f7 3efa8171 00000004 40000000 3f000000 -> bd7d845a 00000000 417aacd9", + "c1a2eb82 41cb51d0 c223ca7e 3adb1379 3a4eaa89 3a637c03 3a87764e 00000004 40000000 3f000000 -> 3d0c1b02 bbf8c03c 3c841ca2", + "40567380 c218d8e1 4188ccb8 ba940e27 b9fb7ccd 3b041baa 3d1cc688 00000004 40000000 3f000000 -> beaf346b 3c0748c7 3f71d871", + "41c39c50 421a3504 42467836 3ba9fc01 3c705f45 3c89f11a 3c166ce4 00000004 40000000 3f000000 -> bf0dcecd 3c8ef3cd 3f0e2095", + "c1a1c142 c0a9be30 c147065c 3a3cd099 ba977b2c ba3ee15d 3ae28c45 00000004 40000000 3f000000 -> 3f322a1e bb3eebc2 3cd4c1e3", + "c0d69ca8 c0d66d60 c212891e 3a4d922a 3e9d4e5f be1f4bc1 3eaa5834 00000004 40000000 3f000000 -> beb9cb24 00000000 41ac9285", + "c246fc38 4102ae20 40d10fc8 3e2b97b6 bdc27d20 bd972b41 3e8deaeb 00000004 40000000 3f000000 -> be3e7e40 00000000 417674a0", + "c0a2f3b0 c20f5cef c103e1c4 395ce8bd ba1fb581 b96fcc80 3ca9b456 00000004 40000000 3f000000 -> 3ea20d74 bad004a6 3ec63cdb", + "421fe0aa 41bb1d2c 4207b0bc bbad74cd 3b782db1 bbeb47a7 3cb027fc 00000004 40000000 3f000000 -> 3ebac1aa bd0e746c 3f100571", + "422315b2 4104c504 419ff858 bd9fcb38 3e239163 be0adefd 3e35b690 00000004 40000000 3f000000 -> bf4326af 00000000 414c74c0", + "41163514 c22f2b2f 3f32dd00 ba1f93d7 3a68e94b 39d04ee4 3e8e30da 00000004 40000000 3f000000 -> be3b7978 00000000 410e2b5b", + "c23be10c c03a5c40 410c2bd0 3c5d55c0 bd03d389 bae984a1 3b8c7f92 00000004 40000000 3f000000 -> 3ea82377 bdbdf1bf 3f25ed51", + "c2359360 4169d378 c232d50b bdce756a 3db86fdd 3d08a77d 3c141a22 00000004 40000000 3f000000 -> beec6c7e 3dc6e3c2 408582e7", + "c15b16b8 c22b46a0 c22b0d9e 3a43ab54 39c49540 3a117eec 3c8f7ce5 00000004 40000000 3f000000 -> bf4b1b94 bac84690 3ebb683b", + "c2317306 41075380 c11351e0 3c36c52c bc05fac0 bc73f063 3a996a28 00000004 40000000 3f000000 -> be540e3f 3cfed04b 3e52a3ee", + "c22d68b6 422dace0 c1413374 be14c27c 3cc72c35 3dfb6543 3d9e54aa 00000004 40000000 3f000000 -> be3afd1f 00000000 41093001", + "c220599d c05ad660 41dafdc0 3d23882a bc88995f 3cc3bb24 3dab11a4 00000004 40000000 3f000000 -> bd8922a7 bdc3c9f0 40784d38", + "c0fe4e78 c20adb17 4183900c 3ae63506 39ba8a8c badb5a15 3c7282ee 00000004 40000000 3f000000 -> 3e15b863 3bd70782 3e793356", + "4203017a c2152b1a 410df588 3a474995 3a928480 38e0cfb6 3d9250ff 00000004 40000000 3f000000 -> beed58a7 3b72db13 40074b2c", + "c11c9b98 c23cf58c 41a08b5c 3760a7fb 3ac5e2a1 ba7fb52f 3e0ab73e 00000004 40000000 3f000000 -> 3ea7d74d 3a7f8b97 407fa6e9", + "c1ef704d c14b2ac0 c2452805 3b2daf91 bb7da37c 39562286 3dc9bd51 00000004 40000000 3f000000 -> bdec5160 3ba3a1c4 4040c0dd", + "42018cf0 419ce7d8 c21760c6 3c362d87 bcc7d1d6 bc814785 3cbd890f 00000004 40000000 3f000000 -> bef82201 bd6c0ce0 3f94345e", + "41b190bc 423251f6 4245a90e 3ea4c751 3e629011 3e8796f5 3b2e5070 00000004 40000000 3f000000 -> 3d5829c9 00000000 4171eed5", + "4229606e c2252a63 c1e5851a 3d880688 3d8e1367 be28a442 3d2b6fb2 00000004 40000000 3f000000 -> 3da3fda3 00000000 40ed21f1", + "420fd0a8 4215f48c 423c6508 3acc1227 3c64e999 3b50349e 3e136eb8 00000004 40000000 3f000000 -> be110df8 3b2e4a0b 4094d126", + "41237d7c 420c2988 c1e4d57e 3aa08d69 baf8f89a 3af687e4 3bfe9c2f 00000004 40000000 3f000000 -> 3e2598c2 bb834a07 3def5dfc", + "41f36f74 c1f3b158 c10629fc 3caa5373 bc12d517 3c9f5f5c 3c20de7a 00000004 40000000 3f000000 -> bec3b24f 3d6050fa 3f36855f", + "c025aa70 420be70c c19d2761 3d7aa26c 3cb9f35a bd96c78f 3b650cdd 00000004 40000000 3f000000 -> 3e496efb 3e1098e1 4020d029", + "bfa424c0 4005d200 418f83a8 be05b11b 3dc56793 3e175267 3dc7bff5 00000004 40000000 3f000000 -> bf1512b0 00000000 41219a0f", + "c183a0a4 c1f42c6c c186c3f8 3a103d46 3ab210cb ba44e1d3 3e9c0f2a 00000004 40000000 3f000000 -> 3eee9c87 00000000 411c3c2e", + "c221d850 4219533c c21e81a6 bc049735 3b893ce3 3bf85884 3cb753b6 00000004 40000000 3f000000 -> bf50002d bd3c01d0 3f1d848a", + "c22bf575 4125b210 4235f31e 3ced564a 3d747ea1 3d9e2d85 3eea36a8 00000004 40000000 3f000000 -> bceb5634 00000000 418e8f1c", + "41b7923c c242eda0 413b694c bb1444dd bb8a58ed bb64d35d 3a8b7539 00000004 40000000 3f000000 -> beee7494 bcadd192 3d142226", + "c1ccac23 418f89cc c1debe36 bd435d47 3c8d15cf 3ccd69b8 3d8bf797 00000004 40000000 3f000000 -> 3ec7788d 3dc40de4 4064391e", + "3fa18a80 c13a51b8 41610668 3c0d1e47 3e05953b 3ea61ff9 3e384977 00000004 40000000 3f000000 -> 3f051bbe 00000000 4187068d", + "41c4cc20 c20037f8 41c7f87c 3c759bb1 bc37204b bca0f93c 3c900d50 00000004 40000000 3f000000 -> bf1569a6 3dea34f8 3f5cd91a", + "c1e7a170 c17607a8 c11824c0 bce59249 bd247b14 3c089c8f 3e9fbd09 00000004 40000000 3f000000 -> 3d839393 00000000 41385f5e", + "4177cb88 c2227f1d c200ddd1 bb71c7ac bc9a7c83 bac33178 3c449a2d 00000004 40000000 3f000000 -> 3d66dd71 bc867476 3ef4102a", + "420e2e14 c1b3b6de c1f6a4d5 bb5ec704 bbbb1ef4 b9ba3033 3a9e7431 00000004 40000000 3f000000 -> be3f6fcb 3c8c025e 3d2e7ce5", + "c240dbf3 41e17ff4 40aa9840 b9c9cce5 3a948e51 bad432f8 3efc4242 00000004 40000000 3f000000 -> becc3aa6 00000000 417c3364", + "4146ff04 41d0546c c0fe7040 bd052f6a bd4ba0c2 39952496 3c9ccb33 00000004 40000000 3f000000 -> be8c8080 be39cb6b 3feac941", + "41e61164 41ad821c c1b282b6 3a16211e ba64f483 bb2907c6 3d2cec18 00000004 40000000 3f000000 -> bf28d674 bafb911c 3fa30b43", + "41a60e2c c16f90e8 4163bd10 bcf30046 3c8c5e01 bc94e11d 3b2ee13c 00000004 40000000 3f000000 -> 3e9f5902 bd92cc11 3f2db74e", + "42159f40 c148f810 410e0e98 b9bde814 ba951933 384cb80e 3ea032af 00000004 40000000 3f000000 -> 3f18309e 00000000 41201f5a", + "42294a94 c1ff8889 42210fe6 3cebc33b 3d19012b bd40f60c 3dad6897 00000004 40000000 3f000000 -> 3e94f0f4 be4eab35 409319bf", + "41daa4f8 41ad85bc 3f86e620 3c608281 bcb6110d 39f4f78a 3cfa574a 00000004 40000000 3f000000 -> 3e45d604 3da15402 3fa4e459", + "c144db10 423482c8 c0c98a00 baa83824 39adf9e1 3ab49f60 3e611d77 00000004 40000000 3f000000 -> bf0c89ac 3a7eab6c 40ddc95b", + "4052aeb0 c1bde8aa 41f63704 3cdbd6d0 be4d42a7 3e7fb717 3c047d34 00000004 40000000 3f000000 -> be41d3e9 00000000 4127f1e8", + "c1e42928 c16bc4e4 bec52e00 3a8ddb4f 3b7fd64f 3bce15d3 3e99a768 00000004 40000000 3f000000 -> 3f51a34e 00000000 411ccded", + "c1e322db 422b57ea 41e8a030 bb882c35 3b6246c9 bafd1d26 3e28ec8e 00000004 40000000 3f000000 -> bd686c66 39259560 40a65d3d", + "4211ff44 c23881bb c2408cbc bcdb0532 bb7a122e 3c977ce9 3bead6df 00000004 40000000 3f000000 -> be84d440 3d96ff04 3f2f7580", + "c1d129a4 c239ea97 c2113185 3c8ab16e bc13c331 bc42ce29 3d815d00 00000004 40000000 3f000000 -> be1b01cc 3d0b6454 4009a469", + "41b54d74 c2024474 c19e6a2d 3ace17b7 bc169492 3c5c82cb 3d5daf55 00000004 40000000 3f000000 -> bd42580a bced5044 3fdc4ceb", + "c22ae99e 3ff9bb80 420e208e 3adfb11f 3a13028b 3a2b936b 3e29ece0 00000004 40000000 3f000000 -> bd41e7a0 bb644498 40a8f1a9", + "42182fb4 42429ae2 c23d8dfd bca4e0f7 bb097ff9 bc0e8822 3e061731 00000004 40000000 3f000000 -> bea790ca bd25623e 4093dc58", + "3fd654c0 c2004134 c21f34ce 3bad1e4c bb91738e 3cc04991 3ed8f2a8 00000004 40000000 3f000000 -> 3e20721b 00000000 41647cdc", + "41d5a748 c2166cd2 4132b138 b995c986 3abc59b0 ba4128e2 3d9b3055 00000004 40000000 3f000000 -> 3ed7857d bb6b41e7 3ffcdaff", + "c2327858 c1456280 c07ca960 3b5630f5 3bf9ff4c 384c9e8e 3d540510 00000004 40000000 3f000000 -> 3edd0178 bc011321 3fbce5a6", + "c1095c08 c19426f6 4100a1e0 be8d7e18 3e1350ea 3d9dfedf 3baf2075 00000004 40000000 3f000000 -> bf2c9d8d 00000000 41265815", + "420cfe34 3fe4c000 422288ea bc14289d ba767164 bc1bf9dd 3d7063e9 00000004 40000000 3f000000 -> 3c6a2ab8 bcce93c2 3fefe803", + "4106de90 4218ede8 c12b5f44 3d949959 3becc8fc bc510b9d 3e9d6a79 00000004 40000000 3f000000 -> 3e463517 00000000 41427983", + "41b1867c c18801d6 c07f2d90 3da94056 3d5eefa9 bd4691c9 3e3ec0cb 00000004 40000000 3f000000 -> bebd6f7d 00000000 411723ed", + "418e9730 c0522760 c219afa1 3b808738 3ba77258 3b431d1f 3b09f536 00000004 40000000 3f000000 -> bf3c3145 bc62cc8d 3d6ad9ce", + "408fc498 c17ca84c c1e0575a be68ed93 3e49b4e1 3d869b3a 3d2988f4 00000004 40000000 3f000000 -> 3f19b000 00000000 41321d1d", + "c185eb50 41f46684 422438ce bd041fbb 3d3c6d0a 3cade74c 3e5debbd 00000004 40000000 3f000000 -> bd979076 00000000 410d1fc9", + "4220889c 417e64a8 c1b4e6e5 be1f032a 3e3afb7f bde6b793 3a999237 00000004 40000000 3f000000 -> 3eb36a56 00000000 4107a31b", + "c198b1ec c22dc971 419f3d30 bc5b4a3f 3cb1e0ae 3cd8a0b5 3d61ab08 00000004 40000000 3f000000 -> 3e54ad7c 3e057830 402149e0", + "c2157ad6 c1b57802 c20d481f bc9eed89 3b2893fb 3d2bc0b8 3e378580 00000004 40000000 3f000000 -> bf574a4b 00000000 40e5f8ca", + "41a09a98 421082c0 c1423da4 3b32fab0 38d7d112 39c69431 3e6311b9 00000004 40000000 3f000000 -> bb058760 00000000 40e4f043", + "4201c118 c1c77d72 c13d190c 3a8380d5 3b128f31 3b2bc499 3d89e52e 00000004 40000000 3f000000 -> bcbb300c bbc28f87 40005e83", + "c22c6586 c1f4b9f0 4102c408 be93be68 bedefc74 be63d070 3d0f3748 00000004 40000000 3f000000 -> bed4e2bb 00000000 4199a654", + "42431cda c1bb70d4 40d59710 39b54f8a 3a8960da 389f4e82 3c2c9140 00000004 40000000 3f000000 -> 3ea25656 ba5ed09c 3e21d7c8", + "41e842ac c0c249e0 c1fb04ef b92baa35 bbcfc7da bbc25faa 3e0e18ce 00000004 40000000 3f000000 -> 3e8a698a 3c04b047 408fee4e", + "3f471400 420415be 41dc4504 b9dbe505 39fd8182 3ad9e25e 3ba232df 00000004 40000000 3f000000 -> bf288f4c bbc690bd 3da8eea0", + "c17ef784 c0421070 41018340 3b060b54 3ae7f604 3a31f106 3d84f2a8 00000004 40000000 3f000000 -> be810e8d 3be6dc30 3ff9b90b", + "412294e8 41f581e0 c1ed6a5b 3d522f51 3bb34d0a bd098914 3e3419fb 00000004 40000000 3f000000 -> 3e9609bc 00000000 40f22257", + "41abef80 c246c2fe c1333b00 3ac3aa06 3a6426cf bb270329 3eec98d8 00000004 40000000 3f000000 -> beacfb15 00000000 416d2701", + "c225fa27 41e6a1c0 c003b630 bb953b24 bbc7a807 bbba95e9 3c0ee528 00000004 40000000 3f000000 -> 3f08274a bba4dae8 3e6ff1a8", + "c1aadf86 c19868be 418763fc ba194e68 ba2d4f0f b9d85039 3e919a5e 00000004 40000000 3f000000 -> bf7cb3fc 00000000 41117ac4", + "41ea5fb0 3fbfcd80 41b374a8 3d57d5c6 bbbe1e28 3d4444a2 3ec7fdcb 00000004 40000000 3f000000 -> 3eb095c7 00000000 416b8cd5", + "41465f10 42318290 c14a3098 bba8ade1 3babb17a 3aca10ff 3dc477fc 00000004 40000000 3f000000 -> bf058600 00000000 40530957", + "c1ae95b5 4116686c c233e34f ba049bd3 ba8f5621 b9e09208 3c6e1b79 00000004 40000000 3f000000 -> bf51f676 baf6e444 3e9bbceb", + "4136c8f0 420df1ca c1590ee0 3d254034 bd546a0d bc0c3685 3be794f5 00000004 40000000 3f000000 -> beec463a bd946bf4 3fd64a56", + "40d0d920 c0059320 c0d565e8 3b0e3d53 3804f389 bb11d2c6 3d49ab0a 00000004 40000000 3f000000 -> bede810c 3c0b459f 3fab2ca1", + "423184c6 3ff9cda0 41bb42b4 3b8648a8 3b8ef1d1 bbb5f177 3ce1b7bb 00000004 40000000 3f000000 -> 3f158afa bc5be546 3f4e2d10", + "41bc0984 422e1234 422476c0 bd465b77 bd8e18e0 3b0ff000 3cbcd7b0 00000004 40000000 3f000000 -> babf4056 3b116770 403ae79e", + "c220d502 c1a4f1f4 c22cc417 ba771b8c ba33810c ba7ed2d6 3d3678eb 00000004 40000000 3f000000 -> 3f3aef80 bacf8f28 3f8df551", + "401a2f80 c2305cea 41f8919c bd33b9ab bcba2e38 3daf557f 3dff4a0f 00000004 40000000 3f000000 -> 3e8f9f3c bd98cf34 40ddb78a", + "bfb474e0 c0f4c3e8 c1e8f590 3cd65c3f be428311 3d838fb4 3e11cbe8 00000004 40000000 3f000000 -> bea73a61 00000000 412fab2b", + "41ce56a4 4204604a 4221c3a6 be8fab07 3d930e63 3ea7b5e0 3bbade5b 00000004 40000000 3f000000 -> 3d565f00 00000000 4161d489", + "423ceea8 422b713c c22c0909 bb9eebd7 bd042d73 3b26e6ad 3dca4b4d 00000004 40000000 3f000000 -> 3ee0bd66 bd16e86d 40798d8a", + "c0c59d08 c216a452 41e50c4c bdc76c2a bd0d92aa bd672195 3bfc7add 00000004 40000000 3f000000 -> 3c26156f 3dd027b8 4056157e", + "c226a59a c21202b7 c1866c38 be89b9ca 3da19dd1 3e927d8d 3ef30817 00000004 40000000 3f000000 -> 3eb0dd15 00000000 41df1535", + "4180a394 c1b79724 c1bb2854 bb060fa8 bb73898d 38b7b883 3e9e4800 00000004 40000000 3f000000 -> be8d94f5 00000000 411fc504", + "c2222362 40445870 41effa38 bb737865 bbb06a60 bb708108 3c472a25 00000004 40000000 3f000000 -> bccaa1e0 3bb19ba5 3ea8ec13", + "421c46b6 c03fbdb0 c0b24410 bbab6847 3c3c440b 3c0b1ee9 3c72448e 00000004 40000000 3f000000 -> be0c85f5 3c9240b3 3f042fa5", + "413b9520 40f31e78 42100788 be40a08d bec16475 be781059 3c0ea11a 00000004 40000000 3f000000 -> bf39cb79 00000000 417c796d", + "423f3baa c22889b6 422b0f2e 3aeb777b baaa67f5 b9b7313c 3bd4231b 00000004 40000000 3f000000 -> bf08ccaa bbadc97b 3df93003", + "4137c568 42119c8c 4165f978 3a783f09 3c4af1c9 3c9aab30 3e27a578 00000004 40000000 3f000000 -> bf4a8912 bd28a51e 40ba8fd3", + "41ed0734 422c1422 c239a3ed bce3710f 3ae065d0 3c72ead0 3defdf8f 00000004 40000000 3f000000 -> be366f45 3b49a570 4089d849", + "c0071180 42051b36 41693b40 bd24be5a 3bf55025 3ce1fcbc 3aba96cf 00000004 40000000 3f000000 -> becee216 be658794 3f6ad9f1", + "c18a5630 c099ea10 c10b2fac bad63cdd bb560a47 3a5a484b 3d426a9e 00000004 40000000 3f000000 -> 3f319d4b bc0f10d4 3fa70c15", + "c23b3cde c20e74c2 41fcbedc bc0b48f4 bbcd6318 3c647aff 3e0f2700 00000004 40000000 3f000000 -> be08fc3a bb105cd8 40995faa", + "4106c7bc c237fc09 c203a58b bc06d21c 3ad282f0 bbb3b018 3c8d8e89 00000004 40000000 3f000000 -> 3d593f9d 3d228bcc 3efc58d6", + "c11398e4 c207685c 419678e0 3de869b0 3e47ffa9 bedf9423 3acefa7e 00000004 40000000 3f000000 -> bf4c4df4 00000000 417b6f1a", + "c1e6bb2b 410b15b8 c20cb87c b99502f3 3a409ba8 b84e92bb 3d46f1f0 00000004 40000000 3f000000 -> bda597d2 3a76de04 3f93b1d1", + "c1759b68 c107f7b8 40ee5b00 3a05be61 ba3b4e24 38205568 3b340bba 00000004 40000000 3f000000 -> 3f218382 b8b35630 3d0edd72", + "4229a830 420c74cc c20fd5af ba94d0d5 bad71942 bb7fbe29 3dbf6ae6 00000004 40000000 3f000000 -> 3d166c7c 3b6258aa 4035399d", + "c1acf5a6 4235dd36 420c1de2 b8cb08b3 3a1860fe 3b405c26 3bed3d75 00000004 40000000 3f000000 -> 3e8b8939 bb24b98e 3dda0817", + "c217886d 41c1f4b0 c1cc3599 bd28addb 3d2ab68d bc69c127 3e4aa918 00000004 40000000 3f000000 -> 3ec8ee4b 00000000 4103a8fd", + "40b24060 40942988 4245422e bd1644e3 bce7bb46 3ca04920 3b59cb51 00000004 40000000 3f000000 -> 3f42f670 bd9f0b88 3f8f0a17", + "4169eff0 40236a10 c22f88a3 3c923781 3d8e9199 3d4b1af5 3e88c514 00000004 40000000 3f000000 -> 3e1e4a00 00000000 4134b1fc", + "404d4180 c102ad20 41e72b58 3c548ac1 bbd286fe bc4707fc 3dd66424 00000004 40000000 3f000000 -> be3ca775 bc2e1158 406b2fb4", + "c102e82c c1c325fc 4225f9fa 3ebda24a 3e8dca26 3ec78d8e 3ae2eb11 00000004 40000000 3f000000 -> bf1ca4e9 00000000 419a98d6", + "c058e0d0 c1a81acd 41919924 bd78327d bc308e3f 3d8e8ae1 3b286860 00000004 40000000 3f000000 -> be0c390c be01de0d 4012b004", + "c1efe89c 417b6400 40334040 3ceb8e66 be5a5990 3e420eb0 3c0476c8 00000004 40000000 3f000000 -> 3f1998b9 00000000 41164ac5", + "c23838ee c17679ac c2133da4 bdc45bd1 3dba62a1 3dca71ab 3b96d8b8 00000004 40000000 3f000000 -> 3ea6e903 3e7a2c18 409bc8c2", + "c11778b0 c1cbf70c c204806c bd882870 3d8d15da bd8522b3 3e0f6713 00000004 40000000 3f000000 -> be568d96 00000000 410266e0", + "40472670 423d275e c19a91b4 bb975444 3b906510 3a714d3b 3ac34c3f 00000004 40000000 3f000000 -> 3e5e2750 3cb9a972 3d354365", + "41a8f150 415b720c c1c42375 3b16f824 bb29b313 bb1ab960 3b5b411a 00000004 40000000 3f000000 -> be97ae58 bc144a86 3d57ff04", + "3f8922e0 40fc0ba0 4228c3f2 3cadd7fa bcca5d19 bd35b16c 3ce56f73 00000004 40000000 3f000000 -> 3ed33dab 3dbeae4e 4002c24e", + "c18dd196 c0cb7c78 c101d4d4 ba276cf4 3ab79f6b 3ab53b75 3c4da549 00000004 40000000 3f000000 -> 3d36d904 bc69a408 3e762727", + "c0d3e190 41ba7a78 c0e9b910 3ce44345 bb25b220 bc920066 3b31e6a7 00000004 40000000 3f000000 -> bed4363a bd465f38 3f0e2875", + "41d57528 c22ce5f0 c2388bcb 3b92b73c 3bc9a1bd ba74957d 3b82a0a5 00000004 40000000 3f000000 -> be36458a 3d0cacf4 3dda6a63", + "c23a5527 423dcca2 c1c33eba 3d20dd56 3c2c58ed bd37ec2f 3bc28d97 00000004 40000000 3f000000 -> bf0272e0 bd3bbc57 3fbb5c46", + "422c99e0 41d89c28 423830a4 bba57b65 3a15735e 3d08e1b9 3df6b561 00000004 40000000 3f000000 -> 3e2fa9cd 00000000 409d613a", + "41a1eacc 420b2912 41e9ff0c 3a35fa62 39d061f2 ba1e7df4 3ab14509 00000004 40000000 3f000000 -> 3e9c8394 3a48b28a 3cb02b41", + "c177126c 41d10714 420ed386 bd0a6e68 3c77e5f1 3d29d9a3 3d188bb1 00000004 40000000 3f000000 -> 3f20880a bdff1e40 40126d69", + "423d2c32 c1f2dde3 c237d2b5 3b3614b1 bb48cf27 3a0cb284 3e373e09 00000004 40000000 3f000000 -> 3e53c1b8 ba434f80 40b82a2f", + "417c2520 c20fd22d 41548b5c 370b906e 39ad8287 3a82b1fd 3ba75d7e 00000004 40000000 3f000000 -> be32a6c1 3a3d6eb0 3dc9ebd9", + "c19dc40a c1b9a43b 41a5e134 3e1d562e bcf01cb7 bc3c0a09 3c3667be 00000004 40000000 3f000000 -> be9da6b7 beb73c62 409ac527", + "419deb20 c1ea18c4 c1a5d59f 3a7bca2b b99e31cb bad9ded7 3bd364aa 00000004 40000000 3f000000 -> bf2e6463 bbebd10a 3dc17283", + "4223ff9c c1423a04 419aebac b9c1e0bf ba212a04 bb8b9add 3c4c5f36 00000004 40000000 3f000000 -> 3f3803e2 bc13d2e9 3e7cea58", + "c1963329 423742d0 c12dba78 bd36da8e bd0ada39 3b8d0c54 3e01e136 00000004 40000000 3f000000 -> be33466c 3cbf1722 40ae73c8", + "c22fc106 41179f3c c171d4d4 3e941ead bea2e3a2 3dba6c98 3d03e3b4 00000004 40000000 3f000000 -> 3e257e4a 00000000 41707c95", + "41b7ed18 41747d70 414ba814 bc9dee16 bb3d457a bc81dc09 3b8c20c3 00000004 40000000 3f000000 -> 3ece9045 3d4c876e 3ed3cd34", + "c2300a12 c1859f1c c1d2e3a6 3ad21ef4 b98db128 3aa80509 3e5a515d 00000004 40000000 3f000000 -> be4154d9 bacb3114 40db17df", + "c1fe8d79 c19edc85 3fc163c0 bee653f5 3ea98448 bdf37fad 3d0acddd 00000004 40000000 3f000000 -> 3f0b5b03 00000000 419a3189", + "41806410 3fafba00 c2343ff7 bb0b762f baea9be6 ba234fac 3e6e47fd 00000004 40000000 3f000000 -> bf436251 00000000 40f02fed", + "41c415cc c211ecc7 40574420 3dc6c26a 3d0a65f3 bcf88436 3e7d910f 00000004 40000000 3f000000 -> bf60255c 00000000 4134dda1", + "421279ac c208ecb7 40b1dbc8 3d5e6d68 bc2bdf44 3d6506e8 3d4598af 00000004 40000000 3f000000 -> bf187b25 3cadf2c8 406656d3", + "41ed3b54 bfaed640 41ccf804 3ae68342 3c61a0fd 3b5f0ebf 3e71b396 00000004 40000000 3f000000 -> becdc708 00000000 40ff40e7", + "c1b0e8fc c22fc242 41fd581c bbaa9b2c 3c99314e bc6b4fe0 3e9986f6 00000004 40000000 3f000000 -> 3ea0fa29 00000000 41253310", + "4236f4f0 c1605208 c14343d8 3da23d25 3dc3cc31 bdb521c0 3d103852 00000004 40000000 3f000000 -> bc472e12 3e48026a 40b13c56", + "421fb438 414da15c c21663f1 bdb5d1f9 3dabbff3 3d99331f 3b8eb4bd 00000004 40000000 3f000000 -> be2c2033 3c2c802c 408460a8" + ] + }, + { + "glsl": "vec3 cultmath_af_frustum_axis(vec2, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "be17c8ac be987fc8 42733cca 42b47e45 -> c00ba0ce c08c4940 416b7f80", + "3f01644e be911c7a 421ac577 422f2bac -> 3fa4f7ee bf39028f 402331a8", + "3e9e77d8 3d84bf80 427011cb 42c34759 -> 40ba4f13 3f9c11f3 41967ce7", + "3f53028c 3ca8d400 429e7fe2 42faaf5a -> 4197f815 3ef32df8 41b85ef0", + "3e8d858c 3ee4afdc 42c7cad7 42fd4120 -> 406c704f 40bf084b 4155d924", + "bf29d94e 3ee14700 4095d287 4234a723 -> c156dd93 410e7e0d 41a1ecd2", + "bf221d14 3ee4f81c 422ef3f7 42b074ea -> c1616399 411f2b72 41b1f5dd", + "3eae2290 3e2ae048 424fe60c 42a28578 -> 409f5dc8 401c6241 416a49c8", + "3e23df98 3f43c12a 421b8b36 42acd010 -> 40735aac 4191595b 41be14ea", + "3e0f7e20 3d7e7460 426d78f6 428b3832 -> 3f37b32b 3ea2e07a 40a3ddb8", + "bee53ad2 bf395966 3e806db5 414b1f91 -> c03249eb c09028dd 40c71c23", + "becfbcbc 3f0fa424 42360915 42bdbb2a -> c12034e3 415d8d38 41c56d3f", + "bf187b27 3f3b98c2 413e8dd6 423319b4 -> c11c9ae5 4140aba2 4183763e", + "bf396ea6 bf1e4fa8 42c1fc4e 42edf0c6 -> c0feb552 c0d9747b 412fd1e0", + "3da9ef10 bf32418e 428d3c99 42a18c04 -> 3ed7b651 c06246bd 40a27b58", + "bd80fbd8 3e291060 40408dc2 4245fb3c -> bfbb603b 407599cd 41b9f260", + "3f64bf40 be8b1e4a 40e730d4 418ec529 -> 4097da69 bfb8b4e9 40a9f1e8", + "3df56000 beaf8ce6 4044e6d9 41c4377d -> 3fa47b57 c06b5a4f 412b9aa2", + "3d18cf20 3d873d80 412cdbaa 42452b12 -> 3f37cb0f 3fa2a97a 4199f428", + "bd6b6f90 be946f56 4047f604 4121e0c8 -> be4dccc9 bf81c01c 405fc68e", + "3ef22598 3f0b0aa2 42215e33 4260cfb5 -> 40700a78 4089d511 40fdc608", + "3f5a3632 3e6d0910 42a0c521 42b9d3b8 -> 40aaddd4 3fb99b27 40c874b8", + "bde9e630 bf02cfb6 421bee73 422653a4 -> be17f727 bf29fa43 3fa65310", + "beb001b2 bf261d44 4227856d 428911e8 -> c0929b32 c10a5dc9 41553cc6", + "bf155da2 bf252960 428ac799 42bd9112 -> c0ed0eb6 c1031041 414b25e4", + "3e0bd408 3f6a27e0 42ba9c7c 42f27372 -> 3ff3ffbb 414c4cbe 415f5bd8", + "bdfffbd0 3dcd3300 42aebfe2 42dbe28c -> bfb487b4 3f90b700 41348aa8", + "be21a2f0 be3a08a4 42721504 429084ef -> bf6d2f01 bf887df0 40bbd368", + "bf79c6b4 3f19a956 4195ce4b 420575c4 -> c0e488af 408c97e2 40ea3a7a", + "bef02888 bf3f744a 428b7310 4299fa9b -> bfda15f3 c02ddba5 406878b0", + "bf45c632 3f256792 4204ae26 427a13a9 -> c1356403 4117b3d8 416acb06", + "bee4947c bf7a88d9 41fcdd83 428d1f8c -> c10b1fed c1987cbf 419bd056", + "bf7ffdb2 bf59056b 4209803f 4296f458 -> c1a466f6 c18b6003 41a46871", + "3f31cdb0 bf162ba2 41eba360 428e5e1a -> 4167dc84 c143d3b9 41a6ea84", + "bf12cffa bde79780 429bdf13 42c07fc2 -> c0a80b2c bf848aac 411282bc", + "bf2bc738 3e951ac4 4216b03f 42ac28b8 -> c181ed5a 40e18e20 41c1a131", + "bf7af105 3f3b0e3e 405e1279 41be3b90 -> c11f4361 40ed6f39 41227941", + "3f440d4a 3f2c0f80 42536360 42948488 -> 41032e9a 40e64207 412b4b60", + "bf6f7708 bf258258 4104feb9 42451c01 -> c19946e2 c153e0df 41a3dc53", + "be84ac8c bf03a11b 4295184b 42d0c990 -> c0777d1b c0f58a39 416ec514", + "3f0aca06 bf48a0bc 422af603 4291f7b8 -> 41032bd9 c13d9da4 4171f2da", + "3e328070 3f61aee8 420a3d7c 424e19d3 -> 3fbd4501 40ef4c17 4107b8ae", + "3f6e5f90 3cdd50c0 42a12163 42d1826d -> 4134311a 3ea74c21 41418428", + "3f0513b8 3f09bdd4 42a47018 42b51baf -> 400aa6e3 400f8305 40855cb8", + "3f35b748 3dd9c620 423b752b 427896c1 -> 40ad920d 3f50031f 40f48658", + "3e563d70 befef2ec 4224cf24 42806efc -> 401a14fa c0b75c22 41381da8", + "3e978fa4 3ef58e28 4183d69b 41ec841a -> 3ff7e448 4048d056 40d15afe", + "be668a6c bf5243aa 42862c22 42af0de5 -> c01343c1 c1065001 4123870c", + "3f317786 3f60eea0 42c21336 42fe95de -> 4127ca5a 4154aae9 41720aa0", + "bf6b19fb 3e7c4e70 40b75480 41e08196 -> c1241672 40301883 4132ac76", + "3d566600 3e4e0b70 40e01315 420c830f -> 3f3c70c7 40351923 41610159", + "be972cba 3e595060 421403bb 42547fd2 -> c01851d7 3fdaf5ba 4100f82e", + "bf7ac68d be986ae6 41d3344b 428dd576 -> c1ae6e7c c0d408a1 41b210c6", + "3f5ff22a bf2111fa 42a37d7b 42f5b739 -> 418fdc29 c14ef05b 41a4737c", + "3e9784b0 bdf25b88 425035de 42adce10 -> 40a50323 c003f882 418b6642", + "3eb78af0 3eacafa8 42a98098 42d3510c -> 406fd5a4 4061a5f7 412741d0", + "bf4a56ab 3cda9740 42af4619 4308682f -> c19a3040 3f2692bf 41c3148a", + "bf2c07f8 bf47954e 42a427ad 42cee55c -> c0e5c631 c1054982 412af6bc", + "bf496c83 bf06f358 41b9fd15 42870695 -> c18b4f88 c13aabeb 41b10ea0", + "3ec12094 bf5185d6 3effe07d 42245343 -> 40f4eb3b c184db0a 41a25382", + "be28ef70 3f7f1e4c 4089242a 421538d2 -> c02e51b7 41839fda 4184144d", + "bf1a19d3 3e3b40f0 406e5689 40ac3343 -> beff6145 3e1b292a 3f541ffa", + "bf440b63 bf547daf 42844f0f 42ad289d -> c0fa430f c107a0df 41236638", + "3f5a3ebe 3e4b30f8 4270279a 429f131f -> 4104fbea 3ff79f5d 411bfd48", + "bf2284ac 3ebea60c 42ab88fa 42c60276 -> c08674c7 401dbab0 40d3cbe0", + "3e85d9e4 3b5dd800 42a7d669 42b1c841 -> 3f266382 3c09e2b8 401f1d80", + "3f590426 3ea264f8 42b405e2 42fb189e -> 41710021 40b4578d 418e2578", + "becca63c 3f22ed84 428c40f6 42df66d2 -> c104f053 4153ac69 41a64bb8", + "3e8456c8 3e9ec248 425f0dbc 429a85de -> 4031d07a 4055501b 412bfc00", + "bf7bbec3 be722d40 428841a4 42cbfc38 -> c18534ce c08024b1 41877528", + "bd20a3d0 bebe44b4 424d8b6f 42ad20b4 -> bf30978c c0d129a4 418cb5f9", + "3ecea70c 3f2794f2 40ffd22d 41ba31a0 -> 404559d5 40a009ef 40f47a2a", + "3f31720c bf71cd69 424b261a 42b7b852 -> 4163c175 c19b2dff 41a44a8a", + "3f2700ba 3f71f442 3eaf0261 41a74166 -> 40d6a6ed 411b7e85 4124855c", + "3f4c4b30 3f0547d6 42b72e44 42c270ae -> 400fc3b1 3fbb953d 403426a0", + "3f42f2c4 beac0d14 42585b71 42904c15 -> 40dc0a14 c04231f4 41107972", + "befc61c0 3f33cefe 41efaaae 429cfe01 -> c13f6833 41885e05 41c226ab", + "bf2948a6 3ed5e6dc 41d98f80 428b50bf -> c160a1e4 410deb57 41a9d9be", + "bf7b6a09 3f00a056 42a034cb 42c41529 -> c10cef61 4090353a 410f8178", + "3f18ad5e bf75a29b 41fdc3e1 42268e4a -> 403d4999 c0984493 409eb166", + "be9664e4 bf17e9c6 411bed8e 4251ddfc -> c0c8c83c c14acf68 41aae298", + "3f7e5c58 3f2875ec 41da8418 427f78b6 -> 419146fb 41406e73 419236aa", + "bf0325a4 3ce5d340 4283671d 42d19a32 -> c1203e8d 3f0c6873 419c662a", + "beec3406 bf39f6a2 41c6ffb6 42620997 -> c0e98161 c137d6e3 417d1378", + "3f680108 be435a7c 416ed143 4260cf2d -> 4195a102 c07bfba2 41a51adc", + "3f368ee2 bf6e78ab 42aa276b 42cbf7e9 -> 40c0e8c9 c0fbfe2c 410741f8", + "bf249ab8 bf757579 415dace4 427e1ca5 -> c17f837d c1be82f9 41c6b16c", + "3e695478 bf4f8885 40f2d040 4157a536 -> 3f2bc962 c018cb4c 403c7a2c", + "3dfe64d0 bf77e080 42afc718 42c28634 -> 3f1507fd c09136a5 4095f8e0", + "bd37a000 bf529dae 42878ea9 42a5c796 -> bead6ca8 c0c6ea7f 40f1c768", + "bf427876 bebe6222 422a089f 422f8bd8 -> bf060128 be833029 3f306720", + "3f5a9770 3e4f4fa0 42832310 42b84bd7 -> 413590af 402c3207 4154a31c", + "bf4345fd bf145d29 42ae7578 42d2cf84 -> c0ddd43b c0a88a4c 41116830", + "bf1c4932 be9c129a 421dad37 424db4a0 -> c06a91fc bfea400b 40c01da4", + "3f3b0656 3edde9ac 41ffa937 4212a618 -> 3fdbf7d3 3f82802e 40168be4", + "3f2bce9e 3e9fce1c 42c33f2e 42c78a39 -> 3f3865d9 3eab842c 3f896160", + "be542948 3f4e6e34 4170117f 42453518 -> c06364f0 415d4086 418930b8", + "3f66233c 3f6909c8 41cb5f08 426bdd19 -> 41713ed7 4174493a 41862d95", + "bf4b8160 be4aca74 42acecef 42f5f9ba -> c168483f c0677775 41921996", + "bf7c7be8 3ebb0e44 42592cce 4281ad99 -> c0a66854 3ff691e6 40a8b990", + "bcb2c3e0 bf41e54c 426714dc 42d32d26 -> bf0590a1 c190deab 41bf4570", + "3eecd270 3ee569dc 4221b857 42954487 -> 40fd21c0 40f5368e 4188d0b7", + "3f0d3f2e 3f3c9fe8 41ac3f17 42789124 -> 41334150 416f61c7 41a27198", + "3f7d4d50 beb24e20 429838f3 42d3201f -> 41692102 c0a41ada 416b9cb0", + "beea262a 3f41a05c 4239dc40 426dad4a -> c03d9333 409cc437 40cf4428", + "3f54a71a bee34bac 401e42f6 42426e22 -> 41994ab2 c123d8df 41b889f3", + "3da16450 bb107200 41836eae 41f7e966 -> 3f12dda4 bc8371cc 40e8f570", + "3e6fe6d0 3eca40c0 429ecbbc 42be032c -> 3fea0736 40454d1d 40f9bb80", + "3c436a00 3d083a20 4192be28 422ad0ee -> 3e14c424 3ecf6a6f 4142e3b4", + "3ecc815c 3e8e5f7c 428ee8e9 42b8b6a7 -> 4085944c 4039fdb8 412736f8", + "bf0fc8ca bd6a9190 42868a11 42b64f2b -> c0d6a48a bf2f154d 413f1468", + "bf36cc6b 3f51e524 410332cb 424ec1d4 -> c1786e5b 418ea0d5 41adf521", + "3f1fc2ce beef46f8 429b6028 42b6811b -> 408770de c04ada41 40d90798", + "be1c2fc0 bf20420e 414f4c93 42383a1f -> c0218ee5 c125c50c 418466fa", + "bf1a4ea8 3f15f628 41a97a22 4280cd59 -> c15064e0 414a866d 41acdda1", + "be0941c4 3f47cd92 41ba834e 4254bfca -> c0002266 413a8603 416efc46", + "3de6ee40 3e84ae00 40fdb38b 41a572e3 -> 3f3810ae 3fd381c0 40cc0c00", + "3f2d7100 3f3fd6aa 423f7301 42ac2b6c -> 414f2aea 41652463 4198e3d7", + "bda2ca78 3e314950 427d1173 42cefeff -> bfcca9ec 405ee344 41a0ec8b", + "3f19d2da 3f2ee608 4231cf97 4235f24f -> 3e9f09fe 3eb4d419 3f045700", + "3e843c50 3cebf5c0 427bedb9 42e0237f -> 40cad894 3f34fa6f 41c45945", + "be16ca9c bf22219c 420c9548 42922f0d -> c032cf98 c1404205 4197c8d2", + "3f35995a bee54f8c 41ffb807 426701fc -> 41125745 c0b8ca09 414e4bf1", + "3f0caa00 bf20fffe 42b561e2 42cd5623 -> 405297bc c07109cb 40bfa208", + "3f3f7ab4 be4e5dfc 4203d740 426cccc9 -> 411d0300 c029383a 4151eb12", + "3e9ec344 be5de11c 424d8e29 42c491b0 -> 40e8aa59 c0a294c3 41bb9537", + "3b7cb600 3e8e2bb0 42bb7b73 42fe5512 -> 3d83fb7e 4094807b 4185b33e", + "be70d054 bf1065ea 42a77784 42d08a6c -> c01a8c99 c0b957e4 41244ba0", + "3f0b7982 bf07c1a9 420f10ad 4283dd3e -> 41037af2 c0fff34f 4171539e", + "3f5126f6 bf01c0fe 42b7bb5f 42f8f010 -> 415517c4 c10432d6 41826962", + "3f3dcbdc 3f5f33cc 421577ba 4289153b -> 4138e683 415971d9 41796578", + "be9057d4 3f371546 42614022 42c6628a -> c0c16b41 41755494 41ab84f2", + "be9c7dbc bd4779e0 41dc58fe 4260304c -> c08b64a1 bf31ae78 4164079a", + "bebb7f06 3c680400 4220b867 42b1cd36 -> c10ebbcc 3eb09fe0 41c2e205", + "3e1cabf8 bf694589 41be9737 428489ec -> 404fd024 c19ab55c 41a9c83c", + "3cf42b00 3f57e968 429d8c8f 42fb34a0 -> 3f32a7d7 419dfb15 41bb5022", + "3f3b1b5e bf2ec8bb 427ed4a0 428cdf91 -> 401d616d c01303fa 40575410", + "3e289200 beb77d5e 4258233a 42961f9b -> 3fdd8955 c07124c7 412837f8", + "3efd2e18 bf3259d8 427b1ccc 42bdd57e -> 40fe4756 c1331ff7 41808e30", + "3f095766 be7f9054 428fe04a 42c9b726 -> 40f83dd6 c066f684 41675b70", + "3f1002aa be59a690 4280f09d 42b1f318 -> 40dc8f3e c026abf6 414409ec", + "3e978930 bf7b2d7e 42b55f27 42b9672e -> 3e98b94c bf7d2591 3f8100e0", + "bef54eda be8975da 41d4da38 422ede41 -> c0832aba c013003b 4108e24a", + "be5185e0 3f3a99f6 42acd956 43015537 -> c08c792b 417a361f 41aba230", + "3f7fb000 3f79310e 42bdcf12 4301c50e -> 418b4a7f 4187c093 418b7614", + "3ee48884 bebab0f6 41a0f8c9 425afa66 -> 40f74428 c0c9fe92 418a7e02", + "bf63ba4c 3f6299ca 402ef8e6 420dbda3 -> c168b7da 41679106 4182ce15", + "3f3a8f56 befa9026 4184dc1b 42204c1c -> 4108cfca c0b7bf6a 413bbc1d", + "bd8aecc0 bf1746f6 41a1ab23 41a440c4 -> bc338655 bdc37cae 3e256840", + "be0bdccc bf70bfbd 41434a4a 4276919c -> c0581290 c1b9f735 41c5bf0a", + "bf43538d 3f3cf792 42ab3bd4 42c7313f -> c0aaa884 40a51a23 40dfab58", + "3f751c70 3de6b180 41addd8e 4204e810 -> 40b012b9 3f25b760 40b7e524", + "bed36fcc 3ec65c8c 42b094dd 42f88ee0 -> c0edc9fd 40df158e 418ff406", + "3eb63d04 be7a130c 429c5a2a 42f87870 -> 410326f5 c0b3f8d6 41b83c8c", + "3ece2858 bd94f9b0 4239a623 42b1fb68 -> 410927c2 bfc63983 41aa50ad", + "be940198 3f3ff07c 428d23ce 42b53f58 -> c039815e 40f091ca 41206e28", + "3f4b060a bf37ea32 3f1cd876 41a428fa -> 40fc9a85 c0e4d40c 411f4236", + "3f376520 3ef2a624 419b2bd1 42350fdf -> 4114421f 40c428e5 414ef3ed", + "3f7ef662 3f2eb48e 42c1ed34 42ca22da -> 4002d216 3fb34823 40035a60", + "bf6c6b92 bd45d3d0 42aad96e 42afa1b7 -> bf8d54b8 bd6c8549 3f990920", + "3ed9f93c 3f0ad63a 4247c26f 42bb0df0 -> 4114738f 413d1c3a 41ae5971", + "3d91d0b0 3ec03160 41893184 422d479d -> 3f6e8180 409d2eaa 41515db6", + "beddd444 3daecd70 410e8fe1 41ef44a6 -> c0919073 3f656925 4127fcb6", + "bf24bd91 bedde044 42c19f44 42f3b036 -> c100dfb8 c0ad91f4 414843c8", + "bd829450 bee71b20 41c3809a 4221c82e -> bf02a463 c0673793 41000fc2", + "bf2ef3e7 bf6d4852 42a79ee3 42aa198f -> bed8decb bf131122 3f1eab00", + "bf25ab61 3f000e1c 425eccd7 42bdc2e5 -> c14ad83f 411cca3a 419cb8f3", + "bed0ea42 bf5da984 42a761bf 42d1ed80 -> c08ae1ee c1135b47 412a2f04", + "be2c0a60 be96e360 41b4ffd3 42908104 -> c0856778 c0ea011b 41c6821e", + "bf7e61bf bf0a16f6 4269e295 42a3e80a -> c13aab02 c0caa9cd 413bdafe", + "3e7094f0 bec2ba28 41a7b4e4 4284e83c -> 40ab0082 c10a68c2 41b5f606", + "bebb477c 3dc98d20 41fcf611 428e616f -> c0e79558 3ff93b51 419e47d6", + "bea32a32 3f2d3468 428efca8 42b598e6 -> c044dec5 40d0fbeb 411a70f8", + "bf3036a0 bf14a340 4298d55d 42bae828 -> c0bba187 c09e44bf 41084b2c", + "3efc7c88 bebd459a 42875380 42eabff6 -> 41441e43 c1130436 41c6d8ec", + "3f4ee8ba 3ebf0d3c 429d2429 42ec5dc0 -> 418010bb 40ec8041 419e732e", + "bf43ed09 bf1c7a99 41adab8b 42454501 -> c12909f6 c1070157 415cde77", + "bed63ca4 3f5520ac 42a5274a 42bd36fb -> c0211688 40a04103 40c07d88", + "3f1c0bde bf4713f7 41bedf01 420b8f88 -> 40572c82 c089415b 40b0801e", + "bf3f17f1 3ed61908 42a9b8d8 42c1ae94 -> c08f14a7 40204e17 40bfade0", + "3f6ae0ce bf5cb68e 427b0981 42af2326 -> 4136196d c12b1e05 41467996", + "3eb96e80 3ea54974 42374b16 42454240 -> 3f21da49 3f1044fe 3fdf72a0", + "bf79d51b bebc2d80 41a5ad94 427a6422 -> c1a383f5 c0f65328 41a78d58", + "bf072368 3ebc7530 4289a963 42a825d9 -> c080becd 40338ada 40f3e3b0", + "3d106a00 3ec62078 42ba317f 42ce0722 -> 3e330622 3ff59c01 409ead18", + "3f7e8708 3f6e792e 4145c6c1 42063d7a -> 41289dd9 411dfb33 41299794", + "3e485ac8 bf342532 4229fcee 42b4e8ff -> 4096227b c186fdaf 41bfd510", + "3f7a7b5a bc80b840 4091f600 42002ba6 -> 41571ca0 be5d1643 415bd9cc", + "bf593b94 be882d14 407616e0 4234bc91 -> c18c50bc c0afeb11 41a55b23", + "bf1e7870 bea97458 42a712a8 42dc9aa0 -> c1048c69 c08dbc5b 41561fe0", + "bf4022a1 be9dec1a 423695d6 42aca6ac -> c1743f48 c0c8c139 41a2b782", + "bf57ca0a 3dd6e540 42c2ea59 42c31cbd -> bd29e703 3ba932e0 3d499000", + "3f1ce76a bed77a72 41429625 41e5adc6 -> 40a247a3 c05edc6e 410462b4", + "3cb28100 bf443e14 422d8aa4 4295c9ad -> 3eafc322 c1413a77 417c116c", + "3e948938 bf5b4b2c 42c698d7 430e4b02 -> 40c791d5 c19351ab 41abfa5a", + "3ecf1d34 bf73354f 42555c0d 42806752 -> 400c9a74 c0a51b46 40adca5c", + "3f088c5e 3f19b8f6 4250272b 42a54fea -> 4102a681 41131533 4174f152", + "3f36ef6c bd79aaa0 42add5ae 42f7e184 -> 4153a6aa bf906dbb 419417ac", + "bf2ef7e4 3ef8147c 4193248b 428895e0 -> c1886b98 41416ca7 41c7997a", + "bf32100c bdcf9cc8 428256b6 42a4f005 -> c0c08621 bf60793b 410a653c", + "bf350d06 3f2d44d8 409438c6 418465ec -> c086dbc1 40810fda 40beaf75", + "bf2d6850 bf447af1 428bfd7a 42c0a8b4 -> c10eb4b1 c121b18e 4152ace8", + "3ef29b04 3f2ae38c 42bfcf13 42d2d6ee -> 40104799 404b421d 40983ed8", + "bd4f9f20 bf7ed451 413f7b7c 42469cc1 -> bf748279 c1960d6b 4196bde2", + "bf3e1b5b bed34eda 41210b20 41a3ba36 -> c07727dd c0095c0b 40a6694c", + "3f616006 bf3c0b4e 41df371d 42245354 -> 40b9a52b c09ae524 40d2df16", + "3dc95dc0 bf345e3e 42070986 423e1216 -> 3f2d2782 c09b191f 40dc2240", + "bf433790 3f751ee0 4299c5ab 42edd9dc -> c1803b42 41a102ee 41a82862", + "3ee74120 3f2105bc 419d3c89 421bf3c0 -> 408bb79e 40c291f9 411aaaf7", + "3f12d4c4 3d0ecba0 42accbc8 42d0aaf1 -> 40a498ad 3ea01289 410f7ca4", + "bee7c984 3e9cf444 428228c1 428f638c -> bfbfa773 3f81c734 4053acb0", + "bee1eaac 3e791150 401cd43a 42178132 -> c0fa1a14 4089dd98 418db3ee", + "3f7a2a9a 3f4be6ce 417aea88 42274712 -> 414c5517 41268b3e 415118e0", + "bf045fa8 bf5d68bb 42abbe5f 42b64789 -> bfae552f c011cb8b 402892a0", + "3e198bf0 3f4d73d8 3fbb7514 410ff586 -> 3f109500 4041751d 40710dc7", + "3f2eb558 3f0413ee 3fbaa46e 422de574 -> 41656449 412d6afe 41a81051", + "3f7c6be2 3f7d2276 4297ae99 42befd81 -> 411b08f4 411b7918 411d3ba0", + "3e6d08e0 3f4795e2 42841986 42a36922 -> 3fe7ee4a 40c349ba 40fa7ce0", + "3f5ebf9c 3deb2600 4274a97d 4275a1de -> 3dd81e06 3c6425e9 3df86100", + "bf7fb0ed bf052a03 41e61941 41fd31d9 -> bfb88bae bf403914 3fb8c4c0", + "bdf8c7d8 bf430cb6 42b98619 4303c3e8 -> c0179d1d c16dbcb8 419c036e", + "bdb3cc80 3f76e04a 41b10034 428badf2 -> c0060c25 41b80e6c 41bedbca", + "3ed65770 be8229a0 4283b920 42a09fd6 -> 404195da bfeb1db7 40e735b0", + "be884042 be9eb9ec 42b11fb9 4301065a -> c0ac48d6 c0c8b423 41a1d9f6", + "3f204010 be811206 424e774e 42549bba -> 3ef6133f be463248 3f448d80", + "bf0aedd8 bf674595 41e48d42 425e5793 -> c0ea9625 c1434154 415821e4", + "3e2ea390 3f52a086 411f81e5 4260958a -> 407c0229 4197f85a 41b8b511", + "bf5fca7c 3f22f41e 4288df74 428a32ba -> be944b2a 3e57f5d2 3ea9a300", + "3f2ffc6e bf0dda88 42064a3f 42792c6e -> 411df3cc c0fea296 4165c45e", + "3f74b4be 3e7561b8 42907e07 42aeb674 -> 40e718f0 3fe7bc4b 40f1c368", + "bf6b7567 3ef051c4 3f974b17 4242e5e6 -> c1aee931 41328592 41be2b8d", + "3e4ebc78 be148c08 41c2e30d 421256a8 -> 3f9df181 bf62f9b2 40c39486", + "3efe2594 bcb4b1e0 426c304c 42a57f3b -> 40bc3cf1 be85d5aa 413d9c54", + "bf14ca00 3f0b8f36 427acf0c 42c34cb6 -> c1227e9a 41186a2b 418bca60", + "3e216458 3eb994ec 421ca136 428dd78f -> 40203318 40b835ec 417e1bd0", + "bf61f77a beeb4772 425a123d 42a8948e -> c1523c74 c0dae676 416e2dbe", + "be8f880a 3f6859c4 42b23b4c 42b66dd5 -> be969d62 3f73d13c 3f865120", + "3f0a9422 bf537018 4167c522 42258246 -> 40e8e99b c131af35 415721fb", + "bf5b3136 bf75eb9a 419b2f2b 41fd2fc4 -> c0a7d2b3 c0bc4988 40c40132", + "bf4e1a2f becf79a6 4245ca10 4294b072 -> c1205b1c c0a16c91 41472da8", + "3eab10f8 beaa899a 417dd624 427aa221 -> 40fa2663 c0f96071 41bb2c98", + "be9f636c be68a384 4265bec8 427ee9b8 -> bf7ab715 bf36f7e7 40495780", + "3d4503c0 bf221db2 40e6a380 416628da -> 3e30c26b c01172e1 4065ae34", + "3f781fb0 3f03c248 41edee18 429ab35e -> 41b893c5 4144075b 41be6fb0", + "bf38aae5 bf616300 429a05e0 42f253c2 -> c17ecbb5 c19b7d34 41b09bc4", + "be6a1e04 bf4ca25d 42817f67 42d370fa -> c095e0d8 c18300f4 41a3e326", + "3f6707de bee0839c 42844c7a 42bbc892 -> 41484ab9 c0c2a46d 415df060", + "3d6319c0 bf17140a 41986a74 4206f01d -> 3ed0667e c08aa353 40eaeb8c", + "bf221b24 bd393260 41e1b567 4290323a -> c15e4f8f bf7dfa2d 41af89c0", + "bea9990a bf75074d 42911846 42c7c62a -> c090e5ee c15157ea 415ab790", + "3f2802c4 3f70f748 42c2b0c2 430058b8 -> 4122c477 4169721d 417802b8", + "3f6326f0 bf0497b4 426b1530 428a69b3 -> 4094280d c02cf683 40a6f8d8", + "bf5d6eac bd4d0b70 41fc2fed 42450c74 -> c0f57ef4 bee353d0 410de8fb", + "be2f5f84 3f339042 407736e8 4229e258 -> c05396e2 4158a528 419a6eea", + "3ce65840 bee6b42c 4262ddd6 42afb61a -> 3ee025b1 c0e07f24 41791cbc", + "3f29cdd2 3f5f3566 40ce83b3 4206846c -> 41103465 413d8edf 415967eb" + ] + }, + { + "glsl": "vec4 cultmath_af_frustum_ball(vec2, float, float, float, float)", + "tolerance": "ulp-bounded", + "check": "enclosure and tightness: from the arguments (mx, my, z0, z1, fp, warpVariation) compute in double zm = (z0 + z1) / 2, h = (z1 - z0) / 2, axis = (mx h, my h, h), c0 = (mx zm, my zm, zm), |c0|_1 = |mx zm| + |my zm| + |zm|, R0 = z1 fp + warpVariation, spread = (|mx| + |my| + 1) h and d = |GPU centre - c0|. Enclosure: for z in {z0, (3 z0 + z1) / 4, zm, (z0 + 3 z1) / 4, z1}, eps = clamp((z - zm) / h, -1, 1) and the nine footprint offsets e in {(0, 0), (+-1, 0), (0, +-1), (+-1, +-1) / sqrt(2)}, the point P = ((mx + fp e.x) z, (my + fp e.y) z, z) satisfies |P - (GPU centre + axis eps)| + warpVariation <= GPU radius. Tightness: R0 + d <= GPU radius <= R0 + d + 2^-19 (R0 + |c0|_1 + spread). Report the least slack of each side; only the bounds fail the check.", + "cases": [ + "beb93774 3f479b84 42ac6b83 42b7c51c 3cd0299c 3fe1326d -> c200da26 428add17 42b21850 40830530", + "bf0bca41 be0414a4 413e0a14 421625b2 3d3a525b 3fd1a94a -> c157dcfe c04bf558 41c5a837 40561d5f", + "be2dfb28 bd20c890 41ba4c99 426ca91c 3d11916b 3e13d8fb -> c0e024bb bfcf2405 4224e7b4 400fd0ef", + "bf050336 bf416fba 40abd67f 423f8aa3 3c52ce78 3fddf6e5 -> c15d5d01 c1a0f614 41d50573 40166bbd", + "beab56ce 3ed232e4 41f94c2b 4226e88a 3b49b3a1 3f4c257e -> c1432321 416f64f5 4211c750 3f6d0a86", + "bd0a6c90 bf3768f6 42b275bf 42dd3156 3c779517 3fb28b28 -> c058198c c28f2a26 42c7d38a 40443e5d", + "bf562c1f bf3e9d20 428c538a 42b7d32e 3d2c355b 3da1a394 -> c287981e c2715bb1 42a2135c 407c6148", + "bf06c83c 3d495200 424a1bb8 42507dbb 3c92c895 3e30dd85 -> c1d82d7b 40217301 424d4cba 3f8da95b", + "bedf47b4 3dea4fc0 42b684a6 430cd45f 3cf29681 3fd05290 -> c24a6cc7 41546d0c 42e816b2 40b989f1", + "bc98d6e0 bd7f3840 427dc08f 42e25e16 3d1ff754 3fcd4cb1 -> bfd2e587 c0b0155f 42b09f2f 40c0c750", + "3e0cc908 bf77e4d2 42169549 429336ce 3ad13ce8 3fc48f94 -> 40f4bb0a c25775c7 425e8172 3fd39ed2", + "3f5a8534 3f79c588 41904b3a 4233197f 3d025c9d 3f951e59 -> 41d67679 41f5223f 41fb3f1c 4025c4ef", + "be843dbe 3f1c5522 41e1e573 41e74a7f 3cfb9dde 3fbb346c -> c0ec2afd 418b98a1 41e497f9 40167043", + "be8d0848 becbd22c 420b8a6a 42387c7c 3d3e5397 3f80a1cd -> c1328248 c180fdbf 42220373 40497ac9", + "bce1c4a0 bc881460 425c50bd 426c09e6 3d3fd46a 3fd4fcb5 -> bfc93b16 bf729479 42642d52 408daf50", + "bf5f873d bf539164 420b15f6 429f7baa 3d317033 3fd32033 -> c247f9c7 c23d468c 426506a5 40a3542c", + "3ea78e58 3d100da0 42460993 42acb84e 3baed6c5 3f3d0ca9 -> 41b1db73 4018e8d4 4287de8c 3f998521", + "3f5049d0 3efd37b0 42b84bc4 42d94f6d 3cfe7cf5 3fc93df3 -> 42a360f1 42469edd 42c8cd98 409e54ec", + "3d838380 bd394970 42ab17c6 4302af48 3d01b716 3f7599e8 -> 40de2ab3 c09c80ca 42d83b2b 40a323fd", + "bdbd6ef8 be9f91e6 410c1800 4251b393 3c40169e 3f89cd8e -> c0351716 c1188abb 41f4b993 3fd87c82", + "bf10a6da 3f325cf6 40a72cca 41b4df4e 3cc174eb 3f8c8cba -> c0fba210 411b2368 415eaa80 3fd0e5da", + "bf07755a bd69a9b0 42bbda82 42e98f00 3c8fc0f2 3e447cb1 -> c25efbd1 c0c0522e 42d2b4c1 400f71a2", + "bf06d1d0 3e805228 419d7836 4289439b 3c82b697 3eba4523 -> c1ba0ac3 41311307 4230a1a8 3fbac19b", + "3e2606c8 bf300516 42ae4131 42faaee0 3ce02564 3f6b16fc -> 4189cb76 c29216be 42d47808 408b2388", + "3f740cf6 bf2dbbf3 4235dff5 42b1ad60 3cb6fbf1 3f859f2c -> 428009ca c2364b8c 42864ead 4041d367", + "3ef3c748 3f149d80 41e447ef 4298b35e 3cd52c7a 3f035b85 -> 41c7c1a0 41f38e4e 4251c55a 40200124", + "beba6cf4 3df2ad50 41dd6801 4239343a 3b9deba9 3e98a6a8 -> c1577caa 408c40ee 4213f41d 3f057769", + "3f319c28 bf5983db 414dc001 424b52a8 3d088c06 3c70151e -> 41b0bffd c1d87638 41fec2a8 3fdaca80", + "bedd8910 bd4e8780 402f41d6 423fe7d2 3c709bfe 3e1d2890 -> c12f8c7a bfa3a85a 41cadbef 3f5bace9", + "3eab28f0 bdbf87b8 41f230fb 426f89ea 3c987015 3f1f037d -> 41711e27 c086e82e 42345134 3fde273c", + "bf4f6bbf be871b00 402ba770 41bc66f4 3d135757 3f8f3499 -> c12a091f c05d822d 4151dbe2 3ffba594", + "3f1f6362 bee0e2b4 412ac288 42669665 3d0783f9 3fc22ddd -> 41aa2535 c1701028 4208a384 405b2906", + "3f4fce44 bf1526c0 40c83c1d 42297468 3d3be7d9 3f713bab -> 419ddee7 c1629f21 41c27bec 4038b20b", + "beac9b74 bf10c054 42460bd3 428fb732 3cef6e3e 3ff88909 -> c1a3aa75 c20940bd 4272bd1c 40815852", + "bc11d3c0 3f2aa972 42476339 4270ffbb 3c6e08a8 3e07aa63 -> befadc50 4212ca9a 425c317a 3f81036f", + "3f68b660 3ee73abc 419752d8 428660ac 3c64828b 3fb9fce5 -> 421c8b0f 419b8bae 422c3562 4018fa46", + "bf40e876 be1014ec 420ec5e5 42803a48 3d422fcf 3f4577df -> c2166b2e c0e0b182 42479d3a 4073e827", + "3f4d90e2 be9f8ee6 42a2ca8f 42bd987f 3d4c91b1 3e2b3ae6 -> 428d7b61 c1dba239 42b03187 409cdcde", + "bf78447c 3f63e128 42568b5f 42be5d27 3c56c5e4 3e9d4f0b -> c29052af 42847895 4294d16b 3fc71157", + "3f21c5f4 3e979ec4 429ce991 42a26e8e 3d3ccbb1 3fe2b39b -> 4249cd5b 41bd2308 429fac10 40b07899", + "bf608c53 3e53c6e8 42c63fd9 42ca3a36 3d49b9cc 3fef69da -> c2afa329 41a5a5e2 42c83d08 40db36a3", + "3e0fb508 3f617d72 42ba4080 42dbc6f9 3cf59d8c 3f79b32e -> 4163ed4c 42b2d1c3 42cb03bc 4088a682", + "bf452fd3 3f06b6c4 41d7f3ad 4201cc2d 3cdfbc25 3ef54841 -> c1b725cc 417a3ece 41edc604 3faec4af", + "bf2f9462 bf0b713c 42a6ec81 42d05f15 3c1f42c9 3f3029e8 -> c280b319 c24c6c0b 42bba5cb 3fd9bdaf", + "3d789820 bf40b31a 423a4280 42413e1a 3bf7b902 3fa12268 -> 4038430c c20ed4fa 423dc04d 3fcfe4d6", + "3f6263f8 bf5d122e 424b6081 4294c5cc 3cd00747 3f30782e -> 425d7e05 c25849b2 427a760c 40250638", + "be582edc 3f394c08 420ff1fe 429fd4c8 3d0f04c4 3def73ea -> c143c00e 4227c88d 4267cdc7 403a13c0", + "bf31f656 3eb84d60 420ac126 42146ed4 3d12c17f 3f7ec31d -> c1c7a484 414ec149 420f97fd 4014c967", + "3f44d1c2 3ed40098 4125d51f 4216705b 3d37f058 3fb1acf8 -> 4193890d 411eea9d 41bfe5a3 4044ef5f", + "bf65d64d 3e9699c0 42247ae8 4292f6c6 3cd0fccb 3fdc7fd3 -> c24dc796 4186d642 4265343a 40663c1d", + "bd74fca0 3d913270 429e3976 42bc6a16 3ca17333 3f87d6fa -> c0a5dcfa 40c49aee 42ad51c6 403ac0b4", + "3f75a11c 3e9397c8 41cd91a8 428fd914 3d1271b0 3faef3fb -> 423b54b9 41612022 42433d7e 407c0ff2", + "3f42b820 bee2ce46 42542845 42b7aeb7 3c57ca93 3f8347ba -> 425c6611 c2005bbf 4290e16d 400f119a", + "3f7ee486 bd124650 422348f9 42b2657a 3bf90c98 3f628a92 -> 42817502 c014951a 428204fb 3fc811bc", + "3d5a96a0 be5236ec 4188e47b 42673c12 3cac5bc7 3fdc1d7b -> 3fffe2c4 c0f61549 4215d728 403be78d", + "3f5e3c98 3efd3538 420d5353 4270eccb 3ca7cae3 3ea62cba -> 4225eb0a 41bd0a6a 423f200f 3fc77917", + "beee0830 3f33896a 41e6321d 428b1d0c 3b666cc0 3e13359e -> c1b6dbf1 4209ec22 4244a993 3ec6e4e2", + "bf046bd1 3f6b742c 42c682b5 42f074ba 3d083a35 3f9e929f -> c2631076 42c9de2c 42db7bb8 40a79bab", + "bf2bf828 bee64aa4 421a4c43 42a6ee46 3d05206e 3d5dfbc1 -> c223f63b c1db9180 42741468 4031189e", + "bdbd9fa0 3ba7ea00 421a4d54 426004a2 3d1ed3ec 3ffedf4c -> c08c1d34 3e782546 423d28fb 4085367d", + "be8f0384 bf2b1706 41b437df 4229696b 3d4adaff 3ff79b62 -> c110fb0e c1ad716a 4201c2ad 40810693", + "bead5176 be70d0ec 42ae08df 42d2cfc6 3cd0a993 3f5293b8 -> c202466e c1b50296 42c06c52 40607c09", + "bf0c665e bf22b2e8 4225b59c 4268e255 3d14d4cb 3ec3020d -> c1da9a7a c1fd52b5 42474bf8 401fc6b6", + "bdcd22c8 bf490a04 42929fd3 42c9b82c 3d05380a 3e93ffce -> c10b90e6 c288c75c 42ae2c00 406474af", + "bd4f4c80 bf6d6f8c 411e268e 41d15b56 3b17125d 3fe7e95b -> bf698fa1 c185c20a 4190374e 3fefa3c6", + "3f0de540 3f5693e4 40f4d16f 41b1d604 3cbaecc9 3fe711e8 -> 41047ec7 41485cc4 416f0a60 40140051", + "3f31dc18 3f30a038 42c1e20e 42c46f83 3b942376 3f106dce -> 428796fc 4286a62e 42c328c8 3f811418", + "3eff5dd8 3f17cc1e 429960e7 42fac382 3d09c365 3f6f280e -> 42499235 426fa3b6 42ca1234 40a4d91f", + "3e6843b0 bf439a26 429b52de 42aecf62 3d380f96 3faaf06d -> 4195c32a c27c3ee0 42a51120 40a86d35", + "bef2f434 3f1e73c4 424e9dd9 425ea592 3d3ccbb6 3ff44845 -> c1cbb19c 4204d8dd 4256a1b6 408f2c65", + "3f3d114e bf7d59af 42078db7 42a430ff 3cf234a8 3f96df9c -> 422b51aa c2659136 4267f7da 4066cb73", + "bea83dbc 3f5e626a 42917241 42c49028 3cc87361 3fe195fd -> c1e0c40e 42948cc8 42ab0134 40855bd2", + "bf0ed226 be1a7200 3ffc94e7 41c42310 3d243970 3fda7216 -> c0ec7627 bfffb520 4153ec5e 402c22f9", + "be7a1ea8 3ade6400 4211f380 42881122 3d11f7cc 3fed1d3b -> c14c3da9 3db59918 42510ae2 4088dd6a", + "bf3db0ec 3e28d4b0 4009e2de 41b46c58 3ac8cc13 3fa552b6 -> c1127627 40025aee 4145a8b4 3fa9c03c", + "be685384 3f08eab0 42b8ab99 42ba34a8 3c0139bc 3e2ad761 -> c1a84a1c 42465b22 42b97020 3f66bd35", + "3f634258 3f120b50 41a56a6e 41ec67ce 3d02d71a 3fbcd80c -> 41b25ac7 41653ba8 41c8e91e 401ad6df", + "3ef5e84c bf4b9a14 427bfd9c 42d78476 3d476a0f 3f72a8dd -> 42240642 c287ce51 42aac1a2 40c63854", + "3e988e10 3f1fbb02 3f661fd5 420828f7 3d0fe944 3f57798f -> 40a690d8 412e667f 418bc176 40026a65", + "3e384a60 bf05ec1a 41eafa9d 4247e978 3d2afff4 3c8429d8 -> 40e47e15 c1a60b20 421eb363 4006929b", + "3e0cdec0 3f5b0f66 42b52601 42bd488a 3bcede04 3fb88fb5 -> 414bd6c6 429e7d6d 42b93746 400287f7", + "3f6a7484 bf1694c8 41d76892 42936300 3cd007d9 3d0503d9 -> 42384d7a c1ecbd8f 42493d24 3ff3b7db", + "3e96dd10 bf195004 42ac9176 42eb3b94 3d367591 3f9c1d0e -> 41f05249 c2743901 42cbe685 40ceb170", + "bed04296 bf080894 4273abdb 42b081be 3d1b83f7 3eddeca0 -> c1f2b4d5 c21e8893 42952bd6 40723364", + "3e8d1a6c 3ee52d34 40d403c4 41fe0380 3cae9efb 3feae97a -> 40a93922 41096c97 41998238 4020c6aa", + "3f14af90 3d828ac0 42be21ed 42d1f081 3cf992a1 3fb5d5bf -> 42685d05 40cc0232 42c80937 4093cc68", + "3f29ff00 3ea2cb50 42c391ff 430f3820 3d3ffb09 3fc48b82 -> 42a009ce 4219421d 42f10120 4103f9e5", + "bf16d3c9 3edac618 41f49d2d 42a05464 3a64023b 3f80648b -> c2027db3 41bd46b5 425d7baf 3f89566a", + "3dee2a10 3f6d44bc 420b5b1a 428a010d 3bbfed6a 3f99ae8e -> 40c13673 42407c67 424fae9a 3fcd6e65", + "be4e4680 bf74a6fc 4187d986 424db8e8 3cb60f5c 3f4d2946 -> c0dc7ead c202c233 4208d2d6 3ff8e5f7", + "3e9f5b9c bdb64b28 429c3058 42bf4ad0 3bf041d2 3ff99b99 -> 41d84dd6 c0f76f92 42adbd94 4029b1c3", + "bf5e668b bdcf2e60 426cfa3e 4285bf2e 3d22ceaf 3eed4736 -> c25b2154 c0cc2274 427c3c4d 4047c8ef", + "3e872820 be657680 41ee2faa 428fa72e 3c8c4c20 3db93d41 -> 41568f96 c13622c4 424b3318 3fa90b7f", + "3f52c3d8 3e958a78 428dbbec 42c61f12 3d41694e 3f6c6b4d -> 428be6d1 41c68649 42a9ed7f 40b33e04", + "3e0f2148 bf491c9e 4226d503 426ceab2 3d23a44d 3f961bd3 -> 40e1bc93 c21e9753 4249dfda 4062813c", + "3da93660 bf36bbc6 41ad1d7a 4249ffcf 3c5083bd 3f76ac89 -> 403ebb65 c1cdf8ff 42104746 3fcd9d0d", + "3f795bd6 3f358286 4263a898 4292d8ce 3d3db3f4 3f90e5e5 -> 427de9e2 4238d34c 4282568d 40910c56", + "3f51a9c4 be410e38 4187c269 41b63d02 3b2e055f 3fba37f5 -> 41823834 c06fcf3a 419effb6 3fc1f784", + "bec96e5c 3dee93a0 42884165 4294a60d 3d1f46ed 3fcc1e06 -> c1e02c8a 4104c1bb 428e73b9 408f84bb", + "3ec4f150 bf50fab9 424cae74 42864051 3d200ab7 3d9a884d -> 41b6030b c24122d8 426c978b 402cb23e", + "3defc120 3edc7f90 42823a49 4282d0a0 3cfa9ff7 3fa6c550 -> 40f47a1c 41e0d773 42828574 405375c4", + "bf77c0c5 bf63e8b7 4159405c 42595e82 3d2ef5be 3f792ff0 -> c2037704 c1f1dec9 4207d74c 4052dd5b", + "bd406fa0 3e272250 42900937 429e4a4d 3d0623c2 3f89de1b -> c0634276 41456101 429729c2 406ad29c", + "bed4152a bdbcf5b0 40b633b8 42209a8f 3b204455 3ef62701 -> c117eb82 c0075b3e 41b76106 3f143a2f", + "3f4f9118 be28d8f0 42129553 42664309 3d3540ed 3ea51280 -> 4218c644 c0f88d54 423c6c2e 4037abed", + "3f70ee96 3eac17ec 40ee2627 4207fc22 3d1e1936 3ed7dd77 -> 419bff53 40deda31 41a5c0e7 3fddefda", + "3f54978a 3f4ec216 429ef7d7 42d2b842 3ba6a59a 3fff106b -> 42998055 429549fd 42b8d80c 4021d78a", + "3e3d7048 bcc3ddc0 428ce853 42a0599e 3d04b365 3ec85cb6 -> 415eedd0 bfe67e2e 4296a0f8 403f4a4e", + "bf585aac 3dcc9ea0 422f3eaf 42b8e3d2 3ab7b03a 3f278016 -> c2664f31 40d9d161 42884195 3f48b5e7", + "3f76a5c6 3f3d2902 4285bb50 42aec8ba 3ba73b05 3ec6307d -> 42949f55 4263f6e7 429a4205 3f55544c", + "bedb8556 3e485ba0 4188b7ec 42838d2f 3d2d0d8f 3ebe683b -> c18e1d6f 4101b58a 4225bb2a 4049a980", + "be31c4d8 3f641b6e 42a20eda 42d4fa2d 3c3b596a 3fc01e56 -> c18236cf 42a7161d 42bb8484 402e0136", + "3ef9c38c 3f0d0a28 420dd712 4219cec6 3ba132d9 3f8f17e4 -> 41903912 41a2e213 4213d2ec 3fa750c8", + "3d940900 3ed834f0 429a1b82 42ab23cd 3c8c263c 3f2b704a -> 40bc1409 42095857 42a29fa8 40088f3e", + "3ee50578 3f7eecd8 428077ab 42cb1b6c 3ce157fc 3fe6ed0f -> 421450d5 42a5175b 42a5c98c 409321b1", + "3dadfe70 3c1db300 42a0c00d 42dcde06 3c3f254a 3f808872 -> 4101af8f 3f6b14c8 42becf0a 4012bb0f", + "3f270daa 3e7345e8 4280bed9 42b495ba 3d200d4a 3fb3a44a -> 4249daaf 4192f9e0 429aaa4a 409dd165", + "be6a5c60 3e0bf558 42016474 42856940 3c3ca9d5 3f00504d -> c1355c9a 40d89d8f 42461b7a 3fa27cd6", + "3f724698 3f581b5a 429a9eb3 42a59318 3d3319d5 3f473c1e -> 429783af 4287261d 42a018e6 408cbfea", + "be1d3608 bf44e19b 41ce2f46 42871279 3c4e13ec 3fd8c62a -> c0e534ed c20f85a7 423a9e4a 4022c2d7", + "3db414f0 3eaadb78 421ebfa5 42aa2e42 3d45f9f9 3fb8eb3f -> 40af8c4f 41a68e4b 42798e14 40b1d792", + "3f64d12c bf36e06b 4259a6c9 42c20414 3c406f8f 3f74a197 -> 428757ac c25856aa 42976bbc 4006182f", + "3f54c7e2 bf76dd24 42ba075c 42c0e7d4 3d20c5cd 3fc5c2d5 -> 429d7af9 c2b6b497 42bd7798 40aa98cd", + "bf79d640 bf6d471b 4299dfd9 42c105f3 3d1e6f2d 3fa08e3c -> c2a945eb c2a0c38c 42ad72e6 409f9b48", + "bf3ddbd2 be08fd58 427c5df1 42a7a33a 3c130b8e 3e6e3e20 -> c259e87b c11d3a70 4292e919 3f7c2e02", + "bf028302 3f7b6aca 4213be28 42998901 3d478dc0 3e69e867 -> c1e7de75 425f55e9 42636815 407dfe9a", + "bec73610 bd3826c0 4270d950 42b47a96 3d17b1ea 3e30018e -> c1ea274d c05873c1 4296739f 4060e5a5", + "3ed3e824 bf41e201 4289cde3 42a75379 3c2010f8 3fdb3e62 -> 41fc9330 c2671787 429890ae 4021f1b3", + "bda7b428 be94d55e 42049e0c 426588e4 3d28a965 3eda9dee -> c06d3e43 c1528c5a 42351378 40328ebc", + "bf58408b bf31de96 42b2c2f8 42ffad0c 3d1f9a0c 3f8893c2 -> c2b77e06 c296ec97 42d93802 40c18ddb", + "bf5100b0 3d850e40 42c0ffff 42ebbee9 3cf8dbc0 3ef823f0 -> c2af0481 40ded70c 42d65f74 408219aa", + "bf482807 bf4313b2 408e4c9d 4234f78d 3d1c6285 3f1d3875 -> c19b65f5 c1977467 41c6c121 4015dc72", + "bf288f7f be351938 41edac75 427f7d5a 3d0c4cbf 3fa6de3c -> c1f678ac c10466fc 423b29ca 405f7626", + "3f607de2 3f2b0fd4 41c0127a 427adede 3d43ad72 3fd2bd31 -> 42181ad7 41e7ce7e 422d740e 40949173", + "3f12272c 3f056ec0 4186f404 41c51d24 3d135beb 3fd25d1e -> 413d9499 412d1492 41a60894 4021eaa8", + "bf0f192a 3d94eea0 428bcab1 4292a1e0 3cd0c13b 3ed4adc5 -> c2201acc 40a6a1bf 428f3648 401229d5", + "bf420f7e bee1b144 424e0314 4293a7d7 3c19b606 3e192bd3 -> c23e0387 c1dcfc70 427aa961 3f57a5c1", + "3f20358e 3e92a1e4 426cc691 42719346 3c810e1e 3f52bf6f -> 4215ae1c 4188fedf 426f2cec 3fe32bea", + "3f558ebe be583418 423b7b4e 426be2f9 3d2a2f10 3ff1dbaa -> 423096c1 c132c6da 4253af24 408adff0", + "bed2c3c2 bebab636 42670414 4281b3a2 3d039af7 3fd89e6e -> c1c9e189 c1b2d787 427535ac 4071abf1", + "bf59dfb0 3f685d52 42204016 424ca320 3cf42fd2 3ee834c3 -> c21b45b7 42259976 4236719b 3ffd435e", + "3e5e0820 bf4b7d22 42b49978 42bd7cb6 3ce6a563 3f4f45c3 -> 41a07d7d c293163e 42b90b17 405e8cef", + "bf39b5ec bc81d7a0 4281b09d 42922916 3d44df9c 3f1fd4f6 -> c2481c5a bf8be90c 4289ecda 408462c5", + "bf0962ba 3f05f744 4232fbec 42a51f05 3c44529c 3f262924 -> c208a433 42053d7b 427e9cfb 3fd1baf8", + "be95f41c 3f75100a 428d3419 42d8992e 3d1e9de7 3ec397b1 -> c1d195aa 42ab41f0 42b2e6a4 40926f90", + "3e85b604 3f755b04 427f3a88 42c2756b 3c98da5d 3eedbe20 -> 41a838b4 429a5732 42a10958 4011d6c2", + "3eb2f588 3e3aa250 409c2745 41b8fef6 3caa9f4d 3ed835be -> 409c9cfa 4023546c 416008c7 3f676991", + "3c8ecf40 3f282566 42a67993 42acd3f5 3bae4b07 3f2d5800 -> 3fbd47b2 425edc73 42a9a6c4 3f9185eb", + "bed0383c bf3da053 420ed5ec 4243daa6 3d3a6cb7 3fe15722 -> c189bcee c1fae078 42295849 407f4d4f", + "be4e5098 beba23d4 428f32db 4296c437 3d31dd6f 3f9de0d5 -> c16ce95c c1d5bea7 4292fb89 4090393d", + "3d2c5d20 3f3582ee 4203ace0 42890859 3cbc16b5 3f95407b -> 4008977b 420fd746 424adec9 402f5071", + "3f08c3ee bd7eb730 4141a7dd 42039f68 3cc9078b 3f3d7c49 -> 41405d8a bfb32221 41b4095f 3fc61bdf", + "bef15490 3f3bda8c 420ac448 4239f341 3c4c019a 3f51c683 -> c1990e05 41ee4746 42225bc4 3fb2fe01", + "bc7b7740 bed6d128 42aed5bf 42d39051 3cbbbacd 3fa4f7ec -> bfbdc708 c2221e82 42c13308 406da32f", + "3f2b4bd0 be8997d0 40e02405 423385a2 3c5da86f 3ddbf1c9 -> 418adebb c0df1800 41cf8a23 3f36f42e", + "3d06da80 3e4b4ed8 4290a34a 42bbc33b 3d2cdbf4 3f8f9579 -> 402f195f 4183fdd5 42a63342 40a2aece", + "3f43e786 3f17f95e 42145e81 42463cce 3c73d1bc 3fa2bc16 -> 42049ee3 41cdc33d 422d4da8 4000936f", + "bf102cf4 3f42ef80 42800b61 42e2ae2e 39094534 3db0ed69 -> c247c6ab 42870e3e 42b15cc8 3dcfd452", + "3d8b2700 bf2c4a49 40e533e7 41b3c0b4 3cef34f2 3f93f7ce -> 3f80da8b c11f89fa 416d0dae 3fe7f41f", + "3ef87cb0 bf3136c0 421f26bf 4293fe2d 3d33ba2f 3e3d68f3 -> 41dce3d7 c21d884d 4263918c 405ba5d8", + "3ce3c580 bf7b0fa4 41a078e0 41bb2140 3d38406f 3fe3f7fc -> 3f1aa2eb c1aa72ad 41adcd10 40355445", + "3e96b57c 3f2a9824 401a92d9 4226bf46 3c912cf2 3f66c261 -> 40cfb487 416b1c68 41b06874 3fd1f369", + "bf6bd08e bf0383e8 42c6ccd2 42dea6e6 3bf68221 3f9395db -> c2c21c49 c258835f 42d2b9dc 3ffed12a", + "bf7dac27 3f324812 42124249 42177b42 3c385d33 3e584fd8 -> c2138446 41cf599e 4214dec6 3f23321b", + "3f774be2 bf143d3d 3fdab9ff 410f684e 3d0d205c 3fb099d4 -> 40a4f16f c045bf2d 40aabf8e 3fd821e2", + "bf2c3cc5 bf1a5bfc 42b7ea46 42d3b5da 3d16b21b 3f12ba3c -> c28516c0 c26e8c7b 42c5d010 408ef90b", + "be034ad0 bf3233ae 42c441e4 43079963 3c8b7830 3eab721a -> c16fbd4f c2a2b2be 42e9ba55 4029320f", + "bf75bff5 3efe8cd8 42a21bfc 42e01dcc 3c5b92bf 3f2e18d2 -> c2b96174 424004e9 42c11ce4 400ba786", + "3e2c0b20 3c0ccc80 3f1caacb 42269bf1 3d0b4e44 3d6e93a6 -> 40633a53 3e39f613 41a90e9c 3fbcc968", + "3ee8eeac bcc4de20 429d4599 42a6b4f6 3b8bbd28 3fb061fb -> 42136490 bff924f2 42a1fd48 3fdde59a", + "3f3fb12a 3b946700 4168ec2b 41f9d888 3cfefeb1 3e9e5531 -> 41892514 3dd458d5 41b7274f 3fa405c1", + "3d7fa4e0 3f05f29c 424b55b3 42ac6a3a 3d246d74 3fff2e99 -> 4088d9c2 420f68b2 42890a8a 40ae8a87", + "3e430bc0 befab05e 424bce8b 42735b1c 39cebbd9 3f732845 -> 412a58a1 c1daf15f 425f94d4 3f7952e7", + "bed1a648 be8c4828 42bccabb 430033e7 3ce61b68 3ebc9811 -> c2364bb7 c1f3f51e 42de9944 407e0f27", + "3ebd27d8 bea0f18a 424fc62a 42c0ed2b 3ce1c918 3efd3da0 -> 41db4ff1 c1ba9a34 42946820 4049d249", + "3a624800 bea2133a 40de284c 41ac8155 3d333e42 3fd6401a -> 3c499235 c0906058 41640b68 402784ba", + "bf745fdc 3ebf2c24 414c44af 42363a55 3b9474de 3f81446b -> c1deb352 412e378f 41e94b81 3f9bb2ff", + "3f2a1498 3f40d030 428c6c9b 428d46ae 3c3a0689 3f5947d8 -> 423b27b7 42542b8c 428cd9a4 3fd35245", + "3d24a2a0 3d74d7e0 42410aa5 427f509e 3d23b2b6 3fb86f76 -> 40102ba5 40566889 42602da2 407f7b74", + "3efaf950 bf1a74d0 42bc4885 430e2b5e 3d04fa77 3f0ed3fd -> 4267abe6 c28e93ba 42ec4fa0 40a58fc8", + "3e8aec78 3e9036ec 41a9a808 4208f734 3c2adca7 3f6be777 -> 40f0b8d7 40f9e3ca 41ddcb38 3fa3aa8b", + "3f5b4bba bec9c3c4 42185695 428f62ff 3c109cd0 3f236f01 -> 423c13ac c1ad0a9e 425b8e4a 3fa2bc1a", + "be9b85de 3e8ee0b4 41dbf470 4245ca5e 3d2ce420 3faf2f7c -> c13af8f7 412bc530 4219e24b 405d2d3d", + "bd109500 3eb4a2c8 413d15d4 4184723c 3c982e35 3d27800b -> bf003283 40a02a54 4162fd26 3eb26a63", + "3f07cad4 bf1f20d4 42594f74 428f78f0 3ce07f18 3fad37d6 -> 4205bcfc c21cb89e 427c20aa 40546f6f", + "3f4a8690 bf602cbd 4079e83e 42393125 3a905b89 3f655a30 -> 419edd69 c1afd8cc 41c8cfa9 3f726fb3", + "bed34890 3e12bcb8 4285fc93 429e1bec 3b861989 3fec2d79 -> c1f112fd 41276d4d 42920c40 400acd4a", + "bf69651d 3f322b4e 420e4301 422edf06 3d454267 3ea33366 -> c210909e 41dcb74f 421e9104 401b273a", + "bddc3ac8 bec683a2 420e0944 4241794b 3cc44bfb 3ff8e255 -> c090509f c18215c0 4227c148 40469f7e", + "bf2d3a2e 3da84dc0 41d907fe 4212b708 3ccb4be8 3d11ada8 -> c1acb4e5 4027cc41 41ff3b07 3f722439", + "3f55fb22 3e2464b8 42973494 42dd9210 3d1f2127 3e66d9c7 -> 429bcb7b 416f61eb 42ba6352 4090f2fb", + "bee02208 3a176800 4277efd9 42ce992c 3bf0d5c9 3f0b6234 -> c210b573 3d4381e0 42a5488c 3fa6e3d9", + "bf787730 bf047732 426eb818 428ad92d 3b2b76bd 3f85b4b1 -> c27a9bc5 c2059baa 42811a9c 3f9cf9ff", + "3ea96870 3e519760 41b57ef0 42277610 3d38bb0e 3ef6d3f6 -> 412adead 40d36662 42011ac4 4017b2c2", + "beb61442 3e8dd7c8 4269c050 4276f710 3d0ca7de 3f753c8c -> c1aaf434 41852d19 42705bb0 404501d1", + "bf252c98 bf4b5965 40f73567 42214768 3c84e9bf 3f7fdda2 -> c177fe5b c198a7a6 41c02e15 3fd3ae05", + "bf2a9b02 bea344c8 40e78f6a 419addcc 3d34a200 3f6cf67b -> c10dc96b c087b076 4154c1a6 3fe3c274", + "3da37ce0 3e75b248 41815ab9 41a24ff5 3c47c0c4 3ef29ac7 -> 3fba43f3 408bf6bc 4191d557 3f38a24b", + "be7e57a8 3f6f129a 424477fb 42ad1106 3cd79773 3fe49a5f -> c186c5a8 427d5c9d 4287a682 408207f1", + "3f155802 3d8d4400 4287c1af 42bb3d82 3c9cbada 3e8d58d5 -> 423c6d91 40b23c59 42a17f98 40044fb3", + "3d6b9600 bf11cc60 42a2dc82 42b0ed4e 3d05084b 3dade129 -> 409c58ad c2418493 42a9e4e8 403d535f", + "bf1bb265 be8c64fe 42b7a4ce 42c153d5 3ac3da35 3fb5ba02 -> c265453d c1cebcb1 42bc7c52 3fc83cb3", + "bdc94cf0 be1d647c 42902bff 42dc811f 3d2cd19e 3f104d53 -> c10f60c3 c1603550 42b6568f 40a6e617", + "bf56f174 bf0521ba 421eb82a 4264277a 3d0d7435 3fb81f66 -> c22269eb c1c93128 42416fd2 405a232a", + "3f7a0474 be112800 426724ba 4285ec44 3d303663 3fc9e520 -> 4273aa00 c10d77b5 42797ea1 408ea94f", + "3f247e5a 3e9bb208 42bfd6c4 430e9712 3d123fa1 3faaa130 -> 4299414a 42110eda 42ee8274 40cd95b6", + "3e98440c be4df7b4 42c239c1 42ce1561 3d358feb 3fe1222d -> 41ee1964 c1a1095a 42c82791 40ca72c5", + "beb99154 bee225b6 42bbcfd5 4304f2a0 3c74cb85 3e516812 -> c22470b6 c2486659 42e2da8a 400c3b3b", + "bf27bb19 bf71745a 428a40f6 42b1ed8f 3cb27486 3e90d246 -> c24f296d c2951bbf 429e1742 400e2619", + "3ef7a4c4 bf22f650 42524176 42654531 3bfc177c 3ee1055b -> 41d496e7 c20be50e 425bc354 3f616ce7", + "bd8f4c80 bf799240 42494de5 42633c6b 3c62c745 3f407536 -> c06fe152 c250e3ad 42564528 3fc4e465", + "3f005dd2 3d0efcc0 428dfb41 429367fa 3bbea16b 3f6360f3 -> 42111bac 4021a2c2 4290b19e 3fa8961c", + "bec1cd24 3f6c6f42 420dba06 42751970 3ac5f43e 3f526421 -> c1926bb3 4232a187 424169bb 3f6a1dce", + "3f0f7a6c bf15bf9f 41541e75 4214168e 3a296c33 3fd4ebd3 -> 4161700e c16b4a33 41c91e2b 3fd7fe68", + "bf4dfb39 be1a4e68 41ae9f5e 427add27 3c1e4032 3f882523 -> c2080ce2 c0cbd68c 4229166b 3fd5b2b8", + "bf379ffa 3ddc62f0 41c66934 42797c60 3d05f4b0 3fdfae1f -> c1fa1c69 4096176d 422e587d 407264fa", + "be7c9768 bf1f1476 3ef43138 41e51791 3ad1d366 3fc7ab9d -> c065ce74 c110baeb 4168e856 3fcd8b81", + "be5be394 bf436890 42b6c86d 42cf7beb 3b8fb3b3 3f720e2b -> c1a79bb4 c294f2bb 42c3222c 3fb34979", + "3f1354dc bf0cc34a 4176e0f3 41a9353b 3c817251 3ff1d45b -> 41286c28 c120e9dd 419252da 400e4ec3", + "bf52ec4d 3f7acac0 3e8575fe 4207438a 3add0aa2 3fd9c918 -> c1609c5c 41858893 41884e76 3fe118cc", + "bf2ee662 3f5db0c2 4202a098 42263863 3d3af4ef 3f8f8efc -> c1cacea0 42008824 42146c7e 40412d33", + "bf1b380a 3df341b0 41f745a7 425ba40a 3be85c9f 3fd6c668 -> c1d0230d 40a3182d 422ba36f 4004503b", + "be3e29b4 bf10d4be 418e9d47 420dae8e 3b8a437b 3fe481c2 -> c09e369d c170fed8 41d4fd32 3ff7a51e", + "3f55f656 3f33a040 4207c63c 428e5d8c 3ad11fde 3ff76bbe -> 422fba1e 421386d4 425240aa 4002fd7b", + "be791c44 bf721e34 41bfec95 421c834a 3d07fbe9 3fa9df0d -> c0f5ae21 c1eec8b7 41fc7994 40281427", + "3f3e8972 3ed28f2c 417d5b33 41bbf71b 3ca64147 3e46d602 -> 416a2f2c 4101658a 419d525a 3f2bcadf", + "bdbc2310 bf120188 41a5264e 42193616 3b2a23cf 3f86c828 -> c02d4814 c1867a2e 41ebc93d 3f93849a", + "bf2bd83d bec4c658 41096a7e 41c28ed4 3d10eefa 3e47bfee -> c130b8da c0ca5c18 4183a20a 3f871f8c", + "3f08ce96 3ef1f7e4 42b57928 42c06434 3d1a5860 3eb94d8a -> 4247cb4c 4230afb5 42baeeae 407f2a29", + "3cc3ca00 be30cf34 42b49f8f 42d893a5 3d23ce83 3fe2b5d3 -> 4017e3b6 c1892a58 42c6999a 40c3433c", + "beb6a64e 3f49d7ae 42b33c80 42f3ba30 3cf94452 3f5e73f1 -> c216e313 42a6be04 42d37b58 40927924", + "3eb9d098 befbcd96 42a28596 42aa9372 3d37e2c9 3fde230f -> 41f1c681 c223d186 42a68c84 40b2108d", + "3ebf7308 3e04cbf8 42a033a4 42f16f0c 3cee0fba 3fb8ddb0 -> 42162e6d 415057e4 42c8d158 409e7aea", + "3f43564e bf5f4b9a 42004746 421ca283 3cdbaf96 3fed50c9 -> 41d96621 c1f883c9 420e74e4 4039df47", + "3f0337f0 3f06ba2a 42be815f 43101486 3d0371a7 3ffdb4ac -> 427559cd 427be94b 42ef5536 40d36473", + "bf1ca30d bf4f8880 42266466 42666e38 3ada9ec5 3e9f89c3 -> c1f2cd17 c220d8f2 4246694f 3ed0cd73", + "3e858b3c 3d1ff740 428c126c 42cd20cc 3d01cb61 3f67ef72 -> 41b4135c 4057b436 42ac999c 4084ff7f", + "bedc0b76 3ebf53f0 42a7c1b0 42abbb1d 3cad576b 3ec0d27b -> c211e739 41fdb96c 42a9be66 400c64da", + "be7573ac 3ecc7584 42a6b197 42b8cc7c 3cc42bc0 3fbc4da7 -> c1a8813d 420c5ce9 42afbf0a 406bc565", + "3e064a00 bf23d44c 420fc7d6 42a8cc1c 3d36056f 3fd83a36 -> 40fc836d c21a07ae 4270b007 40ae1474", + "bd1376a0 3ed1d518 42755ad8 42ccd1c0 3d358efe 3fcd9251 -> c03ca5c8 420637b7 42a3bf96 40c4a87c", + "bdc34530 be8849aa 42558e09 42ab491a 3c1653da 3df931a0 -> c0d4196d c1940893 428b080f 3f68576c", + "bf74b2df bf09b6f0 422c9127 42acfce7 3d2f7833 3fd93bdd -> c277d360 c20b7975 4281a2bd 40ace2cc", + "bf52be3e 3eddefc8 4208b3e8 4290c613 3cf49d2c 3ff101a6 -> c22f72a7 41b8c445 42552007 40816c8f", + "bf2f3d32 bf79403b 4276dcce 42bf6bd8 3d1a9e7c 3fd9f566 -> c2578675 c29946a4 429d6d20 40aa1cc1", + "3f180ee4 3ea53900 427c8993 42d3d052 3c0b6434 3fed98d9 -> 4248d033 41da32e2 42a90a8e 40307a26", + "3f2e144a bd9490c8 42a0269c 42a3bb1b 3cf0dd85 3de1d4c4 -> 425c3d16 c0bbf5aa 42a1f0dc 40211e05", + "3e9e9980 3ef0c88c 424f4fe3 42b4e82c 3c037a81 3efcc983 -> 41b04b93 4205d304 428e480f 3f9c20d3", + "bec7f9b4 3ecb519c 4201ae0c 4267bf62 3d34690f 3eaff0f6 -> c18d2a4d 418f867f 4234b6b7 40395175", + "3be80400 3edf0cf0 412f0ec8 42321761 3d080d7f 3fdf83f3 -> 3e491201 41414d0c 41dddb13 404e68d6", + "bf20a50b 3f0b83e4 42751fa8 42bec52a 3d2dbcb4 3f8540b8 -> c2449f20 422ac293 429caa7f 40a2c9b3", + "be0fa388 bf2aacb0 40cb1b88 41fbe91e 3abdd2db 3f4918f9 -> c029d5ab c149cd0e 41975800 3f54c93e", + "bf676a91 bf64f96b 41509c09 41dabf4c 3bb5fc5b 3fdc7b32 -> c19203bf c190794d 41a186a8 3fefedc1", + "be1c6614 be6af620 42aae719 42cfe809 3c9a29b2 3de5185e -> c1676d45 c1add6c4 42bd6791 40045e7c", + "3d645f60 beda5ebe 429c2dfc 42ca1b2b 3c90a95a 3f66be2e -> 409fcf52 c218cf72 42b32494 402be6e8", + "3f23a1d0 bf29c393 42a00e6f 42fccd76 3d2e0315 3fd09267 -> 4283f27c c288e449 42ce6df2 40dffd9f" + ] + }, + { + "glsl": "vec2 cultmath_iv_snoise_ball(vec2, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c0b75188 423d2522 3fe31de1 -> bf800000 3f800000", + "4246e964 c17bd730 3ffdfea1 -> bf800000 3f800000", + "c1fc8975 41f194d4 3fabf475 -> bf800000 3f800000", + "422c4d44 c071c1a0 3fd3f608 -> bf800000 3f800000", + "c23713bf c1e1f045 3f9bd561 -> bf800000 3f800000", + "c1ca302c c1c9a6d7 3f0eb662 -> bf800000 3f800000", + "c240811b 41fd106c 3f4b9b12 -> bf800000 3f800000", + "40b4c4b8 c20a57d5 3f8fbe05 -> bf800000 3f800000", + "41bfdf38 423c4866 3fd09ad4 -> bf800000 3f800000", + "4132fb74 41928344 3fdbd120 -> bf800000 3f800000", + "41144c7c c217c5e0 3ed0b522 -> bf800000 3f800000", + "c1942dc5 42094cd8 3e8c25d3 -> bf800000 3f800000", + "423da796 c0ebaa98 3db0bfe8 -> bf7ce0fc 3ed394b1", + "4210e1d4 c1fb88da 3f92c7ce -> bf800000 3f800000", + "c138f714 411b6590 3fd319a6 -> bf800000 3f800000", + "42351de6 c1050a60 3e89f897 -> bf800000 3f800000", + "4208db38 40e77400 3feba820 -> bf800000 3f800000", + "400aeda0 42237bba 3d894c73 -> beee05c0 3f1f9a22", + "c104362c 421a7d38 3fd19d99 -> bf800000 3f800000", + "c18b5312 c1c20c75 3f3e91df -> bf800000 3f800000", + "c2010afc 40e7e338 3e744721 -> bf800000 3f800000", + "41fa5b44 c1818bb6 3f2f18ef -> bf800000 3f800000", + "4147268c 41b60648 3f3fd0b5 -> bf800000 3f800000", + "c0329330 c1b57f58 3fd258fd -> bf800000 3f800000", + "c1d3705e c20962ee 3fa184d5 -> bf800000 3f800000", + "4201aff6 c20329a4 3f8ea755 -> bf800000 3f800000", + "41bd66b0 41e5a36c 3f8dd837 -> bf800000 3f800000", + "41905f4c 41d7c74c 3e63da68 -> bf800000 3f800000", + "422f3ce6 c22b9bbc 3ed958f6 -> bf800000 3f800000", + "c203d8fc 421ef6a8 3ff5012b -> bf800000 3f800000", + "c191d4ce 416d4478 3ead6501 -> bf800000 3f800000", + "41889fd8 4193d99c 3f9d01e8 -> bf800000 3f800000", + "c0923388 40e4a4d0 3f04d36f -> bf800000 3f800000", + "bfdb55c0 c189577a 3fb08164 -> bf800000 3f800000", + "41cffb88 c14fee54 3f195ec9 -> bf800000 3f800000", + "c2206f47 c1ab31ee 3fc0969f -> bf800000 3f800000", + "c11c56bc 411509fc 3fb6da8f -> bf800000 3f800000", + "c1bea39f 410e8c74 3f70f9d2 -> bf800000 3f800000", + "41fe6da0 be9d5180 3fcd86f3 -> bf800000 3f800000", + "c244ca5b 4215f0bc 3f08efe0 -> bf800000 3f800000", + "c21414a0 c092eb00 3fd48870 -> bf800000 3f800000", + "c1045274 c20a3ecc 3fa0018c -> bf800000 3f800000", + "41744400 40cfbf28 3f71a813 -> bf800000 3f800000", + "c240f288 c1502664 3f99d0c5 -> bf800000 3f800000", + "c1a1a0f2 c1c4e3f1 3f6b017e -> bf800000 3f800000", + "4211d0ba 422831e2 3f4cca33 -> bf800000 3f800000", + "41f949ec 4207ac2c 3fc8fb09 -> bf800000 3f800000", + "c0810210 41d67964 3f1bf57a -> bf800000 3f800000", + "c1cdae76 c2319898 3df46831 -> bf800000 3f62119a", + "419ed1b0 420d191c 3ec0cf6a -> bf800000 3f800000", + "41f84cd4 c0abe0b0 3fb25e57 -> bf800000 3f800000", + "4244c95e c16b1838 3fdfd1f8 -> bf800000 3f800000", + "420fadc8 c17bb67c 3edd3bd3 -> bf800000 3f800000", + "418b7dec c0ac0238 3fb8a231 -> bf800000 3f800000", + "c1afa335 c1388c9c 3ee4ffa8 -> bf800000 3f800000", + "c21a9ae5 42397eaa 3f2bcbae -> bf800000 3f800000", + "c2435565 42356616 3f939f77 -> bf800000 3f800000", + "c11b19e8 c1f2dea0 3d9413cd -> be5b2b20 3f75b1a4", + "bfe4eb60 41881744 3fafa7af -> bf800000 3f800000", + "40258540 c2023d62 3e4a6634 -> bf800000 3f800000", + "40d209a0 4235a828 3fb65a94 -> bf800000 3f800000", + "c1acee5c c1ea31e3 3fec74bd -> bf800000 3f800000", + "42219de2 c19b33af 3fe69f77 -> bf800000 3f800000", + "41072f40 c245dd0e 3f93f90b -> bf800000 3f800000", + "c1fcc7f6 c2111a02 3f495671 -> bf800000 3f800000", + "c22e71e8 c2004ea8 3f447a22 -> bf800000 3f800000", + "c22797f0 c2143c56 3e3de781 -> bf800000 3f800000", + "41b331d8 41957c7c 3fe6386f -> bf800000 3f800000", + "41324fe0 c1144c70 3f0020cf -> bf800000 3f800000", + "4180bea0 3f7c2e40 3faee059 -> bf800000 3f800000", + "c1f96894 c1855516 3eacbe51 -> bf800000 3f800000", + "c2191696 c21c823d 3f7c167c -> bf800000 3f800000", + "c2446fa6 4246a594 3eb6143f -> bf800000 3f800000", + "c1a04cc9 c1e8718f 3fa86cd2 -> bf800000 3f800000", + "c0d1f7f8 c0e909b0 3ff2bc08 -> bf800000 3f800000", + "424773f8 c1e0c4ff 3df4464a -> befb28db 3f800000", + "41646070 c102d5c8 3f7b7637 -> bf800000 3f800000", + "c19df3d7 c0b07de8 3dba3bf0 -> bf3a8330 3f3f673a", + "c2458ef1 4208a848 3f090982 -> bf800000 3f800000", + "41fa5788 4189e9b4 3fcccf9f -> bf800000 3f800000", + "418afe84 c1cd82da 3fcbd6f5 -> bf800000 3f800000", + "c1e1b473 c125ff98 3fac1362 -> bf800000 3f800000", + "c110c100 c22d4d65 3d6d98fb -> bf1e5894 3ea573f7", + "422054e2 c2320242 3ebb6a8b -> bf800000 3f800000", + "c1eb2be4 41e11ce8 3feb8577 -> bf800000 3f800000", + "c0d17e20 c1a8502c 3f052593 -> bf800000 3f800000", + "42346fe0 41347ffc 3ec135a0 -> bf800000 3f800000", + "c1f76eef c240b8cc 3e3c92d6 -> bf800000 3f800000", + "c1f657f6 421a45a2 3fe3779e -> bf800000 3f800000", + "c216af32 c21b87a4 3f08ef5e -> bf800000 3f800000", + "c1dc24b0 c1f336d7 3f262d36 -> bf800000 3f800000", + "c1441180 41496960 3ff762cc -> bf800000 3f800000", + "4210a312 c1e2c98b 3d80a6f4 -> bf57e016 3e34c4b6", + "c1b314b1 410e90e0 3e9c620b -> bf800000 3f800000", + "c23bbd89 41c18670 3f3a25a4 -> bf800000 3f800000", + "c19962f5 c22163fa 3fa9e339 -> bf800000 3f800000", + "c215fd7c 40e50690 3f8d60d6 -> bf800000 3f800000", + "c244f58b 4210bbe6 3df5f5cc -> bf019788 3f800000", + "4132ab1c bfd928a0 3ee6b5e6 -> bf800000 3f800000", + "41a39e88 c23dae3e 3f82c4d2 -> bf800000 3f800000", + "41e2d098 c1ab021b 3ff4a19e -> bf800000 3f800000", + "41d12580 418cce74 3fdbebc4 -> bf800000 3f800000", + "420f5b0c 42036e6e 3e9fac69 -> bf800000 3f800000", + "423573cc 40e96950 3e16a495 -> bf5bf7b0 3f800000", + "c1d8fe78 418bf470 3d4638aa -> bf800000 be6cc936", + "c2399b82 c207f9ee 3f0da52a -> bf800000 3f800000", + "41b6b2b8 4219857e 3fca0d0f -> bf800000 3f800000", + "c1dbf93a 42474e48 3f8a32a1 -> bf800000 3f800000", + "41ac0a38 c1e2399c 3f2b40fe -> bf800000 3f800000", + "c1bc4843 41d4a1b0 3e92b70b -> bf800000 3f800000", + "41c1228c c2092c32 3ec3b585 -> bf800000 3f800000", + "40024370 bf3ca900 3f1b3ead -> bf800000 3f800000", + "c1f29eb5 c1b8a092 3e07ea92 -> be474494 3f800000", + "3ed9d280 c0a06438 3f096018 -> bf800000 3f800000", + "3f4b6c80 c2037147 3fffa63a -> bf800000 3f800000", + "c006c520 41df1364 3ebfcb06 -> bf800000 3f800000", + "c239a6ed 40f23248 3f25895f -> bf800000 3f800000", + "42337362 423e75e8 3e91d785 -> bf800000 3f800000", + "41b121bc 40bb2748 3f13a025 -> bf800000 3f800000", + "c1067524 c235725d 3f6b09e9 -> bf800000 3f800000", + "401f07a0 4115fcb4 3e018d22 -> be98b714 3f800000", + "c242ef82 c1e63af8 3f55138a -> bf800000 3f800000", + "4218f336 41a6b918 3ebb1b74 -> bf800000 3f800000", + "41b0ad04 4207b3d8 3fe411e3 -> bf800000 3f800000", + "c1e7b003 c1dcb492 3f5e50a5 -> bf800000 3f800000", + "4007c020 41adab60 3fd3b379 -> bf800000 3f800000", + "40831f00 c1d31d22 3f60975e -> bf800000 3f800000", + "c20d18fe c1d8fa68 3ec3148d -> bf800000 3f800000", + "41ffe5e8 41ea3bc8 3eb9ada8 -> bf800000 3f800000", + "c23482c9 41ef26b4 3fef2649 -> bf800000 3f800000", + "c2420b64 41e09bdc 3ee49425 -> bf800000 3f800000", + "412b5fcc 423fc32c 3fdb306d -> bf800000 3f800000", + "c1ebdff8 bef16600 3ff58e45 -> bf800000 3f800000", + "41046930 411a81dc 3e1136fd -> bf800000 3f31b00e", + "c2462b2f c193fae0 3fbc8f52 -> bf800000 3f800000", + "c0d92d90 41be96c8 3fc08d5e -> bf800000 3f800000", + "41a67478 c1efd64c 3fd76b19 -> bf800000 3f800000", + "c078ee70 4215fed8 3fcf746d -> bf800000 3f800000", + "c23fd577 c143da20 3f3b0644 -> bf800000 3f800000", + "42151304 c1f5c4ec 3f56e44a -> bf800000 3f800000", + "c1d40914 42057600 3fe8d5a6 -> bf800000 3f800000", + "c1c97730 41a4c3cc 3df1864f -> bf800000 3e991814", + "41866890 4125402c 3efaf8de -> bf800000 3f800000", + "40f8edc8 c1932802 3ee385f6 -> bf800000 3f800000", + "4213135c 42374994 3fa3c4c1 -> bf800000 3f800000", + "c1534e94 c20eedce 3fe9ee7f -> bf800000 3f800000", + "c0943f10 c1339d64 3de16564 -> bed84297 3f800000", + "c0e39258 c17ef418 3f9953df -> bf800000 3f800000", + "c222e6c4 40ac1c18 3fe7e3c9 -> bf800000 3f800000", + "c10be87c 410ab5ac 3f9a1d7f -> bf800000 3f800000", + "bf620540 c1860600 3f1b0e90 -> bf800000 3f800000", + "407e7930 c17384a4 3fc35626 -> bf800000 3f800000", + "c2079c0c 41cd20d0 3f9bf8c2 -> bf800000 3f800000", + "418e5910 41d34c10 3e8aa2ec -> bf800000 3f800000", + "3f3b6940 c213e37c 3fe25b62 -> bf800000 3f800000", + "413f5ae8 411576f0 3feab42e -> bf800000 3f800000", + "c203b4c4 4173f8b8 3ef0f1c8 -> bf800000 3f800000", + "c09c1ed0 c1019468 3fce1dff -> bf800000 3f800000", + "c1583778 41f4db84 3f7c8b7e -> bf800000 3f800000", + "c1976a9e c209d4d4 3e9c4208 -> bf800000 3f800000", + "c20ae92e c1c3a334 3d0beaf9 -> bf1a297a bd432a58", + "4164a360 c2255a32 3ffbccb3 -> bf800000 3f800000", + "4227b8d2 c189a870 3f9c5113 -> bf800000 3f800000", + "4216a680 c1ea6f31 3f45ed0f -> bf800000 3f800000", + "c19c40dc 41dc972c 3f9fb1d9 -> bf800000 3f800000", + "4227d724 4228a010 3ed7d434 -> bf800000 3f800000", + "41abab4c c02bd7f0 3ff5dc09 -> bf800000 3f800000", + "424399d2 c1ce8ab6 3fef2aa1 -> bf800000 3f800000", + "c154f64c c238043b 3fe9db38 -> bf800000 3f800000", + "be829c80 c2020a8e 3f8abdca -> bf800000 3f800000", + "c1b8111e 420c1942 3f99e778 -> bf800000 3f800000", + "c089edc0 40215b70 3f824830 -> bf800000 3f800000", + "c218a745 4211c4ce 3db4c976 -> bf800000 3e018a1c", + "422039dc 41a03bd4 3f081e29 -> bf800000 3f800000", + "c19aeaee c1a4b68c 3f644035 -> bf800000 3f800000", + "420b757e c20d636c 3fa4b955 -> bf800000 3f800000", + "c1fedb76 c0af2810 3fe272f3 -> bf800000 3f800000", + "c1ade6e1 4119d42c 3faeb3cc -> bf800000 3f800000", + "c1f68ec9 c2068301 3ce7669a -> beaa1041 3e017172", + "c2270c9e c1b33329 3dc112e5 -> bf087695 3f7f54f7", + "c22bf319 c0fa0fa0 3e9d2311 -> bf800000 3f800000", + "c22c865a 412abc40 3f36cce7 -> bf800000 3f800000", + "41e43914 420b1d4c 3f007613 -> bf800000 3f800000", + "c21a0503 41f0fcd4 3debfb38 -> bf47f35e 3f800000", + "c205503f 41fb3794 3fc5e16c -> bf800000 3f800000", + "419be7a4 41921e94 3ff29f1a -> bf800000 3f800000", + "bf90d100 3fe99de0 3fe4bb4c -> bf800000 3f800000", + "c1b7da70 c1932efc 3fbad21c -> bf800000 3f800000", + "417b8d90 4242eae2 3f024ac2 -> bf800000 3f800000", + "42277c94 c1bbeca9 3f393f3e -> bf800000 3f800000", + "befe0f80 c2399aa7 3f96b04b -> bf800000 3f800000", + "4246ccac 42042cf4 3f0ebe78 -> bf800000 3f800000", + "c21b0461 c1d1de3b 3fb003a0 -> bf800000 3f800000", + "c224795f c22ea70c 3f1922cd -> bf800000 3f800000", + "c12b9a3c c22d68b8 3fa4eac1 -> bf800000 3f800000", + "4202f270 c219a332 3fc84044 -> bf800000 3f800000", + "4223c412 be9d9b80 3f7670fe -> bf800000 3f800000", + "c22da22a 4115e7a8 3fc203c5 -> bf800000 3f800000", + "c20ab528 41eff43c 3e59aa9b -> bf800000 3f800000", + "c0f520f8 c10da6f8 3f9e9e82 -> bf800000 3f800000", + "c21ef512 42129ff8 3f9538f4 -> bf800000 3f800000", + "421b9d28 413fdc70 3fc3eec6 -> bf800000 3f800000", + "c04831f0 c2041cec 3ffbcc98 -> bf800000 3f800000", + "bf0ed140 4103e0d0 3f63f95e -> bf800000 3f800000", + "c1bfbf7d c12034a8 3f690a19 -> bf800000 3f800000", + "41177fa4 4216f958 3effea9d -> bf800000 3f800000", + "c225c220 4203f0f6 3fdf1777 -> bf800000 3f800000", + "c03350a0 c244477e 3fc4ae91 -> bf800000 3f800000", + "42182b02 c0e2cfa8 3f629994 -> bf800000 3f800000", + "420444e6 420981d4 3d7dcc44 -> 3d5939d0 3f800000", + "c202f5ad 41973f7c 3fd38761 -> bf800000 3f800000", + "c22cce85 42427bb4 3ec9f0eb -> bf800000 3f800000", + "41acd754 3ebe2480 3f64c854 -> bf800000 3f800000", + "42178384 c16229c8 3ff23b30 -> bf800000 3f800000", + "41eed4d8 c10802a4 3fea1f56 -> bf800000 3f800000", + "c23990b3 41f47b28 3ec6e230 -> bf800000 3f800000", + "c19db4fb 40bb5778 3fec2bff -> bf800000 3f800000", + "420e8450 c181c3fe 3f94f262 -> bf800000 3f800000", + "41c66c38 4150ffe0 3fdb7a17 -> bf800000 3f800000", + "41fb9d78 c2448dda 3ec3c8f3 -> bf800000 3f800000", + "c18da4bc 415cdff0 3f270f0c -> bf800000 3f800000", + "42353c00 c18e8b30 3fe4b6fd -> bf800000 3f800000", + "413e0f1c c1f62274 3f53f21f -> bf800000 3f800000", + "c1c18a04 42177440 3f3f8170 -> bf800000 3f800000", + "41f2621c c1ea8b48 3f716472 -> bf800000 3f800000", + "422a145a 418ac110 3f9831e1 -> bf800000 3f800000", + "420d784e 4209bbb4 3f9fab5a -> bf800000 3f800000", + "c1c9374c 4031f620 3f1237ad -> bf800000 3f800000", + "c21ccdf2 c192f3fc 3f3403c7 -> bf800000 3f800000", + "c1cc5556 c1900941 3f36393f -> bf800000 3f800000", + "c1805cf4 42209cee 3f7d9eb3 -> bf800000 3f800000", + "c1c361c9 40b2af10 3fb8827b -> bf800000 3f800000", + "414061ec 420a2e6c 3e3fbf48 -> bf800000 3f800000", + "c23f8be0 c10451e4 3f9d0be8 -> bf800000 3f800000", + "41e01fe4 c236157c 3fae1902 -> bf800000 3f800000", + "409c1dc8 c232acbc 3e868fb8 -> bf800000 3f800000", + "c21bd61a 420121c2 3ff50b48 -> bf800000 3f800000", + "c1bda36b 4238566e 3ea8a6fc -> bf800000 3f800000", + "40d744c8 c22a36b8 3e62aee3 -> bf800000 3f800000", + "c237b5a8 420a09f0 3c44e6e9 -> 3f19dd46 3f4bcf4e", + "4086b5c8 c149463c 3fdf5848 -> bf800000 3f800000", + "c230c498 42276978 3ffa2427 -> bf800000 3f800000", + "421772ec 40970f98 3fa6b224 -> bf800000 3f800000", + "41c87ba8 c19c0843 3fd3fcc0 -> bf800000 3f800000", + "3de87800 4205042e 3f5ac99d -> bf800000 3f800000", + "c243e657 c04ab970 3f776fcb -> bf800000 3f800000", + "412880d8 40bd72b0 3f06d7a6 -> bf800000 3f800000", + "c1dfc3d2 c2125490 3f7ea824 -> bf800000 3f800000", + "c1228ed0 c2295cc4 3ff0d2e7 -> bf800000 3f800000", + "c187589c 4196cd04 3f769886 -> bf800000 3f800000", + "413093e0 40fe7120 3ae06ada -> bee3835e bed5482c", + "c224ef78 c0062990 3db27bb7 -> bf800000 3e7ffa0c", + "41c0b6d0 41b1a910 3e81bce1 -> bf800000 3f800000", + "41a23ebc 41882198 3f81a063 -> bf800000 3f800000", + "c0000d30 c1604fbc 3f84a2ee -> bf800000 3f800000", + "c21452ae 41d1741c 3e83d42d -> bf800000 3f800000" + ] + }, + { + "glsl": "vec3 cultmath_af_snoise(vec3, vec3, float)", + "tolerance": "ulp-bounded, reach 1e-6 to 1e-3", + "check": "the arguments are (cx, cy, cz, ax, ay, az, radius, ...) and the result is the form (x0, a, e). Enclosure: for eps in {-1, -0.5, 0, 0.5, 1} and d in {0, +-ex, +-ey, +-ez, (+-1, +-1, +-1) / sqrt(3)} (15 directions), form the point p = c + axis eps + radius d in double and round it to float32; the device's own reference value at p must lie in [x0 + a eps - e, x0 + a eps + e] with no tolerance, so a device whose gradient error exceeds the allowance fails. Tightness: with L = 7.9640074 and, for each octave (one for af_snoise), R = |axis| + radius, B = L R + 2^-14 + 2^-12 R + L 2^-20 (|c|_1 + R), the width |a| + e must be at most B + 2^-16 (1 + B). Report the least slack of each side, absolutely and as a fraction of e; only the two bounds fail the check. The reference value is cultmath_snoise(p). These cases have reach |axis| + radius of 1e-6 to 1e-3, where the float32 allowance is most of e and the second order remainder is not; the enclosure above fails a device whose gradient error exceeds the allowance. Centre leg, for every cultmath_af_snoise and cultmath_af_fbm family of this fixture, the earlier ones included: the fixture's own x0 in the result (C#'s value at the centre) must lie in [x0 - e, x0 + e] of the GPU's form, with no tolerance, so a device whose noise differs from C#'s by more than its e fails.", + "cases": [ + "3de98ec0 3e5960a0 3e824700 b64c3554 36674e47 b629f5b3 37601e01 -> bee8782f 36405f94 38e47f77", + "3f2f1238 bf6d5b1d 3dc3cf20 b943c815 b9552ec5 390597fe 3791eb35 -> 3ebaf9fc 38759590 3903a3ef", + "c139b3a4 c1b8837e 41c4ffc0 38e3ec26 38dc4b8d 389176fa 395ca6ba -> 3e59bf01 b9c019c6 3aa38297", + "beec548a bebdab10 3f1ff0f4 b5bb676f 35bed139 35f5b0c6 3911e058 -> be35088f 367641c8 39f0591e", + "c2091b3b 41f27428 c156f984 00000000 00000000 00000000 36ef2dcd -> 3e02aba0 00000000 3a2ee486", + "bf415a24 3e96f054 bec22aba 00000000 00000000 00000000 3979f5b4 -> 3f00ce18 00000000 3a7b595f", + "c172a69c 41dbd6f0 c16ab350 375ab8b5 b70b7f01 359ff929 3a6d5e2c -> bd169e91 353c0390 3b08a2a0", + "bd8ca798 be54ffb4 be60513c b674cdf7 36c97804 3649905b 3646a75a -> 3f0e31c6 37195340 38983a7a", + "bf460e64 bf5d040d bf1b828d 3660aadc 35cca052 b66df0c7 39513c96 -> 3dbd40e3 b5bb6f1a 39c641fc", + "c0e04328 40af6150 c1fa88dd 396b6d16 b96965b5 b9031a1e 3595385d -> beb2ac89 3a28b532 39d1baa9", + "3e63bbf8 bebac5a0 be8fda88 b8724e47 392ef8ff 38801b83 37b225b5 -> bd469206 3a15fbc6 39114f62", + "42281202 c24198d2 c22f046a 00000000 00000000 00000000 36769265 -> 3dd08ee9 00000000 3a8ebaf1", + "40fb4bc0 41d9f458 c139afc4 00000000 00000000 00000000 3683c860 -> bd915b07 00000000 39dd7762", + "41504874 421674b2 c20b5de4 b6667f0c b574ab23 35408169 39116440 -> 3ec66a90 34c78fd0 3a93c55a", + "bee2441e bde396a0 3f70b70e 39c53600 3963ae74 b9f24965 3591be10 -> be52a73e 39db57bc 38b7ed8e", + "41eb0098 411db0ac c1f88cee b5d5548d 38cf478f 38735753 37c7eba0 -> 3ec4e662 39735a97 3a2a8306", + "c0806970 4207b82e 3fbb4dc0 37938dcc b5d15df2 b6eeda70 394876f3 -> 3e299ef9 3610b078 3a031c8d", + "c1f2d8ed c1c343a1 c092bdf8 00000000 00000000 00000000 392a6aa0 -> be841b57 00000000 3a8b98da", + "bf04a494 be5b8028 3e11d388 381eae8f b8893bfa b9e5e3f6 380771e6 -> be0c82b1 37fe2d4c 38f43f81", + "41957650 41be235c c1026468 00000000 00000000 00000000 38b2c682 -> bf485844 00000000 3a3177e4", + "3ee8d84c bf01f67b be1c98b0 366355ec 35a4befd b64f4484 36824a2f -> be305f08 b62249d8 389934d4", + "bf271ebc 3f069042 bf432953 b99449fe b990e5f2 391393bd 3927e7c0 -> be9b8b31 3a8f6452 3a40e811", + "c219e9fe 3dd99800 422f887c 00000000 00000000 00000000 38de6c5d -> be66d34d 80000000 3a6bdf8f", + "3f1f6cce 3e9f8c24 3f17d57e b7179bf6 35057781 36021be1 382187fe -> bf496c88 b6edbe56 3906d607", + "41352b58 c1a236d5 419692dc b8a5fb2f b86dc7e0 38c9aa74 36e23fe4 -> bc78d716 b96082cc 39eed2d5", + "41d327e0 423a1498 421ae206 b6c534f3 351ea919 b2a20814 39468d10 -> be99d01b 373e6c27 3ab7bc5b", + "c19a2218 c10a5698 41d3a4d4 3809d622 b698a636 b6e3bbb1 398c0264 -> be308f7f 38434f83 3aa85503", + "bf2f79f6 3f17e7c8 bf7b3ce9 34af4f09 b5861a9f b62ef6bb 36078865 -> be373174 3435f5e8 38ab890e", + "3ef533f0 bf0be5d1 3eef5408 3684116e 367886d9 3640d57f 389e1322 -> 3e46b642 b6b4b726 39753a45", + "c23c9be7 c1728468 40c9bdf0 3746859f b714ce0f 3581890e 392f07e4 -> be63bedf b543e2e0 3ab4c6ed", + "3f5572b0 befe432c 3f4e7150 b98837cd 39f8a638 39f29b6b 3a7d3137 -> be1e0035 bae0ca24 3b5721e7", + "be9157a2 be9aa8de bf3073fd b564e7b7 b7e47e1b 3743ebc4 37a396ef -> 3d01088c 38264ae1 38e609b5", + "3ebc2358 bf2ab187 3f44b152 381a2fa6 38c9b21b b8adf22a 35abddae -> be1729da b9a229fe 38a5f202", + "420acfe0 41ecab00 c111f0ec 35f6037d b388ab51 b576402f 35a4f81c -> bf5e99ac 35f71757 3a22c8ec", + "3f47d23a 3f22ba9e beee49b2 b82384f5 3794ee57 b7fea625 39926a12 -> be5bdfbc b886d39f 3aad1f13", + "3d22cc00 bf6a7da4 3f6ba68c b81a65c2 37dbf2d6 b768d528 3591854a -> 3e736ce9 366bcff0 38aa1a6f", + "41bae30c c1c8f478 4225fdb0 398f4069 385585ba 39bccb38 362d021a -> 3e813bc5 3a8f6cc4 3a468507", + "3f0397c4 3e1b5948 bda08d28 b9ca5a56 39bcd58c 39ce14bf 36af1af3 -> 3e8c0ed2 bad63992 38c484c6", + "3e6d2048 3ea41868 3f48943e 00000000 00000000 00000000 3996f19f -> be57c54d 00000000 3a2787ff", + "3f2bd122 3eaa1e44 bf422a0e 00000000 00000000 00000000 3619fab4 -> be437cda 00000000 38a29b37", + "bf50c330 3e41eb48 bf2a77b8 37fcc4ce 370c7b9e b7f4401d 392d38b3 -> 3f2a3a72 b8e82782 3a1c5f62", + "c0cbd658 41fcfb70 c22ec733 365f9692 b63e42ce 36b9809f 39bb42c4 -> bd14aeb4 b6f7b921 3aa607b4", + "c190c5ba c22abb87 41ff83b8 00000000 00000000 00000000 3745a35b -> bda5b210 00000000 3a4d8025", + "3f2bd3d6 bf712a22 3ee816c0 39c82020 ba2f85b7 3a0ef5dd 37ecd8f8 -> be5828a7 bb42b998 39581bda", + "be8d0096 bd897928 3f6d145c 36bf2f5a 366386f2 b6aef199 369d9d3c -> be38d5fd 38001fdd 38c38404", + "c20aeeef 42164ab8 c1dcf32f b8ba4961 38866176 b845b6f2 37b70f8d -> bf0a7584 3826e548 3a66104c", + "41dc3c30 c2228583 c1ac76f5 00000000 00000000 00000000 395fb00d -> 3e400d51 00000000 3af6ce5c", + "41fd8b10 c05e2a70 40861770 38d0d6f7 b8ccad21 b7172dd8 35d792ab -> 3dcf4a5d 38a1298e 39bd9626", + "c1904117 40cb7c90 411efac8 36ab60a9 341cfc94 36a01fdb 3836fd90 -> 3e0a2dd7 375cebed 39dfdbc3", + "3f1c3e4e beb64e66 bf03c15f 378a7ea9 b799080f 363158a5 35fb591c -> bebaea08 b7927659 38a53e45", + "c1fe62b5 41cf8f3c 3f8d14c0 396078ee 390aa93f 391e2529 362e5013 -> be83cfd5 b969a1a1 3a06d974", + "c1078380 3f5f42c0 c183212e 3749f1de 390108e4 b98bf39c 3636e04a -> 3ef1b783 ba44988a 398c8c57", + "c1cc9256 c246d757 417b3620 b837ccc0 b5849e00 b86431f7 3895d183 -> be73a7c3 37f62b8a 3a7032f8", + "3d54f2e0 3f7de9dc 3e7e8100 398a98dc 3809558c b97f0aeb 3933d47b -> bea586d2 b9f0a6d9 39dfabfa", + "41c322f8 c23d3902 c20eaa17 359bbef9 b6b1d76a 37543f48 378d44bf -> bec5131e b7370d7a 3a73300d", + "c2226a7d 41b20174 c1907ff6 b8ad4189 b869bf29 b890cd4b 37d8337f -> 3f13a6a2 38dd6069 3a44b34a", + "3f909160 c20b3045 c1ec68a8 36bdce6d b70a5cc8 3824f333 39dfd1e1 -> bf2f9ae1 3759b222 3acc16dc", + "3e8a6754 bf04eb40 bf5800ee 00000000 00000000 00000000 3818fd87 -> bd6a4378 80000000 395872e4", + "420fd2c0 c1f6a1ad c1b678ec 3546ed21 37eabe9f b7c936eb 38c3b026 -> 3f595d16 b86d98a6 3a6d7e39", + "3eb4c96c 3f189838 3f0d244e b63520a7 b7184ff3 b6fd2eb5 38a165f8 -> 3ea5f7f5 37173f60 39cca256", + "3f2518ba 3f02f312 3f51eb52 00000000 00000000 00000000 37906e56 -> bf038b0c 00000000 3901ea9f", + "3e905500 c09de718 c07c0f80 3902c51b b9282f1b b930185e 37188c7a -> bf44fb9c 39bb6fe0 39206d3d", + "be1e7114 bc9fd000 3f3fcf6a 391d9da0 3880d283 38a333a9 3931747e -> 3f3c365a b911cb8a 3a210464", + "41d05878 c22c289f 3d0af800 3a037b44 399f465d b9357f0e 37805668 -> 3ca99dd3 3889b1ae 3a26e35b", + "c1aea15d c20d4fb2 40da1758 00000000 00000000 00000000 372fee37 -> 3eded15e 00000000 3a14caaa", + "bf607798 3f1b2cf6 bf2e8aa4 b53ca5da 38377f2e b59b39df 3a27c39a -> 3ea53d0f b8e55b3b 3aee1a9f", + "bcdea220 3f6bc518 3e955588 00000000 00000000 00000000 359f53f2 -> bde0af67 00000000 3898d0e1", + "c13c3a04 c18b8a4a 41977a44 39c10126 b987a91f 39d43adf 3a2acc88 -> be486436 ba157e60 3af41124", + "c10ca7a0 c1e36336 414e6e70 363edeb1 360e96eb b59b804d 3898a8eb -> 3c47d632 36215d9b 3a1886f5", + "3e3ddfc0 be749268 3e4065c8 390c3107 3a41c0f6 b9874945 36a5198a -> bec28bbc ba9efe9e 38cc6239", + "c1ada584 c1c43976 c2286978 00000000 00000000 00000000 394dea7d -> 3ef66c5c 00000000 3a7f7e7a", + "c1501140 4222cbea 41f3ffcc 35dd42a7 b5c0bd08 b4d9af69 384416ed -> bec6093e b5569379 3a5251d2", + "42273736 417f27d0 423bdd2e 35f5fd35 b526d71b 3490aaba 38507dce -> 3f0c77e8 354adfcb 3a847636", + "41b94df0 421f0aa6 420c7d2c 37abe1ef b7ed240f 3745d1cc 36005407 -> 3b6424f5 37effa4f 3a53f5e5", + "c2114824 3f0cb000 3f93d9a0 b881b7f5 b8bb682f b907a43f 3619af99 -> 3e5d367a b93940e9 39bc01a9", + "42368666 c00b1f30 c1d3e256 b8041083 374f2efa 380d3897 396adc5f -> bea6d948 b84310af 3a8f3da8", + "3ef0e534 3f76c88a 3dedc390 36dafa93 b78a3d7e b98ad4f3 35ac9137 -> 3e1eb420 b91184ec 389fce0f", + "3d8feec0 3f4de232 bf74d21b b6b0972b b5a9458d b6aa5ca2 369f8e31 -> bf00d467 3745f0bb 38c26010", + "c22c42d3 41dd8150 423eced4 00000000 00000000 00000000 35b7bdd3 -> be447b9f 00000000 3a7ccd2b", + "4181f7a4 40836f68 4238b7c2 00000000 00000000 00000000 35a6e636 -> 3ed0f20b 00000000 3a155b4d", + "41beff84 c1bb33d9 c0f935a8 00000000 00000000 00000000 3a36572e -> be15657f 00000000 3b28e838", + "bf29b1ce 3f722eb6 be89ee8a 3540e9fa b5152575 35986492 37c452e9 -> 3eb6df0e 363a945a 39031dd5", + "bf26594c 3e7b48e0 3d8cbaa0 b9cf01ce 393388f5 3a210aea 358aea0c -> bf038f7a 3ad55a27 38b9a42e", + "41adb20c c1c1efa8 41f7ea70 371fbc13 372dee6e 36e4b629 364f6fd8 -> 3efda2a8 b617df30 3a2bb0c2", + "3f744716 3f75e39c bd8ef7b0 b7a6591a b75969a9 37981f29 35dab19d -> 3f24d687 382071b6 38a60baf", + "be784a14 3f7b87b4 3f18089c b6adb4ef b6d08a66 36a21fe9 3986a5fd -> 3f0dcef7 37a7ca75 3a32de27", + "3f3fd680 c067f940 c20c12a8 b976f7d5 3958cf4d b931b7b0 39243938 -> 3e35e9ca 3a014c02 3a2e8ef0", + "3e3df470 be140aa4 3f481a86 35d2b9fe b5b3364c b5c91613 386f03bb -> 3dcf1e35 b67af167 39807bd6", + "41b4cae8 c1ba7374 421b13b4 3a526b07 39c83589 b88b91ad 363b79d5 -> bf1779c3 3a8d9341 3a40813c", + "befe1c54 be1d7680 3e424690 b9825e49 375d51c7 39ab2dc4 3753dc13 -> bd9316fa 39afb828 38b87c4f", + "c22429fa 42462e1e 41cff6d0 00000000 00000000 00000000 35b580ab -> 3d833059 00000000 3a78c816", + "bf4c92d3 bf4eab1f 3f6f7a0c 00000000 00000000 00000000 366b1b50 -> 3f6037b8 80000000 38b5e474", + "41bf90dc 41b1a608 c0bdba30 00000000 00000000 00000000 38604ee4 -> 3ea2f3f2 00000000 3a173281", + "3e7428c0 bec6a8d6 bdcb6198 00000000 00000000 00000000 3905bc9d -> 3c9998be 00000000 398777fe", + "40f7c328 c204251d 42052424 b5dbad63 b6b1b9ae b69bee46 395394cd -> be7161e1 37398358 3a9c2619", + "42449fb6 41b86eac 3f32b800 b68b3a85 b73d4f7a 36475ec3 359583fa -> 3de4bb19 376f917c 3a21aa86", + "beb29c04 3f06396e 3ebc1074 33ff620b b58c6666 3579776d 36bf3803 -> bf1178e7 b6247cdc 38b460b3", + "41d03308 4223ee26 c1a5258c 35a3ab4c 363aac60 b63e8a50 38b3733d -> be0ea413 b45ad3e0 3a5643db", + "3f1d0964 3f4a427e 3ee2b58c 39beea9a 39ae13a6 39c176ab 37c455b9 -> 3ed721f3 bab8f22d 391648a9", + "3eb8ec60 bf53f036 bf2bf5fe 3a1c0507 39f6946b b7af6eeb 372d82c0 -> 3f16cdef bb0e652c 3908ccec", + "c112ec2c c193caa9 c23a3029 3960f554 ba4d9a7e b8f7d9b1 3a67fcf7 -> 3eb311d1 bb01a775 3b4dd5c1", + "42223180 c1016684 41b025a0 b6af89f8 b59431a6 b6f4f115 3633572b -> befb19f6 367ea1e8 3a1f04de", + "bee73566 bf7c2701 3e3de280 b79ddac1 37e62524 38224da3 38aa35db -> bd6a6a9a b7293717 39222b9f", + "be653a44 bf2f078c 3f3c750c 00000000 00000000 00000000 36933d83 -> bce7a14a 00000000 38a3f2e1", + "4210341c c2425044 41c84f74 b4dfb2e2 35013626 355cab6a 38f67c33 -> 3eaff8b6 b5a54c72 3aab8f52", + "c15699ec 41d89f88 40aae458 3780f554 b79c611c 3795462f 365988aa -> be4d3646 b7c487ee 39d81b1b", + "41b208dc c142f9f0 c18aace6 b57e9353 360ebbb0 b580031c 35ceffc3 -> bccbed00 b54b1472 39ef4e26", + "3dd113c0 3d284020 bf243704 3692fa13 b7f86bbd 368fb48e 385afecb -> 3f564ca8 b81df745 393a49f1", + "bf614131 3e325378 3f6ec39e 00000000 00000000 00000000 370d2593 -> 3f24fbd2 00000000 38d6852b", + "bf77df2f bf29f860 bf5a021c 00000000 00000000 00000000 373027f6 -> 3e028310 00000000 38cf970a", + "c23c3dd1 41fabf38 41d7207c 36fdf273 3751f9fd b6fd914c 37a0185c -> becbad8e 3716fa1e 3a6fe6ae", + "3f62c6fe 3f62aba8 3ed77868 37f2f373 38f83662 39043628 3883185a -> 3e6ecb33 b8102384 3965b379", + "4227eddc 417ce0d0 c17f0690 00000000 00000000 00000000 37903eb4 -> 3f11eb04 80000000 3a315b53", + "41530afc c15e2d60 420cba4a 00000000 00000000 00000000 35ca4cf7 -> 3e6c046b 00000000 3a0d2c23", + "be3e9384 bf2634d6 bc9120e0 39064732 b906df4c b852aa80 366a0038 -> bda9f02d b92f4216 38982220", + "c225e0df c1cb0dd1 4166a360 00000000 00000000 00000000 378d2046 -> bf36a909 00000000 3a41f500", + "c13a90b0 c20f3d12 c1b84b87 36550372 b752ada3 b599d22e 37dbde7a -> 3eb92688 b7f8b44d 3a2e13b2", + "bf5bded6 bd2422b0 bf24ba24 34a3bbe4 b5b72634 35c209c1 3829d03f -> 3e6a4f2f b661f522 393bc6da", + "be954e3a bf0c740f 3f6d491c b80a03c0 3901042a b9072c39 385b3a3a -> be9c867b b9c326fb 397e77df", + "bf5e2e00 c132e824 41ef2a78 00000000 00000000 00000000 3a60c8fa -> 3ed2ebd7 00000000 3b57cbf6", + "3f4b7f58 3eeec058 bf0fa160 36298746 b692cce6 3697be80 35970a65 -> bf00117f 34e6ed10 38a3ccbd", + "3e23e8d8 bf0aa220 3e684268 b89fc1fa 39cf2baf b8ea307a 360e4787 -> 3ed20b27 ba7bae10 38a76dcd", + "c2009e2f c08388b0 4226e7ac 372480c1 36b34490 3703c66b 36331d7c -> bf240e71 b73368b9 3a2cfbf2", + "3eb959c8 bf7b36e9 3f729aec b5205113 b60b6163 35de45ac 399295f2 -> 3e1692ce 34a53ab8 3a5a1a08", + "c185ddac 41951744 41eae9a4 b8925c42 38fce9c1 b8dc3e3f 3886d399 -> bee6257e 37443750 3a3d9a0b", + "3f4cf886 3f59c8d6 bf613635 36061b5c b682f33c 37a8520d 381634c1 -> be67bb7a 37cab0f6 39458d72", + "c18f0bda 3fbb05e0 c212035c b9278403 38131a37 b8fe8450 37cda4c2 -> 3ea773dd 391759f2 3a04fc42", + "41810c8c c17b6fc0 c230c39b 373d10e8 b493329c 36c03d88 381a02a4 -> be465588 b6e4363e 3a333d43", + "3e02a228 bf65b51d 3f0d2658 00000000 00000000 00000000 3968ac4b -> 3ef6e600 00000000 3a7cee8e", + "3f65ff4c bf313f1b bec032cc b96cc8ea b8338bd9 38cc2630 3a0feee3 -> bde475bb b99408b5 3ac1ca85", + "3dd28510 bda83aa8 be832172 35b26240 b5926755 b5f28b00 36f3aad1 -> 3f51a74d b698faa6 38aa0d9c", + "3f3c0ae4 bf20e606 3f7d6ccc 00000000 00000000 00000000 395b0955 -> be834045 00000000 39fa9cda", + "42265ba8 40be2620 c0978e98 3712fa29 3787b209 360195bd 38997ae0 -> 3d95c29b 36ad4dd6 3a237073", + "c0888720 407bd570 c1bc056b 00000000 00000000 00000000 39134bd8 -> 3e8dfd12 00000000 3a17f0a7", + "423878f6 c24533a4 4230472e 00000000 00000000 00000000 3a7de13d -> 3dacf968 00000000 3b061149", + "beccffe8 bf1c9e9c 3f08d446 3904ee39 b8b404a5 38fdd5f2 36490e02 -> bf170f4e 39ff5d10 38ad7a93", + "c20bce18 41cd77b4 4034e1b0 00000000 00000000 00000000 3737ad25 -> 3eb45863 00000000 3a154125", + "bf577c7d 3e61bae8 3f5001ee b90178fe 37893485 38f74148 39d1b43e -> 3f13cea6 3853e0e8 3a944ad5", + "4208a5a0 412d38cc c1dc5952 b5eac9ee 349cbd67 b45aeb37 36c9a68d -> bd0ee186 b5fc8f2b 3a240370", + "3e84dd80 c221c63c c23a3d40 3464b906 36168e31 363a2fd5 377635a4 -> 3e94f1f7 34583ba8 3a437c1e", + "3ec16c90 3e97db38 3f533b62 359d066a b4f8dbcf b512c0ad 394d2df0 -> becb69c4 b603dc24 3a1d0a01", + "bedf7be0 bf747cc9 3f0d5244 b5cada72 b63e89c1 3506d8a9 365fa6b6 -> be19df97 b5b67dec 38a5f15b", + "bec91a98 bde3de50 3f1daba8 00000000 00000000 00000000 36317570 -> 3ef2e4b5 00000000 38a0f351", + "3e1b4670 3e2016b0 be2ce340 00000000 00000000 00000000 38923b77 -> 3f27da87 80000000 39839a34", + "be938fa2 be902c22 be73c528 00000000 00000000 00000000 39002547 -> 3e82907b 00000000 398392a0", + "bf613992 3f09514c beeead2e b7233328 3576e97a 37d83379 371887e4 -> 3efb900b b837f226 38d449c8", + "42320f02 c1c4e544 c190b818 b6893f7f 362b1ac4 b625910f 39ae0651 -> beb973d4 b571a1b4 3aaf7fb6", + "bf255adb 3f637bb4 3f026274 377beb4a 36cfc5f6 b833df15 38d199fb -> b8998fbf b797c5dc 39489b9a", + "c08cfd40 c1f84bdd 41070e9c b9e22bbd b8da53af b95524d6 361e6467 -> 3e1ea9ad bacfe659 39d70bc1", + "c21b8ca8 418087c4 418336f4 38b028e2 b96000c1 39817740 39154bfe -> 3ec36410 b97dc33d 3a8d2bd4", + "bf30ce29 bf3a235d be968e26 377b9b5c b7d26904 b8053549 39610eab -> 3d312315 38195905 39f4d672", + "be638f98 be1dbd50 3f2085e4 38954ba8 389dedda 38517da4 38c9ce60 -> 3f3dbe50 394cda26 39a4a4e8", + "bcb81c80 bec43e12 bf427489 371d2335 3540d8d1 b721b0eb 35f7fc12 -> 3a6af6bf b732b05f 3896c30c", + "41821dc4 c1ab9509 42066502 00000000 00000000 00000000 36cd3052 -> bf25728f 00000000 3a222736", + "4206a998 41aab0d0 4220fa66 b63216b6 36e0feb6 b71ddae0 3a054157 -> 3e01eccb b7d58e42 3af968e2", + "3f31bc88 3f05c706 3e8c1010 b3285be2 b5c8670f b5d7b4dd 35cda96c -> 3e915989 b57bb94e 38a0c224", + "bf77aed4 3f1b6c54 bf2f5992 00000000 00000000 00000000 39a85142 -> 3e7ae68d 00000000 3a87edb7", + "bdb39958 bec3dd1e bf4ae67d 00000000 00000000 00000000 3871e685 -> 3d207825 00000000 39076cd4", + "3e8ff964 be1fa0cc 3f5674ec 38c12ad2 38619cd4 b8c3da29 3678540d -> be4731d8 b9038f82 38ad2614", + "3e96e6b0 bf730168 3ead4c64 371d6f0f b73db148 379c8165 3609aab5 -> 3eec467e 36b26518 38a8d753", + "bf6437a7 be2c6988 bec97974 00000000 00000000 00000000 384311f8 -> 3c6b7233 00000000 3968fbc4", + "bf2e5e27 3f02b84a bebd0422 b5a6ee51 35cae3a8 b6077689 361a774a -> 3e7c269c 3606a660 38a31a71", + "42377524 40673380 c100a384 36aa0882 b603678c 3604a9f9 364568f7 -> bed05b86 36a43053 3a0540e6", + "408d19c8 c192c8e9 421f10b8 00000000 00000000 00000000 3726c1af -> be5ad31f 00000000 3a127afc", + "3f7faa7a 3f3ac114 3e92a6d0 00000000 00000000 00000000 36187a51 -> 3dbfd921 00000000 38ac4777", + "be4c42e8 bf4f2973 3c5bbe00 b9684627 b98ed699 37972acb 3a1b50ac -> be2edde8 38e62bbc 3a45aa34", + "be503f7c 3d4b5ea0 befd363a b8e50aba 37b02a65 389efc19 39464d8a -> 3e40c7e7 b9824e21 3a2791a7", + "4216c272 c0f425e8 c20dfde4 383433d6 b858571c b63349dc 398317d7 -> 3e00173c b8f3664c 3aa62c2e", + "3f251c40 421e5c0c c221a25c 00000000 00000000 00000000 362b8a59 -> 3ef0c750 00000000 3a32a4b7", + "c24489a3 c0ace358 42311f00 3536ec85 b50f1f6d b5592e8a 3a14fc9b -> be48c024 3495ee1a 3a99e070", + "4244d33e 421cec3c 4129f5b0 b59ceeaf 3595700c b3bc32fa 358eb201 -> 3e8971ea b4ed92cc 3a55ea2d", + "3f669668 3ea7b7cc 3e49e5c8 3886af32 3885d571 b8973246 3592f404 -> bd464715 b8aa6edf 3899a8f7", + "be119720 bf23eb72 bec86976 36f3d431 b73fecc2 37cb5a54 370846ce -> 3f00dc89 b87a6054 38cf66f1", + "bf11842c bf424ded 3f59746c b71d9ea8 35ffae75 b739ef1f 367c3e84 -> 3eacfb89 b3935d00 38bc4eb6", + "be0f5008 bf72821c bf5f39d4 00000000 00000000 00000000 375df434 -> beebc205 00000000 38fd123a", + "420af4b2 4132a340 c145fa94 b7037292 352ebc71 b784cabf 3a31f599 -> 3e79d34e b7e294ef 3b75be4d", + "3e3444c8 3f487238 3f2950be b7344ed9 3783152a 37100fd0 3948de64 -> 3e3754ca b7375245 398e5640", + "3ef4cef4 bf45bfb8 befd5956 37a2a1bf 3703fabb b44ab961 35dd4e50 -> be1eec36 b828f137 38a81200", + "c219aac4 c20e01d0 c17e9734 00000000 00000000 00000000 381f77f4 -> bd10b912 00000000 3a541ab3", + "c21e05de c08c6490 c197082e b6d20bdd 341992df 352fc00d 3a80c45d -> 3da1c5f8 b772c0de 3b633928", + "40b97050 40068930 c115ff48 b8155a08 379b0049 b77c989b 3889ba86 -> 3e851f34 b865cd5d 39e0dbda", + "be9052a8 bf612380 3f66f184 b8260019 36c696cf b75a70bf 3900c0de -> bdcb98e4 36316184 39c2fdf6", + "40a1f840 4118e724 c20e67ad 00000000 00000000 00000000 39e46dd5 -> bd9c9842 00000000 3a67c12a", + "c214b0c2 c22df86c 41b09cec 00000000 00000000 00000000 385b7177 -> 3e52b499 00000000 3a7f4c11", + "beb9cc8c 3f11c1c6 bf4b6453 b7c1bbf5 36d33e9d b79498e6 3935f30e -> bee2d810 b79cd727 3a39199b", + "3e846f84 3f160b22 3f17a332 00000000 00000000 00000000 38095bf3 -> 3e655111 00000000 3932067c", + "3eafdec8 3d9b49e0 bf2b3e3f 3a03a379 39ccb0ad 39e49c07 3762e499 -> 3f13f29f b6935c80 3905cf86", + "40d20100 4233ed7c bebfc980 3712ed16 b6621752 b71a3977 393019c5 -> beb4bb2f b7cf0e34 3a625154", + "bf071a40 c2347826 406e4650 b8520c30 b91912f8 38cc1337 3a4f9ae0 -> beee008a b92a82de 3b2ef979", + "c1e3c92a 42060632 41f41bf4 b72b16b7 b7fe537d b82e942c 3794c6ed -> 3f41bc50 38d6a88c 3a51ba39", + "bf0d589c bf382218 3e48e270 b72eed10 b6f51ce3 37457258 3a5a92dd -> beb7f6c4 38411231 3b7b10d8", + "4153b794 c0f54810 c19da49c b73318e7 369cb2b9 b79f215a 3884f3c8 -> bf2a0286 37b6dd68 39fa45dc", + "420f1f04 41f5a054 4246760a 00000000 00000000 00000000 3667f7bc -> bdaa055c 00000000 3a790b5f", + "bf35ec26 bf56291c 3f615906 b9a912c8 391c595e 3a4c441d 3a302615 -> 3f49d560 3ad953d2 3ae67df2", + "c09da300 421f3c5a 4177e530 00000000 00000000 00000000 368f2aeb -> 3d78a56b 00000000 3a099c5c", + "41e005fc 41aa0c3c 41aee374 37b314ae b7bb159d b9543c48 366c357c -> 3e422c3d b9a00ae0 3a2026d8", + "3f720358 bf65ae71 3f500e82 b720a65e 36020531 b591f711 35bb088c -> bebf59ff b79c7779 38b294c9", + "bd5e5500 beaaacae 3f629e22 00000000 00000000 00000000 37d2ed4b -> bf0522b1 00000000 39297d9e", + "c1260454 4211dce4 c2032074 00000000 00000000 00000000 397d2536 -> 3ededdd1 00000000 3aa9795f", + "c20a0fb1 40ed7568 c23d32d3 b8693ba7 b808237c b8b6aafa 39eede20 -> 3d6ec4ef 396cb143 3b044ae2", + "c085cc30 419c85b0 41377c44 b9bbbf53 37b2f61d b97dd1d2 37ad740b -> bc6039a6 ba49b4fe 39c6b153", + "c208c553 c1a2a407 41f896fc 364eaf37 3604f3f4 b605e89e 35d9fe49 -> be2a71d2 b6b0757a 3a3bb647", + "411d2754 c2282b0b 420075d4 39b29abe b91730e0 b8c65b50 36d09152 -> 3f162e3a 39486164 3a3e3a81", + "c2130a79 c1505028 c23d2531 38266946 b7e07f60 b6f767f7 36c23c6d -> 3db69226 b6d4225c 3a54738b", + "3e9e3848 bed38654 3ea8087c b7eb82e7 38200e75 37eb7d1c 3811bf09 -> 3e3d692c b895fe51 390c52e6", + "bf5ffc7a 3f7bc398 3e5d3a28 34770c17 b4d1b1e5 35a1bb36 358e688f -> bed267c8 35168803 38a90a64", + "bf3a8c2e be9a15c6 3e69fc80 b7b33f0d 37a797e3 b785f8bc 3859731c -> be1476f0 38917912 394ae4c3", + "bf0365f0 3f06df42 3f67b238 00000000 00000000 00000000 38e03a4c -> be0422e8 00000000 39bcf5cc", + "c107396c c16e6ee0 c17d71f8 00000000 00000000 00000000 38552a8e -> be8662eb 00000000 3a2107d5", + "be9cb308 3e85cb10 bf7b2b7e 00000000 00000000 00000000 394a4746 -> be86b896 00000000 3a0b73f0", + "41b94ca8 beb1b900 c14c1150 35f2b738 350a7fe3 37064752 38e4a6ed -> bd865874 b758f515 3a0fd2e0", + "c1b13687 c0a5a400 410dbc90 b6b921c2 36b8e729 b5a5173f 35aff3cd -> 3e54d044 b76caee8 39b24eec", + "4217975a c1ba9fea 42393fde 364d3082 36f764da b6ad7434 35889b10 -> bda6bdbb 3746212d 3a66c1fd", + "be925392 bf65e129 bf72707e 3926698a b9801f74 b952b9a3 368f72c7 -> be8bf82d ba1b3472 38beab27", + "c0635e70 c14dcfbc 4148f85c 00000000 00000000 00000000 35dd75e3 -> 3e1552b5 80000000 39959f44", + "bdcd85b8 bebfab4c 3f1a0ab0 b6c05d82 369bb8ef b7138756 387bd9ba -> 3e6fc248 37a85ac9 396807d0", + "4055caf0 420b92f0 419efbf0 b894be03 b82e709b b8bd57eb 3a2dbded -> 3d7fa498 390f95a8 3b15eb26", + "c0fa64f0 41e8a9bc c000c190 382a4e0f 36a387c1 b84de54d 3a3215f2 -> 3e17d679 b8d9c22a 3af832c0", + "3e907fe4 3f30bda6 bdc897a0 36a51cfd 38b55f65 36cc74de 39322c9e -> be706181 b7ecc166 3a140c1b", + "3f662a2e 3eb15cd4 bf17138b 3703e63e b81d25bf b88a3e49 35fe6c76 -> be7b142a 370cccfd 38a215ce", + "c22c6cfe 422c01de c20102df b8008f03 3933fad2 39bc7130 3814535d -> be0a50bf b8cc0bc8 3a942f92", + "3e78e9a0 ba320400 be39db1c 00000000 00000000 00000000 399b383e -> 3f170b06 00000000 3a4b8bd3", + "be5115cc 3f4b521c bf5ff324 369faa82 3601f4f7 36bc1bfb 36e4d6ce -> 3ec89075 b5d920f4 38c39347", + "3e2fec30 bf29924a be5d0d48 b9e46737 b9201758 38193ba4 37adaa63 -> bee241f9 b6a84ec0 38fdf19f", + "3eabc018 3e591600 beae116a b58ae8c8 34b8b0e1 b558304f 359fc6e3 -> 3e3dbda8 363a692c 389726e1", + "c1bcd5e2 c2181d88 bfa2c4a0 386839ec b80d9f56 37150ddb 365bb1ff -> bd4a07a7 b963a8e8 3a108b91", + "423f2358 42198438 40d6b9b0 ba515e5c 39a0fec4 b843605b 370e421d -> be07524e 3ae307fc 3a545578", + "42442bc4 40047ea0 416a77f0 00000000 00000000 00000000 359a9e31 -> be6527f2 00000000 3a13aadb", + "3e096b40 bf18f5b2 bd98e2c0 00000000 00000000 00000000 381ee26e -> bebaca3f 00000000 392c8f6c", + "beed1c7a 3f27f5ba bcfc7860 3607f25f 34e782fb 35c9fb80 3a005e1e -> 3f1a1254 3623632d 3ae75fbb", + "3ede1284 bf72b8f1 3eeed8ec b7285989 361c30e6 36d27bc2 366d6f8a -> 3e6ea6ad 37a14c3c 38b53add", + "41bbafd8 42120b4e c081c068 b42ec4c6 b54c39b5 36078a7e 38f0dd17 -> bec2ad26 b592aa58 3a28202e", + "c20ef158 42325c5e 421aa3f6 00000000 00000000 00000000 38931e2c -> 3d67c8d8 00000000 3a8c9787", + "bf05e71c 3e5af218 3f77191a b5313775 b5b81ddd b585513e 39873afd -> 3dfca400 36144135 3a2c5dd2", + "be76e3c4 bf06e2fc 3f018ab4 b5fc2761 b7101bd5 b7259d67 365e7ab3 -> be45b561 b7d130bc 38abbe72", + "c1523fe8 41c111d8 4245352c 3820f0f5 3690661c b71e7064 394990e3 -> 3e6e025c b795c530 3a85d8d5", + "bf38a988 3ea770bc bf29aec0 b6046e94 b6a06e4b b5f60232 398cb975 -> 3ea4592e 37141908 3ada3dda", + "3e502098 be821bd4 3f60fb76 3915e8c5 37e9782b b82b0a63 3a3a4308 -> be474176 b8cadc02 3aa0b924", + "422137e6 3fa4a5c0 421e7df6 00000000 00000000 00000000 3758d26e -> bdb0433e 00000000 3a3d179c", + "41363870 418c8ab8 c1d7641e 354e49a5 35542aa5 b520f2f5 37e91740 -> 3f16355e b655cfb4 3a14d087", + "bf5d343c bdbfd1d0 3e3bbd78 00000000 00000000 00000000 391c37e1 -> 3e14f3cd 00000000 3a1dea17", + "3e035ae8 3e65e800 3f1a79de 35aa776a b5cafff2 b554856a 3650c79d -> 3ca348d8 b505c934 389cd11d", + "3e292228 3ee22618 3f3c5ff4 3929218f 3990748f 3987d9aa 38535d5d -> bdbb7cc9 b8c3fb7c 391bedd9", + "bf77f631 3f7acfd2 3f2caca4 b6a7faef 3696fd38 b5bf38cc 38216ae6 -> 3ea91cd3 372ef9e0 394a9050", + "bf3aef12 3ee020d8 bebc5e48 00000000 00000000 00000000 3a37f4cf -> 3ecd6001 80000000 3b03f14c", + "c10f85bc c1484eb4 419c2c1c b4aad798 b56d8d7e 34c3139e 363a4566 -> 3e970871 b5b39dd4 39c68a55", + "bf2b8bb2 3f35a9a8 3f65b4fe 00000000 00000000 00000000 381c52bb -> bd1ae63c 00000000 39193c45", + "3ea822c0 bf74a083 3f0fb74c 394e06c4 39a13ead 39a7cc1d 3954e1f7 -> 3e87707a ba222e99 3a4065f6", + "410167c8 c1c1093b 410ca9fc b70860cf 37bb24a6 377ea164 383699bc -> bd1c1a10 b887b7de 3a0d8e39", + "bf25d255 bf4fdb43 bea59878 b7081d38 378a25df 3737b702 392ff411 -> 3e19831c b7977800 39c9cb8e", + "bead8206 be29e268 be720d98 b73ea051 b6b0816a b6950153 380d1c66 -> 3e2a8494 b7ec677b 3914519a", + "c0ea0fb8 41efe068 41a365d0 36099420 b6af1783 b6930cfd 36853437 -> be8de572 b7272324 3a064fd2", + "c2012c68 c05de050 40d052c0 38d1a9ea 39266e82 39da2387 36afe53f -> 3ec17651 39915561 39d6bb74", + "bf160490 3c181b00 bf314502 35a51676 b60958c5 3619fc40 398c2bb8 -> be3247a0 b5d4e0c4 3a217755", + "c0ceff28 c19d5e2b 423dbd36 00000000 00000000 00000000 362227e0 -> 3e99f27a 00000000 3a2496dd", + "c13058d4 c2453334 c16a1f68 b642d5a7 b6190007 b721b7ad 372ef509 -> 3d248017 b80dd421 3a2fd794" + ] + }, + { + "glsl": "vec3 cultmath_af_fbm(vec3, vec3, float, int, float, float)", + "tolerance": "ulp-bounded, reach 1e-6 to 1e-3", + "check": "the arguments are (cx, cy, cz, ax, ay, az, radius, ...) and the result is the form (x0, a, e). Enclosure: for eps in {-1, -0.5, 0, 0.5, 1} and d in {0, +-ex, +-ey, +-ez, (+-1, +-1, +-1) / sqrt(3)} (15 directions), form the point p = c + axis eps + radius d in double and round it to float32; the device's own reference value at p must lie in [x0 + a eps - e, x0 + a eps + e] with no tolerance, so a device whose gradient error exceeds the allowance fails. Tightness: with L = 7.9640074 and, for each octave (one for af_snoise), R = |axis| + radius, B = L R + 2^-14 + 2^-12 R + L 2^-20 (|c|_1 + R), the width |a| + e must be at most B + 2^-16 (1 + B). Report the least slack of each side, absolutely and as a fraction of e; only the two bounds fail the check. The reference value is cultmath_fbm_grad(p, octaves, lacunarity, gain).w, and B is the sum over octaves i of gain^i B_i, where B_i is B for the centre lacunarity^i c, the axis lacunarity^i axis and the radius lacunarity^i radius. These cases have reach |axis| + radius of 1e-6 to 1e-3, where the float32 allowance is most of e and the second order remainder is not; the enclosure above fails a device whose gradient error exceeds the allowance. Centre leg, for every cultmath_af_snoise and cultmath_af_fbm family of this fixture, the earlier ones included: the fixture's own x0 in the result (C#'s value at the centre) must lie in [x0 - e, x0 + e] of the GPU's form, with no tolerance, so a device whose noise differs from C#'s by more than its e fails.", + "cases": [ + "3f34327a be330120 3f3da1b8 3774dae1 b706c4b2 b84b80f6 36dcf110 00000004 40000000 3f000000 -> 3c5e7638 3909beed 397d038e", + "3e9594c8 bdc680d0 3e845a64 3415e1fb b5f5b7b4 b43c93e2 3a52b06c 00000004 40000000 3f000000 -> be5f5b71 b5158925 3c15f9ea", + "bc93b780 bb2fb800 3f2ed8b0 00000000 00000000 00000000 36694e2d 00000004 40000000 3f000000 -> 3f66201d 00000000 392e9ae4", + "3d863eb0 becaa00a 3d040d80 b90dd6fa 393b6325 39753445 3710aa74 00000004 40000000 3f000000 -> beb877c6 39df7941 3993bbf3", + "c19d9f93 c18c6396 3dd97200 b64b03f0 b56a8741 3633e5c5 3922a3ab 00000004 40000000 3f000000 -> 3f2c7106 36299b78 3b33a821", + "be7a5ec8 3f743008 be282e30 00000000 00000000 00000000 3a4ce666 00000004 40000000 3f000000 -> 3eb11f0e 00000000 3c2b6af7", + "c150b7fc c05bfb60 c1493628 392182bc 39e5f647 b9de781c 3a09a353 00000004 40000000 3f000000 -> 3e4503d7 3b226c9c 3bedb452", + "bf6464e8 3c2b6100 3ea52a00 33e53557 355b28ea b5a30c56 3a2995aa 00000004 40000000 3f000000 -> 3f58aef7 b5ea5135 3bad0d86", + "410c1850 423d0648 41a41564 00000000 00000000 00000000 3908b42d 00000004 40000000 3f000000 -> bf014dc1 00000000 3b965417", + "bdff2b60 bf0406c7 becda42a 35cf24bf b533cf68 35a37ef2 37b70f66 00000004 40000000 3f000000 -> 3eb9dae2 b6b26ccf 3a00bb2a", + "c06f95a0 42377004 421d47c4 b7012f36 3592b3fa b6dd5d35 373cc137 00000004 40000000 3f000000 -> 3e85ed76 371f6f46 3b42325c", + "408d7948 421ffe80 c11ffa20 396d3819 b89e7c4d b91241c1 38537c62 00000004 40000000 3f000000 -> bed52d26 3ae20321 3b16f920", + "41d06b34 c1a9f1dc 416d2a30 b6ad129d b7212019 3644e1cb 3a375b08 00000004 40000000 3f000000 -> 3ecc0274 b8235f0a 3c2a2aa5", + "3ececc64 3de336b0 be6dba50 00000000 00000000 00000000 3723d0c2 00000004 40000000 3f000000 -> 3eb91274 00000000 397bddd8", + "c2071164 c182d8e2 c213efff 00000000 00000000 00000000 39ea70f4 00000004 40000000 3f000000 -> beca3b2e 00000000 3bcd3054", + "41bd065c c1054b48 c2234971 37f67a85 379a153c 374f2b36 35f54979 00000004 40000000 3f000000 -> 3d165d2a 38a2e227 3b19ef80", + "3d9ccbe0 bf66c09a 3ebfa574 00000000 00000000 00000000 370f28a3 00000004 40000000 3f000000 -> 3f1aecc4 00000000 3982ea94", + "bea831ca 3f6ab10a 3f5e5a38 ba0d96e7 3a23dcea 39da5a1a 3814335c 00000004 40000000 3f000000 -> 3f3cda9e bb10d2e4 3a676e83", + "c1c3a880 41f4a380 c1effc06 37721df0 367d7962 358e675c 383d06e9 00000004 40000000 3f000000 -> bf15b177 b76deea6 3b53748d", + "42095436 41b5a25c c1e01948 38e7caac b824d694 38954c7a 35972458 00000004 40000000 3f000000 -> 3df85f0b b95e142f 3b3227dc", + "c11a8fcc c20a0c0a 41ecb8d0 00000000 00000000 00000000 3586dcbb 00000004 40000000 3f000000 -> 3e4f4b3a 00000000 3b1b737d", + "c225ec12 c20de114 4240668a 00000000 00000000 00000000 39a253c3 00000004 40000000 3f000000 -> bf2ef7d7 00000000 3bd65bef", + "c23f569f 40510720 c084f958 b9d1b4e1 ba3dab5a b9e495a0 3829dc2e 00000004 40000000 3f000000 -> bf0d0d76 3af367c9 3b2843cb", + "4145eec0 c22877e5 c21a1738 3985edae ba085a54 ba03a84c 3a7f897e 00000004 40000000 3f000000 -> 3dfd2569 bb1d9d5e 3c40f4ef", + "3f716e94 bf231891 3f4fe75a 00000000 00000000 00000000 358fb6ac 00000004 40000000 3f000000 -> beb3237b 00000000 394e1096", + "3f514f24 3cc26e80 bd981660 b8d82cb8 b885aed7 b8eebcf7 390903ac 00000004 40000000 3f000000 -> 3f3f2547 3a3af2a6 3acf7db7", + "bd9dc4e0 3f3cfe4a bf4a8123 b4ba22e6 b5ebc07d 3594eb62 382481b3 00000004 40000000 3f000000 -> 3e01d8e7 b6ad1ebb 39eadd24", + "bf523222 be5d350c be08aa44 00000000 00000000 00000000 3613b968 00000004 40000000 3f000000 -> beb68223 00000000 39337cae", + "c21be42c 423687e4 c21366a7 36551035 b66f2684 370a0a4a 36d7203f 00000004 40000000 3f000000 -> be5bdf57 b87d0c0c 3b7fc1e8", + "3d600720 bf2a2ee2 3f4519f2 00000000 00000000 00000000 38e21d4c 00000004 40000000 3f000000 -> 3d83969a 00000000 3a8ea87e", + "42215390 c2337bf7 40a930d8 00000000 00000000 00000000 39c35ac9 00000004 40000000 3f000000 -> 3eeb5095 00000000 3bd96845", + "bd85e0a8 3f639ee2 be70535c 36b3354c b785cda5 380335bb 35e6fef9 00000004 40000000 3f000000 -> bf80f8b4 b90f092c 3938f4b5", + "c1c4d1d5 c12e243c c18472ba 34cd5fa9 35ac5d88 b5cf627a 35b23677 00000004 40000000 3f000000 -> bee1e211 3619a83d 3adffc60", + "bf2071e1 3e66ba10 ba430000 b8918e3a b81b4882 b8f1de4f 37f54e42 00000004 40000000 3f000000 -> bf370b6e 38a85e98 39d86cae", + "3fe5fe60 4234e8d2 c2070f7e b73232b8 b99eaa64 b82c1e97 397353e0 00000004 40000000 3f000000 -> 3f09468d 39bfed9f 3baf6fdd", + "be2451e0 3f011b78 3edc8afc 00000000 00000000 00000000 3a105c24 00000004 40000000 3f000000 -> be28a946 00000000 3ba4487a", + "4209d296 c1d5e556 41d4925c 00000000 00000000 00000000 3a75c916 00000004 40000000 3f000000 -> 3f602435 00000000 3c4bb417", + "c217a314 c228861b c1698070 b577050e 368d0794 35a905bb 36c10fcf 00000004 40000000 3f000000 -> 3ee068d2 3738920a 3b47d6ec", + "c23cbde4 419d4b7c 42159fd2 b70d6f02 370a2255 376dc7c3 378c27e7 00000004 40000000 3f000000 -> bf20135f b8886e3c 3b643777", + "c193f598 3f13fd40 c16231c4 390795f0 b8393bc0 38947e38 380bce49 00000004 40000000 3f000000 -> 3eb49fb1 3a877674 3abd2808", + "3f66044a bdca91e8 be5e9a2c 00000000 00000000 00000000 39a38e8a 00000004 40000000 3f000000 -> be1ad0cc 00000000 3b6e4d49", + "c1e395f6 4156f874 41c19604 b66e2d24 35899935 b6524aaf 391bd47c 00000004 40000000 3f000000 -> bdeebd14 b80aff3f 3b794847", + "c1befe77 41331818 c1bc0235 00000000 00000000 00000000 36e2eaf4 00000004 40000000 3f000000 -> 3f898542 00000000 3b013706", + "4150c7c8 41cebee0 c2124dd4 351c918f 359543d6 35a2b424 35a9a590 00000004 40000000 3f000000 -> 3e8301f7 35b318dc 3b1eaa9e", + "3ed69998 bddb6358 bf040aad b5c40026 3619b869 b46ee9fd 383a810a 00000004 40000000 3f000000 -> 3e2c42ff 35dfb117 3a124b7f", + "418fe5cc 41a13f10 423faed2 b976afc8 b9a52766 393bfca6 3608c0c3 00000004 40000000 3f000000 -> bca01ea2 3a832d8f 3b38f2fc", + "c065da00 c0e6a320 404117a0 362c225c 358eed60 3669a6a7 374ec7c3 00000004 40000000 3f000000 -> be0277a2 371f9874 3a22c11c", + "418d96e0 4181143c 4189bc94 35c0b512 35b2b813 360185a9 3910dace 00000004 40000000 3f000000 -> be66976c 377e46e6 3b536d06", + "c20f5c57 c21810ed 40424260 3697fda3 3746c652 370165fe 377a60e9 00000004 40000000 3f000000 -> 3ea75939 388fcbbe 3b273f02", + "bf14eb68 bf57a258 3f74858a b7a5d393 b819aaff 38927973 39447106 00000004 40000000 3f000000 -> 3efd3e97 38d4316e 3b329898", + "3f3dec9c befbce40 3f102862 3737bb02 b818f687 b81582f7 39e7f43d 00000004 40000000 3f000000 -> 3e9f7627 393e9a77 3b9ed411", + "c20e6ec8 40cce9e8 c205f730 3823e385 b75c09a0 380c6b78 3a2ee242 00000004 40000000 3f000000 -> 3e179330 b8de69ea 3c26e277", + "3f3511b0 3db3dac0 3f265f78 b91f9b64 3817a3aa 388df655 359f0e30 00000004 40000000 3f000000 -> 3e621513 ba1fa011 393fe580", + "3f56a6ac be9a05c0 be639760 00000000 00000000 00000000 386e79f7 00000004 40000000 3f000000 -> bedfb649 00000000 3a577f8c", + "bea59ad2 bee46b28 bec1fd02 355cdb93 b52215a3 3297d5c8 37b69540 00000004 40000000 3f000000 -> 3f31858e 357d2929 39c705a5", + "3f53d77e beadaac6 3f6db504 00000000 00000000 00000000 376e322c 00000004 40000000 3f000000 -> bec64cc0 00000000 399a6c91", + "419c3fcc 4212912a 41ff0730 b42f20dc b598134c b54e006a 37296dc3 00000004 40000000 3f000000 -> 3eab18c9 33e7f5c0 3b3ead8f", + "40992a80 c19e8b3b c045da20 b55f67dc b581452f b5968801 358bdf6f 00000004 40000000 3f000000 -> bf5b7096 36f7e17c 3a7eb51e", + "bef12dde bed0f58a 3f7bb0ec b78b6a62 374134fc b6ce9f48 38ed08c4 00000004 40000000 3f000000 -> bee98d9c 38540eca 3adf37a4", + "41dfaf6c 4242a89e c1f32879 3641048e 34e0bd5d b6adc411 37c6f3e8 00000004 40000000 3f000000 -> bf169582 b6f14f60 3b6a3fa5", + "c21be13e c1bcb33d c1976ec3 38332936 b8a54bc4 3718c9a3 37d788b1 00000004 40000000 3f000000 -> bf12dc10 39c81aef 3b39ef82", + "beed6928 3f46878e bf6fa323 b6222fa9 b51a3e0c 360fa338 36fbb2aa 00000004 40000000 3f000000 -> 3ea93587 b3cf7520 3986391a", + "3eb84a8c 3ee65b30 be8d4572 36e9e9a7 3897a09e b9f41d1e 363094bd 00000004 40000000 3f000000 -> be7679c6 ba1f2766 398d0193", + "3f4dbfcc 3f1bd4b6 3e7200b8 3458463e b7235561 371e9e77 3a713649 00000004 40000000 3f000000 -> 3e254c45 35d69708 3c0439a0", + "bed8fc5c 3eb477e8 3f718752 b73d5e79 3732e5dc 374f95a7 3805c730 00000004 40000000 3f000000 -> be1c02d6 b64aac70 3a0e1c15", + "416c3150 c233e073 423a7918 365d112d b6286a83 3713a713 360da2d1 00000004 40000000 3f000000 -> bf380b26 b71f1b0a 3b5d248a", + "c21f9a0a 41647ab0 3f93afc0 3728acff b57beff2 b6c86d4d 36c0c4fb 00000004 40000000 3f000000 -> be6aeb55 38a27f7e 3af6c4ff", + "c1095ea4 be8b1d00 c1fcd481 b702c1d9 b7b352c2 37370026 39ffecb3 00000004 40000000 3f000000 -> 3de1e4e9 3903b932 3bca02d4", + "3e5a2c30 3eb14df8 be619bd0 b9155479 38d42515 38cc136c 359f8485 00000004 40000000 3f000000 -> bd3e752c 3a4a0ac2 392f624d", + "c220b1ce 41797550 c1b876f1 35ce4893 3583b5ff b617f858 358cc3fe 00000004 40000000 3f000000 -> be62150f b6d8a542 3b252f49", + "3e7a66a0 3e492d30 bf241599 379739f9 b79b2d88 37a294ef 382594a6 00000004 40000000 3f000000 -> 3f516f1c 38ec20f3 39ed7adc", + "3e874ad4 be059b08 be08ef74 b62e3c79 b7b1f3f8 b89851df 398f3799 00000004 40000000 3f000000 -> 3ee3fe36 b90e7436 3b83b374", + "4148fea8 3e857a80 c186d56c 00000000 00000000 00000000 3a616b4d 00000004 40000000 3f000000 -> be87056e 00000000 3c13807a", + "bf0b5572 bed33e2c 3ef13bf4 36d5a1e2 35f8d14a b5477d2b 3a77adb5 00000004 40000000 3f000000 -> be81b1c3 368eb8e2 3c244ce9", + "bf232ac0 423a0134 c2363e26 374063ac b682bd5c b6d242d6 37fc8729 00000004 40000000 3f000000 -> bd272e15 b88cedf4 3b4f9747", + "bf0df084 3f0cf8f4 be4eac80 b9eca763 3928717f ba2d41cb 3a7ea28d 00000004 40000000 3f000000 -> 3e8cafb0 bbb4c5d1 3c4c369e", + "c1ba94ec c2336e7a c0aaa1d0 00000000 00000000 00000000 3a1972af 00000004 40000000 3f000000 -> bf1cb1db 00000000 3c08c575", + "3f08efe0 3f37796c 3f1d8f84 00000000 00000000 00000000 3a5b8ecb 00000004 40000000 3f000000 -> bd20ade1 00000000 3c2d72d2", + "3e6b7800 bfdb42a0 422db02a 357d5ef9 36b0ace0 b6ad67c3 36d54b47 00000004 40000000 3f000000 -> 3f85a57d 3729211f 3acb5eff", + "3e8a7958 bebdcc7e 3d913c90 36e7fbc3 b596d247 b6807d6d 36c528b7 00000004 40000000 3f000000 -> bdaffb50 3644e5c8 393147b1", + "c1b0d231 4214d97a 41c13888 35066c98 3753a56e 37461679 3853b226 00000004 40000000 3f000000 -> bed16622 38a1688e 3b645b7a", + "40e19628 c081b288 419754e0 00000000 00000000 00000000 36dd3d40 00000004 40000000 3f000000 -> 3e0c974e 00000000 3a955ad3", + "be89ba6a bf4a8d21 3f69a2fa 36d1f6a4 364d7f85 36b01e7c 3794af6e 00000004 40000000 3f000000 -> 3e2fae58 3842180e 39b8d2db", + "40969e40 c0405710 418e6960 36ff0446 353a1f63 37e5a063 39e3e8a9 00000004 40000000 3f000000 -> 3f1bcfd6 b7be6902 3b834ad2", + "3ef722f4 bc82d280 3f0a0ad8 b9d87a9e 38fc9120 394b2032 376c000b 00000004 40000000 3f000000 -> be14263f baa3122c 39ba01e7", + "4148c6bc c0394060 c2003448 b9a59140 b978eac2 b8efdaff 385780c7 00000004 40000000 3f000000 -> 3e67316e 38797528 3b076217", + "bf75a754 be137f5c bf72ae7b b5e7770c b54caa10 369f4c41 398353dd 00000004 40000000 3f000000 -> 3e096f03 354b5040 3b322829", + "4191eff8 c1ec4aa6 c1fbfea5 b6d5298d 36f4dd70 b658a583 374983d6 00000004 40000000 3f000000 -> 3ec2196e 37d0fc81 3b2efbf4", + "42410138 42384688 422c5384 00000000 00000000 00000000 380ac47f 00000004 40000000 3f000000 -> 3f2bfe90 00000000 3b9a00b9", + "c1a7a252 419faf54 c1bf031d b68b76af 36a7b0fa 36ab3efa 388dc0df 00000004 40000000 3f000000 -> be779d18 b746f16c 3b2fa0ab", + "c0599540 c13ab534 c1ebbce0 36d60c20 b4615afa b6d86141 37fd56c1 00000004 40000000 3f000000 -> 3f03f077 b7f92e65 3ae929f7", + "c1ab2967 406a6ad0 41f2d490 00000000 00000000 00000000 39b05644 00000004 40000000 3f000000 -> 3f450922 00000000 3b90e590", + "3f937560 c1a89c93 4111d7ac 00000000 00000000 00000000 38021002 00000004 40000000 3f000000 -> bee9cfb0 00000000 3ab2bb72", + "3f427064 bea51598 bf280012 00000000 00000000 00000000 3a5c5846 00000004 40000000 3f000000 -> 3e365e53 00000000 3bcce6ec", + "422057c8 41dd67b8 c1a7b400 ba127a0e 39e2b97c b8e818d9 3625b90b 00000004 40000000 3f000000 -> bda7125f bb45adf6 3b4814a8", + "be7bc658 bc098900 3f3cf508 38a81cf7 b90cf016 38c54795 39ffb9d3 00000004 40000000 3f000000 -> 3f49f3d9 ba22e0a1 3bde084d", + "40b867b8 c20a3b6d c1295e30 38806351 377179b8 38bd3016 3807ec2b 00000004 40000000 3f000000 -> be712daf 38c00d06 3afc45ab", + "be5f6da8 3f3cf0ba 3cc23a80 b65099a4 370a6844 b76c2514 380819e4 00000004 40000000 3f000000 -> 3e9ee5ea 37a1e69e 3a18a99a", + "3f142b6a 3f48154a 3f4131e6 39959f96 b992e4a3 b960bb55 35af16a2 00000004 40000000 3f000000 -> be54aa7b bacc1804 3990c58c", + "3dc7f660 be27d824 bf38e58e 38a26e32 386a07a7 b7def4e2 3651571d 00000004 40000000 3f000000 -> 3e3ba09d b7ca7b00 3941c259", + "c235e0b6 41b5a584 c0a6a298 b52da694 336e1180 365feee6 367ed96b 00000004 40000000 3f000000 -> bef78bbe 36b38d12 3b1c34be", + "423615f4 c13ae4f4 c1c7ec62 b8904027 3855e49c b88ee431 39104491 00000004 40000000 3f000000 -> 3e9f5b91 3a11c47b 3b87c2f0", + "be8f5f96 3f5c7784 3e915908 b7aef875 3862f42a 37dced1d 39b9d08c 00000004 40000000 3f000000 -> 3df346c0 b83ee280 3b5f43e3", + "beaa03e6 bd8ecd10 bf040d94 00000000 00000000 00000000 3a007214 00000004 40000000 3f000000 -> be041893 00000000 3b4b05c3", + "c0b6d858 4134d094 c1996509 b52915ad b553c221 34a775e1 39ac3df4 00000004 40000000 3f000000 -> bee21217 36a0d390 3bc13098", + "c204d206 c1fc214b 4158d8fc 00000000 00000000 00000000 37d6a836 00000004 40000000 3f000000 -> 3e80bdb7 00000000 3b366595", + "3f67ac32 3dba31c0 bf414d32 00000000 00000000 00000000 35f1a2b8 00000004 40000000 3f000000 -> bf508b91 00000000 3947920c", + "3f64a8d6 be088f54 3f0e4768 b7a2f6a9 36201d8c 37b976d9 3631de8e 00000004 40000000 3f000000 -> 3f5bc4bc 37c6c3c4 39494c2a", + "c231137a c1e5e564 c1dcd13e b6cd180f b718967d 34c7f167 36ade128 00000004 40000000 3f000000 -> be5360a8 36a2ef96 3b52cfc6", + "3f3dc17e bf322078 3f1c1d36 3883ce8a 37c59a6c b8284bb0 3810bf78 00000004 40000000 3f000000 -> be111927 b92ab8c4 3a0cda1d", + "3f4c3398 3f1064f2 3f7455fc 3879d0e8 390cb72a 383d856e 38efb936 00000004 40000000 3f000000 -> 3e52dc6c 39ffbfa0 3ab330e6", + "c196dcf4 c171f460 c23e3111 b92c6590 b80ebdd2 3950ddc4 37259ac3 00000004 40000000 3f000000 -> 3f198afe ba71e74a 3b312893", + "bf6cbc65 3f0d3546 3f40c9de 367bfefe 3649c213 35aff100 37954481 00000004 40000000 3f000000 -> 3de824a6 b6edd21f 399ad08f", + "beb9bfc4 bf5e7983 3f747152 b785930a b7b08963 b7cfdda1 3a80fa3f 00000004 40000000 3f000000 -> be9bfaad b83a2a42 3c17872a", + "4191fb90 41df374c 418081d8 00000000 00000000 00000000 371bbb7d 00000004 40000000 3f000000 -> bf166ef6 00000000 3b0a72df", + "bf3eae76 3f3b45f4 be286020 39954258 b9093ce8 b985ed35 38c6e631 00000004 40000000 3f000000 -> 3f06db46 b9805e5a 3ab64283", + "42223128 4026e240 4206a0e2 b5809c48 b4d7ce2b b53eb980 39bd6b75 00000004 40000000 3f000000 -> bf75367a b525c6d9 3be1da0c", + "c14dd67c 41001060 412eaab4 b96c190b b84e6919 3968647d 3a48a0d0 00000004 40000000 3f000000 -> bf6a8e7d 3a411014 3c16c5b4", + "c219ef4d 41f7ad70 c2149064 39256891 39821fe3 399bf60a 3a20f2e7 00000004 40000000 3f000000 -> 3d239b30 bac4e44e 3c245510", + "3f081f38 bf486da1 3f122a64 00000000 00000000 00000000 3757d92f 00000004 40000000 3f000000 -> 3d8250b8 00000000 3993b818", + "3ebb6440 bf3f9bde bf000162 b43f74e6 353878d2 b5cef6b4 363dc6a5 00000004 40000000 3f000000 -> bd639822 36dbd10b 39509de0", + "bef93d80 3e063dc0 be940722 36647601 b5b3dd11 3781bbe4 358db7a1 00000004 40000000 3f000000 -> 3e7b7e28 b514fa80 391f2cf2", + "c12405dc bf7153c0 c1ec052a 38fbfed6 b8c55a22 ba1e29c7 37e72ac6 00000004 40000000 3f000000 -> be44003b 3b2d5198 3af94f3f", + "41eba5f4 c11c708c bfe0eac0 38a9e145 38786d67 37e81958 39789beb 00000004 40000000 3f000000 -> be16637a 3a3df8f8 3b94f909", + "41186f68 c233355e c1f39762 00000000 00000000 00000000 380a497e 00000004 40000000 3f000000 -> be80094f 00000000 3b3fa8e2", + "3feb5ac0 415c67f4 c186c294 b69774ca b5e8c9ec b6986668 3710a248 00000004 40000000 3f000000 -> be048d6c 37d75534 3a9a398b", + "422850d0 41d4e258 41a7f1ac 00000000 00000000 00000000 381be1a9 00000004 40000000 3f000000 -> 3dd59176 00000000 3b6576c5", + "411a73a8 421b11dc 41ca6144 b9cd20a7 39b9a56d 38290019 39e4712c 00000004 40000000 3f000000 -> 3f2e97aa ba6053f1 3bca7260", + "412e02e8 40002510 3d7a5800 b649a211 b6cbde50 36eb11b9 3a16adfb 00000004 40000000 3f000000 -> becbf2fd 372959fc 3baf497e", + "411fac00 c20070fd c22f3fa2 b7d9c997 b7d5dd47 b7f4d333 39494313 00000004 40000000 3f000000 -> 3d9db5fd 388f7320 3b9effcd", + "3f6cd2b0 3f069a92 3f6dcf08 b78d6fac b89881ce b854072a 36536c14 00000004 40000000 3f000000 -> 3d59c98a 39650bef 396dfa57", + "bf4f7394 be1c5348 be20e088 3a062979 39addccc 3a04b32d 3a010339 00000004 40000000 3f000000 -> bef19934 ba7bc30f 3bba4f1b", + "3f139704 be7528a0 bf483de6 00000000 00000000 00000000 38eb1042 00000004 40000000 3f000000 -> bd87374a 00000000 3a9278ba", + "4202517c c17a6718 4171f440 35075a87 359c1a89 b5629205 36dc8c5c 00000004 40000000 3f000000 -> 3f44e95b b63ef035 3b0a9871", + "3de38b00 bf1f949f 3f47b5fe 36668604 b636d510 b6b0f73d 375a2cb1 00000004 40000000 3f000000 -> 3e2962b4 36b36aa8 39981c1f", + "41cdf5b8 c2219208 41550a40 b8eb9b86 ba08566d 399069ab 35a5c91a 00000004 40000000 3f000000 -> bdf13c9e baf759b2 3b305541", + "3e9db0ec 3f50864e 3e843498 00000000 00000000 00000000 37ea524b 00000004 40000000 3f000000 -> 3f492ae1 00000000 3a064886", + "c247d29e c1a6cb7d 422c0b6e 00000000 00000000 00000000 36e321b4 00000004 40000000 3f000000 -> 3f5058f4 00000000 3b70ad66", + "419a9378 422c2fe0 c2169a14 b775d912 376df81e b75ec6b5 36960019 00000004 40000000 3f000000 -> 3e110264 38a5c3cb 3b51afcf", + "3ebe4b48 3c675300 3ea407c8 378b4383 b7f6dfa2 b6a06742 37216e97 00000004 40000000 3f000000 -> 3cf24616 3842f5c2 39883b74", + "c23bdfa1 41984444 c1f6824a 37aa8f5e 38fda980 35eef92e 371f31bf 00000004 40000000 3f000000 -> 3f25be5e b9ec1769 3b4f2e26", + "be9b0126 bef27b0a 3f4c6ed2 b9134376 39999f73 b916a9a0 361db112 00000004 40000000 3f000000 -> bf07ea37 b919405a 397ece98", + "3f1e9dec 3e0c47d8 be89c218 b8d98fe7 b913986e b83f2807 37115b8d 00000004 40000000 3f000000 -> 3ea7949d 3a0f7266 398c2712", + "3f34434e be25b720 3f0f90e8 00000000 00000000 00000000 37243865 00000004 40000000 3f000000 -> 3f00d28d 00000000 39868090", + "41bee20c c01e9ba0 c23dafc2 00000000 00000000 00000000 378993f6 00000004 40000000 3f000000 -> 3da53402 00000000 3b2294b0", + "c211761c c1785c68 bfec5c60 34c342bf b5566d92 b51cd554 391e876a 00000004 40000000 3f000000 -> 3e3523b4 b670e7e3 3b6f81a8", + "be66b480 3e21c4d8 be35e5f0 b782342a b74438a4 b6d99179 37de9eac 00000004 40000000 3f000000 -> 3eeaef8a b7d36886 39c05ab1", + "be6e3f6c bdc2f0c0 bf75cbae b5043fe8 37250907 b7503ed7 3a4c89fd 00000004 40000000 3f000000 -> 3d16389c 38002c80 3b92af1a", + "3f2618b2 3f4c9e00 be9fef06 b80b41b9 b975eebb b8a1d5ae 38126081 00000004 40000000 3f000000 -> 3ea654f2 b8641ad0 3a2aa8e8", + "c0ee8ea8 c19c1314 c20d4508 b9ac602f b95bd3ed 38d5089b 38e2d4a9 00000004 40000000 3f000000 -> 3f770c57 3a1b8c1c 3b5d8e00", + "c234a5da 410dca38 41c786e0 b8269ad5 37842177 b77ba477 3a2cfec8 00000004 40000000 3f000000 -> 3e6455be b8caa9e6 3c31e579", + "bf1b53ea 3f5a92c2 bf69aef7 355b9e13 b32317c3 b55b9cb2 35a4bf70 00000004 40000000 3f000000 -> be02add9 36824ebf 394da6cb", + "c23db4ef 414cd848 42292856 b8888e1d b926a650 b899d4c5 3a01694c 00000004 40000000 3f000000 -> bea1b46f 3a8e3b05 3c053fdf", + "c1f10183 c1f1671f 41b18df0 38a298fd b863e5aa b896d89e 3741529e 00000004 40000000 3f000000 -> beaaf135 b94587cc 3b3368f6", + "3ec88d78 3f14a342 3f37cbee 371ead77 b30d049a b6b55629 3802d1b3 00000004 40000000 3f000000 -> beaa51f6 b7bb4ff9 3a06b6dd", + "3f6eb6fa 3e7ce7b8 3f2d701e b71f11dd b6a34f04 3729e667 371e0723 00000004 40000000 3f000000 -> bee29caa b8ae05c0 3992cc2d", + "be791f50 3e0ac070 3e9de130 362936b4 37a0aa23 b73e3a60 3a1b2d22 00000004 40000000 3f000000 -> bf187d3f b90daed8 3be0e804", + "bea66d46 3db1f440 3eab5a10 3574a453 b61564d8 3617ebc3 37b268da 00000004 40000000 3f000000 -> bc214646 3689f612 39c1c453", + "3f2287ae 3f6b7356 bef6b104 b70cb1b1 36651b33 b6d5df30 36baf607 00000004 40000000 3f000000 -> 3f0ec4e2 b81c4f1c 3987e885", + "40e03430 41d0e408 c154b580 b582241a b639f061 b635ed0d 366fb678 00000004 40000000 3f000000 -> 3dd98a45 b7848c5d 3acae0a7", + "bed35c9c 3f1f5abe be2084c0 b7d3103e b6de1f62 38240b65 394f99ba 00000004 40000000 3f000000 -> 3f401dac b7b2d06c 3b186fd5", + "41721550 bf39ae00 42329e32 b6e76d27 b5d18c21 b675f679 3733ba43 00000004 40000000 3f000000 -> beaae468 b6a671a0 3b080189", + "3e8e3628 3f36b7f4 bf18e050 36b07d45 356ae656 b678df77 3a0e5a09 00000004 40000000 3f000000 -> 3e8d3006 37e4293e 3baeb30e", + "c220480e 40db4188 4243783a 350d7e1e b6f798b7 351966fe 36398f2e 00000004 40000000 3f000000 -> bf0ab4a3 b688a510 3b4874b0", + "3e73eb08 3f1abbcc 3e290c30 00000000 00000000 00000000 3988a97e 00000004 40000000 3f000000 -> 3f1bd6f7 00000000 3b47bbd4", + "41fba7a0 42148020 c1c2c42a 360be14a 361303a0 361c6db5 36e8de8f 00000004 40000000 3f000000 -> 3e1ccfb6 b781dc6e 3b43fa43", + "412fb890 4235acda c244021f b6b069fe 3680e6a3 364aaf0a 358fef26 00000004 40000000 3f000000 -> be137b1e 368918b2 3b5a5afc", + "3ed08700 c0f56f68 4238367e 00000000 00000000 00000000 39e54208 00000004 40000000 3f000000 -> 3e87c341 00000000 3bbc9bd8", + "c20abc77 c09cf968 c14dfcc8 b9497f91 b9c3786e 3910b6d4 394a4a5f 00000004 40000000 3f000000 -> 3f1fab35 baad420d 3b78ef26", + "c242460c 4238198a 41809d90 357c005a 35afc3ac b59963e0 3781aa02 00000004 40000000 3f000000 -> be56d902 b6d815ca 3b70561c", + "bee11ffc 3d0b9e20 3e957358 b8c297de b865c867 b8d21e05 385bfbfc 00000004 40000000 3f000000 -> 3eb8d70e ba32572e 3a76af23", + "422449a2 c216e05c c22b8eae 372bc9e7 b6b05959 3797cfb3 364e0a2e 00000004 40000000 3f000000 -> bf1249d1 b7c9b4f6 3b7c54c2", + "bed4e02e bf3e4d68 3f3c9ed2 38dd5765 38f00c54 38a1404f 375a62be 00000004 40000000 3f000000 -> be736564 b9083e60 399572da", + "bf2393e2 3f39553c 3ef30d98 37481458 36e47ee0 377fff1e 38e6274a 00000004 40000000 3f000000 -> bedc16a6 37f3b0ec 3a917171", + "3f5db59e 3f610616 bec42da8 b895a2f2 398ab793 3989e123 386811b7 00000004 40000000 3f000000 -> 3f12693b b9f1b7c2 3a5b6e36", + "423cd10a 41ef3314 422e7720 b883574b b8dbc8ed 383bab14 36ce2c09 00000004 40000000 3f000000 -> be961e6a 392deec2 3b7cb1ad", + "418a1ee0 c13be004 c16e4850 b8e9c169 b9365813 b8392507 35cebce5 00000004 40000000 3f000000 -> bf8b03f0 3a8d3148 3ac38289", + "412210e0 c1379fa4 41d2edb0 00000000 00000000 00000000 389266bb 00000004 40000000 3f000000 -> 3e909095 00000000 3b102c10", + "41ffeab8 be59ac00 4095ea50 357274f9 35589d2a b588d5bd 392acece 00000004 40000000 3f000000 -> 3ed5aaf9 36656892 3b49c0d5", + "422a5378 421b7534 c2464c2e 364364d4 b6203483 b6026b8a 3709712a 00000004 40000000 3f000000 -> bdc9d08c 36f9ccc7 3b88e57d", + "3e3518b8 bde33f70 bf2e3296 3505ef81 b8055719 37cd8944 39076d9b 00000004 40000000 3f000000 -> 3ee96c76 b8938fa8 3ab418fe", + "bf6de812 3f0074b2 bf082782 b719bb28 b79fba1a b79c7f30 38dddd41 00000004 40000000 3f000000 -> 3edc47bb 38b23134 3a8fe565", + "bf10e469 bedc9aac bf3f2ea0 b7b69202 b445d49b 37830b41 35c9bacf 00000004 40000000 3f000000 -> bee5b836 b916385c 3945d88c", + "bf142af4 3ddfcb20 3f42f910 00000000 00000000 00000000 394daaa8 00000004 40000000 3f000000 -> 3ea652ff 00000000 3aee1050", + "c181844e c1ef1049 c1b54417 362fda3a 354537f6 b54e7a28 37375576 00000004 40000000 3f000000 -> 3e5d9855 b67070da 3b1839da", + "41775048 c22e0740 c1c45182 376daea1 36cd7bc1 3592fbcb 3727e590 00000004 40000000 3f000000 -> 3eef2cc0 b7a08a5a 3b37cff5", + "c191a98a c18793b8 c1ddcc4a 00000000 00000000 00000000 373413b6 00000004 40000000 3f000000 -> be7a33b8 00000000 3b0b7591", + "c01c8ae0 c1edd11f c14615fc 39f271e8 b9d84315 b9d4d1b3 398fbc8a 00000004 40000000 3f000000 -> 3b919eee 392695d0 3b88c316", + "bf14831f 3f7c4bc6 3f6190bc 39f2a8c3 3a08f623 b79bdfc5 39b04fb9 00000004 40000000 3f000000 -> 3e2d1d46 3a1d9137 3b71e57b", + "bf0ea593 bf0e30ce 3def9240 b7b5a98c b53e7f95 372ed160 35c79b16 00000004 40000000 3f000000 -> bf31c38d b88a0e36 3933719c", + "423f5e00 c1bca9ce c1813880 b9803171 b97cfbda 394c24cd 3709cc42 00000004 40000000 3f000000 -> 3f057674 3a95e14b 3b3f4d8a", + "421bea88 c1a191a1 c23e629c b8583435 38effbcd b8ff05bb 376af87a 00000004 40000000 3f000000 -> 3e74ecf3 385f4110 3b65fb68", + "420afc0c c1b432d9 c2053234 b99eb565 b943c488 38e4e19a 37c99a59 00000004 40000000 3f000000 -> 3f22b924 3ac7b7ec 3b51798d", + "c0c2c570 41abd938 421fa4bc 36b6acf3 36aa4526 35ebbd6f 37a415da 00000004 40000000 3f000000 -> 3eb8be7d b7ee78e1 3b19dff3", + "bf18ad93 3e70d598 3e929888 37e39359 381879fa b7d95c51 35ae8317 00000004 40000000 3f000000 -> 3ec345c8 b91b438c 392dc7de", + "c23cac06 42414f12 c228b536 b89f7d78 383f2398 b8bd07c9 38366a2e 00000004 40000000 3f000000 -> 3f0607c1 372a7dc0 3b9dc027", + "3d01b980 3f55bb10 be4224b0 b673bca8 b62e521f b558d490 358d6eb0 00000004 40000000 3f000000 -> bf88ba65 b7873c70 392ed8a5", + "3f463828 bf2d53ae bebb5fd2 b957dc31 b921fc01 389dd11c 399939d7 00000004 40000000 3f000000 -> bea112d4 ba2a6210 3b3c1b6f", + "c231ff08 c22b5ed0 41ff14e8 b627efdc b55009b1 3620efe5 38b488c9 00000004 40000000 3f000000 -> be1d7973 b6a12279 3b93ff42", + "420b712a 4235780c 41c6b030 b8b40bc7 b898c444 b8cbbfeb 3710c789 00000004 40000000 3f000000 -> bea628d6 b99afb59 3b602618", + "3d481480 3f7566da 3e054bd8 36b048b1 37b00686 371f8c64 385f9cfe 00000004 40000000 3f000000 -> beea8788 392523d5 3a485c8e", + "bf5b190d bed96500 3f41e4c0 374c1b03 b6030d49 b76bf288 384aee1e 00000004 40000000 3f000000 -> 3e7df1c4 37b78ac5 39f75317", + "3d9d48b0 bf11aff1 3e177d90 38bde962 395c280a b8308519 375f0c92 00000004 40000000 3f000000 -> 3ed31132 3988be59 39a42a24", + "bf770d83 3f50a056 bba62500 00000000 00000000 00000000 38bdb583 00000004 40000000 3f000000 -> 3f3bad12 00000000 3aabfa06", + "3f261800 c192de5a c130ea4c 38bde695 b8d2a46d 380d74ab 3687e988 00000004 40000000 3f000000 -> bcba75ce 39faafd1 3a8d28c8", + "bf599d02 be7835e0 3eb9517c b8b1f11f 38a3595c b8bf15f0 360848bc 00000004 40000000 3f000000 -> becb254e 39707e86 39403e43", + "c11778a8 4204d562 41fc6160 b746c900 38cabcb4 b8dfd754 3a0f806d 00000004 40000000 3f000000 -> bd34b5d5 ba49b778 3c0e97b5", + "41e8304c 419e2f80 41adec5c 35894c43 3530ff2a b591fe59 3983c5b6 00000004 40000000 3f000000 -> bec909eb 36a0b8c5 3ba1e272", + "412c2570 420fb23e 40433220 00000000 00000000 00000000 39c5466e 00000004 40000000 3f000000 -> be340cf4 00000000 3be001a8", + "c21cde3f 40e98188 4187ea94 00000000 00000000 00000000 39340858 00000004 40000000 3f000000 -> 3eb997e2 00000000 3b5e9177", + "bf57da78 bea0948e 3eae77c0 3584b6cb 397f2c71 b9ffb94d 3601cdbe 00000004 40000000 3f000000 -> bea9b05d bae6f95b 399ded1c", + "3f1a9a1a bf6c9825 3f0a9514 369a173d 374373e6 372dabbc 393fa3ef 00000004 40000000 3f000000 -> beeb8c03 37db203e 3b2361d3", + "4228e33c 41c2555c 41a11a34 b71476ef 370dbb5d 37606102 3955880e 00000004 40000000 3f000000 -> 3ead9f3c b89b33f3 3b9d5863", + "bf665f41 3ebc2ba0 be247ca8 00000000 00000000 00000000 389736bf 00000004 40000000 3f000000 -> bec37dc5 00000000 3ad22942", + "c21f8a3e c1bd4e00 c1af028a b8d8a177 38b45a55 b85b500c 35c75edd 00000004 40000000 3f000000 -> bf284978 39e3f3ed 3b33cad0", + "c1676090 bfefe300 c14b58f0 00000000 00000000 00000000 390ca00f 00000004 40000000 3f000000 -> 3eb6fcca 00000000 3b1343c1", + "c01fae60 417544d8 420d2d40 38c00663 b97e6228 b8ac386b 3a22f6fc 00000004 40000000 3f000000 -> 3e1a996c ba8959c1 3beb773a", + "bf370584 3e2e84b8 3f2cfbd2 00000000 00000000 00000000 389610f0 00000004 40000000 3f000000 -> 3f354951 00000000 3a51100d", + "3f040e46 bed9ede0 3f1dd900 b55c1086 b3e6ad61 b580e75b 37e51a9e 00000004 40000000 3f000000 -> bf02f954 36a94e78 3a0a86db", + "bcb76700 3f1e3388 bea9f47a b9427646 37f462ed 39012235 368dddea 00000004 40000000 3f000000 -> be99bdc2 395930fa 395fb8fe", + "bf2cfce6 bedd5cb0 3eedfe50 378d503e b5af5255 b6b8e1c3 39349fd2 00000004 40000000 3f000000 -> be7bf26a b8b2a4de 3aea18a6", + "3f437dd6 3f60d002 3f3faebc 35836c96 b5f3c7a9 b5015b8e 36356610 00000004 40000000 3f000000 -> 3f0b024b b68545f7 395d4cb8", + "41192298 41feebb0 420eaf78 38811c8b 37f352e5 b72b96d0 385881b8 00000004 40000000 3f000000 -> 3ede9b87 b8d90cd1 3b4419bf", + "3f1172f8 bf644bda 3f51a834 39894fc2 b8983c5b 3920ea29 390d595c 00000004 40000000 3f000000 -> beae05ee ba1a2217 3b1a5ca4", + "bf57ee9f 3e906340 bed82ae2 b8e1ba6f 37606486 38f52f2e 38801278 00000004 40000000 3f000000 -> 3f56e2c6 399ff76c 3a4520ee", + "bf23404c 3ec50b70 3e8f2758 00000000 00000000 00000000 365a2f59 00000004 40000000 3f000000 -> 3f2462fe 00000000 3944b54a", + "c0e93d60 c22b1379 c17dcb8c 3627d72c 35b11956 35ebb7b6 39fd9169 00000004 40000000 3f000000 -> 3e2768c0 b7948410 3be7838b", + "bf70d831 bf7473e0 bf7cc1b1 00000000 00000000 00000000 3824452b 00000004 40000000 3f000000 -> bebf5e98 00000000 3a393457", + "be4f3cd8 bc8e4d60 3f647e1c 3400e47c b5eff9f9 34827484 38a1ec3e 00000004 40000000 3f000000 -> 3ea8d853 b6db3b82 3a9f7ca4", + "bf7724d0 3e6192c0 be60f9b8 00000000 00000000 00000000 3792c3b1 00000004 40000000 3f000000 -> bd980765 00000000 39d7ae56", + "3eb97e10 bf0002d0 bf67f1e2 b4f29cd0 b6b2275a 36f4a323 397f155f 00000004 40000000 3f000000 -> bd0c3e22 b670f794 3b45bd90", + "422201d0 c1b643a6 4000c200 38783523 b827b02c b798da04 36ff08f4 00000004 40000000 3f000000 -> 3e340876 b801bf9e 3b0ec173", + "c1d1ad5b c1e3382a 41fafbf4 346665f3 b6919af6 366b547b 3930eaf0 00000004 40000000 3f000000 -> bf3d83b3 3794f08e 3b9b5f3d", + "41e327dc 41f28cd4 c10a8f3c b50c79fb 356312f6 b583dd9b 35d792ba 00000004 40000000 3f000000 -> bf1fd62e 3753a8eb 3b0fc820", + "42045c48 414c53e8 c2084311 b8fab05b b8989b5a 37bd1150 35953e5d 00000004 40000000 3f000000 -> bf3a3f73 390b05ab 3b285401", + "bf23adb0 3f090980 3f189854 b7999ce9 b8546635 b8c26136 3a559f3d 00000004 40000000 3f000000 -> bf3a4764 37e8e94e 3c053fa5", + "41948d70 c10dae1c 40f3c610 b5b3622c b65324af 363e3ff0 385811fb 00000004 40000000 3f000000 -> be868c52 b69e2677 3ad75a19", + "bf366356 be731154 3ddcc9a0 b6c38d75 366c447e b76da5c4 3697b5cf 00000004 40000000 3f000000 -> 3e20c7d8 b87c199e 39410bb0", + "4197f990 42402090 c1d51e68 00000000 00000000 00000000 35c47ffe 00000004 40000000 3f000000 -> 3f40a8d6 00000000 3b435025", + "c245f097 c20cf86c 41fd8298 b9029a47 37944eeb b999227b 3723e207 00000004 40000000 3f000000 -> 3e3a1983 ba9de308 3b79bfcf", + "c23363c8 411f2c9c c2265dab 00000000 00000000 00000000 37a2c2ac 00000004 40000000 3f000000 -> bde807a5 00000000 3b542db7", + "c20d6394 c23678d5 402ff150 b9717972 37874d62 39bd1009 378d072c 00000004 40000000 3f000000 -> bdcdfad4 b98c8268 3b3d53b0", + "c0856e40 41c51268 408e5180 b7135728 3413e99b 3408e663 3602dd0d 00000004 40000000 3f000000 -> 3f5c0f59 37f3828e 3a96ca1b", + "be4ef964 3ec71244 3e9b1188 b93e59b1 3954847a 39d8a685 3846eb99 00000004 40000000 3f000000 -> bdff5c6c 3aece48a 3a52f4cd", + "c1943db8 c204a252 41ebcb4c 368f9709 b6857325 35162ae0 39860849 00000004 40000000 3f000000 -> bebc9453 36ad23bb 3bb15525", + "c1f0891f 422fdf66 c04eb6e0 b8851f40 b7cef3ad b80164a0 36b20e8b 00000004 40000000 3f000000 -> bf2cc29f b92011da 3b255727", + "bf4f7576 3f09fe4a 3f681a80 3a0781ec b8663a5b b9015e79 3800deb2 00000004 40000000 3f000000 -> be66c4e6 39b04e1b 3a0cdc23", + "40e66580 c233f488 c1912c76 35e0c4df b5d4005e 3663d444 39d7ee87 00000004 40000000 3f000000 -> be623c26 377a08a4 3bafce6d", + "3f6c3efe bf00c570 3cc4f180 35131e9d b5fc996e b753cbdd 383ca8da 00000004 40000000 3f000000 -> be43affb b7957f83 3a0a20d0", + "be0f355c beb4c064 3ea0490c 00000000 00000000 00000000 374cfe3f 00000004 40000000 3f000000 -> bd079e71 00000000 397c5e24", + "bf11e006 bf58c11b be62c77c 36c96bbd 36360796 36b05511 3a0fd451 00000004 40000000 3f000000 -> 3e0bd010 b7f82fa7 3ba9485a", + "4141d688 3fd0c200 40bf9bd0 b5b9323b b6a04234 36438d71 386eaf13 00000004 40000000 3f000000 -> 3eb30e9b 379b6cb8 3aabd79f", + "bef85282 bea20c86 bf16698b b797e38f b803c3bb b71cd356 35d0b9bf 00000004 40000000 3f000000 -> bea63cce b95142cd 393f1f13", + "c12a4440 c19aef27 410e7b9c 00000000 00000000 00000000 35e103c3 00000004 40000000 3f000000 -> 3d9ae607 00000000 3aac2e7d", + "3f214f36 bca54120 bf1e6058 b4da5b13 b72a9f47 36e46766 39ab5a96 00000004 40000000 3f000000 -> 3ec02a86 37f9278f 3b8886d2", + "3f1e29d6 3f0c1d76 3e3ab140 3794e381 b7ccdd57 b799db12 36f4cadc 00000004 40000000 3f000000 -> 3e9615aa b934f110 397eccbf" + ] + }, + { + "glsl": "float cultmath_cycles_divide(float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "416eefcc 416d128c -> 3f8101ad", + "417e7dec c15bffc6 -> bf941190", + "412f3b72 c10f45e3 -> bf9c8d66", + "c1290827 c123700d -> 3f846195", + "40d2ac5c 41239b40 -> 3f24d2ce", + "c0ed08f0 4188b8ee -> bedde9b8", + "c096aa70 4101a0c0 -> bf14c60d", + "3e578680 c11302f0 -> bcbba75a", + "c117a2b2 c18be21e -> 3f0ac0ff", + "c11ade3c c0b58a1a -> 3fda639a", + "c18eb60a 40b763e4 -> c04736fc", + "415be414 40c48040 -> 400f3c73", + "3f19d240 c1369a70 -> bd57a632", + "40588910 418aa878 -> 3e47e426", + "410c49b8 40e3db18 -> 3f9d9db0", + "419cfd30 4172add0 -> 3fa59b3d", + "c188a1c6 417989a8 -> bf8c2b98", + "c13f1081 c19e8dbd -> 3f1a3ef3", + "4185928c c0d4e98a -> c0209a9b", + "c054cf78 c18fb64a -> 3e3d8b38", + "c11e8ed4 4192d446 -> bf0a3983", + "c19527fb 4088f978 -> c08b6230", + "3f6e8140 41353558 -> 3da878f5", + "c03bd9f8 c1893df6 -> 3e2f3389", + "c184835a c1882ee7 -> 3f7919d0", + "c0f67c9e c0cca2e8 -> 3f9a2d6d", + "c153c21e c15af928 -> 3f7790a4", + "c12a75fe c12cc226 -> 3f7c9873", + "c19768c4 c123c235 -> 3fecb1cb", + "40b4c628 40175780 -> 4018e492", + "40f52fb8 c0fcb22a -> bf78646b", + "3f8231c0 419bb452 -> 3d560ed2", + "4129a0e0 c024c930 -> c083c2f2", + "4162b568 be9bdbc0 -> c23a2fb3", + "3d314200 3cf32400 -> 3fbaa1fb", + "c0bc500e 4189690a -> beaf6a9c", + "40badf48 c13b71a8 -> beff3817", + "c17c3639 c1818a51 -> 3f793680", + "408c03d0 c12898a9 -> bed499f4", + "c16ca7f2 411467cc -> bfcc1dc6", + "41385c0e 3f09e2e0 -> 41ab242c", + "415e57a4 40b94f10 -> 4019949a", + "c0a5a84a 40c097a8 -> bf5c3275", + "41066ff0 4184dace -> 3f018654", + "40c7ff48 4196d8d2 -> 3ea9b4c0", + "4198db06 40ddce98 -> 40306b53", + "40f65048 4164f640 -> 3f09b34c", + "c0b408e0 418fe520 -> bea025c7", + "c02a76b0 c190dc4d -> 3e169f83", + "415adbdc c183f2d1 -> bf544f40", + "41893ff8 418af430 -> 3f7cdc56", + "40334b50 4059fee8 -> 3f528d2b", + "410dca38 c09c20c4 -> bfe87d7a", + "40f87dd4 4193d7c4 -> 3ed723da", + "c18f6178 c167615c -> 3f9ea310", + "409a77e8 4139c722 -> 3ed4db19", + "c1771a42 4182fda6 -> bf7175ee", + "412d79d4 c14e0652 -> bf578e4d", + "bfe585c0 41739eb4 -> bdf12fa6", + "40947990 c176aaf4 -> be9a1795", + "41105dc6 418c7fe6 -> 3f0385cf", + "4157217c 3f97fce0 -> 41352d65", + "3f6c3860 40e5e15c -> 3e0387b7", + "c1285612 41387964 -> bf699ada", + "415e92c8 c15c007b -> bf817f02", + "40cf1214 401eea08 -> 4026c9d3", + "c086e90a c1926129 -> 3e6bf115", + "4141e7dc 416273ac -> 3f5b3507", + "418de5ae c1182816 -> bfeebd22", + "41876ea8 419d9e1e -> 3f5bf783", + "41920676 411ec066 -> 3feb7a4e", + "4168788c 3f361000 -> 41a3709c", + "c0bf14a0 c1481114 -> 3ef48067", + "40180630 41352cda -> 3e56cf47", + "c18441ca c14bfe1d -> 3fa5f9be", + "be614180 40070e88 -> bdd57c75", + "c02fd590 411186d0 -> be9aa852", + "c0b086cc 419cc014 -> be902624", + "c1809c8e c1931665 -> 3f5fd7e6", + "c18c21e6 c192933a -> 3f74bf60", + "c165ba50 4181e2c4 -> bf626473", + "c176e33e 417d3d8c -> bf7993f9", + "bf6ea640 c18d3f47 -> 3d584464", + "c08588b2 c1892bf8 -> 3e7935fd", + "c17bec90 41858314 -> bf7185ff", + "c129d1ad c14488a2 -> 3f5d33be", + "419260b2 409e0118 -> 406d299d", + "c15ab7e0 4198ceb0 -> bf3735ed", + "c187bc61 c0e87f06 -> 40157535", + "c14d7614 c0d256cc -> 3ffa1035", + "c17310e1 bfec1770 -> 4103c800", + "4100fcf8 40d521cc -> 3f9aee97", + "40cf0914 c17a3a9a -> bed3cf74", + "c16c501c 40d60950 -> c00d5270", + "40e70228 414867b4 -> 3f138bea", + "4123acca 4180fc12 -> 3f226ced", + "c13fe44a 417403c4 -> bf495121", + "4160f68c c18fdc4e -> bf482937", + "40ab4748 41959d80 -> 3e928892", + "c192da4d c1050bc2 -> 400d487e", + "413ab344 bef4d040 -> c1c33b3a", + "40e232d8 c15389bc -> bf08defa", + "418ee9c8 c0fdf8c8 -> c0100df4", + "40740900 41450a10 -> 3e9e877f", + "4030fac0 c093c18a -> bf1950ec", + "41847c74 41330666 -> 3fbd7371", + "41674948 4110e798 -> 3fcc4de4", + "4186f536 40ef9138 -> 4010370f", + "c13d3772 c005d088 -> 40b4fea2", + "c12a46ff c0a95f98 -> 4000aee0", + "4188e8c8 41123700 -> 3fefb519", + "c08bb20a c1045444 -> 3f072015", + "c158a6a2 c0d793a4 -> 4000a347", + "419dadd4 c187a130 -> bf94cf1c", + "412e09fe c17aff45 -> bf31820a", + "c0c80c8a c17ab3c3 -> 3ecc46c1", + "c10e8ae8 417795b0 -> bf136337", + "3fe10ab0 40a92b40 -> 3eaa468e", + "413163a8 3fa43590 -> 410a4615", + "410cbd56 c0b2fe26 -> bfc94a12", + "3f0c3240 c0e2b458 -> bd9e501d", + "c1809d04 c1029e26 -> 3ffc124d", + "417f6ecc 41985332 -> 3f56a474", + "c192a893 bf865f20 -> 418bb44d", + "41930cac c156d210 -> bfaf3cdd", + "415d7ed8 c148e83a -> bf8d1df7", + "41158200 40ddf660 -> 3fac6f43", + "c0adba9e c18bc1dd -> 3e9f1d21", + "c180e6be c09524a2 -> 405d416e", + "c19d718d 40933ac4 -> c088e145", + "c0f4b014 3f444a00 -> c11f8f90", + "c1947ff8 bfc61050 -> 413ff026", + "c192ed40 4143acac -> bfc0393c", + "3dc8a800 4197d9d0 -> 3ba923c2", + "c14b39bc c106ab33 -> 3fc12970", + "4183327a 40dc83b8 -> 40184f41", + "4111ce88 416f3814 -> 3f1c08f2", + "41628d10 40865778 -> 4057db47", + "40a6e20c c1819d70 -> bea4cdbc", + "c0878622 c1494d06 -> 3eac5982", + "c10678ab 3f4278c0 -> c1310430", + "c1755bb8 4089b81c -> c0640af1", + "c1187e1b c15b1e0b -> 3f322925", + "c0a06b84 4084f3cc -> bf9a71cb", + "3f672fc0 bf45af00 -> bf95b171", + "3fb318d0 c088140c -> bea876fe", + "3f769cc0 c17ce00b -> bd79a8e5", + "c18f9384 419e3f42 -> bf684440", + "c1085a3c 40af1004 -> bfc76496", + "c11cc3a6 c1821eef -> 3f1a358b", + "bf875760 c18a8262 -> 3d7a250e", + "c1059226 40d98914 -> bf9d3058", + "c11d3703 c150c304 -> 3f40ca08", + "bfd5b610 416649ec -> bded9253", + "414c6e20 4125f6f6 -> 3f9daa9c", + "c02bd300 c19f494e -> 3e0a1343", + "419c9860 414e69ec -> 3fc236b4", + "c0dfd3e8 4139806c -> bf1a7221", + "c0797ea0 c0376ff8 -> 3fae1804", + "c14043ef 41754388 -> bf48ae7e", + "c0307650 417f1768 -> be311736", + "bff5fb00 41012134 -> be73d418", + "4122f1b0 3f26ef80 -> 4179e106", + "c16127f2 409d5d24 -> c037246d", + "414e5f1c 41660e8c -> 3f65a4cc", + "c0e8f414 419df482 -> bebcc681", + "415988c8 c0ff0a66 -> bfda5a44", + "41079de4 c13173e8 -> bf43a555", + "c12e464e c0088108 -> 40a36ae4", + "c0bbd9dc c183dd8b -> 3eb65831", + "40ff3168 3f180500 -> 4156df2b", + "41360bc4 41287c08 -> 3f8a4d86", + "c190b318 3fa7adb0 -> c15ceadc", + "c074eb10 4100ffe0 -> bef30542", + "413309e8 c118a774 -> bf961f97", + "406b78b0 416581c4 -> 3e835397", + "c020d038 c0a40e60 -> 3efaf097", + "40cfbf6c 403ff6b0 -> 400a8655", + "4093753c 40653290 -> 3fa4b3a7", + "4184e96c 41185a06 -> 3fdf55b4", + "c197cd89 41569aac -> bfb515af", + "c1940a98 41932fcc -> bf80be46", + "c0163c08 c01b7708 -> 3f77631b", + "c1581b62 40f16be4 -> bfe52828", + "c17933f9 c17e760c -> 3f7ab5c9", + "401f1ae8 4191e04e -> 3e0b9b98", + "c187f788 c17888d8 -> 3f8c0d13", + "c14a552b 4185310c -> bf427233", + "c176f45c 40f18930 -> c002df1f", + "40c50ecc c1320406 -> bf0db125", + "c1785643 c0089f50 -> 40e8aa0e", + "415ba4a8 401c1a40 -> 40b41a07", + "c114cfa2 bfcfde50 -> 40b7449d", + "40107448 bfa38050 -> bfe22d6a", + "40b1362c c1685fc7 -> bec33aa1", + "4089a2f8 40b0da18 -> 3f473bfb", + "3fa06720 40937218 -> 3e8b3f92", + "c18c1002 4168fe08 -> bf99e4be", + "bf66a7e0 414fac30 -> bd8e2a70", + "c0e3e9f0 408aef28 -> bfd1fa14", + "c0a5ddcc 410a0f4a -> bf19c7d1", + "4068cf68 40e2ffe8 -> 3f0346c5", + "40ff23a4 40ae3b24 -> 3fbb7094", + "413570d2 c0df566c -> bfcff9d0", + "c147b206 411d7d9c -> bfa24d40", + "bfc86fc0 41887b02 -> bdbbfb63", + "418b62a0 40f7adc0 -> 40101175", + "40a16090 404a3300 -> 3fcc50ee", + "419d7b02 bf71bc00 -> c1a6c625", + "40f65e74 419a3664 -> 3ecc7df9", + "4175052c 40f8a950 -> 3ffc4059", + "c18ff292 419795e8 -> bf7319cd", + "be51e180 4187acd6 -> bc460206", + "c0413128 bfcd40f0 -> 3ff0f4ce", + "c190346a c0e6a668 -> 40200dc6", + "c01ccda0 c106a08a -> 3e9515a1", + "c0aa8ce0 c1917817 -> 3e9611ba", + "4160eae0 c084cb18 -> c058cc7f", + "4163a450 c155db4c -> bf88403a", + "416774bc 40a82598 -> 40303183", + "40e126c4 c12c37b7 -> bf2757c2", + "c10cbe02 417b1d7c -> bf0f7ae2", + "40e15c60 40e7b6ec -> 3f78fafb", + "4101a7cc 41583604 -> 3f198409", + "419c8462 bf2acc40 -> c1ea9869", + "416e0808 c19fa75f -> bf3ed689", + "c16b830c c0ccc384 -> 40133894", + "41107268 40e178e8 -> 3fa40114", + "40d3e8d8 40961018 -> 3fb4c0f4", + "c14b3885 41303826 -> bf939cec", + "c1389624 c0e1ce22 -> 3fd144fd", + "c10f4262 416ba130 -> bf1ba4e9", + "c0f69dfa c1526d6d -> 3f16037e", + "4018f1d0 4179b570 -> 3e1ccc45", + "415aec00 c12cea2b -> bfa20e88", + "410ee870 4150d150 -> 3f2f32b2", + "4092df08 c18c71c9 -> be85db77", + "c0f84d32 40c279c4 -> bfa36d59", + "c05bb560 c15b029f -> 3e806879", + "c1018262 4148dd04 -> bf250f35", + "c1324e20 405df6c0 -> c04da58b", + "bf958710 40290fc0 -> bee26bc0", + "c0056ce8 c01f92a8 -> 3f560d55", + "c15b1d7e c1977257 -> 3f393138", + "c0e6c52c c14fd193 -> 3f0e22e8", + "4113a608 c12763ba -> bf61cf0c", + "419aae9c c18461b4 -> bf958ff3", + "c04d5c40 c0bd0b18 -> 3f0b0c53", + "41918556 c0617cc0 -> c0a5366b", + "4059b1e0 3e46e780 -> 418c1799", + "c1726100 4147f260 -> bf9b29ee", + "419ea504 4125f2f0 -> 3ff4bb61", + "41266acc c19164a4 -> bf12824c", + "c0917c80 c1894fbc -> 3e879ed9", + "c1951d94 c188653d -> 3f8befe8", + "c1185635 3e9ee180 -> c1f574a6" + ] + }, + { + "glsl": "float cultmath_cycles_power(float, float)", + "tolerance": "ulp-bounded, platform pow", + "platform": "Ubuntu 24.04.5 LTS; .NET 10.0.12", + "cases": [ + "bfb8bc1c 00000000 -> 3f800000", + "3f7fc090 3fa15ed0 -> 3f7fb009", + "bf233eb4 c03ac98f -> 00000000", + "3e873a80 3f8016b0 -> 3e871a9b", + "bbe6b600 40400000 -> b4bb616f", + "3e68f220 402e38f8 -> 3c91810d", + "3fc9e9f0 3f800000 -> 3fc9e9f0", + "4015e800 bf0bcdfc -> 3f20d543", + "3f3a3ee8 3feb0494 -> 3f0ec042", + "bf48396c c0800000 -> 402b07b8", + "407c452e 40800000 -> 43716761", + "c00dda6b 3f3046a0 -> 00000000", + "3e848ee0 bb3e7800 -> 3f8080f2", + "c002bf33 3fa56828 -> 00000000", + "bd8ed860 bfc62d29 -> 00000000", + "bfaf1f44 c0000000 -> 3f08c412", + "c0183118 bed85b08 -> 00000000", + "c056e1af c0000000 -> 3db5ac69", + "405eb81c 3f873558 -> 406eec1f", + "c035c763 c0400000 -> bd32c280", + "404ee6d2 40400000 -> 42072611", + "405a8b46 bf86c643 -> 3e8c8087", + "4001c726 3f800000 -> 4001c726", + "c00b3224 4005073c -> 00000000", + "bebba468 c0800000 -> 425db9fe", + "4036fb4c c0800000 -> 3c7531ac", + "c02a7be4 00000000 -> 3f800000", + "3e7c86a0 c0400000 -> 42855b1b", + "3fa0ee50 400dd5f4 -> 3fd499b1", + "3f9d4780 bf800000 -> 3f5057be", + "40609ea6 40000000 -> 41451605", + "bf912e6a 40800000 -> 3fd3d7a7", + "404b4890 c02d947b -> 3d32427e", + "4055bb68 4039dafc -> 4204b190", + "3fd63a18 400af156 -> 4043c598", + "3f2a4768 4022d476 -> 3eb571a2", + "c000779a c0000000 -> 3e7e2433", + "3f12f428 3fd0e194 -> 3ecef615", + "3fc2875c 40400000 -> 4060a5bd", + "3f7fd110 3f800000 -> 3f7fd110", + "beb7b630 40800000 -> 3c87c962", + "c026f278 3f800000 -> c026f278", + "c0543e05 c0400000 -> bce09cd8", + "c06d06e3 3fb61134 -> 00000000", + "c06328d7 40000000 -> 41499174", + "be85d4d8 bfd34d77 -> 00000000", + "bfac725a c0000000 -> 3f0d0ae6", + "406401fc c0400000 -> 3cb52af5", + "c02aa073 bf800000 -> bec00b7f", + "407a5bf2 40336cb0 -> 423726fd", + "c030a3e6 c0000000 -> 3e066cd9", + "bf23afa4 00000000 -> 3f800000", + "407dd50c 3f8e3ac0 -> 4093ec4f", + "bffcc482 00000000 -> 3f800000", + "401fc118 c0400000 -> 3d83ad82", + "bdc0b400 3faf61b0 -> 00000000", + "c0543515 00000000 -> 3f800000", + "3f3fe900 c0400000 -> 4017eab8", + "bfa23174 3f960c10 -> 00000000", + "400e48f0 40800000 -> 41c36fb9", + "c01a00b4 bf800000 -> bed4c682", + "c035e164 3f908da4 -> 00000000", + "beec4858 3fdca1cc -> 00000000", + "c0140fae c0000000 -> 3e3f53ce", + "3ea27ed0 3f800000 -> 3ea27ed0", + "400323c8 c0400000 -> 3dee0c94", + "c050596e 4006fccc -> 00000000", + "3fb971e0 bea71700 -> 3f62d3f2", + "bf2cdde0 4037dd24 -> 00000000", + "c04d44f9 40800000 -> 42d3a503", + "400f7dc6 00000000 -> 3f800000", + "4006843c bf800000 -> 3ef3992a", + "c04b8d54 bf829496 -> 00000000", + "bf11515c 40400000 -> be3b4cab", + "4061d544 3fc0d4e8 -> 40d5dadf", + "bff05198 c0400000 -> be1aba32", + "3f746588 bf3dacec -> 3f8479bc", + "3cbdfe00 bf8392cc -> 423f9466", + "c05bae21 bfebc07c -> 00000000", + "4076d6b4 bf89a742 -> 3e6fcd9b", + "3fd66f24 3f800000 -> 3fd66f24", + "402b6b9a c0000000 -> 3e0ebc91", + "40043a4c c0369806 -> 3e012d9e", + "c0265466 be509340 -> 00000000", + "403999ca 3f4ba548 -> 401548d4", + "4071d8ec c034f72e -> 3cbeeb6f", + "3fc731cc 00000000 -> 3f800000", + "40072280 00000000 -> 3f800000", + "3f1b9248 00000000 -> 3f800000", + "c019e742 3e5c2100 -> 00000000", + "c0156b2e 40800000 -> 41edada6", + "c07b48e3 3f9bab3c -> 00000000", + "bfb6e6e4 bf800000 -> bf3327f8", + "bcab2600 bfab31d0 -> 00000000", + "c01e8646 40800000 -> 421690ca", + "405227f6 c0380269 -> 3d063276", + "3fc8ce18 40400000 -> 407719c8", + "c02be16c 3f800000 -> c02be16c", + "402083b8 400b93b6 -> 40edb6c0", + "c05ed312 c0400000 -> bcc21b61", + "3fe1f4f8 c01f4d11 -> 3e78dc58", + "bdb9ae80 3e4cfdb0 -> 00000000", + "3e651fe0 402aa51e -> 3c973d8a", + "405c1a44 3f4d6e08 -> 402c7275", + "3f2d3980 3f800000 -> 3f2d3980", + "c00a2759 c0325919 -> 00000000", + "3efab780 3f525ec8 -> 3f0e5f27", + "3dc84980 3f0f2c40 -> 3e8b8137", + "4003f568 40400000 -> 410c3f36", + "bf9030b0 40000000 -> 3fa26d9f", + "402dad36 40400000 -> 419fdf63", + "bfd61168 402c1c84 -> 00000000", + "c01dba74 be0bec10 -> 00000000", + "bf500b08 40400000 -> bf0965da", + "c058df5e bea0f478 -> 00000000", + "c0361752 c01d450a -> 00000000", + "405f1056 bf44bb1c -> 3ec42365", + "4027e668 3f0f5f40 -> 3fdbaef7", + "3e0512a0 c0800000 -> 455b240c", + "bd840560 40227868 -> 00000000", + "3fcd6df8 3f800000 -> 3fcd6df8", + "c028d834 bf800000 -> bec2126f", + "4012975e bf800000 -> 3edf8878", + "3fc7b220 40400000 -> 4073073f", + "3eeee700 c0000000 -> 4092fa16", + "40332012 40000000 -> 40faabba", + "c035732d be5c3780 -> 00000000", + "3ff81f18 3f800000 -> 3ff81f18", + "bf48351c 40000000 -> 3f1c9307", + "bffbcf8e 3ed1ca30 -> 00000000", + "40490b82 4034c788 -> 41cae58c", + "3eddb3b0 bfdbde8c -> 4086c153", + "c03dafc0 3f86cf94 -> 00000000", + "c064c027 c0000000 -> 3da04fd1", + "3fae1d44 00000000 -> 3f800000", + "3a2b6000 bf800000 -> 44bf34d8", + "bfc23872 3fd161c8 -> 00000000", + "bfb9ea26 c0400000 -> bea717e4", + "bea82c08 3fbc5c88 -> 00000000", + "c068d90f c021834e -> 00000000", + "3f90c638 3de896e0 -> 3f81cd7f", + "403448f4 bf7877d4 -> 3ebb6153", + "404d578c 00000000 -> 3f800000", + "c05c84ff 3e35e9f0 -> 00000000", + "c0607acb c0000000 -> 3da67850", + "c024d314 c0400000 -> bd6fcab5", + "c05d8fa0 3fb99be8 -> 00000000", + "bf33caa8 c0166838 -> 00000000", + "40176080 bf60c7e4 -> 3ef06d88", + "4034d9a0 40000000 -> 40ff8584", + "be813b00 c0400000 -> c278c1c3", + "3f44e5d8 40400000 -> 3ee8f497", + "4008c82c bebd85c0 -> 3f4142a8", + "c016156e bfb42b54 -> 00000000", + "404068dc 40800000 -> 42a36309", + "c003924e c0000000 -> 3e724a59", + "40397500 40400000 -> 41c2a955", + "3eff97b0 400c79cc -> 3e5edd44", + "bfa62e04 3f800000 -> bfa62e04", + "bf371060 c0000000 -> 3ffa503e", + "40781ab0 40800000 -> 4361d92d", + "3fe6e938 3f50f38c -> 3fcf2eb2", + "bf5e6bb4 40000000 -> 3f413ef9", + "bf105b00 c0000000 -> 404946d3", + "3ffa6cb0 bf9730bc -> 3ee7bcd5", + "be425d90 3f9bb180 -> 00000000", + "c02cec39 bf8c47b6 -> 00000000", + "c04cf354 3ff16594 -> 00000000", + "4034f84e c01729f2 -> 3dafd42a", + "bfe9129e c0400000 -> be299c91", + "c0067888 40000000 -> 408d44ce", + "c0146345 00000000 -> 3f800000", + "bf930eb0 3f800000 -> bf930eb0", + "bfc28a82 3fdfd6f4 -> 00000000", + "3f165730 40400000 -> 3e4f6665", + "3f86d694 c012db6e -> 3f632ea2", + "3f0060e0 3f9409f0 -> 3ee675c0", + "40457f06 00000000 -> 3f800000", + "40525220 c02a2d08 -> 3d2d2926", + "c04f83ed 3f959b14 -> 00000000", + "3e733c80 c0400000 -> 429539dc", + "bc8b5e00 c0800000 -> 4b362751", + "bd688080 3f5421c4 -> 00000000", + "4000ff9a bf800000 -> 3efe04c1", + "c05ffab7 3f9a5f48 -> 00000000", + "3e540e40 3eb31540 -> 3f139653", + "4063858e c0800000 -> 3bcd2740", + "407a41fa bf1e3b24 -> 3edc691d", + "bda54a40 c0800000 -> 46b82120", + "bff830d0 bf800000 -> bf04070c", + "bd3902c0 c0000000 -> 43f512c4", + "406409ac 3fb2a75c -> 40bc8494", + "3f2cfab8 c0000000 -> 400c2cdc", + "40219058 c0000000 -> 3e20af00", + "be285280 3fb98408 -> 00000000", + "bfc5fde2 bf1f92b0 -> 00000000", + "401b0b74 bf800000 -> 3ed3586f", + "bc3f9600 3f800000 -> bc3f9600", + "3f5a4eb0 bf0b5048 -> 3f8b96e8", + "401eb9aa 40400000 -> 41741275", + "4064745a c0000000 -> 3da0ba44", + "bfcc17e4 40400000 -> c081b848", + "c048c7b5 c0800000 -> 3c2924eb", + "406fcff2 be9741f0 -> 3f2d4893", + "bfbaa230 c0800000 -> 3e628f10", + "401c060a 40193464 -> 41071188", + "3f9f288c 00000000 -> 3f800000", + "3fd92a10 40800000 -> 41049108", + "40752aba c0153b73 -> 3d32c4ad", + "3f83114c c0000000 -> 3f74283b", + "bfb4eb54 c0260d4c -> 00000000", + "bf4cbd6c 401af12c -> 00000000", + "c0672bfe 00000000 -> 3f800000", + "40444870 40000000 -> 41167f00", + "bfb405ee beada5d8 -> 00000000", + "4050cccc c0800000 -> 3c109dd5", + "3f09be50 c033dffe -> 40b6aafe", + "3da941c0 40400000 -> 3a13f9a2", + "bfc06ac8 40400000 -> c059692c", + "bfb7d4be c0000000 -> 3ef83a97", + "3ffcbdb0 40400000 -> 40f658cb", + "402a3ce8 bfffc437 -> 3e10fc1d", + "bf6f3a60 bfb8ba28 -> 00000000", + "c0241730 bf821f7c -> 00000000", + "bf9dde3e 403a08e4 -> 00000000", + "40251098 3f800000 -> 40251098", + "be6d5a80 40400000 -> bc4c0940", + "c051fb3b 00000000 -> 3f800000", + "c0159584 3f381ee0 -> 00000000", + "c003a606 3f800000 -> c003a606", + "c041035c 40090e18 -> 00000000", + "bfd5a63e 40000000 -> 40324e0f", + "405af884 c0400000 -> 3ccc896c", + "bfe4dc52 bfb5f322 -> 00000000", + "40062812 c0800000 -> 3d54251a", + "3fcdd4ac bf800000 -> 3f1f32e2", + "402e331c 40400000 -> 41a15245", + "c02e065d bfbf5ee8 -> 00000000", + "beda0f78 bef87890 -> 00000000", + "c00462c3 3fff0800 -> 00000000", + "3ec0ec80 40400000 -> 3d5b2209", + "3f7e7240 c0800000 -> 3f8327b8", + "be57d1e0 3f800000 -> be57d1e0", + "bff01a88 401821e6 -> 00000000", + "bf0d551c 00000000 -> 3f800000", + "3ed4b650 40000000 -> 3e30be76", + "bd8e67a0 3f641554 -> 00000000", + "c00679f0 3f800000 -> c00679f0", + "4013f558 40115e50 -> 40d6b455", + "3f594848 bdfa8b80 -> 3f8297fd", + "bfccfae8 400cf248 -> 00000000", + "bf921ed8 bf31b420 -> 00000000", + "bf0893ec c0000000 -> 4060da7c", + "c077180c c0800000 -> 3b9379df", + "3ffceea4 3f11e5d8 -> 3fbcb4e1", + "40666f74 3f6df858 -> 40528df0" + ] + }, + { + "glsl": "float cultmath_cycles_logarithm(float, float)", + "tolerance": "ulp-bounded, platform log", + "platform": "Ubuntu 24.04.5 LTS; .NET 10.0.12", + "cases": [ + "416175a4 418f2e6d -> 3f6ac789", + "40d2d3ad 416ecd13 -> 3f328da7", + "41701488 40175e3a -> 40495c0a", + "406b814e 40c675ed -> 3f36c538", + "416c191a 40946e38 -> 3fe08aa0", + "4185a7a1 3ff0b6d9 -> 408eaaf8", + "40401cbb 418ad1f7 -> 3ec53609", + "40869336 40481913 -> 3fa14a09", + "419a83c3 4085acd5 -> 40048b1f", + "3f17a1ee 3fbdd240 -> bfaa1e6f", + "4114ec8e 405005be -> 3ff23e86", + "401865d5 4073cfb0 -> 3f260f9a", + "40daeb8c 4117bc8e -> 3f5ad59e", + "40b319e5 412c621e -> 3f39785c", + "411cfe17 41847b8e -> 3f504409", + "3d998f02 41863d24 -> bf6b2784", + "4095dfe1 408f5ffb -> 3f83c8b2", + "419046e5 4197f763 -> 3f7b7c32", + "40413890 41314132 -> 3eeb3ba5", + "4195c8af 416fcb6a -> 3f8a85db", + "405ee548 410661c1 -> 3f161b60", + "414efa98 408163e7 -> 3fea8bc9", + "40c1d681 40985c3f -> 3f93bfd4", + "418ad905 40e678bf -> 3fb9055c", + "4190080a 413d37a1 -> 3f95c6f0", + "4142f222 40f790b4 -> 3f9c6a71", + "41935b45 4151cb19 -> 3f90e793", + "4073791f 412d9d2a -> 3f0f762b", + "41786c5c 40327b81 -> 402b23f7", + "41018043 40b101e1 -> 3f9c7c31", + "4186254e 414e7e36 -> 3f8d1a2e", + "41831e6f 419190ff -> 3f76c6c8", + "409259e8 419f6a7d -> 3f0212d6", + "41899375 41942b98 -> 3f797e5f", + "419a8b12 40a6b5ac -> 3fe5a1dc", + "3df08b60 4103ef49 -> bf81f0f5", + "40ae8a17 40b35d6a -> 3f7bf31c", + "4190007b 3f6b3c2a -> c208ac6e", + "412506d8 4192b3c1 -> 3f4d5bd3", + "418e0455 4005c270 -> 4079bcb0", + "41420a85 41932849 -> 3f5b60dd", + "414c5208 418fe33b -> 3f61a850", + "408c5bde 41456ac4 -> 3f16a0c3", + "4192e1df 413924d9 -> 3f982209", + "3f2faab9 40e6332b -> be436e3d", + "405ead7d 3e760e4f -> bf5fd9c6", + "403fa796 41533965 -> 3ed9a24a", + "4191c067 41293b1b -> 3f9d8295", + "414024e1 416bd899 -> 3f6c8054", + "419bc280 40c42c8f -> 3fd19344", + "40f20e6a 4196ad6c -> 3f3072c3", + "40fc4c75 414cde34 -> 3f4f50cf", + "413b7f81 407caf3a -> 3fe5676d", + "4012b111 414d30cc -> 3ea673cd", + "4171ca23 40394dec -> 4023790a", + "3f0bf483 4189826c -> be59671d", + "40a12c6a 40c07139 -> 3f66b2ca", + "4156766c 4192fd04 -> 3f6443e5", + "3e1548f8 41933b35 -> bf294086", + "415d1d06 4143c230 -> 3f8639a3", + "3fc9d186 40b45612 -> 3e86d48a", + "418ec2be 41422586 -> 3f93c78c", + "3fdec367 419f046e -> 3e3dc918", + "40a85cb3 41440ba7 -> 3f29a1e1", + "40ec5bcd 40eddda1 -> 3f7f3057", + "410e8ee1 41792e3e -> 3f4bee90", + "4196f141 413a1b59 -> 3f993bd5", + "41686967 4154afad -> 3f846351", + "4128534f 419fb9ea -> 3f493788", + "40c8dfd5 3ee562c6 -> c0126bd4", + "4120e775 40b177d1 -> 3fac7890", + "4183ad5b 418e5399 -> 3f791578", + "40d50686 40c94d0c -> 3f83f0ad", + "41734205 4187d8a5 -> 3f7601d7", + "419e617c 419ec363 -> 3f7fcb1a", + "41270eed 4159ae77 -> 3f660adf", + "3f6e4892 40e7d78a -> bd1455b5", + "40920a19 3ff8290e -> 4012c24a", + "3f7fe531 417c00b4 -> b91b9f19", + "41312ebd 413d76a3 -> 3f790f0e", + "41957eba 4120a09e -> 3fa27b05", + "40ae57b6 40f6088f -> 3f54c514", + "415fc499 409f2214 -> 3fd283c4", + "4192912b 41567adc -> 3f8f6803", + "4137cf35 3df7daa6 -> bf93f946", + "40fb9f5e 3e3853fd -> bf99ef60", + "41422f76 41561ae5 -> 3f765cb9", + "400c0ec1 41803f24 -> 3e90861e", + "4112d053 3d83a025 -> bf4ebea6", + "40af9671 417731e7 -> 3f1f325b", + "4095df9f 41047d10 -> 3f3afd4a", + "414748ae 40f14e42 -> 3f9fcafa", + "4187eff2 4174e06a -> 3f84e82f", + "416a72ab 413a1fb4 -> 3f8c0a5a", + "40e27e86 41498d3c -> 3f45bfa8", + "4144da4e 416c529b -> 3f6ea033", + "410e6e0d 4166f947 -> 3f51a432", + "3fe16d08 3cdf9bdd -> be20f06c", + "3ddc81c6 410c7f64 -> bf834df1", + "40742e33 3fd8d977 -> 40228f81", + "40ff0860 3fe780f4 -> 40602e57", + "40b01614 419d7e1d -> 3f127e4b", + "413fe00d 41245693 -> 3f888353", + "3fbd3fb5 40f19348 -> 3e4615ad", + "40a22215 410886c4 -> 3f41c26a", + "414c34cf 3f720088 -> c23525ed", + "41245e71 4179fcd6 -> 3f58f351", + "40e55f93 4126a95b -> 3f572b36", + "418cabf7 418f425d -> 3f7e61fd", + "412b2465 41957218 -> 3f4f3dab", + "41251e5f 40d65731 -> 3f9d1776", + "40cac91d 419720fd -> 3f20d905", + "40fa2acd 41517d14 -> 3f4cac6b", + "41347344 418d9b17 -> 3f57d85a", + "413a163b 400af361 -> 404a8f69", + "417eee3b 3ecf3c9f -> c043e494", + "4181fdd9 407363fe -> 4005946d", + "40efad59 4038a299 -> 3ff342f5", + "40326bef 414c4c75 -> 3ece19af", + "4178c713 40d7648c -> 3fb8346b", + "415d616b 40e3a3fb -> 3fab6695", + "40d26f3d 41945c3f -> 3f251ca8", + "419eac36 4135e33c -> 3f9d4f2d", + "40903a3f 41547136 -> 3f150c10", + "40e8e4e8 41358447 -> 3f5135cf", + "401c5f7d 400cd126 -> 3f910215", + "4190ad80 40a44ebd -> 3fe28223", + "4135fcd0 3fa40c6a -> 411cc727", + "41778b90 40d39222 -> 3fb99d3c", + "413e0fc8 4197317c -> 3f578dd2", + "4197f1a8 4071c720 -> 400dc2fa", + "417eb369 4039f4a1 -> 40260e7c", + "4149988a 4145e3df -> 3f80f1b7", + "409648aa 40cf5cd0 -> 3f53e58a", + "41024f20 40896033 -> 3fb8415a", + "40f46eaa 409a68df -> 3fa55b38", + "40179a70 407e6c52 -> 3f1ff70f", + "409b5776 404dd55f -> 3fad1c85", + "3e073be0 40f95820 -> bf7c6e0a", + "419874c6 41839916 -> 3f86b998", + "410988eb 41900107 -> 3f3e89a1", + "4126ecb1 3e975d2c -> bff64d91", + "419dd27c 415be2e7 -> 3f91a867", + "40147b96 4131fd4b -> 3eb2db85", + "4146dc2f 40c6fc2a -> 3fb08143", + "40ed3a2d 418168f6 -> 3f383d75", + "3f665a27 4185320d -> bd19c067", + "40f79ded 41211897 -> 3f62d11e", + "41331e93 406b8db1 -> 3fed45d2", + "40be91d5 40ef3b06 -> 3f630f8a", + "40d5cfb9 4190375c -> 3f282384", + "40a49619 403fad41 -> 3fbf1a3a", + "406dd79e 418cf1b8 -> 3eea463c", + "419ea6d7 4161e8e1 -> 3f906cab", + "3e949326 4102b06e -> bf16cee9", + "3f946c9c 40f610ed -> 3d94a28c", + "40f1bf09 4176dd9e -> 3f3d3089", + "41250305 3f8051c0 -> 446a1e9f", + "41558518 417a2177 -> 3f7143c9", + "404b60bc 4196dad1 -> 3ec99020", + "4120edef 4159270a -> 3f629694", + "4160d238 3ff7d002 -> 408001d4", + "41870981 4137656a -> 3f944fe0", + "407bdf0a 40b70503 -> 3f491f5d", + "4181e60f 416c9324 -> 3f847315", + "414056c5 41839cc2 -> 3f635197", + "3fec60d7 413974ff -> 3e802d2d", + "411c7344 41291a33 -> 3f778e92", + "414ddff7 40ee54ad -> 3fa2dab4", + "4184a281 4007a9fb -> 406f3726", + "415e953a 41033605 -> 3fa025f9", + "412d81a8 4088a96f -> 3fd228da", + "40a232ef 419dca50 -> 3f0b5902", + "410a1b5d 40af100a -> 3fa25932", + "40cb1419 40d7db68 -> 3f77d0ec", + "4185c9c0 4178fd1c -> 3f835b81", + "3f03432e 40e3268f -> beae80dd", + "418b57ca 4151c0d3 -> 3f8e224e", + "407f15d6 404de806 -> 3f9775e9", + "40c3b09c 4144107e -> 3f38fe02", + "415b14a3 4161f422 -> 3f7d036c", + "418f0e61 40b022ed -> 3fd86e02", + "41812cd5 4096a821 -> 3fe5d34b", + "40bb4aa2 417f6a85 -> 3f234791", + "40b526a1 419df469 -> 3f14c879", + "41022a41 40bd076e -> 3f971084", + "41986e3a 3f88b532 -> 42331f7f", + "409e92c0 3fef0704 -> 40240202", + "402f3960 411ca677 -> 3ee2086c", + "4186f044 41893f32 -> 3f7e78e9", + "4035cc0b 4193b7df -> 3eb75188", + "419afc3a 41180761 -> 3fa8805b", + "41907fd2 4183acd4 -> 3f843f48", + "417f2e46 416bf8d4 -> 3f83b8e8", + "4162c56b 41855938 -> 3f713e80", + "40d2fb66 411a8eec -> 3f54e33d", + "3fabd7f2 408abaf4 -> 3e4da25c", + "4106d5dc 419e508c -> 3f36ca53", + "41251943 40ab324f -> 3fb22298", + "4101fb0e 3ebdcb9b -> c00718c0", + "415e1845 414ab0d7 -> 3f849bd9", + "419e7a5a 40d34276 -> 3fca85a1", + "4194e1b9 412d38bf -> 3f9d1c54", + "41841054 419b8ec6 -> 3f71e025", + "4009cb77 4178f7a9 -> 3e8f0db4", + "41261b70 41631efe -> 3f61cf7c", + "40cb32f1 410f59ea -> 3f57cebc", + "4116c671 4173a4e5 -> 3f52e206", + "416bfbae 41063e58 -> 3fa1f22d", + "40ee23a6 419d8001 -> 3f2c6cb4", + "410c25cb 4131ac7e -> 3f66c539", + "3fe67079 410fe0df -> 3e890f2c", + "41529415 4193cdab -> 3f623a65", + "4092635e 416ba7f1 -> 3f10b746", + "414a40cb 40a55091 -> 3fc5bfd4", + "4138c79e 418b1a99 -> 3f5b515e", + "3fd6a2f4 41840d91 -> 3e3cca34", + "40523c51 4122c22b -> 3f03419f", + "41953d85 414c802f -> 3f92fef0", + "412e43ed 40e7dfb7 -> 3f9a56e6", + "419f9c80 4184085d -> 3f88a916", + "4149aeeb 4194e6e2 -> 3f5de055", + "40c97fed 41465eb5 -> 3f3b1bb3", + "405479a1 41462114 -> 3ef42738", + "416e9709 415330f7 -> 3f860d2a", + "40a19cc0 3ff81f04 -> 401c975f", + "418f43ab 4106fb0d -> 3fad2ddd", + "4139c893 403252f1 -> 4019245d", + "412e0bbe 412d3cca -> 3f80400b", + "41570d26 3e1444cd -> bfac1a88", + "40c8600b 3fe50d6f -> 4049c127", + "40da0b70 4187e54b -> 3f2d7039", + "4080b201 414fe640 -> 3f0aedc9", + "41487397 411d7e57 -> 3f8d8009", + "40b5e799 419a0223 -> 3f166a54", + "418494ee 3ffd239c -> 4083c28a", + "418bfd35 3e52bb55 -> bfe7bd00", + "419de381 41441511 -> 3f9856ce", + "4193fec9 404c0130 -> 402114dc", + "402d277b 3f45e562 -> c0776fef", + "4172a5e2 4143109b -> 3f8b2c2f", + "419e8873 419b87ea -> 3f80d31e", + "3e00b784 4119ecb4 -> bf6a8343", + "419bd6ee 4153d951 -> 3f93218c", + "409cf70a 3f0234d9 -> c0168c14", + "419a5b36 40face69 -> 3fb80169", + "419ab985 412c1bd0 -> 3f9f9c78", + "3f7e8cb7 41916024 -> bb006616", + "411b33f8 4179e455 -> 3f53a2da", + "41699db9 4154d9b7 -> 3f849aa7", + "419ef58f 4157a011 -> 3f931b63", + "40d6ac7b 417a92c3 -> 3f311ce1", + "4185038e 40454b88 -> 401fcc9d", + "408e12ec 418db2af -> 3f04c37a", + "410b340b 419ad9c1 -> 3f3ae8dd", + "40892e54 40f668d0 -> 3f368be9" + ] + }, + { + "glsl": "float cultmath_cycles_sqrt(float)", + "tolerance": "ulp-bounded", + "cases": [ + "c06fe380 -> 00000000", + "40ab2314 -> 40140155", + "c120e72e -> 00000000", + "41022686 -> 4036889c", + "c1809429 -> 00000000", + "c0a88ff2 -> 00000000", + "415bd488 -> 406d3a0c", + "410cc1a8 -> 403dd349", + "40e0ac68 -> 4029951b", + "419498ce -> 4089ea1b", + "c121e620 -> 00000000", + "c11a49ce -> 00000000", + "419f4dc2 -> 408ecbf0", + "c0215b98 -> 00000000", + "c16be453 -> 00000000", + "c0d04e54 -> 00000000", + "41936084 -> 408958e3", + "c186f611 -> 00000000", + "c16e3356 -> 00000000", + "c163c1b8 -> 00000000", + "c035a680 -> 00000000", + "bf9a58f0 -> 00000000", + "c191b3e9 -> 00000000", + "c184f6b8 -> 00000000", + "c11074cd -> 00000000", + "c13af2b1 -> 00000000", + "c165e305 -> 00000000", + "416153d8 -> 40702cb3", + "c11a244b -> 00000000", + "c183b3e2 -> 00000000", + "c12ea2d7 -> 00000000", + "c10eab33 -> 00000000", + "414708cc -> 4061ba2e", + "404cce40 -> 3fe4f9fe", + "419b4ab8 -> 408cfcb2", + "c0d55c58 -> 00000000", + "c1070713 -> 00000000", + "c0c545a6 -> 00000000", + "4146a164 -> 40617f83", + "c1757a4e -> 00000000", + "418bf116 -> 4085d677", + "c19cce2b -> 00000000", + "419ca0e4 -> 408d97b0", + "c196adf4 -> 00000000", + "c03bd1e8 -> 00000000", + "c187a018 -> 00000000", + "4136783c -> 40582150", + "c087516c -> 00000000", + "c198dd9e -> 00000000", + "4175fa54 -> 407af05b", + "4188002a -> 4083f090", + "c0b7b42c -> 00000000", + "415997b8 -> 406c0430", + "c189a82c -> 00000000", + "4191d004 -> 40889dc4", + "418ba91e -> 4085b408", + "4063e570 -> 3ff18a2b", + "c156f9bd -> 00000000", + "c03592b0 -> 00000000", + "4179ca60 -> 407ce04f", + "c12e64f4 -> 00000000", + "419d4058 -> 408ddfb1", + "bfc8d060 -> 00000000", + "405ef7e0 -> 3feee9f9", + "4117d472 -> 4045269c", + "4196628a -> 408abde2", + "c0054a60 -> 00000000", + "c0526030 -> 00000000", + "bff762c0 -> 00000000", + "413ec9d8 -> 405d007d", + "c190900c -> 00000000", + "4092c7b8 -> 4009119e", + "c1148d87 -> 00000000", + "c19c5c83 -> 00000000", + "c13ba3e7 -> 00000000", + "c04f3520 -> 00000000", + "bf48ce60 -> 00000000", + "c19b05f5 -> 00000000", + "40ca0e14 -> 4020d1e5", + "c141349d -> 00000000", + "c045abb0 -> 00000000", + "411dc5b0 -> 4048f8cc", + "41530f18 -> 40687226", + "c0a03d3c -> 00000000", + "c1576818 -> 00000000", + "416d3740 -> 40766dd3", + "c0210ba0 -> 00000000", + "411a5922 -> 4046c773", + "409f270c -> 400eba96", + "c1905e67 -> 00000000", + "411c5878 -> 40480fa8", + "c1700d56 -> 00000000", + "418560ec -> 4082a960", + "41866b82 -> 40832bb3", + "4178eaa4 -> 407c6ef6", + "418eb0c0 -> 40872550", + "3ffbedb0 -> 3fb392f6", + "c079f0c0 -> 00000000", + "c105305d -> 00000000", + "bfddcc70 -> 00000000", + "40a424d0 -> 4010f31d", + "c0a9df70 -> 00000000", + "418da1d0 -> 4086a4c5", + "c1308515 -> 00000000", + "41571a6c -> 406aa990", + "c0f2c716 -> 00000000", + "c183a648 -> 00000000", + "415250bc -> 4068093b", + "41685390 -> 4073e049", + "3fbb6a80 -> 3f9ae277", + "bfe106f0 -> 00000000", + "403c1518 -> 3fdb6dd4", + "3e7fce00 -> 3effe6ff", + "c12c300e -> 00000000", + "bfa655a0 -> 00000000", + "bf42aa40 -> 00000000", + "c1588e68 -> 00000000", + "c1847db8 -> 00000000", + "c04367c0 -> 00000000", + "416a9d34 -> 407512e9", + "3fa83fe0 -> 3f92c054", + "41045444 -> 40380e19", + "413bd46c -> 405b4817", + "c078be28 -> 00000000", + "c18ec750 -> 00000000", + "418776a0 -> 4083adc7", + "40fd4408 -> 40340ccf", + "c0c2c918 -> 00000000", + "c171a3ac -> 00000000", + "c1190566 -> 00000000", + "416cb500 -> 40762a22", + "c187085a -> 00000000", + "410f2472 -> 403f6d69", + "c13f3f6a -> 00000000", + "4032e3f0 -> 3fd5fff6", + "c18e3d9a -> 00000000", + "41428210 -> 405f2555", + "40872858 -> 400387b6", + "3fc637d0 -> 3f9f491e", + "4161fb70 -> 407085f4", + "413483ce -> 4056f825", + "408ad8b4 -> 40055020", + "41720594 -> 4078e9ad", + "c183ece5 -> 00000000", + "406d9040 -> 3ff69c09", + "c152acce -> 00000000", + "4097e6e0 -> 400b7092", + "40ede3c8 -> 402e7fbd", + "bff2f230 -> 00000000", + "c06baae0 -> 00000000", + "4135efe8 -> 4057d084", + "bfbc36c0 -> 00000000", + "41992ee0 -> 408c06cd", + "c03f3640 -> 00000000", + "41879f3c -> 4083c183", + "4186df12 -> 4083640a", + "403cef70 -> 3fdbed0d", + "3fcb9950 -> 3fa16ee2", + "c152f675 -> 00000000", + "41841694 -> 4082072d", + "408ff4e4 -> 4007be7a", + "411a17fc -> 40469d7c", + "4103f468 -> 4037cb62", + "4082b1e8 -> 40015728", + "40d570a0 -> 402549e0", + "c09c2052 -> 00000000", + "415fe0d4 -> 406f66a6", + "c0f982b8 -> 00000000", + "40ce2df0 -> 402273f6", + "c0613e00 -> 00000000", + "40e2a698 -> 402a53b8", + "400f75b0 -> 3fbfa3b4", + "3ff1ecc0 -> 3faff900", + "4034aa78 -> 3fd70f29", + "c184f34d -> 00000000", + "4187cdd0 -> 4083d821", + "41524eb0 -> 4068081a", + "4103ae38 -> 40379a7a", + "41466c64 -> 4061616b", + "41751e2c -> 407a7ff6", + "c0fa0c60 -> 00000000", + "c19c27f0 -> 00000000", + "417cf9b8 -> 407e7bb6", + "4109470a -> 403b76fb", + "bf6f54e0 -> 00000000", + "c06f1098 -> 00000000", + "c1803739 -> 00000000", + "c1010dfd -> 00000000", + "c10e7de2 -> 00000000", + "40bdf5b0 -> 401beea3", + "bf3b70e0 -> 00000000", + "c116f11a -> 00000000", + "c025d580 -> 00000000", + "40a133a0 -> 400fa50e", + "c125fefe -> 00000000", + "c192ca18 -> 00000000", + "4180bbfa -> 40805ddb", + "c10f5360 -> 00000000", + "c04a4868 -> 00000000", + "c1368bc6 -> 00000000", + "c0e51b42 -> 00000000", + "c0ee966c -> 00000000", + "c1981289 -> 00000000", + "c1930762 -> 00000000", + "4113c200 -> 40427d34", + "c12ded84 -> 00000000", + "41851dc8 -> 40828879", + "c06b3378 -> 00000000", + "c0cbcdec -> 00000000", + "419fd16c -> 408f06e7", + "c1824847 -> 00000000", + "416b8da0 -> 4075905b", + "411306c4 -> 404201d3", + "c10814a3 -> 00000000", + "408a66b4 -> 4005195a", + "408094a4 -> 40004a3c", + "415d1e44 -> 406debb4", + "419d56ae -> 408de9c4", + "c16fb1be -> 00000000", + "c1198389 -> 00000000", + "c10da1b7 -> 00000000", + "4003bb40 -> 3fb7a390", + "c19721bd -> 00000000", + "c19bf1f0 -> 00000000", + "4189b3c8 -> 4084c335", + "c05eee68 -> 00000000", + "c172ad35 -> 00000000", + "4186d1e4 -> 40835d9e", + "c0d9acc8 -> 00000000", + "c1922936 -> 00000000", + "c198ee29 -> 00000000", + "40068848 -> 3fb994b8", + "c109bfae -> 00000000", + "4073e0b0 -> 3ff9dd87", + "401eaf40 -> 3fc98d57", + "419d2282 -> 408dd23a", + "419bea98 -> 408d4532", + "4163087c -> 407114f8", + "419ac286 -> 408cbed1", + "c12107ca -> 00000000", + "bebff6c0 -> 00000000", + "40f4bcd8 -> 4030fe23", + "41926c7c -> 4088e6fe", + "c10e20b8 -> 00000000", + "400e2d90 -> 3fbec80d", + "4091769c -> 400873dc", + "3fb04100 -> 3f963398", + "c16160bd -> 00000000", + "c19a4cc5 -> 00000000", + "40b36d60 -> 40178c32", + "c142b274 -> 00000000", + "4183654a -> 4081afcd", + "c15fa1a2 -> 00000000", + "c1590e91 -> 00000000", + "418b8af8 -> 4085a599", + "412c838e -> 405226b9" + ] + }, + { + "glsl": "float cultmath_cycles_inverse_sqrt(float)", + "tolerance": "ulp-bounded", + "cases": [ + "c10907ba -> 00000000", + "c19c2098 -> 00000000", + "c1797652 -> 00000000", + "c0e904d0 -> 00000000", + "c17b4050 -> 00000000", + "419e4be4 -> 3e6633bf", + "c186fb3d -> 00000000", + "c101948c -> 00000000", + "4198bf94 -> 3e6a5875", + "3fce6b10 -> 3f499746", + "40553540 -> 3f0c4218", + "c169f167 -> 00000000", + "41103f90 -> 3eaa850d", + "4095dcac -> 3eec976f", + "4090ea44 -> 3ef09889", + "419d0ae4 -> 3e671e8d", + "c19d6bd7 -> 00000000", + "4171560c -> 3e83d4d5", + "412c7c2e -> 3e9bf056", + "405fff78 -> 3f08d6a1", + "40705758 -> 3f041a9d", + "411fdd3e -> 3ea1fa34", + "bfdb7a30 -> 00000000", + "c0eaa784 -> 00000000", + "41723c48 -> 3e839620", + "419759c4 -> 3e6b6cd4", + "41811ea8 -> 3e7ee336", + "40f2e5d8 -> 3eb9d660", + "415e6008 -> 3e895637", + "c178a6e8 -> 00000000", + "c07af138 -> 00000000", + "c170b11c -> 00000000", + "40cbc478 -> 3ecae5dc", + "413b2842 -> 3e95b3a0", + "41034cbe -> 3eb2baef", + "41980b30 -> 3e6ae350", + "411c7ed0 -> 3ea3b626", + "40d40ee8 -> 3ec6e45c", + "c165c77a -> 00000000", + "be25e000 -> 00000000", + "4090a9c8 -> 3ef0ce23", + "40ccdb0c -> 3eca5bb8", + "c0ff3fc2 -> 00000000", + "c19b20fe -> 00000000", + "c1964900 -> 00000000", + "c0800cf2 -> 00000000", + "c0468128 -> 00000000", + "c07e1f80 -> 00000000", + "c1975f39 -> 00000000", + "c13cc83a -> 00000000", + "4180d122 -> 3e7f2fde", + "c110f7ae -> 00000000", + "c08b157c -> 00000000", + "c0c1d3da -> 00000000", + "c14f9248 -> 00000000", + "3fb8d840 -> 3f5507c3", + "400cb858 -> 3f2ca4e8", + "413bdd70 -> 3e956b5f", + "c01afab8 -> 00000000", + "c169f3d7 -> 00000000", + "c182d2c4 -> 00000000", + "c08ed2cc -> 00000000", + "bfffa4a0 -> 00000000", + "416a2610 -> 3e85d6e5", + "c1677651 -> 00000000", + "bfd00c90 -> 00000000", + "bf7d3a20 -> 00000000", + "418a8ba6 -> 3e76107a", + "4183d0cc -> 3e7c4483", + "40b0bd80 -> 3ed9dc20", + "c1226909 -> 00000000", + "c0c9be44 -> 00000000", + "41171d88 -> 3ea699aa", + "c110ec52 -> 00000000", + "4197d57c -> 3e6b0cd8", + "418ad428 -> 3e75d030", + "c0020b88 -> 00000000", + "c014b528 -> 00000000", + "c108c1c2 -> 00000000", + "bf5bd400 -> 00000000", + "40014f48 -> 3f3419ad", + "3de29900 -> 404067c7", + "40d062b8 -> 3ec8a314", + "40b65084 -> 3ed680e3", + "c13a492c -> 00000000", + "c16dc49e -> 00000000", + "4114d9a2 -> 3ea7dcf7", + "c0f267ac -> 00000000", + "40957514 -> 3eece95f", + "c153ce49 -> 00000000", + "c04c5ed0 -> 00000000", + "419050b0 -> 3e71186d", + "c12f39dc -> 00000000", + "c19de9d2 -> 00000000", + "c073c7d8 -> 00000000", + "c13041b6 -> 00000000", + "c1399de5 -> 00000000", + "c02717c8 -> 00000000", + "41713454 -> 3e83de0c", + "4035be48 -> 3f17ea40", + "4187e694 -> 3e78727b", + "bed6f300 -> 00000000", + "bee52ec0 -> 00000000", + "c08e3a64 -> 00000000", + "4192d068 -> 3e6f08e7", + "401a05a0 -> 3f250551", + "3fbf5660 -> 3f51627d", + "c1749e6c -> 00000000", + "c0a129cc -> 00000000", + "c1253a98 -> 00000000", + "c184310b -> 00000000", + "c177a4a0 -> 00000000", + "3e93e640 -> 3fee27f7", + "41937f48 -> 3e6e7b0a", + "4056e158 -> 3f0bb61b", + "40625518 -> 3f082180", + "4110653e -> 3eaa6ecb", + "4144e328 -> 3e91f4a9", + "40c8de7c -> 3ecc5b42", + "c19cd8d9 -> 00000000", + "411124ca -> 3ea9fe30", + "c1569fcd -> 00000000", + "c0eb4678 -> 00000000", + "411b6fe0 -> 3ea44496", + "c134898b -> 00000000", + "c1030a69 -> 00000000", + "c175a546 -> 00000000", + "4112f12c -> 3ea8f312", + "416c05a4 -> 3e854ea6", + "411fecac -> 3ea1f264", + "410f4636 -> 3eab192e", + "c19b5e77 -> 00000000", + "40267980 -> 3f1eba98", + "4109ceac -> 3eae758d", + "4009d660 -> 3f2e70ad", + "c18c7a4a -> 00000000", + "c19b88ac -> 00000000", + "c110b172 -> 00000000", + "40eb0ee8 -> 3ebce937", + "40be6adc -> 3ed1e3d3", + "40694260 -> 3f061828", + "4092f01c -> 3eeeef1d", + "418bb088 -> 3e750dfd", + "c0a015bc -> 00000000", + "c185b619 -> 00000000", + "c0f6e62a -> 00000000", + "c00ff740 -> 00000000", + "c116386d -> 00000000", + "c0462fe8 -> 00000000", + "414a78c4 -> 3e8fedc7", + "bd26f400 -> 00000000", + "c07a0440 -> 00000000", + "4131cad0 -> 3e999800", + "416ae608 -> 3e85a029", + "415c4ac8 -> 3e89fc0c", + "41266cf6 -> 3e9ec092", + "c151145c -> 00000000", + "411d66ac -> 3ea33d66", + "c15293a7 -> 00000000", + "40d15670 -> 3ec82e26", + "c00f6550 -> 00000000", + "4144f9a0 -> 3e91ec56", + "c120a410 -> 00000000", + "409efcdc -> 3ee5b37d", + "3f37f340 -> 3f970041", + "c188d294 -> 00000000", + "3ff5e7f0 -> 3f38b27e", + "413ad086 -> 3e95d6c3", + "c06ddc18 -> 00000000", + "3f6acea0 -> 3f85a6d2", + "403e9a80 -> 3f145795", + "bff74a80 -> 00000000", + "c170a44a -> 00000000", + "c19d6319 -> 00000000", + "c0500928 -> 00000000", + "c1785343 -> 00000000", + "c12e00dc -> 00000000", + "418d33d2 -> 3e73bd05", + "40cdb824 -> 3ec9eedd", + "418374c4 -> 3e7c9cc1", + "4160f368 -> 3e888c5b", + "41609328 -> 3e88a99b", + "c0f705ba -> 00000000", + "c18f3990 -> 00000000", + "c11f6c5e -> 00000000", + "c0e47178 -> 00000000", + "c12887bf -> 00000000", + "40fd70b4 -> 3eb5ee63", + "416d83e4 -> 3e84e336", + "413c08a0 -> 3e955a35", + "41781fc8 -> 3e8203fe", + "c1147804 -> 00000000", + "c17e1dcb -> 00000000", + "c19991e2 -> 00000000", + "c13cf13f -> 00000000", + "413556f6 -> 3e981581", + "c0abc7c4 -> 00000000", + "c0f03abe -> 00000000", + "416475ec -> 3e877ecd", + "c19ce385 -> 00000000", + "4125cfec -> 3e9f0bae", + "40c26358 -> 3ecfbc38", + "41653e98 -> 3e874372", + "417fc71c -> 3e800e3c", + "c1252ddb -> 00000000", + "c190ded2 -> 00000000", + "c10ddcc4 -> 00000000", + "412c9104 -> 3e9be6eb", + "c0045ec0 -> 00000000", + "41149e0c -> 3ea7fe9a", + "3fa36ea0 -> 3f628e6d", + "c12b7bff -> 00000000", + "c184bab3 -> 00000000", + "c1197d30 -> 00000000", + "4147b7d0 -> 3e90eaec", + "406e4e18 -> 3f04aac9", + "3cf8fc00 -> 40b78d49", + "c14230f1 -> 00000000", + "c0a22a68 -> 00000000", + "c1424811 -> 00000000", + "4156e298 -> 3e8bb5b4", + "416004a4 -> 3e88d50c", + "4186a650 -> 3e799945", + "409100b4 -> 3ef085ec", + "40ad1a48 -> 3edc2313", + "c0f7c2ba -> 00000000", + "c0c19708 -> 00000000", + "c17d8086 -> 00000000", + "41422b0c -> 3e92f962", + "40ad4d80 -> 3edc0289", + "411d90a0 -> 3ea327a8", + "41850e42 -> 3e7b16dc", + "c1850726 -> 00000000", + "40c14638 -> 3ed0553a", + "c15ee662 -> 00000000", + "c1403e42 -> 00000000", + "419daa48 -> 3e66a99c", + "c06d27e8 -> 00000000", + "4146babc -> 3e914715", + "c13daebb -> 00000000", + "c1922dfc -> 00000000", + "bfa8c610 -> 00000000", + "c1202ff7 -> 00000000", + "c1671a26 -> 00000000", + "c1186533 -> 00000000", + "40c7378c -> 3ecd33bd", + "c14b029e -> 00000000", + "415b5f64 -> 3e8a4600", + "c13adb94 -> 00000000", + "408ef674 -> 3ef23bb0", + "c10b2586 -> 00000000", + "c153b2f1 -> 00000000", + "418c7bea -> 3e745c5b", + "40cd7c00 -> 3eca0c68", + "c150a9a2 -> 00000000", + "4182e5a4 -> 3e7d26b7" + ] + }, + { + "glsl": "float cultmath_cycles_modulo(float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "4113e508 c12341c2 -> 4113e508", + "c116c606 418b59c2 -> c116c606", + "40fe1bc0 c1505c3e -> 40fe1bc0", + "419532fa 41484190 -> 40c448c8", + "419b86b6 4094a2a0 -> 3f5c82c0", + "c1616db4 c0286208 -> bf6f32a0", + "c17a96cf 408fec24 -> c00ad264", + "40807dec c1821cc5 -> 40807dec", + "c091d75a c1536679 -> c091d75a", + "c15dec1a c0a8094e -> c0578b30", + "40806938 413466c8 -> 40806938", + "c0be34e6 419978ae -> c0be34e6", + "c170debf 3e754580 -> be50dac0", + "417d5b0c c145502e -> 40602b78", + "c0bc6774 40450e40 -> c033c0a8", + "41989258 c0433128 -> 3f45af40", + "bf6b3420 c124b1a9 -> bf6b3420", + "bfa11a60 411e9650 -> bfa11a60", + "c16483f3 41700738 -> c16483f3", + "3e50d900 416c0048 -> 3e50d900", + "3d014a00 c021c620 -> 3d014a00", + "c15e2793 40ba92fc -> c00e525c", + "3ea12f80 411f15e4 -> 3ea12f80", + "4115f634 4074b968 -> 3fdccc00", + "c19c61de c146ebfd -> c0e3af7e", + "413538bc 412c5e50 -> 3f0da6c0", + "3e954340 41435b04 -> 3e954340", + "c0f4d2a8 418fbf22 -> c0f4d2a8", + "417bd8b0 c109b762 -> 40e4429c", + "41479240 c144c735 -> 3e32c2c0", + "c10db74b 412fb624 -> c10db74b", + "bfcc55b0 c068d890 -> bfcc55b0", + "40b25944 410f5e96 -> 40b25944", + "41924d60 416a1ad8 -> 4069ffa0", + "c163e6a0 4161a8a8 -> be0f7e00", + "41902534 3ee1a380 -> 3ec7c100", + "40d2ac44 c109ec60 -> 40d2ac44", + "416b7a10 c15759de -> 3fa10190", + "40a51cb8 41039c10 -> 40a51cb8", + "bf90c100 c09fe946 -> bf90c100", + "412ddee0 c0ffa69a -> 40382e4c", + "c14c8c73 c15747bc -> c14c8c73", + "413c0ad4 c13b39a2 -> 3d513200", + "418544ce 40dbe370 -> 403a98b0", + "418adbd4 3f45e700 -> 3eb34100", + "4162bd9c 41653370 -> 4162bd9c", + "c18bc584 c0efeacc -> c01e80f0", + "4066de40 4110cb26 -> 4066de40", + "41988c98 411c0e90 -> 41150aa0", + "c19df193 4135aae4 -> c1063842", + "413a7b24 416bdb5c -> 413a7b24", + "bff75820 c15a6c62 -> bff75820", + "c1273667 c111d460 -> bfab1038", + "c17cf7d4 c1316988 -> c0971c98", + "418bf07a c1630f76 -> 405345f8", + "c0e62030 c147c35d -> c0e62030", + "414860bc c021e470 -> 4019f130", + "c04a9858 41990e00 -> c04a9858", + "40710a50 c10242f9 -> 40710a50", + "40937e10 c02e66f0 -> 3ff12a60", + "4144d4f8 c10956fa -> 406df7f8", + "418a3198 409f75e0 -> 4014c980", + "419f7584 c1827482 -> 40680810", + "c0059f78 c0bd68ec -> c0059f78", + "40f8b81c c1655117 -> 40f8b81c", + "c148730c 41767fc8 -> c148730c", + "40fefe68 40f079f4 -> 3ee84740", + "405640e8 418101c4 -> 405640e8", + "415f17b8 c1991008 -> 415f17b8", + "4187f756 3f5df340 -> 3f05dd00", + "c17e41cd 40f7e648 -> becb70a0", + "411610c4 4138c722 -> 411610c4", + "c1409178 40d501f8 -> c0ac20f8", + "c19196a7 40a1dc28 -> c0418c48", + "417ab0b0 408f3720 -> 400f7800", + "c16b776e 40e6b850 -> be97e3c0", + "c16db077 403eda60 -> c03b585c", + "41986af8 3e748780 -> 3e3fab80", + "418bbc16 41515a0c -> 408c3c40", + "c159576a c1624d62 -> c159576a", + "414f9380 4121bca4 -> 40375b70", + "3f91d350 413d320c -> 3f91d350", + "4192b1ca c0263f88 -> 3e1d1980", + "bee85200 c16fdc3c -> bee85200", + "4161f6ac 3f356620 -> 3f28d660", + "c16cfbb8 40398a98 -> bea1cf40", + "c0a46346 c1821016 -> c0a46346", + "c0daafde c1771e2c -> c0daafde", + "40026108 c16463f3 -> 40026108", + "c03ece60 c0d72be8 -> c03ece60", + "c190dddb 414daa10 -> c0a8234c", + "bfcb2940 c1859fc1 -> bfcb2940", + "c19cecd4 3e8619c0 -> be6f8700", + "41243042 c1703763 -> 41243042", + "4107670c c18720f2 -> 4107670c", + "419545ae c1992129 -> 419545ae", + "41673758 41323c0c -> 4053ed30", + "40fc976c c0bffce0 -> 3ff26a30", + "c1564746 418c6f5c -> c1564746", + "4153638c 4128fe6a -> 40299488", + "c14e3c74 41865778 -> c14e3c74", + "412ef768 c0a14b64 -> 3f5ac040", + "bf368b80 401897b0 -> bf368b80", + "c0f4e46c c194c825 -> c0f4e46c", + "c122f17b 4167f418 -> c122f17b", + "41919cee 413bdc1e -> 40cebb7c", + "c07bc970 41523e88 -> c07bc970", + "c18048d6 c19f0b49 -> c18048d6", + "c104de36 c00a1850 -> bfea5fd0", + "41370bb2 bff669c0 -> 3fe84cd0", + "40e47fc0 c0ae165c -> 3fd9a590", + "c05d0d28 41303890 -> c05d0d28", + "40032c20 c17ab965 -> 40032c20", + "41072b4c 406e4948 -> 3f803540", + "c084d7c4 41995342 -> c084d7c4", + "418f948e 408f730c -> 3c860800", + "c0ef8f00 40ce9bf8 -> bf83cc20", + "c15d5980 c16e6aa4 -> c15d5980", + "c190a6ab c1845fbb -> bfc46f00", + "40805270 bffffca0 -> 3c284000", + "c1415cfd 410dc08c -> c04e71c4", + "4172ba18 415f72f4 -> 3f9a3920", + "c1717bc1 c15150c2 -> c000abfc", + "40996010 c1958399 -> 40996010", + "40e59b70 40f8c490 -> 40e59b70", + "c18d901d 410c3ece -> be28a780", + "c15e2cfa c09b9e74 -> c0851d0c", + "c184a0ba 4148cebc -> c080e570", + "3e7c8e00 419f5f6c -> 3e7c8e00", + "414e8f48 c0a15ea4 -> 4034c290", + "415efaa0 4109fb7a -> 40a9fe4c", + "40b1b72c c11597fb -> 40b1b72c", + "41846580 c0c8ff54 -> 407f2eb0", + "bf45c620 4119bfa8 -> bf45c620", + "40df3014 4196ec7e -> 40df3014", + "41919b62 c13c1ec1 -> 40ce3006", + "415d50b4 c0d1e970 -> 3f367440", + "c11d703a 41923faa -> c11d703a", + "bf1c5440 40252708 -> bf1c5440", + "40c368a0 c09bc86e -> 3f9e80c8", + "beed2dc0 40e464fc -> beed2dc0", + "4184624e 410131d6 -> 3ecc1e00", + "4186e35e c12d15b2 -> 40c16214", + "bfd0cc00 418b03de -> bfd0cc00", + "40423dc8 c0cc5074 -> 40423dc8", + "409b4648 c1900617 -> 409b4648", + "c1174ebc c12f2776 -> c1174ebc", + "40820ba0 bf358760 -> 3f04b820", + "c1858d86 4090a424 -> c0489358", + "418b53fc 413303e8 -> 40c74820", + "40f6173c 4172f060 -> 40f6173c", + "c0b53e78 4104f4bc -> c0b53e78", + "41192b84 4160fe88 -> 41192b84", + "416eee18 414ac7c0 -> 40109960", + "c1705f00 c16dc0c7 -> be278e40", + "c0dad800 418d543a -> c0dad800", + "c0c5eaf4 c00e3208 -> bfdee3b0", + "4176ba1c c15337e2 -> 400e08e8", + "414136e0 418bd4e2 -> 414136e0", + "c0c6bd6e 40ebc160 -> c0c6bd6e", + "417599d4 3fecdf20 -> 3f0bab40", + "c156cfca c0d47f78 -> be141480", + "c0bf9456 4181a17a -> c0bf9456", + "418d97fe 4098f058 -> 40571de0", + "41160578 412de83c -> 41160578", + "416f9a60 416de8a8 -> 3dd8dc00", + "40a54394 416eb068 -> 40a54394", + "40ee2054 408b4c60 -> 4045a7e8", + "c0e65c8c c13c3022 -> c0e65c8c", + "4194032a c1899be5 -> 3fa67450", + "c0b80794 40b63d84 -> bd650800", + "414666bc c006bf20 -> 3fefbea0", + "c19c5e1c 40e5f55c -> c0a58db8", + "4102e94c 414c3dc4 -> 4102e94c", + "c0cbc322 c02f0940 -> bf65cf10", + "40e6e158 c162c4ce -> 40e6e158", + "c1144f35 c11f38b9 -> c1144f35", + "417d6a14 c1629044 -> 3fd6ce80", + "4109c02c c1982fbf -> 4109c02c", + "c0b68232 4155e890 -> c0b68232", + "4182e744 c11d8a14 -> 40d088e8", + "c1859edc c0bc8e76 -> c09d5e84", + "c11d5b26 bfdaa540 -> bfa59ef0", + "c0eff2a6 bf8d2f10 -> bf616070", + "41256356 c10eec16 -> 3fb3ba00", + "415ff664 40759c00 -> 401f0590", + "4197d1b8 c11026ee -> 3f755940", + "c0dc370a c12584ed -> c0dc370a", + "41173528 410adffe -> 3f4552a0", + "c0e30708 40da7650 -> be890b80", + "c13fa65a c1710dc9 -> c13fa65a", + "c10da642 c0fc7072 -> bf76e090", + "c182c438 41125f2c -> c0e65288", + "40846fbc c09c4afc -> 40846fbc", + "4198a32a 3fcd0370 -> 3fbb0cd0", + "417be608 c102cec7 -> 40f22e82", + "415f10f8 c16de240 -> 415f10f8", + "c1590654 c17e79b7 -> c1590654", + "401971e8 bfda9050 -> 3f30a700", + "c14454a1 400a61c0 -> bfbad388", + "c0aa17fe c12b70d3 -> c0aa17fe", + "c18c92c8 c18b7abe -> be0c0500", + "40511d30 c184fb2a -> 40511d30", + "c152683d 419debdc -> c152683d", + "41877166 40c5de00 -> 40920998", + "c06715b0 419f7016 -> c06715b0", + "41012404 40ef0780 -> 3f1a0440", + "40ab1dd8 4136dc54 -> 40ab1dd8", + "41980e16 4132fa82 -> 40fa4354", + "c118becb 3f822d60 -> bec977e0", + "4162737c 418b1616 -> 4162737c", + "be3b0d00 c1343d19 -> be3b0d00", + "c095a436 400b14b0 -> bea8f860", + "411e5608 415d85b0 -> 411e5608", + "c177209a c12fa1ce -> c08efd98", + "40e83d34 c10d78cd -> 40e83d34", + "3f7349e0 412be40e -> 3f7349e0", + "c0fb71b2 4195e53c -> c0fb71b2", + "c18bf41d c136b0c6 -> c0c26ee8", + "410d8078 c19dc90e -> 410d8078", + "40131da0 408cc048 -> 40131da0", + "bfe84250 c0e3515c -> bfe84250", + "c16c9a26 417d05d8 -> c16c9a26", + "407034d0 c15872c8 -> 407034d0", + "be5c4b00 c09fc550 -> be5c4b00", + "c16e95e5 413361f8 -> c06ccfb4", + "c1429340 40d6cb60 -> c0ae5b20", + "410024f6 c02ce0a8 -> 4026d288", + "41177b62 415b1788 -> 41177b62", + "40e7b940 c1973eef -> 40e7b940", + "c0d098b8 c0dfdbda -> c0d098b8", + "4172f854 40fd0934 -> 40e8e774", + "41976834 c16c4ca0 -> 40850790", + "bf82a390 418a9ffc -> bf82a390", + "c09586d0 40d388e8 -> c09586d0", + "410ec48c 4126ccf4 -> 410ec48c", + "c18d42fc c11d2cae -> c0fab294", + "4195bf22 c123eca9 -> 4107919b", + "bf4cb8a0 c1514386 -> bf4cb8a0", + "c183d17a befafe80 -> be999000", + "41935bfc 405b2340 -> 3fa65f40", + "c0be1248 4118c20e -> c0be1248", + "c18085f4 41805e50 -> bc9e9000", + "c18572c7 4163ceec -> c01c5a88", + "c18a2074 416d7f50 -> c01b0660", + "c12bb0e9 c132ffc2 -> c12bb0e9", + "3fab94e0 40f7fcb0 -> 3fab94e0", + "40d97480 c12b4aa9 -> 40d97480", + "411367d2 4124731c -> 411367d2", + "c0c0f22c 419fd93e -> c0c0f22c", + "c04a96d8 40cd9a74 -> c04a96d8", + "413250a0 4152ca60 -> 413250a0", + "40c2b198 c0aac5b2 -> 3f3f5f30", + "410de7f4 418d4cb8 -> 410de7f4", + "40ffcedc bfdf7310 -> 3f816f30", + "4190c9b0 4022fba0 -> 3e8b6100" + ] + }, + { + "glsl": "float cultmath_cycles_floored_modulo(float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "4122ba7c c1444b6e -> c00643c8", + "c18a9aeb 4120ead0 -> 40327f28", + "41978d9c c165c9bc -> c11c7840", + "407e4208 c188f61c -> c1525bb6", + "c190b389 4097b940 -> 3f60b6e0", + "416980e0 3ef7a900 -> 3da93800", + "c02a2a88 3de22800 -> 3dd09700", + "c12ea5a7 c0ad08a4 -> bdce8180", + "40586448 4116c8ee -> 40586448", + "3f0ab860 410ec15a -> 3f0ab860", + "414f3590 c183aab7 -> c0607f78", + "c18a991e c1001543 -> bfa83db0", + "41447830 3f62c7c0 -> 3f435e40", + "c1844b5f 411456f0 -> 40005c88", + "c14d2b52 c1657efc -> c14d2b52", + "c15c1881 408f5af0 -> 40853abe", + "4185f5f8 40d7205c -> 40532e50", + "bfadd200 c0cc83ee -> bfadd200", + "40a26860 4185e7b8 -> 40a26860", + "c11a65e1 4064c638 -> 3f897648", + "c15b1d67 c10e8cdc -> c0992116", + "41908cc6 41417da8 -> 40bf37c8", + "413d4c5a c1156ca8 -> c0db19ec", + "c08555fc c1606b84 -> c08555fc", + "c166bd33 c0b72778 -> c03e56ec", + "c0b6ff46 41948f42 -> 414d9ee1", + "418db30c c12d2df8 -> c07bd760", + "41198958 40d41fd4 -> 403de5b8", + "c16f1933 412adf6e -> 40cd4b52", + "418e3950 bff88a30 -> bfd1d0e0", + "c18e997f 416b3990 -> 41394022", + "417b3f18 41820bf6 -> 417b3f18", + "bfc056f0 c11e2c99 -> bfc056f0", + "406f4560 4129e530 -> 406f4560", + "c19440b9 41779c50 -> 4146b72e", + "41184782 40d49348 -> 4037f778", + "bf6d1320 4187bcfc -> 41805463", + "40277b00 3fee1360 -> 3f41c540", + "c1686efa c116afe4 -> c0a37e2c", + "3e279880 3fcf26c0 -> 3e279880", + "c16f2886 418bea62 -> 4022b0f8", + "406c5090 414e686c -> 406c5090", + "413600a6 c1453704 -> bf7365e0", + "40d88ec0 40f233d0 -> 40d88ec0", + "4189036c 414035d8 -> 40a3a200", + "c13728c4 416654c0 -> 403caff0", + "4197ae68 4144ab64 -> 40d562d8", + "3fb32460 c10656fa -> c0dfe4dc", + "c09397ea c1917f2e -> c09397ea", + "c0cceef4 3fdbc7a0 -> 3eed8ac0", + "40dd8400 40a6dfac -> 3fda9150", + "c177ea12 c11e5982 -> c0b32120", + "40984988 40f46d74 -> 40984988", + "bf0104a0 c19a09ef -> bf0104a0", + "40d1e68c c1443914 -> c0b68b9c", + "3f93f720 416796b0 -> 3f93f720", + "c117bef5 c075c8e8 -> bfe6d408", + "c0dfd180 c17507c2 -> c0dfd180", + "c10fda91 c18994a9 -> c10fda91", + "c171e8bc c112d3da -> c0be29c4", + "40563020 41815bb8 -> 40563020", + "4157de54 c128b748 -> c0f32078", + "40dd8a28 4171f2c0 -> 40dd8a28", + "40f5d9a8 40d906d4 -> 3f6696a0", + "c08dd528 c10fca46 -> c08dd528", + "c158719f c182b84f -> c158719f", + "4187e3cc 419392b8 -> 4187e3cc", + "416b22dc be261680 -> bd829100", + "414fbed8 c0cd24b4 -> c0c7f06c", + "c13dbc58 c1821b0a -> c13dbc58", + "4102d946 40c0b680 -> 4009f818", + "c197ecaf 41163fea -> 4112e660", + "c112490f c0bd7eec -> c04e2664", + "40784ed8 40333c20 -> 3f8a2570", + "bf36bdc0 c0524ec8 -> bf36bdc0", + "c19b3e34 c0ed4544 -> c0926e48", + "41877530 c189d1d0 -> be972800", + "4192f676 412c0a92 -> 40f3c4b4", + "413b917e 4170cd38 -> 413b917e", + "404b85a0 411a3204 -> 404b85a0", + "419fa4f4 414b6c4c -> 40e7bb38", + "40a5ad6c c08e84e8 -> c06eb8c8", + "c195e3ba c02041f8 -> bf9aa010", + "418be78e c0fdc8ca -> c0c9bc28", + "3fbb5760 4152af98 -> 3fbb5760", + "c104c698 418b5be4 -> 4111f130", + "416a9304 c196d954 -> c0863f48", + "40294b70 418a9864 -> 40294b70", + "417290d0 c17e6195 -> bf3d0c50", + "4194c8e4 c0e4f6ee -> c0378270", + "c10c20f6 c171e234 -> c10c20f6", + "c14810bc 4196d490 -> 40cb30c8", + "c1194ddd 415e3104 -> 4089c64e", + "c1545afd 41636b34 -> 3f710370", + "c19f63be c18073dc -> c0777f10", + "4101d628 418f78d0 -> 4101d628", + "41268c3e bfbf72e0 -> bd784600", + "c181bffd 41776cf8 -> 416b59f6", + "c1993dbc 40aed228 -> 402ca360", + "41020760 4155c770 -> 41020760", + "c05a3a40 c10307e6 -> c05a3a40", + "c1954df2 40c3c914 -> 40b9ec88", + "c16fcd1a c1869a18 -> c16fcd1a", + "c004d6a0 417c9d08 -> 415b6760", + "3e026100 c197a1ee -> c1969d2c", + "417979c4 40f3e624 -> 3eb27400", + "41839db8 c11aa320 -> c0382b40", + "bfcd6840 41712c1c -> 41577f14", + "40a6fa10 40ca5b34 -> 40a6fa10", + "c16df496 c149f878 -> c00ff078", + "c113b580 c185ce0d -> c113b580", + "c1001ce9 c01eb570 -> bf114d50", + "c16f268e c0c77072 -> c01ed870", + "c14fd475 c075fa80 -> bfbac4a8", + "418ae6aa 40e5cbc8 -> 40400630", + "4183d620 c124d847 -> c084089c", + "c080d1ec c16c35a9 -> c080d1ec", + "4182098c 419b7378 -> 4182098c", + "c183a328 3fb055d0 -> 3d9d3400", + "415d7638 c14c19ae -> c13abd24", + "c08132ac c110f804 -> c08132ac", + "c0bd3c9a 41983e30 -> 4151de13", + "c13a617a c19c0e75 -> c13a617a", + "c19424e8 3d97ae00 -> 3d92b200", + "c19f20aa c134ac14 -> c1099540", + "c11c100d c0af5220 -> c088cdfa", + "3eabb580 3f3ffd80 -> 3eabb580", + "4025f3c0 c0d5e4ec -> c082eb0c", + "419e8a80 407445e0 -> 3f3bda80", + "3f8858c0 4133eb20 -> 3f8858c0", + "41815022 c191db84 -> c0045b10", + "419367da 414f23a0 -> 40af5828", + "c176f01d 40bca410 -> 401017ec", + "c105a3f8 4133711a -> 40373488", + "c0bd6c70 bf849fc0 -> bf3d2600", + "4138726c c18146d9 -> c094368c", + "4147b760 418f128c -> 4147b760", + "4136a0dc 419ea142 -> 4136a0dc", + "41130234 c0e13294 -> c09c60c0", + "c12d4be2 c17709a4 -> c12d4be2", + "c0f6dcd4 40ddf860 -> 40c513ec", + "c07cf530 410a7968 -> 40967838", + "c0442840 3ffaaa90 -> 3f5a0940", + "4115ca0e 41739734 -> 4115ca0e", + "402935a0 403c1640 -> 402935a0", + "419ce8f8 be8af940 -> be4daa80", + "c19d8030 c18b3a74 -> c0122de0", + "c10eb9f4 c0b9c49a -> c0475e9c", + "c0ef8f70 3f91f0a0 -> 3efd5a80", + "41676c80 401d31f0 -> 400bb850", + "410d870e c11bbae9 -> bf633db0", + "c1601a6b 3f929510 -> 3f617cf0", + "c0347a00 c159825c -> c0347a00", + "40027e38 401ce250 -> 40027e38", + "41155efc 4030e9b0 -> 3f857dc0", + "408416ac 40db5c98 -> 408416ac", + "c0ab454c c05fad08 -> bfedbb20", + "bf8533b0 c12c5be9 -> bf8533b0", + "40b70c88 c123a9b1 -> c09046da", + "c07f4940 4026ea48 -> 3f9d16a0", + "418443fe c064eca8 -> bfacfeb0", + "c136dc4e 41324436 -> 412dac1e", + "bf265e40 c10335cc -> bf265e40", + "c183c6a9 411e2c48 -> 40532cf8", + "40d9be18 c031f358 -> bfc4bbb0", + "40ea1478 c13f3be0 -> c0946348", + "bfc02e30 40d6cf44 -> 40a6c3b8", + "c0892162 c18fd9c1 -> c0892162", + "3f716980 416e7010 -> 3f716980", + "c1086819 c11787b4 -> c1086819", + "419f5ae2 c1516e87 -> c0c84e94", + "c161c7c9 419f097e -> 40b89666", + "41967d1c c0e7b8be -> c03a6b90", + "c16eb524 4073ab88 -> 3e9ecc80", + "4068c640 c1912f05 -> c1682c7a", + "41079770 c18a0f04 -> c10c8698", + "c16def9b c1024e14 -> c0d7430e", + "40bd8900 c0f27b90 -> bfd3ca40", + "c1926f4d c0a4bd44 -> c0370ad0", + "c191a3bc c169e8b4 -> c0657b10", + "c188fa85 41427344 -> 40e5e2fc", + "417a5988 c0fc4860 -> bdf76c00", + "41773030 c07ae328 -> be6cbe00", + "c13a4bec 40fdeb70 -> 40873f08", + "c199ad49 c043cbd0 -> bf5a8da0", + "41048d7c 412d1632 -> 41048d7c", + "41925f34 c1684a9d -> c12bd6d2", + "402c1338 4119f684 -> 402c1338", + "c1177362 c134ef4a -> c1177362", + "414549fc c1568986 -> bf89fc50", + "c15480a8 be8f06c0 -> be1baf80", + "c15c0544 409e7a2c -> 3f8d8ff0", + "410bebbc 40925088 -> 408586f0", + "c188a623 c155b7b3 -> c06e524c", + "c199ae6f c185a974 -> c02027d8", + "c19d6a73 c15e8ac4 -> c0b89444", + "4151b788 c15e7f65 -> bf4c7dd0", + "c14592ab c143bd7f -> bdea9600", + "c10bc80e 415c5c68 -> 40a128b4", + "c1791d34 402ecc10 -> 3f514e40", + "c1799072 c036ab70 -> bfa9d130", + "404115d0 c154db7d -> c1249609", + "c0cdd710 418d409e -> 413395b4", + "c178dc70 419d2d82 -> 4082fd28", + "4112ad20 418266fe -> 4112ad20", + "c190e534 415010b0 -> 40fcadf0", + "40215d88 41734210 -> 40215d88", + "41954bfa 404a0cb0 -> 40382060", + "40bcf110 c114e390 -> c059ac20", + "4057c050 c111f815 -> c0b81002", + "c0dad908 c1924a1d -> c0dad908", + "40e4a530 418bfc2c -> 40e4a530", + "c0587838 400c6108 -> 3f8093b0", + "418daf56 41433dd0 -> 40b041b8", + "418ea406 c0a27b66 -> c01ebb00", + "bfd20b70 c04f3f20 -> bfd20b70", + "c17bd216 c1266906 -> c0aad220", + "c18e7c8a 41192a34 -> 3faadaa0", + "4185a12c 419c6b1c -> 4185a12c", + "c109d762 41316a80 -> 401e4c78", + "3e012d00 c185d3a4 -> c184d14a", + "c0219348 c1782ad9 -> c0219348", + "c194c441 c14ae596 -> c0bd45d8", + "40647770 418f3abc -> 40647770", + "c1491758 408fd454 -> 3f6a7260", + "3fee4fd0 c19b723f -> c18c8d42", + "c11993ae 4158dae0 -> 407d1cc8", + "c126e079 c18a7e1d -> c126e079", + "4120028c 40b09a3c -> 408f6adc", + "41214292 4135fc36 -> 41214292", + "419f9148 c0f8347a -> c054b0a0", + "c1917686 c0b82a5c -> bf6ad820", + "c003c258 40a40ac4 -> 40445330", + "410be2c6 c0e27f30 -> c0ad38d4", + "41503b24 c12e9242 -> c10ce960", + "40ce81a8 40cb4498 -> 3dcf4400", + "419a79e8 41448594 -> 40e0dc78", + "412c0338 c121c53c -> c1178740", + "4087a130 4029f5b8 -> 3fca9950", + "4180c06c c12b3878 -> c0a9e030", + "4194fd34 419e7498 -> 4194fd34", + "4098aa50 c0d54438 -> bff267a0", + "4150f854 c00d73c0 -> be4d5300", + "c15a3c1b c114acf6 -> c08b1e4a", + "c19fc447 419c0192 -> 41983edd", + "419c93d4 c10d0ac6 -> c0dbf154", + "c1286c58 3c31a000 -> 3a080000", + "413247ee c141e10f -> bf799210", + "c1945d1e c18627d2 -> bfe354c0", + "40d18b78 c06e3790 -> bf6560c0", + "bfb642d0 c115a28e -> bfb642d0", + "c171c5a9 4192bd74 -> 404ed4fc", + "419054aa 417827ac -> 402206a0", + "c195ec28 bff0ca10 -> bfe7a7f0", + "c189942c 419d7262 -> 401ef1b0", + "bfc66690 c14a7ae2 -> bfc66690" + ] + }, + { + "glsl": "float cultmath_cycles_wrap(float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "4116cc44 3ec7b0a0 40cc01d0 -> 405c2384", + "c19ee350 406f2138 4087b510 -> 40764818", + "3f979400 c11ec9d3 bf1df420 -> c101f811", + "bffb8230 c0636e14 40d837fc -> bffb8230", + "c127b9ea c01768ca bfc7c568 -> bfd04970", + "bf338960 c116e12d 3fb79120 -> bf338960", + "c1390b00 3f0101e0 4100dbda -> 406231e0", + "be3c5100 40ab8fe2 407f39e8 -> 40a9e930", + "416eaed8 404db478 c01696e0 -> bfe44d50", + "418c6854 bfde1280 4083dd26 -> bc840000", + "c14184a0 c11d36a9 3f067fc0 -> bfdf2fd8", + "4143a288 3f6147c0 408b189c -> 3fe9d890", + "40e85530 40b00e8e 3e51ca80 -> 3ffb53d8", + "c0e0de98 3f82f778 404cb2c0 -> 3fd63dc0", + "418c1850 c11bac0b 410e0a3e -> bf8c2d40", + "c109fda6 408d34d2 3fb176e8 -> 405ec228", + "bfaf37e0 3f7b0230 bfc15ba0 -> bfaf37e0", + "bd864e00 40b3efc2 410b8978 -> 40c42d24", + "c10c3296 c0a64279 40a0eb28 -> 3fbb21d0", + "c1739b26 c0ec757a c117a4d0 -> c10f5ced", + "c0d9fefe 3fe88758 3fe7c3e8 -> 3fe7eea8", + "41286458 c09deba6 c06e9374 -> c07d9cc0", + "c0f12ff8 bfad71d0 40d822a4 -> 3f127900", + "4102f608 40c09cd4 c09dd0e7 -> c0310358", + "c18c5506 40f7644c 4117b130 -> 410b478a", + "c124a1ae 3f937878 40a2e7f8 -> 3fc368c8", + "41238878 3fe2b200 410cd2b6 -> 404c3008", + "414856d8 bf0a42e0 40e91b1c -> 40964a38", + "c10bcbf2 407f0ff8 c0ae5d14 -> 3f326960", + "4066f418 3efd5200 c07b2920 -> bf4f7d20", + "419516ba 3f9f16f0 40390810 -> 4009d7e0", + "bf2280c0 411e4818 41134e04 -> 411a7f20", + "c189cbcd c0d033b6 40a69390 -> c0b067ee", + "40a6bc68 41174d2a c0876eb9 -> 40a6bc68", + "41143b14 40a722fc 409ec372 -> 40a27d88", + "c1528600 bfa18a40 40fc8b78 -> 40a4d010", + "4193d84a c113c874 4069bed4 -> c0e97f7c", + "419f0198 c02e473c 3f56f040 -> bfc00e10", + "c1847785 3eaa9ac0 c0f495ce -> bf1af900", + "4110d5e2 bebcfb80 3f8a3170 -> 3eb834c0", + "c1847652 408daafe 41026736 -> 40b8fb4c", + "3fadb9b0 4098c892 c0a728ea -> 3fadb9b0", + "408b5624 3fc5f800 40fad418 -> 408b5624", + "c19b9cd4 c0d10a14 c015dc5c -> c02c0770", + "419e2a34 c0efd5bc 40142458 -> 3e1b2000", + "40c22848 c105f21f 408794a8 -> c0d1509e", + "c175a858 c0f945f1 c0981571 -> c0c7bf30", + "c0d5d118 402418e8 be899f80 -> 3fe888b0", + "409b180c 41161524 c0c116a5 -> 409b180c", + "c17e59fe c0027206 bee19780 -> bfc26060", + "415b31d8 c048daf4 40773800 -> be9af440", + "c13bf8cc 3f6256d0 c09f10aa -> bd1d4800", + "c0987a4c c0c17c22 c118d2cb -> c10451e0", + "3ebd8b80 3f9f3bb8 40e61f70 -> 40ca293a", + "c19f2452 410f751e 40e9792c -> 4107f864", + "c1003268 c11f289b c0a74de2 -> c1003268", + "418865ee bfa80cb8 bfa5c858 -> bfa655a0", + "c070a9d0 400cfc70 c025138c -> 3f82cc58", + "c1055e32 40a1fbe6 c10230ba -> 409ba0f6", + "c04a5e70 4104159a 40ac9e4e -> 40ad777a", + "c1930922 3e00a200 c0cd48fd -> c0a9886e", + "c05c49b8 c0d26b7e 40d36368 -> c05c49b8", + "40f2eba4 40b84d34 3fcf7da8 -> 405cfbb4", + "c0adba56 c092aeb6 40f597e4 -> 40da8c44", + "40f27478 4008d698 3f775900 -> 3fdbce70", + "c078d380 c0593fd0 40664470 -> 4046b0c0", + "409bd9b8 c0648326 41153dbe -> 409bd9b8", + "41931b9e c0cf25da 41146514 -> 4028fcec", + "c19253b1 bfa28ed8 4095144c -> bf0135e0", + "c0e3b46e 4104b2b4 40ba4ef4 -> 40f6d24a", + "c15aaf34 41132d3c c089a754 -> be2b9380", + "c11e43e2 bf200b00 c10e1b10 -> bfd14c10", + "40e6d0d8 3fe32730 40b155ba -> 405c89d4", + "c194f51d 400caf8c c0b69e6a -> c033d028", + "40c9a568 3f9ea420 c0d75477 -> bfd5605c", + "4003d820 408a9b50 c11ef68a -> 4003d820", + "414e8b18 40f8d6ac bfc590c8 -> 4065b6a4", + "c05e0eb0 40bf7b88 3fe9b310 -> 409b1630", + "414222d0 c10624c1 c059aa2e -> c0f98c0c", + "c1361328 c024d616 40963838 -> 404a406c", + "c180d873 c0295fee 40eee7cc -> 4083cdbc", + "41399076 c0bc2df7 c072125c -> c0a6055c", + "407cfce0 bfa20788 c0e79354 -> c0012604", + "be9bd800 408e62b4 409a964e -> 4094e152", + "4180e640 3fdf5c58 408766a6 -> 406b9660", + "412119e4 c07d36ec 4012623c -> c01acac0", + "41401ea4 be33ad00 408cc0fa -> 40370108", + "4113015e bc4aa000 c117b8a3 -> be9093a0", + "c0a899b6 409cd478 c0d92110 -> c0a899b6", + "40f7d7d0 bf819ac8 c00f6fbc -> c0056320", + "41109ef6 bf342360 c0b4cb2b -> bf5a7c90", + "c192713f 410be356 c0a4f842 -> c08d060e", + "c0cb0c68 40eb423c c0385204 -> 4078bdac", + "4161b4b8 4110db68 c08ce2ce -> 3f267e90", + "4169a640 c0592c50 c0d58c08 -> c0a276c0", + "40e80b00 3e55fa80 c0b85b8f -> c0960bc6", + "41730620 c10f7b8b 40b251f4 -> 3f2619b0", + "4109f9ca bfd8c728 40f33260 -> bf2b84b0", + "c19b4461 c029648a 40ebb558 -> 3f1deda0", + "415e5910 bfc88ab8 bf481370 -> bf82ca80", + "c15fe81e 4101a9a8 411bf268 -> 41101262", + "41202488 40aa824c c09b18de -> be2a4340", + "3f761780 40e6aefc 404020d8 -> 40a56180", + "bf9d08c0 bfe57f98 bfa776d0 -> bfdb1188", + "c11aa5de 410f34f6 3f455e40 -> 40d6308c", + "c01970e0 40e95b20 c0d3cf28 -> c01970e0", + "41661ac0 406f5b4c c0a9db5c -> c06db908", + "418f9d40 40c8e5c8 c002df38 -> 3fa728e0", + "408bec58 c11cad6b c1102951 -> c11b53a8", + "c0cffb14 c1172cde 3fb1e3c0 -> c0cffb14", + "c0a15b34 bdf7d180 bf8a6c50 -> be7605c0", + "417cd96c 40819cd4 c110ce40 -> 402cf308", + "c104c79f c0f67e48 3fa39e38 -> 3f2eb4c0", + "4182c66c c0db5bf9 404001b0 -> c0573fe0", + "401e5018 bfe56328 4034d19c -> 401e5018", + "c0c7a0b2 bf5b02c0 bf24ddb0 -> bf3d41f0", + "c0caf2d4 3fbf4dc8 3d794e00 -> 3f538ad0", + "40ff0900 411c1f28 40962fac -> 40ff0900", + "c12f2713 c0bf229c c102c93d -> c0d16e6a", + "406551b0 c0e5d1a4 40a3dd22 -> 406551b0", + "c13ac63c c0c8a0fd 40d508b8 -> 3fa074f0", + "c1863442 c10179be 41053fb0 -> beb5e2c0", + "419c5eb2 c02efe98 c0a332e8 -> c0838950", + "beb6f700 c0e19498 409fd968 -> beb6f700", + "40869298 411046f6 3f184ce0 -> 40869298", + "40588f30 c010b30c bff705b0 -> c00fa444", + "41242796 c096397a 3f881600 -> bfa0bb20", + "40512450 411ebdf0 bf716970 -> 40512450", + "c18abcd6 405f9bc8 3df89a80 -> 40392308", + "4107353e 40580100 3cbf7000 -> 3fdfa170", + "4191fafc 4081e3f6 4117a9ae -> 40ed0d24", + "41450a6c 40805314 4116a282 -> 40dd22e8", + "414af820 bec03760 c06cca9a -> bf1cb8e0", + "410fe96c c0391b76 c101f086 -> c0d6271c", + "c13168ce 40e03e4c bfba5fd8 -> 40badae8", + "41221934 c101e265 c11427ce -> c1023d5c", + "c13cd9f0 40356a44 40c936ec -> 40aed510", + "40f05de4 40d52cd8 40f067d8 -> 40f05de4", + "c13e2861 4021e160 c0c61cde -> c04a8668", + "c0999434 c11b776c bfcb0580 -> c0999434", + "c0658c20 c08e77dc 40790068 -> c0658c20", + "411c0da8 3f329270 bf8de238 -> bf8a9760", + "4130860c 40be3ee0 c09fc528 -> 3dc20400", + "40171260 40ab2bac 4101d4f8 -> 40fc85b8", + "c183ae0f c115e0ec 41032a20 -> 3f8d7770", + "bfd0cba0 c0349c3e c0e2c26d -> c0bca736", + "c197ca9d c06f25c2 3fce4ab0 -> c03b7398", + "bf9e6fe0 3e01e5c0 c1175a51 -> bf9e6fe0", + "40ef1110 c09438f7 40ecb720 -> c091df08", + "c1808a3d 4006659c c1084ece -> c0ae588a", + "413361e2 bfa0f718 bf28a4f0 -> bf439ae0", + "417c5c14 c06d6714 c1070af0 -> c0fc3388", + "c080c280 bed76760 c06c2804 -> bf4127a0", + "419a704c 4118c994 c08203aa -> 40b62a5e", + "4137758e 403ac2f0 40ef8974 -> 40dcc320", + "4182c67c 3ffe2c40 40c0eeb0 -> 4086ef10", + "419509ca 409bf114 c094c132 -> bed3d640", + "c191ad38 c03a69c0 4080a408 -> 4025abb0", + "4159abf0 410d3578 40ad78f8 -> 40d973f0", + "40d669ac c10dbd6f c09574b9 -> c0bba8c4", + "403f4150 40633508 c0c4f3ee -> 403f4150", + "c14f278c 40b262b8 c0592d1c -> 409fa374", + "c01d05c8 c0c3b830 408af1b0 -> c01d05c8", + "41546a20 c10cdc1a 40f32858 -> c0481898", + "41535198 c1123ae9 c0524c16 -> c08b4c24", + "c10a69aa 406978f0 40e6adb8 -> 40b2f1ac", + "c15e3e17 40b1fb8c 405877f0 -> 406300e4", + "c18a1bc9 c0eb280e 40e741bc -> c02c0ab4", + "41442394 4096bc52 c1058473 -> bf4bf080", + "412a4758 c10ea7ef c0223cf6 -> c10802bc", + "c0f71dac 409469ea bfc7ee60 -> bfc2e0a8", + "c1904fa5 bfebbef8 c080075c -> c03b3284", + "c17d0fbc 400d3a34 40eafec0 -> 40976720", + "3fe10010 bf198ca0 bff2f300 -> bf56b2a0", + "c1850180 c0ea568c 406b5288 -> c0b40630", + "c08fd312 c0b6ac07 c0717e1e -> c08fd312", + "c0ac6bda 3f905670 c09a5187 -> 3f0fda48", + "418365a0 3e972ec0 c08d766a -> c01c1db0", + "40793d40 3e00fc80 3f6614a0 -> 3f4d9f00", + "c0d86b50 c0269642 c1122cce -> c0d86b50", + "c1218da9 405cee6c c0e66852 -> 3f0e21b0", + "c0c7dfa8 3eff8f40 c05c443c -> c013892c", + "bfd6e080 40b3f0e0 402cf3d8 -> 408535c8", + "c1948f57 c0cd59ed c108f050 -> c0fb9bdc", + "419dd77c 400b43cc c075a5c0 -> 3fd7fe80", + "c1170747 411ae5b8 411f973e -> 411ebd45", + "c14e678b bfcfcb88 3ed685a0 -> bf255d70", + "412db628 bffe0ae8 bd32bd00 -> bf4a1980", + "c176ccf5 c004b428 c0b50902 -> c0958d20", + "c164852e bf7774c0 4100842e -> 406dc718", + "41233610 40af25ee c0a617c6 -> beed1940", + "414f5858 c0825254 40be5738 -> 403c0e48", + "c116546e 4099ecd4 400b6100 -> 40710990", + "c0b86938 41097944 bfaa7398 -> 40852636", + "40e18e0c c05a2e7e c01d20f0 -> c01f6b74", + "c14870e5 41058e24 4101e884 -> 41036efb", + "4196ae3a c05552d8 3ee3c760 -> bd624000", + "3feca0c0 c0ddce1d 411053e0 -> 3feca0c0", + "3f63e0c0 bef43d20 c0920611 -> c04c8c4e", + "40b5fa50 c0ad22df c0edacf6 -> c0cd423a", + "c179191b c06cadc4 c05a4110 -> c05e8ee4", + "41157190 c08c54be bff1ff68 -> c0488aa8", + "41543728 c0d3a964 c070178e -> c07a86c0", + "3edabd40 411fa694 c0a42163 -> 3edabd40", + "c08d0402 40cdcd10 be5cad00 -> 400f5cec", + "c183fd60 c101886e c10935be -> c1057870", + "c172d501 4108d1f8 bed765c0 -> 4031152c", + "c0f1b414 c0d1e1a4 c0f4452c -> c0f1b414", + "c09a6834 c0ba5e08 4019e814 -> c09a6834", + "c106bf86 c07dcb60 40ccf17c -> 3ff96080", + "3f82ea50 401d5cd8 3e61f640 -> 3f82ea50", + "bf4a28a0 c0a31b81 401292d0 -> bf4a28a0", + "c17d7c5e 410daabc c1106141 -> 40023e78", + "4196f7b0 c0395014 409ec5ac -> 404a06a8", + "406f7338 bf4bcba0 c053ed24 -> bfa50280", + "c10da226 c0dbe9e8 c057365e -> c0aaf593", + "bfc396c0 bfa71cd8 c01865e8 -> bfc396c0", + "c13f9a96 3edd2280 c07d8d9e -> c04c067c", + "40bf92d0 40bfc0f0 c0e4753d -> 40bf92d0", + "c138db5d c03ab4ae c108fb5b -> c0bd1a5b", + "41368c1c 3f57b550 40eb3c4c -> 409cd296", + "be9fa880 411b3c50 c01ec288 -> be9fa880", + "4114ceea 41031046 3fc3a250 -> 4028cbb8", + "416fd130 411ac0d0 c0de6654 -> bfd11650", + "c198d47d c0e0c464 3fb92ff0 -> c00a6268", + "4113c3f6 408b4928 408797ce -> 4088bdce", + "4135b166 c0ff91f4 c10f3a10 -> c10e9568", + "c10770c7 40d1b350 40eae184 -> 40e8ba82", + "c01b6e38 c0601044 c0ff23be -> c0dcd2b8", + "c13a297e 40d3940c bf8b71c0 -> 40711bf8", + "bf920ad0 40fb5f00 3fe2bf38 -> 409e2c7e", + "41989a1a c0c89cb8 40c8614c -> c0bf93a0", + "41738960 c0ff25ee beff2120 -> c0e688d4", + "4192b55a 3f6c7780 c0a20a72 -> 3ec09400", + "41237c40 3fdeefd8 bf7a46a0 -> bf28d540", + "c12dcca0 c0cdf19c c022d2e6 -> c04511dc", + "4112ed36 410602b8 c105c41e -> c0f1b340", + "c0303430 bfba3310 c09dc863 -> c0303430", + "c199c14b bd80c700 40894358 -> 4022b630", + "c19fd29d c10f10db 404d0180 -> c0faa7fe", + "c1103d86 3eef86a0 c106b9c2 -> be01e3c0", + "c16c3afe bff7b5d0 c102eeb0 -> c0112c48", + "4023a778 c1116e98 4113ec2a -> 4023a778", + "4125eab0 40e03a98 4014de30 -> 40b609e0", + "c128761f 40d046b4 3f8b7c70 -> 40b74a8a", + "41439654 3f2897c0 c0a608a4 -> 3f07ab80", + "c0575698 c0b90eed c0e21685 -> c0bdba7c", + "411245b6 bed16b40 4103c74e -> 3efe61c0", + "c0aea86a c1131a28 bf30a1f0 -> c0aea86a", + "c0d30f9c 41125b66 4072ccc8 -> 40839134", + "c1807107 40f32e9c c110821c -> 3f1375c0", + "41498d2c 406b5070 c118b4bc -> bf1fbac0", + "c15496ed 401f6e78 c0ca5696 -> c08f2008", + "c0b2d6e6 40529304 c0eb146d -> c0b2d6e6", + "c0650720 41168144 c10a1a92 -> c0650720", + "bfafbaa0 c0c396ee 40025910 -> bfafbaa0" + ] + }, + { + "glsl": "float cultmath_cycles_snap(float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "40feb100 c13718e8 -> 413718e8", + "419474f4 bf85a010 -> 41965412", + "4058c1b0 415aed38 -> 00000000", + "3f097480 3febe620 -> 00000000", + "c191f872 c1550222 -> c1550222", + "412b1936 c0af724a -> 412f724a", + "40a06db8 c12d8e54 -> 412d8e54", + "c183c9fd c1118e10 -> c1118e10", + "40cd9978 419685fe -> 00000000", + "402dcd48 c0480d30 -> 40480d30", + "c1656183 3fa244b0 -> c1736708", + "40b05a7c 4182adde -> 00000000", + "c18dd907 c18e351a -> 80000000", + "3fed3c80 c19b810c -> 419b810c", + "c0e8f104 3ebcd8c0 -> c0ec0ef0", + "415bc3c0 417ea320 -> 00000000", + "415d62a0 4168bf38 -> 00000000", + "40ae3f60 411bcfb4 -> 00000000", + "41107c7a 409fa3e8 -> 409fa3e8", + "c10301d2 c13bf171 -> 80000000", + "c0fe1434 c167d48c -> 80000000", + "419943b6 c19fca66 -> 419fca66", + "41649e08 414d6290 -> 414d6290", + "41165dae c024a0a8 -> 4124a0a8", + "c191c039 c167b3b9 -> c167b3b9", + "c0f39472 c180a090 -> 80000000", + "417e955c 412e6c5c -> 412e6c5c", + "bfcb8fa0 c154f016 -> 80000000", + "4042e760 c18e38ea -> 418e38ea", + "c05407d0 3f94d500 -> c05f3f80", + "c102ba59 bccd4400 -> c102b24c", + "c12e0aba 3fb142b0 -> c13142b0", + "c0e18bc8 416c7618 -> c16c7618", + "3f2e43e0 412777a4 -> 00000000", + "406d47e8 c0c6c75c -> 40c6c75c", + "3fefabb0 c194829b -> 4194829b", + "40e01b98 c0b1367c -> 4131367c", + "c172f932 c19ec67b -> 80000000", + "400704b0 40af8410 -> 00000000", + "c18fa124 c129149d -> c129149d", + "c0e58fc6 c1793045 -> 80000000", + "41963f2c c14cc4c8 -> 41ccc4c8", + "c1404f01 411d04e2 -> c19d04e2", + "c19ff91f c18884e0 -> c18884e0", + "c0773b48 bf9f81d0 -> c06f42b8", + "c154ea24 40d9dc98 -> c159dc98", + "c13b2c16 412a638c -> c1aa638c", + "41836474 41415c88 -> 41415c88", + "41831b18 c00e83b0 -> 418e83b0", + "40e26234 419c13f6 -> 00000000", + "c0fb035e 41977306 -> c1977306", + "415b85dc 40ffc678 -> 40ffc678", + "40695b40 c110c502 -> 4110c502", + "c0453bb0 3fb984d0 -> c08b239c", + "40c2cb1c bfdf27f0 -> 40df27f0", + "40929d80 418c7be6 -> 00000000", + "c19e97c5 c14bed58 -> c14bed58", + "c13a9d7c c1498a14 -> 80000000", + "3f98d820 c190a2f9 -> 4190a2f9", + "c0d31152 4048d4e0 -> c1169fa8", + "416c6858 c0104810 -> 417c7e1c", + "c0b57314 c170bdcd -> 80000000", + "c14e798a 41710728 -> c1710728", + "415226e0 4182d520 -> 00000000", + "bffb2140 c0e8ab70 -> 80000000", + "c181e192 c17a9dea -> c17a9dea", + "41934878 c18bb51b -> 420bb51b", + "418a3688 c0c35bdc -> 419284e5", + "c114b620 c11364e3 -> c11364e3", + "406391a0 41883b00 -> 00000000", + "c0e35862 bfb916c0 -> c0b916c0", + "c049bd40 418f0b16 -> c18f0b16", + "4162c108 c12de1f3 -> 41ade1f3", + "40d43bb0 c1979f5f -> 41979f5f", + "40140428 411052fc -> 00000000", + "c111be7e 41677c20 -> c1677c20", + "c17a1842 c1808210 -> 80000000", + "c174406b 41669058 -> c1e69058", + "40933f28 410c43a8 -> 00000000", + "3f65cc80 41094fa8 -> 00000000", + "c00baf88 3f106d20 -> c0106d20", + "c184b59f c0d48972 -> c1548972", + "c0b043b0 3e7b2a00 -> c0b48630", + "41993370 418d1d56 -> 418d1d56", + "c1205a6a 41671070 -> c1671070", + "41859606 c1198018 -> 41998018", + "bfd152c0 c067faa8 -> 80000000", + "c11c1e96 c071d340 -> c0f1d340", + "c198d15a c0633ed0 -> c18e0742", + "c1137ed4 418fb434 -> c18fb434", + "c13916ae 414165a0 -> c14165a0", + "c0bead90 411048de -> c11048de", + "c1914b9d c12b3f44 -> c12b3f44", + "419fbd2c 41679510 -> 41679510", + "418e6b1c c18911a2 -> 420911a2", + "4114b27e 3ff831c0 -> 40f831c0", + "411e3e54 416f94c0 -> 00000000", + "bf49e1c0 41454cfc -> c1454cfc", + "c09b6f36 c184154b -> 80000000", + "4058e010 c0c25742 -> 40c25742", + "c12048d0 410fe32a -> c18fe32a", + "41311bac 40fbe130 -> 40fbe130", + "414526f0 c19c1f33 -> 419c1f33", + "c0796620 40ffccd4 -> c0ffccd4", + "415b1a74 41083464 -> 41083464", + "4158330c c13d90b8 -> 41bd90b8", + "c000f608 403bd180 -> c03bd180", + "3e199580 40b75d04 -> 00000000", + "c157a264 c0b36834 -> c1336834", + "c107ad7e c16ce294 -> 80000000", + "3e8e4a40 c1752e34 -> 41752e34", + "419eb23c c14e3726 -> 41ce3726", + "c16da20e c0a7b454 -> c127b454", + "3f041940 405903a0 -> 00000000", + "41894fba c005ae48 -> 41966411", + "c1975e9a 418b43f2 -> c20b43f2", + "4150f848 4186d666 -> 00000000", + "40ff6270 bf0f9da0 -> 4106a3c6", + "c197db07 40c57140 -> c1c57140", + "418590f6 c1952c6a -> 41952c6a", + "41531a44 c1006c10 -> 41806c10", + "c199c2b2 c12b5e2f -> c12b5e2f", + "c12a564d 3f9219c0 -> c136a030", + "c1805e23 c150b609 -> c150b609", + "c0a5a330 4157b364 -> c157b364", + "40b9dec0 c19a01c0 -> 419a01c0", + "413f82e8 bfe72b40 -> 414a45d8", + "415a6210 c16b1a9c -> 416b1a9c", + "41127eb4 407d4b48 -> 40fd4b48", + "402e4a98 c01bfb98 -> 409bfb98", + "bcfff400 414b6590 -> c14b6590", + "412d46f4 c086f3f0 -> 414a6de8", + "40ede334 4180d594 -> 00000000", + "c09d1200 3f90ad80 -> c0b4d8e0", + "416f4328 c19a4fe8 -> 419a4fe8", + "4096c920 3eb49f80 -> 4092c198", + "c0135818 c11d54aa -> 80000000", + "c0fff9b0 c13b219f -> 80000000", + "c180d468 4128c2a6 -> c1a8c2a6", + "418e0f92 40803578 -> 41803578", + "c1131de4 c0ce10c8 -> c0ce10c8", + "c136ed80 c18289f7 -> 80000000", + "4141a50c c19d5cda -> 419d5cda", + "c168fb06 c0a444a4 -> c12444a4", + "c1865aa0 402b2f50 -> c195c966", + "41248772 c03c2380 -> 413c2380", + "c1846d03 bf5df2e0 -> c183c835", + "3fb13920 c19c25a6 -> 419c25a6", + "3f9267e0 409fe928 -> 00000000", + "3fed81c0 c0d802ea -> 40d802ea", + "c15f33c9 4034b820 -> c161e628", + "c0fff25c c0bc6390 -> c0bc6390", + "c133b12e c168b59b -> 80000000", + "40434a18 3fe6bc80 -> 3fe6bc80", + "c15ce890 40ab0758 -> c1804582", + "c194b8e6 4194de08 -> c194de08", + "40c66758 4195bbf6 -> 00000000", + "c153e103 c1597794 -> 80000000", + "4084a620 40e4b5c8 -> 00000000", + "406b83e8 40e35698 -> 00000000", + "412aa62e c19e3357 -> 419e3357", + "c004d440 c0f7115e -> 80000000", + "c1192740 c145928e -> 80000000", + "c04603f8 41948494 -> c1948494", + "410c8432 c107b18b -> 4187b18b", + "40e522d0 bf8ceb20 -> 40f69b78", + "c134ed92 40904138 -> c15861d4", + "c002c5f0 40ff6828 -> c0ff6828", + "c193879b 41674448 -> c1e74448", + "416e9d40 40d4b550 -> 4154b550", + "c02e30e8 4068b5a0 -> c068b5a0", + "c13539c2 c008e3b0 -> c12b1c9c", + "3fa1ed00 413acb60 -> 00000000", + "412dc372 c17451f1 -> 417451f1", + "c0f3fc54 c0a0c28c -> c0a0c28c", + "c06a7970 415ff218 -> c15ff218", + "c1957634 416c04ec -> c1ec04ec", + "40256178 c162cd1a -> 4162cd1a", + "c1719ce7 419dc7c0 -> c19dc7c0", + "c1828543 c1970f50 -> 80000000", + "4108cb62 408f92c0 -> 408f92c0", + "41505360 416ac8fc -> 00000000", + "41917922 4020ae68 -> 418c989b", + "411ea9a4 c1927677 -> 41927677", + "3f429680 bf9ca8b0 -> 3f9ca8b0", + "c172685f 411b0ec8 -> c19b0ec8", + "4143bda8 4188432a -> 00000000", + "c122c879 c14f873b -> 80000000", + "4138d314 c19f7e12 -> 419f7e12", + "413039b0 bf9f9510 -> 413387b2", + "c04d5800 c0fa5e1a -> 80000000", + "40c60ea4 c0c63510 -> 40c63510", + "4172ecd0 41529f50 -> 41529f50", + "c01ac3f8 c0c1e4f8 -> 80000000", + "c1909be1 c0fbc8c4 -> c17bc8c4", + "404543f0 c1914f5b -> 41914f5b", + "412c4ecc 415cbbe0 -> 00000000", + "4190c7a4 414caa64 -> 414caa64", + "4129da08 c0c0057c -> 4140057c", + "bea56600 41960904 -> c1960904", + "c191ef20 4112b062 -> c192b062", + "407e12a0 415996ec -> 00000000", + "c11df8e7 40d4a5b0 -> c154a5b0", + "c191e5c8 c17b72ba -> c17b72ba", + "409d9ac8 c08e40ce -> 410e40ce", + "c0b7405c c172a0c3 -> 80000000", + "c134aa31 409dd038 -> c16cb854", + "408a6ec0 c0681640 -> 40e81640", + "41926108 bf492180 -> 4196d920", + "419bee14 c16fad0d -> 41efad0d", + "c1712369 c080c7c4 -> c1412ba6", + "419e256a c135f236 -> 41b5f236", + "417b19f0 c187e4d5 -> 4187e4d5", + "41975ffe 419380e2 -> 419380e2", + "41977b86 c03dcb78 -> 41a61209", + "c0658510 c01ca8c0 -> c01ca8c0", + "3ec5e180 414427a8 -> 00000000", + "c0405180 40f3f33c -> c0f3f33c", + "41034c4c 41497068 -> 00000000", + "c18290d0 c1376609 -> c1376609", + "41366ae0 c0d67c86 -> 41567c86", + "41104020 40cbd148 -> 40cbd148", + "418edde6 bfe07210 -> 419a4e6b", + "41520b7c c162994e -> 4162994e", + "c1287b81 3fdca6c0 -> c14111e8", + "4167e858 c10993e0 -> 418993e0", + "c0afbdce c0aafc48 -> c0aafc48", + "415d3570 40b90b40 -> 41390b40", + "4116658e c0951244 -> 415f9b66", + "418f3e7e c14e2f3e -> 41ce2f3e", + "40f725c0 c18566aa -> 418566aa", + "c16a69c8 c141bfbd -> c141bfbd", + "4199206e 4185c502 -> 4185c502", + "408e6060 c0634770 -> 40e34770", + "c1410384 41859ee2 -> c1859ee2", + "4102ae24 c164ae58 -> 4164ae58", + "c08ee0f2 412f4234 -> c12f4234", + "c0cc2fdc 413a1ada -> c13a1ada", + "40deb800 c0d33ba0 -> 41533ba0", + "c113ae03 c0235f30 -> c0f50ec8", + "c121d526 41515948 -> c1515948", + "410f7d46 c0327720 -> 41327720", + "40229320 c16fcd64 -> 416fcd64", + "c187a5a4 c16452d0 -> c16452d0", + "4193791e 41336600 -> 41336600", + "4191ca0a c0e45524 -> 41ab3fdb", + "416af36c 418486ce -> 00000000", + "3f507180 41013834 -> 00000000", + "c140d47a 3f8ffee0 -> c145fe74", + "40e74f90 c196e71b -> 4196e71b", + "415cc190 c0548aa0 -> 4184d6a4", + "418f351a c0e77284 -> 41ad95e3", + "4158e6b4 410c96b0 -> 410c96b0", + "417ddc98 40637b98 -> 41637b98", + "c197b31b c18e72b5 -> c18e72b5", + "419694d0 c07ff288 -> 419ff795" + ] + }, + { + "glsl": "float cultmath_cycles_pingpong(float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c176db1f 3eea9940 -> 3e19ed3c", + "4189d2f4 416a3994 -> 4140cd40", + "c0b49536 41023400 -> 40b49537", + "40ab36f4 41620e40 -> 40ab36f4", + "415ad548 bfa3e800 -> 3f5f3489", + "bffe20c0 c051a608 -> 3ffe20c0", + "4193d4d8 c0964e96 -> 3e9e6f60", + "c10fa1c3 bf83f0b0 -> 3f3b1132", + "c11dc4e6 40b15fbc -> 3f9cd6b0", + "406bbd58 c162a3de -> 406bbd58", + "40c574d0 c125dfce -> 40c574d1", + "40699a90 41534d80 -> 40699a90", + "4172ef14 c07325e0 -> 3c5b3200", + "4069ee10 415c0e18 -> 4069ee18", + "c12da9fe bf02a2c0 -> 3ebeb93c", + "c174ec99 4181ebd4 -> 4174ec99", + "41463c60 400e42d0 -> 3f727d78", + "c13b4f73 c0b8c2bc -> 3e232dc0", + "419ab3da 40c59b08 -> 40ab9cb7", + "c0c8fa62 be421e80 -> 3e28c0cc", + "417c6460 41519988 -> 4126ceb0", + "c148a37e c09d82e4 -> 402c826a", + "419550b8 3f969dc0 -> 3e2683e8", + "c0b6c5e4 bfdf9000 -> 3fa3286e", + "c00f1e30 c0469540 -> 400f1e30", + "c0d2b86a c0902c28 -> 401b3fcc", + "bfbea600 414fcd7c -> 3fbea5f8", + "411d48f6 416f04b0 -> 411d48f4", + "41867710 c17fa799 -> 41726115", + "419ba540 41913f6e -> 4186d99c", + "c1784784 41398d60 -> 40f5a678", + "409f707c c0ba0112 -> 409f707c", + "c0bf20d0 3fe32220 -> 3f900544", + "408ab444 c06f9c10 -> 4049cf96", + "c14fd7d8 41865fce -> 414fd7d8", + "bebcb980 407db658 -> 3ebcb978", + "c102d2f1 c1810418 -> 4102d2f2", + "c11f0840 415120e0 -> 411f0840", + "c18e9e28 c136d7e8 -> 40a0e700", + "4168ac14 c0bfc948 -> 40238b2f", + "c190b342 c169927a -> 4131be70", + "c08054b4 4143fb54 -> 408054b6", + "c15ecdf8 4113297c -> 408f0a00", + "c0114e70 419b3770 -> 40114e70", + "414647c0 c0d4a844 -> 3f660838", + "c0253e00 41750f4c -> 40253e00", + "40d70600 c08df81c -> 4009d470", + "c09581ec c17d28fe -> 409581ec", + "c13e1eb7 41545d08 -> 413e1eb8", + "c1979885 c0470b48 -> 3e9403a8", + "4186bccc 41904208 -> 4186bccc", + "c10c1a2a 3f778d80 -> 3f69e466", + "418a203e 41173634 -> 3fd15f60", + "c182a192 c0ab991c -> 40a3de29", + "403b5700 4186140c -> 403b5700", + "414c4100 4103c60c -> 406d2c60", + "c12853ab 40ae5e4c -> 3ec15430", + "4181f2b0 4198a57c -> 4181f2b0", + "c08c9088 414bbce8 -> 408c9086", + "c13e3291 409a8c38 -> 400e9960", + "c17f4822 409dd688 -> 407193b8", + "407744f8 415a7c4c -> 407744f8", + "bf1f0e40 408a15d0 -> 3f1f0e40", + "4189f54c 4182148e -> 417467a0", + "4108b8c6 c161df42 -> 4108b8c6", + "409e7f2c c131995a -> 409e7f2b", + "c147a6dd c0164468 -> 3fcdfdf6", + "c03578f0 c180f54b -> 403578f0", + "416287b0 41705ccc -> 416287b0", + "416fbad8 c05810b0 -> 3fbd513a", + "40b0d940 c1874387 -> 40b0d93e", + "c0619b80 417a1fa8 -> 40619b84", + "3f16ae00 4112ea74 -> 3f16ae00", + "40bac5f0 c195d614 -> 40bac5ee", + "bf2e1700 c0702fb8 -> 3f2e1700", + "41091f46 c093b744 -> 3f297fe8", + "40a51f38 c071dca0 -> 40197ad0", + "c0e4f564 c10171aa -> 40e4f564", + "c0ba9a58 c01a59d0 -> 3f810220", + "c1934b22 c0e194d8 -> 408a02d8", + "41434b9c c1496c40 -> 41434b9b", + "40c2f558 c03d2bf8 -> 3e392bf0", + "c1031782 40776960 -> 3eec5a48", + "3f36cea0 413d3d70 -> 3f36cea0", + "c13b729c 4145cff8 -> 413b729c", + "c1713cb8 3f15aee0 -> 3dffb9e8", + "418e0108 4137d19c -> 40a74250", + "419a6cbe c198608a -> 41965456", + "c138adde 4103b196 -> 409d6a9c", + "c0dddd2c 412324a8 -> 40dddd2c", + "4193d3f8 417f96c0 -> 41578590", + "c043d5c8 c0f67698 -> 4043d5cc", + "c02bfa20 c126e4c7 -> 402bfa20", + "406f5c30 4134d04a -> 406f5c2c", + "c173166a c16bec92 -> 4164c2ba", + "411b6296 c05b8770 -> 40367b79", + "4156f310 40021518 -> 3f9e9b5e", + "408d6070 bff13910 -> 3f261f42", + "c04006e0 419b720e -> 404006e0", + "4074dca8 4185c844 -> 4074dca8", + "c1388275 41602588 -> 41388274", + "414fc674 40de9d30 -> 3f6d6bc0", + "c10acf36 c1403ba8 -> 410acf36", + "c01776c8 415abe00 -> 401776c8", + "c0454290 c101b99d -> 40454290", + "c18461e6 40be0280 -> 40958298", + "c177a7de c109baec -> 3fde6fd0", + "c0b0e4b4 4181da6e -> 40b0e4b4", + "41278934 c0c69410 -> 3ff856e8", + "419dd9c6 c18e195d -> 417cb1e6", + "c19efe59 41169ca0 -> 3f861b90", + "40e0a7b4 c187c304 -> 40e0a7b4", + "c18ac94e 4105a524 -> 3f248540", + "40e4cfb8 c089066c -> 3fb4f484", + "c14ede9c 3f9804f0 -> 3f86c382", + "407d0298 c12f91fb -> 407d0296", + "c1798595 c069fc78 -> 3f7891c8", + "3fdd38e0 c1787d9b -> 3fdd38f0", + "c18817db 411fbbf6 -> 403d20dc", + "c198360b c12ac2e1 -> 401466b0", + "413ef8ea 41211908 -> 41033926", + "c0b3be22 414ea334 -> 40b3be21", + "c1919463 c181cf55 -> 4164148e", + "c0fe73fe 4002b800 -> 3e5f8040", + "c147085f 4102fb58 -> 407bb944", + "40f49f58 c1865bd8 -> 40f49f56", + "419d984a 3fcb4f20 -> 3f239e3c", + "4184c69e bf71f140 -> 3ed44594", + "c1502e52 411f4c7c -> 40dcd548", + "4089c268 403e2e98 -> 3fd1b0c0", + "3f55c7c0 c190ad3e -> 3f55c7c0", + "40d33938 417baebc -> 40d33938", + "40fe0b78 4166ce30 -> 40fe0b78", + "3fc436a0 4102d740 -> 3fc43698", + "411a9df6 c11ff4c0 -> 411a9df6", + "4153e494 c19c1961 -> 4153e496", + "c0e5bbe2 4126766c -> 40e5bbe1", + "c11b2ba6 c11f15bd -> 411b2ba5", + "c09f08a0 4161b0a8 -> 409f089e", + "c1962ea2 41970606 -> 41962ea2", + "c06c8378 c16e4621 -> 406c8374", + "c13d7ad7 bf8ecfb0 -> 3f2f73ae", + "4158b0f4 3f3f8560 -> 3d9d73b0", + "c12ac28e 40344218 -> 3f17f89c", + "be818b40 c18a9ce8 -> 3e818b40", + "418bd85c c0def868 -> 4062e13e", + "c165253e bfffbdf0 -> 3fd4c592", + "4107e0a4 41205368 -> 4107e0a4", + "c18441ca bfac6e60 -> 3ebbc084", + "c1706289 c149f6f5 -> 41238b61", + "400f6a08 4077bb08 -> 400f6a08", + "41461008 418c7630 -> 41461008", + "416f16c4 40e504e0 -> 3f211e40", + "41262642 c12b45da -> 41262642", + "c10b6a76 40d145f0 -> 408bb6f4", + "c17f9ac3 c0e3bdf0 -> 3fdee698", + "410ba9c0 40adaa4c -> 40080230", + "c155537c c088bac6 -> 40708840", + "415c205c c144896d -> 412cf281", + "c18e811c c14cf299 -> 40f9c5f4", + "40a32178 4195bb28 -> 40a3217c", + "c1391c65 40dfaf90 -> 401a4cb0", + "c0ef4aec 3e583200 -> 3dfb54e8", + "416cf27c 416d19cc -> 416cf27c", + "c190b51b 3e901e00 -> 3d971b14", + "c1569229 418304be -> 41569228", + "41121330 415d99b4 -> 41121330", + "c05739c8 4146f060 -> 405739c8", + "c0e8ac50 c1166738 -> 40e8ac50", + "407c3d18 c159d17b -> 407c3d10", + "4125d214 c19fbe5a -> 4125d214", + "c1078504 415350b0 -> 41078504", + "4195307a 40931f5c -> 3e844770", + "4089b418 3e80b380 -> 3e62baf9", + "c10aa442 c0e783f6 -> 40b9bf68", + "41821988 417c05d8 -> 4173d8a0", + "c0622e48 418e4808 -> 40622e44", + "4011e140 406190c0 -> 4011e140", + "c091e9b4 c169c7be -> 4091e9b4", + "40a123b0 c0a89408 -> 40a123b0", + "41458ff4 41790c74 -> 41458ff4", + "c149dba3 41301498 -> 41164d8a", + "bd4ae000 c145a43e -> 3d4ae000", + "40703770 416e1010 -> 40703778", + "c1335c66 c0b887b8 -> 3ea56a40", + "c188039d 404a1e40 -> 3ff93134", + "40719d30 417ccf40 -> 40719d28", + "c04b12b8 40a21ae4 -> 404b12b9", + "40e5f6a4 c098da26 -> 40177b50", + "410576d4 40fd95b8 -> 40f03dc8", + "417e86bc c0ae2640 -> 40a0c0f9", + "405ef840 411257c4 -> 405ef840", + "40809bc4 c1129803 -> 40809bc4", + "bdb57900 4135831e -> 3db57900", + "c106de9c 4151cd5c -> 4106de9c", + "c0406b18 c14a8e6a -> 40406b1c", + "40b20de4 c12ca6b7 -> 40b20de2", + "c0bec2da 416cc5a0 -> 40bec2d8", + "414a5ef0 3f066640 -> 3d459030", + "c0d7c8e8 41300530 -> 40d7c8e8", + "c1993f16 4116c9fc -> 3e9d4660", + "c1089dfe 4188cfce -> 41089dff", + "c123bac0 c0dca906 -> 4063b918", + "c1006174 3f2a52a0 -> 3d237c30", + "3f754bc0 4189b56e -> 3f754bc0", + "4182b470 c19e43e3 -> 4182b471", + "c03cfa40 4188e37c -> 403cfa44", + "bf968610 c00d73b8 -> 3f968610", + "c0fd6332 bfe19b40 -> 3f5e3f90", + "c150394a c12e32dc -> 410c2c6e", + "40f78d68 41468abc -> 40f78d68", + "4053bab0 c08a5380 -> 4053bab0", + "4189eb74 417a8730 -> 41613778", + "418cc050 c0ade3f4 -> 40848e8e", + "3fe18570 4001d6c8 -> 3fe18570", + "4146ae84 c1556b10 -> 4146ae84", + "c1904450 418ab8d0 -> 41852d50", + "40e29210 c158433e -> 40e2920f", + "c1873a90 40cc3ce8 -> 40847071", + "bf1ed7c0 c1115d9a -> 3f1ed7c0", + "4196e4b8 4199f7f2 -> 4196e4b8", + "c119d19f c0b492f4 -> 3fd60aa8", + "4186323e c04e4c00 -> 4024360c", + "4124b028 41073ff8 -> 40d39f90", + "41262a0c 4181fdc0 -> 41262a0c", + "402ddce8 c0b2db54 -> 402ddce7", + "c0cec0a4 c17db198 -> 40cec0a8", + "c185e0c1 c13908e8 -> 40cca09c", + "c15e24b1 417c8bc0 -> 415e24af", + "419ee458 c0bc83e0 -> 406cfc3c", + "c08faa44 418b4842 -> 408faa44", + "41973a3e 41976f86 -> 41973a3e", + "c17343a4 411ad3f0 -> 4084c878", + "4192006c be960640 -> 3daa5dbc", + "c11f820f c0f51b0a -> 40ab31f6", + "c0a9cf9a 40b65fe8 -> 40a9cf9a", + "4196dd0a 41809228 -> 41548e8c", + "c11bfc4d 4107d6d0 -> 40e762a8", + "40017170 c130c7d9 -> 40017170", + "bf8c71e0 3eed3d00 -> 3e2e9b00", + "c16a28f7 c12dbf59 -> 40e2ab76", + "4085c7f4 40b06a5c -> 4085c7f4", + "419a7f3c bfff1ea0 -> 3f1e7cfc", + "4151f540 418e947c -> 4151f542", + "41613320 bfad7080 -> 3f066800", + "c19d0f46 c14b00e2 -> 40b7c671", + "40d0ab88 c16bab8c -> 40d0ab86", + "41767788 c194638a -> 41767787", + "c19d424d c108b0aa -> 40248d18", + "c12705d6 c14e6f74 -> 412705d6", + "bfbc9ed0 c1169fa7 -> 3fbc9ec8", + "bfc9efc0 bffa4380 -> 3fc9efc0", + "3fc71a60 418823a2 -> 3fc71a60", + "c08e4f7c c0221288 -> 3f1e1860", + "415e4ab4 c0a730a8 -> 405c6832", + "40cd3578 41895194 -> 40cd3578" + ] + }, + { + "glsl": "float cultmath_cycles_smooth_min(float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c0479800 bf1a1380 c03418f9 -> c0479800", + "c15a15c8 c0d8a6e6 bfd38164 -> c15a15c8", + "419cf048 40d94060 40846f56 -> 40d94060", + "c19c9410 40b43958 40362c00 -> c19c9410", + "c1006efa c149e6ea 40996d18 -> c149e729", + "415965a0 c19aa99c c0333539 -> c19aa99c", + "41025b6a c116f2fa 409b1f00 -> c116f2fa", + "c1031eca c190811f 406c76b0 -> c190811f", + "412b7ea0 c15dd396 c080570f -> c15dd396", + "c18da466 c18c5e0b bf8b0c38 -> c18da466", + "c18090de bf3348a0 4043b734 -> c18090de", + "c18660da 4126e51e c04e0905 -> c18660da", + "418436b6 41108d50 40038c5e -> 41108d50", + "40de7830 c102913d 3f3167e8 -> c102913d", + "c1174e20 bff35dd0 3f9e875c -> c1174e20", + "40e12c10 c15ed976 bfba6b90 -> c15ed976", + "418eb68a 3ffb9510 bf4cc5a8 -> 3ffb9510", + "40a2ffd8 40d41880 bf84e48e -> 40a2ffd8", + "418e3296 c16ec738 bf227be8 -> c16ec738", + "c0c11f50 c08b28d0 c04e7fde -> c0c11f50", + "c1291295 418a94b0 3f8ab890 -> c1291295", + "3f664c80 4183fcce c05aaeca -> 3f664c80", + "41993a66 c133ad46 bf433028 -> c133ad46", + "4140e334 41887c18 c005e088 -> 4140e334", + "3f13e680 c1967056 4095cf20 -> c1967056", + "c0586ff0 c195e855 3f75a5f0 -> c195e855", + "c122ccfd c1828bb4 c09f7d10 -> c1828bb4", + "411c87ac c178b5e2 3dfa2900 -> c178b5e2", + "4196d5a8 bf950d50 404abf34 -> bf950d50", + "c0675a10 c16926de 3fab58ac -> c16926de", + "411a95f8 4023f458 bfd3bc90 -> 4023f458", + "3f9061e0 c01ec548 bfaf753a -> c01ec548", + "41937eda 411a4d18 3eccd560 -> 411a4d18", + "bfb06c40 40fc4274 408a69e8 -> bfb06c40", + "4189cb20 c1637620 3f9cf4e0 -> c1637620", + "c16d50e2 c177be7a 3fadd9dc -> c17840f4", + "c0384228 3f940940 c0817b47 -> c0384228", + "4159f78c c17dc2ac c0007d02 -> c17dc2ac", + "c14f85be beb34800 404ddf40 -> c14f85be", + "c1813a80 4002e5f0 bf1592e8 -> c1813a80", + "c0cadbfe 40312d40 c0854334 -> c0cadbfe", + "413987a0 c18cd960 bfb009c8 -> c18cd960", + "4191fee0 419b9916 3f6b4298 -> 4191fee0", + "4086b1bc bfe8cd90 c0061dc1 -> bfe8cd90", + "c18e1897 4133408c bf867142 -> c18e1897", + "c189e6f7 4148f16c 40956020 -> c189e6f7", + "417956d8 415afc30 bfb5c65e -> 415afc30", + "c14c2dba 419a1d04 3f88aff4 -> c14c2dba", + "3fc51710 41804f36 beca01f0 -> 3fc51710", + "c194b0a3 c0bcdc0a 408ef476 -> c194b0a3", + "3fd33110 416972b4 c0466c63 -> 3fd33110", + "c180804e c1709f8a c06e2a16 -> c180804e", + "415f5a38 c165f160 c084e1b0 -> c165f160", + "c11980ac c1514ea2 c06ef0a6 -> c1514ea2", + "c191f1dc 414e9698 c0883294 -> c191f1dc", + "41432734 413628b8 bfe2066e -> 413628b8", + "41815dd0 c17bb7cf 3fe2e8b0 -> c17bb7cf", + "41631f00 c13bcbd8 4005bd48 -> c13bcbd8", + "c18540c6 c1594045 3f604528 -> c18540c6", + "bf6de640 c11f1b42 c05a512d -> c11f1b42", + "41809dac 4186af84 3fab4064 -> 4180789f", + "40b9cf70 c18b86a2 3f65ce70 -> c18b86a2", + "c17fb15e 419267b6 3fc7c02c -> c17fb15e", + "c1150e8c c1332826 3fddc594 -> c1332826", + "417483a0 40a5af04 3fd895a4 -> 40a5af04", + "c12bf288 c1684a02 c05a5c90 -> c1684a02", + "3fa5e910 41157bb0 c0758a4b -> 3fa5e910", + "c1683d06 c16c1ce6 c022b636 -> c16c1ce6", + "c1138b6c 40ee8e40 3fca7d18 -> c1138b6c", + "bf429ae0 c19b3f87 4094505e -> c19b3f87", + "3fce2500 c0a38ecc 407929e4 -> c0a38ecc", + "418846e6 c0b57808 c01eadaa -> c0b57808", + "be921ac0 c08196e2 4025a3d8 -> c08196e2", + "bf1d8c20 4102d892 4051594c -> bf1d8c20", + "40d63968 40af9458 40777058 -> 40a8dff7", + "c19eb739 41974db0 3f457298 -> c19eb739", + "c19346c4 416170fc c0987b21 -> c19346c4", + "c0364890 418e323e 3e3690e0 -> c0364890", + "c1926371 41297860 40397bec -> c1926371", + "c08f5330 c09f19b4 bf9ca8c8 -> c09f19b4", + "418a1a86 4098f0a0 408da73e -> 4098f0a0", + "40f67eb8 41112cd6 405e9f40 -> 40f25dbc", + "4135b8e6 4191faea c0126c79 -> 4135b8e6", + "c0541e10 41189e4e 40188170 -> c0541e10", + "c08000d4 c190b50e c096ae71 -> c190b50e", + "c106e396 bf9acdd0 bd79c480 -> c106e396", + "c0b44d1a c1161cfa 4008abbe -> c1161cfa", + "c1860f0d c0167090 c057f00b -> c1860f0d", + "418ccb80 c178a93c bf38af88 -> c178a93c", + "c0a47e58 417554ac 3f6f2e70 -> c0a47e58", + "bfc14cc0 c17ce73e c0989f4b -> c17ce73e", + "c0980f84 4007c8c0 c084cfde -> c0980f84", + "41760ad0 4197eeac 40834eac -> 4176060f", + "c1939775 c1332759 c09aad39 -> c1939775", + "c0f86dc4 409cf3f8 c0772d52 -> c0f86dc4", + "c10977b2 c196c8dd 407dce98 -> c196c8dd", + "bee74200 41221cb4 c0032de6 -> bee74200", + "c1029d00 c196c186 c0796fe2 -> c196c186", + "40d1ffb8 41605328 c04deb8d -> 40d1ffb8", + "41333e86 4121a85e 3f93ac24 -> 4121a849", + "c04cd370 c0601fb0 c088af6d -> c0601fb0", + "40e38fd8 4191910a 3fab0b18 -> 40e38fd8", + "4109c006 c199fc54 bd571300 -> c199fc54", + "418e216c c073b990 bd4dc500 -> c073b990", + "4055ee60 c0e5ef46 c0917ad0 -> c0e5ef46", + "40fc0c64 413018c8 404be9e0 -> 40fc0c5e", + "c190615c 40c61d60 c0858bc1 -> c190615c", + "3fa02c40 4174fae4 c06cc806 -> 3fa02c40", + "c1010680 c1558c97 c087b219 -> c1558c97", + "418418a6 410af860 40019f08 -> 410af860", + "418225e8 c17d33b8 c031cb03 -> c17d33b8", + "c10338bc 40980be8 4044e094 -> c10338bc", + "418e0234 40a40264 3fd6afd0 -> 40a40264", + "bf4b2e00 40332120 c09ccc8a -> bf4b2e00", + "c07b5470 3fe418a0 bfc1e9cc -> c07b5470", + "41400930 4107e768 40057498 -> 4107e768", + "c18b3d21 41957cd6 c087e2d0 -> c18b3d21", + "c0b3aadc 41140140 c080b32a -> c0b3aadc", + "3fa76ca0 4178c59c 3e97e970 -> 3fa76ca0", + "418db496 c09a6328 4038aeaa -> c09a6328", + "4013a700 41418eb8 bffde212 -> 4013a700", + "413b04ac c194047b bfff755a -> c194047b", + "c1116c10 c1074bab 4001026a -> c113285a", + "c127d634 412201ca c061e86a -> c127d634", + "c15f6e06 402fc0a0 c084dccc -> c15f6e06", + "c188bf37 c16d255c bfcf1064 -> c188bf37", + "41342ce0 bd87d600 beeb9ff0 -> bd87d600", + "c0a9b190 415eab90 401ffeb6 -> c0a9b190", + "40a2c94c 3ff109f0 bfa269ec -> 3ff109f0", + "c17064b0 4127d9b0 40134056 -> c17064b0", + "c10e1c9b c19fb262 c020cd3b -> c19fb262", + "4172a93c 418731b2 402b398e -> 41725966", + "410557f4 408c4c6c 3d9181c0 -> 408c4c6c", + "c1909d1c 3f8ba9e0 bf4333b8 -> c1909d1c", + "c19dc6e9 41515bf4 c037081e -> c19dc6e9", + "41891164 c13a6769 c057eee8 -> c13a6769", + "c19bd65e bfcc9ff0 4025eaf8 -> c19bd65e", + "c1457a9f c158c3b4 4073de18 -> c15c02f2", + "c0d3bab0 c1463d79 40917196 -> c1463d79", + "40044108 c1565ffa bdc546c0 -> c1565ffa", + "4188bd24 c1610761 3e86d530 -> c1610761", + "4196e108 41932332 4021668e -> 419151fc", + "417ee4d0 c1121742 3fbb1988 -> c1121742", + "c0e9e64c c0adacc8 3e4b46e0 -> c0e9e64c", + "4153ebc0 4115671a 4096bd8a -> 41155728", + "c1965388 c0b295ec c0995833 -> c1965388", + "3fb836a0 40fe83b8 bfceeeb0 -> 3fb836a0", + "c139460e c178b7f4 bffd24a4 -> c178b7f4", + "4196aab0 c18450fe 40595ef0 -> c18450fe", + "c0a956a8 3fe434a0 4014a0dc -> c0a956a8", + "41485660 c15bb84b bf0de740 -> c15bb84b", + "c19aa4df c172b481 bf9b06c4 -> c19aa4df", + "417e586c c194a7f2 406b158c -> c194a7f2", + "bfc37560 c1966103 408bd7ec -> c1966103", + "3f284540 40fa8cd0 c0815ecd -> 3f284540", + "c126c975 c0b2ccc0 bf38ab30 -> c126c975", + "41833182 c0fa6c90 40530d7c -> c0fa6c90", + "418ac9c8 c19afb4a bead0ec0 -> c19afb4a", + "c15eb2dd 410ac058 c09427b6 -> c15eb2dd", + "c130930a c19fc9a7 406ee860 -> c19fc9a7", + "418403d0 3f9c8120 4011622a -> 3f9c8120", + "418475f4 3e2d9e00 c03b1e1a -> 3e2d9e00", + "c187e8e2 41493580 3f903734 -> c187e8e2", + "406bf9e0 c16aff7d bfdff622 -> c16aff7d", + "c15dc5f2 c1884540 3fd807c4 -> c1884540", + "c07c9cc8 40f86b3c bf57f970 -> c07c9cc8", + "c13bd4b8 41141ed4 4010c464 -> c13bd4b8", + "c061d910 bfd872c0 c0264324 -> c061d910", + "4180c9ae 4172c2d0 c065c1b8 -> 4172c2d0", + "41991404 41696920 bf75d360 -> 41696920", + "c0ca67ec 40ddd6f0 c094de4c -> c0ca67ec", + "419e1694 3ffc4db0 bba45400 -> 3ffc4db0", + "c139b251 408330d4 c045700e -> c139b251", + "41786080 c156f7b2 3eeb2110 -> c156f7b2", + "4149b998 c0e936e6 c05236cc -> c0e936e6", + "3e422380 41335984 408d49f8 -> 3e422380", + "413e5a48 41207454 c098baa4 -> 41207454", + "409b5de4 c19a5f29 c013b222 -> c19a5f29", + "c161dc02 3cfbc800 c088b0c2 -> c161dc02", + "bf05ab00 c19c53bb 3f9fe750 -> c19c53bb", + "c18aae31 c180fce5 408fe630 -> c18d04b6", + "c13a6f8f c11fcd93 becf57a0 -> c13a6f8f", + "c1063e7a c159f31e 3e7ebc80 -> c159f31e", + "c153a9f5 c14574df c082b166 -> c153a9f5", + "c1308e50 c0e86a6e 3f2c5a20 -> c1308e50", + "c14c9fbc 40774080 c06672e4 -> c14c9fbc", + "c18a062c c082ea5e c0804b5b -> c18a062c", + "c14055a5 c14c3240 c0770b35 -> c14c3240", + "c097ff20 410d1d1c 3fc75394 -> c097ff20", + "4129f58a 415e0930 c0907a16 -> 4129f58a", + "c03bc298 410ea860 3f68ff80 -> c03bc298", + "402a7120 414dbce0 c08a7ef4 -> 402a7120", + "40765f00 40885250 c08a66f0 -> 40765f00", + "4107b428 c136b8fa 3f9a9944 -> c136b8fa", + "c0555f68 40a4087c 3f17a4d0 -> c0555f68", + "4189f6c2 c0838580 3ffeedc8 -> c0838580", + "41013756 419561dc 408156e0 -> 41013756", + "418a88b0 c0513960 3f919b74 -> c0513960", + "3f8452f0 416af944 40851c3c -> 3f8452f0", + "4156d794 41519000 3e98aa90 -> 41519000", + "41426b44 3f7cbfc0 bfeff894 -> 3f7cbfc0", + "bf7200c0 411b46b0 bea0ea00 -> bf7200c0", + "3cbaa800 40c9aacc bcf90c00 -> 3cbaa800", + "3ba37000 40572210 409cd37c -> bca885bb", + "c188d282 c0b78100 c04abc35 -> c188d282", + "bf5e3580 41350236 3f072610 -> bf5e3580", + "400c2e60 bfff68a0 bfe2404c -> bfff68a0", + "41921972 c18ba0e6 40734574 -> c18ba0e6", + "c163a1ee be8040c0 bffa128e -> c163a1ee", + "4198b914 c192f70b 409161ce -> c192f70b", + "c15f365c 4126c02a 4032992a -> c15f365c", + "3fc0e670 4182a472 3ff2f610 -> 3fc0e670", + "c0f56e28 418ce418 4076bd8c -> c0f56e28", + "c182fcc7 c031bf48 401967d8 -> c182fcc7", + "c13e9704 c13edd18 bf960994 -> c13edd18", + "41848366 4166b664 c08c46ec -> 4166b664", + "c031d840 c190c925 c0850479 -> c190c925", + "c0af2220 c10c3402 bf9d05d8 -> c10c3402", + "c13bca88 415e3860 bec791b0 -> c13bca88", + "c02d06f8 c0d6fc3c c020b74a -> c0d6fc3c", + "c15713f8 3f6eb300 3f9586f8 -> c15713f8", + "3fda5250 c0c16a68 404f0858 -> c0c16a68", + "c138f232 3fb1f180 bf042590 -> c138f232", + "be86e7c0 c1532c44 405b3a04 -> c1532c44", + "40d617f0 bfb7d6e0 c099bea0 -> bfb7d6e0", + "4055e008 4122c9e8 40679b48 -> 4055e008", + "bddae100 c12ca8bb 3faa8f30 -> c12ca8bb", + "c1247b6e 3fef41b0 409dd21a -> c1247b6e", + "416ccc90 41385ab2 be50bd40 -> 41385ab2", + "c07b8fb0 c0d83158 c08c77be -> c0d83158", + "c12d92c1 41708aa8 3f8a8ca0 -> c12d92c1", + "40aee9ac 41888d34 4082527e -> 40aee9ac", + "c1715ba4 40cc3d64 4061d81c -> c1715ba4", + "4017cb70 4101f8fc bfdf0f98 -> 4017cb70", + "4090f718 418be096 407199f8 -> 4090f718", + "c12542f6 40fac5f4 404ac6d8 -> c12542f6", + "c0b60b54 409d7aec c08248c5 -> c0b60b54", + "407dca00 418b3a02 c07ed563 -> 407dca00", + "4094023c 4186b3bc 4098817c -> 4094023c", + "409e3e90 40dcfb78 3f1bc060 -> 409e3e90", + "c0c7d7ac 4145f1bc c03da925 -> c0c7d7ac", + "c09033d2 c116a47e c003b6ee -> c116a47e", + "c12a0c4c c196346f 3ebf55d0 -> c196346f", + "c178223e bfc962e0 c081aa65 -> c178223e", + "c19d1e69 418c2bb0 3e8af240 -> c19d1e69", + "c0f6613c 40a61210 3f8c4e10 -> c0f6613c", + "c175f5c5 40a41f08 c0828423 -> c175f5c5", + "40d05aa8 c191ef21 400529dc -> c191ef21", + "4195d108 40a5f57c 408d0b54 -> 40a5f57c", + "3e837680 c1994624 c09e2686 -> c1994624", + "4189d102 bcf5d800 409bd07c -> bcf5d800", + "c10517fd c136214d 407c0744 -> c1363e9c", + "c171dea7 c12f6a8c 3fdccb58 -> c171dea7", + "405543a0 c19d9b55 3fd397ac -> c19d9b55", + "c10d23e1 c122e36b c058162e -> c122e36b", + "419f61a0 4066bd40 409f0e52 -> 4066bd40" + ] + }, + { + "glsl": "float cultmath_cycles_smooth_max(float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "403f3150 c0f59c86 c005a191 -> 403f3150", + "c0aa4820 3ea2a180 c091c8e5 -> 3ea2a180", + "bfa03d00 40e7cdb0 4029cffc -> 40e7cdb0", + "be34c100 c04eefe0 3facc188 -> be34c100", + "c0bb9b28 4111d802 c09cee4b -> 4111d802", + "3fa1be30 c14bc443 4093a748 -> 3fa1be30", + "c17af5c0 410adb2c 400e78ac -> 410adb2c", + "40aaae08 c14951f7 bf7631b0 -> 40aaae08", + "418be0ae 3fa5ca90 3f9a8c60 -> 418be0ae", + "c03b5078 c0955d94 403f052a -> c03902a4", + "3fea0060 41966f66 c0935a49 -> 41966f66", + "418dfd00 418a27b0 400841fc -> 418f4f32", + "41095484 40231858 409d3804 -> 41095484", + "418d9962 414eefa4 3eafbee0 -> 418d9962", + "c16dc8ba 40a1e8b8 4044516c -> 40a1e8b8", + "c193fd8c c12ce184 c00d0eaa -> c12ce184", + "40c750d8 411ea458 c08b8f94 -> 411ea458", + "c13f64be 4179b900 406ed424 -> 4179b900", + "c1105c08 418d3aa8 c0717c4d -> 418d3aa8", + "4177eadc c03395b8 40982ddc -> 4177eadc", + "c0435fe8 c19299c1 c0016a60 -> c0435fe8", + "41956568 418ff678 bf026b18 -> 41956568", + "40745558 c0671e50 403d88a2 -> 40745558", + "c1021e90 414ae340 3f96eb50 -> 414ae340", + "41966f44 c1562882 407beb88 -> 41966f44", + "c1477f30 3e47ef00 3f16e6b0 -> 3e47ef00", + "407888a8 417fbc74 bffcca4e -> 417fbc74", + "c0cb564e 412d8376 3fad59bc -> 412d8376", + "41162452 c0c6b66c c0866d19 -> 41162452", + "c15588b9 40d8ac10 409ced08 -> 40d8ac10", + "4066f918 415169a8 c06a547d -> 415169a8", + "c19af5d8 3f40abc0 40342326 -> 3f40abc0", + "c1289dc3 c158938c 3fe20ed8 -> c1289dc3", + "c0b627a0 c01441b0 404ce610 -> c01441b0", + "bf2974c0 c0b47206 4089e08c -> bf2974c0", + "c00a5340 c12c4345 400fe182 -> c00a5340", + "41997450 c1846e6c bf22a9b0 -> 41997450", + "40232818 c106374c 3e9af0f0 -> 40232818", + "40dd81c4 c1859669 c012b6f8 -> 40dd81c4", + "40cfd180 c12b597e 3f86904c -> 40cfd180", + "c0a7812a c03587d0 4019e262 -> c03587d0", + "4143ae98 41042328 409cbccc -> 4143c53a", + "bf235dc0 4191651c 3fbb9988 -> 4191651c", + "c17837a0 41908f4a bfc8996e -> 41908f4a", + "4174b240 c126ca08 bed998f0 -> 4174b240", + "bf34b380 4164ec28 bf610e18 -> 4164ec28", + "4102ebca c10746de c07717f1 -> 4102ebca", + "c0b97768 c1487158 3f54cb90 -> c0b97768", + "400a11e8 c19785df 3ebd07a0 -> 400a11e8", + "40849acc c0c95920 bf2321d0 -> 40849acc", + "3edb4400 403de5f0 408962f8 -> 404105ed", + "c189205e 419c5662 c09bd73d -> 419c5662", + "c1867e28 40e37438 3fc347a8 -> 40e37438", + "418d23bc 4193d086 c00f0d7c -> 4193d086", + "c186f5a0 416b2040 c069fb6c -> 416b2040", + "c1822edb 40e82f88 c08fb6a2 -> 40e82f88", + "c188b762 c145f3e8 c03018f8 -> c145f3e8", + "41658c8c 41927e7c 408df6b0 -> 4192804d", + "beb3fd00 c19b8270 c024f09b -> beb3fd00", + "c15b5080 c11ed5e4 3fe65dd0 -> c11ed5e4", + "bff13ad0 41737cc0 3f8eed8c -> 41737cc0", + "c1396aca 4081dc84 bf9cb5d0 -> 4081dc84", + "c05c4aa0 4146f300 c01f76cc -> 4146f300", + "c00e1298 c0793ba0 c04ccdf7 -> c00e1298", + "412618a4 4128a44e bfddcfd4 -> 4128a44e", + "4157f58c c10ed073 bfe7232e -> 4157f58c", + "c00346c8 bfc8ee80 bfc64700 -> bfc8ee80", + "bf0f1c80 3f9de160 c05eb8a9 -> 3f9de160", + "c138af7b 40c29b24 3f94f908 -> 40c29b24", + "419b6c4a 404d7ca8 4097d8d2 -> 419b6c4a", + "412d4222 41872a18 bf3dc000 -> 41872a18", + "41973a76 bef22580 c085edda -> 41973a76", + "40d2f778 416b7f88 c015ce02 -> 416b7f88", + "41245f7c 40e569e0 406d24c4 -> 41246a4a", + "41400988 40a42bc0 40385b00 -> 41400988", + "c191a580 c180460c c043a758 -> c180460c", + "4095aa98 40c4d518 4017cb92 -> 40c584c5", + "4187507e 41058132 403a47ee -> 4187507e", + "c0d35b30 41956538 bfc07ed6 -> 41956538", + "bfce8480 419fa258 408fd058 -> 419fa258", + "41272894 c037ace8 c02c6c2b -> 41272894", + "c10f2871 40de7270 be4a3160 -> 40de7270", + "4122a208 4137a3b8 c00fca86 -> 4137a3b8", + "c1230c36 c1518631 bf693ff0 -> c1230c36", + "c18ee1ca 40f59da4 40342d3c -> 40f59da4", + "bf824220 40ee0960 4080d324 -> 40ee0960", + "c0ae2750 c155647a 3f0766a8 -> c0ae2750", + "c0477090 c0a7f972 40887a4e -> c041c1cd", + "c12819ee 415ea124 c0372d02 -> 415ea124", + "40ac9028 40b04508 3e5a4680 -> 40b060bd", + "411463b8 c13cb3b4 406c3ad8 -> 411463b8", + "c0eadd64 419e9b74 c01f5fd4 -> 419e9b74", + "40b321e0 3f731fc0 40916e54 -> 40b321e0", + "c0f603d4 c105ed09 bff05fa0 -> c0f603d4", + "41861198 c0a43d00 be40f420 -> 41861198", + "c0dbc8e0 416c6490 c09aa6d0 -> 416c6490", + "c19cf2a8 41669aac c00c3a43 -> 41669aac", + "c00796d0 c1815e74 4054a928 -> c00796d0", + "c08471f2 c0cdf690 c08cf740 -> c08471f2", + "c0fac190 c1938742 40509814 -> c0fac190", + "c1157614 c173a60c c0607ecd -> c1157614", + "41229114 3f090120 409596c2 -> 41229114", + "3fcba960 4117ab1c 3ffb2fd4 -> 4117ab1c", + "3f9c6890 415626cc c0582d4a -> 415626cc", + "418f64d0 c18e08df 4070888c -> 418f64d0", + "c125f687 3e002b00 409f10e4 -> 3e002b00", + "c00bf088 4182e540 40991e4a -> 4182e540", + "c141df62 40a05ac8 403187d8 -> 40a05ac8", + "c1262157 c109b694 c079f6cd -> c109b694", + "c1943729 41866524 3fc86460 -> 41866524", + "c1457152 c0d21c94 be1bf820 -> c0d21c94", + "c16dbb6c c192c5eb c05246fc -> c16dbb6c", + "c157b103 c1566de6 40655170 -> c14d7ddd", + "3f0c33c0 4138a666 c06b468c -> 4138a666", + "c0e5cb14 bf572600 c097c610 -> bf572600", + "c1740cf8 bd2f5400 c0935595 -> bd2f5400", + "4192104e c15c4272 4057040c -> 4192104e", + "c18c0824 41659b5c c06cd906 -> 41659b5c", + "415e5b80 c189cb59 bd74db80 -> 415e5b80", + "c0a40d4c 3f0b26a0 c02db958 -> 3f0b26a0", + "41652450 3df1be00 404ae0d8 -> 41652450", + "c1934d23 c0ce0338 bc4ae800 -> c0ce0338", + "40e32470 414c850c c09b42f5 -> 414c850c", + "4102cf8a c18722c2 bfcf22d8 -> 4102cf8a", + "c1672fa6 418a2052 c072dbe4 -> 418a2052", + "415d8320 41710628 c062603c -> 41710628", + "412113fa c172145e 4036f8c0 -> 412113fa", + "c189a5d2 c1864777 40290cb8 -> c1842ff6", + "414d2e24 c16d610b be6a9a40 -> 414d2e24", + "c0b9ccf8 c10c16ec 4097056e -> c0b878fe", + "40e318e4 413a55a2 3fc1bf60 -> 413a55a2", + "40a61588 40c73dd0 c0093d16 -> 40c73dd0", + "c0ec4ec2 c10c4b45 c06670c4 -> c0ec4ec2", + "3f89f640 c0167cc0 3fe5973c -> 3f89f640", + "c19812a0 c11eaeee c086fe77 -> c11eaeee", + "bdb54400 41878fb0 4088ad5c -> 41878fb0", + "c19cfe91 c19f93d0 c0449cdb -> c19cfe91", + "c0c2e662 4099cac4 bf8a726e -> 4099cac4", + "c012c860 41386ff4 bf463660 -> 41386ff4", + "c18f15f2 c133c86a c039a092 -> c133c86a", + "c19910a2 c0e30e98 3ec4dfc0 -> c0e30e98", + "c1924863 c1975e73 c0089b27 -> c1924863", + "40ef1dc4 3eb8b280 c00f5e46 -> 40ef1dc4", + "41566134 3f9d5400 3f7545b8 -> 41566134", + "c19df7bc c1302ad0 3fe715a4 -> c1302ad0", + "c17bd2dd c1919332 40522000 -> c17baf43", + "40ee1350 c0e2cea6 c03c8069 -> 40ee1350", + "3fffdd30 c0c5d2b2 c00cef4c -> 3fffdd30", + "4132a7b8 c0da00b8 c0528fc0 -> 4132a7b8", + "c119e719 c1484322 406b2ef4 -> c119cf5c", + "41685080 c117fb7e c08c416d -> 41685080", + "418997e6 3e580380 c07417e4 -> 418997e6", + "c165d05c 419a35c4 c02ff208 -> 419a35c4", + "413a9e3a 41470694 bf5a98d8 -> 41470694", + "40c171f8 c1505e56 be969100 -> 40c171f8", + "407846e0 c0cb0774 bf85dfa0 -> 407846e0", + "41073bf6 c0d1be76 401b965a -> 41073bf6", + "407149a8 c0aa6b14 407d9ee8 -> 407149a8", + "c19e9014 bf90e750 4098b106 -> bf90e750", + "c11a74ba c1173880 3ffc86e8 -> c1136acf", + "c1760b68 c03a2810 bfe3ee94 -> c03a2810", + "c06a34f0 41970858 c0145a02 -> 41970858", + "3faea240 c1878fa3 400c7524 -> 3faea240", + "401e8ad8 4194fec0 c08bc8f5 -> 4194fec0", + "40842410 417c6b6c 3df24300 -> 417c6b6c", + "413a25cc 417f42a8 c0528b04 -> 417f42a8", + "4145e2d4 c14b69fe 409c41ae -> 4145e2d4", + "41306010 3ff6e790 40609c18 -> 41306010", + "c1706764 c11401e7 407d3a10 -> c11401e7", + "c15621c4 418827fc c0954184 -> 418827fc", + "c16579f1 4174a460 400ba408 -> 4174a460", + "3f8e5420 40e15344 bf94ded0 -> 40e15344", + "c1825776 c124b9c8 c03e6f07 -> c124b9c8", + "c13e781e c18be148 c0166473 -> c13e781e", + "40e13618 c16066c0 bfa5b976 -> 40e13618", + "40e65088 419d2030 be8d07c0 -> 419d2030", + "c093e662 c13745f5 3f3a81c0 -> c093e662", + "4143ed10 c0015e38 c085e741 -> 4143ed10", + "4105c018 c0ccd6ec 40729908 -> 4105c018", + "bf949b10 c10a25d7 40021298 -> bf949b10", + "c0a32820 c0a813e8 c05f6f3c -> c0a32820", + "40edf058 c04b8d68 c0855370 -> 40edf058", + "c0c66be0 c187dc3c c0343e33 -> c0c66be0", + "c16dfe7e 40fda970 3fc7f8e0 -> 40fda970", + "4195f202 4088b5e4 c073a76d -> 4195f202", + "410ee7d0 c1801d7f bf81789c -> 410ee7d0", + "bf4872c0 c00e3ea0 c00e4247 -> bf4872c0", + "c04493f0 4133d16e 400795ea -> 4133d16e", + "bfc91bb0 c0d2ce04 bf2c1050 -> bfc91bb0", + "40aee510 414c0a68 bfd1d5d0 -> 414c0a68", + "3e3de300 409bc8ec 4092b608 -> 409bc8ec", + "bd01a000 41531bf0 3ff88ec8 -> 41531bf0", + "c176f537 419cd172 40127c98 -> 419cd172", + "c10835dc c0d34396 4084fc6c -> c0cfc57f", + "c11d62c4 c11bf4b1 3e1e5520 -> c11becc2", + "41855200 41580910 405b4d80 -> 41855289", + "4193ec74 419b6c24 c0263078 -> 419b6c24", + "bf4aaa60 419cf9e4 405969d0 -> 419cf9e4", + "c03eac80 418fc874 3f609278 -> 418fc874", + "c01c1498 c12fe45e c084be2b -> c01c1498", + "40c0ba68 41055788 c01bc2e1 -> 41055788", + "4174acb4 409e13e8 c08787de -> 4174acb4", + "40fd20c0 bf9cd2f0 40313f00 -> 40fd20c0", + "c03fbb40 408bba08 c079dde2 -> 408bba08", + "40d98e34 c1445152 c079eddc -> 40d98e34", + "c0b07640 c153c236 3e7c6200 -> c0b07640", + "c1424f68 3fe1c450 bcb80800 -> 3fe1c450", + "4066b9b0 40df3338 4055321c -> 40df3338", + "c1815d38 c1982ee6 3fa7e158 -> c1815d38", + "c173fdc2 c1886b40 40738b08 -> c172833b", + "c17bdd3c 40e01fe0 40298740 -> 40e01fe0", + "40b7f1dc 40aed9e0 3fa20d58 -> 40bb1826", + "40cb7770 c0a41ef4 3faa02b8 -> 40cb7770", + "c01c2bc0 c133ec60 bfa8b92a -> c01c2bc0", + "c18af8c1 3fbe3de0 bf9e0976 -> 3fbe3de0", + "c16c5298 41468e40 403e451c -> 41468e40", + "411357ae c18bb800 40335320 -> 411357ae", + "c18bd0c0 c124b5bf 3fe7c630 -> c124b5bf", + "405fcee0 c18ca89d c095210b -> 405fcee0", + "c043d3f0 41376724 3f7d9f00 -> 41376724", + "c00c01a0 404a3880 bf8587b8 -> 404a3880", + "417db3f8 c0e82328 408ae68c -> 417db3f8", + "c0c6ca44 c19798ec 3f1106f0 -> c0c6ca44", + "bf2f48a0 41020928 403e4d44 -> 41020928", + "417ac4c4 4124bb88 bfdfb62a -> 417ac4c4", + "c16d137b 3f79fee0 c0682e1e -> 3f79fee0", + "bfde4940 4194cc14 c036ec0b -> 4194cc14", + "4155ab90 c08eaadc c09cb340 -> 4155ab90", + "c17fc81a c1921dde bf2ce948 -> c17fc81a", + "c1852dec c18dfd65 3f42f8a8 -> c1852dec", + "406d2310 c1294f4a 3f5a2580 -> 406d2310", + "c1953332 419dfabc 3fb30b00 -> 419dfabc", + "419733a4 c153a57a c03426b0 -> 419733a4", + "c0134748 4137128c 4035c018 -> 4137128c", + "c125fca1 c121b3c8 bfb2f250 -> c121b3c8", + "419a82ee c1526644 be171480 -> 419a82ee", + "c0b883a4 bfd7c660 3eb876c0 -> bfd7c660", + "417dec08 41956a16 404dcf00 -> 41956c58", + "c093586c 408ea810 c0461c71 -> 408ea810", + "c092baba 413d7c14 c00fd5d8 -> 413d7c14", + "3d83b400 c119094a 4096647a -> 3d83b400", + "4199c1ca 4179c2b0 bea53c70 -> 4199c1ca", + "c1383c1d 41652b28 4028c610 -> 41652b28", + "40ed3ed8 c15b7ac2 bfb9752e -> 40ed3ed8", + "4185fc4a c19b7bab c04d7a63 -> 4185fc4a", + "c032b090 406ea0c0 c065a1a7 -> 406ea0c0", + "40c02550 c174cdf8 406e2a88 -> 40c02550", + "418f1b7a 4111e5fc 3f7bf808 -> 418f1b7a", + "c1932856 40fab978 c0142375 -> 40fab978", + "4128ba62 40be8ba0 bf96bd22 -> 4128ba62", + "c0017840 405f1290 bfa2431a -> 405f1290", + "418dd794 418d1362 3e80dea0 -> 418debfe", + "4148f728 c1198034 bfb6ecf2 -> 4148f728", + "417b2e64 412d41fc bfef22d8 -> 417b2e64", + "410dc8a8 40da3d84 bffefc14 -> 410dc8a8", + "c14c3692 4198f9ba 4090e5c2 -> 4198f9ba" + ] + }, + { + "glsl": "float cultmath_cycles_compare(float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "40b692c4 40b69a37 3818fa43 -> 00000000", + "c1903d65 c1903c6e 3ab1e288 -> 3f800000", + "c0780180 c077ffb8 3a8bb34c -> 3f800000", + "c0a46a1e c0a462e7 39cbd06a -> 00000000", + "c1408419 c1408485 39db5fff -> 3f800000", + "c097b6be c097bb12 3a95670f -> 3f800000", + "419a337c 419a356f 39199fca -> 00000000", + "40c4d390 40c4d577 3a2e9e6e -> 3f800000", + "4135d4d2 4135d6ee 3a35cfb6 -> 3f800000", + "4016efd8 4016e6db 38f10799 -> 00000000", + "c10183f5 c1018104 3abc2cc3 -> 3f800000", + "c0ebddf0 c0ebe426 3ab5f968 -> 3f800000", + "c0ae14d0 c0ae1673 3adf50f7 -> 3f800000", + "40f928d0 40f92978 3a4a9e5f -> 3f800000", + "419d858e 419d8552 3a27aa6f -> 3f800000", + "c157dc6e c157dad9 3a28ef9a -> 3f800000", + "c17d76c3 c17d7812 3a63d815 -> 3f800000", + "4113c160 4113bee9 36ae81fc -> 00000000", + "4172e99c 4172ed9d 3a317830 -> 00000000", + "40ed06e8 40ed030f 3b00232b -> 3f800000", + "c0d74c04 c0d74660 3a2c5899 -> 00000000", + "bf7b67e0 bf7b9fb9 392a2af2 -> 00000000", + "bf703520 bf7002dd 3a2bb368 -> 00000000", + "3f19f720 3f19b7e1 3adb1606 -> 3f800000", + "410b8bec 410b8a2e 3a643ae3 -> 3f800000", + "40ef1720 40ef19c5 39b62c42 -> 3f800000", + "c19bc194 c19bc115 3906fc61 -> 00000000", + "c1982437 c1982466 3ae82842 -> 3f800000", + "409d4be4 409d4cfc 3aad0fbe -> 3f800000", + "4109bf3c 4109beb6 398a8e61 -> 3f800000", + "c0b8baa2 c0b8b7b4 398d987f -> 00000000", + "416f88f4 416f87d4 3ab671d1 -> 3f800000", + "c18d85ea c18d85d8 3a41385f -> 3f800000", + "c12742cf c1274149 3ad44994 -> 3f800000", + "419e4ffc 419e5059 3a29212c -> 3f800000", + "407d0208 407cf211 3aef06ee -> 3f800000", + "402c40b0 402c369f 3a2ba017 -> 3f800000", + "c1568d4e c1568be5 3aa8c0fc -> 3f800000", + "41843cfa 41843c30 3a4c08f7 -> 3f800000", + "c011a080 c01194f3 3a84f293 -> 3f800000", + "c04a5448 c04a4bb8 3a6a81d0 -> 3f800000", + "c142f8e6 c142fbb0 3a318d3b -> 00000000", + "41007470 41007741 3af2512a -> 3f800000", + "41192e00 41192f0f 3997bcfa -> 3f800000", + "41435334 41435574 3af52984 -> 3f800000", + "c11d15dc c11d19b6 3ae308fd -> 3f800000", + "40215530 40214597 3a91362a -> 3f800000", + "411ef384 411ef0a2 39ff3da1 -> 00000000", + "41431078 41430df0 3767bd1e -> 00000000", + "beb25a40 beb1e165 38e9445f -> 00000000", + "c0f74a22 c0f74841 3aae20c8 -> 3f800000", + "41674918 41674bb2 3af27278 -> 3f800000", + "c0aff7a8 c0aff2c0 3a613824 -> 3f800000", + "419adc0c 419addad 39b1452b -> 00000000", + "419bfbe2 419bfd3a 3a93c61b -> 3f800000", + "c14b1c2c c14b1d53 3aeb3954 -> 3f800000", + "410574ce 4105761b 3a117151 -> 3f800000", + "3f6c8040 3f6cb212 3ad92ffa -> 3f800000", + "4191077e 41910833 3aa0ca7f -> 3f800000", + "c13d85e8 c13d86cd 3afddebc -> 3f800000", + "c0d75d48 c0d7620b 3ae7679d -> 3f800000", + "416c0028 416bff9b 37f1fb54 -> 00000000", + "bf480f00 bf47d4d4 3afad9aa -> 3f800000", + "c19caf8d c19cadf2 39f1a7e2 -> 00000000", + "c0229060 c0228dc9 39840db8 -> 3f800000", + "c0935a74 c093562e 3a27c5c3 -> 3f800000", + "40e60570 40e60770 3ad9ef00 -> 3f800000", + "c179db6a c179d919 3a1e833f -> 3f800000", + "41320d2c 41320f7f 3ac08d9b -> 3f800000", + "4156dfe8 4156e340 39982225 -> 00000000", + "c0f149da c0f14f72 3a565497 -> 3f800000", + "bfc6fe00 bfc6f407 3ab489f5 -> 3f800000", + "c108c17f c108c49f 3a4f4e4e -> 3f800000", + "3ffc5c60 3ffc69a0 3a59f9c3 -> 3f800000", + "418cecc8 418ced98 3ac8f9ca -> 3f800000", + "c190f9f2 c190fba3 3a1dd0cd -> 00000000", + "4101a4c0 4101a54f 3aeefea5 -> 3f800000", + "c1043e87 c1043e54 3ac96fcf -> 3f800000", + "c16843b6 c16845fd 3a5fb071 -> 3f800000", + "404dd300 404dc595 3aaa162f -> 3f800000", + "c10cde9d c10cdd6d 38958118 -> 00000000", + "41479290 41479431 3ac03fdb -> 3f800000", + "414ddc74 414de059 3af2fadf -> 3f800000", + "c020adc0 c020bae8 3aa85a29 -> 3f800000", + "4187dee8 4187dd64 3af12a25 -> 3f800000", + "c0581390 c0581e67 39316a03 -> 00000000", + "3fb6ab10 3fb6ba38 3ab6be63 -> 3f800000", + "c02a2eb0 c02a3ab5 3a322b55 -> 00000000", + "c12aa0d7 c12aa4ca 3aa653d9 -> 3f800000", + "40b3b090 40b3adae 3a617729 -> 3f800000", + "c1184a12 c1184862 386c2acf -> 00000000", + "411dcef0 411dcd0c 38f0fd13 -> 00000000", + "c0997544 c0997b5a 3b02fb1a -> 3f800000", + "c1955908 c1955a28 396945e9 -> 00000000", + "c0a1222c c0a12604 3a764c24 -> 3f800000", + "c1138871 c1138984 3a4e706a -> 3f800000", + "415f0218 415f03e9 38de0c49 -> 00000000", + "c0ca2b30 c0ca32a6 3a3c5ef7 -> 00000000", + "41908cac 41908e17 3a861964 -> 3f800000", + "40faa43c 40faa585 3ab2739a -> 3f800000", + "c1805b67 c1805cb5 3aaabd1c -> 3f800000", + "be00df00 be01894c 3a4ddb90 -> 3f800000", + "4091fef8 4091f9b2 3ae1b5de -> 3f800000", + "41680244 4167fe76 38aa7f1e -> 00000000", + "c184b4cd c184b4ca 3a84a2c7 -> 3f800000", + "405bd968 405bcaf8 3ae37fca -> 3f800000", + "416cd5f4 416cd9c1 3aaa3953 -> 3f800000", + "c125ed86 c125eb22 3a9df4db -> 3f800000", + "c09d4f98 c09d48b6 3aad5420 -> 3f800000", + "40d82570 40d82a45 3a5dca05 -> 3f800000", + "3feb0d10 3feb1924 3a9035e9 -> 3f800000", + "c0e83c4c c0e8352e 38b89d29 -> 00000000", + "bfcd39e0 bfcd2127 393d0cdf -> 00000000", + "c187514a c18750a7 39c8048a -> 3f800000", + "3fa799c0 3fa7b999 3ab3d52d -> 3f800000", + "c19c1123 c19c1222 3a8e2b64 -> 3f800000", + "41622088 41621f6f 3ace4c0a -> 3f800000", + "40b7f200 40b7f756 3aa11816 -> 3f800000", + "c195f4dc c195f364 3a4c20c0 -> 3f800000", + "c190658c c190671b 3a05cba9 -> 00000000", + "41142024 411423ca 3a48e32b -> 00000000", + "c01ec060 c01ec662 3a381f88 -> 3f800000", + "bec1f2c0 bec1acd4 3a94e4d8 -> 3f800000", + "bfc2d0a0 bfc2e923 39befecf -> 00000000", + "4131b96e 4131bbd4 3a21bd41 -> 3f800000", + "bfd3f690 bfd3e8ee 3ad3497b -> 3f800000", + "41854bac 41854b1e 3aaddc94 -> 3f800000", + "c173ed8d c173eaf7 3a60ee0e -> 3f800000", + "40ae2af0 40ae3187 3ae10f9a -> 3f800000", + "418b63e8 418b6309 391fec71 -> 00000000", + "40c5fb00 40c5f98b 3ac6937f -> 3f800000", + "41565e74 41565d30 3aba2e6a -> 3f800000", + "4144db78 4144d826 3aaf760b -> 3f800000", + "c0d36e18 c0d36dbd 3a8075be -> 3f800000", + "4197ca9e 4197ca2c 39fb8772 -> 3f800000", + "4086293c 40862f3b 3889b805 -> 00000000", + "c0f84774 c0f84643 399d6fc0 -> 3f800000", + "40555e60 40555253 3ac5e75c -> 3f800000", + "406b6e58 406b7208 3987f3d3 -> 3f800000", + "4191535a 41915497 3a594469 -> 3f800000", + "be969300 be968499 3a7b6bb5 -> 3f800000", + "bea96ac0 bea91a33 3abb61c8 -> 3f800000", + "c040ec48 c040ddc6 3a6a7b15 -> 3f800000", + "407b90d0 407b95c3 3aa0c2f2 -> 3f800000", + "c16888cc c1688821 3add0012 -> 3f800000", + "c15127f2 c1512adc 3a5e62cb -> 3f800000", + "c146f2d4 c146f6ab 3897c8b1 -> 00000000", + "41507370 41507480 3abb463d -> 3f800000", + "41885b48 41885987 3a123f53 -> 00000000", + "c19f2ddf c19f2eec 3ac02db6 -> 3f800000", + "404e4300 404e4e95 3a1986a9 -> 00000000", + "c11cd8d4 c11cd606 3afd7293 -> 3f800000", + "c19ca4c2 c19ca4d4 3a991dfa -> 3f800000", + "3f805da0 3f8048aa 3af2079d -> 3f800000", + "405b2190 405b285f 3af1a32f -> 3f800000", + "3fbcdc20 3fbcd8a1 3a904e4e -> 3f800000", + "4183ce56 4183ce01 3a756734 -> 3f800000", + "410382f8 41038524 3aca0664 -> 3f800000", + "c09be21a c09bdf5e 3af294b6 -> 3f800000", + "4129b282 4129b30c 3ac0ecf5 -> 3f800000", + "c0243258 c02434e6 3ab76fe1 -> 3f800000", + "41090ba4 410907b1 3ad113a4 -> 3f800000", + "c0e5d9e0 c0e5d39f 3ac1dec3 -> 3f800000", + "4170c874 4170c5b1 3aad82ed -> 3f800000", + "4159a568 4159a6c0 3adf1b1a -> 3f800000", + "c177bb86 c177bda7 3af1a4dc -> 3f800000", + "413b4714 413b462c 3aa3bf17 -> 3f800000", + "41123722 411233c8 3ad8101b -> 3f800000", + "c11660e1 c1165dce 39397cd7 -> 00000000", + "3f62f4a0 3f632600 39b7bdc9 -> 00000000", + "c192bc2b c192bd36 3af06353 -> 3f800000", + "415ecfac 415ecc4f 3ac6bb32 -> 3f800000", + "c130f38e c130f083 3ab4e5a0 -> 3f800000", + "c170818e c17083e1 3a9418ba -> 3f800000", + "4146fe54 4146fa86 3a0640b0 -> 00000000", + "4143f3d8 4143f6d6 3953a964 -> 00000000", + "41864438 41864342 3a5fc90d -> 3f800000", + "c19edb36 c19ed947 39b8f42c -> 00000000", + "c178c305 c178c152 3a2dc02c -> 3f800000", + "417058d0 41705865 39958a55 -> 3f800000", + "4105d5ba 4105d82c 3728b725 -> 00000000", + "4024ad08 4024b800 3af07b8a -> 3f800000", + "411cba28 411cbe30 3a96b241 -> 3f800000", + "c1823eed c1823d55 3a414648 -> 00000000", + "c12bb120 c12bafbf 39b5298d -> 3f800000", + "c18ce56b c18ce3b5 38e6b0ef -> 00000000", + "402e7570 402e7417 37a23983 -> 00000000", + "419c0194 419c0200 3aa0472c -> 3f800000", + "411ef8ac 411ef4e3 3a0f076a -> 00000000", + "4119ff74 411a0165 3a482de2 -> 3f800000", + "c03ba848 c03bad43 3a5d70d4 -> 3f800000", + "3ff2f760 3ff2f1cf 3a5b40de -> 3f800000", + "40196238 401959ea 39d2a8a8 -> 00000000", + "c0ce7748 c0ce7e78 3ae4fa9a -> 3f800000", + "3f857720 3f858c87 3a45139d -> 3f800000", + "c18d60b0 c18d5f93 3a1f721c -> 3f800000", + "c19ed7ca c19ed9a0 3acf0ef0 -> 3f800000", + "c10f1a4b c10f1bdf 3b01cb02 -> 3f800000", + "c16aea8b c16ae8ba 39cd309b -> 00000000", + "c0882be8 c08826bb 3ad0e67c -> 3f800000", + "40b90a18 40b901f9 3a05be80 -> 00000000", + "c14472d2 c1447175 3a8deef6 -> 3f800000", + "418ecf08 418ecfc9 3a04d002 -> 3f800000", + "4122edee 4122edee 3aafe197 -> 3f800000", + "41629ff0 41629db9 3a5070bc -> 3f800000", + "c168d796 c168d7e7 3acb6b24 -> 3f800000", + "c12944b0 c1294321 3a0b7ac9 -> 3f800000", + "4195fae0 4195fbd9 3ab3a084 -> 3f800000", + "406b6220 406b56aa 38aa316f -> 00000000", + "c02dc410 c02dc6dd 3ab5cba2 -> 3f800000", + "c131983d c1319af9 3a61cb22 -> 3f800000", + "c075bd08 c075b6ab 38ef2e14 -> 00000000", + "40978988 409786cc 39a81a56 -> 00000000", + "41560e08 41560ada 3937a36e -> 00000000", + "c18fbe90 c18fbf97 3a90a86e -> 3f800000", + "c173e248 c173e2eb 3923763f -> 3f800000", + "406d3e88 406d4ecf 3a086432 -> 00000000", + "c04d8ea0 c04d99d4 3983d7f5 -> 00000000", + "3f9dfa80 3f9e0607 3a0c1ede -> 3f800000", + "4032e0a8 4032e3f8 3a874395 -> 3f800000", + "3d0c3c00 3d0c59af 3a0d6f67 -> 3f800000", + "40192710 4019281d 3a2ed78b -> 3f800000", + "c1263ab6 c1263b1f 3a8c5441 -> 3f800000", + "c0cc1ab6 c0cc1a6b 3986ac23 -> 3f800000", + "40940d00 40940b61 3a9797bf -> 3f800000", + "c14dc75e c14dc3f2 3a7fd5da -> 3f800000", + "c16aa054 c16aa08d 3abed6d1 -> 3f800000", + "41940ada 41940c3e 3a5b05ac -> 3f800000", + "c02aa0a0 c02a96b4 378999fd -> 00000000", + "c0f9b032 c0f9aa15 381930f5 -> 00000000", + "4139734c 41396f99 3abfde08 -> 3f800000", + "40b8bc2c 40b8b972 3a9cb332 -> 3f800000", + "414b6444 414b6431 3abbf307 -> 3f800000", + "c13442e8 c1343fce 3afedbc8 -> 3f800000", + "3fda4620 3fda35e1 3a7b1d69 -> 3f800000", + "c16bb442 c16bb1c4 3ac6741c -> 3f800000", + "3ff2f8b0 3ff2ef03 3ac6b393 -> 3f800000", + "4132bf22 4132be9d 39864f2d -> 3f800000", + "4138518a 413851da 3ab0deb6 -> 3f800000", + "41614a10 41614701 3abf2c22 -> 3f800000", + "c0dfa350 c0df9c2e 3a973dc3 -> 3f800000", + "3f2e9ac0 3f2ea168 3a7609df -> 3f800000", + "c0847500 c0846d47 390d7572 -> 00000000", + "4199c3fe 4199c36c 3a5fd395 -> 3f800000", + "412d7038 412d739e 3a9bce31 -> 3f800000", + "4123b3e2 4123b33a 3a99f652 -> 3f800000", + "418c6984 418c68b4 3b02e8fa -> 3f800000", + "c11f41b2 c11f3f96 3a888433 -> 3f800000", + "c1196c66 c1197069 3aa07118 -> 3f800000", + "4084e67c 4084ec53 3ad08124 -> 3f800000", + "418760e2 418762ca 3a3f19f3 -> 00000000", + "419c10ca 419c1266 3af749bf -> 3f800000", + "c0860e68 c086162e 3ab7dafe -> 3f800000", + "c19ce6d3 c19ce5dc 3ada497f -> 3f800000", + "40f2ac00 40f2ad19 3b01fc61 -> 3f800000", + "c0d83aba c0d842c8 3a88b018 -> 3f800000" + ] + }, + { + "glsl": "float cultmath_cycles_round(float)", + "tolerance": "ulp-bounded", + "cases": [ + "3facbb80 -> 3f800000", + "c195b12d -> c1980000", + "c1745669 -> c1700000", + "c1840953 -> c1880000", + "41843b86 -> 41880000", + "414fe5d4 -> 41500000", + "4113852c -> 41100000", + "c18847fa -> c1880000", + "c14e2b6e -> c1500000", + "c18e067c -> c1900000", + "c11ba9ee -> c1200000", + "3fce5980 -> 40000000", + "4164a2f0 -> 41600000", + "413b5244 -> 41400000", + "c1766422 -> c1700000", + "c111dfd0 -> c1100000", + "c18d9ce3 -> c1900000", + "c0868ba4 -> c0800000", + "c18c06b3 -> c1900000", + "41354ea6 -> 41300000", + "c198f616 -> c1980000", + "40c14eb4 -> 40c00000", + "c0b289d2 -> c0c00000", + "c0872452 -> c0800000", + "417704bc -> 41700000", + "41895056 -> 41880000", + "402a1770 -> 40400000", + "c155b7da -> c1500000", + "401da130 -> 40000000", + "c1460e48 -> c1400000", + "3f94c380 -> 3f800000", + "4189587c -> 41880000", + "c19f4d60 -> c1a00000", + "c18300e7 -> c1800000", + "c189921a -> c1880000", + "414f6ee8 -> 41500000", + "40e2c364 -> 40e00000", + "4156d468 -> 41500000", + "c18f2e6d -> c1900000", + "3fcb0ac0 -> 40000000", + "c11b639a -> c1200000", + "414c1eb4 -> 41500000", + "4129e678 -> 41300000", + "c0cdf47c -> c0c00000", + "412c0906 -> 41300000", + "c158ed8c -> c1600000", + "c15e7096 -> c1600000", + "418d99fe -> 41900000", + "410b518e -> 41100000", + "c05328c0 -> c0400000", + "3ec21c00 -> 00000000", + "4077e088 -> 40800000", + "c1140ff7 -> c1100000", + "c12fffbc -> c1300000", + "bcbbd400 -> 00000000", + "4174f018 -> 41700000", + "40dbc520 -> 40e00000", + "410f3bbe -> 41100000", + "c13f1762 -> c1400000", + "419aeb30 -> 41980000", + "c11aa007 -> c1200000", + "4024f418 -> 40400000", + "3f007be0 -> 3f800000", + "419bf16c -> 41980000", + "3f8ad4c0 -> 3f800000", + "c0dcb5cc -> c0e00000", + "3fc32f70 -> 40000000", + "412aa4c0 -> 41300000", + "410e7678 -> 41100000", + "c105d308 -> c1000000", + "4072fa00 -> 40800000", + "c1320e2f -> c1300000", + "c0c9d1f0 -> c0c00000", + "3f691420 -> 3f800000", + "3f859200 -> 3f800000", + "c13e0ae0 -> c1400000", + "4176c0e0 -> 41700000", + "c1992556 -> c1980000", + "40a0c9a4 -> 40a00000", + "410ff248 -> 41100000", + "41311142 -> 41300000", + "409ea3c0 -> 40a00000", + "c00425a0 -> c0000000", + "c163cd82 -> c1600000", + "40e7c1b0 -> 40e00000", + "418a5028 -> 41880000", + "40cd81dc -> 40c00000", + "413164fc -> 41300000", + "40697070 -> 40800000", + "c148144b -> c1500000", + "c15e73a9 -> c1600000", + "419112fa -> 41900000", + "40abd794 -> 40a00000", + "c18a199d -> c1880000", + "c10bfea0 -> c1100000", + "40f6bec0 -> 41000000", + "c0f7d212 -> c1000000", + "413203a0 -> 41300000", + "4147ab28 -> 41400000", + "c0167050 -> c0000000", + "409d5908 -> 40a00000", + "c0922aaa -> c0a00000", + "c133427c -> c1300000", + "c03b6da0 -> c0400000", + "414e7754 -> 41500000", + "c107e0f2 -> c1000000", + "c11d1ee8 -> c1200000", + "411d5ec8 -> 41200000", + "40fe9c08 -> 41000000", + "c102530a -> c1000000", + "419f179c -> 41a00000", + "40c05a78 -> 40c00000", + "c1809489 -> c1800000", + "bf709aa0 -> bf800000", + "c13b3ae1 -> c1400000", + "40ac1c2c -> 40a00000", + "c175b991 -> c1700000", + "c0a85580 -> c0a00000", + "c0f7fbfe -> c1000000", + "4072e928 -> 40800000", + "40d5c850 -> 40e00000", + "412700f0 -> 41200000", + "c14fb75c -> c1500000", + "3fb45620 -> 3f800000", + "c1675f5e -> c1600000", + "40b53118 -> 40c00000", + "40601818 -> 40800000", + "c110b5be -> c1100000", + "c125701f -> c1200000", + "415552e0 -> 41500000", + "417dde28 -> 41800000", + "c17b42c2 -> c1800000", + "c139f5d5 -> c1400000", + "c149ff1b -> c1500000", + "c17eba3e -> c1800000", + "c08bb2d2 -> c0800000", + "c075ae88 -> c0800000", + "c1991700 -> c1980000", + "c0e489a8 -> c0e00000", + "c0887c68 -> c0800000", + "40e37e6c -> 40e00000", + "4184b114 -> 41880000", + "c186f484 -> c1880000", + "c10350db -> c1000000", + "c1464384 -> c1400000", + "3daf8d00 -> 00000000", + "41634f04 -> 41600000", + "c15b0a8c -> c1600000", + "416707a8 -> 41600000", + "40bbe690 -> 40c00000", + "404463c8 -> 40400000", + "418c20dc -> 41900000", + "bf8ff300 -> bf800000", + "c1350f21 -> c1300000", + "412f7fc4 -> 41300000", + "4167ab94 -> 41600000", + "c1395df9 -> c1400000", + "40ec6584 -> 40e00000", + "c1077c0a -> c1000000", + "c14c213b -> c1500000", + "41001908 -> 41000000", + "4199cb6a -> 41980000", + "3e33ba00 -> 00000000", + "4169fb28 -> 41700000", + "c0806266 -> c0800000", + "417971fc -> 41800000", + "c01773c0 -> c0000000", + "41846b04 -> 41880000", + "c0a09ed6 -> c0a00000", + "414a9e88 -> 41500000", + "c12c8647 -> c1300000", + "c181c5c9 -> c1800000", + "c190f2f6 -> c1900000", + "4184201c -> 41880000", + "41857d8a -> 41880000", + "41218202 -> 41200000", + "40e9d3f8 -> 40e00000", + "41739980 -> 41700000", + "c0c66374 -> c0c00000", + "40ae8310 -> 40a00000", + "41374988 -> 41300000", + "c033bdb8 -> c0400000", + "c05ef590 -> c0400000", + "40727260 -> 40800000", + "c11bc614 -> c1200000", + "4192ce38 -> 41900000", + "40ad7740 -> 40a00000", + "419d8ca6 -> 41a00000", + "c065fb78 -> c0800000", + "c12665d2 -> c1200000", + "c14c7b70 -> c1500000", + "410c619c -> 41100000", + "41154e0a -> 41100000", + "c1662399 -> c1600000", + "40f75188 -> 41000000", + "40fc50c0 -> 41000000", + "c065b300 -> c0800000", + "c137e430 -> c1300000", + "417ce058 -> 41800000", + "c0ff6afe -> c1000000", + "c18c61fb -> c1900000", + "418d3c7e -> 41900000", + "413544e0 -> 41300000", + "c191cb71 -> c1900000", + "c05619c0 -> c0400000", + "bf35b7e0 -> bf800000", + "417a27a0 -> 41800000", + "401705a0 -> 40000000", + "c1000a35 -> c1000000", + "c1990120 -> c1980000", + "c14d3e66 -> c1500000", + "c0d9eef0 -> c0e00000", + "c0cd3708 -> c0c00000", + "40c284e0 -> 40c00000", + "c086d584 -> c0800000", + "c112f78c -> c1100000", + "402d50e8 -> 40400000", + "41831928 -> 41800000", + "408b8274 -> 40800000", + "c0173690 -> c0000000", + "c11d49a4 -> c1200000", + "c003d8f0 -> c0000000", + "3e153900 -> 00000000", + "c169e99a -> c1700000", + "40ae33f0 -> 40a00000", + "3ee30380 -> 00000000", + "c0b1b338 -> c0c00000", + "41821ed8 -> 41800000", + "c133688e -> c1300000", + "c1332d4d -> c1300000", + "c0ca227c -> c0c00000", + "bf998eb0 -> bf800000", + "419b5c94 -> 41980000", + "c191be1e -> c1900000", + "404015f0 -> 40400000", + "415cd08c -> 41600000", + "40bb9768 -> 40c00000", + "c0a84d04 -> c0a00000", + "c14ddcf7 -> c1500000", + "412f956a -> 41300000", + "c18a4598 -> c1880000", + "c18782e5 -> c1880000", + "40f64704 -> 41000000", + "c08ef93c -> c0800000", + "c18c93b6 -> c1900000", + "41607c08 -> 41600000", + "c09a05c0 -> c0a00000", + "c185fa32 -> c1880000", + "411d472a -> 41200000", + "c0457ec8 -> c0400000", + "c16d2bda -> c1700000", + "3cc1e400 -> 00000000", + "4084b528 -> 40800000", + "bfea9020 -> c0000000", + "c19135ed -> c1900000", + "40906488 -> 40a00000" + ] + }, + { + "glsl": "float cultmath_cycles_trunc(float)", + "tolerance": "ulp-bounded", + "cases": [ + "c01f6fa8 -> c0000000", + "40be5cf4 -> 40a00000", + "c06ac368 -> c0400000", + "4181b0b8 -> 41800000", + "c17281e1 -> c1700000", + "419af4fa -> 41980000", + "c0cdac10 -> c0c00000", + "c1866e74 -> c1800000", + "40e61dfc -> 40e00000", + "4105f370 -> 41000000", + "c0c76140 -> c0c00000", + "c1031f49 -> c1000000", + "c1876187 -> c1800000", + "3ffe2590 -> 3f800000", + "409e7984 -> 40800000", + "c1408543 -> c1400000", + "41140f46 -> 41100000", + "41562bd0 -> 41500000", + "c0a284ec -> c0a00000", + "c14e43da -> c1400000", + "4123e644 -> 41200000", + "c1762e7c -> c1700000", + "c1886117 -> c1880000", + "41369df0 -> 41300000", + "c16be504 -> c1600000", + "c10ce538 -> c1000000", + "c159097c -> c1500000", + "413df722 -> 41300000", + "c18300ba -> c1800000", + "415a8dd0 -> 41500000", + "416a7394 -> 41600000", + "3fa05960 -> 3f800000", + "419f77d0 -> 41980000", + "4193e99c -> 41900000", + "c06d4e30 -> c0400000", + "419f4e9c -> 41980000", + "4193452c -> 41900000", + "c1113e6a -> c1100000", + "40c42e94 -> 40c00000", + "c1853a91 -> c1800000", + "4117d03c -> 41100000", + "409000d0 -> 40800000", + "41057464 -> 41000000", + "c0be35b8 -> c0a00000", + "3e859500 -> 00000000", + "c184f1cb -> c1800000", + "c19e98ac -> c1980000", + "c1427d88 -> c1400000", + "413f638c -> 41300000", + "4189acb4 -> 41880000", + "412c51ac -> 41200000", + "412c2ec4 -> 41200000", + "c18607c8 -> c1800000", + "416bd800 -> 41600000", + "41644c00 -> 41600000", + "c0e35ada -> c0e00000", + "403fc2a0 -> 40000000", + "409d6268 -> 40800000", + "412f4676 -> 41200000", + "415a6358 -> 41500000", + "414ef370 -> 41400000", + "3fd996a0 -> 3f800000", + "419c9246 -> 41980000", + "4158812c -> 41500000", + "415b7fdc -> 41500000", + "41484434 -> 41400000", + "c1020ee7 -> c1000000", + "c1769644 -> c1700000", + "c164e7c4 -> c1600000", + "40a13f14 -> 40a00000", + "c1270f9b -> c1200000", + "bfd59280 -> bf800000", + "c14beb7a -> c1400000", + "c106cd52 -> c1000000", + "c0185060 -> c0000000", + "c1641a24 -> c1600000", + "c06e8b80 -> c0400000", + "410e58b0 -> 41000000", + "c10d8eb5 -> c1000000", + "c19100b6 -> c1900000", + "c10fb3e0 -> c1000000", + "4194ba06 -> 41900000", + "419f49cc -> 41980000", + "c1595adc -> c1500000", + "c188e1ee -> c1880000", + "c180dd98 -> c1800000", + "bfff2a20 -> bf800000", + "c16ce861 -> c1600000", + "c17c78ca -> c1700000", + "c184d30f -> c1800000", + "c0454dc0 -> c0400000", + "c0d04db6 -> c0c00000", + "bd04e000 -> 80000000", + "4147b3f4 -> 41400000", + "c1196893 -> c1100000", + "c1436298 -> c1400000", + "409db7b8 -> 40800000", + "416cf334 -> 41600000", + "3eaca900 -> 00000000", + "40f7d0e8 -> 40e00000", + "41382b50 -> 41300000", + "417964f0 -> 41700000", + "c18ecae2 -> c1880000", + "c1513bfe -> c1500000", + "40f4d20c -> 40e00000", + "c0f1f804 -> c0e00000", + "40606900 -> 40400000", + "413abdc4 -> 41300000", + "c0384fa0 -> c0000000", + "41086624 -> 41000000", + "4184faba -> 41800000", + "416197f8 -> 41600000", + "c0c78030 -> c0c00000", + "411147e2 -> 41100000", + "40285ce0 -> 40000000", + "41657f64 -> 41600000", + "3fe4fa00 -> 3f800000", + "41527f68 -> 41500000", + "412a450c -> 41200000", + "411d3b0e -> 41100000", + "c0afad0e -> c0a00000", + "c1552686 -> c1500000", + "c19d0ebe -> c1980000", + "c18da0d3 -> c1880000", + "c13e0d06 -> c1300000", + "41808ba0 -> 41800000", + "4192e948 -> 41900000", + "c0a73edc -> c0a00000", + "c196b260 -> c1900000", + "c122b180 -> c1200000", + "3f50a000 -> 00000000", + "3fbb4f50 -> 3f800000", + "c1370c9a -> c1300000", + "405a2368 -> 40400000", + "c11a2cbe -> c1100000", + "c092319c -> c0800000", + "418384e8 -> 41800000", + "414fcf94 -> 41400000", + "bf9e1f00 -> bf800000", + "41273824 -> 41200000", + "3ec55200 -> 00000000", + "40cab9f0 -> 40c00000", + "41012b88 -> 41000000", + "c089bdde -> c0800000", + "c1539b90 -> c1500000", + "40345258 -> 40000000", + "419dcc9e -> 41980000", + "412e333e -> 41200000", + "c1226344 -> c1200000", + "c07b9fd8 -> c0400000", + "40bffc58 -> 40a00000", + "413c5c74 -> 41300000", + "c17d51d5 -> c1700000", + "41282a3c -> 41200000", + "c0d8820e -> c0c00000", + "409aa3ac -> 40800000", + "41738268 -> 41700000", + "419ed5f2 -> 41980000", + "41966884 -> 41900000", + "413951c4 -> 41300000", + "c0bd9d20 -> c0a00000", + "c1344652 -> c1300000", + "41282284 -> 41200000", + "c14b6268 -> c1400000", + "c144a3db -> c1400000", + "c09ae8ec -> c0800000", + "40b14928 -> 40a00000", + "4125b70e -> 41200000", + "bfa45b00 -> bf800000", + "c14ccffa -> c1400000", + "418f3aca -> 41880000", + "410ccfaa -> 41000000", + "c0b3796c -> c0a00000", + "c19e798d -> c1980000", + "c128ef82 -> c1200000", + "4102cc80 -> 41000000", + "bfb29070 -> bf800000", + "409582e8 -> 40800000", + "417859e8 -> 41700000", + "40a9bcc8 -> 40a00000", + "4182bf02 -> 41800000", + "c14860b1 -> c1400000", + "c1713c2a -> c1700000", + "40a30668 -> 40a00000", + "40754150 -> 40400000", + "4110ad8c -> 41100000", + "c02d1108 -> c0000000", + "bff9b6b0 -> bf800000", + "c11d3621 -> c1100000", + "40b102d8 -> 40a00000", + "3e593280 -> 00000000", + "4184aef6 -> 41800000", + "4162fe90 -> 41600000", + "40e5d4b8 -> 40e00000", + "c067e530 -> c0400000", + "c1058f1d -> c1000000", + "417d3a74 -> 41700000", + "3f48df20 -> 00000000", + "c1403b13 -> c1400000", + "4139d8e8 -> 41300000", + "418a3800 -> 41880000", + "c12a1dd3 -> c1200000", + "c0fa82c6 -> c0e00000", + "c18ac9a4 -> c1880000", + "bfeaec50 -> bf800000", + "41899740 -> 41880000", + "c0279b58 -> c0000000", + "c1802f5d -> c1800000", + "3f88cdf0 -> 3f800000", + "40a1e4f0 -> 40a00000", + "c15c5c1b -> c1500000", + "c1173f0a -> c1100000", + "c17aae08 -> c1700000", + "c0d01aba -> c0c00000", + "4173d3c0 -> 41700000", + "c1566dde -> c1500000", + "c1818514 -> c1800000", + "c16960b2 -> c1600000", + "405d3508 -> 40400000", + "bfaa8b40 -> bf800000", + "418ee7e6 -> 41880000", + "c1482496 -> c1400000", + "3e3b4c00 -> 00000000", + "4152f334 -> 41500000", + "40df9678 -> 40c00000", + "c195742c -> c1900000", + "4169d11c -> 41600000", + "40e6b1e0 -> 40e00000", + "407418c0 -> 40400000", + "418e4fce -> 41880000", + "41459210 -> 41400000", + "418e9000 -> 41880000", + "c0540de8 -> c0400000", + "c180bf7e -> c1800000", + "41006e60 -> 41000000", + "40df37ac -> 40c00000", + "4174e0b0 -> 41700000", + "c18dd471 -> c1880000", + "c1511f40 -> c1500000", + "40d443a8 -> 40c00000", + "c1056b9e -> c1000000", + "c0d5cb0e -> c0c00000", + "4187d7b6 -> 41800000", + "40a3aed0 -> 40a00000", + "bf3227a0 -> 80000000", + "c1255c2d -> c1200000", + "41440bf4 -> 41400000", + "3f30bec0 -> 00000000", + "413f169a -> 41300000", + "c1238b6d -> c1200000", + "c14284f5 -> c1400000", + "41269b24 -> 41200000", + "418aa058 -> 41880000", + "41151654 -> 41100000", + "415c091c -> 41500000", + "411c949a -> 41100000" + ] + }, + { + "glsl": "float cultmath_cycles_fract(float)", + "tolerance": "ulp-bounded", + "cases": [ + "4112f4fc -> 3e3d3f00", + "bf81a4b0 -> 3f7cb6a0", + "c08abd0a -> 3f2a17b0", + "c049d4c8 -> 3f58ace0", + "c18b514d -> 3f15d660", + "4122c03a -> 3e300e80", + "3e26c600 -> 3e26c600", + "4051e890 -> 3e8f4480", + "414b6068 -> 3f360680", + "c1397c1b -> 3ed07ca0", + "415dc470 -> 3f5c4700", + "c19c9786 -> 3eda1e80", + "40af0884 -> 3ef08840", + "c13bc817 -> 3e86fd20", + "c10b4e90 -> 3e962e00", + "c193b0a3 -> 3f09eba0", + "4193df48 -> 3ef7d200", + "418695b8 -> 3f52b700", + "c14fe5ca -> 3bd1b000", + "40916aa4 -> 3f0b5520", + "c117d403 -> 3f02bfd0", + "417115c8 -> 3d8ae400", + "c0c3d4a4 -> 3f615ae0", + "c02b6258 -> 3ea4ed40", + "c12ef44d -> 3d85d980", + "c0c275a0 -> 3f6c5300", + "41744254 -> 3e884a80", + "c0bedcc6 -> 3d119d00", + "411f2490 -> 3f724900", + "c190848c -> 3f6f6e80", + "c19c1057 -> 3efbea40", + "40ebcc64 -> 3ebcc640", + "c11d8818 -> 3e1dfa00", + "4191ece4 -> 3e767200", + "418e536c -> 3f4a6d80", + "c06baae0 -> 3ea2a900", + "40d36b48 -> 3f1b5a40", + "412155f2 -> 3daaf900", + "408188dc -> 3d446e00", + "3fbea140 -> 3efa8500", + "41527f60 -> 3e1fd800", + "c0c9956e -> 3f335490", + "41467700 -> 3ecee000", + "c111a65f -> 3f659a10", + "c0864138 -> 3f4df640", + "413d3b00 -> 3f53b000", + "417387a8 -> 3e61ea00", + "406b7ac8 -> 3f2deb20", + "4193e192 -> 3ef86480", + "c15b23af -> 3e9b8a20", + "413edc96 -> 3f6dc960", + "c19bf560 -> 3f015400", + "4013f078 -> 3e9f83c0", + "c12cac36 -> 3e54f280", + "bf397640 -> 3e8d1380", + "4161df38 -> 3def9c00", + "c16e4a46 -> 3ddadd00", + "4192bd08 -> 3eaf4200", + "c14380e5 -> 3f47f1b0", + "410a9834 -> 3f298340", + "416e7de4 -> 3f67de40", + "c15df687 -> 3e025e40", + "41555594 -> 3eaab280", + "412c6980 -> 3f469800", + "c1415b6d -> 3f6a4930", + "c15821c3 -> 3efbc7a0", + "4124590e -> 3e8b21c0", + "40e754f0 -> 3e6a9e00", + "c1186ef0 -> 3ef22200", + "416f9c28 -> 3f79c280", + "c0a22dd4 -> 3f6e9160", + "c1399764 -> 3ecd1380", + "c0e73200 -> 3f467000", + "40b08c1c -> 3f0460e0", + "413635ee -> 3ec6bdc0", + "41867b5a -> 3f4f6b40", + "c18ab09c -> 3f29ec80", + "c18821f9 -> 3f7bc0e0", + "c193dbfe -> 3f048040", + "c030bd30 -> 3e742d00", + "bfa613c0 -> 3f33d880", + "c1069c5e -> 3f163a20", + "c08e630c -> 3f0ce7a0", + "406920f8 -> 3f2483e0", + "c11fe5ae -> 3bd29000", + "419fe508 -> 3f7ca100", + "c16f15ed -> 3d6a1300", + "c1986df1 -> 3f7241e0", + "bf847690 -> 3f7712e0", + "c1829c2e -> 3f2c7a40", + "c10ca072 -> 3e57e380", + "41043b92 -> 3e877240", + "40135b60 -> 3e9adb00", + "41762c38 -> 3ec58700", + "40d2ac84 -> 3f156420", + "40e0ebd4 -> 3cebd400", + "3ebbf6c0 -> 3ebbf6c0", + "c192f941 -> 3f20d7e0", + "c1882579 -> 3f7b50e0", + "c12afed9 -> 3ea024e0", + "c1938f07 -> 3f0e1f20", + "c14022cd -> 3f7dd330", + "c0d964ba -> 3e5368c0", + "c183ec82 -> 3f026fc0", + "4135f33c -> 3ebe6780", + "4061cff0 -> 3f073fc0", + "40f75c84 -> 3f3ae420", + "41865b08 -> 3f4b6100", + "c00b8890 -> 3f51ddc0", + "401dc798 -> 3eee3cc0", + "4137406c -> 3ee80d80", + "c18f032a -> 3dfcd600", + "41869906 -> 3f5320c0", + "4128ae68 -> 3f0ae680", + "c120a552 -> 3f75aae0", + "40546910 -> 3ea34880", + "41293b00 -> 3f13b000", + "c124f2ac -> 3f30d540", + "3f44f2e0 -> 3f44f2e0", + "c141257e -> 3f6da820", + "c19485eb -> 3ede8540", + "411534f0 -> 3ea69e00", + "c13bc6b8 -> 3e872900", + "c1533696 -> 3f4c96a0", + "4070f260 -> 3f43c980", + "40d55b08 -> 3f2ad840", + "40c3238c -> 3dc8e300", + "c02714e0 -> 3ec75900", + "419777e6 -> 3f6efcc0", + "c17a3ffc -> 3eb80080", + "c063a408 -> 3ee2dfc0", + "c197b75b -> 3d114a00", + "c19ffc80 -> 3ae00000", + "414346e0 -> 3e51b800", + "c08a227e -> 3f2eec10", + "c1149fac -> 3f360540", + "41930b00 -> 3ec2c000", + "c0feb104 -> 3d277e00", + "41445500 -> 3e8aa000", + "40cf4cac -> 3ef4cac0", + "c0f7c85c -> 3e837a40", + "c13bcbfe -> 3e868040", + "40481900 -> 3e019000", + "4183ffa4 -> 3effe900", + "c0f8f190 -> 3e61ce00", + "c12e9a1d -> 3db2f180", + "41370984 -> 3ee13080", + "413c286e -> 3f4286e0", + "40ada318 -> 3eda3180", + "c185e201 -> 3e877fc0", + "41839d74 -> 3ee75d00", + "c1152d9e -> 3f2d2620", + "3f5be500 -> 3f5be500", + "4170da90 -> 3d5a9000", + "c141f303 -> 3f60cfd0", + "c0f8a5fc -> 3e6b4080", + "419dd1f6 -> 3f3a3ec0", + "c1597bc8 -> 3ed08700", + "be82b3c0 -> 3f3ea620", + "c174ba48 -> 3f345b80", + "418b711a -> 3edc4680", + "c11a8c87 -> 3eae6f20", + "418ee322 -> 3f5c6440", + "c0d14450 -> 3eebbb00", + "c15fa516 -> 3cb5d400", + "4126af22 -> 3ed5e440", + "c18f06aa -> 3df95600", + "c17614d1 -> 3f1eb2f0", + "c0a480b2 -> 3f5bfa70", + "4199fd2e -> 3e7e9700", + "409e088c -> 3f704460", + "bfbb63f0 -> 3f093820", + "c0251eb8 -> 3ed70a40", + "4164a8d8 -> 3e951b00", + "417abeb0 -> 3f2beb00", + "4152c028 -> 3e300a00", + "c15cd150 -> 3e4bac00", + "c103c600 -> 3f43a000", + "41694234 -> 3f142340", + "c0aa5294 -> 3f2d6b60", + "4173a400 -> 3e690000", + "41656958 -> 3ead2b00", + "413f693c -> 3f7693c0", + "417ab3d0 -> 3f2b3d00", + "c1417ae6 -> 3f6851a0", + "c163bb64 -> 3f4449c0", + "3e34be80 -> 3e34be80", + "c170d38e -> 3f72c720", + "408a73c0 -> 3ea73c00", + "c1845f20 -> 3ee83800", + "c1104396 -> 3f7bc6a0", + "413f91c8 -> 3f791c80", + "4144bd1c -> 3e97a380", + "40f21e94 -> 3f10f4a0", + "4110c424 -> 3d442400", + "c190abd4 -> 3f6a8580", + "c1199243 -> 3ecdb7a0", + "c1255797 -> 3f2a8690", + "4127a45e -> 3ef48bc0", + "3fe6c0c0 -> 3f4d8180", + "c1508cca -> 3f773360", + "40da3cac -> 3f51e560", + "c0465ce0 -> 3f668c80", + "40c5ae64 -> 3e35cc80", + "bfd64230 -> 3ea6f740", + "c0056258 -> 3f6a76a0", + "41541a10 -> 3e834200", + "40d22af4 -> 3f1157a0", + "419b0dee -> 3ec37b80", + "c0a96654 -> 3f34cd60", + "c15f81ae -> 3cfca400", + "40fed3d0 -> 3f769e80", + "c102bdfa -> 3f542060", + "c16eec54 -> 3d89d600", + "c1285e46 -> 3ef43740", + "c1874391 -> 3dbc6f00", + "bfcfae20 -> 3ec14780", + "c18e76c4 -> 3e449e00", + "c1672742 -> 3f0d8be0", + "c19df4d9 -> 3e82c9c0", + "c11c23d8 -> 3e770a00", + "4189631c -> 3e318e00", + "3e962a00 -> 3e962a00", + "c1098218 -> 3ecfbd00", + "41043df0 -> 3e87be00", + "414f7280 -> 3f772800", + "40c7accc -> 3e759980", + "411da906 -> 3f5a9060", + "c16c1b4a -> 3e792d80", + "415c1658 -> 3f416580", + "403149a8 -> 3f4526a0", + "41844322 -> 3f086440", + "3fa4ad20 -> 3e92b480", + "c0e72bc8 -> 3f46a1c0", + "c1449c80 -> 3f363800", + "c1397a57 -> 3ed0b520", + "c023fdc0 -> 3ee01200", + "c1636df5 -> 3f4920b0", + "c02a0fb0 -> 3eaf8280", + "411fddb0 -> 3f7ddb00", + "c0efaaea -> 3f02a8b0", + "4159bd80 -> 3f1bd800", + "c166ef6a -> 3f110960", + "c12612f5 -> 3f1ed0b0", + "418b61b6 -> 3ed86d80", + "40414a00 -> 3ca50000", + "3e13f000 -> 3e13f000", + "40e752e0 -> 3e6a5c00", + "bff49380 -> 3db6c800", + "40be9688 -> 3f74b440", + "40627868 -> 3f09e1a0", + "c13ca4bc -> 3e56d100", + "c17e3056 -> 3de7d500", + "41238e10 -> 3e638400", + "c1070410 -> 3f0fbf00", + "c1235305 -> 3f4acfb0" + ] + }, + { + "glsl": "float cultmath_cycles_sign(float)", + "tolerance": "ulp-bounded", + "cases": [ + "00000000 -> 00000000", + "00000000 -> 00000000", + "40ab8a78 -> 3f800000", + "c184c77c -> bf800000", + "c165fa7d -> bf800000", + "c12807f4 -> bf800000", + "00000000 -> 00000000", + "418ad816 -> 3f800000", + "00000000 -> 00000000", + "c0ed0f9c -> bf800000", + "c08e09e2 -> bf800000", + "c0578568 -> bf800000", + "c1153bbe -> bf800000", + "c16c148f -> bf800000", + "4198167a -> 3f800000", + "bf366900 -> bf800000", + "c0ae11b0 -> bf800000", + "41310792 -> 3f800000", + "00000000 -> 00000000", + "c190f3b0 -> bf800000", + "c1420736 -> bf800000", + "41928654 -> 3f800000", + "00000000 -> 00000000", + "419f8588 -> 3f800000", + "40fd96c0 -> 3f800000", + "3f8bbeb0 -> 3f800000", + "c03eba08 -> bf800000", + "00000000 -> 00000000", + "40571380 -> 3f800000", + "c18c2ed9 -> bf800000", + "bfe84550 -> bf800000", + "41383064 -> 3f800000", + "c0eebb02 -> bf800000", + "413a3592 -> 3f800000", + "00000000 -> 00000000", + "c027f2f8 -> bf800000", + "c08c6698 -> bf800000", + "419b7cd4 -> 3f800000", + "c0c93ac4 -> bf800000", + "00000000 -> 00000000", + "c0304670 -> bf800000", + "c17a6e1a -> bf800000", + "414fd1a0 -> 3f800000", + "410e6d38 -> 3f800000", + "c12dcc4e -> bf800000", + "bf81cc30 -> bf800000", + "41333248 -> 3f800000", + "00000000 -> 00000000", + "c15b6f1e -> bf800000", + "c15f9025 -> bf800000", + "c0996a08 -> bf800000", + "c1659764 -> bf800000", + "c11c0a94 -> bf800000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "c19a273e -> bf800000", + "4126ff9c -> 3f800000", + "40d2e0b0 -> 3f800000", + "00000000 -> 00000000", + "c10b19c9 -> bf800000", + "41294b64 -> 3f800000", + "c189146e -> bf800000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "4061c178 -> 3f800000", + "40434360 -> 3f800000", + "40c5a1f8 -> 3f800000", + "40e0cedc -> 3f800000", + "be98b100 -> bf800000", + "41547d54 -> 3f800000", + "c0d2699c -> bf800000", + "c196a8d9 -> bf800000", + "40e45988 -> 3f800000", + "c09935ac -> bf800000", + "c138632e -> bf800000", + "c0459050 -> bf800000", + "4150abd4 -> 3f800000", + "00000000 -> 00000000", + "c1740ac8 -> bf800000", + "41537268 -> 3f800000", + "00000000 -> 00000000", + "c108f59b -> bf800000", + "4007e0f8 -> 3f800000", + "40e64924 -> 3f800000", + "00000000 -> 00000000", + "418d1540 -> 3f800000", + "413b3538 -> 3f800000", + "409574f0 -> 3f800000", + "c05237b0 -> bf800000", + "419db036 -> 3f800000", + "4183d774 -> 3f800000", + "c11d0b1f -> bf800000", + "c08cf63e -> bf800000", + "c172c3b9 -> bf800000", + "412a7aba -> 3f800000", + "00000000 -> 00000000", + "3f263a60 -> 3f800000", + "c084d940 -> bf800000", + "411ffadc -> 3f800000", + "bff6afc0 -> bf800000", + "41178d8c -> 3f800000", + "c1518818 -> bf800000", + "bfb9e110 -> bf800000", + "c0b11cc4 -> bf800000", + "c140910c -> bf800000", + "4198b18c -> 3f800000", + "4068cb40 -> 3f800000", + "4004cdd8 -> 3f800000", + "415d5268 -> 3f800000", + "40978fc0 -> 3f800000", + "40c983f8 -> 3f800000", + "c19b3baa -> bf800000", + "c16b4c3a -> bf800000", + "c040e498 -> bf800000", + "c084bc52 -> bf800000", + "416abf98 -> 3f800000", + "41952404 -> 3f800000", + "00000000 -> 00000000", + "c18f5a1a -> bf800000", + "3f2361a0 -> 3f800000", + "c0eabd10 -> bf800000", + "00000000 -> 00000000", + "4186e6aa -> 3f800000", + "413917a0 -> 3f800000", + "c1915763 -> bf800000", + "c19e60a0 -> bf800000", + "414a75a8 -> 3f800000", + "41591174 -> 3f800000", + "4107ec74 -> 3f800000", + "bb95c000 -> bf800000", + "c0d193c2 -> bf800000", + "c19b4619 -> bf800000", + "c1989d1e -> bf800000", + "418c90ee -> 3f800000", + "c0143920 -> bf800000", + "402721e8 -> 3f800000", + "411a5f92 -> 3f800000", + "c1954696 -> bf800000", + "416b7240 -> 3f800000", + "3eddd480 -> 3f800000", + "c1706dc4 -> bf800000", + "40da923c -> 3f800000", + "4133991e -> 3f800000", + "4139876e -> 3f800000", + "3fb84200 -> 3f800000", + "c0c70184 -> bf800000", + "40057a08 -> 3f800000", + "c14d0004 -> bf800000", + "00000000 -> 00000000", + "bff433e0 -> bf800000", + "c0db491a -> bf800000", + "c14831ca -> bf800000", + "00000000 -> 00000000", + "c16d002f -> bf800000", + "c15062c4 -> bf800000", + "417ae434 -> 3f800000", + "40f06488 -> 3f800000", + "413be2f2 -> 3f800000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "c1878fcd -> bf800000", + "413d00a0 -> 3f800000", + "4141ea74 -> 3f800000", + "c18adf6c -> bf800000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "418f4494 -> 3f800000", + "c15fe3ad -> bf800000", + "419ffc60 -> 3f800000", + "4180d0b6 -> 3f800000", + "00000000 -> 00000000", + "418be202 -> 3f800000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "c10fbdf4 -> bf800000", + "c0fba3d6 -> bf800000", + "00000000 -> 00000000", + "410e7144 -> 3f800000", + "c15ae1a4 -> bf800000", + "c0c5a5ba -> bf800000", + "4195938c -> 3f800000", + "00000000 -> 00000000", + "c0e1e6a2 -> bf800000", + "4123f314 -> 3f800000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "3f238a60 -> 3f800000", + "41845350 -> 3f800000", + "4180bc6e -> 3f800000", + "c111c679 -> bf800000", + "00000000 -> 00000000", + "408e4978 -> 3f800000", + "00000000 -> 00000000", + "418590b0 -> 3f800000", + "3f4be940 -> 3f800000", + "00000000 -> 00000000", + "418f9a78 -> 3f800000", + "00000000 -> 00000000", + "4138e644 -> 3f800000", + "403d75e8 -> 3f800000", + "415bf404 -> 3f800000", + "00000000 -> 00000000", + "41257fd8 -> 3f800000", + "40c84460 -> 3f800000", + "414a36f8 -> 3f800000", + "00000000 -> 00000000", + "c1851cf4 -> bf800000", + "c0893da2 -> bf800000", + "c161f480 -> bf800000", + "bffe4220 -> bf800000", + "3fee74c0 -> 3f800000", + "c1614aaa -> bf800000", + "c18ffd26 -> bf800000", + "c16845b0 -> bf800000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "c18ecb74 -> bf800000", + "3faadfc0 -> 3f800000", + "00000000 -> 00000000", + "419f6e94 -> 3f800000", + "4173349c -> 3f800000", + "3f0b9ae0 -> 3f800000", + "419196ca -> 3f800000", + "c0977e56 -> bf800000", + "c1862db3 -> bf800000", + "41414a74 -> 3f800000", + "3fa65a80 -> 3f800000", + "4087f218 -> 3f800000", + "c033fc90 -> bf800000", + "41475684 -> 3f800000", + "c1505770 -> bf800000", + "40c1fcd0 -> 3f800000", + "beabe0c0 -> bf800000", + "c19ed18f -> bf800000", + "c15d5314 -> bf800000", + "c19864df -> bf800000", + "c086f7f0 -> bf800000", + "c115291c -> bf800000", + "418bbf06 -> 3f800000", + "406a8420 -> 3f800000", + "412a7480 -> 3f800000", + "00000000 -> 00000000", + "41139184 -> 3f800000", + "c123c3f7 -> bf800000", + "c19e35a5 -> bf800000", + "c197365b -> bf800000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "00000000 -> 00000000", + "41827b06 -> 3f800000", + "417af428 -> 3f800000", + "c0e07ff8 -> bf800000", + "4098e5f0 -> 3f800000", + "413183c8 -> 3f800000", + "c18a5c9f -> bf800000" + ] + }, + { + "glsl": "float cultmath_cycles_map_range_linear(float, float, float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c0033130 c18d6e60 3fb29440 40ff0038 41871392 -> 41746351", + "3fa81760 c0e98da4 415f5944 c19fb02f c17eab75 -> c19294e2", + "c19f1145 4186b672 c108aa54 c1219b0f c1687bc3 -> c184140a", + "419f6416 c0ed445c c16ee65e c1403a4a 416e80a0 -> c2dbda26", + "401fa710 c15744fc c15bf861 c0b43e50 c19e9d4f -> 443f39f2", + "c191bb0c 41885bba c1151efc c155af92 c161fe76 -> c16625aa", + "40a61304 c14522af c15de89f c114d6e5 413d0856 -> c3782016", + "c024e7b0 bf95ee90 411eeff0 c17c93da 403560c0 -> c19123af", + "41557c70 c0e27eb0 c12cd69e c135b41b 41818c4c -> c3226952", + "419a2356 40873cf4 410ee18c c147c43a 413ee4a8 -> 42832ce6", + "c0f9d5b8 c0eb9e3e 4046f848 4102f984 3e574000 -> 41086379", + "c1098750 41808dd0 c14f8e4f 40f97570 41719d40 -> 415fffc4", + "408896f4 c18fd3eb 40ea11a8 41629e18 bf8da7b0 -> 3f3b8040", + "41470024 412b5580 c199e9b7 bff51b20 4100be2a -> c01f5d0c", + "3f8c3000 4029b780 c1992942 40a4db0c c1937de8 -> 405de6c0", + "c126d6e4 418ac8d0 418cddde bfe9be00 c198c0a5 -> 44e61cdc", + "c01c5248 c13e2a1b c186ad61 c0a92870 415aec64 -> c225e7c4", + "c0ee4ec0 40923e78 c0038888 4127cc1c 3ed1f4c0 -> c0f950dc", + "3fad5390 c1032f84 c18ee564 c12e3118 4194865a -> c220055a", + "41352446 40b36fa4 c09ee96c 411c00dc c181f3c6 -> 41be61ea", + "c1370ed6 405dc7a0 c1127b0e bf082640 c112a159 -> c12ba65a", + "4118a744 c1037c9b 418fa846 40d3eaa4 c115cc1e -> c0871fa0", + "c0be31e4 4193aff4 410da970 40dc7804 c01d38c0 -> c186d191", + "c07629b0 4196d976 c0ecc5e6 c19c2726 c15a8d96 -> c1673d5a", + "c1421f1a c0e790b8 c11b9f8c 418d667a c154ec48 -> c22cfc74", + "c12b4a7d 3f038a80 413bde94 40d2c19c c11c2016 -> 41b75789", + "407dc528 40141960 c1424522 c0b2a064 41458d90 -> c0f4280a", + "41617988 418a2878 406c9e88 c180f970 c17dbae0 -> c1807b03", + "c199d563 40d39d60 4135288e be19f180 c15a5767 -> 4293d014", + "40392a30 403c9c30 c0980d96 41391d18 401a5c88 -> 413816ce", + "4147715c c0dfca76 c0ae4cd2 405a39c8 417e378c -> 432069e7", + "417cb988 c0d9dd18 c0da9004 c0e72c3a c193ab6e -> 46358e27", + "c12f9165 3d24d000 c10a1042 c067aa60 40d58530 -> 41174949", + "413be0b6 4129a508 c0b20cbc 4168ae74 405ce128 -> 417530bd", + "bf8edae0 c09ae96c c1347014 4182b648 c166e2d1 -> 420895c5", + "3fa091b0 3fb878b0 4126c83c 4135245a 407324b0 -> 4137a4df", + "40cb1cf0 c16bc08c c19e9f42 c17d3651 c00e45c0 -> c290426c", + "c110a97b c143d340 408e58d8 bfbc3df0 41846a04 -> 3ffdcebe", + "3f668100 408331e8 c1114241 c18d4e02 4171d684 -> c11b492e", + "3f3b06a0 c098421c c0a1d9b6 4152d5a0 c0ac703a -> 43b08ff1", + "4144a584 c137d296 3f34ac00 c13e1b32 c183c6c1 -> c1a6a9a5", + "c02c67c0 c17b7528 bfe497e0 c00a3af0 c0abb554 -> c0a5057e", + "c0b4ab20 403124e8 3fec9d10 410fa0b6 c099caa4 -> c2ea5376", + "c181e86c be072b00 c14cd9f1 4194d36c c08927d8 -> c127ddae", + "407ecfd8 c15d8764 417e8160 418fed38 c18b97e4 -> c04fa170", + "416c8bb0 c17c3275 c159d410 c19634f9 409ad98c -> 439e8555", + "c15fccbc c1580410 4189f94c c0528e20 413823ac -> c0618a5b", + "c00a7bd0 4091e968 4140dcac c19ad467 c19c3bc0 -> c1999201", + "c1553454 4118bfbe c15644d7 c180d68b 400ca650 -> 40094098", + "41910f6c c18dfd57 3ff8e850 40e4929c 4135a75e -> 416d07ae", + "c1991975 c13f471d c06a4ed0 c02259c8 412a13ee -> c15f0709", + "40c459cc c0eca7ec 402dc148 c166eb6b c1341931 -> c122e6f4", + "c0ddcef8 418f2f74 c040a428 4150047c c1360dec -> c17f3726", + "c1425180 40b0ad48 c16dc8d6 418bbe86 418adcd0 -> 418afae5", + "bf4c58a0 40fa0d4c c1573122 41910f2c c12f5f98 -> 40cb29b8", + "4166f438 419c5eb8 41402e78 c0869e4e c1794e9e -> c13ec678", + "4148865c 4012c208 bf41d600 c1221150 407e7ec0 -> c265ed8c", + "418fbd30 41228fa4 be5dbd80 40c29114 c16a093e -> 41ad487f", + "c16c4afd c1913dcf 40cf9030 413e7062 40ecdff8 -> 41348aee", + "c133933d c0ee2e72 c0cc92aa 417460d8 c0b509d4 -> 42b53958", + "c0ec6f96 4188e714 408f3ff8 411c8fae c0fb262e -> c1c33f37", + "c0de7320 c1940afd bfe59060 c13936da 41818fdc -> 40f3f5cc", + "40d2dee8 3f17d920 c1514087 c196ce66 c0727e40 -> c1cba857", + "412c6802 bfac1dc0 c14e17ba c12f9b30 c115884c -> c14afff0", + "c0138490 c1643267 bf711600 41418648 414204a0 -> 4141f7b2", + "c02927b0 c19560b9 c0ab430a c11451a2 c19de62d -> c1aeedca", + "3ff05b90 40be0d90 4185e6d0 c194651e 413ce92c -> c1efbb4e", + "4176b838 418e8844 411752f2 418dc0e4 c11126c0 -> 41209b0c", + "4183c82e c100be50 c10a401c 411e28d4 bf9bc590 -> 43ea00d5", + "40946ee4 416ec4e8 40aac9cc c089e01a 418503fc -> 419138ac", + "4121f07a c168ff7f c176ae25 4093d244 41852e1c -> c3ab492d", + "c1520564 bff903c0 414619b4 418d4588 416cb6d4 -> 419f2796", + "c104781e 40db1718 c148606b c13d6a80 c0b5d778 -> c0e10129", + "c19acba9 4076bfc8 c168764a c12a85fa 3f4a83a0 -> 4072c184", + "414f5780 41132954 c1299982 4190c5c8 c0ba314e -> 41b51ef7", + "c16422d5 41660db4 4112c5ca c0d60208 c14832d2 -> c21aef16", + "401bc4b0 c0804cb2 4197a744 c0bcb334 c11dbcd6 -> c0e0447a", + "c063d440 3fada760 c0fc3704 c1732677 409ddd20 -> c08f7cf2", + "c0289d48 c169092e 413cc7e4 c1889a86 4199a8b0 -> bf2816c0", + "c125fb30 c1785de4 c1866ace c08dd6e0 bfef0b00 -> c16c1c03", + "c199bc40 41173b34 c0802a40 416e67b8 c182a7c2 -> c24e8bbe", + "c1989c6d 41804d02 c15839b5 c118fe37 412e7f0e -> 416c231d", + "c0f02630 410e19be bf6e5480 4122bde2 c0f474aa -> c19c9231", + "417bae38 40fc7a08 4155f930 4190292a 418f04aa -> 418e86f4", + "bf34c400 c104348d c19aa7ea 408d16ec c184983a -> 4195df46", + "40f0c158 418b30b8 c1586475 41971d18 c1771d76 -> 40fd9882", + "c195e278 4132e352 c0cc9d8c 4172e05c c154ba53 -> c2052a6c", + "414fb5f8 419ff764 c17f1930 c1190a16 c12c83fb -> c11cd720", + "3ece1d80 c0a422be c1928ea6 c0c34b0c c0f1fcae -> c0afb5eb", + "4107bef0 40cbb834 c192faff 4129054a c1842e6e -> 414e1f5a", + "3fde3e70 c10e5714 c16d27f3 c013d318 4196b570 -> c22104ac", + "4110bc0c 410c8b06 41395f6c 4137982c c076c0b8 -> 4120a932", + "c183cd26 4118fe78 c14673e8 c161e0c1 411a4400 -> 4160bc3d", + "3fa84cb0 c0972efa 4078e970 405de0d0 bf1f04c0 -> 3f19c2c4", + "417bbf74 407558c8 403c0d18 410cd650 c0219e60 -> 431f620a", + "c1793ae0 c11f1742 40d8ab60 c1007634 c0a1decc -> c1107b2d", + "c196bdb7 417c5770 c082d37a 41769710 40346af0 -> c0d12b98", + "41229222 40c01688 417ea600 4182babe c015d980 -> 41081375", + "c17cd510 c13970a4 c0ed62b8 4164a618 c164e9ae -> 422ca87c", + "412d7276 c14b9d78 417cc378 40882cf4 4131f812 -> 411edf48", + "c0d95324 c18c2f22 bfeb71a0 c10d0a6c c1441c50 -> c132b900", + "418f38ce 4102a5a4 c067f910 c19e4696 4166a5c0 -> c2401eb0", + "bf816590 c18fe556 bec54c40 c05de1b0 c0a06982 -> c09ea767", + "c143f1ba c0cb2f96 c0fa15ec 40441210 419bd8ee -> 428a3d08", + "4174fe50 bf23d7e0 40f189c0 c163116a c09a3678 -> 40822d7c", + "40ea602c c10bf871 410a5d2e 40470000 40d44be4 -> 40cbb6f7", + "4189314c c0b7b570 c18be064 3f591bc0 c19222ea -> 42186c8c", + "4195716a c018e980 c1745f52 40f566bc 409d5240 -> 4142b87a", + "c19009c2 c125f678 417b332c c1909822 41955b28 -> c1e6a3fb", + "c18e8533 410cb9be 41806388 bf325260 418f8406 -> c28a2298", + "c033d700 41716d80 c0e8821a 4098c940 417cf9c0 -> 4159c757", + "415d93ec c0a24648 c0f4b990 41800868 3ed67300 -> 43027239", + "40d4d418 419c243c 415441bc c0cd6640 418a2194 -> 422950a1", + "c17451fa 419bfb0e 419621f2 c0a66532 c06c5e58 -> 4284e921", + "412248a6 c1313879 40908354 41912db2 418be2b0 -> 4189f9b7", + "40b5e990 406a3d58 40b3ea48 c14dc7bb c0e021ac -> c0da2b9f", + "41943b2c c0997f04 c12a7dac 40a56fe8 c128e44c -> 42878ddf", + "c18f8574 c193ccd5 c0109598 40a12ff8 c141d9c0 -> 408f154f", + "407017e8 c16bdd98 c1347022 c14c003a 41921f88 -> 4318d1d5", + "c18c2dfe c068e0d0 40079930 c175736b 415f0848 -> c2abe570", + "c18a8041 412075da 3f9fcd50 c18806c8 c143409a -> c00399f8", + "c13bbd48 c116d42c c0ad38e0 40e93e7c c11dfb0b -> 41893a63", + "c11cfb6b 4114e7b8 c16c950c 40408698 3ff1ea00 -> 4007bc44", + "c108d670 4122c626 c13e7637 c17dced4 41734e10 -> 4127d6ce", + "c1865c28 3fe0dc20 c0c8a82c c15158d9 4148e270 -> 4238af21", + "409c4c78 c19e642b c02ef870 419f0e28 4170215c -> 414d5164", + "c12ad301 c193ab7b 3f768900 c0d9a00c c11b1054 -> c0feb0c4", + "c137ff82 415f46d4 c15a701c c0281dc8 c1969383 -> c18c7978", + "4137c944 40de0590 41273b5c c0a2d9f6 418d90d6 -> 41c33ce4", + "41671e44 c19fa445 40b6dc6c 40ab850c 40da2b04 -> 40ea0898", + "c0f64440 c13bc1fd c0012b80 c128c17b 412bc09a -> bfd9b208", + "3f6e3fc0 c06cd838 c0b55afc c118efff 403a64a0 -> c21bb535", + "c13ef4f1 4154e9f0 c0a97180 41447de4 c1999405 -> c1f3763a", + "c135a476 c13a80d8 41403af8 c0e99c08 c0d3867a -> c0e95378", + "c0207518 4074d900 412b913c c18853e7 c1823d9a -> c18deab4", + "c06eec58 4134e026 41968c74 c12c7a85 4190e216 -> c2893309", + "409add8c c0b06d18 413e7f60 c0ddf266 402d0de8 -> bf9a7288", + "c1978882 4063cfa8 c107d5f6 401dbd80 41160bb0 -> 4175fe1f", + "4143368c bec17580 417e7fe4 41675f64 4151cdec -> 4156b652", + "41916faa c0f888f4 41915ebc c0bc89e6 4110c620 -> 4110d9a0", + "40c33e34 c13f8384 c0df878c c1007a3d c12acd38 -> c18cf696", + "4107a79e c01d4ce0 c09f4624 c1644648 c0b1089e -> c250ba76", + "411a03d2 c0213bd0 c16e32f9 c0f56858 41909532 -> c203c980", + "4159419c c194cab8 c192dfc7 c126c598 419df47e -> 457c7012", + "40a2cf3c 4186aa8e c1273466 40549928 3f9831a0 -> 4019d5bd", + "418ef734 40fd6cbc 418218ec c12275ba c1675a88 -> c174a310", + "c17f769d 415222ac 4096bbac 3e2fd680 c0ffb5dc -> c1e03a9a", + "c04c36d0 c1943963 bd833100 c18215fd 41639bdc -> 41110164", + "406108d0 c1376903 c1638fae c1400c52 419e03f0 -> c3386185", + "c0a8f4fc c0afb168 4064d038 41831a80 419c4628 -> 4183b01f", + "41863a64 c11684ec 41098310 c0b45bdc c18050bf -> c1a626be", + "411449fc 4193d872 411b15f0 412c7f8c c108bba0 -> c117ae46", + "c19b8760 3fa3d780 c16d2d58 c19e75df c1190db2 -> c0d421ee", + "4183f092 414c5334 409e1b58 c19d6c9f 3fa1c0c0 -> c1ed1201", + "4141b460 3fbb8790 418f3636 c094c2e8 c07164e8 -> c0829774", + "c05cbd70 4130e4cc c193940a 406479b0 c1587f4b -> c09acdb0", + "40571c70 c17a7db0 419efe6c c11b020a c133cf4e -> c1284861", + "41570e50 c1776062 c11a743c c0727ca0 402f6c50 -> 41e5a84a", + "bfd5f4b0 c10388b6 41127a10 41448fa8 415aaa9c -> 414ce4aa", + "c18e1c5e c1851dd6 c166a3ef 418c80b0 c185eca3 -> 420b9952", + "3ff99260 411919a0 40503538 c09c0630 c1492812 -> c1629290", + "c095f858 c0e9e2b0 c0d836f4 419115a6 40ed1bc0 -> c2033304", + "4191b29a 41876c7c c15e087e 4089fdb0 41017d44 -> 4084f275", + "4181b778 3fb3f0c0 416dd4b4 4136e390 c0407000 -> c08e90d0", + "413f4186 401b1dc0 c134532c c01ad150 c18884a9 -> 40f8bd5e", + "3ea7a300 4144f6e0 c1662338 3fd79f80 c0c040fe -> bfe26162", + "c0d9e764 40af1178 c18014ba 3e9ef680 40909cd0 -> 402ddb48", + "415cad7c 3f8ba820 4097ffe0 c188ecfc 41572cdc -> 42b1f700", + "3f3ffa60 4134bb18 c0f93f12 410cd2fa 4090ebc8 -> 40ce187d", + "3fb343a0 c1658038 c17284c6 c17ceda0 418b9dd4 -> c424db62", + "3f5492c0 c138105d c0bb0efe 3f11d600 c10b1acd -> c19cfd29", + "419c3570 3f56ccc0 c1653e5f c0f9f38c 40e335b0 -> c1d17733", + "404033d0 c14ece20 4138f094 40849798 c0b8fce0 -> c0140762", + "c0e84714 414f0268 40b9ffa0 419e5838 4164cfc8 -> 408738a8", + "c09c0c22 41853f16 413faeaa 418fdb5a 4181f22c -> 411f96ec", + "c19abcc8 c11c9907 bd931300 4150d5c8 3fc471e0 -> 41c30871", + "c0aa8564 40eef74c c1949acc 40877090 41529658 -> 4109eb1a", + "c174e355 c10aefc7 405ae4b0 c12fed81 409fc718 -> c19df149", + "c0e17e9c c092993c c0ee0c96 c086e99e c118e017 -> c10d2616", + "c0ca6470 419de542 410114ac c0ad5d2c c1036692 -> c13a8dce", + "4107660a be200200 c16f3536 c121bd68 401506f0 -> c18ad5aa", + "40859600 c05efc18 c074f8c0 408a720c c115a13c -> 439aa0f7", + "411503e4 c198b688 c0ec2850 412a7800 c0f244ee -> c2063734", + "41789150 c1659888 c14ac7b2 412fb574 c1279b1b -> c3b9d0aa", + "c19499e1 c127b6c3 c04c4ac0 c0a66634 3fac78a0 -> c1477f28", + "419da346 408308ec c0737220 40f12d90 40245a50 -> 418ada10", + "c198a209 40094930 c16a7790 3fa1e2d0 41512830 -> 4181759c", + "416d3d58 401ac370 413887ce c190c4ba c13034ab -> c1073ee9", + "4102dbb2 41724e68 4198c012 4192d9de 417adfa8 -> 41b89de0", + "c0fea47c c1899c3c 3ff40da0 c185292c c0a2e2ca -> c130e261", + "c13f99b1 41469234 4188af9c c16f137b c11a32d0 -> c22a73cc", + "bf871990 c187b6ac 4123fde4 4108b382 4027ecb8 -> 40a2a891", + "c19f5cba c19d7140 410a2b06 c191eec6 c1245d2a -> c1927917", + "c14d4e67 41790a80 4135af7e 418ca7e8 c0197f30 -> c2ea6446", + "c0dc3f1e c0bc40b0 c1693e3d 3fff5100 3fac49a0 -> 3ff5c4dc", + "c15b822c c11936e9 bfc63360 bf612c00 c12b1eab -> 4085f900", + "41873f82 c18e7ea0 c0e5145c c0ebefa4 c0ae9f7a -> bf907adc", + "c137d646 40a1e62c c19db20a c11190d6 c0bbe93e -> c0de2c14", + "413caaae 4142b2f8 c18815da bf384a20 c1317b36 -> bf5a9990", + "40fb7c64 c157dc9d 418aaed8 410a10e8 41082e0c -> 4108c27c", + "c06172f8 c108e7f7 408a63c8 40b81aec c191a8ec -> c06712f4", + "415e86a8 40dfa0e4 c09d15d2 406d8d48 c17eb0a4 -> 41720e5b", + "c137ac49 4092b228 c10def5b bf42dd20 40b6f854 -> 40df2a6f", + "418f21e4 40ef4f5c c07f74a0 40e6e468 c1964372 -> 41f68bc9", + "4006fa10 41746e94 3ee80a80 405d11c0 40b9eb08 -> 40b17f70", + "3f72d780 c10df4a4 40c48cc8 c0dd3556 4157cb00 -> 40cdc7b4", + "419e2d38 c0dd2932 411d28b0 4129bf32 414d3e14 -> 41625905", + "40aecdf8 c008bc90 40e2d0b8 c112a5fa 3f2299c0 -> bf8bbce0", + "3fc2ca40 c1208201 c05b1d98 c152e032 c1664856 -> c174ce80", + "c14cae66 3f8512a0 40700878 4158ff34 c10fbf00 -> 43009ad3", + "c19cf4be 4128008c c11e1482 40ed2f90 c1599075 -> c1bd1b00", + "3f99a560 412fd7b4 c1990946 419f8bf8 3f580b00 -> 415bc46f", + "4031ed30 c1993afa c18ff81f 41239850 c17b0b15 -> c3f0647c", + "4176e850 416c3064 3f051720 40cd2830 c19df568 -> 40f486e0", + "3ce5d800 c19ce058 c16d372e c156b76b be9c0580 -> 4221ae71", + "c0fb7ef8 bfa65030 c0cbbef2 c009cce8 bfb2e0a0 -> bf9665b8", + "419f4594 40ec1278 41494730 c18f6dd5 4151b480 -> 42634ea0", + "c12ba61a c188400c c18cb78d 40869f4c c105f698 -> 431237e8", + "41678f44 c0407258 40e4a0e0 411fd956 418ed728 -> 41bc4175", + "3f2cf3a0 c14091c3 40cb4094 c18bea8e c11d30a6 -> c1430c93", + "c0f1bd98 c19bd78f 418ab702 4154ea04 412fce14 -> 4148e4fd", + "419feb9a 40aa6f70 c183ae8b c144880c 41642f08 -> c1f13305", + "c18c00a7 c0292348 404182b0 3faba020 3f6f58a0 -> 4019ec76", + "4176720c c13bbd23 419f75b6 4188f1ea 41709b04 -> 41755ddc", + "41476868 41459f80 418280e6 c0a6ea9c c1637a16 -> c0af06f1", + "c187b83e c0d8223e c09a2108 c13465bc 4198284c -> c32aeace", + "c17d2db9 414595b0 c10e0a5d c1454292 c15d7d48 -> c1656b0b", + "419b1d22 41209b38 419a2e96 c10ea9be 4151dd48 -> 41564f8c", + "407c88b8 419b6e80 416b18f0 411f20a2 c12df54a -> c2687d14", + "c0389fa0 415f82bc c1632394 c12f1c34 c18c61de -> c16e5551", + "c0f2e744 c13f7d2f 4113bc76 c1487022 c0126438 -> c1269c75", + "3dc0da00 c17cb0ea 40238d50 40f0c838 40fe7d20 -> 40fca66f", + "40d7d0a8 c11db7c3 416d08a4 c134d8a6 41215cc0 -> 4045b174", + "c11d9700 c15c3e76 c094b982 c09a1d68 3fc5da20 -> c0055cad", + "c16a292a c1301a4f 410d952a c17ff974 c10e8727 -> c18a5a83", + "41508b68 418d4346 c15a1ed5 c1658004 410aadd4 -> c12f1805", + "c12ef33b c148ed8a c15df450 c15ba201 40d38878 -> c21b6a10", + "418127bc c1871362 c182cd1d 411f567c 40c20208 -> c366de0c", + "4172eb2c c148481c c10406f0 40485ec0 c15a0b0b -> c2d36022", + "c0c64c20 c1762ba6 40bfe330 419ee1f0 4197d0da -> 419bd87e", + "c111e972 bfb10400 4129eb22 40f05108 4188b2b8 -> 3fab18c0", + "c184aca9 bf5125a0 40a76bd4 41830b82 4095b710 -> 423b88dd", + "401bec90 418eb6f6 c04672a0 4196db24 bf8e71a0 -> 40855d7e", + "bf32a220 c17fc374 4108aaa6 40058c78 415f0d48 -> 41179a96", + "c14f703a c18b521e 40ac9988 4111f046 40cba030 -> 4109544b", + "418f0f78 4189f650 c1648287 418d08cc 418a4f74 -> 418d16e5", + "4106b710 c1056b09 c157e2b7 c15521b9 c00da2e8 -> c245be6f", + "41272d46 c04b62b0 bfb0e6b0 c12d076f 404c7638 -> 42bef6db", + "c04278c0 c00772c0 c14bb140 c16b850c c182fd10 -> c16dd188", + "418abea2 4129548c c0e37a70 c17c1a1a 40e23e30 -> c1c3d366", + "c123629c c07b5930 c180b8c4 c1614968 413f11f0 -> bf22a7b0", + "c13b4538 415392bc c1940293 c196d3c9 4199a33e -> 4130d090", + "c15d45f3 c0d11fa4 40f348a8 4198bc10 4182123c -> 41a46d8f", + "c11399d2 413550a2 c11c7af0 3f88f810 41070486 -> 4103eb2a", + "c18c28bc 40acb2c4 bf24dea0 419722c8 c0415218 -> c2807900", + "41126c74 41750d04 3de8e800 40afd4d0 411052d6 -> 40dd93a2" + ] + }, + { + "glsl": "float cultmath_cycles_map_range_stepped(float, float, float, float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c14b359a 408b53ac c1943436 c1170d82 40f00308 3fe3980c -> 4119d63c", + "c143f981 c19b4ca7 c0a86752 c1282383 4189cd44 401ca809 -> 3f5258b0", + "c021d508 c1204deb c03e7200 c184072f 41247efc 3f5704b0 -> 41762d2c", + "c12fa986 414d9fb4 c15fd360 3eb9ef80 413d23c6 402397a4 -> 415cf986", + "4092e11c 408c8804 4185bbd0 c16fb719 410f0b20 bebe8bbe -> c16fb719", + "c0e0a478 c0dc7e24 c07fbe38 c0fbf4cc 413e7c14 407a2830 -> c14ef117", + "c1002766 c03d38a8 c1068967 407a5c78 c187d029 40bd5c79 -> c18a244e", + "4177b8bc c106bd7b 413369fe 40e5041c c141315c 3f8e0000 -> c1dc1c31", + "3fef1090 c0d08c52 4196f6bc 40e46cc0 c10e84ab 40cb0805 -> 40052406", + "404098d0 40ddf5d8 41488614 40b56c64 40bf03dc be99dec4 -> 40b56c64", + "c08bd484 c18a2134 c105a46c c100d924 4184175c 408da1ec -> 41f66054", + "419a8e04 c16a7adc bff65000 4173534c 41381908 3ffd3e10 -> 40071608", + "4184b006 40a37eb8 411d4004 c0977aa0 409c2d80 40637dee -> 41c8266b", + "4092eec8 418b7740 c0622a80 40eaef40 40499b60 401e95f3 -> 407d5872", + "c180a3ff 40baeec4 c18fdd34 405716f8 4111df66 3df1bb30 -> 42508436", + "41148a24 40ca44cc 41312fe8 c13846e8 c13b7ea2 bf6f5213 -> c13846e8", + "bf671a40 40624778 c09dd868 c14e6f9e 40facc0c bed6bb94 -> c14e6f9e", + "4134ca00 40d51d88 3ffd0670 40b440a8 4128d658 409b1496 -> beea5800", + "c1897aa7 c1441c7c c18f8deb c0f6b660 c1976098 40ad758b -> c1906ad6", + "40d49044 41049e20 bed52800 41818526 c13f9126 3fb34a04 -> 41818526", + "40065010 c0815368 c0716908 c0dc9654 c16136d8 3e2aac40 -> c48cea86", + "400a7500 4101a6f2 c04b0800 41189dec 41815a2a bf328806 -> 41189dec", + "c16d328a c02063f8 c1267782 c0c3a846 418056d0 40e6bad6 -> 41f615f4", + "4157b078 bfdb4290 4174a108 c07dd978 3f0bb0a0 4073c918 -> 3f459058", + "c188b180 c0406ab0 40a7c730 c18bb1c3 3feb87b0 405fe61e -> c27666b4", + "3f34b560 403a1038 c08fb9f8 c179a38c 409ff8bc 3fd61c4a -> c179a38c", + "40cb4784 bfe756a0 3f3c59c0 c04d5748 c1843e76 bee5ddf8 -> c04d5748", + "c12d8209 c0d72672 c106d0d0 c19a505c c14e28a6 4089cdea -> bfb8bc00", + "bf87a880 c0e7c776 4143f080 4045fac0 c18a5316 40b620d3 -> c082398a", + "c093d368 c15ef59f 41769b44 416da9dc c11ce82b 40b04cec -> 40bcdb14", + "bd6cf600 bebfe740 c15bca03 4186ad60 c132ad6a 3ffdf07a -> 41f79819", + "40bac3bc c199c77f 4147eaa4 418dbc62 40f11034 40410934 -> 40f2cfea", + "c087db14 c053e6d8 c0a5d6cc 414d71a8 c151f456 3f22b356 -> 414d71a8", + "c123334e c18e6124 c121f206 c192ba1b 40664628 3f859872 -> 41bd97e3", + "40f7e570 418ce654 3e4a8e80 40b897b4 41104628 4050a698 -> 40f85d9e", + "c0622e28 4137f9e6 c14002aa 413ce1c8 4186cb92 408badd7 -> 41745a20", + "41817cb4 c0f5b996 c178e5ce 41927f76 c0a40528 3eda1418 -> 4392b931", + "41316d2a 3f9c9150 40a72854 c0b34fde c14a93c6 409b58cb -> c1cfa72e", + "c0a27ae0 40229298 41997f5c 41024d00 40a1ba58 3f4c446a -> 4140420c", + "bf72a260 bfdbc600 4180379e 418970a6 c12e97f8 3fc32446 -> 418970a6", + "41510608 c19f74fe c103d526 c0ce0eb4 3fa02270 40e37332 -> 418ae8f9", + "c12264e3 407cc2b0 be243700 412f924c 41853c20 40d8cf02 -> 4203191a", + "c18965f8 c108323b 40ea8098 c183ac30 c116e15f beee6ae4 -> c183ac30", + "40770218 c0d4caae 4124606e 4162d6b0 c11276b8 3eea2478 -> 4162d6b0", + "be819740 41052776 c158e346 c19fee64 c0e7e822 404b5b1c -> c17fb037", + "40fa2624 41980c0e c186226a 41539444 c16c071e 401536aa -> 3f9cbfa8", + "41693b80 c01e2df0 419fc6ec 411305f4 c177430c 40886798 -> c1027854", + "c15d1b9a 407cc110 40bc58cc c175e9c0 40aa31dc 40035aa8 -> c399d80c", + "3f299d20 c08fa38e c1449762 415a6fdc c0d5be74 40e14f9e -> 41f7d34b", + "3f725800 419717ac 41138cbc c16b76a9 415d0560 40cd1695 -> 422c9dec", + "4119717c c122881c c10cdb42 c195d061 c186c064 40ef11aa -> 41445830", + "41352d4a c1266034 c15c2b1e c0ef4e34 c13093de 40cde627 -> 419ced0c", + "c18cc73d 416aba94 c133224a c151db1e 40ffe494 40a1a80e -> 41811c58", + "3f1751c0 c09c45f2 c187f8bc 414e0d54 bf276980 40ec23c4 -> 41a1b512", + "c11258b8 4162a338 40b5eeac c1481232 c0f72274 3edcde40 -> 41a5fb83", + "40b2b55c 4114b228 406dbc98 c14f4efe 419cca3c 40d9df14 -> 412f387a", + "c0f9d264 c1717ada 3f4b10c0 4103cc40 c0d62e12 4022536d -> 40167290", + "c14ac57d c13dbf15 c1573de8 c0aa8300 4133fe54 404c8f2e -> 40a170aa", + "40dddf50 c0bdfec4 c111c2f1 c18d6625 40962874 404d3dea -> c30f385c", + "411ece50 4185b214 4127ee7c c0c171ec 4126b7f6 3f82f266 -> 41d126bb", + "c1009730 4074fdf0 418a9884 419f05ae 40ddfc70 405b40fa -> 420bf2ff", + "c12ac508 4175c084 41712618 c0bcceb2 416b0e14 40863de9 -> 450fd108", + "c15e5808 4145a8dc c19185f9 40e92ac8 40b1a5a4 3fc2b5ac -> 40a02ba8", + "412b1b9c 41817464 c188ad8e c14f6ede 3f0fe260 40f324c6 -> c132f30b", + "41778c78 40509bd0 c1766213 c16fb934 c0387540 beb370e0 -> c16fb934", + "c17ca96e 4191e7e2 c0b0659e c1032af4 c06e7238 40b43f78 -> bf86aea0", + "bfcdbf20 c148d0d6 3f9a1590 40dc103c c16a7c78 40e2689e -> c13620b6", + "40650068 c0e55200 bf20d760 40f99fd8 4181c5de 40c8d6b8 -> 41b479ff", + "c0472ed8 c18ae38a c10d6eaa bf35a000 4050adb8 40d683a2 -> 40ccb6e4", + "c15ec8e3 c1712852 c185df56 4198e16e c1798120 be30b100 -> 4198e16e", + "c09dc7e8 c17b0bd4 bfe11160 4142f5c8 c121bdeb 40e675a4 -> c0cc6df8", + "c136600d 4164d2ec c07aea58 c0f56ade c131b2b8 4044ace2 -> c1542dd7", + "412005ca c1817641 412d6540 c14f98ed 405d4420 3f3d2684 -> 41143c4d", + "bf942310 c1454372 40e13670 c0f79ae4 41021282 40107f31 -> bf35b740", + "413b9efc 409d6124 c0a0b754 3e7f8100 c1646211 3fc6c860 -> 4197a086", + "40c6d050 bf37ac20 c187a7db c01e5248 c10313ef bf44624c -> c01e5248", + "c0168010 41364a52 c188758a 403ad0e0 bf4d0080 bf1166a4 -> 403ad0e0", + "c06f6828 c1771648 415beba8 4150edb0 4114a036 4057fbf2 -> 413f0f49", + "c184cb08 41986806 3fbc3530 41789a30 3e88e7c0 40e87dd8 -> c190ba4a", + "c0570fd0 c1898b41 c0747958 c181e5f8 c19c549b 4093ce48 -> c19e82dd", + "3fbccfc0 4105a1f0 410934fe c174465a 40c3c4d0 40b5339e -> c4464f3c", + "c09e1946 c0f0cb4a 4140276c 411cd5e2 41160714 40c6dc9f -> 411cd5e2", + "c1736dc7 417ec768 41078c96 40a3c4c8 4180064c 4089b8c1 -> 42730b12", + "3f3be200 419558a6 417a105c 41788c68 c049afb0 3f007ed0 -> c38d2440", + "411e051e 412acdf8 41981f00 c15b1208 c198e84f 3f8337d6 -> c106740f", + "409b5b64 c0c3a828 412ef388 c001f260 c19472e0 40be1983 -> c15285cd", + "c0d4f858 c10793b1 bfc7c580 c17ddc64 c00016b8 40321ee0 -> c17ddc64", + "40ede108 c0ccd7e8 c125370b 41167fee 412c07f6 408f4655 -> 40594804", + "c13bca43 413859aa c153231a 4149b8e0 4041d7c8 bf18df73 -> 4149b8e0", + "4115812a 40be1b28 c107f222 3ff338c0 c0a496f0 40df2f99 -> 407ae0b6", + "41298a08 c133fa9a c1069508 40409368 c170d7d0 401f120c -> c339ee1e", + "c196f669 40da1da0 4167ad24 418cff48 c103a171 40903b54 -> 42fd335b", + "c16dde85 c05995f0 3f2b6fc0 bf97ac10 c13e641c be89996c -> bf97ac10", + "41880278 c19c3d68 419f6300 c0aa83b4 41905c1c 3f8db3e8 -> 417c8e48", + "c18e6d29 4143f4d4 412db5fc 41124e0c 410a0240 401f3e9c -> c0cf8436", + "bf27fd60 41371cba 41855be4 403fcb70 c0ceccda 3f8a5274 -> 423b0e30", + "c16c651c c1793456 c1359423 4162edcc 41046cc0 bdea5ec8 -> 4162edcc", + "411dd2b4 c115c8d0 be809cc0 4014f270 40ef2ecc 3ee49250 -> 4213aa39", + "3f8f7400 c1178954 c00a3948 c13bf228 409cc454 400f2a9c -> 41902482", + "41784e70 c082683a c114b2d4 c18e3561 3f4ff2c0 3fedc2dc -> c2ffb594", + "40944a5c c1003ade 41918648 bf82fc40 bfdc0ce0 4064bb40 -> bfb4d3ab", + "40f9d108 4008ba78 c1877f89 c1093df0 c0cd20ce be311650 -> c1093df0", + "41699428 c189746e c0f9cf20 417fccdc 4099d6e4 40a553ab -> c1da5578", + "4119daa2 be05bb80 c173a293 408db518 c13fa074 40449738 -> 41a39a38", + "418d4d80 c10e8dad c157456e 401221b8 40ef48dc 40eecfc2 -> c202125c", + "419453e0 c187fd2d 406731f8 417f3880 c1273762 402a96db -> c22dec67", + "c1641368 c111cdc3 4145b8cc 419b5ca4 41685418 3e4de4e0 -> 422f2782", + "c18512c0 c124d390 41878388 c0babd16 c0cb0ca4 407df6ba -> c0b28492", + "c18e748c 419c40ca 4131e070 40533088 c0ec8ac4 bf49b06d -> 40533088", + "c1412a10 c19e5aaf c1804d34 3dc07e00 3fa82bd0 3f1e2b70 -> 40c08b5b", + "c0c6f17c c1679fec 416a8a30 c168ccc2 c0e3cb5c 3fb0f1ea -> c168ccc2", + "3d81de00 41952dd6 41544e84 417e70d4 4123e042 4008737c -> c12a5656", + "4170c840 4123215c 40ab29f4 419b7a52 3f880050 40f3f09a -> 42248052", + "3f942410 405fe628 418b7c52 408edf14 3db8c400 40a93615 -> 40c3d12c", + "c15812c0 c09848c4 41264b08 402ad988 4100628e 3f8d15fa -> c0e17b00", + "c0f57bf2 40b4d73c 41192cc6 40a55974 40b46404 40b0c769 -> 404d741c", + "c1152167 418f53a2 41868910 40cb3a40 41619db8 40181b03 -> 438a814d", + "410cfc82 c15b59ea c12b5ead c0336310 410403e4 40815e90 -> 42c4b9e6", + "c08cfdbc c1381eb4 bf5b56a0 c165cd84 41977e3c 40f0455e -> 40f9fa88", + "c123ec93 411517b8 40addd18 c15498aa 4197a2fe 40ef029e -> 432803cc", + "3e47ba80 418b26ac c11606e4 407b4228 4064bb30 3d070ba0 -> 407b4228", + "408b18e0 c121e47d c17710a6 4182d07a 410c160a 4086a7f4 -> 422db895", + "c193ef81 416ce764 41165bd4 401b6a88 417a7308 4006b719 -> 42f399dc", + "bfabf3d0 4114c604 40dfaf74 c1404e38 c14ecac0 40594122 -> c18ad3e8", + "41233364 c154f076 40d6de48 413c20d8 c092cd64 40e57f08 -> c10c1228", + "c1837d44 c180445e 4197b0a4 419969b4 c15d81cb 40e84a90 -> 41bdcdd0", + "c179db18 c171d408 402ddd20 c174d353 414d9acc 40488456 -> c1c24bb8", + "c0095860 bf41fd20 be869800 417ff1cc c17dee82 bd90d418 -> 417ff1cc", + "c1394fe6 40ea7198 415aa4ac c105dce4 4100e5d0 3f96198c -> c2d4cc06", + "c1159907 c0f925ba 4125181a 413177d8 415b9d24 40331c21 -> 41226896", + "c007ea00 41496b98 41678234 c13c2af2 414c9b80 40927aa7 -> c377ba33", + "4085ef08 c18d5936 410a6930 414b0b78 bffa5240 40bd8661 -> 3ea6e4e0", + "4131542a c0c1564e 4183959c c13610a5 412207e0 40a86649 -> 409ef65a", + "419e5b00 41634198 c18b80fa 40256840 4055c2f8 40aa383a -> 40133a0a", + "c18ac531 413ee25c c082dd18 4114e14c 41086c72 40d46148 -> 40f8f640", + "c159c7bc c0d6a5e2 c10d712a c162a7f8 40da4e58 bf70efac -> c162a7f8", + "407998b0 c1262b26 40ce8960 416f2c78 c10305b7 bf1871e4 -> 416f2c78", + "c090a834 c088b6bc c12b7cec c188d132 3f0cef40 400b0278 -> c188d132", + "c0d95680 c18fc431 40059508 c18c1e7d 4134c1d6 40fc8f98 -> c03a6848", + "c0b5bd96 4174ab70 c12c0525 c159de4e c166a091 bf4e98be -> c159de4e", + "c131f2ac 416e1638 c0c63dbc 416b581c 40c9a668 3d8dc640 -> c2d57b36", + "bec8f880 40a7f840 40e45b5c 41817e02 40971260 40676120 -> 4272580b", + "c194f7cf c1727676 40191d38 c199e2ef c14e51d6 3f367860 -> c1e10de8", + "bf991490 419e0c02 c109ec97 c1917fc2 c079cdd0 409ec7c5 -> c0d58310", + "c1025430 c180c562 3fff59c0 c105ccb6 413836d4 40c3047b -> 3fb5f9c0", + "4130345a c01eee20 c17f8a96 40b31720 40c23e48 4033cd42 -> 409d8405", + "40ffc594 3f453c80 4116d170 c1778596 40529580 40de2bac -> 3f3e2280", + "40dec698 c03e9d10 c02c4640 c19366e2 c19726ae 409e72ef -> c217b0cd", + "c037af18 c0ce31da 4102fd46 c192e8a0 40f28888 3e9f9bd8 -> c192e8a0", + "4117a5b8 c14ef328 bf9bb2a0 40e9d89c 4036b138 408143e2 -> c0274818", + "403075c0 c1407b0e 415bc54c 4179b1f0 c16d3855 3f1ef75e -> 4179b1f0", + "c0610990 c086f65c bf9cacd0 c1689cc1 c0e75150 409d9bdf -> c150dde4", + "bfe82aa0 c0b739f8 c0623570 c07afda8 c0a4c59c 40f95750 -> c0c91b06", + "c12cf99c c11b866e c1899eb4 4178b2ec 41681f10 40429494 -> 4178b2ec", + "c18540c5 4116059c 411f0036 41919700 4180f2ec 4051aa12 -> 43108e07", + "41912d32 c19a84c2 418f53be c14f8c87 3fe2e7d0 401c9d2f -> 40a3550e", + "c193793d 4135b15a c1026eef c11e5647 40a2e940 4096549e -> 417a0259", + "c1453218 c1054f04 c199b822 c1912e8d 405cd050 3fff2f0e -> c0ea0e12", + "4115d4ca c0d335c0 41436fa8 be954440 bff0d0b0 3fea281e -> c001e636", + "becc9440 40e6d50c c0d1343c c08714e8 4144337c 40237b76 -> 400ed5d0", + "c02eedf8 bfdb8310 beac20c0 419e2c0c c14af725 3fdc14c0 -> 4298ce20", + "4106b2e6 c10d78cd 41480608 c196d6e5 c0af99de 40892a22 -> c0cc2e70", + "40e7457c 4198ae56 40a609e0 c021ace8 40fbca08 40847189 -> 40f0a128", + "c034ffe8 c1941238 c1612e7a c0578428 c132a6ca 40839386 -> c2160606", + "40d94550 bfc7dbd0 40244248 40aae980 40edb038 40d8d382 -> 411f5e82", + "c19122bb 40b92ff4 4198bef0 41806780 414d6538 3f080540 -> 4208c64a", + "c1657126 c1418a30 c17a57de 410b2ede c0d22000 3fe203fa -> 3d5bdb00", + "3f4db360 41038292 41971908 c1347c32 4147b320 4052151e -> c203fc8f", + "40ec5b94 c18efcb4 419ac2c2 4129f7ce 4194dac4 40bd8df7 -> 41801d1b", + "c1220f75 c19aed3a c128c998 41878f20 c0e0951e 40afe859 -> c1135dc8", + "4118504c c18760ed 406ebc60 418f89ca 419a4bd6 40aed297 -> 419f4aa7", + "408cdbf8 4132d3bc c15c088c bfcf0090 c102fa14 405f7dae -> c05fe40c", + "bfc1d070 41079126 4100eb90 415a24a8 417d43c0 4068dac4 -> 42a13479", + "40753aa0 bff70930 40bea2cc c183bc57 418fa37a 40962b15 -> 414df958", + "41736cf4 c10c3d45 40e5c4e8 c13ada0e 40c5bcec 40c7dca7 -> 41874f02", + "418ad74e c1348f67 416ec060 c090b866 41996f4a 3faa4022 -> 41f8eff6", + "4108fdc8 40371e90 410eeae8 c11d6907 408a2ba4 bf34dbd0 -> c11d6907", + "c0e6dc68 c12ff224 412500ac bf1e9b20 c0fb9c44 3fa3db14 -> bf1e9b20", + "c18a49d2 c070d068 c1731e32 410d5fc4 c0dc60ce 40db5d5e -> c13ce610", + "c188a689 40bf91f4 c16e08d0 41936eca c18a2cb0 40a9f96c -> c1af2f2c", + "c193a3ae c07adfe0 c1700ab8 c0be9070 3f838a80 be9b0012 -> c0be9070", + "40a15dac c187eeed 4114b292 c0131928 c16ed924 3ff578fe -> c17783ad", + "413aebbc c0ca90a2 415c0908 4094e408 412bf586 40b0734b -> 4122de30", + "416fd0d8 c08552b6 4198c86e c03d07c0 c1664668 3f9e549e -> c1433721", + "40ecbbbc c137b129 4179a100 c19feb1d c0ee1e46 3ffbf3aa -> c0e7aa96", + "c16c4556 41222036 3e084080 c198f504 c13621ab 3f5a7e76 -> 41891ac4", + "4182750c 4195ed02 40ff3918 40e6d6b0 41656778 3f86e918 -> 40e6d6b0", + "3f571ce0 40a06548 c10d5af8 413d65b2 41893a04 40fbfdf6 -> 4152ffdc", + "c196b937 bfddf8a0 4173d378 c07507a8 c18479a2 40a1a3fe -> 415d049e", + "410f4414 408ff524 c1187190 4170e2b8 40d4b3d8 3fe83e12 -> 419d845a", + "c1480bae 40a10a1c 41273148 c0798c10 c0f101e8 40171f97 -> 4150590a", + "414d5b1c 412cd5c6 c16f26a6 40b07674 410587e8 40c672c8 -> 40a1da80", + "c19831b8 c1439a80 3fbf7960 411f8124 4181a622 4068930c -> 409a3dd1", + "419636c4 4178f82c c10a2532 4181448c 4196ce1a 40d6e8c6 -> 4175b538", + "c002f778 4110fc94 40d626f4 4153d108 c1012e1a 408da67d -> c2d64110", + "418e1fae c195fc4f c0fcffd0 c0910be0 be911f40 3f8bfdf4 -> 41b55016", + "bfa90c80 c1742b2e c0ee98d0 4181cf30 4198054c 3edba6b8 -> 41e95b77", + "41663e90 c08b5b50 411eb902 c1862406 c099bcf4 40e0cb42 -> 3e865e40", + "c1699f30 4197e176 4104ae50 411e077c 41823a98 40bfd263 -> 4201372c", + "c196dc2a c10a94c4 40c5d1b8 418140aa 41912d6c 40888782 -> 4164a52f", + "4103f32e 419cc50a bf8fe110 3f6f5980 40f7f7c0 40a31370 -> 409e47cb", + "bdb24b00 40b04500 4100ee7a c0f9e67e c10b5d4a 40c28f59 -> c0ae0936", + "c13f2ca6 c18b986d 418476ca c16fc376 c191dabc 4087146f -> c16fc376", + "c17a0910 c0a8eba2 c0c449e2 41306c3c 40fae070 3ff4b490 -> c23d3f26", + "417d3570 c141c822 c1706dce 3f80f2e0 c0b59b3c 3f6290d8 -> 431078e5", + "4047e638 40217470 c1568608 41123120 c14054cc 40fbb9d6 -> 413d39cc", + "40ef34cc c0d16e10 40fcacf0 c18963c2 40547220 40b5bf90 -> 408f3688", + "c146473e 41535410 40f64070 41869b70 3fe9a110 40d2d784 -> c27b6ed6", + "41687428 41810590 c126df4d c1883080 413c8a66 4088aab3 -> c1883080", + "c1275898 4189c378 c103e624 c1610b1b 40a38048 405dfd34 -> 4100c123", + "4007b950 41973e88 c10d0fe2 bea3aa00 41111334 40af1f52 -> 409a6f6c", + "409bfaf0 bf8aee30 416923f0 41893688 c01d7770 40abda4d -> 411d90e0", + "4174f360 c193a0c6 41366da6 4085b810 405acdf0 40d95979 -> 405227f7", + "40a7dd84 4197ff4a 40c20778 c10c13d8 40cf5464 404609ba -> 412f00ee", + "4196758c 3e16a400 412bd2b6 404aa538 becec900 3fb5dae2 -> c0dc54c0", + "40f4cd58 3fc52c00 410588d4 c13f6d88 3f34a280 408fc7c3 -> bf2f58d0", + "bfbf88b0 40fdac24 c17dbf24 41976d4e c100c69a beb0b23a -> 41976d4e", + "4199410c 418b038e bfb4b810 3fa0f920 c1455462 40b9b561 -> 40665d86", + "41406308 40ab96c0 c0c6591a c0380938 3f306240 409bfd81 -> c0b99dd0", + "415cc044 c111fdd4 c0f25a42 414fc8dc 3f5f7980 3f80e5f4 -> c3a7ee04", + "41903974 c19255ea 419a8c40 4073feb0 c127f99b 40e331b0 -> c124c183", + "419fbc5e 40e8c1d8 3f5744c0 c15031d4 c16532e2 40df8a09 -> c1201615", + "4127db4c 40ca2850 40e18a5c 4049c748 c0fd2be2 40b18964 -> c28d45b6", + "419cdf20 c01cd030 c0f0a21e c19bfc9f 41324648 40d67c0e -> c32eed1a", + "4187a868 c1179708 c1993051 c18e1c60 c0b85b9c 3f9b1b2a -> c2ae32fc", + "c1003366 40b08c18 c14f2186 41738838 c198cc24 3fa70302 -> c1315376", + "c183434b c094fb28 40fc016c 4025b170 3fa53340 4065a9a2 -> 408cbc3e", + "c129a857 40a129b0 bea037c0 bfd84fb0 40d444c8 40d779b2 -> 41cc0832", + "41987e32 c115b18e 41964c10 4054bf28 41560a9c be812c2a -> 4054bf28", + "418384d8 418c3612 c116f21c c16ea5da 40db5db8 40f8a070 -> c16ea5da", + "41725d48 418dd8be c0dee290 c10fd3b1 41700194 4062465c -> c10fd3b1", + "4106fef0 41745314 40ad58dc c04c8030 bee0f300 40e88ea4 -> bfa64c79", + "c1962ed0 c03eb868 418212c6 41416440 4131af1a 3ebf63ec -> 418ab758", + "c0ae7fd0 bfad29c0 40791a50 c158529e c1869a92 be43ca04 -> c158529e", + "c10f5021 410a9cd0 41423b70 c1822695 41963f44 be76a620 -> c1822695", + "419d6bac 41940fa2 4107d38e 410e634a 40ee1e28 4089a16a -> 4113cfde", + "c14a4404 419315ac 41209346 419c3b98 411df71a 40c1d07d -> c1af6258", + "c130ba72 401071c0 4131560c c18fa7c4 400635a8 402b8ca2 -> c27b626d", + "c14ef9e7 c17a5a8a c15942f5 c178a38c 41289a10 3f58c84c -> 4238339d", + "c09d524c 410aafe4 4168e6a0 c128f508 419fbe38 3eda08a4 -> c394a765", + "41004ba2 40969834 4183ea48 4002c370 c037dd90 406f29d4 -> 3f3a468c", + "c13bebea c0f581d4 411942d4 c0e99eba 40975088 40cb94e3 -> c13150e6", + "c07b8760 c09f6e2e 410c63ae 41487740 418c33ea 406d3696 -> 41487740", + "c0efa496 c130009b c156f099 c086fa88 4185565e 40d7e1ad -> c22578a0", + "41879f44 41737ae0 c1407acc 3e8fef40 c0c5e720 40f72ad6 -> 3f8f213d", + "41100e4a 418f5882 41935774 406cba10 c107d474 3e266b40 -> 44c553a0", + "416dfac0 40dd2968 c16dec2d c11f831a 415c9c64 3f9959c8 -> c1ee65eb", + "40d8ebc0 4165d578 bec05980 c0c98d6a 41063e4c 401f7c3c -> becee130", + "bf10f980 40237e58 41324810 c0cb8f9a 41876ea2 40bef846 -> c1908dd2", + "419e2aae c0f86e34 41009f5c c18f8240 40a2e4a4 407b7f8e -> 41e78cfc", + "c0dd5820 40ff293c 41941954 412ce3a0 406c8960 40a108dc -> 41bc2a94", + "4164d4d8 4145efa0 c183f152 4066e2b0 418d3e40 3fb1af3c -> c0d06380", + "c086cacc c18c2799 c09939fc 4186608a 41100cdc bef6bed2 -> 4186608a", + "c0a64848 405014f0 c152c36b 41473410 c1993877 40c1142e -> c050d330", + "c145e8e0 c09453d0 c1981620 c148ce24 407b64b0 40fac5fe -> c084763e", + "c037d170 414cff40 c1916ed0 404e1858 4187947c 3e9dd198 -> 404e1858" + ] + }, + { + "glsl": "float cultmath_cycles_map_range_smoothstep(float, float, float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c10be454 417f9240 c1154ce1 414d05f4 bf19b8c0 -> bf143ea0", + "41802756 c0ff986c 417d37bc 409cc628 3f074ee0 -> 3f074ee0", + "418ececc 41672c74 c087cbea c18835dd 404ef030 -> c18835dd", + "40b7902c 40e83f48 c1914975 c09d5db4 3f21fe20 -> c09b8889", + "40e40b14 c14bfa32 404b3210 c13ab3bf 40ba4700 -> 40ba4702", + "40db45f8 c138e989 c17c454a c15852f9 c17282c0 -> c15852f9", + "c1334f3e 41491484 c1677827 c129a4c5 40b14ad0 -> 409c919a", + "41507a9c 413a2428 3ffeaf40 c1812f9b c1131215 -> c1812f9b", + "3ee00880 c16fa8ac c15a363c 40e34464 c01f1e08 -> c01f1e08", + "c15758b5 413b17d2 3f744e60 c07d6590 4136438c -> 4136438c", + "c1672061 419fdaa6 c13dcb10 c06bdbb8 bfa7ee20 -> bfa7ee20", + "c17fea23 c0e67486 c18d4c91 c1501d8a 4148c178 -> 412ce468", + "40f27064 c14386ec 41158ab4 3d65d600 c1043bd4 -> c101b0ba", + "c16b76ea 410ea49c c15a4131 c0244488 4123416e -> 4123416e", + "4161a3ec c16bb645 418fe624 c17b9cc4 c19e7031 -> c19d2adb", + "4006b8e0 c198e1fa 41809528 412d13c4 bf383cc0 -> 4052a9b2", + "41728b28 40efa328 41031418 c09d2d0c 419a4ed0 -> 419a4ed0", + "c1330488 408dbf28 41137ec4 412b5900 3fc47c60 -> 412b5900", + "3e6d3780 4114bd4c c0a0191c c10b20ac 404ed6e0 -> bec94f60", + "c0eaf19e c08a66c0 40c9c7dc c09443f8 c0f8a130 -> c09443f8", + "c017f540 40aab208 c183d4fc 40baca5c 418a4fd0 -> 4111de9a", + "c19db50e c1900b80 c1811726 c0785a28 4184aa02 -> c0785a28", + "c1871317 c0519248 c107ace5 40f6cc88 418b1b26 -> 418b1b26", + "c19f4cb0 bed36080 c0b7bd88 3f448360 c1889ba6 -> c1889ba6", + "3f5a9820 419d92ea c08b3460 417e5f50 c1207370 -> c0dd2704", + "c173195c 41245648 40d5d9ec 3f856c30 40f130d8 -> 40f130d8", + "c1591e68 c0ad4fc6 3f34c4c0 bfb4dd30 c192c33e -> bfb4dd30", + "c122cdd8 407dee30 c18d288b c00cd898 419803de -> 41527979", + "c152ed88 3f10de00 c0dcd560 416204f8 bfca5230 -> bfca5230", + "c183f347 c00e5740 40e91a60 c0c2adf0 40493c50 -> c0c2adf0", + "41512234 c194aa4e c1676448 c0f1d560 413605e4 -> 413605e4", + "c0048c90 c1250cce c146094b c0844ec4 4147b8fc -> c0844ec4", + "c11fc064 c09607ee 403490b8 4109510a 4122726c -> 4109510a", + "410881b4 41802790 414eeec0 40c1d97c 40f2084c -> 40f2084c", + "c07853a8 c03127c0 4183abb2 3fe203e0 4180db1e -> 3fe203e0", + "c19db22e 40d3210c 3fc306a0 c02159a0 c1588ce1 -> c1588ce1", + "40e0f8e4 c1881b74 c0e77822 418f2f38 41677638 -> 41677638", + "c16fc9cc c12f439c c13bc904 40e6bcec 406e72a0 -> 406e72a0", + "c19ee085 c069eca8 40cfac98 40aa21bc 410fc820 -> 40aa21bc", + "41381670 418df4d8 4090888c c18036b9 411e3404 -> c0857000", + "c14835b0 409af6e0 c1962fc8 40cb49c8 c14f9c00 -> c119efe5", + "c08527ba c170ac00 40716cf8 c06a83b0 41316a40 -> 40adcd48", + "41354c56 4102925e 41224d1c c1299a81 c168c376 -> c168c376", + "c14f897e c18ba3f3 409d8b80 4161dad0 40a47874 -> 4152ddf5", + "bf03ab00 40f83048 c1646fb6 c18d57f4 40ed8a60 -> c11b76cb", + "419e3320 412bdfc4 c10db97a 414c785c c1766034 -> 414c785c", + "c18ba705 c18f59e1 c01cc6e0 40f2eb28 4197d468 -> 40f3e029", + "c18e7f7f c191ebac 40cd3e18 412dfa6e bfafaf60 -> 412dcda4", + "c19f8ee6 40a8c250 413ed7e8 4180fa1c 41465050 -> 4180fa1c", + "c1005368 40c66f70 c03a3cd0 be0aeb80 3ffa8cf0 -> 3ffa8cf0", + "410f5e56 c0e5b822 41266974 bf954d50 c119914a -> c116ffe1", + "be89bac0 bf614da0 4197282c 41976fda c14c023f -> 4196b9ce", + "40a318c0 415d0d78 412fe2e4 c10440b9 4108b84c -> 4108b84b", + "41140018 c1163bea c18b943b c119434f c185e23c -> c119434f", + "c16bb226 c0779bc8 4160cb54 c0905e84 40a2b408 -> c0905e84", + "4163642c 417d4040 c12663ea c121003b c091ced4 -> c12009db", + "c0cda2f4 c0cb2212 41347234 c112d943 c08b7d12 -> c112d943", + "411b8e06 c1051d36 4195bbf8 c033e488 bf4095c0 -> bfa460b5", + "40445770 c18913d8 40ef7eb0 4067f2b8 41587db4 -> 414b04cf", + "c15c2b46 41647e40 3e462800 c146c417 c186d7e3 -> c186d7e3", + "c1950bbf 406980b8 c1554be4 c0599cd0 c053f0f0 -> c053f0f0", + "c0e5756c bf9d3b20 c0a2ce90 415bfc50 c073d5d0 -> c073d5d0", + "4079c7b8 c127b0ef 410f5094 405f1c70 415acf38 -> 413f78fa", + "c108e298 c18bb25d 3e2f0a00 4180bee8 41969522 -> 418bd4f0", + "c01b8ac8 c101b3dc 40aba15c 4132c60e 3e496a80 -> 40deff59", + "c18cc53b 410a59b4 c119315a 3ffa9840 bf93d5b0 -> bf93d5b0", + "419f72f4 c08bb0c6 c18fcfea c1535076 c0bd9fd6 -> c1535076", + "411ece58 c1504526 c0aa4d30 416222f8 c18981ea -> c18981ea", + "c110ca96 41862508 c170845e c19801d7 417584b8 -> 41427be4", + "c0ce7268 c0c2f088 c18003e2 411f2d74 40058130 -> 411eb150", + "c1826346 c0bc7bcc 408335a0 c133ee5c 40b265d8 -> c133ee5c", + "41179c5c 419247c0 c09023e2 41833990 c0b6e38c -> 4110b0cc", + "4085d728 c13a7608 414f45b0 c0a311f8 c06f6d78 -> c084504c", + "c13bb5b2 c148111c 400a8428 c12968f8 c181ff90 -> c12a2310", + "c1789d72 40fb83bc 40c1325c 415481a4 40fbe9b4 -> 40fbe9b4", + "3f4d33c0 c1512f7d 408ba8b8 417d4154 c155a120 -> c12320c4", + "4107edce 4094c2f4 3ef42640 419ef95e c09b6850 -> 419ef95e", + "40ba47a0 41388cce 41544e88 3f9be4e0 40932770 -> 3f9be4e0", + "413a3ed8 4137cccc bfdccdc0 be1ad000 bfaf7b40 -> be1ad000", + "c18b2a47 c1817dce 4121049e 4097af60 40e274d0 -> 4097af60", + "c15f281a 413be6b2 41696134 40c65928 c0180900 -> 40c65928", + "c08510d6 410128ec 412d192c 3f61cc80 c173a050 -> 3f61cc80", + "40232f60 c0c289b8 beaa68c0 411c1442 40b940d8 -> 40b940d8", + "419c450e 40fbd18c 415152f0 419e1598 412700d4 -> 412700d4", + "c0510a00 c0b8bf46 c1986dca 409a06a0 c0fc7bf0 -> 409a06a0", + "c0e0d47c c126a468 c15cfb92 c0ab1de8 40a892d4 -> c0ab1de8", + "c040c4a0 c048d068 419cfe56 c133f914 c19b3c83 -> c133fc20", + "4186038e 41210044 416474a0 400fd3f8 419a6a22 -> 419a6a22", + "418dfd72 c19a462f c0f39c84 c0638c48 c18f9c11 -> c18f9c11", + "c011f130 c102dfee 41085204 4160f454 bf679820 -> 411c6d81", + "c0a87aa8 c1144e8c 4124d970 4164d6d8 c11a8316 -> 413b44c8", + "413d3788 412cc244 c123a21c c0bd2aea c1759802 -> c0bd2aea", + "c15be402 3ff123f0 c0755f80 4179d360 40f921b0 -> 40f921b0", + "c165000c c0b68310 c1115a32 41128d48 41109950 -> 41109950", + "c128762b 41597428 c112a20d c19c548b 414b05f0 -> 414b05f2", + "c07ed890 c19148b1 40900f00 4030edc0 41663e54 -> 412b8e76", + "c196c528 3f884c90 c0fbdfd0 4178ea90 c1177943 -> c1177944", + "c15be29b 40d1e4f0 c16ada2f 41934502 c133b090 -> c13102b4", + "c160bb2a 3e944c80 3e428580 c019cc00 4150b848 -> 4150b848", + "c0845338 40919704 c04e8688 410a8c16 4182e3f6 -> 4182e3f6", + "c1849d62 c198c2de 419ae260 c16fa4fa c1260357 -> c16ebd0f", + "3f927430 419f29c0 411d8284 c193178b 4165330c -> 4165330a", + "411fc8ea c15b453a 40e044e4 be9a7940 c18406da -> c18406da", + "40a624d4 c123eb9a 3f1bd940 40a29948 3fc39b90 -> 3fc39b90", + "bf5f2820 c130675a c0efc86c 3ec7bb00 404551e0 -> 404551e0", + "4112e774 c0d32bdc 4153d0f4 c149615b c04b41d0 -> c08642e2", + "41377e5c 40a22080 417d7b6c 40cce710 412f7916 -> 41152528", + "c19e024a 3fda26a0 c14e4aee 40bddbc8 41163838 -> 41163838", + "c15a361b 4185b7f8 c182558c c17ea908 bf9bcbd0 -> bfbe52a8", + "419d4508 41547ff0 c19c1111 c0bcca98 c1425a26 -> c0bcca98", + "c15e3e02 c1807908 413b11bc c14de75e c0311650 -> c14b1896", + "41672c98 41065e7a bf83c8d0 3ff83460 3ee2a6c0 -> 3ff83460", + "c1441b8c c1557d72 401b8f80 409942c0 c18925a8 -> 408fbb3f", + "c1714755 c118c0a5 c19b288a 410bb320 c1860490 -> c0cb9864", + "c1841935 c18ad056 416acfac 417b146c c09aace4 -> 417a6a30", + "401a7630 c16bbc40 c1393b2e c1932457 405b29a0 -> 405b29a0", + "417e6784 c0e2e798 bf5c9c00 419c7c66 c1149273 -> c1149274", + "40f0e0d4 4155fe84 410b62c6 c12d46e7 41842640 -> 41842640", + "c102630e c18a2108 40a55d0c c1682750 3fd29e20 -> c10ac834", + "419da3ac c0b6e7de bf8a63c0 c1962edc c0c4644c -> c0c4644c", + "41134ab6 414ad104 c103d543 c1125c2e c17a27bc -> c119fbea", + "c1844eab c12bc1bc 417ffd50 413f6f14 416d1ce0 -> 413f6f14", + "4112e8d6 bcccb000 c028c1b8 41941e12 40915b68 -> 41941e12", + "416d5840 40f098a0 4037ac58 c0bd985e c0957772 -> c0bd985e", + "c10745d8 3fdee4a0 4136f5d2 414366a0 413659f0 -> 414366a0", + "c199f82c c0213cc8 4112f6fc c0be7eb4 c0913b94 -> c0be7eb4", + "c13dee84 40cb2070 c14cdd75 40f7d2f4 41637fb4 -> 4162c8e7", + "c18634c0 c196cf45 c13b6d93 41732088 c14bf51e -> 4117b10a", + "bfde6ed0 418b0098 4185f9d8 c0b4c790 c14a9c57 -> c14a9c57", + "413e034a 40abdcb8 40d4e4c0 3f72afc0 40d9f708 -> 40d9f708", + "c0fa09ec 4136a0fa c172804a 40bcbc00 c18d7627 -> c154693e", + "c14891df c1961268 bee77c80 bf0b61c0 c1831bb2 -> c0995ceb", + "40bf63b8 3da3a300 3ff9e560 c05fcc80 40d616cc -> 40d616cc", + "c18953b0 c0e711c4 4119e61c c17b438d 3fa8b9a0 -> c17b438d", + "415af6c8 bf4461e0 40f59518 c152d711 41888910 -> 41888910", + "c0ba8e14 409fd1c4 c03a9998 409c05f0 419c2b52 -> 419c2b52", + "c093bd6c 412d3e6e c13c3400 40e78a48 c185cc6a -> c130c974", + "c0523e00 3fc08400 3fa62460 40adab8c 40d82320 -> 40d82320", + "c1902258 3fccead0 410d4888 413957ec 3fa2c830 -> 413957ec", + "41917570 c09276f4 3e79b480 40f521a8 c177f4f7 -> c177f4f8", + "bf673d40 417c0844 4016d7b0 419d09e4 415204b8 -> 415204b8", + "414f4128 c18214ca 41902b64 410d4bde 41025abc -> 41030047", + "401e14f0 4085032c 416ac128 bd866000 4103a752 -> bd866000", + "4172736c c10284ba 416b7788 c0d8b498 c120651c -> c120651c", + "3faa4100 4137b292 c17cefac c01d5480 bf2a41c0 -> bff302ae", + "c0fd4d20 41267158 4180b952 40b19fd0 419713a2 -> 40b19fd0", + "4195fa38 c173fdee 4116c8c6 3ebefdc0 3ed94f00 -> 3ed94f00", + "bebcdf00 c138777e c13647c9 4161c068 c11ad9fd -> c11ad9fc", + "c0e0cbd8 405ee6e0 414778ac 418a3d84 c17b73ac -> 418a3d84", + "c00b1918 40ddb868 c131aab8 c18527b4 40c3cb34 -> c0a33898", + "40cadf2c 3f34cfc0 c14fbee3 c0142840 404b0ba8 -> c0142840", + "40f3b334 4138f7f0 c172f4f4 3e96fc80 3f855a60 -> 3ead7df3", + "c18b9818 c1459c36 c0f0f242 411f249c 4116664e -> 411f249c", + "c011f350 416bb8d0 c0b66d92 419c1464 c13671b5 -> c11181e8", + "40d5d5d8 c1861e78 c19b2470 c188c027 41880068 -> c188c027", + "418ec734 41981cf2 c1516ab6 c0d7c2e8 c193eeea -> c0d93725", + "40a4fa78 3fc0e090 414bc20c 419b7528 c0ee90a8 -> 414c26cc", + "bffac470 418de07a c1042d2a 41899a82 414cf0dc -> 415753b7", + "41012118 c182c145 41050052 c0ddd5c6 c143a9cd -> c143a392", + "c16ac9b6 c10fcd26 c18bd5f8 c141eb44 40d21250 -> 3fe5bf90", + "404603a0 c0ebda04 c129d381 416c224c 419b7d58 -> 416c224c", + "4046b220 3dcaef00 c17e3e94 3f2f5200 40aa6904 -> 3f2f5200", + "41099fb6 4094c54c 4138ec80 bf9b5230 417e2e10 -> 4112c3c0", + "3f859df0 c0a2bc82 c0dec6e0 c0264c40 c10a4124 -> c0264c40", + "bc772000 403f97e0 c039af38 c154c813 3f06d320 -> c0c57613", + "4041b5d8 c0a27a86 40f14408 41722980 413aca86 -> 414af9a1", + "40dab718 4183f2ea 41984046 40d62acc bfcaf600 -> 40d62acc", + "c0ef2b84 c0fc20da 418fcfde 419ff7d0 41170b24 -> 419fe812", + "418f88ca 4159ff88 4130ddb8 c101ff7f c17caed9 -> c101ff7f", + "c184a0c7 c0fcde12 c1279568 c03463c8 40d744e8 -> 40d744e8", + "4126948a 418fcb26 40a3ce40 41842af0 c156b910 -> c017fac0", + "c19f3287 41787ecc c18a85b7 c0b895cc c065cb20 -> c065cb20", + "c13d1637 4148f3dc c1306813 41102a9a 4193ec7c -> 4193ec7c", + "4141b9e0 40b3c42c c17228e6 c19d05c4 40570f48 -> c19d05c4", + "c1313bd4 c043f7f8 c0dea624 40fec398 c0d2a56e -> c0d2a56e", + "40cb8564 413f0842 c16c6c4e c18c0c9d c0394500 -> c17dc489", + "c1112382 c169a7da c11a450b c13978f6 c195e503 -> c195e503", + "410dc540 c10a014d c18beaaa 3de73b00 bfd7cd80 -> 3de73b00", + "c0405230 c1290500 406faa90 406589a0 3fa10ae0 -> 4014b7c8", + "c169e247 4094cf38 c18fa672 c0d3b0ee c0fcd172 -> c0fa6468", + "c00c8e90 c14c4623 c12d89e1 415d233c c00c86e0 -> c00c86e0", + "c0d0daf0 409dd2bc 418942aa 4046a260 3e610f80 -> 4046a260", + "c13d6d51 4124eb1a c19e791a 4189032c c1684f44 -> c110b2a4", + "c189b72e 400ce390 c19b778f 40f7e940 c125ec49 -> c11d668a", + "3f3bb2c0 4046dda8 40981148 4003b8a0 c15a27a2 -> 4003b8a0", + "419be496 41531760 41174a88 c154bf90 c13f7071 -> c154bf90", + "c1925276 411e5524 413d6c28 41264f80 419a6934 -> 41264f80", + "c1826eb0 4181f104 c05da120 4129a8c4 40f946e8 -> 40f946e8", + "c180920e c0b90d46 bf17dea0 419f251c c11d8c60 -> 419f251c", + "40d600b4 c12c12cc 40d3c894 bff272a0 bfc38240 -> bfc38240", + "404b9350 4082ad70 c0b68308 c181f617 4135dc1a -> c17956bd", + "416b24f0 401ec4e0 40e30ff0 40ee95bc bfd75720 -> bfd75720", + "3e8f6500 41779ed8 412744e6 c09dcdee bfbeb6b0 -> bfbeb6b0", + "bfde13c0 4193bf78 c12341b2 418e99fa c191b8f2 -> c12a3eda", + "c1575063 c1655ed4 c12097e1 419fa896 c164c82d -> 4181ff25", + "c157be30 c1826555 409b7cd8 c1018578 bea4ff80 -> c0f70072", + "4123dbf8 c156cceb c10a6727 4103b0ba 409b5578 -> 409b5578", + "c017ee90 c08cd2ac 41015858 419839b2 c176528b -> 4184cf15", + "3f9b8b40 c12da5f0 41114cdc c0f6d8b2 c147d7b7 -> c12d892c", + "c138c2f3 4070d1d8 c17a96f4 3fb10860 413e3618 -> 412ac8be", + "41038168 419b9774 410cb056 c06b71b8 c1011fe6 -> c1011fe6", + "c01ef158 c0bc22ce c0b52560 41906e00 409b3494 -> 409b3494", + "412fef9c 418cf966 c099e524 c1438d26 41013924 -> c0fe8f81", + "c0c96fd8 40840bfc c18e35e9 41236e4c c198ed99 -> c058c420", + "c18aac90 c119d966 c113b517 4153867c 3f11cb40 -> 4153867c", + "418b2ac8 c05aaec0 418d6a3c 414728e4 4189fd62 -> 4189f832", + "40303568 419ae624 c1843150 3c88e000 4137569a -> 40a339c9", + "412cad12 c00df508 41707548 c06cbd88 c14a98ed -> c134e3b4", + "c183f51f c195eb53 41207c58 c0ba4dca c0cc844c -> c0ba9e8b", + "4065fa68 415f4ca0 3fa6d010 4086b508 415ce034 -> 414f9ba1", + "408a6e20 3fc50240 c0bc0a82 3eff8800 41138f3a -> 3eff8800", + "c00a94c0 410ae3fc 417929d8 417c06e0 c0aeeae6 -> 417c06e0", + "c1988853 c0639778 3ff22360 c1998f63 c18f3988 -> c1998f63", + "413a2352 4162556c 4172c900 c06b8f08 418a460a -> c06b8f08", + "417ec558 411190b4 40bd8720 40381ce0 418b0786 -> 40381ce0", + "c194c13e 3eb54800 4184b8e8 bec6eb80 4187cf0c -> bec6eb80", + "c1847b8a 41747a4c c0d10c18 41952458 c0e27894 -> c0e27894", + "c1964977 40a7a314 403e8488 412cb536 c0cc086c -> c0cc086c", + "c18f1b76 400d6398 419a3736 c191dcf8 c1598846 -> c191dcf8", + "40e1f740 bf21b120 41139b1e c0fd67a8 3ffcd440 -> 3f410990", + "41172930 419641d0 c170423c 40dd9ce4 418f0d70 -> 410f88e6", + "4173a65c 4179dcb8 4133f384 4047b4d0 40fa2368 -> 404e6795", + "418bd848 4141722c c0813d96 41963462 c10e7e5d -> 41963462", + "c1658af4 c1882fe9 404feef0 40fc3b08 c198f011 -> 40d30350", + "c159ae37 c10d4bb6 c179ec38 c18a6fc6 4172c300 -> 4104995a", + "c0c9271c 411d224a 4084fafc c061c200 c11aec94 -> c11aec94", + "40026260 41320f22 40904b48 418d170e c1478b17 -> c1478b18", + "c1757ab8 4124bc8a 40d15704 c199e917 c0138a90 -> c0138a90", + "c1666fa6 415fde04 419ed9f8 c1882e3f c076d310 -> c1882e3f", + "c11fa91b c15c0851 c19bfd2d 412ac470 c199fea9 -> 412ac470", + "4082b6e4 4180f498 c1954132 c10cd3b2 c08d6e80 -> c0f2e616", + "bfdc58d0 41666fdc c18db158 413c0b74 40855cd8 -> 40fdf7f3", + "c1697bf0 c108a0c6 c0a737f8 c0e64c72 c16386e2 -> c0e64c72", + "c15a5e95 c146b376 bfd66740 4133f3dc c15903a6 -> 4133f3dc", + "c0948efc c0642d50 401f37b0 c11cffd8 41748f84 -> c11cffd8", + "c0f31878 c10affa4 c194c7dd 40d1aa70 40a4d830 -> 40d1aa70", + "c1488b3d 41151ca6 4157b910 c088e65c 40c76ff4 -> c088e65c", + "40bd5ec8 411c9188 c0d60d54 40039578 41140002 -> 4043cc1e", + "c11bea92 41001f3a 416ca010 c05a0268 c0f6cd6a -> c05a0268", + "41623120 bf486000 40e1b450 41899532 c123562f -> c1235630", + "c18c7ad3 40fd892c c12bee37 40879028 40ac9458 -> 40ac9458", + "c145993b c0cbc974 41327d72 c082c66c c1869582 -> c082c66c", + "c1508b76 414fff94 c0886fd2 c15660a7 c0531960 -> c0531960", + "c07a6250 c0016758 41986b9a 40d24398 be0d9200 -> 40d24398", + "c05bc078 41645334 418226dc c1900613 41817376 -> c1900613", + "40eb328c 3fd2a4f0 c161b17a 418f3370 c196d0cf -> 418f3370", + "4152f9c4 40884c68 c17cba1e c04f5268 402d8700 -> c04f5268", + "bee9fa80 3d856e00 c12c0f06 412542a6 bfb57660 -> 4123fd43", + "c0f6d7c2 41950a0c 418b2e46 bf8f7cf0 40122de8 -> 40122de8", + "c02fa890 c0f751b8 410300b6 419f22e0 418198f0 -> 419842c4", + "c075d428 3e28b380 c19c23d2 c02a7d50 415399f0 -> bf751356", + "c13d48da 413a76dc c14be210 4100e12a 41905874 -> 419004c2", + "40c02450 c1443340 41541694 c0a78330 c12024c9 -> c111253a", + "402d3958 410cb9b2 4197ce58 4078f668 418944be -> 4078f668", + "41802e48 c1344ad0 c1346b74 c1402f68 c146ca65 -> c1402f68", + "c00410d0 4186fb54 c0270aa0 be92f400 bf897780 -> bf893bc6" + ] + }, + { + "glsl": "float cultmath_cycles_map_range_smootherstep(float, float, float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c09d7bb8 415753e8 c15ff739 c1926581 409fa6d8 -> 3e487a80", + "c0df5214 4071b760 40dbca6c 406245e0 c0aeaacc -> 406245e0", + "40fc72a0 c0e6262a 3f987e80 414491c0 41493f0c -> 41493f0c", + "c17738a2 c16a0280 40287890 c131cad5 419c9e90 -> c131cad5", + "41075c28 c0d68b1c c17b3ce4 c18a21df c19e9559 -> c18a21df", + "c1492a39 c108f1be 4147e7c4 c123d4ef c096c3b8 -> c123d4ef", + "c10b3f84 c0b78cf8 40f16b20 c12defe6 403dbb10 -> c12defe6", + "4148be40 c1921e03 4138e198 411c6afa 4187c220 -> 4187c220", + "41977040 c19095c2 c091e98c c12a6d01 c12bafd3 -> c12bafd3", + "404dbe98 40f14ac0 c063f4d0 c092dcea c187c8e2 -> c104ce3a", + "c0ee0368 c0b84ef6 c137f7d3 3e0acf00 412774e8 -> 3fdc00bb", + "c191bc28 411290cc c185d9be c193d028 c01c0968 -> c01c0968", + "c1935ba6 41348612 c0391768 c13c0cac c1860af1 -> c1860af1", + "c0cc006c 40a86eb8 c0fe0092 c12add03 c19fbf9a -> c19eb97b", + "c1897e4e c0c5c830 414db328 c1014f16 c19ad1ae -> c1014f16", + "40d10f5c 418ed79c 416f301c 41576c18 c0426960 -> c0426960", + "bde7cc00 41700b74 c03aa718 c154432c c18a3014 -> c1893b01", + "418873fc c163cea8 c14975ac bfab2670 3f973890 -> 3f973890", + "c184e946 4193bbba 412081e8 c0f92554 41763b8c -> 41763b8c", + "c145a594 409a34b0 c14ce819 c15e571f 417a5064 -> 417a3c8b", + "418f9c26 c090b4b0 c14e2031 c093de84 c19e4a94 -> c093de84", + "4195f132 3fb12af0 4184aba0 bf031660 c1808963 -> c1808963", + "c18093c4 416360b0 c1231f91 4091f410 418d669e -> 418d669e", + "c156c2c1 c0b9a04e c11a02af c167ac84 c15cfdd8 -> c15cfdd8", + "c142318e c0094be0 41566484 41023bea 418529ac -> 41023bea", + "c17a7411 40726800 3f245d00 c05e2a88 41500238 -> 41500238", + "c1924955 412a9752 410d873c 418e8dd8 bf7d2a40 -> bf7d2a40", + "c1797540 40fc574c c1925d42 c157ae04 c1802146 -> c17fe10e", + "c08a7ad0 c12d25ea 40fd7770 c0a8a412 c02fc590 -> c096163e", + "c12d333c 410a9706 c1687821 c0aebfcc 410cfe4c -> 4105c62b", + "41572a94 c0b1c5f4 c1929dca 419f535c 40f903e4 -> 419f535c", + "3dc5a300 40050488 bf82e0e0 bfa214e0 417ddee8 -> 4138b73c", + "c0a16f3c c19a103a 3d61e400 40cf98c8 c18e400e -> c16e5446", + "c0d77db4 c16a268d c1003b43 c1673352 4154427c -> 4154427c", + "bfa77340 c0f02b44 c1812a55 c193b4fc 41283f90 -> c193b4fc", + "41957a2e 411ef14e bfaa4b90 c111d2b0 40ef0d2c -> c111d2b0", + "c08a162c bfd76ef0 c15e5a48 40f6ee24 419c6bd2 -> 4108d1db", + "40e8a0a0 410fd2e6 410ee084 c11f6640 4197510a -> 4197510a", + "40152678 c131783e 403e2058 c1158ced 41107514 -> 411032c9", + "c0a239e8 4111f832 c1948855 c0efa3da c1801946 -> c13f3834", + "c1818657 c054b6e0 419f5d98 3fa2ece0 c11e134c -> 3fa2ece0", + "3f740360 c1168e4f c19ee8ce c12998d7 41118d94 -> c12998d7", + "412299f8 c184bab5 c13e896b 413436d0 3e3a8000 -> 3e3a8000", + "41851b20 416a39d4 41456ad0 40dde984 c0a1a0d6 -> 40dde984", + "4088dc80 c0641c40 c1906a82 c155d568 c1110720 -> c155d568", + "c123762a 41186248 41533844 c0efbe14 c08d46f8 -> c0efbe14", + "c12703d5 410801f8 c15d7784 c151a024 406a4d10 -> 404c8538", + "41981150 bfcd4870 409a9038 c019d690 bfb34490 -> bfb34490", + "c0548580 410da482 bef0d4c0 3f70c2c0 c133f7e2 -> c133f7e2", + "bf8a07c0 c1997769 413b5148 41278912 41463ed0 -> 413bc03a", + "3e9526c0 418646b0 c0b00ad6 418c7f40 be941980 -> 3fe00da8", + "40ebf4c4 c0a8b168 41549098 c11a9b43 c19d4e90 -> c18e39f0", + "4136ddec c0271a48 40f41adc 415d0aa8 beedd2c0 -> beedd2c0", + "c192b400 418a010e c19674a3 c1465c74 3f963ae0 -> 3f963148", + "bfe10580 c1230e48 c0a83f14 c13aa2ad 4192287a -> 4192287a", + "4176c9c0 41873fcc 3f80f680 418f113e 414039d8 -> 418ebd01", + "c1308758 418e8880 c18a2868 3df11200 4174b34c -> 416a70d3", + "c0e72266 c0bff138 c1367602 40e60150 41824c70 -> 40fd67e3", + "4088f6ac 40a38cb0 c0b03940 c02f6210 40e57300 -> c02cb0a2", + "419a5298 c1963476 40b6dd68 c194c29f c14e8fe2 -> c14e8fe2", + "3fd5e770 419cfd3a 40835b78 c12b3e4a c0bb40fc -> c0bb40fc", + "c1184880 4002b3a8 c15d62be 419a56c4 40892aec -> 40c6a880", + "41277acc 415b887c 41766e1c bfd6a8e0 4135ea38 -> bfd6a8e0", + "4159ccec c0aaeb84 c147d4b5 41942bac c153dd62 -> 41942bac", + "40f52138 410a781e c0bfd3dc c10af557 41872604 -> c109ce70", + "415218f8 41750e58 418bdc7c 3f951e80 4197d5e2 -> 3f951e80", + "416332ac c10cef1e becb7e40 412cb25c c11a8316 -> c11a8316", + "c12a81cd c0c93974 4156ed78 c1607d5e 4099f798 -> c1607d5e", + "412bc1e4 c14295de c12b238c c188ca67 c162e1e9 -> c162e1e9", + "4128f2dc 411b583c 41815c3e 40bc7a8c 4158ec94 -> 40c10661", + "409435e8 415b6bc8 40e62eb4 416a5828 bf1207e0 -> bf1207e0", + "415044d0 40b3c8c8 c0e6b9dc c0f314a2 3f823460 -> c0f314a2", + "c09aadb0 4091e7e0 409ff2e0 c19d7f1d 412162cc -> c19d7f1d", + "bf396180 c0bc372a c1764440 c1405205 4001b010 -> c1405205", + "bdcb2c00 3f9ce620 c193abab c0c948e4 c07e7d18 -> c0c914c5", + "be366180 bf264580 c10e5521 c168136e c15aa6d6 -> c168136e", + "c1849fa1 41992aee c106844c 40f36e78 c0b4de62 -> c0b4de62", + "c19c1c8f 407fe628 409e97d4 c10a2d25 c02b1fa0 -> c10a2d25", + "406e6740 c1989fe6 3f83be60 409e7830 c125ad5d -> c125ad5d", + "c15d320c 4035c2c8 c1302551 c0e5ef32 40d1685c -> 40d1685c", + "c063c640 40a338f8 41030a80 c181175f c0cafa26 -> c181175f", + "c184c0e8 4142c320 c0d0886c bfb044a0 419cdc84 -> 419cdc84", + "c0caadac c0af8cf8 c14b4981 c15ee37c c019e8d0 -> c15c6769", + "c07eb2d0 c0e10f88 418b211a 40bee1f0 41199bea -> 40c0c033", + "41747060 41129882 4153e8e4 412a75e4 4192691a -> 4192691a", + "bf82b460 c19e6d85 c05a4db8 c17ef715 c1226d3a -> c1226d3a", + "4187dae4 c11a3f07 4192513c bf863ce0 411e4aba -> 411e1fe5", + "bfd6dde0 c110b4a5 c144558e c0c1975e c110ed62 -> c0c1975e", + "c13afc3e c117c240 c15aab82 c103e62e c182b889 -> c14b164a", + "c12c9fb4 415a09b4 c0a14972 c14a49b6 4159ff58 -> 4159ff58", + "415355b8 40ae5d00 4041a6e0 404db1f8 413443d0 -> 404db1f8", + "40e8ebe0 413db394 418c4a4e c16700f3 416ad978 -> c16700f3", + "c1865363 c08d52e6 c1294d21 c1339b5a c18afe5f -> c18afe5f", + "c1858be8 c071a3d0 41057e1a c074b8d0 419a30c4 -> c074b8d0", + "c16ef810 c16c3236 405c3790 c09f434c 3fa4c140 -> c09f434c", + "40986540 40351010 3fbe78a0 40dfcdec 411171e8 -> 40dfcdec", + "40ab3f80 40a79360 c12c49b8 c118f66c c0570bc8 -> c118f66c", + "c10778b8 40eaae84 c09d940a 40f5e928 c18b159b -> c18b159b", + "40cee160 c0d29280 c18eaa4e bf3a5280 c144469c -> bf3a5280", + "414bad34 c1973a8f 418c77ec c12de971 c19d2ca1 -> c19bd9a8", + "414fc940 c16b7467 419644be c13eab3f 4108f766 -> 40f82e6e", + "40ff0fdc c18fefb1 c13ff4a2 c19095d5 c157eece -> c157eece", + "c178ce16 c11a1b81 c117525b c061cb68 c12ac646 -> c061cb68", + "c001c1d8 c15a5fba 4197d4a6 41422798 41317bfa -> 413e12c0", + "c080de26 c196cf78 c19abb3c c0ce05fc c0e61e4e -> c0ce05fc", + "413a5130 c1876ecd c17d4cf6 c14b5b0a 4108eaf2 -> 4108eaf2", + "406a9ef0 40a8a858 c0f48ef4 40d48074 4180d454 -> 40d94862", + "3d8a1400 40ce8064 c196cf3c 3ff09160 410ab522 -> 40265a86", + "c1279956 bf2b41c0 c0db3cb4 3f971b10 41915170 -> 41915170", + "c079cf38 c188fb73 40b63c80 c120dee3 411c29d8 -> 40302028", + "40cc19dc c18f0f34 c16937c0 bffb2b60 408c2b9c -> 408c2b9c", + "413d6830 c175fdee 40a718f4 417463e4 4187531c -> 4187531c", + "409ccb10 418eb6c8 c19a4ccc c0d42d3c 4035a5d8 -> c08d9d56", + "bf522420 419015fc 4079b5b0 3ebc8f80 41142594 -> 41142594", + "41384f58 c16cc142 c039a388 c18446c4 3fc8aa80 -> 3fc8aa80", + "41852284 40fffed4 bf059da0 c0934bba 4185b254 -> c0934bba", + "410c4818 c027ef70 416391f0 c01e1388 c18e90fe -> c16cfe68", + "3fc63130 be1d0500 41651df0 c18deacb c17bbf88 -> c18db341", + "c091dbd8 c1962623 c162025f 409ed7ec c181d834 -> c181d834", + "c10506e8 bfb0d420 419e3c22 4192bcf6 bf81d6f0 -> 4192bcf6", + "bff4fe40 bf832290 c16ac63c 3f2fb8c0 4191ed40 -> 3f3af9df", + "3f967180 40a094f0 c190551c 4183c2a2 40f7a190 -> 41814820", + "c1814b9d 40a4b7d8 c122cda9 41947f9e c13da1e0 -> c13da1e0", + "c1479e9d c183122d 404bad30 c10cf4a2 c195ae58 -> c116187c", + "419aa8e8 c18278fc 3fd21810 c0796fe8 c0c5d900 -> c0c5d900", + "41249b9e 419aa08e 41422b28 419d9170 c121e3c8 -> c121e3c8", + "bffd03a0 41038728 3f9161d0 41834a80 bfafdc80 -> bfafdc80", + "c1235397 c0fe6b3c c0ced33a bf35f640 3f807ea0 -> bf35f640", + "41843dd6 c0072770 418ecc56 c0af4cb8 c19c9427 -> c19c48ce", + "4124b62a 41368164 c14b019c c04bc8a8 4181f71a -> c04aa4de", + "c13ee28f 4176fa30 41096ce6 41886b4c beb19600 -> beb19600", + "c0b35b9e 418aac54 411395c0 c15217f6 c140c11e -> c140c11e", + "3fec68a0 414e1f50 c18de68b 40d2d218 c1248ec7 -> 40160194", + "c08c3cc4 c17fd04f c0d2c556 bd829a00 4192d8dc -> 4192d8dc", + "41779700 41214544 c180daa8 4122fb88 c173d85c -> 4122fb88", + "3fb8dd60 c1628aa6 c14e16a1 c08a675c 40617558 -> 40617558", + "41970d1e 414042bc c095c55e c18465ab c191809c -> c18465ab", + "40259570 419d0d20 4082ab40 c04f7940 c17c4dc0 -> c17c4dc0", + "c0f15886 4034d290 c15551a7 c10a9e46 41994160 -> 4143fc70", + "c182d1d2 c08bf98c c10bd05e c1731796 4099ec28 -> 4099ec28", + "40c90cec c0006fc8 40ec0730 bfc51f00 c199d466 -> c197f70e", + "c0009f40 4138af80 419338ae 4144aef4 4191abd2 -> 4144aef4", + "c1372329 41236f4c c0ce6d28 40562ad0 c12edb5a -> c12edb5a", + "411d4a58 c01bf800 41967f20 4098d488 40e417b8 -> 40c93367", + "c0807144 bd92f800 41853dd4 c0896ee6 40bcbbf0 -> c0896ee6", + "c0eb3b44 405a5ba8 4148e8f4 413078ca c1971a5c -> 413078ca", + "c162e78e 416945b8 c18d7f86 412dd640 4189eb70 -> 41895e17", + "3f636300 c175c0dc 4186e09a c18a9145 40749a68 -> c0d28b24", + "4130b5da c1962b8d 413ca6ac bfb9afa0 417ad568 -> 417acb8a", + "400f91c8 c12b94c8 40548e90 c18de176 c12ac79a -> c12b3bc3", + "40c2b4b8 c04bec18 40cf8ac0 c0148dc8 c132d14a -> c132b903", + "c15a539a 3fab4340 c10544f6 4148fe28 4101f4d6 -> 4101f4d6", + "41694144 4197e346 c14a076e 4132e3ac 41463f34 -> 41334f75", + "c0c0d1c0 40fcdcac 402bccb0 40c367a8 4102ee78 -> 4102ee78", + "40a6166c 3f340cc0 41811066 c1985e2a 4180ab00 -> c15bcb85", + "c0a7c312 41023366 bff27330 3ce64800 c182c33c -> c182c33c", + "c185046d c19f465d 4124abe0 3fda0320 c09f1e28 -> 3fd0c12e", + "41101378 c13e7fa7 409448cc 40029e20 412e2a7a -> 412e2a7a", + "419c66e4 414f8418 c17b3cf5 c0ae2ec0 4113e554 -> c0ae2ec0", + "4140ef50 415db054 c19b1e82 40c515b0 3fd9f250 -> 40c4e09f", + "41657618 40d2f014 4189b7e8 c0bd62c8 40845a60 -> 40376f2c", + "c169e670 3f2e4320 40b10364 3fcc3450 41611040 -> 3fcc3450", + "bfe43800 c1862499 413a47e6 410e849e 4097fb60 -> 40d3ad13", + "4167ce00 c134e555 40b5705c c07634f8 c184ea23 -> c184ea23", + "c161e939 c185db08 c19ada2e 4173895c 410a20b2 -> 4173895c", + "4143871c c06608f8 3fc9c150 c104a1aa c17f994c -> c17f994c", + "3f66e220 40f0e0d4 413f26c2 41929a6c c12afc93 -> 41929a6c", + "c04e0390 c188fe46 c0728ae8 418c8998 c125a8a4 -> c125a8a4", + "c13ad0b9 4023fa98 c187b112 40ff2e90 c0ea9d10 -> c0ac9f0c", + "41828b7c c19561e7 c093832a 411ceaf0 416c1758 -> 416c1758", + "40575288 c13d07d9 408ea078 40317c80 c085b0fc -> c0851571", + "41312c2c 40be58d0 c1900cc6 40ae5bd0 413ea614 -> 40ae5bd0", + "410f9bcc 4198d604 c0c5b946 c01b80a0 c0dabbc6 -> c0754f77", + "412b0898 c10b6ff2 4155130c becfd9c0 c140816a -> c13de34c", + "4139ca8a 4147bd68 4101a4fc c157e498 4170fc74 -> c13dc811", + "40546080 c19e29f6 c0ea9748 40235f90 414509bc -> 414509bc", + "412e4aea c197e054 413c4d3c c042e3f8 3f292100 -> 3f28eb3c", + "c0e91408 c1876fe9 c12d385e 40203560 bfe145f0 -> bfe145f0", + "412d52b4 c198f180 412c2f5e c16592e1 3f2bb900 -> 3f2bb900", + "c12c7cc0 c13424b6 40aefc08 c0a615a8 3ffd4700 -> c0a6087e", + "40a10dd4 c13fd6db 417cbd38 3feb62d0 c186d99b -> c1353540", + "412e1740 3da99600 c0032cb0 40f6c550 41480f60 -> 40f6c550", + "412d8018 c0d70fec bf0f1700 41522430 c197d26b -> c197d26c", + "40feb8ec c14aa134 4186ee2e 418746e4 c19c69f0 -> c15874f6", + "40f3d0d0 c18f1bca c112fa4a c1952b07 c0375078 -> c0375078", + "412bad8a c19238fc 401cdf68 40babfb0 40baf26c -> 40baf26c", + "c0ad8654 c0a7a3e0 418edf98 c19b687e c14b7d2e -> c19b687e", + "40388710 c16c7de0 c1211f1e c0c60b92 411c7ad2 -> 411c7ad2", + "414a22d0 40a3d6b8 3fbb27d0 411ffdf6 40ecae54 -> 411ffdf6", + "c01c9558 3fb87380 418d0598 c175ee0b 414b5f18 -> c175ee0b", + "c190edc6 c1020110 4108f03c c0b46dea 4165c078 -> c0b46dea", + "403af9f8 418991b8 41671348 c174bf88 c0f2c180 -> c0f2c180", + "41128936 418d0da8 4141d4f8 c1910b45 c004b5d0 -> c004b5d0", + "c07ab7e0 c0928e48 bf9103a0 40bb42bc bfee34d0 -> 40ae67fc", + "402f6958 418b3ef6 40438890 c14ded08 c142f6b0 -> c142f6b0", + "c18c0179 3f263740 3f507c00 c0c15a70 419ca89c -> c0c15a70", + "c12b60e6 c17e7d26 c00b6868 415200c0 407d5300 -> 4128d030", + "c18a610c 40c67ba8 405fd890 c15c9174 408b88a8 -> 408b88a8", + "40b5fcac c1139126 c16c5f96 c194d284 c19b0733 -> c194d284", + "41700780 41501660 bed08fc0 c0fda92c c10afadf -> c0fda92c", + "c18eef19 c18b688f c1039630 40cfb120 c1207b3d -> 40cfb120", + "c1785976 410d1ccc 3fb6ea30 c1574045 413dc36a -> 413dc36b", + "c18dd27b c0679148 3ef80fc0 c16e10bf c186ffed -> c16e10bf", + "40a20cb8 be42a580 4197ea1c c005ad30 c098d6ba -> c01c1979", + "411e1436 413ec2b8 c0eb1dfe c194117b 41473b10 -> c1919147", + "c1009484 4142dd80 3fd43960 c157dea3 c0e5fc5e -> c0e5fc5e", + "c1281953 c1978c08 c13423a9 c18ad92c 418b97b6 -> 418b97b6", + "c1548fc8 4145190c 41354d58 4049eff8 bf051ca0 -> bf051ca0", + "c0c3bdc8 c1739f71 c0432660 c0b4a9bc 4005a528 -> 3fa2ccac", + "c12b1d58 4124ae5c c19f276c 41922d6a c08e2984 -> bf181480", + "c099dbd2 41604228 c1928c99 4186cb64 3fb78760 -> 40d9e3a0", + "c11ca0ea 411ebde2 c11b7338 41609d80 41900ca2 -> 41900ca2", + "c0f66dee c14d6a5f c0a28832 415bbdec 401772f0 -> 409a8a60", + "c1964673 c145c0a8 c00a34a8 c1454028 418347f6 -> c1454028", + "414bed54 4107a810 c0854f88 41937340 c195463c -> 41937340", + "40a36750 c0a0e760 419262f0 bf18c400 404961a0 -> 3f51f89c", + "3fd5e900 41412c58 4058b168 412f3620 418cf7dc -> 418cf7dc", + "c090b6f4 419b0092 c101ba70 3f9ae5e0 40e7a0a8 -> 40e42361", + "c04d36a8 40023108 418a57ec 40a4c56c c14d1ad4 -> 40a4c56c", + "c1547484 411da4a6 404de1f8 413fce64 3f5f6300 -> 3f5f6300", + "c192ae58 c0f188f6 4146f150 c1911a8e 4033f7b0 -> c1911a8e", + "40d6d408 bfe8b0b0 c185ffd9 41782340 41829ea2 -> 41782340", + "4173d2c8 4139f802 412e1908 c111bae9 c06a8f68 -> c111bae9", + "3e672c80 4071a518 407e1728 4180e718 c151c7c9 -> 4180e718", + "c1914705 417bf9c8 41850b0c 3eddf080 bec44d00 -> 3eddf080", + "c1149ef0 4132f83c 412af584 41340154 4169e80c -> 4169e80c", + "41740f00 413c13d0 c15b0884 41943ec8 3fbda8c0 -> 41943ec8", + "c12c7e65 419d1d84 3fc30bc0 c13dc7ce c1117a4a -> c1117a4a", + "418a5d4e 4181006c c06776c0 409c3eec 413ffd8c -> 409c3eec", + "40a574a8 4132733c 40ccd580 c132f96e 40de90f4 -> 40de90f4", + "403c88d8 c161e122 40e354a0 40a32c5c bf77bc60 -> bf228b50", + "c1615678 c085b528 c0fffc68 400fb530 c0fcc648 -> c0fcc648", + "417871c8 40efe8cc c1000105 c198e266 c19768dd -> c198e266", + "c1842085 40aa0110 41459b78 41169000 c14e2575 -> 41169000", + "3f161ac0 c18dfc18 c08564d2 40a690f4 c1268264 -> c1268264", + "c1648ee0 bf228880 c104095e 4106f1f8 41672344 -> 41672344", + "bee24540 c1737286 3fef77a0 c17b4728 c1053a28 -> c10797b4", + "4115f022 c175967e 3f9b0a80 bf006a80 c08de8e4 -> c08de8e4", + "41565c30 40f47274 419a3a16 41804dac c093d82a -> 40bd3276", + "c12339ca 408403b8 c09031ca 4073c4c0 41083e98 -> 41083e98", + "419edce6 41966be2 4187ed60 c19269fd c15a192f -> c19269fd", + "3f31a680 4120d148 c190cf16 c08fcedc c0d5d9cc -> c09e68c7", + "40d1a420 c17ed136 40643f60 40f9940c 4148af04 -> 4148af04", + "412be450 c165fa8d c144b9dd 4113755e c104c1db -> c104c1da", + "4196aaba c17e60c8 c0e4bbc0 c0c4f71e c0c90348 -> c0c90348", + "414f2870 c188362f be536f80 c122cb70 419e5bb2 -> 419e5bb2", + "3fcb7a20 c18107d1 40fe0ae0 419f59b0 41696978 -> 41738725", + "3f416120 c1434d45 3e30bb00 418f6904 412fab72 -> 412fab72", + "419a8f6e c189fc29 c164b744 c15d19c2 4110397e -> 4110397e", + "41152d64 c17ed69c c10855da c18409d8 40945f38 -> 40945f38", + "c17d3f3d c0651120 40c8e37c c0fc99e8 411ae924 -> c0fc99e8", + "417c1a94 40be6b44 40495940 40ff5b54 c0d2833e -> 40ff5b54", + "c011e4f0 c11be0fb 41412d44 c0893daa 413ba3d4 -> bf379338", + "402b86c8 c0775aa0 406971d8 41536090 c103670e -> c0fad884", + "403cc650 40ae850c c1238be4 4191e4f6 c0f3c16a -> 418b5a87", + "4180a6e4 41932b3e c155441e 409a95e4 408ca1f0 -> 409a897e" + ] + }, + { + "glsl": "float cultmath_cycles_clamp_minmax(float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "410dff0c 4137e97c c06ce838 -> c06ce838", + "40a609e8 4179f6a4 c16d4c73 -> c16d4c73", + "c01a0580 c0855b36 c11c35c3 -> c11c35c3", + "4196a770 416ce070 4094b8d8 -> 4094b8d8", + "41431544 4090274c c0d7b6a4 -> c0d7b6a4", + "4110ffd6 c1152598 411fe790 -> 4110ffd6", + "c0b17b2c c15aa832 c0d9f7e4 -> c0d9f7e4", + "3ed99dc0 bfddb350 413b535c -> 3ed99dc0", + "c19280fd bfa40e20 c155b864 -> c155b864", + "4100a7d2 419dc9e0 41599b5c -> 41599b5c", + "418ae20e bf386400 419285ae -> 418ae20e", + "c18351a6 40917ea8 40c73a90 -> 40917ea8", + "415f5914 c151d7af 3db54400 -> 3db54400", + "40d1e090 c16e9cef c19d9487 -> c19d9487", + "c0d2db8c 416611b0 c0411df8 -> c0411df8", + "41926a96 41542d44 40a8c0ec -> 40a8c0ec", + "409f4a78 40547dd0 40ace6bc -> 409f4a78", + "c1399115 41437978 bfc066e0 -> bfc066e0", + "c10cb316 c138cde1 c0d8c032 -> c10cb316", + "4092e528 40601bb8 c0461e60 -> c0461e60", + "419435f8 4118d6ce c0790570 -> c0790570", + "c0574478 c1943a9d c08f32a2 -> c08f32a2", + "40caa220 4109b88e 419faa28 -> 4109b88e", + "40e10ed0 4171a6c0 c181a6f4 -> c181a6f4", + "c12182f7 40fca444 c19605a1 -> c19605a1", + "c0e3a5c8 c14fc54c 4078df98 -> c0e3a5c8", + "c0a8ca48 c184eb92 40aea1f0 -> c0a8ca48", + "3faf3930 c1877eb6 c0662ed0 -> c0662ed0", + "c13cd803 410f5530 40e20090 -> 40e20090", + "be39f180 41460fc8 c079cb28 -> c079cb28", + "c0e00542 c12a1980 40588590 -> c0e00542", + "c18686f0 41008458 c08ee77a -> c08ee77a", + "408630a0 418631ac 414e86e8 -> 414e86e8", + "c1945717 c1007be5 c1758b4a -> c1758b4a", + "40aa1848 418f8eec 410378b4 -> 410378b4", + "3fce0a40 4193f8f2 c17ad8aa -> c17ad8aa", + "c0300670 41928fe8 c194844a -> c194844a", + "41156802 c1222847 3def0800 -> 3def0800", + "4137276e c035ecd8 40cfa874 -> 40cfa874", + "419da52c c138f91b c0ef94d0 -> c0ef94d0", + "41076668 c157c72c 4181d462 -> 41076668", + "40771c78 c0beebf0 40b78088 -> 40771c78", + "3ed21680 c1547518 419ee6e6 -> 3ed21680", + "40b6d0f4 410b14ce c11c28a4 -> c11c28a4", + "412fb0fe c0d76dee 4136a4c2 -> 412fb0fe", + "3f4dc420 41806d82 c16e1b42 -> c16e1b42", + "4102fb9a 40d2cd68 4127634c -> 4102fb9a", + "402f63d0 c18b7316 4160effc -> 402f63d0", + "c0aad46c 406a5570 419c0764 -> 406a5570", + "c185de56 c104354f c1120072 -> c1120072", + "4110b80a 408f9bec 41055c74 -> 41055c74", + "3eca2a00 c0e02928 c168b4ba -> c168b4ba", + "c139340f c1945d7d 407a4f38 -> c139340f", + "c18c23c8 c19667b6 413c66fa -> c18c23c8", + "c178a676 413895ea c125f4ff -> c125f4ff", + "41332010 4192db82 4184c758 -> 4184c758", + "410b3950 c115b4d3 3f8d4e40 -> 3f8d4e40", + "3faf7bd0 c107b142 3fed0180 -> 3faf7bd0", + "40034930 c164728c c1807080 -> c1807080", + "c18ea39c c12ccead 4125f4ac -> c12ccead", + "40c762f8 c036ca80 416fc038 -> 40c762f8", + "410fce3c 4185583a c17cb929 -> c17cb929", + "3ff3d740 c116a054 c19dd132 -> c19dd132", + "40beb2f8 c0f3df5e 416995fc -> 40beb2f8", + "3f9a8780 40b68654 40ac6c40 -> 40ac6c40", + "41957e2a bfdc04c0 c10f7c16 -> c10f7c16", + "408dc9f8 405dd6e8 40a9bcb0 -> 408dc9f8", + "c188bff4 c0adebf4 c197403e -> c197403e", + "411c55c8 c1453773 c0e10190 -> c0e10190", + "c15843bc 4192bf82 c14ba207 -> c14ba207", + "c193e9dd c15becd8 414413b4 -> c15becd8", + "41589f24 c06fe428 4081c66c -> 4081c66c", + "41865362 c090e968 416de578 -> 416de578", + "c1693bd6 c12b5ad9 40f8aeb0 -> c12b5ad9", + "4182988a c18a1017 41921d6e -> 4182988a", + "40d02794 c19eb0bb 40ba1728 -> 40ba1728", + "4183b506 405757e0 40ee1c14 -> 40ee1c14", + "414e9b14 c010b0c8 40b77730 -> 40b77730", + "c16ee9ae 4054c590 c18b5e53 -> c18b5e53", + "415e40b0 4199bc3c 410fe7e4 -> 410fe7e4", + "4133c7a0 c09282b6 c0f83eb4 -> c0f83eb4", + "414fffa4 408e5a6c c15e02d8 -> c15e02d8", + "c18d3edc 40f5639c c128c3cc -> c128c3cc", + "c195568a c190d539 c18985f2 -> c190d539", + "c0758630 bf7df300 c0ba5eda -> c0ba5eda", + "418c4380 c156b0fd c102d5cc -> c102d5cc", + "c1895dac c185df02 c147d5fd -> c185df02", + "40e4e748 c11fadcb c0a0ade6 -> c0a0ade6", + "be2c0400 c1366ecf 41083f5c -> be2c0400", + "c157a7e4 410788d0 414ed590 -> 410788d0", + "3fbcfee0 c188ccf6 c06fb4a8 -> c06fb4a8", + "c162026e c0ba06ec 415de680 -> c0ba06ec", + "c08f129c c1856748 bfda6b20 -> c08f129c", + "41423db4 40852308 c0f02688 -> c0f02688", + "c068c280 41721724 3fbc0350 -> 3fbc0350", + "409433dc c0500d78 4195d97e -> 409433dc", + "c10714fb c14770ae c0507678 -> c10714fb", + "412c1926 4130fc0a 417f3678 -> 4130fc0a", + "3fbdef10 c17eac04 c1699390 -> c1699390", + "418a1bcc c0daa098 c084c7f6 -> c084c7f6", + "c01908d0 417d2a2c 41999480 -> 417d2a2c", + "c05e6578 be133c00 4197f7be -> be133c00", + "40d1c288 c11b5f1e c172dbb9 -> c172dbb9", + "3e9d4200 40004140 c185f137 -> c185f137", + "41587798 c114f90c bf64f860 -> bf64f860", + "41703d48 c1135bbc c0a389dc -> c0a389dc", + "415828a0 41733600 413d9490 -> 413d9490", + "411c8c5e 416f6d18 3f6f9800 -> 3f6f9800", + "c0743340 412b86b4 c10295f6 -> c10295f6", + "3e9b8bc0 408c7f5c c11e5772 -> c11e5772", + "41077a12 bfde0740 412281bc -> 41077a12", + "c18c74b4 c0af0032 41056756 -> c0af0032", + "c0d67886 419eb45e c09737d8 -> c09737d8", + "401e43c8 41909c54 c158a43f -> c158a43f", + "415e8eb4 413400f2 40b0fe04 -> 40b0fe04", + "c0d07660 4189d0c8 3ebea2c0 -> 3ebea2c0", + "c049e800 40cf0138 4154afb8 -> 40cf0138", + "4128315c c181f884 c0021930 -> c0021930", + "40800ef0 40fa62e0 c1992174 -> c1992174", + "bfde8400 c19d4646 41122c5a -> bfde8400", + "40e50ae0 c15bfb18 40bcc268 -> 40bcc268", + "416b7bb8 413d7000 c1821765 -> c1821765", + "c0dcc858 41316100 41814388 -> 41316100", + "412c4926 3fdbcc40 c110c479 -> c110c479", + "419ceb7e c10f684f 4188feac -> 4188feac", + "40ac719c 417dfda8 c18249ef -> c18249ef", + "41767a7c c18a68d0 4157e528 -> 4157e528", + "413774f4 c18454d1 418f5f8a -> 413774f4", + "c04c1ca8 418fa45a c0af9fc0 -> c0af9fc0", + "c0f9efec bfc78700 40d69cf0 -> bfc78700", + "40ef5480 41709440 419bfaa4 -> 41709440", + "40c46f70 41750b80 413d33c0 -> 413d33c0", + "3f0fa8e0 4199897e 419b487a -> 4199897e", + "3fe56e70 c19ceb82 c15dbf70 -> c15dbf70", + "4086dc10 40c279b4 c173f8ee -> c173f8ee", + "4015d0c8 412e5a60 414b7748 -> 412e5a60", + "3f57c5a0 4194e754 413f33c6 -> 413f33c6", + "4189287a 4036d410 418d228a -> 4189287a", + "417a4738 417b107c c189a8bb -> c189a8bb", + "40ff4440 c005f478 415e274c -> 40ff4440", + "4113a116 c198b61a c0eb5c42 -> c0eb5c42", + "c128c76b c185b08d 40d5ca98 -> c128c76b", + "c108b9c2 c0d0c178 c088e79e -> c0d0c178", + "c16b3666 c172c1c0 41857556 -> c16b3666", + "c17b24d0 c0cc66a4 c18d7d4e -> c18d7d4e", + "40eb4928 c14bf914 c02799f8 -> c02799f8", + "4152b800 416784a4 c14f11ac -> c14f11ac", + "3fe5c6c0 41358bb0 be2fe200 -> be2fe200", + "416c1ab0 4125594a c0fa418c -> c0fa418c", + "c19127e6 4127f084 419cfd82 -> 4127f084", + "41108534 41495870 3fa480d0 -> 3fa480d0", + "c1679658 41490cb8 419bca98 -> 41490cb8", + "4157eeb0 c0a7951a 403277d0 -> 403277d0", + "bff6f1c0 c111d20b c0251390 -> c0251390", + "c04053a8 c08e9a7e 415c9068 -> c04053a8", + "41744918 414d75c8 c12c17aa -> c12c17aa", + "41753fb0 c13b5d60 41070992 -> 41070992", + "40ad2a10 416cea20 405bf8f8 -> 405bf8f8", + "40da71f0 c14917c2 c126f7e5 -> c126f7e5", + "414d1168 c0a9c43c c0e174ca -> c0e174ca", + "c0aff3de c12669f6 403ebb00 -> c0aff3de", + "c079bb48 c06eee70 c0f83460 -> c0f83460", + "c0934ad8 419638c4 3f85ffc0 -> 3f85ffc0", + "c18947e6 415db5e8 4147d178 -> 4147d178", + "41697b8c c09cd38c 40655ab8 -> 40655ab8", + "411a333a c173323f c0864e20 -> c0864e20", + "40c16020 419be8ce 418bf1c4 -> 418bf1c4", + "c188848e c1578f7e 400d3790 -> c1578f7e", + "c10d0e8e c18307e9 418e3728 -> c10d0e8e", + "418ec8ee bfa67a80 40a448f4 -> 40a448f4", + "411e8d14 c19a915c c19f7438 -> c19f7438", + "c122a7a7 c1837225 c195b40a -> c195b40a", + "41670c5c c198d30c 419a372e -> 41670c5c", + "3fc554d0 be045f00 4161043c -> 3fc554d0", + "4103285e 4147cf80 c0b2268c -> c0b2268c", + "417f3818 412d1978 be958380 -> be958380", + "419ed3c8 418982e0 c18af2c2 -> c18af2c2", + "415c2f2c c1539ea6 c0996772 -> c0996772", + "c0913bd4 c106f0d3 c1876d3c -> c1876d3c", + "c199cf92 c1716044 c0eb5794 -> c1716044", + "c0b11100 c01cdd28 3da06c00 -> c01cdd28", + "417e9b80 c0e239c4 4152d89c -> 4152d89c", + "4146b9e8 4098466c c107857b -> c107857b", + "4012fb10 417326dc c180c614 -> c180c614", + "c05e55b0 c177fa8a bec39d00 -> c05e55b0", + "c184905c c0a862f6 c0bebdf8 -> c0bebdf8", + "c1439ed5 c0988d4a c0e65294 -> c0e65294", + "bff72ca0 418ff526 3fc15790 -> 3fc15790", + "402027f8 41812ef4 415e7bec -> 415e7bec", + "409b9698 4165f640 41400c88 -> 41400c88", + "4191b932 415aab80 417fba2c -> 417fba2c", + "40d4344c c14ecce7 c18d6d19 -> c18d6d19", + "c0c07936 41448ce4 bee27400 -> bee27400", + "3fa0a0e0 c183c0e9 c15f09bc -> c15f09bc", + "c13d26a0 c01c5cd8 c1901090 -> c1901090", + "4195d352 c030eda0 c18dd20e -> c18dd20e", + "41796930 c0fefa62 4186a054 -> 41796930", + "41108484 414fffb0 411ae662 -> 411ae662", + "419ebec0 41832e88 bee432c0 -> bee432c0", + "41948af2 c0d2dd00 c04deb30 -> c04deb30", + "419a2e58 c1471162 41262cf2 -> 41262cf2", + "bef24080 408298c0 c193c251 -> c193c251", + "c1414654 411e506e 418b692e -> 411e506e", + "c02d0ad8 41171be4 401d0690 -> 401d0690", + "4167b4a4 40d09a1c c104c4d4 -> c104c4d4", + "c1541f8e c121bef3 3ee03080 -> c121bef3", + "bef67e00 40718d60 bf8b3570 -> bf8b3570", + "413a200a 4114621a 4015cdd0 -> 4015cdd0", + "4172cbe0 c12d1220 c19aaa18 -> c19aaa18", + "c15b2c36 40d9394c c11529fa -> c11529fa", + "40311d90 c092a504 bf9024f0 -> bf9024f0", + "c189cc69 3ffdbb60 417f8f90 -> 3ffdbb60", + "c08a6d62 410a6b64 41579c68 -> 410a6b64", + "c19c4e3f 412cecfa 40eae854 -> 40eae854", + "c1727679 bfdaa0d0 40259bb0 -> bfdaa0d0", + "c0b401f6 4168cfe0 c1584d5e -> c1584d5e", + "c0015328 41519d10 40d0380c -> 40d0380c", + "4198ee74 bf7362a0 411a2e28 -> 411a2e28", + "418ef5f0 c145c359 bfdb9be0 -> bfdb9be0", + "c13f4680 408b4438 c0a342fe -> c0a342fe", + "c1991838 c1930d0f c187261c -> c1930d0f", + "40d7f8ac 416875e8 c0bf2338 -> c0bf2338", + "c1835cdf 413b4d76 c1776a5e -> c1776a5e", + "c088a8c8 41311724 3f9ead50 -> 3f9ead50", + "40deca38 bf717700 414f765c -> 40deca38", + "41392528 40d92d04 c11049ca -> c11049ca", + "419e0644 3f4ccdc0 c0abc400 -> c0abc400", + "4162f92c 41052894 415aff98 -> 415aff98", + "40857400 4069a9f8 4182f1d4 -> 40857400", + "4113cd38 c17184b3 c0b50a74 -> c0b50a74", + "c013f3d0 c145f031 c17b36b9 -> c17b36b9", + "bfb610d0 419cc9fa 41130718 -> 41130718", + "408780c4 bff39680 4070d7f8 -> 4070d7f8", + "c1370777 c113473d c1893eca -> c1893eca", + "c1907180 c18e0032 c18fbd0a -> c18fbd0a", + "c16bb9a5 c0fb106c 419ff0a2 -> c0fb106c", + "41855be6 c15b3948 3f5a6240 -> 3f5a6240", + "c14b29b2 c13b5306 c1839560 -> c1839560", + "c19ddfbf c155299e c0d68562 -> c155299e", + "c1294bd0 c18b5ed5 c111f498 -> c1294bd0", + "c015d518 c0b50dec 40d9a450 -> c015d518", + "41231adc 41905446 405c1d50 -> 405c1d50", + "c043ce70 c139d8cc bf0ab620 -> c043ce70", + "c181c85d c14a9b3a c134f6ae -> c14a9b3a", + "40e7006c 413313fe c11febe7 -> c11febe7", + "c103646c 4143dc30 40c251ec -> 40c251ec", + "413a79ac bf8c62d0 c1080d4c -> c1080d4c", + "41830132 4149156c 4194da4a -> 41830132", + "4157d4a0 c119d341 419ab16a -> 4157d4a0", + "c19a05fd bfd814d0 414ebd90 -> bfd814d0", + "c0836c6c c0a5e79a c08f6a4a -> c08f6a4a", + "c0e3aad0 412e6dcc 41839fdc -> 412e6dcc", + "c07d3ef8 c103fdde c17ca8f2 -> c17ca8f2", + "bfb40b40 410539f8 c181d7b5 -> c181d7b5", + "3f08ca80 414e4888 4197b0fa -> 414e4888", + "c0fac65c 3dab0c00 c0399c10 -> c0399c10" + ] + }, + { + "glsl": "float cultmath_cycles_clamp_range(float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "4158c128 4107a4ee c0b20b9a -> 4107a4ee", + "40e728b0 c00f15f0 406b3ab8 -> 406b3ab8", + "419b0c5a 3fa442b0 3fe31ce0 -> 3fe31ce0", + "41031d94 4185a31e 40f4f7a0 -> 41031d94", + "408348fc c0739e88 412129ce -> 408348fc", + "40d12e20 40fc4af8 41485894 -> 40fc4af8", + "4152be74 c0b554c4 c19dace8 -> c0b554c4", + "c0ce5740 417beb50 3efb4180 -> 3efb4180", + "3fee8f40 c0de09d6 412939ae -> 3fee8f40", + "c1445de2 c0851486 419d6672 -> c0851486", + "419d2950 3fa9be70 4124d6a8 -> 4124d6a8", + "400f2770 c14ccd23 411d5878 -> 400f2770", + "bfc1e520 410ab572 418868d8 -> 410ab572", + "413d7c2c c0cfdc38 c1261a89 -> c0cfdc38", + "c0aa47c8 40fb255c c09e8834 -> c09e8834", + "c05c9300 4167da18 c0fbbccc -> c05c9300", + "c0c9b272 415ff598 c16fdcf6 -> c0c9b272", + "c158f69e bf810d20 c163ff87 -> c158f69e", + "c04c34d8 bb99b000 414bb99c -> bb99b000", + "415f2028 c16a3d90 c174c090 -> c16a3d90", + "41519500 413a7694 c168ed66 -> 413a7694", + "40065ad8 4108caf4 c093e326 -> 40065ad8", + "418ad294 c19112ae c1301a80 -> c1301a80", + "c19e1754 c13f2c4f 4199b806 -> c13f2c4f", + "417786e4 c1955edb c1995e23 -> c1955edb", + "412ac0ba 4196fc20 c141a75c -> 412ac0ba", + "c168e1da c16b0957 bfb6f820 -> c168e1da", + "bfc73f60 41607b54 3fec0120 -> 3fec0120", + "416aa9dc 41534940 c18d5347 -> 41534940", + "4091ac5c c16928f1 40e68c28 -> 4091ac5c", + "4188cf6e 40914670 4053cc08 -> 40914670", + "41459240 4195f396 3fecda70 -> 41459240", + "c17d2d22 41494568 419a63dc -> 41494568", + "419d56bc bf4c9e60 4149ff74 -> 4149ff74", + "c186e1f3 c0d15520 40be43d0 -> c0d15520", + "c1634d00 c1107d82 c0158fb8 -> c1107d82", + "c1714341 40c46420 3f8fa430 -> 3f8fa430", + "409ac1f0 41080200 c19f9a1c -> 409ac1f0", + "40c43ce4 c0ab062c 418cfda0 -> 40c43ce4", + "406649d0 40edd9b4 417581b4 -> 40edd9b4", + "c0de960a c0e66210 418381ca -> c0de960a", + "3fe4fb60 c186e6c2 4060c1f0 -> 3fe4fb60", + "c08305f0 c18705ae c18b5272 -> c18705ae", + "bf82bca0 40cfdbb8 c15b4d24 -> bf82bca0", + "c1366f16 c1638f52 40c38120 -> c1366f16", + "40be4310 c096480a 3f125e40 -> 3f125e40", + "417e5e3c 410df6dc 400f1b08 -> 410df6dc", + "40957ac0 bebcd200 bf35b020 -> bebcd200", + "c15eae72 c0f78438 4180509a -> c0f78438", + "40509cf0 c15c8c33 4082d484 -> 40509cf0", + "40874020 3f140680 c16da774 -> 3f140680", + "c1805cfd 40d3f100 c15998de -> c15998de", + "41817dee 3face580 c11add0a -> 3face580", + "c18c874a 411e35f6 c1427226 -> c1427226", + "c09d7e16 40be28a8 419d221a -> 40be28a8", + "c0a57cac c070bfc8 402e4548 -> c070bfc8", + "c0c1e990 c19e818a 419ad078 -> c0c1e990", + "c03caa98 40f66874 41947b00 -> 40f66874", + "c0dc8a1e 4105f79c 4152b588 -> 4105f79c", + "c03685a0 c0896446 412df496 -> c03685a0", + "40ef1e8c 414a55d0 4187406c -> 414a55d0", + "bfc07930 416c085c c161528c -> bfc07930", + "c196d2d8 c175b51d bf587d00 -> c175b51d", + "be94d240 411c25aa 415f3f4c -> 411c25aa", + "c11bfd10 41576cd0 4197e072 -> 41576cd0", + "c0b38e30 c1268395 415b051c -> c0b38e30", + "beb3e6c0 41340fe4 418036ec -> 41340fe4", + "c0d5e03a c12ae3fe c15f891e -> c12ae3fe", + "409792a8 c14d354b 414e0c30 -> 409792a8", + "c1569d72 412d8b14 41920072 -> 412d8b14", + "c0d89cce bf762ba0 c165b12e -> c0d89cce", + "bf0d1a20 c0a13bb2 4189f014 -> bf0d1a20", + "c110f2fd 4184a80e 41330bf8 -> 41330bf8", + "415b96c0 c0ca314c c1067ad5 -> c0ca314c", + "c183736e 4163b1cc c11928bf -> c11928bf", + "c1699e5e c1532d96 4163c76c -> c1532d96", + "419c9a8e 4195c104 bf9c2680 -> 4195c104", + "419bd836 418bfee6 408e7bf0 -> 418bfee6", + "416d86c0 c0bb013c 4054e730 -> 4054e730", + "412e09f4 415c2784 40f27b50 -> 412e09f4", + "c0debd74 4168f7c0 c0c68066 -> c0c68066", + "3f6774a0 c158582d c114779d -> c114779d", + "4104f07c 412cd492 bfbfaac0 -> 4104f07c", + "c1920fa2 c1846a0e c0dfa762 -> c1846a0e", + "c18c036e 40bd9410 c01b5dd8 -> c01b5dd8", + "408dd154 c1240940 c09d2b94 -> c09d2b94", + "41799fa0 bf298500 c19d03db -> bf298500", + "41952262 c14fd28b 4142090c -> 4142090c", + "bf07a4c0 c0c7fda6 3fc4fbc0 -> bf07a4c0", + "3f9886d0 40934f3c c1998e9e -> 3f9886d0", + "c0c2b34a 3d818700 c1896bb5 -> c0c2b34a", + "c18318d8 3f2f57a0 bf610680 -> bf610680", + "418e62b0 402a8758 40f813f0 -> 40f813f0", + "419da770 c03a3b60 c080044e -> c03a3b60", + "c088867c 418eaa2e 41745624 -> 41745624", + "c163b121 4187dba4 c106cc39 -> c106cc39", + "c151ea92 c11961eb c179775e -> c151ea92", + "c13c3069 41746a54 c0b28056 -> c0b28056", + "40e68abc c0b346fe 40f19498 -> 40e68abc", + "3fd5b610 c1948735 414ba6a8 -> 3fd5b610", + "4112e8ec c14e205e c15cd30c -> c14e205e", + "c0136070 40fa74c0 4058a360 -> 4058a360", + "c11cfc46 4197156a c16c2b73 -> c11cfc46", + "41939c78 40d446a0 40e2a9d0 -> 40e2a9d0", + "40eac07c 417e50c4 c18e04bb -> 40eac07c", + "408bf4e4 403a2010 c12d26e8 -> 403a2010", + "4186d974 c0c99256 c04ed870 -> c04ed870", + "c120944f c0b6092c c0b9ecf0 -> c0b9ecf0", + "41832d10 c165293c 40993170 -> 40993170", + "410668c0 c065dc30 c15b6707 -> c065dc30", + "4139254c c077c598 3f9d8200 -> 3f9d8200", + "41706350 c1179a0f c1206e7b -> c1179a0f", + "c1232f1b 41904a6e c11fe605 -> c11fe605", + "c101d2b2 41794b24 4190c63a -> 41794b24", + "c15aa0c7 c1392383 4071eb18 -> c1392383", + "c02b3118 3f66f580 419b0cc8 -> 3f66f580", + "c0fa6d6a c1895a8b 4137d480 -> c0fa6d6a", + "bfd07660 409a07b8 40f77584 -> 409a07b8", + "c081467e bf482c40 414ce438 -> bf482c40", + "4140236c 3fa66e20 40098e70 -> 40098e70", + "4194c810 3fe4d7c0 401e8780 -> 401e8780", + "41979dca c151ec5a c117eb4c -> c117eb4c", + "c1625b58 4144fcec 40abd5a8 -> 40abd5a8", + "41446504 c0adace6 409be64c -> 409be64c", + "41995f8e 409f0b30 bff0a280 -> 409f0b30", + "bfaa1480 c182f9c4 c161e112 -> c161e112", + "41268ec2 bf6d9980 4098ced8 -> 4098ced8", + "40acfe50 c0718228 c0cd83ec -> c0718228", + "c0a6770a c0d997d2 41350ac0 -> c0a6770a", + "4157f580 bf6f96e0 4134e8b8 -> 4134e8b8", + "c0354ad0 c00d4a18 c050e398 -> c0354ad0", + "40fb6cc0 c0d6c5a2 c0c69fa8 -> c0c69fa8", + "c08c2ad8 c149dc5b c1939b95 -> c149dc5b", + "c0d733dc c10870ee 4109726a -> c0d733dc", + "c0bfa282 bdcddd00 4104215c -> bdcddd00", + "c1561ea8 bf4cde80 419ebf22 -> bf4cde80", + "c12630f0 418a4fa8 c08d1e7a -> c08d1e7a", + "40dd8a90 c19335ac c18e2c53 -> c18e2c53", + "418afe18 c0d9de10 c167047c -> c0d9de10", + "c1319c29 4084ee30 415adf8c -> 4084ee30", + "bf4f60c0 c0f4a1b0 c0d81348 -> c0d81348", + "4161021c c09c9090 41863e0a -> 4161021c", + "c13dd3f4 c10af742 c1051795 -> c10af742", + "c17ac47c c1879691 4181f46a -> c17ac47c", + "c17aa9e9 c0375d40 c14668a9 -> c14668a9", + "41817a80 c109af98 41829d98 -> 41817a80", + "40aa3958 c13d1cdd 41600200 -> 40aa3958", + "41378c7c 407899c0 3fe33a10 -> 407899c0", + "c0891018 4123e802 c0739cb8 -> c0739cb8", + "c0afc080 4127ba2c c19f39e4 -> c0afc080", + "c13c4b58 c1547944 404eb230 -> c13c4b58", + "c14216b8 41615c20 4198eff4 -> 41615c20", + "c09507e0 bd535c00 c1735371 -> c09507e0", + "4137a54a 4193daa6 c141d6a6 -> 4137a54a", + "410295d8 c16b6c74 4163cc70 -> 410295d8", + "bf278100 4025bcc8 408ed7f4 -> 4025bcc8", + "416a1004 c1967c68 c1919fb8 -> c1919fb8", + "c12c3fac 40651ca8 c080d812 -> c080d812", + "419d6ec8 40f6faf0 410788ba -> 410788ba", + "41378f1a bfd3aec0 409b9f68 -> 409b9f68", + "3f163440 415a0c4c 3f54e900 -> 3f54e900", + "c106a3cc 4180c36e 4182a610 -> 4180c36e", + "c0df8772 4183b668 40433248 -> 40433248", + "c1384892 3f578f20 413723c4 -> 3f578f20", + "41388ea2 415d7760 c124d229 -> 41388ea2", + "40c3b148 c18584ad bfb368e0 -> bfb368e0", + "40f135a0 4182f802 c1458730 -> 40f135a0", + "413bacd8 bdf82200 4114b2fe -> 4114b2fe", + "419265d4 4197fa2a 4048fe40 -> 419265d4", + "c14be76a c13cf445 c15a2158 -> c14be76a", + "c115a8d1 4077b3d8 c1932ec2 -> c115a8d1", + "bd919200 c111bdf8 c1725701 -> c111bdf8", + "40e1b594 c05b1970 c12cf351 -> c05b1970", + "418f4028 c15ab457 40c404c8 -> 40c404c8", + "c194b04c 40c4b128 3eb1c800 -> 3eb1c800", + "c11a6334 c0133930 411bcfc8 -> c0133930", + "c15b99e0 c0cdf62e 408d0da0 -> c0cdf62e", + "c1220a2a c18085db 3ffcd130 -> c1220a2a", + "c032a470 410db668 c0c806e0 -> c032a470", + "41389b92 c0d6dee8 4188c944 -> 41389b92", + "c0d9e6e2 c163dc4e 41046112 -> c0d9e6e2", + "c0544858 418eb020 4187c5fc -> 4187c5fc", + "411d814a c1064e3b 403cd568 -> 403cd568", + "c1727b28 41987eee 40d77a04 -> 40d77a04", + "c12979cc 411a1a80 4120a45c -> 411a1a80", + "3fc3b360 41250d70 415bb728 -> 41250d70", + "c130db41 40fe5db8 3fa61500 -> 3fa61500", + "41566fc8 c19826c5 416a06d0 -> 41566fc8", + "3ffabeb0 c199cf53 bd83aa00 -> bd83aa00", + "bebef540 c18a3d04 40022e70 -> bebef540", + "4131ac70 41783f38 c185ab74 -> 4131ac70", + "c0fd0bb0 4096e788 c19b6c04 -> c0fd0bb0", + "418ed0a8 409762fc 4104f854 -> 4104f854", + "40580910 3f01b820 c15e8012 -> 3f01b820", + "c1536593 c1948f5c c0aff1e8 -> c1536593", + "418d64e8 c19c482f c0b64c6c -> c0b64c6c", + "413ef5ca 417ae078 4194547c -> 417ae078", + "3c8ad400 4025db50 40aac360 -> 4025db50", + "c0866032 be58ce80 c1738ec4 -> c0866032", + "415a5a44 416b9614 41887f72 -> 416b9614", + "c03db2c8 c11c870e c131d432 -> c11c870e", + "c198ab21 c0c84f2e c183a0ad -> c183a0ad", + "405c4fa8 418a8606 c1715943 -> 405c4fa8", + "41177c64 406b5468 c166a40e -> 406b5468", + "c169412f 40b244f4 c148eca8 -> c148eca8", + "c0997a9c 40d3aab8 419c6898 -> 40d3aab8", + "3dffe200 40891c10 c19d8724 -> 3dffe200", + "c165e11e 40f62518 c14f5a82 -> c14f5a82", + "405f8a90 c10e98fb c0e26f3a -> c0e26f3a", + "c002e260 41825520 c1712904 -> c002e260", + "417cb6bc c17cb8f0 41201b6c -> 41201b6c", + "4133f970 c15a9108 c11b5d70 -> c11b5d70", + "4189aa10 c1620f50 40f611bc -> 40f611bc", + "c110b799 c0b89434 c186ce35 -> c110b799", + "c129ccf2 c18c434c c0ffe940 -> c129ccf2", + "414f4d08 c0acf2d0 41882a2c -> 414f4d08", + "c006c6a0 c19b3966 4152c768 -> c006c6a0", + "c16c5ff2 c0cf4b08 c118f7f5 -> c118f7f5", + "41860698 c1098b95 402199a0 -> 402199a0", + "c1913cd8 c024e3a0 c18ac74e -> c18ac74e", + "4129f644 c168337e c197cf1b -> c168337e", + "419fe7e0 415ac5a8 bf071f60 -> 415ac5a8", + "c08d7ef0 c0ba753e bf44c7e0 -> c08d7ef0", + "41893864 c00045b8 3f3e4ac0 -> 3f3e4ac0", + "c10237b0 c12d48a1 c11f27de -> c11f27de", + "41894710 4181f5ea 40a73248 -> 4181f5ea", + "41709a20 4128959e 4183f036 -> 41709a20", + "c08317ee c19f8378 417b1d10 -> c08317ee", + "c103f070 412916ae 412aec92 -> 412916ae", + "bedd9400 4167ec40 416efa90 -> 4167ec40", + "40f87850 4175cdd0 41072998 -> 41072998", + "40a12ef4 3eaa4480 c134169c -> 3eaa4480", + "c18eff1a c1299cb3 c1334c40 -> c1334c40", + "41487d54 c027ce08 c19c9f64 -> c027ce08", + "c00d7ca0 3f3dd900 40267a80 -> 3f3dd900", + "c0f23a82 4155d7bc c17a5ce2 -> c0f23a82", + "c19ce80b 419cbf86 c09aeed4 -> c09aeed4", + "418a66a2 c15313cf 40dc62f8 -> 40dc62f8", + "c15d6f09 c0a8fb8a c1692c8e -> c15d6f09", + "c16abb44 4103c032 c1872883 -> c16abb44", + "410ca178 41801694 bea4dc00 -> 410ca178", + "408971ec c129cb62 40288310 -> 40288310", + "4144bb14 40da61a8 410d653a -> 410d653a", + "c19588a1 41708c54 40db1110 -> 40db1110", + "c0646a68 c18bf19b c0daedc0 -> c0daedc0", + "41808f9c 4190e998 bf2e4800 -> 41808f9c", + "c0dd0326 419a9668 41899f78 -> 41899f78", + "40ca92ec bf51c8a0 416e6d34 -> 40ca92ec", + "be638200 41276ee8 4108e1a0 -> 4108e1a0", + "c19383f2 bf8fcbf0 c1663016 -> c1663016", + "c1857507 41865e88 3f9518d0 -> 3f9518d0", + "c164fb3a c1821211 3faefac0 -> c164fb3a", + "3f3e8180 4157e7e4 c10a570e -> 3f3e8180", + "419fbeee 3e09eb00 c1575919 -> 3e09eb00", + "c08f843a 4198a096 c1770d47 -> c08f843a", + "4105000e 3f5e7dc0 c17b3098 -> 3f5e7dc0" + ] + }, + { + "glsl": "float cultmath_cycles_mix_float(float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "3e3ee788 c11e8e3e c05943d8 -> c10b1f4e", + "3f4e2cc2 4143c650 410e9360 -> 4118ee06", + "be51ccaa c18c53ff c04ad940 -> c1a3e244", + "3f3d2322 c177b903 bf89d250 -> c09adba5", + "3f9a1942 412bc2f8 c140d5ad -> c1859650", + "3f294442 418fec66 4191e7a2 -> 41913bc8", + "be5d21d8 c1141f60 41962076 -> c174f2fa", + "3f8b771d c09591c4 c17614b4 -> c182b64f", + "bdd05610 c0dbfee4 bf4fad80 -> c0efbbfb", + "3f843cd0 c112f46e 3dd12500 -> 3ed1b2fb", + "3f8230fe 413771ea c12678f5 -> c12c768f", + "3f3674f8 40fa9f84 c1336b3e -> c0b7c0d8", + "3f734d80 c0328808 c177093f -> c16cff47", + "3f8e6cb2 419e4a5c c195be12 -> c1b87492", + "be8bdd5c 417f7c2c 410fa0e6 -> 418f0547", + "3f8f8e18 c161c146 411664b2 -> 41441ab6", + "3fb6fea2 4144a890 c1974bd0 -> c20145f8", + "be3c5b58 40286a88 c11df8c3 -> 409dd015", + "be649e72 3ff7f490 416c3aa4 -> bf6d38f8", + "3dcb4b28 bfedd4d0 bf63a400 -> bfe1857c", + "bc638e60 c0984ffc 413a4c6e -> c09f9a56", + "3fab0fc2 4166f170 c0de55d8 -> c1624291", + "bd09aaa8 c122d313 c188c665 -> c11f1a60", + "3fbaa23a 41637474 3f47ace0 -> c0abfd8d", + "3f9789ce c0d2549e c110b41b -> c117f96f", + "3fafe539 40e82844 bf2450e0 -> c0663046", + "3e90770a c08ee15c c14c3e2b -> c0d9d2b3", + "3f7d4d2a 41411b74 bfbce7f0 -> bfaaa13e", + "3ee6c314 4080ae0c c132a8b8 -> c034b9c9", + "3fbc9986 bfa3e230 c161aed0 -> c1a16a4f", + "3e4ded30 c03e8b80 41988c4c -> 3fba62de", + "3f45c0ce 40220610 40917970 -> 4082ceb3", + "bc940ea0 c14311be c193baa2 -> c1414143", + "3e97ac84 40469240 418088e6 -> 40de2e57", + "3f532798 419b7382 41909a0e -> 4192809a", + "3f03f140 c0eb6a1c c12cbb0f -> c11210fb", + "3fbab157 c13f2e92 416aea74 -> 41d72611", + "3e8a65e8 4182bcac c18b24f6 -> 40e7248f", + "3dc01910 bd891e00 404af238 -> 3e72724f", + "3e1fb7c8 c0124a20 c1196594 -> c05b2d12", + "be940386 c1224124 4131a934 -> c182429c", + "3facda69 40a476e4 c033a2b8 -> c0b2ec16", + "3f15e82a c13c587e 412e542c -> 3fc03748", + "3f520c24 40fb0b40 bf0da200 -> 3f744b52", + "3ec84d24 419dbf4a 4146eac0 -> 4186f1a2", + "3d6f33b0 c185a884 414a3470 -> c16fe5a2", + "3f05bf1c 4195a62e c109f3eb -> 408db718", + "3fbda0ef c19d9dc5 c1154db3 -> c08ad376", + "3d785650 4194ed38 3f2e3c80 -> 418c3a3b", + "3fa95a9b c0cda5d4 c18b3620 -> c1a793d5", + "bedccc8a 41842700 412180c8 -> 419a51a0", + "3f872ced c104b1f8 c0d83496 -> c0d572bc", + "be80f23e 4117cf78 c0b6a8dc -> 41550b7c", + "3f0b4a3e 4194c5ae c1795c90 -> bae58000", + "3ed4b46e c0e7a7a8 3e52f300 -> c084ad82", + "3e860750 418ca7be 4184fd62 -> 418aa60c", + "3c0f10c0 c19a560f c05704d0 -> c1993923", + "3f8369a6 414aba8c bf7dee20 -> bfad9740", + "3fb9d289 c176948b c127059a -> c1031518", + "3f059252 40b97690 40d0c208 -> 40c59e16", + "3fa9ae37 40a7ff60 416a7a6c -> 418dbd46", + "3f6a338a 40a11e04 413537a2 -> 412ca568", + "3f77b744 40d67fcc 4100308c -> 40ff0628", + "3eeb3b46 c15cb890 c0c640fc -> c124db30", + "3ed5a7ca 419c890a c19f1f80 -> 40467fd4", + "be1b7df0 3fa90c90 40f13090 -> 3ec0e3cc", + "3f82f5cd 417fa22c c197ba86 -> c19e3185", + "3f33ed9e 40c92e60 c0e44d96 -> c0495be4", + "3f4c43f6 c11287f4 c1813646 -> c16bcfd1", + "3d5e6240 414161f8 c14e1d6e -> 412bb15b", + "bea1bab6 4090e368 c18275e9 -> 4131bf2e", + "3f636ed8 408bd288 c0d4e8ae -> c0ad8c33", + "bc4498e0 41203058 40f73a54 -> 4120a0b2", + "3f71a9be 40bc3ef8 c111f06a -> c1047ea8", + "bd8e24fc 412fc648 41680c70 -> 412bde66", + "beb76788 c0fa017e 4151a874 -> c174e1e4", + "3ee3ccfa 414125b0 40512790 -> 410279d8", + "3f19e818 411f9066 411d191c -> 411e14de", + "3f4644da c0f16af8 4197b442 -> 414fc3c9", + "3f16e760 c18d4a44 c0b9d212 -> c12ac69f", + "3f5fb68a bfddd4b0 4169ddec -> 4148dfca", + "3f0b7194 c08fcc84 3fd6ade0 -> bf90f308", + "3bb7ba80 41293e50 c099ae5a -> 4127dd16", + "3f569112 41899fd0 4134f138 -> 414434a4", + "3fbecada c19356d7 c11e7d51 -> c0b75c20", + "3f80fe25 c091c268 4174d0e8 -> 417747b1", + "3ed6146a 4047d6a0 41953c66 -> 4119de61", + "3d188cd0 4142ff90 c19fe1dc -> 412fd39e", + "3f3146f2 3fd44990 4168e150 -> 41296d4e", + "3e4656a0 c18dc5c1 c1016140 -> c17daf4c", + "3e607080 40ff0f98 40f589c0 -> 40fcf945", + "3e34e0a0 c194c7ff c14625ed -> c18c0045", + "3ea04f76 40f6f880 c090a6ec -> 4078b3ce", + "3e10af14 414b93f8 3fce0780 -> 413273e4", + "3eca65d0 41422ac4 416de610 -> 4153745c", + "3f8c89de 400d9bf0 41063e14 -> 410fecb4", + "3ef8f0ae 41755ab4 418815dc -> 41813246", + "bea240a5 c18495c6 bf48a300 -> c1ac9d40", + "3e8dc9e0 c0511b50 40c28bb0 -> bf2dc9f8", + "3f9d73db 41885aa6 415d908c -> 4151cbed", + "3f5b29f2 4181e820 4104c9d2 -> 411710f0", + "beabefe1 c0f3dba4 c12c482a -> c0d20a1b", + "bea2ec3c 40c8e9d8 c19e8ed7 -> 416954f9", + "bec08bd2 c0c36c98 40f7451c -> c134f410", + "3efb6d62 c16769f4 412661ae -> c0104690", + "3eb4595e 414d6b60 c19f959a -> 3fa516f8", + "be7885b2 413e4004 419b911a -> 4120e973", + "be445c12 416264a8 c150e634 -> 419aee8f", + "3e7b09b4 c1147470 409166ac -> c0bc79b0", + "bd9e0608 418ff404 40956dac -> 41982d99", + "3f13a9c8 3fd48020 412ac6f2 -> 40db7e67", + "3f14e332 40b68490 4183e1dc -> 413f9635", + "3f952fa6 c0ac14e4 be79da80 -> 3f1b0e8b", + "3f4824fc 41052c50 417ef210 -> 41646066", + "3f691634 c03048c0 3fb88800 -> 3f88754b", + "bd12bde0 4075ccf0 418f1f34 -> 4055964a", + "3f70dce8 4193f328 40793730 -> 40983b83", + "3f4d273e 41174b6a c16d8ab8 -> c1204faa", + "3f9c2c23 3f751340 c18f4a33 -> c1b0835d", + "3f11599e 4106170a c192bcb0 -> c0d956df", + "3f3c0398 4172dd4c 41048ce6 -> 4121d8b5", + "3e8d125e 3f714620 4143b9b0 -> 4081b4c6", + "3fad24a4 41918430 be2b0f00 -> c0d4839c", + "3f990bfc 406f02e8 bfe45170 -> c037444e", + "3f03c9c4 befb0000 c1837626 -> c10b286d", + "bea6195d c002e220 c04624a8 -> bfda2072", + "3f466d70 c1661623 40dc30a8 -> 40065ce7", + "3f552a58 beb8a240 419c00dc -> 41816af2", + "beec24bb 41782330 4143449c -> 418842ca", + "3f46a7bc 40e75b50 c1740eec -> c12379e6", + "3f9c2340 c100b8e6 40c7bd08 -> 41161e97", + "3ecf4ff0 c1986b22 41524f04 -> c0c08088", + "bdf0abcc c0e99f70 41826cb8 -> c1213139", + "3f75df74 c0f8a4e2 40b4d5b8 -> 40a3d854", + "3ece443a 416e7628 c0a7b4d4 -> 40d93994", + "be5d4ce0 c1644b2a c120dc94 -> c172ddd8", + "bed763e2 412e3e30 c187fb23 -> 41b4fa21", + "3f425d68 417da738 4030b4b8 -> 40bd389c", + "3e749424 419047c8 c08ebb44 -> 414a97f9", + "3f706f5a c0a87b20 40ade264 -> 40991177", + "beff44af c1077610 c110a547 -> c102e1d0", + "3e823780 419c22ec c103865e -> 414766e3", + "3f8ca2ec c18e6ae0 bfb80de0 -> 3e35d9e0", + "3cad44e0 417dcafc c16be8ce -> 41736f6a", + "3f07b120 418258be 41563c50 -> 416c118d", + "bee0840c c13675b6 40978984 -> c193d8f2", + "3f3cb01a 41719110 411c6e58 -> 4132d100", + "3f1ce758 407bc060 4182b7bc -> 41389918", + "bed35aa4 c12c9ca4 c0798088 -> c15a1e17", + "bea6e446 c1856e2b c188b2eb -> c1845d6c", + "3ec2add6 bf913040 418fb6ec -> 40c41580", + "3d3202f0 4112e240 c19a6e30 -> 40fe2787", + "3e7033a4 c1883c06 41763054 -> c116ce6e", + "beb3b9ae c0c97ea8 c183bab5 -> c02e86a8", + "3f88dbaa 41329ce2 41707334 -> 4174bab8", + "3fb19437 c176a8a6 419c7ae0 -> 42046e19", + "3f77f3e6 c0ce7e58 41170548 -> 410f071f", + "3f852571 c17f50ef beb9d440 -> 3e872e1e", + "3fa43458 c00eb070 40f333b0 -> 412615d5", + "3e6c8a74 c0d50954 4124e27a -> c02f4ccb", + "3fa4571b 4107e5fc 4197034a -> 41ae9866", + "3e90a028 414d180c c0403be8 -> 410595e2", + "be0aaede c1244ad2 c14e30c2 -> c11e9e2e", + "3f913d13 40d13aac c165fdaa -> c18986f4", + "3f77a9f4 3fe18160 3fb28320 -> 3fb40ade", + "3f4fe968 412dfc08 414c5334 -> 4146a02e", + "bede6c65 c1800598 c175f3fe -> c18236b0", + "3ea7769a c0bc7f18 411c62d6 -> bf445864", + "3e31dc74 40d99e18 c0a5aa34 -> 40970b55", + "3ed52d8c c0993542 c10971a6 -> c0cbdefc", + "3e1e85b0 c19f6d90 411a0ca0 -> c175a5a1", + "be7bd3b4 c14b2dd0 40a6b560 -> c188d281", + "be88c666 c0887de2 4192c26c -> c124e321", + "3ecd9d16 41274930 416da22c -> 41438966", + "3f8fa900 41856c1a 40e046fc -> 40ba6c1c", + "3f30cf26 c1945b6b 4011fb90 -> c085288c", + "3fb4c064 c12960e6 40dcafb8 -> 41619f5a", + "3f9ee90e c0d621fa c12a797a -> c139c96a", + "3f48ab94 bf5d05c0 c0b3b4f0 -> c092d671", + "bd37d008 c18e9865 c15fb702 -> c18ff985", + "bec85c9a 410f6ce2 41684fd0 -> 40d94851", + "3fa4805b bece2300 40cef0f0 -> 4106d060", + "3e998926 40888d30 c0b14408 -> 3fa9c86b", + "3fa7957b 3fcafe00 c09b8a10 -> c0db5562", + "3f9c528b 4051e848 c0cea8bc -> c109ce00", + "bc37a1c0 40830740 c0245f00 -> 40856b04", + "beb9343f 411a91f4 40ab0bc0 -> 41338bde", + "3f9044cd 3dadbf00 c16339ba -> c180239f", + "3f39c530 bfdde6e0 40d86bb8 -> 408dd484", + "3f039e7a bf188a20 4102a28c -> 407a20ef", + "3d290ef0 4178e040 c0ce1c4c -> 416a59b1", + "3f8ee4be c08487e2 c19411da -> c1a1717c", + "bef77c3b 4185f2ce c03adad8 -> 41d1fc2e", + "bef2218d c142f2c8 c033f5b8 -> c184eec9", + "bddf2d64 c18f8a5d 40fa7eb4 -> c1a601c2", + "3db3ec20 c19cc3dd 412074f2 -> c187f1d0", + "3fa5245b c08326bc 4170ac04 -> 41a4c4a9", + "3fac7ee9 c15a9b99 c0ef857c -> c0aacc63", + "3f089c18 c125e5e2 c131ee9b -> c12c51db", + "3f6fa13c c10cf59a c1955a1e -> c1904ef7", + "3fbe1aa4 417b6fa0 c17230c6 -> c1f0d89a", + "3f5095f4 40ab8114 40c0ff00 -> 40bd03fa", + "bed78b04 c18f36bf c14941fc -> c1a12432", + "3dd1fbc8 c128e884 40eb3c04 -> c10b87d0", + "bef701a8 c18e35d8 3fec25d0 -> c1d9f017", + "bdbcb7a4 40971634 bffc7e40 -> 40aad359", + "3ecc0b14 c0e7ccd0 c008d490 -> c0a6b005", + "3fab19f8 408f5668 c183faa2 -> c1bc7ca2", + "3f93fc37 c0c41038 41137bdc -> 4139d138", + "bee54574 c1058743 c15c5e10 -> c0bd48d0", + "3f90b78f c106372f 40b1b670 -> 40ebfad4", + "3e932f3c c1994bc9 c0fcc4d0 -> c17ec9af", + "3dee1570 3fc32bc0 c0535510 -> 3f76b15a", + "bed2003e c11d2c38 419272e2 -> c1aae2e8", + "3f215f24 40702e38 c158aada -> c0e4c400", + "bdec7324 4184cf26 c17e2fea -> 41a2d0e4", + "3f8449d0 c0ef8062 409d1e08 -> 40aa67b2", + "3f8573ac c113fd62 41937868 -> 419ce731", + "3f2c6720 c1883f28 c10c3b96 -> c1376c34", + "bedd2c05 4152c4e8 c108375c -> 41b45450", + "3fab9b0f c19bb5bd 412719c6 -> 41a50f1b", + "bee16cae bf0fb900 418ea756 -> c10a8da7", + "bed1fb8a 409342e4 c194ea0e -> 4161f96c", + "bc51c600 417d4ff4 c1866d30 -> 4181ffba", + "beddf73a c074e3b0 c18b5d18 -> 4004499a", + "3ef4a1c0 c0bbec04 c19a302c -> c144686c", + "3fad1570 40add10c c02e99a8 -> c0b34510", + "3f415638 c11a03ef 41991c78 -> 414190f6", + "3f10dbf0 c191eb23 c1991ce7 -> c195fd4f", + "3f5b21ee 41447c9c 418ef360 -> 41888321", + "bee9d7b5 c1109124 4105a090 -> c187cffb", + "be752c82 c17043ca c125c0be -> c1810d71", + "bddae66c 3fb4d6e0 c17af8e4 -> 404f6278", + "bd8ca354 c161b4c8 c1000323 -> c1686a37", + "beba2c7e 3f6d1660 c0544098 -> 401e00f0", + "3f15edea 41185bb0 41693b8c -> 4147b924", + "3fa57799 c180b218 410d77b2 -> 41811bf7", + "3cd079c0 c17af11a c144239e -> c1798c12", + "3f9af939 c104a822 41229876 -> 4160d074", + "3f8859f0 bdfb6c00 c0149528 -> c01dc3a6", + "3fac9cfd c0aa4f40 414524d4 -> 4193c4ac", + "bea5f7c2 c131f20d 409bc234 -> c1826fb2", + "3e781030 4180f1b2 c10cf522 -> 412144a5", + "3f92cf6c c104e6e6 414b6f24 -> 417cdc44", + "3fa909d2 4106af1c beec5640 -> c053bd31", + "be720a7a 40181e50 41172aac -> 3f349a08", + "3f1f6da8 419cd4c4 c0f863ee -> 4023ea9a", + "be3e4450 41343f6c 4105e0ce -> 413cdd12", + "bd473f60 4125b46e c155a00a -> 41382837", + "3f07d026 c1100cf8 41546454 -> 40343260", + "3ef2a47a c05c5368 c193b727 -> c128fc58", + "3f54f052 c10581fe 413372d8 -> 40fd9d1a", + "3ef7c00e 4199af86 c0fe791c -> 40c223ea", + "3f8b9f81 c1521baa 4156784c -> 417d0617", + "3f2b5a24 c188adc8 414382b8 -> 4021e808", + "3fa7369f c0bce794 c083406e -> c0632dcd" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_vector(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f68ff44 3f55d7cc 3f599692 be64921a 3da7a554 3f029fc7 bd3c5318 -> 3e192680 3f0a7033 bd7d8e38", + "3f846587 3f20c22e bdd0531a 3f858d08 3ee39ea0 3eddce28 3f845376 -> 3ee064f8 3ee7367e 3f8448b1", + "3f418d16 3ed7fb08 3e8272ea 3f88a762 3f6b51aa 3deed3e8 3ec1d484 -> 3f4c4221 3e19ed77 3f0bf1c8", + "3f6a885e 3f35b604 3f1e651f 3ece1578 3f6622fe 3f7a431e 3ee99a14 -> 3f62136c 3f728efa 3ee74b57", + "3f2514c8 3f5029ca 3f8d82a0 3e6f5c64 3eb83042 3f67334e 3f771cac -> 3f0550fc 3f799aba 3f349a24", + "3f1a4d5c bdd13962 3ee84468 3d1fed30 3f0c1e0a 3f0b796f 3f094cea -> 3e94216a 3f0233bb 3ead748a", + "bde0f3f4 3eade4d0 bd956eae 3f80ec94 3e851058 3e6521ec 3d784c40 -> 3eb260ea bdd82e98 3f8e3ba0", + "be67df84 3f5ac2ce 3f91ffd4 bd83fdde bdb432e8 3f9bdace 3f9f6c96 -> 3f88b2dd 3f8fc487 beb8de7a", + "beaa5092 bc99d178 3f1fd0be 3edda35a 3f485ca8 3f3f6dc4 3d2c8b50 -> be921c5b 3f154ca1 3f101864", + "3fa06598 3d2f05b8 3f0f42f8 be292344 3f47b3c6 be39d6f8 be0a40d3 -> 3f777a72 bebcf501 be026fb3", + "3e4b6e58 3f868ba1 3f474ff2 3df99cfc 3f52610e 3f8bcead 3f04fd25 -> 3f80b6a8 3f5743f2 3e4db12a", + "bbd2ee40 3ee225e8 3f253194 3ec735a4 3f00faa2 3e152118 3ece92fe -> 3ee1f17c 3f26045c 3ec72980", + "3fb8ef52 3f9b82cc 3d456d48 3e4a79f8 3f6f7db2 3f78437e 3ee73078 -> 3f4fac80 3fb09a12 3f107efc", + "3fb1c4ea 3f8a28bc 3f5b2d26 3f81e0b1 3f8605d6 3e7a10d4 3e6942f6 -> 3f846a1d 3bcd43c0 bda01230", + "bdd53f74 3f1e0f33 3f6c21f8 3f3ad466 3e1ef8e2 bd5eb074 3f6e6166 -> 3f2a6109 3f8315a8 3f357643", + "3f9e725e 3de57db4 3f882652 3eae312a bdff3de2 3ef3b80e 3f80af18 -> be39457a 3eac266f 3f94ef52", + "3f62d356 3f9d4f94 be532491 3cec40e0 3eb44afc 3f637f36 3f8d98b4 -> 3ee774e0 3f438e1d 3f7bc2cc", + "bd80e28c 3e85d844 3f6318b0 3f8c1b0a 3dca361c 3f29d78f 3eb6faa2 -> 3e8b1627 3f66b317 3f920b40", + "3fbb2e87 3f961166 3eb6e47c 3f832ab2 3f191924 3d2ac680 be34f9ca -> 3eaa3a7c bdd56127 bf3b7465", + "3fa20281 3f790f9c 3f68c66c 3dc9e350 bd4ccb28 3f38e818 bdc22490 -> bea4c0ad 3f2c301a be15af33", + "3f787282 3e7028c0 3f8dc2f4 3f4f656e 3e799de0 3f323a0e 3e022380 -> 3e795672 3f355554 3e16c636", + "3fa676de 3f4ff64a 3f3c5f5a 3ee3cc58 3f1b0500 3ebe3eaa 3f9c0ba6 -> 3f0b1c33 3e863376 3fb9d2f8", + "bccf7d30 be5bdae2 3f629e52 be46222c 3f083d69 3ea5c82a 3f8a72e2 -> be6f39f7 3f664241 be673487", + "3db089c8 3ee9b4cc 3f10c332 3f06ff20 3e3cbe7a 3f6e9ca2 3f771ac0 -> 3eddb212 3f18da32 3f10a90b", + "be2257ba 3e09c1c2 3f9712ce 3e1bc8c0 bdab4710 3f7375fa 3ef329c2 -> 3e2d2c6b 3f9bb9b6 3dcec2f5", + "beeda57a 3f83c964 3d0d0a68 3f8d6fa6 3f9bcec1 bca171d0 be03b20d -> 3f714649 3d73f8fc 3fd6b999", + "bca33fc0 3f5f12e4 3ea8de6c 3f9f0a12 3f6b8d14 be1556f4 3f37e0b0 -> 3f5ed33d 3eadb8d7 3fa06063", + "3f8aaee3 be675f98 3d2c4f50 3f2af5e4 3e18100c 3d96ad58 3ed391f0 -> 3e3810a8 3d9c0ff2 3ec8b0d2", + "3f9a1fdc 3e95856c 3d0664e0 be43209a 3f81ceb6 3ed2dc42 3f5822c0 -> 3f94abee 3efa77bd 3f871a33", + "3eceba46 3f4e39bc 3d2f3fc0 3ee0dbc2 3f2ba95b 3efd04d2 3da208f4 -> 3f404512 3e667152 3e966cab", + "be22dd58 3f19cdaa bd467d68 3f109fe9 3dbf7d20 3f75d246 be2e7e5c -> 3f2e755c be55e765 3f2e90a5", + "3f725f56 bc6b0120 3f08eafc 3f03a28c 3f53f25e bb45f180 3ea31272 -> 3f487801 3cd1ce93 3ea867e6", + "bc9e9c40 3f6360a8 3f3bfc4c 3f82498e 3f20a050 be40d059 ba9baf80 -> 3f64ab83 3f408efd 3f84d016", + "3ef7802e be7e569d 3f85d3b9 bd3ffeb4 3f518650 3e8de178 3f6ea6a8 -> 3e88df6c 3f2c900e 3eda5462", + "bed31242 3d17b3a0 3f0da643 b9e24800 3f1c27da 3ec73f22 3f2e8fd5 -> be4bf094 3f1ef984 be903ce4", + "3ecb9bd4 be234cd2 be16a812 be47ae86 3eba06c8 3eaad11c bd697b70 -> 3d4661ce 3d3474da be0f7c6e", + "bdbb62dc 3f3f7b52 3f0b954d bd82a78c 3e28d048 3e8d3310 3d89ec1c -> 3f4d23e8 3f11e51f bd9b3a7e", + "3fb1e60e 3f0ef7b0 3f2bdac6 be53dbd0 3edd6d00 be2dc426 3f44a670 -> 3ec44726 befebe05 3f92faaa", + "3f21d9c2 3e1fc2de 3eb93fa8 3f066954 3eddc314 3e16e704 3f44ee5a -> 3ea99508 3e67a9be 3f2df02b", + "3fb73b2c 3f9da25c 3e877daa bd0357b8 3f5b9a7e 3f62f964 3f6fede8 -> 3f32531f 3f93d715 3fad7fe9", + "3f659a7c 3f21a652 3f767ebe 3c673ae0 3f3a635c be46d884 3e398556 -> 3f37d659 bd995a67 3e27e1b5", + "3e2fa578 3e80244a be6eabe7 3ecea47c be7ea32d 3f1d6924 bdcfff70 -> 3e28a53a bdb375ae 3ea2471b", + "3f4e04b8 3f90e5bf bd325550 bd947530 3e9e2136 3f94f4b3 3f897b8f -> 3ef06a72 3f6d9238 3f59a867", + "3f8a280d 3f3db628 3f07ab0b 3f9710ed bd82899a 3ed8f3e0 3ddcafd0 -> be02a8f6 3ed4a330 3cb9a4a0", + "3f5af378 3cfacf10 3f9bf045 3f0e9996 3f23a024 3ec29f38 3df529c8 -> 3f0d145e 3f005d0f 3e3b6416", + "3fb38b94 3f755c08 3f83b610 3f745324 be66eba2 3eac8a32 3dc3a25c -> bf33c88e 3d6ee5f0 be802c82", + "3fafe9b7 3eb0959a be03a3a8 3edd14ac 3f48509c 3f1eee48 3e6154dc -> 3f723f48 3f66bd94 3e102aee", + "bebc1212 3d6e42a0 be569b56 3e9913c4 3f790ffe 3f8e7b64 3f8e7be4 -> be8e4063 bf3208a8 b8ba8000", + "3fad4ac6 3e3b4ec8 3dabd890 3f0ab48f 3f21cff0 be34d290 3f3cb86c -> 3f4a7fca be899abd 3f4e6b00", + "be541714 be4e2e0f 3f8c5c54 3eb96e22 bc799e00 3f83ad6c 3f4d322c -> be75a708 3f8e28bc 3e8ad616", + "be898171 3e35ba2c 3e6478d8 3e919708 3f13a44e 3f3a82d2 3f83aec0 -> 3d8fda8a 3db2f09e 3dacea30", + "3ce739c0 3ed127ea 3eff2f08 3ecebc5e 3f86c5d4 3f91a061 3f2abd62 -> 3eda77f5 3f043619 3ed28a00", + "3fbb4c34 3f96c3b0 3c03ece0 3f6a9026 3f0458d3 3e835ae2 be5a7b2a -> 3e57e298 3ebe4c0b bf3c9697", + "3f08b5c8 3f31f10e 3e267a56 3ec8ea4e 3e86f37a 3f1bbbe0 3f6fa2e8 -> 3eede674 3ecd1e5a 3f2ec84a", + "3e69cc5c 3ccbcdc0 be38b2ee 3f0c3716 3f579370 3f2b230a 3f9684e2 -> 3e5889f8 3c5c4270 3f30ef1e", + "3faba3bf 3f513af4 be710687 3e15aec4 3e09cfde be2996e3 3f3e84ce -> bdc913be be113bfe 3f72b719", + "3f997fd3 3f55e38e bde54d04 3f544448 bd83ab36 be3813d5 bb36a280 -> be79633a be45e884 be2c9151", + "bead87b4 3f56a8f4 3f3226ec 3f37c0b4 3f05ad68 3f43d0f8 3f25e71e -> 3f721b6a 3f2c2a49 3f3dcd74", + "3f4f51fa be420180 3f922b2e 3d815484 be04e436 be211596 3f8cca85 -> be10833f 3db7cf44 3f671ca6", + "3c3c8240 3edb8880 3f8d938c bd207c80 3e6076e0 3f3db39e be220d42 -> 3eda4c73 3f8d09eb bd26190f", + "bc9dee40 bbd75520 3f052476 3e07936c 3e304ca4 3e95b8ce 3f40489a -> bc241f78 3f064419 3df6b934", + "3fa80900 3cc906d0 3f5030e0 3d9f791c 3f09c0d5 3f30598a 3e33a4d4 -> 3f32dfc5 3f266402 3e52e470", + "3ed48e9a 3ebf58b2 3f8a3b30 3d8f3038 3f93a90a 3e8e454a 3e17e08c -> 3f328e94 3f3f3884 3dd1d8ee", + "3f57a472 be025ff8 be2afb82 3c6b4140 3f9eefd6 3f64efc4 3f240a36 -> 3f834fd1 3f3a1b50 3f0ac24c", + "3d2d4690 3d02f458 3f1e4c11 3f776ce2 3ea88edc bdc19a8e 3f815059 -> 3d3675a5 3f1693aa 3f77e634", + "3f2074d4 bd97ec50 3eabb7b4 3dccd1f4 3e63d240 3f92cf42 3f5f6ffc -> 3de4e377 3f581454 3f159a1d", + "3f9b7a46 3da12be8 3f9e1db7 3f15061e 3ecec224 3f2cabd4 3f72800c -> 3ef27e4c 3f0dda66 3f834888", + "beda6af0 be653d1c 3f920918 3ea19746 3e5a43e0 3f71848c 3f1a9115 -> bed2123f 3f9cd187 3e454ca4", + "bead91cc 3edfc6ac be0720a8 3e38cdf4 3f25eca2 be0f0670 3f33ee32 -> 3ebb239e be047344 3b5dd240", + "3fbebb4b bd61b314 3eb90484 bd286988 3f088cdc 3ed49104 3f8baeee -> 3f5262b4 3ee21161 3fd2b859", + "3dc71420 3efd350c 3f9c25e4 3f2e5d84 3ec30840 3f068828 3f7883ec -> 3ef78d5f 3f938214 3f3592ba", + "3f9cd703 be1be937 3f2ea6e8 3f167e9b bcf78200 3f718a28 3dd03b40 -> bb31f730 3f804e1c bc00ef90", + "be22b266 3f3a39e0 3ecd427c be09262c 3e592086 3e203e74 3ef2dc96 -> 3f4f309c 3ee1245e be6c1d06", + "3f517ed6 3e5e9010 3f95b361 3f5307ec 3f84b011 bda3f1b8 3f858f3c -> 3f634682 3e167952 3f80770f", + "bea4a8da 3f1fb92c 3ebf196c 3f8f6a1b 3c18d4c0 3f8d911a 3f5b6e04 -> 3f52528e 3e0ce3da 3f9a4096", + "3f0ac842 3f95e334 3f626e1e 3f8a866c 3e2bf194 3f620d2a 3d9d3670 -> 3f2090a3 3f62398e 3f09827c", + "3e924f0a 3edf21dc 3f57b4e2 3edb5164 3e2ad0f0 3eb3cd94 3f7c9a64 -> 3eb7c6bc 3f33c1b2 3f1681af", + "3ee9c7d4 3f9af082 be20f436 3d9225c8 3c0e3960 3ebbdf20 3f358ac2 -> 3f2966ee 3da834f0 3eb9a3a3", + "be0587f2 be4c6be7 3f8daacc 3f1823fe 3eb60cbe 3f96b2b9 3f6901d8 -> be8b475a 3f8c7d51 3f0d9871", + "3eee2168 3d71a320 3f37aa63 3f9af04f 3f8b33fb 3efd32ca 3f39685b -> 3f099086 3f1d1fc4 3f7bfc98", + "3f6899f4 3f443320 3d0a99c8 be52d10e 3f060273 3e171df2 3e1905f4 -> 3f0bb19d 3e0c78c8 3def8935", + "3f9ab764 3d9d8f00 3e157cec 3f1eabe6 3f519b00 be45efaa 3f2a95c0 -> 3f793e72 be8739bf 3f2d1252", + "3f37cae0 3e8f9388 3f4c8f7e be7f564a 3efa6546 bdd0e602 3e823f5e -> 3edc441e 3e1bce3f 3de5ff8d", + "3fa9eb97 3f838c44 3e73a36a 3f87fb04 3f74a7b8 3ed549ee 3f8ec88e -> 3f6e9da5 3ef33ecb 3f9102ea", + "3b1e5000 bdffac0e 3eef902a 3ea8988c 3f8da6b2 3c4c8240 3f693778 -> bdf99460 3eeefff8 3ea950bb", + "3dbc9428 3f878cab 3cdf1fa0 3f3c3672 bcfafda0 3e9e928c 3e7b8db4 -> 3f756a02 3d5a196f 3f30ac42", + "3f90ccc4 3f35f65c 3f9cbc0c 3f496b60 3f8f70af bbc9f3e0 3f87ba30 -> 3f96534b be2bb595 3f8c52c5", + "3f9a359f 3f958d73 3f9adb18 3eb26aa8 3eb16c4a 3e6122b0 3f6f9214 -> 3e36862a 3c8c8860 3f872df4", + "3f936711 3f85e061 bc954940 3f515abc 3f7b2284 3e9160c0 3f279c5a -> 3f789da4 3ea8d43d 3f21487a", + "be6c834c 3f6d9726 3d25fa00 3f764d9a 3f85a906 3f80af23 3e60a910 -> 3f66b945 be3ab2ee 3f911c10", + "3eec8124 3f059680 3e87e7f8 3e8a1520 3f5699fa be770ef7 bdd28e20 -> 3f2b0289 3d008946 3dc7ef9e", + "bd9e9394 3e86e184 3cd154f0 3f8ae32d 3e30e37c be478d0a 3eb24c9c -> 3e8a79fc 3d2e9334 3f9230a5", + "be65acd4 3f0211e6 3f9d8b79 3f02973f 3f8574af 3f9cd2b2 3ee92694 -> 3ec6c13a 3f9db4ea 3f05bbff", + "bef713cb be5172e5 3f956dda 3e741638 be659c66 3f574714 3f458bc4 -> be47b818 3fa99892 bc9b8f00", + "3f9aea24 3f6f1878 3f898ee3 be31c2bc 3e743748 3f174a1c 3e9d4002 -> 3dbcefd6 3efa8138 3ed10104", + "3eb9610c 3f31c234 be2f54f1 3f421c2c 3e5831a6 3f49e3d8 3f2bf86f -> 3f04f792 3e348adc 3f3a1810", + "3f0b1556 3f9a6587 3f7b9462 3f0ee9a6 3e6a4e88 3d6760b8 3f9f5be5 -> 3f2cda1c 3ef5824c 3f6e6d3a", + "3d75c560 3d748ae0 3e4ed96c be7e5d44 3f83dc71 3f81cb7d 3eeaafb4 -> 3df186e6 3e805efe be52f02b", + "3eefddf2 3eb2308c be5febfa 3f500114 3e2bd4bc 3ec044f0 3e9185e8 -> 3e86f5ca 3d748b2e 3f10a4f4", + "3f1b2062 3e4db386 3f811b84 3f979586 3eeda544 be55e6cb 3f4f6b34 -> 3eb88807 3e8aaf33 3f7525c8", + "3fa03521 3f937617 3f803d8a 3f14dcf4 3e3f0630 3f844d6d 3ef61128 -> bd66fb40 3f855315 3ee91186", + "bec314c0 bd85c568 3f6e1be8 3f4c0544 3f08d108 3f46d3fc 3f1cd9f6 -> be9671b1 3f7d1364 3f5dfe2c", + "3f2a6a64 3f1f676c be336578 3eeaa9e0 3f53b320 3f8ca414 3f95c895 -> 3f42376d 3f2c406e 3f6ea4aa", + "bd1c8188 be4f68f7 3f990d8c be53a317 3e270582 3e0cd5f0 3f99fbdc -> be5db783 3f9e3a74 be856578", + "3f57283c 3f9caead 3f1fbe98 3f81e080 3c7bef80 3e3d3258 3eb66b1e -> 3e5536aa 3e827a58 3eec32ce", + "3d325ff0 3ee6768e 3ed71774 3f17f757 3f9d7e10 3f9d27a3 3ec63604 -> 3ef7dc6c 3ee919a2 3f15aa07", + "3d516990 3dcf48cc be7010c3 3f622426 3f594e7e 3f6be8fe 3f9a443f -> 3e0ec892 be338c18 3f665a84", + "3f700748 3f6f1066 3ef3ac3a 3f631f82 bd6c1d9c 3f63da0a 3f37a5c4 -> 3b8a0910 3f5d3ccf 3f3a5c23", + "3fa72ef3 3f872ffd 3f09c5ba be67ff54 3f25655e 3f0710de 3eaaf416 -> 3f054281 3f063cc5 3f0165ce", + "be607578 3d65d4f8 3f842222 3e89c294 3eaf0eca 3bd23380 3e5dcd30 -> bbd624f0 3fa0eaaf 3e8fa5c8", + "be8a34f5 3f279ae8 3f8eaecd 3f58b700 3f8f7c71 3f087628 3f976c7d -> 3f07623a 3fa2c7b1 3f4176ee", + "3f8c2870 3f970fa5 3e23cc4c 3f1072e4 3eee98fc 3f9fb79c 3f96ac5c -> 3ecbddf2 3facf16b 3f9e1fea", + "bde775e4 bdd0bc26 bdfaf40e be3539a0 3f0b728c 3f638fca 3e9b2c26 -> be3333fb be728828 be6cc801", + "3f312466 3f90e300 3f11f72c 3eab2d84 3ee67cd2 be497c23 bd419068 -> 3f290170 3d21ba74 3d8ff2a6", + "bee135e4 bc890e88 3eba85bc 3e838e30 3f2a4497 3f3d1534 3f27d953 -> bea21f9e 3e4c7368 3da70ab8", + "be02e2ac 3f1c7883 be565dfb 3d922a28 3ddb1f0c 3f48ccc8 bdbbb1e0 -> 3f2cf835 beac3714 3dbcd67f", + "3faad5cb 3e034a9a 3eeb1a8e bd8f38fc 3f07a1a5 3ed042aa 3f95ce83 -> 3f2a0948 3ec746fe 3fcaef5c", + "be941dca 3f67a2c4 3e48bec4 3f860a6c 3ebc2938 3f94ee9c 3f0750d8 -> 3f87b6ee bdabb708 3f993e9c", + "3f5d1bde 3e96ccde 3e86407e 3ed774f0 3ef5aa62 3f7af200 3f66b0e0 -> 3ee8bc6d 3f61e455 3f55ee92", + "3f8c4529 3f85d81b 3d6abcb8 3f8683f4 3e84b408 3e8afec8 be74a233 -> 3e3c3499 3e9581b4 beb99eff", + "3f0c954a be271c0c 3f80362a 3e403aac be14f3fc 3e143138 3f449a9c -> be1d238d 3f07f3e2 3f01a1d3", + "3f5699ce be0e5870 3e1df788 3f95ce62 3f257fa3 3d049f30 3f918b7c -> 3f04fae2 3d555b91 3f923be6", + "3e8ae210 bda766a2 3eeb6480 3d42ffa0 3f5337fa bdfbbc28 3f01a098 -> 3e282e5c 3e9a7844 3e302cbc", + "bd9f3f20 3f474844 3f668ace 3f608eb0 3f86ed64 3e83b1cc bd91386c -> 3f41cb77 3f735932 3f736e07", + "3e8db12e 3e1b85f0 3e0443e4 3ca8f430 bdeaf078 3f9462ca 3f1f04dc -> 3d9ff2f0 3ed416ee 3e3f4dc7", + "3f6c8d0c 3ee386bc 3f1c062e 3e86a338 3f44d0ea 3f815b1e be6c79cc -> 3f3e819d 3f7ae90f be460d6e", + "3d9fdb18 be11768b 3f001db5 3f8aaac7 3f32a80e 3f81ccf4 3ebca5f0 -> bd9ca887 3f0a610a 3f838653", + "3f8068b1 3f58f98c 3f40d7ec 3f2f2209 3e13dba0 3f0136da 3e61778a -> 3e118eb4 3f0102cf 3e5ff2fc", + "3e7a5938 be1879e8 3f0f7ffb 3d4e8388 3f9199b5 3f16c1a9 3e2f43a2 -> 3e2992d6 3f114626 3da3b5c7", + "3f8e5af0 be664c5e 3f665522 3f02ddb2 3dfc22fc 3e882434 3f42aafe -> 3e2608f0 3e477df6 3f49d2c6", + "3f4c6a66 3f8cd609 3f846f30 be4663c0 3dee91fc 3ef97e18 3f910ac5 -> 3ea123a4 3f18fb2c 3f5da346", + "3f3a3288 3e19b460 3f859c92 3dd995d4 3efc7dfc 3f4f85fa 3f348567 -> 3ecc99de 3f5fcd2e 3f0ab710", + "3f128a94 3f20390c 3f162598 3f7dab08 3ecf1d72 3e1a9be6 3e84f21c -> 3eff9278 3eaca60d 3f128332", + "3e9504ec be4de738 bd1969d0 3f619d82 3e2fd248 3f5910a4 3ef2e844 -> bdbd9a20 3e6184f5 3f434c77", + "bec77174 3f59c894 3ea4efba 3ea6475c 3eff0f9c 3f5ba7fa bdc5961a -> 3f7cf0c1 3de83a1c 3efa4ad9", + "3f94de51 3f77f98e 3f20bafa be636d5b be6e20c7 3eac90b0 3f634ad4 -> bedb551f 3e944a42 3f88cf28", + "3f8cf84a 3f4446d8 3f98dabf 3ec9e8d6 3f839dd8 3f374b82 3e1e81e4 -> 3f870242 3f2ae41e 3e05a691", + "3ebb34f6 3d817c4c 3f4532a8 3f77f5a8 be0a537e 3e8063e0 3e05b7d0 -> bc181ccc 3f149123 3f2984e7", + "3f9e1941 3f5274fc 3e33263a 3f98eed7 3f63ae68 3ed142d0 3f167070 -> 3f67bb43 3eed679b 3ee3c857", + "3f10db5a 3ef1828a 3f840786 3f9f5b98 3f99ef00 3f0d382a 3f4e9a78 -> 3f62a1c2 3f428cec 3f7f46f8", + "3f857fa9 3f9ab54f 3f76865e 3ec62dd6 3f882f50 3f1f2e38 3f246d6b -> 3f87639b 3f1b6daa 3f273bf6", + "3e56a734 3c967c90 3e72a458 3ec971c6 bdf1d6ec 3d8e9d48 3f2f0198 -> bc27ad51 3e4eb9f5 3ee8966c", + "3f0ccc0e 3f4d4534 3f1b2e08 3ec4395a 3eb6ec14 3f82efa4 3f9913cc -> 3f0ead32 3f55dc02 3f548879", + "be9bf3cd 3e4fc5ac be2ae40f 3e032598 3f96d378 3d4da648 3e1b3fac -> bdc0ef84 be6e9a6a 3df79c71", + "bdda6f38 bdb2cc6c 3ecc7a78 3f89aed7 bdaf6546 3f190602 3f3df460 -> bdb32957 3ec1a537 3f8e3ce4", + "bcdf2e40 3f875624 3ea9bd76 3d50c7f8 3f6103b8 3f3d008a 3f04e687 -> 3f87f55c 3ea410f2 3d1c89ae", + "3f1256ca 3f98103c 3f0d24ca 3f41e946 3db66df8 3f93b76c be73d21a -> 3f0f4feb 3f655755 3e40e17e", + "3f87a80c 3e338410 3f1c9a82 3f1867f6 3f4758e0 3f5c72e0 3f42baea -> 3f50963a 3f604487 3f454304", + "3f574c46 3f613f64 3c136140 3f915bd8 3ea4a7a8 3e767600 bc518e40 -> 3ed219f2 3e50bd73 3e2ddf67", + "beb7dc25 3f8b35ed 3f115b34 3f9bd8e5 3f38cda6 3f98869d 3e3b5080 -> 3f9c0513 3eb004d0 3fcb6773", + "3f9465f2 3cc9e9a0 3da88170 3f3a7253 3d0debf0 3eda8222 3f17c37c -> 3d14732e 3ef69de3 3f123c8b", + "3e3f050c 3f082233 3f1ee020 3f56d930 3e15ae30 3e0f11c4 3ec01304 -> 3eeb7049 3f07e91b 3f40af5d", + "3f932e4a 3f84d15d 3e6bd6de 3ec574ec 3f7c9324 3f9d9cbb 3f194bb6 -> 3f7a9e1a 3fb0d018 3f217901", + "be86dd99 3d9489b0 3e295338 3e9d5fc6 3e7d8c26 3e905980 3ee5674a -> 3cd85cb8 3e09e17c 3e8a66a1", + "bebb73b0 3f9de4ca 3f4a377a 3f1e0018 3f9b30d0 3f543758 3f967194 -> 3f9ee222 3f468e44 3ed35fc1", + "be99261a 3e8f14aa 3f8efad2 3efcf444 3e3cc738 bda8448e 3e76a108 -> 3e9da532 3fbce4b9 3f11ddac", + "bd12e6a0 3f236d64 3d3de808 bd98bdbc be189bc4 3f5cb046 3df24018 -> 3f2aa827 3c8c288e bda6e846", + "bedde7a6 3db32bec 3f14f756 3f7c3a84 3f9ae9e2 3f558868 3f512c04 -> becc5b50 3ef1f704 3f8771e2", + "3fb7d40f 3f955db0 3e2f09be 3f84bdda bdd75d78 bdd78146 3e287150 -> bf28f4fb be67181a be5d42de", + "3f107628 3f8a5454 bce4dce8 3e3c27b0 3f0f8d18 3ee64cb4 3f5633ba -> 3f498bb8 3e777402 3f0d5e97", + "3f02cb30 3eba0028 3f922029 3f0d6155 3f882104 3ddd1ba4 3f8a27db -> 3f3895d8 3f1d0ea4 3f52517a", + "3f3eda6e be0626ca 3e071e6c 3e1627e8 3f2b7c7a 3da35d10 be4c5210 -> 3eee9fa3 3dbe8f92 bde43a26", + "3f839810 bd2bfdb8 3f61c594 be7dc890 3f9f5778 3dddb91c bd52c608 -> 3fa3f773 3db13c18 bd3c304d", + "3ea227e2 3f323334 3f34fe6e 3d21d7d0 be6861a4 be31d049 3f4cc492 -> 3eceb9be 3edb2f48 3e8f8708", + "3f690652 be33ea61 3f7dde5c 3f0a4bf8 3e2627b0 3f08144a 3f0ab0bd -> 3e07189b 3f12a689 3f0aa7b2", + "3f90ee46 3f30b703 3e3b64bc bdd37218 3ef3c9ea 3f7cdc4e 3e89348a -> 3ee5494e 3f8c0e18 3ea2587c", + "3f9d8361 be5814ae 3f23f1ba 3ef32fae 3f88521b 3de986c0 3f66f486 -> 3fadfaef bbf09560 3f8015e3", + "3f7f3604 3eae270a 3e39f042 3f10de28 3dbb79b8 3f236019 bdd5b484 -> 3dbd0b6d 3f2303df bdd1797f", + "3f87333f 3e3d0794 3e8687b0 3f852d38 3d017870 3cf16470 3f902f8a -> 3cbc70f7 3c85e414 3f90ce12", + "bee17d9b 3ec7d27c 3f5b3e04 3e83e51c 3f4c5758 3f023abe 3f95ff57 -> 3e57acf6 3f8138e5 be1484c4", + "3f060c2e 3ee5d8c8 3f8d7e0f 3f04c9fc 3ebdb5ac 3f6e395c 3f1089e2 -> 3ed0d47e 3f81c606 3f0af0fd", + "3f35a080 be3bcd34 3f5085a6 bd2bc9e0 3f765b16 3f92e806 3f97ae1d -> 3f212503 3f86845c 3f541bdf", + "3f4fed2e 3f0f624c 3f9cb6e8 be37952c 3f925a18 3ecace9c be459dd5 -> 3f8454ed 3f0d381d be42fb2d", + "3e32709c 3f95caab 3dd9ba68 3e4735b6 3f35512a 3ec8765e 3f806a16 -> 3f8b7cbe 3e1fc205 3eabc1bc", + "3f32c21e 3f8459dc bd05ab70 3c899ba0 3f5af61a 3f7af5d8 3dd6fb04 -> 3f68c331 3f2cb7ee 3da07ed1", + "3fad6f6b 3ea6ffe2 be4faf54 3f789460 3f7526be 3f14bf8c 3c251fc0 -> 3f97440c 3f5bfa79 bea97b2f", + "bc18ef40 3f32be32 3f55170e 3ea378e2 3e06ec5e 3f98816d 3e9efe06 -> 3f3418b7 3f543b66 3ea38396", + "3fa304a2 3f61d032 3e3f5f64 3f67a328 be0cb23e 3f8eb312 3c450120 -> bed5263e 3faf31d3 be6dcd94", + "3f09c968 3f3fc4d2 3d97e470 3f6989ac 3e93fc58 3f4fb5b6 be7764d8 -> 3f0060da 3ef1203d 3e951ab9", + "bdfc4adc 3f18e05e 3f987b42 be126c0f bda92e68 3f547cda 3f57cac2 -> 3f2e507d 3f9e2d6f be876587", + "be409e1e 3f96acd3 3dcc32a0 bd839470 3f8853e0 3f860206 bde600a6 -> 3f995fb8 bda0b580 bd6221e8", + "3e047b70 3f06203e 3f90087e 3ea72c26 3ee670aa 3ee2aa52 3f518aa4 -> 3f03ae12 3f84badb 3ec7c391", + "be984bf1 3f83e6b8 3eb9536a 3f3e22aa 3f8ec7db be20d291 3eb9a026 -> 3f80aa44 3f042f6c 3f5b159e", + "3f6fa42a 3f79179e be43d52a 3ed65126 3f8284eb 3adb6a00 be288f25 -> 3f822335 bc2e8c9d be0265d2", + "bebb05c9 3f64208a 3e595dd4 bd11f1b8 3de43000 3f37b441 3f58a498 -> 3f9684de 3ce2d350 beb72d45", + "3f8da45d be26b9ea 3f3815b5 3d42baf0 be3a77a2 be00af9a 3d67fe80 -> be3c9240 be5ce106 3d6bf737", + "be4c9246 3e4bae44 3eabe732 3f8b62ec 3df3046c 3e42709c bdf45452 -> 3e5c18c8 3ebad2b5 3faa4885", + "3f6c193c 3f144ccf 3eba84a8 3d54a7d0 3f3cb180 3e6beabe 3ed04e76 -> 3f398d9e 3e76939d 3ec22de2", + "be694a7c 3d27b9e0 3f4464e0 be518852 3f4b9658 be4a712f 3df7ca88 -> be060b0a 3f7caadd be8ebf62", + "3f815523 3f29b988 3de5a970 3db592a8 3f79a0e8 3f9c7305 3e49b3e8 -> 3f7a75dc 3f9dedb9 3e4adb83", + "3f8ba7f1 3f649400 3ee3edf4 3f8616cf 3f9bfba1 3d6502a8 3f1a168d -> 3f9fc799 3ca7a2ac 3f0fb2e1", + "3f083aba 3f39171c 3f1462bc 3f26a948 3f87e8c8 3f9a3361 3e9195ce -> 3f673e0e 3f698994 3ee96b38", + "bdac82e4 3f8c8a90 3f94cb34 3f1fd481 3e72e646 3e41f574 3f403484 -> 3f95d272 3f9f48f7 3f1d1a5f", + "3f9d3945 3f99d86c 3b0dc400 3e8b9782 be363e6c 3f97c34c 3eaf49bc -> befc6c84 3fba5943 3eb77016", + "3f61980c bcd83290 3f401382 3ec97f4c 3e5ed86e 3f6f087c 3f8fcb82 -> 3e412add 3f6974b5 3f84b2f4", + "3f8a7b35 3f95a5ad 3e8239bc 3f44ba3c bd9aabdc 3f870858 3f2e15fc -> be35b2fa 3f8f6c82 3f2c3b5c", + "3f1730ac bd7fddd0 3ec9e946 3f7bc4c8 be1c0c33 3f8b1735 3f122bfb -> bdecb264 3f4d9f69 3f3d6794", + "3f6b85de 3e4c7b18 3f36ddd4 3ef9ceac 3f4868ae 3f323877 3f92d302 -> 3f3c77af 3f32979a 3f8c134f", + "3f8b421c 3e45a4d6 3f0661de 3f92c36f 3df64c9c 3c1c6ba0 3f7cfa02 -> 3de931e9 bd1291a5 3f7968f5", + "3eff972e 3f8a279d 3bf4d180 3f181b72 3cabc8a0 3ed267c8 3ec035d8 -> 3f0d0e37 3e55e678 3ef84d4c", + "3fb3dbda 3f28798a 3f8d8d22 3d80786c 3ec4d95e be3785e7 3e69c598 -> 3e8c167c bf332ad6 3e973ac3", + "3f97c9cd 3f5b9922 3f0a06f8 3f9cb9b9 be1a9f4a 3f82bc72 3f9c46d0 -> bead4d4c 3f8e34fe 3f9c3175", + "3f996a6e be5b294a 3f93ec28 3f2f4d6e bc4bfe90 3f9cf880 3f9f6ad3 -> 3ce1e265 3f9ec470 3fadaacd", + "3f4d2d86 3f7abb00 3f5f3360 3f86f078 3f4b9f00 3f711bfa be39d0bd -> 3f54f934 3f6d8dd2 3d82c42c", + "bcb783e0 3e0c2bfe 3e0ea558 3f89cf57 3ed9f50c bd5eef10 3f62daa0 -> 3e058bf5 3e131705 3f8a5b2c", + "3f6386fc 3f5bc390 3e336124 3e17effe 3f2019f0 3f2b349d 3f969a3b -> 3f26bcb2 3f1d26c8 3f87f6ed", + "3f1d1572 3f9e2d72 3f9609b6 3cae2cc0 3e73e32c 3f823631 3f39b90c -> 3f1fa656 3f89df54 3ee820e1", + "3f9cbbb3 3dd08aa0 3f946703 be5dc703 3ede85c6 3ec28a8c 3e4f9e8a -> 3f0262a8 3e51eb0c 3e980136", + "3f8929b0 bc832358 3e845c38 3f56cdae 3e040a30 3e239652 3f27fbca -> 3e0eaa4e 3e1c58fc 3f24a1c8", + "3eec25ae 3e19768c bdd159e4 3f2c5da8 3f5367d4 3dad980c bc90b2f0 -> 3eec5a23 bc82e8c4 3eb58fc8", + "3d8f6be8 3f3b0007 3e92a2dc 3f1cb615 3e9d78c6 be397b44 bddf6f84 -> 3f336b19 3e81df62 3f0fc7e7", + "3f944012 3f731ff4 3f486f8c 3e9d4c6a 3f9657cc 3eafa58a 3ea132b8 -> 3f9ae56d 3e8c03cf 3ea1d0a8", + "bee810e0 3e6b6d42 3f858837 3f9edbd2 3f50cbca 3edde5fc 3f8e735a -> bd11a978 3fa8e975 3fa64bb4", + "3f2a7b8e 3f955516 3f0f2e52 3e7c5d90 3e849e10 3e8a7158 be0af832 -> 3f0fed82 3ebbdaff bc03e420", + "3f72a704 3f831f54 3f1913be 3f2990f7 3f2eb960 3efc7d46 3f1da770 -> 3f334990 3eff4992 3f1e4670", + "3f296c66 3f1f7c97 3ed7b052 bdfbcbfe 3e9f482e 3d7d5938 3f97af36 -> 3ed549b7 3e3bcdfa 3f3e20d3", + "3e597a5c 3f39be90 3e904ef4 3e514bcc 3f888968 3dbb1374 3edf28ea -> 3f4c4a9a 3e772f92 3e81d153", + "3fb256e1 3dd622a4 3f2ea604 be758fd3 3f66c004 3df49da0 3f4d9574 -> 3f9b7c64 bdd0a9e6 3f9b4a0b", + "3f6b1d22 3f7a231c 3decf58c be4e4a98 3f4c6882 be64bf90 bdbce942 -> 3f50239c be486b4a bdcf28e8", + "3fb340dd bd852198 3f65153c 3e77d8e4 3f8cca11 3f72f1ec 3ed3d0be -> 3fc87eda 3f787ee0 3ef7023e", + "3f79d3a2 3ebe708a 3f8e9892 3e824f64 3df8eb50 3f96c424 3db8adc8 -> 3e02a49d 3f9691b4 3dc0cb7b", + "3db47bd0 3ce0dae0 be54ee3c 3ee27872 bd914e14 3f2dad7e 3f6a7af2 -> 3c99d175 be04f16e 3ef7d722", + "3f39f86e 3f9536dd 3f26f4ec 3f83fcae 3dfd577c 3f8808fe 3f875dba -> 3ed1482c 3f7350ee 3f867117", + "3f8390fc 3d639780 be2f9b67 3f433b94 3d105778 3f837dca 3eb7cb4c -> 3d0e05ac 3f87c43f 3eb2092c", + "3f0dd906 3f23123d 3f9b2e5d 3f9bbf57 3ec8e104 be694fa4 3d811cb8 -> 3f005e10 3ed425c4 3f13d71f", + "3f925d5f 3f5174e0 3f417458 3f07a29a 3e442db2 3eecff76 3ebed47e -> 3dd03ca5 3ed77d4f 3eb349f7", + "3f4425b2 3d96d204 3f1b3120 3f1e9246 3eb2453c 3e779f98 3e82cdf2 -> 3e916803 3ea76ea6 3eae5ece", + "be105f9e bbefd740 3eebf9ba 3f39e932 3f916ff8 3f1b2ceb 3f9b02a0 -> be2c97db 3ee17d45 3f2869a9", + "bda00cc8 3f848bfe 3f3dec1e be27a036 bdcb9a70 3f7b3014 3f6688d8 -> 3f8fe656 3f39226c be7cca4a", + "3f2ff0ce be2e6124 3ef37b18 3f4965bc 3f280167 3f1a575b 3f6fee44 -> 3ecba9a2 3f10255b 3f63e150", + "bd15edd8 3f92c049 3e80ad84 3f974fc1 3eb32482 3edea268 bd5c2cc8 -> 3f967bc2 3e7a7a2e 3f9d1a1a", + "3fbcea25 3ef1d00c bddab58a 3f6fe2da 3f0913b0 be16054e 3e8ae964 -> 3f10c5bc be295fa2 bd3a6b30", + "3eb7da72 3f005fdc 3e7655ec 3f019090 3ed4fe58 3dd0f2b4 3f2a8d42 -> 3ef1096f 3e436510 3f10485e", + "3f9ae898 be71df10 3ee3154e 3d27eba8 3f3b4fa8 3f38e167 be436153 -> 3f6f666a 3f47e0a8 be754760", + "be32f278 bdf4635a 3f8a9644 3f712138 3f63908c 3f1178b5 3f95fa9c -> be974f25 3f96183d 3f66d96f", + "bd1d5ab8 bd259e48 3f4b49b0 3f094db0 bda12248 3f81e407 3dacfcb0 -> bd1f99b1 3f491e18 3f0dbf5c", + "3e807fe8 3f1942d0 3e18d464 3f1d7903 3f60b166 3ec2284a bb7d5000 -> 3f2b304e 3e53ee44 3eeb67b0", + "3f1ab524 bc75fba0 3cfaa560 bc1f7120 3e807208 3cac2050 3ea137ec -> 3e1529b4 3ccb31c5 3e3eea0a", + "3fabfae4 3f87660e 3f6420c8 3f5e429a 3f766fcc bde753c0 3f7cecae -> 3f6e110a beea7826 3f83baf6", + "3e93e12e 3d77cc50 3f9f60d2 3f658324 3f0905f8 3eb2fef2 3d4522c0 -> 3e4a5c74 3f7c8a51 3f26c80f", + "3e63deb0 3f324bcc 3f9c2170 3e7a8dd0 3eacac92 3ea9db58 3ef059d8 -> 3f1dd51f 3f82d626 3e96e261", + "3ec60e78 3d3558e0 3f2d05b8 3f8d4f20 3dbe6a10 3f88127e 3f2a6aae -> 3d814196 3f535d9c 3f6f3723", + "3fae3258 3f4d575e 3f339efc 3ec6af10 3e982f66 3f1b5943 3e5a9da4 -> 3deb8fe0 3f1296a9 3e1a1a29", + "3d122ab0 3f939474 3f6b0b18 3e55afa8 3f60b286 3eb165d0 3f9c5dc3 -> 3f92529a 3f65d22d 3e7ab351", + "3e5ecae0 3e1dcddc 3f77f5de 3dbd5b78 be61ad50 3f995842 3d14e190 -> 3d94bd5c 3f825e7c 3da45ad3", + "3f0d25b4 3d7924b0 3f7edec8 3f94f15e 3f707356 3f8c3785 3eef65d4 -> 3f0b8f5d 3f867b80 3f47a427", + "3f59f366 bd0e4efc 3f81d22c 3f1ea28c 3d978468 3d940ffc 3ee451da -> 3d6cd7db 3e5963de 3ef18a56", + "3f02dc88 3e96454e 3e845738 bc446ec0 3f7e2638 3f8ad562 bde101f8 -> 3f26a4ac 3f2e4860 bd7e0afd", + "3f642e84 3d537c90 be5b21d6 3f35a3c3 3f9e1d62 3efee2cc bdfc04e8 -> 3f8da6c0 3ed7485d bd0575ce", + "3fad4165 3f750fda 3f42f2d2 3d81c4b0 3f8eba3b 3ec2392c 3eb6de7a -> 3f95de3c 3e7a1524 3eec0dc1", + "3efa0d8a 3f74c034 3ef2e99a 3f1ba45c 3f42ea38 3f7ef480 3f236373 -> 3f5c6967 3f3aa7af 3f1f6cde", + "3f8ab3e5 3f93b35f 3f56c960 3f0dc1f8 3cc61d00 3f069298 3f83d052 -> bd8fee1b 3effbb29 3f88e8a9", + "3fa835e0 3eeb9486 be150b58 3d16e750 be0be8fa bdd48d40 3f7eb962 -> bea5efe7 bdb9ae4c 3fa5e406", + "bef9b951 3f75a73c 3e50fbdc 3f743892 3eb1fb46 3eae670e 3f5f9474 -> 3fa10835 3e0cc980 3f7e49db", + "3e359124 3b318680 3e9cd3ea 3e55f056 3f71656a be25193e be6e7eb4 -> 3e2d7dc1 3e64c457 3e05b795", + "3f1dd898 3f845b67 3f2149e9 bc988050 be2526f2 3f007c4d 3f8d8a86 -> 3e981325 3f0d1010 3f2cb7a5" + ] + }, + { + "glsl": "vec3 cultmath_cycles_rgb_to_hsv(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3e174428 3e49b8b0 bdc0f1ac -> 3e478b40 3fbd3717 3e49b8b0", + "3f7609dc 3f9c6f67 3dc6f600 -> 3e52454b 3f6ba688 3f9c6f67", + "be61bae2 3e7d1658 3f2835a8 -> 3f13ee57 3faaf14f 3f2835a8", + "be64d77c 3f80375b 3e6eb8f6 -> 3eca782b 3f9c8e95 3f80375b", + "3f1cb5da 3ef6d524 3f9f8c7c -> 3f31ed1a 3f1cfcdc 3f9f8c7c", + "3ca6bac0 3f676bca 3e27b258 -> 3eb88427 3f7a3c80 3f676bca", + "3ecf81f0 3f81e77f 3edc0540 -> 3eae167b 3f19c464 3f81e77f", + "3f66b538 3e90bed4 3dc22f1c -> 3d1f1006 3f6510e4 3f66b538", + "3ea996fe 3edfb1d0 3f81a028 -> 3f240cec 3f2c44bc 3f81a028", + "3e8bdcba 3f2d1376 3ef2e682 -> 3ed54a08 3f189047 3f2d1376", + "be473623 be66c208 3f24f20a -> 3f2c2d97 3facc492 3f24f20a", + "3f91d22c 3f5c8978 3f033912 -> 3dbe09f8 3f0cd063 3f91d22c", + "3d45d2d0 3f9f175a 3ec03dac -> 3ec20997 3f760d66 3f9f175a", + "bbd59cc0 3f58032e be74e97c -> 3e9855ab 3fa447fb 3f58032e", + "3f187bde 3e8f3fa8 3eea1ac0 -> 3f680782 3f07c099 3f187bde", + "3eeb6e58 3ef407ac 3f08f5c0 -> 3f212266 3e0fe23d 3f08f5c0", + "3f17497b 3f4380f8 3f79de1c -> 3f17877b 3eca0000 3f79de1c", + "3f88a7b4 3f2ef54b 3f3cad4f -> 3f7a0c6e 3eb83ee6 3f88a7b4", + "3eda24da 3efe37a4 3f950761 -> 3f269837 3f225197 3f950761", + "3f87cdf4 3ec27cbc 3f0905e5 -> 3f76441f 3f245847 3f87cdf4", + "3eab3ce0 3f41a2ea 3f523220 -> 3f05abe6 3f17b945 3f523220", + "bd89ecc8 3f9c4bd4 3f7a1f38 -> 3eefd67e 3f870f46 3f9c4bd4", + "3f56bc34 3f391184 3f5ee11a -> 3f4c24b0 3e2db809 3f5ee11a", + "3ef7bfcc 3f9c6c55 3f693d16 -> 3edc0d43 3f1aa25f 3f9c6c55", + "3f84e6e0 3e25b0c8 bda1a17e -> 3d131863 3f89bab6 3f84e6e0", + "3ed679fe 3d6395a0 be7d01aa -> 3d9b1cab 3fcb7f55 3ed679fe", + "3f633884 3f8f8a29 3f9aea88 -> 3f0bc054 3e88841f 3f9aea88", + "3e692a40 3f6ea4e4 3f94c93e -> 3f0a81f2 3f4dda30 3f94c93e", + "3f3f9524 bc473c20 3eaeb468 -> 3f6c2cc7 3f821473 3f3f9524", + "3f94225e 3eed23d4 3deb6d28 -> 3d640de8 3f669253 3f94225e", + "3f192a50 3e730514 3f1cf058 -> 3f53a8cf 3f1ce55f 3f1cf058", + "3f8b8c78 3f68b658 be267ef2 -> 3e11fbcc 3f9316f2 3f8b8c78", + "3e424e00 3ed372ee 3e9e1054 -> 3ed82494 3f0a60d3 3ed372ee", + "3f3aee2a 3f5efaf8 3f80792a -> 3f14b2cc 3e8b8443 3f80792a", + "3f6a14a6 be1259ae 3f4aa850 -> 3f5a4966 3f9401bf 3f6a14a6", + "be3d7bdf be61f962 3e8b1232 -> 3f2dc14e 3fe7fe13 3e8b1232", + "3f10e17e be78aa48 3e4389e0 -> 3f691d90 3fb6ec48 3f10e17e", + "3f94a796 bd9ce4dc 3f022a0c -> 3f6bd5fa 3f887183 3f94a796", + "3f1330d4 be12b080 3f897f04 -> 3f43d65f 3f9111de 3f897f04", + "3f689fa4 3ede5a86 3f7bb49a -> 3f4f8a2f 3f0eed24 3f7bb49a", + "3ec58a08 3f6e7778 3c1fe680 -> 3e87da22 3f7d515f 3f6e7778", + "3f017376 3f915acb 3f3c1764 -> 3ec9b28f 3f0e013c 3f915acb", + "3d44cbd8 3f995a68 3f00b5da -> 3ecc687b 3f75bbd3 3f995a68", + "be2a51cc bcaad030 3f647fe4 -> 3f24ce12 3f97da2c 3f647fe4", + "3f31b76b bdbdad30 39cacc00 -> 3f7af4f0 3f9113a8 3f31b76b", + "bd31d420 3f1035e8 3f533b4e -> 3f0cdc63 3f86bc24 3f533b4e", + "3df75170 3f2ef41a bd29e97c -> 3e979153 3f87c4fc 3f2ef41a", + "be38bb96 3eaec678 3ee978f6 -> 3f07afa2 3fb2a3ac 3ee978f6", + "3f964596 3f2fdb24 3d82ef08 -> 3dbf913e 3f720f1b 3f964596", + "be14e6cc 3e87d03a 3f4d6278 -> 3f182d77 3f97331c 3f4d6278", + "3c588f00 3f07f3dc 3f9d461a -> 3f187d28 3f7d3f00 3f9d461a", + "3f135390 3dc14928 3f9841c1 -> 3f3d6940 3f6bb03e 3f9841c1", + "3f3e72ba 3e2284c4 bce98040 -> 3d25746e 3f84e77c 3f3e72ba", + "be45bc54 3f822a26 be2ccca0 -> 3eac6250 3f984e50 3f822a26", + "3f82699f 3ef6ebe4 3f8395f8 -> 3f549de3 3f07e757 3f8395f8", + "3f0c6296 3e5e5f06 be6f9bd7 -> 3dc4d426 3fb69e13 3f0c6296", + "3e842162 3ebc9c2a 3f0b1df6 -> 3f1a2c44 3f066da6 3f0b1df6", + "ba751a00 3f09b576 3f801c94 -> 3f13b77f 3f801e9c 3f801c94", + "3f465332 3ea1e7d4 3eae2878 -> 3f7dc5e4 3f17815a 3f465332", + "3f4dc31e 3f14e848 3e4b69cc -> 3dd80e8a 3f40bb09 3f4dc31e", + "3ed77306 bd6798f8 3f2eccb3 -> 3f463692 3f8a9975 3f2eccb3", + "3f735364 3f8904a8 3f32b5a2 -> 3e61a61b 3eb21afc 3f8904a8", + "3f69f3b0 be067098 3f88109b -> 3f50016b 3f8fcf15 3f88109b", + "3d795d88 3eece008 3e1e52e0 -> 3ebe9338 3f5e500b 3eece008", + "3f1a8750 3d82ca18 3f6a9fd0 -> 3f45ad4a 3f6e296f 3f6a9fd0", + "bdfb5b7c 3d4fddc0 3f8df6a5 -> 3f24a864 3f8e2a25 3f8df6a5", + "3f2d908d 3ec05130 3e610d88 -> 3d682e7b 3f2d03aa 3f2d908d", + "3d444d70 3f58b59c 3f92cd04 -> 3f0ba953 3f754d68 3f92cd04", + "3c112040 be7181f7 3f9f1f33 -> 3f31b9e0 3f9848b7 3f9f1f33", + "bcb59e90 3f86802f 3f839a9d -> 3efe333c 3f82b35d 3f86802f", + "3f196f46 3f9857ce 3f53b8e8 -> 3ecb8d30 3efe2a60 3f9857ce", + "3f82ecc6 3f22d769 3f52cdda -> 3f6b54ba 3ec197cb 3f82ecc6", + "3ecc004a be3a0092 3f296ca2 -> 3f4802ab 3fa32192 3f296ca2", + "3da3b268 3f626ee6 3dc99f3c -> 3eaca176 3f68ddb4 3f626ee6", + "bd4082b4 bd58526c 3f93ef09 -> 3f2adf36 3f85d962 3f93ef09", + "3e0e24fa 3f253b69 3e6570c8 -> 3eb90698 3f48f14f 3f253b69", + "be299aa1 3f25bea2 3c7d8380 -> 3ebdac7a 3fa0bec0 3f25bea2", + "3ef64de4 bdfe6b70 bd3404f8 -> 3f7a575b 3fa10deb 3ef64de4", + "3f9d4b88 3dfba55c 3eb1a1aa -> 3f775b2f 3f666714 3f9d4b88", + "3f4932ac 3f310ee2 3f8734e7 -> 3f35b30e 3eb0c22c 3f8734e7", + "3f34773c 3f2fa0a4 3d8b1bdc -> 3e259a6e 3f675557 3f34773c", + "be5c5015 3f362692 3f05c068 -> 3eee9726 3fa6b44b 3f362692", + "3f13dbd0 3f54adc6 3f2d81db -> 3ecc6e9f 3e9c0c12 3f54adc6", + "be20b826 3f3a946c bc903ff0 -> 3eb81734 3f9b9092 3f3a946c", + "3e4a02a4 3eb2347e 3f3db9b1 -> 3f1ed653 3f3bdb1d 3f3db9b1", + "be03c217 be1ecbf8 3f263ac3 -> 3f2c1134 3f9e91b4 3f263ac3", + "3f9eddfb 3f8f5da1 3ebcc832 -> 3e12f9e0 3f33f2df 3f9eddfb", + "3f44e234 bdda3262 3e1d06f4 -> 3f735618 3f91bb67 3f44e234", + "3f433f2e be06deb1 3f883e85 -> 3f4a920c 3f8fd6af 3f883e85", + "3f1ef938 3f85a13d 3e86c57a -> 3e839087 3f3f7409 3f85a13d", + "3e67f414 3f5ccd7c 3ec0e1f2 -> 3ebed207 3f3cc497 3f5ccd7c", + "3f5b02d2 3f1fff11 bd531bd0 -> 3dfe957e 3f87b61b 3f5b02d2", + "be60be4f bda7a130 3ef8a88c -> 3f2256d4 3fb9d840 3ef8a88c", + "3ec43b50 3f4fad70 3f8846d2 -> 3f0fde4c 3f23d7d8 3f8846d2", + "3f4bda58 3f9ee3b1 3f95951b -> 3ef20ec6 3eb78e3a 3f9ee3b1", + "be5e1fcc 3d0a6490 3f471852 -> 3f1fe986 3fa3b390 3f471852", + "3eee0bfe 3f8dc3cc 3ce4f540 -> 3e88204f 3f798a2f 3f8dc3cc", + "3f729612 3f4b76b4 3f5253a0 -> 3f7883eb 3e2524aa 3f729612", + "3ee00b6c 3f97ca84 3f0ae6f0 -> 3eb6a404 3f21891c 3f97ca84", + "3f9510df 3e8b599c 3f17de3e -> 3f70a64b 3f442be2 3f9510df", + "3f354360 3f9a714c 3f84b5a6 -> 3ee2efd4 3ed38af7 3f9a714c", + "3e287c76 3f5dd4f0 3f8ee378 -> 3f0b3290 3f5a4473 3f8ee378", + "3f5b0d08 3f177dd7 3f791b2e -> 3f483247 3ec8a1ce 3f791b2e", + "3f0aeb6e be2303c8 3f96a094 -> 3f4114df 3f9150da 3f96a094", + "bdb0cc1e 3f1b9e4f 3d70dd20 -> 3ebc81a4 3f922d73 3f1b9e4f", + "3f0dd674 3f9c83ee bdc86d6c -> 3e808afb 3f8a3e97 3f9c83ee", + "3e705e1c 3f3ac71f 3f8ad106 -> 3f11d1cf 3f489726 3f8ad106", + "3d164b70 bdc06636 3f97dd71 -> 3f2f051b 3f8a22a1 3f97dd71", + "bc713b20 3f0766f2 be3aa4e4 -> 3e96902e 3fac1c34 3f0766f2", + "3f4e1d5a 3e2bf474 3f306a0a -> 3f5d1a08 3f4a9b5a 3f4e1d5a", + "3f27e752 be094547 3f655f0c -> 3f4b6330 3f9326a0 3f655f0c", + "3f923b04 3f6cda48 3f5acad8 -> 3d275c10 3e80f808 3f923b04", + "be6376a0 3ec37674 3dff9380 -> 3edbb05b 3fca7a59 3ec37674", + "be4a72e6 3e35ac14 3f312873 -> 3f18ad8f 3fa4917a 3f312873", + "3f86fe92 3f960d48 3f822445 -> 3e95de47 3e07df92 3f960d48", + "3dcf3410 3f48af96 bd813cda -> 3e9a1de0 3f8a4dbe 3f48af96", + "3f0345ce 3f9117a1 3f9b4696 -> 3f04d8de 3f13c964 3f9b4696", + "3ec7e93a 3f2e0a37 3f4ae5ae -> 3f0bf5ea 3f01e244 3f4ae5ae", + "3f423c34 3ed7bd52 3f8677af -> 3f418b8e 3f195187 3f8677af", + "3f8cd835 bd90dfb0 3db36ff8 -> 3f7a3b08 3f883a97 3f8cd835", + "3f863814 be4c4145 3e3202e6 -> 3f733ce8 3f98594e 3f863814", + "3d0b1248 3f91820e 3f9cc830 -> 3f0327d3 3f78e75a 3f9cc830", + "3cfc4380 3cae0ea0 3f6ec408 -> 3f2b1d13 3f7a2b09 3f6ec408", + "3ee885f4 3f06b41c 3f174ca2 -> 3f143594 3e6d22fe 3f174ca2", + "3f837ff1 3e3ad100 3e9ab834 -> 3f79f3ed 3f5289f5 3f837ff1", + "3e11e662 3e6d9e4c bc84ead0 -> 3e683cbe 3f88f331 3e6d9e4c", + "bda46d3c 3f912a49 3f7eb75c -> 3ef63973 3f890fbe 3f912a49", + "3f90bf31 3d2d78b0 3e919bb6 -> 3f768331 3f766995 3f90bf31", + "3f39dcde 3c7cad60 3edf48ee -> 3f66bdbb 3f7a8fe3 3f39dcde", + "be161a89 3e08e74c 3e81f740 -> 3f0ccd44 3fc9eaa7 3e81f740", + "3f86edbd bd947092 3e4f5cc0 -> 3f759600 3f88cd13 3f86edbd", + "be59ee3c 3b731d80 3e01ed5c -> 3f0f786a 402b595b 3e01ed5c", + "3e894f72 3f454c00 be5ba630 -> 3e80dbc2 3fa3a018 3f454c00", + "3f855c15 be37ee68 3f033f21 -> 3f67d164 3f961140 3f855c15", + "3e8228bc be43f4b2 3eb6f648 -> 3f4d5068 3fc48b93 3eb6f648", + "3ebe8110 3f1cf4bb 3e7d57dc -> 3e8d9353 3f18b287 3f1cf4bb", + "3e762650 3ebb8538 bd788e98 -> 3e5cfbb8 3f953538 3ebb8538", + "3f5116b4 3f6e3e10 3d38f788 -> 3e409dc3 3f7393f2 3f6e3e10", + "3eaf6d46 3f9578e3 3f810c12 -> 3eef7f50 3f34e30d 3f9578e3", + "3f91d970 3f0ed446 3f5f1166 -> 3f6900d3 3f02a68b 3f91d970", + "3f09ebe9 bd94ba10 3f919b51 -> 3f4038c6 3f882be3 3f919b51", + "3edb90ce 3f266781 3eb2845e -> 3e93f6d0 3eed5d91 3f266781", + "3e0dd5cc 3f7d7b72 bd91f6ec -> 3e99cd26 3f8936a2 3f7d7b72", + "bd98f9e8 3f8fe8f0 3f361b93 -> 3ee29c5f 3f888106 3f8fe8f0", + "bd53dca8 3e02e8bc 3f882816 -> 3f23cc56 3f86395c 3f882816", + "3e6de0ea 3f206a04 bc856920 -> 3e89abd2 3f8353a0 3f206a04", + "3f96a95c 3dd4e2b8 3f26fdfa -> 3f6a3262 3f696453 3f96a95c", + "bd7b1800 3f5cefca 3f823b9c -> 3f061b74 3f87b64f 3f823b9c", + "3d842448 bc4ecee0 3e7ccf70 -> 3f3759b2 3f868b57 3e7ccf70", + "bdbdc244 3f31cdce 3db00ab4 -> 3ebe074e 3f911366 3f31cdce", + "3ebcc666 3ec1e9b4 bd188450 -> 3e2ec8ab 3f8c9599 3ec1e9b4", + "3e281436 3e819884 3f924dd4 -> 3f26c9d0 3f5b3cc1 3f924dd4", + "3f200880 3f89a5fb 3ed136a6 -> 3e8ef50c 3f1eb9c1 3f89a5fb", + "be771c2a bc869d40 3f5f794a -> 3f220e34 3fa36272 3f5f794a", + "3d8ca6a8 3d854688 3efbe178 -> 3f2b06d0 3f5e22e0 3efbe178", + "3ef4b708 3f1e5480 3f0d83e2 -> 3ed81cb0 3e68a71f 3f1e5480", + "3e6cfd34 be0f0660 3e950f84 -> 3f4f6bb8 3fbd6896 3e950f84", + "3f46436c 3f9b3014 3e50dfba -> 3e74c89b 3f54ee09 3f9b3014", + "bcfd9290 3eb33ad2 3ea0f1e8 -> 3ef8006c 3f8b517e 3eb33ad2", + "be050255 3dea1ef0 3ed34578 -> 3f177612 3fa84acc 3ed34578", + "be17c6b6 bc9a48a0 3d3ada38 -> 3f0e2fd6 4087f8bf 3d3ada38", + "3f8bdfe6 3f4e7d90 3efdba0a -> 3db1c696 3f0be81b 3f8bdfe6", + "3eff47ae 3f845e94 3f8ff6f7 -> 3f062c48 3f0e83b0 3f8ff6f7", + "3f95da42 3f5b6fbc 3f4d1e0e -> 3cceb080 3ea196ac 3f95da42", + "3f533964 3f958ce0 be04bafc -> 3e57cd36 3f8e3353 3f958ce0", + "3f83c258 3f8f5cd6 3f0c46f8 -> 3e45b623 3f02c13a 3f8f5cd6", + "3e8d0cf6 3f562904 3f1e7046 -> 3edee556 3f2bb246 3f562904", + "3f71affa 3f6d086a 3f158f66 -> 3e220b4a 3ec32a7d 3f71affa", + "3f85bcca 3f581fc8 3ed52964 -> 3de864cf 3f19fdd8 3f85bcca", + "3f811fe6 bd60e5e0 3f93976c -> 3f503ccb 3f86185c 3f93976c", + "3f1422b4 3f014914 3f360818 -> 3f39ea24 3e945be8 3f360818", + "3f9f7c4c 3f941552 be7d8a95 -> 3e207cde 3f996f99 3f9f7c4c", + "3f13cba6 3e675424 3f022b40 -> 3f5db16a 3f1bd3db 3f13cba6", + "3f9f89dc 3f9d5bd6 3f559758 -> 3e239d01 3ea943fb 3f9f89dc", + "3f2d95f6 3e9f1594 3e819d5a -> 3cb8f1b6 3f206c7c 3f2d95f6", + "3f3d69b4 3f998504 be52e666 -> 3e627780 3f95faf2 3f998504", + "3dab356c 3e423ae8 3ef5c77c -> 3f1f3ff7 3f536afb 3ef5c77c", + "3f8218fe 3f5838f0 3f071ada -> 3ddd584c 3ef6259e 3f8218fe", + "3f85993b 3e217962 3e9c4aa0 -> 3f78e4e2 3f5952ba 3f85993b", + "3f361e3e be4ee722 3f9b2ee5 -> 3f4638ab 3f95551f 3f9b2ee5", + "be2edeb4 3f3d640a 3f56cb86 -> 3f043162 3f9a0d50 3f56cb86", + "3f9c5f8a 3eaf239e 3dd13538 -> 3d124c5b 3f6a980f 3f9c5f8a", + "be23a828 3f5440cc be744388 -> 3ea46004 3fa4d377 3f5440cc", + "be073067 3e4ee42c 3f24e4a2 -> 3f184d58 3f9a3c49 3f24e4a2", + "be579122 3e8ee588 3f5b7158 -> 3f1719fb 3f9f6f50 3f5b7158", + "3f846c77 3c8340a0 3ebafb40 -> 3f715f7c 3f7c090e 3f846c77", + "3da605c8 3d60fe00 3f6515be -> 3f2bfe8b 3f70492d 3f6515be", + "3ebe9c98 3f2cd920 3f80b174 -> 3f164110 3f21351e 3f80b174", + "3ed89634 3f4ff0b8 3f691024 -> 3f089750 3f090c86 3f691024", + "bd889606 bd439df8 3f3fcc4b -> 3f29ad30 3f8b64e8 3f3fcc4b", + "3f32780a 3f8ed6b4 3e363b46 -> 3e76ddab 3f572cc3 3f8ed6b4", + "3f0bcd76 3f9565b2 3e754e88 -> 3e8e7773 3f4b74ee 3f9565b2", + "3f9f65e9 3f34d6df 3f9bfc7d -> 3f577197 3edd9080 3f9f65e9", + "bdcabfd2 3f2653be 3df649dc -> 3ec3a7f4 3f9380f0 3f2653be", + "be5ea2de bd0cd390 3f9e6ad8 -> 3f254caa 3f967c6d 3f9e6ad8", + "3f8aff8e 3f7a1644 3ea18c58 -> 3e1283de 3f359dfe 3f8aff8e", + "3f6ba980 be7699d8 bddddd64 -> 3f7b21f4 3fa17c41 3f6ba980", + "3f9853d8 3ec2bb08 3f7e3658 -> 3f5fb74d 3f2e2f39 3f9853d8", + "3d8a405c 3f34fa07 be3dd454 -> 3e927ba6 3fa190b9 3f34fa07", + "3f8ab44f 3f0c73fb 3f47a118 -> 3f6d9080 3efcc5c1 3f8ab44f", + "3ee22d04 3f94145b 3f207aad -> 3ec0c1bb 3f1e3f2b 3f94145b", + "3e8645a8 3ed777b8 3eac1744 -> 3ed269a8 3ec0f066 3ed777b8", + "3e5d5742 3efc9c80 3eb94ec2 -> 3ed789ab 3f0fd851 3efc9c80", + "3ebc3b6e 3f85068d 3f0f4326 -> 3ec30efa 3f257086 3f85068d", + "3ecb094c bd8f3a62 3f27bc22 -> 3f461d3f 3f8da98e 3f27bc22", + "3f064c83 3eadee08 3eeb4cb2 -> 3f64573c 3eb474a6 3f064c83", + "3f82469c 3f164bfe 3f8aed39 -> 3f4f8bcb 3eeb0c54 3f8aed39", + "3eb093f2 3e86877e bd693698 -> 3e07c8d2 3f9521bf 3eb093f2", + "3f1b87f8 3f41d05a 3ef89fca -> 3e84561c 3eb79a82 3f41d05a", + "3edeb0f4 3e6a15ac 3e574572 -> 3c5f40d6 3f0443d0 3edeb0f4", + "3e3322da bdb4e65c bdbce8e0 -> 3b1fe3ab 3fc37de6 3e3322da", + "3e415f88 3f359184 3f3e2b08 -> 3f02964f 3f3eebde 3f3e2b08", + "3f3e4e90 3f453476 3f4b76ea -> 3f144c54 3d84709b 3f4b76ea", + "3f26ca0c 3f1ea94c 3e6f2014 -> 3e1db416 3f243e4d 3f26ca0c", + "3f9a0f65 3e9b1794 bcf67208 -> 3d38446e 3f833308 3f9a0f65", + "3f15012e 3f0b230a 3e4d1342 -> 3e196f83 3f27eaae 3f15012e", + "3db3d1a8 3f4afb88 3df01820 -> 3eae3a82 3f63a6d7 3f4afb88", + "3f1ae492 be3c926b 3f9b13fe -> 3f42caec 3f9374a8 3f9b13fe", + "3f71c6a4 be1ccddc 3f24e4f8 -> 3f610204 3f94c0f0 3f71c6a4", + "3ede1c2c 3f679adc 3f69eb82 -> 3f00cdcf 3f06765b 3f69eb82", + "3f8cdddf 3f83feab 3c723520 -> 3e1fc588 3f7c8faa 3f8cdddf", + "bdc94fe0 bd6ab000 3f60a9e6 -> 3f28dfc6 3f8e5642 3f60a9e6", + "3ecdc084 bd2d33c0 3ef10e60 -> 3f4f997b 3f8b7f08 3ef10e60", + "3f94c88d 3f83fefa 3f51c28e -> 3dd2d13b 3e971515 3f94c88d", + "3f6a2f6e 3dee1964 3f9bd15a -> 3f499c1e 3f678d10 3f9bd15a", + "3f1a126e 3ec8565c 3f9adbfa -> 3f35a458 3f2d3474 3f9adbfa", + "3f9c9014 be65e4da bd152b04 -> 3f7a74dc 3f977e7e 3f9c9014", + "3d10b140 3dc6f22c 3f2f89e3 -> 3f269c7f 3f72cfc3 3f2f89e3", + "be20c69d 3f51e424 be1de0c2 -> 3eaae9f3 3f98830a 3f51e424", + "bd5c5188 3efd227a 3f1cc4fa -> 3f078e62 3f8b3e30 3f1cc4fa", + "be1ae7c1 3d740790 3f8ecccc -> 3f2390cb 3f915b39 3f8ecccc", + "3f90c5b4 3f4d0e4e 3f56abf4 -> 3f7b24df 3e95669e 3f90c5b4", + "bd000d04 3f86a463 3de1b648 -> 3eb5cff0 3f83cddf 3f86a463", + "3eaf4514 bd8ef8a4 3eabec8e -> 3f560286 3f9a1a63 3eaf4514", + "3f7abda0 3e33a468 3f817ecb -> 3f53b06b 3f539ba8 3f817ecb", + "3f0c4076 3f70b524 3f731838 -> 3f00fd86 3ed89ae4 3f731838", + "3f9f42a4 3dbda1b8 3f34a15a -> 3f694a09 3f6cf2e1 3f9f42a4", + "3f2f2d02 3eebdbde 3f611414 -> 3f41764f 3ef3bd11 3f611414", + "3f333e32 3f50b0aa 3f2f1f10 -> 3ea03078 3e24b710 3f50b0aa", + "3f143ef2 be43e153 3ebee1b8 -> 3f60c1e7 3faa4840 3f143ef2", + "3f482218 3e52956c 3f369b86 -> 3f5a6742 3f3ca877 3f482218", + "3f8de11b 3f882585 3f38bd7a -> 3e16e7a7 3eb2aa00 3f8de11b", + "3f7428f6 3f845202 3f10b4de -> 3e47cf8e 3ee80958 3f845202", + "3e03dafc 3ec4267e 3f16e268 -> 3f131b94 3f48124a 3f16e268", + "3f59812c 3f217d9d 3f8c32ef -> 3f3ec408 3ed91f30 3f8c32ef", + "3f60b708 3e9c9ae8 3f95fa96 -> 3f46d98b 3f3d2c22 3f95fa96", + "3f6c8c4e 3f0b8de4 3f909780 -> 3f46530a 3f0475a1 3f909780", + "3e15be5c bd44a618 3e1b741c -> 3f542487 3fa87ae2 3e1b741c", + "3f9411d0 3ed4321c 3f59528a -> 3f670758 3f244866 3f9411d0", + "bc5e9ea0 3e3934da 3f9e2ed2 -> 3f2406af 3f816848 3f9e2ed2", + "bdc398e4 3f23c03d 3f7e411a -> 3f0ddaea 3f8c4f0b 3f7e411a", + "3f7cc5ec 3f4f8074 3f797b90 -> 3f586f3a 3e3765ac 3f7cc5ec", + "3f5f5ac0 3f8f7db5 3eb93c1e -> 3e628956 3f2d61a3 3f8f7db5", + "3d2401a8 3f581780 3f940890 -> 3f0bf04e 3f772305 3f940890", + "3e098d68 3f5d8e88 3f75a0f8 -> 3f04dcb3 3f5c28f2 3f75a0f8", + "be090437 3f8ad5eb 3f8a3829 -> 3effa9af 3f8fca55 3f8ad5eb" + ] + }, + { + "glsl": "vec3 cultmath_cycles_hsv_to_rgb(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f5b1ece 3f61af71 3f2dd99c -> 3f2dd99c 3da4b1ab 3f191004", + "3f2cc699 3f4521c3 3f825130 -> 3e8bb5b1 3e6fbc33 3f825130", + "3efdad26 3ed8edff 3ead29f6 -> 3e479787 3ead29f6 3eab2a84", + "3ebfa8aa 3f77bf0e 3f5d97fc -> 3ce49eeb 3f5d97fc 3e6f98fb", + "3f6a474b 3f2517a0 3f918f34 -> 3f918f34 3ecec1e3 3f46f4f0", + "3f0d8f7b 3e191a4a 3fd43756 -> 3fb47c9f 3fca21bf 3fd43756", + "3f3b1633 3f687cd4 3fe15371 -> 3f46e478 3e258f9d 3fe15371", + "3da4e19b 3b6830e4 3f69c2b8 -> 3f69c2b8 3f69551d 3f68eeb3", + "3f0a3a13 3f16dd77 3fccf998 -> 3f285c0c 3fb00578 3fccf998", + "3f7b693f 3c020a0e 3f48341c -> 3f48341c 3f469d53 3f46c913", + "3eec5014 3f5c431f 3f8d9e25 -> 3e1e28dd 3f8d9e25 3f63033d", + "3f5896d0 3e9a746c 3f4fb2bc -> 3f4fb2bc 3f110abf 3f4aeac5", + "3f26a6f5 3edb2ea8 3fd2b3bb -> 3f71014e 3f80fd48 3fd2b3bb", + "3ea3b46f 3ea8b017 3f11129b -> 3eca59bd 3f11129b 3ec28d36", + "3f25b28e 3ebf7b00 3ff23de3 -> 3f97a59b 3fa232b4 3ff23de3", + "3f799d61 3e8e718d 3e2d15a9 -> 3e2d15a9 3df9dc89 3e04231c", + "3ebcf86d 3f340816 3f981874 -> 3eb489d2 3f981874 3f0827a1", + "3f7a33fa 3eb17cdd 3ffb4b0f -> 3ffb4b0f 3fa42e54 3fb0043e", + "3bd10d8b 3f46829b 3fe0c740 -> 3fe0c740 3ee499f7 3ec9e9dd", + "3f620b72 3e0a3219 3eb91131 -> 3eb91131 3ea01752 3eb1a04f", + "3f355798 3f036d54 3f54ddaf -> 3f02ed37 3ecf2aac 3f54ddaf", + "3f473070 3f69ac4b 3e5bdf7f -> 3e195769 3c9968cf 3e5bdf7f", + "3f612dd9 3d8d83d9 3f2fbad4 -> 3f2fbad4 3f239647 3f2c5bc9", + "3e26d759 3f66e886 3fb8af3f -> 3fb8af3f 3fb4f35d 3e10d067", + "3bc1cdb2 3ed277f7 3f9424c9 -> 3f9424c9 3f32d06e 3f2e7df9", + "3f18ca23 3eddd34c 3fa12ab1 -> 3f36ae81 3f7131e8 3fa12ab1", + "3f02a379 3f109cb1 3f1f4961 -> 3e8a9d37 3f19b8e0 3f1f4961", + "3f3756e3 3f1ced09 3f1c0024 -> 3eb18d7e 3e717e72 3f1c0024", + "3f4c019a 3ef7e820 3f8384b0 -> 3f6b31fb 3f07ad19 3f8384b0", + "3f125316 3f56f4b5 3f86b79b -> 3e2ccac9 3f2c4520 3f86b79b", + "3f07121e 3f449b83 3f16159b -> 3e0b4792 3f02fb8e 3f16159b", + "3f246f6e 3f1c829f 3fd0eab8 -> 3f22622e 3f47b10d 3fd0eab8", + "3f5e1a76 3f5e821e 3f6c226a -> 3f6c226a 3df72467 3f41f293", + "3f56c1f3 3dc37c46 3ed6212e -> 3ed6212e 3ec1b0c7 3ed57283", + "3f3dc54b 3e531981 3fcd1f90 -> 3fb5c541 3fa2d633 3fcd1f90", + "3f5f6935 3f78b05e 3fef8273 -> 3fef8273 3d5ae23f 3fb88de7", + "3ece4c8d 3ed1afef 3f2f31ea -> 3ecee3ad 3f2f31ea 3f0567bd", + "3e7e723d 3ebecff2 3f91efd5 -> 3f6e79e9 3f91efd5 3f37191f", + "3f5e9f9c 3f7e00b6 3fe6804b -> 3fe6804b 3c662e5b 3fb4b434", + "3de3762b 3f7b2ed6 3f5b7076 -> 3f5b7076 3f139c26 3c842195", + "3f17f740 3e9db585 3eeaef19 -> 3ea2917e 3ec24948 3eeaef19", + "3f5125cf 3f22a3b8 3e89340d -> 3e80a6f4 3dc82578 3e89340d", + "3edb48e2 3eba285a 3fccb95c -> 3f8249e3 3fccb95c 3facb29b", + "3f433a11 3f3aafae 3f906788 -> 3f476e64 3e9c64d9 3f906788", + "3e2c65ef 3f2be186 3f705a51 -> 3f6eb72f 3f705a51 3e9df47f", + "3dd0e329 3f799198 3f504d51 -> 3f504d51 3f01818f 3ca774b8", + "3f00e082 3f6c9864 3f8343b2 -> 3d9f3267 3f80c559 3f8343b2", + "3f14023e 3e2cb33e 3f5c397b -> 3f371547 3f4ace8f 3f5c397b", + "3e3c7a9a 3e8eeb1e 3f4a6714 -> 3f44818a 3f4a6714 3f11e78b", + "3f391af9 3f45cfd3 3f9e81ea -> 3f1af3cb 3e901d0d 3f9e81ea", + "3f6a6a6d 3f41abb1 3fe35348 -> 3fe35348 3edd6424 3f8e5918", + "3d058f9b 3e7b2ace 3fc994c6 -> 3fc994c6 3fa1cf8c 3f982321", + "3f7acc85 3f6c9f7c 3f9222a8 -> 3f9222a8 3db0faad 3e5c36ea", + "3f2ad28d 3ee38989 3f9b9c31 -> 3f2d6a94 3f2ce949 3f9b9c31", + "3e0b2459 3f23ec36 3fae284a -> 3fae284a 3f998efc 3efa8fc4", + "3f47316d 3da4189b 3fb38673 -> 3faec20d 3fa52407 3fb38673", + "3dce1561 3f448337 3d0de3c0 -> 3d0de3c0 3cc576b8 3c03e29c", + "3efcb344 3f1b8e43 3de96718 -> 3d3727f0 3de96718 3de3eb23", + "3f6a748a 3c7d4071 3e8eb7cc -> 3e8eb7cc 3e8c830e 3e8da039", + "3f4c9f09 3f220728 3f365c51 -> 3f1ecb04 3e85e199 3f365c51", + "3f3d1979 3f348978 3f97445a -> 3f355a6e 3eb25c41 3f97445a", + "3e38ddca 3f58cfa4 3ff903fd -> 3fe77800 3ff903fd 3e987a97", + "3f2d1440 3e0b0208 3f5a2da5 -> 3f3e3c39 3f3c8f84 3f5a2da5", + "3f2e9863 3dfa7eff 3dcf21b4 -> 3db8212d 3db5cbff 3dcf21b4", + "3f560400 3f560df6 3f75a740 -> 3f75a740 3e21002c 3f725e62", + "3f67a780 3ee2724f 3f87409a -> 3f87409a 3f16ddc7 3f5b21dc", + "3f3ff473 3ecfda74 3ecbc9ef -> 3ea255fd 3e721daf 3ecbc9ef", + "3f31ad17 3f1f584d 3c264e0b -> 3b9f976d 3b7b28d5 3c264e0b", + "3f1a12cc 3ed82196 3e9875b6 -> 3e30341a 3e624301 3e9875b6", + "3f54bcd6 3def2381 3eeb56c7 -> 3eeaf48f 3ecfdbf2 3eeb56c7", + "3f25e6d3 3e38b5f2 3f1530a8 -> 3ef48ed0 3efa9198 3f1530a8", + "3e5bd1ff 3f6db914 3fbd3b4d -> 3f8a9f47 3fbd3b4d 3dd82981", + "3c8afae8 3f7491a4 3fcb1c92 -> 3fcb1c92 3e66924f 3d911c99", + "3f35244d 3dd0e965 3ff1c291 -> 3fdf273e 3fd91941 3ff1c291", + "3e8cdf41 3ed65493 3fa53357 -> 3f7061e6 3fa53357 3f40172f", + "3f777d03 3f2855a2 3fc5804e -> 3fc5804e 3f074414 3f3b14d7", + "3f13c2d2 3c334259 3f92bbda -> 3f9120dd 3f91fd81 3f92bbda", + "3f1c6d59 3d4aa958 3ee867b9 -> 3edce7ff 3ee0be6f 3ee867b9", + "3e20eeb4 3d36c61a 3e298957 -> 3e298957 3e291ae1 3e21f8a9", + "3f15f7be 3f1424a7 3f597db2 -> 3eb743c7 3f18b0b8 3f597db2", + "3f52e690 3f58576a 3d1b823e -> 3d14040a 3bc0ba00 3d1b823e", + "3e490483 3d0b18f8 3ff12263 -> 3fefad95 3ff12263 3fe8f20f", + "3f4259c7 3f1f0f80 3fe854e2 -> 3fa81b7c 3f2ff431 3fe854e2", + "3f3d9853 3f634fa9 3f794f08 -> 3efc4ab5 3ddf82ff 3f794f08", + "3f3c2408 3d2d0263 3f1ba01a -> 3f17be7f 3f150d50 3f1ba01a", + "3e825fd5 3ed67aee 3ed0b80e -> 3ea291bd 3ed0b80e 3e729207", + "3eb8328b 3f2295c9 3fc3bb29 -> 3f0ed867 3fc3bb29 3f364454", + "3ec13a40 3e81f40a 3e58bb36 -> 3e21b8bd 3e58bb36 3e3043f0", + "3f2819d8 3d17979f 3e860b9c -> 3e811598 3e8161f7 3e860b9c", + "3d83f32e 3d6b8d2f 3fe24cb2 -> 3fe24cb2 3fda5103 3fd5491f", + "3f280a22 3edcc032 3f40d9fa -> 3edb67d8 3ee5a51b 3f40d9fa", + "3ebcbb71 3f623dbd 3f038b86 -> 3d74aa05 3f038b86 3e1f9cae", + "3f6ce67f 3da173ff 3f44f174 -> 3f44f174 3f356ad1 3f3c5e0e", + "3f3410f4 3e548cef 3d94621c -> 3d78bccc 3d6b2ac0 3d94621c", + "3f5d2b6c 3f562a7e 3e7beb04 -> 3e7beb04 3d24aaf8 3e5535fc", + "3db0a2b1 3f604951 3c6d37a2 -> 3c6d37a2 3c08efb5 3aeb1823", + "3f6c49e1 3f670bc3 3fa02eeb -> 3fa02eeb 3df9d38f 3f24ce5f", + "3f610328 3e6779e3 3ff18ede -> 3ff18ede 3fbaf423 3fe29c85", + "3f2903b0 3ee492e0 3f975d65 -> 3f2794c4 3f2cd093 3f975d65", + "3f69c4ab 3f0a2749 3fff3816 -> 3fff3816 3f6af960 3fbd40da", + "3f4f9f7c 3f31db61 3f9056ad -> 3f82eae2 3eb03c3a 3f9056ad", + "3cc105fc 3dac718b 3f69df20 -> 3f69df20 3f58f69e 3f562dec", + "3de1d43a 3ebb8c9f 3ea249a3 -> 3ea249a3 3e8e2bd6 3e4dae56", + "3d40a4a5 3ea892d6 3f2e1dee -> 3f2e1dee 3f04f78e 3ee99459", + "3f51b549 3f280852 3f5ae51b -> 3f4eaff6 3e966f48 3f5ae51b", + "3f3a7507 3f0371b4 3f559f0d -> 3f10879d 3ecfdf90 3f559f0d", + "3f7b9a06 3f120582 3ea4c0a5 -> 3ea4c0a5 3e0d8e77 3e20ee74", + "3dfd43bf 3e10d212 3e9eb442 -> 3e9eb442 3e98e9bc 3e88425a", + "3e843b8f 3f4706fa 3ed20681 -> 3e70917a 3ed20681 3dbaf6e6", + "3eddbc3e 3f355a09 3f5fe89b -> 3e8294cc 3f5fe89b 3f20379e", + "3f2a685e 3c487512 3f8a0737 -> 3f8856e4 3f885984 3f8a0737", + "3ec68149 3f647177 3f8347da -> 3de21ac2 3f8347da 3ed16591", + "3ef1dee9 3f57233c 3fc09c4d -> 3e75f42f 3fc09c4d 3fa5cf26", + "3f2a8dd1 3f79d9cf 3f828301 -> 3cc8a29d 3cde2ab2 3f828301", + "3f594807 3f603f97 3f92c258 -> 3f92c258 3e119eb5 3f86dd15", + "3e923fe7 3d74dde2 3f91d627 -> 3f8b9ce0 3f91d627 3f891e3f", + "3f041c50 3f6e8ea9 3feed7bc -> 3e02308f 3fd96663 3feed7bc", + "3e32377b 3f6e2aa5 3ff821c7 -> 3fedeb6c 3ff821c7 3e0a4854", + "3f5607ec 3f2ff704 3f8da6dd -> 3f8da6dd 3eb12477 3f8c0f52", + "3ed1533a 3f43ea69 3f1d0e6e -> 3e137282 3f1d0e6e 3eb6a076", + "3e80dbdf 3f2d5c68 3fa86c47 -> 3f5c7ed8 3fa86c47 3ed9793f", + "3f389e1b 3ec343d9 3f224f2d -> 3ef14bf2 3ec8d107 3f224f2d", + "3f4d07c0 3edce94a 3fc396da -> 3fb32aa9 3f5e65d4 3fc396da", + "3f6a2ab3 3e830b25 3fac4e78 -> 3fac4e78 3f8034a4 3f96c5d3", + "3f2a3339 3ea2186b 3f982bb3 -> 3f4ffd3a 3f510af7 3f982bb3", + "3f26ad28 3e8cc0e3 3f07e9db -> 3ec5196a 3ecc1685 3f07e9db", + "3f14eab9 3f78fdd4 3fb7b91c -> 3d20f3d9 3f403db7 3fb7b91c", + "3f22ab79 3f6ac1cf 3fc6cb60 -> 3e03f7d1 3ecaa76a 3fc6cb60", + "3f011c92 3efbb4fe 3e27b97b -> 3daa8986 3e259388 3e27b97b", + "3f11e56f 3f0d38b8 3ed1e9cc -> 3e3c3b09 3ea157b9 3ed1e9cc", + "3f75a0fe 3d822ebc 3e19c69a -> 3e19c69a 3e10003c 3e12607f", + "3ee42a2c 3ed43fc2 3f18facd -> 3eb31fcf 3f18facd 3f044b11", + "3f5a16ba 3e02a7ae 3f7d3b55 -> 3f7d3b55 3f5cebd5 3f79a16d", + "3e833582 3ef83067 3fa0d939 -> 3f6ddcc5 3fa0d939 3f25c199", + "3f4e3f4d 3f19f19d 3fad0916 -> 3f9bc11a 3f09f6b0 3fad0916", + "3e851286 3f025aa5 3f9d1e6f -> 3f60b8eb 3f9d1e6f 3f1a3ab1", + "3ebfec2a 3e3d6b12 3f532d26 -> 3f2c1cfc 3f532d26 3f35d7f2", + "3e9363de 3f53bee4 3fcaec95 -> 3f21b9ab 3fcaec95 3e8c5117", + "3f16ce1b 3f1dc276 3fc29a9a -> 3f155bed 3f828149 3fc29a9a", + "3f61a0e7 3e5e0624 3fe3c76d -> 3fe3c76d 3fb26453 3fd58c16", + "3e70c19d 3e6c8944 3fe13bed -> 3fcbde0f 3fe13bed 3fad34ec", + "3f0f1c67 3f7489b5 3ec4feed -> 3c8d1fb6 3e8259de 3ec4feed", + "3f1915a5 3e60788d 3fe6ec55 -> 3fb44d73 3fc9298e 3fe6ec55", + "3e975c98 3f4c966e 3e96da17 -> 3de646ae 3e96da17 3d725d41", + "3f455743 3ea69ff0 3f79cb41 -> 3f5b52d3 3f288053 3f79cb41", + "3db6ff17 3f546c2c 3f21a062 -> 3f21a062 3ec6d40b 3ddc1a2b", + "3dce124c 3e7a4d3c 3ffb7fda -> 3ffb7fda 3fe32367 3fbe062b", + "3eefb180 3e47bd6a 3f3bbbe7 -> 3f171d69 3f3bbbe7 3f34bc7f", + "3f4ae3e0 3f2bef0f 3ef21bce -> 3eca4f29 3e1f024b 3ef21bce", + "3e90987d 3f5b46fb 3fcc5d6b -> 3f2597eb 3fcc5d6b 3e6a86b4", + "3f09e2cd 3f7875d3 3fe92863 -> 3d5bbe6f 3fb4b9cc 3fe92863", + "3f1ad63d 3cad4b36 3f01ebc5 -> 3efe5862 3f00313a 3f01ebc5", + "3f3f9d4c 3e7c8b96 3fa567e8 -> 3f90a3fa 3f793993 3fa567e8", + "3ef792b6 3f29739e 3f147904 -> 3e48c849 3f147904 3f0ac47f", + "3f36321b 3da23e47 3f4588ad -> 3f3a1d18 3f35e29b 3f4588ad", + "3e87c01b 3f045aac 3f806eec -> 3f326758 3f806eec 3ef820f4", + "3e9c0de9 3effdc70 3fc9564a -> 3f6be779 3fc9564a 3f497242", + "3ee394d1 3f47de9e 3ff8ee3a -> 3eda524b 3ff8ee3a 3fb834b2", + "3f684793 3f4457a7 3d932f69 -> 3d932f69 3c8932de 3d421dbc", + "3f035df9 3f443887 3f11354e -> 3e07a1b8 3f086cc2 3f11354e", + "3f74b8c8 3ea192ce 3f39ae51 -> 3f39ae51 3efe2b86 3f0e92e7", + "3dd47750 3f41cb7f 3fd4209b -> 3fd4209b 3f978034 3ece2d9c", + "3e72388c 3e2a0418 3f1bcb3c -> 3f10f2ee 3f1bcb3c 3f01ed5f", + "3e6fbef7 3eae852d 3f954947 -> 3f80b08f 3f954947 3f44cd17", + "3f2b6849 3f1df8ef 3f951fb1 -> 3eeaccd7 3ee468fe 3f951fb1", + "3f314358 3f41a6a6 3e6d3c8c -> 3dab0c31 3d671ddd 3e6d3c8c", + "3f7b199d 3f0703d3 3e9e518b -> 3e9e518b 3e15a45b 3e28d1f4", + "3f3c1807 3f7a454a 3f36b186 -> 3e9a145b 3c82d6cf 3f36b186", + "3c41c825 3dc0c325 3ec25cd4 -> 3ec25cd4 3eb15df3 3eb0119b", + "3f703a29 3f328eaa 3f022565 -> 3f022565 3e1d7b76 3e91db25", + "3e5f0bb0 3e70fd4c 3f75d4bc -> 3f641338 3f75d4bc 3f3bfa11", + "3eb99a82 3f071093 3f31546e -> 3ea78ada 3f31546e 3ec84bb2", + "3f6d655a 3f1ba331 3f24f894 -> 3f24f894 3e8159d1 3ed8d0b6", + "3f0ea3bb 3cea3d48 3f33b34c -> 3f2e8fe5 3f31eff6 3f33b34c", + "3e4a2538 3d90b9b6 3ea2ae86 -> 3ea08fb2 3ea2ae86 3e972f80", + "3e50340d 3f46621f 3ea796bd -> 3e8b0663 3ea796bd 3d96dfab", + "3ec79d12 3e5c10ee 3cac4060 -> 3c873bb2 3cac4060 3c93ca64", + "3f6b8b65 3f08445c 3ef4d2d3 -> 3ef4d2d3 3e6502e6 3eb0fbbe", + "3e041911 3e628302 3f2d083a -> 3f2d083a 3f2461e3 3f06c1c6", + "3bbf32aa 3dbc3e4b 3fa9b31a -> 3fa9b31a 3f9aa5cb 3f9a1a00", + "3f238966 3e98a7f5 3f6fe4b8 -> 3f285e20 3f3451f9 3f6fe4b8", + "3d4d2eba 3c859a3d 3e581a1c -> 3e581a1c 3e55a30c 3e5493de", + "3dd2f746 3e9d3611 3e3742db -> 3e3742db 3e21c4ef 3dfdfb02", + "3e71d5e7 3f43ddfe 3e980dd4 -> 3e4f14d7 3e980dd4 3d8eddc3", + "3f4b2b48 3ed8ebc4 3f7f63d1 -> 3f659d0d 3f13301b 3f7f63d1", + "3f4dbabd 3f098eb9 3fe82e13 -> 3fd1f231 3f56d7f3 3fe82e13", + "3e4ab486 3f4efa1d 3f236c8b -> 3f0a9eb9 3f236c8b 3dfa5c45", + "3cd630b4 3f0c6b9f 3f7714dd -> 3f7714dd 3f04d07f 3edf1b2a", + "3e7986c4 3e986f0e 3fb3faf7 -> 3f9b3883 3fb3faf7 3f7ccad8", + "3e76d6a5 3e6f1bf3 3f1cdfa6 -> 3f0c864d 3f1cdfa6 3ef07c55", + "3c09867d 3f6be6f4 3f841b67 -> 3f841b67 3e0404d7 3da5f10f", + "3f28c930 3f6b1a55 3fbafdf0 -> 3df4398d 3e36abeb 3fbafdf0", + "3f61e74a 3e16d989 3ddea64e -> 3ddea64e 3dbdd9a5 3dd4fc8b", + "3d5a85de 3dcd70d4 3f6f8e2e -> 3f6f8e2e 3f5f3795 3f578661", + "3d97ea9f 3e1d643d 3f664c7a -> 3f664c7a 3f52a7d0 3f42e6b5", + "3f5cad8c 3e018076 3e5e73d0 -> 3e5e73d0 3e4251d1 3e599c12", + "3f3d82cc 3ea6970f 3faf1207 -> 3f8f4412 3f6c370f 3faf1207", + "3edcac15 3f4ed144 3f111b58 -> 3ddf05cb 3f111b58 3ec12609", + "3eaff9aa 3f1cd7e1 3fbfe85b -> 3f14a9dd 3fbfe85b 3f234ad7", + "3f7c67ee 3f4e713a 3fb7f54b -> 3fb7f54b 3e8e722f 3ec06e1a", + "3ece1099 3f5ca93f 3e16a05c -> 3ca657c0 3e16a05c 3d954d29", + "3f487889 3e693d7f 3fd7f70a -> 3fc922b7 3fa6c61c 3fd7f70a", + "3f21e80e 3e098860 3f815b8d -> 3f5ff7a6 3f671a0a 3f815b8d", + "3f44b3f9 3f6bd373 3f47b0ae -> 3efffae4 3d7bc8df 3f47b0ae", + "3f5a43ae 3e14130f 3fb54c03 -> 3fb54c03 3f9b14a7 3fb24460", + "3f59ef2f 3f73b432 3f4a2520 -> 3f4a2520 3d1b5991 3f3564c7", + "3d064316 3ec36849 3eaf5da6 -> 3eaf5da6 3e733312 3e58df87", + "3f182c7d 3f0032dd 3fe87b75 -> 3f681f13 3fa6855b 3fe87b75", + "3f1f5dcc 3f13d010 3e68ad85 -> 3dc4a98c 3e05e9b2 3e68ad85", + "3e6e36ed 3ea198b6 3f1c84e8 -> 3f08f794 3f1c84e8 3ed63cdc", + "3f7b1595 3f657f5c 3f2e8a50 -> 3f2e8a50 3d908e09 3e1062ec", + "3eabea34 3f26a011 3ef4136c -> 3e2a6c6f 3ef4136c 3e2f1231", + "3ec9e617 3e950997 3fed09b0 -> 3fa809ed 3fed09b0 3fc14ae3", + "3f1b2f33 3e6b15fb 3ffdfe05 -> 3fc3ae85 3fd8d735 3ffdfe05", + "3f1a72ed 3f78ced4 3f4ef02a -> 3cba0a16 3ea48603 3f4ef02a", + "3e967360 3f14125c 3fa9cc80 -> 3f3db4f8 3fa9cc80 3f0f2c31", + "3f1341a9 3efc1b4c 3fa923af -> 3f2bb635 3f838d32 3fa923af", + "3eb5ab96 3f7403bc 3f597a2c -> 3d22e8df 3f597a2c 3e13a61d", + "3f0c1de1 3f4edbcf 3f38ecc5 -> 3e0dfdda 3f0e7d62 3f38ecc5", + "3e296259 3e246af3 3fa67f50 -> 3fa67f50 3fa64be2 3f8bc388", + "3f3ae159 3eccb4a5 3fd195bd -> 3f9da1e1 3f7b9444 3fd195bd", + "3e4c6465 3f499e64 3d4a82cb -> 3d2afe5d 3d4a82cb 3c2c1337", + "3d4932f3 3f044e94 3f7cc965 -> 3f7cc965 3f20a52b 3ef447eb", + "3ef08e50 3ee9f847 3fa92f66 -> 3f37be93 3fa92f66 3f9b3151", + "3ef011c1 3eda69fd 3e9bba98 -> 3e3297d2 3e9bba98 3e8f53aa", + "3e376590 3f7db991 3f876409 -> 3f7ac36d 3f876409 3c1a0410", + "3f010360 3ea84837 3fffbdb3 -> 3fabaf62 3ffdbeb7 3fffbdb3", + "3ee69261 3f284c12 3fd2beb5 -> 3f1065de 3fd2beb5 3fa975c8", + "3f251ec5 3f203fc9 3ff17ba0 -> 3f34a462 3f5bf15c 3ff17ba0", + "3f6a8812 3f49d738 3fd7c442 -> 3fd7c442 3eb69715 3f833ef1", + "3f608e79 3e6a69d4 3e85a83a -> 3e85a83a 3e4e1ef1 3e7b37bc", + "3e8d14bf 3f604dda 3fd46b2c -> 3f35a839 3fd46b2c 3e526663", + "3e31a121 3eceb3a7 3ebcc1be -> 3eb9a5dc 3ebcc1be 3e611b1e", + "3ec247fd 3e7a9a03 3dfc3c81 -> 3dbe81cb 3dfc3c81 3dcf96ed", + "3e2d9f37 3dd7d40a 3d91182b -> 3d90d463 3d91182b 3d81cdbc", + "3f7ff449 3f62cceb 3f86cebe -> 3f86cebe 3df6051c 3df811ba", + "3e8b9ce0 3ebc88fb 3fd1223f -> 3fa02615 3fd1223f 3f841fb8", + "3f551259 3f295536 3fd4f6a1 -> 3fd4197a 3f1031dc 3fd4f6a1", + "3f26c19d 3e8f3052 3fbe0e41 -> 3f88e756 3f8dc666 3fbe0e41", + "3f7ed708 3f0dfa54 3ea57a6b -> 3ea57a6b 3e13685c 3e1865e6", + "3da6c3b0 3e082c75 3fba775c -> 3fba775c 3fadc8d0 3fa1ab6a", + "3f26a070 3f17b8af 3ee986b9 -> 3e3e3f93 3e58753c 3ee986b9", + "3f07c558 3e45fa05 3f8ce725 -> 3f63528c 3f87f0ff 3f8ce725", + "3ea506f4 3bb88de4 3f965fbd -> 3f959541 3f965fbd 3f9586ed", + "3eb06733 3dfefb0f 3e2becd7 -> 3e168524 3e2becd7 3e17f582", + "3f6ff9eb 3e8fc2c6 3f8d5191 -> 3f8d5191 3f4b470d 3f6914e6", + "3f49ad32 3f252a7c 3fbd72df -> 3f9c0e21 3f0670c9 3fbd72df", + "3ed559c5 3f24b9a2 3f572576 -> 3e996ae8 3f572576 3f11f4a8", + "3cd44068 3d37c1f7 3f91453f -> 3f91453f 3f8bc434 3f8ac0d6", + "3e98e6db 3f1fc8c3 3f98b5b1 -> 3f1a79b8 3f98b5b1 3ee59457", + "3db2e75b 3e364500 3fd95f7f -> 3fd95f7f 3fc6f5f8 3fb2ae60", + "3cba3a9b 3e989711 3e64db1c -> 3e64db1c 3e29f420 3e20a68a", + "3eaa98d9 3f04c75d 3f8341d2 -> 3efcef83 3f8341d2 3efcb6a7", + "3f4eafd4 3ef05de1 3fb14e69 -> 3fa456e8 3f3c224b 3fb14e69", + "3f79e799 3f734af6 3f39a6c3 -> 3f39a6c3 3d1371b5 3e09aed8", + "3e6b0a06 3ef9bd7f 3f8975d4 -> 3f60573a 3f8975d4 3f0cd24c" + ] + }, + { + "glsl": "float cultmath_cycles_rgb_to_bw(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f5f3588 3f522b8a 3f9fc914 -> 3f5cd740", + "3d11b078 3d7bec18 3f8e9be2 -> 3e072632", + "3ec3c334 3f3f415e 3ef7f472 -> 3f268b28", + "3e595bc4 3f2ffda4 3f125ad8 -> 3f13fbd2", + "3f3daaa6 3dc7d700 3f1a909d -> 3e8ab533", + "3f972517 3dd1ceb0 3f7dcfca -> 3ecab746", + "3f5b805c 3e6e4a9e 3f7d5dc6 -> 3ed72413", + "3f9aa9a9 3f28043e 3f64a708 -> 3f4a7127", + "be43a187 3f9c3e06 3c5e5460 -> 3f555495", + "be372540 3ed24fdc 3f4a2602 -> 3ea01fbd", + "be2783e8 3f71cf44 3f15ec10 -> 3f2eda5e", + "be51237c 3f13779a 3f8ec0cd -> 3ee5ea58", + "3f257e60 3f8c382d 3f9a4d90 -> 3f8103f0", + "3f946bbd 3f26d926 3f332ff0 -> 3f436181", + "3f2eeedc be59913a 3f8b96b4 -> 3d939f66", + "3f9943f2 bcf45cf8 3dda5c48 -> 3e76c236", + "bd84d7fc be5dbb22 3f52b69c -> bddfb3cc", + "3f0d6d49 3ef946ca ba891080 -> 3eee61cb", + "3f50d2f8 3f69e236 bdaec5a4 -> 3f5217e7", + "3dd75904 bcbf92d0 3dba15a8 -> 3c47c99a", + "3f59be72 3e9f55d4 3db0cb78 -> 3ed1be86", + "3f71d436 3e00dfaa 3f7e2e60 -> 3eb9a0bd", + "3f9e3764 3f31f386 3f458346 -> 3f50cf6a", + "3f3d0f04 3e91979c 3e8392f8 -> 3ec20636", + "3f849a56 3f72a8e2 3f54b982 -> 3f754b03", + "3d22dd70 3e8cc8ec 3f1e688c -> 3e7fc586", + "3f86bcd0 be0dc115 3f800f7a -> 3e49c92a", + "3f9416e4 3f9168d8 3ec12d6e -> 3f8af7f0", + "3f9bb7b3 3f08b1be 3e54af78 -> 3f27d249", + "3eac6130 3e6b90a6 3f699564 -> 3e9a9d7a", + "3f735a4e 3e952680 3f5e6cf0 -> 3ef24680", + "3f5d586a 3d719080 3db971e0 -> 3e6e2684", + "3eba2d00 3f7d1aa6 3f6963c6 -> 3f59a7c9", + "be1c03e3 3f9b0c8e 3f066993 -> 3f5f2eb5", + "3f15c843 3ee4abfa 3f3fc56a -> 3efeed56", + "3ea1da3e 3f44389e 3f49fa82 -> 3f2c1eec", + "3ed603ec 3f06a521 3ec6fb80 -> 3efc7608", + "3f0bbebe 3e9ae300 be0a3145 -> 3ea53666", + "3eae4782 3f7190a8 3ed9b274 -> 3f4725b2", + "3f7582b8 3f7a64d0 3f57862e -> 3f76d69e", + "3f090284 3f263e2f 3e5c3d72 -> 3f180018", + "3f8df6f1 3f84da5a 3f9f1c47 -> 3f88afa9", + "3f235c8e bda11dfa 3f238fdc -> 3e009131", + "3efb168c 3f6d1758 3f0949d1 -> 3f4e2ac7", + "3f7504c6 3f747a98 bdcc4b06 -> 3f6119c9", + "3e66d588 3ea4cb0a 3ee0f766 -> 3e9ea358", + "3f60d14e 3f268248 3f823c90 -> 3f39b0fa", + "3f2b315b 3f959751 3f743f08 -> 3f86001f", + "3e8c2f48 3e1e6e44 3f9e90e0 -> 3e844018", + "3f40f940 3e8c6954 3ebb10bc -> 3ec3fd7b", + "3f6a5500 3f2793c8 be7528ad -> 3f253fe4", + "be38899b 3f0ffc84 3e9fb5d8 -> 3ec5dbf6", + "3d75a360 3f39da61 3f28a148 -> 3f145ad0", + "3f418cdc 3f6d9092 3f185c5c -> 3f5e0dfd", + "bdccaac6 3f96bb58 3f598dca -> 3f61dcfe", + "3f8d19f8 3f56b9f8 3f18f6e8 -> 3f609db3", + "3f9b7e88 be0a4684 3ebe5648 -> 3e411ad7", + "3f9e2ec4 be2d3a52 3d9f1448 -> 3e16f10c", + "3f898687 3f8ee894 3f3b0f8e -> 3f8a3303", + "3f02d054 3f15d63e 3f221924 -> 3f12ad5a", + "be7ba4c5 3f9131a6 3f65a798 -> 3f52e0e8", + "3cc0ef90 3f533644 3cb071e0 -> 3f18bb7f", + "3f0693fc 3f63272c 3e11f854 -> 3f41b431", + "3f569bb4 bdad26a4 3f588b24 -> 3e3726da", + "3f83ed35 be02ee3c 3f78f1b6 -> 3e4aac1e", + "3e307308 3f04c6b4 3f9edbfa -> 3efe8c7f", + "be153b08 3ed7c76a 3f10e198 -> 3e9f5efe", + "3ec855b0 3f49fc32 3e23192a -> 3f28b259", + "3f9f2e9d 3f6df778 3f12e25c -> 3f787cb0", + "3f6ed34c bb97ba80 3f322b5c -> 3e7b3190", + "3f54cb5e 3f4c89e2 bddfdee0 -> 3f3d8204", + "be65df70 3f40760c 3f8596a3 -> 3f10b5e3", + "3f72b4c6 3f903195 3dd20354 -> 3f81dff7", + "3f140a3c 3ea73fe4 3f99c966 -> 3ee2faa2", + "3e51e34c 3e018574 3f99899a -> 3e61ef32", + "3f46a000 bd37ce20 3f9ab67e -> 3e616e96", + "3eb5e1a6 3f26f04c 3eb214ea -> 3f1127b0", + "3f3d579b 3ed03e2c bdb06bbe -> 3ee24494", + "be3b21d2 3f1cebf7 3dc338d4 -> 3ed0142b", + "3ef9c29c 3cf54850 3f929f66 -> 3e54d35a", + "3f32a132 3f57c0b0 3f2456a2 -> 3f4c25ba", + "3f3252ba be78beae 3ebba294 -> 3a5efc00", + "3f3486ff 3f80a923 3ebd9cc8 -> 3f654281", + "3f96e238 3ef2cffa 3f246388 -> 3f22dc76", + "3f637788 3f06a702 be1ef0f4 -> 3f0dcc8a", + "3f1d4ece bd826fe0 3ed335a8 -> 3deb4e17", + "3e56cc5c 3e5ef4e4 3f39745b -> 3e81570c", + "3f1d7561 3ea7c4f2 3f17e040 -> 3ed0e034", + "3dc90738 be2230f2 3e11ab2e -> bda8359a", + "3f9d08ce 3f9aa84c bde3af52 -> 3f8ef875", + "3f32c62b 3e574de2 3f58b8e8 -> 3eb84f4b", + "3e54067e 3f90b484 3f3bdf42 -> 3f67cfc0", + "3e9e7852 3f422618 3df48840 -> 3f1de785", + "3f1541eb be379bfc 3e4cc360 -> 3c26c30f", + "3f169e96 3eda58c8 bd93bd88 -> 3ed98b2b", + "3f74a6ec 3f8cf00a 3f90bc0a -> 3f89411c", + "be3944eb 3ee7d17c 3eda73e6 -> 3ea1dcbd", + "3f6ecc46 3ce5c6e0 3f87f685 -> 3e97169b", + "3e2f29c0 be2b50bc 3e87bc6e -> bd835968", + "be4e2676 3eb263a4 3f952e48 -> 3e94bd60", + "bcd33050 3f3a7564 3f8600d7 -> 3f174b51", + "3e6d1138 3e6bf910 3c652100 -> 3e5c3442", + "3f85d550 3edcebd0 3f253dfa -> 3f13d7f8", + "3eb8c902 3d612a60 3edb17d4 -> 3e167a11", + "3d309cd0 3f60712c 3e1690e0 -> 3f259423", + "3e8c8708 be64a4d4 3f935b0a -> bc9536b4", + "3ed4afe0 3ec8f3f6 bc1b1400 -> 3ebc9751", + "3e85e570 3f94316b 3f0167da -> 3f6b8b4b", + "3f365022 3f81fcf3 bd8ad5f2 -> 3f5f70e1", + "3f8465f0 be5b2344 3f861e9c -> 3e11f6a0", + "3e60042c 3e858b8c 3e23d11a -> 3e7a79c6", + "3e50d1da 3eb7b6d8 3eaf473a -> 3ea63e00", + "3ece5e54 3ddad244 bd5d1e08 -> 3e220537", + "3f94f9e6 3f947e26 3ed6d456 -> 3f8dc0bd", + "3e70e86a 3f354a44 3e175860 -> 3f1130f2", + "3f9fd704 3f23c278 3ecd7a14 -> 3f40825e", + "3f2a48d2 3f92c376 be46abe8 -> 3f728b82", + "3eba5044 3f221e72 3f9a5bec -> 3f1e09d6", + "3f6cc8e2 3f7673c6 3f52128e -> 3f71c53b", + "3e9533a6 3f44f42c 3eee08bc -> 3f254f7d", + "be2c42f6 be7484f9 3eca7d74 -> be364403", + "3f5900c2 bddce44e 3f85a670 -> 3e36c63a", + "3c92f470 3f8b6aac 3e892b80 -> 3f4d5744", + "3f87004e 3f8f8a2d 3f6b7c82 -> 3f8bdca7", + "3f7487f6 3f006426 3ef6fb62 -> 3f18bbc3", + "3f522986 be651d8a 3e4c6248 -> 3ced3a90", + "3ddc8e18 3f36a21a 3e00ddb4 -> 3f0acd40", + "3f47e838 3df4186c bde27dea -> 3e792438", + "3f7de832 3f8d6c74 3f60a754 -> 3f883f0c", + "3e50f1bc 3f076b94 3f2567a6 -> 3eefcb2d", + "3f459110 be0daaa0 3f16661d -> 3ddc5055", + "3f3b29c2 3f8a8244 3f930ec4 -> 3f8192a6", + "be67523a 3f233958 3f10e6ce -> 3ee5cb13", + "3eb51270 3f7b1664 3f4ced24 -> 3f559d9e", + "bdeec5aa 3f5c4838 be6635b3 -> 3f13099d", + "3e0b620e 3f28a02c bdf22d9e -> 3efba3d8", + "3ef2744e be15828e 3f6fbb28 -> 3d82d374", + "3ebdf3f8 bd87bf86 be46b7b4 -> 3c8f29e7", + "3db66788 3e9a0e16 3f645bb4 -> 3e98d7f6", + "3e831cee 3f8d8c48 3d18a8d8 -> 3f591716", + "bdaad3a0 3f882d9a 3e9ed382 -> 3f43f929", + "3f5f2e1a 3d06f8b8 3f813f80 -> 3e904d7a", + "3da8b330 bcd43978 3f2b5f9e -> 3d41ce96", + "3f156028 3f4bfe14 3ec6fe8a -> 3f38d5cf", + "3f6231c4 3f808446 3f7b8bb4 -> 3f7a1473", + "3f134a4b 3f25c0ec 3f023ad6 -> 3f1f435e", + "be0b0942 3f1b0fae 3e48e2f4 -> 3ed64252", + "3f3eed07 3f7b0248 3ed99872 -> 3f63f76f", + "3f75ac7e 3e1a5c50 3f96c6a4 -> 3ecb3765", + "3f08140a 3ec8b9a2 3f07fd7e -> 3edd0efd", + "3be0ea40 3f449cfc 3f4820c8 -> 3f1b6ee3", + "3e8eb882 3e3f8eb0 3f955d99 -> 3e8dfa7a", + "3e760d84 3e85f262 3f13d8ac -> 3e8f4d3e", + "3c7ce480 be48f78a 3ede83f0 -> bdd8790e", + "3eecb55e 3f91ecff 3e9d4294 -> 3f6f9103", + "3e9877c8 3f3cc837 3e37fe12 -> 3f1a8acb", + "3d9632fc 3f4382a6 3f674620 -> 3f2082f5", + "3e088374 3e11431e 3e8011c4 -> 3e176810", + "3f8ba8e8 3ed77108 be2a9c52 -> 3f055a87", + "3f914ec4 3f94c0ce 3f90ec3c -> 3f93be7f", + "3f8a78dc 3f4d025c 3f550164 -> 3f5ce204", + "bde4eefc 3ea73ca8 be627b9e -> 3e4683cf", + "3f5b5e7e 3eb5ab08 3f1124df -> 3ef42c4a", + "3f886842 3dae374c 3e0b1eec -> 3e98313b", + "3f973116 3f8ca50f 3f0d4d92 -> 3f89d5a8", + "3f817b62 3d092590 3f8b9425 -> 3ea2b2c8", + "be075442 3ed2e136 3f29cedd -> 3ea0f1c1", + "3f3f8dc4 3e5536aa 3f60da2c -> 3ebe2bc0", + "3f60b75e 3f8fd07c 3ec09866 -> 3f823827", + "3e902fce 3ee014e0 3f821594 -> 3ee47b02", + "3f8ab123 3eb5cbb2 3eb2ef2c -> 3f0272e9", + "3f320034 3e3c0764 3e817f82 -> 3e9848ee", + "3f5a4094 3ea5f11c 3f103bab -> 3ee851cf", + "3e8e8060 3f30dd67 3e07cacc -> 3f1016fc", + "3f5cdaa6 3e83ebba 3edb777a -> 3ecc1d30", + "3f047e64 3e4efac2 3e960d54 -> 3e8d312a", + "3f72bb50 be2e93d2 3e0c98b0 -> 3db78260", + "bbe7af40 3f82394c 3f001101 -> 3f431feb", + "3e60266a 3dab1fa0 3eaf6964 -> 3e062e5d", + "3f9a139c 3e855584 3ee7fab8 -> 3ef3278a", + "3f2714e5 3ea68d2c 3f95658a -> 3ee94f5e", + "3f4cf9b6 3f9db71e 3f7ae110 -> 3f8fa450", + "3f84a812 3e7187e2 3f2a4844 -> 3edfc92c", + "3d48dd00 bdba4e7a 3f7599ca -> 3c6fad88", + "3e8dd940 3f56eabe 3f789334 -> 3f3aba84", + "3e8fb854 3f91598f 3f99abe6 -> 3f755e1b", + "3e4c79b8 3de1c7d0 3f2be246 -> 3e2dd9a5", + "be2ae9d9 3f155c96 3eb75ec8 -> 3ed0b44a", + "3f2104fc 3f5731a4 3f167340 -> 3f470020", + "3f8cb34b 3e67da66 be19886c -> 3ec509e9", + "3f948588 3f66195c be3ec8cf -> 3f604788", + "be0f06c4 3f602b4c 3decb680 -> 3f1ada0a", + "3e5c9e80 be407c42 3e8d0f40 -> bd8cc2c4", + "3f32daac 3f3b2e3f 3f9bae5c -> 3f426014", + "3f60be64 3f262d80 3f95d26d -> 3f3c4440", + "3edb18c2 3f774402 bd93c12e -> 3f46cc34", + "3f477dcc 3f9816b9 3e4ac358 -> 3f83cf0c", + "3ec8b9c8 3f4108cc bdcc71c2 -> 3f1d8c61", + "3f840d8b 3f11cf5b 3f7dea00 -> 3f32c4ce", + "3f0f1bb0 bda05a2e 3e10f264 -> 3d95b13c", + "3e11b744 3f97f4c8 be765284 -> 3f5ca638", + "3f10aa5e 3e0e0b02 3e8539aa -> 3e73dde1", + "3f654bfe 3e2ab940 3f9b5fb9 -> 3ecb6e39", + "3f1afc64 be3d2dda 3f896917 -> 3d97c76f", + "3f2cd02d 3f4043c2 3f210aba -> 3f39dfea", + "3f34858e 3e521c90 3f97978a -> 3ec3ae12", + "3ee01514 bd487650 3f8ff6d1 -> 3e0e9a00", + "3ed1d6cc 3d8f4644 3e939252 -> 3e21c7a8", + "3f66ed10 3f04ae2a bdd77b7a -> 3f0e0c5a", + "3f94ee02 3da119cc 3d65bf10 -> 3e9d8cc9", + "3ebf59a0 3f680bf0 3f91f61b -> 3f4f5f1e", + "bdeda7c4 3e9cd9b8 3f4b44b0 -> 3e80e3d0", + "3f9a78ac 3d80a034 3e855580 -> 3ea40279", + "3f290805 3f484064 3f0c95b2 -> 3f3d4e3b", + "bd137988 bd9bf4b4 3f8fbc74 -> 3c9b408e", + "3ebfbd4e 3f778cb8 be7cebdc -> 3f40dc5b", + "3f05670e 3d9cac38 3dea41b8 -> 3e31f22a", + "3f875d75 be03bb6e 3f9c3e10 -> 3e624c0b", + "3e889dee 3f7b826c 3f5e00c6 -> 3f526c82", + "3f38a237 3f69bd50 3f5ed494 -> 3f5e82a5", + "3dec6220 3f7b6ff8 be25d3a6 -> 3f371c44", + "3f686382 bc960d90 3e22a262 -> 3e43fc8f", + "3f9772fd 3f0a8525 3e475b98 -> 3f271246", + "3f8ae305 3f3f9435 bddc6712 -> 3f421682", + "3f2c8455 3f838142 3ed6706e -> 3f688555", + "3ea6afe0 3e488bf8 bdd4c50a -> 3e4ea20c", + "3ed4a082 3e8e1cce 3f4d2174 -> 3eb07716", + "bddda3c2 3ec8e9ee be7dc936 -> 3e757d10", + "3f9889dd 3f10f1e5 3f48facc -> 3f370a6c", + "3f95b80b 3f5dfc10 3f12ea70 -> 3f6908f5", + "3f96a1f4 3e713c8c 3eccad6c -> 3ee52904", + "3f23d62c 3e96f782 3f866835 -> 3ed874b0", + "3eec1536 3e9cc9cc 3f9898eb -> 3ece6570", + "3f36d04e 3ee1f15c 3e341e44 -> 3ef5d5eb", + "3f4eee24 3f2fa102 3f140152 -> 3f344a6e", + "bce55ce0 3e08da56 3dc07500 -> 3dc57271", + "3f0d43e8 3f987b84 3f095f6d -> 3f810758", + "3f389968 3d651f50 3ec55dd2 -> 3e627967", + "be39337c bcd7e870 3eadf604 -> bd064273", + "be280a70 3f774fc8 3f2a5dae -> 3f343c5f", + "3f1fadcc be722872 3f6c8914 -> 3cf77e14", + "3f5eec74 3f944111 3e868a24 -> 3f8427f8", + "3f3e1c68 be5d4758 3ef70d86 -> 3d1c7a19", + "3f1e67cc 3f8ea6aa 3f91df0c -> 3f81645e", + "bd3ca770 3f737ff2 3f8b0adc -> 3f3fb648", + "3ec033c8 3eaabaca 3f74d3f4 -> 3ec651e4", + "3ed918c0 3f783ea2 3e3aed3e -> 3f4bfe02", + "3ee1d85a 3ebc585c 3f6d050a -> 3ed8f1c0", + "be59d3ef 3e52aa04 bd901690 -> 3dc6480a", + "be7160cd 3f12230a 3d91d828 -> 3eb9fe83", + "3eebaad0 3ec01a70 3f17151e -> 3ed15002", + "3e8da850 be2375f5 3edb0594 -> bcc84711", + "3f007e7c 3f9800d7 3f471ee0 -> 3f818e99", + "3d85e204 3ef57164 3dcc435c -> 3eba5644", + "3f5c87de 3f976e0e be315934 -> 3f8224f2", + "3f25a154 3f0463e0 3eb5a406 -> 3f087515" + ] + }, + { + "glsl": "vec2 cultmath_cycles_ramp_index(float, int)", + "tolerance": "ulp-bounded", + "cases": [ + "3f0c9930 00000101 -> 430c0000 3f193000", + "3f31993e 00000101 -> 43310000 3f193e00", + "3f63e358 00000101 -> 43630000 3f635800", + "3f22270c 00000101 -> 43220000 3e1c3000", + "3f297104 00000101 -> 43290000 3ee20800", + "3f9f8894 00000101 -> 43800000 00000000", + "3e6e897a 00000101 -> 426c0000 3f225e80", + "bd89f304 00000101 -> 00000000 00000000", + "3f2549b6 00000101 -> 43250000 3e936c00", + "3f9fc206 00000101 -> 43800000 00000000", + "3f556172 00000101 -> 43550000 3ec2e400", + "3f33d7a2 00000101 -> 43330000 3f57a200", + "3daa3f20 00000101 -> 41a80000 3e8fc800", + "3f3a749a 00000101 -> 433a0000 3ee93400", + "3eed1640 00000101 -> 42ec0000 3f0b2000", + "3e252efa 00000101 -> 42240000 3e977d00", + "bdbb6cdc 00000101 -> 00000000 00000000", + "3efa8038 00000101 -> 42fa0000 3e803800", + "3e9951f8 00000101 -> 42980000 3f28fc00", + "3f6d6160 00000101 -> 436d0000 3ec2c000", + "3f5c5d70 00000101 -> 435c0000 3ebae000", + "3ed125dc 00000101 -> 42d00000 3f12ee00", + "3f8fcdb4 00000101 -> 43800000 00000000", + "3ecab770 00000101 -> 42ca0000 3eb77000", + "bd92575c 00000101 -> 00000000 00000000", + "3dde8100 00000101 -> 41d80000 3f502000", + "3e7617c0 00000101 -> 42740000 3f05f000", + "be2b346e 00000101 -> 00000000 00000000", + "3f546450 00000101 -> 43540000 3ec8a000", + "3edea022 00000101 -> 42de0000 3ea02200", + "3f595b58 00000101 -> 43590000 3eb6b000", + "3ec7d362 00000101 -> 42c60000 3f69b100", + "3f7046a2 00000101 -> 43700000 3e8d4400", + "3f532b2c 00000101 -> 43530000 3e2cb000", + "3eee1d38 00000101 -> 42ee0000 3d69c000", + "3f9044e6 00000101 -> 43800000 00000000", + "3edcaf5c 00000101 -> 42dc0000 3eaf5c00", + "3f89d72e 00000101 -> 43800000 00000000", + "3f769c34 00000101 -> 43760000 3f1c3400", + "3f1803f6 00000101 -> 43180000 3c7d8000", + "be5338d9 00000101 -> 00000000 00000000", + "3f943071 00000101 -> 43800000 00000000", + "3f841c8a 00000101 -> 43800000 00000000", + "3f00fa71 00000101 -> 43000000 3f7a7100", + "3dd501e0 00000101 -> 41d00000 3f203c00", + "be32e301 00000101 -> 00000000 00000000", + "3f9dba2e 00000101 -> 43800000 00000000", + "3f80220b 00000101 -> 43800000 00000000", + "3f62fd4c 00000101 -> 43620000 3f7d4c00", + "3ee6783e 00000101 -> 42e60000 3e707c00", + "3f8324dc 00000101 -> 43800000 00000000", + "3f166996 00000101 -> 43160000 3ed32c00", + "3dc7c2c0 00000101 -> 41c00000 3f785800", + "3f570280 00000101 -> 43570000 3c200000", + "3f3e7494 00000101 -> 433e0000 3ee92800", + "bddfcdec 00000101 -> 00000000 00000000", + "3f51fdd8 00000101 -> 43510000 3f7dd800", + "3e7a1e80 00000101 -> 42780000 3f07a000", + "3ee8e3f0 00000101 -> 42e80000 3ee3f000", + "3e9b41c8 00000101 -> 429a0000 3f20e400", + "3f418b38 00000101 -> 43410000 3f0b3800", + "3e19bde6 00000101 -> 42180000 3edef300", + "3eb4baa0 00000101 -> 42b40000 3ebaa000", + "bd2065b0 00000101 -> 00000000 00000000", + "3e18a2d2 00000101 -> 42180000 3e22d200", + "3e45df02 00000101 -> 42440000 3eef8100", + "3f81c880 00000101 -> 43800000 00000000", + "3f021cb8 00000101 -> 43020000 3de5c000", + "3c597fc0 00000101 -> 40400000 3ecbfe00", + "3f160154 00000101 -> 43160000 3baa0000", + "3f7af410 00000101 -> 437a0000 3f741000", + "3da7204c 00000101 -> 41a00000 3f640980", + "3f46a3e8 00000101 -> 43460000 3f23e800", + "3f74a506 00000101 -> 43740000 3f250600", + "3f622f96 00000101 -> 43620000 3e3e5800", + "3f73fc8c 00000101 -> 43730000 3f7c8c00", + "3f2059da 00000101 -> 43200000 3eb3b400", + "3ebd41ea 00000101 -> 42bc0000 3f20f500", + "3d2bb7c0 00000101 -> 41200000 3f3b7c00", + "be1648ae 00000101 -> 00000000 00000000", + "3e016f0c 00000101 -> 42000000 3eb78600", + "3efa83b4 00000101 -> 42fa0000 3e83b400", + "3e48d662 00000101 -> 42480000 3e566200", + "3e04a0c4 00000101 -> 42040000 3e20c400", + "3f29065b 00000101 -> 43290000 3ccb6000", + "3c3c7020 00000101 -> 40000000 3f71c080", + "3d2f1588 00000101 -> 41200000 3f715880", + "be1aef77 00000101 -> 00000000 00000000", + "be2d259e 00000101 -> 00000000 00000000", + "3ea610b4 00000101 -> 42a60000 3d05a000", + "3d68bf58 00000101 -> 41600000 3f0bf580", + "bd817f90 00000101 -> 00000000 00000000", + "3ebe78c4 00000101 -> 42be0000 3e718800", + "3ed1f6a0 00000101 -> 42d00000 3f7b5000", + "3f8b3c5f 00000101 -> 43800000 00000000", + "3f64c250 00000101 -> 43640000 3f425000", + "3f0e0394 00000101 -> 430e0000 3c650000", + "3f523f70 00000101 -> 43520000 3e7dc000", + "3dd68de8 00000101 -> 41d00000 3f51bd00", + "3f94943e 00000101 -> 43800000 00000000", + "3d7b6400 00000101 -> 41700000 3f364000", + "3ef2af48 00000101 -> 42f20000 3eaf4800", + "3f3cde18 00000101 -> 433c0000 3f5e1800", + "3d4fbf80 00000101 -> 41400000 3f7bf800", + "3f38480e 00000101 -> 43380000 3e901c00", + "3f3165ae 00000101 -> 43310000 3ecb5c00", + "3f87e2d6 00000101 -> 43800000 00000000", + "3ec8a6a6 00000101 -> 42c80000 3ea6a600", + "3f9a6974 00000101 -> 43800000 00000000", + "3f853c03 00000101 -> 43800000 00000000", + "3f03ac68 00000101 -> 43030000 3f2c6800", + "3e4d7388 00000101 -> 424c0000 3eb9c400", + "bd433dc0 00000101 -> 00000000 00000000", + "3eb40848 00000101 -> 42b40000 3c848000", + "bd95d6fa 00000101 -> 00000000 00000000", + "3c892bc0 00000101 -> 40800000 3e92bc00", + "3f9a1cf0 00000101 -> 43800000 00000000", + "bcd95c20 00000101 -> 00000000 00000000", + "3f0cf34b 00000101 -> 430c0000 3f734b00", + "bde64864 00000101 -> 00000000 00000000", + "bdcbccc0 00000101 -> 00000000 00000000", + "3f6a4cde 00000101 -> 436a0000 3e99bc00", + "3edacc40 00000101 -> 42da0000 3ecc4000", + "3f705da6 00000101 -> 43700000 3ebb4c00", + "3e8eeabc 00000101 -> 428e0000 3eeabc00", + "3f4b2404 00000101 -> 434b0000 3e101000", + "3f75a7a8 00000101 -> 43750000 3f27a800", + "3ded44c4 00000101 -> 41e80000 3f289880", + "3f8f1623 00000101 -> 43800000 00000000", + "3f9eb6a4 00000101 -> 43800000 00000000", + "3e17e3e6 00000101 -> 42140000 3f78f980", + "3f870d35 00000101 -> 43800000 00000000", + "3c73ce00 00000101 -> 40400000 3f4f3800", + "3e064c00 00000101 -> 42040000 3f130000", + "3f855bca 00000101 -> 43800000 00000000", + "3f670420 00000101 -> 43670000 3c840000", + "3f8031e1 00000101 -> 43800000 00000000", + "bdd632fa 00000101 -> 00000000 00000000", + "3f28e022 00000101 -> 43280000 3f602200", + "3f9bd056 00000101 -> 43800000 00000000", + "3e4cb04c 00000101 -> 424c0000 3e304c00", + "3f669e06 00000101 -> 43660000 3f1e0600", + "bddc762c 00000101 -> 00000000 00000000", + "3d23e920 00000101 -> 41200000 3e7a4800", + "3f87adf9 00000101 -> 43800000 00000000", + "3f8d978a 00000101 -> 43800000 00000000", + "3f9e01f5 00000101 -> 43800000 00000000", + "be6b1f07 00000101 -> 00000000 00000000", + "3e6ed8be 00000101 -> 426c0000 3f362f80", + "3f522f62 00000101 -> 43520000 3e3d8800", + "3f70886e 00000101 -> 43700000 3f086e00", + "3ea99ce8 00000101 -> 42a80000 3f4e7400", + "3ca984a0 00000101 -> 40a00000 3e984a00", + "bd065368 00000101 -> 00000000 00000000", + "3f81510a 00000101 -> 43800000 00000000", + "3ecad2c4 00000101 -> 42ca0000 3ed2c400", + "be5039f0 00000101 -> 00000000 00000000", + "3f864039 00000101 -> 43800000 00000000", + "3f82c34d 00000101 -> 43800000 00000000", + "3f969206 00000101 -> 43800000 00000000", + "3f7bbe06 00000101 -> 437b0000 3f3e0600", + "3f321d16 00000101 -> 43320000 3de8b000", + "3f06270e 00000101 -> 43060000 3e1c3800", + "3f9bb2d1 00000101 -> 43800000 00000000", + "3f247f0c 00000101 -> 43240000 3efe1800", + "3f3591ff 00000101 -> 43350000 3f11ff00", + "bd8392b0 00000101 -> 00000000 00000000", + "3f891c92 00000101 -> 43800000 00000000", + "3f0f4c8f 00000101 -> 430f0000 3e991e00", + "3e8c8204 00000101 -> 428c0000 3e820400", + "3e87cb38 00000101 -> 42860000 3f659c00", + "3f878020 00000101 -> 43800000 00000000", + "3f1054fc 00000101 -> 43100000 3ea9f800", + "3f15529e 00000101 -> 43150000 3ea53c00", + "3f700ae0 00000101 -> 43700000 3d2e0000", + "3e7fa18a 00000101 -> 427c0000 3f686280", + "3f45dba4 00000101 -> 43450000 3f5ba400", + "3e0c9e38 00000101 -> 420c0000 3e1e3800", + "3f9080da 00000101 -> 43800000 00000000", + "3ed88c94 00000101 -> 42d80000 3e8c9400", + "3f4f2018 00000101 -> 434f0000 3e006000", + "3f706f68 00000101 -> 43700000 3eded000", + "3f90f935 00000101 -> 43800000 00000000", + "3d3fce50 00000101 -> 41300000 3f7ce500", + "3d4e4d80 00000101 -> 41400000 3f64d800", + "3f889542 00000101 -> 43800000 00000000", + "3f48ce44 00000101 -> 43480000 3f4e4400", + "be4f2e48 00000101 -> 00000000 00000000", + "3ebde1d8 00000101 -> 42bc0000 3f70ec00", + "3eca9c64 00000101 -> 42ca0000 3e9c6400", + "3f5b129c 00000101 -> 435b0000 3d94e000", + "3f99f1a8 00000101 -> 43800000 00000000", + "3dfd9834 00000101 -> 41f80000 3f330680", + "3f3bbc17 00000101 -> 433b0000 3f3c1700", + "bc83ab50 00000101 -> 00000000 00000000", + "3f410efe 00000101 -> 43410000 3d6fe000", + "3e01dbe0 00000101 -> 42000000 3eedf000", + "bd97a334 00000101 -> 00000000 00000000", + "3f25bf86 00000101 -> 43250000 3f3f8600", + "3dce4f90 00000101 -> 41c80000 3f49f200", + "3f6ba16a 00000101 -> 436b0000 3f216a00", + "bdb1a9d2 00000101 -> 00000000 00000000", + "3eebd75e 00000101 -> 42ea0000 3f6baf00", + "3f9aba97 00000101 -> 43800000 00000000", + "3e9c938c 00000101 -> 429c0000 3e938c00", + "3f90c417 00000101 -> 43800000 00000000", + "3f823cbc 00000101 -> 43800000 00000000", + "3f2ff986 00000101 -> 432f0000 3f798600", + "3e8f1fd2 00000101 -> 428e0000 3f0fe900", + "3f02b9b2 00000101 -> 43020000 3f39b200", + "3f5f8dc0 00000101 -> 435f0000 3f0dc000", + "3f68c9f6 00000101 -> 43680000 3f49f600", + "3f95bf5f 00000101 -> 43800000 00000000", + "3eb280a0 00000101 -> 42b20000 3e80a000", + "3df01f9c 00000101 -> 41f00000 3c7ce000", + "be52c587 00000101 -> 00000000 00000000", + "3f502aac 00000101 -> 43500000 3e2ab000", + "3e68a8a0 00000101 -> 42680000 3e28a000", + "3f6a80c8 00000101 -> 436a0000 3f00c800", + "3f535488 00000101 -> 43530000 3ea91000", + "3f9661dd 00000101 -> 43800000 00000000", + "bde53620 00000101 -> 00000000 00000000", + "3ee69070 00000101 -> 42e60000 3e907000", + "bdb00d16 00000101 -> 00000000 00000000", + "3f2b2e67 00000101 -> 432b0000 3e399c00", + "3ea00498 00000101 -> 42a00000 3c130000", + "3f2f4d3a 00000101 -> 432f0000 3e9a7400", + "3f8a4c73 00000101 -> 43800000 00000000", + "3eb2dff0 00000101 -> 42b20000 3edff000", + "bd8820e8 00000101 -> 00000000 00000000", + "be023a58 00000101 -> 00000000 00000000", + "3f18d00a 00000101 -> 43180000 3f500a00", + "3f3d6809 00000101 -> 433d0000 3ed01200", + "3f4737c2 00000101 -> 43470000 3e5f0800", + "3f40a4e0 00000101 -> 43400000 3f24e000", + "3f255552 00000101 -> 43250000 3eaaa400", + "3e6a0ee8 00000101 -> 42680000 3f03ba00", + "3f963e9e 00000101 -> 43800000 00000000", + "3f7db320 00000101 -> 437d0000 3f332000", + "3e2d72a4 00000101 -> 422c0000 3eb95200", + "be4d3bcc 00000101 -> 00000000 00000000", + "be1cad0a 00000101 -> 00000000 00000000", + "3f44a484 00000101 -> 43440000 3f248400", + "3f8e1b9e 00000101 -> 43800000 00000000", + "3f45c074 00000101 -> 43450000 3f407400", + "3f992452 00000101 -> 43800000 00000000", + "be5e6db9 00000101 -> 00000000 00000000", + "3f83395b 00000101 -> 43800000 00000000", + "3ebb7048 00000101 -> 42ba0000 3f382400", + "bd76bf8c 00000101 -> 00000000 00000000", + "3f987229 00000101 -> 43800000 00000000", + "3f932668 00000101 -> 43800000 00000000", + "3e8515a2 00000101 -> 42840000 3f0ad100", + "3f89357f 00000101 -> 43800000 00000000", + "3e3418e0 00000101 -> 42340000 3cc70000", + "3f48482e 00000101 -> 43480000 3e905c00" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_blend(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f48ae12 3e97daa4 3e948d8c 3f9f23bd 3e48ebd4 3f97f04a 3db44c74 -> 3e5f2201 3f7e430e 3eace404", + "bd1e54d0 3ec6908e 3cd7b6a0 bda4f096 3e111bf0 3f589b70 3f38aea2 -> 3ecb6f84 bbaf8888 bde46d44", + "3f6bb930 3f63ad70 3ef8ee12 3efe483e 3f46a37c 3f89f77e 3ebd696e -> 3f48f04b 3f83f7dc 3ec28cc8", + "3f1ec152 3ec87bd4 3f38e5c3 3e8f3b74 3f68da84 3eedc184 3e236fc4 -> 3f367ab6 3f0ff4d2 3e522b98", + "be34d7a6 bcdb6cc0 3db229c8 3f6afd0c 3eb46314 3f9c2e59 3f976962 -> bdbff8e3 bde7aff4 3f5f0232", + "3fb46446 3f223676 3f7f6ba6 3f9c90da be0cbe18 3f812598 3ed820fe -> bee7f730 3f81bc20 3dc106e0", + "3eed27e0 3efe057c 3f83735c 3f641d96 bd9145c8 3f650984 3ebf9246 -> 3e6f1344 3f773730 3f26d230", + "bdc8613c 3ed3ab8e 3f81b359 3d3c7818 3eb22e78 3e264ddc be0239bc -> 3ed6f25c 3f8c5b55 3d80f007", + "3fafca45 3f516104 3f36a9bf 3f096072 3ef1ffa2 3f96d6cf be160e2a -> 3eb000ee 3fad0e8e becd9f3e", + "3d584e70 3f983c3e 3e80c9c2 3f850ab9 3f603ebc 3f49dbdc 3f62347c -> 3f961df4 3e8f4e92 3f83fd29", + "be22daca 3f3d0b63 3f06026c 3f29d302 be3970c8 3f99521c be0777db -> 3f627b92 3ed51be2 3f4a3807", + "3fae2773 3f71ff0c 3f238024 3f3b033c 3f51d73e 3f848967 3f987057 -> 3f463f07 3f96d968 3fadb04b", + "3f69be6e 3ea5bd10 3f1f358a be7b96c6 3f4ec93c 3f87b09a be6463fc -> 3f440354 3f82d05c be66684a", + "3fa08e4c 3d0c1e70 3edf8284 3f23d0aa 3f8a4ec8 3ea32812 3d6cb470 -> 3fac5f20 3e93ce5e bdb8dde0", + "3f136302 3f0681d6 3f8d0411 3e9b3114 be134965 3f3d94a8 be510060 -> 3e0f78f0 3f64ce12 3c35bb40", + "3f8886ed 3e75911a 3f21f480 3e8ee6da 3e5bbcfc be7ac1e2 be762f12 -> 3e5a0480 be9b4f28 be8ccfd4", + "3faa4151 be335995 3f872e9b 3f672892 bddb2988 bdb321c8 3f1ad4da -> bdad192b beee122c 3f01a26f", + "3f2777f0 3f612f58 3f847d92 be3a29fc 3f7a7aa8 3f5b4d7c 3e428622 -> 3f71bb53 3f6b1975 3d7b7d08", + "3ee0c3f6 be26fb5f be67f6a0 bc3e70e0 3f21102f 3f87ab61 3ead61d4 -> 3e3d256b 3ead2aa4 3e118ce8", + "3d7519c0 3f497802 3e35aac4 3f36a998 3d37e270 3f929063 3f914238 -> 3f3e19ce 3e70f54f 3f3d1dcd", + "bec6b9fd 3f9ea085 3f39a6e2 3eafb3fa 3f8708d6 be6e34ea 3f98b9bc -> 3fa7c8c0 3f8c698e 3c5925c0", + "be622916 3f21640c 3f7ca818 3f7002c2 3e1fe10c 3f33f66e 3f987827 -> 3f3c3535 3f865b1c 3f61abba", + "3f838c55 be3bcc04 3e708c28 3e02cbf8 3f912396 3f5b1e60 3e6203a0 -> 3f95d020 3f5f8690 3e64a752", + "3d184280 3f1bf228 3d26d310 3f55df10 bd6073ac 3f2bc352 3f33e4c4 -> 3f15a0a4 3d83640e 3f549bb9", + "3e5e5ddc 3f20f284 bd781064 3f8c8e54 3c8f6010 3f38506b 3f081fb4 -> 3efdf087 3ddf1994 3f79a087", + "3f829ede 3d754430 3f399b84 3f96347e 3f56dab6 3e7cb840 3e7ac4c4 -> 3f5af074 3e72b19a 3e674d1c", + "3ee24da0 3d15a410 3e9a06f4 3e645fae 3ddb02a8 3ecb813a 3f062ab6 -> 3d8a8d5b 3eafe56d 3eb651cc", + "3f4b3958 3f98a3d4 3eabed34 3e24dbec 3d202668 3f2a0387 3f6e5722 -> 3e8dc332 3f18afae 3f45b3a2", + "3eae27b0 3ede7360 3f41faec 3f5c18e6 3eb15ee8 3e763ad0 3f6be6b4 -> 3ecf1ded 3f14efe1 3f617911", + "befed140 3f4c291e 3f8b730d bde415f0 3f9dd301 3ed1a134 be7a6f33 -> 3f14ac98 3fb6c4f5 bd38a604", + "3f967b28 3f428786 3e512808 3d36c768 3eb7e0a0 3f9ce7dc 3f724602 -> 3e93d73b 3fb3df2a 3f8d68c2", + "3e86ea6a 3f7d69b6 3eb98e48 3f8b4c38 3cc056a0 bd922f84 3f514696 -> 3f3c387c 3e7e0f7e 3f822a24", + "3f3f8e7c 3f5a8860 3f2fe5ac 3f9d3c4d be46cc70 3f59c890 3e853ed4 -> 3d8e95a0 3f4f3d44 3f01039d", + "3f8011b7 3f9bd04c 3d8280a8 3e78ad08 be798292 3f12ca7e 3ee8d728 -> be7a5198 3f12dc8d 3ee8e62c", + "3ef8830a 3eec3ac0 3dacd550 3dfdd298 3f9e7801 3f04c682 3f76b246 -> 3f569e49 3e9720b5 3f081172", + "3d9d56c8 bdf29b42 be08d5ee 3f6e1218 3f3033cf 3f9e0890 be452416 -> bd6758a5 bce98f44 3f57fe8f", + "3f426aa2 3e14cf20 3f82c03b 3d9565f8 3d7d4a50 be157f92 3ea18d58 -> 3da7c644 3e0a17d0 3e83ac86", + "3fb66b29 3e1c01b4 bdb7dac2 3f96ac8f 3f4f0808 3f3ec4c9 bdf30eba -> 3f8b3bf5 3f8cd265 bf2b6a70", + "3f63de92 bde03098 3f86a09b 3eb4a1e8 3ece0a74 3e7769bc 3f8ab362 -> 3eb13dc2 3ea94984 3f806bfa", + "3e519720 3ce58f60 3f36de1c 3d112b30 3f28f38e 3f8d4a28 3e81d574 -> 3e2124f3 3f4b46c3 3da40642", + "3f4bcfb6 3f121b28 3d466838 3ebc3228 3f5db770 3e4fa1c0 bd8dab34 -> 3f4e4d6e 3e2f6a60 3ca2b430", + "3f6de66a 3e959f3c bda40bec 3f71cab8 3ef054c4 bde2d8bc 3f0b9067 -> 3ee9eaf0 bdde680e 3f12cab8", + "bdb42088 bd9b4ff0 3e4984d4 3e379fe4 3f8300dc 3f55141e 3f23d934 -> be30a9b8 3e104798 3e0e2197", + "3fbe771d 3d844a78 3ea78246 3d12e960 3f3e36b2 bcd5f930 3e2a0e8e -> 3f897c26 be4b4a98 3e6b1f6b", + "beafec89 3d6a25a8 be5997cf 3f26e118 393cb000 be409038 3e6313d4 -> 3d9d2c6f be623177 3f4cb694", + "3f7131b0 3f8e4f12 3f0f400a 3f98a84c 3e95b8b2 3f99a9c8 3f9c3d0f -> 3eadfbfc 3f94eb22 3f9c080a", + "3f76e314 3f61c2b2 3f28863e 3f976d6c 3dd1ac30 3e93acbc bcfa13a8 -> 3e054020 3e9a6a7f 3c4fa080", + "beb91968 3e88f9d0 3f8d955e 3f62f1d4 3cb00650 3f5d1184 3f3b291d -> 3eb684b0 3f98cef7 3f7153d4", + "3e3309dc 3f78a560 3da753f8 be01fd05 bcacf8c8 3f81e37b 3f346584 -> 3f4c3a22 3e7ab756 3c973920", + "be3f0e96 bdf0dc50 3d2e99f0 3e607a5c be30dc27 3d965b88 3ef46f5c -> bddbcdac 3d171235 3e2f25e0", + "bdab0174 3f63212c 3e725d7e 3ef64ac0 3f61c090 3f2b5f16 3e122172 -> 3f633e9d 3e4d5d7a 3f0260cc", + "3ed211a2 3f6b3ae6 3dd29df4 3ec80258 3f6f79d8 bd5abbf4 be723cb2 -> 3f6cf8dd 3d1ea934 3e0881c2", + "3f9c18f7 bd8c8570 3f81f7a1 3f9d45cc 3e4b29b4 3f3d9bd8 3ea6a6d8 -> 3e839760 3f2e2be2 3e024828", + "bea0134a 3e69562c 3f88e7ed 3d8220f8 bd839b36 3e882934 3f1cfd0c -> 3ea36e50 3fa9110f bdddd7c2", + "3f552850 3ebb393e 3f36bc40 3ccd9200 bd0f5138 3f3df7b4 3f854f4e -> 3d0353e8 3f3cc1db 3f5f132d", + "3f2c7a50 3f1e935c 3e1f31d6 3ec77f48 bd64d928 3ead4182 3f89659e -> 3e28668c 3e8eb2f0 3f59af10", + "bedc3961 3f9d4b60 3f3b7f93 3e963cc0 3f5172b6 3f30f4b0 3e481f44 -> 3fb3e802 3f40086f 3eabd1c2", + "3fb7a36e 3e8df4ba 3e764bf8 3f60fe8a 3f152f9a bdc8dde4 bda00738 -> 3f372e55 be7b25f6 befcfef4", + "3ec21f00 3ed58f0a 3e2b8500 3f3233f6 3e1d29f4 3f478b50 3f6ee860 -> 3ea2621e 3ecc8e58 3f4937ff", + "3e734c20 3f23977e 3deca4e0 3f386eec 3ee8b918 bce5b908 3e2326da -> 3f185ebe 3da6c5f9 3f164dca", + "3f15254a 3f1c22cd 3f16cbf4 3b8c0000 3e1bec5c 3f00882f be25c6de -> 3eafc33f 3f09d344 bdbd82d0", + "3e294ee4 3db2823c 3f8292df 3ebc33c8 3f531fea 3e2bd4e8 3f4c6918 -> 3e562060 3f61126d 3ee0adec", + "bec3a4a6 3e64a508 3ecadc0e 3f21db52 3f171370 3f5e9f84 bcedfc80 -> 3daa32f0 3e5c7ad3 3f628be8", + "be6bc0e0 3f9e759a 3f718bae 3f8533f8 3f4f1570 bde0e920 3f3fcc36 -> 3fab1a59 3f97d07b 3f8dca9d", + "3e92a8b0 3ebbd5ee 3f52af74 3de8b144 3ef044f0 be5b0796 3ec7325c -> 3ecadadc 3f06a6ad 3e452301", + "3f873a60 3f66c70a 3f1fe688 3e38d20a 3f265c14 be2a3cbd bdb79956 -> 3f22b8da be57f7d0 bdd6d700", + "bd761030 3ecb7704 3da0d08c 3f142a92 3eb92c30 bdec05be 3e5bf010 -> 3ecc9055 3db8a77c 3f19c39c", + "3d5e8500 3f782696 be25b19a 3f8ea48e 3eb4656a bd7c6658 3eb82042 -> 3f6f91dd be201ec8 3f8964f0", + "3f299f76 3f654046 3e5ac040 3f17e5a8 3eb94aa6 3ead8426 3f945fc5 -> 3f0abce4 3e97dfdc 3f77dfb8", + "3f90438b bd589b60 3b81ddc0 3dd7eb90 3e06dc7c 3e233fac 3e2f2ac8 -> 3e1ee0a3 3e3779c4 3e37b4de", + "3f1882f6 3f82c3bf 3e4e9b44 3f985bae 3f492eb2 be41f2e6 3f8faa4c -> 3f6193e6 bd001838 3f932de9", + "3f1eea44 3f1d719c 3e58f578 3e49fd5e be7a71b1 3e91a062 bd9b77d0 -> 3da6bca0 3e8389f7 3ce2c858", + "3f325b2e 3f3c1bdb 3e7f3430 be0840f2 3f8c8240 be61dbcf 3d39ff70 -> 3f7cd6b5 bd9fe890 bc0edcb8", + "befbedf8 3e24d9e6 3f564eda 3d1b6c18 3f3eaebe 3a9a9800 3eb823dc -> be0155d2 3f9fce0a bdf679c0", + "3dcd8d00 be33a6a8 3e64b484 bca420f0 3f79af5e be533ab6 3f580c04 -> bd758504 3e388ce8 3d888ea8", + "3fb714ba 3f62ecca 3f9648e0 3f510404 bdfa4d60 3ef97712 be5fe068 -> bf0e66e2 3e444410 bf29ff58", + "be010724 be7e353a 3e159940 3eb6837e be483877 3f7c2e84 3d95076c -> be828159 3d256180 3ec8d106", + "3ee6467e 3f809b58 bc3c9470 3e91653e 3e051b7c bdfeaa28 3f10db76 -> 3f1c7f20 bd7f03f3 3ed24dce", + "3f25c15c 3f1d57f6 3f67009c be56002e 3f879afe 3f0342ab 3e0fa9e8 -> 3f671211 3f266bda 3c8ca4c0", + "3f0dcf0a 3f9e881e bd05fa10 3cf686c0 3e767b7a 3ea90a04 3f33254c -> 3f2f9035 3e2c55b5 3ecd584d", + "3fa61f61 3ea67698 3e99d782 3f784e2c 3f0acd84 3c660440 3f79b81a -> 3f1b5a8c bd91f608 3f7a23e5", + "3d3afb50 3ee1d116 3f6e7502 3f30bcdc 3e883d92 3d171008 3f7ceaca -> 3eddba44 3f6400a6 3f34371e", + "bd96ae60 bc782360 3f722c5a 3f18687f 3f95834c 3ce611c0 3eac9c26 -> bdd14e2f 3f81bb27 3f1d458f", + "be0ce644 3cb224b0 3f46840e 3d8c02cc 3f9cbc70 3f641d6c 3f3d7362 -> be133318 3f42716e bcc51164", + "bef6f973 bd91d076 3d9c6c48 3f505304 3ecf5300 3f1f7ba2 3f1d2b5d -> be9a0b8e be3fc826 3f68fffe", + "3ecff3b2 3f7021ee 3f106473 3f56795c 3f8e4955 3f57235c 3e4e34f2 -> 3f811754 3f2d204e 3f144d5a", + "be89818e 3f9c45cc 3eb38632 3f0b1730 3e6746a8 3ecdff64 3e61ee80 -> 3fbe7a66 3eac6a11 3f2146b7", + "3f95f5dc 3e8ae80c 3f2f4bb8 3ea5308c 3d554748 3de6b9c8 3f539a40 -> 3c6cde60 3c6db340 3f69bc5f", + "bdc393b8 3f4667b2 3f26cdd2 3f1154a4 3ebef54a bc6ed220 3e15854c -> 3f503bf1 3f3716ed 3f1ba3b8", + "3e3b6334 3f1ae779 3f9034ec 3f8e3aa4 3f29f55f 3dfdfb60 3f63e444 -> 3f1da8b8 3f7171db 3f890da9", + "3e6a9d70 3e071f94 3f80f792 be46304a 3ee01a64 bde9f94c be1b6a5e -> 3e4edb0f 3f4022e8 be3c637c", + "bdca6f70 3e3303d4 3f466928 3f3fa734 3e7476ea 3e89ef86 3c1c6aa0 -> 3e2c8baa 3f5334a2 3f525b08", + "3f858bf2 3f2441d2 3e76eaf4 3dd2a860 3e8548d2 3f84c88f 3e0144f0 -> 3e79a626 3f89332d 3e024e84", + "be90ba0c 3f94cb50 3ca496d0 3efa3008 3f1adea4 be47505c 3f694cd0 -> 3fa8f71e 3da57550 3ebd03b2", + "3ea46052 3ef2b284 3f2ea1e8 3f4fdc4c 3ce808a0 3f14975c 3ee9e68c -> 3ea96f94 3f2645a1 3f32ac8e", + "bea0dfa9 3f6d5c94 3e8848b2 3f5d4742 bcbd33c0 3f3a74d6 be7d6d9c -> 3f9ce664 3df7bc16 3f9b5b37", + "3e99bca2 3f903255 3f88d6b8 bded18aa 3f774cf4 bde882ba 3f1ad0ae -> 3f8a06f8 3f36c630 3dcdfbbc", + "3fb9c3c5 3f22af19 3f42203c 3e1d43d4 3eac5c9c 3f039309 3e090d26 -> 3e4e9fc6 3eceb0fa 3dffdbc4", + "3e0106c0 3f3cca6c 3f115be8 3f8a9747 be2dac4a 3e3f625e 3f6f6170 -> 3f1f8827 3f051279 3f88359c", + "3f8cefcd be20e300 3f97e574 bd2228b0 3f706068 3f4d7e66 3f44a5ca -> 3f865e3a 3f438f12 3f598bf7", + "3f8f437e 3f9ccb32 3efa1b94 3d08e070 3d71c478 3dfd6518 3f501380 -> bda3db50 3da4501c 3f67de58", + "bee77ac2 3e4ddd1a 3eb57634 3f6391ae 3f959e20 3d67c228 3ecdfcec -> be723600 3efa6795 3f8df1fc", + "3fa47170 3f9640d6 3ed116ae 3f7111f6 be3beeb5 3d957fe0 3f6b7adc -> bf11eae4 bcb83990 3f69e368", + "be7cf482 3f72c870 3f840c5a bdd3f45a 3e95387e 3d8a1950 3f263f08 -> 3f8e29bc 3fa28919 be943670", + "3f9b139c 3f90f144 3f963fbb be644dc9 3eaae288 3f8b1572 ba7e5300 -> 3e28c838 3f88b8d1 3d3c5d0c", + "3f36cb9c 3ca24e60 be04f449 3ce240d0 3e0f9996 3f122fca 3e3bfd34 -> 3dd8ad32 3ebdc20e 3e0e51e0", + "3e5c6620 bd15f314 bd66320c bdb53a96 bdf51c5a 3e90c5f2 3f8e5ec6 -> bd5f2ff9 3c8942c8 3e2e0805", + "be8c9bca 3f073f92 3e8996fc 3f5f5c14 3ef59cd2 3f8c9577 3f465314 -> 3f0aaa4c 3d278c6c 3f663c28", + "be06603e 3f34f516 bde79b6e 3f824004 be465a1b bdb15c52 3b148d00 -> 3f533606 bdeeb9c9 3f934de3", + "3e843752 3edc7748 3f5ca522 3f15cafc 3e6144f8 3e1cf82c 3e3645cc -> 3ec09ec5 3f2dccf4 3ef5c1c8", + "3f84f4d1 3e9390d2 3f29fff1 3f6d1dec 3f408032 3ef8f720 3f673f02 -> 3f451900 3ef570bc 3f6704d0", + "3f5034d8 3f567bd4 3f9e1464 3e24ff2a 3f847019 3f49817e 3f5d57d6 -> 3f7f77c7 3f5ee931 3f3bb882", + "3e9c5d3a 3f27b3f7 3e1e41e4 3f8d516d 3f9e7ffb 3ef2daac 3ec49582 -> 3f554c4e 3e812158 3f625672", + "3f157c7c 3f9ddb2e 3e8523fc 3dabe764 3ed0b6a8 bd8caa06 3f9bdf33 -> 3f404b9a 3d8b71d4 3f3efa2c", + "3f6086e2 3ea9ef7c 3f138db0 3f690b36 bdf6d892 3f2f2c18 3e87acb6 -> bd84edf4 3f2bc6d8 3eb04bd6", + "be382f26 3f5acb8e 3f991f14 3f7a4e38 3eb95ebc 3f8f8a0a 3f0aa654 -> 3f717a6d 3f9ad84d 3f8731c4", + "3fa9a62c bdc8e1aa 3f1b403e 3cb12900 3ec0a5f0 3ec67970 3f9b78e4 -> 3f07d63a 3ea205bf 3fcd28df", + "3f99afc9 3eea2950 3f3b2822 3e6d4520 3f6dd0b4 3f85a359 3dba8ee0 -> 3f83059e 3f8dad59 3d80c44a", + "3e75b59c 3e1db7ca 3f17a100 3dc126ec 3e9c21a2 3f6f809c 3f99e13c -> 3e42cd12 3f2cb6d6 3eb8653f", + "3e32c078 3ed1362e 3f003495 3f67bb44 be16aa6a 3eb302f6 3de95e68 -> 3e9f8a78 3ef2e65a 3f445f41", + "3f9df047 3e554946 bdfd5ae2 3f205098 3f1a5942 3f8bd237 3f31a41b -> 3f31fa7a 3fb03a72 3f35b18d", + "3fa3370b 3f6751c0 be403170 be5fde8d 3f4b2e08 be7ccd89 3f80eebf -> 3f43702a be86bd24 3fac1a5d", + "3faa9764 3f8c32c8 3edb73dc 3e4d50e4 3f63e566 bd9bdc08 3f6f651c -> 3f526d40 be79e76c 3f96fc8a", + "3ede4ef2 3eb53a4c 3f22295a be4585cb bd83643c 3f16e3db 3f1cf52a -> 3e308dcb 3f1d447b 3e20d7b1", + "3f530b9a be13d158 3ebb9c0a 3e8bfb24 be59130e 3f59c5fc 3f9ccfa2 -> be4ce9a4 3f440104 3f876b71", + "be2bf386 3f1ad37e 3f5b00b0 3d9bbb90 3f99d122 3f25adc0 3ef27efa -> 3f012a9f 3f63f4f8 3c180568", + "3f00259a 3f07ad5d 3d80e404 3f42e2c8 3f6eb3fc bd61b060 3ec34202 -> 3f3b3fce 3b7c4d10 3f12339c", + "3f159cb6 be361566 3ee8ce14 3e59bffe 3e33f3f0 3edb8d62 3eb3159e -> 3cebfd40 3ee10f50 3e95e82f", + "3fa72372 3efc5694 3f11b20a 3ed58b94 3e818124 be2d443c 3db44ee8 -> 3e37e430 beca38b0 bc4dee20", + "3f65b2c8 3f32259f 3f420acc 3f4172cc 3e1c1a88 3f841f1d 3f6020c0 -> 3e5546fa 3f8083ea 3f5cf9d4", + "3e1db5ac 3f52b93e be008ce5 3f704322 3f06d6bf 3e58967a 3f99a0b4 -> 3f47094e bd96c9fa 3f7a9481", + "3fa1f531 3ea419b2 3e97778a 3e81bef8 3ec9fdc4 bc957ad0 bd8f66a4 -> 3ed40b26 bdd0048c be1f9070", + "bee927f7 3f94b37e be41c9b6 3f5cbe40 3e2ffd2a 3f201474 3e1434b0 -> 3fce663a bf0f6816 3f983256", + "beb394ca 3d14ea50 3f68b1a8 3f32e1b2 3f10fecf 3e0ad680 3f73d61e -> be192381 3f971167 3f1c195e", + "3fa3afd4 3f0e11b6 be7a400c 3f07ad5c 3e269b00 3f418042 3d951bbc -> 3d5a7900 3f847238 bd5fe020", + "3e295cd8 3ea91486 3f062cdf 3f66263c bd05eed4 3ecc92cc be60ea7e -> 3e8a58b4 3f00e6b0 3f36c8c8", + "be8a597e 3cbec8c0 bdb0cd8c 3f8de0d8 3f8cad64 bdbc4a74 3f43b514 -> be88e7e8 bdadb2df 3f99c63d", + "3f60fe30 3f327d38 3f925a46 3f9d83ab 3e20a718 3ef62724 3e03a770 -> 3e63ab6e 3f0f9f44 3e862ada", + "3f0c8e20 3e5cac7c bc27a440 3f9aebf7 be324003 bb14b480 3f9eb406 -> 3ad2d680 bbc00558 3f9cff79", + "3f97fcc2 3e949790 3f793220 bc94fbd0 3ef3a7ce 3f8db7da 3f48cf9a -> 3f02bc38 3f90ed31 3f6f50cc", + "3f1bd0f4 3f0960b4 3f9b4c01 bd3a1c84 bcc69e40 3dea3e60 3f9844e2 -> 3e47ef98 3f0b5ed4 3f34cea6", + "bef71458 3f3ecb59 3f572000 3f37a408 bcb82240 bd7def60 3d4c9198 -> 3f8ed273 3fa34c97 3f850bb8", + "3fa7b854 be0d1238 3f0ca604 be7a0c15 3ccd95f0 3f98dcce 3f7656d0 -> 3d9ae5d4 3fb279a6 3fab16fa", + "beb1acf3 3e9196e0 3f704e4e bdde7764 3e1b786c be568ab1 3e208d38 -> 3ea922e3 3fab27b4 be4d8c76", + "3f9271aa 3e42d0b8 3f60698e 3ebf0dc0 3d506fd8 3f9d72bc bd41e138 -> 3cfc5e90 3fa3f79f bddd06e4", + "be925ea1 3f970e44 3f835490 bd8d0a44 3dee5e34 3e418062 3f061239 -> 3fbdfaf2 3fa1f5c7 be73fe09", + "3f4b2a5c 3ecc82dc 3e78cf98 3f8c9888 be42d6fc 3f709ef4 3f943352 -> bd8c6c6c 3f4bcc50 3f92a188", + "3d90ae40 3e323070 bcc49b30 3e4d9ce0 3f94db0c 3f893c65 3eeefb24 -> 3e79ba68 3d5ae1c4 3e60da55", + "be278e92 3cc93680 be3f4b6f 3f89767a 3d9753c0 3f486674 3cf5bc20 -> 3c87173e beb0e188 3f9f53d9", + "3e75d0e8 3f9b5b39 3dc0e940 3f969bf8 bd2c46d8 be1c634d 3f7277fa -> 3f698a36 3d0f0986 3f8f8ec3", + "be83ad92 3f45fce6 3f898f22 3f945074 3f415984 3e41125e 3ec9fec0 -> 3f472e46 3fa6baee 3fad7887", + "3fac5c01 3ee434d0 3d300028 3dbc9ed0 3dcdf308 3e7ef2a4 3f0e1a29 -> bc9c1880 3ea406d4 3f372d86", + "bef4ea7b 3f268e69 bd9f02b8 3e0d4394 bdbc9a90 3f3c645a 3f9443a0 -> 3f80c0c8 beef00ea beb34547", + "3f853738 3f767bfc 3ddb8e20 be547ac6 3f27f9a4 3e799160 3e292266 -> 3f24c6ae 3e7f4395 3e38af2a", + "3ed41d48 bdcf4a0c 3f95fc90 3f8d0758 3f57b7c6 bd211560 bb8749c0 -> 3e94627b 3f2b8710 3f24c461", + "3f33699e 3e1af38e 3e958c9c 3e21725a 3f223432 be360734 3df05a18 -> 3efa887f bd185bc8 3e0485de", + "3f703f10 3f829691 3f3b5918 3f9c960c 3e91539a 3f3993b8 3e93de32 -> 3ea88724 3f39af9e 3eb14ff4", + "3e806ac6 bda01406 3f49e70c be4cc46e 3eb905a4 3f84f85e 3e8d9828 -> 3d0364b2 3f59f6d3 bda4c2f8", + "3f9fab47 3f37ac7f 3f8edfcd be1a8083 3f98f01f bca92750 3ee5fe0e -> 3fa80e26 be9a9598 3f190123", + "3e6abe34 3df83710 3e7614ac 3f02069a 3d1cdff0 3e9e5178 3ebb31b6 -> 3dd14b88 3e8320a5 3ef35983", + "3e29b2c4 3f61595a 3f9d7a27 3f06387a 3f29e628 3f4a7bfc be3171dc -> 3f5828e9 3f942868 3ed14070", + "3fb63491 3f2018aa be392b23 3dfa7eb4 3f44d0a0 3f902cc0 be02743d -> 3f545d50 3fd7081e be6ebd04", + "3fbc10d5 3e084852 3f869fe5 3e6cd3ce 3e2ff7ba 3f782558 3f570e4e -> 3e42972b 3f6e3e2c 3f901857", + "3f3ec086 3eda0d68 3d6fcb70 3f3053f4 3f8be3b6 3f6b0c3c 3e905744 -> 3f6c4226 3f32f5bb 3ec56f65", + "3f32ddaa 3e774fba 3eee4afa bb921920 3e29abee 3f962b20 be3ea5ec -> 3e41109c 3f75be48 be06949b", + "3e636b6c 3f4ef2be 3f069669 3f729cac bb0b4080 3e4ca230 3f8f1908 -> 3f20ddcc 3ee81e1c 3f7c4a9c", + "bec12076 3f860532 3f7a1008 3e343e78 3dd2ea2c 3ea7382c 3ea3d4d4 -> 3fb399bc 3f9c6ca5 3df94670", + "3fbdf889 3ee08ac2 3cda34e0 3f8ee808 3f170364 3f468a8e 3f50c120 -> 3f29c52b 3f91ae78 3f2b7262", + "3dd8c6f8 3f6bf798 3f8af243 3f521eba 3f8fb7e1 3f4b77e8 3e965132 -> 3f716a45 3f8701eb 3f43d5a8", + "3c419440 3f1a8fba bdfc5fba 3eb4cb4a 3f9a01a1 be43ce51 3f2f751a -> 3f1c5fde bdfe04e0 3eb6cdd9", + "3f197f1e 3e8d52c2 3f089848 bd9bb688 3f04fccc 3f78dc3c 3f177c90 -> 3ed8105e 3f4be8a4 3ea6130d", + "3f2bfb16 3ea9d95c 3e8688ac 3f3d6a28 3eaee04a 3f9b209b 3f293172 -> 3ead39eb 3f668192 3f2fd471", + "3f9e5f09 3e414f58 3e042ef4 3f536798 3e172ec6 3e7e5592 be26ba0a -> 3e0d2fdd 3e8da8a8 becb7730", + "3faca76f 3f30b1e2 bdfc1076 3e0013fc 3f27b0a4 3f130977 3f754f18 -> 3f248c6f 3f5152fa 3f9fdbc8", + "3dba71b0 3f599c00 3f8954fc 3e196812 3e891f54 3f627550 3ed3aaee -> 3f4c0a5b 3f872341 3e31fae6", + "be910aac 3f3e395e 3f7146e2 be37e59f 3f86d728 bcd76df8 3f535656 -> 3f27b718 3f9bc45b beedbbb4", + "3e92c7c4 3f12a030 be2d2db6 3f07ff9c 3f5536b0 3f61f728 3ea96c5e -> 3f25b716 3e079676 3ef29752", + "3d5a5300 3f7f684c 3f46fe0e 3f4e3790 3f4f7708 3f19239e 3f302430 -> 3f7cda1c 3f448c60 3f4c9d2c", + "3f729f54 3ed034ae 3f864218 3f8ea614 3e174b14 3f622d78 3e3e069c -> 3e2525bb 3f6463dc 3e6fbaec", + "3f4f163e 3ee134ba 3eae2048 be347e16 3d9e5f3c bb240580 3f63f28e -> 3e161d70 3d80eebc 3f2fc5d2", + "3f42cdf6 3edf89b6 3f4160fe 3eb03ac0 3cca1a90 3e85f64e 3f0bf03d -> 3dfc30b8 3ec26440 3eff19ba", + "beafd0d2 be50da86 3f580564 3f893cfa 3f711250 3ec131d0 be6304ee -> bf18ecae 3f8083d7 3fc21be4", + "3fa6cd23 3d3abeb8 3f182274 3f3518a3 3d151b20 3f79b148 3ea74900 -> 3d09b23c 3f8ba204 3e58675c", + "bd52bf68 3f926159 bd3458fc 3f27db8d 3eae2e2c 3ec7a95e 3f5bba3c -> 3f97abdd bd87e7cb 3f253056", + "bea545cb 3f3da46f 3eea3e42 3f016ac8 3f229b2d 3f30c3a2 3f38216d -> 3f465e9a 3ec3bcf8 3edf82ed", + "3e7e1258 be698bc6 3e5868c0 3f092632 3db143b0 bdde6068 3f37e5cd -> be199bb0 3e072071 3f14bf8f", + "3ea0d7ec bd381328 be54b72e 3ee980ea 3e832924 3e210b8c 3f611cfa -> 3d4b61d2 bdbe9969 3f16cb11", + "3cd26840 3f7eedb0 3ebb8fae be56172b 3e8b5566 3ea09c1a 3eb7f6e2 -> 3f7a2b8d 3ebade78 be472442", + "3f0ead8e 3f0ca68f 3f7041d4 3f6f39be 3f8f933c 3f703602 3f9e05ee -> 3f5e4cd4 3f703b3e 3f8d0530", + "3e761a54 3e0b9904 3ea21e54 3d677230 3f6fd546 3e9e3ab0 3f0a9044 -> 3ea84de3 3ea12f0b 3e312975", + "be0a5b66 3e082114 bda06c7a 3f99949e 3f557d54 3f5bbeb4 3f79ce10 -> 3d1c8fa0 be51cff6 3f9d7492", + "3f8ad7ed bdb0be24 bd4e4e80 be29f5ed bc8dc680 3f9d4ea0 3f7d1762 -> bc3bca50 3fab2df3 3f8b10d1", + "3f9479d5 be22a2d6 3eede126 3de783d0 3e01d652 3de12fdc 3f8250a3 -> 3e309fa2 3d59fe90 3f94d8b6", + "3eed3bfe 3f05d85c 3f59ec76 3e5c07f8 3e4ff7c4 3f3bd9f0 be474fdc -> 3ebfd654 3f4bfd5d 3ccdd570", + "3fa1105d 3f39c309 3e192548 3f11bf4c 3f8c92c5 3db465ac be0481ad -> 3f98e490 3d93e091 be9ea9ec", + "3f268738 3e475598 be22bc1b 3f302d60 3f348f5a 3f222d62 3f5abe46 -> 3f06df07 3eb68e18 3f4bddd1", + "3eb1fb8a 3f3d26bc 3f59b738 3f6394ac 3f7598c0 bb85c240 3f0f6e30 -> 3f50c5e2 3f0dab6c 3f465407", + "bdda0b0c 3f8d0f4b 3f98c354 3f0f5fb2 bd508a3c 3f45eefc 3f4d185e -> 3f9cc58d 3f9e7d91 3f08cd74", + "3f7aea8a 3ea40bf8 3f3c273e 3ec2fec6 be006cf3 3f6ba206 3f8f55ac -> bdeeb82c 3f6ab0a5 3f8d74d0", + "3ed5b884 3f8668e3 3f03c339 3e09b104 3f64108c 3f5e37cc 3e074556 -> 3f7bceb3 3f298551 3e08ae59", + "3f83abee 3ebf3f34 3f2cc31a 3f2be63a 3f39f898 bdb0e7fa be271f50 -> 3f3c9009 bddda008 be3fa3b0", + "3f9b2116 be7f2b11 3f136d52 3efcca60 3ef9caea 3efd7bb2 3f460994 -> 3f24e367 3ef4b6f9 3f5538c6", + "3f7f85ee 3e530aa4 be768197 3f662e30 3f109db8 3ea38e70 3f805ac1 -> 3f1071eb 3ea305ae 3f80546e", + "3faa8a47 3eb65376 3d6adfc0 3f14aa96 3f768b5e 3f7c12f0 3f994c91 -> 3f9517a2 3fa57c42 3fb38b02", + "3f8ae34f 3dafa000 3f01286c be39df2c 3ec1795c 3e367368 3ecc1a24 -> 3ece3253 3e1a0656 3ee55e66", + "3ef152a2 3e89871c 3f91bcbc 3ef1fd88 3f1c0bfc 3f36e031 3f89bf23 -> 3edbce78 3f7049cb 3f41d0b8", + "3e84d756 bdba309c 3f918d1a 3f22ff4e 3e3390ae 3dc50e10 3f5080c0 -> bcb2d084 3f5df714 3f2ecdd1", + "3f201426 3f0163a0 3ef87c24 3d9b9698 3e98e12c 3ec237a4 3f82d93d -> 3ec08f1e 3ed68d0e 3f2aedac", + "bef41b02 3ebc2a3c be231170 3f81b69e 3e374048 bde307ac be1e8d53 -> 3eea3123 be3ab188 3fc90174", + "3f86d628 be36ec68 3ed9b9f8 be0f5ce5 3d8907f8 3dffe418 3e1495d8 -> 3da3e3e0 3ddf0af0 3e242dad", + "3fb554bc be046773 3e34bdac 3f9a48de 3f5ae706 3f969b9e 3f0dfeab -> 3fa1f31c 3fcbf1fa 3e912f02", + "3dc4a8a0 3e2e4f24 3f98d5a4 3f09a732 3f23712c 3e08618a 3dc22ec8 -> 3e5c595e 3f8bcbae 3efd8816", + "3f70c082 be6c569a 3f7e1562 be2ecf9f 3f864084 3f205a98 3eec123c -> 3f78fdf4 3f25efc9 3ed8cddc", + "3faf1ef5 3f861eea 3f359188 3e38efa8 3f134127 3f7b219c 3f278f85 -> 3ecd6e3a 3f8a5eab 3f543990", + "bec41d44 3eec7a70 3f06d688 be10f34f 3f9c52a0 3ed6b694 3f281002 -> 3e2f1920 3f115d48 bee4fbd6", + "3eb14e9e 3d70ea70 3df708b4 3f318990 3ee7c92c 3e5ecf3e 3f520610 -> 3e47e85f 3e1de6fd 3f3cc997", + "be72a38e bdd37d20 3e671826 3f4a5ee8 3f80c354 3f800b69 be293c96 -> bebb7168 3d2c8454 3f822c90", + "bedc63df 3f2ec79a be608d46 3e893ff0 3f3fa1ea 3f6f1c58 be5abd58 -> 3f278682 bf373a44 3ef36832", + "bd8e51fc 3f379de4 3f4655d4 3cf4bbf0 bd5ea5f8 3f933793 3ddfd644 -> 3f4557ff 3f3fa83a 3cc78580", + "3f8e39b6 3ed5a980 3edbc80c 3f2acbec 3f76bd18 3f3035d6 3e484b96 -> 3f8324cb 3f3794b0 3e12a0ec", + "3f8e9277 3f1f344a 3ec58512 3eb138e4 3e229b24 3f64030c 3f742d1a -> 3dd93d38 3f72ba00 3f82f177", + "3f8473a5 3e6f2df8 3f23dd04 3f51ba7e 3f9d8565 3f11deaa be5b9618 -> 3fa1f5b0 3f113e76 be803338", + "3f9a4e69 3efdf3b2 3f572336 3e640d54 3f3c3ef2 3f1ebf58 3d7d52b0 -> 3f48d684 3f132884 3cebd210", + "3f1f4104 3f188b44 3ed3c760 3e839dec 3ea28954 3eec1690 3e74ab10 -> 3ed868a0 3ee2e6bb 3e7baf35", + "3f4e4f7a 3f85f102 be01b418 be54d9c0 3d7e0fb8 3f639df4 3dbbf6cc -> 3e8195e6 3f31248a 3d09b41c", + "bed6772e 3f251a26 3f9601c3 3eadf642 be539ad5 3da91c78 3ed7f5b2 -> 3f8035a0 3fd06a06 3e9c5eb8", + "3e14621c bdec398a 3eebd6c2 bd0f5294 3ea920f8 3d970274 3f96f07a -> bd4fed6e 3ecf2294 3e105644", + "3fb291ef 3f56c0d0 3e47225c bcb03b30 be3a2608 bdee122c 3df3577c -> bf15c470 be74bcce 3e32718d", + "beee3d44 3f9c6f6c be24ca14 3f8bb110 3e37df16 3eee04ae bda07124 -> 3fda8819 bee77c86 3fd15b92", + "3ed51944 3f044a09 3f46f0f0 3f6b29ce 3f6e40b6 3f719ba0 3f77e250 -> 3f306462 3f58b30d 3f707531", + "3fa69522 3f6b1fb0 3f91041a 3f3125a8 3e933794 3f63da52 3ddcf2f0 -> 3dc76398 3f511c41 bd8ba018", + "3ee58690 3f99fc27 3d2c41f8 3f9e5a17 3e0cabe8 3e9e93a0 3f4ee0b4 -> 3f39acc6 3e25efb5 3f85bc1d", + "be64a442 3f6dca62 3f8825b4 bbcac140 3f41603a 3f9c89f5 be5c56e0 -> 3f77b525 3f83981c 3d25c9e6", + "3f3af9bc 3f8a9b06 3eff3204 3f5d2186 3f5e2138 3e8011fc 3f85f476 -> 3f6cfb2e 3ea258ba 3f7f4c08", + "3f283e5c 3f6efa72 3e97c212 3f264fc8 3ec2895c bd2015b0 be381332 -> 3f11d8a4 3d9b7c5e 3dd62470", + "3fb26b6c 3e9f80c4 3f09587e 3f47dab4 3e798da0 be74cdb9 3f109690 -> 3e5e3210 bf0b68b6 3ef5a321", + "bef2ee90 3f8604ae 3f8d56f9 be54ccd1 bdc23bc2 3eba224e 3e6b2118 -> 3fcb5de2 3fba52b4 bed4aa7c", + "3f7354de 3f76a584 3f2cbf50 bd98fc2a 3f7887b6 3f6ef806 3e36919c -> 3f786fd9 3f6bb119 3e29bfb1", + "3fa3f118 3ec4de66 3f8a0211 3f2b7a92 3ec7a2a8 3e9f6ae4 3f8bf1d8 -> 3ec86988 3dc4b168 3f9b2a50", + "be100b6a 3f7ee316 3eacc8cc 3f80f326 3dca5950 3f3ce582 3d180120 -> 3f8f9781 3e8ff233 3f926bb8", + "3ea57000 3e8de5d4 3eed1f92 3e85f9a4 3f9b23ac 3ef0a76e 3f2754c3 -> 3f1447fa 3eee43a0 3ec6d239", + "bee788d7 3f24eb10 3f5254ba 3f3668b0 3f917bec 3f1120a6 3f83d78f -> 3ed7d537 3f6fd126 3f11a7b0", + "3fbae349 3f5f21ba 3ef2de98 3f28bcf8 3e8e0d3c 3f6456cc be292209 -> 3b861f00 3f8ac2c3 bf0b5db2", + "3fb38b75 3f35545e be0e7f72 3f8d490a 3f331720 3f38b2e1 3f7fe8ae -> 3f323049 3f88b5f2 3f752c23", + "bedcef48 3f04498b 3d0e6808 3f8736af 3f602ba6 bd6b7cbc 3e61d69c -> 3eb946e5 3d98bc78 3fb560e7", + "3ed486f0 bd1d078c 3f69e3a8 3f81202f 3e5a913e 3f464fa4 3f865e7a -> 3d8786f7 3f5b1efe 3f834d5c", + "3f93ad6d 3bd7b400 3f9a88f0 3f00d97d 3f7e94cc be3f2db5 3d4a8ee0 -> 3f92babf becd4f94 bca67680", + "beab51b0 3f8e7a8d 3dc94a9c 3f892246 3f8c475a bd4376c0 3ee171a0 -> 3f8f3700 3e16ac68 3fa4293f", + "3f6cd368 3eb45f4a 3ed0d57c 3e866070 3f7fa0d8 3f676c14 3f9e0335 -> 3f733ca0 3f5de8db 3f94b196", + "bea8fbf5 3f096e3a 3f67fb52 3c330c40 3ebfb0e4 3f0f3976 3f08a254 -> 3f1727d6 3f82a34e be257fbc", + "3f369842 3f4f8ba4 3f667c9a be3e76c6 be07e360 3d0fa898 bd819798 -> 3e0d1f3c 3e90fcc8 bdc9a8f5", + "3edf0d38 bdc58dec 3eb3712c 3f748254 3f287e4d 3f333fc0 3f96b274 -> 3e6ddeae 3f00b944 3f86a53e", + "3f347098 3f97de97 3f9e1468 3f83ce79 3f9ebfd0 3f83de6c 3f5e140e -> 3f9cb7fa 3f8b9aec 3f6a566d", + "3f7aaa82 3e82f1d8 3efe204c 3eee06f2 3f8f71c8 3f885b45 3f5ce2a0 -> 3f8d2344 3f86d6d3 3f5ac33f", + "3f4b0194 3d5168e0 3e783534 3ebd78b4 3f00fb1c 3f44069a 3eed9e58 -> 3ed1fb03 3f284ad0 3ee3a6d9", + "bdc645b4 3ee55974 3f80f11f 3f7a878c 3f956706 3e81d786 3defccc0 -> 3ec1b27a 3f8a4852 3f87f0e4" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_add(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3dc96418 be453765 3f0eade4 3db9144c bd3d3ab8 be4579f2 3ef29a24 -> be49de4e 3f09d314 3e0c409e", + "3f224166 3f6bd282 3e6cbcfa 3ec4b1a4 3f477ca0 3f6a8e48 3f867928 -> 3fb5212b 3f4fd934 3f86676e", + "3e75b92c 3e1db1d4 3f195ed6 bb5c6800 3e610ffe 3ea5d4dc 3f7b63c6 -> 3e53b39a 3f2d446b 3e6ddab3", + "3fa6cfce be1152d8 3eab8bf4 bdc3e670 3f979c93 3eed2b76 3eb3d5f4 -> 3fb36ad7 3f7050ae 3eb963d2", + "3ef82be0 bcb72d98 be4baa6a be3539ab 3f06d114 3f001a74 3ed23cfe -> 3e6e7d99 3d32d300 3cb4ab98", + "3dc84830 3f983120 3dff0780 3f6ab73c 3f810a83 3e0e5632 be05bf76 -> 3fa4cfb3 3e0d6f2f 3f677222", + "3eae0acc be7487c8 3f9e31c5 3f797e7c 3f8cbc29 3f29dcdc 3f7f56be -> 3e0a2f86 3fbb1097 3fa8252c", + "bddd5278 3e220da0 3f3b63f4 3f328a0c 3f9700aa 3ec52ba4 3eb1535c -> 3cfc0b40 3f30bc91 3f28f52b", + "3fb759e9 bce30290 bd830548 3c9e65d0 3f180bc8 be02779e be0d7d9f -> 3f52b390 be7c654d be36e042", + "3f420fe8 3e386766 3e9f4e78 3b2b8c80 3e29cf48 3ec7a7a0 be12d033 -> 3e9c9084 3f1b53f4 bdd93968", + "3df5c228 3e65f796 3ea8d8b8 3eec5df0 bd8558f2 3f5cd3a4 3ef1e750 -> 3e5df762 3eddd83a 3f04b295", + "bebddcb6 3eb2c4e2 3e3812dc be28fcb4 3f865c6f 3f1a943c 3e4740bc -> bd243a48 bd34da3c be72dffe", + "3fa12cc7 3ea362e2 3ec04f14 3f18cfbe be09ed73 be3e2cba 3e7effa0 -> 3e1918d9 3e11275f 3f69156d", + "3f8fa6e4 bd7be678 3f25c40d 3e2824f8 3c866e80 be7841d7 3f6fb81c -> bd30771b 3ec0397b 3f9b88be", + "3f71059c 3f2cbc4d 3f38d2f0 3f2f0481 3cc12190 3f640acc 3f8a1b08 -> 3f326af4 3fc7c30c 3fd988ba", + "3fb4ae57 3e1bde60 bc693b30 3f7eac74 3f45c22e 3f8fdb03 3f8d1cd0 -> 3f9f0f02 3fc93d76 40234379", + "3f7f5ca4 3f80cd50 bd866d26 3f4b52ea 3f04cdde 3f6ad068 3f5fc8c4 -> 3fc309e0 3f596cec 3fd54670", + "3fa8459b 3f97bfda 3f27dbce 3d4ef2f0 3ea6bdfe 3f5b8c0c 3eff1fbc -> 3fce8cdd 3fe43d81 3f34a160", + "bdf2d220 3f6ea850 3d425ba0 3f9590b7 3f5ae41a 3f493b8c 3e881210 -> 3f54b467 bd3b634c 3f918831", + "3f886ec3 3f3531c8 3ecd78a4 3f46afd2 3f768970 3ebb343c 3f915ed5 -> 3fddfc92 3f4a8111 3ffe4a76", + "be8e1068 3e0f31da 3f5a234a 3eaf84ec bd741344 3ecb0c8e be202c97 -> 3e202024 3f3df7cc 3ec5bdac", + "3d9c4a58 3eed2364 3f1eb654 3f3f6597 3db8f908 be404297 3f785bcc -> 3ef0aad0 3f1b0b51 3f525999", + "3f51a622 be3c237a 3ec42aa4 3f72aa0c be5e04ff 3ea94c64 3f65c936 -> beb8fad1 3f2767f0 3fd76c38", + "3eeb7e18 3f981aac 3f89c582 3f956f0a 3db3d3d8 3f16309a 3f996fab -> 3f9d460d 3fac4fa8 3fdc0194", + "bdd0f6f4 3f48760a be6d739f 3f4e446c 3e9a6c96 3f7d0b1a 3f71ae90 -> 3f409537 beaa5d17 3f359b8d", + "3f64eefc 3f86dc42 3f752cba 3e0a80cc 3e581712 3ecf3608 3f8d4aab -> 3f9f040a 3fa8e9c1 3f8faa80", + "3e007898 3f2d6f66 3e2eef5c 3f03c4f8 3f394c30 3f0bad3b bd84b3aa -> 3f44aebe 3e7507c6 3f01b035", + "3f304e32 be6d63fd 3f8a02e2 3f6e0ab0 be5c3052 bc42e320 3f326a90 -> bec2843c 3f88f673 3fb47539", + "3dd0f690 3f834c23 3ed9c8c4 3f8d2228 3f87aad6 bdd753e6 bdee0f08 -> 3f9123d2 3ed44aa8 3f8b9d85", + "3f8967c6 3f1a133c 3f989094 3f84f46b 3d9721fc be654b0b 3f98c4ae -> 3f2e5ad9 3f73981a 40147964", + "be195cb2 3f2ce898 3f1009da 3f5278fc 3f968598 3f8599f0 3a62b400 -> 3effa4d8 3ed00a54 3f52707f", + "3e397510 3f27cf2e 3ece3236 3f1d2e4a be55f284 3f81bae6 3f282e32 -> 3f1e1f4d 3f1616cc 3f3ba3dc", + "3f5a6960 bd762ac4 3f901ce0 3e8884be 3f4016a8 bb3c0100 3eb03840 -> 3f147fb0 3f8fccad 3f0f6e97", + "beecff5e 3e9090b0 3e90b7c4 3ecd6030 3e850b02 3f785736 3f09faf4 -> 3e25f684 be2a60b8 3e1b4667", + "becc5f8f 3e6a6abc 3f39dc23 3ecccfe2 3f04fffe bc07f480 3ec1f80e -> 3cb07ba8 3f3ab536 3e7ec5b1", + "3e94a66e 3e87f7d4 be11b932 be105d0b 3e47024c 3ee463c6 3f986895 -> 3ea4db81 bc51b090 3e51a123", + "bbcf4580 be68d2e3 3e74581c 3f826927 3e067edc 3ef41fd8 bdad9afa -> be69acad 3e71417c 3f827ab9", + "3ec3e516 be3c6256 3f05a678 3f12cd98 3f83b49f 3f196d3d bc786780 -> 3e56bf6e 3f405a38 3f11516e", + "3cc56000 3cf5bf10 3e2f2390 3f2a85ad be348d56 3f363db9 3e3da720 -> 3cd2f1f2 3e40b3cb 3f2baa1e", + "3d8cdaa0 3f6d3cf8 bd139a6c 3f058362 3f45959e 3ce64570 3e30427e -> 3f7ad3ca bd0baf42 3f088b39", + "3f886b9c 3f825405 3e216688 3e9cac28 3f4d121c 3ece95ea 3f685724 -> 3fef9bd8 3f16701d 3fa2faff", + "3e37f058 be52e894 3f21ddca bdf8d1b0 3e791d28 3ebf5ca4 3f29e642 -> be262926 3f330da6 bb156f20", + "3d4ef050 bd3ca550 3f89cd2c 3f3d96bf 3f2472f2 3e137698 bd4e1d78 -> bc5ed9c8 3f8abb94 3f3cf022", + "be3e604c 3f6fc8d0 3ee2c620 3df71f48 3f7bf428 3f416762 3f98ca4c -> 3f40f151 3e9adc62 bdcf5f2e", + "bd1ecec8 3cc9f5c0 3e7d3bb4 3f1c0a19 3e4b7704 3f7e3c02 3f3cd47f -> 3c8ad9da 3e55ce1b 3f14b7de", + "bdd2b158 3dea66ac 3c8ef0a0 bcb51bb8 bd5ddb88 3ea78e7a 3f911198 -> 3df5d028 bc84dd46 be0e0864", + "be3dd4ba 3f49eb1a 3f099fe4 3f549560 3db47b38 3f458386 be71fb13 -> 3f45bc72 3eca04ab 3f5fcc57", + "3f4c09bc 3e0cb004 3f83f651 bdf6ea98 3f912a43 bce1b130 3f305378 -> 3f854934 3f8126ca 3edb57ca", + "bec85763 3f76f692 bd846ea8 3f888efa 3f65e394 3f76c28c bdb089f2 -> 3f1d0270 bee237e3 3f8ce03a", + "3f98a41e 3e0a3b74 3f04dbb2 be5259de 3f217251 3f9688e2 be0a306e -> 3f63159d 3ff5f168 bebb9248", + "3fa49b39 3f4f22d4 3f033f9e 3ee4a154 3f888b34 3d87d7c4 3f9ff2ea -> 400b94ad 3f1915c3 40036cc4", + "be9b061b 3f93e196 3f0a4e88 3f2564c2 3f9df1ee 3f9709af 3f1f8700 -> 3f481dec 3e3b6044 3eea2ef9", + "3facc273 3eeec494 3ef5ced8 3ea11276 3f45498a be4dfbe4 bd09fdb0 -> 3fc0d468 3e559a4a 3e89caa5", + "3ebb90b4 be2bea9a 3e24e4c0 3e987d68 3f1d04b1 3f78346e 3e5dc7c0 -> 3d68af0c 3f04267c 3ec11cfa", + "3ebe4b4c be6cef36 3f492bd8 3f351d16 3f5871c4 3f9306ab 3f621e78 -> 3da9b1f8 3f9b3b05 3f8493d3", + "3f1ab6e8 3e895a0a 3f2ed204 be3b078a 3f93fbbf 3f306da2 3f9780c2 -> 3f778b5e 3f8cb903 3f085d84", + "3f9f7799 3f2523a4 3e2ee4c0 3f69ffb8 3f845798 3f0a67c1 3f90e940 -> 3ff77248 3f582764 4014c480", + "3f87730d be582eed 3f3ae04e 3f8e1463 3f90485e 3f9309e0 3ee12524 -> 3f7b504b 3ff908bb 3fc9a446", + "3f4d7ca2 3dd0336c bdcf7054 3e5046de 3eb18d14 3f4873e4 3f3e8179 -> 3ec29145 3f06f85a 3f4cfc24", + "3faca9fc 3f809158 3f9823d6 3e0dc866 be5fe7e6 3f7d6888 3e9e34fe -> 3f35a072 4021872a 3f0e26c1", + "be718e8c 3f860ab4 3e7d2c74 3f5d520c 3eb826c8 3d05ea00 3f1722de -> 3f765d06 3e7546b6 3f39ab0d", + "3ed50492 3f9ec000 3f223efc 3f545582 3e3732b8 3eab3ede 3f3c2fa9 -> 3fa84708 3f45de93 3f915082", + "3fbc8a9f be46d1d6 3f58f450 3f77e106 3f9ffccc 3e462f98 3f8cf5da -> 3fd2ce54 3f90f7b9 4025c921", + "be8e43c2 3f08c00e 3f5d2c66 3f0f30f3 3f93fcdf 3e420030 3f961a36 -> 3e5a0a7c 3f4fb278 3e6f1aba", + "3f82ab4d 3e6dc60c 3f068d9f 3f805494 3f4cff38 3f12b800 3f38774d -> 3f865b88 3f8e2a6d 3fde7c98", + "be360614 3e6e54c0 bb94a380 3f047d58 3f5db520 3f8cb7da 3d23bc38 -> 3da16170 be4cc135 3f02aba9", + "bc944310 3f03d2f9 3f1fbc36 bda8311a 3e4b51d4 be76b8c1 3f941786 -> 3f02e778 3f20d9fd bdd3134c", + "3f8c8f6e 3dba9ae8 3ed72226 be5fce44 3f0bdca2 3eea5d98 be5fc546 -> 3f30e967 3f6c3f91 beeac464", + "3e3c71e4 3f221eb8 3d621190 3ee8334c 3f8bef4a 3f2aee72 3f4be0c2 -> 3f559fb6 3e36578b 3f199e96", + "3f581352 be113a8a 3f89d62c 3f20cd75 3f8173b7 be711e8e 3f7cf112 -> 3f36382c 3f60cb59 3fbb25fa", + "3f6e4878 3f1a1d96 3e4d8eb8 3e0911e0 3eb03866 3f4faff0 3f871015 -> 3f6c20be 3f74b40a 3f8ed96c", + "bef2dd1d bc23f3f0 3ec86e2e 3f352548 3e38b8f0 be6fea82 3f9894e7 -> bdc3bcdd 3f00aa74 3e1192f0", + "be9faf9a be140dd2 3f789cb8 3b914b40 be09db2e 3f30689e 3f7a8982 -> bdd21df2 3f4197ba be9a0215", + "3f7748a2 3f985ad0 be3e7136 3f82eb46 3e3a0504 3efcb602 3f1a77f0 -> 3faed0c3 3e94e2b4 3fcd860c", + "3ec0599e 3f4c0fdc 3f0a2c68 3edfda0e 3f9f4cba bda6102c bdfef9aa -> 3fa1e096 3f026004 3ec7e77e", + "3f519d08 bcfa5340 3f65c7f8 bd43f910 3f657edc bcc22f60 3e79a114 -> 3f3416be 3f60cffa 3e1b675d", + "3eb726be 3f69ea02 3f7ef45e 3f29b058 3f26e914 3f5ab6f4 3f1df056 -> 3f92cf79 3fa698a8 3f622fb2", + "befe1dcf be13c17e 3ebf55be 3f655e3a 3ea69f7c be7661c0 3f9c9ff1 -> be9c9391 3efc7a29 3e93ca98", + "3f37354a 3e0bffec 3eb8dbda bdb3286c 3d8aa778 3e4ea0e6 3f1ccb7a -> 3e3d9d36 3f0165ee 3eb3a214", + "3ed900e0 3f8d0558 3ca70840 3e3e5324 3f8c63b2 3f888482 3ecdd0c0 -> 3fc885d6 3ef1e217 3eb664e6", + "3fac8a19 be34acf8 be4a7762 3e602960 3eecf434 3ef84278 3e531fc6 -> 3ee51150 3ee96979 3efe5fed", + "be066cb8 3d8b7aac 3de13198 3f47982e 3f63a40c 3f9e43cc 3eced992 -> bd472cd4 bd567268 3f3a0476", + "3f4155a4 bdabf3bc 3f4a8ece 3f2b49b5 bdb94cac bdc8f8b4 be30c8c6 -> be1bf244 3f3795f7 3f09e915", + "3fa3739d 3e92b416 be576a0f 3f1429ee 3f832326 3f619ccc 3f99a719 -> 3fcc223a 3f6a3ef0 40072544", + "3f9fea37 3f39bc1c 3e686e3e 3f4e21ae 3f84d6f8 bd0f8098 be08694c -> 40016a14 3e3b9c2a 3f238694", + "beea0dae 3ea4916e 3edaa7c4 3f8e6ad2 3f064653 3f4477f0 3ec538b2 -> 3da737e6 3d9c1e8c 3f6fc18d", + "bed128f1 3a8f7200 3ec4058c 3edb61c4 3e5c8280 bd2a14f0 3f80300c -> bdb1ec06 3eccb4f1 3c9ea500", + "3f8a5b6f 3ef552ea 3f444b14 3f6ff0fa 3f6a281a 3ea63524 be497917 -> 3fbbe1fb 3f8f0f8b 3f397f5c", + "3f61f8f4 be730d53 3f63e06a 3f3033ce 3f5a8470 3e82f37c 3e5bb12c -> 3f041f92 3f8ed60b 3f60aee5", + "3f1f99a2 3f910552 3f9cbb40 3f8cfb0e 3f82bfd2 3e930e38 3f28c55d -> 3fe288ed 3fb3a6c5 3fc196fc", + "3f75a116 3de9d758 3f4e7412 3f229017 3ec4d1f4 3f313174 3f81ce63 -> 3ef74e9d 3fbc3bf2 3fcdd43d", + "bdf491ec 3f2822b6 bdcc37a4 3f0f25ac 3f2c3e1a bd511e58 bdfd4ea4 -> 3f13910a bdbfbb22 3f12eda9", + "be2f9c86 3f35d07c 3f8f185a be01e8aa 3f63ed64 be3ef036 3e7b00a0 -> 3f0eb9d3 3f933032 be2cf463", + "3e7aeaec 3f497378 3e328758 3f6bc1e2 3e85fc64 bda27f8c 3ef3bad8 -> 3f59dde6 3e1e9ea2 3f84cf33", + "bc164e20 3ed1188e 3f13bac5 3ee341fa 3f6bd794 3dbcd5dc be22bea7 -> 3eccc4cc 3f138356 3ee40115", + "bc5b27a0 3f9aeb81 3d560e38 3e8f7e40 3f61e91c 3d204f50 3f006866 -> 3f9968b6 3d53e945 3e8c0ed7", + "3e9d9a8c 3f3d675e bdf78eea bd8dcd4c 3d68ba40 3db4b0fc 3eb14126 -> 3f41e194 bdbff01a 3d18e542", + "3d826c48 be12e8d5 3f7a7046 bdf36e12 3e650ca6 3e2814d4 3e925988 -> be0452ab 3f7d1d53 bdce2663", + "3f1a5f44 3ec3a478 3f76ce34 be0254de 3f058167 3e937eb4 3f956a9e -> 3f3253c2 3f91a361 3f139e44", + "be2cdda8 3f12be46 be09ed48 3f803343 3f8da9b0 be5be8ab 3f90d20f -> 3ec5d3e2 bdc99b32 3f4f8143", + "3f554ca4 3f50cfd0 3f57c6b6 be77eee0 3f831f7f 3f7e57c2 3f99f90c -> 3fd5a85e 3fd5d8f0 3f4298e8", + "bedfdfbc 3d393b30 3f3d7b8c bd38d730 3f8a8cf8 bdf61938 3f990177 -> bedb2c5f 3f4aeefd bf115b73", + "3e7177e8 3f594a7e 3ea01d80 3ee528d6 3f96cac3 3f4e2392 3f49a714 -> 3f903420 3f00aac2 3f22219a", + "3f1ab108 3ead255e 3e215160 3de33db4 3f8022ce 3f159328 3ddc1c1c -> 3f716dc7 3f02b64e 3e341f6a", + "be8e3d14 be71da2d 3e377f44 3e4ce114 3d5904a0 3eedf8ea 3f2c40ac -> be80765c 3d4d19ac 3c577230", + "3e627538 bdeab370 be01c828 3ee60858 3ed75ae6 3eaa7558 3f07bb5a -> bcb0ca54 bd598d56 3f11088f", + "bd501f48 bcd5ab00 3f957c1e 3f306777 3e220a04 3f9c6927 3f724ff4 -> bd0bc47c 3f8d8995 3f24178e", + "3f90f7da 3f4d75ee 3e9ba436 3f96deec 3e6b890e 3dbfe840 bda05a54 -> 3f881340 3ed1fa6e 3f8b852a", + "3e0bf0b0 3edee4ba 3f659c90 be681a74 3e231264 3f586e94 3f90b180 -> 3eea0944 3f819839 bd93d33e", + "bdff92bc 3e9f3776 3f809d24 3f4789a6 3f2a4064 3e8b8486 be74bdfa -> 3e697310 3f7885b8 3f4f2c52", + "3f48d692 3e420328 3f9fc820 3f01e813 3e63a398 3bf5ddc0 3e7718f4 -> 3eba4ce2 3fa08904 3f325eba", + "bc6aa840 3e757074 3f2c0040 3f17c31a 3f1cc0dc 3ed2671e 3e44d546 -> 3e6c757f 3f2a7e87 3f170eae", + "3deb7af0 3f9006db 3e8af4da 3f895704 3df7fb68 3f004bf6 be3f1c9b -> 3f91cf11 3ea875b0 3f8697d8", + "3f44499c 3e67c594 3eda1592 3c3a3680 3f3ccc18 3f265858 be472ed8 -> 3f4ab3f1 3f6c9640 be0d15bb", + "3f8679f3 bdb21062 3f946ee9 3f3e421e 3f33100b 3f6f7f74 3c34b680 -> 3f25dd59 40091edc 3f41398b", + "3ea28db6 3e9c83b8 3ed7ab8a be781a89 be27bace 3f6e2e78 be0c0b98 -> 3e81e374 3f377465 be92487b", + "be74deac bccc75c8 3edc6c94 3f4c03be 3e3cec16 3f302db0 3f88fb5c -> bd8d781e 3e882a2f 3f0a8061", + "3ed42564 3ef77fb6 3f74db9e 3e9681ee 3f82bb26 3f994bd4 be725920 -> 3f6815ee 3fb9f267 3e489942", + "3fb9b4ee 3f128577 3e7bfce4 3f3c1cce 3f1b9363 3e3e47ce 3ee71234 -> 3fba1e32 3f040368 3fb1de22", + "bd8413a0 3f43226e 3f8cc07e 3f94d868 3f39b41b bd8cec44 3f8c8f31 -> 3f37288b 3f8d51e7 3f8bc7d5", + "3f17ba78 3f8cd254 3f885a55 3d0ee208 3f521d7e 3f999de0 3f0120f6 -> 3fcb168c 3fe36658 3eaaed40", + "be28e4f0 3f9f6a40 3eedca38 3e9b2224 3f9b1554 bc709b60 3e68a39c -> 3f85d614 3eef07b2 3e87f2b7", + "3f3d52cc bd3fdcc8 3e4c0498 3f6d99c0 3f7ce7cc bb16de00 3ecccb7e -> 3f2f0b20 3e4a464d 3f9ca9fe", + "3f927d99 bd994b9e 3e8bb920 3ef4fbd4 3efd3908 3f2973ff 3f8f3c0c -> 3efb7a9e 3f83e592 3fe12bff", + "3ee69a60 3f14b54c 3f6252ee 3f3586ea 3f01cb38 3f9c6c2b 3f8ee116 -> 3f4f2ab8 3fb79d38 3f9b1da6", + "3f2d799a 3f92137a 3c14b5a0 bd4a7330 3f9fadf4 3f0248c2 3f763a52 -> 3ffe47e1 3eb537c9 3f1a332c", + "3f1a414a 3f840d0e 3e3a2ef0 3f2568b8 bd4ab9f0 bcd3f990 3f25a010 -> 3f803bd2 3e2a37aa 3f849aa0", + "3f142af8 3f267fd6 bc7a3be0 3f7ccc50 3f977cab 3ee57146 3f560f76 -> 3faaed6b 3e79f440 3fbc5897", + "3f888968 3f0ad81a 3f4e7036 3d9c07d0 3e938f7e 3f22a8de 3f49db30 -> 3f598b88 3fbdf920 3f6ad28e", + "3ec5a888 3f54922e 3f580a28 3ee8bee4 3c594f20 3eb8cd78 be507469 -> 3f55e1c0 3f7bb61a 3ec08230", + "bdac32c0 bd751b08 3f3a40f2 3f7d8be2 3f3d2060 3f302b6c 3e202db8 -> bdf9c4c2 3f2b70ef 3f7a2dee", + "3cca12a0 be22bcb1 3f8a8a98 3e969048 3ee0279a 3e63601c 3f93acd4 -> be17adb8 3f8b3e12 3ea5226c", + "3fb423a4 3f263bdd 3f78ba98 3f12d1e2 3f061fb3 3cf656b0 3f754d18 -> 3fb17ee4 3f81c806 3ff6054d", + "3e98d24a 3ee7c540 3f8febea 3f35942a 3f8fcff2 bd9d06ea bdb371e0 -> 3f49bc3a 3f8cfe01 3f2ee23a", + "be6d2b0a 3f168194 bd6f6b88 3f97f792 3f5cf978 3f19bd2a 3e7d13f4 -> 3ec6a71a be4a48db 3f90a3e2", + "3ee4d968 3f01d61e 3f9fa038 3e4763d8 3f81469a 3edc0810 3f0811ac -> 3f7566c8 3fb83679 3edd5538", + "3edebe10 3f795b06 3f841c6b 3f8cd9f9 3e274360 3f628186 3ef7d37a -> 3f85c60d 3fb5618a 3fa7ce26", + "be846f28 3f8fa7c8 3f90c6c8 3f3d4589 3da5a038 3db4ae70 3f768c62 -> 3f8cfa54 3f8ddb05 3efaffa2", + "3f510f94 3f5a6920 3cfef710 3f5d807c 3f03cc4b bbc32b40 bd6cb7e8 -> 3fa30578 3cd71e84 3f516b74", + "3f011456 3f640bea 3eb6b1fe 3f531a56 3f5f1adc 3f2814ac 3ef0c7de -> 3faa4516 3f3018c4 3f87e721", + "be9ef0ac 3f797a2c 3e03e3b2 3f43927c 3f59aeae 3e34edb0 3f92e3cb -> 3f35e6f2 3d977299 3ed0bf99", + "3f4e0a24 be21840c 3f5be036 3f35cf0c 3e93bb38 3f2da808 be6b398c -> 3d9891ec 3fb3d226 3f067aa4", + "3f499806 3d77bb80 3e4aa66c 3f084570 3e864eb8 3f08b89a 3f7905d8 -> 3e88bb00 3f1e53bc 3fa62f74", + "3f84f354 3f7748b6 3f14587b 3e7b03ae 3e3e297a 3eadba54 3f995c03 -> 3f9454e3 3f6e91af 3fbeaae2", + "bec72d0c 3ed9bfae 3cd333b0 3f0ab5fc bcb264c0 be71e8c8 be583dba -> 3ede160c 3df10371 3f1fbdbd", + "be9b1c4a 3f4094a4 3f9cd986 3ef60ab2 3f94ad31 3f886266 be76efb2 -> 3eccfeb3 3f671066 3f0db926", + "3f590d84 3ed82f04 bdc27484 bcc22a48 3f10d1a2 bd9fe8dc 3f84ce9d -> 3f66e0da be2504ac 3f5b22fa", + "3f1b6aec bdba84dc 3d2d4e50 3eb7e700 be028fba 3f3f5e17 3e73e306 -> be2c85fc 3efe0595 3f00f795", + "befa26c8 3f4ca072 3e89a324 3ed4489e 3f8b2f20 3f9987c8 3f253880 -> 3e893eae bea26892 3dcb59a4", + "3f38fede 3f15469a bda7377c 3d770c30 3f2a223a 3f9da086 3f115ca1 -> 3f881c4a 3f4ee9ae 3ef0f81d", + "3f13dec8 3e63da3a be4affa2 3eb399f4 3f37f3d0 3f76c1c6 bddae924 -> 3f2337a4 3eb79033 3e93fd5c", + "3e665bc0 3ed94e16 3c9a47b0 3f5eb8bc 3e2b6918 bdb729ac 3f00beea -> 3eec95d1 baa89660 3f7baf27", + "3e410264 3f9de25d bd89ec22 be13bcdf 3e884f6e 3f4cf7d0 bde2e088 -> 3fa44eaf 3dab255a be291e8c", + "3fb7f821 3f34e17c be3c7bd9 be340f7f 3f8eda9e 3eba1728 be1fd40e -> 4013e11c 3ead37ec becce33f", + "3fa48b46 3f9e4c30 3f953ef5 3f9357b4 bd73e270 3e610268 be695b90 -> 3f948013 3fb966f2 3f5bb09a", + "3f8a7b39 bc1acca0 be7765eb 3eced084 3f844e29 3dc2af30 3f370041 -> 3f8dee09 be0e15c6 3f96b25a", + "b90cc800 b72b8000 3f4b6b92 3f2b83fc 3f84fa63 bddc3354 3e1a3ad0 -> b91cf9a4 3f4b6c84 3f2b82a9", + "3f220280 3f9e2b4a bd3a0058 3e17ea0a 3e3924f0 3edb7164 3f1af2e4 -> 3facd0b0 3e673fb6 3f0809ba", + "3f5ac6c4 3f9e2f87 3e8da1b4 3f5a3e94 3eb36c62 be4da084 3ee8c094 -> 3fc484ee 3dd71220 3f9ed977", + "3ed57c76 3dd2a290 3f780954 bcbcf260 3f70da30 3ef62b9c 3f14779c -> 3efd8347 3f95ade9 3e60011a", + "3f941ff2 bd9b204a 3f33a886 3ef716cc 3ee943d4 3ed9475c 3f53faca -> 3ee72892 3f98b072 3fb86d24", + "3ee25b12 3e8aeaec 3ecef048 be30fe2a 3e6247f8 3f717c4a 3e753c24 -> 3ebcefee 3f523af4 bd8925ff", + "beff5090 3f761df0 3f40b4e6 3f813c4e 3f8543f4 3ed56c6e bda2e1e8 -> 3ee26aa0 3f0b7e5c 3f864fe0", + "be2436ae 3f3b55ab 3f4d29ae 3eddcc40 3d3be070 3c27fdc0 3f6feaba -> 3f39739b 3f4cbdec 3e90d971", + "3fae7201 3f89b120 3ee2d71e be1b95aa 3f2963c7 3f521716 3f5b51f4 -> 3ffd1e61 3fc7df06 3f8200aa", + "3f9fd1bf 3f00b775 3f6a6f1c 3f79a752 be7babee 3f837c0d 3d732ec8 -> 3e48a1dc 400cb18e 3f8650be", + "3f493774 3f8fac5b 3f467e1e bdf6de6a 3dd8dcb0 bd0eebec 3edf99c4 -> 3f9a539f 3f3f78bb 3e64111f", + "3eb5e65a bd0ab930 3e5e7f40 3f932924 be3e81a6 3ed1a7b4 3f3cfa2c -> bdccb9ae 3eb9bbbc 3fb4badf", + "3ed8bb74 3f933f6c be4d6aed 3e238f8c 3e280ed8 3f920808 3f0f3724 -> 3f9c23e5 3e908df4 3ecb072a", + "3edadde8 3f9b064b 3f9d52f0 3f4f2e38 be026b37 3f21fd16 bd778d40 -> 3f940e45 3fbff26c 3f489111", + "3de44528 3f8b22e5 be5cbad4 3f84b972 3f23be1c 3f8e386b 3f0a4c28 -> 3f9442fe bdbbd453 3f8c6e85", + "3f7aa69c be6551bc 3e9b83dc 3f985139 be51c528 3e803bb0 3f0174a0 -> bed95a66 3f0c88cd 3fd7b14c", + "3f7abd1a bcc68820 bd537b24 3f190431 3e250cf4 be06a0de 3ebce8a4 -> 3e08d78e be38bb54 3f75878e", + "3f22f628 3f5dc9d8 3f10c370 3f57114e 3f917406 3f3ffbc8 3c9acc10 -> 3fcb7c34 3f857caf 3f5a259e", + "3fb0dd6b 3f4bd83e 3ea3ebf8 bc893390 3f15142c 3e7d16d8 bd8980d0 -> 3fcceaee 3f29634a bde04bdd", + "3bb46c80 3e3b3a12 be0c8270 3ed942f4 3f0c6303 bd551fc8 3f554956 -> 3e3e519b be0ccd8a 3edb9c3c", + "3faa8cd9 3f3ee358 3e6105c6 3df3a804 3f23f236 be48f5ee 3f560564 -> 3fccaab8 bd2af7f0 3f9dcfd5", + "3f92d5e4 3f83eec9 bd1d5fa0 3f7621f4 3f03a54c 3f5212da 3f5b2ddc -> 3fcf710c 3f672690 3ff8c842", + "be52c04a 3ef01bb8 bd59e6a8 3f40d612 3de3a874 3e8aeb90 3f72b0d4 -> 3ee46505 bddf50e9 3f0ee33c", + "3e0f11bc 3f9de5f9 3f74ec0e 3eecf514 be7c9f78 3ea54974 3ef5fe62 -> 3f997c84 3f803bff 3f07a9ce", + "3f9ca8d1 be285c59 bd9cea46 3f5ce03a 3f95d4e2 3f492afc 3f3a6558 -> 3fa25584 3f62986b 3fe080ca", + "bead9953 3dc40fe8 3ef1389c 3e7bd750 3f323943 3edda1f8 bd97a5b4 -> be0faeed 3ea61303 3e8ac662", + "3f97fc72 3dde5fb4 3e8b28dc be3a4481 3f2d32dc 3ea74410 bdbb6a7c -> 3f69738c 3f28e285 be94c491", + "3f8f2b1b 3f953ee7 3f6bcb68 3e3fb7d4 3f6d383c 3f914c41 3f24fff3 -> 400cf4a0 400c34e9 3f687b77", + "3f597486 3f035564 3f67fa78 3f231a16 3f3b1dca 3dd83198 3f98a1ce -> 3f912368 3f7eef07 3fd333ac", + "3f8bf870 be58e2c6 be1af913 3f17fb88 be5c6087 bdf9bbde be19aa3a -> bee4efaa be91c238 3edbf282", + "bb1ad700 3f39c548 3e83c07c 3f2a3bcc 3f8b5266 3f45a58c 3eedb150 -> 3f391cbf 3e82d165 3f29f3ea", + "3f7ffffa 3edeaf40 3eca1754 3ea74a8c 3f9f8159 3ea4d900 be2f0dba -> 3fd72d25 3f377828 3e1f8762", + "be8c37b6 3e812ea0 3ed9e48a bbc73b80 3f669278 be2a6a66 3eb79e38 -> 3bb91640 3ef13a5c bdd598b0", + "3f7190cc 3f50a1d8 3f5bdbc0 3f9b8dbd 3d9e564c bc870a58 be37e7f5 -> 3f634ef2 3f57e057 3f85dc90", + "bd9523b0 3e314acc 3ef2e6b0 3f244afe 3e4b6612 be440b04 3f1734c9 -> 3e227af4 3efa0a0c 3f194824", + "3db25af0 3ed3d652 3f45b22a 3f8b49b8 3de797b8 bd8ec5aa 3f918bb4 -> 3ed8e120 3f442449 3f97f693", + "becab09d 3e85dd9a 3d774d00 3f3c1b18 3f844cda 3f8e8386 3f46898c -> be174474 bec2c293 3edb04af", + "3f619554 3f2c4f76 3eb313fc 3e095594 be527388 3f3dc656 3f0a5f46 -> 3efbe5c6 3f806201 3f1c43d8", + "3fb0c24b 3f260480 3f332050 3f42da02 3f09ddde 3ec9a548 3f0dfb54 -> 3fb2336b 3f9f2d7e 3fc3758d", + "be1a906a 3f95cc29 3f6f5a46 3f4c292c 3e86de82 3efa0f90 3f7ab294 -> 3f90b54a 3f5c7af8 3f2651f6", + "3fa472c4 3f67401a 3e1f7862 3f099f82 3f939f0e 3ef16f66 3f412ed4 -> 4018a41a 3f42f5b2 3fc0e85c", + "3e73bae0 3f0c66ee 3e6c0186 3e96622c 3df60510 3e96f8ec 3f08d4a8 -> 3f13b8c1 3e99efe2 3ed7850b", + "3f5559a6 be005a9b 3e83eb32 3e1dd998 3ea26dd4 be4ca9f1 3e8f2a2a -> 3e0e61eb 3dba8aa6 3ec63d04", + "3f97ef1b be35b89c 3d9dcb78 3f531518 3f4954a6 3eaa382a 3f887c6c -> 3f418bcb 3ef17f18 4005c624", + "3e939148 3ec03510 3f97f8f6 3f052a73 3ebffe88 3f85eb7c 3f7283d8 -> 3ef78b1f 3fbe9212 3f4b101e", + "3f98b4e8 bd6541a0 3f58b5e4 bdded7f0 3ca1d450 3f849839 3f1b7066 -> bd04b934 4005458e 3f1d962b", + "bebbb128 3e607fc0 3e5ea3b0 3e2c74f0 be1aa744 be6b6552 3f0301b0 -> 3e8c98ad 3e9a7752 bc9d26c0", + "3f9d1f50 3edac95c 3ec96590 3f991c2c 3ee06488 3ee63b00 be34ea0a -> 3f771dc8 3f720120 3f7ab384", + "3f70e858 be2f6d58 3f768a6a 3def4bb0 bde32314 3f7035fa 3f9b2e48 -> be8d266e 3fec4b84 3fa0fcf6", + "be89deef 3e961cee 3f830352 3f7ec160 3eff4afc 3f5650d0 3f7af3e0 -> 3e22bc6a 3f4c50b3 3f3b2dda", + "3fb428f7 3f293fb6 3c545900 3d428470 3c694480 3f6c24ae 3f6a4918 -> 3f2e6102 3fa7d846 3faaf506", + "3f7897e2 3f8e0842 3ecfefba 3f2ffe77 3e9fead4 3e9bee52 3f0ba783 -> 3fb4dada 3f33ad8e 3f9bcdcc", + "3fb723e7 3f0b3f24 3f12f21a 3f97e680 3eb172f0 3f5fbe5c bd79ee50 -> 3f851898 3fe98982 3f8cb9ba", + "beb1420b 3f9115bd 3f831dc6 bdf467d4 be1c1624 3f2513d8 3f96a896 -> 3f97d6f6 3f4d14e5 bf06de68", + "3fb360fb 3ee34490 3ed8b7ba 3f19b0b1 3e3b576c 3f480dd0 3f8eb8c3 -> 3f3344d4 3fc25b60 400a6d6f", + "3f9818a5 3e05858c 3f661010 3e3234c8 3f46f8d2 3e21f194 3f9d1e2c -> 3f86e796 3f8b15c9 3fd0f8ad", + "be54e9da 3e9d2518 3f2deaff 3f53a634 3ec47da4 3ed56a1a bccd2e80 -> 3e68946c 3f17bb25 3f54fb80", + "3f9534e3 3e4c5224 3f877a30 bdc89fd2 3f9b493b 3f4a92c4 3f885b1c -> 3fce8dae 3ffd8b76 3f926868", + "3f5ec5a6 3e745760 bdaa55f4 bdaaab2c 3ce21ad0 3f7cf7ee 3f6d6070 -> 3e8677cd 3f46d790 3f393b80", + "3ec67b48 3f9dce00 be26c8ea bdf7038a 3f45e95a 3f2e35fc bd8b78ec -> 3fc42a72 3dceb4c4 be168a71", + "3d527ab0 3f6ce20c 3f433fcc 3f51c0a6 3eee83ec bd1db3d0 3f92b98b -> 3f7302e0 3f42be23 3f60d4f7", + "3f1a213e 3dc28464 3e9b99a4 3f36bba6 bcb426a0 3f73baa0 bd95eed8 -> 3da766bc 3f608abc 3f2b7301", + "be32615c 3f1d677e 3ee58956 3e610d98 3f9ebd85 be4d12c6 bc3bd100 -> 3ecc32d6 3ef765f7 3e631913", + "3fad87b2 3f3b5ace 3bf14bc0 3effcff6 3ed708f0 3d4dbe70 3f4da5ec -> 3fa68eea 3d9a8b7c 3fcb5a20", + "3e87e6ca 3f179d3a 3f3286a4 3f5c5578 3f7c7f10 be53e95c 3f15f194 -> 3f5aa28c 3f2476c1 3f821121", + "3f084354 3d3b4928 3eaa56be 3efea0fe 3f146e02 3f95a192 bd484b2c -> 3eb56c1a 3f7475bf 3ef14d6a", + "be9df1e1 3f5ce870 3ee7ddea be4d37d3 be5b0ac6 3f401e4c 3e2f81f4 -> 3f6dcd02 3e62aba1 be81ae0b", + "3ea5e15c 3f23891a 3f68dc28 3f486e50 3f217aaf 3f98c013 3e8b246c -> 3f57da36 3fa5eb36 3f5ef88e", + "be77d96e 3f015d35 3d8ec560 be510a08 3f94a46e 3dbe6948 3b226300 -> 3e65a30a 3d415e19 be51a73f", + "3f56446e 3f5b462c 3f8d3317 3e777eee 3f68b4f6 3f175092 3f385b40 -> 3fcf05d3 3fcc85fd 3f582d4a", + "3e8487c8 be099ace 3f78f2e6 3ed21a10 bdf43ea0 be59aa46 3f7f8640 -> be293744 3f6adcfe 3f2b3168", + "3fa9a195 3f4df3a4 3ee66be0 3ec48e54 3f0cbd9c 3ec38ae0 3f9a6104 -> 3fc43bd3 3f74c80a 3ffdba8e", + "3fb80d6b 3f84d53e be30635d 3dd82310 be19e9f6 3d82faf0 3ea95686 -> 3f52565e bda47046 3f14c372", + "3f631f28 3c54ace0 3ee72604 3f2b2526 3f5375fa 3f996c75 3ec823f2 -> 3f3eee0c 3fc1e759 3f81f6a2", + "befba4a4 3f1988c8 3f4ed250 3e022164 bdb9922c 3f33853c be4df9a1 -> 3f24ef63 3eed2d8a 3e675d80", + "3f07ea68 3f97f4a2 3dfb0a38 3f000282 3f93f55c 3f060bf7 3d98a6e0 -> 3fe68280 3ecd18a7 3f0a23fb", + "3f8cf10d 3f5ea2bc 3f297656 3eb91680 3f7607ba 3d3e05a0 3f4c9f32 -> 3ff6c541 3f368a16 3f9eed5c", + "3fa11276 3f833f82 bde92534 3f4f2f74 3e8de268 3e0ebff2 3f475b8c -> 3fafe251 3d7c3dac 3fe506ae", + "3fa6d9bb 3e8abfca 3f7de7e2 3e9c0464 be250df0 3eb6e88c 3f8e680e -> 3d7962f8 3fba8f1f 3fe0a248", + "be6870ca 3f6463a0 3bdf6840 3ec7dfc2 3f6e4034 3f942038 3edc48a4 -> 3f2e4ed6 be8300d5 3e95df0a", + "3fa680d0 3f7485e0 3f5b01e0 bd665358 3f4a5368 3bcb3400 3f8b76e5 -> 3ffddad4 3f5d1288 3fae37f0", + "3eb72a94 3f850e56 3d699e60 3f8eb720 3f66f890 3f5772c6 bd7f96f4 -> 3fae5edc 3eb75aad 3f8bdba2", + "3f6eb7b0 3f2bf6f6 3f1158e6 3f61dc86 3e9faa80 3e8a4c14 3f2ba934 -> 3f766880 3f51d3e1 3fc0f780", + "3f38b728 3ec2f2cc bd5ffb04 3f88971a bdab427c 3e5912fa 3f3efeb9 -> 3ea40e38 3dc94462 3fcd7ef7", + "3fbc2a13 3ecf6f08 3f9c4db0 be60e1e2 3e0e7fa2 3df3d700 3f9bed3c -> 3f1c1616 3fb2b4ef 3fc91b75", + "bed0124e 3e8fb2f4 3f1d94a8 3f3c9dcc bdef3358 3f706dc2 3eeb2d44 -> 3ea8004e 3e6f7de2 3f0cd466", + "3ef35dea 3f2f4dfb 3ee127e6 3e3f0fcc 3f440180 3f6cc98c 3ec2c22c -> 3f863c53 3f61210a 3ebc1ac7", + "be5311ce 3f3065eb 3f421358 3ebcd5e4 3f231a66 3f813d8f 3e3cdf68 -> 3f0ec765 3f0ccbfb 3ea95ebb", + "3e88214a 3f290190 3e01b25c 3f1fbbb6 3f85a8d4 3dbf788c 3ed4e1b6 -> 3f7014a2 3e1b2698 3f3c089c", + "3eb10dc2 3daff434 3f8ad35c 3f0358a8 3ef1efcc bcfa7d08 3f4110a0 -> 3e7f4de6 3f8978e0 3f461c18", + "3caf94c0 3f99e21f bdd60a28 3e36eeac 3f14b848 bd1ed6d8 bd85cecc -> 3f9b7a21 bdd7bded 3e357f94", + "3f8c1cf1 3f416c5c 3f216a41 3ecd2c60 3f097b32 3deced18 3f80e93a -> 3fabf518 3f41d55e 3fc06755", + "3f8f8bbc 3e5a2016 3f295c95 3f408582 3eb7ff84 3f48a2a0 3f3eeca7 -> 3f1db430 3fc52ea5 3fcb5128", + "3f7e7538 3e74a048 be0c77aa 3db63f60 3f187eb1 be5368e4 be1c87c2 -> 3f54bb99 beaf4d44 bd80ed5e", + "3e98d3e4 3f1aed3a 3f6c6b4a 3d309998 3f349d74 3f605074 3f8a2796 -> 3f50d6b8 3f97b001 3ebb06e8", + "3f50d792 3f1cd49f bd750b90 be467784 3f4c688c b964c400 3f20e112 -> 3fa1cad9 bd75c630 3ea340ec", + "3fafb8cd 3f3f0256 bcdb4f40 3e83acee 3f9d28b8 3f289e68 3f2b1390 -> 401ba0de 3f60a18a 3f96591a", + "3faa4f00 3e31288c 3f816993 be0c1f6e 3edf12f2 be777018 3f054592 -> 3f40b18f 3f3084c0 3f0e4acc", + "3f48d038 be5e8d6a be243103 3f9e1ccc bda899a2 be265fa4 3eb1b7ea -> be905700 be935987 3fc0f6da", + "be9957a5 3f74fef4 3ddc64b8 3f8a6ede 3efa9a5c 3f96c1a4 bcaa02a0 -> 3f4f77f1 be7b0304 3f8b3a89" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_mul(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f7799de 3ef15a9c 3f322364 3f4f9736 3f08b0ea be07d1ab 3f7742b8 -> 3e848fac bd881028 3f48bc84", + "3f52dcfc 3f91de48 3f8a78bb 3f1e2d42 3ec50ebe 3edb9500 3ef3b1ea -> 3f0fec69 3f12a92c 3eb3cda8", + "3d9c2100 3f94cc13 bd8f7458 3ca27f80 3f5e2c7c 3e9e1334 be67e9f2 -> 3f934c5e bd87e50b 3c934def", + "3f1b4aa2 be1911e1 be375de0 3f217bc0 bdb3b31a 3d0051d0 3f808b08 -> bd5046dc bd973d4f 3f21e626", + "3f9c0240 3f8ecc77 3ed9f172 3efa0880 3f3b1b22 3ee0c748 3cb86330 -> 3f3feb84 3e09db52 bdbf6920", + "3f8d1339 3d857e1c 3e9ac1dc 3f936c47 3f920c32 3f4e02da 3f9c3b37 -> 3d9a3cc3 3e72e6f6 3fb74271", + "be9e551a 3c009280 3ebc18a8 3f48656c 3f289d97 3f8f8180 3f77dc0a -> 3c0e24e9 3eb50cc8 3f4a5de5", + "3f9cef36 bd9426ee 3f4fc9c2 3f5f20b4 3f1e79ac bd355988 3ca76dc0 -> bd1de8b8 be68fff0 be336338", + "3ea7da10 3f1ffada bd8f2450 3ebe4e9e 3f8b033c 3f9b1654 3f74225c -> 3f247e03 bd99128e 3ebb6a51", + "beefa0fe 3ecff178 bdf6b7f0 3f676c3e 3f9eb36e 3e50576c 3ef60c86 -> 3eb899af be295907 3f8fd786", + "3f768b2c 3f60b086 3df1db70 3f7a1416 3f4106c0 be49c3aa 3edfafc6 -> 3f2b75ad bc93d740 3ee4ea88", + "3fa52629 3f341c34 3f8c8b2a 3f00ec06 3e240874 be5b17e6 3f9f4e48 -> bd70c3a0 bf1f2cb4 3f299abf", + "3f8abe88 3f5d2ef8 3f5de38c be0d7a2c 3e6ee4f0 be7de152 3ea9561e -> 3e157728 be9c8304 bd1b5fdc", + "3f40f136 3dfa2bc4 3f07b140 be47b850 3f57d634 3c8a8240 be060e2a -> 3ddc9706 3e0c9c7a bcebe9c8", + "3f780cbe 3e738d48 3f907c98 3f2b36ba 3f2aed26 3e73571c bd58190c -> 3e2520e8 3e970658 bc5bdb80", + "3e6ee340 3ee31ca6 3f92864f 3f8eb977 bdc72570 3f55638a 3f073888 -> 3ea8fa2d 3f8cd5c0 3f7e0800", + "3fb2946f 3da82914 3f8f1da4 3f2d045c 3f967950 3f7585cc 3db02ea4 -> 3dd15a44 3f86f1a4 be3e6970", + "3f63b7b0 3e868aea 3f4acac8 3f41ada0 3e4e38be bdcd265c bdbe6438 -> 3d9bdd1a 3c8ab480 3cac3300", + "3f01e412 3f568a30 3f6c022a 3f949845 3f849d82 3ea2b6dc bc141400 -> 3f5a76f9 3f1a5120 3f11096d", + "3df7b418 3f9c0e93 3f8adaa6 3f3e14f6 3f4c643e 3f860f10 3ec6a662 -> 3f984078 3f8ba628 3f3002f8", + "3d780dc0 3f78d6f0 bb517800 3da4ef50 3e2c9082 3f86b943 3f44d642 -> 3f6c4f37 bb522296 3da2a05e", + "bee4a9c5 3f2975f7 3ec21b20 3f6ae394 3e9d9c8a 3f843b51 be4300da -> 3f5dd878 3ebf3d70 3fb3e276", + "3fbbbe93 3db17330 3f94c48e 3e5d7bd8 3db3d498 be56d427 3f85afc7 -> bcefe274 bf666e9c 3e6bea96", + "3f795ada bcdeb1a0 3f9a2131 3def0278 3e88103c 3e9311b0 3f34a5c5 -> bbfdb338 3ebc7f76 3daa7bff", + "bc840070 be5de80a 3f9777b3 3e023984 3f94b3d6 3f72b2a4 3ebe523e -> be5d53fd 3f97982a 3e038b04", + "3f0de8b0 3f0b9c40 3eda1f6c be5e57c5 3dc74570 3ec6ba70 3eee5570 -> 3e8b8003 3e902436 be1c76da", + "be87ca14 3e95e934 bbd984c0 3ef4d97c 3f08e4cd bd8c80cc 3e766c14 -> 3ea868ae bc0b9525 3f13147b", + "3f8149d5 3f961618 3e8d6c02 3eebd358 3f80e994 3f17f3a2 3f109c82 -> 3f972abc 3e26ba5e 3e842ea6", + "3f5510a6 3d2ec258 3f9b5ece 3f938e02 3f03e9ae be3f3e0e 3f6d5858 -> 3cd083db 3c742880 3f8a9b0b", + "3f2beaa2 3ee43c56 3f0a5532 3ecacd30 be28f00c 3f3016aa 3ede5eb0 -> 3dc6b614 3edaab48 3e7b8551", + "3f636d86 3ef8f2c8 3e3bd39c 3f9ec8f2 3f26edbe 3ea869ae 3f2defeb -> 3eabff7b 3d97b324 3f6321d8", + "3f8963e6 3f75f56c 3f637390 3f7b2350 3dd8c78c 3e5c2b00 3ef5f27c -> 3d1e6930 3e0f38b0 3ede20fa", + "beb465de 3f283964 3f6aa4b6 bdc35be8 3dd5f810 3f874650 3f855104 -> 3f5d4dbd 3f65f1dc bdc08003", + "3e2e55e4 3eeca434 bdf58fa6 3f54ff00 3ea65976 3f49d260 3f0c243f -> 3ed17167 bdecb6a3 3f4495b0", + "3fa5e44a 3f33f7c4 be2be76b 3ee641a0 3efcb278 3f8735d6 be228d99 -> 3e775d9c be387438 be6711bc", + "3ed48774 be20fb96 3ef0af8e 3dd72b58 3c6fb2e0 3f91564a 3f88db52 -> bdbe4631 3efe37c4 3ddd5970", + "3e8d3c9a 3d9a5050 bda03a68 3e2342f0 3f5925bc 3e497c68 3f04962c -> 3d93da70 bd79737e 3e0d8cdf", + "3f9bedda 3f5fb07e 3e774858 3f7b04fc 3f618a0c 3f248d51 3e93c414 -> 3f3f4402 3e0bacac 3e05ecf8", + "beef973a 3d5a6dc0 3e224b92 3d9e081c 3f4a6278 bdf1a2a2 3f8a9fb5 -> 3d6fd5fb 3e7733b1 3d97e4d2", + "be200c7c 3f4e6d6c 3e900502 3f5cbfb4 3ed13e28 3ec7394a 3f2ca700 -> 3f618185 3e9dc54a 3f67fb68", + "3f15f5b6 3e4933b6 3f86578c be23ff27 3f95f004 3f9c75b1 3f95dcb0 -> 3e5d66d8 3f97d6d2 be34678e", + "3c815800 3f9aaaac 3ed85c88 3f3a0700 3eaee688 be61c7b3 be443960 -> 3f990f11 3ed4312d 3f3686fe", + "3fa2da2e 3f573410 3f381bd4 3f5ccf30 3e27796e 3f4d7a90 3ed31702 -> bd5d10b0 3f09e1d0 3e5ece28", + "3f9c117f 3d7c4e30 be636e61 3ef2b8a8 3f807075 3f9e3b9e 3d97c888 -> 3d7d5c77 be9276dd bd7a54e0", + "3f067b7e 3f63f632 3f0c1107 3e421aa0 3f87613a 3f8bf796 3e65b1fa -> 3f6addb4 3f12f21c 3de604c9", + "3ece5ed6 3ee245fc 3f6404c6 3f75aa02 3f2ba1ee 3ebc5154 3f631f3a -> 3ec43763 3f29ea76 3f6a7e88", + "bd23dfb8 3f7c64a0 3f19ba05 3e4bbccc be17099e 3f8326e1 3e36d990 -> 3f83fd7a 3f199340 3e526ee4", + "3fba263d 3f4fe6ac 3f9ff842 bb9fa3a0 3f562214 3c46dfe0 3f465e0a -> 3f1e7445 bf0bb2b8 bb56bf08", + "bea3ea8e 3f82c558 3f1da3e2 bda80708 3f9e3a14 3f58c050 3f5e2b72 -> 3f71c4c2 3f2560b4 bdaf22e4", + "bd9c0914 3f900e9e 3e9300ae 3f08b0d0 bd8308c0 3f55852a 3ecdc76a -> 3f9bbc24 3e94dc74 3f0eeb5c", + "3d016c30 3f8a0b88 3f939296 3f3e3c6d 3e3d4798 3f466c48 3f31c8bc -> 3f867d4d 3f92861c 3f3c6646", + "3e8900b2 3edad4c6 3ccda410 3f66a352 bd1d6864 3f92a157 3f0da343 -> 3e9e0679 3cd5a65c 3f4b1177", + "beca8147 3f0c2082 bd63a108 bcebf400 3f54d3ac 3f330e74 3e95b70c -> 3f157948 bd7eb05b bd16fe6f", + "3f3a2068 3ccc1c50 3f4aaae4 3f2f2dc7 3f45685a be6c30dd be64368c -> 3caa2534 3daaa2c0 3d9b6e08", + "3fa82f98 3d81cd70 3f6a3e64 3f954f58 bd737680 3f836958 3f51284a -> bccb8ec0 3f727269 3f62d2f1", + "3f928a69 be1cd2a4 3f00844b 3ecda05e 3ef95e70 be2daac8 3f4f27c8 -> bd8174e7 be2e4654 3ea0b5cd", + "3e95ab78 3eae6d84 3e88b79c 3f832556 3f737da2 3d844178 bc2c17d0 -> 3eabefad 3e46aa34 3f38cfee", + "3e8aa1f0 3dbdd338 3ea020e0 3eb59678 bdec4a5c be0fdf44 3f3a78c5 -> 3d847f22 3e5d5bc6 3ea83be9", + "3f679d90 3de3d24c be43c565 3f29e98e 3f417880 3f2ad65f 3eee31be -> 3db179b2 be08d919 3eaf678e", + "bc6fc380 3eb85d7a 3f7c04a0 be6a7c78 be064006 3f7c7af8 3dc1ff40 -> 3ebb6ab8 3f7c119b be6d97b7", + "3ede3874 3f3141a4 3f51d030 3dc12398 3f1e7926 3f3bb3be 3d9bc004 -> 3f13f28e 3f3984b4 3d675fbf", + "3f8a1c16 3e8c9e2c 3f68e318 3f88f55b 3f746b9a 3f84d15e 3f084aaa -> 3e85c142 3f72585c 3f07b6be", + "3fbaff84 3eb45be8 3f0fd374 be46b872 3f6aca80 be2541e9 bd8f347a -> 3e9e878a bec867ae 3ddfca2c", + "3f92e0b4 3ee2eb4a 3f7ce6a2 3f7b36ba 3ed37de0 3dc07744 bca20d10 -> 3e142e84 bd206b60 be2b01f8", + "3fbcb003 3f08572c 3f8074e6 3f550da4 3ea81a6c 3f9287dc 3f9053c7 -> 3bac4780 3f9bdede 3f7d1d54", + "3f334bae 3f3e403f 3c29b240 3f03fd8e 3ec0a8e2 3ece0188 3f8f4606 -> 3ed64970 3bc554de 3f0f0567", + "3fa41ccd 3e18ae38 3f57fed6 3f868672 3f6133a2 3f97671b 3e12c5bc -> 3e012143 3f855070 bdd3b4e0", + "befaa894 3e30c4b0 3f9b877f 3e4e95fa 3f65cb72 bdaecc46 3f37041e -> 3e39a07e 3fee2b8c 3e6b6b67", + "be2bc004 3f8a74c8 3eb9db72 bd345c8c 3ec749ac be1dde5c 3f74221c -> 3f98a3c3 3eddd5ff bd35c388", + "3f93fa9b 3f93fca7 bc48bb60 3ec0bcc8 3f924982 3f27a31c 3ea40d08 -> 3fac6dfc bbf14335 3da53e74", + "3f7a9248 3e9a5958 3f0a5456 3e94ec20 3f2faec2 3d78d648 3f9312ec -> 3e55e6a6 3d328a88 3eaaa4b9", + "bddce9b8 bdd8c1a6 3f9714eb 3f488b4c 3e2502cc 3f8b1f15 3f9c839e -> bdec5ea8 3f95aa6e 3f43b9a6", + "bca45530 3f84ed67 3ec2d04c 3f2e41c3 3f7ae940 3e268dc0 3ecd5986 -> 3f84faf9 3ec61605 3f3059ba", + "3f8639ca 3f65b910 3e9e86ac 3f9e57cd 3e9cf0b4 bdacb07c be1f32d6 -> 3e7aab14 bd2dd260 be86107c", + "3e210c04 3f1b21c4 3ed95d02 3f7ca09e 3e8e5634 3f895575 3e184c4a -> 3f098440 3edbdb2a 3f5ace26", + "3faa0300 3ed97550 3f9497b8 bd1e34f4 3f8d4c89 3f50de44 3f9a40f4 -> 3ef777a4 3f608348 bd494e80", + "3f8aabd8 3edd87c8 3ed85dd4 bcb37bb0 3c129020 3f7b1ae0 3f21d1e8 -> bd029340 3ed3e26a bc57e568", + "beafaeac 3f5b74ec 3f721ca0 bdb2b1f0 3e77feac 3f95ace0 3f994b84 -> 3f8a42d0 3f640b3f bda693fc", + "3f349a26 bc9de020 3e9b8ce8 3e04d99c bdd6e45c 3f86f948 3f868beb -> bb8b3ed2 3ea18777 3e09a4bb", + "3f0d080a 3f017b54 3f85f557 3f910acc be71b30a 3f52f42a 3e748602 -> 3e254070 3f71f205 3f286fd4", + "3ea30062 3ef0716e 3ef04a24 3f902817 3f18c52c 3ee455b6 3f9caa76 -> 3ed19365 3ec5e811 3f9a6f46", + "3df4e1d0 3f918a36 3f8125bc 3d42e1a8 3e3d3c44 3eecc2c4 3e004f04 -> 3f835a7c 3f71b123 3d2e7fc1", + "3f951de5 3f3a91e0 3f52f6dc be5b5243 3f93a896 3e4df02e 3e5e4390 -> 3f5bf368 3d69f7d0 bc9a34d0", + "3dbc6718 3f1b68fa 3f8a7325 3f7575a0 3f8175da bdc4af6a 3e18eef2 -> 3f1b92bc 3f78faf1 3f62404e", + "3fb385b5 3f20443c 3dc2744c bba47ec0 bdbeca54 3e12c1a0 3f40fe5c -> beaae682 bc9cbda0 bb576d6b", + "3c8a08e0 3e67de38 3d159938 3f653a80 3ef25dca 3f9ca10e 3e41f9c4 -> 3e65cf7f 3d16298d 3f621903", + "bd2af3c8 3f0b7afc be2bdecc 3f75d464 3eaf225a 3f2d0414 3f4a1930 -> 3f0f4f80 be2e3210 3f77fd6c", + "3f99f0f9 bce185d0 3f8c7515 be0ef7b6 3ebef03c be69bd90 bda44c2a -> bbddc51c bf060cb4 3d2b12f8", + "3fa88a7e 3f233eca bda92b7c 3f55d976 3e958190 3f53192e 3e93593a -> 3d30fdf0 bd8219a0 3d54df50", + "3e39abac 3f29fcf0 be4a23a1 3ce50b70 3d8d87cc 3f1f1566 3f1c70a3 -> 3f0d4bc6 be3c437b 3cd4e4b2", + "3e2de1b4 3f099d4a 3e0fc3c0 3edc448c 3e68e7be be63b632 be194ba3 -> 3eef1f82 3de3d904 3eb143fe", + "bed5855b 3f7fddfc 3f9fd09e 3ed6b510 3ef4cbfc 3f1c228c bdcd0732 -> 3f9bc6fa 3fb9d06f 3f1c9b0b", + "3ebe2bc6 3e7d917e bdec587e 3f48ae98 3df8fe64 3f1587e1 3e8cd8f0 -> 3e2ad62c bdc7d60e 3f12a5f3", + "3f73a108 be0603f4 be427bde bd8c8f18 3e18a3b6 3f9368ea 3f8a9631 -> bccbe644 be5e8cd3 bd979f62", + "3faba95e be61bb2b 3f2eac08 3cbc0680 be484547 bd92bb94 3f064f23 -> 3e083485 be98bb00 3c08515e", + "3f3f1e0c 3f34f93a 3f2e1fcd bdd60e88 3f9f3f14 be38da72 3f8670e0 -> 3f55f464 3da551e8 bdde191c", + "3f824088 bda63554 3e29fbbc 3f882d65 bd1095e8 3e0d360c 3f8dbfe3 -> 3b8e5030 3ca6e6a8 3f971009", + "3d620bf0 3f958114 3efcf388 3f994896 be59c9e9 3db02158 3f29e18c -> 3f8b7fab 3ef03132 3f967015", + "3ec850bc 3da47f3c 3e7ed0a4 be2fbbfa bdfdfb06 3c9016a0 bd8c807a -> 3d3850c6 3e1cdfdc bdcc86a5", + "3f90332f 3ea1ea66 3e15e950 3ed8eea0 3edcf400 3f200ff7 3f77f9e2 -> 3de8e70c 3dad3de0 3ed145af", + "3f633988 3ee8aa48 3f237068 3e028690 3f03be7d 3ef31570 3f99abfc -> 3e846dd8 3eae7dac 3e19c2ef", + "3fb783c9 3f64e218 3df09a98 bd866d9c 3f438452 3f9cd64e 3f36e57e -> 3f175a70 3e1f28d6 bd1ec898", + "beb3d7db bd7cdbc8 3d9a7838 be6e7b5e 3f8bd232 3f8e36cb 3c870840 -> bd74a7ee 3d9471c2 bea06f48", + "3eabc386 3e39ae8c be3b4b4a 3f8f1ec5 3f86a457 3f5e71d0 3f958a03 -> 3e3cea06 be330eea 3f97331a", + "3f785ad8 be6bed93 3ec7c6f4 3f487ca2 3f433d8c bde3d0e0 3f202d6a -> be359ac8 bcf97d40 3eff5e5c", + "3ee722b4 3f8d84ae 3f51ef8a 3f05cf08 3f5c7972 3f368992 3eefb130 -> 3f84a712 3f36bd4a 3ecb5cfe", + "3ed47a26 bdf2f94c 3f926f5a 3eb9789c 3d2d4190 3eef14e6 3f5bbdb8 -> bd9267fa 3f64158a 3eae91c8", + "3b81f500 be3752ce 3ed02c50 3f16d59c 3f43a260 3f33c1a0 3e280750 -> be3726ea 3ecfed5d 3f165599", + "be0b22a8 3f12433b 3e84c834 3f3675cf 3f5b18e8 be5ef032 3dc80c5c -> 3f15209c 3e9ac06b 3f4cd489", + "3f7fd1fe 3f7a2fd8 3ecd6b54 be7ee4eb 3f8b135c be251fad 3f25e20a -> 3f87e8f4 bd83d41c be253abc", + "bd674210 3f015f7e 3efd2440 bc9aa1f8 3e179010 3f4c5faa 3f985dc2 -> 3f0798a3 3f00030e bc98f883", + "bdcce220 bd9d8c3e 3f01813c 3f427496 3e1b9d70 3d7564c0 3ef30264 -> bdaae9f0 3f0daf34 3f4cacfc", + "3fb73b8a 3f9de6a9 bd658fac 3f9fcd97 3edf8888 3e58ae56 3e430e10 -> 3e7465dc 3bec2990 be4b0c50", + "3e597608 3e9f16de 3f87ac9d be7a7ddd 3f2e45a0 3df6b868 3f4fd050 -> 3e944db2 3f5caa71 be707a92", + "3d1ebfd0 3efc5214 3eb8eb10 3e52b584 3ec1a4bc bd224508 be5197e0 -> 3ef63d70 3eb177a6 3e48defd", + "3f166514 3f94c204 3eb75558 3ebb7cb6 3f93b0fb 3e651942 3f9c8f5a -> 3fa233c1 3e477367 3ed4102e", + "3eba8cb2 3f80716f 3f9a009e 3ee8631c 3f78eda8 3f5f8058 3f6d0430 -> 3f7e4cfa 3f92e112 3ee21bbd", + "3f9441af 3e543a94 be7d519f 3eccc4e8 3f608c80 3e547a18 3f863163 -> 3e360769 bca656c0 3ed83e84", + "be763fae 3f2f38e6 bcc6b310 3f379e64 3edb113a 3e03acce 3f92ace8 -> 3f47548c bcf0567d 3f312d1f", + "3f3d873c bdd7a264 3e9b8e68 3f830a7f be1a158e 3edbce56 3ec41b00 -> bc7fbf90 3e33aa36 3f0e5e52", + "becf3c8e 3f55fc58 3f21dcd2 3f08624e 3f9e72a2 3e5e9340 3f9168af -> 3f416205 3f552338 3f00e045", + "3f138b6a 3f8dabff 3f0d2efc 3f7557f8 3efead68 3f916610 3ed21cee -> 3f494515 3f183e77 3f21f822", + "bdf43bc4 3eb793e0 3f872576 3f4045de 3f805e95 bb48be00 3ebdef7e -> 3eb783b3 3f975002 3f4eb23f", + "3e0c3b5c 3e078110 3f661ff6 3ef3b2b4 be1e938e be30ec6f 3f77cf54 -> 3de425ce 3f412a56 3ef2a15f", + "3f7a743a 3f263a08 3f2e1c90 3f5f730a 3e4664b8 3e95ed5e 3f6c193c -> 3e0c6f68 3e569b92 3f4e746b", + "3f296dba 3ebd9d8c 3f8f0013 3f63a73a 3f9ebcdb 3f94c8b4 3f232b80 -> 3edbc04d 3f9e5e26 3f2d04b8", + "3f6fd68a 3f2c9b6c 3f812336 3f9718f4 3e787c4c 3ef896b0 3eca1610 -> 3e488d44 3f05c9aa 3f02d309", + "3f61ad04 3efef88c 3cb9e3e0 3dc5eb9c 3e3abfa2 be73a8fc 3f57fe2a -> 3e0e632a bb07c9d0 3daaa752", + "3ee04ae2 3f7bbcda be45dc30 3f924514 3e0f7fb0 bda7efb6 3f72d166 -> 3f1ce9a4 bdd026c9 3f8ef86b", + "3de13fb0 3f8f8935 be286c4d 3d5bd868 3f17d572 3f3cf53c 3f2a0819 -> 3f891cc2 be23926a 3d53b9b9", + "3fbdfcc6 3f982564 3f8e4f52 3f81a1b9 3dad2ed8 3f7bcc40 3f266a3a -> beda5670 3f8ad7b6 3ef932e4", + "3f470674 3f91ecc5 3f0ba772 3f5a3c08 3f17798c 3ea5889c be35aa62 -> 3f473528 3e845e01 3d93c278", + "be98b0a8 3ed09ae2 3f06b598 be745aea 3e8fc1dc be2f93b6 bda84e42 -> 3efd5937 3f35c55d bea19ba8", + "3f2ec290 3f87bb99 3f7f1d12 3f5999ca 3f7e8f5e 3f705a1a 3ebd85de -> 3f87362c 3f7477e3 3ef814bc", + "3f676158 3f6c6180 3f607460 3f6649a0 3f7f561c 3f7b02ee 3f4c469a -> 3f6bd3b7 3f5c805b 3f3c3bb7", + "3f1441fe 3e24c1ec 3eaaf402 be1bd7c8 3ce93030 bd66c118 3f7ed73c -> 3d901d4d 3e04be08 be1b6f28", + "3fa54236 3f02e182 3d24e1f8 3f4c6660 3f583dbc 3f603bfe 3d660370 -> 3ed14644 3d0a77c9 be32b650", + "3ee7629a 3f0f2f55 3d2d4410 3d7f4838 3f28da28 3efe23c4 3eb3d27c -> 3ef25038 3d05d471 3d346eda", + "bea87671 be09f9b7 bdb2b2c4 3eae2cf8 be523769 3cf4e970 3f93ddea -> be40b16a bdebbcc2 3ea547e1", + "be582a72 3f6b3310 3f99f934 3f582370 3f17c160 3e8c9d9a 3f178c42 -> 3f7f6adc 3fb18ce3 3f6ac13e", + "be2f6588 bd6c46a0 3f94ef9c 3b176c80 3f914392 3e307bec 3f4b2e9c -> bd66d142 3faa0cc6 3b1cc66d", + "3e6dc900 3f34cef3 be4b3253 bdcd72ec be3f878e 3d8315c0 3db62040 -> 3f02f82d be1f0831 bda1fbd9", + "bc6f4740 3f15a020 3f16551e 3db3df9c 3e6fc432 3e497570 3edcbbd0 -> 3f174c8d 3f181898 3db55e2e", + "bdd8b650 3e2f4164 3f41f390 bc851490 3f94f652 3f8b8db3 3f606b46 -> 3e2c37e8 3f401955 bc86d14a", + "3f74e898 3db2ddc0 3f9a2178 3af8b800 3eb3da62 3f36d3f4 3e5ea00c -> 3d07b79e 3f5ff814 39fa06a4", + "3ea534aa 3e03d428 be428ba5 3f465304 3d979734 3f4ebaa4 3f543de6 -> 3db8e180 be3676bc 3f3b62ce", + "3ec1dc54 be0e270e 3e431368 3f9daa05 3f9ba24a 3f50f7ce 3f8d22f0 -> be19c5c8 3e358183 3fa3ca70", + "bd5e6c00 3ebb3a94 3f01a77c 3dde8298 be303a3d bdb68d2c 3f99b707 -> 3ec7253d 3f095283 3ddc152d", + "3f98f228 3e1fae98 be6cffbb 3f9c4d40 3eaa0728 3f9561aa 3f34e73e -> 3d00f82e be8e26d8 3f4b07dd", + "3ea6889e be1c3e12 3f92eaa3 3f3630ec 3f198ec4 3f8f8e02 3f7f3e6a -> be07e7fe 3f98b93d 3f36041c", + "3ddc7648 3f06f807 3f1028f0 bdb80ed0 3f23a2ba 3f5a2002 3f62fc48 -> 3f01ba0f 3f0ddd2d bdb5cff0", + "bdb19420 3ea25d70 3b035200 3f995408 3cc47340 3f8312b3 3f021b82 -> 3eb01b14 3b030c04 3f9fddc0", + "3f907ef4 3ee536e8 3f925604 3e8bf780 3f0da59a 3e8873ea 3f188883 -> 3e634315 3e49561c 3e18367d", + "3fbb5b98 be558bea 3f4db884 3f7def54 3f63f74e be02a560 be57026e -> be335133 bf05d14c bf43cd64", + "bef69b52 3e95df26 3e8a463a 3ebb6ba0 3f71dbc8 be13e22a 3f9073ed -> 3e99dbf8 3ed67e30 3eafd12c", + "3fa46e2c 3f98bf46 bd52dd30 3ee09d6e 3e9e1cb0 3d838e28 3f36111f -> 3e08f968 3c2a7510 3e8d488a", + "3fa47df4 3f821e5f be68363a 3d6dffa0 bddb108c bd534440 3f25b4cc -> bedbedbc 3da3301c 3d021f3e", + "3f331c0a be7b5b0c 3e40d4ae be505b56 3f1ae20f 3e1ad7a0 3e6e86cc -> be35e49b 3d9ca2d9 bdc1130a", + "3ef64806 3f813836 3e2c3b4c 3f7fab6c 3f3ac95a 3f58bce4 3d3d45c0 -> 3f60d439 3e1f8690 3f0a5ee9", + "beef579f 3f7b6034 3f14f240 3ea88fa2 3f6b1df0 3f2133a8 3f910c96 -> 3f827b15 3f2ebaca 3e9e10ce", + "3f017bde 3f71d9dc 3f8ad684 bbb45f40 bd437cf8 3f913bb2 bded9c4e -> 3ee35eec 3f944adf bb1d1c90", + "be08a934 3f47c614 3f2f0f5a 3f3f5961 3f964576 3ec91530 3eba6174 -> 3f432282 3f3d3f5b 3f4f970f", + "3e5ecc78 be2c483a 3ea3994c 3db7cdc8 3f74518e 3f254626 3eb49480 -> be2a925a 3e96fbe0 3d9deacc", + "be8284fa 3f83e1ad 3f30a34d 3f5444fc 3eef69c2 3ed47986 3f883ee5 -> 3f95c7c6 3f4afaea 3f50c89b", + "bee85e8f 3ee20064 3f7a9828 3e65fff8 3f119814 3f439ba0 bdd63efc -> 3f071e5d 3f8ab651 3eaca6f7", + "bdb206a8 3eb51048 3f86a8f4 3ece33be 3e887d08 3dcaa9e4 3e57eaec -> 3ec09b6c 3f91350a 3edc58db", + "be471e26 3f3bff7a 3aa41400 3f4e3e6e 3e50c930 3f6ea3a2 3f3c78ce -> 3f5919cc 3aa63de6 3f58d299", + "3f844c2d 3c4966a0 bc2c7a00 3f9b6631 3f9df6c1 3f07ceec 3ea41d8a -> 3c7a215c bbb18f78 3eb910a2", + "3fb16457 3e1426ec 3ed4a488 3f3c1350 3ef07540 3d8e7568 bc1f1100 -> 3d1d099a bdf637b8 be96354c", + "bd44d7f8 3f747730 3e8bb2c4 3eb5e5b2 3f60eef6 3e5fe266 bcb12138 -> 3f75e42c 3e90f1ac 3ebed3ea", + "3f4ddd12 3f047abd 3f6fdfda 3ee02612 3e97e1d4 bddd83da 3f9a31e4 -> 3e663166 3dd0ea30 3f0284ab", + "bdd7d6a8 3ee0a286 be67e5c5 3c60a500 3f3b9922 3da027dc 3e09a91c -> 3ee6f5e3 be7e6d0e 3c752314", + "3d93c650 3f3d4a10 3e856734 3f15aa92 bc866950 3f53295c 3e14e378 -> 3f2f682c 3e83b799 3f0c6fee", + "be62b328 3ec5ff48 3f6b068e 3f8601f2 be61e5c1 bcf12008 3f91f23c -> 3efb8042 3f904b58 3f81d91b", + "3f9a5adb 3f7a78a8 3e4d2e58 3f134356 3eed5612 3f0201d8 bd9f9c58 -> 3eb0e11a 3da6d090 be30a4fc", + "3f538e7c 3e9adc7c 3f06b95b 3f2ffc97 3ec6fece 3ebb55f6 3f5e52a2 -> 3e193fcf 3e804039 3f1cdac6", + "3f8dd050 3ec8976c 3ef12178 3f7ca17e 3f9ee4d8 3f8d8cba 3f9475a4 -> 3efe3b1c 3f06b497 3f94af42", + "be59b9fe be7368df 3f82a424 3f252242 3f24cf3e 3f8a9f0c 3f04e765 -> be82ec33 3f805614 3f360454", + "bea6b7c0 be6c9ad0 3f240f24 3e88d4b4 3f95ec43 be3e02bd 3e88772e -> be5f68c8 3f636492 3ea982aa", + "3f47cb7a 3f52bafa 3f303f3f 3c9dc310 3f520324 bd1a22d4 3f2f2fba -> 3f352fa4 3e061390 3c6dc9c5", + "3da928c8 3f7bfa40 3f92d6fe 3f584d4e 3e55f980 3f06e63c 3e818be0 -> 3f6b838e 3f8d1a37 3f4af4db", + "3fbf229f 3e49d74c be427666 be590c87 3deaec60 3f9d7c98 3f505b28 -> bd81f7c4 be82ad8c be1cbacc", + "3f8f8c95 3edc06a0 3f97108a 3f88ede6 3f2cc3c0 3f272510 3f1d2fc6 -> 3e8bcbf6 3f388628 3f1b4f9c", + "3e586fb0 3f91551c 3e2e48f0 3eef4dc4 3e9a5756 3eb42e16 bb901180 -> 3f77bfa9 3e16693b 3ebc8055", + "3f6cc0fc 3f8428be 3f37b366 3e2f1a38 3f64bba2 3e66ee38 3f83a8a7 -> 3f6e4824 3e507ef4 3e33bb37", + "be046d2a 3f8fcd26 3f866a79 3e3d4376 3e9cafb8 3c842eb0 bde9c6ba -> 3f9cb4fe 3f9784b9 3e588893", + "3f6dd9f8 3f14acbd 3e6ab5f0 3f4e7af8 be29e77e 3f33e06e 3f7e85bc -> bd461310 3e29dd9e 3f4d5f81", + "3cc94700 3f421e2a 3e4c4934 bdd604e0 3f0f38c4 be38002f 3f93a370 -> 3f400445 3e465d5f bdd6d369", + "3fa6355c 3f3a1bbf 3e0299b2 3f94295b bd99867a 3bf309c0 3e348ccc -> be9356f6 bd16e84c bda4e1e0", + "3ec5b638 3eaf5e00 3f5df650 3ef143d4 3f413da2 3f8484ed 3f302757 -> 3e9ec400 3f60fd05 3ed434e0", + "3f1336b0 bdf59ef0 3f228aef 3df35f18 3ec60734 3ef4d13a 3f363178 -> bd9f0174 3ee3881c 3dcb05b9", + "3e7547d8 3f987260 3f692be8 3e5e9628 3f66369c 3e80b440 3ed9b226 -> 3f94c4c0 3f3f5bfc 3e3ff083", + "be0998ec 3e894232 3cd0e540 3dac16f0 3e1eee68 3f900536 3e376dfa -> 3e98d6fa 3ccd61e0 3dbf124c", + "3cea6cc0 3f2c2e86 3e8dfc50 3e0622b0 be771278 3f75a3f6 3e20fc90 -> 3f2610d1 3e8dd238 3e02e687", + "be3ab6b8 3f1cb72c 3daec878 3ea890fc 3f6ad694 3d65e650 3f564ea6 -> 3f1f13e0 3dccdd25 3ead9274", + "3f2bc2b4 3f50875e 3f8369c0 bd9e56b0 3f179757 3e4455a4 3f0b5292 -> 3f177781 3ef09786 bd5bd6c2", + "3f619eaa 3eeef508 3f30ad2b 3e8d312a 3f80c5fa 3f802510 3e0fc404 -> 3ef03ac4 3f30da41 3d88e776", + "becd3042 3f176f26 3e0c7c32 3eb30410 3f947fb8 3e8497b0 3e23a9de -> 3f0db70d 3e3634a4 3eef4aab", + "3ee2f9a0 3ddc6638 3f9e719b 3ec19070 3f44c4a6 3e9be4a8 3d87fddc -> 3dc5caf3 3f5b2e54 3e62e7f3", + "3e8b2434 3f1352da 3f91ae86 3f9db004 bd604448 3f568a6c 3f25614c -> 3ed23084 3f8b4521 3f8e84a8", + "3f4577a4 3e7ecea6 bdb59264 3f502444 3f2ef503 3f6288ee 3f1c478d -> 3e4095e2 bda5739b 3f1199fd", + "be66eaa0 3f5650fc 3f8d780c 3b2f6f00 3f9aaceb be6ec776 bdb0814e -> 3f4c3e92 3fb4cf4d 3b5a6778", + "bef1ea9b 3f995d01 3f9d633b 3f80eb92 3f860946 3edac85c bda25ca2 -> 3f95f233 3fc7f9b8 3fc2a9ca", + "3ee29c40 3f84f824 3f4b6cf4 3f896958 3f91918a 3e694b58 3e5425b0 -> 3f8d0c06 3f05e6fe 3f326304", + "3fad6fc7 3f4d5020 3e96711a 3f4f9038 bdb20266 3f3e8fb6 3ebde858 -> bec21f30 3e44ab92 3df518f8", + "bd306038 bcc5d4e8 3f495dc4 3e6829b0 3f1fc2ec 3f4ca2ea 3e80d334 -> bcc908bd 3f4b1b23 3e6fa4ff", + "3f06fa64 bdf06700 3e006320 3f4f6ad0 3e934862 bdc780d8 3e9dcb1a -> bd961c4c 3d586626 3f03c25d", + "3f2b7674 3f944b4a bccee3b8 3e17a4bc 3e2498fa 3ef359c0 bb60dd00 -> 3f01deff bc862e63 3d46e944", + "3ee4b3aa 3ebbc182 3f7d5192 3f4bd1ec 3ed06c30 3e1cf880 3d8462bc -> 3e8a0762 3f1d82ca 3eed5309", + "bee7fdb3 3f0fb78a 3ee23e6e 3f85cd12 3e8b7cda 3f4afbaa 3f6d8c88 -> 3f3f1865 3ef77958 3f8a2bb0", + "3f909b1c 3e45a2c6 3f07ccba 3e313e88 3f60c144 3f6b4ad0 3f97df66 -> 3e2a6281 3ef6c797 3e5696fe", + "3f855371 3ed6a856 3c59f800 3f197ee4 3d9a1784 3f9311ef 3e871da6 -> 3c7c8500 3c7bcb43 3e0f3938", + "3f83265c 3d8d7d54 3ed34e10 3f804cba 3c9c5aa0 3dfea84c 3f61f81e -> b9b70000 3d2dc550 3f61c1f1", + "3f7a9620 3f860619 3f2e387e bd0732d8 3ecac994 bd8115ea 3ef875dc -> 3edb2d6a bce21220 bc8628f7", + "3f184f72 3f6ef990 3f81e857 be7068ef 3eb82876 3f215906 3f67b02e -> 3f13ef1c 3f4aa950 be62d380", + "3f499286 3f31bc28 3f9cccc7 3f0864fa 3f4e620e 3d760558 3f4dc636 -> 3f169c68 3ea3029e 3ee6a5e0", + "3fb70864 3f39e9b2 bd5acf70 3da79940 3e823484 3f867ec2 3e111d4a -> bd4536a0 bd6aafec bc9861bc", + "3e202a00 be621f44 be53fd46 3b5b9880 3ed64d40 be51ae55 be0c1fba -> be4d8ecc be2c0ae4 3b348c75", + "3eb8f6a6 3f8cca1e bd33d310 3e6d71e8 3f3b6d8e 3ee707be 3dae0ca0 -> 3f7e54ed bd102cc5 3e1ef4cc", + "3f5078cc 3e7e5cca 3f159920 3f772eb6 3e8995b4 3f1bdea5 bd93a2ca -> 3dcdc5d6 3ecbe5a8 3dfb0b28", + "3f2a9a02 3ee01af6 3e60d1e8 3eed018c be3e2d30 be2f3860 3f696402 -> 3dbc16bc 3d457114 3edf0e8b", + "bd93e54c 3ef7caec 3f914cd6 bdddabbe 3e0b7ef8 3dbf9cdc 3da19da8 -> 3f039fe8 3f9acfad bdec6a5f", + "3f8500ec 3f78d000 3f818516 3f9876ce 3f15c49b 3f4ab81c 3d8e8b30 -> 3f0d86e9 3f4b04cc 3d2221a0", + "3f758a92 3f826b5f 3d508810 be342dfe 3f5bdc76 3ef00944 3e58c7f4 -> 3f618571 3ccc9414 bd2fc990", + "3e0c62a8 3f1cb9e8 3ebb88e4 3f9e27b4 3e447b80 bd144548 3f5e145e -> 3f0b5cd0 3ea0e4db 3f9b483b", + "3f1f38f0 3f52cc34 3f4a5ad4 3eb563da 3f9bb141 3e4e5040 3d99cfe8 -> 3f6f299b 3ecbb5d4 3e1a172c", + "3ea47cba 3d914924 3db88f8c 3eb11ba2 3ddc8220 be79c884 3f8a6c9c -> 3d4f45b3 3d5d9c0c 3eb5bde1", + "3f09099a 3f528ef4 3f83208d 3f6f0640 3f889344 3f8ddd21 3f83e5ca -> 3f5a1c08 3f8abad3 3f72eba7", + "3f399e52 bda6a036 3ec7188c 3e5260f8 3f1c2d47 3ee6640a 3f8be800 -> bd6f0804 3e6f644f 3e609152", + "3faa1d08 3f04d53a bdc02700 3f98e06f bdf64080 3eec3eae 3d80b56c -> be81dc4c bcda7364 be961e14", + "be9aa08e bcea14d0 3f163bae 3f1e6218 3eae4818 3f9f4bb4 3e69e4a0 -> bd0c5b12 3f0b23d3 3f434a55", + "3f439222 3f9afb48 3f3a66b0 3f004c32 3eeced86 3ec2b188 3f738b4c -> 3f36be95 3ec44ca6 3ef70eb9", + "3f9c1ca4 3f178358 3d549290 3ebff0ae 3dd80b54 3f8b2465 3f9619fb -> bd5c84f0 3d6b23f7 3ee85c5e", + "3f34d5a4 3e1b3a32 bdcf328c 3eb66a78 3f803106 3e6da7f0 3efd0672 -> 3e1b6431 bd3d9bfd 3e6a7a85", + "3f671a90 bd874974 3ecd99e4 bcb4f580 3f0b6e88 3f44c28a 3ec186d2 -> bd1f59ea 3ea2a690 bc1eb104", + "3f227f78 3e4015b0 3d852140 3ef404f8 3f8e916c 3f0d526d 3f9c4491 -> 3e4df62c 3d3e8cb9 3f0b1cfb", + "be643876 3f692596 3f744c0c bdd24be4 be389b00 bdddda56 be2bfda3 -> 3f933cf6 3f98522d be0484d3", + "3fb38bec 3f8d58fb 3f11c888 3f831b43 3f1fd68c 3e0f8adc 3efcc720 -> 3f05be0a bdf057b8 3e97fd08", + "3fa14089 3ee04400 3c4b36c0 3f16c202 3f432d6c 3f7bf5f0 3f92acd8 -> 3e9d240e 3c472caa 3f3277a8", + "3f99ea7f 3d9ccde8 3e8be7bc 3f95841d 3f5c963a 3ea58fc6 3e412d6c -> 3d82b8ac 3d509648 3ce94300", + "3d1fd3a0 3f9e5280 3f92faee 3e777a48 3e91ecbc 3f99d56a 3ee4d5a4 -> 3f99e7bd 3f942340 3e722312", + "3ef9c292 3e47368c 3e55fae2 3f6e88cc 3db92a34 3ed30544 3f60020a -> 3ddda425 3e189e72 3f5ffe34", + "bd779878 3f8a8236 3e508738 3f95cbfe 3ec1bfa6 3f912fec 3f47fecc -> 3f8fb681 3e4ed5ed 3f97c71d", + "3f954248 be4a22ce 3f91a03d 3dcfab60 3f515c7e be33422d 3e3956b0 -> be1f31b3 bed7a714 3b956c30", + "3f1cba76 3edcb05c bcaa36e0 3e550c14 3f517cd2 3f64b53c 3f45d3f6 -> 3ec4240f bc9f1ace 3e376899", + "3fa95df9 3f2bd2ac 3f0857f4 3db70174 3e40df8e be501d08 3ea86fae -> bd4b5100 bea1751c 3c242470", + "be339366 3f86d711 3f683936 3ed8104c 3ea4e69a 3caaf480 3f327ae3 -> 3f96dee8 3f880c8a 3ee38990", + "3e231c60 be38b7be 3f9fb820 3e6ed99c 3ee0d014 3f284c8e 3ecf34fe -> be2836be 3f9700e5 3e58338b", + "3fb4c923 be752a7d bde0b6d2 3f3799e2 3f903db0 3c82a4c0 3f940e8f -> be908cff 3d2f3740 3f603c04", + "3f97a3a4 bca5f200 3ef28b8c 3f05a874 3f44cd66 be1747b0 3e595f92 -> bc70f864 be2e7c9c 3d0edb28", + "3d442550 3f6bc9d8 3f54b7ce bd758100 3f8b338e 3e4f1bda 3f418f10 -> 3f6cc6cc 3f4c977f bd72a2e9", + "be2bcf1e bc9f1770 3f6ded46 3e7ba4be 3f86ebe8 3f3bdac8 3db7b434 -> bc9da5ee 3f788da2 3e9109f0", + "3ea165a2 bc983ed0 3f9cc64f 3e045324 bc65d4a0 3df1cbbc 3f976fa0 -> bc4f28fe 3f62610a 3e0bf64b", + "3f36d1ba 3ec8dd9e 3f1f464e 3e9f7908 3f83f1cc 3ed83570 3e6b7b9c -> 3ecd4944 3ebb2020 3e0f8db9", + "3f6e7cee 3e3bcdc0 3f932fd8 3f4da5e8 bda6b37e 3e708bfc be2a71b6 -> bab26f80 3ea91d88 bd8e9118", + "3d00af40 3e2ae1c8 3d30e778 3f1a00ee 3e521660 3f660b6e 3f6f648a -> 3e269d62 3d305737 3f19b094" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_screen(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f9a7413 3e57ef80 3e62c2c4 be3571c6 3f083a5d 3f512698 3ecddeb0 -> 3f37b3a8 3f7d2d94 3ec9b62a", + "3fbfb6ef 3eff7250 3e124eae 3f0864b8 3f7bf49c 3e8ef148 3f401474 -> 3f9e6891 3f005460 3f876742", + "3e51e590 bd28e810 3f60eb6c be45f1f4 3f83d61f 3e8d6050 3ed9d6f0 -> 3e36e048 3f62adc2 bdb6c160", + "3f9d628e 3f83c6ca 3f314348 3f62ae40 3e7edf24 3bc97a00 bd182198 -> 3f829eea 3f31dbab 3f61577a", + "3fa0590f 3f6e7e26 3f4713dc 3f83f18b 3ef05c10 bb054900 3f616f30 -> 3f78c9e3 3f46eebc 3f7f2fbd", + "be8422da 3e1a5674 3e7463d8 3e7ea4ec 3f5af422 3f89f7c8 3f534b4c -> bd167ee0 3cdc2b80 3db58740", + "3f8a26da 3f41cc06 3ca82600 3e3cd3ce 3f9a552e 3eaa9e3c 3f8f5696 -> 3f895f5b 3ebee11e 3f95c821", + "be63daec 3ed44618 3f0b7d6b 3ed9b2b4 3ebeb68e 3e84f224 3f9dcd24 -> 3ebb6e6c 3f04c217 3e88f6f8", + "3ed12620 3f476d68 3e3fd538 3d082950 3f0f93a4 3e41c5c8 bd879984 -> 3f546368 3e801460 3be87c80", + "3f6c4eae 3f1d7fd0 3f4081a2 3e878d2a 3cffbd90 3f8f52a3 3dc740e8 -> 3f205676 3f8110e2 3ea95c00", + "3f9f3d41 3ec7a4ec 3f4eda48 bd9a3f18 3ee58134 3f59a02c be0c99ca -> 3f3aea2c 3f816a2f be849b30", + "be0bf7b4 3ed80430 3ee6f29a 3e961ada 3f6c43d6 3dbe85d8 3f5b3ea4 -> 3eb2ad94 3ee35fb4 3e577b3c", + "3e41e5e4 bc8d3210 3eb61378 be1cb4fb 3f7d01a4 3f65d4e8 3f4004a4 -> 3e3148bc 3eee2992 3c2fcb80", + "3f298af0 be4b715f bd0d95a4 3d3607d8 3f237e1e 3f243e7c be0802ea -> 3e9ddb6a 3ecf5f30 bd2243e0", + "be9f34c8 3f04bf8d 3f95b72f 3f6cac70 3eed53b0 3f45c50e 3e19ac46 -> 3ee5f788 3f9aee9d 3f6bc590", + "beef2919 3f7ca324 3e80427a 3f964d57 3f28d8e6 3f8f605d 3e22b2f4 -> 3f7b99ec be110b68 3f97f512", + "bcc37280 3f7c7c00 3f7d7528 3f634fcc be1d7d24 3ea79c58 3e99bfce -> 3f7c7f4d 3f7d7013 3f631b2e", + "3eafc3ae 3e15df9c 3e2bcf4c 3e95f890 bce5f420 3f18e37a 3e3eceb8 -> 3e0d733c 3ead434a 3ead20fe", + "3e91d222 3f17b3a2 3f90abd0 3f87a13e bd29e500 3f9f6d24 bdf45534 -> 3f167836 3f8ac1e3 3f87e39c", + "3faf81b2 3f080aee 3f1e60fe 3e5667f8 3f120bac 3ee9a724 3e782a12 -> 3f65e05a 3f5b7689 3ef1b6fc", + "3e251198 be145e05 bd9e3f60 3da145f0 3f838a16 3eaeafca 3e8779c6 -> 3d376030 bc93a000 3df1bfc0", + "bda3ae5c 3e66c5fa 3ed02162 3f0add66 3d838284 3f511f60 3f4262d4 -> 3e62b3cc 3ebc4aa2 3f03c19c", + "bb75cc80 3f407a8c 3ec3604e 3e7765e4 bd98f35c 3f9b5bb1 3f2fa1ca -> 3f407f1a 3ec1ef52 3e756654", + "3cd29560 3ebd933c be0a9f3d 3ee6ee6c 3f8ff33a 3ce6ec80 3e50a318 -> 3ec6e56c be09c798 3ee86748", + "3dda0b70 3df8a14c 3edb6b9e 3f06950c 3f8f7d4d be44aa74 bde84f58 -> 3e67b178 3ed57014 3f051daa", + "bde4b104 bba22060 bd12c764 3e46f0c8 3bc5ca40 3f95fb66 3cc0e4b0 -> bbb85200 be2f7a90 3e44c570", + "bc29f3e0 3ef28ddc 3e88ca2e 3f9278af 3e36eba8 3ebe250c 3f47fae4 -> 3ef20e0c 3e875826 3f929f00", + "3f9a6042 bc53ca20 3f9be043 3eca542e 3efc385e 3f4e68bc be17f0cf -> 3f16c0e8 3f80c4be 3e92e95e", + "3f50292c be448073 3f60b188 3f9396de 3d810410 be41af8c 3f8e1b4b -> be05fba0 3f5be0e8 3f81e7bd", + "beb9071e 3f9d2d70 be6ede95 3e45d6da 3f4249fc 3f1f6cbf be2d1f04 -> 3fa52e11 bf02c52e 3e785098", + "3f0253ba 3e2b7274 be4f8ae4 3f95ab00 be54fda2 3ed33548 be644a8f -> 3da25728 3d4c5d20 3f982091", + "3fae571f 3f58f31a 3f0e85d6 3f322b88 3f6824de 3f2c2de2 3ed9c15e -> 3f84972f 3f7679d2 3f5f4154", + "bea44c7a 3eebea94 bdf4a866 3ec1bcd6 3e80d950 be5c36dd 3f0e7087 -> 3ed59ef4 bd2ce260 3e88e99e", + "be806060 3eac4404 3e951cf0 3f98b58a 3f8e3158 3e274242 3c5933c0 -> 3e1b4630 3e864046 3f98ca91", + "3efd2024 3e803978 3f337ba8 3f2b70ee 3f7fa5c8 3f3342a5 3e8ba330 -> 3f1ed926 3f4df8e1 3f36d7ae", + "3fa13827 3f95d19f 3ef3a830 3ee6b730 3e13385c be33a640 3f569c32 -> 3f91de2b 3eb85c7c 3f83ee17", + "3de9ddb8 3d915d88 3e5408c8 3ecff74a 3ec6cc76 3edeabcc 3f9c1d01 -> 3de5b9a8 3e7c5bdc 3efa4f4a", + "3f05dcca 3f916eb4 3f884ba6 3e83baa6 3f167a75 3f0647b8 3ea3c5e0 -> 3f8c1307 3f86052e 3ec35542", + "3fa32712 3f418ed0 3f9cf576 bd8d10b8 ba57b200 3f81c446 3ecd2d42 -> 3f417e0c 3f6f133d 3ef44594", + "3e9790fa 3f8d8517 be651596 3f943f8b 3f9c759e bdc78746 3d8478c0 -> 3f88a0b5 be849cb4 3f93dc4a", + "3f0dc2ba 3f2796db 3f96c16a be1185ba 3f9aedec 3f77d454 3f79ef12 -> 3f62d8d1 3f8a8e89 3ef360f8", + "be1588fa be29cee7 3f096f6f 3ef1f8e6 3f7a7aaa 3d32acc8 3f9d433b -> beaa30bc 3f08ae16 3ec18678", + "3ea3538e 3f62e45c 3e264e6c 3e24ad4c bd98289c 3f99f754 3f9e8cd0 -> 3f6233c1 3ef7b496 3efc1c9a", + "3d570940 3effd254 3e89fb5c bdd7dfe6 3d78de30 3e401644 3f8e8b36 -> 3f0051c2 3e8daa4c bd2709c0", + "3df6bac0 3e391e5a 3efef91e 3ed4f5fe 3e908d9e 3f67aaec 3f9d09c5 -> 3e55a6d4 3f0d7f58 3f00947e", + "3e11783c 3f918a3c 3e18fb08 3f209e9c 3f4e7364 3f17f3de 3f50c44a -> 3f8f87d0 3e626d3c 3f2bab5a", + "3f3aae0c 3ee0f6fc 3f356176 3e8a9ed4 3f385dc1 3ed82056 3f9dcb84 -> 3f3bda76 3f4c5995 3f6d2313", + "be548b9e 3f5d2700 3f3f53c2 3f85f828 bd4df908 3d9babc0 3e00f674 -> 3f5d841d 3f3e4e8c 3f86201a", + "be9630d2 3f288525 3f9b4d47 3f664df6 3f07cec3 3f8e6c53 3f866a68 -> 3f1ae81f 3fa4368b 3f5e63a2", + "3f84d875 be583482 be45fa2d 3ee467b4 3ec6ffc2 be7e3452 bdf039b4 -> 3e8e095c bf0033fe 3ec1e17e", + "3f953543 be72ac9a 3f488cb6 3ebd0f12 3eb7f594 3e315554 3f3e11e6 -> 3e8febd4 3f53be52 3f6a474f", + "bed6db8b 3f4f9c38 3f5fb498 3f173022 3f81fab3 3f90bfb2 bb822840 -> 3f3afd61 3f506143 3f175cdb", + "3f16d620 3f801466 3f1e8aae 3da93300 3f143572 3f59d5ee 3d9cc6d4 -> 3f800d71 3f4f676f 3dfdf0f0", + "3e0da710 3e3e90cc 3f7a50a8 3cd49410 3f3b1b37 3f81f7be 3f825eed -> 3e896a40 3f7b1d13 3e271ac8", + "3ebc16fe 3f26e000 3f898dc8 3da6eefc 3ed73a80 3f8ccf1f 3e6157b8 -> 3f34a36c 3f85b161 3e1f8070", + "3f77c2de 3f9b6386 3edad18e 3f5725a6 3f939012 3f222bb8 be1effea -> 3f79a913 3f47486f 3f510202", + "3fa5f09e 3db72fa8 3d71dd30 3f43d95e 3f9daca2 3f4dd920 3db120c0 -> 3fc59348 3f851c52 3f4a97ec", + "bdece9e0 3edfed8c 3de86bd4 3f87a537 3e1a73f8 3f872ff7 3f054092 -> 3edae6ca 3ba99d00 3f881b11", + "3f6f9632 3f871e08 3dbf1740 3f60df94 3ed0cbb4 3f79540c 3f28e50d -> 3f8466a3 3f6b74f2 3f7417a6", + "be935f6c 3f864c84 3e84a486 3eb0b04e be607b6d 3f8352e0 3f774e72 -> 3f85e6c4 3d24e9a0 3e26e700", + "3f9b9680 bd6de190 3efc0176 3f2d1550 bd055ca8 bc94e560 3ec34cce -> bdccb350 3ef642f6 3f53873e", + "bebe04ae 3f2b32d4 3f02cb42 3f3fc1f4 bd1e9a48 3f2e99c2 3de5f460 -> 3f2c6acd 3ec633f4 3f3d14a0", + "be5b241c 3f360e16 3e8b26e2 3ca00820 be5306c1 3f73155e be677a01 -> 3f3950f0 3dfd8bb0 3d892590", + "be93e2b2 3dac2f00 3f9b2308 3efd7490 3f68d7ac 3edeb5f2 3f702cb6 -> be204e90 3f9e8bdb 3eb764dc", + "3e619a40 3f8665c8 3e2e04dc 3f99bc0f 3f8399ae 3ebdab4c 3e80d0a6 -> 3f84f2ce 3e7363ec 3f984ee3", + "3e246f50 3f5f0cc0 3e08d478 bd8869bc 3f53071a bde32eae 3f3af268 -> 3f636956 3df20db0 3d6f7d10", + "3c818a00 3f5517a4 bdf71300 3e493dfc 3d2ba4b0 3e984d02 3f98e97e -> 3f551eeb bdec4760 3e58c8cc", + "bd49c108 3f9e5f69 3d9abf2c 3f9e516a be31be6e 3f712cf2 3f60d6c2 -> 3f9e1cee 3d05c8e0 3f9fa12e", + "3fa7bd5a 3f07baaa bd8d27c0 3e9da514 3f4bfddc 3f3179b2 3f4e7154 -> 3f82a8fb 3f66f600 3f8507bd", + "3f7ddf04 3dba5060 3f4c49d6 3e3b8bf6 3d7c41b0 3f8e2b1c 3f78145c -> 3e1601dc 3f829f89 3f77d854", + "3fa4ab8f bde50d66 be27ca1d 3e60dcd8 3f4f7b34 3e965e30 3f82c0e1 -> 3f861253 3e8d3fb8 3f9f61cf", + "3f0092fa 3f8a9438 3d46ac90 3f1e1d61 bde65c3e 3f7e59b8 bd43e078 -> 3f8b2d36 3f05f771 3f1bc385", + "3fa0087f be1f5aba 3f9b6aa4 3f73a2fa 3f2da8b4 3f1f9191 3ec671b0 -> 3f53116f 3f860cfa 3f79a0b2", + "bd3928e8 bd425ea0 3f60203e be63db09 3ee440f2 3f96408a 3f04a1f9 -> bd8c6a80 3f5e6f42 be809660", + "3efa2440 3ea9a794 be724dfa 3f9d7b18 3edfa090 bcc82be0 3e7e2674 -> 3ef2b506 be80b5f4 3f99e7f5", + "3fa64055 bc2d64d0 3f446ba0 3e882a62 3ecbfbb2 3f8daa81 3eb65b98 -> 3f0329ca 3f8d0888 3f1b0398", + "3f436da2 3f90f81f 3f70b52a 3f28c964 3f731ff8 3f1aaf5a 3f872d43 -> 3f84aaa4 3f77c2f6 3f6f18f8", + "be2f5170 3f55748c 3ef6800a 3f221b66 3e7312a4 3ea9b708 3f3faf41 -> 3f53b9e9 3ee76ec2 3f161202", + "3fb502d4 3e57b4ec 3e44b7e0 3dead5d4 3ebd5c08 3e81bf92 be757d76 -> 3f1f9d14 3ef69810 be3def48", + "3f0070de 3d0fe478 3f232731 3f336430 3f449b18 3f74385a 3f9b5620 -> 3ed056cc 3f4f97c9 3f62094a", + "3fa73f43 3e49a6a6 3edf1b90 3cf55b60 3f443c90 be5fd3d2 3f24bfdc -> 3f8029c3 3e8c996c 3f587c13", + "bd9641b4 3f97b58a 3ebc7fb4 3f3f0080 3ea3a374 3f364773 3e7ab374 -> 3f9843dd 3eab9968 3f3dd59e", + "3f547efc 3f082c7d 3eb1b592 bd4f4618 3f64e31e 3f3fda5b 3f94ee21 -> 3f611a5b 3f40d4ae 3f76ccb4", + "3f9a3e21 3ea67b50 bdca2c4a be62c0a9 3f1a7538 3eb11a54 bd5c26e0 -> 3f50d874 3eb7efda be99e15c", + "3f7697f4 3d58df90 3f9ab29a bd8bd8f8 3f667700 3f8bd724 3e11075a -> 3f5fcc0c 3f7d3447 3d9ea170", + "3eb2c7b2 be51370f 3eb4e118 3f38881a 3e99a0f0 be14426b 3f5d9a66 -> bda00380 3ea423a2 3f4e2246", + "3e4d60d0 3f89770f 3f1e5a3a be4c8ed8 3f4a9856 3f43f3c4 3f807ab5 -> 3f87f676 3f2d57e2 3d2b1480", + "3f566d0e 3d24c680 3f005892 3f8fdbfd bd3a2008 be4cc009 be31f934 -> 3b726000 3ed5eede 3f922b07", + "3faa1d57 3e91a6a2 3ab60a00 bdb1c54a 3f2f7de2 3ee50494 3ef1efc0 -> 3f6fb57f 3f185433 3f1880c8", + "3f813e12 3ed1b54e 3f107ba0 3f2b5aba 3f5e992c be1653e4 3de2a2d4 -> 3f6d8e0e 3effe7d6 3f34cff8", + "3ef69b58 3f9f351e 3ef5070a 3eb0254a 3f24eaf6 3d441db0 3f00db0a -> 3f958634 3efb2f2e 3f00c8d8", + "3f006a0c 3f08603d 3f9d39c6 3f87ee71 3f549964 3e4520a0 be1f7f4d -> 3f3a3562 3f9a674c 3f888d15", + "bef7512a 3eea1940 3d6cce70 3f321900 3f856f24 3d860118 3f03dee1 -> 3e3c52e8 3ce5aa00 3f1eb6b4", + "3f592938 3dd0ac34 3f0ec0c2 3f5d5296 3f286d1a 3e128a1c 3f24a50c -> 3f1a6667 3f1c801e 3f703dd4", + "3ec5893e be488594 3ec30320 3f95ff95 3f2988be 3f24a10e 3c8af140 -> 3de0b0f8 3f08d476 3f95dabb", + "bdd69384 be68abca 3f07a554 3f0f730a 3f804711 3f12a6a8 3ebdb8f2 -> beb64fac 3f006c12 3f0b1468", + "3f95a20e 3cbcef30 3dcf53a0 3f8d723e 3b9d1100 3ec1af64 3f5e9b8c -> 3ce9c780 3eff5470 3f7f8e3e", + "3fb7deaf 3e835d70 3f9ca0dd 3f89dd72 3f84d572 3f58757a 3f799b56 -> 3faeb282 3f73b657 3f781891", + "3f82e324 3f95e161 3f3ac010 3f9e3eee 3f93cfaa 3f8e1b00 be270fb8 -> 3f781649 3f84aec7 3fa34aa6", + "3ef159ae 3f18f1fc 3f91eedc bda77acc 3f4ca71a 3f89e452 3f775f64 -> 3f3fc7c0 3f88d38c 3ed26b24", + "3ed33ede 3f472792 bdead046 be56bf68 3f3e197b bdd7ecc2 3f8135eb -> 3f589220 be270ed8 3e969708", + "beca2fdd 3e53593c 3f81370d 3ece65f2 3f81e56a 3f8304c0 3eec8ae4 -> bde4a310 3f81b4c8 3e96a4d8", + "3f65952e 3ed07fac be1eeeea 3f5fddda 3f8615ca 3e957868 3ecf1aea -> 3f76cf6c 3e16c4e4 3f6b85fa", + "beba79e2 3f8672a2 3f12f52c 3f8c7767 3f3670a8 3e9140ce 3e8be2e8 -> 3f881f11 3f07b0da 3f8db4f9", + "3f3bf1fc 3e5832ec 3f6fd3d8 3ee92610 3f0d0f10 3f939e13 3f049672 -> 3f07beae 3f7d853b 3f2996d4", + "3f4e0988 3f8b4de1 3f84b55f 3d391690 3f337312 3f9b97c0 3f5026a8 -> 3f84ed3f 3f801a1f 3f2b8650", + "3f493b44 3f7851f6 3f154ae4 bde15bfc be274e04 3f1ff6a1 3f6e51be -> 3f775577 3f49b462 3f33c706", + "be7c49de 3f85ccba 3e966598 3f803dc2 3f090c6f 3e9fa3de 3eaa4a8e -> 3f86908e 3e753cd4 3f8042d2", + "3f918189 3f0fb0ca bd69ea80 be615cb6 3f5c6200 3ef8f4c4 3ece7120 -> 3f7d98f3 3f06f6af 3eada47c", + "3fbf310d be3596f7 3f994ff8 3e5aef10 3f8f66ad 3f98d780 be395d0c -> 3fe57b3d 3f5854f0 3aa0bc00", + "3f17856e 3d6d9878 3f144c72 3dc5c414 3ea71968 3f5766cc 3ec64bb0 -> 3e75baec 3f49ef7d 3e9b799c", + "bec921d7 3f9ed525 3f751a4e 3f20442a 3f68a9c6 3f179fb5 3ef886ae -> 3fa9d733 3f72913a 3f0e02eb", + "3ec688be 3ec94214 3f341784 be6ff57c 3f176a38 bd8476a4 3f80226c -> 3f084354 3f323025 3e7aabd0", + "3e4f8fd8 3f580966 3c7a2580 3f8b8889 3ef56a3c 3e23b866 3f3822e0 -> 3f5beb62 3d4140b0 3f89da11", + "3f83cfcd 3f22aaf3 3f6d18bc bd0a0db8 3f2e47a2 3f5ca902 3f1f0e14 -> 3f641942 3f7de02c 3f20af04", + "3f50ffe6 3f76e65c 3f27c302 bd280448 3f386b23 3f98ffb8 3f65aefc -> 3f7c407b 3f7dde84 3f38b49a", + "3f1808ac 3e711c2a 3ecec952 3f99dc1d 3f926d56 3f957a9c 3f14564c -> 3f413f47 3f513b5c 3f90f600", + "3f3d4c4a 3e7a21b2 3e4ae48c 3e8ec646 3f811eea 3d8b1f20 3d2b91a0 -> 3f4ed806 3e742340 3e9a35e6", + "3ee7805a 3ea0c7b6 3e834ee2 3f8c6bca 3edcf166 3f6b02f8 3e3b6e6e -> 3ee54f12 3f10a9be 3f8b64a0", + "3e9d5394 be5ff9bc 3ed1ca0c bcb3bb70 3f7af6b4 3f8e9aa2 3f6db35c -> 3e17f4c0 3f1c9fa2 3e8a0d5e", + "3f3cf8ea be4eadf8 3f874172 3f8f7f8a bc239100 be15a892 3f74e478 -> be57bfb8 3f8809d6 3f848de2", + "3e9f5b9e 3f5c83ee 3f91ac6c 3f15da70 3e77e386 bde19b60 bd041838 -> 3f5f3061 3f92478d 3f14c9ae", + "3cb06bc0 3ef4bf34 3f6ffc02 3f6c09d0 3f0b451e 3ea8a9f4 3cbdf950 -> 3ef7e0c6 3f701918 3f6c0c5d", + "3ebc06aa 3e186e46 3de54130 3d1f26f8 3cdf8ef0 3eeda6c4 bd0f8d70 -> 3e212a64 3e86d19c 3cd8f740", + "3dd83a60 3f9f3fd2 3f795616 bdb0e030 be49002d 3f66a2f2 be7f05e0 -> 3f9fe59c 3f79f85a bdeb6090", + "3dc229c0 3ec86c7c 3ed0c81e 3f44cc18 bd131f78 3eaba944 be13c8e7 -> 3ec75cdc 3eda6b7c 3f43fcb9", + "3f452a92 3ebc9d32 3e85fa4a bd7802e0 3f473664 bd0e2e10 bd1232f8 -> 3f3f3717 3e77be38 bdb7b6e0", + "3f122d4a 3f38e905 3e9cb0aa 3e3ec658 3f08e04a 3f27c390 3ce70600 -> 3f4e9d2a 3f10d293 3e4c3130", + "3f8425f6 3f31dabe 3f550ca6 3f9b3aa2 3f23c278 3f3ddd50 bdc418ee -> 3f657690 3f75efba 3f9debb5", + "3f7d5b0e bdafe9f2 3ed7ecee 3e40e3b0 3e74a68c bd0800b8 3f98f74e -> 3e2ef6c0 3ece323c 3f92fb16", + "bec4e70a 3e8f2fe4 bdc61240 3ea8ee2a 3f9f402c bda8efe0 3f72a294 -> bd851ca0 bd7da320 3daf8768", + "3f9a88a6 3f8cd581 be1a358c 3eff8c28 3e7ed90e be7f569f 3f66a382 -> 3f88fa53 befe736c 3f859f46", + "3e4878a4 3ed5fb82 3f7a3264 3f04dfaa bb904fc0 3f790658 3f0bfaf9 -> 3ed5b9ba 3f7b4d4f 3f120ddc", + "3f8c3cff 3f53576a 3f4e56d4 3f130b90 3f57f754 3f99c872 3f8aedd2 -> 3f7c9e4b 3f87da97 3f8a4e09", + "3dd87e50 3f8b8357 3f802373 3e941982 3f9fce95 3c9dc680 3eeef136 -> 3f89fe5b 3f802361 3ea60d4c", + "3db8b620 3e1c6a76 3f8d9d40 3f0a5ff2 3ef9c318 3ea92b3a 3f8f35fc -> 3e429638 3f8d3564 3f163e86", + "3f7594fc 3f3b9a08 3eed5e62 3e1030d8 3f3db2f7 3e81b2c0 3eb0db58 -> 3f6c391a 3f180d9b 3ed9dd6e", + "3f5406ac 3f31c413 3f6b5940 bbdadec0 3e79e672 3ecbe748 3e0f3778 -> 3f41942e 3f722909 3de12310", + "3f45ab60 3eb1cdca 3f80b5c2 3e1a2416 bd0aee08 3f8e6378 3f138122 -> 3ea90d22 3f8019a3 3f07492c", + "bef8f476 3dc95dbc bd246adc 3e803232 3f7b3c24 3e3cab98 be2ee9d1 -> bea9f500 be0886a8 3ea012ce", + "be15ef44 3f8f7bf1 3f9d3fdc 3f41fdd4 3ec8e178 3f2d8f01 be1750fd -> 3f905fa9 3fa0272a 3f43554a", + "bec0b1a7 3dbd3d0c 3e3bfd66 be16ee92 3f32b784 3efadbec 3f3546d5 -> be159098 3d075290 bee806d4", + "3ce06f20 be2c4970 3d3c27e8 3f41238e 3f5efa90 3d9d55ec 3f3d108b -> be0fbd78 3d446180 3f426929", + "3f9ecd25 be18c410 3e0f5bb4 3e8b20d8 3eef9d5a 3e95d5ae 3f558b6a -> 3f049eca 3ee78b86 3f834087", + "3eb1262c 3e81ebbc 3f91f98e 3f813b6a be394619 3e885042 3ef643bc -> 3e54011c 3f9051ad 3f8106ec", + "3f6e6596 3f70d988 3ef898de 3f8d0470 3f7864a2 3d1a21d0 3f1c8327 -> 3f7e89fc 3f00e9e8 3f859b29", + "be2403ea 3f126c2c 3d444aa0 3f04999c 3ebeb1f4 3f8f1d26 3f5d61b8 -> 3f0be2b7 bdfb0a90 3ee703f4", + "be140a42 3f94fb6a 3f3ef58a be0ef9b3 be11ff5c 3eae6a04 3e56bdb0 -> 3f948cb2 3f3bc188 be325af0", + "3f98c5ef 3f56a8cc 3e71b59c 3f965107 3e0a90a8 3e8940ae 3f354f10 -> 3f5d560e 3ef600da 3f8373bf", + "3fa47682 3e961878 3dbe6c44 3f21090a bcd74550 bcbb6110 3f12766a -> 3e89e054 3d87d480 3f66d7f4", + "3cae0480 3f4f7610 3f671aac 3f934af7 be57dd7e bdfb94e4 3f4cf474 -> 3f4f3e6b 3f670a0a 3f92f6f8", + "3f09d916 be21b6f5 3f807b69 be1e2938 3ed96118 3f9c14d8 3df181e8 -> 3ddab848 3f802a61 bda63120", + "3e92a81c 3e13f64a 3f663540 3f9b1728 3f967990 3cae4e60 3f86d1a5 -> 3edd79fc 3f665d7e 3f92ead5", + "beba28b4 ba03e000 3f96b36a 3f15c078 3f8280e3 3f939a0b 3e2a3606 -> bebe2728 3fa037fa 3f0f549e", + "be0355b0 3f9a3b91 3f91c849 3e184c92 3f641554 3d2eb4f8 3f9014fc -> 3f9d3af5 3f91e130 3cd39b80", + "bcea89f0 3f8bed6f bd2545b0 be3a21dd 3e5a9e76 3f28baf8 3e771858 -> 3f8c0019 bd75af20 be427e20", + "3f541e0c 3ef6ed2c 3f8a162e 3f75f3a0 3e98ed4c 3eae3da8 3eff6570 -> 3f1c43a2 3f873e0f 3f7a1ad3", + "be9a838f 3ee33092 3f2adaba 3d452b60 3f9a5942 3f44d320 3d1e35f0 -> 3e77172c 3f171930 3d17b8e0", + "3f14c960 3f79b3dc 3ea1aaec 3ca0db40 bcd4d650 3ec4cde4 3e8005c4 -> 3f799b84 3eefeed0 3e25ff70", + "bea26252 3f8eb320 3f72628e 3f489b38 3f6d3e62 3e781914 bc606e60 -> 3f93052e 3f7156ba 3f48d8d4", + "3e70b918 3f30899c 3f925b64 3f364b81 3f1cb77c 3f0fdd34 3eb63466 -> 3f3bf919 3f8fee90 3f3c7601", + "3f5b35ee be1b1627 3f5fccda 3ef11640 3f101542 3f6adac8 bdf575dc -> 3ece9510 3f79185c 3ed5487e", + "3f03d3cc 3e62d762 be18fe45 3f6f62d0 3f061830 3f564698 3f4ae9be -> 3edcee66 3eb1286a 3f762ad0", + "beaf97f6 3f64d630 3f863857 bc2c6c00 3cca80b0 3f9ee19a 3f1bfb68 -> 3f649b3c 3f88de32 be630220", + "3f2815ca bdf1b188 bd953cc8 3f1f3845 be1b9dc5 3e8668e4 3f58ebf6 -> be6b1468 3de57d88 3f551062", + "3f9609c9 3f4623f2 3f160734 3eaff614 bd30a148 3f6ec92c 3f85974b -> 3f43373d 3f84f248 3f92c3fb", + "3f8050ed 3f31089c 3f4c7bba 3f29440b 3f378c2a 3df58ce4 3f203c49 -> 3f69ca7c 3f52ace0 3f5fb044", + "3f30eb34 3f58a21e 3f8c9c34 3e1c98c6 3f27bfac 3ee32914 3e3beec4 -> 3f6a75e0 3f88be61 3e854e7c", + "3f9d2248 be1ee79c 3ef1fa64 3eacc6ec 3f121a00 3f7f1ecc bdcd3f24 -> 3f27763a 3f8f147f 3e830afe", + "3fba4b1a 3f327474 3f8ca96e 3eedf968 3ecf4cae 3e90ca9e 3f41d02a -> 3f60266a 3f87734e 3f86fa93", + "3f436d34 3f03b93a 3eaecf8c 3ea24488 3f93beb6 3f7fbb28 3e76b67e -> 3f713a97 3f57f909 3ee29768", + "be6bb798 b930b800 3f140a45 3f0ec7db 3f5f1198 3f9ddf90 3f9caff8 -> be4d9a30 3eeac6f4 3eddc136", + "3e5b7e58 3da0fff8 3e60484e 3ee2b1c6 3f88cff4 3ed3e08a 3f9aada2 -> 3e9454b4 3e939c16 3f164c3c", + "3f3d27cc be0bd7f5 be79a1b2 3f22dbec 3f97d531 3f64d678 3f6908bc -> 3f5c0e5c 3f13e5c4 3f618182", + "3fbf0d70 3f7328e0 bd5b8a80 3d7e5d28 3f8b2627 3f8f3610 3f990f40 -> 3f83ff4b 3fda5a66 3fde37cc", + "bd6c97a0 3f01d0a2 3f8b01f6 3f404240 3f31d961 3f98a709 3f57e5d8 -> 3ef980b2 3f8bc415 3f3d275b", + "3fa58b6e 3f927977 3f83cdcd 3f730868 3f81afd6 bd983ea6 3f2e48f6 -> 3f748850 3f842b6d 3f7e7348", + "3ea6368c 3f2140c8 be6970bf 3f16066e 3f8f3a85 3f4c74e8 be6d2fc7 -> 3f43abae 3db928a8 3f0e0e70", + "3ebc7dea 3eaba066 3f6e4658 3f9be986 be146d48 3f14a4e3 bd2c6950 -> 3e9976a2 3f721052 3f9c5841", + "3e6eeb20 3ec385da 3e7b8824 3f8462a6 be0ab3ff be62fa3f bd3c1340 -> 3eb98564 3e539504 3f846ead", + "3f6dbf28 3ec41c4c 3f7116a4 3dfe3438 3ef14468 3debab50 3f558cb4 -> 3f272d0b 3f72ae98 3f4d7b6e", + "be54da36 bcc080d8 3f6fd386 bd9daa4a 3f37de4e bca80740 3f203fb4 -> be3488a0 3f6fe52d be5e5468", + "bd965464 bd9ae3c2 3f39df64 3f9beba2 3d8fb9b4 3f96b539 3f6e39ae -> bda63cc0 3f33cfd6 3f9dd3dd", + "be8aa982 bdc21356 3f486f34 3f16f4b4 3eb9525e 3f22ac6d 3f0b850f -> be4eede8 3f3edf35 3f077393", + "3f044000 3f08b992 3f95218e 3f660cac bdd24a28 3ef41456 3f4c0516 -> 3f0265e0 3f8fed54 3f70bbc7", + "be2ef1f6 3da46960 3e58ff9e 3ecba5ac 3eddfefc 3e3c9d68 3e3a6086 -> 3c471080 3e3f9a74 3ec20f10", + "bcb1f660 3f9f3969 3f85c42a 3ec60cc0 3eb3ca3a 3f14f9b6 bca38020 -> 3f9f7663 3f85d6d3 3ec62f98", + "3de14ee0 3f4502a4 3f887703 3f85ade5 be18a405 3e8c0a3e 3f264eee -> 3f440afe 3f8835ce 3f8545fc", + "3e0c5858 bdbac484 3f48d1d4 be101bef 3f3ac8fe 3d207a58 3f34e716 -> 3c92d600 3f491dae bcf7d100", + "3f41ade0 3f82c835 3e8c7c18 3f122793 3f40b59c 3f8a1d4e be352a2d -> 3f813298 3f5de258 3f0373aa", + "3fa5643d 3e873ef8 3f12046c 3f62f7b8 3f3e4318 3eff4316 3f88161b -> 3f78866b 3f58de34 3f856ce9", + "be91e34e 3f7ce6e0 bd411ac4 be74efb7 be493528 3ea14220 3d6109b8 -> 3f7d1348 be108170 be846694", + "3f97cf48 be1aabaa 3f8d5870 be50810e bd3faf40 bdd24ebe 3f827108 -> be5c1720 3f8ef887 3fa0249f", + "be8af0b3 3f2d6e14 3e93b3a6 3f743680 bdd70258 3f39b10c 3f2a91d2 -> 3f2fc84a 3e17fcd0 3f7214e9", + "be509dd0 3f054a48 3f886f66 3f592f82 3f40bf1a bdbe8bae 3eba1214 -> 3ee4ef80 3f884678 3f564fd4", + "3e3210d8 3e7ba668 bdbcdf78 3eb727ce 3f8331ca 3f5622b8 3d882e70 -> 3ec2a762 3d887df0 3ebaf538", + "3d7ab690 3f14e380 be1b2c38 3f2d1647 3f796694 3ecdacf4 3f6d8b7c -> 3f1b469f bdfc5b80 3f31cbd4", + "3f88278d 3ed71a54 3f0647d6 3f0cb090 3f6e8474 3d5d3638 3f6c30a0 -> 3f7eac71 3f0d45e8 3f7ddac4", + "3f72ec8a 3d02a9a8 3f97609c 3f192363 3f82f83f 3e166990 3f98342d -> 3f78cc20 3f941e73 3f8699f8", + "3dfbdbb0 3e0c3e1c 3e265242 3e99e738 3e21ca18 3f710792 3f0253c4 -> 3e1d6a08 3e84d074 3eb0528e", + "3f788f50 3f724cd0 3f304bd5 3e3685e0 3e9f26de 3f33dc44 3f801297 -> 3f766f50 3f66aac0 3f7a007a", + "bebe8e73 3e429380 3ce40730 3e2ee47c 3d96d490 3f7d0656 3e994e2c -> 3e2bd768 bea8d8f0 3da08938", + "bebb5d06 3e952dec 3d47ef30 3f891d52 3f8d2d93 3f30d86a 3f2b31c1 -> 3baf3b00 be443e38 3f8b5853", + "be5c055a bccba4e8 3f813842 be7e33ac 3ee110ac 3e0275d0 3f9a11fb -> bdf92740 3f8140ce bf1231d4", + "3dbe2a58 3f6fa062 3e008aae 3f10f410 3f35cee9 3e2cdee0 be38c0a0 -> 3f70b4cb 3e0e941c 3f0f17d0", + "3f4c55ce 3f8afe00 3df878b4 3ebde20c 3f19f71f 3f9605b8 3f3da6d3 -> 3f85b724 3f717e6f 3f3e2d92", + "3fa503d2 3f67a0fe 3e35a90c 3f3315ed 3ed1281a 3f23c145 3deefbd8 -> 3f7476b6 3f5b12bb 3f3ea805", + "3fa5a5b6 be0ba988 3ef571ee 3e9c2ebc 3a3c9c00 3f8b9101 3f23ac7c -> be0a9428 3f9b647b 3f614ad3", + "3f4b8d4a 3f6ddb50 3e34b98c 3f8f858d 3ea67da0 3f86009c 3f66b69c -> 3f728c3a 3f5cab48 3f84662a", + "3f015b54 3f937ec7 3f5ac510 3f1d0baa 3f11ce9e 3e6b5cf4 3ec0f988 -> 3f8de271 3f5f1800 3f2fe432", + "3ee19d36 3f96b7ee 3ee6933e 3e80c810 3f44ccfa 3f96c577 3df9ca28 -> 3f8f05c4 3f3c52dc 3e9560b0", + "3e855a46 3f150642 3e9aba50 be602edf 3f3cdc2f 3f56447c 3eb2b6cc -> 3f299454 3ee89c92 bddd6ac0", + "3f6e0e5a 3f6569b4 3c372c60 3eeb3f82 3ea82b68 3edc46b6 be7da677 -> 3f6d8893 3ed04538 3eab8012", + "be94fe28 3f98f05a 3effcbd8 3cd70a00 bdffae40 3f8b781b 3ead0276 -> 3f980869 3eae8f68 bd8e5690", + "3f95c24b 3f12a533 be27d6f6 3f8b62b7 3e23a81c 3f7d62b6 3ec7bb3c -> 3f2717ed 3f978b98 3f863066", + "be80f0a6 be62429d be4932a3 3ef6c458 3f94cb8b 3e88e670 3e1aa074 -> bf141184 be8dd96c 3eecae42", + "bd18e980 3f8fe89e 3f8b8b69 3f5662a0 bd243434 3e9ab66c 3f6e79bc -> 3f8fe286 3f8bacc0 3f54f024", + "be2240c8 3f17e85e bdc4a0ba bc11c580 3f8659f1 3ebfccc4 3e98f486 -> 3f069888 be24ee58 bd680de0", + "3fbd0a1b 3f99b1d9 bcca8910 3f24c2c2 be259524 3f845c05 3f115e69 -> 3f9fd4b8 3fc52568 3f7146fe", + "bef9a7d8 3e5d4b98 bd6d1268 3ea7e450 3f8c70e3 3f9abee4 3f22e502 -> be502738 bf2e7650 3df480d8", + "3f7d4dce bd2d6a58 3f9d1eca 3ed4fd3e bdb27ee6 3f59ee44 3f87a5d2 -> be076688 3f84976c 3f83a1cc", + "becfd6bf 3f28cf1a 3ee0ab60 3f9526be 3f099501 3f280780 3f3f0f96 -> 3f15c988 3e941cd8 3f9b8f34", + "3fbc7de4 3f974f2d 3f590c84 3eb86c4a 3ebaf8a8 be227298 bd3e9678 -> 3f8ac646 3f4ff30e 3ea1fa38", + "beca8b9a 3f8a03d0 3f8b4fb5 3f897e2f 3ef7765e 3f5549b4 3db39ff8 -> 3f8bee04 3f8f0a1d 3f89d281", + "3f35fdc6 3f65e7f8 3e84e0f0 3de6d7c0 3eafbad8 3d394b98 3ec732fe -> 3f6c45e2 3e911238 3eb75c36", + "3eb1fd5e bd968d62 3f533a4c 3f6303be 3f45f81e 3efa5d40 3f94bfd8 -> 3e5c3ee0 3f5ad6b0 3f6eb973", + "3e631880 3f495608 3f3a7547 3f0d05b7 3e02c224 3f89276a be616f19 -> 3f4ae254 3f4afbcc 3f0768a2", + "3e591844 3eb044aa 3f9bde02 3ef6cae0 3f8f0d38 3edd9cd2 3f49eeb4 -> 3effd0be 3f994f5c 3f119257", + "3bc12700 bde30ea8 3f178240 3f2df4f5 be6d6dbd 3f38d7a4 3ed32248 -> bde62aa0 3f17f41a 3f2e2802", + "3f9744c2 bd90d640 3f4d7284 bd6486bc 3eb8e58e 3ddbb0b8 3f17fdd2 -> 3ec5c092 3f53db1f 3f2f5c2a", + "3f964aaf be68b716 3f393266 3f578438 3f1a34ba 3d296e80 3f49770e -> 3f2407f0 3f3ca2be 3f7ceca3", + "bde34450 3de15118 3e8bed50 3dd8552c 3f817d70 3d6cfc50 3dfe4e40 -> 3c259740 3e8989c2 3dbf17f0", + "3e741e14 3e9568e8 3f617588 3ef385fa 3f5cc650 3f59aacc 3bcea480 -> 3edff4ae 3f67a654 3ef3ed4e", + "bee67f94 bc88fed0 bd2f1358 3f41538c 3f822b7e 3effdd1a 3f07ad76 -> bef6e354 be8dfee8 3f325f62", + "3f24966a 3f968162 3eb69c44 3f821ee1 3f36d8bd 3edf4cd0 3f074487 -> 3f8c2bbe 3f097c43 3f816675", + "3e862af0 3e7a2678 3f63e138 3e87cb6a 3e10de04 be7e2164 be263f7a -> 3e8b6b56 3f620d0f 3e6f9430", + "3f9a4d5b 3d8c5cc8 3ea5d49c 3bd4d800 3ed40fc0 3d1c75b8 3eea42fe -> 3f089a8a 3eb5c54e 3f0df1fb", + "3f822082 3f95fe7e 3f37f497 3f3fac77 3f01cb4c 3eacc110 3f77dfde -> 3f8aa859 3f50aaff 3f7efe46", + "3f9c1176 3f04239a be273d56 3f55ddbe 3f4aa85c 3be4cc00 3f2f40c9 -> 3f7bb144 be1d1918 3f790907", + "3da1a3f0 3f955442 3ead99c6 3d422240 3f5f295e 3f588542 3f9dbac4 -> 3f93dc95 3ec430b6 3e0f67a8", + "bedf8dc2 3f9eca26 bd222b80 3ef11d9c 3f593324 bda696c2 3c070800 -> 3faa321a bb2ef600 3ef02412", + "3fb172f5 3f62247c 3eff53b8 3eb49e38 3e589cc8 be35d024 3f78400c -> 3f6ae5fe 3ec0260a 3f9c8731", + "befd45ec 3f63598c 3c922970 bd2f28f0 be1ae883 3f4f64a8 3f0835e9 -> 3f657e68 bec06358 bea26ae4", + "3f919957 3f4db090 3f2e07f6 3f198f27 3f7eae10 3ece5eb0 3f184caa -> 3f834fa3 3f539cd2 3f5ee1f1", + "3d12ec50 3f9e0eb6 3f9ac3c6 3f4ade82 3ee28434 3ef357ec 3f5705ec -> 3f9d949a 3f9a4ef6 3f4c784c", + "3fb445ca 3f021750 3ce3b500 3f689828 3e2ccd84 3f35c3bc 3f8ff6e1 -> 3f2003fd 3f7ffe66 3f86d5b9", + "3f8154bf 3f1686cf 3e6e3a8c 3ea90252 bd8612f8 3f7700bc 3e38865c -> 3f0f8cc4 3f7b1125 3ee77572", + "be03b01e 3d91dcc0 be23ad34 3f45e37e be5b7da0 3ee67f42 3d8e26a8 -> 3dc64b90 be686fe8 3f455eb3", + "3da97d48 3f07d553 3f8f7fd4 3f8d428a 3f43fdce 3f29cf76 3f43495c -> 3f0f726c 3f8ea603 3f8c6c3d", + "3f8404b6 3f0a224f 3f4f709a 3f82728c 3f18e001 bdf62f04 be358b9c -> 3f52bac0 3f496b5a 3f82e51d", + "3bd6d280 3f9eb9d1 3e98ea92 3f6e1280 be197c50 3f284828 be1e6473 -> 3f9ec18c 3e9a76b8 3f6e0dd8", + "be59cbfc 3e49e548 3ca1bfb0 3f4f706e 3f302e9b 3e28ac4c be01af9a -> 3da31dd8 bc6f2d00 3f50bf4c", + "3f86968d 3f8f396c be6c13f1 3ed04304 be664eac 3f054117 3f3e84f0 -> 3f92d31b 3ee2ca8a 3f5ef8b8", + "3fbc2bfe 3e207800 3f87098a 3f273592 be502ee4 3de52324 3f9dfc07 -> bdc33d30 3f85e139 3fa42898", + "bedef403 3f2c1e08 3f0f9c12 3f165da0 3f55c69e 3ddc23f0 3f930660 -> 3f0d9d68 3f0a5956 3ec30f3e", + "bd6f5640 3f4a9f6a 3f8be880 3f97bfd6 3f857bbc bcd441d0 bce8c040 -> 3f475ec3 3f8be3e2 3f97b5be" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_overlay(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "bd630008 3f59f1aa 3d314a70 be30c331 3e7e918c 3f23b544 3f9e129f -> 3f5b0122 3d2e8cbe be225cfb", + "3f3a3f48 3f4a7598 3eb9872c 3f1273ac 3f1bf908 3ea83052 3e1c00fc -> 3f52f8ce 3e8b3ab0 3eb612ae", + "3f71c784 3efcc46a 3cdb9d90 be494d6c 3e974786 be0e44aa bda9d5f2 -> 3e9b1cdd bbb5bd1d 3ca2cd35", + "3f5dcf0c 3f3571ec bcdda638 3f8d33ff be4565ad bccf14a8 3f1519de -> 3eb7e294 bb1f272f 3f8b5137", + "bd81db5c bd96afe0 3ef143ac bc916478 3e97c64c 3f05caf2 3f64e5fc -> bd9a93b4 3ef09271 bc8a2023", + "3f12e5c8 3f42fe6c 3f13665e 3f4c4fe4 3f38ef22 3f9fe968 3ec16a12 -> 3f52908c 3f70ca03 3f450fa1", + "3fabc5a2 bd527848 be705832 bcc64d50 3f83b62b 3f3f0c80 3efee4a4 -> bdfea59b bec79b8a bcc526c2", + "bdd2c874 3f50f414 3f90e983 3efea76c be0c4390 be482d0f 3f0f00b6 -> 3f571f3e 3f8e7db2 3efb94fe", + "be9eab5b be37f89d bcd31948 3e43f73a 3ed45bd0 3ece16c0 3eafb80e -> be41b0bb bcdfda75 3e5702b2", + "3f270f6e 3f9210e0 3eadfda0 3d80af0c 3f87269b 3f021a41 3ce52980 -> 3f84f590 3eafdb16 3cc59f73", + "3f924286 3f33768f 3e82b984 3f52b4a0 be0d8fec 3f4a1038 3f64b2d8 -> 3e87a7aa 3ed927ae 3f7b6c1f", + "3f037740 bd2d7258 3f609a68 3ce747f0 3ef4f5b4 be2961cf be61a717 -> bd299af9 3f4b2547 3bf0a744", + "3ea08fd8 3f16cecf 3f3c2127 3e3bd02a 3eefac6c 3daf2a38 3ed35930 -> 3f14b43c 3f2a7c80 3e318a4a", + "3f4150c4 3eb3fe50 3eb6a42a 3d6c13a0 3f18c771 be5c9bf7 3e88b9c0 -> 3ece4e42 bceb460a 3d190480", + "bdb862d4 3f2ceb24 3f94dbda 3f9c8f8f bc437080 3e612418 3ea1b2d8 -> 3f3493b6 3f93ce7f 3f9b9d13", + "beb15bf4 3f207645 3f6c9f14 be7eb3a4 3e87c908 3f6a4de0 3f21e64e -> 3f3000c1 3f670bdf be6755b9", + "3fa890aa 3eb1999a bdb1e386 3f97d987 3ea2c7a6 3ea08b9a 3b8ad080 -> 3e38ddcd bd3513ca 3fb6fddd", + "3e71ba54 3f5adda8 3f9090ec 3eacee02 3e30d3ec 3f5d7cb4 3d267350 -> 3f55209a 3f8db5bc 3e876ce3", + "bd0b6228 3f930556 3f03f368 3f03d494 3f413736 3ec0abec 3e4f8ad0 -> 3f9359c2 3f04febc 3f0657ce", + "3f0afcf4 3f76e2b4 3d61b208 3e762274 3f5d5e86 3f36bcce 3e7ae1b2 -> 3f7a7ec4 3d8b0c48 3e31fb94", + "3fb9905c 3f87c109 3e3a83cc bd40e4dc 3ed72ed0 3f83e326 3f542396 -> 3f898bde 3eecaa85 bdbc5b39", + "befccf0d 3e463a16 3df87164 3cec73b0 3f389336 3c51cfe0 3f80b1e6 -> 3e1af730 3e37fcac 3c6cdd2f", + "3fa15e51 be5da88d 3f22a81e 3f885ea2 3f1acc52 3cce46e0 3f82030f -> be8c14d1 3e4b9fb4 3f7af90a", + "3f4de4cc 3e22aeb6 3ef8fd06 3f42ad4e 3e93efd0 3e380e62 3ea9368e -> 3dd6e737 3e7171d4 3f31f4f0", + "3f2d3822 3f8dd437 3f322a70 3f34054c 3f598900 3f812e9a 3eadf4cc -> 3f87489e 3f67cdd6 3f238b64", + "3f9ce7bb 3f3280e4 3e0a153c 3f804eca 3f8adb34 3eec8740 3dc22858 -> 3f90cead 3dfa6ab8 3f809d0f", + "3f45fade 3e1394ec 3e71c3dc be5d6ffd 3de875b8 3ee4fdd0 3f36303e -> 3d6d6e4c 3e5e0a0a be92f7ce", + "3f898890 3f2b7302 3ed996b2 3c248d40 3ee0952e 3ef5649c 3e6fb3c4 -> 3f204ccf 3ecfe6d6 3b8d0a2f", + "3f33c886 3f722270 3ee288cc bdf30408 3f19c2b2 3e7e2138 3ebe9086 -> 3f74181f 3e92687b bdc76481", + "3e8fbae8 3f2ce3bc 3f135e50 3f8f851c 3e81d418 3ed4d2cc be653877 -> 3f216408 3f0e39a0 3f95d3c9", + "3e9037ec 3e80459e be3f813d 3f4515ea 3f502e98 3f2bc113 be684237 -> 3e96e7c4 be51f1a8 3f2cf680", + "bef5eecf 3958c000 3f3a094c bd98b674 3f7b84b0 3f5e6b0a 3f739d42 -> 38e89079 3f213f3b bd2ce9fd", + "3dace480 3cabe2f0 3ee2e630 3e24f99c 3e8f55cc be13ca2d 3e1214cc -> 3ca58018 3eca3718 3e1b057e", + "3f95944d 3f7140e8 3f5efe14 3e6fced8 bd144ae8 3f78fcc8 3df4b07c -> 3f5ec5f2 3f81b9ca 3cd447bc", + "3f4aacaa 3f6912a6 bdb331b6 3f8e1256 be5fa9f7 3f2f7e5b 3eb06fbe -> 3f4efdff bde7d54d 3f9188b6", + "3d7159a0 3eb95750 3efaf898 3f601c00 3f87789e 3e57f5fa 3f230ff2 -> 3ec5896f 3ef26bac 3f609fc5", + "3f42c686 3f773b1a 3f9a5b27 3f5e3e04 3f211d43 3f2bab02 bdd27aa4 -> 3f78f4f9 3f9383d2 3f3f4755", + "3ebeb70a bdf0a63c 3f35cbd0 3f9c9f93 3e9eb7e4 3f622cae 3f15b685 -> bdce95f3 3f4afef1 3f9ad092", + "3f13d7de 3e448674 3e924466 3f197346 3f72c44c 3f675964 3e9789e6 -> 3e9524c6 3ed67872 3f0148ae", + "3e929d10 3f106f83 3d862430 3f736f2e bd889a80 3eb6cac4 be6c6b1f -> 3ed87422 3d765040 3f6e2caf", + "3f85ccf5 3f99fb66 3f092268 3ef17354 3f650ff6 3f417542 3d6498f0 -> 3f8489cd 3f48ad06 3d09d745", + "3fbc03e0 3f6a47c6 3f1db5b4 3f159e0e 3d551c70 bce35370 3d83e6dc -> 3f4db267 3caa4ac0 3d57bc90", + "3f5edf3c 3ee79bf2 3f9172c3 3f38b990 3f86a8d6 3f8140ac 3f5c6e4c -> 3f631d30 3f81f5ea 3f65888b", + "be8be538 bd3a5e80 3cd51740 be0f4c3f 3f0ea41c 3dba57f8 3dd8cff4 -> bd348b64 3d025c08 be2e2958", + "3d10f740 3f63f1c8 3f95676a 3ee46128 3d822cf8 bdf9a466 3f3ed135 -> 3f6313e7 3f96589f 3ee858a4", + "be857436 bd9ab4bc 3f00857c 3f2a4bfc bdfa4496 3e8ed9ec 3f14dc16 -> bdcce2c8 3f0f3524 3f26a806", + "3f092274 3f6b6c80 be70ab21 3f257284 3f2e73fe bc96fd10 3f4fd378 -> 3f6f6c8a bdd5fd1a 3f43b2d4", + "beb3a691 3e377c00 bca94c60 3e066c12 3f18e409 3e21dbac 3f3d2964 -> 3e2af703 bcd1ec31 3ddfc51d", + "3f951323 3e84f35c 3eb91974 3db35ecc 3ed45484 3f9997c8 3f533a38 -> 3e5512fe 3f7370c7 3e1d99db", + "beef1aaf 3f32e6de bde4942a 3f9e8614 be1f983b 3f11aba6 3f193302 -> 3f622135 bdd5d7a4 3fa1547d", + "3e50c304 3ec4c014 be4649a9 3f6c9a3e 3ef628c6 3cf246c0 3f24b034 -> 3ec3355a be20410e 3f6dbc6a", + "3e5a4880 3c34e080 3eed74d8 3f90180f be0ff462 3f0b4686 3d22a0d8 -> 3c037aab 3ef1ea54 3f934094", + "3ee5876a 3f701938 3d84ac78 3f376197 3f785488 be7960be 3e395edc -> 3f76cccb 3cb0e83b 3f229ce4", + "3f86ca7c bde039f4 3ea7c042 3f368d2a 3ea87acc 3f80d0f0 3f0083d9 -> bd8f806e 3f2d53cd 3f36dcd6", + "be528ca6 3f9033de 3f28665c 3f165a0c 3f299c72 bd15f890 3f557cf8 -> 3f91491f 3f3bbb0e 3f07d7f5", + "3f9cff4f bd9dbfc4 3eea018c be08c16a bdf8da58 be1e1b40 3eed5e38 -> 3d2583f0 be8da4cb bdf91850", + "be2c89be 3f92e927 3e58eef0 3e9c4eb6 3ecfd216 3f09102c 3f104337 -> 3f924fa3 3e565863 3e98f61a", + "3f9733c5 3f896bf6 3e8b5524 3dfe2b48 3f1003d6 3e2b6d2c 3f1cf4d6 -> 3f88077b 3d6ece71 3e210b8e", + "3e2226d8 3f3a8d74 bd1f2ec0 bdc94814 3e8be0b0 bdde9d26 3d833fbc -> 3f359072 bd007ef8 bdad7e5f", + "3c4e9700 3f872a08 3e93ac20 3ee4ccec 3ea94c1c 3ee95a28 3f2a93d0 -> 3f8731dd 3e9381f4 3ee5c298", + "3f5a6c40 3f5b94c8 3f1991f1 3f576fd4 3f949750 3f77a89a 3f2a898e -> 3f825366 3f6b44fd 3f62f02f", + "be348840 be096e6a 3e21973e 3f962a2d 3e6246cc 3f982051 3e56dfe4 -> be16f3da 3df4b9ba 3f93e5a4", + "bedbd5d2 3e0aef2a 3e5a5292 be199d95 3f85e296 bceefba0 3f0d17ae -> 3d939725 3e9ec41a be12de7d", + "3ed9f188 3e7bcec8 3f9b7c54 3f5af45e 3f9a266b 3e191c94 3f8e9d34 -> 3ec96543 3fa3afcc 3f6e5314", + "bec15a06 3f9632d6 3f8de072 be32f410 be2e73a3 3f92d7b3 bb81c440 -> 3f8af58d 3f94a8f6 be77118f", + "be59449e 3f6c18a0 3f085596 3f26d536 3ee66560 3f9935a4 3a81a900 -> 3f6c84c1 3ec9e2d0 3f39b6ec", + "3f268c14 3f86d3a2 bcafabb8 be4a856e bd414468 3f8d57ff 3da6df9c -> 3f8bafe5 bd1ce4a0 bdb87969", + "3f3a205c be32fa4e 3eb19bb8 3f08e0e2 3e7093c4 be0a0f74 3d90b4e8 -> bddbfd33 3cda82d8 3e7a09a0", + "3ea1ad94 3f22994a 3f9e3dbb 3f9a70e6 3f116175 3f4d4f28 bdcabe4e -> 3f269a8a 3f987935 3fa47190", + "be795c1e 3e9949d6 3f8c88b0 3e10ba70 be55bb10 bd1447e0 3f8b2657 -> 3ece32ea 3f8942c0 3dceb082", + "3ee70872 3f6e3f0e 3ee586ca 3eb124f8 3cc39b60 3e99adb4 3f8a68c2 -> 3f669e26 3ebc2148 3f070a23", + "3ed8cbd0 3f7c7606 3f4d95b8 3f80308e 3e972e4e 3f485e74 3ed7cbf0 -> 3f7bd8f4 3f59a77b 3f8033c9", + "3fa6182a 3f02f308 3f0a621a 3f583e26 3f8419a1 3f9672ed 3f5aa20c -> 3f97ce5c 3fac44e6 3f7cc591", + "bdf0070c 3f0bda20 3f31f36b 3f90e89e 3e147088 be199d87 3ed754a8 -> 3f1584a2 3f3dd7c1 3f909806", + "3f015876 3e05c50e 3f693008 bdb52c16 3f63f47c 3e7a3d12 bd30ae58 -> 3e3a8c91 3f634b7d bd237943", + "3cd5ba60 3f93053c bd7b19a8 bd1f7e98 3f50a548 3e751460 3f95aa55 -> 3f92b532 bd77af57 bd251078", + "3f841782 3e3b96f0 bd37f500 3cb949c0 be6c3d38 3f3ac23e 3dc0d3e0 -> bdbea302 bd878d20 3b70aaf7", + "3f9bcbec 3e9d5e8a 3f0bf076 3c177e40 3d1d5a80 bc8aab90 3e348f50 -> bd1ba925 bcc37280 3b00837a", + "3c4c4f80 3f8067fd 3eed8282 3f90805d 3e4cf8ec 3ed24e60 3f98250b -> 3f8068c4 3eecfb2c 3f9037d0", + "3f240658 3f9232d8 3f5706a0 3f27a2ab 3e939e60 3e5bc378 3f3421e0 -> 3f972299 3f480a95 3f3eb1d4", + "3f268b6c 3eb42768 3f223610 bd072068 3f2fa0c2 3f6f4d62 3ec6b826 -> 3edfc393 3f574470 bce6e9e2", + "bc81ef70 3efae576 3f5c06ee 3e00adc0 3ebdacc0 3d9c7ec4 3f375076 -> 3efbed68 3f5c82ac 3dff97ea", + "3fa1d6a9 3de9fc94 3f937e42 3f1a1ed4 3c392840 3f83e8a3 be758a40 -> bcdcaee0 3f72aed3 be11de68", + "be9cb95e 3f398d24 3da83aec 3ebace1c 3f8a0ef4 3f9d854a 3d31e818 -> 3f209906 3d39f6ab 3eef04ed", + "3e62aaec 3ebaf422 3f1e27a4 3f3b2182 3e87a2c0 3f23f89b 3e332544 -> 3ea77f15 3f243dce 3f313867", + "3fb867b6 3f94dd33 be54c001 3f1a34e6 3e98ba84 3f84e3e1 be6a3dd5 -> 3fa0fd58 bf07aaf0 be6e2540", + "3e3c9c00 3f5aba54 3f40d548 3f8a33ed 3dacbac0 3e63e67c 3f4842c4 -> 3f550550 3f3a6096 3f892455", + "3f5edd7e 3f700a1a be49f0a6 3cdd51e0 3ede3f2e 3f318471 3eef5c2a -> 3f6e351c be86f998 3cd0cbc9", + "3f8059b5 3e9a5d64 3f5a26ec 3f5b82d8 3f7442cc 3dc1ec90 3f893a2c -> 3f137a6c 3f3b6340 3f82b003", + "beaabe3c bc082d60 3f2509ee be13ebff 3f2f973e 3e950e4a 3f8f1337 -> bbee95d7 3f31b5f9 bdadf235", + "3dd03730 3f8e1642 3f9ff4f8 3f768760 3f9f04c3 3f9e9672 3f61dd3e -> 3f8bf5eb 3f9b27b6 3f7743d8", + "3fa9e1e0 3f143214 3f08ff32 3f3e8690 3f4210f4 3f02dbbc 3f4359ee -> 3f5e0b67 3f0c8618 3f6c3ff0", + "3f3c954a 3f10a3cd 3ee86de6 3f8a58e5 3f993a16 3f751b3c 3da0a808 -> 3f818124 3f4289e0 3f90c611", + "3f260f9a 3e42a450 3f7eb20c 3f181a74 3f318a2f bd503ccc 3e0d925a -> 3e73820b 3f7dc365 3eceafcc", + "3f267962 be10d293 3f7962dc 3f26001a 3f97393d 3f6a1c56 3ea741e2 -> be889621 3f7cf39a 3f11b65e", + "3fa293b9 be499862 3ea0c660 3ee22c24 3f34578a 3f55d0d8 3f80d9e0 -> be99267f 3f14d73f 3f8150bf", + "3f90a869 3d893dc8 be0c0eda bd5ce288 3f5561d4 3d71a6a0 3ee51164 -> 3df0b3a3 b9e62b64 bd429f76", + "3f3c4f52 bd72d050 3cca66f0 3f3d2312 3f156be8 3f4a116c 3f56f978 -> bd885a42 3d104704 3f5e8e7b", + "3f3a0496 3b9bf180 3df36758 3e98feac 3f851859 3efcf14e 3e83ef8e -> 3c0b2391 3df14a99 3e463ca7", + "3eebbc98 3f4f9c58 be1de62b 3f539e7c 3f58bf66 3e3ee3f2 3f599262 -> 3f5f0edc bde09b89 3f61eb1b", + "3f040d32 bde161e8 3ec7376e 3e787280 be02d66c 3ea4c282 3f638f16 -> bd1ed4ac 3ea2977c 3eae104a", + "beabfc62 3f61b5c2 3ecbd138 3f8e142d 3f91f0e5 3f70dbe4 3f97cfc5 -> 3f54aeda 3e8f739d 3f94914b", + "3fb1faeb 3f330fa4 3f946e84 3eb20d22 bdffa8ac 3f3ca779 3e216894 -> 3e357b14 3f86f82f 3c8864ae", + "3f9d96ae bd609bb4 bddb4a28 3f6a26d8 3dbac188 3eff77f0 3e812bc8 -> 39be6a04 bddabaaa 3f5cd34e", + "3f020f2c be6e28af 3ebd26b8 3f9e5137 3f8fb0b6 3f58f650 bdae7334 -> bec268a0 3efff0bd 3fb057ff", + "bedd576b 3f62b780 3e7c19c8 3eec4308 3e5ec0ac 3f99b531 3f0c0216 -> 3f69de58 3dc6ad1e 3ee2ae10", + "3ea95b00 3f78844e 3ee0adf8 3f932774 3f4d9cc2 3ea4b078 3f0d6e58 -> 3f7a0486 3ec62bf6 3f927d44", + "beb3de1f bd82b49e 3e6a5fac 3f38b47c 3f331184 3ee27078 3f36a7e0 -> bd60c586 3e73e198 3f2e02a5", + "3fb693aa 3e7c13f0 3f13f5c8 3f83f91a 3f8952a4 3ec5f264 3f1df5fa -> 3f2600e0 3ee206de 3f82a585", + "3f7c553e be62aafd 3f8fc2f6 be6dfe8e be2069b0 3f82b6f8 3f8efc94 -> 3d858137 3f7f2231 bf03e0bc", + "3fa03ac2 3f29d698 3f917287 3f685ac0 3f493d18 3f5c5810 3ed9bfca -> 3f678d26 3f81b0d9 3f63ee8e", + "3e07b520 3f343fbf 3f81ebf8 3f09bb6e bd94e222 3f73278c 3ec9fd58 -> 3f28c017 3f81b150 3f066ce3", + "3fa332f0 bde0247c 3e87dbe4 3e313fa8 3e1ef852 3ee71374 be13791a -> bc58c057 3e6dfd27 bde3ab6a", + "3eb486b4 3f6b10aa 3f2e2f50 3eca15c4 3f107130 3f97060e 3f424232 -> 3f6c0366 3f5568e1 3eeef809", + "3f8b74b4 3f10d10f 3f90e746 3f35b72e 3f0cea4b 3f2f7531 3d434910 -> 3f1d0a01 3f8a1349 3ed8fffe", + "3f07c3c6 3eaf65bc 3f882cde 3f94ea36 3f54e02c 3d1c7fb0 3f386b89 -> 3eed13c8 3f8c2df7 3f90069c", + "3f63b1a8 3f501dd8 3e78db14 3f65418e 3f2fd1a6 bce11650 3f8439c3 -> 3f6006f6 3c75a52f 3f7e9d0b", + "3face68b 3f1b97fa 3f583072 3f702780 3ea3c870 3f816bb8 3ed94b40 -> 3ed579a0 3f879455 3f6ceb08", + "3f9483f3 3e52d6f8 3e869fbc bce68330 3f6e4bf4 3f6a9db4 3f0842e8 -> 3ed2d1a2 3f045d67 bcf7c651", + "bea18382 3f9104b2 3f8a0220 3f207970 3c6c96c0 3dc650dc 3e9df326 -> 3f8bce0a 3f87766a 3f2c041a", + "3f65b61a 3ee7286a 3e84f6fc 3f12dde8 3e2706f8 3ec56c62 3f58ed48 -> 3e36ce7e 3e535458 3f56e677", + "beb82325 3e3fe22c 3f3fc954 3f904fc5 3f7514ce 3f79ceac 3f86ea9f -> 3e00c2b7 3f29cf4d 3f96cfdb", + "3fb8d0b9 3d19e1a0 3f82c7d7 bc9f3da0 3f6c9dc2 3f5f8ef2 3f470ce8 -> 3dab35ac 3f7f9111 bd0f6eed", + "bea2b255 3f0d09de 3f710886 3f934a1c 3ebe5490 bd7d75fc 3f27568e -> 3f1668d8 3f7660b8 3f952c5c", + "3f8962f9 3ed46508 3c9903a0 3ed83e94 3f901699 3ef2f3e6 3db889ec -> 3f78d5fc 3c90a4ce 3d4fc2e3", + "be954b48 3eab69ea 3dea4cc0 bdbeec34 3ec0427a 3f53b85a 3f63d31c -> 3eb7dbd1 3dbd9d52 bd938180", + "bef35cce 3f43868a 3dc162d8 3f9c9b94 3f986784 3f3a6daa bd8e5330 -> 3f1bd1f6 3d976d66 3f8d1ebb", + "3f75e462 be462db8 3ecae6bc 3eae2932 3ef27654 3f47ecac 3f294b73 -> be3c1cc1 3f1c34bb 3ee4211e", + "3faf06e5 3f1172f7 3f2c49b0 3f854bbc 3e4a3644 bd669478 3e337974 -> 3e57f05c 3e33bab0 3f89ffbb", + "3f992eaf 3ef6026c 3ee90080 3f8a73ce 3e80a970 3f36c400 3f869aa8 -> 3e4721f2 3f302736 3f794e44", + "3f8d4619 3f284616 be34719a 3e98f90a be50a5a0 3f919ce6 be07004a -> 3dfff228 bed93436 bdf18676", + "3f9bace3 3f18dc2a 3f96ae89 3edcb680 3eeb75ec 3ef241e8 be295b52 -> 3f0ecbb4 3f9829a3 be888329", + "3e9f4fdc 3f5f54be be2bd538 3ecde410 3f718d48 3f2dc5ca 3bbcb700 -> 3f685949 be3ef3db 3e8e9087", + "3f982bfe 3f30ffe7 3dec5818 bd93629c 3f2221a1 3eede97c bb846980 -> 3f4a0b12 3dd87dd1 3c69fd46", + "bdfa71d4 3f63ac1c bddd83a8 3f307a4f be715959 3e040128 3f924112 -> 3f68c4f5 bdf19e63 3f23fac4", + "3ebb269e 3ea51f8a be559fb0 3edac924 3f64b2e0 3f0b0b86 be0be3f5 -> 3ed49b59 be5c5c9b 3e69ecf6", + "3fbb0f33 3f3eeca0 3eb8786c 3f7cd29c 3f3875c4 3db9a990 3ed41026 -> 3f68df83 bd90f1cf 3f7c0699", + "3f7a3b4a 3ebeeb1c 3edbeb28 3f0ec770 be5c0728 3f4bbbe4 3f97d394 -> be17ca40 3f2d8d97 3f935330", + "3fba2eca 3f755896 3df746c0 3ed369ee 3ed88a1e 3f8fa460 3f40fe00 -> 3f72f514 3eadb714 3f37c6e1", + "3f8e200a 3f8486c3 3f7de0f0 3ee42298 3dc10550 bd6d8f88 3f9ac7bc -> 3f889adf 3f7b4000 3f92dc3a", + "3e6ec534 be563588 3f9cc6bb be4c965a bdea2dd8 bddc6ca6 3f85d598 -> be18d6a4 3fa4ee38 be805200", + "3fb6b786 3f80a767 3e430446 3f94d5ee 3dfdfc60 3f54ef1a 3ed9b1b8 -> 3f815b18 3ebdde32 3f99493c", + "3e4122f0 3f3659f7 bdf26906 3f9d55ba 3f154467 3f9a6d7e 3eddd098 -> 3f38a8ce be198165 3f9e12de", + "3f26f43e 3f6baf3c be714193 3e61b73e 3f2bc2c4 3eb81206 3c59af40 -> 3f7036d0 be450c45 3da4d8e5", + "3f8e94bb 3f1e5b44 3e95829c 3ec0aa34 bdcf8eb0 3ee8f136 3e9dcefc -> 3ddc59f0 3e868289 3e5cb242", + "3e8d5d2a 3ee8d03c 3f01ed06 3f9321f8 3f274977 bde02046 be6b3466 -> 3efc8af9 3eaefee2 3f9ad78c", + "3fb80686 3f9713e3 3f00091b 3d485830 3d259a68 3da12920 3ee1f306 -> 3fb592d6 bdd7dfd0 3d268888", + "bd8dda08 3f5c2e12 3eeecbb2 3f42dc42 bc6cfd20 3f06a72b 3f6f8dcc -> 3f5ebb96 3eedef9d 3f3f2b74", + "bbd313c0 3f9aeeee 3f546c98 3eedef00 3f486968 3f484474 bc72f420 -> 3f9b080e 3f544406 3eef8301", + "3c7bd840 3f92ffe2 3f0956c1 bcc9d3c0 3e01d9fa be083a87 3f9799ce -> 3f9337b0 3f070793 bcce12d3", + "be204b7e 3f1fc5d8 be2e61f4 3f96fd78 3f886f82 3ed36acc 3f292d66 -> 3f0eb965 be3322f4 3f9825d9", + "3f93afa3 3f03a680 bda0bd98 3ec2d23c 3cfc7be0 3f526d3a 3f232b8a -> bc3eb680 be0c15d2 3f004acc", + "3f96c8cc 3f89adbb 3f5d78d8 3f94e110 3f96e8b8 3f1f59b2 bd1c0724 -> 3f746457 3f676f23 3faf5943", + "3efc1b60 3f6d806e 3ede98e2 3f8f7007 3eb76f08 3f847f5c 3f511640 -> 3f6aeb76 3f29f3ec 3f8a9f47", + "beea3ff7 3f9b592c be34af7d 3f94f194 bd1cc3a8 3f01c5e6 be3cf924 -> 3f8de0d0 be338a59 3f87d32c", + "be3dd422 3ec5fcac 3f54e152 3e2db418 be0c38eb 3ccc0cd0 3ec277dc -> 3ef4bdd7 3f5c79b9 3e35717c", + "3edb3e46 3f28844d be29c677 3f008589 3f9aeb9c 3f1908a5 3ec18cac -> 3f5dbc38 be37fe58 3ee6690c", + "bece49dc 3f6bddea 3d7ef430 3e4a9436 3efd2f58 3f78f410 3f436794 -> 3f6bf4c0 3d1de2dd 3e1f9903", + "3f8c2e48 3f251b12 be43947a 3eea4f02 3f20b6ae 3f8c0b92 3f755f72 -> 3f3e8bf4 bee10ac3 3f6ace14", + "3f11458a be1baf4f 3eef0bec be393f9a 3d853aac 3f1269d4 3f45c4fa -> bd9daa95 3f0147c3 be728c46", + "3ed64daa be5da1ed 3f3e5518 3f886fd6 3eb1f298 3f5503a0 be4eb458 -> be415942 3f50967a 3f8d64d5", + "be1014a8 3eb37c1c 3ebcb50a 3ecbc096 3e3fd844 3e413fa8 3f9ac1db -> 3ec346be 3ecd3cc1 3ea31902", + "bde1d0b0 3f81726e 3f373e1b 3f379c1a 3f48d1d6 3e9ab444 3e94459c -> 3f8189aa 3f3a6abc 3f3af7f8", + "3f93ecd8 3f45c672 3f764584 3ef8762c 3e392508 3f2bdc7c 3f92a19a -> 3f1ad1a8 3f7a1fc4 3f9acc28", + "3f149580 3f1e086d 3eddaae0 3f652fe4 be6584b6 3f5b015e 3f22472d -> 3e975d98 3f1c91ee 3f695ac9", + "3f822eee 3f119a2a 3ec38ac6 bdd30d00 bde07c86 3f3714ab 3f2d494c -> 3d0b4e10 3f0c8fb5 be0f7f3e", + "bddc1fd4 3f30c05d be42e329 3e430274 3f27c73a 3f7fdbbc 3e843f70 -> 3f2e1ab7 be2df6aa 3e4d2451", + "bd516418 3f8023ee 3eb42800 3f07d580 3ca1f610 3e6e88ac 3f3279dc -> 3f80222a 3eb91348 3f05695a", + "3e39b068 3f8407ca 3ea94928 bdaa7fae bdb6c6d8 bdc78246 3f358c00 -> 3f84e449 3e849b68 bdb76ec6", + "3f927916 3f97c28a 3f40b068 3e255cfc 3f154e8d 3ea67910 3ecf1c14 -> 3f933beb 3f275a5a 3e01398b", + "3db87220 3dabc5c0 3f11fdba 3f24e166 3f564578 3f5cd982 3f328640 -> 3db632ff 3f192d8e 3f281ea4", + "bec7efc8 3f66fe50 3d37a798 3f468208 3f6c00be 3f23237c 3e650346 -> 3f5ec0fe 3d23f77f 3f52eaaa", + "3f7d00c2 be2cfa3e 3dead31c 3f80c791 3ebebe64 3f97e6a8 3ec0eaa4 -> be016685 3e8a6472 3f80f82b", + "3f620e20 be4b7cc7 3f9d772b 3f9d64a5 3f1004f4 3f9bdea6 3e9f4ec6 -> be61f9a8 3f703b92 3fa7324a", + "3f56f9b6 3e9d2d9a be625a87 be361d4c 3ed93e68 3f8d48d7 3f92724e -> 3e89322b bee3f1bd bebd8fc5", + "3f39142e 3f840b23 3f917a0d 3edd9472 3f1ec8a8 3f9ff9ce 3e372bfa -> 3f835728 3f7d0ed0 3e6d647c", + "bea7d1f6 3d12a1b0 3ec85c04 3e749998 3f03ec3c 3e712cb8 be082bc0 -> 3d11289d 3eeb18eb 3ead0c53", + "3fa72d18 3ec6ac08 3ecf903a bd210a58 3ec6de6e be639d1e 3f27c01b -> 3e8cc3bf beb80b16 bd625bac", + "bdfc5644 3f170f64 3f2a181c 3cc81080 3f651c38 3e0b7b74 3ea7959a -> 3f0cd8b9 3f31cb94 3cd093f6", + "3e96695a 3c822360 3f34095a 3e7d862c 3f4891ce 3ea8b86c bd50e918 -> 3c97d031 3f2c6d9f 3e2b72c8", + "bdce3394 3e699928 3ea589d2 3f804b46 3f97ecda bd555ac4 3f287954 -> 3e494943 3eb7f11a 3f804dab", + "3f97f9cd 3f16c053 3f3da2e4 be4f9d23 3f3b721c 3e46c94a 3f6677a4 -> 3f50c95b 3f0d6f28 beca78fd", + "3fb22b31 3f1fa142 3f8e44a9 be5b400c 3f89bc7a 3e749202 3ec4ee72 -> 3f9d16d6 3f98a44f be14d547", + "3db59ec8 3e636ff4 3e2226d2 3f79ac6e 3f5d14c0 3f8d0018 3f48a9c2 -> 3e721ac2 3e3373d9 3f79fdf7", + "bef26800 3f7024a8 3f9ee26e 3f7b5a70 3f93f77c 3f9581d0 3f4e187a -> 3f664b2b 3fb26ba8 3f7a02d1", + "be92d60e be2bf331 3e55633e 3ee72b08 3f8a3732 3f9fa364 3e88c26c -> bde587c9 3df3e010 3f030623", + "beff2d29 3f963a9c bcbb0658 bdb2af20 3f989645 3f2d532a 3eda4d72 -> 3fa59054 bc9a04be bdbfcc42", + "3f309522 3f578008 3e58c638 3f7518d8 be23212b 3f507a34 3f8dd224 -> 3f32a9e2 3e9b6489 3f7e3de1", + "befbe488 bdae265a be64578f 3d962798 3dc55114 3f8fe7c9 3f7eddb4 -> bdf35178 bdb02b03 3d19df67", + "3f8467c8 3f3fde09 3d85f244 3f538324 3e8d5d62 be1e8358 3f812887 -> 3f222924 bcbe06b1 3f812e98", + "3f0e2812 3f273084 3f159a7a 3f9f8548 3e7776e0 be07a7f4 3e42df48 -> 3f0db58c 3e95bc34 3faa5caf", + "3e6ccec4 bd8cf0c4 3f500254 3f6be838 3e32b420 3ddc1848 3ec1524c -> bd6f7238 3f474bd8 3f6ac4fa", + "bebe4900 3f47934e be66f9a6 3f885ba2 3dd44b60 3f727432 bdc4d494 -> 3f5832b8 be1a37ba 3f84a796", + "3fb1daaa 3e39bacc 3e034242 3f3bc442 be022326 3f058383 3dcd9b2c -> be09eefa 3e0b1d77 3edffcda", + "3d864ca0 3f94b4c2 3eac4df0 3f2a7dd9 3f14f3fe 3f2ad5ab be18b8cf -> 3f947bdb 3eb015ea 3f233634", + "be7e57e6 3f609714 3f760e48 3f5959fc 3f326433 3f2aec76 3f352389 -> 3f5d84ce 3f753a3e 3f555dc3", + "3fbd3b89 3e5b9f26 3ecdb978 3f95fe8e 3f444c88 3ebc6918 3f4df70c -> 3ec46f29 3e7ad9c5 3f823055", + "3fbadc7e 3d27cb20 3f8165f0 bd9ed5d4 3e17abe2 3f5aeba0 3f1fd60e -> ba931a73 3f7fe58b bdd881ed", + "3e0409ac 3e5327a4 3e868c9c 3df33410 3f18927f be23ee4d be00c1a8 -> 3e5861b3 3e5f4a5b 3dcbf531", + "be10289c 3e676d6a 3bb52f40 3f57b908 3f30ad5e 3e8daeb4 3f942a8e -> 3e5b0994 3bc0932b 3f504411", + "3faf52d0 3d819a74 bd0a2b98 3f28253a 3cf0f780 3ee483cc 3f977759 -> bc95e42b bcebb3d6 3fa64d3b", + "3fba59f1 3f79f3d6 3f4fc726 3eb6555c bdc58848 3f0bbc5a 3e5131cc -> 3f6f731f 3f5636f8 3d4ab779", + "3f7e911a 3f135b19 3efcb126 3e3c241c 3f87f505 3ef3f77c 3f778db4 -> 3f866974 3ef0e176 3eb5710e", + "3eca2320 3ee58ff4 3ef5e6f6 be18b934 3f13e808 3f1553f2 3f76e0ea -> 3ef3a83a 3f030a09 be50b8cb", + "3fbe084a 3e15c978 3da22094 be318354 be228b36 3f65a1f0 be3ac5f0 -> be0f305e 3e309f1d 3e362a48", + "3fbc30ed 3f4b6e9a 3f04000c be06730f 3e22a6ee 3f30e75d 3e8275ce -> 3f16b276 3f49a753 bd160cb6", + "3ef23ae0 3f337f26 3f819dea 3ee28710 3f0b4813 3f6b8324 3ecc171e -> 3f36afcc 3f80f96f 3ecccbd3", + "3f845581 3f4311cc 3ed16004 3f60c354 3f866dce bd738998 3ef65e18 -> 3f843209 bd83520c 3f5f8c40", + "3f7c8f1a 3f3c69ca 3f0e5386 3f339fb2 3f8e76fa bcfe4728 3f9d3d3e -> 3f8714b0 3db9bf70 3f90b2ec", + "3f1b574a 3ef7062a 3e8f1706 be4038ee 3f661a6a 3e0bf7ba 3f64a370 -> 3f374bc7 3e1fff93 be8df6ff", + "3f9a9daa 3f9d2c44 3d852e58 3f27404e 3f848a30 3eeca59c 3f987b8c -> 3f6ede54 3d7209dd 3f9dbb57", + "3f94db38 3f37b7a7 3f288e2b be5d8027 3f69d0ce 3ea1aab8 3db46164 -> 3f7d3573 3f031529 bc148c24", + "3f2dd618 3f6b9410 3e4b6f60 3d281960 3f34da8a 3f161f78 3de6f078 -> 3f714def 3e634f97 3c9f63da", + "bed7f32f 3f9ad642 3ed58714 3e977790 3ef1b32c 3e8d80d8 3f932a4e -> 3f9a3464 3efdcec8 3e08e6cd", + "be556a4a 3ef760a2 3ec2a388 3f652da8 3f088536 3f416820 3f8f49e1 -> 3ef3f211 3eade90a 3f5e40c4", + "3f60f706 3dc051b4 bccf9f80 be70e311 3f3a7499 3f0a37f4 3f8f1140 -> 3e06c011 bcde3050 befb3426", + "bef37a4b 3f92e2ae 3f2affbd bd4e2db8 3f67386c 3f63ee4e 3f991073 -> 3f9a20b1 3f0b7102 bc8b77d1", + "3f6a9404 be2d4154 3f82b817 bd6c0208 3f4cde78 3f07c562 3f78e7b0 -> be864c30 3f82915e bddc23d2", + "bef38aa7 3f65e242 3ddc2438 3ea07594 bd836cea be557613 3f474cc2 -> 3f73e69c 3e38419d 3e6be341", + "be3fd8e0 3ce78ce0 3e0dc932 3e052e64 3f4f6d3c 3e5fe1a6 3f8cd3a7 -> 3ccca1a4 3e1cbbf2 3dce752c", + "3f1a0d24 bcd4e590 3cd74b40 3f9d32f8 be5061f2 3e7aee38 be56b556 -> bb8290f5 3c953bb4 3fb62371", + "bed5978f 3f7fc3cc 3dc4f520 3f51a12c 3f22d21d 3f9a19dc 3ed01a1c -> 3f7fbcf7 3d2290f4 3f553fbb", + "3ebd5710 3f1be194 3f33edca 3f7ba6c0 bccba820 bdd29f70 3f440d44 -> 3eea081e 3f1202d9 3f7c81a0", + "3edb1538 3f8eff3f 3f338c72 3f0ae236 3eff2af2 3db6adf8 3f845567 -> 3f8f0496 3f18abdd 3f4063ff", + "3f7e0bf0 3e8f1ae0 3f88e8c6 be20d340 3ed7ebca be1e19a4 bc66b5c0 -> 3e71be49 3f947b0c 3b51200e", + "3fa78f3a 3f3eb5d5 bd126118 3f40f6f4 3d109d28 3f6e9506 3f9a626c -> 3ede8dfc bd9bf62f 3f9abffa", + "3faebef8 be746874 3f3e99a0 3f0cc046 be2644f3 3df9fd98 3f5506b0 -> 3e459d70 3ef639de 3f7543fc", + "3f39ce6e 3f2f8482 3ecb49b4 3f15ca7d 3d9262bc 3dacd058 bdf4f0d4 -> 3efae844 3e21482b 3e590eec", + "bcc646f0 3f132de9 3edf0776 3f0c520a bdc0d186 3bd3ee80 3e4578d8 -> 3f164f25 3ee45b83 3f0e0a5c", + "3eeb3ba2 3e8d9a30 3f39d5fa bd123c8c 3f8ddd10 3e2e9f94 3f0ba9cf -> 3edcc0a9 3f24981c bd185bca", + "3fa8c7d6 3efa27b8 bcaa0678 3f984c76 3e5c5c30 3f4f486c 3f0c0981 -> 3df91194 bd1a7211 3f95491e", + "3fa765bc 3f9a7969 3f9f10f8 3ed24d6c 3f9bcb06 bd45be28 bd4d1dd8 -> 3f51a1bd 3fcb9e0a be388ce0", + "3f75613c 3ed85964 3f0200b4 3dcd4c6c 3f816fc6 be13f2f0 3f3ffc81 -> 3f563064 bdcd5330 3e17d58d", + "be8beae2 3f475634 bd35b170 bdf6dfe6 3f2ced2a 3f4366a0 3edbd030 -> 3f41e6db bd1b8c33 be00349e", + "3f50210e be6cf169 3eabc81e bca96bc0 3f99cbe7 3d15ce18 3f4e2f12 -> befd9cba 3da95a33 bcfd8dd5", + "be72fc84 3e2bd436 3f253191 3f8d9aa6 3f06519f 3f155865 3e808378 -> 3e29d0ed 3f2199b0 3f8bff1b", + "3f284eca 3ee2c398 bde6a55e bd7b03d0 be47f103 bbe7f640 3f602d70 -> 3d1ba941 bd19b885 bdbb821b", + "3fa7159a bd02ab90 3f8e9955 be1c95ad 3d85250c 3f85d6a6 3f71a3d4 -> 3b8dc5a6 3f739b8a bea90689", + "3f8e7e70 be67d472 3f87ba74 3f4a29e4 be5078d4 be077a5e 3df7fe7c -> 3e03558b 3f929bb9 3f1cbee8", + "3fb574c7 3f283de0 3e39c850 be700708 3f95239e 3ec9fe24 3f259846 -> 3fa6deff 3e02386a bea9fbe0", + "be242c96 3f8e6791 3e79d106 3e7237b6 3f05aade 3e7eeb18 3f0d4cd3 -> 3f8e81be 3e86f6af 3e6e2eb9", + "bd564ca8 be3a19ae 3f986a20 3f1ee96a 3f05368e 3f4dbaa8 3f617864 -> be39b429 3f9930b3 3f1b0b33", + "3f9df43f 3ef162ca bdf12f94 3f62f32c 3e76be52 3f8e459e 3e72cbfc -> 3e2e2082 be974bc3 3f5019ef", + "3cd1b1c0 3f55bca6 3d885b48 3ef4dfa8 3eee6dfa bdf5f09a 3f2e0bed -> 3f55a9a4 3d840723 3ef720e9", + "3f9b6d47 3f74b940 bd9d73d4 bde21be6 3f593102 bcad5ad0 3f5968c4 -> 3f7e43c6 3ca75159 be50f1f7", + "bcd44f60 3f1ebe68 3f5c4ca6 3f4af9c2 3f0bf288 3e115c0c 3f1fc940 -> 3f1e822d 3f5cf644 3f4aa265", + "3fb860df 3f8f5055 bda5fc3c 3f06ab3e 3ea0cd80 3efb0ed6 bde5f99c -> 3f978446 bda15e9e be9eb578", + "be81340b 3d498068 3e042c44 3f2c97a8 3f0873d6 3e23951a 3f8e26bc -> 3d4624cf 3e1adece 3f12e3f8", + "be04f2c0 bd94b93e 3f810f0d be463076 3df3c6c8 3f8fa073 3e99a0fa -> bda36f9a 3f813ad6 be507a9c", + "bc8a9ca0 3f82415d 3ef659ce 3f6c058c 3f13257f be5fc17b 3f31e83c -> 3f8242d3 3efc573e 3f6be3ce", + "3fa6a1fe 3e8b1acc be201a56 3f71bd0c 3f383439 3f5ce9c0 3e41636c -> 3eda9ea7 be9bb292 3f662f63", + "3f8f67ff bdd1a87c 3f99e24b bdc97e1c 3f23ba82 3f0acb21 3f599770 -> be099c9f 3f977049 be33bfdb", + "3f3581a2 3f85a33a 3eee49b8 3d85e960 3f88d7f1 3f7d1b48 be303162 -> 3f811692 3f49b569 3b4968fe", + "3ed8e42c 3f8d1746 3f3c85e0 3e35e6bc 3e8a2c3a 3d97c614 3f57d0fc -> 3f8fa4b0 3f242cde 3e6ac456", + "beba5ad9 3f301392 3f5aa5b0 3f7d4140 3eeaef94 3ee2b122 3daccbfc -> 3f327854 3f5c3425 3f7e15df", + "3f9a0715 3d111a70 3f7ada9c 3f881fcf 3f0bfb88 3f2bf49e 3e9fecfc -> 3d2172f3 3f7cfaff 3f8bcb0e" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_sub(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "beebb041 3f872cc2 3f93d1d3 3f3abe58 3ea8eb8c 3f33390f 3f349f1a -> 3f9a9d53 3fbd1204 3f86f1c6", + "3fbb7d84 be6fdfd3 3f1b4860 3f41759c 3d2f4580 3f1df493 3ed13ad8 -> be980757 be982ba4 3e20e42c", + "3ec8fcf0 3eb6e716 3f04435e 3e4c7870 3f09f0fe 3f1887e1 3f5cfe10 -> 3e15350a 3e90c5e0 be0e893c", + "3ee493a8 3dc8f724 3e263bec bd8dea48 be1a35c2 3f03fdef 3f61169a -> 3e2953fc bd8af152 beec7487", + "3f584668 3f3c4a40 3e80fb1c 3e8b68b6 3d893558 3f43fd2a 3ed36f52 -> 3f2dcce8 beca2be8 bd9cdd78", + "bee07294 3f54e23a 3f32bb57 3f98502c 3f1fbfb4 bde670fc bdf8f2be -> 3f8d74ec 3f261ab7 3f917e0d", + "3f3aba08 bb22ae40 bc868b60 3e2a0dc8 3f89b1ff 3f6cfc14 3eb7578c -> bf498174 bf310fb8 bdc2cfcc", + "3f891413 3e5a5cf4 3f1d2180 be77d5d5 be324d09 3f32f870 3f11e689 -> 3ecca7ae be0a21e4 bf5a3515", + "3f46f8d4 3f3e14ac 3f0c7ba0 3e6c0cd8 bd862704 3f89c440 3e5c1de4 -> 3f4b1d3e be935786 3d81ef8c", + "3e53f438 3dd6568c 3e6f0504 3f9ce6d6 3f8cfbb5 3f9f72e1 3ebf13a4 -> bdfc9148 bcc81490 3f93039e", + "3f5e1716 3f88c404 3e84fb8a 3f9518a5 3eeaac00 3f3c1c66 3f84d5ec -> 3f2bbcdf bec167a4 3e876c9e", + "bebb5123 bd91e552 3f81dfa3 3cc1d240 3f5701dc 3e8ad5a8 3f8a4b59 -> 3e71b259 3f8e9265 3ed67ee2", + "3e491014 3f635c0c 3e8753a0 bc1184a0 be3bed16 3f8be890 3ead34d2 -> 3f6c959b 3d4b89ec bd9a39ee", + "bec3312e bdce024a 3f359d21 3ee1092a 3d7a9608 3f69da30 3e1136ee -> bd9e3e2f 3f876218 3efcb759", + "3fadb700 3f800532 3e42d714 3f9cb64a 3f6e1650 3f9e10fa bdc799a0 -> be862850 bfbe2a0c 3fada47a", + "3eb82890 3dd51ddc be209af8 3f1e16be 3f9b6e04 3f483ab0 3f1b790c -> beaa57f0 bee05764 3ecc55d9", + "3f15c1c8 3f48bc5c bd30b5b8 3eb07288 3f0e1dac 3ec4e190 be77d4e4 -> 3eeb3307 be894308 3ef8efc9", + "3ee92760 3f9c0bb8 3f7c13c0 3f847958 bdc75aea be5c425e 3f2fc3c2 -> 3fa1b83b 3f8a9385 3f38e896", + "3f87858b 3f4ce0a4 3ef3596a 3e16b280 3f89211c 3f255e1c bd2d0ed0 -> beaafeac be55a450 3e44810b", + "3d925f68 3f130980 3d4a1fe0 3f9475c5 3e9291c0 3f6d89e6 3f9051e7 -> 3f0dcca4 bc8b04f0 3f8a2535", + "3f0ba06e 3e2f423a 3f1fa330 be175d38 3d796700 3f7b215c 3f067c3a -> 3e0d406c 3db55590 bede6212", + "3ea408f4 3f00a87c be1ed2be 3f418bb6 3e8ed2d0 3e090bd4 3eda4778 -> 3ed38ef2 be4abaee 3f1e945b", + "3f9aa1f8 3ee9440a bd7861c0 3f4701ae 3f999946 3eee9214 3f39c6e6 -> bf7e7b85 bf1fa0ed bdcb6598", + "3f125974 3f1e2c8e 3e61a878 bddb3178 bde91b60 3ecc93f4 3e0a6190 -> 3f2ed4f0 bc03f430 be3cb4ba", + "be619b6e 3f942954 3ede9b70 3c9a9980 3f34e6e2 bdf4c838 3f975b39 -> 3fa816ec 3ed11fe6 3e8f0caa", + "3f65b3d8 3de38480 3f6ec9fc 3f8bbf1a 3d5ce0c8 bdb5c3b8 3e9b89ea -> 3d806c61 3f81967b 3f51b662", + "bdd2fe50 3ec2c2c8 3f2420eb 3f0ad8d1 3e863650 3f480b56 3ecb8bfc -> 3ed09684 3f38bcec 3f155502", + "beaeec0e be0f5f98 3e07a774 3eac2ca8 3e59036c 3e1b73a0 3f9d7a9e -> bd8a76c2 3e3cc36b 3f41b0e1", + "3f678556 3e1ce448 3f9ac770 bd9a3122 3ea9aec4 3e0f8f54 3e1f4200 -> be1605e0 3f8a8ccd be5d2012", + "3f207272 3f28fd98 3ef96dd2 3f528284 3b5bfc00 3efcda94 bc8a7de0 -> 3f2873b8 3e35e858 3f5538e9", + "bd268b98 3e835fce 3f6f837a 3f656480 3e9c0302 3e3007c2 3e8315dc -> 3e89b7be 3f714d8e 3f680ebd", + "be3bc478 3f544932 3f19c101 3f5fc16c 3f5e3ea4 3f7cd266 be22d27e -> 3f7d09c6 3f481cef 3f584aa0", + "3f9d71b3 3d563db8 3f6ebe78 3e7a9820 3f7a8a10 3f99e09c 3f9f5171 -> bf936404 bf0bcde6 bfa4a465", + "3fb8cfa9 3f793b1c 3f6ac458 3f78f6ac 3f82b1da bdd05c58 3f33e252 -> bf002c48 3f882f99 bd2c2800", + "3f904288 bdc4aff0 3f78564c 3c0fcb00 3d19e0d0 3e2867b4 3f831b03 -> be0db331 3f48e33f bf92a2f3", + "3f78a044 3ee4ccc6 3f30b1d5 3f941fad 3f9d6d7c 3f396a4d 3f10d8d7 -> bf3f62d9 bc584e40 3f1b929c", + "3f193fd4 3eb79bc2 3e99f0e0 3f3698be 3ece22e0 3d8428f8 3f4c2b4a -> 3df0d614 3e862984 3e717fdc", + "3e9eef4c 3f4df870 3ea7b8f8 3e8ca3d6 3f0aac13 bc3db410 3e0be7dc -> 3f22ec86 3ea99012 3e6dd9bc", + "3f0b4662 be6d0373 3f9636ea 3f089dce 3cc1af70 3f4da89c 3e88cebc -> be7a2f63 3f3c8abc 3ec6cdbf", + "3f3bd440 3f616ab4 3f1d8240 3f14a096 3f12b878 3d88aad8 bd64da74 -> 3eeb889e 3f10f97d 3f1f1f2b", + "3f7951f6 bbf9ae40 3eaccd5c 3f7faf18 3e695baa 3edb9414 3ec48f3e -> be6b1251 bda42fe0 3f1ff7f7", + "3ea3cdf4 3ebb97d0 3c177b00 3ebca48a 3f8ab7ab 3f93db84 3eb99420 -> 3ca12ba0 beb87b9a 3e81453c", + "3e992ed8 3ec8f3a0 3f7bed40 3f3ef1fa bd977a14 3f233c0e 3d901b4c -> 3ed44816 3f4b16de 3f398e4f", + "3ecf1354 3f444400 3ebf4318 3f74cd7c 3f95e0d8 3d4717a0 3f930858 -> 3e960fc1 3eb53266 3efbbd46", + "3f4dd990 3f6f7630 bdf03ebe 3f8a2c7c 3f9fb7e2 3f1a78f1 3f409c44 -> bd8b2e50 bf1a3df8 3ef2f04a", + "3f153a68 3f9ebae7 3f06a2d2 3d82a940 3f4f3f26 3f80592c bda7c38e -> 3f44a6c4 bd6ff8c0 3de47458", + "3f33eefa 3f6a0fe8 bdada3bc 3e427898 3f65f194 3f93cea7 3d9b6d00 -> 3e90e2ac bf657b6a 3e0bd971", + "3e1a5a14 3f619500 3f8ad74e 3ecb4f76 3f2dd94c 3f8fd777 3e3558e8 -> 3f476087 3f6a517f 3ebda48d", + "3eef6c5e 3f9b6291 be54798c 3e9d2a74 3e05623e 3ef86de0 3f630a10 -> 3f93969e bede68a5 bddcb034", + "3f3dc7a2 bdfcd1e2 3f09f94e 3f8affc8 3e9a7c30 3f5c2dcc 3f84c2e2 -> beb1baa0 bdca01a8 3ea2517e", + "3ebd6006 3e5529ba 3edd39a4 3ebba330 3f6289b8 bdc82126 3f835a02 -> bdf3ff24 3eefbb16 bc564820", + "3fa6cd65 3e555810 3f042f56 3cba0390 3e1350b4 3f52a30e 3e75c920 -> 3caaf818 bf0e4e20 be948565", + "bedafcd9 3d4498c0 3edd6276 3ea32cf2 3f3aca02 3ea68c14 be277356 -> 3eb85b9b 3f124f2d 3e7ebb16", + "beee28df 3ef7826c 3f80dff7 3edbcd2e 3e88f6d0 3e8ffafc 3f9c4ec1 -> 3f1b9c0b 3f919e41 3f7f50c3", + "3f623832 3f20523a 3eb53d28 3eb166fa 3d36f808 3e93cfba 3f8af671 -> 3f163748 3dca7d4c bf1ce4a5", + "3ecb7184 3ece2394 be60a771 3f85a7ca 3f78b314 3ecd446a 3f1f948c -> 3c87f4c0 bec1e3db 3f4be6cd", + "3f573ed2 3f06b247 3d0c51d8 3f9e4231 3f6993e0 3ecb2f8e 3f20748a -> be76c8f0 be994c91 3f359b22", + "3fa2bd7b be12dfb6 3f046918 3f527414 3e91cf86 3f736298 3ec0a6ac -> bf01692c bf3107fa 3eaff807", + "3f910626 3f2cdce4 3f97f580 3ebc1ca0 3f5efe5c 3f870b42 3d844f90 -> be9f93ec bc05de80 3e96a281", + "3f715a62 bdb379f4 3f6d1ca0 be1a6d4e 3e917664 3ecf0ace 3f21969e -> beb6024c 3f0b837e bf3ef32c", + "3f837a81 3ecdb630 3f0646e4 3f810b77 3f9651ea 3eed1d3c 3e8a831e -> bf4df44e 3d47f770 3f3af38e", + "3fb8b49f 3f38fad0 3ee2c46a 3f1ae786 3f9132dc 3eb051ee 3f758dec -> bf6a1130 bd5d5150 bf476efe", + "3f06b836 3f8b1abe 3f463f68 3f8143df 3f168544 3eeb3318 3f32c158 -> 3f46ff6b 3f085c6a 3f2475ea", + "3f91789a be205374 3eda828a be192d21 3f188bb3 3e9e1534 3f9635a9 -> bf5572d8 3d9b664c bfbddbf4", + "3ea3040e 3eb750fc 3f918fda 3ec1b15c 3f9f0930 3f9f6ef6 bd88dc48 -> bd19ce08 3f3d9987 3ecc962a", + "3f45e6a4 3f9f111a 3f882e94 3eb887dc 3e734fec be13b8e6 3f823d25 -> 3f878e23 3f9674e0 beda31b4", + "3fb7ec0d 3efd1198 3f819365 3f7c98a4 3eebdb18 3eb5f80a 3d7f9a20 -> be2ba930 3f006ab1 3f65a448", + "bd86dd20 bdc9163e 3db6e778 3f7235ee 3f98f5ee 3f976aa2 3f95816d -> bc9fb228 3e2b3857 3f82f353", + "3e7a5518 be1be980 3f686236 3ea83044 bdc3dfe4 3eb1ac7a 3f17ed68 -> be03f848 3f52aa86 3e3bd030", + "bc648f20 3f0e427f bcbe2518 3f9229ac 3eb29612 3f46a976 3f884e97 -> 3f0f8162 bc4aec31 3f941075", + "3fa56231 3f75e240 3ecc879e 3dcd8a48 3eb50f8a 3f6e470e 3f83296a -> 3f00e9ca bf4d9a93 bf9c9f5c", + "3f21d874 3f2a1a7c 3de8e098 bdeb0ece 3f9a074b 3f5c71b2 3d1c6408 -> bdc53940 bedc83a4 be0e3f30", + "3dddcd90 3f4c42c6 3f2ea2c0 be4f65ea be3fdd5b 3c786740 3e15f418 -> 3f5174a7 3f2e3724 be5fa36e", + "3fae130d bdc02878 be5f50d1 3daa7fb8 3f423b8a 3e323388 3f568fc0 -> bf901574 bee8d4b1 bf873db0", + "3fb58433 3f4917f2 3f8c22a7 be0d75f5 3f545290 3e7d71d4 3e6d1ff0 -> bec80030 3f3e6b20 beeedd02", + "3db51fa8 3f709920 3f1884a5 3f176415 3b0e3680 bdda7fcc 3f758d9e -> 3f708c8c 3f1aef02 3f01aca5", + "3ed2730c 3f0b4624 3e45e7f0 bd48a920 3f3c648c 3e9c4e50 3f944387 -> 3e775a46 3d8ad2e8 bf066c98", + "3f96aa7b 3f0b6c18 3f8c1668 3e9284c0 3f02c7da 3f2b2027 3f997b5a -> bd6844b0 3e9d7e6e bf9007c9", + "3f67df14 3ebc3008 be6e7ab7 3f584c3c 3f01ba2c bd81e766 3f291c0a -> bdbb4028 be33a637 3e7c8248", + "3fab5706 3e89ad8a be681172 3dfde038 3eba2a78 3f873f22 be70bec9 -> be5f0b88 bfd20c79 3ee09954", + "3fa7c670 be278796 3ee984e0 3f87bd39 be0339a7 3edfded2 3eec62de -> 3b8f2240 bdefab98 3ee91d6e", + "3f264668 3f56b1d0 bdf12bb8 be68a407 3f8f32dc 3f6e08b4 bd8dcb64 -> 3de568b8 bf38c093 be3a9796", + "be37161c be7f9e10 3f536024 3d8c55a8 3f543c4e 3e90a28e 3f2313aa -> bdcfa940 3f604e3a 3e3acbf8", + "3e86ad9e 3f142353 3f7f17da 3f3ed40b 3f9a7679 3d471920 3f0de89c -> 3e85c11d 3f7bd1e9 3f19800b", + "be0858b4 3e2df964 3f89dcb4 3dfa7a80 3eff51c8 3f925b60 3f932b09 -> 3e71f759 3f9d5984 3e8d007b", + "3ee37aa2 3ec6d4c4 3ef38fdc 3ec72c86 bc99e830 3ef98a8c bd6cd7e8 -> 3ecb1ad9 3e84b12a 3ed453d4", + "3f5f32f0 3f914364 3f52753e 3f235472 3e8374c0 3ef5aaee 3f6356b0 -> 3f69385a 3eceb9b5 be0b8534", + "3e43f6dc 3e4a6e02 be473ab8 3f48d8ee 3f062cfe 3ec1794a 3f09288c -> 3dc770b4 be88a3d9 3f2e9965", + "3f02a3b4 3f35aa96 3d85333c bdaddae8 3e0df75c 3f94246a 3eac8ae0 -> 3f238dfd bf068c0a be838396", + "3ec8893e 3d621220 3f6687ae 3ebd79ac 3f84a8fa 3cfe1050 3f485dde -> beb39400 3f636b9a 3d8213b0", + "3f263d78 3dccc1ac 3f6df472 3f190b90 3f85c601 3ee3c24e 3f4b1ae6 -> bf1424d2 3f24011a 3da93ad0", + "3f42260e bd9aeb1a be12019d 3f333294 3f519c1c 3f6a91ec 3f80d88a -> bf3254d9 bf5665db bd81df60", + "3fbb41e5 3f82c40a 3f167662 3f9cbdf2 3f03fa1a 3eba5b0a 3f99a99a -> 3e88e982 3d625ea0 bf081de0", + "3f892a88 3e248616 3e654680 3f8bd974 3f147c72 3f5aed12 3de195ec -> beebfa07 bf3148dc 3f797b3a", + "3f70878a 3f95f6c7 3c92f380 3ef0d0d6 3e4b93d4 be141cbe 3f68102e -> 3f7c1bf6 3e1d87cd bec3433c", + "bebd4c8e 3e00f380 bd81950e 3f3aa0fd 3f976dbf 3f7e0da4 3f882f1e -> 3f10362e 3e9b76c8 3f8faa40", + "3f0c0aa2 bd2d9314 3eee2420 3f11e1bc bc124620 3f14945a 3ee4a13e -> bd1991f9 3e172b0c 3ea6b1cb", + "3e58859c 3d808a64 3eca81e0 3e8aafb4 3f6ac2fc 3f550aa8 3f6eee4e -> be0649d9 3e60d392 3d969346", + "3fb5a475 3ee945a4 3f4158a8 3e5c3e3c 3f56f414 3eddd054 3f8e9b72 -> bf3c6680 3e0fd778 bfaed742", + "be26e50a 3f8b73fe bca6bb00 3ebd6e4c 3f4f991c be197c68 3f8fefc7 -> 3f9c5ede bd376d7e 3f0da247", + "3f31b99c 3ecd5206 3e7b6ba4 3f151e9c 3f1f1fe0 bde8583e 3e12df4a -> bcf9ecc0 3ea60930 3ef741c8", + "be6ac6dc 3f811fc8 3e8ba258 3ead8b14 3ccb16f0 3f69e21e 3e979934 -> 3f81da09 3ef6e186 3ed04d07", + "3f7a7b02 3f5f56ac bd4ef6e8 3f0821f8 3e8bdc50 3f9c90f0 bdbb9b26 -> 3f1aea7f bf9fa87c 3f1f13ed", + "3f87bc09 3edce96c 3e8722dc 3dbf3b44 3e9e4af6 3f9993ad 3e90a5d6 -> 3dd4374c bf8112a5 be532928", + "bc15b9e0 3e711fa0 bd4d5698 3edc3b98 3ef5e6e8 3f127112 3f634dd8 -> 3e759e30 bd37ed0f 3ee06323", + "3f864586 bdcccfc4 3f70393e 3d3a31c0 3f3215b0 3f0a367c 3f7c7bfa -> bf546966 3ebe7a44 bf7d37d0", + "3f432f02 3e6e1df0 3f902502 3f109b5d 3f45060a 3f116a4a 3ec9b198 -> beb56096 3f316b5a 3e876f6a", + "be57a3a4 be6119a6 3f8b4a96 3e9355e8 bdfc07ce 3f7752f2 3f79b128 -> be7ba31b 3fa5552e 3efc7f9a", + "3fbacd89 3f9da4bd 3e74dcd0 3d7fa660 bd81930c 3f8e3274 3f8addf2 -> 3fa97659 bfb0ea0c bfc2ac4d", + "3f07f4e0 3d9534ac 3f9453e0 3f4b6544 3dbb8868 3f287ec0 3f9939fc -> 3cc6716c 3f4f2bbc 3e2293e8", + "3f4beb86 3e85aea8 3e71fb74 3f53d878 3eddd6c8 3e30428a bcd92670 -> bdac1b04 3dcb290e 3f594042", + "be70641c 3ec68ed2 3f474c0a 3f4a1f70 3ec37a22 3f91bd10 bdca93f8 -> 3ef4728e 3f85dc94 3f442da0", + "3ddb4360 3de4ab4c bddc6946 3eb4e8dc 3f5b1e20 3f94ce59 3f7133fc -> 3ca3fb70 be6da853 3e81431f", + "be8d0934 3ee60414 3f9dd45b 3f024812 3f2dd194 3f93600a bd9ca338 -> 3f22e361 3fc66cf4 3ef9c6b3", + "be92fd9a 3f9bd122 3f829b0d 3edb29fc 3f9475c4 3ee4c9a6 3efd415a -> 3fc67040 3f9306c2 3f11ef88", + "3f5bd858 3f1a1650 3f35d27c 3f3193a2 3f0b424f 3f407a5a 3f82a389 -> 3e09fb9a 3d843940 be3b33e0", + "3f2002c2 3f35eb28 3f05daf6 3f4e108e 3f9c7565 3f6f0e64 3d8b4abc -> bd5aaf50 bd7909c0 3f432e87", + "3fb960c8 3f821a74 3e43c356 3ef8a5dc 3f3ee20f 3b9ffe40 3f0dd418 -> bd81f130 3e3c85a2 bea229b2", + "3f9fe387 3e81ac4e 3d8c832c 3f808ce8 3e8aa11c be4cd332 be57ceaf -> bdadf8fc 3ea30e02 3fa23f33", + "3ec9b860 3f810af8 3de4538c 3ef1a310 3ee22a98 3f280cd4 3f2fac0f -> 3f55885b be16ac70 3e4e6ce6", + "3f58a978 3edd40b4 3f68e0cc 3d7dbd00 3e24895c 3f95f675 3f131a7b -> 3e97a04c bda7ad28 bed947d2", + "3f936496 3eeb9b80 3f743784 3f34e6cc bd04e4f4 3f8d8120 bd53045c -> 3efebc6b bea356ec 3f44169a", + "be6db8b8 3f144544 3f98a108 3e2825e2 3e44935c 3f98664b 3f750cf8 -> 3f1fade8 3fbc0232 3ec5d9da", + "bd0ffc98 3ec8842e 3f7079d4 3cbe3830 3f33af28 3f7b3abe bd9d1892 -> 3ed52632 3f794eaf 3ca82141", + "3f8d38d0 3e254214 3da9f830 3f07d57d 3ce031e0 3f21bd48 3e4e484c -> 3e0656c6 bf1d3345 3e9ddf60", + "3e8ee178 3f081009 3e31dc76 3eab7f72 3daa9898 3f9d5cce be350656 -> 3f021c9b be2d73d4 3ec4c1ae", + "3f9cb045 3ebab1c4 3d433040 3d59edd8 bd6370e0 3f8b9e4d 3e60df1a -> 3edd7f1d bfa4cfb1 be5cca1e", + "3d935c80 3e2d2184 3d6c80f0 b978b000 3f37403e 3f7a9f18 3ed27de2 -> 3df0c6ee bc501b88 bcf4460f", + "bee459f5 3f9c337d be5857c7 3f357330 bd74dd4c 3ecd7b1c be5af95f -> 3f98c9d1 bd0437b8 3f1d08ce", + "bdd01d90 3f1ef87e bd97758c 3f985811 3e6513e4 3f7f3da8 3f5dd8d0 -> 3f24ca53 3ce02818 3fa39dad", + "bedf720b 3f44caf4 3f8a24e0 be10b8f2 3f9b097d 3f624e8c 3e9c6f82 -> 3fa60ea4 3fbb86af bc02e1f0", + "beed921e 3f2446ce 3f9c2972 3f01e634 3f91ff12 3f742528 3f06048c -> 3f95e1a3 3fd4cde2 3f40158e", + "3fbeb018 be662426 3e8fca10 3f0fc152 3f671e30 3f852991 3e966c90 -> bfc8ebe7 bfa26e61 3dfdaa34", + "3f14e16a 3e0a343c 3f604c88 bddaf8c2 3f13fc10 be5a0cf8 3f3e8b2d -> be4e0be0 3f800034 bf0a2f55", + "3f944043 be03792a 3de775e0 3f7883f8 be200437 3f1a5ef6 3e066dc0 -> 3d57702c bf15dc91 3f51975f", + "3f3351e8 3e69f93c bddf0a72 3f412d44 be1ebdd7 be13e341 be722bc3 -> 3eac9562 bbfdc030 3f6b95c9", + "3e8b0072 be39a359 bd473054 3d4b4070 3f329866 3f033d1c 3d675170 -> bebdcabc be4050e6 3d0c73a0", + "3f20acb4 3f652c48 3ec1dda0 3f1226c8 3f9a7543 3ea54510 3ef91858 -> 3e0d2534 3e3445ef 3e87f64d", + "3eb0a50a bd402c8c 3f9b986e 3ec42dd4 3f58d1ca 3f4fac94 3d088d10 -> beada194 3f6f8a98 3ebe4a44", + "3f06dc22 3f5b6428 3f49623c 3f85ff99 3dce3190 3e11a470 3eaf156c -> 3f4dd040 3f3633e8 3f5de150", + "3f654b8a 3e0f1958 3f874a06 3f4ecda8 3f6f4bf2 3e8f8274 bc8ee360 -> bf328f36 3f4e4f07 3f52cd84", + "bda06bc4 3f2cbf8e 3f8bf670 3f90b1d4 3f063fa6 3ee02c2c 3e177b74 -> 3f374397 3f905a40 3f922d88", + "3e0a7250 3f7bffec 3e1974c0 bde75c9e 3cf78db0 3f650f44 3c87f140 -> 3f7af42a 3ceca1e8 bdebf4ea", + "be07fa2a bd989150 3df8b2d8 3e7dfafc 3e96b538 3f7aec3e 3f877d89 -> bd1108f4 3e80d09a 3ec6f518", + "3deccab8 3ed4557e 3e8169aa 3eb1a468 3df6a000 3f76ea60 3f864470 -> 3ecd3488 3e10a188 3e671766", + "3f01dd40 3f125ac4 3f81ac91 3cb3d280 be547ac7 3e82068c 3d8a3ff0 -> 3f2d4d24 3f625e4c bc49689c", + "3f09a78c be02f013 3f00b342 3d949128 3dfcb3f0 3f9154fa 3d32faa0 -> be46e0eb bddcbf68 3d48e50d", + "3faa42d3 3ec60a1a 3f68eac6 be37d8ef 3efeb3b0 3d9a5960 3f05778f -> be8cc184 3f4f40dd bf5f7eb4", + "be5b7d54 3f2f7db2 3e9e9dce 3ec7e2ac 3f0cd4fc 3e32374e 3f8d6172 -> 3f4dad7c 3eb1b760 3f208d20", + "be1ce658 3f17380b 3f089175 3e1dae9a 3f392bb4 3eb2abf8 3f788f80 -> 3f33975b 3f1641a7 3e9b02d9", + "3d4dc340 3ec6081c 3f8ebaec bc493820 3ec817fa 3f997bc6 3f3f4370 -> 3ebbfadf 3f870519 bd4c08e9", + "bedb9063 3f5e631a bd989b30 bda1df10 3f8c2124 3f43cb68 3ead9d8a -> 3fab493e 3e81c6a4 3d87f052", + "beecf0d0 3f17ca0f 3e8d90e0 3f5f7a28 3f239f36 3e8e22a2 3e951ae0 -> 3f638267 3ecf57b0 3f80fd35", + "3fac9362 3ee81476 3f61ad3e 3efc18a6 be2e2a32 3e5a146a 3e8951b4 -> 3f2ebe8b 3f182b9c 3e05e97e", + "3f0aba96 3f9c10e6 3f959340 3f266ac9 3f0953f8 3ea54058 3f35bf16 -> 3f6db671 3f7e5ff0 3e87daa0", + "befffd59 3f85ba76 3f8a9752 be12c894 3e014e80 3f831a10 bdb68ad4 -> 3f8dcf49 3fcc23ac be406ad0", + "3fa0bc65 3e098938 3e60b4e0 3f3492b1 3f28c26c 3f03f420 bc921c50 -> bf31891c bedb0c4e 3f3a4e85", + "3fbf9ea8 3be48300 3f07f17f be29ce00 be36ed54 3edc041c 3e8d9028 -> 3e8c7e7c bde5ef68 bf1469ca", + "3fb4a68d bc86ecb0 3f3ececc 3e9f2d14 3f3c7272 3e6a6a54 3f059dec -> bf8716c5 3ed83253 bed9facc", + "3f842b8a 3be30d40 3f055956 3e9ddca2 3e44acf0 3f610fae be636d32 -> be43fcd4 bec616c6 3f09a3d0", + "3f65c6d8 3ee33394 3f442c4c 3e86972c 3f00dd31 3e057b2c be38f60e -> bc040aa0 3f263895 3ed9990e", + "bd9900c8 3ed3000a 3f84bcd1 3ed76610 3f7290fa 3d139bc0 3f089df4 -> 3ef73e63 3f85150a 3eebcfc4", + "3f8ee5d9 3ec66a02 3f10de48 3eee1e9a 3f924f0e 3e3bdc06 be3be352 -> bf6377d9 3eb8dfda 3f2b7fb2", + "3f6a3b1a 3db2fec4 3f4bb750 3f23e12e 3f0b998b 3f2390bb bda935ba -> bed2b576 3e583d08 3f373b73", + "bea90a23 3f72d3e4 3e169180 3e5e5cc0 3f62e470 bd3b5960 3e4c6368 -> 3f9ede64 3e071ad3 3e90ebce", + "3f6ae9a4 3f81e299 3f5240ec 3f11677a 3d4a3440 3e541660 3f5d51e6 -> 3f782c6d 3f21996b be66bd80", + "3f6db61c 3f75552a 3f91f1c1 3f84f0bc bd69f268 3f9e7ffc 3f97f445 -> 3f817473 bc1dbe00 bd828800", + "3f7e16ce 3f9a3d87 3f8bef82 3e991a3e 3ee4315c 3f9b0ec4 3f9e5467 -> 3f433c68 bddf6f50 bf6dbe93", + "bccbad00 3f9c3a7e 3f5f6a68 3f9aa1d4 3f3dce10 3f93749a bd6f4458 -> 3f9e9689 3f66bf7a 3f9a723d", + "3f48e584 3f23d542 bd3e4284 be414dd6 be2c42b9 3dac28d0 bdceb3b0 -> 3f45a0e6 bde63b7e bde065f9", + "3f29ea6a 3f7e9d5e 3f92d3ea 3f57fada 3f9cf8b5 3e4ed514 3f9eb1df -> 3e38f618 3f81aae8 3caa2c20", + "3ead71d0 3f67d3ce 3f59ffb6 3eb47162 3f2690c4 bca1e808 3e841632 -> 3f2f66dd 3f5bb67d 3e87b286", + "3f943b39 3e9b8ab8 3f958508 3e432f0c bbe98ee0 3e59c02c 3ee9ea92 -> 3e9fc49e 3f6bff54 bead4bee", + "3f9ce024 3f996b42 3f1c23d4 3f0ed534 3e9c38c8 3f2c462c be118e39 -> 3f531b22 be5bfd74 3f3b6e42", + "bd9aab9c 3f6fc7aa 3f7a34ec be0e39e0 3f677adc 3f84df80 bb5eb580 -> 3f80a186 3f872367 be0e7d27", + "be60b702 3f991b98 3f349245 3ef04e86 3f426844 3f9fa288 3f7a2f44 -> 3fae705f 3f7aa270 3f2f0e50", + "bda3f374 be6a5540 3f1b0af6 be230acd 3f6bf874 3f6f00a0 3f78534e -> be1ec573 3f2e2d0c bda70c67", + "bd540238 3d111c70 3f5ee0c8 3f8b6138 3f8f8a88 3f313442 3f541f9a -> 3dbf6e2f 3f680cd5 3f90de98", + "3f9d2f3c 3e930800 3d125a60 3f2bd506 3f476f18 3f90e3a6 3d78ac40 -> bf2b63dc bfad59de 3f18bf15", + "3fbab2c3 3f8fe566 3e771ca4 3f7f15e8 3e44c706 3c3a7380 3f487b26 -> 3f5809ca 3e661d60 be155420", + "3e9ed072 3e59df2c 3f78a480 3ef7893e 3e5cabec 3f3ac605 3f3aaf08 -> 3e156c47 3f3eb55a 3e83b936", + "3fb39d38 be7b9c8c 3eef2fce 3f2223f0 3f7d458c 3e0d2490 3f9db802 -> bfd126be 3e8c288f bf8c3f13", + "3f339d2e be12af6c 3cb5e300 3f8432e7 3dc455f0 3ed60362 3e285b54 -> be578fbe be8ac994 3f6ade00", + "3f364440 3ed6d940 3f86291f 3f9d7c94 be0a08ef 3f2aa480 3dc4a844 -> 3f03fe6a 3f12d3cc 3f94bc53", + "be9baaf2 3dea1e68 3dc13b30 3ef58d64 3f2c16d4 bd813ebc 3f7a81bc -> 3ea32c56 3d99ef8b 3f46f09c", + "3fa1bbfd 3f931e24 3eb5fba0 3f27ea15 3f9b371e be1a3dba 3f8f2d83 -> bec40494 3f0bb6da bf41e8f7", + "3e5790bc 3f518dc0 be593ba8 3f8514c8 3f3e7e28 3da0d600 3ea2ac82 -> 3f2973d6 be6a297d 3f790a35", + "3f984f19 bcfcfde8 3f9b580c be1d63f2 3f57e81c 3ebcc8a0 3f72dafa -> bf84687e 3f465ea4 bfa4298c", + "3f9cb21d 3f962922 3f00cb76 3dcd69b0 be3f79ed 3ec43400 3f83e5f7 -> 3fb37604 3d0b3438 bf94a134", + "3f828e0b 3dfb8404 bdc51614 3d8975bc bd48f048 3b6e4a00 3f541be8 -> 3e30fec3 bdccae71 bf472902", + "be64d612 3f6ab148 3e01eee4 3e087208 3ea32240 3e97779c 3e012036 -> 3f7ceba5 3e45a17c 3e254d32", + "3f77d3d6 3f815094 bd730660 3ebdff38 3ead1380 3f839f64 3e04a500 -> 3f2edaa4 bf8703e7 3e7b957a", + "be9ce0b4 3e05dd34 3ec43f5e 3f8a175b 3f5173d8 be616501 be61c4bd -> 3ec3490a 3ea1b785 3f8171ba", + "3fbbf159 3f8d192d 3e9c79bc 3f93265c 3f375692 be25c39e 3f249614 -> 3d500300 3f0b15f4 3e528c88", + "3edaf8a8 3f9129ec 3f38fad8 3f0b0d2d be334e26 3f3d3a5b 3f4f5ec8 -> 3f9abfd7 3ed01a32 3e497470", + "3e72242c 3f563460 3f768a82 3e8cadfa be355dfa 3f1292ec bd6d3b44 -> 3f60ed27 3f53e19c 3e93b116", + "be90d262 3e9ff7b8 3f7aad9c 3f3997c5 3f1adb38 3f26a2af 3f3ea954 -> 3ef7924a 3f94e7eb 3f6f85bc", + "3fbea622 3f453d8e 3e740008 3ec3fa46 bcd70ec0 3f4c8d16 bc9a4520 -> 3f4f4016 bf73aae8 3ed256b3", + "3fa0549f 3f891f6e 3e6f3f2a 3f5a3a8e 3e54b2da 3f3bb1fa 3e1f0684 -> 3f4fa3d1 bf2f4ac4 3f286e3c", + "3faade34 3eefa986 3f89f937 3e86ba94 3d2046c8 3f11ca76 3f57c4f4 -> 3ed4eafe 3ea2a8e6 bf5caadc", + "3f0f03e8 3f2b952e 3f0dd7b8 3f3ecb56 3eea27a4 3f8b3142 3f881c75 -> 3ed45aa5 bd5ad8f0 3e1add90", + "3f0d9dfe 3f138f44 3e32d3cc be0e129a 3edfd8d4 3f92f660 3ee84816 -> 3eab49f5 beebc7b2 bec7885c", + "bc7891e0 3e6feb56 bdb77fb0 3f8cf276 3f9856a2 3f1430f2 3ef9cfb4 -> 3e813457 bda58334 3f8de506", + "3f97f903 3ef5756e 3f2c1c6f 3f5d7bcc 3f8b7079 3f84b556 3d163cd0 -> bf50612f bf0f03bf 3f5255cc", + "3fa56f66 3f935d96 3e58e9ec 3ea1ad98 be2c9f20 3f937230 3ee56c8c -> 3faf4101 bfa37446 be86d800", + "bebb9454 3f6f284a 3f6331cc 3f4433b6 3f762a90 3e2bd3b4 3e8c90e0 -> 3fa4ac13 3f72eeb2 3f5df387", + "3e23a878 be4394a1 3f3dbf34 3f82a026 3f55c53a 3f739d96 3f433704 -> bea61ef2 3f16cfca 3f660d2c", + "be40cb0e 3f6ae264 3ed2f0ba 3dcab940 3f9eccc3 3dd6e8cc 3f474d6a -> 3f935714 3edd0e4b 3e7b74c5", + "be7b72dc 3f90dda4 3f90a7c6 3f1e32df be4c2096 3f46d51c 3f320f66 -> 3f8a99a8 3fa9114b 3f49ec1e", + "3f3bc576 3f9b3d3c 3f4ba48e 3eb62864 3f9f8430 be7a48ea 3c5b7a80 -> 3e98f28a 3f7989a2 3eb12086", + "3f1118ba 3e8bbc7a 3dad89ac bcafa990 3e24f012 bd160960 3f0545ee -> 3e39fd0c 3dd80e93 bea20d8f", + "3ec9aa54 3f972e9d 3f8c1dc0 3b8ddc40 be28cbab 3f062cc8 3f5c4d2c -> 3f9f7e20 3f636248 beab53ba", + "be40d12c 3f86610f bd0805c0 be230534 3f4c0746 3f6b68dc 3f9466f4 -> 3f999694 3e0f4d8e 3d721ef4", + "3f9e48ab 3f80f120 bdcff942 3f6932b6 3f241fd0 3f54390a 3f51db80 -> 3e5bb738 bf903706 bdd27b00", + "bebe5455 3f990d54 3ed45834 3f56bcdc 3f722fd0 3eff9234 3f2f0762 -> 3fc61125 3f19acc7 3f8be6b7", + "3eb80b12 3d9e393c be04ae2e 3f545d80 bdde1284 3c01dec0 3f453a98 -> 3dee0cb0 be07991c 3f0d782e", + "3fb79409 be5bafd0 3eba2e4e 3f9b9562 3b285400 3f8ae11d 3ee1f6a0 -> be5f757b bf98a2e2 3f1520cd", + "be90bf10 3f1424ea 3e87aafe 3e4c0468 3db02744 3dd50000 3f3f658b -> 3f1a5e83 3e96b8dd 3ed23a2b", + "3f054ffc bd827d12 3ea29ff8 3f451c34 3ec4ccbe 3f736a6e 3ea5fefe -> be871b20 be35c972 3f19e388", + "3fbd81b8 3edc1eca 3ed4bdba 3e0e7516 be667145 bd95d1b0 3f56d4a0 -> 3f435a97 3f0618cb bf8d3933", + "3f4bf948 be1d5342 3e85c268 3f27c998 3f296162 3e0e4d4a 3f8d077a -> bf2e49f8 3e1a22f5 be63cbac", + "3f908979 3f48e9b0 3f7207f2 3ec6eef8 3f7e76d2 3e0380bc 3f977403 -> beacda90 3f4ce86e bf7292de", + "3ea539fa bdcd4b2c 3ec77784 3f1c2ae8 3e14a468 3f97d0eb 3f908415 -> be169d66 3bdfdc80 3e7b9430", + "be9fc33c 3f4d8478 be42fad4 3f41d750 3e9d3a18 3e48ec60 3f9b8dbd -> 3f660c37 be0448ce 3f91757d", + "3f240634 3f995c25 3f538d80 bcb76b50 3f687c70 3f5a26b0 3ee17ac6 -> 3f1dc2f0 3e8f8edc be9beed3", + "3ef3ef44 be7c2ed0 3f4b3784 3f2ca386 3f9b8657 3f655698 3f4b2dc8 -> bf533d94 3ebbe77d 3e97acb1", + "3ebcbc78 3f1f480b 3e0692e4 3f23ef8e 3f128a40 3ec82ef2 3f1e4cd6 -> 3ed286ad bc502f60 3ed32a24", + "3e53d990 be657391 3f47725e 3f613a96 bc170300 3f75cc76 3f14e42c -> be637fb2 3f149844 3f426cf0", + "3e6623d4 3e4e7fa0 3f92f923 3dd622b4 3f98ac1d 3f9179bd 3dee4c74 -> bd8800c0 3f648e68 3da09432", + "3f72ec88 be061638 3e24cb58 be281676 3f06b97f 3efc5546 3f913e02 -> bf215d62 be9d0c15 bf9ed59f", + "be9c4f2e 3f588440 3f97c3b0 3e3871b0 3d24b3e8 3daed318 3f3d501c -> 3f5ba8c4 3f9b19a6 3ecfd037", + "be84b432 3f6d9c92 be0860f2 3f7c12cc 3f8711d0 3eb19d48 3d9a5ee0 -> 3f99d06a bd313b4e 3f808993", + "3fb2b8c9 be4f937a 3eb21420 3f2ad87b 3f922d1c 3f8dec9b bd7acfd8 -> bfe60c30 bf99a4e3 3f40bbac", + "3f671b30 3f65453c 3ea3be60 be692e30 3f81318f 3edac872 3f509548 -> bc7f6940 bd870eec bf769867", + "3f011222 3f9c38f1 3f0df52a be50bcfe 3f92f66b 3f3bd0d2 3e0959f0 -> 3f2440b8 3e3d0e8a be8afe85", + "3d969e88 3f57eafe 3ee63c52 3f99ac5b 3f1ff214 3f8bca08 3de75254 -> 3f4c27a2 3ebd1cd9 3f989c28", + "3f080474 3f840542 3ebd6314 bde65b2c 3f0a24d6 be560936 3f6a1c38 -> 3f3ea48b 3ef63f64 bf192e76", + "becf01d4 3f881463 3ed643ce 3f225f46 3f22516c 3f722902 3eb01bd6 -> 3fa8e4a3 3f4d0a58 3f45f937", + "3fb77f57 3f1da831 3e219fde 3e8fd040 3f68762a 3f965d6b 3f2d6ed4 -> bf2f9803 bfc35b2a bf30b8dd", + "3f8e1c74 3f0ff298 3f70420c 3f941b64 3f5cfdd2 3f987ab0 3f3df652 -> becad03a bec4a3e8 3eaa9e96", + "3dd756e0 3f92f5f4 3f377fc6 3e88d04a be6eeb67 3f89b45c 3cea21b0 -> 3f9619d7 3f1a8a79 3e874667", + "3fa8d1d1 3f9996d2 3f913fed 3e60f924 3ec5cd0c 3f933c87 3edcdc90 -> 3f30bcf6 bec3c374 beb2cef4", + "be94925c bde965e4 3ed2e2f4 3e8736d4 3f84d3e8 3f852449 3e6b7f68 -> 3e3fa6d8 3f36b692 3ea961e7", + "be49466e 3d2b6310 3f2b7096 3f777bea 3f956c9d 3f2f7b76 3f50d8a8 -> 3e8ae7c4 3f4deea4 3f904467", + "3e007f8c 3f2e6f80 bca045e0 3f6d2702 be19deb5 bd9ed0c8 3f5e2f2c -> 3f334340 bc211cb7 3f514570", + "3fb17dea 3f73a222 3defb90c 3f1e0c46 3f8f6025 3d85e6ec be27eeda -> bf19fdd8 3cd83004 3f5843a4", + "3f38a366 3e8bd03c be4158a6 3e8b1f48 be66f8e4 bb7f73c0 3f4ce192 -> 3edf1b64 be3e77ad be9c6a84", + "3ecda8e4 3e8da124 3f249b60 3f89ab01 bdca998c 3e862cee bcc254d8 -> 3ea1f978 3f09a8c0 3f8ae33d", + "3f799cf2 be4fc33e 3f0cec3c be1a5052 3e0fb508 3eecf0cc 3f2522d0 -> beadf136 3dcb43fc bf47982e", + "3e43f620 3f678208 3f0b1747 3e92bc68 3f7a5328 3f503f1c bbf9e080 -> 3f379a87 3ec67a6a 3e937bae", + "3da20c18 3d37a580 3f658f24 3f9573c2 3f398bb4 3e136e42 3f0fc83e -> bc4d0360 3f62a48e 3f8fc38a", + "3f988962 3f1bc6be 3ee3d88a 3f924bba 3ee0f5d4 be7023a6 3f857c4a -> 3dade070 3f397749 bdcc7230", + "3d2293d0 3f166270 3f8ce880 3f996dc2 3f690f70 3f2441d3 3d707288 -> 3f0d224b 3f89a5fc 3f992168", + "3f850ca0 3f510ae6 3f04a05b 3f3ad308 3f5a4478 3ee1c2f4 3e16f19a -> bd8eae30 3d74af00 3f13998d", + "3f28881e 3f049290 3f9e18b8 3d3ee9f8 3edd82e0 3f0ed552 bc047320 -> 3e6ea2ec 3f5e2980 3d54b676", + "be438976 3f7f0c3c 3f94373f 3eda4234 be071465 3f2a251a 3f8b33d1 -> 3f78996b 3fa475f3 3f224ab6" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_div(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3ed61684 be140025 bd32b880 3f737258 3ee5029e 3f5a2a3a be0b8320 -> be6078f0 bd3fae46 c017608d", + "bd9eaf08 3f314648 3ead0560 be3af120 bda015ae 3f97828b 3f079e32 -> 3fb75ddc 3eaf19e9 be2e15a0", + "3ef12930 3e03bb24 3e4051f8 3f8fa39e 3f73fa16 3e282f64 3e199ff4 -> 3e06c9e8 3f235150 4083bd02", + "bec21f83 3eeb75ac 3f58a8d4 be791a16 3eea4388 3f4d0a62 bd9dba60 -> 3e819e8e 3f443e58 bfc43beb", + "3f7472f0 3f98b141 3f05ba6a 3f4ad488 3f9d0e5c 3e627e16 3e5d29fc -> 3f7b6fbc 4011d6b7 40627910", + "3f480e94 3e9f97c6 3f83b058 3e1f0ca4 3f56b740 3d09d2e0 3e9a8cfc -> 3eb7929f 41c0f354 3edf4230", + "3fa232db 3f25aec0 bcaaa310 3e85884a 3f1fd03c 3f365002 3f40e6c8 -> 3f9205ad bd01041d 3ebce18e", + "3f282744 3f385a00 3f0dd9df 3e290344 3e803282 3f2fffa6 3eb22884 -> 4008b84b 3f38344b 3ebc8518", + "3f31b182 3eb85746 3f71b8de 3f9eafc6 be4b8098 3f986b42 3ef392c4 -> bf92dd86 3f56d77a 400c0942", + "3f552fb2 3f886423 3e8cde60 bd61f6dc 3f366591 3d829d90 3f823242 -> 3fb63995 4068ddb7 bd5eca38", + "3fa0c1ef 3ed1679c 3f378412 be0af4a4 bdf48aaa 3f8c90c0 3c79f9a0 -> c08d022f 3f22e9a9 c1322ae0", + "3fa0080e 3f1dfded 3f3ef556 3f8aa8c4 be251685 3ed6c3da bcd8e7e0 -> c09e1848 40025869 c24db018", + "3e0582b4 3f9bf046 3ec12770 3f3a0377 3f489fe0 3f8f1b1e be3ce8c9 -> 3fa18ce5 3ebe7ee7 3df25ff0", + "3fb7c02a be2960b8 3e298e74 3f499766 3dbe3550 3f89be8e 3d9b4418 -> c01f0440 3e185658 4169164a", + "3f71334e 3f743bb8 3d871c98 3f94b555 3ecbf8a0 3f7c8244 3f4cfa8e -> 4013ef79 3d88df2a 3fb7955d", + "bdae6894 3f8b2ae6 3d4fdf98 3df554b4 3f56de26 3da962e0 3f55390c -> 3f88e619 3b38a070 3df123ad", + "3f941e79 bd53c778 bdbf8fe6 3f9b32be 3f057498 3e812144 3e8db688 -> bdda67ac bed43465 409c1d85", + "3fa5efd2 3f92edbb 3eefba36 3f96e2d9 3e4875d4 3f739eb6 3f8ec154 -> 40e85cb6 3eff852c 3f82ab14", + "3e881ff4 3e9a40ea 3ea756e4 3f84d400 be696e74 3f983fb2 bc9b4c98 -> be05533f 3ea040df c15caad0", + "3f868179 3edc2384 3f95f36f 3f30be10 3f2edfa9 3ed87c66 bdb4ed84 -> 3f23ba37 403685c3 c103f4a9", + "bea68e04 3d9cadf4 3eb6b1c0 3f98e0dc 3f4909e0 3e6e3308 bd28d770 -> 3d8ebed6 bcd5d080 4130224f", + "3fac9831 3c156680 3f5331ea 3f525212 3f12ec7a 3f86469f 3f7bfebe -> 3c957a8e 3f45e292 3f56d3e6", + "3f9eead6 3f590678 3f9dd27c bd42125c be5c71c8 3f6f77e6 3f7c9a38 -> c0a30149 3fab595d bd455004", + "3f0c471e 3f795288 3eaa052c 3f5139c4 3e12b3e2 3f1a1370 be2e51fc -> 40854a22 3ee7a66e c010b8d8", + "3f5b97b2 bc7636a0 3e8b4eda 3f8b4a78 3f8a2937 3debc7a0 3f775cfc -> bc66ae51 4004386f 3f8f766f", + "3f6db24c be0def14 3f9e01fc 3f291394 3ef023e8 3f68101e 3ee04f64 -> be919043 3fad240a 3fb93600", + "bde236dc 3f407988 bd0aa118 3ee56fd2 bde06ede 3e7c9b74 3f8db0fa -> 3fcbde58 bcb7bd0e 3ee7e2b8", + "3f716464 3f9820f3 3ef9be68 3f25fc1a 3f3cc64c 3e332068 3f185568 -> 3fcb366f 402a0f3d 3f883f6f", + "3e9b5de8 be66a6d6 3e021fd4 3ec8b9d0 3f617952 bdf7c7be 3df1941c -> be7020aa be6bbb5e 3fa40c08", + "beef841e 3e9b14fa 3f7bbd22 3f3e9a0c 3f2f144c be6d78fa bc795de0 -> 3e7319eb 405b5412 41bfd0b0", + "3f50ada6 3f9fd080 3f0acb45 3f10d19a be6260dc 3e98e508 3e79a9ec -> c08beef8 3fca42d9 3fff798b", + "be50d002 3ded653c 3df40ed8 3b3ad480 3dd76498 bcdece78 3f97d33d -> bdae7b1e 3f84ba8e 3b40cf01", + "bdd672ac 3f84641c 3e426354 3dbc6110 3f98586d 3df83ca4 3e600a04 -> 3f869b3c 3d3b4158 3d6be4fa", + "bec4dad4 3f5b7c04 3c96d5a0 3f5698a2 3f470916 3d8fa970 3c938cd0 -> 3f435519 bd9a79ec c185de30", + "3dc9f5c8 3e6e632e 3f741ddc 3ee9bbb4 3e6a146c 3f5f476c be1ddbc8 -> 3e9edbd9 3f77a4fe 3df4abf0", + "3fb5c099 3f9909f8 be2b55fe 3f355e84 3f902acb 3dcf5768 3e05a8dc -> 3f80ab7c c011b18a 40ed1ba9", + "3f85c66d be77e798 3e0e884e 3f068cbe 3f93febe 3e3a3024 3f7a4934 -> be54e667 3f4b35ba 3f09c299", + "3f06585c 3f0b244e 3ece1bd4 3f3e6370 3f659a2c 3f820c04 3f26544c -> 3f13897a 3ecc67fe 3f7440cf", + "3cb0d4a0 3e8c2930 3f7a38f8 3e80bd66 bcb05538 bcc63d70 3f82f4fa -> bbdaf2c0 3dacfa30 3e80ad56", + "3fac0d3d 3ed4c7fc 3f4bdcfc 3f9033bc 3eb38440 3f8b8eb7 3dda22d0 -> 3fb9a02c 3f352b7f 415d4575", + "3fa47830 3ddb72a4 3f222da0 be3e92e9 be6b8d63 be259ed8 3e361138 -> bf210a5a c0a6d3bc bfa55ddd", + "3f7747e2 3f908a4d 3d805f1c 3f5f0b9a 3f91b493 3e94a664 3f6e2cc4 -> 3f7f263a 3e57bbc7 3f6f2b6b", + "3f8af854 3e9a1fe6 3f767a68 3f14eaee 3f8d97b2 3ee46984 3f4c7bea -> 3e8a0f9b 4010ae42 3f3da66c", + "3f3aa9ca 3dd78c40 3e53ff40 3f65d83e bdff193c 3eb70084 3f834ae3 -> bf166cdd 3ef4f29e 3f61a451", + "3f1f82d0 3f17c518 3f262546 3f0e3b5c 3eaedd38 3f1f04da 3f2e0dfd -> 3fa70bd7 3f65481a 3f37f4b6", + "3da79510 3f827025 3f2e082a 3f607d84 3f6d7fbc 3e633ff8 3f0aaf12 -> 3f8344ff 3f5ff5c5 3f70078a", + "3eb7fffc 3f2a2d15 3f21531a 3db8a184 3f6f7ae4 be210b42 bd660a18 -> 3f2e6516 bf84a572 bf04e4fc", + "beb1ca8d 3f8ab149 3e96f914 3efd2574 3ec9d156 3f0ec870 3e2ad3c4 -> 3f015828 3e5ace90 beb9e1a0", + "befeb334 3e34b73c 3e2a0c1c 3f927fe7 3f3b1808 3ecddd0c 3be9e740 -> 3e139b32 3d3101f8 c29c18eb", + "3e5c52ac 3f29e69c 3d8681e8 3f0bfa8a 3f6b4e56 39f64800 3f00be83 -> 3f2d1d9f 41f112a3 3f29bf88", + "3f0aea36 3d0723e8 3f746d68 bd9282b8 bcd36790 3be66cc0 3cdfeb00 -> bf2dbd53 42943adc bfb9f931", + "3f4105ee 3f53acb6 3f0ec40e 3e4287d4 3e878626 3f54f668 3ef49c20 -> 4023c266 3f24850e 3eb16ed0", + "3f58835e 3dd545e8 be415d76 3f9942f8 be3f0e50 3e86b216 3e3ce4b4 -> bee9776f bf22ddc9 40b594d1", + "3f1f98a6 3e870a48 3f7b7db6 bd5984b4 3f88f0bc 3e91b686 be113e06 -> 3e818b3b 4021671e 3e5a8985", + "beff4413 3ea105ba 3f4b19a8 be6f4dce 3f8bcf33 3f30e0da 3f152463 -> 3ea7cdb0 3f1dce09 be19d235", + "3f6695c4 3f170f20 3ea1c622 3e2e0f9e 3e99f72c bde25336 3e9f70b4 -> 3fe9bb08 c022cfb7 3f022f5a", + "3f220178 3f5bbef8 3f345dd8 3e5d53d6 3f51f81e 3f4785be 3f46ecf8 -> 3f7a3b74 3f54ad16 3e82c1bd", + "3e7bf4a8 3b93cd80 3f197499 3f5b11ea 3f7cc5be 3d8c2ab4 3f983e96 -> 3b944460 4026d881 3f527c78", + "3f989e12 3f9c77d8 3f9da3fa 3e1e0d30 3f78f196 bda58930 3f307dfa -> 3fa1c196 c1933baf 3e72f21a", + "3e3b89d8 3f81d534 3e31d5a4 3ed84958 bddf5392 3f9294d7 3f9ab91a -> bf5fffb9 3e2db4b6 3ed171ec", + "3f5a2226 3f3ec592 3f47020a 3f4340d6 3dfd1b90 3f8fc06a 3f9f18b1 -> 40a7f035 3f346d59 3f22bc18", + "3f35083a 3ce3fbc0 3f7b12c0 b9b52e00 3f415586 3ea9870a 3f310899 -> 3d0c1ebb 40186feb b9ee5440", + "bdb187e8 bd65af28 3e246a88 be149d5e 3ebeb708 3f24a737 3f84019c -> bd442490 3e1c8257 be150175", + "3f2829ea 3eab3638 be6ffd91 3f140a00 3f9c3360 3f5f3a60 3db2ba08 -> 3e96e824 be83913a 4091a395", + "3fa5630b 3e8fd0e0 3f859825 3f2de290 3f625c10 3f517ac6 3f4ba444 -> 3ea825f1 3fabed94 3f67a6aa", + "3f032d62 3f893948 be20bbaf 3f1d224c 3e48120c 3f9925e5 3de93780 -> 405565b8 be133573 4043eb95", + "3f8bdfe2 3a54d400 bdc33076 bd063ee4 3f568b56 3f9fbab0 bd431698 -> 3a80e237 bd98d1b4 3f414811", + "3f6d5c78 be7294e4 3ea29806 3f44ba0a 3e8104ee bd948820 bdd42e9c -> bf638ef0 c0812d3c c0da4809", + "3d4389c0 3f43016e bd864948 3e1cf2cc 3a8ce800 3f67da20 3f4fb19a -> 420a3536 bd86f436 3e1eb0ea", + "3f94cf9f 3f97f13b 3f1206ca 3f8f7cba 3f4348c0 3f92b22b 3f4cf93a -> 3fcedd03 3ef8c7b4 3fb903c5", + "bb890140 3d8a4c70 3efb6cb8 bd9547f4 3f325b6c 3f2adc48 3f6c4f9c -> 3d8a0bff 3efae69e bd953aa3", + "bd622cb8 3f8e3356 3eb8dbdc 3e076da8 3f5fc500 bdebbab0 3cc1e6e0 -> 3f8d11cf 3f0ddff0 be2d0804", + "3e42f384 3ef3c88c 3f949443 3ec3b334 3f240bca 3f262a16 3dc9bca0 -> 3f06e647 3fa3df49 3f862b57", + "bdb09e98 3f944d1f 3e579666 bd641f10 3d271a88 3f0d7556 3f994c33 -> bf9866ec 3e488871 bd675e2e", + "bda7380c 3f159327 3dc514e8 be32f5ae be17bbd5 3ecdaabc 3ee5a5b8 -> 3f74351a 3dad1d1c be20fe7f", + "3f8c0b7c 3f89cad4 3f176308 3f4e270a 3f0292b3 3e64aa42 be30edca -> 400d4dfe 4035def7 c0a599e7", + "3f84672d 3f52c8e8 be6a7ade 3ec102ec 3f455178 3f09a263 3ef5538a -> 3f89d05b bedd88e8 3f4d047b", + "3ee55080 3f28de44 3efa3fb6 be030c24 3e7ce8fc 3ee7834a be40fa8f -> 3fc7bb2f 3f410520 3e6f1725", + "3d3946b0 3cfa1870 3f9dcc7a 3ecfd388 be0a6434 3f79b736 be6bb35e -> 3c9b13ae 3f9dfa77 3e9d9597", + "3e4f12bc 3c72d420 3d698d58 3f45b3f4 3f3bb34d 3f533c5c 3f127c70 -> 3c82592c 3d738f89 3f639782", + "3f33137e 3ea38afe 3f53b28e bdf43750 3e33fe18 3cae60d0 3ed1acbc -> 3faefeec 41db6385 be7544aa", + "bd5938f8 3e421144 3f513c98 3f052032 be70b435 3eefdd42 3f5a548e -> 3e7824af 3f44a5ba 3f03e85c", + "3fb32342 3f5b82c2 3f9a02cf 3f5ad6cc 3f9989dc 3ec62300 3f0961e9 -> 3f286974 4077b8b5 3ff1a320", + "3f650684 3f1bca16 3e18f51c 3eca5780 3efee6b6 be453a6c 3ebf8e80 -> 3f942eb7 bf2d968e 3f7c949d", + "3f13fccc 3f76c874 3f5acd82 be598755 3f766608 3f9416ab 3f87d7c9 -> 3f7c5790 3f49a514 be5244c0", + "bd3def90 3f696d4c 3f9ee1f0 be37151a 3e393a7a 3f26eafe be348810 -> 3f386950 3f9af35a be6fba20", + "3fa4dda2 3e297164 3f9164ca be19afff 3e83912a 3e2afa68 3eb43d40 -> 3f482096 4106f627 bf01833f", + "3ec0c17c 3dd499c0 3f956e94 3f489f94 3e40ab6e be5b95e4 3f8d44de -> 3e8b7cfb bfa92c5c 3f41876f", + "3f8ea79c 3edaea90 3f3c4d55 3f6d8c2c bd13e5e8 be5bc387 3f46d3bc -> c153f03b c079da94 3f9cd668", + "3eef4a50 3f9b378c 3ef7040c 3d56cea8 3f0fc14c 3f85527e 3f559c1c -> 3fd3dbe0 3ef2683d 3d6abade", + "3fb6b8f9 3f9b20df 3f489c12 3f44c51a 3f7c2680 3eed07da 3f747872 -> 3f9e8261 40053482 3f520467", + "3db9e7d0 3e86e76a 3e972f80 bc154e80 3f63f2cc be695d82 bdca57b0 -> 3e886934 3e1a7c1e 38b65500", + "3f259c4e 3f6ff058 3e81fd2c 3f063b2c 3f8f8967 3f9a92eb 3ec23ab8 -> 3f5f2330 3e671070 3f8a2675", + "3e152ac4 3e82ed16 3e12ba38 bd073030 3f1ddbe0 3e981480 3ebb212a -> 3e8ec886 3e454fdc bd296070", + "3dd48d68 3ece8f18 3f86138b 3f720748 3ec03338 3f448282 3eec6630 -> 3ef23aa7 3f8a49f7 3f87a80d", + "3cb83f20 3e090458 be709619 3ee808b4 3f12969a bdcf75ac 3f048dae -> 3e0b512c be35c235 3eece4e6", + "be8ffbce 3e42d656 3f2fe166 3ea59dac be726605 3f201eb2 3f8ec351 -> 3ef08c04 3f124366 3eaa6e9e", + "be0806b0 bcaf9208 3f4731be 3f30ae7e 3f8abf94 3e51fb08 3f361d72 -> bcb1608d 3ec13b78 3f2728e2", + "3f466442 3ec7db08 3f0d381c 3df2550c bdac329c 3eadcfb8 3f9ec03d -> c060a28d 3fb11468 3dcdf454", + "3fa81d71 3efee154 3e9746fc 3e87b25c 3e824c3a 3f3081f2 3e5f8f02 -> 401a716c 3ef0c234 3fc1746b", + "3f123f04 3e749074 be3724b4 3e98f868 3f878a46 3f8e47d7 3d8fb390 -> 3e6ccac0 be2ca468 4023e084", + "bed352c7 3f34cd2a 3f64be26 3f1a7561 3f6beb8e 3f0009f2 bd948bea -> 3f2e732f 3f066379 408924a3", + "3d882bd8 3c9eab00 3bac6540 3f0a9a74 3ea00782 3f800ad4 3f2f8648 -> 3cb5df12 3bac6448 3f0ed420", + "3f9437b7 3eed44b8 3dadcdc0 3ed039dc 3f4f2970 3f070d34 3d5d56a0 -> 3f170505 3e310582 410a68c5", + "3f8b8347 3e10f7a0 be442960 3f424062 3f97ce60 3f25a2e3 3f38cf7c -> 3df060b1 be9c66ed 3f89e768", + "3f9394e2 3f34faeb 3e10c928 be66558e 3eafde28 3ec84dfe 3f240a3c -> 4010f336 3eca4702 bebd9b23", + "3f8a1592 3f6879f6 3f43d540 3e7a3878 3f8b6ef5 3f8808fc 3f2f680c -> 3f53e965 3f375ac5 3ebb1f8a", + "3e0d3c64 3d24ab28 3f793eba 3f98912e 3f706c4a 3f485d76 3f4f5bb0 -> 3d2623dd 3f81652f 3f9d80da", + "3f99abd5 3f7c7d1c 3f922fa4 b9a71800 3eab04f4 be6f7bde 3dfbe050 -> 40563780 c0c2f025 bb47b36c", + "3e817e04 3f55c880 3f8c1a80 3f7c4ece 3f8d3388 3ee93e0e 3edec992 -> 3f50ba69 3fb673d0 3fa792b4", + "3f154de6 3f8e9340 3f042fd8 3f9c0a56 3eb7dd52 be520fce be433321 -> 40117cb8 bfa05c64 c04e2fdc", + "3f6835de 3f11e478 bdb38986 3f784b84 3f36fb3d 3f1e6d5e 3eed9330 -> 3f46b35d be0beafe 3ffe39a6", + "bebaccc8 3dadb770 3f511e06 bb4f8a00 3f8ea2b6 3f94b9e6 3f9b6eca -> 3db43845 3f5bbfe6 bb5ce72a", + "3f9053e0 3e7f4c0c 3f833fc0 be764d9a 3ec00bee 3e891c64 3ebd2234 -> 3f37b871 4085f8c2 bf34195b", + "bece26c1 3f6ba042 3f023f4f 3f9e3b6e 3eb6e5e2 38510000 3f6a80e6 -> 3e81d48c c5807323 3f986455", + "3d8c2cc0 3e543b84 3f9c86d8 3ea8fb42 3f3ce16a 3f402878 bcf4d4c8 -> 3e5964f9 3fa0160d bee593a4", + "3d620da0 3f7ad078 3e8f3f32 3f5e873e 3ecb6756 3f68b272 3e5a7032 -> 3f87e855 3e9009de 3f85e8cb", + "3f00176c 3ce2df20 3f3d1e59 3f9e90d2 3f0b2b3a 3ef10e6c 3f577c9e -> 3d211584 3f93bd26 3fad7b6f", + "3f2719fe 3f3db058 3f9ad40a 3f9df459 3f46edda 3f30a21e 3f3b76ee -> 3f613600 3fc83d24 3fc3a5ed", + "3f842d79 3f274f80 3f7bd4a8 3ddc4260 3ebcd432 3f4c48b4 3f6ccf04 -> 3fe77ff6 3f9ed506 3deeb128", + "3fab1ab3 3f581056 3f6ab2d4 3e019002 3e252d4c 3f7e8438 3f0de52b -> 40d6b8e4 3f6c86f8 3e866af0", + "3f06ae0e 3efdbfcc 3e0f9570 3f9d2926 3f1bdbc0 bdc0579a 3f129fe7 -> 3f29c2e0 bf3810f1 3fdad654", + "3f30b70a 3f82907c 3f9faa9b 3f8823db 3f477c0e be33eee0 3f4fd0b4 -> 3f9c1924 c09072c6 3f9dee06", + "3f49d360 be726992 3eb129dc 3f9af9c8 be41e698 3ef9c4d4 3f04546e -> 3f6f7ecc 3f21e709 40069484", + "bd854b00 3f0bcaf0 3f02fef2 be62d9b6 be0e5902 3f09cd0a 3f1f6983 -> 3f565760 3ef75da1 be59e798", + "3ed2bc5a 3f8935c2 3f5cbda4 3e077f9c 3f3a02fe 3d197720 be1ebc35 -> 3f9e7583 411fad28 be8c05d3", + "be30fd9e 3f51c2b8 be79a662 bda76f32 3f08ad11 bdb947c0 3bdd7700 -> 3f321ba6 bf4070b2 3fff58fe", + "3f81745b 3f7c7f74 3e96812c 3f56ee0c 3f39446a be0c06c6 3e252612 -> 3faeff38 c00b5af5 40a82bc6", + "3f70e3a6 3ea43bcc 3e29c1c0 3dce27cc 3e83439c be59bd08 3e46064c -> 3f991ec0 bf394d12 3efdd280", + "3fb7634f 3f60e66a 3f99845c 3efee402 3f1e2804 3f999b32 bd27d5a0 -> 3fd41edb 3f69b423 c18cfaaf", + "3fb723a2 3e0a5e4c 3f2e67d0 be4a1bbe 3f84b66b 3f377fc1 3ef11c2c -> 3e0356a0 3f887fad bf03bfbf", + "3dbc1ed0 3eadfd0e 3f8570bb 3f06d948 3ea816c6 3e853300 3ee2a4e0 -> 3eceaffa 3fa84c60 3f1671b2", + "3f69b9fc bd041a38 3e416e1a 3ec64aaa 3ed99d76 3e587ffc 3f5a5be6 -> bd93a130 3f550745 3ee57fdb", + "3f00677c 3ee49a68 be5f944a 3e6184bc 38d68000 3f66cf60 3d3bb7b8 -> 4508dc50 be6bd174 4021494a", + "3fb5e834 be45c944 3f2ba019 3f954288 bd25f5bc be4f1ee0 3f6f7916 -> 40db6504 c09fc48c 3fa3e632", + "3f228a80 3f5cd8c6 3f4974fa 3f6fd794 3ecafd1a 3f70bb6e 3ec60fb0 -> 3fd92747 3f5191c0 3ff09be4", + "3fbcbf95 3ebf1df2 3f52ebb0 3f96cb36 3f46f73e 3f801792 3e0f25e8 -> 3f07f36c 3f52b274 413de246", + "3f36e012 3f42ad30 be0ecd50 bd6a6b80 3f3d1664 3eb64d80 3ee4cfac -> 3f73e387 bea3a54e bddcd697", + "3f8adc40 3f264ce2 3f5517e0 3f496622 3f885831 3e334a6a 3e818d2c -> 3f1b4249 40a2c7c6 40539934", + "3e57af2c 3dfa0af0 3f1c543a 3df355f8 3e5984e0 3f41d95a bd29c628 -> 3e5ea7b0 3f26e2d4 bf028f1c", + "3e9d0ee6 3f26e68c 3f334dc1 be62bf48 3f056490 3e5d503a 3f052e3e -> 3f55f55a 3fbd656e be91721e", + "bece04b8 3e54bcf0 3e959588 3ef21eec 3f93501e 3f93f901 3e8f6880 -> 3e5ff5e4 3e9db54e bc8484c0", + "3e6a029c 3f0f536d 3f792bc8 3ef11480 3f311188 3e744500 3f699d80 -> 3f1ded2a 3fd777aa 3ef65be9", + "be5d15ea 3f9a2e8d bdcc7470 3f14ce2a 3f03e8d4 bdedf5f0 3f32ae88 -> 3f75bbad be9d2095 3f06e73a", + "be290cc6 bd168888 3f4f2bac 3ea12c0c bbd51b00 bd8cd118 3d642770 -> bf79c9cc 4038b259 bf10f32b", + "beb5ee46 3ed1fdd6 bdafb730 bd04e2c0 bde16a72 3f969ccc 3f5d8c24 -> 3ff0a258 bdb916fb bcfb15ec", + "3db69190 3e949a3c 3d82b560 3f950813 3e89c132 3f9c892b 3f9e482e -> 3eb89778 3d80959b 3f927d66", + "3f6a9298 3f632874 3f65e07e 3f454fb0 3e899034 3e978c3a 3e1166c8 -> 40466d92 4036b7a0 40a1391d", + "3f4361ee 3f0cdc4e 3ee50406 be7a110e 3da89660 3f893fdc 3f893850 -> 40a76b07 3ed93c8b be6d3e30", + "be322be6 3f3b9f18 bdbc3484 3f684a72 3f798c24 bcd1c6e0 3e40675e -> 3f3ac700 bf3b7804 3e6666c4", + "be99c951 3f4f22ac 3e81b0d8 3f0d3ed6 3e9faf50 be4fba92 3f82b720 -> 3e8bbc00 3f3455f0 3f0e2072", + "3f381550 3f8b0d63 3f2abe05 bb77c540 bdb6889e 3f361e2d 3ee0bf52 -> c1075990 3f5c8cf6 bbedbe44", + "3e89280a 3f94a597 3f4b4656 3f798db0 3f629fc0 3f94f463 3ed27a68 -> 3f99cef9 3f439d42 3faca92e", + "3fa81713 3f378717 bd1c9e8c 3f875ff3 be15187d 3f858dc2 bd57a1f8 -> c0d6180d bd141108 c1d5b474", + "3f68e808 bdc1161c 3be2da00 3f0b5474 3f7fa08c 3f4c7684 3f299970 -> bdc157b4 3c0b6fd6 3f4be830", + "beca9b43 3eca1024 bcfde4c0 3f9a7838 3e7ed304 3ebdd6e8 be5e1a26 -> bd9d2a40 bc26ca38 4078b55c", + "3f49020c 3f83e200 3f8139c1 bda0e100 3de30c54 3ec421ec 3f6b28c2 -> 40f098cc 4012514b bdac12ed", + "3f6dc538 3eba6632 3f975e60 be244e6d 3d789038 3f836e52 3d231e50 -> 40b32295 3f93b2d9 c0703bb7", + "bec10bc6 3d2a2550 3f3e7ef1 3e547720 3b75d700 3f52e85e 3f8db0fa -> c083c6d4 3f2f23bb 3e5c34c0", + "3f897e5c 3ed1f0a0 3f33b3c6 3e26397c 3f94d3d5 3f83631d 3e7da4f4 -> 3eb26190 3f2eb9d5 3f31211a", + "3f05aece 3f13357c 3f824ea0 3ec5d5fc 3f0afd52 3ec1877a 3e15844e -> 3f53eccf 3ff2489c 3fc88434", + "3f8a8210 3e4f0a54 3f62dc06 3f7e5856 3ed2151c 3e8eba40 3f9e2d0f -> 3f0440d0 40577f2f 3f49d6c8", + "3f638d84 3d984798 3ee8d020 3f30178a 3f82ccf0 3ebecf14 3f9e3519 -> 3d9561ad 3f914a5a 3f1234b6", + "bcef0b10 3ef323d2 3f3fd2aa bba08ac0 3f4c0316 bd9743f4 3f844200 -> 3ef154fb 3f889a25 bba0b15b", + "3ea7747a 3d6bfbc0 3f812ac0 3e4ae782 3f1b4abc 3ed77f08 3d610ce8 -> 3d8f0496 3fbb4b00 3fa80b5c", + "3f9bfe69 bdaf03f0 3f340167 3f448bb0 3ecc31ce 3f926869 3e1f61f4 -> be784450 3f186c79 40bafe59", + "3fa4952a 3f8dd176 3eed8ae2 3f57eb48 3e97167c 3f8f83ec bde364cc -> 40905a25 3ecc85bf c120226a", + "bd56b830 bb3449c0 3f3976d6 bddf91b0 3ecebd5e 3e85fe18 3e277574 -> bb265551 3f1e0951 bda39f66", + "bebba124 3c9952c0 3e10b050 3f7efa3e 3e4eb0ee 3eb9ba28 3ea1eed6 -> bc09b644 3d4e2a38 3e53ea20", + "be9d4dbb 3f904343 3f0b9e76 3f86dfe9 3f8dcece 3f6e494e 3f805643 -> 3f949413 3f086e24 3f86fbc3", + "be92e6d2 3f803354 3f95c5ec 3ebf01f2 3ef52d72 3f5491b4 3e870bfc -> 3f30572c 3f8cfe45 3d9824fc", + "3f27e954 3d10d388 3ecda744 3e80efae 3d60fa98 3f64f09a 3d0dc500 -> 3ede68d4 3edd98d0 409b7c11", + "bed6ca9c 3d0deab8 3d6ac170 bd413f20 bdb9fc44 3f9219b9 3f705a0a -> 3e5642bc 3d76f4f0 bd3bf7ef", + "3fae389d 3e9faaa4 3f82c8ba bd593550 3f07f3be 3f8b7089 3f71dce6 -> 3f2fc86e 3f685c3c bd6a7d26", + "3fbcbd99 3f95937e 3f8515bc 3edfdb44 bd741768 3e0b9b80 bd97d09c -> c1ebc07f 412c0743 c10e78d8", + "3e24c598 3f4deafc 3f448cd0 3f9663fb 3f2e6d58 3f932bb0 3ef76928 -> 3f5d69de 3f406e27 3fb04527", + "3fbd28e9 3f7d5872 3efd04cc bdd31b6e 3f37ec7b 3d01b1a8 be29c4ae -> 3fc80842 41b6a045 3f77d447", + "3f74dfcc 3e73c97a 3f59d3c4 3f72dd24 3f850aef be3eb611 3c652160 -> 3e6af2c7 c08aa98d 4281dbad", + "3ed6d8e8 bdd02cd6 3e345138 3f99517e 3f7db0a0 3f11a91a 3f22d29a -> bdd0f878 3e6da276 3fbe22aa", + "bc334100 3f1ca829 3f88451a be0abb80 3f0209b8 be10a671 3f508ef8 -> 3f1aff24 3f9450ad be0a631c", + "3ef289d2 3f0a1f46 3ce48320 3ef4a63e 3f9eee09 3e5295d8 3f94cbc7 -> 3efac706 3da1a8a3 3ee473ba", + "3f18a680 3e8e1e1a be4cbf9c 3f8803a0 3f4ec5f8 3f5c4e12 3e0dd230 -> 3ea24ae2 be6087b5 40a020ae", + "3f3d9b7c bd7a84a8 3f3d107e 3e1aa2b0 3d94a324 3f94b8b4 3f8729db -> bf23d891 3f298dc2 3e1490c3", + "3f3540ca 3eaef106 3f9d127c 3f70bcb8 3ea95c8c 3f8c70fe 3f5dd720 -> 3f54c3bc 3f933868 3f857dd6", + "3b6b0c00 3f2df832 be5ed238 bd21d3d8 bd9dda48 3e89ffb6 3de5a158 -> 3f25401a be60fcae bd266c6c", + "3f8c8cbb 3f12afaa 3e622818 3f861ce6 3f5bad06 3dcfe7bc 3f8f0a3c -> 3f2d51be 4017809a 3f6d420a", + "3f7e8f20 3e0110d4 bdeb2226 bd88aab6 3f755b08 3e7d7834 3f2fb1a0 -> 3e06a231 beec7998 bdc6c86d", + "3ecb8134 3d9bcdb4 3f76a874 3e3dd550 bd59b034 3f811da2 3f89818b -> bf05eae4 3f75cf92 3e389df7", + "be71dbee 3d4ff210 3f499668 3f292dcd 3eb786f6 3d3c06d8 3e473258 -> 3cf01506 c0450092 3c6e6680", + "3f76c924 be6ded64 3f5a247e 3f228141 3eae9c6c be64fe7c 3f7b6184 -> bf2a4717 c06920ce 3f256228", + "3f278aba 3e890cf0 3eb4ddc0 3eedcebe 3f4f7470 3f981f9e 3f8482a0 -> 3e9e0a0f 3ea21866 3ee8829d", + "be5993b6 3f8bc49f 3f41d20e 3f1f533e 3f1983ee bd8ed3fe 3f745fd6 -> 3f6fe280 404e60ff 3f1db6f5", + "3e9bfbf4 3d8d17f0 3f8336b8 3f9cefdd 3f02c498 3e936228 3f402c56 -> 3db64245 3fe61c0a 3facd11a", + "3e4902dc 3f2ef39e 3e0c2ffa 3e7fa628 be470dda 3f2c47e2 be68ae0a -> be104098 3e198f60 bc763970", + "bcb56850 3e90ee7a 3f0c6969 3ebc19a4 3e6276b0 3f74501c 3f875434 -> 3e85a0ff 3f0c4355 3ebc5364", + "3f9f4cd4 3eb87328 3f788df6 3ec5e11a 3f88fe03 be5808a0 3f9db93b -> 3ea961c0 c0bee0c2 3e97782a", + "3de4e978 be60ee9a be5895c2 3f811fc7 be09944a 3efad982 3e7a617e -> bc4a9d60 be71c99b 3fadb7ba", + "3f8c9671 3f89db88 3f28a187 3f8a44d0 3f3d0f4d bc995a20 3dbfbc14 -> 3fbf7802 c21ada9c 414911a4", + "3f721922 bd09d1e0 bd1022b4 3f4137e6 3e87eeb8 3f819861 3f8dba60 -> bdf9339e bd0e752b 3f2f84eb", + "3f141800 bd2975a8 3ba33580 3e039908 3e675590 3f92dbb7 3f0b8b3e -> bdfcae56 3b9715c5 3e432160", + "3f8e4647 be48821b 3f16ef2d 3f30c891 3e7eccf0 3f44b9e0 be3f156a -> bf5a53ed 3f497b8c c0861768", + "3f343f06 3dc98b7c 3efb53f8 3f9850ce bd8926fe 3f473c1e 3ed1bbca -> bf80b545 3f16df76 40196fe2", + "3ee20078 3f91e3f1 3f098334 3f3b8e5e 3f391aec 3f36b0e5 bcd3f370 -> 3faa8df2 3f21de9b c141711f", + "3cce7300 3f419020 3f61b8a6 3f0e04aa 3cd9a2c0 be00092b 3f6663e2 -> 3fba263e 3f2e89a9 3f0e6a83", + "3fa19278 3f844a12 3f21594c 3f63c58a 3f17b554 3f730d22 3f9ebc20 -> 3ff71581 3f2c3308 3f2c1a38", + "3f993a65 be39369c 3e0f0434 3e757040 3eecf69e 3cf79ba0 bd8ce356 -> bedd4708 40b02039 c086facb", + "3fa9764d 3f3953d9 3f50964a 3da8e1e0 bc816b90 3ee52db6 be16b8b1 -> c2739add 40095836 bf44b81e", + "bd994d30 3f37c336 3f2557e3 3f40ba78 3e3c1a22 3ea455b2 3f1092b8 -> 3ef54564 3f0b28cc 3f359c03", + "3e6c51d8 3f753688 bde9e0c6 bce33b30 3f24bc2b 3e275b0c 3f54d390 -> 3f8a484a be7f143c bcedde85", + "3e81a372 3f8e2858 3d4dc130 3f1725ce 3f8a177e 3ed6cb4c 3f2ee896 -> 3f8b86f2 3d8aeb8d 3f28e40a", + "3fa163b1 3e17089c 3e78c938 3c27e780 3edde810 be540cc4 3e8d4a7e -> 3ec7fd83 bfc5760c 3d34d6ba", + "beea09ea be3b768e 3e63a1b4 be549e36 3f2d66da 3f4c1210 3f40baf0 -> be12a52b 3e49275a be34b66d", + "bda1f614 3f9e00b4 bde7a76e 3e22bb2e 3ec1c492 3ed9cb0c 3ef3107c -> 3f897b36 bdcee818 3e147e00", + "bc9607b0 3b7d2600 3c8ebd40 3f88df92 3f8ef30e 3eb32008 3f0d9428 -> 3b7da220 3c89e19c 3f86d8f1", + "3f7c0434 3f03ba38 3f3df670 3e1f169c be633b2c 3ed6d27c 3e7e2cec -> c011954a 3fe054a8 3f1e5b18", + "3e85582a 3e1c9650 3efc35b2 3f800940 3e8e5c14 3d1ed798 3e882620 -> 3e833d06 406b0a39 3fdc16df", + "3f82b81c 3f69db7a bd8f9260 3f9baaa8 3f1dc4b4 be2f9d7c ba4e8e00 -> 3fbf4760 3ed67f72 c4c50835", + "3faadf85 bdb177fc 3e39dc04 3ee69966 3f9f4010 bd29fa88 3f3599b8 -> bd82fa90 c0bcc86c 3f325bb9", + "be9df2aa bcc87380 3e4381e8 3f110ded 3f316ccb 3f791116 3e2ce482 -> bcad10c9 3e41d41a be967582", + "3f11e032 3f3af1fe 3f6312ca 3f2635a6 3e02a344 3e825f6c 3f7ecfde -> 4064db1a 40177538 3f26a6b1", + "3f71251c 3f24f039 3ed13896 be192f03 3e0be032 bd28ad20 3ef0cf50 -> 408f5f6b c1152cd5 be9dd75c", + "3e930476 be265f26 3f8d34ea 3e8042ce 3e8aeec6 3e9b8f98 3f7cb3e0 -> be93537d 3fea1c97 3e80bdd4", + "3e9a6de8 3e9efedc 3f7478f4 be5d3bac 3e582398 3f49f184 3e34f03e -> 3f291ed9 3f841af9 bf050953", + "be86e780 3d53a5f0 3e3c124c 3f55c13e 3ea1b8c6 be1c9842 3db56028 -> 3cb5b9aa 3f0c6aba bfb6efd8", + "be82e6b6 3e95f5d2 3ea23f56 3e746f88 3f52e8ec 3e81f8fc 3d373738 -> 3e8dc37e 3da149c0 bf884648", + "3f06810a 3f82ed5c 3eb330e8 3f5b8814 3f9ff595 bc337c00 3f4da354 -> 3f6a5dca c184f498 3f77c7a4", + "bea1ca31 3eaced4e 3d876438 3e2fd59c 3ed69296 3edd0a84 bd481118 -> 3e425d76 3d1e26af 3fab1e47", + "3d7436b0 3f974ceb 3f1d8490 3f954ff6 3f373e33 3f1193ce 3f2772a5 -> 3f9ae1da 3f24a439 3f9a052d", + "3e948f9c bccd08f0 3e87e600 3f890dd5 be0d9307 3e06ee88 3e20e0c2 -> 3d0e61d4 3f45dbc6 402f3452", + "3f6491bc 3f094a28 be73e9ec 3f328e78 be4cd2ca 3f31406c 3f8a8438 -> c0158748 beaa5560 3f2673e4", + "3f0cdba0 3eb5c100 3e34a408 3e5876f0 3f0cbf73 3f1f98bc be57abf6 -> 3f03d274 3e70adbc beea124a", + "3f8f2d25 be079fd1 3ed397ae 3f92c98c 3f2a54ae bde6974a 3f81bb76 -> be53ece2 c084f2ad 3f90984c", + "3ea102dc 3f739b1c 3ea4f7ee be11551d 3f6f68b0 3f2400cf bd96a89c -> 3f78ea32 3ec211c8 3f02696a", + "3f65aea8 be296a33 3f84b634 3f91a7f6 3f8dbb37 3ecad648 3eafcdc0 -> be1ab057 401d18fb 4045c845", + "3f9e1daa 3d5e7020 3f3966f0 3ebcfbfa 3f7d44d6 3df3b3f8 3f61cdd8 -> 3d6166a8 40eb208e 3edc33d5", + "3f1a4c72 3e416e38 3f34822e bdac0a04 3f98fd8a 3f1d5da2 3f20f223 -> 3e2e62fb 3f78b37c bde947a7", + "beb6ab88 3f8d1394 3f964449 3ee48d20 bbb8ba40 3ec9828a 3e3c30ec -> 428e7ef5 3f07524e be85995c", + "3f723ebc 3f30898e 3f16e3c0 3deb14f0 be4b0190 3f67dd82 3f7d61ba -> c05049ee 3f25c075 3ded6164", + "3e469048 3ec77934 3ea59ba2 3f314906 bcba4d10 3f322e22 3f94cb9d -> c04080fc 3eb3a21b 3f2c7b12", + "3fa020b1 3f7064e8 3f07151a 3f6d0fd8 3f825b4c bdf2b766 3f8453de -> 3f6af51a c0b67979 3f635cf8", + "3f0454bc 3f5df9c8 3f9895fd 3f7d6d9c be657348 3f0c38ca 3f30c351 -> bfca6c90 3fd9b5f6 3f9c1371", + "be42b3ca 3f8e71ec 3ee212b8 3f5ce7e2 be7d5884 bdb92adc bd0828ec -> 400b803a 3fba1f2e 40bece5e", + "3f272744 bdebe680 3b8db000 3f70053a 3eed31f8 3f923610 3d67e490 -> be4f2d27 3b822a1f 413237dd", + "3f9dbf4e 3e06d176 3ef26b74 3f77cd7c 3f9597c0 3f375ae9 3d34ea30 -> 3dddabc5 3f3464bf 41d6451f", + "be90a4a7 3ecae6ee 3f4536b8 3e675fd0 3e863064 3eccc8fe 3d937c00 -> 3da60e20 3ee343d4 bf18bb73", + "3fa1b52f 3f25b7c6 3ebfea02 be658e47 3ddd25c8 3d49e690 3d1bcc38 -> 40ece5d0 41182142 c0ec5fe6", + "3f092104 3f90e23a 3f8a3091 bccf88e8 3f09537e 3f7219c8 3e4b4e5a -> 3fd3f372 3f8e7080 bda412aa", + "3f67d7a0 3e8bf376 3f9e854f 3e9c3b38 bc30c2e0 3f3a2974 3f36a098 -> c1b75aed 3fd460a3 3ed51372", + "3ef60e70 3eefec7e be697f7b be123144 3f8a6ef0 3ecae95c be390fde -> 3ee73bd8 beca370f 3e9c687e", + "3ee92baa 3f6bd2a4 3ec61fde 3f3d91ae 3f427626 3f9286f9 3f4acdae -> 3f86e78e 3ebab741 3f5436e5", + "3ef773c6 3f61265e 3f6968cc 3dd7a214 3f57cdb6 be6cf9eb 3e8b8c64 -> 3f756b1c bfb76d4e 3e76e478", + "3e2a54d8 3f24d497 3f3e49c3 3ec3b802 3f82a090 3f8c3d86 3eb7c114 -> 3f24476d 3f3b8686 3efddfc2", + "beac10b4 3f482c1a 3f95dd2c 3cbb67a0 3f6c3b0c 3f1bcee8 3eac94b8 -> 3f428ae7 3f6af487 3bfe2920", + "be85fbee 3eb4a9c0 3f959460 3e8d8db2 3f6729bc bcffe8b0 be425e74 -> 3eaf955d 413437f7 3f3ae003", + "be604b9e 3ee2a268 3ef7e416 3f836eac 3f8685ec 3f2805e8 3d88b270 -> 3ee50aa5 3edb75f1 c0078be2", + "3f3119d0 3d9d0e90 bd4d6a70 3ecade7e 3f3567ee 3e43699c bc6a9f70 -> 3dc9bc08 be49fe75 c19827ba" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_diff(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3fa21670 3e8eacbe 3f3997ae be418d00 3f0cf9a2 3f35db7f 3eafed46 -> 3e8a5ec7 be32c800 3f398c82", + "bea0ee93 3eeeab2c 3eef6ce2 3f8b1d8d 3e927e14 3e520d48 3e9e13c8 -> 3f0e5b6a 3f0837f3 3f978983", + "3e4f07f8 3f7e400c 3f8a16b5 3f9851fd 3f866065 3e59773c 3d1fe160 -> 3f4dc742 3f8497c4 3f974f65", + "be6d4342 3c15ede0 3f1afea8 3f9c1aa5 3e41d48c 3d2ca3c0 3ef54cc0 -> bcf9954e 3f1d7eac 3faa502d", + "3ee170c0 3f789100 3f606bfc bd12ce30 3e2bd202 3dcfa6cc 3dd4fefc -> 3f65a718 3f54fe2b 3d2a0b9c", + "becd5952 3e464442 3e5ca864 3dd180c8 3f02253c 3f3771c0 be36d2da -> 3e1483a5 3dceb812 3cfb6898", + "3fbbfd14 be6f1196 3f98511f 3f03ccce 3e4e0a5c 3f810636 3df00eec -> 3f3f706a be94b438 3eaf7580", + "3e8e5a0e 3df7df78 3ee99688 3f68a724 3f9d3e4c 3f992bb6 3f5f9e44 -> 3eca6251 3f09058f 3f2a7aea", + "be10072e be059be6 be226228 3de423f4 3ed62286 3f8ea822 3f2f1c40 -> be676e54 beb84a98 3d3e8f52", + "3f53b0ca 3f574a74 3f5f67fe be06d5db be15c61e bd395fc0 3e4f4bf4 -> 3f7640e3 3f68fc9d 3e81c9d6", + "3f10e950 3f1d0350 3f5673e2 3e95371e 3f3eec10 bd04d33c bccf0730 -> 3eaea85b 3f5b26e0 3e9c8a2a", + "be34bf66 3f2a5c68 3ee8d0fa 3f9e7946 3e917ba4 3de52418 be035df6 -> 3f37335f 3ef2ed85 3f9b9344", + "3f221c16 3e2e82e4 3e9c57f2 3e41dfa4 3e1e75b4 3ef60338 3f86ffed -> 3d94560b 3e643eb9 3f1e0f0a", + "bd8aff94 3dfe1518 3f9ed5cd be23b01e 3f5a217c 3ec65e12 3e6cdc18 -> 3daa2288 3fa23373 be49fb98", + "3d8a0c50 3d89d210 3ecb0488 3dc7a0f4 3f4da268 3f951770 3f845965 -> 3de62108 3ed7d8e2 3e1dba3c", + "3f57f628 3f5e5762 3ebc172a 3e6e4222 3f7aa4a0 3f26167e be6475d6 -> 3e6a9928 3e96f7b9 3ed77e63", + "3ee0a1a4 3f22fef9 3dfc8f90 bded6472 3f40abc0 3f0ff3be bdd683c4 -> 3ed101d8 3e860cc9 bd766812", + "3ec9c49a 3ea27808 3f6dd2a0 3f72f10c 3f396868 3ecba646 3e66dbc6 -> 3eb48c61 3f45b223 3f5c3291", + "3e1c03a4 3f58c848 3e4e1e58 3f92654a 3f5483c4 3f7e50c0 3f88957a -> 3f386774 3e95263a 3f7b2c10", + "3e985b14 be44671c 3f63fe6e 3f3b1b6c 3e49d68c 3db3adc8 3f8bce39 -> bc9ba350 3f5d4f7c 3f1ef4c2", + "3f11b71e 3f981032 3f9a73b0 3ed9f19a 3f8a7590 3f838ea8 3f5ebb6c -> 3f128122 3f1f2391 3edf6514", + "3f5104e2 3f5e19a8 3f9a6044 be1a290c 3f899da5 3db03bf4 3f80a3b6 -> 3ea847e4 3f9161ff 3f6a752f", + "3f955429 3f37afa3 3ecc0626 be2f1806 3f045bbc 3f0efbd8 3e896fde -> 3dea2ea0 3df66790 3f0a87d4", + "bef12d0f bdabe006 3ead8bec bdcef918 3f67c5bc bd2486b4 be139629 -> bf16e67f 3ea3dbf0 be2d01b8", + "3f1acbaa 3ef72708 3ece700e 3e9c6c3a 3e65f818 3d593158 3f8f3031 -> 3eb19fee 3ebe057f 3f1cca60", + "3ead9f00 3f78eb40 3e8bf07c 3f647d4a 3f1eb5d4 3f1afb84 3f407d04 -> 3f431986 3e962448 3f233746", + "3fbc746b 3e7b1c3e 3f85aa6b 3f80a43d 3f284943 be4071de 3f1923ea -> 3efb6194 3fa91534 3dfe8390", + "3e933c3a 3e77ed6a 3f26e16d 3f6e19e8 3f4779e0 3f12e482 3f07ba3c -> 3ea764cb 3ef94714 3f4711f8", + "3f9912ee 3f1e216a 3e8dafe0 bd96d4f2 3f5165bc 3f43a0f8 bdbaa8b6 -> 3df2aaac 3f075a19 3d10c8a4", + "3c576100 3f0d8880 3f4b3fa0 3f19bd44 be5e2e5d 3f917385 3ebdc53c -> 3f0e436d 3f49ba9d 3f187df3", + "3f9482ed bdffa95c 3e3ef2d0 3f92d2f4 3f9a002a 3f443aea be547e16 -> 3fc7c74b 3f24a382 3fb1a459", + "3f87d34b 3f0b7122 3e136190 bb038580 bdd15f9e 3f01f68c bc477560 -> 3f2736b1 3ec11dba 3c32c5ac", + "be377f22 3f802b4e 3f201c36 3f320426 3f3aae94 3ead4c4c 3f1b7f3b -> 3f90e53e 3f2fa329 3f4de171", + "bcde5c80 3f9f9027 3f3757e8 3f86a80c 3f8bad47 3f17d21c 3f58287e -> 3fa35abd 3f3b76e0 3f899711", + "3f8b7f0a 39a9a800 3e1e2cd0 3f1fd4da bd981c10 bcb7d680 3f187232 -> 3da66f19 3e3737fc bcc9cec0", + "bc2fd340 3e5c92e0 3f8439fe 3f53798c 3f8754cc 3ef9b384 be18822d -> 3e55b07f 3f84e57e 3f5310cd", + "bece29e7 bdf003a0 3f96d474 3f2b91af 3bd53580 3f95e45f bdd89034 -> be5b55ba 3fd32f9b 3f20ab37", + "3f66ed32 bda6e4b2 3f93dc8f 3e9b8baa 3f0c40e4 3f81b1b1 3f23fa8e -> 3f0f4ab0 3e76f5f8 3eaac28c", + "bea83945 3f3864cc be1ea8be be0d68e7 bd9cb988 3e4adff6 3f9d3f30 -> 3f31f4ff bea4c993 bf21e9fd", + "3e673f94 3f9ea698 3f1fa7a0 3f9c6bc7 3e8f6a80 3f246ff9 3f8fd3d2 -> 3f968dcc 3ef95c48 3f77e1a0", + "3f0c4284 3f57a838 3f8f454c 3f6c04fc 3f8ce632 3f019fc6 3d0198b8 -> 3f05bd28 3f57858a 3f6794e9", + "3fa8c082 3f49af00 3e06f9a4 3f55b022 3f2c095c 3f333a83 bddf9ab0 -> bdc90030 3f350f6f 3f7a898c", + "bec825e2 3e7f4856 3d907820 3f20bb99 3e5b77a8 3f9a3bd2 bc3e8010 -> 3eaa89a8 beb0d047 3f1f91b9", + "3f53aa90 3f701e2c 3f36d3c6 3f6240c8 3d221c48 be027bb0 3f47545e -> 3f67bd97 3f51cc7e 3e75c5c0", + "be9e245f 3e9c028e 3f32ba20 3f79f52c 3e8eb18c 3ca8cab0 3c800050 -> 3ec8157b 3f345b34 3f7b3175", + "3e894882 be5b45e7 3f21c0da 3f327480 3e838738 3eb7c206 3c727100 -> bcf93628 3f091e22 3f31707a", + "3fb47932 3f769768 3e8deb48 3f005f72 3f3f7d7a 3f8b38db 3e59a882 -> bdbb32d0 3f83b9fa 3e4e9aba", + "3f51f978 3e9b3138 3eb037ea be3ca2a6 3f2ff856 3f62a1a4 3f8538fc -> 3ebd46d6 3f017566 3f78be56", + "3fafb15d 3e1edb4c be58ef36 3f4faaa0 3ec47d66 3f00c52e 3f786e66 -> 3e83156b 3f87b304 bdab6218", + "3e139e88 3f2f044a 3f8ddd7c 3e12c25c 3edbe85c 3f900654 3f41769a -> 3f1f2a77 3f737359 3e580106", + "3df17b48 3f304e2a 3f97238c 3f9a8d27 3f1896a0 3f9c9e1e 3f500a20 -> 3f1e5041 3f85f6c5 3f8e494c", + "3fbbaf2e 3e3f788a 3e07855c 3f0aa44a 3d0ef5d0 3ea1d47a 3ece6e84 -> 3e0b10d9 3e54ac8b bd4b3b30", + "befee8e4 3dd4f160 3f691dd4 3f576070 3ec54964 3e66382e 3ed7e248 -> 3c8057fc 3f82e2bd 3f868f15", + "3f80fa78 3f17fca8 3f9164f0 3f8fc274 3f8d8dea 3e96b6ba 3f330812 -> 3f02f658 3f56db0e 3ed63d04", + "be0244b4 3ed67558 3ddd76d8 3d8c4a68 3f9b3288 3f34f386 3e8daf16 -> 3ebe0c9b 3d3b4e91 3d4fc660", + "3f7c6342 3ed3a9b6 be110bde be227928 3f696568 bcb30510 3f9701a3 -> 3efe8417 3dedc858 3fa89c95", + "3fba9075 3f67e2dc 3ca0cab0 3dca7aac bd812876 3ea26e48 3e6d143c -> 3f7f6aee 3ed980bc 3e17ab88", + "3e8bbaf8 bd562dd0 3f0d5027 be52c212 3f267e9c 3dac2bac 3f152bdc -> 3e1d6f0f 3f077090 3d863d80", + "bebf26a4 be520b1c be29aa6d 3f3d7aca 3f2de0df be0bf7c9 3f71f3a8 -> bf1ca2c8 be7418b0 3f70a158", + "3f986cf9 be673612 3e646bf6 3d94526c 3f5bf6b6 bdfd024e 3e0c78e0 -> 3faae69f 3ebd8883 3d81a062", + "3f8b30e1 3f4d60cc 3f3ffeba 3f393f4a bb59cc00 3efbdbbc 3f699f04 -> 3f4e4da3 3e5c3950 3e11a0fc", + "3f8abbdd 3f5dc38c 3f463594 3f6b40e4 3f9d121c 3e5f0c0a 3f732d02 -> 3ea30e1a 3f09c57f bd324280", + "3e034834 3f4e5eb4 3cc73a20 3e9fcce8 3ebedc22 3f71abb0 3f44f8f0 -> 3f4222a5 3e0e739a 3ea954ea", + "3ea63f06 be676172 3eb3cdd6 bc8f6ee0 be0a68d8 bc7c1810 bd4cac60 -> bdfc20a6 3eb65cac baa84b70", + "3f812040 3f85f5ac be64ebe1 3ea7c876 3e435db8 be1f64a4 3f239ccc -> 3f5aa5ed 3d904eaa 3e9f5e59", + "3eb8a0e6 3f86a8b7 3ea42064 3eceb0d0 3f579798 3f6b8cd8 3e20dedc -> 3f3f9333 3ed7a33b 3eb1af7e", + "3d926740 3e9ebfa2 3f891cf4 3f33bca6 3f653f0c 3f9f6353 3f0c05ec -> 3ea8d3e8 3f80e75e 3f29ba2b", + "3dfe2850 bd51ed38 3f8151ec 3e722298 3e3ad018 3f1e2548 3ea4e35e -> bc822d58 3f6f039b 3e5ef65f", + "3f5ef6e0 3e185f3c 3efb7584 bdf1fcb0 3e83bc7c 3f3669c9 be465a54 -> 3de8da54 3e833000 3d4f0d14", + "3fa13acd 3f3f708c 3eaeb952 3f494cca 3dfce160 3d790360 3f89b09a -> 3f179f97 3e87843e 3e2435c0", + "3f9608da 3f7429a0 3f944706 3f47d67a be67849f 3eb98270 bd7620bc -> 3f9c00be 3f3bd534 3f59de70", + "3f490a6e 3f07ad03 3f07c7e4 3e609afc bc2dc170 3f272f4e 3ed3b930 -> 3f09ced3 3e573f8e 3e4c5f5d", + "3f76b83a 3c8425c0 be2291ac be77725e 3ef4031c 3d8958e8 3f5e032e -> 3ee38186 3e58f768 3f87ab9c", + "3f344cd2 3f8a2ab8 3e8b2ffc 3eab72b4 bd2dcf18 3dce7260 3eb7c2f4 -> 3f8dfe06 3e4dacc8 3ded7ae6", + "3f6a945c 3ef5ba7c 3f9537ed 3f05a2df 3f6f3670 3f38a4b9 3eed8d00 -> 3ee9c989 3f013e47 3dc664c4", + "3e23d2f0 3f8d0ae7 3f34b22c 3e2254b6 3bb20840 3e074eec be3e3aa8 -> 3f8cee6c 3f2f48c0 3e40c3bc", + "3f7de3ba 3f9af96f 3f6999ac 3c92a880 be431610 3f248cd3 bce63f10 -> 3fb328ba 3e8cd03e 3d3b80d2", + "3ef37e50 3e800228 3f472962 3f659a9e 3f9f328d bd2a1fa8 3dce9d48 -> 3f1a8c02 3f4c37e2 3f59524a", + "3faa8d75 3f22f60e 3e48747c 3f887de5 3c3cbb00 3f54bc78 3f936c47 -> 3f1f082a 3f48066a be767bc0", + "beddd5f4 3f1d5809 3f7283e0 3e9c2514 3f97454a 3f998b0c 3eb4a53e -> 3f229b4b 3f9fce86 3ed52ec6", + "3d564800 3ec552d0 3f598e3a 3e6275f4 3f97abb1 3f4d91d8 3f846769 -> 3ed06a84 3f4ecd1e 3e811701", + "3fa9970c 3f1bfe52 3d8920ac bdd0bb6c 3f35417a 3e0c4dcc 3da4ff38 -> bd89b888 3d918b54 3e8cbef3", + "be46146e 3e0d19e2 3f600842 3f70d158 3f0346b3 3de796c0 3ebdc6bc -> 3dbc3aba 3f65a1cb 3f81961a", + "3df6a800 3e852a1c 3eaf32c8 3f9f3892 3f0d1742 bdb339c0 3f519b08 -> 3e8712e2 3eb49841 3f92994a", + "3e96f238 3f9b8ae6 3f7682ba bdfa80c4 3f3176bb 3f5e7b68 3d8a1fec -> 3f816207 3f34eb52 bcf84e68", + "3fa8e51d 3f96cd94 3ed9fa40 be43c925 3ecf985c 3ea209ac be7a398d -> 3f24a561 3c057080 3e066247", + "beed6b62 bdf837b2 3f6b1338 3f0db172 3ee3520c 3f5238a6 3f88f9cd -> bee10400 3fa64744 3f121170", + "3e0b0854 be361188 3f1d4134 3ed687c2 3f562340 3f9db7a0 3f9975d0 -> bc82a5a0 3f1d615c 3eef9e60", + "beaa7463 3e83e9ae 3e68b164 3ec48042 3f23f910 bd0cc348 3f05c7bd -> 3e5d21c7 3e5cfa2e 3eee434e", + "3f31360a 3eb542b8 be6b1d54 be70d503 3f04980a be72905b 3dec2400 -> 3e63c44f bd8668a2 3e2e5297", + "3de72360 3e4c2c84 3f61c3a0 be1215ea 3f85f700 3ebae382 3e40a014 -> 3e8b8568 3f5737ce bdb6be15", + "3c095680 3f2c862c 3ee17f64 be124714 3eaec042 3f7fa76e be05daec -> 3f2bcaac 3ee200d1 be10f286", + "3fadbc1e 3dca0c34 3f356c07 3f8da9bd 3f630c28 3df2c2e8 3f7d4350 -> 3f846f25 3f0c3c00 be71b6d8", + "3f3a3316 bd52f388 3f2ccd96 3f81e98f 3dce8858 3ef753be 3ec41e68 -> 3dc62d8c 3ea5b6f9 3f3c8081", + "3f5dca3e 3f65da8c 3f09e6b4 3f96887e 3f4edcbe 3f346f18 be6e6704 -> 3e4a8a40 3e5d1bc6 3fb059e6", + "3f7f40a6 3f7b7d92 3e9f92b8 3f851a9f 3f1dfd81 3f42c39c 3f7e7858 -> 3ebbec52 3ee5bfe4 3d47b1b0", + "3f71e8e4 3f84b654 3e8da3cc 3d498ee8 3e5e3176 3ece7cf0 3f404e58 -> 3f54eefb 3e0a2650 3f2a82c6", + "be235638 3e9f9948 bdbc45da 3f618be4 3f65038c 3ec08260 3f4a0500 -> 3e897443 be3994d2 3f80e299", + "be29737a bd309f5c 3dbd3b38 3f321cf6 3f90e3f0 3f870c68 3f1b4455 -> be7a949d bd5368f8 3f4bce80", + "3f99c7c0 3f936c80 bd8d1608 3f488364 3d338550 be1773e8 3ca53610 -> 3f8caf15 3dded3c2 3f424f81", + "3ea4b532 3e168aac be3b8710 3ca1d4b0 3f1b94c0 3f9f657c 3f8b1bd3 -> 3e7de21c 3eababc4 3eb69bf0", + "3d485810 3e17eec0 3f373a30 3f912257 be2e5266 3f61c0dc 3f04f7d9 -> 3e207585 3f305866 3f8de1dc", + "3e902516 3ec2dedc 3d385188 3f94ec98 3da16f48 3e6984f8 3f1f3624 -> 3eb7821d 3dabc11c 3f7d066e", + "3f5e0a0c bcfbc168 3dc0c240 3f3c35a0 3f74aacc 3e0cd008 3f876186 -> 3f59fd65 3d4d4c26 3ec1233b", + "3fac6270 3dc3a538 3f04158a bd9d5fbe 3e9a36e6 3ef64950 3f639be2 -> 3e79b6df be0709b0 3fa9ec7b", + "be8f9012 be229bdc 3f1c7d3e 3d16ecb0 3ec2ec70 3f73cd5c 3f8b6b1c -> beb58e1a 3f2fe2d0 be7dd934", + "3f9f5191 3f206d38 3f4fd848 3f86ae3d bd9d4058 be26ce0c 3ee13b70 -> 3f38e47c 3f81dfec 3f0130cc", + "3f07376c 3f916c14 3f5eaa32 3f9b8536 3f5fc1c8 3f25f38c 3f573c6a -> 3f2ca886 3f0702d6 3f455af8", + "be86a8c4 3f7905f4 3f08d906 3f66e9f6 3f5b96f6 be622d95 3e8da0f2 -> 3f99636c 3ef3f3ce 3f7989dd", + "bedbed3c bd4db5b8 3f75f0a4 3f474ff4 3e1a70c8 3f615bf6 3e2f8fbc -> be21f280 3fab5ef2 3f5a2a49", + "3e607774 3f2f07db 3f606a66 3f72b7b0 3f0693e2 3f485fec 3f778d2e -> 3f1187cf 3f347e0a 3f3e9275", + "3f1f9ba8 3f083ffe 3f6ed926 3f4852d8 3d4e7850 3ebc4aa6 3eba5430 -> 3f00345a 3f3426b9 3f0e3d0e", + "3de68558 3f656b58 bd2b6638 3f2d59aa 3f8a988e be4e8220 3f9e54a1 -> 3f50f92c bc9cd7f7 3f29f814", + "bc0ef940 be316f20 3ec509ac 3f45df40 3f6c58c0 3f1005c0 3f80b9a8 -> be3cc7d9 3ec5f68a 3f471431", + "3ece16dc 3f8cf3d2 3cc190e0 3f82dde1 3e53c21c 3c973920 bc959aa0 -> 3f824c40 3c84b224 3f83cec1", + "3dd35880 3f9f1fe6 3c8a5750 3dc96f2c 3f8ec9d0 3f8fd79e 3f15cbf8 -> 3f9063b0 3e0479ae 3e0dc381", + "3db2ea40 3f59ffe0 be05a386 3f0eaf72 3f294f48 3f94d330 3f57ea8a -> 3f4b355e bbc8e020 3f089e23", + "3e73dc3c 3f40a708 be1826dc 3ea2d62c 3f54fc7e 3e3ceab4 bda1e578 -> 3f179d9d bd0ac692 3eac79ae", + "3f2484d8 3e779644 bd993c76 3f5a3b22 bcf4ba80 3f9b0cef bdac9ea6 -> 3e859f8a 3f4cc07d 3f681909", + "3f3dcb24 3f28cc9e 3f814b8a 3f8bfb7f 3dcb5c50 3e075bb2 be78cf30 -> 3f15f40d 3f69808e 3fa30a4c", + "3f84c7b4 3f987b71 3ea8578c 3f9bcebe bd9a7e1c 3ecdba94 3f96c690 -> 3fa27fa3 3d81fc50 bb994300", + "3e08c1d0 3e87db6e bd0d031c 3c425e20 3f265f5f bdb3b9c6 be01c2e3 -> 3e900207 bcba0376 3cebd29c", + "bd0ff318 bd9f4e0e 3ee8a158 3f1ff408 3f8abf8e be41c098 3f586caa -> bdf8854c 3ee539c3 3f23970b", + "3f55cda2 be2216dc 3efde586 3f653974 3f94caaf 3ed6bf9c 3f426d9c -> 3f89d91a 3e151734 3e85b028", + "be799948 3de00050 3f36b874 3e9fc77c 3f47cf74 3f561e54 3f268dbc -> bce1b540 3f5b9aef 3e9c7a0b", + "3f6a4034 3f45ca84 3eb39b36 3f284c42 3f842eb2 bbe4e6c0 3e06fd30 -> 3e9b717f 3eb6e107 3f096af0", + "3fbbfa91 3f9ad451 3f1731aa 3f11face 3f86488b be548c6f 3eaa2f80 -> bea98220 3f653afa 3da81c44", + "3ef73baa 3e9c8cd0 3e600bd4 3e87d8dc 3d923898 3e257e28 bdc97558 -> 3e8ae5fa 3e10222e 3ea02ac2", + "3fa65310 3f8a9c81 3d932030 3c46b7c0 3f9dbebe 3e2c7e0c 3d071148 -> be051cb8 3dd50c8e 3cc028be", + "be958632 3f00775a 3f7325bc 3f8f47f4 3ea6d4e4 3ef20316 3f099074 -> 3f18d3b1 3f8b3e33 3fa35e40", + "3ebb749e be15f3bb 3f9bd3e4 be4b791d 3f88acd4 3eed5abc 3f466260 -> 3eb415d0 3f861a37 3e6c0d81", + "bea5d0f0 3f93e08d 3d99f53c be0beee3 3ec105d4 3e35576c 3f347ce4 -> 3fa38156 3d88389a bee830d6", + "3f9e7bc1 3e7ad5fc be5022c2 3eeb10c4 3ed97d96 3eff78d0 3f763390 -> 3e284346 3f6af970 3f03521a", + "3f8b0bab 3ced32a0 3eca62c6 3f866ff4 3f898b57 be1ac724 3f890516 -> 3f911150 3f0f39fa bd8cbb10", + "3ee32e18 3f640bee 3f336ae4 3ef24d4a 3f11db5a 3f85c3a6 be26556d -> 3f23540c 3f0ae760 3f0b9a1b", + "3dd2ce48 3e80b65a 3e5b2ad8 3e81dad8 3f72b22c 3ec0dde8 3f77aaf2 -> 3e982d75 3e55c0c4 3e9a1bc1", + "3fb3a546 3f9f92af bdcf4b46 3f1afa93 3f9ee4d4 3f13f431 3dd1a060 -> befdb9ec 3f7e78d9 3eec67ea", + "be214b72 3f672e6c 3ed20f0e 3f9355d4 3f9ca292 3f535ce4 3f35ba3a -> 3f7eaa62 3ed1a5e3 3fa1a5ca", + "3fa210fe 3f127665 3a83a200 3f9f217c 3ebabe4e 3f745834 3f2ca05d -> 3de1ec94 3f9a7d9c 3ec76230", + "be16e46e 3f1fd3c2 3f23dda2 3f8753c8 3ec39d1e 3f1e123e 3f19f64a -> 3f2e3d55 3f3b2891 3f92abbe", + "3fbee6e1 3f552c9a bd365098 3f3a0c9e be02ca35 3f9f444e 3f818ccc -> 3f82f84f 3ff8d4ae 3d8c2aa8", + "bdfd2870 3e7c6b2c 3e479554 3f8aa683 3f055a06 3f37d620 3e4dbdbc -> 3e78e31a 3e1e0707 3f8dd457", + "3fbde902 3d2635c8 3f127afe 3f189636 bcfab310 3ec160d4 3ec153b4 -> 3db01815 3c419fc0 3d12b730", + "3f894330 bd1771c0 3e8554e8 3eaaa60c 3f2c16c2 3d30a960 3f69c2be -> 3f43607c 3e5b4d4f 3f1900dd", + "3ea8d9a0 3f0238f5 3f4c5304 3f1bfb19 3f9af0fa 3f403dc0 3c59e220 -> 3f1286bc 3f0ced0b 3f1adbae", + "becffb27 3e51b244 3e327c20 3f8cfbd8 3f54d448 3f72a0a2 3f4ad548 -> 3d08f8f4 bd8d7c7c 3fb62e35", + "bd86d9a0 3f872e3e bdb85076 3f8c0291 bc5f7b60 3e64c3b8 3cdaf510 -> 3f8710d0 bdeeb664 3f8c3c3c", + "3e8e8112 be3a756d 3e584564 3e26909c bc278b00 bcd67200 3d83ac50 -> bdab28ca 3e5fbb5a 3e143d9e", + "3f28da48 3f71f084 3e12e660 3ee66d62 3f737e06 be1aa498 3f68f29a -> 3ea6c526 3e78e640 3ee9c088", + "3f93413a 3f259252 3e6547b6 3f0f7812 3f9bcc30 bd7f8198 3f956dd9 -> 3f0f1546 3e9761fc 3f1d2eaa", + "3fa3f9dd 3e176fd6 3f3e9e86 3ec6ac3e 3f2e0fc6 3f55d494 3f1a892f -> 3f23d7ce bdbeba68 3e2b2d46", + "3d2e5e00 3dcda410 3efa9bc8 3edf295e 3f88ecd4 3f22eb16 be587b2b -> 3e0cb297 3ef3247f 3ee3c4f8", + "3ed790d6 3eac8352 3e495bc8 3f788020 3f06f152 3f9978ff 3ee6bc38 -> 3e8ce072 3f092ee4 3f47ed78", + "3f035012 be606a40 3ecd81fe 3f90ab21 3f5949c8 3f90f156 3eacf384 -> 3ee1d0e0 3f1208dc 3f74fae8", + "3d3b8380 3f6fa404 3e911a20 3c9d3650 3d129078 3ddfdfb8 3efef336 -> 3f6f38a9 3e8e8a32 3d24c800", + "3f87af20 3f3772d4 3f832704 3f0f520c 3ec6efb8 3f35ec5a 3e59dd38 -> 3e9c04a6 3e8aebb4 3eab2b66", + "3f205002 3f676bb4 be7177f6 3f90d22f 3eecd788 3f5f1164 3e98170e -> 3f1d4357 3f1aedd2 3f720566", + "bdb1f8f0 be641412 3f56f7f4 3ee14e1e bc3a8600 3eeefb2c 3ea6f57c -> be855a52 3f615a35 3eefd061", + "bc2dd380 3dbeec38 3f01ffdc 3f8a62ff 3f73f1e6 3c81eda0 3f9fb11f -> 3dae44d3 3f020ae3 3f8ba0fe", + "3ec58150 bd33f2b0 3e2aabf0 3f48b0a0 3e8dde3c 3f0a679a 3f454fa0 -> 3dc65856 3e7c8eb0 3ef9274f", + "3f7e691c 3ed811d2 3e24b84a bde4345a 3e741690 bc464ca0 3f952006 -> 3e3d9109 3e310961 3fa248f0", + "3b225000 3ec63df8 3f9fd8f2 3e0b7814 3c345220 be564712 be1a19fd -> 3ec63a65 3f9fe9ed 3e0bd9c9", + "3f85c606 3f31951c 3f5442a4 be4fb382 3f647e60 bda00918 3f0d902a -> 3e34ca58 3f692ac5 3f4c8ed8", + "3ea98e20 3e889c5c 3f3a8c0f 3f2f85f6 3ee3b9dc 3e5c5444 bd8ea3e4 -> 3e7316b7 3f284e51 3f356d8c", + "3f438e7e 3f58f706 3dc79de8 bd841ad2 3da54e50 3f46bbe6 3ee103a8 -> 3f492e31 3f0aa462 3ebd514e", + "3f23ed6e 3edb93c0 3e9a5b34 3f800822 3e6a5b22 3ed27564 3f9ebe65 -> 3e908b0f 3e36e15c 3f036d7d", + "3f8dd45d 3f024df6 3f31e7fa 3f31209e bccbd9c8 3f92f45f 3f416774 -> 3f095cf7 3edaa129 bb8d1300", + "3f043a4a 3f166858 3f3c9d82 3f2270be 3ebcd17c bd040890 3e7ce624 -> 3ecb49ae 3f40e0aa 3f01c8ae", + "be960e0c 3f2ea204 3ee7e6fe 3f85945b 3f82e8de 3f7c1488 3f2dcede -> 3f4842e6 3edc1334 3f9f0c8b", + "3f62dff2 3f66be28 bd49ea18 3f9713bf 3e8764aa 3f28f7ac 3d5b6f60 -> 3f2abf80 3f1f7dfe 3f90fffd", + "be166ebc 3e8e2a14 3d402dc0 3ed3cf30 3f42c42a 3f101360 3f2ad6c2 -> 3e7d6b1e bcb403f4 3edfd8d5", + "3f96aacf be5d6faa 3f9f32ac 3e60eef0 3ea258a8 3ed9881c bd8406ca -> 3f2a8386 3f3e5e73 3e975180", + "be1d070a 3f1c563c 3f0d0be8 3f76410c 3f0efc70 bd6b7b58 3ee66eae -> 3f32436c 3f0aca23 3f83f609", + "3f94c53e 3f8c9d0d 3f9a73c6 3ee98a18 3f2d262a 3e9f5bda bdab4b5c -> 3e9ff652 3f584baa 3f0da7f0", + "3f7a1514 3efd0d34 3f42f920 3f75eedc 3e73c440 3ee760fe 3e7d81ee -> 3e85fc58 3ea3ea7b 3f38056b", + "bdb1dcc4 3ee1354a bceedb50 3f5ba494 3f27ac17 3f5462c8 3e16ea10 -> 3eeb33a9 bdd9a581 3f5eeb64", + "3f32a7e8 3eeb1c4c 3f12ecfc 3ee94ad2 3e9ea0f6 3efc9f6c 3f079948 -> 3e78d0ac 3e6b1adc 3e41df8e", + "bde65630 3f265576 bd0198e0 3f74b5e6 3eef5ec4 3f5a7fa0 3e8946c0 -> 3f33cb72 be09fc04 3f7c6e22", + "3ecf9d2a 3db8da78 3f9a9146 be2987f9 3acae700 3f00402e bdcc7cbc -> 3db7915d 3f80909e bd930118", + "3f0d7ca4 3e6db0e8 3f024ce0 be2f12f2 3f9c89c7 3f701eac 3f999db0 -> 3f26c558 3eedf63a 3f2e69e2", + "be8b6118 3ea90584 be158e18 3f93a82c 3eb9cb04 3d57cd30 3dc94f70 -> 3ed277c4 be75aac0 3f971500", + "3eb47536 3ec3f524 be7f8174 3deead78 3f88af1c 3f22fd4c 3f1127e4 -> 3efa8678 3e1a6400 3e6fdc20", + "3fa57618 3f0b12ac be7b1c24 3f82a0d7 3f5930e0 3f9d5e8e 3f61785e -> 3e711d32 3ffd300c bdf19c00", + "bd0ab8d8 3c59a660 3f460690 3ece8d48 3da114d8 bb35e480 be107e32 -> 3c3cbfb5 3f460067 3ecc1ae5", + "be49f5b8 be3d7f8f 3ec0d44c 3eac79d8 3f4e310c 3f145de8 be054eae -> bed574c0 3ed25e1d 3e9f5481", + "bd97387c be0ad820 3f86b2c6 be14d882 3f0d02cc bda43470 be574410 -> be48ff09 3f85f0c8 be24bd97", + "3f8e15d4 3f9a8174 3f77c854 3e3c1cf2 3f8ea170 3f154886 3f31ec57 -> bcf47dc0 3ea424d4 3f0c1fac", + "3f8ae65e 3f0113e8 3d6f9950 3dff1578 3f756190 3d8e1818 3f891e21 -> 3ee66e5b 3bdfddc0 3f8222d2", + "bd9ed3a0 3ea92bd2 3f0009b6 3d0c2e78 be473522 bc2da140 3e26281c -> 3ea1725a 3effa7b3 3cdcc31c", + "3e839be4 3f1fb57e 3f83cc61 3c4b4b20 be45826c 3ee4f71e 3f465e70 -> 3f2c66be 3f6a2b4a 3e5222be", + "3ecf6c8c bd42c95c 3f6a77d0 3d42e140 3f87a1d5 3f574962 3ec8bd30 -> 3ed72bfe 3f134000 3e2be4b6", + "bdbbd8a8 3f871f1f bcf81320 3e5b7ee8 3f2a0196 3ed3e83a 3e9390c0 -> 3f8eeb10 bd972444 3e68b0de", + "3f14baf0 3d8b8480 bd1a5c34 3f8c67bd 3e8535c8 3d470138 be7d25d1 -> 3e0f7c80 3d0c9dde 3f9eca14", + "3f60f014 3e9ab7ae 3f89037c 3efda028 3f9717fc 3f60a4f6 3ec78c90 -> 3f4eef64 3e9947ea 3e1c940e", + "3e8e23ca 3f9817c8 bda12f82 3f8751be bde9984a 3f95c6f4 3e8521b0 -> 3f9c2561 3e946670 3f7c28a9", + "3e7157f4 3ec9038e be312d96 3f930ef4 3ef4f342 3edbbb50 be751e1e -> 3ea3fe24 3c1ea3a0 3f9a47a1", + "3f0874e4 3e8f949e 3f88f196 3ec86244 3f53555e 3f8fe0d3 3f80e721 -> 3ed7cf4a 3f0749f4 3f02ccb9", + "3e76c4f0 3f513e86 3e2976c8 3f4c0480 3e182dec 3f45a7e4 3f6514a6 -> 3f481373 3e8b2875 3f20e462", + "3f844fb8 3f8c386b 3f4d5e00 3f9089d9 3f9b5236 be7d9ec0 3f791644 -> 3dae2e90 3f877435 3dfcccd0", + "3fa95f1e be4e6aa4 3ed0787e 3f0734a0 3efccc6c be6321dd 3c12ed80 -> 3f7c374f 3f335f1e 3f042af5", + "3f889f31 bdead2f0 3f9958c9 3f8410a1 3f5e926a 3f9eff0a 3c1718c0 -> 3f876f86 bd099300 3f82ce15", + "bef12696 be7f70d5 be158434 3dd6d4c8 3f8071a8 3f21f807 be63de07 -> bf75027f bf14e080 38b9a800", + "bbb4a440 3f80be2f 3c27bec0 3f7cc17c 3e17980e 3f1d7c33 3f26c8ea -> 3f80d8ed 3be4100f 3f7dacdd", + "3f101696 3e8cad36 be6bd72b 3f03d534 3eda8ab2 3d1a2340 3f2848fe -> 3e52a5a6 3d4d537c 3e9c4bfc", + "3e121a80 3ed34ddc 3f8e7e41 3da77944 3f8c450f 3f3f828a 3f215624 -> 3ee70fa0 3f80d4b8 3e17eb56", + "3f3e2130 3e5eb07e 3f81f19f 3f077910 3f47a9d0 3f22b843 3f60e60c -> 3ef28838 3f0b0964 3eca8c42", + "3fa588b2 3f32bf0c 3f463918 bd23ee30 3ebd4094 3f720dc6 3f3f1da4 -> 3e617d7a bbb89d00 3f83b4b8", + "bde0f598 3e167510 3f4a7324 3dc40194 3ed376ac 3f1b82cc 3e037764 -> 3e090e14 3f5b8818 3dd22f49", + "3f7b140a 3f96d3af 3e88981c 3e453448 3f745be0 3f1a1366 3f4a2c90 -> 3e77f8a4 3eaae29c 3f16e1be", + "3f1dfbd0 bc1763e0 be68523c 3f942c99 3f913abe 3ecb64b4 3f305824 -> 3f33cd9c 3e98baaa 3f3b85ae", + "3f0d15a8 3e7aeef6 3e5521aa 3f1e3c33 3f9d61f8 3f82f170 3f33c3e6 -> 3f270edd 3f0ae1bf 3ea5ca70", + "3f6f74be 3e7b4474 3e9c2830 be456bc2 3eaf28da 3f9495ad bd78401c -> 3dd9c700 3f51fa5a 3de3b478", + "be1521ca 3d944af0 3f9e377a 3edd9d8e bde0020c 3e80f096 3f8924ee -> 3d67567f 3fa2e94b 3ece45ef", + "3e601964 3eff2e5e 3db15ff4 3f89a6f8 be5d6c8d be251a12 3e83a05e -> 3f0bb47e 3df9a38c 3f827362", + "3ee2f6f6 3f404da8 3d567eb0 3ef8559a 3e98b6da be44ea04 3f4118bc -> 3f1e7478 3e0ce9f3 3ec75c94", + "3faf4104 3eaa5574 3f3a4400 3eddeecc 3f559fee 3f2d19f4 be5d221b -> 3f10708a be4af5a0 3f3aa8a3", + "3f3e7302 3f9b1bfb 3e0aa00a 3eb98ee4 3f30e80c 3f19b092 3ea4e664 -> 3f329c43 3ec2db26 3dfb8744", + "3fb210b7 be5a0e12 3ef314d8 3f7e75bc bdd62f8a 3f5e0e48 ba521400 -> 3e6fa6fa 3eb8951a 3f7ebecc", + "3f94c30a be038e50 3f4aee40 3f990f8a 3f6f2962 3e47ced8 3df3d790 -> 3fa0c199 3f10e058 3f87593d", + "3f5359f0 3b2c2d00 3f127a42 be531bfd 3f8d32ee 3edec684 3de94120 -> 3f68b50e 3e5a1142 3e69c1c9", + "3f93946e 3e8455ec 3f9febb0 3e9cbfa0 3f535e58 3f84c932 3f5b2e82 -> 3f1d4a48 3d5a54c0 3f165b8e", + "3f0c7ef6 3f99c1fe 3eed0cfe 3eaf79a0 3efa11d4 3f97ae7e 3f0a0389 -> 3f6ee51a 3f1aeb21 3e865b4e", + "3f4916e6 3f53dd80 3f3db510 3e1c8576 3e42dcda 3f014d42 bdc21842 -> 3f2d994b 3eb047ad 3e68c0aa", + "3deb4338 3f97aae0 3ef9b0a8 3f933b46 3e6c98f8 3f6a3c88 3f982966 -> 3f944526 3ef623be 3f82e280", + "3f8e5d31 3f502dc0 3ea31ce4 3f568232 bdad9580 bd2b4f18 bd922c96 -> 3f684fc7 3ebaedf3 3f6ad4af", + "3f5f175e 3ef36616 3ee02bd8 3ea3b770 3f8a3df2 3ec939f4 3e571558 -> 3f16880e 3dc33ff8 3e0bffa6", + "be8bbed6 3da33e14 3f1a6242 3e4881e4 3e852d72 3f547768 be6136e0 -> 3d55e923 3f34ab16 3e0b098d", + "3eccd1d0 3f8a6299 3f6417a4 3f29aea4 3f970b00 bd294d40 3f075058 -> 3f302dc7 3f685347 3ee71a5c", + "3e878de6 3f02ff0d 3ecfd28c 3eb07032 be02a88e 3f6adbb4 3f53d370 -> 3f0ba4f7 3ede235c 3ec32d25", + "3c8e5f40 bdd83f94 3f413aa0 3ea57734 3f7a11ee 3eb89238 3f97bfd3 -> bdadf699 3f3fa009 3eaa4375", + "bcf8eca0 3d59f230 3f8aa2d3 3eb876a6 be0d3ee2 3f71f7a2 3d275dd8 -> 3d48c741 3f8e4ff1 3eb91964", + "3f793d50 3f913b08 3f345612 3f9c47c2 be28eb82 3f945042 3e917a38 -> 3fa5c9b8 3eebf6d9 3f71be28", + "3f9245b4 3f2d76ce bd996394 bc722c20 3f9feff1 3f266a15 3e51f13e -> 3f0e8c6a 3f56d174 3e81af41", + "3fb9cd54 be5f4d63 3f9cd1cf 3f752608 3f39c146 3f21f1e6 3f84211a -> 3fbbf100 3e9d2070 bea5eda0", + "be8180c8 3f8c93d2 3f8fb26f 3f0884cc 3e60b92e be1f357b 3d9521d0 -> 3f93aeb8 3f8aa9ce 3f0d3bdd", + "3f5edd6a 3f8768fe 3d573518 3f88b2dc 3e86e714 3e7369e8 3f37e73a -> 3f541974 3e2c088e 3ee2984a", + "3f2b6150 3f739334 3ebf5128 be59bd0d 3f811d98 3e962ca8 3ecfdb5c -> 3eb4a622 3e35907c 3eb00c10", + "3ee958a8 3f146712 3db42254 3f7a320c 3f75df06 3f3b0358 3e0dd9d8 -> 3efa60de 3eae72fd 3f6a087f", + "be0d9d6c 3f8dd104 3f27154b 3ec5de04 3d802ddc 3e846754 3f2b7e48 -> 3f8eeca4 3f303d16 3ecd297d", + "bee72edb 3f54f134 3ee01572 3f5d96d4 3f8836f2 bd1e71e8 bd3bd80c -> 3f8d1da8 3ed72416 3f5849c1", + "3f7e3118 3f8fb01e 3e2b465c 3f3c6c58 3e263e6e 3f3c9516 3eac5604 -> 3f761bc7 3f110959 3ecdba4b", + "bd733650 3f19fb09 3f6b954c 3f778614 3db6dc90 3ec0a90c 3f37ee76 -> 3f1b567d 3f714d97 3f8138fd", + "3e440304 3f48e094 3f4e52c0 3f024f45 3eba5e94 3f9796e2 3f01b393 -> 3f370a41 3f395e82 3ed2f708", + "3fb7754d 3f265e06 3edced6c bd492318 3f9d5368 be4e5c38 3f173a8e -> 3f0c7318 3f3867f3 3f70372e", + "beae5001 3f97ceee 3e2fe7a4 3f98e6a6 3da7eb98 3e4eacb8 3f58dc6c -> 3f9b61a3 3e615110 3fbdd10c", + "3f46b3c8 3f95d95a bc0e9330 3f0c4f6b 3f9f3721 3f86a5ba 3f986c84 -> 3ea33c78 3f52407b 3f1f1d71", + "3e337aac 3f7b8000 3f2b68ee 3f9c9515 3f90ef92 3f99c7e8 3f448dde -> 3f5624f9 3f253ae9 3f8b5b69", + "bedfd3ae 3f61b7fa 3dda3c78 3ee67d34 3cdd63b0 3f328eec 3f6b74de -> 3f64be3e bdd76cfa 3ee2255b", + "3e05611c 3f7c5ae0 3f08fe8a 3e3ba32a 3f302c24 3f7ef074 bd2088b8 -> 3f65686f 3f068358 3e40dd69", + "3f387c3c 3eff36c4 3f82dc64 be788785 bd9ab542 3f8f8905 3f4fb9ba -> 3f0d8b0d 3eb6c2d4 3f311d6e", + "3f7c3d2c 3f108d0c 3f9affec 3ebd8210 bdf0ed84 3f10da8c 3f3188f4 -> 3f2e3978 3f274619 3ea5e9e8", + "3f873eaf 3f8186e4 bcb78b70 be1ce14e be1c9b7f 3f895658 be35ba7d -> 3f9635fa 3f944d9d 3d0c8984", + "bdc11698 be3d3699 3efd1d68 be47b6aa 3f411c42 3f96b3c6 3e701284 -> be94dbfe 3ef4025e be8200d2", + "be81c077 3f34c72a 3deb3508 3e9c843c be4693fe 3f7ae192 3f5749d2 -> 3f28326e bd9a358c 3e7d74f8", + "3e14c348 3f65b026 3f9ba606 3f7535cc be2e08e0 3f9a6a12 3e3b8af8 -> 3f6c0244 3f85373f 3f6e6616", + "bd9e361c 3e151ed8 be2e09ba bdd7b990 bdf25cfc bcc28290 3f0e242e -> 3e0bc24e be470c96 be28733c" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_exclusion(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3fbb88bb 3e9d75ca 3db108f0 3f175304 3f9621e1 bde4cf60 3eb8ee96 -> 3f7810a6 00000000 3efd46cd", + "3ed26d6c 3e8e5428 3f99e5e5 3ed71a2a 3f98d53e 3ea76a32 3f2dd60e -> 3efde449 3f81bc5f 3eedee10", + "3fa7d942 3f589938 be3e045a be31e2c2 3f55f8f8 3f8d1f90 3eddf2d4 -> 3db311c0 3fe5fc33 3f179c46", + "beb1b0fc 3c3de640 3e0e4784 be6e929f 3f8eec47 3f63aea4 3f9e5d7a -> 00000000 00000000 00000000", + "3f879c6d 3ed42244 3f9484c4 3f1f67e2 3f737ba0 3f6de074 bd1f544c -> 3f1644e0 00000000 3f21fe8e", + "3d0105b0 be62e9f6 3f76ef1c bdef4614 3f577b80 3e6b4a1c 3f867dca -> 00000000 3f75365e 00000000", + "3ea6bada be71fef8 3e93516c bde965a4 3f211f0a 3f410cb0 3e55942c -> 3d86255c 3ec8b21c 00000000", + "3f10e8a8 be70055f be39fa05 3e9776d0 3dfd6658 be0354ef 3f8df7bc -> 00000000 00000000 3f0d5c96", + "bdd7dcd4 3f99479f 3f12f7ac be46532e 3e7eddc4 3ebf78ae 3f437e64 -> 3f9df6cc 3f147676 00000000", + "3fa8bb4c be54f6f9 3f86129a bbe89280 3f25d4a6 3eef96a4 3f35b99e -> 3f80248f 3ebe7e6a 3f7122e9", + "3f6c6f9c 3dcc7e70 3f98b809 3f9f3ebd 3f1f6c9a 3f21fdd4 3f3ed78f -> 3f0f65f8 3ec41500 3e60bb58", + "be2d8384 3f8cf495 3f90c407 3e72e614 bdeaf06c 3f4755ea 3df5e12c -> 3f89f6b0 3fa6140c 3e67f326", + "3ebadbee 3f8bc404 3d9d63cc 3f13ced6 3f4eb5ae 3dd0da24 be16dc20 -> 3f3e38cc 3ddde598 3f15f020", + "bec8c49d 3e0fddc0 be314fdc 3eaf881c 3f8d8b18 3d17d308 3f016d1f -> 00000000 00000000 3e8fa05f", + "3fbb2955 3efb0708 3f925238 3f9da532 3d1415e0 3f3fab6c 3f7b5ac8 -> 3efb8d9f 00000000 00000000", + "3f86f491 bdff7498 3e9a7bde 3f404030 3efa59e0 3de8bf38 be4ed02c -> 3f04f83a 3eb2cfbc 3f5b9d29", + "bebe4520 3f316f9e 3f51b1b0 3de8abf8 3f58666c 3ec98480 3eee0cf2 -> 3f507eca 3f69979c 00000000", + "be6ec97a 3f3878ba 3f2a6004 3f8b8f7c 3ded8070 3f1b70a7 3f3c9d71 -> 3f3b869f 3f365ff7 3fa58645", + "3fb9103f 3f8ee204 3f26b96b 3f44566a 3eb10148 bc256400 3cd72ae0 -> 3f000d5c 3f27daca 3f3f25b7", + "3ea10f12 3f9e71ce 3e82de44 3f8cb04a be615608 3ec6c2ba 3f3ba39f -> 3fab8516 3ea16dfa 3f52a64e", + "3f8fa468 3f833745 3f89c753 3d8c45f8 3f9e81ae be480bf4 3f9e0819 -> 00000000 3faa20ba 3fa1d13e", + "3f435fc2 3e83f4b2 bcaa2e10 3c2bf0c0 3f64baf0 be566565 3f82c1e4 -> 3f168fc8 00000000 3f461493", + "3f98b1db 3e6911b2 bddea4a4 3f95c8a8 bdde29d6 bba15400 3f74d67c -> 3e20e0ca 00000000 00000000", + "be1e6340 3f668482 3f9df4e4 bdda9da6 be014a24 3f82c94f 3f3c406c -> 3f628370 3fbba7a6 00000000", + "3f461002 3ea0851c 3e8769d4 3f50bbee be7a7c78 3f7b62d8 3e6f0e76 -> 3e78c282 3f1f5226 3f3391e6", + "3f8c06ca 3f56d160 3f459638 3e02b2c0 3f0d73a3 3f408d40 3e862118 -> 3edbb93d 3ea62474 3eae9fe6", + "3f250cea 3ed815b8 3f01a6a8 3f33c5b4 bd4fc368 3e826b20 3f175ade -> 3ed57963 3f011bd5 3f0c4d89", + "3f58d440 3dea1db8 3f96e7a2 3f91b7dc 3e129014 3f836691 3f352938 -> 3e54d052 00000000 3ebf07d8", + "beaae540 3f8bd26e bd991c60 3f8eaaf3 3d06a658 3e7f3f10 3f9efde8 -> 3f8d7c64 00000000 3fcfe604", + "3fb67a87 3f76f9a6 3ee3e7a8 3f635a10 3d703cd0 3f09c02a be33fd98 -> 3f63143c 3f07811f 3f8a9261", + "3f2f4412 3ebd2a66 3f4ae4a0 3f16c722 3efc6030 3ee38be0 3f2683b4 -> 3eea465a 3f1d515c 3f027dba", + "3e0d337c 3ef48644 3ee1cd30 3f9654d7 3f045d0e bdd8d382 3f98f669 -> 3ef6292a 3ee0eb77 3f73c248", + "be70062e 3eabcb4c 3f6d4c36 3f5cbcdc 3f9a4adb 3f469a66 3f522028 -> 3e786b88 3f8a862a 3f80360e", + "3f94c857 3f18b9c4 3e86ad94 3e8a127c 3e817af6 3e8a2978 3f2a11e5 -> 3f0a307a 3ed2c938 3f201994", + "3f46c19e be4134b4 3f8835d2 3f91fffe 3f777566 3f045a42 be034f74 -> 3f58529b 3f1c7b14 3fa253e0", + "3f947458 3e0baa90 3e99512e 3f6673ec 3eaa0e64 be4569f1 3f657062 -> 3ed54336 3e56cc04 3d8bae90", + "3ea3af4a 3f3bf5dc 3f98561c 3f440d58 3dd751a0 be4fc406 3f7eb8f4 -> 3f37edfe 3fa3cbd9 3f18c1d6", + "3ead8aa6 3f44a79e be658b36 3dd370b4 3f8192e2 3e81c0e6 3f64468c -> 3f158aac 00000000 3eafa788", + "3f993cf4 3e8f1bae 3d8def20 bc2358b0 bd9a7658 3f9e38e8 3f456870 -> 3e75717d 3fac090b 3f6e7dd3", + "3ec6d626 3f207af4 be5d593b 3f4ce7a8 3f208b4c 3f896058 3e514150 -> 3f10a8cf 3ec2fc58 3f40b2d3", + "be701a9c 3ec1473e 3f9b2478 3f1f8e84 3f37f4e2 3f9657e4 3ec3958e -> 3eac246e 3fcd5847 3f2535b4", + "3fa8829b 3ea55520 3f40fbe8 bdd165c8 3e6416f4 3f6b58f2 3d9fe9c4 -> 3eda81cb 3e0ebed8 3cb0b3e8", + "3e65911c 3f84e738 3f4991e4 3f9a27d0 3c5e7420 3e6b9660 3f9c698b -> 3f847bd6 3f41fb13 3f5184d7", + "3fa79333 bca2a9a0 3f290150 3e2157f6 be37312e bdffc078 3f9968b7 -> 00000000 3f3669b3 3f9db7ea", + "beb6b840 3f940144 3f9b92d8 3f3a5ee8 bcd63610 3f0a68a0 3e3863ee -> 3f926fe6 3fbee950 3f41df6d", + "3cab5520 be3eaef8 3f3adf92 3d330e30 3ea86158 3e84f788 3f948bc3 -> 00000000 3f3a3bd9 3d86e3e6", + "3fb89785 3f10c1fd be2182a8 3f73ab78 3d88c6f4 3ee2d66e be01eb9e -> 3f0d87a0 3f2ec85b 3f8effbe", + "3f7390ae 3e7c5f2c 3f589806 3eba22f8 3f17db16 3e6df4f8 3dbcf1b0 -> 3f085b4a 3f316b45 3ec666be", + "3cf42760 3e9a8f42 3e5ce21c 3f25c12e 3f8653eb 3eddf2b2 3f80a480 -> 3ea0e7b9 3e6467d3 3f237e2b", + "3ec7156a 3f49d638 3ed6e8c0 ba912600 3e03c144 3f92f21f bdc7c646 -> 3f4272db 3efb9817 00000000", + "3f90fc20 be4536b3 3f691ebe 3f6f4924 3f9c34ea be4111c0 3f933cc2 -> 3fdc6f52 3f8b0283 00000000", + "3f383648 3f1161f9 3ee9550a 3f808d6b 3f2e9cb9 3f89a62a 3e899ccc -> 3f0051cc 3f0634fa 3f4f2a7e", + "3f368e50 3df46d48 3dea6b58 3f21733a 3d6eb620 be2614ea 3f9f2589 -> 3e1a9cae 3ccf1a68 3ecc44bc", + "3f59662c 3e874e18 3f256fb6 3f0788d8 3f89c136 bdc18bdc 3f0a3b3f -> 3f31f5a9 3f2b71fe 3f009fe9", + "3f99f284 3f2c2af7 3f33f40b 3f981446 3f0b86fb 3f9c3ef0 3f8e9929 -> 3ee4867a 3ddb4010 00000000", + "3daee500 3f97bca4 3f2dc858 3f1f7142 3e2f06b8 3e4492c4 3f3b9036 -> 3f952cf2 3f2c4812 3f1b8200", + "3f92991b 3f814700 3f64a658 3df058e0 3f1bad04 3ef8f538 3f80dea6 -> 3e9966f0 3ee917fc 3f7ff267", + "3ec8c17a 3d626f48 3f1e4434 be37ec46 3f87b4bc bdba1eda bd192718 -> 3ed99d15 3f206c66 00000000", + "3f640f0a 3c6bc240 3e1f0134 bdd8c4b0 3f93f686 3eb87c8a 3f633cf0 -> 3f81dca2 3ec0d019 3f5a3177", + "3fae24ac 3f805b3d 3f887924 bde75206 3f8d673a 3ecf3824 3e621510 -> 00000000 3ee2a5ca 3e82b3fe", + "3da0d968 3f2f8512 be77f825 3f9194da 3f655614 3e8575b8 3f83937c -> 3f28d538 00000000 3f84689e", + "3f0176b8 3f8064af 3e25f6ec 3e5f5598 3f2b53e8 3f487df4 3eb74670 -> 3f299c54 3edc08d1 3ea3ec5b", + "3ea56006 be2940a6 3f8f11d0 3f3c1d82 3f87e0de 3f66c4c4 3f255a30 -> 3e94f5f2 3f420ceb 3f23082d", + "3f87dc29 3e8c1018 3ef513b0 3e87a944 3f8a7336 3f8c29a3 3f8b5752 -> 3f4b2260 3f073be5 3f4ee040", + "befb1698 3f89da08 bca15470 3f40de90 be2c85da 3f093807 bc72f4e0 -> 3f7b4bbc 00000000 3f3fed08", + "3f28d7d8 3f1c423e bd89262c bdaf64e6 3f660148 3e3d1a58 3d1f23d0 -> 3ef58942 3d91b404 00000000", + "3e3a1e3c 3f9f2149 3f6d1204 3e72648c 3f53c050 3e8f3370 3f073300 -> 3f8286bd 3f61fb2c 3e931367", + "3f8759c2 3f996755 3ecdf07a be53cd24 3f40d74e 3f532b14 3f034a24 -> 3daf9cc0 3f12a286 3f0f4f12", + "3d4a6b40 3f07781e 3f1f5512 3f8837d5 3ed4cf2e 3f983c2a 3efe8308 -> 3f072991 3f1ba630 3f84ab80", + "3fb3638a bd8bbd0c 3f36f6d5 3f16755f bb3a1240 3dfb785c 3f7f6220 -> 00000000 3f240c16 3eaf5200", + "3eee7998 3f6f4864 3f120a20 bdb1fc60 3eeefc5c 3eb6cfe8 3ed1c926 -> 3f3ee533 3f0c0a14 3e0c6628", + "3e541d34 3f4d77d4 be631202 3b930d80 3f10b98d 3e9ef748 3db6871c -> 3f3b530c 00000000 3cbaa496", + "3fab4399 3f53fd20 3f35d1da 3ea80e78 3f760cf4 3f38ea08 3e54936c -> 00000000 3e9b946a 3ed8e932", + "bec88fae 3f0f8628 3dcd1dd4 3e6e66c8 3e7b3906 3f4ab0b8 3eaba0b8 -> 3f128202 00000000 3e268cb0", + "3f9fd178 bd1e4d10 3f6623c4 3f147a64 bdbeaa96 3f47d0e0 3e46642c -> 00000000 3df87700 3f0a921b", + "be17de92 3f8a770f 3f90a622 3d1591f0 3e5f0c7c be1669bc 3f90dbc6 -> 3f8f46b9 3f8d2296 00000000", + "3f915587 3f181992 3f4f498e 3f8cd705 3f20fcaf 3e21c280 be4f405a -> 3eeb5e6c 3f32d860 3fb027ec", + "3e9c1dfc be7b6c12 3c1b8900 3e9271f4 3f268503 3f0a3d46 3ec946f4 -> 3d4da2e8 3e2f201e 3eacb5a1", + "baa4b500 3e619994 3f6e26c2 bcea0260 3f50b73a be33af26 3ef0168c -> 3e610359 3f6e1a52 00000000", + "3f1f2632 3e045eee 3f2cabb8 3ed11dc0 3f47aac4 3f929bec 3f5d5f20 -> 3efa4233 3eda1bdc 3f01c318", + "3f94b4ac 3f548596 3d2ae1c8 3efc93a8 3f1e8478 3ea6da9c 3dd64ea0 -> 3eb5d515 3ec707ee 3efd68bb", + "3fba4864 3f0a5a2c 3ec3d74e 3f5dd192 3ec48032 3e9340e6 3eea5dea -> 3efd9365 3ef6338e 3ec1a372", + "be658998 3f23b5a0 3d341688 3f01a5aa bc1b19a0 3f867ac8 3f91e204 -> 3f238ed4 00000000 3f027d1d", + "3f260a4c bd4da7f8 be3d5b37 3f270be5 be62ba96 3ed3588c 3e0a8e98 -> 00000000 3e3a312b 3f203165", + "3df568f8 bdeb114c 3ee23e54 3f8ca8f5 3e86718e 3e3b4320 3f1b7c3c -> 00000000 3ee38c30 3f81805a", + "3d86a430 3f9be004 3f857793 be5ffdd3 bd13007c 3d1d9a60 3e21569a -> 3f9c4f01 3f851d9a 00000000", + "3f895d7b 3e987638 3eb5bcb4 3e39dc86 3f4973c4 be748eb8 3ec4cce2 -> 3f23ab31 3e8fab88 3ee37660", + "3f51d824 3ec2d4a0 3f93749b 3f0a172c be1ef6de 3f799b18 3e0a1d28 -> 3eb34352 3de0e200 3f07dbfc", + "3f2c801e bcbf62c0 3f8b9ef8 3f17331e 3f94e084 3f9c1317 3f406abe -> 3f4c078b 3df5b6e8 3eff664c", + "3ebf4b90 3f98663f 3f823fd4 be03e2b6 be14c158 3f8cd95c 3f842b68 -> 3fa1fecc 3f178cf4 3eb676e4", + "3f3a9ccc 3e80a486 3ef34a3e be64f17a 3f431bea 3f3b6e62 3f6e7b80 -> 3f0713bf 3f006dac 3f425786", + "3f849c43 3f35cad8 3e62530e 3e77765c 3ecd9fe8 3f801e9a 3f399fbc -> 3f090768 3f4cb3b2 3f213a32", + "3f56ef5e 3f0a35f4 3e9e757c 3e2bd9fa 3eea6b60 3e63d3c8 3f4b3f4e -> 3f025c4f 3ec2e662 3f1c54b6", + "3f93d214 3f99d89b 3ee19adc 3d50ef08 3d8d9bbc 3f27eae8 3e8c9fc4 -> 3f8b7f56 3f07d3a0 3eabf2d0", + "3e9e7c4e 3f165eb0 3d76fcf0 3f2ea41a bdb6b336 3f1a0fa3 be3a4df4 -> 3f179af6 3e657eeb 3f33e4f9", + "bea7bfde 3eda882c 3f03538a 3eaa4cbc bbe9a4a0 3ee81794 3f7a75b2 -> 3edab4fc 3f04507b 3e66b75e", + "3f05a2c2 3f1ea92c 3dcaac30 3f02f114 bd017058 be64d3f4 3f6688d0 -> 3f1fac23 3bb0dc50 3f002d0e", + "3ebc3c18 3eea89d6 3f7410d4 3f2599fa 3f20bdc7 bc3a1fc0 3f6e3a7c -> 3ef4726b 3f750905 3f0bdf6c", + "3e6e0598 be5ca13c 3f79b4b2 3ee2d0e6 be31f219 3ed0573a 3e96f78e -> 00000000 3f62aecd 3ee6d100", + "beac34ed bdb6d85c 3f4f397c 3e76996c 3e18b646 3f283338 3f201b7a -> 00000000 3f723d5e 3e06f164", + "beb2d059 3f85f39a 3f8ae810 3e5c23e6 3f827494 3f8864ce 3e660430 -> 3fb7bfdb 3fc2a8bc 3e2e5906", + "3e8d6ac4 3dbbbf44 3f4a1ddc be18d60c 3f211fe4 3f1fc714 3f9a6c0a -> 3e6f3fc3 3f30901e 3e911e60", + "bea7bb45 3eb6bdf4 be5bd782 3f086bd2 3eb9f042 3e0cc820 3f547700 -> 3ea54f8c 00000000 3f0d001c", + "3eb67664 3f499eda 3f91def6 bdaab618 be507f4c 3eddf3d4 3ec99bd6 -> 3f544df3 3f712653 3da4972c", + "3ee40b40 3f0a1c08 3ca95720 3f88ddb4 3ebd2f94 3ccdaa80 3e934954 -> 3f06c82d 3d009408 3f6c6338", + "3f37279e 3f8f205a 3e3a4404 3f5bd4a0 3e313790 3ee972e0 3f9bcc82 -> 3f77104d 3ec7642a 3e6f92b0", + "3f8b9530 bd83495e 3eaf3bec 3ee4c72a 3f843245 3ead4766 3f9f2930 -> 3f9a6f9d 3eead95e 3f174d12", + "3f67b2a2 3f462f5e 3f753a88 3f849ab8 3e8a0262 3f85d23e 3f38857a -> 3f23f0b3 3dbb0610 3eac60de", + "be1e7e1a 3f99091a 3d45fbd0 3f7908fa 3ec39f66 3f8a5990 3f8fc1e9 -> 3fa390ed 00000000 3f918eaa", + "3f67252a 3f04d324 3d00f148 3c2206a0 3eb2b380 3f2b336b 3eef781e -> 3f01c8a9 3f18e7dc 3ed90192", + "3ef850bc 3f5a791e 3f6c9734 bd755c28 3f6e7898 3f5cddfc 3f330c9c -> 3f08b98c 3f11b70f 3ea3cfc4", + "3f22b55c 3f0c1ff6 3f3845a8 3c5ee8e0 be1ea723 3eccf714 3f67be3e -> 3f0e8346 3f1ba2ff 3f12c42e", + "3f97f31c 3ea02060 be5de81f be19a599 3e6b2368 3f511f30 3ece2ab8 -> 3ed4652b 3f962f0d 3ef15d18", + "3fb2c9ab bdee75e4 3f9165d2 3f853f19 3f20064f be1fab38 bddfe0ba -> 3f75c348 3fb4da91 3f9a6494", + "3f3904ec 3d78ee10 3e3f6de8 3ede1594 3f6b7048 3f069651 3d853d9c -> 3f2508d7 3ed984fc 3ee14613", + "3fb2797f be5d72ad 3f588b32 3f168898 bd89cc14 be6a1c8d 3f284056 -> 00000000 3f887f6b 3eda77d6", + "3eba85fc 3f141a16 3f358d58 3e92f2f8 3edc6f2e bd03a6d0 3f84b79b -> 3f0dcbcd 3f36ce65 3ee55520", + "be669af0 baedc700 bdb873f8 be05bc6a 3f8d0a1c be3d6530 3f10efc6 -> 00000000 00000000 00000000", + "3f4b0a7a 3f84e5c8 3e18b02e 3d672490 3f44c8cc 3f0f08b4 3f97a22a -> 3ec38d70 3eeb91fd 3f63d449", + "3e185b1c 3e90d45a 3f5470da 3e3397bc 3f8ff29c 3f17168a 3f8c1b36 -> 3eb60839 3f459c74 3e8fee68", + "3e524494 3e3feb14 3f030e01 3d4025c8 3f4ba654 3f7ed504 3f063c42 -> 3e943e84 3f01ce51 3e13f2ac", + "3f12c994 3e34f932 3f0104b6 bd631484 3f9027cf 3dd4a59c 3eec017a -> 3f181ffe 3f00e5ab 3e73e285", + "bed545f3 3cdd3f40 3ea0f3c8 3f88ae08 3eebdf3c 3f3fb7ed 3e4db990 -> 00000000 3e4b4d74 3f94d82a", + "be30d68e 3ee4be50 3e902ca0 3ed3fb66 3eece050 3f38fc02 bdb4f6b4 -> 3ee06354 3e6887e6 3ed5534d", + "bdd8abb0 3f908e3f be0db1cd 3f0e525e 3f20af08 3f989c65 3f6d5616 -> 3f9b4118 00000000 3f112196", + "3f9fb43a 3f25e381 3f894744 3d66de58 3d8e8d7c be5531eb bdae7a9a -> 3f1f4ec5 3faf5950 00000000", + "3f2611ae 3f652754 be0d71bd 3f64792c 3e51d002 3ef2872e 3e322d40 -> 3f4a437a 3e82123a 3f4dca96", + "be22a996 3e87edea 3eb713c0 3ed3eb34 3f8baf4f 3f24c808 3d095170 -> 3e3c99e8 3ea82a29 3ed37303", + "3f93bd14 bca10a00 3f6204aa 3da9b158 3cbb2050 3eb9b630 3e84ce90 -> 3bfdbd84 3f0ff279 3eaa4ed4", + "3e6b5efc 3ec8e254 3f237c58 3e7e825c 3e256fa8 3f48aaa6 3aeedb00 -> 3eccfa41 3f16b2d9 3e7eb995", + "3f2c08a2 3efbd6b8 3f42ee28 3e1077ba 3f350468 3d13db70 3f224a82 -> 3effcb1b 3f3faee0 3ee4cf2f", + "3f66f518 3e2dcafe 3f458488 3bfe1440 ba8f2800 3f7cd5da be574132 -> 3e2d205e 3e934478 00000000", + "3f26dcb6 3f4109ae bddd19dc 3f49506a 3e98e184 3f24c100 be38351a -> 3f27b8c1 3ecddfa7 3f5a81bb", + "3ec7ca2c bd776218 3f9c9bdd be501d4c 3f2dd86e 3f67c964 3d835b9c -> 3e724768 3f365727 00000000", + "3e2e7640 3ef24e70 3ec9b12a be539fa3 3f7098f0 bd9f60ee 3f2079ba -> 3ef6b113 3ec8407f 00000000", + "3f995d11 3f589bb8 3cbaf590 3e0968d8 3eb714a2 3f264a94 bd79c34c -> 3f0caebc 3f43fd96 3da55943", + "3f9fadf6 be0dff73 be3317f4 be677da7 3f20053e 3e60de4e 3f6efc46 -> 3f5b7d49 3e478db2 3fbb872b", + "3f8244fe 3efe3f28 3f36502c 3f8e7594 bde0b2d0 bd8bda60 bd1e5570 -> 3efddaeb 3f3ddcce 3f94a1f4", + "3e7207f0 3f49b670 3dc12a08 be635016 3ec2e8a4 3ea3be1c 3e99034e -> 3f3c729f 3e1f627f 00000000", + "3f8c325a 3e02afc8 bd11bef0 3e9e3ef8 3f50c1f8 3ed36bf2 3f5719f0 -> 3f4af580 3ee5d41d 3f291619", + "3fb0494f 3f8f428c 3ecdec68 3f987338 3f9f3b36 3f90c777 3f1b66e0 -> 00000000 3f34f840 3d11c420", + "beca90b7 3f92fedc be689fa5 be48b346 3edf23a4 3ec2de5a 3f1d4eaf -> 3faf9dda 00000000 00000000", + "3fbc0518 3f6e8868 bd8e9884 3f4caf4a 3f9ec797 3ed4be24 3ef15438 -> 00000000 3f202eee 3ec4feba", + "bed84742 3f96d935 3dd971e0 3f9d0b00 3da35c2c 3f63e224 be0b1a5b -> 3f9cb37b 00000000 3f925d69", + "3f928d76 3f8e2af9 3f37011a 3f87a1a4 3f8740ce be2076a5 3f7af986 -> 00000000 3f4abdd5 00000000", + "3f2b78a6 3d759f90 3f96025b bdd46632 3d4f5c60 3f1ab3ca 3e655f08 -> 3db7edcc 3f20c33c 3d9e9af0", + "3f827b25 3d926954 3f9cac66 3f98f140 3f9837f1 3f6f32f8 3f7843e4 -> 3f8e2237 00000000 00000000", + "3edb0970 be5d237a 3f427032 3f5332c8 3f9fab74 3df37e9c 3f8cc458 -> 3f0c562a 3f3bae01 3f04e9a0", + "3fb5e1c9 3d3c7f78 3f9b6838 3f6a0ae6 bc14cdb0 3efc5aec 3dc1ac50 -> 3d0c80a6 3e5af828 3f4d8b29", + "bee6409d 3e9dadf8 bbb80ca0 3f211036 3e9319ae 3f625528 3eb2da50 -> 3e8445cd 00000000 3f2b7391", + "3f29933e 3c0a0e20 3f273c10 3f709968 3f87d5a4 bb2da600 3e2cb23c -> 3f331430 3f275f52 3f57710b", + "3f79dc56 3e0755c0 be5f3200 3e0fee92 3f9a5797 3e13d618 3e936150 -> 3f7f7a8b 00000000 3eaf5fca", + "3fa269e0 3f9a4874 bc7be030 3f87955a 3f797284 3f90b86b 3f2fc7cf -> 00000000 3fbb4eba 3dad9678", + "bef67aa7 3f9a9a23 3e6da14e be42dc0c be0de6b2 bdf6ee44 3f5a10f2 -> 3f8e8389 3e86bd92 00000000", + "3f97a41f 3f7ac8e6 3ea1a494 3f26e30b be4c88c7 3ebdad78 3f897a8d -> 3f9a7279 3ef47798 3e87d9de", + "3f99b49c be132f7a 3f914cb0 bd82a304 be038a1c 3f2e5c21 3dab6b68 -> 00000000 3dc50660 3d4aeff0", + "3fb14c5a 3f974e79 3f060f42 3d0fd9b8 3dc9bf84 3f874272 bd1f70b4 -> 3f7ef60a 3ee8a434 00000000", + "3e9b658a be760262 3f51e584 3f101a54 3f807229 3f69a55a 3f1b9c6e -> 3e57b818 3f24865a 3f0a2946", + "bdcb2b40 3e2f4ef4 3f61506c 3f7324f4 be073f76 3f111b9d 3f8bf789 -> 3e3821a9 3f6c4224 3f861016", + "3ebd76c6 3f376137 3f3d189a 3f93e8b0 3f830f65 3eed771a be4bc064 -> 3f0d69e7 3f281fe4 3fa043f4", + "3fa63dda 3dcbb8f4 3f5f7f14 3f5a550a 3e4c52d8 3eb4b4c2 be19821a -> 3e9d37a6 3f07f29c 3f7d81d6", + "beee6c72 3f755912 3f8325b0 3f81a731 3d94eaa8 3f2407fe 3ed26036 -> 3f7d4b7a 3fab37b7 3f9ac6f6", + "3f9030ff 3f3eecc6 be24dd24 3d3f97c0 3f353162 3e5d62b2 3f399af8 -> 3eb52a69 3e24d450 3f497f82", + "3f8a4043 3ba47a80 3e721aac be7c4aa6 be0afdf1 3e75f96c 3f02e5fe -> 00000000 3ebf1360 3f13f9b4", + "3df7d270 3f847b54 3e04b0f0 3ea6324c 3eaf92ac bdb83790 3f00e94c -> 3f7d98cb 3df8de30 3eb12404", + "3f860586 3f993338 3f75c548 3f0dcf9c 3e9e95f0 3f01fcf5 3ccb93a0 -> 3f3eafc8 3ef116b6 3f0d179f", + "3ee69c76 3f8d8285 3f97eb48 3f85c967 3f9689d0 3edd7df0 3f2ec30c -> 3eed9202 3f6b5079 3f35bdc6", + "3fbaf84b 3f264fe2 3f5bd7e4 3d876b48 bb1d2000 3ea6e9e0 bdb01cea -> 3f269495 3f045f79 00000000", + "bebf84e6 3ec5f0d2 3f5967b4 3daea194 be0c8fe4 3f16b97c 3f4f5b9c -> 3ecbe72a 3f806486 00000000", + "3fb2ec45 3f251f25 3ee06a7a 3f7ad400 3ef61de0 3f942367 be42fb2b -> 3ee6784c 3f234daa 3f9e1b3e", + "3f660874 3e040db8 3f3e29e0 3e1799a6 3f755bb8 3ee67cb4 3e6396e0 -> 3f449ef6 3f0bdf4d 3e93c6a4", + "3d05a8f0 3e996032 bd2a5770 bd7d31b0 3f875fb2 3f8a1178 3e7b1d24 -> 3ea07590 00000000 00000000", + "3c624200 3f055458 3c0aef40 3dc333b0 3f55841e 3eadd9d4 3f50da20 -> 3f0534ea 3c567541 3dd5e07e", + "3f1492b4 be0e89a8 3e5feda6 3e49bbc4 3f95a1bc 3eee0202 3f0a1844 -> 3f3a662e 3ebdaea6 3ec60040", + "3de99430 3eff42a8 be3d04c5 3ee4095e 3f06782a 3f1f81d7 3e2fb868 -> 3eff5958 00000000 3ee52194", + "3e46ed18 be0947f1 3f958380 3e940e50 3f901b4a 3f7116aa 3f71ea3e -> 3e12b9c3 3f6c72f2 3ebbb00d", + "bec49482 3f240d2a bdd2c594 3d61ca40 3f42968c 3ea128a4 3f49bba2 -> 3f39180e 00000000 00000000", + "beab3888 3e382602 3f226d8a 3f658ad2 3f1159e4 3e799c58 bc39ec20 -> 3d6e972c 3f280a74 3f64c587", + "be11e0d6 3e8c5cec 3f99bbbc 3f850c20 3f9e1eac 3f6ecd74 3f982f03 -> 3e475378 3fb19520 3f9c6fe7", + "3f9e09d9 bddb222e 3f3e2836 3e908e72 3e528464 be349b44 3f8ead29 -> 3e4df9d7 3f593a6d 3f61a6d2", + "3ebf10e2 3db925f0 3f872fa7 3f754d8a 3f25d640 3f8f77f1 3ef24b6e -> 3e93ae34 3f174573 3f4bdf30", + "3eeb811e 3d92a0e0 bddd6d98 3e22b3b4 bdcc9a80 3f802e51 3db0d8c0 -> 3d03fc6e 3ee77a30 3e3e7309", + "bd99ac84 3edca28c 3f4c79de 3f9a8f23 3e046b06 bd8951aa 3b269d00 -> 3edbf2da 3f4bb4de 3f9a97fb", + "3f74aa12 3f9bc7c3 3effddd0 3f91fc9e be76db28 3f80c61c 3d1398a0 -> 3fc6126a 3f000fc6 3f8c56fb", + "3efe83d6 3ecefe2e 3f82eab6 3e9beae4 3e76ec8a 3f6c6152 3f382479 -> 3edabde4 3f0af950 3ee37d6c", + "bec2f34e 3f540e3c 3f981ea4 3f95c1d2 3ebeee6c 3f43f298 3f4c556c -> 3f6bed09 3fcb7bc6 3fc9e213", + "be6b7374 3f879296 3f216b54 3f8ae855 3f973869 3f5a42ee 3f3b76f2 -> 3fae750b 3f2e85a5 3fa421ff", + "3f486346 3f98d72c 3ea651e8 be31e69f 3f9201b2 3f5cb3b4 3f5026c6 -> 00000000 3f0fade0 3f2f125f", + "bb0e6100 3e9ce0cc 3f88aa27 3f238d0a be0a715e 3e3fb0b4 3f9c6f7e -> 3e9cefb4 3f88b948 3f23bd5e", + "3f8738ae 3df3e710 3f8d5bbe 3f68b18c be3012bc 3f1df69e bca99df0 -> 00000000 3ea2056c 3f6d4606", + "3f785962 3f5c3c96 be59957a 3f80d1c6 3ed5c664 3ee8a262 3f23a532 -> 3f1183fc 3ed4cc29 3ec1b40c", + "be9439b8 3f8f41ca be475db8 be309e72 bdc5b5b4 3f0dc298 3f84937e -> 3f8ad3ab 00000000 00000000", + "3ee4d750 3ee558f0 3e69bc68 3eb36f7c be41498e 3f93fed8 3f774f8c -> 3ee0d9ab 3f025588 3ef58de2", + "3e489f1c be045c19 3e8fed34 3e842718 3ea80cd6 3f537672 3e920aac -> 00000000 3eb43387 3e91feaa", + "3f40e062 3f46b3d8 bd97071e 3f8d3ac1 bc6cec20 3f00c3e1 3f8e03b6 -> 3f483e3e 3eb8e3b8 3dc1d6d0", + "bd612fb8 3e931ca4 3d8f1660 3ef24064 3e218a10 bd9bf362 bd0d523c -> 3e913920 3d96768d 3ef24dbe", + "3ed5222e 3f8195de 3f0fb4a6 3f9b0d30 3f622994 bd824004 3e541118 -> 3f22b14c 3f10898a 3f8b5a3f", + "3f87e047 3f204861 3e9df39e be6ec92e 3f35f8ee 3e86c70a 3ea94a68 -> 3edf209e 3ed4bf76 3e90204f", + "3f51c4d0 3f41a406 3eff2000 be248ce5 3f60dac0 3dd4fee8 3eef8424 -> 3ec64f66 3eff462e 3eb1100e", + "bd2eb058 3f9084bb bcd3a3c0 3f957e7d be4c0527 3f968fc9 3e017bec -> 3f8f266d 00000000 3f966a8d", + "be925a46 bdbb9d94 3f904bc6 3f674b18 3f7b7c1c 3f4024ae 3f8ad882 -> 00000000 3fb2bfff 3f93aca2", + "bcb5cb10 3f7841f4 3e97f25c 3f31dcd6 3f23be72 be2ffbc3 3f826bf0 -> 3f7babec 3e98bd8b 3f341e19", + "be998c17 3f5e254e 3f8b13e6 3f065362 bc27e8d0 3f076236 3f181e27 -> 3f5d9128 3fa2e461 3f08948a", + "3f5fe30e 3f5252cc 3ec486d6 3f0787c5 3f88f0db 3f3f68cc 3dc0e8ac -> 3e6116b4 3f09272c 3f064a28", + "3fac16d9 3eaca388 be538a6b 3f552ade 3c261ba0 be2d6ad2 3f42b244 -> 3eaee94c 00000000 3e1c00b4", + "3ee9f58a 3edcc484 3de814e0 3f7a7cd0 3f433ed4 3efde860 3ec32cbc -> 3ef55337 3e93bf82 3f4fd0b7", + "3f9b96b7 bd4692d8 3ec9ffe2 bc38ecd0 3cd3d9c0 3f32ea32 bd69bbb8 -> 00000000 3f12dfd6 00000000", + "be1b3f2a 3e0cec54 3ec95330 3f87cf2c 3ecb7ab6 3f4840d2 3ec267b6 -> 3dc069de 3ebc5b51 3f9013a2", + "3e909958 3efca844 3dfe1aa0 3f94cd34 be7d106f 3f3d93ef 3e666be0 -> 3efc30d0 3e9008fd 3f8a05f2", + "3eafd5d4 3e81b790 3f8e58fb 3ec24c08 3f9fade2 3c096680 3f2eaf64 -> 3eedec2a 3f8de573 3edf3762", + "3da82080 3f392530 3f4bd692 3ef4430e be5e47e8 bd178364 3f7e8838 -> 3f3b2e93 3f4c4c7b 3ef62d99", + "3f28faa2 3f9ea1bd 3e94d6f0 3f4b42e8 be4e059d bdca397a 3f5f3e1e -> 3fb7c437 3e86dee9 3ee93cbe", + "be6f8706 3f2673ce 3f82c643 3f5cdb14 3e98c8f2 3e05f9a6 bdf3eb68 -> 3f2bd208 3f86dc92 3f57ae95", + "3fb55ec0 3f9e9fa4 3f887134 3f4282f2 3f80b020 bdc024d0 3ecee3c8 -> 00000000 3f9bb3f6 3eecb1c1", + "3f8c7cb2 3f084dfb 3f5bf64a 3ce86150 3ee18930 3f02b4e0 3f89908e -> 3f004646 3ee9c9ed 3f920cc5", + "3f381d30 3f58d306 3eaaf9a6 3eba9eaa 3f11b90a 3f22aba4 3f777d88 -> 3f1018e2 3ef8b012 3f0d8c96", + "3f016b8a 3f8aabee 3df2bbf8 3f9a1ea6 3f16db1e 3f1a5cda 3e3b6604 -> 3f3c5c9a 3eb3c30e 3f8971bb", + "3f788aa4 be236a3b 3f444af0 3f32f74b 3f905399 3f0d2cd0 3e7ed3b0 -> 3fa46adc 3ef65488 3f1a56bb", + "3f4fdd36 3f7af428 3f779e94 3ce1b8a0 be45ce71 3eae2ca8 3f6c00f0 -> 3f90c30f 3f35897c 3f3c1f0f", + "3ee28eaa 3f2e752f 3f03ffde 3f1bba00 3f2403f0 3f860e81 3f0900ca -> 3f141dc2 3f004ae2 3f0e9842", + "3f9e6b2f 3ee01f66 3e7e2ef8 3f7aab70 3f3ed2c6 3e281430 3eddfaf0 -> 3f0d7839 3eb3775e 3eee0c14", + "be9596e0 3f328aea 3f4e45a6 3e2a148c 3f0d9e8d bcecf3b0 be1eb3c2 -> 3f42e176 3f4cf2fa 3e490b87", + "3ed86c18 be21529c 3f144bc0 3f101d68 3f9ac408 3f136c30 3f9717fe -> 3f03bbbc 3f0a6a41 3f00088e", + "3fa93f3e 3f1dde3d 3db20c84 3f032ca6 3d395500 be520da3 be4f9362 -> 3f1a4b53 00000000 3f04e048", + "3d12e3c0 3f5a57a0 3eb10696 3f996b97 3f4e3fd8 3f65d8b6 3f86639a -> 3f551f33 3eb61c82 3f92afc6", + "3f341cfe 3e897e64 3f784bdc 3e0751ac 3e0c9f12 3f885bba 3f13fe7c -> 3ea064b2 3e87f088 3edcde4b", + "bdfb9d5c bdb53884 3f8e4451 3f00edd8 3df3ef8c 3f53ade0 be70cc25 -> 00000000 3f9e2b3c 3f00e01a", + "3f1e6272 3f97da0f be518d9a 3f2e7bde 3e62c346 3f1ad0cf 3f97e0f5 -> 3f7f8ee2 3ea5319b 3ed47896", + "3fa1764e bdb5ae92 3e5dfb28 3ee67aec 3df443a8 3ec5c4a4 3f808260 -> 3db51b46 3efc4cfb 3f138f39", + "3fa57786 3e57096c 3e5eb7d0 3f7f5eb4 3ea57f58 3d38bdc0 3f850965 -> 3ee79ae5 3e8039bf 00000000", + "3f6e9034 3f5bffe4 3e3923ee 3f52604c 3f42b4bc 3eb462fe 3f55759e -> 3eb32ca6 3ec7e28a 3ea4b772", + "3ee1637c 3e66e3bc be7704c7 3f968bb0 3e5f3ade be5ec73d 3f5018d8 -> 3e8e6bf2 00000000 3f3136ae", + "3f8717ac 3e99cd64 3e88b6a0 3eab1e0c 3d307e80 3f8e82a5 3f54e44a -> 3ea318fb 3f50865b 3f200f24", + "bcc1d4a0 3f00cd12 3f6e96f6 be6d82c2 3edbaa44 3f52f9be 3e40d7d8 -> 3f00d13c 3f72e710 00000000", + "3f8d0f0d 3f24daae 3f418f24 3f85df23 3f082204 bcc8ba70 3f81eed7 -> 3ef351ad 3f451986 00000000", + "bd832830 3f5d539c 3f8e0dca 3f35fc14 3b1f5000 3dd26260 3ebb584e -> 3f5d5b0c 3f8f14b3 3f3883c7", + "3f8a60d5 3e54ffec 3f062618 3f935cdf 3eb52840 bd714188 bd9381c6 -> 3edcdee3 3f06ee8f 3fa05846", + "3fb09271 3f99a952 3ed39f5c 3cf6f890 3e3a1a48 bd2d17f8 3eeeee46 -> 3f596882 3ece72d1 3f22947a", + "bcccdd30 3eff640c 3f4dc0fc 3da6fcdc 3f4737c2 3eca7f50 3f40eeba -> 3eff5dfa 3f4f4abb 3d86aeff", + "3f712856 3e815f56 bdf5373a 3f6facb4 3f874a02 3f861d94 3f16ef46 -> 3f3ec3d8 3f8d44a6 3ee74027", + "3f3f6ec6 3ed07f7a 3f5f92f2 be565da2 3f42b8fe 3e5ce08c 3ed7c78a -> 3f034489 3f40be0a 3e737628", + "bdda1f0c 3e21c37c be0869b9 be32fbfb 3f220dd6 3c298bc0 3f855d75 -> 3de5135c 00000000 00000000", + "3f420ab8 3dbdfba8 3f440682 3dccdb90 be6dd150 3e98cd18 3f9c40b6 -> 00000000 3f253fd4 3f57175c", + "bc4a22e0 3d65a968 3ec238f4 3ef2cf1e 3f750ca4 3f5cbd6c be153406 -> 3d3ab6bb 3ec0e878 3ef2db42", + "3fb86036 3ec999fc bd0f2f54 3f0c001c 3e12c2fa 3f16a080 3e652258 -> 3ee00feb 3f5f304e 3f0443b9", + "3f0ec3e0 3f4a3cbc bc2c34c0 3f2bcd94 3f7df65e be51b28a be416917 -> 3ef030f2 00000000 3f3507e3", + "bd3a9208 3f2fdb6c 3bcf4d00 bdd6b0ae 3e0a65e4 3f7633d0 bde54e46 -> 3f307244 00000000 00000000", + "be92d4c4 3ebaa530 3f161140 3f85042c 3effa938 3f1e6ddc 3ea3e2fa -> 3ea6c837 3f1de67b 3f91afe4", + "bd023cc8 3e79d9e0 3f110108 3f86d62d 3f1a7ab6 3ea2618c 3db7e634 -> 3e6fca98 3f1158d3 3f873dba", + "3f97c295 3f936c44 3f0740e5 3e757460 3f2c05ae 3f117255 bdcc56f2 -> 3de7f680 3efaf678 3e36645e", + "3f1203a0 3f06b754 3f2dcdde 3cd2a9c0 3e81a65c 3f946dd8 be667e41 -> 3f04c6af 3ee26dcc 00000000", + "3f28a990 3dfbeefc 3ea87b4a 3f12732a 3f9344cf 3f9bae64 3f85d00d -> 3f31cd34 3f1a5eec 3ef211e4", + "beec0eee 3f20fbca 3f41f7c4 3f64dc22 3f9c1952 3f93ab8c 3e44b704 -> 3f46130b 3f841286 3f76b9e9", + "3e6976c4 3f2c4e25 3f5e213a 3e0deea0 3f3a6298 3f78a8f4 3ea73a90 -> 3f1d98b3 3f347051 3e450c25", + "3f615930 3f3a5db4 3f67ccd2 3f3693ca 3e1305ea 3f9e708b 3f1b6d7e -> 3f2b9cd9 3cb32560 3ef87af9", + "3fa46782 3f9421b1 3f43730a bb7e9180 3f35922a 3e97221a 3f3b65fb -> 00000000 3f104dfc 3f719256" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_dark(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "bead6914 bc4f2740 3e6ce4ba 3f33f118 3eb3a800 3e96b958 3f7c297a -> bc4f2740 3e6ce4ba 3f33f118", + "3e49ee9c 3f82a490 3f1880f6 3f33d308 3f2a1b3c 3f754760 3bde3940 -> 3f734e1f 3f1880f6 3f10b49a", + "3fa6f0cb 3f87d652 3f918cd3 3f467098 bd7cd430 3f32c328 3f8abe23 -> bece8484 3f109626 3f467098", + "3f318038 3f2c70d4 3f8defb0 3f41c824 3f9d3dd9 3e40ca6c bd720dc4 -> 3f2c70d4 3ef0edc4 3e43b9a4", + "3f4ba08a 3f9f425c 3f25dab4 3e8540f4 3f1bc60c 3f35c7c6 3e3336b4 -> 3f3d1177 3f25dab4 3e451288", + "3ed41cae 3ec5d018 3f2f8a90 3e023a60 3eda988e 3f1773cf 3e864c50 -> 3ec5d018 3f258fcb 3e023a60", + "3f8e0db8 3d74bdc0 be74fcf7 3f3aa63e 3cf33690 3eb36218 3f9e1909 -> 3cd82ca0 be74fcf7 3f3aa63e", + "bebe6e04 3f605964 3ef121ae 3f055f6e 3f58cde4 3f65e9b4 3ef3b0dc -> 3f6327c8 3ef121ae 3f09a901", + "3f15c36a 3ebeb39c 3f99147b 3ebeb09a be1357ba 3f4b4a54 3f4d2454 -> 3d9028f4 3f75fadc 3ebeb09a", + "3f99d845 3f995322 3e44ca38 be46ab42 bb006500 3f8a7763 3ed5bcdc -> be7a13a0 3e44ca38 be46ab42", + "3eccb6ec 3e4e3c58 3ecbc400 3f42e676 be12c29a 3f125620 3f700b96 -> 3d82314c 3ecbc400 3f42e676", + "3ea30d3c 3f8c8f4f be63786e 3f72e1fe 3f8b40c7 bd352ef0 3f2021a9 -> 3f8c24c6 be63786e 3f58879f", + "bc1c3900 bd95b11c 3f7d410c 3f817c14 3f87ef09 3f72f53e 3f8f9c18 -> bd95b11c 3f7d5a2e 3f817c14", + "bef684b2 3f3d619c 3f809b26 3ea4446a 3f8614bd 3f3601d1 3f972816 -> 3f3d619c 3f92b600 3ea4446a", + "bc8f1100 3f518e34 3f2c510e be5f9799 3f04c246 3f1153a6 3f2bd226 -> 3f52e58c 3f2cc9b9 be5f9799", + "3eccc626 be3544a2 3f813c7d 3f3d7e8c 3d9c9ca0 3f49ccd8 bd4d2664 -> be3544a2 3f6bce76 3ed927ff", + "3f084eec 3f958388 3f2c7650 3c951060 3f169d44 bd97ea9c 3f289912 -> 3f5c011a 3e8d0bb6 3c951060", + "3f98e844 3ee7e304 3d35d080 3e3e8626 bdf033cc 3f0ba63e 3ed26cb6 -> be69b760 3d35d080 3e3e8626", + "3f483ca4 3f24abb4 3e431100 3d725e00 3f8e2a27 3f80ddb5 3afeb900 -> 3f24abb4 3e431100 3c6c1438", + "be025320 3eb5a1aa 3f6ac7e4 3ea37e92 3f23596c 3f9a27c2 3f716106 -> 3eb5a1aa 3f6ac7e4 3ea37e92", + "beb90d48 3f9d640a 3caf3380 3f3c4a7e bdb6bcc2 3f6c0a98 3efaa61a -> 3fda6784 3caf3380 3f530c88", + "3f6dce0e 3da5ffd8 3d579b28 3e5630d4 3f08ff25 3e8b6e36 3eae9268 -> 3da5ffd8 3d579b28 3e5630d4", + "bc4bc4c0 3ec1e80e 3f587890 3ec59180 be694a61 3c26f2c0 3f769cd4 -> 3ec5c4d1 3f5b217a 3ec59180", + "3ed0085e 3f11b4b8 3edcb158 3e5cfd18 3f8408b7 3f99571f 3e7aab18 -> 3f11b4b8 3edcb158 3e5cfd18", + "3f159da4 3f80d736 3f72e93a 3f99a1ec bce99ac8 3f77380c 3f6ac160 -> 3ecda206 3f72e93a 3f8471a1", + "3eedc3d4 be68724d 3f33570c 3f9c6890 3f5f9ba6 3f95f1a7 3f91e978 -> be68724d 3f33570c 3f9788b8", + "3e7f93e0 bde5ab94 3f8cccd6 3ea6aa52 3ef8089e 3f693628 3f94f9dc -> bde5ab94 3f86c2f4 3ea6aa52", + "3fbbe88a be36c2b5 3f977b44 3f1dac04 3f71b3b8 3f9d6219 3f2c97e2 -> be36c2b5 3f977b44 3f1dac04", + "3ec2de46 3f5720f0 3e8a1670 3e045be8 3f795c5a bbabdcc0 3c091400 -> 3f5720f0 3e2904b0 3daa7cc1", + "3e882ed0 3eb520f0 3e8490b8 3ea097f6 3f0e7f0f 3f2c87d3 3f647344 -> 3eb520f0 3e8490b8 3ea097f6", + "3e9d819a bdd6f3d6 3ed3ef42 3e18470a 3db5c3e8 3f8964f2 be07a25c -> bdd6f3d6 3ed3ef42 3d7ed45e", + "3ed11b1e 3f14bf00 3f91f50e 3e981a3e 3d178150 3ea96e1e 3f16596c -> 3eb7ba5a 3f4f4acc 3e981a3e", + "3f8a3f67 3f81f959 3eab2fa8 3e8dfee4 3f7c73d8 bbeb4080 be3fa7ad -> 3f7bda38 bd0d66e8 be65bc34", + "3d9d6fe0 3e392f50 3f57ba26 3f931fa6 3f6d3b08 3f61aea0 3f9e6d16 -> 3e392f50 3f57ba26 3f931fa6", + "3f60f81c 3f17514f be73db48 3f96c2a0 bc546ac0 3cb00eb0 3f1ecc34 -> 3d76cd50 be73db48 3f301902", + "3fb373de 3f04fee8 3e5e6908 3f1afb3b bdc02d88 3f0e8078 3f9d5498 -> beae4750 3e5e6908 3f1afb3b", + "be1df5ae 3ec24238 3f8a84ed 3f2fe446 3f69f138 3f2bcae4 3f23b275 -> 3ec24238 3f92a301 3f31c5d6", + "3f1e27b4 3f965844 be5acdda 3f520b36 3edcbca8 3f545d2e bd9d8f18 -> 3f371c48 be5acdda 3e8839be", + "3f8f3921 3f523d7a 3e7f49e0 3ed2faea bd6e4bcc bdf61616 3f65b016 -> be26acec be2809dc 3ed2faea", + "3fbe4921 3f907077 3ebd0fbe be4cd901 3d736990 3f9bc69c 3f8118a6 -> beebe880 3ebd0fbe be4cd901", + "3e251430 be0809b5 3f6c0436 3f54798a 3f2fa906 be2a4c6a bd9cfb94 -> be0809b5 3f3f1ad6 3f2f0ef0", + "3f9e1c7a 3f815826 3e596c16 be72d8c2 bd21c434 3eb24f70 bd5e3b20 -> be92b004 3e596c16 be72d8c2", + "3f38d660 3f9cde52 3ddbd050 3f4e5000 3ee24690 3ee4fc30 bd1a7e40 -> 3f28e66e 3ddbd050 3e4983e8", + "3f8c80f3 3f9be3e5 bd6823a8 3f9b6f86 3eda8678 3da7c8c8 3c9e87c0 -> 3eb2f594 bd6823a8 bdc76fa0", + "3f005592 3eed03f8 3f231a86 3f1abaa0 3f343dac 3f618128 3dbd4ff0 -> 3eed03f8 3f231a86 3eb20cff", + "3f9f21f9 3dea4298 3f9ec8d6 3f7eb54e 3f3ef049 3f9ff6c8 3f94d57d -> 3dea4298 3f9ec8d6 3f7eb54e", + "3f9fb375 be5a2239 3ecc674c 3f9d9bc3 3f481586 3f3393c9 3ea599d4 -> be5a2239 3ecc674c 3dc9e9f0", + "3faf6d87 3c437540 3e79e6fc 3f5e1350 3f050f1f 3f4bd930 3f0c325c -> 3c437540 3e79e6fc 3edbb765", + "be9a1b3e 3f3a8670 3f5d9a7e 3c197280 3f8039e6 3f93b628 3e99d514 -> 3f3a8670 3f5d9a7e 3c197280", + "3e6ba1a8 3f534080 3ed11e60 3f01a610 3f37a690 3f8d3928 3f5bedd2 -> 3f4ce691 3ed11e60 3f01a610", + "3f7b45c2 3def42f4 3f87cd59 3f723300 3ee52110 3d4ad220 3f919a1e -> 3def42f4 3d8ba9c0 3f723300", + "3fb43590 3f4b4a20 3f9dd3c3 3f652db6 3f216550 3f722754 3f191be3 -> 3f104ed4 3f542c7e 3ef429a1", + "3dcf81a0 3e12831c 3f7ca74e bd868b9c be296020 3f4b77a4 3f687d2c -> 3de5030c 3f77ab80 bd868b9c", + "3f2e57d8 3dffb96c 3f3c4f84 3f7e7c7c be1dfb02 3f1cc070 3f035ee0 -> bd859bfe 3f26d170 3f2aa41d", + "3decf4c0 3f9ed23b 3ef322ec be3e4426 3f592178 3f36df18 3d2aff88 -> 3f9901ad 3ef322ec be3e4426", + "3fae18f9 3eddbe18 3f95f029 be3605a2 3efe581e 3f28fe20 bd01a8f8 -> 3eddbe18 3ef3b69a be3605a2", + "3fb4d2e1 3f61f2f8 3eba7028 3df873dc bd2bb038 3f73cea8 be1d175c -> bed8cf40 3eba7028 be8897ed", + "3ed1a9ee 3f2be7e2 3ea4ef08 3f21fe97 3d6faad8 3f99b853 bcc9b1f8 -> 3ed749f2 3ea4ef08 3eba274b", + "3fbea0cb 3d9a5968 3f99db42 3eb41e90 3f2fecb2 3ebfaab8 3f381966 -> 3d9a5968 bcfabb80 3eb41e90", + "3f67878e 3f02160f 3f54bec0 3f8421ec bc96f890 3e9cd7d6 3e9c9d62 -> 3d02af38 3eb685c3 3ec02a54", + "3f8e8127 3f88637f be0d402c 3f167be9 bdec33e4 3f3097bc 3f338590 -> be7f1ff0 be0d402c 3f167be9", + "3efab5e0 3df8bb84 3f1f6e00 3f919e21 3f68f1c8 3ed54970 3f83cb9c -> 3df8bb84 3f0594f8 3f8ad96d", + "3e84a18a bdc73068 3edce0c0 3f0a26ca 3f436e72 be3c09de 3f939a22 -> bdc73068 3e8b4e2e 3f0a26ca", + "bcbcb020 3f9c14e8 3f386f4f 3f879fae 3d128c28 3eff9812 3e065a9c -> 3f9f923d 3f39bd46 3f8a5c5c", + "ba3b1c00 3f487954 3ead9546 3f9cfe60 3ecac578 3f4a6b78 3f38de00 -> 3f488b6f 3ead9546 3f9d0a2c", + "3f798132 3e571e38 be51f548 bd9bf6b0 3e85b1d4 3f062ce0 3effd9fa -> 3e571e38 be51f548 bd9bf6b0", + "3fb8227e 3ea89104 3eeda60c 3f837d75 3f9a9852 3f70822e 3e6fa45c -> 3ea89104 3eeda60c bde92b70", + "3e9d4af4 3e193980 3e787434 3eefb394 3e75b988 3ece34d6 3f1a2dda -> 3e193980 3e787434 3eefb394", + "3fa5be1f 3ec8814c 3f473c8c 3f8ca860 bd7344d8 3ea3ddd4 3df13a48 -> be44fe64 3e3d60f8 be2f9f08", + "3f1e2826 3d0a35d8 3f949fc1 3e871e18 3f603940 3d6b9390 3f369baf -> 3d0a35d8 3ef568a6 3e871e18", + "3f8b8c43 3ec5db64 3ebb4b42 3e812b10 3f0ad0a9 3ece8e90 3e1d8088 -> 3ec5db64 3ebb4b42 3e1467ae", + "3f2fd710 3bce24c0 be5eee36 3d9fc0f0 3f4f49da 3f92d6c8 3f827067 -> 3bce24c0 be5eee36 3d9fc0f0", + "3eb0728e be1d49a8 3f0222f8 bdc05d2c 3e0d4436 be053f6d 3f8141dc -> be1d49a8 3e939ddb bdc05d2c", + "3fa1049b 3e888c42 3d998348 3d9069bc bd3c209c 3e0716cc 3ebb2b40 -> be019c1a 3d998348 3d9069bc", + "bdd91e74 3f0d9383 3f036bdf 3da7bb28 3f21c8f6 3f454d68 3f29a9b7 -> 3f0d9383 3f036bdf 3da7bb28", + "3f9795ca 3f903bb6 bd0bbbe8 3f729db8 3f9fe991 3e4b36e0 3e52ef8a -> 3f903bb6 bd0bbbe8 3d8df8c8", + "3c617440 3f3ef81c 3f4558a4 3ec303b0 3ed882b2 3eb28cf4 bd38cd90 -> 3f3dd4bb 3f43dbf0 3ec00355", + "be801b41 3ece3916 3ddcd588 3ef9d064 bd7f6ebc 3f7417f8 3f8fe5be -> 3f04e7bf 3ddcd588 3ef9d064", + "beae4128 3d275388 bd8bbd7e 3ead2564 3cb03290 3f84e541 3eb0784c -> 3d424a69 bd8bbd7e 3ead2564", + "3f456108 3f04d894 3f9f805c bd93f8d0 3e0180a0 3dd9b8c0 3f1eca47 -> 3e5d8750 3ebc0fee bd93f8d0", + "be543476 3e95bd6c 3e555a84 3e0df7a8 3f6be26c 3f0dc7d4 3f2ee28b -> 3e95bd6c 3e555a84 3e0df7a8", + "3f5c6808 3f0dd7c6 3f708b60 3f47fc9c 3f843f9d 3e2489e8 be11428b -> 3f0dd7c6 3e89b862 bc5d7340", + "be996d68 3e1f44b4 3f580f34 3ee37fc2 3f889ab8 3f49de3c 3f64b91e -> 3e1f44b4 3f5c4fde 3ee37fc2", + "3f72ad9a be5d103a 3eb8160e 3f7a518e 3ed2066c 3f8e3fde 3f2e9b98 -> be5d103a 3eb8160e 3f328c34", + "be4a0286 3f4657ea 3e5003c8 3d3e1318 bbf84f00 3f15a8e1 3f9bdfcf -> 3f6ddab7 3e5003c8 3d3e1318", + "beb4b072 3f932208 3dcb5244 3e884d50 3e194090 3e43a3c0 3eb2b316 -> 3fc04c03 3dcb5244 3e884d50", + "3f50d1ee 3e77f3c0 3f4e9614 3e74096c 3f20a808 3e723328 3f0d91cd -> 3e77f3c0 3eaeed8d 3e74096c", + "bc7d8860 3e1bc618 3f3bc104 3e9e5570 3f1158dc 3f7a1128 3ec467ec -> 3e1bc618 3f3bc104 3e9e5570", + "3e360ec0 3f8ca5cc 3ed258b8 3e85be6c 3f314818 be7ee430 3f0b2e80 -> 3f8366bd 3e964a4e 3e85be6c", + "3f9a553d 3ef914dc 3ef836d8 3f4a6fd8 3f537998 bde08204 be571b72 -> 3ef914dc be6d79d0 bed4f92c", + "3e32f09c 3efd49d6 bd933634 3f2ae54d 3eb1ea96 3e96bf24 be1a6cfd -> 3ef01e12 bd933634 3f06493a", + "3f63a958 3f4d74f2 3efa9e66 3f842d97 3f1ff2f3 bdf7b1ac 3f8e8c10 -> 3f24fc92 bd5a9b80 3f842d97", + "3ea9110c 3f383fec 3f7cb67a 3f2cb686 3f5b97b6 3f158ba8 3f5a1b10 -> 3f383fec 3f5aa568 3f2cb686", + "bedd696f 3f703dec be7ae23c 3f35080b 3e4287f4 3f871586 3f751d98 -> 3fa18d18 be7ae23c 3f35080b", + "3f964c56 3d93d54c 3f329284 3f869737 3dc4e854 3f0358aa 3f8dbd25 -> 3d93d54c 3ef63d1d 3f869737", + "3f858867 3f0e27cc 3f64456c bcf38dc8 3edd632e 3e919e6a 3f3763c2 -> 3edaaae4 3e842dd8 bcf38dc8", + "bdd70e5c 3f95ee94 3ef50810 be3aab68 3f8f9e94 3f2e1660 3ed032ec -> 3f969845 3ef50810 be3aab68", + "3f9831ac 3f3f64f2 be091aba 3f9bf0f1 3f0e6416 3e40784a 3e52529a -> 3f0520e8 be091aba 3c646280", + "3f688952 bd9d71ba 3f9aeea0 bdbd658c 3efa690e 3e111ca2 3f84a640 -> bd9d71ba 3e7569e4 bdbd658c", + "3ef29b6c 3f855e58 3f9d9660 3e8eabd0 3f1db120 be7988a7 3f3719ca -> 3f57111f 3f084597 3e8eabd0", + "be8fbfa6 be1e3bc8 3ee8a5e8 3e339882 3d4bc730 bdea458c 3f8090e8 -> be1e3bc8 3f1d346e 3e339882", + "3f984083 3f06c369 3f23b2e6 3ea2c9a6 3e0052b4 3e9a0844 3f9e9400 -> 3d4a0298 3e725eb4 3ea2c9a6", + "3f19724a 3f14d933 3f8aa646 3f4a38f4 3d99d4b8 3f26e5a4 be18698b -> 3e8e4f13 3f531fc2 3e68af68", + "3eaf9006 3f6e682a be3fbef2 3f98be88 bddbbf9e 3f6e1742 3f50dc5e -> 3f133d46 be3fbef2 3f882d7a", + "bea7a966 3efeae90 3f49ff3e 3e831810 3f2c788a 3f70ffac 3f5a3260 -> 3efeae90 3f49ff3e 3e831810", + "3f33efda 3f29665e 3f4afbc2 3e834f48 3d566c40 3ee6e5b0 3f85031d -> 3e6f01f4 3f0d7503 3e834f48", + "3f32132a 3ea454b6 3f56ee7c 3de8fed4 3f8ba184 3f861240 3f93f248 -> 3ea454b6 3f56ee7c 3de8fed4", + "3de97a80 bdd0fe62 3f3d1cf6 3e94ed14 3eb57066 3f1d342d 3f484220 -> bdd0fe62 3f3979b2 3e94ed14", + "3d5612f0 3ec88560 3e6da440 bdbe5cca 3e52802c bd7ba8f8 3f63404a -> 3ec38ab0 3e5deeea bdbe5cca", + "beec34ff 3f8cd9d4 be409cd7 3f339c24 3f1c0476 3e0bd67c 3f9610ea -> 3fa9d7b6 be409cd7 3f339c24", + "3fb24c8e 3d250ca0 3e91229e be68b0b4 bd48d34c 3d7df630 3f7c47a2 -> bdac4ccc bccd00b0 be68b0b4", + "3ea0a4d6 3e648720 3f545d36 3d545058 3f90f961 3f68f7ce 3f6b3cfc -> 3e648720 3f545d36 3d545058", + "3e993d8c be4c76dc 3f9b8abf 3d8e02ac 3d9e5c00 be383efa 3e73ac04 -> be4c76dc 3f4c30ef 3d8e02ac", + "be0f41b8 3e9f2564 3dcb99e8 3f8c635c 3e865ace bdc9d084 3f1e2240 -> 3ea29d46 3e0228c5 3f94f787", + "3eebe732 3f4715b2 3f2983b8 3e6cfa48 3f292ee1 3f9de15f 3e94e150 -> 3f394ec0 3f2983b8 3e6cfa48", + "3fa7b4f1 3e522e9a 3e894570 3e1d15a0 3e9aa992 3f85fd3e 3f86e58a -> 3e522e9a 3e894570 3e1d15a0", + "be8cfd94 3f270bda 3f8d77b1 3ea55a92 3e8e9b46 3f9c01a6 3f2df50c -> 3f416948 3f8d77b1 3ea55a92", + "3f9de0ea be1cf2d0 3ec3b79c 3e9071ea 3d882ae8 3f2f36d3 3f664f28 -> be1cf2d0 3ec3b79c 3e9071ea", + "3f91d410 bd870f72 bd97972c 3f704564 bdb73464 3df12b18 3f91e38f -> bdbde90f bd97972c 3f704564", + "3f42bac8 bda93408 3f89033a 3e630f84 3f6d3510 3ec198ac 3efbcf54 -> bda93408 3f0b371b 3e630f84", + "3f75c8d8 3f3272c7 3f953d77 3f833b5c 3cbeb8b0 3ede3fdc be17f4ec -> 3d4d7d10 3eed33b4 bdcfffc0", + "3f85af3b 3e7a0f70 3f061970 3f9defe2 bd89eaec 3f98169a 3f2ba554 -> bda640c4 3f061970 3f253d99", + "3f3dc332 3cf4fd20 3f9982ce 3eb05308 3e9917d8 3f242180 bdf9756c -> 3cf4fd20 3f491a40 ba9b3000", + "be0db792 3dbcace8 3eee0008 3e10ed56 3f2dd51a 3f9501fb 3ef229a4 -> 3dbcace8 3eee0008 3e10ed56", + "3ef5db9e be5c5c4b be185a60 3f1a1892 3f1736f7 bd7f29ec bd38543c -> be5c5c4b be185a60 3e952302", + "3ebb8164 3eeec1c2 3f01c23f be53c1a0 39b72400 3f4c4c62 be372302 -> 3e97626c 3f01c23f be53c1a0", + "3f8b1179 3f26f3aa 3f7465a0 3f9d2b69 3e37e0bc 3e608724 be71193a -> 3e0e083c 3e1f6908 beb955e4", + "3faccbb9 3f8f806c 3f904d2e 3ec15248 3f7caad6 3eba2cb0 3f12e90e -> 3f70a69f 3dc54e40 3ec15248", + "3e9cf870 3ee6f5d2 3f223b62 3f1820ac 3f051bf7 3f20edf2 3e3151f2 -> 3ee6f5d2 3f21d528 3eee284e", + "3de674a0 3ed8600e 3ec38e64 3f178bab 3f800fea 3eee5530 3d001df8 -> 3ed8600e 3ec38e64 3f0764c5", + "3f6b0960 3ee286bc 3e9a33d8 3d475070 3f8bea8e be4597b3 3ea9a6be -> 3ee286bc be1c2848 3d475070", + "3f40d7ec 3f429a64 3e279214 3e7f73a6 3f31e22e 3eeab640 3f1900c5 -> 3f360221 3e279214 3e7f73a6", + "be903fc7 bcd61e90 bcd21220 3f5a8c22 3f52f70a 3f2191ae be523292 -> bcd61e90 bcd21220 3f93766f", + "bef59ac2 3f8fc36f 3ee5ddd6 3f3afaec bda50c84 3f65e2c4 3ef5fe8e -> 3fd9acae 3ee5ddd6 3f59ac2d", + "be469740 3ea53cde 3ec5964c 3edbb0b8 3f807b99 3f7bb7d2 3d975470 -> 3ea53cde 3ec5964c 3efef58b", + "3ecf4e9c 3f138070 3da1a0ec 3f926adc 3e9cf888 bbf52840 3f6a3b38 -> 3eef1d4f 3d33f6aa 3f868da1", + "3f8b4059 3e615b74 3dc21e18 3f899ce5 bda3696c 3f5353b8 3d3b2d90 -> bdd964f0 3dc21e18 bd3773a0", + "3dc95fd8 3e215f0a 3f7cff88 bd96b9b4 3f8acc74 bc5c5f00 3f4c6112 -> 3e215f0a 3f63c870 bd96b9b4", + "3f17a600 3f8d1580 3f117a1a 3f6c76ae 3e22dd42 3f8cea0c 3eebbc9c -> 3f0b2332 3f117a1a 3f2635e6", + "3daa7f98 3f838cb0 3f890246 3f70eafc 3f39a34e 3e8c2c70 3f3c2a9a -> 3f805340 3f808528 3f6c86bb", + "3f3268ce 3f929da9 3f75b668 3e88f58a 3ec6f7fe 3e04e08c 3d982b94 -> 3f1e34f9 3ec33f3c 3e080bc9", + "3f344002 3dd55944 3f67c124 3f9fe5cf be35c3d4 3e3d31b8 3f83f154 -> bdc0d51e 3ecbc1ea 3f8c36eb", + "be8f438a 3f25cb9c 3e815f26 3f95af24 3f3f294e 3f06897e 3f8e007d -> 3f25cb9c 3e815f26 3f97d56f", + "3f4c71ea 3f42ba04 bcf41eb8 bdd1d860 3e11065e 3e5173aa 3f00e48e -> 3e885714 bcf41eb8 bdd1d860", + "3ed8a3fa 3e8c7e6c bded8994 3ee3df08 3e9a7b00 3f0f883e 3f4d1260 -> 3e8c7e6c bded8994 3ee3df08", + "3e3b425c be62db7e 3f68ae04 3ee439d6 3f8dab30 3ef2b73c 3f95463f -> be62db7e 3f545281 3ee439d6", + "3f54aa76 3f69b8f6 3f6cab10 3db1422c 3f2a87aa 3f2dfba6 3cb6a940 -> 3f353a0f 3f38980f 3d07e195", + "3bde8180 3f1154fa 3f82c65b 3f9d3d00 3f7f8cba 3f6029a0 3f963c96 -> 3f1154fa 3f82a5dc 3f9d30d4", + "3c55c480 3f3d575f 3df5ae88 bb4598c0 3f966d9c 3f5220e4 bd20d7c8 -> 3f3d575f 3df5ae88 bb649881", + "3fa2f2a2 3f457256 3f0ddc19 3f45518c 3f5fc42e bca5f730 3f672a3c -> 3f457256 be355664 3f45518c", + "3f28adfa 3f18018f 3ef282ba 3f63d2ec be4b4886 3f98ba3e 3f9ceacc -> 3d92e660 3ef282ba 3f63d2ec", + "3fa600b3 3e9767f4 3f87ce58 3f39b9ee 3f466144 3e6cbd14 3d7efbb8 -> 3e9767f4 bc789800 be09e4e0", + "3f8df17d 3de610c4 3eeeeb04 3f0db0c6 3f6f5e9e 3f609936 bdfb26e6 -> 3de610c4 3eeeeb04 be48fe6c", + "3e5fb408 3f09f834 3e4b8a10 3f973d94 3f673abc 3f7499fc 3f6b13e6 -> 3f09f834 3e4b8a10 3f8fe0c9", + "be9f43a6 3df677b8 3f10d6bb 3f8561be 3ee656be 3ebd161c 3f42cb46 -> 3df677b8 3f207be0 3f90934a", + "3fbb8cf3 3e9896b2 3db538a4 3f725edc 3f6eb526 3f9951ca 3e930082 -> 3e9896b2 3db538a4 bca209e0", + "3dbc2438 3e9e3244 3f05807a 3e19e7d0 3eade33e 3f930164 be01f91f -> 3e9e3244 3f05807a 3dffa74a", + "3ec1d5f8 be2665a2 bd05f3a0 3f9832c8 3eb46e20 3f468f18 3da485d8 -> be2665a2 bd05f3a0 3f44f138", + "beda91b9 3ccbdb20 3f7557c4 3e17cc90 bc496010 3d6c1b20 3f74ba6c -> 3d26ee86 3fabe3a5 3e17cc90", + "be8847f8 3e7b17d0 3f6ef674 3d99af28 3f8e521c 3f0d2476 3f7b96d0 -> 3e7b17d0 3f847ffe 3d99af28", + "3fa04f2a 3e0339b8 3f5b51e8 be7d5a1b 3f6df5a2 3f571ae2 be1ec68f -> 3e0339b8 3f560a85 be7d5a1b", + "be4604f8 3f6d6208 3f480134 3ea09238 3f874b9a 3f4b922c 3f3b9666 -> 3f6d6208 3f480134 3ea09238", + "bdfba6b0 3eb26bea 3f8d2ef5 be1c2ec3 3f57fbf8 3edc7516 3f95a509 -> 3eb26bea 3f97c261 be1c2ec3", + "be0b12ac 3ec29ea0 3f0c6bb8 3f31daa5 3f63e1e2 3f14c5d6 3c97cc50 -> 3ec29ea0 3f0c6bb8 3f495d63", + "bed47784 3f568a08 be32efc4 3ef49ad0 3eb1bca4 3e0faba4 3f18397c -> 3f85583c be32efc4 3ef49ad0", + "3f8e6571 3eb89db8 3f97de0c 3f2c416e 3f97ba1b bc6f6860 3f899525 -> 3eb89db8 be194a80 3f2c416e", + "3e97f77e bd954b7a 3f8ad504 3e390d2c 3f032f85 bcdb7f40 3f923e52 -> bd954b7a 3f4136fa 3e390d2c", + "3fae5fff 3f8a4c44 bcb7cd50 3c950800 be045858 3f88265f 3f4a8a40 -> bf114918 bcb7cd50 3c950800", + "3f94ff6a 3d6e6310 3e9d9da8 be57b100 3c154300 3f89c7fd bdaba0e8 -> 3a8a9560 3e9d9da8 be57b100", + "bec31550 3f34bd24 3f8afdda 3eeb71c4 3ecf4e86 bde518c2 3ea5a06c -> 3f521c2f 3fc567f9 3f0305f4", + "3fbdef66 3f9550e9 3ed965c2 3f6887c0 3e47e0b6 be1f80de 3f6cefb0 -> be8cb37c bedf8862 3f6887c0", + "3dd507f8 3f36c1b0 3e872eb4 3e02c974 3eb743a0 3e0106fe bda9e686 -> 3f2d4725 3e7fa9be 3dd8b139", + "3f96a0ff 3f8c813c 3e5694a2 3e67d1a2 3ea73c58 3f86d79f 3f9b0c85 -> 3e42e2a0 3e5694a2 3e67d1a2", + "bdc64e30 3f20ed44 3f222dae 3f6d1f2a 3e22c992 3f689e66 3e84499a -> 3f2c918c 3f222dae 3f7dad66", + "3eec43ca 3f9fd72a 3f788a68 be11def9 be28e387 3f11ac6e 3f945474 -> 3f18add7 3f491278 be11def9", + "3fb14f24 3f4d8eb6 3eb84100 3f6cf1bc 3f782cf6 3f8ecd48 3f0b865f -> 3f4d8eb6 3eb84100 3ecbfe14", + "3f2030ac be532219 3f696164 3f66b33c 3f334e3a 3f9fe45a 3da73418 -> be532219 3f696164 3ec6d6ca", + "3f7a4e3a 3f20568c bc8770c0 be2fdba1 3dad6d50 3eb96e58 3f6f7e6e -> 3dc61a00 bc8770c0 be2fdba1", + "3e5e6da0 3f854299 3f9db44b be5ae8de 3e3e0588 3ed595c4 3f7b5f54 -> 3f5af26c 3f870c08 be5ae8de", + "3f496f26 3f0b0cf1 3ca54360 3e8bb564 3f4e9552 3c069200 3f8bfd64 -> 3f0b0cf1 3c305681 3e8bb564", + "bddb2d24 3f8cc254 3f0d02ab 3f1b7137 3f980a57 3ed52558 3f35442a -> 3f8cc254 3f10b227 3f1b7137", + "3f1cf264 3f78cc4c be665046 3f35642a 3f68d5b2 bd960daa 3f5cdec0 -> 3f6f02e9 be665046 3f35642a", + "3ea8ea18 3f3cc5f0 be620358 3f800cba bd30abe8 bcdab0c0 3f204228 -> 3ef5b436 be620358 3f607afd", + "3f975bac 3ec16fd4 3f63abf4 3f08ab92 3ee59f5a 3f50270c 3f908892 -> 3ec16fd4 3f4c9730 3f08ab92", + "3f0038b6 3f243748 3ec1b114 3f925c74 3f7dae6c 3e73aeec 3f1046e6 -> 3f243748 3e9db45a 3f5a5f04", + "3f5e6d2e 3f2ec1ce 3ef12fc2 3e1663f2 3f991240 bcb8b7b0 3f73fec4 -> 3f2ec1ce 3d2cccd0 3e1663f2", + "bed0bd96 3f9a7e54 3ea7c33c 3f06abb0 3e763260 be05fdb6 3dbddc98 -> 3fcceee7 3f03bc82 3f33e650", + "3f9eda01 bc1543d0 3f05c13e 3f19a012 be5c40c6 3e5ee280 3e90d484 -> be878bba 3e13a6ce 3e535d54", + "3eeccca8 3f6956b8 be34e970 3efa8a04 3f5a6b9e 3f543304 be29d2fb -> 3f627063 be34e970 3e3ec960", + "bd739518 3f259365 3f50ab44 3f9593a4 3f705290 3d497d98 3f5885e4 -> 3f259365 3f5c544e 3f98089f", + "beda9fa8 3f0ee749 3f1a8078 3c343060 3f9f781b 3f6c4364 3f71509c -> 3f0ee749 3f1a8078 3c343060", + "3ec9f35a 3e9f94ac be780074 bd2bceb8 3f31a67a 3f495592 3f31e387 -> 3e9f94ac be780074 bd2bceb8", + "3ebc20ea 3f8d8ba6 3e9631ae 3f74be9c be6b3394 3cfb9490 3d605248 -> 3f1d7788 3e4991a8 3f1ff7ad", + "3f98f20f 3ecba47a 3f6853fc 3dbdc708 3ecc0e7c 3f5e7382 3f7d23e4 -> 3ecba47a 3f5c86be 3dbdc708", + "3e7cdc10 3f43365c 3f1b8469 3f0d3a08 3f88f45d 3efe6b5c 3f802170 -> 3f43365c 3f1486f4 3f0d3a08", + "3f3e5a34 3f95a063 3ead9ea0 be5801a2 3f0b753a 3f1719a8 be4bba0d -> 3f346f66 3ead9ea0 be5801a2", + "3e99765a be3ce8fc 3e9003d8 bdb9d6da be548a34 3ec74f74 3f6e08ac -> be43fe20 3e9003d8 bdb9d6da", + "3f635020 3e8b24d6 bd197550 3f6b1f74 be6d132c 3f0a80c2 3d0990a8 -> be3352f4 bd197550 3e07ed78", + "be92728a 3f722c7e 3f958bf0 3f18e8fa be48c075 3f9a165b be0eb805 -> 3fa2e627 3f958bf0 3f4eda38", + "3f661aa4 3eccf6f6 3f28090c 3f5fbdc0 3d21fe48 3f71a0a8 3f77c8b0 -> 3d9bbcac 3f28090c 3f5fbdc0", + "3fb539af 3f9a24c4 3f6abf04 3ef37bc0 3f30c2fd 3b73a800 3ed7bd6c -> 3ef42404 bec087d0 3ecc341c", + "3e8d76a0 3ec0a41c bd88621c 3eb65394 3e6b2f24 be43931c 3f44ed2c -> 3eabe7c5 bdcec624 3eb65394", + "3e1e1500 3eca377c 3f621a94 3f8696c2 3f9a5a76 3f37a9d6 3f05ae9c -> 3eca377c 3f5b8d50 3f7842a8", + "be4f93d0 3ed76ede 3ee22d3c 3efb4ab0 3f22ecf2 3f985fbf 3f4cf868 -> 3ed76ede 3ee22d3c 3efb4ab0", + "3f386308 3f5ff8e0 3e920ec8 3f805ec8 3f320712 3f9b1ffe 3f5aa592 -> 3f3ee14e 3e920ec8 3f654d95", + "3e836d0a 3e97534a 3e458652 3ea7f070 3e931a32 3f5cba54 3f540890 -> 3e963dc8 3e458652 3ea7f070", + "3e84f126 3f7c2424 bc103430 3f53041a 3f9288bf 3eaec9a6 3e9de014 -> 3f7c2424 bc103430 3f30b8b9", + "befc5608 3f82f73c 3f89481e 3dab57bc bcc125d0 3e486852 3f76c23e -> 3fc4ffb1 3fc0980e 3dab57bc", + "3f0b6d76 3e66a19c 3f9e0c45 be48a7d6 3d81a14c 3f5ee64e 3f6ac236 -> 3e0c5240 3f84ab35 be48a7d6", + "3f55cc3e 3f65ec58 3f1a6c3c 3f48c4b6 be1c930b 3f9523cd 3f962d86 -> 3ca6ce60 3f1a6c3c 3f48c4b6", + "bebc2514 3ee171fe 3ef26a98 3f2b27d4 3f8d77c0 3f71a60a 3f6739da -> 3ee171fe 3ef26a98 3f2b27d4", + "3f3f6f10 3e4d5dbc 3f6aa13e 3f3ddb76 3f195aac 3e782172 3f28ea89 -> 3e4d5dbc 3ed32098 3f2e329f", + "3fa6b19a 3eecee50 3f2b5297 3ef02082 3f4425e8 3f91f1aa 3f845b66 -> 3eecee50 3f2b5297 3ef02082", + "becffcb0 3e552430 3e8c445c bcd4e208 3f9eea04 3f94a32e 3f518140 -> 3e552430 3e8c445c bcd4e208", + "bec4c08c 3f2352f3 be570270 3f861b20 3eda3a74 3ec529fc 3f93f6d2 -> 3f3827e7 be570270 3f861b20", + "3e8de3f0 3eb2b5e2 3f2a4324 3df83a8c 3f007408 be41de74 3f8c7f66 -> 3eb2b5e2 3edb4aab 3df83a8c", + "beef2813 3d8bba58 3e9ff52a 3f36d97e 3ec1bbe4 3bebd600 3f664ec8 -> 3d8bba58 3ee8f3fd 3f36d97e", + "3da4e210 3f978cd2 3d85a3ac 3ea96aac be666ee9 bde2ddfa be623c97 -> 3f8907a7 3d513afe 3e92ab84", + "be430044 bd4ece20 3ee39dc8 3f8e8dbd 3f842fd8 be291d96 3f195b80 -> bd4ece20 3f0f882d 3f9b1929", + "3f6ab0a4 3f6061da 3f71a536 bd9e1476 3f8db9af 3f40fce4 3f04d4ed -> 3f6061da 3f4509c8 bd9e1476", + "beb25f70 be7bc233 3dc8477c 3c6c77a0 3f8a2d78 3f97dbff be513eeb -> be7bc233 3dc8477c 3db9a6eb", + "bea07b55 3f9b13cc 3f027f70 3f1cf614 3f676eae 3f95993c 3f66c29a -> 3fa76a2c 3f027f70 3f1cf614", + "3f45a1be 3f798aee 3eef01d4 3ecd71e8 3e7bc2f8 3f903e65 3dce2c38 -> 3ed2f8c4 3eef01d4 3e2d440c", + "3d05fc40 bcf177f0 3e83d7b0 3f381459 3f9ce7e4 3e7e8d34 3e5931f6 -> bcf177f0 3e83b172 3f33d58e", + "3ed83930 3f1e5560 3f0a9c0e 3f056a94 3f00dac7 3e05e76a 3d92c7d8 -> 3f11e25d 3ebc6bc4 3ea9a49a", + "3fb406cb 3f9bd5c4 3d881bb8 bd5f6ab8 bd413bdc 3f9de04a be218734 -> bf0faaa0 3d881bb8 be4c7ae6", + "be3b17e2 3f97a7ba 3e804aca bdf877f0 bdabcef8 3f7298e6 be10d350 -> 3fb55366 3e804aca bdf0f1b3", + "3faf39f2 3e68912c 3f45847e 3f1c82a0 3f60801a 3e2c3d98 3f76d464 -> 3e68912c bd5ed850 3f1c82a0", + "3f9b1222 3f8b8e8c 3f0b9d86 3f8d4594 3f3014b2 3f5563c8 3f32bc4e -> 3f1a4a54 3f0b9d86 3f1cc7f8", + "3e94db40 3f9bf1b2 be21d1fe 3e1a4fa0 3f49b89e 3f14699e 3f462f1e -> 3f8beded be21d1fe 3e1a4fa0", + "3f9694f0 3e19f5cc 3e52be7c 3d3047b0 3f925e1a 3c09d500 bdb51d96 -> 3e19f5cc bcd85ca8 bde49e22", + "bdf3ccc4 be78e637 3f172356 3f87a4d4 3f0d0a67 3dd40a90 3f0a3e87 -> be78e637 3f25f985 3f8f9014", + "3cb2d8c0 3f828bc8 3f9473fa 3f605aac 3f9b353a 3eb70930 bdd4880c -> 3f828bc8 3f923606 3f5ae049", + "bea92eda 3f4565f0 3dbbf160 3f03d791 3e197334 3ec9c3ca 3f65194e -> 3f79f302 3dbbf160 3f03d791", + "3fba480a 3e226794 3f7a5d1a 3ec19b04 3df17a3c 3eab381c bdd843e4 -> 3dcb88db 3d297db0 bea6d64c", + "becb9869 3ea1a9bc 3ea2fc4a 3f7bc3e6 bdb8bf70 3f4d7816 3f3f7665 -> 3ef45061 3ea2fc4a 3f89df4a", + "3fa38f19 3f9a3d18 be52f9fa bde7adac 3ef5c4ec bdbc11c2 bd45edc0 -> 3e8ea6fa be52f9fa bde7adac", + "be711644 bd8ae39e 3f06393a 3f534e2c bce35f30 3f20c01f 3f6150f8 -> bd8ae39e 3f06393a 3f534e2c", + "3f2c1f58 be0b3a34 3f472cea 3f3e5f68 3f5d4570 3e888600 3d8dc5f4 -> be0b3a34 3ede4f73 3e949495", + "3f76e612 3f5cc63c 3edcf84a 3e3b6c7c 3f8272a2 3eca8e06 3d8451e0 -> 3f5cc63c 3ecb35a0 3d8cf131", + "3ee0b1da 3f1769ce 3f924b64 3f86c131 3f4e0c82 3ecbf132 3d337c90 -> 3f1769ce 3f50ef5c 3f1c2806", + "3f6be502 3d43caa8 3ec19a8c 3f6b7a58 3e719074 3f31782a 3f82501e -> 3d43caa8 3ec19a8c 3f6b7a58", + "be4ade28 3e508f80 3f4d7f58 bdd5adf8 3f74dbee 3e874d14 3ee51eac -> 3e508f80 3f68ce84 bdd5adf8", + "3dd179d0 3f4a513a bc26e0d0 3e974546 3e926a2c 3edb7b4e bc7579e0 -> 3f3d1c8d bc26e0d0 3e870378", + "bd310108 3f1cc55d 3f742f2c 3f35fd33 3f4336c4 3f918b74 3f3e8922 -> 3f1cc55d 3f742f2c 3f35fd33", + "3f1ef7a8 3f21a272 3f82e5e4 3ed5b108 bca70f48 3f161931 3f8815e0 -> 3e6817a6 3f406f80 3ed5b108", + "3fa0a330 3e197e92 3f897288 3ec1c2a4 3f52cad6 3e9a3104 3f1f3635 -> 3e197e92 3dd54990 3ec1c2a4", + "3ec1b0f6 3f60fcce 3d190de0 be3fdaac bdf2fc38 3f5dfae6 3b1f4680 -> 3f00623e 3d190de0 be3fdaac", + "3f9e1063 3f67324c 3f01dfc0 3e89aed8 3f9c1d79 be43c93e 3ef26f9c -> 3f67324c beb5e4e0 3e89aed8", + "3f3f49be 3f2c9e1a bd282dac 3f392d58 3f4e6142 3cc2e340 3f22bc9a -> 3f2c9e1a bd282dac 3f2868c4", + "3f6e01e8 3f83d9c8 3f3a71bd 3f3a1469 3f6d8d58 3f226395 3ec55d46 -> 3f6f63d6 3f241466 3ed1a649", + "3eb52ee6 3e29fdae 3f9560a8 3f366a41 bdfad6e0 3f1cf3e3 3f6f1198 -> 3d82e7eb 3f789334 3f366a41", + "3f9285b4 3f2a9e4e 3f25f3dd 3f21964c 3ca38050 3efbd3b6 3f4a212a -> bd96b998 3ef03d40 3f21964c", + "3f91a01a 3e87d812 bdcff740 3c2324a0 3f070b80 3eade7e8 3e05f5e8 -> 3e87d812 bdcff740 3c2324a0", + "3f4d020c 3f5d67ec 3f67b3f8 be6e59b1 3ce02d00 3f9e3ccc 3f5620f0 -> 3e46d874 3f67b3f8 be6e59b1", + "3fa630d4 3f0f1f22 3eabe9d8 3e504c7e bc8d15f8 3f5df0a4 3ed24dfc -> be41b528 3eabe9d8 3e504c7e" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_light(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3ef73254 3f171e6e 3f4e6d2c 3f8bcae8 3ee4339a 3f4a2636 3f73aec0 -> 3f171e6e 3f4e6d2c 3f8bcae8", + "befaab31 3f0f8948 be21a3ce 3f09453f 3f482d40 3f8c4db9 3f8c08a4 -> 3ee79c90 bf45936e 3e86b7c0", + "3f050a08 3f1470a5 3eef0fac 3e1a0766 3d36fa18 3b989400 3f6a300c -> 3f1470a5 3eef0fac 3f0c3304", + "3f1174aa 3c4355c0 3f3200ac 3f8cd1de 3f207a4a be1c3d5e 3f913fa8 -> 3eb8ff95 3f3200ac 3f8f5612", + "beb6ace1 3d7fef18 3e360cb4 be59ed38 3f5ff938 3e03e8ac 3e76f51e -> be68d4fc 3e360cb4 bebfe552", + "3f888912 3eaf27d8 3e2bdb0e be2c3933 3f4ccdbe 3edb9d76 3f37c1bc -> 3f549ee4 3ee4879e 3f46e19f", + "bdc163d4 3f501cec 3ef648a8 3efda852 bde10ec4 3f7e0fa8 3eab0372 -> 3f501cec 3edd8f0a 3efda852", + "3fbc7453 3f8f368a be49baea 3f9813d8 3f1cbf7c 3f3ef6f1 3f97cdb0 -> 3f8f368a 3f987cfe 3f9813d8", + "3e8ad83c be0e4e02 3f9ef90a 3f88cfc2 3f31358e 3f8897b8 3f934051 -> 3db10470 3f9ef90a 3f8ba481", + "3e283720 3f6a13e0 3eff811c 3f941a04 3f37a146 3f1a5400 3f56f9ec -> 3f6a13e0 3f041e2d 3f941a04", + "be3b66d2 3d491128 3d8c8130 3efd43c8 3f53626c bd591af0 3e7ce370 -> bdbe8cfa 3d8c8130 3efd43c8", + "3edd2bc6 bd123a7c 3eb59f26 3ef93846 3dd707fc 3f0cfd98 bdf97a88 -> 3ccd6dd8 3ee0f975 3ef93846", + "3dbb6928 3dff8f3c be1a8bf4 3c4e6ec0 3f22033a 3e9c43d0 3eb17908 -> 3e2f63a8 bddf9c1e 3d30cf02", + "3e10d244 3e3412c2 3c548c20 be119f41 3f1c9f4c 3f51411a 3f872a27 -> 3e733564 3e01c84a 3cdf3400", + "3faeb0b4 3f9db1e3 3f16a020 3ed879c2 3e0eeea8 3f3e87cd 3f7dd1c4 -> 3f9db1e3 3f4d1626 3f997620", + "3f6d255a 3f7c0120 3ee30b96 3f84ae88 3f0c88a0 3f306284 3f909056 -> 3f7c0120 3f2bc14e 3f8fb050", + "3fae601a 3f232281 3eaa06c0 3eaca91c 3e8863b0 3f82d7f9 be481e17 -> 3f232281 3fa2d94e 3eaca91c", + "3f0d82a0 3eccc714 3f64fa4e be2987cc 3d432170 3e78f59c 3f80daa6 -> 3eccc714 3f64fa4e 3ef6fff6", + "3faa5d97 be470828 3ec61368 bd13cde8 3ec25a6e 3ee1c91c 3f0ce75d -> 3f11cf27 3eeaf4fe 3f3e9908", + "be42d24a 3f8217b9 be3e82f7 3f9b92ab 3f873ae5 3e0bfbaa 3f1fb5d9 -> 3f811d81 be7d63d3 3f9b92ab", + "3eb52cc0 3f27d738 3e6772b0 be2a1597 3f5dbf64 3eef37b0 3eab2e8c -> 3f3aea82 3e9f6c4d 3c33fbe0", + "3f6282ea 3f6e4ed0 3f4543a0 3dc36b9c 3f85c893 3f802dea 3eb7ce2a -> 3f84192b 3f798d36 3ea842ab", + "3f1c0050 3f71a5d4 3ead3da8 be21d9b4 3e8094cc 3f9e0e3c 3f724fa0 -> 3f71a5d4 3f6277ac 3f03da9b", + "3f892cc6 be460fa6 3f5299ee bda524ba bb020a80 3ea872a0 3f6a1794 -> 3c404ef0 3f5299ee 3f7c59e9", + "3f7e9968 3e89483c 3ebe5e70 3eeb781c 3f22b108 3edc8542 bdce767c -> 3f222d4a 3edc5b06 3eeb781c", + "3f945d8d 3ed63b44 be7f7235 3edce564 3f8350c8 3ed83c0c 3dad5194 -> 3f8fafeb 3f077ade 3edce564", + "b9b3c400 3f5dc614 3f8f2ad7 3f159c10 3f3088ba bd6ffb88 3f267856 -> 3f5dc614 3f8f2ad7 3f159a95", + "bece9104 3f39c06f 3f8fcde1 3f0e2b64 3e1b89ca 3f6d6638 3f362d9f -> 3f39c06f 3f8fcde1 3efc0e53", + "3f21ced8 3f2742be 3f950f99 3f1e416e bde4ebc8 3f2b7fb0 3f957791 -> 3f2742be 3f950f99 3f772c56", + "3ec471dc 3e1851a4 3f62b166 3e23807a 3ea43264 3e56d792 3f5673e8 -> 3e5be020 3f62b166 3ed6f297", + "3e4d810c 3eacf6c2 3f2916e1 3ef351ae 3f0ffe72 3f1ca56e 3f0dd403 -> 3ec40c3b 3f2916e1 3efb6a0c", + "3db24028 3f744440 3f15bf58 3f0ef53b 3e0ce420 3c67cfa0 3f4c6970 -> 3f744440 3f15bf58 3f144e81", + "3f63da3e 3eff26ea 3f93c855 3e6f3a56 3f40dc68 3ee00722 3e14c4c6 -> 3f39aecc 3f93c855 3e6f3a56", + "3f97e742 be27eefb 3f8818a2 3f633f08 3f804f2b 3e2aec46 3f764474 -> 3f9c30c1 3f8818a2 3f79d1cb", + "3ee9d9c4 bc8b76f0 3e32efc4 3df37c40 3f7b4a62 3f880237 3f4c016c -> 3ee0d036 3f148b19 3edb6c7e", + "3c8b8260 3e5a1388 be2df5cb 3f56e400 3d860658 bdbd3324 3e229476 -> 3e5a1388 be2c9bcf 3f56e400", + "3f8ca9aa 3ea8bfb2 be42cf30 3f8014bf 3ecfc0e4 3df42d88 3f5ec704 -> 3ed39cb4 3e197060 3f8014bf", + "3f8455f8 3f7b20bc 3f9688c4 3f513cc8 3f82d92a 3ee28570 3f02ad4e -> 3f8306fd 3f9688c4 3f513cc8", + "3e2d25fc 3f58e59c 3f5669ce 3f4f601c 3e47a972 3f578f90 3f79045c -> 3f58e59c 3f569b7a 3f566aa7", + "3f4b7ff4 3e240d9e 3e4216cc 3ecfdd4c 3e4e6b40 be7e5ff1 3ecf3d42 -> 3e45bb0a 3e4216cc 3ecfdd4c", + "bdf4b9e4 3f89870f 3f24ea94 3ee0373c 3e8f53ec 3f9e460a be3c8e6a -> 3f89870f 3f12cc13 3ee0373c", + "3f5785e0 3f807288 3f918ac5 3eb17bc8 be4f2a80 be220a42 3f5130b6 -> 3f807288 3f918ac5 3f3e2550", + "3e2d6848 3e7ea9a0 3f0d32be 3f9acc08 3ebd836e 3d1541e0 3f9166f8 -> 3e89dc85 3f0d32be 3f9acc08", + "3f277f08 3e7862fc be61f06d 3f8f6b38 3ea19416 3edf4186 bcb42f18 -> 3e94a75c 3e560895 3f8f6b38", + "be8c5ed2 3f5ec682 3eb075b2 bd3ba5e0 3df0ed6c 3e5ca188 3f1d7262 -> 3f5ec682 3eb075b2 be686fbc", + "3fb00c6a 3e904de8 3e0484aa 3efc10ba 3ee96d48 3ee3a1d2 3f3ed2b6 -> 3f0570d8 3f101aa4 3f5724e0", + "3fa555b4 3f735444 3e5a88e0 3e16d3f0 3f401222 bdc162d4 3e6071a6 -> 3f735444 3e5a88e0 3e75ea87", + "3fb0e5ff 3f6352f4 3ee4ad2c 3f8a6c8c 3f7713e6 3f04d0b2 3f2b6f4d -> 3f7e9fbf 3f0bdfb0 3f8a6c8c", + "3f1bf1d2 3f1d66b0 3f114530 3f9b6ff6 3f0ceb50 3f8b3eef 3f1647f8 -> 3f1d66b0 3f626c59 3f9b6ff6", + "bea503da 3f0adab1 3e11e108 3f6e17b4 3f60550c bd441ad0 3eb0e1de -> 3ede9c3c 3e11e108 3f6e17b4", + "3fba57a3 3e304654 3eef1f64 3f950589 3f578336 3e0fecdc 3f459eb8 -> 3f92d40a 3eef1f64 3f950589", + "3f0e5b4e 3f50e1ac 3f392172 3f50b7ea 3e8f9a3c 3f81210e 3c00dcc0 -> 3f50e1ac 3f61cba5 3f50b7ea", + "3fbcf7b3 3f92f221 3dfb6444 3ece1390 3f7257b0 3f99018b 3ea63a82 -> 3f92f221 3fda6684 3ece1390", + "3f872ad8 3f4fdbfc 3f072872 3f93e5aa 3f1b530c bdbbaa00 3f75e200 -> 3f4fdbfc 3f072872 3f93e5aa", + "3d34cc40 be375825 3eef3a92 3f8fde8a 3f9a0aa9 3f8fd5be 3f98eac5 -> bdf1b65c 3efe1094 3f9044c7", + "3ee8ae54 3f9d6372 3f956703 be01bd3d 3e0355ec 3f92e84a be573c75 -> 3f9d6372 3f956703 be01bd3d", + "3f9dae03 3f8c11df 3e18a004 3ca3c640 be2f10fe 3ea88908 bdcaa7f4 -> 3f8c11df 3ebdeb53 3ca3c640", + "3f314894 be6bd11b 3e8e1bd6 3f96feae 3bdd9f00 be6ab146 3d4c3310 -> bd876dbc 3e8e1bd6 3f96feae", + "3f259cce 3f9833a0 be770107 bc73f560 bc91f118 3f87de5c 3e092b9e -> 3f9833a0 3f19fd90 3da6b5ea", + "3f539f9e 3bc21480 3f70fad6 3ea76f96 3f914b52 3d816f44 3f04322d -> 3f707aa2 3f70fad6 3ef795c8", + "3fb21394 3e527a06 3e8ef22e 3f118234 be4f3600 3e91d8bc 3f8f1da0 -> 3e527a06 3e92fb3d 3faaa488", + "3f8fd028 3e0401c0 3f62ad22 3f07174b 3f54463c 3f4f36fe 3f438326 -> 3f6a6bf3 3f62ad22 3f4afa0c", + "bedd04b2 bd770a18 3f98dfdb 3f725a14 3f8d2be6 3f65125a 3f8d85e2 -> bf0ffc60 3f98dfdb 3f60c902", + "bee4564b 3f944724 3f91b043 bdd4d7e0 be27b08e 3f67e5fc 3d5cd4e0 -> 3f944724 3f91b043 be3280f2", + "3f737f72 3eea5a58 3f716668 bd65ae28 3c82d380 3f2278d4 3f39d910 -> 3eea5a58 3f716668 3f301218", + "3f6b3c4a 3f9fca6a 3eb8f650 bd277420 3f3c6750 3e3a1fc8 3f647d5e -> 3f9fca6a 3eb8f650 3f511b93", + "3f69de6a 3dfc94e0 3f3518e0 3ece5478 3b05bb00 3f1ec7c4 3f319978 -> 3dfc94e0 3f3518e0 3f2b2a25", + "bed2c88f 3f7f3b20 3f215db7 be5f04a4 3ed6371e 3f292668 3f905edd -> 3f7f3b20 3f1e295a bf459426", + "3e6b012c 3ec83120 3ed83a62 3f9b0f52 3f210663 3f506df2 bdf73ac8 -> 3ee4286c 3f0322d7 3f9b0f52", + "3f87e22e 3f98a35e 3eaae45a 3f102fa0 bd9a0eb4 be5957ab 3e72c418 -> 3f98a35e 3eaae45a 3f102fa0", + "be7ac7c8 3f15448e 3f3cd156 3def83dc 3eed14d0 bd171988 3e6be354 -> 3f15448e 3f3cd156 3db6a23d", + "3f614f90 3e391e9c 3f3e3ac9 3f8ac710 3d11e380 3f1c33d6 3f45aacc -> 3e391e9c 3f3e3ac9 3f8ac710", + "3f47ed66 3d804578 bdb4cdce 3f58fb0c 3f9ca936 3f591b54 3e88b9fe -> 3f7834b0 3f249a4e 3f58fb0c", + "3f24a5b0 3f982efc bb15e580 be127c49 3f1e1a00 3f4364b6 3f91c9c5 -> 3f982efc 3efaeafb 3f2e75c4", + "3d987eb0 3dfd3594 3f8b7d4e be30e1bb 3f151dae 3e53a1cc 3f8ffd20 -> 3e21972d 3f8b7d4e bd9be0f9", + "3d548c10 3f924630 3f6a4e5c 3f9a4894 3ee53000 3f25c4e6 3f43148c -> 3f924630 3f6a4e5c 3f9a4894", + "be60fb22 3f6de268 bdfb7bee 3eafd056 bd3c5e38 3eb6dbb8 bd21ec84 -> 3f6de268 be69b82d 3eafd056", + "3f80d408 3e302f9c 3f773494 bd494428 3e423b00 3f9c2a03 3f157e46 -> 3e4258e4 3f9c5ff3 3f168abe", + "3f313374 3eface78 3c23e360 3f8c3834 3ee65362 3eaeca94 3eb55f98 -> 3eface78 3e752187 3f8c3834", + "bed8fd75 3f67402e 3f80e348 3f34008a 3e1d2d8c 3f65b08a 3e97f6f8 -> 3f67402e 3f80e348 3f34008a", + "3d750680 3e7c5fac 3f6469e4 3f06ba6c bd4a9910 3f414874 3ecb56b4 -> 3e7c5fac 3f6469e4 3f06ba6c", + "be1d6d02 be04999e 3f4378c4 3ed3bfc8 3e1fdb6c 3f6db254 3f0d0dd3 -> be318fb2 3f3cfaf2 3ec8eeb5", + "3fb7bc88 be00e7e2 3f902dea 3e123bb4 3e7251b0 3e94f7f0 3f450ffa -> 3ec9fb99 3f902dea 3f8579eb", + "3ebdb864 3f27bece be0f7cfe 3f9fb728 3d65f9c8 3e219300 bdc68054 -> 3f27bece bcf395cc 3f9fb728", + "beee4f64 3df64f90 3f63e7a0 3f86775d 3f35bd50 3f69e5bc 3eeb837e -> be1de25a 3f611d93 3f86775d", + "3fb34d53 be34d541 3f2cb152 bc31eba0 3e5c2e4c bd816894 3ec4d60e -> 3ebe73fa 3f2cb152 3f0afa5e", + "3ea6cf08 3efe2d96 3edd2108 3d332d68 3f29b2f6 3f86d0fc be13e75d -> 3f0cf8a8 3f22637f 3d332d68", + "3f5f4d88 3f90b55e 3e9ee338 3f955b7b 3eb66926 3f46eb82 3f822b94 -> 3f90b55e 3f37a8fa 3f955b7b", + "3f7476d0 3f484924 3f074c1c 3f927b6a 3eb1c766 3e79ed90 bc84d550 -> 3f484924 3f074c1c 3f927b6a", + "3f955fc4 3f8fc891 3f1cf12a 3f32398a be70cda3 be22cfac be6564c5 -> 3f8fc891 3f1cf12a 3f32398a", + "bedd61c1 3e4eaa0a bdc54b20 be69dc9a 3dd54858 3e0a93cc be5da1f7 -> 3e4eaa0a be49381d be6f263f", + "be93954e 3f2d903c 3f743b78 3f24aca6 3eb58590 be4f58cd 3e7ca050 -> 3f2d903c 3f743b78 3f24aca6", + "3e1ca674 3ea8ec08 3f911be2 3dd445f0 bde82e36 3f316a96 3dacd700 -> 3ea8ec08 3f911be2 3dd445f0", + "3e62b2ec bdd4d656 3dc20bf8 3f8f13f0 3f71578a 3e1a46c6 3f1e7dfd -> 3e02dc09 3ddb6593 3f8f13f0", + "3f2a078c 3f88cfad 3f18f94c 3f25e660 3f7655e4 be2e8298 3f3a7ece -> 3f88cfad 3f18f94c 3f339434", + "3f3d004e 3e206c00 3f92970e 3b0b8780 3ec88d20 3f7bbfa6 3f2eb11a -> 3ea90e78 3f92970e 3f011d7a", + "beb8bd98 3f5310a4 3e80945a 3f9f1076 3e49465e 3f7cb140 3f02b071 -> 3f5310a4 bc6c2880 3f9f1076", + "3f0eced2 3f3ab966 3eaf6196 3f90692f 3ecbc2fe 3f710bf0 3f4279cc -> 3f3ab966 3f2d3d3e 3f90692f", + "bdbd1ccc 3f878a8f bdc4f834 3ed2a304 3f9e09a0 3ed4330a 3f09225a -> 3f8576c4 be12c494 3eccc2d3", + "3f7a9682 3dda1164 3f9f6324 3f246ce4 3f9be539 3f44a944 3f4f9efc -> 3f98e344 3f9f6324 3f4eb535", + "be89b7f6 3f9e84d3 be180b26 3f3eb3aa 3f75aaf0 3f26e9c6 3e3f2294 -> 3f9e84d3 beba436e 3f3eb3aa", + "3e8636da 3f8bfba9 3f90037a 3efe0be4 3ed3c0e0 be10c9ce be2e55d3 -> 3f8bfba9 3f90037a 3efe0be4", + "bd422bb0 3ba440c0 3f451400 3ea0e8c8 3e0d4dae 3f9c0282 3ebef5da -> baa93f94 3f3fa11c 3e9f7c17", + "3e980fb4 3f7dcd24 3f573a06 3ed0669e 3ea34c42 bdd38a04 3e7b2014 -> 3f7dcd24 3f573a06 3ed0669e", + "3eea2692 3e8307cc 3eb36810 3e6a1c90 bcff0090 3f731174 3ebd8034 -> 3e8307cc 3f1fd748 3e962fce", + "3f523faa 3e76ce50 3e087ad0 3f303690 3d222280 3ea5624c 3f7bf0bc -> 3e76ce50 3e9405d4 3f6e681d", + "3fba13dc 3ceb40b0 3f9525c8 3f1232d0 3e9c97f2 3ee96f9e 3f050aee -> 3edcf93a 3f9525c8 3f1232d0", + "bebabb8e 3e66c914 3d9fc400 3f547708 3f4ca442 3e40903c 3f535520 -> 3c835100 3d1b25b5 3f547708", + "be2ebd44 3e858660 3db402d8 3ec8099c 3f015b07 3f988050 3f8d430e -> 3e605345 bdcda53c 3e89c034", + "3f1def3c 3f0652ec 3c8fd9c0 3e4761d2 3e22f060 3f35aa71 3f193634 -> 3f0652ec 3ee39844 3ee33b18", + "3f97b89e 3ec5ea9a 3f603dd4 be1b3af4 3f2553de 3f238a32 3ec3d034 -> 3f31a096 3f603dd4 3ef67c48", + "3f48997c 3f6cee78 3f8b003f be72975d 3f30d6f0 3f79bd18 3ebba99a -> 3f6cee78 3f8b003f 3e719a5b", + "beeb2652 3cb77100 3f26101c 3ed6c774 3f02ed67 3f4b6afc 3efce67a -> be4f10ea 3f14e81a 3ec5455c", + "3fbca043 be51869a 3d431c18 3f48c722 3ec3610a 3f90b550 3ec154bc -> 3f28c4f0 3fd25c30 3f48c722", + "3f56b422 3f65ccc2 3e01696e bdd380fa 3f7f0d5e 3f95ea5e 3db325ec -> 3f7afa89 3f80576f 3d6842d8", + "3fa47dfb 3ee77556 3f3b45c4 bdc57cdc 3f4c99dc 3e45b418 3f08c966 -> 3f65f01a 3f3b45c4 3f36d25c", + "3f1d1ba2 3e80ffb8 3ec1554c 3f88420b bd0bc760 3ef9629e 3f0ea1cb -> 3e80ffb8 3ee3bb84 3f88420b", + "3e2dd218 3f1e6eb0 3f833a5d 3f65ceb2 3f951fbb be14f425 3f845244 -> 3f362a65 3f833a5d 3f6bb878", + "3e939288 3f140c13 3ea0d444 3c68d600 3f421f92 be7b0910 3f9ab602 -> 3f2153dc 3ea0d444 3eb78bf2", + "beecfb73 3f35a622 3f8ee524 3f71c994 3f86f42e 3cee01f0 bd6eb570 -> 3f0ccc43 3f8ee524 3f71c994", + "3f6d567c 3f95652c 3e8826aa 3f76538a 3eb3fbe8 3f9ad4ec 3eca3754 -> 3f95652c 3f9206a5 3f76538a", + "3f6428a6 3f6b871c 3f78430c 3e29b3f0 3ec972a2 3f890449 3e80df6a -> 3f6b871c 3f879d87 3e782b9e", + "be035fa4 3eb3cb42 3e7f04be 3f8a66f3 3f8888e2 3e9b8068 3efecc0a -> 3e84cb40 3e77d604 3f8a66f3", + "3faa7465 3e2b6e8a 3f91d686 be5616db 3e40bd28 3f135d60 3f0eb305 -> 3e47ce54 3f91d686 3f4fc811", + "3f63ccf8 3f02e05e be0515f4 3e256cb8 3e5504fc 3ebb1a44 3f2e9688 -> 3f02e05e 3e9f29a1 3f1fe97b", + "3f44db20 3f026164 3f97bd93 3f104182 bdd73706 3ec711be 3f4c3876 -> 3f026164 3f97bd93 3f3e5de8", + "3f85adfb 3f182716 3f8c9b2e 3deb320c bd8656b0 3f34fc50 3f7fc3a4 -> 3f182716 3f8c9b2e 3f84e77c", + "bcb53fc0 3f1e0918 3f8e7dd6 3f9e6b4c 3f79afda 3f31aea4 3f725246 -> 3f1c01fa 3f8e7dd6 3f9e6b4c", + "3f553e48 3ec0cc92 3f6bd940 bdb18aae 3ec498ec 3f8b3453 be7eecf6 -> 3ec3f685 3f87a675 bdb18aae", + "3d388fe0 3f598888 be7bb8cb bd843f72 3ee8f6e0 3f51d92e 3f13b9b8 -> 3f598888 be4a8ea4 bd121364", + "3fa502d2 3ea08c14 3e8918ca 3f6bf8a6 3f951bab 3f732d90 bd0d6604 -> 3fb49df2 3f92d600 3f6bf8a6", + "3f6e4610 be562541 3f6d1408 3b7a2000 3f8f3089 3f4eef60 3ede3272 -> 3f836bcf 3f6d1408 3ecef259", + "3fade4d9 3bdf6b40 3e32125e 3ef722c8 3f6bde7e 3f7c4444 3f99dad2 -> 3f9fe81a 3fa3608a 3fbaddce", + "bea56260 3c687960 3ecce5b0 3f42ccaa 3f0d2039 3f4bf3b4 3effbc74 -> be231eee 3e8b52a1 3f42ccaa", + "3f9469b4 3f8c1248 bd908e80 3f3ab9ba 3f919191 3e3027ac 3e88788c -> 3f9271ff 3e57c62a 3f3ab9ba", + "bdc28a0c 3f186f48 3d86ef90 3f87bc43 3f7e8116 3f3b28a5 3f969d15 -> 3f0ebd37 3b30e400 3f865276", + "3e8fd444 3f9f629c 3f946a45 3f03eb65 3cef2880 3f112b8a 3e879ef2 -> 3f9f629c 3f946a45 3f03eb65", + "3f1fb798 3f548d36 3f33e6ae 3f489cf2 3f8aca75 3f200415 3f758920 -> 3f7d1fa2 3f33e6ae 3f64a3da", + "bdce7e80 3f8f0cc6 bdb6a020 3eba2e38 bdc6312c 3f374b66 3f8a0aff -> 3f8f0cc6 be2e71a1 3e954756", + "be739f52 3f3f25d8 3f064066 3f9d9ef7 3ec5caec bda91868 3f571438 -> 3f3f25d8 3f064066 3f9d9ef7", + "3f3714be be11656c 3f2c18de 3f96aeb4 3b8dcf00 be661219 3f4c0b82 -> bd18fb42 3f2c18de 3f96aeb4", + "be10bc6c 3efb3c9c bb8f5dc0 3e8b4dec bca6fab0 bc7c4fc0 3e1b5374 -> 3efb3c9c bb8f5dc0 3e8b4dec", + "be17837a 3ef40f04 3f990e64 be49c71c 3f4c05d4 3f0eb326 be7b8454 -> 3edbcb75 3f990e64 be49c71c", + "3f4dc7a6 bdc27050 3ee4c2d6 3f57473c be708b05 be1b6f52 3e0e75e4 -> bdc27050 3ee4c2d6 3f57473c", + "3e28a760 3ec52848 3f08ad76 3f6493ce 3ecc9d2c 3f2cbb42 3f973d12 -> 3ec662ad 3f0e9d9e 3f70bfac", + "3f4bde16 be60c8c2 3f5b3f8a 3f54794c 3f19889c bdb41314 be60e220 -> 3edda5c3 3f5b3f8a 3f54794c", + "3eabf350 3f95255c be223f68 3f9638d8 3ef6794c 3f2d4122 3f975d64 -> 3f95255c 3df9f874 3f969b18", + "be0f5e38 3f14239e 3f96d7db 3f56dfa0 3f1c29ce 3f55f54c 3f977ce9 -> 3f130404 3f96d7db 3f4a89dc", + "3fb7f875 bcc91190 3db0b164 bc306830 3f96aba8 3ed0dc12 3f829ea5 -> 3fd9ed90 3f0c6f9f 3fbc56a1", + "beb7e4e5 3f3633cf 3f211328 3f547994 3f0f537f 3e616ae4 3f0ab0c8 -> 3f3633cf 3f211328 3f547994", + "3edb4488 3db6e9ec 3e6453b4 bd582c68 3eca6b12 3f9cabba 3dced3f0 -> 3e61a9f9 3f26d3af 3c5638c8", + "be388408 3eb5e288 3f6ad58a 3f08a099 3ed7c614 3e538ac4 bcafde80 -> 3eafc746 3f6ad58a 3f08a099", + "3f9ef5ae 3f1afdc0 be492f4c 3f851264 3f8b62fc 3f9fc028 3f44f1e2 -> 3f9a5b3e 3fcc78f8 3f851264", + "3f9eb993 3f05295e 3f173aed 3f2c314e 3f410f94 3c228b80 3e8ae228 -> 3f4f7060 3f173aed 3f2c314e", + "3dd649b8 3eecb9fe 3dbfc0e4 3f95f493 3e5399a4 3ec813fe 3f52e4a2 -> 3eecb9fe 3dff6dbf 3f95f493", + "3e1c2204 3f349ac8 3f246267 bd10bbb4 3f5c9dd8 3f551f54 3f768d70 -> 3f3ab494 3f2bd0ce 3def68c0", + "3f7e5d94 3ed68144 3f349dc6 3f017445 bd474a80 3f4abc3e 3d499a50 -> 3ed68144 3f4a9817 3f017445", + "beb76fdb 3f135efa 3f852a65 3f388d88 3e6369a2 3f82df73 3f242356 -> 3f135efa 3f852a65 3f388d88", + "3f6cefd6 3f61da02 3f064bec 3f6425f4 3f76cd44 3f8a34b5 3f84a82a -> 3f753de4 3f84ea20 3f8345eb", + "3fadb82e 3f12dd6e 3f1cb772 bd1035e8 3f886c59 3ecf38d4 3f112a25 -> 3f9eec27 3f1cb772 3f483bfe", + "3faeeca5 3ed2a38c 3f533084 bcbafc30 3e2983f0 3f873239 bd857e9a -> 3ed2a38c 3f920c48 bcbafc30", + "bebae8b7 3f914e93 bdaa17b4 3f0d843c 3eef9be0 bce51220 3dc706dc -> 3f914e93 bdd347b3 3f0d843c", + "3faca958 3e9b46a4 3e4d6e7c 3f9e0600 3f1e4b1a bd89f5a4 3f2b9281 -> 3f3a6f7c 3e4d6e7c 3f9e0600", + "3fa1d5da be07a610 3ea59ca2 3f92e84a 3f805af6 3f969e8e 3f7a31ea -> 3fa6c44a 3fb37d4e 3f92e84a", + "3fa59778 be2066b3 3e94ef46 3e0aca9a 3e0c7f50 3f3b6f80 bd32cea0 -> 3e64dddf 3f5c9cd4 3e0aca9a", + "be8fdcc9 bd0dbba0 3efccad2 be461a4e 3f9bad3a 3ee9a654 3f37cb26 -> bec5a9e2 3efccad2 bee62b07", + "3f94d33c 3eb71dc4 3db50dc0 3e7bfd54 3f5b91fa 3f306f7a be79a6fc -> 3f7065b7 3f497572 3e7bfd54", + "be0eca12 3e256f4c bca1ebd0 3e4a3660 3e636c78 3f92cbd2 be31773d -> 3e1cca75 be3ad1da 3e4a3660", + "3e669188 3e80c468 3da2bc5c 3ed35620 3f9093aa 3e54790e 3bc2c400 -> 3ee5fcd9 3dddc6b2 3ed35620", + "3f9c79e2 3f604566 3e2b4658 3da570e0 3efacfde bddf91d2 3f78f0d0 -> 3f604566 3e2b4658 3f95dc61", + "bd4abf00 3f74f638 3f96c94a 3f26f0a4 3f39ee22 3f99e3ae be31f04a -> 3f74f638 3f96a1f8 3f26f0a4", + "3f58b4ce bc74d9e0 3f26d13e bdd6e078 3e733688 3f789ba8 3f532918 -> 3e4b8877 3f6c0dcc 3f2ea065", + "3f89b1ab 3d787018 3f981287 3f95225b 3f55d7dc bdf678d8 3f5ed1ec -> 3f64dcd0 3f981287 3f95225b", + "3f8f2c0c 3e283774 3f24ce5c be273384 ba963200 3eec8b3a 3f9a4304 -> 3e283774 3f24ce5c 3faf0626", + "3f4f0ca4 3f95e811 bdad7636 3df1505c 3f0c61b4 3d0a5710 3f975d88 -> 3f95e811 3c363470 3f7a9cc4", + "3ee10ef6 3d55e0d8 3f4b9cf4 3f3eecfc 3f98e824 be7f86f3 3f48b3b0 -> 3f0deacc 3f4b9cf4 3f433917", + "be14376e 3f2d864e 3e890e40 3f2459b4 3ef90534 3edcb8e2 be0f4eb2 -> 3f2d864e 3e79e41e 3f2459b4", + "3f165332 3e6ab222 3e29a598 3f679014 be748c7e be17846d 3ebf79f4 -> 3e6ab222 3e29a598 3f679014", + "3f0e8b22 3e91886e 3f10bd86 3ef47274 3efb037e be040865 be630786 -> 3ecc4405 3f10bd86 3ef47274", + "bda6d060 3ef9000a 3f837cf2 3f706bee 3f2ff637 3f646e06 3e68938e -> 3ef09de8 3f837cf2 3f706bee", + "befa3d75 3e12206a 3e2d5ee6 3f640794 bdf76af2 be278712 3f328c77 -> 3e12206a 3e2d5ee6 3f640794", + "3f50b4c0 3e011cf4 3ee3b2d8 3f43324c be605b51 3f8c2cda bdaba74c -> 3e011cf4 3f799736 3f43324c", + "3f4184cc 3f7fe7d4 3eed33f0 3f0984d4 bd8bcb9c 3f0efe16 3f94bea1 -> 3f7fe7d4 3f090a1a 3f81390d", + "3f98668f bca41248 3c967840 3ee89d12 3f90902e 3f417590 3f99ec92 -> 3fac9c27 3f657124 3fac2e4d", + "be7a8928 3efb1a74 3f73edc4 3f864632 3f49ee6a 3f620770 3f0e9571 -> 3ed5ba8a 3f73edc4 3f864632", + "bec4f431 3f9f88d6 be71de01 3f90e520 be6ffd5a 3f6d3084 3f873065 -> 3f9f88d6 bf2ef7c8 3f90e520", + "be94080f be046f97 3f7706ee 3eeb3126 3cd48680 3f8e5984 3f1f38dc -> be326836 3f6c2297 3ed31f2c", + "3f50caec 3ea0bfdc 3e1b9c6c 3f016fac 3dab7f84 3ea14f44 bc1c38a0 -> 3ea0bfdc 3e91e942 3f016fac", + "be90e8de bdcae044 3e3ee428 b95bac00 3ea95154 3f3eb352 3f0b8148 -> be61fd92 3ce833c8 be1e35b4", + "3f81d158 3f3deba6 3f76a5e8 3e77eb06 bd1adbc8 3f1bf5a6 3f1aff2c -> 3f3deba6 3f76a5e8 3f1c5156", + "3f95e41a 3ee622f0 3f27ba94 bdabd0e8 3f61cd92 be138e1e 3f5c1cdc -> 3f74bdc4 3f27ba94 3f82b714", + "beb561cc 3e9b59a8 3f9f5afc 3f5a7c28 3f64c28a 3ea94090 3ee8dc30 -> 3dc1365a 3f9f5afc 3f5a7c28", + "be878736 3f0d06aa 3e963972 3ee8fcf4 3ea2bf9c 3ea20ca6 3f963de0 -> 3f0d06aa 3e931822 3e879536", + "3fa59e78 3f53cf76 3f61d7f8 3f2f5800 bd8c1670 3e85bf08 3e8b85ee -> 3f53cf76 3f61d7f8 3f2f5800", + "3ead4134 be7e7bea bd0622e8 be3eb83f 3e817ac4 be6f193b 3f7bc20a -> bda17b66 bd0622e8 3e5695cd", + "3fa8def9 3f3f2c86 3eadd390 3ee744bc 3e562ca4 3ec2e484 be494a9a -> 3f3f2c86 3ec99e83 3ee744bc", + "3f769eda 3e440c50 3ecaec38 3f2fe620 3e284c2c be23b342 3f358cb8 -> 3e440c50 3ecaec38 3f3557b8", + "be7b3abc 3ed71260 3f84be24 3f64f274 3d2ef520 3f2e836a 3f94343a -> 3ed71260 3f84be24 3f546569", + "3f7f02ae 3f82f14e 3ef65bc8 3f335061 3f583cf4 3eacb3ca 3f3b02e0 -> 3f82f14e 3ef65bc8 3f3afb42", + "3e71944c 3f838c12 3f4a2a38 3ec80a50 3ea0cd2c 3f38ac0e 3d7ded60 -> 3f838c12 3f4a2a38 3ec80a50", + "3f9e916d 3f9a1978 be7c8f91 be10ad69 3f97ca09 3f8f6734 bb096f00 -> 3f9a1978 3fb93064 3cff2000", + "3eb22104 3e718774 3f9fb8ef 3f823514 3e2f314e 3f503640 3e404ddc -> 3e718774 3f9fb8ef 3f823514", + "3f1bca72 3e388628 3e2d7dee bd231f00 3eab6c8c 3f89accc bbf9c6c0 -> 3e8c6fca 3f388b5e bca5b4af", + "3f90dbf3 3f8dddf2 3f8028fe 3f1d4e34 be539e8e 3ea554f2 3e9756aa -> 3f8dddf2 3f8028fe 3f1d4e34", + "3ec51d28 3f5b4be4 3d3e0f90 3f8cd63a 3ebcce44 3ecb5bc2 3e0c2b68 -> 3f5b4be4 3e39cdb6 3f8cd63a", + "3ee8e5fe 3f845016 3f491dd0 3ddada08 3f4fb504 3f68f1e2 3e71d684 -> 3f845016 3f579834 3e29a84d", + "3f0caba8 3ef77808 3f6ee63a 3ed8e144 3f4623a4 3e95ded2 3f7873f8 -> 3f249e94 3f6ee63a 3f396057", + "3f2148ce 3ebd957a 3e38dc5c 3f9d5828 3f655278 be38b672 be2dbf23 -> 3f338c5c 3e38dc5c 3f9d5828", + "bebec288 3b0a1e00 3efd0ce6 3f923dda 3f0c23ee 3f73cb3c 3f9c70b9 -> be4de402 3ea5aabc 3f8e7119", + "3f2c1d4c 3f7390e6 3f955eda 3f86b299 3e2a2178 be4bdd8c be09f9a6 -> 3f7390e6 3f955eda 3f86b299", + "3eb958fc 3f2241ac 3f8d3968 3f460144 bdacc25e 3f80cb69 3e3f24b8 -> 3f2241ac 3f8d3968 3f460144", + "3eaaaa54 be3a50ee bd7226e4 3e89e96e be6113be 3f13375c 3f887a2a -> be3a50ee 3e1bed91 3f08f474", + "3e180624 3f8ed4f1 3f8f7e12 3f3914aa 3ea7b6fc 3d67aa28 3ebdbe64 -> 3f8ed4f1 3f8f7e12 3f3914aa", + "3f601d68 3d2975c8 3e5b7e30 3c644540 3f9a9353 3e87285e 3f943562 -> 3f87fb84 3e83fe20 3f81f89a", + "3f60397e 3f821443 3f1f0b6f 3eb73690 3e779b32 3f5af262 bd48ac38 -> 3f821443 3f5382f8 3eb73690", + "3f93060b 3ea78890 3e52bc34 3f3aeac4 3d81dc94 3f64c70a 3f38772e -> 3ea78890 3f7ef2ea 3f3aeac4", + "be8259bb 3e9b51c2 3f1f86fe 3f0468de 3e024f7c bdc09714 3e12534c -> 3e9b51c2 3f1f86fe 3f0468de", + "3fa3ef58 be50f9c8 3da28440 3f8b5670 3f7e8dfa 3f3ea264 3f5d6b50 -> 3faa57c6 3f6e7340 3f8b5670", + "3e9470d4 3f239343 3f02702e bd2bef20 3efc0544 3e8ebcd4 3f57d4c0 -> 3f239343 3f02702e 3e5bc6b6", + "bdc7dd6c 3f11d222 3f94acb8 3f49d444 3f7844fa 3f5d7f18 3efff02c -> 3f07d2a6 3f94acb8 3f49d444", + "3f0d3222 3f2a4d18 3f9f14f4 3c67fae0 3ed36734 3f666806 3f18f7b3 -> 3f2a4d18 3f9f14f4 3eabfd07", + "3f9349a8 3f57588e 3f3f2838 3f5492c8 3ddd3888 3f43d5f2 3f72441a -> 3f57588e 3f448a6d 3f76bd82", + "3f9044a6 3e9575d0 3f04ee67 3efeb1a4 be0ec007 3eac13d8 3ec9bd82 -> 3e9575d0 3f04ee67 3efeb1a4", + "3f8acb59 3f723ee0 3f05a9b6 3f5238f0 3ebad140 3f905136 3f90ed8e -> 3f723ee0 3f96da06 3f944925", + "3f928f2a 3f362d8e 3f7a9498 3ed09dca 3e94dc0c 3f649cbe 3e9802d4 -> 3f362d8e 3f7a9498 3ed09dca", + "3eae8be6 3db13508 3f530cf6 3ea9b4c2 3f8c1d2f 3c8e73a0 3f1abbd4 -> 3edc43b4 3f530cf6 3ed95a2e", + "3f9d7c79 3f81a3fb 3ec15c8e 3e096e44 3f438878 3f92c853 3ea9b88a -> 3f81a3fb 3fa975b2 3ec0fd14", + "be04d972 3ec8d610 3d27b720 3f5bf4fc 3e8eea58 be139ab0 3f59b496 -> 3ec8d610 3d27b720 3f5bf4fc", + "3f90097b 3ef10064 3ee2cdf6 be4ed41a 3f82e2cc 3f371c97 be7ba10b -> 3f8bbc5e 3f3fd874 be4ed41a", + "bea78d58 3f8249cf 3e310f88 3f889c86 3f8f9c9a 3ecc8562 3eade506 -> 3f7bdb40 3dca4a17 3f889c86", + "be6793de 3f71e174 bdac0c74 3c82b3e0 3d8cb278 3f851177 3f91fb28 -> 3f71e174 bead1ce5 be74138a", + "3fb4a49b bdd8248c 3edfbabe 3f59e028 3f9d88e3 3f0cfed6 3f34bf84 -> 3fe3e162 3f18f9e4 3f59e028", + "bd97e50c 3f301928 3f4c59e8 be741c9c 3f498368 3f324cd5 3f29663d -> 3f2e369b 3f4c59e8 be9c3c7a", + "3f7cddea 3e0697e6 3e911ece be362ce6 3f0d5705 3f19a416 3f6b0fb6 -> 3f0c059b 3f18a60c 3f67a088", + "3fbf22e5 bd3959c0 3ea2450a 3f644f44 3efe9bec 3f9ef4e1 be35f42f -> 3f43cfd5 3fd95a30 3f644f44", + "3f43621c be000bff 3f17df5d bd221228 3d87b338 3f75be46 3f848ba8 -> 3cabb7c8 3f5f8422 3f47ec56", + "3e896208 be79d98d 3e49ab48 3f8559e9 bdaf11f8 3e98b072 3f87b43c -> be4e4bea 3e657f3c 3f85fb88", + "bd75cb70 3f1fe9fa 3f872019 3dadae54 3f73f5dc 3f6d8c44 3eaddbae -> 3f1aded7 3f872019 3d8e5f18", + "3f15a4a2 3f61ef0a bd65f270 3f443f48 3e41fb58 bce32ce0 3f982148 -> 3f61ef0a bd21ee10 3f81b154", + "3fb5b607 be051499 3f9ac872 3ef787a2 3f0f1514 3f223c8f 3f1f38f2 -> 3f59153a 3f9ac872 3f2e19de", + "3f157ade bd385740 3f868cfe 3ef11a06 3f7c8e90 3f604eec 3e944358 -> 3f0eacf1 3f868cfe 3ef11a06", + "3a174400 be276dab 3cf81e80 3ec67288 3d54bdd8 3f8dd39f 3f6a39e2 -> be274d14 3cfd36b1 3ec69a6b", + "3f1b55e4 3f02e252 3f0e9979 3f4b581a 3d82ebe8 3f3b951d bded8f20 -> 3f02e252 3f29e4ed 3f4b581a", + "3e204a74 3ecc7d08 3ee33f28 3f903bc8 3f3cd7ac 3f8c6a60 3ec5e770 -> 3ee7997c 3f0bcc0b 3f903bc8", + "3fac89d7 3e7367b8 3e9de002 3f1b08ae 3f6a1baa 3e40be18 3f445e50 -> 3f93326b 3e9de002 3f52c043", + "3ec92926 be7b6723 3f5d28c8 3f9bb3a6 be4b0a9b be4ccf55 3e407c74 -> be6866ed 3f5d28c8 3f9bb3a6", + "3f650df2 3f94eff2 3e041814 bde66838 3de9fad8 3cc115f0 3eb82140 -> 3f94eff2 3e041814 3e9eafaa", + "3f2520b4 3ecdeed4 3f706bb8 3e7ade5c 3f9353b9 3ef9d5ac 3d90718c -> 3f629c5c 3f706bb8 3e7ade5c", + "3f68500a 3eb6f4ce 3f181572 ba923900 3f83bd16 3f9396fa 3e753666 -> 3f778ff8 3f8cf832 3e5e6ae8", + "3f770e34 3f78d0f4 3f84184c 3ec66068 3f2b77b8 bdd12374 bdb7781c -> 3f78d0f4 3f84184c 3ec66068", + "3f025024 3f7170b2 3f53f0ce 3c4808e0 3f2ec8f3 3f722f00 3f324380 -> 3f7170b2 3f6355db 3eb88dd8", + "3ef651a8 3d84cc78 3f7d4496 3ebf30a2 3f52cc10 be64739d 3e8dec78 -> 3edc0d97 3f7d4496 3ebf30a2", + "3fa3ec58 3f1e844b 3de288b0 3f81ba1c 3f7344b0 3ee4a03c 3f5d3366 -> 3f8586e4 3f0a72a4 3f81ba1c", + "3f323a6a 3ca26aa0 3f77b068 3cb86580 bdd30e46 3f9968c1 3f993fe7 -> 3ca26aa0 3f906d75 3f5722f4", + "be7a5af6 3eb1aadc 3f4002c6 3f31c7a3 bdfe9710 3e4bfe8e be178e51 -> 3eb1aadc 3f4002c6 3f31c7a3", + "3f475e4c be0e1460 bc8d11a0 3e5f7a00 3f4abbd6 3f1fcab2 3d8eeb48 -> 3f160724 3ef6ef89 3e5f7a00" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_dodge(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "bde14c50 3f5ad0dc 3f601e92 bd351e30 3f90256e 3f9b2baf 3f81b412 -> 3f42b223 3f45bf68 bd22f3fd", + "bcf33950 3f2bdf82 3f1fbbfd 3f783308 3f338b74 3e97bb2c 3f8e0826 -> 3f285dfc 3f1e5754 3f70487e", + "3f3b2726 3f8e2033 3f9eae7c 3f092abc 3f7f5d7c 3f3fc3b2 3e969f5c -> 3f800000 3f800000 3f2ec00a", + "3f8fd816 bc2f8ba0 3f6dd0ae 3f329ef2 3f53e376 3e336740 3e016f2c -> be1d0e87 3f800000 3f5031b6", + "3f02b72e bdfa32e8 3f0b95b8 bdbbb934 3f8942b6 3f0b55fe 3eb595ee -> be8a3f18 3f414ec9 bde53c7c", + "3ec6069a be21b8a8 be3babc2 3caa6b90 3f9e3d12 bd8742b0 3f8b6124 -> be9af25c be36ff15 3d1334ed", + "3f88a3f3 bdfdc9b6 3f79949c 3ed94356 3f939107 bbf9efc0 be5b5a92 -> 3f800000 3f779093 3eb0d3d2", + "be2972a2 bbe2c220 3f6eb3c4 3f85af2e 3f900380 3f8346de 3ea63970 -> bbbf2ac6 3f4c11b2 3f7dbcaf", + "3f276962 3f9926f2 3f020f2b 3d467658 3f497d8e 3f230c5a 3f584346 -> 3f800000 3f5ee5c6 3dddb7a5", + "3f0edd28 be2f66ec 3f4faa2e 3f610606 3f8043cc 3f014554 3c06b8c0 -> bec6f75e 3f800000 3f620f95", + "3f987460 3f9623f4 3e87aebc 3f8171ac 3f10ac08 3ee91ac8 be54c72d -> 3f800000 3f1435f4 3f4f86f6", + "beb2b7ea 3f9a1e09 3cbfa8f0 3f6cc168 bd899282 3db9937c 3e839dc2 -> 3f800000 3cb9c89f 3f5942b9", + "3fac54c5 3f5ce1f2 3de953f8 3f993f37 3f44c840 be614702 3f8659b8 -> 3f800000 3db402b3 3f800000", + "be9ca026 3f0f05e5 3f9c75fc 3e4bf25e 3f0c0b50 bbc07e00 3e074038 -> 3ef50a19 3f800000 3e4406be", + "bedfa94a bdb0ac94 3f4b9ba4 bdcb2c5e 3f3cc6cc 3f83873c 3e6e2fc4 -> bd85a0eb 3f0c8722 bdb86ed9", + "bd95e480 3ed5b8cc be5e13f1 3e9eb5ee 3ea400b0 3e909d06 3f009402 -> 3ed0d37f be59947c 3e991552", + "3fbeb68c 3e704790 3ebf4bfc 3f1aafde 3e97b3d4 3eace8c8 3f28a6b8 -> 3ed718c7 3f4084ec 3f800000", + "3df82e18 3ee4ff60 3f6e879a bc881510 3ef32e2a 3e559dca 3f5f6aa0 -> 3ef2fb9b 3f74b74f bc982d13", + "3ea35ab2 3e95d6ce 3f0fe6c0 be6d7d24 3e583980 3f68fe28 be3c95ef -> 3ea0a9b5 3f4ac92c be604f10", + "3f9c366e 3ef4c346 3f4626f4 3ee40dc8 3ea047ee be66f440 3f508c94 -> 3f460b29 3f1b61f5 3f800000", + "3dc03b30 3da57bd8 3f232376 3e4b1fa8 3f3f5fbc 3e983ede bdc66f00 -> 3db1f8bc 3f27d292 3e494b02", + "bd8b2aa0 3f1945fa 3f584cba 3a45a000 3f680aa0 3f392956 3f54dc32 -> 3f10616b 3f4e2ab4 3a3b0e5b", + "3f49e3a8 3f8e8a05 3f956d8e 3c4bedc0 3f11a706 3f1c2153 3f74b090 -> 3f800000 3f800000 3d4f10dd", + "beaad2ae 3ef12888 3e957480 be10381f 3f1f505c 3edf72fa bd43fd30 -> 3ec7b210 3e82758d be128f15", + "3f967580 3f597f0a bdbab82c 3f9ddaf9 3ea062e8 3f8c0d12 be6b04e8 -> 3f800000 3f800000 3f78a24c", + "bc3a9940 3d364230 3f847bb6 3f7a3758 3f94a402 3f38387e 3d24e020 -> 3d33e128 3f800000 3f7a19fd", + "3f8bc39f 3f779a06 3f8237a8 3f0e03c0 bd81597a 3e6ff94c 3d973738 -> 3f67a0b3 3f800000 3f1a77d9", + "3f271220 3f5b4bd8 3e3b5cb4 3f7e7cf0 3ed4433a 3f8dee01 3d90a470 -> 3f800000 3f297e0b 3f800000", + "3f7acef4 3dc349b0 3db6af90 bdff84fc 3f8e32f8 3f99b8fa 3ea28780 -> 3f800000 3f800000 be396dae", + "3f952f4a 3f2fa3be 3c8f6ea0 3eafb258 3f610f30 3f4f9d6c 3eb33514 -> 3f800000 3ea3a576 3f1460da", + "3f6cea8a bdf0e288 3e91f0be 3f285f03 3f91f46a 3f2a6290 3e392e44 -> 3f800000 3f3e0098 3f4a36a9", + "3f56a2fe 3f064af1 3f0dee38 3edef716 bd444d50 3f906ca3 3e118aa0 -> 3f011ae6 3f800000 3efd2128", + "3fbecccd 3f79d1ce bc31bf60 3f9307ec 3f9e1f12 3f732a38 3f01b4fe -> 3f800000 3f800000 3f800000", + "3fb751f3 3f32217c 3f5a27f8 be4c77b6 3f44c68c 3f790a42 3f98ef3f -> 3f800000 3f800000 3f800000", + "be0033d8 3f3ff3da bd1d56c4 3e9d8b40 3f2c60e6 3f794c5e 3f85ced8 -> 3f310754 bd0c3da1 3e8b4fa5", + "3f4c8ae0 3f92ef67 3db0ef70 3f0638c8 3e45e5cc 3f91e47f be137c1b -> 3f800000 3f779eaa 3ef0bd66", + "3f6d7db2 3f48e7b8 3f3093d5 3f68aac6 be359d4a bd98f73e 3f80c9de -> 3f2c850a 3f25229e 3f800000", + "3f8e8bf6 be62f635 3ee392aa 3f64d10e 3f8e399a 3f8bf2c6 3f5eb4fc -> 3f800000 3f800000 3f800000", + "3ed4b088 3f2ed067 3f1b7cf0 3df91250 3f71584e 3e71b448 3ef207ec -> 3f800000 3f2c643b 3e1af77b", + "3f998f65 3eaf874a bdfa50a4 3f075a44 bdc398be 3eb189f0 3e899618 -> 3e9d7bfb be564f6e 3f47bf91", + "3fa2a200 3f938d8a 3ebfae1c 3f4ac4b0 3f87b09d 3ecd2808 3e0372a0 -> 3f800000 3f433cf3 3f7248e3", + "3fb0d12d bdb35ef2 3e10dd30 3f322dde 3f4c2928 bd7b53d8 3ea448ac -> 3f800000 3e058b70 3f800000", + "3f4b9734 3f446140 3f29f492 3f4fedb4 3f90b369 bd98ba52 3d1a5f50 -> 3f800000 3f2070ad 3f565a72", + "3df5eef0 3f3aa0fd 3e1c59fc 3f002126 3f275bea 3f221d03 3f85e397 -> 3f4a8740 3e29383d 3f128928", + "3db6d630 3f0fddea 3e05420a 3f9585e3 3f541c20 3ef99162 3f90ef78 -> 3f1b5bd4 3e0b5219 3f800000", + "beaa41b0 be3836e4 be17ce89 be4bb820 3ee2a310 3efbb0a4 3f068870 -> be2093fa be027a5b be2d6a26", + "3f06fb08 3e5d1690 3f2cf46e bdd686da 3d4224f8 bdc902fe 3d5a5b00 -> 3e62c151 3f2471ce bddcbb2d", + "3f6f2ddc 3eed82b4 3f776c90 3cc4c2e0 3e2f7108 bc9b5d40 3f1ce49a -> 3f0d6332 3f731dc1 3d662e47", + "3d851648 bce7ee10 3d2a38b8 3e201540 3f823b80 3eaa2af4 3f3815ae -> bcf859a5 3d2dfaaa 3e27ee1f", + "3f22484a be7464da 3f472218 3f9c0684 3f338211 3ee08aca 3f188a09 -> bedbfa60 3f800000 3f800000", + "3f433ea0 3f0fe834 3f42dbbc 3ee02a92 3f2f1063 3f431d86 3f71d220 -> 3f800000 3f800000 3f800000", + "3e3c91dc 3f3a2212 3eb5e400 3eb67338 3ef67ac4 3f3e217f 3f1dc1b0 -> 3f4c3d33 3ed2b579 3ecdce09", + "bebd092a 3ed3c7e4 3f64e5b0 3ed07fbc 3e834736 3e89f4b0 3f73ad46 -> 3ec1774f 3f502fba 3e9a4784", + "3fa62125 3f87b469 3f650ca8 3f2cda88 bdb9e936 3f873961 3f95c307 -> 3f72cd8b 3f800000 3f800000", + "3dd94920 3f92e92b bd96ef20 3f18a03e 3f369a3b 3f351ba6 bdf86492 -> 3f800000 bda32ea9 3f16afda", + "3faf3b6f bd36f2b0 3f5610ce 3f3ccbdf 3ef00f24 3f6b1278 3f948f5f -> bdff6d32 3f800000 3f800000", + "3efc5150 3f6fb18c 3f8665da 3e92733c 3f56f3fc be16b003 3f0099a8 -> 3f800000 3f7a9eed 3ec2a22b", + "3f215920 3f911e34 3f0fcd2a 3e4779dc bda5a794 3f64dcc2 3f593d40 -> 3f800000 3f800000 3ed66a6b", + "3f55ff2c 3f8ee78a 3f819d61 3f064d8a 3f74aac4 3f832609 be440e05 -> 3f800000 3f800000 3ee78c2a", + "3f706a52 3e373f92 3f814caf 3f825194 be5be8a0 3ef99c82 bd5bc964 -> 3e187e4c 3f800000 3f782222", + "3de37688 be44ac7e 3f6b7400 3f84ce05 3f19e7de 3f854744 3eb52674 -> be52beea 3f800000 3f800000", + "beab6c99 3f8c207a 3e0e83a0 3ea39dbe 3f741ec2 3ed5d8cc 3f5b5c04 -> 3f546e15 3dfa0f47 3e7e47f8", + "bef67036 3f1d54f1 3e1b071c 3f0b4f2d 3f881f72 3e8f6c5a 3e196714 -> 3ed020f9 3e089bd7 3f01f099", + "bd452fd8 3f896b06 bd181aa0 3f435cd0 3f926334 3f8d111f 3f6a4ec0 -> 3f800000 bd1070ca 3f3b1e26", + "3f028234 be5736a4 3f049677 3f4dee22 3f1d85be 3e9cac7c 3e0ebeea -> be9cca58 3f1d1835 3f5daf38", + "3fa24506 3f64592c 3ed084da 3f116330 3f8d271c 3e7aa81c 3f20c81c -> 3f800000 3f172b99 3f800000", + "bef12fab 3f1f99da bd381550 be7dcfff 3eb6bf58 3e4e81ec 3f50b9d0 -> 3f08a0ee bd281cdc be37615a", + "3f6b4e9a 3f1bd796 3e654fe8 bce72190 bd2e7ec0 3f85f4d2 be05ba94 -> 3f15f83c 3f800000 bcce5c28", + "be40063a 3f34f5aa 3cc7e760 3f352178 3f983625 3f304479 3f1dd5a0 -> 3f13f6e3 3cb10b4d 3f225c00", + "3f9eb469 3f5f0a70 3f43e0bc 3db4c828 be0da75e 3eef5890 bd7d19d0 -> 3f3e62e0 3f800000 3da7eabb", + "3f90a7d9 3f7e7f5a 3f9cf5ff 3f9af856 be5bcf66 3f4591aa 3d899d10 -> 3f4ccfe4 3f800000 3f800000", + "3dcd2cb8 be780156 3f42d0ce 3f0966bc 3f2681c2 be19ac42 3f7166b4 -> be84a55b 3f3fee18 3f17bc5b", + "3ed0f202 3d3427e0 3f152730 3ed0db54 3f026c9a 3ca3cbf0 3f5768b4 -> 3d6371bf 3f166151 3f1f0aa0", + "be81a14c 3e080cc8 3f8e20dd 3f94f0f7 3f4e658e be743612 bd0807d4 -> 3de1f90f 3f800000 3f800000", + "3f95b4f1 3ee13be0 3f69f2fc 3e7b260c 3f7bf434 3f208b6f 3f8bbf97 -> 3f800000 3f800000 3f800000", + "3f7c75a4 3e7d9ff0 3c3591e0 bd9fa094 3ccaff40 3f86aedc 3f846152 -> 3e81fd2b 3f800000 3f800000", + "3f43f2a8 3f036e6d bda22a20 3e93d510 3f16af8a 3f6c6eec 3ebf67b8 -> 3f6f335d be8a53be 3ecf16f7", + "3f1a5fee bd8a339e 3f6e2b5a 3f1a298f 3e4a37a4 3eb18b5e 3f499842 -> bd9ce252 3f800000 3f800000", + "3f25fae0 be0956ed be4fc507 3e6a9a64 3f429f2e be192f83 3ee55990 -> be876b50 be3d6645 3ea55062", + "3f172cfa 3f8c6ee9 3d29d378 3f6a8d90 3ef21302 3f8cf3c3 3f510284 -> 3f800000 3df2ce76 3f800000", + "3f9d3c57 3ea4a1d0 3e7186f2 3e70527c 3e5f029c 3f875308 3ef8db0a -> 3ee0c2fc 3f800000 3f151b17", + "3f7e1bb2 3f7086fe 3f1ff766 bd049fc0 3db41c84 3f57cba8 3e331dd8 -> 3f800000 3f800000 bd207d35", + "3e34c214 3f9de3d1 3f649ff4 3f09664a 3cf8b7d0 3d5e6ed0 3b5c1300 -> 3f800000 3f66d66e 3f097b27", + "3c149240 bd138768 3f716554 3f03b8cb 3f73a99a 3eac2bb8 bdf35de4 -> bd14d037 3f722258 3f03947f", + "3f38c0ce 3f908ec2 3f1f5cf8 be0967df 3f8943b3 3f4eb158 3f47ed72 -> 3f800000 3f800000 be9d6ff2", + "3f7b3630 3ee3933c 3df0a780 3f9d66a1 3f0a1fa0 3d52abc8 3f7de762 -> 3f71d1e2 3dfd7230 3f800000", + "3d8c2300 3ed82eb0 3c3c2540 3ed8373c 3e83d0f0 3cbcaa30 3d77d578 -> 3edc0f1e 3c3c7146 3ed91d5a", + "3fa8b976 3ecbfa86 3e049d18 3e450f08 3f4c0098 3f102672 3f2a1ccb -> 3f800000 3f009ece 3f800000", + "bcbe7040 3f0afc68 3f785bd4 3f04170e 3ef12068 3eb5b284 bd3fbd48 -> 3f097b16 3f76539a 3f043be4", + "3f9f9ba6 be7d9646 be17c010 3e87f856 be5b96be 3f24da06 3f257bbf -> be4815c6 bf408b78 3f800000", + "3f0d52ae 3f068b05 3f0e9907 3f3da61f be7d0f3e 3e85e960 3f9a4d38 -> 3eecc86a 3f26a93c 3f800000", + "3f639596 3f2e74c0 be218b4a 3ee38244 3d818450 3f890b76 3f4d7a68 -> 3f38d932 c0518ef1 3f800000", + "3ef300ae 3e78d6c4 3f6c6246 3cd0d9a0 bbba8e00 be08bd68 3f00df46 -> 3e782b19 3f5e4b9b 3d093509", + "3faf3379 3ecb723a 3eed6c6c be39c254 3f72517c 3f49e338 3ebb739e -> 3f800000 3f800000 beba2d91", + "3ec94d1a bdb8fb3a bdbf0464 3e63389c 3f210b4c 3f2a0198 3ea6305c -> bdf5c489 be0141d7 3e823aeb", + "3faa4c2a 3f528e3e 3f339da2 3f4b4468 3d531c28 3f35825c 3f10d92e -> 3f620e8b 3f800000 3f800000", + "3fa85a70 3f60bea6 be36a853 3e217eac 3f08c256 3ecd1386 3ea8926e -> 3f800000 bec1020e 3e8e6be5", + "3f588652 3e36b6d8 bc22a8a0 3f8547b6 3f07095f bddb1c38 3f2330cd -> 3ea4f2d9 bc15293f 3f800000", + "bea87aea be2074b8 3f2c16b4 3d66ab58 3f391178 3f16e0a0 3df99a38 -> be019eef 3f1022a7 3d5dc66a", + "3f077034 3f97bedd bce1a0b8 3f2f253e 3e20554e 3e6988e6 3f1bae03 -> 3f800000 bd004b1e 3f800000", + "3f3a3498 bce76ba8 3ef684ca 3f98ac90 3ed09c94 3f98030c be56e9ca -> bd24720c 3f800000 3f800000", + "3f5bf89e 3ec8c094 3f692fc0 3e263c94 3e0d65d4 be5a3da0 3f69182c -> 3ee3c737 3f4517bf 3f3ef89e", + "3f9221ed 3f95550b 3edc7d76 be17f84f 3f056520 3f6fe762 3f7ea056 -> 3f800000 3f800000 3f800000", + "3f4e39e6 be61e445 3ef9b364 3f14204c be057912 3e469798 3eade702 -> be4c6d2f 3f13f7a8 3f4bec1b", + "3f8b809e 3f8cb178 3f393a6c 3e02b40a bd9ec3b8 3f789b34 be250ad6 -> 3f800000 3f800000 3dde5966", + "be65cf9a 3f4232f8 3f8c9b26 be0513ac bd3699f8 3f18eb40 3eb7aee4 -> 3f442964 3f77f846 bdf65249", + "3f44ae0a 3f81737a 3f926dc8 3eab7006 3f0d7008 3eec3634 3f4a6144 -> 3f800000 3f800000 3f5a509d", + "bef320f6 3f4ab440 3f152352 3f62b034 3f0a7ad8 3f5d0dac 3f987e03 -> 3f2146e5 3ed389a0 3f10c826", + "be796196 3f9f3459 3eba71ac 3e93591e 3f3e6032 3f33520c 3f89dcc5 -> 3f800000 3e9f4607 3e6975a9", + "3f0ea722 bd805560 be5c7774 bd0ce140 3d86ab20 3f525ae2 3f4649d0 -> bd8536f8 becb5691 bd77dc48", + "3d3497d0 3f15086e 3f9da36c 3ea19d7e 3db7e10c 3ec591ca be635c6c -> 3f15a010 3f800000 3ea00c65", + "be12001c 3f17fe22 bbcbdc20 3f1131b4 3f7b8acc 3f4c923e 3f6c6d48 -> 3f0550d5 bbb70239 3f004cca", + "bdb8b898 bddf472c 3efbf99c 3f21acb0 be11c9e0 bdd1f5da be715283 -> bde22eb8 3efe53a6 3f252f8f", + "3f5a6306 3ef7faec 3f550e86 3eec6c5c 3f92cc9a 3f081de8 bdbbd68c -> 3f800000 3f800000 3edb4471", + "3f6e9780 3f8dfcb6 3df430b8 3e726a90 3f63c038 be6fa22e 3f5c5c86 -> 3f800000 3dc877b3 3f800000", + "be61c0fc 3f19dc7a 3ea3c2ea 3e4dfadc 3e69131c 3f94e990 3f964edd -> 3f128268 3e825554 3e239ef1", + "3ebbc6da 3df68474 3f787ada 3f816ab3 3f935fe8 bdc59df4 3e713aa0 -> 3e555917 3f6ffcae 3f800000", + "bee05a12 3f0ae555 3f15853b bd2b8240 3f2c999d 3f429e70 3f24acd8 -> 3ed67065 3ee050e7 bd05cbbd", + "bebd3812 3e18e144 3f8d4c49 3e458bb8 3f8d557f 3f8f51dc 3ee35cb6 -> 3dd92610 3f47e248 3e29b246", + "3f500646 3f8ff118 3da4b880 be20d5b4 3f487ac8 be3fbcf4 be1bf47d -> 3f800000 3d8ef7b6 be0f1f4a", + "3f0da380 bd9f2534 3e38b7e8 3f6148c0 bc823b80 be23c968 3deafd9c -> bd9dc1fb 3e29b35e 3f708e38", + "bc710840 3f8e49d6 3f3360c8 3f9f6cb2 3ec1a34c 3f6c3688 3f471366 -> 3f800000 3f30f9c9 3f800000", + "3e82e044 3f4900dc 3cea5900 bd0d9650 3e82f208 bd050530 be0d7ca2 -> 3f571026 3ce86b13 bd08c1ce", + "3dd181c0 3eee91c8 be7790df 3ebf3394 be534257 3ef5debc 3f6a65de -> 3ee9a377 be822d8f 3ed2f61e", + "3e24f748 3f23e3cb 3f6b0ad4 3df22834 be231206 3e0d2f1c 3f01a39a -> 3f1fca59 3f7061ae 3e03d56c", + "3ea76ff2 3e1d5d08 3ea7fe38 3ee156f4 3f2b90cb 3e8e9a4a 3f7bde12 -> 3e498849 3eb8d3eb 3f261e1f", + "3e5e18c8 3e1cdf28 3e4a2628 3ef3b2b0 bd592d08 3f6a9af4 3e2bc268 -> 3e1b1695 3e7c4bff 3efce600", + "bd428e30 be4aeee0 3f9051fc 3e8e038a 3f8c308b 3f9e3105 3db4b3b0 -> be40e5eb 3f800000 3e8d6bcf", + "3f466df2 3e3048c6 3e835dee bd741464 3f1c1e48 3ee5f3ac 3f8f1f45 -> 3ea727d2 3ec98567 bee4dcc2", + "3e03aa00 3f842af9 3f60945e 3e932c4e 3f08eac0 3cadf9a0 3f99250f -> 3f800000 3f6131ca 3eadee09", + "3eaf1998 3f7353ac 3f467b22 3f55e83a 3f706288 3e030b16 3f94ffc2 -> 3f800000 3f4f90af 3f800000", + "bda9f448 3f4f923e 3f92e039 3f8c611e 3f50546a 3efeea86 bdbf97c4 -> 3f4270b2 3f800000 3f800000", + "3f1e2a04 3f85336e 3f8ba1a1 bb92cba0 3e1ba6f4 3e2c3490 3f69f784 -> 3f800000 3f800000 bc2898a4", + "3fbcd8b6 be36bf6d 3e7fb300 be4235f7 3f8a29a8 3f8ecfc4 be3c2ce8 -> 3f800000 3f800000 be18c980", + "3ea7af94 3f11f52c bd7bcd00 3f29826f 3f252b28 3e6299f0 3f7537bc -> 3f391012 bd87bcef 3f76ff21", + "bd014858 3dd146b4 3f31198b bdc00b90 3f5b9f44 3e325bc8 3ec982b8 -> 3dcbc241 3f3021a9 bdbdb053", + "3f25fff0 3eb7dd0a 3dbfe3f8 3f85e4ef 3f99c249 3f763184 3f62105c -> 3f800000 3e7ee678 3f800000", + "3fbe9f65 3f84a88e 3d2bbbf0 3e08040c 3f8d3155 3d052990 3eccc912 -> 3f800000 3d3478c7 3ea8312c", + "3f80ad05 3e8d1cc4 3f4675b8 3f8e079c 3e86467c 3f8c855f 3f712f42 -> 3ebfa2a6 3f800000 3f800000", + "be3764fa 3f757d42 3e3cff2c bda6b5ee 3cd9d8e0 3e4b5528 3e72bb9e -> 3f74535e 3e3681a1 bd9febe2", + "3f4052b2 3e18a6da be249096 3f0b4a7a 3f9f3b18 3e8a6c52 3ebd8a3a -> 3f800000 be4e8236 3f40f43d", + "3f48822a bdc07dfc 3c6a2900 3f90675e bdc48fd8 3e3b91a4 3ec1e580 -> bdb3089c 3c88b0d6 3f800000", + "3f60dac0 3f92c3b9 3e8f02da 3f4ac87e bd7ac1c8 3e9da668 3ef1da28 -> 3f800000 3ec406ba 3f800000", + "3fa266f8 3f9551ea 3d3ef558 3eb0f80c 3ea71868 3f33921a 3ebdc5c4 -> 3f800000 3ed8f29c 3f270948", + "3f3341ae 3f945e5a 3f60a09c 3f6cb5cc 3f035c38 3ecac2ec 3e9b6224 -> 3f800000 3f800000 3f800000", + "3f2edf32 bd4201c0 3f56b688 3f8df63c 3f818e38 be618252 bdaaf0c4 -> be1d2a07 3f3aa2fb 3f800000", + "bbebe9c0 3f02cd14 3f9da03e 3ddda9c8 3f2a2655 3ea07904 3ee9f202 -> 3f022d9c 3f800000 3ddcefb9", + "3f9ff936 3f93df2f 3ec0c188 be261474 3f92010c 3f81e0ea 3f5ca390 -> 3f800000 3f800000 3f800000", + "3e12ca0c 3f857642 bd5318c0 3f2ae9fd 3f51a40e 3f9ff11d be403e8b -> 3f800000 bd809464 3f266f56", + "be2eed12 3ec61010 bd3e7100 3f2411cd 3f84c17a be32f94a bdd41aa8 -> 3ea840bb bd444d69 3f270646", + "3f8bc509 3f30cae4 3f6edc06 3e34ddd0 3e8e6792 3e9c965a 3f34fc53 -> 3f7de7eb 3f800000 3f464d80", + "3ebf9202 3d8576c8 bc4e4cd0 3f6965e0 3e0d5660 3f94f4f0 3f567b74 -> 3d8cbb5c bcb6b3cb 3f800000", + "befd59c6 3e807fb0 3f563ae8 3f1f5a22 3f219fa2 3f310d82 3e1e860c -> 3e43d26c 3f1f9b9f 3f140387", + "3d3ef290 3f23e815 3e4409e8 bd6879e8 be610b3d be1539d8 be0255ad -> 3f223e8d 3e42b743 bd671add", + "beab47e2 3f8393c6 3f37a36c 3f60a360 3e73eb52 3e9ef8ac be06c6f4 -> 3f73bb78 3f265bd9 3f6afc16", + "3df4cfc8 3f3184be 3f694370 3f1cce4e 3eeaed4c bdc2c616 3f89d791 -> 3f3bd1f8 3f66a431 3f33f93b", + "3f4da790 3f9b03d3 3f80c20f 3edc9cec be281e9b 3e65d3ac bbe56480 -> 3f800000 3f800000 3edb6115", + "bea33f80 3ebbbc0e be6d2154 3e1f8d4a 3ec46858 3f7ddb28 3f08b42e -> 3ea74665 be342a96 3e0856ad", + "bedda32e 3efbb31a bc881dc8 3e7dda60 3e4e668a 3f1591bf 3e90236c -> 3ee78017 bc594782 3e624708", + "3e5d7c48 3f052360 be5cf603 3f932d62 3f1a6d8c 3f382d30 3f4a0adc -> 3f191dbf be82d739 3f800000", + "3f68f978 3f967bbc be75d0b0 bd9eb824 3f096645 3ea7e4c4 3f2eb5b4 -> 3f800000 beaf300b be516f58", + "3f3d2b3e 3edefcb8 3f4329ea 3f98e26c 3f613ca0 3f909aaf 3f9e7e6e -> 3f800000 3f800000 3f800000", + "3ec36eb8 3f32ebc2 3ef1801c 3f8d6354 3f11a12f 3f159a14 3e2842b0 -> 3f648c1d 3f1b6afb 3f800000", + "be6c6efa 3f2d845e 3deabdb0 3bee81c0 3f12157e 3f0b9d6c 3e42d97c -> 3f19510e 3dd07ce0 3be47816", + "3ed7b610 3f78c1a0 3f07f3b3 3ef7159a 3f4147ba 3ee854b8 3ea81a2a -> 3f800000 3f281627 3f0f5ff0", + "3ed7bc24 be7750a3 bc88b530 3f8c66f4 3ed3d18c 3f8cff3e 3ebe04c2 -> be95c3a5 bcff1e84 3f800000", + "bed9b77e 3ef12a4e 3e9b6382 3f125d03 3f345c62 3e9629b4 3f901ee4 -> 3eb99210 3e8a2890 3ec5f37d", + "3fa17a6a 3f100272 be51af97 be5cce8b bdeb6728 3ebff45e 3f1b0fea -> 3efb8b34 bec6ee5f bf6a09ef", + "3e27bb3c 3f65341e 3f9525fc 3f9ba863 3f842a7a 3e77fd50 bc40f620 -> 3f800000 3f800000 3f800000", + "3f48fba6 bc993920 3eec7414 be002c6f 3eda1604 3f28efc6 3f9c317c -> bce634b9 3f755406 c03ecc1d", + "3f40ffe2 3e7416de be781cfa bdc23cb8 3f3b9b9a 3f858726 bdd57ffe -> 3f085c5e bf913d87 bdb41577", + "be65aedc 3f87d2fb 3f2f8000 3f8edc8f 3b089280 3ea0f12e 3f1eaca7 -> 3f800000 3f23f0ec 3f7ad941", + "3d3a9920 3ef8bf34 3ee57ce0 3f1eb4a0 be2f3f4d 3f78fd2c bd68c8dc -> 3ef6d291 3ef020a3 3f1e4bb4", + "bc816120 3d8b72f8 3f90be91 3f2193d0 3f1bff27 3e0818e4 3eaf3ce8 -> 3d8a1eae 3f800000 3f20b56d", + "3e1ca500 3f8bbbdc 3ee4d040 3cea2bf0 3f622514 3f93ed68 3e05ded6 -> 3f800000 3f0af9e2 3ceef347", + "bd8acd94 be59929e 3f9089fa 3ecdef04 3f14ebe4 3eeb7fd2 3d283e50 -> be5151ec 3f800000 3ecd5ca9", + "3fa3b41b 3e6b2fe0 be19a15c 3f47cc62 3f96c35f 3f1e4f82 3e9bfb20 -> 3f800000 bf37acc1 3f800000", + "3f53c8d2 be721198 3f014044 3eb1b5aa 3f6ff29a 3f8377c2 3ea79062 -> bf86ba33 3f800000 3ef3affe", + "be8bc1be bdfc22fc 3f062499 be018e3a 3f290811 3f4db18c 3f779046 -> bdd5a21a 3edc0754 bdccff93", + "3fbac97f bc3a07c0 3f5667be 3ebcc6fc 3ed13b8a 3e74d3c4 be28f632 -> bce66e64 3f800000 3e9824cb", + "3edcb602 3f11aa7c bd042e24 3efe8890 3e867a86 3f9377c6 3e8ed320 -> 3f2443bd bd834c3d 3f10a998", + "3fa46c44 3f83f2bc 3f8ce3b6 3f2e786a 3f43b6b8 be597c6e 3f3e8852 -> 3f800000 3f5d617e 3f800000", + "3fa2a813 3f9893ee 3f6e768a 3f99193e bdf8a59c 3f86d7c2 bdc4d4f6 -> 3f800000 3f800000 3f800000", + "3fb0bfd0 3eb5deb8 3e8eb622 3f95f1ea 3f680e5e 3ea5e73c 3f8eaff5 -> 3f800000 3f0122d7 3f800000", + "be36ea30 3e865fd6 3e25a394 3f04e8f8 3e046a40 3e60ec70 3d4125d0 -> 3e835730 3e1f62a6 3f03ccc3", + "3eda2da6 3e93064c 3f8ccb46 3ed96aac 3f8ffffc be4e857e 3da7a790 -> 3f0d34a6 3f800000 3ee14673", + "bd1e2750 3f2c5d2c 3ee24810 3f92a8ac 3f4410a8 bcdf0180 bdde6eec -> 3f2769c9 3ee28504 3f800000", + "bdd5ffc4 3f93f89a 3ed86206 3e8f64f2 3edf0ad8 3f972e89 3f09a488 -> 3f800000 3ec09c90 3e87c447", + "be5c19fc 3f70620e 3f136074 3f1b2ee6 3f13fbee 3ed4134e 3f58ee50 -> 3f55d0f5 3f07540b 3f0345ed", + "3f064766 3f305e88 bdb38470 3ec53850 3f5165c8 3ee4ebec 3ec455fc -> 3f800000 bdea844d 3ef6e06b", + "3f34db9c 3f8a6ffe 3f057d24 3b6b5500 3f80a872 3f893838 3f508990 -> 3f800000 3f800000 3c0a9787", + "3f89b6ca 3f8b1b85 be65b614 bde01258 3dcf5d54 3f792dc8 3f98e208 -> 3f800000 3f800000 3f800000", + "3e9dfc94 3f7d37e0 bc326030 3f719524 3e93bc12 3f426dd4 3e6c57f6 -> 3f800000 bc68f959 3f800000", + "3f218178 3e8c6c30 3f88c338 3e980812 3f2254fa 3ef80d44 3f53e09c -> 3eea0e6e 3f800000 3f1f13e1", + "3fbd546e 3e8f292a 3f02b530 3f995570 3f4691fc 3f420724 3f244b51 -> 3f800000 3f800000 3f800000", + "becd2771 3f9359f0 3cd8e480 3f2e3486 be104d74 3f791af8 3e9051e4 -> 3f800000 3c9c0c8f 3f1c86bd", + "3fa6c757 3f0ccdfa 3eee6260 3e684110 3f30dbe0 3f672a3e bdb44954 -> 3f800000 3f800000 3e505b11", + "3f8cc46f 3f962c79 3f310704 3e8f0f7e 3f700822 bdc757f8 be45f192 -> 3f800000 3f1fe8f1 3e6bf5a1", + "3f138d32 3f33f6b2 3f74e74c 3df7df58 3eacd39a 3f9e547b 3f72938a -> 3f5f6f1f 3f800000 3e8889f3", + "3f138346 3f03dd4a bd6ad2a0 3f1359ac bd0d95c8 3e9af182 3e905b04 -> 3f014a0a bd8e35ae 3f2feeca", + "3fa45801 3f9b37ae 3c582760 3e37c598 3f84a96e 3f997686 3f3ef616 -> 3f800000 3f800000 3f800000", + "3f90f014 3eb4aa80 be3830ec 3f98bc8e 3f54dc64 3f2a69c6 3d0d7fe0 -> 3f800000 bf3b018d 3f800000", + "3e9df45a 3f88d716 3f2b2320 3f8b44ee 3f1af223 3f15c7b4 3f046750 -> 3f800000 3f50d4c5 3f800000", + "3dc7e1e0 3ea3bfb0 3e9e7138 3f4582d8 3f7c7204 3f159567 3e97111e -> 3eb52fd6 3ea8063d 3f4b5e10", + "bee828d8 3e8bbcb4 3f66b698 3ef36a76 3eb362fa 3f614954 3f8e5152 -> 3e712951 3f24e8a5 3ea1d42d", + "3fb94665 3edb4cce be19a69d 3f935aa3 bd3d80a4 3e9f1b0c 3f5541c8 -> 3ecd892f be8ba1f1 3f800000", + "bd07e118 3f62f386 3e360b40 3f418d68 3ea47e60 3f29bb8c bd4992d8 -> 3f608ed6 3e322049 3f41de6e", + "3f42e97e 3f062fb6 3f3ccfd2 3f1c3480 3f77b10c 3f81e319 3f23c6d4 -> 3f800000 3f800000 3f800000", + "3f30bf5a 3f742802 3f286e90 be4c7ca0 3ebaaf48 3e4db61c 3f707770 -> 3f800000 3f438e19 bf117327", + "bec96d9c 3e2cf4b8 3eef87c0 3e6cab9c 3f849039 3e30d566 3ecaa414 -> 3df5c615 3ee04ad0 3e4cc8ba", + "3eb56a0e 3f118cc6 3f97ea4a 3ecd945a 3cc74600 3f6f2588 be1b9118 -> 3f12d0b8 3f800000 3ec3141c", + "3f3e906c bdf2519c be702a48 3ed465a8 3f95ecee 3dc10de0 3ead8320 -> bf6c7480 be812507 3f0e0707", + "3f951f18 bdb0c9d2 3f8ec05d 3f220072 3f8ec190 3e636f40 3ea2b42c -> 3f800000 3f800000 3f800000", + "3f4ca888 3ee24f92 3f8cea37 3f56d050 be0f8008 3f92652c 3ca551a0 -> 3ecb82d6 3f800000 3f5a5611", + "3ee9e644 3f75bef0 3e8cc504 3f091ebd 3e7618cc 3f4e14c8 3d627590 -> 3f800000 3edea66e 3f0cac51", + "3fb86c9f 3f4cfb3c bd295ac8 3f3176dc be2d7d5d 3f0aab1a 3f9ad199 -> 3f24c301 be40d7fd 3f800000", + "3f6ded9c 3f247922 3f22ae04 3ee2fb90 be12d0d2 3eb36bbe 3da64208 -> 3f112235 3f71413e 3ef5818d", + "be238880 3f1a4326 3f592a74 3f95cea9 3f99acc4 be30202c 3f6a8960 -> 3f01718f 3f5f4ca8 3f800000", + "bea99d59 be27ff66 3f4ff9dc bdaf2e70 3f852d99 3f89f897 bd0ca088 -> bdf9debb 3f194086 bdb13260", + "3d7f3d00 3f3d92ed 3f908a0c 3f2e53a8 3f0a0cf4 3d09a370 3f8585db -> 3f442a71 3f800000 3f3a7241", + "3ea2741a 3f681668 3f9844cb 3f84713c 3f6e30b4 3eb76dc6 3f938618 -> 3f800000 3f800000 3f800000", + "3f9dc9c4 3e5c99a8 3e154a22 be7caf36 3f0b1478 3f983126 3e597fc6 -> 3f26f9f2 3f800000 beab2805", + "bcc0b370 3f2d380d 3f1d816d 3e945952 3f3a1cd3 3ec73bf2 3f8a1ef8 -> 3f2a4e76 3f1c13b1 3e90ad35", + "3f494ec8 3ecae0f0 3f075caa 3d245770 3f36b9ee 3f7e6d3c 3eccf6b0 -> 3f6737ca 3f800000 3d6fd7c0", + "3faf4424 3f4199ee 3f819510 3f113ed7 3d88dd40 3e937916 3f646ae0 -> 3f5519ed 3f800000 3f800000", + "3f8c1dd4 3f68a0de bdea293e 3ca51a80 3f384111 3f81be98 3d9db2c0 -> 3f800000 3f800000 3cb44d15", + "3f7e77a6 3ed54ea6 bdb5d006 3e7d1ae6 3f91c770 3f806b03 be3e13bd -> 3f800000 c20191f5 3e55add1", + "bed462ff 3e872554 3e109c00 3f87f810 3f64fc3e 3f9b66e3 3f65f074 -> 3e45249a 3dc05923 3f461ed3", + "3e38ca50 3ed259d8 3f3e9d02 bd089384 3f1d49aa 3f0090d8 3f92e439 -> 3eec94ff 3f519c25 bd2c3f5e", + "3f4765fc 3ec450d2 3edf2ab6 3e67e340 3f26a5c1 3f11f512 3ed29e1c -> 3f471e53 3f48b887 3eaa9bcc", + "3f9864c9 3ef58d28 3ca07aa0 be7890f9 3f2020ca 3f408798 3f8c10ad -> 3f800000 3e3fc49e 3f800000", + "3fbc8619 3ebc2d54 3f857f5f 3f532b0e 3f9ecb9a 3eac008e 3f8b45aa -> 3f800000 3f800000 3f800000", + "3e2026bc 3f1f0322 3f414eb8 3ed83ed4 3ea5dd8c 3f9f3d35 3edf0d9e -> 3f277fac 3f70012c 3ee80e7a", + "3e27bfb4 3ec83bae be4937d0 be14225e 3e85d8ac 3e37b79c bdb59604 -> 3ed13115 be4f4fa0 be120370", + "bee95839 3f39b0a4 be6ac85a 3e73a47e 3e3b83cc 3f272c04 3d3c3b28 -> 3f2b62f7 be34ef2f 3e6ea4f6", + "3f9b32ba be037357 3f870a2f 3c9b6e90 3e5918b4 3f86e78e 3e8fb994 -> be30eea5 3f800000 3ceba1a6", + "bee26f50 3f739e44 3ec89776 3f1fb274 bdab7b76 be430b90 3e5e14e8 -> 3f7cfc8c 3edb0b1f 3f11b868", + "3f976e30 3f6e46a4 3f86ecb3 3d9db7dc 3f137aaa 3f9ce41f 3f05233b -> 3f800000 3f800000 3e4cf8a4", + "bec3935d bd0ae370 3f93722c 3de9a398 3ea53364 3f6ed41a 3f99251d -> bcf74c25 3f5969fa 3da05a91", + "3f82eeaf 3f82d86a 3eac83da 3f4eb642 3f6ed444 3f4ac7a2 3eea765a -> 3f800000 3f800000 3f800000", + "3effaa92 3f733a5a 3e1d0fd6 be0d5d9e bd754b00 bdc2afda 3e5176c0 -> 3f6c2a67 3e15f1b4 be1d72b4", + "3f40aa1a 3f296650 3ef689e8 3dc2de28 3df58654 3f71c806 3cab3450 -> 3f3a3313 3f800000 3dc5fb54", + "3f9cf156 bd08b7cc bdb66ee0 3f5b664a 3f2d63c4 3f46a078 3f72235a -> be499783 bfea4066 3f800000", + "3fafe0ec 3f939803 3f93d380 3f91d63e be0413fd 3eab2520 3e1ac0f0 -> 3f7abf76 3f800000 3f800000", + "3fb3f3a0 be47d8c8 3f887e1a 3e6ef136 3e88eaf4 3f812506 3e868aa2 -> bea01f41 3f800000 3ebd771e", + "3fbcb2dc 3f269571 bd0f19d0 3ec59eb2 3f890f1d 3d862c60 3ecc5254 -> 3f800000 bd1e6639 3f700218", + "3f128f4a 3ed73eca be6c9d47 bd417190 3f9e860a 3f6cf098 3f8c7e03 -> 3f800000 befba66a be0221f5", + "3f68506c 3e343f24 3f99a7fc 3bb83fc0 be6f6350 3f4317d4 3f180e96 -> 3e14b343 3f800000 3c47d7eb", + "3f9d5c38 3e7e73d0 bce07c60 be393ec4 3f521774 be494a31 3f429224 -> 3f800000 bcb4cb76 c0306ef3", + "3f247b5a 3f2a48c0 3f8e4fbc 3f8d1da8 3f97befc 3f810a28 3f882edc -> 3f800000 3f800000 3f800000", + "3f167ec4 3f9911e1 3e625bc4 3f5b458a 3eebb5d6 3e97f460 3eb3cbd4 -> 3f800000 3e891969 3f800000", + "3ef42c56 3f91672a 3f6fc394 bdf08898 3f28a1f8 3e9b686e 3dfd88f8 -> 3f800000 3f800000 bdffa015", + "3f80a6ae 3f8ed61e bcb68650 3e809c9c bb4dc700 3f6b36bc bd87f04a -> 3f800000 be9513ea 3e7122e8", + "3d14b510 3f9f0923 3ea23e14 38d89000 3c460600 3f639706 3f99477b -> 3f800000 3ea7a75c 38e267d7", + "3f9639c3 bdbe3650 3dcd6cb0 be49c798 3f956e23 be5d86c6 bc28b060 -> 3f800000 3da3d428 be475eda", + "3e0f9580 3f3ab906 3ecc55e8 3f0e4c40 3e5c7690 bbebaa20 3ea0f368 -> 3f4088fd 3ecc2136 3f14dc01" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_burn(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3ea22704 3e927112 3f97e0b1 bdb45418 3f3ff93c 3ec5c208 3f7a627e -> 3e65fdb0 3f800000 00000000", + "3f662606 3f6253aa 3f19ed04 3f704bc0 be2489aa 3f615bc0 3e279a58 -> 00000000 3f0d9e15 3f40b5ba", + "3fb80ba8 3f93bbf3 3f1b3ec7 3e4b0b4c 3f286329 3eceadea 3f3a39fb -> 3f800000 00000000 00000000", + "3f91b8be 3f1615fe be2e7cb3 3f3dc5b2 3e8a2bd2 bded60fc 3ecc1bfa -> 00000000 00000000 3e381024", + "3c7bbc80 3f5420d8 3f72020c 3f840a4a 3f2d0e10 3f5e8844 3f8514ee -> 3f53e8a7 3f71fad6 3f800000", + "3f4677a6 3ec2bb50 be25bae1 3f031edb 3e816c06 bcfa7130 bd345df4 -> 00000000 00000000 00000000", + "3e4a1d94 3f3fc092 3dea12c8 3f89ff58 3e1d0a38 3f89bb54 3e8db51a -> 3f32dc9c 3e027224 3f800000", + "3f6f0180 3f857617 3ddc4b70 3f4eba7c 3f56d1b8 3f563fba 3f223984 -> 3f800000 00000000 3f351eba", + "3f8cc1b1 3f8db047 3ed75f96 3e6b8d50 3e811a48 3ea8a902 3ed3529e -> 3f800000 00000000 00000000", + "beda2327 3f67eaf8 3f941b96 3ed39f0a be74b20c 3ebf7974 3e7cdef8 -> 3f703cec 3f800000 3f0e4add", + "3f0822fe 3f04ad7e 3f6fa3f8 3e1eb498 3e3ca9f8 3f057fda 3ee95f22 -> 3e18c2f0 3f6a0e7e 00000000", + "3fa438f3 3f771e7a 3f69c702 be08b297 3d6dd380 be03323d 3f0fb216 -> 00000000 00000000 00000000", + "3f9b7872 3f16789e bcd4bce0 3f8b1e2d be5eddd8 3e1fc15c 3f80db9a -> 00000000 00000000 3f800000", + "3f07fc22 3f2ae17c 3d03b878 be7f5c85 3f63d7f6 3f4b10d2 3e5ecaec -> 3f25996a 00000000 00000000", + "3fa53911 3e542cb4 3ed45e56 3e11bc48 3ee773dc be6174c7 3d526e18 -> 00000000 00000000 00000000", + "3e4bf900 3ed7caee 3ece1aac 3ecf4e72 3d85fef8 bd93b064 3f8e668e -> 3e9409a6 3e7613fc 3ed5fc26", + "be9f4fc9 3f41e8c8 3de87fd0 bd650144 3e548440 3f8cfb9d 3c9fc4d0 -> 3f4e30ef 3dad55a8 3e4382a4", + "bd9b3c48 3f6edd12 3f13932c 3f9d457a bd0339c0 3efb0116 be7f8b6e -> 3f701b59 3f179bc4 3f800000", + "3fa68801 3f276870 3e1e111c 3f0b5288 3f7a6f08 bc40ca60 3f9f3fea -> 3f24d430 00000000 3f2772e9", + "3f02c466 3e7e5f58 3f796448 3f5b234a be21bd76 3e851668 3f02f5fb -> 00000000 3f75600f 3f4ee228", + "be8e7798 3f524cc4 3edd2a40 3f7788ac bcb33390 3f92750b 3ec3760a -> 3f5c6ae2 3ed10204 3f78c6ca", + "3fb0a5cd 3f9595c7 3f873c7a 3edd6dcc 3f711998 bd54b6c0 3f466340 -> 3f800000 00000000 3e350e80", + "3f083d78 3f8b4e00 3e27907c 3e6fb628 3f0a2243 3d509bd0 3ed8e55c -> 3f800000 00000000 00000000", + "3f98535a baede300 3f8e2a58 3eaca1ae 3f98468f 3f8f26a5 3f222ec8 -> 3e3b0a30 3f800000 00000000", + "3e370510 3ec75764 3ead1944 3dec836c 3f176c06 3f42082c bdc9066e -> 3eaeb71e 3e9dc602 00000000", + "beb3d482 bdd80fa4 3c4091e0 3f9eb300 3f189675 3f1e621f 3f9869a7 -> 3d028190 3e038f50 3f800000", + "3f50512e 3eb216a8 be0d9176 be5aaa40 be56def7 3e607248 3f9df298 -> 00000000 00000000 00000000", + "3ec29f92 3f0f802a 3ebe6b80 3f0d6e60 bd27e894 be25f2ca 3e185880 -> 3e8baaac 00000000 3ead4108", + "3f1904f2 3f124070 3ec26faa 3d1d9460 be658cd3 3f7f8c3e 3f26a7c0 -> 00000000 3ec219be 00000000", + "3f09ffd0 3eefd8a4 3d8933c0 3dcd6c98 3ee158d2 3f1f840e 3ed33b98 -> 3e7468f8 00000000 00000000", + "3f8bbea3 bdc8f148 3e7a1e28 3f98c5e7 3f2ea79e 3ef73ec0 3d040250 -> 00000000 00000000 00000000", + "3f8453d2 3f7fb90e 3e99f6cc 3f93226e 3f2630ba 3f264996 3f8caa8e -> 3f7f90af 00000000 3f800000", + "3fa2c7b0 3f9bab71 3f50220e 3ec3d51e 3f2b84de 3f806489 3f09cc9a -> 3f800000 3f5051ae 00000000", + "3f18fcd0 3f61ca74 3f738cba 3f11f9aa 3f5ed5e4 3e94571c bd342fa4 -> 3f5f417c 3f6a5e13 00000000", + "3fab6a02 3f85ba95 3f6fa7de 3f199bda 3f589882 3f124767 3f375de3 -> 3f800000 3f59a2dc 3eb5bad4", + "3ec1a632 bdfa8e4e 3f1be292 3f06d9d8 3f1ae3ee be08a814 3f6c45fa -> 00000000 3ea1856c 3f0336d0", + "3f6e09d8 be2f0e46 3e0e51ac 3ec0d824 3dca1534 3f4d52a4 3f335454 -> 00000000 00000000 3e0b528c", + "3f00c740 3f01046a 3f77c304 3f8293c5 3f5ebafc 3f8fe898 3df702c0 -> 3ef0452c 3f783f1d 3f800000", + "3e45d218 3f0afad0 3ebf2446 3f87e8de bd68c2e0 be31f384 3f82af5c -> 3ed9eb58 3e421928 3f800000", + "3fb82d43 3f1d5389 3e995204 3f86cc1b be2ff73f 3e07dce4 3ed71a6a -> 00000000 00000000 3f800000", + "3fa47072 bd3c0848 3f8d885b be3d7c40 3f62f318 3f5d86a0 3f801b1d -> 00000000 3f800000 00000000", + "3f676806 3f0ff84f bd672680 3f05933c 3f3cd8e8 3f0168b1 3ec11324 -> 3eda4c8e 00000000 00000000", + "3e625954 3f9bf26d 3f547450 3f9ceec4 3f327634 3eb0fb14 bde3c890 -> 3f800000 3f4d174f 3f800000", + "3f1cef34 bc6be430 3f37081e 3ed2e038 be56b490 3f9373a1 3f5e437e -> 00000000 3f3d4004 3eb86948", + "3ee7c264 3f8b75b5 3f12d3dd 3ca80ec0 3ed6b6d8 3cf8e3e0 3f29ecc5 -> 3f800000 3e75b8f8 00000000", + "3e6ec4f8 3f8e5926 3f74869c 3f9de3f2 3c12a480 3ebd543c 3f378960 -> 3f800000 3f728c9a 3f800000", + "3fbcac56 3e38122c 3e947cfe 3ee935d0 3f121a6d 3ec9aa4c 3f29d324 -> 00000000 00000000 00000000", + "3f31e8ea 3f3834b2 3f89dd58 3ec317f6 3f84bcd7 3e900c8e 3e81ea8a -> 3f3a019a 3f800000 00000000", + "3fba9f5e 3e102264 3f2730d4 3f58a03c 3f769f5e bdf06a1a 3db528f4 -> 3dbcfbe0 00000000 00000000", + "3f4c1132 3f1eb9bb 3e80a58c 3d8bebf0 3e668648 3f769ccc 3f9ed5e9 -> 3bc84d00 3e6a34f8 3e5fa750", + "beb77936 3f8ff6da 3f9f0ad0 3ee05748 3f9ce9b7 3ed7fb1c 3f1ab0e6 -> 3f800000 3f800000 3f0208ae", + "3f9edd43 3e332678 3f9a6a9a 3ef070dc 3f02121c bd38fa60 3f88bd1b -> 00000000 00000000 3f02d3a5", + "bbdb85c0 3f3f192e 3f63b47c 3f21e1bd 3f7fc0d8 3e23de04 3ea9abc4 -> 3f3f194a 3f63dd04 3f224d2e", + "3f4b8cf2 3d555c78 3e0c9ea8 3e97566a 3e72dd84 3ec1c884 3e83eb38 -> 00000000 00000000 00000000", + "3f69b916 be58511a 3e0c75ac 3dc3c6dc 3f2e385a 3f2c2752 3f0a3c23 -> 00000000 00000000 00000000", + "3f75b3fe 3f8ad286 3f98b02c 3f87d321 3f8e045d 3f66445e bdb2e6be -> 3f800000 3f800000 00000000", + "3fba29fc 3f325ba0 3e019f34 3e523500 3f96c132 3e8a55d0 3eb4ac5c -> 3f424ef0 00000000 00000000", + "3faa6b09 3f1c9e4b 3f2f9bc0 3ef3c174 3f0da54c 3f28d5ef 3ec511ae -> 3d2c7240 3ed9e448 00000000", + "3f6e1fe6 3f5aedf8 bddbfc8a 3f3d1c0c be539ad0 3dc5da50 bb7eeb80 -> 00000000 00000000 00000000", + "3c74a180 3f51b7c8 3dfdfc98 3f89ece2 3f084908 3e8e7c26 3f066fb8 -> 3f516479 3dea71a8 3f800000", + "3f864d6b 3f725422 3f523b7c 3f91dc0f 3f02b322 3e2ccae8 3f416aba -> 3f63e53c 00000000 3f800000", + "3f23f834 be75008c be23882e 3e9e69fc be111a9b 3f93cfb7 3f6faa44 -> 00000000 00000000 3e8f58ec", + "3ece23d0 3f3381ab 3f5e9820 bdfb6794 be72ba72 bdc2659c be6943b4 -> 3ecf367e 3f444208 00000000", + "be46da38 3f866ff4 3d9451b0 3f8877b7 3f0d8915 3f95510a 3f546116 -> 3f800000 3d29a930 3f800000", + "3fab17e5 be7d5f17 3ec166fa 3eca72b8 3f9ef66b 3f89f33b bd1d393c -> 3d6aed50 3edf63fc 00000000", + "3f86dc1b 3f8eb023 3f16289c be543759 3e768cd4 3f611e1c bd0623b8 -> 3f800000 3f06bf5e 00000000", + "3f7592ce be4a7618 3e379c34 3f97affa 3e446f70 3e9eada4 3f759076 -> 00000000 00000000 3f800000", + "beaf6fae 3f012771 3f7346b6 3f04f7a4 3dfc5630 3f00c0a5 3f2ebd0b -> 3f1e7562 3f7520bf 3f110955", + "3fae4d7c 3eff628c be34dd3e 3f9a9507 3e81214c 3f9684d2 3f3a5651 -> 00000000 3d4ffd10 3f800000", + "befa6ba4 3f366a77 3f94fdd2 be08cdf1 be311c1e 3f397dd6 3f430348 -> 3f513dc2 3f800000 00000000", + "3f72d732 3d06f850 be297c72 3f45ae2e 3e8d2a60 3f8708a7 3ec511f4 -> 00000000 00000000 3ee7f7cc", + "3f94fe4a 3f925194 3f90c7be 3de369c4 3f1b4b42 3f8f6850 3f8136dc -> 3f800000 3f800000 3df74c28", + "3efeacc2 3f2d6cc8 3f9020dc 3f5e6210 3ea64ba2 3f076f60 3f826af7 -> 3f03aacd 3f800000 3f5eb22c", + "3ea47d52 3f035fec be28df90 3f9e8947 3f741478 3efa8ee8 3f561678 -> 3f017b6b 00000000 3f800000", + "3e92955c 3e87d6d4 3f88c9b8 3deb171c 3f55d8fc bd572cfc 3e902972 -> 3e6a756c 3f800000 00000000", + "3e03d4f0 3f5da5d2 3f7f4976 3f8c7acb 3f32af57 3d434110 bdd049a6 -> 3f5c420e 3f7f2ff4 3f800000", + "3f2412d2 bd6c6cb0 3f58bcd4 3f654564 be471beb 3f77e898 3f0296da -> 00000000 3f57ed02 3f5909bc", + "bee80629 be59184e 3e7da9d2 3f409328 bd5f18b0 3f7e2d58 3e61c998 -> 3e383480 3e80120e 3f512197", + "3f5c14cc 3f9fec64 3f489ba0 3f1280b8 3ea193b6 3f4c7284 3ed10ad8 -> 3f800000 3f3d02b0 3e04865c", + "3f2b9faa be400fce 3f9f852b 3f82b924 3f6c4370 3ef4b1fe 3cd91b80 -> 00000000 3f800000 3f800000", + "3f9fd9f8 bdf83df4 3f82b63c 3f60767a 3e6ced42 3f5edf24 3f815071 -> 00000000 3f800000 3f60dcb0", + "3e85bc92 3e742d1c 3dbe6958 3f65db74 3f455edc 3d9bfcf0 3e9bf4a4 -> 3e428ed0 00000000 3f600dfd", + "3e0bb29c 3f1228fb 3f1ccfbc 3f23ca86 3e517f60 be4176b4 3f33a854 -> 3f04ca4c 3f099bcf 3f1fe173", + "3f7d1164 bd152298 3e8ce9bc 3e0795ec 3eff831c 3f3d715e 3f9d2b2f -> 00000000 3cc8c620 3e957640", + "bea75ce8 3f59b280 3f8fe98e 3e07d658 3e763e66 3e6f37f8 bcd92878 -> 3f6150c2 3f800000 3eb37da0", + "3fb0811d 3ef3fbf6 3f900e57 3f76d324 be02c72a 3eeba308 3e4ba388 -> 00000000 3f800000 00000000", + "3f591202 3ee19ce8 3f6ca544 3f4b6b00 3ef1e5c8 be15d396 3e1a1908 -> 00000000 00000000 3e87f8d6", + "3efa32da 3ec47534 3e069f04 3eefc72e 3ed56d58 3f132088 bd606164 -> 3e0d6794 00000000 00000000", + "3fb186f2 3efdef36 3efd21fe 3f7b79c2 bdf491e0 3f842542 3e43a638 -> 00000000 3f042164 00000000", + "3f2f2108 3e5fe838 3f03e5dd 3e8f9e82 3f8bd8d0 3da61cac 3ea2dfa4 -> 3e87c652 00000000 00000000", + "bebf8d58 3f3cb30e 3f6cf762 3da88d14 3f19d0ce 3e817ee2 be1401d8 -> 3f4571a4 3f711fc9 3eb702d4", + "3f5d29d8 3f19cf9a 3f167a7c be64c556 3f22e644 3f53d01c 3f236a16 -> 3ed5fe08 3f03fc5a 00000000", + "3dfa5448 3f3e2b5c 3f6a1200 3f896c77 3f68ad76 be630cb5 3f9f3ba0 -> 3f3d6d95 3f663879 3f800000", + "3fbcaeeb 3ec3175e 3f9dacb2 3f9ef039 3f2d8700 be7802ad be022d16 -> 00000000 00000000 00000000", + "be50e88c 3e22fda4 3e87377c 3f214143 3f82e3c2 3f8a8b38 3ecb5026 -> 3e1f01c8 3e80c6d0 3f2ba1d5", + "3f83afb2 3ee960c0 3e0b47d4 3f8872ee 3d9308c0 be241681 3e11ac24 -> 00000000 00000000 3f800000", + "3fae1aac 3f940b42 3f74ab18 3efd0f00 bd38597c 3f4d7f76 3e2f837c -> 00000000 3f70833a 00000000", + "3f4d1398 3f59d3de 3ee9eca8 bd87dea8 3d586c30 3ea5f124 be0b6d86 -> 3ec38a74 00000000 00000000", + "bccec570 3f719dfe 3db98988 3f9624e7 3e7b0070 3f9dc568 3f0d0afc -> 3f71e2d6 3dae89f8 3f800000", + "3db60208 3d96f5ec 3ecb1ace 3f5d1ebe 3f7eb9ac bc0f7ee0 3f11f05b -> 3d961ef0 3eacaf72 3f5bbc05", + "bdf03578 3f07400a be7833bc 3f164c5e 3f98213a 3f5a0c38 be288683 -> 3f04851a 00000000 3f230052", + "3eee8dca 3cd5c980 3efeb1e4 3ef21930 3e51ff78 3f7393dc 3efe0b66 -> 00000000 3ef8be2e 3e9f4e66", + "3f13e4ba 3f8752b6 3ee47a32 3f3840c3 3f021ddd 3e9106e8 3f0a602c -> 3f800000 3d60eca0 3f1e5398", + "3f596dd8 be517cf0 3f924e07 3f89d07e be1241be 3f57600e 3f3417d0 -> 00000000 3f800000 3f800000", + "3f719fb2 3e9e3b62 3f6168c2 3e5702f0 3f0fbd72 3f59f084 3ee0a76c -> 00000000 3f5c6a77 00000000", + "bd8f2c84 3ee60686 3f18b7ce 3dea2280 3f38ec5c be62e703 3f61b234 -> 3eeb64f4 3f20d822 3df905a0", + "3f393f98 3f57d840 3ee67a70 be56ff08 3cfede90 be47eadd 3f6224a6 -> 3ef34d18 00000000 00000000", + "3e4131bc 3f99a827 bdd9101c 3e726f38 3f753e90 be61bf45 3f06689c -> 3f800000 00000000 3e25812c", + "3ef45366 be0aa3f4 3f42ab62 3f8a6972 be754f59 3ec38d1c 3f643d66 -> 00000000 3f290389 3f800000", + "3f8fb5bd 3f5df030 3c52f6e0 3f64c26c be1972a6 be45380a 3e715ede -> 00000000 00000000 3e80161a", + "3e9f05be 3f8cc2a6 3eb5f8e4 3f8498c1 3e827a6a 3f68adfa be1f7542 -> 3f800000 3eac5cdc 3f800000", + "3dd30580 3ee2bdac 3f84b05f 3f89bc4e 3f495ac4 3f88f996 3ea1fce4 -> 3edc5362 3f800000 3f800000", + "3e9f7908 3f3c8ac4 3f9c9277 3f5a7ee2 3f526056 3f94f58d 3f56f48c -> 3f3893d2 3f800000 3f588638", + "3e8f20aa 3f8b0635 3e90e2dc 3f364032 3f257fb0 3f9eba66 3f735f16 -> 3f800000 3ea7f92e 3f353833", + "3fbbf00b 3e3fc570 3e15f74a bd8d6312 3f9fa9a6 3ecb99dc 3f944b96 -> 3ecec040 00000000 3e080764", + "bebb37fa 3f49e18a 3ee6d498 3ee802b6 3df711b0 3edc8bd8 3cfad840 -> 3f570c7e 3f0ba2ed 3f18a45c", + "3f3aa03c 3f794aa4 be7a96e6 3e654598 3f0fd362 3ea67de8 3eb78670 -> 3f762490 00000000 00000000", + "bea6f18e 3d226ee0 be56f1dc 3e8e8600 bdd9c8e8 3f25632a be682862 -> 3e96a77e 00000000 3ef815dc", + "bef6bda9 be35d3eb 3d978a88 3f5bbd84 3f6b392c 3e130e64 3e6781d0 -> 00000000 3eb0649c 3f659717", + "be230d72 3f23e2ec 3f6524fe 3f4a077a 3ed84c7c 3ed0ce8c 3e8404c2 -> 3f2ba4dd 3f677565 3f4fbbab", + "3fb71b7d 3f05baa2 3e19f61c 3ee6fc40 3ef74a5e 3f0f1dcc 3f69b414 -> 00000000 00000000 3ebefd5a", + "beb3509a 3e8e2e4c 3e73bb30 be294ec6 3f2a35d9 3eaf37bc 3f8c4152 -> 3eb5069c 3ec2e9b4 00000000", + "be9b3985 3dd9d250 3f67109c 3f8d4634 3f8034e2 3f9150a2 be26b77a -> 3dd8ecf8 3f65ffa0 3f800000", + "3f49c8b0 3e01e3ec 3f5843d8 3ee75214 3d182530 3f86fb27 3ed51564 -> 00000000 3f59e71c 00000000", + "bd6205d8 3de1aa40 3f2f49ed bde296da 3f956bd6 be18fc9f bd8a1e80 -> 3dd0ade8 3f341a44 00000000", + "3f5b3b10 3f63c602 3f89e271 3f2921b4 be26ea82 3de20ea0 3f935b8d -> 00000000 3f800000 3f33178e", + "3f649a7e 3f8b0142 3f461134 3b81a900 3f8693de 3ec2bb9e be1173ce -> 3f800000 3efc9754 00000000", + "3e58d8b0 3f9f0a31 3f6f7b10 3f2bbc7b 3f05c602 3e2ec0fc 3e6d4ad8 -> 3f800000 3f6bf621 3f1b5d10", + "3ce04680 3f0e39af 3f9fea8a 3e488b6e 3f41277e 3e7ca588 3f83ad06 -> 3f0d749a 3f800000 3e493108", + "be8da5af 3f4da4e0 3f98ff95 3f3f5e2c 3e776c16 3f69c674 3ec2bc44 -> 3f56607e 3f800000 3f48d38b", + "3ee93616 3f89a5de 3e45aad0 3f6a2464 3f465f70 bd8327c6 3f95f153 -> 3f800000 00000000 3f6bb9ac", + "3e6277cc be373576 3e4a96e2 3e716a60 3ed930fe 3e9dcf4c 3f865f8c -> 00000000 3d58e040 3e79f074", + "bc1fb300 3f7fcedc 3eefe154 3eca2356 3f6e1098 3f73697a 3ebe554a -> 3f7fcee5 3ef002b4 3ecc0626", + "bd5ef920 3f89f7e6 3e5bfb64 3eaa3bc4 3f8e8c39 be028bca 3f209200 -> 3f800000 3e853cfa 3eb107e4", + "bdfc191c 3f54120c 3f01a526 3f0f4cb6 3f37975b 3f3a44ea 3f889a2d -> 3f558c6c 3f05be88 3f0e5c0c", + "be8de8f2 3efc20b8 3f80cc0b 3f7f6692 bc7ab220 3e9ee020 3f8d6599 -> 3f1a995a 3f800000 3f7f61fd", + "3ef56824 3f4d2f5c 3f9ae422 3da477f4 3f9820df 3f9d4d7a 3f86607c -> 3f516550 3f800000 3dd06580", + "3f9e8ead 3ef41d00 3dd26408 3f0fca6c 3f9b2e7e be77320b 3e079fd8 -> 3f15f3de 00000000 00000000", + "3fbf92a0 3f9d35ee 3eaa0d04 3f6946fe be3f0819 3e96a14c 3c063440 -> 00000000 00000000 00000000", + "3e20add0 3f710092 3f6d0de2 3f750124 3f54a2bc 3f9dc560 bd4a7be8 -> 3f7097bc 3f6db8a9 3f72d63e", + "3e33f7f8 3f365894 3f25ab18 3f31fb62 3ec7f2d4 3f045f75 3f598544 -> 3f2d8292 3f1d4a62 3f2fdd72", + "be06a85a 3e826d2a 3b0ee400 3f966b5a bdd9ef34 3f53d108 3e6a1e86 -> 3eb2e45a 3cc743c0 3f800000", + "bcff68b0 3e1d6294 3f9fc125 3f413a60 3f38116c 3f2f4c63 bda49a56 -> 3e24e93c 3f800000 3f434606", + "3f04db58 3ed9232a be2781ae bda14610 be6f8256 3f58b260 bc066280 -> 00000000 00000000 00000000", + "3fa81f31 3d0ba610 3ebf1bb6 3ddcf810 3f9f881a 3f5968b6 3f0c1785 -> 3e8a5a36 3e5fc60c 00000000", + "3f97ce9d 3f34a168 3f8ee786 3f126392 3efba810 3f0862b0 3f789b80 -> 3e843fe4 3f800000 3f0e8078", + "3f4c4708 3da3bcf0 3f7c7048 3f95bdf0 3f377f9d 3f83c898 bddf17a8 -> 00000000 3f7c854a 3f800000", + "3f0cdfe8 3f6d8b9a bd4393c0 be0dbac8 3e987cb8 be6051d0 3f7e19fe -> 3f61ec86 00000000 00000000", + "bded0ab4 3f0f8b84 3f062424 3ebfb400 3f6bad14 3f1b9ece 3e2a4694 -> 3f1091a4 3f0b6e76 3edbe406", + "be52bee6 3f610108 3f5137b4 bdd270d4 3f9d3429 3f6e701c 3eac9b40 -> 3f5f7a15 3f51de70 3cf2b700", + "3f439efc bdf26606 bd89498e bcb85370 bdc8b264 3e4b44d0 3f85379e -> 00000000 00000000 3c095f40", + "bd2880c0 3dcd7a60 3ab6bb00 3e993f9a 3f889098 be18da53 3ea50dba -> 3dc86468 3d3e5d90 3ea2fa5e", + "3e9dd214 3e2f1c5a bb724c00 3f32d1d8 3f517d2a 3f4dfd88 3f39eeec -> 3df98018 00000000 3f2bb559", + "be9d1af5 3eaf55cc bd5766d8 3f5226f4 3f9661f1 3f0e09dc 3f00b912 -> 3e9c3f2a 3d975f20 3f583883", + "3ede918c bda63b58 3f82e4fe 3f3d174b be1b7bb2 3f4dcf6c 3f8b7858 -> 00000000 3f800000 3f3f9982", + "3f652078 be6c4028 3f9129f5 3e1552a4 3f551a58 3f99d561 3f98d684 -> 00000000 3f800000 3e8b609a", + "3de92d00 3e8b918e be331738 3f8d45f2 3f01d564 3f8c0564 3f5d4d6c -> 3e6adb48 00000000 3f800000", + "3ee34532 3f122a00 3ee5c01c 3e23aca2 bdfc6b5e 3f5c5eb4 3f0da158 -> 3e13c55c 3ed32a2e 00000000", + "3f62b5cc 3f9e269e 3ed02ce0 bcbb45b8 3f64c758 3e936c54 3f64a362 -> 3f800000 00000000 00000000", + "be8418c3 3e6a458c 3f4f8882 3f78001e 3e97f400 3ef72c58 3f4f566e -> 3eb1c650 3f553d54 3f785fdb", + "3d11ed60 3de5ce50 3e9afa5e 3f9e3169 3f5a52c6 3f4841e4 3f6f39ac -> 3ddc38e0 3e982fce 3f800000", + "bed04fab be02c27f 3f779b10 3ed5dcfa 3f35ff14 3f636ba4 3f9f1e51 -> 00000000 3f77f86e 3eb52304", + "3f2168c8 3ea5d3da 3ea85844 3f9c573f 3f98b85c 3e929eb0 be78bffb -> 3ecb6782 00000000 3f800000", + "bee8f8bb 3ef47af4 bda6894c 3f982980 3f29f498 3d509a60 3cecb030 -> 3f0bfbc8 3e7aafc0 3f800000", + "bee216f7 3e876360 bdeba1ce bd2249c8 3eb8e938 be4823fe 3d662d20 -> 3eda4128 3e8a5782 3e884b94", + "3de4ace0 bdd4e90a 3e322158 3e8c3f9c be2f8cc2 3f5e67ae 3f38263a -> 00000000 3e258d2c 3e8038ac", + "3fa8a93d 3f307b5e 3f4f3754 bd89bdde 3f264a86 3f6666c0 3f156820 -> 3ed888e6 3f47d01e 00000000", + "3fafc4f9 3e6d717e 3f7f519e 3eb51294 bd5b92b8 3f4d866c 3df1a334 -> 00000000 3f7f10e0 00000000", + "3f81a836 3e093964 be4fc0b7 bd7a1d20 3ef6707c 3f27d42b be65550e -> 00000000 00000000 00000000", + "3f7a2796 3f550f4a 3e544c68 3dcc53c0 3f5574a4 3f6fd9d0 3e0e7984 -> 3f4cbc08 3e1ef9f8 00000000", + "3d904b40 bdc2e19e 3f328eb1 3f8ea9f4 3f2ae7ab 3e935390 bda2d90e -> 00000000 3f2e773e 3f800000", + "3f9bd6bd 3eb7ef02 3f80c55e be7157b9 3ecd45cc 3f31fd61 bde38094 -> 00000000 3f800000 00000000", + "bee9c72a 3e0ce8a0 3f5b521a 3e28b71c 3e80e128 3f981735 3f12f3e4 -> 3eb6e59e 3f57df50 3e99fd2e", + "3f976304 3e01e210 3dae0d04 3f18e492 bd16c7d8 3f317b7d 3bb015c0 -> 00000000 00000000 00000000", + "3fa79d63 3eb44878 3f8a9ee6 3f886af1 3f9b4678 3e472700 3f3a2068 -> 3efca6a8 00000000 3f800000", + "bd82f9dc 3d4c2ed8 3efa6ac4 3f075f2a 3e87b948 bd570778 3f8c5d1b -> 3dbd71a8 3f0574fc 3f069f38", + "3f998f3a 3d285168 bd9a5f1c be2daa9e 3f9aeb65 3f918d68 3f534860 -> 3e6fe8a0 3d9cc1c0 00000000", + "3eda385c 3f19c100 3f97ae58 3eaa081e 3f7fab64 3f50aa7c 3ed4e510 -> 3f19b296 3f800000 3de2a048", + "3f9a1cdb 3eb99a20 3e88deac 3ee8a850 3f582e4c 3f95225a 3f972b04 -> 3e5cc7f4 3ec713be 3f0d5202", + "befb21f0 3f962678 bd52bd10 3ee02bec 3e806740 3ed2df0a 3f749cbc -> 3f800000 3e3c6044 3ee6514c", + "bec41763 3df0e5c0 3f62ce9c 3f9e49f8 3f7d9ee4 3f3a39ae 3f9e5ed8 -> 3df74ea0 3f6590ff 3f800000", + "bec576dc bdb793de 3f044f38 3b3cb800 3f4e60ae 3edc2f98 3ed32de4 -> 00000000 3f1a994d 3e3f9324", + "3f95977d 3f92f08e 3ef7a3a8 bd11e758 3f211f44 3d7ade00 3e991a96 -> 3f800000 00000000 00000000", + "3f8aa3e9 bce73e80 be33d3f9 3f2bae58 3d04ad60 3f953217 3f8241c8 -> 00000000 3b4ffe00 3f2d42de", + "bc17f300 3f9ceff6 3f247f62 3f35a32a 3ef35694 3f8f55d2 3eb6bbce -> 3f800000 3f246554 3f361408", + "3e136c28 3d48e138 3eb0e03c be77cdf4 be263ccb 3edb69b0 3f7137dc -> 00000000 3e92d546 00000000", + "3dd2a5d8 3f80100e 3e4e5dc0 be58c986 3ef859d0 3f04bf15 3bb80500 -> 3f800000 3e23c454 00000000", + "beeee075 3f37025c 3e64d1b0 3f5f145c 3dce0d28 3ed01ee4 3e1a0578 -> 3f4c9589 3ec8a158 3f686ca8", + "be9c6e36 3f4fc39c 3ea1cb34 3f35540d 3f4fd580 bcf8bc40 3f77bb46 -> 3f5262de 3ef5a4de 3f360eda", + "be823119 3f8fe7eb 3f0b198e 3da5ab20 3f0f6c28 be471bd7 3f04bef4 -> 3f800000 3f265568 3e397d70", + "3f771960 bde4f252 bd32af8c 3f0aae77 3f61f908 3f1b5570 3ef86ca0 -> 00000000 00000000 3db67b00", + "3e0374f8 3f5f7392 3f21e0ba 3f4c1dee 3ecb4a34 3f431386 3dbe6298 -> 3f5cb87e 3f1ee962 3f454785", + "3e39f30c 3e2d2bd8 3f8b4767 3dff4d24 3eed3864 bd323768 3db26ce0 -> 3da29930 3f800000 00000000", + "3ef77140 be61d5ed 3e9970ec 3e8d369a 3e55eae8 3f9cbe4a 3c923eb0 -> 00000000 3ebc8b52 00000000", + "3faae02f 3f687de2 3f75183a 3f966060 3eed0c16 3f3cb116 3e346330 -> 3f2cf616 3f6f3264 00000000", + "3f1a2b88 3c8beca0 3da32f28 3eef913a 3f865d00 3f6a4b0e 3f6cb0bc -> 3d3afe00 3cf708a0 3ee29a6a", + "3fb58ab1 3f6f04e0 3f949b0e 3e28c19a 3eea4d30 3f1feef2 3f6c5004 -> 3f366883 3f800000 3d801ab0", + "3f460682 3f348abf 3f9a65e0 be1cc027 3f8cae40 3e39c560 3de44480 -> 3f39e9b6 3f800000 00000000", + "beb5c228 3f681c90 3c826530 3ed8fc9c 3f21d8db 3e5e916a 3eb0ab50 -> 3f6adecd 3e6b66dc 3f0851c6", + "3fb9f920 3f6cc880 3f5f5d30 3f978f88 be66763e 3f9559c4 3f6f3cec -> 00000000 3f65bafd 3f800000", + "be98367d 3f4228e8 3f682108 3f29e230 3e9522f8 3ed339bc 3f0c7a6e -> 3f4cebf7 3f6bad99 3f3411e5", + "bd1f87a0 3ec704b4 be0e5464 3f802a12 3eb31b44 3eb083e2 3e2f2d98 -> 3ecebf92 00000000 3f800000", + "be6aef48 3f80263e 3f89f864 3f1d298a 3e9c7f7c be3dbf10 3eef92e8 -> 3f800000 3f800000 3f27ea4a", + "3ea0b236 be3eb513 be52d6c1 3e2b8498 3ee54d66 3ea8b62a 3f9cad2e -> 00000000 00000000 3e6385d0", + "befa09a5 3d1d8ee0 3e6c455a 3edd884e 3f353b6c 3f9e898c 3f0d9950 -> 3e224b64 3e046424 3f08c894", + "3fb6ebe4 3d4aab80 3edddb8c 3f0ecb05 3f826a3c 3f500e22 3f81a8c6 -> 3d987198 3e67a5bc 3f10da22", + "3e43367c bdc2bdec 3f2c2a2b 3d04b398 3f8fb135 bd9badec 3f818147 -> 00000000 3f16879c 3d0d90c0", + "3fb2fd57 3f85b633 3ea3eb0c 3f3822b2 3f8d11a6 3e5dcde0 3f4aa8bc -> 3f800000 00000000 3f1a9660", + "3f4272e8 3f5cd6b8 3e7c0428 3f8bf565 be2af8da 3f132014 3db24a14 -> 00000000 00000000 3f800000", + "bd073710 3f615990 3ea31ffa 3f645236 3eb65db4 3f5e3216 3bc8a640 -> 3f61fcdb 3ea4a39a 3f65334e", + "3f44d7b0 3eca0606 be4685ec 3f096b44 3e810434 3f3477e8 be215d8a -> 00000000 00000000 00000000", + "3fb071a6 3ebe404a bdeb509a 3f13444a 3e1f4348 bd1a8320 be28fe84 -> 00000000 00000000 00000000", + "3e2242d4 3f948de8 3f76a174 3f5b1820 3f459fa0 3f81784a 3e811750 -> 3f800000 3f76a5cf 3f5621fa", + "3ed4e002 bd809a1c 3f36e03c 3f6f92b0 bc447c50 3f2d084a bda879a4 -> 00000000 3f2b7cf2 3f622256", + "3e4c4e64 3dd4d170 3ec7f208 3f04338f 3e9cb058 3f417140 3e6368fc -> 00000000 3eb7f38a 3edae9c4", + "3ebbc3b4 3e872e02 bd8a4498 3f19a132 3f42fb90 3f330020 3f492bb4 -> 3e462cbc 00000000 3f10e756", + "3e1e7860 3de358e8 3e894cfe 3f6d70f8 3eb9908a 3b08e300 3f8d9e72 -> 3c6057c0 3e09bb94 3f6dbdee", + "3f90292a 3f1aee88 be5b17aa 3f558f3a 3f8da0c2 3f8082d2 3c7370c0 -> 3f25c0d9 00000000 00000000", + "3de0eda0 3eaefc92 3f59d896 3c6502c0 be624188 3f965be9 3f225bc6 -> 3e7597b0 3f5a9072 00000000", + "be128ada 3f3e9cea be43bd18 3f8cbc53 3ee9cd1a 3f5ce620 3f8c0192 -> 3f43549d 00000000 3f800000", + "3f32066c 3f47ea08 3bbb7780 be756fc4 3d7f0748 3f375ff2 bd5e2918 -> 3ebd904e 00000000 00000000", + "3fa2566a 3e48e6f0 be77791e 3f6025ca 3ed8fece 3d7b3e80 3f0e10f3 -> 00000000 00000000 3f36de94", + "3f54e4de 3eb57ddc 3f6ea454 3ee62d54 3f8035ce bd2f3834 bd6ace38 -> 3eb5f13c 3efa9918 00000000", + "3fb2bb25 3ea9bdb0 3eac1a4c 3f3b8bf3 3f46484c bdc98084 bcd9ec98 -> 3cc7c340 00000000 00000000", + "3f27bd9a 3e565716 3f89fc29 3f93f0dc 3ec74588 be731904 3d95c76c -> 00000000 3f800000 3f800000", + "3fa20300 3f83e193 3f52eb2c 3f4b5110 3d1a5b28 be393eae 3ec3294e -> 00000000 00000000 3d4ee540", + "be9c9e88 3f57b6de 3ec6dc82 3f1af037 3f5d03ea be2ed4b6 3f04da51 -> 3f5954b2 3f0cb76a 3f27e6e6", + "3ca4ff40 3e01b194 3eccc3f8 3f347af2 3f27d9a2 3f66b008 3f396c1a -> 3df6e560 3ecc2706 3f340efe", + "3dcb2200 3f6b69c8 3e8e3038 3f09a827 3f109002 3f9c766a 3e56cdae -> 3f6a7bf8 3e962b2e 3eff2f3e", + "3fbdc2a5 bd8eb4c8 3f784412 be5c8d74 3d47a290 3e6d6018 3f6ca726 -> 00000000 00000000 00000000", + "3f194fb6 be111b5c 3f67c59a 3f36c5ea bde51ebc 3f4fbe76 3f836a15 -> 00000000 3f64b054 3f37ecac", + "3f518aa4 3f994f73 bdfb2226 3f94a232 be35eb8c 3f34564b 3e67c0e4 -> 3f800000 00000000 3f800000", + "bec791aa 3edb2caa 3e4d9b18 3f7bc920 3de44dbc 3f194cd4 3f1ff950 -> 3f134026 3e9e22f0 3f7c52bf", + "beb46708 3e97a61e 3bd47380 3f3915b0 be1cf1fa bda0f622 bdbafb50 -> 3effc4d6 3e8f66ea 3f4cc7a1", + "3f376748 3f2b2a30 3f121394 3f1089c0 3f58f2cc 3f58332a 3f50e234 -> 3f20c184 3f044c66 3eff37ca", + "be11996a 3f3e9c61 3f9eda85 3f047d7b be2439b6 3f7297f0 3f35e336 -> 3f47df1b 3f800000 3f095f8c", + "3f908743 3e19f184 3f2063c4 3efc15cc 3e892d10 3f9de19a 3f93bd4b -> 00000000 3f3455a3 3f1150d5", + "3f56196e 3f04dd4b 3d513820 3f97f839 3f620b32 3d4add68 3eed44d8 -> 3eef0366 00000000 3f800000", + "3f6a8822 3f261cb4 3f9ed81c be559d64 3f23dd3a 3f5e3394 be3195f0 -> 3ef3c9dc 3f800000 00000000", + "3e526e70 3f0e8827 3eb17544 3e664944 3f8e1190 3f290e05 3f883b12 -> 3f1109c0 3e985b76 3e70a33c", + "3f89fbf8 3e56c6f0 3e5d2e9c 3cb304a0 3f66b4e6 3f950b0d 3e0e39e2 -> 3deca070 3eab0540 00000000", + "be9c6e30 3f214522 bc9ea6a0 3f542cf8 bd7e1f78 3b930000 3f947d32 -> 3f387a53 3e5f9cd0 3f51ec14", + "be99dda0 3e8a0024 3f20994f 3f9b73cd 3f0b8554 3dd1fe40 3ee99a44 -> 3eb6fcf2 3f34dd11 3f800000", + "bebeab86 be7fecbd 3ef3c9a6 3ee628b2 be2e6e96 3f2248b2 3ee2ac60 -> 3e049660 3f09fba2 3f0b4c79", + "3f7545a2 3cf52440 3c8f12a0 3ed0e6d2 3ea56a5c be23ee38 3f88cc8f -> 00000000 00000000 3ee3a178", + "bdb384b4 3f8ae3ee 3f6a584e 3f9dab26 3e0a5ef4 3d989f94 3f2a8f6c -> 3f800000 3f6bf848 3f800000", + "bef3167f 3f8152b7 3e59aebc 3ee77e62 3f1d0d94 bdaaff00 3e049f44 -> 3f800000 3ef5c984 3f1cc2e2", + "bdefa9c8 3f782154 3e85556c 3ea13b98 3e9d9c7c 3eb75204 3f567a46 -> 3f78b84a 3e9fcaea 3ea7c440", + "3de73480 3f7d66d4 3f5283cc 3f52508a 3e8f9ad0 3f723848 3e9ac4e8 -> 3f7d2c05 3f523c9a 3f4e688d", + "3e99a004 3f9b491b 3e2ee640 3f5d68da bdaef392 be227aea 3f8b90aa -> 3f800000 00000000 3f5e5294", + "3ed34092 3f764102 3f9dc8a7 3e23b65c be6350ab 3f851edb be315f8a -> 3f6c57cd 3f800000 00000000", + "be38adf0 3c5e4920 3f9faa94 3eeead8c 3eef5124 3d8172f8 3f0e6c25 -> 3dccd388 3f800000 3f0176b8", + "3e7d7ef4 3f80e6ef be20a98e be70643e 3f3b5b6f bc9c24e0 3f8cbf52 -> 3f800000 00000000 00000000", + "bebefd40 be20adfc 3e24170a 3f8d652a 3ec1b752 3de967c4 3f2b3b8e -> 3d794c00 3ebcd9a8 3f800000", + "3f9d6225 be553787 3f565656 3ee5d80e be330496 3e940cf8 3f5a4fde -> 00000000 00000000 3ea77b32", + "befaff26 3e8e32d2 bdc27e5a 3e8f44d0 3f116b4d 3f42d228 bcf64ee0 -> 3eced276 3ca2b2e0 3f057ecc" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_hue(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f4d3cea 3f532ea4 3dd7ce24 3f88126b 3f2209ea 3f7ef64e be57af33 -> 3f48ecda 3f5f8798 3e972e04", + "be669382 3d9f1f9c 3f5981ea 3edd8c3c 3f8e2136 3f9ed159 3eadae5e -> bd91611a 3f5981ea 3f033d02", + "3f7de602 3f528b8c 3e9c4686 3f26502c 3f2d10be 3ed0d91c 3e4530ae -> 3f528b8c 3f08a0d0 3e9db922", + "be512fde 3e23fb48 be6e5506 3ec8d36e 3f8313f2 3f741c46 3e9b4efa -> 3de6dbce beb2244f 3f0518fc", + "3ef1e13c 3f9812b4 3f3c4488 bdb07ee8 3ef09962 3f61311a 3ebce6b0 -> 3f3481d9 3f7302db bdb07ee1", + "3e437498 be47d008 be556a05 3f7ed1c0 3ebc6d54 3f21275c 3f574ee0 -> be4a68a7 bda6b222 3f7ed1c0", + "3f8f341d 3f9e6a36 be6f685c bd103920 3e98c792 3e86f160 3e0dcf44 -> 3f9e6a36 3f86e1a2 be83c7de", + "3f46127c 3f598cf2 3f61523c 3f922d48 3dd32cc8 3f8380af 3f0126a8 -> 3f598cf2 3f8a97c2 3f81ce4d", + "3ec5d4dc 3db47830 3ed7763c 3f5be208 be5497e0 3f3c6cb7 3f3a0fe2 -> 3db47830 3f1710b7 3f5b2325", + "3c9fc1e0 be0b0a78 3e89abf6 3ec7eb78 3de38cbc 3f9c31eb 3eb38d48 -> be0b0a78 3e8ae2bb 3ec3ccdd", + "3f5b54bc 3e86fb88 3f677e6c 3d6da130 3f83a29a 3f19fd4c 3e83f1b6 -> 3f50009c 3f00afc6 3d6da133", + "3d81c438 be7eeca9 3e35b528 3ef38834 3ee1472e bdae62a2 3f83134d -> be68aa50 3e1a0aa1 3ef38834", + "bd48a0e0 3f8d7926 3cb2b280 3def38bc 3f8d17de 3f8ea658 3f8d3b05 -> 3f94441c bd00057c 3def29ba", + "3f8fa8a5 3f1eea60 bde88240 3ea6b944 3f925d52 be0b0405 3f130fa0 -> 3f1eea60 bde8823f 3e94a0dc", + "3faa64b2 3f3f4fee 3f5306b2 bd806e72 3e9629b4 3f84d696 3f980728 -> bea97764 3f205bb4 3f8f1e08", + "3e90287c 3f9ce9e8 3f55807c 3ea640ce 3e341048 bb523300 bbfd4940 -> 3f9ce9e8 3f3264cc 3ea640ce", + "bd4f26a0 bbd91580 3e0877b6 3f1a3672 3f12390a 3f73e948 be4b67a8 -> bcdef77d 3de05873 3f2218fc", + "be1e6f8a bb3f98c0 3cc1d480 3e8483b6 be13a369 3efea134 3f86814b -> bb3f98b6 3bc5bbb8 3e8483b6", + "3f830ced 3f448eb6 3f7b7d72 3f914546 3ef97c98 3f6ee93c 3e9926b6 -> 3f611bd1 3f91bc66 3f425152", + "3e2fc4d4 3f1a6697 3e93a3d0 bdd38a1c 3e0219fc 3f8b0c25 3f8044a4 -> 3ef6b7e2 3eaf4d9c 3befdff0", + "3fab69a8 3ee02a30 3f856358 3f2d2baa 3f5e1ee4 3f5c709c 3f2132c7 -> 3f9f9f05 3f8287c8 3eb6ba2b", + "3eac4c1c 3f8068e6 3f792630 3ea50334 3e2556dc 3f05e989 3f5d4bf4 -> 3f4628f2 3f5f3f37 3f0d2a74", + "3f0014b4 3f0cf80e 3f6db058 3e3ff6d2 3e94b924 bde7a22c 3f317bcb -> 3f0df317 3f0ec7ae 3f0ee65e", + "3de2e120 3f8d0186 3ee12bb2 3f7045c4 3ea08922 3f717214 3f8aaaa4 -> 3f839f10 3effdf7f 3f74e57e", + "3f2fdefc 3f8c2603 3ee94f6a 3e46ca2e 3f8ee880 3d49ccf0 3e04b268 -> 3f8c2603 3e8d4f97 3e767b47", + "3f698f14 3e6d1fcc 3f551630 3e73e10c 3f62dffe 3e2f3f38 3e87edb2 -> 3f479a9f 3e918708 3e9be29e", + "3f97d347 be76a2fd 3f1008f4 3d9b44b0 3e23fecc 3f2f4766 3f8072b1 -> be76a2fe 3e4f3456 3f273b7a", + "bedc2e91 3f1c2190 3f759108 3f8b14f7 3f730c90 3d70d7c0 3f2bd961 -> 3ecf4dbc 3f8e0388 3f9346b2", + "3f1d6d66 3eb461b0 3f7ce5e4 3e9bb4a4 3f957f44 3f4bdd80 3f7cb54e -> 3f3e3f68 3f1140fe 3f051f1d", + "3fb0592e 3e88fcf8 bdf98790 3e97096e 3e6532ec 3ef83eb4 3f70e436 -> be89b05e 3db28d30 3e97096e", + "bd98a98c be1d9765 3f9982b9 3f277c94 3f773bec 3e3613c8 3ee31060 -> be8270fb 3fa66c0b 3f2e3395", + "3fa51d31 3f904673 3f1cdd2e bdc5d90e 3c0aab00 be2e4065 3f1678b4 -> bda29c40 be9ac526 3fbdb195", + "3e1637c4 3f3f16ad 3eb7113c bda9dc7a 3f9ec7aa 3f35533a bcdcd7b0 -> 3f3f16ad 3eba1ec7 bda9dc79", + "3fab64bd 3f8c1825 3f978ef8 3f77e174 3f1ff24e 3f07418c 3f8d9b93 -> 3f794529 3f6527a8 3fa0ebdd", + "3f52765c 3ede73cc 3f83f1f0 3f97d97c bd4d7f38 be3ffb55 3f7bbe6e -> 3f01c880 3f0a61dc 3f97d97c", + "3f04b48e 3f8145cc 3e3ab564 3f9de851 3f90c445 bcb5d9f0 3f3e6643 -> 3f901dcb 3e3ab567 3f867b94", + "3eef0a88 3e0022d8 3e1a55d0 3f68d3de 3f376d98 3e18f264 3f2c5b51 -> 3efb8f59 3e0e1a7b 3f61adda", + "3f5c8a6a 3f454670 3e03011a 3e6ef59e 3f836610 3f37caf4 3e426400 -> 3f454670 3ef46b2b 3e11f51c", + "be287616 be7061fa 3f6f9b20 3dba4cf0 3f664366 3f16510c 3dce9828 -> bedacd0c 3f817183 3e140550", + "3ed8dd54 3f54f950 bd06e198 be43f582 be6e4510 3f5aba44 3f78a30c -> 3ecc0800 3e95295b 3e77dfbe", + "3f930764 bd9925d6 bd886188 be0fe4dc 3ef60410 3ef56600 3ecee650 -> bd85e36d bd8b204b be0fe4dc", + "3f4adf72 3f48887c be43c9a3 3f94425b 3e0413ca 3e3b6f50 3f9c387c -> 3c34f080 be0d8cb3 3f94425b", + "3f86a24f 3f272398 3f33f590 3e316fac 3eb06c6c 3f0b256f 3e863b1c -> 3e9f8966 3f33f590 3e316fab", + "3f946d63 3efe2474 3f648704 bc975ba0 3f240024 3ec9267c be5ebc32 -> 3f74b7f8 3f166f9e bc975bad", + "3f0ebf32 bd87e394 3f59d13e 3f32fedd 3f0b8254 3f73b846 3f846e5c -> bd87e390 3f43bc1b 3f48a48d", + "3f208ee2 bd633890 3dfdb4f8 3e979432 bc3a02c0 3f8492ec 3f084248 -> bd63388d 3e6d6d94 3e429abf", + "3e11fac8 3f608d88 3e3b13a0 3f053e74 3e1dd4e0 3e058838 3f475f88 -> 3f4822ca 3e3b13a0 3f1242c3", + "be85c618 3f039c57 3f62a6b4 3f2c3886 3d794d70 3eeb0af8 3f9ef381 -> 3f039c57 3f731c27 3f1dffd8", + "3f3d0c10 3e94d996 3f9060d3 3f8b80f2 be2780f8 3ebe446a bd973e88 -> 3e94d995 3f9060d3 3f1a775c", + "3f220694 3e54f164 3e561764 3f55829e 3ef6471c bd835e10 3d8c4260 -> 3f1aacef 3e555d51 3f08bfe7", + "3ee39304 3ea87de4 3f9048ea 3dd8f20c 3f41ff98 3f7adb48 3f03450f -> 3eef9f54 3f9048ea 3dd8f20e", + "3f7e0642 3eeb8438 3f3606ae 3e722bb4 3c4c4bc0 3e81e2d4 3eba735e -> 3e73efd6 3f1028a6 3f3516ae", + "3f39def4 3f9b9545 be64e6a4 3e6fb5f2 3e78cb28 3f857adc 3f955110 -> 3e2ec528 3f2e6aba 3f72576a", + "3f84ea73 3e7bd3e4 3ee9906a bdc83e68 3ed40746 3eb65430 3f61da16 -> bd42c818 bdf3d068 3ef474ea", + "3ec8d87c 3f9c9f87 3f6fbbd6 3f6c51aa bd6322f4 3eebae7a 3f387e96 -> 3f8d88e6 3f813950 3f853f76", + "be81b19d 3f810a71 3ea23488 3f0d9540 3f3aaa36 3ef543e4 3f87a22d -> 3f8dcca4 3ea23488 3ee0255c", + "3fa31c75 3e2aebe0 3f1a76f8 3f89774a be073cd8 3f4fde80 3f970edc -> 3e2aebe1 3f60f5e6 3f89774a", + "3e205f00 3e3afe0c 3eb32a44 bc43cf10 3e127a18 3e1b98b4 3f4df776 -> 3e1bca59 3e9689b8 3d3730ab", + "bec73abe 3ed7933c bd3d9f18 3dbfdf98 3ebf625c 3f616afa 3e4cce0c -> 3f0e73e3 be699ef7 3e17b6c7", + "3ef6b2d0 3f83256c 3f103942 be3a7286 3f858d16 3f64bb18 3ef813a4 -> 3f83256c 3f21313f be3a7285", + "be64e1d8 3f35ac12 3f6e583c 3f438894 3ea0a78c be1288ec 3f895a7e -> 3f30e9d7 3f7b0311 3f39f6e6", + "beca0ffe 3f8d289f 3da04d04 3e97a5b2 3f4b4b98 3f73bc5e bd96050a -> 3f9521e1 bea6f1a4 3ec3adf5", + "3f6354ba 3eac4d68 3f2f60e6 3f8697a5 3d6f10f8 3f954390 be17b24e -> 3edf614d 3f8156fa 3ed54c32", + "3e90c8b6 3de7a1b0 3e566534 3dd7c838 3f5936f8 3f1c10d8 3eb04f44 -> 3e0fb137 3e482028 3dd7c838", + "3eb68054 be57092b 3f80c59a 3d98b4e4 3f9591b3 3ee427cc 3d0fc288 -> 3e64d11d 3f3ac56a bcdc17f8", + "3f4c19ea 3f2b3ce6 3ef2d05e 3f8a2560 3d388688 3f7b427a be7bc020 -> 3f20c703 3f74e468 3f18ce88", + "3f174b2c 3f900e37 3f86148d 3f546596 3f96d74d 3cbe8480 3f720382 -> 3f900e37 3f6b3467 3f781d68", + "3ed5b5b6 3f906c2e 3c868280 3f3c291e 3f7a33fa 3ec3eccc 3f5eca64 -> 3f906c2e 3c86827f 3f50cb27", + "3e973fa2 3ef17de0 3ed11f1c 3f371cce 3efe99dc 3ef51ab8 3f2fc9e2 -> 3eec1198 3ed11f1c 3f371cce", + "3fa00d05 3ea4fcd8 bce87870 3f602832 3e8350f2 3f92219b be3a4f92 -> 3e8437e6 3f8d0d5d be826c98", + "3f874689 bd207490 3f9c7245 be725d62 bd85dacc be1bf22e 3f826972 -> be08a9f0 bea3a3dc 3fa70f90", + "3e19d42c 3ed2e064 3f069370 3f6b885c 3eac3966 3f26241f 3f9a25fd -> 3ed2e064 3f093cf2 3f6b885c", + "be919c68 3f3d5720 3f16ed7e bd710940 be3f89fe 3ed46388 3e016e4e -> 3f7778f0 3f0c00d8 be355b5e", + "be72b586 be3c9d7b 3de96f94 3f4c3b7a 3e816a3c 3ea28c2c 3f4164d8 -> be3c9d7b 3e1e6812 3f4c3b7a", + "3f122802 3f536cde 3f9a1eb2 3f2c0622 3e06c3b8 3f609766 3f453a56 -> 3f3cee1f 3f9a1eb2 3f6ea538", + "3f873fc3 3d34f8a0 3f38c076 3f4aef54 3e91e5e2 3f8cfbc0 be107fac -> 3ea17ad6 3f4bf6f3 3aeab000", + "bed72e0a 3f90fe0f 3f85ca38 bdb67e28 3f8a349e 3f3b7de8 3f66ae2e -> 3f90fe0f 3fc2cfd1 bead5325", + "3f7189bc 3f21cebe 3f2f38c6 3e462be2 3ef422e4 3f711088 3f386bd7 -> 3e5f8a28 3f2f38c6 3edf5ac1", + "be9cffc6 3f5bb698 3e5cb4b4 3f6e8f88 3f47bd5e 3c5b82c0 3f6f39c6 -> 3f5f59bc 3e5cb4b4 3f6e8f88", + "3f72af1c 3f12560d bafb8880 bd3943b0 3f82c65d 3e3c4690 3e7a16d2 -> 3f12560d bd300964 bb4b0510", + "3edabee4 3f8f1684 3ecc0030 3f472a90 3f103a44 3c8f6fc0 bde6862e -> 3f8f1684 3eea488d 3f1da741", + "be83094c 3ea33304 3f230b40 3ed897c4 3f55c82e 3f8d5b55 3f7876b4 -> 3ea33304 3f230b40 3ed14880", + "be775f58 3e8a093a 3e69eca4 3f679f7c 3f97c36f be4cc604 3f45bf90 -> 3dede4ee 3e69eca4 3f741888", + "3ed44286 3e832694 3f8e2fe6 3f413592 3f568974 3e32993a 3e652d9c -> 3f1c4866 3f41aab0 3f130c2c", + "3e7e2058 3f4c1234 3f9a623b be448df7 3e98d886 3ed050f6 3e0c7ede -> 3f425e5b 3f9a623b be448df7", + "3f5a2cf2 3d138ae8 3f2a6069 3f94eb96 3f2c950a 3f153c9e 3f9b21ca -> 3e338793 3e042120 3f94eb96", + "3e609b1c 3f5421ee 3e84874e 3f98fa98 3e22dd88 3f9b6189 3f246536 -> 3f342336 3eedad98 3f8abb1e", + "bdc74604 3f82838a 3e999892 3f8b02ee 3e090c94 3f38c625 be764574 -> 3f87ab1c 3e64dfbf 3f94cd1b", + "3f262254 3f09a04d be682c0d 3f79b0d0 3f8bea98 3f69e3d4 3f5f3674 -> 3f525a09 bda30ffa 3e47ef04", + "3f5cb468 3f2e46c8 3ebadec0 3e92b7d8 3ee51c5e 3f1556fd 3edbf8d2 -> 3ec2bff0 3f232176 3e92b7d8", + "be4115b2 3f501ac0 3f7dc850 3e85e3a8 3eef23c4 3f4f7bfc bdd42118 -> 3f54ba3c 3f7dc850 3e85e3a8", + "3f3c9724 3f1a1c24 3f4f4064 3edba424 3e578cf0 3f54e632 3c152840 -> 3f0b0e8b 3f4f4064 3edba424", + "3f9a076c 3f27f82e bce52b20 bdaeb710 3f6f6254 3e02c450 bdc7c044 -> 3f27f82e 3dc7f782 bdaeb714", + "3f54cb2c 3f246b6d bd7d9a38 3f54bfda 3f6b58ca 3db868fc 3f4495c8 -> 3f4c97b2 bd7d9a3a 3f320e26", + "be9b0cf2 3f926a24 3f289942 3f762934 3ec2d828 bd197348 be39e9fc -> 3f926a24 3f1ef46c 3f86d31f", + "be65be46 3f0f03f9 3f131408 3f6ab142 3f94a514 3f8e7963 3f979431 -> 3f011348 3f13fd61 3f6ab142", + "3fb502c6 3e5ad266 3e97bd7c 3f21f1f4 be2c097e 3f1ce1d1 3f7e7c2c -> 3e5ad265 3f13d690 3f21f1f4", + "beef2e61 3e1262e4 3df99670 3f432bd8 3e5297a6 3e8de8e4 3ef8671a -> 3e1c7926 3d399ba6 3f432bd8", + "be8b81cc 3f4da1f4 3f2e31fa 3f4c3918 3ef0ddba 3ec1cc2a 3f079636 -> 3f50fce1 3f2e31fa 3f4bd6c5", + "3f470a7e bdcac6fe 3f37a8de 3f8a3b94 3f1e7d67 bd730dfc 3f521ece -> 3f1b8a5b 3da93f98 3f8a3b94", + "bebd74ca 3f25c29f 3e7ddf6c 3f830c16 3e877c9c bd0206b8 3f50143a -> 3f31d1e7 3e7ddf6c 3f830c16", + "3d9248c8 3f6447a0 bd53219c 3f565b2a 3f3a2b4e 3f830cce be01cdda -> 3f5fd55f 3c81ad14 3f461a42", + "3f55a4bc 3e92ccea bd502a58 bd99cea4 3f6f745a 3f1551f4 be5b0c02 -> 3e92ccea 3e0dafe7 bd99cea2", + "3f964159 3f927107 be061f52 3ee1b698 3ef81960 3ecf245a 3e68f12a -> 3f927107 3f666930 be6bee68", + "bdaa1af4 3f5435e0 3f4d7acc 3eed0074 3ed82564 bd9d1514 3f96ad34 -> 3f58e5ad 3f54b43e 3edd6f54", + "3f53c822 3f8fdd7a 3f7d13ac 3f9873ce 3d714dd8 3f6c1f54 3f7df880 -> 3f8187fe 3f925fe6 3f9873ce", + "3fb0e6e3 3ef6c828 3f9aeef6 3f7e4390 3f1acc79 3ed01358 3f9a8629 -> 3f3b33d6 3e509818 3fa58e0d", + "3f7c563a 3f04ab84 3f67b0fc 3f6f090e 3f1b7d2c 3f48e1d0 3dbc9178 -> 3f52ac2e 3f6eee27 3f063126", + "3f5680c2 3e03febe 3eaa79c2 3f83d8cf 3f504d68 3eabafde be095a99 -> 3f624c74 3f0935a9 3e8cc9b2", + "bed52600 3ecaa634 3dfed780 3d6189d0 3f59bc3e bd5cddd8 be7a6a33 -> 3ecaa634 3e03b570 3d6189d0", + "3ec47406 3e57a6b8 bc842df0 3f205f7c 3f6932a0 3d3447f8 3f8c03d8 -> 3ea78678 bc842dfd 3f205f7c", + "3ec3fa9a bdbb2e10 3f3297bd 3f90a01c 3f9fc440 3e8a5ff2 3ee5999e -> 3ec08cf8 3eca8da8 3f3f61dc", + "bdaf9198 3f92e4e8 3f47772e 3f884ac2 3ec6f71c 3f55c838 3f9efac4 -> 3f96efea 3f433c38 3f876215", + "3f53a45a 3ecfad96 bdb65014 3efd8eee 3eac8ecc 3f604f26 3f8ca44a -> bb590a80 3e8178a6 3efd8eee", + "bec52810 3f5602fe 3f302af3 3f80881e 3e575e28 3f99d36f 3e4e54a2 -> 3f644f39 3f110466 3f901b64", + "bdb7ec64 3f2bd26b 3d6a9910 3f724a8c 3efb3aa0 3e7e29f8 3dbb14c0 -> 3f257e4d 3cd43d98 3f835dea", + "be53384c 3f62a524 3f9338b3 3f50c4e8 be3d602a 3f2adc8c 3f8043b4 -> 3f665514 3f95b666 3f3f18e7", + "3efec36e 3f1863c3 3e760c60 3e5902c0 3eb8d3d4 be724054 3f6af040 -> 3f00d669 3e679984 3ece2b18", + "3f9eb742 be355db3 bdf33fd4 3ea5d674 3ed5eab2 3f9f5f8e 3ea6da00 -> bdeb7f92 3edc39f3 be983d5c", + "3e86e8ac be764cd6 bdfe8022 3f49b0f6 3ea31238 bb4859c0 be7cddf4 -> 3cf968b0 bd1bc186 3f04527b", + "3e0a7cc8 3ef19b38 be06d420 3f92ef20 3eac7b74 3f6692f0 3f0655d1 -> 3ec7d05a 3d2983c0 3f842a0b", + "3f5c4234 3c3125c0 3f6e0290 3e8b3ee0 bd28d650 be1cfb48 3f1687b2 -> 3e057a7e 3e0e71e0 3f56802b", + "be375972 3e4a9f6a 3f0acf8a 3f8cb6d0 3f981b79 3f08a4e9 3e815dea -> 3d155da0 3f0e2e74 3fa15fd0", + "3f218d20 bd9773a2 3ebebea4 be356023 3e8196c2 3f81facc 3f65ce32 -> be0e65a9 3ebebea4 3dede41a", + "3f802591 3f8320b6 be63b03b 3f3f1eda 3ed749ca 3f7fbee4 3cb23c80 -> 3e922d88 3f834f8c be64d368", + "beabc4ed 3df9c0fc 3ea0c4e4 be674f41 3de6e7d8 3e1269b8 3d0e13b0 -> 3ddd5ce4 3ea0c4e4 be674f41", + "3f9fed53 3e4e55da be4ad0d5 3e560af6 3f92fef8 3f7ce550 3da7c030 -> 3e57f71d 3e6f9f4b be99657b", + "3f6a5bea 3f156070 3f704356 3ec2a452 3f3692bc 3f40198e 3f60cd8e -> 3ecb7165 3f0aeccb 3f642def", + "3e694058 3f3eeba6 3f899b23 be2a369a 3f914eac 3f6087a0 3f927ca7 -> 3f4fa038 3f4ad47a 3deea12c", + "3e1810ec 3f66ee9e 3f468096 3f49cdb6 3dc81258 3ea1eb9a be07dbb3 -> 3f649665 3f4b5174 3f495035", + "becc2b63 bcb25cc8 3f89a0b8 3f5359f8 3e1029ec bd032468 3f4945dc -> bde9ca8a 3fc19eeb 3f39de54", + "3f90fd64 3ea42710 3f5d253a 3eb59ae4 be63bed8 3f10d62b be3e325a -> 3ea42710 3f5d253a 3eb07e5f", + "3db40a70 3db684d8 3dee6588 3f751228 bab55680 3ec988ae 3f53da18 -> 3db684d8 3e19fc14 3f751228", + "3f2b10a2 3efa5854 3f985cec 3e68fe8c 3f0412ce 3e0f9fb4 3f1360d0 -> 3f5e8a94 3f0c0633 3f5ef348", + "3f10de76 3e8d966a 3f2bb508 3f4cfba4 3ed7df04 bd1110d8 3f3c5535 -> 3ee79b1e 3ee533a0 3f4cfba4", + "3e9d3392 3f8e80f3 3f4df830 3ea51082 3f084bd6 be21e13a 3f123ffa -> 3f8cd8c3 3f2811ee 3f10b2f3", + "3d890140 bd1eef24 3f3aa4e7 3f8dc686 3d7b1750 3f8a42f2 be517737 -> bcbbdb72 3f41207e 3f83f579", + "3f157d5a 3ed167ca 3f8a5dc7 be1a8c27 3f9618bb 3e945df8 3ee64682 -> 3f4d2896 3eb92626 bca886b0", + "3f51abea 3f9143cc 3eb234aa 3f5ff7ae 3f89f2e6 bd21af48 3e3354f6 -> 3f9143cc 3eb234ab 3f113308", + "bee1e9ce bd68fce4 3f4dd1ce 3f1b20c8 3eb3ce72 3ea83c68 3f8af6d2 -> bd8bb709 3f9787ab 3f04c2d7", + "3e09a3c8 3f0fd480 3ec513ce 3f375980 3e9a794a 3bcd0e40 3e4dd16e -> 3f15245d 3ec513ce 3f3376b3", + "3e509098 3e5853bc 3ebd652a 3e518562 3e9ec412 3f07be9d 3f9e446a -> 3e56f0dc 3eb040ff 3e73ff4a", + "3fa964e0 3f56f97a 3f339eae 3eff7c18 3f6cbff6 3d131f48 3f5db268 -> 3f56f97a 3eddee6c 3f6b8c4c", + "3fbc5188 3e537770 3f329092 3f34660a 3f90d153 3e15aaf4 3e063f2c -> 3f707f1b bc62b4c0 bce766a0", + "bef3a860 3f96698c 3e80d88c 3f75ca3c 3f0067b0 bd24b710 3db27a68 -> 3f96698c 3e80d88c 3f98d3e2", + "3fa5ea43 3ee4634e 3ec406ee 3f1ef4d1 3d094e00 baa23500 3e589748 -> 3ed440e8 3ec406ed 3f1ef4d1", + "3f3b438e 3f9d33e0 3ed72cac 3f0483c4 3f2e266e 3e4131a0 bd9677e8 -> 3f9d33e0 3f2033aa 3ee48f81", + "3e9be73e be17337c be127511 3f2d2744 3d2ec3f8 bcf89890 3e7d51a6 -> bda74e03 be13e6da 3f2d2744", + "bcd6e4c0 3f6ff954 be743226 3ed733fe 3f8e17b0 be386dc0 3e84f480 -> 3f6ff954 be743226 3edaab00", + "3e5c09d0 be06e6c1 3efd2e3a 3f877d2c 3ea4141e 3f663988 be6b2054 -> bbe939d0 3f1d9dd1 3f4d80bf", + "3ccbf8a0 3d8cd9b4 3f90649e 3f242b17 be59f3c4 3ecf192a 3e9c0f44 -> 3d8cd9b4 3f90649e 3f262e4c", + "3e0d209c 3cdf47b0 bd80edd6 3e4df0e0 3f9a8f2b bd3a1370 3f2a2a26 -> 3d51c8e2 bd80edd6 3e3dcbcd", + "3fa1bffa 3e142628 3d0a2f88 3e55edc2 3f9ebcaa 3f8b7d72 3f3de8c1 -> 3e6745e0 3e40d2df bc4c0640", + "3f584b18 3ebe2000 bd4a52e8 3e319602 bd91ad54 3f99d5c9 3e0cc34e -> 3c81f110 3e9cb692 3d31d3b8", + "3fa8164a 3f967f9c 3f35896b 3de0e2f8 3f0a12e0 bdc03740 bd2511d0 -> 3f967f9c bd9f8358 3e69ad56", + "3f9b0ff2 bcaccff0 be5c0f4e 3bb49840 3f50aea6 3f98a664 3f904044 -> be830263 3d557370 bd2792c9", + "3f36a974 3f898898 bcfc4718 3f938885 3f8ec2e4 3f58501c 3eed43be -> 3f90ab29 3eed456e 3e9dcf22", + "3f90d32e 3e57d092 3f197ee8 3ea92176 3f879f52 3e8e9e54 3f228f81 -> 3f26947b 3e237a46 3ecaaa80", + "3f8c5ccf 3f6d6e6a 3e5f1658 3f8ddc5d 3ee7c206 bda94990 3ebca95c -> 3f9018a1 3e5f1659 3f746ac1", + "bd006a40 3ef4b1b2 be22809e 3ed616ea be4e693d 3ee8f682 be57dfcb -> 3efec567 be36f0a7 3edf594d", + "be8ed53b bab26800 bd3edbfc 3e332ab8 3f92d70e 3f5d683c be1b1b0f -> bd4f0f45 bdc27f5e 3e7275ce", + "3f0ffe6a 3f9d9e85 3e8aa8ee 3d822470 3ddadbb0 3f6c8ef4 bde8dab2 -> 3f36d0df 3f4fa5c4 3d822472", + "3f49641a be0fd5ef 3f83c5d2 3f3ad43c 3f60a9f0 3f131f62 be27cd30 -> 3f47a803 3f430518 3d390be0", + "3e70e5cc 3f513698 3e16c1dc 3de66d14 3f833afd 3f022bd8 3e9e0822 -> 3f513698 3e3dbc8f 3de66d14", + "3e9740ea bdfa108a 3ef80b28 3f88900b 3e0f536a 3ed933a4 3f4eccbc -> bdfa108b 3ee8d82e 3f88900b", + "be5e637e 3ecad94e bdc1cf94 3f94c844 3f29e6ee 3f095644 3e1a319c -> 3e6b4f44 be999258 3fb7b999", + "3f8c20ea 3f99388f 3f4b742c 3dc42c6c 3e791f68 3e6dc010 3f22eff2 -> 3cc92b40 3cf22580 3fa693d9", + "3ea6263a 3d7d4348 3f703738 3e2eef08 3f90adf0 3f99fdac 3f5d44f4 -> 3e920342 3f703738 3e0ab666", + "3ed12b38 3f8730e4 be400bd4 be031f74 3dd9e318 3f4a352a bd4b9884 -> 3f247dca 3ea42014 be1c0313", + "3fa6ff68 3f84a771 3e7c91e0 3f9bc34e 3e7fd48a 3ea82fdc 3f00bdbc -> 3bc63e00 3f23dd9c 3f9bc34e", + "3f48d27c 3f5fc596 3f5143b4 bd13cff8 be58db8e 3f6f804e 3f1af9b6 -> 3e23eff4 3f5ca51a 3ef1e497", + "3f7e5ca0 3f1a3c4c be6edfac 3f082e20 3cd77a80 3f6c1420 3f9d3501 -> be6965b4 3ec57c08 3f1a1eb8", + "3fa09bd2 3f4bce5c 3f256455 3e84f1f4 3ef13cf2 3f98c3e4 3f47dd24 -> 3dfbe398 3f5597a1 3f0c523c", + "3f1eb928 be20dbf6 3f852c32 3e9d5518 3f7f211a bd4ba10c 3f8bd922 -> 3f05e35a 3e988c58 3f430796", + "be924f60 3e989f68 3e03fbc8 3f9f295b 3f93ac0b bdee6e54 3f67b078 -> 3ce4ea70 3e03fbc7 3fa72489", + "3ed57c50 be0431f0 bd3073e0 3f8bc962 3c8f6180 3c12cf40 3f4faabc -> bdfd4956 bda1ae2c 3f8bc962", + "3dd6e538 be512c28 3f170a03 be2dfdc6 3f8f1085 bce47150 be59aa7c -> bdf7a928 3f04aa63 be31aecf", + "be37fd30 3f59c024 3f350da2 3f83ab54 3ec5204c 3f78e098 be01b406 -> 3f5975ae 3f2644bd 3f8b0fc7", + "3f5ffb70 3f8375a8 3f681874 3d2a8028 3f3c3a5e 3f434772 3f35a33c -> 3f14d5f6 3f818834 3d2a801f", + "bdc0cf00 3f634924 3f09db69 3dfb1df4 3f49e1ea 3d95cc4c 3ec1b638 -> 3f634924 3f13e164 3dbc2de5", + "3f3bce74 3ee0d726 3ed5cc6e 3e508db2 3f6f3c8c 3f9c1934 3e0b9584 -> 3ec991a9 3edde62a 3e508db1", + "bedfca8a 3e4d3984 3e68a7f2 3f908008 3f9d34bd 3f870e72 3f95d0da -> be525a28 3e74a564 3fa1d50c", + "3f436a16 3f2bf150 bd103f28 3f04c7f0 3e254676 3f481d7a 3f68120a -> 3e073e08 3ed3f3d9 3f22acaf", + "bd29fbb8 3e99c09a 3f4ceac0 3f0840ae 3efe0794 be17e202 bdce38d6 -> 3e8f2000 3f523b0d 3f0a52f6", + "3d33a6e0 be4b4596 3f751cd0 3da1f900 3f931176 3f28ba44 3f10a5b0 -> be175a78 3f6a3948 3d890990", + "3d470c10 3d2276a0 3f13333c 3f33539a 3f805718 3f7cad9e 3f3be888 -> 3d92fff9 3f14486d 3f2b1b05", + "3f1a2694 3edbdcf0 3e269fca 3f41d0e4 3f752a8e 3f4a0188 3f1b5d08 -> 3f207151 3eb27d00 3ecc62a9", + "be58d644 3ea5beb6 3f5a9bce 3ec1209a 3f0a9c10 3f38c913 3ea9a548 -> 3e86d052 3f5a9bce 3ec6ecfb", + "bea13746 3f5dfb78 3f6be2be 3e40e306 3f8f1574 bc54e100 3f63a83a -> 3f599abe 3f937cfa 3b8979e0", + "3d02a5f0 3f050d2d 3f4cc0f0 be2ee5c6 3e158a7c 3eb5f80c 3e927600 -> 3efed36c 3f4cc0f0 be19b238", + "3eaf6fbc 3f23c8d1 3f88ba2b 3ed146da 3f85b7ee bd9eb3f0 3f446b44 -> 3f495ce0 3f579c18 3f142ee4", + "3fa9f68e 3ec6859c 3f8337e5 3f49d93c 3ea00bf0 3f0adbdd bd6ec008 -> 3f6908eb 3f8337e5 3e834206", + "3f4dbf00 be15fbf7 3f73aed2 3eb70db8 3f97f899 bc859e98 3cb92970 -> 3f3c7c7b 3d8d9ac8 bc9b9550", + "3ecb1fde 3f67507e 3e8635b2 3f9141a4 3f400122 3f8c2027 3e35f4a2 -> 3f5d7bc0 3f1bbca8 3f49e178", + "3fb09633 3f1ce704 3f2d8a56 3f0fc7f0 3e3c1604 3d911040 3f558dec -> 3f10de94 3f047c1e 3f38d628", + "3f8a0f07 3f8493bc 3f9bf670 3f3f2c32 3f0c9f92 3f506760 3c932e20 -> 3f882488 3f9bf670 3f3f2c32", + "3e0e8384 3f92b97a 3f265f86 3f0e24f0 3f31d09e 3f32943a 3f2bd088 -> 3f918903 3f380f0a 3f0e24f0", + "3ec6cb1a 3f8c890e 3f38bfb3 3e55c5b4 3df947d8 3c5c6d00 3f9acefa -> 3f48b0d0 3f05c458 3f0dd2dc", + "3f92fae1 3f0e597d 3f062025 3d36ebb8 3d9f49a0 3eaddc38 3f9b0844 -> bcff5c20 3ddfb2b4 3f21c31a", + "3f999287 3dc72ba8 bcbdd6b0 bdf7fc4c 3e62e754 3eb70c26 3f859c5b -> be28a8fe bdc75baf 3e1040ac", + "bd9c44e8 3f7bc1f2 3f5c5aa8 3ec6a342 3ed6d756 be7b4097 bd68cb60 -> 3f7bc1f2 3f6596eb 3ec00ad6", + "3f9693b2 3f5cbb52 3ea8bcb0 be473df3 3e16b04e 3f41aca0 3efcaa44 -> bec30f08 3f74c8a5 3f0310f0", + "3f5a7132 3f9a6551 3dd2b41c be408de6 be453eb0 3f5feffa 3f994f1c -> 3c874180 3f449a92 3f80368e", + "3e0ef53c 3ee39978 3ee77af0 3e62d974 3e65e510 3d688e88 3ee8b9bc -> 3eda9c18 3ed6ffb2 3e81e7f8", + "3f6611fe 3ed89c78 3eda48f4 3e645b22 3db87138 3f6097d2 3dc99500 -> 3e791b43 3eda48f4 3e66585f", + "beb1d4e3 3f8e3284 3f890fe6 3f73bd50 3c107680 3f821555 3f9d4d63 -> 3f9541f5 3f88824f 3f659e6d", + "3f8bbec7 bd63e338 bc3071f0 3f971e90 3f55417c 3eef76cc 3c21b920 -> 3fa5a3b6 3f30e0ec be2d2200", + "3caf2300 3f8fdd64 be3b7040 3e282606 3f3b961a 3f8c4d3e 3f8b45c8 -> 3f8c49c9 be1ed364 3e3c86a9", + "3e5fc67c 3e2274c8 bdab25e0 bd60d980 3f72a6f2 3f3d166c bd2aff38 -> 3e2274c8 bd2b53f2 bd7a83e6", + "3daf3650 3f939cf0 3f5519bc be45884e 3f908a67 3e148a0a 3f2684bb -> 3f939cf0 3f3ea4f2 be08f8b6", + "bebef110 3e906d70 3de0f9bc 3f86373d 3f8de2a8 3f9c01b8 3f092fd2 -> 3d583f00 be75fd5c 3fb30684", + "3e2ae4f8 3e59fcfc 3e94f27a 3f2437c8 3f56cd82 3e4757e4 3ed0e558 -> 3e919dd5 3e8e478a 3f17f7f6", + "3f10c49a 3eb80114 be43cae2 3f1b780e 3f83feac 3e854e22 3f535af4 -> 3effc904 be43cae1 3ef945cf", + "3f450a74 3f678488 3f41cae8 3e9f35d0 3ce287b0 3f82a55d 3f013113 -> 3ee52f18 3f5ed44a 3f07c562", + "bde500bc 3ed048fc 3f8fcf9a 3f742cae 3d94c724 3f1c022a 3d3b5380 -> 3ece537a 3f8fcf9a 3f81ea93", + "3f1f5ac0 3f7504b8 3ebb3610 3f5fd0ca 3f904b85 3e9ab77c be5856de -> 3f7504b8 3f01c22c 3f0ec33e", + "3fb6bea2 3f602206 3f0dbaa0 be109a42 3e9680e4 3f4cdd60 3f63d9a2 -> bf1378d4 3f4b6720 3fa7ba25", + "3f0ef71c 3f460c72 3ee64bbe be1ba225 3f913db8 3f8994e4 3ec93b88 -> 3f460c72 3f16c485 be1ba226", + "3f2b9840 3f1a544f 3ef9a724 3f54b112 bd547490 be600507 bd27cff8 -> 3f3dd6be 3ef9a723 3f54b112", + "3f9ee72b 3ed5b414 3f700b1a 3f04349e 3f55d3d0 3de5eba0 3f9a87b2 -> 3f5806be 3e9563fe 3f850a10", + "3f33fa6c 3f317240 3f7ba744 3f93b326 3f9aa5aa 3f4970ac 3f41a9e2 -> 3f822fa3 3f4d0f52 3f547946", + "beec4ea8 bd3efb80 3e4f05e4 3f7bd3cc bcf254c0 3f5d5770 3f3f4e99 -> bd3efb7e be2256d6 3f85e65d", + "3f81655d 3ed8f2aa 3f5b1538 3e4075ce 3f48d862 3f671774 3f9b68f0 -> 3e3dd3bf 3ebb91bd 3f5cf28a", + "bce29930 3f9063bb be53811f 3f6dde54 3e8aba00 3f8a33a4 bde1e66c -> 3f9399d8 be794e70 3f75e926", + "3de2ffe8 3f5daf86 3f17a4d2 3f356ca2 3ee03fd8 3f6eca40 3f921ec2 -> 3f55ec17 3f1d1a79 3f39e30c", + "bec90f78 3f377e9b bd64ed58 3f96980f 3d1b91c0 3f62f3e0 3f194faf -> 3f8295de bf0a33b4 3fab981c", + "3ebb6016 3d112190 3f8c6ea4 3f9d25ae 3e2a9d3c 3eec68ce bd9dea4e -> 3e6e6067 3f928ca1 3f4a97aa", + "3fbeeb23 be2c2877 3da0b954 be4c1248 3eeb4c00 3f9f1ec2 3e9896d0 -> be133ec5 3da0b954 be4c1247", + "3f6b8e64 3f70878a bccf00e0 3f2fee54 3f750964 3f1de6b0 3f521a84 -> 3f70878a bccf00d3 3f10416c", + "3e910204 3f5c1ca6 3ccce530 3f484d6c 3f974699 3f5b1114 3f4d7dd8 -> 3f5c1ca6 3d6de4f5 3f1162f3", + "3f8dfc7b 3f29640e 3e85daac 3efe3e8c be6f71b3 3ebb0464 3f746c60 -> 3e5eecae 3ef86e4a 3f2e026a", + "3f74f1d0 bd5bd8e0 3f7392f6 be15293d 3ebc65c2 3f9bc03e 3e5b9d24 -> 3c9c2dfc 3f7392f6 be152943", + "3f60f786 3e871b50 3f287134 3f9d3cf7 3f708cba 3f17f21c 3e87ded2 -> 3f8e4592 3f39642e 3ec2f8e4", + "3f99fa0b 3f9c1499 3e750726 3ea95f72 3ca1a610 3f839a96 be4072e7 -> 3e7784d4 3fb58a43 3e620234", + "3ecd3930 3f52761e 3e47f7bc 3e706874 3f5b2350 3ebd89be 3d165fb0 -> 3f52761e 3e985846 3e6032ce", + "3ec984e2 3f8894ea 3f0ddc28 3ee304d8 3f20bb52 3f17df08 3f9c7ab7 -> 3f55c801 3f02b392 3f305914", + "3f5306cc 3e8bea04 3f1538a3 3eadad04 3f266634 3eb66674 3f4da71e -> 3ee1c62e 3ea7c395 3f0a430b", + "3e96d2aa 3f1df5f5 3f4dd380 bbffc440 3c47be80 3e931cde 3f9701d4 -> 3eddae71 3f1f0869 3e6ce336", + "3f41a3d0 be6951cf bdac8392 3f7f1662 3f164d06 3f64891c 3e2affac -> 3e9dd1ee 3f3bb25b 3d902248", + "3eaa20e4 3f019508 3f5e9b94 3f430f90 3f18bb9e bd93f58c 3de93e74 -> 3f207e2e 3f3fb26e 3f35e7cc", + "3edbb4dc be15abd0 3f08f781 3d7d1670 be7fb3b0 3e95f3f6 3d0b1f80 -> be15abd0 3f08f781 3e006324", + "3f42f03e 3f680926 3f9eec9b 3f1ea6fc 3ed803e2 3e847850 be2e6636 -> 3f94b0ad 3f8e3942 3f1ea6fc", + "be67ff30 3f242a6f bbf32d20 3f180458 be2b2643 3ddb1294 3f7a56fa -> 3f49ca1b bd2e8118 3f1543b9", + "3f9cfedb 3ec6d934 3f326c0a be5646ce 3f7355ec 3f4e3584 3df3c620 -> 3f445134 3f00cb20 be5646d3", + "3f983ffd 3f769d10 3f53c6f2 be4955a6 3e36c7ac 3ee0fea0 3f931596 -> bed52ea8 bca10620 3f976f7d", + "3f048138 3c9b8010 3f971788 3c42f980 3f9f4a3a 3f6551b0 3f9f8356 -> 3f1dfbc6 3f1359f0 3f1de106", + "bc49de00 bd9b4d40 3e01bd98 bdada754 3ec499e6 3db2cbc0 3e2d30b8 -> bda0698c 3e0468af bdaf2023", + "3fa8f1bb 3f2081ee bda7a63c 3f03852f 3f890f7e 3ec5a1ac 3f26e58a -> 3f2081ee bda7a641 3dba482c", + "3f498b42 3f8b45bc 3cac6350 3d4bd270 3f3cc478 3f951c9a 3f6dd434 -> 3e7df8bc 3f5c7064 3eceaff9", + "3fb6480f 3e28490a 3f10fc66 bbd7fd40 3f88de6d bd8e25d4 3f311f3d -> 3f3ca11c be7f8d14 3f09f540", + "3ea8d126 3d7ea958 3ea9f0e0 be257814 3eec2144 3f7b504e 3f2ddbe2 -> bc3e28e8 3ea9f0e0 bdbf665f", + "3df39818 3ea3f946 3f90119c 3ea211f4 3eefb816 3f99964a 3f937ab2 -> 3ea3bf50 3f90119c 3ed01fb2", + "bd531280 3f28bbbb 3f0a2568 3eb725e0 be494617 3e7d168a 3f861c3c -> 3f2cb59e 3f0b20cf 3eaf321a", + "3d98b068 3f68cbf6 3f9b2760 3e839ffa 3f7b187c 3d8993c4 3e30d93e -> 3f6e9358 3f920a24 3e87d5eb", + "3f9702b9 3f4f7300 3f95fd88 3f10901a bdbf0e68 3f3a2cf2 3efc3854 -> 3f0541fe 3f95fd88 3f89beaa", + "3e819396 3f5612c8 3ed9c668 3eb81cb4 3f278088 3f9c84d4 3e80a45e -> 3f440108 3f078203 3eb81cb4" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_sat(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f0613c4 3e14ff8e 3f7bb42c 3c9d0da0 3f9b864f 3f836f68 3f5b50f4 -> 3ee791be 3f7bb42c 3ebe92d6", + "3f571e0a be64a407 3f62bd16 3f82072f 3f6ef5a2 3f64e6c4 bd7021b0 -> bdb6d35f 3f665785 3f82072f", + "3ebda6fe 3ebd5364 3f54d1fe 3f3af826 3f2a1dd4 3e834b24 3ee8a45a -> 3eb409b6 3f54d1fe 3f39f40c", + "3f58b784 3f9a1414 3f803c70 3e9f7bb0 3e63fe94 3ed1b274 3f82c1e5 -> 3f9a1414 3f7e1020 3e8a305e", + "3fa1c5f7 be0af730 3f9fc24b 3ecc5be4 3e8c77f6 3f0be648 3f69c1b6 -> 3f027fcb 3f9fc24b 3f4b8e02", + "3f04bac4 bcacadb0 bc461c20 3f8205f0 3e94a750 3f10e55b 3b96c680 -> bbc04c00 3b43bfc0 3f8205f0", + "3f60d002 3d13dfa8 3f4c81ba 3e64a240 3f8aa316 3e9a3c8a 3f94bc5c -> 3e3ebcf2 3f4c81ba 3eac55b6", + "3df9b640 3f581136 3f611634 3f9eb15a 3f376416 3f860001 3f810298 -> 3f58341b 3f6135fc 3f9eb15a", + "3db65288 3f9d9da6 3f752a94 3f3e0cfa 3ebc0b2e 3f8ae695 3f6ead94 -> 3f9d9da6 3f71033b 3f36a12b", + "3fb10ddc 3f633880 3ebbc0da 3ed17350 3dc803e4 3e8e785c 3f91c946 -> 3f633880 bd106b12 3d231be9", + "3cad2fe0 3f17ea6e 3f76ec46 3dfe5160 3f70c038 3e4c927e 3f9cf6d1 -> 3f17fe99 3f76ec46 3dffbea9", + "3f8746c8 bd408da0 be25aae1 3ec772f4 be111430 3f8e0589 3f1b3fdc -> 3d3f7ea9 bd31a74c 3ec772f4", + "3e465aa4 3df3730c 3ed1967c 3f4ed7e4 3f3fe646 3f93de43 3d93a2b0 -> 3dd84b37 3ecda91d 3f4ed7e4", + "be2e03dc 3e8f79f6 3cbfdcb0 3f962708 3f3b1831 3ea4fff0 3f5f0738 -> 3e6779c4 bd3dce4e 3f962708", + "3ebab948 3e3a853a 3f883774 3f3c45b0 be6877a6 be686750 be329824 -> 3f1ef328 3f883774 3f6622c7", + "be29dbdc 3f9514f8 3f5d9888 3f8351ef 3f18db63 3f840bc7 3f062d90 -> 3f9514f8 3f693998 3f86048a", + "3f9a2d6f 3f5e954c 3dd29c00 3e849548 3f9ce10d 3d9b6dc0 3f2463cc -> 3f5e954c 3d337b3c 3e5909e8", + "3f0662d2 3f9a8a98 3f59e1c2 3f191a36 3ebeff50 3f511e38 bdda8140 -> 3f9a8a98 3f1e7fbc 3e4e2921", + "bda8c5d8 3f30ed62 3e4df070 bd257f9c 3f905254 3dd7334c 3e89c964 -> 3f30ed62 3e4803b5 bd48e0d9", + "3f98e3e5 3cc4cbf0 3f6773ca be289c89 3f8b1273 3f07e5e6 3ca14700 -> 3e4ef167 3f6773ca 3d534ca7", + "3dd82f78 3f4b32b6 3f841a04 bdc7a8e0 be016c22 3f4c46c6 3e606c84 -> 3f4ad26a 3f841a04 bdd5ec40", + "3f36df92 3f95d5b2 3f2a036e 3f415618 bb6dbf80 bcab9278 3f909daf -> 3f95d5b2 3e326287 3eb4f58a", + "3e0840ac bd172da8 bde6a434 3f26626e 3e531fd2 3f975510 3f97fcaa -> bc21fa23 bda93302 3f26626e", + "3e069848 3ed438d8 3f50fbd8 3f3836bb 3f2d3126 3ba46f00 be7846c8 -> 3ea4a385 3f50fbd8 3f327c33", + "3f2093e8 3ee5bf6c 3e31c716 bde31660 3f4b87d2 3ebeb326 3d842d54 -> 3ee5bf6c 3e604b41 bc976763", + "3d52df50 3f88d6de 3ee41ea4 3e7f6ac4 be6ca239 3f6c94b8 3f2705c6 -> 3f88d6de 3ed9c1f9 3e642cbc", + "3f5c57fa 3f4978ae 3ee8a3dc 3f619268 bdfde816 3ec752aa 3f0bc9b8 -> 3f29a94f bddf0b44 3f619268", + "bed66766 3f444850 3edeece0 3f215cf1 3f193bc8 3da88728 3f9d83f3 -> 3f444850 3f18a463 3f3250f4", + "3bb98780 bd0c7d0c 3edda852 3ee4e7a4 3f0afde6 3e58b34c be3d1d00 -> bd0f3849 3edda5c0 3ee4e7a4", + "3eecc9d2 3e7646a0 3f1db8e4 3ee714dc 3f5b49d8 3f50b5b2 be41595e -> 3d8820df 3f1db8e4 3ebffdda", + "3ccfe700 3f311c28 3e1a1ef4 3e3fc20a 3c055a00 3e91e71a 3f33fa92 -> 3f311c28 3e166aed 3e3c4e61", + "3f806d29 3de54f48 3f8b522a 3f0cee28 3f5d9f8a 3eec492c 3f08d5b4 -> 3f14f013 3f8b522a 3f4f304a", + "3f89ba44 3f7cfb56 3f024044 bd5b3f50 3d248ae0 3dabee28 be5ccf4e -> 3f7cfb56 bf38bcdd c02e899b", + "3f789cbc be73135c 3f86b370 3ef3b316 3eeccfca 3f164d06 3d4764d0 -> 3d9f8309 3f86b370 3f1deaf6", + "3e6a2578 3f8b4c86 3e381fe0 3e89f24a 3f52f3a2 3ef84020 3f6ab9d0 -> 3f8b4c86 3e8a62c0 3eb3b33b", + "beccdf94 3d0eeb28 3e45b1b8 3eae4cbe 3f860eac 3e8e1aa8 3f00728d -> 3c50f9c6 3e3ac2ae 3eae4cbe", + "3fa70984 3f182fd4 3f92c2d5 3f6d5e5e 3f80041e 3f07e30c 3f4a344a -> 3f1ce1ad 3f92c2d5 3f6f3be0", + "3f00c86e be121d81 3e827cc6 3f11012a 3ef66fda be648a11 3f0a69dd -> be410dce 3e7059e6 3f11012a", + "3f3d2bfe 3eb241bc 3f7616f8 3f4bad84 3f72a686 3ecf0888 3ea9796e -> 3ead8ac0 3f7616f8 3f4b0a75", + "3e4b049c 3f289c5c 3cfea080 be555063 3f9d0244 3f5e1be4 3f5b6b3e -> 3f289c5c 3e021309 bd9b2dd4", + "3f45662e 3d869eb0 3f5b25ac 3e78ad58 3f873838 3f0859a0 3f7fe746 -> 3eb21956 3f5b25ac 3eec6947", + "3ec81e36 3f93f09b 3f4c7b2e 3f365fa8 be465819 3f024204 3f85a85a -> 3f93f09b 3f01cf24 3eb347a7", + "3f92159d 3f9664ca 3f73f7fa 3dbddda8 3eea8528 3e013fc8 3eca9654 -> 3f9664ca 3f80e824 3eb67c2a", + "3f8a8938 3ef6aaea 3f4b78dc be1a24b8 3f8fc488 bda2514c 3f147d6a -> 3f03ffc7 3f4b78dc bd45e1ff", + "3fb50cfb 3f5d90a6 3f62b276 3f8301da 3f69c728 3f976486 3f8644d7 -> 3f42506e 3f4ae75c 3f8301da", + "3f9c6ddc 3f2618b8 3d96aea8 3f2cc77e 3efd07b8 3f4a8298 3c356a80 -> 3f2539c4 bb9d273f 3f2cc77e", + "3ed8a9c4 bdb321a6 be2ac892 3f643c8e 3f92a120 3f096c03 3f0af071 -> 3e10c1d5 3da50bd8 3f643c8e", + "3f4fc3b4 3ea7fa14 3f72f032 3f04c1f2 3efb97e4 3e58804e 3f821f67 -> 3e6352c7 3f72f032 3ee3dd74", + "3f71fdd6 be414cc0 3e12d210 3f9773b0 3eb94792 3e2da776 3ef6efb8 -> 3ec41146 3f13a19d 3f9773b0", + "bde74f64 3f94e45c 3f705bf2 3e128b48 3f1378f8 3f9f6383 3f983dd1 -> 3f94e45c 3f6dd900 3dc9b76f", + "3e4e59f0 3f212226 3f2af438 3f9b5f5c 3f15cd5a 3e09d600 3e7a38ac -> 3f0f1129 3f1a12d0 3f9b5f5c", + "3e8499c6 3f362b00 3e54e914 3f9d2368 3f2249d4 be59cc22 3e4f02c4 -> 3f215f38 3d4225be 3f9d2368", + "3e5dbdec 3f97e122 3e828384 3e2fecda 3f38a8f8 be5ed480 bd2d9968 -> 3f97e122 3e192dbd 3d69d297", + "3f1de534 3f9710a8 3f3de01e bdf0ff64 3ebe3174 3f475dce 3e1bbc6a -> 3f9710a8 3f5072b6 3dc6c6df", + "be2b9a3e 3e13c7a6 3eff3378 3ea39290 3f0aa4fc 3f1a74d0 3e5487ac -> 3e0f1f24 3eff3378 3ea2653d", + "3f8c91ee 3cff7f50 3f0e033c 3f93ff4b be3155b4 3f05b0a4 3e87896c -> bed928db 3e9f62b2 3f93ff4b", + "3e995a2a 3f97bd20 3f9a5048 3f7a59f4 3e077398 3cf6e560 3f805e79 -> 3f948c67 3f9a5048 3f322525", + "3fbc044d 3ede345e 3f9c53cd 3f8d6800 3f9b3e13 3f7b5538 3f7044f6 -> 3f97a65e 3f9c53cd 3f9ba282", + "3f44011c 3f968a0d 3f8a6f52 bd14b5f0 3f1b17b2 be2183bd 3d8f34b0 -> 3f968a0d 3f885f2d be78c6c8", + "3e8342e8 3f75a088 3f287d88 be216ca0 3ede3050 3f9f4f63 3f16b8b8 -> 3f75a088 3f313401 bd00db6e", + "3f852edc 3f733e88 3e87f940 3f24fe66 3f029a3e 3f7161b4 bc457a20 -> 3f733e88 bcbf9f87 3f03f6f9", + "3fbf1a0c 3f493f8e 3e1e187c bc310af0 3eff4d46 3ecc6450 3cb99420 -> 3f493f8e 3e56795d 3d703943", + "3f8e8fd1 3f06f220 3eedf290 3f1428d6 3f5f1f98 3f04dcf6 ba17c000 -> 3e95ce95 bd5a4ff8 3f1428d6", + "bcd95a90 3f392498 3f7149f6 3ef125c2 3edc2324 bd621e00 be5edd1b -> 3f3c235d 3f7149f6 3efe06e9", + "be4b76e4 3e984610 3f62b51c 3f72c4be 3d118640 3e2810e8 3d92014c -> 3ea1a56b 3f6328c1 3f72c4be", + "3f4fcf8c 3f34aafa 3e57466c 3ee7c3d4 be5831ed 3f335ade 3f3459c3 -> 3f34aafa be0748b3 3e8e3eaf", + "3ca36ca0 3f2d5886 3f9cbc66 be123bc4 3f316ce8 be4f982e 3f1b615e -> 3f2ce7cf 3f9cbc66 be16a20d", + "3d9c99b8 bd67bc00 3f037c02 3f4ff890 3ef383a2 3eadbd50 3f0cde69 -> bc646fa5 3f073caf 3f4ff890", + "be4a205c 3f12b2aa bd9ca3de be2ddd57 3f3f8394 bd35ea18 3f8266af -> 3f12b2aa bdcfd387 be4b225e", + "3e1b42cc 3f04d102 3e94ee2c 3e5a38fa bc748440 3f99c63c bcc07de0 -> 3f04d102 3e88020f 3e378f48", + "3fa184c4 3b93d680 bdfdc89a 3f552c12 3f88c10c 3f0b804d 3f9b89aa -> 3f0c3ef3 3f00efe2 3f552c12", + "bee08a78 3f77d128 3eba43a4 3f7ca4ac bdd1dea4 3ed9ceb8 3f8595a6 -> 3f7961ca 3f10daf0 3f7ca4ac", + "bce58960 3df9c8dc bde99e92 3f4f5694 3f8992c9 3f4561c0 3f01c1bb -> 3de49789 be030aa6 3f4f5694", + "bea569d2 3d166168 3ebeb27e 3e94dfe4 3efd7300 3f6f8c66 3f935c03 -> bb4f6a02 3ebeb27e 3e8fe831", + "be93ebf6 3f2f01b7 3f64e2d0 3eea7df2 be1dca0e 3ec2ca98 3eb8ce86 -> 3f4c47cf 3f64e2d0 3f31e708", + "3fb5930c 3ec66a2a 3f9d663f 3f283fba 3f85af2e 3f15cb14 bd8d9122 -> be8e2854 3f9d663f 3e51fbae", + "3f792cac 3f4f49b2 3dbf2000 3f19bf68 3f47ba02 3f9cd109 bdec120e -> 3f4f49b2 bd92c4f3 3f0d6ad4", + "3ceea660 3e1eaba2 3f2737ac 3e242174 3e38aadc 3f383a57 3f704ed6 -> 3e1dcaa2 3f2737ac 3e2342db", + "3fba810f 3f40edae 3e957842 3ea5912e 3f5bf3e8 be3e92c5 3f91a247 -> 3f40edae bea047cb be762e21", + "bdf75b38 3f383f01 3e8ecb62 be4b2544 be51f7c1 3edd8812 3e2908d4 -> 3f383f01 3e9307f3 be397f91", + "3f92ad5a bdc00282 bdc7493c be60e326 bd834aa0 3ea6e7bc 3e8e2da0 -> bdc00282 bdb78402 3d59cc10", + "3ef04bb6 3ceea7e0 3f70b08a 3f76ff7c 3f75ea54 3f821d24 3f8177cf -> 3ee30297 3f737b80 3f76ff7c", + "3e51cef8 bc153700 3d4369c0 3f6a62c4 3f692af6 3f2c186e 3f9c4d7e -> 3dc4ac50 3e15e682 3f6a62c4", + "3f8184ef 3f30105c 3dabb918 bd84ac66 3f056fc6 3d3094d0 3f12120e -> 3f30105c 3e36ef76 3d5a83ec", + "bec28e29 3f883f28 3f0c88b9 3f3c37f2 3f0ade08 3f783b8a 3ed327be -> 3f883f28 3f15e570 3f423296", + "be2c6ed2 3f0020d3 3e05049c bbb5fa40 3e1319e0 3ed27008 3efb4a64 -> 3f0020d3 3de3a2c5 bcff3c83", + "3eee967c 3f1a0b98 3f1bc91a 3f9304ca 3d421070 bdfd5878 3f80bc52 -> 3e82d125 3e888050 3f9304ca", + "3ef18a4e bc9a1d60 3e0b4fa8 3e095c68 3f8155ce 3e469ce4 be190d82 -> bc9f2edc 3e0b4fa8 3e095a6a", + "3eea7e32 3f88cfdb 3f8c2e62 3f2a26e6 3d06a920 3f7504c4 3ec62368 -> 3f86907e 3f8c2e62 3ec1449e", + "3df4f4b0 3e109f40 bca70ea0 3e2c3134 be500506 3eb2b77e 3cf572c0 -> 3e0f4462 bcf2f718 3e2c3134", + "3f520dc2 3f957abb 3f2bceba 3f04647e 3c381a60 3ef5eb94 3e233be4 -> 3f957abb 3eba8699 3dec008b", + "bec5489e 3f39ae09 3d160e08 3e653af8 bdaa5d20 3f509968 3f1c76d3 -> 3f39ae09 3da25e71 3e8283ae", + "3f71bef8 3e26d33c 3eb3c1b0 3f48326c 3f069450 3e9fae80 3f47bbe6 -> 3e9bc8d6 3ee621b3 3f48326c", + "3f3e017e 3e91c8c8 3f146d26 be0e9068 3f343341 be15b206 3c205f80 -> 3e94b7ca 3f146d26 be00442e", + "3de97da8 3ec2031e 3f3afd46 3a092200 3f46f932 3f39cd10 3f7d098c -> 3ed112fc 3f3afd46 3d7c5c00", + "bda84400 3f370530 3f5df29c 3f3fcb31 3f76b170 3f70eda8 3ec3d51e -> 3f3ed1c8 3f5df29c 3f45d5cc", + "bd2bdc40 3f4efbe4 3e4360a0 be092728 bddca530 3f834d70 3f21a7b6 -> 3f4efbe4 3e41ff33 be0b425b", + "3fbc4cac 3f60e6b2 3f22d9e0 3f056a6f be59ee04 3effdf60 be43db34 -> 3f60e6b2 be83a851 bf4bbec5", + "3f2d6c18 be2279af 3ed01130 3f0ead29 3ec0c496 bdcd942c 3f6020fc -> bdc17917 3ed6ff29 3f0ead29", + "bd1c4b38 3f0e639a bcda7150 3ec77654 be24ce98 3f5f6d46 3f05159a -> 3f0e639a bcc2b74c 3ec7e2d6", + "3f4394d2 3f3bee3c be5e6313 3f4fe2e0 3f1ee998 3e17455c 3ead1ee2 -> 3f42029c 3dc5666c 3f4fe2e0", + "3f4d3602 3e0e53f4 3f9f52d8 3f0fc7e8 3d9fc4ec 3f20d9c8 3e6dc318 -> 3e1b17d3 3f9f52d8 3f11c09b", + "3f557926 be1f7269 3f3ab7da 3f3d74b4 bcc45428 3f6e005a 3f2e288e -> bd2b1c2d 3f3b10fd 3f3d74b4", + "3f2a2f7c 3e57a810 bd6e1f70 3eac9e48 3f4aa02c 3f41c990 3f9fa29a -> 3e88760d 3deeb2e2 3eac9e48", + "be277e7c bd0544d8 3f39fb0d be498400 bdc6932e be0db78c 3e8f86c8 -> bc307325 3f39fb0d be2e6736", + "be9d6970 3f1a72a4 3f75878e 3ed535cc 3dd0f2c8 3f3879c3 3f941448 -> 3f2b923f 3f75878e 3f04b917", + "3f8d3310 3ed2c5d0 3f9f72a1 3d469ad8 3f0573b2 3ec9606e 3f18919c -> 3f80ca23 3f9f72a1 3f66e0f2", + "3ee6008c 3efce936 3f664676 3f8e777e 3f98b676 3f8b7686 be33cff9 -> 3e4b3d22 3f4c2f78 3f8e777e", + "3e4ac130 3f8ba499 3e664ef4 3f8a24b6 3f2407c5 3eae947a 3ef2a070 -> 3f8ba499 3e973593 3f8a43ef", + "be8ae73a 3e895548 3f0228e7 bd99a7e6 3f0447ab 3f99d6b1 3f1b2266 -> 3e7115b5 3f0228e7 be1e65ba", + "3ef9d758 3f829826 3d96ce68 3f8fdf83 bd27968c 3f45fffe 3f6bd704 -> 3f81d505 3c5aa171 3f8fdf83", + "3f9daf68 bd5c7380 3d1e5770 3ca58f40 3de8cad4 3ecd6730 3f4a5814 -> 3c9e5b29 3d1e5770 3d0e8ccb", + "3f4c4974 3f89da4b bd74ffb8 bd23f528 3cb4a220 3e52dd88 3f5ef43c -> 3f89da4b 3c1e893d 3ce770ef", + "3f598c9a 3ef7e7a4 3f16517a 3f361694 3e04be16 3eddb0b0 3f47e34c -> 3e313ac5 3ed59684 3f361694", + "be9e149e 3ef978b4 be018558 be7b4fde 3ee205a8 3f9eb79b 3f9c47ba -> 3ef978b4 be707562 bebfdfcf", + "3f4c5b14 3f136ca8 3f9e97fb 3f7be654 3d876870 3e1cd3f4 3ef2fa3a -> 3e82089f 3f9e97fb 3f5c3515", + "3f836047 bd828dd4 3f4f1cf2 3e8ddcd6 3f984b53 3f6ef824 3ee56466 -> 3ea0f4d2 3f4f1cf2 3f01ede1", + "3ed7e578 3ea2f1c6 3f9b852b 3e7a8a68 3f3ef601 3f7c2e2a 3f7a874e -> 3f14d97b 3f9b852b 3f078a84", + "3e5bed38 3f3c8853 3e26a1c8 3f8a2b88 3db93d30 bde06240 3f67ced6 -> 3f367f81 3dcc3d26 3f8a2b88", + "3f475092 bdadc99a 3c800e30 3f6c1686 3ed288c4 3f51c8a0 3f9ff964 -> 3e5eaa47 3e9356a8 3f6c1686", + "3e2c2a48 bd47ff18 3e676960 3f9a5c02 be49f66c 3e15dc80 3f8f0c84 -> bd9c7796 3e515c63 3f9a5c02", + "3e6c1d94 3f839a44 3e3ca0a0 3e426380 3f3fe034 3da988cc 3f33c238 -> 3f839a44 3e2bf200 3e31d15c", + "be8ca16e bdbb5d5e 3f42896e 3f720cd4 3ba08580 bbfbed00 3e401f52 -> bdd9089b 3f41df7d 3f720cd4", + "3fa49839 3f538784 3f93c7a2 3f9ce2b4 3c505120 3f51ae46 bd83601e -> beb82672 3f717b2d 3f9ce2b4", + "bef196bd 3f0b1c81 3f1ad7e6 3f075243 be0b41f0 3ee57ed6 bd751e10 -> 3f506e45 3f1ad7e6 3f5d572b", + "bc2d0e80 3f3d2ffe 3e93d52c 3f31739c 3f16b70b 3f8e3722 3f9e7b78 -> 3f3d2ffe 3e937e6d 3f316f2f", + "3f8e37dc 3f9d4025 3f23be32 3f174771 3f876150 bd3f3610 3f0a38f8 -> 3f9d4025 bcb80486 be00e8b2", + "befb796a 3f017703 3f9d04d9 3e200d5c 3f13c07a 3f4feaf4 3ed2c730 -> 3eb4153a 3f9d04d9 bd942211", + "3eaa96c6 3ea49628 3f9d794e 3f852090 3f13c8da 3f6e850c 3e8dbc26 -> 3eac1abd 3f9d794e 3f858543", + "3e15d57c 3f545044 3f69469c 3f22b0b0 3f6271ae 3f031419 3f86a552 -> 3f522d98 3f69469c 3f1b7fe2", + "3ec90b92 3e627b64 3b193780 3f2a8a00 3e066784 3e4c4394 bdf37ba4 -> 3dedab9f be1e30d3 3f2a8a00", + "3f76b44e 3e87a224 3ec4fbec 3e51fa98 3f1da1a7 3f255b06 be712bfd -> 3d2ffc2c 3ec4fbec be02cf70", + "bee646af 3f20ce32 3dfa7764 3f096f0a 3f62d478 3f474a88 3f7e004a -> 3f20ce32 bd35b2c8 3f01bbd0", + "3d6868d0 3e9deff6 3f67327c be74473c bd90b638 3f3618dc 3ef27786 -> 3ea03085 3f67327c be6ba15c", + "3d0400a0 3f7a7794 3f9a4b61 bd9d787e 3f30f886 3f3cee54 3f164e22 -> 3f7bfaed 3f9a4b61 bd32343a", + "bdf6fe48 3f79707a 3f3d7956 3e489a64 3eb9b41c 3e8fa618 3f46f150 -> 3f79707a 3f3c06a0 3e355a53", + "bed96550 3f1874a4 3f15c27a 3f9b1399 3d12a070 3e865224 3e49ca24 -> 3f454eb5 3f4360d5 3f9b1399", + "be6d4a56 3f09f7b0 be1af969 3f9fce9c 3f7bc992 be42d69e 3afeda00 -> 3f0cade9 be0592f8 3f9fce9c", + "3fb119ea 3eb2cd78 3f279bd0 bd44f580 3f3cf808 3f2854c8 3ee5ae66 -> 3f1e10e1 3f279bd0 3f11a7c3", + "3f0c7752 3edbce6a 3d02db60 3f965490 3f943658 3edacdbe 3f8066ab -> 3f12afbf 3e812784 3f965490", + "3f84e925 3f21d596 3dba4388 3e8bf4d0 3e7dddec bd0f1068 3de3573c -> 3f21d596 bdc48b43 3e190431", + "3f8f0239 3d8b800c be4ce404 3f925f99 3e4bbf28 3cd92740 bd55208c -> bca6ef9c be9f0db0 3f925f99", + "3daffee0 3f8daa8e bd9a6234 3f752ef4 3f2da3fc 3eab9d6a 3df98a54 -> 3f8daa8e bd544031 3f75f198", + "3eaac4aa be2889e4 bbc50740 3f5fe206 3f5f7e44 3da0d0f0 3f052086 -> bdaaeba9 3d807c7a 3f5fe206", + "be8e86d4 3e9b2988 be5a07bb 3e02f55c 3f8ae11a 3ee34a68 3e9848b2 -> 3e9b2988 be9733ce 3dcca13d", + "3fb016bc 3f80fc9a 3f39a2ce 3ef8a42c 3f8c1db0 3f920a43 bd4dc768 -> 3f80fc9a 3ea93985 be795579", + "be003174 3f1ad4d1 3d6f1760 3e94107e 3ec3171c 3e805278 3dc6ccc0 -> 3f1ad4d1 3d3e042c 3e90856e", + "3f18c2ca be121810 bd085d38 3e6b22d2 be219f58 3f219c0a 3e8ea7f0 -> bdbbfe72 3b2cd079 3e6b22d2", + "3f0ff56a be1cb601 3f261862 3f1ff936 3f917a6e 3f574a62 3f4bf5e4 -> 3e414feb 3f261862 3f229548", + "3f97e77e be72dc49 3f4401dc 3eba5b2c 3f552406 3f66899e 3e90bb96 -> 3ea8b663 3f4401dc 3f17492e", + "bebc6042 3ee621d8 3e637378 3f55689e 3ee3745e bd9f91f8 3dc09828 -> 3f08dc16 3eb71c0d 3f55689e", + "3ef2c1e6 3f97c23e 3eabb38e 3e77cad4 3f89f871 3e311bb6 3f17fb59 -> 3f97c23e 3ea06223 3e5eaba5", + "3dc11db0 3f8901f2 3f92fa51 3f7e2a08 3f880494 be6cbe7f 3eb85416 -> 3f817dd3 3f92fa51 3f602acb", + "3f8619ce be31d654 3f8e2c70 3f9aa342 3d4ca238 3ece5b48 3e8836fa -> 3e2921b7 3f913ae0 3f9aa342", + "3f1f652e 3f0aef9c 3f966d54 3f4c6788 3f199f9c 3f883de6 3ef26c62 -> 3f07c212 3f966d54 3f4a82ee", + "3f35e16c 3f7e9d4e 3f256018 3f25ddfa 3eeb1c94 bd85f868 be3c429e -> 3f7e9d4e bdc4589a bdb80a3f", + "be91da9e 3d81f4e4 3e081a08 be43f01b 3ed606e8 bd405740 3f11c074 -> 3d56d429 3e081a08 be788ea5", + "be793a7a 3f5e0d38 3f1f038e 3f828d6f 3f61b940 3f9619e0 3e40d4c6 -> 3f68f3e2 3f3b82c1 3f828d6f", + "3ea966ac 3eb907fc 3f60221a 3e13c030 3f44e01c 3f89fbc4 3f91be6a -> 3eee4728 3f60221a 3e959b48", + "3eb6e254 3ed1fe3c 3f318b2c 3e694518 3eb79644 be04eb62 3f49b1b8 -> 3eabed76 3f318b2c 3dd84eac", + "becc43c7 3e812914 3dc26078 3eb4f5be 3f8ac7b6 3e967566 3f3fd8b1 -> 3e8116fc 3dc1a783 3eb4f5be", + "3f9787df 3f3a525e 3f932145 3f61c6ae 3e4ccc62 3f725b08 3ecc8db4 -> 3e1d5cb6 3f932145 3f04853f", + "3f8896ec 3e9bae36 3f83a656 3f77e65e 3f922406 3d100ff0 3d0e2908 -> 3c545326 3f83a656 3f71b63f", + "3eb04384 3f829eff 3e81dbdc 3f70ae2e 3dda4b58 bd946bd8 3f44b926 -> 3f829eff 3e0860fb 3f6d7368", + "3f84d4ff 3f307b56 3f54b2b4 be431eb4 be2b2a6e 3f84075e be088630 -> 3f3289f3 3f54b2b4 be07b67c", + "3ea3ec7e 3e8d6efc 3ed53ffc 3f8614e8 3f20f90e 3f305c82 3f1c3ab2 -> 3ef84337 3f165349 3f8614e8", + "3f81766b 3f79df90 3f03295c 3ea35a08 bdf31c00 3efa6bf4 3f37b27e -> 3f79df90 3e2d659a be2af76b", + "beb7954e 3f6a3e82 3f026ae8 3eef062a 3f8ae214 3f00cf27 3f314d44 -> 3f6a3e82 3f05f31f 3ef6d48b", + "3ef39174 3f8baf10 3f29ccb2 3f3a4602 3dee416c 3f9d8fc6 be0fcebf -> 3f8baf10 3e93b877 3ed18493", + "bee5c295 3d8c7eb8 3f528e5c 3defeda0 3f952626 3e90d0cc 3e9ed368 -> 3c2077d3 3f528e5c 3d7e7ef8", + "beed0107 3eb95958 3f95de46 3e869dfc 3f18a47e 3f2ca7de 3f3fe7b1 -> 3db0eac4 3f95de46 bd3e528d", + "bee1aed6 3f7dc492 3ebe0254 bcca62a0 3f303c8c be4be55d 3f4c177c -> 3f7dc492 3edcb665 3d969a01", + "3f997de2 3d923e5c 3f17b53e bb0ec3c0 3e8e7f2c 3ed92260 3f911112 -> 3e680e4b 3f17b53e 3e332488", + "3ed398f8 3f8069a6 3d8f1e78 3e8661c0 3f353cf7 3f002e62 3f585a98 -> 3f8069a6 3e92c29e 3ede7685", + "3f35bfa0 3f709b02 bd450b0c bd0afcb0 bd3326b8 3e212324 be2fde6c -> 3f709b02 bf3e0200 bf37d478", + "3e7309c8 3f16ae5c bd3cbe88 3e747ea8 3f8a13a4 3f98b2ca 3edff038 -> 3f16ae5c 3c83b019 3e8bc9d7", + "bebbbbd6 3d2cb878 3f009918 3f2d8ba2 3f970c71 3e9fe9a8 3c668d40 -> 3d5fe923 3f017b49 3f2d8ba2", + "3fbf855d bca4dc20 be05ce20 3f230cb5 3f8deb9b 3eda8f20 3f17c640 -> 3eec2edb 3edd0e0c 3f230cb5", + "3f2521d4 3f59d8be be7f8789 3f91b3c4 bd9c3418 3f93c68c 3ec61d70 -> 3f5fce98 be0c5f96 3f91b3c4", + "bedce67f 3e2d476a be768d27 3ef6ddee 3f64bde0 3f380f18 3ef155fc -> 3d9d2cb3 bee8a647 3ef6ddee", + "3f4f7740 3ec7024c 3f8128c9 3ee6309a 3ef65738 3ee45410 3eab7f9a -> 3f249b75 3f8128c9 3f2dce84", + "3f480a5c 3f514ab8 3f55a53e 3f472414 bd7c6728 3f14c064 3f2907ac -> 3f1de87b 3f55a53e 3ddf99c2", + "3f47ad2e be2b74a2 3f144380 3dc7b2f0 3f7b013a 3ef88448 3f71b876 -> 3e3f45a7 3f144380 3ea6ed5e", + "3f933914 bd3ea060 3eb37046 3f67adcc be589e13 be4c5a70 be4e4004 -> 3f8e207d 3f8328bb 3f67adcc", + "3faa511e 3efc78c2 bd5e3540 3d15b028 3f57e5be 3f4aef36 3e875d38 -> 3efc78c2 3e64fe67 3e896248", + "3f74754c 3de1d730 bd805cbe 3ec15734 3f9d8ec4 3c019cc0 3f92e8cd -> 3e17931f ba05408a 3ec15734", + "bee92fef 3e29e380 3de21b98 3f9e1ff8 3ea5996a 3f7a070a 3eaecf5c -> 3d15d453 bcd20188 3f9e1ff8", + "bd516a60 3edc326e 3e09e262 3f94de52 bc8661c0 3f46f288 3f7ec3d2 -> 3edf112d 3e11f004 3f94de52", + "3da47728 3ed132de 3f4b6a82 3ee2a642 3eca8148 3e929f9c 3f568e1a -> 3ecb8ff1 3f4b6a82 3edd82be", + "bd8a11c0 3f238892 3efb9224 3eb0a7a0 3f84e896 3e156448 3f8f34f5 -> 3f238892 3f000d7e 3eb9b062", + "3f909aa1 3ec89e2e 3f784ac4 3f7fe3b2 3e68eec6 3f85f36e 3f744798 -> 3e474d28 3f75d3a8 3f7fe3b2", + "3f9bbe11 bc22d3f0 3f6b6ddc 3f370bc6 3d9712c8 3f350850 3f494aaa -> 3ddb66ec 3f6b6ddc 3f3da497", + "bed4f78f 3f87d20a 3dfcf2e8 3f1c18cb be700d44 3f04eaca 3ecfd99a -> 3f87d20a 3ebf9256 3f3afc77", + "3f8d164f 3ec913ce 3f97ac3c 3f15dce3 3f78b6a4 3d743810 3f757fb0 -> 3d23d915 3f97ac3c 3ea30d3c", + "3f5e95be 3f5e7a62 3f23ec20 3f08fb88 3f14adfa 3ef1fb8c 3eba8e24 -> 3f5e7a62 3f25779e 3f0b3cfa", + "bee5e500 3ed45ba8 bdb13864 3f80c8a0 3f7b0bac be560f14 3ecb9c24 -> 3ee446cf bcee47b4 3f80c8a0", + "3d6dba90 3f8ffe52 3f7a475a 3d92f258 3f54477e be4af241 3c3acae0 -> 3f8ffe52 3f799227 3d54eadc", + "3f6fdb52 3df155a8 3f7c3b04 3f82ea3f 3f606e48 3eecfa38 be6ae617 -> be7926f2 3f786647 3f82ea3f", + "3fbfd8cb 3f847926 3e281b3c 3f01850d 3f3ca35a 3f9f63f3 3c2b32e0 -> 3f847926 bd8d0be2 3eba8de3", + "3ea7f0d2 3cf03780 bd8f7e0c 3f3e3460 bc7d5d40 3e300e5c be669bd6 -> be6c3d95 bebb8c32 3f3e3460", + "3eb93b52 bd23a968 3f5a878a 3d0f1028 3ef4dd1c be778515 3f087cb8 -> be297ced 3f5a878a bda4107f", + "3f0611ac bd2eee18 3e86fd30 bddc86cc 3c000460 3f329484 3f9985e8 -> 3b956b32 3e86fd30 bd4e62da", + "3f006a3a 3f67b11a 3f43270c 3f743fb0 be75fd58 3eb00130 be57ec41 -> 3f38c1a9 3d3a40de 3f743fb0", + "3f2c4f62 3f7fd224 3e801866 bbcbd6e0 be512eb0 3e0c851c 3f861538 -> 3f7fd224 3e1f51b1 be08660c", + "3f75f938 3f4c371c 3f1429ea 3f183cf3 3f613fd8 bc5b77b0 3e39b8fc -> 3f4c371c 3c3435b5 3d8ba47e", + "be944737 bdf2642a 3f3ce37c 3e17feec 3ee8bcc2 3ef99384 3ef66fde -> beb42c11 3f3ce37c bc4a2a5f", + "3f6fd6e6 3f93441c 3eba2bce 3ef54690 3e9866c4 3d7a0fb0 3f8f5551 -> 3f93441c 3da75c89 3e743c94", + "3eaa2c5a 3ed5d268 3f84fa58 bccec3e0 3f8a0180 3f9e2a0d 3f821d5b -> 3f169ec8 3f84fa58 3e88cf83", + "3dea22e0 3eb4f6ae be55dd3f 3edd7474 3f5efd74 3f3c5248 3f6c1258 -> 3eb8f61b be150564 3edd7474", + "3ec2455c 3f6f54ae 3f0c3234 3ec18074 3eec04c8 3f449d92 3eafd4c0 -> 3f6f54ae 3f0ee772 3ec94a8f", + "3f5d522a be66f1c4 3f0e3ff6 3f0e224a 3f8d9b6b 3f0ecd02 3f86ad2e -> 3e58bf99 3f0e3ff6 3f0e32e5", + "3fa6314a 3f917b26 3f43c50a 3f3f80f1 be31fed0 3f96bfe6 3e62a91e -> 3f917b26 bebf2697 bee1cbb6", + "3bde9a80 3f4a353c 3ebd6624 3f869e6d 3a781c00 3ed46714 3f727206 -> 3f49f628 3ebc1db1 3f869e6d", + "3f5ef584 3f325acc 3f774580 3f5560ee 3f803bbc 3f4f2598 3e2c1cac -> 3e6c9a22 3f774580 3f1ac13a", + "be5997d2 3f8871d9 be1873c3 3f8b1880 3f0b036a 3f06c042 3f59d302 -> 3f881202 bea58fd4 3f8b1880", + "3eb70f0e 3e6ed2e4 3f2b6798 3f9c6614 3edb0e34 3f9b702c 3eb952ae -> 3e8f6313 3f321a05 3f9c6614", + "3ee962c6 3e8d874c 3f6f394a 3f4b7d28 3f4ed27c 3ee6d020 3cf18350 -> 3e29f29b 3f6f394a 3f457d94", + "be9d017c bd9406f4 3f138360 3e571174 3dd35044 3f25785a 3f9f62be -> bddf6802 3f138360 3e41c922", + "3e8a6cb6 3f56fa74 3f78c15c be15028c 3f7fa76a 3f225332 3f621666 -> 3f5d35f8 3f78c15c 3d7856a8", + "becfce64 3f29e1fa 3f694ff2 3f087ce2 3ecd7f16 3f1ed746 3f7ca842 -> 3f34f201 3f694ff2 3f195ff1", + "3e7802bc 3f734b7a 3f8a3858 3f52b6ec 3ee6a660 3eab9160 3d7b31a0 -> 3f5e2794 3f8a3858 3f28cb65", + "3d774310 be5fcf1f be5870ec bd65b034 3dddec34 bde4277e be37afa4 -> be4c8f68 be460b6f bd65b034", + "3f82430b 3f065faf 3f206ca3 3e426584 3f90a3f4 3f5b0d84 be3d0c7c -> 3ee946e4 3f206ca3 bddc4117", + "3f30f85a 3f72a63c 3f8f0666 3f2ddfae 3ea91a50 3f3a92f2 3ecae4e0 -> 3f66d106 3f8f0666 3f0f4a2d", + "3f7bd790 be685aa3 3c401160 3e204bc8 3f8a4865 3e95c7b0 3f569ef0 -> 3d1bb53b 3de4eadc 3e204bc8", + "3e0bbe28 3f3f12b1 3f230d6f 3f6716d8 3d7afaa8 3f6f1264 bdbd7306 -> 3f302602 3f09ad64 3f6716d8", + "3f693da6 3f6edd96 3f948d30 3f23e9e4 3efdb044 3f50024e 3e3ab824 -> 3f48208a 3f948d30 3e96a319", + "bea14f37 3d0e34e8 3dbf1c08 3f0577a2 3f81e4e0 3f6beb62 3f69c640 -> bdd13582 bcddccd4 3f0577a2", + "befe475a 3f9b31f2 bdd94610 be04e7e0 3f5b35be 3f6a40aa 3f0eb57a -> 3f9b31f2 bf079f2c bf0fa377", + "befa4da8 3f8371c0 3f84c906 3e8e5978 3f589738 3e6dd4a2 3ed261d4 -> 3f837042 3f84c906 3e8ca8c9", + "3f9a3355 3f9eaf9a 3f098289 3f51983c 3f95fd91 3f9435a1 3f8ae604 -> 3f9eaf9a 3fa2f4fb 3fa13ec7", + "bef5e8f3 3f9a7936 be5828d2 3f8ada83 3f954852 bd13b998 3f395f60 -> 3f9a7936 be96cff6 3f89ef22", + "3f93595b 3f958e62 3f629b4e be3ce3dc 3f1ef876 3f966c58 3e6639a4 -> 3f958e62 3f7bc738 3e9206c4", + "3f60e912 3efc6c64 3f4850d2 3ee8f3d8 be6cb91f 3f199c26 3f4ccb5c -> bd1300d9 3f4850d2 be12d860", + "3faffc10 be01deaa 3de5e938 3f6640e8 3ea91a4c 3f82be90 3de1aa64 -> 3e394950 3eb25838 3f6640e8", + "bdda7ee0 3f4e60f8 3f73df66 3f8be750 3f81c010 3f89fd1c 3f9e6e4c -> 3f4bf2f0 3f72aefc 3f8be750", + "befc26c3 be147a36 3d111020 3f70a51c 3f337c44 3f8aab0c 3ca39b00 -> be6656d4 bcffdfd7 3f70a51c", + "3fa7d9d2 bdc84a20 3e5996cc bccc2798 3e9d38f2 bd82ebfa bbb0e760 -> bce1c5e3 3e5996cc 3cec1751", + "3efdc2b0 3f8098dc 3de8f28c 3f9394b6 3e9d9e38 3d100ab8 be10c5ca -> 3f758bfc be51fd2c 3f9394b6", + "3fa39c0f 3f6d38a4 bd845f18 3f16037d 3e451d1c 3eba5426 3f3181ee -> 3f6d38a4 3eb18f61 3f3a3590", + "bc8b5e10 3f975df4 bce0f2b0 3f5b7856 be1c8621 3e72c73e 3f473d58 -> 3f975df4 bcc46828 3f5bb5b6", + "3eb38ca8 3efe7f9e 3f43d4d0 3ea2aae8 3f44460e 3f07ae84 be4f328e -> 3ec69e1a 3f43d4d0 3e0abfc3", + "3fbb0bbc 3f932bba 3f2ca226 be683d4c 3f55daa0 be09a392 3f4c5b18 -> 3f932bba 3f320885 be29b2fc", + "3f9e1f81 3f16c114 3f98529a 3ee96208 3f4af98c 3f908706 bd9fc4fe -> 3d36fb29 3f98529a be55daa6", + "3d91b348 be198c6c 3dd50d00 3e8469fa 3ef0580a 3f139aea 3f3f0aef -> be02c5fc 3de64916 3e8469fa", + "be541b9c bc24adc0 3ebc4cda 3e56f804 3f72f0b0 3eeec1b6 be10aef6 -> ba4f5b01 3ebc4cda 3e5aee24", + "3e350a30 3f194982 3f15d3f6 3f4a890e 3f415228 be41933b 3f8e6c3e -> 3ef5b459 3eea82bf 3f4a890e", + "3f99eb75 3f02d1f6 3f1012d0 3f1b6ca8 3e7e4be0 3f92936a 3e9f1914 -> 3d60a61e 3eb46588 3f1b6ca8", + "3e95478e 3d053368 3e1b1d46 3e9bc9d8 3eb74788 3f1b35f7 bd2540f8 -> 3c8c5e44 3e1241a7 3e9bc9d8", + "3eb9b270 3ed26660 be437e21 3d41a080 3f9a09cd 3e9a50d8 3f802b63 -> 3ed26660 bdacbb59 3de4b15a", + "3f85f172 3d67bb88 3f5032ac 3f9174f7 3f263640 3f3086d6 3f0b3d58 -> 3f6f726a 3f89c1b9 3f9174f7", + "3fbe4fb7 3eb5a27c 3f6a27f6 be59626d 3f88b96d 3d72ee38 3ecd8f3c -> 3f0c9131 3f6a27f6 3e3725af", + "3f1e63e8 3f4a8ed0 3f66c854 bcecde60 3f2e7415 3e3df994 3f603ffe -> 3f4eaf21 3f66c854 3ddb594a", + "3fb8bc0c bd0a0e40 3f93ec8b 3eae99d8 3f8e1572 3f931429 3f8e2780 -> 3fd026c9 3f93ec8b 3fbd2d15", + "be7f88f2 3f06b37e 3efcde0c 3f4d3e8e 3f4272c4 be0df92a be0823ea -> 3f2b4f83 3f27556b 3f4d3e8e", + "3dd8ed48 3f7fe024 3f3882bc 3f595cb8 3e527ffa 3f822799 3eb50686 -> 3f7fe024 3f2a723c 3f51c5a4" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_val(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f890150 3ef93eb6 3e887b0e 3f0a30e9 3e980e26 3f4ee452 3f876bfe -> 3f7caa9b 3f0a5aad 3f8c168b", + "3f7e307e 3e216090 be31fc14 3e8b3f08 be0957e1 bdff49b2 3f73d018 -> 3f0c9153 bf1b0899 3f7294b6", + "bec25e60 3f685996 3f0b9d02 3f4a0b5c 3f4a5e84 3f2eee5a 3f86b0a0 -> 3f5a4adc 3f032a9f 3f3dd205", + "3fa2be80 3e2ee3bc 3e71a35a 3d700160 bd552d20 3e91a130 3e09d2bc -> 3e5c8d61 3e985d3c 3d9755af", + "3f9c7473 bd8dd336 3ebe78ac 3e67505c 3ed65e64 3e8b7976 3cf30340 -> bda3931e 3edbae62 3e8564bf", + "3f4e5502 3f239b8f 3f868e02 3f1023d2 3dba1ff8 be4a23f6 3ea2e3e8 -> 3e8f4d51 3eebb5b5 3e7c803d", + "bc0c3740 3ed5dc16 3e8f3e14 3f24c8bc 3f9e3576 3e289bb4 3de9cd14 -> 3ed42cf0 3e8e1d4c 3f237c86", + "bec143dc bd98d232 be42ba94 3f2a4179 3dab06c8 3f0d2204 3f8cb21c -> bd66555b be12bf8e 3f004e26", + "bda110d8 be60ad41 3e6cc34e 3dcacf28 3e8c2774 3f2c634e 3f89fad9 -> be1ff75d 3e289246 3d9065a9", + "be4a47c8 3f3444a5 be50d24d 3f327ad6 3f5a5a10 3f2c37ff 3eb8b9b6 -> 3f2cbec0 be481b5d 3f2b080f", + "be115fde 3f3e80fe bcc30ea0 3ee6350a 3f217756 3ef7de98 3f35c266 -> 3f3fbecd bcc4541e 3ee7b513", + "3f95dc98 3f9a64e6 3f2a3759 bd1bdbe0 be055950 be6b13cd 3f732820 -> 3f67f27d 3effb782 bcea25d2", + "befc55ac 3e9fd5f6 3f4f929e 3dae72c8 3f789ab8 3e38cf88 3ed3b2aa -> 3e9043a7 3f3b59c4 3d9d740a", + "3f25092a 3f11eb30 3e5b27b0 3f889823 3ec2276c 3efaf884 bdddb980 -> 3ebe1e0e 3e0ec4ba 3f31f7f6", + "3f8f1b9a 3e6f4e74 3f9926f4 3e084372 3f3deeee 3f806e64 3f896444 -> 3e53c5f4 3f87880d 3df12bef", + "3ed10ca0 3f8ab4e8 bd0d90c0 3f33e982 be3b3522 3e0e8748 3ea03710 -> 3f44da7e bcc8e92a 3eff552c", + "becd384d 3f50f97a bde742e4 3e1da838 3f272841 bdf9936c bce9aaa0 -> 3f61bc58 bdf9cf61 3e2a4d5c", + "3cb99c80 3e70e33c 3eb958f8 3f90dfac 3e781070 3f9941c3 3f28f726 -> 3e713416 3eb99721 3f91104c", + "be891b2f 3f818ed0 3f21ea40 3ac74300 3f9f3985 3f117996 be577a0a -> 3f733a20 3f17fc91 3abb0b6d", + "3f4bf2ea 3f37e972 3f8a18b3 3ec1757c 3c8bc8b0 3f902fcc 3f12fb24 -> 3f3e5f9d 3f8ef2cb 3ec84187", + "3ef15872 3f186ba9 3f21e4d6 3f676800 be55b7c2 be1908ca 3f08bbfc -> 3ef60d97 3f02ac47 3f3ac7ae", + "3f95f679 3d9d9248 3f29c637 3f79eb74 3eb95d60 3f95cb13 3f124fbc -> 3dc2423b 3f514d84 3f9a0de5", + "3fbfbc89 3f15a16c 3e80a308 3e7fab4a 3f872ca1 3e274580 3e839ddc -> 3fa53ac6 3f0e0c19 3f0d294d", + "becf34d2 3f153cb4 3ee70bc2 be35014c 3f52283c 3e8bf414 3eb42966 -> 3ef92a63 3ec0e067 be171a41", + "bebd2a95 3d6e63e0 3f8357a8 3ec593f6 3adbf400 3f25b788 3f69d880 -> 3d780f46 3f88ab81 3ecd979f", + "3f8288c3 3f7ac7a4 bcb514e0 3e4dc832 3f8c62dc bdfe26ae 3e2e9064 -> 3f8caede bccb2af9 3e66e144", + "3f3f39c8 3f9c1204 3e8cf058 3f21c45a 3f25e370 3eefa384 3f395b62 -> 3f596fb6 3e445af0 3ee15f7d", + "bea49542 3f13dfe0 bdf980ac 3e581410 3f368e38 3d8961b0 3ed069f4 -> 3f08b9eb bde6b153 3e47c9b4", + "bef782c7 bd8d0856 3f54a852 3e61a74c 3f53c3c4 bd8ac5b8 3f67e1ac -> bd86de8b 3f4b5d3f 3e57cadc", + "bef33539 3f6316e8 3eae42f4 3de205a8 3e8bbd3c 3f68773c 3dde6d48 -> 3f608921 3eac4d44 3ddf7af5", + "3f79225c 3cbf4570 be4e1ce9 3f9ac9c4 3d196360 be2754ae 3ec5c1b6 -> 3c012aa2 bd8b3065 3ed10eed", + "3f26cb90 bd979256 3ee1f6a4 bd9dd99e 3f871424 3f60b952 3f9b6400 -> be223b8b 3f71db53 be28f3d9", + "3f4eb328 3f65df66 bd99d844 3f09dfc2 3ea916a2 3e83470e 3f609e30 -> 3f61a13f bd970159 3f075450", + "3f65e0ec 3ecb5e0c 3f9d841c 3ca03e90 3f98c9f0 3f03c26c 3f2a9f4b -> 3ec5e307 3f99456b 3c9becf6", + "bd699288 3f97ab59 3e8b074c 3e00134a 3f4f5a88 3ebb1b70 3e8edc84 -> 3f9a67f4 3e8d8982 3e0262e4", + "3e74c91c be2ea36c 3e80e2f4 3ed9f004 bc9fd3e0 be6aaf86 3ecc2c94 -> be2c007d 3e7de1a7 3ed6a5be", + "befc7cab 3e0eb400 3d425068 3f82cdbe 3e9bdbee 3f7119ac 3e938b5a -> 3e14385b 3d49d34d 3f87dc2f", + "3fbe2500 3e29720a 3f5260f4 3f98a9a6 3ecda768 3ef65ef4 be463bac -> 3c9a4e6d 3dbf951a 3e0b05e8", + "3f803219 be3a3dd0 3f709196 3dc012a8 3f126868 3f784190 3e901716 -> be4033b5 3f784492 3dc63852", + "be36da9a bda442a0 3f861ffd bb991f80 3e865734 3f2f59bf 3e3482a0 -> bdae6b0d 3f8e6b5d bba29611", + "3f6cb5ac 3f6c537e be0c6101 3dcc4f80 3e713da2 3e6a1f9a 3f4b1770 -> 3f4d988b bdf44000 3db1be3e", + "be1ff534 3f6ee334 3e7d99e4 3f23a5eb 3f52a8c0 3e03667c 3dbead08 -> 3f734c08 3e812420 3f26ab36", + "3f5bf840 3f3322b3 3e3ac618 3e221b4a 3f912f20 3e63f4b4 3f2d9a90 -> 3f895b41 3e8f369b 3e789929", + "bef843be 3f0fdfe6 3da7ad6c 3f2898f9 3d5128f0 be07d503 3f81cd1f -> 3ed46f8c 3d7794d1 3ef8f0a4", + "be5438e8 3e7f9434 3f46cdbc be54f68c 3bdff640 be0d6bec 3e2ebd00 -> 3e94743b 3f66f3aa be7766a5", + "3efac2b8 3f357933 3f57c95c bdabdda4 3b279300 3e86b34a 3f1e491e -> 3f1dca1d 3f3b9fdf bd956f90", + "3c59c880 3ee25638 3f345c6a 3f7fbfa8 3f1767f0 bd7ca168 3ef179a8 -> 3ee11bfe 3f336203 3f7e5c98", + "3eeb8d42 3f1d8e74 3f8b2378 3ec19ab6 3e597248 3f3f8618 3f4ea1a8 -> 3f0ae4e8 3f7550cf 3eaaac17", + "bc9766a0 3f83f909 3f30f0f8 bd861936 3de3e938 3f83be9a be58cd3a -> 3f83fa1d 3f30f26b bd861a43", + "3ed2a5ba 3f3898bf 3f18e38e 3f10e8d3 3c869340 3f961331 3cde2550 -> 3f68233e 3f40438d 3f363abd", + "3fbe7100 3f16e82a bbfebc80 3f61b6ac 3f9ad1c4 be42ba3a 3f605940 -> 3f6a63ab bc45d45c 3faf4a2d", + "beae1de6 3f209943 3f68d950 3f35aaa0 3f96ea6b 3e95bad2 3f3fe05b -> 3f106b31 3f5163cf 3f235d30", + "3f818f11 3f7086cc 3f29f502 3f85b1ad 3eba3ddc 3f1d0d98 3e0655b4 -> 3f0c1126 3ec5f19d 3f1bb59a", + "3f8904c1 bdc93cdc 3f9da3b9 3f921536 3ef7b8e2 3f147c6e 3f738f34 -> bd983c1f 3f6e8196 3f5d0565", + "3f906193 be121c8c 3e3b5b54 3ea666ae 3c81f110 3e472ea4 3ef556f4 -> be604ba8 3e8fce38 3eff7129", + "beee448f 3f584468 3f3f16ae 3e817214 3f3034a6 3f972434 bc104c60 -> 3f303d08 3f1bb857 3e52f922", + "3d1cbbf0 3f840bd4 3ef32474 3e3aa144 3ef93f94 3e93d8ac 3f4ca78c -> 3f82e8b4 3ef10c65 3e3905ce", + "3f9ab6a2 3f977746 3f45857a 3f6715ac 3e9e3194 3f92addf 3d8112f0 -> 3f91ae22 3f3df9f9 3f5e41f4", + "3ed57f62 3c2ec540 3f7d8c40 3ef38e2e 3ef5aa08 3f966506 3e1889b4 -> 3c3c5968 3f889f9b 3f033d35", + "3f06d5de 3ef404f6 3e09dd20 3f69c54e be1bb8fe 3ca69c40 3f5bb050 -> 3eec46fc 3e057d5d 3f625a8e", + "bebf4ef3 3f956f2a 3f0aaa50 3f6cea46 3f2ec52e bde14b0c 3f062e53 -> 3fac9e6c 3f202dd8 3f88d60e", + "bbd4d780 3f01b538 3f35821b 3f9f9e54 3d290178 bdc8c2d0 3f984035 -> 3f01bf2e 3f359009 3f9faa95", + "be8939d1 3f29515b 3f2c1dac 3f74f6be 3e98dfd8 3e2a2470 3f169684 -> 3f3acd1f 3f3de367 3f872112", + "3f1cb718 3f80c538 3f8378fa bd2a05e0 be7a068f 3f8bce31 3f62386a -> 3f85c443 3f8892dd bd309eb1", + "3e75c644 3db8d794 3f04e304 3ec71c12 3c96ee80 3f987ba0 3f6fcf8e -> 3df24a93 3f2e302c 3f027f22", + "bef52a15 bca49ac0 3f9d15b2 3f60539c 3f80c28f 3f49f40c 3d8a7840 -> bcb2d0e8 3faaa5ce 3f73b204", + "3f56b27c 3d00a250 3ef514e0 3e4113b4 3f82f134 3e56880c 3eb12c28 -> 3d7b4e9a 3f6f6720 3ebc9a72", + "3fa07615 3f36599d 3f9a6748 3f4ca1d4 3f8d55e3 3ca33930 3f02b912 -> 3f2300c1 3f8a057c 3f36ebc3", + "be91caf5 3f43b85c 3f378aa6 3f2d46d2 3d43a3d0 3f63f5ea 3f8855c8 -> 3f2dcefa 3f22fe4e 3f19e0ac", + "3d623070 bd760e98 3f1bae9e be689d72 bd20f984 3b30dc00 bdbc2f34 -> bd68878f 3f131f88 be5bd395", + "3ed13b2e 3f31f246 be2d7376 3f0aeacc 3f209510 3e8a8efa 3f8a41bb -> 3f5a39ee be54b6a0 3f2a5ccc", + "3f4cab0e 3e98cf04 3f828d5b bc8c8148 3f21fa5f 3e9344a8 3efac81a -> 3e54db55 3f35dab5 bc43b7b5", + "3f2bac72 3f101475 3f56ec34 3e282eb4 3f6bdd74 3e3459ec 3f8d5e2a -> 3f2e90d3 3f8232f4 3e4bc4a1", + "3ee85cce 3e854180 bd4f3368 3f354ae2 3f92ff11 3e8146f0 3eacd730 -> 3eaad9d7 bd84d41b 3f687088", + "bec18d2e 3f8f6dea 3e29b124 3f4ff1fe bd30ed90 3e406fec 3ec475de -> 3fb3153f 3e53dfbd 3f81d171", + "bef441c2 3f9015b6 3bdb8400 3e685adc 3f7fd24c 3f2e359c 3edfa736 -> 3f97cd06 3be7454e 3e74cc56", + "3df8b3c0 3f726ff0 3ee355ba 3f2a3fe0 3eb4a72a 3ea68f06 3f49d8f0 -> 3f6d8217 3edeb67c 3f26c9c3", + "3f2b6382 3f826134 3f5bccf6 3e9425e6 3f89cd30 3d5bdc58 3f9ba9b2 -> 3f934e74 3f78562c 3ea761b1", + "3da36598 3f90cb2d 3f8acff6 3f3a96ee be6d6fec 3efc2fbc 3f22153b -> 3f8bb510 3f85efa3 3f3408f3", + "3ecec9d6 3f1aae6c 3ed753ec 3eda126e be19e69a be135b86 3f1c59ff -> 3f1b5b1d 3ed84451 3edb05e4", + "3f3fe162 3f15352c 3f97fa7b 3f960594 3f3ee0de 3ed5d172 ba383200 -> 3ed7345e 3f5b336a 3f5860f4", + "3f15966a 3f4161ec be53d3f4 3f0baa8e 3f96adfb 3f4c92a8 3eedc0dc -> 3f803cf2 be8c7846 3f393bf0", + "beba66e6 3f0e9f54 3e8bbe18 3e055b1c bded0e56 3ed5cf16 3f5515d0 -> 3ee9f041 3e6536ff 3ddabd2f", + "3fbf0e0d 3e305c76 3f3f7fca 3f7b2e48 bd7e2418 3f86df30 3f84e295 -> 3e43d0b6 3f549f83 3f8b71ab", + "bd2fdfa8 be67fc68 bc325620 3e819a76 3e607992 bd940878 3f9850cc -> be431edd bc15ff62 3e5a03ff", + "3da5e288 3f6bd800 3ebc0f94 3da5cc08 3f62d50c 3f778170 3f5f20b6 -> 3f6cc9d1 3ebcd067 3da6760a", + "3a8bcc00 3f854a74 bd889d04 be22dfc2 3f718536 bda65994 3ea6e48c -> 3f854708 bd889985 be22db93", + "bedfd7be bdd1a8aa 3d3b2708 3f9b9412 3f304194 3f83a217 3f3153f6 -> bddfc44d 3d47be12 3fa60c0e", + "3d428140 3e41d4b0 bd7231f4 3f0ec320 3f1d2a5a 3e583326 3e61bd30 -> 3e42c269 bd735afe 3f0f7238", + "3f4f2c08 3f86ea2e 3d2dd520 3f353d92 3f1f13b6 3f063ed6 3f6a8c2c -> 3f7146ec 3d1b7028 3f220ff0", + "3f81da37 3f93eba0 be4d8aeb 3e7e24a4 3f33661b 3f9afa8e 3f5e60a8 -> 3f9b14b4 be577e0b 3e853910", + "3eaeb08e 3f10936b 3f63e638 3e7a6220 3f628992 3eeca5c8 3d3b26b0 -> 3f1047f2 3f636f44 3e79df6f", + "3faacea7 3f98c21c 3e934a30 3f47dcd0 3e18eb0e 3e7d368c be66434b -> bd8d9a90 bc8888dd bd3944bd", + "3ef3b236 3e34aba8 3f45f660 3cb55640 3f0174a6 3ecd62d4 3f24d365 -> 3e2646b3 3f3630be 3ca6e3bd", + "3fbdd5b3 3f920786 3ec414fc 3d938bfc 3f24f5f8 3f28e618 3e251f18 -> 3edacdec 3e12e689 3cdd13fa", + "be359722 bb6ad480 3f379efa 3f9e6dbc 3f88a78a 3f8979a8 3f83cded -> bb705634 3f3bed77 3fa224f8", + "3f7fd7ac 3e99ed52 3d8154c8 3f7aa0c8 3f7fb9e6 bd9a18fa 3f5b2b0c -> 3e9d0e5e 3d83f5d9 3f7fb918", + "3fa8356e 3f809c1e 3f96b060 3e6363cc 3cde2650 3f641d00 3e1d91f8 -> 3f2f0c1c 3f4d193f 3e1abf3e", + "3f4e3b1e 3e8d4dca bcc43110 bd60e8b0 3f0f43b0 bcce57d8 3ec98350 -> 3f0125d5 bd335058 bdcd8f7f", + "3f3b5b28 3e83b774 bd9ec7c0 bc1b1970 3f86b666 3f913553 3f624252 -> 3f663417 be8ac065 bd0788c4", + "3f8c4a08 3f52061c 3f4b0158 3ea9d760 3ed8b4a8 bb965680 3f5b8114 -> 3f5c6a17 3f550c6f 3eb23e70", + "3faacd81 3eeb9790 3e9613d4 3f41bac0 3e67d226 3f84d42d bdfc7cbe -> 3f30280a 3ee06e67 3f90dae5", + "bea3187a 3ee9537c 3f8ccc46 3ebc098a 3f82648c be7872e1 3f034752 -> 3eeed199 3f901ccb 3ec076bf", + "3f904984 3efb8106 3f857502 3e8416c4 3f59660c 3ec5b464 bd4a29c8 -> 3ec6e912 3f53191d 3e50ef1c", + "bee262d8 bddfe37a 3f3d0d2e 3f99268d 3d2523c0 3f9c745d bdb0f736 -> bdddc0c2 3f3b3f89 3f97b090", + "be822504 3e097d9c 3f91f6a1 3f5a96de 3f2549ae 3f0be36b 3f5a7816 -> 3e1248e4 3f9b4ca8 3f689218", + "3fa09213 3f6ed48e 3ee06d68 3daa7934 3e3f939c 3e88a280 3f09ad8b -> 3edfe0b5 3e526065 3d1fccef", + "3f9e2153 3d9473e0 3f5f8ed4 be5d7135 3f9043af 3df7d7f8 3f9d0062 -> 3ddea66c 3fa7a582 bea60f58", + "bd7a3340 3f800bab be347ec7 3f52f446 3f5bf922 3f2823b1 3f8a8ca9 -> 3f7eced3 be339741 3f51e5af", + "3e84c092 3f4dfcbc 3f4f6da8 bd82ed92 3f885fd0 3f9b47a7 3f99d25a -> 3f688aa2 3f6a2b1e bd93ce62", + "bd923c64 3f9ad5a5 3f436de6 3dfbfb5c 3eebffba 3f68cf3c 3f93c995 -> 3f9b5676 3f44107e 3dfccd04", + "3f693a9e 3eb566a0 bd9a1e22 3ed3024e be05dc3a 3f29afd8 bc05c340 -> 3f0cf815 bdef88a7 3f23fa58", + "3fa0f8b9 3f8ebf2c 3f94d4b4 3e272b7a 3f59edbc bd80fd5e 3f8d7643 -> 3f85dbc8 3f8b9055 3e1cc2c7", + "3eb0c030 3f88867a be61759e 3f84a846 3f91dfdd 3f82af62 3efe25cc -> 3f8bc0b6 be66ca17 3f87cb1b", + "bea86b28 3f60c90c bdd29938 3ebe4a8e 3e9b83e2 3f1608d8 3f3ae7a6 -> 3f6d3ef0 bdde45c3 3ec8d6f3", + "bc84cd00 be0f7c47 3f692446 3ed50f00 3eec5784 be364992 3f0559a2 -> be107b29 3f6ac269 3ed6897f", + "3eb90aba 3f931209 3e25cc7c 3f3d7030 3f9f39ec 3f573060 3f005322 -> 3f9776b4 3e2ac061 3f4318d5", + "3f8afeed 3f65c440 3f82ebb8 bd12e1b0 3f83577e be1d1f4a 3f700244 -> 3f6691a3 3f8360c0 bd13650d", + "be9e59c6 3f3bcb4e 3eac5dbe 3f124022 3f91b83c 3ed10086 3f2e1424 -> 3f1bbd2a 3e8ef1c4 3ef292af", + "3f4d385a be63c274 be569082 3f50c700 be316403 3f03014d 3f3491e4 -> be4b175f be3f535f 3f3a2a43", + "3f963e47 3b052000 3f7f435e 3e0f07e4 be0a351d 3eab25c6 3f9e7206 -> 3b2ad92f 3fa3ccd3 3e379031", + "3fb1f096 3f5e2f7a 3d3e05c8 3f92a5f1 bd8e8ce2 3f9f5fe2 3e4165b6 -> 3f78fd68 3d54f259 3fa456fc", + "3fbcadde 3dfeab4c 3e214d88 3f0712f6 3efaa154 3f8572b0 bcf76478 -> 3e9b41c1 3ec4ac80 3fa4b188", + "3eab8f00 3ea5ead0 3f8c23b0 3f12bb48 3f29ed58 3f8ba2bf 3f6b79c2 -> 3ea5b7aa 3f8bf87c 3f128e0f", + "3faa0dca 3df8ba00 3f965498 3f95666c 3da17890 3f85e09f 3f97907c -> 3dfb7060 3f97f845 3f970781", + "3f31a980 be65afbc 3f8987f6 3f693c42 3f43254a 3f731e3a bcc95180 -> be532cb6 3f7ce4aa 3f566fff", + "3fa9128e 3d24e830 3f2cf440 3f754214 3ed380fc 3e76eada 3f3ee578 -> 3ce940be 3ef4a299 3f2d73ec", + "3f84d151 3f62087c 3d1b40a0 3f165654 3f381bec 3ef89a0c 3ec20f94 -> 3f3687f8 3cfabee3 3ef2ce9a", + "3f890a7b 3f937e00 3f5106b0 3ee70ac2 3efc9ac8 3d8b524c be50af37 -> 3ee4c69a 3ea21c55 3e332f67", + "3efd95ee 3df9b970 3f9d3f84 3f8cffa9 bd5017a8 3e8270ea 3eab8b58 -> 3d9fc5ac 3f493676 3f346b90", + "bd0fe348 3eaa86ec 3f5dd6b4 3f7a2b60 be20e361 3f9f47b4 3f02b9cb -> 3ea8e3af 3f5bb54e 3f77c455", + "bdf90bd0 3e2d4c7a 3f5d7934 3a336600 3f198ac8 bd9b5da8 bd02549c -> 3e33c340 3f65bbf5 3a3a1922", + "3ef8275c 3f62f524 3ea8ed0a 3f1c1325 3e9ee870 3f0e192e 3f77af68 -> 3f6d00f4 3eb06741 3f22fbb9", + "beabbfd2 3c024f40 3e56db84 3c9afcc0 3f21b3f0 bd90f5f2 3ebd0738 -> 3b29b836 3d8beb38 3bc9dc81", + "3fb20f8e 3f327537 3f8da162 3e5b07e4 3f9e4121 3e247f2c 3f0df8a0 -> 3f4f98c8 3fa4c18d 3e7ecb69", + "3e6ec580 3ed7baac 3f5c2af4 3f2054c6 3efb7b3c 3f8f2700 3f24e8d4 -> 3ee6d6fd 3f6b96dc 3f2b8fbb", + "3f4f8bd8 3f99c6be 3e4d621a 3f92614e bdd9500a 3f89fcbe be77da26 -> 3f8cf9c8 3e3c4963 3f8631f6", + "3ef6056e 3f260883 3e77b0b4 3f638a4e 3f731f46 3f1e1646 bccad720 -> 3f2b7f29 3e7fd730 3f6b070c", + "bd883da0 3ed03fa4 3f35537a 3eec2672 3f885714 bdde4e8a 3dec7c78 -> 3ec944e0 3f2f3fb5 3ee43c4a", + "3f4bd288 3f811b38 3f84b570 3f1d0886 3f81ba40 3f29e215 bd7b6450 -> 3f7d9828 3f8255cd 3f1a3984", + "3df65348 3f384b91 3f9ddf30 3f88db4c 3f2fcb2f 3d96349c 3ec7de60 -> 3f2e7861 3f95749d 3f818f87", + "bdbad7f4 be768695 3e005524 3ef9bbe0 3dcf3e30 3eb8f44c 3eddaa98 -> be790dae 3e01a5fb 3efc4b66", + "bedede20 3f1d5696 3f1337ac 3d162fb0 3f4b0986 3ea89eb4 bccea630 -> 3f09722c 3f009ad4 3d0332c0", + "bef606a2 bdc9442a bdadf39c 3f2d0f78 3f7a17d0 3e8eb288 be74d414 -> bd9e37b6 bd88bed1 3f080b76", + "be78da6e 3ed3db4c 3e8f742e 3e0585fc 3e285d98 3f88dfde 3ca54750 -> 3e8249f1 3e3071b3 3da43adf", + "3fb3d34d 3e845b9a 3f88e9da 3c550600 3e969f62 3f55ba18 be6d0620 -> 3e37175f 3f3d64ac 3c1356aa", + "3eba03ea 3eaa7c62 3f9c9aa4 3f36c660 3f47bc0a 3f6eba44 3f2c7132 -> 3e9bc1ba 3f8f1303 3f26fbef", + "3ccff9a0 3e58ccd4 3ea74b16 bcf2a0b0 3dac95e0 3f9b5f76 3e4d692e -> 3e67be54 3eb2d305 bd01acf7", + "3f174572 3f88be6a 3e129c88 3f75b35e 3f85b6a8 3ec2486a be0b6d28 -> 3f86f404 3e10b10f 3f727bb3", + "3f209646 3f8c2d99 3ddbe38c 3f97e830 3f0aba6a 3e26ac48 be0540fc -> 3f38cb80 3d90f02c 3f4841be", + "bcce8910 3f4163f8 be67c473 3e7ee750 3f3e9542 bd333a94 3f1dfc0c -> 3f417617 be67da2b 3e7eff43", + "3f6ccc62 bd6f3bc0 3f9b248c bd5a4380 3f189f02 3eacb390 3f863b99 -> bd516893 3f87cd1a bd3f0d83", + "be6c1da2 3f9a0a46 bdb84bde be2ded58 3f8d8068 3f88e7f8 3eb891bc -> 3f9cee69 bdbbc16b be313109", + "3ed72d46 3f2d2c92 3e9b4174 3effc4c6 3e525788 3f93cce1 3f86a862 -> 3f60a03f 3ec96240 3f25e152", + "3ef7b2aa 3f5db8d8 3f46f600 bc3f9840 3f050f31 3f0dc172 be5923bf -> 3f370917 3f243eee bc1e2a2c", + "3f4669a6 3e9b2d4e 3f78b126 3f16fd79 3f80f94b 3f555e40 3f7fdacc -> 3e9fa730 3f7fdd95 3f1b5870", + "3f804b0a 3e39782a 3f435796 3e4b3934 be54d64f 3d856c20 3ec96c84 -> 3dbed50d 3ec8fd90 3dd11984", + "3fad846e bd57a128 3f8da5db 3f2fb99b 3eafb644 3f4266e2 3f6a77d0 -> bd253f9c 3f591acc 3f06aae4", + "beca16f1 3f386e2a 3f7fd772 3e93fec0 3d532948 3f50ab48 3da5b254 -> 3f45da41 3f893afe 3e9ec406", + "3e88de78 3e3d4c5c 3f9aad14 be31c0bc 3f844c2c 3f816011 3efdd66a -> 3e35fa11 3f94b19d be2ae0cd", + "3f335288 3e411578 3efb0e60 be1bc718 bc639420 3f1c6e12 3f50406a -> 3e8d1b81 3f37795e be63b002", + "3e244d80 3f4a4922 3d514160 3e272dd8 3f56ec3e 3ed13502 3f189c5c -> 3f4c5036 3d535a51 3e28dacc", + "3f399938 3f6baa4c 3f0d4805 bd965f8c 3f85ad47 3df9fa08 3f2097d8 -> 3f8151d1 3f1b0de2 bda5084c", + "3f718b52 3f9c6cda 3d4fe190 3f34c000 be6d341e 3f2b2482 3e9a3a44 -> 3f332501 3cee12d9 3ecf009c", + "3fbf5ca3 3f4dfd6e 3df9f3dc 3c0c8540 3e9bdac4 3f92e587 3e7722f8 -> 3fa8a0e7 3e4c9e11 3c661123", + "3f96d5b5 3ebb890c 3f16ab60 3ddb4b98 bdd03978 be17226f 3f5568de -> 3f0bc770 3f609a2f 3e237386", + "3fb418af 3f32c35b bdfe60aa 3eec8cae 3e20431c 3f3c19ef 3f682084 -> 3f7dd8a8 be349c29 3f27f3b0", + "3f04e110 3ed02448 3f932de1 3f9e9ee5 3f2380e2 3f8f29af 3f88aab4 -> 3ec59cfe 3f8bbc03 3f9698de", + "3df9d1b8 3e42245c 3ec89c72 bd041498 3f98a4c8 3e864692 3e7f0e50 -> 3e7289a5 3efa9e8c bd250159", + "3fbd87ce 3f96eace bdc334fa 3e91fdb6 3f02cf73 3dd69ce8 3f68f25a -> 3f47d4f7 bd813d02 3e414f18", + "3e74c970 3f9b4e52 3f88e54e 3f6561bc 3ca0fb90 3f85977d 3f670378 -> 3f961d7c 3f8451fe 3f5db715", + "3e4b21e0 bd99ae8c bbc32b00 3f5ca232 3f978549 3f24fc9e 3ef6c450 -> bda51196 bbd1a1fe 3f6cfb1d", + "3cfc8c40 3e638ae4 3c9e8980 3f6a6c82 be622139 3ed8e6ac 3f0ad4e6 -> 3e60ae96 3c9c8b57 3f677a15", + "be876183 bd5a2d90 bde2aa1c bd350bf8 3f57141a 3eab4a94 3f98eca9 -> bee565e8 bf6e5232 bebe5b7d", + "3f5be7aa 3f9c4d45 bd95c424 3f654154 3ec28ca4 3f9f9715 bd23cf98 -> 3f9f2064 bd987902 3f6965ff", + "3ed93956 be2dbb62 3dbee060 3ebcf208 be336e74 bdad7072 3f98aaa8 -> bea91fa6 3e39d03e 3f37ef00", + "be16b07e 3e175240 3eb6390a be770405 3f5e26ac 3f8230b6 3f56606c -> 3ddbe6f6 3e846782 be337bb8", + "3f46992e 3f91528a 3f1e925a 3ef6af82 3f6e6046 3df0eba0 3e02a958 -> 3f7a1896 3f0872e7 3ed44509", + "3f982a54 3f6e1fde 3f30b27d 3edbe784 3eeb1360 3f752a26 3f412898 -> 3f767e68 3f36e855 3ee3a21f", + "be69ac92 be3b3748 3f9bb06f 3f0dc440 3f25ce74 3e8b3e44 3f7475ca -> be4465be 3fa35311 3f14b819", + "3cb842e0 3f968c20 3e97e6fc 3f9a29a8 3e8442c8 3f197f97 3f94be43 -> 3f966da8 3e97c83b 3f9a0a73", + "3f9db065 3f488e38 bd58fbe8 3f9c76b8 3f1143de 3ddbc72c be401488 -> 3e885a8a bc9385db 3ed4c0ca", + "bec57173 3f0eb522 3e27a64c 3f32e60b 3f6110b4 3f8a8c58 3f2d3603 -> 3ee1000d 3e04299e 3f0d07cd", + "3d0970c0 3f272990 3f9842a1 3f1d9ab2 3e549f30 3e40b2d6 be41c2f1 -> 3f228849 3f940b04 3f193d30", + "bd7277d8 3ec7774c 3ee8f57e bcf4f910 3efd8494 3f90f552 3ea142a2 -> 3eb5e26d 3ed46cdf bcdf6157", + "3fb9088e 3d94f6e0 3f070472 3ed87dc4 3f449dde 3e5cb73c 3f9bdb73 -> 3e57639c 3fc33917 3f9c8375", + "be9bd0ee 3efc8478 3eea0ca4 3f9222e9 3f19b140 3f312dbc be071742 -> 3f0d63ca 3f030c92 3fa3a64a", + "3f035166 3f4d774c 3f8d6f1a 3f825edf 3ee10ce2 3ce7f8e0 3f9ef024 -> 3f5a828b 3f9669b2 3f8aa5aa", + "3e4a4e58 3eb6dc76 3ead7138 be4c19a0 3e254b84 3f8cf6a2 3f37e634 -> 3f0110dd 3ef4d5f4 be900e7c", + "3ccdc300 3f3df582 3f804a9c be35f9b0 3e66390c 3f3f598c bdfcbb00 -> 3f3cbef7 3f7ef1c5 be34d030", + "3e15cc20 3f62e520 3cd4e520 be0e34a2 3f1deae2 3f357f1c 3b5fa200 -> 3f5c40fb 3ccea9e0 be0a0b12", + "be92ec76 3ef6fde0 3f3954e1 3f5b768c 3f3efefa 3f98aa8a 3f522554 -> 3edb4281 3f2485d3 3f42d270", + "3f7305ce 3f199c8a 3e4e69e0 be47109b 3f5aaadc 3ea58212 3f2f9e24 -> 3f575e9b 3e90b33c be8b8c6d", + "3f8f75c1 bd7b42a0 3ebe8a94 3eb695fa 3eba8118 3e7f42c4 3f805f8b -> be3623f3 3f8a1ff4 3f845b9a", + "3f95887b 3f34711b 3f88e21e 3e008bf4 3f98ea17 3f9ee8c8 3cccd8c0 -> 3f565c87 3fa29d5c 3e18b606", + "3fb1b6c7 3f54370c 3f684ae8 3f894dc8 3f11c0aa 3f7d00a6 3de83aec -> 3f3d08b7 3f4eeb20 3f749c7f", + "3faa9f87 3f5d63bc 3e460c30 3f2a53e6 3f944c18 3f92e070 3f0e8e38 -> 3fa0d190 3e8fdce5 3f77743a", + "be9f12c2 3f0cfabf be6ee914 3f1ee367 3e326210 3ee194f8 3f04e5a4 -> 3f1424fc be7b0d79 3f26f6a8", + "3f43770e 3f6761e0 3f4127da 3b2a5500 3e56b9aa 3e80411c 3e226a6a -> 3ecf5aac 3ead18e3 3a98a48b", + "3f9a0939 3f6790a2 3ef6a71e 3f4d2acc 3f99c1c2 3f0bbe90 3f6bb230 -> 3fa17b29 3f2c00a7 3f8f129c", + "3f98ee56 3f0b4f92 bc8bf6c0 3d0ea310 3f15c063 3ea52d8e 3f8ba0ac -> 3f9941a1 bd19f991 3d9cea4e", + "3e87c048 bd91ee0e 3f70f716 3ee950bc 3eb41fa4 3e48c378 3f5bf3c2 -> bd8e8e51 3f6b64d1 3ee3ebc1", + "be96c463 3f86bf41 3f413f96 3f453baa 3f0d0714 3f418120 3e5fe380 -> 3f91ef72 3f514b49 3f559c0e", + "3fb338c8 bdc6e79c 3f51f13c 3de09208 3ef9c030 3f9a3662 be1c7a2e -> be24c616 3fadead6 3e3a0917", + "3fb93765 3f762f7c 3f8e948e 3f9a8a56 3eb404a0 3f62dc06 3df79bb4 -> 3f176bdc 3f2f64cb 3f3e1b37", + "befb8cda 3f8452b8 3eabf26c 3f56d822 be07312d 3f2da44e 3dfd8978 -> 3f9aadc4 3ec8ff38 3f7b2445", + "3f4cd4d6 3f881862 3f4c01f8 3f8dcf4c be484141 3f0ca6d8 3f5f977c -> 3f6218ab 3f2975c2 3f6b9706", + "3fa6b6c0 3f7a13f8 be60437a 3eccf8e0 3f851eb7 3ee772a0 3f8c482a -> 3f90e462 be81ef7f 3eed8456", + "3eb5cc0c 3ed35e1e 3f966bf8 be1c7ed5 3ebc5408 3f7e5fe2 3eba2a08 -> 3ec7c667 3f8e2bfd be13e992", + "3dfb72c0 3f89e6fe 3eff2766 be7fc9f8 3f0f54d6 3efa0096 bdd1a69a -> 3f81c51b 3ef01b62 be70b462", + "bef3127b 3e2d197c 3f9731c4 3edda6c0 be308cb4 be1ee13c 3e4cd62c -> 3e715ca1 3fd2d177 3f1a87b2", + "bd4124a0 be6842f2 3e80e752 3edde0d0 3ecf8bd4 3e6527e4 be10fc23 -> be68f80a 3e814bd6 3ede8dd2", + "3fbd67ad 3f8a9cfd 3f0e983b 3f0fc4e2 3e3c8adc 3e8cc642 3f1d7ea9 -> 3ec81cd4 3e4ddc49 3e4f8e55", + "3ea7e65a 3ed2428e 3f3df7d6 3f4009b0 3f6f446c 3f814e16 3e8419be -> 3eea2996 3f539055 3f55de6b", + "3fbd9731 3d46e440 3f8dc88b 3efd35b0 be4165c8 3f39cc4e 3f8a9c87 -> 3d404d0a 3f8915ce 3ef4d1b8", + "3f13bcce be19d19e 3f9bd488 3f76609c 3eb6e33e 3f255acb 3d53a3c0 -> bde04b6a 3f633a38 3f33a163", + "3eb4aa1e 3f2c6448 3f29efe2 3f9b320e 3f0515e8 3e82a818 3e6ddcfc -> 3f09a4bd 3f07af02 3f77d3b5", + "3fbf0d56 3f987dbc 3ee09142 3e00c882 bd162d68 3f084c82 3f25e2af -> 3ec2bbfc 3e0f637c 3d247574", + "3f96c366 3e41aeca 3f6ec9b0 3e12619e 3dad5c2c 3f989456 3dd47c00 -> 3e808b96 3f9e7b28 3e424dbd", + "3f9100aa 3ec9c524 3f982ac8 3eb03eb8 3f3f7daa 3cd0fd10 3eda9bd0 -> 3e6a0977 3f308068 3e4c6e14", + "3f927441 3f16ef2a 3f596446 3f89d88c 3f610858 3ea088dc 3f9d9b4b -> 3f2fb0d1 3f7d0c6e 3fa074a0", + "3f9328aa be2fe02e 3f49a596 3e28ba0e 3f014820 be65a980 3f9ee764 -> be922d82 3fa798e6 3e8c3c73", + "bcc23370 3ed690ec 3df345c0 3f8c84b2 bd680350 3e3d597c 3f4ca882 -> 3ed7f2d4 3df4d700 3f8d6c76", + "3f861544 3d0df620 3f11c834 3cb8c330 3f343220 3f99555e 3f2a3ecd -> 3d99099b 3f9d280b 3d472da9", + "be02a18e 3f399a52 3f1e44be 3f82cc1f bca67b90 3f8714ac 3c396820 -> 3f38d3d1 3f1d9b7a 3f82403c", + "3e9acb7e 3f56e45a 3e990212 3eab29a6 bcfefd50 3f2aac18 be6a5f9b -> 3f4985dc 3e8f7d2c 3ea0839e", + "bc9a0b10 bdd6df3c 3f9d34f2 3f546366 3f954986 3de605c4 3f1e0e34 -> bdd71360 3f9d5b12 3f5496e6", + "3fbbbc13 3f51ecd8 3efe2bee 3f0dfde0 3f8b98c5 3f60a566 be35c614 -> 3f9bc27e 3f3c96ef 3f52b592", + "3e75a97c 3cf38240 3f4deafe bd994e46 3ebb3364 3ea1ef94 3f353b4a -> 3cec8125 3f47fede bd94e584", + "3e9bcf06 bda4f942 3ec92c8c 3e8cf7f8 bcf276c8 3f7ae926 3f80b33e -> bdf33d8c 3f144eb6 3ecfd8d1", + "3f70857a 3f88f3d7 3f037492 3f9cbbdb 3f44aa46 3f474068 3f0cbc28 -> 3f34236f 3eace867 3f4e2850", + "bea0b73c 3f175e50 3ee2c568 3f499f14 3f55ea04 be4f3d9e 3d5e7990 -> 3f1478b3 3ede6e5d 3f45c342", + "3fafc8fc be0344e2 3e5e6978 3e0e6a66 bd93e082 bd7a8da8 be500de2 -> 3dc78d9f be290dba bdd87f86", + "3f146060 3f3e960a 3e22fa6c 3f5a6e64 3dcda278 3ea0599e 3f80fb0e -> 3f5293ae 3e3412be 3f7157bc", + "3fbbd780 3f15d39e 3e9bced4 3f7226c0 3ec3af24 3f5ca7b8 3e14d800 -> 3f024ee3 3e87829e 3f529afa", + "3f9558c6 3f9dd0b2 3f14862a 3d943a20 be1a6c08 3f05d252 3e2951f8 -> 3ecf0083 3e42d0a9 3cc26cea", + "3f405258 3de44258 3ec66e46 3f47afae 3e898e64 3ecea762 3ee58052 -> 3d9b5206 3e8705ff 3f07e0b8", + "bedf7a7f bd9820be bde8f4f0 be545e97 3f4a9200 3f7569f4 3ca37a80 -> bf066f4a bf4ddce3 bfbbab81", + "bd8743d4 3dd5afb8 3df84a8c 3ed5ebee 3e5c4e64 3f4ac60c bdb03fb8 -> 3dc90b41 3de999fd 3ec943e6", + "befbe37c bde425b8 3f8bbc2a 3e5049c8 3e3e2384 3f9458cc bdc2bd7c -> bddd3ae3 3f877f8c 3e49f910", + "bea131a4 3f631434 be3bb2a8 be2f8439 3f2a84d4 3f61a80a 3f8f8542 -> 3f50336f be2c1805 be20ecde", + "3eb024aa 3f82c3bc be350525 3f8a768e 3f946c8f 3e9e6be6 3f96c898 -> 3f86c47c be3a8fc0 3f8eb3a4", + "3ec23f3c 3e2c1822 3f673e68 3f574590 3f939ee2 bdff2e9c 3f2cb384 -> 3e3e29e5 3f7f8611 3f6ddfe9", + "3f809cf4 3e55f362 3f67914e 3f625164 3f7b0c44 3ab8ea00 3f2eb310 -> 3e680904 3f7b2427 3f7572a4", + "be4fbaa0 3f0bbed0 3ea73a76 be2b06bb 3efd4430 3e962fb0 3f945257 -> 3ed7d581 3e8123f6 be0412cc", + "3e5f7e70 be38c7cf 3f9b64b4 bdff9694 be30f854 3e18453c 3f7143e4 -> be2fc250 3f93ce80 bdf31c1f", + "3e8dd152 3d44a9b0 3f1608da 3e9c74f4 3e6e406c bc6649d0 3f18b2fb -> 3d45a159 3f16c5cb 3e9d39fd", + "3f904e2b bd7c6148 3f1ccce2 3e90963c 3f844bb6 3ef5e998 3e8543e8 -> bddffd19 3f8b2948 3f00525c", + "3ecee8f2 3e260824 3e473634 3f6f788e 3f214b94 3e415dd0 3e2402f8 -> 3e1020be 3e2cee29 3f4fe0e4", + "3e098380 3f3f217b 3f7faecc 3ed46e0e be6f8797 be6c4df6 be043ffb -> 3f222509 3f58e831 3eb436b3", + "bd10ab00 3f707500 3f373863 3f89bdec 3f7a08dc 3f7b6fa0 3e9779de -> 3f7132c7 3f37c900 3f8a2aa3", + "be9224b2 3d8c4398 3ea82dd4 3efef852 be70298e be27ffa8 3e812f84 -> 3da003e7 3ebfdc6c 3f116fcc", + "3e9eb7b6 3f76d05a 3f4cf334 3f360aac 3f881186 3f2602b9 3f8e282d -> 3f813827 3f569a62 3f3e9da3", + "3f858802 3f44fbdc 3e42527a 3ee4ecac 3f9adcee 3f084327 be1268a6 -> 3f9d4c89 3e9b2c6c 3f36ce0c", + "3f118c2a 3f565a0e 3f9201ba 3e5dc804 bd085aa0 3ef385f4 3f1f3d44 -> 3f1ef09f 3f588680 3e2472e9", + "3e296f9c 3f92ca3f 3ee99e8c be45c5c4 3f3f852a 3f9b7282 3e88ca3c -> 3f9438f6 3eebe62f be47b3d8" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_color(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "bec0111a 3f8edb52 3e3ff198 3f1d55f8 3dd2baf0 3f94347e 3f8f21e2 -> 3fbfaf29 be24c588 3ee1b122", + "3f9ae0c2 bd54467c 3f742c5c bd404f24 3ebdd394 3c27e9c0 3ee1d7f2 -> 3f7b1d5e be31a1e0 3f94fc1d", + "be8c124c 3e8d4788 3ec20b04 3f822781 3e4cb1e8 3e415c64 3f1c091e -> 3e85380e 3ecb0100 3f822781", + "3ef32662 3ee026ec 3d00a288 3f863da3 3f1c3d1c 3f615a7c be110022 -> 3f133fbf 3f03b95e 3ef0f034", + "3fa0d292 3dc11f70 3f277c1d 3d84ef10 3f2f1db4 3f17eb3c 3f50526e -> 3f2ab321 3edd054c 3f4e2bdc", + "3f84d8d0 be7d9f1d 3f8a9030 3f5b627c 3f1fda2a bc377b60 3f44d7fc -> 3f6bf883 bd6aed00 3f8ba80f", + "3f2f7df2 bd814742 3c5dbcc0 3f58908c 3e5c8d48 bd8d75a0 3da25e4c -> 3f0f605d be3a14ae 3ef5819a", + "3f2940f8 be30d8ef 3d23f8c8 3e98b162 3f468dec 3f685c00 3f1ccb32 -> 3de13612 3e57cbb0 3e6fb966", + "3ecf0876 bdc06e16 3f50dab2 3f3e1a42 3ce1cff0 3f8141e6 3f9b8aa4 -> bd4695f6 3f429545 3f45af5f", + "3fa70fc7 3d4b03f8 3f91ae96 3f6fcc14 3f2ab46a 3f60998c 3e8867d8 -> 3f8e93db 3f91ae96 3e293184", + "3e4ae840 3f0be522 bdb89bd0 3f535250 bd4caf98 3f8b9890 3f8bc7f7 -> 3edc8456 3dba8488 3f535250", + "3e2beca4 be6db32a bd415468 3e146728 3f330932 3f83ba17 3e492c84 -> be34dbe6 bc74d330 3e003e4c", + "be137478 3eba7920 3f822299 3f9447e4 3f6f8f3c bd478c48 3e668830 -> 3e7fd4f6 3f95fc71 3fa47f06", + "3fa5c3fd 3c88b5a0 be0adf16 3eb19756 3e6a7918 3f4dc2b6 3f4906cc -> 3dfbff69 3efa798f 3eac4cb8", + "3facc490 3e00671c 3f94623c 3f4c6ee8 3e9b6f80 3f880bef 3dc72970 -> 3ece5e9c 3f94623c be0b6734", + "3f0a862c bdf567ce 3f390662 3f1358e5 3f88956f 3f453b44 bd94c998 -> 3eac1586 3f1d318f 3e7332e0", + "bea1ad41 3f1ceff8 3eb200f2 3f14054e 3f9d87cf 3f44ca28 3f563d80 -> 3f1ceff8 3eac4e37 3f21103f", + "3f8a4d20 be03a014 3f839e26 3f7b252e 3f2d1250 be55b883 3edacb20 -> 3f8f88c8 bed9fb10 3f1f9136", + "3e535274 be516ed2 3e6a1a94 3f7896c0 3d16e6b8 3d689230 3eba2b0e -> be116bc6 3e59d604 3f7896c0", + "3f82fb9f 3d326420 3f18aae2 3e1545c4 3f9bae28 be1a6836 3f3c7588 -> 3f1bf726 bdb768d8 3ebb6128", + "3e14dd88 3d33ecf8 3eaa6dc6 3f8f322f 3edc97f2 3d43b3e8 3f7546f4 -> 3de2a9d0 3e95ce11 3f8f322f", + "3f347248 3f4447c2 3f82632e 3e7e3aa0 be5c1dc4 3f9964a6 bd44cd74 -> 3dc7a930 3f82632e 3d363578", + "be254bbe bdf3beac 3f88a4dd 3f60a570 3f82c2ff 3f6b7f9e 3a8a5800 -> be9f007c 3f8ad6c7 3f826e86", + "bec62e0e 3e79fef4 3f5ac224 3f47bc72 3eed6440 3f505146 3e7b9666 -> 3e19c6d8 3f5ac224 3f7b7b78", + "3e84c48e 3f802acb 3e3acf78 be7132c7 3f2b6434 be18e01e 3ee7144c -> 3f802acb 3d9e2846 3a15ff00", + "3fa290c7 3ee40ad4 3f8e6068 bb9cd460 3f7e56a0 3f381e9d 3f6049c0 -> 3fa56dda 3f38e85c 3f9fa014", + "3e51ed88 3eeb8090 3ef21030 3aebb900 3dddfeb8 3e258978 3f2377a1 -> 3ec3a581 3ecd006f 3dc96d68", + "be910516 3f476128 3f04ac01 bd629af0 3e379954 3ef860b8 3e18eb3c -> 3f6afae7 3ee38e14 be0e3c02", + "3f9dd4b7 3f3a74be 3db53f60 3f9bccec 3ef7d3f0 3eecc2b4 3dac6004 -> 3faa621c 3fb4e42a bcb9e580", + "3f97f6c8 3f16127e 3e6f6d68 3ebb28b6 3f8c80aa 3f402904 3e34a286 -> 3f16127e 3edd430e 3d31cd48", + "3f3f5900 3f9a4475 3f21df18 be634286 bd49efec 3ebff6d8 3f4e5230 -> 3e7f4040 3f142a02 3f584432", + "3f9b2a4d 3e06e834 3f074696 3dd79248 3ecdddd0 3f5b6df8 3e20ae76 -> 3e8b8891 3f074696 3dc2697f", + "be503db4 3f6a07de 3f88ee7e 3e75f77c 3f1d979c 3d54f578 be6397a0 -> 3f61ee2d 3fa26d1c 3ebc3571", + "3f8fb5c8 3f4618e4 3ce58fe0 3e84d950 3bdea100 3f0abdbf 3f036a5e -> bdac33c0 3f5d87bc 3f4a83b8", + "3faa73dc bc34d0a0 3f62e182 3e857d0a 3f29395c 3e593c00 3ef436b0 -> 3f97885f 3dadb5a8 3f43deb9", + "3f6e75a6 3f916674 bdaac86e bcaf5590 be0f2c3e 3f17e89e be700183 -> be2f9958 3f86b4d8 bed6bbda", + "3e97472c 3f4f6156 3f5ca790 be2c13be 3f5af364 3f96b031 3f4afdbc -> 3f4178b2 3f5ca790 3d59a8e0", + "3f880716 3ed3fcba bdff4c24 3e6da6d8 3ee5b356 3e183a26 3f77f214 -> 3e361d66 3d9a52fe 3ed9d477", + "3d9a0058 3eb56534 3f44c2b6 3f98d1e0 3f8a9ed6 3d2e7d30 3f9488d5 -> 3ed2a722 3f36cf07 3f98d1e0", + "be9e872b 3f646514 3f8c19e2 3f7db58c 3eca3df0 3f6e1046 3ecc3862 -> 3f832149 3f8c19e2 3f9386a2", + "3f9a274e 3f67360c 3c3e2300 3f0162ab 3f3566ba be73961d 3ebdabf8 -> 3f67360c bebc2b08 3eee4682", + "3fb9cfb3 3ed509e0 3e35c65e 3ecd93c0 3f1d5d5c 3f786ca0 bd45cd68 -> 3e475c6e 3f061aa8 be587a68", + "3f6ee880 3f42cb08 be62acc8 bd1a04f8 be3efe24 3f422944 3ec8d06a -> bdfd9990 3f320119 3ebabb38", + "3f0acdbc 3ecbc876 3d0e1948 3cdee890 3e9a0196 be144828 3e50b580 -> 3ecbc876 bdb43e32 3e227e69", + "3fb1fd81 3f8239e6 3dba2c24 3e5751ac bb2fe300 3e138630 3f9267d6 -> becd236c 3e121d45 3faa9304", + "3f590b18 3f8e8ef8 3f7a070a 3f7d72f2 3e0bd042 3eb23830 3e5ee1ec -> 3f0a34c3 3f8be37c 3f3db906", + "3fb573c7 3eaea23e 3f0ad9df 3e5f813c 3ea4f664 3f756e80 3ea2bde0 -> 3ded7d90 3f0ad9df 3e27b378", + "bea66530 3f886f7b 3f4755dc 3ea9bd02 bda0c7ec be79300f 3e7c82a0 -> 3fc2e463 3fafd0cc 3dbe299a", + "3e31b454 3f9d0b7b 3e69ad9c 3e2197b8 3f941642 bdaabb26 be5112d3 -> 3f9d0b7b 3e316a56 3dbe2539", + "3f32c186 be274fb4 bd70a8ac 3ebc1a80 3f138b14 3d6d37e0 be3e67c5 -> 3e543570 3c03e4b0 3ce61b10", + "3f83c8ba 3d54dc30 3e63b2fc 3f6d4c66 3e2434aa bd9a8232 3f17eca4 -> 3e833ec0 be02f75c 3f6d4c66", + "bed9225f 3f3e07b6 3f878b7a 3f9d42cd 3e15fdd8 3f916739 3f84b11a -> 3f7d6bb3 3f7caba4 3fa31761", + "3fb7b88e 3f0fefa9 3f907af5 be325b96 3e0cb640 3f25af04 3e82ed04 -> 3dcb36b4 3f907af5 3f374832", + "3facaf51 3eff3746 3f150d04 3e6b1e38 3e39cdf4 3e2ff4c0 3e94390a -> 3ea2f92c 3e86a420 3f349088", + "3e30c598 3eb3c8d4 3f8ce988 3f7ef01c 3f269b02 3e81f1c2 3e6fb3e0 -> 3ef60cf0 3f7c256d 3f646d6a", + "3f5a16ee 3e9cd23a 3f27921a 3f816cec 3f8a8221 3f673404 3e4afacc -> 3f682146 3f50dd23 3e9d74ba", + "3e15a6b4 3ed6a8e4 3e378156 3f42ad0c 3cfb4540 3c1645e0 3f327c50 -> 3eb9cab7 3e1e2f26 3f42ad0c", + "3f08508e 3d7ff8c0 3e95484a 3e417614 3f29247a 3f4eef8c 3f81530f -> 3e05e1d0 3e8563b8 3e796d3a", + "3f67982a 3f63dfbc 3ee509b0 3f9d4cd7 3f805945 3d5d01e0 3f4d6e10 -> 3f992a89 3dd1dc08 3f80e117", + "3cb08ca0 3f9aa1f2 bc8d5070 3f3ee473 3f21d590 3f0d753c 3e400e88 -> 3f9aa1f2 3bc0a470 3f3cc17e", + "be2287c0 3e658f3c 3d847a18 3e9c529a 3f7e7afe be4520c4 3f26f7b7 -> 3e585f3f 3dacb942 3ea4dae9", + "bec9ecd2 3e1cb2b8 3f381a80 bdcb3568 bdb2df3e 3f57a034 3f7ae8a2 -> 3e7460de 3f42504c bed80d95", + "bdebcc18 3f0f2eea 3f0e9298 3f9ebb44 3f320954 3ef28db4 3f9aef8a -> 3f0aab11 3f10aeb5 3f9ebb44", + "3f38b72c bd2f2bd8 3f842016 be2eb91e 3f1963e6 3f2550a4 be20502a -> 3f2dddd6 3f842016 be698d61", + "3ee58178 bd5b5278 be70dd9a 3f260499 3f34e3db 3e84f15c 3e896bbc -> 3e85b5bf bcbc17a0 3eefbc0d", + "3fa467d3 bcbd63c0 3f911a1c 3f6aa97c 3f4037be 3ddd7330 3f396aef -> 3fbb369d bde6e2a0 3f926847", + "3ef732ce 3f7a6a58 3f8a002d 3f570e72 3eec5fd0 3f8942b7 be170647 -> 3f3ae1cc 3f8a002d 3eb9cbb1", + "3ebae29c 3f2d02e5 3f416dec 3f97e61e be2f4678 3e689238 3f16fd2b -> 3e9b5ba7 3f2586e1 3f97e61e", + "be1387be 3e909e30 3e675e54 3e145c62 3ed2ce58 3f0f0bc2 3f1e36a4 -> 3e979298 3e6306b9 3e00108e", + "be65f638 3f3451e8 3f0094b9 3ee9807a 3eaa4f0e 3eec6588 3e4d2482 -> 3f3fa40c 3ee9ec73 3efacc82", + "3e8d9ac2 3f2c5e60 3d966860 3f98e8cc 3decc3a0 3e71d096 bd914d62 -> 3f261a7d 3ec45d1b 3f43d396", + "3e0e0f90 3f9a1fe8 3e750d1c bde66010 3f52cb34 3f9ed6c3 be4011b6 -> 3f92ee3c 3ebf0e1a bdfa2014", + "3f070a9a 3e84b55c 3f36385e 3f20b57a be5eaf80 3f6db8b4 3f524530 -> 3d0d7658 3f36385e 3f20f4d5", + "3f8bd931 3f285ca4 3f059262 3db68490 3f4ca2a4 be132ed7 3e8fa270 -> 3f285ca4 be35c260 3e79c734", + "be0a2852 3ea6d744 3e0938d4 bdf7bcfa 3eb8a556 3f66f54e be3c1438 -> 3eb45a52 3ddd6e76 be036a7e", + "befe4946 3edd41c0 3f9efd53 3f7695ee 3f9ed834 3ed24dae 3f84d9d0 -> 3cf4b540 3fd3d0fd 3f6cf89f", + "3e8ad36c 3f9e4a27 3bf18d80 3f569bf6 3f115e3a 3f0e3b11 3f2f99e2 -> 3f96e679 3e8dcdb2 3f724201", + "3dbfa268 3f852e2e 3f8a0562 3e99a6d0 3f487a10 3f2103f0 3f23543e -> 3f85a222 3f877a99 3eb55c79", + "bef550b4 3f4d3aaa 3f5b0104 3f10f5d0 3e04ff6c 3f66051c bd375858 -> 3f90324e 3f5b0104 3f5ba484", + "3f2bc594 be142bb6 be77518c 3e59e22a 3db5c1d0 3f9f8050 3f04a36d -> bd195a82 3d81a610 3e04796e", + "3fa27bde 3f383db7 3f6a1f8c be557125 3e8923b8 3f8448c8 3ebb6d02 -> 3ddb2068 3f6a1f8c 3eef4ab0", + "3f3a6072 3e875e90 3f00349c bc9772e8 3f0cf939 3f583756 3f8a109b -> 3e841ec7 3ed7e824 3eb81a06", + "3f0c145c 3e9c86e4 3f5434fa 3f53d89a 3cbe2bc0 3edb4d64 3f9e5164 -> 3e167902 3f084d32 3f540b26", + "3f80eecf 3e0be688 3e168074 3f5c708e 3f4321bc 3f552928 3f733b1a -> 3f31e1ab 3f425226 3f5c708e", + "3fabbf7d ba910400 3ec046d8 3e6a9806 3f0f3a71 bda84c5c 3ebc7ad8 -> 3f0117ed be4f3890 3e81a97d", + "bd940e74 bdb0a642 3e845f62 3e87d068 3f587260 3cb3b7c0 3eb072ce -> bde4b198 3e8daffe 3e8da169", + "3e5d9208 3dd66340 3eab62d0 3f5446a2 be48c8e9 3e01a50e be20ec5a -> be488b3a 3ee22a54 3edaa966", + "3f66422c 3e37da90 3f229ff0 be3ce490 3f1159ee 3f0800a4 bd5ac68c -> 3f16e4e6 3f19377c bd941187", + "3e8e0ae2 3f047f6e 3e38cca4 3f417020 bd497980 3f2a7b68 3f4a291a -> 3eb8cb18 3e9d46da 3f417020", + "be158120 bdff7680 3f804f34 3f9edf64 3f2d40e2 3eebc794 3e5bc280 -> bea5f8d5 3f834263 3faeb66f", + "3cb95ee0 3ea40a90 3e9fe0cc 3edafdfa 3e2023d4 3f246962 3eafb5a8 -> 3ea18935 3ea1373c 3ed8af45", + "beea3210 3f87f75b be5f5852 3f3553f5 3ee97fc8 3f5b7630 3da76cd0 -> 3fa512d7 bf4dc312 3f7c6880", + "3fa12b3c 3f7d837c 3e277c94 3f9ef042 3f22f5d0 3e2fa756 3f7cda90 -> 3f4042bf 3e6aa55a 3f9ef042", + "3f31e50c be300dde 3f427814 3f2509f8 3f1b2258 3f4e104c 3cb27300 -> 3eb09e09 3f427814 3e580a88", + "be46c42a 3f151300 3f5687da 3ec119c8 3f6a8578 3f60d448 3ed0b2d0 -> 3f085e5e 3f58406a 3ec186b1", + "3fa7f63d 3d957c54 3f2347de 3e2543e4 3f91cba2 3f5a78c4 3e9a2db8 -> 3f506c72 3edb1b81 3e2efb19", + "3f46164c 3e1824f4 be4f8f54 3f3ea885 3f87829b 3eea7700 3e48dbc0 -> 3f1c21ba 3e504d66 3e8cee0d", + "3c59e700 3f16bf42 3f9fef22 be56d3ba 3d1f9f58 3ef42c20 3f3eec70 -> 3f14f6ea 3f9f2acd be42f40c", + "3e202ea8 3f4d7852 3f843a82 3f4ce69e 3f8b2c8a 3d9239e4 3f86b901 -> 3f56b27e 3f61ce1e 3f54e4dc", + "3e0f3e74 3e468844 3da6388c 3f4a3a6a 3f9d50f3 3f6c9432 3f9ae7bf -> 3e8df54c 3e1c91a4 3f49cb6d", + "3f391a96 3f469746 3f548f8a 3f3f5e8e 3f117112 3edf8768 3f986d89 -> 3f005292 3ee66cf1 3f4eb128", + "3f894cdd 3f365be8 3f9330ba 3f4c1d20 3dc6a668 3f89ae54 3f8c16c2 -> 3d6bc5c0 3f9079ff 3f96783b", + "3fbee27e 3f56a996 3eac83a4 3f208b84 3e1af8e6 3f696cf8 3f1de89c -> be514ff0 3f8adf88 3f09af3d", + "3f06f44a 3f5ad2da 3f1c6a5b be4b0748 3f083186 3eff49b2 3e66d40a -> 3f5ad2da 3f3612cb 3dc706bc", + "3fb844c8 3f77551a 3f9a370d 3f8a31a8 3f48a750 3e719dc6 3f37b9c4 -> 3fa7a4ef bbf5d600 3f8e874a", + "3fa01aa8 3e2d3aec 3e95d908 3f3888e2 be56b693 3f4e1160 3f101574 -> be8df9ad 3f5406cd 3ee6362a", + "bec25ee4 3f9109c8 be7cda0e 3f3d8447 3e7baa52 3f9aa23f 3e721fe4 -> 3fbce5d0 bf455510 3f6fe8d4", + "3f23f5f8 3f7e8540 bdb288ca 3f53e3ac be736319 3eafcdc4 bdd31a3e -> bdaaa900 3f1afd60 3dd9f418", + "3fb282f3 bcfb5a40 3f32205f be5b01ce 3f980f6e 3f37260f 3f798c20 -> 3f7b84c2 3e9e9f68 3f617288", + "3f94af34 3f98f9ad 3f77b9d0 3f102d7e 3f16f536 3e01cef8 bd8ea1f6 -> 3f98f9ad 3e117944 be828b94", + "3ec8f24a be52aac6 3f940151 3de35ef0 be12919c be48b362 3edc359c -> be8d5180 3efdc8c4 3f057164", + "3f907f86 3f1ba0de 3e9f73cc 3d146f20 3f0a605a 3f9e9685 3eb2dd64 -> 3e625b4a 3f25695c 3e415e28", + "3fbb353c 3f855f9a 3aff4400 3f458014 3f924048 3f121d0d 3f9231c8 -> 3f855f9a 3f42a71d 3f955036", + "be6f2268 3f58cc24 3f2f4957 be173201 be2452bc 3f568956 3dc0ace0 -> 3f8a8f75 3f2597ab be513d1e", + "3fb56acf 3d10fab0 bd9549b8 3f67f55e 3f54d0c0 3d65c378 bd831308 -> 3fa27d3c 3defc5b0 bef43958", + "3f8ccaa0 3bd62300 3eeeef9e 3f93e5d0 3e942774 3f3781ea bd4fadc8 -> 3f032b8c 3f9cb54e be524ad0", + "3f2605be 3e0999e4 3f7ff89a 3ecb7d02 3f39f904 3ec03adc 3f831b7a -> 3f01d3ba 3f16d0f1 3f49c3a3", + "be9774ef 3f373a30 3f8556b5 3f3274a7 3f4e56b2 3d1c8310 3e60c53c -> 3f1e8aa5 3faae988 3f51c30e", + "3dc5b718 3e62e52a 3c0e17a0 be6e3ee0 3e5d2748 3db0298c 3f844f89 -> 3e519133 3c1d89fe be415733", + "3e86d88c 3e098c76 3ec2a326 3f758f9a 3f6ed0d2 3e27444c 3cb3fd50 -> 3eb40225 3ea60634 3f36691a", + "3f616e92 3f4907d4 3f5db474 3f1a6cd4 3f8d4d91 3f715e6c 3f16a53e -> 3f5b3c7b 3f413798 3ef504ca", + "3ee66474 3f6f50bc 3f3474ff 3eb9e49a 3e59afa2 3ea3bd50 3f847608 -> 3f19bfb4 3f048887 3f1ecf70", + "3f17c750 3e0aa57c bd27f488 be6617c3 be6dafe7 3f776c50 3f00a6c6 -> 3d12d038 3d8236d8 bd4bbac0", + "3f9b4ca7 3e54fdc2 3f91adad be34d85d 3ec2f972 3e299848 3d1f31b0 -> 3fab11ea 3eb733fc 3e36e1fb", + "befff70b 3ebd4e0e 3f302ee6 3f859418 bd1b3a58 3f40970a 3ebc4270 -> 3f14b348 3f02b3d8 3fa7b826", + "3fb42193 bd983850 be1fe0b9 3f73bb90 3eb0d38a 3f618c12 3f7c2380 -> 3f0005e0 3fa18d39 3f73bb90", + "3f0c8b6a 3f0dc35f 3f277dfc be7c885a 3f821345 3f9fd980 3f805ddc -> 3f0ac2bf 3f277dfc 3e357af0", + "3fbfd129 3e2f4370 3f6f158c 3f6a3ccc 3ee4c986 3f44f924 3f800ffa -> 3f0a2d16 3f1c56c1 3f718026", + "3e8a165c 3f7a591c 3f07a2ec 3ef23cd2 3f06f85b 3e996444 3eecc49e -> 3f7a591c 3f096c23 3f13acc6", + "3e81c48a be6ee79b 3f11ca1b 39fc7000 3f51479e 3ed595b0 3f23a320 -> bcf46808 3eff6369 3de7df4c", + "be61a87a be0a1c68 3d95f400 3f2c2a42 be287f08 3f448348 3e7e29b0 -> be0803f9 bd710ab4 3f45d662", + "3f84fd61 3e6f7574 be385002 3f1d562f 3e2acc42 3e926ec4 be7ed988 -> 3eba00b4 3f25442c bf146251", + "be70df16 3f808cad bdf8a4d8 3f43e798 3f9dcef2 3f1e0146 3f1a69fa -> 3f808cad be8955a6 3f546615", + "3dc6a920 3f1064e5 3e6a7498 3f88b8b5 3ea9b3e0 3e8b8260 bce824a0 -> 3f1ce983 3e957793 3f74a693", + "3f0ca708 be29307f 3f805f2e bd521158 3f14e828 3de8c4cc 3f8504ab -> 3e6f9679 3f031c3a 3f072532", + "bdbc55c4 3f1c570b bbf6ba80 3eb9090c be7e288c 3f009586 3f2c4c51 -> 3f3004e1 bd4d593b 3ead4c0d", + "3efbf4a4 3eeb6dda 3f8de41d 3de22a50 be721500 3eec3162 3dee9c40 -> bd3c7510 3f8de41d 3e46836a", + "be19bc08 3ee1bd6c 3ef86fee 3f55a9ba 3f8664c9 be5b1b6e 3f818847 -> 3ec379bd 3f1567a6 3f56d2c5", + "3f117000 3f8c10ad 3f5ab8d8 3f41064e 3e7b085e 3cd97220 3deff660 -> 3f8c10ad 3edf6386 3f1f6dae", + "3d037520 3d896d20 3ed4ee8c 3f55cae8 bd9f09b8 bd1bfb70 3f923f1b -> 3d8148ee 3ecda3fd 3f55cae8", + "3ccb0d40 3f916c6d 3e1d8c48 3f9d9404 be0a5104 3f970ed4 3f74241e -> 3f8d5f37 3e38e3b7 3f9cd424", + "beb8dabe 3ebda9d8 3f352c20 3ea2be60 3f87d440 3f8d75aa 3e8ca110 -> 3e84866a 3f352c20 3ebcfcd8", + "3f311c38 3e890cca 3eba6a62 3f481e96 3d9efba8 be641ce4 3f4143f6 -> 3e0d69b7 bd421568 3f481e96", + "3f5af242 3ec6b368 3f5b7e36 3f41b3c4 3e6727d8 3e9c9b0a 3dc29204 -> 3f18ec63 3f5b7e36 3eacb06d", + "3cc18c20 3ee2a1ea 3f067a62 3f8badfc 3e7f61a0 3e655548 3f8f3538 -> 3ee03874 3f049f3e 3f8badfc", + "3f12b27a 3da6a728 3f5a81b0 3f6f5dd4 be139214 be444e40 3ee4cc0e -> be0d5cb5 3e09cdf0 3f6f5dd4", + "3eee2124 bdd39a44 3e3e9c78 3ede3332 3e2f80f8 3f8bd722 3f415454 -> bcc158dc 3e9a52e1 3ebe4add", + "3f9dc4d5 be4af7ae be494ebb 3f8c1faa bd85c3f0 3e0ce904 3f208c9e -> bdc163f4 3eaefe8c 3f8c1faa", + "3efea866 3f0be4da 3e65d10c 3f63a1c8 3f1fd025 3f1bd1de 3f7624b0 -> 3f0fd2cb 3ec919e4 3f63a1c8", + "3fb3ad50 bd8a7214 3ef40672 3f0fd016 3f219600 3ecfcc30 be24c2c7 -> 3f50dc54 3ea11687 bedb0ad6", + "be80d156 3f42b380 3f8c6061 bce780c0 3f9c062c 3d6ddee0 3d2e9438 -> 3f2d0d01 3fae031b bd386486", + "3e1eefec 3ed7ae30 3d94d160 be485921 3eed3e82 3f16fdee 3eafc412 -> 3ed080f6 3e01cfec be02486b", + "3eb57d00 3ef19c22 3f9f8e52 3d848730 be2793ba 3e777740 be45e529 -> 3bb13cc0 3f9f8e52 be9f86a7", + "3f61400e 3ec21ade be510fd6 3ef696ac 3ee63526 3f3c4156 3f0bc876 -> 3e9bf9b6 3ecc69d3 3ebeb91b", + "3fb9e751 3f75a3e6 3f8fa4c2 3f4a4a3e 3edf9058 3f2a8505 3f5cf5c0 -> 3ec7ec66 3f4009e1 3fa2de66", + "3e62f874 bd314720 3f5f7b5a bd0c4d50 be2e8eb6 3eab46b8 3bd91500 -> be0776c0 3f5f7b5a bcbb0444", + "beaa85f9 bdc92f4c 3f55b812 bdb678dc be6cb040 3ebc854e 3f097518 -> bc387b70 3f6c167c becb2bc4", + "3f47da3a 3ef5cd2c 3e7cfcc0 3f0b7aef bdafbdba be5edd9e 3ecd82ec -> 3c6b4de0 be34ae2a 3f0b7aef", + "3c0cb000 3f86825c 3f3d78a4 3f04f1c4 3f129c98 3f3f20cd 3e8de404 -> 3f863d7e 3f3e2781 3f04a908", + "3f484444 3e4d42a4 3e873ef4 be64a3ac 3f963c74 3f3aec4a be19fed6 -> 3e80252b 3e3e86bb bd99c72a", + "3e3f62bc 3dfd0a48 be1aa914 be790505 3f941d3b 3f866a46 3f28e248 -> 3dfd0a48 bdd096f8 be3cff1f", + "3e0bbc84 3e580fe6 3ea434e4 3edc8d44 3deff580 be76b289 3e81ee9c -> 3e565e91 3e62742c 3edc8d44", + "3e0e9c58 3f200a54 bb9858e0 3e8b7fc6 3f223c6c 3e58d12a bdb8bbd4 -> 3f200a54 3ccd839b 3e6373f5", + "3d2891c0 bdefea50 3f324968 3f01bfbc 3f56828c 3f7ac028 3ed3b520 -> bdb3d3a2 3f324968 3eff0364", + "3f8d0649 3ea4312e bded3184 be1e93e4 3f63565e 3edfe99c 3e4804a4 -> 3ea4312e 3e3e3dea 3dbf6eba", + "bcc9c890 3e17a5d4 3f09bc31 3be6ea00 bc917e58 3f7ddf2e 3f93b95c -> 3e1b978b 3f0a366a bbc5a896", + "3f1eabaa 3e2d78c8 be25537a 3e52779c 3f3ccd70 be681530 3e6dd78a -> 3e4466de bdcde352 3df233cc", + "3f6f0872 3c9a0580 3f411732 3e9478fa 3e896ffe 3f984be2 be101148 -> 3e23fa90 3f411732 bd8330a0", + "be375cf0 3ece18a8 3efffe06 3d8dbf3c be37ae72 bb784880 3f06a9ea -> 3f0150ee 3f1714b6 bc01d3f8", + "3fad4797 3e3f0288 3eabd736 3ef550a4 3f125e90 be44276d be021ff2 -> 3f1527ab beac0cf4 bea096c4", + "3e0b59fc 3f35131e 3c7c83c0 3ecd90bc 3ef0aa36 3bbae700 3f50e616 -> 3f2aa0a0 3c652cb2 3ee2dfca", + "3f8f1858 3f1b9e46 3d521d50 be192b8a 3f74c574 bd8cda96 bdfde73c -> 3f1b9e46 bd610070 bd90558c", + "bdc7a638 3ec2853c 3f4e1e8a 3ebd3cbe 3efeba10 3db02bd8 be09651a -> 3ead4bd3 3f5ebd16 3eda85ed", + "3f94936b be590b4a 3f980af6 bdb502b4 3f3ed777 3ec1919a 3f33155d -> 3fb4d840 3f021fc1 3fa76db2", + "3fbd13b5 3f40bf86 3f79f594 bdac8902 3f9b8248 3ddfeef8 3eb24aec -> 3f8aa113 beac14d0 3ee83ed2", + "3f14fc14 3efa4a46 3f91ba0f 3f863172 3f6f21f8 3e962b30 3e8df41e -> 3f5dee8f 3f2f17f2 3f228988", + "3f9cf40a 3e4b74b8 bcffa6c0 3dea7778 be3d73d8 3ecccda4 3f56a2f8 -> bdca2520 3dfc8130 3e5ef592", + "3f9efeae 3f47cd12 be0fd834 be33f9e2 3f78f0aa be78bad8 3ef6877c -> 3f47cd12 be552424 3f05c8d8", + "3f39c7ea 3d9ee114 3e75a2d4 3f797da4 3f60ad00 be08bd1f 3f7b06f4 -> 3f277f92 bcf9fd00 3f797da4", + "3fa73f2a 3ea65882 3f97a31f 3f7dc0e4 3f893367 3f471da2 3f3d8b5c -> 3fb96164 3f428de4 3f43ea83", + "3fad68fc 3f6aaa6c 3f123b7c 3f503b12 3f8577f2 3f56acac 3f99b78a -> 3f40c9ba 3f2a1dcf 3f740b40", + "3f73d554 3f781324 3f86085d 3f2e346d 3f9d30fe 3f8e3933 bd9703a4 -> 3f858ec1 3f73c0c2 bce1a580", + "3fbb4c4e 3f5deba0 be224a9f bbf60d00 3dd164a8 3f8ef0dc 3f92338f -> be937b18 3fa8242f 3fa2cf40", + "3d461560 3f260b6a be346b03 be462c2a 3e35137e 3f0bf31c 3f9847a7 -> 3f1f354c be1ceef6 be1c7812", + "3faa75f3 3d0bc8c0 3ebf1c16 bbe1e240 3f5f4930 be1ba194 3f953045 -> 3eb8a8b6 be412a68 3effad21", + "3fa8c1c4 3f09ce78 3e858cec 3f970063 3e2c927c 3f07d4ac 3f8a3af8 -> 3d920c9c 3f2e5d44 3f970063", + "3e9f6d54 3ee2aff4 3d349370 3f664b08 3baf2900 3f4de768 3f90f626 -> 3e9cc734 3e6acc4e 3f664b08", + "3f4700d4 3f8bec73 3f3fad00 3f383a39 3f693bea 3f59243e 3f3ad47a -> 3f8bec73 3f7534ed 3f5746be", + "be120548 3efeac78 3f41c61c 3f1dab04 3d2b98f8 be7480f3 3f772f12 -> 3f104bc5 3f643d1e 3f1884f7", + "3f3f1e1e 3ed90560 3edff064 3dd8c650 3f81ad66 3c2fc080 be10c0c5 -> 3ede2f88 3dea1b6c bc997930", + "bd7d91d0 3f54a6e4 3d8098fc 3f9783fb 3eac1a18 be403b49 3f86c000 -> 3f5bd399 3da3521c 3f9783fb", + "be66edb4 3f83ce04 3e20a7bc bda0cb94 3f7e0bb4 be4573ef 3e29c138 -> 3f83ce04 3e731738 be0a4093", + "3db426f0 3f5fe10c 3f060202 3f9b06a3 3e7fcd74 3e3e3040 3f5883a4 -> 3f543dc4 3f003590 3f9b06a3", + "bee414b9 3f41005a 3ea0ab86 bdfca780 3f04f4e8 be0ae487 3f6c7268 -> 3f66a1e0 3f00bf75 bf03a082", + "bef31c8c 3f5b5104 3f0b323c 3e780e1c 3f0b2866 3f830e3e 3ec246ea -> 3f861545 3eca4e51 3e53770a", + "be199ff0 3edf33be 3f493244 3ea65dbc 3f493310 3f6d547a be4051b0 -> 3ecd8273 3f493244 3ecb8e11", + "3f4a4d9a 3eb3385c 3ee388ec 3e995bb8 3f9a1e5f 3f0cbec5 3e79cbc4 -> 3ed96693 3e81d446 3e093185", + "3f662cda 3f94fb18 3e142e12 3f03676e 3f899978 3e869858 3d1a4ef8 -> 3f94fb18 3e8a8051 3db527c8", + "becb993c 3f7fbd5e 3f874e73 3f888c12 3f995528 bdf79342 bd810ee8 -> 3f78d6af 3fc2974c 3fc1b3b6", + "be89e2a2 3f5cf7b2 3f6de306 3e4b8d34 3d086888 3f84a66d bd9272e4 -> 3f8b3560 3f6de306 3e8a069e", + "3dada1e0 3f7ccfc0 3f22de68 3f36c04c 3f023796 3f489810 3ea57c0e -> 3f754aab 3f2a7e87 3f30192f", + "3d1dae40 3f8f48a6 3f53bd34 3f10b82a 3f10881a 3edbfef0 3e60cea0 -> 3f8f48a6 3f53fbdb 3f0f7020", + "3f8b91e3 3e189ae0 3f7a9c18 3f37f575 3f02d051 3dbbf42c bd83a438 -> 3f86e82a 3dd36788 be4c01f0", + "3f3fd0ae 3f7a955e 3f0216ba 3f5688c2 3f4c46e2 3f9006b9 3f0b6f31 -> 3f43fa32 3f5c5f6f 3f10ac78", + "3f50db50 3f43e170 be18d5c2 3f6bb636 3f4371ec 3d860a68 3eb8b4ec -> 3f646070 3d173184 3f0646ce", + "be87997c 3f422d1c 3f865392 3ea1f6b6 3f3ab41c 3f76e6e8 3f6c425e -> 3f3fcc9a 3f865392 3e0961c5", + "3fab72b6 bca409b0 3e80bff4 3ec4446c 3f330e1f 3f77aa7c 3e6bc0bc -> 3ec18a4c 3edb2f6e bc01eb20", + "3ee7829c 3f99a377 3f3aedd8 3f45b638 3f31ce54 3f9f1315 3f406aaa -> 3f75fca6 3f7158bd 3f405825", + "befa0efe bdf9c298 3f901bc6 3f75f0b6 3f688a9e 3f83a76b 3f2abfaf -> bf2ac8b1 3f901bc6 3f896322", + "bce2b0a0 3f39f2a4 3f6501f4 3f868b18 3de9f15c 3f8dec99 3f443464 -> 3f3e5386 3f63e608 3f87b163", + "3f2ff77a 3f96fa7b 3e1be868 3f840e1a 3ec12f38 3e869236 3f4eb072 -> 3f3f65ed 3e9f819a 3f910ffb", + "3f54f23a 3bdb6080 3e519a2c be1b1cf6 bdbce84e 3d83f810 3cba7020 -> be786c53 3e519a2c 3d0df770", + "3f6b78ac 3ebdb970 bdd00008 be3971a2 3d94d918 3f5befcc bda89f7c -> 3d6fd0f8 3eaa572b bd414738", + "3f2c8740 3f9637cb 3f1b0aa7 3f8914bf 3f97cc0a 3bc15780 3f467c36 -> 3f9637cb 3e4e3de8 3f5dc4dd", + "3f013c12 3f1b5e06 3f150c08 3eab9fe8 3f8de8a5 3f36bbcb 3f896bb0 -> 3f1b5e06 3ef89b2c 3eece3ae", + "bef1d014 3ea7e77c 3f7d9a04 3d89b5b8 3f3add0f 3f98dd1d 3e85096a -> 3e499498 3f7d9a04 bb374e40", + "3faa0b48 3f2bd100 3f5cb7f2 3f4027a8 3f36cfd4 3ec9d85c 3f0a155a -> 3f6cc809 3eb2bf58 3f1e5c03", + "bcd1ade0 3f3f01f4 3f7b7298 be5573dd b9b4d000 3f194853 be75af52 -> 3f43e67a 3f7b7298 be5099b0", + "befbf1af 3f4bef74 3f9af95c 3ee1ff14 3be33600 be5f2f10 bb9bb160 -> 3f17c4d0 41a44480 3f888e9e", + "3f3320f8 3f5f5a84 3f4368d0 3d491ad0 3f19c338 3e4bf088 3f4b4888 -> 3f39481e 3ec3bfd3 3f200f41", + "bee2e812 3e2197f0 3f803670 3f17be14 3f6a3592 3f68675c 3f425484 -> be5d5be6 3f80a693 3ef9661c", + "3e2df87c 3f7e52b4 3d900eb0 3e6320fc 3f5c9680 bc664970 3e175c86 -> 3f7e52b4 3d63e39e 3e5a3070", + "3fa83d62 3f599970 3e9659d6 3f5be7e4 be0a3223 3f88219a be70cd97 -> bed22b9c 3f84b3dd bf050aea", + "3f6005ba 3f83d3a7 3f60372e 3ef22d48 3f94c2ff 3c6f0620 3e62e0c8 -> 3f83d3a7 3df73a68 3e6c703c", + "3f9da453 be1ac372 3ee72bf8 be0bcd90 bd60ff38 3f7eccd2 3d816798 -> 3b8d4040 3ee72bf8 3d890bfe", + "3e919fec 3f9d82dc 3ee5c9ec 3eab67aa 3f70e0f8 3e807f50 3f40e6c8 -> 3f9d82dc 3ed43a88 3f05148d", + "3f9e6880 3f63f0e0 bcf916b8 3eca5fd8 3f85e6b1 3f8c78be 3f49fca8 -> 3f56bf07 3f8df869 3f32c625", + "bef0a7c9 3e60ef90 3ee15392 3ef89f80 3ec571dc 3f477bf0 3e85c95c -> 3e56ff2c 3ed66058 3f2325f2", + "3eaca728 bdfe526a be056242 3f8057ca 3f24ab42 3e9338a4 3ee85036 -> 3e82f9a6 3d84bc48 3f672f7d", + "3f8357b6 3f5e6bdc 3ddddd1c 3f2aa674 3e766820 be295746 3f05c01a -> 3ec69d98 be91edca 3f5fc5f6", + "3f7e1a4c 3f8c23fa 3e8c681e 3e3249fc 3f10038c 3e85cba6 3f7a678c -> 3f221442 3e95b094 3f8b4460", + "bea0c434 3f27ffe2 be30651f be091d90 3e2b2a70 3f2ebb8b 3f835ab4 -> 3f542890 beba1027 bec3965c", + "3f80b780 be744f37 3f20bcdc 3f4f371e bd0af1d0 3f86a422 3f9aeea5 -> bcafeda0 3f342f66 3f4f371e", + "3fa73558 3ea87b0c 3f150441 3d435b60 3f9b51ab 3d4bead0 bdbb3686 -> 3f28dbcd be16a34c bd933d01", + "bef147f0 3f8e3dd3 3f7a8978 3f0e335a 3f81a3a6 3c879190 3e1cb570 -> 3f8e3dd3 3fb734cc 3f3cf4b3", + "3eaa8a7c bdac522c 3d7bd420 3f895ab2 3e892c38 3f087d23 3e74210a -> 3dfceb5a 3ecbff62 3f601f5c", + "3eeb3a2a be54fd23 3f62f6f8 3e678298 3f5ae0c8 3f2d72b2 be703ebd -> 3e96fae6 3f4d525f 3c2b1cf0", + "3f79ff8a 3f3afec8 3f8db7aa 3cc924c0 3d061ea0 3f0fe2d1 3f81e1da -> 3d550df0 3f1ff624 3f8a77f8", + "3f05633e 3f712fce bdfd19bc 3f196035 bd1d8da0 3f51ce5c be073a66 -> 3edb3d10 3edd085d 3e54d764", + "3f64b050 3dcaea08 3f0f8542 3ecf069e 3ed4fdfc 3f1f880c 3e823ea2 -> 3eb095d6 3f0f8542 3e7d8497", + "3fa5a450 3ea1ff34 3f7c81bc 3f72bac8 3e899642 3f38d507 3ec5346a -> 3ec3996b 3f7c81bc 3ecddfd4", + "3e5d4450 3f720d4a 3f892a88 3dde1478 3f1f4bfa bddab90c 3e281578 -> 3f7906ef 3f4ce15e 3e15981e", + "3bfdea80 3f8f8d11 3e8fd468 3f3ae564 3f3459bc 3ec6d350 3f8df4c0 -> 3f8f2532 3e9045ef 3f3bac2c", + "3e06ca44 bd84fc36 3e6554b4 3d66ef60 3f76aec6 3df6b6dc 3f6cb194 -> bcdc6cb0 3e4aeaee 3d9e32a0", + "3f8b97a4 3d9b8da8 3f892eab 3e418724 be485560 3f42d100 3f818498 -> be6e72fc 3f482f45 3f936a56", + "3d5543c0 be044998 3ea71cbe 3f81cb64 3f8b86e5 3ec252fe bcae4bf8 -> bd8eac14 3ea7d2c8 3f75cf2c", + "3fbf6c58 3d607b80 3e76769a 3f16db2c 3f2d257e 3f742c0a 3ed40eb8 -> 3f19072c 3f4312fc 3db9bddc", + "3e0c10a4 3cf361d0 3f6c9dea 3f762544 bc786740 3eca6ba2 3f1f308a -> 3cb7d2c2 3f61a85d 3f762544", + "3c0a6040 3f032c8e 3f244bd0 3f0e1c5a 3eb3fc58 3f35e8a0 3f181959 -> 3f02c0ad 3f244bd0 3f0e121b", + "3f28cf72 3f9ffbdc 3f95b063 3f116151 3ec3afbc 3ecdf85c 3f9bbed9 -> 3f2f404d 3f2bb8b7 3f8240bf", + "3f957305 3f9a2deb 3f774e9c 3f5d4bf2 be76ff5c 3f615be0 3e688da6 -> bf16529e 3f9f4b6f 3e5f3118", + "3fab9080 3f9ddbc3 3f3793ca 3d189490 3ed555a6 3e855470 3eee40b0 -> 3f87babb 3f2e5520 3fd1f65a", + "bee06e44 bdd204a0 3ef4790c 3f88e622 3decd978 3e0f6298 be5e7fce -> bf08e257 3e5f33fc 40110358", + "3f250164 3f6f428e 3e55e9b8 3efa1f3e 3f6b40de 3f227448 3ec10ddc -> 3f6f428e 3efb012d 3ed77540", + "bdbf555c 3ea479c0 be6a1894 3d34d9f0 3e9a5fb6 3ee51354 3ef42d2c -> 3eaa207b be8e661f 3c95a33e", + "bd880848 3f9aa7a8 be1c9ab6 bcc438c0 3f43d9f0 3e143488 3e808cc0 -> 3f9aa7a8 be368d9e bd5481f2" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_soft(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f09f160 3f965c04 3e892624 3f97a9ac 3e4cf9a8 bdf837fe 3f12c4ef -> 3f9ed8a4 3e0bdb54 3f95728f", + "3fa6d033 3ee24880 3f3f950d 3c8795f0 3c48e200 3f978ed3 3e11adf2 -> 3e03819c 3f8ac468 3ab4154c", + "be0f792e 3f01d42e 3e00f148 3db7fa54 bb8c3420 3f8cce3e 3f5348c0 -> 3f0adeed 3ddbfbaa 3da8b65e", + "3f374e32 3f3219ee 3f9f1dd5 be0a1422 3f881047 3f9e84e1 3f78976c -> 3f5dcbc6 3f6c6c8c be73c928", + "be7daa14 3ec2c666 3f57ee0c 3f19c13d 3f9f65c2 3f4819ac be2ecff2 -> 3e9636fc 3f5336ba 3f2e2930", + "3f970704 3f9873ae 3f0dbc46 3ef004ea 3f017b47 3f86e100 3e4f5eca -> 3f980ddc 3f606710 3e9682d5", + "3fab65c1 3e8bc99c be63bc40 3d20c538 3f036c04 3dad58d4 be476838 -> 3e8f6ce7 3da3db32 bcfd38e6", + "3ede9db0 3f789d00 3f916f78 3f04f25a 3e96e14c 3f2cfd9f 3f8efd31 -> 3f775520 3f8e686a 3f273d54", + "3e0df5d8 3e8caed0 3f88ec30 3ec63bb8 bde08608 3f5a2d82 3f69c830 -> 3e76dfd8 3f87fd8b 3ed426c5", + "bed5fd34 3f93d381 3f2a7b72 3c8b0080 3e1c0fe6 3d80fbc8 3e851d82 -> 3f8d2c60 3f3f4949 3ca66a6a", + "3f169118 3f52800c 3f5efcd6 3f3d6c50 be509610 3ebee21c 3f486206 -> 3f3387fb 3f5aaf8e 3f4dcebc", + "3d8236b0 3f9b955d 3f89b752 3e996914 3f675ea8 3f6a717c 3f3cf4fb -> 3f99dca7 3f8929d4 3e9ca9ec", + "3f365d9a 3f750f1c be2cc470 3f335ade be138fcc bd1ae5ec 3f07ec6e -> 3f6b72a7 bc906675 3f35b90f", + "3f38bff0 3f3be3e6 be2c6d9c 3ebb1812 bd46b828 3f0a0f82 3f88abca -> 3f145056 be37db0e 3f0e314b", + "3ea5fa1e 3eb92afc be692ec2 3de34050 be69d17a 3f4b9732 3f914728 -> 3e8159ff be8ffe96 3e1b36aa", + "be9a5d74 3c788680 3f83c304 3e7e58aa 3d58c900 3dacc2ec be465c1f -> 3c9d40dc 3f82ca90 3ea7280d", + "3e7b98f8 3f9f34de be265ab8 3e724260 3f97de04 bd996652 3ecdf5b4 -> 3f921cfa bddf7240 3e69607c", + "be722b2c 3f15ac8e 3f10fd26 3d3e7ec8 be18c8a2 3f7aa254 3f932e6f -> 3f28c33e 3f02be48 3d06aa60", + "bec3b4ef 3f4a183c 3dff0240 3f8c22ff 3f8ab0c6 3f770a70 3f86fbab -> 3f371c8d 3dafa500 3f91c517", + "3f2371a6 3f86dd2b bd7b3808 3f61d306 be0496da 3f5a66ac 3f02a93f -> 3f8cad4c bdb9b8dd 3f622d7a", + "3f419156 3d548db0 3e4f12ce 3f86c7bf 3f905ca2 3ef306ec 3ddb1a2c -> 3dc9f163 3e48be58 3f8b0603", + "3f51f836 3f9f3da4 bdf82478 3c761d80 3eba7898 3ed4b974 3e2e978e -> 3fa7e60b bdd191a6 3be62c3a", + "3f99f0a0 3ee96e52 be3dff8a 3f95dee5 3f887a6f 3f9e18b9 be41fcc6 -> 3f4b3453 bf1312a5 3fc05617", + "3eef6fa2 3f27a5c2 3ecea058 3e60ac0e 3ebd1bd8 3ae34600 3f749772 -> 3f2093d1 3e95319c 3e95b04c", + "be7c5880 3f930e6a 3f1abd92 3f8870de 3ea4d916 3f9228ce 3f016ae6 -> 3f9122a2 3f0760a4 3f887727", + "3e576910 3de9c394 3e7961be bcdd6d90 3e823dbc 3f4af998 3eb243fc -> 3dd45d45 3e885034 bccee6d3", + "3f64d148 bb8d94a0 3f546d88 3ef04a82 3e995b6c 3f225172 3f53ac4c -> bb353ea5 3f5d17a6 3f1d6623", + "3e980874 be00ce76 3f76153c 3d5e56b0 3f5e353a 3ee650e0 bd09cdc0 -> be207f6d 3f75cc88 3d1bb335", + "3f322ecc 3f863a44 3f15647a 3f022b57 3e64474c 3ecd97a6 3f0ccac0 -> 3f88bf16 3f0cddc1 3f069eac", + "bebf041e 3f063dde 3e4bdae2 be54c0fb 3f060b1f 3f6a3afc 3efd0a78 -> 3f051df4 3e194d34 be55dca9", + "bd3570c8 3f5227ac 3f72a936 3f0fd600 3e44df64 3f365ed1 3f6e2ce8 -> 3f532e59 3f726c4e 3f0d6edd", + "3ec20272 3f52e2a4 3f8002e1 be387f24 3f1e2031 bdf8a6cc 3f57ac3c -> 3f563320 3f80043c be710241", + "3f998af5 3f64a856 3f42fc52 3f343750 3ee25258 3e940f86 3f62c09a -> 3f6142e4 3f2b7b20 3f6596c0", + "3e820a72 3f68f3f6 3f36e93d be5fcbd4 3e10b71a 3f862b9e 3f333e80 -> 3f6521c4 3f457415 be7b868d", + "3f4b894a 3ec2eda0 3edaab00 3f83514c 3f781676 3da9387c 3bc23a80 -> 3f0e7c65 3e878627 3f85fdd5", + "3e736e70 be724fe9 3f3e0f6a 3ed9fac2 3f7cc99e 3e926c7a bc477460 -> be9be12e 3f39142c 3ebb7f4c", + "be4cf5e8 3f555eb8 3ee09640 3f5af1a2 3e8bc158 3f751e84 3d907028 -> 3f58996e 3ec97f68 3f60647e", + "3f810e5b 3f2ffa66 3ead30e0 be2c7830 3ec06674 3f5bc4a4 3f835d66 -> 3f223307 3f000475 bec12a90", + "3fb0cd25 bc8800d0 3f07c8f6 be4bd7b7 3f6a0794 bca23338 3f7019f2 -> bd13195e 3e30e507 bef9c23a", + "3db9d380 3ea56084 3d33da08 3f6609bc 3f85e20c 3f1627c6 3ef15776 -> 3eb07835 3d368d62 3f65eab4", + "3f80d2e0 be6c4c61 3ce73df0 3f345f8d be7cb9e7 3f25de6b 3db99030 -> 3e48e099 3d151367 3f087694", + "becbc758 3cd3c390 3e346da6 3f8f268d be231d1f 3ec260f8 3f8b88b8 -> 3d20033d 3e42ab0e 3f971c15", + "3f8ba846 be250bc2 3f71c0a4 3eafc676 3ef2c4da 3e6b26a4 3ec8e1fc -> be1a3d22 3f69d095 3e94a8e0", + "3f9a72b3 bd1b98b0 3ebfe69e be34f7d6 3d647d68 3e999078 3f841308 -> 3b8c5224 3e85f982 bee32371", + "3e38f7c4 3e1435fe 3f9a73f3 3ef4392a 3df7b5e8 3f59624a be7e9b1e -> 3e02da58 3f966d38 3ed1ad94", + "3f396754 3d75e808 3ec104ce 3ebec368 bd219c88 3f2f88c6 3f8acf3c -> 3c8296fc 3ee15c69 3f120af6", + "3fb8c13e 3dd56c60 bd8a183e 3f52cedc 3f59bdea 3f8c8442 3effded6 -> 3e4b72a4 be443c60 3f52c7e8", + "3e151110 3eb2f9fc 3e9c4d00 3ea4c354 3ddaf0f0 be2f150a 3f8cc822 -> 3ea5a73e 3e871695 3eb8473c", + "3f9f19a2 3f6746a0 3f219d83 3f7289b0 3dc8b178 3e9e17ec 3f50e6ca -> 3f50f431 3f054a33 3f7c8ec6", + "3fabb5be 3e60ce0c 3ec8610a 3f7841fc 3f47ce32 3f8b5c1b 3ccddd50 -> 3eb26b98 3f4482e0 3f6eb126", + "3f9a3f0a 3ea27c76 3f9c40c4 3e86f86a 3f4b40e4 3f0ed285 3f894518 -> 3ef111de 3f9770b4 3f080b4d", + "3fa7bb46 3e44d95a 3e7fccb8 3ee913d8 3ee77f70 3e906d4c be6512fa -> 3e30e7f8 3e1233e3 bc781360", + "3f9d0b01 3f26c166 bdc228a8 be719d83 3f45278c bdc9b85e 3f5c670c -> 3f4d4a06 3d6c0690 befd0d6c", + "3ec03faa 3f7ee4e6 3f2cd804 3f8e6804 3e01f340 3c96f5c0 be31bb00 -> 3f7e95ec 3f188a0d 3f96837a", + "3fac515b 3f4a8c74 3f8d4670 be384121 be76bec9 3e660204 3ee9294a -> 3eec5ad8 3f982392 be1e24a6", + "beea034e 3eab49f2 be446a2d 3f101d3a 3f056838 be63e7ac 3f9986c5 -> 3ea9168e beaf8413 3ecfb026", + "3ee580c4 3e06a950 3e77ff10 3f655678 be64aabe 3f4a2b88 be27ff93 -> 3d6b4c12 3e9467bf 3f571e3e", + "3f6c9828 3e71d668 3f74a95c be756568 3f6fef42 3ed40fbc 3ebe8d5c -> 3ec390b6 3f72f152 be2d8521", + "3f18771e 3e975308 3ecd585a 3ed58828 3e9435ae 3f7ef8f0 3f9c8f70 -> 3e792f70 3f0b00a4 3f205ff2", + "3f338d30 3ecacc9a 3ec53468 3ee2ded4 be45276e 3f12269d 3f81a8df -> 3e27a5e0 3ed14382 3f1ee410", + "bd9ed0cc be1caa27 3ee6f6c8 ba815800 be00f483 3f695984 3f9903cc -> be2e333f 3ededf63 ba66c246", + "3f26f8c2 3e3b6100 bd0866f0 3dcd3bfc 3ef5184c 3f9ec892 3d883f5c -> 3e37201e bd88461b 3d49a0c4", + "3e75cf30 bdd0e3d6 be42dbb8 3d930860 3f87bc52 be2ac828 3eebcada -> be0769e0 bdf138a8 3d90725a", + "bee56172 3f283947 bdd536c4 bc9653d0 3d00d258 3f9cf755 3f87b334 -> 3f40707d bcf00e34 bc12fbe2", + "3f92d805 3f8db2c8 3e4f9c34 3f9c0f96 bcff6280 3d9572e4 3f0055b0 -> 3fa02e0b 3d35c026 3f9bf552", + "3c9ab0a0 3e825bf0 3f8173a9 3f502c62 3f40ae5a 3eda7e30 3f9a8f62 -> 3e83494c 3f8174b3 3f513668", + "beb3274c 3e3cca70 3d88e4a0 3f87c758 3f80b3e6 3f6816f4 3dc49850 -> 3e065196 3d4916b1 3f85721d", + "3e280ed4 3ea6a244 3df872f0 bb427e00 3ef9b14e 3e9ad8a4 3ce41ef0 -> 3ea62de9 3dea4abd bb2442b6", + "3ed6f5d2 3e9c447a be6e3836 3f8bdadd 3f6f6ada bdeaf680 3f60f68a -> 3ec3f220 bdad4c88 3f87bc42", + "3e8931d8 3f81c942 3e06214e 3e850e74 3f6ae2c8 3f50b23a bdac4a54 -> 3f816184 3e19d226 3e4c7500", + "3f8323b4 3d461c00 3f0234aa 3d6ca480 3f280ede 3f00c6a8 3f969519 -> 3d814747 3f029a66 3e086bfa", + "3e0578e8 3f8a1e4a 3e2efac0 3e8d4ab6 3d8ebda8 3f36d35c 3ef9827e -> 3f8b57d2 3e371448 3e8cf42b", + "3f0ac5e6 be2c9d44 3f78e1aa 3f3b2c46 3f82a106 3e64d2e4 3f7303f4 -> be8f39a2 3f76ce7f 3f53af46", + "3fb75d27 3f7e7560 3f7876a8 3f88a1c1 3e953bd0 3da141d8 3f495e92 -> 3f7d8b08 3f6fa29c 3f8110e9", + "3ec9aaec 3f97ca20 3f0d0778 be25ebf6 be226d19 bd8f1d5c 3f1acd3a -> 3fa66d2c 3ee130c7 be35d2c2", + "be05adf2 3f5cd9b6 3f98399d 3f8a64e5 3f8652d5 3dcfb630 bd06a7d0 -> 3f58802c 3f953a18 3f88d49f", + "3eefb9c4 3f58b342 3f11105e 3f1d9325 3ed79ba8 3e10d52c 3f85af22 -> 3f563e1e 3ef7e9d8 3f3c75c6", + "3f89d138 3ed14d52 3f475af6 3f92d05f 3eaefb04 3e5dcb00 3f71a9d4 -> 3ea722fb 3f2c6f62 3f7c5d26", + "3e74ecac 3f49be00 3e761b18 3deb87a8 3e3279b0 3e0f2e7c 3f86b34a -> 3f431482 3e55e4d4 3e114d88", + "3fadc58d 3f5eb73a 3e408162 bcb1a0a0 3f08b707 3f90fa02 3e824a14 -> 3f61646a 3ee68138 bbe29313", + "3dfff518 3f843738 3f66627c 3f9c4e30 be030834 3f3b6e72 3ef24c22 -> 3f84e632 3f67b8f0 3f9c8962", + "be9b4fb1 3e1d9928 3e4ec174 3f8f680a 3f97f978 3f7e004e 3f3ce643 -> 3dcbfebb 3e1d7b9e 3f91e5c4", + "3f093cca 3f82d641 bd71bbb0 3f3fe738 3f76a994 3f692368 3f790302 -> 3f816552 bdb13aba 3f584140", + "becd0b73 3f32ec74 3f3758d4 3f20073f 3f9b1594 3e28bbbe 3f153d56 -> 3f14384d 3f455168 3f1c0aa6", + "3fbbfd5b 3e03c01c 3ec64052 3f918b66 3e84828c 3f0a393b 3eed75b4 -> 3d49add1 3ed48090 3f93aa9b", + "3f2af5a2 3f907c3d 3f96822f 3e60fe3a 3f3c044e 3e620f0a 3e20a90c -> 3f8aa896 3fa06125 3e108ad4", + "3eb0e9e6 be58a65b 3e7a8384 3e72adf0 3ecb96a4 3d840280 3ebb7578 -> be4614b8 3e418ee8 3e618c94", + "3fa60724 bb43ec80 3ef51788 3f520d74 bce5ec30 3f082208 3e138d14 -> 3a928ced 3eff9f38 3f2f3e71", + "bd5fd5b0 bd87b2c8 3eb12a44 bdb7699c 3ea27f06 3f91f45e bda1cf5a -> bd8a961c 3ea90eb0 bdc40f0d", + "beeec4a3 3f88481a 3f9ddca4 3f2db1aa 3e4f1c4c 3cc56d20 3f935aaf -> 3f85d541 3f8d83d2 3f0bc6a8", + "3fadcd5b 3c77f9c0 3e8f4f52 bcab5750 3ee13f48 3f10d8bf 3f30c3ff -> 3c5023bc 3ea1c091 bd02ea5e", + "3f36c80e 3e62dfd0 3e0d6f08 3f105fd5 be194583 bd07d658 bdf8756a -> 3d7c1df3 3d42814b 3eb10ab2", + "bea62022 3f944a33 3d884ac8 3d170a78 be77a333 3d8ebcac 3e956c7c -> 3f88f95e 3dabd12f 3d2ab0e2", + "3f8bf48c 3f146f3d 3d72cc20 3e2b132e 3ea93610 bc66f470 3eb7c2e8 -> 3efaa17f bb5fb527 3dfe3851", + "be4e898a 3e85cf32 3f4ef9d4 bd5fbc18 be56ac63 3eee0abe 3f9a2b57 -> 3ea21a78 3f4f8964 bd1caef0", + "3fbce81e bd51be58 3f17682e 3f4830fa 3f9ba4a4 3f341f48 3f2c6bf0 -> be28ec07 3f3c9528 3f5e8b41", + "3f8ee122 bd2c6a10 3f18b2f8 3e5e438e 3f6c6620 be54acf8 3f926128 -> bdab2148 3e5d65e9 3eec2626", + "3faffd33 3f6aaff0 3ec88204 3e46bf7e 3f9a29ea 3f1bff20 bd53ac98 -> 3f884437 3eed312e bd30f38e", + "3f3f40e2 bcf0a328 3f87f03d be0fed8d 3ea8e924 3da71458 3edf9faa -> bcb1aeaa 3f8d3590 be006aef", + "3fb93592 3f1461ee 3ebcb72c be429920 3f407d3c bd9b2ad2 bdcd41ca -> 3f41db10 bc9d3620 3e4fa690", + "3f8e7588 3f39a12b 3f013fad be54c852 3f1db84e 3f5e4a4c 3f9dce90 -> 3f46d0ce 3f35b6e6 bf1e0188", + "3ea88fa4 3f3679cb 3f9999f4 3f2834e6 bd670940 3eee3e48 3d8a5348 -> 3f23468e 3f9a4d8c 3f17c7e5", + "3f204a38 3e2ae344 3f802a30 be27fbb0 3f8d831f 3f80c8bc 3e97d706 -> 3e8b6cda 3f800f6a bdec55e7", + "3fbc4622 3f4787b4 3f2c2c5e 3f22d4b7 3ebe7978 bc58f8e0 3f8040ac -> 3f36f5a4 3eae1a50 3f7a5764", + "3f2bc9ea bcb513d0 3e20dcae bda0b8d8 3f8f1d0e 3f7e6a88 bd5b47ec -> bd274d5c 3e7ab99c bc7f9c9d", + "be7a5bea 3f9180aa 3e1b87d0 3ead3708 3f7db4d4 bd0d7e90 3d81d660 -> 3f9647a1 3e3e024a 3ec5af24", + "3f02ac26 3f8e5649 3ee79f6c 3e0b9496 3f5dc368 3df42b5c 3ebb3164 -> 3f886037 3eb65120 3df614ff", + "3d4e17e0 3f1e0736 3f9cac52 3f6576fc 3e2c24be 3f5a6c44 3f7b4718 -> 3f1c021f 3f9b6cf8 3f669e0d", + "3fb6bba5 3f8a89a8 3ecff26c bbc236c0 3f21ae30 bc9c8700 3f7e5e6e -> 3f8640e2 3d4752a4 bc6ac810", + "3ef5b118 3f4afcbc 3ef89804 3d9aaa80 3f38b49c be040460 3ece51cc -> 3f53ec5c 3eab65dc 3d8d59b9", + "3e53d294 3f19726b 3f3f6590 be0aba51 3f4a6960 bc89e928 3ef0d02e -> 3f20d6ce 3f3511ad be08cb75", + "3f873cc1 bcf46b08 3e7fbe44 3f417956 3f8f0b58 3ec5d14c 3e5cb948 -> bd8f3804 3e51ab82 3f251228", + "3f25c038 3e3b7a1c 3e8ce3d0 3f3330ed bde00dda 3e5c11a4 bb8559c0 -> 3d853cf4 3e4e6156 3f10190a", + "bedada9d 3f7ee8c0 3dc0ff90 3de03518 3f9e0628 3ea3b8bc be688533 -> 3f7e3a21 3ddbeed9 3e2e27e2", + "bd98ac6c 3f9bc1da be41c0a9 bdd789a4 baf2f800 3f9b37e6 3f90f8d1 -> 3f993add be294555 bdc111c5", + "bef3c88a 3e67cc54 3f482590 3f209fd0 3f1ebb8e 3e85be00 3ce7cab0 -> 3e534c22 3f521384 3f3b8152", + "3f7b9e36 bdbfb2dc 3efa047c 3f439780 3f583322 3f07301d 3f8fe920 -> be26d752 3f008a0e 3f7c3baa", + "3ea0508c bd225e68 3f202462 3f14b656 3f67fa80 3e20ce62 3e6725dc -> bd4d4e0e 3f13436c 3f0a01fa", + "3f78b790 3ece8b3c 3f80a564 3f4e5d10 3f69d458 3ee512c8 3f192b4c -> 3f18c33b 3f80b661 3f5601e9", + "be262598 3e417eec 3f1c6a8a 3f5e902e 3ed8f1b2 3eaa795e 3f17bb5e -> 3e456165 3f1fb6e2 3f5db050", + "3fb89cf7 3f3e4c57 be35bb8c 3f0542b8 3f9a12b4 3f9bdb7c 3e44dd74 -> 3f90b7d0 bf1c2cb9 3e99158c", + "3f73d424 3f5b1db4 3f186f22 3e0f64b4 3f855621 bdcf9c58 3f7591a0 -> 3f7bb12b 3ea39460 3e7b45cf", + "3f967112 3eded6e8 3f105874 3eaf1808 3f4e3c34 3f28282b 3e282c80 -> 3f1c9fce 3f278f37 3e2850b2", + "3fa1c8fa 3f836d64 3f892160 3f74e734 3f882ace 3f2e130a 3f1bddb5 -> 3f7cd2d5 3f84ae18 3f77d303", + "3f8fc69c 3f904bda 3f9283aa 3e2ee924 bd60c92c 3e902dc0 3ece6584 -> 3fa7324b 3f9ce97c 3e0f5848", + "3ee97a06 3f0d9346 be423184 3f73d518 3e41f286 be5db798 be7155ba -> 3ef74cb9 bd2ce782 3f6c0e7a", + "3f658a8c 3e236e98 3ed507c8 3f8f940c 3e98f9de 3f6399ac 3e7cbd64 -> 3de3bde2 3f15e904 3f97831f", + "3f95f830 be4fb7ae 3e8e0850 3f5e3ca6 3f6d1484 3e36c0f8 bdee101e -> bee4979a 3e0169c3 3f33e990", + "3f8fa10a 3a9cbb00 3f505b82 bde1819e 3e9347da 3f5559a8 3f8f9a98 -> 3a244351 3f6d5ecf be8fb96b", + "3f91aeab 3f3367d1 3f9c0f72 3f58b8d4 3f5df596 3e9cbdbe 3e9437b0 -> 3f60404c 3fab285e 3f48c9ca", + "3fabe574 3f00e4d6 3f23b6ef 3ebb7f24 3f1f9611 3e19823a 3cd0b1b0 -> 3f161a1f 3ed870f6 3d90290e", + "3f27fed8 3ecf7db8 3f8adf8e 3f03d8ac 3f853cb0 3de572e0 3f9b5ad1 -> 3f138cbc 3f90e150 3f3fbe00", + "3fa303bf 3f1e032a 3f0d7da4 3e89bdd2 be166578 3e89e98c 3f401c34 -> 3e6970c7 3ed09f1a 3ec9f744", + "3e716f80 3e7c606e 3f50054a 3f936c5a 3e4ce1c8 bddc54fe 3f88d0f4 -> 3e617b00 3f44d9bc 3f8d6c15", + "3f47451c 3ee4ca00 3ccde840 3f2e875a 3eaa7598 3f9a89c0 3f8f8e0d -> 3ec3df74 3d557923 3f644582", + "3f0ee6fe 3f634d3a 3e80fa26 3d57e720 be62c142 3f8ddc38 3dcb9364 -> 3f4ec73e 3ec2805f 3cf8dd98", + "3f7614ac 3f7a9c66 3f1ff71f 3efe551c 3ef15698 3f943fc8 3f930031 -> 3f7a520b 3f6be643 3f4ef293", + "bec6f39c 3ed54280 3ea7b3d6 3f438ef2 be5a5799 3f49ffa6 3f149346 -> 3f0d1d8a 3e8e5e78 3f40aca8", + "be211174 3f89d8d2 3eedcdba 3e317680 3bf59740 3e538e96 3f9445a6 -> 3f883435 3ef98eef 3e1313cc", + "3fb8e693 3f4f4fdc 3f8aa8a9 3eea7d26 3e1e6b6c be2199e4 3e92b0c2 -> 3f27fab2 3fa09a3a 3e9c1871", + "3f91cea1 3d500908 bd09f890 be33a436 3ed278ae 3ecd538c 3f34b567 -> 3d2807cb bcd3a052 be8b5834", + "3f05fa48 bd7f1d58 3ecf5c4c 3f7a8d24 bc8145f8 3f95d0c3 3f200f30 -> bcd99dd4 3f12f875 3f7b4016", + "beeb4b56 3f729556 3f957c34 3e97a164 3e2c4f70 3e9511aa 3e92c108 -> 3f7675ae 3f90ab2e 3eac8f80", + "3f9fbd0f 3f84cb1b 3f909069 3f82b240 3f26d4ca 3e439c80 3f6335a4 -> 3f82e924 3f9efdaa 3f80088a", + "be8c893a 3f4aa5cc be585014 3d888390 3f887304 3f1ca800 3dd575a8 -> 3f3d865b be483655 3da4325e", + "bc4a7020 3de3cba4 3f307800 3f202dc2 3e0d577a 3f8feef0 3f3d5104 -> 3de59b3f 3f2f9f6b 3f1fd2e9", + "3f826cfc be431d26 3ee3a0f6 be682a86 3e92843c 3e90f83c 3f96cb0f -> bdbbc652 3eabc19d bf1c6e1f", + "3fa87c59 3f952c75 bdb490f8 3f9e4380 3f4d10b2 3f9ffbee 3f958d2e -> 3f819e22 be8e1cfc 3f38d8a1", + "3e3ce1e4 3db1fd20 3d5b2718 3f8133c7 bd23d598 3f88bfe1 3eb25e58 -> 3d919ce9 3d83527f 3f814528", + "3eb9164e 3ebb8458 3f297cb4 3e2c3f1c 3e9df30c 3e8ac0f6 3f6a2310 -> 3eab100c 3f200113 3e573167", + "3f1d7a82 3e6a019c 3f6ba2f0 be610809 3ed555ec 3f4c0f80 bda03f1c -> 3e577f94 3f727cec bcee1320", + "3f9193aa 3edea0b0 3f7f6f24 3dec9558 3f943581 3f759f88 3d692050 -> 3f4d7572 3f800319 3c4d7cc2", + "3f803342 3f903f0d 3da44b98 3c7555c0 3f1cb024 3e3e5168 3f8d1b2a -> 3f8c22f2 3d0a681f 3d063c26", + "beef65d5 3ec58b1e 3f5dc634 bd936642 be468790 3e108760 3e78ec70 -> 3f0a226d 3f67b96d bdb95c5d", + "3f41f364 3f8429e4 3f5ae598 3f9d244c be739176 3c5cc340 3e8d3d44 -> 3f88f85b 3f438234 3fa94ae2", + "3f3fcb5a 3e772bc6 3f9a6481 3e0996ec 3e4fa172 3f7f223e 3f090cdb -> 3e23a8a9 3f82b424 3e0fe60a", + "3f849f88 3e9c869e 3f24d4e2 3d557a40 be107f15 3d29d270 3f451b7a -> 3cc26476 3eda1b8c 3da3562c", + "3ef8b584 3ea9e682 bdc62c80 3f724962 be28cf7c 3f87f65d 3f0fe212 -> 3e41265d be1e71d0 3f7311a7", + "3fa5273b be488d17 3f8d1563 3eb899b6 3ecfdb50 3f6dbd00 3d0e6f48 -> be0e5b88 3f7a4352 3dab8bfe", + "3f33fb6c bddbb3a8 3e0d2850 3f92a7b0 3f322c7a 3f83f9b2 bd78ba08 -> be0f5f2c 3e680883 3fa381cd", + "3f2e4436 3dfe0390 3f90b7ce 3e231f1e 3ee0e436 3ea252f4 3dfa5420 -> 3deb9b9e 3f956d1d 3db92e11", + "bec94f56 bce1d5a0 3f901dca 3f993ef0 be19ed3d 3f391fa2 bd3cd868 -> bd2c40f9 3f934ce4 3f8c4419", + "3ede56bc 3f33ab27 3cffe6c0 3f96a7c0 3e4e194a 3f76bc92 3f581dac -> 3f25c4f0 3d31e1fd 3f8eaf14", + "3da9ecf8 be158714 3f830c70 3f85fd5a be3a6b07 3e804bce b9545000 -> be0221f6 3f832d82 3f868295", + "3d4f7b00 3e83159e 3e202110 3ed36780 3e85538a 3f14a71a 3f8d4874 -> 3e80b79c 3e213bb5 3edaff04", + "be64465a 3cb95a90 3f09819a 3f255a05 3efd8682 3e425e38 3f819c4c -> 3cb9be80 3f124ef5 3f17f88c", + "3fa3479a 3f9cf799 3ed39df2 3e9cd1f0 bd362a18 be2d2e15 bd463f50 -> 3fce4fa9 ba256080 3c13abd8", + "3ed7a660 be12d489 3f9bffef 3e7a98a0 be3b24b9 3eb0ad68 3e4b13c4 -> bd49177d 3fa0740a 3e4a7f2a", + "be0f4988 be12a514 3eb99a26 3ebe19ba be3bf1b3 be02a0dc 3f6ac87c -> be32b6e2 3ece61fb 3eb02609", + "3f8f99ad 3f38334f 3f08ca21 3f56daec bddc3bc4 3dcd0c84 3e78b6dc -> 3ee38d9b 3e9f467c 3f42eeff", + "3ecfab88 3f3e7d9b 3e8feaf8 3f74c312 3f062504 3f8a728a 3eb605a0 -> 3f3f7095 3ec0bbe4 3f7380aa", + "bea8d7e8 3eb893d0 3efb237a 3f8e63f0 3e2dc5b0 be4ea53e 3f78db60 -> 3ed24a9d 3f1b2eaa 3f935ff6", + "3d055420 3e402194 bda79342 3e45cbca bc6be640 3f27cbf7 3f98084c -> 3e3ae77d bda968f2 3e4cf108", + "be8eca67 bd9a5bc8 3cc9a510 3edb7f5c 3d89fe28 be1e3f8e be09ec71 -> bdc269d7 3d08b9a8 3f03f1f1", + "3e33ea0c 3f90826c 3f378e0c be3f6ca4 3f7b12ea 3f756e54 be7407bc -> 3f8d5c56 3f3fed7f be047a45", + "3ea2235c 3f300a62 3f09e318 3f0b11d0 3f0371a0 3f8be110 bddc6690 -> 3f308250 3f21c5d8 3ee53fa4", + "3f54111a 3f8f9dab 3f0244fc 3f659228 be33fb9e 3f98f68e 3f112692 -> 3fa33b71 3f4bf12e 3f68339b", + "3e563a38 3ebb7912 3ecacff4 3f941410 3f31d59a 3e9c3a3e 3e86d872 -> 3ec526cc 3ec0d388 3f9660ce", + "3f17b6c6 3bd429c0 3e8e06c8 3e5394f6 3f7c74f8 3e75f7b0 3f5ef326 -> 3c26d01e 3e5cd920 3e8eb043", + "3ef362d2 3f8301d9 3f865184 3ee0bd04 3db742e8 3f75dd50 3f84b958 -> 3f84355f 3f836a8a 3f108d06", + "3f5552ae 3f212a81 3f666124 3f38dec7 3f5009d6 3f85ceb5 3ed6ce8c -> 3f40465e 3f7b55ea 3f31fb94", + "bdc59dfc 3f44082c 3f482d86 bbe0a9c0 bdcbe7f4 3f0c5e52 3f9cc87c -> 3f495863 3f47c556 bbc1050c", + "3f04606a 3d91308c bdc01a4c 3d13d510 3ecea26a 3f3f91d7 3f858217 -> 3d83bd13 bdf61068 3d63dbc2", + "3ed1057e 3c37ecc0 3db16488 3f46fca8 3f1a4435 3e8b0010 3c71f140 -> 3c4728f9 3d93295d 3f356df6", + "bebcc0f4 3f35a1f5 3e54ce98 3f7c18bc bc7c0d30 3f47b3e4 3f482ce8 -> 3f49aedb 3e31fe0e 3f7b4c2e", + "3f930c06 3f3f06d5 3e3d2568 3f90e5e2 3f027fb4 3f8c027a 3e889fc8 -> 3f401d30 3ec7c5bb 3f9b2531", + "3ef9ab16 3f3ed5de bd1596ec 3f55f1f6 3f711f9a 3f65622e 3f9bfe60 -> 3f53c526 bd5179e8 3f6e947c", + "3f452780 3f64a652 3e1c84c2 3f6f9728 bd1b4880 3f9f3740 3d8cdf9c -> 3f506902 3e9a386f 3f6563de", + "3ea61cd0 3f103492 3f98f10f bd23a5fc 3f061d62 3e1e7e04 bd3be740 -> 3f112e6f 3f9f9e0f bccebc0d", + "bed99a18 3ea5f3c0 3e844be2 3f95399b 3f825536 3e459044 3f46b646 -> 3e6916fe 3e9de793 3f9b08e6", + "3f197efa 3f78b35c 3e1dc638 3f9268c0 3f678ce4 3f06b44b 3f9860f4 -> 3f7c23ed 3e21f73c 3f80f96f", + "3f056272 be01e801 3f98855a 3f69249a 3f201dda 3d3cb048 3ecab408 -> be150b36 3fa65790 3f66e28c", + "3fa0a7c1 be47b62d be4df9b3 be68eeb2 3f494564 3eed21e6 3ebc8e76 -> beb99757 be3716d7 be0a63d0", + "be8324a4 3e759cec 3f6c0622 3f9e3129 3f306573 3d8072c0 3ede73e2 -> 3e63882a 3f70264d 3f9cf088", + "3d7cffc0 3f7480a0 3f6b7ec0 3f963a97 3ee7fc3a 3e4519e6 bdfa0ce0 -> 3f747056 3f6ac74e 3f983bdc", + "3fb2a1f9 3f9fd7d2 3f8562d4 3e9d7d28 3eef746c 3e036834 3f8d207c -> 3fa36dfe 3f8b3566 3f2a7117", + "3ed726de be7ca254 3e99420c 3f92ffc4 be10ae0e 3f4ee788 bc255ac0 -> bda5c328 3eb5130f 3f9c5a5b", + "3e44d240 3e569178 3f925772 bc935ec0 3f7ad31e 3e21bc2e 3ec899f2 -> 3e75d9a4 3f951954 bc8d2150", + "3ef375b0 3ef6d6d6 3f943796 bd0d88f0 3e5a97c8 3f0187f6 3dc16ec4 -> 3ed4012b 3f941580 bcaa1f28", + "3d6b1d50 3cb17e80 3f7caf6c bd9f0216 3f8d4245 3e893742 3f928456 -> 3cbd86d7 3f7c991d bdabb097", + "bed9a326 3bddf540 3f3705c0 3d8c5968 3dadb738 3f040642 3f3e23b0 -> 3c15e290 3f36533f 3d62be68", + "3e185454 3ebeca3c be2674da 3f1490f7 3f0126d0 3e473d70 3f937a48 -> 3ebef33f be14df1f 3f20a9ec", + "3efcf606 3f8367ee 3f711024 3f392aff be5ca248 3f3c716c 3ee14da8 -> 3f85e0c2 3f745834 3f3621fa", + "3f05b04a 3f912b3d 3dbcb918 3b8a2200 3f5f5216 3f421320 3cb52660 -> 3f8998b0 3deae8f0 3b0af4a9", + "3f92324f 3f0ff198 3f79dfcc 3ba7f900 3e9497cc 3dc30f48 3e5a1268 -> 3ee38047 3f74588c 3ae998ec", + "be6b2844 3e36a48e 3f94ecee 3f251c37 3f6468c8 3f662948 bba1d700 -> 3e1b9bec 3f99634e 3f32b482", + "beb54486 3f890632 3f22967c 3f757f22 3d7b89a0 3e44e51e 3f6c291e -> 3f86062c 3f2f83b8 3f727bba", + "3e23eb28 be5182d9 3ee5e97c 3f88d68e 3f482a36 3ee8c3b2 3f0a1e9a -> be6849bb 3ee41256 3f88b7f2", + "bb4e1600 3ebedd38 be3e245b 3eecc9a0 3f80f991 3ef0f4f8 3f014458 -> 3ebe7b61 be3e2f06 3eecc89d", + "3f9fa259 3de417f0 3ea6820a bd12515c be1a4a34 3f306ff8 3e95e79e -> bd49bae5 3edb88b9 bc87fb39", + "3f2188f6 3f839b23 be2fc4dc 3e11ba90 3f8b2410 3e47aa04 3ed07bd4 -> 3f80dbfa bdc0fe92 3e03170d", + "bed48fc3 3f3500a8 3e972a44 3f0f997c 3ea1b3b0 3eb3002c 3ef91ec0 -> 3f3d1c91 3ea477da 3f104d92", + "3f05c314 3e8dd61c 3e3e8b54 3f4221b0 3f640010 3f6c6600 3f8a4182 -> 3eb7b22c 3e8195b4 3f5e92fc", + "3f9ed1af 3f8cb17a bd8a44ce 3f913ad3 3e36bb34 3f3d77f9 3d492c80 -> 3f97d382 bde237e8 3fa71a64", + "3f4761de 3d755768 3f3ea436 bd1b4d90 3f40c950 3ec26a9c 3f659560 -> 3da821a6 3f3585ba bd7eef86", + "be132548 3ebdcbe8 3f2d3e78 3f71e214 3c1dd5c0 bdf0fa84 3d71b590 -> 3ecea102 3f372f78 3f7392d6", + "3f86f3f8 3f44e1c8 3f9365aa 3ee23294 be041666 be6d2c1b 3e96426e -> 3f089469 3fb5db20 3eab35fa", + "3fa3baa1 bde30e84 3ee97272 3e55b58c 3f8204fc 3eece196 3f4aec32 -> be8bf7dc 3edd506f 3eaa2968", + "3fb3e238 3f92abb2 3e83f1fc 3f289954 3f347289 3ddd5910 3eb58162 -> 3f8659ed 3d407234 3f110f34", + "3eb9c886 3f4cf0ec 3eb29cac 3f501088 3f9c2564 3f56fa02 3e7fa530 -> 3f624bbc 3ecf49c0 3f48fc83", + "3fb00366 3f42645c 3f881fce 3f2188b9 3f4a8550 3f4567ac bde19b6a -> 3f67d824 3f81aea2 3e760955", + "bd753c48 3cfd8260 3ee2b8ba 3d6b4668 3f38c300 3f80b8c8 3f5ff174 -> 3cf6fc9f 3edb12aa 3d6152ae", + "be8b6c99 3d1eafd8 3f806ee2 3f7cbf58 3f956241 be155b4f 3db4ad78 -> 3cce8a0f 3f8047c0 3f7d77b5", + "3eeed186 3e2d15ea 3d148c00 3f0e04cf 3f831ac7 3f745aa8 3e898584 -> 3e736d90 3d513f41 3f005e60", + "3fbaa092 3f0d7cfe 3f6108c2 bdca830c 3e36ebe0 be532052 3f96c96c -> 3ea45b77 3f28fb26 bea09ffb", + "3eadef88 3f24799c 3f53e4aa bccf6b20 3f710920 3f271fa0 3f595228 -> 3f361db6 3f57af1b bd00ead0", + "3f7c8f14 3f884e50 3eb3c9dc 3f9dd7c4 3eb47322 3f3acf3c 3e67cfac -> 3f8ae191 3ee8aa61 3fb1b606", + "3f0407e8 3f187092 3f89a898 be49e6ea 3f3c50d4 bdb5631a 3edced0c -> 3f276d2e 3f8ff6fc be38d289", + "3e92fd06 3f46f6dc be31f05a 3f8227e2 3f888681 3f5f09d0 3de48288 -> 3f5562b8 be5e7578 3f82a50a", + "3f4de972 3f50539c bdbfd9c0 3e961010 3f7639a6 3f725e9c 3f4a7d74 -> 3f6d2603 be2b52f5 3ec7b7d5", + "3f31ec80 bd983734 3f433ab2 bcc893c0 3ee7131a 3efa8710 3f5c2342 -> bd8d264e 3f428a6d bd17b0be", + "3e9c6cf0 3f6f63d2 3f125547 3ed7f7f8 bcce9288 be54c4a5 3ee9d5dc -> 3f6a67ba 3eee71be 3ed4aa63", + "3fb8b2f3 3f86dbc8 be1b5a9c 3f316a24 3f90f228 3efe38a4 be57943c -> 3f73577a be198f60 3e837aaa", + "3fa901d6 3f4060c0 3e54d390 3f8ffe0f 3f840ae8 3ef983ac bde81e2c -> 3f81bf16 3e4f2fd2 3fad218c", + "be292540 3e478098 3f30a780 3f23ffeb 3f843850 3f2f7678 3f8eca47 -> 3e2b3814 3f2d4cfa 3f1803b6", + "3ec93e96 3d80b3f0 3f89e572 3d0c7488 3f2c1015 3f525344 3f9e3b04 -> 3d9105d4 3f873379 3d5af39e", + "3fa50cb1 3f012ea3 3eb0a78e 3f578198 3f543afa 3f67a564 3f4562a8 -> 3f377ba3 3f14bb28 3f6f5552", + "3f9712b2 be449244 3f599de6 3f8a2aab 3e4d092c 3f406282 3f47eea0 -> bcf630c2 3f6cfcca 3f82e349", + "3ecc40ec 3e9c0b9c 3dcdfa24 3f2b73be be7df93a 3f392708 3dd2feb0 -> 3e3698cc 3deefa0a 3f19846a", + "3ef95f22 3f90d6e2 3f83fe08 3e446b32 3eb6b0be 3f175660 3f0994f4 -> 3f937f40 3f83a071 3e4a34dc", + "3f522c18 3cabcec0 3ed145b4 3e5750e8 3f6cc910 be496c5d be684124 -> 3d1095e9 3e077257 3c46352a", + "be2ef4b6 3f8e708e 3d07a868 bd4252a8 3f551c74 3ebb3322 3e76b3e0 -> 3f9043e3 3d0dae3c bd5457ae", + "3c80c920 3f8b84ce 3f4faa94 3f152e54 3f9789fb 3dad2f6c 3f9f6f90 -> 3f8b3fb1 3f4f2778 3f16a3e6", + "3f96b5ca 3f3a0b9f 3f1d538a 3f2b8e64 be1b4f12 3f621634 3eb41ebc -> 3ed80ef6 3f540a3a 3f17ce8c", + "3f2a0128 3f1057b6 3ecccd96 3e638a68 3d827818 bc864960 3c9f5f20 -> 3ed7b8eb 3e710ce2 3de52b91", + "3f9ba8a6 3e43ec2a 3f1e811c 3f06793c 3f32bd9a 3f41fee8 3e3598ec -> 3e882664 3f445a7d 3ea8c135", + "3ed861da be3aed08 3eef31d0 3e2d94fc 3ddc6bb4 3f8e596e 3dd3f7ac -> bde33af8 3f189114 3dfa89d1", + "bee39f8f bcf5d098 3f5bec76 3ed888d4 3e8360e6 3f0ab5d4 3f7b9064 -> bd164e2b 3f5ac552 3ea2e808", + "3f0f191e 3f85a7a8 3f4a45d6 3f539cd4 3e2e3ad8 3f2be05a 3f1fb140 -> 3f87d514 3f526826 3f58b0d2", + "3e6d8774 3f6213bc 3f7af83c 3f04cd70 3e072f72 bce9c018 3eb30f7c -> 3f5d90dc 3f79c2ae 3f0058d5", + "3f32be16 bd6d6880 be452b9c 3e71596c 3f13a704 3f5178e6 3ea1d7fa -> bd842aad be96d57a 3e41fa7a", + "3f365e82 bdd22ae4 3e805248 3f7d9ec4 3f82b1aa badf3000 3f14dcb4 -> be3f1996 3dee5764 3f7de4d8", + "3e9565f4 3f4a7a54 3f864f18 3f874f48 3f3117e1 3e92d52c 3e78a88a -> 3f4f3728 3f8721f8 3f88782a", + "3eb9c9f4 3f8a1da3 3f72dc6a 3e8e5dc8 be2785c4 3f4db4fa bddb259e -> 3f8f5f5c 3f759b5b 3e422d8d", + "3da20ac8 3f3ca0ad 3f6697d0 3f9ce0cd 3f6400de 3f807b9c 3ec92b34 -> 3f3fb241 3f686adc 3f9d7a59", + "beeceaa2 3f4d375e bd808f88 3f6e096c 3f793cf0 3ed548cc 3f9145fb -> 3f3b5fbd bd8b1c22 3f6438d4" + ] + }, + { + "glsl": "vec3 cultmath_cycles_mix_linear(float, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "3f83b872 3e943964 3f8aff07 3ecc56c4 3ed89fe4 be54adcc 3f9a4196 -> 3e065e60 bebdc204 3fecd80d", + "bec11197 3f972d05 3f362ee0 3f30b3fc 3f6f476a be128994 3ac5aa00 -> 3f5a6d8e 3f992c4f 3f88791f", + "bc82f7c0 3ddec578 3f9a93bc 3efb10ec be70f056 3e3142c4 3e665778 -> 3e0775e8 3f9bea3c 3eff91ad", + "3ec2efe8 3f199155 3f81ee95 bdf4ec48 3e7a64c0 bd7b8e64 3ea1bc70 -> 3ecf8842 3f166c5c be85029c", + "3fbe2ca4 3f5cb022 bdfb56ec 3f77daf2 3f8f6318 3eb73c5a 3f401710 -> 402d1ed0 bf0b86a8 3fdb260f", + "3f0d7e1c 3f8e6f2e 3f9081c1 3f29ce9e 3f42e06c bd7e7de4 3dbcbcdc -> 3fb365bb 3f01f050 3e599306", + "3f685e2e bd797108 3e921b3e 3f9a5cba 3f65999c 3e10cb12 3f6a39d2 -> 3f28da1c bebb33d2 3ffac834", + "3ed8fc7c bca72d00 3e4203de 3f757904 bbd62600 3f28f618 3e71ead4 -> bee64559 3ea67204 3f3c3df5", + "3f8b0793 be377c72 3e8991d4 bd9249f0 3f8d46ba 3f23a4f2 be16a63a -> 3f90ef33 3f123760 bfbd148d", + "bd98eba0 3f1599bd 3f78d90a 3f88409c 3f3fbf6e 3f004bc4 3f52cf9c -> 3f0c14a8 3f78cdb9 3f8211ac", + "3e253714 be2f702d 3f89dcec 3e81c6fa bc71dc20 bdf00dec 3f5ad354 -> beacc3fc 3f60bd49 3ebc64ba", + "3ec31666 3ef59f18 bd9ab7ec 3f18ff93 3f860a2a 3f26a466 3f0be448 -> 3f658f4a 3d21b9dc 3f220f80", + "3f2d3762 3f70142c be76784b 3f60727c 3f72a814 3e8738b6 3f599338 -> 3fc59e7a bf0f56e1 3facd51c", + "3f9c7e50 3f1c3a98 3ef82fb8 3f6852fa 3f0c732f bc2fb580 3ef93972 -> 3f3aabed bf439b58 3f600a4d", + "3f23beee 3f103496 bdde3e26 bdd12e8a 3f63e700 be22572d bd59ba50 -> 3f8800e2 bf7371fd bf4f4d3f", + "be98f8f8 3eb98e3e 3ee92b10 be77936e 3f06f7d6 3f21a760 3e8ec5ec -> 3eb13a62 3ec0f2d8 bde08474", + "3f1f1720 3dc0ff44 3f14b730 be461b86 3f9e8046 3f0e722b 3f2fc060 -> 3f81845e 3f26ab9e 3d1d2b64", + "3f83ae61 3f76771c bd7f1430 3f868bad bc5425a0 3f9c9e33 3ee879b8 -> bdbdbd10 3fb6978a 3f74e3e0", + "3eea6e4e 3eaf43fc 3f189082 3f2fc560 3f925e8c 3df1b4e0 3f872c9a -> 3f6e7dd1 3e7c112a 3f991020", + "3fb1bca4 be5e3ce4 3ee64ac8 bdbe9558 3f0f3a30 3eb2ffd8 3ef68dcc -> bd5456a4 3d039b20 be13c20b", + "3e88cd74 3f0dcc65 3f5e5758 3e2ec0fe 3f61f4fc 3ea46084 3e4db080 -> 3f422528 3f45dc37 3c310ee0", + "3e408e54 3f93b056 3f59d9dc 3f0f72a2 3f2eceff 3f866e2d 3f7549a0 -> 3f9c7da7 3f8769d3 3f3b8ed9", + "3f77a74c 3f9a14c0 3dc616a4 3f273796 be0748c2 3f3e277f 3f2eb946 -> bc9db300 3f110448 3f80cf16", + "bef247a6 3f8e0283 3ea4ab88 3f223abc 3e86e188 3ef21386 3f2cb662 -> 3faaaab0 3eb1d8f9 3eefd3a0", + "bdae0948 bdf371a4 3f9325e5 3edb8cb8 bd30dc18 bd386870 3ea4710e -> bcd9836c 3f9f0135 3eeb1c57", + "3d38e490 3ea36eca 3f21671a 3eb574dc 3f270c24 3b50bc00 bd431528 -> 3eaa7bb0 3f15eba9 3e9c24b5", + "3ed60386 3f7eb6a6 bdfd6a10 3e57b864 3ea2b484 be1bc1b3 3d86ebe4 -> 3f57b775 bf2b3c89 be1be922", + "bec9ec94 3dd31478 3f00f5be 3ee218c4 3f5b586c 3f8646d0 3e9c4fd4 -> be36a920 3d90c53c 3f185d1b", + "3f425f2a 3e980328 3f497584 3ebd0870 3f8c9340 3f46b5be bd394718 -> 3f9a48e6 3f9a6ac5 beeae116", + "3f993495 3f738e14 bdf29dc6 3ef3b982 3f5862e0 3ec62234 3ee22584 -> 3fe39189 bec72d38 3eac42aa", + "3f2ded76 3f375bbb 3d47d288 3eee4358 3efaad86 3ef5d532 3f14e3d0 -> 3f33be0f 3cb2999f 3f138454", + "beb1d9ad 3e480c18 3e31328c 3f990b41 3ebff460 3eb7b1cc bc9304e8 -> 3e90848b 3e8ad4d3 3fc71a3a", + "3f9a1f7e 3ecaac18 3f9e5cfd 3eb333a4 3e1faf64 be6fbd8e 3f36e356 -> bedd8b92 bf07da88 3f5dc7db", + "bef0c5d1 3f8bf8cc 3f9e1b1c 3f4de5a4 3ef435fc 3f9fb190 3f2a7272 -> 3f8ebe6c 3f083566 3f25f98c", + "bee23e75 3f9f533c 3f7c1158 3f38f762 3f35fe7a 3f5fcaba 3ee3aa5e -> 3f877752 3f276901 3f457ca3", + "3f2eb3c6 3e51e258 3f9cf55b 3df00d4c 3ea3460e 3f79441c 3f147902 -> bd2ceea4 3fefb6ce 3e67cba4", + "bebaae86 3eba51be 3ed8db6c 3ef2589c 3e2b7360 3f9c81db 3f9f4fd2 -> 3f1b3e74 bdd3e8f0 bd8ead18", + "3e768024 bdd86d96 bdfde888 3ee0ee0e 3ebe00fa 3f7a2f6c 3f1cbc48 -> be2bc2e4 3dd8b262 3efc995d", + "3f7f382e 3d823790 3f693c06 be7310ea 3ef70ef4 3f9538af be3768d5 -> 3ceb9c16 400f452c bfcbb49f", + "3dce85f8 3ee07698 3e647c80 3f69fbb6 3f3c0e2b 3f4992aa 3e10a1a0 -> 3ef8b002 3e8feb83 3f5775d3", + "be7b62e4 be74c2f1 bc8cfaf0 3f8b2469 3d2cc820 bdecad50 3f95dba2 -> bc6956c0 3e91eeee 3f41f950", + "3ef21742 3f0fc880 3da5cab4 3d73e260 be66825c 3f2bd2ce 3f3cf08d -> bdfe1160 3e78aa62 3e91be29", + "3fa6781c 3f5bce68 3d0805a8 3db7efe0 3f92cda8 3f8a8c74 3f81ce59 -> 4022a403 3fc62862 3fb6a9b5", + "be9f7ba0 3d85757c 3dd62f20 3f8b0dc6 3f87695e 3f025336 3f66a1fe -> be909658 3dca98b0 3f562b5f", + "3fb3490d bd4b16a0 3f4f3098 3f2eceac 3e3dc434 3f5a773c 3dead490 -> bf6e5d2d 3fe64eab becb1138", + "bea4f7e6 3f925563 3f1a2e34 3da19fd8 3f57c516 3f310503 3e1285a4 -> 3f6c1b86 3ef52f0c 3e9e2a1c", + "3f55fdec 3f1482b0 3f73fda0 3eea5022 3e7a7a3e 3eaa6a7c 3eb350cc -> 3e1cd35e 3f2c7356 3e5438ec", + "3f70912e bd7613b0 3f12fdba 3f5672dc 3f7479c2 3ec1176a be4d50ba -> 3f4b872d 3eafc000 bef52cc0", + "3f8c15b8 3f906922 be7f4aea 3e6fe714 3f201720 3ca2a8c0 3f0ddb26 -> 3fb387df bfa66ef4 3eb49bb8", + "3ea1451e 3f0588bd 3f206f79 3f56ee5c 3f88adc9 3ebf2bf8 3f779120 -> 3f611a92 3f0c040c 3f912075", + "3f8f6d17 3f2e5225 be74d7fd 3d5d6398 3e104f94 3f1efb49 3ec76666 -> bdfd70b0 3d03846c be465676", + "3f503aaa 3ecd9088 3ec1e6f8 3f10342c bd97103e 3e99f330 3dc40590 -> bf082a5a 3d5f1b08 bdc15110", + "bef8d5d4 bc734860 3f8c2de8 3ef5ee98 3e67ae1c 3d857600 3e4009d4 -> 3e80a27a 3fc247c0 3f48b7bb", + "bef5bea6 3f1a00f0 3f8c1d1b bd0520ac 3ed7df7a 3f56c644 3e10121a -> 3f2d4371 3f44edd8 3e9ff442", + "bed81024 3d9c7138 3f5e39b4 3eda85fa 3f9acfa1 3f221745 3f8ea49f -> bf05bbac 3f4173ec bdbbe5d0", + "3f0310d4 3f1033b9 3f089ca3 3f1065dc 3f80c836 3f28f89f bd20b6a8 -> 3f8a6f48 3f329079 3c4301c0", + "3ef01aac 3f1f39ca 3f6bc598 3ee5f250 3f781bae 3e5569ce 3eb39434 -> 3f87f020 3f25c29e 3e9e454a", + "3e5c74a4 3f4813a8 3ddfb884 3f17700c 3d6e73b0 3f078eaa 3f734b22 -> 3f176140 3df9c0b2 3f491498", + "bec9d21b bdab81aa be275ef0 3f782428 3f841a82 baa2a700 3f2d320d -> bf00d19f 3e6d45bc 3f5482c4", + "bd883ec8 3f42b9c8 bde87682 bd0814a0 3f6ae254 3e6cddca 3f006332 -> 3f34812b bd9f3faf bd08e7cc", + "3f3aa988 3e9f7e5a 3f9548b8 3ef0b636 3f27b622 bcbe4410 3f09ce80 -> 3f09a86f 3ece7864 3f06a82a", + "3fbc84c4 bd9c5b12 3f44b4cc 3f33d410 3ec2d7a0 3f851d36 3f45a414 -> bedb3c3e 4016f7ca 3fc07b41", + "3f0f4dfe 3f0242a4 3f8ae979 3f66b806 be15dd95 bdb00f10 3edbf6d4 -> be5bf644 3edbc2e2 3f528bec", + "3eb9b526 3ee4e8be 3f5841b4 3f9cadb4 3ed293e4 3f08c289 3e1b3f8c -> 3ec3f57a 3f5e9c7c 3f78a887", + "3fa85557 3f48d468 3e6de9c6 be4b1a95 3f9d1180 3f8cb374 3f5d56ba -> 402c9a1f 3fe77a90 3f42b979", + "3e01c294 3e459684 be03ac3e 3f27311a 3e9b0198 3e25f280 be19d7c0 -> 3e12658e be5b6028 3efa0240", + "3fbebcc9 3ea2e6ee 3c8a0300 3ecd926a 3e55d104 3f93c6fc 3f47bfa0 -> bf0cb74d 3ffbd5e8 3f9e4ede", + "be282f48 3d51e3e0 3ea18d5e 3f5059b8 3d89caa8 be3660e2 3ccb66e0 -> 3e4606a4 3f09cca9 3f784f06", + "3fa8dc89 3d927ddc 3efdff68 bbc9e840 3f314b56 3e0bfa78 be06e373 -> 3f145f5a beecc8d2 bfd6232d", + "3eb455e4 3e9274b8 3f269ab6 3ece919e 3f9869c1 3f9426ad 3d993014 -> 3f45ca67 3f8e94c8 3dd4d81c", + "bda17530 3f76be00 baf22500 3f4d07d0 3f8040bf 3ea8e2b2 3ecf1184 -> 3f627aef 3ccca2eb 3f50e35c", + "bea7fd92 3f13f19d 3f129232 bd42a4e4 3f213490 3f1f1044 3f5c08e0 -> 3efc4ede 3efc5fa2 be911e84", + "3ef49072 3f9559e1 3e737e88 3f68e9ac 3f837f91 3f16fb82 3eb6135c -> 3fd5d58d 3ea5a8a3 3f459a0b", + "bead1af2 3f20153d 3ed189d4 3f5c3576 be6607f7 3f9da176 3f1a7af8 -> 3f8ec2ce bdaed82c 3f4a4d93", + "beea1264 3f1db563 3f9fc032 3e89417c 3f9fa050 3ee9333a 3f97cd10 -> bd894b68 3fa4f666 beb7dd82", + "3e9100a0 3d89fe08 be72b85c 3ea16fae 3f3df66e 3f5ed276 3f7c49e4 -> 3e5161f0 bcdf14e0 3f171dff", + "3f532828 3f9636c1 be55a608 be3fa4e6 3f43ee5a 3e847c86 3f93f505 -> 3fce3edd bf1b4a40 3f651740", + "3ea6bc44 3e26ec4a 3f3e5f23 bdb15cf6 3ea2a3b0 3f781c54 bd638e1c -> 3d353d04 3f864ceb bee59a32", + "bd4744e0 3f56c204 3f98692d 3f7a037c 3eb25cd8 3f8686e6 be1ce0c6 -> 3f5a88ef 3f918c72 3f852459", + "3fb97d7c 3f1311ce 3f6f34f4 3f21f3f2 bdac4ac2 3f6c6ec0 bdd5508c -> bf8f2a33 400a5e6c bf8f2775", + "3f774558 3e6636e8 3eb063aa 3d108b38 3f78290c 3f1ebfca 3ec16f8c -> 3f90d704 3f139895 be4d967b", + "3f44dfa4 3ebc5cd8 3f4c1eae 3e851f52 3f3904aa 3f3290ec 3f29b281 -> 3f35e130 3f8cf278 3f02b1d9", + "3dd518b0 3e824282 3dd662e0 3f2deec8 3f3c7d49 3f7dd300 ba911200 -> 3e9b6f8c 3e53ee22 3f133c9a", + "3ef14f4e be3601c2 3f16b45c 3e132004 3f88e255 3f638216 3f4821e6 -> 3eb7cdb7 3f7480a6 3ed18c86", + "3e98f48c 3ddb0c50 3edc45ac 3f1977b1 3f15cf81 3f814a0e 3f451298 -> 3e21a651 3f3c2783 3f42bcb7", + "3fb57391 3e18b53c 3f9065d7 3f1928ca 3dcae450 3f510f58 3f23010a -> bf7cd251 4001a75c 3f7c66f0", + "3e03132c 3e12ceac 3eeee7a4 3f6029c2 3dd3e6f0 3ede2a9c 3f4241ea -> 3d2b6d0c 3ee63e47 3f71201a", + "bd95fa2c 3f146898 3f9a0295 3edbf2be 3f974de0 3f92cf3c 3df7b224 -> 3ef5ab8c 3f8de1b2 3ef85f7d", + "3d168380 3f80bebc 3f922059 3f933231 3f7b3db4 3f5895e2 3dd26030 -> 3f854613 3f9561ae 3f8f7576", + "be1bbb4a 3defded0 3f6917f8 bde656c0 3f6ffcd0 3f924ff5 3e8799f0 -> bc8284c0 3f370556 bd27b5fc", + "beb82023 3e6802bc be2ce80b 3ec6417c bd99e2b4 3f1cb66c 3bf51280 -> 3f23e688 be7f82ec 3f3dd048", + "3f893298 be02fddc 3f049e3e 3f3747ce 3e51b322 be688012 3ced6520 -> bf42c258 bf8530b7 be966c40", + "3f5ea142 3ef43b56 bda40d6c 3f2733c2 3f8e7ad2 3ecc38a8 3f491f30 -> 3fc58eb8 be831253 3f9330fc", + "3eb72a38 3f9e457e 3f32c468 3ebc3dac 3f9c3cbb 3e916a0c bd2394a0 -> 3fe0441e 3f0b34b1 bc98dd30", + "beee15d2 3f4e5bdc 3f3cf49b 3ed5001a 3f0a7565 3e79d3c8 bd103670 -> 3f44a1d4 3f79e978 3f69ece4", + "bceeae80 3f8f9f96 be549d7e 3f80ec0c 3e91d018 be0bcf82 3ef2848a -> 3f913a85 be2ea20b 3f811e54", + "3f817df6 3ebf44ea 3e3c7254 3f06d0ec 3f52b5e6 be347c8e 3ef7a7e0 -> 3f837df1 bf979574 3efcbfcb", + "3f82941f 3f3d99a6 3ef802ce 3f898396 3efd072a 3f3aadc9 3f36441e -> 3f3a917c 3f73ba36 3fc0df90", + "3e1d1e6c 3ec4032a be6bf85e bd3b5cc0 3da00b34 be4f7245 3f671414 -> 3e81bb30 bee45fd4 3d9f5fe0", + "3e8261d0 3f83d4d1 3d4c7c00 3f69f764 3f476b0a be3e45bf 3ed92210 -> 3f9604a3 be99465f 3f60119d", + "3f23d354 bdfad270 3f655baa 3f140d99 3e922068 3d7dce90 3f4272e4 -> becb54be 3eababae 3f69199c", + "3f268b5e 3e874fa6 3f8ba6f5 3e170e3c 3e5750a4 3f39f2c6 3e0b668c -> bde6ce50 3fb159ee bea6df3b", + "bed34f71 3b733400 3f1778e0 be5038c2 3f43c72a 3f00b87c 3f8e791b -> be5bfbf0 3f16e099 bf359a88", + "3ef8a43e be68a521 3f4d8de4 bd3195a8 be3c5d3d 3f522e32 3ea2b084 -> bf643832 3f8eafaf be61a725", + "3f1ff66e bded595c 3f5cd988 be52d48c be7636ce be42f462 3d0ffaf0 -> bf854710 b8b3e000 bf496ca2", + "3f269a9a 3f56a5be 3e7be650 bd28c9f4 3ed5a1c0 3f99e89d 3f608d2e -> 3f3b130a 3f94830e 3ee63e2c", + "beaf10a4 bd92600e 3f874352 3f8f169f 3ea46152 3f043a70 3e8044f0 -> 3d507b50 3f85d136 3fa4ecea", + "3f5e4894 3f354edf 3f5e0594 be717080 3f0fb614 3f0f9ed3 be097c60 -> 3f509792 3f7925e5 bfab2a8f", + "beb882ba be20c8e6 3ebe4de6 3e609e10 3efb5d6e 3e446a88 be6c412f -> be1a1a78 3f180418 3f3efac1", + "3be1ff00 bcb173b8 3dd3c590 3e4d8770 3f2aafde be189831 3ee79c84 -> bc9e9c2c 3dc16ff2 3e4cdb32", + "3ec623e8 3dc3fa6c 3f8b3f38 3dc7b250 3f0ce742 bc66be20 3ebdc7aa -> 3e09efe8 3f30a21e bb2a2420", + "3fa56c7c 3f7f073e 3db5cb3c 3f3eb808 3d5f3c20 be3b28d8 3f88a132 -> be1f0690 bfd6881a 400d8b5b", + "3ecd6538 3f9f69fa be61640c 3ee57870 3eff4828 bda509c8 3f0224f8 -> 3f9f451a bf2f98e2 3ee8e957", + "3f53ca9e 3f8fe950 3f7d4bde 3f969114 3f42b698 3f5b9d78 3f7d06c4 -> 3fc71a9c 3fca713c 3ffe009c", + "3fb77fbd 3f340df4 3f2acb61 3f6780ca 3ed4c0fa 3f862a1b 3de347bc -> 3eec1d62 400f4910 be582760", + "3ea22986 3f83c393 3f6aad96 be74c4b2 3ea67398 3f3ebd13 3c2b1020 -> 3f6b2a76 3f8935b5 bf0c9480", + "bd1a1f50 3d06d8b8 3f396f7c 3e3eebd4 3dff26bc bd452af0 3f744d0a -> 3d7a90e8 3f43fed9 3e1be98b", + "be41fdb2 3d968da8 3f8052d2 bda7a1b0 3f973d96 3f98d4a5 3f6b7580 -> be3d28b6 3f3d554c be76acff", + "3e0398f0 be1b35ba 3e2f5088 3f851855 3ec18f1c 3f21dd12 3f92718e -> be3b4ecc 3e52213e 3f9a4903", + "bde0478c 3f2bee06 3f8b9b9e 3f639344 3c9c3290 3f34d96c be3f2674 -> 3f46e548 3f85d1fe 3f8509d3", + "be59110a 3de7cb3c 3edfdac8 bd9cadbe 3ed94368 3e7de2e0 3ecc22de -> 3e14be0f 3f0b48e0 bd0973e6", + "3f7486c6 3c771860 3f3d6732 3ec5a380 3f27f028 be5d1916 3f779f2c -> 3ea05076 bf20b7bc 3fa3ab90", + "3eadf5fc 3f6a25bc 3f3c7500 3ef7caa0 3f8d5576 3ee1e6f0 bddee8d8 -> 3fa99fee 3f323b12 3d8fd904", + "3f898db8 3efdb2e8 bcec3ad0 3f99391f be0c7ff6 3dee4918 be48cb0c -> bf5fc040 bf5a78c2 be991a08", + "3f25ff5e 3f62383e 3f0c27b1 be13f2f3 3efda7cc 3f6416a6 be6eb17d -> 3f60b30e 3f86fa49 bf8c2fad", + "3fb93ade 3ea17082 3f9f50c1 3f01d979 3f323091 3e8ac822 3f214798 -> 3f61face 3f1500db 3f622b08", + "3fa38ecb 3f2e6cef 3ecebdd4 3f78d766 3f192357 bd95e07c 3f69bd0c -> 3f6eab06 bf87cfb9 4001c433", + "3f968586 3dd611e8 3e1eb7d2 3e28daa0 3c797ce0 3f9609bf 3e91f074 -> bf848ede 3fde3152 beae6cbe", + "3f7d7ff0 3e5d3cea bcc0fed0 3e9f8362 bdf28354 3eb08864 bca34e28 -> bf811cfa bea971c5 bf37d99d", + "3eaf0b08 bd6c07dc 3e8f9cfa bdb71de8 3e128c52 3f734b8c 3ed6c7e2 -> be9a71e5 3f16a41a be13ed3a", + "3e9923f4 3f3dd37f 3f9d05ec 3e21e96c bda384ca 3f02db4e 3f8c7f32 -> 3eca0eb5 3f9de0a8 3f03ffe2", + "3fa04859 3f513f40 bccca4d8 3f03bcac bd77acd8 3e1040c4 3f5ab73e -> bf1615f4 bf6ca49a 3fb376aa", + "3f09f2ac 3e11e6f0 3f70cc9c 3e6bb7ca 3f780328 3f3b5b68 3dbdc2d0 -> 3f25d0a4 3f98627d be55d1c4", + "bebc3d43 3f8254bc bd5e8380 3f1080fc 3f968ff0 3eccc414 3ee7641c -> 3f055ca2 3c9dbd40 3f198d2c", + "3ef87922 be01be4a 3f4fbb22 3e520108 3e67e190 3e79646c 3ed0b59c -> bec8d029 3f100264 3dec684b", + "3f2693a8 3e368878 be790ecf be1ea5cd 3ed27062 3edff3ac 3f86d9b7 -> 3d7fcb62 bea63c5d 3f10beb6", + "3f32bffa be7e8b3d 3f860282 3f989532 bd3cbff0 3ec05ca4 3f8d1711 -> bf816e15 3f5f95b5 40021e72", + "3f9dd92f 3f1701e1 3f6e2e50 3ed93fd8 bd00fda8 3d9d5cb8 3e8008ea -> bf3892bb bde80300 be44b914", + "3f90c6af 3f83fa08 3f57f960 bbc83c40 be0e1af2 3eca98b0 3ea67e30 -> bed3ed7c 3f1b9241 becd9ae3", + "3f423e6e 3ed3bf6c 3d73c6a0 3f768cd0 3f92db8a 3e4971bc 3f9543a2 -> 3fb2ad02 becd2ab7 3ffcaa80", + "3fb9e514 3f6f104e 3e0a5d94 3e9d95ee 3d361918 3e9409d6 3ee6b218 -> bec75628 bef46736 3e282c51", + "3f9832da 3e184b0c 3f1f5698 3f78ebde be673122 3f1983ec 3f3067a7 -> bfc9e304 3f5c042e 3fb60440", + "3f0b68bc 3f90c668 3f83f02b 3c020fa0 bdaa93de bdbd4d38 3f63c4b8 -> 3efdd61e 3ec56404 3edd6301", + "3eb9d028 3e270bb0 3f8cf382 3e997ddc be554a07 3ef4e8ac 3f9a3094 -> beb3b246 3f8af04a 3f4fabcf", + "3f1dfca2 3f3cc89c bcac4d68 3d67ceb8 bd9170ea 3f97d370 3f8af714 -> 3d05b890 3f536af3 3f478af4", + "3f854bb7 3f0b96eb be08ac2d 3f96474a 3f84d356 3f8655b4 3f9a6ee0 -> 3fd52410 3f8167ca 40295058", + "3f2d2c66 bceba700 3e8b0754 be26e9d0 3f85e436 3f62d770 bdb6fdd6 -> 3f35c026 3f4b3d20 bf75d92c", + "3f0b1932 3e8eb828 3f348490 3f7b0992 3d206168 3cd85160 3f11298f -> be636220 3e430fd8 3f86d80a", + "3f0711da 3e9160c0 be77cfda 3b341380 3f87c84a 3efdefc6 3e373b36 -> 3f602ee2 be7c2aa8 beac0e8d", + "3f370d8a 3ec97208 3f2a6ef2 3f8c30ea 3f29dd0c 3f5a797e 3f609cfa -> 3f209779 3f95e91b 3fd1463d", + "3e8fe510 3f6a0b62 3dabcd58 3e041b62 3ddd5780 3f6ee6fa 3f81e661 -> 3f31a618 3ea79fd8 3ed6384f", + "be79ff42 3f14635c 3e59e588 bb8d76a0 3f579ce6 3f85a072 be4755ae -> 3ed337c0 bd585198 3eab740c", + "3de485a0 3f061905 3ea6e6b4 3f91e5e6 3f68e454 3e898932 3e0a90b8 -> 3f1d818c 3e8c76cb 3f877b16", + "be1b3270 be10dc53 3f6bda80 3f9d0b0c 3e9b670c 3f470ef0 3f9c4b92 -> bda7bfcb 3f56507a 3f811114", + "3f6fe25c 3f5b14b8 bc071220 3e07ad7c be5e8836 3e910694 bd5a3010 -> befa2138 bed43289 bf678577", + "3f271644 3ebe15ca 3f1a02b8 3f972d93 3eafb722 3f4d5ccc 3ea85a80 -> 3e2a9182 3f7eff3f 3f752690", + "3f8d88ae 3f4b92a8 be78c3fc bd00c50c 3f33b700 3dfd21c8 3e4f7682 -> 3f9ef823 bf89a47d bf306aa3", + "3fa9bfff 3db7dcc0 3f9a4b04 3f807c5c 3eab69cc 3efbf198 3d987ad8 -> beb26333 3f979a77 bdffcc60", + "3f68589e 3ed33e54 3e1bc308 3f86fbb6 bdc13fbe 3f859acf 3eba6cbe -> bf2a929e 3f91d128 3f4ed1e3", + "3f90df19 bced4ac0 3f8e7cda 3f4f3ef4 3f02bd98 3f8de6cb 3f581bd6 -> bb9b1928 401f69d8 3fcb585c", + "be97da57 3f7970a4 3f9ab853 3ea21184 3f3767cc 3f873b78 3e9d330e -> 3f58932a 3f60eefc 3edcacab", + "3e8090b4 3f6a0b80 3f811134 3f59fc86 3eced570 3f44b984 3f7549c6 -> 3f5db2f7 3f925301 3f8a71da", + "3f0576d4 3d14daf0 3ec1e54a 3f32a90c 3f85453f 3f8fa6d2 3f87871e -> 3f19c233 3f83869a 3fa3e952", + "3fb8f27c 3e4c47d8 bdfce220 3e400e24 3f811398 3f9b7b70 3f9d7f30 -> 3fd597e0 3ff88f5c 401318d6", + "3f195152 bdd9559a 3ed16978 bd7069a0 3e87ad48 3f1bc1cb 3f7791e0 -> bec674b8 3f09f403 3f0031bb", + "3ea41d38 3f9f92b2 3edfdfee 3f5e4d1a 3f2f81de 3f823aea 3e7830cc -> 3faecd01 3f44da91 3f340564", + "3f54c4e4 3ec99cb4 bd4051c4 3f406d50 3ccf8320 3f27ec98 3e54d61a -> beca5e0e 3e5960a3 3e8835d7", + "3fb4daa7 3ef80e1e be0da866 3f38331a 3f9e3ff9 3f8486cc bd65d9b0 -> 40242cba 3faff02f bf5a1a8c", + "3f087e3c 3f8a8675 bdf7d636 3f75409c 3f8bc007 3ea73650 3f7d3946 -> 3fdb4d31 be9ca368 3fbd647a", + "3f5c4844 3eb2db58 3f290320 bde35f5e bdb8423a 3f9edbf4 bdcb8eb4 -> bf2a7dd2 3ff7c129 bf923f1b", + "bde8fccc 3f988158 3f8a2df9 3dd84508 be14a0c1 3f11020a 3e57603c -> 3fab4b48 3f883ea4 3e2f9ff1", + "3f9ed7bd 3f96346c 3f2f9638 3f3bab16 3e9e1492 3f45c8d8 3f23b503 -> 3f32e532 3fae64a5 3f8a252a", + "3f366852 3e983daa 3ef18c98 3e8ead66 3f52b434 3f45ef7a 3f8b9625 -> 3f41fa76 3f5c6fcd 3f8f6270", + "be8fbebe 3e9dd57c 3f94863f 3f5801d0 3ee1b558 3f00d2ed 3f9d2ebd -> 3eaed7c2 3f944b07 3edeb97a", + "bee1a8da 3f0af7c4 3f1cd93c be09ee7f 3f2a34b2 3d6a75d0 3f651fae -> 3ecb873a 3f806173 bef73e56", + "3f0eb080 3d039f40 3eba54f2 3f90d411 3e602e3c 3f7bca56 3f381b10 -> be8ff8e3 3f6729a2 3fb019c2", + "3fb06d61 3ee2de00 bccd4f50 3f0875c6 3f4dd250 3dcc2214 be0e602d -> 3fa3fb2e bf9076f5 bf9d41f8", + "bedc831a bd7c32b0 3f5c3d62 3eac870a 3e5f21b2 3d761e00 bdff815e -> 3e39c64e 3f9e9f79 3f6007d3", + "3f2d7542 3f95a7ba 3f0306d2 3f29fd22 be3f438f 3e6dea58 3f817177 -> 3e743840 3e18aeee 3fadade0", + "3eae82e2 be350c0b 3f1e26b6 3f64d596 3eee42f6 3f7e9554 be08d88a -> be4d3b28 3f7470ec 3eec83b8", + "be15e5f8 be1190b8 3ecb5d22 3eb55148 3f851292 3df889c8 3bba3380 -> be99ac13 3f020f98 3eff6a36", + "3fa8fd29 3f6f76fa 3d78c0a0 3f63085c 3e1d3aac 3f8efac2 3f9f08ec -> 3ca8d4a0 3fd850ac 403639c3", + "3e9c9d28 3f804ded 3f4740dc 3e49b110 3f9fa2bf 3f450fda 3f947637 -> 3fbacfcf 3f7180ea 3f19c40a", + "bc839560 3f8d11d4 3e5eabf8 3e1f71cc 3f004fc0 3f753822 3f0732fe -> 3f8d108c 3e4f9bf0 3e1e84f9", + "3ea73008 3f1b6ece 3f63a030 3db586a4 3eb5dddc 3f9f4f0c 3f84b4fa -> 3f0339b7 3fb00e8b 3ee0dd76", + "bec8fd4e 3e5a3b44 3f9dcd71 3edb4692 3f982854 3f8f4db7 3f449c34 -> bea7bd50 3f3f1484 3e5f1574", + "be40d2c4 3e4deb20 3f837a63 3f68e070 3ebb0a24 3f82688b be652768 -> 3e80ee26 3f54efb1 3f975434", + "bd93f3e0 3f8b72ee 3ee4d2a4 3eefb7fc bccf50a8 bd32291c 3f937d31 -> 3f9529fd 3f0683ab 3ebf7790", + "be22d474 bd8fe36c bd533ce8 3e93aaca 3ed3b22e 3f3a416a 3efd9374 -> bd2f0eca bdfdd56b 3e947024", + "bd7f51d0 3ed7d7b8 3f0c5788 3f862fde 3f8fabb7 bd3581cc 3e8c33d8 -> 3eb01cf7 3f1db6b2 3f89cbc9", + "3f0d66b8 3f4ba5f8 3f82647e be442caa 3f66746c 3e1140ec bdf76fdc -> 3f9e6a38 3f1f7fc9 bf609cdc", + "3f338bd4 3ee16c70 3efdf802 bde9aa90 3f983387 3f007cd7 3d490e00 -> 3fb41385 3eff563c bf3f20d3", + "3f5b6144 3e44db70 3f5ed4d6 3e05a5cc 3f84e054 3f9137ca 3f89946c -> 3f8ea794 3ffa9d96 3f8ed094", + "bdfa32c0 3f846758 bde190e2 3f067791 3e11680e 3cba4f30 3f93e828 -> 3f8f99a0 3bd407a0 3ebaedc8", + "3f9a5f48 3e6a74f6 3f8e405a 3efc5b4c 3f502932 3f409c3a 3f481418 -> 3f7bf7b6 3fdc2c68 3f9604a8", + "bddd5694 3f2da056 3ed1ce50 3ea6221c 3f88469a 3f82f42f 3f1acf4a -> 3f0e61a4 3e97eadf 3e9a8b1a", + "3f51bc78 3f33d030 3e1c2ada 3ef2e412 bcc76da8 3e48e36a 3f0f7f36 -> be2089f4 beb0cdf4 3f12d690", + "be46e558 3f6d82b2 3f2af64a be29a4f0 3d91c284 3ee5e228 3e830396 -> 3f8c140c 3f3008e9 bd91137b", + "3f973a31 3f60fb18 3f087d44 3f021a6a be0608f9 bcd7c990 3f5f19f4 -> bf1ca70c bf35e63a 3fb1690f", + "be5f7aca 3f227b4c 3f249d08 3e00f76c 3f7fe09e 3f047cc7 3ef29222 -> 3ed55498 3f22a79c 3e0cb091", + "3f5a1e08 3e57b6b8 3f872c33 3f9c99bb be0de32a 3e616638 3f0b3de4 -> bf60a264 3f14401c 3fa62dc1", + "bd6acaa8 3f7cc32e be4be9e2 bdab547c 3f89ccd0 3eb0a234 3f4cd9ee -> 3f6bd746 be39b73e bdf1d086", + "3f1178ba 3e4629b0 3ed12dc2 3efbe1c4 3d5ab268 3e8d249c 3e90d132 -> bea0cb10 3e1d49cc 3e7b0bc2", + "3f9dc37f 3f9034f2 3f887b52 3f720f72 3f4ca6aa 3f7bb558 3f073460 -> 3feeae70 40107a58 3f81e8f8", + "bed1c84a 3f426dae 3dc9a178 3e678fd8 3f6dbc14 be27276a 3eee3cf4 -> 3ed1028e 3f2456d1 3e82560e", + "3ee98d60 3f5c9de4 be0e72c7 bd24ee4c bcad0f48 3f7643e8 3f2dd8c9 -> 3ec5d041 3e9090d8 3dfc25de", + "3fad7a9d 3ef6ef7a 3eaf09f2 3d2e4228 3f60f098 be36ffea 3f28fe6f -> 3fc11de8 bfbfb96c 3ef404e0", + "3db4b400 bc7e7620 3f624cf8 3f323577 bc0561e0 bd71f880 3f76f148 -> bdd773fa 3f490b44 3f4732c9", + "3e8eb4c6 3f9eb0e0 3ce48080 3e9fc116 3ef9486c be6fd9f2 3c6a6700 -> 3f9dc13b bec346df 3d290d28", + "be48e2b0 3f73d158 3f70b17a bdd113a0 3e8435e8 3daddb9c be29e9e0 -> 3f860d1c 3f8d31a7 3e230376", + "3f1be60c 3e986724 3e907f8c be33b17c 3f104e66 3f5a8fd0 3f9436aa -> 3ec01fa0 3f368caf 3f2036b9", + "3eb7db12 3ef2e358 3f272b4e 3f95db08 3f697552 3f8f1af9 3f606404 -> 3f452ec8 3f8c65a1 3fb87806", + "3f088a08 3eedce6c 3f47ae80 3f2fd19b 3f92aad6 3f402d32 bdef7634 -> 3f93a244 3f8611dd 3ceb3320", + "3f7efada 3f8a9fa5 3f65d090 3f3df350 3f723a64 3ed45e5a 3f69e26c -> 3ffc6582 3f3a5b6c 3fc87010", + "3f5f8886 3f26d37e bdd7cb4c 3ebdab48 3f7c8492 3f1378e6 3f5c0458 -> 3fc023a2 3ce0ff80 3f7f875a", + "3f8a8c63 3eb41a64 3f1f21d6 3f2d9c12 3eaca150 3f8741fa 3f9848d2 -> ba415000 3fe9d37d 400af65b", + "3f05401c 3f1ff8b6 3ec854f4 3f532ee4 bdd16372 3ec68b30 3f33edf9 -> bb06ac00 3e8c84cd 3f849f16", + "3e1a360c bdb7e828 3eec17e0 3eb98a8e 3f158e41 3f99ba27 3f75b066 -> bd83f7a8 3f2c18dd 3f0037c2", + "3ee7e0c2 3f226f36 3eaa40a2 3f5e1404 3e41828c bbba8c80 3f5d4bc2 -> 3eb4a103 be008804 3f994aa4", + "3fa1bec9 3f0224b8 3f0ce06c 3f967860 3e957a16 be6e814b 3f5694f2 -> bc8ecfc0 bfa6a71b 4001f063", + "beb30ff6 bdbb9ab0 be7729dc 3f0f0506 3f71a93e bd6806a8 3dda6074 -> becde785 3e1788d6 3f55751f", + "3de2f0e0 3e834c2a 3f956236 3f4c66d2 be6459ab bd20b8c0 3e957884 -> 3dc508c6 3f861633 3f4098d7", + "3efa2c08 3f2efaa6 be77be8a 3e1bd944 3f200498 3f9329f9 3e637930 -> 3f4e44a4 3ec935e7 bdf466a8", + "3f8fbea8 3d201848 3f87c408 bdd07fde 3f4ff90e 3d9a2f10 3f3151e8 -> 3f3da03e 3ddaa278 3ea96be6", + "beb07560 3f8ba508 3f663e24 3f5b1686 3ebdcbd6 3f8eac83 3e00407c -> 3f970d96 3ef39196 3f8e9bb7", + "befec47d 3ee7acd0 3f86e020 3f63e502 3f80fa5c 3f1a6457 3bd6d9c0 -> bd57e250 3f737c70 3fb0cdcf", + "3b861680 3ed4b7ca be394b3f 3e25dc3a be5da635 3ea51f00 3ea99b54 -> 3ed1b73f be3ac80d 3e247238", + "3fa21c0d 3f0ad00e 3f45fa6e 3f6ab874 be07d112 3ebb6d4c 3e14f020 -> bf87b49d 3ede4376 3c9a1400", + "3fa9b219 bd552868 3ed22a04 bdf27e7c 3f8f1cda 3f29fa27 3dbb94c8 -> 3fcb1b14 3f586261 bf99c413", + "3ec64abc 3c90c920 3f98a826 3f2803aa 3dc4db70 bdaa9ee8 3efab464 -> be971f5e 3f3da5d7 3f25f6a7", + "be44940a bd3afe38 3f03114f 3f5e0fde 3e97df36 bd0cf674 3f16d4da -> 3d04d70e 3f379843 3f554bc9", + "3f7f8780 3f7ddade 3f7c78f6 3f47629c 3f805b31 3de421e4 3d2a9e90 -> 3fff673b 3e577c5c be0b6c70", + "3e6d3558 bdfde25a 3f982f09 3e81b45e 3eff44c0 3f9d6a0c bdf0a6a6 -> bdff3d5d 3fc3765b bd062ee0", + "3e30da4c 3ec9567e 3f4234d2 3f91dd83 3f983517 3f951d8d 3f766d1c -> 3f219af6 3f7d01b7 3fa65183", + "3cf8ef40 bdfd18de 3f417364 3f6ffb06 3e1f8d74 3f8bb9bc 3f5805d4 -> be13f7f5 3f4aa7ba 3f755485", + "3e915530 3c3a4800 be4d5daa 3f521c20 3e1a1834 3f4e672e bb8d3ce0 -> be3f8ae4 bcda9c50 3f08d12b", + "3dde1bc8 3f2c9c0c 3eb49b2a be09f2bc 3e9aebd6 be4cdd40 be0877e8 -> 3f21a5bd 3e4db8ea be8b4d2a", + "be9f4e74 be7c371a 3e1ca5ec 3f58f90e bd813fa0 3eb6de0e 3f79fb50 -> 3dd539bc 3e77aaea 3f0d1096", + "3f6a3128 3f806e3e 3f7a54d8 3eb70ad8 3d4f57e8 3f6067be 3ef3a008 -> 3e398464 3fd55bc2 3ea066a6", + "3f7ca7fa bc9f4db0 3f8bb3cb 3f18d305 3e8a218a 3ee54828 3f9afd07 -> bef29d82 3f7d0915 40000188", + "3fa8e70e 3f91dabf 3f2ebe0e 3dc8e298 3e31b3a4 3f9182d2 be4ea6b2 -> 3e8e4b50 40173e5a bfe084d8", + "3f900a22 3e1f9cf2 3f831bdb 3f22f444 3f8eb936 3f588b16 3bc98400 -> 3fc520ce 3fe6bf56 bef329dc", + "beac38e3 3eb493d0 be23f822 bcfe95e8 3ef808e2 3f8f0542 3f46db14 -> 3eb9ef9d bf135038 be5e7e7e", + "3e3598c0 3d929dec 3e5a5ad2 be19bdc5 3f96ffb8 3f451582 3f1754a0 -> 3ea014e8 3e9e2ed6 bdf14886", + "3ed99142 3f02e5ff 3f04b04b be5e6b66 3f1a249c bdc0c044 3cdd0000 -> 3f191ddd 3c5b67c0 bf1e84e8", + "beb208b4 3f386b6c 3effb976 3f81b592 3ef0d2c4 3f6da4fc 3f8bcad5 -> 3f3db268 3e4e7126 3f19ffec", + "3f214700 3f9a0e92 3f789128 3e3e0c50 be608d5e 3e60f3f0 3f3e1350 -> 3e983518 3f1e260f 3efb739b", + "3f807d1c 3f8032cf 3ec18f6a 3f84862a 3f149990 3e3c7be8 3f1b4df1 -> 3f94e082 be8330e4 3f9feecb", + "3f6c8254 3e609d6c bae87780 3e79b5e4 3def8118 3eea0368 3e8cf176 -> befa137a bda6224b be2f7a06", + "3f835629 3e830ed4 3f1a8f1e 3e869b9e 3f30a31e 3f9d5584 be774846 -> 3f2556c6 40066820 bfa11ddc", + "3f813efd 3f17253e 3e5280b8 be7193c3 bd79a780 3f6f456a 3f691764 -> bf0adb72 3f8aaace 3f17d5a3", + "bc187740 3efc0b18 3f6a0d7a 3f931164 3e99b10c 3f8ca0a8 3f50dad0 -> 3efdf28c 3f673349 3f9250c6", + "3f58ab2c bde0bb48 bb272d00 be69d3d2 3f78c8fc 3f2b9a0e 3e97b5fa -> 3f305d46 3e924e33 bf12b925", + "3e2c15b0 3e80a1ec 3f04fdaa 3dd3c9f8 3e628d22 3f111cee 3f73f402 -> 3e21532a 3f0abe1c 3e82e442", + "3f43724c 3df01050 3f961aa2 3eae7314 3e7647d2 3f3be562 3f9f6e97 -> be8ed9da 3fc3d51a 3fbd5476", + "3d455d70 bd9ec3c8 3f82b8a2 3ec86810 3effb31e 3f72368c 3ee6564c -> bd9ee16b 3f88397d 3ec5eef1" + ] + }, + { + "glsl": "float cultmath_cycles_arcsine(float)", + "tolerance": "ulp-bounded, platform asin", + "platform": "Ubuntu 24.04.5 LTS; .NET 10.0.12", + "cases": [ + "3f74439c -> 3fa22776", + "beaa06dc -> bead5166", + "be9ed538 -> bea17f61", + "3f91179c -> 3fc90fdb", + "3e5e0320 -> 3e5fca15", + "3ed677b0 -> 3edd4b1b", + "bf9d7f24 -> bfc90fdb", + "bf44c25b -> bf606b2a", + "be9326d8 -> be9541be", + "bf047a79 -> bf0b3e4e", + "3f6fb444 -> 3f9b2514", + "bec3bc1c -> bec8d8b0", + "3ed94bc8 -> 3ee069a8", + "be732cb0 -> be75852c", + "bf525772 -> bf76dbfc", + "3f5f4508 -> 3f87a01e", + "3f5243a0 -> 3f76b93a", + "3f6f8480 -> 3f9ae13d", + "bf43af08 -> bf5ebe7a", + "3fb52362 -> 3fc90fdb", + "3eae8380 -> 3eb2152a", + "bf3ff8fb -> bf590ffc", + "3f7bb06c -> 3fb189e5", + "3dee93e0 -> 3def1ede", + "bfb0b96e -> bfc90fdb", + "bf454824 -> bf613cb1", + "3f23fb40 -> 3f31f9c7", + "be9b0000 -> be9d788d", + "3fb7c110 -> 3fc90fdb", + "bf0c30e4 -> bf145b51", + "3e855c0c -> 3e86ea5c", + "bf0e2123 -> bf16ae2c", + "3f72c708 -> 3f9fbe32", + "3f98afd8 -> 3fc90fdb", + "3d444840 -> 3d445b80", + "3faad2ae -> 3fc90fdb", + "bf934d07 -> bfc90fdb", + "beda7974 -> bee1b705", + "3f39c5c8 -> 3f4fe021", + "3f9b7f04 -> 3fc90fdb", + "3f22e64c -> 3f3091f2", + "beac2464 -> beaf8ff5", + "3f82cbbe -> 3fc90fdb", + "3eb9ca08 -> 3ebe20fe", + "3e7afb48 -> 3e7d909f", + "3fae80fc -> 3fc90fdb", + "bfba6d90 -> bfc90fdb", + "3e6a1620 -> 3e6c2cbb", + "bfad93e6 -> bfc90fdb", + "bf06f5fa -> bf0e2791", + "bfa3b08c -> bfc90fdb", + "3eb1c728 -> 3eb58f26", + "bf3c9dda -> bf540b87", + "3f7a2654 -> 3fada50a", + "3f878a44 -> 3fc90fdb", + "3e50f260 -> 3e526cb2", + "3e3d30a0 -> 3e3e487c", + "3f896174 -> 3fc90fdb", + "3f81d10a -> 3fc90fdb", + "bf033714 -> bf09c506", + "3fa3a04a -> 3fc90fdb", + "3f1281b8 -> 3f1bfaf2", + "bf34447a -> bf480038", + "bf9eb144 -> bfc90fdb", + "3f38d780 -> 3f4e86c5", + "bc0aa700 -> bc0aa76c", + "3e2d6bb0 -> 3e2e42b2", + "3f3b4634 -> 3f521165", + "3f9b7828 -> 3fc90fdb", + "bf27fccc -> bf373ceb", + "3f05df18 -> 3f0cdfe1", + "be80ff48 -> be826707", + "bfa520a6 -> bfc90fdb", + "bef55a1c -> beffdec8", + "bf389f89 -> bf4e35ee", + "bf52ac0c -> bf7770a7", + "be8b20f4 -> be8ce685", + "bf613498 -> bf89a1c6", + "3faf89d4 -> 3fc90fdb", + "bf9f3a6a -> bfc90fdb", + "bf506d04 -> bf73878b", + "bf8b4522 -> bfc90fdb", + "bee4b068 -> beed11de", + "3eecf034 -> 3ef65508", + "bf44cfcc -> bf60802e", + "3fb4e53c -> 3fc90fdb", + "bfa8c1a5 -> bfc90fdb", + "3fbc5058 -> 3fc90fdb", + "bfaeda6d -> bfc90fdb", + "3fac03f6 -> 3fc90fdb", + "beb34d9c -> beb72fc1", + "bf395cf6 -> bf4f47f8", + "3d721300 -> 3d723722", + "be860648 -> be879ab7", + "3fb7deb8 -> 3fc90fdb", + "bfb7cdb6 -> bfc90fdb", + "bf90e6dc -> bfc90fdb", + "3f42fa08 -> 3f5da675", + "3f9206c2 -> 3fc90fdb", + "bf9f8b49 -> bfc90fdb", + "be9cb1ec -> be9f4017", + "bf302154 -> bf423cdf", + "3f039538 -> 3f0a32b8", + "3f4cd500 -> 3f6d70e3", + "3ee655e4 -> 3eeee961", + "3ef23d20 -> 3efc5474", + "3e0c9370 -> 3e0d0572", + "3f9f079c -> 3fc90fdb", + "3e4b1770 -> 3e4c7278", + "3ec38128 -> 3ec898e5", + "bf831977 -> bfc90fdb", + "bedefe80 -> bee6b95e", + "3f99d7a0 -> 3fc90fdb", + "3f4216e8 -> 3f5c490f", + "bf996508 -> bfc90fdb", + "3f5dcadc -> 3f86219a", + "bef64c28 -> bf00795b", + "3eaa86d8 -> 3eadd91c", + "3f83b6a2 -> 3fc90fdb", + "3f4f0d0c -> 3f712d3d", + "be429d48 -> be43ce30", + "3e4ae8f0 -> 3e4c4306", + "3f18fb10 -> 3f23f68a", + "3faf7432 -> 3fc90fdb", + "3f98d500 -> 3fc90fdb", + "be8187e8 -> be82f43a", + "3f982f94 -> 3fc90fdb", + "3ef183b4 -> 3efb8213", + "bed4d500 -> bedb7e63", + "bf49041d -> bf672e44", + "bf986f2a -> bfc90fdb", + "3eeeeb04 -> 3ef89167", + "bf05421c -> bf0c27dd", + "3f8f151e -> 3fc90fdb", + "3f0fe420 -> 3f18cdeb", + "3fafda28 -> 3fc90fdb", + "bdd0fbe0 -> bdd15929", + "3e81a598 -> 3e8312ea", + "bfbe596c -> bfc90fdb", + "3e84234c -> 3e85a68a", + "be6569a0 -> be67605c", + "bf87c940 -> bfc90fdb", + "be6894b0 -> be6aa0e1", + "be7dd5b8 -> be804128", + "3f5e3adc -> 3f869213", + "bfb513c6 -> bfc90fdb", + "beda1868 -> bee14bbc", + "3f4d0a48 -> 3f6dc9cc", + "bf103915 -> bf1934b1", + "bf6e0d6b -> bf98d8eb", + "3f0b8aa8 -> 3f1394d7", + "3d0eedc0 -> 3d0ef52e", + "3f9dc660 -> 3fc90fdb", + "bf957fc3 -> bfc90fdb", + "3ee3217c -> 3eeb5460", + "3f7eecd0 -> 3fbd53ea", + "3e5b8e70 -> 3e5d4640", + "3f24acd4 -> 3f32e15e", + "3f8d9580 -> 3fc90fdb", + "bf4c111a -> bf6c2b60", + "3f48bf60 -> 3f66bf61", + "3f953182 -> 3fc90fdb", + "3e21e6d0 -> 3e229577", + "bf043606 -> bf0aee58", + "3d94f740 -> 3d9518f5", + "3c15e400 -> 3c15e489", + "bfb51e92 -> bfc90fdb", + "bfb53d7d -> bfc90fdb", + "bfa6e69d -> bfc90fdb", + "bf893f30 -> bfc90fdb", + "bf0815a8 -> bf0f7aa9", + "3f440720 -> 3f5f4747", + "3ea3ec88 -> 3ea6dcb3", + "bf3aa462 -> bf512482", + "beef311c -> bef8e0aa", + "bf2114d2 -> bf2e38cf", + "bf89904b -> bfc90fdb", + "bf278f84 -> bf36ac3c", + "bf7f527b -> bfbfbed1", + "3f8de8c6 -> 3fc90fdb", + "bfa9dbe0 -> bfc90fdb", + "bf8e558e -> bfc90fdb", + "beee0a24 -> bef79347", + "bf7c5d15 -> bfb37639", + "3e2dc4f0 -> 3e2e9d42", + "3e8c65a4 -> 3e8e3807", + "3f3be8c0 -> 3f530045", + "bf5a4296 -> bf82acd7", + "bf536685 -> bf78ba13", + "3f887baa -> 3fc90fdb", + "beae5e9c -> beb1eded", + "3f4133b0 -> 3f5aedab", + "3f25a7cc -> 3f3429d9", + "3f4f5e44 -> 3f71b78b", + "3f795244 -> 3fabc288", + "3de214a0 -> 3de28ad3", + "3e8fe798 -> 3e91deba", + "bf9af793 -> bfc90fdb", + "3f96f5d6 -> 3fc90fdb", + "bf241cb4 -> bf32255b", + "bfbff533 -> bfc90fdb", + "bf02913a -> bf09040a", + "3f1ad780 -> 3f264ac6", + "bf7dbab5 -> bfb8003e", + "3f8d0420 -> 3fc90fdb", + "3fa3c1c4 -> 3fc90fdb", + "3f9b7c4c -> 3fc90fdb", + "3eec6248 -> 3ef5b4fd", + "3f4c9908 -> 3f6d0d04", + "bedab4dc -> bee1f8b7", + "3f120d64 -> 3f1b6d33", + "bf218cdd -> bf2ed368", + "3e0ffd40 -> 3e1077d1", + "3fbfacb8 -> 3fc90fdb", + "bf78595b -> bfa9b078", + "3ecad4fc -> 3ed08d21", + "3e05a058 -> 3e06022f", + "beb65270 -> beba69cf", + "3f5058c0 -> 3f7364a8", + "3fa6360c -> 3fc90fdb", + "3f466ed4 -> 3f630d19", + "3f700570 -> 3f9b993a", + "3f68eb8c -> 3f924ad2", + "bf5ec490 -> bf871d4a", + "3f44b0ec -> 3f604feb", + "3e5adaa0 -> 3e5c8e2c", + "bfb0d056 -> bfc90fdb", + "3f814c00 -> 3fc90fdb", + "be4fda98 -> be514eef", + "3f6c24e0 -> 3f9650fc", + "3f16f760 -> 3f2175b6", + "bfae98b8 -> bfc90fdb", + "beaaf660 -> beae4f6a", + "3f92651c -> 3fc90fdb", + "3f8dddfa -> 3fc90fdb", + "3f2ed97c -> 3f407a92", + "be5e0a78 -> be5fd19b", + "bf794a5d -> bfabb123", + "bf166554 -> bf20c10e", + "3ec7db68 -> 3ecd50d0", + "3f0f3a38 -> 3f1800b6", + "bf9d2433 -> bfc90fdb", + "be1b6e70 -> be1c08d6", + "3f8cf9f4 -> 3fc90fdb", + "bf808b08 -> bfc90fdb", + "bf9ad138 -> bfc90fdb", + "bf62cba1 -> bf8b5315", + "3f264e58 -> 3f35049b", + "3e8f6f38 -> 3e916151", + "bf6c183b -> bf96409f", + "3fbd6d40 -> 3fc90fdb", + "bf5ce2fc -> bf853ada", + "bf0647e4 -> bf0d5ae6", + "3fb0bfca -> 3fc90fdb", + "3daba3c0 -> 3dabd75a", + "bf6fefd8 -> bf9b7a38" + ] + }, + { + "glsl": "float cultmath_cycles_arccosine(float)", + "tolerance": "ulp-bounded, platform acos", + "platform": "Ubuntu 24.04.5 LTS; .NET 10.0.12", + "cases": [ + "3da419e0 -> 3fbecb6b", + "bccc7dc0 -> 3fcc41e7", + "be84d748 -> 3feaa812", + "bf1cae69 -> 400eaef8", + "3f94921a -> 00000000", + "bfa5cfb4 -> 40490fdb", + "bf55d834 -> 4023cf55", + "3fb03a14 -> 00000000", + "3ef75c60 -> 3f888580", + "3ede7da8 -> 3f8f8549", + "3f99f728 -> 00000000", + "3efe6a30 -> 3f867f99", + "bf8e3141 -> 40490fdb", + "be1ccb60 -> 3fdcbd18", + "bf6312e3 -> 402a57f6", + "beca9b18 -> 3ffd2360", + "bfa261f2 -> 40490fdb", + "bf89ca7a -> 40490fdb", + "bf42ce22 -> 401be09e", + "3f00b738 -> 3f85a0b0", + "bed23de4 -> 3fff3969", + "3fa77bd0 -> 00000000", + "bfaed740 -> 40490fdb", + "3ef4a6c0 -> 3f894b3a", + "beccfb6c -> 3ffdc928", + "bf07ef06 -> 40085b31", + "bf451f9e -> 401cc736", + "bf47de6c -> 401ddd75", + "3f714a60 -> 3eae6856", + "bd425a20 -> 3fcf2341", + "3f291678 -> 3f596c94", + "be5beb10 -> 3fe4c47d", + "bee15480 -> 4001b23e", + "3f0babcc -> 3f7e6355", + "bf65a9c0 -> 402bc6c2", + "3fa770a8 -> 00000000", + "3f492144 -> 3f2ac257", + "bfbcdb75 -> 40490fdb", + "3f3ac980 -> 3f40c4f2", + "3eb5b340 -> 3f9a9ffb", + "3f8dc7e8 -> 00000000", + "bce9f900 -> 3fccb7df", + "bf61ba49 -> 40299f62", + "3d7ab1c0 -> 3fc1390c", + "bf6990c5 -> 402e118e", + "3deffa40 -> 3fba075f", + "3e8561b8 -> 3fa753cc", + "bf888ac6 -> 40490fdb", + "3fbb7d54 -> 00000000", + "3ec05018 -> 3f97c656", + "bf8c0f8c -> 40490fdb", + "bf72b2f0 -> 40345736", + "3f244db8 -> 3f5fba77", + "3f8a5ea0 -> 00000000", + "3f792f18 -> 3e6cd375", + "3e8b1738 -> 3fa5d8c1", + "be22d5b8 -> 3fdd80c8", + "3f434100 -> 3f340ba0", + "3fa4e7a8 -> 00000000", + "3e444ce8 -> 3fb05f1e", + "3f798034 -> 3e673b6f", + "3fb9031c -> 00000000", + "bf886b1a -> 40490fdb", + "bf782c2b -> 403931de", + "3fa31430 -> 00000000", + "bda8b740 -> 3fd39e5f", + "bf1020a8 -> 400acdb6", + "be203938 -> 3fdd2c29", + "bf418917 -> 401b63ed", + "bf31f434 -> 4015b8bd", + "3ea32260 -> 3f9f8e03", + "bfa5867c -> 40490fdb", + "be9cbcec -> 3ff0e2c4", + "3ec4b080 -> 3f969789", + "3f65276c -> 3eec9418", + "3f8f186c -> 00000000", + "3f30b1e8 -> 3f4f1b53", + "3d953310 -> 3fbfba8c", + "bde0dee0 -> 3fd7250e", + "3f7b8300 -> 3e4007f6", + "3f35601c -> 3f488ecf", + "bf9a050a -> 40490fdb", + "bf3ed914 -> 401a5f88", + "bf6eddac -> 40318382", + "bee80d14 -> 4002a2a1", + "3dde4b30 -> 3fbb2422", + "3f24b788 -> 3f5f305c", + "bcacf040 -> 3fcbc3a9", + "3f893e58 -> 00000000", + "3ea99550 -> 3f9dd998", + "bd069420 -> 3fcd44ad", + "bfbd0fdc -> 40490fdb", + "bfa1c31c -> 40490fdb", + "bf7649b8 -> 4037606a", + "3f61596c -> 3efd1d42", + "3f94c4ca -> 00000000", + "beecf324 -> 400352f8", + "bfb4c70e -> 40490fdb", + "3e93057c -> 3fa3c820", + "3f2b8624 -> 3f56293a", + "bf51e010 -> 40220aae", + "bf8aa06c -> 40490fdb", + "3f9839c8 -> 00000000", + "3f28eed8 -> 3f59a156", + "bfb8b492 -> 40490fdb", + "bfa68910 -> 40490fdb", + "3f5bab88 -> 3f0a0d4d", + "bf9f0544 -> 40490fdb", + "bfa83514 -> 40490fdb", + "3fad7f22 -> 00000000", + "3f8a6cd8 -> 00000000", + "3fa25218 -> 00000000", + "bf20a328 -> 400ff19a", + "bf98d9da -> 40490fdb", + "3f7bb318 -> 3e3bf528", + "3f2d8a48 -> 3f536e92", + "3f30df4c -> 3f4edc91", + "3faf03ba -> 00000000", + "3f7bda60 -> 3e38908e", + "beab420c -> 3ff4b7c8", + "3f463190 -> 3f2f737e", + "3f7546dc -> 3e94b710", + "3e8aea00 -> 3fa5e480", + "3ed35888 -> 3f9298c3", + "3f567510 -> 3f13e3ce", + "3e9761c8 -> 3fa2a464", + "3fbc3ca0 -> 00000000", + "bf5814bd -> 4024d6ee", + "3f807f68 -> 00000000", + "3f9dceea -> 00000000", + "3da55340 -> 3fbeb7c5", + "3f1a4008 -> 3f6c92ef", + "3fa491d4 -> 00000000", + "3f385e00 -> 3f44484f", + "3e9ac620 -> 3fa1c0e6", + "3e9541ec -> 3fa3329f", + "bf647da0 -> 402b1eac", + "3dc1c080 -> 3fbcef2e", + "bf7d7488 -> 404007c7", + "bf26f46a -> 4011ffc4", + "3f401de0 -> 3f38d7ed", + "3ec58420 -> 3f965e36", + "be53f568 -> 3fe3bfec", + "3f9bbf36 -> 00000000", + "3f3ff0f4 -> 3f391bdb", + "3e4bca48 -> 3faf6abc", + "3f268370 -> 3f5cd53c", + "3fb716be -> 00000000", + "bee3f9a8 -> 400210a3", + "bfa6186e -> 40490fdb", + "bf83aadc -> 40490fdb", + "bea90210 -> 3ff41f1c", + "bf65687c -> 402ba1e9", + "bf60dc3d -> 40292a7b", + "3fb2aa4c -> 00000000", + "be8e4dd4 -> 3fed1cd8", + "3e1528a8 -> 3fb659bb", + "bf3938b6 -> 40184cc9", + "3fa93ce8 -> 00000000", + "be746820 -> 3fe7e919", + "bfa2c5b0 -> 40490fdb", + "3e4f0108 -> 3faf01c2", + "bf3f095b -> 401a71a7", + "bf8603ff -> 40490fdb", + "be66b098 -> 3fe625d8", + "bf82b32b -> 40490fdb", + "3fbdc044 -> 00000000", + "3e1bfb68 -> 3fb57cec", + "3b693c00 -> 3fc89b3d", + "bf4eedda -> 4020c5fc", + "3d903f40 -> 3fc009fd", + "bf6758c4 -> 402cbe7a", + "3f5b7c00 -> 3f0a69c1", + "3e0b3b20 -> 3fb79a9f", + "3ed48238 -> 3f924702", + "bf8e4841 -> 40490fdb", + "beab7798 -> 3ff4c5fc", + "3f0df694 -> 3f7ba4b1", + "3f94dda6 -> 00000000", + "bf5c7d84 -> 4026f34c", + "3f9296ba -> 00000000", + "bfbada1e -> 40490fdb", + "3f8cf40a -> 00000000", + "3f4d2fb0 -> 3f241766", + "3f42f38c -> 3f348341", + "bf8b6a47 -> 40490fdb", + "baaefc00 -> 3fc93b9a", + "3f29ffe4 -> 3f58350a", + "3f530968 -> 3f1a0a6e", + "bf6b7605 -> 402f4022", + "bfad549a -> 40490fdb", + "3faa5d8c -> 00000000", + "3e8b7c88 -> 3fa5be6e", + "3f3fa580 -> 3f398dc6", + "bf61690a -> 4029746e", + "bf73a264 -> 403516b7", + "bebc692c -> 3ff94c5a", + "bf28f55c -> 4012a9b0", + "bd6d56c0 -> 3fd07ba1", + "3e8aae98 -> 3fa5f3ee", + "3e5dc820 -> 3fad1e26", + "bf803db4 -> 40490fdb", + "bd95de00 -> 3fd26fe0", + "bf91877c -> 40490fdb", + "3e071cf0 -> 3fb81f98", + "3fb00188 -> 00000000", + "3ea005f0 -> 3fa05fd8", + "3eef9178 -> 3f8abc70", + "3e538aa0 -> 3fae6d6e", + "3f80f28c -> 00000000", + "bfb8b58f -> 40490fdb", + "3f8ba9cc -> 00000000", + "bec5e808 -> 3ffbdc93", + "3f2ef754 -> 3f517c44", + "3dedc420 -> 3fba2b00", + "bfa7eb92 -> 40490fdb", + "3f19d82c -> 3f6d14f8", + "bd439080 -> 3fcf2cf7", + "be9df714 -> 3ff1354c", + "bf22d797 -> 4010a7a6", + "3ef5e250 -> 3f88f15a", + "bf2e7f5c -> 401487c0", + "3f53f570 -> 3f186782", + "bf13a0bf -> 400bde55", + "bf7444a6 -> 40359c87", + "3e753350 -> 3faa1c74", + "3ea5d1f0 -> 3f9ed880", + "bfb214c0 -> 40490fdb", + "bef7905c -> 4004d487", + "be087200 -> 3fda2b21", + "3f41a410 -> 3f368680", + "bf966338 -> 40490fdb", + "bf633400 -> 402a69e8", + "bf1b9bfe -> 400e5865", + "3ed820e8 -> 3f9147e9", + "3f25a8e0 -> 3f5df472", + "3de83c40 -> 3fba8414", + "3f3cf710 -> 3f3d9017", + "bf54978f -> 40233e7d", + "3f62f07c -> 3ef653fe", + "3dc943e0 -> 3fbc7668", + "3f83efe4 -> 00000000", + "bf857162 -> 40490fdb", + "3fa89228 -> 00000000", + "bf7a0ae6 -> 403b3a54", + "bf71fcca -> 4033c9e4", + "3e5ebc60 -> 3facfedf", + "3f8b6378 -> 00000000", + "bf5e1304 -> 4027bceb", + "bf88c8f2 -> 40490fdb", + "bd57a940 -> 3fcfcdf1", + "3f970238 -> 00000000", + "3f930316 -> 00000000", + "bf6bfdd5 -> 402f9730", + "3fa53312 -> 00000000", + "bf1a0e9a -> 400ddba4" + ] + }, + { + "glsl": "float cultmath_cycles_arctan2(float, float)", + "tolerance": "ulp-bounded, platform atan", + "platform": "Ubuntu 24.04.5 LTS; .NET 10.0.12", + "cases": [ + "c08cbc16 c1549681 -> c0349aac", + "418c8108 41948858 -> 3f41f3ee", + "c0bf7f32 402de990 -> bf928096", + "c0ea0e7c c17780b4 -> c02ccb58", + "c1853a3e 4183660c -> bf4ad4c8", + "40cc3750 c18864ad -> 4032239a", + "c1841fce 414eb7b4 -> bf682df1", + "3f7f11c0 41915dcc -> 3d605f59", + "c1190690 40822148 -> bf959a14", + "41235546 414a8e7c -> 3f2db91b", + "c173027e 4157ae48 -> bf584be7", + "c16aa78a 419f0cba -> bf22b489", + "c19da8f3 411cc704 -> bf8e0081", + "41504298 c1432d3c -> 4014b8bf", + "41976732 4165afb0 -> 3f6bff17", + "c12faa83 c19c5692 -> c0284d67", + "c0aa038c c0cb2194 -> c01c7634", + "c0df2a78 c0a67120 -> c00d8b25", + "4144767c c11a39a5 -> 400f2006", + "c00c8aa0 4194be56 -> bdf0c4af", + "3f876310 c1937378 -> 404564aa", + "41636814 c1172a84 -> 400a13e2", + "3f81e2e0 bd4f6800 -> 3fcf71a7", + "41309010 c08f8f1c -> 3ffa7c90", + "40982a9c 3f904760 -> 3fab4541", + "40a969dc c10c0b7e -> 40263f44", + "c01ff888 c177395f -> c03ecc3a", + "c14d5f03 4007ceb8 -> bfb41738", + "c194f77c 418d7450 -> bf4faeb6", + "4192314a 4086f2c0 -> 3fac080a", + "411b37ca c171da02 -> 40248b70", + "c1664f18 c130242c -> c00e512f", + "40eced38 40bd9198 -> 3f655f42", + "4104386c 411d5130 -> 3f32ed70", + "bdd98800 c15cd654 -> c04891c6", + "c161bae2 c19f6675 -> c021a16c", + "c15bccb4 4139d89a -> bf5e709e", + "c1065de6 c1860dc7 -> c02b5428", + "419a2318 416c82f8 -> 3f6a973f", + "bf911740 3eafb040 -> bfa36fa4", + "41961b7c c01fd768 -> 3fd9fffb", + "4042f5d8 c00cea20 -> 400c95f1", + "c12f053d 418e307c -> bf0d3c4a", + "403d4400 c11dc866 -> 40366a62", + "c15831c7 412e7716 -> bf644dcc", + "c0d29330 41698de0 -> bed8d810", + "c0fd3872 415963f8 -> bf0702af", + "c131bb1f c074e670 -> bff386a5", + "417f6828 40a71880 -> 3fa09868", + "40497b80 41717390 -> 3e529a28", + "413af82e c196608f -> 40257713", + "4179eb80 bfb8a2f0 -> 3fd4d959", + "c0987864 40a703b0 -> bf3d6a78", + "c1703eca 40bc5288 -> bf993fcc", + "414f2488 c180a1ba -> 401dad4f", + "4036b5f0 c15671f1 -> 403ba162", + "bf97a3d0 c0046bb8 -> c027c818", + "40ae84d8 c0f9a4b6 -> 402203ec", + "3feb4440 40f9d6e0 -> 3e6cc1c5", + "419f7088 411a15a2 -> 3f8f723b", + "c188441a bfeff970 -> bfd71812", + "40560bd0 410fd5de -> 3eb65b86", + "414c7344 c10b48c1 -> 400ace33", + "40ff9e9c c0ea6154 -> 40140629", + "402e4ee0 4176dbb4 -> 3e32eb7e", + "c14b83b7 c0be8c1c -> c0008d76", + "c105dbe6 4071a620 -> bf92cc07", + "410a8552 418c7c0c -> 3eea844b", + "3ff0f540 c1782e2d -> 40415521", + "c18b7f2b 4075e3a8 -> bfad4d6e", + "414c9fc4 418893dc -> 3f249745", + "c033b3b8 c18b7729 -> c03ed777", + "c13f3667 c152d7a7 -> c019eb30", + "c086fb50 41627eb4 -> be9446ba", + "c13dde75 41858b9e -> bf1e348f", + "41655ddc c13d8347 -> 4010b9bb", + "40a95660 41584940 -> 3ebf0aa4", + "4141fbc4 c0ce1146 -> 4003c77a", + "c0091050 c155ea5c -> c03ee580", + "40b8f0c0 c18079b9 -> 4032f416", + "4189d944 4144f1e0 -> 3f735430", + "c186b53a 418c246a -> bf44003f", + "41852020 c1330c77 -> 400a6b89", + "416f69f8 4170a200 -> 3f486974", + "41145fc0 40fc94a8 -> 3f5d99cc", + "41250f00 c029a528 -> 3fe94135", + "40a7d388 c07a5f68 -> 400d8c45", + "4186baee c161afee -> 4011273b", + "c1988920 3f471480 -> bfc3d822", + "3f70c440 40be95d8 -> 3e2060cf", + "417834e8 415d5098 -> 3f57b555", + "c1775234 40c0f8f8 -> bf99734e", + "c1974114 4198ffc8 -> bf479800", + "410c0ec4 bff12930 -> 3fe432a6", + "413a6dc4 c09ce414 -> 3ffc0b0b", + "be987ac0 c097edfc -> c0450d7e", + "bfa53460 4194fa8e -> bd8db6e0", + "40d38cc8 c19c290d -> 403429aa", + "415e9230 bea6b840 -> 3fcc0ec1", + "c1612e94 4199eb08 -> bf21ad98", + "c102419c 3f3e0580 -> bfbd6c6a", + "c171e10c 3e75cd00 -> bfc70799", + "c159f7c3 c040e368 -> bfe4ee5c", + "403a4bd0 c12cbcf7 -> 403834f8", + "418569b0 40c75764 -> 3f9b4d8e", + "c0ebecc4 4188a552 -> bed0a0ee", + "40b612c0 419e96ba -> 3e8f1b96", + "c1392859 c184cf09 -> c02219d5", + "40f88828 c0379bc8 -> 3ff65a7b", + "4183657e 418c205a -> 3f40d57c", + "3d64c400 c049c398 -> 4047eda0", + "c184e5e2 c0ba5c6c -> bff438b2", + "c13cf1d2 c09df406 -> bffbbd3f", + "41951ea0 40d3e958 -> 3f9d5e14", + "4117a1c4 4182e3fa -> 3f0666f9", + "c100421b 3fa11c00 -> bfb52067", + "c0a4c048 3fd9b1a0 -> bfa0392a", + "c0bce6f0 c0a756e0 -> c012ed67", + "410f31a8 4089ad2c -> 3f8fb3fa", + "beb17800 40836d64 -> bdac6ea3", + "c0724d88 bee688c0 -> bfd836b1", + "3fb83bc0 c1693dec -> 4042c367", + "c18c3dd4 4027c610 -> bfb60fc6", + "4118ffa4 bf8ea000 -> 3fd7e8ff", + "41231d74 404d91d0 -> 3fa1fe4e", + "c0e92c5a c04e1b80 -> bffe543d", + "404ffd08 c1396f46 -> 403790b4", + "bf50eb60 41702f48 -> bd5e7502", + "c0294f90 412b4d2a -> be780e6d", + "c0fe6df0 41350240 -> bf1cd3f4", + "bfd3b0d0 41824f24 -> bdcf3ab0", + "be8bd740 c19d7a4a -> c0482c8a", + "c0b82468 4135e61c -> beefe839", + "400eab20 c180166a -> 4040354a", + "40b741d8 415a8318 -> 3ecb4b31", + "c0b19f72 c1844941 -> c03455ba", + "418bd268 c0f5d76c -> 3ffe1262", + "3fa6a0a0 c19bf37a -> 4044cb60", + "417687a4 418fb914 -> 3f357bee", + "c104b28d 40b23950 -> bf7abbaa", + "40b00cb0 be7bb000 -> 3fcec6d5", + "41836b9a c15bc2b2 -> 40111937", + "40697890 417344c4 -> 3e7121a8", + "4190121e c158f0df -> 400dd562", + "c18bdd8b bf6a2c00 -> bfcfc0bd", + "418b5438 4191f240 -> 3f431ff0", + "c0f7e4e4 410571fe -> bf3f9e8f", + "c163d334 bd98d600 -> bfc9bb97", + "419e953a 3f8fe060 -> 3fc1cfc4", + "4132d446 c10e61c5 -> 400f90be", + "c19cdca2 40b258f0 -> bfa59d20", + "41528b14 41844d2e -> 3f2c0f6e", + "c133cbd1 c12c03ab -> c015618c", + "bf32bb00 c1111506 -> c04424d8", + "40e3794c bfa93e10 -> 3fe099e8", + "419cd3d2 bf1c60c0 -> 3fcd0c96", + "bf800240 40cf58c0 -> be1ccef2", + "c1630418 4194bc52 -> bf26e0ae", + "419ee38a c0d13810 -> 3ff1c4a8", + "c0554ad8 bf756f80 -> bfecea8c", + "4155c1e0 c086c8b0 -> 3ff02782", + "c19438df c155bc54 -> c00c82ae", + "4181ed52 c072d0e0 -> 3fe66fdc", + "41335fee c12dcd2f -> 4015c95e", + "c1571882 c194fd20 -> c0210be4", + "c19a88b4 c0b6e8d0 -> bfede30f", + "c153621e c19b2864 -> c022ca69", + "40a5abdc 419f6cf2 -> 3e822341", + "40d30c58 419f1e6c -> 3ea3ee9c", + "418c0490 c0b33c62 -> 3ff0b4e5", + "c0831f14 40e27288 -> bf065d6a", + "bf2ad860 4075b2b0 -> be303f57", + "bf04a640 bffc8c00 -> c038a00e", + "bf41b3a0 40b8c260 -> be056f50", + "4021d860 c14d4bd9 -> 403c9ba3", + "3d83a000 40cb8cf8 -> 3c258915", + "c178b13e c0fba980 -> c0028267", + "c0108e98 40935624 -> bee9826e", + "40833c68 40d08ed0 -> 3f0fc87b", + "c19da024 4148e864 -> bf806f92", + "bffb1cd0 c11d5e81 -> c03c7636", + "c179fc86 40b76dd0 -> bf9c0d9d", + "c0005968 40aa3818 -> beb897d2", + "c0ecc7dc bfcd7c00 -> bfe46896", + "c19594c8 c161ddfc -> c00deb56", + "c1000d87 419fc51c -> bec32579", + "c0814a50 c18dda43 -> c03ab943", + "c186e3b7 c15b7765 -> c0103ce8", + "4183a496 c01779a8 -> 3fdb58d2", + "40e51c20 bfe49ed0 -> 3fe85ad7", + "4187b382 c1690142 -> 4011ef14", + "40d37970 419b19ac -> 3ea83333", + "3fa7f3f0 c0b5afc8 -> 403a86cd", + "c122c32b 416a72a0 -> bf1b5a62", + "40374b70 c19b6a93 -> 403fb1c2", + "c08588a0 c19f609e -> c03bd8f2", + "419cbe90 c170df46 -> 400e75e0", + "4182e2b4 c1643109 -> 40126ac4", + "402cd728 41599b94 -> 3e48b939", + "c1627cfa 4162998c -> bf48ffb6", + "c1692d92 c19935dd -> c01f6e46", + "408f1580 c056afb0 -> 400db942", + "4172c1b0 3dbe8300 -> 3fc846f4", + "c119945d c18e7e5c -> c0296d8e", + "c1300d51 c108ac40 -> c00ec793", + "410261e6 c1588362 -> 40265f3f", + "419adcac 40054e48 -> 3fbb5784", + "41798160 c0ecc4b0 -> 4000e25e", + "40639318 c1702fdd -> 403a2d2c", + "c1794797 c1829f3b -> c0184bca", + "c0904192 c0035a40 -> bfffbf67", + "41787da0 c19a2a35 -> 401da5e0", + "4120e654 c1014c4b -> 400fdab9", + "c19cf973 c10fc5e1 -> c00003f7", + "c16179ee 418b34ce -> bf2e441b", + "40654b40 c1892934 -> 403be0c0", + "c103616f 414ff484 -> bf103e9f", + "c0e6cc90 4180e95e -> bed77994", + "3f774000 c120975b -> 4042ec1e", + "c17c8e57 c1963f44 -> c01c5483", + "c180a1c3 c145c673 -> c00e7a0b", + "40b4ffe8 c10980e4 -> 4023ced8", + "c0f26e1a c12a40ee -> c02176dd", + "c19a3d49 c01f59c8 -> bfd9804c", + "c12a60a8 40709f00 -> bf9d9e26", + "400ba8c8 c0126960 -> 40184e8a", + "4112e32a c18e9f42 -> 402aa0a2", + "bfaa2d50 40ef51f8 -> be3427dc", + "c16ae95c 406f7cb0 -> bfa91e64", + "40d2db80 405037e8 -> 3f8e5b81", + "be920280 419b18c2 -> bc70fbde", + "41823e9c c10676ec -> 4003074a", + "40fc01e0 40a9689c -> 3f7a9c4a", + "416ade10 c15a3b2c -> 40147298", + "c12b4626 419bd752 -> bf00a1ec", + "413a29aa c0cd07be -> 4004befe", + "c199d0c3 c1866487 -> c0127d6a", + "419e0288 c1425a56 -> 4007d1b2", + "4144a97c 4083fd0c -> 3f9f9ec3", + "4104e2a2 3f327440 -> 3fbe57fd", + "c10cd1b9 40378e30 -> bfa0bd4e", + "c192b29d 40097948 -> bfba22d0", + "c099012e c16212d6 -> c0342dc3", + "c0ca6b24 c12622ea -> c0260b50", + "c0b58ba8 40a9e178 -> bf518e60", + "412cbc18 4189ca6a -> 3f0f552f", + "4057eb98 3f763b00 -> 3fa58352", + "3fc08c60 c177750c -> 4042db49", + "c10a43a9 c0be1246 -> c00b121d", + "4061f8c0 40e4294c -> 3eeb6b1a", + "c0aa3df6 4165c098 -> beb5a9ce", + "c13c904c c1220f4d -> c011f7c3", + "4141fe18 c13691ef -> 4014db0f", + "c043e348 40bf5874 -> bef239e5", + "c18ca1cb c112eb54 -> c00356b2", + "4172ff80 3f98c0f0 -> 3fbf064d" + ] + }, + { + "glsl": "mat3 cultmath_snoise_hessian(vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "421a5dd6 c20d13f3 c19ee861 -> bdf800bd c0bf607d 3f0478ed c0bf607d c026e359 3fc92e66 3f0478ed 3fc92e66 40f69a3e", + "422877bc 42313e36 c16ab2c8 -> 40b23350 c06e81bb c103a1b3 c06e81bb c12b88de c020f5bd c103a1b3 c020f5bd 413cc35a", + "4223c60c 40a062d8 c1a79ba9 -> bf0d7a9c bdebbfd4 c0bf9b6d bdebbfd4 419b5ab3 40cc039e c0bf9b6d 40cc039e bff2ba4b", + "414a8268 41f0ad50 411f76cc -> 40d16bd8 be02b672 4084cae7 be02b672 40a2f301 41133cbd 4084cae7 41133cbd 41336aa5", + "c1e250d1 42101d06 41cc6188 -> c14e658e 3ff65696 c0f2c4f4 3ff65696 40466903 c0a3f638 c0f2c4f4 c0a3f638 c103d2ef", + "bef1a080 4087baf8 42182c52 -> c15c2b1c 4187c50a c07afde3 4187c50a 4022a36a c06161b8 c07afde3 c06161b8 407aceac", + "4224f1d4 c08d82d8 c2420fca -> c14900b9 411649d8 405f32b0 411649d8 40cac27d bdeba4f6 405f32b0 bdeba4f6 3fb84681", + "c23c3f42 c20bd418 c0fcdb98 -> c0ea8c9a 4062c26d 4049b436 4062c26d 3e7d0ffa 3fbdeec9 4049b436 3fbdeec9 41463bad", + "c155de64 41ebd498 41c8784c -> bf6673a5 bfa2f467 3f9bb310 bfa2f467 bfac0e73 40c1428f 3f9bb310 40c1428f c106b5a5", + "c205b529 41b29f7c 4199e5c0 -> c1cbc919 402d719d 406c3232 402d719d c17fe4ff bfe6f289 406c3232 bfe6f289 c18814af", + "c2000b95 c224e890 41ca6d8c -> c0f6e859 409c87aa c158b213 409c87aa c0339f9b 3fbe4ea4 c158b213 3fbe4ea4 407a9b4f", + "c1cff306 c23620d1 c0c979f0 -> 40610726 40c0d6be c086a9eb 40c0d6be c14a8431 411ae804 c086a9eb 411ae804 40307e7b", + "c1dddb04 413a4cf0 c203e75e -> c0f50343 c076e900 bf57c923 c076e900 41be7c79 be9eedc2 bf57c923 be9eedc2 c14b7d21", + "422c4268 c0b95e08 c238bd7d -> c0f601b3 3f825962 4082c944 3f825962 40b2eca1 408e52f5 4082c944 408e52f5 c1e34537", + "c1339510 41c05810 c230be49 -> c08aa658 be0a2e56 40bee553 be0a2e56 c11add95 41486935 40bee553 41486935 40636b52", + "41292074 c23c2127 423121c8 -> 411870f3 c04f884d bf81c747 c04f884d c12d87d9 3fdeedcb bf81c747 3fdeedcb c0c5b195", + "c0825fd8 422b47be c21d2bbb -> 41712089 40c3a8b0 402aad60 40c3a8b0 41ab6db7 409355de 402aad60 409355de 40ce869a", + "c1ffed1e c16313a0 c0f37fa8 -> 40a13732 3fd76a40 c16dcd79 3fd76a40 c083459a 41138561 c16dcd79 41138561 4122f5b9", + "3fbfdba0 420e9d18 4246c026 -> c15bbf3e 41241672 4066c887 41241672 416fd626 4150f857 4066c887 4150f857 400a9343", + "42182742 40af7aa8 c20cac14 -> c09ffd3a c08e86e2 401cb991 c08e86e2 413557f5 c0670d40 401cb991 c0670d40 40eeaa9b", + "41245ca4 41c2f668 4202bc9c -> 41855d80 bffb2d9e c0108c3f bffb2d9e c0a5230c 40f2adeb c0108c3f 40f2adeb 3ea0e126", + "411cfd28 c0aa9e80 41aa7e70 -> 40bbd460 c08728bb c00e8c9d c08728bb 40a123d5 3fe02c58 c00e8c9d 3fe02c58 4137c7fc", + "420aa6ee 423ed11a 41fc7bb0 -> 41087273 c13fd3ff c096517d c13fd3ff 3fb5ef24 c1249e8b c096517d c1249e8b 419c1d9d", + "c1913ffc c1b5eb7f 422a6422 -> c0c6dfd9 c132729c 3f83c419 c132729c c18118ac 4093ebeb 3f83c419 4093ebeb c12da53e", + "41a82760 4240af6a c242849a -> 41ae5112 3f831916 c1090c6c 3f831916 4184abdf c01694d4 c1090c6c c01694d4 4206ca7e", + "423eadb4 41629808 c1100080 -> c082223d 4130288c 400e9d08 4130288c c1078dc0 c0111e1f 400e9d08 c0111e1f bfec832a", + "c15b74a8 41d08098 41d416e4 -> 418b97cc 3f0ff6e6 c05807ee 3f0ff6e6 410b600a 3f03d660 c05807ee 3f03d660 41816af4", + "41f634bc 41a52da0 41ec1000 -> c0387002 4133431d 40863202 4133431d 3ffce237 40d04eed 40863202 40d04eed c1614640", + "41087a74 4247eafa 41b7b8b0 -> c1b4eca0 c09d540f 4071942b c09d540f 3fce3407 409d01d7 4071942b 409d01d7 c0a6174d", + "c188b28a 41b40f40 c1f97bd1 -> bf1f2c76 40f5aebe 40aca9e9 40f5aebe c18e9c68 409a0b31 40aca9e9 409a0b31 c0a8c457", + "c0bf7b18 c17c5310 c22f5c19 -> 41256e04 4180b93a 4143c095 4180b93a 411c47e1 3fd64472 4143c095 3fd64472 40975b41", + "c23f3b49 c189a980 419eb218 -> c1bae9fd 407917d2 3ffe36cd 407917d2 40d78fcb 40e48698 3ffe36cd 40e48698 40deeafb", + "c1e6f433 41e7b6e4 c1a50050 -> c1668693 bfc64d55 3e9bbcd4 bfc64d55 c03a687f 40f17e2c 3e9bbcd4 40f17e2c c0a53848", + "c177f608 41cf4260 c232f242 -> c0140ee8 c0eea613 c0585a55 c0eea613 413b01b0 40a4de85 c0585a55 40a4de85 c154b280", + "c2151c0f c20fabfc 4178f5f8 -> 40f32d99 bfff380f bf1e69b6 bfff380f c101afd2 403b4b34 bf1e69b6 403b4b34 c13b896f", + "c1ff1fbd c040a3f0 c145d150 -> 408aec76 40b85c9e bf91f071 40b85c9e c0fc3ba8 40a25015 bf91f071 40a25015 c13fb140", + "c10fad6c 40751290 c1e411d5 -> c01cb6db 4130fa05 c0e83c96 4130fa05 c12499d2 c1206f5e c0e83c96 c1206f5e 408ba7e0", + "410b0114 3fe08d80 41eb5e14 -> c12cca58 c09889b4 41328c29 c09889b4 c115842a 3d91ecd4 41328c29 3d91ecd4 c0019ef3", + "c13ade20 41ebf994 c2391b9d -> 41d473ac bf979af4 c0c6d376 bf979af4 41056ba7 bdaf8e42 c0c6d376 bdaf8e42 40524f97", + "c23b4b64 c242df52 c0a9f650 -> 41080aea 40d62b89 4055d420 40d62b89 40930318 3c7b08ec 4055d420 3c7b08ec c102440a", + "424162e0 3fe00660 c1c66d0c -> 4116c471 c107b2b4 408dc9e8 c107b2b4 405c3cc5 3e006b4e 408dc9e8 3e006b4e c0b962cc", + "414beefc 42174f64 422c1f04 -> c0b26437 c0d72824 4064b253 c0d72824 c04b8e2f 4172cd17 4064b253 4172cd17 c00d20b6", + "4211c03c 41969df4 417610b0 -> 408cc0c4 c0e5de7d 4069992f c0e5de7d c12344dd 408ddc79 4069992f 408ddc79 c0121482", + "c193bb4a 41d44f98 420cca90 -> 400a8f37 4037383f c0b86599 4037383f 409cddc2 c1942f1f c0b86599 c1942f1f 4134486f", + "c2197ff8 c240dfa8 c24760e5 -> 407fc341 3ea520c4 410a359c 3ea520c4 c102ae41 4136debc 410a359c 4136debc 41264b24", + "41a9fb6c 41906cd8 40d21670 -> c12f5e17 bf3a6580 412f765f bf3a6580 4149b7fb 408dd126 412f765f 408dd126 c07e4484", + "c210357d c1194614 403f5390 -> 4032283a c0dd91a9 c0720584 c0dd91a9 bc474598 40d20540 c0720584 40d20540 c13ea232", + "c16abd50 42279216 c1fa9311 -> c0f843e7 c0aa658f c00bf39a c0aa658f 4183bb2e c09a1a8b c00bf39a c09a1a8b 408b8af5", + "423d4b02 420d5058 4201e6d0 -> 41df8e0a 40cadf16 c0a7a102 40cadf16 41082678 c0cfbdeb c0a7a102 c0cfbdeb 41045c6a", + "c1ba1646 415df0f8 4052e760 -> 3edcdd7a 40d13393 bf541691 40d13393 4099dc04 c0184578 bf541691 c0184578 c0ec83cc", + "4180e950 c2002eb6 41dd7588 -> c13e6f88 40495e7c 41216c6c 40495e7c c07f91f5 3ff60ab0 41216c6c 3ff60ab0 409227a4", + "420abea2 c15d8184 c1cebe06 -> bde90954 beb80316 3d8268ed beb80316 bfc26834 c02a3c73 3d8268ed c02a3c73 c09be0bf", + "41f08888 bcbe7000 c1bdf6c3 -> c191f340 3f8b8875 c0e1a09a 3f8b8875 c18b0ce6 3d5392fa c0e1a09a 3d5392fa c1e1f6c9", + "41b43cf0 c192a036 41e14d90 -> 4161c540 41819026 c0621f00 41819026 bfc9826f 4081978a c0621f00 4081978a c0b31f78", + "41b20f00 c2220db6 41da52b8 -> 40b4f530 c0168c90 407f41ce c0168c90 c0cb09e6 41397d7e 407f41ce 41397d7e 41500d45", + "c15b4de8 c03bfc20 bcdf5800 -> c1243480 c0afef10 3ec0c8d8 c0afef10 c0ca8688 40dac630 3ec0c8d8 40dac630 41534870", + "41ea1fdc 41889588 c21a39a3 -> c129d55f c153b120 402752c0 c153b120 c09e0d65 c0d79062 402752c0 c0d79062 3f7ec7a0", + "c035e6a0 421cea1a 412dc8cc -> bf5e9773 3fe6ae77 c11fedeb 3fe6ae77 40a37103 c0cb1985 c11fedeb c0cb1985 c0b6e246", + "4226cbfc 415048cc 411db870 -> 40c6b49f 4114501a 41107d0f 4114501a 406d47fb c0959ad7 41107d0f c0959ad7 c037ccbc", + "c22decfd 4176c2f0 c23e00f2 -> 41c500a7 4073a054 3fb81f70 4073a054 40d46f99 c03ebbc5 3fb81f70 c03ebbc5 c07b701a", + "c21dc7ca 411b2d7c c2342d45 -> c00160a5 404e287a c0c615dd 404e287a 4153ed35 c0c3d9d9 c0c615dd c0c3d9d9 41898853", + "c217aa4b 4176b6d0 41095a10 -> 4110f3dd 4015fbff 40b1053c 4015fbff c028a55c 4034dc46 40b1053c 4034dc46 c027e7b9", + "c229f033 c1b87d35 417a02e0 -> 419ec7ab c11805c0 bf028f54 c11805c0 41cefbcf bc8bf3f8 bf028f54 bc8bf3f8 410b92d6", + "41cffc3c 4224b970 c1ff638a -> c16a3aa2 bf554a9c 40f556b2 bf554a9c bf244c4f bfdde171 40f556b2 bfdde171 41346b9d", + "c19d83a2 c1094fd4 c225016a -> c060c21f 3f5a150f 40178dd6 3f5a150f c0af4cc7 4120c338 40178dd6 4120c338 3ffff720", + "41c69ce4 415124ac 42019fcc -> bf2d8cd8 c09cc5a5 408b1fb7 c09cc5a5 c163c9d9 40c68c0b 408b1fb7 40c68c0b c050e2da", + "c109cb94 413079f0 c13bbf9c -> 4195e3ba c11702c5 c0650c38 c11702c5 41acb500 bec602cd c0650c38 bec602cd 40fea9ed", + "c18bfa8e c021b120 423b317a -> 4097f96c 4144a9a0 3f81a145 4144a9a0 3ffd6522 3f934310 3f81a145 3f934310 411ff767", + "c1025f9c c1f859db c1aa319f -> c0b85c4a c1408ca8 bfe04681 c1408ca8 c14a7c9e c186b0f3 bfe04681 c186b0f3 3f61aba3", + "c204b770 422bf2a6 41b91ad4 -> c202bfcd bffc2a3c 40b84f2d bffc2a3c c15647a8 3ef6ace3 40b84f2d 3ef6ace3 c11f8549", + "4164cb80 41bc6284 420a3776 -> 3f272e10 c006f521 4058cae5 c006f521 410823d3 3ed37a86 4058cae5 3ed37a86 4106fe31", + "c1d1f4de 413f9908 41afc90c -> 40c80091 c01905f6 3e89b3e8 c01905f6 c1233fd8 4000243a 3e89b3e8 4000243a 4088cca6", + "41b9a818 4122c730 c0bddb48 -> 405051b5 40c6f94e c1091b2e 40c6f94e 4061969f c0bba973 c1091b2e c0bba973 c0c2d2a8", + "c1fa5a50 c1a9c68e c1ef024f -> 40a909f4 c08875c9 40e46643 c08875c9 3ef4ca71 40dfbaa1 40e46643 40dfbaa1 c17eda04", + "4209635c c23aee2f 41cf22a4 -> 40095ede 3ee4a494 c10161f5 3ee4a494 407a7cbb c13f5d37 c10161f5 c13f5d37 400dc964", + "422d7822 c2049c9a c00c1f20 -> 40ac3aca c110a7f6 c10727a9 c110a7f6 bf1a53fe 403fc59d c10727a9 403fc59d c0312150", + "400739c0 c2048274 4247c90a -> c058d81b c1545521 40dbdec8 c1545521 c035758a c03ec5be 40dbdec8 c03ec5be 40ab0396", + "41db9ca4 417217a0 c2366dbf -> 41994ebe 40dad4be becd3c81 40dad4be 4136f5b6 40debe06 becd3c81 40debe06 40766ec0", + "4163bbd8 41e06af8 c217198f -> 40f26ad5 40ad2872 3fbbea82 40ad2872 c092ab39 407f2c09 3fbbea82 407f2c09 41067844", + "c2275ec0 41a1db38 c06255f0 -> c19a3497 c136925a 3f26131b c136925a c1b97957 40bb9e59 3f26131b 40bb9e59 c11804bf", + "c1a1215a 4222c73c c1806280 -> c127c01b c01420f5 bdf0357f c01420f5 c186cfbf c09be272 bdf0357f c09be272 c18b413c", + "4229f34e c21934c1 c20177d0 -> 413724f6 40909813 401c2994 40909813 416860e2 4127955d 401c2994 4127955d 41c8a654", + "c183d274 c22dc762 41eb8b94 -> bff0cbc8 408f671d c06661bd 408f671d 41d1d516 40802424 c06661bd 40802424 40926b75", + "c15397c0 c241859d c23c68a1 -> 4068bac9 c0b548fb c1002d64 c0b548fb bf3ad18d be8db2d6 c1002d64 be8db2d6 3d9b0d48", + "c13a9330 c1da8b7a c18dfc7a -> 3ea0080c 415a72c6 4003df8f 415a72c6 4119dfd5 4140e95b 4003df8f 4140e95b c087ebcf", + "c1fedd7f bfec1460 c0b96718 -> c0f6c334 bfe2545a 407a30e7 bfe2545a c057f864 3f87beab 407a30e7 3f87beab c02e6cf6", + "c1e8bfaf bfc20120 c23f9054 -> 416b26ac 40c50371 3f5a5c74 40c50371 c098c834 c102e859 3f5a5c74 c102e859 41301a23", + "41f75244 416b53d0 41d0ea34 -> c09a3d2f bfdc4d41 c08ab38c bfdc4d41 c1479c9e c104ff4f c08ab38c c104ff4f 3f91bfb3", + "41b988c4 4213648e c22654a6 -> c128d565 410bb9b8 c10b9552 410bb9b8 c10192cb 3f7e3ed3 c10b9552 3f7e3ed3 41554557", + "41f14a68 41185a70 4207b0c4 -> 40e3251a 3ff041c3 bfe1514c 3ff041c3 c09788de 40d82f6c bfe1514c 40d82f6c c06941bd", + "411bf850 4170cb38 421fc430 -> bf3dadc8 becb41a7 410febcc becb41a7 3eb0a472 3fc2c528 410febcc 3fc2c528 c0c6ef46", + "423e69f6 421b6386 c13eaa0c -> bf874d07 4042a209 40d36023 4042a209 bd2b1620 404922f9 40d36023 404922f9 409ddddc", + "4210b018 4227700e 42264692 -> c037f54f 409ca2cf 3f1184c6 409ca2cf c1a72840 40ce2d16 3f1184c6 40ce2d16 41061755", + "4104248c 411d8570 c21ed538 -> 41446ff7 c139817d 40091670 c139817d 40f413ad 412479ac 40091670 412479ac 3f989a19", + "4192f08c c20aa673 c20afcd8 -> 4104f344 c0a1b172 410498f3 c0a1b172 be947356 408c79dc 410498f3 408c79dc 41627335", + "423c31aa c12e338c c0f1a2e0 -> 3eee3ac0 3dd2af8c c11399ba 3dd2af8c c10a3403 c0ae37f9 c11399ba c0ae37f9 c000a301", + "41b120fc c07a24c0 c1a0d3c2 -> 4127cabe bfdf1dfd 409637ec bfdf1dfd c0cc13f2 40bfab06 409637ec 40bfab06 40cc5b0f", + "419026a8 42150118 c1e204b5 -> 414a44a1 3f3a20a6 3f293b51 3f3a20a6 bfb6432c bffa9d0d 3f293b51 bffa9d0d 4169a5d9", + "c0b4a858 bf8739e0 c1c01b6e -> c08c7107 40a65ab1 bee18d98 40a65ab1 40fde83e 40caa648 bee18d98 40caa648 418b2eb4", + "40facd30 c1f5a226 c1c9329f -> c10456a3 40dcae6e c0a6e570 40dcae6e c0710e78 3ecf3ac5 c0a6e570 3ecf3ac5 4031a8ef", + "c223232a 40571920 c03ddfe0 -> 41aadd3f bd84408e 40819066 bd84408e 41619328 bfe1b0a2 40819066 bfe1b0a2 4195a83c", + "42361504 41d837f8 c156e1ac -> 4164e110 bfcd7a14 407b585a bfcd7a14 c0c1c6d1 41348cee 407b585a 41348cee 40abfe9d", + "c2142cd2 c1143b04 c1815284 -> c16c9ffc 40270a66 410d2a97 40270a66 c01002d6 c0e28550 410d2a97 c0e28550 c08bba8f", + "4230ac46 c1903daf 40c97a78 -> c12c4dd2 beaffe68 3f2d30b0 beaffe68 c12ee66b 413a0b15 3f2d30b0 413a0b15 c1d8cf93", + "4028c8b0 414a5c14 421a8e9a -> 41850b4c 40ac9bee 410477cf 40ac9bee 417b1eda 40efc57f 410477cf 40efc57f 41ab3f74", + "422744e2 c215cf23 bf212680 -> 40d79c28 c0a31d5c 408af3d2 c0a31d5c 417b02bd 413b550d 408af3d2 413b550d c077b07d", + "412dc7c4 41d12570 c010e8f0 -> c0a1a897 40a3bcf2 c04dc126 40a3bcf2 417b6bc7 3ff333d6 c04dc126 3ff333d6 c155a439", + "417f7ed8 c227eb4a c2124718 -> c1206afa 3f791c7a 3e543638 3f791c7a c004dbde 3fe25ce0 3e543638 3fe25ce0 4082c143", + "4080d528 4226eac2 41de636c -> 41727c4d bff2aa16 c133c1dd bff2aa16 40e8e732 c08a2318 c133c1dd c08a2318 40af74f1", + "41918d14 404ff000 c1218ab0 -> 404faaba c052841f 415e87b9 c052841f 412a52cf c0d42afe 415e87b9 c0d42afe c05edb5a", + "c2179ccc c1ad531b 41b48240 -> c10186a5 c1005148 befe6f95 c1005148 c0c2cf94 414b5afc befe6f95 414b5afc c192aa6d", + "4185bfc4 bf74ed00 c22e1036 -> c0dd197e c1a57abc 41884967 c1a57abc c10ba478 c05820a8 41884967 c05820a8 40264834", + "4154231c 41b6c680 c13b09b8 -> c08da471 c01ec1a0 c1310422 c01ec1a0 40ab31c9 bf85d17b c1310422 bf85d17b c158151b", + "41e57728 42085e7c 424181de -> c12e7593 40c1c524 c151ecd7 40c1c524 c0fc9986 c0da7cb5 c151ecd7 c0da7cb5 403f9e21", + "c2258b1a 41dfc870 c20f8374 -> 406a7d1c 40c91641 3f2421d8 40c91641 c1242bea c161023e 3f2421d8 c161023e c0208032", + "41bccda0 c20a7937 c1cb2bdd -> c09432c0 416c881e 404d3698 416c881e 41362b8c 4185a046 404d3698 4185a046 bf6de721", + "c18721ea 40226120 c159aab0 -> 41b44470 c07c34e3 c021703f c07c34e3 4148f8be 3effb711 c021703f 3effb711 417e99e1", + "41d4edc4 423be7b4 c0db1e58 -> c10de7bf 3ffbf6f9 3fc96483 3ffbf6f9 c11c855c 4134fe73 3fc96483 4134fe73 c0d85e5c", + "41d8ea80 c0d816f8 c0951920 -> c09e51b0 3fb6d0a6 baf7a850 3fb6d0a6 bf1135b1 bf99a310 baf7a850 bf99a310 c071ca8d", + "c1832dcc c1081684 420d313a -> 41ad8f44 3e9929b2 c1527ce6 3e9929b2 40f1576b bfe0f59c c1527ce6 bfe0f59c 40b615de", + "410c577c c0a79ae0 4215f23e -> 4184c742 400f4aa2 409fc7b9 400f4aa2 c10a4b18 40a70899 409fc7b9 40a70899 41313b22", + "422fb96a 42004912 c239754a -> c10ac5d8 3f26da71 c1272ef7 3f26da71 c0b1d8b7 406bddb6 c1272ef7 406bddb6 c05103ad", + "4206ee2e 420facaa c2119546 -> c1923691 3e37f666 c09d590d 3e37f666 c181427f 40155ef8 c09d590d 40155ef8 c20872a5", + "42009ed0 c1ab87c6 c124c98c -> 417e32ae c10276cd c06cb637 c10276cd c146b9ab bf9f9a23 c06cb637 bf9f9a23 c14d23f8", + "c21bc22c 4200b65e 4228343a -> 41e36314 bfd7a09a 412232a8 bfd7a09a 41379035 bf6bb319 412232a8 bf6bb319 4151a888", + "bf241b40 40eb5680 c19f9f03 -> c0d60c67 c0004ab3 419c206f c0004ab3 c06780c2 be92e362 419c206f be92e362 c19ca5e5", + "42453c5c 41f367ac 41d2c7f0 -> 4136ea99 c083a7cd c09a6c0e c083a7cd c0f57369 c1192eb4 c09a6c0e c1192eb4 c1857d3b", + "404c7a50 c16ea200 c2452711 -> c16105f9 3f926149 40812343 3f926149 c0983006 c040309f 40812343 c040309f 417aabe5", + "c239f800 c1684ebc c1952286 -> 40c46471 3d29740b 407b4116 3d29740b 4112f355 4122da64 407b4116 4122da64 417f8c0e", + "c1a4b628 421e6aa2 c230d0d5 -> c12c845e 401cca39 4176d1dc 401cca39 bff0ae5d 4134917d 4176d1dc 4134917d c10ee785", + "41324bb8 c1a2c0a8 c1952e3e -> c1a69699 3fee90e8 3feacdd9 3fee90e8 4115716d c10318c1 3feacdd9 c10318c1 c1197ba8", + "4040c580 c1f0b498 c12ab89c -> c08ec680 bfdebba7 bfc6cec3 bfdebba7 41236c92 3dfaf1cd bfc6cec3 3dfaf1cd c1553b0b", + "c21c7060 c20d4483 42379b26 -> 400ccafb 412e2493 3f93d00b 412e2493 bd1c707a 412903da 3f93d00b 412903da c195e5ab", + "c21e0e2a 421f78a0 c1a44bc1 -> c1a74db5 4090aa94 c0b3b048 4090aa94 c11d306e c0bbfeb3 c0b3b048 c0bbfeb3 c0331bf3", + "c21c00a8 3f740f00 c1d02c17 -> c09debaa c15716c9 c02f951d c15716c9 c15caf31 c0915f0b c02f951d c0915f0b 4135ba2f", + "423ac7b8 4178e440 c20cceaa -> c04c3a77 405e9147 40257973 405e9147 c1c14350 401dd913 40257973 401dd913 c12a9e51", + "3f8cff40 c1b1f4a7 420f9252 -> c017afa2 c09bc2be c09c52df c09bc2be c1fd3639 3e26ecbe c09c52df 3e26ecbe c1109125", + "c20ad3a2 c17b4d08 41311a24 -> c1849b3e bf2c7de7 4118f9f6 bf2c7de7 3f5cf473 4036c0d0 4118f9f6 4036c0d0 c1831850", + "c22432be c231b1c6 c2214adc -> 408b7cb7 c0e0a6f5 c0debec8 c0e0a6f5 c197b74f c01587bf c0debec8 c01587bf c05ee724", + "42131950 4221b16a c05a33f0 -> c2121d7a 3fab0790 3fd938db 3fab0790 c17cf7f6 bf5290b7 3fd938db bf5290b7 c18f2123", + "41b237f0 408a4a18 42394206 -> 416cd8ed 40ab1085 41324e85 40ab1085 c1354e18 bf7434d6 41324e85 bf7434d6 c0143963", + "c228c472 c1e7e83d 42439c70 -> c1216ddd c0d2ecd0 bfe0affb c0d2ecd0 c090209c 40623399 bfe0affb 40623399 4179d0aa", + "c2269b44 4100c5f0 414442ac -> 41d5d1f7 3f830619 408e66d2 3f830619 c0162193 4093bd55 408e66d2 4093bd55 40c8cfc4", + "402e2620 c1388034 c0ea8570 -> bf9a17ba c13433c8 40031a2d c13433c8 4106b90b c1187cd4 40031a2d c1187cd4 4132fbd0", + "c17daa9c 421b4a86 42223b36 -> 416d7ca6 c14f920c 40fb9a5e c14f920c 40a10db5 40810a50 40fb9a5e 40810a50 40ff9856", + "c0476270 c0f9bd98 42088744 -> c11426d9 41607163 413ceba8 41607163 c0865496 3d481922 413ceba8 3d481922 3fad28e5", + "41d5ddf4 c22cbfb8 419f6684 -> c19461a2 400d91e2 41166fdb 400d91e2 c108d5fa bfdedbb7 41166fdb bfdedbb7 c19df918", + "c205c299 41e279e0 413d93d8 -> c0e533c1 408e74df 408fd6ea 408e74df c0967bab bf923045 408fd6ea bf923045 3e21ecec", + "c1f0c64d c084cb78 423572f0 -> 3ff5c51f c0ef4349 3fa6eb48 c0ef4349 c0d599ea 40b9e9fd 3fa6eb48 40b9e9fd 408a3cf4", + "41a244b0 c0be0748 c20ea886 -> 410bba70 3ffdbbcb 408ace7a 3ffdbbcb 413eba6b c0bc462e 408ace7a c0bc462e 42031e88", + "c1a2c696 c1cf135e c1cdebdb -> c12203e5 bf28fdec bfc63f56 bf28fdec 40e66fd6 40d2d92c bfc63f56 40d2d92c bfdbcbab", + "bf3066c0 c13ca88c c1674288 -> c0f19a73 403e206c bd662ff8 403e206c c033ea61 41397dcd bd662ff8 41397dcd c04e251b", + "c186cfd0 c23b3c36 c1a0774e -> c08c561a c06a4780 c106bf1b c06a4780 406783df c14b7837 c106bf1b c14b7837 411c9cc5", + "c1c764f8 421962fc c229f86d -> 415f9a3a c020cd79 c0c5fe5f c020cd79 c0b74f20 bf6d2723 c0c5fe5f bf6d2723 c1935bae", + "40220ab0 42418598 421d25ba -> c0d0a217 bfdeeb10 c1147489 bfdeeb10 40d67a7d c04e477d c1147489 c04e477d 3ff1d8c7", + "c0d8e808 41f92e08 c090ee48 -> c16730e0 c05f64cc 3f179d09 c05f64cc c1f4d5c7 40f8040c 3f179d09 40f8040c c197685f", + "41a416a8 41410da0 415617b8 -> c0a799bb c0911119 4075cd4a c0911119 4194467d c112407b 4075cd4a c112407b c128b606", + "c1c3a442 c21fd5ab 42067122 -> 411ef5a1 bf5bcff0 4126b86d bf5bcff0 413f2910 40d920ea 4126b86d 40d920ea 40013d13", + "41d552f8 40b6f488 41d018a0 -> c00598ec 3f7747d3 c18c9807 3f7747d3 3f947f60 3fb4c471 c18c9807 3fb4c471 40bff187", + "c1788bbc 42179eb4 41c94aa0 -> c153d19b c0d70981 41340bae c0d70981 c1151c95 c04add40 41340bae c04add40 c10f9b8b", + "c239d67e c13ef670 c2100d9b -> bfcd780d c13d7c20 c12c768d c13d7c20 4114a2fa 4182490c c12c768d 4182490c 3f95a543", + "c0046d00 c1d774a5 c20e965e -> 4058bb66 4090c16e 4070a113 4090c16e 4075cd3c 41384d1e 4070a113 41384d1e bf838b71", + "c1fcb581 420b56f4 3f1d2a80 -> be9b695c c055b79d c1448f8c c055b79d 40cb36d2 40f9158a c1448f8c 40f9158a c08bc39a", + "40a05eb0 c2110e3f c12fedf8 -> 41746c63 3e7f13bf 3ee299b0 3e7f13bf 42150776 c0f9f0ea 3ee299b0 c0f9f0ea 4175e011", + "40861758 3fd42ec0 c1fc4567 -> c091c6cf 3ebff49e c0ef505e 3ebff49e c18c9f6e 3fc28b02 c0ef505e 3fc28b02 c153e760", + "4146aec0 416072f0 41ef6eb4 -> 3fd73af4 c00fac65 4070b081 c00fac65 41239ef4 40c36143 4070b081 40c36143 40f2d6ce", + "41b47e78 41d573b4 416b3e30 -> 408b6677 c120ce51 bffe9514 c120ce51 40b81a01 406a67e7 bffe9514 406a67e7 408472f0", + "bdde9000 42471702 41fff760 -> c17c1f91 406bea2b c0bf424a 406bea2b c1908104 410ffdd9 c0bf424a 410ffdd9 c1d30073", + "3f746340 c237912a c20fb404 -> c13fb3bf 41203f96 40bb6539 41203f96 c0a16087 3fc7d175 40bb6539 3fc7d175 bf8a7554", + "c1159c3c 41b529d0 4201f74c -> 40fa2791 bf0b1b1a c0ee9d19 bf0b1b1a 4128f477 40b182e9 c0ee9d19 40b182e9 41c84ea8", + "41188c34 4242bb08 c20adaea -> c0534671 c0963cbd c042a95d c0963cbd 41588d8c c09532f0 c042a95d c09532f0 404e982b", + "4098f840 c1e3b7fc 3e904c00 -> c1255993 3f598c14 3f1136aa 3f598c14 c0ec5d81 c0c899d6 3f1136aa c0c899d6 418d05b0", + "422e152e c2359885 41ca7fd4 -> 419a97f3 40dd4b9c bfb35169 40dd4b9c c1134070 bf25013c bfb35169 bf25013c 40d66005", + "41c77830 c1c98480 42394010 -> 3f8c303c 3ff1f15d 40cc5758 3ff1f15d 40f7bcd0 3ca97220 40cc5758 3ca97220 c18113d4", + "42336d8e c20a0082 bfd5cb00 -> c1484f62 40bb8599 3fbf577d 40bb8599 c0af0bd7 41072973 3fbf577d 41072973 41466712", + "c1ccfd2b 41aad5e8 4106237c -> c1d7a973 c11662bf c11c6d99 c11662bf c193206e c0beb38c c11c6d99 c0beb38c c1a7b4cf", + "41724f50 c20f0232 4226c1d6 -> 40bd2b7e bf0085cc c04d6133 bf0085cc c0af447e 413fab78 c04d6133 413fab78 41a8549b", + "423854f8 413e774c c21b1b25 -> 3fdb0235 40bd50dd c0665062 40bd50dd 40838cac be54a160 c0665062 be54a160 c0d5e8be", + "c21e2a3c 40698cb0 c13b527c -> 3fbaf677 c0ae0df6 c0a82d14 c0ae0df6 402a55b3 bfef09e4 c0a82d14 bfef09e4 c0600547", + "c1901293 423be7a4 c1f85251 -> c1cf6106 c0dc8d64 c0f4c262 c0dc8d64 3ec4001b 40420e52 c0f4c262 40420e52 c05c2340", + "c246e25a 41de189c c2173df4 -> 3f745785 bf8507b6 40ae520c bf8507b6 c1a9bfd0 3e1efb4b 40ae520c 3e1efb4b c083f00c", + "4190fabc 4235e8ca c20bc946 -> c09261e0 c04ff3ab bed6e876 c04ff3ab c103ae64 3f89adb3 bed6e876 3f89adb3 c1a5d68c", + "c1d24126 4245a3e2 c19f0518 -> c181ae11 c14e6ef9 c08b2627 c14e6ef9 41a67fed 40a9395f c08b2627 40a9395f 41030617", + "4191796c 41972d04 4116d4fc -> 3f76930c 403091a7 3f9d7efd 403091a7 c18e3857 413ca581 3f9d7efd 413ca581 40e5f1a0", + "c2358892 423e8326 3fef8340 -> c13aa8d7 c03f9826 416738f9 c03f9826 c08c102d be570da2 416738f9 be570da2 401b8f54", + "41931ef8 40a11950 42091786 -> c13ff9d0 c0a6f156 c0b147c2 c0a6f156 418394c4 bf1e8c19 c0b147c2 bf1e8c19 407359c0", + "c182abf0 c1bb5fbd c189f83c -> c15160d1 bf552892 bf80df20 bf552892 404a85f4 c00b71ab bf80df20 c00b71ab c0d40b28", + "40b618f0 41cc0a38 41065c68 -> c131f59d 40bbc9c9 41439f0f 40bbc9c9 c12fea89 bf5df083 41439f0f bf5df083 c10181bf", + "42233576 41573850 c1538b34 -> c122446a 4025a55d 404859e9 4025a55d c17f120b 3f94e087 404859e9 3f94e087 bf511571", + "c237bfc6 c0b5b5d8 418f1670 -> c0f16aed 4085edda 40ff6178 4085edda c18c26a9 41078b1a 40ff6178 41078b1a c08cf27a", + "c2180aca 413879e0 c2298029 -> c1033aa1 bf6bc8e7 bfeeefa9 bf6bc8e7 c19042a8 bf9509d6 bfeeefa9 bf9509d6 c1545cb4", + "40cb4890 41c53ce4 c03ce8e0 -> 41535771 c087e551 c07b0faa c087e551 c008d46d c0c76a88 c07b0faa c0c76a88 bf6af1b9", + "42087e04 c1ba1f9f c1efd299 -> 4032a0a4 40dc9352 40bcf17c 40dc9352 4109af77 3f1fbce3 40bcf17c 3f1fbce3 c089fa7f", + "c185ca24 c2455e03 41af8e24 -> 40ac606b bee0eb9b 402b5338 bee0eb9b bf814bfa c0e93322 402b5338 c0e93322 404c0dae", + "c1ade92b 423bd720 c094c5a8 -> bf5e02dc c08ff38c 40b497dd c08ff38c c1d6e61e 40ca3c6e 40b497dd 40ca3c6e c153aacb", + "c18de6d4 4225dd8a 41646ab8 -> 40dbed4f c09fec0d c069a3f2 c09fec0d 41ac07a6 408590d4 c069a3f2 408590d4 bf0266e4", + "4115a300 c0fdcdc0 424275a0 -> c0f975e9 3edc4932 bffad649 3edc4932 c1a34e1f bfc09238 bffad649 bfc09238 4173ec44", + "40809ed8 42414cae 41a32f08 -> 41096e78 411bd8ef 40fbe7bd 411bd8ef c14fecc3 c0adc51a 40fbe7bd c0adc51a 3dfdc992", + "4210d2f6 c0ad2bc0 c23ef8ce -> c199e4d7 bf9d8863 c04ef3d2 bf9d8863 c11d259f c036c782 c04ef3d2 c036c782 c09bd526", + "4072af10 41da8fd0 c18fca96 -> 3e6917a9 c0fb724b c123735f c0fb724b 405d44cd 4011b905 c123735f 4011b905 bfa21165", + "41e2330c c1f2c19a 40a2d4e8 -> 4187378e 412a81ba c08b4a9d 412a81ba c0750cae 3faa1f42 c08b4a9d 3faa1f42 3ff629c9", + "4143c8f4 40c63bf0 c22a87f6 -> 41a19263 3f2971ad 41414792 3f2971ad 414ab3e4 bf9e1e40 41414792 bf9e1e40 41cae3cf", + "3fe6ad20 bfde34a0 c1d83698 -> c1cf318a 409d0331 c005ceb5 409d0331 4158f9ca c04bfc46 c005ceb5 c04bfc46 c13d4bf4", + "c234b557 42091178 c1ad9a0f -> c014bd1b 40407443 40fdd086 40407443 405d4810 c0d64f0f 40fdd086 c0d64f0f c1367694", + "41640348 c24670e6 c1c0a3b7 -> c079db3a 412a6b22 c0034e4f 412a6b22 4115e4f2 c0387b68 c0034e4f c0387b68 c067ee0f", + "412cf344 c1b49099 41e45bf8 -> 41929b3f beea662b 40851ac3 beea662b 418b1ec6 3eadeb1d 40851ac3 3eadeb1d 418738b5", + "c213d031 4108a380 41afe114 -> c0d7aa0e 40ea696c c0a11b79 40ea696c 4114003a 41190336 c0a11b79 41190336 c094ff14", + "41b40508 c0a94430 c23efd03 -> c0fc095a 40cd0758 c0a6e3b0 40cd0758 c0c8d8ce c0cb80fc c0a6e3b0 c0cb80fc bfb06c57", + "419a2b2c 40ff0ae0 41534724 -> c13f0c9f c1700ca2 c10d08a3 c1700ca2 40ab3419 bff99499 c10d08a3 bff99499 c0b5877f", + "c14c5eac 41a12c3c c19f782d -> c037b22a 3f8b7bd3 3fa430af 3f8b7bd3 c0fcc5b8 c08c99d6 3fa430af c08c99d6 c1ae2a24", + "c0a6ae08 c19d59d9 bf15edc0 -> c1c15d59 c0f48d2c 411bf521 c0f48d2c 419952e9 bf0526bc 411bf521 bf0526bc 40654542", + "4217fbfe 40a00b40 41f80594 -> c09d3103 40c84717 beb9c2f4 40c84717 41ad9391 41498320 beb9c2f4 41498320 4109e7a9", + "c204938c 4180325c c113c17c -> 41771b70 4000c554 bdd776a9 4000c554 4219550d c0317fa7 bdd776a9 c0317fa7 4165033a", + "c14042f8 41f3ae5c c0d98690 -> bef762f2 c0837d69 4009c1ad c0837d69 c1081988 c0e1f3af 4009c1ad c0e1f3af c1238ee6", + "c10b2814 4090f0c0 40f9a680 -> c1361198 3f101e91 408452c9 3f101e91 3ffce09a 404abd41 408452c9 404abd41 41534946", + "41a28550 421f1308 423fbd96 -> 40e04b91 c00e4559 c1169969 c00e4559 c09305f5 402ab592 c1169969 402ab592 c140ae32", + "c0b0b510 c1c4d3b8 c2035d2c -> c014dde9 4035ad7a c029a24d 4035ad7a 41899e22 bfd18518 c029a24d bfd18518 41800468", + "c1d24d94 c1141374 c1f9c1ef -> 4039c628 3fb111f8 3e144958 3fb111f8 c095ddfc c0147d35 3e144958 c0147d35 3ed011f8", + "4120a8a8 c230e8ff 41c78f70 -> c110d993 3e75050b 40550789 3e75050b c0e7f59f c188b60e 40550789 c188b60e c1777bf7", + "40357a00 422bdca4 4240e624 -> 3f8812e7 3f8096b9 4117ebe3 3f8096b9 41009a2d 4076c031 4117ebe3 4076c031 c004f954", + "c0bace00 c20db2ec 41e0f07c -> 4124327e bf862c9d c02c5af1 bf862c9d 420e1147 4022f7b9 c02c5af1 4022f7b9 40be03cb", + "422ba0ca 412081a8 407be640 -> c1c28fde 3e9a10da c0ac5b7a 3e9a10da c0c4adbd bfe95160 c0ac5b7a bfe95160 c0ee7b94", + "41e71560 41d209a8 c0939270 -> 3fb3235e c10c729b 3eb63282 c10c729b 413f3a6c 4107812c 3eb63282 4107812c 40107921", + "c0a2a538 c0c17d10 41367a18 -> c14743c8 bff8b959 40e928e6 bff8b959 c1367600 40341a3e 40e928e6 40341a3e 4165327e", + "c1438694 41c88118 41e0a364 -> 40e52854 c103c30d c0c0a5a4 c103c30d 41948f36 4123bc0a c0c0a5a4 4123bc0a 418c6aba", + "c1a9bd49 c19666ec 4220b962 -> c1335c4a c0a9726d 40dac25d c0a9726d 4192292c 3fc5d408 40dac25d 3fc5d408 c0808c3a", + "c0b18e98 4243d2ee 41919ca4 -> 4063ac95 3fc0ee54 3f162903 3fc0ee54 c006508d 3e326f1a 3f162903 3e326f1a 3f606db0", + "417450d0 422afef6 c0a80030 -> c13b5693 c0c57dd5 400fde83 c0c57dd5 3fcff9b7 c0c63c22 400fde83 c0c63c22 c17f5932", + "c2145eea c1e75dee 421e57f0 -> 4108f50a 4135bd2c c1189f21 4135bd2c c061d0cb 40826d7b c1189f21 40826d7b 410f5500", + "c19aed80 c1b05c5a bf456680 -> c1bd9e3c 41135aa1 c0edef34 41135aa1 bf4de269 bfd57d5c c0edef34 bfd57d5c 41634276", + "c22fc4ee 41605348 41b87914 -> 4142e866 be0cf9cd 4107c1b4 be0cf9cd 407b7efc 40f13e78 4107c1b4 40f13e78 41bb41cd", + "c0eeb418 422f4902 417e2868 -> 412eee9c 405b9978 c05781ad 405b9978 40d48ffd 3ff9c921 c05781ad 3ff9c921 41e8c84e", + "41715bc8 bfcd59e0 4231fdb0 -> c0838f43 410049f3 400f9246 410049f3 c070036b 4096deee 400f9246 4096deee c098e9bf", + "c2388994 4225b7f8 c211f1cc -> 3ff3d363 4088459c c0f66c7e 4088459c c11bca2c 4045e9fc c0f66c7e 4045e9fc 413e02f0", + "4022fe30 42463e04 41fb8b8c -> c196083c c05c2f9a c00d05fc c05c2f9a 40a0fe85 403c69d9 c00d05fc 403c69d9 c0d0bcf4", + "40b82278 420fbada 417aea58 -> 41a09f61 c1021dd8 410984c5 c1021dd8 41946074 c0bcc7fb 410984c5 c0bcc7fb 41548f40", + "c114caa4 c195ee63 41c494ec -> 4080ca90 c003bea6 41850b9b c003bea6 c01b3518 c091ac62 41850b9b c091ac62 40dd33ac", + "420b0e58 c226768c 423009b6 -> 40b93d14 c08e3e9c 4113f611 c08e3e9c 40ac0f69 40c3dbeb 4113f611 40c3dbeb c126dad2", + "c19fd05e 41e72418 c1e163c4 -> 40ec4a8b 3fbc9a9b c104fa7d 3fbc9a9b bdfd3860 c108349f c104fa7d c108349f c0df0993", + "c1850f78 41efff68 c130c280 -> c1d09bfa 403e209a 4017e611 403e209a c13ffc9d 402466e9 4017e611 402466e9 c0f33c9d", + "416599d0 bfdfd200 bfd99fe0 -> 3e84b244 406283fe 40223a22 406283fe 412b3852 bfe51fb9 40223a22 bfe51fb9 bf590be6", + "4238a34a c1323ee4 41ef7718 -> 4197843d c057edc4 c0283ddb c057edc4 413c2a17 3f24f041 c0283ddb 3f24f041 40d102ee", + "421961fc 4234f4de 41f9ef14 -> c1919d54 c0a797f9 c1280d94 c0a797f9 3f978004 3fabcdf5 c1280d94 3fabcdf5 c0ebd7c7", + "c2173868 415b29a8 42033758 -> 4106ae21 c0397087 4071721c c0397087 40f3a54b be18b7a2 4071721c be18b7a2 c0908423", + "4236bbb4 c116a0fc c229e50a -> bf4b30d6 c03a9787 c0e47454 c03a9787 40dfbf06 c06be689 c0e47454 c06be689 c12214ff", + "409600f0 c2151bb0 422cc0f2 -> c0b501cf 40bf621a c0617184 40bf621a c082dbec c1128459 c0617184 c1128459 c003e9e8", + "4154e8d0 40e4e630 c16da744 -> c1978a05 bf5bc229 4130f914 bf5bc229 c0f306bd bf4b8b2b 4130f914 bf4b8b2b c12cbb85", + "c1d0c54b 421fbbea 423ac904 -> 40c19979 c0301455 bf8b27dd c0301455 4125ce3d c0ea415e bf8b27dd c0ea415e 41ec3842", + "41c53fe0 c1e5a68b 40b45b00 -> c07e79bd bf990ebc c0eb6127 bf990ebc 417d546d 3f3e9010 c0eb6127 3f3e9010 c096f8dd", + "41e865a8 c215ee54 c20c490a -> bfdc0e0a 40697046 c0f6079a 40697046 4006061e bd7d3b2b c0f6079a bd7d3b2b 40ffe713", + "c0be2028 c19242a7 41932af8 -> 40646af8 c0d6f289 40958fbc c0d6f289 412a52bb c07b1058 40958fbc c07b1058 bfb0ea60", + "40b17278 c127c01c c0da4bb8 -> 40ae2c04 40ce13d3 c05d4052 40ce13d3 40deac7f c01bf1b6 c05d4052 c01bf1b6 c13650cb", + "41736cd0 40cc64c0 412b36f4 -> c0cd5590 40bc1a42 bf67ec91 40bc1a42 c0a4346c c190d121 bf67ec91 c190d121 4195b9ff", + "c241f5c4 418b44a8 4222c5fe -> 41b0b0e9 41056d96 3e1c76d4 41056d96 bf9a0e20 403061a3 3e1c76d4 403061a3 40b7f8a7", + "4209c30a c1abf484 418c7cc8 -> c15d4321 c024cb64 413310d1 c024cb64 c14b8484 410e0332 413310d1 410e0332 403b84eb", + "4227131e 421c52a6 418e6364 -> 3f360c49 410c287f 3f10db7c 410c287f c15d22c1 411b9a8b 3f10db7c 411b9a8b c137ec89" + ] + }, + { + "glsl": "mat3 cultmath_snoise_hessian(vec3)", + "tolerance": "ulp-bounded, on the simplex tie set", + "cases": [ + "41eaf02c 418af02c c1fd0fd3 -> c087cba4 404f7c2e c11051e7 404f7c2e 40d16d44 c0680d36 c11051e7 c0680d36 c18fd5a3", + "c24544ea bfa89d38 41ad762d -> 405b811b 3f830865 3ff1054b 3f830865 405b8217 3ff107f5 3ff1054b 3ff107f5 40a4c12c", + "c19eb730 c12d6e60 c1f6b730 -> 40fe64a3 4124edaa 3f294fcd 4124edaa 41f43d24 413f38fa 3f294fcd 413f38fa 4133c8f1", + "41f88b5c c16ee948 c217ba51 -> c0bdb8b5 3f9fc0f9 c04f2c7f 3f9fc0f9 4179b84b 40f0fafc c04f2c7f 40f0fafc 40d45f9f", + "416591b0 416591b0 416591b0 -> c1b3bb6b c1528d2f c0a4bf02 c1528d2f c1e97444 c108185a c0a4bf02 c108185a c1528d2c", + "410e5bf0 c1b0d208 417e5bf0 -> 40215e4f c08ef88b 40a50778 c08ef88b c193ccc8 c0aae9ad 40a50778 c0aae9ad 3f46671e", + "c10d6797 41a14c34 c1aeb3cc -> 4115845d 400fcdc8 c0f4959b 400fcdc8 413c426e c0cdd804 c0f4959b c0cdd804 c1003a7f", + "420bf34b 4223f34b c1f8196a -> c07b12e6 bf93757d bfbfcb88 bf93757d bf93757d bde73608 bfbfcb88 bde73608 bfec2191", + "4162848b c0daf6eb 3f942454 -> 3f1f6350 3e54db08 bdd372b9 3e54db08 bf84b23a bf6ed60d bdd372b9 bf6ed60d bfd4585f", + "c206e957 c0b74ab7 4088b549 -> c10d2628 c09d536a c15b1637 c09d536a 418bfcec bf086379 c15b1637 bf086379 bd5f2d20", + "c21fe8fc c1d7d1f9 41d82e07 -> 41804ef9 bf194c39 40de2607 bf194c39 c105dbe4 c0a85468 40de2607 c0a85468 40d6e8e6", + "4016f3a5 41cade75 c20290c6 -> c141517c c12b3807 bfadf6e8 c12b3807 c07ee32e 402c35ba bfadf6e8 402c35ba 416b3a99", + "423899f8 423899f8 423899f8 -> 41182d21 40941401 400875ab 40941401 c1179525 c0eb8771 400875ab c0eb8771 c1676e54", + "c1872f0c c1872f0c c1872f0c -> 411a125e 4104ea09 bea183fe 4104ea09 41cc6b2c 40f4abbd bea183fe 40f4abbd 4104ea06", + "c2607493 4285c5b6 c1e8e926 -> 40b2273c 40ea6b3b c0909554 40ea6b3b 41a15aed 40321345 c0909554 40321345 c06132e0", + "c0ba61f9 c1fe987e 40a59e07 -> 40c509fd 3f83422e c1046660 3f83422e 41a44605 bf8b16cb c1046660 bf8b16cb 3ff775fe", + "4115a74b 40eb4e96 420569d3 -> c08873e9 bfa2735d c015aeb9 bfa2735d c08873e9 c015aeb9 c015aeb9 c015aeb9 c0cce8f3", + "41d0199c c22ff331 42300ccf -> c1d78ebc c168da82 c0eff709 c168da82 c1dd0d9e c0faf63f c0eff709 c0faf63f c1585eaa", + "405bdfff c1848400 c22a4200 -> c15832e0 c065f3b5 c086d09b c065f3b5 3faef06b 404e80a5 c086d09b 404e80a5 3e01d35e", + "420514d4 420514d4 420514d4 -> 41753c1b 409d6a1e 3ea8e2c6 409d6a1e 410db18f c039f8bd 3ea8e2c6 c039f8bd bea54c62", + "41bedffd be100140 c1812003 -> 418edf1b 40e1a4a6 415ad39d 40e1a4a6 c0661769 403cc6e7 415ad39d 403cc6e7 411a7d3c", + "c26a7b2f 423184d1 424d84d1 -> 40736e85 c08b5015 40c02acf c08b5015 40660ed4 40bcd2e4 40c02acf 40bcd2e4 41c27f4e", + "424afd18 3f3f4600 c1aa05d0 -> c186eb7d c08c6a4a c0a55e86 c08c6a4a 3fecde40 4086143d c0a55e86 4086143d 3e94f16b", + "c23da8f1 c219a8f1 4212570f -> c1b6d78d c0c60a93 c1045a81 c0c60a93 c0c60a95 3d7a651e c1045a81 3d7a651e c125afbb", + "41d71212 bf8ededf c23076f7 -> c1b4e87e c1195ce6 c04bbcb6 c1195ce6 c1b48796 c04a3915 c04bbcb6 c04a3915 c11c33b9", + "c1d28f9c c1d28f9c c1d28f9c -> c0d8cb1a c0a57c34 40c5499a c0a57c34 bfee1411 4109f652 40c5499a 4109f652 41a681a6", + "c1d908cb c1d908cb c1d908cb -> 3fb6e6f1 c0861ca1 41073d21 c0861ca1 c0ca79b9 40926085 41073d21 40926085 4197ad01", + "42656aa9 c1e52aae c1bd2aae -> bfb1baa2 beee9d97 3e67386b beee9d97 40134920 400486bf 3e67386b 400486bf 406bd794", + "c19bfdb4 422a0126 41b4024c -> c1036650 c093a817 408c6687 c093a817 c1bb29f6 c04d0e2e 408c6687 c04d0e2e c0ac8a99", + "40f29e6f 426a53ce c26dac32 -> c1a2d460 c11b2296 c08bbf01 c11b2296 c1a2d447 c08bbf0d c08bbf01 c08bbf0d c11b22a0", + "c1a3725c c146e4b9 40646d1b -> 41612218 4108896a 3e6762ba 4108896a 41612bde 3e68865c 3e6762ba 3e68865c c022b228", + "c20d73cc 426a8c34 c1cae799 -> 40cd1e6c 404b9252 400d93ba 404b9252 410fe43f 40603f24 400d93ba 40603f24 40e1ca3b", + "415d6b90 c1b94a38 c0a528e0 -> 3f7f6413 3f32c132 3e19050f 3f32c132 3fe5e08c 3f0c6fc6 3e19050f 3f0c6fc6 3f32c13a", + "c1a24b5f c1a24b5f c1a24b5f -> 408e67d6 407870f1 c047708d 407870f1 bf6a66ae c0b9929c c047708d c0b9929c c16e9729", + "419c2104 419c2104 419c2104 -> 408dcbeb 3f82425f 400d9784 3f82425f 3fd9a507 3f58d36b 400d9784 3f58d36b 4082df97", + "42203a5c 4003a5c6 4043a5c6 -> c0bccd16 3fa5aced c0a99dfc 3fa5aced 406c5585 bf01147a c0a99dfc bf01147a c117f5a5", + "424cf7e5 4181efc9 c22b081b -> c12534f9 c155973d c05011ee c155973d bebd002f 3fdd0f56 c05011ee 3fdd0f56 419e9ec7", + "c01f46db 41582e49 41082e49 -> 40024468 3fa2c71e 3e012483 3fa2c71e 40024468 3e012483 3e012483 3e012483 be82f136", + "4011d911 41923b23 41c23b23 -> 4161050c 4112d85d 3e22a103 4112d85d 41d95fc2 40d6cf29 3e22a103 40d6cf29 41122293", + "41f2e296 c2268eb5 c2328eb5 -> c1887791 c02ab83e c150a675 c02ab83e c11d21f8 c116bfe1 c150a675 c116bfe1 c1f48961", + "4183948b c21235ba 41072915 -> c116fe3c bed35e46 c0336f8c bed35e46 414016c5 40fd5ce8 c0336f8c 40fd5ce8 40e72b23", + "423b6b47 c0e4a5c9 c1f92972 -> 412aaf7c 411ccf30 3f010609 411ccf30 406ccd93 c03eb728 3f010609 c03eb728 c16e4a1e", + "c213edf9 4150481d 41f8240f -> c1935e29 bfd3ad20 beae6412 bfd3ad20 c1750fbb 3f9b1ad1 beae6412 3f9b1ad1 c14b0aa9", + "c24a2270 428aeec8 c2062270 -> c0a1ad25 40158131 40fca372 40158131 c18fa994 3fb89b76 40fca372 3fb89b76 c0dae09e", + "c0c58886 42274eef 41869ddf -> 4195aef7 401e1bda 412e10a8 401e1bda c0d5144f bfe72007 412e10a8 bfe72007 412288aa", + "c1be5825 c0f96095 4260d3ed -> c006a608 c03c7827 c0f50c2b c03c7827 41a5404f 406e3b2f c0f50c2b 406e3b2f 4133b027", + "42370dc1 411c3703 c20cf23f -> bfbe452f bda5a18b 4131eb78 bda5a18b c13eeffb 40bcafda 4131eb78 40bcafda 41277d83", + "41d6ecef c2508989 42477677 -> 400ad06c bf15f76b 403fb8e6 bf15f76b 400ad105 403fb5bf 403fb8e6 403fb5bf 41154de8", + "c24498bb c10262ea 421f6745 -> 3fec2369 3f8d3fdf 3f6b1207 3f8d3fdf 4099e95f 4019a4b1 3f6b1207 4019a4b1 408e0b4d", + "c2433854 c2433854 c2433854 -> c12d5827 c03e43a7 c132117d c03e43a7 40469c75 c08523b5 c132117d c08523b5 c1535a0a", + "41af78d6 c2144395 c0043951 -> 40ce6b9a 40ce54b7 bf0d36b2 40ce54b7 41c9011d 410c92cc bf0d36b2 410c92cc 413206ae", + "c206cc1e 426533e2 c202cc1e -> c13e160b 4067dc39 c0d1c80f 4067dc39 c085014a c02c6550 c0d1c80f c02c6550 c1c41b68", + "c1990301 c1620602 42277e80 -> 41b543ca 40ec750d 4104597a 40ec750d bf1c1837 c0572965 4104597a c0572965 3f93ed9d", + "c2043b44 c0e1da24 c1e07689 -> 403a4821 c08926cb 40b5954b c08926cb c19636ad c0a569f8 40b5954b c0a569f8 3f926a58", + "427249b2 bedb2740 c231b64e -> 41a838cb 407d985d 411ef69a 407d985d 40ec03ca 4046fcfe 411ef69a 4046fcfe 419a9205", + "417f6068 417f6068 417f6068 -> 413f2740 405d5c82 4090a247 405d5c82 405d5c84 3e8d2289 4090a247 3e8d2289 40b2964e", + "3ed4d54a c1b4acaa c1b4acaa -> c16dd6e3 401eb0b0 c038f1a5 401eb0b0 41161464 4113b90f c038f1a5 4113b90f bfadea83", + "42095918 c1e54dd0 42155918 -> c1acffa7 c1585a97 c0b35902 c1585a97 c1eadb5e c1178836 c0b35902 c1178836 c1585a90", + "42820d95 c25be4d5 c12f9356 -> 41a3d5af be55309f 40d1a699 be55309f 40962dfc bfabb9ee 40d1a699 bfabb9ee 4191b2ae", + "c2548ac5 c1422b10 4233753b -> c0ac5a24 bf0f95e9 c0783386 bf0f95e9 c03e4a57 c02b0535 c0783386 c02b0535 c119bad2", + "c1d2b6ac 41ad4954 c1756d59 -> 3fab286a 3ebaaee5 3ed9d9dd 3ebaaee5 bdf9396a be9badb5 3ed9d9dd be9badb5 b92777bb", + "c1b33ee3 4109823b 424e608f -> c15d8498 c106d1c2 be988842 c106d1c2 c15d857a be988bbf be988842 be988bbf 401a5b7a", + "41059e78 41459e78 c2129862 -> bfd30b81 bfd30b7e be21d064 bfd30b7e c0b3f92a c0095350 be21d064 c0095350 c02920e3", + "c22e63a3 41267177 c1bcc744 -> 40ba6cbb 40c9a495 40798953 40c9a495 3fd5e0e9 3fe924b2 40798953 3fe924b2 c0489524", + "c0c70363 c00e06c5 415c7e4f -> 4083c25a c14dee13 c0b532d0 c14dee13 3fc13741 c0deed17 c0b532d0 c0deed17 417ed01f", + "c25639e3 c20239e3 428ae30f -> 40650c32 bf892e0e 3fead5b4 bf892e0e c125f664 c0a48029 3fead5b4 c0a48029 c091e668", + "4235dbad c23e2453 405dbad5 -> c11df048 c09cba55 c01a4d22 c09cba55 c11df048 c01a4d22 c01a4d22 c01a4d22 c09cba64", + "418aa014 41faa014 41154028 -> 418740ff 3fa26ccb 4101510c 3fa26ccb 41549401 40c8b41b 4101510c 40c8b41b 41d74d73", + "c20d3796 c134de57 4222c86a -> 41be7850 4080c554 412e5602 4080c554 41067295 404c5b21 412e5602 404c5b21 41b12c66", + "c132b2ce 423b534c c1915967 -> c1b832d4 c0c07094 c01d3a77 c0c07094 c18395d8 3f54e9de c01d3a77 3f54e9de c11558b7", + "418e8c62 c214b9cf 412d18c3 -> ba3ffbc1 bf6de4eb 3f8a8b7d bf6de4eb bf9e8d18 3eed3e8c 3f8a8b7d 3eed3e8c 40323a59", + "41d1d697 4264eb4b c2818a5a -> 4116eeda bfce6df4 40cb6f55 bfce6df4 bfa67835 3f7d8df8 40cb6f55 3f7d8df8 416a3c76", + "c208ea1b 41be2bc9 410c5792 -> 40c3eb5d 40fc09f8 c05f71cb 40fc09f8 41a112e8 4060efc9 c05f71cb 4060efc9 c0266d63", + "40ccce09 c226663e c19ccc7e -> c13ef106 bf98f286 c0bc947c bf98f286 40859ee5 400a5395 c0bc947c 400a5395 c0a71858", + "c223e8e4 4210171c c14fa38f -> 40171c89 3fb46ee9 3f95fc84 3fb46ee9 40c55676 4044c7c5 3f95fc84 4044c7c5 40b61e6a", + "c25b387b 41c98f09 4200c785 -> 40fdbddb 407c8463 3ffa15c3 407c8463 40fdbbb0 3ffa15d9 3ffa15c3 3ffa15d9 407c845c", + "c2130f55 4244f0ab c20b0f55 -> c1642475 c10b1500 beaf5ee5 c10b1500 c1641b68 beaece19 beaf5ee5 beaece19 401c62a6", + "41807d41 4081f504 bf7057e0 -> 3f9fb966 c12dd16a bbbb91d0 c12dd16a bf9c4c13 bf9ebe48 bbbb91d0 bf9ebe48 41a3f536", + "41c38357 41fb8357 c178f952 -> c18e14be c0a09c60 c0d39334 c0a09c60 c0a09c5f be76fcf2 c0d39334 be76fcf2 c1034505", + "4043d5f2 42283d5f c223c2a1 -> c0c81706 c08581f1 c01f9c1d c08581f1 413a8ddf 40cecb37 c01f9c1d 40cecb37 4170419d", + "c1141ecb 41cdf09a c1aa0f66 -> 4152c784 3fa32bf6 40cf6071 3fa32bf6 c0959520 c01c6283 40cf6071 c01c6283 40b794b6", + "422e8d00 421a8d00 c282b980 -> c0842980 40937ef9 beff4794 40937ef9 41a50fb5 413e1fd8 beff4794 413e1fd8 4126abf7", + "c1fe0f3c c0f83cf6 c213079e -> 41056982 c00686b6 40eefd1b c00686b6 c0b2a666 3f021d8b 40eefd1b 3f021d8b 4158efa8", + "c141e996 3f61669a 41970b34 -> 408df847 c1470eed 3fd5c80c c1470eed c151f3c6 c0e37d91 3fd5c80c c0e37d91 41719bea", + "4214ca4d c0b9ad98 c10cd6cb -> c1f931a2 c1442c12 c11d8ac9 c1442c12 c188b72f c0344227 c11d8ac9 c0344227 c1442c5c", + "c1cd19ce c1fd19ce 42557319 -> 40c3de6b 3fe71a2d 40563076 3fe71a2d 40c3de6b 40563076 40563076 40563076 411340e5", + "c1853b98 418ac468 c2369dcc -> 418a68da 4094b8a8 40f648a8 4094b8a8 418a68da 40f648a8 40f648a8 40f648a8 41bb30d7", + "409a5ed4 410d2f6a c22cb426 -> c007003d bf1333f8 bf2bcc99 bf1333f8 3e44d9b1 3ef5bd42 bf2bcc99 3ef5bd42 3a069bee", + "420214f2 420214f2 420214f2 -> 40b9e0fe 403968ee 3fb878d6 403968ee 40b9e0fe 3fb878d6 3fb878d6 3fb878d6 403968f3", + "42443384 40e19c1f c23bcc7c -> c0823c00 c043d92e 3fbddf05 c043d92e bcfefa13 40602bd3 3fbddf05 40602bd3 4110e503", + "c1f7ef99 c16fdf32 c1e7ef99 -> 3f6477ee be371cf4 3f4d9d5d be371cf4 bf0931a3 3db644a6 3f4d9d5d 3db644a6 3fb6cbc9", + "4153ec19 c16c13e7 c23304f9 -> c1031791 400285e6 c0eae68a 400285e6 40ae6b68 bf04dd80 c0eae68a bf04dd80 c154f2e1", + "415214ef c2037ac4 c1f6f588 -> c08bdef3 c07f4dd2 40814784 c07f4dd2 c1caa285 c0ce0e0b 40814784 c0ce0e0b c114569d", + "4218cf62 41733d8b 41d99ec5 -> 403d2bed 400e1484 bf8bdb77 400e1484 3c3ae870 c0242d4c bf8bdb77 c0242d4c c0d3a666", + "419e1c0c 42230e06 416c3817 -> c0b0999a c0b0999a be2af68e c0b0999a c19e5255 c0e9af94 be2af68e c0e9af94 c11162c6", + "c22f86cd 41d0f268 4198f268 -> c1913c56 3fc0203c c02e54f3 3fc0203c 4115cc83 41308d52 c02e54f3 41308d52 3f69b198", + "42273562 417cd58b c1a9953b -> c11695e2 c054d2f0 c06a77e6 c054d2f0 c0d69b35 c013e833 c06a77e6 c013e833 c0ec3f26", + "40c28938 42145127 41a0a24e -> c13df0c7 bf3cdb56 c10645cf bf3cdb56 c0c9be7e c0b37a17 c10645cf c0b37a17 c1ace7ba", + "41deec40 41deec40 41deec40 -> 410f12cf 4111093e 3f8bc4bd 4111093e 41ee5a32 41384962 3f8bc4bd 41384962 415d9316", + "4185298e c175ace4 c2356b39 -> 3fb66151 3ef4f342 be6cf4b0 3ef4f342 c0171852 c007f3c8 be6cf4b0 c007f3c8 c071f3ba", + "c1ae04cc 422cfd9a bf40997a -> c0cc1eb8 bf3820c4 c0b57b03 bf3820c4 c1409c7d c1080424 c0b57b03 c1080424 c1af89e3", + "40ace298 c1ecc75b 42559c53 -> 40c8bc13 406490fe 40395609 406490fe 4188a370 4104ca02 40395609 4104ca02 417baa9d", + "c1ddcfd7 41d23029 c236e7eb -> c121749a 3faab42d 408d7e16 3faab42d c0fac37f 40b19019 408d7e16 40b19019 bfd48b7b", + "4209aa59 c1a4ab4e c1b4ab4e -> 418cbea6 40c4c9e6 3f84278d 40c4c9e6 c0312582 c1125e66 3f84278d c1125e66 c1500963", + "41b70e3d c0078e1e c20078e2 -> c08dc876 bf426aa6 c07e35a4 bf426aa6 c101a279 c0b9d7b3 c07e35a4 c0b9d7b3 c1686eca", + "421605e2 c0afd0ec c167e876 -> 4181b4ed c01c6678 40d56171 c01c6678 c13713f0 c0e51cdb 40d56171 c0e51cdb 40d902a0", + "c0382472 42347db9 c15e091c -> 3f97d0e5 3fd881f4 40e152ad 3fd881f4 412e3f5f 413e4bf6 40e152ad 413e4bf6 41acb8c7", + "41b1ff16 4199ff16 c0f803a8 -> be4b406c c02600d2 402d2aab c02600d2 c0b37a10 3a2a3700 402d2aab 3a2a3700 409fb174", + "c22a7811 c22a7811 c22a7811 -> c105657a bfa689cb c0f057cf bfa689cb c1779ca6 c131477e c0f057cf c131477e c1df2901", + "c2325de6 c18cbbce 4231a21a -> c07238d5 4147cf89 40e9bd5d 4147cf89 c083147f 40e4c1da 40e9bd5d 40e4c1da c1676c92", + "c1b93924 c1b93924 c1b93924 -> c13d25ba c099be0b 409a448c c099be0b c1c3bfd3 bfc0557d 409a448c bfc0557d c0a6fa1d", + "c1265134 c225944d 42666bb3 -> c0d212c9 bc27eba8 402fda7d bc27eba8 c1447afa bde1159f 402fda7d bde1159f c0d87387", + "413aae74 421aab9c 40955ce7 -> bd9a8c94 bdc201ce 3ce8e91a bdc201ce be67d329 bd42b9eb 3ce8e91a bd42b9eb 3c9e2808", + "4205a976 4205a976 4205a976 -> 41aee0c0 40e4bfc7 40fee70c 40e4bfc7 41752457 409649e4 40fee70c 409649e4 4187a5cf", + "422a176c 422a176c 422a176c -> c0c7f057 bfb6c3fc c0475b20 bfb6c3fc c01914f1 bf97ea84 c0475b20 bf97ea84 c0b8839b", + "40ae6e2c 4229cdc5 c212323b -> c197a0eb c0704c63 c095a315 c0704c63 406ef8de 40d55b9c c095a315 40d55b9c 3ff20bb2", + "c1ac62ba 41e39d46 423dcea3 -> c1a0549f 4098be63 4023e97f 4098be63 3fee3b01 415832af 4023e97f 415832af c0240914", + "41796b98 41796b98 41796b98 -> c0ab40d2 3faba750 c035e1a1 3faba750 416b9f8c 40e64f24 c035e1a1 40e64f24 40cb89cd", + "c223a9c7 c18f538e 42585639 -> 4104e6cf c0d5e9c1 bfefe9d9 c0d5e9c1 c010c204 c0e511c7 bfefe9d9 c0e511c7 40eb7d98", + "421c4e60 c1e7633f c1d7633f -> 4080b57e 413c8fbb 4033e83a 413c8fbb bf739de6 3ea5fa23 4033e83a 3ea5fa23 c19732c7", + "41590c6c 41a48636 c225bce5 -> 40a96f23 40a96f23 3e537255 40a96f23 4196e8d7 40dfb5ad 3e537255 40dfb5ad 410afe1a", + "c213014d c18e029a 4103face -> 40ff5640 bff9e89f 40e4daa1 bff9e89f c0a86b7f 3f07d7dd 40e4daa1 3f07d7dd 414f1e94", + "c1f44e33 c1ec4e33 419bb1cd -> c0d094f1 bf27be8d c095f3da bf27be8d c0658cc5 c04e1925 c095f3da c04e1925 c13a5f39", + "c25aad3e 421d52c2 420952c2 -> 3fb9467e c0c80311 40bf97be c0c80311 c1aaead4 c0ad66bb 40bf97be c0ad66bb 40471499", + "c1a679d5 4234c315 40c618ab -> 40f5466e 40469bec 4122e12a 40469bec 414c07d2 414b933b 4122e12a 414b933b 41d73e43", + "41128390 4200a0e4 c2075f1c -> be17ae1c 40d6f118 c006b3fc 40d6f118 c0887609 c085364a c006b3fc c085364a c1af430d", + "421f3440 421f3440 421f3440 -> 40230fc5 c0d89ce3 401fea6a c0d89ce3 c0b70233 bfd13f54 401fea6a bfd13f54 414d1101", + "c20c3f7d c140fdf7 c110fdf7 -> c0985c04 4028bc1e c0df5f96 4028bc1e c0991fa0 c0dfbe85 c0df5f96 c0dfbe85 c1c0254a", + "c2019dea c2299dea 42326216 -> c032eac2 3f3dcab3 40915fdd 3f3dcab3 c0c18da9 403aa773 40915fdd 403aa773 3fc6fd99", + "4122d22b 41916916 c12d2dd5 -> 40177693 3f7c5c83 3efc2b6c 3f7c5c83 3f49d838 be97dd0b 3efc2b6c be97dd0b be4aac9b", + "c13ec2bc 41a09ea2 41413d44 -> c1bc3bec c11afcb5 c0baede1 c11afcb5 c18b041d c030fc85 c0baede1 c030fc85 c11afcb1", + "41f150fe 418150fe 41e950fe -> 4087860a 3eda7209 c115dac9 3eda7209 41ac4460 bf377ec9 c115dac9 bf377ec9 3ff9604f", + "c04e9690 c04e9690 c04e9690 -> 3fbe77a2 c1479830 bfe793c8 c1479830 c10e1b80 c0dfcf68 bfe793c8 c0dfcf68 41472fed", + "41c8f09b c20f87b2 4248784e -> 41d50208 410ab644 411bd5aa 410ab644 419434da 40b61090 411bd5aa 40b61090 41a55451", + "c210314a 416f3adc c208314a -> 419901e2 3fec0ed8 4131b3d3 3fec0ed8 c051372d bdba9bec 4131b3d3 bdba9bec 4174159f", + "42503e47 c243c1b9 41987c8f -> 416da766 c0deead0 c0cd4b4f c0deead0 40103452 c14b7329 c0cd4b4f c14b7329 4056b07a", + "42050e1f c236f1e1 c17bc785 -> c0f3d044 c0d3a7af bda7f4cf c0d3a7af c19d6dd9 c0c39411 bda7f4cf c0c39411 c0d3a792", + "4058df2d 42058df2 c1cce41a -> 40605847 bf870957 3fe5c9df bf870957 c122c946 c0a16ee8 3fe5c9df c0a16ee8 c08f3011", + "c222f217 bf3c85d8 42110de9 -> c04c4014 c10dd945 bf9e31ba c10dd945 c0f9b246 c062aa77 bf9e31ba c062aa77 40ee99ba", + "412a4af9 40f495f1 c08b6a0f -> 41f0f780 41506258 410ae38c 41506258 41adaff3 408f383f 410ae38c 408f383f 41506272", + "c0d17a0a 4215d0bf c2062f41 -> c152023d c1650f12 c07f68d4 c1650f12 c0532361 3f6c2571 c07f68d4 3f6c2571 418ad056", + "422c598f 420c598f c1874ce2 -> c0cb004c bf5621be c0097884 bf5621be 404ea3b6 4028d9a3 c0097884 4028d9a3 3f1b0e36", + "bf941ad8 c204a0d7 41debe53 -> c111562a bf9a9246 c0ec76ab bf9a9246 418294c8 40aa082f c0ec76ab 40aa082f 407d59c2", + "4244f169 c13c3a5c c2430e97 -> 40a5149a 412acc36 c00ca360 412acc36 41484105 3fbd9426 c00ca360 3fbd9426 c153a917", + "c21c4a46 c2244a46 415ed6e7 -> 40ceb1f2 406a003b 403d2753 406a003b 418d5e4c 4108fba4 403d2753 4108fba4 41822812", + "bf0f9631 4167069d 41eb834e -> c0c7899b 3fb161c1 c0b33695 3fb161c1 407b464c bf04fc6c c0b33695 bf04fc6c c120bdb1", + "c0f718e2 41fa39c7 c242e31d -> c0650bad bfa01796 3efdad38 bfa01796 40b7830e 40a4e180 3efdad38 40a4e180 4113a451", + "423944f4 421944f4 c2895d86 -> c0f2ee45 bf84490b c1237d4a bf84490b c0c14e83 c117155a c1237d4a c117155a c1c347c9", + "41e67ee4 c199811c c22cc08e -> 418ca3c1 40afabaa 410e3ec3 40afabaa 417cefe5 410012f4 410e3ec3 410012f4 41b4e0e2", + "42307d3f 41b8fa7e c1c70582 -> c1a1c50c c0df242e c008749c c0df242e c0aa1540 40aa4529 c008749c 40aa4529 408bbe7f", + "c1b2996c 412acd27 c19a996c -> 413b0960 40d24769 413946da 40d24769 c13c94aa be221296 413946da be221296 bfe2778f", + "c128e14a c1ac70a4 4215c7ad -> c18007a5 bf03556d c0e91558 bf03556d 40e5db11 4089e4ea c0e91558 4089e4ea c0cb7ed9", + "c1b175da c1b175da c1b175da -> c1c4897c c13bcbb4 c0f39581 c13bcbb4 c19fe6c9 c0aa501a c0f39581 c0aa501a c13bcbad", + "41061288 41061288 41061288 -> c18dec0d bfd6d119 c10c77fc bfd6d119 40cf1275 4054e2b8 c10c77fc 4054e2b8 c0f764ee", + "c1441203 4226fb7f c21d0481 -> c11ed802 400bde71 3f8fda08 400bde71 bea820c6 40bd8da7 3f8fda08 40bd8da7 c01ce79a", + "c148f628 c22e3d8a 401c2760 -> 41646eeb c0ac7321 c03ddb77 c0ac7321 c0aa9ec2 c14c5604 c03ddb77 c14c5604 bef93f64", + "c1f9ba85 41be457b 423322be -> 411ecd43 c00a0dd7 41107855 c00a0dd7 c0c7dcc6 3f719f6f 41107855 3f719f6f 418104cb", + "c1f3bb20 422e2270 c1b3bb20 -> 410d7675 40dae268 c09de0fe 40dae268 41b7d8c4 4008b42a c09de0fe 4008b42a bf111de0", + "c1b3ac22 423629ef c1575844 -> 41884f04 3f0424ed 40f7d4de 3f0424ed c0f7d717 c094b4b7 40f7d4de c094b4b7 40d6c968", + "4201907c 413641ee c25a6f84 -> 415c6a1d 3cbc698e 41180796 3cbc698e 40dd4aa4 40c24bbc 41180796 40c24bbc 41cefc48", + "4238e946 c12c5ae6 4103a51a -> c15d3353 bea06bec c11978b3 bea06bec c0e26879 c0c6f16f c11978b3 c0c6f16f c1cd0ec1", + "c171e661 41f70cd0 3f6199fe -> 41759af1 414d8aba 3ff9bafe 414d8aba 414581cb 3ee5566f 3ff9bafe 3ee5566f c1172524", + "c15e6fcc 420c640d 4180c81a -> c15cfe22 c0fa7ab3 be94582a c0fa7ab3 c0f35f3e 403411fb be94582a 403411fb 40ef0b20", + "c0a7b659 c087b659 41ce1269 -> c0d9dcf2 c0a4d3b9 4013a4e8 c0a4d3b9 be376f9e 40b3e2c2 4013a4e8 40b3e2c2 416bc710", + "c218c2c4 42733d3c c1730b0f -> c061dc6e c119de41 404b8289 c119de41 c1298e3e beb561b0 404b8289 beb561b0 416ff003", + "c066b92a c19cd725 4209946d -> c18abd71 c0bdafeb c0d1f9e8 c0bdafeb c1444ee0 c080ce6c c0d1f9e8 c080ce6c c1589964", + "414fa07c 423fe81f c1802fc2 -> c08753c5 c03d1598 bf1e2813 c03d1598 c0f41663 c0144ca3 bf1e2813 c0144ca3 c03d15a1", + "4203527a 4203527a 4203527a -> be99fd8e c12936aa bf34a20a c12936aa be99fd8e bf34a20a bf34a20a bf34a20a 419b8494", + "40761a20 40761a20 40761a20 -> c1a2492b c0b51a17 3ed34f19 c0b51a17 c1a2492b 3ed34f19 3ed34f19 3ed34f19 c1024350", + "4210f938 c0b83640 c1f60d90 -> 4139e2db 3f42d586 41039a25 3f42d586 40c61035 40b0598a 41039a25 40b0598a 41a8f0d9", + "42649c5a c0763a5e c23b63a6 -> 4095191d 40341a10 c0e77236 40341a10 41c27a03 4025ea06 c0e77236 4025ea06 4086e91b", + "4199ab90 4199ab90 4199ab90 -> c1897c0d 40db0a67 40565837 40db0a67 c07957ab 411fe727 40565837 411fe727 c12e3436", + "4234506f bff5f21f c267af91 -> c13cd6c1 bf3e9e05 c1058cba bf3e9e05 c0c8c0a4 c0b2a303 c1058cba c0b2a303 c1abd301", + "c1f883c3 41a77c3d c21841e2 -> 41463deb 40595d40 40d377d0 40595d40 41463deb 40d377d0 40d377d0 40d377d0 419683f1", + "42414950 42414950 42414950 -> c15ac21b c13aff50 c0875cc1 c13aff50 bfe611ed 3fda8c77 c0875cc1 3fda8c77 4151dfa0", + "41f5b719 c2212474 406db8c3 -> c0e58c0f 3f2815a5 c08b413d 3f2815a5 41844530 40f00f81 c08b413d 40f00f81 40d08ae2", + "c1c84d3f 410f6582 c0a134fb -> 40e5df9e 3f460dbd 4064fd15 3f460dbd c01b9ab3 bf9d5dc6 4064fd15 bf9d5dc6 404b596d", + "41cf4803 c1b8b7fd 4233a402 -> be29a467 c0a171d2 40b0e038 c0a171d2 c0d57f85 40118f30 40b0e038 40118f30 41679103", + "c2146d7b 423b9285 c188daf7 -> c19590cc c11d2eab c0ee5c1d c11d2eab 406816b2 406d9539 c0ee5c1d 406d9539 41060694", + "c18d0d7b c1dd0d7b 42497942 -> c1067cb4 c05ef8aa bfdcf0d3 c05ef8aa c031faf1 3f8b020a bfdcf0d3 3f8b020a 3f3bf5a3", + "c09d9f8b c24bb3f1 420c4c0f -> c172278c c07f4c2d c095f0b9 c07f4c2d 3fcac584 406b216f c095f0b9 406b216f 3e437c7c", + "c1f87474 41ff8b8c c003a3a2 -> c0e40975 3e203c3d c0d7c317 3e203c3d 41a7d9fb 40e9f5ab c0d7c317 40e9f5ab 40e5dded", + "41e0a0b2 3da0b298 c22fafa6 -> c094f511 3ffcda4c c0d49fdb 3ffcda4c c094f54e c0d49f35 c0d49fdb c0d49f35 c1af2703", + "4171821d c1873ef2 c1bf3ef2 -> 40917304 4141dba1 40d7e611 4141dba1 c0dfe9ed 3f79bce6 40d7e611 3f79bce6 c18de2fa", + "41d308a8 c2027bac c21e7bac -> 40634374 408e9888 bfb6ae57 408e9888 412cac03 400c5f20 bfb6ae57 400c5f20 bf7981b2", + "c2170e8e 4113c5c9 4218f172 -> bf7b7c20 4125c824 c0b12753 4125c824 41624817 4001b0cd c0b12753 4001b0cd c18d37bc", + "c0f5be90 c0f5be90 c0f5be90 -> 415c529c c011da5b 40d3e0fc c011da5b c115a2f2 c09e1491 40d3e0fc c09e1491 41072b38", + "420ac52a 41d58a54 41958a54 -> bffc54a9 c0ba5303 c10e0f8b c0ba5303 419820f4 3fceb5a4 c10e0f8b 3fceb5a4 414e75d6", + "421a4bfd c05b4031 c1db6806 -> c0964da7 bfd9de0e 3f0b4708 bfd9de0e 40e90a14 40d114b0 3f0b4708 40d114b0 413c6598", + "c22d0b67 406f4992 424af499 -> 411e1d95 407e68d8 412f0d13 407e68d8 c14a44d3 bea48341 412f0d13 bea48341 3fa50818", + "40446ef5 c13ee443 c1d77221 -> c0ad34d3 c08289fa 3ff5e433 c08289fa bda1c6e9 4092d035 3ff5e433 4092d035 413ec072", + "41564040 41564040 41564040 -> 419ccdc8 40a3ac9a 40bfcacc 40a3ac9a c0088683 c09bf264 40bfcacc c09bf264 bec06dd3", + "4214a75b c22b58a5 4240a75b -> bfe19e84 c108f815 40c5625c c108f815 c12d3986 3fd1729d 40c5625c 3fd1729d 41950c80", + "c21e6757 415662a1 423d98a9 -> c11ac439 3f1ecf68 410774c2 3f1ecf68 c11074dc 410c9c6f 410774c2 410c9c6f 40d5379f", + "4246c812 c1a26fdc c114dfb7 -> c0f6535f c10f9883 40aea3e6 c10f9883 c1a12637 bf43f964 40aea3e6 bf43f964 410b8894", + "41b10444 41b10444 41b10444 -> c11ffd76 c10648e3 3f1584a4 c10648e3 c01ae52f 408bf4bc 3f1584a4 408bf4bc 4178890f", + "c1823333 418dcccd 4232e667 -> c0950301 c0604b18 3fd70ed5 c0604b18 bd442596 407f035e 3fd70ed5 407f035e 4125271d", + "423065cc c11e68d1 40a32e5d -> 419eca06 40ff7360 406fa998 40ff7360 40c920ef c0425ac1 406fa998 c0425ac1 c00c339f", + "c1d6517d 4191ae83 c22b28bf -> c0744b0e c0744b9b be917e4c c0744b9b c153d035 c09fd3a4 be917e4c c09fd3a4 c0c583c0", + "420d9927 c21a66d9 c23666d9 -> 3fb3f111 c06accee 4053c2a7 c06accee c15d15fd c089b2c9 4053c2a7 c089b2c9 3e0c73d7", + "418bde2e 4147bc5b c1f421d2 -> bf48cbe9 410948ff bff34b3a 410948ff bf48cd16 bff3492d bff34b3a bff3492d c1adf8ce", + "41b58377 c0a9f225 40f60ddb -> 401f06e6 bf01175d 400f15db bf01175d bfc01431 3e78d5ca 400f15db 3e78d5ca 407ead4e", + "40ae1b94 c184791b 41470dca -> c06eda04 3f8d8a5f bff57cab 3f8d8a5f 412c80e8 40aad83f bff57cab 40aad83f 40977e4c", + "c1af1708 41d8e8f8 c17e2e10 -> 418d5540 41496fa8 40ca79da 41496fa8 4097dd1a be08432c 40ca79da be08432c c0f8edd6", + "c0e2976b 3ff5a250 417eb44a -> c148f964 c10f3128 bfcb39ec c10f3128 40081725 40b830ae bfcb39ec 40b830ae 4186ccd2", + "c0adef4d c201bdea 41ac842d -> 40d13def bfbc6c58 40bbe095 bfbc6c58 c0848b43 3f07d29a 40bbe095 3f07d29a 4128b530", + "c02a476c c1fd48ee 41156e25 -> bf24bd6b bec5a52d bea4abc3 bec5a52d bfd63a58 bf56322e bea4abc3 bf56322e bfc5c2f4", + "423f9acf c0832987 c1e8ca62 -> c1c0044d c0f46224 c108c274 c0f46224 c185d244 c09d20d0 c108c274 c09d20d0 c1946394", + "c1129a5b 42575969 c240a697 -> c1352a5b 40228a93 c1293df4 40228a93 410a6cb9 bf172807 c1293df4 bf172807 c18caa84", + "41a2528a 42152946 c096b5d6 -> 4122c7cf 40869143 4004bd3b 40869143 40569538 bfab095d 4004bd3b bfab095d bf68fd1f", + "4237adcc 4237adcc 4237adcc -> c0a101e2 bfec87a5 3f0a3093 bfec87a5 40f67e11 40dd060c 3f0a3093 40dd060c 4147a703", + "41ccc5e5 c2219d0d 41e4c5e5 -> 4191ac15 4096eb84 40b1eb65 4096eb84 c00208c7 c091eed3 40b1eb65 c091eed3 beb015bb", + "402ce120 c22931ee 420ace12 -> 4114b80d 4006350d 4093b87a 4006350d 40625746 3fde58fe 4093b87a 3fde58fe 410933c6", + "c275e4bd 41fc3684 422a1b43 -> 419d9611 411eef81 40ce90f0 411eef81 41e6e402 41309610 40ce90f0 41309610 41af3c84", + "c22ccdfb c17337ed 42073205 -> c15f7ab0 bf4339ec c12762f6 bf4339ec 410e0546 3f75ced7 c12762f6 3f75ced7 c12859db", + "42243554 c1e79558 421c3554 -> c126dddf c03d29c1 c0b3fe2d c03d29c1 c126dddf c0b3fe2d c0b3fe2d c0b3fe2d c17c472c", + "c200af95 4203506b 41a6a0d7 -> bee51f5b bee52404 bd36d68b bee52404 bfc2cf89 bf14e71c bd36d68b bf14e71c bf374ee0", + "c2254552 3f2eab9e 421ebaae -> 414b9cab 4110f847 3fa3842d 4110f847 be70f958 c0a68047 3fa3842d c0a68047 c17cd335", + "c19459c4 4229d31e c2462ce2 -> 40f29263 4096ce02 3ed277a8 4096ce02 40f29263 3ed277a8 3ed277a8 3ed277a8 bf82eab7", + "c20a1ff7 c20a1ff7 c20a1ff7 -> c106fb4e bff4a9be c0863eb3 bff4a9be c04dd9bf bfcae752 c0863eb3 bfcae752 c0f91567", + "c1bbf0fe c01f87f1 42260781 -> c086d935 c13d6087 401d0298 c13d6087 c151f885 c000153e 401d0298 c000153e 417749d3", + "c0bc2636 42107b3a 41c8f673 -> 40266fe5 40839818 c0b59a30 40839818 40ad27ea c088a0c3 c0b59a30 c088a0c3 c1629e61", + "c1fd4db7 41056493 42055925 -> c16c4bec bffd5bb3 c0e2870e bffd5bb3 c18bd0b3 c106ee2b c0e2870e c106ee2b c1dd6888", + "c217e455 41b83757 41983757 -> 41977227 402b6472 40e458d4 402b6472 c0d95618 c0b736bf 40e458d4 c0b736bf 4007f0f0", + "c221c68e 423e3972 41ac72e3 -> 4116ebb8 40bafdd8 3eeb7a15 40bafdd8 4116ebb8 3eeb7a15 3eeb7a15 3eeb7a15 bfaac7fa", + "c235fd17 424602e9 41080ba5 -> 41a6b86c bf00152c 40b20725 bf00152c 408c03e3 c02aceba 40b20725 c02aceba 418405df", + "41c7a442 4203d222 c2242dde -> 414e0b8c 3fadc47c 412b87ff 3fadc47c 3e45b29e 408c1a19 412b87ff 408c1a19 41975a31", + "c1167600 c1167600 c1167600 -> c109c6d2 400f7f1e c0f69f29 400f7f1e 40bb83f0 bef165df c0f69f29 bef165df c1609cbe", + "c233829b 42487d65 c1df0537 -> c035d5c3 40aa22c6 bf4c9471 40aa22c6 404548dc 400a6bc8 bf4c9471 400a6bc8 c112634c", + "c1375c63 bfbae317 c1bbae32 -> 411c8d16 411da6d0 3fbd7232 411da6d0 41a1fe2b 40d6cb6b 3fbd7232 40d6cb6b 40602ce0", + "c2529230 426d6dd0 4056dd04 -> 419099a0 40491694 410dd053 40491694 418772e6 4104a997 410dd053 4104a997 41e2fd70", + "c1b0add6 41ef522a c1315bad -> c0ffe247 3ffac43d c0e555d1 3ffac43d 40a8e194 bf079a41 c0e555d1 bf079a41 c14f9653", + "c15fd523 c0bfaa46 c13fd523 -> 41c212a4 411e9afd 408fbc0e 411e9afd 40b66649 c0993615 408fbc0e c0993615 c0a48d90", + "419fd55a c2281553 c2181553 -> 3fb1b3ea 3eee9472 be67301e 3eee9472 c01343a1 c00481cd be67301e c00481cd c06bcec1", + "c08a53b5 c1f294ee 423eb58a -> c03b66b3 bf2c969e bfbb4bc5 bf2c969e bf90071c bf0fbd04 bfbb4bc5 bf0fbd04 c02cff35", + "4203adad c141494c 411eb6b4 -> 40a735b6 bfaaa02b 40310520 bfaaa02b c16731c9 c0e24a14 40310520 c0e24a14 c0c80e5d", + "c195d2a5 c19dd2a5 421116ae -> c18a3249 c0e53381 c101ec19 c0e53381 3f6e30f5 3f7b7883 c101ec19 3f7b7883 bf7c21ee", + "c01a87df 41a4af04 42125782 -> c18a9a03 c0e03353 c0548a19 c0e03353 c0b10730 4024d6c4 c0548a19 4024d6c4 3feb5571", + "c128b22f 421dd374 40ce9ba2 -> c1deac1b c0e97600 c11f28a8 c0e97600 c0ea43db 3e9e51e2 c11f28a8 3e9e51e2 c149fc98", + "41b65380 c086b203 be56405e -> c05ec56f c0276475 3fa3b9eb c0276475 bc9b38af 4040a78e 3fa3b9eb 4040a78e 40f8a859", + "c1b69eef c17d3dde 4208b088 -> c0d34f5b 40aff4db c0bb4629 40aff4db 4100fc68 3fbd7b3f c0bb4629 3fbd7b3f c16a3ee5", + "4257b131 c2244ecf c23c4ecf -> 40039777 bee2bd1c c0dcec5e bee2bd1c 411bace4 c0444aaf c0dcec5e c0444aaf c04c4ea5", + "421c82b4 c26f7d4c 421482b4 -> 413fc436 3fea4ad7 c0365214 3fea4ad7 40c53656 c0b85214 c0365214 c0b85214 c04c824b", + "426b80b4 412e02ce c2747f4c -> c1bd1d79 c083fa48 c12ef178 c083fa48 c1031201 c04d75be c12ef178 c04d75be c1ae7dd4", + "41e54cc8 c245599b 41954cc8 -> bfaaa8ac bf153e18 bebff945 bf153e18 bf7fdef2 be553fa6 bebff945 be553fa6 bf15480e", + "415738f1 419b9c79 c1f46387 -> c0e16d35 c04f9839 c00f28e1 c04f9839 c1b59ad3 c12109f7 c00f28e1 c12109f7 c1a57ef5", + "c1acae5b 4269a8d2 c21a572e -> 414ffec0 40fe7d33 3ec3c01f 40fe7d33 414fff70 3ec3b4ea 3ec3c01f 3ec3b4ea c0090c94", + "422acb9c c104d194 420acb9c -> 416dddf5 3e69b6d3 412345c9 3e69b6d3 40fbb5ee 40d68b04 412345c9 40d68b04 41de8cdb", + "40c35474 420c6a8f c2279571 -> c0935bb5 c0b994f8 3ffb6bb0 c0b994f8 c1628ef2 c0340dd6 3ffb6bb0 c0340dd6 3faef80b", + "c08f6d4b c251edaa 423e1256 -> 41865564 40793827 bf51b318 40793827 419437f9 3d47d5f8 bf51b318 3d47d5f8 41119e54", + "c22bb5f7 4004a09d 41d89414 -> 408d0588 4166fea3 406b01b5 4166fea3 bf719414 3f7f2490 406b01b5 3f7f2490 c1b3cad3", + "c22619b0 41d3cc9f 41e3cc9f -> 40aa04b2 3fc97b48 403a3326 3fc97b48 40aa05a8 403a35c7 403a3326 403a35c7 40ff7cd3", + "c24a84ac 42017b54 42397b54 -> 400e1aba c0c5c6a8 408c2b2d c0c5c6a8 4019a2e0 408f0d37 408c2b2d 408f0d37 41bc2d46", + "4211397a 4209397a c1d58d0b -> 40976d47 3f002a59 405a3ac4 3f002a59 4027710f 4016873b 405a3ac4 4016873b 4106f34b", + "c119ad84 41db293e c20a6b61 -> c11a389f c104bfa0 3eebaa37 c104bfa0 c1ce986c c0f43d94 3eebaa37 c0f43d94 c104f6f3", + "42095fb9 42095fb9 3fabf714 -> c10c069d 40f03e95 c02f399f 40f03e95 bfecc78e 3f368a06 c02f399f 3f368a06 c1b2ba7f" + ] + }, + { + "glsl": "float cultmath_integral_clamp_linear(float, float, float, float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "3ea09e70 c05410e1 bf6fc7be 3f910fad 3fc95b84 40082aa0 -> bf04f50f", + "bebc16f0 c042409a bfa5abe1 bef980a8 4007d8de 402faa06 -> bf4e2454", + "40227e0c 402f8524 bfea9993 bf7757ae 3fd61570 3fcb34b4 -> 3da828f3", + "3faaf3d0 3ff6a1bc bf14f3ec becbd7b8 be576840 bf9d0d67 -> 3ee98597", + "3ece06b0 bff3e3f0 bdaef080 3d0af8e4 bf190d48 3e9846f0 -> 3cb1bdb7", + "bfa08046 c00c8374 bfacfd13 bf836b7f bf967fd4 3f22042c -> c0049d2e", + "beb1f730 c0268a73 bf74d282 3f1539d4 3f9aa36c c017615c -> be035448", + "be661bf0 00000000 bfe71d1c 3e148558 401c6a00 3ef25700 -> 3ee2bb75", + "403e99e6 bf9ec37e 3e14b0c0 400202ce bf9bb774 3eb58aa0 -> 404c42ec", + "404ebc4e 4037b15e bf3579b2 bcadfc60 be8f1e80 bf0d7b68 -> 3bbe1617", + "be541d10 3f702260 3c98e000 3f0f7f4f be1b55d0 c002e6b2 -> bd10beab", + "c0144732 00000000 bfd010b4 3d953c80 3e93eef0 3fca6f88 -> c00678e1", + "3fc09370 00000000 bfc349c9 be7f9bd0 3f2b7300 c00d2330 -> 3f37b7ee", + "3fc4153c 4046d4f4 3d5bdac0 3f99a99e 3f14b798 3feeda9c -> 3fc5798f", + "c0526a0e c06ce88e be0cf2f8 3fabdb15 402b1342 c0291606 -> bfcfd17e", + "bfce864a be105940 bfa21788 3e3c6360 be3ae610 becf0520 -> 3e8fd1c7", + "3fd548f4 beed1a38 bf73580c 3fb1662e c0210e5b 3e4ec800 -> 40711fc5", + "402821ba 407ce140 bf89cd1c beab9354 c01ad7e9 3f4aa990 -> c00fa6af", + "bf232e54 3f5bab28 be5602b8 be173e5a bf48449c 3fb077c0 -> beccc1b2", + "3f8b60c4 3e1ec420 bfe9934b 3d17be00 bd8d83a0 be378cb0 -> bb85b6c1", + "c054c984 40624322 3e6a0170 3f27969e 3f997aec bf16ff18 -> beee7a81", + "3fe6acfc 3f53d868 3eea7f58 40006e0b bfaafe66 bf3f1fa4 -> 3f0de3ad", + "3fc0cff0 00000000 bfac975c bf1c0c5e 4005eb2c bede0348 -> 3fc518bc", + "40418870 00000000 bf0eae62 40045a44 be634980 c0199d3a -> c0902637", + "bf99e8ba 00000000 be78be28 3f9c9808 4022545a c0033f06 -> 3f8ea06b", + "c05f78f0 3ff9d67c bf050e66 3e2c6fc0 c02c096a c017a2da -> be29a6e9", + "c00a1d1e 3fc7bbdc bf80fc79 bf16cf6f c03e887b 3cce2600 -> c0419fc5", + "bf954b3a 4065486a bfe279a0 bfb0a940 bfae3ff9 3fd0cc20 -> c093b365", + "40493fc8 00000000 bfec8f16 bfd305ba 3fa9a4cc be0190f0 -> 4019304b", + "407e77f8 00000000 bff28909 3f5698fe bfca5ddd 3e105d20 -> 3fb8c3eb", + "405928aa 404b9340 bf630e00 3f29bf7a be7c7310 403cb210 -> 400794fc", + "bec54fa0 40300e62 bfd2d4a4 bf8c94c2 40114ac0 400e9434 -> 3d3eb414", + "c07c0f09 3ea4f5d0 3ecb47b8 3f452560 bf58824c 3f65d158 -> 3f3134af", + "3e8064e0 be9135c0 bf845ee7 3f7f905a 3d50b100 3ee07d30 -> 3d8fefa5", + "bf4cfc80 4024f410 bfebd402 beeefa88 3f323bc0 3eb3ff58 -> 3e24bc68", + "4041c364 bfd43828 bf0cc3ac 3f6ab754 c00ae1b0 c00d5404 -> bd0f9054", + "4039fe7e 00000000 bf999610 3fa550be bfef82c8 40063e32 -> 40a405d8", + "c06e65d2 3dc01380 bf3322f4 3fd4834e 4010f1a4 400f917c -> 3c766c0d", + "bf5b8fd0 00000000 bfed2819 bf0db940 40023faa 402cf60a -> bf12880b", + "c0580104 00000000 bf7446a4 bf658119 c037ac43 3fac5504 -> c080bd94", + "bfbfc9e8 c03dd26e bfac0e28 3faa7c2e bfc1e7ca 3f500d08 -> bed79990", + "3e10b220 00000000 bfb95f13 3f0e570a c0116f96 3f4df0a0 -> 3ede9b3f", + "3fa2b6dc 00000000 bf46d1e6 bf30cf96 3fc12cb8 3f7fc8d0 -> 3eb45a9b", + "3f2613e8 bb196c00 bff4a371 bfacbaae 4000ac80 c036f61e -> 40d24482", + "3e9da4f0 c0646f00 bf5db7e0 bd7cc960 40041c18 c0356eb1 -> 3fe4f7d0", + "405a03bc c037a1fe bfde0dc0 3f7b0768 3fc4dfec bfb5174c -> c00d44bd", + "3fa0816c 407c3464 bfcf9c11 3f0d5cbe 402215a0 3fe59ea4 -> bed0d6cb", + "bfd57c16 c066ad3a bf900caa be659930 bf623dbc 403ab178 -> c06eac96", + "3e253240 c01df496 bfd22506 bf425eb3 400d8074 3fe1c1a8 -> 3f3bf8a8", + "3bb89400 4018aa54 bfe0f8d6 3f36eb54 c01c00e5 3e2bfda0 -> c0664529", + "c041871f c040c066 bf175690 40193d90 bf160894 401390c0 -> bfdad173", + "bf69939c be996748 3e9f2ab0 404330c6 bfd38ae1 c0182bed -> be66cb20", + "bf94d1e0 00000000 bfb0f856 3fc2a3cc bd551e80 c0302029 -> 4048e6d5", + "bf413da4 40665298 3ed05d20 400f5988 4014ef82 be36c7a0 -> c0873fec", + "c0301b94 c01c75ee bfeea33b 3f56716e 3ffc2d0c bfafe110 -> 409f8616", + "c02936ec 405a132c bd0c2c40 3f61a375 402cf2b8 c018df47 -> bfbce653", + "c03b47f4 3fea70a8 bfb9efb2 be9e439c 3f5d178c 3f921980 -> be9b069c", + "c0353ac7 40292f7c 3dfff800 3f8fc279 c02be0bc 3ec85290 -> 3ec4e4e7", + "bf50a114 3dcdfc80 bfcd79a6 bfa442c1 4025ea54 3ffd760c -> 3f49242e", + "bd531180 3efd6ea0 bda24180 3e32e21a 402e2b18 bf8c3af0 -> beace4db", + "404d4aae 00000000 bfe73603 3e399818 3e7b8d00 4028bf1e -> 3edde0f1", + "bfea0eea c00ee5bc be0fc840 3f0c87ea bfc4acc2 3fd70d88 -> bca46a30", + "c07ae0cd bf8b4ad4 bfbea2bb 3e5bb1e8 3fd3ee80 3f9e0a50 -> 3f208676", + "400af158 bf3172dc bedb9eec 3e28a3e4 c038f79e bfaf349a -> 3e804725", + "3f9008a4 c02a7582 bf5f9732 3c84b5c0 3f923598 bf435720 -> 3eeebd6c", + "c0028575 c02a0736 bd8ca7d0 40139fd6 c0149fda 3ff6d0b8 -> 40199e89", + "4075d2bc bfde6d86 3e5d5810 40339c25 c0059c70 3f412c68 -> 40fe8b44", + "c060f7bc 407ce1de bdd57980 3f526303 bfc1b41d 3f91246c -> be08fde6", + "bf3a4a2c be90ccc8 bf9e0cda 3eaa8e50 3f80b2d4 bf9ed36e -> 3fc7a908", + "bf19efdc 00000000 bed89d74 40181b98 3ea47690 bf0e8dcc -> 3ebe33ea", + "4007a4a8 00000000 bf6bb07c beaa3b98 3fd41da0 3f7a5c6c -> 3e673ce5", + "3ff7c404 40008856 3e581550 3f1a4c65 bf7e443c 400ca4d2 -> 3fea88e3", + "3fc4f32c c0693fa2 bec4fcac 3e09fa64 403b5556 beb05930 -> 3f57b5e3", + "be897b58 3fdd1230 be94affc 3fe8e1cd bfb14c8a bea7ca28 -> be9d3a28", + "bffa2b9c 3fbf8a3c bf2df738 3ebcf314 bf920319 3fbc0e04 -> bfbe88ae", + "407c9bfe 00000000 bfc1e92c 3f3e3bdc bfd8cad1 3f5fc7f8 -> 3ff43e96", + "4064e0f0 3fa1ca3c bf8bb861 3f0313d2 c00e0224 3f702e70 -> 3fcee95c", + "3f4e9080 00000000 bff920fc bf4e1c78 40122d5c 402b0936 -> bea01d69", + "3fe4b6c8 405b9792 bfdc7fb1 bf36e51e bd311cc0 3d2d4540 -> bd7a5343", + "bf9338ba c0073015 bfba5d04 bfa1ca9a 3fd7d650 c0368f82 -> 40c1549a", + "bec44cc0 3f123990 bfd92728 bf523bfa 402ee3e0 bf72729c -> 4041ff20", + "3ff27e28 c024d809 bfe6a63f bfa101b8 3ee07f78 3f2d3878 -> be99635c", + "405ac94e c02674f8 bf70b2d2 3fbd4d0f bf134354 bfe73709 -> bfe90d6d", + "c00ae41c 00000000 bff91df2 3d9272c0 bfb868e6 3fa1cb04 -> c0a8727f", + "c07c5770 bfe26c96 bf6e07fa 3f5a2ade 3fc2ae48 c01772a2 -> 404e700a", + "3f0e2018 be2963a0 bf299e58 becb165b 4023497c 3f1e9770 -> 3f442b18", + "40791c50 00000000 bff5d973 3ea9e904 c0049766 40212ba0 -> 3fc2f922", + "401660a0 bfdff46e 3e715910 3ed67b33 bfba281d bf3d1010 -> 3e9987d3", + "c04cdb89 3f89b258 3d834ac0 4030ad2c c033c262 bfc40345 -> 3da7b604", + "c05b18f4 3fb0da80 3e9205c8 40026300 bedd94e0 be47d6f0 -> 3d8acab9", + "40358286 00000000 bfe71a65 3ebe2f34 c01ee150 40125cfc -> 3fe2c485", + "c02a6260 00000000 3b0f8000 3f25b207 bf8f20c5 3ddb9060 -> 3b2fd82b", + "4021fe10 3f2038e8 bf932564 bf1c75c8 bfd8b8c6 bf7b4a14 -> bedea7b7", + "bfe151b6 bf9da4fe bf877eb6 be8332c8 3ef74d30 c02a3408 -> 3ff4a35c", + "3fc1b5ac 3fd78cb8 be990598 3f3960a2 bfffe1b1 3fae3670 -> 3f96d1ea", + "402208d8 bf45a1c0 bf5e90ea 3f4c2b62 403654fa bf3dc42c -> c02e490e", + "3fa23a1c 00000000 bf0f5632 bf08f0f2 bf899979 bf36db54 -> be4595d5", + "bf12aba4 bd49cb80 be8a9d10 3c9bace0 be8a8d60 bfc1d1dc -> 3eac6179", + "c01ffe64 3d8aa0c0 bfef9622 3ecde7b8 c0084375 c034ad47 -> 3fa6435c", + "c046ce6e bfb3bec6 bfbfc672 3f8fd91a c0079f8a 3fdf8298 -> c0a400f0", + "407ff538 c0268956 3e611890 4005d7b6 bfc562bc 40309e86 -> 40bc0f01", + "3f78e860 bfa62bfe 3ab19000 4035d592 bfe6bf09 bf4f46d8 -> 4024159c", + "bf396d28 3f694ef0 bfaf5695 3fa4eccd 4020f814 3f86d1f0 -> bfa33fd9", + "c02709aa 3f95044c bfab4977 bdda7dd0 402b0242 bff905d0 -> 409c52f7", + "bec94f80 c03b3be6 bf56d428 bea25d18 3f0a1f78 3fe94d98 -> bf89d3d3", + "3f2d2028 be5f32f0 bf6dc82a be96118e bfa30ee8 bfbf6c73 -> 3d85060b", + "bfe8e682 401f6c6a bf15c698 40101c62 3f7c91bc 402c4690 -> 405449e8", + "3ff79258 4079d036 be7a3fb0 3ee081a8 c013a7ac 3f3d3c24 -> 3da754d4", + "bff135fe c012c700 3d85f4e0 3f75575d 3fda42dc bf7b9428 -> be48a6c2", + "3f84d1c4 400b8fee bfc9617b 3e82dc8c 3ebc3be0 3ff886d0 -> 3ecdf8da", + "c034e458 3fb25f30 3d7f3d80 3ffa7976 bee70670 3f98a468 -> 3dd1c629", + "bff5c3e0 be8fc4e0 3e8187f8 3f8c3fd0 bfd192ef 3fc947b8 -> 3f4fe266", + "c070affe 40648de8 be68bf90 3f991799 bff5507a 3f1d22f4 -> bf133b90", + "40146da4 405419c2 bf99921b 3e9f140c 401f2ed0 bf20d588 -> bf779821", + "406f451e 00000000 bec92658 3f1d73b8 c018630d c00ffcd7 -> 3da54f62", + "3f42b610 bfbebec2 3e45f0f0 3ffda6f5 3f927244 4022fcd4 -> 3e8ad027", + "c07db90f 3ffe6338 3e9ff540 3eb9af78 3eaf5730 3ee3b8d8 -> 3d02eb58", + "3f4c6380 00000000 bf589314 3fd0f7fa c00c16ee bf374118 -> 3f9689e5", + "3d1e6900 4043731a bfb92f1e 3f554284 c00ed795 3d7c18c0 -> c0370390", + "bff7748c 40173940 bf9ee459 bf5ac480 bff77e41 c018cca0 -> 3f1041f7", + "c045a0a2 402a5344 3e58fe20 3fa1a15b 3fd9ecd4 bfbb4a26 -> bf731395", + "bfbcc7d2 00000000 be9d02c8 3f9cf8f6 4018a4c4 402b6c38 -> bdb84866", + "405e0c5a 00000000 bf931194 3fca7cc0 bfdcb850 bfe5cb40 -> bde5abab", + "404eb600 c0060080 be467d28 3fef3e7f 3ea540c0 be43f940 -> bf760290", + "3f77c6a8 3fd8dc00 bfc64361 3f9338c7 3f378c70 40022dae -> 3fc1e60f", + "3fc1e904 c038b12d bf5cce20 be420010 be140120 bf643560 -> 3e10e648", + "3eb41440 bff3c1ac bfd82401 bf138eaa 400b2b9c bff4879c -> 4079ffa6", + "bf8559ce bf70e8b0 bfc9a61a 3e3107f0 402467b8 be8962d0 -> 4084856f", + "3dc922c0 400bb734 bfc086f0 bf2ae128 4012c12c 3f1eb6b0 -> 3f8ef240", + "c07a83e2 c01c16ae bed30264 4010cafa c02988eb bd52d340 -> 3f350e47", + "3f305250 3fbe68c0 bebea998 3feb3984 400627b8 3f1661b8 -> c02fd1b5", + "c0222702 bfbb7c16 bf8cdfd5 3f79394a bfa3f78c c03befee -> bf342b42", + "bec75958 bfbb7284 bfaf9ce6 3f33bcfc bf3297dc bfbae6b4 -> bf08a174", + "be668180 40641642 bfc754dc 3e654f40 3fbe89f8 bd821c40 -> be912f63", + "3f2ebdd8 00000000 bf2ab7fc 3f455446 3fe96910 3f920f00 -> beee7ff8", + "40113e84 3fc922ec bf33f76a 3feae779 c021c000 40093b38 -> 409d1c68", + "bfaf1fd2 beb45608 3dc58e40 3fedf2c5 3f12f3c4 3f0e7668 -> baddbd9d", + "3ef33a50 4041a292 bf8523b4 bee12230 3f863a18 bfcbafe6 -> 3ff00602", + "c0458354 3ff63c38 bf50ab14 bec5c18d c0191d44 c01656b0 -> bd10ccc7", + "3f48a620 402ce474 3d87c2a0 402ea20f 3f13f2e8 bd4a1200 -> bf70822c", + "c03869c0 be6e82a0 bf54c7f0 3f80d76b 3e21ed10 befbbcf8 -> 3f0a443f", + "3f146188 bf916dd4 3df65160 40475373 c004589e c0177fa2 -> bf6aba1a", + "bfc1acea bfe23814 3ede8dd0 3f5275de be890470 c02ec768 -> bfd46540", + "400c5a0a 3fcffac0 bea71b60 4026cb36 3fbf23d0 c03b5d86 -> c09ac7b3", + "407ad508 3fccda78 be309f38 4034d628 c0193a1e 401fe6b8 -> 4137b7e2", + "3f90de68 3f335418 bf737ab4 bf017e3c 3ff33f58 3f414d00 -> 3f144e9d", + "3f820454 c035d0e4 bf2542a4 400c4d04 c03ed70e 40076a74 -> 40ad386b", + "3fe22e70 400440a2 bfa42002 bf5c0574 bea30700 3fe4ed50 -> bfe7c830", + "3fb546bc 3f8a5054 bf8afa5e 3f9f928a bf106868 c013086a -> 3e666347", + "bfd4dcd4 407f5778 bf0b2bd2 bec2d1a1 bfeeccb4 3ea6d490 -> bf97f9c1", + "40100888 407621aa bea72e24 3fcb743e bef8d540 c00ef9d5 -> 3f016ecb", + "3f167948 c06fd2c8 bfd0e913 3f1affc6 c002c7fa beac5890 -> 3f84478f", + "c0616fb3 403783ea bfa9e95e 3f227ac8 c0128ff0 c02b5062 -> 3f036cdc", + "3f8ee08c bf842722 3ed27d98 3fd2592b 3d56ea80 403058b6 -> 3fa88096", + "3fe5f258 404877cc bf94d9a4 3fa3b5a8 bf9ae03a 3f34d0f0 -> 3f59fd78", + "403bf18e 3c93ac00 3eb2a4b8 3edd8bd6 3f82e0f8 bfd82980 -> bf962acd", + "c014b3cc c06fd013 bfdedcd8 bf802ef8 3f850550 bf8f37b4 -> 40478b21", + "3fdd5e7c bf4c1c04 bfb59f32 bf9a759d 3b2bcc00 3f9d65c4 -> bfbd8768", + "3ff4c428 c00b4d54 bfd2a0d6 3f8ae8d8 bffea516 3fefdaf4 -> 3fe9bb8b", + "bf342588 405d2238 3dfa7380 402d27ae 3ffa8160 bf82f950 -> c0758f48", + "c02bf25c 3f81229c bfc25cc8 be32e998 4000c45e 400a9516 -> bdb601f5", + "bf9a9c2e c02bf024 bf6cd2ea 3fca6f8d 3f5fd240 c018ac88 -> bfc3ef20", + "c07cfbea 3ff90f3c bffd51cb 3ed44c94 401e815c 3fe4b1a4 -> bda8134b", + "c02a1642 c043bfde bfd70654 be321a60 bf1008ec bfbc7024 -> 3e81b2b3", + "be95d3c8 00000000 bbca8200 3f933b3a 400541f8 4039e0ce -> bba68036", + "3ed50cd0 400c67b0 bff3426a bd030d20 3f7d9a50 40041dcc -> bd0cb51e", + "bf613f50 c05f5d30 be61bb08 3b7297c0 3e0b8e60 3fa13408 -> be7d857c", + "bf4035e0 c01f6566 3dcf9020 3e94f0db 401ebf58 3e42a860 -> be6db1b8", + "407e23e6 00000000 bfeb5674 bea0664c 402b3c8e bed9cb38 -> 3f78b20e", + "3f879cf8 c0055132 bef7fed0 3fed0676 403b970a 3f784f08 -> 3f732d31", + "beb2bd60 3fde2e38 bfebf807 bfbdbc50 c00d01a6 c0259c70 -> 3f356f70", + "3ff3be9c c0142e24 bfe47e9b bfd3ff2f 40380a22 3f96c788 -> 403ec12c", + "bf5e73c8 4052731c bf76fa22 3b0aec00 402682a0 be924dc0 -> 3ec4ae51", + "3ee3eda0 bfefd2f6 3ee05028 401e00be bfcac008 bfc95ebb -> 3cda0e8c", + "3d10f280 00000000 bfe6986e bf7248f7 c01ee65d 400aa524 -> c08ccd57", + "bf6d3474 405d1f82 bec373dc be3525d1 402544da 40045bc6 -> 3dba4d3e", + "bfb1a010 00000000 bf62bbec 3fdd3292 be5428b0 4033326c -> c02a7489", + "c01d9dd0 c05ba286 be2c17c8 3f51539a be85e2f0 c02aeb96 -> bfb6a72e", + "c0534683 3e1fe080 bfbd0771 bdfc6ff0 bead8de0 40185e5e -> c08086f2", + "c07ca37a 403ba71c 3d9e51c0 4036a747 402f65c8 c0129b03 -> c037d5dc", + "c070ae33 4043ef66 bff04fe7 3f269c62 bf26094c c01dd927 -> 405a6b6d", + "3f984698 40297908 bffddf79 3ed5cfdc 3fa1760c 3c9e9280 -> bf04c88f", + "402d3a4a 3fcf1c70 bff164d7 3f1996f2 c033fac7 3f691eac -> 3ec6e2ba", + "be077bd0 be1e1160 bf19a1c8 3fa31914 c0331983 c03ab726 -> bd168969", + "c0506b8c 4064341e bf66ef92 3f1fbfc4 4005cd70 3f8d1f0c -> bf1ddb50", + "c06e9234 bde83840 bfcc15c2 bfb34fcd 4032ed90 bfe45fed -> 40e9ac70", + "bee50198 3f9a7808 bf674442 3fa5f11d bf237b1c 3fdb17e0 -> 3eefeb22", + "4019b536 c04e5e7e bfca2a9a 3f9935f6 be4e2ae0 bd864060 -> 3e266d64", + "3eacb1e0 c010652c bf224414 3ee1d498 c0232201 3ecf4fd0 -> 3f8968f7", + "c00d40f2 bfd560a2 bf1c4d72 3ffcc6dd 3ff55b40 40133ab4 -> be6fd659", + "c00287c5 4007387a 3c2fe700 3e53bbb2 be9c42f0 c0116b50 -> bcacff76", + "4073e264 404873a2 bff366b6 3c97a380 bfd0862b bfafec70 -> be68dd47", + "c05d0d1f 3f2a7b38 bfa25479 bdfa45b0 bfea7cf1 3f31d488 -> c04d1206", + "40129d98 3fd32764 bf45328e 3ff3764b 3f4f9838 40130582 -> 4034ed9f", + "401b4018 403e3236 bfb99b88 3e8b603c 401a513c bf50fec4 -> bf5db96a", + "406548ec 40386136 bf1cb3c8 bf0f6869 bf4b1ac8 3d2e33c0 -> beefc056", + "3f13b660 3fdf8520 bf15df32 3ffa317b bf9c3f9a bfb5f898 -> 3df0f190", + "c06d4db5 be258b70 bfce2064 3e872ed8 bfb274de bf90109b -> bedd883f", + "4065ac90 00000000 bf5a6eb4 bea8bd0c 3ff12328 bfc8e1a6 -> 3f91acc9", + "c0275db4 c075be94 3d469a80 3e7c3402 bf8528a2 401c4978 -> 3e6de3b9", + "c042560a 3fe47b30 be1fd4b8 3f701fb0 3ffb1070 c01643ac -> 3f108eb0", + "c0125000 4079d120 3ea15948 3ee5133a bf77e890 3f380738 -> 3f0951ff", + "40088dcc bf5dd448 bfeb7b25 3f810c59 3f4e2ea8 c02c3763 -> c0619829", + "407f9c5c 3fbe0230 bfe1228a bf930e6e c00e55df 3f902608 -> c07654a0", + "c04c08f8 3f9c00ac bf825508 3f0ac0bc bf29a514 3e1ca020 -> bf549b06", + "3e288b40 c045114b bff4aa9d 3ef6e50c c002f6c3 bf2e8c5c -> 3f287112", + "c07c4faa 00000000 bfb1c55a bf7f577f be174490 3f363578 -> bf98ca30", + "bf3fae04 3f836cfc bde50080 3e73d12e 3f93c00c 400880dc -> 3e6e975f", + "c041f266 c06cc380 becb6030 3db1e468 3f97bc30 bef2b580 -> 3f28bf85", + "c0464708 bfa85e68 bf2aa94c 3f67c8e4 402c6f22 c01bc834 -> 404c5e38", + "c001fae8 bfe4c78e bff6d088 bfbcacea be17d930 3f7daed0 -> c00c1e52", + "407bec06 3ee1a250 3e051680 4014159a 3d839820 40260ca8 -> 40bb58b7", + "bfdf882a 3e9240c0 3eee78a0 403cb9c4 3e515e00 40139a10 -> 3f7a9c8d", + "bfe1b94a 406850f2 3e923388 3f162552 3fb6bfdc 40078f48 -> 3ecf517e", + "bf82cc3a 3f5a02b8 bfd5d8f5 bdbbc5f0 3e155940 3fae0130 -> befc3d2a", + "c0310d0c 406e336a bfccb660 bf72b18e bfedd5b2 3fde0c54 -> c09c142a", + "c06d8b3b bf086064 bfd6ab04 bf8ee9ad bd8c6b20 3e907ea8 -> bf169a3e", + "4069e72c 3fc909ec 3d9ee280 3fa94768 bfdec48b c01409b3 -> be8ac5a5", + "3fdf22bc c065d836 3ed53458 402837cb 3fefb8d4 3fa9290c -> be6b103b", + "be712490 c018c596 bee6b2a8 40208d42 bfe1e7e2 3ffa647c -> 3ffd3cd2", + "bfb1d5fc 3f627ec8 bfd73266 bf266358 c01b6c18 3fdaec90 -> c0ae9185", + "be8e8b58 4053b096 bfb212e2 bf249f36 bf950116 bf991114 -> 3d34dad4", + "405e7a2a c046fb8e bf76209c bc961d20 3f2c2930 bfeb3b81 -> 3d3c697c", + "c0713102 be25bdc0 bf68c604 3e66add0 c0258e5d 3d66e500 -> c019d0db", + "3e8aa4d0 c0195d1f bf16172e 3e861404 3fa9bb30 3f9c4e20 -> 3d7be3d3", + "c00a8bfb 00000000 bed8f298 be5720fd c013f62e bf82fff5 -> bf0bc3c0", + "bffd3a70 c03988cc be450040 3fa2bf30 3d173d80 bef71780 -> 3dccb1a2", + "3e939c70 00000000 bfbe9c5c bf9bf3e2 3f841eac 3f100710 -> 3f1276c6", + "3fc3cec0 3fa01220 bed6a004 bcdad570 4032c7fc c035ddbb -> 3f373b0a", + "3fb64f10 bfd888e4 bfa7c9c0 3f540110 403332ae 3f028774 -> 3ffb96ac", + "4011e08e 40261674 bf01cf58 bec5f373 bfe6a3f2 bfa6eb74 -> be813e4e", + "c0220132 400d946a bf52c6dc 4009bc3b 400edbc6 3f65524c -> bf9cf2a1", + "c070ec80 c037887a bf9e61fe 3eb22358 3f911da8 c01df266 -> 4018470a", + "bfaae7b6 4068e9b4 bffc100e bfd37f85 c01e1872 c02b5aae -> 3ed0e07f", + "bfb6ee66 bf1a5a00 bff198bd bea5b0d0 4021bb18 3ff79958 -> 3f8f3055", + "40296d6a c0665872 bf73916a 3eee6264 bf911106 c001ebe4 -> bed5c1cb", + "c05ba6be c038d44a bf3b1d4a bee689b8 bf3cc938 4034b6b0 -> c0269545", + "bf030aec c02180bc bec1cdec 3ee8c17e bcb5de00 3f025b70 -> be4dfa80", + "c03c64d2 405e785e bf5ed67e bf09498c bfd03618 bee466a0 -> bf838945", + "3fd98c24 be716320 3e1f4e00 40408537 3ffb0fcc 401414dc -> 3ed7b593", + "bfe00972 00000000 bfc07832 bfaaeeac bf3ba2a4 4023f97e -> c09e8ca0", + "bff39a3a 4021be00 bf3d02d4 bf33ba30 3fa233b8 c020115e -> 403034c6", + "40454b88 c00515c4 bf812541 be8e7248 bee6c958 bfc99460 -> 3ea01f39", + "3fcba474 c044d0d0 3ed68a28 3fc03d5f c0206d76 3fb541e0 -> 40929027", + "bf90d9a0 3fac83d0 bec5e194 3d2a6480 3e9a2e58 c01f5e2c -> 3f8a1596", + "c030be03 00000000 bf5ff694 befa9573 40198c84 3ed4d630 -> 3fde1db4", + "c01ede7b c064913f bfe65635 3f77bf7e bf194d88 c00809ae -> bf9e4e15", + "40742a78 c046bf51 bff6a570 bf9f7ec4 3e1f9da0 3f094860 -> bef2adc9", + "bb309000 4073a0c8 3e9710b0 4018596e bf9cf664 bfed4ee3 -> be3da5bf", + "404e9fb4 c03483e8 3e17b7e0 403067e2 c0022bf0 403f4cce -> 40f6216b", + "3fec1318 c046ddac 3ebb5820 3fb2d234 40088c10 c00395f0 -> c07e3e44", + "bff5a546 c01d18c1 bd624d20 4034ede6 40279c38 3f9eceec -> 3d9bf24c", + "c079503c beef8d40 bea84bc4 3fc2bebf 4030f3b4 bfffc65c -> 3fc8673d", + "c010449c 00000000 3ec08130 3fd68788 3f201ed4 bf3af724 -> bf027fd1", + "bfdafc5c 404ff2aa bfb94d31 bfa4f005 bfc84ee5 c007567c -> 3f4bbcce", + "c001df13 00000000 bfe57b78 bfe564b4 40132a80 3f82db94 -> 40128a76" + ] + }, + { + "glsl": "float cultmath_integral_clamp_linear(float, float, float, float, float, float)", + "tolerance": "ulp-bounded, lo above hi and infinite bounds", + "cases": [ + "bf0b2a84 c0384244 ff800000 3f9a007c bfc80642 3f5f8200 -> be62fdf0", + "bf903e72 be013e00 ff800000 3f8f124e bfed81c9 4015f3f2 -> c09b895f", + "bffd4268 c0197f86 bfa70b86 7f800000 3ffe5ff8 403e73b0 -> bfa5200e", + "3fb686b4 3ff53690 3f75cfa4 7f800000 be0b6280 4027937e -> 4127a25f", + "bf6bb2f0 c0383fa6 ff800000 3e887584 3faa2b50 3fdde568 -> c009d85d", + "40753aee bf2c5544 bff5b17c 7f800000 3eb30210 402b63e8 -> 40d19059", + "3fd7e728 3f14eae8 3feba88f bff6ba08 bf9bd95e 3f98cd80 -> c094bc52", + "bf55b874 00000000 3f797988 bfe54df5 bfe638a0 3fe6ac28 -> c0ce6a80", + "3fefa58c 00000000 3f9f2a45 bee349b4 bf88b77e c008c9f7 -> 3ef305bd", + "bffd1d32 bff52532 3f14b7bc 7f800000 3f5aeb88 c03b152e -> c0937293", + "4009824e 4052b500 3fc0ea57 bd8e5390 bf7fd568 c0074df4 -> 3d9ea9bd", + "bfdc0802 4061136c be801d20 7f800000 4026e128 40380bc4 -> 4008013a", + "404ffab4 c04ecac4 3fc30ebc bf5da486 be657b80 bff22a7a -> 3fb8d46a", + "3e979c80 3fc0a8cc 3e84ffd0 7f800000 bff86de6 c01bf43d -> be03ea8c", + "c06f0bd2 bf78e25c ff800000 3f877bf0 be80f2f0 bf904c04 -> 402bb6a3", + "3fb318a4 00000000 3f1431a4 bf507b64 bfb71488 bdc34ac0 -> bf8b283f", + "bf87a14e 3dc402c0 ff800000 7f800000 3fe7c320 3fe21f08 -> 3d205f08", + "bfa11404 3f9901dc 3ebdb318 7f800000 3f28ace8 3f096210 -> bd39812e", + "c05920f3 bfc9fe26 3f1ee26e be71a1f0 bf82654b c01a834a -> 3ea89ad5", + "c00556d0 3feebf88 3ef66d70 7f800000 3ea319f0 3f547630 -> 3e7c0825", + "3f828c34 bfe13e0c bd879b50 7f800000 bf9ee05a 3ff55834 -> 40351a31", + "3f656160 bfe976f4 3ff8708d be711278 c00d46e0 4004c750 -> bf810990", + "4049950c 00000000 3f952f50 bc8be500 3fc0e688 3fcb9310 -> babaa746", + "3fabe24c c00711ba 3e068070 7f800000 bf63a110 bf5d45ac -> 3da264c8", + "c0233b98 3fff1294 ff800000 7f800000 402d3600 bf8aac5f -> 40626228", + "3feaba90 c053efca bfecf755 7f800000 40364634 bfffca21 -> c0e1bf93", + "4028f0cc c0612055 3f54dc54 7f800000 402ad238 40290ec6 -> bcbbaf79", + "beb04698 00000000 3f91dbd1 bf53ed66 c00b6465 3f074058 -> c00f62e0", + "406fa864 00000000 3f8b20ef 3e6939a0 bfea8224 3f191d90 -> 3f0db236", + "405fd6fe c0040094 ff800000 7f800000 4002336c be60d030 -> c06a8a31", + "bfb75c48 40201468 ff800000 7f800000 401b77ac 3f03cff8 -> c089cb06", + "40056938 3fe8379c ff800000 7f800000 3fa99ba0 3f9ad530 -> bf018a9f", + "c0556eb0 bc1a2300 3febcf2d bf9750a7 401435c0 c0068484 -> 40a71cf1", + "bef4a0d0 c0415561 bf7228f4 7f800000 403de0a8 bf882153 -> 3fc8f311", + "3e800c00 3e8da060 ff800000 3f7a9082 bda76760 3ff23f68 -> 3f7cfbd7", + "c0467619 00000000 3f4bbbfc bfd7b41d bfd61757 bde41880 -> c028612a", + "3ed56780 bf10add8 3dee9d20 7f800000 bfb672ae 3ffb8258 -> 3fbd0bef", + "4012d6b4 c06f1e30 ff800000 bf78a9fa bf853cf4 3f966510 -> c01493b8", + "c04d58e5 c06ee722 ff800000 3ed04950 3f141838 3fe7dd48 -> c1174a8e", + "3ea47f80 00000000 3f8a8816 3e8963e8 be6dc380 bf4225c8 -> be1096c4", + "4066fa60 c060a340 ff800000 7f800000 3f090cac bf6a8060 -> c0c6a530", + "c077191e 401e0304 3feefde4 bfc95e30 402dbf82 c0021a52 -> 40ef01d3", + "bfd20336 3e8d73f0 3f4e9f9a 3c550000 3f341614 3f8712b0 -> 3b95dd74", + "400b9982 401c9b94 3eb71990 7f800000 3f87b77c 3f41d668 -> bfaae6cb", + "3d15a000 c0799975 ff800000 beedd366 3e647880 bf775c28 -> 3f11e714", + "bf799da4 403f9dfa ff800000 bed08894 4012d1f4 3d588080 -> 3f70da61", + "3fbe1938 00000000 3ff40bd3 beaf5330 3f890abc 401b8f60 -> beee7080", + "3fbd70bc 3f7e1758 ff800000 7f800000 bef05ab8 4026cf76 -> 40fa0e87", + "c0229dc4 c036d32c ff800000 bf150af0 bffe5218 bfdccf14 -> be1c157f", + "bfe6ffe0 bf050038 3f01e041 bfac9dd0 c023de33 3ebccc20 -> c07cd000", + "3f687838 bd8e3b60 3f8f366c bff818ea c000ee81 3e4c9570 -> c08957e4", + "40722c5a 00000000 3fe691e1 be4fc540 3f4be2d8 3fb86d78 -> be05e3b8", + "3ff4b594 00000000 3f1dfd73 bf0697d8 3ffe2e30 c001ddfd -> 400718b2", + "c02fd649 3e5cc9a0 3fceabb6 bfb7fe6e c03c4bcd c0006605 -> bfac3327", + "c014e4f0 c0405a98 ff800000 3f66a948 c0105010 c016cee8 -> bdbb4834", + "bee72060 bedb74f0 3f0387d0 3e392a40 3e224820 c005bf10 -> bed02668", + "40665c3a 00000000 3fcf9ca4 bf880bb7 3d7a3a40 bedafe30 -> 3f05005c", + "3e912a30 bb7e1400 3ff1f167 bed87abc bfc5ea97 bf1a21fc -> becc6313", + "beb05d40 00000000 3fc08ab6 bdce7480 c004a2b4 bf4b4290 -> be03f88a", + "4007114a bf958182 bfa630e2 7f800000 3d523180 3f4c1688 -> 3f9a2e6d", + "bfc774c6 bfd46d30 ff800000 7f800000 bf0b93a0 3f89ac50 -> c04f49cb", + "c05a4f76 00000000 3faf89fd bfdd25e1 3f7c6fb0 be91f730 -> 400c8ee2", + "3db006c0 bf96efd4 ff800000 7f800000 3f98cc04 3fa107e0 -> bdb31de7", + "3fe5ebd4 402a5cb6 ff800000 7f800000 3fbd84a0 4036fb00 -> 412701cd", + "be130280 bf83421c 3f2d0fb4 bfc6d309 3fda2328 bfac537c -> 4097a0d3", + "bf998358 c07f2a7b bfdf42db 7f800000 3fe33530 3ec8fa80 -> 401a54fe", + "c003a422 c051b8fa 3fd169fb 3ec3f8b8 3ec1a460 3eb330b8 -> bc310236", + "c07db7cb 40652b7c bf8650a4 7f800000 3ee24aa0 bfbcc298 -> 4000b7e7", + "c050b426 c064494a ff800000 7f800000 be2c1ea0 3fda20ac -> c133bf2e", + "3ff5bf38 00000000 3febe24a bf246e24 bf8b52fe 3fee7658 -> bff2a785", + "3fef8560 00000000 3fd6bcb1 bf2f4aa8 be05c480 c018ada4 -> 3fc5a368", + "407e47fc bfee3d8c 3f3fd258 bef79ec8 be86f720 3f373aa8 -> bef28150", + "407a9322 4077a70c ff800000 3f16e5c0 4039278e 3e53b450 -> bfcaad7c", + "3ff74adc c074514c ff800000 7f800000 c036692f c00d50d4 -> 40ee1477", + "c0109599 407dcdfc ff800000 3e9826e8 3ff9ef34 bfbad3e8 -> 40f87d8c", + "c064d37e 3fabd540 ff800000 3f0b3400 403d2aee be4aadc0 -> 40ae0317", + "404dda66 405d6af2 bfecf98f 7f800000 3fdd9fe0 3f9e5abc -> c08419fa", + "3f8b94c0 00000000 3fd01cae bfabedbb c0053eb8 3f34f7f8 -> c06fbe1b", + "bfa782ce bfe55598 ff800000 7f800000 bfc85400 bf4eb930 -> 3f1e65b3", + "3fd827f8 c0721f90 ff800000 3faf1ee4 bf6c2dd0 bfd3bc9c -> bf801f26", + "3fe3ef4c 3ff5aa80 bd3e6540 7f800000 3b849000 c036e89e -> bf3e81f6", + "c02720c9 00000000 3fb39588 bffd0e72 bfa5ccee be3dcb80 -> c00c7148", + "4025b204 c0178ad4 ff800000 3f966f62 4035bc96 bf2b03dc -> 3fea7626", + "3f4c5f00 4027a106 bfc3f62d 7f800000 c02341c1 40397f36 -> 4127220a", + "4020b9d8 bfca59f4 ff800000 befd6a32 bffea84d 3fc48c50 -> bfdf5315", + "3fb6059c c03aeb32 ff800000 3f258852 403fb10c 4039b3a0 -> 3f2c3f36", + "3f66acd0 00000000 3f998fea bd8d6c10 3c347200 beab4b58 -> 3cc37c8b", + "bff98cd2 3fb23794 ff800000 3f9b5268 bfcfafe2 3e806180 -> c0ae1e58", + "3f8dc374 3f98a9f8 ff800000 7f800000 bb9b6000 bfe8226a -> bd2be404", + "3f974950 400380f8 ff800000 3d3dd240 c024f56a 400d0d90 -> c07f64b5", + "c07d5b40 bf3a9a3c bf194916 7f800000 3f22b430 bf990456 -> 3f8c5559", + "c07aaed0 402e17d8 ff800000 3fbe27ba bf0fb180 bee83ca0 -> bf121273", + "c00db16a 00000000 3f42cc80 bf57ab38 3ff8c090 3f2679ac -> 3f8b7054", + "3f2cbc60 00000000 3fa3b2db bfc92692 3e942528 c0390c40 -> 409ff36f", + "405fd66a c06cf16e 3e7196c0 7f800000 bf7c1f74 c0305c79 -> c193a29a", + "c044711a c031a2d6 ff800000 7f800000 bebb27d8 3f1155a0 -> c0481673", + "3cf92600 40353762 ff800000 beb7b1b2 bfe10d3c bfd7a9aa -> beb5ece8", + "bfbf100e 00000000 3f3505d8 bff3e8be 3ff63008 bfac1142 -> 40c7401d", + "3f207060 404afd72 bf21122c 7f800000 bf309db8 bfff02d4 -> 3f51c609", + "bf5fae3c 3f0789e0 3f6b63ec 7f800000 3fd8303c bfd41c44 -> c044e8b3", + "3d089500 bf897fbc ff800000 bf4a15df 402b3ed8 c0343436 -> 40c967b0", + "3fddab38 c00a9c2c 3f69bb9a bf8fd314 3fbe5748 3f862be0 -> 3efc747a", + "c061e050 bfa97d26 ff800000 3fda986a 3f9d338c bff7ceed -> 411af31e", + "404a3c54 404c5c1c bf6b4b74 7f800000 bf9c49de be6718b0 -> 3f58a2fb", + "406590ca 3f04dcb0 3fcaaecd bef9b444 4039241a bfe373d9 -> 4011c234", + "3fb551f8 c0020910 3fdfaf6f bfdeb6d5 bfe83ede 4005a37a -> c0d94966", + "c016a797 bfb2770e ff800000 7f800000 401cfafa bfa01d21 -> 413d2608", + "3f1c90a8 00000000 3fc3bac8 bf888bc0 3fe88cdc 3e344ba0 -> 3fe008e9", + "c0559cc6 bfb71176 3fed70d2 bf903083 3f4f3594 c023931e -> 40729e34", + "3fae840c 00000000 3f97115a 3e924de0 3d02eb80 3fb3f834 -> 3ec90777", + "3fc27378 3f494498 bf7d02b8 7f800000 c012410c 400ab734 -> 40d1dbb7", + "bf9e10e2 3f390bf0 ff800000 7f800000 3f972c38 3ed4cf28 -> 3f00e4ca", + "c07d7329 00000000 3f0da4a8 3d818360 c03ddfa2 bfbf8568 -> 3dbe7380", + "3e116060 00000000 3f420c52 3ec06c78 3f564cb8 bf92c392 -> bf3edb08", + "4063ad1e c07e35a3 ff800000 3f462e80 c00212a7 bf6ed200 -> 3f59e669", + "4044483e 402d13a2 3d50ef40 7f800000 402d46cc 40146fd2 -> c075046a", + "3fac2414 3f8b40ac be01e540 7f800000 bf682450 c02f685b -> 3dfedeea", + "c05e65ff c05526f6 3f909a1c bf042384 bfe455e8 bf6eb6bc -> bee10136", + "be776a10 403fd276 3f89268b bf2a53f8 3d3d1180 3e9358c0 -> be249f9f", + "4064ee2e 00000000 3f5e66be 3ec864c0 3e805e10 bf7f648c -> befa2911", + "4074ae32 00000000 3fcdee98 bf64354e bfffca31 3f252220 -> c016cfdc", + "bf87c254 00000000 3fc36d6f 3eaff918 bffe4cd0 400b1ff8 -> 3fb70933", + "c052c89e 4013111e ff800000 3f96e1b2 3f19be14 3f5ed320 -> bedd88e9", + "c009eb35 3fddee68 ff800000 3f044578 bf3ef864 bfa138ba -> 3ffff3a9", + "40691b74 00000000 3fe4e5aa bfb43ed8 3fe3f06c c01bd382 -> 40bdf578", + "3f830a4c c0531431 ff800000 be90363a 40370edc c03245db -> 4139b209", + "3fb8e818 c02ff12b 3fc3a58f bfcd1179 c018b019 3f67df5c -> c0a8bedc", + "3fc93094 3f22f3a0 ff800000 7f800000 4009c918 c01fb787 -> c0d99551", + "3fc13038 bee9dde8 3fcc6902 3dd5f6c0 3df0a1a0 3fcc1fc8 -> 3e1e094a", + "407033da 3f6849a8 bfce467d 7f800000 3fda1130 3fad13ac -> bfe73ad0", + "c031489e c07e39cd ff800000 7f800000 4019c98e c02a48fe -> 4136f1e3", + "c046dc6d 00000000 3fad6b49 bfd899d8 400b65bc bf10f6a4 -> 40949b6a", + "c05e533f c06d210a ff800000 7f800000 3f206210 be288850 -> 405b3391", + "bf7e85d0 40416500 3f8fdc10 be82a520 3fa35f7c c0056fbe -> 3f5b917e", + "40396ff6 402734d2 ff800000 3f60c942 bfc38654 c002fd20 -> 3f6b736f", + "404b1340 00000000 3fc2fb3c bfae7f84 3e430fe0 3e03e530 -> 3dac39e9", + "3f8f488c 00000000 3f6cafbe bf8aa584 3fbddcd4 bf809474 -> 402c76f4", + "40663df8 3f8cd5dc 3f9f57b4 bd8e8900 bfe9f0a6 3f955598 -> be556613", + "bf3bf700 4031fd74 ff800000 7f800000 40096f2c 40372942 -> 408e78dd", + "3f3342d0 c0272e74 ff800000 7f800000 bfeab9ec c0281aa2 -> c0a59170", + "3f3da9b8 00000000 3fb2875a bf319468 3fd6bb68 c000ec58 -> 4023e82d", + "40341d6e 40582d68 ff800000 bf1bc556 bfe0d240 bffe1562 -> 3f4d1a78", + "bf757580 c05a3300 ff800000 bea6f0e8 c02f51c4 c032f8fa -> 3c987746", + "3f86552c 3ed0c070 ff800000 7f800000 40146420 bfaf990a -> c092bb03", + "bdbde020 3f2abbb8 3f2459f1 bfe3ca0b 3f8583a4 3e88a890 -> 3fb0cd8b", + "bedefe38 3f839e38 ff800000 7f800000 40125092 3fb84be8 -> bfa05876", + "3ce15b00 c0108368 ff800000 3fc394ba 3feeb264 c0303e82 -> 3e29a2c0", + "bf995e24 bfd7be92 ff800000 3eddd4cc 3f4f9ff8 3fab76f4 -> bfcbaca5", + "404e6a02 401151c4 ff800000 7f800000 3ea4ac10 bf1f8304 -> c02e4f3d", + "bf0d3864 bfbd35da ff800000 7f800000 3f9e5764 3ff89eb8 -> c002f92a", + "3fb41270 3ee36b90 3ef72070 7f800000 40224ce2 403fee2c -> 3f9c3661", + "c044e618 3fe4f860 ff800000 bf3ab3d6 c02a551f bfc0667b -> c0fc1a14", + "3ea3d780 4021e21a ff800000 7f800000 403324b8 bff2fb70 -> c0db5ad7", + "3fd54e2c 3e944f40 ff800000 3fcca272 40391af2 bff0c14f -> c0e79db9", + "c01b99d7 3f90b97c ff800000 3edae39c 3ee34220 3e7c4700 -> 3ece6418", + "c01ae2cc 3f06c418 bebfa5e0 7f800000 c03305be c0029bb0 -> be90f9fd", + "bffa97b2 c0436485 bfbd3ae5 7f800000 3f685908 bf686f08 -> 3fe960f8", + "4052b922 3faad6ec ff800000 7f800000 be46c010 4001a130 -> 4120547c", + "c003292a 3ff31fd0 be378c10 7f800000 bed82bc8 3fdbb9f8 -> 3e008adc", + "c028fa52 402ef08c ff800000 3f970044 3fd06e10 401db5a4 -> 3f7c6de2", + "bf90e906 40570af6 3fe4ea7d beb7e66c bfa3f8a8 bef68628 -> be9308c8", + "3f59deb0 405c57b2 ff800000 bf4de4a9 403de08c bfad59ea -> 40993e1e", + "bfaf4754 bf8fbd24 3f25c0ac bf858e0c c03acd27 3fecabb0 -> c09f307e", + "bf90e182 40282582 3fc46df6 be554ce0 bf8271ba 3fe93108 -> bf177dcf", + "406af308 403a4800 ff800000 3f32aef0 bf8ba032 3fd28940 -> 3ff382a1", + "bf5d937c bfd430f6 ff800000 3f7dcd38 bedb1fd8 bfca9e2c -> bf3f7814", + "401da4d4 40116556 3f98ec71 be8d3d0c bfce7124 4012e7a8 -> bf89ff65", + "3fe228d8 00000000 3f9f5144 bd4de720 bfc2152a c003ee96 -> 3ce080a7", + "bfd65224 bf871dca bfc4fa72 7f800000 3e38c7c0 3f0a0458 -> bf0d4dd8", + "3eedae10 c0467403 ff800000 bead9056 3faca370 3fba4780 -> bed3e1b9", + "3f9285bc c035a27e ff800000 7f800000 3f8532a4 c0322863 -> c15d6539", + "400e0294 c0645562 ff800000 bf1e37fc 3f2ab790 bfa0f5e6 -> 3f983c47", + "406445f8 c056a1ed ff800000 7f800000 bf750180 3e926600 -> 40baa1c2", + "3f7ed1b0 3fd8acf4 3fdd35f6 bfab6e2e 3f9f492c bfa55d57 -> 405966f4", + "c073d5f9 4006818a ff800000 bf2ec36c 40021aee 3fc28b80 -> 3eb34fac", + "3fc831b0 00000000 3fdd735e bf1fdb88 bd8b8a80 bfb0546d -> 3f5152f5", + "c067b803 c053ee97 ff800000 7f800000 bf8d0f45 bf39c214 -> be65295f", + "40454632 3e33fe40 bef215e0 7f800000 3f873d84 bfc71e5b -> c0fdfdd3", + "c0371b4a 00000000 3f0d7f2c bf9b65f8 3f08eedc bd93ca60 -> 3f3cabee", + "4062a26e 4026084e 3f23621f bff89ca8 400e0fdc 3f65e738 -> 40244a41", + "bebe03d8 3d2fdd80 ff800000 3f835eb0 3f11c9b0 3eaa4138 -> 3daab3ea", + "c0657d7b 3e276860 bf506f04 7f800000 403635f6 4021d69e -> 3e84b269", + "bfafc7b8 bfc778be 3eb2bac8 7f800000 bf254a34 bf9c07fc -> be5744a1", + "c0249e78 bfae5444 bfb04f0c 7f800000 3f2a68e0 403dd784 -> c04acf36", + "c068736e bebe7aa8 ff800000 7f800000 402a1540 c01ed528 -> 4196ac89", + "3fd0127c bf5169a8 3fa4f77c bf8b48c4 3ff02d34 bfd3d383 -> 4075ecde", + "405aa754 c0423731 be096ae0 7f800000 3f1cc1f0 401cf950 -> 3e6661fd", + "3f86b240 3fabb848 ff800000 bf6ee45f 402ca76a 3f352178 -> 3fedb7fa", + "3ecdd950 00000000 3fd260dc bf811808 bfb00f52 400ccb1a -> c066c75e", + "bea6feb0 00000000 3fcca4b9 3ea249c0 bf2cfa20 3d67ae80 -> 3e6dac20", + "3e4a0840 00000000 3ffae0e6 be04b4c0 3e11a6d0 3fad4750 -> be20c604", + "c0799f76 bf85594e 3fe783e2 3ebf4b78 be03f160 bff50393 -> bf2ac2e6", + "bf8c7388 4032a74c ff800000 3fe1876e bfb9ecec bedcf780 -> c0738770", + "3e93efb0 be81bd00 ff800000 3ec55218 becf8b40 3e3f1150 -> 3e3fdd04", + "406241ca c05de18a ff800000 3e80529c bf271fe8 3e73c080 -> 3e64a338", + "c025c02c 00000000 3f5603c2 bf6d7634 c01aa5c0 bf56b0c0 -> bfbb5354", + "3fef160c c0039d40 ff800000 3f874ce4 3e683f80 c0037449 -> c01a4b84", + "40267ca2 00000000 3f31b7ee bfe701df bee92cf0 c01afc8e -> 40631bbc", + "befbf118 401fad5a ff800000 7f800000 bed93b70 c02a5de4 -> 411b762d", + "407c371e c07c0783 ff800000 3f5d20c4 3fa0bb70 c033ef8b -> c0447def", + "4029034e 403c0c0a 3feb36aa bfff3283 3fcad320 c01c200a -> 41005d70", + "3fd1dcc8 c06ea2f7 ff800000 3fff5a82 4038caf0 c03aedd4 -> 409ff98d", + "bfc1e3d2 3f8f931c bee4a428 7f800000 4004a430 4016cbd2 -> 3e8cbd70", + "4070c488 bffe9414 ff800000 7f800000 bf09ef98 3e37a380 -> 403d563f", + "bf8adb0a 00000000 3f530965 be6b63c8 c03047db 3e033610 -> bf29a108", + "3fceea28 3e77c340 ff800000 7f800000 401ff396 bf846d89 -> c0cad675", + "4057d9c8 00000000 3f937e61 bfe2a4ae 3d64f300 3e46d0e0 -> be7aafaf", + "c04cbc5e bf19041c ff800000 becedaf0 c00c7b5c bed40f78 -> c089dd29", + "c034a3ce c0451745 ff800000 3de07e90 c00b3cd8 3da72fe0 -> bfb2f3c5", + "bf2408a4 bfa6832c 3fe35a97 bf5850d4 3fdb6c9c 3fafe434 -> 3e93235a", + "3edb64e0 00000000 3f1f66ec 3eb80448 bfc4daee bf910b46 -> 3e14f87a", + "3fdc6cbc 40590126 ff800000 7f800000 c00231b2 c027f93b -> 406956a4", + "4040c116 40220f9e bfa796c8 7f800000 bf8e5c1a bed7c408 -> 3f3d3b10", + "3f86c7e4 00000000 3fb33aa0 bfc61af4 bf882bc6 c03e63cf -> 403d4a4a", + "40135a32 00000000 3f010b69 bfc53aac 401c8ada 3f067e58 -> 403d666e", + "3fb9ea54 3f667088 ff800000 7f800000 40126b4e bfaa9476 -> c0da143e", + "c0458ed9 40793090 bfaa3bb6 7f800000 bf67a36c 3fc9ac68 -> bf5677fd", + "40688054 c059af7c bfd79392 7f800000 3e2cf960 400c88b0 -> bddc33e8", + "4050b46a c008e7a1 bfc31ca2 7f800000 bbee3c00 3f8f245c -> 40154f21", + "3eca3830 3fddaec4 3fa6bd9f bfe8d46a 3f5c7528 c010e3f2 -> 40b5e713", + "c03e9e6b 40136fc6 3f655bb7 3e7a6900 c0033d1b 400e901c -> 3f85e95a", + "c06d2fc3 3f1626f8 3fa64533 3c6a4000 bebb86b0 bfc4f666 -> bc895477", + "400fca88 c034b1dd ff800000 7f800000 3e1b8dd0 3f763ae0 -> 3f0bd978", + "407c94a4 401ad33a bef86e10 7f800000 3f8a308c 401adac0 -> 412f5c0a", + "c03f7b9c bebc9828 3ffe5c68 befd807c bf8113ec 3ebca1e0 -> bf2e8422", + "4020cfe0 3fbfa9ec ff800000 bec74ee2 bf5da2c8 bec67c50 -> be3e93de", + "c00d2dee 3f50efe0 3fd8618f bfb19656 3f356f28 c025afbf -> 409266e9", + "bf44b364 c07447c3 bfd29b93 7f800000 bf8acc84 3fce3ab8 -> bf91d691", + "be9a1c78 befe9960 3f277228 7f800000 3e805e20 bfae4fde -> bf87017e", + "3f9e00fc bf88e102 ff800000 3eda1fc8 bff76283 3fee13f4 -> 3f76cb83", + "bf8ef440 bed711a0 ff800000 7f800000 3f32f3d4 be428170 -> 3f8b3ffe", + "be067930 bf9e417e bf853207 7f800000 bf648afc bf88e6d6 -> be43d727", + "bf7f9700 3fef7b1c 3f26c61f bfe0524f bf6d1eec c015e85e -> 401ed364", + "c03b0aad 3f01d8f0 bfb759c7 7f800000 403ced4e c01ba186 -> 40f6c684", + "bfe92a4c 00000000 3fe0c054 bff1c0f4 401ca664 3e9bbb10 -> 40818ca7", + "40158400 c07868c5 3fbaa390 3e7b5c90 3f0f2138 4035fb98 -> 3f0f8d26", + "c0252b55 402bdf3c ff800000 bf6bc7ac beec5098 bfd86ca4 -> 40d73441", + "c0439078 c02ab53c ff800000 3e5e0f60 3e709e60 c018c75b -> 401204ed", + "bff046aa c059b87e bf99fa11 7f800000 3f86a3f8 c030ae4e -> c0d2a314", + "40563928 bf14dc14 3ec4c038 7f800000 bfe97076 bed2e7d0 -> 40b49698", + "c014aa4e bdfe0340 3f3605dc bf8dcf77 bf297690 3e2aaf90 -> bf6b05c9", + "4006e3d2 3f612710 3f35e2c0 be124f38 c0008056 4023799c -> bf26dee6", + "bfce98fc 3cb4e000 ff800000 7f800000 c024ad6d c01767f0 -> beb1277d", + "401c9254 400d1d40 ff800000 7f800000 3fb53620 3edcd940 -> c08d3488", + "c0443ea5 40732a4e bfaecf9c 7f800000 c015d256 3f9feb58 -> c06ba7f1", + "3ff551d4 00000000 3f77cbec bef1ad68 bfb84901 3f451778 -> bf8580ed", + "3f38d8f0 00000000 3fd8c54d bfe14821 bf1befd8 3fb0f7f4 -> c06058a8", + "c033affa bf7d4dc8 ff800000 7f800000 40196ef2 3fa0ee0c -> 40a86678", + "bf2cc260 bf934a3e ff800000 bf714bc3 c01d504b 3ead2a20 -> c0291728", + "be5790e0 40534106 3f0bd833 bed0b664 befbb698 bf08982c -> 3c8c11c8", + "bfa83d6c 00000000 3fa24e71 be275838 bee3f830 bff605bb -> 3e77224e", + "4078f8f2 403b7202 bfe30e3b 7f800000 bdeac340 bf99fb7f -> c00891ab", + "400729d0 40616b48 ff800000 bf461e6f be2caae0 3ff7ba54 -> bfd06ba6", + "bf4c31ec 3ff690f8 ff800000 bedca326 c03b59a8 40086c3c -> c138ac1b", + "bda07260 3f5f9400 3f44ceb8 bf7d7ac4 3e564320 bf1a9360 -> 3f4e178c", + "bf878b18 c05db95e ff800000 3ff43ee2 3f871b38 bf1df154 -> 4042a94e" + ] + }, + { + "glsl": "float cultmath_integral_clamp_linear(float, float, float, float, float, float)", + "tolerance": "ulp-bounded, zero-length spans and flat infinite clamps", + "cases": [ + "80000000 80000000 3ff65b76 7f800000 40101a44 40101a44 -> 00000000", + "00000000 bffab8a4 7f800000 7f800000 3f12b010 3f12b010 -> 00000000", + "00000000 80000000 bf34a3ac 7f800000 3fd46400 3fd46400 -> 00000000", + "80000000 c00a0d51 7f800000 7f800000 bf9849a6 bf9849a6 -> 00000000", + "00000000 00000000 ff800000 7f800000 3fe4a0ec 3fe4a0ec -> 00000000", + "80000000 beb441d8 be195228 3fb78208 c015d454 c015d454 -> 00000000", + "80000000 00000000 3efc18a0 7f800000 c0157e7c c0157e7c -> 00000000", + "00000000 80000000 3fcb9924 3f93c620 bdbbe200 bdbbe200 -> 00000000", + "80000000 3f16a5d0 3ff1278c bfaa73fc 403c47f4 403c47f4 -> 00000000", + "bfeded14 80000000 ff800000 ff800000 400aa252 400aa252 -> 00000000", + "4042a300 3ec80180 ff800000 7f800000 c0369fbd c0369fbd -> 00000000", + "bf834bb8 3ff1675c 3fccd224 3eea4e38 bfe4046f bfe4046f -> 00000000", + "80000000 80000000 7f800000 bfb8ed52 c015deb4 c03bb881 -> 3f5abd11", + "00000000 c004ae4d 7f800000 7f800000 4038c578 4038c578 -> 00000000", + "00000000 c04d2c62 ff800000 bd754b20 3fcc4a60 3fcc4a60 -> 00000000", + "c0363eaa 80000000 be8c9ea8 ff800000 3fba9ac0 3fba9ac0 -> 00000000", + "80000000 80000000 7f800000 bf4c4cd0 c003ca24 c003ca24 -> 00000000", + "3f92b974 80000000 ff800000 ff800000 c008d69e c008d69e -> 00000000", + "00000000 40441954 ff800000 7f800000 40217b3a 40217b3a -> 00000000", + "80000000 00000000 ff800000 7f800000 3f8c7c70 3f8c7c70 -> 00000000", + "3ea22a30 00000000 3f5708fc 7f800000 c03b518b c03b518b -> 00000000", + "00000000 00000000 ff800000 ff800000 c00c95a0 bf5a3618 -> ff800000", + "80000000 80000000 ff800000 7f800000 3fb3af0c 400bf204 -> 80000000", + "4060b036 00000000 3fa51834 ff800000 c023687e bff93c2a -> ff800000", + "00000000 80000000 7f800000 ff800000 bfe50f6f bfe50f6f -> 00000000", + "80000000 80000000 bfbcb16e bf944da4 3f89a670 3f89a670 -> 00000000", + "00000000 00000000 beaae9fc ff800000 3f9468b8 3f9468b8 -> 00000000", + "00000000 bf50c0d8 3f7f9d38 7f800000 3ed30c90 3ed30c90 -> 00000000", + "405610da 80000000 3fe8ba90 3e9602a0 3f1e7c70 3f1e7c70 -> 00000000", + "00000000 00000000 3f84dca4 3ed1edd8 bfb5cbe0 bfb5cbe0 -> 00000000", + "00000000 00000000 ff800000 7f800000 401d4be0 401d4be0 -> 00000000", + "bea92ba8 00000000 ff800000 bfbc161a bfce0954 bfce0954 -> 00000000", + "00000000 00000000 3ffabe24 ff800000 be94c538 be94c538 -> 00000000", + "3fdb9278 80000000 7f800000 ff800000 bfb80c20 3fad3c54 -> ff800000", + "00000000 80000000 7f800000 ff800000 bfa61865 bfa61865 -> 00000000", + "00000000 80000000 ff800000 bf84d6bd 3f403a2c 3f403a2c -> 00000000", + "405d8f82 be715bf0 7f800000 bff060d1 40252552 3fabcf50 -> 4014cf8e", + "80000000 bf8e4188 7f800000 7f800000 3f6acd98 3f6acd98 -> 00000000", + "bf2996a4 3feeb9fc 3ef574c0 ff800000 403f2da4 403f2da4 -> 00000000", + "404b1a90 80000000 7f800000 ff800000 40358f58 40358f58 -> 00000000", + "406964ea 3f1b1f88 ff800000 7f800000 3eace890 3fe2f1b0 -> 40c4dd90", + "00000000 406a2510 ff800000 bf7d18c8 3f024fac 3f024fac -> 00000000", + "00000000 00000000 3fc5fa3a 3fa07496 bf8fb485 bf8fb485 -> 00000000", + "80000000 80000000 bfbb7b60 ff800000 3e2af490 3e2af490 -> 00000000", + "80000000 3e5aa380 7f800000 bfd8835b 3fdb8594 3fdb8594 -> 00000000", + "3f74a1e0 4011863a bf0a69ae bff30675 3eb98b78 3eb98b78 -> 00000000", + "bfa52d40 00000000 ff800000 bfc83f64 c0094bc0 c0094bc0 -> 00000000", + "3fdf6ba8 3fa96b98 be04bc30 7f800000 c00c72cf c00c72cf -> 00000000", + "80000000 80000000 3faeecdc bebf17e8 3f5565c8 3f5565c8 -> 00000000", + "00000000 c07111a4 7f800000 ff800000 3fe4c6ec 3fe4c6ec -> 00000000", + "00000000 3d8861c0 ff800000 7f800000 bfb30a60 befc8658 -> bd69a824", + "00000000 00000000 ff800000 ff800000 3eaec780 3f4e3528 -> ff800000", + "80000000 00000000 3fa5cf60 7f800000 3f46b9c4 3f46b9c4 -> 00000000", + "80000000 00000000 3c95e600 ff800000 3f847fa4 3f847fa4 -> 00000000", + "00000000 00000000 3fd73136 ff800000 bf7d6bc8 40305c10 -> ff800000", + "80000000 bfe74ff0 ff800000 3e0ee410 3ecea760 3ecea760 -> 00000000", + "80000000 00000000 3f082ac0 ff800000 40151e54 40151e54 -> 00000000", + "80000000 80000000 ff800000 7f800000 bf63ab8c bf63ab8c -> 00000000", + "00000000 c0571bc6 7f800000 ff800000 bffa05e1 bf93391b -> ff800000", + "00000000 80000000 bded5bc0 7f800000 3f8f48f0 3e98cc20 -> 80000000", + "00000000 80000000 ff800000 bcf42a40 3f0ec9a8 3f0ec9a8 -> 00000000", + "80000000 00000000 ff800000 ff800000 beb280f8 beb280f8 -> 00000000", + "80000000 00000000 3f9f75f8 7f800000 bfe89986 bfe89986 -> 00000000", + "00000000 404345ca 7f800000 7f800000 bf8f67d5 3f9b0790 -> 7f800000", + "c02d14e5 c018b2de 7f800000 beabd00c bf628f58 bf628f58 -> 00000000", + "80000000 3fa81b84 7f800000 7f800000 bf7fcb58 402c99e8 -> 7f800000", + "405a6490 c015edd8 ff800000 7f800000 402b25a8 402b25a8 -> 00000000", + "00000000 80000000 ff800000 3faf5518 3e8458b0 bf17a4b0 -> 80000000", + "3ddcc380 c01b944b ff800000 3e1a4ed0 c02f5e1e c02f5e1e -> 00000000", + "80000000 80000000 7f800000 7f800000 bfae87ca bfae87ca -> 00000000", + "80000000 bf365dc8 7f800000 7f800000 3cb87a00 3cb87a00 -> 00000000", + "3c9b6800 3fd96c50 ff800000 7f800000 bfa0d940 bfa0d940 -> 00000000", + "80000000 3fe3b634 ff800000 bfb50e83 be879260 be879260 -> 00000000", + "40400d36 80000000 7f800000 7f800000 3fcbf0b0 3fcbf0b0 -> 00000000", + "00000000 c073a1d2 3e22f910 be8c4dd8 402c5370 402c5370 -> 00000000", + "c00c4bae bf7f88c8 7f800000 ff800000 3f50b1bc 3fc21d00 -> ff800000", + "00000000 beb0d330 bf6b718a 7f800000 bf2bffdc 4015e728 -> bf5e9010", + "80000000 407ee62e bfc8b0ac ff800000 bfe242a3 bfe242a3 -> 00000000", + "c00a085f 4000655e 7f800000 ff800000 402f7d2a 402f7d2a -> 00000000", + "80000000 80000000 7f800000 ff800000 3ec08940 3ec08940 -> 00000000", + "00000000 80000000 bfb3cb9a 3fae284c bf73e094 bf73e094 -> 00000000", + "80000000 80000000 7f800000 ff800000 402b9396 3fe25440 -> 7f800000", + "00000000 00000000 bfa90b1a 3e615980 bf113528 bf113528 -> 00000000", + "00000000 80000000 ba34e800 ff800000 401b67ce 401b67ce -> 00000000", + "c066c90e 00000000 bda3fa30 7f800000 40336df4 40336df4 -> 00000000", + "00000000 80000000 ff800000 ff800000 3f965088 bf746b10 -> 7f800000", + "80000000 00000000 bfbad0bc ff800000 beba6078 beba6078 -> 00000000", + "401d2f02 00000000 3fea9790 3d3f6080 bfafe5e0 bfafe5e0 -> 00000000", + "00000000 3f51ea80 7f800000 7f800000 3fcab42c 3fbfaad4 -> ff800000", + "00000000 00000000 ff800000 7f800000 3fe9ee70 3fe9ee70 -> 00000000", + "80000000 c034a2be 7f800000 ff800000 3df9d3c0 3df9d3c0 -> 00000000", + "3f1f29e8 80000000 ff800000 ff800000 3dfe57a0 3dfe57a0 -> 00000000", + "80000000 c058626d 7f800000 bff33e4d 401c9e9a 401c9e9a -> 00000000", + "00000000 4075df8a bfd1267c 3fff39cc bfbb7f91 bfbb7f91 -> 00000000", + "00000000 00000000 ff800000 7f800000 c0105faf c0105faf -> 00000000", + "00000000 80000000 3e8b28a0 7f800000 bfe3598a bfd7dee1 -> 3cc7ad83", + "00000000 00000000 ff800000 ff800000 bec241f0 bec241f0 -> 00000000", + "40322ac4 3f612ac8 ff800000 7f800000 bf3990c4 bf3990c4 -> 00000000", + "80000000 80000000 3fc155d6 ff800000 bfdcf5b0 c0339ef0 -> 7f800000", + "00000000 00000000 7f800000 3fb27a36 c027718a be8432c0 -> 40526f29", + "80000000 00000000 3e4910d0 3bf3c600 3ff7f7b0 3ff7f7b0 -> 00000000", + "80000000 00000000 7f800000 ff800000 bf853af2 bf853af2 -> 00000000", + "80000000 80000000 7f800000 7f800000 c03fcb21 c03fcb21 -> 00000000", + "3f1c4320 404b71ae ff800000 ff800000 c03b7ec3 3ef955b0 -> ff800000", + "80000000 00000000 7f800000 bf3589e8 c004199e 3f4c3114 -> c001e073", + "405882aa 3f58fe18 bf3c8892 ff800000 3f5ba17c 3f5ba17c -> 00000000", + "3ed60fd0 c0787bf7 7f800000 ff800000 c027a669 c027a669 -> 00000000", + "40415c10 00000000 ff800000 7f800000 3ed104e0 3ed104e0 -> 00000000", + "bfd396d0 00000000 ff800000 be9a61e8 c03e89c2 c03e89c2 -> 00000000", + "00000000 3f504908 7f800000 ff800000 3fa5c6a4 3fa5c6a4 -> 00000000", + "00000000 bffb884a ff800000 7f800000 be7903f0 3ecc3d80 -> bdc934ef", + "00000000 3f2bd2f8 ff800000 7f800000 bfaa3d52 bfaa3d52 -> 00000000", + "80000000 00000000 7f800000 7f800000 3ff3f280 3ff3f280 -> 00000000", + "00000000 3fe24c9c 7f800000 bff12655 3f102eb0 40087702 -> c03d302a", + "406358a8 00000000 3ef01bf8 7f800000 3ffedf74 3ffedf74 -> 00000000", + "00000000 00000000 7f800000 3fd89804 bfaebcbc bfaebcbc -> 00000000", + "80000000 80000000 ff800000 7f800000 bf843386 bf843386 -> 00000000", + "00000000 404be2c4 ff800000 3fc25892 3e4d0290 3e4d0290 -> 00000000", + "bf0e67fc 80000000 7f800000 ff800000 bffe5952 bffe5952 -> 00000000", + "00000000 3fa4f594 7f800000 3fe5d4dc bfafd589 bfafd589 -> 00000000", + "00000000 bf77c8f0 beefd1e4 ff800000 bf79e4d0 bf79e4d0 -> 00000000", + "00000000 3f2f9d20 7f800000 ff800000 c017a5d0 c017a5d0 -> 00000000", + "80000000 80000000 ff800000 bf4b5558 3f19e55c bf993596 -> 3fb6cea8", + "c04aecf2 bffdc53c 7f800000 7f800000 3ff42e04 3ff42e04 -> 00000000", + "00000000 bf8733ce bf30ee0c 7f800000 bfdf4843 bedbf9d0 -> 3fc139ba", + "80000000 80000000 7f800000 7f800000 3f65e7e8 3f65e7e8 -> 00000000", + "80000000 c01677e0 ff800000 ff800000 bf007e88 4034553c -> ff800000", + "c023ebaf 80000000 3e888168 3fd868b0 3fd88290 bee63c60 -> bf1223eb", + "00000000 00000000 7f800000 beb09d98 bfac21b0 bfa0ead4 -> bcf793d2", + "00000000 80000000 3fe85996 3f3ed978 c0316f65 c0316f65 -> 00000000", + "00000000 00000000 7f800000 7f800000 3fdab088 c005b692 -> ff800000", + "00000000 80000000 7f800000 3fc6a1dc 3f5b0e68 3f5b0e68 -> 00000000", + "80000000 80000000 7f800000 beae44f8 bf31265c bf31265c -> 00000000", + "80000000 80000000 3fd86ce6 bf6d3f26 3ff3c428 3feb4ba0 -> 3d7b359a", + "80000000 3f9d2860 ff800000 7f800000 3f665fd8 3f665fd8 -> 00000000", + "80000000 80000000 ff800000 ff800000 bf3d4470 401a79f4 -> ff800000", + "80000000 00000000 7f800000 3fb11030 bfeb92e0 bfeb92e0 -> 00000000", + "bfea040a 80000000 3f4a5d74 bea5d2c4 3f741340 40247da0 -> bf060c1d", + "80000000 401a5258 ff800000 bf87f253 bf009dc4 40089a4c -> c033879b", + "00000000 bfe60b72 7f800000 ff800000 40386c38 40386c38 -> 00000000", + "80000000 80000000 bfcf6e6c 7f800000 403515f0 403515f0 -> 00000000", + "00000000 3f90bd0c ff800000 ff800000 3fa3921c 3fa3921c -> 00000000", + "00000000 3f494080 ff800000 be21e630 bebcd298 bebcd298 -> 00000000", + "406a06a6 00000000 7f800000 3fecf07a 3f8a6220 3f8a6220 -> 00000000", + "bf720b18 00000000 7f800000 ff800000 c031ef1a c031ef1a -> 00000000", + "bfa18170 80000000 3c31b200 ff800000 bffa78f4 bffb00c0 -> 7f800000", + "80000000 c010f43c 3f35544c 7f800000 bd35a040 bd35a040 -> 00000000", + "400eec30 80000000 3fb9fe58 3ff68576 402f8fb0 402f8fb0 -> 00000000", + "00000000 3f727ac8 ff800000 7f800000 40196800 40196800 -> 00000000", + "00000000 80000000 beabf8b8 7f800000 40275b20 40275b20 -> 00000000", + "80000000 c06216f0 ff800000 ff800000 3fbcd710 3fbcd710 -> 00000000", + "3e2b8e20 be09a8c0 7f800000 ff800000 bf2dc6fc c01fc7d8 -> 7f800000", + "80000000 80000000 ff800000 bfdd501a bf26753c bf26753c -> 00000000", + "407b0f90 00000000 ff800000 bff2b216 3f233758 c02aa030 -> 40c87116", + "c01eb335 00000000 ff800000 3f3265c0 401b2e1e 3feb10c0 -> 3fbab530", + "80000000 00000000 3f838946 3f0a5c88 3f0a68f0 3f0a68f0 -> 00000000", + "80000000 80000000 ff800000 7f800000 c02c2d43 c02c2d43 -> 00000000", + "00000000 00000000 ff800000 ff800000 c0275de0 c0275de0 -> 00000000", + "4015a6ce 40201064 7f800000 7f800000 c023744b c023744b -> 00000000", + "00000000 00000000 bdbabbb0 bfd7fffc 3f7393f8 40147bb2 -> c013ce4d", + "00000000 00000000 7f800000 7f800000 402fac7a 402fac7a -> 00000000", + "00000000 00000000 7f800000 3f2cba98 4022c284 4022c284 -> 00000000", + "bf7649a8 3fd2428c 3eef5f18 7f800000 401ff64e 401ff64e -> 00000000", + "80000000 80000000 ff800000 bf58f31e 3f568188 3f568188 -> 00000000", + "80000000 4039be2c ff800000 ff800000 402c7c98 3f8ee1f0 -> 7f800000", + "c0762d7d 80000000 7f800000 3f97fcf0 3f0b0374 3f0b0374 -> 00000000", + "80000000 00000000 7f800000 ff800000 3f52ccd8 bfc0fc02 -> 7f800000", + "00000000 4070b1da 3f5b1dc4 bf13e846 bff47ea1 3f35263c -> bfc19734", + "80000000 00000000 3f9c9f20 3f65673c 3fb0e250 c004e4f9 -> c046574d", + "401ed582 00000000 bfb557e0 7f800000 3fe43a6c 402222b6 -> 3fee5b90", + "80000000 bfc22d2e bdcfeaa0 3fa464a0 bfbda1fd bfbda1fd -> 00000000", + "00000000 80000000 3b208000 bfaca132 c030f6ab c030f6ab -> 00000000", + "3f9d2ae4 80000000 7f800000 7f800000 400dc94c bdccfa00 -> ff800000", + "00000000 80000000 bfcfc459 bf3e3016 40200df4 40200df4 -> 00000000", + "80000000 80000000 7f800000 ff800000 3ec4ecd8 3ec4ecd8 -> 00000000", + "00000000 3f892e30 7f800000 7f800000 3f9fcfc8 3f9fcfc8 -> 00000000", + "80000000 c042469e 7f800000 3f89d6f0 c008d2e1 c008d2e1 -> 00000000", + "80000000 00000000 bfa9f914 7f800000 bfe56d87 bfe56d87 -> 00000000", + "00000000 00000000 7f800000 3e7e1130 bfe16440 bfade4e4 -> 3dcc6f4a", + "3fed278c c0175c36 7f800000 7f800000 4006c8da 4006c8da -> 00000000", + "00000000 80000000 ff800000 be0c0b68 3f5397e8 3f5397e8 -> 00000000", + "3eb88820 c0494d42 bef4f1f4 7f800000 c00a6ab0 bf5aa13c -> 40d5c9c0", + "4058173a 80000000 ff800000 bfb537a2 c021c9a4 c021c9a4 -> 00000000", + "bef693e8 c039c856 7f800000 3fe18074 3f047ec0 3eefba60 -> bdb20561", + "c005b8ad 00000000 be9992cc be1fb720 bfc55229 bfc55229 -> 00000000", + "00000000 00000000 bff6c59b 7f800000 3f121cd0 3f121cd0 -> 00000000", + "80000000 bf7e2114 bec9b580 ff800000 c0122268 c0122268 -> 00000000", + "c01aa58a 80000000 3ff5ddde ff800000 c0001a48 c0001a48 -> 00000000", + "00000000 00000000 7f800000 bfd66c9d c0177ec3 c0177ec3 -> 00000000", + "3f322310 80000000 7f800000 bf947393 3feaf4e8 3feaf4e8 -> 00000000", + "00000000 80000000 bfa02d07 ff800000 bfde7439 bfde7439 -> 00000000", + "00000000 80000000 ff800000 7f800000 c02b599c bfee1d64 -> 00000000", + "80000000 00000000 3fddd822 7f800000 3fb54f5c 3fb54f5c -> 00000000", + "00000000 4007f0d0 7f800000 ff800000 3f31f590 3f31f590 -> 00000000", + "405cb2f2 00000000 7f800000 3f8d6758 bfe7a6d8 bfe7a6d8 -> 00000000", + "00000000 40567352 ff800000 3fd0fb4e 4030ba98 4030ba98 -> 00000000", + "80000000 00000000 ff800000 7f800000 402e382c 402e382c -> 00000000", + "80000000 00000000 7f800000 ff800000 bd8df4c0 4000ba00 -> ff800000", + "400e00d0 00000000 7f800000 bf0354a0 3db22980 3db22980 -> 00000000", + "00000000 00000000 7f800000 bf1c13f0 c03fb2ac c03fb2ac -> 00000000", + "00000000 80000000 bff31dff ff800000 402821c6 402821c6 -> 00000000", + "80000000 c0689249 7f800000 7f800000 bf9fa480 4013c62c -> 7f800000", + "bfd95cea 00000000 7f800000 ff800000 c0173b18 c0173b18 -> 00000000", + "80000000 3e952d00 7f800000 bf8097d4 40302390 40302390 -> 00000000", + "80000000 80000000 ff800000 bfeffee4 c01eb36c be619270 -> c0879000", + "404b75a4 80000000 7f800000 ff800000 3e95b1b8 3e95b1b8 -> 00000000", + "c00e25f0 bfbdd6ae ff800000 ff800000 4026857e 4026857e -> 00000000", + "3fea06f4 00000000 bff0ce8a 7f800000 3fd74714 c025bd4f -> c0f9e9f2", + "80000000 00000000 7f800000 bfb96dd4 bd946640 3fe4f32c -> c02c8dcd", + "40261dbe 00000000 7f800000 3f3f6830 3fb95060 bfc2eb22 -> c00e2593", + "80000000 00000000 3fde5382 3f1fb348 3f5e8390 3f5e8390 -> 00000000", + "80000000 00000000 bf8a5d94 ff800000 40363990 3fbfa8c4 -> 7f800000", + "80000000 00000000 ff800000 ff800000 4005e244 4005e244 -> 00000000", + "4024309a 80000000 7f800000 7f800000 3fdecd88 3fdecd88 -> 00000000", + "00000000 00000000 7f800000 3f91238c 40079ca8 40079ca8 -> 00000000", + "00000000 00000000 7f800000 7f800000 3ff7960c bcc05800 -> ff800000", + "80000000 00000000 7f800000 7f800000 40065cc0 3fe91e88 -> ff800000", + "00000000 3fe389a0 bed1d474 bd357fc0 c01f4cc3 c01f4cc3 -> 00000000", + "00000000 00000000 bf0a3aa4 7f800000 c032ed34 c032ed34 -> 00000000", + "80000000 80000000 ff800000 7f800000 3d3a0e40 3d3a0e40 -> 00000000", + "80000000 80000000 ff800000 bf6eae48 bf888f74 bf888f74 -> 00000000", + "405c38fa 80000000 3e25bd20 bf0077c0 3f8d28cc 3f8d28cc -> 00000000", + "80000000 c05d2c4a ff800000 befb6b5c c00cb828 c00cb828 -> 00000000", + "403e43e6 80000000 bfb8ab82 ff800000 3faf7fb0 3faf7fb0 -> 00000000", + "00000000 bfd6fecc ff800000 3ed7c3c0 3f225020 beac0090 -> 3e7ee0dc", + "80000000 80000000 bfda0e7f 3f5b65d0 3f74fed0 3f74fed0 -> 00000000", + "80000000 c037e6c4 7f800000 7f800000 3fa63768 3fa63768 -> 00000000", + "80000000 00000000 ff800000 7f800000 402a7c9a 402a7c9a -> 00000000", + "3ff192cc bf9b4ede ff800000 ff800000 c01f8d5b c01f8d5b -> 00000000", + "00000000 bf801ad0 3f59ed4c ff800000 c02ff429 c02ff429 -> 00000000", + "403bdb5a 00000000 3fd09b08 7f800000 bfdc1271 bfdc1271 -> 00000000", + "4063f4fa bfd6c9cc be9b4e08 7f800000 bfde6f62 3cda9100 -> 410d15b2", + "80000000 80000000 ff800000 3ea3f328 be05b570 be05b570 -> 00000000", + "00000000 80000000 ff800000 3edcd728 3f53d948 3f53d948 -> 00000000", + "c03d9d24 80000000 ff800000 ff800000 bfd2feb9 bfaea521 -> ff800000", + "80000000 00000000 7f800000 ff800000 bfaa4ef0 bfaa4ef0 -> 00000000", + "3fbe989c 00000000 ff800000 bf955032 3f043390 3f043390 -> 00000000", + "00000000 00000000 ff800000 bfb66c20 3f5be7f0 c03ae854 -> 40ac5d0f", + "bfbd1070 00000000 7f800000 ff800000 3f097bf4 bfb0083c -> 7f800000", + "407eb752 80000000 7f800000 ff800000 4017e772 4017e772 -> 00000000", + "00000000 00000000 be3e4598 3fd93476 3f1bbd64 3f1bbd64 -> 00000000", + "80000000 3e011e80 bf8a1de8 3e70f440 c020ae44 c020ae44 -> 00000000", + "00000000 80000000 7f800000 ff800000 403ce988 403ce988 -> 00000000", + "80000000 00000000 7f800000 ff800000 bfec7761 bfec7761 -> 00000000", + "c01aacb0 80000000 7f800000 bffce4f3 be0040d0 be0040d0 -> 00000000", + "00000000 00000000 ff800000 ff800000 bf2f0254 bf2f0254 -> 00000000", + "80000000 3fc97bcc bf3468ec 7f800000 401fb7c2 c002f127 -> c06786d0", + "80000000 80000000 ff800000 ff800000 bf0a598c bf0a598c -> 00000000", + "00000000 00000000 beb9c524 ff800000 3f949a78 3f949a78 -> 00000000", + "00000000 80000000 7f800000 bfd73167 3fa7e328 403d13e6 -> c030c039", + "80000000 00000000 bfc58738 ff800000 3f5f8ea8 3f5f8ea8 -> 00000000", + "3fb9b348 4007bb94 7f800000 ff800000 3fe45408 3fe45408 -> 00000000", + "3fde732c 00000000 ff800000 bfd1e56f bffd7643 bffd7643 -> 00000000", + "00000000 00000000 3f29de30 ff800000 bece6e60 bece6e60 -> 00000000", + "80000000 00000000 bfaab168 ff800000 bf0391a0 bf0391a0 -> 00000000", + "00000000 00000000 3f54e0a8 ff800000 bfc96f89 bfc96f89 -> 00000000" + ] + }, + { + "glsl": "SpanNoise cultmath_span_fbm(SpanPath, SpanStage, int, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "c1e8c486 408859a0 4209df1c bfd405da bfae7f45 bf4bf283 40173577 3f3df92e 3dcccccd 3daf634f 40773997 bee454c8 3f4650cf 3f117634 c0fa9f30 40328fb0 c084111c 40cdfff8 c07fcc48 c038ffca bfe64a6f bf5f5c56 3f9985f8 00000003 bfce4600 bf721003 -> beabe5a4 3e0539c6 bec85e69 3f290ddc 4052379f 00000000", + "c189c6d0 c1a1a95d 421a9dca bb872588 3e566bda bf6d4d57 3f7a38ae 3fad719d 3ca3d70a 3ebd46b1 421ba090 3fee0ccb bf94d83b be4eaf17 c0ab18ec c04962ae 40fc3e12 c0cf5763 c03a6dfc c0b8d06c c0333f47 c03ee6a2 c03de320 00000002 3f4d9338 be75267e -> be3bfd40 bee86efe 3ed91f5c 3e81cb36 4084a651 00000000", + "4171abd0 4100b594 41e79c38 be3ab428 3e2e3b8c 3eef71ee 3f391044 3ec58756 3f000000 3eca832b 40052ea3 be9184d6 bf096b92 3e9cac7c c0b8afb0 c0333dc6 c0b5cd4a c09daa9c 40d488ba bd778080 be8986c5 bfa7b7ac c039408d 00000004 3fcc6857 3eedc0c3 -> 3f1c45fe bf4ac425 3e59bc0e bd0437f6 4236b592 00000000", + "413fd3c4 c1a2b8dc c0912300 bfe8af9f 3f1b8111 3e81713d 400477b9 3faec659 3dcccccd bd984a9a 3e99c3d4 3f8ea27a 3f81ec15 3f8b2e04 c012a21a 40f315bc be0985a0 c019d566 c0bc628e c09185dc 3f84d85e 3f13f3e2 3e584f9a 00000005 3f36a156 3f8b8bfb -> 3e0e7221 3ed5cfce 3eab833a bfb45f1d 40b42f1f 00000000", + "40cc6a60 4133d034 41fba404 4019b988 3f139385 bdf9342c 402025a7 3fba886c 3ca3d70a bc858213 3e57ffb3 be856941 3ec0c011 c01f90c2 4089161c c0398198 40b8e87e c0882fa9 c0b1f685 c0819f02 402dd736 3f69e33e 3ea75944 00000005 bf53e0b0 bf2cc0e8 -> 3b852f1f bcbbec36 3d84e78b beaff143 3e6d6e6a 00000000", + "4231d2d0 c1aba9ae c2443623 3fab6f26 3f949615 bfaa0f42 4024a6c8 3f371a21 3f000000 3fd49533 3c766fa8 bd74c1ac 3f46c890 bf22300b 40e8094c 3fb8b970 c0de5299 c04379f4 40ef200a c048773a 4011b36b bfa17c11 bfea954b 00000004 40268527 bf27efb8 -> 4192a37c c39cd16a 438302f6 3e4b2811 4c91e2f6 00000000", + "c1d5f064 c194386a 41126b84 3f14e7f8 bf8c110b c02d2ab0 406c4b7c 3fb75103 3f000000 bb1e41ea 3e8cb0c3 400e1b01 bf966cf6 3fb3d0d9 400a57b8 c08c3d74 c0ffb8de 40bcd070 c0b325de bfc386ac 3fff3828 3ff71900 3f9aaaed 00000005 bff19635 bf845b60 -> bd324040 3c409948 bd7ead2c bf4ae73a 3f8949ed 00000000", + "3f802d20 c1067134 403266e0 bef9b9e5 3fbf0341 400ab782 402b653c 3db224a6 3ca3d70a bf0a21be 40077d71 3f09df29 c00b90e7 3eb0cc37 c0d9333b c0bab75f 3fd6ec60 40517608 c0487e0e c0d3c302 401c3cff c0359246 4024ee5a 00000001 c0285ac4 3f0860c1 -> 3effe827 be8c1b9f bf47ac03 3ea47b0c 413d149f 00000000", + "c0836d58 c2303c12 40913c88 3f02a951 3e1f7eb6 3ed1d98a 3f32319f 3f947d04 3ca3d70a bcb992d2 3c348184 3c81fbb2 3fa2796b bf490d24 3f9b5978 c0b9b5f2 c0748930 3fd20130 c00b19d6 409533f4 3ed6e69c 4030b114 3e2fb80c 00000005 3f3ac510 bf575170 -> 3c9899c7 3ee5208d be555174 bf2747fe 4389f73a 00000000", + "41a3f724 41bf57d8 c13ed9ac beb5332d 3f9d9383 3f746b6b 3fcc7e55 3fcb0906 00000000 3f9961ef 3c829ece bf112939 3f0a57af be552572 bfa9bc30 3ffe5758 40d50412 40cee2b6 c00b50ca 3ff7abc8 bea63a7d 3f7418a4 bfd66bc1 00000001 3febb7c6 3f8c99db -> c2a5b4e1 4299db1e c202831a bed784d7 4814f9ee 00000000", + "41466c9c c1fa6241 c1f201bf 40135b9c 3db49ce0 3fe964c4 404b110d 3ef0334e 3f000000 be55c93d 3e6684ec 3efca50f 3edf817e bd858552 c089c9da 40e68558 c0c5c125 c09327a4 4091b76c c0ce1070 be672ed8 3e103ee6 3fe589bd 00000003 3f5eb2fe be83c4b9 -> 401d2baa 40155d06 be090d41 bdecadcc 426bf920 00000000", + "41ac8848 c1c8d5d4 419ee46c bf8c9a83 402d8df3 be472928 403e36fb 3ffee66a 3ca3d70a 3c0d46fd 3c9bf162 be45aca4 3e744a01 beffecc5 bdfa11c0 40e8be3e c05e040c 407fbba8 40c4bafc 40515ef8 bfdadd3c 40084c64 3fde692e 00000006 3fae2c08 bf96b088 -> 3fbcc2f2 c010e5d0 40891e28 3fb3f9b5 447c6731 00000000", + "419b84c0 c15badb0 c214e7f1 bb8b29e7 3daa323b 3f925209 3f9ead5f 3e3f838b 3f000000 bd8e1057 3e268108 bd159118 3f7093f8 4016ad5e 4084b7f4 bfb191ec c085323e c0dd4ed7 40b8b6ea c0aad83f 3f9b3a24 bfbea860 bfa670af 00000007 40396b71 3f10163d -> 3ebada3d 4055ed07 beae3ae8 bdfa7d0a 480b76e5 00000000", + "c143b798 bfb00160 4223b0d8 becb8c2b bfc907e3 c0163973 403861ba 3fb8ee45 3ca3d70a 3e148220 3e216a44 be96defc 3fa0263b 3e72019d 4054ad64 408aa782 c0503aaa bf3e6958 c06b28a6 3fc7e108 3de9226d bfb45af6 bf8380ea 00000005 bf0b7977 3f868b0a -> beabf28f 402103cc 3ea1bc39 3f395fb0 42751101 00000000", + "422a9ee6 c2326299 41f372d4 3fec7421 bf9372e2 3f2fc27c 4012182c 3f2e6e91 00000000 bbfe1a2f 3e296a80 bf0b2f4a 3f5a96a5 bf6c5440 c0847ef4 40dc54be 40c57ee4 40f1ed84 40b3d6a4 3e9905e0 400ce8a4 c021a8db be7632d0 00000001 bf0e10b9 3e183bcc -> 3b849332 bc153149 3cd46fda 3d19da97 3d3162ff 00000000", + "4227afd4 40ce3ae0 42073478 bff05385 bf94e2c8 bfb6d1dc 402855c6 3f4a0183 00000000 3d700ca9 3cf17e9b bf354721 c0104a71 3e96ed08 c0099b4a c0273c84 3e9904e0 bfef5e4c bfdb0ae8 c05e8768 bf72a154 3ffcb970 40045238 00000005 403015c7 3f497076 -> c23f9b32 c30a23fc 4190ca7e 3f7a647d 480bab76 00000000", + "41cd4e28 4123e7e8 419d3464 3d855d67 be8d5546 bbaa051a 3e913ca1 3f753fb6 00000000 bd6960a2 3f133dcd 3f01e8d0 bff5a312 c00aec5c 40d4420a 40f130d8 c0f8accf 3fb379f0 3feb0910 c07b13a8 bf6076c5 3e1b28ba bfaf18e8 00000007 bfdd6d30 bf26cf77 -> 3ded1a42 bf9eb62b bf0098b8 be2800c0 419aaf14 00000000", + "c0ce3178 c14c8710 422d6d32 3fbaec37 3f78eaf5 c01a82de 403f3ec3 3e439da5 3ca3d70a bdf42534 3f83d100 bd18b614 3d502dcc bf018def 3f023660 c0b0a519 4013d810 c0cedc18 c0e6f551 c094e390 bf8b784a c01bb2f7 c030fa23 00000002 bfd5b3fc bf21b657 -> 3e29ca4c bd2d2070 3e557ed5 3efe5d6d 3fa3f121 00000000", + "407c8a80 41976410 c1e42d6d 3f3e9daf 3f028cb3 bfa84f50 3fcc2381 3fd7b1da 00000000 c09b3fd5 41013bb7 bf2eacc7 3fbf8072 3eff3d88 c0b977dc 40df71c2 c0650a84 40fb91da c0c74236 40802768 400d565b 4036d0e7 c039a62d 00000003 c0104194 3f420f50 -> 40b6c1c0 41915625 c1f443d2 bdfc5598 463d0826 00000000", + "c101faa0 c2246379 419e1838 c009e8c5 becee55d bf7fcdae 401b62ed 3f6d5d9b 3ca3d70a bda14697 405922db 401a0b3b 3ec73f7a 3fcdcf23 401ff42c c0f26032 401cde2c c05766ba c003a452 402b5ad4 3f951e18 4026d012 3f74c1a3 00000004 4038df8e 3e8bae39 -> 3e05ec4a bd530b80 be5d051a 3e0e2536 40c738a6 00000000", + "c13346b0 41f6276c 420e4546 40178adc 3d688fb8 3f90314d 4027e8db 3ad4cb50 3f000000 c0b826b7 3d0395ab bf4c86f9 3eedefd0 3f208905 3ea5cc20 c0feaa41 40f98f92 c07ead52 c0b3dc38 40ffa62e 3ffdc042 3ec711bf bf69aa23 00000008 3ff4295f 3e4fcef2 -> c377f82c 4317cbf4 4357025f bee87499 4abde401 00000000", + "c2474822 c1897a80 41c5fa74 bfc081f2 be8f0bb5 3f30bf8f 3fe57cf7 3f92ac00 3dcccccd c0aed12c 3e5ce478 bde110f5 3f7dc9b0 be623f80 40423ec0 409cfa26 3fb06088 c0d4ed0c 40c858e4 c03b1ff0 c02515ed 3e2a6b6e be706064 00000008 400f667e 3f8c96aa -> 45e681de c680d80e 44b7fa2f bf7222fa 4fc96248 00000000", + "42372ab8 c0123920 4225584e 3e46a4a2 3f38d0c9 bfbe3847 3fdfdb66 3f5a88a6 3dcccccd bddbec60 41c5aab5 3e062c2f bf9aa084 bf989938 c0b0ce54 40a33b98 3ed8fe40 3ff775f0 40c03150 bee58900 c01eec70 3e095f6b bfa10dce 00000008 3f8ac558 3f513c21 -> 3c7c6a40 3ecbdd24 bee2f328 3e845d37 4035459e 00000000", + "408af178 41a23fa8 418c8748 c000fb6e bf820795 bfc09004 402fad5c 3fd0bde9 3ca3d70a 40860c6d 40827671 bc4a5e83 bef90d91 be202b0e 4098db26 402fe65c 4079706c 401b5a20 4045b8d4 407f17f4 401a1d80 3de32362 bf9e4e89 00000006 c0332eb7 be62299c -> c1188c68 c0127f11 40c75df0 bea077a4 47073620 00000000", + "41d25c84 c23c0cdf c20f60c1 3f8d74e3 3ff473f5 bdec94f5 4013ae54 3f7ae2a2 3dcccccd 410e0e65 420ae7ae bf185aa3 be33ad5a 3efe88a7 3ff42b10 403612ec c0fc7bfa c09fa6fe 40cf909e c04b20a6 bee9a968 bfee04e9 bfccb1d8 00000004 403a3287 3f80ce75 -> c3982d36 41ae3ea8 c3b0ac48 bf2e824c 4a3b65e2 00000000", + "c00eed60 c1f9c353 c1743468 be872098 3e9191d8 3f36174c 3f4f6966 3f533a57 00000000 be0116b2 3ed38680 bf8a2323 3ec91869 bf80b05d 40cbad9e be41b320 403de714 c0ee90b1 c0f14314 c00dbc3e 3fc8fa5b c01450e8 3e25ee7c 00000003 c002c1cb bf74062e -> 3f1683cd bb33fd00 3efa9cfc bea2e09e 422f39f5 00000000", + "c22ebbe2 bfbcbe00 c22d8ece bf82a489 3e172181 3e1d9f3d 3f8576bf 3e4fe027 00000000 3bdf54db 3e859a53 40187857 bf088117 bf10aa56 40e9dd06 406a649c c0ff713c 408f580a 40f7545a c01cd20a be0709c8 4007a19c bf6d7d6a 00000005 403d378e 3e631b0d -> 3b144e5d bb8aa09e bca31034 3dbcd6fd 3ec6ccc9 00000000", + "c22ef0d5 c226860f 40940d30 be5895d2 3ebd7d13 3ec06e4e 3f483a4b 3edaf920 3f000000 c0abe0a3 415e681d bfd20629 4006573e bf62800f 4071e64c 40b5e4fc bfc2d310 c09e99ba 409f7b52 40b652c0 4019908d 3febfe1f 403da491 00000004 3fd500b8 3ea02514 -> 4148d96f 4191920d 41827b8a 3ea70d30 45a3d818 00000000", + "c22ab0a6 c1efed8a c1640d50 3d9fca6a bd106bd7 3f13aed1 3f16996a 3e81dec4 3ca3d70a 3c6476c4 428f10ed 3f4db2b6 bf56e31f bfd534e0 3fa52e48 c0b55d62 409371a6 c0f16f5d c0598a22 40adb1e4 bf26a117 3fd32243 bffa4352 00000001 400b9c55 bf3e0c90 -> bc754ac8 bc1b4f65 bb250a07 bd0923d3 3b1e516a 00000000", + "40a078c0 c0d7f3c0 41a1e938 bd491ae4 bcdeb047 3f396332 3f39f17f 3f8ff087 00000000 bc7043bf 3c46f52c 3f6a46d5 bf2adf15 bf93bbd4 c0985fb4 c0360fe0 c04b17d0 3fadf058 c081cb7e 40aadfd8 3f288b0d 3fb367a9 c02c1802 00000003 3f8efdcf 3eb0e626 -> 3fc03631 bf8d1a48 bfedaf3f bed4d5e6 42531e27 00000000", + "c17b4514 41f29130 4239f0f2 3f66df55 bf0bb35d 3f2d47f0 3fa93fca 3f320b23 3dcccccd 404fd5ed 3fbc4642 bfe53418 3fa6f122 3fbba932 c0a46ade c0d6c057 3e3efe80 bf1f6658 bf3b1750 408c68ca c0123148 4039d763 c0216e01 00000006 40066bc4 be93f058 -> c0919b2b 3ff84acf 40ef8ea0 3ea0f90d 45db941c 00000000", + "c1e4c8de 41ba4210 41f58304 3fe0355b bf17bd14 bfd1b808 401e1eaf 3e2e0e8b 00000000 c0b58068 4140629c 3fbf9144 bf037b40 bfa5f2f9 3f72a940 bf9dbf00 4060d6d4 c0cea58c bdee2180 3e8c8d60 3fca08ba bfe5f40b bf44e87c 00000008 c03c5ddf 3edec443 -> 4218ab66 42b82b40 41e54382 beba9708 4bc3a406 00000000", + "c23b8ec2 c0f67120 bfb7ea00 3ea23f8e bd1489e8 be295efe 3eb81125 3c2cdef8 3ca3d70a bb23ab4d 3dd9ea35 bf2b45e5 be3d11d8 3f98b414 40950a00 40799824 c0b5a5d8 40452128 c05dd8d8 bb7d3000 bdf10c64 bfb40370 3f175799 00000007 bfd7c2f4 bee82815 -> bc60f16e 3c000a2c 3c48dc08 3e9cc376 3e617d62 00000000", + "c1ffb6ae 40d16fe8 c22cb319 3fa6d768 3f04eb30 3e987b4e 3fc095f9 3f33dfaf 3dcccccd 4111ef02 3e537bea bf28fb62 3f8f9cec 3e1391ff c04dc29c c0062e84 4003c4ac bfa336b4 409d1ad4 40dbb1d2 bf7c5fa8 bf18b4ab c0373f54 00000001 4032abc0 3e09e1d9 -> c2804c8f 4306791d 3f1d2285 bebaaa4b 47d3f531 00000000", + "c16393fc 40498970 418ac5ac 3cdecc73 3eb869ec 3eae8151 3efe45b3 3fe94915 00000000 3b465572 3cb84973 bed59b57 bf05e65f bf7860fe c0d0820b 403cbdc4 408f244a bfea3be8 c018d5b4 40845102 3f44f44e 3fbcec2d bf51f3fa 00000004 40293138 3e04c2c2 -> 3c20814b 3b0055d2 3c93ddf8 3f165b4c 3fb9d308 00000000", + "c20aefe4 42215ed0 c22c52b6 be905088 bef9e826 3e38e733 3f1783e3 3e286dc0 00000000 bbd33a6c 3d847d7c 3fb8294f 3f4ef38d 3daae83e 40983458 40a30048 c0945b14 bfffa0f0 c0cf7349 40c2d8ea 3feac2c6 3ff5a60e 3fdabe8f 00000005 bf8e354f bf8ad0dd -> 3b89aa80 3c7cdbc0 bd88b2db 3dcafe80 40082b55 00000000", + "415f15a4 c1083a08 bfab6ae0 3f3cca0b c02193d4 bf828f21 403dd42f 3fb9b05a 3dcccccd 3f1024d9 3d813dc8 3fba2622 3f82d30c 3f93d455 40dccd36 bfdc5f94 40d1ea54 c0a68a5e 408063e2 c0b073b1 c007d2bc 3ff18ff1 c00b1c3a 00000001 bfb90b0a bf276008 -> 411c24cb 40ff3ad8 40eefa13 3f4dee18 458a6d8e 00000000", + "c1dc0226 409882d0 40d35ff8 bfd2b98d 3e110a75 bf4489fe 3fee0283 3ebfae1b 3dcccccd 3de8bab1 3c906ea5 be987339 4034f869 3e08b5d4 40e7e21a 3fd059c8 c0e35bcd bfd884b4 bed42740 c0f4d7e6 bf83deb9 3f963d16 bf912118 00000001 4037422a bf16cfe5 -> 3fb1c646 c13a594c bebfe100 3ee903cb 45107853 00000000", + "c1c0eeb4 c1001f50 c24268b7 bd6375b0 bf1083b8 3ee0d78b 3f48d88e 3f2c0586 3dcccccd 3d584989 40072769 3f8b5bef be0d90e0 3efb19c9 3ff7db08 bfd805fc 3fe62820 bf1d1598 c057497e bfdf69c4 3f9c6557 3f9845f5 bf5f475b 00000007 bfe2eef0 bec6a711 -> bd023ce4 bc81719e 3985b870 3e82d970 3fd8d2dc 00000000", + "41fe142c 4129e8c8 420722a2 3fb719a3 3f07aec7 3ea19020 3fcd0f34 3ee27565 3dcccccd 3bd63e83 3ec92df7 401e93bf bf080be8 bfbb02e3 4095043c c0f4f28a be930370 c0f67ad4 c00bc180 40b8c902 3fee22ab bf8a91a3 bf61e0d4 00000005 3f99ab82 bee0349e -> 3d3ceb30 bc446e5b bce1c991 3eb49e6a 3c743699 00000000", + "41c572a4 422ec68c c1f32288 3fae2a74 bf3eb647 bfd111ec 40102ad0 3fa1aa0d 00000000 3d18a6b0 3d0300e0 3ed211fd 3f994298 c00638a2 3f718700 4094f6d2 bf8dfcbc 40c5d076 bf272e50 c00b6948 c03750d3 bf7b4183 bfa2e751 00000006 3ffc6326 bebc2c1a -> 3ebca933 3f63b3e6 bfc73e20 be48025e 440aa932 00000000", + "41c56454 41b4e2f4 42198eb4 3e80372a 400ec263 bfa44ab5 4025ff63 3ecd5750 3ca3d70a bcb58cc2 3dbcf515 beca9e70 be9efd37 3e82ffaa beec75a0 bfe12304 c062b746 c00359dc 40e5788c 4054deec 3fda2ca6 bfd453dd 3f1f991d 00000004 403b5f56 bf3dfad3 -> bfbc94b3 c00c4c14 3fd87bc6 bf994f8c 4472e934 00000000", + "c1968389 419c5290 41574878 3e8b71ee bf1638e3 bd5997cf 3f262bd8 3faa8f72 00000000 40bc546b 403bf13a bfcce6f8 bf9f7101 bf8bdb46 3fc392a0 40f77fe4 c0a56074 c0b626e2 40efa8be c04d2c92 3fe6c8be 3f66379d c0227eb6 00000005 c03ad71c 3f245067 -> 4226c89a 43521ddf c30fb345 bf3ce258 49df6efc 00000000", + "421bd68a 411fdd98 423cbf8e be548efe bf6338f9 bfa53c2a 3fca46fa 3fa6de72 00000000 406ebc6d 41f8ff42 be3ca009 3e3b8fa7 3eeb10e4 c0d58352 40f07626 c02f4e7e c0d59f52 3f619880 bf742230 c0359918 3fe22855 4032de16 00000001 c00c4f9a bf874eac -> bf96a4ae c101f10b 402567b6 3df261c9 438c40e2 00000000", + "41e52f20 c07fa660 c2125a47 bfb0a809 3eaee9b7 c01f78c2 4037bf99 3de3ff52 3ca3d70a 3bbddb34 41d9ae3e 3dcf8a72 becacbeb 3f1f5cbd c0c0c100 4057584c bf88d944 3f8adea0 409e9c82 40cf49c2 bfc7bdae bf72da19 c0152ff4 00000004 c0370912 3e06e652 -> bcb5b4f3 bc49d780 bb831683 bee32ef3 3b906ea9 00000000", + "c20d4088 c05ff650 c115b880 bf6affcf 3e4a16b5 3e857026 3f947bb7 3fed8cc3 3dcccccd bde039a2 3e3fef7e 4005c75e 3ee3191e 3ff8cdd5 c0c707b2 40d29c46 c0017c5e c0831230 bdb07400 c00a977a 4009f3be 3fb8f755 bea76d8b 00000003 c01d34eb bf862c5c -> c066d8c1 be715548 c09cbad0 3e4d8508 4460432b 00000000", + "419ab084 422b18a0 c224c589 3ed10fdb 3df3cccc 3e03d732 3ee38635 3f1934a8 00000000 40a28ea6 3f91d12a bf632bce 3f6c874e bfa3d715 40ca143a 408e86b2 c0a980d0 40d0505e 4079a004 be84c250 4001f40d 3e51007a 3f704b1b 00000008 3fcbaa7c bf601596 -> 4180b5e2 42057e34 41a5ea06 bf2036f1 48bd05d3 00000000", + "422cbd06 422a39b8 c1bae1a6 bfa99e27 3e1f7832 bf0a02bd 3fb832f3 3f42a27f 00000000 bb060bc9 3df1378b bff8e65c beecdc30 3f317d70 bfde1830 40960284 c0afbce1 c0b7298a 403446a8 c0421dd6 3fb22f59 bf2f7f36 401b3611 00000007 bfd58e15 bf3f4c6c -> 3e0ec8b3 3d41a222 bd37b7d0 3f0dc343 3f923c60 00000000", + "41c16600 c227f41b 42164b02 3e91f581 3f181509 3ec51185 3f435b26 3f9c159f 00000000 3d4e4a31 3f855e77 3d2c150f 3ea5edb0 befcab4c c0aaa9ae 401f8c98 c0b7778e 3ee1a280 4086e1e0 3ff8aff0 400eae78 c008adae beb2f91f 00000008 3f764865 3ea55a29 -> bd050a99 3c9e8e5b bdab7c49 3d01541f 3dbb79cd 00000000", + "41793ac0 c21b90c0 c24495cb 3df01ec4 bfaa85b9 3f90337a 3fdfd2de 3ea4a7a4 00000000 3c5a32d5 3fb87386 bf57545c 3f98a3f8 bf02afbb 40309794 bacbd000 40a73724 c049af8a 40eb94ee 3e032440 3faf67f9 3e0826c9 bfdb8c09 00000008 3fed06b5 3f773189 -> bf003889 be754bba bf6481ed c00ec382 42003844 00000000", + "4143e7a4 c067f020 c03a20e0 3ebdfdc4 bf0271f8 bf0baf33 3f758f84 3fa0a8bd 3dcccccd bdc025c0 3e394828 bee6e00c 3d880df4 bedccc9a 40a68ac2 c09f66b3 bee7f380 4022e6bc 402785e4 40a67ce0 3f1de3c6 3fce9d3d 3e97e9e0 00000004 bfe3bafb bf5664ad -> bfda0186 3e02adf4 c004277d 3f51c105 43da7a98 00000000", + "c2018b5b 414ce190 424261b8 c0155a97 bf08d91e bf7b1a69 402a7479 3f42dd79 3dcccccd 3a9b29b4 4196096f bf234a68 bebbd73b 3f24b59a c026670e 40cd86aa 40aafb56 c0ee3ca0 4004f840 3fb2a5c8 bf9056a3 401b0863 bfa6c9b3 00000002 c002183a bf30ad28 -> 3a417bd2 b8014a30 3a8553dd be124e4b 38d31734 00000000", + "bf277000 c201e667 bfc54760 beeea1ff 3e13e117 3f1a3ce1 3f483b8e 3eafba17 3ca3d70a 40c70c84 3da8b07a 3fd3ea87 3f8372ca bde015a8 bfc9adfc 3f6bf200 c0ccc83a 40365568 40bc71fc 4087ed02 c028cf87 3fddc284 3fce2112 00000006 40072c76 3f8bc4a2 -> 466aa96c 4613c14e c440b022 bef3290f 4e828636 00000000", + "c22f76a6 40bbdb50 409d6fd8 bd99697f be006249 be83c4b2 3f35829e 3f53835d 3f000000 bcd2b064 42ad700d 3ee70e84 bedf6418 3e932622 c0d7595c 400799f8 40deeece bfb8ce70 40f65dec bfc201c8 40309555 402a80cd bdd1465f 00000007 bfca1d28 bebf92ba -> bd735611 bd1003e1 3d2573fb be58623f 3e2cfcb2 00000000", + "41412ad0 c19c89ce 420bf800 bf4f1f57 3a8d57d5 bfeb1743 400071f7 3e894229 00000000 3a8a5569 3d948b2c bf79ff44 3f80c270 bf68becc 40146b98 40f7b15a 4075c1c0 c07ca6f0 c009d330 bedd2500 40226efb 3f91e81f bfced978 00000005 bf862e03 bf050c7e -> bbdf40a4 3bc686b1 bc0b0ec5 3f0efa17 3c0bdc50 00000000", + "41dd4500 c214cee9 c1996f6e beeede01 3ff1fffe bf8f302c 4010e151 3f6615c7 3ca3d70a 3be11e39 413d25a9 3eb785f6 3e1ada51 bf2318f3 be3dea80 3faedf60 40fddc08 c09c1185 40b3dcc8 3ee2c380 3f805874 be6c7114 3fca7239 00000007 3fd524a2 bf95c3ba -> 3f149a8f 3d33ba70 3ec5e2b6 c0644e78 40057d69 00000000", + "423db370 c22f3b46 4238826c bf92af59 be4d049e 40163097 4029c5cb 3eab4c59 3dcccccd 3f0b7aca 3e7ec0a4 bfb54f6c be229752 bf83053e be573d20 40694388 40ed4946 40b36d24 be8e4c90 c0dabb68 3fb40c04 403a8be0 befd22cb 00000002 401944c3 3eda83a1 -> 4011c48e bd84d96c 40350927 bed28986 4466069c 00000000", + "40c1a468 41678558 c13ca070 bf1ee3c4 3f6370cc bfb99cce 3ff76088 3f9c890e 3dcccccd bb771cd6 3d7441f8 bd281043 3edc4d63 3ee876be 40e4e86c 3fa55438 c0e84dbf c0d3ebf2 c0cb454a 40bd2836 bee346e1 c038877f 3e51a89a 00000001 3f406b20 3f946247 -> bb8f742d 3d5eba5a 3d53ca4e bc52783a 3e14fd49 00000000", + "4219e07c 422893ca 41db3958 3fb96177 3d4f921d bf0a9997 40162c22 3fcca806 3f000000 bd84fa3f 428903b3 3d6245d0 c000bb60 400706fc bf7ab710 4036a6dc 40ec6ed4 c0f3ab55 40d25b8c c0e67bcd 3eab56eb bfa38661 c03a4b78 00000001 bf8fb148 3e43505c -> 3c5da552 be6120d2 be5af53b 3e6de0f3 3e703713 00000000", + "4183cee4 421792a6 c1ff9628 3e2bddc1 3f38ab1d 3fc596f3 3fdb279e 3f83a55a 00000000 4047a6a1 3eaaeace bf2ccd03 bdf52839 3c98cec0 c0c00f8a bf75f628 4027a7b8 c0dbe5a2 3ebe7d60 40ae3968 400f0bb3 bff15000 400a2812 00000008 bf991a8b bead8475 -> bf569345 3fb688b4 40497ffc 3f136092 458b9880 00000000", + "c0f53c70 424147c6 c1684a8c bfffe56f 3f4a34bc 3f9f59b9 401f17f8 3db76e5b 3ca3d70a 3d895acb 41ad3a24 bf7fa4b7 bf1574da 3f72a54d 40de1440 c0dfa418 c01a23dc 40c9d96a 3fd707b0 408ad7d8 be212d0e bffb2917 3f333241 00000008 c0181047 bf8aa59a -> c0f97648 c3020c9c c28f1d1a 3fcba7d5 47baccec 00000000", + "424440fe c242d229 c1a21949 3e9d4867 c0127d2b 3f3859fd 401cdbeb 3fcbc712 3ca3d70a 3a9c120b 3cb0bc8b 3d9d13b1 bf79816f 3f07f7ac c093b382 bfdf9c74 bfae1a20 3fa1a630 c0f691e3 bf181aa0 c00edd46 c02c8ae2 bfe6e7ca 00000002 3f9ec80a 3eed332b -> bb6b48c3 3cb91fca bc257000 3f8ef87a 3e2cc81e 00000000", + "420d252a 3f1ef800 c0e0e3e0 3d3699bf bec8e55b 3ee8515d 3f452ef2 3fd7f779 3dcccccd bdb36116 410f8916 bedbdbdb c02127b3 3f8e79a1 3fc30b88 c062b7ce c0cb7371 c0e5a5e9 4079c1d4 bf811d44 c0130396 3fe08c3a 40275f1f 00000006 bf43c50f bf08d1c7 -> 3db11a11 3d3adb04 3e175b8a 3d041bfe 3eaa9013 00000000", + "41f99554 c0e978f8 c1a5566e bfc1d938 3f1585c9 c00fe2bf 403b7c51 3fc85c9c 3dcccccd bfca77a7 408f906d 3f193971 3f15a6d6 be17aa10 402f102c c09b3db1 40431dec c012636e 3fe8b270 c085fdb8 bfcd85e4 c0231cd2 4021ff47 00000002 3fcb3138 be1843a9 -> bfe9adc2 401ec9b6 bfa4935c be00f741 433f622b 00000000", + "3fd7b640 4245d3d8 bf8e5180 3feca912 bf34a12a bebbd25e 4023c3a3 3f8bcf74 3f000000 3c975c69 4235cc82 bf0c41d2 3ff61c42 3fc6f307 c09322ac 40084e1c 4059edb8 bffa9c00 bfafdba4 408d0172 bedf9348 c03d3a45 bfce93a1 00000001 40105a8c 3f881791 -> bc09e4d9 3b317d0b bbfbbf34 be549567 3c49833e 00000000", + "c2477acc c214cb3a 42282bc6 3fb65244 bfc3c184 3fe971bc 4031ca9b 3e56bb17 3ca3d70a bfeef7e0 3f03e904 3e956e75 3f8f101a bfb97a3c c0396f6c c0c405bc c0f08f4c c021f8a4 40ee6c78 c0edce19 bf6dbea8 4007f5c5 be66e1fe 00000001 bf7c545a 3f656811 -> bf928252 c0b01891 3faab05d 3e71b3c6 44369c78 00000000", + "40f320d0 420f2e18 420ae070 bf0864c1 bdb98fad 3e414e53 3fc8cdd2 3fff0f0a 3f000000 3bb65731 4201591a bc3cfd70 be89faf3 3ff952ef c024e734 c0f913ba 40ffb1a4 c099b85a c022c826 409b6c42 40118cef 3fa631bf be0ae912 00000005 402295bb bdf8a462 -> 3a308d2a bc7f529d baff4006 3f152f5d 3b8130d8 00000000", + "c2478100 c1ce6ae1 c154b250 bda51001 3e47eb88 bd32e22a 3e5cdc4e 3ff9c4ef 00000000 bc3f6b96 40037df2 bd4a95c4 400b361e 3f8b5169 40995294 40baf25a bf0b5c30 3fef7270 c0af5a50 40f5366c 3ed2fc71 400bcd2c bf86b4b8 00000004 3f0b01be 3f906982 -> 3c1a2e01 bc9249f7 3d19825b 3ea4c9b4 3bcdc99c 00000000", + "c157ab94 c167ed68 c2252a4e bfaec272 bdb64b67 bd78a1fc 3faf4d86 3f84a192 00000000 3bd006f0 41d92909 3f55e7d7 3fca9bd2 3fc863d5 4050f63c c0aac42e 409bf5e0 bf78e178 c03990b0 403f6f1c bf34598c 3ee5195a 400b5918 00000004 c023ceb9 3f4451db -> bd855545 3d917e22 bd0c6035 be8ef69f 3e4fb84a 00000000", + "c1db574c 3f594b40 422ae0ec bd615e31 3fb37a70 3f8504cd 3ff02116 3e84f74e 3f000000 bda33ae9 3df9df39 3f43211d 3fdee1ff 3e385923 c0d69a4c 40ed3eaa c0b73da6 40c3b098 402c0cd8 c001fa6a 3fdd7c50 3e98b4a6 3fa2e5a5 00000006 3f7705f8 beefa8cc -> 3e58a321 3eb79ea8 3ef26f55 bef98fe9 42273317 00000000", + "c20a8978 4205685c 417bf410 bf61a0db c00ee0e8 bf0439b9 401d2067 3ffd9df8 00000000 3d947e9c 418c3582 3d933996 be45b86a bfa6d9aa 3fc75310 407fac18 bf5800d0 bfa2f5b4 40e2c4c2 c0c061d0 c0281213 be91ef15 3eb2553f 00000006 bf0d2d29 3e2a2af1 -> bde71b4e 3e21c749 bd08dc4c 3ed587b1 3dd06a41 00000000", + "41ab007c 417d22a0 4156eb5c 3e1f3265 bdff4f7d bfe62d7a 3feade1a 3fa40c5e 3ca3d70a beda0990 41b48aed bda7fbaa bf103e93 3f4fb8d0 4037ab34 bff94fe0 bdf1c8c0 bf028420 c05d9d84 c083b42c c002d3f4 c0283631 3f2450a0 00000003 c0275336 bf1c0689 -> c0690514 4028b7a7 3fcf909f 3d3a6f83 43585e74 00000000", + "c0b44d48 4204f0f0 c1b650c9 bda3325f 3f769193 ba98aa64 3f9855b5 3ee50887 3f000000 bb313e35 3f39ba1e 3f5a7ea2 bee862b9 3f358fc3 4095fde8 3ff2c8f8 c07151f0 3ef56ca0 bfb22e08 409782fa 3f941f53 3ef3c426 bee0c01b 00000001 c015fe08 bf969217 -> 3b266d90 3a03fc72 3a065e30 3d129e66 39d697d0 00000000", + "41ca8930 c21b281c 3f20e700 3d726198 3f413a12 3b921f20 3f41d2b8 3f6e9a0d 00000000 3b3f955c 41c9570b bf402abc 3ec8b462 3d859281 402a10c8 c0406bf6 bf582c48 3eaac7c0 bfd74818 408c5902 c02f9e76 3fcea2f4 402b5d4e 00000001 c0165082 bf5bfc6a -> b9f1d0e1 bae5c874 3b991f17 be1e2685 38c80158 00000000", + "c02a9df0 4214aafa 423f371a 3e5b2aea 3e9663ec bf2d6447 3f59c4b9 3f51ea58 3dcccccd 3cbab03b 40e02258 3eb314b3 3fc9e004 bf2b624b bf47e428 40d16a7a c080b778 403a6a28 4093f8de c0c0d70b c039cead 40379675 bfef73d5 00000001 40368ca2 3f4bfb22 -> 3d026a32 3c7b95f9 3d122b58 3ec27786 3c20dd80 00000000", + "c131ca20 c215af01 415938b0 3dc732ce c00bb1cc 3c5874e3 400d5e50 3f994504 3ca3d70a 409819d1 3f8e0320 3fe5fea3 bec13260 bc60b3ec 3faac290 c0fcb67d 40373774 c0e75f4b 400a3724 40da64aa bfae5775 3fa08d9a 3ff9fb95 00000004 bfc525db 3f8fc6c1 -> c11e654e c1a19a91 c22b8617 3bc62030 4711c51e 00000000", + "c1607b64 41bc6314 c1de9344 be0e3bb0 3d95ab1e 3ec44392 3f9bcc61 3fcd8ec2 3f000000 baee3526 41e5a14b bffa1e59 bf418314 be4888fb c02765e0 c0c79b58 bfbb1adc 40e52ddc bfbd0214 4073a48c 3e775b14 3fa4e1a7 bf85a3e6 00000004 c0219fc9 3f51593d -> bc0ed100 3ca53395 3b5b7ef4 3f052be0 3c5d106c 00000000", + "c19a40d8 c236a3e2 c1454224 3fcbb0e1 401ec8f2 3eabbfab 403f3acb 3f892ac3 3ca3d70a 3a8e769b 3dc88277 bf9282d9 bd44f16d 3f15dd9d c07cf312 bf6d31d8 c0615196 40f7c944 c09dea16 3da8d080 3f640724 3f9844d2 3e83dfe4 00000004 402cc07a 3f14ea8a -> 3d8f6e5c 3c3c1e1d bd016fa7 3dd2b9b5 3eb1bb90 00000000", + "42228352 413da808 c1d62cff 3ecde4dc 3f6bf3b0 3f2e5852 3fef9f72 3fa854e4 3f000000 3bb035b4 423ddf19 bf3010e8 3ffb2f5f 3da2dc21 bffe7b54 3f33db50 405dd408 3ef82860 40dc470e c09c11a7 3ffbe340 3ed392a1 bfd5f962 00000006 3f5d90e4 3f03ea63 -> 3ab0594e 3a73af29 bb7c18c2 bf023296 3ad7ca4e 00000000", + "4147a208 c1dd0c6f 42236f7a 3f316555 bf91082f 3fbce821 40002582 3f574315 3ca3d70a bbae6b27 4066c805 3fa60ac4 bf55edd0 bef93874 bf266a98 c051acda 408b887e 40e17232 400788d4 c0dddb05 beb342d8 3e0f7e44 402ae8ca 00000005 400afeab 3f42424b -> bce95519 3cf9e170 3cb78152 bf349c12 3e5e4b0a 00000000", + "bf85a280 c1efbf95 c22b1c60 3ee3a0b3 3fde78eb bfa28fb4 400eb535 3fcb38a4 3ca3d70a 3bcc1631 3f197ab1 4009c84f bf87bf43 bf3fe060 c02269f6 40a48412 c08d8ecc 3f500120 40bfe67e 40661fd0 4038be27 402f0b5b 3feabcd4 00000005 4005cd93 be141c7e -> bc1d66fa 3c3ee2d2 3c8d6522 3e91c396 3ba7f7b4 00000000", + "c0d38930 c2395499 c20ad788 3ff07976 bfdfc4db 3f2c5886 4029cc72 3eb862bd 00000000 bfad59a8 3dcc3958 bf6911f5 bf8f407e 3f983dbc 40aba542 3e786a40 c0d46209 bf782370 bf9dc934 4083a84e be37ed5c 3e9b41bd 3fe34ebd 00000008 c02a3d1b 3ecacbe2 -> c0c7ad0c 410b6b81 40e25c0c 3cc2150e 4b9df232 00000000", + "41784a20 4195f57c 421c0e08 3da92aad be88ef1e bedcb0cd 3f2da822 3fd26d98 3dcccccd c0519ff3 4038f2d8 3fd39364 3fa4b5e5 3f369a92 40f95c70 c0151496 408f4d12 c00f9f4a 409f1124 406db770 400a50d7 3efcb5f1 c012951d 00000002 4006534c becf3c53 -> 407a39fa 4048fe0a c06b2519 3e7f799d 44cfa8de 00000000", + "4196f400 c202c6e9 c23a5f66 3ea1ce65 bfbc8d35 bf5d9ca7 3fecedf9 3f91335d 3dcccccd 409977e2 409d8f26 be6abec3 bdb5ce9b 3f1994ea c0b7373a c0c22490 40169f78 3fc14030 c0d2ed7a 40205dfc bfb9b45e 3ef4436b c03fd6d5 00000001 3fea6092 bde68c9a -> c08af436 40a024db 3eb9c3d6 3d5736b5 449ff984 00000000", + "41fa9c64 c240f078 c1bb1f89 bf085976 bf0e1a65 bf8d0709 3fc1d440 3fda440d 3dcccccd bf235a34 3c4c8be3 bf93338a 3fed90bb bfe1a8d6 c0a12834 c0b7fd70 c0fc0747 c0dfe301 402ef414 4099f948 4036afef 402ae4b8 3fda4e38 00000003 4014e6cc 3f128f0c -> c2959a32 42e43ed2 c2de1df4 3f638330 49f32056 00000000", + "40f71830 c2317a68 c18ebd70 3f7014de 3ee1695e 3e1a4532 3f87715e 3f0fcd0b 3ca3d70a bd517449 3ce29702 4009f12e bf9d99c9 bf9b15ee 40d69a0e c0590b12 c09936ee 40814958 408dc3a6 c0972414 403980b3 40296153 c0193d67 00000001 bff2b67e 3f0a886f -> 40467197 bfe9555f bfd77fc6 bef7d08c 433e2daa 00000000", + "c19ba0d0 40fb5420 40ea88f8 3f4fab49 bf468452 bf250bbe 3fb112de 3f643c27 3dcccccd c002f858 3c868164 3fe3e33b bf6615e1 3f97d6bc c0bac123 40724a90 40c51e78 c0ae1058 40a3df4a 40b27612 3fea9e1f 3f5f31db bf3353d4 00000004 bf45ed53 3ef587e4 -> 435c8c2a c2e8ef1e 4310c56d 3f08b37b 4992e9a1 00000000", + "422524a6 c10b82c4 c1f24915 bf5c79a5 3ecff885 c01389b9 402be820 3ff58f3e 3dcccccd 40050a80 3d3494cd 3ebadeff 3f32680b bfddeef4 40c25922 40b18bbc c0de018b 40ba37f4 3f6661f0 c0d3fd0d c0229493 be674012 3fac3c7b 00000005 3f9d11b4 bf8a8f33 -> c18b3483 c2a487d1 4303220f bfd3f220 49fbd527 00000000", + "be2c2800 c1bab7b2 41728ed0 bf3cdfe5 3fac8a5c 3fba3f64 400890d2 3f60fd0a 3ca3d70a c113054d 3f39ee05 bf1c5867 bdf04867 3f2e9ea8 c07d18ae c09b6eb0 409dacde bcf78500 c0b95baa 40381c30 bfc27550 3e102250 3fef5569 00000003 3f80212f bf59c6a7 -> c2104dc4 c1423776 c1bb7a9a 3dbf07a8 46b37394 00000000", + "41cd97ac c0a107d0 41bf5968 3fb97991 3f2615d8 3e55555b 3fd622c8 3f378a65 3dcccccd 3f170beb 4047123a bf858f1c 3f02c935 bf67cc5c bf1f4ff0 c09b3371 40cbd39a 3f8c61c8 40e5f30a c0a5f8be 402e2812 40275880 bf5e3db9 00000008 3f062074 3e8b6b9b -> 3ccc2fb6 3f6e4085 3e3e6883 be2f956d 41a73e5b 00000000", + "40666d70 c1553f00 c1f255cd 402d4b95 3f11b02a 3f05d7f1 403611d5 3fb97824 3ca3d70a bd119ed7 3e3ea5ee be99692d 3ee1228c c02b5480 bf6b6748 bfa4d980 403fd544 40ae8c46 c087fc0f c08d6931 40302ff4 3f62754a bfb753ba 00000006 c02624ad bf4ad807 -> 40b4e106 be6e2aea 401189ee be53b0e1 462946ff 00000000", + "41720bd0 c1a857bf c20da637 c009ccea bfc2b27b bc65ca46 402af96f 3fe16954 3ca3d70a 3b5026c4 3d3d5ba9 bf9534ea bf6ad7cd 3e2b8ae2 3ffe0248 c092b425 40bd1930 be96c170 bedd2080 c015c192 c009290f 3fc0d81a 3fcb9380 00000003 c0179741 bebd6f9b -> bde701d6 bdbdfe1c 3c61af7f 3eb8e265 3f905500 00000000", + "c09932f0 c1a08c32 c24284dd 3e9888bf 3f7c44c5 bf1a1bcf 3ffb8d13 3fc5ce66 3f000000 bc10fd33 3db74b78 bf2e2f31 3f2735bf 3fbac4c5 c0e43b33 40c4cefc c0c8f02e beb2fcb0 c02b0d98 c0a1d605 3fd852f2 bfe44619 4016060b 00000008 3f09a585 bf00e469 -> bd7fc259 3d7620fd 3e1a8567 3d7576b9 3f21ad80 00000000", + "4139de08 40bb59d0 40defd98 3e9b6afc bf9da589 3ec3525d 3fa98c4d 3faba29b 00000000 40592c1c 42af514a 3f0e99f0 be07a3d4 3f24214f 404746b4 c08e17ef 401ffff0 c0e722b9 bf12f5e8 c0bfacde 3f21bca3 c025314c bfe55442 00000007 3fc93482 3e140e89 -> bf0093f5 c0caef56 bf4411e3 3f0052ee 43d189db 00000000", + "c20eae22 bfb74d40 416229b0 3ef6ffeb bf897403 3f0408db 3fa4dbb5 3cdc9725 3dcccccd 3b04ffa7 40fc2093 3f1e6cf3 3fd5f9cd 3f24d58a c0f49898 402b35c8 408ad612 3fcfe350 bc611200 c0f73c75 4005e85d c0289cb5 401e284c 00000005 3f0f75ac bf12c2ac -> bb4604a1 3aabf60a ba9b7909 3ee6bd19 390f4da7 00000000", + "c1466ef8 42373018 423e2bf2 bf436d0d bf5721ef bfbec504 3ff23a28 3e40f355 3dcccccd bcbc0e25 400ab5e5 bf9df5fe bfe198ae 3faf5210 40dab95e 40e82ee2 4014c034 c0352792 bf561370 c0daea06 bf9a32b6 3fe79dbf 3fcde64b 00000005 40135d0d bec2361a -> 3d7103a4 3bdccd56 3ca113ce bd506ff5 3f4d2f62 00000000", + "41c0c8ec c11337f0 c1b85268 c010e57c beb34448 bf19e6b6 401a0dcd 3ff71332 3ca3d70a bffb1dad 3f9992f2 3faf5b70 bdc7849e 3c1c5999 4091dbfa bf5fffa8 40b5292a 3fe5dd58 4015a614 40fdb306 3ff94e30 c0266ef6 c025e157 00000005 c0093386 be404792 -> 40a7a07d 40bb279a bfb69dc8 be5e1f0e 444bb5b3 00000000", + "c1bbfa91 c1df299a c2428555 3df7ee3a 3f573b2b bf245c83 3f899019 3efea0fa 3ca3d70a bb34a430 3eee3e4f bdb9bbb1 3d771ef4 3f46ec89 c0b7409e 3fa4dbc8 bf825e28 409bb574 3f9946f8 c0ce23a7 c03705fb 3f23b93d bf006945 00000004 c019d9a8 3f2ab435 -> bc89c025 3cc7267e 3d48f612 be400e98 3d8d9ba2 00000000", + "c18362b2 41e6d504 41ac1f90 bfa10315 3eb76aec c00ada8b 402f9488 3ed72650 3f000000 bead7b20 3c6d50f7 3f6f0b39 bf73271e bd81742f bf906ca0 40d30aa6 bf8039fc 40d7afba c0a69f68 c086e656 bf4b30b9 3fab6183 bf9effd4 00000003 c00dd84f 3e7703ee -> 419cacb6 c1adc753 bfb0275a bda96644 47d56ddb 00000000", + "c155ecf0 c24504a5 c11ae52c bc07b885 be591e90 3eb31ce3 3ed17c8c 3fd6604e 00000000 c01df9ab 3e30160a 3f2d8ed4 bfc448df bf8e9158 40ffee12 401d274c 409e5880 c0ad0144 be727aa0 40f93678 3ff21fe5 3eb37090 bfc4c97d 00000002 bf5aabac bf62c118 -> c043b429 410165ba 41972486 3eaf6939 45f1f6ef 00000000", + "c207047c c207b1bf bece8800 beab00cd 3f1db9ef bfb93065 3fcf95a6 3f354857 3ca3d70a be5de13b 3c2aacfa 3d450d92 bf0c7fa9 bf218a1b 40cfd02e c0e76b93 40a4c222 3f8bb820 3f4a01a0 bea6cf50 bf81e3c7 bff24bbe 3ee63b9b 00000003 bf4d94af bf172b4a -> c02c050e 41ee19cd 420b1614 3d14301d 470f7bb4 00000000", + "419b26e4 c10def30 42213ffc bf7b7cf2 bf054b1c bf14d5b4 3fabc8b4 3f5fbf28 3dcccccd bd5e346e 4185b599 bea4d384 3f8cda8e 3f0cb8c8 40989d30 bf2b78e8 40d8dbf2 3eb3fd00 4099e148 4047bae0 be9e4549 3f00f3b9 c00dd826 00000001 3f1bbc2e 3e8aabcf -> 3def4edf 3ce2151a 3c2874bb 3ee546ae 3d89455f 00000000", + "c104d29c c23e34bb 423b8ab6 bf8c7de0 3fc8ca6b 3e0c7d9e 3ffa324c 3fe15be5 3ca3d70a 3fcc9674 3f2b4de3 3dc2d553 3fc0ee06 3f806820 409fe11e bf557af8 c058d084 403e749c 40077eb4 bf842d68 bfa0bb3f c02cf0de be2526db 00000006 bf1129d3 bf725f59 -> 3f77ae73 407861f9 3fd3061f 3fbd388a 43d56def 00000000", + "c22ddbd9 421b8aca 41cc961c bf4ba6ff 3e7259b2 3f083bb4 3f804972 3e270ac0 3dcccccd bd043a51 3d860b5a bebd5e4c 3f72e7ae bebb8dc8 3e475bc0 40902578 4086d3ea 3fcfa398 c0137f06 3c43d800 c022efd6 be8060b4 bec6b921 00000007 bfef68ae 3f2b6304 -> c00e1deb 40aebde0 c0261164 bd7b0cb8 4572cb65 00000000", + "4232eb54 41ddd130 41eaecbc bf3257db bfc92548 bf2b9e9b 3ff3c76b 3f1841b0 3dcccccd bc7dfce9 3ec050b4 3ef997ee 3d686c4c bfa25e08 40834b72 404cc590 407b0404 40805d7c 40b4dac8 beff6830 bedd4ab3 4008fd08 bfc5a176 00000004 c007bbe6 bf8c0e38 -> 3c82ca58 bf46f5ae 3f48b354 3e34f148 41578a7c 00000000", + "c129c2e8 421fefba c1934862 3ea99261 3dc52940 3f422c19 3f5ef81d 3ff19cc7 3ca3d70a bb1ea48e 417491a1 3e097475 3fd06d3a 3fc371e5 40c0a50c c0378dba 3f88c360 40ecf160 bfc77ba0 c003278a 3fd406b3 c029f863 bebe004b 00000003 bfc2333e bf04ff14 -> 3a96dcc2 bad8a71b 3acf1f7c beb5f833 3a04aa60 00000000", + "c102191c 41f6d880 c2240e80 bf9e6fd2 bff83793 3e89bfc0 40143d53 3fc7d63c 00000000 3d94bab6 3c9d4196 bd131bf2 3fc9bfea 3e647854 c0381d68 c0dfdddc 3e1cb8c0 c0935cec 4075f394 3f8b2660 3f874554 bf468926 bfacd13c 00000005 bfb89fbd bf120307 -> bd027786 40c6716e 3f47f2d6 bdb6800a 45044bd2 00000000", + "c109e37c 423ab412 c244c0bc 3fc283cf bf3e08c5 3fc94911 40254ba7 3f0bf588 3f000000 3e2f22ea 3fe8e89e be12e0f1 3f02ff99 bfd58896 402dd1a8 c097acd3 404b65a0 bf080d18 401e22f0 c03d7f56 bfcda515 3fb22062 bf3c7d53 00000003 bfecab04 3f8a29e1 -> be766de8 3fa2405c 3efe3198 bf27bb8e 41ee615f 00000000", + "c23309a9 423d3838 40c51858 bf280455 bf01bdfd 3f57b813 3f975348 3e8734be 00000000 bedf1887 3f4574bc 3fe1de97 3eab61fc 3e21c5bc bfd3c5ec 3f922128 408f12ba c0a03550 3f150f70 402d5d44 3fd24022 3fe1c175 bfa10c53 00000007 c033ab35 bf53ea0d -> 434c6e50 c344ae24 4081c8d8 bf6c05d4 499d8208 00000000", + "c205d1cc 41fad414 422af688 bfdc0842 3fd1d9d7 3fde48bb 404419e2 3f9b9127 3dcccccd bb34bed0 400d1a9b 3f5b03da 3fcaea29 bf96d831 406345d8 c0e63a75 3f483400 c0e35a7c bf4fe960 40e35740 c02cec87 bfde617e 3f5e0205 00000004 3fdea91c bf12b896 -> ba4b7088 3b874475 3b7322d4 bd2a2d11 3ad7201c 00000000", + "c16547ac c20ac8ce 42393d0a bfdd8d29 bfa8d46b bffce35d 4043c60f 3f9947ed 3dcccccd bba456bb 40133979 3fcc3812 3fad163a be86cdd4 40d5e77a c0f7a8b0 c0ccdb8c c0f977c5 c08f5642 4076cb80 be97373f befd3541 bfd03ade 00000006 bf2e9988 3edab5ee -> 3bd95994 3ab3ebe1 b9aef29c bf12071b 3a3087a7 00000000", + "c150e8a8 41a9d334 c237aab9 3e727d92 be8a2bc1 3de911e6 3fa12a80 3fe1e9a9 3f000000 baa89509 3e12ac41 bea7e14c 3f682bc4 be0e0c5c 40b9dc7a bfa98944 c0b51aea 3f23adc0 40d495d0 40f2fd1c c017e65e c015a822 c0204897 00000002 c03c844c bf0db83d -> bb9ddb44 baf22e6c 39a40fbe bec0cd62 3c814430 00000000", + "c1779330 41d3fcf8 41a600f4 bf84b3a8 3f886b05 3f6bf58f 3fe1c18e 3f37e791 3ca3d70a 3b9885d7 3c87bbb8 bf5f9d59 bf1c4315 bfb921c3 c0ec7d8e c0de5c2a beb8d4b0 40a4f472 3f0e52e0 c0bbe219 40301a24 c03fdb6d bf85a596 00000004 c01fc2ac bf384bef -> 3f5bb52a 3f1aa69c 3fb8daee bf00e1c5 43fa9db0 00000000", + "41be9900 c20a88c7 c2161cd6 3f8502bb 3efecf2b bec8ce39 3f9bc9d0 3fc9e830 00000000 ba93f6a6 429703bc bf8107d4 be9d8665 bf870835 40637668 402544ec 3fd46c70 bf569c68 c051be06 3db81080 bec5059e 401245bf 40098772 00000001 c01e1288 3f19ec9f -> ba5506b5 bb3ab429 3ad6cdbc 3e932cf7 3826fefe 00000000", + "420a161c c1dda6b7 4237410a 3fb1e4a7 bfd8263b 3f5303f5 4048ee38 3fcd6581 3f000000 bfc29bcd 4286b4a4 3f3e19d9 bf4dd026 c0219f30 40be10fc 4025cae4 c09462a9 40d91872 c00fc7cc be488d80 3fadb356 4005ca45 40019c6e 00000003 c0355962 3f9391e9 -> c03d4ca8 41cd7902 c1197b8c be144e02 4640d16c 00000000", + "c1a8178d 422c4494 c234d038 4020866a 3e7cea86 3f9be1f1 40335976 3d02b70c 3dcccccd 3d854124 3cab2025 bf0a2708 bdcc563f be922813 c0c409e8 c0d14a2a c0ed4a0b 40cba5fe c04d0bb4 404613b0 3f9b0eac c0043bc0 4025effc 00000006 c011dd6f bf6b971b -> c326e3be c22f33f6 c2b00a79 3e7123c2 49cfff22 00000000", + "419dba70 41d42290 c0c32cc0 bec3ea43 3e71f52d 3ff70490 400169f5 3ecfa6c6 3dcccccd bb81d7e5 409c17b9 3fa5aa94 3fde6df0 3f84086d 40fb4124 40b3f9a8 3f3bacc0 c0fdc0e9 c05ca8c2 40f38292 400e859e 3f80be0b 3fff24df 00000007 3f022513 3e344908 -> 3af6d349 bb694ecb 3a0664e8 3e41f6b4 39ba538f 00000000", + "420330c6 c2147000 41f5b308 3e551f4b 3e82597d 3fdb56b0 3fff75be 3f007a1a 3f000000 3ab12b42 401c116f bf87dfda bf87cb7c 4025464b 3f53dc00 40184c8c 4084e006 40e1710e 40995c6e 40f12b96 3f0d4980 bf5a92f6 4004250c 00000008 4010abf0 3f39443f -> 3c38460e bc9a163c 3a005e80 bec76465 3fa7c88a 00000000", + "c12385f8 c1e65dc0 c13c6bb8 bf910edf 3fc77619 bfc21f0e 4057153a 3fe89b3a 3f000000 bf97cc4d 3d9e94ae 3ffc5c42 3f9f0fdc beb2e76a c0db84b4 400251b0 3f97e4e0 405a79dc 3ecd9220 c0031f4a c03ae620 bf7eab86 c0115900 00000008 3fea95ba 3f24ce60 -> 42881fbf 4254e4b2 c1d00a1b bf12c739 4aa36bf5 00000000", + "c212ea52 41aed330 4139f090 bdd3402a 3ce1cc55 be557cde 3e6fdada 3dfaa7f6 00000000 3d61738f 42b01287 3dbf3187 3f13b43a 3f2adba3 c0cb92ef c0bbdc5e 3f8a8a60 4085fc8c 3f078c90 c02aa800 c008591e 3f9ccae4 3fd57ae6 00000002 403cebc1 3ee17800 -> bdee49fe 3d8956fb bd22a158 3f30c03c 3f0770eb 00000000", + "c0b9ebe8 41244100 41da3e60 bfae2d05 3f06c2cd 400023cb 402c6947 3eddba09 3f000000 bd84edcc 3f695644 c002ab23 3fc37a7a 3f8ed19b c047faf2 3f669f80 c0fff0ed 3f1e5080 c0eae7ee 3f8641a8 c005b3a9 4000dc92 c00d2f2d 00000007 401c3e30 3f43a4a3 -> 3f9d03e0 40996bd8 c1095e7a bf2a3718 4549bfd9 00000000", + "c20f41ae 41c9c26c c1fb25cc 3f883789 3fbc2152 3db4cc01 40017e1f 3ed38c4f 3f000000 3f24eb6d 3de1a947 3e9b06a8 3ebd7b94 402e28d2 c0a300f8 3fffc270 409625de bf8ce9f4 4087074a c0a7478e bf8e2a6d bf050d7e 4017eeaf 00000008 3f907b51 3f2f6238 -> bf873e65 c012649d c08efce6 bea67ed8 461b000b 00000000", + "c1f7d32f 41777d00 403ba2b0 bf76f9a4 3e9aae5a 3ea0d637 3f8899b1 3edb422f 3ca3d70a bad28065 42c373c2 be8c1970 3e509465 3fac2dce c0ca7f6e c0a874be 3eca41e0 c0874562 c0fb60e3 c018da5a 3fb68143 c017554d 40204b2b 00000008 3fc5da88 3f503532 -> bd19fa7f bca4a5df bb8fe62e 3e9587b4 3c3b4e2c 00000000", + "c240e292 c240d529 4221edf8 bd47d0ff bf341d00 befde147 3f657041 3fda58e0 3ca3d70a 4006ebac 3faea17b bfe89837 bfd258d2 3f03767d c02dd0f2 c0d5a872 c06af5f0 40e112e2 c0a9d016 406ebcd0 bf5e1cb8 402bc514 bf3b88aa 00000003 c00746e8 bf3b91ff -> c0b2af14 bfee5cce 41588d94 3e9c6286 4561ca00 00000000", + "c1d82cee 41ed0be0 41f8e9c4 bc031b68 bf75dde5 bf1dd613 3fa9e6a7 3fee20fb 3dcccccd bd154d01 3c5310cc bea13e4b 3f8a6c77 3e5d7174 c066e396 c0f9fe52 c0155474 4067fa40 408bf19c 40253a00 3fa7cd2b 400207c5 3f62cdd6 00000005 bff8989f be7bde8c -> 3fa466ae c0871dbc bf50d1bf be08e4dc 44f1004e 00000000", + "c2276238 420f0032 414a4be4 bf8c17d8 3f891faf 40069be0 402d4c5a 3f87b0ed 3dcccccd c0dbba32 3d05af0d bfbda55d 3fbc5a8a bfac9df7 c055c364 c082c504 c08357ed bf846728 bfea11c0 bf1a3d28 bdd5924e be4b7419 403be88e 00000007 bfd89c5b 3f13f683 -> c478219e 4482bba6 c4727164 bf33b67c 4cecde19 00000000", + "409f2940 41274e90 41b331e8 3ea8a0e0 bb96152a be703e62 3f626510 3f75bcf4 3f000000 3cb8e36d 3fb6f844 bf7c6c7e 3f69b02c be8de9cc 40db8062 3effb120 c0de2b4b bf3c6aa8 c0112c8c c06c1932 3fa89715 3f8dc080 c01852fd 00000002 bf906eb4 bf54cf9a -> 3c87e0ff bcef9918 3cdb0b18 3e0ba2e3 3cd3ab47 00000000", + "c220971a 4130d710 c21e3817 3fa7f44b bf93a64b bec3dd93 3fe831bf 3fa374f9 3ca3d70a 40a81448 3d959b27 bf428a9d 3f6e1cd6 bf67b1cd 3fc19a30 40a60378 c07201da c0f08919 40b8c2e0 407a1798 3f319590 be4be73e 3f659b84 00000008 3f48df07 3e554531 -> c250a5f3 4281b5a9 c27938c7 3ddbcfeb 48a11fd0 00000000", + "4174d1f0 4212c4a2 41f4822c 3ece5bc4 3e4f88e2 3edaa021 3f1f04f3 3fd510b4 00000000 c11072f3 3d6de2e2 3d2bfbef bef5b059 3e9dcb0a be124ea0 bfb3386c 401f6f4c c0ed874a 40f473b8 3f5f2d40 3fe0d2a1 40193791 3f237e9c 00000006 c0146259 bf0d4944 -> c0b9ddfc 434b4fee 41dbe69c bf988074 4dd4d0d6 00000000", + "422a9e6c c1c2c234 42315d34 bf993595 bda1eb53 3d9ea913 3faf4b56 3fd64ff1 3dcccccd 3c3257e5 406d8b0c 3f79a39c c0083f2e bf8f92ed 402bbffc 40ac62ee c0274126 c04adfc6 c0bbedb2 c0dfbcda c003f9aa bfb8e389 bfd43de8 00000003 bfef4c66 beb0da1e -> 3c228125 3c0fa1fb bab46fa0 3e954d31 3c14ceaf 00000000", + "c1dd7640 c21f703d c1c30514 bf5e4411 3eb4b4ef 3f3d55c8 3fac637a 3fc3b419 3dcccccd be59e869 42c7252f bf999b0d 3f4d0542 3dd4eee5 4050f204 c070f898 c0a786ba 40db4fb8 3f800a40 40970a2c 40125e01 bfde13a5 3fc406f6 00000007 402131fd bf5bb42d -> 418f4ce4 42094389 c2769237 3ca10ce0 479cfc89 00000000", + "c0b239b8 c0e96df8 c24018a3 c010a41e 3f1be7c4 bf80ed98 402bd6e7 3faf2525 3dcccccd 3e722e67 3e50cc35 3ea600ef beab5394 3f542568 40ae720c 40c747bc c09b6cd4 40db5484 c09da9b7 4094236c bf0e302a 3fb65a97 3f7304df 00000004 3fe01131 3e799c0a -> beba292d 3e306ec2 bef67cb7 bf4a53aa 434bbcb3 00000000", + "4226e8b8 4213fa96 42038b2a 3f6e8ee2 3d900443 3e53dc4f 3f7e07fb 3fe10bf3 3ca3d70a bbbe215d 3c9124ba 3fe5b845 3fc11bd4 beda750d 40a45424 c097028e c0ab1726 40cd7ae8 40574748 402ec740 3e8e16e8 40324175 3fab05fd 00000003 3ff87758 bf2eb31f -> 3f916fd0 3f6ceccf be879528 bcdc056c 420f5c8e 00000000", + "c15670bc c21d8367 c11f904c 3e2c16ce 3fa9b0fd bf191e3e 3fbb66af 3f4c9e97 00000000 3b2d1b67 41af6db8 becd8112 beda948e c013b797 bf0c01c0 c0644aa8 c070affc 408fc918 400b1d30 bf210740 3fc89aa7 bfa1136d be879fcc 00000006 bfddf7df 3f987caf -> bd8d2e81 be4148be 3d220862 c0350084 3e09369e 00000000", + "c18772a2 c2371f0d c1a7afd0 bf0bc957 3db499b6 3fb597b7 3fc5192e 3f5b3bba 3ca3d70a 3caf5e8c 3cca29e8 be3ef34d bf9e2a1d bf05707f bf780f58 c0c751ec 3fbf3118 c086207c c0de9222 c0f4a4fb 3f8f8de8 beb1e874 40266574 00000003 bfd22b41 bed320ae -> 3f31e972 40844ff7 3fe0c15c 3e842b9c 42dd8374 00000000", + "41a6a53c 42449a04 41eaa73c bf51b9ae bfeb56cd c0061dea 4058c8b9 3f76902a 3f000000 bafcf6ad 406b2b66 bf23ba2c bf8f39b0 3f14f7f7 c001b5d6 408c4796 c0f8cfb5 40e6b4f4 40db76a4 c04ca2d4 40281a77 3f4d10b6 40239d1d 00000007 40150f3e 3f03a75c -> 3afb2380 3c13366f 3ae81b6c bec20b9d 3e196f89 00000000", + "420e6872 c135c9bc 41cbc884 bf39cf61 bee0666d 3eab001a 3f694a67 3f9af79c 00000000 3b8a7c93 40c6f8ca 3fe0a7fa bf09b4fc 3fc886c5 c0913e1a c0d35560 40c3b020 400335b8 40544e64 4011e92c bf94bc6b bf97ae27 bf72b05d 00000006 401b14f0 3f814e35 -> 3e33ee4c bedbe538 bf0798b8 3f3e1a95 40458310 00000000", + "41319260 420756f6 405889a0 bda5f498 bdcd517f 3f01266a 3f056da9 3cce38bd 3ca3d70a c0285fb0 3caf4e1c 3edd165a bec37323 4028aa6e c0ad441a c0bdb9fb c0594c4e 40d313d0 c0cfa1f8 40532f80 c0179ab4 3fa38168 bf813371 00000007 bf0d8e98 bf3dc8a5 -> 4180ceb8 c12a0786 427e9042 bdb94f3f 4984bca6 00000000", + "414c68c8 c219422e 4205cc84 bf1cdda4 3e929055 bf3d35d0 3f803c59 3f70a91c 00000000 3b024a22 41a16752 bec863e7 3fb7b5a2 c01f1941 40e33472 c0551434 c0e72be6 40a55ef0 c01d8554 40e27ece bfc706ab bfcb2f2a 402205f4 00000004 3fecb06e 3f1157f4 -> 3c0a6f76 bb5b635e bb796dd2 bf10ac62 3af4a9f8 00000000", + "41c4f42c c0706e70 423032fe c013394b be36d098 be633622 40145907 3fa6d69c 00000000 be59267d 401f901f be1a6a3e 3fe1b1f4 3e572fec 40dbd160 c0d2817e c065537c bf2a50e0 c0874fc1 402e3e78 c02f45c7 3fc438dc 3e5790e4 00000001 bfd79716 bf1a3ba8 -> 3ea4a5de 3d4d45c9 3e73f1a5 3cea5a01 3f86b28f 00000000", + "423fbc36 c00462c0 41b7c170 bec40393 3f411b61 befcd259 3feb9804 3fdc7022 3f000000 3e87db87 3fba3a3a bec87ea6 be819efc 3ed65350 3ed52aa0 c0bdc1e2 c0c6e24b c00825bc c0fd9355 c03b2d1c 3fc11cdf 3eed7ef7 3fc85f19 00000004 40273e2e 3f3ac5e1 -> 402d56de bed67f6c bfc5adb2 bf5f6818 441748e6 00000000", + "4225e108 423003ec c05033b0 bfde4520 3f291fbd bf0721eb 3ff73971 3fa25b97 00000000 bd315b91 41a05390 3ed35fb4 3fdb8126 bfaba2ee bfaa0080 c0b8b54e c03d0848 40fde030 4049f830 c09d762a 3f905946 3fbc7d43 bff4d609 00000006 c03edf46 bf4a2432 -> bfc37e82 c0806ea2 c0a29720 bebdf3f8 446925d6 00000000", + "4244102a 41c4a340 408c4ba0 bef118c4 3e732b13 3e229845 3f3f7324 3ffc44b6 3dcccccd 3aedfb39 41ec7b9b 3f469d87 3fcd5448 3f5f64e3 40af6194 4045914c 3f870678 40af23de c0fcfa8b c06b60fc c02a0eff 4022346b 402a07c7 00000002 401d3eb8 3f27b2f2 -> 3b8fd80d bac32a20 ba893048 3e6ba3f0 3a14a1b3 00000000", + "bf242980 c21834ae 420c5ec4 3f0b671e 40312f2b bf71886f 403e6849 3faf5abb 00000000 c0483609 3c89b385 be980867 bd550287 3f28ca36 c0d24959 3f2ce9a0 40722dac 40d90416 c0d4887d 407f362c bf8d3728 40304bff bfe2cc30 00000003 401133c2 3e9f0110 -> c2849d93 c1781302 42f29542 3f18a76c 4aca5902 00000000", + "40fc6958 c2227c8c c106e18c 3fcd5cdf 3f87a06e bf92e7e2 4014d333 3e3083bd 3f000000 3aa26845 4219ae10 3e4ce9b1 3f056793 3e63e5ff 400e4c78 bf8e820c c0e418da 407e1c1c c09d9dd6 40980024 3e338efa bf8e4d42 c02d3e0e 00000003 c03e37c2 3eb9d7cf -> 3b57b221 3ad958d6 bbdda6ce be7480a4 3a28e571 00000000", + "c0501dc0 40b15f30 4145cc04 3f8a138d bf471bca 401523bd 402f0b14 3f050f16 3dcccccd 410aea46 3ca22c46 bf1c2810 c00b988a bd7fcfa5 c0bc250c c0cdd310 40e4a7ee c08db050 c01f82e4 c0d01bbc 3fac1bfe 400d883f bffd61d0 00000002 c00377dd 3e87ec87 -> 423705bc 42966b78 41727cf4 3e83017c 4bad1ff3 00000000", + "415c30b8 c1ea9e83 c22e46c8 bf26abf6 bf3ff199 bd59f7c5 3f8cc9d6 3e5807ba 3f000000 bd29b4a7 3e424bcf bff86100 3f3ebdd0 bf614c26 3dfaaf00 c0a29ae2 bf8f86d4 c0c3cbd8 40b33634 bf587068 3f31d2cb be5d7e62 bf9b9141 00000007 3f0f95c0 bf28e87d -> 3e0c261f 3d5052ec 3df3bbdf bec983fe 4051b150 00000000", + "c23c0f63 423e359e 41cd1ac4 3e99384b 3e24d60a 3ef141b2 3f14b906 3fb99056 00000000 bf68f0c0 3e9efa50 3fa665d1 3b89dbff be34a0ed bfdd23e0 c0ab593c 40cbcf4e 40b74250 c051b9d6 40b26c0c bff8d13a c01c2b0c 4009a921 00000004 3f313bfb bee7b5a6 -> 40af743e bd366847 c0608dee be8b2e9a 4340d80b 00000000", + "c1eeb71e c23bae34 40e3bec8 3f4905bf bf06ad4f bf80bc8a 3fb0a9e8 3fb94990 00000000 ba9379e6 3d32fffd bd817e7f c016a65b 3f9cead6 c083486c 3e871660 c050ce4c 40e243d2 40a4c16e 40d3c970 4012781b bfb71cfe 400239b5 00000008 4024160a 3e35f5c4 -> ba5e69ba bc8c462c 3c457983 bea31c49 3e703bbe 00000000", + "41a25b50 c11f87c4 c1ce8fdb 3ecbfe45 be855bd6 be9534d0 3f80d119 3f658125 3f000000 3b61fb97 3fb7c212 3f71711e beb760cd c01f4138 404449f8 c0e48740 402847e0 c03ee876 c0a85cb0 c0e84b77 c00dbd5c bf88ff7d bf57b6b6 00000004 c03d7061 bed6f0bc -> bbdf02f6 bccf45e6 bc91a0be be6c75fd 3d0b2bad 00000000", + "42130ba4 42275bb6 4182df7c 3ee2e334 bffd9891 be20c947 4005ac46 3dd6a604 3f000000 bbfdeb1d 42a20864 3fa11c83 be8e3a6a 3dceb8fe 3e202f80 be87efe0 c026a466 3fea27a0 bf58d9e0 3fe94168 c027cd0a bfe5f88e bf614cc3 00000005 400b40d5 bf184a0d -> bbffcb38 bcc9e4d3 3c8ec63d bf1968e4 3ea17334 00000000", + "419d601c c2278634 422bb378 bf34ffb8 3fe14fc3 3fb3bfa7 40170cee 3f4d1ca0 00000000 3e944811 423a0aa6 3fc55e53 bef7bcd1 3f083286 c0cc3292 408915c6 40e5056a c0eba824 c06457d0 407e8918 3e8c53dd 3e074a46 4001d383 00000007 3fc9eba9 bf43eec5 -> bda7f7b0 c06d09b0 c048aefd 3e3660c9 434cf4d4 00000000", + "c21d94ab 41efe03c c1f6a08b 3e670966 be118faa bf4e0120 3f735f4d 3f83c169 3dcccccd 3cc5e35f 427f40c8 3da75526 bf981beb 3eb123f7 bf9af9f0 bfb006d8 c05d1f6a c0023aba 40410e78 3feba428 3f3a7714 bfc1292a bf43a438 00000006 4015f471 bf34d909 -> 3ea39a1f bd93aec4 be72f8f1 3de52719 4216f664 00000000", + "421fc076 41930c00 422e64d4 bd811497 be3aaf22 3dcc12b0 3e74b108 3f8bcc79 3ca3d70a bddf2326 3d26ab81 3fb11195 bfa4c8b5 3f72030a c0f1c603 beeeafa0 40ae2f0e 405e35cc c0bd58f1 c0dbaa14 c004a6ef be471be9 c007a9aa 00000006 bf903613 bf3a2460 -> c0ad1b19 407e1e2a c040ac14 bf8f4497 449cac67 00000000", + "c0abad38 c22e0eb9 c18c74fa 3dea8398 3e164646 be5ba44f 3ee91346 3fdb2af3 3dcccccd 40a0b352 419e9b9d 3ef6207d beb3d973 3f0981e9 40ab3aba c0e2671e bfc40d1c 3f09af50 3f0edac0 c09a434a 3e43b9bc bfe6e686 3ff701f1 00000001 c01ad778 be4dce25 -> c0c72681 c174b505 c09a0983 3de3e08d 44af6853 00000000", + "be12d700 c0facf18 422b2a90 bf32db7f 3e8292c7 3fdffba9 3ff6f93e 3fb3eb94 3ca3d70a 4096bba1 41a20eeb 3faf50bf 3f8baa42 3fa8d7c1 bf9980f0 c0e30c1d 40e3b386 3fa5d8d0 c0931795 c09bf954 4021821a be86302f bf2f5455 00000007 3fa109c6 bedf6f33 -> c1108cd9 bfeecac8 412e4bf4 bdbba447 4566c98e 00000000", + "c0e20860 41d66d48 42358806 bf415802 3d7d1062 3ec3d5bb 3f59e875 3df2bdd9 3ca3d70a 3e2bca92 420a97bc 3ee500c4 bed0e5bc 3e54526d 3f610c60 bf9afed8 408a9a92 c0acd086 3f3aca30 4097af1a 3f8d742d c0397f85 3f5a769e 00000004 bfb131f4 3dfbdd17 -> 3e25d9eb 3e05902d bd3e0b06 be131fc8 3f55ee0c 00000000", + "c036df60 41ba9804 c189ad98 bed53e71 3f53fe78 bff90baf 400da30d 3ded1a47 3f000000 4044c4a1 42305376 3fa47144 be6d119d bfbe386c be8ab6e0 400023c4 4080af0a c0431e86 3ff52e40 c0a82c36 403b8c08 3efbe643 3f1ac0e6 00000005 bfb4d15a 3ee6ef4e -> c0c14e9f c158e15e c057941b bf16f247 4506a35b 00000000", + "40d73338 c1948fb2 419369b4 be1e0b2b 3fb499cd 3fa2ed30 3ff626d2 3f53e472 3ca3d70a bd879871 4029cc37 beae60e1 3e416f70 bf1e10cc c0a026a4 3f9ab2b8 c016205e 40369be4 40ebd0c2 c09b810e bf0ade3b bfe59531 bfd77a77 00000004 3f085fd0 bf49cc16 -> 3d827e46 bdd58719 bdd708dc bedce6f6 3e1e779a 00000000", + "c1cffe0a 410ae74c 40bb1c30 3da5c729 3f095f9d 3f749369 3fc68abb 3f679bc3 3f000000 bc135d81 407062f6 bd862c17 3f1ae843 3f101bce 40cf859c 4095deb4 c0eaea23 4022edbc c0b2092c c027279e bee5342b 3f5daeda c030461a 00000004 c00d642e 3f273a46 -> bdf2fa3d bda120a7 3dbb3e42 3ed1fb6b 3e3948ea 00000000", + "c114e4b0 40bd4bf8 40270ed0 bca0e0de bf080b06 3e69e7c3 3f9bea63 3fa3aae0 3f000000 bcab1ec4 413aa88a be81ac5b bf35000b 3fe9296f 40b7f148 3f05c1f0 3f378730 c01cd4d6 c0237a1e c0b8bdb8 3f8f0901 beb270d0 3f92e77c 00000002 3f0b535b 3f09885a -> 3a34b770 bd44e4da bca58112 3e89fd3a 3c734d55 00000000", + "c18578da 421d54f2 c232105f 3f1c7027 4028cc85 3f93774e 403c4e5c 3e7261a2 00000000 bf84fcec 3e251741 3e80276a bfd56fcd 3e42b20a c03d5930 c0a335ef 3d7ffe00 bfc4d3a4 40da09e6 c0363c28 c0056b4c bf4576ba 40116bc7 00000008 40361db0 3f261a4f -> c18e2d54 43b4d0c5 433f820f 3db71df8 4d96086b 00000000", + "c2145cd9 422f5978 c19fa3ef 3fd40fe6 3f4cc13a 3de56f89 3fef0634 3e788850 3dcccccd bcd34211 3e190175 3feb2b6f 3e5be914 3f8bd5d3 bf9bdc24 c09b4500 bf2dc2c8 37d00000 400286f8 40d71126 bfd0942d 3f157837 bdf7a952 00000004 3f210456 3e6bc520 -> 3f36cd27 3debfc18 3eab3724 3dc2e56e 3fa37cb6 00000000", + "c229d888 41ab1364 4218ef08 bd1cff46 c00ad13e 3ef2abfc 400e65f4 3e634cf8 3ca3d70a 40ccece9 3e0002dc c002accf bd130fb4 3d8df545 40b63ec2 bffecfac 405a5d14 4034e280 bf89bb64 3fb34860 bfdd75d4 bff1ad79 3f952cfd 00000004 3f606361 be84aafd -> c2a251d1 40867d30 c1727c5f beb9a6b4 4831c1a1 00000000", + "c2321c2e c2178788 40e5ca60 beb629e7 bd933622 bf375565 3f55d6b8 3fcf873d 3ca3d70a 3f09647d 3f86cea2 3e9cb2a9 3dae5ec0 3ec779ad 40513520 c08fa698 c037da8a c0aea9e9 c0c03f43 3f775e30 c035b731 3fc15f99 bfae1aab 00000008 3f94ab86 bf400553 -> 3f047524 40238a3c 405dda22 bf1c8576 429a54c9 00000000", + "c1bf3bb0 c1ca170e bfe1b300 bfb15c0e 3ff72717 3fbd857c 4034ad4d 3f931728 3ca3d70a 40566381 3ce9a815 3fcfc014 3fcd44aa 3fd1518b 40f25ff0 40982eb8 4082005e c0a11ce9 c05a0a06 3fc7eb70 bf812599 bf7a1cc1 403ed847 00000004 c0129bf0 3e7ba45c -> c217a220 c22198c0 c23a9954 397b8670 4a8ece48 00000000", + "41a8aadc 41c666d8 c18df3a4 3f5dd420 bfc1bc12 3e9ea267 40055cac 3f1ff6aa 3f000000 3b8ec885 3d9d92f5 400ae5db 3e8fb09f 3d215081 be131ce0 c08dff9a be8d2ff0 c08d1412 c0067926 400c3ef0 bf3dba2f 3e51e234 3f4eb834 00000003 c0059863 bee46123 -> 3dbd3f74 3cd1e30b bad97876 bc24b50c 3f98d264 00000000", + "c14cd2fc c0200460 c232429d bd0e42e3 3ebc185c bdb846b5 3ec3430c 3d9e7d28 3ca3d70a 3cb371e2 41174ea6 3f1d8d61 bf024021 3e051c6e c08c0e34 40f4848e c047ba74 40587c6c 3fbb76f0 bf5fa8c0 c0388025 be52221c c01a077c 00000002 4031a30b 3f529e8d -> bcd3cd14 bc6fdfa6 bb09c7e0 be907924 3d831e76 00000000", + "4079a960 423cd28c 3ec36e80 bfa2c1e5 bf772a54 bfd8f62c 402f7f8f 3f53c742 3f000000 3bccc239 3c9f0b0d 3fe140e4 3fc006a3 3fd7fc8c 3f0d40c0 4001fc38 3f593870 bfa00a6c c09e2e02 40cdcfb0 40107533 401b9e56 bf191062 00000002 c0363889 bf86f36c -> 3cd99238 bcc32a98 3d173050 3e9d0fe2 425c1e1e 00000000", + "c1551f00 4082b550 c171221c 3f00e9f6 3ec68d36 400931c3 401b2afa 3ff1674b 3dcccccd bb335276 3c6b130f bedb5ac6 3e80c784 bef7e4fc 400e0d64 409cdb4c c00c4c6a c0a266a8 c0ef4aa3 3f4e2a30 403003a7 3ff44d2b bfe9eff1 00000006 bf4063ce 3e08f1f2 -> bdf2ca97 3d93f44a be0759c4 bd6800e1 3fe76da7 00000000", + "4240fefc c21041b3 c23abc15 bf85ab3e 3edffd61 401a331f 40479663 3f69af06 3f000000 bd429213 3da733ab bf9d4b04 bdb71732 3f8ceef5 c0a8b9dd 40cb2b9a 3f161110 c0579f54 40ba0cb6 c0392384 bfbaa1c8 c00f3486 400809a5 00000006 c00b76fc 3f6a5cd4 -> 4147188f bf41e4c2 c1a1709e bd96b257 47145ce3 00000000", + "41bde074 c1c7c246 4131dbbc bfc1098a beef27bb 3eaba05c 40220c6c 3feb0410 3f000000 bff794bd 3cade4c1 3f66f99e c00bbfb8 3e15ae1d c05cde54 bdebf9c0 40cdb8ca c00cc8de 3f0d1840 c02f215c bfe57800 3f842cfc 3fb0471f 00000006 40350f98 3f3ddfea -> 451b9ec3 c5bb28dd 437f4bfe becb536c 4f741e02 00000000", + "41457c78 c1bcd52e 41e4f868 bd418989 3e9a0ab9 be2f31cc 3eb74959 3db172a3 3dcccccd c0079d97 3eb40f82 3f078adc bf2a492d 401578d5 3fee3eb0 bfe182d8 c0b72bae 40ccb500 c0046aba bff226b0 bf1e9bc4 3e2c0b75 40196c71 00000006 bff7ecfc bf97cba9 -> 4319e8a7 4367cfbc c42fb02a 3e4b15f0 4a8a9b98 00000000", + "c1757f00 41a17a04 c23fdfdc c01c6053 3f8fe40c bf0c315d 40353347 3e312466 3f000000 3ca66f17 3e430e2a 3f4d712d bf0084bf 3f068bac 40423344 c0bb3c56 403eed60 c0eb1b2f c070ea68 c030823c bf5c4f47 bf89243f 401d107b 00000008 bfffb15e 3f8629a8 -> 4272e22a c2107abc 41ca1786 3e19fcb8 469184ac 00000000", + "c234e03f c1632bf0 c07400a0 bef2b93a be883733 3eb041ac 3fb92b5d 3fcd9d6c 3f000000 402a23c0 3cc7a3ef 3fd0ea41 bfc92990 3f9bf2f7 3fa93500 40ff9ad8 bf29a310 408fe600 bf502600 3f3667d0 3f7fab39 3fa939c3 bfcc2df5 00000004 3f085b28 3f1e65ce -> c2db71e2 42db5c4a c2ac5759 bedf4cce 4943e203 00000000", + "41ec6ab8 c1b12374 c1f5283c be2f4023 be15d2d9 3e1b3af0 3e908790 3f0adc83 3ca3d70a bda3da6b 3cb6587c 3e411c8d 3f51caea 3f24005d 3fb01ed0 40114594 beed7520 c0c22d94 c09b9ffe c0eb9f73 bf860b6f 3f9c2431 4008d9a6 00000002 3f6dfdaa 3f1c8e29 -> 3ebff82e 3fc47529 3fa63dd4 3d6b6cc9 44251ef5 00000000", + "41fd1eac bf2abb80 c2424913 c01388a0 bf88c21b 3fb3f38e 4039d7bd 3e81b4f5 00000000 c1167494 3f16186b 3ece1776 3f2c5953 bf89601c c085b0f2 c00cd874 c0d21cba 3fadbd78 bfed8718 40a2ef02 4037c102 40181743 c028c1e8 00000006 c0366ceb 3f081ca4 -> 422c8510 4375acba c36f7a90 3eb22029 4bcf8834 00000000", + "41f33204 41f5cfb0 41ce0340 3faca5c5 bfaf6f83 bf9f0246 4036bf67 3f90ec73 3f000000 4093c969 40b21a0b 40075a0b bd9b554d 3facd20f bfae19e4 c0b068ac c0c286c5 4070d164 c0edae18 bfbff6f4 3e7807f2 3e9d2ec8 c0187e56 00000003 3f47d1b8 bf5e3e11 -> c0351956 4099c66f 40b86bbc 3e33179a 450627fd 00000000", + "41a12aac 41ceb578 41f12678 bfc8610b 40169af5 be086fa0 403526be 3d4cdee0 3ca3d70a 3ff210a4 41182aae be4ab6d7 3f8251f3 40339edc 402140d0 3fb6f9b8 40dc6d6c c021562c c0cb6fea c0f45ac8 3e246849 3f9c7e45 3fb662c7 00000001 bfc02c44 3f11db69 -> 4080745e bf128dda 3e745bb8 3f447271 4346ff65 00000000", + "4140a864 c2268b16 41f98564 be0445f6 bf3937d0 3f3492e8 3f875a5a 3ec68526 3dcccccd 3be9cd13 3f9ae9d9 bf5296fb 3eace979 3fd85113 c0d6314b 40f1b9f2 3f8d41f0 be061920 bf70bb90 be847ee0 3f8c58d0 c020e01c c00a473d 00000004 3f8d574f bf855472 -> 3b95e588 3d0fc0b3 bd39b1d4 be01353c 3c008e74 00000000", + "41de9a84 c2175ce9 c1aac4bc bf82d997 be2aaa3a 3f278b33 3fa02ca5 3fa7658a 3ca3d70a 3b11205e 408d65d6 3f07e431 3eba2c9c 3f5e6d6b 3f07f5c0 40b3515c c02e6eb6 c0b903b2 40ca5ad6 bffc9110 402e3d95 4026b800 bfdd2c14 00000002 c0390587 3e0f6d5c -> b92cb670 3a7987b6 b9fc0278 be97d6e9 3973fc8b 00000000", + "419728cc c1f1daa3 c243c99b 40346323 3e84f2ff 3b18f53f 403526b6 3cc57fe0 00000000 3e9fcadf 4164cd34 bf8d0806 bd88d2cb bf922384 c0577f2c c090470e c0225090 3f2316b0 406c9480 40d688fa bf0799e4 3f9b94e9 3fb58630 00000003 3f052057 3ebe1d92 -> bef78a52 3e8446b6 3f05b866 beea114d 40423349 00000000", + "c1b20019 c1d738b1 41ed480c 3fd77f47 bf194879 3ed981ea 3fec1ab2 3da16f9d 3dcccccd c08f60b4 40fe3a9b bfba7d15 4015d297 bda1f07c 40e3dd92 c0c597c2 bf222ad0 3efb5620 3f4a3a90 40b67674 bfc93990 c026d353 3f6369a6 00000005 c01d849c be2b3791 -> 40cbb598 401302dd c167af02 bd482e71 45b31524 00000000", + "423e51c2 c1b68684 c239aeae c00a8cf1 3f62ffe9 3fc28210 403315f2 3edbd3d8 3ca3d70a c082cf6d 3f98e9fd 3ec3440b bf3ba579 3ea2e028 3d91a200 c0a52088 4038dbe4 40e55b72 402ba504 c0d7ca18 3e8f1a6e bf83b55b 40336a9a 00000004 bf839596 3e86ce53 -> c0e1f751 417b2fd3 bef5f23a 3e971dec 44a010ae 00000000", + "41cd58b8 417c9890 41f81400 bec03ea0 3f38cf7d c035acc9 403cfded 3f491405 00000000 bd0bce23 3e6fe1ff bf568c16 3d5bf929 be84646e 40a35ab8 40983a0a 3fd08030 c0c9e3a4 c0447f3e 3f0fab40 3f0b4d95 3e010a27 c00337db 00000004 c03a0cbc bedb41b8 -> beb579e5 3dc51014 3dccd7f7 3e13c7be 42116d32 00000000", + "c217afc7 c23e3f2a c065d0b0 3e242a0b bf324568 bf1852cb 3f918e43 3ed43fca 3f000000 c0035bdb 3ec3c74c 3f1a6d5d 3fb2a504 bf6134bc c000b23e 3fe2a220 402dfdac bfe4ed30 c0484a12 c0d192e6 bfe08796 3f3778a0 c01286e8 00000003 3fc86c30 bf4eb72a -> 40aaeab0 416dc1d2 bfcc8894 3f1603c8 462cd0ce 00000000", + "41d6c248 c0872e58 c23a6dfe 3fca60ee bf3c6dd6 bfb8449a 4015f3c2 3f50d991 3dcccccd 3e04d448 3d6c0c47 bea8996e 3e9945bc 3ed228d3 3f2fd7c0 40f04880 40acfbc2 bfc36400 403cab7c 407cb814 4024e660 bfbe5443 3fa28977 00000003 c01335fd beff35e3 -> 403e5e0c c0631cef c081432d bde0ae49 453aa0e7 00000000", + "c233efef c046c240 c243c531 3ed05c8d 3f95a261 40109848 4024dfe4 3f6ea295 00000000 bb5cc36c 3f7e45c8 bf59ca9b 40114463 3f00543b c0bc2130 c0c2f814 40a88cde c0c89c5a c05d96fe 40a78796 3fa7a152 3de9112c 3ffd3df3 00000001 c0368227 bf28ef89 -> 3b3e1e5e b89d93b5 bb7fe645 3de6a534 3960ee2a 00000000", + "c221ea7a 41bc0248 c2285699 bef83fad bf219847 bef8e5a7 3f852e40 3e5ccbe8 3f000000 3cb92fc3 3e21e2fc 3e0146ce 3df22b98 3fa5be4b bfef52bc 3f71e610 c0a08598 4080d320 3ef105a0 3f6ff950 bfab8c85 3e52c34e 401a1dbe 00000007 c00aa2d3 3e9b7c36 -> bdf2a570 bdc92d6d be96adb2 3ec8a143 41ea18eb 00000000", + "c077cf80 c1ef37d6 410e0090 bf68c42d becf8b46 bd6e6419 3f7f4923 3ec299d8 00000000 3f10a861 42b83b56 bfd43cb9 3f29b551 3f544695 c048b734 bf47b1c8 c0879f11 407cd748 c022a7a4 c07c1c14 3f2092a3 c0163523 3f643ea9 00000001 bffabb1a 3f667eda -> bf43df1f bfb8e2a6 bebccba5 be69518e 40f37198 00000000", + "c243e1c9 c1e7a97f 42275eba 3fac0669 bd52275e be247c31 3fb0fc56 3fb497e6 3ca3d70a 40edc9f2 4150e55f 3ea87f86 c012bfba bfe8ccc0 c0b3442c 40598668 40d615f2 c0c57be8 409879fa 400297e4 c020b287 3f9c09eb bf7257bd 00000008 bf80521e 3f996ddb -> c157ff5a c2ad34c6 42c8d0f4 c0931926 47497752 00000000", + "421bd65a c2429dd3 c1897688 c0132ae6 bd958d3f be57c37e 40164d7b 3d9c7532 3f000000 3ef6737a 408fd924 3f75b47d bf1627b2 3f9d065e c0cbedd0 4028f6c8 3f4b19a0 c0ec712b c06bfc1a 408906ac 3f456cd3 c03b4f59 3f8f0489 00000003 c03bff73 be899542 -> 3cd39338 3f32dac0 3e5c8a08 3e0b1c6b 42e0317f 00000000", + "c225bc62 c0ba7df0 4183dc18 3fa90bed bdcc56ea 3f8638eb 3fe06ac7 3f23bd15 3dcccccd 3f1b847a 3e35e7db bf77e96c 3e11c4e1 bf83c422 c0bcb07d c096880e 40f6683e 3faa1570 408a43bc bf436928 c015f798 3f3eccc4 bf13bec1 00000003 3ffba4c2 3f734a07 -> c1ad8b84 4085d535 c1c915f0 be7fd650 4638b08d 00000000", + "c23abe2f c1e9b97c 41b39f68 3f4d3247 3eb56b83 bee35c8a 3f80d6d9 3f9a37c4 3ca3d70a 3e817bc7 41184c4c 3e1cb070 bf93c1d5 3d1d2bc5 c09ee33e 3fb69160 4017b64c 40a288be 40ca5514 402fea08 c0030753 4010c7ac becdbaa8 00000004 402dca65 be652192 -> 3e1dc914 3e8fd065 3e8f316c bdae3dc8 41e6ebf1 00000000", + "c21250e7 42470272 c22cdc30 be95249c bfb7d0ac 3e6052f0 3fd0ff8e 3fc18d45 3dcccccd bff94f5f 40617026 3fcedaa0 bf23d16f 3fa99e28 40a51d76 40b7870e 40923b40 c0305c24 c0f4a133 4005a944 403b46e7 3e899939 c03d898b 00000002 3fff5617 3f73f0a7 -> c018dab7 40ec622f 408296dc 3dbbc03b 447cdfc8 00000000", + "413426a8 4239a924 c1cb2840 bfeab6ad bcc2d4cc bf9f50da 400dd89a 3f406a40 00000000 babdc858 3c6a3005 bf948733 400e75ad bf7ebd08 3f43d140 40867dae 402c29e0 c0a9e77c c0c0f0ee 40f153ea c001cacb 401c5b42 bf00b7de 00000006 3f3a49fc 3ebff777 -> bd078e8b 3d734f29 bccec968 3e9798cf 3e9ab56d 00000000", + "420ef392 c11b236c 417460a8 4024ef63 be43d82d bfafe9b0 403cbaa6 3f8ca75b 3ca3d70a bd28c79e 3d8306c8 3f28ae75 bfd1e4a7 400a182e 3fc644b0 be938ad0 bfd9acbc 406f2d58 409c2792 beadcbd0 3ef20ce5 be07ff64 c018991d 00000001 3f73f96a 3f4c261c -> 3f2f2721 bfe058c1 4020b985 beb89921 4187c214 00000000", + "41160078 4223edd6 c083a360 3fcc892b 3ff59c7d bfb48051 403788fb 3fc5cd09 00000000 3a9a2334 40bcd416 bf841040 3f047dfb 3fa06793 406a68c8 c0f59b92 40346208 40a7240e 40e3eee2 c0fae6b7 bf2e5027 bfcb1260 40337bb9 00000003 bfcc294d bf53bc8c -> 3aa60884 3be9948a baa3bf06 3f4bc15c 3990593c 00000000", + "c1155f94 41eff288 4146e130 bf338a5d be60f18f beaafd03 3f578f74 3fde9ed7 3ca3d70a c0951dbb 3f13b8e8 3f3fa5b7 bebfd31c c034be56 bec2eb40 3eae0a00 40dd3a16 c06ba51e c0fe81f1 40a602a8 be299fa9 c0251069 3e6b3f32 00000008 3f1d8c65 bf7b8563 -> c050c90c 40f5d9e5 4037235e beae8d28 45b1a952 00000000", + "4013a220 c23c0512 415a482c 3fdd8cf2 beda3546 3f1ad94f 3ff38a37 3f81ae32 3ca3d70a 3ae87cca 3ec3ac9f 3d862d4f bff5d114 bdda11fc bff4bbe4 40cffed6 c0a4b628 40b42d14 401b45e4 3fe4d7d8 3f5b7fc5 3fe88b7d bdce8319 00000004 40161cb2 3f695a5c -> bbb02bf8 bdd6cfaf 3c98e563 3f5ed210 3d6f8747 00000000", + "40fa00f8 41f9bbb8 421b2aba 3e82de96 bdfc0034 400a9ca1 400bcbb9 3fc4e1fa 00000000 c03abd53 40aa50cd bf834c77 3f4e98b8 3f4fba72 c0547508 c0728404 3f0dcf50 40fb1128 40e66790 3f233c90 40108013 3e8c8d54 c01e846a 00000007 c00c1e68 3f8f3871 -> 42c7b89c c47dd036 44c2c3af be615cc8 4b2e29ab 00000000", + "c211c674 423d90a8 40f67168 c021c6f3 3f45dc59 bedcfaab 402b6927 3f9fa334 00000000 3d646bab 3d4e49c7 3f8c8158 bfc31555 c002f1a8 40d127fa 3f144970 403b0ba0 bea7bdd0 40e5b0d4 40e65b92 c028d326 3ff3faaf bea794d2 00000005 bfe780f5 3e2447af -> 3f6b5ff2 bfa6f088 bfe12b41 3f4d2091 42a1964c 00000000", + "4150283c c1dea5fc 410a93b4 3f4465e5 3f879ff9 bf92c866 3fdeabc3 3f83e698 00000000 3b3079e6 3e3a673f 3eb9b071 bd824f8b 3f0d06b0 40a0ab0a c0cc914e c0ce42c6 bf9f4e40 bf3d0fa8 40aa3a0a bff1b9b7 401e4adb 3ef08ce3 00000003 bf9b2cfa 3e11df04 -> bcc3ea83 bb952143 bd002c7c be12d7c7 3ba9440b 00000000", + "4220b2a0 c0b83d60 c22e8c8a be2a39cb bf930b1a 3f7f5613 3fc8bef7 3ff2b316 3ca3d70a 3f85bc03 40a9c97a be7be55f bd397fcc bfd43697 c057e4f4 c0eb3984 c09ffe5a bf9f6a18 4012734c 3f9ae9a8 bfc5e2a9 bf82ddd0 c01f62ae 00000004 3f9f8aa9 3eef32b5 -> 3e4e7e65 4024dd0e 3e985b6c 3eaee0e0 42dfd94f 00000000", + "c1db91cb c222fcc1 41c0f0b8 3ea44155 bca849dc be78d9f4 3ece5488 3f1603e9 00000000 3ead15f9 3d6103ba bfc09b86 bf89603b 3f168c38 4095edda 40d04e02 c0d354dc c091395d bc07fa00 bf81a7f8 c0180a70 3fa356a1 bfca8fcc 00000002 c01e6b00 3ee628e7 -> c1955ce7 c158e7ea 40e18e48 3f3af70b 45494fc2 00000000", + "4226de18 4188d520 c0c41c40 be9196a7 bf49b202 3e43b6a4 3f5bf0df 3fc24762 00000000 411bd50d 40b07a5a 3f31463e 3fdda684 400ef37a c0e10f3a c062c30a c068ee9c c0ca4204 40a6661c c0e66900 3eb5683f bfdbc4a1 3fc6566a 00000008 3f9ef6be be9949b1 -> 40ddcdf4 c1535b41 4137d7f7 bea4ebbb 4542b7f7 00000000", + "c2470b25 c11ce8c8 414d66b8 beba1a2d bfbe79ed bfe0e24e 401debd0 3faed2c6 3dcccccd 40a6b04e 3ff2836d 3f119caa bdc94849 beb7f3b5 c09883d8 40d8bd06 40d4414e 40d29a40 c0cf0d96 bfe4198c 400a379d 3fb1390d 401c13a9 00000005 bfa07d41 bf8b120c -> 421303e3 c20ebab4 428468ee 3f8f10e2 46e18511 00000000", + "c1cbab11 4234693c c05b7910 3f590f0c bff18a92 bf4da1be 401ddc00 3efd3e6a 3f000000 bcf01b0d 3fab9a58 bd881f5d 3e503383 bf1dca94 bfffd600 c0b1b336 be617340 40736cc4 40869f2c 40d495fc bfefbb29 3f13f286 3f9b8964 00000007 bf972bd0 3f3b2a88 -> bd38880c bdec4062 bddbf7ae bcb419a2 3ea361fa 00000000", + "4223bfc4 42223f9e 41f378a4 bf01c3b7 c0194e74 bebce385 401e785a 3fa47e75 00000000 bd6270b3 3f2132b6 3df2eabb 3ec4304d bf416570 40e3ef28 c0aa3b32 c0b95978 c085b6bb 40c289d6 c0d72f98 3ed9e67f be804f01 beeb1008 00000008 3f9d40ba bf6fce9b -> 3f718bc1 be013637 bed0895b 3fcff256 40c3418f 00000000", + "c19de57f 41b9cec0 42319390 be8cdabd c039af92 3f2a4e79 40496074 3fc934b7 3dcccccd 3fed9767 40738aed bf5f8243 bf4191a8 c010e358 40616e68 c0fca245 c0db9cbc bfe97cdc c0badc6a c0474aa6 be66c8ec 3fea8746 4013c5d9 00000008 bf7d01aa bf128958 -> c022ce99 3e52e8be 3eafec17 bf5e1c67 43d754fa 00000000", + "c1a17c07 c20a154e 41860d70 bfb796fd 3eaf0589 3fcba996 400ad530 3f47facc 00000000 be798fcc 3c834210 3f5dc42e 3ee415fa bf1e992b 40bd004a 40dab4c4 c0d83e8c c0cff820 40fc3614 c0d4d234 401676c5 3de4934c 40035909 00000007 3fae52df 3e9bfb8f -> 3f82ad5c 3f75cf97 bef8c87c beb54db8 46472c02 00000000", + "4243337e 41ca1f5c c247d7d7 4019614a be2bfea3 3fac8f01 40398d35 3fb8d67d 3dcccccd ba877902 3de9aeba bf4848fe be35c7fc 401e6ef8 40bcf81c bfd9b3c8 c0d7da63 3fc0ee10 beafa810 406e2f5c 3fc83362 3f705ede 3fac0a0e 00000008 c0275ec0 bf4e8df1 -> 3e65dbdb 3e50ec54 bffee14c bf333500 44592514 00000000", + "40b8ac60 c1450a60 40007f50 bea0f4e0 3fc50ea0 bf14e0a8 3fd952dc 3f8f54a8 3ca3d70a 3eb3cc4f 42be0a70 3fc3a9c3 3f6d056c bfb66703 bec704b0 40abb18e c0846528 c0e80ff9 bd0ef680 c09c98d5 bfc60597 bfd2371f 401e0d14 00000007 400b77e6 3f40d39f -> 4139e5d8 41be69da 41df3f23 3f26b6bf 469bba13 00000000", + "c2198e4a 4185c2e0 bf393040 3f35d92c bfc642cc 3dd1b88d 3fdd102e 3f7f5ecc 3ca3d70a 3c647684 3c881d65 3f6169aa bf264d9e bf0016b6 c09a7ae7 40e9ff5e c0e729f3 40ea7f8a c0a79a7c c0d399b6 bfe9e95a bfb3424c c0282ba6 00000006 400730b2 3f935a39 -> c172a35d 4169b16e 41177399 3e8b1b42 4829ebc0 00000000", + "c0859470 c129a44c 41ebf95c bf08df57 401a8974 bf9f81c3 405adc83 3fa67ec7 3f000000 c00be392 3fa74bb8 3fb401f8 bf4bf01e bee8a384 3fd0a718 c07245be 4067dcf4 40927400 40a509b4 3f6cab20 400310b2 c01cecb8 c02e614b 00000003 c01cbf82 3e3b46d4 -> 40620bb7 400a045e 3fb059a8 bd54b809 445b5a16 00000000", + "413f49ec c23b9605 41f54df4 befc8a34 3ec2d2cc 4011456f 401d6efd 3e594c9c 3f000000 3ddacbee 41bfa9a4 bf33ea94 3fedd5ea 3f21ee53 c0bb0c62 c0166284 40c33c0c 4074428c c054a9a8 c0bb5a40 bfff8873 bea66a0a 3ff05bb2 00000007 3fedca4f bf64cf9d -> 3fca1c6a 3f3e73be bfa8e472 3f7e6a7e 444a4df2 00000000", + "c1225df8 c1b04148 41749fb0 bdb110a0 bfa70fc1 bf408adc 3fd13ab4 3fa0f7c3 3dcccccd bd722fb4 42374e33 bfb6316b 3ef3adfc bfd3794e c0ca021d 404db38c 40e5e046 c0a5fc49 c0f90548 3fd2bcb0 3f869193 3fbb2602 3f9bf36f 00000008 3fa9b9d0 bf0017c8 -> 3bd3e9ec 3d3d2ecf 3c4873ea bf2c6f42 3f2648e0 00000000", + "c2399250 421ef7a8 41f48b60 bf079a2c 3f6ce8bd bf12e744 4000ff2e 3fcdfefd 3f000000 bfa3001c 40e8c470 3eb544f2 bfa0aac9 3f5276a7 407e2ac8 4000ad14 c0da1d75 3d307200 c0d996a6 c0ddefaf bf12d2b9 3fa628ad be9e40ee 00000002 bf106dfa 3f8f71c8 -> 3f737900 4040f1dc 405ddf6e 3ee19a13 42f4d621 00000000", + "42006530 41e49e2c 415450a8 3ff57128 3eda626e bfd57cd4 4058689e 3fcdf078 3f000000 3ad735f3 3fd92494 3dae8e24 bfa4ec8a be8076a2 40726f2c bfbd0f5c c0a7b760 c0a09efe 3f837ab8 402882ac be9fd356 4020e40e 4028fb2d 00000008 c0114192 beada74e -> bb87ddf1 bb3555e9 38c33f68 3f30365b 3c873869 00000000", + "41252d10 c0539d90 4160ec50 3fee0079 3f83859e bf34f436 400fe9a6 3ef8c519 3ca3d70a bf4acbec 3ca8f4d5 3f6d5e06 c005b776 3f3913ca 40b316e8 c02ac87a c0b7bf2c 406d11f0 c03c56fc c0ecbe74 4032da72 bf95dd6a 40255872 00000003 c02a26cb beda9840 -> 41ed0ec8 c279a35a 419a9502 3f490653 49838348 00000000", + "c127fdb8 c1f062ea c115d160 3eca2e1b bbadc78a 3d497ed2 3ed4598e 3f56b87f 3ca3d70a 3fcd8492 3f41a800 3e3fe71d 3f3d58d2 bf0d0dad 400300f0 40fc2b52 40e9f630 c02e79b0 c084bbec 40682fc0 3fc2349f 3e8e36a5 403b8e87 00000002 3f39c783 be26b1ca -> 3fb4d9ca 3f4f54c3 c0b0222c bf597d6f 435b765a 00000000", + "c1ded520 4225ed86 424527e2 3c6441be bf75e8db 4013d319 402bc462 3fe951ce 3dcccccd bd9328ec 419ce808 3f97d38d c01cf12f bd8c6440 3fcf9318 4060bc34 c08c758d c06b49c8 c0e2f632 c0aacb7c 3ff87de3 3fbd789e 3fd2e1cd 00000005 c0241186 beaffce8 -> bd9dc4bc bd1cf4d0 bc380b00 3eb12af7 4150f647 00000000", + "421bf0f0 4140c508 423d72a6 3de02520 bcdc2b8d be883d7e 3e93f497 3fb15ae1 00000000 3bad140d 3e835589 3e89c9d2 be6783e5 3ed85e8b 3dd3ce00 3f17dec0 c08dab00 c0ab73ae bfa1a3fc be5235a0 3f9ed7fc bf17726b bf5f0ec0 00000005 40214a47 bf460df7 -> 3e43ce14 bd8f2753 be2994a8 be930cad 40be929e 00000000", + "c23e11dd c1311ff0 42441c0a be99289f 3f94d118 3f11ccc2 3fd73523 3f348373 3f000000 bbc6b346 41b274c0 be670569 bea2bb70 c00188a1 c077e324 c0d61966 c07d9d1c c0a8ea32 c00e827c 3f657650 3fb2dd89 c0031edb bfd409bc 00000005 3fde3d1e be1a7d97 -> baee079f bc55996e 3aae5136 beb0e367 3b11ccdd 00000000", + "41b31508 c21522e2 4188b5d8 bfaac1d0 bff82d23 bf5090b9 4020ccdb 3f8cbc13 3ca3d70a bdc62875 3fb6b81e 3ffebd46 3e511819 bff5112f 40459044 40b17470 40a65aa8 c0cf3bf1 40c645ce 401baa38 3f968ce9 becc1378 bfe84788 00000006 3f253762 bec9f094 -> 3d00910f 3e0e3707 bdc032bd be14a513 3e5d3c31 00000000", + "c19fc1c6 4238f19c 4201281a 3f2e2fdf bfb3fa7d bdcb13ef 3fdaf040 3fb9ec0d 3dcccccd 4023ba54 3fbdaf43 3ee023ce 3f06c306 3f496837 3d45f000 402b7fc8 c074792e c00af9c0 409e65f0 c051f52e bf85f9c3 40174246 bf75fa9c 00000008 bfe9173b 3ef8bbf0 -> c0a5c6ad c1480551 40959cd6 3f09dd63 46ce98ac 00000000", + "4241b6e6 418a11a0 4192bb70 bf02e578 bea73eca bd30286e 3f1bb795 3f977536 00000000 baacc669 3c6a2262 3f56bfce bfaac53e bf302076 40d48e36 3fd97ec8 c0bea9d8 c0c94c92 3e3d3780 c07b113c c004a1c3 3fdff019 bf8a0cc7 00000004 bf4362c4 3e023402 -> bd860aa2 3dd94cad 3d59a42d bf4602c2 3e5d60de 00000000", + "41d738c4 c1f6b6a4 41b820f8 3eb0f29a bf8a2f9a bff45ca0 400e4364 3e05e27f 3ca3d70a bd607f71 410a63c0 bf631210 bf71f0c7 bf4e0491 c08e0700 3e4d52c0 40ddefea c02c1da4 c05bfdfc 40948772 3fca372a c00f53f4 bf84e38c 00000003 3feb33c5 beedbe16 -> bdfa56f0 bdeae2d8 3e833b11 3f25bde1 3edd7a21 00000000", + "bf417d80 c0a917b8 c14e6520 bfab4cdc bf20cced bf2d42a1 3fd01dfe 3d5d9f2d 00000000 3da14cc5 411978ac bf643651 bf9996ac 4024a4bf bfa4e8f8 c0bccd30 4020427c 40f72334 409b9ffe c02461d2 3fe4e98d c01cc9a8 bf2d83d8 00000003 bf8f070b 3e331d70 -> bd4cb137 be1e1e0e bdca36f2 bd67e1ca 3e066bd8 00000000", + "411e6650 c2429db4 c10485b4 3fc0a78d bfa96ae9 3f2600f2 4008161f 3d21e78b 3f000000 3d118969 3f5b3fac bfba9353 bd4e17e3 3f884464 bfedcecc 40dcdab2 c0800905 40943f8e c02ac822 c0631b40 bf175153 bf986799 3f9e77c3 00000005 c0042875 3e5577d4 -> 3cbfb0e4 3d561b59 bd5cb122 be861679 3ebb44cc 00000000", + "41cc071c c10ca168 41120cf0 bd76260b bff05e86 3f20a3f8 4009c860 3fdc261f 3dcccccd be1cdb33 3cf3863a 3f613d9c 40180f9c bfbf2bff 40634b8c c0c42eaf bfdc0f58 40c16b14 c0ade6bd 40088ae4 3f7271d3 be6f1ffa be14932d 00000008 c031dad2 bf260033 -> c24f91de c2d6ce35 42d7791a bf3cf130 4d0b09aa 00000000", + "c1c28014 4222e312 4206754e bf6be48a bfc27d60 bfe291e0 4021d277 3f81d6a0 3ca3d70a bcac126e 40aefdec bf2b7ba8 c0124ab9 3faee6d3 4066085c 3ea88c80 c09acd74 409e8c78 406e4018 40f6ae9a c03a48b3 3e55b500 3f330d0f 00000001 40294e21 bf13baaa -> bd360946 3d0a21b9 3d43fa28 3e9575c2 3c3cd727 00000000", + "420ccbb2 422ab13a c1a59913 4027eab9 3e140650 bf69a2b2 403a126d 3fa0eb34 3dcccccd 3e80ce2d 3ca60ef8 3ed4852d 3f0b2074 3f90318c bfda9ad4 c0c76b65 40c0ba3a c0aa709c c00b43b0 40fb7e66 402b4e07 bf2e5385 bf374b00 00000006 3fa3b17c bf20cf17 -> c1905afd c1ae254c c239914d be1b285e 475719c6 00000000", + "424726d4 c22c5421 c231672d 3e3733e7 bf14e384 be406c19 3f2ae157 3e9cf2c6 3dcccccd be2aa840 3f64fdc4 3ff04c2d bf2b558d 3eafcd74 c0c3c06b c0df93fc 40e17742 c0383262 bf070bb0 40ee5f16 bf0c1aee 40193634 4021a414 00000002 403fae4e 3e57544c -> 3f327d88 3de687da 3e675446 3ece0026 4098bff1 00000000", + "c21d96a9 41f7a458 c18d61de bff10754 bfbd6de7 3fdc2057 403d1ae9 3ea139d9 3ca3d70a 40067508 3c8e5e5f bf8b9a6c bfb572ed bf1ba4bd c09383f3 c080d659 c0eb031e 4045d950 406d1f70 3e62fb40 3ff4a77e bfc8500a bf45c78a 00000007 bfe96e66 be2b5038 -> 430dded5 433754f1 42a76b85 3f09e4ff 49dc1118 00000000", + "c1db0a28 423b436e 4232fbd0 be62f212 3eedd217 be9f7e12 3f1a9b11 3def7fd9 3ca3d70a 3f7a716b 3ffc5074 3e7fdc14 3f8727cb 3f3df688 40a46b6c c06e37b8 c0a7a1d0 c01e47a4 3efa2160 c053ab92 c003558a 3e6ae3e8 bf808caf 00000008 bf3a2fe9 3efc34e1 -> bf6bfe26 3f405ace c0263fd4 3dda6cbd 420abee5 00000000", + "4230e04a 41244120 421c75e8 3e65d8cc be9cc663 3e48e111 3f140941 3fc12d9d 3dcccccd bb2545ef 400a46a3 3f0e92d9 bf8716cf bf2740f9 40cb75d8 406b69f4 c06f60e6 c0cb2efa 40b80658 c0f3e00c 3fc871cc bf918f98 3f34aed5 00000006 c01dedd0 bf4a4ab7 -> be6e997d 3c38a5c4 be29e9d3 3f001728 3f0fc813 00000000", + "c206db58 4230fe9c c147ea7c 3d9e83ec 3ea1cc56 be9fb19b 3fa0a366 3fcde53c 3f000000 bc1baf93 419bf09b 3ff1a0c1 bf846ebf 3ea56a9e 40ba6ede 405061b8 400f2994 bf190478 40a18472 c0d95ed8 c00a26e4 bfd01807 3eaa6867 00000007 bfa64b26 bddad6e5 -> 3aa210ec bbcd1db8 bca451a2 3dd3fe7d 3b5e92aa 00000000", + "c20188ee 4021e890 41d891d4 3f5b3ab9 be80c4ff c00a3080 401df5eb 3e86e353 3f000000 3baa1c80 3f8357dc c004c770 bf000bdb bf694cab be3300a0 40cc6666 402aabb4 40aab6e2 3f4bb2d0 409e89e8 bfb09b0a 403506e4 c031d9f4 00000001 bf8d5036 bf6e2d27 -> bb5e01ca 3a91196e 3c7e4345 3e15a6e3 3a4b8f3c 00000000", + "c01c24a0 c23557c3 41ee01f4 bec67a37 3c7d2033 bf60e04b 3f8ad670 3f9f37c2 3dcccccd be8cdd22 40d295ce 3f22e6b9 be9f8d69 bf86f190 3f39fe40 4046cd94 402762c0 3f6b61b0 bff4cfb8 c09834bb 3ef8d0b0 40179f12 bf877696 00000006 3f82d165 bf63e410 -> bcd5ca00 3ff2e6d7 bf0441f8 be722a68 414d28f4 00000000", + "c2017612 422c7a44 c2383cf6 bf0896b6 bf8bc3d0 3e80853d 3fa1f528 3f9bcbe3 3ca3d70a bdb0fb30 41a8ee37 bf78d1c2 3e3c2f4d bf06074c 40e1cf82 3cecee00 40b900d2 c0f7be60 c0849b62 c0fe2459 3ea298ff c013cf1a bf462bce 00000001 402d754d 3f6c3558 -> be1a2d66 3c5692fa 3e947620 bef7d182 3e44b3c1 00000000", + "422715aa c12fc940 c1c063b1 3ec1290d 3f0afcf0 bd6fd728 3f33f3b5 3da0a38c 3f000000 bb63fdc5 3fc1712f 3b9474c3 bf888fec 3f4b1057 409060e6 3fe13868 3faa9c28 c0b38f18 bfe549a0 c08df9e0 c02a4209 c01d550a 3ed9a376 00000008 c02eea9d 3e5893e6 -> 39d41ca3 3a7d29cd bb68df88 3e470eb1 3d295fe6 00000000", + "c1a5f096 416c2840 423c863c 3ef24e9f 3fb32858 bfd51180 400e9d0a 3e04ca36 3ca3d70a bcad76c6 42735fa0 400df247 3f7d2a96 3f1250ea 402f57e4 3fc71fe8 40a34470 4008200c 401b3efc c0f863f6 bfc80d9f 4020d3be c025a79f 00000005 bff6a40a 3ea8ff42 -> 3caef1c8 bd9b9a3c 3d4a2acd bf5b91a0 3dd0b656 00000000", + "c1d1c8dd 4158dca0 c2064484 bf2ee5de be676350 bf5da67f 3f901ac2 3df94c1f 00000000 bb483a17 3c951328 3f974a92 3fe6389d bf8c34de c0489638 4084c2be 4000c054 407d2074 40d0ab64 bf8bea14 3ff473f3 bf092f3f bfd26c55 00000004 3ffb30c0 bf68728b -> be71d9ad bee96ccd 3e63c06b bfb931ee 4244497a 00000000", + "417ee070 41091450 42443cd8 3f9704ab 3eababf0 3ea94b08 3fa464d6 3f331852 3ca3d70a 40365692 41338f8d 3fdb9f7f bfeb687b beb47642 3f38b190 3fc9a038 bf2fc920 c04137f4 402c1870 407deab8 3fb8d31f 3fbefd0a 3f4268c6 00000005 bffe61d0 3f430551 -> c12c8067 c1ab3cc9 428fe6f9 be0084e0 4757b032 00000000", + "4220e808 414798b4 421dc16c 3e6fc9cc c029f82a be94058d 402ce499 3f7cc5e2 3ca3d70a bf032be1 3c7624f9 bf648a30 3ea9fa8b 3ea38972 40a71f1a 3e9de060 c065f4d0 40e33ade 408b8654 c08a1d16 3fdaa11b bfba5588 3f3d86a5 00000006 bf956162 bf75b4a0 -> c24aaea2 41af7bbd 4195e2c2 3f1ed6fd 494d3542 00000000", + "41be24a0 41970304 401fbad0 3ee33723 c013de2c beeac1bb 4023a459 3fccc439 3dcccccd 3e6fa682 3e271c00 beedf1d6 3ebdbc31 3e8e1665 c0b94058 4093ad88 c0853f2b c0c5e48f c03e90ec c08a64f4 c037af3c 3f7ae526 3fb9df26 00000003 c0159625 3f900748 -> bf16d254 c056be46 bf6a28c9 3bf7f880 45a0aede 00000000", + "c01af050 41db21d8 c22bf580 3f94768a bf894411 3f3344d7 3ff606c0 3ff8885c 3dcccccd 3ed4b948 40d931b4 3f97fec0 bf6565d2 bed6f2ad bea7bb10 40db38ba c0f833dd c07d7e6e c063bcb8 c0dff399 bf412c4b bf977ddd c03de0a4 00000001 402fa481 bf8874fa -> 3eb4aec5 3ee58436 3dcc1059 3e6c08e9 4119adf2 00000000", + "c1e4c6c2 c0a34c88 41fb7804 bc1faf5a bef3e264 3fe491a7 3fef379d 3f84a204 3ca3d70a beddaa08 41d540c4 bf6e6e9d 402265d6 bd5c8b78 c0b2c23e 40b20c56 40fdfb06 c01fa06e 409ecd14 40b245ea 3f2f1c5c c0169d16 c035a8b2 00000004 40392c81 bf9616c7 -> bd01f7d0 4012a540 c1da2b06 3eb198c8 462b40b6 00000000", + "420b99ba c1c059ee c1383740 3f80fe1a be40fb79 bf2a0774 3fb676c8 3ed0d4d8 3f000000 bbba4c30 421555ba bf318b30 bf215d9c 3f3f3a2e bf3188c8 40b60ffa c0f4ccea 40970dc8 c090fdb1 c0f87562 bfd07dde c018845b bfb1d3d7 00000006 3f99b680 3ef0bb37 -> bbfc933e 3b882317 bb41aca6 be6582d9 3b1c5f28 00000000", + "c22b488c 4172a558 c2192820 3e9e5b46 bde3ddc5 becd08c9 3f04a0d8 3f3dcf44 00000000 3f187832 4155a11e 3ff0ebdb 3fc28533 3f0d263a 40646c80 c060986e c00d0cb2 bf873a70 40420ff8 c0f10580 3e04fbb2 3f945e7d c03fd90c 00000004 bff44771 beef6109 -> 3e8937ea bf6c17b0 3fbe2d2d 3ece5189 42ab09cf 00000000", + "420bae06 c194bead c1bf7341 be4163c3 beaa5f1f 3fb752e1 3fc2c95c 3ec959c7 3dcccccd bbf3d19a 3eea1865 3eaf88b4 bf34eabc bfbfee95 c0e1bf67 c09f58e0 c0098f76 bf117520 401d9e68 40a2d844 c02f7a5f c02c7c77 c005a4d6 00000006 3fb0c05e 3f62341f -> 3da72af0 3d207109 bb83130c bf14f05d 3e8950a9 00000000", + "c1b9eb26 c0f53968 c1715270 3cce1b86 bf4af9b3 c017737b 402c2472 3ff82a98 3dcccccd bc608c0d 3cdd2581 3e459e7a bf0ca21b bf57b208 c0e6f949 40acbf84 40cb7046 40bcc794 c07ba9de 40d77566 402c0c61 bffb36de 3f8ca7d9 00000007 c03ebe33 bf33b8d8 -> c125c082 4204e4c4 424d3128 3e6d1a34 49753577 00000000", + "4209c1ac c1c77876 402fce90 bf3cdacd 3edfaa1a be190e47 3fc1d006 3fa4d513 3f000000 bfd95c8a 3ce92ee2 bde6b284 3d84a928 3fbd9834 c0524566 bfda917c 4067f400 40ced79e 40b2c300 40929648 c00843ef bfa65712 3f381e62 00000004 bf014172 bf5dc0a7 -> 40700268 40249778 c1c78617 bf6cb143 48779bca 00000000", + "c102bb74 40962118 c208ca3b bed8d9ac bee9ee73 bfe9b091 3ffb70ac 3fe1f113 3ca3d70a bab24464 3f024a0e bf35c605 3f39c770 bf1092cc bf54cd28 408aa6ac 3fd982f0 c0868062 be33b1e0 c08c8bd2 3f9708a7 403d3eca bf957b9d 00000007 403952d1 bf71a3d5 -> 3f671a3a bfc0892f 3dcdacc2 bf8b0fe0 42d8bc7c 00000000", + "c1604278 bf85cfa0 4122674c 3fdcf3b1 3f93d886 3ee6edc7 4013d6be 3ebd05c8 3f000000 409af42d 4098b639 3f8fbf49 bd01a031 40000a5c c057049e 40c6c486 3f806cc0 40ecb1e4 409b2128 3dd77380 40352156 bfe79e53 bf82d2fe 00000003 bff3d111 3f83e7f9 -> c1863514 c219bc11 c0cfaafe 3f0ad677 46becea5 00000000" + ] + }, + { + "glsl": "SpanNoise cultmath_span_ridged(SpanPath, SpanStage, int, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "3fea7280 c08e1168 c22af615 bf891134 3edbd972 3f0f5500 3fa425ad 3f798864 00000000 3cdea50a 41ea595f bf4784ae bd468e15 bf388132 bffa4d00 c02988a0 40afb644 40892b4c 3f8f75e8 c08b2272 c006306e bfce3d85 c0297638 00000004 bfbabfb6 bec22876 -> 3d1fb19c bb9dc733 bd188555 3ed7d430 3d522e6b 00000000", + "c242f160 c18a36f8 41483378 bf1f4212 bf92778b 3f0b16f4 3fbb8e48 3ddd6425 3f000000 3fc7741b 3edea0d0 be5916fe 3f0db1ee 3f073e38 3f15fb30 bfa85654 40c6a9ea 40acc428 4056f278 40f9ebde bfb08250 3fc77334 bfd6cd94 00000008 c0399e95 be8910a7 -> 402d3939 c108162f c024bb57 3ec2649c 48b80388 47b20476", + "c233f27e 40b1bf30 41a825e8 3e48405f 3f3d0efc c030a387 405fdd04 3fa25487 3f000000 bb141adc 3c6811d7 bed1f1c4 3e47984b becf3eb0 c03e3816 3ed168c0 c0cca5ac 3f1dc9a0 40af4cb6 bf860984 3ef05342 3ea195f4 bfcd8373 00000008 c01c3e0b 3f8d234f -> c30deb7d 42928537 c306a1a6 410499af 4957e1d1 49b773f6", + "c1b10d86 41a0a6ac c1ddcf0c 3dfc30bb 3cee6825 3e48f7d0 3e7250a0 3e1ff8aa 3ca3d70a be00b574 3f4abc2e 3f24a953 3fdc6da6 be3e064c bf252158 c09c0ccb c04eae1c c0dc0d98 40323924 3fe8b228 403b8b83 bfc1daeb c02bdae4 00000008 4017da02 beca84f1 -> bf5ba05d bee48bdf 3edd154d 3f53b614 442578d6 3c5aec66", + "411ec370 c145d27c 4208ced2 bf88be4e be2d0d9e bf1a28b2 3fa045c6 3ce8abc1 3f000000 3c5960f1 422ef127 bf58352e bf48e90f be4e879a 40641170 c0a5cdac 40ad2e06 c086af04 c0c40af6 c0431922 c0054415 3fccd579 bff33b7e 00000005 3f70de56 3f85e0ff -> 3c664f30 bc2ffbcb bc8995ee 4093e0c1 3ca733bc 00000000", + "c1a41334 c212a9ba c1d73489 3e48fbb2 bf8bf89b bf054c8f 3f9d0d3b 3f001d97 00000000 bfb18964 421c0d09 bf7292a0 bebab488 3efb3913 c08cf84c c0a0b146 40ac8146 c0887542 be450cc0 bfc92d30 bfd6ba01 bfb600f0 bfef49d8 00000005 c0266889 3f88cd91 -> c2fc3a2c 4320325a c2fba4cf 4082beec 4831ac90 3de57502", + "423dc6e8 41445c24 4198394c bdd17054 3f18f21f 3f8e7bd4 3fa6dac4 3fe6d836 3ca3d70a be80453b 40f00224 bf6dba76 bdc61d84 be90c7e1 c0fd6411 408fbaa0 c0cab49a 3f24f2b0 bf76ab28 c01f1976 c03bd27d 40138e3b 400806fe 00000008 bf477940 3f978968 -> 3e799f63 bfab746f bd978761 413adb2a 4091a11e 00000000", + "411fe358 421199ca c1f64dfc bf648f7c 4006e3f1 bf70484e 402d70aa 3ef1bc73 3f000000 4060b792 3c51ef4e bed16128 bfa055cf 3f1abf58 40be0552 c0dafba5 40ba4e0c 40127fb4 3fef9bf0 3fa8b2b8 3faf05d7 3fdf73a9 c0298a19 00000007 c009b3e4 3e6f1e20 -> c2957009 c36e9035 42e64af0 3f8f43f2 4c0eaa00 4c3d89c8", + "42067dca 3f6da340 41efd84c 4001f727 bfbd2a4b 3fbed4a7 404c3232 3f0a2b14 3f000000 bc86ebc1 3f25d1c1 bf9f1d1e 402d1d75 be183aee bf3ab740 c0670742 40b24b16 4025587c c0de86f7 c0bb56a2 bfdcf734 bf0fc968 3e482a9a 00000002 bffc1ff4 3f0a8f95 -> bb97cdd0 3d88b2b3 bc21748c 3f82ab2e 3dd769c8 00000000", + "c1afc628 41db8b98 c23f1c7e 3f86e2b4 3f163eda bfd27f9f 400a3f3e 3f9a707e 3dcccccd bb574b28 40193250 3ea7e9b9 bdd9892b 3efeb299 3f4e3930 c0fbf211 40930e4c c01a2824 bfecb0dc 4097dd90 bf43998d bfc012b0 3de7aeff 00000003 3fb56df1 3f34857f -> 3bad6df9 3a41f180 bbe11a87 3fe7d6f4 3a8fb5fa 00000000", + "c2213bb6 c1e0e03d c1f111ad 3fabe695 be6e72d3 3ff01418 40146351 3f274817 00000000 3ec4c9f0 4012f0e2 4026ad78 3f255d47 bf0cb7d9 c0bfeeab beb06ca0 c0e3e2bb c0dca982 bc8e7000 c06deac2 3fd0d71d c026f32c 3f568448 00000005 bfd9ba46 3f315845 -> bf3d91a4 be3b910c c0a405d1 400611a8 42e2cd50 00000000", + "4053bfd0 c2023130 41a3dacc 3fb615c5 be5301d1 3f0c6d0a 3fc4ed7c 3fcb331f 00000000 bcae401a 3fca3645 3eb54a82 bf591cda 40246076 40233f8c 40d4d24e c09bf06c 40a3ee04 40950fba bfadb15c 400f2a3f bf378c46 c01a95c0 00000005 bfcba818 3e9269ce -> bc83eae4 bc81cfa6 bb840e0f 3eed1a0e 3d14abb5 00000000", + "423f979e c06b2850 4220875a 3ec7acb4 3f1ad3be 3ef165c9 3f5ef74c 3f08226d 3ca3d70a be7ec92d 429565c1 bf841a9d bf4e4d2f bd29afda 407fdb8c 40a626c2 bf03b020 bf93f368 40a68ebe 408236aa bf23ee28 be48ab48 3f19c6ea 00000001 3f5af316 3f467110 -> 3ca382d7 bd1cd072 bc3feff7 3e90bea8 401cf7f5 00000000", + "408bc148 42000906 c18c6134 bf94df64 c0125e33 bdcb9a95 402454da 3fe8f76c 00000000 3bdce0d4 42b4064f 3f17d9b1 bf2b7c2c be6669c1 40d51372 4097d964 403eac74 bf27ab40 40f1342c bfbdccc4 bea650dd c02628c6 bfdc298c 00000007 bf82df8c 3f33d9c0 -> bc3da1ec bbbcb9ea bc5a8d6b 3fd3fe31 3b941b61 00000000", + "c2458b67 bd7ce400 4107f9e4 beae2f90 3f7b7195 bf9fd3b3 40267817 3ff9f55d 3f000000 3cd8fc0a 3ce92964 bfa7835d bdb91727 3f69ab59 40e79b9a c073e1c4 40c4172e 40998622 c0665d56 beb36e70 bf443343 400c11dc bfad9f12 00000004 c02953e7 bf4ab08b -> 4079da04 3dd951c8 c01e1500 bf409ee7 461c3cbf 454c2269", + "c2120b1e c0ef4580 c194c533 bfac1582 bfa8fe84 3f908f26 400ff61b 3f0699d9 3dcccccd c01b8f0d 3e238855 bf674428 c0068408 bf2a5bcf 40d3231c 405bc520 bfdb0f84 bf111298 3da13300 40197c1c bff8c25c 4034d6e4 bf6d8190 00000001 bfe10307 3f65b2f1 -> c12e7358 c1ca4449 c09dc8b2 3f73424a 464964a1 43cd9f3f", + "c031e8d0 4130b434 c202229c bdfd5cb5 40037d57 c005c1a8 403c2d6a 3d8eca00 3dcccccd be1203b7 3c70fb97 bf8dfa3e 3eb0385a bf2054e6 3fc96690 bf45ba48 c03f3a60 c0bc8ea2 400f74d0 4006fb2c 3ff97831 400ffcc1 3fd25adf 00000001 4006fc96 bf462aad -> c048df51 3f6cbe9d bfd69394 3f73a9c2 45a36c5c 437c2bd4", + "c10503ac 4204640a c182165c 3eda129f bfe7aa4b bed27596 3ffefdd4 3f610663 3dcccccd 3b21c203 3f0d93ba 3f661ab8 bfc50e75 3fdfc371 c0aeb42c c04cc09a bffc162c c0f324bc bf5a7028 bfd0c3cc 3e93287f bfc43ddd bfa09eff 00000003 bf459bf2 be085bc9 -> 3a288521 3ab7dbc7 3ba7bcbf 3e78b5f8 3a15d0b5 00000000", + "c0a32680 41ec9d28 4247ba34 bf2cf583 3eaa0ec8 c0086aaa 40126026 3fa9fd8d 3ca3d70a bfe6f845 3c62123e bfc887f8 be9508ca bfecc666 40f0c276 bfaa07f0 c04ca5fe 40184624 3f9fa628 4050c994 3e3906a0 3f86443b bff6d0b2 00000007 bfb1644c bf8073ac -> c47aa3a8 c330d2be c49371c9 3e866ddf 4cbf6f30 48351954", + "42231636 40abfba0 41e35188 3ea51426 3f426e09 bd3f7306 3f5446f4 3e0ed7fd 3ca3d70a 3ec66c23 3ee7e223 3ed7bb1c 3ebf41b2 c0237d69 40f0f330 c0a6b382 bdc5bc40 c007d0fa 405be880 40f62f6e c03a9a13 bfa6b44e 3fdd80ed 00000004 c0122838 3ed4342e -> 3f5a2d78 3f4efd42 3f4e2afb 3f98b965 44307775 3ce2a6ac", + "c21e226d 420c26d4 403a7600 3f987e2f 3f78b8f3 bf032c5f 3fd09f45 3ef13924 3ca3d70a 3e04c347 3dcc98dd 3f76adf7 bf504475 3ea68622 40fb4a4a 40ad7af2 402a3d50 bec6ec90 4024e9c4 3ffb2560 bf3dbb71 403c32e4 4025bfe8 00000001 4010f424 3efaee93 -> 3da33db1 3e560006 bcb15928 3f772bc8 4290d45b 00000000", + "c1c33363 41b1ca50 41885658 be72c714 3e55f01a bf810f9e 3f8869ba 3ee86415 3ca3d70a bb910d39 3d055447 bf0377bb bfcaa426 be4d9ec3 bf1d0370 3fd37980 40d17abc 40883636 c069d9ce c0c4f35f 3f1ee87c c039f4ea 3fc32681 00000001 bfc7d71c bf81bba9 -> bc951803 bd9951f0 bbb7bcc4 3ddff510 3f546da3 00000000", + "c1d718e1 41f78200 bfcd5b40 3f470ce0 3f7a628f 3fecee7c 401013b5 3f658fde 3ca3d70a bdc2701c 424b20e8 3e99efd6 3ede2322 3ea20be3 402d28cc 405128f0 40c8550a c014598e 40bf7124 40feb9b6 bf77bf01 40071465 bedb6157 00000002 bf8044b6 3f786a24 -> bdb50b4e 3db9dfa8 bd27362e 3fb71f5a 3ece3e43 00000000", + "c2099819 41364e10 41b84738 bddac114 c014084f be45a3fa 4014b444 3cc633ba 00000000 be7bd38e 3fa75586 bea779b7 c00f9d56 bf2bf5be c0f16228 3f4d4340 c0cdea35 bd9f7880 bfe16824 c086c1cc 3f230d1d 403a7e7d 3fe7e947 00000006 bf6e2c2c be35532c -> 3ec63516 3e863340 bf9dde43 3ecce24c 40081933 00000000", + "41a2c848 be7feb00 42410d0a befca6d5 3f19e543 be244aff 3f9143e4 3f2e783e 3f000000 3ba5d4da 40ba37e3 bf71100a 40033d31 bf552a28 409e1cc4 407890f4 40db0428 c0b62ef2 40fea7d6 c0127bf6 be4ec094 3df24f08 c030906c 00000001 3f0a8748 be558e01 -> 3c50d233 3b0d3201 bbcdf889 3f6a78ff 3a4a945f 00000000", + "41fa8888 c1ace9da c23d13d5 be83d76f bfa412e7 3f7d0264 3fd44f65 3f7c7144 3ca3d70a 409df318 3d12aa82 be6a40c6 3f472266 3e21fd04 c0f6486e 4089d62c be374f80 409224da 404b08d0 c07110b0 401fbd77 bfd8519e be9064f3 00000002 c00acc84 bf0b9cac -> 430d1d06 c401f65c c2dc1a74 3f0e413b 4a661018 4515e520", + "41bb4034 c19cb20a c22b51e4 c027ce69 bf602661 beb76cb8 403d958d 3fdfc78c 3dcccccd bdfd5c62 3f05ff58 bf44d503 bf2d73a7 bd874210 c0afd3b4 40951636 40bc3c2c 407c1680 407c75a0 40b17308 403e7453 beabc6c7 bfb09e9a 00000007 4003a0e7 bf98d243 -> c294bf6e 429b6251 422dc110 3eb81a74 477b2d3c 459eec96", + "c23a3442 4247fc6e c204a66a 3e6fa6a6 bf10abd2 4015bfc6 401ac804 3ffe7cc9 00000000 3a83877b 3e13a65e 3f013601 3db4d3a1 3ecd8a49 3f936fa0 3e024bc0 bf7f3930 3ff3e788 40729f4c 40d033a8 beb13dbf 40217a64 bf800c4a 00000004 3fafdcac 3f88e973 -> 3bdd28a6 bbfa59fa 3c99ef52 40321f86 3c9412ae 00000000", + "c20bbb12 c0724e60 41e8da1c 3dd462a0 be0831b4 3f91261e 3ffce425 3fd44a9e 3f000000 3d9b447a 3f0d2b9d 3fa55223 3ff9b414 3dfb7b2a 40c8b3bc 3f9f8958 40f647ac c0fe9997 40b316a8 40e3a67a 40198d0c c0310424 40256b5b 00000006 bf1bed42 3f4bf5aa -> bd33ad72 3e4fd0b8 bd860c99 4036e175 3fba30ac 3f1858e6", + "423cd182 412a9448 3ffd54e0 bf3aa1f1 beb5f0a1 bc5ec628 3f6e1171 3f981494 3dcccccd bd810982 414c9cac bdcfe1fe bf2355f5 3f48c676 c0d16b6e c068c848 bf2bdc70 c058480c c0ba91b0 3f57e1c0 3f0d74b0 c02360ea bfd7aa04 00000008 3fb56f6a be5816ca -> 3cea206e 3c591645 3b17e982 3f409037 3e14f81c 00000000", + "403668c0 c1529be0 c1c4cf08 3f17edd5 bfacaec4 be515fd5 3fc65385 3f1d5503 3dcccccd c082f3a9 424ce35b bec23fcb bfe5c607 be68ef17 40b3bfea 40ffa144 c0a679e0 bf491798 c0f1a11e c0ea43de c02a5889 bfeb7521 c0045995 00000006 3f1c1e50 bf87598d -> 411158a2 c0465f35 412fb56f 3ebcf11c 44bf1e57 41a50482", + "41ff05f8 40eef330 423e9f06 3f94e61c bfce203d bf1c1e1b 4005e728 3f355ab8 3ca3d70a bfbb5702 3e86ac2d bf1af3ba 3e36fbfb 3eb4edd7 403b639c 40a3cb0a 40fd65ca c0857cfe c00c19f4 40d756c6 3fbe79c7 beac7a96 401b7fcd 00000007 402c7941 3eca9741 -> c12b2e60 40de3953 41a02488 3fa92ddd 49b5851f 4504a2a8", + "c2081236 c22f0ce2 41be72d4 be766201 be92a88c beec84b7 3f8ea784 3f8522e4 3f000000 c06bca79 3e993d9e 3fe4ed16 c0134dbd 3ee1a380 c0d107ae c0bd2894 c00ce5d4 3e84bde0 3f0b8410 3f61c690 bfa2829b bfcbd6a5 3fb9ab08 00000001 403a4227 be9bdf1a -> 4185a550 c17ce0b5 416e4db4 3f610379 4603bcd3 43e10866", + "c22e48ed c1e79f94 c0c16370 bfd29ce9 3f9c7fd2 3f431d56 40105811 3f2eee17 3dcccccd 40a88d6c 42c46d09 bf70f7a9 bfbf6845 bcc53b6b 401b1658 40cf2624 409c0214 40c77838 bf9984c8 40c79260 c01f55ec 3f1074f8 bf9e40a0 00000003 4001ad83 3efad906 -> c0602a2e 4016639a c1ad28f0 3f8620b1 462a3b57 440889ac", + "41d69a58 c1ffe54d 40db5d60 3e9ecf98 bf91770c bda28a1d 3f985270 3eeedd0c 3ca3d70a bd1cc74b 3fec4948 bebdd541 3e907e0d 3f485cda 40f846b6 3ff76f50 c0c95424 400118a0 407eff8c c02667ee c03765cf bff88611 403905c1 00000008 3fca16e0 beaa88cc -> bd9cc623 bda91322 3ccc5d66 3dbbda63 3e38231a 00000000", + "4063df20 bfe8bd20 41a4f3c0 bd604ccf 3e7bb9b0 3d13a5da 3f1b4866 3f344dc8 3f000000 bd3989ee 4152d630 3f497416 3f8c25dd 3f1519ee c0f15b4e c0badda2 40dea2ac 40207c80 3fcbd368 405af600 3fbb8bc6 403d1213 3f9ca8d9 00000005 bf989372 3f81d4bd -> be737f54 3da92dbc 3e3de229 404335c8 3f6427cb 00000000", + "4200bc86 c007cca0 41f7484c 403b58f3 3c1166d6 3efe6880 4048b15e 3fd54b2c 3dcccccd 3bb87d52 3fae160d bfdaefbf 3f6e6a31 bfd9d9a9 c09dd1f4 c0ba85b6 bf95fa04 40be700e 3fbcae78 c0c36d88 402a3077 402e7f15 4017b376 00000007 4018598e bf6bdf0e -> 3eb34ee2 3f7a783c 3fc41b28 3fa4eda7 423070c8 405973d3", + "bf870120 c20c2b89 c13e4bf4 bf61632e becbe2e4 400ab23b 4019127f 3f72aae4 3ca3d70a bac58759 3cc47cbb bf8b40f3 bfd2c732 3fd39cc4 403b9f9c 40ee8be0 409e3a22 c0c1f092 bf8a8ebc 40eb463a bf7de81e 401af927 bfcf70d0 00000002 3fb9aed7 3f055b03 -> 3c222d72 3c3fd32d bc0e801a 3f81a04a 3e54a178 00000000", + "40ee2d70 4193ad48 c10c3fd0 3f034d3e 3f338bfd 3dedb647 3f60691f 3fc28a75 00000000 ba8326c1 3e69e935 3f62f1d0 3fb5fbf1 bfc0a9d9 c004e3c0 bf10d450 40c72b68 bdb87940 c0c0533e 40414570 bf64385b bffb50b2 bf830fa7 00000003 bfdd6c9e 3ede9ff9 -> 3a30a30a bb881efa 3b10da06 3f996a62 3aed1f25 00000000", + "422f33f0 42191696 420a544e bfd24655 bf735d08 bee08c31 3ffde779 3fe3ed21 3ca3d70a bc95231e 40bf94f0 be5dffe0 3ff79e7c 3ee60514 c0e94a88 40a5b96a 3fc3fa70 409d1d06 409efc3c bf2e75f0 c0383c3a 3e2485d9 3fa418f7 00000004 bf86a17c bed5b99d -> bc029dd3 bbba19a4 bc2b1b98 3f57551f 3c4c5d81 00000000", + "422d5658 c129f3a0 c00419b0 bf8bc7a0 3fb68e9e 3f5fc09d 4000d913 3f47bafa 3ca3d70a 3d6c5360 4110ef14 3f6614bf 3e4a2da5 4017a113 40e7f7e2 40e0888c bfef4658 3fc91c80 bfc22b54 40a4dd00 3f65a8e5 3f81596f 3fbc97c6 00000004 bfdde638 bf889eb1 -> bcba6190 bf12f92e 3da6a680 bee619a2 40847d0a 00000000", + "c18ec486 c1d0e741 c2021e2f bf155271 be2305f4 c0016d23 4007e6a5 3f22c000 3ca3d70a 3eea9899 3f502447 3f9be9b8 bc8bea82 c0217138 c02c7ee0 40daeacc bf9df588 bed76b40 3f466c80 3f4d0120 3f91c6f5 bf2621e7 3f0a6238 00000003 c01d450e bf8e495f -> 40d8bc4e 3fdaa46a 408a9d48 3f753c55 4466e8d4 3f8c0100", + "42143d40 417443e0 41b8ab5c be8d4a6b 3c396f92 3bd55cc5 3e8d72e2 3e4a9a44 00000000 3acded64 3da82838 be90f6b4 bf6c6564 c009e0eb c05e34a6 4083435e 403a0030 c0afb266 3fe0ab30 c0e7673f 3dfb8665 40276f46 3f3318f8 00000006 c002e1dd 3f08beb3 -> bc997612 bb9c2e1e bd62f21a 3fc148ef 3f74011a 00000000", + "41fd555c c1a019df 4080c540 be610fa0 3e8511e3 3fd467bd 400ca14c 3f80dd84 3f000000 3f0589d1 3dce81c2 be05ca38 bf065133 bf096667 c0ff7b8a c0a60f24 407c18a0 c0813e9e 3fd56dd8 c0d707d1 3f9b074a 3f52786b bffbe45d 00000003 3fccdce4 3deb5089 -> 3f3f02d4 40a08142 40961e1b 3f3efd62 45008631 44bcb8c4", + "c0854798 41b1e17c c17dbaf0 bdf70a3a be393fd2 beacf065 3f040d46 3f92136c 3dcccccd 3d6d5bbe 3d9da3f4 bf9c0c7a bee538ae bf17353f c099d39c c088b3ca c0680334 c096af48 c0ddc8ff c0fa4f43 3fbebfac 401bc897 40032d1c 00000006 c01a84dd bf45b19f -> 4185d489 412d96a0 41569aec 3f8558c4 47925405 42f007c0", + "40260090 c09e1f38 c200467e bf08c9ac 3cbeabcc bf35a424 3f80969e 3f94901c 3dcccccd 3dca2f4f 3e22b911 be30bbec 3f019ac7 3f5303d1 bfbabdc4 409c0384 4046476c c0afb7ce 40f0a542 c03291d0 3f8d3194 bf98b27f c0320a25 00000007 4009fbae be96c5c7 -> 3d1fe5bc bec294fd 3e2d365b 3f12ac94 43e9040a 4010ca32", + "42094590 c2281d8c c1d54f09 3fc76dfd 3e44f52d bfdd007c 4018ff98 3f11fcf6 3dcccccd bbfebca5 420c6f94 bf37a4bf bfb4a3ed 3f6ad10d 3e617a00 c01b488e 40cf251a c02b291c c0b49af4 3f0b24f0 c0174fc1 3f0c0025 3fdef72c 00000001 bfa33801 3eb47537 -> bc5c4702 3c827fc1 3c472633 3f24decf 3ac71fd4 00000000", + "c1a1b19c 41605d20 4235e8e8 bf44583e 3fa82ca5 bcba5344 401fe642 3ffa1744 3f000000 c014b381 4040f656 bfae3065 3f1b01c5 3e8d2f74 40dd5474 40ccb418 40b8a220 3f007020 40bc23d0 bf440380 3f69c475 bed58421 c03b4245 00000001 bf580972 3ea4255b -> 3f9fd909 c08ded13 40827bf2 3f3730b8 439630cc 434c1837", + "42292858 c0876980 421206f0 bfc07646 bf8395c4 be8b225d 400d9067 3f3d9d20 3f000000 bd37c2f5 3d628972 c0070111 3f3c1611 bff7185a c0f242aa 408135a4 400d3948 406d5734 c0ec072a c0ab4ef8 3fb43cec 3f32bffc 3fbb5536 00000004 bf04c4e3 3f5727be -> be95df69 3db8729a beb91f6d 3fe3375f 423cbc37 41d2cc18", + "41038620 42065dfa c22cf126 3ec66ac4 3cd0c853 3fa5bb5b 3ffd6bec 3fa0ca21 3f000000 bbf7b4a1 4101741d bff2239a 3f5f0e6b 3faac588 3ed3b9a0 c047014a bf23d848 c08e4cad c0ff1651 c07fb278 bef19e58 c015199d c02eca9e 00000005 bfbf3b86 3e8e4eb1 -> bbe6b16b bbea74a6 bb52c4f8 3f5d4f42 3b9d1174 39ef6fab", + "41c4db64 420cb244 3fc61b40 bf30f98c 3fb05fa9 bfb6eee2 40130440 3ec7a71a 3f000000 3bb95f78 3d26224a 3fd4b898 bf8eebfe 3ebe7ca7 400c5714 40374cc0 c08ac116 40f4f4f0 c09190ea 404918c0 401e7a4a c008162d be1edf8a 00000004 c00c6978 3f62b67d -> 3fb7997f bf712f64 3ea29730 403115e7 42da6921 42cd3420", + "c200abde 416544c8 c199fa7a bec20642 3f2efe07 be9c4c53 3f7268c0 3f8a0611 3dcccccd be97adf1 3d1c5fc1 3eef2aa5 bef23d1b 402d73a1 bf287c58 409f424e 4086916c c0c1c112 be82d2c0 40b5ea18 3fe286d5 3f8580ce 3ed85727 00000007 c01a75c1 bdd8581c -> 409889d5 c0792288 41b52781 3f6bad2a 46038a3f 4228f243", + "c196c191 c1e1e8bd 41faf76c bf659b4a bf11065f 3f78669b 401a20ec 3ff87922 3f000000 3d4aa591 42a725c6 bf974ef6 bfccada1 be33dc54 c0fe0380 bff59a88 3f75fd10 40de1112 409368b4 402a1184 c03fc74a 3f64382d 3f6374f5 00000002 bf6768a7 3f0c711b -> 3dbe19a9 bd81cd00 bd38c684 3f8ab59b 3e385db2 3d2134e0", + "4242d8f4 42131010 41303d38 bfac0995 be631508 bf6315d8 3fd012ca 3e257f3c 00000000 3e8a4fec 3cdf42ac 3e00a39a 3fbd69cf bffa3963 4012e154 c09bba6a c09601a7 4014f070 c0518414 4097d396 c034aa0c 401c7976 3f087d4d 00000002 3fc30870 bf47de0f -> bfd88ce0 c184ccc4 41b8a7e4 bc8fade0 4573b484 00000000", + "420ff00a 41d3a02c 4199c188 be9f46e3 3f9e521a bff68fe3 40380a1f 3f90bd6b 3f000000 bc9a7ac3 40f3d525 3e657fee bec1c4d7 bf0d4ecf c021b548 3e340c80 40992fc4 c0d85aa8 408b3f4a 40f3336e c01623ad c0129176 bdf5485a 00000003 bfee7464 3e996eda -> bcaad2cc bd13433a 3c5155d4 3f9d1a80 3d60747e 3d1a9cb1", + "415400e0 3fe8a640 420912ee 3e4d3a11 3e1f115c bd46aada 3f8a012a 3fd1eb24 3f000000 be380a78 40e4fee2 3f6d58e5 3f311b3e 3ebb4f85 c04519f4 40c467ee 40e22898 bfea2708 c04e350c c03a967e bffe09bc 3f8dfe7c 3fe20a19 00000006 bf1d6bea 3f949d89 -> be400e0f 3d74b99d 3ed08af8 40c97b64 4038e8b6 3d79fcc8", + "4102c70c 41f45a78 c18d9c62 beabb108 bf2207c7 401a3bb3 4020e6d2 3e8104b8 00000000 3b14a7cc 409b0463 bf0de2e2 3f30662a 3f5f73f9 3eaedce0 40dad914 3fe27028 bf95ff40 c0e426b7 c0e07f5b c03e7319 bf53a5ae 3eb5a9cc 00000008 3fb64f80 bf84bf18 -> 3d9e3262 bc5d9b0e 3d9efeea 3f08b31e 3d338f7f 00000000", + "c069edb0 c1d9a784 42113700 3ed6a6a5 bfa22e93 bfb797e0 3ffad416 3ca45b53 3ca3d70a c00c2e03 4113dd5f bfb68878 bee94476 bea751ab 40f43b32 4029532c c0c3fec2 4080fede 4053ece8 c06a3152 c0311c0e 3fe867c3 3ff052db 00000001 3f7589c4 3f95f158 -> 3efaf314 3e48a7a9 c01661a8 3f6ccf51 43857860 3eca859a", + "4155e1e0 4193bef0 41913b68 3e89e493 c01c9020 3f8c34ea 404f43e6 3f8b70ac 3f000000 bfa10ff4 3d14d576 bf12fee9 be7bb656 3ee466eb c0e9b53f c0d80358 3fdae500 40386eec bfe62e6c c0acd630 400902d7 c01bb1b8 bf8d444e 00000002 40381a36 be66c8a0 -> c269443f c1afdb21 423afed2 3f502f17 483aaeb3 4838dd14", + "c18c2c30 4213f24c c23ee667 bedae7b9 3f8f6c93 bf2643d3 3ff28230 3f87ddf2 3f000000 40145aef 3df4002f bf227d52 bf1ce43f c005bd3f c0348b4c 3fea53d0 3fb83b10 be17a2e0 be79ae80 402caeac 3ff51a38 3fa9926c bfd2cd69 00000006 bf8ed37a bf049bd5 -> c0b3ee77 c126d354 c20535fd 3f224e46 47570f87 4636585f", + "c20841de c18cddde 41af1688 400ef975 be2acfbc beb03f7f 401bb070 3fd4add8 3dcccccd bc29747b 4226bb4b 3eb9ae5c bf238da5 be157fd7 bfd60b54 402c7b34 404fc260 c0e2598a 3fee6e28 3fe699a0 bfef869a bf2cc9b2 bfd1aa4d 00000004 c0392fb7 3edcb01e -> 3d23e030 3cd18c8c bc24400b 3f5a0ca2 3eb59d18 00000000", + "c1f6bdae 41704400 c20ddf2c bcb8f611 bdb629da 3e5cd2aa 3f4070d8 3f8471c1 3f000000 c07e1d61 3d82ee23 bf80a85a be1b4c87 bee82870 405bc35c bfcfa370 4055b430 c066d91e 40c54884 40690bcc c00313d9 bfa74b59 401ed56d 00000004 bf8ee446 bf582351 -> c38fb142 c222f40d c30a199e 3e089150 49629359 46239dda", + "42188056 c1c939e7 422c7f70 3f8cb81a bfeec60c 3f7fa9f8 4018ad49 3c32a067 3dcccccd c10668ca 3d0f6bd3 be084942 bd861d20 3f0108c0 3f664200 c0c1de1a bfe7ffb0 40819570 c085c65b c0e6c649 c02faf3b 3fba4069 3f5b976b 00000003 bfb467bf 3f2ea054 -> 42451398 c1c3a214 c329963e 3f67e1d7 4b4cd140 488f4957", + "41a50924 c0f20390 c214f079 be21929c 3d7626b5 be951253 3edb60b3 3f6b4506 3dcccccd 3e2cec28 3ee27d8a c025b4b5 3f2cbace 3e8ec015 403d151c 40807ef8 bfb208ac 408d0722 c069340e c011fc4a beac70f4 c0198398 be693576 00000005 bf4a2d3e bf47c07e -> 3e52d4ea bf06bb65 bee07cb7 3f9c8e89 410687d3 00000000", + "c1f89cc2 c1f80bf0 c1991238 c00c5ca0 3f212e08 bf109034 40166fdd 3e5fe880 00000000 3ad9ecc6 42900389 3ee1c2c1 3f560816 3c80f6b6 c0be1092 c0bb6440 c0667a1e 40da4930 409cd790 40cf3d34 40003de4 c02abec7 c0278f4c 00000002 4025f3df 3f367373 -> 3b7e64f8 bb04cccf ba508f2c 3fc21e6c 39fa955e 00000000", + "4184b7dc 401a6950 c238b14d 3f644082 3f904daa 3f404fa7 3fcf9758 3fd918d3 00000000 3f8de33a 4002b066 bf597c26 3fb6f8c6 3e09a83a 4039cd28 bf97de40 3fb7ee30 c0d3892f 40eff156 c03d2324 3ffcb335 c0277509 c0142959 00000005 4014f23e 3f8738e4 -> 422bf85f 422d3be1 c2a1bea6 4081414e 4702fc16 00000000", + "40ac6518 c20bc007 4246c90e bf3ff4a3 3fc95cc2 bf891061 4002e7d3 3fdcb91f 00000000 3f43ad75 42928f93 3fdc6638 be7f60b2 bf405c2b c064c5ee c0a057ef c0fb5e82 bf91501c 40aab4ee c024b7ea c0324165 3e6d5a9e 3fe448ea 00000005 3fcd82a6 bf8d935b -> 413b086e 420a41e4 4173437e 3dae1768 449919f4 00000000", + "c21b5bd7 c202438a c1e10d2b 400c423d bf05eb5e 3fe6136c 4039372c 3f1635ee 3ca3d70a bf23b53b 420a551b 3dd9e3f2 3fc29635 bfc8989d bf99b1c4 4095f7c8 c0c59a01 c0c9a881 c08d6d63 c0a62f1a c0090daa bfcf51a2 3ee4bfea 00000006 402e4b65 3f379b33 -> c0062328 c1c5a799 c1caa532 3ff0f4ae 47e90f4a 43a97449", + "bd423800 c170345c 41875bc0 c016098f bf6cc6a5 3fb9451b 403b4c95 3f81d0d5 3ca3d70a 3e16e24a 4094fb74 3ea8c370 c02093a2 bf7646ad 40831abe c0b40608 3fbe0078 3fe86e78 c0d7f85c 3fc57cc0 40010b21 bf30f575 c00e7c45 00000002 bfd68132 3f28c37b -> 3de91632 3e364c98 bd2b16ff 3f9d3a0a 4001f925 00000000", + "c22bd2d9 c05808c0 40cd45f0 3e27b1a3 bcf975cd 3e811da7 3eaea98f 3ff90945 3ca3d70a 3ec83f40 3cc69e2d 3ee20625 3ef51edb 3f5d6a0d c0ef705f c08cf02a 4095a0a4 408827f4 c0d35d93 40adb96e c0005524 be770fba c025ae3b 00000001 40069b98 3eb1e550 -> 3fcdfe15 40423f18 409fab73 3ee75c9c 46623c1f 00000000", + "c1c67439 c22425ee c19d1da3 bfc688db 3fd98179 bd80b667 4016d28f 3f0ce3c5 3dcccccd be5dff47 4030d576 be82d672 bdcef25e 3ffc5fe9 40d127b4 40c239b8 3fb918d8 c04f9c18 c098870a c0db67ba c021e3dc bf055efd 3e308efd 00000003 c00ec91a bf0aa7d6 -> bf192eac 3ecbe6d8 beec51ae 3f2cb1a7 41e0cc06 3f9ef8a2", + "c1f243ec c1ce9137 41d098a8 3ffd7b9a bffd2be1 3e923531 403f86da 3fe559b6 3dcccccd 3dbf6fb8 41123ef9 3f256383 bf840ef4 3fc7bf6b bf0d7540 40e1ed04 402d6294 c0fca598 407696e8 3dda5f80 bfed56d4 c018934f 3f783f7f 00000004 403b60fe bf8e7067 -> 3eb411a8 c0bd1fe7 c0867f0c 3e4bcde8 43eb8fc3 41f94e83", + "41abdc14 415d07d0 3f969660 bf2891b9 bf564dd1 40272e23 40696cf1 3fd38845 3f000000 bccd8751 3c78cef3 c031ac6e 3f75a257 3f10327e c0557d9a 40840bf4 bddc7280 40811a1e bf5fee00 c0849450 c034bd1f bf520f63 3f7d6393 00000008 c003bb73 3f8cdb2b -> c3f03aa8 43374404 42ad3926 40c9f680 4b0d3eda 4ad75d5c", + "40b8dc10 c23a05fd 3fed78c0 3f78d649 bf92dba3 bf8eca4f 3fefa8a0 3dcff8a7 00000000 40263715 3f28aab6 be0b52fd bf50fd2e bf4745bf 40982036 bf9fac30 40035058 c0c1c61c c0b6d607 3f9db768 c00d45e5 bf91c195 40334e56 00000003 4003e1b3 be72b84a -> bfb95b45 befa1af8 c096ac1d 3f191e4e 44b23a23 00000000", + "c1e61367 41207fa4 41e8c5a4 3e887d71 bf1eddb3 bfb59849 402098f4 3ff02499 3f000000 3f460e9b 3d82ca92 c00ec4b0 bc6a5b93 3e918486 3f472fd0 c079f2a4 40c54066 c09041d4 400ab0f0 c0a7a9f8 c00efc60 40172009 c0180f77 00000003 c00e2aa8 be959c06 -> 421a1d41 bf7c7857 c08be5ef 3f372041 471034f2 4624a779", + "41ce21b4 c191b7f0 c18d649a bd5cf80b 3e91dbe1 3f2f5a19 3f3e6a27 3fdcd182 00000000 bade42d2 3c9a0a99 3e2aa7b8 bcfb6332 bf9df02f 40b075b4 40fecbc0 c0ec0022 bfbf0720 c063bc48 406fe194 402ba660 3f870a17 40256552 00000003 bfdb06ee 3f4cae62 -> bb2d0790 bbc7d950 bd5cebb8 3fe625a1 3fbaa7cc 00000000", + "c051c350 c226a55b c1274a58 bf7dbf36 3fc780bc bf5e812e 400afcc5 3fa6cae0 3dcccccd bd6ff458 41f68d4b bf089cf5 3f5df8b7 3f51b5f0 c0e2f76c c0e7936a c0247dbc c0f28000 c0cb5363 40084704 3fe988b5 4037ecdf bf2fbc48 00000004 c015189e bf9611fd -> c02d4392 c0933b3e 4057c87c be232118 42671d20 4029bd9e", + "41810294 c12620a8 c22ea73d 3f8ab95c bf19dffd beba2fc3 3fa551a2 3eb24fe7 00000000 bf00b878 3f8d253c 3ffe500c 3fb8d332 bfd36600 40ac2304 c00ccb3e c0e68cea c01edf8c 40ee9770 bff1016c bf0eadfc 400cec9c bfba371f 00000008 c02e6ba9 3f1d2faa -> c164c98c c1079c6e c1f998a8 3ff09ed6 4911265e 3d615673", + "41cd1820 c1d3ed1f 41436130 bddc2031 3f34fa60 bfe3551b 401a7872 3f7f7f79 3f000000 bb9ffc7c 3c6c2895 3e10bf90 bf73c204 3cb7a53e c0ec8071 4080fe18 c014ec94 be89ff70 3fff5558 bf827e64 bf275975 c01088ba 3f10ea25 00000001 c007b3d6 3f2f5926 -> 3d6e2a29 beb4941e bb0d4d2f 3f32e426 40cc4ad4 404f483a", + "418a7b1c c207d1ce c1686580 3f3bd880 3f8798c8 c0112e99 402800b3 3f4e0bcc 3ca3d70a bf8504ab 405e4808 403377c8 bf056635 bf2ab192 bfe3d63c 3fec44d8 4085f044 c057cbb4 4081df28 40e66e02 3fa7354b 3f7f9f04 3fbf382f 00000005 4026692c bf9883e9 -> c208e9e5 42333b5c c345a6a0 3fa00f3a 488d1215 443bb654", + "c22f47fa c0a19c40 c19fce87 3f499935 bd69f365 bfc0e8e1 401d02bc 3fc07ba0 3f000000 bec2535a 41ee2309 4029708c 3ea60eba bd7809e8 c089ed2c 40c8e444 c0437e0a c03f71bc 40971910 405ea168 3f81f385 3f8f972a c00bbebf 00000001 3f842362 bec4c173 -> 3de61d37 bf25844c 3f3be08d 3f6d682e 41003efc 4115593e", + "41271358 c2101e25 409498f8 3fbe7320 3e3c79fa bf5b6ffc 3fdd4367 3da86392 3ca3d70a c0a31b24 40275442 3fbae5fe 3c93a8ad 40087169 40174dbc 401f3bf8 3e439900 403d08f8 40f2a0ac 40073330 401887d3 bfa7d8fc 3f01e478 00000004 4005e36a 3e91f6c1 -> c0243383 408fe051 c09ab747 3f85147c 4601ccd5 41265d38", + "4230fa3c c1cf482c 40e82408 3ef91178 ba4762c4 be872f30 3f0db1ef 3f484bb5 00000000 3eb230a3 41426b0e 3e240509 bebc44df bf0ae1e4 c084609a bfd5884c c077b8f4 c0a7b7f4 c0a9fc66 3fcfbff8 4009aaea 3f0bc13e bf6711f8 00000001 c0024d7b be867db6 -> 3e7a69f0 3e726ff5 bdb75f63 3f351620 40409d9c 00000000", + "be88ec80 420c1962 3ec8af00 be861079 bde0456a be1632d1 3ea3932c 3fc239e9 00000000 400d8373 3e0432d2 3f991eee bd913160 3f68171a c062ae48 c0afd3b1 bffb2ee0 c083598e beabe7c0 3e3b5a40 bf9bdca1 4005ffa8 3fa4b50c 00000008 3f61d4f4 3f233fc2 -> 41f33b8e bfdc94c3 41c355b7 4010cf06 4639f5e8 3995dc80", + "4129e73c c1ad1da0 415cce44 3fbb7e0d c002cb36 bf011a6c 40261ee6 3fc78bf9 3ca3d70a 3f8ecdaa 3c2cd424 400f1f50 beaf7b79 3f948245 4056e80c 40e84dbc 40c976d8 40c8b314 40f55f1e 40e6195a c02ce8f0 3f63298c 3f450278 00000002 bf2b6348 bf5b7862 -> c1f8b3dc 3c1ee000 c19cf842 3e7f6708 49525756 44968ea8", + "400a1980 40ea07b8 c1b6b0b2 3f5b4a22 3f8fdbbf 3eeee1df 3fbe7ba4 3cb2239a 00000000 be1d9830 3cb9de6b 3f71505f be5b7c8c bec7105c c0014dd6 bf02a908 bf2f0468 40d3b6e6 40e04242 bfbd4f8c 3eea79ec 40337a94 bdf2d2fd 00000001 3f6f833d bf50c55c -> c11151f1 3fe21b98 40827c8d 3f2c3bc0 44a0fd75 00000000", + "c15b6f18 41e26ff4 41ab9414 be145621 3fe7e38b 3e8852b9 400991d1 3f201ba4 3f000000 3b6bb177 3d6a187f 3f8073b4 be3a6760 be5f0286 409189e2 3eba0ea0 40d0195a 40ef9e0e 40a5904c 405f77bc 3f9e61fe 3fdaf7e8 bfd3b779 00000008 3f91f116 bf6fb75d -> 3b807220 ba766b40 bbf99788 3e7b4134 4075c939 3f32918b", + "c1adb9c9 c21289da 411dcccc 3ea145ea bde8200c 3f025fbe 3f22dee1 3fab526d 3ca3d70a be7f2aa9 413db298 bfb7f07e 3e82bffd 3f986383 3ff30d58 c04e4548 c0a00eba 3fb2fe38 40d92de4 405e54ec 4005a51e be52ba5c 3f73cb97 00000004 3f1b749c 3e3500a6 -> 3c7f31ae 3ec8dc60 bd9bb537 3f897837 3fb49a23 00000000", + "c226432e c1a10579 4233da2c 3fb94e5e bf0b9ab8 bf848c8b 3fee4911 3f8aee2c 00000000 be0369f8 3fd20aea be8eb572 bfc4e70c 3f887d18 4097c562 409ee11e 408a4142 c00e078e bf0779a0 bfa45868 be21f2e6 3fb38383 be5a0e16 00000007 bf20b94f be6d7098 -> be557f7e 3ddf56be be73ad34 3f06e4f2 3e58ed59 00000000", + "c21b0e3a 40eeb868 c22234b9 3f898ea3 beb23ee6 3eb9adf1 3fa3c2b6 3f6df166 3dcccccd bb1991c8 4237f111 3e796cf8 bf272cc0 bfb3aa81 3fdbcac8 c07c2dec c0329026 40ca666e c08b7432 c0ec05c1 3fac4cbb 403f316b 3f2e024e 00000002 3fc99b20 3f59c664 -> 3b67d0da 3bc18ca6 bb157065 3fdcec88 39f18920 00000000", + "c2101754 c1b1e708 4110481c 3e7e996c bed26ca4 3e6658fa 3f233a66 3f893922 3dcccccd c11717c2 3e69ef93 3f540592 3fdafd61 3fec1e47 40b00fe8 c01745da c0a07c64 c0266eb0 401515a0 4009fd58 bee5e486 bfeb51fd c03be3f0 00000005 401e3d63 bf306021 -> c2904658 c20d4d78 430a1fac bd20ed88 4c158cee 46f4ed53", + "41fcfee0 c00829f0 c1ff32b0 3d6f0eaa becea094 bf99647a 3fa6ee98 3ff522aa 3ca3d70a bad30873 3c55fea2 bf51964c 3ebf2bb3 3e7dd637 c0441c16 4053ab0c c072d636 40d63858 c0bd3518 c0e93d31 c0326598 3f02a9b9 bfd93854 00000003 bf6d8d58 3de3d2a0 -> be379d91 3dacc438 3d6a8e83 3f57a028 3eac69d9 00000000", + "c1d428ee c1916639 42348622 be788dbf 3f45ea9c bf8b7392 3fafc0f9 3f43df42 3ca3d70a 3c53bc46 418ebf7f 3d5f52ba 3e057e61 bf04b9a7 bf2870c8 3f89d528 c0a24555 c0dbe576 c0e79dbc c090680e bfdc9d56 3fff3d01 c014328f 00000002 c017dd10 bf300b53 -> 3d1727ca bd39bf77 bc13d8ca 3e606dd4 3ca32e4f 00000000", + "c1c7a10e 41ed517c c185786a be86d413 3eda143a be3446fd 3fb5bbfe 3fe394ad 3f000000 bea17efe 3c807ef7 3f2308b5 bfac73a9 bf82ffb9 403f9ddc c0a7934e 40c38c14 c00717f8 40a92e96 40496af4 3fc93577 3fb12b11 3f08b0c6 00000007 3fcc62b4 bf533a73 -> c2d31870 435e53a0 43295374 be28ef82 4a61a9e0 48c7c6d4", + "c1ad06c5 40a3c080 4116ec74 3f068a05 c0089a73 3f30ab98 401921a1 3f631d05 3dcccccd bcad8ce5 404675b4 bffaf472 bc97d3f4 bfd3b4ee 40ad7de2 3faa19e0 befb05d0 40fb739c 408788aa 40843dc0 3e0fcecf 3ecc8f71 4013b732 00000002 3fdd608a be9afba8 -> 3cedc305 bda30e69 bcaf190a 3e5331a4 3cf496fc 00000000", + "c210359e 421c52b8 41f81bec bf10f75c be96efb6 3fa805d3 3fbbaae5 3ea571c0 3ca3d70a be81c379 4285dfe6 3fa5e027 3f594ea7 3f453c80 c0766db2 c0efa670 3f9959e0 40c005b2 c0b48dda 402e8cac 3f91990e 4031343c bf2dc575 00000005 4006cb90 be83f21a -> 3f1eb020 bf1fecb9 beacfa4b 3f1c6785 419d721c 3c333302", + "c15de874 c199303b 422bd976 bd93b918 bf6603f2 be38986d 3f836709 3f896696 3dcccccd bf1654a7 40c000ea 4022693d bf54962c bf5fe40d c0d40e5d c08e7010 c0750b22 c0ac5ef8 3f544c40 4096f8ae 4020536e bed5e297 c03bf118 00000004 bff2bf97 bf181908 -> bf6b2a5c bcf18a40 bff4c320 3f111f14 43a762bf 4026bb58", + "3efcf200 422ce730 421fe8e2 c03a2f33 3f35f611 3dc0a27c 4041fd02 3fdf446c 3ca3d70a 3c9d0a35 4097c439 3ebe601c be982a51 bf0cc9b4 c069a160 40a5fa0a c093ede8 409d774e c0ea3c2a 3fec3ed8 bf0d90ea 401914ce beee0810 00000008 3f7192f6 3f13bc28 -> bcb8c777 bcba9d32 bcb16782 3f948adc 3cc39039 00000000", + "c1b20093 c23fbcef c231f54d bf4c237e 3e10cdb5 3fc83f0e 3fe3727f 3e1cd38c 3dcccccd be42f56b 3d44bd3b beb30d97 bfa65144 3de000e8 c060c236 4015fb84 40b7a360 bf560da8 3fdc26f0 40e58ba0 bf02040c 4017ddc4 bfa1cf8f 00000005 c03438f3 bee61b65 -> c0e56e26 c1e7e643 4023a1f4 3f3c4e08 483f1a9a 443ae949", + "40d62540 c11c9ef4 422fbe16 3d85a235 bfad46d1 bf44f358 3fd750ac 3f9e5c1a 3dcccccd bbd77675 3c401297 bf9548cc 3ce63fd5 bfd3e4c4 40e13fde c083136e 40b66864 c02a4cc6 c0f58842 40d11aca 3fd62a63 3f83587b bfe05808 00000003 3f91a990 be94bdaf -> bf76ccdb 3a89abbd bfacb60c 3ef79553 41d48b26 00000000", + "c1ec8af3 c17888d0 bfc49420 3f44ea9c 3f8424cb 3f9dd470 3fe949fa 3fff6f37 3ca3d70a bb367dbd 3e306652 3f0a1704 bf6bb839 bf5a63e4 c0d5d09c 40b198f6 3f154dc0 bfe7edf8 40862d96 c0d94fe4 3e89aa85 c026079e 4002ab7c 00000001 4004105e beaf6439 -> b97329fb 3c939ff7 3c4f1fd7 3edf634c 3c0a2dd6 00000000", + "c1288558 c21aba46 c113a77c 3f5f759f 3f41bac3 3fe9aeea 400ffa85 3e36ae34 3f000000 be4f98ab 40f9bf11 3f80e8d9 3f13e8d6 bf11e049 bfb4ae58 40e367ea 408c1168 40856198 3f8cd798 c09a5452 3f1465f5 bdd79f97 c023fd38 00000005 c03313c4 bf9911dc -> c1834f1c 423b74a1 420cc609 3f199b66 4699b3fc 46bad0d8", + "c2194ee2 41b1860c be22e900 3e8edef1 bedab753 bfbda154 3fc88fe6 3f4213a0 00000000 3d9aeb74 404336e2 bfa7b8d6 400aa9d6 3ef26a85 c0c7f2c7 40fbcab4 3fba7620 40e07c76 40a5385a 40821f96 bf73a45e c0207068 4003d555 00000008 402e637f bdd5f2b7 -> bd4f2416 bcd69a55 be07eb64 3f13e7bf 3f13668f 00000000", + "c1da52a9 c204814c 41235b18 bf9486c2 bf86815e 3f4a2bb8 3fe298c1 3f58667a 3ca3d70a 3e131c3e 3f02af52 3fbc728c bfe217ff 3fa50efb c02c131a 406bf330 c0ca1b71 bfb08998 40e3a990 c07ceb76 3f92bd69 bf81faeb bf6c4b0a 00000001 c02fe12f 3e43a01a -> 3e9e6cfd be914f8f 3e8f9077 3f37c117 4024cb97 00000000", + "c1d28c78 c23404ee c22d59c5 bc8befd3 3fc95e1b 3fe4e908 404aa697 3fc8d64c 3f000000 3e573197 4268798e bf76cff6 c028cfee becc156e c0a26c7a c085525c c0e04b0c 40d50ee6 3dc4b880 403e43f8 400ddcb9 3fb17879 3f9d3047 00000005 3f9fbd9c bf7fd59d -> bfd34bae 3f2d1f98 beedbe69 3fa9fef3 420faeac 4252696c", + "c20db53a 4183c854 c20dcc80 3fca4c16 bcfc2ca9 3fb244eb 401a4de8 3f1bc58d 3f000000 c09848f8 419aa961 be6a2666 becb49c2 bed486a0 402b2580 c0802890 40c4f14a c0c488ef bf37f798 3f82b4d8 bf4d08e6 c02ea82e c02d9689 00000007 3f8e1464 bf3f081e -> c106728f c2040e96 4213f8c7 3f587768 45d9463f 45c4b932", + "42322dfa c2275029 414344e4 bff6ca86 bf957c1c 3fd1c46b 403b2bdf 3fb02961 3dcccccd 3f1aba86 3fb2a0c6 3e0e4f4d be63dfdc bf065f2c 3f864f30 c008b7a2 bd2caf80 c005dcd8 40e52e62 404418e4 3f40075a 40240fcb 3fe18acd 00000004 bfd74e6f 3f15fae0 -> c02cb6a6 bf338d28 40023f57 3ffcedae 434a746a 418b172a", + "41f5926c c1db949d 4218b210 3f0a0e27 bf6a03e4 3f62007c 3fe6962f 3f578660 3f000000 3d861259 3f2bd5d5 3e31ed58 3db4fcb1 bef134f3 c0842c3c c09158f0 409ab06c 4088cb84 bd217180 c0bccacb c037df72 c0374729 c0044d84 00000003 40229960 beaa1959 -> bb8e1048 3c9d7720 be7a9fdf 3f01cc80 40832344 40021e8c", + "c195ebad c0c43870 40741270 bdd0abd2 bf43244f 3decab29 3f4ef040 3fc4453e 3ca3d70a 3ec1c89c 422083ea 3ff3fb44 bf752d2f 40015547 3fad1de8 c0878106 bf0c12b0 40c6f410 400c3160 c0301ee2 c039b669 4022390d 4032662f 00000001 c014b9d2 bf5fd889 -> 3e6d1730 be84e20f beb2489f 3f6be030 406dfe86 00000000", + "c04e93a0 41e85d04 40ff7048 bffb9d57 bf8090c6 be949c1d 4016aa45 3e82b8c1 3f000000 bf368399 415c429e 3e3983bb c00f6248 be1e7e20 409a2422 400fd89c 3db22f00 40f10470 c0b878d7 c009bb24 402bb0c9 bf5f2557 bf9d5044 00000008 3f306bd6 3de3ec75 -> bdc79810 bd5dc635 bee705fe 3f7d3a50 41eee2af 4212b9b7", + "c1816d5a c23e9afc c22d8f92 be2401e0 3f9bbd37 beae8507 3fa3077c 3f7e8ae2 00000000 3d6a8368 4001e0b6 3ffcfb29 bfabb179 3d7c9ae3 40f7dcfe 404ef864 c09c000f 3f720fe0 40e45ac6 3f2d7360 3e94c3ed bfd30121 c037b69e 00000002 c03fd270 3ed8a1bc -> 3d4b5bde bcb662bd be0ce6c4 3f855bba 3eb64c9a 00000000", + "41e341cc 423875ee c236e2f2 3f5148fa c007c3ee 3eac3d7c 40141e06 3f4ef035 3ca3d70a 3c3423eb 3d5ccdd3 3deaa56f bf2d1ddc bec5c390 3f4b09a0 40c135b8 c0e32f7c c0834b20 c0887b58 409f7e04 40363816 bf358a7a bff9face 00000004 3fed529c 3f56042b -> 3ec8f4fc bfe3fc08 bf6b587e 40093477 428f664e 3d5ea319", + "c1a82414 41d9989c 415c7128 3fa49cd8 3ff979bb bef14008 4018bca7 3e5fab27 3ca3d70a bbf0e3cc 40133824 bf1940d7 3c403486 bd3ddd68 c0cc0a1c 40d33b6c c0c72010 c08cbd26 c0e1e443 3f32e340 3fcbc861 3f489190 3efca998 00000004 bfd2ebe0 bf418e7f -> 3c6e126c bd19e9ea 3c6b0d00 3d82bd74 3cae9cc1 00000000", + "405d5e00 42448d66 419434e4 3eb63650 bf2c29d4 3f2c299c 3f880940 3ef2320e 3dcccccd bba650fb 40a4b240 bf4a628a 3e817dc1 bf53a97d c096138c 409e88dc 3f4f1430 c0bc8a37 bf93a48c c0eeaa8a bfaeb077 3f123123 3f21ba7e 00000004 40208933 bef1d82a -> bbc8007a 3c8c01a6 3bba9809 bd985561 3cf4a0a2 00000000", + "41a33b10 41c2171c c1d7ad11 bf85d3d9 bf7cc078 bf485706 401f03fc 3fd8f20f 3f000000 bcf5771c 42720f57 be99d4cc bed356d0 be8b6925 c0cce9e9 beb35ea0 c0af92e5 40507ef0 be89d240 40d0f872 bf6332d6 3e4d8e9a 3f59bb19 00000002 40063cbe bf2c7d42 -> 3e0b7aac bd5c9d80 bd833aca 3d9b0f38 3e39a484 3d335012", + "421884f6 c243bedd 41ba50c8 3f5a56c0 bd116843 bf36a695 3f93a184 3ed11283 3dcccccd 3cf2d74a 3eedbda3 bfcc1333 be9becda 3fc75b0a 3f210f90 40eb3bcc c0d0f1de bff44fc8 c002b782 bfc4a960 bfa862f9 bf700761 3ff6e6bb 00000006 403e5d9e be96e194 -> 3e38b126 3ddc22cc bec9d8cb 3f4a689f 422f2810 3f19ddb2", + "41265a20 415df998 42188a8c c022d417 3f885d2e bf7ff981 403bc4ca 3f8a45af 00000000 be1d84c8 42666978 3f10cd54 3f6a8dcb 3f436504 bfe6e4a0 c02be40c 3fdb8100 40dced5e bfd5a978 40ed04d6 401cba05 401d7c1e be5076b2 00000002 bfd1067b bf88cd17 -> bdb17a3c 3ebd1028 bec0ab12 bc27e6c0 401554ad 00000000", + "c1a22c2e 41d675ac bf2ad580 3f89ee40 3e4f3fc4 ba8b1369 3f8f4a61 3f93671d 3ca3d70a bc9d1dc8 3d1f8fbc bf232a94 bfd15b16 3fa0245b 400ea160 4011e914 c0c7c979 3fd03240 c0cc4a90 40fadfd4 4038b4cf 3e196092 3f2fe774 00000004 40278a96 bf9363c6 -> bfecdb4c c0d0eeac 406dfd9a bc188e00 45ebb776 3f8ae834", + "c1f9ad60 c21791c0 40dc15f0 3f6306e1 bec5153c 3fb68a32 3fe071d4 3fc3b536 3ca3d70a be1610ed 41fde6fe 3f985603 3e21406f bec1f6f5 c0858bd8 40e3ef4a 40ad57a6 c08b31d4 c05b3828 3e4e6440 3e4f8209 4036d2da bfb6e2a4 00000002 3f2aafe4 be06ce86 -> bce63ec3 be05f470 be10c223 3f0ca5af 3f0f4a87 00000000", + "4159f3b4 c11554f4 421f5096 bfa1b748 bf964c99 bf78c154 4007d335 3fb67f81 3dcccccd 3bbc300a 426c6244 bf7997af 40269fb7 bed7a8ff c0175ad6 bf99837c c033440a 40827f54 bf9059c0 c0388bd4 400d7042 3f3f11fe 3f247e2a 00000006 bf73a615 3dce4932 -> bc17fbb0 bb501816 3a7ff013 3f85afd0 3a4fe0b2 00000000", + "c20cb7b5 40989250 4028d370 3e22ab45 bf84f571 3eba64f5 3f912591 3f8bf190 3ca3d70a 3ec0fa14 4188cbbb bfbaf502 bf67035b 3f442b43 c088b2e0 409cee68 3e93de60 bf3ccd78 40594040 40a5cf96 c01aa39f 3e6002d9 c035a12e 00000007 c02882ad be040f6a -> be2af283 be897b31 bf1fe82a 3ee4da6a 4203c2ff 3c23fcba", + "41cc6488 423fc49a c02ea340 3fd0638b be4cde75 be8f5a69 3fd98d17 3fe3e5df 3ca3d70a bdd2f002 42bcdc8c be6d007f bee6e80e 3d82f38b 40539724 c075e974 bff33074 3ea5b2a0 c06821b8 3eeb9d80 c02421b7 3fcf6cd2 c02aaa85 00000005 c0185e68 bf8b90c7 -> c0b0eca8 3fbe19b9 c11a4249 3f8ebf06 447b5469 3e114223", + "c1e6ab06 c2476b3e c0d1eb08 be5f69a1 bd57dd96 bdff7178 3ee9bc88 3fffa9f6 3dcccccd 3f73ec46 419c6314 3e55056b 3e36e4c1 3fe6bd3f bfe3fe14 bf72ebf0 406c94f4 40d69a06 3fcdd4c8 40bdeb40 400faa72 3ff70fc1 40193188 00000002 bfb647b5 3f948371 -> 3ff280e8 4008953c be7f76fe 3fdbc7cc 431497bc 3e25c6c3", + "41f982d0 41ca5848 41930524 bf09a164 bf25bc99 be8c8f1c 3f801b5f 3f940ad0 3dcccccd 400011a9 3e6e741f 3e965c98 3f398321 bf21e66d 406eafd4 3fd45428 c0bc7b18 c0ade870 c083e87a c0a6a1f2 3fbcdac9 4039373d c00c3749 00000008 3fcd711d 3f208551 -> c11aeefb c171bf61 41454168 3fdf3fcb 4893dafd 44b9298d", + "4213e936 c14921d4 423de094 bf162f1f 3eaf7c7c be99155c 3f3e0896 3f2be470 00000000 3c0afd6c 407a3138 bf9ff9d5 bffc0fca 3fe7bcb1 40cb8fa6 bfc0dac8 3dc65400 c0da22af c03268a2 bfad2390 bfd7f2e5 bf8d3a2e bec6acb5 00000001 3fe8b5ac 3e1df387 -> 3c6a0106 bb75969c 3bd629c7 3e4514ec 3b2aa01b 00000000", + "c16a350c c2322a93 417218b8 3c73a53b 3a6b69b8 3eb2ed0f 3ee604d6 3f7ea6db 3dcccccd bed06a39 3e448f52 becd8520 3f03945a 3f10df87 c0ca0539 bf95986c c0bad06c 4090ccc0 c0914424 3ffb2948 3f0c45e6 3fa29f93 3fdd5c21 00000007 401a5cfe bf347413 -> c0f30bc6 c1753bdb c23e40e8 3f2bf6f7 49c00f71 44cbb6b2", + "c2408499 423eb648 c1e4d635 3f5d7fd1 bf1344c2 bef74a5c 3f95889e 3f8f9eb2 3ca3d70a 3e493f54 413aa7a7 3eec6917 3e871a79 bece3dfd bfe07040 407550b0 3ea68540 c033007a bd8e4fc0 3ea04860 3f67ec7d 3eba04b5 c032ee80 00000006 3fae4c5a 3f5189e9 -> bf8e28a5 3ed7b853 bf660a78 40528333 41c3cf4a 00000000", + "418304dc 41e9d4b0 c2183157 3dea1c4c 3ee6cf13 3f03cbdd 3fb93faa 3fc0e385 3f000000 3bdefbf1 40395934 bf970daf bed22f92 beb31613 c0537200 c02a3d66 c0d1e0da c0a5a773 c0a4950c c0b0a7d7 bfc88552 c00d7901 bef650da 00000004 3f127ac2 bf4f4abc -> 3c487a0e bb08787f bca8ae6d 3eec0df8 3b0221d6 00000000", + "c208f3d6 41ef0588 41f700c8 bfaf68f7 3fd49e23 3efa01f8 40284dae 3f57e52c 3f000000 40c1549f 40252a24 beb2fb43 bfd18905 3fce5410 c063a24c 409dd52a 40e493e2 3fe88120 40810026 4092eff6 c006a9ba 3fd050e6 bfe4330a 00000004 bfb57eb2 bf8abcae -> 418b4778 41e7dcf0 41a65edd bf03adb1 4710fee4 474c1028", + "4209eb72 c1e02fa8 4191f07c c0205386 3d8613f0 bebfbf3f 40222980 3f82a55c 00000000 3ee726b9 3f110a3b be563342 bf0416ae bf216b49 bf88c854 c01d42a6 40fe7d0c 40b82620 c0874a1d c099ffa3 bf618d6e c02e441b bfd7712e 00000004 bfbbb600 3f8d6f6a -> 406e099b 3e356044 c089766c 4033f9dd 43b8c901 00000000", + "c1f1cd3b 4243a39c 41f2b388 c0044e62 3f4281f9 bf53a49a 40202d4a 3fc04a0a 3dcccccd c05212b6 4265eef6 bee86415 be888687 bdd6b352 bf3c3c80 40d88332 c08c20e0 be530720 bfab1818 bfc82754 3f72b0f0 c03f43a2 bf0fc33a 00000003 401f7743 3f48f6f0 -> 40944c42 c1ab12f0 420c0b1e 3fd28b9f 468ac177 444a1d5c", + "4213d654 c23643c1 41559bac 3f13fac6 bf9dfc51 402a0789 403f191f 3fb80e40 00000000 40751f00 3f0f4644 3ed3401a bee4e6b6 beaf08f7 c014db00 c09e3cbe 40c41a2a 40f6aa6e 408fbade c08ea5d4 40092deb 4033f9d3 c02b70aa 00000007 3f8cdaca 3f50d3f2 -> 4168e436 c102ed21 4153ee07 404bbf32 46047958 3b71bfc9", + "421b1c4a 4197b814 41244164 3f8cad88 3d92be01 bf36671e 3ff0e6f6 3f91fe99 3f000000 bfc772a5 413f3ba9 bf4bb6bc bf528b8c 3fa9c2a3 400d8da8 407b54f8 40f5c6ba c0aec372 c07049ba c09b3b87 bfcf4efa c02c4bca 3f8d4bd7 00000004 4005b4e0 3f6e8e24 -> c03b1484 c18740bd c153fbe4 402fadf8 463ba213 458858c9", + "42151534 42109578 c195be17 c002920b 3f44a94f bf5ca5c3 4017731e 3f8e102a 3ca3d70a 3ec581a2 3ea4b07b beeba22c c02b0593 3f8f0a80 c0df69f5 c095c94a beef4ff0 c0abf6f6 402d4a3c 40849186 bfa4894b 401cee21 3f1ba1aa 00000006 bf0d66ea beda3763 -> 3e4e3d9b c0281e09 3f22e524 3eeca174 42b1600f 00000000", + "41c8a888 417405f0 c1bec1f1 3f682542 3e965542 3dd9bfcb 3f758657 3f8dfd43 00000000 3b945321 3dc4671d 3e8f9abb bfd9f96b bfd3eea5 3f8784d8 406ec0b4 40c67aba c0dee19a 3fc6ef18 c036839a be6c7e8e 3e8dbb81 4024e023 00000008 bf6f1645 be3a5599 -> 3c612472 bd0d973c bc4e541e 3f2fecff 3d74703f 00000000", + "421d00ca 423b3ac2 420aef90 3f04c9f1 3f43b6d4 3f6ec805 3fabeec7 3fc27ff0 3ca3d70a c08e3152 401eb95c 3ce02357 bfbdb781 bf46be1c bf720148 bf8f7e00 3f17eed0 bda03b40 c0fa1950 bf714c80 c02c6c3c 3fa5dcb5 3f1a6bf4 00000002 3f062979 3f4a405d -> 410cc2f0 bfb29506 c0a420aa 3f838236 44a72135 00000000", + "42100c56 420277a0 40c806d8 3f96809c 3fb17fb7 bf03ce96 401a1f29 3f84c044 3f000000 3b00708d 3ddfae58 bf9665e2 bfaed904 bff5374a 409a631a c027ac04 c0dafae8 c030456c c063d114 40cbe896 3eb1f629 3fec8b22 bfb736c5 00000005 400b3a32 3f265888 -> bd91e7a6 bda7cd4a bde73073 3fced169 4016b51a 3fdbe910", + "41b870e4 4237f190 c209a0a6 3fa7a5dc 3f0c085d 3f971685 40011478 3fdaa457 3dcccccd c0447376 41399842 befcf508 3e801af8 bdb2c713 40025100 40e06f96 40bd4642 c0e8816b 4075d67c 4036fc94 3fd71798 4029eb70 3f8bb113 00000002 4022d4f5 bf20409c -> bfa4990a c0143ae6 c078ab3c 3ec50704 45258aa4 42a54e9f", + "4104ef28 c0db4188 4178e2d8 3e3ed993 bf608a18 3f15b4f7 3f9f24a3 3fdd26e8 3dcccccd 3eaa1e5a 3eacfd7b 3f5d938c bfe1b6fc 3ff0df2e c0bdb876 405a8d24 c0df0772 beeadb50 c0d4d918 c0bb2262 3fb2f9a1 beba0c5e 40327670 00000007 bf5b106f bf5ef043 -> be5e2086 be842633 3faf8891 3f056d66 430c6c70 3f91b869", + "41f00938 c1ad30d7 c21f61d7 3f69d1fd 3f783f44 3fa7e67c 3fefabc7 3e13d626 3ca3d70a c01a4000 41af5f39 3fbce4b8 40042f81 be4b809d c05a1140 c05f4028 c03240f0 c0f69156 c0e0102f c08a77ea 4008ae8a 3fb64d0f 402413c6 00000003 bfb389d0 3f801d81 -> 4015fce6 c0313cd4 c020be30 3ff7db23 450a5049 3fd0e246", + "40430660 4210255c 4124efe8 3fe5e82a bf233806 befcb121 40004482 3fe25abb 3ca3d70a bc8528cd 3fb38406 3f6d42d8 beb1bc5e 3f340563 3fc50680 40a36ece 40f6119e c0c5b813 bfb28dbc c0f4c7fa be88bb78 bf7323b2 c00131db 00000002 3f83227d bf787cbf -> bcf2aa7e 3c853da8 3c654ab6 3e87672c 3c285208 00000000", + "40845238 41bf0310 c1819460 bf81c686 3ff5442d bf1ea54b 40104caa 3f857fa0 00000000 3c1e5fca 3dabda47 3f368439 3f4fd836 3fceedf3 c0ca0aae bf557d40 409f9cfe c07f4d64 40a3647a 40e7436c bf21533f 3edce022 3ee755e5 00000008 c03599eb 3e8a29b2 -> bd8ee903 be05902d be54064e 3fa466f8 431fd509 00000000", + "c15dddc8 423b2112 c2098551 bff4134b bfffee42 bf80ff18 403c3964 3fa93416 00000000 3cd71ff4 42066b23 3dc97936 bf84670e be25fe4c 401910dc c0860ade 4078d9b0 bfc5a358 c0c8f2cd c0e2790f bf4b9a04 bf114f44 4029ee91 00000007 c006056d bf6f760a -> bfea207e bed82401 3f9b629f 3f342d4f 42df3d4a 00000000", + "c20cf166 4230d7d4 c05be2b0 bfea4e16 3f29801e bfcf0ecc 4038b542 3f35cc40 3f000000 bfbe5ea6 4188d738 beba2873 bef6561f bd4a4b0b c06ad304 c0f0fd0a 3e766e80 c0deffd6 40fa2042 c0897d34 4032df97 3ef552f0 4028fa0e 00000007 bfe5017d bf824735 -> 42012e15 c1b4e9d2 c2e1ffe0 3ebd1dfd 484f4e35 48b60f82", + "c05f4b80 c228765d 4200ec32 3d1926a5 bf5cc310 bee3bae1 3f7e2c0c 3f8bc45d 3ca3d70a bebfb26a 422dedac bb57fb84 bf179e79 beeb6c87 409c2dbe 40326d6c c02b4418 c0cb2ef3 c0cbaa4f bf13cb10 c02f0a9e c038fde8 40028c58 00000006 bfbde930 be554c11 -> be34c3ec 3ee37ad8 bf0f69ad 3f20e76b 4102ec28 00000000", + "41b509c8 422f82d6 bfd9c3c0 3fc83436 c0106a7f bf8e1bf3 403e8433 3e1c5647 3dcccccd bc07f681 3ca04f08 3f36d446 bf8759d8 bf82e73c c0691a60 c02e02aa 40e071f0 40ea33a4 c0b06364 4027e1ac be94e57f be24ff2a 3ef1abc0 00000001 3f4ab252 3f74f0f2 -> 3e884bfb bec286da bec7be35 3f5d524d 41201984 3f6c3158", + "c09c3aa0 c11a4968 41a4c5f4 3fe82933 bf952f70 bf3bda0a 4011c10c 3f966a6f 00000000 3b4e10d8 3d1ebe66 bf8ec049 3fe9e252 3fab4e77 40fd6fc6 3fb465d0 40b8a29a 408d3a86 3e6b9100 3e7b1f40 4018e85d 3f5b7f19 bebae0a6 00000001 3f66eaaa bf834931 -> 3da836da be01d65b bdb5ff3f 3f098c44 3e46dcb1 00000000", + "41ddaa04 4183e8c8 c1d012ca 3d7601bb 3f96891d 40058b76 401a723d 3f5c8d91 3ca3d70a 3cbe52db 40c2fc3a bf1eeb24 bfd4437f 3e941278 c0d5311a 40d8f84c bf22fac8 40dc3fba c0d3f707 40ca2f1a c01f2ae3 3fc758dc 3fc3c260 00000003 3fa1de7a 3e5b67c0 -> 3d130eec bbfe40cb 3b33a6ec 3f85bbb4 3c9c7e19 00000000", + "bf332780 42335d28 c1f0b69a bed9427d bfe1fc01 3ede081d 4002be98 3eb442b0 3f000000 be7ace3d 3e0201bc 3daf7b97 bf8c980c be2b8c63 40212a48 c0e60fb3 40e0eebe c0a61065 c0dc5f7a 408bb54c 3f52b7db 3f2c0167 3dd43f83 00000001 bf9c68f4 bec25c5b -> 3f2828b3 c063b65f bf497c34 3f28edaa 434f157d 433476c0", + "c20818a4 c1c20596 c14557bc 3f2774b5 3f150cd9 bf319ae2 3f909984 3f1f8819 3ca3d70a be0bdfe1 4158e341 3f99825c bfe2ce69 3e0a51c1 3ec38500 40f93dcc c04f8454 bf2ae330 40bfcef6 40a84d28 3ffc4c42 c00ecca4 3f828059 00000002 3f284ef5 bea22f6d -> bd38dd8f bd849180 bcd63ebe 3f1550c8 3efd091b 00000000", + "40e4e7a0 3de85a00 c16f228c 3e9d2769 bfa67276 3eee593c 3fd76c7e 3f0946eb 3f000000 3b7e603b 4195c3c6 3ea330f3 bf8bcb23 3e0c5585 40e99652 c0076416 406db390 bf652068 40e42f12 bfd9d25c bffaa28f c03cffe0 3ff9485a 00000002 3fb19775 be861b4b -> bb9e52f2 bb1fdb27 bc0d9678 3f1d341e 39f2d25c 00000000", + "c12fd5a4 c23dc797 c1d74b84 3db68ec3 3cbc0525 4028e855 402965de 3e9b12f0 3ca3d70a bc47ea8c 402c4f38 bf9890cd bfb66cc2 bfddba01 be6bd160 c0a01cc0 407d1920 c06e6378 c0b6da56 40e5edd2 bfc5ee15 c012f14e bec72e02 00000005 bf9138c0 3f36190a -> bd36f7b6 3d94f02b bbbb8fed 3ff80a47 3c730758 00000000", + "c21ddcbc c1e6aaf7 4098efa8 be97b15f bf3a05de 3efabbeb 3f6f3c3e 3dc2d971 3dcccccd bf0f9332 3cb32aa9 bfecdc9d 3f050341 3fc51fe2 c061a7dc be62aaa0 bec53120 c0c967f0 3f13b620 4085919c bf4042d9 40191edb 3e50d584 00000007 3fab4191 3f9667c0 -> c45582bd 4389a300 442c59ec 40f682a6 4ab755a6 46a63c7e", + "c0c47f30 c223a06f 421b7a10 3c2d6bc5 3ffbfd9a bfd567ff 405b402c 3fd89187 3f000000 bb0822f2 40f38feb 3f0a24e8 3d8e8e61 be91630e 409ae534 c011e10c c06277ec 408a2708 40a01eae c080373d 4037009e bec93741 c037ce04 00000007 3f194c50 be0a4fca -> 3ac60383 bba723f6 3ac43e0f 3f35c31f 38edc599 00000000", + "413f6a34 c120926c 41dcef90 3f23170d 3f069923 c0293e46 406a6eec 3fe480c2 3f000000 baca1979 40bb4442 bf6c30fd bf36810f bee0483c c0ced2a7 c0facd1d c0c4255b c0da80c2 c049a476 4081288e c0280bb6 c0194d4d 3e505c72 00000007 c0378306 bf8d77e8 -> 3ea31cb7 bf946d8a bef6020f 400f9850 42a75bd5 435ce415", + "c20a41cf 4205b35c c23b455c 3e9eae4a 3f972942 bf4df0d1 3fbdd3a6 3e55e2a0 3dcccccd 3d5e433a 3cac6360 3edcb820 3edd7c83 bef48cfd c0361ab8 40e5d3a2 bfedddd4 40ebcc7a be9de2d0 40ce56d6 be06c646 403bc73b c03efbbc 00000004 c01cb000 3ee75b27 -> bfbd0898 bfd4dfaa 3fea6822 3fc21a1b 4632b421 43645608", + "415b0504 c1de0a10 4087ce80 3f1709c5 4026c2b5 3f26763d 4031eee0 3fc3f2a7 3ca3d70a bc0e100b 3ec325e5 bf3283a0 bf26fddd 3f892c67 c0a20084 4096a308 40ddfcc6 4017df28 c0b81396 c0cb05d7 3f247207 c0336b22 3fbfa767 00000008 3f76bb68 3f82966d -> 3d0e5fbe bbfb8c9e bdffffde 40ca42ac 3db51604 00000000", + "c1ac6922 41e4f3f8 c122175c 3e516572 3f78e05a bf2b4fe8 3f9951d8 3e5fe343 00000000 3df982ea 402a64b4 3f73f622 bf4f3807 3dee7f30 c056b30c 40d3af5e c0d3547e c0cf4ebf 408e2e38 409f4d06 3fad72a4 3ff0ff42 3f33b0b1 00000006 3f126d28 bf805d91 -> beacba9b be8a490d 3d413b69 be554f1c 3f2f7c31 00000000", + "c227cdee c22b288e c22ffc98 3e57b3f7 be0c7768 bf8c2390 3fa8800e 3ec5b832 3f000000 bee0f9b0 3f625952 bf9b73e0 bf32fd3b 3f6f6e3c 3f861d00 40fdf8f0 407b45ec 40cea606 c0a35256 bf7ae098 3f500c6d bf8b3e35 bf871af1 00000008 c01168a4 3f1b5d8a -> 41392480 401584db 410b56ef 3fec19c9 476981bf 46a1105c", + "c22e3468 c1c04c8d c014f7d0 3e3f1313 be239c61 3e4f3dca 3edef6d8 3f96012c 3dcccccd 3fbcde70 40d7cf38 3ef39094 bf71843c 40040b09 40336014 3fb4ba10 bfc915b0 3db2a480 409b1cd8 40fde7c4 be0577a3 c0244f38 3f039ec2 00000007 c000022d bf81e8fc -> c22c5549 c31c8114 c2bbb167 3f5c9958 492fcc95 43f8c68b", + "c2447810 4235772e c2173d03 be3cef78 3fa2ba2b 3c8e4325 3fa802e5 3fb235e1 3ca3d70a c073b0a2 40478c4a 4018cb3a bfc0b161 3f0aba7e c0321c46 c03cb964 c003ee88 40441abc c0af0b9c 40900ec4 3fd6d952 3f932572 3f81d04a 00000008 4006b040 3ea2f733 -> 3fd099b9 412f7b82 3fb0d05f 3faa0bfe 46e08848 417f0220", + "c21cdce3 c240f969 41c8fa7c bf92c581 3e685eeb 3bc5fea6 3f998197 3fc24eb2 3ca3d70a bb07b0c0 4258d170 3e83898f 3f239a4c bed59347 c0cb4615 3f46d0b0 40fde91c c097785c 3ff4de30 40dc575e c017d84f bf9f0930 bfdd2fb5 00000001 401ee780 beea04cb -> 3876ba0a 3b249fe4 3b883197 3f31790b 38e34cdd 00000000", + "4214903c 4219c4fe c232eaa1 3ef824f3 3f04b49b be8857ee 3f90e649 3f3f83fc 3f000000 be42cc13 3e4b1e83 bfdfcf25 be5dafec bf0abf0a c0a1cea2 c04b2510 405c75e8 bf9f2aa0 c0d7eb07 c0c2de22 4013fff5 3ece6993 c018ef9a 00000005 bf4ae5ce bf62bc63 -> 3eefc2a4 be9b5204 bf20162e 3f00631e 42da693a 418c5907", + "41a75624 42280c8e 420a1a26 bf850577 3ee2f51b bd3b9ee2 3fa59516 3ea6c614 3f000000 3adf7ccf 3c76aa1a bfc5c2ef bfddbdea bfe9dc41 40daa5e4 40e3d2ac 40b46bc0 c0dd8598 3fc37868 3fbd6f48 40322650 3fe823be 3e962ea2 00000007 bfe0ba46 be7a40d2 -> 3ca3f8d1 3cf4085e 3ccc9335 3e4ceccb 401fab4d 3e24e374", + "40b951a8 41aac368 422c6000 40129fd4 3d12247f bfcdc10f 4034b830 3f9eeff4 3ca3d70a bce1f9d7 408ca779 3e665833 3e7a4d30 bfbce18e c0a0199a c0c42b0d bffbe200 402cf560 3ff24160 c0e0857d beaca4e4 401bc9a2 3ede87be 00000003 3fc2d6f3 be0f5e3c -> 3b9c6e4a 3d9e7c8a 3981f5e9 3f36764e 3cbd6544 00000000", + "becc4780 40889f28 c206854c bfe71bcd 3e9f9f09 bfb0a158 4013b43f 3f34a9b7 3ca3d70a bb6ac332 3d6b33a3 c030d9c8 3f5e14b4 bf19c4c6 40c6f0c6 c0ea426e 401fee44 40b9a2ca c0af6f1f bfd626bc 40337375 402dd93c 3fe53c10 00000005 3fd9f9b4 bf2de2eb -> 3f0559b2 be47a596 3ddffa08 3f36254f 40936aea 3bc094d8", + "422f0bb8 416c4240 419d471c 3f546161 3d7b094c 40017f58 400e2586 3fd53572 3ca3d70a bad5f983 3ecdd2a3 bf748d09 3fc14b04 3ede0a9e 4040fc30 409d271c 3fd2f460 c09b96e8 c01e9a6e c083bdf4 c03fabc7 3e384c5e 3fed644f 00000003 403452f2 bf65b849 -> bd1f21f0 3c6e65e6 3cd35c15 3f1b3baa 3cf105ad 00000000", + "41ac55dc c191dbdb c1ccb4ce bf63dce9 3f287ec2 bfef5f4c 40143e7f 3fb73551 3dcccccd 3e331722 41637057 bec9000a bf1c0806 bf37dea6 4099bb30 bf0e3be8 408c5b76 bf69c470 404dc2dc 3fe6e950 c02ca89b 4024d173 bff261a4 00000008 c03bdad2 befb4cb8 -> c00f0df8 bf46397e 3fd738a3 3ea946e2 4752893d 450a57ec", + "41c7b1b0 c08f3428 41f7339c be855c02 3c28b277 3fa7483d 3fb97674 3f94daae 3dcccccd c10368a3 3f4ceac8 bc8275b5 bf2414ba be3b4de1 c0215c1a 40e4cd76 40cbdd02 40edf1d6 40ff34fe c050454a bfc3e950 c0210242 c013c3c0 00000007 bf891858 3f685a3d -> 4247b4b8 c244b350 c20d7350 40762b20 473562a1 443b162d", + "c2439162 c228e543 c20df8df 3f8b8281 3fd487bf 3ed54bc9 400ae9de 3fb4aa5b 3dcccccd be68ba18 3e41bb60 bf0a0ec0 3f7ec08c 3cdd03ee 40f6bae6 c0f60db9 3fc866b0 bec0e900 3fef9920 3fe43a70 3fd2ce3a 403e2afe 401e90f8 00000001 4002562d bee308aa -> 3db703fa 3eb4ab4c beb80019 3f79bc4f 42a097a0 3ffa1a79", + "421320a4 c2241b1c 42373c68 bf2075cd 3ea44dad 40019258 40092f77 3f867b89 00000000 bb953739 3ebe5e1b 3fe46f17 be1d7578 3fa1ebe7 403c55fc c05ea4d8 3fcac480 3e8ff640 bc26c200 408a1c24 3f06622b bf99d0af bee9a878 00000002 3fde7643 3f829ffe -> bc39690a bce067f0 bc46b270 3f9a5679 3ca2a31e 00000000", + "41080400 41d637ec c12ccea4 bee4709f be25423a be8ffc3f 3f20cc4f 3f4407b8 3dcccccd bfc211c8 3d67b858 beb3e659 3fa9dd1d c00db66c c007ae2e c08af21e c0c3e66c 40fa9d1a c0d52a08 c0d79d37 c0298ece c007e8b9 3f0f5819 00000005 4006a3b3 3ea668be -> bfe2fa2a c1a19813 41feaf68 3f8ab30d 48e5975c 44235e69", + "41ea520c 423554bc 4229cb46 bf4b0a7b bf4f6913 c02e6470 4044290f 3f917c13 3dcccccd bbb0d1e0 3d1a61da beaeeb1b 4030aabc 3f391028 3ee13e60 408408c0 40ccac4a c0c44b0e c0a9b29d 3fcd8ae0 c03ad682 c035d735 bf0592c2 00000003 40102bd4 bf9626a7 -> bdbea3ef 3f867c78 3e4d8dc6 3f4435c6 424052e5 3da4ba21", + "410221b8 c10a060c 42390e2e 3f11f4ca bfdd6b31 bd882795 3fe94a5f 3fe0a818 00000000 3d25f222 3c3378ad 3edab8f6 be8df112 3df6e85a bfd7d834 3f823148 3e9cf860 3ff68138 c0cc7e21 c0c85af9 3fd2ad43 3fc5d382 c01e232e 00000005 bf7954c2 bf8a0d73 -> c14a78b9 4103845f c057fe12 3fb442ca 44c6d540 00000000", + "419649fc c241a51e bfb62c00 3ffc3400 bfb21c98 3f3fa4e0 4023f7a8 3eba1013 3dcccccd 3c727512 40208866 c01eb644 bf09b7a5 be84d9ce 3fa67058 bffc8fd0 c0d0b0c6 3f942e18 4072f008 c0ab6ff4 be711294 400e3230 4010c475 00000001 bf1fe14e 3f3414b6 -> bc66e773 3d038a61 3d2eafe0 3f109296 3b9ac6da 00000000", + "c1b2edd6 c1b99b2b 41f0154c 3db93da1 3f8a4853 bfc74a2c 3ff6a073 3e975e66 3dcccccd bbe12db3 408770e8 3f82236a bf94b110 4005000f c0862cf3 3f4cefb0 40ee55e0 4056c1a8 3e9c8a60 40634758 c017e33f 401bb399 bf2a59d1 00000006 3fcc2ff1 bf71f954 -> 3d3faba0 be0e32c3 bdb84b04 3eb769c3 3e274b4a 00000000", + "c1a45ef8 c219ad6b c14dd6f8 be8e40a4 bf7f46bd bf86deae 3fc1ea90 3ff27ddc 3ca3d70a bfbcd6f8 3e9b1dd7 bef6e0c6 3f870a9a bef8a6d7 403dbeb4 bf9ee7b0 bf76f7f0 409cec54 c0fbfcaa c0f01dcd 3feb7f80 4025a4ee c0133ee6 00000007 c0031539 3f14e4e7 -> c1d09605 42132dc6 c0a6f3de 3ff8a2b6 48e5de65 431c197c", + "41ac900c 40efc048 c23f71f8 3f020faf 3e8af1a7 3f021472 3f73d7a3 3fec10c0 3dcccccd bd87feb0 40121016 bfb5aaed bfce7b72 3da9f597 3fff3ef8 c0457a84 3f5f5b30 4060984c 3fcd8f18 40ffde76 be39a45f bfcab762 c0265233 00000008 3f0ad820 3ee403ea -> bd86c735 3db694fa be04a3c2 3fa54d87 3e0fac30 00000000", + "41b2480c 41e7c140 40930ac8 3f9739f8 3db9cdcd bedb4306 3fa55f7f 3fccfebf 3ca3d70a 3fecdbd7 41bf960a beb5d4ca beda53c7 3ebdc061 4081c802 c08c6792 3fbcde80 c0ce2bd6 3f94c750 40d3e0ce 3f675068 bf949da7 40197aff 00000005 bfbb34c7 be3aa7ce -> bf42a57e 4083b8fe 407b8299 3ed8a6be 439abdb1 3ca80fb6", + "c1db83dd 4061bdf0 41dff8f4 bf24f048 3ea0ea7c beb8f821 3f53cec4 3e7c2c40 3dcccccd 3bce21e1 41f1601a c018a39a 3f6c577f 3f319f0e 4080949e c01808ee 4058a120 c08df236 c0b3c680 c0681634 3e962d1e 3e480314 be132509 00000001 403d25ac 3ea8147c -> 3ba1555e 3c37d8c3 3b3016db 3e67cfac 3aaca449 00000000", + "c1d94843 beed3d00 4106e780 bfb468a2 bf6ce940 40035ec4 405db8b8 3fceda33 3f000000 3aa13dca 3d3e0809 bf0f9485 402031a3 bea7fdc6 3f9fbed0 408bd5c2 c076bb0e c060e40e 40e8ea9c bf1266e8 3ebf0759 40070519 c02b29b3 00000008 3f4cabc4 3e607af2 -> bb3c3d20 3c80e377 bbc34a63 3f93c09e 3d0cc930 00000000", + "c22dd7a5 41f46eb0 41140788 bea13bdd c0148929 3f87873a 40256f85 3e154f86 3dcccccd bdb250a0 3f302598 3f65f673 3f125287 bf8d727a 400e3268 40d15c7a 406c154c bf5bde00 40e76fd4 4032928c bfc2c2df bfe36239 be03ce1d 00000001 c0288828 3e5c8ed0 -> 3da46b6d 3e5637e6 be99d29c 3f55104e 3edd2481 00000000", + "c1ac2e5e 42032226 c184335e bf8cd11e bfaf3d4b 3f4ec37c 3ffa54ea 3f90a2f0 3ca3d70a 3ca3e626 3c343112 be92bac3 bf4fdbea 403746f6 beda2e70 bf0d6c30 408cb95a c060ffae 40bc18e2 c0950fea 3fda67ed bfda0de7 bf98a046 00000001 bf55c9f7 be1a9a94 -> bd22f3be be19afeb 3ee7451e 3f6fedb2 433823bb 3db09d16", + "41a81e18 4215ced2 c15e044c 3f275b3f bebd379d bf8b46d0 3fac0080 3f8ac1ab 3ca3d70a bfeeb6a7 40094ee5 3eb6b6fa 3e2ae8d6 3fbdcb51 c0292786 40c0a83c c03b710e c0441efa c08f43b9 c09ea83b becc82ce 3f168d1c 402d87c5 00000001 bf80d21e bf16eada -> 40432b85 3f69be54 bf4eabca 3f7ba26b 4302dc39 3e17bd9c", + "c18074ea 41d60cd8 c115cf98 3e5037ad 3db79ea7 3e0a7d7f 3f9260fd 3fe22915 3f000000 3fbc534b 40862ffc bf89538c 3f9c325e 3f018d4a bf3ed4e8 bf777a30 c03a0970 406e9454 bff51dd0 c02954ee c002717f 4032267d bf39c3c9 00000008 3faaf710 3e40486e -> 4037f41e 3fd0fe22 4052229a 3f76086c 43351852 41a80a1e", + "bffc46e0 3f467080 bfa0e1a0 3d9a5b52 be9270ab 3ff52774 3ff80f6e 3cf9bc60 00000000 4054ea47 41a5090d 3f08aab7 be7c9a1b be73a7d3 3d49e100 40ca0b46 409d1e14 3f0411d0 c0bb73b4 c06dcaca 3f911b80 4010555a bfbe8a51 00000007 bf778ff0 be1b635d -> 4041b15f bf9d6ab8 41048ac0 3e66f4a8 43c1a39d 00000000", + "c20ae504 beeccb80 4244a5ee bd8d3ac0 bee26391 be0299ae 3eee3fca 3dc74147 00000000 3b90f8d4 3c70428b bf9cf86c 3fa6ca69 3fe3bcfd 3f87d8a0 be474400 c0c2dac7 40ce524e 402a3444 c0deb7b6 3ea55deb bf126f52 c03502b3 00000007 3f77e5ba 3f831a89 -> befd0292 3f067cac 3f308159 40b41102 413be292 00000000", + "40f148d8 3fa7b500 40f36488 3f97e39b 3dc14a0e bfb45c45 4010477a 3f51cf1b 3f000000 bf0ca859 422b75a3 bfc59f20 bfb307b6 bf34daa7 40dc4ac4 40c83bc6 c0c71f41 409f3a3e c031099e 3fc08e50 be9779c0 bf890c2a 3fccf6f4 00000008 3fed5a52 3ed91803 -> be18834a bf8edfd2 4020ddf0 3fbf0103 44320a80 4435c9c6", + "41f73a54 c1cfac7a 4209339a 3ed8e695 3e913522 bc887e2d 3f029454 3f8c2d8b 00000000 3da20ab4 3e2e6b4b 3f7445df bfd7cb0c 3f17299d 40c29e12 40ad69c0 404e74dc 3f46c910 3f9dda00 40ee972e 4018c2e8 bf3b32d3 c0261f0a 00000003 4021d5c4 3efaaf25 -> bf2b0460 40111965 bf057306 3f71b0f9 429f1e06 00000000", + "c230ba00 c23f913f c23b614d bec94484 40152eb4 3d6f3f0e 401755cb 3eb45334 00000000 3f6762f1 40c1555a 3f7e2408 c0028c96 3ef1284d 40a5c072 bf373618 40d06054 c044da0a c0d8af2e 40a72e60 3ffaaed2 bf91c44b 3f883d5d 00000008 bfd64a97 3edd4040 -> 3f168e85 3e6f6218 bf954401 3fa3fb7c 43dd8231 00000000", + "4001cee0 c22517e4 41305d84 bf030fd2 3d9b14b7 3da4c4c0 3f35e1ed 3fef0483 3dcccccd 3ab33176 42bddaff bf2f2f28 bf81dce1 3f31abc1 c08df16a 40d723a2 bfde057c 403be448 406fa384 40fff258 3fd9c322 bfcf8538 3ffd33c4 00000007 c02274ea 3ea77d3f -> 3b7b136a bb8c52aa bb22bb35 3f8822c7 3c1e32f6 00000000", + "420cf0f8 c22048be c2390d07 3e00e24c bd0c4d74 3ed7bc10 3eed030e 3f8bb3ed 3ca3d70a 3f841c85 3fdd8aae bfd5db97 bfcbea89 3f7b098b 40eebae8 c007f0d8 bf813054 c0bf3dcb 40b68838 40910a26 40397c29 bf661dd7 403d800c 00000002 bf791000 bf323e3e -> 40078a08 be148fc8 3ed38f14 3edacbb6 4239099a 00000000", + "40746710 c1fb3287 bf5ce3c0 bfbc2d12 bf5b1eb5 bf138c28 3fe71c67 3ef13e39 3ca3d70a bf6739cd 411da0c0 3f08e726 3f38b569 c01a38f7 40a92822 c03232c4 beb49d60 4020df10 3f9590e8 c0e5b090 c00448ce 3e897f6e bfbfd22f 00000002 c018d2e6 bf8f96b5 -> 40fae6a5 bfd602c8 3fa4d747 bcaa4da0 43a4eb4f 3d8a2fca", + "c1f4273f bfeed700 c1b33f21 be858480 bfe697cf 3e87f297 3ff196c1 3ef511b2 3dcccccd c0f03c1f 3e5149d9 3ed9151a 4031776c be81e7fb 400f6cdc 407d5244 bfad3ffc 40313ec0 3fd4a270 bed1d170 bf94c083 be4e3a32 40326c3f 00000004 c0052040 3ef221cd -> bf6e0230 42242f20 41d51e46 3f8bab8b 4990cc6c 4720ee63", + "c1fdbb19 41d28878 42236faa 3f8bf76e bf125524 c005da28 401ef97e 3f0e915d 3dcccccd be8f9d15 40ac8504 bf8fe3b1 3e7e7e2a bf90a6b5 c00b23a0 3e040900 bddf8800 be2dc0a0 c0eaa6c0 40f74b56 3f996baa 3ece0c6f 403edf91 00000002 40156d15 bec7590c -> bebc7521 bd4fe418 3e838c32 3f2997d9 4154305c 3f20e6e1", + "4233c5d0 c1fa4197 c246a55b 3fa7d7c8 bf95e510 3ed24919 3fe77140 3e0c3942 3ca3d70a bfa36b9e 4253025f 3f00b7b4 c025eeff 3e885fe4 4008572c 3fcbbd28 c0729fdc 4038fd48 c091dc28 3f670670 bf4cd0f2 3fa43abf bf0cb1e3 00000001 bf378ccc 3f19e0ae -> 3f5d9067 3e101a13 bfc94457 3f751eb8 42799f1d 00000000", + "40467c20 c1158f5c bdbf8200 bf82d1e1 3f2b89b1 3f0f5481 3fbb831c 3f9a7b45 3dcccccd 3f06abd8 3d316d3a 3f431ea2 3e938cdb bff9a866 3fc84ae0 bcfde100 40aa10c8 40b3a468 40ab1682 40ef5ba0 3ff6c5d0 3fd1d5ad 3fe3913d 00000001 c0102718 bf95b213 -> c1853667 c0c40233 42315bd7 3f32d792 460039d8 42cf6c9f", + "c22b099c 420535cc 421c43f4 3e824856 bf4695db bfb8c57f 3fd648a7 3f48f2fc 3ca3d70a bfde71c7 3e096abc be8fb255 bef95d2d be369972 bf7d5200 408712dc 401a6730 c05a3938 40fd5436 c011dfc2 bee78393 4029421c bfde6e7a 00000008 40053a37 be559d3c -> c01eb491 c00ba064 c014ba43 3f42c1b5 4752548d 42105219", + "3eacb900 c1656ac8 41df234c 3f90934f bfb9e5a2 3eaa3271 3ff82106 3e0d12d7 3f000000 3e731932 406e3dba bf89e6dd 400e1969 3f7af565 c090867a 40b0165c befc3710 3feff8d0 40c58432 3f916828 3fd2ad37 3fa88a40 3f69ee30 00000005 bfb6d3ec bf06e7c3 -> 3fa86cca 3f8db435 bf2940ce bbffac98 4191c038 411a1690", + "c17675f8 423de1ce c1ade794 3ee7205d bf35bc83 402b8642 4035d91e 3fcf2ae4 3ca3d70a 3ea8bc56 3df8ace5 bf3aff6d bf48dc05 3ffc4a10 3f13c300 c0bba0c0 c05d2534 bf2934a8 c0eb094a bfdf37ec 3fd73da3 bf837353 be4e2e5a 00000007 bf257d20 bf152aa3 -> 3facf8d8 3f95249a c04f20b8 3f432b62 4406f9f2 3f87f013", + "c1f60fb0 c0828048 c23d74c6 3e09e1bd 3e9a4f96 bf6f33c4 3f7e74d3 3e192b89 3ca3d70a c0da9fd4 3cbe2437 bdccd08e 4009e073 3fec0ead 40fd27bc c03347a4 40dc938e 401943e4 40a6dd4c 40f554e0 3ffc2259 bfcee7e5 bfc79531 00000002 bfae25e3 3ec1f232 -> c20daff4 43960a11 4382c584 3f9e106f 4afa47c7 449dfdd9", + "c21782da c1cfa990 41e9a100 bf7f1cdd 3f18ec94 c00bb281 401f1efb 3f2d3b48 3ca3d70a 3cd139a7 41088dd9 bf11bf1b c01700de 3fdf8f61 bf214370 407d2a0c c00c3be6 bfd555dc 407d2470 bf89bf9c c00ae3ac c0153a80 3fa1fcec 00000008 bf900ad0 3f591078 -> 3c0da248 bcd9fa20 bd02d9aa 4076220d 3e284629 00000000", + "41598db4 407d6c70 c22ab723 3f2f5771 3ffd68b5 3fc4da70 4033c154 3ed6e9cc 3f000000 bba34626 41b36d0b 3fccc02c befb159b bed8270a bea6a1b0 bfb28b10 c0fbc5f8 c09e4a30 3fc8d718 4082e77c 40027da8 bdf6d107 40127020 00000007 c015736e 3f90afdc -> 3f907e32 3d7ba320 407d65fa 40d73ae2 42b4d8f5 43286cc8", + "c1eda4fa c120827c c144c7f0 bd68b357 3f8ff218 bfe638fc 4012be40 3fdab1fb 3dcccccd c077a003 409dee32 bf51b051 3fdb117f 3f3cbcdc 40987bd6 c0b75db4 c066d11a 40e42180 40d38276 3fcc0ac8 3fc3347a c0222e3a 3ffdf249 00000006 3fc7d313 bf1715d3 -> 3f946570 c0339098 40fd040c 3e4695fc 46693784 44363433", + "41d7ac00 4224c4a0 c20ad69d 3f349a29 c0069414 bf89bfbd 401dc6f2 3ea86d39 00000000 bee63c74 404d300b beafbcb1 4035abce 3f2af444 c0a4954c c095fa72 c08f32f0 c0df5f7c c0cff5c8 40815338 bf13170d 3fb7dabf 3f98a87e 00000004 3f9c06f6 3f8ac415 -> 405dc1b2 3e8a037a 3f45ace0 4031fe46 425f75d6 00000000", + "41adc838 c1ac282e c1ee25cc 3ee586b2 3f3c86c3 bfdfa635 3ffb587c 3f4333f2 3ca3d70a 401e3cee 40a17629 3f375e56 3f9df7c3 3ed6f8c1 40f03cee 40f69590 408db662 40e14096 408a7234 40a41b64 3ed36d57 3f7d1d54 401a17bf 00000003 c037d2b0 3f807ad2 -> c1df82f0 413bb820 c0986653 3fe03fba 46cee0a6 4219b155", + "41b960e0 41d4221c 416b0170 3fafdd80 beb766c4 3ff36ff0 4019ccaa 3e98154b 3dcccccd 3d070e73 40379194 c0090a6d bd3219af bfee05b6 3f8f9ad0 3f11aef0 c095179e 3fa5be40 40258a58 c0d44136 c01ccd47 bed6c52e bfeba6c6 00000007 bfc7e41f 3f6a724d -> beb7136e 3ebd6c4c 3f10366c 408eb558 414bc86e 3e25cce1", + "42294be0 c134b8f0 bd151400 bf1064eb bed09957 40057fbf 400cbaee 3e8ab696 00000000 c0da59bc 3fdc1971 bf1e563d 3f1285ed be984f84 bf804950 40e67fe8 3fc95678 c07c3b2e 406aac8c 3fd87bd0 3e49cf20 3fae8939 3fa358a3 00000004 bfcc2f12 bf8a3f1f -> 400bbd40 c23d165c 421087d3 be1dcb38 471350a6 00000000", + "c1216d1c 41aeb718 c1526560 be95e283 3f461880 3f80e248 3fa9b84f 3f917d41 3ca3d70a be45c4c6 41108b3d bf4f9f11 bfb904db bf984429 c0e4461c 40a3edce 408357e8 40c27dae 40d3560e 404be218 c01bc57c 3e97cced 402a1c99 00000001 bf5073b4 bf90f350 -> 3db2d706 3e600727 be80b885 3f19376a 3f2915a2 00000000", + "c203f577 42364fcc c18c7174 bf31a700 3f66eeb6 3fc343ae 40026539 3fabb527 3dcccccd be0b0d7e 3ce1ca82 3f80790f 3e427746 bfd26ea5 c019114e c0cadc62 40c15c36 40eac0b6 40a6e55c 40cb9ae2 4005a81b 40388d92 403d7aaa 00000002 bf6c257e 3f0d0aa6 -> 408f9d3f 3f59a114 c0f6b52e 3f7a1baa 44f7f8da 4283a852", + "c0d639d0 3f958360 c1ac930c bebc9f73 bed4b607 3e148cd4 3f133d90 3d80657e 3ca3d70a 408444d0 3de262e5 c00ed154 bf3bca69 bf92ea94 40d55dc8 c0df3bc0 40bb20f8 c06b9162 c050a92e 401df2c0 3e43b721 3f62ede7 40351177 00000004 403a2827 3e98a699 -> 42244f14 4185494c 422bb1e4 3f8bb854 49f64fc0 432e4f5a", + "bfbf7aa0 c1b7f8f7 c1007e98 3e8ee766 bf63b00e be61d038 3f7c4a59 3e8d5bdf 3dcccccd bdbde0d0 408b1b5d 3f54d221 3f2e31ee bf8761e9 c02f8390 402b3a44 c0b25b03 c0a41f82 40b9c89c 3fb51840 3f349ef1 3fbca3eb 40257d24 00000006 bf14e574 bdddb3eb -> 3d04c3d8 bd482408 3d0dd9d5 3f2bf7d4 3e89e5d9 00000000", + "41c8f5ac c18813ca 42359962 be3c07bf be771792 3eb7c397 3ef090ba 3fe58e47 00000000 3e47e434 3fa33370 c00aadf7 beae0e57 bfdc87ba 40c908fc 40e47d4a c0b375fa 40f6bc68 4098ca7e c0bbe7ac c02f17ed 3f5d52ed c03e0c40 00000005 bf5f43e3 3f975806 -> be4bcc74 bf089912 bf85faa0 4073e0d0 40808138 00000000", + "424660b6 415a6198 421fc8b4 3f878036 3f12a37c c012ed0e 402cf115 3e617b2e 3f000000 bce50c74 3eeb9752 3e80a002 3ea547b4 beadc5ea c09654e0 409fa95a bf8fc4ec 407e35a4 409671fa c0d0667c 4023a237 3f6a5c44 c02789b8 00000001 3fd95a5e be725210 -> bda85bea 3d37cb87 3ceeed3c 3f3a93de 3e5260ec 00000000", + "41a1647c 41b63494 c2106df9 3f6804c5 bf4d99e6 bfd44635 40054ba3 3fbb6428 3ca3d70a c0513461 425cf399 3c56395a 3fd0e63c bfbaf301 c0fe7d97 3f13b8f0 40b8d8e4 c0e6a2f0 c0adda50 40f00afe 40040e75 c0324bbc bf2ad2cb 00000005 c0117b96 3f7dfd3a -> 42174b6f c33e57a9 c34dc06e 405e9e5a 48f91204 44591766", + "c21ce6e8 c1bca152 c1d508ae bfa161ee 3fd0b89b bfe33641 40346a96 3f7ceaa4 3dcccccd bd7e12d5 3ef3c2ad 400b6112 bead4de9 be075537 c068e484 402285d8 c0fe4b5a 40f9dac0 40ba9ec0 c0c19a76 c03441b8 3eee70a2 bfd8e614 00000007 c020a6a0 be5bf82e -> be42993d 3da93c9a 3e1faebb 3f420456 4199690a 3f6ae662", + "c2224066 c1af1196 419b89d8 bf784bda 3f25228e bf4742cd 3fb3526f 3f510742 00000000 3d8843d5 4005a01b bec472d9 bfbb5175 3f60f79f 40add0f4 3fec3f68 beb24c20 40af1e90 40cfdabe 402d4a70 3e9e6fd8 3fa85078 3f13e66a 00000007 c02965aa 3eb2a887 -> bd9bfb97 bd96161f bd82e061 3fa29121 42437d84 00000000", + "c1d676b8 c13450c0 c2261d0a bef31efd 3fc87eec 3ef0b11b 3fd9f9e3 3fce80fd 00000000 410a58d7 42871523 bc32e252 bf6ad891 bf8fe30c 409c5f42 bf8cd934 c06ac8c4 bf83891c 4037cab8 40e062f6 bf53c6d8 3fb0e675 bf47c704 00000003 bf8d7fd8 be2cecee -> 4079b264 4127fe0a c103f9a5 3ee02aca 44d78dec 00000000", + "c1755a34 41f6cd7c c20ee96b 3f25cd57 bf37e706 bd4de917 3f77f195 3fb52e6c 00000000 c0eb5e51 4021f711 3fbb3978 be9b6155 3fec1955 c0e36714 bf3307b8 c0564386 bf5e7740 40e06d90 c0a0c9f8 3fcb6603 3fc48c30 bf8da881 00000004 c03b7132 bed9b901 -> 42819343 c060c740 c2447eee 3ee4d0de 476de4ba 3c6c7f20", + "c1730440 415f9b7c c20f427b 3f985376 3ec1efab 3fdd63df 4014f45d 3ff862b8 3dcccccd bd4c8e33 4032861d bfdaef8a bfa75c39 bfea9eab 409681b6 c00e5e3c bf88fe00 4073d1b0 c0c5bb67 c098ef3a 400ee8ed 3fa4dc03 bf8d31b4 00000004 bfafe4e2 3f57c168 -> be4b0186 3d095dac 3da105db 400ea3ad 3f6c5a95 00000000", + "c146f5dc 3f8a6800 4184164c 3f6acaaa bfb0fe52 bff546b1 40244b6d 3fcee1ee 3ca3d70a bff011ca 4063b010 3fb474e2 3f9aa3f1 400aaf07 40f1c8a2 40323af4 407501bc bee50350 40db6f92 c0fdb14a 3fa09ba0 3fedac24 3fc8ecbc 00000006 402478e5 3f513bc7 -> 41ea80d4 c2581071 c10fcb00 402586ab 49865fb0 4510428b", + "c1d4a3c2 41e980e8 c203bcaf bd301c4b bd7ba3ba be5ed535 3e6bb111 3fd6df9f 00000000 3acd1104 3e1872f7 bf370aec bc570408 3fdd0b41 c023e018 bfd6ac74 bf110158 c0e544c0 c08ac5e4 3f6441a0 bfd7d4f0 bfd06e83 bf5107ca 00000004 3fa6187d bee02c39 -> bc7d3db4 3a437ef8 3d36c523 3edca53e 3c0eb56e 00000000", + "415e9658 40a013e0 3fc57180 3f2699ee bf7211e6 40069a7d 401958c1 3ece4e1b 00000000 bab33a04 3c639795 bf32ad7f 4013b460 3f91931f c0efb5fc 40ff278a 40de2e44 c09e1e9c c0da67df 40f2c4be 3f47d353 3ec75bc9 bf5d9a2c 00000004 bfe03272 be134208 -> 3d125aad bde91169 bd53cc84 3f3224de 3ec05419 00000000", + "c16e83d0 42042352 c122c750 bf95d12d bfeed5e9 3fd81749 40319c75 3f94518e 00000000 bb347d4e 3fcecbd3 bf836979 bf2cac70 3f87ad7b be164880 c0ea4e73 40dfec10 40e2891c 408646a0 bfeef8ac bf413682 3ff61851 bf5b9887 00000002 bf66d6dc 3eb2e62e -> 3b31deaa 3bb9909e 3bed17a5 3f1e6015 39918001 00000000", + "42269fc2 c1711870 c1f91a4d 3f9c026b 3f4e398c c01c803c 40364e39 3fd78c82 00000000 3fa31418 40c3cc5a 3f67b4d7 3f8b7f43 3f8faedb 407e4158 c0b4a6be 40e450ac c0a78f4e bfd9a92c 3e14d080 bf122cd0 403bc438 c02f910d 00000006 bf9087f6 3f1033d0 -> 403a37fc c02ff588 bd9022da 3fca2654 42fb2282 00000000", + "42242ee2 41bba57c c216fb90 bf0bc2b9 bf9d73b9 be8b34f1 3fb17c26 3f2e34b0 3ca3d70a c027ca51 41cf1d93 becbe7fc bf2b2fe1 3e35b269 405d1274 bf54a9d0 400cd6f0 c0cbf4ae 4007cc20 bf614268 c035d4ee 400fb104 401ca604 00000003 40310264 3eef716a -> bd642200 40708dae 4155d8a3 3fb3fdf5 45cfa8e8 4003618a", + "4234fbfc c2122ff2 c1beddcf bf846681 3fa0c25c 3f820b44 40027e10 3f9a8d3a 3dcccccd 3b3ce2bf 3c7525e2 bfac5028 3f987c0c 3fffcf05 c0eb7841 402c6edc bfec0648 3fbf2ce8 c0c8c9ea 3fa28838 be8f0921 befce5e2 3f7cc1fa 00000005 bf3d522c bec87b61 -> 3dc3bcdc bdbabd2f be12751d 3f0419d6 4024b9a0 00000000", + "4104c9f8 41a5b7fc 4143b1e0 3ccd6849 3e3b9ce8 bf132247 3f1ee2b6 3f582a4b 3ca3d70a bd1b6c92 3fe42ad2 3fd088bc bed718e4 bfea25ae 3fca08b8 40e55822 400d8458 c0aaa5dc c079e134 c0ed0298 bf8448e8 c00fde83 3e933a6c 00000005 c03dbdf8 3ecd25ba -> be227229 3d45882e bd31c577 3fa67293 41506870 00000000", + "c2415e3f 420a58f4 c15e6b38 3fbabbe5 bee0d915 3db67f44 3fc44699 3eba4314 3ca3d70a bc2e36cf 3c6737a0 3ffac37f 3faa6173 bfb48235 c02c0b1c 3ff38700 c0d3760e 40f3e2dc 3ed2dd80 c0bee1e9 3fe665af 402c1ed1 402d0934 00000003 402ecc9f 3f026d94 -> bffca0ee bfa8a864 3fb24e56 3fa6ee44 4411ca7b 3de29426", + "41311d5c 42476422 4175b460 3e06c431 3e912ee1 3e18eedf 3eb162cc 3f883ca7 00000000 be71d6b9 3ed724da bf0cdc75 3d8dab3d 3d75dd7d 404a2910 c0fba821 40b0fbe6 c0e93675 40b9daf0 c0d310d3 3ff00ac3 bf9ebf7b 4001bfa3 00000005 3f8eb6b0 3f958453 -> 40d5d4da bcbc7b40 c0148ef2 409cc645 42c9293e 00000000", + "41849800 c188d01c 41c72b04 bdd28ae4 beedfee5 bf837164 3f90e18e 3f3f55f0 00000000 3b0d2fc8 4236f87d bf39e059 3f2e8b81 3f74e94f 409bab14 4004ea5c c0dfa028 3f15b8f0 40bd0658 40f00d4c c03d5e5d 3fd6171b 3f14477a 00000008 4023bcd8 beb3a626 -> 3c1191c1 bb1feb74 3c0b933a 3f428fb6 3da36fdc 00000000", + "422b6520 41258304 c0839c80 bf7be9f9 bf5e6f5d be832d17 3fb0ec81 3db71d93 3f000000 bab888e5 3d2777da bffc2caa 3fcdc7ff bfbf07b1 bfad3168 406be260 c0b132a1 3f177070 3f3a7250 c03e6f00 402b13e6 403e9444 403f1752 00000005 3fc9b537 3e80067b -> ba77e11a 3bb8a89f bae78866 3f9248c4 3e00dfe5 3aeaa69b", + "41d93ec4 422da77c c2100d66 3f52fd44 3febeba3 3fa7c7f0 401c2757 3fd15b5a 3ca3d70a c08b04fe 3c9ab5f4 3f64b957 3f00166b 3e8499d1 c0318716 c0d2f8c4 c03076c4 40aaf1a8 bee4d250 c01196bc bf93badc bfc7a3c4 401329e9 00000003 4038f474 bf67d4d5 -> c56ce0f4 c5053dc2 c4891c8e 3f0ccf21 4d38aa8b 48af23ac", + "c1929f8e 41790590 bd960400 401c4ee9 bef7d899 bf905fa8 40316b2a 3ec68420 3dcccccd 3e2351d4 3d8250a0 bf11a5ca be6aff5d 3e360e5b 3fb5bef8 406b31b0 bf6c5108 be5bcca0 3f9523a8 be3fd840 bfbe3742 3f6faee8 bf6227f9 00000004 3fd683e2 3f187ba5 -> 40594256 3f654700 bed6cbe8 3f9fc85b 455dd8d8 43679f29", + "40653cc0 41fa519c c2431b4d 3eec3129 3fc4bc98 bf3584e5 3fe13e56 3e87c466 3ca3d70a 4047c965 3d3a6a63 bf948db3 bf1fca65 bf84aa3d 40f42854 c0860ed1 3fb75a08 40ed70ea 40a2e562 3fa437d0 bfe25dd3 c0025cd0 3e6a13b4 00000007 bf12ee58 3f7ada76 -> c363268b c2e25afd c34d34a0 40995dd9 48bcadde 42ffb11b", + "42060ba2 c2181a78 41e2e484 3f9298b5 bfd5ea1c bf6b356e 4048300d 3fe741dc 3f000000 3b27c028 423a8cc6 bec5937d 3f22c857 3f807614 3fe5bac8 40d1014c 40e06ba6 c034bf4c 40a3aa92 40217fb8 40396fc4 3df08d77 3fb28b80 00000003 40099c68 bf32bfca -> bb131d2c 3b94b2a7 bb43e70f 3f9c4e3e 3b4883f5 3c04918b", + "41d5de38 c1ada306 42039892 bfdd6bd1 bfaa73dd bee8d71e 403bc376 3fb43217 3f000000 3a946acd 3f963133 be85f94a becba2e1 be643b88 c0aa4450 bfdf4a84 40c9c04e c0131930 bf47dfe0 3f835170 bf538f19 be8d9115 40279934 00000007 3f031cfa be896c82 -> 3a026a39 39981093 ba5dbea0 3e3ebb35 3836a673 00000000", + "4195aa60 41b06974 c21ceea8 3f58b126 bf4c74e6 bf2c6c1f 3fad0ed5 3d97abcd 3dcccccd be1939cb 41426600 3f2ab0e4 3f134efd bf4d326f 3f79a300 c07f9092 4011104c c0d31088 40b2fae8 c0513bd8 c03c3727 40211be6 bfcb09c4 00000005 3f7ce6ae bf1e3a1b -> 3d4b7df4 be7b82fa bdfd8add 3ed9abbe 40062b0e 3c839832", + "41afca98 c0f0ba90 c15c98ac 3ed180bb 3f8070f1 3fdea70b 4012bfa5 3ef96064 3f000000 bb40db89 3f0a9a78 3e08c4f6 3f662756 bf9ec6fa 40fe6132 c093367a 3fbd2668 40305d14 c0dd1a7e c0a512be 3efa9ec6 3e6f1752 bfc093cd 00000004 bf844966 3eada52d -> 3a2173c0 ba484745 bbc58f13 3f243750 3ae80b11 00000000", + "41d094bc c202b819 c201aa2a bf7db73a 3f9b96e6 3f7d3b07 3fed5833 3ff07d68 00000000 bfd4b274 3fa8aeee bf09f985 3f958589 bcbeb2bc bf1afd58 c0976a28 c0edfad8 40ed87b2 beef1f80 40fb0eac bff86753 be018fb7 bf38c8ab 00000007 bf9c384c bf4064ae -> 40a21cf9 c07ba750 c0dcf284 3d2b8aaa 441ce254 00000000", + "c1ae9742 411b1700 c20d8743 bfda1baa bf8340a1 3fd19fa0 404a5212 3f95c42b 3f000000 4035279f 4291afee bff4e053 3f60a32b bed1ffd7 c06cb2a4 40f5c9ec 3e754840 3ec956a0 c01b3976 40dc8798 3f58755c 3f2d2388 3ef062db 00000002 bfe74772 3ec94537 -> 408605d2 41007456 c03fc0f4 3f34cb03 447e7cb4 44fa7761", + "c216ee85 c127f310 c1bb144f 3eb77b33 bfb32866 3ea24baf 3fbd55d5 3eb3f30c 00000000 40eb80bf 413c5bcc 3da00a8c 3f3c7390 bf5c0da6 c09c9d27 c083e545 c0664168 c0ceeafa c0d07cc7 40282d48 beb600df c02401e0 40308e26 00000005 40189521 3f8e03e2 -> c410da48 41c1ab28 4245c80d 406bcc9f 4a74ac64 00000000", + "3df8a600 41598410 42434180 3e827a58 be43e9b8 be55a288 3ed2928c 3fc27f6f 3ca3d70a be245184 41cd0868 3f34c621 3d445a60 bfce4ebc be93ea70 bd493980 bfb703bc bbadf400 40aea938 40dd1e1e 3fc4f850 c0152028 bf022156 00000004 bfef5367 3f97db24 -> 3ecd1490 bffaec2f 3e0b1778 405fa670 4244231a 00000000", + "41bdbcf4 41622840 c1ee87b1 3fa4e545 3fcf23cd be2dcbe8 400c034d 3f8fc47b 3dcccccd 3e161f66 42619d37 3eb3b58e 3f5f2465 401dcfcd 40344a08 4088201a c0b31977 c0cd9128 c0b95c18 40d06f64 bfd5894c 402ece16 bf7b814f 00000001 3f14f412 bee5526e -> beb98b0a 3d0c16dd 3d0af233 3ebf0216 3f6e13dd 00000000", + "c0ae7b30 c21d3785 c215d66e bf0fa51c 3f8fb861 3f431a42 3fea596c 3f398b34 3f000000 3f114470 3d345583 bf566182 bd9aa56d bf5dcbdf c0b532e2 c042b046 40ae6634 c0522c8e c09bd0e2 c098fdba 3f5cb1a1 c009ff86 40068ad1 00000003 3f9a3b1e bf0dd5a1 -> 4022dc59 bf1f6e19 40620d1c 3f296649 46b1063a 451be93a", + "415b0230 4210e88c 423e04be bd46ba60 3ca434f5 bf353c05 3f3e2716 3fd28434 3ca3d70a bc15ff6f 40747f9a bf010946 3f12bbf8 be6344b0 3f94efe0 40f56e6e bfbf48b8 40a32f82 40f13d52 c03a1644 c00ea8e5 bfa67b49 40133be3 00000001 403798f4 bf3f30f0 -> bc8654aa bc81c89b bc97d886 3f25dee3 3a89058f 00000000", + "4232537e c2118822 40c5caa0 bf8e31ff bfd0dd19 3f06d5c6 4002e188 3dc7c676 3ca3d70a be9d9aac 41171417 bfb892ab 40147a0d be061071 c0f2a4e8 c09788e7 3d808680 c096ec7d 40d0184a 3fabfe40 3f48c058 401a3a79 3eb9126d 00000007 40143588 3f41e7e3 -> 410c3cfe 409a2cba c0ccd5fa 400d21fe 46f550ea 4249a858", + "407f85f0 c1430d68 c146ae30 bf5a17da 3f809e1d beaf8ee2 3faf0aaf 3ea02383 3ca3d70a c0a71a2a 4269582d 3f429f25 bf6e1ac3 bf394a53 3e859220 3f139b00 4083f2a6 bf125398 c0b081b6 c082cbf4 bf13ad7e 3f0a4877 beae2505 00000001 3fb20b39 3f4f7f91 -> c00fa6f3 c0ef51fa 40e1db5d 3f1d8b80 44bda93e 3ebc96a6", + "c21935c3 c2468d13 c2177725 3ee5a1ca 3f464808 3f35170b 3fa3ce23 3e8e405a 3f000000 3c040ee5 419a36df 3f9c325c 3e962edd 3fc9c396 c094bc2c 405512d4 c0fcda26 c0b686c6 40cdcc9c c0b0fe28 be945c82 403cd347 bf99b9f9 00000003 3fb49022 3edec033 -> baa5bcfa 3c2a21bd 3a09f296 3f2cdd9e 3bb96438 00000000", + "c214748d c1dc96cf 420d9cd4 3f094d59 402de007 bd1b4e2c 40340513 3eddc881 3dcccccd 402650d2 3f8ffe67 becf807a bee210ec bd54483c 3fd82798 40778220 3fd19578 c0d2dbfc 3f8da4f8 3f7c65d0 c02ccefd 3e8c0c23 3ff7d0ee 00000005 401e66e2 bf5e4016 -> c2c2db8f 40d3d520 c1c7bd53 3f9c6fe2 48b4b6f6 46d05d5e", + "41f4bbc8 41545bc0 41b08a4c 3f1dd455 bfb98915 3f9eab0d 4012ce84 3f142fba 3f000000 bacab197 3ee544ae 3f0118c2 3f78e0c4 3fd9a379 c0a907da c0137ff8 3fe9d9d0 4049e2d4 c02e415c 40a1faa0 c011e17a bffc1409 3fc915dc 00000004 40252540 bf163326 -> 3c81b888 3cc9ca80 3d01ac32 3e87f86e 3d43603a 3cabb410", + "c1c6c2f9 423ffc58 422dc620 3fad3ff7 3c6cc92a bf0fa80f 3fbb8f01 3faf0e7a 00000000 bede19bb 3fadeba7 c0046d06 3f82d312 bf8e137f 40b3eab0 407d9c04 40e2f1b0 c054887a 406016a0 c09eb08a bfd8e72f 403b9891 be95fc09 00000005 3fec2f24 3f91d46e -> 4088b79c c0a2d686 40bb3c64 409215f7 44db3283 00000000", + "c10ba524 c22f602c c160b040 bea8bd09 3ddeb0d7 be8018a2 3edb0b8a 3fbc02a8 00000000 3e37dd5b 40d74659 3f986756 3fb2228f bd9fbced c0b87494 40509e2c c08a1e22 3f8dc790 c0595346 c0f2d506 3f46e0b2 bfac97dc bf1603eb 00000004 40396822 3f4b22e1 -> 40043b50 bfec2a47 c09b9a66 3ffb9912 439bc3b3 00000000", + "41bb4080 c1987c4b c0e9b150 3fc933c7 3de43987 bf971892 40040060 3f6f971e 3dcccccd bc635862 3d298882 bf67aaf7 400e205b becf2411 c0e63b1d bf9aa8d4 c08a05a1 3f726780 40ad77de 402f57d0 3fea7d3f 3fa8c63d 3fa3413b 00000006 3f9e1aa2 be93c726 -> 3c5b8c21 bd92a1b7 3c1df783 3f173ea7 41317dc2 3abf439e", + "41a12408 40734380 3fa48300 bccd64bd 3e781408 3e9e81a1 3ec9ae0b 3ec2bc4e 00000000 bea0258f 426dad90 c02d4d77 3f70e878 bf60d080 40983a14 4093c36a c080e544 4049929c bff50968 c0d777e7 3f94ca0e 401ff7c0 400a45af 00000005 40390b96 be13e8e9 -> 3e1bfc00 3ece6bd7 bd8e17d5 3f56a3ca 41842974 00000000", + "412b6f40 c1953156 3f41ba80 bfb9da99 3e6951a1 401cc5b6 404235a9 3fe3a835 3dcccccd 3e86da80 3d4e1eb5 4027ba2f bf053e7a 3f9d34e4 c06afaf6 3fd57cd0 c07e8ec0 40a21dd4 3e0bed00 405a1a80 bf0d7fc5 3e770e98 bfec1039 00000002 400bd496 bed78fd7 -> c0666ba0 3f77e0c6 c023292a 3ed58d64 458f5e1a 42496d16" + ] + }, + { + "glsl": "vec4 cultmath_snoise_grad(vec3)", + "tolerance": "ulp-bounded, coordinate bands 1e-4 to 1e2", + "check": "Read at the case's point x, with S = |x|_1 and (e_n, e_g, e_h) = math.span_slack(math.span_rounding(1, x, zero stage, 0, 0, 0)), against the kernel's exact values in double: |n - n_exact| <= e_n and |g - g_exact|_2 <= e_g for snoise_grad, ||H - H_exact||_F <= e_h for snoise_hessian, no tolerance. Report the largest fraction of each allowance per decade of S and the largest absolute error at S < 1e-2.", + "cases": [ + "be75a604 be2cd0f6 bec9cb7f -> 3fdfb0f4 3d9e436c 3fd65e37 3e535038", + "c0ab35b7 c0a11e6e 404d5b3e -> bf883f0d bfaf2b40 3f31b66e bbf74642", + "be1ceb4d bfb590d6 3f7d970b -> bf066b82 c05400c2 3f454058 be907cf8", + "3a7b1b76 ba15be78 3acdf715 -> 3f0adcea 3f0accdb c0d03a32 bc2419c2", + "bf728edd 3ed08ec9 3f5599ac -> 3f4fffd9 c00220d4 be92c170 3d9dc65c", + "40559e65 bfde3409 4076309c -> 3d45f141 bfde64c7 bf40a99e bd00c736", + "3c29cfa9 bcfb3c46 badebd49 -> 3f09a98f 3f09ab9b c0ce7f14 3847374e", + "40dcbed8 402cf4b7 4193e5d8 -> bf0eaed5 bf520326 c01a03ee bea36022", + "4137a6f5 bfcfd4df c03465f3 -> beb37ae2 3f9ffc9e c01b5054 bec7253c", + "3a155ee8 ba80c1c1 3b0311e9 -> 3f0ada53 3f0ac4c7 c0d03821 bc58e49c", + "3b06256c 39d1ea08 ba2c1fe9 -> 3f0ac68a 3f0ad035 c0d03b55 3bb77f9b", + "befa2a8b bf426e76 bf2a52e9 -> 3ffeb7fd 3dc97047 3fccabcf 3e9d71c0", + "3f8189a1 bece33ce be9fc317 -> 3fbc018a bf103e5b c00db573 bf133198", + "bdb359f8 3da07864 bd23d0de -> 3f4dd8e5 3e3fa200 c0b2f9f6 3e66a11a", + "3b6fe2a0 3b452b50 3b0fb4ac -> 3f0af50a 3f0aedc3 c0d02f29 bc2e8074", + "ba543d6f 3a115db1 3a2894d3 -> 3f0acfdb 3f0ad60a c0d03ce6 bb8da9d6", + "3ab11cd6 3baee4ea bc90e2a5 -> 3f09ca99 3f07db64 c0ce9905 3df2792e", + "40020f55 bfeb17b5 4067297f -> 3f887496 4007728c bfb1568b be803cc9", + "3a56adb0 3912d92f ba90a931 -> 3f0accc2 3f0ad23e c0d03beb 3bfc6479", + "b96ebcfe 38ef76f5 396a934f -> 3f0ad384 3f0ad410 c0d03dc0 bac6e27a", + "3a78aced 3a88a028 3ab30b9a -> 3f0ada97 3f0adb5c c0d03acf bbffe61b", + "4120529e bf7d3af8 c1943c96 -> bfdb9f04 bfc14c24 3f386ac8 be86d662", + "becf4a66 3ed6d0b9 be232c02 -> 3fab046b 40156a10 be429f73 3e36c3e8", + "3ac62fa7 3c6f5ab7 3b5c870a -> 3f0aa83c 3f0b5ca8 c0cfd74b bc572597", + "be1b845c bc8ed1fe 3e5f399c -> c0020678 bd137e83 3d9b4cb6 bf504d9e", + "c1d81630 c00d23be c1d72536 -> c01fbf4c 3d7ebd09 bd36769e 3ec5b400", + "c00542bf 4022645b c05b083c -> bf702345 3ff34239 3f4c787d 3ecd674e", + "3efde8b2 c109bd48 c10380cb -> 40133390 bf969aac 3f5ccc7e bd1f3c84", + "38a18547 b921e030 b7a82286 -> 3f0ad3e6 3f0ad3eb c0d03dd6 38b9b3cb", + "c286c5ea c2162302 c0bedc3d -> bed88e52 3ebd29a0 3eca4694 bde9fcd7", + "3f691f9b 408991d9 c09eef1c -> c022a64e 3ec0d595 3e50c79c bec9529a", + "3883a685 39a1f018 38a3a0f8 -> 3f0ad3e6 3f0ad3fa c0d03dcb b9a089ef", + "bc5a00eb 3ca9372b 3d3f83d3 -> 3eef52cf 3f20bd14 c0c49046 be9657c7", + "3e12b23f 3d960fc7 3d900f3b -> 3f884cba 3f4000ab c0974ca6 be8712fb", + "c188a721 410a30b8 416c1566 -> bfc8decc bfd79ef5 403862d2 beb922a2", + "3f93792a bf37d2fa bf6506ef -> 3fdd2833 3ffb75f4 40921f22 bde16767", + "380f458e 3884a6de b8e57509 -> 3f0ad3e0 3f0ad3da c0d03dd3 3a488eee", + "c16851d6 c23aab6c 42990b1c -> bf57559c 3ff57b24 bf5b7f0e 3f1080c0", + "c06b1eee 40783687 40dc84ed -> bf975ab0 3e1dc326 3ee77bbe be0c15ce", + "38db4160 b80f20d2 38972189 -> 3f0ad3f4 3f0ad3e3 c0d03dd5 b9e1d998", + "c0e5b024 3fb9e4c2 4123ef3b -> 3d9cdb59 3f1e7c76 bff932bc be9ce66a", + "b94c9a52 b9de7756 3a195a5a -> 3f0ad2e8 3f0ad1e9 c0d03d4a bb87c00f", + "bb83c435 3aab09a5 bbe67b52 -> 3f0b7b7b 3f0a842d c0cff84e 3d355a68", + "c1b69bd5 bf68ff89 bf699810 -> bff34262 404dae4b c06ef8f0 3d32ad69", + "421446e6 c119e8fb 417eb67f -> 3ef58ed1 be8d7bf4 3f858319 3d9ace7c", + "c18c71ee c1cfad32 3f817750 -> 3ffb97a1 bfb2bbc6 c00b58d5 bf097e23", + "3b030704 b94b5a83 bb0f91c6 -> 3f0ab178 3f0ad481 c0d035b6 3c799941", + "b96ef114 362c56c8 ba2a5bad -> 3f0ad4c3 3f0ad3c4 c0d03d4c 3b86931b", + "c18d6c66 c10c8ecf c19a5215 -> bf43d6b6 bfb41711 bf754e5b 3e68efb3", + "40aeab4b c0a636a7 403f22e2 -> 3ed05ebe 3ffd9afb beff0f87 3ec6a6c1", + "c0606263 c1a17080 4192a031 -> 3e2fac9d bfa81f8f bdce4485 3dfbed99", + "402464c7 40075081 c08e8365 -> bfe3ca2f 3fbdf76d bff0dd12 bd4ba762", + "3cab6668 bcbd6e8b 3c74e1bf -> 3f11e1c0 3f003edf c0cd8227 bdc7b853", + "bb27f7b5 3b36ad5f 3bc1d373 -> 3f0a5ecc 3f0b3603 c0d00b13 bd1d1b2f", + "c09e4564 c1876228 41e9a79e -> bf43b2e4 bf13a40b bffe8a98 ba8c2916", + "c0801ea4 40389599 c0622a0b -> bec9a4ba bfc6e014 3ec08c60 3c8e980f", + "bccc9340 3c9d84da 3d208074 -> 3edc130e 3f1c0ffc c0c6f5d8 be81802f", + "c293ff11 c1e85049 c0abb819 -> 3e7758c6 bfc0e4b3 bf95940f bee1a959", + "408b0b6a c0951558 c024f82c -> bfae6a3d bfe7d633 c0357591 3f0c859d", + "3f6e2335 3e170fb2 bf22e82c -> bdf2659a 3f29f95c 40635e4e bed6b363", + "3c6a955c bc4f2d97 3b591455 -> 3f0b9e78 3f095800 c0cf94c8 bca8a482", + "c1811f3b 4244067e c1f6de20 -> 3e9c1d2d 3fc8f474 3fe32c63 3e4cadb2", + "b87773f2 b81c8330 b961b497 -> 3f0ad3fb 3f0ad3f3 c0d03dc8 3ab0bccd", + "c0720f0b bfac11f6 c00bd9ae -> 3fc28fdb 3e070720 bf0b5a9f 3df8ef30", + "382a5685 b9f385c5 b9dc70e5 -> 3f0ad3b3 3f0ad507 c0d03d8b 3b243fdb", + "c230724e c2c36226 417e573e -> bec1ff5c 3ff3b046 40073413 3d9363e2", + "c1912913 c283fe56 c27fba5a -> 4003651c 3fd709e2 3f8cebf4 3f1e472a", + "39da62ee 38839fbc 3997b618 -> 3f0ad48c 3f0ad3f1 c0d03dac bad4bf7f", + "3cb988a2 bccc4470 3c84b7fd -> 3f13185f 3efcf54f c0cd0bdd bdd806db", + "c0fcc841 4133a130 c0937567 -> 3fbccd5d c041968a bf6ecc99 3e876372", + "3c01e21a 3be39790 bbdffe36 -> 3f08f2ab 3f0928b8 c0cfcb8b 3d56f86f", + "b6f561bd 38abdd1f 391435f5 -> 3f0ad3e6 3f0ad3fb c0d03dd1 ba6682fd", + "3fe70ed5 3fc78b95 3e6eb1e5 -> 3e9737dd 3f7d5ede c0389562 3e3467f1", + "ba26f67b 3ab0bab1 3a7be5db -> 3f0acf19 3f0adb50 c0d03bc3 bbc04256", + "bb3ca5e2 3b5b13fb 3b906c2d -> 3f0a7310 3f0b2c7c c0d01cd8 bce8d2e3", + "381e42c0 38a1c06f b8e1e5df -> 3f0ad3e0 3f0ad3d8 c0d03dd3 3a481715", + "c0f6a420 bfc71a4b c1046ff3 -> 3f45575d 3f6a1e25 beb1ec79 3e0b0fd7", + "bc12cf0d bba65169 bb993b38 -> 3f0b85cb 3f0b28ea c0cff957 3cbabe01", + "3f7781f3 bf638999 bd9b3a72 -> c04fd4cc c00f8a43 3ff160b1 bed6214b", + "b8233256 b97d11a2 3a001a6c -> 3f0ad3b2 3f0ad2fd c0d03d81 bb5a5de3", + "b8be882c 3b2e72df ba3c5d3d -> 3f0ad255 3f0ac0d0 c0d03a0a 3bc6e5cf", + "bd19aee6 bd4950bf 3d5eca0a -> 3e9099dc 3e57dfd2 c0ba740a bec26093", + "38b0fd6c b9409cb9 388c4e04 -> 3f0ad3f1 3f0ad3ce c0d03dd1 ba004149", + "bb0afd9c bb041b7d 3b157124 -> 3f0aaa03 3f0aabe5 c0d032de bc8bec75", + "3aed0a02 3ca62af7 3b9bf6a1 -> 3f0a7ba5 3f0beaa2 c0cf77be bc9b0b82", + "3c712d81 bbfb37a8 bb4f2729 -> 3f090aed 3f0b4699 c0cfba1f 3cc762c1", + "4251c459 c122cca6 c263d455 -> 3fc9d26e bedaaeb7 beae3740 3e787ee2", + "bdf81298 3eca6816 3ebd0357 -> 3f9da602 bd7e996e bf2950a3 be7d57b3", + "c0c7a166 40ab6175 3dc03615 -> 3f647605 3e881188 bf908bb1 bdcb60ec", + "c2556fe6 41358a75 c25805f5 -> bf81c7af beee4614 3f58b24d 3d76e9e7", + "3d7db9de 3d218f9a 3dbb55dc -> 3f7a3d0c 3f4c7152 c0a2f9d9 bef767de", + "40431cfc 3e32f58c c1211ce7 -> 3fc1cc3b bfe5a6e0 bfb9c97d beffec9f", + "bc0f5001 bc27553f bc06a7a9 -> 3f0c1901 3f0c5b52 c0cfa588 3d309a29", + "c0c93e3a c1e34ac6 4218a9f6 -> 3fbd610d 3fee80f0 bf4460d5 3ebb91bc", + "3ba73ee6 3bec5ba6 b9994648 -> 3f0a8fc9 3f0a7cd0 c0d01c2f 3c0c84ba", + "3f742929 c022f654 be3e1031 -> bff2c2a7 4028c47b bfad7a80 3f01b3af", + "bb40be57 ba288c87 bb1591f5 -> 3f0af7a9 3f0ad88f c0d033e6 3c537767", + "41814793 40d910a0 c0922dc1 -> be7c28c3 beae3b35 3faabc01 3dbaa4c2", + "3da3bc3f bde4d50b bdc2fc01 -> be5ec22a 3fab24b0 c08cbe5b 3ef5063c", + "c0514522 4103ddee 405c5114 -> 3f360c50 be6b0c89 bdb319ea 3e5d1ce2", + "bb9267c4 3c7addc2 bbcf18be -> 3f0b5c25 3f078ee3 c0cf998d 3d4017e4", + "3e852af3 bd8003c5 beb352a8 -> c0109b31 3fb36d44 3f33e4a2 3eddec4b", + "3a365c44 b99d2bbc b948c50e -> 3f0ad2ad 3f0ad434 c0d03d8f 3abf772d", + "3bb2a288 3b0f7b6e bbc60810 -> 3f09c753 3f0a5bf6 c0cffd21 3d31f56f", + "40649837 4132303e bfecbb25 -> 3f44475b 3eb5c425 3eca38fe 3ea2dee3", + "40210779 c16ab656 c20c25c7 -> 3e36a04d 3f2c1640 bf392ada 3e4b0581", + "3cf7a956 bd8e09ef 3e4fe546 -> 3f555b97 bf3ff08a bf8c1630 bf6786cd", + "c0476d27 c0a4fb0b c0a69a61 -> 3fc05932 4017ae15 bf77030f bedc511e", + "b9d330c5 bb9951f8 3b74e811 -> 3f0abe3d 3f0a44dd c0d02138 bcddbac1", + "39af37f0 bd09d97c 3c148814 -> 3f09968a 3efddfdc c0cddeac bd9c4ce4", + "bf6680c8 3fb0a310 bf9e7c09 -> 3f7f1104 bfdefcfc 3f5b8aec 3ee1a4ff", + "3e122e37 be325fee be4fa1f3 -> bfb02ae8 400dcd10 bf1751b5 3f1411b8", + "c0b49584 c064e9af bfadad60 -> 3f407843 c0112a7c bf9ca91e bf21ed45", + "3e8f7f7e 3e022e92 3e38ecf4 -> 40003e61 3fa6b48a bf4f14e4 be8ec98d", + "bc97b02b bc700e51 3c9f9666 -> 3efdbeb4 3f0126b3 c0cd3fc9 be132044", + "3ca38854 bc9467bc bcc448b4 -> 3ef9509a 3f14f142 c0cc2c42 3e1f06ac", + "39095268 3939cac9 39924542 -> 3f0ad41b 3f0ad430 c0d03dbc bad81005", + "bd55d8de 3c797c0b bce85585 -> 3f291671 3ef954fd c0c7b5a2 3e23710a", + "3c7f5b50 bb0b3912 3b63a758 -> 3f0b83f0 3f0a6828 c0cfc850 bc7a3e2a", + "42614a37 c28e5d8b 429921b8 -> 3e699b55 bfa8c76b 3ffecd0c 3d9793b8", + "babcb3d7 3ab6f847 3a774589 -> 3f0ac937 3f0adb8a c0d03afd bbc9e99a", + "3f14df91 3e24a23b 3dd3cfbc -> 3f67e5c6 bf43b153 bfa4d893 3e1c0961", + "4222879b 42522443 41743317 -> bec71e1c 3f3c9cbf be8bd155 3dff8652", + "bdfbc5d9 be35811e bd703e1f -> 3f286f8a 3f4c037f c084571f 3e135be4", + "408610e9 40eb15d6 40e0f874 -> 3f094107 4026a74e bedddcbf bec37d7c", + "be577b9f 3e676bf2 bc9770a2 -> 3f01fdee 3de8fe62 c03384a9 3d69cc94", + "38c8162f b9c781fc 39488739 -> 3f0ad401 3f0ad34e c0d03dbc bab76307", + "39ea0e4f 3a539972 ba2c0e81 -> 3f0ad13b 3f0acf5c c0d03cdf 3ba23dbd", + "c0247333 c0f9caf8 402935d0 -> 3f714a7b 3ff113af bff8d41b 3f2f01b7", + "3d3592f4 bbc46057 bcf7ab5a -> 3ec19d26 3f0cdd8a c0c81e70 3e599ab3", + "39316e3c 37258477 36f67230 -> 3f0ad3e5 3f0ad3e8 c0d03dd6 384ed978", + "b850dee0 bb8f57d1 bb452263 -> 3f0acccb 3f0b1aab c0d02b0e 3c8cab80", + "bfd07679 3e2e4b1e 3fc82c36 -> 3fa71e4d 3fcdca7e 3ee25818 bde901e7", + "39b5a17c b987749c 390507bf -> 3f0ad423 3f0ad3a4 c0d03dbf ba4be94f", + "bf029657 3d169a80 3d4a10d4 -> 3f8fb3b3 bf4ae76c 3f6fdf9d be8cc927", + "40193803 3f184df8 c02f0363 -> 3fc37bac 401b3ad1 3ff7c245 bd1c2b67", + "3bee3ba8 3c62ec15 3ce606b3 -> 3f0ec0b7 3f13571f c0cc1425 be2df097", + "3fc72bb9 40336f3f c09c5d21 -> bd8cd26d beff918b 3ec109a7 3bddb89d", + "42744e9d 41ab1fcf 42225bc1 -> bf52a9d1 3fdf1eec 4052aeea bd9f0544", + "b9e6556b b833a4ed 3ac68463 -> 3f0ace8a 3f0ad2bf c0d03ac5 bc25c387", + "3f94393c c0249884 3fa83df8 -> beb35611 bfad33e1 401c68f9 bd128ab3", + "b93b189b ba296d4c 3907ddd9 -> 3f0ad38a 3f0ad2e8 c0d03d9f baa9262a", + "4053a0cc 41281c1c c1536477 -> 400bcbfb 3f1dc5d3 3e153eac 3e87896d", + "3dc0c1e1 be04ad04 3dadf65a -> 3f8ecd1b bf0dc760 c08a5fec bedf21df", + "426a1d26 422c9fac c1b22375 -> 3f2e8afe bd91386a 3ed1e74d 3d3b0863", + "bd21e736 3ce7ad81 3d804f74 -> 3e86f300 3f321fea c0b92f03 bec96959", + "bfa19a87 bfaa7411 bf5cd7f0 -> 3fb7b88c 4011ce90 bec776df 3e64f93b", + "be2ac702 3ef455bf 3f1d0c74 -> 401ac9dc 3fa635a5 3f950b7d becf3de3", + "bc5fbb47 bb1c85a5 3cd1bdaf -> 3f0021f6 3f082eb0 c0cc8be6 be324eb5", + "3ad8d33d babf1747 bb051aec -> 3f0aba3e 3f0ae5b8 c0d03676 3c5a45ca", + "40358102 bfcc3f74 3f9ec856 -> c0383c0b 3e0ba0f3 3e9d62ca be58687a", + "c11518e0 40ebcd21 40b4974f -> c028b914 be05a8ed 3f9c51de 3ca5cc77", + "3b72674a baf8a7b7 bab190ea -> 3f0aa881 3f0ae1f6 c0d033f5 3c206c6e", + "3f316e2c 3f5f8a45 bf827296 -> beeea4ea c08745e5 3dd665c0 beb60bb5", + "bf59fc13 c1d6f953 411f3636 -> bf768576 3f8c9672 c0508e40 3f0d6cb1", + "41e25106 c2531147 41c4ba0c -> 3fd537cb 3eb4ec5e bef9b437 bdf09608", + "bcab566d bc390d76 387d59b1 -> 3f08ad29 3f0960ba c0cf4d25 bc91a76f", + "3d1de6f8 3e37252a 3e483b62 -> 3f49958c 401a11a8 bf9a307f bf1ece8c", + "c0c1b294 402348f5 40a323e2 -> bfa9bbaf 3f36e665 bf059056 bd96e3c5", + "bde55b84 3e82e3e1 be9cfa1d -> 3fb89048 c01199cf 3f929d12 3ed11434", + "c19f9ac5 41a06269 c1df94c9 -> 4057a312 bfcf53fa bea97816 bf1482e2", + "3d29acc7 3f18fbed 3f3b2b56 -> bf244004 3fc042bb 3e1e61d9 3e27cd63", + "c2683f4b 41032e7c 42ae25b5 -> be8ead35 3ff439bb 3fc94b1d bed80432", + "c18fba56 41db2225 424fe802 -> bebb75cb 3e9b49c8 3ef52fb9 3e24d85b", + "39f590a4 3783b774 b95aabac -> 3f0ad30b 3f0ad3d0 c0d03db0 3ad44f7c", + "c178621f 419328e3 403c817c -> 3fda266d 3fd2cd2b bfcfef04 bea7fca0", + "bf578240 410a1fd6 418a6794 -> bf8fbed8 bf6661ee 3c38196c be044086", + "bc830d03 3d4ac28c 3d574371 -> 3ee0a54a 3f4461fc c0bed965 be9eaab5", + "bbd23b63 3ce342aa 3bc2b3ae -> 3f092e92 3f0cf459 c0cec0ef bcdc84c9", + "41414999 c123516c c1a69804 -> bf8311fb be057bf6 3d1f0f77 3e083a2f", + "c1bce521 c2b1069a 424ed011 -> bfbed004 bfcc9f7e 3e3a4dab 3d3df6d8", + "3aa92706 39453a8e b98b1f8a -> 3f0acffe 3f0ad2ea c0d03d03 3b25b779", + "3ac2f2e4 be6ba25c 3d062abf -> 3eb57db8 bf0eeb07 c07ed3d0 be5a11f2", + "3d3dfeb8 bdccbc2e be006e23 -> bd78ad39 3fbedab1 c075fb0a 3f202fdd", + "bf04c568 3f005561 bf908a9a -> 3de62e5e bf988891 bfc574b7 bdd941e6", + "3da24b04 c1bb780e 41a25af3 -> bf52cd48 4055ec06 bf816029 be2fd814", + "c0fb9147 408ae4f1 c0bfc280 -> bf56e15b 3f234d1b 3f498b70 bf5c6000", + "bdf12b8e bdd3eaca bddd95c8 -> 3fa342b1 3f958d7a c080618d 3edd4ac1", + "b90c637a b98e2af4 39bdf9d8 -> 3f0ad37e 3f0ad31f c0d03da3 bb28ec39", + "3ff99bec bc6442de 3ed95f0f -> bf8f543e 3f452864 3f1629f0 be5a7560", + "38b8cfc2 ba1e38ae 39aa6167 -> 3f0ad400 3f0ad244 c0d03d8b bb1cea46", + "40a89bf2 c196a894 41a58ec0 -> 4011dacb 4037e6ac bf80455d 3e4b8835", + "bf4a265e bee01554 c076953d -> 3fdcc1b1 3ec9fa1a 3fb98b73 3e4cdd7a", + "3ef0c6de 3fdf2c7d 3fa4c250 -> bf8bf0eb bf2549ac bf8db670 be5e0872", + "bf955ad2 3eaf5c9c bf1c4b0b -> 40a1aedc c00629a4 bf577e37 beacd459", + "b92313bd 37c75f49 b98b2c6c -> 3f0ad428 3f0ad3d9 c0d03dc0 3ad9132e", + "40d822c2 3dd73e9a c061f941 -> 3f42e02e 3f15f077 bf41507d bcad0d5c", + "c051dfc6 3f580209 40e1032e -> 3e19cdf6 bf9d4e70 c01ca56a 3e954dc8", + "c0e89ca6 4030e8c6 411f3807 -> c012162c 3e7d6115 3f28122b beebdb1c", + "399995f7 b988fa58 b8c727bb -> 3f0ad3ad 3f0ad40c c0d03dc7 3a266f0c", + "39ae4560 b9563550 ba9398c7 -> 3f0ad0ed 3f0ad517 c0d03c25 3bf2644d", + "bcc1306b bc278ba6 3d6593e3 -> 3ec4f999 3eedf0db c0bf3c1e bebe3cc2", + "3c554102 ba06e699 3c01b623 -> 3f0cf3ad 3f0a79c9 c0cfac74 bd36eabb", + "3f647e41 4102222d c0a1b216 -> 3ffaa2b7 3de9cab4 3f6bda71 be66d2f9", + "b9fa7241 bb6eb82f bb50a113 -> 3f0ad674 3f0b13c7 c0d02c0f 3c97600a", + "bef98be2 3e16f7ec be9cba48 -> 3dfbe2ad be555e54 be34e34b bc87328b", + "381c5e7d b8f15b38 b8eba87b -> 3f0ad3e1 3f0ad3fd c0d03dd3 3a349c21", + "394d482e b866d4d5 b77e51c1 -> 3f0ad3df 3f0ad3ea c0d03dd6 393770a6", + "b841dcad b8d62385 38815186 -> 3f0ad3e2 3f0ad3da c0d03dd5 b9fc85ff", + "39b4c076 b93fd06e 39b9ffaa -> 3f0ad4a4 3f0ad369 c0d03da1 bb118ca8", + "3b3c5b14 3b13f428 3a886263 -> 3f0adbd3 3f0ad93e c0d03723 bb82ad5b", + "bdc4a717 bce034e5 3e13636d -> bf5aa5df 3d6b91c3 c048f4a2 bf476aae", + "4032ba39 400b6849 3ec6c66b -> bffdff76 bec77748 3d664251 3d533e52", + "400cefdb bfc4f810 3fd166d2 -> bfcea9ee 3fcb80c2 401c8c81 bf1b6f0c", + "3e16dc87 3e070418 bde87c7b -> bf9478f9 bf802d92 c0420b9a 3f12e5dc", + "3abb67e2 3b0c9fe4 3b7e7346 -> 3f0af0b5 3f0b0238 c0d028b6 bcbf103b", + "bf8939ab 404e98e0 40818fa0 -> bfa5474e bf109619 4008691f bf2ff106", + "b91bf860 b6ca7145 38bb68f4 -> 3f0ad3cd 3f0ad3e7 c0d03dd4 ba2e79a5", + "3d0951cd 3f41c4ed 3f192e5a -> bf598f65 3eb92fbf 3f486129 3e95352c", + "3a8a84e2 b9b871ac 3a1559b1 -> 3f0ad727 3f0ad23d c0d03ced bb59eace", + "bb295578 bc4cf6ba 3c6f82b8 -> 3f09519a 3f0520ad c0ced7c9 bdd2f469", + "3d6536f2 bf016881 bf0c01e7 -> c03b0915 bf8c3b5b beb5abf3 be05c1be", + "3c8a6e9e 3d11ecf6 3d486ef9 -> 3f1a1752 3f2fcf84 c0c2a561 be8fd289", + "3ea93a26 bf39d6dd bec55819 -> bf417c7f c01ab0bb bf69c2cf be889859", + "3b224e98 bb07b941 3a763d7e -> 3f0ae001 3f0ac3e9 c0d0384f bbc1135a", + "422538d8 c1bd3985 c225c5d2 -> 3f7d6d07 3fba4cc8 bf154ec3 3e9437ac", + "b943f7d9 b88d1dbb b84bf8e0 -> 3f0ad3f1 3f0ad3eb c0d03dd6 393b5cf2", + "bf8843e1 bf8fd530 bf763afe -> c0146162 3e9cafb9 408530c3 3ed50981", + "3b0e0ed9 39038575 ba62e22f -> 3f0ac2bc 3f0ad176 c0d03abe 3be14db2", + "3ebf4580 3ea99e52 b8248426 -> beb83ddb bd9cc00e 3f652ae3 3d410b86", + "3905ad80 371de0e5 b91a3d56 -> 3f0ad3c4 3f0ad3e5 c0d03dd1 3a87378c", + "3e3656d3 3e5daac6 3e65c83d -> 3ffdc219 40223ad6 3d2a3806 beaacda5", + "bf5c8b7f 3ff385a5 bf7b5a31 -> c04c0ea9 c0712f22 3d36cd50 be14335b", + "c10c0218 c14e11f6 c10f4ac2 -> 3dae79f7 c042df1d 4059219d bee5cb71", + "408cafbf 4140b7d6 c1816b70 -> bd3b3761 beec588a bfa23489 be0178c4", + "3cdfeb83 3e9a69bd 3e949d2c -> 3f596b51 4023d18e 3f88a302 be8e74c9", + "c28910be c2932c51 4275a018 -> 4034de45 3fadf212 4047a529 bde8d9bd", + "42136288 c240f172 c12da3b8 -> 3e158bf7 3f9fe3be 3d3f50a6 3e065818", + "c0a6fb79 c18e69d8 3d57412f -> 3eb6fd58 bfb6614d be8bd564 3e2c3890", + "3cc14302 bb0a6fd9 3d00a1bc -> 3f1b9140 3f077720 c0ca9b1e be42e913", + "41a60d44 4207e949 421a36b8 -> 3fa3add2 bf5c9c77 401a511c 3f3a65e4", + "be26c25c 3e0ff494 bd81490f -> 3f8e348e be985ffc c07dd8e5 3e859f87", + "b9cf7e58 38f3a2c9 b8d3e203 -> 3f0ad413 3f0ad3cd c0d03dc4 3a049baa", + "bdc42b12 c00eee2f c01e5e8b -> 401a52f5 beecaf55 3f63d429 bf12ae5b", + "c2a21ece 42c047aa 4203b96c -> 40343624 3d1d3a7a c07bd70b 3e5098de", + "bfccb0a6 c00d6829 c0945d25 -> bd7e6408 3f8eab48 3eb6146a 3e0d7e6c", + "3cd7483c beb04ce2 bee8a82f -> c00646c2 3f87dea4 3f92f1d4 bc590368", + "4093bc5a c20604a5 c1f5a067 -> 3edc28c8 bf8cf6d2 bf7f3f03 be9da056", + "bba00370 3aef3dbf 3baf613e -> 3f0a0946 3f0b09dc c0d00c75 bd156331", + "42a2fa0a c2c62a53 c2006bc7 -> 3ed1b532 c000f36a bff71b19 3ee9f596", + "3e0c0751 be40547e bc55b794 -> 3e821e1d 3eed79cc c0835c15 3d142461", + "3b182dbe 3b5f6625 bb793a5e -> 3f0a8728 3f0a676c c0d0228b 3ce4226b", + "3d78d361 3c7fab5b bd187a7d -> 3e815264 3ee6e90d c0c248b8 3e8b265d", + "3de06f13 bdf6714f bd9c2e29 -> be93c7b1 3f980eda c08fbf0e 3ec03b3f", + "40be9dc5 bf89f357 40b315ae -> 3ddddd14 3f9035c7 bf84ff94 be5b2ff7", + "c1ad80d9 c1881c94 c02a1f10 -> 3e91ead6 3f936d46 be96a332 3d04242f", + "bdf50031 bf9e69e3 bfac5806 -> bff38112 3fa7770d c00f0c80 3f33c234", + "bf66069f c07b6dea 40789521 -> 4021f2d4 bf3e371d bf827efe be9e3aae", + "3f15e6b3 3f191b76 3f752752 -> 3f9d60c9 3fb25301 3f7c6d4e be4fdd50", + "b7fa333a b68b5968 b8e371e1 -> 3f0ad3f0 3f0ad3eb c0d03dd6 3a343a87", + "3e14dd09 3b456b45 3dde343c -> 3fccb3cd 3ee00983 c082420d bef3edb8", + "be7a3fea be83c45b 3d93db03 -> bf63319e bf73926a bfd5bf01 be641a8c", + "baf68c4c bbdd4e11 bbb9ee93 -> 3f0afc5a 3f0ba102 c0d0032f 3d03faaf", + "3b350d7d b8f3d00a 38c44379 -> 3f0acf57 3f0ad1d6 c0d03a97 3a588bf1", + "ba6dc130 bb7725fc 3a8c525f -> 3f0ac647 3f0aa9bc c0d0359d bc1bb1a7", + "bdcf5659 3de299a9 bca63d38 -> 3f247f93 3e74548d c0ab63fe 3de8dc4f" + ] + }, + { + "glsl": "vec4 cultmath_snoise_grad(vec3)", + "tolerance": "ulp-bounded, coordinate bands 1e2 to 4e6", + "check": "Read at the case's point x, with S = |x|_1 and (e_n, e_g, e_h) = math.span_slack(math.span_rounding(1, x, zero stage, 0, 0, 0)), against the kernel's exact values in double: |n - n_exact| <= e_n and |g - g_exact|_2 <= e_g for snoise_grad, ||H - H_exact||_F <= e_h for snoise_hessian, no tolerance. Report the largest fraction of each allowance per decade of S and the largest absolute error at S < 1e-2.", + "cases": [ + "4343cc14 43796616 43109168 -> 3b1cd060 40097e09 3f7ff10f 3df831a0", + "43071f14 c257d861 c2b2f4bd -> bf9d3059 bf986624 4014dcba 3e7892f6", + "44e377cc c505812f c28e8bb3 -> bf61ea25 3fca51e3 3f90c69a be3a06d0", + "c3f8434e c3fd675e c3f2af40 -> bf8da2eb bda87afc 3fe04829 be5f521e", + "431fbc2f 41ec0d13 c30ad19b -> bce1967b 3feb9b97 bf4204a2 be2cb510", + "492aa582 48ca5bfa c9571f5b -> be87fd79 3dc290aa 3ed79dcc bc4120ea", + "c5e9267b 4792dba9 c772c0cb -> c02cb8da bfe56a50 40242a2c bed316ce", + "c4164a29 c439044e 4432c807 -> bfa57ef7 bff5407b 3fb8655f be80456f", + "c94f1b94 48630ae5 492d38b7 -> 3ef14e92 c02dfc1a 3f1f693a bf0ae28b", + "c6844f4d c6049223 46981cca -> 3f278b99 bed57794 c0949336 bf0312a5", + "48ea344e 48b6d586 489e0d05 -> 3f4fd335 3dbbba44 bfac1c46 be3a686b", + "472ac560 483e8364 c85c5bf8 -> bfd860c0 c01943af 3e3b739f 3eafb008", + "c679eeac 444750af c6901a9b -> 3f261106 3fc3a263 c01a3df7 3f15137b", + "4648d22c 44ec087e c6267df3 -> 3fe4bd21 3f4f7054 3eb111fb bf347297", + "c91a4ae0 482ea4c3 c8eaafe2 -> bfd786c5 40a5997f bf35e9a1 3eba5c83", + "c4a3bcc1 44061a3c 44765b59 -> bf8f8b68 3fab1d3d bfe183d6 bf2aa2df", + "c5c84f12 456218de 4593058c -> bfe4217a be294c1c bf91521c 3ec92ede", + "c5b75b92 472c3f03 467ab79f -> 3f896b0a be06939d 3f6e9253 3f05465d", + "c3871fb4 c3106791 430f8685 -> bfa0938d 40050b63 3fff292a 3e4d987a", + "49ded858 495fd66c 497ad463 -> 3f3a1723 3fc3a07f 3e252e85 3e20ca3c", + "c7e43b68 c6b266e9 c7e28bac -> bf865118 3fb74fca 3fce2cb9 bece6c44", + "44b16674 4446538a 44affc51 -> bff2db2a bf0b0081 c001a8a8 be6e07ed", + "472af3c1 c86a1881 48148f67 -> bee237e7 3f82eb28 bfed525d bea58527", + "4a05d6bc 47626172 c84a5c01 -> 3e3bd2a5 c00e71f7 be8d4f56 bd05ea74", + "c5e2983f 47024c74 c81b7497 -> 40197893 bf87cb2a 3f95ab64 be56e2b2", + "c8b3049c c7e5436e c78183df -> c0b3d479 bfb7a6d3 bed3fc31 3ea670d3", + "4416bae6 c584d7e5 c52319fe -> 3e8d76a6 bf9f030b 3f266c88 be2e39df", + "c5eee7ce c38f9989 4570d916 -> bf3829da 3f28c072 3ee15f87 3e134e79", + "c951d297 c91ef8a0 c9860b4a -> 3e5d83cb becdc569 3fa7254a bd038ae8", + "c95c20ee 4812362d c95bccf8 -> 3f9f6a79 c02d18ee bf1e02d1 3e9049df", + "c59a0b11 44cca02c c5349204 -> bf1fb881 bff43b02 3e26b52b 3e6013d2", + "c31be6e6 c3de7d7a c396d2d6 -> 3ff8741e 3d2e8b69 401f98c3 bf22a095", + "c6c5e596 46280f95 46212b60 -> befd4bd7 3fccc901 c015ffa6 bd897e7b", + "c9d1e7c7 c83521b3 49ae4248 -> bfa26c27 3f531360 404f546c beabbe93", + "453c4a2b c59c02ff c38a5846 -> 400cca68 4039c950 3dbce341 becfdae6", + "c263de90 c2b7dace 4341eb6c -> bebdf2aa 4004cad4 40a32106 beafcb6c", + "c3884b99 c3e4e982 438079da -> bf7f0048 3efd4ff4 3f40a4fa 3b2220e9", + "4480a751 45144088 c48c3583 -> c01ed8a6 3f3fdd24 3f706d92 bf26585b", + "4401a2c5 c3aaf35d 4320a90b -> 3fc4ae8d c01a0062 3f8975ff 3e6fc315", + "c30ba073 c4982a5f 44b8ab80 -> 4050d5b5 3eba24cd 402c4fe2 3ebac543", + "49e27467 4978cb2d c8ad5f44 -> c0b244e4 3f0c2b01 bf24a44d bee3c5db", + "47edb09f c7fecb63 4531195e -> 3f802d79 bf74f92f be919ecd 3daf9ff2", + "c2f99af2 432d322f 42a61515 -> bdc31389 bde4a487 40837d1f bf3c7083", + "44481785 c36e1791 43943a04 -> bf9eeffe 3dac3e41 3d4a5af4 bce877dc", + "490b570b c87d5fec 48de4079 -> bfbb02d5 3fb787b3 3f60456f 3e688523", + "c2f0d9d2 c2b47c84 c3a65ac0 -> 3f9d8157 3fdc98c8 3ded50e3 be6caf77", + "49bac5af 49ecb7a6 480428fc -> bf14d261 bfc811d8 c013f9f9 3e0fa1fa", + "43225d73 c40c7eb5 c3401072 -> 3e1c52c0 c000059f bff11fa7 bf15fba3", + "4080cbb2 c30bd809 4236215f -> 3f35fefa 3f8e720e c0349f82 3e93a5c6", + "c2d51f10 c34ebf77 c245f96b -> be4c8770 3f3b9136 bf71e087 3ec34da5", + "48c27cdf 492ec3f2 4792d8c1 -> bf19fc82 bfaff450 3ef28880 3e91146b", + "453a7d0a c5d0b118 c67474cf -> 4001f9fd becebd0e 40080cca bf281124", + "4822c837 c8fc29e0 48b9348f -> bf81f109 3ea52fbd bf5209df be13f5c3", + "c63e53ba 488cc074 c8e71e59 -> 3f419cce be8af055 3e35b8c8 3e44afbb", + "c534bbd8 c6e4dce9 45f18eae -> 3e61e718 3eecaa6b bea8fd77 3da84d12", + "45a8508f c69e8a3f c74cc8ba -> bf6c1548 bf80cdf5 c01aea44 3f154c04", + "47fe4b3e c891aca5 490ff824 -> bf491492 3f3a6ddc 3e964c77 3e92ca7d", + "46e2a669 4725167f c7c806b0 -> 403633c5 3f14f54a bd83dd00 3d522d16", + "c40f9164 44705482 43ac2e71 -> 40527dee bed83b4a 3e06359f bf10da8d", + "c992a01e 49711cb0 495d4fd6 -> 3f69cd2a c0591c36 be319969 bf03e534", + "46b792c7 c69bb99c 470510ce -> 4005a64b 3f96939e bf0b38af bde4ca15", + "c5fecc92 45ec83bb 45568995 -> 3f3c5110 402ed497 3fa5c14b 3f235196", + "c47ef300 4519083a 460ddd37 -> be9e3241 3ed25cc6 3faa7359 3f537843", + "c2147f1b 436bf75d 42d3503f -> bfa5b582 bf99050c bfa5dfb9 3eaf7209", + "49998f67 49903db1 c934def0 -> 3fb99576 3f9c5aaa 4038c8eb 3ea9477d", + "499156c4 48770112 49a469c2 -> 3ff4dc3d bfba4c11 3eb27655 be83f2fd", + "48e12941 48a13b7d c8eb5468 -> bf85e7af 407489b0 3f802d41 3e3deb26", + "42cdeeb7 c28ebf2b 427dccc9 -> bf585238 3f363a2d bf113dbe 3be2d808", + "c63301d9 460f0036 c65a2395 -> 402b0986 bf50c518 bf89ef3c 3e951824", + "452a3f03 c4194bab c5826845 -> 40143e30 40139aa7 3f9beeab 3e212dbf", + "c497e9b7 44b1295f 4502dd01 -> bf2b65e7 bf332cb4 3fd30cda be9aaa44", + "c508309f 444a88f6 c535b01f -> 4011c237 3f09460a c013c487 3dec646a", + "44bdef20 452076be c5b4b84c -> 3f356e08 3fa3e248 c01275db bef961cd", + "c2ed4d29 4233ed0d c30e2c29 -> bfa7a898 3f290656 3f8c77da be8d1bef", + "c52a5742 c551515b c593af6b -> bffd8218 bf38111a be5118f1 bec6c9a3", + "47380f06 c6e1a99d 47279d03 -> c08a79bc 3f4c547d 3f6813b7 3e3de881", + "c3692d66 43d81edb c3c395bf -> 3f043455 3f676059 40000b79 3e4d123b", + "4699d643 c67a50ec c664b822 -> c01bfff6 bf153334 3e18cd0f 3f043b19", + "48ee785e c9491c16 c97ebb3b -> 3f83221b 3f8bb495 be78c339 be5ffec4", + "c2cabebc c48d947a 445b46b8 -> 402c860b bf9fba92 bf0fcd6a 3ba824c0", + "4a20310e c9ceeddc 494e9bb3 -> 3f05b4aa bed3514d c0638787 bf39fa48", + "c540e1f0 46a6764a c6322ced -> 3f908695 3f0fffb8 3ece8029 3d87205c", + "c48841d3 4349e697 4281c9d8 -> 3fe51615 3fd0c98d 3f966248 3e58d13f", + "4958f7c9 4931728e 495099d1 -> 3e25b44d bfdfdd0b 3f943f6c be273fa6", + "c95a893e 491436af c97de425 -> be26ed34 be6cd8c5 401326b5 3ed60cdb", + "42f53da3 429dc1ae c2c9f02e -> 3f73a115 bf121439 c020ae3a 3ea80e42", + "49c4c085 ca11d2d9 49db71e0 -> 3f9d78e8 4008ada6 be491477 be8f559c", + "481c2cba c7999bf9 470eedcb -> 3f5c7dac 3e242b42 405baf93 3e845385", + "439fab7a c3716c01 42318eb3 -> bfdd952e 3ecad339 3f524763 bf4ffde0", + "481040cb c7b847d1 c8166a3e -> bf8091db bfc372c2 3f10d3b5 3dde5458", + "460d5272 45639667 4593c3b8 -> 400af6d2 bf906042 3ecbe204 bf036ca6", + "c7aa524b 47eab25d c692e601 -> 4037217a bf9c0185 3eb65ad6 be27c4c6", + "439e4d51 428f5fcf c3939b36 -> bedd0677 bea77457 405c014c bd560f46", + "c99a6142 4a1fcbc5 49b95962 -> 4045ac4f bfc4bc3d bf1714e3 3ed4de45", + "c59b3a33 47410a18 4665686b -> be3be8a0 bfcaf4c8 4000e058 3e638044", + "4a3b2b6a ca3f9be7 49f18513 -> 3f4ae1d0 be55e3ec bf828c2c bd03544f", + "44092d25 c2b6b55a 441dbfae -> 3feda63a 3fdb162f 3f9d348e 3e62d20b", + "42e0ea4b 4395b242 4296f6d8 -> 40004f5f c0327931 40735362 3e414fdb", + "c7135807 4665d805 4676490e -> c02aee6c bf72eac2 becde5b5 beb0b574", + "c4418611 434dcb83 4386edd8 -> bf31cd9f bffa418c 3e7ee173 3ea4816d", + "c2ceeec6 c2d7dadc 427af725 -> 3f13cc4a bf5a4577 3f477b8e 3c2e0efb", + "c5931169 442f25e4 46322b01 -> bf607579 bf8ad53e 3e7805e6 bcf16007", + "431f658b c288ddd7 c3374359 -> bf92f1cd be11348a 4008c975 bf1a68f7", + "c9b48d7e 49b09499 c96b1b9e -> 3deaf3e7 c000893c bf0a7cfc befcb6ce", + "c565f034 c5f7fd63 43977c2f -> becffd08 bf8d9d06 bf0b82f0 3dfc3a12", + "ca3ad030 49c15c61 497561b9 -> 400b813f 3f61da3f bf6aa471 3e752f64", + "45e9af8f c5700eba 43e70d83 -> bf117cbb 3f98592b bf829cab be5b7903", + "4521f705 46ba5192 c5e6a781 -> 3fe48294 bef65e44 bf4e33f6 3e368861", + "42e62e14 445ea28d 44781f2e -> 3f4ba033 3f66e3b5 3d5a9e1d be84e55b", + "486e1b0b 48b2e602 c8b13541 -> c016078c c01373cd c0491dfa 3d82a3ee", + "476c7a31 46a25ceb 46cb2248 -> 3ef5d6e7 bdc6eee6 c03747df be3e9cad", + "474cdae9 472ad5f2 c636465b -> 3d3371f5 3f2219d5 bea1c6e2 3d1d3755", + "c5391b9b c6396deb 45eec175 -> 3e4f9aea c00ae7ea c03727da be38fc0d", + "49fcc0c8 48eb69f3 49d2ffa7 -> bfe52c12 3ed9c4d2 bfb98212 3e1c4117", + "c95e4b8a 48dd8bab 496f6943 -> 40043a30 bf3d4a7f bfcf494f bed06005", + "c93009b4 4a44304f 4a618b3c -> 3fc959c8 3f90e848 3f20a57d 3e29547a", + "4633cb43 44603fe2 4694e7ce -> bfcb8e5c c01c2b2d 401a7c7b 3e87ee93", + "43a28bae 43f7ee57 4294b163 -> bf66a173 bf7f750d 3f2cd678 bda438d5", + "461f7350 c5cf5b99 c5029069 -> 3fd18532 bedb7a55 40141835 bf17b06d", + "465cde5c 4613fec4 c7138bf7 -> 3e55b8f7 3ce6fb8f 403b13a0 befed5bc", + "c78a59e1 c7995c3b 470e3037 -> 3f91971f 40709a2a 3ed2efcf bf1710a0", + "c6234ba1 c485acb2 4417ae72 -> 3ecff13f bf5c4315 3fc5bcda 3cf357ea", + "be16242a c2278f43 42e048de -> 3e9077fe be10acd5 3f64cf0e bdc6ffbd", + "c8692e19 46b13282 c796c16f -> bfae09d2 40319043 40570906 3e8355ae", + "41a94c38 42df0bfe 41de39d6 -> 3f64f499 bf9b128a bc301207 bdf7931d", + "4765dc32 4786ac3e c7942cb9 -> bfc6a530 c0099d62 bd034069 bedb5ae7", + "489288a1 c7207c66 4526a949 -> 3f53c7b1 c0105924 c0006a37 3e2daaba", + "49dc25fd ca0711a9 c943b1b5 -> 403a7cc1 3f63f000 c0970913 be40a3b1", + "ca0d0211 4a475f8e ca6ce3c8 -> be6cd796 3e8ae59b bd1c0ec7 bb7623e7", + "c5961774 461efa40 c6334587 -> 3fa640cc c019f0cd bff975d6 bec3ae8d", + "4630987e 4654050f 468c81f4 -> 3f859277 3e6d498a bf8d4e2e bd96d2ec", + "c74278f4 49ac087a 48947877 -> bf57971b 40158dac bf82b36b beb31c35", + "c2aae27d 431dfa43 c18f7c11 -> c024c449 3f8e4d1d 3f7a1a5c bee6037b", + "44815e2b 4528fa38 44b52e09 -> 4076bd08 bdb5b1f2 be820acb bee7e146", + "c5368e42 c5315f0a c412f252 -> bef1db72 bf3f9303 bf952b19 bee2edcb", + "489cc094 47f80ff2 47a33ce7 -> bec13623 3e52cdb2 3fcbb10c 3d82b9ed", + "4402041e c48a92be c42d3c10 -> bffd3ef0 bfa168a3 3fc6b6be 3ee953dd", + "c985805b 48565324 481daef1 -> c0102598 bf65c213 3e6cb109 bf0e99a7", + "45d61f31 45a9c803 455220ba -> bfc1a998 bfdb2481 3f8a6ef6 becdd0b0", + "46ba739e c7038ed3 475209f8 -> 3fd7647f 3ec1c5b1 3ecf1ce8 bd4b807a", + "421beda6 c4dd4810 460c4a3e -> 3fdb0399 3f74616f 3ed576c9 3b2fed4f", + "c7bdcc6a c7584969 477dad3a -> 4034d660 bf64b45b 3feb2f4f 3ea7ec92", + "c412b018 c3b0256a 4442e6b3 -> bead02bc 3eb5ed2f bedcfe2a 3d67b5e0", + "4829b727 c733bde2 c7304b6a -> 401ad51a bfa9acc5 4012460b be991622", + "478ec0f8 47784842 46bf8985 -> bf6e1702 bd8a8900 3f0ea716 3b98396d", + "430127c5 438fddbf c3d173b6 -> 3fa9094b beb72231 40071ab8 be8f83de", + "46055473 44dfea69 c6a16d3b -> 4022e575 3ecc5010 3fa1f59e bef18160", + "44988376 46132a65 c59af14d -> 3f0723bb be8f1fbe bea5eeb7 bc7bfef7", + "c7f79eac 48433b64 48933c65 -> 4005be10 3fdfee75 bfcbd500 beb610f5", + "c3292c56 c33dc4e6 c284f8ec -> be3808d3 3e901e51 3dbeba4f 3e3369ee", + "466d59cf c5743ddc c6767d37 -> becff687 c06c28ae 40031096 bee3e10d", + "4803145e c81b52dc 490b516a -> 3fd40532 c0760008 3f71bec4 3dc75915", + "459ea6d6 47c4e47b 4819d456 -> bf828bb0 bfc27d60 4003b4b0 3e8150a0", + "c3f36e19 c31482b9 c504e37f -> c005208e befa6bf1 3f67ef7a bddb2cf0", + "c601af24 c64ecf86 45a2e989 -> 3fbfa6a8 3e53ceba bfdd3a0b 3eca6fd5", + "c5a0c5f6 c5ab1187 c5f9d800 -> bf544801 3e1c1d1c bed62283 3db70ccb", + "4214a749 c53677ba c4c7f0d6 -> 3f9603ee 3f9e151f 3fec9ccc be07429c", + "48ab97e8 c5eb0ba0 47ca8d3c -> bf899846 c00c57a7 3fcb2df5 3ee654d3", + "4546d977 c519e40e c52c9a13 -> bd9373bd 4021c680 3f4bf014 3dbdeb4f", + "44ce52d5 c59448c2 44991e00 -> 3f83b388 be8d1a3c bf966fc5 bcb2dd2a", + "c88b923b c891f5e7 c8b74f42 -> bfa18ea2 bf8adef2 bfc1faa2 bae94a08", + "42fe1413 430421af 42c726f4 -> bf9ce0c5 3e1227f8 3f965656 bdf05f90", + "c723d67b 47185af4 45234bef -> c036f856 be539607 bf89e2cf bef443c5", + "4470b05e 44bff11b c34eed00 -> 3fc922c5 403c0757 bf919004 bd41c482", + "c683744c 475775b1 4755034c -> 40093be8 bf18d6c1 c01ec966 bed55204", + "48c1563a 497f4b1a c895c893 -> bdba1eb6 be33768d 3fac6014 3df8947c", + "c8fb502f 4924be5e 48f1e451 -> 3eab6cc6 3f9551e5 402aa54a 3e82e4a6", + "c54eb0ac c7006f1f 4637168d -> be342829 3fc98106 401db573 3f1526b0", + "4408487f c44c92ca 42b4e43f -> 3fb0821e 3f3cde4c bf42096a 3c11cb87", + "c73653c2 46b5834d 472cac24 -> bf348656 bf809c37 3fd5a0ef 3f07d8ae", + "c67daa2b 4584dac3 4608ae0f -> 408e14de be90425f bfff3e1a be9ca6d2", + "c55cec43 44b04863 c5c2dca6 -> 3f9cd706 3faa201c bf27cc90 bae514c2", + "c22a1670 c2ef73cb c3428227 -> 3f9e034a befee843 3fa3b8f2 bd909996", + "43661298 43419b0c c389c116 -> 40313e94 3e9a2bc6 befe6a10 3e6c1239", + "c5167e67 c51694b9 45ceddaf -> bc723458 bff68215 bfb8cded bec68f75", + "46c32720 c70813e9 46c092f8 -> bfa6df1c 3f85a511 bfd4e1ef 3bd77695", + "47b06e70 c6179b64 c6bb33d2 -> bfe5f5b8 c002276d c0122c54 3e8c6373", + "439ea8eb c58f09f0 4501672f -> 400d797a bf7ec213 3ecc504e 3e98fd17", + "46249997 c4823e2e 4643a1f0 -> 4004016a bfca4e7b 3ed472d2 bee5c1f7", + "c7c7fa6a c885320b c84d87cb -> 3f77ef54 bff6d9fe bfe98998 bedbb97a", + "c577e679 c3e13639 4278d832 -> 3fa65f82 3f959f97 c0101e0d bf4f45d8", + "494ba382 c94a091f 4827b6b8 -> 3f48bb1c c069869b 3f32b712 bf12e3a4", + "45d9943a 45769ce3 466e4a9c -> bfe42a8a 3f196909 3f2a2950 bdd746b2", + "44f48464 456ae647 c5b4555a -> 402eb750 3fc1190d 3faf5b2d 3e8d823b", + "47b92b4b 47b2007e 479cfee2 -> 3f9135cc c008227c 3eb8dbdb 3f4bb2ea", + "4584020c c44b4bfd 4509d1b2 -> 3f8f0489 3fd4e0b6 3f771d43 bcd3b626", + "48f36300 c7d3788a 492c5f26 -> 3fe5c4b2 bf5b18eb 3f847fae be31676a", + "4a06906e 4a3eae3a c96489e8 -> 4005ea19 c05f30cc 4085ea15 00000000", + "c6601f68 43644ff2 c6ac479c -> bfbe5609 c00dfa87 bf1160f2 3e1017bf", + "c9584e57 c945a37c 495cae85 -> 3f3ab683 3f1dcadf 40681572 be9e19eb", + "495d508a c93043a1 493e1c7e -> 3d363640 3fb2024e c037d860 bf049d73", + "479186f5 478dfd71 c82a7a6d -> 4008d2a7 401beb68 bf63440e 3ef31f92", + "c9101484 492f647e 476c9acb -> 3f74c705 40a3d198 c00c61d8 3e8ddacf", + "c9674513 ca0e2c9a 49bc41bf -> bfb7fd9e c00e1a83 bd486ea6 beb05b77", + "c61e242f 46c10852 4722be67 -> c027a757 bf494c7e 3f0fbd04 bf22fb14", + "c4267ccb c4a3b6c9 c497de68 -> 3f6dd6e5 3f19e48d 3fe84eab 3eb5b8e7", + "c41b4a87 c42b77e1 c2e9ec34 -> 3f20c7a5 c017cfc3 bfe6acaf 3f1b7aed", + "c627ee77 c4a3248f 448918c1 -> 40322eda 3e55c317 be42e0de 3d0bd72e", + "c907bd2e c9b9ee06 49ac907c -> c0099887 bf4e45a6 bfcb66c7 bf09a293", + "c2e0f51a c2eebf77 c29de3e0 -> 3ec97625 bfda8b04 bdb123c6 3e13dae0", + "48160e7c 47bb4c91 476dcc52 -> bec8ab90 bf805c9a 3fa632e8 be8f1858", + "49c55692 4a237926 49e478b3 -> 3f741ad9 3feac4e3 3f8a1b6b 3d55280c", + "44920282 468542ab 45f54a7e -> bec170f5 c02d2adb bf7292f8 bef5b98c", + "c68c06c6 c6161be8 c6915341 -> bf88f1bd 3dafb9f3 bf469553 3eb6030b", + "458f34c7 446eb3ee c425b64f -> bf7b4e9c beb46def 3e373f6c bd1469d4", + "c6152228 4564ab8d c618eaef -> bf244b89 3daa7835 3f295c31 3c29b766", + "489a1386 491e5176 490e58da -> bf63e32f bfced33b bf9c2218 3d2f7247", + "ca3a7add 4a53a8ed c98b2aae -> 3fc0e644 bfa4112b bf7af946 3e3ef88c", + "c9266f94 48d93896 49c30136 -> c02faf19 bf1cebeb 4089973b bd0aba87", + "45bbdf08 c799df3f c7274ec0 -> bf5f752a 3edcab71 40642ae4 3db3f6eb", + "47a02803 499130bc c9108eae -> bf60bf38 407c5657 bfe52335 bea58e48", + "47173c6c 473a7d59 c79577a8 -> 3d4609ac bffe594b 3f4a9099 be9bf33b", + "c4039422 c294b99b 43d61a41 -> bf4f3454 3f12d4c3 bf05edbf be88312f", + "c78e329d c795c8c7 c3f3084a -> bf9a9b0a bfbb6be0 3fd0a3db bea6f21d", + "48a298d5 c7d5126c c7c9bf00 -> bfed30f3 3ffbf21c be93de9b bf2ced11", + "460f3809 c4d70868 c583a22c -> bffc9353 bfa8c788 befdb546 be07fa75", + "46808906 461bbd53 c7087c4e -> 3e5c8de1 beccf42c c00ffbef 3e8f5224", + "450f0874 c403c5c9 450d00ae -> bfb9e2e8 3f623f63 bf948a0f 3d703c24", + "492c4d72 49c18724 c74f5e1b -> bebbd4d1 bf432453 3f845b1b bd825f08", + "c1cd1101 42e655f1 c2cf89ea -> bfc6d2a1 bfac4912 3ea0c752 3dc46622", + "c24607af 42e2d20e 41e7d53e -> 404483c8 3fe7f53c bfb295dc be5c1e53", + "447647dd 449f4d63 c39f5d3c -> bef0d342 3f8d4b80 3f94539a bf684dc2", + "c37f64e3 c2bba05a c359d9b0 -> bf8a125d bea70b28 bfac8104 3ec48b82", + "4508140d 4579aea0 c5140091 -> bf5e8ef5 bf9fe648 401fa59d 3eb5e8c3", + "c907afa2 49075bed c8dc2abd -> 401c40ca bf3b0cb0 401c5cec bdc3fc1c", + "3f68c3b2 430fb8ff c204720c -> c0511fb0 c0224e5f 400a30b9 3e705484", + "4295bf4c c2a1588f 435f49e5 -> 3fc45597 3f7dc2eb 3ffac375 3f0e2827", + "45ee7eba c7c5a06c 47ad2af5 -> 3f267b83 3f71453a 3fa8e484 3e024a2f", + "4a4cb698 ca118a86 ca68b89a -> 3f389217 3e95f008 bf5acb66 bcf61ee5", + "441767af 442ba8aa c4759520 -> 3f1b65b9 bfe5f7c7 c0c021ae 3c114993", + "c4db3e85 c51ac2a5 44bc5ce4 -> 3e719b08 c049d4ce bfa5805d bed6167f", + "438cf04d c2db4a18 c42cfe4f -> 3f0d8056 beae42be 3febf00d 3e61b04b", + "c4816ff7 c50996e2 44aba8b2 -> 40267376 be946869 bce4e350 bf05fe5d", + "42e23b30 412ef937 c1993ec3 -> bf025ae0 4036db9d c0197bb2 3ef6ca09", + "c6899680 462606f1 44a104d2 -> 4008f87e 3f79c5b0 bca34188 3e5ff454", + "46d9ad7d 46fbee6e c7321906 -> c02bade9 be905dee 3f51a4bf becdec91", + "471e658e c709a320 c7631de5 -> 4001cd7f 3fdc93c5 bf725449 3eb1d83d", + "440c2c91 43f7e6a0 432c3345 -> 3e02c52a bf4c831b bd8c86bc 3e4349da", + "c817a0fb c7930004 4809f8d2 -> bfc1daf1 bfd9a975 3eff7c44 beaec67c", + "c3851345 c3712662 c2c79445 -> 3fe24796 3f6c1bb0 bf3397fe 3e184d4b", + "43289fcf 413a0d7f 4231fbae -> bf117813 bf74d9b1 3e423cfc 3e3b44ef", + "c803b2e3 c582c269 c6b79081 -> 3f94331b 3ee48cee 3f4d7f5a 3dd3f964", + "c81e6b36 c7f0c365 47e2602d -> 3ee53981 408b2fa8 bfaeb71f be215f26", + "455e30a1 42a752a7 c5a617a2 -> 3ed99e0e 3fed617e 3f26c8c0 3d80e8e5", + "45d5a62d c6d97b99 46b49e50 -> 3fbdbd5a beef1575 3f7d6ed8 3e928109", + "c679d328 47136c9a c4af24e8 -> bfb6b564 3ee70154 bd600851 bb807af9", + "42015b07 439b21c7 c4036e84 -> 3f874259 3fd1a11d c02543e8 3eda4609", + "ca1319c8 c9b4eda2 488323d2 -> 3fc6ed5f 3e5df195 c0007a4e bef5f84d", + "c896eeb9 4819be97 490e7639 -> c01d0bb9 3f87272d beda1bdf bee9747c", + "c461cac5 4408be03 43f2f197 -> bfcf1833 4061875e bfd1dd70 3f1bc82a", + "4740c30f c7ac2c0c c7b5f2f9 -> 3f9c4379 bfbd0008 3fefaf30 be9a4858", + "c3ab0f8b c40eca83 c416a273 -> bcfbf515 3e829fea bf50896c 3e18a32b", + "434a5d51 c44a73ae c448f467 -> bf2d6080 c03ae5bf 3fd1e371 3f1d4c84", + "47294bdb c63657ab 46bf4e94 -> bfd796db bef72e9b bf99770a 3e8503cd", + "c4c032d2 c3e5bd6d c4acc17c -> 3f91c9a9 becd48be c0742061 3e0ac537", + "4521583c c3b4a56e c4fdeb06 -> bfa6ac1a 4000a3f4 3e30914f be8d4209" + ] + }, + { + "glsl": "mat3 cultmath_snoise_hessian(vec3)", + "tolerance": "ulp-bounded, coordinate bands 1e-4 to 1e2", + "check": "Read at the case's point x, with S = |x|_1 and (e_n, e_g, e_h) = math.span_slack(math.span_rounding(1, x, zero stage, 0, 0, 0)), against the kernel's exact values in double: |n - n_exact| <= e_n and |g - g_exact|_2 <= e_g for snoise_grad, ||H - H_exact||_F <= e_h for snoise_hessian, no tolerance. Report the largest fraction of each allowance per decade of S and the largest absolute error at S < 1e-2.", + "cases": [ + "bca70bd6 3d95add7 bd0a0302 -> c05c7c12 bf01ee27 bfdcb6fe bf01ee27 c098bd14 40eee7c0 bfdcb6fe 40eee7c0 c127b479", + "3fd459f9 3e3e6940 402c6d30 -> c1873507 bf8d2713 3e38eb6a bf8d2713 4156bd9a c0d8824b 3e38eb6a c0d8824b c11f83fe", + "3f07f723 be788b0d be8d520f -> c0beeabf 41087b51 c0fb6062 41087b51 bf341d26 bfcd0efd c0fb6062 bfcd0efd c10ddfba", + "3bce826a 3c0e5872 3b4821a5 -> 3da0864b be053704 3f2111b3 be053704 3d17416b 3f609d1e 3f2111b3 3f609d1e 3f52bbcb", + "be5451e3 3e7671fb 3e8b4880 -> 4065a0ce 411ce25e 4070e698 411ce25e c0ebba14 c121b5a2 4070e698 c121b5a2 40f0b2a2", + "bb972f5f 3bb8be8d 3ae137c6 -> 3e7ff5ea bc10ab4a befd80a9 bc10ab4a 3d93a710 3f12686e befd80a9 3f12686e 3f07148f", + "3a297b08 38f206f5 b96e93bf -> bd2a1121 bbd8a0f8 3d8de7ca bbd8a0f8 bd04510d 3c653916 3d8de7ca 3c653916 bd9f1760", + "c01d9c7c 40fdffbd c0eab9d5 -> c184a67c 410411a9 c0962e1e 410411a9 409597d9 410bcb42 c0962e1e 410bcb42 c1005b34", + "bdd279db bd95c6de 3df2d752 -> 41373c07 3e2627d8 c0fe7268 3e2627d8 413cab63 c0bcf46a c0fe7268 c0bcf46a 41efc01c", + "3dd893f2 be29f609 3e338c29 -> 410ef3c3 404ac1d7 403dc2fd 404ac1d7 41254d46 c0e64222 403dc2fd c0e64222 41f118fe", + "b6481433 b9cdd01a b9654469 -> bc9df184 3b60eac2 3acff866 3b60eac2 bc4d1f59 bd1fa582 3acff866 bd1fa582 bd84d527", + "c0b60858 40014f87 c04c7785 -> c10439ca bf737410 c0c45a28 bf737410 c13852d6 c0a6d327 c0c45a28 c0a6d327 412f0a0a", + "3e281273 3dd6908c be285ea9 -> c11fe939 3fc05bfc 40ed6ef0 3fc05bfc c141b7b4 40985bff 40ed6ef0 40985bff c1d9a4f2", + "3ddd92f9 3f17e379 bfc8b536 -> 408f2d06 3ec818d3 40a12c40 3ec818d3 41d2e82e c0d4fc6a 40a12c40 c0d4fc6a 411955bb", + "ba0c3b03 b9580b40 b97902b4 -> bc13a7ce 3bd2aead bd5bb498 3bd2aead bc712b17 bc9ee011 bd5bb498 bc9ee011 bd8abe1d", + "b91561ac 37fe693e b854ce85 -> baf0a4b8 3a7f2672 bc6bce2e 3a7f2672 bb9e625e 3b6b7541 bc6bce2e 3b6b7541 bc73a4ae", + "3aa8603c 3a16a9ca 3a80a595 -> 3d8297c6 bc842a61 3e003d7a bc842a61 3d9bd2f0 3d523943 3e003d7a 3d523943 3e94b509", + "bc18d1c9 3caa803b bcb8b129 -> c011311a bdd678d8 bf43be48 bdd678d8 c031cff7 40156738 bf43be48 40156738 c0e2a911", + "bcc0abff 3d0e6369 bd03a22b -> c03d96cf be047142 c00696eb be047142 c07b8697 40726a0d c00696eb 40726a0d c11ecbd7", + "be96b068 3e2088b5 bc9e2aed -> c0c83ea6 3f2c1c1e c15335e0 3f2c1c1e bef9f973 40f3e1b2 c15335e0 40f3e1b2 bf4d8986", + "3d680a58 3d258e95 3d521e22 -> 404c50d6 bf6ccc04 40a1ed5d bf6ccc04 4062d41f 405f4371 40a1ed5d 405f4371 4165f721", + "3baa916d 3b3afc16 bb1c72d4 -> bed13534 bd8f0c1d 3f1000a2 bd8f0c1d bebc59e3 3ea2a73b 3f1000a2 3ea2a73b bf50bcf6", + "3b2243c0 3b7fc626 bb0b29e1 -> bea380ed bd6288d3 3e8d6557 bd6288d3 beb029e7 3ed971a0 3e8d6557 3ed971a0 bf37f0da", + "3f3a481f bf22d341 bf90800b -> c0f27fc7 40fec926 c16a1464 40fec926 40c71e81 405395ed c16a1464 405395ed bf98e408", + "409a7b48 3fdcc0de c09e5432 -> c10763b6 bf1f8952 c067ab12 bf1f8952 40777450 4016c1ba c067ab12 4016c1ba bd393052", + "40083853 c09c8176 c0807505 -> c125bb50 c0aa105e c161ab23 c0aa105e c0d48e4c c057ac25 c161ab23 c057ac25 c01eeb80", + "bed8e2bf beadb1f8 3eb28a93 -> 413e2eed c07c9753 40bfd819 c07c9753 bf880a1c 408bc4f3 40bfd819 408bc4f3 41728ada", + "b8a7b78d 38e1e1a3 b8f18b77 -> bc31aead b97be5d6 bbf0432a b97be5d6 bc670e5b 3c481c80 bbf0432a 3c481c80 bd145b68", + "c0a6fe07 41091a02 418b53ab -> c1919a8a c0d70ea5 3f74f5a3 c0d70ea5 be2bf79c 40f964d3 3f74f5a3 40f964d3 40ef86a9", + "3cfff4d9 3c23c2b8 3cd03434 -> 3fd9cf93 beb9ae8d 403eb542 beb9ae8d 4005cace 3f4e07c9 403eb542 3f4e07c9 40ef87f6", + "3c495104 3c93154a 3c220917 -> 3f0d0300 be86ed51 3f981c1f be86ed51 3ee7099d 3fe35045 3f981c1f 3fe35045 40343d5f", + "c02ad46b 4083a8ae 3ef4b7da -> 411c0c2b 40add873 c09a30e0 40add873 41476715 c1128427 c09a30e0 c1128427 41af8832", + "3bb64a33 bc2cba24 3b620a08 -> 3e9c57a9 3d31f6b2 3f0c77c5 3d31f6b2 3f158dfe bf902ddf 3f0c77c5 bf902ddf 3f8f4b00", + "c2789545 429ceeef c2746174 -> bda7c6be c0ec24bd be91b278 c0ec24bd 4179bf61 412a8b5c be91b278 412a8b5c c08bc86e", + "b9a53920 3b370f82 3b56f0cc -> 3ea69d36 bcb01943 bd7aeab6 bcb01943 3e8afbdb 3e864e66 bd7aeab6 3e864e66 3f805c11", + "38dd4caa 398bde14 395c5876 -> 3c89c63b bb53b451 3c16242f bb53b451 3c65b38d 3cd49ca3 3c16242f 3cd49ca3 3d7fa057", + "b93292b8 38dc74f5 b9a858b6 -> bcf50970 3a142e2f bc74dabb 3a142e2f bd0e18a0 3c61028e bc74dabb 3c61028e bdcc3fd2", + "b9c96814 39f75d83 3a88626c -> 3de9f9d9 ba474c69 bd48d0c9 ba474c69 3dcb8df4 3d243c1b bd48d0c9 3d243c1b 3ea6053d", + "3d05d9b5 bc23cf49 3d84accb -> 40b6ae2f be295ddb 402593a8 be295ddb 40d001a6 bfc049f9 402593a8 bfc049f9 41989fcd", + "c224aafd 42af2e1e c2945200 -> 3f8ad9e9 c11334a0 c0eb8c7b c11334a0 411b8b21 c14c7cf0 c0eb8c7b c14c7cf0 c0bc58ec", + "3cab5bb4 be4e4e15 3e27c775 -> 413c62b6 3f996ceb bdd47a83 3f996ceb 411ad173 c113164a bdd47a83 c113164a 41ee2ec0", + "bef887fd 40890030 3f97b61e -> c08ba6f1 c10940a5 bf812b08 c10940a5 410a75d8 41130f85 bf812b08 41130f85 41337912", + "b642d624 b8d87f91 39314085 -> 3c982439 3a71750d bae7e635 3a71750d 3ca6680a bc482a98 bae7e635 bc482a98 3d5c0c0c", + "3dc3a86a bda66275 bf8067af -> 410ae777 c04170fe 40813cf2 c04170fe c00809ff 410a672e 40813cf2 410a672e 41c8c371", + "b94634ee 390bfeae 397fed29 -> 3ceefe8f 39fc82b2 bcb29334 39fc82b2 3cc12495 3c41114d bcb29334 3c41114d 3d9d1ea7", + "c1c347c5 41283e74 41c65d7c -> 411e3797 beaa53c6 417abc89 beaa53c6 3fc25f7d c0637572 417abc89 c0637572 c136b51f", + "b939018e 39801be5 b9c31541 -> bd148e0d ba1a6c85 bc78210d ba1a6c85 bd32773f 3ceaddcb bc78210d 3ceaddcb bdef3bc8", + "4085492e c083fba6 40c9da93 -> 3f6dea00 40a8394a 3fa12e07 40a8394a c1495a39 412c0719 3fa12e07 412c0719 407dbe3d", + "c08b32f4 c187f2df c18362c1 -> 417082e3 c07c2270 3f8aa992 c07c2270 c08aa00d c04a3603 3f8aa992 c04a3603 41843415", + "3db6fd2a 3e35aba1 3e95b813 -> 41299c4a bf92db97 c02ebb04 bf92db97 40f7d0e4 c03973f2 c02ebb04 c03973f2 41a5062d", + "38edb71b 3888e6ec ba5698ac -> bdb5c37e bacb393e 3c9ae225 bacb393e bdb40e69 3c63d035 3c9ae225 3c63d035 be83b681", + "bd349be1 be7f0a89 3e2c00c6 -> 41343089 bfe26f65 c006e143 bfe26f65 40da3366 c10a9b12 c006e143 c10a9b12 41d3a700", + "bd14afe7 3c0839c7 3cf410a6 -> 40779481 3e80c8f9 c07c2d77 3e80c8f9 4049e18f 3f16cfd8 c07c2d77 3f16cfd8 41162509", + "c0464dc7 bff3e8a2 bf7ccccd -> c1d0ea4a 4115097f 402c5b0d 4115097f c1710a26 bff74064 402c5b0d bff74064 c137e38b", + "42407a89 4116ea33 41b660b5 -> 40911f34 40c0cf6f 3e05a6d3 40c0cf6f c0c11a69 bf4ffaf4 3e05a6d3 bf4ffaf4 c0faaf30", + "3bce2215 3e582f58 bc9ef064 -> c03d8bef bfbc3e7f 3f244210 bfbc3e7f c081ee4f 41846057 3f244210 41846057 c0bf3390", + "38a37e75 b8ee5ce4 37c1f1aa -> 3ab2e81b 39a27c4e 3c01b5d9 39a27c4e 3b99b3e6 bc4537bb 3c01b5d9 bc4537bb 3bf6de0e", + "c1917250 c19c3a90 40b5fe09 -> c1c11c0c 40ffde9f 404fd68c 40ffde9f 3f8abc5e c0c79601 404fd68c c0c79601 c0ccfc6f", + "3b9fe01c 3ad1993b bc6ee761 -> bfd4017f bd654bc0 3f21dcac bd654bc0 bfccc832 3e95953f 3f21dcac 3e95953f c09335e1", + "baa18678 ba291da2 ba9ecc03 -> bdb52da4 3c8573fd bdf13e28 3c8573fd bdca0cfe bd680e34 bdf13e28 bd680e34 beb969cc", + "428a6a4b c1981cc8 c202eda8 -> c1793b26 40adef7c c07ac975 40adef7c c1ccfd31 4124ce16 c07ac975 4124ce16 c1b0f84e", + "3b58df7e bb01dc01 3b657215 -> 3e974ab4 bc3c42c4 3ea0cf2f bc3c42c4 3ec64eb3 be724e33 3ea0cf2f be724e33 3f8a7a14", + "c0d0dae3 4113d6a6 40594b98 -> 4121b04c c162b388 c0c8d5ab c162b388 c0a15898 c15cc710 c0c8d5ab c15cc710 4032a345", + "befdc1c1 3f9fbf91 bf8e764f -> 41bb7f40 c0cafec1 4046bc3c c0cafec1 bfcb0d3b bfed398b 4046bc3c bfed398b c160bf5b", + "c01f693f 3f69a693 bbd90e8f -> c1050dab bfcaf49b 3fb5be20 bfcaf49b 410e6fab 4189f368 3fb5be20 4189f368 40a9bb20", + "ba146a0f ba14a8aa b99e5781 -> bc412198 3c211adc bd66bb17 3c211adc bc40e084 bd671cb5 bd66bb17 bd671cb5 bdad1116", + "393ac987 ba457080 3a0663ba -> 3d6269be 3ba38011 3c66fd84 3ba38011 3d924ddf bda9b74a 3c66fd84 bda9b74a 3e29164a", + "bc15e1c9 3b9f9881 bb70003e -> be3d660e 3d172912 bf6b7fd4 3d172912 bedb4a38 3f09d67a bf6b7fd4 3f09d67a bf8d8f80", + "be9ce12b bdb8ea30 3e8a9caa -> c04dca15 c0b6d116 40f44252 c0b6d116 40aeb2d7 be281ebf 40f44252 be281ebf 41d0a945", + "3e528f3f be7b1c9e 3e719c3c -> 3fe176ad 40f4218a 3ec1eb36 40f4218a 40ffc51a bfb22dc9 3ec1eb36 bfb22dc9 4177efc2", + "bc126150 3b6a9b67 bb0ce148 -> bcb55707 3d3de850 bf6938ac 3d3de850 be750f1e 3ec843a7 bf6938ac 3ec843a7 bf1fe75e", + "3bd183d6 bd0b75f4 3bcc7648 -> 3f45bfe8 3e764087 3f1b4cbc 3e764087 3fba84f6 c0647fc3 3f1b4cbc c0647fc3 400b0780", + "3e02b7f9 3e1dc1fb 3e3ee697 -> 40f60796 c0188b36 408f1790 c0188b36 40f16708 40c0c166 408f1790 40c0c166 41e9f657", + "bd874bb4 3de1606c befbf8a5 -> c10b71af 3fe33209 c0897198 3fe33209 c16cc995 c0e0ca32 c0897198 c0e0ca32 411c41c2", + "bd5187ef 3ce80f04 bda5adde -> c0d5192f 3d49068c c07d81c0 3d49068c c10213b5 404e1760 c07d81c0 404e1760 c1b7dabe", + "bb842213 bbc540e8 bb8f0b2d -> be982102 3db2c47a bec372d9 3db2c47a be866f1c bf16aa05 bec372d9 bf16aa05 bfa34a89", + "41e3e526 41f71eaa 41fece9e -> bfbb68d1 40bea35b 3cc54f90 40bea35b 40f20bba 40b08b1e 3cc54f90 40b08b1e 41892bb0", + "3a7fa1c7 3a829451 37c95e4c -> bd01233f bc8c1fae 3dcf8363 bc8c1fae bd02a2df 3dd40247 3dcf8363 3dd40247 bc1d667c", + "4093c991 40bd52bf c06d4c8d -> 3f21e429 403f47f4 c0bd8ffc 403f47f4 40aa11e6 4104d974 c0bd8ffc 4104d974 40a983d1", + "b815b04e 3893698e b8d8196a -> bc2a88f9 b99d8982 bb38d689 b99d8982 bc48aa96 3c06940c bb38d689 3c06940c bd050bf7", + "3b131cbc 3afa275a 3ab60dbf -> 3d8e9390 bd139edc 3e62f9bf bd139edc 3d9a8772 3e3f211f 3e62f9bf 3e3f211f 3ecbaba7", + "bf1c268c bf921c24 c05368d5 -> 3f482eec c048d35e c115d453 c048d35e 4176699d 40c3931b c115d453 40c3931b 4135df56", + "3b1f7198 3a0cc6e9 bb9fd066 -> bf135e40 bcd2feb5 3e974c74 bcd2feb5 bf0af4d4 3dc91b62 3e974c74 3dc91b62 bfc63e00", + "c0f4089a 408c2456 c09676ec -> c100e934 40684649 3ef9868e 40684649 c15496a9 c07e0033 3ef9868e c07e0033 c1eaab68", + "3e019b20 3d9b2e80 3dfdc9da -> 40ac7b8b c014dce8 40fdcef4 c014dce8 40eb03fb 408fb603 40fdcef4 408fb603 41dd6295", + "40a91a9e c0ac2ff5 c09d2432 -> 410cc12a 3e24a6ae c0d6f5aa 3e24a6ae 3fc3fe4e c08a3761 c0d6f5aa c08a3761 401be9be", + "bd46eb4c 3d87366c be2de61b -> c152e2f8 bf366e9b bfad5643 bf366e9b c1667f5f 4093c40b bfad5643 4093c40b c2152dc4", + "37a9be48 ba267333 ba62b080 -> bdae317c 3baec52c 3c1d8070 3baec52c bd96e7da bd70104a 3c1d8070 bd70104a be8790e5", + "be39216b baf2e83a 3e18def5 -> 410b9da1 3f90d3b7 c11d5c01 3f90d3b7 4141626f bf801cf7 c11d5c01 bf801cf7 41f3431d", + "3a5c53ee 3a4e6fc2 ba1bb7b4 -> bdb977e7 bc676bcd 3dbdc716 bc676bcd bdb795d8 3db27a86 3dbdc716 3db27a86 be4c7839", + "3e14606e be8cb61e be4b3f32 -> c0c8d428 c0491d73 4090f43f c0491d73 3f335440 c0c2b320 4090f43f c0c2b320 c1b234c8", + "bf9c6ef1 401514b1 400d916c -> c00c1ac8 40b7a6d9 40d5c72d 40b7a6d9 414d7f8b c03167be 40d5c72d c03167be 411ab818", + "bb25b9b1 babdc6d0 3ac59f14 -> 3e70fe0e 3d0d4935 be8d7eca 3d0d4935 3e5dcb6b be27bf3c be8d7eca be27bf3c 3f01637e", + "bf17304b 3f3f65c6 bef2ad46 -> 4126f58b 4145abb2 41192472 4145abb2 c116a13c 408384b0 41192472 408384b0 3fa0fa2b", + "3f8b35d0 3f8c546e bfb950f1 -> bfc902fe 3f110616 40598f49 3f110616 4158d1fc bf3ae9ee 40598f49 bf3ae9ee c1961bd5", + "beefd7bb bed0cfc6 3c0eb3ec -> 40b3e4d2 bfa71d7d bfeb3794 bfa71d7d 400f833f 41248bfc bfeb3794 41248bfc c089dede", + "bff650ca bff6af14 bfff1e97 -> 4192de89 40e1bc67 406440a1 40e1bc67 413fb0a9 404a9ebe 406440a1 404a9ebe 4108f5a2", + "3c77cac6 bd693879 bde38ca5 -> c12629f7 3e622ccc 4005fc26 3e622ccc c10dea46 c06d765c 4005fc26 c06d765c c1ed0942", + "bf03d333 3fe4d1ad bf9fae2e -> c1559ef2 41090304 414af81f 41090304 c0914aee 3fb3261d 414af81f 3fb3261d bef57b86", + "c1861bdd c2989d1c 4295dd6a -> c0a17e04 405a735b 3eca08ad 405a735b 40d64f2b 4106f26b 3eca08ad 4106f26b 40b62d51", + "40854229 41a9b474 3d7a1f7a -> 41864dd3 bfe013d6 405cdd87 bfe013d6 40cd334e c0eea703 405cdd87 c0eea703 3fde81bb", + "3ced127c bc890d9f bc857f38 -> c01123c2 bdec7f0b 4047930c bdec7f0b bfbf35fb bfca6ccc 4047930c bfca6ccc c0a4b858", + "c0348545 bf814de0 c0cc5633 -> c06b6987 c1516972 40811583 c1516972 c0f1910a 407e3995 40811583 407e3995 c10d449b", + "3874ed4c b93071fd 392d9a08 -> 3c8cbadd 3a79ee60 3b982b3e 3a79ee60 3cacf441 bc9b4d94 3b982b3e bc9b4d94 3d57bcbb", + "bd11d016 bee7e266 3eaf0775 -> c07d1717 c12bff84 bfbe7767 c12bff84 be8b2eaf 413dfb1f bfbe7767 413dfb1f c0b56d4f", + "3f07b255 3f966062 be77e634 -> 40f30745 c0f81593 3f4f9462 c0f81593 40dd1b88 40a5a78c 3f4f9462 40a5a78c 41364952", + "bc05c153 bc076e32 bc0089d7 -> bf080e70 3e125d6b bf47cf29 3e125d6b bf07995b bf4a87d8 bf47cf29 bf4a87d8 c0138217", + "bcb4bf39 3f911538 3f8b2a4d -> c2151638 c0a81752 c046716c c0a81752 c18348a9 bf8d1204 c046716c bf8d1204 c15f9aa1", + "bee5e6d1 3fda05d2 c07dcc04 -> 41bcb133 bf0ebfb1 40acfe21 bf0ebfb1 4137f151 3fc812f7 40acfe21 3fc812f7 c06870b1", + "3cdfe3f1 bcb69d27 bd0d6845 -> c080a7cb bd8e2e49 4043c14f bd8e2e49 c04bb160 bffaba2f 4043c14f bffaba2f c129e55d", + "3a1f1fa2 3c176882 3ad1143d -> 3d8f7edf bdaeebcd 3d4a12e7 bdaeebcd bda35ea0 3f72a611 3d4a12e7 3f72a611 3ed33f48", + "bd439830 3ceb0c59 bc8128ce -> bf184370 3e0d716d c097370e 3e0d716d bff5cd50 40437401 c097370e 40437401 c0951f37", + "bf8cd559 bf75b5e9 bf11552a -> c0ecb66a be83a235 3fbaf5e0 be83a235 3e619c4e 3ecf8876 3fbaf5e0 3ecf8876 bec6c56c", + "3b6b47d4 bb374a0e 3a9ee4c9 -> 3d6985ea bbe10d38 3eb9f94d bbe10d38 3e2bde1d be9a7565 3eb9f94d be9a7565 3ebe53b4", + "c16f8d03 417adb03 c1e65687 -> c04a580b 3f10a56b 3f9a0eaa 3f10a56b c108806a 3ec55590 3f9a0eaa 3ec55590 4119106b", + "3e948c3c c1af3de2 41e30b2e -> 40e73654 c08b1036 bf722681 c08b1036 c0fdb6df 3f342633 bf722681 3f342633 c008f54c", + "c03be214 c064ce86 403f8474 -> 40f91ed0 bfc46a1e c08166ec bfc46a1e 423361df be349d53 c08166ec be349d53 40902c07", + "bb97b4d7 bc97b351 bd0a5b99 -> c04d2d6a 3e4f49fc be396b7e 3e4f49fc c03d13e1 bfcc3b97 be396b7e bfcc3b97 c123647f", + "bf90c0fa 3fe2e40c bf6625f4 -> c1b55706 c111c8e0 3fb96d7a c111c8e0 c1b74d38 bf3b4c3d 3fb96d7a bf3b4c3d c151d857", + "3fe52348 bf61a203 40b4618e -> bd88e87e 410c56b6 c08e894d 410c56b6 c1938acf c0601c38 c08e894d c0601c38 416c1e20", + "3dbec6a8 bea2a5e9 be37c3ad -> c0c9722f bf3db686 40763121 bf3db686 400d7aa9 c0c9fe4c 40763121 c0c9fe4c c19d8ecf", + "bd628ef3 3e5b5344 3e559d7d -> 41339eee 3fa69bb8 c006dad3 3fa69bb8 3fcb6ed2 4078064d c006dad3 4078064d 41dc0356", + "c298f4db c276cc35 c24d7750 -> 41a5a290 c026188a 40be5c9b c026188a 4120f168 bf01fc2e 40be5c9b bf01fc2e be54fb4d", + "c165f9f6 bf36194e 4118522f -> c115fc40 c0a1c24b c0a53b5b c0a1c24b bfd05db1 405ff648 c0a53b5b 405ff648 c1175203", + "380e8b38 38db65fd 389a5347 -> 3bc05658 ba9da11f 3b3e0ec6 ba9da11f 3b982c4e 3c2801c7 3b3e0ec6 3c2801c7 3cb27357", + "3e81a848 bf59f6c3 3e82ce35 -> c0909d00 c0277bca c0ca2e8e c0277bca c0b62299 bf662e70 c0ca2e8e bf662e70 c1af8410", + "bd980bb9 3e005f66 3b5dfa45 -> 3f874331 becc2603 c0d9fe0f becc2603 bffcaad4 4136f10f c0d9fe0f 4136f10f 3f0a1735", + "3f13626c 3e694eef be2d83c0 -> 4104f5da c1242c67 bcd4059e c1242c67 3fa34490 411ba46d bcd4059e 411ba46d c102e7a1", + "ba816f6f b9378027 39fadd90 -> 3d9dc8c9 3c25451b bddb1638 3c25451b 3d80e89d bcb74cef bddb1638 bcb74cef 3e235f8a", + "c10e5402 3f79c032 401bfff2 -> 40a9d96d 405826d7 c10d1e46 405826d7 bfa7be2c 408c0c4d c10d1e46 408c0c4d 40ab1a42", + "c0709da0 402d3fdd bfd83411 -> c0f3c34e c03cc065 c029757b c03cc065 41a5a498 3ffbf261 c029757b 3ffbf261 c0d622ce", + "c025898f 40f43d5b c08d983f -> 41e938ce c038c578 bf1060a1 c038c578 414dd0f3 bfbcd015 bf1060a1 bfbcd015 411f42a1", + "3f8df5b9 be8f329b bf6db445 -> c1345772 40d027bb 40372583 40d027bb c0ea8bd0 c151c76e 40372583 c151c76e 3ebc3ba0", + "38eaa45c b8a1473a b9c2fa44 -> bd27cc4b b99f6fe1 3c73d21c b99f6fe1 bd1a6050 bb9c9ab0 3c73d21c bb9c9ab0 bdee8440", + "3ef68428 bdf356fc bf154fbf -> 40f8a73d c12c9262 41040e4b c12c9262 c17931ec bfd4aaf6 41040e4b bfd4aaf6 3f819a55", + "3bf2e909 3c1cc22a bc2014c6 -> bfa53441 be15a423 3f5ab831 be15a423 bfa9eb02 3f89ff72 3f5ab831 3f89ff72 c04c5f76", + "bd4268fc be23774b 3deda6b1 -> 4130b24e 3ea6cf6e c074b754 3ea6cf6e 4114a2f0 c1305992 c074b754 c1305992 41dc08de", + "baea77af 3ae104dc b9f7ca2c -> bc8fa1e8 3a2391a3 be3a861b 3a2391a3 bda07e79 3e3b3b5e be3a861b 3e3b3b5e be1682c8", + "3ca9d2d5 bd2e603a bcdc4a49 -> c039e002 3e22a88d 40154353 3e22a88d bfe425de c082de3b 40154353 c082de3b c100ae7d", + "bc76cfee 3c8284e3 3c78eebb -> 3fe970cc bb43473a bfd829aa bb43473a 3fa4d162 3fc20c5a bfd829aa 3fc20c5a 4096d7c0", + "bcc30d70 39ea4df8 bd29d4ed -> c067de9b 3e4c36d5 c002b246 3e4c36d5 c0821bb8 3eccb7f0 c002b246 3eccb7f0 c147d92f", + "b7eeaa6c b95cb8c2 38197bdb -> 3bd0f863 3b07e105 bb56d11e 3b07e105 3c1c41e4 bcb62b42 bb56d11e bcb62b42 3c5d43de", + "c2264a73 c29ae5eb c0bf9e20 -> bfb3a45c 4086e043 bfd9897a 4086e043 c0f837a6 c0cd024d bfd9897a c0cd024d 411bba4a", + "41d277a7 419112b4 beab0150 -> c02488a1 40ae6b90 c09e0fde 40ae6b90 3ed8052a c02e1745 c09e0fde c02e1745 c1c08935", + "b8ed8fa5 b85b20a0 b9287936 -> bc5a66ab 3abc3e9f bc2a593d 3abc3e9f bc6bbcd4 bb84a8b5 bc2a593d bb84a8b5 bd47b717", + "3ef1d411 40847bd1 40790bcf -> c126991f 407755a9 bf98eeda 407755a9 c0c544d2 c11fd0c2 bf98eeda c11fd0c2 413db490", + "bd1b741f bd0377cc bcb375d4 -> bf77d622 3f1f0bb4 c06b72ac 3f1f0bb4 bf89bd09 c0454695 c06b72ac c0454695 c0c3b4b4", + "3beb6331 bb8f24df 3b378331 -> 3e11a7bb bcc72c5e 3f3926a6 bcc72c5e 3eaf7893 bef52f58 3f3926a6 bef52f58 3f598dd6", + "3d54702d 38a0076b bcb4dac5 -> c05f8748 bee24f86 40ae5a67 bee24f86 c02cb55c 3e485d09 40ae5a67 3e485d09 c0e62201", + "3e7dee8d be8f6c90 bd2f1b8d -> bf3d7f0d bf2fe155 410c4e85 bf2fe155 3ed1b42f c13232cd 410c4e85 c13232cd c074984c", + "3c21e650 3b91ea4b bd1dfb8e -> c0887f9e bdf7d45e 3faa7308 bdf7d45e c085a2c2 3f483ba8 3faa7308 3f483ba8 c13fb5d3", + "ba4ed434 39fbdc9f 39ebef5c -> 3d817c0a 3b2f8178 bdb03dce 3b2f8178 3d28be30 3d3ce0d4 bdb03dce 3d3ce0d4 3e12aeb4", + "3f54747c 3f3d6432 bef75635 -> c11a8f61 c1220516 c02802fe c1220516 c12e9926 40ae538c c02802fe 40ae538c 40e3cae0", + "c0d40a23 4192d5f7 c1a50e07 -> c0a90afc 40a62788 400dd928 40a62788 41535531 413bc824 400dd928 413bc824 4117472a", + "b8a15cad 3b0eb843 ba527f49 -> bdcdd289 bc9551e9 ba88e5e0 bc9551e9 be0ef833 3e6f5051 ba88e5e0 3e6f5051 be89c0ad", + "bb92a135 ba76b019 bb9476fe -> beb19f14 3d40845b beda5045 3d40845b bed10f82 bd702908 beda5045 bd702908 bfaf1472", + "b818a605 3999f16c b9356088 -> bca0ac91 bb12447a bb15ed77 bb12447a bccf9633 3d035e2a bb15ed77 3d035e2a bd667cb8", + "3d14acac 3dde2bc1 3d66a119 -> 40621c29 bfabb1c0 4037f5c2 bfabb1c0 3fedcd80 4117870e 4037f5c2 4117870e 416a03b4", + "bc4652a4 3d387560 3cb0207b -> 400807f8 be89836f bfb583fe be89836f 3f8d8e83 408d1758 bfb583fe 408d1758 40ca2e09", + "bf8031f1 40a6d575 3f6cdf75 -> 4113cda6 405a667d 408de5b4 405a667d c0ad1337 41030e33 408de5b4 41030e33 c1434c3f", + "3d9675d6 3de15327 bd225856 -> c0bc3071 bf674f3f 40ddb385 bf674f3f c0c0a01f 412391fa 40ddb385 412391fa c1455845", + "bc40ac94 3c1e9c8b bbb91fa6 -> bebaab63 3c8d2b5c bf9628b5 3c8d2b5c bf3c832c 3f8708a9 bf9628b5 3f8708a9 bfdf3054", + "3adadd4f 3b97baa7 3b19f72f -> 3e24cc95 bd5ff0eb 3e1d1f7d bd5ff0eb 3de04f7d 3eec5abd 3e1d1f7d 3eec5abd 3f2dd5be", + "b7e2d755 39873d64 39c21f3a -> 3d179f6e bb034d83 bbc5884e bb034d83 3d035d96 3cc1b394 bbc5884e 3cc1b394 3de8c1df", + "3e2df629 4011a9e2 bf32f6f5 -> 41862f98 c10167d0 bfd91443 c10167d0 c086368e c0495b87 bfd91443 c0495b87 3ff959ed", + "b65e45be 38bac214 b9212f8a -> bc88b3f8 ba42e33c 3a80d448 ba42e33c bc95d749 3c2dc256 3a80d448 3c2dc256 bd47aeaf", + "be352bf4 3e9040a0 3e4958c2 -> 406beb47 40d9ad2b bf88d710 40d9ad2b c0bc0158 bfb80310 bf88d710 bfb80310 4142f4c3", + "bd2ba1a3 bd872026 bd83d970 -> c093d49d 3f88173f c0595634 3f88173f c081bf48 c0b4c2ff c0595634 c0b4c2ff c18df17b", + "bb51a7cc 3b603b7e ba879ca2 -> bd5dade3 bafec426 bea5ec71 bafec426 be2d0cd8 3ebaf7fa bea5ec71 3ebaf7fa bea66f55", + "bc81d324 bdaa8990 3c6ba166 -> 4020acb7 3f494485 bfd87443 3f494485 405c8a00 c1060b2f bfd87443 c1060b2f 40a39bd4", + "be61335c 3dde8de5 3c7db2f4 -> bde240d4 3fcc675a c172f0ac 3fcc675a 3e9a3c2e 40f05309 c172f0ac 40f05309 40837992", + "425b89af 42538905 c2374fbd -> c131523a 405449be 40991ad2 405449be c0780385 40878d43 40991ad2 40878d43 bf8731ad", + "b9cd89ef ba4a2504 380a2fb1 -> 3ca6778c 3c255911 bd285b4e 3c255911 3cdc5b59 bda50392 bd285b4e bda50392 3ca6dd8b", + "c0bce444 c0a01938 3fa72773 -> c14c8ee8 c0808097 bf660338 c0808097 c203114a 40c44d88 bf660338 40c44d88 c1161fcd", + "3dbb990c 3db9cfc4 3c9d41bb -> bf8c591b bfbb8339 4107084c bfbb8339 bf8a81af 4105b94b 4107084c 4105b94b 407e910a", + "404d460e 3f17a196 c000c87b -> c0cef2be 407bd943 c18bc725 407bd943 c05f1866 c011c005 c18bc725 c011c005 40a4fe57", + "be9a6f40 3e8c28e5 3d656fca -> c0e5b7fc 3ffb14c4 c1276310 3ffb14c4 40841598 409d24da c1276310 409d24da 40f2b15b", + "418ff38d 414bb787 3fdb1f9c -> c04c9c49 3eaa51f8 3ff88e97 3eaa51f8 400fb8ea c0b8d1a5 3ff88e97 c0b8d1a5 40820f44", + "3a1f648b 39bac701 ba2b3f7c -> bdb20c8e bc091493 3d8d4407 bc091493 bda919e4 3d2f26d9 3d8d4407 3d2f26d9 be598639", + "c1bd23c0 419a4f32 c154225e -> 40e7e811 41806ee0 c11a0b63 41806ee0 4149ff10 c12061da c11a0b63 c12061da c18c2abb", + "3f41cfa2 be4e7aee 3e91cefe -> c131b5ee 3f975a30 409ae9d8 3f975a30 c0a03cdc c155431c 409ae9d8 c155431c c03dc736", + "40293dac 40267059 c03757f8 -> 3f297db0 bf39c565 404ec22f bf39c565 c1009503 407c1aba 404ec22f 407c1aba c093c66a", + "bfc9bffc 3f56e126 c0296ff3 -> 406a74d8 c12243bf 41051baa c12243bf bda7c2a4 3fcea3a5 41051baa 3fcea3a5 c0218725", + "3f7b90bc 3f8cfc88 3f0b5333 -> c0ff81bd c0243fe3 40a0d62f c0243fe3 3e8c7d50 c089b5f9 40a0d62f c089b5f9 3ec6e776", + "3e08e8da bda5b165 3d68fe50 -> 3fcd6be9 3e7cbf5e 412e00ba 3e7cbf5e 40ad0b51 c0e7f513 412e00ba c0e7f513 41667784", + "bcff3479 3db38e6e bde45c61 -> c12074a5 bf4b7708 bfc4c908 bf4b7708 c12f21db 40f238b9 bfc4c908 40f238b9 c1eb0ad3", + "bd9e4863 3dad3b98 3dfd7969 -> 4131079e 3f577549 c0caf125 3f577549 4108bd78 40a1bbf2 c0caf125 40a1bbf2 41f23de8", + "38003ba1 bbbf0f5b bba25360 -> beee81a9 3d4e0fcb 3d3d00c0 3d4e0fcb beba59ca bf105246 3d3d00c0 bf105246 bfbf89c4", + "3a603c2f 3b0afde0 3b0852d2 -> 3e342080 bcd39274 3d916c0e bcd39274 3e1da1e0 3e4f9ea2 3d916c0e 3e4f9ea2 3f1fb6f0", + "b980af5f 3945124a b9437f58 -> bc702175 3a02e4d6 bcc4217c 3a02e4d6 bcb5adf5 3cad8db4 bcc4217c 3cad8db4 bd6c88f8", + "c2b4af79 41f6f30b 419cb9f9 -> 403a35bd bf165a31 bf64aed5 bf165a31 40fecb8d c0ff3f0b bf64aed5 c0ff3f0b 409abf3c", + "c0120284 c0513877 c0d65c00 -> c113a39c c123a8ae 400880fb c123a8ae 40858480 c016a36f 400880fb c016a36f c1a1a996", + "b992719b b9956b4a b91a3a1f -> bbb6a266 3ba06f60 bce3c7e7 3ba06f60 bbb36a1c bce89c56 bce3c7e7 bce89c56 bd2827ef", + "b9765d1a bb0e1c97 39f6e6a3 -> 3d9776df 3caad3ce bce9dfd2 3caad3ce 3ddc2bd7 be6b60cc bce9dfd2 be6b60cc 3e2bf69e", + "37ba400b 3a267b68 39c639a8 -> 3d084e85 bbbae09c ba7df53c bbbae09c 3cb97c74 3d80b462 ba7df53c 3d80b462 3de62fd6", + "bfe1dff9 c1012a34 c106bf58 -> 404da566 407c2bda 40b32aec 407c2bda c043b3bd 409762d4 40b32aec 409762d4 bf615dcf", + "3e84084a bd81a05b bcf1b526 -> 4052ba54 bff176e8 416c5a21 bff176e8 c0361eaf c0743b14 416c5a21 c0743b14 c0d9f778", + "bb982707 bc1b3df8 bc22c6c1 -> bf54806f 3dfb8e22 becae23d 3dfb8e22 bf3edf41 bf65f07f becae23d bf65f07f c03e76ec", + "42091916 c0b4f565 c2543390 -> 418ee8d3 409a91d5 c0aac2a6 409a91d5 418fdca9 c02f3c5e c0aac2a6 c02f3c5e 41d5ef98", + "c0bcfc9d c1cbc2a6 c1aa6c2f -> 4130c812 40974f46 c0feeb0d 40974f46 c10c4138 40314d9d c0feeb0d 40314d9d c0be4cb1", + "407f32d3 4078b51d c014754a -> 41866ee2 406f3bd5 403cd945 406f3bd5 413a9ced c0c02dd4 403cd945 c0c02dd4 41d14dd5", + "bdf4e323 bd3db8df be13356b -> c0e20030 3ffb2b7a c0cebc42 3ffb2b7a c11bbf98 bfee55d2 c0cebc42 bfee55d2 c1fc9ec1", + "3eaf2e39 be63c338 3e2c96d4 -> c067fa9a 40cdd0c1 40cfea17 40cdd0c1 404f625b c0a0d738 40cfea17 c0a0d738 4158f61c", + "bc7b723d 3d517535 be7e7b33 -> c1845643 3ec08399 c01f49c8 3ec08399 c18bc9f6 beeae1a0 c01f49c8 beeae1a0 c1cebc0f", + "3ecc4794 baee3c14 be23d8de -> 419a49a0 bf086a31 402c8d6e bf086a31 c14ed8b8 3f76da32 402c8d6e 3f76da32 c1813c8b", + "b890f06f bac5992f 3b2b1363 -> 3e92c579 3c602042 bcf47a8d 3c602042 3e9f8c30 be37e8b4 bcf47a8d be37e8b4 3f5439d9", + "bb008f13 babd0207 3a76af6e -> 3e256b52 3cf1e1da be597f18 3cf1e1da 3e1c3042 be2218ad be597f18 be2218ad 3ea59ce0", + "3ac78b7c ba8bd22e 3a0f8285 -> 3cda2029 bb81833c 3e1d734b bb81833c 3d928cb3 bded327c 3e1d734b bded327c 3e2b0e3b", + "be060466 3e420f90 bd910918 -> c0282791 c01f4c54 c104135b c01f4c54 c0692eb8 414d4d09 c104135b 414d4d09 c1744c1b", + "b6269fa7 38e0a5f7 b6e6d7c4 -> bacf3e57 ba6e011a b9507c3e ba6e011a bb644577 3c37b77d b9507c3e 3c37b77d bb485596", + "40a5669f 40a33a38 c0943ad5 -> 40b490ff c0641919 41279651 c0641919 3fcb7dbc 403e1e79 41279651 403e1e79 41a34455", + "3e0d3ce8 3e5cf207 3e3582d1 -> 40c75b97 bfd41d59 40adb620 bfd41d59 4062fae3 410fb71d 40adb620 410fb71d 41bcc6b5", + "39bd2821 b900164b 394e1bd0 -> 3c46cfcb bb07b22e 3d12e1e5 bb07b22e 3ca80f8d bc6c536e 3d12e1e5 bc6c536e 3d73015e", + "3c63ca93 3b2694af bc87791b -> c0061d5f be10e448 3fca6d53 be10e448 bff3993a 3ecfe5c2 3fca6d53 3ecfe5c2 c0a93048", + "3a82d8c0 3a91a93f 3a9aadec -> 3db2ac63 bc95f50c 3dbfe526 bc95f50c 3daea7ed 3dd7fee2 3dbfe526 3dd7fee2 3eb35b9a", + "3951cef8 37481d8b b9d3e2d3 -> bd421e02 baf11583 3cc7659d baf11583 bd34bd6f 3b9b7a49 3cc7659d 3b9b7a49 be03276f", + "c1286e5b bf694fc3 411bf9c3 -> 411b7fea c072bfc3 3fb300b3 c072bfc3 c18942d3 4015d4e6 3fb300b3 4015d4e6 4173e519", + "b8fd7a78 37fb1f67 38e758e8 -> 3c6b7cd8 3a4ee2d4 bc5dea5a 3a4ee2d4 3c409a9c 3b0d8c2e bc5dea5a 3b0d8c2e 3d105f14", + "bf8f310e be54c736 3f6910fc -> 41928bb3 41282908 3f0ac953 41282908 409b9ee0 c0e2940a 3f0ac953 c0e2940a 3ec83cf8", + "be1f9039 bd3256f5 3f52f4d8 -> c0dcdc94 bfcafcd9 3f690de4 bfcafcd9 c189ce00 411c5e37 3f690de4 411c5e37 c101e4a1", + "ba1b1402 bae5d07e bb0129cf -> be32c7b0 3ca6afe6 bd363b1d 3ca6afe6 be1e2163 be2969b9 bd363b1d be2969b9 bf186251", + "bed36ec7 3efd7e52 bf2a79bb -> 41d7fe95 3fed7914 c0993b4d 3fed7914 41343871 c0054c02 c0993b4d c0054c02 417f2851", + "bf959b42 40c87a47 c0acd335 -> 417b5c84 c070e922 40b817c2 c070e922 c083ae8d 40da3873 40b817c2 40da3873 41761517", + "bb87cd73 bbf48544 bb563a68 -> be2b9dce 3dce53b9 bece4a64 3dce53b9 bde12656 bf3f8793 bece4a64 bf3f8793 bf6b7c22", + "c09a2937 3fb8422c 40491dd3 -> 40eb663c 412479fe 3e82169e 412479fe 418db457 40940e36 3e82169e 40940e36 4091c334", + "3cc29eaa bc9ec065 bd2e03aa -> c09872ce bd7cea63 402f811e bd7cea63 c08134f5 bfca0ca2 402f811e bfca0ca2 c14fead8", + "3d551553 3d0adcee 3d111e84 -> 3ff1495d bf48b05a 409c7d9c bf48b05a 400f9ae9 404551f1 409c7d9c 404551f1 411f6eeb", + "c101b158 c0526483 bef0821e -> 412b7bed 40388ef4 40b91601 40388ef4 40df5021 3f29323e 40b91601 3f29323e 418f8a4f", + "407232ef c1a6bddf c1b4deef -> c121a94b 410e7772 c1570211 410e7772 c0d16f9c 3f086340 c1570211 3f086340 411ecdb8", + "bddb7405 3d8bfe83 3ba3cd48 -> 401672ee 3ec04802 c12248b3 3ec04802 beafb500 40ccfd58 c12248b3 40ccfd58 3fdc1783", + "39cf7889 3a129b68 3a26ba97 -> 3d512e12 bc07c2f5 3d122908 bc07c2f5 3d458e17 3d57e82d 3d122908 3d57e82d 3e42f357", + "3dc7abb2 3f7756a3 bf6c7243 -> 41ba6dd0 c0a917ab 4079dd02 c0a917ab 4118bf1b bfa21c5e 4079dd02 bfa21c5e 408a5f44", + "b9a7c3fe 3bb8be99 3afeb3cf -> 3e259627 bd3cf222 bd4d7b2c bd3cf222 3d6eb43b 3f11ed28 bd4d7b2c 3f11ed28 3f0f8b63", + "ba7f8642 bb0a89db bb279eb0 -> be63eaab 3cdb93f4 bda26244 3cdb93f4 be4faa35 be4aa1c8 bda26244 be4aa1c8 bf45a54e", + "bdc3e99e bdda5921 bdea6e1d -> c0b995a0 4029d1b1 c0bf5c77 4029d1b1 c0ac69ba c0d86143 c0bf5c77 c0d86143 c1d0951c", + "42391be3 424700d4 c2578ea9 -> c130b379 c0b53edd 400d348b c0b53edd c1929561 be562996 400d348b be562996 c12d4ab7", + "b6603cf0 b9257117 b9b786a5 -> bd0f543f 3ab73a68 3b3047ae 3ab73a68 bd045a10 bc5b622b 3b3047ae bc5b622b bddd1345", + "39230e04 39186e63 38b0285c -> 3b613e13 bb2b163a 3c7d5494 bb2b163a 3b6cc3c5 3c6c0c0f 3c7d5494 3c6c0c0f 3cc18e3a", + "c0442d52 be2ffbd3 3e892525 -> 40764565 40abdb3d c027b443 40abdb3d 415f95c1 c0eefe20 c027b443 c0eefe20 c13dfcc5", + "bdc575f3 3de5e936 be185490 -> c1121f4a bfe5675d c08cbc30 bfe5675d c135d08f 40e7a972 c08cbc30 40e7a972 c1ff2777", + "ba0c5c56 39ac0a5b 39c2d5f2 -> 3d4be9e6 3aebc610 bd718fba 3aebc610 3d0e87ee 3cfd78e1 bd718fba 3cfd78e1 3df16a3e", + "bbbf96d1 bbe4e75e babff1fe -> 3d770dea 3de3f508 bf188406 3de3f508 3da3fe03 bf36da6c bf188406 bf36da6c beb11b20", + "b8ac231f 350cad86 38d38f61 -> 3c4f07a5 3a398873 bc1a616d 3a398873 3c378aab ba573945 bc1a616d ba573945 3d03f835", + "3f4044b2 bfc1454e bfc889b0 -> c143ee3b 4106c1bc 40dc2124 4106c1bc c158ae21 bf8dfcaa 40dc2124 bf8dfcaa 408affeb", + "baffe4f6 3b4b87a8 bc34d56d -> bf8feb45 bc253537 bddb61c6 bc253537 bf9b226a 3ed62d05 bddb61c6 3ed62d05 c05cfff9", + "bf1bbe50 3e62e3d6 be1ad5a2 -> 404377e2 c04257e9 412ed856 c04257e9 4125cbd3 bf2dacb0 412ed856 bf2dacb0 4192544c", + "c0007fc6 c04bebb3 bfb3050e -> c01d1c86 40fe4153 4085a67a 40fe4153 c0c23e34 40d2e525 4085a67a 40d2e525 4091a576", + "bd082624 3de6dbcd 3a80b2df -> bb1c9c39 bf28b74f c04c28f4 bf28b74f c0103f40 412c8a2f c04c28f4 412c8a2f beb44422", + "3c0f48f1 3c0f947e 3bb449fa -> 3e897989 be1bca66 3f5c94f3 be1bca66 3e895066 3f5d0fb1 3f5c94f3 3f5d0fb1 3fc84bdd", + "c0ab9148 c19a19cf 417384d8 -> c0ed594e bbe667c0 40618465 bbe667c0 c0c84fba 40290851 40618465 40290851 40fa1fb6", + "b9022f22 b81ef98f b946898c -> bc845989 3ab8501d bc38e15f 3ab8501d bc909c59 bb16fecc bc38e15f bb16fecc bd6c84ed", + "3aa91c6d bb907ab1 bba93d89 -> bf086df2 3cdd5816 3e375b11 3cdd5816 bede2de3 bed3f934 3e375b11 bed3f934 bfcaf542", + "bb6d5517 bad3bb08 bb5c6fed -> be77a81d 3d3a2c4b beb20fcf 3d3a2c4b be8dab18 be0e4e12 beb20fcf be0e4e12 bf80a492", + "3f1db0b7 3f2ce141 bf6a92d1 -> 3fae8123 c0c16f43 c0c1fdd4 c0c16f43 c1642845 41007869 c0c1fdd4 41007869 c093dfc3", + "3b48d8d5 bb9e81ff 3a89cc5f -> 3d92b496 3c7c4e7a 3e9eac19 3c7c4e7a 3e55b865 bf033e83 3e9eac19 bf033e83 3eaff9bf", + "3ebad7ae 3e05508d be8364ed -> 41a1a7b7 c0e68bbe 40895f57 c0e68bbe c12d2a72 bfd29560 40895f57 bfd29560 40446598" + ] + }, + { + "glsl": "mat3 cultmath_snoise_hessian(vec3)", + "tolerance": "ulp-bounded, coordinate bands 1e2 to 4e6", + "check": "Read at the case's point x, with S = |x|_1 and (e_n, e_g, e_h) = math.span_slack(math.span_rounding(1, x, zero stage, 0, 0, 0)), against the kernel's exact values in double: |n - n_exact| <= e_n and |g - g_exact|_2 <= e_g for snoise_grad, ||H - H_exact||_F <= e_h for snoise_hessian, no tolerance. Report the largest fraction of each allowance per decade of S and the largest absolute error at S < 1e-2.", + "cases": [ + "c73b7f66 46041c5f c49c1230 -> 400f0f7f 4033a88a be9ec6de 4033a88a 40f95e75 c0909af2 be9ec6de c0909af2 41028867", + "4278303d 43b6d736 40ce5413 -> c0177ba2 c0f1add7 bf0e9778 c0f1add7 c13b4373 410352e7 bf0e9778 410352e7 406a4ff1", + "c8e1f89d c8b0c345 4806ee87 -> 40da9956 411ae70f 3f2cbde8 411ae70f 3f9a2e93 c05a13c4 3f2cbde8 c05a13c4 3f183120", + "47a4b4fa c7e31a47 c8cbc864 -> c0136bb5 40d74cf3 c13a9aed 40d74cf3 41db45e0 40585301 c13a9aed 40585301 bd9d93b0", + "c6c1c750 c68f694d c5855ed1 -> 4030e9da 3fc50e4a c157f636 3fc50e4a 40262d7b c0efc229 c157f636 c0efc229 3f952d4f", + "c3170ccf c3425de7 433d1342 -> c0023af4 4098ad91 3fd68a10 4098ad91 4058774a 41457579 3fd68a10 41457579 c0157a20", + "49ef0d5e 48e0475b 49d74fb5 -> c12c13cd 40c5cfb7 c085af3d 40c5cfb7 c152d438 415a7b30 c085af3d 415a7b30 c113b264", + "45e56513 c5c83055 c652e10a -> c0030457 bfd73cc0 bd9e729c bfd73cc0 c08242c9 3fb4405c bd9e729c 3fb4405c 401527bc", + "46ecac49 c70522b3 c70304d5 -> c0f56990 40e5d444 3fc0e587 40e5d444 c14194dc c10055a3 3fc0e587 c10055a3 c0ac8a2c", + "49a9b6b5 c92685e8 c9e8459f -> c08ff87d 4129dda8 40a13059 4129dda8 4167c0b9 c0a5a630 40a13059 c0a5a630 c0062e9f", + "482c8ddb 48cf01cf c828eb6c -> 41a1c100 3fce7c7c 41639232 3fce7c7c 4100abf8 bfc878a5 41639232 bfc878a5 41202184", + "49de953f c91abe41 4a33750c -> c1f4b6d9 c1053baf c096a387 c1053baf c1a3b5ed c09a21c8 c096a387 c09a21c8 c1880d5c", + "432fa34e c29bd0f9 c300894f -> 40de1ba1 41241565 bf985a38 41241565 41229880 bea4deab bf985a38 bea4deab 40f42ef4", + "c6974486 47ca6510 480ac3a4 -> c19056f5 41190e8a c0968624 41190e8a 3fd53236 41130ec1 c0968624 41130ec1 c137f70b", + "c51af85b 449ad25a 437d0a7f -> c109cbc4 c0017b57 409a0219 c0017b57 40bdef33 bfd4b248 409a0219 bfd4b248 415bb437", + "c7cddd85 c7718c9d c7aedfe8 -> 3ee34b6e 4117ada4 bfdd1469 4117ada4 c0a18e5d 40a0d4d8 bfdd1469 40a0d4d8 3fc94230", + "48cc6dec c80e67b7 4882d5ab -> 413f54c8 bee0848e c0836a77 bee0848e c09a8d9f 3f08d744 c0836a77 3f08d744 c1a15b6d", + "c378097d c45085d6 c4bf799f -> c135b832 c01946d1 c0b05831 c01946d1 c19b162a c0ca33a0 c0b05831 c0ca33a0 c13daa56", + "451f3745 446ed86a c5869092 -> c0043625 c156395a 3eede72e c156395a c144dd41 4089fd0f 3eede72e 4089fd0f 40edf062", + "c74485d7 47b0691f 47ffde67 -> 404717e0 bf58a4de 413142ae bf58a4de 4044e609 3f0678c1 413142ae 3f0678c1 412a31db", + "c6c14244 4816d821 47b7c56a -> c1881554 c0dcb54e 3feaf9c4 c0dcb54e c129422a c0de6cfe 3feaf9c4 c0de6cfe c182639e", + "49482f70 49517307 488938a2 -> c0991c1c c111efb8 406bd3f1 c111efb8 411f2cc9 c1997e65 406bd3f1 c1997e65 c05c5e2c", + "4953cd35 c89d4332 49198fd0 -> 412f5caf 40c3eb1e c0f2c3eb 40c3eb1e c124a4e5 c078e779 c0f2c3eb c078e779 4129d8a2", + "4a378b76 ca12d8ac c9ca4bdf -> 4161d959 40317086 c1317d92 40317086 c138e784 401d5e49 c1317d92 401d5e49 c0956826", + "47d80c83 ca3ebedc 49831f29 -> 366a2ea9 00000000 4048ba3d 00000000 366a2ea9 41380016 4048ba3d 41380016 37244e28", + "c8aa295b c85df9d0 4893e046 -> c04df4ba 412de49a c04e2403 412de49a c0da1971 408c7429 c04e2403 408c7429 c0bb3596", + "c303006d 449acc47 c4ae1463 -> c1329232 40b07bdc 40795fe9 40b07bdc 40f31fb3 40e8e066 40795fe9 40e8e066 4114b0ea", + "49498bc8 c7a55b74 47170aaf -> c11ae98e 40960bd8 400748fa 40960bd8 3faf6c57 c103c22b 400748fa c103c22b 40705c64", + "44813b83 c4565d34 c34e8eef -> 413d0386 40ffd3d1 410405f4 40ffd3d1 40edca6e 40b15304 410405f4 40b15304 c006c534", + "c30a4e20 c4974544 c5090230 -> c0785807 c104234a 40513f68 c104234a 3f0075f8 c0119a9a 40513f68 c0119a9a 40b26294", + "c3206086 4221c9ec c37cd904 -> c09225e0 407d52c1 c0135d29 407d52c1 41472769 c097d711 c0135d29 c097d711 41668d1e", + "49a4be2d c9c38a62 48b6b9d9 -> 4144ba01 c0c725ed c082ad7a c0c725ed 40d80557 c0f5bcb0 c082ad7a c0f5bcb0 408b76b8", + "c64e671e c69c430c c66b9adf -> 40c1c2fd 4132e7e6 3f1a6df0 4132e7e6 416ece9c 410e2983 3f1a6df0 410e2983 411cdc20", + "c7471045 c9052d7e c886fb64 -> c11b77ef be4a68e2 c0f0ea86 be4a68e2 415801fc 40ac1045 c0f0ea86 40ac1045 c02b1cff", + "c7aff073 c8a8a529 488f2baf -> 3ff855b5 c16d80ef c04e95f5 c16d80ef bfcb368d 3eb735fc c04e95f5 3eb735fc c095da2c", + "45f19571 456c6a86 c66c37f4 -> c11957b2 4016ece8 c0bf5609 4016ece8 c11f1592 c19362a1 c0bf5609 c19362a1 4076e93b", + "c5c4a80f 45d1ab12 44fb667c -> c014614a 40874a9e bfc0f421 40874a9e 3f0ac753 c0d2d624 bfc0f421 c0d2d624 bd6cc688", + "4458beb6 c51c66d7 4582b905 -> c0841bba c0afbb09 41482f01 c0afbb09 41135b06 c015fe3d 41482f01 c015fe3d c12e8c6f", + "c41a43a9 c43c519a 4468897e -> c1844125 bf20664b bf407d9c bf20664b c0137a7f c0993939 bf407d9c c0993939 c1933129", + "c84e2fe4 47bee157 484cec77 -> c016e52f 410451c0 4110d7a0 410451c0 4107fb35 c03ba054 4110d7a0 c03ba054 40f50541", + "c6b9ba4b c624daeb c69c43b8 -> 41742d98 3f72b40c 40a1db67 3f72b40c bf9bb1db 411036a8 40a1db67 411036a8 414e424f", + "413360d9 c22a410a 43e76fbc -> 41212a20 c072f43a c092ca09 c072f43a 418f5f24 41220430 c092ca09 41220430 41a06f38", + "c7eddf37 47f1d2da c82ffe81 -> c124cc3d c0dfd68c 4068c4e9 c0dfd68c c06fcdb0 40235c6f 4068c4e9 40235c6f 419fa29b", + "c406200c c3af008b 45b34a69 -> c08a2aba 40dc9b0b 4115d141 40dc9b0b c12a4d16 409a12bd 4115d141 409a12bd c10a6a92", + "c719342c c70249a5 c698e09a -> c0b74fa5 c0443d5c bfd25cab c0443d5c 414091e6 3fd2e67d bfd25cab 3fd2e67d c032c65e", + "c8d3d4e3 48cb491a c8409914 -> bfe3b6ca 3ffc9ced c050a16b 3ffc9ced c07a3c34 40c6174d c050a16b 40c6174d 3fc22987", + "4373a3bd c19a53d3 c2996426 -> c0b66917 bfc72508 418725dc bfc72508 c07705a1 bfb21b36 418725dc bfb21b36 c0a0eaaf", + "c7afb3fa c622946f 47319f5e -> 41264575 c00fc01e 415b317c c00fc01e 40dc83bc bf69dea3 415b317c bf69dea3 c122c001", + "46981ae4 c6d926fd 46a69f13 -> c0fab28c c0672ee2 bfb91d2c c0672ee2 bee8908a 410a12f8 bfb91d2c 410a12f8 4143becc", + "c2740598 43331b84 42d940a1 -> c0f478a7 c180fc27 408ac601 c180fc27 c17154d9 40a7fbf1 408ac601 40a7fbf1 4156434c", + "489b3a38 c8479e02 48c4f47d -> c14f084f 40d13cea 40abf8ef 40d13cea 412b991b 40459be9 40abf8ef 40459be9 bf0fb765", + "c417f9de c5894c53 c5919b69 -> c0f1ff22 40f67d4f c047eff2 40f67d4f c15756c3 c0ad1ac8 c047eff2 c0ad1ac8 408bcd9a", + "c5ae8083 45bd7ddb c59e999c -> 4058a5e3 c0d24502 40880adc c0d24502 41acb35b bf8e5b96 40880adc bf8e5b96 405cd96d", + "42afc9a8 42891b61 430d6394 -> 40c6770b 405b2c3a 40981ef6 405b2c3a 40aaaa31 bfe75f9a 40981ef6 bfe75f9a 41adfd9f", + "c9e41b1f 49821de0 c8d79106 -> c1220452 bfb88543 41115fd3 bfb88543 3ff33126 40e7cbab 41115fd3 40e7cbab 40fae44d", + "c4d51c73 45730cc4 c5504ed6 -> c0d8b201 40e6c5ce 4064b1db 40e6c5ce 40b25950 c1420df0 4064b1db c1420df0 411e8391", + "c3c39689 c3dfa290 c3abbd88 -> 40f3fe7c c01b92b6 bffc4283 c01b92b6 40232d74 c1204d72 bffc4283 c1204d72 41aa1d9c", + "c5d844ae c68ceb29 c5c4d334 -> c0f47dc3 3fa46756 c088b433 3fa46756 c15a1333 c02a4598 c088b433 c02a4598 c185798f", + "4527f2ed 44ca2af0 c5315a4e -> c05b61a3 beaa338a 3f754343 beaa338a c1ba5c3c c047e01f 3f754343 c047e01f 41027b90", + "c7491e74 c7b88204 47748d75 -> c046716d 3fac60ae 409962af 3fac60ae bffd6e86 bfef3bcd 409962af bfef3bcd 407060b1", + "46e7c3a1 c6886d8f c6f11892 -> c0ce6ce3 c09c2e82 3fda7e78 c09c2e82 41174434 c095a03c 3fda7e78 c095a03c c16dcfe2", + "c8aa2869 c7109af8 496713bd -> 40d893fc c09dda3a 400fe81a c09dda3a c09d018b 40968d40 400fe81a 40968d40 41239f51", + "43317291 c1e16661 c2ed88a9 -> bf3dd5b9 41003998 c0f1b298 41003998 3fb0e27e 40b487f7 c0f1b298 40b487f7 c127014a", + "4583e2f2 c43cfa6a c518ff3b -> c08dd95f 4144a83f 3de0b7cc 4144a83f c194e380 c1019445 3de0b7cc c1019445 c11b57f8", + "c2c7df40 42f455b4 c2dac4aa -> c0bc8d1a 3fe86018 c0cee7ec 3fe86018 c15a9b57 40686c99 c0cee7ec 40686c99 41744eba", + "c2e0cafd 4393e542 c3511d7c -> c1297bdd 41077350 4153ade5 41077350 c04cce4e 3f4544e8 4153ade5 3f4544e8 40a3443a", + "c504f2fb 458dcb90 43f85cf3 -> c0dfb2ba c0439c2a 4071fe90 c0439c2a c091b04d 4103bd70 4071fe90 4103bd70 c1094591", + "c38882eb c37ed11b c2d72c9b -> 4039fb2e 40ab895f bffbeb66 40ab895f 416e58d8 404debaa bffbeb66 404debaa 40c2c0c6", + "c2994bb1 44fe578d 4485ee05 -> bf3172a6 c1762196 3f25bc2d c1762196 41103f1e bf84399b 3f25bc2d bf84399b 3fff479e", + "c5efcf74 45c6ccdc 45e2caac -> c15f1658 3f94e92e c0c9c399 3f94e92e 40f39735 401747c2 c0c9c399 401747c2 c0f0400b", + "4a13981b 4a392385 ca6cc809 -> 4164bce8 411ca3ce bfe3ee78 411ca3ce c0a4c87e 40086e19 bfe3ee78 40086e19 41727c68", + "432bbcd6 c28581df c352aa8e -> 411bd62d 4062a2c1 40fd4cb9 4062a2c1 c03a3587 3c97d1ca 40fd4cb9 3c97d1ca c084bf4a", + "ca46c062 ca0e90f5 c9d69676 -> c0c26a73 40d5077a c041d6f6 40d5077a c00830fa bf893f79 c041d6f6 bf893f79 c18cd7bb", + "43c9b6a4 443676e5 c4698bde -> c17c77cb 40a4ab59 c103a76a 40a4ab59 3e592d17 40d6c8d1 c103a76a 40d6c8d1 417ca5a8", + "c342befa 43c8c257 4417409f -> 3f3ce240 4092f15a 3f03788a 4092f15a c12a1a59 407f3c4d 3f03788a 407f3c4d 415a4e21", + "c585df79 c6944c49 45ab27b2 -> 41453e23 412fdf5a 40a1e93d 412fdf5a 413a8165 40cdfeff 40a1e93d 40cdfeff 4168e927", + "45063606 c3c6b61b c3cfdccd -> 40d601ee 4169abd7 c0445829 4169abd7 400bcb16 401a0d16 c0445829 401a0d16 bf4e03af", + "c6217b29 45fa7b54 c6b21124 -> 3f974689 c125609f c10d9679 c125609f c1648d6b c11d4957 c10d9679 c11d4957 c147d5c2", + "c969628e c94f011b 49b60f7c -> bf73a197 40e9618f c0a00c9f 40e9618f c022d007 4008c0d8 c0a00c9f 4008c0d8 bfc7bb3b", + "c8ce359b c993be40 c9a1e2ab -> 3fb9bac0 407d4f4d 4096db1c 407d4f4d 41737877 c0b82a2b 4096db1c c0b82a2b 40e6c982", + "483ead58 48e66f74 c8b98997 -> 417f54c0 40dce3ca bf79a8b2 40dce3ca 41703c47 40804a74 bf79a8b2 40804a74 41876cc4", + "c7a33540 c8013844 487948a2 -> c0344740 c1084c68 405961e2 c1084c68 4064ef13 410181cd 405961e2 410181cd c0d96cde", + "457a66a7 c3060f9e 44441b1b -> c0e0058e 409ba064 c0c1b181 409ba064 418433cd 4023ce42 c0c1b181 4023ce42 bfce2b1c", + "4483d7ce c4d5d5b9 c494ca39 -> 410812e0 c05ce531 c05fdd79 c05ce531 41c36442 c035b9f1 c05fdd79 c035b9f1 4121a3c6", + "c230ee5b 42074bbf 43071c36 -> c13d4b2f c1274da1 40ac72b8 c1274da1 c12892ca 4013f482 40ac72b8 4013f482 409eed8d", + "c697b055 c770693e 47253132 -> 3f334469 3fc9917b c0f5fd76 3fc9917b 3fbc18d8 40a1ff80 c0f5fd76 40a1ff80 c18fd03a", + "c27818e5 43b63dc7 c330a802 -> 3fdf657c c0563550 40a72215 c0563550 40e4f1b3 c137062f 40a72215 c137062f c18db65c", + "c4ddab94 c5aae0d2 c6239665 -> 4157fc7a bf53dd4a 3dd7e231 bf53dd4a 41bc1798 40073330 3dd7e231 40073330 4139ada6", + "c22d5186 c28208d9 42d66afc -> 3ff491df 40e75359 c0963baa 40e75359 4127110b c09795c6 c0963baa c09795c6 412668f2", + "42d8a4af c2585e76 41c45f5f -> 4135b7f4 c02529a1 c130f89f c02529a1 412dd3cf 3f6c4d27 c130f89f 3f6c4d27 c026d7c0", + "c88f9f7c 47992053 c8d9d303 -> c1665bc1 4069313c c1144ff6 4069313c c10cb534 c0da4709 c1144ff6 c0da4709 c15e7c00", + "41006f6e c455278b 44430723 -> 409a8211 c00146f7 c0a0819a c00146f7 bff02359 402247c6 c0a0819a 402247c6 c18efdc2", + "c86cafe6 c81746c7 4871aa28 -> c122a0fc c011ca66 3fbf230b c011ca66 41ebc0d8 c007c2fd 3fbf230b c007c2fd 40f71814", + "45301a17 4536b7ce 4479be10 -> bfd30b10 406bb096 bfbb655f 406bb096 416bc50e 3e41cb2b bfbb655f 3e41cb2b c1021e31", + "c2db28f6 42216114 c2f769c7 -> 41872d25 c06c9ac7 bf63b7bf c06c9ac7 40697971 401489ea bf63b7bf 401489ea 40463e09", + "42019844 44e78da6 438fd56b -> c0ac0607 3e1ee4d6 bf6ae7ac 3e1ee4d6 c1849a63 bf67d3b6 bf6ae7ac bf67d3b6 c0bfb7bc", + "c81458ee 474fdeca 495a07d2 -> c11b373f 3f26df1b bea76690 3f26df1b bf721840 40e8f156 bea76690 40e8f156 c16e440a", + "c87d32b6 4834da25 c88c61a1 -> 409c3b8e 4116858f 3e93b56f 4116858f 407ed872 3fcd9f0b 3e93b56f 3fcd9f0b 410c5e3e", + "4a4d54b5 4a31d60a c9eef15c -> c1a03347 40b36ca7 41336ca3 40b36ca7 c1158531 00000000 41336ca3 00000000 c1158531", + "c7c76db7 46aa8bfb c790a615 -> c17daf17 4092766c c10c147a 4092766c c16b0a27 40b74833 c10c147a 40b74833 c10754ad", + "c8b9353b 49260c5c c9f61625 -> c094bab0 c0c626ae 40a0ff31 c0c626ae 40c33110 4039d42e 40a0ff31 4039d42e bef88563", + "45b54633 44045dcb 452b2b75 -> c0875ddc c0a97a10 3f93dc32 c0a97a10 3c622cf0 40c2a4ab 3f93dc32 40c2a4ab 4014a84c", + "45fb4d8c c67fae6f c6b0667a -> c1947d0a 4064b94a c0d4d58e 4064b94a bfc3e8bf c06e9363 c0d4d58e c06e9363 410ebf98", + "45ff77ac c71b1e3e c7986180 -> c0359e5d 4149e1cf 3eb17fb5 4149e1cf c1aa4f28 408b331c 3eb17fb5 408b331c c0e46077", + "c2e38b57 c29619a5 4303319c -> 414368ab c16a01a7 3ff137fa c16a01a7 c0753d2e 3f2a6728 3ff137fa 3f2a6728 40596003", + "48a57daf c8051b85 493b1251 -> c0e80349 c0e73c9f 412f9622 c0e73c9f 40dc5a1a 404670ec 412f9622 404670ec 40417418", + "c7a6fd17 c6b19143 476d1abb -> c076cc9a 40bcb4e9 c0efeb09 40bcb4e9 4087dba7 413fc02c c0efeb09 413fc02c c08af15e", + "c33a5da2 42d7b834 c3b89795 -> 3fb44166 c13f6104 c0230bc8 c13f6104 c055ea03 c1438265 c0230bc8 c1438265 3f93bf96", + "c8975cde 4a0ef23b c9e8f7e4 -> c08f34c9 408585d3 40f6267d 408585d3 c1ca1cb4 be819597 40f6267d be819597 c0939178", + "c73c1464 460c534f 46ad34ea -> 417de3b6 c1031f51 4112f036 c1031f51 418f9cdd c07c44e0 4112f036 c07c44e0 41111f9b", + "c85678b6 c816c9c1 c88ec37c -> c00f9ede 3fbe6ebf bf710fa6 3fbe6ebf 3f9dc43d c16d6ad0 bf710fa6 c16d6ad0 c121de2f", + "493731ed 4993b439 48eb8272 -> c0d36673 41523679 3df8e05d 41523679 c08c1059 bfc1395b 3df8e05d bfc1395b c11c8782", + "438233df c1f483f1 c3ee0ab3 -> 4102f72c 3feb6e7e bf0f28e6 3feb6e7e 3e8bc5e7 3e3e2244 bf0f28e6 3e3e2244 413756ce", + "450a7e62 c411661e 43d78e5e -> 4155d01a c11d68b3 410455cb c11d68b3 c1368f3f c1129d12 410455cb c1129d12 4165239b", + "c3dbaac0 c37cd065 43c9e62f -> c16ab567 bfd26df9 411f1d16 bfd26df9 404ae335 c09543d9 411f1d16 c09543d9 c081b799", + "c93d1ab4 c89fa4fb 48be3762 -> c156d0c5 c09b7c32 be7383da c09b7c32 3fc32ba3 402cf421 be7383da 402cf421 c1125459", + "45d76686 c514156c c6002c78 -> c1174a49 c08a0f83 c0613e0a c08a0f83 402ae3d8 c0e90707 c0613e0a c0e90707 4153e76d", + "c7330830 477b7550 c7b328c0 -> 3f0436a8 c127e761 c13a18ba c127e761 c0df3b36 c09377c0 c13a18ba c09377c0 40f3dcdc", + "4a48c854 ca4d3262 ca419fd4 -> 4019b502 c049b9af 4044411f c049b9af c0846ef4 40c701e3 4044411f 40c701e3 c0f44a48", + "44aaf62b 4457837e 44283502 -> c081974d c0f205e7 c0e33a88 c0f205e7 c10c0d60 410830eb c0e33a88 410830eb 40d446bb", + "451b75e6 448b51bd c535c7a2 -> c0ce0e4e 4122870d c09a70dc 4122870d 4082f669 be6c6760 c09a70dc be6c6760 c0db9f3d", + "c3b7f3e9 42fc98f0 40b89023 -> c0b84664 c07e9cee 40abe20b c07e9cee 40fc6a18 4018e5ea 40abe20b 4018e5ea c0625e01", + "c414d724 4383c308 4466226b -> c0fa080b c13a9e28 c125d5ac c13a9e28 c0856dc2 bdc7a27e c125d5ac bdc7a27e c0233591", + "c6ce6a3a 4750e23a 47aa8d5e -> c1508564 41469c07 bfc58691 41469c07 c0626b6f c0891b3b bfc58691 c0891b3b c0f7248d", + "47c0c8e2 c81819a7 c63c924e -> 413454c6 c0f15cab c08e00ce c0f15cab 41188b53 c0535d36 c08e00ce c0535d36 c040a618", + "431dd3b6 43a5a55a c3e833c0 -> 409ce468 41298944 3fc14fa2 41298944 3f8fee63 c0972c10 3fc14fa2 c0972c10 40f602d3", + "c2d0407d c326001e c44766da -> 3f1d020b be7cf621 411f8e5e be7cf621 3fb4725b 40dd7808 411f8e5e 40dd7808 40df77d3", + "c1186a25 42f4d594 43448318 -> 406d29da 3fdfa140 41609d62 3fdfa140 c12329ea 412e90f5 41609d62 412e90f5 41407c81", + "c430b696 c3d26c23 43b4fcce -> 414ff6af 3eed62fb 413d7c3c 3eed62fb 412868ef bfa32b30 413d7c3c bfa32b30 41c65a77", + "45136824 45580876 43d79fa1 -> bf2ea3b3 c10d83fe 3f08c266 c10d83fe be8f3062 3ffe1542 3f08c266 3ffe1542 c10029f0", + "43910bc7 c4604989 43ca729f -> c0bfa953 41056939 3ff2daf2 41056939 3f300ab6 bf261e38 3ff2daf2 bf261e38 c04b3e49", + "c3878452 c28346aa 432f21c6 -> bf013796 41470b47 3fe65b46 41470b47 c15aebfe 41413212 3fe65b46 41413212 409cb584", + "c5fbabc6 c7dc1d72 c7563de2 -> c0d8343f 413ee562 40a8e19b 413ee562 c0e33217 c16e0eea 40a8e19b c16e0eea c0b5ded6", + "c5353512 453489b9 c4d3cdc9 -> 418566d5 40b1904e c1029b3c 40b1904e 40bc0a3f c0a2df01 c1029b3c c0a2df01 c0726140", + "c765a96d 470246cf c8812860 -> 4111a404 bf6a9845 c098c7e2 bf6a9845 c0a46a52 bfefa01c c098c7e2 bfefa01c c031fa00", + "488160e8 494b1f74 497226d4 -> 411fe28c 3f5111bd 40e4022d 3f5111bd 40acf3aa 409a9977 40e4022d 409a9977 41902ce6", + "c7d12f0b c7a1fa00 c7244f44 -> 412ad4e0 408831be c0faeda6 408831be c0b94b6f c0a1203a c0faeda6 c0a1203a 415b6530", + "c98c4eb6 c73034ba 48cdf751 -> 3ff73882 4082d05b 41811a86 4082d05b 3f4c5bbe 40b9732b 41811a86 40b9732b c15d3616", + "c30f71c1 c1a527ad c15ed35e -> 3fa0280a c0034747 c0325f22 c0034747 4139b957 40e97106 c0325f22 40e97106 411edccd", + "43174bdf c20b6ea2 c31784fc -> c19b881b bfba110f c1364989 bfba110f 408eedde c07bef29 c1364989 c07bef29 c1801bf4", + "49f6032d c9d22fdb ca0806a9 -> 40c004dc 3f482890 c0bd713e 3f482890 41238a8f c0304a18 c0bd713e c0304a18 40fd3f3a", + "c6af15c0 4760002a 469c33e3 -> c1ae85ea c1066e6c 40a9d25c c1066e6c c1b8175e 40c6ea42 40a9d25c 40c6ea42 c18b1fa0", + "c5bd72d3 441407b5 c577262e -> 4090d3ba 411025f0 403222b2 411025f0 c145bc2c c0e1f0d0 403222b2 c0e1f0d0 4136e16b", + "c4c1acf4 c41e0d87 44a2da83 -> c16490f4 4118612b c1275082 4118612b bf257836 c002be9e c1275082 c002be9e c08ecf30", + "c6d358ab c5bbc7a2 46ca2e79 -> c13ad20f 403177a0 c035989f 403177a0 c100bed6 3f0e1a42 c035989f 3f0e1a42 c03774d7", + "446007d5 478d5fbf c74c4540 -> 4193a69d bfbc921c 404c4481 bfbc921c c0d88a2d c0c5cca1 404c4481 c0c5cca1 c13304e8", + "c835edc9 c707a725 47ef31d5 -> c0271e66 be4d9605 415a446d be4d9605 c02434df 4156daad 415a446d 4156daad bf80f262", + "43eb2b13 c19b60e5 c30a4553 -> 41773cc0 c15d6426 bfd57971 c15d6426 be8fa6cd 3f96e8fd bfd57971 3f96e8fd 40a4c6a5", + "4591d012 450ab822 c5c78c4d -> c1933fcd c1261e9a 4119d225 c1261e9a 41804cd2 3f61826e 4119d225 3f61826e 40038860", + "c7f53bba 47b17d4b c800e686 -> 416940b7 3ff4020a 3e7250da 3ff4020a 419cc68a c09ec9dd 3e7250da c09ec9dd 4170acc3", + "44ca5759 44c45df5 42b549e1 -> 4184024a bf80ef81 bf162eb0 bf80ef81 420ac3ea c107142f bf162eb0 c107142f 4189bd19", + "c7c7d36e c846b2ad c61b2d44 -> c104b9e4 c0514d6a 40bdab38 c0514d6a 403d3dc1 c007b829 40bdab38 c007b829 4095d243", + "c53f925b 46a2b029 c6aadbc2 -> 417347a0 c15430fe 40ad038e c15430fe bf3e7623 3fd0fcd3 40ad038e 3fd0fcd3 40c75039", + "c4fa8745 4541020d c503daaf -> 4130aa47 c0c4daa0 3f55762d c0c4daa0 40d00ca1 bf86b9dc 3f55762d bf86b9dc beb03709", + "c4c5cf85 450df570 c3952e98 -> c15e05cd c0b4c6ae 40e192ff c0b4c6ae 3f716dd4 402457da 40e192ff 402457da c0769878", + "c36289bc 448d8391 4450e965 -> bf930940 40f2b997 c0ba0b2e 40f2b997 c095a5d6 406e2303 c0ba0b2e 406e2303 c0a71cc0", + "47e4f459 c8f24e97 c7da99ff -> 40cc91c0 4111ffb4 bfd5342e 4111ffb4 40778f09 c09a02a6 bfd5342e c09a02a6 4140665a", + "4710797c c607ca3f 472d5ee2 -> c12f50ee c1822809 40321ef4 c1822809 c0d56321 3f34de4f 40321ef4 3f34de4f c04962cc", + "c9b51169 c9894d52 ca095540 -> 40f567d3 c0f567d0 40f567d0 c0f567d0 4105385d c0c4530f 40f567d0 c0c4530f 419a4143", + "c43153bd c424e7b5 423143d3 -> c0e6b266 c08e8983 40d23806 c08e8983 c0f5f223 c029cc5f 40d23806 c029cc5f c1dd56c1", + "467b7119 4610c56f c5b4319c -> 40388786 40b8de5c 40bdad29 40b8de5c 40b28eb1 c0c5258c 40bdad29 c0c5258c 4011a241", + "442668b9 44d94c25 45154094 -> c12c2388 40fa5ae6 4038f312 40fa5ae6 c0d60588 c14f3817 4038f312 c14f3817 40a1e8f4", + "4612a6c2 c627fefb 4448ae7a -> 403ecffc 40e2da2f 3ed24526 40e2da2f c0cc4465 40993fa2 3ed24526 40993fa2 3fa2c3ad", + "c0965f85 432d5307 c2f356fa -> c03c7f69 3fc07f9f c0110ddc 3fc07f9f 3e51719e bed77ce0 c0110ddc bed77ce0 bf9c58ad", + "c33387ed c22a3547 43749081 -> c0772d06 3fa4c890 3f744632 3fa4c890 c0cee0db 40a86e6b 3f744632 40a86e6b c18c06bb", + "c584f94a c5063bff 4611af77 -> 4030993e 40fb8c9f c10f1826 40fb8c9f 40870e0e 411a54df c10f1826 411a54df c058a16e", + "c283ac77 43060635 c22cdb42 -> 410855d4 bf347cd2 3fa4bc7a bf347cd2 c12395e4 3f9e8869 3fa4bc7a 3f9e8869 3eafc29a", + "c5f21e1f 4760971b c7366f4b -> 407b338f c0492fec c07f24c9 c0492fec c0814191 bf2b708a c07f24c9 bf2b708a 3ddb4944", + "43407b32 c423101e c32f4940 -> 40c8b24e c0543e28 c1580032 c0543e28 411d516e 40da61b5 c1580032 40da61b5 415ae17d", + "4836aa49 47d84329 c46363d4 -> c17c24cd 4124ceec 3ffd67a9 4124ceec c0e35dd3 3f1e3db9 3ffd67a9 3f1e3db9 c10d15cc", + "47c0154c 47aedddf c6960ca3 -> c1be620f 3fb6b817 c104a0ed 3fb6b817 c115ed6e bf320eb0 c104a0ed bf320eb0 c155c294", + "c8a0c33b 48ad39e5 c8557b04 -> c1605351 c0f66359 bf9c1469 c0f66359 3f16c82a 40a925dc bf9c1469 40a925dc 41862943", + "49cea312 4a726512 4a329818 -> 4128f273 c140f9fe 40375870 c140f9fe bfd1dafc 405405cf 40375870 405405cf 40b62356", + "49154d18 c6d2f4d9 49182dbb -> 409250a5 c092525c c15b789f c092525c 40ec6afd 409c8734 c15b789f 409c8734 41093402", + "c9e381e4 49980a9a ca01f5c7 -> 3fd139e5 bfb631a6 bf9cb66c bfb631a6 c081a15f c02bda73 bf9cb66c c02bda73 4198a058", + "450487ee c704ccf9 4709be3a -> c11b9000 41138a87 3eddeb39 41138a87 40dbf18c 40de7b42 3eddeb39 40de7b42 403b1423", + "c5984a47 c4b9c4e8 c58e438b -> c0fedb95 40abeecb c08168f2 40abeecb c0f7d567 40a44021 c08168f2 40a44021 c17c17ed", + "42f44c70 c2fbd259 c29af746 -> 414d5339 400268e5 c0ed00f4 400268e5 412ef83f c072d605 c0ed00f4 c072d605 41e6e261", + "48680465 483e6344 48a950c1 -> bf4f27c4 bf49c177 40f76b99 bf49c177 405f7636 c059f8f3 40f76b99 c059f8f3 401d27a2", + "c70b12a7 47a3d3e6 4789240b -> c1075d27 4032bfe0 c0750b35 4032bfe0 c06185a5 4140d925 c0750b35 4140d925 c0e0b584", + "c77d75e8 c7acd84c c6063e79 -> 40088022 bee739e1 4184f0f8 bee739e1 4035da13 c09da951 4184f0f8 c09da951 c08ba3c9", + "c399f744 452879fc 450db181 -> c11670d2 4037c88c c0701b9b 4037c88c 415a1d9d c066eb14 c0701b9b c066eb14 c073c57a", + "47cf83d1 c831e14a 47ffee7d -> 4098809d bebb5223 404963c1 bebb5223 419732bc 40edc4db 404963c1 40edc4db c05ed133", + "4925d51f 4902fdc4 c9a70b0b -> 40daf6af c0c81417 3f702e7e c0c81417 c05a585d c02c18c5 3f702e7e c02c18c5 40667dcc", + "488d3b54 48a0d89a 48e13b6f -> c11b8e90 400c2384 c0e43077 400c2384 bf85dca2 c0a3ebfe c0e43077 c0a3ebfe 413b9eb5", + "c3413bd0 44e92807 c4236c9a -> 418cc7fa 410304d4 3f50ec39 410304d4 c0bba5f6 c084a91f 3f50ec39 c084a91f 40fcb4ac", + "438486de c4108db9 c4ebb1dd -> 40518e03 c046c17f c0ea04f4 c046c17f 400f12f2 41034159 c0ea04f4 41034159 c185ac59", + "c87c9bc0 c7a0b84b c70f609f -> c12dc2ed c0c5a5ba be5f18d2 c0c5a5ba c068c224 bd0bfcfe be5f18d2 bd0bfcfe c18b6537", + "c7323538 471f5018 c7103e50 -> c11c84bc 40dea1f4 c10efee6 40dea1f4 bf365e36 404e16f3 c10efee6 404e16f3 415e974d", + "4435dbdb c5474094 c2849992 -> 40ab3ee7 4035a5c9 416e9520 4035a5c9 c0ab8ed4 c1c6ae99 416e9520 c1c6ae99 3fd05e37", + "41e3ae25 43b73a95 42b5aff4 -> c0a4efd4 c12d477c 3fe3bb51 c12d477c c0f4c2a9 c082ff6d 3fe3bb51 c082ff6d 3e650e66", + "c67a1ee3 c7866add c534976f -> 410917ef 4035102e 41199389 4035102e 410ae191 411e8347 41199389 411e8347 40115f28", + "4563009c 452681ca 44f78a9a -> 4162f252 c0b155cd c0ebe5de c0b155cd bfd4ece8 4112c920 c0ebe5de 4112c920 40f6bea5", + "46af7c47 4645f3a0 46a6f681 -> 418bbd29 c0c754ab 411eff6d c0c754ab 41049cdd bf540577 411eff6d bf540577 c102cba6", + "c5f44b61 c4db2248 c63f59cc -> c0bfd783 c0ac7e46 3fe71c7d c0ac7e46 4160e9a5 c03fa4dc 3fe71c7d c03fa4dc c1416c8d", + "49db3802 49b5f1cc 4798fb87 -> bfc13524 3f2fbe48 c1228002 3f2fbe48 40e00401 3fc83e86 c1228002 3fc83e86 c1932ede", + "c5a8a446 c582674f c5dc843c -> 40916d89 3d7ba0ae 4136a8e0 3d7ba0ae c151dd00 3f27d888 4136a8e0 3f27d888 409abee1", + "c64fca96 c61efc24 46817c48 -> 404a5804 40943027 bee7644e 40943027 40fc0a21 3f8b4290 bee7644e 3f8b4290 411e98c5", + "47a6e1a4 c88398b9 4940d70f -> c134c5e9 c0ed69da c06dc74a c0ed69da c14c892c c1688b91 c06dc74a c1688b91 4108f1e3", + "431d7c47 c243c605 c21bfdad -> 4043bffe 412dfba6 411ac4e8 412dfba6 bd8c76cf c02cfa70 411ac4e8 c02cfa70 40dfea49", + "465ef587 c792ebd3 468dc002 -> c09e76cd c0b0f1d2 c0953a68 c0b0f1d2 407bea59 c0db6d1a c0953a68 c0db6d1a 419b8a94", + "490604cb 4953401d 47233ad2 -> 40eed9df 406a076f 3f185123 406a076f 41cd767f 408def4e 3f185123 408def4e c0976d40", + "c899455a 490a8f37 c8cabf24 -> 41288946 c08db188 4150a5ed c08db188 bf6306e9 c1081def 4150a5ed c1081def 404024f0", + "4a1397ea c8b22f50 c9cf1b68 -> 40eeb2e3 c077fe42 40eeb1a3 c077fe42 40d54fe9 41568c03 40eeb1a3 41568c03 4100e71c", + "45830d91 c636315c 4538cc5d -> 40eca424 40343595 c08cc3dd 40343595 41237305 4042a042 c08cc3dd 4042a042 bf4d1283", + "ca62d1b0 4a6f0260 49e62d40 -> c17dd2ac c0afb083 c020af48 c0afb083 c1c17bb1 c0d57c5c c020af48 c0d57c5c c191cf42", + "c4c920f0 430e57d4 c3a40fb3 -> c11c05b7 40fdb7df c108ae7e 40fdb7df c0149aca 40070da7 c108ae7e 40070da7 4153a399", + "c6739269 c72bca4f c6e80940 -> c15170ff c0c23805 405eb87d c0c23805 c1409903 c0d0ea1a 405eb87d c0d0ea1a 40a6d0dc", + "483d971f c867f5ad c7e8b343 -> 408939fc c09d3b2c 40b9d2f6 c09d3b2c 414519ba c0ee7a7a 40b9d2f6 c0ee7a7a 41c79f4f", + "c317332b c1c190b5 43058ef8 -> 3e4fa4c3 c0538b9c c13685df c0538b9c 406754b6 40051536 c13685df 40051536 407f4232", + "c9e4a695 4a52b990 4a05321b -> 400a222f 40f2144f 41418cad 40f2144f 40997f54 bfa74cfd 41418cad bfa74cfd bee55382", + "c459f97b 42fa24c2 c4803545 -> 41b4f04b 40ee6ad5 40a4db05 40ee6ad5 416cf750 c093f8ef 40a4db05 c093f8ef 4157b91f", + "456a347e c7065ebb c479fa38 -> 40e9fc31 4084c970 c0027c82 4084c970 418379cb 4179912d c0027c82 4179912d 410e991b", + "c4291b5b c4458114 c4c641ac -> 40d15f64 40636fa9 404b8438 40636fa9 c0bd5620 c13a9573 404b8438 c13a9573 bf1ed5de", + "4416c41e 4376ceff 44977f46 -> bfd3682e c0d0a811 4102905a c0d0a811 4108af68 c0ae74d1 4102905a c0ae74d1 419d971a", + "c8243007 48e4b204 481b0951 -> c17eb9dd 40a7048e 413a2a0d 40a7048e c057afb2 40899a63 413a2a0d 40899a63 bf07af6a", + "46eaf7c3 4706e72f 476366d4 -> 40045b99 c09b208a 4094801c c09b208a c129806e 40f7ec16 4094801c 40f7ec16 c15ac7cc", + "c32233e0 c4356a0f c443c4cb -> 41284573 c0c43e75 bec66016 c0c43e75 c19b10a2 412edef5 bec66016 412edef5 c02a5b56", + "4855fe46 49c84d54 c9f9c2c1 -> 411da2a2 40354363 40362ad8 40354363 c169409c bf8d77f3 40362ad8 bf8d77f3 c0803d44", + "477ae0e6 c7910cbf 471b7adb -> c1125246 4116bd7b bfaefd9e 4116bd7b 413816a7 40774d89 bfaefd9e 40774d89 3fe2e9b3", + "c82cc9eb c8811095 c781c7be -> bf8d1b1d c0ee1d2e c03a83d9 c0ee1d2e c141bae4 c0a5320a c03a83d9 c0a5320a 41457435", + "49c8cf2f c9bc0ee8 ca038637 -> c1647843 40d050ff 40c7fc7e 40d050ff c09bbe2f c1178050 40c7fc7e c1178050 c172e102", + "c1dd7b66 c26079ce 433400bb -> c150decd c098931a c1289b1f c098931a c121bc89 4096d477 c1289b1f 4096d477 c13c4e0e", + "46df1cc7 c6c87576 464f974a -> bf9e55a4 c178c12b 40f3b28c c178c12b c0b14948 40ff9aae 40f3b28c 40ff9aae 4045a458", + "4500ff2f 4410249d 449d9439 -> 421cd567 3fb261ce 3fd22922 3fb261ce 40455a93 c01f7e4c 3fd22922 c01f7e4c 40d6b3ca", + "c8945ce6 c83f42fc c88ea5cb -> c09c537c bf9eb444 4022fb7a bf9eb444 c15e3d88 bfd88a37 4022fb7a bfd88a37 c0fb55d4", + "ca46ff2e 4a0e0f37 c7bce074 -> 41484247 c15ac1ba c08ae195 c15ac1ba be8d3795 3f05de04 c08ae195 3f05de04 bff4966f", + "c8385b0a 4857b7df c8334613 -> 3fd99ece c12e094c be676954 c12e094c 40d220b1 c1134ab2 be676954 c1134ab2 c0895ef1", + "46f05bb8 c6cd4f2f 46a2c97e -> c0a913da c0eba0a1 400f0b9e c0eba0a1 4068a233 c12c5a59 400f0b9e c12c5a59 c0921396", + "48578834 c842fc84 c7ed1201 -> c14ff824 c16d6f1b 3cbda97a c16d6f1b c198ff4d bf52827e 3cbda97a bf52827e c1141fe1", + "49bfcb9b 4980e517 48fa1f6c -> c08e494a 41595467 c0919b5a 41595467 41805308 406626be c0919b5a 406626be bd864c04", + "c79db873 c6e8a10c 47aa08c4 -> 416b166e 40b794ec 40b178fb 40b794ec 3fab97f7 c0e4111a 40b178fb c0e4111a c11a4e96", + "47ac0369 c77bf0ab c736b8b2 -> c1add045 bfd5c26d 40497018 bfd5c26d 415ed3e4 40894ca3 40497018 40894ca3 411d64df", + "467aeaae 45da1109 c56cff38 -> c0d4a0d6 c09442fe 40cdbcaf c09442fe c12223e4 bf961133 40cdbcaf bf961133 c18b010d", + "45e85742 44b70fd9 45907be5 -> 404cff29 40b6c2ec 40858105 40b6c2ec 40f74d99 bee8ea84 40858105 bee8ea84 3fa01c36", + "47e3c112 c85eaff5 46a7f901 -> 40e365b5 40cad6f2 40fabe71 40cad6f2 c02573f7 40a8dc7c 40fabe71 40a8dc7c 4093b5f4", + "ca2cee84 4a46291a 4939a9c0 -> 413d2f9f c05efbe1 409c5a84 c05efbe1 c1795999 40946585 409c5a84 40946585 410df890", + "49e58436 498e81e8 c9d63787 -> c133f3ad 40e31af6 41443418 40e31af6 c0a1562c 408d8dab 41443418 408d8dab 3f930ba2", + "c19432dc c4920e35 c4938ce4 -> 40cde27a 3eb36e24 3ff4c17a 3eb36e24 c0b74849 bf79bb01 3ff4c17a bf79bb01 4139615a", + "47504199 471aba3e 44e43881 -> c104d2ad c083fa71 3db30e97 c083fa71 40b2caf5 c0bc2acb 3db30e97 c0bc2acb 40742c64", + "45f9df43 45b99a1b 463e86af -> 40ec81ad c1132d96 c036097c c1132d96 c0823cc6 4088025f c036097c 4088025f c12ee406", + "c523f17d c302abe5 c4cb3c0f -> befe99c7 411e3cd7 40916546 411e3cd7 41aabb21 c0934ed3 40916546 c0934ed3 40cb8413", + "43284307 43684bd4 c2f09c70 -> c11f9b25 c02494e1 c0afe08e c02494e1 c1897457 bf56da1b c0afe08e bf56da1b c0c9c912", + "c5ad3946 c6aae1c4 c56f0872 -> c178f50c 41336b0a 3f313062 41336b0a c0308666 3ff1946e 3f313062 3ff1946e 407fef33", + "42cf9446 c360191a 4364a6f0 -> c1579360 3e3c0766 c0cc4636 3e3c0766 c0eca557 bfeda924 c0cc4636 bfeda924 c1f692c1", + "c35712a5 43042ab1 42eda8e1 -> 401e94b3 40df63a3 c051d5f4 40df63a3 40b4fad5 c0ef13fa c051d5f4 c0ef13fa 41c19ac0", + "47a82e94 c827053b 4865e5f6 -> c1115493 40adbb1a c026dcca 40adbb1a 40c4482e c090af17 c026dcca c090af17 c110f08c", + "c826bbc5 c7bf1a38 c8365dd7 -> 40e87adc c14998e6 c0df052c c14998e6 c0c986a5 c100481c c0df052c c100481c c01688e0", + "c3ca47a5 c3ab3f83 42826b6f -> c1223f98 c10678db 3ff0bb5c c10678db 4052169a c1034e75 3ff0bb5c c1034e75 41406118", + "4662d8b2 c5e2f330 4648fedc -> 41a786fa 3e9eefc2 402785f3 3e9eefc2 40c39cdc c03f4484 402785f3 c03f4484 c07d8b78", + "c3f6d40b c3b2a364 c287073d -> 3f6ee08e c02a45ae 40d51fa3 c02a45ae be67e460 41068ad7 40d51fa3 41068ad7 4033bae1", + "c324866b c3d116e6 c3977de5 -> c05e0a20 3f95ea7a 3fd2e24f 3f95ea7a c0fc2548 41078f0d 3fd2e24f 41078f0d 40f8577d", + "43b7a7af 4317d825 c400065d -> 41095d1e bff16227 c087378e bff16227 c10e6a8a 4081b51c c087378e 4081b51c c0e14f50", + "c712de35 46b81574 c7177dd0 -> c12f7b35 3ff712bf c0247d87 3ff712bf c11c4c07 c0dbd245 c0247d87 c0dbd245 c19ed658", + "4a2bace1 c879e793 4a11a1dc -> be07c78e c11e966f bf13250f c11e966f 409bde48 c14ed088 bf13250f c14ed088 403c7dea", + "4532a13f 459a2c3c c591f863 -> 3e987db3 c109834d 40e705e7 c109834d c2047046 bf965a0b 40e705e7 bf965a0b c0255449" + ] + }, + { + "glsl": "float cultmath_distance_to_segment(vec2, vec2, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "422a04c4 c0a95768 423b2486 c1b0a319 413fd2f0 c1fbd700 -> 418a998a", + "c19adddb c0eb57f0 4245a9e6 42093dae c1d41e00 420e8cae -> 422b70e3", + "c13f27d4 c20af956 c180d120 41abcf58 c23e49fa 41c9fd6c -> 42617e03", + "4149d2ec c182da66 405fed30 c060f680 4246b844 40f0e348 -> 4169bfdb", + "c1c3d1c0 c214fc3f 41d7db74 41aef878 c133b918 4168dd28 -> 4255ddfc", + "c219d5c1 c22500e7 c0f7d880 41301f8c 42307ad0 41ae3d78 -> 427276a5", + "c22de976 c19c6d55 41d0088c 41804818 c09fa570 41e34830 -> 4275fd39", + "c15c0110 41b030b4 41750a80 c1116408 3f4f4300 c0d6d268 -> 4200dc1c", + "c21bbdba 41ad853c 41fb7bb8 c1a0dfec 412fe05c c1dc87a6 -> 428c4536", + "c1a0dd7e 41e870e0 c2163e8e c233860e c1e75539 42269282 -> 41204284", + "c22df86f c2170343 c21e2039 c1bbe868 c21e2039 c1bbe868 -> 416cdf21", + "41f39918 40c2f188 c23a2005 41dbf51c c23a2005 41dbf51c -> 429fcd42", + "41e8f0a0 c21954e6 400a0e50 40956790 421d1764 c1145264 -> 41f649b4", + "c1e5dcd1 412d1c54 4219da42 4217d4ae c2461807 c14f0e18 -> 412280a0", + "bf275c40 41590b50 40c293a8 c186fa92 41d50a94 3fb21ce0 -> 41d9cb8e", + "42131198 409b16c8 4208d8b8 c1d09424 c1a20fac 411c6e74 -> 41d9db26", + "417cac90 c2440eb1 c12d25b0 c02a2ef0 c2288731 c1f3bc8b -> 42515421", + "c21ceeed 41fbd868 c229707a 41feff8c 421ca5da 42225e2e -> 3f396bd3", + "c1996928 41eacfdc 423b0a98 424743cc 419b962c 40c55238 -> 42343240", + "c2104845 c1f3bb1c 41c97100 4083eb60 3fe711e0 418f905c -> 4275defa", + "40da4208 c205c5f3 c19a11f8 422966ba 41f79f98 bf3714c0 -> 4222a734", + "411d5718 40ea3000 c116218c 40af3390 c201e540 bfc7a200 -> 419a70f6", + "420056a0 c09dc398 3fa05e20 c136ba10 412ccae4 4215ce1e -> 41e81fba", + "41cbf5d4 4219775e c1cf1bbc 40be3158 c2398eaa 415ff84c -> 4273081e", + "41fb9db8 423158f2 422cdfa6 3fee6d40 3fcb31a0 41d73104 -> 41f2ae16", + "416ec898 40ca1a90 421e190c 407c8d20 421e190c 407c8d20 -> 41c5b6fd", + "c0b51530 41a7eb4c c10b1600 40c497d8 c18496ac 3ff60ae0 -> 41727388", + "c209d410 c1913dcb c22918aa c1d094df 4227f978 422405d6 -> 3fa9c108", + "c1597dc4 41fa9aac 41f3f420 c22d7b1e 4244f226 41dabce8 -> 42770339", + "c2398cf8 41e30dd0 420d259a c0268080 c1574458 417f04c8 -> 420cd2ae", + "420a88aa c2035b86 41ac54e0 413ba78c 41ea12c4 c1f40f8f -> 40bb77a0", + "420bd086 405d8fd0 c19589b8 41ee2990 c2268345 42378a00 -> 426eff92", + "c1efdb61 c22c0c09 c11eddf4 41dd676c c11eddf4 41dd676c -> 4292f403", + "41a22740 404787e0 4170e9a0 41a8bef8 c1544224 40e28960 -> 419361c0", + "c22504fe c11456bc c19910cd 40c0a740 4110d384 423b85be -> 41d723a2", + "41432eb4 c198b971 420fef24 c15d0c64 420ed6ac c2150fec -> 41bdc570", + "c1b91fcc 3fba0140 41ac1b3c bf504500 41b9fff4 4223756c -> 4232d682", + "419dc888 420660b8 41fba8ec c0991748 412a3644 41abe904 -> 41722a5b", + "c2258e9a c217f2d4 423361b6 c242e930 c19299e5 bfcdc6e0 -> 422bcd95", + "c12f5624 422961ca 41578d48 c1db7fbe 4100f3d8 c1dce4d2 -> 4290fe0f", + "c04ef920 c232aa50 411b3460 41def9ac 421e6f68 422e2cca -> 42935d5e", + "c241578b c0a7c6e0 c1e0bedf c0d2e3d0 4181b780 bf173740 -> 41a24bf0", + "40e44cc8 c1e6486c c21cc830 c12fa504 c1c4dd87 42248d6e -> 4246898d", + "c1f8d3cb c17be190 c17167a4 4065a460 41657930 c227d5b3 -> 41bf8ae4", + "4111b8fc c1845f88 c1bb026a 421745a2 4193cfa8 c1e1f145 -> 3fd3c8cf", + "41e21610 3deb4e00 418ac080 c1d85855 41df8f70 41b7824c -> 40a16baa", + "418a0c10 c2043a78 40fb9a50 c22c3710 4243eea6 402ab820 -> 3e99402f", + "41a90c00 4237fccc 42062962 41ff41bc c195ffaf c1c9b1fe -> 41963431", + "41a89c28 4189f35c c1cdbae1 c1b10b5a 420e027c 423521c4 -> 4102b955", + "c21ac918 bfda7100 40b2ef18 c0ee2e50 c1b2c873 c0d14380 -> 41886217", + "41a8cc48 c1b4edb3 c207bd16 41e6fd20 c1fe676f 41d8659c -> 42911f4b", + "c202bdec 421a4c52 c056eaa0 3fd20240 40abf660 c0dd54b0 -> 423ca55a", + "c148b244 4202174c c2305b3c 4217e840 423be05c c0de1278 -> 4111055e", + "42037bfa c0879798 42345984 c22b430c 41dd3ec0 c23eea99 -> 4221c856", + "41953220 418dc6c8 41663ae8 40be7908 c2232c0e 418bccec -> 414845cb", + "4194e74c 420ce234 c23bddb2 c247e024 c010bcc0 41dd2274 -> 41b1a988", + "41e55ab8 411e85d8 41d1d480 4070c000 400cc5b0 bea37080 -> 40d39bfe", + "417c54b8 412830f4 40928fb0 41bec6f4 c2466622 c1e82d31 -> 418ae090", + "41fcf834 40a02248 41ad8338 4218ea2a 41c63acc 4201029c -> 41e0c13e", + "c1e92e24 42301cc8 4236c0f2 bfaadf80 41ccdde4 c23c7d8a -> 42af05c8", + "423d3518 c1ce9866 4217c864 4196bf90 4176b1e0 c1f9217d -> 41d710a7", + "420f6b96 41450624 405b0f50 c2373162 4025c480 c220c33c -> 42789f25", + "c22b28db c115a228 42006ba8 c23c7c1d 42006ba8 c23c7c1d -> 42a7c24f", + "c218ca4d 4213f78c c0602ef0 c1953e9b 41b40df0 41b7ada0 -> 426ba80a", + "c2339d05 40fa2370 42358e9c 41f452a0 4207d8d8 41d4bad4 -> 42a22353", + "c233fc4f 4193c02c c04c9570 41851328 41fb9e84 c1704a64 -> 42275c2c", + "42081b8c 42371084 c23f85da c1fddeb2 c20ba61c c1de7dc7 -> 42c9a7de", + "c086d6f8 c2116e37 41b38bb0 c211aab6 c14a3ce8 c1a71c3d -> 412bc23c", + "41fed078 4188ae58 41ac4388 41d12560 41d22ab4 41a03bb8 -> 40c9ea4c", + "c0675d10 c1f03232 c13ae834 bfd640e0 bf914ca0 c230da60 -> 3f80f031", + "c17970c8 41a6fd68 c0da6678 41d8cfec 41be9958 c0b3e8a8 -> 412c0940", + "4224e70a c1479358 c213aff4 c1b1cbb1 3f456c80 c1d86e76 -> 422c01ce", + "c0ba6ad0 c21600a1 4187a80c 4114f768 c0214780 41ca29cc -> 42503e2c", + "c2427717 420aab9c 4221f6e2 c1d6c914 4221f6e2 c1d6c914 -> 42d88eca", + "419f855c c145ba90 416f3e30 415cd0c8 c20ea5f1 4181c894 -> 41d50ab3", + "c1584aac c21a7ead c2066484 c1a5dab3 4230bd1c 41589068 -> 41c3c029", + "bfd0eee0 42228132 420aeef8 410746dc 4230ffc0 c1c400af -> 424236f3", + "421c1020 c23f2876 c03aaea0 41aae3dc c03aaea0 41aae3dc -> 42a1be23", + "c19bde8c 402bc4f0 c191fec0 c24275ed c187ca34 4210d318 -> 40005b00", + "41f49d70 c0db9510 40807270 c22482df c20a4292 c1d67dc9 -> 422d6c7a", + "422eb61e c19c32a1 4224c8cc c17a172c c2426070 c1fd7b7a -> 4093c3ef", + "c204bcd2 c0fc0d38 420443f8 414bf248 41ae99cc 4221abdc -> 428a4855", + "4229c244 41f76520 41ed747c c200858a 41928428 42025970 -> 41bbca3c", + "41d4acb0 420220d4 416d68d8 420f8ac2 40d1ffe8 c11d44c4 -> 41427dd1", + "c20abba7 4103befc 409537c0 c2375fc1 c22e8519 c23bc90c -> 425bd8e8", + "c111d304 c10eb1a0 42248574 4059ef80 42248574 4059ef80 -> 424eef34", + "c135c9f8 c2113274 421ca544 bfa86b00 421ca544 bfa86b00 -> 4275cf9c", + "4237273c 41c2a81c c1e49b87 413337fc 42188c74 41436b40 -> 41654e61", + "c1166150 c1bd22d4 409677b8 c0384a70 c203a03b c003a250 -> 41a886fa", + "41e126e8 c1acc600 419cac34 c0a50368 c242012b 42078e9a -> 419447ad", + "421574e8 421a34cc 40eab400 41774800 3fc6e0c0 c1228428 -> 421789a8", + "c180c670 c1be6697 c175f898 41e9399c 418030c4 4131ba64 -> 423915c3", + "417d6b08 415a9134 c2036791 412c6308 404698a0 c239df38 -> 422b10bc", + "41d590bc c0eb5000 c1af6f2b 417c4ce8 422bc566 41abfafc -> 41da7aee", + "c1edc0b1 41f0625c 40bec338 c21bee2f 40bec338 c21bee2f -> 429b69cb", + "4236fbfe c2264dad c1baa14a 41616ef0 c1bbb1a5 c156aa44 -> 42956f3c", + "418fbd14 c22d351c c1dd084f c1ef65c6 c1dd084f c1ef65c6 -> 423e12a1", + "42135742 401bdaa0 41d26478 3f88ec60 c216c74d 416be2c8 -> 4129fd06", + "41f2dba4 c1a5e3d6 c0edbbc8 bfcd56a0 c21d5376 c0830998 -> 42296a57", + "4192c2f0 41e552e8 c1aec76a 4109c680 c21182e0 c07647b0 -> 4233ac04", + "423c12dc c1e4c720 411fb9fc c12a5be0 41f07700 c14e0b80 -> 41b8ff6a", + "4205d3ac 4121a780 41eb7cbc c19a249d 41d44cf8 4182c784 -> 40cc79d9", + "c1f78058 41af232c 420cf7d2 c22f91dd 40b137a0 c1485d5c -> 42489804", + "c172c960 42383d3a 415ce5b0 c06be770 c121fe30 42418ae2 -> 40b1e767", + "c109715c 4247538e 41dfc79c 4080d300 408032e8 c206bc42 -> 426a6f81", + "c197bd8b c1923f3d c21921a6 421f4466 c1b308d9 415228a8 -> 41fccdde", + "4199486c c1162648 c2015866 423b9a28 41ec7618 c0e2dc30 -> 410906a2", + "c22ce822 419b63c0 402037f0 bf379700 c2254d24 4238b514 -> 419d4133", + "c1c54194 40930538 422c2780 414314d0 c1343708 c2422571 -> 423598c6", + "4124594c 417fea50 41d5a6a0 c0fe7ff0 3d000c00 41bc32f0 -> 403c6f9e", + "c11d3b30 4183b7d4 c206d644 42181e9a 41c2bcfc c076e2f0 -> 4060dda7", + "40ae3660 4159fee8 bf1627c0 417aa5c8 40af3338 c1c43f61 -> 40b51634", + "c19cbca5 c17021a0 c2350743 c175d0d4 c1eee2ac c1fa924c -> 4195bba1", + "41d8ff74 42284226 c1b3019c c2313dfc 413abe6c c110aedc -> 425591e8", + "41c4f7b4 c2199a11 409b5130 c224721e 419b1608 c15c98f8 -> 41816fb4", + "c23c2a0a c19eaa6c 41340c28 4184cd54 3d0d0c00 c0cbff08 -> 4243d893", + "4223e0ec 41eeeb48 423a1bc2 419f30d0 41cff480 41afb528 -> 4115c2b0", + "c197fa08 41d9993c c22a5bc9 c1a116b4 409b14e0 421aaa8c -> 4135bb15", + "41c33384 c12f77d0 42015c96 4150c5ec c2334278 42323d3a -> 41ca5981", + "40019cb0 c199ab3f 40d8dc80 41f695e4 421d068e c0d05268 -> 4211b1ff", + "c234b333 c21c00db 41904a40 c1b46892 41c86d74 c197391f -> 4282a219", + "c217337c c2318280 c1635998 42109ece 4197f368 c023a120 -> 428cac23", + "c1799abc 424689ae 41e83278 c0cc3918 c01d0c90 41e74ce8 -> 41c45276", + "422488be c1e2b511 c239cad1 c1ab879a bf6f4700 c123ff3c -> 42372b49", + "bf6d2f40 423cb072 421c4d76 c130e37c c1ac363e c12a03a4 -> 4267c56b", + "41819af0 411c97cc c23e5711 c1be93a1 40f238d8 c05cd050 -> 417cd799", + "c184b6e8 c1b80ceb 41d72558 414334f8 c0388b30 41de04a8 -> 424d58e1", + "c196be9a 41ac65f8 c14cb7ac c2017f86 41693d00 4167bfc0 -> 4201af9c", + "421d59ae c1c5f4a6 42438f84 c2113bf2 42256340 c0523dd0 -> 40d79a35", + "c22632f2 4243c1a8 c0328530 415204fc c227b928 41d4e09c -> 41b2a95c", + "c1227114 c1740de8 c2023d52 419197b0 c18d190e c1babafa -> 411c73cc", + "4232abec c2255e1a 4182dde8 40f72190 4182dde8 40f72190 -> 42629598", + "c1e572b2 c2005570 413ff770 3fef6c60 c09f1d30 415e5688 -> 424ce466", + "c2160dde 41d6e798 41c71e4c c239e695 407380a0 4181c7b4 -> 422aaa63", + "42444bfe c1c85104 424756d8 c1a28a01 4236af02 c12f3e2c -> 40990ea1", + "bf12d780 42253cf8 c2436df9 c1f1e133 3fdde760 c18e4874 -> 426c8f4c", + "40befee0 4232adc2 c142ca44 c18bbee0 c1cfaf80 c1a53536 -> 428176ff", + "c0994a80 42034f98 423360c0 c1c0ddf5 41d4fe60 c186909c -> 426b0258", + "4225580e c232bc8c 41b8adc4 c2342f74 c1d1f77d c18bc6be -> 419209b4", + "c189e698 4184e814 423be784 418a45e8 414e6c88 412daf54 -> 41f57939", + "c1bb24d0 421b46fe c18f2808 41af240c c1928c47 c14ef924 -> 418e610a", + "4200c60a c2004380 41a7f1b8 40d09230 c1520628 c23409e8 -> 41f51ffc", + "c0fbc0d0 41c12528 c238d606 40775500 c230873d c1af89b7 -> 422d7f07", + "420ff984 40bb8fd0 c20cc126 41017254 4246bf24 c1126854 -> 413fc4aa", + "c1af8c95 c2398f1f 4173f668 c1d659b1 4193f320 414bd314 -> 422826ee", + "4230089a 4129e0c0 407ff000 c1fb2dd0 423875fa c23fa1f8 -> 4256e05e", + "421586f4 3f969660 bfc83720 c2236dfe c1b3b2ee 422cbd8a -> 423fc0de", + "4229e178 422fc316 c212525a 422284d0 c1899ea0 c202d2de -> 429a8bee", + "c18855f6 41750890 c210ca8f c1162fb0 4238dbcc c23104c0 -> 41f1b43c", + "c20eb462 41950558 c18581c4 408462b0 c0f7f568 be550700 -> 41bf1551", + "c211e59d 41c0d4f8 c16bcf24 bff01680 c16bcf24 bff01680 -> 42077e51", + "bf86adc0 4242728e c1c045c5 41830124 c1c045c5 41830124 -> 421e5be3", + "c01579f0 3fe9fe80 c10e6b44 41b13138 c1669f08 c2215235 -> 41053833", + "c091c2e8 c11cd9c4 c2379542 c164dc80 4130ce54 4235360e -> 41d64325", + "423962c6 c20b80d8 c2143563 42479a2e 41b876b0 42023208 -> 428eaaa9", + "c0d36b80 41e142e0 c1fbfe34 420d2536 41e78e28 c1f14eca -> 4157353c", + "3f6b23c0 416dab78 c02e0680 c22cac6d c1add085 c1ce4617 -> 423a16a2", + "407ab4c0 c2450f3a 411d886c bfb992a0 c235622d 41685fb8 -> 4240b991", + "c2219e96 40e8b998 c18a87f4 423b39b2 c1fe3754 41327f7c -> 41176291", + "3fa02d40 422fc4e6 c2209767 c1a30b55 c1dee97e c1db376e -> 4298c6bd", + "41bd5d0c 422048d6 42137368 c236ea2f 421f5530 40da5938 -> 4213df6c", + "41cabd64 c1603200 c1a91566 42321b14 41a8b230 40468820 -> 418d1549", + "c20e719d c158b9ac 3facd880 c0f24428 c1ffcbcd 420f44e0 -> 4203cf07", + "c1e8eb89 40adce60 4219eb84 c1819db2 410ae2f4 c1492400 -> 422774b5", + "41a74bf0 c20635b4 41d9b27c 4246ab24 41d9b27c 4246ab24 -> 42a6ea58", + "c0b71328 41f1f98c c2418754 41b7dd64 c2418754 41b7dd64 -> 422d19a3", + "c2293339 c238b947 413e8bb8 c20cb75c 413e8bb8 c20cb75c -> 425d41d7", + "40897ef8 c0374c20 c17bf520 c1e5b89a c17bf520 c1e5b89a -> 4202d8a2", + "c15233e0 40ef9a88 41080750 4214c2da c2378ed9 c153825c -> 40e26c96", + "403244a0 c175c3dc 424187e4 41a3c954 c196c71a c1f4d7b2 -> 3f72b2e6", + "c2364747 c1f3ad98 3fd38220 42336ff0 419bc0d8 41f0f3a0 -> 42b044ce", + "c239198e 41c45d50 c22bb6d7 4142ead4 c21eb2ae 41fffc50 -> 40a9c737", + "42466688 c2437614 4210cce6 42462e70 3f205800 41e76a54 -> 42b7b9b7", + "c2124d58 4114c258 42201662 414ce070 42201662 414ce070 -> 42995af4", + "41be71e0 c1b44f08 416d6510 41c4cda0 417fd208 4206ac30 -> 423ff02f", + "c22a5152 c1a16c01 421938a0 400aaa90 421938a0 400aaa90 -> 42a7d41e", + "c1b084e6 3fb71580 c1b2bef6 41dd55a4 c186e6d6 4203c4a8 -> 41d1e752", + "40990a08 c2174503 c239bb2b 422f23d6 404bdc10 c183f5c6 -> 41ab0e96", + "c1188410 413a16b8 420156ec 41f43624 42240612 4123e278 -> 4237b2ca", + "c231ed01 c185df8e c1cb17f5 c23578d6 c1b264e9 c225c5dc -> 4204d226", + "c1a15903 41e63c70 419f5160 c1dfd69d 423f6c0a 41bbd2d0 -> 42793d21", + "c1b40701 417038f0 c1614d44 c1da7859 c19c2404 40b75e08 -> 411c083e", + "4146af50 c23c7d4a c2270880 c21fc7ff c0ef61b0 42069d98 -> 4250907c", + "422224fa 41caedb0 c23b6ee2 c00a65c0 c107f87c c23bd380 -> 42a8928a", + "c1feaf1a 422125ee 41b84750 c1dcaae3 41b84750 c1dcaae3 -> 42ae8d79", + "41ae1e48 c1c8647b 41c3150c c182c7b4 c2432e35 40aa8dc8 -> 41116651", + "40fab9f0 c2141d82 41206ed4 c0655c40 c23e73b1 4128604c -> 42061136", + "42324f28 c0dcc6a0 c235f324 c206837b 41271dfc 420cb9c2 -> 42541d80", + "41c17618 c12b45f0 c1c8c6e7 41862f24 c1c8c6e7 41862f24 -> 4261b0cb", + "41a379d0 414e2420 c198befc 40cb5148 c198befc 40cb5148 -> 42204108", + "c1ce2709 40c31bd0 c222abf4 41c5d09c c1585e90 420c6a40 -> 41b5c5d2", + "c1f86dfc 4201f816 c1a7e1e3 c2414f14 c0963108 c1722364 -> 4259bcaf", + "41e257b8 c1502bf0 422fad88 41b7d514 41e3a900 41ea86c4 -> 421ce8f5", + "c1edf56f bf048200 42171af0 c1a14321 423e5418 420e9f3e -> 428bcd5e", + "4243e790 421e5ece c1a01537 41a26290 40f1efc8 c239718e -> 428e3f1e", + "c2364b66 4201bd40 c1e0e1b7 41e13fa4 c2221b16 c20fa7e2 -> 418fd6f0", + "c23d3e53 4216a930 c1aa46d4 c108060c c12af068 c093f820 -> 4253fd67", + "c1f515b8 42070cec c19c8655 40274a70 c1e8543c c1e38dcc -> 42043ab3", + "c22d8a80 40a65848 c0a3b108 c23818cd 4245cb00 424419a8 -> 426ac3f3", + "422b9948 406d2270 c19500ba c1f03d1b c1962e97 41b03cc8 -> 42767b33", + "4091be28 c22ce42f 42334ab6 41beee80 4173ad18 4110f96c -> 42557324", + "413d1320 c092c8f0 42195ff2 c201bc64 c11b86f4 42463890 -> 410cd16c", + "c230ae20 42446cae c201435e 41ece4d8 42005558 41d80a8c -> 41b6867d", + "c1b61b91 c1100070 41c17140 423f3f1a 41c17140 423f3f1a -> 42936502", + "c1e3c5eb c220d79a c20bc18c 423d5cf4 c1823c66 c227a4ce -> 413960e3", + "41e5facc 416cf580 41bac530 c1663784 c20a3b0d 40b754e8 -> 41ead4b4", + "4211a398 c0a67a40 4147eafc 40d14f68 4147eafc 40d14f68 -> 41d52410", + "4245e11a c2113cff 41f5082c 4112b2f4 42144766 40932bc8 -> 422afca1", + "4234191e c1eadbd2 3f9279e0 bf5b28c0 c1b574e6 417c6fb8 -> 42514baf", + "413b859c 418685d0 410f56ac 3e2cd100 410f56ac 3e2cd100 -> 4186fe15", + "3e34fe00 41877754 c1b12484 c2193aec c1310310 c20ccaf4 -> 42555154", + "41f6faf4 c1f34ace c1a93e77 4206a7ba 42171508 4040e620 -> 42088509", + "3f5b4b80 c209a2a6 c20231f0 4125ef38 41f95c04 c1da3e01 -> 41ac7743", + "410f1f54 41e292f4 41eae320 42024dfe c23d3ac1 c14820b8 -> 40d5cd80", + "c231c234 c244e6a9 c21b2ad2 40cf7a40 41e510c4 c2043d06 -> 424ba561", + "4228f112 c1679558 42405f14 c19c61d0 c1c38c09 41039a88 -> 402935c4", + "c1a38e77 41c47b88 41a77b7c 41a22ca8 c1d7ac74 c2208883 -> 420c5af8", + "c176c224 41e08ee8 c2325fe0 c2279783 420c3a36 bfc07a60 -> 4244d477", + "421a7230 bf8332e0 c1a711d5 4224ed2a 41da7a70 c201746a -> 41d4fc83", + "c1f97d7c c19a1755 c1b68f1a 41ca7f60 c1b68f1a 41ca7f60 -> 4235686b", + "c1a0a693 4109f06c c15ed264 c1f52206 c22469d3 40b3a038 -> 4194ffcd", + "c216c855 c1a4e1e0 4167e978 c2264c2d 4167e978 c2264c2d -> 4260f918", + "c1b2ff55 c230caf2 420062fa 41ed36f0 41a7dca8 c1da5c3e -> 423a24ac", + "41938d9c 4197cffc c237ade1 422e4e2e c239811e 42123440 -> 42865225", + "c11693cc c0c7d5a8 c137d8e0 bfe067c0 c21d087e c0c5b488 -> 409e6359", + "42220880 41cbe6d4 c1d21f2d 4213de5e 40906638 41996290 -> 42122e96", + "c11ede98 c204c096 c19fbe45 c1eb8050 420b667c 418706e0 -> 41157f1b", + "c218a978 41e66350 40d2f418 bea18e00 40d2f418 bea18e00 -> 42559325", + "c209c188 418d0930 42386f60 c1babb94 4222cac8 409fe9c8 -> 4298620c", + "c22a88bb c1d0c15e 422e0e70 41a318cc c2029efa c1fad0e5 -> 41347562", + "422abd1a c14e20ac 411f091c 4105ca40 42439a68 c2061e72 -> 411825ff", + "41b81cac c1ad0318 40620980 41c06284 41db07ac c1f9cf33 -> 3e51d5e1", + "42423fde c1a9f6f6 c1f29e5b 41ff5688 4222854a c20d77de -> 417b47e2", + "c1f54c73 c11dfa00 c20358c8 c2274e0e 4231ef28 412ff95c -> 41c940f3", + "423aa086 41cb33a4 424324e4 c1daaccf c0d9cba0 c1c8b796 -> 42526c4a", + "c215baf1 41fc29c4 c225ef22 415e85a8 42176fcc c0ed89c0 -> 419094bc", + "c12be76c 4240de6e 40270f50 c0ee7ef0 c15c6cb4 41bebb38 -> 41c4827c", + "42349acc 4246dae4 4219e120 c224c899 c237f094 c0e72790 -> 42adab9f", + "423bf656 c08f37e8 3e409f00 41bac6a8 3e409f00 41bac6a8 -> 4259ca93", + "3fb0f500 41d2db9c 40af19b0 4097ddb0 402ca2f0 c17d0adc -> 41aff59b", + "c1ffec4a 420fface 422f7432 c21b600c 420c3c64 c23cea82 -> 42d5035b", + "417a0740 41f0a744 41b072b4 4168d910 41abc360 41042958 -> 418674b8", + "c2108dce c241fa45 4214a0bc c21ebc3d 41b60554 c12d2380 -> 428b0851", + "42223e14 c209b146 42008926 410540fc 41cbd800 c18ce6d4 -> 41b4aa65", + "418184a8 42112184 42175314 c24316b3 41e91354 c0f47af8 -> 4237297d", + "c1d986d1 c0054d50 414af6a4 41a3ae8c c1d07386 c19053dd -> 4141e6a5", + "422d0fb2 40a29a10 41e1c998 420a3ece c075f150 419284f4 -> 42046214", + "41c6d028 41da4b64 c0b24070 c147aa24 4234062a c21914f6 -> 4244fbe3", + "41a3582c c21b0c40 4034fb40 c1b46876 4034fb40 c1b46876 -> 41bf5e10", + "415533dc 4245bf7a 41a311d0 4208e646 42398ed4 42295806 -> 418628dd", + "c1224e0c 4224359a c208664c c1cc39db 413081c0 bf987280 -> 423d03c8", + "41be22e0 423d2e62 c22b1ef2 c2385ba3 413f1234 c1a569d6 -> 4289fc5e", + "415b4f54 42255a40 41612870 c0d32700 41612870 c0d32700 -> 423fc08d", + "c19af4d3 c220920c 417932e8 42088380 40190830 c1552254 -> 420a27ca", + "c0110350 c20c682c c233b1e6 4063d550 4245dd96 410b11b4 -> 4223ae90", + "c0c504b8 c235b48a 41fdbe9c c19df193 c1e5e4f8 c206fabe -> 4183cced" + ] + }, + { + "glsl": "vec2 cultmath_segment_closest(vec2, vec2, vec2)", + "tolerance": "ulp-bounded", + "cases": [ + "c228b952 41e87c88 c196e9cf 4217251a c2204f62 bf343340 -> c1dfe17e 41a9e53c", + "c112d364 42467920 41f20aa4 c22ec133 41f20aa4 c22ec133 -> 41f20aa4 c22ec133", + "c2272b7a 420d141c 420b364c c1997bc9 423b60fc c1356ba0 -> 420b364c c1997bc9", + "4234ff16 4117c50c c2045cdb 40be92b8 421a921c 423f50cc -> 41d7024e 4223d75c", + "424443de c1ee2a9d c240c8f5 41f1ca80 c2030c07 41a09978 -> c2030c07 41a09978", + "42395e64 c1d9822e 422af690 c178f97c c21491e2 c0f100d8 -> 422af690 c178f97c", + "c0301780 c22c5b5c 42158838 c1c96e6e 41d83430 c20d58b6 -> 41d83430 c20d58b6", + "c0a06738 c1a62b6b c1b0fb5e 41bc1590 c1b0fb5e 41bc1590 -> c1b0fb5e 41bc1590", + "4124cbac c161cff8 c228c53b c23695a1 c1f98bb6 4221ac28 -> c21588ec c1004e54", + "419893e8 41f982e8 c18d66d6 c227866e c2400483 42018528 -> c217fe7f 40fc2d88", + "4239807a c21889e0 c13f9e04 42283fbc 4207456e 4207f2dc -> 4207456e 4207f2dc", + "c196ece5 bfffee20 4238c534 c1a3ca25 41bddba8 c21987fc -> 41bddba8 c21987fc", + "c22d2588 40828628 4204a982 41bf6974 c19735a0 c22246cc -> c0d66d98 c1cba6e0", + "4242359e 4190551c 417b8978 c18c78b6 417b8978 c18c78b6 -> 417b8978 c18c78b6", + "c17a66b4 c1fd8376 c119f1e0 41f44314 4132a9b0 c23456d9 -> 40bb778e c1ce35ec", + "c1db30e3 c193fc52 c188ccea c12ff998 42021de4 c092d920 -> c188ccea c12ff998", + "41c69ee4 c1a6ad45 c1d210c6 c2198a6f 41cdce6c c09d9d80 -> 418ecd7c c11fe9ac", + "c17ceca0 4145bdec 41e66844 bf573b80 423453b6 41a72c98 -> 41e66844 bf573b80", + "4119f058 423f4adc 41b797e8 41b26c40 410741c0 c0d1f0c8 -> 41b797e8 41b26c40", + "c21b2357 42160238 c23a2eac 413d7b84 c015c860 c112aedc -> c23a2eac 413d7b84", + "c0f268e8 c09dd180 41b4ecd4 412907d4 c08d23a0 c22a926d -> 4122ab9b c15f19e4", + "c23ae5b9 c21d55d3 423f43a2 422392ec 410ee1d0 41393d94 -> 410ee1d0 41393d94", + "40be7650 c205e958 c1950310 c2475e85 c17fb494 411f3660 -> c18ed92c c201b2f0", + "c1829208 c200b6ea 418596f0 414fade0 c2401d0b c1edb36e -> c1d88920 c17e30d6", + "c1056368 c243cab0 be695000 4159cb28 c23707fa c22f4248 -> c20740df c1e5fe6e", + "c202d656 40b1ee70 421a611c 422711f6 4158a2e4 41c910a0 -> 4158a2e4 41c910a0", + "4214a0ae 3fc10740 41fb466c 40cb0e78 41fee504 41b0a5b8 -> 41fb466c 40cb0e78", + "41a7d720 c1ea012a 413af598 40a86ef0 41f70d64 c230550e -> 41c48c26 c1ded64a", + "c1b6068b c021a960 423e567e c2250419 4214474a bffa6180 -> 4214474a bffa6180", + "c2218b24 4163fe68 c1b5bfbc 4139cc88 40ac8d70 c0e71520 -> c1b5bfbc 4139cc88", + "412f6364 c205a172 c226707a c1356b80 420b4548 420d2842 -> c151c402 40c18e9c", + "418281b8 c1cb950d c22d7657 c05e9b30 bfe59240 4218594a -> c1c40c92 41760d1e", + "41f26bcc c20e4ce2 c2269b15 41a5772c c246ed3a 42240aa0 -> c2269b15 41a5772c", + "c227a79c c230806d 4204160e 42202cee c1b74947 40841898 -> c1b74948 40841898", + "421508a0 c0a54398 4232eeae 41dc57a4 c1a59500 4052de00 -> 41dc0784 41a94312", + "c2375f23 c0dacc10 c2059742 c21fed4a c1eafaa0 4223ccd4 -> c1fe4597 c0f12c60", + "c1d8a01f c1d3efba 41439664 412eef80 411f4ea4 c1f88991 -> 4121868e c1e3fde4", + "be338300 c19561ce 4223b78a c1a58212 3fe25780 c1c50d10 -> 3fe25780 c1c50d10", + "c21d2105 423008b2 bfb0f9e0 40380750 c196b5a2 c2186505 -> bfb0f9e0 40380750", + "41edbbd8 422e8fa0 4197d4f8 41e87078 c1735260 4226fc2c -> 4197d4f8 41e87078", + "41aa1940 c1b5a026 412aa380 41d12a10 c247c234 c1e99f17 -> c0fc3268 411353fc", + "42017770 c14649b4 c1a71de1 420ca874 c16ce090 c238c8dd -> c188739b c180b6ba", + "c211f78c 41aac3d8 bfe264c0 c1490f74 c1b0972e 418fe11c -> c1b0972e 418fe11c", + "bf588d00 c13aa210 40e49200 422dc1e2 41e863b4 422cfb1c -> 40e49200 422dc1e2", + "c1a10efa c1f05424 41ff0744 c0d96fe0 c1b681e9 c19de2a9 -> c1b4ab26 c19d7346", + "c237e0d3 41cbdda4 404a9f00 41e47fbc c235b6fd c1f3f1bd -> c19175e1 40279198", + "40ccd8f8 4222623a 418db004 c1ad30ea c2279c28 c1ea04bd -> 41664fd1 c1b09338", + "c1dda497 c10a1358 c1060f9c 4181aaf4 c1060f9c 4181aaf4 -> c1060f9c 4181aaf4", + "4202d326 c1df2259 c1d1e8c1 c239e962 4220b296 c1e7e81a -> 4205d7a4 c1f60d12", + "c100a640 401feec0 c1b39551 c0312930 c100823c c227f730 -> c1b382a1 c032bff0", + "410df114 c22216b9 41bc50ec 423442ea c1c1645a c1d52934 -> c1a3783a c1a83084", + "41716960 422b02ae bfc2d2a0 421dba40 422e002e 41a79c00 -> 41386cac 42084d86", + "41d7f918 c229b531 41b3faf8 c11be1dc c1fd9d7d c23a4c94 -> 4126189d c18fd026", + "40ce8850 c20bb944 c1ba0fe6 41a3ad94 c19a6e04 41d82758 -> c1ba0fe6 41a3ad94", + "41ced13c c133f218 41b23368 c1c1fcdd 4217d484 c1771278 -> 41f45d01 c19cd591", + "40d76190 c1bc8aca c1c28a93 4202ffd4 42060b9a 41ca4468 -> 4155fa6e 41df1140", + "c1a527b5 c10c7348 c20fa3a2 c2018732 3d77c800 40a1bee0 -> c18650a0 c147b6fe", + "c0a25f10 c12f0c78 c22c1a1c 416f6790 c235aa9b c04cf960 -> c235aa9b c04cf960", + "4231a28a c21dc923 c1cb27bd c23e54c4 c06a8450 41d19f6c -> c18cf2a7 c1a96f11", + "407ff340 4244727a 415ae2b8 421cf1b8 415ae2b8 421cf1b8 -> 415ae2b8 421cf1b8", + "40f03da8 c1eddf4c c159b584 c04bd3b0 4150b5b0 c173695c -> 4150b5b0 c173695c", + "4035dfc0 c1b73639 c1aedd92 c2156451 421a89d4 41f51618 -> c0713a48 c18826d2", + "412c9eb4 c19896ff c1e04860 4174cf40 c1c856d0 42057f1e -> c1e04860 4174cf40", + "41f2a930 4145269c 42170af8 c243b16b c1ecaefc c14d3084 -> 40cfa508 c200a4ca", + "c1acf1d6 41cad9e4 4244527e 3ed1d880 422486bc c21154ad -> 4244527e 3ed1d880", + "c0a9b3b0 415c8fa4 c2270aea bf087480 421b8888 41d3885c -> c09542a8 413e0140", + "41ca8cb0 c1eb8207 c17dad14 41ae1c4c c20e0636 c1cd082b -> c1df717a c0eb7bf0", + "4104f4e4 4089c4d8 c21c641a c23c6eff c1dea6e7 bfaf0b00 -> c1dea6e7 bfaf0b00", + "40fe3598 417431d8 c0885e80 41d96638 423e71ca c1a7828d -> 4103d315 41794889", + "3fdefe20 c1921a4a 4143dff8 c1cc5233 4187bf70 c2111946 -> 4143dff8 c1cc5233", + "4189212c c1d291b9 c208aa5e c207a1de c22c4510 406763d0 -> c208aa5e c207a1de", + "c103d558 422fd6b6 c1a57f20 c233f1c0 c1a57f20 c233f1c0 -> c1a57f20 c233f1c0", + "c01ed500 41a093b8 c214c80c 4218b698 418fa5a0 4197b460 -> bf1d2d40 41cb76c5", + "41b25624 421302d6 41708eb0 41480398 c184eaec 422516be -> 40ddfea2 419ee55c", + "c02c8c10 c1d36333 c027a8c0 41af397c c1ccac1d c01e5f00 -> c1ccac1d c01e5f00", + "421332de 4224aca2 c21d6acf 42344644 c13eb8b8 c20b0e64 -> c1f0e5e6 41916577", + "41b149bc c20743f7 4234116c c2064c40 c154a734 420b39d6 -> 420e0eab c1b370df", + "408c6858 c19a78c8 c111df7c c20d1ab2 c1abae34 c24043f3 -> c111df7c c20d1ab2", + "c1a54969 4194f248 3f9cba80 c0ceab70 c0a65568 4118d5f4 -> c0a65568 4118d5f4", + "41fb7fb4 403be880 41fdb300 42000930 410652a0 c23f5d3c -> 41bef206 40a4af04", + "41e73a74 4221b2de 422c7056 412b7f44 406e8950 41a02484 -> 41b81422 41776f52", + "41a48d9c c1b63c96 c07b2da0 c24779cc c22e2318 c22e02ad -> c07b2da0 c24779cc", + "422b8acc c1c7a7d1 40e5bb78 422baa34 c08d0fe0 4116bd74 -> c08d0fe0 4116bd74", + "c1db9901 c11aac88 3fc37620 40eebc98 40b5e100 c212c815 -> 4037b954 c0da030c", + "4153f604 c240f705 c17955c4 4222e504 42029712 c00e8340 -> 42029712 c00e8340", + "c11bbd0c c180c1e8 40802be0 41cbdfa0 c190ac67 c2336753 -> c111d33f c182506c", + "c109a248 422e7844 c0d2dd18 410c51f4 40438290 c1cbbbdf -> c0d2dd18 410c51f4", + "c1b0db1e 41bd5774 421c5efc 421a350e c0e864d0 c106ad70 -> 3fba2200 3ed44600", + "3dbc0000 c1566e04 c23af7c1 40cb4dd0 40d6d2b0 c2195d69 -> c1174d64 c1c692af", + "c1c44e8c c1fd1a68 c2225ed0 c22ab6b2 410b961c c23b4e0d -> c1cc95d8 c22fc43a", + "42248d0c c1e77e8c c202459d 4027a0e0 4088b580 c22788ac -> 4088b580 c22788ac", + "c0523650 409e20a8 4242c314 41f93824 4242c314 41f93824 -> 4242c314 41f93824", + "c23f500b c16a53c0 421b15dc c095a370 41782ba0 c1217154 -> 41782ba0 c1217154", + "c1f6f3d3 4220b2be c22f3cd8 3f3f4f00 41d627b8 41c99eec -> c1a0790f 410fa08a", + "3fb965e0 c208414c 422df616 c17ff34c c20ded6d 423152a4 -> 41cd4114 c017ea7c", + "c16113fc c153ea6c c1e51fc5 41ad4934 4244826e 4219dcb6 -> c1af63c2 41b8e5ba", + "41c99b50 c23a7e9b c184455e c235bad6 4235a880 418f88f4 -> 4050d930 c1c96feb", + "41afbc78 423d7b78 4182ae0c c22b0ec4 4207a22c 402225e0 -> 4207a22c 402225e0", + "41471d44 422f5280 401b4b60 4241344e c1386cfc 412c8268 -> 400bb86a 423e9642", + "41737578 41abae48 41c0e84c c03081a0 c226ceae 418b4b78 -> 41132054 3fe82cf8", + "424265aa 41cbe484 41bd4df0 4181e9e4 3fb8dec0 41b5cbb0 -> 41bd4df0 4181e9e4", + "42133158 c20965dd c0747ed0 c0c23c98 c22af505 c1b6c1df -> c0747ed0 c0c23c98", + "c1fb7988 c1dcc4dc c1b9dc1d 41ebd9e4 c1033eec 419776d0 -> c1033eec 419776d0", + "c0e268d8 c226c1df 41bae098 41bbe760 c1b287c9 4115a4a4 -> c1b287c8 4115a4a4", + "c190ab7e c10c4464 40ea6a18 c2200fb4 c245e142 422ab00e -> c17672da c0dd9cf0", + "c1e0ed94 4211df6a c1100ee0 41baf124 41ee790c c22f035d -> c1100ee0 41baf124", + "41e170b8 414f060c 408bdef8 41cd2bf0 c182fcec c029dcb0 -> 408bdef8 41cd2bf0", + "bf719b40 c220bee6 418e15e8 c0565df0 4241ea56 c246c955 -> 41e81f18 c1a2a40b", + "41896840 c2311532 422b0142 40b59630 c2128352 421b6ad0 -> 421b0158 40eb168d", + "41c35678 4230f42e c1806fbc 409c38b8 c1806fbc 409c38b8 -> c1806fbc 409c38b8", + "c22f8ba1 423aba06 c17843f0 420f15aa 42409532 413fcefc -> c17843f0 420f15aa", + "423f5db8 416bea20 414afb10 c1f81724 c1a47833 42303a92 -> 3fc13be8 c0b8c464", + "415558ac 420370ae c217f90c 421e4250 c1eb13be c23fcb97 -> c2136474 41df63b9", + "c2013a34 4096a8a8 42297962 bfe09f60 c2252fa4 41837fb0 -> c1f23820 4160a954", + "c1e9e23c c238f2e0 c2026e2b c1ec9885 c1cc24ee 42449286 -> c2026e2b c1ec9885", + "bcff2800 c2138495 41393230 413a5a54 41393230 413a5a54 -> 41393230 413a5a54", + "41fa847c 4233a38a c235f2b1 c16351b8 c1e190fb 41d24dd0 -> c1e190fb 41d24dd0", + "42452880 41a4e3f0 c1a25f70 c2428a46 c0e01480 41bcfc1c -> c0e01480 41bcfc1c", + "c1479570 4219ae92 c235482c c0fc52f0 40a64c50 421dc4d6 -> c09729f0 41f12f14", + "424240b0 41d89dac 423633e6 c0969880 41d55e94 c23429a2 -> 423633e6 c0969880", + "c1b0a88b c21289f1 4233a80c 3edd3400 c1f1fc39 c207972e -> c1c43580 c1fa45f0", + "405577a0 c1b9e4e3 418211b0 c21bc8dc c236324b 41e80028 -> 40259870 c1bf5662", + "be3e3a00 bfa0f0a0 41712878 c1ff2d55 42344f48 c1f19498 -> 41712878 c1ff2d55", + "41b9d004 c22804d6 40e0e728 c1cf9c31 c1de31db c2242697 -> 40e0e728 c1cf9c31", + "c200ab4c c1a06a55 4221fea2 4203018c 41aaa114 c1735f0c -> 41aaa114 c1735f0c", + "40e7df48 c23ededc 3f6ed480 41aaf988 40f0a9e0 c139440c -> 40f0a9e0 c139440c", + "413a840c c223b8a2 c1978306 4208c32a c21e3b3e c19c2c70 -> c21e3b3e c19c2c70", + "c1ad5348 c2472248 c1b678cd bfa022c0 420ca0a8 c141d364 -> c14eaf93 c046b35f", + "c232851b c218bc9d c1bcef00 40961dc0 c22b7096 41ce1468 -> c1bcef00 40961dc0", + "423b42ba 4217155c c1ad94d1 c167f4e4 c0b94140 c20f7134 -> c1ad94d1 c167f4e4", + "c0628a90 c147af70 c05136f0 422a45de 41fb0d70 c1c04330 -> 4199b34a bf249c40", + "4243b3cc c22b49f4 c1224508 c219b901 c1224508 c219b901 -> c1224508 c219b901", + "c17ff578 421dfe58 41e3df40 4154ec20 4158a0d0 4210afe0 -> 4158a0d0 4210afe0", + "c20546f4 3ff02080 423b9d16 c1cb9a5d c1c23e8a 3ec2e900 -> c1c23e8c 3ec2e900", + "bfa7f3a0 416d7928 414a9320 c23cf71a c2018156 4181d9d4 -> c1aa8ba0 3f258fc0", + "40c5c870 41fefe0c c206a504 41f3ae10 c0bed040 c238e60e -> c1ec1e99 4197d8e2", + "c0dc1a38 c22e38e7 c2185340 421219c2 c2185340 421219c2 -> c2185340 421219c2", + "c21630d4 423132f6 420ef880 c1aac06f 4188ab38 c1ce25b3 -> 4188ab38 c1ce25b3", + "421e5bfa c19f98f5 c0432b50 c02c53d0 40bfccb0 c218cc97 -> 406b37d8 c1e8c604", + "c1d654fd 4224ae5c 4214b43a c1fa3c23 41dd0390 421e3762 -> 41dd0390 421e3762", + "42036400 41de932c c08e54c8 41425290 c08e54c8 41425290 -> c08e54c8 41425290", + "420195ee 420bf056 41884714 c1f3fb87 41bc78a4 c09230a8 -> 41bc78a4 c09230a8", + "c1e233ee 3e559c00 420f5068 c1205f10 420f5068 c1205f10 -> 420f5068 c1205f10", + "423c44dc 41a562c0 c23d440b 423f08ae c1ba01fb 3ed1c180 -> c1ba01fb 3ed1c180", + "3f658a80 40db8de8 c20a0bcd c1c0f522 421ad73e 42356b66 -> bed18800 4103cc5c", + "c20baa0a c11cf39c 42399406 c1a9755f c1a329a7 c20616a1 -> c1a329a8 c20616a1", + "c2351516 4168dd70 c139eb98 c247cdef 3fc85d60 40cfb998 -> 3f6d7da0 4070c190", + "41ae965c 417738c8 42350af0 41a1525c c20d0070 4219f266 -> 41bffa67 41c8083c", + "c1f8f3fa c1baf97f bf83ff40 41f479d8 c18c7f08 4145558c -> c18c7f08 4145558c", + "414a41fc 423d5dea 41fdf3c8 c20772a0 c0ea92b8 41d9509c -> c0ea92b8 41d9509c", + "42472524 40a6d720 c2058b66 41a5f4e4 4227ec94 4164db70 -> 4227ec94 4164db70", + "c22f85fe 40d33dd8 423ed69e 422959f2 422fac50 c1ee2d78 -> 4236555e 3ff2e340", + "4225a38c c205d44e 40b6e210 41e895f8 c22c86ff c024c010 -> 401490de 41d6fede", + "c211c028 c19714f9 bfdef340 4238cff4 40849fe8 40d459a8 -> 40849fe8 40d459a8", + "4189b2e4 418062a8 4207a4b2 c0fd2ca8 4207a4b2 c0fd2ca8 -> 4207a4b2 c0fd2ca8", + "4245aebc 41b04c14 41ea9dcc 41e52cac 41ea9dcc 41e52cac -> 41ea9dcc 41e52cac", + "c1ce88ea 3fa12d20 c005e1d0 c1d9da03 c214f3fe 41a0370c -> c1c1787c 401e50c8", + "c0fc9f08 c1bfc4ba 41236628 c137af50 41a9d9e4 41f66470 -> 41236628 c137af50", + "c1a21763 4192d86c c1dd7d2a c1632d60 4210e54a c1cf353f -> c1d228a2 c1675398", + "c229545a c210ce14 c1d48081 c1429da8 c1317dc4 42223666 -> c1d48081 c1429da8", + "c106b444 40c96c38 41824dac c20da294 41824dac c20da294 -> 41824dac c20da294", + "3f9895e0 4202bd76 41f9607c 4195139c 412095b8 4205c3f2 -> 412095b8 4205c3f2", + "410a5a10 c217d822 c0cedd70 41a737f4 c049db20 41a6daf0 -> c049db20 41a6daf0", + "41b8c134 bed2b500 4211a73a c0c880b0 4211a73a c0c880b0 -> 4211a73a c0c880b0", + "42108dee c1cc3bb9 c1c8f787 420f40c0 c205f01a c148a20c -> c205f01a c148a20c", + "41ebca40 422fb2b2 c1407244 41bed6e4 c245e6d1 419de038 -> c1407244 41bed6e4", + "c2175795 41a8f978 c19fc51e 42203cb4 c1836c8e c226b939 -> c1997bb2 41af7127", + "404c9670 416ca4f0 4224668c c0e9f838 41d87c24 41879f38 -> 41d87c24 41879f38", + "c04b9850 422cc63c 41eb2420 401f9550 c195ae61 c194ad6d -> 4188383d c03b3020", + "c0bac2a8 4182148c c1e6379a 42342252 410b4c60 c1df7c01 -> c144af7a 414f1808", + "41d7d28c c17480ec c221a780 4160fcc8 c221a780 4160fcc8 -> c221a780 4160fcc8", + "41f66188 41c1fda0 412df5d8 c204bb23 c1f02d31 c207ef24 -> 412df5d8 c204bb23", + "c0dc01d0 c18876f2 c2401ca7 c181c4a2 411226c0 c128b8b4 -> c0eb7f78 c142ece4", + "c1e51bc6 c18ac2b6 41a40fc0 41094580 41a40fc0 41094580 -> 41a40fc0 41094580", + "c13ae4b4 c224c6c2 410ecfa4 4199e0c0 41900180 c2348d8b -> 41870460 c214ac25", + "421104c8 41fc1c18 4213c9a2 41c6ed40 41d1c040 c19f6d13 -> 4213c9a2 41c6ed40", + "3e0ac000 4242614a c20eddf5 c2073f62 41c1a698 41b9b9ac -> 41c1a698 41b9b9ac", + "423e8b9a 41e0c8d8 bf81c0c0 c1a57513 4209eec2 c22b7f69 -> 41409bc1 c1e6bc57", + "4157c280 4218e662 c1ba4886 4218cb38 41d1f9a0 41ce57b8 -> 4134ef00 41ec462e", + "c227f462 420f1662 c0f70d90 c1db92bb c0f70d90 c1db92bb -> c0f70d90 c1db92bb", + "c10d970c c209216e 418e0174 c187c078 4167f800 40d72330 -> 418e0174 c187c078", + "c1d5dd94 c1ed05c2 c1a3211c c0a4c2d8 c0dc4348 41072d64 -> c1a3211c c0a4c2d8", + "c121545c c115131c c1b3e0bd c2203e11 c18886ce 420611fe -> c1a153a5 c1093184", + "4212ab68 c1d9d7b0 423ef1de 4123b798 c031ec50 4247e352 -> 423ef1de 4123b798", + "422e89fa c0fc06e8 4088ecd8 41b00778 41aff8f0 c22e2d6d -> 4167c2e6 c17c147c", + "c211991b c0942040 c11d0bbc c228a843 c232869c 409bfa88 -> c214b1ac c0a67538", + "418e9c34 c239ff76 414463c8 c23a3579 41b7aa64 bfa25a40 -> 41494323 c2350bbb", + "41fef6d4 41da6d9c 417da7b8 c23e8c9b c1da27dd 41a01db8 -> c157c926 bfcdda40", + "422bca6a 410f9fe0 41b663bc 408f76a8 40d808a0 41caa3b0 -> 41b663bc 408f76a8", + "41e1fbfc c035ad40 41b6c7d4 c1a2f18a 3fff18c0 42155292 -> 418ef15c c0d2e596", + "42353f42 c203919c c23f95ce c1bd77f8 c1aadaa7 c1689c50 -> c1aadaa7 c1689c50", + "c1f5d8c4 bfe8e420 40d91af8 c1f94566 3f9ec480 4219b3ac -> 40873336 3f773580", + "416d2158 411fc484 419d20b0 c218f16f c158f124 418b1664 -> c03636e0 bf0f6640", + "42119400 423949aa 40568e70 c1eac709 41ec5af4 421db508 -> 41ec5af4 421db508", + "40cadaf8 41bfe758 41be8698 421e501c 41366a70 415bfeec -> 41672d4d 41a0b894", + "412321a0 c1c5d2d7 41d05ec0 42123c28 c1772840 c207f180 -> c099ee48 c17e6cc0", + "c21cd0e8 c0df7a20 c165b9e0 41bd6d98 c165b9e0 41bd6d98 -> c165b9e0 41bd6d98", + "c2008756 c2124a59 42139e2a c23b2c6f c1e12a8c c209caf1 -> c1e12a8c c209caf1", + "c2315877 c22454c0 c1f07141 bf9fd6c0 41e795cc bf66b340 -> c1f07141 bf9fd6c0", + "c1a5e59f 414ee0fc c07dc1e0 4203e012 4052f9b0 421f5b88 -> c07dc1e0 4203e012", + "c1c65b30 c2358012 c1ca981d 422e60f8 40a5b808 c2407239 -> 3fafcd80 c212af46", + "c041a510 41ccc9d0 3faf9640 c20128a0 c0dc9510 422a8f4e -> c09faaa9 41cb0e2c", + "41d134ec 41994ea4 4210e178 40be5510 c23258a1 c108b310 -> 41e61610 40938641", + "41dd21d0 c1297144 c20c018f 41a30fb0 c0a05e78 421a120e -> c0a05e78 421a120e", + "c21d0173 c156586c c187a324 c22e7ba8 c2095096 4143a8e4 -> c1dbf53f c11bd3f4", + "c224ca46 401d97f0 c2218d66 422aa642 c21158b8 4194955c -> c21158b8 4194955c", + "c1857350 418bd794 c197ac29 410b0768 40ceaf30 411d09a8 -> c18260c3 410cea33", + "422f10ec c1df877d c1b7d51f 40472ba0 bfcef6a0 c2214a80 -> bfcef6a0 c2214a80", + "417370f8 42198ede c1d64dc1 c01be810 c1d64dc1 c01be810 -> c1d64dc1 c01be810", + "c21aacf9 c15c6378 c2128447 c1fd6379 41595f38 c1b48417 -> c20dd778 c1fbb144", + "4154917c 418ac978 c19cb5d7 41d4ddbc 420dd538 42270016 -> 4109ae9c 42097450", + "c2193a02 c0b5ab80 41b7111c 4207d486 c21e11d8 421a1e4c -> c20c5d9e 4218d23a", + "405119e0 c204125f c1aa60b8 c22fe703 c1029c68 418a4e3c -> c18fc673 c1e3b77e", + "c09cd9e0 c0cd3428 40234ba0 4211997a 40cf8748 c246d471 -> 408f9bc1 c0bf7a30", + "c1dc4a91 42314b56 3e7c6b00 c1f25238 3e7c6b00 c1f25238 -> 3e7c6b00 c1f25238", + "4204d38a 415bc448 c226606c c1bf9e5d 41d88630 c15663e0 -> 41d88630 c15663e0", + "c1c23e0d c219ecde 40c44128 41cbff78 40c44128 41cbff78 -> 40c44128 41cbff78", + "c1e2b6f7 420aac16 422d245a 41df416c 422d245a 41df416c -> 422d245a 41df416c", + "c1cc6542 c1e2022f 410105a4 c1f60cfd 41dee0b8 4220d564 -> 410105a4 c1f60cfd", + "40283330 c1a8375f c1fe80c8 c1d1e97d c1dae7b6 4163f688 -> c1f6afc7 c18acb09", + "419047cc c23fb16c 421ceb46 ba460000 c0901f38 c0f6c0a0 -> 4127ada0 c0a23857", + "41df8d38 420ed0c2 418c0740 c12155e0 c1b95881 41c70cb0 -> 3f5f6300 4086d77e", + "4210a9ea c172ce70 c10248b0 3e9a9000 c140e370 413a55e8 -> c10248b0 3e9a9000", + "42009514 bfdee820 c23b1eca 419efbec 422bfe26 c08e7458 -> 4200d094 bfc37550", + "c2297d48 416ace70 41400af0 c1cc8035 41378d5c c1ddb04a -> 41400af0 c1cc8035", + "41cea444 4112dc2c 404f7b40 c1c5ff19 41a01ab4 42223dc8 -> 414d017b 4148582a", + "c15f4760 4192dee4 41ea9df0 c05f93d0 c20ab0f5 41d2a390 -> c169970c 4187ce93", + "423097ec 41ceaa1c 41bbac44 4183b28c c23d97d8 42100a10 -> 41bbac44 4183b28c", + "40745d50 c20ed2fc 41f10288 420f8ed2 423af676 c231ff1c -> 422cf537 c1dc77f8", + "c1e7c5b7 c13130d0 c20a155d 41a287c8 4025e7e0 421a7620 -> c20a155d 41a287c8", + "41cd2ab4 41d39ef8 c1c796a7 c21ea836 41a8af64 c1d0db86 -> 41a8af65 c1d0db86", + "41ef3298 423ca3da c1d51199 c0799130 4199bf5c 421a2c9a -> 4199bf5b 421a2c9a", + "421b5e8e 41915d2c 40ff34f8 c2121534 c15b88d4 41b8ece0 -> c0bf9fb8 3fee2f40", + "c0a3afd0 4212b20a c12a397c c1dfe767 420c3ce4 415d9158 -> 41c49244 4087e29c", + "c1a488b4 420eac34 41d185c0 c20beefd 4216dba8 bfcbd160 -> 4216dba8 bfcbd160", + "42458592 c204f4ca 40c40bf0 c1fbfadc 4141df4c 40d85080 -> 40dca785 c1d4b127", + "c20376d6 41c69dac c1236068 41bf5914 c2042bb6 40f02020 -> c1c5b9e9 4157d8f2", + "41a60a6c c22e0ac8 40dac8c0 c18e82d2 c20a0050 420ec30c -> 40dac8c0 c18e82d2", + "421f1d72 4232a2e6 42194b7c c199e958 4120b79c c034bad0 -> 413ab470 c07111e0", + "c21a0859 c20c4172 c197542c 3eeed400 c11dd36c c2409adf -> c152dc9e c1f2c88e", + "3fb46c20 c1b52a8c 4233e83a 421dd8fc c20693a0 424649ba -> 411f9968 422fd9ff", + "c2189ccd c087ff30 bff40780 c1b1fe47 c22e9fae c1f52c70 -> c2050e6a c1e473a4", + "41e96df4 c0650260 4203526c 410ad9c0 414b79a8 418e6c00 -> 4203526c 410ad9c0", + "c1df2f61 c09052c0 4216f73e c22197e1 4216f73e c22197e1 -> 4216f73e c22197e1", + "c1d4623d c2316e7e c221aa42 c2252e03 c07ed3d0 41d69248 -> c21a6b8d c217a28a", + "c0e8d328 c1f53c55 40b4f718 413dc378 c0fb2a28 42449350 -> 40b4f718 413dc378", + "c23bf588 41df7480 42107952 c11c511c c2004dcc 406cd960 -> c2004dcc 406cd960", + "42272738 c18d7ea8 c1b16aea bfdf9060 c222d7f1 41db5978 -> c1b16aea bfdf9060", + "41eee1b8 c1a589de c17f437c c22b0f03 41b0b818 c22ce95e -> 41b0b818 c22ce95e", + "c1df214b 3ffa5d60 422377be c1cade3b 42251f76 3f305bc0 -> 42251f76 3f305bc0", + "c12aad94 c247d384 40efc750 c11e4cbc 40efc750 c11e4cbc -> 40efc750 c11e4cbc", + "c1b36b72 420aecc6 41b89150 41d4ca30 41b98b08 c1b37918 -> 41b89150 41d4ca30", + "412739fc c192b0ab bfd07540 41fe1668 42258194 c1545530 -> 41e93ecf bef2b200", + "4093ff10 414dd2f8 42459c68 c1e3207c 423d156e 41a07d60 -> 423e04b2 416c02a4", + "c209a529 41f7363c 42297cae 42350194 bf52a2c0 c1bada84 -> 4161b2c6 3eb62480", + "c2276954 401d29d0 c23bf3d9 41a2a340 4163e658 c15c8268 -> c20de155 415e9c2a" + ] + }, + { + "glsl": "float cultmath_distance_to_segment(vec3, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "bfe7a040 40c3ac70 40898cf0 c244b85d c22e1b26 c1dbf791 c1c7e920 c19cad86 422be938 -> 423fe710", + "4227830c c1a75ca9 c23c86f7 bf9c2f60 41294554 41500a90 bf348a80 c23ce8f0 c17ca644 -> 426951f6", + "c238ae58 c2313976 c1cfdfe6 41f597f4 41fac708 c2181090 41f597f4 41fac708 c2181090 -> 42d90b71", + "41e9aa1c c10f0d68 c1b6efff c0947e88 c21a466e 40137d40 c0947e88 c21a466e 40137d40 -> 424e30bd", + "c20d4e3f c1809d92 c0e0e180 424254c6 c20b7518 c18f08ac 418ae27c 416d6160 c1db1cc1 -> 4280bfcf", + "c173c138 41bf74f8 418bb130 c18f06ce 41765800 4210b2d0 c23b5b3a c1a405bf c19fb9b4 -> 4194b97c", + "c1fa9ae0 c0f01c68 c18f34fe 40b09b60 c1f437c1 4231f56a 41e2df0c c211ae21 41e0e2d4 -> 429805fa", + "4147dd5c 422d2e48 c210393c c210ebd6 c2291e21 c1846d56 41491948 c20a8361 411cccfc -> 42b37c53", + "421d7dd0 41adaa20 c11b3dd4 42177774 c212a542 c205f4d2 41814208 41ab6b68 c0c0f838 -> 41aec389", + "423c64da c0a040f0 41e8e14c c1e4cd8e 41d06090 c219c07a c21236e6 41b16a9c c240b44a -> 42d433cf", + "4212e6ec c224a28a c1ccca8d 421e62e8 418fdee8 4071f5e0 c1d2890d c1087a50 411fcedc -> 42793543", + "419d93c0 c0faa270 c0fa3a90 423adb3a 4192b090 42172828 423adb3a 4192b090 42172828 -> 426c784c", + "42310844 4214dfe2 c22c462d c2338866 c04227f0 c23f3418 40d6c188 c1447078 4238a25a -> 42af89b5", + "422d3146 40e9a228 42219104 c15a6e14 c202008a c20f4260 41a1a0b0 c1f0f000 4118ed7c -> 4256d1ab", + "c2269c1f c20f5e3d c1ca80cf c1a1b77d 41f440b8 c02c5aa0 c1a1b77d 41f440b8 c02c5aa0 -> 4292a6e6", + "c102296c 409dc940 c23cc0cc c02fa410 40440f00 42190820 c209e21d 4183d734 419fd2cc -> 42922070", + "4208ae78 c19fe289 41a8f328 c229bc8e c23e7cfa 4130d688 42366830 c22f43fc c1b5b869 -> 4231c82f", + "41c1ee80 4245f988 c1ddb89c 418584e4 c129642c 41df8e8c 41b96960 c1cb5181 4246a32c -> 42a47eec", + "4235f7d8 c1dd29b3 c23968c0 422f6808 41f0cd00 41488128 408965a0 41fb56a4 c20d3fbe -> 428caafb", + "c1ecb0c4 c230128a 418e9aa4 c13f6850 41de26c8 422348aa 41cb19cc 42471588 c2225939 -> 429ad364", + "423d9bce c0a803b0 c228a136 c1f77c16 c215044e c2281a40 c20fef1f c0f41f20 c18ad510 -> 42a6deae", + "418690dc 41d102bc c1b4461e c1ee7c34 c23c1cfd 4223c6a2 4178f728 413d0d4c c1bd110b -> 41668709", + "4225fbc2 421cfde0 421baf10 c1e2c45c 41bf9758 c20f4322 40f0fd38 41921390 c192a793 -> 428b997e", + "c20b4f87 41f4c26c 41f8d8ac 4157454c c22b0f98 41bb3e58 417211f0 3f3e1380 c20df3a4 -> 42a0b1f4", + "bf9d44c0 4231fe5c c16ef45c c1abc4d7 c168d47c c2184f68 c1cfff86 c0b6ce08 41e42108 -> 426f29cc", + "41bb3c18 421708f4 c09c4db0 c1b02ad2 422d1494 c211b66c c2061603 c2276213 40ba83d8 -> 4257c842", + "c21d301a 41998848 c2142e82 411401fc c201a5fb c087c740 41ce2c54 4210e738 42341508 -> 4299f3cc", + "c02c90a0 423f59e6 4210d2f0 40aae180 41c5bc7c c20cba84 41769c10 423bfd68 4085d7b8 -> 42133209", + "421ef944 c2393e60 41a1797c c23f9db0 c1cb43e6 c2130698 c247fee1 c1b4b0f8 c168544c -> 42c6339b", + "4233a7d4 40a85ee0 c21c3c70 42022d82 40b4b628 40df3488 c2431f4e 41eca36c 41fc59b8 -> 423eacad", + "bf3bb280 c1d69757 4050c580 c23200f0 c21bc96b c1439bec 4182253c 41cc884c c241c9fc -> 421582e7", + "407e2f60 406ee2b0 c1757634 42045b36 c186d060 c1f426d4 42045b36 c186d060 c1f426d4 -> 421b0473", + "c1f5aaac c1a37a8d bfd22b40 40c06e98 c22bf1ba 42440764 c216187a 4246c56c c2010852 -> 41ea4dfa", + "423a0f28 412ce988 420f554e c1f0c4af 42282b1a 42139656 bfa88300 42242bba 42134508 -> 42626152", + "4226eda8 c1b4d793 c1cc860e 415fa0c8 418489e0 3edaa400 4018fb80 bf1a9340 c15d5744 -> 423a4f68", + "c22d9d0d c1829414 4230d26c c23bfc66 c10d1960 c1eb2d2e 414408cc 41cf78ac 414b1fbc -> 427ea6d0", + "c167ad58 4108c5c0 41c1cf08 42141cba c1535940 c1d4222d c233d924 c1ddbe58 c02bd7f0 -> 423c1431", + "c00a2950 c11a1e54 421dc8e4 c237e3f4 c232d8f2 414b09c4 c22ae642 42279674 c2337a3f -> 42709560", + "41586cf4 c20d0bec 41e5c800 c1dc05b4 42416c94 4151474c 41f266c4 414d64c8 4184cfec -> 4251728b", + "c1ad3867 4247284e c1b682fe c232f503 404ce580 41b5ff24 c20c5f62 c1868790 404acb40 -> 4289b7de", + "c23facce c18ee3ba 423edc8c c163c358 c1e96ab8 c19f2238 41b617fc 4181d510 c0b89770 -> 429892fc", + "41a66d28 c11cd4dc 421ab028 c1461a48 41ba6124 41a2d77c 411f4eb0 c1e9bed3 41ee9adc -> 41a5ba43", + "40b5c6e8 c0fe43e8 3f536d00 c23cda2e c2268593 c0f992b0 c17a8570 bff95c20 c2134616 -> 4228d937", + "c1345900 419aed30 c2414d7e c068d220 c1051e7c 41c0bb0c 412ffa84 c194e5cc c203e878 -> 423a7fe6", + "c1fb27c0 c1a822f0 c1904b2b c2471338 4242b5b4 c20fb725 c2403703 42189904 c21b87db -> 4281cfc2", + "4056ec80 3ec37100 c1b4d688 405e6a40 4204825a 42308006 41c36c0c 41206ebc 41fa80e0 -> 426abeb7", + "404309e0 423f7a34 4237c10e 4172d438 c0bb3b60 c1ca5242 c192fc02 c2424002 c1379ee4 -> 42b4128d", + "c238f6f2 41ecc14c c2378fe1 c1ec9b0f c21526c5 c1ab72da c1d33ceb c1ba6b55 c21fa2e7 -> 42633d08", + "c1510c18 411b4d14 4153c210 418fd638 c19b4302 c073a600 c1ea2284 421962de c1007894 -> 41a1830e", + "3d995600 3fec4f20 40c2a1a0 c1d794f1 422f47aa c2441d0d 413060f4 c1ea1c2a c187a50a -> 42068c15", + "bebfa180 4222c5ae c113ca58 c189f144 3f9c1340 c245f700 422176f8 41be1c44 c06e93e0 -> 42076de3", + "bd82d600 c212aaac c176a5c0 c18739ac 40a0db80 c01144f0 421719e6 422d5d58 c175d938 -> 423b641f", + "41177888 c20a1d41 c1bb2a63 bfcee9a0 41e3c89c c0d70708 bfcee9a0 41e3c89c c0d70708 -> 428436c0", + "c19edd6a c185cd56 c23c9061 41e3f3d4 3ff4d2c0 c1d3e71b 41daab74 c204f57f c19f5500 -> 4255a866", + "c2254b44 40e60b10 c041f640 423a44e4 c0708b30 c1f87447 c224814f 41903430 c07a4060 -> 412ad117", + "410204fc 4210c4ee 418d75cc 3f848ba0 c15422ac c202f418 420aa4ca 40891880 c2283e85 -> 428a2bec", + "c1a7d1be 41d083bc c138be78 c10f548c c17d8808 41616b78 c2077a88 424749d6 400abd00 -> 4192eb85", + "c235feef c24271ef c107759c 408276b0 41b4d1b4 423a4ad4 c1c05614 4224c752 c193f89a -> 42b3bb50", + "41f41dac 412b47b0 c103f5b4 c2432cfe 3f17dc40 c0237590 41762cd0 c0c19d20 417979b8 -> 4203541a", + "c224b6fa 421c2aa2 41469b94 c204f89a c22407ee c1d79aac 421faebc c18b1a46 c1fa1e00 -> 42b0a5b3", + "c20891b8 42280d22 41e37704 423adeec c1c072b5 c223cb25 c214f529 40d79978 c0aaed50 -> 4243bdc1", + "c1d9c145 c22d1186 4221cb6c 422d236c 41224d0c 422ddd78 42064c0a 41928a6c c17b02d0 -> 42b0711f", + "c17c5264 c1696e58 c09d49e0 c238ca4c 420b767c 41b17238 421701cc c20a2992 c1306350 -> 41a96ebc", + "41b3aca0 c1736ce8 41ca18b8 411618a8 4209e8c0 422d6218 c1934b40 421a01b2 4201166a -> 4259e43e", + "42452a06 41b27608 40d3a110 c241a9f0 c1e0e052 c22567fb c246ecb3 c23fa574 42425f36 -> 42e5b5e7", + "42413390 c20c44b4 c218978f 41cda31c 42425066 c1e32cf3 41c692e8 41f393b8 c0449a10 -> 429bde27", + "c200f3fe 420d1c2c c224c555 c1a8f55d 401aab50 423d3468 c1e7f1b4 4217fa98 c1943bc4 -> 41b87168", + "42102ecc c18a2d88 41ff4bb8 bf8be520 40a3d7b0 42344a56 41b71e2c 413ec18c 41e66090 -> 4200b11d", + "c20488c8 41545674 412cd718 c1a387ac bf374700 420ea742 42342e86 40f0d830 c1d88755 -> 41ee85fc", + "c106d2b4 40591180 bf552940 c1e4025c 4185c244 3f921040 42238c02 c20ff226 41580164 -> 40b17b67", + "41a4f0dc bea0d000 c1eb52d1 421f42f8 42321376 c216e74b 421f42f8 42321376 c216e74b -> 4245e4d6", + "c165d818 41f6fce8 c21466ef c1671514 41792950 c187d524 c1671514 41792950 c187d524 -> 41ca3a1e", + "41f37a60 408fb328 c1cc3333 c20285cb 41ecc4dc 418606e8 41ae0548 4157b080 4170f908 -> 4229ddbc", + "405ff050 c18ac498 42063de0 c2201cb4 4200bfb4 c238158b 420d5274 410e04f0 4241b00a -> 420d605b", + "c20bd12d 418971b0 c0ea07d8 421bed50 c16f5d28 c14fd744 c1b57704 c1a4379d c1cbf4d1 -> 422e7e5d", + "bf0244c0 c1ce5dc4 41be5d58 4215325a c115fe88 40748110 c0bb0e08 c159a98c 421e2774 -> 417d74cc", + "c03258d0 412a548c 418bfd58 c201bb1a c1ff7f59 c197b156 3be10000 c23c62f9 42000c74 -> 4253c40a", + "c20e16fa c21553bb 42015180 41cd9600 3e9bc300 c1e00591 3fda9400 c212fba9 c218c8a0 -> 429f80ab", + "c13065dc 41de17cc 419ac5dc 41896d5c c1fb1217 c0f70c70 408f9c40 c1a5a433 410dbc28 -> 424fd568", + "419ab394 41f6d648 41a759fc c2436a07 c21353d0 bf886540 c2436a07 c21353d0 bf886540 -> 42c520a9", + "c1bf5a3b c22ad751 c1ccb111 421f2fbc 408ccd80 4246ba2e bf98ad20 c15014ac c1faf9b3 -> 421762ca", + "c1965326 c19a5974 c198cc31 c12a83d4 c152d560 c1020188 c1dd1e77 4243cdf2 41ce43c4 -> 416f7772", + "c12de3e0 4141e26c c1ea4dbc 422840cc 419b9d18 42253234 41f6ecf8 41487b44 c2428550 -> 422f50e1", + "41e2a03c 40328820 423d3af0 402a36e0 c183043c c10402e0 420ee47c 411e37fc 4230cf7e -> 411f1811", + "3f37f240 421c1898 c2015720 423346b6 4220abf2 c113bbb8 c1b2cec8 41a38564 42011248 -> 422c83ed", + "42348b1c c2183f6b c1ed3da2 c1cd42ce c0416fc0 41ff3a64 4128cc94 415f6924 42124f8e -> 42b61820", + "c165ff68 417f7ee0 c2311ed8 41f2f2f4 4184c280 42111bc6 4158bdfc 41e35bd4 c184cf54 -> 4224f5f3", + "c235018b 41f7b658 c2406b26 c202b042 c1321900 41478b14 c116b654 3ddce000 c0b18230 -> 427e783d", + "41f21914 41d8382c c2314596 c185aa4c c2066a9f c21e4c36 c058bd40 41831f14 c18c7158 -> 42312942", + "41ba7ce4 c210a9fd c1ae3514 c17cb234 40417050 c1e1eb96 c17cb234 40417050 c1e1eb96 -> 425ef355", + "c1db44fe c1d1026f bf455380 c2336f14 420b0010 42053772 416f0a28 420de4d8 420a0640 -> 428c35e3", + "4226a3b2 c1dbd5dc c21e3b4b 41d93d78 c20f5010 c21fd444 40524b40 415f9064 40c56ba8 -> 41859170", + "408003b8 bfc51980 423c9ff6 c22ff0c3 4109903c 4124953c 4244c4e2 4164e2e0 c2039075 -> 425b89cc", + "424004ae c1d3a6e0 40ba92d8 421ca452 4223a872 402f5b50 c1e11b8f c22253ef 41895560 -> 4247484c", + "c1e697ab 41c483e4 c18c7788 41bb12dc c20ab601 4226373e c1137180 c219419f c0ed6d80 -> 4285481f", + "41b07000 423f80ee c05d3240 c23f005a c1efcc83 be0e1600 c1a5920e 41c10c9c c1ba425c -> 42531331", + "4192ea9c 423561ec 4210f64a c23afbe5 c1426a18 c245762d c217d8f2 4190ee44 41858570 -> 428317b3", + "423b396a 42032408 4222c53e c0cb9250 423e9856 c0c43ae8 c12e3b70 41eb7d08 c207ed08 -> 4290c79b", + "c1e23331 c20c901b 41991528 c1130f5c c2333d09 42160682 41f57b68 c2477c41 41d7ff68 -> 41e19719", + "4202cd40 415e9a4c c1677030 c19510ce c147ffe8 c0114140 c1d67c20 c1c15b83 42194ba8 -> 426c044e", + "c0a022a8 4243c49a c23598b0 41a81404 c0b61a00 41b558f8 40438810 421d13fa c22b444f -> 414da2be", + "4101cd54 420fa2aa 42404126 41ec0014 420d699e be078c00 41e746d8 40605690 c1be5150 -> 4252ecca", + "42247770 c16ad38c c22f7250 c09a01e8 41f5f90c c2185cb1 4132ad8c c188da56 c02ffed0 -> 423efa99", + "422472dc c09fb850 4239ff6a 41d00a24 c0c4a8f0 c212e11b c0efa948 c1d9bc66 c21ef76b -> 42a92cae", + "422bc80e 423dffaa c07f2040 422be978 4217fe08 4225a9ba 421e7896 423b2a94 417d95c0 -> 41a1001a", + "42467ae6 c0dba0d8 42210d7a 420cc4fc c1638cfc 419d790c 41fc6a1c c2214f72 422b36ea -> 41cac13c", + "c0ff60d0 c19692c2 c165ab60 4095d730 c20c0a48 c1eeb4ab 410c1660 c21395a1 421da342 -> 41ab5125", + "c0d81960 c1862442 40e60dd8 4178aaa8 c228abde 40c40cf8 c1f8497e 422e77c6 421d3d22 -> 4142ae8d", + "41885acc 4140ec60 c11c5eb8 c1fbf3c3 4124cf50 41660338 c2115c02 c0019090 4097dbd8 -> 4258f824", + "c1a02a3a 40b26d70 41dfe780 416197d8 3f785b40 c1894b6e bf1a8ac0 413c45bc 413daa08 -> 41cff268", + "c22a78ab c246c53b 41dae1b0 41bf8688 c1a8fc0c 41d41c6c c1bc809b 41831a10 420fca2a -> 427f4f54", + "c1ed1928 41c26198 42318712 c2444550 c21241cf 4217bd46 40478440 41efb19c 4223ce4e -> 41b58235", + "4105bb94 c1c5856c c20db6c2 41379b34 41069ae8 c21ce15f c1bed28a 4216af26 40a7d0e0 -> 4205dc0d", + "c191e576 c20a8622 421e8426 421d695e c1210c28 40e64e88 40dfcbd0 4185e544 420aca40 -> 4263436c", + "41407338 40740cb0 3f29f180 412934c0 c0111570 c02e90a0 c2161923 40b5d0b8 41331a70 -> 40e30212", + "41a68648 c2467c4b c209e377 c1b50250 c20d1fe7 419b7a10 c1fec15a 42004a0c 420ef186 -> 428d6760", + "c21b6d15 423a60cc 412ff6e8 c23e8901 40604670 c133bdd0 40c58010 c2340672 420aaca8 -> 424519e3", + "42350e8c c19cfdc7 c21107dc c21d9e8a 422e7b70 421185a4 c21d9e8a 422e7b70 421185a4 -> 43003cf4", + "3fc4a300 41484bf4 41a3b948 bf9fc5a0 c235d1e6 41c52b08 c1b10976 41c5128c 41a3ffdc -> 419a02d2", + "41ac4194 417a1928 41c75ee0 421186ae c194ece1 42475d56 42015342 c22bb737 c22421e4 -> 4227f6bc", + "4231b366 c22c8bdd c22a12b2 c15defd4 4176f008 422b4310 3f194980 c181f92e c1ad4b16 -> 425df2cd", + "c236733c 419ac310 c2118ec7 41c15cf4 c118f7e8 42128b92 41c15cf4 c118f7e8 42128b92 -> 42d21f95", + "c216d7fd 420517a6 c1e050f5 c17cce48 c1226ff8 420427c4 419edb60 c1c9b31b c23363c7 -> 42883342", + "c2327b76 c21444b4 c1d58f59 c2137424 c0a126a0 c1fa67fe c2137424 c0a126a0 c1fa67fe -> 42051bf9", + "41f1c438 c0aa7850 40a12d78 41c81774 420545d0 c21914f6 41cf06c8 423077dc c06d12f0 -> 424803c7", + "4235d092 c23f40bb 40015100 42395174 c081dab8 c0a81010 c04cb540 c0f08600 c1cfbdf3 -> 42316d2e", + "c23ebabb c1cb7493 42004db0 423ab61a 4036c640 c0d0dc18 423ab61a 4036c640 c0d0dc18 -> 42d39afd", + "c1d85428 4133ccbc c203764e 40fc0ca8 c2317607 c20bc898 c1a4fdec 42101bb6 c24079d1 -> 4194b237", + "42065890 c1596d84 421c9fca c1b65b29 421e1b78 420b3e54 4230ac56 c1d0adf1 41f050e8 -> 4106a160", + "3f9a2360 41093f74 41a39818 c2213458 c21c3369 422bc61c c2279c12 c1dec154 c1227ab8 -> 426ead0e", + "402d4980 c106c984 41a1f2d4 c2225a3b 40b4e330 41498d18 c1d54e37 c16e86ec c1a98a12 -> 422e7993", + "3e0ee100 c11b5e14 40e8c9a8 414e31d0 41809f0c c2075c72 c118de20 412445e8 415b3268 -> 41ae62da", + "c23fdac5 422a856e c044b020 418e7790 c2276712 c2456351 415d9934 41661838 42232724 -> 429cc7bb", + "c07459c0 4229e06a 41ac6c0c c2008d9b 41be1b38 c22b1e4c c18f2c8c c0ffa880 41815668 -> 4248e4dc", + "42346e10 c20363ff c0cc1ef8 c21fa0aa 4014fd00 41113844 c0e64628 c21c5760 c242c957 -> 4284bbd9", + "41074af0 41b04b14 c242f329 c214e4e2 410d3b54 c00ad8c0 4128f82c 41213cb0 423298a2 -> 42851c40", + "c0b646e8 c21c376e 421c7ed8 40f1ac68 c20b25d8 410f4b58 419fd254 40f573b0 4195e4e8 -> 4204e56c", + "42306646 4066d430 c20a1408 c19d3dfb c1c3719a 4241bd88 c231d161 420b893a bf7dad00 -> 42be8072", + "41513d94 41e0180c 41108e40 4008bf50 419f1944 403bdac0 bf9e2100 41c129b4 4224d394 -> 415ae393", + "c028db20 c2258a58 42338530 c205c9b1 4182f44c 41b03520 c20ce912 4208a57e c1afc5ab -> 428aaa70", + "c0fa4ea0 41a7ab4c 4214d3ec 420b0e50 c1c98044 420c88c6 406ec2e0 c2349a86 40d1cc88 -> 42799b0a", + "c21bba21 c0ef9aa0 4216a8ec 400c1f90 bf0bba00 41cd69a0 42378370 4182563c 3ff4a040 -> 422d9160", + "4183b5c8 400bc250 415f9b70 41530eb8 c21fa124 42375450 3f896740 420df09e 410ba050 -> 41698d0b", + "40db6080 4163ebf0 c1b567d2 c1df2206 c17b3044 c1e4edbf c21cf880 422879c0 4223381a -> 42284bff", + "c201a4b8 c12fb998 4188ca70 42429242 41b19df4 c0c2b410 412f52bc c2349a5e c1e86689 -> 42896094", + "c18dff08 416d65f0 41c55ee8 c18b2e98 423df98a bfc28600 c1faa43c 421ffa08 c22c1136 -> 422773f0", + "c07829a0 c178d5ac c20071f4 c182b170 c222b9ed 4191f720 c1f96e7d c04b51e0 c20b3f6b -> 41cfd6fa", + "41cbe608 40512bf0 4223f4b2 c23c5af1 3fc29f80 c238f64f 41e1f210 c1b46d6e 420c56f0 -> 41d39f1f", + "41688f88 c1bf013f c1cb1519 41ba430c 422a57f4 c071a680 421c88a4 42281294 421e4b8a -> 428cdd08", + "420c8af4 40e48688 421d4c2e 42416088 4180abf8 c1e9e50d 42416088 4180abf8 c1e9e50d -> 428cc8de", + "c12f8b04 41aef928 c20f7632 423f2c18 420490b4 c1e6f8e5 c1ffb0a6 41f8a770 422eefda -> 4237d083", + "c22605ea 3f3ca180 4224e498 41b7f198 41e7db78 41bec994 41b7f198 41e7db78 41bec994 -> 42910c6d", + "c2392851 c1f003f5 c220aade c1826576 c10ec2b0 415181f0 c13102b4 c1b993a3 40e7fab8 -> 426dd706", + "c1fb0288 c1fd3b9a 415f1a40 c2049ff4 c152c3b0 c199f0fe 4193128c 42346856 c22eba44 -> 42181bf9", + "40d20458 c0603cb0 c09ea2c8 c07c6510 c2425b0f 41e39c4c c214b0ae c21f6518 c1fea46e -> 424316f9", + "c208959e 3fb7b620 c207be82 41f8a2ec c0191fd0 41c6e2c4 c2470444 41de5c24 41ba7720 -> 427325cf", + "40dc53b8 41b68a00 41f9b130 421c3d9e c247a214 c09dccd0 41c8e23c 4094b4d0 c20bd8d4 -> 428c167b", + "420b9ede 410da5a4 c18daf5a 42134382 c11e3cc0 40b45188 c22de010 40e6dbd0 41c7a4bc -> 41effc0e", + "c225779a 41d15bc4 4199e410 41e79f10 c1f612c6 c1a9b728 c20c62e0 41898218 c23edf4b -> 4285d57b", + "c1e1a679 c202f7e4 c08121e0 c1449490 4213258c 42225b32 c1e378a3 4206fb8a 41748e70 -> 428a79fe", + "423473bc c1952b6f c1107d6c 4232df70 40b8a3e8 4102e2e4 421fd286 40e007c0 c1f6d544 -> 41c87ac2", + "c23ca44b 42316c0a 419e8e04 405c0500 c1f26877 c0defdf0 c1590800 41f5b928 c239ad09 -> 42938172", + "40175e50 41da98a0 c247e20d c1f60a32 c16943a4 c2284fee c1814524 418d2d80 c214725c -> 41c44ef5", + "4227b7de 41f1e5dc c1d689eb 41cf938c c10f0a00 c1d9b735 c1829ea0 41da3c38 c16ccb0c -> 4220ea23", + "bffa8a60 bf93f360 c1ffe1d1 41da1c70 41b01658 40fce138 4216ff7e c1b47e8e c023ee60 -> 424380a2", + "41f15128 c07d74b0 4114c160 41c54488 c1f0bee9 c1126398 c230bd2c c200d895 c1956755 -> 4201d509", + "c0bc6560 c0d9a348 c2167d2f 4225cb08 41021990 c1dd8876 3f8d0ca0 c1db2e75 41a96200 -> 422b7d20", + "c08f8540 c1bd7681 c0310460 c224f6e3 c145dcc4 41127f8c 411e1194 c239ea81 4114f4e4 -> 41824100", + "c1ee54b4 c13c5280 40c149e0 40c8c540 413c587c c22e634b 40c8c540 413c587c c22e634b -> 42836f57", + "41caad40 40a7d890 c20876ba c0ec2170 c08386c8 c1e87ad3 c0c7ee58 c1f6f058 be984c80 -> 42099846", + "c1e7308f 422a9ce6 41725ae0 c210d72d c2349fea c15889ac c135200c c14f9a2c 412c02a0 -> 426a0532", + "41fe3ad0 4217e004 c23ed2ab 423557c2 40763d30 424338fa 41c8675c c1a2962d 3fdd35e0 -> 429973f4", + "c2175395 40895c68 c23326c2 c23f99e1 c230780c 4214a25a c23f99e1 c230780c 4214a25a -> 42bf6ab1", + "c21331e4 c240f2dd c22b4314 42375a60 4060e0c0 c1e200ed 415ba874 40a12280 41886fd4 -> 42b8ba14", + "3e0cfc00 41fc3b50 c2432e15 c13caa00 4159ef0c 423a7f66 c234815d 421b17fe c03a9d30 -> 4281b5ea", + "40ecf898 41a73c34 c20fb2b5 c12d6b44 4215769a 403cdbc0 c0196b80 c2285f21 c2014244 -> 42026b25", + "4157c228 4126d568 420ca9f2 c1cd9dae 41867858 4215c3a8 c01cd740 422e4aa0 c0559180 -> 4212a195", + "c16c2a58 c1edd69d c21a4815 c242e759 c1ff996b c1888894 c241a34d c1eb6f12 c23549f7 -> 4206e510", + "41020c44 41480400 c2261c3b 422779c8 c22ad238 41784e40 422779c8 c22ad238 41784e40 -> 42ac8449", + "c12384e8 bd91ea00 40ba49f0 416581d8 c0f67ff8 4216bfd8 c0e7c9f0 41ab32a8 41d17038 -> 41e3c647", + "420fb800 c0109f90 c21acbfc c186e248 421ed7a2 423973b6 c08613d0 c1e71c36 408dd730 -> 42814a77", + "41f82f90 417d05c8 c1b7be5e c20127ae c14dd678 411798bc c20127ae c14dd678 411798bc -> 42996822", + "c1a57ed4 c2441076 3ffa32a0 c1c17817 c203fc9f c242d764 3f6e5d80 c232fd74 c2307538 -> 42485138", + "42365522 4229eea8 bf909460 c22c77de 3fac33a0 4143a830 4247a6a6 c2187af0 c1ce567e -> 4292900a", + "c1d4bb0c c216ba74 c109c394 c1fa03ee c0bbe200 4237f9c4 420367fe c1b653d8 420349d0 -> 426c247d", + "4025e680 c219dd61 c1c1f93f c22d57f0 41bfbaa8 c1d8d38a c04887c0 c18ec15a c143e7c8 -> 41c44d55", + "c23256c4 c16c5c34 4231dbe8 c218f5ec c17005d8 c0f06428 410d970c c1c62cac 42190f06 -> 4227e88b", + "c23cb3f0 4209ecce 41fd8068 c1ce3342 41f8e240 407bc620 41df0c44 c20404f6 411981bc -> 420cd541", + "c1dc8e89 4244e2b8 c188aa62 423fa8b4 c240fe5c c1d2393c c221745c 42083282 4185d690 -> 42173041", + "41c0fe04 c2163553 4206ff80 41e61548 4219884c 418e0ea8 41e61548 4219884c 418e0ea8 -> 429b7a89", + "42020742 4234c31c 40f3f2a0 42225088 4218b988 c200965d 41098dc4 c1c39220 c1efbe1d -> 4224ba49", + "c235063b 4228ea98 c1a1070c c1ef6baa 4190e338 c1a13b2c c1228a9c c21ff790 c21ae4d8 -> 41e49dd9", + "41802110 bf40f2c0 41c66680 c1ef8a80 c22f397b c23ec1dc c221fba0 c16287b4 c2129634 -> 42a91a6a", + "41f05fe0 c19c8dd8 421ecc9c 41ee7ac0 42218162 c24512b2 41d8b25c c23d1a68 c0bbe578 -> 4254d5d5", + "c2147623 c2267eca c10797dc 420b1c52 415d5528 41bd5790 413fc60c 4212200e 41082f48 -> 42ba5cdc", + "41b3c8b0 41fcab08 42098a04 4234c870 c17b795c c23e3dc3 3feb2380 c185e9e6 c1ece048 -> 42a59ab5", + "c21732dc c11c71b8 c1a26e6f 42447ff2 c1a47aa2 c1d9f542 be4d8600 41c28164 c23de205 -> 4265e7a7", + "417e1478 c1bc0256 40c72bb0 c19a29db 4235e5b8 c14e20fc 421db448 40f47a88 c2291dd4 -> 4269b8dd", + "41daa480 c1febd49 c08f2250 c1eb39b0 423a0ce0 c1d8375b c1adee11 4241da6c c07d0f00 -> 42bc39f7", + "420155bc c09fe4f8 40aacd28 c238aec7 c02c7b40 c0c58f00 41377a90 41b54c94 41e570dc -> 4226342a", + "42080212 c1b1be7f 4246e2ba 41c12b7c c2366262 4216b0d2 c1570b88 c080d3f8 c1c51fe4 -> 41e0b0d2", + "c1c3ae3d 42472cb4 c23d8cf0 3fede8c0 4239c71c 4230c9ca 3fede8c0 4239c71c 4230c9ca -> 42beb346", + "c103d978 c12e12ac 3fab01c0 c0926710 42302bc8 4232c7dc 4242ccc2 4205b2c6 3fd2f2e0 -> 4278420e", + "c20b6a75 41a87834 c204f204 40991030 c1e8fc83 41a94a60 c1836722 c2073a76 c224a3f1 -> 4268a6ab", + "bfd1c640 3fb040e0 42012376 c1307704 bee74000 c1fc82bd 4230bfca c22a75e2 4046e820 -> 425b0b86", + "bf909700 42369ccc 418b65b4 c1fdb584 42022906 c0f37d80 c15144d0 c16f9664 404458f0 -> 4225c11d", + "bff69ba0 c0f3c0e8 c20944a0 41167cc8 420d3550 c0b49038 c21f257d 41f66658 41ed7240 -> 42536267", + "422f1702 418bf838 4237819e c20b0d18 4227dc72 4206672a c06a9f10 4221879a 40dabef8 -> 42831fb4", + "c19d7775 c1851b4e 41b1f1fc 41e1db64 c17eb8a8 422542a4 c1ddac30 c1f40e82 c23976c0 -> 41f4850f", + "4151ffe8 bf10c8c0 406acef0 c13341c8 c0febf48 42423208 c13341c8 c0febf48 42423208 -> 424e54bd", + "c22a1cdb 414e3f68 c2127361 41a2e6fc c2301616 c164e564 c142119c c1bd6e69 4243c1dc -> 42a89766", + "422745b4 c192ef3f c05d8cf0 bfb0d640 41fafe58 42471b2e 41c6afc0 c1c5654a 422ff2ac -> 424b2859", + "c14cd83c 40216690 4222e1c4 c20fd64c c20d2736 41a11dcc c111d9c0 41b995a0 422daa6a -> 40db5de4", + "4222be18 c2330658 c11a4f70 c1ec319e c0b52ee0 c210b0d2 bf22d140 c20aa22a c1ea7590 -> 423b7308", + "41ba6e40 c1a10fbf c1115510 4159c690 4229c8ac c22bd673 c218bc74 c22b58d2 423600e6 -> 42255392", + "411ae908 422499d2 40b4d5a8 c1ed2100 4219281c c1cf20fb 4241fcb6 409e65d8 41b15c2c -> 41a5f180", + "c188c33e 41e3b558 c236e0d6 c15c7534 42134770 416ac320 c223a2ea 42124c0c 42251c3c -> 42743b1b", + "c23577dd c19cfdef c1e33df2 4227663c c1a96468 4117e828 4227663c c1a96468 4117e828 -> 42be375c", + "41a80868 41759980 c1823b3c 423b57c6 c22aae30 c2199453 41b875d8 c18e81d4 c1ee2abc -> 420f7255", + "c235eee1 40c621f0 4231a800 4084a770 42462444 bed08600 4209e286 41d6546c c1b1d035 -> 429f61c2", + "41baf57c c21d7f86 c1c610fe 41c11658 42335c74 c1c34e14 c2396557 422621b4 c1a9a3de -> 42a82d2b", + "c0014890 c12ff300 4224aae6 c1f43143 c1a58d8e 419c7198 c243561c 41a6f8a4 404650e0 -> 42143f2d", + "42083488 c21264ee c221c72e 4213e6dc 411d8dd8 c06e46a0 42130b1e c1657800 c17968cc -> 4205e5f8", + "422f4922 c183b7de c24004b0 c206b5b5 c1eeb4c4 40656d30 c13c3c44 41260ee4 c11e4484 -> 429117be", + "c23a6efb c244fcbd c1c94898 c200a890 41c05e84 41fc3270 c2418c82 41783780 41706558 -> 429878cd", + "c1d275b0 c1133bdc c20ed849 3f88de20 c0ffd128 c21199cd c1076e48 411f7eb0 c243b857 -> 41cd3c9c", + "40e3df38 c2161c3a 424541c0 42190a6a c1a70055 418ff150 41cddf54 c20e389b c14fe044 -> 423cce50", + "c199e51a c16bc988 c2144866 c2224df4 c2338fe0 c1136754 c0e3ab78 42053146 421a3f5e -> 422abfd1", + "41a51154 42055edc 41c288e0 41ec9ab4 c16a199c c1e60586 41ec9ab4 c16a199c c1e60586 -> 42903124", + "405ba720 c11cae50 41e22284 c1a0dca8 404181a0 c1f6074b 3fec8ec0 421ad79c c22fc966 -> 4281a471", + "bf61ac40 4087de70 4214ac18 c1ccc55e 4223ad3e c2423e7d 40b33a60 c0814980 c2432050 -> 42abd141", + "c1608a1c c23149b2 4103cca8 420358be 4219b78a c1b10d21 c1e40b63 40390d10 c2287d68 -> 428cf09b", + "422b0256 c0857a30 c1da50dc 423d7000 41be3a14 c13d82a8 42064d7c 4199bb40 c1b94245 -> 41cbb034", + "c22c7f00 407aced0 3ffbaa20 41fbd438 41e751fc c05c9fd0 c128e7c4 c1c55ce7 bfe64fe0 -> 422dc092", + "41b8c980 c1d232a7 c108977c 422af74c c20bdea2 c149dfd0 42051ee2 c00fbdc0 41ffc288 -> 4194267a", + "41f6aa04 c2253966 3f2011c0 c22c8f0d c142f8f8 4243d3a6 c22540d2 c23ad76b c193b789 -> 429165a1", + "c1f7101a c1f214d5 c238503f 4227e10c c0a23c68 421189ac c1e80f21 4200308c 406d8fc0 -> 429f0c07", + "c2353cb0 c20b74b4 42014ea4 41d306cc c1904b7f 4238a8c2 4170ea50 41983750 c2368968 -> 4292f6bb", + "4214fc5c c1f0242b c0cabd38 423e38e8 c21853d6 c162da9c 417b8400 4240ba66 c23ad35a -> 41510ac4", + "422f2d52 40c76398 c00c1270 4244cf6a 41b9612c c15d8a18 c1fddfce 4056f2c0 c1f19229 -> 41a1023c", + "42302b28 c231a224 41c72d64 4246589a c23759c6 c24311ab 42311056 417b26d8 c1bd1013 -> 428775ca", + "4243b1fc c1802958 41f069c8 c20f14b8 4216d354 c12571ec c20f14b8 4216d354 c12571ec -> 42d84049", + "c1d04b2f 41d1410c c1d983ed 42448d50 42448a08 41d09a78 40904c90 c23b2d2d 42373cc6 -> 42aa6f07", + "406b6f20 c1fef635 c2193496 c23e848f bfc52480 418a98e4 c234e202 422d92ae c21d422b -> 429a40de", + "c23ff0a7 420ec502 c247e8b5 c103873c 41fd3d04 c09d4640 421c415e c21a03ec c183e5e2 -> 4270efa8", + "c134c104 c1a3eb3a c1f6f3e0 c14c5208 411d07f4 41d16f20 42375c82 c1d48fd6 41fad060 -> 427d3cdb", + "41e8b3d8 c12b89c4 c0863430 c1dc2b23 c12779a8 c23e74f7 41b5820c 42386662 41d00fd4 -> 422b35fb", + "419aee1c 418aa1d4 c2021133 4221bec8 423093fe c1169d68 41c07bc4 c13baa6c 41d11278 -> 42197bab", + "419d8b88 41094524 c0ee3468 3f7ee640 421ec28a c0df9408 c1ab0698 c1cea6e5 4243fed6 -> 41fc99e1", + "c217d582 4218d366 c23f0365 c1795a14 405883a0 41facbd4 417ff530 414bc728 c121d1dc -> 428d1774", + "c1682f5c c0dd8dd0 c0dd4400 c24165f8 4244816a 422bdafa c22cbf7d 41aafda8 c217e46a -> 423da3fb", + "c02d1260 c19d26d3 c189b036 41714d00 c23b1bf4 40f238f0 c18a7576 c1ebeeba 423ae41a -> 4223339d", + "423c678c c1068640 c14f25c4 41bc3460 419e0120 bfbd7120 c1aba3af 41f94750 41715140 -> 4219e481", + "424189dc 41c3de64 3fef45e0 c13c92b0 42183584 c21ab3e8 c229e6ab c1bb1107 c20a0637 -> 4293a0b5", + "c2176f08 c180a8d4 c1967524 c1d55fc9 41777b20 40e7eef0 c17f23c8 41fd7bcc 40ad5c10 -> 4229ad8d", + "41801b60 4182e2b4 c190cd0e c231177c c05b1cd0 c0905ab8 4237736e 422f95ba c22fe848 -> 41677ca0" + ] + }, + { + "glsl": "vec3 cultmath_segment_closest(vec3, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "c22ed57a 41be8084 41d83b74 c19dad2b 4222bb30 c1c2c648 4112f504 41b67f50 41e3e4d0 -> c02cf0f8 41f15004 40d80a08", + "c233f126 41bb2800 c227c49a c15efea4 421bfac2 c22fb237 c159f200 4152efdc c21e66fe -> c15c091f 41bef351 c2258fc1", + "c1c20fb6 4115af30 42268d20 c10c2a38 41e5ee10 c048fbe0 c0960cc0 c18fcefc c0ed5238 -> c0f2132c 41705f9b c08cab84", + "c1eb4077 420cd05e c18ad628 c242f2c3 c2448bdf c2117c64 3f74d680 c13abd28 40dc6ee0 -> c0bf3de0 c1872f02 3f5a75c0", + "c23b3480 c1f529aa c205123e c12b4a18 c155f090 4133dd94 c11868c4 422a79b0 4104d7d0 -> c12b4a18 c155f090 4133dd94", + "4205fcb6 416c8918 3fc64c80 c1f4d26d c20f168e c18a9112 4247a4b8 c0441460 4200b320 -> 41fe286f c126ef90 41a82e6e", + "c19e2c20 41d9ca54 c16ccf24 c1788c84 c05a6740 c1b6b681 420dee04 c1f18308 c11403b0 -> c1788c84 c05a6740 c1b6b681", + "c22ed1e5 41a8d714 c2358e6a 4191f2f4 4138bd5c 424032ca c0cad9f0 c22e7306 c0ec0fb8 -> c08b2088 c21c9389 c038c400", + "41bdc51c c1d68220 421423ca 3f9196e0 c23fa4f3 402c4b80 c19ef236 40b9ebf0 c182c40c -> 3f8dd02d c23f57b1 402a956f", + "40c4ecb0 c1dc9e07 422ad3ee 421b49fe c1218b28 c237eb60 421b49fe c1218b28 c237eb60 -> 421b49fe c1218b28 c237eb60", + "c10a258c 40a09330 c1eab15a c197e514 c1c03355 42089ef6 42203c7a 40fb3b90 c2074957 -> 41972652 c064cf30 c117475c", + "c17f34f4 c24759d4 422e17bc c1bced48 c2166ed1 4122c2c0 c1bced48 c2166ed1 4122c2c0 -> c1bced48 c2166ed1 4122c2c0", + "405c2310 c22bd500 4220c160 c197b32d c18cfc5a 422f94d4 c0987e00 c1a29ef2 4210a082 -> c0987e00 c1a29ef2 4210a082", + "c101ab30 42077d1e 41e32f38 3ff6a2e0 c1ad4779 40f0d5b8 4211f22c c2014194 c1de23f6 -> 3ff6a2e0 c1ad4779 40f0d5b8", + "c244b5e4 4206a614 41755df0 c242f893 42387a52 41fb6774 c10332c8 c2010a4a 42368ccc -> c2342695 421bd396 4202e5ae", + "4246d3ee c1c711a7 42202f2a 42466b38 421aa3d2 c067a870 40c0e758 c1d03b13 c1636c28 -> 41bfd538 3f1e7980 c11d986e", + "c177e4b8 4247c586 413b80dc c2037098 4238865c c1c53c41 c2037098 4238865c c1c53c41 -> c2037098 4238865c c1c53c41", + "417078d8 c01bf690 4201e7c0 41c242ec c0ef9e18 c1800cd8 c23bc6bc c1714fa0 3f738640 -> 40aa1ce4 c11829be c137da02", + "c1f55784 c1c64782 c1b40aeb 422c4ab8 419e383c c104b1f4 42123548 41544518 41ffad94 -> 42293fcf 419824e3 c0664578", + "41ecb104 c12e29c0 41483ed0 40fa3640 c204e1f9 422f4df4 c233a162 c2337ef0 41a630e4 -> 40fa3640 c204e1f9 422f4df4", + "41702b00 423a4bac 42452712 c0453180 c2447b6a c1e07447 c19b22d2 4002aa20 c22f43ef -> c19b22d2 4002aa20 c22f43ef", + "c12e7bbc c2310ba0 421100cc 41c8b784 423a9aaa 4220cb14 c2062f48 4227b328 419517a4 -> c1620740 422df5f0 41ce385c", + "41ee12d8 c0efd060 40f01b70 42253e26 c002e780 c1552f00 408d0888 c1c0aeb4 420c30e2 -> 41dcef83 c1239469 40940290", + "41624e98 c237decf 4228c624 c245b1b6 41819634 423fb834 41d59184 c1d9eedc c1c095a4 -> c017ee80 c12a6e6a 405b2f80", + "40e2a9a0 c22c84f8 4132b074 c0c80cc8 c23a4ade c177d560 40976720 41bec844 40374c40 -> c08f1188 c20c9f6d c14838ee", + "c1582b08 41ebb498 4243db60 41f20180 417722f8 c213548c c0fa1c80 c1dbf667 c12edf08 -> bfa774e0 c1a13be4 c175b94c", + "4187f37c c2319238 c2246f58 3f1a3240 c1a549dc c2353a0e c1bf9125 c16f0080 c211d1c3 -> 3f1a3240 c1a549dc c2353a0e", + "417ff7f0 c1c8e52a 42178902 c13955d8 c231b9ce 422ec826 41ecbe18 41b71cc8 41fab3ac -> 40934dc8 c18fbcf0 421b59a5", + "41b867c8 c234cfde c16de9d4 c1989f0a 422fd164 41f479dc 41370bd8 420ab95a c233ba2e -> 40c357ac 421135b1 c1fddc2c", + "4206c054 41ca98c8 c20e5caa c1b01464 c231662e 40861fb0 418c21d4 3fbceda0 423fea60 -> 40774da0 c165a288 42036b3b", + "4124d794 c20e35c7 41c57520 414726a0 c245e47b c1f2a5f7 c0352870 c219982d 42265148 -> 3f7ed750 c224b037 41bc8ffd", + "c10d5428 c227683d 40d4bb30 420e1480 420a714a 419a5c18 c192dbe3 41432674 41a3d078 -> c192dbe4 41432674 41a3d078", + "c1a00be3 420e3870 c189de8e 40bb8810 c14b8200 c10a07b4 c21ff82e 4222b198 c21e15eb -> c1cb4ffb 41bd9546 c1ed9749", + "41c74808 c1f8dfa2 c19cd614 421c99d4 c0825048 c1af10c3 c1edf1ee 4109a6a4 c19f14da -> 41f10d20 c01a6ddc c1acf917", + "422c6810 c1f39d5a c0d3dbe0 415613d0 c2308dd4 be24dd00 c213e700 41cc5120 c1fa9602 -> 415613d0 c2308dd4 be24dd00", + "41f7fe60 c0fc3510 c1c6abb1 417a14d0 4188ba44 c232b8b3 421eb2f6 41c5faec 41fd7300 -> 41af6ab4 4198c4d8 c1c5751d", + "c2438242 c23e488a c12685e0 c1d58f5a 413be314 40cfdf18 42318a08 c1ddca71 41de0598 -> c1b4f4c7 4117ae45 40f6df6d", + "c18f57ec c22b9cb7 ba950000 42017306 c1abd1cc 41b850cc bfdd3fc0 c21e3745 c0fa60a0 -> bfdd3fc0 c21e3745 c0fa60a0", + "41aff930 c0a4d8f0 c1df869e 4239a4f2 c13a5b10 c17882f8 c0387920 c189aab4 422ee608 -> 422b6147 c140caf0 c133ec04", + "41d76054 c22cc2c1 c24173d2 41a9ef08 420a716a c08fb370 bfa45360 4222b09c 41efa594 -> 41a9ef08 420a716a c08fb370", + "423f25c4 c15af81c c14e479c 42138ad8 c1007908 4222fe38 41b9e688 41bf37d0 42287a88 -> 42138ad8 c1007908 4222fe38", + "c18b6cea 420d148e 420bcf16 c14468d8 c21c7890 41e9d478 4209ff4c 40c8c6e0 41f2f58c -> 41b2796c c0b1c570 41f0947b", + "c1ab9680 c22df4b6 423f019e 4243efde c2227ec3 41397d8c 4238783c c1c5d26b c23228e6 -> 4243efde c2227ec3 41397d8c", + "c19c1421 40a94890 408e19a0 c2457773 c134641c 40f32b38 c1551a08 c1651588 c2290937 -> c218800e c143937b c0fe60da", + "c1153f8c 40c001e8 4125c04c c1aff018 418af6d0 41b9b90c c1aff018 418af6d0 41b9b90c -> c1aff018 418af6d0 41b9b90c", + "41c2e554 416ddbf8 4229c488 c2143ff9 42269b9c c1e123af c2143ff9 42269b9c c1e123af -> c2143ff9 42269b9c c1e123af", + "414325e4 42251a7a c136fe8c 41f7c5dc 41dc1334 41f304b8 423fbc82 c0023880 4193899c -> 41f7c5dc 41dc1334 41f304b8", + "bfa17680 41da40f0 c1995d4c 4225f1fc 4243fed2 40522090 42226004 bf976a40 bfbbbda0 -> 42243602 41c4fa22 3f79d1c4", + "c1e8a176 41b46904 c0764c90 40172d10 c1931711 c15d6d20 41a09b00 c2362362 c23a575e -> 40172d10 c1931711 c15d6d20", + "c02d0700 bef67f00 41de3ef0 c1973720 c163b9c4 c06dd8f0 420da18c c09307e0 423c7a42 -> 40ca590c c11c1972 419f29c0", + "c234e848 bf507780 40e00b60 40696370 c19f691d c1f4c224 40696370 c19f691d c1f4c224 -> 40696370 c19f691d c1f4c224", + "420a0a16 420712a6 c207cdb0 40d49710 c16581c4 412d290c 40fe1828 bf246280 c10a6c70 -> 40fe1828 bf246280 c10a6c70", + "c073a110 42081312 422ddfe4 41174c60 421e94f6 c09c05e8 c14a7e88 40b70368 402dc610 -> bfd0baa8 41b51488 bf88eb04", + "40d88410 3ff850c0 c099f800 c2300d87 4244e14a 42460100 42338bdc c1ddb141 c2172a76 -> 41171084 403d8c10 c03f2f90", + "c12ecb4c c16461d0 c179483c c194e600 41ade244 c209ccea c1f8c2e7 c02ae360 c1f24184 -> c1f8c2e7 c02ae360 c1f24184", + "c15915b0 c20d9240 42370c96 c23e8005 421d6c8c c2475b74 c23e8005 421d6c8c c2475b74 -> c23e8005 421d6c8c c2475b74", + "41c6d630 418b6eb4 422dddb6 3f6d1480 419d064c c15651c8 3f6d1480 419d064c c15651c8 -> 3f6d1480 419d064c c15651c8", + "c237c640 c18b70e2 c136b96c c243a470 40ed8cc0 c15d85c8 bf7a59c0 c165916c c14d9c4c -> c21438cd 40027a9e c159964b", + "c22fcdea c21e219e becd7000 c220281c 4216e1f4 41c0c3bc c1c2d56e 42200e94 c15ffb44 -> c2068eaa 421aa040 4108d577", + "415119b8 c0fae9f0 40c5af88 3eae3380 c2057a12 42443cbe c244e9e6 c1c5ee93 420ebbd2 -> c028e23d c203671b 42410591", + "c21af1f4 c1403988 41e26be8 c14a5638 415f569c 41e226dc c1269d94 421156fe c224ffdb -> c14a5638 415f569c 41e226dc", + "41502e7c c1bc3aa1 c1b8e868 40abbad8 40569610 406d0e70 4230edac c118a83c c1efc3f5 -> 41d609ab c06f8a08 c16d3dba", + "40eee430 407c8a50 4209d5a2 42131e04 bf4a8c40 41db518c 41b8b044 413e5bf4 41d32340 -> 41b8b044 413e5bf4 41d32340", + "bd00b400 42472e7a c07fdc20 422eb066 41594724 c1d1e439 422eb066 41594724 c1d1e439 -> 422eb066 41594724 c1d1e439", + "3faab7c0 c21f0b12 c12b06d4 414d4f4c 419080f0 c18eaf26 41f513a8 423bf306 414ed418 -> 414d4f4c 419080f0 c18eaf26", + "c177d31c 3f2ce500 412500a0 c15f3b84 c156710c c20ae90a c15f3b84 c156710c c20ae90a -> c15f3b84 c156710c c20ae90a", + "c1e99233 40ea2b38 4061bfb0 42439dce 421894a4 42122ce2 c1c6917d 41dd8338 c2203aa1 -> c0d6d250 41f20ecb c1a9f1b6", + "c2390eed 41537490 41f3c0e4 c20bb042 42272590 c1a34903 410d5b94 c1bea59a c226d27c -> c203f403 421b8c01 c1aad070", + "42389a54 41d6a568 40deacf8 41959090 41d45230 c220687d c1dd788b c1582e70 c057ff80 -> 416aa9c6 41b87c5e c213a54f", + "c1fbb99a 3f8840e0 c2196628 c101e668 c0e01970 c23aee5f 421a97a0 c231f194 c20ddb83 -> c101e668 c0e01970 c23aee5f", + "c1a50e26 41817d60 421b6442 c21718ad c1bec307 c18b9960 41130fcc 41b6a7f8 40c41a58 -> 3e85ae80 415f4e12 3fd28db0", + "40012a50 c157765c c1dd1696 423f59b0 41cd68ac c1cbf33d 4221928c c0c0de60 c2469038 -> 4221c01b c0bace48 c245fc72", + "c1977cd4 41907df0 41b0a5d8 c1900941 423e7d60 421ac2de c21bc7b5 402af0c0 3fc86980 -> c1e5d11a 41c4d71e 419d7202", + "c219774b 42384632 c0eeb1a8 c1e7e9d5 c1a9b4b4 40548780 41f43d2c c1a048b7 4217ee70 -> c1e7e9d5 c1a9b4b4 40548780", + "41f2e234 bf9b3520 4181a424 421e3e18 414572a0 bf041040 3f9fdf80 420000ca c1aa655d -> 421e3e18 414572a0 bf041040", + "c233615c 4202291e c20d960e c184c692 419885a0 c0aa6498 c2420e46 4134e7d0 42306bc4 -> c184c692 419885a0 c0aa6498", + "c1e5dea2 c16e1f2c 41986818 c246afad 40caf9e0 c22deb19 c2148254 40be6398 422ff89e -> c221cc81 40c1b909 41a699e6", + "40bfae20 c21cce51 419d3d70 41e2fdd8 423ede8a 4126dba0 c226ae3c 42011b3e c2409318 -> 41104ece 422dcd89 c0b8328c", + "c1d03c8b c1feb2d7 3ff908c0 4065c7c0 c14bac34 c1a790fe bfeac580 c1a740d1 41fbb87c -> 3f3259a0 c188bb7e 40e06514", + "c1624080 42169e1c c1864246 c233b1d4 c0efdf90 c1f636ba c1ae41e0 c09838e8 41ede498 -> c20ea5e1 c0cccb2f c0d1dc2c", + "4218082c 3ea73280 c165074c c0c4ce60 c231873b 4235328a c0c4ce60 c231873b 4235328a -> c0c4ce60 c231873b 4235328a", + "4183b8a4 c1a6ec4a c1f65309 421abda8 42316cf6 c214759a c117c2e0 4150ed80 c1b5b08b -> c0a9a1f8 417c6cc4 c1bfb2c9", + "420bc1d2 41c18414 42071e14 4202332c c23b95e6 4204aff0 421baa72 c1621484 41e3f3d0 -> 421baa72 c1621484 41e3f3d0", + "c210a90a c1f0a2de 41516384 c1cb71f1 4192af4c 41dca5a4 c1cb71f1 4192af4c 41dca5a4 -> c1cb71f1 4192af4c 41dca5a4", + "c10f42ac 41bd26ac 4201e868 41001ad4 c001c480 c1007658 4235b490 4073cdf0 c2072acf -> 41001ad4 c001c480 c1007658", + "411c5e60 4235609a c1cb3a87 c20c0014 41cf88a0 c1d5a4db c20c0014 41cf88a0 c1d5a4db -> c20c0014 41cf88a0 c1d5a4db", + "4233307a 419d4854 c1e14aa0 41ba2928 c1c71615 414123d4 42445dba c20e2c7b 40e62228 -> 4200b6ab c1e48044 4126347b", + "42443370 c05d23f0 418061f4 420844e2 c1ed33fa c204e5dd c24239a9 422a2b90 c1e74e13 -> 41e115e1 c1c3bdad c203a8ec", + "c12231b4 421e0d42 c1ecf5ac 4210f866 c224602a c1eafc9b 4117c120 c21419de c215b2b3 -> 4117c120 c21419de c215b2b3", + "41ad375c c116f674 4233399a c1fa3b5f c1a63323 c0c858b0 c1fa3b5f c1a63323 c0c858b0 -> c1fa3b5f c1a63323 c0c858b0", + "c1e6bfd5 c100b994 4112ff48 c2290788 42196288 c1beedf0 4113ddf0 41c89d1c c14f7510 -> c1521f0a 41f6bbf8 c18d9d28", + "c22d7ff6 41054500 c23ccaf7 c2035e40 4193a458 c2206cab c2035e40 4193a458 c2206cab -> c2035e40 4193a458 c2206cab", + "c1de553d c232dcc7 bf384000 c1f28284 4165d2f8 c2360cbd 41354834 42107798 c24079c8 -> c1f28284 4165d2f8 c2360cbd", + "c09c0c60 4107c434 3fde84e0 c138782c 409af390 41d4e230 c2244aef c2139c32 41834510 -> c138782c 409af390 41d4e230", + "42355d90 41f4f830 c20e414b 4247b8e0 c0b6c9b0 be8ffd80 3ed39180 42241e1c c23bad33 -> 41bfc5fd 41965522 c1c5d845", + "c11c5374 3ffb9e00 41d19b48 c23032bd 41264440 c1bc9d34 41e67514 c23e2ac1 c12ef1dc -> c1633fa6 c1557638 c1932e2a", + "40e9ccc8 4213422c c23666f7 41aeee78 411d3824 40bad020 4227a448 410ac2cc c20521fa -> 421d8404 410d1799 c1e2bcfe", + "c159b5fc c239af1a 41cb2fe8 c0a46dd0 423ecaf8 c0989470 c2236a4e c1069ad8 42236484 -> c2236a4e c1069ad8 42236484", + "420424ca 4237b8f6 41e0a1c8 417ef248 c2389557 41a267e0 c159e82c 422ca184 4201236a -> c11bc5e6 41fb626e 41f5add6", + "41c0408c 42322b4c c11e54a0 4136b738 4210e684 c22e202e 4229a66c c225e49d 41d1c61c -> 41870ea2 41b43f5e c1f9e690", + "41c2802c 4103821c c226fdb5 c2081ebf 4225be28 4226f670 42201ee4 c1559708 41d489f8 -> 41e741fa c0a3e1c8 41e6c50c", + "c2198f46 41b90dec 41901924 4138e3b0 41f9614c c14c7afc 41b66a74 41360290 c2250eb8 -> 4138e3b0 41f9614c c14c7afc", + "41d31a94 40a981b0 410a2f0c 41cfd7f8 41415dfc 424302c2 41a99a5c c102632c 41579838 -> 41ac7b1e c0d40b34 4181098a", + "4175d8f0 41c70688 41c3fcd4 4213cb2e c1de2367 c24585b1 4213cb2e c1de2367 c24585b1 -> 4213cb2e c1de2367 c24585b1", + "414eb518 c139c760 4246ebb8 4237f3da c1c97778 4216b6aa c1ea2b04 41f1fa54 bf7eaf80 -> 41cc9f21 c122683e 41d9855c", + "3f143000 c2096874 c197b470 42336f18 c24466b2 c1bbc28f c24708ee 40789c20 422abb64 -> 415f61d4 c1fe62aa bfef1550", + "c203e8dc c0c14c78 bfe90a00 c20a96da c1f7e040 424654c2 421e79ce c12ad584 41f46cac -> c17a715c c1ce5327 4232dcd5", + "40bcc2d8 422e263e c000f0a0 41aed608 c1544a24 4242888c c085dff0 c14688b0 4145af1c -> c085dff0 c14688b0 4145af1c", + "c221797f 42397c0e 41a267c0 4200a63c 40b51658 41c8661c c2146ab2 41aa6744 4224c884 -> c2146ab2 41aa6744 4224c884", + "41fe860c 423b0b12 41d7c7f0 c244afcc 4171fca8 c1e80cff 41a53f0c c1f85255 4220d678 -> bfb4ca20 c1839a87 4192ad2b", + "4246c6d2 41d9347c 41020688 c1bb90f2 c1b83a8e 41fb3fbc c1bb90f2 c1b83a8e 41fb3fbc -> c1bb90f2 c1b83a8e 41fb3fbc", + "40eade68 407e6190 414a64f8 41a50cbc 40e15400 418d4d30 c21dead8 411b196c c0c11970 -> 40f1cc42 40f3c9f2 4148218e", + "c189219a 41247b84 c1fd73a8 421fce40 c1eac9d2 41bd4524 41edcc44 c22d1425 c2090c0a -> 41f71b34 c226be40 c1dd5fe8", + "c1d9fd17 c23bd58b c1b925a6 c204ba78 41123520 c205bdba c1632f04 40a61c10 41c205d8 -> c1e36a9b 41026376 c197e177", + "4190463c c0a9ef08 40bb5670 41cad874 c18c2778 c13c1650 41cad874 c18c2778 c13c1650 -> 41cad874 c18c2778 c13c1650", + "c1a448f7 41aa5bbc c14eed20 c1812692 c0495e50 c23e1a14 c16b7b00 3b8dc000 c0965de0 -> c16f1ced befe8f90 c1384110", + "c185c476 c1f03e9e 41a35cc4 40eb3a28 4182314c c2256373 420dcb3a c21a06eb c1185f1c -> 41eddaa3 c1dae38e c17ff81c", + "c20aee1d 40b74df0 40aa8d30 c0a2d6e8 40898ac8 c1b70e28 4194e130 40ef0fe8 4201a0ac -> 3f0a3580 40a1a764 c11c01b0", + "c20d46de c20eea9c c18907f4 c231808e 4218ad14 c2364bed c231808e 4218ad14 c2364bed -> c231808e 4218ad14 c2364bed", + "42063b20 4215e034 40426070 42111872 c08f42b0 c1df6edf 42202016 419c3734 c05d90a0 -> 42202016 419c3734 c05d90a0", + "42376cc2 420257e6 c1866dea c1106b60 40ac5c50 4140f784 410b9fa0 41ec76bc c1f21da0 -> 410b9fa0 41ec76bc c1f21da0", + "3fd02940 41665a40 41de7e84 4214d408 41bde390 c20823c8 c1252cb8 41997464 413d924c -> c1252cb8 41997464 413d924c", + "418150e4 40c3a9c8 c12131c4 422fe36a c1f7ef3e 421464aa 40dd68d0 40ee2770 c242f4ae -> 41a30c82 c0d0b058 c18c6bda", + "c224d551 c0b10dd0 c2131af2 c08dffe8 c1c61c65 4210ce24 421233ea c1d7b0e9 409f2048 -> 40d9ba6e c1caeeb7 41dd1788", + "c213752a c203ce19 c215d956 421c317e 40be89c8 c17497e4 41a38e8c c1f6b6e0 c2215f0c -> 41a38e8c c1f6b6e0 c2215f0c", + "c22948fa 402438c0 c1e04672 420dc244 c101efa4 c1e93439 4237956e c12421e4 c0eadd40 -> 420dc244 c101efa4 c1e93439", + "41e26018 41c16258 413f88f0 c0c73bd0 410755ec c242dd05 c22b4e77 c22b5cfb 3f963040 -> c13a7363 3f5a1228 c22545ee", + "c20f29d6 41b6662c c13fb738 42019b24 41f85fb4 c20572ba 41bfb3a8 bf625cc0 c0cd8b88 -> 41cea21c 40c5b290 c1461a48", + "c00dc060 c208b6f1 c2394414 c21e87e4 c1f82d84 c143ddd8 c21e87e4 c1f82d84 c143ddd8 -> c21e87e4 c1f82d84 c143ddd8", + "c0a20e90 42460eae c04c39e0 41e42e3c 40c73920 c1dbfd02 c21b347e c19b47fc 409571f8 -> 40f38e94 bfde56b4 c18c0d97", + "c1c7f9f2 c1dcec2d 41549104 40cd4fe0 c1309958 40a27d60 c1b5f464 c2366d97 c1c6125f -> c0be2e82 c1cd8394 c0f22da8", + "c1454650 42314d0c c04e11e0 c22d7046 c171f040 c20dcea7 c18da78a c1c9a170 c1ea661d -> c1f542f0 c1a0e899 c2019f6b", + "40f2b290 c223f37b 3f729900 405ff000 41479bec 41a3ea84 c22f0cad 42038c78 c17c321c -> 405ff000 41479bec 41a3ea84", + "420563f4 c1b0f742 c16fff54 c15bd7b8 c23bf559 c0f94760 c1fb68f1 4217ee34 40b627e0 -> c1839ec5 c207d526 c0b71d0c", + "41e38a38 423efc30 c0cb6690 419e2af8 c1ebc3a8 c21a495a 420b5312 3f1c4900 402efcc0 -> 420b5312 3f1c4900 402efcc0", + "c22070ef c24350c3 422fc300 3f24da40 bff520e0 42119c3a 423df95a c208097e 41ab7f0c -> 3f24da40 bff520e0 42119c3a", + "41a13de0 421becbe c2397aed 41e50578 413bfeec c0b43550 c1966534 c220d5f3 41153380 -> 41e50578 413bfeec c0b43550", + "4198d494 3f6ddd40 c1883e56 402f8000 41dcbae4 c0b60fc0 42283026 411d6888 4175e560 -> 418dbc82 41a69e84 401557f8", + "c19ec6a9 42066010 4218b31a c222eb66 42474e72 40b41180 c18d6ffa 4200b4b6 c1807d44 -> c21e91c1 4243f9b3 409352ba", + "c205d151 41d88480 c227ea40 41843784 423a2d86 c23daafa c10ba128 421dd85e 4230771c -> 4133d844 42343f1b c1e209f7", + "42252444 4247f7ca 41b86bec 3f799480 c21e179b 41c8520c 3f799480 c21e179b 41c8520c -> 3f799480 c21e179b 41c8520c", + "c0e36ab0 41d36884 c1458320 c202ce11 410f5e6c 41919cd0 4142abac 41e66890 c22f8275 -> c1065c64 419da908 c176cb7c", + "421416a6 41259368 bf79d400 c20f2355 42123ee0 c244c65d 422b311e 40c653d0 41c810d8 -> 41d9482c 4143d72a 4123e014", + "40d9dff8 c220e760 c23da839 c1b1e14c 4228280a c0e2f248 c20e6cfa 42432c36 c1c9b526 -> c1b1e14c 4228280a c0e2f248", + "42099a2a 42453c7c 41bae0d0 416577b0 c19eb63e c21dd5e7 42242eb4 4220677e 410e393c -> 42242eb4 4220677e 410e393c", + "c24067cc 413f20a8 4096c6b0 3ffafb60 408c1e20 42410df8 c22b9f8a 42228178 41373ed0 -> c2163855 421136d0 417d7c7c", + "42402d8c 41d0132c c1c5ec36 4244c058 4241f324 c0c69580 c21a6d97 c1870bea 41beb8f8 -> 422924c7 422d64f0 c075ff3c", + "408076e8 c1038188 420837ca 41af7864 c15c5768 4155fad4 c2066087 4216da28 4213f470 -> 40ca356c 3f34d1b0 41a01d76", + "423d3c2c c1d79ede 41bb172c c16f3678 420b39fa c23d3661 c10fd9f8 423373d4 40a1fe50 -> c10fd9f8 423373d4 40a1fe50", + "c14a8dfc c1c335d4 417dab20 c21046f3 410a0a3c c1d1dce7 c2160373 c2266f6c 41c06530 -> c2148632 c1e487f4 412febba", + "c206f4fc 4213d21c c209124b 40e9d428 c23dac1b 40fda550 c0b80730 4121e254 41df20c0 -> c0b80730 4121e254 41df20c0", + "c23972f8 c1bcc55b c20e79a4 41e5881c 41b1fe84 c1f4f365 c060edc0 41c7f9f4 c23d81fe -> c060edc0 41c7f9f4 c23d81fe", + "41e07484 411e8db8 c212c65b c194205c 41c858c4 c205e16c c194205c 41c858c4 c205e16c -> c194205c 41c858c4 c205e16c", + "423ec03a 415860ec c227f11a c1bfbb96 c1acac73 41cf69ac c1a28c28 c18c4304 c1b8f55c -> c1a28c28 c18c4304 c1b8f55c", + "42018686 bef28300 41f721d8 4211be9c c21e95ee c22abd24 41d2f778 c10518d0 c12c0efc -> 41d2f778 c10518d0 c12c0efc", + "41a08284 c121e650 c14801b4 c1eef6f7 c21c40d2 c21b2146 c1eef6f7 c21c40d2 c21b2146 -> c1eef6f7 c21c40d2 c21b2146", + "41eef4d0 40cb3ca8 41bd30ec c0ede9c8 42010e22 42103550 c0ede9c8 42010e22 42103550 -> c0ede9c8 42010e22 42103550", + "41f1a050 c20b542c 4163c170 416f8b68 c208aaad 4208c3c0 416f8b68 c208aaad 4208c3c0 -> 416f8b68 c208aaad 4208c3c0", + "c2229515 c15de3b8 418d7440 41bfa63c 422fbed6 4216010a 41ffa9b0 42309b76 42463b20 -> 41bfa63c 422fbed6 4216010a", + "42295416 c20b9cf8 c20334f3 c241417b c1fe2cb9 41c07ac8 c241417b c1fe2cb9 41c07ac8 -> c241417b c1fe2cb9 41c07ac8", + "41a8c994 c0254370 c0656d30 40f9ce70 c1bfceb0 c23f03ad c19f51f3 c154b994 c237d241 -> 40f9ce70 c1bfceb0 c23f03ad", + "c153b2d0 41333fa0 41db92e0 c2025c54 c18274b4 423acd2c c074e990 c203ffa8 c1d244a1 -> c1cef669 c1a1a78b 41ed3237", + "420e1b16 4129b7bc 421872ac 412b595c c23900a6 419e8ae8 41e177c4 c13e083c 42465b12 -> 41e177c4 c13e083c 42465b12", + "41e2a058 c1dcd34c 421c932c c21c3ef8 be002d00 42428a46 c1761834 c1bbb159 c01ea580 -> c1adc932 c189b108 41335fd0", + "415a3180 c23cac30 bfde19c0 c118277c 41ea27c8 4245b576 414c9f54 c118458c c1137f30 -> 414c9f54 c118458c c1137f30", + "422ded5e c09b1618 4081d3a8 c1178084 c075d520 424062b0 c2051ec4 c21e0925 4114e474 -> c14e925a c10ff30e 4229f504", + "c14e25dc 422c6cb8 418c47b0 411ebbf8 41969e10 4227d916 c1fd05ff c20e830d 41b0797c -> 411027ea 418d1064 42261a28", + "419bd560 4204e790 41fb84e4 c20a2a9a 4243a392 c1f2ebd9 c20a2a9a 4243a392 c1f2ebd9 -> c20a2a9a 4243a392 c1f2ebd9", + "4222a462 c1d25b49 c144caec c22f46ec 4202c746 c216a144 4110ecd0 416c7968 3fe3a460 -> 4110ecd0 416c7968 3fe3a460", + "c1888012 c09769a0 c1cef9d1 c2336317 c1869a22 4192b7cc 421666aa 41ad4e34 42153ace -> c1d45cb0 c1048191 41b466c0", + "c2132c2d 41e8a294 bfcaa3c0 4144fbbc 41a43f50 c16b4024 c1c56a66 c1060ecc c1bbcecc -> c1344d8e 400674a8 c1a25dff", + "be87b700 3cd10000 c17f9824 c1ab1001 c21efa32 415b6b2c 41952974 c15c8d78 c196fc7c -> 414bc186 c18cf11c c160fc0c", + "c208f94a c1a0c312 420cca12 42327b58 41e076a8 c1ad6346 c12e0cec 41a18534 41c640f4 -> c12e0cec 41a18534 41c640f4", + "423087a4 c0ffa868 c1659a50 4019bdd0 41ff0808 c219bf8a 42448aea c219ace7 41ca4ef4 -> 41e55c0c c0f447a8 c0279480", + "c13be900 c1d6b5b7 4233971a 419a36c8 41b025e0 c2024118 c1fb2958 4203a5d8 c21b072b -> 410dd117 41c20e98 c2075868", + "c1176aa4 422abf76 4209039a c1c02a0e 4242597c 3fb14120 c1f3ad7b 4205355c 422f8738 -> c1e2a6e2 42196a92 41eeb08d", + "4186b7a4 41c0f97c c050c050 c23e762b c1a595c8 40a44190 419ca64c c2291a61 c20e7f4c -> c121eee8 c202f3ce c18cdf05", + "412ed49c 413d9974 c1db2f2f 421282a8 42440d36 40e20d08 4220489c 422a6190 c16fe294 -> 4220489c 422a6190 c16fe294", + "410f2718 bf994fe0 407425f0 c2090e12 c1b4948d 40c6b770 41a83640 c24237d2 40f83ab8 -> c0e56744 c20d3847 40defaf0", + "c201341e 41b73b48 c12066dc 422dc820 c1b123e6 c208aa72 3f18c500 41622408 41d36250 -> 40675ae0 413941d4 41b13de2", + "41944a48 c1cb13a7 c1b84478 4238d1c2 424784fe c21c7a4b 4221d4e2 41e57df4 41a0ae1c -> 4229374e 420dfa65 3f8884e0", + "bfda4000 41e12a94 41c7a834 c1d2f1a4 40088ae0 c1b8709f 4238be6c c1ffb35c c1ed8b44 -> c19e9429 bf714d7c c1bd3b19", + "bd06e400 c1e88eda 410c5270 c2070600 c1b2ab8f 419115f0 c12a2900 42181782 c1e0ffd8 -> c1f66fdc c16a12ca 4143b16a", + "c2074f98 c1332998 c2089310 c2312255 c21fe6a8 c1c080ce 4216b1ca c17ab198 c1e15087 -> c1d33eda c20ab12f c1c7a917", + "c1951dc1 c17dff5c c10b0238 c216d57c c11f6ba0 42295c26 c216d57c c11f6ba0 42295c26 -> c216d57c c11f6ba0 42295c26", + "41871038 c1ea675e c18b867c 418c4f1c c12725a4 423fc98a 4122dca8 41944f14 c1920bf5 -> 41441bf2 4125adb6 3edf2180", + "c0c6cf18 c23f5de5 c23e42a0 412e9db4 c0193700 417d8648 4165e590 c211922a c1be6dd4 -> 4165e590 c211922a c1be6dd4", + "4106905c 420dac64 413dab4c c21ce8b6 c2220799 4144a16c c227f026 41d1a9d0 c16ac7b4 -> c2276d9b 41b8fc8a c156d56e", + "40fb7208 c2096fe5 42473f28 c153989c c208a1e3 41ecf244 409fbfc0 420c115a 41dbb92c -> c141017c c1edf7de 41ebd90c", + "420872ea 40b444b8 c11eeb18 420070f4 40bfc9f0 41a21c20 41e06340 c21f7797 c1466120 -> 41f6bd40 c105260a 41211759", + "c20b89a4 42208f12 4100bc98 c1678b00 4187ef78 c1ebdb58 c1276a30 41fbb770 410d85f4 -> c12786d6 41fb83b8 410c7404", + "c1864d12 4233e02c c09db580 c15a474c c16304d0 4207e242 c2280cb0 c1aed3fb c23e9d0e -> c1c1e806 c1886948 405f0c90", + "c15dbb00 c0bd3ef0 4098f058 c2169098 c240b912 41ead014 41e16ae4 c23ce480 c094c6b8 -> c105e210 c23f04f3 4163ab46", + "c1364b44 424730d2 419e443c 422d78ca c1fec614 423f8770 41680b10 418dbe5c 40f307b0 -> 41680b10 418dbe5c 40f307b0", + "c1bea049 c10e465c c06cdd90 c1db9e26 3f0a2140 41bc3880 c14f2d9c 421c92be c21dc0ba -> c1bee288 41219682 40fdeb6a", + "c228da88 c1c60f5e c182535a 41b0a398 4127fae0 bdc8c400 42098114 41a83c74 c16a3be4 -> 41b0a398 4127fae0 bdc8c400", + "c15e2dc4 4177a2d0 c1fe5d92 c1f97664 424458cc c153d830 c0945770 c184aeb8 c1c683e4 -> c182af37 4145b944 c19db521", + "41a46a18 41ee640c 413d1b8c be813c80 c23a0f56 c11baf7c 404b82f0 423422d6 423f25fa -> 400b9c36 419337c8 41f870f4", + "4228dc38 41ba2abc c1890bdc 4203070e c23f4a41 421c22b2 422061f8 c2128b22 4180b500 -> 422061f8 c2128b22 4180b500", + "c18d23b0 c1338f64 c1d44fbd 4200926c c21c354a 422de48c c149613c 412b1ca4 c1d8c59c -> c104ff44 40be1e08 c1a2d3f4", + "415f52c0 412d0700 4194c244 c2268534 c1babc2b c239740b 41eacd20 c1b0191a 4156c5bc -> 41ba0a5c c1b102ef 4104a148", + "41b9f07c 40269f80 c20570f1 c232545b c178a1f4 421d5e3c c232545b c178a1f4 421d5e3c -> c232545b c178a1f4 421d5e3c", + "bd408800 c00aa9d0 c18fff9a c0ae9230 414d7cc4 c18b22bc c0dea2f0 c13334bc c21ff3e2 -> c0beb7e9 409880c0 c1c7dd48", + "bffaf5e0 422382fc 4229f106 c2285a06 c191ce34 40cacf18 421dab30 40c32920 424229ca -> 41644444 bfb41e30 420e1267", + "c2157085 421b9ac8 4141ba18 c1c763fb c194cb0c c2354bc4 412abb6c c0145170 c1e3270f -> 4070fc38 c0af3c62 c1fd6d88", + "c2125df8 4199e1b0 41c49100 c1ee2767 41ee0860 c1dee5d0 41b79aa8 412895a0 4232a1b6 -> c0dd43f4 41ab625d 4064e078", + "41095410 c216bb62 c01b2560 c15b08bc c1e8ade3 c1dfe224 c20a76e3 c20dd758 c1006610 -> c18067a9 c1ee6efe c1cdde0c", + "c1ff3576 420be816 c2136cc0 c2032768 42074d10 423a04d4 c1f041b3 4130d454 420ee6de -> c1f041b3 4130d454 420ee6de", + "c20339a7 421f1fd2 c1aebc6c 42003cc4 c22d60b7 423570b8 42003cc4 c22d60b7 423570b8 -> 42003cc4 c22d60b7 423570b8", + "41666200 4244b850 c1a8f471 c0e24128 41e66ef4 c206c584 4143afe8 c2375b0c c2227474 -> c0e24128 41e66ef4 c206c584", + "4221d4f6 c17716b8 c0779cd0 c07a0c70 c246b523 c10acb84 c07a0c70 c246b523 c10acb84 -> c07a0c70 c246b523 c10acb84", + "c237d82d c1ac8c1d 40c2ecb8 c2366c20 c1598310 4204ff5c c22786a0 c21867c2 41c67d14 -> c22d3a0b c1e5c7eb 41e052ba", + "c234b76b 41966a64 4208a2d4 c2159b0d c1a2c2f0 c1c38f54 c1aa3c96 c156b974 4240ee2c -> c1c593f8 c16e366d 42034d7e", + "c16efa60 40bbca60 41f68648 41dc9bf8 c1ffbf71 409e3a40 41dc9bf8 c1ffbf71 409e3a40 -> 41dc9bf8 c1ffbf71 409e3a40", + "423511e8 c01fd8e0 41286458 c217b444 c1f2d76d c1f23013 c214cd86 40580960 c0a2ec90 -> c214cd86 40580958 c0a2ec90", + "42479cf2 40c8f8f8 42152014 c2319c04 c20e0216 c1da4c3d bf9430c0 c18b651e 41e4d93c -> bf9430c0 c18b651e 41e4d93b", + "c23a74bc 413bcd00 423fe8ae c235bd09 41da540c c20757f7 c1aef321 42117398 41fbafe8 -> c1aef321 42117398 41fbafea", + "40155e40 c236ae31 4219e516 bfe84160 bfea2f20 c0189320 41ec5944 41718a08 41990ae4 -> 4041380e 3f478548 3f6ea734", + "c12bfe68 c18d4442 c20f1c34 c1618fd8 4228161c c20a4b64 4241513a c1e5a244 c199ff97 -> 41806bb1 40fba020 c1d961b6", + "c23f297b 4244c4bc c173792c c2447ff5 4210e2ec c1d5a84c c2447ff5 4210e2ec c1d5a84c -> c2447ff5 4210e2ec c1d5a84c", + "c2157ef1 41385774 c1bc823d c206a34d c183c2b0 bef31e80 423ae47a 40edaba8 41870e38 -> c206a34d c183c2b0 bef31e80", + "42346fcc 41c43538 4206fbf8 41a307f8 42364b22 418e7410 c0e97b60 c215d324 413dd5b0 -> 41872afa 420c7f22 41887893", + "420870ec bedc9980 c22ca86f 41d74f48 41a85acc c01f08b0 41f4afd0 413f6c18 c1c8faa6 -> 41f4afd0 413f6c18 c1c8faa6", + "420bf8d6 41cea728 c07f2060 c092fdb8 40491280 419c6034 40d02318 41c30c5c 41795ce8 -> 40d02318 41c30c5c 41795ce8", + "c02a3500 c0d061d8 c23cf9e8 c0cfa028 c0ef20a0 41c750d4 c165be5c c1bd3522 c23e190b -> c15cef6e c1b4279f c229d4a4", + "41b75894 c1bb76c4 c0968588 411d8f6c 411817c4 421297e0 4176a358 4150e908 4095f250 -> 4176a358 4150e908 4095f250", + "c18b9a70 c1e4325c c2030d2c 41a696fc 422550b8 c173da34 42034132 c1f5c791 c1abe6bd -> 41fa2efe c1abb5d0 c1a57abe", + "c042a5f0 c1fd2d1f c179d128 41916674 c22c3c64 419294d0 c2474d3c c1160b60 c04bf4b0 -> c11c65c0 c1e9b8aa 4117b532", + "4117d048 41707b48 420f9a58 40562bc0 c1f03a0a 408793d0 423a83d0 4106d0e4 c19bb774 -> 41892fbe c18e20c1 c0548d2a", + "c1f2703b 42330bbc 400bb440 411ffb1c 3e1fea00 422dca22 411ffb1c 3e1fea00 422dca22 -> 411ffb1c 3e1fea00 422dca22", + "41d5d620 41a56748 c2068bce c0f452e8 c1c11444 c1bdfe1f c17b3110 403a03f0 4224bb8c -> c101b198 c1b4738d c19fabac", + "bf556b00 420f5c6e c1c9a8a4 c124f700 409216c8 4228b8e6 c242a471 3f5a2080 c14e870c -> c216f8ee 3ff45e72 40319210", + "3f3e6300 c1a4d191 c1cce60c 41ca2ac0 418c27ec c166ce18 41941bb4 c1ffd960 c2120686 -> 41a07f2b c1a518f2 c1fb919d", + "c1bb0d86 4070f570 41c279cc bfafaf80 400c9e40 41815c58 41a0ab48 4202af18 c2399137 -> bfafaf80 400c9e40 41815c58", + "4232dece c1b991f0 c0fdf840 40cccd68 c1c67f52 c217816d 41faf3e4 41c144b0 c1c51789 -> 418cb1d6 c037cf58 c1ff8e7e", + "c20ba2f9 c18c05cc 41c6c358 41d9a12c c1fd275a c0c2e630 41cc0ec8 c02ac270 c06d9570 -> 41d0358c c1388104 c08e1270", + "c12964ec c0ee37c8 4215f85c c1b30780 c1a56a1b c206df94 4178fea8 42359afe c219e077 -> c17fa0e0 c1186f78 c20a1472", + "c0306460 41f58920 3daa1400 c21e5089 c075c190 c1faa713 c112494c c1d07af7 42155640 -> c1d8fe02 c14eec0f c04ee6b8", + "422a9f14 c15b5c70 c19dd39f 410246a4 c22a8200 42316b84 410246a4 c22a8200 42316b84 -> 410246a4 c22a8200 42316b84", + "42081382 c1322cb0 c1d9fc67 3f8a24a0 42307c24 41e75b54 41cfe510 c1b7628a c2246015 -> 41b0df32 c147c278 c1f18c2c", + "406ac4b0 c2454459 420fdef4 41b5af9c 400a5c70 c12b054c c20c3b3b c197a6a3 4246bfde -> c181a328 c1410747 41efdd94", + "c1f4676b bf111200 3fc89be0 423aa980 c1799e24 4201a810 42189500 c1ee037f c1708244 -> 4220e3bc c1d26b0e c05dd4b0", + "41e9a364 c14af1e4 41ab870c c1d2fd51 c23b821f c216dd2a c1b3e7f2 41ac7548 c1d4bbcb -> c1be459e bfa1dee0 c1f26972", + "c10d2b84 4202bd94 421ac7e6 42012406 41aa0e60 40675d50 c182ac1a 40eeb010 c1e4c1e9 -> 41b547c0 41943412 c030bc50", + "c19b5359 c21982d6 c2054752 c1922e98 41ddb49c c23303ca c1922e98 41ddb49c c23303ca -> c1922e98 41ddb49c c23303ca", + "414c10cc bfe19200 40b7a250 4117857c c176a0dc 42152ff4 420d1e94 419cb3dc c121f440 -> 41b27558 3fff5be0 415b6318", + "419be344 c16e24e0 c0d3aef0 4121b3ec c206973b c1a60fbe 4121b3ec c206973b c1a60fbe -> 4121b3ec c206973b c1a60fbe", + "c10c343c c153c528 412bcf48 c2026429 c1c4bb61 41f64544 c1bd58b4 c19a8203 42435f34 -> c2026429 c1c4bb61 41f64544", + "41fd9904 418ca910 c1eaea51 c23b0945 c082c7c0 423f81aa 40e05fa8 422bb43c 42090ab0 -> 40e05fa8 422bb43c 42090ab0", + "41381a28 40bcb458 c2139c59 412a77a0 c17f3da8 c209ed18 c1cbd247 c202bed2 c1ae4440 -> 412a77a0 c17f3da8 c209ed18", + "423e71a2 c2134583 4210dada 3ff5ad60 423a71ec c17abf48 41a3c248 c1da5aae 41bec7f0 -> 41a3c248 c1da5ab0 41bec7f0", + "40dca8a0 421b7892 c12a21d4 c1ed2227 c1593dcc c201cb8e 4102d9b4 422a1874 4236ddee -> c104e4e2 419092c9 413a5d38", + "4111fdc8 c0413530 42056b42 419c1160 c2161a54 c0f9eba8 419c1160 c2161a54 c0f9eba8 -> 419c1160 c2161a54 c0f9eba8", + "c2185125 c0f2aea8 c223ed88 c1f5c7ce 420d5c66 c1d2a9e2 c1f5c7ce 420d5c66 c1d2a9e2 -> c1f5c7ce 420d5c66 c1d2a9e2", + "c246eff7 4194240c 41faf354 c044e350 c22d7b31 c219a926 421d0e50 c17b1ad0 c1f75f76 -> 3f919bc8 c2227698 c216ad73", + "4109f750 41b51bf0 c205e100 415e6f0c c1ce254b c20603dc 42228e8a c1900330 c1e3397d -> 41adf302 c1bbec4c c2000802" + ] + }, + { + "glsl": "vec4 cultmath_power_border_step(vec3, vec4, vec4, vec4)", + "tolerance": "ulp-bounded", + "cases": [ + "c2201cb6 4200f3c2 c1b1be9d 410b54c8 c128e108 408d7b08 41710c8e 41ab9074 421ea468 c21b6137 4012362c c1a16188 41d296e8 c205860c 422a425f -> be413d59 bf3e74d1 3f241965 00000000", + "c1e5bf5e c21e543d 4215af36 41f1f4c0 41e158c0 c1d71b75 419864dc c0c7a098 c22a15f4 400d56d0 40eadfc1 00000000 00000000 00000000 7149f2ca -> 3edc866a 3f55a57c beafe11a 00000000", + "bfacaec0 42219a38 421afe4e beba7600 c134f4d8 c233d1c8 415a7e74 419f8658 c24415de c1e940c2 400da599 00000000 00000000 00000000 7149f2ca -> bee3ba52 3f537a09 beb12f54 421c02d3", + "c115acd0 418c31fc c1204480 41e3b5a4 41346d7c c19585c8 4180216b 41aa8ed0 c23e06c3 c19fc357 41924f71 00000000 00000000 00000000 7149f2ca -> 3df704be 3f7e1221 3cb10b28 41f6444a", + "c1ed93a1 421e4c24 41d66a30 c1e185b6 3f786780 c22f8f6f 410a0f17 4174c470 c0731520 c1e8cf5e 41352d0b c0e32a90 417f5c80 c222f352 414f601b -> bf7112d2 3dd37853 bea3f611 40a8ceb0", + "3c084000 c20d10f2 418e17a4 c1e1f51c 41cdc558 41efe8b0 419d09d1 c1e1f40e 41cdc5c5 41efeaa0 411ad947 c1fbec7c c205f9a6 c1fc83fb 41e36066 -> c1fbec7c c205f9a6 c1fc83fb 41e36066", + "c1ed42c7 41df99b8 4152e724 c23e95fd c1fcfea0 417597f0 4162c507 c22fe9b5 40c95478 c22379fc 40e216e1 00000000 00000000 00000000 7149f2ca -> bd5d4115 bf0eef08 3f53ee53 00000000", + "41a25b58 41c6ba2c c223d6bc c247c84d 41c9fde4 c1bf078f 410ffb76 414f1c64 c1b16403 40b192a8 41893402 c1ccde28 bf0bcf00 42234eac 420a27d4 -> bf3f7957 3f1061f8 beb330e9 00000000", + "41c61324 421a72d6 c1d7a6ea c1f1a046 41e191b4 40f18c18 41872932 c1f19e6a 41e191c1 40f18e1e 411aacf1 c20fa1b0 4238a7be c1183b64 423b534f -> c20fa1b0 4238a7be c1183b64 423b534f", + "3d43c800 c23b903a 40848420 c20fc493 422fefc4 c2086ac7 417ffa1e c0dd8670 c1ac46de 40653b00 411ea36d 00000000 00000000 00000000 7149f2ca -> beb78385 3f4f2a57 beee5215 00000000", + "4184be00 c0abeeb0 c1ed0db6 41f20fac 423c3618 4194956c 4141a913 41f20fac 423c3618 4194956c 4141a913 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "4226446a 41842e70 42400d16 c20777dc 4236241a 4210ea40 4189b4f8 41bf12ac c0789340 c149fa7c 40fedf97 00000000 00000000 00000000 7149f2ca -> bf239fea 3f0c04a1 3f0a697f 00000000", + "42458e18 41b9fb6c c1869884 41f7f7d8 413668b4 423ea230 402c48bb c1cf6652 409066c0 c2047a7a 415a9252 41dda6f4 c1efafc2 414b9174 421aa369 -> 3f131a67 3d8e6868 3f50c1fc 40eddcca", + "c2333b2d c0420040 c22aa046 4230c386 42327e56 c210496b 410c3587 bfd7cb60 c200af62 41818440 40976851 41f84454 41d80c98 422f30f6 419ae784 -> 3ee2b922 3f3dc26c bf012335 00000000", + "422669f4 c1ec084a 41ab049c 41ac89b4 3e211100 41d861d0 417456cd 42133866 418637b0 4206eb9a 415edca8 00000000 00000000 00000000 7149f2ca -> bf25df66 bf34eacd be917b57 41b1768a", + "4230c944 c1bdc489 c1c157f9 41c3d130 423ab152 c0def160 415d0ece 41ce1664 c1550f1c 3f30d980 411077c2 00000000 00000000 00000000 7149f2ca -> bcaddc6b 3f7de1d7 be01a279 00000000", + "c1395c10 4153d188 c1425f94 c1db02a6 c0b115d8 c151e94c 4157deba 41beb21c c1e6c164 c1d6bf66 412ea55b c208569b 420b4ffa c245e88b 4213c715 -> bf625d1b 3ece10e0 3e72a437 41ba984d", + "409d6dd8 419e70e8 c1bbf245 c18834ea c23c72d3 c1e31221 413f8782 4162e6e0 c1dd82dd c049a140 3f097890 00000000 00000000 00000000 7149f2ca -> bf332f36 bedf0c1c bf10e259 00000000", + "c209e314 c1b3b9cf 42221678 c21da840 41f60fd4 41034764 415b6495 421e9922 c106bfa0 c20af142 3fcf8681 412a9c78 c1223938 c1cf1081 41e4394b -> 412a9c78 c1223938 c1cf1081 41e4394b", + "c2079595 c206718a c1658238 40c06dd0 41ab5be0 421362ee 40d8b33d 40c06dd0 41ab5be0 421362ee 40d8b33d 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "c129bcc4 c0f75520 c1603e6c 41540538 c119a274 416f39d0 4189a064 41c4412c 41f5dcf0 c19351a3 4197535d c0f8cf88 41fe0a78 c16773c8 41cb49d2 -> be57b6e9 bf40d424 3f1f83a6 413c35a4", + "c1252888 c05651c0 4014c760 40925028 c222a604 41aadddc 40e1491d c1353ca8 41c90b10 41495298 3f8159c3 00000000 00000000 00000000 7149f2ca -> 3e6e8ab5 bf76c584 3e03a953 00000000", + "c1e5ec8a 41f324f0 c23fe69d c1e4f68b 42456a0a c183ecfe 4167331e c1e4f68b 42456a0a c183ecfe 4167331e 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "c23dd1eb c17eb378 c191cb62 c234f4dc c16a103c 420b3746 410479fd c234f3e5 c16a1026 420b3709 4196a368 00000000 00000000 00000000 7149f2ca -> bf787999 bcb10d0e 3e757502 00000000", + "42404dae c1dc7932 bf1e7880 419beef0 c23de91a 40e9bc38 419dee3f c232f059 c1ba4e77 c232c901 4113f145 00000000 00000000 00000000 7149f2ca -> 3f3ef35c be8fd57e 3f1a9a22 425f0a18", + "c1984928 c13f881c 41bb5330 c22950a7 40fe6b68 c1e78517 405f2fec c176b490 c0fc05e8 41b22378 41885f5f c236c613 413d8e78 c21b1e79 416ff31d -> bee5bb4e 3e871c91 bf5a94f9 00000000", + "c0acfac0 c213ea53 c20cfbd2 c22c1206 40dff3a0 c2452e40 416270b7 c22c114e 40dff2ee c2452d61 418a6cfa 407f7820 4212e998 c1fab0ed 41ed312b -> bf227264 3d9d2650 bf44e0e5 00000000", + "4188e484 4209a56e 41cfb908 41d32cfc 4240dcfa 4235d3ea 418c116b 41d32d63 4240dd8c 4235d454 41740bf4 00000000 00000000 00000000 7149f2ca -> be8c888f bf4733e5 bf10a06b 4749be47", + "41c8f40c 422a39fe 41a590c8 41a57994 420a5982 c187b578 41433288 41a57994 420a5982 c187b578 41433288 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "41d67ba4 423eb700 c239e6cc c1fdcb3b c23f91a1 c2290d12 4190c8f4 c15312bc 4220062a 422ad832 41825e24 00000000 00000000 00000000 7149f2ca -> be197813 bf35f9f1 bf2fec0b 00000000", + "c1ed4c39 4233b172 c189e73e 41dec568 c1f31154 c17bf794 41857731 c240573e c225a2c8 41a156a4 417f9dd9 42012d3e c2151381 c1928694 422b84d7 -> 3f65734c 3e054485 bed90ec5 3fb108ec", + "c19d34e9 406c77c0 41219698 40eb81d8 41f5eefc 41167488 4062c809 41b3bf70 40b01580 4104df88 418be1c8 00000000 00000000 00000000 7149f2ca -> bf0365e4 3f5b7f69 3d18e80b 3ee014ce", + "40cf1f80 c23cfa73 41a619a4 4152a5b4 c1f17dbf 4234066e 413cafea c171b5c4 41fb51e0 c1dba63f 3ed70118 00000000 00000000 00000000 7149f2ca -> 3e91e3f2 bf1eefec 3f3af5b4 42252778", + "414511b4 c20d62fc 41c67e48 c1ec1b0f c132009c 41c6c9f0 4153d5fa 41cb75b0 416d5cc8 c15619bc 4112268e 00000000 00000000 00000000 7149f2ca -> bf43ebbe beb92261 3f08512a 41543325", + "42470382 4125e7b4 c1bcc951 c13402b0 421b1c18 41c949c8 40890f11 c1a5fdce bf886cc0 c196cac8 413bd651 00000000 00000000 00000000 7149f2ca -> 3e21c6c5 3f29a790 3f3b659d 00000000", + "41a033cc 41cd47cc bfc4f200 3ffda800 c2057d28 4205d2ea 408b0e5d c1eb6637 42268cbc 418117f8 40a4b6ed 00000000 00000000 00000000 7149f2ca -> 3ec16751 bf66f4f2 3e554e57 00000000", + "c212782e 42060268 c206b83c 4238933a 422a8cda c0278040 41811840 c1d464d0 bfe57480 404a6a70 409c71f0 c2448e91 c00d9d50 c12f62a0 41d587af -> 3f59ee26 3f053319 bd8a9fca 00000000", + "40c97e08 420712a0 41df3c4c c1fe7324 c21daf03 c15571f0 40c7792c c1fe72c9 c21dae1b c15575f3 40d606fa 41c646b8 40e12740 3faa4960 41a31069 -> be057e6e bf2a2b03 3f3c525b 00000000", + "c0d23d08 c2141aac c242ce3c 40ba80f0 c208ee98 c1654d08 4183d09b 40ba80f0 c208ee98 c1654d08 4183d09b 41fa0920 41fdffac 42000830 4224799a -> 41fa0920 41fdffac 42000830 4224799a", + "bfaea780 c2102aa2 41327c10 41df9998 42003bdc c21d1b87 41200d83 41df9b79 42003ca2 c21d1c4b 41698bf8 00000000 00000000 00000000 7149f2ca -> bf27482e bf09b880 3f08545f 00000000", + "c2466d2d 4112c330 c2258044 c20370f0 40e2c088 4246efc8 40f7d4b0 c2037054 40e2c056 4246f0c2 414660a7 c18c7a18 c2020616 c103b1c4 41cc1537 -> bf077e38 3cadb583 bf5922e4 00000000", + "c18715dc 419065a8 c1e757a3 c1b8396a 416af9a0 41fa1138 419f95e3 42375f10 42463a04 4229b1b6 419602df 41c1e7c8 41b85c4c c1aee316 419e4ef4 -> 41c1e7c8 41b85c4c c1aee316 419e4ef4", + "42216e70 c1abb782 c2380876 c1a3fc5c c21c0a94 4235eb6a 413f2456 c083fac8 4207cc5c c18a667e 414525bf 00000000 00000000 00000000 7149f2ca -> be2bbadc bf3f4d46 3f249c20 00000000", + "c1e1a2c9 41f61d0c 41d4a928 413fb7f4 4203642c c1ba7cbc 40094827 417f58b8 c244a730 4185fe2c 404427a8 00000000 00000000 00000000 7149f2ca -> bd324b5b 3f65ce6c bee081de 41bd3bcc", + "4091e868 41806b24 3f109a00 423de178 406c8fc0 420f1d32 4101a10b 423de1bb 406c8846 420f1c9a 40a50d61 00000000 00000000 00000000 7149f2ca -> bea79469 3f159a39 3f3e1727 46c33bb1", + "c1d8c606 c2169b87 c19c4760 41487fe0 bf55d280 c16a67b8 413f940b 414882b5 bf55a6a8 c16a6bb2 415ae055 00000000 00000000 00000000 7149f2ca -> bf018032 befa9b37 3f35d641 00000000", + "c2222bb9 42045b0c c22bc808 c19178b7 c17fb740 c1ee8061 41075701 c19177a5 c17fb99c c1ee810b 4144eaea 421e15a0 413c94a4 421c5edc 41c19f2e -> bf1ec589 3f2eff18 3ec50410 00000000", + "414e00d8 c1b11a98 423f0d2c c202aae0 c1ffdd3d 41f90850 4113be4a 421ec0ce 4204db2c c22bffb2 417d1844 41b50bcc c092bc58 c20455f8 4180651c -> 41b50bcc c092bc58 c20455f8 4180651c", + "40c8de78 c2468f28 42319b54 c1b73052 41709db8 c236ef96 414553d9 c1b72e7c 41709cc6 c236f09c 4131e21d 00000000 00000000 00000000 7149f2ca -> bf28765f 3e2d7afc 3f3bd151 4623fff0", + "42082f5a 422d5fc0 c16022b0 3f682b80 c2347465 c1963f61 41876dca 3f682b80 c2347465 c1963f61 41876dca 41363128 41c62eb8 c1c74c72 42046ec6 -> 41363128 41c62eb8 c1c74c72 42046ec6", + "c0a86668 c197481d c2418d27 41ad3dd4 c1be0dc9 41d0b57c 40b5ef39 c1773604 40ffa4d0 423a9264 402e7a17 403e9f40 41d6e77c 4209b550 41b10b08 -> 403e9f40 41d6e77c 4209b550 41b10b08", + "c19fba9b c1cdd3cb 4182ac38 c206f702 c1e16240 c18e2e1a 412d3734 412acd98 3ff43500 408b6488 3e02af48 411a5328 c0d02de8 c238ae87 41f6efca -> bf43f28a bf04b462 bec33e93 40a6a090", + "c1bf8a84 423acd5c c1d9a4ca c1a6a66d c2295444 c200da96 41161410 40acaf70 c23655c5 c0c471b0 416dc069 00000000 00000000 00000000 7149f2ca -> bf34d9d0 3db35ca6 bf33cb91 41ba0506", + "c22fad0d c0f6d160 c213c46a c1a53a07 422d552a c1850d08 41811c7a 42145c34 c20f5cdc c20e3c77 3fc5e5ec 41ecd6d4 4026ac60 c1854ccc 4207c1a7 -> bf141c9c 3f4b14b7 3e4232b2 41a27af8", + "c1c30f12 41f348a0 4228a9dc c1bab56a 42040f04 c1b45160 4177a626 c1955f2c 410931f4 c1e819d8 407f4728 00000000 00000000 00000000 7149f2ca -> be39e32a 3f735b31 3e80e7ad 41f9ac97", + "42210716 c1a4a37c 41873640 c056e740 c1af7f60 4172ea90 402fba22 c23d424e c21eb9d9 c2305dd3 3f42c674 c1935fcf c242ad8d c1f21f6a 40f805ad -> c1935fcf c242ad8d c1f21f6a 40f805ad", + "c01f98a0 c1e59a81 422e114c 41ac9338 c2090c05 41c23cb0 4187fe55 41ac9511 c2090c81 41c23c68 410910ae 00000000 00000000 00000000 7149f2ca -> bf60b17b 3eeb9e82 3e08cfa7 47ccdff2", + "c16a3a80 3f7d8380 c1c5e288 c118d560 421062d4 bf3dc700 4196671a c118d2d0 421063bb bf3ddf24 4140a9d8 3fb7dd60 c1bef646 40f15860 423ee81b -> 3fb7dd60 c1bef646 40f15860 423ee81b", + "41b3c2ac c187166e c2071f49 c1aada90 bfdf3540 c20baf18 4054fbf2 c1aada90 bfdf3540 c20baf18 4054fbf2 c216b3aa 42239c4e c1ad00c5 419f2607 -> c216b3aa 42239c4e c1ad00c5 419f2607", + "c208464b 4223ab2e 4233e60e c1b121dd c2375bbe 41f14abc 4169cf10 40d766f8 406e6a90 41cb56f0 4069b5a9 00000000 00000000 00000000 7149f2ca -> bf006b5e bf5c73cc 3da8cd7e 00000000", + "420f834c 412e3a9c c20a8b19 c2106408 42450020 c22f1e28 4177b636 c18ecf0e c19665c5 41a6a160 41283ba4 41be2cfc 4105b258 41798d18 41243b21 -> be4375b4 3f363d56 bf2d05e1 3f9f6028", + "41b9c26c c1b8da1d c1313b34 4211189e 421d7f1a c16b31a0 4161e2ee 4147b170 c19ce479 c1e18e70 3fc795ce c1cf5d9f 41c7c534 c148ae40 41b33ffb -> 3ebb5c6c 3f683e35 3e548880 00000000", + "c2207efa 41a75c80 c22c94ce c1e146ee c1ddb7ff 417e4b70 4182a63b c1e1464f c1ddb9db 417e4cb5 40b32308 409291c8 c19f9331 c19fc6f3 421f3893 -> 409291c8 c19f9331 c19fc6f3 421f3893", + "c244c0a6 bf7a05c0 c09ff398 41836850 be9d5900 420589fe 40b6646e 4166f050 4188b630 419b4174 418e4b3c 41e3e8d4 40abb5a8 c06c7040 42090ba5 -> 3db61c36 bf46c577 3f1fb626 00000000", + "41f590ec c13944d4 41e98c38 c0834950 419bfdf0 c0a29e78 3fca0bfa c07810d0 c0c68348 c21de3d9 40e3b914 c183cb28 c1601734 c212b77c 42320e5f -> bbacff89 3f19409c 3f4d0e4a 41ec94b5", + "c0e6d0a0 c241f27a c20017f2 420a206c c244a2bf c2026bb0 4199aeda c1ebc55a 41f18cac c13888d0 408714a2 00000000 00000000 00000000 7149f2ca -> 3f1d6433 bf432352 be4f45b9 41db8ae3", + "c1d5a8fa 410e1250 4067af20 c21df13e c0a13010 c1f506fd 40d53f55 4135d9a4 4195436c c1b3d03d 40178f2d c2423ba1 bf2f8600 41e02e0c 41b17db4 -> bf65a22a bed600ee be133efe 40cf79f3", + "42435598 42249fa6 c23ee845 41408584 41e4e448 c20edffe 41397e59 c233da20 424598e2 4190a4d0 406bc50d 421c6954 c1eb8b78 408eb950 40e177ca -> 421c6954 c1eb8b78 408eb950 40e177ca", + "4182cfb4 c233a380 41c9d5a4 410cbefc 41fa68b8 c2419cb2 4110c2d6 c21c1618 c216a4f5 c1a9f0b8 40993ec0 c0a3aee0 c1f40b2e c0ebb870 4200b68e -> 3f0ac8e5 3f4826e3 be9da872 00000000", + "419a11ac 411715e8 422d8d50 c19dc07e 4240590c c1f31676 400e051f c23b0e5c 423d3dc8 c215434c 40295473 00000000 00000000 00000000 7149f2ca -> 3f77e48f 3ce3cac7 3e7e1207 4289cd30", + "c18c2484 42104328 c1b7a62e c210c002 c0b90678 c243c025 401d0557 c210c002 c0b90678 c243c025 401d0557 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "4234247e 41c74808 c213f61a 42303bf8 42143dd6 c12ad4f4 419728f2 c23ca9a0 c0f721b0 3fc00e00 4051365d 00000000 00000000 00000000 7149f2ca -> 3f642b90 3ee0061d bdf3aa5a 424e35d1", + "4227e82c 41fd4390 c1cd9365 c0982220 41985424 42299fcc 414865ce 4144524c 4200cb00 c1ef0a91 419e5052 4190f7b4 c1b2706d c2190e5d 42211776 -> be672471 be32a348 3f755c99 00000000", + "41570eb0 422ea35a 4169b7e8 41c5c34c c20f9d88 c19a63aa 417b79f5 41c5c34c c20f9d88 c19a63aa 417b79f5 420021fe c22fe4a4 c1515730 4192e6f0 -> 420021fe c22fe4a4 c1515730 4192e6f0", + "c23bc3ae 422d023c 421ad398 423b920c c1f87c07 c2197d06 418479ed 423b920c c1f87c07 c2197d06 418479ed 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "4207d590 42088266 c1c8bfce c116f8cc 41214328 c194f48e 405eb3cb 406c3090 c1abb6ff 4217fe6c 413fabbe 409e3cd8 413b4680 4207d4ac 4175dca0 -> 409e3cd8 413b4680 4207d4ac 4175dca0", + "c23c20f5 c0cac048 bffd9520 41760a18 41542408 c2260843 40551991 41760a18 41542408 c2260843 40551991 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "418b036c c1ab9b9f 41651d78 41b7b790 421270ec c22f7b14 405587b7 41b7b96d 4212700f c22f7c04 40d739fd c22603ee c1905c8d 41f5329c 420451de -> bf17143f 3f0bfe5d 3f18077e 00000000", + "c1fa653c c196c111 423734a4 c2144ff2 41c42fa0 c232fc30 40bbf12d 4234ebb8 423d64a4 41dffaf8 3fe8f444 423b47c8 c1d8e408 c244fbf2 41af1981 -> bf3bcf32 be5053a7 bf25fc43 400704c2", + "c1ac718d c1396f60 c1f7efde 42015608 c1efaf22 40c165a0 417d483e 423f1c82 421f2922 4204f6f0 404bed7d c19cbe3a c1fbbda1 c226a5c6 4134cefd -> c19cbe3a c1fbbda1 c226a5c6 4134cefd", + "41a03a20 3f0d2d80 40b5a790 c1b35903 4181416c bec48000 41489510 c19b4bf5 408f7b10 bf4a3900 4120b059 00000000 00000000 00000000 7149f2ca -> be7f3f70 3f77c4fe 3d09ee07 00000000", + "42210628 422afb50 41d65924 41cfc0f8 41834dcc c2369334 4193ed11 423dcf38 c229c480 4233068a 41951194 00000000 00000000 00000000 7149f2ca -> be48021e 3f08fc23 bf526816 40d77de4", + "41bfafb0 421ccd0c 419857a0 40981448 40787ba0 c22e4a4d 4059331e c1e187f8 c1d4fb84 41e71448 4096427c 4191c770 c02e7fc0 c1932e57 40e40c30 -> 4191c770 c02e7fc0 c1932e57 40e40c30", + "c2459858 c0e6f4b8 c184b0ec c22e5e84 c23b7d20 41ea22f4 4182b202 421d8b44 4240c32c 40e2a640 41433ae9 42301110 41f80604 4207f616 417c6fbe -> 42301110 41f80604 4207f616 417c6fbe", + "3f413680 c1b6b78d c170a838 c22c5109 c1e1b965 c1ace538 4196c42e c20da6f0 41c1a550 41822a04 41193261 42390746 c206d1af c239d1bc 4078061c -> 42390746 c206d1af c239d1bc 4078061c", + "41fabf28 3f610580 42159204 4202cb2e c245793e 41ebed24 40c803c6 4202cb84 c24579d2 41ebeda5 419f2edc 42384d58 41bae060 c06545e0 418e8445 -> bef0b722 3f4f208f beb4895a 00000000", + "be1d3100 c20982d0 4241d198 421a4696 423f09ca 416b52c8 4180de60 41c66468 c1d01ef8 42233fc8 402e8889 00000000 00000000 00000000 7149f2ca -> 3e317453 3f6daf8e bea834d5 00000000", + "419b4a8c 41d24048 c01bc120 c1ce386d c1e6c6e9 bf8d25c0 414b2013 c1bfdb0f 41d391c0 c241bfb1 415775a0 c2474613 c0e20ef0 40e41520 42103e3f -> bcca0755 bf426a13 3f266e45 00000000", + "c2433173 c19814d6 bf6bde00 410e5048 c1656744 c24331bb 4191a534 41ca1d78 41230c1c c24012bc 409caa5b 00000000 00000000 00000000 7149f2ca -> bf0e0f4c bf54dc0a bcd8ae92 425a613b", + "c01d85b0 421cff78 c07dcab0 42473cb0 423e4fdc c1e1d2e0 4097afab 41753ee0 420df65e c0137730 4167d5ad c1e203c2 c1f5a3c6 c084aa38 42297c78 -> 3f450869 3e8a2395 bf14221c 00000000", + "c2231dc0 41c265c0 c1d443de 42126160 c19339fe c1f49e7e 40aae232 c1be546d 41e6f204 41ee537c 410d3764 00000000 00000000 00000000 7149f2ca -> 3f1e64a9 bef7fc70 bf1e5877 00000000", + "406a6e90 c104278c c23bd2cd c22b268c c21057f0 41ff4050 41114a72 c22040fd 41c59954 408925b8 41267f81 00000000 00000000 00000000 7149f2ca -> bd26fbd0 bf68dfa1 3ed3a1b7 00000000", + "41a9b68c 4170a8b0 c1b4a0cd c21324b2 417fb370 c23e9a31 419b335f c1db6c1c 41955d44 c2222a47 3f08eb7d 00000000 00000000 00000000 7149f2ca -> bf46b60a be646a4e bf16f5e0 00000000", + "c177a9a4 c1efe3ad 41ad6b0c 4101d910 41ac9c98 417ca198 40b049a7 c2140585 c21473d8 41db87e0 4116d0a7 c105b014 41d2c1d0 c171f4d0 41c2a4cd -> 3f1a225c 3f487c3c be1f3679 00000000", + "c23b81a2 4219fc52 c1cb214f 4221e8a6 41de1bb0 c1ecc4a3 414822e1 c0beb3e0 c1cd4e40 c1bff630 414759c2 420ba6f0 41aee928 c1bcb18e 41eb756b -> 3f276a1e 3f409d84 bda18989 00000000", + "422f4074 c093aa48 416d3968 41909804 41165480 40ebedf0 414535e4 41909804 41165480 40ebedf0 414535e4 c109e2d0 c154e940 c09f1fe8 41defa14 -> c109e2d0 c154e940 c09f1fe8 41defa14", + "421a3348 3fb7e100 420b0692 41de82ec 40d76858 c23613ac 3fe467ec 41de82ec 40d76858 c23613ac 3fe467ec 4221f038 c1f6e714 421c3af6 41db1cdd -> 4221f038 c1f6e714 421c3af6 41db1cdd", + "c1a6546c c246f165 c08ec9b0 c1dcc6b6 c1fd0e8e 41507fc0 3e90d2e0 4208bb22 c222c216 c0dc7330 413ff255 00000000 00000000 00000000 7149f2ca -> bf714f45 3e0d8314 3e9b9d98 418b8349", + "4189de64 41f4a580 41a48484 4181d01c 418cd7a8 c1e3ced7 412c665f 4181d069 418cd629 c1e3d088 4102f201 419749d0 c13c3ae0 41b305e8 40fa579f -> 419749d0 c13c3ae0 41b305e8 40fa579f", + "c1df4d62 4219a03e 4215252e c0987838 41cb8f74 42016ac6 414d14f6 c0987838 41cb8f74 42016ac6 414d14f6 c2133299 419a7ae0 c1b75f46 422d5a06 -> c2133299 419a7ae0 c1b75f46 422d5a06", + "c1a0ff26 418f0218 4231c76e c23d1717 c1e8711a c1a0b318 40c9543f c15ee45c 413f9a5c c1f2884c 41705088 00000000 00000000 00000000 7149f2ca -> bf1e816f bf430e96 3e4283d9 00000000", + "bfd8ac80 4206569a c22e602d c130d760 c18113a0 412c1b54 41996eb0 c2406dac 4204d528 c1c72c27 408b6857 00000000 00000000 00000000 7149f2ca -> 3f051b0b bf313f32 3f00126d 00000000", + "c1290bf0 41133d44 4228ec9e c141a9a8 c06d83f0 3f2b1340 40fe6d4c c141a720 c06d88bc 3f2b1556 419ec069 00000000 00000000 00000000 7149f2ca -> bf671974 3edaf94d bd3e716b 00000000", + "41d3e818 c0a164e8 424387d6 41ddc7d0 c1b05fd8 4198e100 40dd69c3 c217a1f0 c0554bb0 c0e74700 416a3554 4218e31e c1b2cd2d 4225a596 423ac25f -> 3f65ad88 be82fb43 3eb85652 4222cdaf", + "c214e1e0 418ae5e0 42457bf4 4240b152 c2094129 41981f1c 40e566f8 4240b152 c2094129 41981f1c 40e566f8 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "41b7c1fc c1718d9c bfb4d020 41db2c5c c1ed2aef c20e19e6 41674a57 c192cba7 41f89020 4221a408 41296ba3 00000000 00000000 00000000 7149f2ca -> 3ed9fb4f bf10a85d bf34eae3 419fb19e", + "416eb4c0 c14d04ec 4049b7f0 42147ef2 422b11be c20647d0 407a9f26 c2043c74 40c44c18 c19c256e 40ad8101 c216eec3 c2479f0d 4242fb54 41cb798f -> 3f5f73c5 3ee944ac be32f4be 00000000", + "c1efe73e 3f6eaf80 41f19014 42439e80 3fd72780 c095cb18 410ac268 423f639a c227a6b5 c20e7ad9 416b48f2 c160ff94 42382e90 c245865f 42327fdb -> 3ca20728 3f50b9c5 3f14228a 422db387", + "c1c882e5 411edb00 c1c04a4e 41451810 c20d6ecd 41b803a0 419e8696 4218e074 c10e9df0 41a8e328 4173e563 00000000 00000000 00000000 7149f2ca -> bf32e552 bf36a6e7 3d50f5ef 4141b4e1", + "bff9f8e0 c20797de 405669a0 c1c0dbc7 41d2a244 c237cd9d 419d0484 c1569e10 c14f5fdc 41b28998 410db53a c2378745 c23eb3f3 412ce514 41749295 -> be09c238 3efd1257 bf5bdc43 00000000", + "c191efb0 c21ead3c 41ca2284 c0a79c70 418c51f4 4217fac2 3f2d727c c24533d6 c21de788 41a56b84 40f6e40b 413845ec 423cc418 c21f529a 421e2c57 -> 3f183525 3f44f3eb 3e6f47ba 00000000", + "c237cf84 42432cc6 c18f3ef8 41e2957c c1c71bfc 41524bfc 4018638f 41f90b54 c224d7d6 c207c860 419865bc 00000000 00000000 00000000 7149f2ca -> bd666082 3ea76abc 3f717fa4 41a2e248", + "c1bbe0e0 c24170f7 c2310ea0 418e7044 c0ecc600 c233780b 4122d3b1 4183836c c0f24848 c1c93079 41925f22 41570c70 417fb3c0 c22e4524 4209b7e3 -> 3d8d7e6b 3c0eb19a bf7f60e9 3e65a17e", + "c1d84002 42311b22 41f056bc 41aaae58 417e6b38 c1ed9478 4154d5b0 41aaafee 417e6dc3 c1ed9391 41916452 00000000 00000000 00000000 7149f2ca -> bf368e33 bf125bf0 becfbc4c 00000000", + "41299910 c13f1b04 42321ee6 c188d7f2 418f6270 4178b740 418c4f2b c209045a 41dc41d8 423c9dbe 40ab0d19 00000000 00000000 00000000 7149f2ca -> 3eebe132 be842bf8 bf596419 4191c218", + "422d4812 c21a05c6 424029fa c20d3c0b 4182e264 4224cfde 3f5a6ced c23c07b5 4109795c c15e7b18 406cf9e3 41d598e4 420b5232 42092d16 41b40c2e -> 41d598e4 420b5232 42092d16 41b40c2e", + "423d6276 42077ea6 c08b5fd0 c12661ac 41f61020 c1b27c92 418a5d0f c1265f10 41f60f3c c1b27e21 40252ea1 00000000 00000000 00000000 7149f2ca -> bf168208 3ecd7bdf 3f33cc63 4803c639", + "c22fc382 41ed00f4 40d87150 41d10fb8 40d37660 c23bb4b9 4174673c 4228a590 418a3c64 c1bb81f7 419a692a 00000000 00000000 00000000 7149f2ca -> bf071a60 beb3e3a7 bf45f8fa 3e895a63", + "422f071a c10780b4 3f9b1280 c214fca6 c1f87ad8 4130f214 3fdf0d6c 41f17590 c1549ae8 c226510c 408deb23 420e6922 4158389c c2027f2b 421d8249 -> bf45930d be504c16 3f1a3c4f 00000000", + "41e33fc4 c1d97bbf c149c158 41848a7c 418af320 40ac2cd8 4042788f 41848c65 418af126 40ac272f 419f8b68 408a11c0 c1e2f58e c22cdd6b 41f3ce3a -> bf1e2bfd 3f23abb0 3eea58bc 00000000", + "c19b7628 c1fedfdf 41c5a4e0 c243d482 41a80b54 c1270b80 413d1424 c243d482 41a80b54 c1270b80 413d1424 c1906a21 40b2c770 c02ae0c0 41c3074b -> c1906a21 40b2c770 c02ae0c0 41c3074b", + "c18a5d3c 40890838 c20189f4 c0741e20 3fc92080 c2314918 4195a1c5 c0741650 3fc906ac c23149c1 40dbcaa9 00000000 00000000 00000000 7149f2ca -> bed92159 3f33754a 3f12c7b2 480372e2", + "c222b02c 419583dc 40acc518 c1d7a0cc c20a98c9 c1fa449c 40366d46 c212ddbe 413db18c 42065674 410357a1 417b4e70 4196e3a8 414e6f64 408e5b05 -> 3df8a82f bf140e58 bf4e8460 00000000", + "423bce2c c1f4fa16 4226ecae 4061cef0 c1b95244 c20374c8 410d630c c1894908 416dc540 bf3870c0 401cba19 c1248500 423eb432 bfdaf340 419f7824 -> 3ec47545 bf348b07 bf189d5d 40a282fb", + "41a6ca00 41a59524 41d6efc4 c14b6290 c207659d c23075c6 40a916fe 419c2554 421a105a c241ad86 41603847 00000000 00000000 00000000 7149f2ca -> bed0000b bf6982a2 3d5e3c42 00000000", + "423bfb14 c17b1f20 c1a870d8 4235a68a c1c01646 41a97b40 40408204 c2070a6d c21d4385 c21aff01 4069c495 c1483dfc 41d74a44 41c31ccc 421bc08d -> 3f49bac7 3e1bfcb0 3f18b5d5 41dc4002", + "c1320e38 41e0c134 423cc324 41cb70bc 4110fb7c 4171ec68 3faf7c05 41cb70bc 4110fb7c 4171ec68 3faf7c05 41d9a728 400228d0 c1dd3348 41d9195d -> 41d9a728 400228d0 c1dd3348 41d9195d", + "41bed3d8 c159b698 c004fb20 41921180 41e553c4 c1a835d3 41261714 41921180 41e553c4 c1a835d3 41261714 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "c1c8fad4 400280a0 c1d33084 4051d180 41dea7bc 4221517a 412760ba 410e0a10 c2383c2c c193e304 4106ddda 00000000 00000000 00000000 7149f2ca -> bd726928 3f47f191 3f1f26a2 00000000", + "c0a1e2c8 c210d145 41e5d168 c0df7160 4101fa84 40c6bce8 40cd695e c0df6a7d 4101fbd8 40c6bc17 411bb54b 00000000 00000000 00000000 7149f2ca -> bf6d66bf beb72264 3de125c3 00000000", + "c2379d80 42467d50 c22cb875 c15140c4 41e17140 420fd402 3fae9cfa 3fe43d80 c2070c62 41313b68 4136b584 c19b2c14 c1b441ff 419df9bc 410b8d90 -> c19b2c14 c1b441ff 419df9bc 410b8d90", + "4131fb88 4231b8a4 c214a487 423d11f0 c20914b6 41f17578 4054504b c1d525c6 c05360b0 4180a810 40621466 00000000 00000000 00000000 7149f2ca -> 3f688a71 bec2dc81 3e317375 00000000", + "41e172d0 41848c58 c13cf9d4 c243d950 41bab3bc c237d082 4167313e 423a7880 c1aa5fee 402dfe10 408e5127 00000000 00000000 00000000 7149f2ca -> bf529dc2 3ec4b5d2 bed68132 00000000", + "40ecc458 c183ad6e 421e48da c1258888 4147355c c230e6ba 41905fc6 3f3ecf40 c0e33200 40e0faf0 4187c223 420b28b0 c1f4ad24 42077cdc 41a9e1b2 -> be4aed33 3eb2d951 bf6a7286 00000000", + "c18ca250 c1049cf8 4223f8e6 41ad8dc8 c1a399c8 42380132 416b3c69 41ad8e89 c1a39b0a 423800ed 408eb7d4 00000000 00000000 00000000 7149f2ca -> bef70ec9 3f4e1846 3eb0a717 47fb4a43", + "41ba34b0 bfdf4f40 c22a40d9 4206cf40 4208fc9e 4124eb04 40af8b1a c1fb346e c1e9be48 c187c63c 411c6637 00000000 00000000 00000000 7149f2ca -> 3f2f9412 3f2b28e7 3e9323e2 3f352bd3", + "41e3e0b4 4034a620 41b6e06c c08415e8 420f364a 4236c084 40ef489b c21aaf66 41b937dc 41b9dd10 41489f72 c188cb8a c220e7ec c204c607 4114471e -> c188cb8a c220e7ec c204c607 4114471e", + "c0587710 c07e7c20 407adb40 c23effe2 408b4498 41b3329c 419a7c7e c23effe2 408b4498 41b3329c 419a7c7e 423b25d0 c1da324e c1c704a2 415491b6 -> 423b25d0 c1da324e c1c704a2 415491b6", + "42332a00 4235bb24 c176c43c c20907ba 3fac4c40 3f08ab80 400909a6 c22aead0 c017b120 411cb970 4189e362 00000000 00000000 00000000 7149f2ca -> 3f25ad9e 3e915ab4 bf351ef0 428cac8e", + "c191106a c22ccddd c1f87afc c0cc16d0 c1946493 c1d5b194 4102ab52 42365852 c1e18ce8 c1da684d 4127f6a2 c15e2e50 4214313c 4226bc4a 4237ed5a -> bf7baf8a 3e3adad0 3c36a5b3 42041abf", + "41375980 c1bc22d0 c23fc67e 41b2511c c1fcb71f 41da8104 41699ada c18caeb0 c20b5527 c1da1df0 4030d7f1 00000000 00000000 00000000 7149f2ca -> 3f16d95d 3d44571a 3f4e7865 00000000", + "414ec8d0 421a8902 c2097390 c15a049c c20b120a 4157c5cc 4072f3ac c2194324 c1c1693c c14e75fc 40dad376 00000000 00000000 00000000 7149f2ca -> 3f27d676 be8fff5a 3f336533 00000000", + "c205330e 4208411a c231c57f 41aaa930 c213d6ba c080ca60 41591078 41aaa9be c213d6b1 c080d009 4096054a c116afa4 4111d184 413fe700 4247f065 -> c116afa4 4111d184 413fe700 4247f065", + "41702a98 c10f19e0 41d2daf4 411365e8 c22db46b 41136998 40d9a6a1 411368a0 c22db4e1 411369b3 411ffe85 00000000 00000000 00000000 7149f2ca -> bf53c3dc 3f0f9c5d bd0370be 00000000", + "42368b44 422e514e c0b20f40 423283ce c165d404 421d8c16 415abbdb c1da2bc2 c071abe0 c235b819 4006c76f c23f7e6d 41d614a8 c0893880 42085be2 -> 3f24cb06 bdc22458 3f4265b8 418d7b23", + "423069ba c1e87f8f c1d31961 401e3620 c1f60067 41df1038 3e0c0119 c13eb520 42057096 4146ad8c 41181974 00000000 00000000 00000000 7149f2ca -> 3e5a513a bf7323bd 3e6a9d3b 41df5bd0", + "c1f9b538 c158397c 41823714 413f952c c20db4a2 c22ac939 414025ba c0fafca0 c20674ce c219fc04 415a256f c1909c95 409aeaa8 41d8c628 424087d0 -> 3f7970a7 bdb67eaa be537b58 00000000", + "c192cc38 423d1122 3e705e00 c1cfa9ab c21db032 422ddd4a 3f997c78 c1cfa93d c21db095 422dde41 41430b03 420742a2 c21eeca8 c165bae8 40e6a30e -> be4f4485 3eba8a78 bf68b47e 00000000", + "41ca88ac 4209ce98 40eabe20 413706b0 42154e16 c1d7aa74 40963917 4237b24c 4187cac8 3f69da00 417df404 00000000 00000000 00000000 7149f2ca -> bf34f31e 3ed595aa bf123f9d 00000000", + "40989db8 c23d0960 c2214fe7 c1411780 c238046f c210a683 412e8fc4 41821bcc 42148b80 c12c7e00 4052b685 00000000 00000000 00000000 7149f2ca -> be9ea83e bf68cacd be8e2333 422d8b5f", + "c09655a8 41f1fd08 c2005a8c 41f5bd80 c1a785ca 4219d936 4110a27d 41f5be59 c1a785be 4219d95b 40c38acd 41d27e40 41d9bd4c 4244f30e 41a4bae4 -> 41d27e40 41d9bd4c 4244f30e 41a4bae4", + "4137abac c239d1f5 c2465fd7 c1d96a96 c1b2c359 4205b7a4 41997e2f 423e369a 4218b8d6 c0988f40 41051423 00000000 00000000 00000000 7149f2ca -> bf38e2b4 bf15be42 3ebd0026 410b81a1", + "c2222193 c1dc0fc7 42270aa4 c20b2c74 c1415ee0 414738c8 40ddd642 c20b2c43 c1415b94 414736b7 3e93e9eb c1b2871b c15614a8 40a2b640 42452dd7 -> c1b2871b c15614a8 40a2b640 42452dd7", + "c04e9d50 c2302b6a c208db99 c0d1e670 4117b4b0 40b946e8 40836288 c20c0226 c22a72fe c200cfae 4185db22 421f5e16 c2200794 4154a41c 4142bef0 -> 3ecea58f 3f3d3d99 3f0a03f6 00000000", + "4000c7e0 41f86bdc c2256a7c 419144f4 4247e1e2 c04c3330 41039892 419144f4 4247e1e2 c04c3330 41039892 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "414d9340 42093a8a c2240e8b 40839b40 c1aa68ad 421dc53c 4089f8f1 420fce26 c23fae95 c2353835 3fdd3994 bff6b9e0 401d5c40 41a85958 41729187 -> beacc050 3e906eb7 3f65e9c6 00000000", + "415b9cf4 c20d70eb c18ef594 41ca4170 41182d2c c22413f1 417e18b2 4192a840 c1ff6afd c205f0a6 41976fff 00000000 00000000 00000000 7149f2ca -> 3e26b702 3f78828c be34bd7a 00000000", + "c22fff02 c22bc192 c1c6a9cd 410d77c4 41150b48 41756a30 4026094a c20726db bd89d800 41d2dc48 3e44d9c2 00000000 00000000 00000000 7149f2ca -> 3f726944 3e5569dc be7aa37e 00000000", + "40e4ff00 c0a7ea80 c1c28886 41e6a55c 419980bc 41f3b25c 4106e3c6 c14aaadc c0a72d90 418e565c 403d57de 00000000 00000000 00000000 7149f2ca -> 3f5562bb 3efb0fc1 3e824d0e 00000000", + "c16db980 416dc688 41705f38 c1b71f99 c0e78b38 c12a4b04 41991270 c1b71f99 c0e78b38 c12a4b04 41991270 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "41962ba0 c15512d0 c126b508 409a5b30 c210d3d8 c13b7c3c 40ccda52 4190dec0 41339ac4 c12bb308 400ffc1d bf8ebb80 c15f2748 40309670 419aa240 -> be8a1007 bf7676ba bca40d40 00000000", + "41d1630c c17bd414 41c8dc18 421c68f2 c22b5385 c14ffc6c 3f877438 c1aafea4 c0d46240 c22e1e41 41967984 00000000 00000000 00000000 7149f2ca -> 3f4990f2 bef144f3 3ecb833f 41e27879", + "41bf55e0 c1c34338 40870db0 c00ac290 4237902a c19215fe 4145c025 417b89d0 c22d8053 c242dff4 40ae3077 40325f30 420d55da 4200f15a 419ef329 -> be3ed13d 3f6e0a7f 3ea270f0 00000000", + "41755a18 c229e1c3 bf4d6040 bff14740 422ee3ce c135b280 3fec0282 c2456502 408c3448 3fd561a0 4092fc92 422fb9d8 41decbc0 41e936f8 4134cba0 -> 3f40d749 3f1fd6f1 be53a5c4 00000000", + "c1542fd4 c2333e4d 418952c4 c241677d c23b4e81 42048240 4184a369 4246de10 c23f53a4 422c61a2 4129d970 00000000 00000000 00000000 7149f2ca -> bf7eaca9 3c27095c bdcf177f 4186b5c7", + "c225ab97 c1ff7fb2 c233e8c8 424511a8 410db064 c22a1006 3f36b430 42451294 410daed5 c22a0f4c 4187f8b2 00000000 00000000 00000000 7149f2ca -> bf3ed245 3ea14f09 bf1664a3 00000000", + "41ccbe90 41a3ddc8 c2412685 41711dd8 400f9250 bec58080 3f7338c6 41a40c90 421aae0e c1c7d04c 417b38a5 00000000 00000000 00000000 7149f2ca -> bdfb687e bf52928f 3f0e274e 00000000", + "423103ce 3febcf00 c189bcde c1eb8511 4152a8a8 c20e4365 419a32b9 c2302da6 422eb22e 42226c70 405072d5 00000000 00000000 00000000 7149f2ca -> 3e337078 bebb6ac5 bf69f882 42308110", + "c2472f99 c23035ca c22b56cf 423f56c4 4209fae6 40b265a0 4149da73 41658bf8 c092ae08 c2397c74 3fe9913b c21985f3 c146bdf4 c1b8dcc5 416370a8 -> 3eea7a91 3f08cfe3 3f35dc65 00000000", + "c2374cd9 419b964c c209fade 415af880 40d6f5b0 c2324614 4187c376 418a7958 3fc603a0 41d6d830 415ec582 c2302edb 41343548 41c0dc84 419837c2 -> c2302edb 41343548 41c0dc84 419837c2", + "c1b1c79d 3e12c900 41e0f0bc 41b7a204 c1242a84 c216d5a0 418b2316 42252eb4 c2315718 41d28664 4129aa7b c157a38c 42303366 c0835df0 414cf0c1 -> be7b0ea9 3ee934bb bf5b1705 00000000", + "422f7a22 c1b9d118 c12cbde0 42218092 410ac184 bce33800 41297878 4222ed1e c20416aa 422c8f8c 419ca060 00000000 00000000 00000000 7149f2ca -> bbc25edc 3f31d8a0 bf3821ad 41550480", + "41d32dec c1f58f43 c149ccec 422b7ace 419b7410 4189b3d8 40b6dc15 41d01bf0 c083c650 c245d71a 405ad285 00000000 00000000 00000000 7149f2ca -> 3e6d7467 3ea5df39 3f6ace2f 00000000", + "408c6e70 412345c8 418ff308 4202506e 41f889fc 41451b1c 40dcce9d c0d2a3e0 c21ccd25 40e019e0 41808963 00000000 00000000 00000000 7149f2ca -> 3ef8b4f1 3f5f2171 3d870b3f 40f001dc", + "c000d140 c1be22e4 c1dbcd4e 4241b3e6 c15c4484 c22396ba 409fac10 c2276350 c1616ea0 c1996e78 414c730a c23b54f5 c206c191 411d2be4 41cbb52c -> 3f78e585 3b63d45d be6f85ef 00000000", + "c22167aa 4225bfa0 42286dd6 40573000 c226c28e 41998788 40760e46 c23570c3 41df33e8 c07f7a80 416e5391 c21c43b3 41ea2eb8 c18a6fc6 40aa8340 -> 3f0da52e bf4a4feb 3e86cb7a 00000000", + "c1b09d24 c12169f4 c230fb75 421a52a2 c1ce0e1d 41e31fb8 419395c6 4245d622 4228eec0 c14f63b8 40aff325 c1d39ea7 c22e651f c1803a3a 41b5e02a -> be0ab136 bf58b4d7 3f03cda8 00000000", + "42084480 422333e6 c1bb1366 c11bae90 c1039ee4 40811178 41306069 c11bae90 c1039ee4 40811178 41306069 c0d20db8 c13a95a8 c1734444 41735707 -> c0d20db8 c13a95a8 c1734444 41735707", + "420eab34 c2241eba c031dbd0 42432e06 42158ba0 41b6f8f8 419df7e7 42432ee1 42158ba8 41b6fa75 3f90c3b2 411d7228 4222d596 c15e1554 41a27e34 -> 411d7228 4222d596 c15e1554 41a27e34", + "c0c49898 bf639900 41e91c7c bfd83740 4201e0ac c1cd24a2 40f0c97a bfd82eff 4201e07f c1cd2591 41809bcc 41f0e4c8 41908094 4244b3f4 40f0d29c -> beeb2dba 3ea045ef 3f54cea2 00000000", + "41b2be5c 41cebe4c c0fb8b28 c24557e4 c2349ce2 4162aa60 40b81388 c24557e4 c2349ce2 4162aa60 40b81388 41ff7778 41553258 c1f9d238 41e1fe97 -> 41ff7778 41553258 c1f9d238 41e1fe97", + "41bea2f0 423300a0 c2122d38 c2061de8 c2419c2a 41838c6c 418ef9a5 c2061de8 c2419c2a 41838c6c 418ef9a5 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "41308460 c1fbb3e3 c1bf7cb6 400f8a50 c1421818 c23e577e 3fc48d86 41999a8c c21a3363 c20860dc 41639f2f 00000000 00000000 00000000 7149f2ca -> befe18ba 3f45ef98 beca2646 00000000", + "421dfb20 c1cfd376 c0dea188 c184a5f2 c0aed870 41786b98 41882a30 410ab1e4 c1fa0c9a 41f6d8a0 40eddd97 c0f7b740 4202ab64 421f54e4 4228dd2a -> bf24d57c 3f286095 bec8260f 00000000", + "422d6f94 42069222 41e93324 422f435c 42261718 c197af11 4097b74d 422f435c 42261718 c197af11 4097b74d 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "41ac4bf4 42320fca 420415d6 4232ae24 c1a5a6f5 c1a6348e 40b83a44 c21ddf32 422ad2ea c16f34b0 40dc93f8 423670e4 c1f205c5 c20279d8 4120ad56 -> 3f4c2096 bf19d857 bd621fc8 00000000", + "417ffb48 c0992e28 c0868ed0 c1265950 4040dda0 c1783644 41461253 4112c9bc 41233a68 4233308c 404089a2 00000000 00000000 00000000 7149f2ca -> be9d071c bde6b2c1 bf71f34b 41721c08", + "c2456356 bfb41640 c09f8d90 41a1e484 c1d6ee5f 4131bcc8 407e5ddd 40a223b8 41d23d58 4232f34a 41560acf c226e71e c08cfe90 c1851c94 423dea57 -> 3e701ac8 bf524c71 bf0511aa 400e41e6", + "c21aa8a1 4246df3e 41934000 418ee69c 408d3590 c0f04938 419d5211 418ee72c 408d34b4 c0f05101 418c20bc 00000000 00000000 00000000 7149f2ca -> be8d5d03 3dd7f8c5 3f749040 471d0f95", + "417588a0 423a7aee c244e028 c11b45d0 419c9430 41bf8744 4041307a c2379209 4207afee c247c2c0 411a179a c0a85840 421b9240 c1ad3dbd 414ce474 -> 3eddde80 be2ff3f9 3f627ba7 00000000", + "c1dbb073 41d44884 c13426c8 c23e810a 4195c43c c1fb0f4c 4089e6a9 4214fc9c c1975add 41c53758 40c4744b 00000000 00000000 00000000 7149f2ca -> bf485b52 3eb1b65c bf044775 41f5549b", + "40833a78 bfef9c80 c2412b24 421cc77c c193ac99 c2309ef5 40f7959c 4205a3f6 c1b4b11e 4246a1fc 4085d39c 00000000 00000000 00000000 7149f2ca -> 3d7bd83e 3d33af0d bf7f44cc 4247d84d", + "c1e9414f 418233ac bfcfcd60 c14141ac c2449805 40aa5a40 4195ac65 c0a94ec8 c17bc1a8 c1e0417e 4161dc21 00000000 00000000 00000000 7149f2ca -> be11b81e bf33554a 3f33055a 00000000", + "42348054 41d7048c c1fe2df6 c20c5985 401863c0 4230dc36 3fff3323 bf2cbe40 c19e2ad4 c1f55f37 40edc2b8 c24374ef c1f3eebe 417a5808 40934e70 -> bece759e 3e84e6c4 3f60a44b 00000000", + "c1f1508e c1beb84b c195cdd6 41a9dd68 41aa9aa8 c0dcd3e8 419dd7cb 4193faf4 41c84270 c2323a38 4012740f 00000000 00000000 00000000 7149f2ca -> 3d93adc1 bdc81de2 3f7e1af5 41500031", + "c1c241f9 421d9790 c19ecee0 41de6364 4246dcea c162f560 40b4a822 42358920 c237db00 c23d7123 40d928bc 00000000 00000000 00000000 7149f2ca -> be2f3299 3f6e4e76 3ea5424b 42433312", + "c1ef41c2 41ab78fc c22b138d c0ca41c8 41f871d0 3f8ed660 4010db3a 41ac36ac c19be4a6 42060dbc 3ff13722 4061b0e0 c10c1f00 41d352c8 41170930 -> 4061b0e0 c10c1f00 41d352c8 41170930", + "422fe84e 408a78b0 c2477f99 4147a628 c238a3fb 40199630 419f0ab2 c1b9bac1 c073e230 42324a66 41256bf4 c21bb25e 402315d0 42475510 41f0b674 -> c21bb25e 402315d0 42475510 41f0b674", + "41d9b9c4 4242dd50 c21a1b7c 421f8094 c1e144c6 c1382e38 4187fef3 421f815c c1e1460a c138304c 41821298 c1e34993 c231801c c20024ee 4137583a -> c1e34993 c231801c c20024ee 4137583a", + "42094bd0 421bc356 40f08140 42092762 c0f194b0 421ac6e4 4175702f 41b4d1ec 41fffcd0 c2105b10 403ec45b 422fc572 c1596c2c 422337b8 41f73e6f -> 3e0c1f5a beed1a42 3f602ccf 00000000", + "c204f494 40b38e28 421a9be4 42075296 421df26c c044e860 418322ba 42075314 421df17d c044e0d3 410c79b8 00000000 00000000 00000000 7149f2ca -> bed9f998 3f4ebaf1 bed10035 47a5b5d9", + "41ec1228 c2449255 c208bfef c0f02618 c2390b8e c2307c7b 416ffbc5 c0f0251f c2390aa7 c2307d13 40cb8ddb 00000000 00000000 00000000 7149f2ca -> bde512b8 bf54837c 3f0bd5f7 47a9bf5b", + "c103aa5c 4232da58 c1e47868 41e8ea24 421ccb84 c19e846a 41574c23 4180c9f8 42308990 4211a3da 418e1e20 00000000 00000000 00000000 7149f2ca -> 3e661a6c bdae82f5 bf787f52 41db6956", + "c218aa8c c1ed21f7 414befac c05f6000 c222949c 4137ee8c 40716bc5 410062b4 418b50cc 41f818a4 408bc724 00000000 00000000 00000000 7149f2ca -> be3d2e5f bf6e7b06 bea053b0 41d71a40", + "4161b870 41f13f64 c221115c bfa293a0 4044fe30 41c1ac28 3fa3c97e bfa27b77 40450bd6 41c1abd5 41234463 00000000 00000000 00000000 7149f2ca -> bf27fa3c bf3dc93a 3e10448f 00000000", + "41b7c5d8 41d51c08 c1449c78 413cccbc c2283a13 c2292b64 40d0ff0b 413cccbc c2283a13 c2292b64 40d0ff0b 41a13b60 c12a37e0 423d6fe8 4219bbcd -> 41a13b60 c12a37e0 423d6fe8 4219bbcd", + "4222c23e c1b99d64 41235c24 4233c252 41c2da08 c21131f8 419ffd6c c1a1842d c1f85c96 c23e0994 40cd08f8 00000000 00000000 00000000 7149f2ca -> 3f415711 3f24768b 3e051de3 418bdc4b", + "423f5678 c20bef2a c236b272 4229330e c2387079 c2156598 40c4f867 40bab910 421f0118 4183a354 400270cd 423d0ab6 c10596dc c1cf4b44 420fb9e5 -> 423d0ab6 c10596dc c1cf4b44 420fb9e5", + "4198a6cc 415fce70 c22ade2a c0b23348 41871884 423606d8 411f22dd c1e10d36 41d8c49c 41b0677c 4173486a 42015f3e bfaa06c0 41a47d34 41054122 -> 3f295607 be993d85 3f300aa7 00000000", + "c1a65ec6 c15f6cf8 c1e05a75 c08fd180 423a5dee 420c75ac 41450a0b c08fd180 423a5dee 420c75ac 41450a0b 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "c1a9f9db 3f83a760 423c2bb8 c00868a0 c14ff2e8 c2036c6e 4181acac c1804486 c2156136 42319dea 40daa792 c20c548a 422bea80 4061bc40 41dcd338 -> 3e2d3468 3e97acf5 bf70a4ec 00000000", + "4243dba8 c081d3e0 c211ebe8 4243b3c6 41a25ca8 c21e6ed5 418d0c69 c2443446 c18f5fc0 c049ff50 40aae163 00000000 00000000 00000000 7149f2ca -> 3f615885 3eafcc40 bea7add3 423e46aa", + "c205ce2c c105e4a4 42187cd0 c1ddef35 4142db60 41e8927c 4091b47f bf874a00 4185a9e4 c22cfd9a 4194a042 c1988f25 4210c9d6 c1e0c815 40b45f49 -> c1988f25 4210c9d6 c1e0c815 40b45f49", + "3ef3f900 c20aab54 c21a2d6d 419e5ae8 c120a82c c14d6610 4197a369 419e5ce5 c120abed c14d645e 401b8476 412d5838 4247d02e 422e2558 4116d0f0 -> 412d5838 4247d02e 422e2558 4116d0f0", + "4201a9d4 c236c153 c1c4d16d c2257ed1 c12a2868 c1ce7159 41545c2a 400060a0 4175ecb8 c11e8970 40d8605b 00000000 00000000 00000000 7149f2ca -> bf51774f befb23e1 be99853a 00000000", + "418093c4 c1bd9bab 41d55478 401daf10 c1de3e3b c10174f0 40b326dc c11aedfc c1b541e6 42023b14 40acfbe6 41a0c4c0 4210f9aa c1ad12c8 4238d7ad -> 3e918955 bdf5882c bf738374 00000000", + "c1adf1e0 41bb63d0 42074cd0 3fa03760 c1139548 c091a6a8 419ac7d0 c214f546 419a270c c140c958 40f41621 42380fa4 c201d9a6 421ce6ac 423ae897 -> 3f4b4872 bf167aca 3e1e6312 00000000", + "c13f8f7c 40f11490 c22cbe53 c1bf0742 408226b0 c1cdb4e1 41059a0f c24326cb 41fb8c68 4239d79a 40c8079c 00000000 00000000 00000000 7149f2ca -> 3e9d3c6c beaccefb bf63caef 426b1cd5", + "41012e20 c0ac94b8 421b5670 c23a8c5a 41c0a578 4195a6a0 40fc7274 c1c6f545 4212d5d8 c1e6b4c9 41318f2a 4183b164 c15e0808 4229e682 41cb9551 -> 4183b164 c15e0808 4229e682 41cb9551", + "c04bf250 41d7b4a0 403a9ce0 41e59e68 4117f3bc c2433999 4015359c c22268ec 4234c0ca 4199f4b0 419de8ec 00000000 00000000 00000000 7149f2ca -> 3f2b7489 beb09869 bf285a4a 00000000", + "4232f05c 41ca63f8 41cd2a3c c1b6c39b 42166c22 4218a792 411d8fa2 c1cab71e c20daa33 418c19d0 40b50ada 418bb2d0 41e43a40 c1c6e77f 41df8fa2 -> 3d0689b4 3f76349e 3e8b41cd 41caf655", + "414e2af4 41cae620 422096dc 4087d050 4245fc7e c0e4ed30 418993db 4087d050 4245fc7e c0e4ed30 418993db 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "c212b4f6 422e87d2 c2163c80 423fe72a 424469b6 c18803ee 3facc90d 41ff9ab0 400507f0 c24157ae 4177a0dc 00000000 00000000 00000000 7149f2ca -> 3e8bb0f3 3f4cf4b9 3f089140 00000000", + "c203ba23 c146f7a0 c1b1573e 420af2a2 41f4d5fc c2411291 4162e604 41e0d95c 423686a8 c0f66060 415e751d 42186fa6 c095d640 41511338 41a9b7b7 -> 3e1b22db beafc9b3 bf6d4a31 40138a16", + "42011fbe 41bd0b44 c1f4e5e3 c2248c7a c1db9b72 c0a4e2e8 4106dadd c2248c04 c1db9a74 c0a4e0d5 40d807e4 c20557f4 c1a3d15f 422921b4 40808c4f -> c20557f4 c1a3d15f 422921b4 40808c4f", + "40ce4eb0 4115d178 c22860d9 c1c779fc c21c05f1 4216b8d2 410b3137 c1c77801 c21c05d1 4216b987 3f5d7300 c1667718 c16dc788 c1526190 4211bc3c -> c1667718 c16dc788 c1526190 4211bc3c", + "bfb2c9e0 41c7d15c 4053d1b0 41cefe3c 4100e2d8 40dc4e60 40bb497f c18b95f8 c1736788 415ef1dc 3fe3e6f1 00000000 00000000 00000000 7149f2ca -> 3f5f3f3f 3eefcf1e be114ef2 411cda03", + "c185dbb6 c15c901c c1d49817 40429ac0 420a8c98 4093d910 40a9bb01 c1c62bd0 4201e7a0 c20c76be 412fec5c 00000000 00000000 00000000 7149f2ca -> 3f12a63a 3d3652b9 3f518608 00000000", + "4212246e 413dfbb8 c1f38946 40f18788 c1ce31f0 c205042c 4190d7f1 42093a5a 41377c38 42288946 41741b13 00000000 00000000 00000000 7149f2ca -> be9b43ea bed81752 bf5ab681 418c9c04", + "42021bc2 c176e37c c21c1f51 3f4dbf80 41ae7a7c c23506c4 4182f3ec c23f738f 41810420 41217dac 419db515 00000000 00000000 00000000 7149f2ca -> 3f288a2a 3d9d716b bf3faf4d 4246050d", + "c1d69dd1 c0dbf578 41b7e36c 41c80828 c21dc0e9 c033f5e0 406b33f0 c20a01ae 41ae662c c0bd6a60 411814f0 00000000 00000000 00000000 7149f2ca -> 3f32490d bf377a01 3d14f5a3 00000000", + "421d6f28 c1423dd0 c1aff83b 41c36634 c21d559d c21f6ff9 416a0485 c22fa0c0 c1ecbb46 c240e07c 4088ea6d 00000000 00000000 00000000 7149f2ca -> 3f7b9938 be0f7b9f 3df63fbc 4244bd36", + "c1cff99f 41f640c4 c10080b8 c222c9b8 3f67fdc0 c0a1bae8 413ae7b0 c222c96a 3f67e0f5 c0a1bbea 4193de21 00000000 00000000 00000000 7149f2ca -> bf0bd7cc 3f4e7ca3 3e67475b 00000000", + "41dcf22c 3fb259a0 c1891b2a 40c484c8 c21d1755 4221f46c 414c71e1 41d96d34 422d8110 c2088d72 415bc272 00000000 00000000 00000000 7149f2ca -> be3e172d bf3ab3ef 3f2894cd 00000000", + "42188702 c0a12f20 41ba7a34 41b50a3c c23cf145 c10a78cc 41272135 41b50c44 c23cf078 c10a780d 41867098 00000000 00000000 00000000 7149f2ca -> bf46f86b bf1ce168 be122aad 00000000", + "3fea0400 4235bc14 3fbbcb40 412be848 c08ddd20 420f2908 4142b070 422ddf3e 418a9f1c c22cc736 418416d3 00000000 00000000 00000000 7149f2ca -> bebdea7c be7c956a 3f65329b 406ba5d4", + "42256a5c 41c527f0 4194efe8 bee9bf80 c1aaf015 c2175147 41717c58 bee983df c1aaee72 c2175147 418fd0a4 00000000 00000000 00000000 7149f2ca -> befd4abd bf5e7a90 80000000 00000000", + "421e11ac 40d1bce0 40974d80 41ac20c8 413d2180 41f4cfb0 41875d9f 41ac20c8 413d2180 41f4cfb0 41875d9f c18f968e 4179a718 41b1bec4 4202d1d5 -> c18f968e 4179a718 41b1bec4 4202d1d5", + "c06958c0 41a54dd0 413d2988 c1b4983c c1918afc 420107c6 4175949b 421b30f2 40c08e18 421e9b64 4002bfe4 00000000 00000000 00000000 7149f2ca -> bf6ca8a4 bebab71e bde41a3e 40b16e20", + "bda63200 c18496f4 4234dede 422dba4c 422007c0 c20cabc4 4156bd6f 422dba4c 422007c0 c20cabc4 4156bd6f c16b94ac c10cc3f0 c21f0015 4228446c -> c16b94ac c10cc3f0 c21f0015 4228446c", + "c1f6015d c241c788 c239a6b8 414686a0 4118bf64 42298c30 41933f8d 414686a0 4118bf64 42298c30 41933f8d 00000000 00000000 00000000 7149f2ca -> 00000000 00000000 00000000 7149f2ca", + "c10f1cf4 41830458 3e88f780 c1c06cc1 c2161b54 c20db8e1 41874d13 c08c72b0 421c731a c1b9357c 404bbea1 00000000 00000000 00000000 7149f2ca -> be7b7bf8 bf7508cd be1d0aab 00000000", + "41882f8c 41f31140 c10eccb4 c1118214 4239bd8c c14c3674 4155ab98 c1b393f9 c1e0609b c225388e 418107ab 00000000 00000000 00000000 7149f2ca -> 3e291267 3f6bc4b8 3eb4b1eb 41f684db", + "3faa6dc0 c1c3189e 421363ae 4217c3c6 c19658c7 40d19c58 41043097 40d6bd40 410b2570 411b5694 41019c03 00000000 00000000 00000000 7149f2ca -> 3f3f9c1c bf28a8f8 bd9b0489 00000000", + "c1f72ddf 40f5d5c8 419dc4c0 41868aac c1d97c75 41651858 40eeb3de 41868aac c1d97c75 41651858 40eeb3de c207fd3e c202c815 4185b250 42302288 -> c207fd3e c202c815 4185b250 42302288", + "c08221c8 4228a466 419bc204 40f56f30 40fcfbe8 41a2636c 416ebf12 c1983277 c226b196 c1ea9a08 3e8bf34a 00000000 00000000 00000000 7149f2ca -> 3eb619f7 3f291b60 3f29424e 4263a9b1", + "c18e2b46 418f71f0 c2037eb1 412bc2b4 42448dee c0b3f510 410c4f00 424429c2 c244d621 421da3ee 4152dcf2 c20b2f26 c12c117c 41c26b24 41cbe19e -> c20b2f26 c12c117c 41c26b24 41cbe19e", + "4182fa64 4212ea8e 421ad280 416f3220 41d64e68 c1f9b654 417956df c2270704 c1f049b9 c212c6a4 40a9c43d 00000000 00000000 00000000 7149f2ca -> 3f346968 3f34c943 3d8b79c6 425967a1", + "c229db74 c195e1e3 c16da2e0 419a48ec c0e98ae8 c19793d4 3e0abd14 42372426 c1dd328e c1c346f1 4152f821 c22a3cea c1abc895 41125e88 41d1d105 -> c22a3cea c1abc895 41125e88 41d1d105", + "c216f0c6 4093fce0 4223e0bc 4205d806 c18ac058 418efef8 419f9a70 c1a1f568 41016cf0 4105b760 41524b97 00000000 00000000 00000000 7149f2ca -> 3f6474d1 bed8605c 3e21f07c 00000000", + "423e746a 4216dcd4 412666f8 c20fcaa9 419ac83c 42210920 40740c23 420f4c72 c21fd131 4152da6c 3e3d850a c0dbd198 40f555e0 3ea4a880 4204822e -> bf3d7f3b 3f1c9263 3e8effa6 00000000", + "404029a0 c16ab264 c039c7f0 c1fbccbe be97d500 41df26bc 4113969b c1fbccbe be97d500 41df26bc 4113969b 4067db00 c2423dd0 419cd7a8 41f57ef6 -> 4067db00 c2423dd0 419cd7a8 41f57ef6", + "bffa7260 4234b73e 4171e128 c19810c2 421e1a08 c21f2b3f 411efb8a 42361bb6 c1f2d86f c2168a3d 41696c6e c224b4f8 42272fb4 40faa900 4247d516 -> bf2da35a 3f3c0588 bcb9bc54 421942c9", + "c0ac7180 401896d0 c212c9c3 405f4c70 421e081c 40c74458 41814ce4 409aa6a0 c1ebd671 403e1da0 4123fa8a 00000000 00000000 00000000 7149f2ca -> bc9f5cf4 3f7faab8 3d411938 00000000", + "c185225a c1d844b6 41c24e60 401a06e0 c111eacc 421063a8 418cec80 41dc05b0 c247ee15 407ec350 415c61c3 41f249f8 42132762 c23d36f4 41766fef -> 41f249f8 42132762 c23d36f4 41766fef", + "c1b3d0b4 c0f954e0 c20f85ff 4133cf34 41416c1c 4201a05e 4171478b c0dc25b8 41e61cf4 c1bddbcd 4187c9b7 00000000 00000000 00000000 7149f2ca -> 3e97524c be8b4622 3f6a70a9 00000000" + ] + }, + { + "glsl": "vec4 cultmath_power_score(vec3, vec4)", + "tolerance": "ulp-bounded", + "cases": [ + "408d9aa0 c2231ce1 419b8254 41e028e4 41c09adc 4219f124 3fd83d2a -> c23cc23c c301b528 c2185ff4 45a0154e", + "c234afb2 41ebc238 c0af6888 c21afd02 c1a4a86f c12fc3cc 4177d1a4 -> c14d9580 42c83554 41301f10 45120e09", + "c1ebfa46 4243f5a4 42012448 4224aca0 41e65488 c2393cb5 4028ac35 -> c30d54e2 422196c0 431d307e 4634cf47", + "4204694c c14536bc c205019e 4218afb2 c211d8ca 419935b0 416cd593 -> c1223330 42411636 c2d19c76 4543f2e3", + "c167ada8 422176ea c0dd4180 409302b8 423acb8c 421dfcc4 40962893 -> c2189782 c14aa510 c2b9a4f4 451e7e3a", + "42232ecc 420a2b0c 4222c592 4214a65e 41bcd3c8 41c35bd8 4161e7e0 -> 40e886e0 41af04a0 42022f4c 4346517e", + "c15823d0 42405fbe 410c9804 420c6d92 41e20368 c218edf6 3fbf9efc -> c2c27686 421ebc14 42bc13f7 459b2e40", + "c0d90200 c191548c 3ff9d500 4247e436 c1db6262 41b066bc 4164b0b1 -> c2e30476 41941bac c220c96c 455b264f", + "41ac619c 402c2c70 421f64c0 412898e4 c1f55369 c17e4b24 415e4716 -> 41b02a54 42856c7c 42def789 45819feb", + "421c6a32 c24244e1 40d51538 c18a3f86 bef6db80 408813b0 40c05ff1 -> 42e189f5 c2c0572a 409a0310 45aaa888", + "c20e3568 42265eb4 c237f9be c2333f9e c1a5d542 c0f69be0 411602e0 -> 419428d8 42f94955 c2992642 45a71dfd", + "c126b5b0 40fec308 c23bbde0 c16b69fc 40ec4670 4186e0e4 4193be81 -> 41096898 3f93e4c0 c2ff2e52 456a3896", + "410884bc 42248928 4093e108 41c0f97c c202369c 3fe0af80 407b8b04 -> c1f96e3c 43135fe2 40b76a50 45b10ce0", + "c1912f78 c2449f2d c1baffb4 40889cc0 c11afd2c c243712f 41187b62 -> c23356a8 c29ddfe2 424be2aa 4523b016", + "423aa4a0 c23f7ca6 4018d550 c1aa2128 40f07c98 41da8170 40ba695b -> 4307da9a c2dd8c39 c24766c6 46013475", + "c11c23e8 c0037990 423323d4 422d3970 c1a1f248 c1ca506e 40cec416 -> c2d4426a 42118316 430c2606 45fa7af9", + "4232ea68 421322a0 c1c5fe91 413f35f4 4189f988 41d80dc4 40c5e0c7 -> 42831ceb 421c4bb8 c2cf062a 4580046f", + "c21ece08 c23fd97a 41098e04 c18f6e38 c23e0305 c21e29ed 41844afa -> c22e2dd8 bf6b3a80 42c08d6e 451d6110", + "4222fde2 41db0c38 3f6b3280 421bd4aa c10d8934 4244e566 410a41c4 -> 40652700 4290e869 c2c1389c 455f6548", + "40baa830 3f2d32c0 c22dc9eb 4247793a 421e2fba 41587ebc 406f5b3c -> c2b02434 c29b7aef c2e3e99a 45d0d41a", + "c0d9f9f8 411d6134 41f68698 4216c28a c1b7a499 42151fc4 40ef9944 -> c2b201c9 42832a9a c14ee3c0 453e16eb", + "c20fc1cd c2428092 4229461c 41b887e4 c1cef022 c204bc28 418a49cb -> c2ec05bf c2361102 43170122 4612e585", + "c247a32c 422f29d6 423aa688 40a094c8 4186d54c c074d2d0 411f2fc9 -> c2dbb5c5 42577e60 42c9f3b5 45c1855b", + "41a48494 c0c447b0 c2369b3a 421a692a c1c41b37 421c3044 40fae392 -> c2104dc0 4213094b c32965bf 45f2fca1", + "c15e48a8 c1fa6abb 41415108 41dd9a10 c21218cc c216e127 415747b0 -> c2a65f32 41271b74 42c73569 457d8768", + "c0f98e38 41de4068 c0b3cd28 41cb9e90 c1d69365 c090dc40 4175c5a3 -> c285010f 42da69e6 c00bc3a0 4570c678", + "41d00d5c 41099abc c2086f48 c203ea3c 4201a18c 40d1da68 4133156f -> 42ebf0ea c23e75ba c2a2aa95 45ae346a", + "40dc57a8 c2207073 c0a4caf0 c1da75d5 c2029325 4196620c 4168d54e -> 4288c5e0 c16eea70 c23f94c8 44c654b6", + "c2081ebd 41d3bd0c 42445960 c241c4b1 4240ef80 4240e87c 4179cdcc -> 41e697d0 c22e21f4 3fdc3900 43db3ca6", + "4202b4cc c19e1c50 423576e8 c21d5f44 c235db01 c1f5fd20 4139eb5f -> 43100a08 424d99b2 43183abc 4633c6f6", + "c207f65f 401202d0 41ec86a4 c0ca5d40 c24531a4 41b672e8 41975630 -> c25d556e 42ce51d1 41584ef0 45429c51", + "420d105a 4219d40e 41aca6cc c0dd7940 c18c1612 42049d2e 417dd769 -> 42a8bf82 42dfdf17 c1b92720 4595d2dc", + "c224c4ea c203125f 40a03f98 42387a5a c0d09168 4231f2c2 40aa3ddb -> c32e9fa2 c2520064 c29deacf 4619caee", + "c242be52 c0969830 41bf27f0 c1c87265 c0304040 4242ef52 4195619d -> c23d0a3f c079e040 c246b6b4 444fa062", + "c1ad1652 c1ebcc62 c22e8af8 41def91c c14b188c 423f6998 4103c009 -> c2c607b7 c206401c c336fa48 462c6c0a", + "40f37b00 41748d40 41e8217c c2056180 4237f792 41e085b4 40c6b91e -> 42a3d0e0 c275a884 3ff37900 45216814", + "42180a78 c1b3f40b 4107a9dc 417bea28 c20bb4b3 4242ed7e 416ccc67 -> 42321fdc 41c6eab6 c2a10307 4500394a", + "c213fbc9 c11a4428 c20dd99d 4130dcb0 c1c9e2a1 c192bcb7 40418f11 -> c2c032f5 41f9811a c208f683 45313e9d", + "c22c0cce c23150a7 c1fa24ec 405d25f0 41c09444 c2431648 4136c68b -> c2b9df2d c308cd64 420c07a4 45db2efb", + "418f7480 41737978 41735128 4234bb18 420d3396 c13a79d0 41249e0f -> c25a01b0 c220aa70 4256e57c 44dc350f", + "3ff94a00 41cfee6c 41ebb7b4 c0209bf0 c206501b 42361c10 402fd6b4 -> 410ea078 42ee4751 c200806c 456eadec", + "c200d900 c20a567f 41133110 c18e9ea2 c247fe2c c1f44fa5 404a0657 -> c1e626bc 41f69eb4 429ef416 44fbb56c", + "41f155b4 42274ea6 c204ba9e c215d4d2 41818fe4 c1be8d3d 4122c732 -> 43073fd6 424d0d68 c195cffe 45a2f1ee", + "4119cfdc 41248cd0 41533080 c1e0a522 41d6b248 41be6ac8 40830f12 -> 4296c688 c2046be0 c1a9a510 44dfcee1", + "41449e74 422d162c 41a47ee0 c1a1d096 41262fcc c1daa401 41440108 -> 42820fe8 42838a39 42bf9170 4585d214", + "4165df00 c16ed5d8 c211bf16 c226a136 c15de9b0 c2426f43 418ece33 -> 42e018f6 c0076140 41c2c0b4 453995c7", + "422105d8 41188518 c1e5bc9f 41c090a0 41fe2314 c1075470 418c859e -> 42017b10 c231e088 c2221267 44568e64", + "41bb1f70 bfce22e0 42028fec c1f728b7 c21757d6 c245b078 4193cbd7 -> 42d92414 4290e6bf 43242032 462670ae", + "c2092bfe c206f047 c1c36e5a c126a4f8 c1e232a7 422ce6fe 41324f62 -> c23f0580 c12eb79c c3074f16 459de712", + "c1ded958 421a8cd4 c23e6706 c1262878 423b2a2e 4089b5d0 404fa0a4 -> c20bc51c c1827568 c2cf9dc0 453ef3b9", + "40d820d8 c23afb89 c237339c c19f7b44 c1c9aeb6 4136bff0 415e6f35 -> 4255837a c22c485c c2e4e398 4585099c", + "c244fe13 c1015640 c009ae00 4234479a c18deb02 c18d7e5c 418e537e -> c33ca2d6 419a7fc4 41f89138 460b47e5", + "c0a3c5e0 4217af84 c21d53ef bfe386e0 c1df4312 4195c71c 411c887d -> c0d5c850 4303a886 c2e8377d 45ee19ad", + "c1f98a60 4217f818 41961010 c20e6118 c2275641 c1826662 415a77d5 -> 410cdf40 431fa72c 428c3b39 45e8521e", + "41a728e4 c1f8ee92 c178b648 420be75c 4214f42a 41afb89c 405a47cd -> c1e14ba8 c308b5ba c29609e0 45c3d019", + "c09bac70 41e38710 421c2946 42157f86 c12d81cc c1d82f8b 4044de6e -> c2a8f514 429d23fb 43042086 45f01348", + "41c2ca94 41ddc764 c0af86b8 421ddc2e 412e98b0 4184cf00 417799fc -> c1f1db90 42067b0c c230b0ae 443dd99d", + "c24522b2 4226ece8 42259218 41c5976c 420e532c 41891eb4 40f4d801 -> c313f734 4144cde0 4242057c 45bcc772", + "c20af3a1 c168ee90 c2095c8a c205811a c1b239a7 c2430466 40c1542d -> c02e50e0 4177097c 41e69f70 4368b67a", + "c1d7bc8f c2126d4e c21f9fc4 c09f4d60 41259214 41b2188c 419f98d9 -> c22fe937 c2bbd1d3 c2f8ac0a 45c0592d", + "c2221402 c1e2fa6a 412d9110 4203beea c0882568 c1825cac 410f27eb -> c312e976 c240f110 42592534 45cf5124", + "c21eeb9b c1ce0e42 c1c87a8a c02fc6d0 4188caa0 42236674 41610ca9 -> c293ef2e c2ab6c71 c303d1dc 45e5b57a", + "c1b6c864 c0ddfd58 c21ee45a c2415f01 c234b30d 41e584a8 40c16e98 -> 424bf59e 4298f362 c308d357 45d31f0a", + "c0e006a0 41bb0ba0 41a6013c c21a439f c1e226bf 420c649c 4124fd76 -> 427c8596 42ce9930 c1e58ff8 456b3908", + "41654408 c1794450 c0b1d138 c245be59 42315b38 41dc1e78 41920c13 -> 42ff0f5b c2efac4c c2844963 46038285", + "41a0d43c c19ba456 42270cce c122a0a0 c18484a0 422df3c4 3f8bf5dd -> 4272248c c0b8fdb0 c05cdec0 446791e0", + "c21b3484 4222e0ba 419af6a8 4129f774 c21e6adb 411ad954 41997134 -> c2c5b261 4320a5ca 419b13fc 4606b2e7", + "41a2a4bc 42474498 c0d45558 40b0bc98 422e49f2 419efd80 415546c0 -> 41eceb2c 4147d530 c25412d6 4443d3ee", + "bfe060a0 422063a4 41ac0514 c1cfe29a bfb25e20 422c91f6 4113e024 -> 4241dc90 42a5f695 c22d1ed8 45283957", + "421f49f2 41f3f9c4 c053e130 41b61430 c212a8c8 41e78ba8 41373e15 -> 42087fb4 430652d5 c28103e7 45b277cb", + "c215ed80 c1fbe24e 413d249c 41ab1e88 420cce90 c1c8f3ce 40cdb495 -> c2eb7cc4 c3055fdc 4293c30e 4610516d", + "4202a514 c2427ab5 3f4fa100 c21aa884 c1c4a374 40aded30 41967225 -> 430ea6cc c24051f6 c113f910 45a6a820", + "c17656a8 c243af7c c09eaf60 c244eeb9 c2296f83 c1c9f703 408e61f8 -> 4287590f c151ffc8 42224b2b 44c5784c", + "c118d744 c1edeb79 c208b6db 420b50a0 c2469e31 4110d258 408b5359 -> c2b18671 421f50e9 c2aceb71 4583c140", + "c21f1c27 c1da8d32 421773c6 423c3dec 41f5e100 c132af18 4139acb0 -> c32dad0a c2e83719 42c41f8c 464df1b8", + "41fa6b7c 41fc585c 4208884e c226849d c0a03ac8 c1751b74 41526ce0 -> 4311dd2e 42923387 42c5cf2b 460b7e46", + "421ade5c c1ea77f7 c21548c8 c1d6826c c144aec4 3ff89840 41316a50 -> 43030fc9 c2082095 c29d0d8a 45bb93d2", + "41eb58bc c2416828 41aff1a0 c2313945 40860ab0 c16cedcc 416712a7 -> 431372d2 c2d2297e 42933443 4611f610", + "42410496 c07fffe0 42123ea2 420b6cc2 417d4610 c21e4ddb 41683eae -> 41d65f50 c21ea304 4318463e 45c0773d", + "41e597c8 414f2afc c20ee671 c0aa11d8 c2059694 c15d04e4 412b4fc2 -> 42880e1f 42b96153 c22f4a70 4565644d", + "c1f3b752 412e8718 422995e4 414a5f58 42204b5c 40c8a9f0 41264f2e -> c2ac737f c269532c 429080a6 457425d6", + "4246463e c23b6e12 413a475c 414a35fc c22b902c 418143dc 40c75c6c -> 4293b8bf c0fdde60 c11080b8 44aa2565", + "c1e7bce1 c208850b 42257732 c1bba1ab c2397053 420ef78c 4185032e -> c1306cd8 41c3ad20 4133fd30 c281af16", + "c1674f50 423e49aa c1d3e2bd 41e94e48 c1cdf204 422c96a8 4005fd5a -> c2ae7af8 4312a156 c30b4403 463d68aa", + "40f7ca30 42419daa 41e40208 c1e72a3b c208fa06 c24054fc 41404457 -> 42928e64 43254bd8 43192b00 4659175c", + "c11427bc 41ecc5d8 c0de88d0 4161d7e8 41e75e9c c1ed4708 419de86d -> c23affd2 3face780 4235a4d4 44283184", + "c0e48f60 c1c8a666 c1de417d 410b86c0 c0b77e48 c105d8fc 413935aa -> c1fdce70 c21ac6d4 c21b54ff 44593ca0", + "c03b0360 c1d8bb46 c1fee2cb c2142641 3ee39d80 41a206e0 4186840d -> 4288760b c25c49bc c2d074d6 458819e4", + "41556070 41970e84 4205f0b2 417d1170 4151fa54 c1049a88 4106c577 -> c09ec400 41384568 42a71754 44d62a85", + "c2350bbb 420490d0 c1077588 422569da 4163dba0 41a75ee8 4180a028 -> c32d3aca 421733d0 c26b19ac 460441de", + "c15b9fdc bfd6f680 4146e4c0 c1ca3f44 41766c40 420972d0 41945b05 -> 41b8deac c208a588 c22f7340 440c95ea", + "41b539bc c242d0a0 c1ec7519 41efed90 3fc19d00 40168230 400e3c64 -> c16acf50 c2c8dd88 c27f455f 45604c2d", + "41cbf698 4125c9ac c2276edc 4174fb00 c192b0da 41cf1fb8 41780e1e -> 41a2f230 426595b0 c3077f5c 45a4e6aa", + "c21d2456 4118f8cc 4241319c c208cf46 41e5063c 40db8af0 40f5f105 -> c122a880 c21889d6 42a5c03e 44ffed50", + "c1039014 41f57948 418aefac 41f0329c 41a5b498 41dafdac 40100163 -> c298fd53 419f8960 c1a01c00 44cf2b75", + "41c4b420 40b6ab58 4218f960 420c2c2a 420f90a2 42253a12 41912ac7 -> c1a74868 c271766e c0c40b20 442f1b1e", + "418cafc4 4150acf8 420f4d96 c2198e53 421d713c c196b902 40bd6b9a -> 42dfe635 c2528bfc 42daaa17 45d3d96e", + "c1d9c331 c184dd0c c1bfa9cc c18b6152 42341f98 c23c7277 40a5f59f -> c19cc3be c2f68e1e 42393b22 4589a455", + "421b0a1a 41621e50 c224505c 421317f2 c1b3fd1d 40922250 40c7d148 -> 407e4500 42928622 c2b694a6 4553e43e", + "c1eb1a88 4044d9e0 4247dd78 41f66534 41c7d29c 424771ba 3e8fa885 -> c2f0bfde c22f3760 3e577c00 45803136", + "c2356300 c1f0d07a 41f22528 c0874878 420a55ca 4212e2b8 410aebf8 -> c2a479f1 c3015f04 c14e8120 45b68a14", + "423a12f4 c2161bfa c23740f3 421d11e4 c1c26442 c2247f2c 40785a96 -> 41680880 c1d3a764 c1160e38 436a7f67", + "c02d4d50 c10acd10 c0236090 41cd7568 41c3e298 420cfb60 41897036 -> c2631f12 c284a490 c2973169 453df327", + "42264dd8 41ea937c 4241143a 41063cc0 c15428dc 411ce968 41172a1d -> 4284bea8 42aa53f5 4299d9e0 45868562", + "c220225f 420f701e c19981dd c20e7812 c1959c78 c1ad5082 406d41e6 -> c10d5268 42da3e5a 409e7528 453acc82", + "c2120649 c0873bd0 42133866 c21e3630 c207552f 4201b898 4193a5f3 -> 40c2fe70 426cdb6a 410bfe70 440d1846", + "3fd47180 c2350f69 423e060e c240cc6d c089e458 c2187cb1 416b0cef -> 42c76ff9 c2a3d2de 432b4160 46303e83", + "c218ff1e 40213830 c2338818 c24607ff c20d89a6 c20baebd 402cf3dc -> 41b42384 42979d29 c19f656c 44ceec01", + "c116c7e8 41fffcb4 421587c2 c00a0000 c1b8af46 42389ea0 418a9746 -> c1688fd0 42dc55fd c18c5b78 4532fe63", + "c1bb182f 41bafff4 41c713ec 42319c1c 41f4522c c24483d3 40da6d73 -> c307941a c16548e0 431406e4 461d787d", + "42363436 412a4648 4173c390 410519ec c23cbd37 422e58d4 4100b189 -> 4294edbb 42e74ec9 c262cfe0 45aaea68", + "41c4b24c c244f1d4 40d2dce8 42243254 c0048f50 41bd3b28 419d28c1 -> c203b25c c2bca8df c20883ee 45160cd4", + "c18546c8 c1c271ac c2107013 c2054496 c212f984 c233cdc2 4169c514 -> 42054264 41c702b8 418d76bc 4394708d", + "415c68b0 4245b0a4 4149a740 421d0274 421119f8 c2313e2f 40a2b23f -> c24bd090 41d25ab0 42e3a7ff 457c346e", + "c1951ec8 c1db07cf c22a6889 41726980 c21bf8de c127a78c 4054b8b8 -> c28729c4 41b9d3da c2807ea6 450f9974", + "422781f0 c121e3f0 c0fa73d0 c218cc6f c1e40f20 41b949c0 4153b59c -> 43202730 42131d28 c277e6b4 45eb7c8d", + "41f9e05c c199a7b6 40d96d70 41e7e2a4 c1dbfde7 42195894 41954a4c -> 408fedc0 4184ac62 c27c55cc 44341db0", + "c01472e0 412fe820 41ddc164 418a4530 423749f0 412e1710 40cd8bc3 -> c21cd38c c28b4fe8 4206b5dc 44e5f228", + "413383b8 c23d78eb 41988810 c205d72e 42179702 c20c855b 410b3c2c -> 42b2b81c c32a87f6 42d8c963 463d8031", + "41e12428 bf4ef680 c1c0d018 c151405c c17de220 42001014 41059eb4 -> 42a4e22b 41f0f2b8 c2e07820 459c6ace", + "420f4024 41adbcd0 c2347826 42270e0c c190e545 c22c4930 4184348d -> c13e6f40 429f510a c082ef60 44a91ba5", + "419508fc c230c3de c21eeede 415c63a8 c20296c3 c191cf4f 4186048a -> 411b5ca0 c1b8b46c c22c0e6d 43a9605d", + "413a0840 c1a29273 423f77c8 c20b42cd 41e520b4 4209b2a0 40c66cdf -> 42b9c4dd c2c3d994 41d714a0 4592c3ac", + "c14c0040 41b8dafc 42350ac0 c1833d24 4104a8e8 c1d9e752 3f371d22 -> 40e9e820 41ed0d10 4310ff34 45ab8300", + "41fcd000 c198d48c c0fdf4b8 42197994 c22eb780 3fe79420 41469654 -> c1588ca0 42449a74 c19bece0 4413aaae", + "421d1ba0 41b6b1ac 41cc2918 415ef244 407cef40 bf43fc80 41943426 -> 424abe1e 421713c4 425248fc 44a85432", + "423b4af2 410ccb9c 4030fe90 41a45b88 4204624c 4118c2fc 4058be41 -> 42523a5c c2425eca c15906b0 44a46cac", + "c1f3e542 c1afbfa6 c1e21a94 40afb8f8 423e5d74 c21cc658 411c3941 -> c28fe9c0 c30b1ea4 41aee438 45c0693a", + "424270ea c22182e5 4102b274 41bcc644 4208aa78 41eb97c4 418b592b -> 42481b90 c31516ae c22a3e8a 45c5dfda", + "41c74cd0 41919f70 41cb3ea8 c21bdf43 41efb770 c1e181c6 4167f666 -> 42ff85ab c1bc3000 42d66037 45d70987", + "40daef80 c1dd398d 3fa01440 c1ca7d36 c16cf5b8 c13eedac 4102519a -> 42809c8b c1cd7d62 41d2f034 44a34716", + "c20ec568 c0f02950 4150cea8 41c98fdc 41536e60 42124e16 41474a2e -> c2f38d56 c225c184 c23c34d8 458db7c2", + "c23c8a73 c1ed629a c188fb12 c22514f4 c10ff420 c212c788 41912434 -> c13babf8 c225688a 421c93fe 4400f3e2", + "41536eec c2029810 4221596e 419e48f8 419e4858 c231c013 408eba2c -> c1524608 c2d1bc3c 43298cc0 461b9d80", + "4222632c 41dae128 4118341c c23b796c c1443974 c0bab358 41492540 -> 432eee4c 429e7ef1 41f58dc8 461146fe", + "c231430d 41a3e42c c199948e 41466b88 41b5ea28 c22774c8 418702ad -> c2e2ddef c0902fe0 42355502 4557ad2f", + "41890488 423478f4 42419b36 c1e8623e 422b7dca c1c87c3d 4166fffa -> 42b8b363 408fb2a0 4312ecaa 45e4eb94", + "c007efa0 c0ef1910 c23eca4e c1309d00 c225f95a 41fd776c 4195dabb -> 418ea118 42881638 c31ec302 45e09b13", + "c23404b6 412e9cd0 409ce748 41767998 c18bf6b0 c1fbdf1a 409a3008 -> c2f1a31c 42634518 42918c76 45b3e92e", + "41722908 c239d95d 41b082b4 c1c42c16 c0f2dbf0 4245ab30 419b82d0 -> 429ea04d c29b7ddf c25ad3ac 4557e14f", + "be236200 c23fb343 c06afd70 41921bc8 c23352c0 c22e8b9a 4199c567 -> c213628c c0c60830 429fdbc3 44c51635", + "c1de2206 4227be3a bf954ca0 41d74cc4 41f4fc18 be0c5100 41099f8a -> c2dab765 41b500b8 c003c280 453e4dad", + "c172b12c 40e6bab0 4162b750 c1a62a06 4147b778 41985a78 3e72d3b2 -> 413345c0 c128b440 c11bfb40 42a5c428", + "c221b51f 41cf31a0 423bfc7c c11c3e50 421e7ac6 41297b98 3efe2e2e -> c2754b16 c1db87d8 42919d96 45195643", + "42265250 c1bd4c4c 4235e4ec 3eeca380 c1c3d29c 41c6f084 419cdf62 -> 42a47909 3fd0ca00 4224d954 44d86ef7", + "c118bf7c 40bf2c40 41a595b4 c23aa69a 41ca8ea4 423e28bc 41848ea0 -> 429476bb c21ac394 c256bbc4 45095c3d", + "4197d1f4 c22fb8b2 4219f802 3ff0d360 41953988 41f7ea88 40c42bd8 -> 4208c4be c2fa5576 417015f0 45841d64", + "c06b0b30 c2286c7a 4238fef8 41ef6d48 c19d041a 4239f6f0 4101cfa8 -> c2866757 c233d4da bef7f800 44c411e1", + "c1be9827 bf2b1500 c1afc50d c209cd85 c0875408 42306176 40c665f7 -> 41aa05c6 40e3e2d0 c30421fe 458b1f6c", + "41799178 40570ae0 c1bc65c9 40a33ad0 41c7f6d8 c0aa1200 41970cf1 -> 41a7f410 c22d157c c211e149 440a92d7", + "c2430e32 422de2f8 c1c0dcd2 4214a68e 41ac0900 c2004aa3 4102db3f -> c32bda60 422fbcf0 417ee1d0 45f5b3d7", + "419ea304 c225fb86 421969d0 c1e843ff 41ecd344 41ad82e4 4111af75 -> 42c37382 c30e3294 420550bc 45eeab40", + "c1fc7357 4244e5f4 41a44544 423498be 41e302a8 40f89550 403c3d23 -> c3196935 4226c940 41cc3fe0 45ca4587", + "c22d6e25 c0ea94f8 421726ea c1a39c5b c23a38bb 4006fa00 3f45c3dd -> c2373fef 429ce61c 428eb74a 45507aac", + "402d69f0 4140ab9c 423b1f40 422ea158 c15b21f0 c1613414 41112bb4 -> c2a3cab9 424de6c6 42f36c45 45ba421a", + "c20e4f73 41a2dac4 422b1018 410de5d0 41e48324 4246afd6 4135018a -> c2b1c8e7 c18350c0 c15cfdf0 44f55118", + "c112c338 c125315c 4232547a 418157b8 c1dcbff8 420d99a8 4117bd4a -> c24ab954 420a274a 4192eb48 4469af78", + "408455d8 40bd53b8 411f3a6c 423a7a1a 4213ab16 41f0cebc 419764a7 -> c2a9ef5f c278013e c2213186 452fdc62", + "3f4d6600 c13e5550 40f3a5d0 41907a78 417d16f0 c14c8ad0 406070bb -> c20a0f48 c25db620 42232edc 44b7b507", + "c06266d0 42264a8e c1b586af c0d66f08 c163c620 c2475a7c 3f6675a4 -> 40ca7740 42df3c16 42592e49 45714cc5", + "c1a90eda 41de251c c15b82d4 42473fbe 41018b54 40fdce50 415327c0 -> c30de396 421d5f72 c22d34fe 45b29583", + "c23c0647 422cd270 415617dc 41f84e80 4185abf0 40c73480 419dbae1 -> c31c16c4 4253f8f0 4164fb38 45c9bbd5", + "c22f7f91 c152bd68 423c273e bf1ce440 40ba5ce0 3efec600 414c2a94 -> c2ad0c00 c217f5ec 42ba29b2 45845ccd", + "c18dfa96 c16d9290 42233c38 c2150429 41474a24 c12c61e0 41970764 -> 421c0dbc c25a6e5a 42ce54b0 45566631", + "bff2dca0 418a2fa4 c1d90c87 4212918e 420cf424 c0dbbde8 40a41ada -> c29a2873 c20fb8a4 c2221d0d 4509060c", + "41e12fd8 c1d2a160 423b3a5a c1a96f7f c1dea4d9 c1a9c56b 4119d279 -> 42c54fac 40403790 43080e88 45d9d760", + "c0a33e20 4230eec4 421415fa 42446fc4 41f7ed78 c1fba204 4102087e -> c2d8d788 41d3e020 4308f37e 45f1c7e5", + "4097cf48 c19dd52b 422fa5b0 41ef85b4 beac0400 c11994b8 419a9c7b -> c24991e2 c21b251b 42d60ade 455acd1a", + "c0ec4678 c090e760 421443e8 4236904a c1fa5b7b 41ab9a14 41305fa9 -> c2d41919 425621a3 41f9db78 45642634", + "c1c08ac4 c117cf18 423195b4 41fbc3a4 c213a1b4 41ba737c 40b55ba3 -> c2de2734 425b5bdc 4228b7ec 4584c814", + "c2135eaa c247131d c1eb77a3 c182c3ee c1e23f7c c208c0ea 418bde16 -> c223f966 c22be6be 411828c4 4415b1b8", + "c1114da0 c238d9c2 c21173ed 41fbb798 c1ea8eeb 4080e3d8 41956d48 -> c2a22f34 c2072499 c2a19068 4548be89", + "c14ff65c c1a857e6 c22d314d c166cf50 c23d128f c1aac76d 40e577b0 -> 4036c7a0 4251cd38 c22f9b2d 448c06e5", + "41e1987c c221098e c1869016 c23a24af 40ea8208 422bab40 4077f4d5 -> 43157876 c2be59cf c2eef34b 46322e15", + "406e28a0 422a8046 c201720f 418f30e0 c09855f8 c2168f60 410602ec -> c1e2d798 42bd8b05 4128ea88 45164209", + "c19faef3 41bac304 c06db300 c1b07094 c1cb4887 c222f49a 3ee030b7 -> 40860d08 42c305c6 4294196a 456a8252", + "c1050cac 41bb6fac c20f4b82 424019b8 c2024f72 413885b0 418e605b -> c2e15ce3 42e00748 c2bd6cee 4600b3db", + "c219c7d2 4216c702 c08352d0 c21e8f24 c0ab1460 4229c7ca 40e1d02e -> 4018ea40 42ac298e c2ba3224 45782edc", + "4221f670 42158c38 c19e7a8e 41664008 c1d8d856 419319b4 418b9e3e -> 4250ccdc 4300fc32 c298ca21 45bb57b3", + "c21b5a07 4237fe22 c211bca3 41cb8694 c1055090 3fe2d3c0 3fbe27e4 -> c3008ea8 42d95246 c298d341 4605742c", + "40b39460 4126a788 c2297b89 41e12368 c1f4de3b c18153bc 40ebba51 -> c2343e50 42a41900 c251a356 453070bf", + "c15b0590 c1f7f912 c2323e68 c1218134 c194ec57 c19fb52e 4107db93 -> c0e61170 c1c61976 c244c7a2 442ec9de", + "c23446bc 41adf094 40f13ca0 c245a833 c1f0ae54 c22d7c86 40ff0c26 -> 410b0bb8 42cf4f74 42cba41a 45a38a7a", + "420fd548 c2079de8 4158ded4 c2413818 c11205cc c20dff76 40c590ef -> 432886b0 c24638ea 42c4372b 461d8979", + "41db7368 c2458edf c1db5322 41ce0964 c220f532 41ffbca8 4133b8f7 -> 4056a040 c19266b4 c2ed87e5 4559eab4", + "c1b5c5c1 c13bbb44 c18e41b2 c1c5e6de 4109c6a0 4241c5b0 412e1b8b -> 408108e8 c222c0f2 c3047344 45926a75", + "41931184 c1c9fdbf c1cc1f63 42260a02 c13a623c c09f0270 3fab8527 -> c2390280 c1d99942 c2245ec7 448e8447", + "c1cdf451 40c0de48 41c6d6fc c1e1f9f4 c09b66e0 418b4f98 415f6082 -> 40a02d18 41ae2294 416e1d90 c16d3fc0", + "c0b5c1b0 c0bd99e8 41d39398 41e424ac c1f554d1 c2300774 413d12c1 -> c288ca8c 4245ee57 430ce8a0 45ce6e60", + "c1fcdb54 42036b2a 41626c00 c1e301f4 bff71d60 4210e4bc 4178d872 -> c0cecb00 428b2415 c2309378 44b7378a", + "c18431ca c1c56f27 41ca9678 4134dcb4 c2274236 420d7a42 40663b54 -> c25ea024 42091545 c1a0bc18 4490804c", + "422560f8 c12ee268 c21f4219 c23de8e4 419bc1b0 c1cdabb3 412ae948 -> 4331a4ee c27332e4 c1e1b0fe 460b098d", + "c0ad5538 c01150e0 40800d68 4169dea8 c20dc979 4211285e 4184dea3 -> c22044a2 4284b46b c28126b1 450dca73", + "4230c46c 40b8aad8 c0505c50 c12b8fc0 4229cd26 423532ec 4120c52d -> 42dba85c c292b7cb c2c238b1 45cecd16", + "c101a824 41255538 419f15f8 4221205c 410cebe0 c1ab5edd 41915260 -> c2c18a65 40434ac0 42a53a6a 45687bf5", + "c19a5948 42462042 41272f5c c150aa98 42002d8c 40050be0 412a4613 -> c1480ff0 420be56c 4185ec64 4396d82a", + "c233faa3 418217cc 41cff674 be0b4000 41fd9ccc c2312ef3 416c9c11 -> c2b36f63 c1f70a00 430c9516 45d9e6ea", + "c16dff20 c21f66ac 40e03ae0 c183dee4 4247bc5c 4232c6d0 40fd5c13 -> 404df540 c3339184 c296bf74 461335a8", + "419c6624 c1ab5dff c1dfc9c4 c2090f5b 42204756 418cac34 411f0b10 -> 42d7426d c2f5f656 c2b63afc 46073745", + "41e5e430 c11b3450 c217093f c21d5a20 4236d996 4146547c 40372300 -> 4308261c c2dda6aa c2c89e5e 461f9003", + "bfe6aa00 422e35d4 c1b2bb61 c18bee06 c17ca17c c1a022fc 418ec8f9 -> 41fb06cc 42ed5e33 c094c328 4557e780", + "421e0976 41a5fe00 421da750 c21d0140 421e61de 41d172e0 3fb946e3 -> 431d855b c216c5bc 41d3b780 45d25b35", + "3e3bfa00 c2147c62 40d87e68 410dfa70 c180ec7a 3fbf81c0 41445289 -> c18b0a88 c2280c4a 41289df8 43c4fd34", + "41a79e84 c1393d18 c1e63695 4227e634 4209faa4 c239e42e 40aa7ad5 -> c2282de4 c2b849ea 420d91c7 453215c4", + "c1c04e0c 415c11e4 c12cc484 420ff4d0 c0d62090 411eec04 418b3030 -> c2f01bd6 42239116 c225d844 4581a2c0", + "c2059c80 c1a535e7 c243f86f 417b92f0 416b6130 3dc73e00 41803986 -> c2c4813c c28d7340 c2c45c0e 45b5c680", + "40fa9000 c18b1866 c2340e1b c2461a88 42259caa c0ea55f0 40b90649 -> 42e56c88 c2eb28dd c296c35d 45fe2901", + "c1b4a165 40af37a0 3fe4e8a0 413d3f4c c21c66ee 402e1b30 41778cc0 -> c289a086 42b24de2 bfee9b80 45374572", + "40a428d0 c22e4266 c11774dc be918100 c1bc5a9f 414eaf30 414bef4b -> 412d40e0 c2202a2d c2331206 44402da8", + "c22c0579 3e587100 c1c9ec21 c06da0f0 c2070192 c1f13f93 40d91406 -> c29d2b6a 4287da03 411d4dc8 45273846", + "42061e92 40b841e0 422c99de 419962f0 c2426790 41f8ed5c 402d86a0 -> 41e5b468 42d96fcc 41c08cc0 454e2815", + "c230c313 c2070d30 422600bc 422c5df8 412d9a44 423edd26 419dad42 -> c32e9086 c2b273c1 c146e350 4610aab8", + "c226e27a 4215a79a c1ceb604 c18cba48 c22b26b3 c22145e6 41454fbf -> c2410aac 43206726 41e7ab90 45dd00ef", + "c1d8b11b 41279324 c207f842 c13be990 4214b7d4 c20606de 412375c1 -> c1f578a6 c255a616 bf78b200 44531d26", + "42019b5c 41f1cfec 4085fc40 41c93c78 c1d955e9 4233dda4 410d599c -> 4167e900 42e592ea c2a31e1c 459a1b91", + "4246deba 410a3598 422a9e5c c221ff5e 41acd60c 4161f8b8 411ea2ed -> 43346f0c c1cf7680 4264405c 460cfbd1", + "4220caca bf777cc0 40d3f828 4179b078 41733a90 41701b40 419df4a2 -> 4244bd58 c201592e c1861f2c 4408a8ac", + "414cc35c c2459b0f c2107ceb c223dadf c21f59e2 41b0f428 41429a37 -> 42d70bb6 c19904b4 c2e8f6ff 45c28ee8", + "42352372 41d92440 c198a849 c20f1f64 4169f628 41449728 409842c0 -> 4322216b 41c85258 c27af3dd 45f04dad", + "c15fd498 c14afb30 c2004044 c13fb9ec c23d007e 4094c790 3fe6dfcb -> c0806ab0 428a41b2 c292d936 451ef3bc", + "c1a9cb99 c193f2b8 c1d8bb8c c16646e0 c08e20a0 c21769c8 40d3883f -> c15aa0a4 c1e0d520 41ac3008 439e20a2", + "c21a3d44 411622e4 41b532f8 c1e02da3 3fbe4a80 4007a770 408009d4 -> c1a899ca 417cb328 42243e0a 4410b88f", + "41ed060c c11b0e38 4180f234 c2155112 c1d938e0 4205199c 3f7b6dca -> 4305ea0c 420bb1c4 c2094104 459ecc7b", + "41fbf688 413bca00 42352004 c22c1285 c240a79d c1c0b2c6 412e21ff -> 431506e4 42ef9a1d 430abcb4 46582781", + "c2191f28 c13502dc c1b34acc 41473c8c c21e9223 42209e34 40dbda4f -> c2caee4b 4262a2d8 c2fa439a 45e25d63", + "4198bc9c 4223e0da 41bb6db4 4169a8c8 411f8f70 c1b0cb13 418647c6 -> 410fa0e0 4277f9fc 42b61c64 452d3ffe", + "c200f698 4104497c 4228f76e c21374c9 c21f54ae c238c8f3 41351f53 -> 4113f188 42c0670d 4330e030 461cb0a0", + "423c04c2 3fe8d420 c1c53ad0 41ef37e4 41aafeac c2377c79 411823e4 -> 4208d1a0 c21c716a 4229be22 448155e0", + "419e2848 c1b2fb96 c1aafe67 c0c8e3b8 4210ef9c 41e43974 419f8e21 -> 42506136 c2ea6d67 c2c79bee 45c1ed84", + "c1ea6d1f c09e08f0 41186830 c10dee28 413f7110 420e53e0 400c95ac -> c223760b c2073ac4 c25073a8 44ac2af2", + "bf2919c0 422ac240 bff76860 414dfed0 40abf930 c1eb4ae2 414c893a -> c1d8906c 4295431a 425bd45c 45077500", + "c23a1fe0 c23bd769 422f6242 4226ad12 c1df20e0 423f381a 4041cf2f -> c3306679 c2188df2 c0fd5d80 45feab3f", + "421378a8 c23f07fe 42023332 c13045dc 42101aac 4212f7b4 419eebda -> 42bf8a1f c3279155 c1062410 460b9e93", + "41557a98 c0a64f98 c1e8f2b0 41bde884 bf209100 42087ed2 419b52ce -> c1a65670 c1123d78 c2fcf82a 456a7998", + "c2132c83 c18a453a 41b00d80 bfe61e00 c1fe39a8 c084e710 41195db2 -> c28bfb93 41e7e8dc 42514744 44fd67a8", + "41121180 41da3bb8 c203e3c2 c207ffd0 420628f8 42062d12 4154b3a5 -> 42ac8430 c14858e0 c305086a 45c01836", + "c1cb4cc4 c17385d8 40036770 41620030 41f5c940 420c05ce 40da9f52 -> c29e266e c2b7c616 c283cf57 459349a7", + "c0e5c900 41d7cdb4 c23f6a12 41cf832c 42435c2c c21b2572 4189b50f -> c2847ab6 c22eeaa4 c1911280 44aa1c8e", + "c0073cc0 c1b683d6 421c8b72 c22ffe97 c158910c 418563cc 41907f66 -> 42a78acb c19476a0 4233b318 44fc5a1b", + "41a29668 c1e148fc c0d10ff0 c238739c 3ffa9f60 418865d8 40b3d6d1 -> 4304df68 c270f2f2 c23ca9d4 45b6abea", + "c1c84bb1 41785bc8 c1d8234f c23e0e4b c23b355e c187d3b6 40f9fdc3 -> 4233d0e5 42f94c50 c1a09f32 458a6a7a", + "c21fe87c 4196a060 c2218bca 41953238 42447906 4153bcbc 4161b695 -> c2ea8198 c27251ac c2d67af9 45dbb53c", + "40b7b448 419ee1a4 41b21af4 c1f4f201 c175ddc4 413ab0d8 40159528 -> 42916f8a 428ce843 41a98510 4526db0f", + "3dbf8a00 c1b0de66 c2200139 c03b2c50 c20484d4 41d04ec0 412e6077 -> 40c128a0 41b05684 c304144c 4588a83e", + "c2143cf9 c225a78a 4123ce98 c1a9e0b7 c2002d1e c22fa380 4069d0f1 -> c1fd3276 c195e9b0 42d89726 454b8d45", + "c21a3019 41e94f2c 41bb9fc0 4236918a 41e188d0 c0308140 40f45151 -> c32860d2 3ff8cb80 4251afe8 45f12bbe", + "4105b798 41ec2e78 c14a5ed0 c14a7520 c23a3d49 c1f0fff2 40402009 -> 4228165c 43182a42 420bd08a 45cbf382", + "3ffd55e0 41a9a114 420a0564 c202b394 c232794a c20603e4 416ffc0c -> 428a9e43 4303a4ea 430804a4 461b36fe", + "c145e768 c214106e 40ad23d0 42114f76 40df7628 4209f69e 419b5af8 -> c2c2c950 c2afff33 c268a448 45953ead", + "4123dee8 bf1fdc00 c121da20 41f94c48 40e49578 4021fe50 410e9cb4 -> c2275cd4 c17890f8 c1ca59b4 44109faf", + "4222c93e 42433d9a c1d21514 40ce2130 c20e4bb5 41bb06f8 4192d813 -> 42890518 4328c4a8 c2c68e06 4622d49d", + "bfd0cde0 41b52cf4 c221157d c212478a 40c53ad0 c125190c 4143b361 -> 428bc11b 4203de40 c26f9e74 450bff36", + "c149e04c 41cddc84 c21a3cc8 c215b3d4 421e6064 c0e06d58 416ca63b -> 42467782 c1ddc888 c27c5e3a 44c5ff7b", + "41817004 c1ffa933 c222bdec c1e654b7 414c0538 c1137f30 419cffee -> 42b3e25e c2b2d5e8 c27bbc40 45909279", + "c19ed2a9 423dded4 40c5e4a8 c06cff90 418ac044 41a25c18 4144b958 -> c20132b7 4270fd64 c1e1c5dc 44980640", + "41b325e0 412c3fbc 412e2114 4223d26a c0dc3b00 42048884 418ee7d3 -> c2147ef4 420d2e9e c232007e 444ffe1c" + ] + }, + { + "glsl": "vec4 cultmath_multiplicative_score(vec3, vec4)", + "tolerance": "ulp-bounded", + "cases": [ + "c11a9ba0 c08a3048 41b72e00 c244b895 c0a618f0 c15e0f70 3ef856da -> 3fc12861 3d086a9a 3fb3c27f 42de9eae", + "41bd249c c1ac7381 4194b3f0 418c6498 c221d270 41a3b9c0 3f0b3bd9 -> 3f0fcd98 3fdefe9e be314190 4212b141", + "41f62464 c20e4c9e c16c45f8 3fd65f80 c18b3970 422e7bb4 3eb44477 -> 3f9c2fe6 bf431cb7 c01cbaa9 434055c3", + "41c96f4c 4062dee0 418910e0 421b4738 419b1760 4246b6e6 410e7e87 -> bd222f02 bd3c5ba6 bdc17bf0 408afc42", + "c20c21ac 3f0ebc80 c1e30c7e c06183d0 411da748 420a3d2c 3f189693 -> bf3e9c56 be60ef23 bfbe6042 42ee3b28", + "41b2e2e0 c15953b0 c1ece38d c2003b94 c2355bf0 41ca0cc0 409e973f -> 3e0694bc 3d9d12a2 be07b09a 4186dd88", + "41983128 4216629e 41e5fb78 40f99490 4247512c c153bf1c 42604d22 -> 3b914a26 bb9e576e 3c87da16 3f4e1a3b", + "c06a3730 c1c2cc7a c12b8248 c21deaa8 421e0cd0 41a85360 41102962 -> 3d4c057b bdb5dfc0 bd34e62d 410dbb1f", + "42288c08 c230f16f c217ffcd 41cb6260 c158eb08 40fbd680 40b841a9 -> 3d4e33da bdbd3ea3 be0d7a3c 412037ff", + "41df1698 c041fca0 c1e76af0 be9e2100 420f9fb4 4242b24e 3e370653 -> 3fdd3129 c018bb8d c09832a6 43ff5d6a", + "41e0109c c20c9fb7 c18222e0 c1b0818f c1fd1556 413b7a1c 3e1ca926 -> 40b63dd4 becd0438 c04bb4a0 43bbd1e8", + "417f2d48 42198ab4 c197d6b4 419c7508 414e9ab8 41bae87c 413732d2 -> bbd06fc3 3d37eaab bd98dcde 408a78a1", + "c1c8bda1 42015a54 c160b650 41a2ba04 c211ec84 412af5ec 41cc15b8 -> bca9773d 3d0058dc bc387b42 4057fbf0", + "c19ac6fb c22671fa c0ef6628 4191bda0 c2027472 423f5064 4258deab -> bc284424 bb2136c1 bc77c09b 3f9f4542", + "c115f664 40f599a0 c227912c c2104e88 c13e8854 4204dffc 41338283 -> 3ced88d7 3cae31e4 bda7074a 40ea20d0", + "c21cc686 c231cf22 4202561e 41a92ef8 c222b4d7 41100984 3f1c4612 -> bfc2f7ef bdc33107 3f18637f 42d49e71", + "c2027c22 41f7d71c c2308953 41bc3d24 420a0692 42203234 40789f1a -> be122e5d bc12e301 be5b2892 41d08419", + "416a1790 420c781c 41eacd74 41b31870 c1402cb4 c1ae8949 402897a6 -> bd2c4c72 3e82dd8b 3e8e14cf 41d491b0", + "c22e2dbd 4224db56 411b81a0 c2441639 415e388c c20bee37 3f133077 -> 3e392cf1 3f66f6ce 3fbceaf5 42b73d53", + "c19a5101 c1d8b45c 40b44858 c1c96e7b 42209442 c246d279 3e879d7c -> 3e826fbf c03a21b2 40193479 43a4c0e6", + "41d652e8 4057c4d0 4244c588 c23737ad c24144e6 40812588 3e801548 -> 4039e660 40045d18 3fe74675 43c7addc", + "c1b4bb0f c1558dc8 4232c040 c188f608 c228e1cf c13d7350 419866a5 -> bb93b6d2 3cc2e268 3d3ec5c4 40560a4c", + "41b47630 c1a9efcf c1076b00 c24796e8 40a12508 c1e82f16 3e0a4cf1 -> 40d73627 c01c1ae1 3ff44498 4413a770", + "c20eaa77 c1d91491 41a15b68 c09217d0 c0c07b48 c2448834 421f42dc -> bc2252fe bbdc7605 3cb4da98 3ffd77a6", + "410116ec 3e6da100 bfa54640 42317250 421f04ae c131f664 422cb0bc -> bc7c7b8a bc897906 3b88c9db 3fa1bce1", + "c1920863 41f14268 419187c8 c15b191c 41c12d54 c17eb368 41bc24d7 -> bbb5e357 3befb664 3d2a0df1 3fbe22d6", + "4091f638 41708098 4190c994 40c37f90 41d6dd38 bf2ce600 40b1b7e4 -> bc4d5218 bdc413e1 3e1ba0f6 408028a0", + "42309db8 c20f9c35 c1ca40aa c16e4178 41ea8a24 c220ff82 40ef40f0 -> 3db53bd2 bdc82ff3 3cb7c579 413ef9a8", + "c19bf2d5 c1a7d058 410c2d30 40f65418 404ace60 c1bb2773 4140755a -> bd3ebee0 bd29613a 3d619147 4081232f", + "4211aeee c080ac70 c137b54c c1ffccf9 424520c4 4218a014 3fd6914d -> 3ed1146d bea2f13d be97bd29 426e6b1c", + "bfb32380 41bac2b8 415cbd80 41f71bec 4213954e c1c59126 40c6c11f -> bdcc98c7 bd2bbb16 3df3e8ad 41060c55", + "40faac80 c23fb716 421d4d14 418903f4 3fc56c60 c1abe013 41044b6c -> bc6946ed bd9b3985 3dbecd24 4118c169", + "c15dd8a8 c1d013ba 41140ab4 c21e4064 c1a6fc2d c1c4eef9 3ddf1b87 -> 40b04469 bf8cee79 40e851ff 43c48c81", + "3f912c00 c2224767 41e4de6c c1e82c76 c22a1920 c2212cf2 413125af -> 3d14477d 3b19caa4 3da9666a 40d974e8", + "c1f79496 c1a35bc6 c13ea648 41dc9bb4 4132b158 c202a2e2 4014dce5 -> beb8eb93 be479f15 3e0316ae 41ef9a8f", + "c113f644 412ec130 40870d58 4229afc2 4209c910 c23d42d7 4172460f -> bd364939 bca5fbda 3d35d08d 40a209ad", + "c1b8622c 419b7c70 4222488a c2417e7e 42405c50 c2324b46 404e6d4f -> 3dac4892 bdc2edad 3e90cdc4 41e781a1", + "c1e01761 41ea2000 c229a618 41a13db4 414c5e3c c126d7c0 42a7e357 -> bc1c5b99 3b56271b bbcfa7e1 3f375c58", + "415ea30c 420cc02a 411e90c8 41eb5ce0 c2099ba1 422686e8 3fba7c19 -> be0ba886 3f1cb2c7 be8edb71 42563f11", + "41b3ed98 3f9ed4c0 421e3420 42217f0e c21b4d27 c1fd1da5 4291609f -> bb40ce03 3bd7fc38 3c3fe21d 3f934229", + "41511760 c233defe c1ffe04e c0aa3938 c1da694b c1ab7798 3f080d23 -> 3fa07bba bf9a3009 bf382ce5 424fb3d7", + "c120167c 421826ac c1f52f79 c2227570 c236e1ac c200953c 42a348ec -> 3b89bed0 3c3c7616 3957a786 3f8bd4b3", + "3ea10e80 c19c06f3 c22a5101 424194c4 41de261c bff4d5e0 41a1843e -> bcf7c2ca bcf397f5 bcd18dee 40799af7", + "41cde044 42313d7a c213feac 4196c964 c21bc9bf c180ddae 4089b70f -> 3c9837a0 3e660c22 bd66e3ba 41a013e0", + "c1fe70de c243eb96 c21afd8d 4213a978 4214438c 409ced70 40bb657c -> bdcae241 bdfe089b bd80df60 41a1d260", + "41c1ddfc 421e4a0e c1c433fe c11ecf28 c21bfa24 41ba461c 3f059cf0 -> 3f2ac6d5 3fc46548 bf6f05d0 433bf969", + "423c997e c1171048 41a047bc c21ab9f5 41be3848 c1048624 3eece62f -> 3ff695ac bf3ede75 3f22b535 43501d74", + "c1ea0bbf 42008522 4227ea4a c184c06a 41a22fb8 c1fba487 4226c07f -> bb83e66f 3b7706f1 3cbf3e86 3fe7adf9", + "c21d1c78 c233f17b 41cea850 c2196ae6 4232b30a 419dc4b4 3ee6cfea -> bcbab558 c00da1d6 3e1a747b 43475cb1", + "42141242 c2279a30 c1dc3dcc c2032539 414f3458 c13db44c 41994b45 -> 3d258473 bd020f7f bc14a8d0 40968c7f", + "c1113624 41ff91fc 41052240 41861a64 41c66c84 403ab490 41b63bc5 -> bd29e529 3c3be02c 3c0e1ea7 3f99aad8", + "407018c0 c0e11458 40f0f538 c14b9790 4228b2b4 c18db924 42a7b4c1 -> 3b5f239b bc269c32 3baaf3c2 3f302e4e", + "c1f8e16e c1f5cfac 40609ac0 c204d450 c15a4038 41acb184 4100a9e3 -> 3c2b2e5e bdae51d4 bdb86f87 4046aab7", + "420a3b8a beb71300 c1ac91c8 c206ad2e c239bf4a c23f846e 3e4e2ff5 -> 407ae700 4029743f 3fc17e67 43d69fdb", + "c18c53c2 c01bd3b0 42306b44 c21cb0f0 c239b477 c079e700 41c677b1 -> 3c5034a0 3cd3b517 3ce70b47 4031031d", + "c24743dd c182bc8e 41852530 4235e19a 417a09c8 c22500ee 40a3c8a2 -> be245c33 bd5c93ae 3dc7b92c 41b54b4b", + "4140c440 c1fd94fd 41c2f5fc c23dffa9 c1490458 c1cd3540 4130fe53 -> 3d89a751 bcb0ed3d 3d674368 40e7ad33", + "421b4da6 4197aedc c24650e8 c1bb45bb 41847458 c215b857 409d15b6 -> 3e4c96d8 3bfcd892 bd1fc0c7 414ed326", + "c18d91b6 c1a0dd17 3edd2f80 41a9eb18 3f4bedc0 41939ed0 3ededd7b -> bfefe729 bf80cd8e bf5e10ff 42db492c", + "42359ab2 4156cd88 c1bc69e9 421a672a 4210c1de c2017a39 3eba6781 -> 3f3cb087 c01de8f6 3f74aa1a 428b3685", + "420e7670 42137714 c1e56bd8 41a5db00 414d66c4 c22dd687 3ef26cbf -> 3f7c49d8 3fcba693 3f7a8fb8 4286bb59", + "c1954750 4081e0f0 c210ad86 41810398 41de2c64 c0ffdde8 40025ec1 -> beac99a8 be6b5014 be8bc9ed 41c6f209", + "41e4d6ac 422ebc2c 4208f1ee c14fba88 c183cc32 c1d45e87 412dfc9c -> 3d24bacc 3d6e49b5 3d70c267 410bebb9", + "c238efbc c20727c6 c1ce27e3 c20cad45 c11b4158 c16525c0 411fc7f4 -> bd1d30c5 bdab14c7 bd22a120 4039089d", + "409c10f8 c00500d0 c21066d3 3f9fa160 c22d2068 bf140b40 3dffa4c2 -> 3f088a35 40c1bb6a c0a704ef 43da6513", + "4200605c 41e8ca08 40bb7d20 c2391f86 c22fe1d0 c181271c 3ddae5ab -> 40d68233 40c7fcb1 3ff0e2e3 447fdc17", + "41ceaaac c156606c c2338c3f 41b8330c c1bc69b9 41dd45e8 3ea35d47 -> 3df5e656 3ede3f29 c046801f 4365c04e", + "419dee6c c0f93710 3fcab980 402a7f70 4230b50a 3f538a00 41e45738 -> 3c333217 bd08518e 39fe5754 3ff55288", + "41a53db4 423c5e06 40bcd620 c1dbabf5 41a6e5d4 40bba0e0 419d6469 -> 3d36cb83 3cc74d8b 3812dcde 40324358", + "c22f73d5 4247b94e c20c7b40 41a86d34 422a5470 c1193af4 429d29d9 -> bc40f30b 3aaebbeb bb97d825 3f6485a1", + "c20da8d7 c1acfb6c c1859e38 c1b40891 421e644a 41875464 3f304910 -> be87269d bfa0376d bf2ff60e 42ce4a40", + "41ece0a8 c1f70f66 c1031b30 c2109b79 41004e70 be18fc00 420f42f6 -> 3cc3c7c4 bc67a15e bb3f9a03 400949c9", + "c231292c 41450d80 42425516 c215d572 424261ac c1e51ded 3e61aaeb -> beb96f88 bff62f87 40830117 43c2323e", + "420006fe 4247d4de 41f96ce8 c16d52e8 41dff0ac c1cbfed8 41453fa2 -> 3d4acca1 3cbe347d 3d75650b 40c730c3", + "c15545a0 4220ef02 c2401d13 c1811298 c14c3938 c1edb73d 40907d88 -> 3c354312 3e56141d bd93f486 4146f0c8", + "c210a92c c1fdb62f c1c6a781 c235af40 4207a3f8 407ab400 42577ce5 -> 3b1bde26 bc8a2302 bbf2103a 3faba4d3", + "41dfcb70 c20f9e6f c2253a81 c214a0b2 c22ff2e8 42254f50 3dd2ee9d -> 40bfc34a 3f3e600b c0f34c0a 448012d8", + "c1462850 c206d056 41083030 422ff2c6 c1f77f8d 420c4976 3f72fd7a -> bf73bdf2 bd3f5de9 bee5ae58 42836ee7", + "c1aca528 4007a6f0 42295070 c219940b c0f2b318 4103c704 3ff888b8 -> 3e620586 3e0271f9 3ee524f0 41a1a4a9", + "c1a8ed69 c122a6e4 41efdba8 c1e9bc2d c1a37abc c1a02a47 42643270 -> 3b340d74 3b643e61 3c8aebc9 3f67ee1c", + "c0bf0c38 41bb51ac c2282632 c20d424d 418b8b94 c1ecda01 3e074af5 -> 40db334c 3fb26ec2 c039b6de 4375680f", + "420f734e 41b3e1ec c1dd6810 41afd67c c1869d78 419a27ac 42bb5da0 -> 3b1aae85 3bdb01aa bc02c3c6 3f2b91c8", + "41bf7eb0 c0d148f0 c121f048 c1fe9d10 c16c9454 c1db603d 42120eab -> 3cd42b3b 3b7aff1b 3c03a6f7 3fceb368", + "418154f4 c1894862 422be4ca c1081698 4236b980 bff26720 403e0f08 -> 3dd1e6e6 be85a8be 3e3edbbc 41da5e9d", + "41c21694 c1aa50a9 42283d64 41d394ec 413591c8 c225caa8 42806873 -> b9c7199f bbb9bab6 3c6d9bb0 3fb2cd3f", + "c0e3c958 3f0c8f80 41ea6a24 3fcf4de0 416ad9d8 c1aba234 3ff20de2 -> bdb1317a be0f429e 3f00a88d 41e1ee18", + "41ed12f4 41a008f0 c125fd20 c22307a7 421bddea c0c3b768 408e6b27 -> 3e5dc8de bd6efaf1 bc56a90b 418343ad", + "42397f64 c11e586c c23d8f8e 423167b8 c22a6505 c22e2969 41ad602f -> 3b397286 3d3b59b9 bbb0712d 3fc2d8d5", + "c116cbe4 c20c0afe 41b986b4 41ae1898 41b24c74 409e26c8 3e643772 -> c0043555 c072e67e 3f9ab84e 4397f92a", + "c0c735b8 c19de2d9 423620c8 41ae99a0 412b79f8 c2321ec9 3f5ab93d -> bea994c1 beb81b62 3f881eaf 42e8085c", + "422ba4a4 41293b70 41846e10 41a448e8 423020fc c0e485b0 421dc555 -> 3c47006b bc94c5da 3c52bd8d 3f979150", + "414d5d58 40564140 c18dfbfe c22d246c c2371c4c 42309278 41ada7ce -> 3cda86f0 3cbf49a0 bcf0fedd 408ee079", + "421a6dc6 421dccf2 420062be 407c9780 c23fa13f c2091c8b 3df02c2d -> 402466c3 40cf2d5f 409d69ca 447547a2", + "c1670b10 c22f8e47 41eedc4c 4229903e 41bcd41c c1985bc9 3f986775 -> bef24100 bf0fd9a9 3ed074d1 42a9732f", + "c1242868 c0bd0078 c14951e0 c1ae0127 c1396090 c1d0dd1f 3e021457 -> 409b5664 40199078 40b6d841 4312b0d4", + "41ec3610 c15f1a58 c1d1797b c2128600 41599d34 42255300 41abe7a3 -> 3d001545 bc554fb8 bd02b663 40929f43", + "413a43bc c110faa0 4170c2e0 41908508 412cc980 c18247c6 40909a25 -> bd1aa67f bdef1458 3e3c9759 41054e09", + "c112f97c c21241f7 c2007ca6 4109fef4 421efdc2 c1aa0295 40a824b0 -> bd2f7e34 be3bfb24 bcd63812 4170e6f8", + "408ee918 4212c8e2 41e12870 c1ec9224 c21862d1 3f2c3400 3efc6ba3 -> 3f4bfc93 3fe01e0d 3f24a417 432fbedd", + "c222fbde 4233567a 41e3b850 417cef68 41a20214 41c36248 3e3fbebd -> c09c642c 4007f65c 3eb2d6e2 43a50408", + "405938a0 41047dec c116c220 c1382230 c1ccdf14 c1cb77c8 418404f7 -> 3cb767d3 3d508aaa 3cc50cce 401c6dfa", + "4172c180 c20cc293 c1cd648f c214c852 423cf5fe 41f58958 42b9b323 -> 3ba3e73b bc00ff34 bbb06ad3 3f9b71b8", + "c19abc30 c1f3afa4 419cff60 bfaabcc0 423492bc c078ca90 3f108fca -> bec91595 bfd30e56 3f0345b9 430fca6e", + "bf23de80 c08a87a8 422bc312 3fd943c0 c1157740 4094a210 406eac87 -> bc84b41d 3d0e4922 3e87e1d2 412601ee", + "c0795200 42125490 c23ef954 42223156 4114abe4 c07a73d0 4227bfc8 -> bc7edee1 3c1c80b1 bc7b5a01 3fcfee85", + "40a4f468 41da67c4 c1eeef6e 4175b530 c2374567 4205bb1e 423eedc3 -> bb1008ee 3c810a2d bc5f6c48 40026453", + "41af16ec 40746800 c22980c0 c20d58cf 419fd844 c1cea5ab 41b66047 -> 3d269497 bc3c314a bc40a741 402d45d0", + "41ca5c98 c224a388 c2036e41 41c8dc9c c1ad8463 420814dc 3e074f04 -> 3ca6e08e c007628f c0e884a6 4403c8ea", + "c2158f90 c0173990 42132d56 4206ee46 419f5fb4 c1e3c102 3ebf1ebb -> bff62ddd bf1a44b9 3fe1e5e4 4384b2c7", + "c1ae2e45 c1df71e6 c1ddf351 c140d3ec c1765058 c219f9d2 41934b88 -> bce1b404 bd118883 3cf99a20 3f853864", + "c0f85da0 bf022680 42053cce 4223d820 414ae0e4 c163bb7c 41a8c5ac -> bd086c92 bc13b5d3 3d051edb 40525b5a", + "4227688c 420d43d2 c14f744c 41a56c1c c19c31d1 41be5524 415501ea -> 3cbbed5b 3d735c96 bd231da2 40a6a6d8", + "41ddf030 420c74ee c20a3cf6 c19825ac 41410fa0 42058b16 3ff1dbb8 -> 3e93f393 3e11d8ff bed6faea 42354be8", + "c1a2b10b c1854a1c 41fcfe0c c17bd504 413e6e78 41a1ce84 400299a0 -> bd945e7d bee6792e 3e37f12d 4173cee7", + "c192011d 420d78e8 41d5b858 c169ff20 c2155903 c23ba11f 3f7b2743 -> bd123581 3f373d60 3f398d42 42d310ad", + "41159448 c181561e 4208962c 417a1658 bfdf88c0 c1bb841d 3ed6c89a -> be806ed3 bf136b16 40132be3 430e4d6b", + "41452254 be759600 c213c7c7 c128dcf4 c010b130 bfdee260 40514875 -> 3e2a6c4e 3c70e8c9 be832376 414da7eb", + "c150b780 c22cbcb2 c22c2224 41b45004 c1af09d0 c1885586 3e74171d -> c043321f bfe9bb66 c00e93c1 434d5598", + "c207638c c2414237 40d66b10 c244e365 4178a778 c1817b10 40cb57cf -> 3d0e7c86 be13f200 3d5417c3 412f211b", + "4247caea 41251b04 c16b28ac c200bfe5 41a59760 c143f5a8 3eb66c04 -> 403221d3 beb4172a bdaa0709 436876a6", + "3fa3ffa0 c195a646 41759e50 c210bfd2 40da6920 c1e1b38e 4127a613 -> 3d68f1d0 bd1ebb2f 3d876b6c 40c00715", + "42065088 41948d9c 423341fc c20f594f c1e04355 422cb1d2 428b9751 -> 3c42dbc0 3c02d13a 39936354 3f995c58", + "41e46b30 419dfca0 414d60dc 420a2be4 41a11348 c1ec25a6 3ffcfb18 -> bd911c43 bb95a0a4 3f003ef5 41ad2743", + "c18ed1b0 c1b46e6e 416da3e8 4202d9de 422afb78 412a7b24 40eddd97 -> bda8780e bdd98f49 3bdfc180 4131ffcb", + "421dc3a8 41de04c8 c1e2eeb0 41d85278 c21df9a9 c18f447c 4214b064 -> 3b9e06e1 3cd63beb bb854543 3fee3314", + "41cc2ce4 c10626e4 410b9f54 41aa5be8 c21b50fc c09890a0 3f72eba0 -> 3e07e380 3f74add5 3ed8e654 420d80bd", + "c1871208 413e2d98 421275ea c0cda3b8 c115bd68 4174ef28 3ee0767d -> bf3fb431 3fc2b9e5 3fc34b1e 42915187", + "42224872 41b3bb40 c185d794 c245bdf3 c202ea97 41c994c8 3ebffd72 -> 40073967 3fa5d99f bf7bf7c3 43977a79", + "c2389bec c2460166 c197335e 416146b0 41321dc0 c2341ec4 42856686 -> bc258c69 bc26a6fc 3b8fa316 3fab8157", + "42234468 41b972a8 c14e0a2c c21a2802 41315044 c22384d2 3dfc7d3b -> 40f246c8 3f93c0e3 402afbd4 442c65e1", + "c1aeefee c2378f9e c213020f 410f6a80 41c9fe84 c21d834b 42bb0e70 -> bb8b3cad bc20a3c5 39bdc459 3f54572a", + "4178f588 41e1e620 c12dc6b0 4006ad40 42356300 c1105e98 42b8fc7f -> 3bda3a8e bc0abe30 ba6e76d9 3e71d63c", + "c232db3b 42197472 41d3ce60 422cf0ee 40dc9ae8 418452a0 41621f93 -> bd87ace0 3cc23018 3bf53b01 40d4b266", + "c10e214c c1b2fcf9 c22b23b8 3d1e4c00 c11bcd40 c13903dc 3fedc9fb -> be0d240b be47e5d1 bef6f567 41960bd8", + "421ad212 bf01e2c0 c18f18ea 41ec792c 40c604e0 c1fd13b0 40eef065 -> 3d8cca36 bd4e228d 3dd39f89 4018b832", + "4192da7c c1efd376 c106624c c0ff4ec0 416936c0 c1ef2eae 3fb43ca1 -> 3eaadd24 bf108909 3e8b7c61 421f338b", + "c1dde8ed 4227d7fc c2181928 417c91c0 415fe388 423511ac 42133a0f -> bc4597b8 3bfdf037 bcbd10a6 402a7e4a", + "420b44e2 412a5914 c1fe31e0 c2373f4d c0ed7110 c1952669 422321cc -> 3cc19421 3bad80c2 bb7c3278 40034b56", + "41d3ddbc c22fde57 c2244cf4 c17035b8 41b17b58 40d76cb8 41a1b579 -> 3cb7abcc bd1266d0 bcd39a96 4090f37e", + "c1aa0ac9 c22be537 41b45c7c c12d766c c1db1b9c c15914cc 3fa4177f -> be4c716f be98fc11 3f313d66 41fde848", + "4192bc5c c17200f8 3f9b58c0 422945ae c063f590 c184e8a8 3ebc568a -> c0023533 bf7b30d0 3fc1a15a 42ae2fc7", + "c16559e4 4234f56e 42090324 41d2279c c0da9518 40d89790 3e05f2b4 -> c08ae159 40b219b0 403c03e2 4408b125", + "421b6230 c2107386 41caf7c4 c2119143 4214095c 41cb6018 42642c0a -> 3c4df8d4 bc482e05 b70ece1c 3feb6cd2", + "c2100b64 c18a973e c22bdc6a 42299004 4155ec48 4136ed84 427f98e0 -> bc488af8 bb9d0614 bc0b2500 3fc8cbf2", + "420bbd34 c1291d94 c1bafbea c109e540 410d5b80 bfb2fca0 3e9fc849 -> 402a20f5 bf9798df bfabad0f 43283b08", + "c1c1d2fa 41881894 c21884fb 42389138 423fe120 41914870 3fd6a7ba -> bee17af7 be466435 beb45dc1 42634581", + "c21cd3c6 c1caa02f 410b7b10 c1a7df62 4247daa6 41b7bc40 3fc9742b -> be1686d8 bf1b7c0f bdeb6917 42482f0f", + "422c8e50 423cb25a c1c398b0 c1665cac 41302b00 c09e36c0 4088b121 -> 3e43157a 3df53bc5 bd844520 41846973", + "c23f349f c0ba4678 4247b5aa 42044596 41afa094 c1c54996 4054dd57 -> be5b6d8e bd96b986 3e4a62a2 420875ba", + "40b9e6b0 40f408c0 c171cb84 4209567e c227552a 4215a67c 40f9ab9a -> bd4106bb 3da757cb bdb1b70c 411f1847", + "c047fd00 41580378 c202227a 421c283e c22af42c 3f872100 3dff6357 -> c08ae380 40b9409a c05d496f 441c2e09", + "c227fb87 bfd765a0 4155fed8 415681ac 4219dd42 40678830 4262f3b2 -> bc677b57 bc27bffc 3b231138 3f9beab5", + "c0f7ce00 c243b19c c230e225 423f4c20 c239d10e 4141f488 3f0272fa -> bfb04d0f bd7ab2a3 bfb2c25d 431b5fd7", + "c1d955ce c2183aa5 c213b45d c1bfde56 c0e5b7e0 42205904 408ec75a -> bc0cc708 bdaab1a7 be54dc51 4194e0e6", + "41885da0 c1d15cb9 c0aa3178 42272fd0 420e37a2 41d69980 401c5934 -> be0c75b0 beaf2417 be36695f 41f1e1c1", + "c1829d04 c227a9de c05bf690 406feec0 42300020 3f942600 4285ec76 -> bb5e63e0 bc6defb4 ba4b93c5 3fa8e24e", + "4237725e c157282c c1f2b5ae 4205f308 41adc568 410ef5bc 3e8293e7 -> 3f6560e3 c022fa21 c0360013 4354547b", + "40d195a8 c1a72178 42120a5e c235841c c1c5ad4b c127fdd8 3f06bde9 -> 3fb40583 3dd3ca3d 3fa2f80f 430547ce", + "3fc77040 c2366e1e 41505da0 41670b40 412f8014 bfe4e040 3fd8c152 -> be02148e bf0ed2b4 3e158e96 420d7465", + "c1cc19a1 c1fa7438 41ace138 c23c5a60 41d65784 c08ef9d0 3e3942b6 -> 3fe305d6 c098d524 400932a9 43b9d3da", + "422bf842 4113750c c0bd9660 c221d12e c21c240e c1a4f78d 3f24f623 -> 3fa9ff68 3f449857 3e6f8392 43175174", + "41cb1ecc 422da67a c0ef11a0 41a8cca4 c196c8d4 c1091cc4 3e53707f -> 3eaa6dd2 409a95d3 3dae9340 43972516", + "4232e260 4102bdcc 4214b3ec 4124391c c14acf2c c1de39f3 41e890f3 -> 3c7e1937 3c19bb72 3cef7f13 402840d9", + "c2393bc0 42062930 421d3c1c c187bfc8 c23c37ce 404f1400 415d7c5d -> bcba9aa6 3d8025e6 3ce56de8 40d7175c", + "c2008ff0 bff96e60 41f49ad4 4233b6f0 c2126358 c2341e2b 41011277 -> bdac8f65 3d1b283e 3da94827 4160e337", + "419f2404 c0f216b0 42344d12 c20eb298 c21f83b0 423c485c 419a378b -> 3d37978c 3cd58661 bad2f7d1 405582a1", + "c21c1497 c1ec0cc7 422d5c7e c1a17723 c22cdfd1 c19c4ce7 3f4817e3 -> beb80399 3e85f3f0 3f998f68 42ab9539", + "412859c8 4209bcb2 c0eb4540 c12881cc c1d58481 c1bc4275 423f05a8 -> 3bd8c59a 3c9d5601 3ba69848 3fb29f5f", + "41cd6828 409888c8 41d41d6c c227ec40 41d125f4 40b31c70 40aa3e14 -> 3e300b67 bd5e7e29 3d59b553 415e784f", + "c09470a0 413f418c 41d15ec0 c2010112 c158a418 c043e570 3f0e4389 -> 3f8594ac 3f76a96c 3f8d6ac9 42ab5a2a", + "c2090db7 422866d8 c081f908 c1b66035 c1c6caab c230361f 4271c698 -> bb1db9f5 3c663b11 3c09865b 3fa6eb76", + "4150be48 4237df9c c23b2453 4238a804 c1d9d098 c1064688 40a7fcab -> bd9119f9 3e205943 bda83752 4187b14b", + "4159df70 c14127bc 40aebb18 42205ee8 41e40620 41c20ce4 428621bf -> bbf8ec43 bc3ebe44 bbb0b808 3f465dc1", + "4216ac12 c1fb8349 c22ec658 c1802d54 c1086cc4 c1fae674 4114d37e -> 3dc62272 bd291c1e bcb60641 40cd418e", + "4108a4e8 c20352e1 c217ba80 41a29268 420617e4 c2343f8d 400d2b43 -> bda16972 bee346b1 3d435f03 41f5c916", + "422955d8 423ad678 c216f058 4240a314 c1ebd637 423a5b2a 3e75024a -> be5b173e 403316cd c04635dc 43edcc77", + "410cc5f0 41ba6610 c2189444 4057b470 c2100ad0 c2473a49 41e2ae7a -> 3b4edc27 3d0d4555 3bde3927 400913d1", + "c1cfcb5c c1ea5007 c1b2bff4 40fe9f58 41b5766c c19b1b1f 3f31f31a -> bf491b1b bf9a03e3 bd8c224f 42b2c8f0", + "41bc50fc c125e324 422ce690 4206b5dc 42153d1a c1b7414a 3e0bcb0d -> bf676833 c08808a2 40bcb015 441672a7", + "41e664fc 4224962e c1c14262 c12c00c0 c1554854 c215ca8a 415c1928 -> 3d2b9e20 3d6c645c 3c66af3c 409f9f7f", + "c10c819c c0d9c228 4227bbd4 40ff7160 41dd5690 41fcb2d8 3f3c133b -> bf1320e9 bf974518 3eb59a0b 42582c9a", + "c097a570 4231cdec 41f4dc20 c1b420c2 c1fc71e2 42077f6c 3f8ae1d9 -> 3e56bf13 3f658a32 bd1ddbde 4290025f", + "4239d522 4209a57a c2168ab6 c21ca352 41c29c04 c205220e 3ebb8ac1 -> 402d4d96 3ea350ba be0cf3cb 436ba81b", + "40e27a08 c1f7adce c20e12c6 c186506c 419bf79c c22781d8 41c8efec -> 3c8a90b5 bd1277df 3b93aa05 400f2450", + "42009cdc 42100cee c20f8489 41da8e88 42169040 c21e27f4 41f3f490 -> 3cced904 bc0b5b82 3c9c9b97 3e52cc7e", + "41dc2080 c1646f38 4247e5c0 42340fee bf79bf40 4244cba2 3f348c7f -> bf906637 bf5b8452 3d4cc57d 41f97dd7", + "c09a35a8 c2158781 40c631e0 4196ec14 c0d90080 419feee4 41ec397f -> bc9ff101 bccea674 bc3a5ba3 3fb21601", + "c22d0f4d c212167b c1acb9bd 41457fa0 42375784 401f4ab0 4205bf99 -> bc853e23 bcc555c7 bbe6c976 4043b587", + "c1cec2bb 41db9d34 c1c9d33e c2275086 41bbb68c bf908d00 40fa41c7 -> 3d8f6376 3c8f178d bdd830d9 406ee3a4", + "c2263f01 4183e534 3e285a00 c1999263 41bb4ec0 3fda85c0 3ebd780b -> c024d8f6 bf4c3729 be35f22a 427d9fe6", + "bfa7d720 c2167076 c208b340 c1c59602 c201edb0 4222102e 3e68e9b0 -> 3fa7cc01 be932939 c085f90f 43ac6b1a", + "c22e4f66 41049bf4 41658700 c1bdc842 c13de524 423ea1a2 41926e63 -> bccb50ba 3cce67c9 bd2a8fc7 4018d1a4", + "41b446d0 420ed856 c20c18a4 422738bc 40ff1b08 4242aa62 407f4677 -> bd5b4647 3d9dd0fc be6e11c9 41b502c9", + "41045664 41c99ebc 42136074 41cc7b80 3ea80480 4172bad8 3fa1fd10 -> bebbca13 3f071696 3eeb6929 41eb758c", + "c077a190 c22fe21d c13f030c 419e7120 c1fdb97b 415661e8 40b06aa3 -> bdef209d bd77925e bdffebe6 40d57a41", + "c243a605 c215a99f c14f545c 41e28a68 413f91f8 41b1f4c0 3eae4747 -> c013df4d bfbd214f bf86ce2c 43903ead", + "c1f6b0c6 4126d28c 41ff2738 c16aadc8 3f9b3ec0 4216c24e 3f98df23 -> bf31cff8 3ecaa57a be7ef0fd 41828fad", + "41f63488 c16cfc0c c13007b8 c20a3c02 40429cd0 41794d08 424e57d0 -> 3c8e98f1 bb9bdb64 bbe81481 3fb489d4", + "c14cff54 c1a82768 be846000 4189848c c1c53d0f 41c93b58 40ce0415 -> bdf1b4d1 3c6a5098 bdccbb45 40c443a8", + "401091b0 c1bdbafc 40cf1a78 c1f13917 c17bdb5c c2028344 415e9912 -> 3d399dde bc36b107 3d5feb86 406c7eeb", + "41b903e8 41df78e8 c2120c78 4237fee4 c1bc9ffb c165f1a8 3fbebc5c -> be81c78d 3f1224e8 be7b4276 42228c7f", + "c20ce544 c2343327 c11c5b3c 42447612 41dbd8d0 c244a54c 41122437 -> bda0407e bd89d0a2 3d15af8c 414eb6b3", + "41a6b9c8 4244412c 408ba498 4173e5d8 423f4538 418d077c 41042afd -> 3d400cdc 3c2b0516 bde392fb 3fdfed3f", + "42066a16 421533aa c21b7d13 c155f3ec 423c5cb4 40ee1ab0 4122a757 -> 3d8de82f bc6c9886 bd8be7a7 40d1ec71", + "c17db77c c1c49f68 c20a0ee7 c2042f33 41a28b20 416750b0 3e2daf58 -> 3fbd05d9 c076db36 c086a248 43ca4bb7", + "40e82450 c1c3eaed c1f475cc c1bb0c6b c1a060a6 3fa7b620 3ef0c728 -> 3fbbafd8 be59bc28 bfc33c7f 42bcf226", + "c1cfc11a c221f1f1 41909868 c008aef0 41c285f0 4233bf0e 41dda222 -> bc3e3fd3 bd015171 bc566ca5 402b265c", + "c1b63d52 c23f9144 40934ff8 c158f038 be838080 c229d062 4241fb2b -> bb385e42 bc6e19c1 3c6b3621 3fb2669c", + "422288ca c23e8f64 4115ef80 c1a55965 41e18080 41b19ef4 41d1f047 -> 3cc29427 bcf0af20 bba2ea43 406fda87", + "41ec391c c1ca0fd0 4200a546 c22b592a c159e5d8 40f69aa0 3e82e023 -> 406a7d8f bf16dc5f 3f9e7ccb 4397238b", + "41bc6d44 c1714220 c1360154 418eeb14 c206b9f4 c1082e84 40c40949 -> 3d416e82 3e1e2448 bcc2c533 404d6b7a", + "41de4b34 c0de4a38 421b0df4 c1d9cc85 41481118 420df24e 3e253035 -> 40baba28 c0040b52 3eb1f8a5 43b52326", + "c1d57ce1 412e1c68 41f419b4 c1eb66db 40dd2468 c1feff20 411f7e93 -> 3b8fe6d6 3bd09f5a 3dccd671 40c8de98", + "c1d6cc24 412124f0 423d267e 3fe1ed80 41e8dc74 c1038cb0 400a70e9 -> be4f7a97 be0a06cc 3ec93e39 41f17474", + "420b15f6 420fa6ee c114c714 c1410e4c c14c5114 418ea7b4 40825caf -> 3e21b812 3e281737 bdbb59d0 418ef62f", + "41897e88 c20815ac 41949cd0 c1849a1a 4180767c c1a06584 3e78b79a -> 3ff82d43 c0380f42 400df743 4393952f", + "4114e788 41a4dbd4 c22dc670 c2094406 4212dd2c 41bdafa4 409b70e7 -> 3de12981 bd264a8f be2d4f92 418686d3", + "415dc3f4 c2416796 42125a42 41ebc3fc c126b46c c0423660 40501973 -> bdac6718 be5176a6 3e5acc90 418c50df", + "41c6cc7c c10a9b48 c20799e2 c14ca0b8 4246d78c c20bb844 4276e5f8 -> 3c0fd3e4 bc5f0ef1 397bd0ad 3f900c8a", + "40e47e58 bff808e0 420b5d50 c1c5cee9 c201618c 40506150 409a8385 -> 3df95e68 3dedf3a6 3df72af0 413399b4", + "c0a319c0 c218418c 4214999e 4223694e 4218b332 40718900 4103a767 -> bd709a2a bdc799fe 3d2ec384 4138db5f", + "421ddb50 4222ecee c15eb234 4229910e 41908a04 421927e8 3ed9125b -> bdf82354 3f70211d c00a4980 43066b92", + "42090e84 40839fc0 410769c4 423e98d8 c1e91180 c23af1fe 426b989f -> bb624b48 3c0c856d 3c694eaa 3f8f0732", + "41c5224c 401e84b0 4238db22 4182c764 c20c7a7e c1f158e8 3deddb00 -> 3f55bda8 40723580 40f60a5c 44381fbf", + "c1dba39a c1e24780 4221a36e 41987d6c c1ec5c85 c247a74e 3ebdaa3b -> bf9e30d7 3d0925d9 40199580 43892427", + "421ed9f8 4245c0a4 421a78b0 3fb3f640 422cc40a 42123ca8 4211c1dc -> 3cdd91e9 3b908669 3abe8407 3f88877d", + "3f1b1000 41f02554 c0a5c9e0 c192daee c1b9c05a 41b0d554 4175b383 -> 3ca131b2 3d62464d bce7f0ad 4082c597", + "422fcbc0 c1bcfa42 c1b30097 423b2734 bbfda000 415ca514 414d1902 -> bba7adaf bd2e5275 bd857cc1 40581d4f", + "411758a0 4223be7e c1cbf4c9 41ba5b60 c18075f6 413ad7d0 4122d05e -> bca0682a 3da531be bd577c2d 40da5b81", + "41982158 c08a7fe0 c1d55b51 c018cbb0 4218cf36 c2402f3d 428944a1 -> 3bc3cba4 bc428758 3bc38c03 3f42ab50", + "40959aa0 419ec384 c0706db0 c1b29992 c2052ea6 c22c31e7 3f06af7d -> 3f38061e 3fb5188c 3f85e69c 4307b260", + "41b3ab40 3fb28ba0 c174bb58 421865b0 c01171e0 c1a5ae5e 3f388de6 -> bfa3cf5d 3e99a45f 3ee2d3c3 41bc200d", + "42355960 414c8ee4 41b22f08 41a3b358 c15b424c bfa6ed80 3f4ef17d -> 3f35dc48 3f41a8d6 3f2c5f9d 42565639", + "c225fdda 4161cc50 41e0e404 4113fc14 c1c8f296 c1fc445e 41e0455a -> bca94dec 3c82e23f 3cc6fd54 4047f612", + "c17a756c c1e41727 42081f44 c136bd8c 41a133cc 41e29974 3fc0f100 -> bd69dd5b bf280d76 3d9da25b 42027ffa", + "40d108e0 41fb0d1c 4198e7fc c185b28c 40dad960 c0719430 4222f53d -> 3c64fe52 3c71c77c 3c617b0e 3f8042ee", + "c127577c 421f3470 420cc802 4210dc24 c18ce5ba c13ad554 4181dafb -> bd06778f 3d256856 3d070a01 40acac9d", + "42038c4c 3f875aa0 41d93334 3ff3f900 40508300 4164c300 401b5f0f -> 3ec262bd bcdce96e 3e2147f1 415d8883", + "c2311151 41910e48 41936864 42274aa4 4219f046 c0f1b570 3fb210a3 -> bf2bd461 be227d8a 3e4f699a 42848d55", + "c1a0c01e 3f2c7980 bef57700 41dc9df8 3f770580 421d4a08 3fbacac5 -> bf06a87f bb529368 bee0dbfc 422a39aa", + "41fb3a54 c23b5c7a c14d3438 41eba880 c23e1e29 c0d7e5d0 413b7a32 -> 3cd3f4fe 3c161b3d bda57f63 3f0c40db", + "41c27d44 422baa00 41b845c4 4229f992 41f1264c c2285bb9 405fd9f8 -> bd9ab8e9 3d595e78 3e8a8a5d 419d6272", + "41a37330 c22c7a57 4212b0d4 c2046e48 c20fe405 422c673c 4055dfa8 -> 3e96ccfd bd210a5e bd10d8bc 418237db", + "c2130094 c2454035 c1088fb0 4192d5c8 c238e294 bf8e4e40 3e473a22 -> c0a2c07c be92169b bf2f65c3 438f1da8", + "c12df5d8 c1653440 c22572d8 41fb6218 bf7fd700 c17203e4 3de2e68d -> c0ed1800 c0156697 c093123d 43e88813", + "c0068b10 c120655c 41b39710 3f499640 c1e7a50d 41d9b254 3f6055d8 -> be2b1d38 3f8c1ff6 be8d07e9 41b426f1", + "41c9ba44 42359150 42455112 c226a2df c1776bd4 42129ca2 40c2b6f0 -> 3df685c7 3de05568 3cbaea08 4170150c", + "c0c69e18 414d90f4 412af510 c150ff94 4238e2ca 421805d8 41315038 -> 3c68152d bd8d397f bd67393b 407c355a", + "c23e1c46 4236d6dc c21b96a4 4242c46c 423175b8 41153758 3f9173c7 -> bf496394 3c342614 bec9dd1b 42bd7121", + "40e7b880 416656e8 c21bb77a c196dafa 41b84a7c bcc62800 3ef2d07d -> 3f93dd4a bec3cf54 bfdc6c7f 42c8e625", + "41873e00 c20f1ab4 4180d6bc 422bee82 c20871ed c1f4fb3f 3fb1192b -> beb43ff2 bcb81dfa 3f217dc9 421ac7a9", + "c232d184 c0fba7f0 41203710 4199f0c0 4143c3b4 3e23d600 4290e58c -> bc557297 bb862def 3b038eec 3f6f67a8", + "41b69d68 c00301d0 c0b07878 4031dda0 c0486d00 c1855d3c 40138cf7 -> 3ec1d758 3ca7cd62 3e57bb2b 411f6636", + "c0b781a0 413588b0 40061ec0 c1ba907c c20074ac 4238f3f6 3eb13816 -> 3f49fc4b 3ff994bf bffd8095 433a0a1b", + "c19808d6 4219088c 41d9953c 4137ff2c c1552a64 c150efc0 41a21455 -> bcaada30 3d1073bc 3ce17977 40640d05", + "bfb021e0 423251e6 c0c17330 41f2a970 419506ec c19f0914 42a490e2 -> bc11fe34 3beef8cc 3b7ec783 3f068d16" + ] + }, + { + "glsl": "CultSiteCells cultmath_site_cells_insert(CultSiteCells, vec4, int)", + "tolerance": "ulp-bounded", + "cases": [ + "c2d12391 c168dec8 c255e394 454b7280 42fc6542 c2aea78c c2b47f9e 45f6f0a2 00000000 3f800000 42fc6542 c2aea78c c2b47f9e 45f6f0a2 00000002 -> c2d12391 c168dec8 c255e394 454b7280 42fc6542 c2aea78c c2b47f9e 45f6f0a2 00000000 3f800000", + "424cd0e8 c0f6f040 4044a7e0 4408225a 402d78b0 c2a09e39 420f5373 44d78ea1 3f800000 00000000 40522d50 429c0099 c217549a 44bd56dc 00000002 -> 424cd0e8 c0f6f040 4044a7e0 4408225a 40522d50 429c0099 c217549a 44bd56dc 3f800000 40000000", + "c08a7cfe c094b82f 3dbf6e3a 43fc9f6f 4244e6a0 c1ebead0 426c487c 44cea555 00000000 40000000 bc118bfb bbf6806f 3c8322f4 3f816eb0 00000003 -> bc118bfb bbf6806f 3c8322f4 3f816eb0 c08a7cfe c094b82f 3dbf6e3a 43fc9f6f 40400000 00000000", + "40c10da0 4269ae0a c2882f05 44e1aecc 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3c535ac1 3c5e2426 bc1ec484 40087dcd 00000001 -> 3c535ac1 3c5e2426 bc1ec484 40087dcd 40c10da0 4269ae0a c2882f05 44e1aecc 3f800000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 beb47754 3da47244 3ec575f1 42409244 00000000 -> beb47754 3da47244 3ec575f1 42409244 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3c8b8ad6 bc374c45 bc9f50b8 404b783b 40bf6f42 404dfcc7 c0d79e80 43af1c1f 3f800000 00000000 424755a6 c22de3dc 426ca98a 44ddbdc1 00000002 -> 3c8b8ad6 bc374c45 bc9f50b8 404b783b 40bf6f42 404dfcc7 c0d79e80 43af1c1f 3f800000 00000000", + "c0055e66 40675b8c 3f379d07 4360d1d9 3f8bfb6b c01390c8 3ff524e4 439d6714 00000000 3f800000 c196c50c 4331971a 4312270f 464fde76 00000002 -> c0055e66 40675b8c 3f379d07 4360d1d9 3f8bfb6b c01390c8 3ff524e4 439d6714 00000000 3f800000", + "c2341f91 42aedbae 41783e48 45170fad c1a292e4 42e66c3c 428913fe 458f69d6 00000000 3f800000 c056ed2e 4090e31b 4004f9ca 441b001d 00000002 -> c056ed2e 4090e31b 4004f9ca 441b001d c2341f91 42aedbae 41783e48 45170fad 40000000 00000000", + "bb275831 bd06735d be324fde 40893592 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bb275831 bd06735d be324fde 40893592 00000001 -> bb275831 bd06735d be324fde 40893592 bb275831 bd06735d be324fde 40893592 00000000 3f800000", + "bb844b4a 3c89418a 3ba7adf3 3fb3d8d1 3f2870a7 3d21fc33 3e8d1f84 422d7cb9 40000000 3f800000 3d04e396 3fe1f340 c064ccfc 43d31757 00000003 -> bb844b4a 3c89418a 3ba7adf3 3fb3d8d1 3f2870a7 3d21fc33 3e8d1f84 422d7cb9 40000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3aa293ad bc20958d 3c1db5c8 3fa1312f 00000000 -> 3aa293ad bc20958d 3c1db5c8 3fa1312f 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bcca8533 3c354145 bd065c2c 3fe34018 00000000 -> bcca8533 3c354145 bd065c2c 3fe34018 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "429ac4b1 c2bd880f 42661d29 458bab8b 00000000 00000000 00000000 7149f2ca 00000000 bf800000 429ac4b1 c2bd880f 42661d29 458bab8b 00000001 -> 429ac4b1 c2bd880f 42661d29 458bab8b 429ac4b1 c2bd880f 42661d29 458bab8b 00000000 3f800000", + "bb3c85d2 3c273a03 bc41cd4c 3f54a889 bb3c85d2 3c273a03 bc41cd4c 3f54a889 00000000 3f800000 bb3c85d2 3c273a03 bc41cd4c 3f54a889 00000002 -> bb3c85d2 3c273a03 bc41cd4c 3f54a889 bb3c85d2 3c273a03 bc41cd4c 3f54a889 00000000 3f800000", + "bc1c0d48 bca3811e 3cd429a5 3f9bbfb0 bc1c0d48 bca3811e 3cd429a5 3f9bbfb0 00000000 3f800000 bc1c0d48 bca3811e 3cd429a5 3f9bbfb0 00000003 -> bc1c0d48 bca3811e 3cd429a5 3f9bbfb0 bc1c0d48 bca3811e 3cd429a5 3f9bbfb0 00000000 3f800000", + "3c2f5b19 3bac725f 3c33ca25 3f56feeb 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c18305aa c30d4606 42c9e5cb 45e5b7ec 00000001 -> 3c2f5b19 3bac725f 3c33ca25 3f56feeb c18305aa c30d4606 42c9e5cb 45e5b7ec 00000000 3f800000", + "42729786 c00e4f70 410adb60 4425b105 42d5495f 40836480 40471780 4530db20 3f800000 00000000 3b539000 bc13f9af bc2cc94c 3f72ad3e 00000002 -> 3b539000 bc13f9af bc2cc94c 3f72ad3e 42729786 c00e4f70 410adb60 4425b105 40000000 3f800000", + "41b5ab58 42fe18e0 41101450 457b9c49 42487cae 430fd3ba c333cf36 465705d3 3f800000 00000000 3e61e8f2 bf8f6047 3ff02ed4 43454497 00000002 -> 3e61e8f2 bf8f6047 3ff02ed4 43454497 41b5ab58 42fe18e0 41101450 457b9c49 40000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bc9a940d 3dbc20d0 be15b7cf 41408565 00000000 -> bc9a940d 3dbc20d0 be15b7cf 41408565 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "bb847720 bc8c27a5 3beefcd7 3fc401a1 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c2de8b82 42c184c4 42f4024a 460922c9 00000001 -> bb847720 bc8c27a5 3beefcd7 3fc401a1 c2de8b82 42c184c4 42f4024a 460922c9 00000000 3f800000", + "c1fbf178 c30dfe42 42b107ea 45e028c0 00000000 00000000 00000000 7149f2ca 00000000 bf800000 427d6fd0 42da3070 42364221 4588406e 00000001 -> 427d6fd0 42da3070 42364221 4588406e c1fbf178 c30dfe42 42b107ea 45e028c0 3f800000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bbb7ef6b bc0e9ab5 bba7237e 3f2fabe9 00000000 -> bbb7ef6b bc0e9ab5 bba7237e 3f2fabe9 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "c312d4ac c2259781 419ae6e4 45b5bbb9 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c19a29e8 c314c252 42012683 45b47097 00000001 -> c19a29e8 c314c252 42012683 45b47097 c312d4ac c2259781 419ae6e4 45b5bbb9 3f800000 00000000", + "bc09ee02 bb50dde9 3bc34fba 3f9fdbf5 bc09ee02 bb50dde9 3bc34fba 3f9fdbf5 3f800000 40000000 3e6c7783 bd0df6cb bd817870 414e142d 00000003 -> bc09ee02 bb50dde9 3bc34fba 3f9fdbf5 bc09ee02 bb50dde9 3bc34fba 3f9fdbf5 3f800000 40000000", + "bd07fc0e bd915407 bd244fbb 40bb9789 bd039f0d bd6df516 3db22eca 40be19e2 00000000 3f800000 3f99878b c09e6782 40f418ff 43cce07d 00000003 -> bd07fc0e bd915407 bd244fbb 40bb9789 bd039f0d bd6df516 3db22eca 40be19e2 00000000 3f800000", + "bda1ae85 bc8b3e51 3e4245cd 4133e5b8 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bda1ae85 bc8b3e51 3e4245cd 4133e5b8 00000001 -> bda1ae85 bc8b3e51 3e4245cd 4133e5b8 bda1ae85 bc8b3e51 3e4245cd 4133e5b8 00000000 3f800000", + "bc92b085 3ccd11e2 bbacc819 40108298 3e8b1988 3e96ef7a bfb7617b 42434ebb 40000000 00000000 3a8d694a bd212fe0 3c1f09a2 3fb9342a 00000003 -> 3a8d694a bd212fe0 3c1f09a2 3fb9342a bc92b085 3ccd11e2 bbacc819 40108298 40400000 40000000", + "bf5542f5 3ece15dc 3f62974f 4307e5f7 428f7a2f c26f546c c2c00734 458c2ec1 00000000 3f800000 429976a3 430e7a1e 40aaf060 45c619a6 00000002 -> bf5542f5 3ece15dc 3f62974f 4307e5f7 428f7a2f c26f546c c2c00734 458c2ec1 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 40c1e514 c03241bd c0217797 4388c238 00000000 -> 40c1e514 c03241bd c0217797 4388c238 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "4217f968 c13ac370 c2ea9ec5 45647492 4217f968 c13ac370 c2ea9ec5 45647492 00000000 3f800000 ba4885d9 3c3c4d3f bbb46c2b 3e805c00 00000003 -> ba4885d9 3c3c4d3f bbb46c2b 3e805c00 4217f968 c13ac370 c2ea9ec5 45647492 40400000 00000000", + "c0b8fc00 c25c6de0 c263d24a 44c51767 c2765aa6 4248882c 42cf390a 4579d286 00000000 3f800000 3e102001 3df40384 3e2427e7 414fba19 00000002 -> 3e102001 3df40384 3e2427e7 414fba19 c0b8fc00 c25c6de0 c263d24a 44c51767 40000000 00000000", + "bc13d45d b9e877c4 bcef7c08 40219b52 42d4573a 42a2cb04 c31d4ad4 46246bee 3f800000 00000000 c31f7b0f c1c555d4 42df1467 4616446d 00000002 -> bc13d45d b9e877c4 bcef7c08 40219b52 c31f7b0f c1c555d4 42df1467 4616446d 3f800000 40000000", + "420271c2 c31746ee c18d7ba0 45b7dae5 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c2d47613 c22ad922 4323fca2 461c3ccd 00000001 -> 420271c2 c31746ee c18d7ba0 45b7dae5 c2d47613 c22ad922 4323fca2 461c3ccd 00000000 3f800000", + "bd1e6ccf 3b302264 bcb9d631 3fb5bf50 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3fcb116b 3fcf836d bf16cf29 4359ee3f 00000001 -> bd1e6ccf 3b302264 bcb9d631 3fb5bf50 3fcb116b 3fcf836d bf16cf29 4359ee3f 00000000 3f800000", + "c28594ae 426e7260 42624046 451e2aa3 c28594ae 426e7260 42624046 451e2aa3 00000000 3f800000 c28594ae 426e7260 42624046 451e2aa3 00000002 -> c28594ae 426e7260 42624046 451e2aa3 c28594ae 426e7260 42624046 451e2aa3 00000000 3f800000", + "bddfa669 3f033541 bec843ad 41f75324 41e9c188 42a799ae c197a51c 44d742c9 00000000 40000000 4051ab3a 3fc8f582 3e8c6af7 4294f96f 00000003 -> bddfa669 3f033541 bec843ad 41f75324 4051ab3a 3fc8f582 3e8c6af7 4294f96f 00000000 40400000", + "3ea978b3 3ec43d61 3eda49f0 42a742b2 3ea978b3 3ec43d61 3eda49f0 42a742b2 00000000 3f800000 c271f704 c2399db2 42598c86 44fc77ff 00000002 -> 3ea978b3 3ec43d61 3eda49f0 42a742b2 3ea978b3 3ec43d61 3eda49f0 42a742b2 00000000 3f800000", + "beb25dd8 bd199571 be06ded4 41ea2ea4 bf3b0ccd beddbba3 be0db400 4298a09c 00000000 3f800000 432334df 423c810e c21a1860 45ebd208 00000002 -> beb25dd8 bd199571 be06ded4 41ea2ea4 bf3b0ccd beddbba3 be0db400 4298a09c 00000000 3f800000", + "bc7a27a0 bc1bb1bf bd8c57ec 3ff86a9d 3c614f47 3dba853a 3b9c689c 4077aec8 40000000 00000000 bc7a27a0 bc1bb1bf bd8c57ec 3ff86a9d 00000003 -> bc7a27a0 bc1bb1bf bd8c57ec 3ff86a9d bc7a27a0 bc1bb1bf bd8c57ec 3ff86a9d 40000000 40400000", + "3c9af50b bcf0c240 3ccfa8f0 408c1922 bd5e755c bd21fccf 3d20244b 40d5fe45 3f800000 40000000 3c9af50b bcf0c240 3ccfa8f0 408c1922 00000003 -> 3c9af50b bcf0c240 3ccfa8f0 408c1922 3c9af50b bcf0c240 3ccfa8f0 408c1922 3f800000 40400000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 414b48b8 430497a1 c0688520 45832932 00000000 -> 414b48b8 430497a1 c0688520 45832932 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "baf0a770 bbdee7cd bbebedb7 3f498843 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3f9cf1d4 c0d10947 4022abb9 4400cbee 00000001 -> baf0a770 bbdee7cd bbebedb7 3f498843 3f9cf1d4 c0d10947 4022abb9 4400cbee 00000000 3f800000", + "424ffb4c 4224942c c20885fe 44ab2123 00000000 00000000 00000000 7149f2ca 00000000 bf800000 424ffb4c 4224942c c20885fe 44ab2123 00000001 -> 424ffb4c 4224942c c20885fe 44ab2123 424ffb4c 4224942c c20885fe 44ab2123 00000000 3f800000", + "3a646677 3c2c70a2 3b8f774b 3f1a92bc 42a3a167 41e456a0 42008583 45011df9 3f800000 00000000 c1b3c4ac c24b740e c2f15a82 4580fcf3 00000002 -> 3a646677 3c2c70a2 3b8f774b 3f1a92bc 42a3a167 41e456a0 42008583 45011df9 3f800000 00000000", + "3ae41256 3e0bf3bb bd654545 41066157 3ae41256 3e0bf3bb bd654545 41066157 00000000 3f800000 40630f97 403910ef c08313e0 43af5059 00000002 -> 3ae41256 3e0bf3bb bd654545 41066157 3ae41256 3e0bf3bb bd654545 41066157 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c2a9ad9e c2517e5f c1200168 4512a0f8 00000000 -> c2a9ad9e c2517e5f c1200168 4512a0f8 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "c2816619 c27bb7e8 42894b73 4541c496 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c2816619 c27bb7e8 42894b73 4541c496 00000001 -> c2816619 c27bb7e8 42894b73 4541c496 c2816619 c27bb7e8 42894b73 4541c496 00000000 3f800000", + "427c0452 c33e03ac c260129a 4625a167 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3cc8664f 3c90e04e 3c69120d 3fe9bb37 00000001 -> 3cc8664f 3c90e04e 3c69120d 3fe9bb37 427c0452 c33e03ac c260129a 4625a167 3f800000 00000000", + "c0e68880 c0c021e0 42e23418 45402487 c1e57e10 c2864e27 42ba3670 45551893 3f800000 00000000 bc0f79dc bab741bb 3b9be191 3f0ce6e1 00000003 -> bc0f79dc bab741bb 3b9be191 3f0ce6e1 c0e68880 c0c021e0 42e23418 45402487 40400000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3b13cdf3 3ac5e068 3c630dd8 3f7f6ead 00000000 -> 3b13cdf3 3ac5e068 3c630dd8 3f7f6ead 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c2726950 c28aa340 c1f745e4 4510d349 00000000 -> c2726950 c28aa340 c1f745e4 4510d349 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "bc5fa7fc 3cd3b382 bcf04139 408c7852 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bc5fa7fc 3cd3b382 bcf04139 408c7852 00000001 -> bc5fa7fc 3cd3b382 bcf04139 408c7852 bc5fa7fc 3cd3b382 bcf04139 408c7852 00000000 3f800000", + "bda4d694 3eab468b bdfe2036 41b7852e 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3d65dc3d 3d56215f bd83db55 4106f2f3 00000001 -> 3d65dc3d 3d56215f bd83db55 4106f2f3 bda4d694 3eab468b bdfe2036 41b7852e 3f800000 00000000", + "41aa8920 c2135a1a 42885a63 44c3f48a 00000000 00000000 00000000 7149f2ca 00000000 bf800000 4181988c 4248e2b4 c2b38758 4527b942 00000001 -> 41aa8920 c2135a1a 42885a63 44c3f48a 4181988c 4248e2b4 c2b38758 4527b942 00000000 3f800000", + "bf6bf0a8 bf2a7884 be9d805e 42fccf39 4209ab62 42011d1c 42044adc 4447ecb5 3f800000 00000000 4209ab62 42011d1c 42044adc 4447ecb5 00000002 -> bf6bf0a8 bf2a7884 be9d805e 42fccf39 4209ab62 42011d1c 42044adc 4447ecb5 3f800000 00000000", + "be137c4f bfe0d73a bd98736c 4257149f 00000000 00000000 00000000 7149f2ca 00000000 bf800000 417d8e10 c21a9e5d c27528e2 448e1020 00000001 -> be137c4f bfe0d73a bd98736c 4257149f 417d8e10 c21a9e5d c27528e2 448e1020 00000000 3f800000", + "3c49e866 3afd6ffc 3cd16d78 3fc08fdc 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bd85cec2 3e0732de be38f9d5 41af92f9 00000001 -> 3c49e866 3afd6ffc 3cd16d78 3fc08fdc bd85cec2 3e0732de be38f9d5 41af92f9 00000000 3f800000", + "c00c0b50 424e1114 c1939bd4 44397c79 c288da0d c108e1a0 41a96dd4 4493a31c 00000000 3f800000 427d38f8 42b00f47 4270524d 4567e453 00000002 -> c00c0b50 424e1114 c1939bd4 44397c79 c288da0d c108e1a0 41a96dd4 4493a31c 00000000 3f800000", + "3ee63d72 c035efd7 bf30a65d 43891c11 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3ee63d72 c035efd7 bf30a65d 43891c11 00000001 -> 3ee63d72 c035efd7 bf30a65d 43891c11 3ee63d72 c035efd7 bf30a65d 43891c11 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c0fd9490 428605c4 420dbc48 448cfeac 00000000 -> c0fd9490 428605c4 420dbc48 448cfeac 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3f30b3f6 bf06b457 3e840169 423cba51 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bd837096 3d167561 bd32782f 40aeaf4d 00000001 -> bd837096 3d167561 bd32782f 40aeaf4d 3f30b3f6 bf06b457 3e840169 423cba51 3f800000 00000000", + "bc13cfff bb9aef87 bbf736ed 3f3a7c51 c2bd5fed 42773160 c03c49e0 45406f69 00000000 3f800000 3d60532a bf93a8ac bf276911 42a03eff 00000002 -> bc13cfff bb9aef87 bbf736ed 3f3a7c51 3d60532a bf93a8ac bf276911 42a03eff 00000000 40000000", + "3c80a275 3c69940f bd180c79 407f1dec c09ad4c0 41d11cf8 424ea56c 441ba26b 40000000 3f800000 3ab55b2c baa45f0a 3c866e11 3fc2581b 00000003 -> 3ab55b2c baa45f0a 3c866e11 3fc2581b 3c80a275 3c69940f bd180c79 407f1dec 40400000 40000000", + "408ae760 c28ec3bd 4270aa52 4502b8e4 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c2ea2c30 c290ebb4 40718fe0 459436bc 00000001 -> 408ae760 c28ec3bd 4270aa52 4502b8e4 c2ea2c30 c290ebb4 40718fe0 459436bc 00000000 3f800000", + "42ed69f8 4289febb c0c47e68 45931a5a 42ed69f8 4289febb c0c47e68 45931a5a 00000000 3f800000 4145b6a8 42d9fd88 c2ce2e01 45b07d31 00000002 -> 42ed69f8 4289febb c0c47e68 45931a5a 42ed69f8 4289febb c0c47e68 45931a5a 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c271e8aa c28195c0 c1aca12c 44e0cd90 00000000 -> c271e8aa c28195c0 c1aca12c 44e0cd90 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3d05f1e0 3cc3b793 bda24454 40edc1c2 00000000 00000000 00000000 7149f2ca 00000000 bf800000 42d77127 4273e2aa 41ec215c 4576f138 00000001 -> 3d05f1e0 3cc3b793 bda24454 40edc1c2 42d77127 4273e2aa 41ec215c 4576f138 00000000 3f800000", + "3ba1180d bce43418 3dca63fe 40dbda6d 3e41d151 c10fdc9c bffde594 4443758f 00000000 3f800000 c303a69b c218ce90 c225953c 459a9521 00000003 -> 3ba1180d bce43418 3dca63fe 40dbda6d 3e41d151 c10fdc9c bffde594 4443758f 00000000 3f800000", + "3f2db8f0 3e18c440 bf1c5337 419a404f 3f2db8f0 3e18c440 bf1c5337 419a404f 3f800000 40000000 c1f5beb4 c2a8427d 432d71ca 4614d181 00000003 -> 3f2db8f0 3e18c440 bf1c5337 419a404f 3f2db8f0 3e18c440 bf1c5337 419a404f 3f800000 40000000", + "3f85165b bf090751 bee3084a 427a56e0 c26278de 424a456c c1c8cfc0 44a64ae2 3f800000 00000000 41fda546 c2ab0abe c23533e8 451b6ac7 00000002 -> 3f85165b bf090751 bee3084a 427a56e0 c26278de 424a456c c1c8cfc0 44a64ae2 3f800000 00000000", + "c293f1c7 c29dd49a 429dc75d 458b82ec 00000000 00000000 00000000 7149f2ca 00000000 bf800000 4004ed88 c06ed0b8 40e3df67 42748dd5 00000001 -> 4004ed88 c06ed0b8 40e3df67 42748dd5 c293f1c7 c29dd49a 429dc75d 458b82ec 3f800000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3f51a26b c022c902 3f1d51af 4323ddba 00000000 -> 3f51a26b c022c902 3f1d51af 4323ddba 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "43086e26 c29940c8 41675308 45be97b5 43086e26 c29940c8 41675308 45be97b5 00000000 3f800000 c3070a1c 424d69f7 423c5fbc 45a9b594 00000002 -> c3070a1c 424d69f7 423c5fbc 45a9b594 43086e26 c29940c8 41675308 45be97b5 40000000 00000000", + "3f3664c2 c043277d 3fd11107 431b3ede 3f3664c2 c043277d 3fd11107 431b3ede 00000000 3f800000 3e97a388 be41468f 3ea73cbf 41c651bd 00000002 -> 3e97a388 be41468f 3ea73cbf 41c651bd 3f3664c2 c043277d 3fd11107 431b3ede 40000000 00000000", + "3cca1fca 3e84eb79 3f71cfe9 42601b02 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c32d36e9 c03f92c0 4207c9d4 45f35fe7 00000001 -> 3cca1fca 3e84eb79 3f71cfe9 42601b02 c32d36e9 c03f92c0 4207c9d4 45f35fe7 00000000 3f800000", + "3c7a0b5d 3b26831b 39ab53a9 3f0f487d bc7da687 3c976eee bbb55e76 3fab16f1 3f800000 40000000 c1b1ed68 c1f9ed70 3fa64400 43a0698c 00000003 -> 3c7a0b5d 3b26831b 39ab53a9 3f0f487d bc7da687 3c976eee bbb55e76 3fab16f1 3f800000 40000000", + "3cb2fe95 bd0fe5d4 bce403d9 40b1c29e 3e03e6ec be0dd2bc 3e6222b8 41bd7081 00000000 3f800000 42d00a5e 41934a0c c29d0587 457e940f 00000002 -> 3cb2fe95 bd0fe5d4 bce403d9 40b1c29e 3e03e6ec be0dd2bc 3e6222b8 41bd7081 00000000 3f800000", + "bb3ab04d 3a8fd1f3 3c3863f7 3f02d64b c1f69c00 c1dc8de0 c0df73a0 43b3a2da 40000000 3f800000 c1f69c00 c1dc8de0 c0df73a0 43b3a2da 00000003 -> bb3ab04d 3a8fd1f3 3c3863f7 3f02d64b c1f69c00 c1dc8de0 c0df73a0 43b3a2da 40000000 3f800000", + "bce828f8 bc7a761c be1b44b1 40dd4f7d c1b5c9b4 42ce7d33 41dce056 45292d52 00000000 3f800000 c303d083 426e0100 42be94c1 45e649e5 00000002 -> bce828f8 bc7a761c be1b44b1 40dd4f7d c1b5c9b4 42ce7d33 41dce056 45292d52 00000000 3f800000", + "42368a04 424db178 420f3f94 44bbc323 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bc805d37 bb2cbcc8 bbe3cd71 3fb84560 00000001 -> bc805d37 bb2cbcc8 bbe3cd71 3fb84560 42368a04 424db178 420f3f94 44bbc323 3f800000 00000000", + "bb899415 3bb8c94c bc277506 3f46f591 bd3c4b33 bd84f25b bd0dc4c1 40512b54 3f800000 00000000 41ba3a94 c1dbfbc4 42db661d 4544274c 00000002 -> bb899415 3bb8c94c bc277506 3f46f591 bd3c4b33 bd84f25b bd0dc4c1 40512b54 3f800000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c182bd6c bff7f160 4201301e c21b70e0 00000000 -> c182bd6c bff7f160 4201301e c21b70e0 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 42d9211c c276c156 bf916f80 455be192 00000000 -> 42d9211c c276c156 bf916f80 455be192 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bf587c27 bf0356b3 bf2df166 425887c3 00000000 -> bf587c27 bf0356b3 bf2df166 425887c3 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 4101fef0 4250ba91 40ddad10 440387c8 00000000 -> 4101fef0 4250ba91 40ddad10 440387c8 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 41aa8ef0 c22e68fa 42950374 44ed2f77 00000000 -> 41aa8ef0 c22e68fa 42950374 44ed2f77 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3ef453ea c012a475 3ffa57c5 428f654d 3ef453ea c012a475 3ffa57c5 428f654d 00000000 3f800000 bcbeefeb 3d64fa13 bc90d89b 40274a84 00000002 -> bcbeefeb 3d64fa13 bc90d89b 40274a84 3ef453ea c012a475 3ffa57c5 428f654d 40000000 00000000", + "b959870a 3be8682e 3c135f9a 3f834a92 422a61fa c1e28550 c3095bb4 45a01903 3f800000 40000000 c277d3a6 42a87f29 c1bbdca0 452aab01 00000003 -> b959870a 3be8682e 3c135f9a 3f834a92 c277d3a6 42a87f29 c1bbdca0 452aab01 3f800000 40400000", + "c2c48e9a 42122038 c225a3ab 452fbee5 c2c48e9a 42122038 c225a3ab 452fbee5 00000000 3f800000 3f678aae 3d7d5ca9 3f7ef42c 42866602 00000002 -> 3f678aae 3d7d5ca9 3f7ef42c 42866602 c2c48e9a 42122038 c225a3ab 452fbee5 40000000 00000000", + "417491dc c19566dc c11785d0 43015535 c3166646 41ff106c 403f7f60 45b436c8 00000000 3f800000 c26751e0 4258a170 c19899e4 44cee37f 00000003 -> 417491dc c19566dc c11785d0 43015535 c26751e0 4258a170 c19899e4 44cee37f 00000000 40400000", + "c22743fc c15915a0 421a2e86 443c54d8 c21451c6 42b7bc45 42e41125 45b154b4 00000000 3f800000 c21451c6 42b7bc45 42e41125 45b154b4 00000003 -> c22743fc c15915a0 421a2e86 443c54d8 c21451c6 42b7bc45 42e41125 45b154b4 00000000 3f800000", + "3f7bd7b1 4057521e c0bb5277 43b66666 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bf875b3f bab2cf8e bf54f141 425c1edb 00000001 -> bf875b3f bab2cf8e bf54f141 425c1edb 3f7bd7b1 4057521e c0bb5277 43b66666 3f800000 00000000", + "bce7b8d3 3d8c7ee0 bd2a7373 4023f8a3 bce7b8d3 3d8c7ee0 bd2a7373 4023f8a3 00000000 3f800000 bd43d43a bc4b829c 3d418c8d 407245e1 00000003 -> bce7b8d3 3d8c7ee0 bd2a7373 4023f8a3 bce7b8d3 3d8c7ee0 bd2a7373 4023f8a3 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 418f4860 41cf2be0 c1a612ec 43aa00f9 00000000 -> 418f4860 41cf2be0 c1a612ec 43aa00f9 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3f95c8db 40220788 bfb39c29 4321d920 00000000 -> 3f95c8db 40220788 bfb39c29 4321d920 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "befb3487 be83a35a be9ab225 42447b45 c28529f4 430ceab0 41f90480 45c4fce7 00000000 40000000 c16c6348 406cafc0 c0963c90 c33bf8c4 00000003 -> c16c6348 406cafc0 c0963c90 c33bf8c4 befb3487 be83a35a be9ab225 42447b45 40400000 00000000", + "bda83f96 3e004bf2 3e623f5d 418cc511 bda83f96 3e004bf2 3e623f5d 418cc511 3f800000 40000000 c2e63c9a 4195f630 42bd0659 45a60efa 00000003 -> bda83f96 3e004bf2 3e623f5d 418cc511 bda83f96 3e004bf2 3e623f5d 418cc511 3f800000 40000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bd40beba 3d5ba4fa bf29f189 427707ec 00000000 -> bd40beba 3d5ba4fa bf29f189 427707ec 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "42f092a8 429fe52b c26d9e3e 45bb8de4 42f092a8 429fe52b c26d9e3e 45bb8de4 00000000 3f800000 c21647e4 40657a80 42aaeb54 44f1cc3c 00000002 -> c21647e4 40657a80 42aaeb54 44f1cc3c 42f092a8 429fe52b c26d9e3e 45bb8de4 40000000 00000000", + "bc16420b 3e1f09c1 3dbec8f2 41894ed5 c14353d8 41fea504 4221cf94 4425ee98 00000000 3f800000 42bac5d8 c2bf3634 4170d9b0 458129aa 00000003 -> bc16420b 3e1f09c1 3dbec8f2 41894ed5 c14353d8 41fea504 4221cf94 4425ee98 00000000 3f800000", + "c2a619b6 c2c4bc54 c28310c8 45a124b8 c19d62ac c2f171c5 42b4578a 45b005d1 00000000 3f800000 43162bd3 42baedb2 c300bcea 4635c4e8 00000002 -> c2a619b6 c2c4bc54 c28310c8 45a124b8 c19d62ac c2f171c5 42b4578a 45b005d1 00000000 3f800000", + "c305a6f6 c2c0767d 42a4dc89 45fcfd03 c305a6f6 c2c0767d 42a4dc89 45fcfd03 00000000 3f800000 c1ce5ecc c18b5908 42a2ca96 44ec72e2 00000002 -> c1ce5ecc c18b5908 42a2ca96 44ec72e2 c305a6f6 c2c0767d 42a4dc89 45fcfd03 40000000 00000000", + "be9ee657 3f4ef215 40214301 42cd2d00 42ee9682 c2068a5f 432405a6 462488cf 00000000 3f800000 c1f58a8c 42296fc4 418bf3c4 43fac65b 00000003 -> be9ee657 3f4ef215 40214301 42cd2d00 c1f58a8c 42296fc4 418bf3c4 43fac65b 00000000 40400000", + "3f9bab8a bf1baf24 bf624495 42972480 c04ee8b8 3ea14132 406760eb 43b4f8ef 00000000 3f800000 3f9bab8a bf1baf24 bf624495 42972480 00000002 -> 3f9bab8a bf1baf24 bf624495 42972480 3f9bab8a bf1baf24 bf624495 42972480 00000000 40000000", + "bfc25a1d bf4fbc4f be4eb2ce 42bbb0f3 bfc25a1d bf4fbc4f be4eb2ce 42bbb0f3 00000000 3f800000 4252812e 4245faa0 42af851d 453b07b8 00000002 -> bfc25a1d bf4fbc4f be4eb2ce 42bbb0f3 bfc25a1d bf4fbc4f be4eb2ce 42bbb0f3 00000000 3f800000", + "c00bdc5e c0e9dcf6 bca1ad4d 43298244 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3ab1fd2b 3c4c6392 3c854ab7 40102806 00000001 -> 3ab1fd2b 3c4c6392 3c854ab7 40102806 c00bdc5e c0e9dcf6 bca1ad4d 43298244 3f800000 00000000", + "be09627a bcceb8e3 be39ef44 40790957 00000000 00000000 00000000 7149f2ca 00000000 bf800000 be09627a bcceb8e3 be39ef44 40790957 00000001 -> be09627a bcceb8e3 be39ef44 40790957 be09627a bcceb8e3 be39ef44 40790957 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c17869d0 c24cac64 c2415a02 44907ade 00000000 -> c17869d0 c24cac64 c2415a02 44907ade 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3f072d06 bea9e9a0 3eeea099 4285b1a8 00000000 00000000 00000000 7149f2ca 00000000 bf800000 425d5bd4 c294d6bd c29ddff9 45565949 00000001 -> 3f072d06 bea9e9a0 3eeea099 4285b1a8 425d5bd4 c294d6bd c29ddff9 45565949 00000000 3f800000", + "c2367b15 c210b88e c321ada5 45e63612 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c336ff86 4284a1c5 c19b3590 46154409 00000001 -> c2367b15 c210b88e c321ada5 45e63612 c336ff86 4284a1c5 c19b3590 46154409 00000000 3f800000", + "3d25ebe7 3bfafc63 3cf712ad 4020c92a 42221570 c3221373 415822d0 45da51a2 00000000 3f800000 42221570 c3221373 415822d0 45da51a2 00000002 -> 3d25ebe7 3bfafc63 3cf712ad 4020c92a 42221570 c3221373 415822d0 45da51a2 00000000 3f800000", + "bd6e172d beb1cd6e bc1f32c9 42050795 4258fa14 c0979de0 c3172044 45c5f3d6 40000000 00000000 4258fa14 c0979de0 c3172044 45c5f3d6 00000003 -> bd6e172d beb1cd6e bc1f32c9 42050795 4258fa14 c0979de0 c3172044 45c5f3d6 40000000 00000000", + "3aa84f7a bc8d7908 39da7c99 3fa0fbaf bddb8690 bd111f90 bdca297e 3fcd8cfe 00000000 3f800000 c21023a8 42b00352 c0d5a490 44f6e4b3 00000003 -> 3aa84f7a bc8d7908 39da7c99 3fa0fbaf bddb8690 bd111f90 bdca297e 3fcd8cfe 00000000 3f800000", + "be008a9a 3d7b5c82 3e545044 41559df1 3e88cdec c00f8e7f 3f1df1e8 4187790e 00000000 40000000 3e88cdec c00f8e7f 3f1df1e8 4187790e 00000003 -> be008a9a 3d7b5c82 3e545044 41559df1 3e88cdec c00f8e7f 3f1df1e8 4187790e 00000000 40000000", + "3e3a546b 3d27e67a 3c955da2 416fd974 c1a593a8 c2e61e26 c199a008 454f265e 00000000 3f800000 42ee9da9 c3095a27 430e55bf 46503911 00000003 -> 3e3a546b 3d27e67a 3c955da2 416fd974 c1a593a8 c2e61e26 c199a008 454f265e 00000000 3f800000", + "43037045 c3037362 411e86f0 4602ec45 43037045 c3037362 411e86f0 4602ec45 00000000 3f800000 43037045 c3037362 411e86f0 4602ec45 00000002 -> 43037045 c3037362 411e86f0 4602ec45 43037045 c3037362 411e86f0 4602ec45 00000000 3f800000", + "bcb55c8f 3b59d263 bc9f0a94 401be566 bcb55c8f 3b59d263 bc9f0a94 401be566 00000000 3f800000 bd8b8259 be0ea4d9 3dc610ef 40e41c6c 00000002 -> bcb55c8f 3b59d263 bc9f0a94 401be566 bcb55c8f 3b59d263 bc9f0a94 401be566 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 40aad8d0 c29b2ef7 c29d6f64 45296721 00000000 -> 40aad8d0 c29b2ef7 c29d6f64 45296721 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "bf17ebd8 3efef62a 3f3674fe 428faf9a 40003bf5 3f2be27e c013351e 431d3b59 00000000 40000000 40003bf5 3f2be27e c013351e 431d3b59 00000003 -> bf17ebd8 3efef62a 3f3674fe 428faf9a 40003bf5 3f2be27e c013351e 431d3b59 00000000 40000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c30927d0 42b7494d 42cb8da4 460eb075 00000000 -> c30927d0 42b7494d 42cb8da4 460eb075 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bd22196a 3bf7d145 3e2124f2 4132d98e 00000000 -> bd22196a 3bf7d145 3e2124f2 4132d98e 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "be4b68f8 3d752a44 be6252e4 41ad187c c2b33229 42d3e1c0 c2cd3f92 45dca85c 00000000 3f800000 bf3647d3 3f25f329 3eac4c42 42d4e2ab 00000002 -> be4b68f8 3d752a44 be6252e4 41ad187c bf3647d3 3f25f329 3eac4c42 42d4e2ab 00000000 40000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 4293fbe4 c306030d 41f6af74 45b47feb 00000000 -> 4293fbe4 c306030d 41f6af74 45b47feb 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "bb7f8fcf ba1504e0 3c2dc4e5 3f11bd7c bb7f8fcf ba1504e0 3c2dc4e5 3f11bd7c 00000000 3f800000 c1600a30 41ebd4bc 42cadf57 452e18bd 00000003 -> bb7f8fcf ba1504e0 3c2dc4e5 3f11bd7c bb7f8fcf ba1504e0 3c2dc4e5 3f11bd7c 00000000 3f800000", + "415fc530 4274c744 c15ecd60 447504ee 4229ea81 c30558c4 4328748f 463aafb1 40000000 00000000 3feed354 c00b4c2b c02e6d49 43e3eb04 00000003 -> 3feed354 c00b4c2b c02e6d49 43e3eb04 415fc530 4274c744 c15ecd60 447504ee 40400000 40000000", + "420e84d8 42816339 c2b89b38 4558fe53 c216bc00 c1caaee0 c2f8743e 458470ec 3f800000 00000000 42458ee4 c0eadf88 c1aa0468 43cb8ec1 00000003 -> 42458ee4 c0eadf88 c1aa0468 43cb8ec1 420e84d8 42816339 c2b89b38 4558fe53 40400000 3f800000", + "3ca8ebf6 3c8f8a06 3d62d0de 407b4dea 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3b720389 3cc63820 bd02971e 3fb700c5 00000001 -> 3b720389 3cc63820 bd02971e 3fb700c5 3ca8ebf6 3c8f8a06 3d62d0de 407b4dea 3f800000 00000000", + "3dd1c23f bdd11d16 bdfe4539 4170d6b9 428c4e71 411d0a58 c2872e0f 44fe8d24 00000000 40000000 4276f778 c2d45b83 414aaa00 455d7861 00000003 -> 3dd1c23f bdd11d16 bdfe4539 4170d6b9 428c4e71 411d0a58 c2872e0f 44fe8d24 00000000 40000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 4015f838 bf944c7e 3ea68997 43441841 00000000 -> 4015f838 bf944c7e 3ea68997 43441841 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "4211df3c 41c20998 403046a0 4391ff0c 4117f960 c1ba719c c307be85 459147a4 00000000 3f800000 4211df3c 41c20998 403046a0 4391ff0c 00000003 -> 4211df3c 41c20998 403046a0 4391ff0c 4211df3c 41c20998 403046a0 4391ff0c 00000000 40400000", + "bc827444 bc0e448f 3c27e00b 3fca9892 c314fc6e 42ed2105 4211e2f2 460f294b 00000000 40000000 c2fd17d6 c2bd3427 c337d6ea 4662eb0d 00000003 -> bc827444 bc0e448f 3c27e00b 3fca9892 c314fc6e 42ed2105 4211e2f2 460f294b 00000000 40000000", + "c09d1cff bf96b6ed bf893af7 4400b5e7 c09d1cff bf96b6ed bf893af7 4400b5e7 00000000 3f800000 c09d1cff bf96b6ed bf893af7 4400b5e7 00000002 -> c09d1cff bf96b6ed bf893af7 4400b5e7 c09d1cff bf96b6ed bf893af7 4400b5e7 00000000 3f800000", + "bd452123 40ac0259 40840c1c 44143b18 bd452123 40ac0259 40840c1c 44143b18 00000000 3f800000 bd452123 40ac0259 40840c1c 44143b18 00000003 -> bd452123 40ac0259 40840c1c 44143b18 bd452123 40ac0259 40840c1c 44143b18 00000000 3f800000", + "bdafb44b 3e04c526 3e49e227 41b3cc88 c2516783 c300c14a 42e5e4e3 45fb2d32 00000000 3f800000 42c47ef7 425f1578 c205d48b 454398c7 00000002 -> bdafb44b 3e04c526 3e49e227 41b3cc88 42c47ef7 425f1578 c205d48b 454398c7 00000000 40000000", + "3ed5c5b9 bf5f3030 bd1afa4f 4276eb8b 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bc064cf0 3c7eb2c1 3c6d707f 400ec6b7 00000001 -> bc064cf0 3c7eb2c1 3c6d707f 400ec6b7 3ed5c5b9 bf5f3030 bd1afa4f 4276eb8b 3f800000 00000000", + "be03c764 be5333df be334a8c 41ebb5da 00000000 00000000 00000000 7149f2ca 00000000 bf800000 4306ab44 425b4090 42346c2c 45b4b64d 00000001 -> be03c764 be5333df be334a8c 41ebb5da 4306ab44 425b4090 42346c2c 45b4b64d 00000000 3f800000", + "4309c569 c2068eac 42c4d8c2 45e4fcdb 4309c569 c2068eac 42c4d8c2 45e4fcdb 00000000 3f800000 bc961f0c bcbef847 3c81bce4 4013ea5e 00000002 -> bc961f0c bcbef847 3c81bce4 4013ea5e 4309c569 c2068eac 42c4d8c2 45e4fcdb 40000000 00000000", + "424a089a 419d5fa2 c3022135 4598e5a5 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c26966cd c20e601f 40bd60e0 44664eed 00000001 -> c26966cd c20e601f 40bd60e0 44664eed 424a089a 419d5fa2 c3022135 4598e5a5 3f800000 00000000", + "c26231e0 c2da157a c23b9fc8 4583b967 c2a5e2f7 430762a6 4272a14e 45dd9dab 00000000 3f800000 bd4cfe29 3ced3c59 bda829ec 40e5a999 00000002 -> bd4cfe29 3ced3c59 bda829ec 40e5a999 c26231e0 c2da157a c23b9fc8 4583b967 40000000 00000000", + "bdef5aec 3e55f793 3e2ef221 418260d5 bffcdeb0 c091f518 40812a20 4421573f 3f800000 00000000 3dfb30a1 bda4fe69 bccc287c 414362db 00000003 -> 3dfb30a1 bda4fe69 bccc287c 414362db bdef5aec 3e55f793 3e2ef221 418260d5 40400000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 431c4ef8 4233ba64 c11e9d78 45c47ad0 00000000 -> 431c4ef8 4233ba64 c11e9d78 45c47ad0 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c12b23e8 401e45a0 c26e7f32 444d4798 00000000 -> c12b23e8 401e45a0 c26e7f32 444d4798 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 42b4ef76 42b58574 42e1ffed 45e3a2d1 00000000 -> 42b4ef76 42b58574 42e1ffed 45e3a2d1 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3bd58ec0 bd339398 bb9552b8 406586b4 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c27a7862 c32a2d0a c3352854 467fffa1 00000001 -> 3bd58ec0 bd339398 bb9552b8 406586b4 c27a7862 c32a2d0a c3352854 467fffa1 00000000 3f800000", + "4000a047 bfe65580 c0016997 432ff332 00000000 00000000 00000000 7149f2ca 00000000 bf800000 425406ee c266f962 41a9996e 449e6843 00000001 -> 4000a047 bfe65580 c0016997 432ff332 425406ee c266f962 41a9996e 449e6843 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 41ac2258 420c61e8 c1e79d18 4416fdda 00000000 -> 41ac2258 420c61e8 c1e79d18 4416fdda 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3c914d3b bd0d5bcd 3cca1ec6 3fc479d2 c1e420c4 4215f174 c0a42000 440b3c75 3f800000 00000000 c2ab6a12 c3224548 430eaacb 46521750 00000002 -> 3c914d3b bd0d5bcd 3cca1ec6 3fc479d2 c1e420c4 4215f174 c0a42000 440b3c75 3f800000 00000000", + "4262aaae c2ee20ab c299aea1 45ab0ef8 00000000 00000000 00000000 7149f2ca 00000000 bf800000 4311f378 42e373ee 42563ecc 460b77c5 00000001 -> 4262aaae c2ee20ab c299aea1 45ab0ef8 4311f378 42e373ee 42563ecc 460b77c5 00000000 3f800000", + "3e1c5d4d be4fd087 bae32449 41c25d7d 40233e5c c0364ef7 4052c663 426bbe07 40000000 00000000 42147c64 c1cdd2f4 c2291a6e 444a643d 00000003 -> 3e1c5d4d be4fd087 bae32449 41c25d7d 40233e5c c0364ef7 4052c663 426bbe07 40000000 00000000", + "bc9c3840 be7f350b be44d758 417d5c8b bc9c3840 be7f350b be44d758 417d5c8b 00000000 3f800000 bdace87c 3e483e71 be4cd544 41761134 00000003 -> bdace87c 3e483e71 be4cd544 41761134 bc9c3840 be7f350b be44d758 417d5c8b 40400000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bf98c93f 3feb60ae 3ec63e56 42f428bf 00000000 -> bf98c93f 3feb60ae 3ec63e56 42f428bf 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3b2ec8c7 bb84ff74 bd236ebb 401818ec c2cecc57 c31c5b52 bf935b80 460863f7 3f800000 00000000 3b2ec8c7 bb84ff74 bd236ebb 401818ec 00000002 -> 3b2ec8c7 bb84ff74 bd236ebb 401818ec 3b2ec8c7 bb84ff74 bd236ebb 401818ec 3f800000 40000000", + "4326fbae 42dd6510 40fdf710 46197bf0 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c1fd70cc c25ee05b 42467f24 44cd227b 00000001 -> c1fd70cc c25ee05b 42467f24 44cd227b 4326fbae 42dd6510 40fdf710 46197bf0 3f800000 00000000", + "3dca8f47 bc207fd0 3c650f31 40996455 42537b70 41c25e48 42d74b76 4565de52 00000000 3f800000 3f6f84f9 40c06afa 3ffb8eef 44131ba4 00000002 -> 3dca8f47 bc207fd0 3c650f31 40996455 3f6f84f9 40c06afa 3ffb8eef 44131ba4 00000000 40000000", + "3c2f26f7 3bee8ee9 3b3bf0af 3f8b9e85 3e8b6d53 be5232f2 3de7f7ed 4192f49c 40000000 00000000 3c2f26f7 3bee8ee9 3b3bf0af 3f8b9e85 00000003 -> 3c2f26f7 3bee8ee9 3b3bf0af 3f8b9e85 3c2f26f7 3bee8ee9 3b3bf0af 3f8b9e85 40000000 40400000", + "3beaed3f 3bb230ef 3bdb5be4 3e762ad6 3beaed3f 3bb230ef 3bdb5be4 3e762ad6 00000000 3f800000 bd00859b 3dda1c99 3d5d1bc6 41496c9b 00000003 -> 3beaed3f 3bb230ef 3bdb5be4 3e762ad6 3beaed3f 3bb230ef 3bdb5be4 3e762ad6 00000000 3f800000", + "3cfd1392 bd866492 bc902c6d 40d3b25f 41f0b060 c0c01e20 42d9628c 453ab490 40000000 3f800000 c1a92be0 c2b23369 430e806a 45dbb839 00000003 -> 3cfd1392 bd866492 bc902c6d 40d3b25f 41f0b060 c0c01e20 42d9628c 453ab490 40000000 3f800000", + "c05cd116 4033673e 3fb0dfef 43a4cb86 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bc04a30c 3d7a3454 3d95a2f3 40a55985 00000001 -> bc04a30c 3d7a3454 3d95a2f3 40a55985 c05cd116 4033673e 3fb0dfef 43a4cb86 3f800000 00000000", + "42806f36 42557b3c 422a568e 44e67023 00000000 00000000 00000000 7149f2ca 00000000 bf800000 42806f36 42557b3c 422a568e 44e67023 00000001 -> 42806f36 42557b3c 422a568e 44e67023 42806f36 42557b3c 422a568e 44e67023 00000000 3f800000", + "bc312c04 3a122517 bc5b0be3 3fa66efe c082e925 bfb680b7 40a89a70 43e80973 40000000 00000000 42affae1 41f80478 42d861fe 45962114 00000003 -> bc312c04 3a122517 bc5b0be3 3fa66efe c082e925 bfb680b7 40a89a70 43e80973 40000000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c0260391 4023c1f7 406be779 438130e9 00000000 -> c0260391 4023c1f7 406be779 438130e9 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3f0b18b3 c052281f bf86fe02 43651cb6 bfdd041e c0e1d572 c0c10cb4 442f8ac1 3f800000 00000000 bc80271e bc3a565c 3b8eb0d6 3f8c7e73 00000003 -> bc80271e bc3a565c 3b8eb0d6 3f8c7e73 3f0b18b3 c052281f bf86fe02 43651cb6 40400000 3f800000", + "be5c4a24 c0384976 bf6f8229 42adfc5d c27f6dab 41846650 41785fd0 444f4922 00000000 3f800000 bd87f3fa 3b1b76c6 bc7fc6d9 40a7ea52 00000002 -> bd87f3fa 3b1b76c6 bc7fc6d9 40a7ea52 be5c4a24 c0384976 bf6f8229 42adfc5d 40000000 00000000", + "4222b06e c1b36690 428ed7aa 44de318a 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c3043872 43019716 c2c60591 462b1d47 00000001 -> 4222b06e c1b36690 428ed7aa 44de318a c3043872 43019716 c2c60591 462b1d47 00000000 3f800000", + "be290b26 3e124b84 3e1425cb 41c1191c 00000000 00000000 00000000 7149f2ca 00000000 bf800000 be290b26 3e124b84 3e1425cb 41c1191c 00000001 -> be290b26 3e124b84 3e1425cb 41c1191c be290b26 3e124b84 3e1425cb 41c1191c 00000000 3f800000", + "beaddda5 be99b658 be887deb 420ddb73 c29387b9 c216aed4 430e042a 45d22e7f 00000000 3f800000 42298adc c2ce7a5f 41dfac50 45483dec 00000002 -> beaddda5 be99b658 be887deb 420ddb73 42298adc c2ce7a5f 41dfac50 45483dec 00000000 40000000", + "bf217c8d becc21d0 bf378e33 42c53108 bf217c8d becc21d0 bf378e33 42c53108 00000000 3f800000 bf217c8d becc21d0 bf378e33 42c53108 00000003 -> bf217c8d becc21d0 bf378e33 42c53108 bf217c8d becc21d0 bf378e33 42c53108 00000000 3f800000", + "c167ddc0 c1f40f78 4320be2c 45d2bda6 00000000 00000000 00000000 7149f2ca 00000000 bf800000 42a6931d 407c8e40 42a61cd5 4547a8c8 00000001 -> 42a6931d 407c8e40 42a61cd5 4547a8c8 c167ddc0 c1f40f78 4320be2c 45d2bda6 3f800000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c1e4e8a0 c25b8dec c2ce2346 4556aa42 00000000 -> c1e4e8a0 c25b8dec c2ce2346 4556aa42 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3fcb389b bfa59b45 bfe3cb26 4386cf2f c1a79864 c2560988 c241c9a4 44ae6380 3f800000 00000000 3fcb389b bfa59b45 bfe3cb26 4386cf2f 00000002 -> 3fcb389b bfa59b45 bfe3cb26 4386cf2f 3fcb389b bfa59b45 bfe3cb26 4386cf2f 3f800000 40000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 430dced8 c2d3b8a0 41c3f5b8 45f4e96b 00000000 -> 430dced8 c2d3b8a0 41c3f5b8 45f4e96b 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c30244bd c314b27a c2241c9c 461f3b8e 00000000 -> c30244bd c314b27a c2241c9c 461f3b8e 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3f8ec21f 3f13a3d0 be7dd51e 42b950fc 00000000 -> 3f8ec21f 3f13a3d0 be7dd51e 42b950fc 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "425205f8 423462c8 c1805658 445d1b32 432395c6 bd4fb000 c2291eef 45dd6214 3f800000 00000000 3e3f984b bdc5b7d5 befc9897 41f9ca97 00000002 -> 3e3f984b bdc5b7d5 befc9897 41f9ca97 425205f8 423462c8 c1805658 445d1b32 40000000 3f800000", + "3c377337 bdb000af befabf23 41cc53af 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3cbfa657 bd854ed7 be2c11d1 4135a8d3 00000001 -> 3cbfa657 bd854ed7 be2c11d1 4135a8d3 3c377337 bdb000af befabf23 41cc53af 3f800000 00000000", + "3bc0eff7 bbde0001 bc671ae8 3f93e1bd 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3bc0eff7 bbde0001 bc671ae8 3f93e1bd 00000001 -> 3bc0eff7 bbde0001 bc671ae8 3f93e1bd 3bc0eff7 bbde0001 bc671ae8 3f93e1bd 00000000 3f800000", + "bc998664 3c00cd54 3af4f061 3f28e0b7 bd5b6dd6 bdc2e0d1 3de4ff70 410f6a1e 40000000 00000000 3c965ae9 bca5e084 3df57fac 40daf44d 00000003 -> bc998664 3c00cd54 3af4f061 3f28e0b7 3c965ae9 bca5e084 3df57fac 40daf44d 40000000 40400000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bcb99379 bc59010a bb97feb0 400fa465 00000000 -> bcb99379 bc59010a bb97feb0 400fa465 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "c19784d6 42567558 41bcbf08 4441b7f6 42e6f537 c268519e c264ca6e 459bf263 40000000 00000000 3dd9a9b0 bc924e18 bd9ab0c9 40809c6a 00000003 -> 3dd9a9b0 bc924e18 bd9ab0c9 40809c6a c19784d6 42567558 41bcbf08 4441b7f6 40400000 40000000", + "3e7bde79 be534dda 3d6961e2 41f2d462 3e20e584 c01d87cf c015bf2e 433edf85 40000000 00000000 428cfa5d 42e0b108 4315c424 461bf506 00000003 -> 3e7bde79 be534dda 3d6961e2 41f2d462 3e20e584 c01d87cf c015bf2e 433edf85 40000000 00000000", + "3cd556db 3d5d1ead 3c392b85 40808000 bd39fc6e 3c08e03d bd80f472 40f945bc 00000000 3f800000 41ad7282 42d08441 c24f1cde 455aaa85 00000002 -> 3cd556db 3d5d1ead 3c392b85 40808000 bd39fc6e 3c08e03d bd80f472 40f945bc 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c1c51684 424bc8e0 41848608 442ff6a8 00000000 -> c1c51684 424bc8e0 41848608 442ff6a8 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "bd750162 bd911a5a bce396fe 40d9975d 4223561a c30c1c54 4263739e 45ba34f9 00000000 3f800000 c2d1460c c18c35e4 c21715b8 45398b24 00000003 -> bd750162 bd911a5a bce396fe 40d9975d c2d1460c c18c35e4 c21715b8 45398b24 00000000 40400000", + "c2f28601 c2a0b57c 432e37ab 464462e5 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c0268eab c07cf20f c00df25d 440b5d37 00000001 -> c0268eab c07cf20f c00df25d 440b5d37 c2f28601 c2a0b57c 432e37ab 464462e5 3f800000 00000000", + "3e80e48b 3f5b98e4 bf2c6d87 42906c73 3e80e48b 3f5b98e4 bf2c6d87 42906c73 00000000 3f800000 bb8b29ca bbe93688 3bf8a155 3f968339 00000002 -> bb8b29ca bbe93688 3bf8a155 3f968339 3e80e48b 3f5b98e4 bf2c6d87 42906c73 40000000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 42ebc780 408ac2a0 42b663cb 45a183c9 00000000 -> 42ebc780 408ac2a0 42b663cb 45a183c9 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "c2a96ff9 c20e1852 c284bb8d 453b9f03 4319c860 42b4f772 42be17b2 461f9a92 00000000 3f800000 413c31f0 c192d298 42bacd42 44f5e48d 00000002 -> 413c31f0 c192d298 42bacd42 44f5e48d c2a96ff9 c20e1852 c284bb8d 453b9f03 40000000 00000000", + "3c8e91cf bc307a92 bc30efb3 3ff957d4 c1b16e68 c31c5368 420b1744 45cba2f0 3f800000 00000000 bc6f6839 3def9155 3c8ededd 40d4ecc4 00000002 -> 3c8e91cf bc307a92 bc30efb3 3ff957d4 bc6f6839 3def9155 3c8ededd 40d4ecc4 3f800000 40000000", + "430061e2 c28d11e3 429fdc0e 45cdaf7a 00000000 00000000 00000000 7149f2ca 00000000 bf800000 433b1fde c2f7629b 42af41e3 4661c9fd 00000001 -> 430061e2 c28d11e3 429fdc0e 45cdaf7a 433b1fde c2f7629b 42af41e3 4661c9fd 00000000 3f800000", + "c2334098 41219ed0 c2b90faa 452060de 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c2b2f3fa 400f5e60 c3009ce6 45bfa03e 00000001 -> c2334098 41219ed0 c2b90faa 452060de c2b2f3fa 400f5e60 c3009ce6 45bfa03e 00000000 3f800000", + "3d9773db 3c321e36 bd2412fa 40c0491c bf1df1fc bea6eba0 be9521cb 41e09802 00000000 40000000 3df066e2 3f1371dc 3da83f65 41434a99 00000003 -> 3d9773db 3c321e36 bd2412fa 40c0491c 3df066e2 3f1371dc 3da83f65 41434a99 00000000 40400000", + "3dc2c1a9 bdf601a1 bd31f11b 412c842a 3dc2c1a9 bdf601a1 bd31f11b 412c842a 00000000 3f800000 c28c83bc 40e887b0 c29f91c4 452ec7aa 00000002 -> 3dc2c1a9 bdf601a1 bd31f11b 412c842a 3dc2c1a9 bdf601a1 bd31f11b 412c842a 00000000 3f800000", + "be02de43 3f5fef29 3ee2c192 42ccf3c7 00000000 00000000 00000000 7149f2ca 00000000 bf800000 42198261 42a1e01d c1c8d228 45042c45 00000001 -> be02de43 3f5fef29 3ee2c192 42ccf3c7 42198261 42a1e01d c1c8d228 45042c45 00000000 3f800000", + "40740bbe c0164e08 bf7a071b 43f4777f c0d57746 3f6c5699 3fe65268 44191499 00000000 3f800000 424f35b4 41d80e68 c2ee21bc 4581a572 00000003 -> 40740bbe c0164e08 bf7a071b 43f4777f c0d57746 3f6c5699 3fe65268 44191499 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bffa88ea 3fbf6541 3fa47def 43649586 00000000 -> bffa88ea 3fbf6541 3fa47def 43649586 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3e3a809b be6395f9 3ec2fd8c 420d19e1 3e3a809b be6395f9 3ec2fd8c 420d19e1 3f800000 40000000 c0a55540 c328d9c6 c187e198 45e0d9ca 00000003 -> 3e3a809b be6395f9 3ec2fd8c 420d19e1 3e3a809b be6395f9 3ec2fd8c 420d19e1 3f800000 40000000", + "bfaacc60 3e9b7ede 3ffbfb40 43336d6f c26bc864 41f20600 c2b04465 453c294f 40000000 00000000 c227fd08 41a8994c 420f1648 43ec8b44 00000003 -> bfaacc60 3e9b7ede 3ffbfb40 43336d6f c227fd08 41a8994c 420f1648 43ec8b44 40000000 40400000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 beb0d395 bcfb97cc 3df2a041 4157b33c 00000000 -> beb0d395 bcfb97cc 3df2a041 4157b33c 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "42ac3149 410e5658 426055dc 4523dcf4 42ac3149 410e5658 426055dc 4523dcf4 00000000 3f800000 42ac3149 410e5658 426055dc 4523dcf4 00000002 -> 42ac3149 410e5658 426055dc 4523dcf4 42ac3149 410e5658 426055dc 4523dcf4 00000000 3f800000", + "403b6cf3 4099aa25 404e2d90 43f659c2 42d751ee c18830e8 c01f7e00 452f4875 00000000 3f800000 42d751ee c18830e8 c01f7e00 452f4875 00000002 -> 403b6cf3 4099aa25 404e2d90 43f659c2 42d751ee c18830e8 c01f7e00 452f4875 00000000 3f800000", + "bec445d7 3e28d4f1 be32d824 41efb594 416737f0 c24b929f c20c0936 447b5d5a 3f800000 00000000 409ec940 4236eaca c209abcc 44406e99 00000002 -> bec445d7 3e28d4f1 be32d824 41efb594 409ec940 4236eaca c209abcc 44406e99 3f800000 40000000", + "3c06b36a bc19252a 3ce8d940 3fbedce0 bf056358 bd5eef12 3dc018c9 41ac8360 3f800000 00000000 42d7ff34 4309cc42 428b89fe 4608cac5 00000002 -> 3c06b36a bc19252a 3ce8d940 3fbedce0 bf056358 bd5eef12 3dc018c9 41ac8360 3f800000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 c3182116 42b7c43e c29d4067 4612e435 00000000 -> c3182116 42b7c43e c29d4067 4612e435 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3d93bf4c 3d9beb4a bd6c2cbf 40f4d006 3e24799c 3d8ec0e0 bebfa454 41b4e49a 40000000 00000000 be9cd6e1 408f9b66 40ad8cbe 43af3f71 00000003 -> 3d93bf4c 3d9beb4a bd6c2cbf 40f4d006 3e24799c 3d8ec0e0 bebfa454 41b4e49a 40000000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3d2ef9fe bd2b44d4 3c353a84 3f52bfef 00000000 -> 3d2ef9fe bd2b44d4 3c353a84 3f52bfef 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "bd08f4a1 3db64ba5 3dabac3a 411ac555 c2139a06 c2f7d87a c2a447f7 45b26718 3f800000 00000000 bc46d9ef 3bacb9c0 3c9015e3 3fe60c16 00000002 -> bc46d9ef 3bacb9c0 3c9015e3 3fe60c16 bd08f4a1 3db64ba5 3dabac3a 411ac555 40000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bf71ee1d bffc7ac2 3f785f37 430bca00 00000000 -> bf71ee1d bffc7ac2 3f785f37 430bca00 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3bca1b7f bbf671a0 bbbfcbbf 3f900240 3abc9b96 bcebd341 3bc6022c 40192411 3f800000 40000000 3cacef41 3f18aa2c 3eb576dc 421e21a6 00000003 -> 3bca1b7f bbf671a0 bbbfcbbf 3f900240 3abc9b96 bcebd341 3bc6022c 40192411 3f800000 40000000", + "c08dcc30 3ffd0106 bfc3d8d9 43c4b803 c3087a10 c1dfb850 c1ba2886 459a875f 00000000 3f800000 c1a73a58 c2daec0c c2a5344e 4592a474 00000002 -> c08dcc30 3ffd0106 bfc3d8d9 43c4b803 c1a73a58 c2daec0c c2a5344e 4592a474 00000000 40000000", + "3f546192 bea717ae 3f77767d 42e64bf5 c2cd0231 c214f244 42e64112 45c43209 00000000 3f800000 bd101274 3cf09d2a bd4cf967 40e1ebe6 00000003 -> bd101274 3cf09d2a bd4cf967 40e1ebe6 3f546192 bea717ae 3f77767d 42e64bf5 40400000 00000000", + "40896f82 3eccb914 3fb71ed4 43b5c2a8 c233e24e 430d4366 c18671b0 45a9595c 00000000 3f800000 c2407b76 c29bf0ad c26f2278 4539863b 00000002 -> 40896f82 3eccb914 3fb71ed4 43b5c2a8 c2407b76 c29bf0ad c26f2278 4539863b 00000000 40000000", + "421a2528 428f89c6 40dec4e0 44c5ffce 00000000 00000000 00000000 7149f2ca 00000000 bf800000 421a2528 428f89c6 40dec4e0 44c5ffce 00000001 -> 421a2528 428f89c6 40dec4e0 44c5ffce 421a2528 428f89c6 40dec4e0 44c5ffce 00000000 3f800000", + "3ca8215c 3d512cbd 3d91552c 410a7890 3edfa916 c0058f21 3f8219df 434ad088 00000000 3f800000 c1d8154c c2383afc c29920f6 4503683c 00000003 -> 3ca8215c 3d512cbd 3d91552c 410a7890 3edfa916 c0058f21 3f8219df 434ad088 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3eb55705 3e68efa2 bfdab418 4308223a 00000000 -> 3eb55705 3e68efa2 bfdab418 4308223a 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "c2bd0184 430ba5fa 416071d8 45d69ad7 00000000 00000000 00000000 7149f2ca 00000000 bf800000 3e2014aa 3ed7fffc bf64d108 422b17b1 00000001 -> 3e2014aa 3ed7fffc bf64d108 422b17b1 c2bd0184 430ba5fa 416071d8 45d69ad7 3f800000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 4309a0f8 429d5fd5 bea37f00 45c13f2a 00000000 -> 4309a0f8 429d5fd5 bea37f00 45c13f2a 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "bd2412df 3b05b035 3d126060 40bebc28 3fa588fd 3fa3f8f4 3fa9ff5d 43314f22 3f800000 00000000 bc73b8b2 bd3bab2b 3c21c834 4099c97d 00000002 -> bc73b8b2 bd3bab2b 3c21c834 4099c97d bd2412df 3b05b035 3d126060 40bebc28 40000000 3f800000", + "3bed4fcb bcb9c52e bc6ee106 3fed4c30 00000000 00000000 00000000 7149f2ca 00000000 bf800000 42d9434f c207f668 4165ca70 454bed00 00000001 -> 3bed4fcb bcb9c52e bc6ee106 3fed4c30 42d9434f c207f668 4165ca70 454bed00 00000000 3f800000", + "c1625990 42aeccbf 42d3e5f6 4594c0b8 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c1625990 42aeccbf 42d3e5f6 4594c0b8 00000001 -> c1625990 42aeccbf 42d3e5f6 4594c0b8 c1625990 42aeccbf 42d3e5f6 4594c0b8 00000000 3f800000", + "409d6f11 c02432e9 bebfee28 4287f66b 409d6f11 c02432e9 bebfee28 4287f66b 00000000 3f800000 3ebf8acc be8ee732 bb942875 41d985b1 00000002 -> 3ebf8acc be8ee732 bb942875 41d985b1 409d6f11 c02432e9 bebfee28 4287f66b 40000000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3e41ba4f 4003e7d6 4085dd6d 439c2b8c 00000000 -> 3e41ba4f 4003e7d6 4085dd6d 439c2b8c 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "4059649f 40fe490c c01bb2b3 44451f2d 00000000 00000000 00000000 7149f2ca 00000000 bf800000 43134960 4256a044 42cc567d 4607933b 00000001 -> 4059649f 40fe490c c01bb2b3 44451f2d 43134960 4256a044 42cc567d 4607933b 00000000 3f800000", + "beaeb2a4 3e27801f bf13c68b 42466695 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bb554583 bc0ba479 3ba4d7bf 3ec4d572 00000001 -> bb554583 bc0ba479 3ba4d7bf 3ec4d572 beaeb2a4 3e27801f bf13c68b 42466695 3f800000 00000000", + "41021c68 c2c64430 c25dc594 4547c4fc 41021c68 c2c64430 c25dc594 4547c4fc 00000000 3f800000 bc475502 3d1a4115 3d27985b 40c8bc00 00000003 -> bc475502 3d1a4115 3d27985b 40c8bc00 41021c68 c2c64430 c25dc594 4547c4fc 40400000 00000000", + "bbd0a278 3c537e69 ba0bf6e9 3ee6e657 bc13fffa 3d9ff69c bbd8a594 40c815f9 3f800000 00000000 3f52c09a bf0d25fc bf1c0940 42c651b2 00000003 -> bbd0a278 3c537e69 ba0bf6e9 3ee6e657 bc13fffa 3d9ff69c bbd8a594 40c815f9 3f800000 00000000", + "c26d308a c1ca2188 412ee8e8 446eb671 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c26d308a c1ca2188 412ee8e8 446eb671 00000001 -> c26d308a c1ca2188 412ee8e8 446eb671 c26d308a c1ca2188 412ee8e8 446eb671 00000000 3f800000", + "be7fbdf5 3c5b13bd 3d6d8011 41adb6cd c12fc300 c214d6e6 4209b85c 43b4646f 00000000 3f800000 3cdeaa28 3d90de32 3d5b4fd3 4092e9b0 00000002 -> 3cdeaa28 3d90de32 3d5b4fd3 4092e9b0 be7fbdf5 3c5b13bd 3d6d8011 41adb6cd 40000000 00000000", + "37a17647 bdc1d51b be6245e2 41870bf5 bf375391 bad438bd 3eeb90d2 4258c8ef 3f800000 00000000 bf375391 bad438bd 3eeb90d2 4258c8ef 00000002 -> 37a17647 bdc1d51b be6245e2 41870bf5 bf375391 bad438bd 3eeb90d2 4258c8ef 3f800000 00000000", + "4182ccf0 c29b690f c16badc0 44c728da 4182ccf0 c29b690f c16badc0 44c728da 00000000 3f800000 4182ccf0 c29b690f c16badc0 44c728da 00000003 -> 4182ccf0 c29b690f c16badc0 44c728da 4182ccf0 c29b690f c16badc0 44c728da 00000000 3f800000", + "c1c6eb48 41c9f5e0 431e17da 45c59813 00000000 00000000 00000000 7149f2ca 00000000 bf800000 41a0ce30 42951f4a 4283f0cd 451e10d1 00000001 -> 41a0ce30 42951f4a 4283f0cd 451e10d1 c1c6eb48 41c9f5e0 431e17da 45c59813 3f800000 00000000", + "c2159e56 c280119a c27feb48 45156c8b 420295c4 42a864be 42a8271b 45551e1f 40000000 00000000 c17144b8 c315585c c2ed5dfc 460a0941 00000003 -> c2159e56 c280119a c27feb48 45156c8b 420295c4 42a864be 42a8271b 45551e1f 40000000 00000000", + "c3236180 c101d698 c1cae694 45d5b2f1 00000000 00000000 00000000 7149f2ca 00000000 bf800000 406a6bc1 3f85682c 40377d8e 437986fd 00000001 -> 406a6bc1 3f85682c 40377d8e 437986fd c3236180 c101d698 c1cae694 45d5b2f1 3f800000 00000000", + "bc6ea768 bc215ee2 3c8f03e1 400b06fe bef86745 3f840a15 beeb492a 4286eb60 00000000 3f800000 bef86745 3f840a15 beeb492a 4286eb60 00000002 -> bc6ea768 bc215ee2 3c8f03e1 400b06fe bef86745 3f840a15 beeb492a 4286eb60 00000000 3f800000", + "41d8319a c30fe628 c31cdab8 4633a21b 00000000 00000000 00000000 7149f2ca 00000000 bf800000 42caf296 c287cc1c c19ed1b0 456e4ed3 00000001 -> 42caf296 c287cc1c c19ed1b0 456e4ed3 41d8319a c30fe628 c31cdab8 4633a21b 3f800000 00000000", + "3dd919a0 3e709621 bd4d7997 419f11b6 3dd919a0 3e709621 bd4d7997 419f11b6 00000000 3f800000 3dd919a0 3e709621 bd4d7997 419f11b6 00000002 -> 3dd919a0 3e709621 bd4d7997 419f11b6 3dd919a0 3e709621 bd4d7997 419f11b6 00000000 3f800000", + "3d166561 be2b8926 3d9d2863 414b1da2 c26a258e 42864904 bf9c0680 44d7bdaa 3f800000 40000000 c3002a6d 429d05ea 42661c84 45ca5653 00000003 -> 3d166561 be2b8926 3d9d2863 414b1da2 c26a258e 42864904 bf9c0680 44d7bdaa 3f800000 40000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 3cece539 3df85c32 bee7de6b 41ede48e 00000000 -> 3cece539 3df85c32 bee7de6b 41ede48e 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "bd920fce bc788af7 3cca3f70 40186a2e 413b2520 c33a0e25 c23e09d8 460f1af2 00000000 3f800000 3e86fab7 be7781cb c00e1b40 42adc15a 00000002 -> bd920fce bc788af7 3cca3f70 40186a2e 3e86fab7 be7781cb c00e1b40 42adc15a 00000000 40000000", + "3e525022 3ebd53be 3f0eadca 42582ee9 c28f500d 42a76822 433461a3 462cc2b6 00000000 3f800000 c1ea75f8 41a831be 4121e2c0 42985260 00000002 -> 3e525022 3ebd53be 3f0eadca 42582ee9 c1ea75f8 41a831be 4121e2c0 42985260 00000000 40000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 428c9acc 42f48d92 c3134647 46225b00 00000000 -> 428c9acc 42f48d92 c3134647 46225b00 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bcbe9ff9 3ce55cdd 3ce1e7e7 40811e9b 00000000 -> bcbe9ff9 3ce55cdd 3ce1e7e7 40811e9b 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3e8ab6d6 bed4d850 be221b65 421a25ce 4055fb98 40a64980 40d67ef8 448fbd1a 3f800000 00000000 bff7f498 bfd9fa74 c096f2d1 43ac2876 00000002 -> 3e8ab6d6 bed4d850 be221b65 421a25ce bff7f498 bfd9fa74 c096f2d1 43ac2876 3f800000 40000000", + "bbf54f32 3a6dcb50 3c0f0586 3f6d6c65 bf7d5a66 be8fe834 bdc04b66 42b5a1e0 40000000 3f800000 bf7d5a66 be8fe834 bdc04b66 42b5a1e0 00000003 -> bbf54f32 3a6dcb50 3c0f0586 3f6d6c65 bf7d5a66 be8fe834 bdc04b66 42b5a1e0 40000000 3f800000", + "3dc46d6c bdf39ab7 3e18a146 4155496d c2f85bae 418070ac c28fa3db 4598f325 3f800000 00000000 3d0f554e 3dae95b4 bdf9fde4 4121284b 00000002 -> 3d0f554e 3dae95b4 bdf9fde4 4121284b 3dc46d6c bdf39ab7 3e18a146 4155496d 40000000 3f800000", + "baca1e7f 3b6b2c00 bc28c6f1 3f538b53 baca1e7f 3b6b2c00 bc28c6f1 3f538b53 00000000 3f800000 c3184e7e 41c9e270 c2be0038 45fe7f9d 00000003 -> baca1e7f 3b6b2c00 bc28c6f1 3f538b53 baca1e7f 3b6b2c00 bc28c6f1 3f538b53 00000000 3f800000", + "41d3ede6 be8a5a00 41928e46 c2caa304 3dd0a383 bd992a2f 3eed233c 41afc2a0 00000000 3f800000 3dd0a383 bd992a2f 3eed233c 41afc2a0 00000002 -> 41d3ede6 be8a5a00 41928e46 c2caa304 3dd0a383 bd992a2f 3eed233c 41afc2a0 00000000 3f800000", + "419b8f80 42ed2224 c1e50120 455be475 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c2eb04e2 c1636648 428ca0cc 4593927d 00000001 -> 419b8f80 42ed2224 c1e50120 455be475 c2eb04e2 c1636648 428ca0cc 4593927d 00000000 3f800000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 428d64c2 422c8b82 3ea18000 44c9c6ae 00000000 -> 428d64c2 422c8b82 3ea18000 44c9c6ae 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3ecd7cc2 bd84f333 bdf11131 4209aba2 c1b3e650 42e2bc08 c2fe6df4 45e501e7 3f800000 00000000 3ce0e8b9 3d43d4c1 3acc4e8f 40960c29 00000002 -> 3ce0e8b9 3d43d4c1 3acc4e8f 40960c29 3ecd7cc2 bd84f333 bdf11131 4209aba2 40000000 3f800000", + "c0bacbb0 431203d6 425be26e 45b91b7b 00000000 00000000 00000000 7149f2ca 00000000 bf800000 c0bacbb0 431203d6 425be26e 45b91b7b 00000001 -> c0bacbb0 431203d6 425be26e 45b91b7b c0bacbb0 431203d6 425be26e 45b91b7b 00000000 3f800000", + "429037a8 c17c5538 c2e5ebf8 458e28fe 429037a8 c17c5538 c2e5ebf8 458e28fe 00000000 3f800000 c26a572a c18d5038 c2bb4011 4536ec86 00000002 -> c26a572a c18d5038 c2bb4011 4536ec86 429037a8 c17c5538 c2e5ebf8 458e28fe 40000000 00000000", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 bfe25cb1 c0516d30 40f731bb 437b2264 00000000 -> bfe25cb1 c0516d30 40f731bb 437b2264 00000000 00000000 00000000 7149f2ca 00000000 bf800000", + "3c05077b bbbf850c 3d948b13 40a26047 42ade7d4 41f8e46e c2ad270a 456b69ec 3f800000 00000000 c04cbbfb c038503e 3f0e0579 43c6c09a 00000003 -> 3c05077b bbbf850c 3d948b13 40a26047 c04cbbfb c038503e 3f0e0579 43c6c09a 3f800000 40400000", + "c07d384b bf72db72 bfa26397 43b2fede c23f11ae 420f8180 41777050 445001a5 00000000 3f800000 bdce5cbd bca59602 bd9683a2 3fb6907f 00000002 -> bdce5cbd bca59602 bd9683a2 3fb6907f c07d384b bf72db72 bfa26397 43b2fede 40000000 00000000", + "c2a9d951 c172d680 4238b3a8 451577a1 c1f96cb0 c13f1a50 42e63435 45507ce8 3f800000 00000000 c1f96cb0 c13f1a50 42e63435 45507ce8 00000002 -> c2a9d951 c172d680 4238b3a8 451577a1 c1f96cb0 c13f1a50 42e63435 45507ce8 3f800000 00000000", + "bf5360d7 bf244cbb beab1aeb 42de8fe3 00000000 00000000 00000000 7149f2ca 00000000 bf800000 bf5360d7 bf244cbb beab1aeb 42de8fe3 00000001 -> bf5360d7 bf244cbb beab1aeb 42de8fe3 bf5360d7 bf244cbb beab1aeb 42de8fe3 00000000 3f800000" + ] + }, + { + "glsl": "vec4 cultmath_site_cells_border(CultSiteCells)", + "tolerance": "ulp-bounded", + "cases": [ + "42a0a598 427a3628 421485ec 452b3b99 4318adf2 c14cf6e4 c2805d04 45d40e33 00000000 3f800000 -> 3efe8f4f bf0491d4 bf32376a 41de6a87", + "be0be5c7 bedd78c3 3f15e6bc 4247afd5 42b729e3 428f74ac c30e3c88 460069e1 00000000 3f800000 -> 3efe9c20 3ec85126 bf463c8f 423127b0", + "bd4e7cbb 3ce33dbf 3c971e62 402d9cb4 be7bbd68 3e952e2f bd700435 4189747c 00000000 3f800000 -> bf146ac1 3f48363d be6a0bc0 422bb250", + "42f5e3fd c2850cfe 40e86b60 4593ed9a 41cda168 c31a3338 c20c5fce 45c86b2b 00000000 3f800000 -> bf34e64f bf231a39 be9d97e7 41434c2d", + "3c19baef 3d26e8aa 3c34f1ad 4072b52b 00000000 00000000 00000000 7149f2ca 00000000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "bf25ce03 3f5d324e be93a3b9 423c7216 c2485d78 c234e4dc c30bc6ee 45b899a5 3f800000 00000000 -> bea35210 be983c24 bf66609b 421739c2", + "bd39b422 bbaec90d 3e0e0ca8 411fbdf6 bd7035bd be9e0f70 3e427abf 42195b6c 40000000 00000000 -> bd30fe78 bf7c31c5 3e2a4085 42b82713", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "3fc35780 c1d90040 c1504c70 43321e6e c0acf250 4250b56c 425c2308 448ef801 00000000 3f800000 -> bd87881e 3f41d8fb 3f26596f 4113866e", + "bbbbe7af 3d80aec6 3d316e31 40514ec9 be6fbdb5 bdfd1547 3ebf53ed 41d6e14a 00000000 3f800000 -> bf040bd2 bed78d12 3f3f022c 42551ad2", + "3dbd9080 bbbe98cc 39ccef4d 40908e10 3dbd9080 bbbe98cc 39ccef4d 40908e10 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bea8537d c0e6a83c c0b83df6 4456eaed c144ab38 40fdbfe0 42cd6b34 45282c26 3f800000 00000000 -> bdde631d 3e0cb38d 3f7c0b26 4184f70f", + "bc48778e bb9ad4e6 3c2573c7 3f90d0cb 41af6da6 4243b91e 42f7c490 45854833 3f800000 00000000 -> 3e2671ab 3eb99d23 3f6aedb2 41fcb44c", + "3d6f0a30 3e87488b 3e7e9e03 41ab4cf2 4327ef9c 42c3ef7f c29c1e88 4625f777 00000000 3f800000 -> 3f4d351d 3eeedbc6 bebf7140 424a766f", + "be306147 bd571676 3e551623 4185d0b6 bfe68c19 3f79aa10 3f80bef1 4364d52c 3f800000 00000000 -> bf48071d 3efc6a9d 3ec3ec0a 42cb7cbf", + "be229705 3c891306 bd10b473 4141e1bc be229705 3c891306 bd10b473 4141e1bc 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "ba41b1c6 3a65e8e3 3c2d4cb2 3f155f77 c2e3809a 4280c709 42bc2761 45c51d57 00000000 40000000 -> bf34d3b0 3eccb65a 3f158914 421ca901", + "bcae176b 3c328aaf bdd2e382 3fa9da31 c02d0f91 3fd25490 beffe230 42d93b83 3f800000 00000000 -> bf58f9bc 3f0403a6 be005dae 4207946c", + "c06c2599 c03e5839 40bc389a 4308c4eb c06c2599 c03e5839 40bc389a 4308c4eb 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "40c2fc32 c096a954 c0a1a357 43dbeb10 430394a2 c21352ce c186f10c 4593748c 00000000 3f800000 -> 3f76fa55 be7ce39f bdba0da6 420394bf", + "c0447c72 c08a72fa 40c4ec2c 4438cf96 4175ad08 c30f911c 42b57cc2 45dfaeee 3f800000 00000000 -> 3de62474 bf596777 3f04133d 421c971c", + "bf86cbdc 3d8742ca bedcc4f1 423479c7 42c30b3a 4298572e 413b7004 45671224 00000000 3f800000 -> 3f49add4 3f1bb47c 3dc6cd0b 41e97e8e", + "3c3f1285 bb90b62a 3a28d941 3f9fb416 c0b80f7f bebb7716 408a70f4 435a82bb 40000000 3f800000 -> bf4c7de2 bd4d5889 3f197978 41f0e42e", + "bfebeb88 bfa6f606 c0409ab8 435b58d6 00000000 00000000 00000000 7149f2ca 00000000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "3b4120e6 3d25f484 3d908d2c 40ee8779 3b4120e6 3d25f484 3d908d2c 40ee8779 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "42fac1be 41755f78 418e1c20 457c8860 c138f4b0 42cca0e5 c2c0c176 459184a3 3f800000 00000000 -> bf30bb81 3ee08244 bf134faa 4046c546", + "c04f8260 41631e30 4275c764 446cd2ee c04f8260 41631e30 4275c764 446cd2ee 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bf183f66 bd8f968b beba12d0 425bf7cc bc8a413f bee179d4 bf8b0636 42d8c4a8 3f800000 40000000 -> 3f146ce1 bebe379e bf39a282 425649a0", + "3dbe2b87 bfb6446e 40250870 43610a46 42bf02b6 c2136e94 427122a9 454f5f2d 3f800000 00000000 -> 3f50c406 be9b0fcf 3efc85a1 41d37b20", + "42b06bb3 4283a251 40b84b70 453610f9 4313e472 432de7c7 421edc4d 464d96c7 00000000 3f800000 -> 3eeea036 3f58158a 3e87c3fb 42a000fc", + "bc249c92 bb6a4838 bc06fa21 3f6c0f21 bda0d106 be087a6a bd806738 4106292c 3f800000 00000000 -> bee0172e bf543ae4 beb2375d 423ecd2e", + "bdfde9ef be0eafb7 bc8ea3c7 418c7201 42d3d161 c2745c5e 3f1d8c40 45695211 00000000 3f800000 -> 3f5df0ff beff282e 3ba98cb6 41f3099f", + "3e74aed6 be6e5696 bd4a72ab 420b1f94 bf876326 411874f1 3fa57ca1 442a01e4 3f800000 40000000 -> be059ae0 3f7b7209 3e0a4e7d 4281da76", + "3c9833bd bd07a0bb bd886d64 40519050 40872370 c19f6578 422d46b8 43fe355b 3f800000 40000000 -> 3db3b79e bed48f67 3f67cf5c 4128afad", + "be0f9bee bc82e2ea bca6c8c8 409da9d2 bd662bf5 bf73de17 3ea10636 4263564d 40000000 3f800000 -> 3dac6fd4 bf703394 3eabc065 424fff18", + "3dc3e6f5 bfd9456e 401e21e9 438a0aef 3dc3e6f5 bfd9456e 401e21e9 438a0aef 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3dc169ba 3d24ebd2 beb404b5 4201513b 3dc169ba 3d24ebd2 beb404b5 4201513b 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "3f60b64e 3dcbbb96 3ec4d467 4294e6c7 be925189 c02e232d 3bae8bec 43321f73 40000000 3f800000 -> bec1c601 bf6ad87b bdfc89af 4206e211", + "bd9957ff bea17096 3de0e48f 41b121de bd9957ff bea17096 3de0e48f 41b121de 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3cb5e81c 3e3d9218 bf2a41bb 41e24a95 42bb898f 431ad09b 426c7754 460ccdc8 40000000 00000000 -> 3efc0533 3f4fd8d2 3ea0b643 423cab2e", + "c2111349 c00dbac0 c2bcb216 451d770a 4248f0bc c33a6e21 429f24ad 46297a1a 00000000 3f800000 -> 3ea57162 bf302921 3f26508e 41f8d7cf", + "bb2a3817 3c9553a2 bb266631 3f821dcd bf8d1b5a bfc1ef22 bfd8a7b8 435c804d 3f800000 00000000 -> bede49b1 bf1af4e6 bf2acbed 42ad497f", + "bc947f8b bbfa824f 3c8b765a 40318088 bc947f8b bbfa824f 3c8b765a 40318088 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "3d02ef9d bd3a5f76 3ba40a95 4070e5aa 41af2b0c c2625692 c2857c51 44e927a1 40000000 00000000 -> 3e784e2e bf208685 bf3d829b 41a528bd", + "4228ac98 42fbd9c4 c2b2e78b 45c80753 43208d1d 41ab8f34 42d2f3cc 460df4ad 00000000 3f800000 -> 3ef19f56 bed53f5a 3f46ed5e 412b351a", + "bf257e8c 3f27ed02 3fa50894 4306d50b c1c663c0 428729ae 42868890 45177ef6 00000000 3f800000 -> be7ee1c2 3f30917b 3f2e112c 41bcba6a", + "417e8268 42f20726 c32ccdc2 462ebda9 c2d50b29 42e3f9ca 4314d77e 46350540 3f800000 00000000 -> beb6190e bca7351d 3f6f345a 3f95718b", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "425f3a8c c1f5c9b0 c2bb91ae 45384090 c277a728 42f0b81c c2d60f75 45ddd82f 3f800000 00000000 -> bf1cf848 3f4974be bd8d4b9f 41acf7d3", + "4187e6c0 c1067b18 4180dc4c 4300aeeb 40cf4f40 428bf864 4258bfda 44f0761a 3f800000 00000000 -> bdf53041 3f649cd5 3ede1b7f 41a396da", + "42bd43a8 c239dca0 c1a1aa7c 45338f41 c1b46ffe c2c42b0a c2ed0035 45b54cce 00000000 3f800000 -> bf39d77f bea3b83c bf1be0a4 4191235f", + "bd8e4071 bd8c012b be80dae5 41563c93 3f633d82 3f956b2a bea0337f 42587339 40000000 00000000 -> 3f1ca469 3f4a3c0b bd2050fb 41d045aa", + "bc978af2 bc0927cd bcecb72c 3fa2a313 c289ed1d 433b48d4 43107531 466d08de 3f800000 00000000 -> be8f4456 3f4298eb 3f161f27 42764228", + "3a9a2467 3b927443 3c1bf400 3f6c51a1 c1b0bbf0 429a6223 428c3d0e 45257f20 00000000 3f800000 -> be543ee4 3f39621f 3f286293 41c6ab96", + "c1c6eb0a 411c6e68 c28640c1 448e6b53 42a8b2c8 43018770 c1403954 45b20672 00000000 3f800000 -> 3f235238 3f331487 3ea4d543 41d4fa96", + "be48a2a3 bec819b1 3e02d58e 42183ad4 4240ea46 41ed4ea8 c28c37ac 44cccf74 3f800000 00000000 -> 3f090e00 3eaa1f6c bf46c9ac 418d8d00", + "3d1786e3 3c4d4281 3ce18cc8 401b713d 421a4eb0 42c603e4 c2a7ee5a 458e0ce1 3f800000 00000000 -> 3e91b4cd 3f3b2233 bf1ec65a 4206307d", + "bb8f2ba5 3e03cfca 3db89067 4138ee2a bf0e1ca6 3ce43113 beee45b3 421e123b 3f800000 00000000 -> bf32c31e be02f4bf bf344ce8 420dcc2c", + "c1c45450 c24f9c4a c20ff110 448f5d40 4284c9ee c2493de2 c012ab00 44c59754 00000000 3f800000 -> 3f7004f8 3c867af1 3eb1dd8f 408f20fb", + "3d4c4ce4 3d54ae2e bd0cf5de 4101da7e 41e06088 41ce9164 41281728 43a0bc60 00000000 3f800000 -> 3f358634 3f2713d3 3e88ad13 40fdf5ff", + "bc9715a0 3c80c9df bba24cde 4014820f 42f8a393 42c3cdcc c252ca08 45d8084b 00000000 3f800000 -> 3f3ed834 3f163e84 bea1c0e5 4225bca6", + "412a0a20 c1e1e746 c0d71b00 c2a81dd6 3e9480de 3fbe8887 4050a45e 42267218 00000000 3f800000 -> bea04d05 3f667b5b 3e9aca61 407397b2", + "425bb24e c1ff4640 c18599e0 44856ac7 425bb24e c1ff4640 c18599e0 44856ac7 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "3c143fbb bac78563 3bcbd87c 3f5c4dcc 3e8e2d38 bd125f87 be230fb1 418075e6 40000000 00000000 -> 3f58b3c4 bddcca1e bf057886 423f8b72", + "bd697f7e bd2a922f bda40702 408a2d25 bd697f7e bd2a922f bda40702 408a2d25 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "3e6bb389 be3d183d 3da45f7e 418c7a80 3e6bb389 be3d183d 3da45f7e 418c7a80 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3f0a185f 3ea95352 bf2bc721 429e917a 3f0a185f 3ea95352 bf2bc721 429e917a 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "c3019691 c2d44f67 c17446d8 45db15d6 c3154b80 41965950 c30f6204 46278f49 40000000 00000000 -> bde02b9e 3f31aa83 bf362b49 41a4fd85", + "3be7e085 3bf08121 bbc37de7 3f9ad4ba bc546143 3cf44a98 3cac3c3b 406d663d 40000000 00000000 -> befdb3e7 3f0e4f8c 3f2adb98 42773ff9", + "be94a596 4079e2ba 40a3dabc 4319cb85 bf138dd5 3f35e4b3 c02ed05c 435eace7 40000000 00000000 -> bd0a258d bec0ced1 bf6cff52 4101f0ae", + "3d803b97 3d1f6e63 bd696fcf 40f53751 c30698f0 4331573e c2004884 46459b13 00000000 3f800000 -> bf194287 3f49caa6 be11be2d 4260c380", + "c2dbd915 41d53860 42c50cc3 45aad087 c2dbd915 41d53860 42c50cc3 45aad087 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "4005d134 3e06ffe7 bf966352 42926898 4005d134 3e06ffe7 bf966352 42926898 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "41173f48 42a7b6ff c1ee9d04 44fa3213 429495d5 41246060 c266cdf9 450a045f 3f800000 40000000 -> 3f22cca5 bf38c11a be8bf971 4001c032", + "c21f19dc 4218e6c8 c239974e 4485ff67 c1894688 c2f387b0 c284aaea 458dc65a 40000000 00000000 -> 3e0e3f16 bf7b928b bdfac87f 41aa412f", + "3f2d0f67 3d9633d3 3dd4bc1b 418fdbee 42625e50 40be8160 4293e711 45025d2b 00000000 3f800000 -> 3f1a39f1 3d81be55 3f4baf22 41b23bba", + "baeb8603 3e58485e bc4c1ad9 41616f6d 4284c75a 41b1a438 4215eb39 44b815e7 3f800000 00000000 -> 3f562dd8 3e8de7e8 3ef1e69c 41930b9f", + "bd63dc7a bc9fb44f 3d3ee52a 408e4ae4 42ae4f55 424b54b8 c209a89c 452df88a 00000000 3f800000 -> 3f514acd 3ef41348 bea56754 41d06b1c", + "427d5476 c0547740 c0c84210 447dd201 c21b31dc c336f00e 420ce008 460ca4b4 3f800000 00000000 -> bef81fe3 bf5a302a 3e498890 421792f9", + "418fbd18 41aaa8fe 428d9632 44b4ec53 418fbd18 41aaa8fe 428d9632 44b4ec53 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "be271648 3e1c3924 3d7480a0 41abea45 be036df0 3dfd4cbd bea07eb8 41b123b1 00000000 40000000 -> 3dbdb8f7 bd9d59a0 bf7e23a2 3fde5fea", + "bde1fca9 3dd66f3d bcd0e285 413c1686 432303bb 4049a2e0 c31f388d 464565e2 3f800000 00000000 -> 3f37323c 3c5aeba4 bf32c881 425d7ae4", + "bf8160b2 3f651ffe beb8d12c 4208d8de 40691926 c052bfd6 bfc3c07d 439339c1 3f800000 00000000 -> 3f3b0bea bf285b18 be3bde45 42237647", + "be23c9ad bc2fb2b3 3e94d322 4187c734 42dee9cf 43019999 428bd5e9 4602dd90 3f800000 00000000 -> 3f1ab974 3f33ab09 3ec1093d 42350a33", + "3ba0b5fe 3bb5d1f4 bcc66333 3fe58caf 41997a7c 41abe6d0 c3007636 45856ea1 3f800000 40000000 -> 3e153630 3e271f4a bf79cc35 4201b38a", + "41e9648e c27d4562 c1cd9a38 44881a9a 41e9648e c27d4562 c1cd9a38 44881a9a 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bd8a8d85 bde7cc21 be0b2573 412980a6 bef6688c 3ea7cead bd211936 4219757f 00000000 3f800000 -> bf2cf38b 3f385fbf 3e217ee6 4235712c", + "c222bdb2 c317fd42 42b57ea6 46002abf c222bdb2 c317fd42 42b57ea6 46002abf 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3e4bb0e7 3d8c3e3e 3e1c2d72 41b1e562 42a9053e c2d85cd3 429fffec 45c1f3aa 40000000 00000000 -> 3f07f588 bf2e8fd7 3f00c2b3 421bd24f", + "bd5e7069 3bd067ed 3d0efffe 40d8083f bd5e7069 3bd067ed 3d0efffe 40d8083f 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3bb0e12e bd3bfc92 bd1886a9 408ec83c 405032aa bc56bd4d c09d0ce3 43929b1e 3f800000 00000000 -> 3f0e0534 3bb787ad bf54fd1a 42454ba8", + "be705e8b bea3fd02 3e6ef194 423238aa 40a4c63a c0c09cdf 409c9020 44608121 00000000 40000000 -> 3f17213b bf1ff850 3f02c99e 42bb2a44", + "3d83d776 bda2be90 bdd8cef0 41744d7c 3e27cf6c bd3143a9 3f26ddbc 41fab199 40000000 3f800000 -> 3e052e45 3d41beec 3f7d895d 41a804e7", + "3b851385 3d126a15 3bcd5894 3ffe618c 42ac98f9 43146238 c231b11c 45ee35b5 00000000 40000000 -> 3ef93a62 3f5638d9 be8050f2 422bf2e3", + "bd034ca1 bce1d339 bc9a48c8 406fab40 bd034ca1 bce1d339 bc9a48c8 406fab40 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "3e807d3f 3e6b6e78 3ecc4fab 41df58f7 42d3937b 409aae80 c1a7121e 452e2386 3f800000 00000000 -> 3f7ab80d 3d2efed5 be4a3e1c 41ccc607", + "c27aafd0 42153930 3ff5fa00 44880288 c22c1618 c19e10f6 c24c56bc 448b1207 00000000 40000000 -> 3e7a80e9 bf35ddbf bf28ef1a 3e9c10a7", + "41c4ae92 4185d3a8 428143cd 449dee7a 41c4ae92 4185d3a8 428143cd 449dee7a 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "40d8f4a0 c24b9b24 c2b361ca 451fc2b2 c2a8e0af 420e1f93 c28da58e 453c91e1 3f800000 00000000 -> bf37c4e9 3f2e2069 3e180b04 4068282e", + "3f607a65 bf2cc82e 3d069c0d 42bf28d7 3f607a65 bf2cc82e 3d069c0d 42bf28d7 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3fa741f6 3e2cf062 3f2437c1 42e267d6 402aea77 c00f2b81 4099c830 4396c520 00000000 40000000 -> 3e8bb080 bef66b45 3f5540f1 4216b3cd", + "c321d904 c195ba90 c28ea382 45f5c86e c321d904 c195ba90 c28ea382 45f5c86e 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3c719a9f 3cade7bd bb0ad233 40074bec 3f199817 bf997aed 3f257089 42b7f4ec 3f800000 40000000 -> 3ec7aba9 bf502bdc 3edd3622 426f8852", + "c24b51ea c20fbd16 4244cf6c 44c4b2f3 c297c61b 42e09aa7 42b3a9da 45ce31cb 3f800000 00000000 -> be24c22c 3f73ad7a 3e85936b 42010eca", + "40a45742 40787049 c08a8fb9 442e0cf1 c18e9b44 42343cc4 429f9359 45072d96 40000000 00000000 -> be73d4eb 3edaa2a8 3f5f50bf 41735a4c", + "3d4c755f bdebbb73 3c05c4a9 40d2b33e 3d4c755f bdebbb73 3c05c4a9 40d2b33e 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "40872f60 40088b00 c1a7787c 42ca31bf 428d298f c23a30e2 43016535 45b4ac2f 3f800000 00000000 -> 3ec63d12 be916f0b 3f608d53 42049439", + "c2507a32 41c90ab4 c1080050 4412bb3c c2507a32 41c90ab4 c1080050 4412bb3c 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "bfe07d00 42b29cd9 42157106 4509fbaf 42363874 42038fa2 c2c5bb17 4546f7b1 00000000 3f800000 -> 3e9c6c8b beba8940 bf6135fe 40c9a41a", + "3c608008 bab0a65f bc0d8934 3fbe8842 bd269283 bda25f6a 3ca2ca1d 40669356 3f800000 00000000 -> bf0c4ad9 bf491a13 3e932248 41aa7b3d", + "3a10eddc 3b954d93 3cc22a9c 400061cb 3fa21b3f 3f2c3883 bd8f83d1 4294acfa 00000000 3f800000 -> 3f61e9d4 3eee7cc5 bd85e271 4249b171", + "bd196540 be689891 3e0b3e0b 4148bf2e 428d5155 409998a0 428e3b11 4519fb83 3f800000 00000000 -> 3f346e25 3d4d4754 3f35271a 41c37ed5", + "3e2436c4 403e3eeb bdbfc19a 42f83aa3 423fc3fe c2b09ff8 c2373200 453b0ee7 00000000 40000000 -> 3ed90a25 bf4f535e becf9c42 41cb9d08", + "400db8ec 3f04fbb0 bf4129c6 43580004 421e7948 c21387ec c2a9b49f 451057d9 00000000 3f800000 -> 3ec0c2c6 bec0c05e bf58b2fe 41a89307", + "bd17fff2 bc36fc52 bc3e0049 3fedcb22 c20b7144 c2ee4e06 431126cf 460e8179 00000000 3f800000 -> be3ab380 bf1fb08a 3f429160 423ef794", + "bf404700 3faa3b9f 3ed964ff 42b2cc9e 41edf8b8 c2983995 c299a9d0 4534e411 00000000 3f800000 -> 3e89806b bf2e943b bf2e28ce 41c5980b", + "3e09328c beb417df bf9b0834 42d92b64 4258e97c 431c04b1 c2c9c6aa 460f6d9d 3f800000 00000000 -> 3e8f6138 3f4f3c0b bf041998 423bd598", + "3e2fa1e1 bf5abec7 bfaa5666 43110a39 422e03ae 42bebfd5 4257a8bb 4556aeed 40000000 00000000 -> 3eba3f7a 3f4ecdca 3eed742f 41dcf1df", + "becba0cf bfd6f832 3db1af6c 4306710c c23b31d8 41e55820 421baed3 4439905f 00000000 3f800000 -> bf2f7ba2 3ee58a87 3f12dd8e 410faae6", + "3d34f321 3e1d02a0 bd4811db 40bb43dd bd1251d8 be1ff886 be2b4299 41fc1dea 3f800000 00000000 -> be6ffdc4 bf687259 beb1d167 42968cc0", + "43297d3e c2c45949 c2885cf3 4628041b 43297d3e c2c45949 c2885cf3 4628041b 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bced85df bc49c291 bd0bc96b 406e7c79 c29a38fb c1da2fd0 c2c1f970 457959f1 3f800000 00000000 -> bf1b9795 be5c1b92 bf43b39e 41fb6cda", + "bf8281ce 3f688d7b 4005e3fc 436e8126 c2637c50 c2b153bb 42e02b5c 45b7ca8e 00000000 3f800000 -> bebb93cd bf1669b5 3f38b446 42140e98", + "c268d56a 427834b6 428b55d8 453c5703 c268d56a 427834b6 428b55d8 453c5703 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bdc09820 bd8a6651 3ea8c4bb 420b987a c306611f 42991759 4255d920 45c99724 3f800000 00000000 -> bf5248f3 3eeff21e 3ea667f3 421cfca9", + "420269f1 429cdc1e c2c71d14 45786774 420269f1 429cdc1e c2c71d14 45786774 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "3c0ef7da 3ca950b2 bc0519b8 3fd5e73c 3c0ef7da 3ca950b2 bc0519b8 3fd5e73c 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "c2c9ca8c c26bf7a6 428797ce 458b2cb5 c2c9ca8c c26bf7a6 428797ce 458b2cb5 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3cb09f39 bd51ab8a 3b08868e 4080fea0 c29ead3b c194fd04 c22b9ea2 45047b9b 00000000 3f800000 -> bf5c9165 be4e79b0 beee818c 41b7c1d4", + "c229e057 424718b4 41b12fb8 448b4a6c c229e057 424718b4 41b12fb8 448b4a6c 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "bc7481ba 3d40915a bc2e4149 409a9f50 c29c4189 c277f2d0 c2c9a4f6 4599cfe0 00000000 3f800000 -> bf0d00a5 bedff4e3 bf35f9c8 420aaff5", + "3d7a19a1 bcc72a66 bd38bd79 409a29b1 3da39ea9 be0c2d7c 3e264124 4116db8d 00000000 3f800000 -> 3da2e304 bef36d9e 3f604ae0 419bc8f8", + "bc92c717 bc80b263 3b97e023 40190ba6 be508a27 3eb7c548 bfaf5286 42ae73ba 3f800000 40000000 -> be04654d 3e85864d bf74ea30 426c37f7", + "42906a6d 421f88e8 c2706244 45181cd9 42906a6d 421f88e8 c2706244 45181cd9 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3cd2cc7f 3b0548c5 3d956345 40b98c4d 3cd2cc7f 3b0548c5 3d956345 40b98c4d 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3ce1c5e2 bdf9aef4 3d82f0a5 403b659b 3ec00641 3df7c0de 3d49e209 41bc3f3a 3f800000 00000000 -> 3f51b2b8 3f12937d bd0d6e69 424244a2", + "3e7639ab 3ea4aa1e 3dd59334 4209c6d7 c269bf3e 42efc1fa c2ad1f4c 45c1b13e 40000000 00000000 -> bebd1271 3f409efd bf0ba0dc 421b29e7", + "429945fa 41c53630 c245ad4f 44f8f1e3 429945fa 41c53630 c245ad4f 44f8f1e3 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3e532c0c 3e6499be 3d8f31eb 41c31655 3e532c0c 3e6499be 3d8f31eb 41c31655 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "bb91c73f bcf24e52 bd1338ce 40b3259f c239f8be 421f8c66 4296e474 45072f4f 3f800000 40000000 -> bef4d29b 3ed236b2 3f46c195 41b18546", + "bf3352b1 becf8dcd 3e1284ab 42ae194a bf3352b1 becf8dcd 3e1284ab 42ae194a 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bb887e96 3c568c98 bd9bb3ff 40b33e35 be52df07 be26ffbe bea6e8f6 419eb850 3f800000 00000000 -> bf0cfa8f bef6349e bf2ea965 421b7410", + "3d087895 bce220be 3cdc84cf 3f68faca bd13c9f5 3c0c98c8 3d2f773d 40934367 3f800000 40000000 -> bf5e7142 3ee7f686 3e4c1ab1 4238e5de", + "3bafe4c5 bbf172ec 3c0f0909 3f44a12b 3bafe4c5 bbf172ec 3c0f0909 3f44a12b 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "3d4388cb 3dfa6dc3 3ca15d01 4123057b bd78f291 beb4cd89 3f13eb17 424a1709 00000000 3f800000 -> be15ef00 bf243719 3f40c7d5 4259afde", + "c0ceabc0 bf9e4beb 4049eaac 4373ac68 c29916bf 42bccc95 c2cf0c0f 45c097b4 3f800000 00000000 -> bee0fc3a 3f1980a8 bf2b39e1 4214736a", + "3de728c4 bf031af6 be82457f 421f430e c212e93e 4215fc48 c2ffe172 458d1df2 00000000 40000000 -> be8876b7 3e8cca26 bf6c7c11 42018720", + "414e6538 41187160 c303d006 45894e4c 414e6538 41187160 c303d006 45894e4c 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3c687779 bb2262a8 3ab44954 3eb414b7 bf56cd8b bf3e228a bf8d17ec 43021d33 3f800000 40000000 -> bf0a506b beeffc38 bf32e7ab 42a4550a", + "c005e8a3 c08edd84 c0b11fe9 4424fce6 42c677a1 41d9d908 c2f08f0f 45c31e99 00000000 3f800000 -> 3f25ee8b 3e4f9e69 bf3be7d9 420ee0b0", + "bce1b7a4 3c7de6c1 bcb332e7 404959f3 c30c430f c2bb1ede 42a62f97 46067944 00000000 3f800000 -> bf3efeab befee4fe 3ee26646 423714fb", + "c08378c0 c294ba3b 4270bd47 45093be1 41a75ba4 42f9994e c09e6640 4564d328 40000000 00000000 -> 3df2e3df 3f7199d6 be9e070f 40de36de", + "bf5c53d1 3f2146ca bfb140d6 42899eca c2aa7ac4 c00db580 c0e69810 44e2fd30 3f800000 00000000 -> bf7f3fa8 bd09a8e5 bd8ce032 41a5282b", + "3d430f4f bd41052c bc5625c2 404033b3 becf7e2c bedd8f64 bf9c1469 42b11ca7 3f800000 00000000 -> beac66a9 be92cae6 bf659ae2 427e6fc1", + "400ecb6d bfd87ce0 c08138ec 43c86c16 c065fb80 c2f04134 c11085c8 455740ae 3f800000 00000000 -> bd4904b6 bf7f76e8 bd2c5e16 41cd2101", + "3cd197be 3e4a97bc bd1a4224 41369611 bf36c3ff c09bc0cb 3fddb87d 43a20dec 3f800000 00000000 -> be0bd0b1 bf6f687e 3ea74ec1 4266efb7", + "be2db75a bf043000 be633eef 4233f00f c0bfeba0 42f493c3 c0f0ee10 45543287 40000000 3f800000 -> bd41d208 3f7f4303 bd730473 41d99d3b", + "bdb87ece 3e8944f8 3dfdf37d 41b07893 c2821523 c0a24630 c28b26e4 44ee1ce3 3f800000 40000000 -> bf2e40de bd652f9a bf3afe58 419ddae3", + "40742660 c29403aa c1c83430 44b70581 4308564b 428a6391 c271bf06 45d2311e 40000000 00000000 -> 3f2b1538 3f38dea5 be36dbf3 41d4488b", + "c0b6aa23 3fdd0e34 c05d0880 442621a8 c0b6aa23 3fdd0e34 c05d0880 442621a8 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bfda95d5 bf22f5f7 bf9b17f0 4381852a c2dd8850 42b24406 c178a8a8 459f3cdd 3f800000 00000000 -> bf44a4bf 3f21dd02 bdceb34b 42084346", + "bd13899f bcc1bf49 bd8466e7 40a96761 42795338 42c02572 41a6f094 4553af14 40000000 00000000 -> 3f0918d9 3f533df0 3e380dbd 41e84ce0", + "42c8a3c3 c202aa2e 42042e96 453e2399 42c8a3c3 c202aa2e 42042e96 453e2399 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bce83ed0 3c4eff19 3d83bd44 40471b3d 3c82c11d 3d362f5b bb08296b 406bb0c7 3f800000 00000000 -> 3f03fbf0 3ebdb3c7 bf45c950 40d4d3e8", + "c21767b8 42176443 432202ed 45decbcf c21767b8 42176443 432202ed 45decbcf 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "4289f7df 42b9d479 4208405c 455d982a 4289f7df 42b9d479 4208405c 455d982a 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "c080e38e bfc388a6 c0aebf9a 43a759d4 c2404e3e c235a8e8 bed4ba00 4434809c 40000000 00000000 -> bf34c1c9 bf341859 3da5a23f 40c6ab1e", + "c25d6408 c240e892 c306566d 45b71744 4315440d c1c25570 c32f7395 46500864 3f800000 00000000 -> 3f795957 3de95914 be486941 420df497", + "3e3ea266 bf1af195 3e621c3e 418e523a be638efd 3f2b6650 bf4f5a95 42af7405 00000000 3f800000 -> be7786d0 3f412946 bf1c30b6 42259491", + "bc91887a 3d887d76 3cbb989b 3fa7b690 bed618e0 3e8076b9 bd92a1a7 4100f80b 40000000 3f800000 -> bf63637f 3ed149a5 be56aa45 416f9959", + "3d4ff4fa 3fea1036 3ebefc75 41e601e2 c05e8149 40db17f7 c03df341 443bc82f 00000000 3f800000 -> bf014913 3f37eb85 bef4e7dc 42ced89b", + "40469edb 40a4aa91 c0aeaf38 42d5c166 40469edb 40a4aa91 c0aeaf38 42d5c166 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "41459d40 c2035954 42ef28c2 4568d6a3 42960e2b c2ae3209 4299b812 45949c7b 3f800000 00000000 -> 3f2c0c0d bf14f1c7 beea8849 4130bbcc", + "4294043a 418935ac c2a65aac 45464650 41e59610 42dfcae9 c240102a 4574621f 40000000 00000000 -> bed17745 3f5b0045 3ea28c8f 40d52872", + "41ca922c 418bb820 4186b2d0 c2a721b8 41ca922c 418bb820 4186b2d0 c2a721b8 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3ddc4ed7 bc964e1b 3c05e420 40be2401 3ddc4ed7 bc964e1b 3c05e420 40be2401 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "4283ddb9 42cf7df5 c33f6958 46463889 4283ddb9 42cf7df5 c33f6958 46463889 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bf901d99 bef654e9 3f8bf596 42ce18d2 4288dd02 c25b96a8 bfeed820 44c4d941 3f800000 00000000 -> 3f49844b bf1da65d bd092e18 41853e82", + "3ba31571 3cf63363 3c4961aa 3f2087c0 3e328595 3e565819 3bbfafb3 41a3ce14 00000000 3f800000 -> 3f2fbeb7 3f3a0636 bcd5e65a 42a0e986", + "3f26b312 bf813ea9 3fab21db 4223c53e 3f26b312 bf813ea9 3fab21db 4223c53e 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3c372042 bbec2b8f 3c9b7a83 3f9739ad bb3ade46 3c87dd6c bc0dd963 3fa020ea 40000000 00000000 -> beb7d365 3f1be27a bf351315 3fe3dd0c", + "3eae8152 3e8bba8f bd9e7c99 42505845 407fe820 4205d7f4 420e9764 43aded91 00000000 3f800000 -> 3d993175 3f2dbf96 3f3b0814 40c18e00", + "42ffe028 41eb2358 427ccf78 45a497b5 40d96280 43182fef 4327cf74 464885eb 3f800000 00000000 -> bf19bb0c 3f1bd337 3f04bee8 42160733", + "3ea69900 c12a46d8 4130b100 c2192d3e bf82f2d6 beb9c125 3f8b9c36 42bfc924 00000000 3f800000 -> bdc0280f 3f371c0c bf3148f1 41156493", + "bd14ab6f bd1b083a bd84ecf1 40ef45a6 409d62b6 c09727ad 3ec42ab7 441e2b42 00000000 40000000 -> 3f39985e bf2f8631 3d86444b 42b6f6e1", + "3cb1bae0 3d268053 3d3db4cb 40a9e747 c2199ca0 41452e70 c2b9c7cd 451135ef 40000000 3f800000 -> bec22ebd 3df84c07 bf6ad4f1 41b70a2a", + "3bc918df bc096bf3 3bf60d28 3e2647ca 3bc918df bc096bf3 3bf60d28 3e2647ca 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "c05602ca c0ac897b 4039c42e 440b9aab 408f0222 3e60ac98 40be0da8 44284f01 00000000 3f800000 -> 3f464912 3f0e683d 3e9a2186 41361f9b", + "3d28d9d9 bc6519bf 3c7d9187 40684621 3d28d9d9 bc6519bf 3c7d9187 40684621 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "be21a2c6 3f0cb1ba 3efd6d38 426ebad3 42bff6aa 42516b66 c308cabb 45eaad07 3f800000 00000000 -> 3f0c4c04 3e97330a bf4857e5 4229def3", + "3e977756 3efda6bb 3de11ee9 4220f36e c29775c9 c241d2c4 430daa38 45d24f2e 40000000 00000000 -> bee7bd35 be953613 3f57bdbe 421f4e50", + "3d6fe6e8 3d5ffc89 bdf9acbc 408649d9 3d7c32a4 be4e9a80 bbb163a9 417c2e41 40000000 00000000 -> 3c2e9b08 bf69105b 3ed3c0a2 42243969", + "bdb1233c 3da67f26 be89ee65 41768903 c285d67e c2fb56c6 c2c0d28b 45e06418 3f800000 00000000 -> bec725f1 bf3b5b61 bf0f3e0c 4226cd59", + "3d8640cd bc2921d2 bd0af0ab 3febf067 4205e1f0 c2056ca8 424be7f0 445a4130 3f800000 00000000 -> 3ef619da bef5aa02 3f3be6b7 414890c6", + "3cb5bdb3 3b442702 bbaae7b4 3fb3e8e0 3cb5bdb3 3b442702 bbaae7b4 3fb3e8e0 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bdd13685 3f6f71a2 bfbc683b 43022986 bdd13685 3f6f71a2 bfbc683b 43022986 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3a01cbe6 bc67429c bc3174e1 3fb8507e 3cf8e55b be320519 3cebcf35 41751ef2 40000000 3f800000 -> 3e36f960 bf74791e 3e7288bc 42a5f767", + "42a934e8 42e419b8 41f0a898 45a1f504 42a934e8 42e419b8 41f0a898 45a1f504 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "be49888f 3eca875f bf598e3d 427ba0d4 c1f938f2 c2872fd2 43066bba 45b853ee 00000000 3f800000 -> be4d2248 bee144d2 3f6018db 42170e41", + "3d044cad bd1f35e2 3d16a9ea 401a7b1a 3d044cad bd1f35e2 3d16a9ea 401a7b1a 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "c24cc720 c2b0cfe8 426f35aa 4542f7a7 c24cc720 c2b0cfe8 426f35aa 4542f7a7 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "00000000 00000000 00000000 7149f2ca 00000000 00000000 00000000 7149f2ca bf800000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "bf614380 c318e498 422c3236 45c4a5be 00000000 00000000 00000000 7149f2ca 00000000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "bcc3a73b bdb18282 bdb2f79d 4108f6aa 42a07187 41aa5280 425d0c56 451b1c6a 00000000 3f800000 -> 3f4dd78b 3e5b5722 3f0dfac4 41c64156", + "bd59f633 3d409459 3e07158a 4172f375 c33532c7 c1b59640 c1b4626a 46043e15 3f800000 00000000 -> bf7c1160 bdfd34bc bdfc7a55 4237b042", + "c032377a c096e641 3db61483 43936f4b c032377a c096e641 3db61483 43936f4b 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "3cfa2cea bd0caf13 bd45d9db 40aae823 bf1d8c76 be528e4b 3ef252b5 41db8230 3f800000 00000000 -> bf431168 be4ee2b4 3f1d828a 41d08891", + "be15af58 3f4bf108 3e3905d7 4263f23b c2c77b88 41a14bb0 c02e1940 45145819 3f800000 00000000 -> bf7b30ea 3e435de5 bcea21c4 41b69460", + "3e5792c9 3df9934d bf2a5cd9 4214531f 421918b4 c2fbb0df 4307f876 460adb8f 3f800000 00000000 -> 3e4d77aa bf29fe34 3f3863f3 423a9b4b", + "3b4256bb 3bf63ad3 3c6f98a3 3f8b7273 bd801b16 bca97f44 3cbc9f6c 40d2b7d2 00000000 40000000 -> bf6985cb bec90fcb 3def8ff7 42990753", + "3bd913a3 3c27fcd9 bb7183ce 3f87dd87 bc5626b7 3c9d3158 3c33c816 3fe0e93d 00000000 3f800000 -> bf40fb72 3eaf1ab7 3f0fa04d 41d50341", + "c1b85294 422d26fe 426f4e44 44aca8e7 c1b85294 422d26fe 426f4e44 44aca8e7 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3e90fa6a bf11f55d be5a6254 4234b659 4284374b 421eaabb c09e4150 44984fae 00000000 3f800000 -> 3f5a03c8 3f05442d bd7ac5bf 4172e0f9", + "41cb561c 42be4650 41ff34d0 45268e2b 42d8bbde c2947607 42ddc4da 45e6a962 00000000 3f800000 -> 3ecfb7c5 bf540f66 3ec5c935 41b888ea", + "42d3d6b6 c14430b0 c10be850 452c637b c11cf280 429e1de2 429c64c9 453ef173 00000000 3f800000 -> bf2d1b17 3f089899 3f020bb5 3fde07b6", + "be71f08e 3e114b2b 3e11fbc1 416cdd9f be71f08e 3e114b2b 3e11fbc1 416cdd9f 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bcadf904 bd85c2ce 3d13644c 40844116 c21f4029 42a8f6b4 c10bf848 44fa12b7 3f800000 00000000 -> bed91245 3f669cb3 bdbfad5a 41aa2c6c", + "3f238a84 bf8d3499 c003cfe5 4332cfcb 4136b9f8 c31ec62d 420881f8 45c3a4a7 3f800000 00000000 -> 3d88311d bf78f5f1 3e648d60 42160c31", + "3b425b1d bbe3b50c bc73427b 3eecb1df 3e18b940 bda893df bebf12f7 420ce3e7 3f800000 00000000 -> 3ebdd26a be43baf2 bf68aa86 42b0525e", + "3e0621a1 be8473b6 be57bd37 41b58718 c0811b3f c0636c7c 3f855e21 440f60de 00000000 3f800000 -> bf436c46 bf1a9272 3e6b0f96 42c9e280", + "412602d0 c31d1246 c276c9be 45de2d32 00000000 00000000 00000000 7149f2ca 00000000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "c294636a c0e33ca0 42b0d7e2 4545df0e c294636a c0e33ca0 42b0d7e2 4545df0e 3f800000 40000000 -> 00000000 00000000 00000000 7149f2ca", + "3dcc695f b9a7acf3 3e4754bf 4154d922 3df40800 41d996ee c196d418 433148c6 40000000 00000000 -> 3a18b958 3f51b0ea bf12da38 409e06e2", + "41f93136 41bdd1b4 418bd090 43b30dd2 4325fdd4 c3219b28 429b0daf 4668ce1b 00000000 3f800000 -> 3f11b1b6 bf483f9e 3e81c3d9 42757ea9", + "41cd51d4 41af3934 421fb1f7 440d7124 c3095418 c1e2a3a8 42eb2800 4602bf81 3f800000 00000000 -> bf5ea769 be893d39 3ed42803 422687a9", + "3d66445e 3d5fa487 3d2eaf28 4104cc2b 415f5e70 c30c8bc0 426a0dee 45b054d0 3f800000 00000000 -> 3dba3b1c bf6b6542 3ec3c935 42136425", + "3c922b53 bcc1825d 3c1fa641 402bbb33 be3a4bc5 be226193 bd7a9d79 419e69f7 3f800000 00000000 -> bf4b81ea bf097a06 be9082e4 42883cf7", + "bc1408c0 bcb0bbde 3bac404e 3f79ffe9 bc1408c0 bcb0bbde 3bac404e 3f79ffe9 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bf9ec0ed 3fe5fd32 3f47b951 43247924 3f1efe69 bfb013af 3fbc743e 432e08ef 3f800000 00000000 -> 3efea184 bf58fdf7 3e3d5dbd 4023815f", + "3ddfcfe8 be0bdb2f 3b85f690 409745c6 3d0259eb 3c37f088 3d4d9427 40b72ccd 3f800000 00000000 -> bee5148e 3f5a8fc8 3e8857d7 40b846a4", + "42cb5bf2 c234bf92 c1b9c0b4 4549b8a6 4319edd1 41c086c0 c2135336 45c1e0ea 00000000 3f800000 -> 3f185216 3f49e3e8 be1ebb6c 420795f7", + "bc587d98 bc5e4c59 bd7344bb 407eea2d 3efda70a bef43072 3dbcd82e 42292301 40000000 00000000 -> 3f38cfa9 bf285d40 3e5c5685 4259732d", + "4288a9b2 4269dc5e c2705fba 45356ea3 4288a9b2 4269dc5e c2705fba 45356ea3 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3d59f4b6 bbd8dd3b bd428a0d 40ef579d c30951e6 c2cc5cf7 c1d05580 45de5650 3f800000 00000000 -> bf4b159f bf170cae be19b6ae 42242c23", + "bb11d5da 3c8e4114 3dc25524 3ed15c54 3c53e44a 3dacfd7d be2f610a 410bf62b 00000000 3f800000 -> 3d61da0f 3e79f41b bf77dacd 41f2aa1d", + "c29c4eaf c06d0220 4244326c 45024c59 c2850688 c210e1a4 4289e25b 451cf973 00000000 3f800000 -> 3e95899d bf50dada 3eff8a6d 412b56cf", + "3ce8eba7 bbe207c1 bbb8ea5f 3fffc73d bd14c0da 3ddf1c71 bd037628 4121888a 3f800000 40000000 -> bef4fdef 3f5b263d be482c07 426f5d6b", + "bfcbf5c0 41743884 c1178110 4222a24a bfcbf5c0 41743884 c1178110 4222a24a 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "3f81a66b be7f80b3 3b8add6a 4231082d c26268e0 410f3470 430b6b16 45b15443 3f800000 00000000 -> bec3306a 3d79564c 3f6c2749 4215047d", + "bce7c6e0 3d80bba1 bd846d30 4095ea89 bf4f1736 4050d579 bf80dc99 43a33e6b 40000000 3f800000 -> be695341 3f6f1eb7 be8cc8f0 42bbdad8", + "41801070 c0eb7818 40e89d08 42b59026 c1dfe728 c1062218 40a54900 434b00d7 3f800000 00000000 -> bf7fa379 bcbe9195 bd439b10 40230431", + "43106bed c1d93c90 c22a8d33 45b635dd c2bb2e5c c291633d c315fbf2 460d64d6 40000000 00000000 -> bf65e49b be2ff177 becf5e6f 41424afb", + "c0a7e7b5 406c85fb 402cf82e 440e99cc c0a7e7b5 406c85fb 402cf82e 440e99cc 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "c265fc5a 433665ed c30069e0 464eb50b 00000000 00000000 00000000 7149f2ca 00000000 bf800000 -> 00000000 00000000 00000000 7149f2ca", + "41b0e930 417a2200 412ffd40 c2bbd1b8 bf131d14 3e91a8c5 3e24e832 4222035e 40000000 00000000 -> bf452a51 bf0561ee bebc5f11 409201ed", + "bc333f39 3c2b1180 ba43494c 3fb66d45 3d408001 bd9c56bf 3cdd1cfb 40d542a9 40000000 00000000 -> 3f096084 bf4dc34a 3e83885b 42421b04", + "bca241d8 be8af3b6 befb9be6 42310988 4089723a bfe6587a c03a0922 43d0dcae 3f800000 00000000 -> 3f556ccf be972bef beeeef7a 42905004", + "430e00cc c181a998 428973f0 45c25c02 430f87ab c2b1ef57 423c642c 45e5970f 00000000 3f800000 -> 3ca4bf46 bf75568e be91dbe5 416d96a2", + "c044689e c0dc5e4a 40906f78 44128384 c044689e c0dc5e4a 40906f78 44128384 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "bc83803f bbd7c1b4 3b7d8ee3 3fc712aa 412c6ae0 c2c8e162 c0f69760 45204553 40000000 3f800000 -> 3dda2cb6 bf7dcbe8 bd9bdcdc 41ca6144", + "c2820340 4152a9c0 41b010b8 4493fb1c c3139667 c21e9e06 41da1a58 45b37851 00000000 3f800000 -> bf575969 bf09be02 3d5b3ecc 4239c48c", + "3d355775 3d259d5d 3c0b1853 40945a7e 41a005a8 c1d4f5b0 430f432e 45a8007a 00000000 3f800000 -> 3e0af5e1 be399f51 3f7959b7 42121665", + "3d35fc36 3d0c5c87 3cdca527 400d4646 c10517f0 41831910 4221a475 436a9a9e 3f800000 00000000 -> be4106b1 3ebcb9ee 3f6907a3 40a7a0a9", + "3e9e7491 be966213 3e8fcbb8 42290bd5 3e9e7491 be966213 3e8fcbb8 42290bd5 00000000 3f800000 -> 00000000 00000000 00000000 7149f2ca", + "40bd1ac0 c143b2d0 419f05c8 41bce420 be82c993 3fd77c6e 3f01a29d 42c13310 40000000 3f800000 -> be802138 3f10990c bf494dbb 403d9ea1" + ] + }, + { + "glsl": "float cultmath_gabriel_margin(vec3, vec3, vec3)", + "tolerance": "ulp-bounded", + "cases": [ + "421d55b0 c229c8d9 42288d02 41a8cb38 411db540 41e64d1c 41502dec 41944258 3e3f8f00 -> 3f5785df", + "423b7a5c c1e73c17 41194b68 42001764 c2394d8b 416d7ff0 c1e88503 42084ab8 c1a93ec4 -> 40fd18e5", + "c22e217e c1befa7a c1b06922 c1ffa78f 411c63ac 4143ada8 c1c4d519 41e9899c c105d97c -> 3f11120a", + "40bac268 c21065e2 41ebdd0c c180e5ec 420f43d2 c112d7ec c1cb0731 421608cc c00bf540 -> 3d56dff2", + "422dc136 4223d020 c042c540 c1067d9c c23852c3 421f1636 422f7294 41a49c4c c19d84a7 -> bd71adee", + "42383fdc c1aa5342 40c0de10 bfcff320 41534bb4 41ecd770 c2095dc6 beb64a80 c21ab350 -> 3fc31c42", + "423e81e6 405911a0 420746ae 42316740 4203e03e c1063244 c182854c c2064fea 4238d390 -> 40193ef8", + "414da1c0 c11c71b0 c184969c c1698260 c209f19f 41e95e30 40ee1e88 c171d740 c20f8104 -> 3ef6a0b0", + "41a0056c 4192f1ac 409a3a70 c08db1d0 c1b6fc24 40fbf2e0 40eb85f0 41dc2a34 41a5743c -> 3ec08c76", + "c22f27e5 c1c6b069 41c7d1f8 3e3ec700 c11f3f90 c22b768d c1ef87be 41d140b8 410a016c -> 3e236198", + "4144e738 40c2c6d8 41db84f8 418baa7c 40bae240 423521ac c1f1dc98 4212de5e c1891bf6 -> 40e76730", + "420823d4 c1deb032 41f63014 c10ad814 c1a5ede3 424249cc c17101cc 41fa9b8c 4189caa4 -> 3fe95b64", + "c1c73c3b 420902b0 40c54200 421ffb74 c144fd70 4173ea58 40e7c4b8 42104b46 42356f4e -> 3d844dd0", + "c2267b12 4111cbdc 41fa46e8 3fe8a5a0 c2105626 4223b65a 41f3996c 41fb63c8 421eed7c -> 3f90b933", + "c1913f7c c13e4d60 41a524c0 42129648 42083034 c0b38200 c128adcc c1723780 c1e89490 -> 3e94ef26", + "c10866c8 41b193cc c1344690 c10866c8 41b193cc c1344690 c183c30e 41e06e3c 4247b09c -> bf800000", + "c19266f6 42097f20 c1a1d6ce c13f5ba8 c1827328 42256f12 c1cc25d0 c1c89e42 c111ee34 -> 3c947661", + "c235f1c9 4206cf42 c1b4bfbe c1ff05d3 4060da80 42266048 c169ebbc 4213f53a c2118fb0 -> 3f05be9e", + "c219fad4 41117ec0 c23034bf c1c1b3ea c1dcf314 41725638 40788ff0 c15d13e4 c1ecf6cb -> 3db167b4", + "41b2d0d4 c0e8a528 41be1c1c 4113a758 42384d96 3fd3a960 42448bcc 422f372c c23659c4 -> 3fb4e5b2", + "41ea469c c1ee9406 413b95a8 c121f9dc 40b82a58 c22a2e00 42026304 c1d52d90 c1fa8783 -> be2c8882", + "c0371ec0 41bc6bf0 c05d6c20 4219ab70 41b4d9a8 41e367c4 c1587130 416cee98 c2095d60 -> 3f975d8c", + "419461bc c14867b4 42193210 419461bc c14867b4 42193210 41943810 413c8b70 c2203ecd -> bf800000", + "c212591e 41e8d1c0 c1dfa0fe c212591e 41e8d1c0 c1dfa0fe 4229d47c c106c86c 42024f00 -> bf800000", + "c17acbf8 42254f2e 423d7a46 405af5b0 41a04180 c20c4b8a 4202328a c19bc073 c2020138 -> 3f334dae", + "41b9ed0c 42433272 4238c21e 41b9ed0c 42433272 4238c21e c1c36463 42127d00 c201664b -> bf800000", + "c20b4669 c17abf68 41e12918 c1030b10 c190f828 40e5c928 41c51f70 41e0bd5c c085df48 -> 4040572c", + "42302b1e c23a05dc c242c649 4095ccc8 c1902fd9 415f6900 c19f0c6a 423c5c42 41c9e51c -> 3fc3ffba", + "c2096b9e 4204345a 42331ae6 c2096b9e 4204345a 42331ae6 420ffe52 c22c39b3 41a66694 -> bf800000", + "c1959484 419dd32c 417982f8 c1959484 419dd32c 417982f8 42175914 4229ebe0 c2366a34 -> bf800000", + "4212b6c6 41021158 4156e560 422a0fc8 41172d0c c11cfb78 42188fc6 41caa15c c1ce46ad -> 3fd7829a", + "c1e8ed4e 41e870d0 c1a633e2 c1e8ed4e 41e870d0 c1a633e2 c1fb8623 418694bc c18e3044 -> bf800000", + "41e99af0 c1ac1ce7 c21a758e 41e99af0 c1ac1ce7 c21a758e c18ef588 c1272b00 41db4cc4 -> bf800000", + "be08f300 c1722444 4131428c c23459dd c2160211 c099aed0 c22f2df7 c21bf1ba 423ba3ec -> 3f688e20", + "c19ed5c8 423a3544 41945d74 c14657ec c145bc04 c16f3a4c c1b3f6ca c2291c53 41a47c78 -> 3f5611d4", + "41eec9a0 c22c3a16 41ddc07c c2150731 c23c60c8 c1850e3e c1e4a70d 41159e20 41f8c2d8 -> 3f1da8ee", + "c23e6f87 40918c50 c1fb61d7 423b6294 40f4c6c0 42417aa0 c20ec245 4204e9a4 414d4af4 -> be8d98a2", + "41e82508 c20d48b0 41905444 41a43b94 c1dff0a9 42411ba4 c20c18c2 c1067234 4223608e -> 40407b59", + "41d2b20c 41c40170 c1ccbce1 423e4192 c0e276f0 40e4b590 4223d042 c2137568 c23ff915 -> 3fb1d97c", + "41e90a20 c1d1c4a6 c04957e0 42321372 41ccc724 41dfcc5c 42021bc6 c1ecc3e5 41efa258 -> 3dd34a00", + "c12ba684 c1ea189c c0b72840 42262bb8 4172b600 c13190dc c0930f38 42466298 4222f124 -> 3fa0bd01", + "c2357c6c c1fcdcb9 41ee920c c234f799 c1b0e07e c19ee00d bed3f800 4219d162 407b1700 -> 4008940b", + "c245fdd9 c22a55a2 c2434cdd 4206cdb0 40a7a6b0 418e999c c13e0adc c1434534 4233ba38 -> 3d2e6db3", + "c0bef418 c2090022 42324930 3fc94600 40b32a98 c19e347f 41ec2140 41db9698 c18cd7da -> 3f16bc88", + "c237eaa6 c2190768 42256daa 423d8356 412bcdb0 c0c15ad0 41e2c710 c1c6b71b 41850764 -> bef7ff47", + "c0916338 c1ace3c4 42304a64 41eb9e0c c19127fe c1f37ee2 4150e0f8 41330d04 c15b2478 -> bdbb6d11", + "423d60b2 c244e17f c229909a 423d60b2 c244e17f c229909a c0530590 421b83b4 c1d16f1a -> bf800000", + "c1fe9281 c2044336 bf573b40 3f1fd640 41b11988 40c1ea78 bdc7d400 421b098e c207c34c -> 3f5876fc", + "41e63360 42075f62 c1d84b79 41e63360 42075f62 c1d84b79 421de944 c214272a 41a95604 -> bf800000", + "bf065840 c2096ca0 c1e2950a 4200c342 c1f243a3 c15f6cec 41895b04 c1fd6540 c10dae58 -> be9f865b", + "c16f3280 c23b0927 c23776cd 41cd9398 c226005e c1515420 c1c1c431 41369af8 41d002c0 -> 400c9b71", + "4197b364 42335440 40c80ad8 c205af78 4222c576 c208d0b4 c1136480 41e9b1bc c13c5c10 -> bf14e7ea", + "c1c7d29d c2288893 421745ac 40a60e00 c1978771 41899c74 4236ebe2 c1603208 423cde9c -> 3fea80d4", + "c21381b2 c19c0704 c18d9c0e c1e7ec22 c055ac30 420a805c c1a5112a c23bb01e 41cabf7c -> 3efa48e0", + "42102f4a 420e0248 c1af7af3 c23f2eaf 409492f8 41164810 4206a866 c219f3f6 4225fdca -> 3f4d4212", + "c238511e 4234fde4 4217d4a4 c2078247 c1b6881a c20a4ed2 418d89a0 c193f8ed c0ab93d0 -> 3e9acc6f", + "c10b3a60 c10d03a4 421f2a6a 414e0c44 c1388b34 4148891c c1c5edff c203fcda 419f5698 -> 3f869cbe", + "c22fbae5 4211b7e2 c144a408 c22fbae5 4211b7e2 c144a408 400b9b10 c127ae60 41ee69cc -> bf800000", + "3f5b8d80 c17c33b4 c245d09f 420625d4 4208dfd6 c0b05270 422d2fba c2007f96 c0eec138 -> 3ed9c892", + "400cd950 c20c8560 422f4dfc c2044473 423f73e0 41070970 c17f46a0 c0a47e60 4236d7e0 -> bf07f123", + "415de98c 41c0a8c8 415bd078 c17ddbec 41854a84 c1067d00 420db8b0 c2020900 40f13730 -> 401a01fb", + "42085b86 c1b0aa9c 41d4d2a0 41690be0 c1845c88 c19857b0 41b7c688 40f85ca8 40defa08 -> 3dbe2d94", + "c0965a48 41a730d0 c09feac8 c21eab4f c21e71a0 c1d695ac c1352310 421c898e 421a4402 -> 3f81d154", + "41ea2948 419e958c c22ab683 c208457d 41d633a0 41a3fdec c22640b7 c1477b0c c2047f6e -> 3e8f7002", + "c0ec0748 4110f408 41ce7174 41073148 c1cdba38 c13bbac0 c0639100 4185622c 4205e9d2 -> 3ebc1735", + "41873f74 420ddf16 41d24588 3ed19500 422be1fa c1a75c85 418e7d88 41fe36d0 c1d20ab8 -> 3e71b85f", + "c0d07f40 c23c567c 42392f20 41e22484 c20eef3f c1eb3d97 c189a66e c19466ee 42172928 -> 3dde84d5", + "414f4b18 c1dbd642 c168f7e4 c20e9fd6 4210f7b4 42345fb0 420aa924 c1485be0 421031cc -> 3d86de13", + "41b0fa20 41d5dc78 41b00c48 41b0fa20 41d5dc78 41b00c48 c1e2b771 422f358e 422e2802 -> bf800000", + "c1f48eed 422d995e c1d84eee c23d3fce c1bab83d c210d967 41bb20f4 c124a9b8 414c3784 -> 3fa3fc9e", + "c047a460 42004740 c0ba2378 c047a460 42004740 c0ba2378 c2321b7a c20c059a 41e70fe0 -> bf800000", + "c1ebd1ea c0b3a930 3ce87800 41bc6194 4162add8 423f824a c0b2bb30 c19d5488 4236e99a -> bdfd7428", + "3fcfb240 418603bc c198b941 c22af148 4209dcb6 c1ea2e83 c2435755 c129b254 c2260c00 -> 3f8169fa", + "c11e7bac 41244a54 423770fe 418bf514 41c5152c c1d42c5b bfe4c120 c23d9e1e 422d2d76 -> 3f5c8e63", + "4201701e 41853114 413bcf54 420c88b2 41da32d8 c0c73c10 4102410c c083c200 c1a6242f -> 40483b62", + "c1c75382 c23ae087 41b2d4ec 4142a418 c22d7164 c224cdcd 41b0fcf8 c12623fc 423e6a8a -> 3f786366", + "c1d45a5a c23de6fc 4180a238 c1d45a5a c23de6fc 4180a238 c133649c 412411dc bfbcc460 -> bf800000", + "c1acfcbc 418f3a70 4243a634 beabd600 c102e520 c14f5ee8 c2128684 420be50a c233f1f6 -> 3f8e3c3c", + "c1436b5c c231f94e c1a0156a 414961f0 40a90758 c21f5a7d 42059dc2 c152f990 4217a820 -> 3fc8b2dd", + "416edad8 4117c9a0 412dafb8 3fad6ac0 c2259d0a c23408a8 419eb544 41eeae34 c245b891 -> 3efbe913", + "40a76b70 408abaf0 c1c8f787 c20a6924 4220f30c c041e740 421a2c44 41cb5bd8 41376304 -> 3f84f485", + "c16af740 c201bf34 41d987f8 c16af740 c201bf34 41d987f8 41a81a14 4184ef94 c2217e4a -> bf800000", + "40dd3290 412de95c c0307e70 c1d72eb6 c2401ac3 41b2b8b0 42066326 41971e74 c22bceb7 -> 3f93d76f", + "c1876460 421d564e c10eea8c 41899b44 c183bb3a 42099d9a be5f6400 4205cdcc 41f504ec -> be8db709", + "c2430a46 c1c5a546 41b2cae0 c2430a46 c1c5a546 41b2cae0 c1e30d85 c228102a 41cad1b8 -> bf800000", + "40265ef0 c028a150 42012e6a 42334b58 420af38c 4243e140 bff5df40 c2241fb4 c18b41fe -> 3ff39131", + "c0ab2150 c18ef66c 40172210 c09b1ca8 c05f85f0 4204c1c2 c2106c44 4244d5f8 c17a5dc8 -> 405b3486", + "c1caed3d 4190e91c 42081e6a 3febfee0 42163f3e 420ff556 c2267404 c1930e16 421a14e8 -> 4012a4f3", + "c1311d18 c17b3694 c20b8730 c1f21330 c15c4b10 421260d0 c00ba110 c13bf624 c2359d3f -> 3eb244f3", + "c0fcdf18 421afe5a 4103b55c c0fcdf18 421afe5a 4103b55c c123f8f0 c201642e c19748aa -> bf800000", + "c1af4ae1 40c2ca78 41e64b78 4231aba2 c1dcb976 41bd0e90 3f37de40 4209f162 41555e04 -> 3e95e4bb", + "421e0808 c22a749c c22af3e6 42225544 c20627f0 c1ec6936 422ea648 c21e9685 c203f406 -> bebda006", + "c1c21482 c1899d06 c22450d1 c16a10b0 41cd2288 42327338 42290472 c161d3e4 c22078c9 -> 3f18573b", + "42045b08 40424a00 c17cef6c 40fcd630 40132ad0 403533a0 42457138 c0af9748 c21870ea -> 3fe3fc2e", + "c10839dc 41cf39d0 c16bebe8 423c58c8 c11915d4 c1981346 c2309b75 3fc1db20 41b24c94 -> 3fa1ef13", + "c143783c c22ae2e5 c1a4cf6e c143783c c22ae2e5 c1a4cf6e c2329a14 42352914 c0355e00 -> bf800000", + "c1f9022c 40727da0 c1f9cb43 41fb05ac c20cab8e 41c4d454 41f1f8f4 c1587260 41b98e7c -> be059a60", + "3f4a21c0 c112723c c13b75a8 c1e74ba8 bf59b400 4241da64 41cc34e0 be272900 423e2c78 -> 3eec3b42", + "c15f9a2c 414d3820 4233c148 421b0eac c11429a4 415992f8 41b0ca8c 41ce7bd8 c1d2e754 -> 3f61e77d", + "c1839768 3f8fb500 4149c6c8 c1839768 3f8fb500 4149c6c8 c1805762 c08db508 c1c21a8f -> bf800000", + "42085f08 4121bac8 413121d8 422a9940 4129d584 4189e698 41f19bac 41700468 c21313bc -> 410cec63", + "c2255e8e c205383b 41020fac c1c71533 40b068a8 423efc9c c21b6f54 40c18710 410d9a44 -> bccec56c", + "41c0feec c12f7a78 c115cb04 c23dfb1b c2364173 c214a8ee c125b438 4246aade 41e1e37c -> 3f9bd76f", + "c186cbee c1a29eef 41cc219c c20e84a4 c20a5441 421b1060 c151b990 c0d3fe58 c23f2759 -> 40a5eb6d", + "c1b26408 41673448 c1d1e4dc 409e1a60 40acec08 c20145fe 422ace70 c226411a 42367092 -> 40c3bb94", + "416dd460 422ff7e2 41df46d8 3fce6840 c09e12d0 c1f43d18 c220a73e 410257d8 4218dab2 -> 3f245c0e", + "c00e1b10 c1b33f4b 41f445f0 41f0a474 41e7e1d4 c10d2420 c1748a34 c205bd78 c2213658 -> 3f6b5736", + "4185f968 412dabfc 418e20ec c196ced6 c2214d9b c20aec30 c2137c15 42392c68 c03989b0 -> 3f3ded34", + "4213048a c1eeeebf c19657e7 4213048a c1eeeebf c19657e7 c212835a c12d7760 3fe1a380 -> bf800000", + "421b2dfe 41ae6668 419a7b6c 41e76f3c 41e5f748 40a52c18 408dd2c0 c247925e 4207aa1a -> 40ffae3c", + "c1500728 c0248e70 41cfa4c8 4203dc8e 41d117d0 4242f53e c1a91845 c237f5e8 c1be312b -> 40033fb1", + "c1cf699d 40b251d0 c100fc8c c22ea278 c211d3a6 c21bd16e c24229d9 c1b2d4a4 42398c4e -> 3fcc8edb", + "41d3d158 41bb256c c1113fb8 40188f90 414ea8fc c02fb2e0 c21100a2 42174516 42006f5a -> 407a3295", + "c215950c 42459de2 c197aa19 41e22b38 417b3348 c1ed4bf4 c188fe4a c238d803 c0c01a48 -> 3f98e1ee", + "c18c4262 41c98cdc c2228d72 c1b27c2b c1863874 c1a11b50 c127b07c 421e6cc2 41762d10 -> 3fbfa883", + "418d9a28 406cf5c0 c1b9b6ad 418d9a28 406cf5c0 c1b9b6ad c22a3e92 4159adf8 c22df8f9 -> bf800000", + "bfa22d60 413d7640 c1ef9b60 420bf5e0 c10f44e0 c1e0ca85 c2118389 c1caa563 c1cbc175 -> 3fed48ec", + "c207476e 3fc28740 c115bd28 41e15b6c 423eae2a 420698f6 415eb5fc c242ddc3 41608098 -> 3f3377a5", + "c1b01556 424621e4 c1f6b59b c2290f10 c1cedaca c1dc8c5e c20e5dba 410e6e60 41b4f274 -> 3ea9c6ba", + "c1b56cc0 c1fd7246 c20d55e4 41acd6e0 41a84698 4206f5ae c20b8a61 c0217110 c17da164 -> be6a4084", + "4215d7d0 42453e46 c23beb64 4215d7d0 42453e46 c23beb64 c211463a 4217ffa6 bf847e80 -> bf800000", + "41b171e4 421e1f5e 40c10988 c12330b0 c22f60cf 42464b58 41e42364 bf4cd340 c0ea3d18 -> be2480cd", + "4213fa68 c1e6d3b1 412d8d14 c22a0788 409706f0 40034140 423cd5a6 423f71b4 c1525784 -> 3f5ad1ce", + "41fb95d4 c1e3323a c22b7595 419446b0 c2063b70 4189152c 41d490ac c1aa91e3 423a0d46 -> 3f744372", + "c21e1f4e c1f503c0 c1f21d6c 3e806f80 c1c8fa30 c23c8598 c1a424f2 421615cc c2175854 -> 4000348c", + "c20ba13b 41f56834 c1dcc284 423afb44 422fdf78 421285ac c209dd50 41efbeb0 c0ad14c0 -> be4628ef", + "3f782200 c21a1126 c208b7ee 418c2240 3f148380 420194f4 c0fcba60 41c4d0b4 c1d52178 -> 3eb4f789", + "c12fad94 c1d7f9ff be255d00 c18e50aa 418cf894 c2425b23 420eacb4 4192e82c 42027590 -> 3fb29069", + "3feccee0 c1db72e4 c2214026 c1e1e94d c244e92f 4244c824 41e63efc c20342c6 41c487c0 -> bd059fe7", + "c1a18236 3fccfcc0 423a68fe c08e9a08 4243f1d8 c239c9f2 4194b784 c2295a92 4246aed2 -> 3f315f85", + "c0f09058 412c46d0 409c2968 41b92620 42285bc4 c1994d13 419dbea4 42389342 c1a7020c -> 3d950d34", + "422a3a9a c244270b c0351670 422af6f2 c1accc0e c240d0ff c19f03ee c1a4eba3 4185f4a0 -> 3ff3333f", + "3fb13d40 c2398a8a c1c8a90b 3fb13d40 c2398a8a c1c8a90b 422e305e 4215acb4 c1bccbfa -> bf800000", + "417c03f8 c22b6d53 c1863458 c1896dca 41e00e90 41958a8c c11de194 422454c4 418d82c0 -> 3e5beaaf", + "c08f3570 c215c908 c1a2a0d5 c1a42e5a 42028c3a 42183e40 42000946 c1a93420 c23646b2 -> 3f1245b9", + "4244ff36 422562b4 c2036d3a 41bb7008 c12cb9b4 c1115388 bfdb6320 c1321e04 c162671c -> 3efac07a", + "409b0590 41a4ec54 420ee65c 417161e8 41493298 414eb5c0 4170e2f8 411bc5fc c1d85ca3 -> 403dcf3e", + "41e3d2a8 40e71178 c2415dd1 40c8ad80 c201b8ee 4246da9a 423b3cf6 c1e0bdd1 c1e82d89 -> be32e665", + "c1524b14 c1ffc996 416b29b8 c1b6ca64 41c33c94 421fffe8 c15f7410 42228e38 422e7788 -> 3f049fb3", + "c14e8f60 c1ecbf43 c242f0e4 c2149f50 41c74650 c1b95ecb 415fb750 c2349b1f 4187385c -> 3fb54e1a", + "c1f2426a c1d7f4ff c1ddd073 c1f2426a c1d7f4ff c1ddd073 c1c0600c c0ff17c8 421ec086 -> bf800000", + "40cdd170 c1114b60 40bb87a0 c0bc8eb8 c1bcf861 c20070bd 4243f8fe c152ea10 c2305445 -> 3fdc5ad6", + "c23d0d09 c1376430 4222ba30 c1b8eb19 41c35510 4180f3ec 420f7584 410123d0 40be9890 -> 3fff9f18", + "c064c5b0 c0088180 41fae50c c1644cec 4227d814 40a02750 c242f58f c2109846 4237036e -> 3fe971ef", + "410cd8b0 40e11b68 420c7dc8 c183748e 423475d4 c1738af4 40840470 422bedfe 42301c8e -> 3e12b7e5", + "42057fda 40c7ac58 41d03668 c1cf44b8 c1c4723f c20f554e 42314f70 422b5456 bfb4a0e0 -> 3ee6e755", + "40c4ee80 c1efc287 418f0e0c c0d79900 c225bdba 4118ea88 4171e9f8 c238f5cb 40096150 -> 3fa58c4c", + "41aafdcc c2057b2d 420c9144 c038a720 c08983b0 405a92d0 c2302394 c12fe3f0 c191d6c1 -> 3fd41934", + "c125cae8 c2180698 422b8786 41b4a674 4220be18 41aeb968 c21684e7 418531a4 c21eda1b -> 3f761efc", + "41de5ac4 412ad5e8 c22649e7 c1266988 c133a240 421c9c66 424433d4 c108bc70 c1c7f91a -> 3d0dc75d", + "c1671338 419d4588 3ebb2d00 c1dac4ae 4185f60c 41a8c890 c1709b6c c1e0fc41 41e31c34 -> 4043d254", + "41b03b68 c22731ba 40aa4358 c224324d c0badcc8 c1b6d193 c238a561 c2120946 4044ec60 -> 3d29a3fa", + "c15469b4 c0340770 4241e1ac 41c2d168 c21d3695 c2273146 c1f0f6fd c2422390 c226a1e2 -> 3e60c3f7", + "40d19920 408baac8 41682e20 4238d96e 419fd500 413a0c38 4002f9b0 c109c50c c230a7cc -> 400475a8", + "c1f74c5e c151f1c4 4221f93a c13bdf3c 419cbe38 c23292f0 c02899f0 40c9f880 4235c136 -> 3dc80ae8", + "c2197fc7 420d41c8 420e3d1a 42191de0 42197baa 41a98234 40dc9050 4183de70 c2182bc2 -> 3f49f847", + "4108b130 3f9bf8e0 c1840696 c1e14a12 c20157a5 c0c9ea08 c10aec9c 416d9928 c1307338 -> 3e4bb74a", + "4202215a 41c8cf38 41472f88 4202215a 41c8cf38 41472f88 c1801614 42476202 40d63278 -> bf800000", + "c21f290c 40a6e0f0 c234f66a c21f290c 40a6e0f0 c234f66a 412d6160 415915c8 c22fe4c6 -> bf800000", + "423adde6 41a9e2b8 41967080 c1c2349d c228a23c 42432966 c2350efb 420e4064 c1a48b03 -> 3f526fda", + "c02d4170 418ef414 c23a7926 41835f80 c1eb4053 c1c0c743 4160a0d8 42021016 c202a423 -> 3ecd2c44", + "c2146023 c1579d88 c1d91435 408c6938 4219bbde c192954b 412fa894 c2414a15 413b9688 -> 3f9e96a2", + "c22d881d 423ed3f2 42169a56 c204ba24 3f1a6680 bf91fca0 418c72a8 c209a0d8 40e04438 -> 3fd20a2e", + "c11d18d4 41de60a8 421e2738 4125ca74 4180f5d8 4239db2a 41ede1ac c0c6c670 c1760ee0 -> 409b5bd3", + "41e6da70 c10b2f70 41e29084 422c7b5c 41231520 bfd09120 422399ac c1e2077b c14b58b0 -> 3f877ff5", + "41d150d4 c14302fc c23bc4e6 c1d97ac9 bed40580 41f1bf6c 41cf4abc 41223e78 c208b9da -> be141409", + "41addf78 41058c24 bfc6de00 41d94424 c16e41dc c040e9a0 421f6482 c201d40a 4219123c -> 4057ebed", + "4227e0b4 3ff890a0 c2033d0c 42037868 41750f00 c1f4e89e c1093d00 c17a6784 40d404a0 -> 40dd4ac7", + "c23f11dc 40feb378 c0861770 41f6c038 c23e8576 41c5ea74 417b31d8 c21f3138 c21ce559 -> 3e297dc2", + "420f9b36 c1eb9468 c1f33d90 414e3234 c1ebeba2 422b6b14 40340b20 41988f08 41002f50 -> 3ec4c3dc", + "c2132c1f 41085bd8 41badb6c c095b6f8 c1ce3835 c1eb0764 c15ffa24 c110769c 40eff6e0 -> bf2575fc", + "c19e6777 c1334428 c1070304 c19e6777 c1334428 c1070304 c211a7fe c210e6b3 c215da09 -> bf800000", + "41a1277c c0aac460 41c64f10 41fa49e4 41ed2b74 c22ceeb1 c23e88fc 41ab55cc c18d3968 -> 3f6ce0f1", + "421ce1e6 c23752eb 4145b8ec 41849600 41b2d27c 41d2b498 c0d29a68 c0c94680 420a68b8 -> 3d278567", + "c216acf6 c188279c 40d3e1c0 c13430f4 c1ca2bc7 402cfec0 41f49cc8 c0393be0 41e7ed18 -> 406011ef", + "c207add2 c20e76f6 bf633000 c207add2 c20e76f6 bf633000 c1da5155 c22766c2 42311ffc -> bf800000", + "423e9184 c190a221 41e70278 c19719f7 41bf3c70 42278098 c194cb33 c191573c 41e4e840 -> bb75d61b", + "420c2630 415a0518 41838b70 41218958 419f01a4 c1a69ed7 c2472d13 c14d61d0 42182b3c -> 40388bd9", + "422c294c c1e2f2e8 40d1d6a8 c1be7a27 40a85608 4229b45a c206eee2 41c6b1b8 40a1cea8 -> 3ee27006", + "408c5010 be7ea900 4106c708 41e59190 c21a023c 416d57d0 c1ffe75b 41f9c00c 411137e0 -> 400428e2", + "416bee80 3eb1eb00 c22c60a0 418d537c c20432e2 41f54d10 c210ee66 40bf7ec0 c0afbe40 -> 3ed0731e", + "c1f07aa9 c228eeb5 420e2fca c2430951 41d015f4 41cae838 3ff76da0 c1199a18 41ced084 -> 3e2876d8", + "41fbd3bc 41ccdef4 40d20c50 c1ce2bc7 c16b6ca0 c233307c 42197c78 42121c2c bfb36da0 -> 3e24dd1c", + "c233d522 c21b5bbe c1f81a32 c1d5a0c4 c0e9d448 c20d18d4 c21e3b29 41147044 c2230a31 -> 3f52c753", + "41c4c870 41e54580 4124851c c16e235c c0587480 41634630 c13af100 41d6a524 c23d4231 -> 3fbe5c23", + "c15dd95c c2146579 41dce5b0 c15dd95c c2146579 41dce5b0 41dcc834 421c8c24 422f224c -> bf800000", + "c19ef65b c1e0e83c c18cf634 c19ef65b c1e0e83c c18cf634 42292a12 c1b61526 c22a74bc -> bf800000", + "c1288a98 c224e196 421b1e64 c1288a98 c224e196 421b1e64 423b3e64 4108c4dc 41348f30 -> bf800000", + "416ebd10 422a9f5e c196b8ab 416ebd10 422a9f5e c196b8ab c23cb8e3 c20ab1cc c1be1e37 -> bf800000", + "c1057270 41dce2c8 41a8a694 c219d61c 42075e5e c2162515 42289056 c1839d2e c21184dc -> 3fcabc19", + "c2460a88 c17d7218 bf8b9aa0 421a38f4 c1b8d1aa 423df836 42013a28 3fb5aa80 40396020 -> bd5c12e7", + "4223734a c1bd4e82 40fad2a8 c107ea90 c1fdbd49 c10997f8 41a9b4c8 c1ee09aa c0630d20 -> bf42ce83", + "c2378c46 41c639f8 41be7be0 4219e16e c0b72c18 4134c66c c0a47160 41f6005c c0d34780 -> be941687", + "4233b05a c02b2fc0 41c9da00 c22c1f41 414a6ba8 c22171f3 41d582e8 41d2ec9c 417c20c8 -> be86fcae", + "c182a916 c1f86c3a 3fb33900 c16a099c c20ab55b c1f1d1e1 c20ea80a c1c4f32d 422d0888 -> 40378cd0", + "c0f1dd20 c10bfdec 41af2a54 c221f896 c1c24f09 41259628 41fae388 423880ea c0b70c40 -> 40619117", + "41799640 40286610 c241c607 41799640 40286610 c241c607 40ff2d48 c0cecdd0 3f8d77e0 -> bf800000", + "4202b714 be656a00 41e6d4e4 4202b714 be656a00 41e6d4e4 416b6238 42336418 408f97c0 -> bf800000", + "c214dc47 420ca9d6 c1d4f998 c214dc47 420ca9d6 c1d4f998 c18e9862 41b92d94 c1cbf925 -> bf800000", + "c04265c0 c1f4292a 4215f7a4 c04265c0 c1f4292a 4215f7a4 406afd40 41cb6fb4 42188ac4 -> bf800000", + "417a6f50 41fa1088 c23ecaa1 41f48110 c18f5054 c2475d5f 41f84a24 c2027016 c0d3e3d8 -> 3fa1800b", + "c2362d78 42275754 41637b98 4168f580 c05e4090 420a753a 41ddd798 c0663920 c2025dce -> 3f6cef7f", + "41c27d04 c1cd44d9 c23eaab8 bf508300 c1d82bbf c1f1c9eb c1fae828 c186ca12 c20fbdac -> 3ff1f598", + "c22bbc70 c236ca2b 4190dcdc c203e4c1 419424a4 41d46a28 41f2ee08 42089806 414c3104 -> 3fc7bd9e", + "408a82c0 c19202b4 418e33d8 c22c4ccb c11a8e0c c224481c 4215a372 42019c44 41b79ee4 -> 3f90dba6", + "c23c7d95 c1d63230 c22aec9a c210b3bd c10b06f8 41e765f8 40555910 41e8bcac 40f2b340 -> 3f47ec5e", + "c216c334 41fc2d68 c0075e30 c216c334 41fc2d68 c0075e30 c15b002c c247634c c1d22e37 -> bf800000", + "c2430215 c1ef7688 42382b0e c23701ca 422e53c6 4206902c 4151476c c0ee0118 40d21d38 -> 3f62d05b", + "c1dd54cf c0fe9b48 c2249e88 c18d10d0 c15c4160 41232e0c c21b4017 42075ca8 423c226e -> 3ffddf3c", + "c21fa738 bf5ad240 41cdb9fc c1d640fd c242e752 c1bb7cc7 3ee7ba80 41b67348 42077488 -> 3f6a7ff9", + "41673158 c0ca0230 c22ce97e c2294607 418abd6c 42117136 c23c1771 42428436 c1a2d9bf -> 3e070533", + "c1d2f98e 4233c3cc 41aa18cc 40d2eb20 c21ad706 41a1f9bc c0cede98 41ef8a68 c096c798 -> be31e75a", + "4216be9a 42288dae 401e34c0 4216be9a 42288dae 401e34c0 c2116fe3 40069340 c0b4c208 -> bf800000", + "c22e3447 c04f89d0 c23c1a79 c1867e90 42211838 410b2d4c 42287750 41e52bbc c16ba7a8 -> 3f6f6580", + "4228ede0 c22e87be 41706388 40e717a0 c215c44c 40864c38 41bb3e6c c20b6b05 41df10a4 -> 3d03e5f5", + "4223e262 c187fc1c c2184979 42041d70 41a41484 c1b3dad6 4238b5f0 41b27d54 4224dc6c -> 4027cd8b", + "c23963c3 c23c1c85 40b28630 41ef4af8 40c70960 42369eae 414a03d8 4221c282 c235546c -> 3f641eeb", + "c215beee 422a834c 41df8f0c 41e01dfc c14d5058 c20c53af 4235a89c c19c48b6 41eca3f0 -> 3e9a3e94", + "424119c6 c1a249e1 4241fb22 405855d0 41bb9390 c172bc90 41af9370 4207f4ba 414ad9d4 -> be871b5a", + "414c1688 41485594 c1f18eb3 c1930c4e 421d0a64 3f49df40 c0fef0a8 419fb1e8 c243fe38 -> 3ebc9a71", + "c20462fa 42264892 4203dcb4 c20462fa 42264892 4203dcb4 41751d00 42415f16 40a1d358 -> bf800000", + "c1617174 4040cd20 c08473d8 c18f2c0c 417b6928 422aecb0 422bc2a8 41bf825c c23617a7 -> 40296022", + "41fadfc8 419ce334 c22e244a c1d25613 41e51878 c1b1e7e6 c1016838 3d2eb400 41b69548 -> 3f7bd7ae", + "42220e16 c0b337a0 421b049a 41b714cc c1c460b3 c1a44c46 414ad3cc c22d2ecc c0501a40 -> 3df48cd5", + "421811ba c224665e 40a13240 4243ad3a c1f88635 c13df328 c22ba77d c19ac8af 423b3b1a -> 410033cd", + "c1b76813 4231f6c8 40f5c560 419b6f34 41b360a8 4157f4fc 41ece2f0 422cc80e c21443aa -> 3fb3ee46", + "40a68530 419486e8 c20ae46e 4168b160 42260a98 416420e0 4117b460 4202d38c c22d65ac -> 3e57ba70", + "c15bfe48 c19f9087 4210f174 c2062962 41b3ac84 c20db4af 42184c5a c1dc39d1 c234e7ef -> 3f6a648e", + "c117dbec c1ea98ec c21af5b6 c0880a90 4238174c 4212e060 c2381d72 c204332c c24625ee -> 3ecdddc1", + "413f499c be179b00 419bd9cc 42262db6 c1f46375 422e7e12 c1a3dc54 40763050 c22a5d5e -> 402bf646", + "4095a570 41e52c38 c1ccf611 4128eab4 423c143a c226faab c19c144c 419296dc 423be158 -> 40be3805", + "40fb2818 41cb61c8 40e47300 41b366a4 c1778b90 40e9c960 4140abf4 41ee2b88 41942a14 -> 3e86d2bf", + "c234d5c9 412496ac c0eefde0 c0a9c0a0 42119808 41292b60 4229dc96 c165ab90 423c0858 -> 4021928b", + "41e6b060 420c397a c17c5aa8 3dc6c800 413dcba4 42392e92 421508f4 422ab5e8 bfa2b160 -> bd654736", + "421711f8 40c75430 c165a380 c0ec5780 42122182 422ada04 41f879cc c1e53ce7 40e084d0 -> 3eb0381d", + "41425468 c19359d8 be81f680 c23d8795 42318f02 c15e28a0 c0fba408 41ea72d0 41c14548 -> be294466", + "c158da74 c208d742 423360be c1feedaf 41b6570c c10ce1c4 c0fd90a8 c13acd98 c21dbf98 -> 3ef78339", + "c13c45d8 41a0606c 419aea2c 41f60628 bfb809e0 c1cae2eb c1db966e c125ee5c 410299a4 -> 3ea6cf65", + "422ebe04 41ec1be0 41a8f614 c1723308 c02fae40 c16b0a5c bf8c94a0 c21637f5 40b6a308 -> 3ecd400b", + "c1c205e0 40851898 c2283073 c216deee 41afd274 41362720 41655030 c2409dad 419e9310 -> 3ff2d6eb", + "c0953060 3f2306c0 c0e87d90 c0953060 3f2306c0 c0e87d90 c1f9bbe1 422864e4 414377f8 -> bf800000", + "c1fa5e7a c235b518 4081c5d0 c211bef0 c23df8ea c1e6da03 41f3c944 40dddb98 c0aa9260 -> 4080e6a1", + "c20723c4 c158c0a4 41a70818 42292c34 c1a2f441 42027838 420b4358 42084b76 414182a4 -> 3f15dfcf", + "3f587500 c1f9eb85 c224e626 4124e9f8 c1ea5b13 419e75c0 c214b38a c0de70b8 c1538978 -> 3f14075e", + "4125679c 411d89c8 c0e78d30 c205935a c0b57c68 41063d44 420fd3e8 c2174400 3fd37fc0 -> 3fc45730", + "42133c8e c13f457c 40ab2cf0 c09a93a0 c1b0f795 c1984373 c18d492c 4042dc00 c1e7f389 -> 3f536160", + "4121e054 c1c04467 c174a59c c21a83d7 4247c686 4237310e 418705a4 c2223a06 422b6e98 -> 3e850355", + "c18a6796 c226b977 c149351c 420953ce 40cbce48 422ec17c 420f5cee c1e8fd0e c00243f0 -> be71bd77", + "41a9ed1c 423aa450 41b50eb0 41ca4838 c214ccce 41569278 41fbbcac c0ffbd18 c18c936e -> bdac480a", + "421ef430 c1488228 411c7adc 41d54b18 c17a0f98 c1c6e84b c214f5e2 41bd55ec c20559e0 -> 4061464d", + "bfbc1340 42260c80 41d41bdc c1f8606f 41e3ec08 c2458418 c16ce0c4 c0e0c248 421b33c4 -> 3f169fe0", + "c17cf51c c09bf538 c21a260f c17cf51c c09bf538 c21a260f be705300 41574f10 40556740 -> bf800000", + "c23ed8e0 409700f8 424248f6 c20ead47 c1c90b18 41d81f60 c23b8598 4234ecc0 bfbb05c0 -> 40211a16", + "c20a78f4 c0d03de8 bd213000 41f76ebc c2174e09 c23724a7 4245bc5a 41edd41c c1eed33d -> 3f3512ce", + "40539f00 c2122050 423b2e18 40539f00 c2122050 423b2e18 c1ae4660 c138258c 404d49a0 -> bf800000", + "4240f392 c0ac6948 c1bff4f6 41b23800 c2132e37 41f84b4c c1d9368d 4100a7fc 41c8c400 -> 3f8dd440" + ] + }, + { + "glsl": "vec3 cultmath_lattice_site(vec2, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "4516a000 c49e2000 4345fe3e 00000000 -> 4516a28e c49e0e0e 3f70a10c", + "c5037000 c4c88000 4326cf8c 3ee87eb0 -> c5036d39 c4c8761a 3f050f3b", + "43820000 c4aa8000 00000000 00000000 -> 43823d7a c4aa6000 3f1c709a", + "44c84000 c4060000 00000000 3ef36bc0 -> 44c84606 c405ffd9 3f56bbdf", + "4535f000 c5507000 42ad4bb4 3f02ac68 -> 4535f84d c55064d3 3f5ed3da", + "44c04000 455b3000 c29db30c c01fce33 -> 44c05ddd 455b303e 3f564a69", + "c5079000 c4814000 4273beb8 00000000 -> c5078e60 c4813926 3f2c059c", + "c512d000 c4810000 4286bfc8 bf4f2938 -> c512c061 c480e00f 3f4d7138", + "c3b50000 45643000 c3195c8b bd688a80 -> c3b48b8d 4564304b 3f0338a7", + "c56ed000 44c6e000 c27f8adc 00000000 -> c56ec069 44c6e94d 3f2146df", + "45418000 44da0000 4333ec32 3eec80c0 -> 45418024 44da034f 3f3b13a4", + "43b38000 c48b0000 4236a448 bd487d80 -> 43b3f77e c48ae327 3f2f60d0", + "c4c46000 45655000 c219682c bfd1f5ea -> c4c4499c 45655ea3 3f5d3646", + "44814000 45755000 42173cf8 bf96cc78 -> 448155f5 45755d80 3f706cc6", + "45021000 c4a20000 3ff02700 bf0c5478 -> 45021895 c4a1f49e 3f1678c8", + "444fc000 453d9000 c2d9d52e 3e0bae00 -> 444fd4e8 453da000 3f724e70", + "c557b000 c51f8000 42eb3708 bf93fbea -> c557a18e c51f7eea 3f6b9a18", + "452e0000 44fae000 c162dda0 00000000 -> 452e01e7 44fae6b2 3f3e55f7", + "c52b2000 c4902000 00000000 be29f8a0 -> c52b18eb c49009b5 3f693a0c", + "c51fa000 c4968000 00000000 c03ff8fc -> c51f9fdb c4966074 3f276407", + "c4dc2000 c51b4000 c31c98ae 00000000 -> c4dc0010 c51b3aca 3f5c8c77", + "454ea000 c573b000 00000000 3fbeaf6c -> 454ea59c c573aff1 3f00d8e4", + "c5540000 c3490000 c283b24e bfd167dc -> c553f38b c348dedd 3f75543b", + "4527a000 448a2000 42c52d40 c01d8305 -> 4527aca2 448a26f9 3f5fc117", + "c4cc6000 c51a1000 c30c7f28 402f0130 -> c4cc5a05 c51a0e7d 3f4549ec", + "c5384000 44c64000 c3111069 3e0b3dd0 -> c5383508 44c6405a 3f0620e7", + "45106000 4575b000 00000000 bf903333 -> 45106fb0 4575bed5 3f4d7f0c", + "c4540000 4527a000 430cd3a0 c0251d1e -> c453d052 4527a0b4 3f712106", + "44b6c000 c5628000 c32e3909 bf6d37b8 -> 44b6dbe7 c5627aaa 3f470c97", + "44d34000 c2d20000 c33acc51 401742b8 -> 44d36000 c2d0e0bb 3f09a977", + "44b12000 4514f000 41a5e158 00000000 -> 44b12085 4514f086 3f130f68", + "453d5000 44a36000 432f78fa 3fdbd4b0 -> 453d5f3a 44a3600f 3f14b309", + "43ba0000 c44e4000 00000000 00000000 -> 43ba1bf3 c44e251a 3f433df9", + "c4ae2000 c5115000 c2daf32e 3ef3f1e0 -> c4ae1e64 c5114000 3f1a58ef", + "c53d1000 447f8000 00000000 4016422e -> c53d0c2a 447fbdac 3f13ddf9", + "45414000 c4934000 4270bc80 bd7e2880 -> 45414cd2 c4932139 3f7fa642", + "44454000 c5494000 431b0cee 400367e6 -> 44455187 c5493c16 3f49516a", + "450b3000 45350000 c25cd74c 00000000 -> 450b3f17 45350cce 3f4d916d", + "c44a0000 c4ef4000 4285f7bc 00000000 -> c449f186 c4ef2d05 3f63a4ce", + "c5182000 c4658000 4257dd40 402db7fa -> c5181bd3 c4654c46 3f010c4e", + "c4b9a000 43dd0000 42e7d3a4 c0006246 -> c4b993de 43dd0b04 3f456178", + "45760000 c4bd6000 c2a96c4a bf9c3a0e -> 45760221 c4bd5e35 3f4c9684", + "455ff000 c4c8a000 c2be4e1a bf4be8b8 -> 455fffb8 c4c89f04 3f731d86", + "c537b000 c487e000 00000000 403c65be -> c537a28b c487c0ab 3f2fd3b2", + "c507b000 452a7000 c2dceddc c003ba9e -> c507a71f 452a7029 3f460e8e", + "c4cac000 c47e0000 00000000 3f60a72c -> c4cabfcf c47dc004 3f58c19e", + "450d8000 4546c000 42518368 3f2d2104 -> 450d8cd6 4546cfd9 3f77afbe", + "45390000 453cf000 43093ed6 4032420c -> 4539000d 453cf9fd 3f7619dc", + "c4f38000 c4840000 432d7aaa 401d82ae -> c4f36c0f c483fedb 3f734ca2", + "41880000 c3e60000 c3212ca2 402982a8 -> 41892de9 c3e5fe3d 3f0088fa", + "45606000 438d8000 c2c5731e 00000000 -> 45606fb0 438dad7b 3f00561c", + "c47b8000 454f9000 4235c81c 3dc8f740 -> c47b73b8 454f9850 3f49392a", + "44f6c000 43b20000 c1567f80 bd10b180 -> 44f6daa9 43b24cc4 3f1ef926", + "c5247000 43580000 00000000 4010a91c -> c5246bf8 43589d0d 3f5526fe", + "c52f5000 4531e000 c2dd64c8 be644570 -> c52f4038 4531e036 3f137c2c", + "42800000 c501d000 4294ccf8 3fd407b8 -> 4281394c c501c099 3f62ba02", + "44b60000 c486c000 423b06d0 bf8d4844 -> 44b602db c486ad4b 3f0da434", + "4555f000 c537f000 4335ee6e 3fc4f888 -> 4555f9f0 c537e01f 3f092784", + "c45e0000 c5132000 4340db6c 3fb247b0 -> c45de425 c5131ff8 3f4079b4", + "440bc000 c425c000 c32b25f6 c01ef6eb -> 440bd54f c4259a5e 3f225f0c", + "c5713000 45573000 c1987f28 00000000 -> c5712d8a 4557396e 3f31cd03", + "c47dc000 43ea8000 c209aff8 3f0da2f8 -> c47d8ed2 43eaf5fb 3f4ddd9a", + "c5477000 452e9000 c1a9fd60 bfd75c5d -> c5476068 452e9fbf 3f111f00", + "c4a42000 43500000 c3465ad3 400051b4 -> c4a4012d 435008f7 3f455f0c", + "445ec000 c5707000 c2a65667 00000000 -> 445ed54b c57060e7 3f6b2eec", + "c5400000 454fd000 422ff274 3f0256b4 -> c53ffec4 454fd002 3f6c0833", + "44464000 4512e000 c11c4dc0 00000000 -> 4446400b 4512e74c 3f7be588", + "456eb000 c44fc000 00000000 3f393210 -> 456eb513 c44fbd7a 3f247f74", + "44630000 c49da000 00000000 00000000 -> 44632f12 c49d9fc9 3f43de8b", + "c4d6c000 c48d2000 c3110d0d bfecf93c -> c4d6a078 c48d003d 3f530442", + "c5511000 439a0000 00000000 becd37f0 -> c5510438 439a249a 3f43e7ad", + "443c4000 c5518000 42ab772c be529760 -> 443c5459 c5517925 3f7c9f1a", + "45711000 c53d1000 c2b19c54 be932470 -> 45711ee6 c53d0dc5 3f1dd7fe", + "44f40000 c4b04000 42eec970 c00b9278 -> 44f415cc c4b02b37 3f3b746b", + "c50f4000 4578e000 c22b40b4 3fad404c -> c50f3bd5 4578edd2 3f232010", + "45008000 44da2000 00000000 00000000 -> 45008740 44da360d 3f48a34e", + "450fe000 41b80000 00000000 3ff098ac -> 450fe56f 41be7a28 3f6326c9", + "c564d000 c4248000 430b4f0c 4004391a -> c564cfa5 c4246077 3f0c305e", + "c52ca000 44834000 43137c1e 3f4b0d84 -> c52c904d 44835d66 3f1548a7", + "454b6000 c3ba0000 4346efb2 c019ee96 -> 454b6e10 c3b9e0c2 3f1e6b9a", + "c4440000 453f5000 42cd3a10 400a4d06 -> c443ffe1 453f5ff8 3f6afd40", + "45212000 45649000 c29fc325 bf7ea380 -> 452124c8 45649f40 3f59c676", + "4502a000 c50d6000 425e1ef8 401be5a2 -> 4502a4ee c50d5fc1 3f542ed4", + "44984000 45611000 c2a63d71 00000000 -> 44984f0d 45611622 3f73b29f", + "c4858000 c3af8000 c1e74308 00000000 -> c48579ee c3af55df 3f425274", + "452f2000 c4eb8000 c32d5a65 bf13c1f8 -> 452f2c33 c4eb74c6 3f18acae", + "449e8000 451d6000 c2ab528d c0321702 -> 449e8151 451d6752 3f309a6a", + "c56d0000 c4964000 00000000 3fa39ef0 -> c56cff30 c4963da2 3f3f81d1", + "45412000 c5446000 428d5588 3fc17e4c -> 4541245d c54450f3 3f0896e0", + "454bc000 c49b0000 c1f54480 00000000 -> 454bc0a0 c49af622 3f33a73a", + "4521f000 44228000 428d96d8 3fafc708 -> 4521fb2e 44228197 3f3e5d29", + "c5449000 42f60000 430caaec bf5acfb0 -> c5448a4e 42f60310 3f47c393", + "43eb0000 c533b000 c206c198 3f324510 -> 43eb30cc c533a65f 3f48772c", + "45541000 c4ae0000 c2eca3e9 3ed6c250 -> 455418ea c4adfffe 3f0908d4", + "c4264000 452ff000 42039b48 beaaf830 -> c426197f 452ffd99 3f13a4e6", + "44dd8000 45620000 419bd4b8 bfa5c5d6 -> 44dd83c3 45620f4a 3f0eef84", + "4572b000 439e8000 c2a24c7e 3e963610 -> 4572b30b 439efffc 3f4fa950", + "454b1000 4534b000 42c7daec 00000000 -> 454b1f53 4534b7d4 3f7d91e1", + "438f8000 c22c0000 c2e17394 3de3c840 -> 438ff9b2 c228004d 3f70a0b9", + "c5496000 453ef000 432b22e8 bfb83f2c -> c5495cdf 453effa1 3f1c38c4", + "44210000 c4bbe000 c346e648 c00e09ed -> 44213fb5 c4bbda43 3f6b6e8e", + "4573a000 c4760000 00000000 00000000 -> 4573af0f c475c337 3f7156aa", + "c2ae0000 c40b8000 00000000 00000000 -> c2ac3700 c40b6e23 3f628da4", + "447e0000 c5506000 c2a18ed8 3f3cfd68 -> 447e3e1a c5505f72 3f60d346", + "44a70000 45276000 c324f3e1 bfd24f18 -> 44a70883 452767a3 3f07bcce", + "45764000 c4050000 42855fdc bf5cb590 -> 45764003 c404f7b7 3f6cff51", + "c4f50000 c4dc8000 00000000 3fa77534 -> c4f4e7cb c4dc6136 3f6a82af", + "43b88000 c4440000 4337d146 c03d5484 -> 43b8ae60 c443e95c 3f3bd79a", + "c463c000 c5775000 c32c9e6a 4016519a -> c46389f5 c577462c 3f0ef61c", + "c5730000 c5149000 c311b2c6 00000000 -> c572f888 c51489d4 3f344d30", + "443a0000 44f5a000 c1c93e80 bfaa937f -> 443a3d86 44f5b3ba 3f7aa052", + "c5354000 43d70000 c27a9b38 c00cf66a -> c5353b0e 43d77b7b 3f6852a4", + "c5227000 45391000 42635f88 c00cfc99 -> c52266aa 453912fa 3f501530", + "4545f000 c55ba000 c2a48576 bd063c00 -> 4545fab2 c55b9d96 3f2e7034", + "c550f000 c4e58000 00000000 3e814740 -> c550eb6f c4e566f4 3f1d7ed7", + "45388000 c3918000 00000000 c0074f24 -> 453886d9 c39155b8 3f1cb110", + "44ba8000 c4de8000 c2af40f4 c0104f11 -> 44ba824e c4de6786 3f6bdb17", + "443b4000 c43c8000 4282dd88 400f0ae4 -> 443b6e18 c43c7fce 3f5b73dc", + "44e6a000 c516e000 c2c885c1 c025110a -> 44e6bfc1 c516de51 3f666d73", + "c414c000 c5549000 c2a10f69 4027c27e -> c4148078 c5548f2d 3f6ef1fa", + "c4912000 43de8000 00000000 c03b8174 -> c4911deb 43def7e0 3f67bee6", + "4479c000 453dd000 4324f128 00000000 -> 4479cf21 453dd9de 3f53a750", + "c51e3000 44d36000 00000000 00000000 -> c51e230b 44d36f89 3f40d3ba", + "c42e4000 4507e000 c2c1ceef c000e619 -> c42e1574 4507ee28 3f6677a7", + "45417000 c5113000 4337c7c6 bf9f2dca -> 45417131 c5112000 3f6ed406", + "c50bf000 c4550000 c30dc0ec bf2c47dc -> c50bed2b c454fdfb 3f33fe2e", + "c48c4000 44694000 c3064cd2 00000000 -> c48c2d3d 44697274 3f5c027e", + "44e80000 c4540000 42e3276c 4030b2bc -> 44e80247 c453da5b 3f011354", + "44cb0000 c572c000 00000000 00000000 -> 44cb0327 c572b01b 3f007bd7", + "44010000 449d2000 422c916c 401319da -> 4401004e 449d2794 3f2760a2", + "44fd6000 c5611000 00000000 00000000 -> 44fd68c4 c5610fb3 3f5e0eeb", + "c529b000 c4ba8000 c21860ac c01786df -> c529a5eb c4ba6321 3f5b2c20", + "45055000 c4b02000 c26d89ec c0033b58 -> 45055145 c4b003d7 3f75cbe4", + "c4fb6000 4505e000 43117980 00000000 -> c4fb5fa3 4505ef82 3f15ef4c", + "c46f4000 c575c000 4306c934 3e431580 -> c46f0f18 c575be73 3f01a312", + "c5381000 449b8000 433be9ec 3dd7a1c0 -> c5380266 449b875a 3f4db8ef", + "42180000 4454c000 42e0a5b0 00000000 -> 421a0b60 4454c19d 3f748012", + "452ba000 c4234000 430b9ee6 3fd1b1d0 -> 452ba1e1 c42329c0 3f1c1783", + "c5195000 c4720000 4283d944 bf0fd9a0 -> c5194508 c471ded5 3f759668", + "c4374000 45411000 c28e02e8 bf42ffb0 -> c43705a5 4541172e 3f24907f", + "c5655000 4545d000 c2e35010 3f05ae78 -> c5654cce 4545d871 3f0b0a44", + "44f92000 44f9a000 00000000 3feb4604 -> 44f92e6d 44f9b89e 3f1ec66c", + "c4d10000 44f50000 c24417f4 00000000 -> c4d0ee33 44f50fd7 3f3a3acd", + "45543000 c4b76000 c295d081 00000000 -> 455434fd c4b74342 3f44ae16", + "c5045000 c55df000 42b4ebe0 beaf1de0 -> c50443e0 c55deb30 3f1bc5ec", + "c4fae000 c4ac2000 00000000 bfea312e -> c4fac006 c4ac00ba 3f033aa2", + "450db000 c5056000 431a0e26 3f43b3e8 -> 450db05b c5055e5c 3f307ca5", + "44888000 c54e0000 00000000 3f5315d8 -> 44888b06 c54dff5b 3f0135aa", + "45683000 44118000 4327e04c c034e66a -> 45683019 4411800c 3f14ff45", + "c4bfc000 4566d000 c3127243 bfa0d991 -> c4bfb438 4566dfd1 3f261d38", + "4518f000 4529c000 c083bf20 c008b0a6 -> 4518f252 4529c04d 3f7b8998", + "bf800000 c41cc000 00000000 3f2aee68 -> be91ef5c c41c9485 3f40a5db", + "42700000 42bc0000 c0450880 00000000 -> 4271f42a 42bce3e5 3f536bd4", + "c4cb0000 44b40000 00000000 3e524b20 -> c4caea9b 44b400b1 3f2cdb31", + "44440000 c54c3000 42eece7c 3f7473e8 -> 44442331 c54c2cf0 3f5ff7b6", + "c50be000 c5704000 00000000 00000000 -> c50bd03a c5703bae 3f46be6e", + "c55b7000 c47a4000 42af8bec 00000000 -> c55b6f06 c47a05c1 3f0b166e", + "c4fb0000 c5353000 43319b44 c00f668f -> c4fafa6b c5352983 3f0922ba", + "442ac000 c4474000 c1ffe680 bf134720 -> 442ada0d c4470001 3f65caf5", + "43920000 c520f000 431672bc 00000000 -> 4392035d c520e10d 3f4ead97", + "c5183000 45002000 42c64644 3f92d744 -> c5182cc4 45002031 3f027816", + "4569d000 c2f20000 c21c9aa4 be898a90 -> 4569d01c c2f1811a 3f245cba", + "43c80000 c537b000 42803cfc 40125dfe -> 43c84d37 c537a73f 3f476f40", + "c52a6000 45653000 00000000 bf0dd300 -> c52a5da3 456538f7 3f3856d0", + "c573b000 44bf4000 c2426fc8 bfbc227b -> c573a03e 44bf40d7 3f7b0a8d", + "44b7a000 452ab000 c2d5dd5e 00000000 -> 44b7bfea 452ab4f1 3f017376", + "c5207000 c51cd000 c2a1cbb7 bea456c0 -> c5206912 c51cc3a3 3f38f540", + "44fe0000 c3a38000 42b38cfc 402af3f2 -> 44fe1c72 c3a30150 3f135124", + "c4314000 c4d4c000 42c30df8 00000000 -> c4313fdf c4d4aab5 3f74104a", + "c4cb2000 42280000 4316b896 bf6872ec -> c4cb06ab 42283faa 3f552676", + "c5187000 c55dc000 c295d289 bfcf78c4 -> c5186003 c55db81b 3f4e2bb4", + "443fc000 43f28000 c2ddf40e 402e22b4 -> 443fea05 43f2813d 3f662b9a", + "c46b4000 c52fb000 00000000 3fa37c00 -> c46b1edd c52fa84b 3f3c1f51", + "c513e000 44c56000 42929520 3fbcff28 -> c513de45 44c566ae 3f5cbee8", + "42c20000 c54c7000 408f8c80 3e888c60 -> 42c26081 c54c6011 3f639a1a", + "4561f000 c4b92000 00000000 4001b836 -> 4561fe10 c4b91a46 3f0f4396", + "c4b7c000 c5017000 c3127cb2 bfcfead6 -> c4b7a2c9 c50161f1 3f2eeb78", + "44e04000 c5283000 42b21af4 bf7f3440 -> 44e04023 c5282261 3f6e3d92", + "c3ae0000 443e0000 4303a168 3fa3dd5c -> c3adbbee 443e1196 3f33110b", + "c5205000 c4d22000 43071d36 bf1986c4 -> c5204def c4d20c2b 3f707a68", + "c50b4000 44e40000 c34726fa 00000000 -> c50b3bde 44e40d1c 3f2c9abe", + "43270000 454bd000 c264ddc4 3fff4a40 -> 432704b4 454bdbce 3f7ad96e", + "454be000 45696000 43177bd8 3ed240f8 -> 454be0cb 4569679b 3f245c04", + "431b0000 c5227000 00000000 3fc59a78 -> 431bdcef c5226572 3f087a59", + "c5002000 45501000 42ac4c68 00000000 -> c500140f 455014c9 3f4a8c48", + "444b0000 456bd000 c3030cf6 4025653c -> 444b059f 456bdf4e 3f33e254", + "c5479000 454e1000 40881f20 c0075bba -> c54781eb 454e1033 3f0295d0", + "44a14000 451d8000 433ec1d6 3fc9ba40 -> 44a1400b 451d8ed3 3f1807bf", + "c5697000 45351000 4305dcc8 3faa203c -> c5696630 4535169a 3f46b075", + "c5311000 44a2a000 42dd999c bdc15d80 -> c53106c1 44a2b1b0 3f170a62", + "45174000 c496c000 c25dc250 bf1a3ea0 -> 45174e03 c496ab5e 3f22d35b", + "c560d000 c47f8000 433ed0fa 3f8029f0 -> c560ce1f c47f4bd4 3f1394fa", + "c4db0000 4564b000 c24cd640 bfdfe869 -> c4daffe8 4564b6c0 3f6b6c71", + "c5457000 450c3000 c30a9c4c 40079db2 -> c5456fb9 450c35f3 3f6abbba", + "455f2000 45057000 420810dc 00000000 -> 455f2001 450572b9 3f2d3ed6", + "451df000 448fa000 c1a6a018 00000000 -> 451df2ed 448fbb4c 3f720bbe", + "44d02000 c47e4000 c2a0127c c0129019 -> 44d0385c c47e3f5e 3f7adbf2", + "45553000 439e0000 c3318a53 3e8e9db8 -> 455534b0 439e1c29 3f7c94ca", + "43d60000 44fdc000 42db2f08 00000000 -> 43d67294 44fdc4bc 3f10f3bc", + "c552c000 44abc000 c30b0c9b 3fb04f84 -> c552bda3 44abdb91 3f1a84ef", + "c3d18000 c429c000 c3105118 bf6cc1ec -> c3d17d6b c429b1cb 3f2bc02d", + "43978000 c4a6c000 c2e0d6f3 bfc07db8 -> 4397ff3f c4a6bb7d 3f580309", + "c3560000 434a0000 429f9ba0 4007e6b6 -> c3551fca 434a6fa9 3f6bd89a", + "45122000 44f4a000 430ebcac bfdc282e -> 45122a31 44f4a174 3f196366", + "42500000 44d1c000 4285b240 3f69aba8 -> 4253fdc3 44d1d4ed 3f523e46", + "45040000 45667000 00000000 bf1b3d58 -> 45040eca 456670b5 3f3d4cdc", + "45406000 456ae000 c178bb80 400e691c -> 45406fb3 456ae198 3f27e16b", + "44dec000 c3b68000 c236a370 bf16a1d8 -> 44ded1ac c3b66165 3f3d21de", + "c4fb6000 45596000 429408b0 bf56e39c -> c4fb470b 4559658e 3f3a4558", + "454a2000 c5270000 c341e287 3f4bb068 -> 454a2032 c526f2a8 3f38f4ee", + "44ff8000 c54b5000 42d68fc4 be8a8f30 -> 44ff8879 c54b412a 3f3727c5", + "c512b000 c51ae000 c3156fb2 3fb06c60 -> c512a20b c51ad63f 3f4e79b8", + "c5763000 c4568000 431585ca bf15e4ac -> c57622e9 c456538a 3f2e3d1c", + "c555e000 4523b000 00000000 c03e8a85 -> c555dff9 4523b0e0 3f724efc", + "44e84000 c51d0000 432da2ae c004938c -> 44e85cbc c51cfc0a 3f62d922", + "c3360000 451a0000 42665d68 3f9ddeb0 -> c335f95f 451a0765 3f6b3d66", + "c547e000 c57a0000 41ceec90 bff670a8 -> c547d1f6 c579fdc2 3f03246c", + "c4b9e000 440fc000 00000000 3f656108 -> c4b9de8b 440ffb70 3f2cd786", + "44b14000 c3fb8000 c33bc76f bfef45d8 -> 44b14260 c3fb0b32 3f56f000", + "455d7000 c1600000 c1a74710 00000000 -> 455d7e5a c1537ef2 3f6b4a46", + "c534c000 44240000 41052ad0 c0325de0 -> c534b6d5 44240eee 3f27552b", + "c4936000 c4b5c000 c325b43f 3f8fc7cc -> c4934a96 c4b5bfa2 3f7873a3", + "c1700000 453ae000 4307198c 3f63e62c -> c16fd192 453aefe8 3f054eb2", + "44bc0000 44ebe000 c31561b2 bfa17a47 -> 44bc1a8d 44ebf832 3f5267ad", + "c1c80000 4529a000 00000000 00000000 -> c1c68378 4529aed9 3f240486", + "446f4000 45554000 00000000 bfb9fbca -> 446f4a91 45554cb2 3f04aeea", + "c574b000 4534b000 42632d18 3ee111e0 -> c574a1c7 4534bef0 3f343b12", + "c4dd6000 c50c6000 c30d94b0 c039cc04 -> c4dd4348 c50c5d63 3f6cfa76", + "44f9e000 c4ecc000 00000000 bf655430 -> 44f9ee56 c4eca106 3f150851", + "44f32000 452ef000 42a9795c c03b6228 -> 44f328a7 452ef5e2 3f7f1562", + "c5636000 4484e000 00000000 401df118 -> c5635fff 4484ecff 3f4593d8", + "c515b000 44c6a000 4330092a bed8f1a8 -> c515a5a2 44c6b241 3f18d291", + "c2c80000 c573e000 c2f36372 c02328b0 -> c2c604c5 c573db1b 3f64665c", + "c4358000 43040000 00000000 4035b0e8 -> c43577a8 43042920 3f686870", + "c4e28000 44f6e000 433af74c bfb1768e -> c4e27efd 44f6fca1 3f1fd684", + "c51e5000 c4cc6000 41932c20 40062fdc -> c51e4370 c4cc5ffc 3f4a40b4", + "c4ad0000 c5758000 42f5635c c038d3fe -> c4acf6c4 c5757f53 3f397842", + "c5457000 4461c000 c32b94f6 3fd3da60 -> c5456655 4461d013 3f5c713e", + "c531d000 4554c000 00000000 3fd31580 -> c531cd26 4554c02d 3f2a7b60", + "43840000 c5186000 00000000 00000000 -> 43847f3a c518526e 3f41ff98", + "c555f000 c48cc000 c2f78b77 bd954520 -> c555e876 c48ca3fc 3f3c10d4", + "c40c8000 c4966000 c3036da5 3f8df9b8 -> c40c606d c496564a 3f77a9b6", + "c528a000 c51cc000 41010820 c02fddd8 -> c5289b81 c51cbd88 3f2c778e", + "c1880000 456c3000 c2709050 bee25730 -> c1804908 456c3eb8 3f1a77be", + "45160000 45217000 c31a66e1 3e001330 -> 45160236 45217fd5 3f1b38cc", + "c501b000 c4956000 42fe5630 3f65f130 -> c501aacf c4955e9b 3f193a69", + "c560a000 44684000 414546d0 bfb5c683 -> c560979a 446866db 3f2caa65", + "456f8000 4547c000 c3239b00 3fb79da0 -> 456f829c 4547cfe8 3f17c063", + "456a1000 c47a4000 c065cdc0 c003600c -> 456a167c c47a001f 3f3b8012", + "44a3e000 44de8000 00000000 bf284170 -> 44a40000 44de88c4 3f1451d2", + "c53d9000 44c8a000 c32f7aa7 00000000 -> c53d80a5 44c8a06c 3f23070a", + "45576000 43828000 00000000 4025bb54 -> 455769f2 4382ff24 3f181520", + "43940000 c3760000 423db004 bf9bd3b0 -> 43944d97 c375616f 3f56082d", + "c545f000 c4818000 4343a524 400310b8 -> c545e00e c4816966 3f67bff8", + "c561f000 c5312000 c34240ae 3f6b7d28 -> c561ef83 c531107c 3f60b3e0", + "42e60000 c52d1000 c035ce40 bfd2a816 -> 42e77ec9 c52d0004 3f37e044" + ] + }, + { + "glsl": "float cultmath_lattice_weight(float, float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "3f6d830b 4151776a 40800000 41422924 -> 40058bf4", + "3f3731b2 4111d3b4 404eb7a9 421b04d1 -> 4039c43a", + "3f47a619 42bda93c 405c5bdd 4210ec46 -> 3f486063", + "3f5385b6 4211ea84 3f8f2ce3 4161d14a -> 3f53d1bc", + "3f17308b 00000000 00000000 40daf0ca -> 3f17308b", + "3f05a592 420406a7 40800000 420cb8ff -> 3fb1aaf8", + "3f77ffae 4126729d 00000000 412cce21 -> 3f77ffae", + "3f50bbd4 420b9574 00000000 42105fca -> 3f50bbd4", + "3f147e0e 7149f2ca 3cfde4d3 410399e1 -> 3f147e0e", + "3f51cb79 42899ee3 3f38a396 420c5e59 -> 3f5507f7", + "3f1844d2 414486e2 00000000 41594261 -> 3f1844d2", + "3f4a43ae 40a73afe 00000000 400d8ac3 -> 3f4a43ae", + "3f4738b5 418b9d5f 3fdb0520 418ed724 -> 3fa52d41", + "3f6373e6 423b7795 40051022 41be11b4 -> 3f6d1c04", + "3f11f09c 00000000 3fe92eed 40049491 -> 3fcde70c", + "3f4c6494 7149f2ca 405836c9 4217dd19 -> 3f4c6494", + "3f7ac799 4118dd0c 3f961c6d 410cbf1b -> 3faa97f5", + "3f067826 428a0413 3e736113 41ef6cf8 -> 3f06a051", + "3f5dbcc6 41eeb285 40800000 41f2f5cc -> 400be4eb", + "3f2befd5 7149f2ca 406fc7ae 414dcfd1 -> 3f2befd5", + "3f5df917 4099d9b4 40440a34 409a0ad5 -> 3fec5d52", + "3f5e2849 4254325b 00000000 42123fe3 -> 3f5e2849", + "3f45d7d0 00000000 4034c322 4207d933 -> 403d2880", + "3f7c965a 40b1e9c7 3e8c350f 41290ee5 -> 3f98838f", + "3f4a2c8e 00000000 40800000 41e5bb17 -> 407cb7b2", + "3f0e9ff6 4056d16f 40207aa6 40a52c40 -> 3fbc773b", + "3f31b598 41b54785 40800000 41d364a7 -> 40019b6c", + "3f779272 00000000 00000000 415d888e -> 3f779272", + "3f747dac 00000000 3fa13f77 421b69d8 -> 400a1f3e", + "3f075c24 7149f2ca 3f3f27b0 41cdef3d -> 3f075c24", + "3f12ad0f 41ce0351 40800000 41de9c41 -> 3fc5ea74", + "3f4d9862 420aa65b 00000000 420716c1 -> 3f4d9862", + "3f1826d4 40baf7a2 401f10a5 40baf440 -> 3f919fbe", + "3f757de8 414baab5 00000000 41494335 -> 3f757de8", + "3f748c92 00000000 3ec6fd1b 418d4819 -> 3fa9cbea", + "3f0d4bb9 420db7a8 40484f6b 41e8b88d -> 3f71a18c", + "3f4ce9e2 405fedf5 400870b0 3fa03f85 -> 3f4d1737", + "3f342963 40c2bfca 3ce9f2da 40b48098 -> 3f35c49b", + "3f58c78b 7149f2ca 400c7a4e 41fc9e33 -> 3f58c78b", + "3f03c2be 7149f2ca 3fa7d20c 41e6f5a4 -> 3f03c2be", + "3f203f68 7149f2ca 40800000 40b40ec2 -> 3f203f68", + "3f677fc3 7149f2ca 00000000 40e4afcc -> 3f677fc3", + "3f467520 7149f2ca 3e28690b 41112632 -> 3f467520", + "3f4731b5 41a7e932 40367549 41b807fb -> 3fdf1a57", + "3f378263 7149f2ca 40800000 42020f48 -> 3f378263", + "3f16ce49 00000000 3fb23980 41f16dc1 -> 3fb46473", + "3f635736 42906cb2 00000000 421ea5a9 -> 3f635736", + "3f23f8f0 3e22a1f5 00000000 3da01ef0 -> 3f23f8f0", + "3f3e6cef 41a5d989 00000000 4187ac07 -> 3f3e6cef", + "3f04eb61 41fe6fbb 407ce5a8 41f2690e -> 3f99baf8", + "3f41eff6 00000000 3ebebf35 41ca3f93 -> 3f851838", + "3f3c5164 42971914 3f29ced1 41f57278 -> 3f3c9bc8", + "3f5866a0 42ae03d9 40249c4a 420dfc69 -> 3f59c4f1", + "3f2ff58c 413403d2 40655dd0 412a32e4 -> 3fbefe6b", + "3f5bbc1c 4161e001 00000000 4139d4ca -> 3f5bbc1c", + "3f6edbea 00000000 40800000 41d896e7 -> 40954972", + "3f4f37b4 00000000 40800000 41670cc4 -> 408182d0", + "3f1df2e2 00000000 40800000 421e6cc7 -> 40456f9a", + "3f79dbcc 42574ad2 00000000 42082f9f -> 3f79dbcc", + "3f725216 3f35023f 3ee9ebbc 3f3dc6b8 -> 3f8f72b4", + "3f1a459f 7149f2ca 00000000 419ac727 -> 3f1a459f", + "3f4b89ab 41e7399f 3ee13a04 41eb7fa8 -> 3f6daea3", + "3f4d757a 00000000 4053e8ec 410c7d70 -> 405d7022", + "3f534887 41e7882d 40272241 41a8d8d7 -> 3f93b95e", + "3f2f3b99 7149f2ca 407a13ad 3e59064c -> 3f2f3b99", + "3f742bcc 7149f2ca 406fcc70 4126a7f9 -> 3f742bcc", + "3f14921a 41eb954b 4013550e 41f69125 -> 3f8eec19", + "3f13539f 42d01f07 4019356d 421587f6 -> 3f137a90", + "3f24caa0 425c2cec 00000000 41ce2b83 -> 3f24caa0", + "3f3b0d9b 41660c95 3dc53971 415e855e -> 3f413d41", + "3f1d3bc8 412a9636 40800000 411bcaed -> 3fad6edf", + "3f575de0 418114e3 3f316b43 416b20e6 -> 3f82098b", + "3f2ee476 4186cfbd 3df2bcad 418fad93 -> 3f377cb4", + "3f6d3134 42ce72db 3e55ba0b 420a654f -> 3f6d32ef", + "3f27c6f5 7149f2ca 40800000 41d7265b -> 3f27c6f5", + "3f0c3ec4 4186733c 40800000 421b883a -> 40176864", + "3f30220c 00000000 00000000 41eedf5d -> 3f30220c", + "3f3f888b 424bc4d1 40800000 41c0638c -> 3f48276a", + "3f109d83 429e066d 3f3c8d74 41d77fe5 -> 3f10a283", + "3f0fdc01 7149f2ca 40800000 420ab716 -> 3f0fdc01", + "3f501e0e 4036d952 3f42ddf2 4200bc4a -> 3fb6a577", + "3f3ad083 420c7855 00000000 41426492 -> 3f3ad083", + "3f3d9aa6 42d934da 4033bfc5 421fe15e -> 3f3def6e", + "3f4997f4 40c70029 3f22833e 40c9dee1 -> 3f7a0559", + "3f700afe 7149f2ca 40800000 419f9a38 -> 3f700afe", + "3f38d38b 00000000 00000000 41e38608 -> 3f38d38b", + "3f5bb886 3fcbd455 3eee842d 41d27dfe -> 3fa0da1c", + "3f788146 4262d4b6 40800000 41c99841 -> 3f7ec958", + "3f563e4d 7149f2ca 00000000 41edbdee -> 3f563e4d", + "3f3db1cc 00000000 40800000 40a575b9 -> 406d1e3f", + "3f52a49c 425fa61f 4027f996 41cfab26 -> 3f57fc6f", + "3f4bcdcc 417147dd 40402622 41819962 -> 3fe68604", + "3f524bbc 4275b12c 3fa6de03 4205d85b -> 3f5bba4b", + "3f6c5d20 419b989e 3f9fd4d2 418dd2af -> 3fa27796", + "3f3b0ab3 40a650ed 40800000 40a927b8 -> 3febcbdc", + "3f51c566 00000000 3fac294c 41cdf7c8 -> 3ff5f52a", + "3f68a5aa 425bb0d1 3fba6110 419be8e9 -> 3f68c47e", + "3f7ff0ec 00000000 406a42b5 41e405be -> 40951891", + "3f1e0be2 00000000 40170d87 41e1eb68 -> 4004c455", + "3f65fc58 4164ef70 3ffe29c2 415f278e -> 3fc2b2b5", + "3f1d6270 4210ee84 00000000 417f2f9f -> 3f1d6270", + "3f79402e 00000000 404bf3c7 3fa61f16 -> 408271a5", + "3f7064a9 00000000 40800000 412469bf -> 40963eea", + "3f6675ba 4203f5df 40421a46 420a10b6 -> 3fff6868", + "3f35e971 7149f2ca 3fd9d2b3 417186dd -> 3f35e971", + "3f52e092 415a8919 40800000 41a0c990 -> 4039997a", + "3f08b4c4 40cfc3fb 3fabf26f 40dfc4b4 -> 3f564137", + "3f0eb571 7149f2ca 402e546d 3f944f72 -> 3f0eb571", + "3f398ea2 00000000 00000000 421a3f04 -> 3f398ea2", + "3f674a92 42176571 40800000 42113d1f -> 4007da3c", + "3f5914b7 00000000 00000000 4104aed5 -> 3f5914b7", + "3f2a793c 00000000 00000000 4186aea3 -> 3f2a793c", + "3f131952 41a8fc81 3f5d0060 41e2e35e -> 3f5c04f7", + "3f65b962 40a39e26 400ad01b 41f79b11 -> 4032a484", + "3f09e2ed 00000000 00000000 41a46707 -> 3f09e2ed", + "3f41bc54 41d1c9c8 4079cc16 41db80e7 -> 3ff88876", + "3f3877b6 00000000 3ffa0c86 4214b79f -> 400834e4", + "3f2adf98 7149f2ca 3f8a1059 40d9e9b3 -> 3f2adf98", + "3f22b812 40352a97 3fdd8c08 3fe5d401 -> 3f3a2cff", + "3f75d178 41c851c4 405a4162 41ef8403 -> 4025947b", + "3f7bdb24 40d194ef 00000000 40da9897 -> 3f7bdb24", + "3f5c70a1 00000000 00000000 403265ab -> 3f5c70a1", + "3f662fd0 7149f2ca 00000000 411385ab -> 3f662fd0", + "3f44c1dc 417909cf 401ab205 40e43b28 -> 3f48d207", + "3f6021a7 7149f2ca 40800000 41c2e787 -> 3f6021a7", + "3f550c69 41f4ab81 3fd420d8 4202cac9 -> 3fb4205d", + "3f735c23 4140acea 3d1277b6 4146a49e -> 3f76c1a7", + "3f19cd66 00000000 40800000 413203ad -> 404040c0", + "3f2b80f0 410579f7 40506c4f 410c24e7 -> 3fc67c83", + "3f241bc8 00000000 40800000 4153ffad -> 404d22ba", + "3f1f3a83 7149f2ca 3eb5e3ad 3f60c6e0 -> 3f1f3a83", + "3f653d35 4255a64c 40247178 41ac6251 -> 3f6680c2", + "3f00cd3d 4183a4bf 4036aa9e 4187e884 -> 3f885474", + "3f36d8b2 418daf29 40086af8 41ab1956 -> 3fbd95c3", + "3f0f6361 7149f2ca 00000000 41811a30 -> 3f0f6361", + "3f0eb0bc 420856d0 00000000 41be6940 -> 3f0eb0bc", + "3f6bb615 00000000 3e463691 417982be -> 3f8cab2d", + "3f5be679 4126a383 3fe6e81d 41279df6 -> 3fb7c588", + "3f199c94 41d80d39 406b442e 41cc0d9a -> 3fa8d497", + "3f7d5d1c 7149f2ca 3f8b894a 408238d9 -> 3f7d5d1c", + "3f6283b8 41c2c908 40800000 41b6a293 -> 4001414a", + "3f3a0d94 403509f5 407fce51 4039f36c -> 3fed2217", + "3f2ea0ae 00000000 40330b1e 41d88058 -> 4025ca1b", + "3f2b2a56 41440f0a 40800000 420b8d96 -> 4042179c", + "3f2a8eca 41c6e565 40067127 41279303 -> 3f2bd647", + "3f323db3 7149f2ca 3f1330d5 41016a09 -> 3f323db3", + "3f1b9ddd 42087618 00000000 4206ca18 -> 3f1b9ddd", + "3f491271 41b0d5e0 00000000 41b678d5 -> 3f491271", + "3f3025ca 41463f0b 404254e5 41b3e3f3 -> 400ebcbc", + "3f7a1b2c 40c19d70 402de243 410d2e7a -> 4028aef2", + "3f23cf27 7149f2ca 3e296a9f 41cda394 -> 3f23cf27", + "3f6d810e 40cc3789 3e5991b2 411d1271 -> 3f874984", + "3f1302d2 40955756 400b2407 401f3ecf -> 3f1c7db9", + "3f6217e5 7149f2ca 3f880504 4142117a -> 3f6217e5", + "3f620e21 00000000 3f83decf 41dfe58e -> 3fe5790b", + "3f5b4c92 428038eb 400e2fd9 4219057c -> 3f78ac8c", + "3f251c5b 41d78d14 3f32943d 420e25c6 -> 3f65ee39", + "3f6e7e42 41c6ec2b 40022c8b 411e968f -> 3f6f63cc", + "3f57f914 3ffe8050 402d1508 409e6298 -> 4032409b", + "3f701ae2 7149f2ca 403033d6 42143527 -> 3f701ae2", + "3f3d3d03 41c0c360 00000000 41c359ea -> 3f3d3d03", + "3f266922 7149f2ca 3fe40e14 41fa8a22 -> 3f266922", + "3f7cb04a 420f80e8 3e7824d0 415f1625 -> 3f7cc52e", + "3f36f7e7 00000000 00000000 3f0bf14a -> 3f36f7e7", + "3f3e1330 00000000 40800000 40d99ad0 -> 406d97fc", + "3f6f87f0 41a59150 40800000 4164fde7 -> 3fb2f48d", + "3f722328 7149f2ca 3f4cca9a 41da3474 -> 3f722328", + "3f625bda 4264a877 40800000 41cdd262 -> 3f68db74", + "3f481521 41906815 00000000 4203db9f -> 3f481521", + "3f5b48ca 41cd8cfc 401d92bb 41f80d94 -> 3ff57e37", + "3f5a7a3e 7149f2ca 3f848810 42123895 -> 3f5a7a3e", + "3f6c52a8 7149f2ca 402a4ad1 41865e5d -> 3f6c52a8", + "3f45668a 419d5407 3ea1ddfd 4140f8fc -> 3f49c56c", + "3f1de32f 3f11db52 00000000 41eeb5c7 -> 3f1de32f", + "3f6a0656 7149f2ca 40800000 41ee684d -> 3f6a0656", + "3f337734 00000000 4035c78e 421dd526 -> 402c4cfa", + "3f62449a 41ec4ae2 00000000 41645000 -> 3f62449a", + "3f1c9df7 00000000 3f3d4757 420f067d -> 3f88351e", + "3f55f406 4222cea6 4005f377 41b423a5 -> 3f6704b1", + "3f1ac95a 7149f2ca 3f6e46fb 41cca012 -> 3f1ac95a", + "3f0b5737 4189b6e4 3f2d2092 4147198d -> 3f193e36", + "3f56453e 418672ad 40800000 4180c570 -> 3ffb33aa", + "3f1eacab 7149f2ca 4024d1bb 41196435 -> 3f1eacab", + "3f63fc90 41095794 404df45d 41771d52 -> 403fac1f", + "3f28839c 41f7a83f 00000000 41fa94bc -> 3f28839c", + "3f6a0f51 00000000 40800000 4202e3b0 -> 40924993", + "3f6b4322 40e050f7 00000000 40ef000c -> 3f6b4322", + "3f415ba0 41841259 4029420b 411313d5 -> 3f55add2", + "3f3745c1 424654a8 3fadc526 4194d472 -> 3f377a23", + "3f26409f 4205cc3a 40800000 420cbb42 -> 3fd9c9b1", + "3f6f3f28 41f290f5 00000000 41f129d1 -> 3f6f3f28", + "3f230960 00000000 401575f5 3fc8bbcd -> 4007f1ec", + "3f38e9e0 416ea6ba 3e9005b6 416f362f -> 3f4c237a", + "3f30a69c 00000000 3fcb8d06 4200f91c -> 3fe4c8bc", + "3f6ce281 7149f2ca 40800000 4202f2d8 -> 3f6ce281", + "3f5ccaf4 4287a277 40703ba5 41e145f7 -> 3f5f4d2f", + "3f422077 4082e32d 4049bd5d 4072f9c2 -> 3fc0e88b", + "3f043c6b 7149f2ca 40125eda 420059dc -> 3f043c6b", + "3f3c1189 7149f2ca 00000000 4048ecb3 -> 3f3c1189", + "3f35e577 414f17b2 3e96b21c 418046af -> 3f51ccf7", + "3f1b2ec7 427166a2 3ee309ca 41af29ef -> 3f1b379e", + "3f1caf6c 00000000 00000000 40ee9633 -> 3f1caf6c", + "3f77f5d2 4269c952 40800000 420e00f5 -> 3f9cf676", + "3f76c96a 00000000 40800000 41c09e38 -> 409a3de2", + "3f5ed4c9 3d277e95 3fb1a8c4 3e527386 -> 400206e3", + "3f26d8f2 7149f2ca 40800000 4014fa90 -> 3f26d8f2", + "3f4602c2 408746ed 3f9b95f3 407aa0cc -> 3f8887d2", + "3f4eebb8 426b128f 3f9bc6c1 41c6a46a -> 3f4fd9b4", + "3f3748e3 40f247f0 00000000 40f9e51f -> 3f3748e3", + "3f7e4f42 422fd886 4041265f 41dc5185 -> 3f9d2cae", + "3f0a2f7e 00000000 3ff603ae 401a740d -> 3fc9e35f", + "3f7e58be 00000000 00000000 41b72368 -> 3f7e58be", + "3f63ea78 40a2b431 407d678e 4200ade4 -> 408a8255", + "3f4d739b 41159661 3f7e4fe7 411d574f -> 3f900e2c", + "3f3d33d4 7149f2ca 401344da 41c7c1d5 -> 3f3d33d4", + "3f34debb 7149f2ca 40800000 41017536 -> 3f34debb", + "3f65c71e 4203a0bb 40569f05 4207ea47 -> 4004da05", + "3f4c1e46 00000000 3fcaea62 41ab0774 -> 4003ecf4", + "3f381c84 7149f2ca 3faa17bf 41c79ef9 -> 3f381c84", + "3f0a3d14 00000000 3fe2eb9a 41d2766c -> 3fbfa7af", + "3f37babe 00000000 3fc36e9a 410a5949 -> 3fe81ffe", + "3f2f6c4c 7149f2ca 4019f755 41da7bdb -> 3f2f6c4c", + "3f5aee7d 4273f904 3fb6e244 420dabc4 -> 3f6b0ca4", + "3f553864 00000000 40360549 40b902a0 -> 404ce897", + "3f273ec7 7149f2ca 407b53af 41f87923 -> 3f273ec7", + "3f691280 00000000 00000000 41b8178c -> 3f691280", + "3f5129f0 40a5bb24 40800000 3feeb587 -> 3f5189bb", + "3f1c410e 40d7e67b 3ee6f631 4159cb50 -> 3f5362fb", + "3f5f1eee 3f00c1b9 40703bd9 40cfb902 -> 4083f409", + "3f553b13 4295e85e 3c8e9eca 420948c8 -> 3f554323", + "3f3331cf 41e78bd9 405a3af7 41ea6811 -> 3fccbfac", + "3f625896 00000000 00000000 40a63c80 -> 3f625896", + "3f612e44 7149f2ca 40800000 41f9dd64 -> 3f612e44", + "3f6fe7d4 7149f2ca 00000000 411ad53f -> 3f6fe7d4", + "3f6b203d 42cce4c5 40012a16 421c8649 -> 3f6ba06a", + "3f1326a8 3f8d399e 40378733 4107cbca -> 400c8375", + "3f7ef268 7149f2ca 00000000 4183183b -> 3f7ef268", + "3f61f409 4091bd89 407bd25c 40f8ff7a -> 40564826", + "3f324ac3 00000000 00000000 413010aa -> 3f324ac3", + "3f404692 4113c651 00000000 40cc836b -> 3f404692", + "3f65871d 425c6115 3f82fc7c 41ac18a9 -> 3f65dc50", + "3f2da5e4 418c5d34 40687d0e 411b6c9a -> 3f45ce4b", + "3f2e00b4 7149f2ca 00000000 41b512cf -> 3f2e00b4", + "3f4868f4 7149f2ca 40800000 4197b8f8 -> 3f4868f4", + "3f1b434d 00000000 4063fd4b 414eb3cc -> 40311720", + "3f56cf28 41d0de41 00000000 4197fe91 -> 3f56cf28", + "3f16ffe4 41af7196 00000000 41a388a3 -> 3f16ffe4", + "3f79cea6 410272c5 3f4b5a55 40f77546 -> 3f9d8ce5", + "3f344e25 3eddfb7f 00000000 3ed5b081 -> 3f344e25", + "3f57b643 42a91549 00000000 41e2f585 -> 3f57b643", + "3f34b289 7149f2ca 3f38596e 41859a3e -> 3f34b289", + "3f6454ec 4159b8bc 406cf8d2 4160ff05 -> 400bf206", + "3f4082d8 419e64cb 3ffc2685 41ff7219 -> 3fe158bb", + "3f04c657 41a3aafd 3fff5af5 4107aecc -> 3f058f88", + "3f6853fe 7149f2ca 40699a7b 41c4a949 -> 3f6853fe", + "3f7f18e4 41c37602 3ea00387 4200bc76 -> 3f95f32e" + ] + }, + { + "glsl": "float cultmath_lattice_distance(vec2, vec2, float, vec2, float)", + "tolerance": "ulp-bounded", + "cases": [ + "4218840c 41d66378 4208a0fc 41135e88 40214e09 3f54f18d 3f0e185d 40000000 -> 4291dbe9", + "c1e70e48 41875468 bfa1e3c0 414fed70 4093ed14 3f7fedee 3cc05c6d 3f800000 -> 4300f228", + "c1d88701 42415288 42273716 c1e92f44 409fe9f3 3e8f2ed4 3f75c92b 3f800000 -> 44018240", + "3fe8f420 c24192f5 418a18b4 c190b71e 406f5393 3f2bd051 bf3dc768 3f92f390 -> 4301b897", + "c1ce8a88 41445368 c0b64bd0 c245ff41 3fba260a 3f800000 00000000 40000000 -> 42d66cc2", + "c21f4ce1 421154cc c0ef7c08 c1fbe9c2 408fe6b8 bc98ca13 3f7ff49a 3fb92095 -> 43e9302c", + "420b8432 c24424bf c201c11a c244b314 3fd0b933 bf6db1c3 bebe2159 40000000 -> 43500122", + "422c4f6c 424311ae 41207898 420b77f2 402d7e53 3f7efbae 3db65bfd 3fb8d690 -> 4308ed96", + "41037f94 42382a3e c20f4df4 c24116ce 40725652 bd97387b bf7f4d1a 3fd65071 -> 441e2646", + "c241a5e0 c242c597 42392e04 414ffe88 4023300a bf62a529 3eee0f01 3fe1f6fc -> 43b0ba3f", + "422ef81c c1df9090 42443a20 412d9f04 403fa01d 3f800000 00000000 3ff5ec9e -> 42f03d17", + "3f3ba9c0 c2065cd8 411c377c 4130b954 3f880d5a bf4d8570 bf18a234 40000000 -> 429ddaeb", + "423f58a4 421bad6e c2017fe6 42049b00 3fe0e102 3f730bed 3ea0cd6d 40000000 -> 438a1045", + "421528b0 c12f9154 bff1f060 c19f606d 40394317 3c84c589 bf7ff764 3f9fda01 -> 42eb70b5", + "c0c9f1d0 c1ff8201 41930284 423d7824 4014f92e 3e2ea92e bf7c3fa3 3fe891f4 -> 43a26e90", + "c1aff82e 42362f0e c20a0a82 421c50da 409a8f72 bf77edad be7f1b90 3ff535ca -> 42ffe7e4", + "4201f232 c2382b1d 41632ae8 c1fc2016 405d0cdc 3edce7c0 3f66f244 3ff78771 -> 42abffd1", + "c1aa7760 c23f6f3a 423e117a c1351940 407805ea be86d037 3f76f75e 3f9b0f0a -> 4398afd5", + "4040b5e0 c2461f7f bfd92320 4159e2e0 4047b047 3f7f8506 bd7acf20 3fcd3a0d -> 434865d8", + "41c22940 c2226c3b 4240d7d8 c0e640f8 3fee023b 3f309945 bf3955a5 40000000 -> 42a0a558", + "4101000c c20202a0 c1c65c5f 401ad230 4010b5de 3f800000 00000000 3f82e782 -> 42db292c", + "4238f014 c1353b20 4230369e 421d4a3a 3fb64c6a bf41167c bf281629 40000000 -> 42d48aed", + "40f22198 421a67a6 c0304a50 c09d7d38 3facaeed 3f02ccdb 3f5c0fe2 40000000 -> 42e9280d", + "c14c405c 409f0e80 c1bb6a8f 419f6660 4080cd72 bf76da65 3e87a3cd 40000000 -> 42f79358", + "41b5e980 c1109a54 c212bc33 c15cf3e0 3f5b2c4b 3f800000 00000000 3fc58ca2 -> 429d3f4a", + "413fda1c bfc75060 421e896e c12ea118 403abfae 3f24b7d1 3f43f825 3fa75c45 -> 42b224aa", + "41b5255c 42477520 410417e0 c12bb888 408818b7 3f672665 bedc0d3d 3f800000 -> 43847131", + "4208a900 c172c448 c23dc7ae 40910a10 409cc383 3f36f1ce 3f3312cc 3f936fc1 -> 43d6e3c8", + "c00cde90 41cc0544 c0a1a100 42428bec 402effa2 3f800000 00000000 40000000 -> 42824bea", + "4206f7c0 c1aae2ee c09acc30 4240982e 3f0e43f2 3f800000 00000000 3ff0ca9a -> 425f6237", + "c210c121 c181eba2 c20bba65 421d5ac6 3fe4ec59 bf044c04 3f5b2a5f 3fa112cd -> 42ec9d99", + "c2370814 41ba2628 41d1be2c 4163cf88 3fc70be7 be06ab36 bf7dc6ca 3fa6078a -> 42e19c5a", + "c2024aee 4233fc4a c222a2fc c1d81281 3fd0cc88 3f800000 00000000 3f800000 -> 42ec649e", + "c218e52f c0982488 c203daf4 4203b4f6 3f0da256 bf7fff2e bba3ca8f 3fa497ad -> 41a98562", + "41923894 c1f0a5b6 41075d44 c04850c0 406f7fbf be1b63d9 bf7d090a 3f8e5164 -> 42e95b37", + "4237f1e0 c21865f2 c1f3f845 c23339bb 4045ca36 bf7be4e7 be36a97a 3f850926 -> 437687f7", + "c1704510 413044b4 c23c9bff 421ab0d6 40887ff0 3f6e5155 bebafbb0 3f800000 -> 4334d9df", + "4131fe8c c245da51 41cd8bfc c04dd670 3f233c27 bf73be82 3e9c859d 3f800000 -> 41f756c2", + "c1f572a9 4208b7d6 c021ba10 41a47440 3fc42e5e 3f7fc1dc 3d325474 3f8fb141 -> 425231b8", + "41c03618 420586cc c223a9e1 c22dab74 408e4236 bf6b07f5 becaf139 3fbb10ec -> 441a841f", + "c1d6bc39 419887c8 c1dbe4fa 420a6392 40779b87 3e01392d 3f7df412 3fb01e43 -> 42a465c8", + "401451d0 41f9d5cc 4240ecf0 c2447f6a 409938d6 bf1e200d bf4953a0 3f800000 -> 43dd908a", + "c22084a3 c00ac070 c08ae178 c217dc22 3f343036 3ea29245 3f72c091 3fb0f4c0 -> 421ae60f", + "41a83b48 c21d4cde 4223d794 409158c0 3f8a0eb5 3f800000 00000000 40000000 -> 427fb9a8", + "41519cd8 41971440 c1d5efca 421efc68 4003ffac bf7c4e36 be2d5721 3f800000 -> 42b98417", + "c217e6ec c23752e6 420b5af6 41ff2320 40226088 3f55623d 3f0d6eec 40000000 -> 4404629d", + "bf113bc0 c2138984 c1235d6c c12b1750 3fd335ce 3e6e01a0 bf78fd34 3f917862 -> 4251071e", + "c03c0440 c238a930 406ea410 40bbad60 404260fa 3ec78eeb 3f6bc11f 3f800000 -> 431f50f0", + "42032294 c18e763a 3f78fa40 c238503c 3f24b82b bf49e33d 3f1d6887 40000000 -> 41e59517", + "c247f536 c2468e24 3ff86600 c1babe75 4094dca2 3f800000 00000000 3f9c1195 -> 439f7866", + "c111b46c 4156cacc c126895c c1f50553 4081734d 3f629618 beee4857 3f800000 -> 4332486c", + "4216a35e c232136e c1a5468e 418eee64 4040406f bf358359 3f348634 3fe10064 -> 43e15e9b", + "c05d5f00 c215cb28 41dfdcf4 c21e27c1 402436b6 bf1a3cd8 bf4c51f8 3fcffb6e -> 42c594d2", + "c1c3a030 c1fdddde 41f2c518 42153a68 403dd0c8 3f3452e1 3f35b657 3f800000 -> 4382b69c", + "41d04948 421bb918 c1f26cc3 c2380143 40984b56 3f800000 00000000 3f93d323 -> 43fe97dc", + "c208899e 42344b68 c1693ef0 4081fdf8 401fc755 3f800000 00000000 40000000 -> 430d7c2d", + "c087daf8 c17669d8 c1976a4c c19c8ab3 3fa4e5d4 bf1ed5a2 3f48c47d 3fa61e06 -> 41a4fabd", + "c19013bc c21d802f 4219e6d2 c18919aa 409746b9 be02487e 3f7deb68 3f8f5b13 -> 43909404", + "418b1638 c1d6fe07 4107cbf0 3ff23600 3f842cfd 3e0f7bc0 3f7d7974 3ff1805b -> 425ac726", + "c2020ce8 c1265274 41550de4 41f96f00 4086f6e8 bf160d61 bf4f69d5 40000000 -> 44006332", + "417c8df0 41afd4ac c2090e83 420c3926 404888c0 3f800000 00000000 40000000 -> 439e2725", + "4195cd28 c23eb26a c1312064 42040338 3f0d09cc bf3bb5b2 bf2e126d 3fe9cb72 -> 425bbc84", + "c0415020 c1ae183d 412b54b8 41aa55a8 40972961 3f3331f5 3f36d348 3f800000 -> 43557766", + "c221d3f0 c23509b3 42405d24 c19975c9 402e340b 3e0f72de 3f7d79c4 3feff7d2 -> 43964ac5", + "c1aebe10 3f48a100 c232b6a1 40a32b88 3fedb01a bd682a8d 3f7f96a4 3f800000 -> 422c9e65", + "4199ebd8 c0dc7390 414b4e00 c0bbf300 402778c3 3f70f1bd 3eacfece 3f800000 -> 418a6ad5", + "41d7bb5c c165d81c 40cf7d70 c0e78790 403abb31 3f044ef2 3f5b289a 40000000 -> 42866b82", + "41a859a4 4016de10 41a4e344 c0aff828 403548a3 be44c7ae bf7b3a8b 3fb03ae3 -> 41f46024", + "41b7cbfc 413e039c c1b288f6 bf62e780 3fa0e9f7 3eb1fed9 3f700837 3fe033fa -> 429b09be", + "41ed37b4 c23aa9bb c23b0081 c1190524 4096309d 3f800000 00000000 3f9f842b -> 43efce6b", + "419b5928 c0f863c8 4083c9f0 40c78360 3f121017 3e32ec2c bf7c0fd5 3f9196c9 -> 414e1108", + "41d94ed4 41ab27c4 c20260bd c1d1e7b4 408c3f80 bf702b02 beb142b7 3fc4010e -> 43f9135f", + "c23d7cef c1b12d67 c1f98657 c1822612 3febd393 3f50fa7a bf13dd68 3fd349f1 -> 421e7d9c", + "c1791de4 c19b23c9 4112b7d0 422b434e 407cf4f4 3f7e9767 bdd68b74 3fbb5781 -> 4389b4f0", + "c2193e36 c1e7ada3 c2050a70 4124ed44 406f85d4 3f800000 00000000 3f800000 -> 43142bf3", + "42080218 c22b223e 40bc7da8 c203cbe6 3f8b2afc bed10fa1 3f69afbd 3fadc930 -> 421922e1", + "41726df0 c1c003bd 4233ba5e c165018c 3f8776a0 bec9aed6 bf6b4d4b 3f800000 -> 42049217", + "c222efce 4203f4e4 c1abfa2c 422fd558 408975f6 3f800000 00000000 40000000 -> 432bdb60", + "41ea3ad4 41e41508 3f5707c0 c1baded6 3f36da2a 3f71cb9d bea82db1 3f800000 -> 42290190", + "42303e36 c20eb086 c11ea8f4 c2114ea2 3fe8d339 beaf9880 3f70793c 3fd20e93 -> 42d5df2e", + "41f0b814 c219b90e 41afe234 c21d4c29 406d64fb 3e66e4bd 3f796846 3f800000 -> 41f1f377", + "c1ad9265 414ca6b4 bfa5bda0 c1a64d97 4079eb1a 3f7fbd66 bd389d4d 3f800000 -> 43196db9", + "c143a540 c1775d58 c20122b4 c1d6ad9c 3f5bbfe0 bf7efa6c bdb6cc50 3fb04d5d -> 41d112fb", + "41aca424 c1fd3b3c c1089f38 4196ce48 3fa99673 bf10f5e8 3f5300de 40000000 -> 431b93e4", + "c236f7ed 42046a80 c0241130 c22a15e6 3f5bb68e 3e9cddfc bf73b04e 3fec480e -> 4307e250", + "41d3a9e8 418e3f0c c022fbf0 c190f0fd 408f5ad8 3e866a80 bf77053a 3f800000 -> 434ec062", + "422626aa 42135cae c0b544d8 4210cafa 406fb8b4 bf651957 3ee4785d 3fe13313 -> 43900f90", + "41f77da0 c1d1ad5f c130b9f0 c2201c58 40874837 3dff44db bf7e00ed 3fffa9f1 -> 4344dac5", + "c22f19db c11a44c8 c19df0ae c1a1832e 403f4c53 3f305e7b bf398d98 3fbc5ee3 -> 42dd66af", + "41866588 42018b8c c2402dd9 42048e9c 407a09d4 3f800000 00000000 40000000 -> 43fd5765", + "41c625c0 c1df1259 42419630 c18ef0e8 3f46721c 3f800000 00000000 3ff12cdc -> 420d7e7d", + "42412a84 413cc52c 41ef0cd0 4183e294 408a527e 3f71fc3c 3ea7150f 3f800000 -> 42a43cbe", + "c1f9cea2 c21846c6 c08a4078 413ba0fc 3ff59ae4 bf4bae02 bf1b151d 3ffa34d5 -> 43468aef", + "411c270c 41c71010 c2059b8c c23315f5 3f546b60 3f38501e 3f31aa27 3f8d0ad9 -> 429509a1", + "c115af5c 422ab2bc c20bdf06 c2478fb3 4004fe9c 3e26fc88 3f7c92bd 3f8fc792 -> 435fec8b", + "c1cc6a44 41705518 41fed420 c1dfc45f 3ffd1f26 3f7fed05 bcc526c3 3fda0591 -> 435549ca", + "423adb98 c1ba781f c0d853c0 c2205de1 3f9f3342 3f204edb bf4797ca 3f85ed68 -> 428c49d1", + "422680c2 422c407a 408f0ac0 40efa000 409e6d39 3f5c7560 bf022183 3fc75eb0 -> 4385d05e", + "c2353830 41f38840 c1faaf3c 41d6e814 4024a91b 3f53ff6f bf0f809d 40000000 -> 428debe2", + "41ccc960 c1ad5054 c1445034 c0fe6cd0 3ff19278 bf506bcf 3f14a63d 3fc97fa0 -> 42ea18fa", + "41a6e90c 418dcd60 4198b440 c19a1bec 407b4d74 3f800000 00000000 3f800000 -> 43116875", + "c1a04f1c 415f515c c2088ff2 4187adbc 405e6813 3f800000 00000000 3fb823cb -> 428e88c7", + "41f89884 42472b8a 41e83098 c1b1dc4e 4031e086 3f5ae5b0 bf04bd89 3f800000 -> 43484335", + "c208571b 418cb83c c228cc17 c2112a82 404f1896 3f29eb0f bf3f7a5b 3fcba835 -> 43610786", + "c1afa6b0 c1d99140 41e787e8 423ef652 3fe47057 bed80118 bf681a39 40000000 -> 43a019f4", + "c21f4966 c21dcbd1 c1bfd97f 4221d7f8 3f6d4440 3f800000 00000000 3f82d208 -> 42972251", + "be7be000 c1c66254 c19b120e 421ffaac 3fb46bda bf2f612f 3f3a7d13 40000000 -> 432f5a6a", + "c2299581 c1567f08 41fde2d4 c19ecb48 40673155 3f800000 00000000 3f95cf8d -> 439d24ab", + "c13ee238 4194293c 42343bca c22d890d 4037466a 3f7781c3 be82c99a 40000000 -> 43d52b8d", + "41d2fc94 4102e34c c0ffa380 41952b5c 3f4a12ce bf66bcba 3eddc717 3fbe0389 -> 42274cf2", + "c0e445e8 c20f24e6 be899780 c228ac77 4017e54b beafcdf0 3f706f79 3f8e22a4 -> 41c1bcc8", + "bf2e70c0 41df1794 c231a2b2 41b06bfc 40161ef2 3e64b343 bf798899 3f800000 -> 42cef48c", + "4193ee74 419560d4 c19763a5 423ce970 40868ee4 3f1ad621 3f4bdde7 3fdb6953 -> 4345ea6a", + "c0fa5db0 c1ea70ae bfcda2a0 c2434dd0 3f454cb7 bf082dec bf58c645 3f8624f6 -> 4180e060", + "40da1710 41dc0520 c19e182d c1b8e1ea 3f9ee34b bf36e4fc 3f331fe4 3fc3de64 -> 429593a7", + "c17268b0 41d32a1c c16a40f8 c0cf68f0 408d4fb5 be5a3bd2 bf7a1e65 3feeebad -> 4384f971", + "c0a1ee88 c210bd30 41288cec bfedf340 3f020a16 3f714db3 3eaafb18 3fe08255 -> 41d8aab7", + "c20ea490 4151d83c bfed7e80 41aef7a0 4063a008 bf24050d 3f448ddc 40000000 -> 431a9250", + "420ee606 c10d2b18 c1065f48 400cb770 404b5813 3edc6250 3f671221 3ffda9b9 -> 4318a1a4", + "42357904 419b8780 4242a168 c1829d44 401bc432 bf6cc129 bec2c3ae 3f92d278 -> 42b136b4", + "c0b637f0 4229f3be c2254d84 41da9a94 40979af7 bf0700b3 bf59825c 3f8bc50f -> 4342e7e3", + "c092fbd0 c20cdb54 41876478 4107a440 40371a08 3f4fab7b bf15b278 3fe3b6ee -> 430f7138", + "422f59f0 c1ec1e44 c1d66859 420dc7dc 4045e6b5 3ed67732 bf687578 3f800000 -> 43945fe6", + "418b1ca4 c143fb68 41f55428 c1eedf89 40860f17 be4f6c01 bf7ab16c 3fb41876 -> 42dcb882", + "c136992c 41993670 421dffe6 c2266742 4027610a 3f800000 00000000 3f800000 -> 434f4d1d", + "41e27824 c0d40888 416a1630 c00e0860 400a3eb1 bf7ecc92 bdc62375 3f800000 -> 41f8552e", + "41b2922c c1d473e5 c12ee5a0 c1d2001c 408cd97e 3ef75a98 3f602491 3f9dcc68 -> 431ab6db", + "c1daa2af c0f5f5f8 41d49cb0 40f85b58 4056a751 3e8796b6 3f76dc32 3fc47149 -> 435be0cd", + "c215174e 42456404 c21ad1ae c04acd60 40668e51 3f2d66a7 bf3c546c 3f91c3a1 -> 434b2ea3", + "c2379f5c c144efa4 c238c386 3ed3ce00 3fb8ccf2 bf7f6d46 bd88f7bb 3fa45378 -> 419312ab", + "c2360129 4184b528 420be43c 3ff17960 402b7110 bf2131e6 3f46e09a 3f800000 -> 435b23cb", + "c1a17063 c1c298dd c1eb9eb0 41ef9ee4 4080035b 3f800000 00000000 3fa4f4a8 -> 435e54c7", + "c237cb34 c090b478 c2180f8e c1c41429 403cf60b 3f29773d bf3fe0e4 3f800000 -> 427df89f", + "42296b20 c1625158 40852cf8 bead3b00 4070198f 3f3aa840 bf2f333b 3f800000 -> 43185b84", + "420160f0 4232b67a 416c8288 413fde30 4059367a 3e695352 3f79440d 3fc4cf38 -> 433dd145", + "c1e60a16 40f09310 410bf974 bfc95320 3fd787fa bf7ffaaf 3c50ad30 3fb34a99 -> 42b3cb9f", + "4221732e 420b8104 4208b206 bac68000 40812978 bf7f4cbf bd975eed 3f95a898 -> 43109149", + "4146259c c0c40640 40d3ac00 c22615cb 408a5006 bf7067e7 3eaff754 3f9187a8 -> 431bcf07", + "c1dd2b16 c10e50b4 c1242294 4236b906 3fa346ca bf52649d bf11d854 3ff58cc8 -> 42ef549b", + "bfabeea0 c0c25230 c221cf35 c23c100c 3ffe036c 3f800000 00000000 3fea4a1e -> 4323a735", + "419cab10 c18d3b06 c207a045 c1ed1339 3fa4dc26 3f800000 00000000 3fe14fa9 -> 42f47e80", + "c22250d0 4205d39c c214ef40 41b4a114 409eb4ad 3f5e63fb 3efd9a03 40000000 -> 42715813", + "c22f2796 41d96f00 4232ba26 418d1fb8 3f84ffc7 3e31330c 3f7c234e 3ff8ba8a -> 42ba0c2a", + "c217759a c23768dd 411665d0 c21c74f0 3ff671f3 3f800000 00000000 3ffaa7ca -> 4332aca2", + "4151895c 41cdf06c c2400bee c1d33dab 3ff5680f 3f77b92e 3e812345 3fc87684 -> 43633533", + "407f81f0 c21e28ec bee38e80 c1e26f95 40814d78 bf5304dc bf10f018 3fa7a503 -> 4246b622", + "c1b61186 40b62330 c22676ed 40f35828 409b5bc2 bf6bd912 3ec71d97 3f800000 -> 42b80b74", + "423872ea c1905d4b 41b7b8dc 42422420 403521f2 3f76da40 3e87a4e1 40000000 -> 4348d08d", + "4179eca0 418e2768 42066584 422952dc 4086f7bb 3f5aa02d 3f052fe7 3f800000 -> 430061f3", + "c2359c7f 40faadf8 3f6ae340 c06ec8a0 40923bab bf76a61c 3e891e36 3fbefb94 -> 43a2baf9", + "41d68874 41e6fdc8 41c9e960 42440758 405efff0 3f800000 00000000 3f909203 -> 428cda17", + "c169e380 c1b301a6 c2186129 4163d0d0 408208aa be60f356 bf79bf1d 3f800000 -> 4330be03", + "40c26868 c21c58f5 4120b2d8 c06a5a30 400800fd bf74d7e5 3e958099 40000000 -> 429efcc2", + "c226672c 4228b7d0 c0643e40 c227b7cc 40793355 3ecd0113 bf6a9553 40000000 -> 4433b414", + "c1329d70 c190dddf 41123968 c11c2b30 405fd881 3f800000 00000000 3fa1b017 -> 42bca94f", + "c21ec9a9 c22a158f 41a6eb80 420bddfc 3fd25826 3f800000 00000000 3fe74e34 -> 435c5c38", + "c17a2b70 c20dcaa8 40b6d428 c1c0f90b 407d478a 3f3473f3 3f35957f 3f800000 -> 42bf48ec", + "41c11e6c c1c7ab81 c1711f94 c1bc0ffe 3feb2042 3f74bb33 be963c18 3ff3fa68 -> 43060788", + "c11a57a0 c2126e3a c212c484 422f59ca 4090d354 3e763cf2 3f787d00 40000000 -> 4429ff94", + "41aa06e0 c2138faa 4097f5e8 c1d48a4f 40604e08 3f54107b 3f0f676a 3fc6eb20 -> 42977bd7", + "4227bfa0 c242054f c2463d32 41400e04 40097fa5 bf0797a2 3f592466 3fdb4644 -> 43be097d", + "421454ea c20e658e 4086e318 41f4bfe4 408c55d8 3f7fa1bc 3d5b9cc1 3fa2f4f4 -> 43a9c268", + "417298f8 c1fd2aa3 c0a320d8 c233a504 3f59c92f 3f06e19b 3f5995a6 3ffeebe3 -> 4218c5ff", + "c09a61b8 42338178 41896758 c22a87d6 40934438 be7698b9 3f787750 40000000 -> 444fa07a", + "404cef00 c148538c 41e2cd30 41d61650 3f87bcb0 3f71c78e 3ea84505 3fa55f8c -> 426b36b9", + "42026d5e c2433da1 4222a380 c1b9dfcc 400f1cc4 3f800000 00000000 3fcddeec -> 4280367b", + "41670100 c0a42260 c1bcc09e 421364a2 4096ede7 3db21061 bf7f07d2 40000000 -> 43e3a2bd", + "40b5b390 4236f388 c224ae5f c1f07560 409a2207 be5b039b bf7a137b 3f800000 -> 43d697fb", + "40e4ad20 414f74b8 c221bb0c c22d2feb 3fc100f2 3f578868 3f0a22da 40000000 -> 4356dc28", + "c1d883cd c042bac0 c06f1b30 c1ee17fd 40000a36 3f800000 00000000 40000000 -> 42d7213c", + "40cdc808 c111ba80 c1fcd428 c19009c1 4019f77c 3ecdff89 3f6a5d91 3fa0d46a -> 42ce9c1f", + "41622e30 40d8d680 c22a0ebd c2357daf 40532a92 bf53b8cf bf0fe8bc 40000000 -> 43fc0050", + "4193bcbc 419cf4ec 41cceae0 41868ba8 40780bba bf17a13c bf4e434f 3f800000 -> 41ee073f", + "4233d7be 415e9a28 c05069b0 c1c58e54 3fb5242b 3f800000 00000000 40000000 -> 43130037", + "c1ffae86 42312d84 c1281498 41916ee4 4070f2d8 3e87f443 bf76cf54 40000000 -> 436e2bd1", + "c0caf828 41976d38 410429c4 4237ba2c 3f581272 3f800000 00000000 3f800000 -> 41cf49c0", + "c220039a 416e1498 bf9ad900 41f572d0 3fca13c7 bde96e8e 3f7e54e7 3fdd179a -> 428d7278", + "421aa01c c14f7278 41e37ed4 c214f82e 4014f0fb bf7fcc48 bd22b1e2 40000000 -> 4298247e", + "41905928 42125994 418f541c c1c4ac27 3f3db512 3eea3910 3f63a45e 3f800000 -> 423552da", + "c1d6b650 c22fa654 40823cf8 c208cee8 3fbf4444 bf372b6d 3f32d7db 3fdc5a12 -> 42685b04", + "c21ea349 c20e690d 4219e98c 410c2d14 4097753e 3f800000 00000000 3fc34c81 -> 441684f3", + "420794bc 404a6a00 c15a3ee8 4222d426 3f232a6c bf6bf7f6 3ec68afb 40000000 -> 42963f09", + "c11c4fc4 422b3c7a 40d42d00 418af954 40703dfb bf7ee0d3 bdbf83cf 3fb2b0a8 -> 42f91245", + "c244c1c7 c0ae9148 42201f54 c2128afb 405fb26d 3f2a9ee2 bf3eda30 3f800000 -> 43a52bd3", + "c22b9c5d 41a3b104 c197c2ff c222deb0 40953a5e bebfb5a0 bf6d6087 3ff0acd2 -> 43ea5723", + "c1c72483 c1fc4b00 41fb8aa8 c1ef21ff 403d3d56 3d3fee95 3f7fb803 3fc4db88 -> 43274db0", + "c21e7c78 c227bbc8 420cd268 c13f73b0 3fe00e01 3eb286db bf6feef5 3fa3ba41 -> 430d1ed6", + "c2328b6b c1c2c75e c202aa31 42091558 404fff58 3f70ecad bead1b03 3ffedec6 -> 43483e38", + "c0936308 c19d7289 c0127d90 419470dc 3fd9448e 3f800000 00000000 3f83c35a -> 42820e6a", + "c1b74ac9 41f59e70 421fca6e c2228d4f 4075178e 3f7f763d 3d84b8e0 3fe0a51a -> 43f2aec0", + "c23cb659 4198811c c0ea6d50 c157b264 404a1262 3f0a1893 bf578efe 3fb33134 -> 435df931", + "c115023c c1589f1c c1129e60 40eb4d10 400fbb8d 3f7fb997 bd3dd1e8 40000000 -> 423c1da4", + "400b2690 41f19bc8 c102d398 41fba938 408935a9 3f800000 00000000 3ff84b50 -> 42ac85f0", + "c1d6de8c c215c7c6 c2235243 423801e4 4034c9a2 3eacbd63 3f70fd79 3f800000 -> 436f00af", + "c2172fe0 41caa420 41244090 c2247fc8 406d3f44 befe1ca9 3f5e3eaf 3f836541 -> 439bffcf", + "412585e0 42003362 c1eaaabf c1fecb61 408f2420 bf7ec905 3dc746dc 3f800000 -> 43a83a55", + "41f01568 c190d93e 412c7568 c1d79e75 404895a0 3d1f4d3a bf7fce6b 40000000 -> 429f2342", + "c1616b00 4212d43e c20821db c1aac0e7 40903205 3ec6f1ac 3f6be256 3f966a52 -> 43a2695a", + "422b8518 c1720518 c20225fc 420c6b22 408481e0 3f7adb79 3e4c383e 3fae436f -> 43dfe530", + "c1486fa4 c08c3bf0 c2449328 c1726ae8 400a6000 bed2c21d 3f694e17 3f9e8002 -> 42a5e061", + "42020cbe 41b98870 c0bc45c8 422e37fa 3fd48cee be8c8d55 3f762a47 3f81c17d -> 42914b64", + "413bddd4 c1b46330 41ba5d40 41aa9098 40818cfc 3f077b78 bf5935f9 40000000 -> 438e933e", + "c0a428b8 c20f517b 42339f90 3f7c6e40 3fe73158 3df12d10 3f7e37fe 3fe9e7f8 -> 43224e0c", + "c199d29d c2056099 c243c005 be69fe00 408c9e7f 3cb7d8b5 3f7fef7f 3f8f723d -> 4350611c", + "c20bde70 4217b06e 42281b74 42454d1e 3f68a509 bf1f97e9 bf482a30 3f800000 -> 428d7744", + "41a7a04c c22f2830 40207bb0 4109e39c 3fc1941d bf03845e 3f5ba267 3fd99d0a -> 430cf8d9", + "3e4ad500 41d5f800 3ec57600 405f1980 402bd215 bf6cf054 3ec1ddb9 3fec3b42 -> 42919535", + "4046a3e0 41c5a920 c17b51e8 c2181e8e 4015d280 bf155861 bf4fec4e 3f800000 -> 43195396", + "4198ea7c 4121f510 4205a7c8 c1636b58 40840a48 3f5813b4 3f094890 3f8a5a7b -> 42e8f5c8", + "41b68dc8 c0f5fcd8 405cc180 c226e57f 4071c4a4 3f800000 00000000 3fc4b8fc -> 432ad1e4", + "c20fa4a2 c115f99c 3fb81440 4138bfe8 40116544 3ecf6296 3f6a0f3c 3f800000 -> 42c281bf", + "c1f7bacb c21af560 4100a52c c19fa86e 409bf8bd 3f800000 00000000 3fe704c0 -> 43b1920f", + "41c5a3e4 c1db616d 41a64314 bf9d7f20 40687d7b 3f7ef3ca bdb918a9 3f800000 -> 42c06a7d", + "422911ae 40cd7ba0 41245f90 c0a58210 3f158f0f 3d15a8fc bf7fd43d 3ff96b80 -> 41b2acdc", + "4233ad10 c212b6e7 c1c341fe c05d5380 3feb4eef 3f800000 00000000 40000000 -> 43830d79", + "420085cc 4230b0f4 c24418e1 c1d2d36d 4079c6b0 befbc5d5 3f5ee8d1 3f8020d5 -> 43d1d0d8", + "42372424 c1c9a9b4 404dcd40 c0b0d038 405b5451 bf6c888a 3ec3d61e 3ffd9b9c -> 439f2057", + "c0ba9170 c16e9880 c165839c c20359bc 409946ab 3f6b0972 3ecaea55 3fac61aa -> 42e5b5c6", + "420cf3f0 40bfd218 418eed50 c0a12700 4090baba bf5d874b 3f004d09 3f800000 -> 42ba24aa", + "3f479940 422dfa0c 41a9b348 c20565d5 3f88f7d0 3f800000 00000000 3ff79e05 -> 42b8efcb", + "c1eed817 4226699c 420ed6ae 3ee38b80 402b0946 3f3f14b8 bf2a5d53 3f800000 -> 434ee1f6", + "c1358d3c c232a67a 41671e08 416f7e20 409e5532 3eb94547 3f6ea6df 3ffe176a -> 441f7298", + "c2088772 c1bffb2d 404ab280 c22e70c4 400a139b bf55406e bf0da1e1 3fcae637 -> 42d3235e", + "41bca97c 41ba69b4 c1ffd1ec c193fc8d 40266db2 bf72d2a0 3ea22644 3fc74dba -> 435a61cb", + "c2325e68 3feb6740 c1509ca8 c151cdd0 408f4c29 3f800000 00000000 3fc00dbc -> 435e54a6", + "c233b8ba c1ac2370 3ff7fee0 c17d6228 400f6860 bf5190be bf130823 3f83d950 -> 42d889b9", + "3f12b9c0 c210fb47 4098abf0 c1129614 4079650c bf69c355 3ed0b7f0 3f9ff201 -> 42d9b50e", + "c2184c88 41f3e444 c22b6508 410a92e0 4082d6b6 3dd81b12 bf7e921f 3f800000 -> 42b6b258", + "c1b7072b c1e40c12 c1e392d3 41e7d808 400c4ab2 bf7ecaf7 bdc6a755 3f800000 -> 42fd34e3", + "419f1fd8 c0dc70c0 c238ed13 c1294ae0 4003b370 3f800000 00000000 3fb5961c -> 43412e5e", + "414d9538 4136e764 4235156e 41691c78 407be6e0 bc97c2c1 bf7ff4c1 3fcc7718 -> 430182f1", + "c21e6667 c0fb0508 c0b4ece8 c1c56fa1 407d93bb bf4c6fd0 bf1a1547 3fbd32fd -> 43270815", + "c1e169f9 c18b33d8 422e4082 42156c84 4044927a be51a124 3f7a9409 3f800000 -> 438a98cc", + "c1836df8 411a1f98 4183b3ec 41da7480 3f4299d1 3f7e74c4 bde0954d 3f8728f4 -> 41ebc350", + "421aca04 41439804 c20fedc3 4148d534 4022004c be982aa9 3f746ec3 40000000 -> 43553ddb", + "c2339618 c0942cc0 423e12b6 c0adc220 405e9552 3f800000 00000000 3fba642a -> 43ea045f", + "403870d0 c0a80830 41f48f90 41b30f4c 3f41bb26 3f800000 00000000 40000000 -> 423b56b6", + "c1ba5631 c210962f c207c687 41a40a2c 3f353506 bf2d1e64 bf3c96da 3fda92fe -> 425404e3", + "4218f4f0 41807434 c21c9271 bf7d8540 407cd98d 3f36af04 3f3356ef 3f800000 -> 439c8676", + "c219e678 422c9750 c1e0fd63 c2422d52 404fbf8a be6a50ea bf79352f 40000000 -> 440f42c5", + "40399060 420c36f0 c2382b58 c017cb90 408781f9 beeb6748 bf635661 3fc570b8 -> 43be5580", + "c176f0f0 42269078 c12f94a0 41c8e7dc 3f059596 3f7f89e2 bd75ce7c 3fdf3440 -> 411cfbf7", + "41df7c04 c2224749 c2394013 41c0602c 407b7334 bef71fd2 3f6034c6 40000000 -> 443896a6", + "41a042a4 c22f6797 41623c30 c2210ce8 404ad116 bdca8b58 bf7ebeb6 3ff88d32 -> 41d7a18a", + "3fdc1000 c1b59af3 40bb8a58 40f5cfe0 3f3c7436 be953fc5 3f74e1c9 3f800000 -> 41b494df", + "c153d970 4239b5bc 422cfd5a c159699c 40956f4b bef64eb5 bf606e45 3f82f38c -> 43c0de04", + "421dd80e 41c5b8bc bfe26ea0 41f1a054 407ce680 3f43ce39 bf24e9a4 40000000 -> 43917510", + "421b3e08 c1a7e7e5 41eec038 c18976f0 405a2a61 3f800000 00000000 3f800000 -> 4204d15f", + "bf9e0380 c2312195 41feb6ec 41fca0f8 40715746 3c832697 bf7ff79a 3fcb56c0 -> 43eaaf97", + "41bf232c c155604c 42384bd4 c048de70 4046600d bf637ed9 3eeacab4 40000000 -> 42dd4a6a", + "4217e552 419ecd90 409fc2f8 c2085f8a 4007d3ff 3e17e45b bf7d2b04 3f800000 -> 4306302f", + "c2064058 c13ffd4c c09f5890 c1f61c63 400c799a 3f800000 00000000 3fc0352c -> 42cda31a", + "41dc6d00 c0c347b0 420491f0 41ff54ec 4013bb7c bf3ffabd bf2959f5 3f800000 -> 42b16807", + "c23cc33a 41c7bae4 c20a78be 412a86e8 3ff2cc6b 3efd06e5 3f5e8ddc 3fca820e -> 421bb120", + "41d555c0 c23261db c22c3ca2 410fb588 3fc35e64 bf7ea36c bdd2f2f9 40000000 -> 4357a004", + "c194ab57 40c80550 c23654b1 c1819416 3f1fc4ee bda0f733 bf7f3544 40000000 -> 42097fae" + ] + }, + { + "glsl": "float cultmath_lattice_smooth_step(float, float, float, float)", + "tolerance": "ulp-bounded", + "cases": [ + "4043f529 406662e2 40366a88 3f1ea0cd -> 4044374e", + "40c17e48 40cbce9f 40a9d8d7 3f3d2b88 -> 40c17e48", + "40960ea4 40b20934 40823fc7 3f39909c -> 40960ea4", + "40d3b649 40db5755 40c3319d 3f5e8dc8 -> 40d46116", + "40a0626a 40c9f744 408e575d 3f6e7f9d -> 40a0626a", + "40d51fd9 40e67c59 40d51011 3bc44d35 -> 40d51fd9", + "40484b40 409ae7f5 4035cfea 3f800000 -> 40484b40", + "4091ff58 40986ff6 408fe35c 3e08c998 -> 4091ff58", + "40f9710c 41015b58 40e2bc55 3f35a5ba -> 40f9710c", + "40fb9f31 41185dde 40f0bbbd 3f800000 -> 40fb9f31", + "408390bd 40900557 40835df2 3bdb835e -> 408390bd", + "402978c9 4087a632 400f4c63 3f800000 -> 402978c9", + "40ddd2a2 4100f71c 40da33c5 3eb45994 -> 40ddd2a2", + "40acfd8a 40b536fd 40960fa6 3f376f1e -> 40acfd8a", + "40dfd6ee 40db6410 40d5f0d9 3ebbf29f -> 40db6c62", + "401af9df 40290f96 3ffd20ba 3f4f34f1 -> 401c0985", + "40bf567d 40bfca3f 40bf45af 3c14e242 -> 40bf567d", + "407458de 408d0c54 40546e0e 3f800000 -> 4076e7f4", + "3fcc6f8f 3ff8fa8d 3fc3aa24 3edfa15d -> 3fcd0b32", + "40f16811 40ff96c8 40e6ecd0 3ec54fbd -> 40f16811", + "40c0ebc0 40e7ca4d 40c07989 3e1aefe4 -> 40c0ebc0", + "4083d12f 40929512 40524a2d 3f5560c6 -> 4083d12f", + "410bbdcb 41165b91 410b87c2 3eeac2c9 -> 410bbdcb", + "411180c5 411c37d2 410b2e95 3f1a7f90 -> 411180c5", + "40c10875 40c13c00 40c06f40 3dd87aea -> 40c07ce0", + "40ff572f 4118e754 40efe260 3f800000 -> 40ff572f", + "4069f1e2 40859e42 4069cb5c 3e8e550f -> 4069f1e2", + "403699c9 40374cee 4036494c 3c01d11b -> 403699c9", + "403569f4 4061ee1e 402047de 3f0005e2 -> 403569f4", + "411f4e0c 412baec3 411f46b6 3bbe9b13 -> 411f4e0c", + "40bc26f9 40d1c4e5 409e36c0 3f6f81cb -> 40bc26f9", + "402de374 404f03d1 4020d431 3f5f0cdd -> 402ff4b1", + "411ce7e2 412ab20a 4116ae3f 3ef55f4f -> 411ce7e2", + "40326bc6 4032f6bb 4032104d 3be66dd1 -> 40326bc6", + "40ad037d 40bb2ef6 40ab9080 3e287e94 -> 40ad037d", + "40f5c2f9 411e4e9f 40f41529 3f4bf498 -> 40f5c2f9", + "3f7dba59 3f9cfe0f 3f7db21a 3bfdf6d3 -> 3f7dba59", + "400d1bb7 40773d02 3fee7a04 3f800000 -> 400d1bb7", + "401e7444 40612778 3fc1124e 3f800000 -> 401e7444", + "411b2e53 41201f88 4116f8b5 3eb69929 -> 411b35a0", + "3f099ecd 3f87f065 3e7e1d75 3ed0596c -> 3f099ecd", + "40c81663 40cd243e 40b75118 3f062a5b -> 40c81663", + "40cf4050 40db015a 40b6c38f 3f43e604 -> 40cf4050", + "40abc5c5 40cbbe2d 40a8e16b 3f069aef -> 40abc5c5", + "40df659f 410d2ffd 40da5ffa 3f800000 -> 40df659f", + "40129023 408aa761 3fde1255 3f800000 -> 40129023", + "401c736e 40505622 401c2955 3b9e180a -> 401c736e", + "4050a38c 407597f9 404f1d6d 3e99ea31 -> 4050a38c", + "40f01eed 411716ed 40d596b8 3f800000 -> 40f01eed", + "40cc2500 40e89186 40b50fae 3f4e0761 -> 40cc2500", + "411f4b0e 412faff7 41128cf4 3f691816 -> 411f4b0e", + "40abff2a 40e54906 40a54906 3f800000 -> 40abff2a", + "40e7c32b 40f9944b 40e4578a 3e2edc17 -> 40e7c32b", + "411315a8 411654f5 4111a383 3f800000 -> 41134f96", + "404347a2 4060453a 40206ef5 3f0b62b3 -> 404347a2", + "4108266f 411298e4 40fe9676 3f1e02ab -> 4108266f", + "40c1da6c 40db2367 40b2ed1a 3f800000 -> 40c26444", + "41131a8f 411d4802 41069a2b 3f480644 -> 41131a8f", + "3f9417a3 3fb99c91 3f93ea2d 3c00839c -> 3f9417a3", + "3ff7149e 4065a576 3f939788 3f7c7845 -> 3ff7149e", + "40e86afb 41055a1a 40db8d2d 3f7889b9 -> 40e86afb", + "410c76c8 411b7e10 410c6bff 3b5e32ce -> 410c76c8", + "3f3223d0 40081e7f 3ecf79e6 3f5dd3ed -> 3f3223d0", + "40ca97a8 40f917d4 40c7ead6 3f45f86a -> 40ca97a8", + "411a0cdd 411a354e 4119f37f 3c039dd2 -> 411a0cdd", + "4073f036 4088ad25 4065bec8 3f003e7d -> 4074056b", + "40a6c0b5 40de57d4 409e57d4 3f800000 -> 40a6c0b5", + "402420de 40412d25 40230003 3e71690f -> 402420de", + "401c6ff1 40513c26 4016961a 3eea9831 -> 401c6ff1", + "3fa37526 3fcaa15a 3f24eb97 3f21feb4 -> 3fa37526", + "40b92451 40d2cdf7 409aeca1 3f71bd7e -> 40b92451", + "41171d7a 4117e26c 410f0420 3f800000 -> 41167a2e", + "410ddd1e 41132859 40fd11ae 3f754473 -> 410ddd1e", + "4068e296 40963d06 4067a419 3f09abe5 -> 4068e296", + "4041ea2c 405c4a7c 401a0ea3 3f800000 -> 4044c5a8", + "40496c66 4089836c 403db027 3f2a1dce -> 40496c66", + "403046f1 403b6648 400bfa5f 3f113248 -> 403046f1", + "40a5f81f 40a532fa 40a21350 3e4ab2ae -> 40a48daf", + "4089ae55 40842af4 40715f54 3f4c03bf -> 40845b14", + "3f6e3e16 40137a80 3e90c51f 3f800000 -> 3f6e3e16", + "4107707f 411ee37a 41076623 3f3beab8 -> 4107707f", + "40ccf5d2 40eb69bc 40ccde63 3be73492 -> 40ccf5d2", + "4115ce83 411aeace 4115cccc 3ba671b5 -> 4115ce83", + "4109e0f8 4105cb03 41047684 3f25bf7c -> 41061634", + "402dc0dd 40317167 401e80d7 3ed5b92d -> 402c60f3", + "40298954 4045e9f8 3fe2f1cb 3f6041b9 -> 40298954", + "40825601 408e1c2e 4081f767 3e424c78 -> 40825601", + "4031a5d2 4043aab6 4003b2cc 3f37cc19 -> 4031a5d2", + "409fa325 409fbcdb 409f8e81 3b39696d -> 409fa325", + "4123a056 41309260 411440cf 3f75f876 -> 4123a056", + "402581fd 403646e7 40255fbc 3bae8400 -> 402581fd", + "41002bb5 4112577d 40f07b99 3f561263 -> 41002bb5", + "40345ff2 40755452 400cb504 3f66e41c -> 40345ff2", + "40017ba3 401e9df4 3fdef61f 3ec044b2 -> 40017ba3", + "40479514 40592621 40476a65 3bc2a938 -> 40479514", + "411c5754 41230df4 4113b4c8 3f0a28be -> 411c5754", + "40d8753b 40de9afb 40d1e934 3e5219a5 -> 40d876d4", + "406577f7 4096b3ac 4061c64d 3e726141 -> 406577f7", + "407315fa 4073a652 40730fa2 3b96afdf -> 407315fa", + "40d70fc5 4106fc68 40cdec0d 3f800000 -> 40d70fc5", + "3fc656eb 3fc86462 3fc549e4 3c469f88 -> 3fc656eb", + "4117f737 412bfb15 41125b11 3f4374ce -> 4117f737", + "4082286d 40ac217e 4074691a 3f800000 -> 4082286d", + "409a4b62 409f2189 409a32f8 3d9dd22e -> 409a4b62", + "40c2fc75 40ae1e63 40abfda8 3f572f53 -> 40ae96e8", + "4122a133 412721b6 4119f1e1 3f0af51c -> 4122a133", + "40d867a1 40d96528 40d82c8e 3c9c4d0c -> 40d867a1", + "40c55842 40bb8854 40b02f1a 3f3a9b74 -> 40bc573f", + "3f8114c8 3f99cfc9 3f6fedfd 3e076329 -> 3f8114c8", + "411fedb6 413721c3 411721c3 3f800000 -> 411fedb6", + "411804f5 413892b6 410ddb59 3f800000 -> 411804f5", + "4102198b 410130e7 4102175b 3a88f388 -> 410130e7", + "40bb3f1b 40bb7a2b 40bb3360 3b8d957e -> 40bb3f1b", + "4120fcee 4126675a 4115158c 3f534e76 -> 41217e78", + "40bd346c 40e01580 40bcca7d 3f0d2c0b -> 40bd346c", + "411406cd 412aea05 410bb12e 3f7772a9 -> 411406cd", + "40cc960a 40d7ed98 40af0476 3f6c8c9e -> 40cc960a", + "4077cca9 408b8547 4048ff78 3f3b34c4 -> 4077cca9", + "40ff6416 4103a530 40fbe5e5 3e3647b2 -> 40ff6416", + "40204245 40760226 4004802c 3f6303f5 -> 40204245", + "41092ed9 411dbea9 410445b4 3f494001 -> 41092ed9", + "40e22431 41020cd2 40c22685 3f800000 -> 40e22431", + "4001b675 4037f65f 4001a078 3bdd8727 -> 4001b675", + "40431ecc 40673ca3 4019e107 3f24f714 -> 40431ecc", + "408398fa 409d90f1 4083479c 3dfc5115 -> 408398fa", + "40b01c8b 40b03a21 40b01b90 3af48a62 -> 40b01c8b", + "3f96acfc 3febc639 3f38a720 3eff59ca -> 3f96acfc", + "40bb14e2 40bd4576 40baed48 3c048022 -> 40bb14e2", + "3f7480d4 3fa94dc0 3e8a72ed 3f2f475d -> 3f7480d4", + "40a9bf78 40b91793 408fd5be 3f537f93 -> 40aa45b0", + "40bea191 40cf12ee 40a85a18 3f323bcb -> 40bea191", + "3f9445fb 3fd292ea 3e6e51ff 3f76d36e -> 3f9933f7", + "40c672c7 40d91721 40b9c149 3f800000 -> 40c7bf34", + "40b9e8a1 40bf258b 40a9a9dc 3f01f62a -> 40b9e8a1", + "4117ea58 412bca7d 410cb17a 3f800000 -> 4117ea58", + "402d6551 404cecef 402d46a3 3e7d3262 -> 402d6551", + "401993d4 4031e894 3fd7d085 3f36ae44 -> 401993d4", + "40c9c7db 40feb443 40c682a6 3f6295da -> 40c9c7db", + "41184f17 411ec718 41101b23 3f033f3a -> 41184f17", + "40697819 40937941 40692d30 3b9eea23 -> 40697819", + "408ab4cd 408a4a11 408aae79 3bdf81de -> 408a4a11", + "4107af4c 4106819d 4107ad79 3b3e534b -> 4106819d", + "40921d62 40a5ef95 4081925f 3f1174d7 -> 40921d62", + "40cc7663 40cc2357 40cc3143 3c1bd992 -> 40cc2357", + "41110b70 4111dd8b 4111065d 3c081b1a -> 41110b70", + "410548f6 410d37cb 40ed2bca 3f6b310a -> 410548f6", + "4118fac5 4121f599 4111930e 3f03145b -> 4118fac5", + "40eb839a 41052d36 40d3878b 3f5e19ef -> 40eb839a", + "402490c9 402a4f32 402331da 3d63ab06 -> 402490c9", + "3f6e524a 3f9b8850 3eb3273d 3f14beab -> 3f6e524a", + "40ba6ceb 40c36af1 40a7cfcc 3f14e8f7 -> 40ba6ceb", + "3f5d868b 3f8848d7 3f5d25f3 3c12eaff -> 3f5d868b", + "40981314 40a9dbce 4080e18c 3f398c3c -> 40981314", + "403e0c6f 4053b382 401cb508 3f055d9b -> 403e0c6f", + "41113e48 41208c51 41113d3a 3baa143a -> 41113e48", + "3f94e77d 3fda27b9 3e5d6945 3f7274a8 -> 3f94e77d", + "406ad14e 406c4bf6 406ab230 3b621008 -> 406ad14e", + "409775e4 40b881e0 40815770 3f800000 -> 409775e4", + "41177681 411babf4 4109ddd5 3f598ac7 -> 41177681", + "4078e4d0 409e6630 405bccf2 3f4ea5ff -> 4078e4d0", + "405c34a6 4080625d 402397ed 3f6272e3 -> 405c34a6", + "411e957d 411eae61 411e919c 3b662a72 -> 411e957d", + "3f5ad660 401ef168 3f542bf0 3f53ccd9 -> 3f5ad660", + "3ff727a2 400b1a54 3fe41108 3e45328a -> 3ff727a2", + "3eacf8eb 3eae4c26 3eacc6ca 3ae7b616 -> 3eacf8eb", + "40f1f5c5 410467a3 40d2760b 3f7bfdd2 -> 40f1f5c5", + "41220917 412bbcf4 411bde13 3efdee18 -> 41220917", + "40c3002f 40d49b42 40a32958 3f7eb6b5 -> 40c3002f", + "41155ef3 411d1122 41154943 3d3b34d4 -> 41155ef3", + "3f6f42af 3fc6d18a 3f3918e7 3ed0a4ca -> 3f6f42af", + "4112b13a 412058be 4112af16 3b54a3b2 -> 4112b13a", + "4100dba7 4109850c 4100d5a6 3b064cec -> 4100dba7", + "3f9e06bd 3fd41bb9 3f07f090 3f341cea -> 3f9e06bd", + "3f79c586 3faf9476 3e993ae9 3f2d2812 -> 3f79c586", + "4110b725 41187d87 4107e8e6 3f0ce3f6 -> 4110b725", + "408fe86d 4098ae0c 407925ba 3f1aac82 -> 408fe86d", + "411fcdcc 413ad91e 411b77b4 3f036e85 -> 411fcdcc", + "40ea5350 40f4aa4e 40d3ab35 3f3540dc -> 40ea5350", + "411f24a6 4123ac62 41131ded 3f406b94 -> 411f24a6", + "40e3c40a 40f94109 40df3b89 3ed02bfd -> 40e3c40a", + "409c98e5 40a3d169 409c90a3 3bde172f -> 409c98e5", + "41047c0e 410fa820 40ef54f7 3f4d1928 -> 41047c0e", + "40a9c4e5 40b8050a 40998f29 3f01addd -> 40a9c4e5", + "3fbcc938 3fe910f4 3f30bf9e 3f48d2d2 -> 3fbcc938", + "409c145c 409fa156 40999d3f 3dc082ee -> 409c145c", + "4126dc2c 411edbef 411ba956 3f800000 -> 411f94ed", + "3f284bf6 3fc48821 3f272a10 3c163c9f -> 3f284bf6", + "3fc3a086 4041bff0 3fb46e95 3ec552da -> 3fc3a086", + "40a48468 40adff09 408cacb1 3f3ebdb7 -> 40a48468", + "40941a12 40944e36 40940a31 3b828bbb -> 40941a12", + "410e9c05 41224081 410cb762 3f2c48fb -> 410e9c05", + "3f9fba1e 3fd7443b 3ef5c403 3f44923b -> 3f9fba1e", + "40876ebb 40c3b051 4084a9e7 3f800000 -> 40876ebb", + "40ede6c1 4100f278 40e13a68 3f014b6b -> 40ede6c1", + "4109bf65 4117d3fd 4101a4d3 3f317951 -> 4109bf65", + "411f7cd8 4134207d 4113d7fe 3f800000 -> 411f7cd8", + "40d126e5 41055374 40d00f28 3f6a5f01 -> 40d126e5", + "4031e8bd 4075720f 4008c090 3f5e1835 -> 4031e8bd", + "411b79c9 41284e41 411b7874 3ac5e3f0 -> 411b79c9", + "4126b37c 412e4dbb 41189370 3f6200b8 -> 4126b37c", + "4100f60f 41073bb7 4100d1cf 3c1623ec -> 4100f60f", + "411f08e7 412b79e3 4115a9c1 3f325960 -> 411f08e7", + "40e36775 4108282b 40e04d04 3f7e42c5 -> 40e36775", + "40dc8e97 410c8616 40da1c20 3f800000 -> 40dc8e97", + "408ded4c 409cfdea 406883ce 3f4d5b28 -> 408ded4c", + "402d8fcf 402eca7b 401dc025 3f05bea5 -> 402ae57c", + "404dc3f2 406f3a7f 401ea496 3f3c7d70 -> 404dc3f2", + "40ca3a85 40d911f5 40b97765 3f061903 -> 40ca3a85", + "40a5ebcd 40dececb 409ececb 3f800000 -> 40a5ebcd", + "4046351b 4063ed1a 403f9ddf 3ee9d194 -> 4046351b", + "410595d8 4105adf6 41058e62 3b7c9c0c -> 410595d8", + "409ad8fd 40acb0b8 4084b2de 3f3130fb -> 409ad8fd", + "40aae3c5 40c42753 40a67bc9 3f0a7cf7 -> 40aae3c5", + "3f8658b4 3fd63ee2 3f8292ec 3cff5ad9 -> 3f8658b4", + "41153c59 411d3178 4114b6a2 3e19319f -> 41153c59", + "3fee6a52 3ff671d6 3fbe8550 3f67d949 -> 3fea4ced", + "40199dc5 40875ebd 3ff9f3c4 3f55765b -> 40199dc5", + "40fa333e 410130c9 40e0a64b 3f4c6796 -> 40fa333e", + "410fa018 412cde5a 410da648 3f800000 -> 410fa018", + "4006dfab 402535d4 3fffe954 3ec17ef3 -> 4006dfab", + "40e52c68 4103e814 40c7d028 3f800000 -> 40e52c68", + "4039ea32 406f49ba 40398fb8 3bee54ff -> 4039ea32", + "41265aef 4131e6c4 411719f0 3f740fea -> 41265aef", + "409264b9 40a6f898 408c7988 3f601d51 -> 409307d2", + "40fa1320 40f80836 40f9fd53 3b5e8bdc -> 40f80836", + "409a9dd1 40ae4f24 40767c58 3f7afd27 -> 409a9dd1", + "40976d3b 409f4698 40901ab3 3e72be4b -> 40976d3b", + "406371bc 4063a312 40636125 3b03d9b3 -> 406371bc", + "41159d5e 411e52af 410be175 3f1bbe92 -> 41159d5e", + "41186774 41268957 410ece6a 3f410c4e -> 41186774", + "410eaed8 411d04de 410810c1 3f27a0ea -> 410eaed8", + "40828f6a 409a1424 406f7342 3f5e3057 -> 4082d395", + "4115be3f 4120deab 41116cb9 3ef71f23 -> 4115be3f", + "406b6a82 408bd5ec 40300634 3f6d913a -> 406b6a82", + "40aaefac 40b38fff 4091e7a0 3f48405c -> 40aaefac", + "409e906a 40ab871a 409da159 3e5e5c0f -> 409e906a", + "409ba26f 40bd329a 4095f4c9 3f1cf745 -> 409ba26f", + "400f19f3 4057d6ac 3ff4d59d 3f3ad7bb -> 400f19f3", + "3ede1db2 3f789854 3d2e866e 3eedafed -> 3ede1db2", + "4116a22d 411cb325 41165124 3e4c4011 -> 4116a22d", + "40b275bf 40b2e530 40b253ff 3bcd5e11 -> 40b275bf", + "40ca1a46 40db2367 40ca0718 3e87e630 -> 40ca1a46", + "40bca173 40f119db 40ba564e 3f5b0e34 -> 40bca173", + "412142c2 413bf83d 411b7dc2 3f3e2241 -> 412142c2", + "411996d5 412f673a 4116e1e8 3ea9d110 -> 411996d5", + "3fed60f0 404c2b7b 3fbd0da7 3f3504cb -> 3fed60f0", + "40d48552 40edeb28 40b53af5 3f7a52ec -> 40d48552", + "3f1020c4 3fdaa14b 3ef93a2c 3e002863 -> 3f1020c4", + "40f98c05 4108d4dd 40eabb1a 3efbb972 -> 40f98c05", + "3fe99b2a 4014edf8 3fdd9842 3e98875c -> 3fe99b2a", + "3f34d106 3ed71de9 3de5dc54 3f574138 -> 3ee539eb", + "406dd12b 408085c4 40699828 3f0de8fc -> 406ed757", + "40814882 40b70758 406c490a 3f800000 -> 40814882", + "412268da 413e2f40 411e2f40 3f800000 -> 412268da", + "400f2f74 4081e894 4003d127 3f800000 -> 400f2f74", + "41078b27 410b6b41 40fde4e9 3f098b2e -> 41078b27" + ] + }, + { + "glsl": "vec4 cultmath_power_border(vec3, vec4[128], int)", + "tolerance": "ulp-bounded", + "cases": [ + "42b1bee0 c4a0e73d c27182f0 446cceec c4941705 c3269176 43804e23 c42c5013 44a7f184 c22dd11c 42f2118a c48dedc6 44a963ec c24cb154 43196132 c46805a8 441b0874 c306e1c6 43921437 c3524ec8 446b91ec 43406b9a 4372f7eb 440a44ac 446cc4c8 42c5ba80 434fc7b9 c4b27531 3fd94800 422dc448 42a02348 c410f4f3 c41d2d31 43435ce6 438ac009 c49e26f4 4332fd18 c27664bc 42ad2de6 c4474a9f 449350e4 c328d7ba 42f3ef12 43affe00 439eaa50 4320ce7c 42c92a8e 449a22e4 439071a4 c341de87 42dca09f c4b5efce c42c62ce 426775c0 43930095 c42c4633 c444ee8a 403525c0 41203ec1 c3d519c0 c393a1b0 430281de 43693553 c3f121f0 c483583c c32989fb 437b0443 44adbcd2 c3170b08 c206283c 4340fb88 c3d0f0a4 44958286 42bef1bc 4325bef2 44312668 438e6fdc c2fb30e3 4203275c 449b20ce c34395b8 42d8c6c0 4306111c c2312200 c431fa97 c2da9322 41a4d8ee 43daa73c c4b81834 427361c8 437dd7b5 c4a7c7aa c3e712b8 432277bc 437b7b95 c4a288dc c40fd7c8 c33542c6 4311992e 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000018 -> 3f62dceb bed037f5 3e63591a 42d8c4f4", + "c3ad789c 44b5f376 c3198b05 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c440a7d1 440381e0 c3336f4f 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "449eac48 43c3e9a8 c2227a38 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "449099be c39dbedc 42831244 449e9cbc c4aca848 c2fbbdd6 438f5c9c 445f2768 4361f210 41fad708 4164770e 44b8b246 44983e34 c13cecf0 43061e04 43105480 4423d2b4 419ca930 437e65cc c49b5806 c40ece37 c2c9dcae 421d0738 c426e183 c49202a4 40029240 43261116 44477768 44b2c9fa 42e789f4 433efc8e c43451e2 44b523fa c2ee53d6 434bc16f c4b29698 44b05c98 418ec440 43181cdc 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000009 -> be686093 3f7822fe 3dc23169 435ed26a", + "4431d5c0 4419b048 41c704b0 44b06af0 c48d249a 4248c8e8 4342c454 446c5a00 c48bc9a0 c2859d3c 4384887a c4404791 447d089c c28f2ff4 4256e760 c46d54c6 44604b24 42f9dc88 4324ffcb 43dcbe30 c469cd5c 43004ea4 436de896 44aa5c68 443f62ec c3443505 435620d7 4462c4a8 c38fa940 41f8ffd0 4271a072 c4a56864 44ab6e4e 4298bb14 434544bb 43d643e0 c419cf1c c29a5d38 43941e33 448e5a8e 44966340 433453f4 43802ed6 c302ad10 44376a24 c3419f1a 4250f82c 448ee72e 42501fa0 4308151c 426ea35e 442e3740 44aad624 c2d13f92 428bcfe5 4480a6d8 446f3400 430caaec 4290da9c c490b2e6 449e1996 4305e86a 430129ec 43144330 c47fa01c 4300401e 42ba284c c4849363 44037264 404b2780 4385da36 c1bfaf00 4473fad4 4277cac0 4362608c c444eac6 44b0b620 c2887098 428da6ab 44336d40 44886e9e 43012058 42b94ee0 43400f28 c38c242c c1bb1bf0 421fe26b 44240830 c23be8e0 42f22550 4378eec8 c32a3e50 c499152d 43152752 438fe956 c4a2a6a4 42ef7640 c29fe81a 42c06b6e 449ef8f4 442c19dc 4347adee 428b5f05 c4b7f8d7 44a956a0 428f619c 43888326 c4157ac1 c1b88600 433ba6c6 43836abc c1fc4e80 43d4e390 c11968e0 42a52f25 c49674bc 43154460 430ac184 424db441 44233a70 4422f548 41d8dc50 434a0413 448bb7b6 440a05b4 c1aec4a8 42fc22b6 44a9a88c 4413a518 428fe420 435448e4 440055d6 c4af6f34 c2ab58c5 414d526c 4488bb8e 43af8154 c2b383e1 433b9c57 442a8264 42cf4820 42f21fac 42974f8e 42368bc0 44a190c4 c284770a 43726276 43ad9fe0 43b7d984 430fb0c0 431fc997 4410c3f0 c480863e 41fed710 428bdb43 c47db9c7 c3f4634e c2856a14 42d0b828 41946ac0 c425c15f 4335d2da 43391ca5 446a55ec c42b4dbe c2ef6b18 430e9edd c3d7d604 c2ca6d70 c236e274 4315b764 c4296344 c4472bb4 c207322c 427c62a3 449b7bca c3edf188 c30d3c3f 438d8d5a c3e19564 43d81684 42e39658 42d35101 447d39b0 c47c7bbe c34631de 431f03e2 c30e6340 c49dcfed 430b3a3a 4322fcfe c4222be4 44a8d5e0 c31d7e4b 430c05ba 436ff6b0 c461e274 c209adf4 42a14c44 442c95f0 448d6a3a c1af4e48 425567d3 c4455916 c3b7d4ec c2ce1ceb 430efd17 44355308 c39b2e0c c2a66103 4377e528 c46860b1 c3a2c2a8 433e4e92 43820218 c183ca40 43bb0e04 42d4f5d4 43463c97 c42eb03d 440c2948 c346170e 42b4a056 43b14a50 44864e8a c2f197b9 42cfdfe9 c48b6f74 44af2e5c 4224f6f4 43599529 44a04862 44973c48 c2e6b340 431306bb c461de63 43ca7eac c322ce2e 430f7460 449ddfb0 4309cb68 42d9a9e8 41d1e5fb 44575b18 c4b118e8 c282180a 4386615f 44b1ec36 c43fe4e1 433589a6 438f842b c34a23a8 4446a4cc 433e9d30 41b44cae 448b9fd6 c478cb34 41484830 42efa809 c4706c38 449ce9f4 c287ac36 436aa382 445c1538 4364ac10 431d29b6 42ba623b c4701949 411c9d80 4282a07c 4381a118 42be4cc0 c4117dae 42b679ec 435b2238 449b8d00 44a84b48 c0828cc0 43353b39 427939e0 c411b3af c270dcb0 43852f3c c4b682b1 43ddba30 c2ad7452 42649289 44a008ea c478b4b3 422046d0 4196ea34 c4949c90 4420b394 c2af6604 412be084 c4555bb3 44ba8c7c c2bdf66a 428e54f8 c488f002 c4a88ea5 42a9ed94 4312a5b9 437292a0 c4982020 c1f49508 423add8d c4adb6c2 c4377630 c314a0b7 438aea15 4405db0c 44a550c0 430f2dfc 4383aff3 434eed60 c320ddb0 42d10c7c 4250ecff c41b37ef 442cc238 c25fd360 41553fcb 449728a2 43c71348 42cca5d4 43770f57 c4b20706 442926d8 401014c0 438a039d 440bad94 c425d655 c18e0460 43125fb5 438bfb30 448dd94c c29d760f 438a404a c44ecff9 c480c8e8 c315ae22 434cb2e3 c4ac83ae 44047816 c26ca6e4 4264eb4d 44859eae c38b6e30 c1d48808 43690d48 c445e2bd c48fa792 4327266a 42fe9a6e 440ecdcc 4416b34c 41d9f1f0 438e7afb c3f2376e 439f2e18 c31f75f8 42c88307 443b5134 c458ae5e c2d226e6 42fbc333 c23157a0 c3a8755c c2afb136 43524e7b c485cc5f 4480606c 43288cda 42464d91 439cd170 440d8ce4 433c9b14 42975974 c424881e 438b6c2c 4338738e 433d4832 c41c0945 44315ce4 4290f2f4 432f1a09 c3d07cb0 c4a85364 42dfe12c 43866567 c40e621e c3d97360 4200b8b4 433d41fa c4a6ca4f 446beddc 4328a5c6 437a5f4d c3360dd0 44a9b032 428e1ca4 4311e6bb c48c007b 4436275c 424980fc 42f8699c c464573e 44530e24 42eff450 4127c15a 442c1088 c3ed88f8 42860358 43623769 43d97cc4 c24a6400 c3404a2e 415d9594 42b36ef0 43fbfda4 c3389136 4307e2da 43a1c470 c3a800d8 c23f1bfc 436e91dc c43295bd c41390df c32780ce 436f179d 44485610 c486021f 42e5b828 42d24f9b 449bbd9e c1b3ebc0 c05843c0 43293bb4 c4920bca c41f78a8 c249f78c 433215a0 c43a9bd2 4450a230 c306d022 43916f2d 440ca330 447b2864 433d4162 432fe819 445d78f0 44992142 c2a0d41d 4369aee9 449b3854 c4405673 43104fe6 43603668 c3ce870c 447d5384 c3133a95 4386622f 44161fa8 c4b7c2ea c2d45ad7 43342a2b 43237b80 c3f0e8ba 43041b2e 4258e2ea 44b857de c2b2d3a0 4321176a 42a0ab73 c41a5524 c2f61e40 c2fdadbb 437a9a76 c44e3a2d c383eef8 c31fbcec 4305d535 c3fed6ee 41db9b80 4345dee6 4381857e 4480e14e c4b5908c c20946c8 434ccf5f 43c595ac 443daa90 c2fa9685 42b235b6 c4813569 c25e5ae0 4317c654 429fe82a 4302dd70 436493e0 c2099228 42dde93f c4b9c54a 44707cd8 4200d0d4 42d08f00 c4b964b2 c4a656b1 c1129220 430deebc c4a4c1ca c4afd51d 40ae8260 438eca0c 00000080 -> bf5b80ce bf03bc48 3aba7ab0 43054d4c", + "c4800f5d 42792ea0 c2d10b89 c3ba5174 44365228 41777730 438b271e 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c4a4ff0c c1e18d80 c2865a6a c49ad753 446a9088 41fe8a10 438d8b45 c4207753 43df41b0 434735e2 43643c02 c368ce28 41e2f600 432b74ca 434c2d4b 44846e7a 44577000 4177de20 439017d2 43a6aa88 4396ea1c c2d098a0 429d2ab0 42d5f930 c3146c68 4327b5fc 4351a478 c44d8e3e c4791fec 43053d3c 4383ed0e c3673510 4481ca12 c2a0178c 42da40de c4abdfa1 c3ba80c8 433bbc68 434aa904 448cc60c c48ee35a 42c40dfc 43826538 44a99778 44b5b7c4 c2adfbec 41ca5948 c432382f c3e76c8c 4110e090 438f98f3 44bb79f8 44aeb938 4197aab8 438a6c2c 44bb4a22 c4a9e622 c322489d 43429a93 44938da6 4492aba2 42ac9b10 42312012 446cce08 c48d7f3e c288519c 43312005 c459d23e 43823c88 424ca5f0 43147893 446e6ebc 448c64d8 c326741e 4318b8e5 448553fa c3bc4fc0 c2ac999d 4329d048 c478feec 448973e8 c1eca548 4384a157 43d9cb88 448d7854 43162a72 430e87cc c416f7df c3b467e0 c27c3244 43953c8b c423f83d c3fad660 42d8b230 4393b84b c3913020 43be4904 c33460aa 437a9346 43e87810 441aab80 43094414 434de8d0 44235bf0 c4aa9183 c310d381 4239a456 448f4612 c4a6c7fa c32e2784 433f3e82 444503c0 4301a0e8 c1493880 418e7d26 c2d18fe0 447ba954 c12cb4a0 438d149d c43d8e11 448bb998 c2b1eebc 437aa77b c43faa2c 43c7c190 c2f31c2e 4316b06c c494aead c4962745 c3246cc8 4298a318 c402f2a0 c307f5c0 431e70d8 430fea7a c4b2bbec 443bdfb4 c3070a9e 43380365 44337d38 443b6554 41efcd70 42a134c2 c40aa9d7 44230c48 c2d65c85 43601150 448894b8 4436f38c 40f5c980 432e9f09 c481cf2b c4920951 4203b21c 436ce3d7 c35612c0 c4b68104 c1dc78a8 420a2f21 4482e3b4 43e53300 c33f2f25 436ceabf 44aede02 447bf274 c2a056a6 42c6a4c0 43dca944 c4b8f519 c346938e 43593a03 4401dd3c 448bdd08 c2f0aa7f 431a3ee6 c417c0f5 c4aeb3f2 40bc8080 4322d82b c39450fc c2fc4fa0 42417884 42e48e3d 43712aa0 427f56e0 c32a101d 42909a76 448ba38a c490daa0 c33abecb 414ea571 c4077403 c49e5788 42c8ce48 420c5cca 442addb8 445b5978 c2b24877 4314f6c4 c37689e8 449f040a c32393ca 43815402 44344838 44647880 431dcd88 42b6e804 449a469a c49ba88f c0c39d20 42f8d1d6 c086c800 44978518 4292d0b0 42f6d51a c4af8b7d 43f3b104 c2ee554d 430b0f59 4443d0ac c49bb89f c1cdf700 4324ae7d 44b19dc6 44b91092 c227b6cc 4336aa4d c48dc3a8 c49141c7 42d7a978 431c81bb 4440bc0c c4ae2c16 c31c4eee 43145a72 c3c7a9b4 44459cdc 423eb95c 436af884 43be2818 445c7a30 c29d4146 436e5cfb 43c181ec 43cfee1c 4092a660 4302730b c39ea56c c3d21ff4 c33224f6 41e7a2e8 438792dc 44791578 42ae7ab4 42d52f42 c20b2060 432d0408 43198450 436297a4 c387d3a0 c416aaea c3086f82 4371a37f c40a8000 44b3d21a 425c0f48 43104939 445d1e2c c45c2bc8 c33e5206 42afab8a c4ab4730 c35d0880 42fe9c50 43913b63 4452fbf4 43de43d8 4321c080 42d65045 c25769c0 44b3f042 c2ef1221 4366fe3a c4a5bf20 441929ac 4325ece2 438b1b16 c408eb34 444f1d40 4343783e 4374ac74 448e6264 448b9fe8 c255e678 42d20b25 43ca9684 41608280 c13264e0 434659a0 c4bb180d c4a9596e 4240d488 4280ec22 c3f66c60 4456ae88 c33f28c0 42664f53 c4b64e89 443c3c8c 41a5a590 437daaa2 43e5f02c 43124e68 c2bc249e 43069676 c496c4f6 c39ab37c 42c0988c 433b3947 c4a33bf8 441f8098 c30dc12a 4176a2c4 c453ad3d c455c3ee c2321260 426e4634 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000051 -> 3d3a35b2 bf7188c0 3ea811a8 432f3ac2", + "c3e24b28 442b3468 c304479c c437d3d2 c3f916d2 c1d45440 42e46768 c4b67d09 c35d0498 c2b6962d 434fd037 443c1094 449a21d2 41d4abc0 42962516 c483d54c c48106f9 c2874302 433a2da1 44a3c326 c44ab71e c2d17223 43678a58 448760ee 437e52b8 c2a94500 4387e77f 4398c560 44b04328 c317b468 42fa9254 4483b0e4 c4947b2c 4114c730 43037ce0 c428a71c 43f644a0 c2229144 429099b0 4478616c c4a1239c c3262a96 4391ba65 c2ba2190 44a0e020 c294d5e3 43727a8d 436d7640 445cb67c c32c45ad 41d90043 c4a5d4e6 433e3ea0 c316ad02 42ab50ce c4984ce1 42186e60 c293f795 434c55e3 c4aa6d5d 42b92770 42cdf9d0 41b4875f c411cee4 448c5608 43046028 43458b35 c3a85768 c4842c85 4333b406 43166fea 44412624 c48ff6ea 42dd11d4 4382a0e8 c48513a2 c42e426a c2a4095f 438c2426 c42be2cd c21eda20 c28d17b6 43743184 4496447a c4a45e23 c2803232 42bae6c4 44b44706 c4323b59 c28bf434 43671a96 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000016 -> be0dcfb1 bf747c3d be864105 42e3e7f7", + "c48460b6 c3f0587c c1f5c7d0 c4ac07bd 43f76c98 42179910 4219c098 43fae11c c3812eb4 c1dad2c8 437f0eb7 437f2908 c414dc22 4330acd2 436e40a8 c43651e8 c4901705 43027c16 42924b46 c3af7364 c3970b68 41bc0c70 428c30bc 44a8b700 c48604aa c2cce0a9 4324ff64 430188a0 43f8f1c0 c315d586 437884d1 c46ae074 c488d3aa c33c4be0 438e48fe c28fde20 4320bbc0 c31e7316 4338c8ca 44162778 447a75a0 4225b490 41f9173d 44930196 44ad73a0 c29378de 436672b8 c398e630 40033200 42b31104 42520d8c c05d9a00 43060948 433a7122 42d2cd5f 43a5cda8 c4989755 c25b5414 43874d51 c36cdc50 c4a4e5af 41afa150 4125fc57 c41ea6ff 43a3b564 427d1c98 430c7a6e c42acdde 44b995cc c29727c7 4355f724 c4b70b21 c44f5ea1 40e08c20 43293c36 445dcda8 c2296d00 c293d559 43942b1d 447537fc c24327a0 c3116fe4 41b29668 44a5cc76 44b38e7a c28d1800 43443962 c4783b72 4416379c c282fe48 42f219b4 c46801aa c45d11a2 c2feac6b 43439483 c425b430 439969e8 42e3894c 42b811a6 c412be24 4489268c c09ad180 42fdd734 c468c784 c4b3cf9b c3121d5d 42b3b24a c4b152f2 c378f240 4154ae90 4238995b 4450695c c3baac4c c32b5457 438ce8ed 449ef336 4214ad60 c33055fe 42c79841 c420decd c4b57bea c2af4770 432fdf2a 43edf3f8 44a08be8 40a23040 4373ed25 c4abce7e 448d9ab0 c2b7facf 4284353d 44171878 c4af603f 42926b9c 4390609c 44b9efe6 442eece4 430d2596 438aa2bf 44810a02 c4a963c4 423806a4 436414e9 c479b4d9 c4584c06 42281458 43766185 c48969c0 c43fbd0a 42acda08 436855b5 430158c0 c2975ab0 4346f2d2 42bb36da 437e8048 449bf99a 42c3a16c 42abac0a 41bbfec0 c400f270 c2d53551 425572d9 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000028 -> 3f055da9 bf585ef7 3df46192 42e39904", + "4368dff0 43edee60 c1691d50 c4921483 44a58dcc c2f77e5e 434942f7 c487ecb0 c2cebfb0 c2d23af5 42fc9864 42ad5f50 c38ea140 c1a97ff8 42cf6214 44142c58 4401cee2 42ee0010 426364e7 4120f900 43e18504 c2daa69c 41a11b2d c39de99c c3b96a60 c3280a59 43945c62 43890ba0 c3814fa4 40cd3ae0 43764b15 c2cf0cf0 439d8518 4302ea58 436ea398 4486cfda c48d883e c33ec152 42c3aa62 42989710 c49351b2 c21711fc 414ad6ab 44431e8c 44913a52 c3319fea 431e321f c417dead 44a46934 42f8370c 4347f2b0 c3400828 44b6fde2 4265d288 4351eec6 c4639ea4 441df198 c2a1c25f 435ee0dd 44879780 c45f8c09 c32cbc82 435be299 44a890cc c368c6e8 432e36c2 438af681 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf6cf2c1 bdddddc1 beb9b6ac 428a680e", + "c4a7e2f1 c471706b c252d180 c180e9c0 43cc2c2c c2261298 42a1f6c1 c453e8d3 c428e652 403ebdc0 42cddc9e 434ea318 440f643c 4274b1f0 4339059b 448763e2 c3b5c700 c10fe9c0 43906637 c487ccee 4389dae8 c30c6ff2 43792fa8 c41e36a3 c3301e90 c28d345c 41aa74e4 4408611e c4a51a7b c281cc80 438f0091 c489fa9c 44a285ec 425e37c0 4313b51b c4468939 c4b99d57 43308b56 42e0149d c43d6c99 c32606c8 433f9f08 43086124 4459c338 c38194fc c2a5d73a 431e1df9 c37e5370 c48e6b10 c3249ce4 41b5227e c2fbdf70 44ad70c0 c1c0c4f0 41eac8c9 c40aff88 443ba71c c25e888c 41cbbcca c40c88d5 c3d62d94 41c95d10 425ef777 44a3e4b4 43272268 c2f948ab 43424a56 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bd841513 3f79c99b be564656 432e083e", + "4470fe0c c0717a00 c2d44a03 c48c618b 44207478 429a90e4 433bba03 441fd62c c4ae96be 43162cba 42545e9b 446a8f34 43b9a5d8 41c53008 4391d509 c41a617d c196c380 c3042e40 4319277e 43588190 c47edca4 c0bef480 4344cacf 44918276 c4acc8bd 431c1680 4384d9e2 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3eebcb13 3f632e6e 3ca00990 43ed6863", + "44ac6dea c49853ff 433d90de c2f95330 c4452472 42c9956c 429ad2f1 439f3510 c3fb71b2 c2c92548 43628007 c30a6620 43985498 42ac9e7c 4316ca07 4497c71c bec03000 42bac270 41260e2c c46b2513 43d655c8 c32f33e3 41777309 c4864e88 c26e6480 c340d759 43850ec8 c45812e3 43144948 c3256fca 4378e0fc 44699b58 445aa538 c2e4805e 4371f07f 43e15474 c1cee500 c2691ebc 42f43d99 44683b2c 443319d4 42966aa4 426329c7 449dde1c 44395000 c318ade8 432c00bc 4449fb18 c4800368 43415060 43266aa3 c480b60d 448ea8f6 4257c268 4381193c c4758419 c45c38f7 40c4b0c0 4392daf0 c45290ab 448a4efa c33fc752 41d390e0 c43e873d c36174e0 432e07d2 434a141b c3a93abc 449bfe58 43061aa0 4301dff2 c484e8d0 c3e5c22c c2f6ab50 430bd333 44aa9374 44963dfe c320da79 42f8f6c0 c3cf406c c2f466c0 c31a75da 41cb9663 43466e70 430d1f58 42858f54 438c008b c480bef3 c3d437f4 424b6ef0 430ab76c 44b2813c c3ba0494 c3050cc7 438d6b32 4423af8c 43c4f788 43262774 4319e0e1 446a0154 c3041d40 c3036b80 4380bb6c c40478bb 4351c558 c229ee90 4374e224 440d9284 c46a9dfc 432064a6 42b1c280 c492cfaa c48e464a 423a5e10 436664ec 443f3af0 44af3b2c c0718500 4354afee 44416c68 c4b9fd62 4010f380 41927d69 c41e5f51 c3a2e28c c1c87c30 43692e21 c4706920 c43addd0 42b78a30 42cfa9e7 44b5f900 439899d4 420469cc 438859e8 c41f2347 c4339b61 42b7eb5c 439573b1 c482082b 4485e0b2 c2ce2bd7 439193dc c2fec590 c3d947dc c283b90c 438108e2 4442a19c c38ae844 c2fb52e9 4363c79c c486b86c c454a6f1 42be9674 4374506a 44a8dcc6 c485f416 41ce5ca8 438c2266 c489c8c7 43ba4efc 4250c8c0 4308ff11 c2fd7c50 43684650 c2aa9bd0 431cf692 42e30e90 441df4fc c13226c0 431963f0 c444f64e c187b540 41922778 4387a110 44444e58 42d8f860 41e396a8 438c629a c4a679e6 4375cf58 c343f7f8 4369e58a c4a3200c 44b36c2e c2fdc003 4368f375 44884fee 444e157c 43363a6e 42503ac5 441306e4 445f741c 4311753c 43236c1e c44d1cb6 44644690 40966020 43849dcd c4a1d8ed 44766ec4 c291f1e4 41c17220 44a33634 440f8bf4 40add560 434574be 440017d0 447d020c c3358130 4302199c 43570210 43c43238 43165bec 4329af68 43ab30e0 4486698c c24b5468 4314fea7 c39e14d4 42574fc0 42653b80 436749e3 443f4770 c401a56f 42eebb1c 43097074 43c40d08 c4b54375 428b7fb4 438fd1b8 c4b2584a 440f4194 43121d0c 4297f139 c430b964 44acf138 4306bafe 42ecb0b7 c2d2b930 42da7960 c320cc32 418cae2e 442b67b8 42f89870 41eabd60 41e75a73 449e43e0 c40c3ec8 4325f752 42e97d2a c34da780 c4af543d c0b99720 4329a27a c46c051f 43238398 c2a4e96a 433a58d1 44935e44 c49fb30b c341b85f 4347b4d7 c47cc5ae c49a2d00 c23070e4 4384b224 444722a4 43de9dd0 c2aafbbc 43475ada c4b365c2 44bb3e3c c3423c21 43817063 c3703098 43afac20 c33a30be 428fe440 443e5630 442ee1a0 40deca00 42cc433f c4955b52 c4114878 4125ec00 4394d579 c45cde91 c40ae2b3 c33720c4 4357dc3c 43fafa8c c44b7339 c0f809c0 42f6a1bc 42788de0 c3287658 43114624 43438185 c4829c04 44108570 c2a0385f 42b2b480 c4b17964 c4328646 c275a2c0 43075198 c4b4bbde 43bef378 c313c9f7 432ec68f 426fc4a0 c49d679b 430db96a 42616038 432a3058 44148100 41a7d298 43813802 433cd160 c39959a0 428c1f78 430cb38e 439f58ac 43653920 43424064 436feeed 426050c0 43b980a8 c282029c 4392887d 443e7290 c39dba3c c32f3da4 41ddb8ea c347a618 c4402b06 c2a73ba5 437d86e6 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000054 -> 3efdf64e 3f181962 3f221a96 4381cff1", + "c29c1200 c4689695 420b4dd0 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c49eb950 443e74c8 c340fbc4 447a82d8 447207e0 431c8f7e 413e2d5b 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "441dccb4 443b4218 c30f39ba c3150440 c427bf01 41ab8890 438972ea c39e701c c41da3d2 c30a39a9 437622cb c48c934c c4b49dd2 42ea9428 435ca4b2 c40c48e3 c38b6e2c 42aa283c 43870bcd c2b91d50 c36471c0 c32138a5 42ae8380 c489e8b5 c3aa3644 c2224c44 430359cc c462977a 44593d7c 40bd2de0 420a3d63 443991d8 c4086a7e c299a281 41b506c1 437d42a0 436521d8 4308409e 432d6387 c38cb05c c46fbc96 41fe8730 42bb44a7 c4b04df3 43ef9700 c32e1998 432eecf4 437398e8 438db034 4106ca90 43028ab0 c470f8ae c4926322 422c245c 42d373b5 449db912 4377e1d8 4160ff70 41e4058a 448daa60 c488d14a 42ac7348 43395e80 444e4680 c4a1583f c32d440d 43740930 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf7fd736 3d0eb309 bbb55490 431313a5", + "44b20e9c 422050c0 43380afc c4838474 c1e01b00 c2a8f67b 437ed9b7 44676a40 c44596c0 c12fe5a0 42cea132 44776420 447cf05c 42257858 42afc89a c49654a2 44983e88 425c77b4 43580d3f 44b33338 c48d64ac c347486e 41afa244 444f9f18 440b39e4 c2b7281e 4310c9e1 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bd900f8e 3f7ee908 bd73f461 42d6faa5", + "4482f796 c4b077e3 423e5ad4 44865db4 4478a420 c197ed78 436d8027 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "441fe5c4 4491708e 41adfc88 c4917c0e c3e6e190 c32ef1af 43613018 c4a987b1 c41792ec c31b2474 42d6f465 4403efc2 c47c2d8e c1e30fd0 4217efc6 442e6648 43be16e4 c30ff14c 4353a724 445930b0 c2da1650 c2e0503f 4378f65f 448a8f56 c4199ac8 c2b2d8e8 43848bae c4a37ba0 44b0d45c c345b537 42570a23 c23eb560 c43b9873 4316a072 417753b7 c3a26750 c1bddc80 c343a2cb 43482829 44b377d8 c4ae7310 425c5810 43921b6d c3dd089c 43d008fc 4306fa48 4370f09e c47c1d35 c47e1355 c315b076 428ac7ff c40cb738 c49a1386 c33022ef 432e1272 c396f460 c17a5d80 423a0e34 4376e2be c4a162b7 c46dbd2a 428e62a0 42009828 c41bdf25 44acf7ca 430ccef6 43058d6a c41f9a62 c386aa78 42a3d018 429f750e 43adb95c c23ad680 42ad6b24 4364e346 447473f0 c43e288b c1374540 4299dda0 c2fd8080 c26ed800 42ac9f28 4387e86a 4481a9cc 4461b388 43076828 42f91648 c46856f3 c40de62f 423f218c 43870eab 448ced3a c46573e9 4209b854 4370b6e3 c3d6c52c 43380580 4290c904 42f7028c 44570070 c384e5dc 406a3440 43648d22 c30299b8 44907ffe 420e5de0 437a1aee c3bf76fc c412584e 42bfdce0 42595f96 c4b2b7ac c3abc708 c26171a0 4334f79a c2c492f0 444e6060 c2d783f0 4318755d c48d79dc c300dea0 c2d3563a 439293c6 445a130c 4466dd48 c25893d4 43044ef3 44956218 449df3cc c2234148 42ad774f 43446c00 c49d831e c1b2c568 41bb872a 44b09afc 44ad4e98 c1abb108 4390435d c4580877 c4b78973 c33ef3a0 43855fd6 4354eaf8 c2c8b510 43156926 43183191 447b3958 44ba332c c289562a 4332adc9 c3fde5da c468b0de c2b9113f 42d32ecb c4735217 42c485e0 433924ca 43461b94 427854a0 c4799497 432bd666 430cd56b 44989726 c2949bd0 420be504 438dccf5 44a58160 c40c7021 423dc034 431c798f c4006221 c42c5f4c c2b09370 422a1bbf c344bb70 c3e04464 c2175314 42d00bc1 44a2dc12 448c5e5c 420adc40 4387c3a3 438b50c0 446d3c5c 432d8b76 42edec2a 446979ec c4908f2e 43144f72 43091384 44bb3c1a 445f4638 c1c0d3f0 41b7c5f0 c49d2273 43566928 433f5f80 42170f2a 448e2b02 44a14722 419cb878 43217151 c3b71784 44726ec8 c2c5bca1 41dc826a 4499ecac c480cfac 431e14c6 4379463a c48bc029 43cff69c 42ab7be4 43457319 437150b0 c4b115ec 430f4f36 421116a0 42f83840 c4583886 c31323c1 4379c889 c32e1458 c46fb323 40144cc0 43240695 4477d260 c4471659 c33b865b 438220ca c3bfea80 c40ebd2a c1afac18 4133927a c402fe82 c4a3491f 4118da80 43693195 433e74c8 448bfc90 c15e50e0 4347e43a c4528551 c4aa5d92 c2974f68 42e52d63 c49c3ef6 445c05c4 c16488e0 41cb6e3d 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000003e -> 3f75999d be8d8323 bd67f7a3 4236a3ee", + "44afcddc c4a41f68 c206a54c 44269a1c c49d68b7 c2f1f821 42cc1f12 44264784 c44a6603 428cbb6c 42395daf c4af67f2 c30cea98 42fe1ec4 428440ca 441d9a44 c40638f0 40cb1800 431c20aa c49a428a 42a2a5f0 4286753c 436277e4 c287e290 43a14ce0 c225f314 43831541 c4851254 c31ca9b8 c3392c79 43696004 44b33e92 c4835776 c0ca0660 43650a43 44504520 c45c476a 422520cc 4393ba4c c4023dc6 c30f73a8 4308b63a 4344845b 445902d0 42b0e5a0 c2fa5b20 4335df62 c1a2e940 c479aabe c24ade3c 4312f986 44a828c6 4313f198 42474a54 42e5395d 4490dca2 449ddcca c28f8b14 422cf05f 4409f884 c400ffee c30313a4 42b2e0a8 c46632a0 44981f00 c30d115e 4384f636 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f748416 3e84de27 3e121f59 43a4db21", + "44a70b8a c44ceca7 c2ebd5c4 42bd39c0 c471d7ae 425a5500 4350bec8 c4b2289c 44ab6912 433325da 4303f052 4463b68c c3b982d0 433f3672 41fd018d 434237a0 44716024 c1e44128 43224ec9 c48d3160 448a6130 430eb0d2 43856e11 c208c500 c415b953 4347567c 42b653c4 434b8ef0 c315b8f8 43197a08 42f1a5fe c4129476 43b9c790 c1dd3540 4363dddc 448a8312 443edf04 c204fb08 42eba098 44b70980 44038d52 43108e20 4390c2ef c3bef2b4 441197d4 43182330 438efe27 c4654aea c4617bcb 424d5430 42093bd4 4423feb4 c3d60e68 430a2150 42842138 43315bf0 43b12d6c c2d89dde 429a140c c47099d7 c3d72024 c319027f 4330b27a c49ff957 434526d0 c319a1f6 427886d5 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f74ce1a 3e5b578c 3e4bf172 43bc16e8", + "c4201286 44926d10 42f59658 c4a629ac 42de99d0 c1a62270 4143608c 4493520c 421c4540 42eb9530 4303ce9e c4a9ffa8 c49b6697 c2526768 43784f9c 4460e6f8 43f53d20 4332e7de 436bc5e5 c444d74c c466e43c c2c70099 432253ba c46bb636 c4669215 42526cf8 432bcc81 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bf7b654e be2b1141 bdb42a90 438026f6", + "43f5d1d4 c3976a00 c2e137b1 c4b92ace 44af50e0 4345a8dc 43773eb9 4406280a 43f2a41c 4300140a 42fa668e c46bb911 43f965c4 c31df632 430813e5 44695bd8 c489cd44 c2b73648 43633422 443dcab8 c429d9a5 4320e3d0 426ba382 c3942518 441bee60 c33a26a0 438f52f7 c421441f c45293f8 4311bb0e 43884f49 44924ef6 4425ca68 c3470bc0 4356c04c c454cba6 44249580 c337d1fa 4230fbb3 c3bc7a2c c4ba1f22 c3179a2c 4128091a c48bd969 c3b21278 c3334353 4322814e c484b179 c4998e90 c248af0c 41db4d54 c3d13410 4467b634 41567de0 433ce959 4497c8e6 c387ac24 c2a086aa 42c10575 44a25514 c4ac6dc6 4153e3c0 430f4c1c 445f1354 449b7ab4 40356a80 4310bf83 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3e401c4a bf7b5ad0 3ce29935 432076ce", + "c3f208a2 43ac7bd8 434542ae c48229fc c3bc0e40 42c7810c 4258f1e5 44962f52 c4abe7cd c34004f7 43484250 41d1d680 4466db18 c2f46ddd 437ef350 44643648 430728c0 c327846a 4280c5eb c3abd398 4461f598 42f56074 4303d470 44359a48 c46c1915 c284ac4e 431276f7 43f205dc c45dc6d1 c2e608c8 4383c241 4382ca7c 4487bffc 42c5acdc 43837203 c422d864 44af7ca2 c2e9e455 4307f3e0 445519c4 c2d59d40 c3464b1e 42e96ba3 c42574ef 43d55ed4 c1f2be08 429ac817 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000000b -> bf093c1a bf4dc7fe be8402c2 4346ecb6", + "c337bc70 c486bba8 c3200b45 c4272b20 c4262d48 421c71f4 430168d9 4400b298 c3e11638 433b13ca 41ade479 c425e410 c1d36fc0 429cf4c0 437a727c c484d7bb c4a1ac52 426aca18 41dcdb1e c4052e14 433959e8 430686f0 42d7b3d2 43dc54c4 c390e438 43286baa 43712238 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bf7a0288 be35488c bdfa10cc 436c7e83", + "c48a0751 c4aa1d80 c2e7152b 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "44b1603c 42b94f40 c2c7f54e c40e6fa2 437ab500 c30c460f 430f7b2c 43a6ea0c 43b108c0 c2d00bea 42f86ea2 417f7500 44b173ea c2998afc 43264356 c48962bd 435c2038 42ddeb74 426f229f c4b56b1f c4a78c47 c3094442 419a90e6 44513e84 448c237e c2643160 437238d5 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bf0c3a9d bf55c6cf bd517933 426d940a", + "44930e34 44b7abbc 433ba800 c4846ab7 c32581f8 c0bf6160 439400d8 4414134c 44421700 c32ebaf1 43892717 4487ce1a 44a8f0ba c2e15d2f 42191282 c4393889 44954808 43332338 4317cb00 4495f800 c4b8d8eb 4129b1a0 4393a176 44a14a64 c4901c32 434542f6 41ce01b6 44691190 43fdfd78 c1cb93b8 429730a0 c3e32cb0 c218ac00 c327d7f1 42e96c46 c4af0269 c3068988 c2628194 43233ab0 44724468 431dd338 c1cc2570 43763b12 4420ab40 c433cc16 c30a5f2b 421f2128 44a473b0 44a2ffc8 41261a00 439276fe c387b258 c40d21be c32ac403 4321e7be 4427a738 c44fc514 c34490ca 419857aa c310f830 c34fcb60 c301cfb8 4191355e c4053262 447cbd14 41c91cc0 42ed6ca1 448acb2c 44835f24 c32e5535 437162f5 42ede670 c3719930 4284bc10 42dd7055 43549bc0 441ef1c4 c2b873c2 434c40c4 44ad1d06 44926bc8 c319b0a9 4384089a c485bc28 c2eb6c70 42fd52c0 41a53452 c380b674 4329bd70 426717c0 4374ff3f c3204b98 c4018fb4 c32951ef 42f786e3 c3b84b74 c389daac c0481340 4384332a 4414112c 4451669c c2d5ef51 420e5408 448aefaa 442b0d30 c1cce5d8 43948f56 43dadbe4 44295548 43352d3c 4155e0d1 44aa13b8 c3f1e0b6 c32c2e72 432cc108 c40ac79b c4167778 4319e4bc 4381f022 c4b3e03e 429cbad0 4338456c 42c9d9e2 c45c94db c438a005 c26de4cc 428f30ec c3ebd954 c429c6ef 433c118e 4264d0d8 c45231ab c3a1b55c 433cf750 427b9fc5 43eccfd8 c4b12a2a c345c2d7 43027036 c4b233d8 4474f070 c22eb018 4351a3dc 439b751c 43c73b68 430eb7e6 42251240 c435b89e 4239bfc0 c32911ad 42023356 428c2e50 43c3d084 430ec38a 426eb599 446ee470 449d2454 4318edd6 433cd515 c3b8df1c c44f525f 426bae78 42ebeb73 443fb460 4459a08c 42e97f0c 432cca35 c3c88020 44912abc 432156a4 42bab117 c41aaa23 c2b76ce0 4306bd44 42845f48 c488c30e c42acd51 42a7eb24 433030b7 c39a71ac c44060b3 4335e098 4379e9e2 c463c5ca 44932796 425f0dd4 4334de15 42d3b560 4461d5e0 c259bddc 436042b5 c4850922 c3a69958 c338943e 43725abf c4708955 c4b48bb6 432d1f88 4375e7ec 447fb698 c4196950 42c1308c 42eaf1b1 43a83310 44597224 42e32ed0 41cd20ac 445c4564 43f4bf24 c33999a3 43286a47 c45a23c9 c40f0f7f c2e04c9d 424293b0 c42d577d 44700270 c3019c72 438229c0 c482f6f8 c45efef7 c33d937f 432de9dd 428b33d0 c47b9cd0 c30f22ac 438833e7 c34f5e98 c4ae23e9 c3423740 422f701d c3f0d0de 4494a938 42b9b1f8 421dd6ee 40c0e500 437c4cd8 c2e3e031 42ffb29f c492d65c 43803630 42ec6720 4383751b 4446d5f4 446e3d40 413df7f0 437c6f91 c47804da 4497fc72 414f0170 42e460b5 448076f6 c4a1650b 42822a9c 434319d4 c42cf4c3 c472cc8c 430af508 430bcf09 43dda648 448e2cac 4244e458 4365d707 43df0e54 449d3750 c2ea8ebd 42c9604f 43676698 c48f3c27 4251fea0 435095e4 439d493c 444a3298 42cbced8 432deeda c38b3f4c c481c5d4 42f01574 43569be2 43ca4048 c4115e3c 42bc6e48 43226b18 411d8080 43e8c85c c2b4a70c 42b08222 c447b580 c4984f5a 4304e0aa 42d0ee12 443187c4 4448a77c 42cee320 4298feb9 44ad6806 c4ad7644 c2dd4455 437f4d80 43a64624 c45446b7 c2c0eb1e 41c6f112 c4297675 44825670 42cb881c 41f94db8 c40adc01 c496f783 c2d71c96 422decce c3b9c154 c4864ee4 42fa39d0 42da1f5c c485a704 c496f235 c2c42b85 43950f4c 43d99674 44a3dc44 c32866c9 431627b6 c4209d8a c411defb 43333a6a 437cd285 c4b7612c 4298bff0 42249748 42ea7212 44a17234 44aa5666 c3221eda 43032e98 c4a9c0e8 440a33f0 c2c6c67e 4348283b 44964a48 c46017f0 4335fec0 42461b86 4488060c 44228e58 4333d4cc 43368292 44aa88a4 c378f1d0 c325b77c 43826a92 4453fc44 c44a930e c2ef597c 434d6d76 c487c2ff 444eab38 42d45668 4391705e 4495cfaa 449c693e c32f3470 436eecc0 c182bdc0 44878428 c2fc0e67 43045c14 c4a9d1f7 c39da14c c2a49630 430f3425 4481bad6 43949c18 c322e73e 430ab768 44b4bd70 44a602e0 4240e6f4 432f0a57 c3d81bf4 c3dc3004 43190652 43364048 c334bff0 44327270 420b56a8 43552e30 443e10b0 c36d9188 c2b0146f 42b19fbc 449d1178 c422c29c 42ccf968 4393a21c c4874ace c47ace5b 4262cba0 41264726 42beded0 42a5e390 4198b0f8 432c5ac5 c48d77d3 43bd93e8 c340670a 427cf228 c48810bd 4440b8f0 4299882c 42854202 c4816085 c463c320 42343000 43286c71 c4ae8caf c2bfe360 c2709114 43656bb3 c429484c c23c4f60 4286cecc 433fa329 c4905ebf c4b30fe2 418184a0 432d4223 4480921c c49299d5 c29c4bfa 4376c028 c41549b1 43b2d0fc c3391530 437a3370 44651e80 c404f615 c1383550 4375e036 442433a4 c390bb34 41cb1510 43957c7b 442babf4 c49bc3b4 c3194aaa 435b88bf 43ff8dc8 c4598d86 4333a83e 434ca60d 446cf5a4 44906be8 42b5a67c 41be35b2 4486ad4a 449e0484 c1b08b00 421c4a6b c49b4892 c303e5f0 c27ed99c 41912e04 c30eff48 448cd338 431dbaa4 43256095 c47fbb64 445540ec 42c0a308 43586d3c 44ba4ce8 42d9af70 c338eccd 43834344 449dd10e 44010a24 431ef9de 41967e3e 4498261e 446e7504 431d0946 43418c69 c47f0f1f 43c823e8 c347d36c 430296e2 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000079 -> 3f6c4cd5 3df6065c bebb1c15 42abdef3", + "c484700c 449e0cd2 433fdd04 c3c18cbc 442a9738 c2bdadbf 41e1ae7b 42d43600 43045e38 430d5848 4282608e 4372f620 433e85d8 431a6996 43120c79 c4450140 4402ccfe c2b04491 437fc1b0 44859b62 c48c00a6 c2fa54df 41878a94 c38054fc c4651c1e c2b9a02a 432d6609 441bd83c 448a10a8 42ff203c 4383e3a5 c2810450 43d77420 c3044e53 43766843 4485c1ae 447a7238 424955b8 43748f4b 444e16e4 4466fce8 c2373d1c 423c6620 c4aaf882 447f0f44 c28c3496 42a7928a c4b90a4b c47c27e2 432909ac 43900f0a 442593e0 434d2ab8 c339a7a9 43822759 44538a94 4487107c c169f790 4274ad99 c2f31510 441597fc c267ffa8 434b7c8f 4428e958 44b35956 42a97254 438cea7c c39e9760 c4a0eff8 4233eb40 42fdf8a0 c4a94998 c2aef810 c32af092 41c00f2e 4434e358 c4a55113 433ff1e4 433090ec 448aaa96 c4b66cdc 41b60750 4327c29b 44a71796 4486f4a0 c30a44d0 4388f738 43a1a8dc c4116ba0 c33abe38 43957e8c c3c2458c c317d648 c2710e30 41fec290 c30d0d10 4423b5e8 c21ba804 41e8b04f c48b65f6 c3a8e988 431010aa 438cae24 431a0758 42665980 43242f04 42a4f5d9 c14c9080 44b6d5e2 c31738d8 435ba410 448e9db6 4491e75e c29aaa0d 430b5398 c48608de 4469400c 42b14af4 43827931 4472f3b4 44624668 c288565a 420e45e2 c4ad5da4 43ade7bc c33ad5b4 4337c30e c48df02d 44ba7f04 42188270 418522b6 43eaa938 449b449e c1ac7f48 4315e446 c481fc7b 43b5bcb8 43451026 4305a6b1 44a8888e 4497a60c c209020c 433ddc86 c46ce10b c40e515f c31984ce 43159bca c485fb14 44974522 432d19f0 43442ccc 44ba3fd2 42e04930 c2ce7f5a 42d16949 c4a5d1e8 444bff50 431f36be 438ca246 c2249b60 c40d8a3b c314a06a 431a8a57 c3a1a2c0 c4965c01 c32d6a9d 43911b9f c32b0db0 447336a4 c2a5eee3 432135f0 446ec1c4 c4199352 43265d54 438a554f c3a90144 441d0664 43219a20 435cf5c5 bf4c7800 431a8350 c18b5308 4292812c c4a3494c 44aa003a c33d812f 42321bf8 440120a0 c48eadc0 c1f15ee8 42f1325c 442757bc c4a607d7 43300a4a 43430fb0 444ef8e0 449bfbaa c2d99ff6 420abd1e c4402979 c4834599 c338a11e 42ccb0fe 43a63474 c384fe90 430174c2 43556a52 43b63454 c4053efd 432fb24a 42de1966 4489ff28 c4770f76 c1cdd940 438c8afa 44850e9e 4499deec c1d3b1e8 43094878 c4a032e4 44a7c652 c2a4ba13 42cf9b26 c3966e3c 449a3428 42eea250 4366b763 c3d94d38 c426ac57 c30e91c0 4312b2e5 c25f3a60 446f2a04 c0d11880 42dee120 421ceea0 c487bd56 422bb16c 43477000 c48add3d c4036531 bf76c600 42dee6f3 c46fc9cb c49ef407 40ab4b80 432a3c61 43b65e78 c4b98116 42e2a8a4 43828496 c256afa0 4458cbdc c34312cd 42bfe739 448571a0 442139d8 43277cfa 4354e1cf 43a99118 c4a40b42 c275eb90 42db58a9 c470edb3 c2c0cdf0 4312d1d8 41c1ecdc 440c30fc c49b4b80 c1fa8ec0 4359de94 c413bd51 4452759c c298a172 4362eb4b c31692a0 44a698f8 c30ebabd 42cfae60 c399423c c43eaf04 c3103206 42dee3d2 c1854e00 c4268c52 4343b4ce 4352c703 4465ed44 c46a8a54 c01b1700 437173ac c4528502 4498e49e c337ecba 41ebc75f 44b3709c c481ca9a c3039280 435899cb c45a3182 c2d65700 43123f0c 43255a4e 437add20 c4a28ce9 41c867e8 43556f21 c271cc80 c430c2a7 430aa15c 43892e39 43575fe8 438eb2c8 c29e965c 42e90722 449ea3a4 44ba2f02 430bb3b4 43879eab c2806600 c473f708 c2cdf882 431ae570 4389e858 43b962ec bf80d280 42f94606 4434517c c4417364 42d797a8 42bfa221 444ce4a4 c34fb850 c31a31e6 438c5d68 c3b3ca74 439bb7f0 42d4f380 4306184c 44217b54 c41f2c66 c2e602ea 4327409d c3eef1c2 43770e18 c2daf203 433f02c1 439eec68 4401ac90 c30e5b54 43936476 c4128625 c42c5151 c2d4f276 419fb856 c450b1e5 c3c90a34 4331811a 43903453 434f2508 c4798118 43386dd4 429dea3b c1783580 4317f800 c310a3ea 424b98b7 c26890c0 c3c5ad6c 4342dc28 42cd269d c44a4644 c36bf9c8 c2fb9616 4282aeaa 44ad55da 44163718 c3086cb3 414c7b7a c39a174c 448bfda8 42e77aec 41eca8cc c496c413 44579af4 43448392 431bdad6 c4634ac6 c49d718a 42a972d4 4161baea 43f013d0 44659e78 430f8bce 4328ea23 c401fa54 44b20354 c3350821 436f1d20 c3282490 c49b8478 c30e93ec 429de2bb 440b4fc4 4473a970 42c95f70 438513d9 c49bba4e c4ab617a c32b256e 432138b0 c45bb949 44a2d0b6 41c8d318 4353c3af c3b708ac 44939482 c31011bb 4357220e 43321d40 43cb2d64 4331a292 42fc45a0 43ea9b48 44b15e78 427eadb0 4305004f 433b6db0 43ce4dc0 4311a776 439430f9 43e54ca8 c3c4a9dc 41d207a0 42c8f3a9 442c50ac 431ad950 c23d283c 42b2622f c4ae1743 c49300ce c202d860 425a97bf c4b87e73 c4683b5e 42f5b46c 435c8126 c4407304 c47ca7d0 c303ff98 43079d00 447b27e8 c3efe6e6 c2d7758a 4374771a c4868ce1 4436509c 42022094 4358b3a9 c47ab7f7 c40151cd c28f58aa 430baf66 c470dcf0 c49bc59c 43136f4a 437d0fd0 c3c530bc c43aebcf 433a64f2 4379a50d 420d3e00 4489882c 4289472c 430ce670 c45413df 445998a4 c22c1358 43112753 c47a9c3a 44a27c76 c2ff6838 42fb9f86 c2c2cf20 c34f0ab0 c30af076 42c96cb0 c487ab5f 4440d9a0 c303af72 43941114 44b05b88 43fd8498 c31d0dab 43575f90 44576184 44b0a308 433e0b44 438ae4e7 c405ac0b 44afdec0 c2644270 4394ee65 c4632516 c3ea8924 43288d38 439160b7 43fcb3a4 445178e4 42120898 42df9eff c3e00ca0 c49044df 41961e30 429acc8b 00000080 -> bf3de46f beb5cb97 3f11a6ee 42c83170", + "43a3a550 44641234 42bfdc54 43275b90 4415f264 42324008 4204c864 44b3be9a 44858722 43091a72 436638c4 44adc7ba 43f64ed0 c2cb0a96 43765af6 c2b9bb20 c4856579 c2f281d8 4331072c c469ea7f c45f57ac c31671c6 431dc93a c46c9a6d 43d87ff0 c261baf0 42686684 446fc970 43cc0cbc 430e006e 4235a2da 448c9ba0 43380d78 43124876 4394bfc6 c44c909e 44b84b56 42d4c9ac 42b00db8 443872d8 449abdd2 c2e1be2f 43176518 c49e0466 c45a726a 42a40b10 422d816e c3e86418 42d85090 4318a2b4 4391cbc1 c3e0ee68 43eaae18 43377d04 435a95a0 448569dc c4444ece 42c5f124 43892920 c3ee7bf6 c3235e58 c2bfc8da 42db1b0d c4bb1945 44257e5c 4319c5b6 42fd324c 445fdf8c c437e194 420c6f40 43148089 c3b69004 44a06d94 430402c8 42b3c57e 44b5a550 43cc7b04 c1dcd820 43927d62 44a4bace c440211b 430050de 42b88657 443ed550 448fffce 42d9a4b8 4292bb0c 4399f1f4 c48494b9 c311c22c 43946754 c43ffb64 4484f312 432b380e 42c2398f 43e48fe0 448c736e c0acd1c0 42e39e4d c403c520 c413c1b6 c292b9ac 4210afea 44a81af6 c39001b8 421457e8 430472ee 4474d1d4 4409708c 42bbe500 429347ca 446673d8 444bba14 433cde92 4218bb71 43bb2190 44b2ba2a 420e2568 422fcdbe 44a839f8 43f8e500 42ef8bd8 434717f4 c48ecac0 43942bec c2d524fe 4321e3eb 44bb6906 42b1d650 4244f30c 42276dec c4835119 c4a01dc0 42726040 43428607 44a0367c 442ce81c c283b1a8 42df42a2 c41c899b c3e14670 c22cae1c 438a4f49 c384a044 449c0eda c2fe9fa5 4312fe19 448f6268 447825fc 428c81c4 434df913 c420baac c3c3dc48 c2110698 4348ede8 412acc00 43f6d1e4 433c6916 42deb5bd c4772e2e c4a1a452 c1f812d0 42c022e2 c4a4f0b1 43bb85dc c32c262e 435eee78 c48e7184 c3f62bfc c3040540 4386a925 43d3d5c8 c44434a0 430250c6 4337a5f7 c4299be3 448e8556 c2cfa0f2 4289c754 c378d180 4443e2cc 42623df0 426beb6b 4484c092 44a7bf28 4301a9d4 436c5091 43f57f34 44b8ea5e c312e877 42ac5bd9 4442a314 44b634bc c2fffb5e 4294f34f 44a04098 c497c454 430fafe6 436e1ac3 4481f2a6 c31d9410 c26c6ba0 43287a27 43f15fa4 445310fc c33a2e8e 41bdbd82 4302e9a0 4468edc0 c238c3b4 433ed0d7 c363c0a8 4448f840 432cf9ca 4300ae58 c35956b0 c438d07b c1b71a08 422ae374 4461a480 c41e1388 c32bc466 423b5eaa c45ea220 4498b914 c3121f25 43480c7f c4a59c7c 439b30d4 42892880 4277231d c4b3af91 c30a4f50 c26589a0 4391970f c3889584 c497e6e4 404c4cc0 41f86530 449acace 444fa47c c2d297f4 4380b2d0 43a2e0f0 41dd7400 4307712a 4394c692 c4a77570 444b1550 42ebd1d4 434d63d8 43e4c2e0 4438c980 434248c4 432b9da8 c3b8a988 c44e1aaf c27ab134 43648f50 43dc16c0 c3b5316c 434392a0 438d535f c487541c c45c8882 42244384 4391ad4c c384de7c 44ad91da c347e12e 42d4ec3f 44383344 c3c2b484 c2eff498 4187ae25 c4a7d28a c453e219 40ec4040 43533d3f c4a1c104 c485d29c 42230930 42bacdb3 446783b4 44baa226 4126c720 42b32f13 c2bee220 44606ea8 42144fcc 427d2649 443cb548 443ebe94 c1ed40e8 4324bc94 4457f190 c4189073 42ab2ce0 42fd8684 449875fe 448a2842 4200379c 421115d0 444adb88 c2e31b30 432b436a 42b7bd87 430afb48 44ad2436 3ff6e980 4260e83f 441b0d8c 43e0155c 4293ffb0 431c0a41 444ffafc 44170134 c3136751 424c1078 4406ec28 c400d7b7 3f4cc300 433b8811 c3c2c368 446d69dc 42019fa0 4394bc1b 44a6a07a 43f9b8c0 c2d323c6 43653576 4128f500 c490109b 42e5e490 42882327 433d02d8 4207ae40 40db1420 42dcfdd1 c4a16d0c c440305d 42b68094 431ce0bf c41a2f43 c3481fb0 c1131ee0 421e93d0 c4a18090 449e5a18 42cd038c 420c7057 c47b2eba 43599a60 42b22fd0 4331b8e5 c3c85ed4 44af7bfa 42b058a8 438f51b6 448eece4 44a3d4dc c2819f36 438493e2 442939f8 443ab28c 42796998 43355d2c 4487c234 c236dc20 43303baa 42ae47c3 c46cd4fc 4455b72c c32b3d07 43087bab 43961f7c 44b9d250 c291cb57 438cd875 c3f0b10c c27e7c60 4328c75e 418331bb 4499d488 c48370f2 421148b8 438bfe30 c3a05c10 c45a3d6a 430586dc 43369030 445a27c8 433d9208 c15d6c10 4241decf 44982a72 44829b0e 42e0ac1c 43283138 44500e94 4490c9d2 c2cfd742 43338629 44b4a228 c1e99900 4320f1c8 42f07a96 3ff20c00 c4200fb4 433f4ee8 42eb1e98 43e14d30 4454ace4 423704b0 42fd5ba7 c4b5e60d c40a1207 433bda56 43311502 c48033c6 4428ac44 c2f1bf2a 43475f6c 43e26ac4 c3e7b1c0 c11f3060 433e198e c4075629 44a4b8b2 41426330 436405a5 c455fcbe 444c332c c30837a8 430d7f24 c4440df9 c3f3eda4 c337d95c 4303c8de c43da73c c4590002 c1dedcf0 42238cd4 c449f15c c2de78e0 4331f016 4141e723 44a84d28 c4a3da1c c318ea82 43350fe7 448dfe5c c45d7a80 c2343804 41c9d3fa 440d36d8 4382c8c4 432d72ce 43427bed c4b5d28f c424012a c32fc421 432ccc57 444028ac c44d25b1 c30983e2 43844cee 43ba2a7c c47e49a8 c3068041 434e7dbe c4285a7c 43150e38 c288c982 438e61be c41a17f6 c4994272 c1f8bf40 42810db6 c394f614 c2c11450 4289c8bc 42a8c39f 44712914 44a5305a 4315429e 414e588b c3aca520 c4936556 42d41ef0 4346e844 c3905c20 c38fa978 c2184f0c 43910a8f c4833822 448a5e4a c26f8664 4133d31f c410f7d4 c4a268a0 c23ae2ec 436e7a48 4495be22 c33389a8 c2948709 42d2cca3 448ce134 c3344ae8 42ce604c 43371fa1 c47b4ecc 443832c4 c2d3a1e4 4328b908 00000080 -> 3f6f0a33 be724d68 3e897ff3 41c9ac3b", + "42141e00 c429a739 43148578 c484aa86 c1a740c0 40dbba60 42f9902f 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c359f708 c16c7900 41af2910 445f08b8 c35f5230 42c0cf0c 430337e0 448efe28 c3f95392 c326267e 43853c0b c3d63c68 c3b1e900 4249dc60 4327d063 c4892253 44a6e014 c271a430 426b14bc c22238e0 43ed3e58 c3047e61 438155ec c3d6f174 c3e704ec c3145663 432507de 43e26de0 c47ea2c9 41ec69b0 43829306 c3a1eabc c3a98b3c c30574e8 430a7b16 c46cef72 421593e0 426409b8 42d4cc51 44857cd0 4439325c 4311b6a4 4387be41 c2dfd330 44288a74 c1a9dc30 42e3e413 c468d756 4467d9a4 c3433bf2 4328edc5 c478db1f c44c47ec c33da7c6 433c889f 4417e734 c41f74e9 c3456563 430ce750 c418b292 c45c2eef 42d5a208 435b0a52 4442ed74 c4530de2 c0449700 4391ae05 c455b94e c46da7da c25fd70c 433e55b8 c4142466 c4b549e4 c2963c1f 43607862 445c68bc c42eaef9 c2285580 43414674 4495a692 444b0af8 c277ee20 437e20aa c483c932 c4b1ce88 429e4528 4266bd1f c3d05614 43182cc8 42c06654 43870553 418eeb00 c467a6a3 c33998db 43465e31 44b3f53a c485b454 c30f4a5e 42a1942f c448b322 c28bb820 c30ea412 413dc92f c318e640 c3a4e504 c2cb8eb2 4257e396 449bc838 c42044ac 4300b3ac 430847ba 44933996 c3bc35d8 41a76f20 43227273 44878458 449f754c 41e73990 435ee039 42791480 c40114fa 422e8dc4 434aa65d c32c1f30 c2db9220 c319a4ed 42292902 44b4356a 43f3fe28 42cfbb58 43469f79 c48c81c4 c482fdc8 c220aac8 43047ba2 43befd30 c3f2104a c22b8af4 4365f715 445238b8 430aa0b0 c2c8ca8b 41fd894f 442bba50 c412363e c3465ca5 42407500 43d036a0 41f7dd40 42e68864 41ced32c 43559768 c38a6be4 42b2ad04 43882766 4489db42 c27af220 41cc2378 4393ea89 c4295d45 c4892c02 c3039238 42a6995f 429fdd90 c4768085 c297e490 43612767 44b21a90 c48ac30e 431f5766 43219949 42c29dd0 446b5160 433580f4 43924f34 c49deb8c 42cdc6a0 432e22c2 42479657 c2f42480 44b5ac40 c12fc4f0 43125dc7 448c6f9c 4419bfcc c3284f2d 435a1a51 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000002e -> bf0f4e2b 3f1981df 3f126843 42380561", + "c494216c 44b3d4e8 c2c5793c c38b43ac c23c29e0 4269bd50 42ed945d 44ba1862 431077c8 41b87280 43954350 c4325c70 c480d16e 406252c0 433b78f7 c42ff0f8 428560f0 42cdf3b4 430da5f8 443a9918 447438f0 c28557c8 4327afe1 c35d5880 429dea20 c2a8395a 4349e28b 4416a1f0 c3b69bb4 4300a87c 4212d728 438ace9c c40b1382 c100d530 4330d11d 443b9628 4439f14c c315e36f 42d312e0 c4103ef1 43951d8c c326f31f 4393fd84 c3b77354 c48600cc c2f24cee 437a1ced 44ade2c0 4486586e 422e88f0 427c031c c405a8ed c43145db 428ed68c 434c237e c450f014 439cbc10 c272382c 4384b8b5 c4650cda 44b5a7d6 428b6f5c 433d37c8 4429e20c c2cec8c0 c21c31a4 438e67a9 44047620 44a29a94 4310be56 43201253 c39a92e4 c357fe18 c30d7c28 425549fb 443640c8 c3e53a5c c305949c 42b876f3 c4001a9e c2e58900 429e61a8 437e59cd 4449e1f8 43d05074 42d840e8 42d2c35a 43cc06ac 4468d1d8 c269e5ac 4250ecfd c39708c0 c43fab58 c312109e 42cf7d3b 449f6b30 c2d433c0 c2c04be6 43894385 443435ac c43bdf32 c30b74ae 4195cc2f 44ba25fc c49926c7 42e4a794 43869947 c48f7e88 42aef6a0 432a9368 4383c39a c338ad50 c4a31ae6 41a54240 435e8732 c4202be1 4478c754 430b86c0 420da7e8 44126a0c c49ff238 c296b7c1 438298ef 436f6340 44222cc4 c318ba9c 4258e956 c41b205f 447245d0 c2dc9565 42b5748a c49aab03 c4389613 418a7f20 420470e4 c40e365a 43fbd668 430a7a2e 434e7f9a 44846590 448d3322 c2e6c1e6 4223f434 448ffeba c2750c20 42a5bf68 42d5de8b 44109924 c39306d8 c33945ba 42145b89 43adb9c8 c47600f5 c2e271b8 434b5f6e 44a4368a c4211f0e c19f1308 42b67e89 44b1882c 43c7f670 4220fdcc 42beb463 c412551d 43de1a48 42e558ac 427e15bd 4282a350 c2a84870 c1f816f0 433d60e3 44b6111e c47692dd c2d456bf 43776b47 4487b8ac c45d70c8 4340e182 421c404c c4b81b57 4454f0b0 c180ebb0 438638b3 4456a890 c48a6d8d 42820b0c 4389c179 c4ada5bb 448d2dd6 c30f48cc 418a7de7 c453cc57 43461790 42a35474 4293746a c42810b6 449c768c 42f192cc 429cd527 4410ac1c 4287c5a0 42f9fcd0 42941707 44b3d0f8 c3752e98 c31cd708 430aedc5 44a40830 c3989cc8 42f3e738 435e9d77 c413c5e2 c3e0e410 c2b71bd9 4281e8b3 c474cd8d 441d13ec 404f8ac0 4271e04e 44b61164 448b2c1a c30cf428 434522bc c3fec11c c39a1c28 c21e7d50 4303a644 c2c59050 c4b5f09f 4188dff0 438dfad9 c391d4cc 4438b684 c21449b0 43170fcf 44b0c9d4 c443d96e 4324ab42 42e96786 c4b2e3f5 c4538562 433f415e 434337be c4a0a68b c3890cb8 42b1cb48 4382cab3 c419d000 422ff820 c33589e2 432e472c c3884ef0 43bfe744 c2c7ad4b 4378503b c3bb7b04 c4799bb6 431c45bc 4332da40 c4b50075 440d507c 433f00f4 438ac69a 44854e90 44871242 c287b2ec 432b7054 44a60842 44558548 c2e18ccc 438c891f 445f52cc c486efd2 c30b922f 4368965b 44935ed0 41d668c0 41ebd480 438a9f33 44034358 42c87c90 c3162c9f 438f1968 44afc0a6 44b29c8e 41639730 436ab463 c145c180 43805318 c31b6ff0 43733b47 c3e3b85c c3ffddd6 c26f0624 42d60871 c442a72b c4a6ab86 42e28ebc 428e9de8 c49e274f c47ad506 4329e928 431df6eb c4188c7e c491b734 42d6f814 42afff12 c28ad230 c24da9e0 432b835a 438294dd 438c3cf8 44afee7a 4322e4a2 431655c9 433f9088 c4b21656 4335913c 43847b71 c4038732 43269930 c32fad87 42e32d7f 4401f728 c38146bc 420a7794 4311d1bc 44592b3c 446d664c 412d4f90 437cdb9f 44294d78 c3ce9130 43094f28 431dbe55 43a2f4cc 43ab8338 42794a90 43814d10 c45b4f76 c42f0c76 c2a19d9d 415c681d 43eb2688 c43f0119 c2e76574 42efd73c c3696e68 448982ce 42d88c40 4290e8f2 c49563ae 449780e8 431ab62e 4321970f c49437d5 434ab8d0 4306c62a 43850102 42954c40 c415b927 c103d5e0 43497eed 44aaeb08 c4993f33 c30fdcf0 429a1918 c48c4bbc c399575c 43161c54 438eaded c3c40f38 c4973fb1 428947f8 41d69fa3 c435d5f1 c4a9947a 42a0594c 43061bba c45eb442 c45b5ed2 c33589f5 438ad0a9 c4aa4e96 c40d362d 42bca674 43784d0c c292f170 c40696ac c2187764 41af4474 44500e0c 444cc414 c2861b8e 43888be7 44576698 43ce799c c3311aeb 432df92d 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000063 -> 3f3caf1e 3f232e8a be65fe11 420199bf", + "c3788358 c3979f20 c2a787d3 4470e0f4 4481c690 c3460441 429acbf0 44769054 c4301ef8 c33136c8 4382bc2a c3888964 4406cb22 c2921938 42a77208 43299d40 43abb938 42668080 42e234f0 c40809ee 443fc540 42f4436c 4394fe89 447aa8e8 c475eb89 421a0934 4367a5f5 444649c8 c42be156 423fd804 4394a133 c488defa c404c4e7 c2dd3126 438f6167 c4b35960 44a1ca90 c2dc4245 431109d2 442d2404 4385faac 426acff8 41d0793f c3e46284 c4748e4b c25282a8 4214395a c4b5e118 43e58058 c2d7783c 4185bfc6 c3823d6c c45993e6 42e518a0 4295d64f c31c8378 c4afbe1a c3091e17 43463a96 c43ba733 c442826e c14ca600 432bcc62 43d9e790 c4a2981e 42b9b3ac 420bc2df c3035b28 c3cd74f8 c2d603fb 433f4709 c3a54a88 c4713078 42477ac0 435d7ee6 c492a61e 443b76e8 42688348 43497bc0 4463c1b8 410ed780 42c773e4 4229346a c4ac704f 43911a1c 41f79a90 438b243e 42dba010 44bb5eac 4026e480 43949b01 444dad8c 4362d590 c2e3512b 43182878 c48e039b c49a3018 c20fd43c 42b72b95 c32e9af0 c4232d72 425b54c0 43471180 c36e7068 439e5a2c 42556100 429c290b 437faa48 c4a618d3 c31a081b 43546255 c3aaf380 c113e800 430a27e2 436293e9 c1cfe240 c3d70a20 40e35a60 41c099f1 c2038780 44664280 419e11e0 430e6725 4485b0e8 c4416d30 430c57d0 43761dcd 44ad75d0 c4891275 422cccac 417d4844 c3f03b3c c3cc02dc c2e13566 43212946 448935d2 c496fdd4 4298b0c0 4308085a 44adc3ca c3ec1310 c2801600 43151045 44904646 44677b78 4226f5c4 42b4d843 442caa9c c2b9cc30 43478b7a 4367c006 43553618 c3cfa46c 42e9d4bc 43421675 442ec660 c46f9c1f 42ec5c3c 4276f84b 443f0870 446f6020 c2b63db9 430cb77b c318c658 c497f194 c26326bc 41832200 c4262d92 c403e461 43185ed2 42f8827a 43f8aa74 c49c5000 c325ef62 4251d989 c2c54700 c4a14cbe 41e5dae8 41bf0cc9 43ce9f34 435c9de8 c3266935 43191f6e c488a538 4480c10c c1a317b8 4392d987 43571c80 437b1cb8 42e691e8 4350c225 c4149221 42154a00 428fe860 424f4744 c4a117d5 4491edf2 c33bd177 436f134d c3142978 4376ee18 43478e42 42ff8679 43842960 439d51dc c32072de 43177dfa c427b15d 43daccc4 c304ef20 434a516f 43a30928 4439b024 41822868 427a28b9 44306564 445100fc c293e45a 4339a975 43daacd0 c3b45d80 c19eec90 43537868 42d796a0 c46455f8 c3232b5a 4259decb c39113bc 44a55bda c3299937 43319ce1 c4acb85e 44536f9c 421b9b1c 41d09db1 435ff300 44056bc0 43222aea 4323e994 44375978 44acec76 42a17dd4 438b3f14 c37be1d8 c48c9b88 c32953a3 432ac0d5 44b0e994 c0771600 c2119530 42bd368a 435e07e0 c361d448 c30e58e9 41f462e4 c48a0283 c412e086 43140f06 42f7aea4 4219a3a0 44a71404 c32626ba 42d69008 435196a0 438688d0 4246013c 4379c3d8 c4832049 c23129a0 422a6f58 41d4efbe 448bf844 44554d4c 43108188 43508cb0 44056b4a 4292fe60 c2b10d19 43012817 c48eec94 42e287e0 c2febe75 43882999 42bfad10 44553160 c34669fd 433c4288 43ceac98 429e62a0 432962ba 42b0e1bc 4466cf94 421a5cc0 c340d40d 4371b021 448d30c4 c3c861f4 c26670dc 4379a432 40785c00 c43b91cb c2199d3c 431717fc 4493125c c3de6f24 c20268ec 436efc79 433e6048 c2f32190 c22b41f0 433a2aef c4b1f21f c2f46dd0 c2b50d00 439261c9 4445fa98 c46ff5d6 42f2ce30 436dd35c 43809644 c4b819e1 c2f8ce36 433ef0c6 43395128 c3f5f228 c2c85bac 42e50698 4447dae4 c4a41f49 42f6843c 42c8a8a2 c4789b4c c30efda8 4323d626 4382ffdc c48956a8 441247b0 c3430c87 427912b6 c3c95ae0 c4563b67 c33381fc 4276d55c c4897662 c40a0212 c2cbfe61 42de1f33 c4439e03 c4ab6b6a c33a04e1 4353f8d2 433cb6e0 43531b50 c2cf8001 4318bf24 c4a4a83c 44520b34 4329e730 432b48f5 c49530d0 c4a5b5f5 c33ebf0d 431b52fe 43e2ffa8 c49cf196 c1c35bd8 43303606 431502f8 c38ee9a8 4308837e 41efebef c4793e5a 43b8e838 c20040a0 42eb64a0 44abaffc c4b77de9 c07337c0 42a28de0 c4995d4c 44966660 c31783de 435bd77e c4b13ab5 c4919db2 42c6dc54 43377713 c4583768 c377ea58 42f67020 42e12638 444ab638 c3035518 c328c4e4 42c6712b c467952f 43165690 412c9f50 41c88628 448d63ba 4400e65a 42ef0d68 437bfdba c45fcd60 44aec1fa 413830c0 438d3f31 c4830d72 448a78bc 415c2380 41c4861c c41dd4ac 44063b1e c15f2ff0 4288a21c 44a3d5ac c41657ef c12821c0 43267f02 c3faa374 447f9898 c25db640 42417a7d 43910420 c2150f20 c2a1149d 43585240 43079518 c4916e62 c2ffe26f 43003d2a c24367e0 c3385a20 c252025c 43038e91 c49527e8 c41fee11 410cc500 41de5f97 4378bb90 4467b4f4 c1a79650 42da9f8b 448f9ca2 44415dc0 c32e5762 4211eac8 44b8292c 448d5e9a c24ec61c 43864b33 c49edb33 44b6bfb8 42af3be0 41a41619 c40e2c38 43f9c278 c2d1c7bb 435910bd 43fb0e90 446dfec8 c228e5b8 41a8f4bb 440dd5c0 c48bff15 41d4d4a8 4380657b c40e53c8 c4aa4356 c32076b3 434689d4 445028fc c3837528 4336b13e 4321f32e c3a04058 c4b46248 c2c88654 437d44a8 c365b468 c45b7e70 42b04928 434bc7d1 44351018 c41ea708 c286ee2c 4319f3ae 4424a158 c3fb3ff4 c31c8286 43085dac c4a92169 4466fb88 c2299b00 436804f2 c3803ebc c3881238 42755850 436552e0 c4678418 c45725b4 42e0dcac 438e0b3c 44509bc4 442579bc c31a58a7 434a90fa c4b00672 c464b131 4264ece0 42bd0c00 45a00000 c5700000 40e00000 43590000 0000007f -> befebd2c 3f0d4024 3f2b59f4 421d4259", + "4429ac40 c4184e39 c21ef5d4 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c48a2fbc 44b32618 432ee55e 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "43b85ff8 4448809c 42dc033c 44b016ba c4b49cf6 c2f71517 4226f9d0 44b57478 c3c98bec c031c800 4345c9a5 c4594766 c35d3550 42dc2e78 43860f2e c4b3b4d1 c47440cf 4285da2c 431113f8 42929430 440e10fc 42fdcfec 417638b4 43e11978 4250adc0 432d9632 434be5e8 440d3464 c4915d71 c2c5d8f0 43905672 c48e0df0 c49ce31e 42f2ad88 41449c7d c4905b5c c48eb13f c30e2ca0 43453d8f 447e96e0 c49b64f0 427eb7b0 438b3e9b 449f0a44 443c8808 c327e219 419e5639 c405b15a 447c1ff0 c2b315f6 42974419 c48b7db6 439c81a8 422b5114 42bb3807 c48e826e 43d8c568 43346eaa 430d21db c49bd9c5 428732b0 c1fc31f0 43835ed1 c491254a 42c0a2a0 4128ad10 423d3f0c 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf75d3dc be186be7 3e71c0c0 4396e137", + "c4b360c8 43bd8024 c1c3cb10 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "41db86c0 43ca9e8c 42766c48 c498125e 44958258 c1c94968 43878775 c3e5b180 44840a3c 43067ca4 418d2daf 4479b1bc 424a34a0 c122ced0 431f5c7e 449177e8 c2b0cb70 c304a331 4352ca98 4337c688 c4094f74 42838a78 436e6d42 446aa8e0 c3a1ff9c c2dbfbfb 438efc8f c385b9e0 43233820 c32f8a30 42ed693b c463954a c4939cee 433f339c 426b2dff c4356fab c44b997a 41a01fc0 41c98b32 c4b5d81a c46cda1b c301bc38 432f08af c4ae42f2 c49b08d0 429f581c 414c1a8a 43e72628 c4930bc0 4317c4b2 42c4996b 442eaad8 c3f3edbe c17d70a0 42c775d2 444dca94 c441176b c3289357 4355b7b2 440240ec c22e6700 c0884ca0 436fd094 445a3790 c2e7c6c0 4303ecfa 435cb3d8 42e91450 c41145d6 c2c26fd8 4349387f 449daf92 c48ffe63 428dd768 42eeb20a c4868746 c497bf02 42c9e698 435ca0dd 44109d98 c4555d37 c2a1f96e 42c3b93b 44033d38 44408070 42632180 43819492 43daf2ac 43fce278 c229cee4 41681b7e c483429b 4482562e c2420d18 432396ae 44122260 c3af3440 42de804c 433070b7 c4366df4 44b13b80 c13bc910 42ddb8ce 448398ae c451f879 c2399f50 433ce4a7 43f01e60 c49c3f78 c304bcc2 434eec48 c1ebf380 c3dd9d88 c344237a 430edd93 c46a0c98 c46b370d c3190223 419f8bc6 446f8f74 44b07d60 c327c30f 43832fee 449aa992 c441f09b 4070ddc0 41f9333f 4431f95c c4841e26 4291c5b8 4365d665 c409164c c4712ac6 c142eb00 435adbb9 4437a458 44a8a6a0 c1997250 430def37 c3bef9c0 c4b217f4 c2f0b92d 432d2963 3fa65000 44211e6c 412260f0 43715678 447d6ee0 449db5dc c27d4f4c 431d7481 c42fb61e 4436e128 42cb9d5c 42b9f34c 4493025e 43969a48 c1ced650 433ac209 441df908 c40db573 4317d466 431e9811 c3945098 c386dafc c25d1370 42c8cce8 448f8464 c41de91e 42aaa410 429e27be 442fbfbc 43f3cca0 42814888 43705b0e 444ba85c 42579fe0 c2504838 42869cd0 44220808 441ec4f0 c2d3fbda 4376da9d 446580e0 c474b014 c0440a80 43304792 c3643930 c46d6ed6 43034542 424f911f 422c77a0 448073a0 42c373e8 41defa19 c484ef14 440c06e8 c3076619 4210ca66 c3dc80e8 c456c3d1 4326006a 43290d8c c45b8e15 c494b1a9 42db4e9c 4338ec7a c49ca96b 44ac9216 40ba9880 42ecf3d3 c44a1104 c444aef1 431d6328 4395d894 c49efcac c4a3efb2 42a51c60 4297e078 449ca868 44585658 431b1ea4 4354cb43 c2e857e0 434e8a58 42b30fa8 43864f67 449cd4d2 4395f6dc 426e1cd0 420a6a54 c3d74d28 c4256280 4309d816 431bb1cf 445e8428 440bebe0 422f2a18 4355bb39 c396938c 4491ef10 c062c000 43107bd9 43fd4470 c309a380 43258cec 42b4700f 44a866aa 44380890 43423cc2 4207e69a 44b41e28 44a2cc66 c302f78d 432db809 c4029d47 c45536d4 c325208a 434323cc c3b483f8 448f609a 4293f988 4315daea c40d7957 c352c9f8 c340f6c5 438ee880 c3a04834 c3a363e0 c2ee3346 42f5e4eb c30bec80 c4ba0ccc 43031a6e 4192588a c4180508 c363d050 c33bd276 414133c6 43e874bc c31e5f08 43311704 42707e42 43ab9304 43467118 c31e3078 43047a46 c493692c c424f409 c3016188 43327b81 439511c8 44b0a632 c28db522 43200295 c45ddbd0 c4b82b2f c30b0d66 429eaebd c33e68b8 44ad8b5e 4319637c 432bd1a2 43016288 43902e48 424ee728 439295bb c4939c62 c485816d c2ba3518 4387c246 c46c0c38 c49d7d73 43416082 438c346c 44a4db06 42118da0 43132686 43621d31 c403179c 438ee154 4309acb6 422b2d1f c4561b0f 43b5e9e0 42e81314 4315dd85 4407c038 c40e2378 4301c378 42bb4924 c42b3af5 445a80ac 41e20050 4352bbdc 433f36e0 c3ace838 424f8980 4174bcb8 44a3cff6 c48b7866 c2933a3c 43909f90 c4b6b122 c428edac c226df90 43209cc6 44b6dbb8 c3a45f2c 41f88428 4352b277 c4869f4e c38b4704 43258f1c 437df864 c48f068c 444aca98 c27a7280 438aab2b 44658544 c4845e10 c2a3a497 4370cece c407515a 44b38e72 425025e4 42f87b26 41e1a100 c41c8eab c25210f4 432aeac2 448f6834 44831af0 42f6b5d4 4286560a c42588bc 448ef9aa c31fe53b 438d4406 c44dd244 c42bf1eb c00864c0 42bc89aa 442e9d90 c489de6a c30d0890 43825be4 448d8a2c 442c02ec 41eb7a90 43701246 c4ac0738 441be4c0 c2e6364a 436f0bb3 44797984 4270eb40 42655950 419ee3e8 43d90124 c4bad5f3 c34404ed 4353f225 c4b35bd2 c4b2f598 42f7b654 42bd0215 4394240c 44229324 41c65d58 429da6ee 43ff30cc c3907090 429d065c 43253bbc 43e485a4 c4b9ad0e c32ec5ca 42809762 44788cf0 44472934 40d31de0 436c371d 4423409c 436213c0 40ae70a0 42727d8b 43ce1188 c4b488ca c258cd80 43662bd8 c4448e89 c4a2a754 c2a3ecc2 4295cdda c43368ad 445fbaf0 c2b8e6fe 4357e9c9 c404f7c4 44858238 c2bb5f72 42626175 c4797af8 c3f59db6 c316b604 4342e3cf c4b7289a 4404b5ee c311039d 437a0d8f c300f9c0 c303a678 c2edeac4 43847900 c230aa60 c44a935b 433f7a66 430b711c 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000072 -> 3eac3ff1 bf6f7389 3ddfa6db 42a86a0f", + "c2a51d70 c4292024 430d9dce 44631550 44bb4710 42263130 4225fdb0 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "43a90a28 c3b1e114 c19929c0 4488b1a0 44b24442 bdc16000 42e2603b 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "44aca96c 448eea98 416b1190 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "4421c674 43c094fc c2bc7d4d 44885eb8 c37c1550 42bed160 4197a990 446fb574 4471e408 c2ef47f5 435169a7 c45f7e53 440b32e8 42f6b958 42e7751c c3f4b9f2 42683a80 413934a0 43265681 c39253e0 c4226ea8 c3234a0a 42209f76 43896648 c44c949b c2410714 423e2ba7 43afcf20 4391ec10 4345af94 43419720 c2a76ca0 44112fe8 429f4290 43768197 3fdca400 c453ccf8 42c02c68 4352dda5 442f7808 c4404ad1 c33a3a70 4389740a c4827413 c47255b6 42dab1f8 43761ba5 430e3f28 c43ceaa1 c3362c91 438c40f3 c3e54ad4 43b9d4c4 41b98bd8 43375443 c3252480 c462562b c2f7d564 4342905e c4adc502 43a398f4 c20a1b7c 4294f39a 44763ad0 434b7c60 c2e392a1 431d718a 44b67240 44b8d32c 43119a58 42325479 44515a0c 447c3928 42f41c34 42604083 c43c4116 c471453e 4334be92 43024446 c30a6dd0 434393b0 42034454 42ea132f 431e2668 c4a476ac c2ab4134 437ffb01 c488a670 c4957ab8 c24f0fe8 42c35dec c4b13a75 c4949436 4279a450 4238e060 44777210 446a1304 c325ef24 4333721c 44ad01e0 c4304aed 43030e8c 432ad1bc c3add80c 449f7e38 c30a8a64 431e24d2 446f0ff4 c3974834 c2721798 42aea7aa c43e3b7c 444e9f18 c2fdf19b 4312b663 c4b15dc6 c4aac78a 4287b0e0 436864dc c42393c9 c3c70300 c24b7a5c 43855837 43b76b98 4338f3a8 c32341a6 434dd9b4 c46fcbdc 44072ee4 c288df22 4308b31c c498926d c3c6a6e4 c1953f98 428191f2 443229a8 c4b130b6 4341ff0c 433ff250 4498eb12 444e5174 c33c376b 435f925e 443d859c c49485ca c331999e 42a6197c 449df50a c46c8c0c c320da14 436dbf96 c4861167 c408488d c29e14be 43364498 44930b36 44a5f0aa 432ce85a 437882f3 447a1788 c2822fa0 c2878b6e 4248aa99 c4a12975 449a6c84 c3029916 43846cbd c4056600 44b91f02 42bb18f8 4395ee94 c4a526a5 c4ababab 430fa336 431cf948 c3f33330 43cc8edc c313063a 43205199 41879e00 447ef8ec 42cb4d38 43955f2f 43771f20 4302b6b8 c2a478d7 436ab50f c4a31000 4486bfec c2a28ff1 43709006 c497ca8a c47d18da 42eb2824 43068c92 c3266f58 44929b84 4284f9c0 437ddc55 44a169bc c47217fe 432be776 438b7f22 c313cdd8 c4969f64 42b497ec 421c513e c2f4d490 445db1c8 c2c3124b 42a854fc 44688d00 c3811b70 c2928ecc 43950e74 442821a8 c3f7a5d2 41b39f10 4322bb81 43b014a8 c3980578 42fae65c 4310367d 4413a4f8 44a48f8c 4321b90c 438712e0 c43cccf5 c3532850 c32f1615 430b9ada 44b04ea6 c41c5843 420ca634 42d27f1f 4499d376 4474ec54 418fcb50 43165eb3 446e5f40 c46565d1 c2937950 42b05a5b 439ac1fc c4ac1af9 4341fd82 434f9357 4481a682 44615704 42a43e58 422728d0 c3f7c47e c4872aa2 c2dd30cb 43243784 c3cc9fe8 c2c64160 c2d76fe4 431e73b5 c46579bc 447682dc 430ccd98 4194a09c 442efb30 4467ef78 c2ab86b5 43205f79 44748460 44b7229a c326af19 43872753 44597970 c4a076a5 42a7113c 4304be22 c49c6080 430426f8 430fda38 43482f18 44aa31e0 c44fbdae c333783e 430bdd9e 44283b7c 44a9bfc4 c31b29ce 437adf7e c4a1fd42 c4a67424 4339f18a 430a8a88 438fca74 c4af1ce6 c2a7ffaf 43946d2b c3ecce98 c420713c 416819e0 43703cf6 443f9858 c2c94f70 430e1be0 438151ba 4422df50 4466c51c c29046ca 42ac614b c34fd5b8 4461321c c1a3e148 4377aa1e 43a0fd54 4360b0d0 41b9c2f8 4391cc49 44500450 c38fb51c c29bc883 436c6304 4413ddd8 c3070360 c19e6758 43694552 c4b2afd8 43d21130 c29e997d 436582be 4453926c 4424c3c4 c3278d19 43711b2e c4b894a4 c4a2dc2d 43202380 431758eb c3c663e4 c4658945 42b88508 4389e8cf 43c783c8 4483034a c220333c 42af4e20 43a1010c c48500b5 43065e18 4180a2c3 c2961c00 c407c3a6 c2e690fc 438d0019 44b44d5e 443fb75c c3214ad8 42c244f8 c4b584da c49b7c32 43058c8a 42017512 418ea000 433c2998 c0f7f520 43583345 44245aac 43e3cdec 42f965f4 432711db 4402e9a0 c4a101fe 42253fc8 43332feb 440228b8 c3a704b8 c30cf241 437fdbc6 c4a6d46a c46df398 c306f986 438455e1 44641828 c42468ed c2ae7048 43104da6 41bd7600 c485cde8 42fce3b8 42a64135 44afd9fe 4395d2c4 c136afe0 42b7c5d6 c3d1e190 43e64bfc c20eec00 41f3120c c3c4e420 440da12c 419b9c90 438f8aea c3f9a1fe c41a4694 c275bd04 42fe83ca 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000064 -> 3f4c9bbc 3f0cdaa7 3e779921 42276bf4", + "c4044615 4413dcd4 4232e030 c43c439e c43efdfd 4305498a 438aceb2 44aae2e6 c42a4170 c2dbe014 42b6d898 c4b4eeb6 c45ea4e2 41f30a98 437c5ea6 4332c0f0 435a0c20 c32a2201 4337c3ec c406508d c44f81a2 c33ffe8b 4392cea3 c49e7edb c27b6a80 c255f334 4341e3c8 c45bad6c 4305cae0 407b90c0 438c7bef 448d9b20 44398f98 4317cd70 43846d11 c44f079c 43d84384 42aff70c 42e1a1dc 43cf5b00 c3d2aa0c c218fcf4 42f0b663 c46bdc8e 445923d4 c26e09e8 4316da3d 44b1411c c48e9bf5 42db31e4 435b44d1 c42b30d7 4464dbdc c2285774 42feefc6 c43fb833 43ab41a8 41441c30 436947ca 448e2602 c461a9d1 42ac9204 43013804 44455fd4 c41ce9be c21af474 42b0a845 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> be10a545 bf7c4cfd 3dbf72aa 423e6583", + "c3b3d068 44799828 c33c0643 442518e0 44acdb90 43388aec 43777e49 43d13698 445b58d4 c2a9bd60 423c4646 448eb7f8 43f222f8 c3250b78 436979a2 44582858 43f3f108 c32b02fe 42e08639 c2995760 43c9a3b4 422fa9b8 422bb2f5 44a8c248 c2932520 c1c2cfb8 4344b6fe 44b8fb2e 43b00f34 431de4e6 42f417bc c49d13ce c47d73da c2b393db 431d4b58 44867828 448a557a 41a52be0 437ed0c3 c347b5d8 43812e5c 4227d668 43784ba1 c440e329 43d52a18 43476450 4325ee30 43c07ccc 43d2be44 433dfb74 43402a39 c3fdf9f8 449c8d30 430bad3e 41e184f1 c4babf3d 44626800 432114bc 42a1e630 4282fe80 c408dd9f 43024384 4183472b 449525d0 44968c06 c3355259 435a5ee8 c3ab27c8 436e6df8 4324cebe 438a4d26 c491dee3 c44bca56 4327ade6 4385ce87 c4b06d52 44580f8c 43144966 42c69717 c28a05c0 44968950 c341cad4 42e09de8 43d5a040 c42f108f c331b9ec 4265d763 c40c58b0 c4576598 40172180 41d39125 44aed20c c410c73b c28e1ce4 422e76db 44435898 43786338 432997aa 42d9fce2 438f1ee8 c42507b5 c30b4838 41c1540d 442b5b80 c4a6a2f4 40db6f40 421ec98e 44bada28 44acd378 c33ab8bc 429013e0 44a1af32 438e2eb8 42d62044 433deaa6 c4148150 c2a2c510 c24080ec 43410858 4481aa52 448fa3ca c216f674 4270c975 c49fe8fe 44853dac 433540b0 43732c9e 44983860 446375e8 c314db08 430b8d63 44888998 42b02690 42aa0010 428647f6 443b3a08 44af0066 4246e5d8 43342aa7 443b13ec 44a9fb06 c305d8b0 42e02940 c4704b37 c41c047e c315c782 42eb696d 42ebd440 441777bc 42fb23b4 42bacd50 c45eaac4 c41b5fd3 bfe21780 435896ac 448c5dea 44b38372 433e1c34 43839bfa c4950f9a 441fd210 c2f2d06d 4285185f 4479c19c 4381b228 c27046d8 42fd0b3b 448f5ba6 4353dd08 43144e7c 42d67ca8 4482b5d0 445bad88 4318af12 43866954 44233de0 c4a761f3 434564c0 436ca9b8 442c516c 43753230 c2bc3457 428a4c86 44b78236 447f3418 c2cd1a54 432faac3 c4aed5aa c4bb73e8 c28dd1f4 43699211 44b845f6 443c5b98 c0c94040 41a450e2 44409974 44b065a6 40f31e20 43360309 44a5ce5c 4427d05c c08b5ec0 4391758a 44786490 c2806350 c1c31b60 4300f5c0 c385502c 439aa31c 4345e334 4377fe2f 44b5f4fe c465bda2 c30ea2cf 43210620 c31af380 44b8b1ca c2eb7de4 4394f266 c3ebbc80 4450ebcc c25328c8 4384e9db c43d13e8 c4960ffe c279b78c 421900ee c40f87b5 44818332 c311b8fc 4362b4d6 42cfeac0 c3957d9c 4307c75c 413bdd8b c498c473 c418f456 c24b9014 431e1e68 c39422f8 447a0fa0 c307f18e 4306e5e6 c4b978e9 40c5b800 42e49250 43715678 43a199b4 44add07e 420cca1c 4367a430 44469150 429d89e0 c2c7c22c 4265c323 c3d86904 43a06cb0 42b0a144 435e17f2 c488ff30 c3ed94ec c31f5e2e 432e11de c2c39cc0 c43d6892 c2ab30aa 43339d6c c3daa6dc c487f929 c1e5ea08 4258a7b5 43b39e40 44122924 42126444 431dbbeb 43b1a164 44a400e0 4316b3b2 43624aeb c40b6925 430aa1a0 c0840dc0 42dc2b9e c435f859 c3c0e170 434100ac 4146f586 c4833c62 4403e4de 42707248 4316d830 4361d1e8 43d41fd0 c24645ec 41da577f 442de034 438d9324 43395062 4365ce59 c454f6ef c4605f9e c1b4d9a8 4312653a 42d41eb0 c340e2e0 c30e2f9a 41f21cbd 44a3091e 4434a7d4 41908980 430354d4 442ca56c 44b21b44 c2046b50 4334a79e 4483f92c 4440581c c2994ace 421757b6 c43049d4 c426c9b8 c1d081f0 434eba71 c21a7e00 44a5ee32 41f67320 4392db95 c407e617 42bf3040 42de1320 4187c421 44b1c586 c48ef2ea 413ea720 422b68ba c494fa4b c4b43dfd 42f7d07c 437848ad c44cd777 449abc88 c32a8bce 4300a84d c48a7dae c449142b 42cc6170 433817f4 c44eddc9 4457b600 c2e9d6cb 43926df0 c420804c 4489bccc c0331f40 438d1290 44477ed8 4446d54c 43414806 4335eed4 44868226 c47a5876 42c8dc08 42fdae21 44adbaf4 427d91a0 c1b227c0 433b4dbb c3248440 c41308c8 c0b68be0 437b7256 44a78252 c21f6800 4313a494 42e05836 c45e0396 c4b1deed 41989590 42a808a6 c46abef5 44b2c284 42cb5220 43240b53 c403e09a 4462a9d8 42be6e50 4223d6ba 43bcb330 4389099c c274561c 42d7d11c c4adf183 c45453fc 4339311c 41dcc239 c47dd534 44000da8 c1ad2cc8 433ac5bf 4457ad24 c48577f2 c309ef75 438a6eb7 c41497cd c3bb4f5c c33c86b2 4371cab8 44bad280 c486be42 42bb8f54 4360b111 c453edc3 442afac0 c2169d00 4384e3b3 c383eae8 c45215a1 c32881b4 4262d535 445451ac c3f3a588 43423c9c 4380cd29 44ab3fca c483f429 42ed2390 435da3fa 428e6b70 44675398 c2f763f1 4324a3ff 436f6290 44a44bc2 c14ef640 41b393f2 44712604 447a7200 c2d88d1d 438e9c40 444d2664 44a4889c c31c92f6 4316aef3 4485d738 43a075e8 c317ecdc 42c6be4d 4469459c c49d2199 426dc980 438d8ac0 438a01b8 c421628d 43029656 430c7ff7 c48010c4 c414fb1e 43396c7c 425a5a69 436c1bf0 c416d52f c2b3903d 42820f2a 44a8b896 c4601861 c307caa4 42b5ff57 c433c462 c3cd950c c32fd065 4331a836 44b7f756 c48add24 c233f3ec 437edb7b c44b3f37 3fb71400 4346c1fa 42ded218 c4b1061b c20d0e00 4327819c 430a6600 c47f22da c43c2e1f 43307ee0 42bf15e3 c491a12f c4b4e062 4319c596 4320d99c 448ae34c c49f2a69 c24f7740 4313a58b 43f4d0e0 449d0d86 41613b10 43482754 c320a460 447fa928 c334da59 430bf1c2 c4b3ce3b c4a1110c 43346fde 431011bf 4494fbe6 44b4ccb6 c2df3421 4348d30d c412a6d1 43aacd8c c315ac69 4210ee4b 00000080 -> bf30579e bf25a21a 3ea7646d 4072c6c6", + "42f1c120 441bd1f4 432601dc 4489146e c47942e6 c2cde1b9 4314c501 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c487bee8 c451a12d 43364afe c46f27fd c40e5a43 433a1d20 42d9e435 449736de c46ab55c c1beca90 43127f69 c3694ba8 c49a0061 c2a1997a 4314e3d7 c3997930 c48aede5 42ed5574 429751fd c455380d c436a02d 4333e594 42b65406 c4980e1c 4477d048 431b8c28 437bf715 c39c65d4 4372b840 428a9560 43738385 44b0168e c26d4980 c25ba23c 41a3b14b 44183580 44b5a6da 42f0ce4c 438910db 44108c50 44adba24 42a88118 438d1ece 43e11eb0 44998a74 c20f1b94 438d636c c391c1a4 4452c6f8 c14daf80 41a875f7 c3220ee8 c439ec85 c28c5522 430cdda0 44ae7a84 c27629c0 42feb160 42df68f7 c36c0438 c48a6782 43322ed4 42cef3ce 4225e980 43cabca0 3ee40800 438d975d 4429f34c c4328e2a 42dcc9dc 4301d9e3 c4009d34 4490b35c 415792f0 42a669a8 43099b28 c4b761d2 424fac94 427eb09c c3706b30 44a818e2 c1db17b8 433c4338 c4911bb1 43caa650 c261379c 435a10be c4812264 449a4ce8 c32bae44 42959b30 c47a7896 c3151948 c086c520 432cecb3 c4b4d1c2 c3a78d4c c1f03560 41653cfc c38981bc c2bcb4c0 c2e4caf5 424b7281 c4b99b23 c4a70822 42a7b128 432c6ebd 4423d040 c4a071bc 4322282e 438f5f70 44832240 43c7eed4 432c56ae 4313309d 44158a8c c3fddc9e c2e89211 43846a52 c4280f9f 4454bc20 42e517f4 43766372 c467a76a 431d9480 c2ca3505 43845750 c39b6778 44b0f3f2 c2d44db0 425ec7ff 438111b8 43ac4fbc 42dd6620 438ef0af 442fb00c c41d06e6 422f6fc4 41d7a250 449f8e86 44605860 43479e9c 4208da20 c4b938c2 c48fcfb5 c249f840 43247f5b 42697280 c4b5595d 4310f7e4 43513f0e c470bdb7 430aa038 42bf33e8 433f286a 4408a2f2 c397af78 4333e8f0 430d3b61 44668170 44788cfc c3068394 43627f65 447d255c 4439dde4 c252cd3c 429c3171 4485b3d6 44b3d35c 42bf0e04 43008a28 4425d550 c482f0e9 43354bf0 43144504 445572c0 441827c8 42f73ee8 41fd214b c470ee82 4420de4c c261fbd0 42f065a0 c4927473 430eb180 433f6c5a 41ac6c56 448cf39c c48279a2 c2b8b24a 42d6844f c3eeb750 c480941c c2c71a31 4215231e 43cb1e28 c4399efd c2cb3a52 42a9c96c 443a30c8 c487647f 428cf7d0 43269395 c426cfdc c30b02a0 433a60cc 41916574 438b7358 c432575b 430808ac 4392ffec 4386ba8c 448cae60 c2b4fcaf 4213b4a5 c2a427e0 4454ca48 425b580c 42bc2dc6 4449f2bc c400b104 c261b034 43564c1f 441dcddc c390d54c c32cd6e1 432d8e67 4495e35e 4486af26 43088d4c 43244e8a c3014638 43186988 c28ae73c 41ac58be c4ad2502 446f2188 c31f0924 43482de1 4374db90 44a8e386 c1aa03a8 433bf60f c40d0385 c41da251 42c47198 43110e07 448fc256 c48025d9 42424f18 43807ecb 43ad1f7c 44ab002c c08cf140 4303c120 4452019c 44b0e6b2 4303ce2c 4383c010 c3ab5b84 c3931014 c3149b00 435ecdff c36d8120 c410017b 410f5b80 41aa83d2 43125628 c4478760 c3322c2e 43479a12 4407fb6e 44b47cc2 42a6ace4 43777ab4 448f13ec 4437f6d4 c22c034c 4303f82d 43ecd5b4 43994b08 429080e8 436103b7 c444b6c6 44b7a212 4326abbc 431b4353 c4a451bd 449872b6 c2c029bb 41ea6248 44b77f7a c44bcbef c2b7fa1f 42786826 447169ac 441fcbc4 c2f5bcf4 413282bf 444890f4 441ae79c 4326c55e 4346532a c4949c6e 44af5dcc c303d8e1 4341e4c1 c43d41c1 43ff2460 417521d0 41a08e8c 436dbbb8 c3889b38 c2e3000f 436d3bf6 4425ff20 c3a96a1c bfc7f600 4307081a c3a306f0 c4b370b1 433ee142 434440af 44b1cfe0 44b70248 428393c4 430d6191 441e7400 42ac1960 4346cdde 426b6fb1 431d5fe8 c3a73f04 42750f68 438ef21e 440af374 c4afc999 425c5c5c 42b0a427 446f7acc c423143b c2c5668c 42f732aa c3c5a914 c44e31e5 c0a28e20 433250cf c4b6fdf1 c2227380 c1855628 4308198a c4544662 44444348 42344750 436251c3 442c0140 c428fe0e 428c2f40 422e305e c4139ef3 442301fc 43292350 435a80a8 4401d030 c3c3443c c0e30380 4282a159 443fd32c c4305349 c320ae40 435220ae 443affa8 c44d7b7f 4232f098 42262792 44492ec0 43803808 c2b4c7d6 43633c96 400ae200 c49bf904 c1bcbef0 42966390 c4a11e52 433a8d10 43349aea 436f5319 444edf10 4498b670 c2de6449 4301124a c3d7fefc 428445a0 433ac274 421e46cb c3d26ce8 42cda650 42aee8b4 4395c4c2 44361b50 c41894c2 4301da58 4362aa55 c3a7c100 44492d7c 4294656c 4394afd1 c4834ec0 413c2b80 433f12fc 424ee0d4 c4bb415b 449fcd54 4237ee48 429313e0 c427c142 44148700 426dcc30 4228a50d c3751248 440f9e18 c208237c 4380098a c4ab6aa3 440cc7c4 c284b9ce 4297d375 c434a818 41ecff40 42c73ae4 429bb3a7 448990ee c42848ec c3457c9f 428a6a64 c4346b6c 44116bd8 4306a864 42c339df 448d4218 44acb6ac 42617c28 42b1b4f0 44a114a2 c49e319f c2101920 4306a918 4498a880 4439d984 4302411a 4349e31e 44909e8a 43a19a7c 420026b8 41c70f4b 448f1df0 44b2898c 42a362dc 435521ec c3459140 c2fabef0 42b9747c 4343977b 443f2978 4436c9a0 c2b262d1 435c4266 449d7228 c385cfe4 4337dd12 4332e7bc 448785a2 c3e63c4c c2d4a15a 430ebe9e c4a88a0e c485df82 43279804 4390e321 c426ac75 449795fa c28fd788 431e48c4 440a2dec c49abdaa c272b14c 42aa4846 4412a4ec 44aa9c90 c28dfbfa 42b8567c 44b79f94 c4886e01 43133018 43035bea c44b6fde c4bb2429 40d9eda0 427f9080 4461d964 440aae04 40801a60 4319ed11 44581b04 c44098d6 42f03af8 432659e3 c3bdb700 c48d9df8 c347b27e 436034a2 c4a614f9 44339eb4 c1f76598 4323ace9 00000080 -> bf52efd3 bf10f67d bca79e6f 41773191", + "44043d06 438b277c 42b429e8 c4b4c8a2 c4b06f5b 4339f4e8 420e6554 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c2d7ab30 c488a383 c3351503 c44b420c c4a8e5e6 42499138 435e9d49 c47c4b6e 438b4b10 c2293f20 4378ee68 44276360 c330e500 c2aa581d 4374a92e 44909810 435b8370 4335aed0 4333533a c44d5491 c43b5f8b 42aacc98 42d81251 c424a623 c4b86758 c335e906 43802d77 4459d2e4 44546aa8 4278a3b0 43281570 c389f6a0 c4919101 4270b1f8 41fe317d c4a4c639 432d5f50 431d5898 438eeac0 c4914098 c4040759 41f2d5e8 437aa64f c4889d56 c40b6acb bf89bf80 431f431f c3b35130 43815628 c31311cf 430e565a c4b77e4a 4152d880 c19fb4f8 42dab551 c4b71c43 c486d163 4161b1a0 4294065e c4b9db6f 444f5bf4 433116ac 42f09f8e 44a40c68 4482ea08 c20698f8 433b4b78 4459f354 c458029b 42c6dbdc 42d21ebe 4406dac0 c4ba5aab c1383280 4387d40f 4402b652 448fe094 c2ee1cad 43911f32 42035de0 42b729c0 c1461bf0 428a70b5 43e2581c c461b3b5 415c5d30 438806d0 43f298d0 c4101fdc c32ea61f 438a6ab7 c4b30d7f 44017978 4332b554 42d6fc3f c3b223b4 c4645fc5 431cf20e 42ba38dd 44955676 4490bb08 42b346f8 426b6c7e 447d3cf4 4464664c 42dd3944 414365f6 c4af0f5a 430f7b38 4286a770 423c84a9 44a44c10 434eb8a0 42a7d408 43136ae6 c4106cc8 4432e2b4 42b7974c 436022b5 c40afed8 4212efc0 4333da1e 43160098 c483c590 447657cc c29bc949 414148be c4a664aa c488dc64 41068de0 4314d8c1 44b83da6 449be9ee c32cc024 433f3fec 4465d2b0 c4159148 c2558274 437f7203 c3686590 42a0d150 43142ef2 422c20fc 43d14654 44a3411a 4340cbd8 430d8cad 44ad9158 c2a27f50 c33c8030 43446400 c2cbece0 c481c356 433cc452 42f3dfae 44a39e8c c44200a8 c3400e54 414aa885 c00cfc00 444a0468 433489a6 43873acd c4b172e9 c468d91e c3114f75 4183dd5d 40166800 c49bb482 4285f03c 413fd0c0 c3c0104c 448fac0c c2934f09 436e7b73 43d4adf4 447bcb60 43094cd0 428fb16c 4481ecca 4483de38 c3364505 43332d37 c493a438 448ddc98 c342e46d 437cd464 44a671e0 440899ce 4296f1d4 432de114 c424766b c3d5f4a4 c274a4d4 43476bf2 43626048 44b11ef8 c32528d7 430c7e90 445ff730 44ac5cfa 4335225e 438451a0 44651edc c4b34a6d c2b76290 43330988 447d936c c46cf6e2 42c35cc0 421cafe6 c398e15c 4465f278 c306e8c0 4345cf21 4428c5d0 c3c60900 42e97a28 42544418 c4726cd1 c41676f6 c3289956 43776880 c39bd770 c4952110 42b4e984 4163b81c 42d82ac0 43f40764 c2e6123a 434c24fd 443a77f0 c3a01888 c208922c 4385972e 44958e00 c47a4d1f 42de4c84 4209e6d5 43a14b2c c3525a68 4347b26e 436657f5 44a4396c 438421f8 c305310f 43137eb2 c46505e9 44159c28 432b4256 428c56f4 c46fa495 44a47938 c2b56dc4 431ac79a 448eecbc c4892e16 c0e6f8a0 4355eb79 c4192fc6 c436de93 c33541a0 42737b4c 44b0dd1a c49f790a c26cda10 413651f3 c3a21208 c4281407 42c70b48 432c0abd 43872790 441b9618 41831f90 436298b0 c415e584 c407fa27 4318497a 43745332 44a33cee c439fc30 42fff78c 437c994f 442fe754 c4b9a6d5 c08cf580 4374e887 c48e7aae 449bc6ac c345b874 4367bdd3 440a3b70 c49f7ca2 42e6eae0 42dfc932 c3af771c 4472ded4 42e68900 438229b3 c445e8ce c47d5794 c3272211 438a37a3 44a900ca c3c3ed20 423bce7c 43132d94 c39991f0 429dfa80 c2f0b7d4 432d1b36 c438e5ed 44027424 42d64bdc 41b574ec c33f5aa8 c459443a c1bd3180 43912c30 4380a09c 42fba240 4319e6e8 43143317 c42c5a2e 44b59136 4315c844 431f7763 449d0cf4 c468c8c4 c259d278 4314214d 42b72b50 c4b4ed95 41e61180 436a3244 c4779c50 449674fc 431a5962 42e7ca4f c3a8acec c4b583da c20c2560 43362e32 442239b0 c32a35e0 408ece60 41501f9a c410e061 4437afc4 43260e50 42705880 c3af931c 44711894 c2b20c24 43535010 c426e886 439e6cf8 426dab50 43912451 c1738380 c495421f 41ad8608 428ca3ae c47d2609 44271808 c33b3cb1 429cd8f5 c4953bfc 44b98ad8 43158d32 43252629 c403abd3 c49f1abe 41fd4e30 432f3d57 c48aed19 c41cba61 42d03328 4379cf91 c2a1dd60 44888818 c2e924e2 4271b53a c4292397 c467a354 c322a7e5 4357a120 44341038 448da498 bfdf7a00 432da0d7 c4397e56 449d4438 43141770 42b9a1b3 c2e598f0 c45db152 c1dbfa30 43950f0a c384f758 c4289726 432354f4 42c8fd72 448b2384 c3b3c918 430b4f32 42c63155 c44145c1 441bbc9c 41cee2a8 43940825 44818342 44713504 c0271680 4340f1bf 4493872c c3b37d74 432d6834 4391d75e 43c225a4 c404dea2 bfd3fe80 42961c1e c0244a00 c40ec47a c2ae2494 42feef7b c45ce16e c41acf75 c31cc6dd 438b2478 4486ea22 44480e4c c207134c 4286bacc 44aae874 4494b1be c29db86e 4386add7 c3ebafa4 44569944 c154b6a0 419b4010 c40c33ef 41dd0400 42af1834 43070255 c35e49a0 c44375d1 c22c89b8 42066ab1 c42bd4b5 c2f05f70 c25979f4 420ead8b 445183d4 440a0070 42fa5374 432ccdd6 c496d120 c32a5d00 c31f4e36 438e9062 439562f4 43d14bfc c315569e 420334ce c38cf3e4 c41940a3 428c11fc 43958c8d c49e70e9 c4accec8 424d8260 437e8e93 44858762 c2db74a0 4324817c 43948a67 438829ac 4483b888 433fa9ae 439115dc 4496888c c4b1803c 4276c3e8 42fbe766 c3920110 c401b402 c2027838 42b19dcb c49c255f 44351798 42ed36a0 43877384 440a4be8 42588e80 c1d6e5e0 434d52fd c3b02af4 43d25cf8 c33dfc7c 423f144e 4340e550 c39d16cc c346704e 429a64b8 44789ef4 42795480 c2d60c98 42cb3d2c 444c8dac 44723aa4 433c3f4c 42a30221 00000080 -> be9c08ec 3f70c1eb be1a25ff 42ed7fb8", + "c494a78b c3f4dd10 424a4088 442a1d68 4403f8be c3286991 438431eb c390ff30 449afacc c2832c2c 42a0be8d 442b95b0 c47fd25d c2819356 4196f1da c444b34c 43a11224 43343696 43799aaa 4482d7f6 c39349e0 401d6680 4184ce2f c3687420 434d04e8 4318c12a 4215c388 c4950d62 c03d3400 c2bf7d34 43698b05 4315da10 c3412ca8 419c0c88 43128498 4486f816 440d2bec 42792d10 4390d212 44a74644 c439397c c3079d60 4315c74b 43fbcda8 44b764d0 c31ee9fc 42e5e2ee 4493e72a c420fce0 41600840 42910b07 c4b3f7d6 c36ef728 423838e8 435ecefb 42f6e0c0 43167f68 41c8eb80 425fd63e 445c8e90 44b5a122 42dbbe60 43882064 43e4f5f0 434396b0 429a2b6c 42be0a0c 43a53568 4489bac8 c303bc35 43295b2f 44a95df8 44b6584e 43180ff8 4336ce4e c4425ddc c4b27140 c2682c3c 4307b478 c2ce4060 42702860 c2efd3c2 4376fb45 44ae00ea c4aa9b79 42c89a38 423e57bb 44705a28 446c3508 432bd792 42c7a7ef c48c75a4 c103c380 c303eb1a 4390730d c281dfb0 c43684b1 4303bde2 421f19b1 c418bf15 4468286c 42c96328 418ef069 c4907dff 44b61016 c2bcd7dc 419e7d6a 42f12210 c4b4475e c033c3c0 431fed8b c4648b6b c48b0114 429a48c4 42b2f4d3 445518c8 44ab902e 43301fe2 433a33ba 446bd518 433d5198 c12eb5c0 43709b5d 44a420b0 44875764 c1f2ffb0 430dc5f4 446d096c 449ce9d8 c318fd23 4393b597 c464e689 c439d5e5 c311262c 43484372 44493594 c4752f47 42a1fdfc 4392e23e 4452d36c 4422b0e0 420f112c 43725a0d c40586bc c38314d4 c31a3578 43956ff1 44644cb8 44948d94 c300f6af 43210c16 c409c07a c450ade2 c2a96a96 435ea322 c3f4bc8c 44ab33a4 c32437cd 42a730d7 43385068 44682aa4 c2e1c618 433e4ef1 4496a5f2 41d29e00 c28e3ec8 438dbe2f 44b892b6 c4adb5a7 40140f80 433b33c2 c437bdbe 44ad2d10 430298cc 4219201e 44b1a22e 44009dce c12b51e0 4322448e 4438d308 c3582b38 426ffc48 438a62f9 4434a238 43910364 42864c10 4392172e 44adff04 c3902830 c2909bf1 437567a9 c49c2354 c319dc78 c204afe0 4391dfc7 c0256a00 44af5fbe 431fcb32 4375d32b c49997c6 c4766ebc c3466e28 43689c7f c3a47698 4347a598 c2bb53d3 42e1a057 c39d18c0 c467f824 42cfa250 434af3dc c2485200 43412e60 403c0680 4242da77 c47f539e c41797fc 43185cfc 42c4ee4a 447fada0 c3e2446c 433fa03c 43349b5c 442326e4 44118828 412f6c80 4373d3a0 43063240 44851adc 421d69e0 413bf544 444c00d0 43f01024 c1d124f0 4330c0af c363f108 448f631c 413d1e70 42722eed c3fdbf72 c40bfe18 41f8dcb0 436a4077 43d88780 43e6d3c8 c28940a0 43209441 44a5835a c4225158 42f995c0 4288bb96 c49af770 438da598 433ce9fa 4360f76d c466bb2e c37d2038 c333f6db 4353ee74 c4acd2a8 c2f2bfb0 42f7d63c 4326b18b 438a7c78 443e2344 431d56fc 4378bf2a c48ad7e0 44a22034 42a79470 42b4c679 44493e70 441af588 433daff6 4322fe22 444b8a14 c45ca9b8 43319424 41e3ab9f c3c99688 c4b86f85 4311f8e6 42ab7867 c4ab6357 c39a51e4 4327b534 4275fc18 440cd160 441108b0 c23bc238 4146f3a5 44793514 4479ed04 c311efed 43835664 412a4400 c4ad7518 c2ff3bce 43862bd3 444366c8 41782780 c230d21c 4149e97e 435e4e00 42d0b1e0 c1d69910 42f07bbe 43b451bc c325d410 433bf384 43940db1 c2a9eea0 44b66a14 c2876f22 4197d81a 438deabc 4311ebd0 bf874e80 428537e6 447aaf84 4421d514 c311cc0a 43088c50 43150dd0 4416cf5c c1b03fa0 438c9692 43565d98 c494e728 c33e64fb 435ed79e c4b230d4 c4a7955a c29d81e9 4381c376 43b206e8 44857632 4295a4b0 431d5f7c 44ae1178 42eac150 41b78d80 42a0f595 4427a018 c39be32c 416afcc0 437f4b06 40f29a00 c4946dcb c2b2a79c 438f7624 42f089c0 44b62862 c3315d5c 41b7d738 c3c3819c 44a9eafa c1821600 4383968e c499cd6c c0cea700 42f6f36c 4320036a c36ddeb0 c4460baa 4338b34e 4303626c 44097df0 c2b26270 c20c5904 43603a16 44879846 44b770c2 c2d72eac 42bf2ba8 c480180b 44932d86 42aa4c3c 425a2fe5 c47bba41 4394a050 c1d7cbe0 431181ca 4474aed4 c4a195ba c2f4ebb3 41aaa4ea 44ba322c c4353b81 c06c2480 434b03f1 c39b2cec 446b8644 c202af18 43113cad 442cd3f4 c4ac7902 4300ede6 4317648c c3450720 c48f31a1 c306fe68 419ad698 440fee24 42e3cf10 c322abf7 4329c3f0 443f0c84 4444199c 431a897e 43146275 c442d186 c411b232 42a6ed34 43185336 c4a304c3 c3eddd88 4298d5b4 42dfee03 c4abb759 449e814e c1f97530 43053d77 44b3cf62 443908c4 c27c89b8 41be52fa 43548e50 44468400 41cefd68 4231473f c4a13183 c44e0449 42af6dac 41bb372a c33e4b50 c3958a94 42dc496c 42bb332e 44b26b7e 43d666ac c2ac8764 429c551b c3bffa9c c4b6679d c1eef318 42115746 c493fc0e 44a05478 c21e5198 42f5a0d3 c3e274b8 c2afadb0 c1ae7e10 431e6070 44131434 4432298c c332e4f0 438e0da0 c464258f c4aa565a 43400678 43948e72 c46369cb 4448ffe0 c214bd7c 416547b4 4381adfc 43f3aac0 c332512a 434ad7f7 434631a0 c391d92c c246b180 42fb82b4 43cf8310 c46ac234 c332d1bd 43910e70 c405f641 c43a7c4b 4330df24 43448f00 c3cc8b80 c4733f53 42d77380 4337d5bc 4451e140 c45b44cd c26fd3a0 4354b72a c3e4b014 44779f78 c32302ef 438bda50 43f44e6c c41a476f c338b0c8 43392a0d 439fd330 c3866778 3fdf2200 430a731b 448c0090 44310dfc 43012e0a 438e353b c497e940 c4aa21c2 4315522e 431da4d3 440a72cc c49aeda0 424618cc 438df20d 00000080 -> be23a4fa bf6f395a 3ea2e689 42556593", + "44b91f30 c458b6c9 43470c80 4466b47c c446ae7f c241e6d8 42c927b3 c3d937a0 c408ec30 42bcb878 42c7f8d0 c3229b90 443136c4 c279867c 42548262 c3193058 c3d2f738 43246510 4362a0e1 c0102200 444a7988 424c1a2c 42e093f5 44724a10 41594c00 42bad1e4 42d5eaae 447fbe64 c4b61795 c2bf740b 428baf58 c483fe1e 4474d2c4 c28b1c04 434baff0 c4b51080 439dfe7c 42ef2794 42735ae1 c48c6b86 c48a8708 40e85420 43036790 c49adb4f 43cbf2a0 426e91e8 42c7d139 42af88f0 c3d165b4 c2d378a8 435cf9be 441f9e24 c462e83a 4226f130 432e5e97 44bb10fe 43fc9658 c301bf30 42c3c945 40965d00 c4aad2aa c13764d0 42d9a528 c4a637b3 42b148d0 c30716db 433d9dc2 c386bdf4 44041ea6 c31360ed 437ea56f 43353d18 4430c2b8 42425118 42e9d206 c43a2367 c45a4de9 c2bb766e 428082b6 44854866 c36583c0 42f41110 43155efd 445111f4 42c716c0 c025a400 438ed4e1 c4506e47 44427dc8 42873c18 42de495c c352e920 c1468c00 428afde4 42060bd8 43eedf88 c471f66c c25cfca0 432bace9 c29ddeb0 c4b058fa 431ff170 4380b2ee c44b5d1e c3a1eb98 c3052a16 4392af8b 43640708 c4463ce0 c29404f6 436f135f c391eb98 44b73464 c1a77de0 42029004 c4437553 44b80878 41c66c60 4321d5f6 c4adfe4c c45836d8 c2245c8c 4346bf1e c4b8d4d8 44541670 c209bdf8 41e5c11b c4a445a8 42f23de0 42a78694 41fcaee1 44822442 441c20b4 42aab818 4379728f 428dd300 44a97ec4 c2c69b59 42f44a41 c3c8dc7c 4244a440 c248b6f8 43940784 c326f638 448e2c38 43326b88 4309ef08 c4a96c57 438f80b8 4308ac96 434bdcfc 43ad105c 447dbbd0 41097ef0 42abf1e8 43c6b2dc c43c3e8c 430a645a 430b5bda 44b34da0 c4950c30 432614a8 41a2acac 429da7a0 c44297ab 43312612 43536b5c c428a3ce 43b6f77c 41ae3030 42bab16b 44334290 c4738656 c3090222 4320b166 447cdeec c385b3f8 c2eacbf5 423c7797 447c8cd0 44b14900 c3417653 43113812 44150420 c4ac2854 c18304f0 41488523 c46afc30 c311b9b8 c2f56d86 42b34908 c493bf50 446541ec c2124bc0 42acdc50 4397c714 c3f19f98 c17f2530 428a349f 44a39888 c43a5fe2 c3059934 43059b17 c4ac0977 4322d9e0 432bcace 43099f36 44079fd2 c4bace21 c1f09938 42948755 c4ab8fab 44237e48 422eee28 4138f856 c49b2d42 c3193658 c282712e 4316c151 44531d7c 44a2cd58 40494ac0 4378e11f c355b658 c42525a1 c2fee260 438c5576 44480d30 4493b8f0 432760da 431a7d96 44a90630 c4ba7ca9 c2f69d00 4333b7af 44661144 43872d20 c1efe110 424f825d c491b675 c4b461d6 c289ae00 427e6836 c4b18543 44b0daf4 c2d64c87 42f50c9f c463bdb8 c3913984 c3010e98 42589de7 c4bac2d9 44b20a04 c1f896f0 4129d214 4436ba6c c3ec93c4 4346fc5c 4366d09e c3beaaa0 44ba0dce 428aac18 436e33e7 c49c38ed 449ff6b0 c2b74dd4 41ac5734 429d8bd0 c4b27688 c2f1199e 4319dcd0 c4b28a6b c46697c5 c249b658 43672073 439f5ba0 c404ba5f 42edb028 430e92b4 c4a99ef1 445c08b0 42bd97dc 42e6dc29 44226d38 4447a478 bfbed300 439283a4 43712838 c468c98f 4308a358 4310b29a 438afac8 43f5691c 42d93664 422dbc37 c3e78a04 42f5f770 c31f6de9 421c0c8b 44168ee0 c466c1ba 4310b40e 426fce59 c45d94bd 4407f5b8 c314a77c 4374bbe6 43974300 43efb6ec c2269868 4303f9f6 430783e8 42f1e540 42ab00a0 43320eda c434a2c4 c40ea897 c32bdd7c 42cbfc64 c3511c28 c419d153 c181de28 42d7406c c46e1f57 442f9cd8 43215eae 42e4f708 c36ceb00 c43504f5 c20503e8 41e75dda c450cc4b 4413cd0c 42cd1f98 438106b8 44a1db8c 43423c20 c308671c 41a1deee 43cebd04 440c2254 c247cf40 438a7bc8 445c4de4 c36d0a08 4327b8a0 41c96c1a 44a8b1fc c466ff03 430e7466 41a32d3a c2b00e60 44552840 4287cbe4 42ff624a 442eae58 4296b4a0 4343e5b4 43126b1f 4450642c 44490f5c c2328f4c 42da79e6 c440cab5 c3fe0cac c2f0cba5 437ff339 4454ef08 4486665e 426c9fd0 435360cd c482f3a2 c4ae5b66 428f8364 436199d0 449d6bea 42e90ab0 41894920 4366d6fc 446c22ac 4483a866 c20f4fb0 4298d538 c3923e68 c3b27ad4 421756cc 4308d810 c4b1410e c3e02524 c317059a 42ffc583 43610160 440d7040 c2c20d82 43831cf4 c4172a7e c4af27cd 428e1afc 43104cf1 c4508399 c4a0cce0 c2b94271 42121645 43045848 c47db3f6 431a05c8 430853a4 c4943178 449fdc44 c0b2a460 42848f2e 44b4d4b8 c44bd47d 4278e5e0 438b619d c3d58690 c47f776f 432fe0e2 4381fadf 443108f8 444435a0 43005006 4307ab4a 4430f740 c441f598 c3183cde 43100a89 445035dc 44683c08 c1affb48 438598b1 44877404 c49d938b 417d0680 4361a86d 4377fc50 c407c497 4293ed00 429fa63d c1421100 c47fc452 c285f0a2 421d313e 4488b288 44a0a440 c1f24840 42dd212c c4af1dc1 c3fe001e 409ad420 42495175 c4988aa2 446cc698 42b5a598 430f81c6 c43b2fca 447b501c c267333c 42c394f8 c4aba0ea c3677690 427ccaf8 42bf3326 c2608940 4394c1e4 c285b66e 4387d9cf 440d84c0 449a77ac c2796e44 41a9b8ef c2992d00 441530e8 c2567120 433159a0 c354e328 4424d0b0 41dc3588 43743281 446dd354 444c790c c1e299a0 430b9d62 c417d667 c4118bd6 42eaeb68 41b993ce c3dce4ac c49dd003 c02d4e40 4362cc30 44adcdb6 c3b0baf4 c2f13d3e 41f99e48 403c8a00 c4ad7951 423f9530 42ade7df 438f4708 42833470 427cef18 42347ce1 44b675d0 c29f76f0 4283ad68 42f8b1d8 c316d178 c4834106 c33b77b2 4323e483 c42f4c70 430fc4f0 c0b7fa60 42b06c11 00000080 -> 3cffde9d 3f76b048 be87e4dc 435182b0", + "c3fbdf46 c4212483 42bf47b8 c41f7c76 43150b70 422f3d60 43036b06 4390cab0 c49f4d11 c3231569 431b22ec c41b5a68 c49ef79f c22d6278 421c0440 c413678f c457f4c2 c2a3d039 422cdfca c40ff12a c2edada0 4301a6a6 4343fd35 c396fa48 438faba0 c2edcd1b 41befa6d 44ad7656 c2604980 c2071d6c 4387000d 44a0c8ba c49db47f c2a80d85 41ac4aac c326d548 c2f10130 c299777e 4391f78a c4a94a58 4417d208 c22ff298 42faf87e 4358ead8 4493afc2 c309410c 41fb73e8 43d18b74 c3500ce8 43391f88 42d6cd2a c4683475 c48151ec 429476f4 4363b114 c474e108 42cc0d40 c2161f2c 43528e45 c3e599b8 43391170 c18c6d00 422da742 43ef7758 c4643255 41e57b20 428fc703 44569d70 c3de3830 42790028 437ea6f2 449775a2 c404b6e8 c32d9ad9 4339a376 c4a11dff c35e4b28 c32c62b9 431c999d c33740e8 c48b2ebd c212fa4c 43244174 425e04a0 c49d9de4 42a4ed80 436a58e0 c39f310c 42eba330 431283b8 43890152 c4a760c5 43aee47c 42486798 43173131 c43e446d c428e3a6 42bedd70 42ee68ce c4056957 44a64bba c2a9cd0e 42baf2e7 444e44b4 c48ecebc c1d9b020 4382c3e2 c49a10c0 c49d86a4 42903ed8 4362cd45 c2d229f0 44963f06 c2c5e00c 42927d7e c481eb28 449f1346 421abf3c 43322fe5 c1fa1f80 445f938c 42ffa12c 42a330cc c22d30e0 4437ef0c 42e7f9bc 42baa1db 4414588c 436d5ae0 c2610e6c 4370b4e1 440c7d9c 441059dc c2fd47ce 4319aef4 447fd2c4 c48e6392 42cd8368 42fb9b46 43dd92fc 447e1c34 42938fcc 42ca1608 44869cc0 c48efd66 c1aeb210 42597b85 c3cc176c c38b4024 c2855842 42ced2d1 440592b4 c48003ee 431acbc0 4321f6f6 c48d07d4 c4ac2ca3 42f1d200 4195169e c4001796 c4853f26 c3042dec 431de96a 44257178 449049a2 c32fe430 436a06c1 4422f15c 4440e5a4 c244d160 419d2668 c47984a6 c462f41b 432ce550 4346b8c4 c490e1a0 41864ac0 c2335650 42e8c966 c4161f38 43cd7364 432957dc 42bc9079 c43ea68c c4ad89e5 c31905e6 43235254 44651bd4 43ef1324 c24d8898 43721106 c4087c04 442a5588 c32bf49f 431be1bb 43fde49c c47430fc 42155c5c 43924245 c4a59778 4401ad5a c1cd9da8 4339f49a c4b02ef6 c415f392 c30a1472 43156754 c44d35d0 c445d4cb c20f69e4 433d504c 43e56e60 c341cb78 42b7f420 4352c024 c4510306 448e18a4 c2bc9b61 43502cb4 44487e50 42bd7550 433acf82 41d64479 c3ab84b0 43664750 42ac2fd4 4309a839 c48bc4b8 c3546750 434099e0 438d3086 449a9786 c3816d60 c2993d25 433fcf9f c4601559 c40989f1 c2bfa3b1 438e21aa 448f6946 43cd1c44 c29e2728 432f155c c43c3cca 443de9f4 c30d1704 4384fad2 44ba7056 c3b732c0 c2ae9f23 436f32be 4499d056 4499bf04 c2ea8018 4322c907 441a6844 c3b73178 c2df210f 430d7dc0 437e7e58 4420f3dc c26a87fc 43712f34 c437f54d c2ad3af0 42a4dcc4 429ec232 c48be4c6 c494df48 c065dc00 43882e90 43b1b57c c4081eb1 42f0bea0 423f7a50 c44b0c9e c3995710 42f715f4 4341680b c3538c18 447975fc c1b65070 436354aa c4843252 c467a082 c33c5f71 412a76fa c45bde98 44533448 43286c5c 4378c595 c497ad79 4466464c c25e8dfc 426aadc3 c4228220 4175d180 c2946015 436b9671 c4a9d280 4499037e 42cc88f4 4386a751 4491114a c3b87834 c30340ec 43359518 c4929a59 c49ee423 c2a1effe 42c6b327 434f0ab8 4384faa4 c33e6d30 43642490 c42b514c 439c00a8 426f89f0 41e37492 c32dd1b0 4418ddf0 c33b0a6b 42dc4cc5 c46e89ba 43fb8154 42f75754 4375514c 44ab99ee 43c7a810 430ae7a2 435c00a1 c49c48ba c4afe300 420878f0 4321384c c49ea534 431297b0 43110722 43696e9f c4b44363 c33bc948 431d4752 423f7040 c23fab60 43a96ebc c2c487c6 431cfe4c 44545304 43a307b0 431e7ffe 434f00c2 4485474e c43ac549 c2835666 42db1fdb 448cdd42 c386838c 42a9c54c 42931f56 434b8820 c3d15c64 42567ef0 431406de c44b3a96 435c4b90 c2dc1c89 4326087a c4ba3db0 40eea200 428c3774 435b962b 443512f4 448e389a c3364bbf 41359a49 4468f838 4496b164 431086de 432f0223 c3820018 c41445df c33ca9e5 42de5f29 4431a40c c4790b3c 43137eaa 437b5bb9 44125b00 c441845c 42694bb8 434b51fe 447c7cf8 43d716ec c2ede924 434912a7 4463822c c3784640 43209be0 43890951 c3a7dbc0 44223804 3fb40780 42b6c175 44a287ec c474d8cb 432f27c6 43928ace c45bf741 c3fd3dce 41513a50 43923318 43130560 c485caf8 42f4acc0 42ae038d 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000067 -> bf0d723a 3f1b51cd 3f124dca 424f1e7b", + "c4a16bb9 448f27aa c2a78a57 c3a11d2c 448096d8 42d11aa8 438137d0 c4b841b0 4490c5e8 c320c8cc 434e3a19 c3abeae4 c4600444 c22a95cc 412182c8 44a90540 c46f5339 429da20c 4371a5ea 4439cbb0 c37d7f58 41ca9d20 42996e45 4493380c 43bc562c c259a6a0 4357b15a 440103c4 c48f64fd 429abed4 437ce3ad 44a3e6c4 c401e8f1 40e8faa0 434ea93d 447f539c c45c9300 43463394 4383a422 44359a20 c3643020 4329e81e 42babc6f 447ee318 c4165e59 43008792 423ea39a c487427a 44b18c9a 421d41d0 4390894a c492b2fc c2c778f0 4206f8e0 43831920 c4732997 44784678 42f9b058 43687087 c27cc340 c4a7f6e9 c2fc4664 43863333 c4668716 c433a201 42bfa8c8 41d7f4a3 44095510 44216e94 c3080b40 4361ff75 c46bf3ef 4472bd98 c33156fd 42cfcc60 c1de6200 c4281e8f c22fac98 4335fde6 44642ce8 c4476b78 41dfede0 435494b9 4267f2c0 442d55a0 42b6ff74 43126440 4435d264 43ded6b0 3f717c00 414b9fd0 c39f50a0 c44ba5a0 c228e0fc 43521cac c4438a0a c4aed9b0 c3220fbf 433203ac 4333cdb0 44450ab4 c1aa6518 4304fa94 446b2e4c 44848cae 42dd89d4 42b962cb c386d808 c4339311 c241bf2c 43877dde c3318280 c452b91e 43391ea2 42a20048 c2569940 c226c8c0 c24d4578 430fd709 42be7420 c42d0e6a c2930fe3 41a02844 c4575633 c483111e c26e5a04 438fc113 c35463c8 c3c81618 c3263242 430e87ce c46f4109 44692204 c33abe65 41b04e80 4457843c c484c85b 4319fe00 434b19b6 44aa5234 c32933d0 c32fea50 4315bd6b c42cc30a 43999fa0 41db6df0 4272b702 c42fbf0e c483645c c2e9a90b 43646c10 43f30a60 43c7fe60 c334f3f6 42bc979c c32059a8 c383b2cc c2e70e39 434a4b85 40e9c800 446fff88 430e60bc 41b4e886 c472f4d6 449e370a 42af288c 4340b22f c46b9420 449dfb9e c1881530 42d6ff8b 4397ae60 441a61a0 403b9600 420e3ef8 c45a3715 447abba4 42d3eb78 433b0932 4375bff8 c472cb01 429900cc 42b6285b c47ffc92 c3fd017c 42ebfacc 4328d2b0 44456b70 4435d92c 4217f044 42ed96ea 44a30650 c4509448 c306a0ef 4243a9af 43837b50 c4b53b2f c29b5b6b 42ddb10f 448fcce8 44a47832 43438b2a 42dbbe20 44101c3c 448b6532 c30b2d29 438fa598 c48c3fda 44ac4d8e c327591c 433b8ca4 43dcf3b4 4397115c c327883e 42d12c1d c48b389d 43651670 4319ec98 437ef8a8 c48be686 c47689c8 4312b43c 430a984d c4024165 c49ca14c c21da554 42eff38a 42fe7b00 c3be4bfc 3e482000 42838d19 42ab0ad0 c3788890 42b599cc 434490e9 c46a6ff0 c3e5b1ec 420be568 42ba7061 c4708c12 447e1790 c1faacd8 43731688 43f14084 44b50558 42b6484c 42d5bb5f c486ba6a 447cf3b0 c345d213 415464f6 c48a08fc c2e98ce0 c2df59aa 435888a3 c4a090c5 430848e8 c340c6e1 433ad994 c2b280f0 444c9fdc c209f710 436454c7 c2f615b0 4491fcd2 c32681d2 42997c0d 448c2440 c33a7c38 c31080cd 436cbe4d 44b7590c 4392c520 42845dd8 42bb1f6b 443b36bc c4a3df34 42e213b0 42db4a49 c3da4cbc c4a234b8 c2d132e2 43567de8 c3c67834 c201a3a0 c32fd4ab 41ec7143 c463be15 c4b5f1b4 41e4d1a0 43442d3e c4006411 44b31a58 42fd5f18 42ffbbe6 c360f280 43fd3264 c2785fe8 4369beb8 44959f0c c0dc1d00 c17e04b0 4355d64d 4414e530 c44f51a1 c33f0de4 4324e099 445db66c 44a24048 433906dc 4148e932 44451fc8 4402d730 c2c3b62f 42fd9f88 42cdfc70 441c7880 c237b6a0 43919e93 4476a864 c4b56330 c33a7aa0 43818a32 44895fe8 c11bd500 c1963410 4154860c 4452d964 c434bc1a 43114000 4205c073 4423ae8c c4b75a15 c1b13c80 43813aeb 43a0b638 42d5b080 c3455a64 424f2b88 c2c70180 429e2e20 c2b68c38 42acee47 c4a7e822 433c1110 4317a9a0 4347c38b 4426af80 c3812058 4314d7be 4359c0cd c4224932 c3bb88f4 4331101c 4384fd74 c2d89270 43981f18 43069f28 42890754 444ae294 c4b75bb7 42ca578c 43259cec 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005a -> bf43e0c0 bf0307fd bec7fc91 42536cb9", + "c4423322 410ded80 c29dfd32 c3981950 445dbe38 43477c88 4355953e 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c2ac8640 c35737e0 c1f419c8 4465fc2c c4134477 423c27b8 43719fbd c41e321a c3c72cdc c234f040 4252366c 445ee6b8 c3eb19f0 c32ca367 432cf537 c3a0b7b0 c4b95a38 429f3fa0 4373679a c3bd9a18 c304a308 42dabfac 435f36a6 c4656730 c4771f96 c2b64efa 423bc48b c3627270 c40443da 423d36a4 4383a444 c4b61b8b c4ab8b08 4314ced4 4343a445 c487ac4e 441154fc 42ebd068 43248b4e 437c8798 44b0edc4 42b193e8 42f3b65d c4835e6e 449e8db8 c3262e9e 438e5c1a 44098650 43fbe004 c345b3a2 436f1471 c4164226 4494effe 4312fcc0 41bd6eae 42ae7770 c4b80678 41f332c8 43427b5e c4afad36 c1eaefc0 c2494d88 4390fc9b 443ab7f4 422245a0 c3130ed3 4364d936 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3eb629ef bf6c5e7b be140a55 410b9d56", + "c3a8699c 43804dc0 c2b6f1bc c47a633e c4517fe3 c21d2358 435ece76 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c403c546 43f0dc38 c2ed7de8 c327f0d8 44407360 c291ade9 437a3710 435d34b8 c48f8b88 c301f774 437934eb c491d9ab c48b25d6 c318e3b2 426000b4 4084a700 c498434f 421c32e8 43656602 43cd2118 43cc3d90 42e85d0c 42d356c9 c28f9f90 c437abb6 c2cca435 42c5dddf 436ce9e0 c4896f74 428d330c 43110c0d c40bfc1c c4867e22 c1f41048 42c4b6dd 43168fc0 441b0ae4 c3358604 433d197e 43dd4994 449dbc7e 432fea3a 41664248 436eb310 43db97c4 c2923e8a 42bef8d6 4373e870 c4a7dfb9 4283d07c 423af958 44641f90 44b2f9d4 42c8c714 438ea8d2 c2659dc0 44400c04 430b7f44 428191f6 4214d520 c4b74986 c2c883c0 4309aaa5 c331dba8 441d0d8c 409329e0 43919bc1 4419e824 446ad28c 422d7f54 43707371 c4a995ab 44b403cc c31c6434 4359acf3 4413479c 444e7bf8 42c84340 437a9a85 44a43776 44a88836 42b44a90 4322b962 c2bb92e0 43156480 42813650 42d6edd4 c3a46dcc c299df50 4301869c 43704bd0 44863e22 4485fa9c c31ded5c 4342863c 44007482 bfa9cc00 41ee2b70 43832c70 c488e9c8 c3e4c71c 420f4ff8 4368c79e c3284c90 448aca84 c3286dd4 4378ff07 448a17c6 c4ae6e76 c2c59911 43569c41 c4b95985 c4b458c5 c2c73294 432d43ec c42098f2 44270a90 433c98c4 43862ed1 c4a98ab0 c47370c8 41fddd20 4299e545 44b77b14 446bbbc4 432eabd2 42827d03 448c9254 c2a39dd0 c3360f70 4286271c c4605638 448e8fea 429bd0c8 4335397d c3d23a20 44ab6f2c c326e7f8 43379a28 c2aec780 447d0af8 c14dd810 42e2354c c450fc6a c48f26e6 42e6b65c 437d4853 439f6948 42fd3060 c26f53a8 438e8a3e 42a86540 4409a23c 4300e8da 4390201a 44491ca0 c3d3ed20 42df23a0 434094b2 44a28970 4491a950 4333b4f8 42f9665e 44b7c004 c4a66e00 3fef0a80 4239a8cc 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000029 -> bf6d4084 3da33e88 3ebbf2a5 40546bdc", + "431a6528 c4a1bd33 c250a618 c3beb454 c36fdc68 c2e799f5 4357326b c44f2632 c4b7efc4 43146882 418c22e2 c496d5d2 437cab40 c285df5c 4235e121 c4976372 43fd1fac 40de5ec0 41d64f1a 44307684 4471b5d8 c3478bff 4276c065 c30c9028 43f7cb80 4203e754 4385c722 c4a0614b c3c9b404 c305ef28 433bf120 43f43bac 422f3120 433247c0 42d8a810 c4b35bf6 c40f9390 c309eb4b 42accf53 43a7a9e0 c43a1152 418de9e0 42de8b33 4498f6b8 439b809c 43064378 42c470b6 43aee970 c42a1837 431d7b2a 42f4b6d8 44b6bc6e c4a21f0c 420e6f60 437d1ade c45f7f8a c483121e c2fa86e2 43573935 447d3474 c40537fa 425868d0 438172fa 44812072 c435edd8 c25b0ac0 43331ecb 43cfc88c 44b91942 c31fc273 436e7146 42229040 c43891ca c1ac6db0 43162db2 c4268cf9 43e3e114 c2b7bc44 43802c9a 4477273c c4265363 c2b6c9af 4371be20 c2a90770 44504b6c 424a1314 43369798 449f976e c49338dc c3112d00 43835416 c48dda8e c31d6508 c1ed4088 42bbda33 43aefb20 440b8f04 3ff99f00 4346a34c c44292a8 c439a2c8 42848c50 433eac5f c4758ba0 c493c2df 43158e7a 435eaec8 43b6573c c493e1d0 41c12760 43298628 448e8e22 c3f3f438 43174074 432c37f1 c4a86d73 447c1b80 c235b19c 41ea8a0b 43c4b26c 4448f70c 427c2750 432405f1 4485b372 c44af8e7 4284ceb0 41e925c7 44760954 c480bb4f 4312b026 4335a343 c4845bc6 43b3c86c 422e40ac 4331585b 43a8d220 43dec174 424a6918 42e832a8 44977024 44935728 433d6f1a 4377c793 430d2440 4382776c 43446ef4 436d76d7 43503790 44896e84 c2d12ade 436c591f c41645bb c3393580 c3404328 43130f06 438e5594 c4890939 42d52e34 438dc4ea c3341e10 4466e8dc 432222d4 4310ce17 c443cde6 44afb09a c21b2348 42aaf825 442b5798 c415312a 4332bb14 42fd5dd7 c459c5c3 c4b3c809 c306e3a5 436015b5 445cc6bc 447d3ff4 4341a080 42b05801 c44448f3 448f1e62 bfadc300 43906d42 449cd0ca c49b2be6 c2a639dd 43578bda 4396c448 c48863ff 4340dd74 43149cfd 448f42b4 440973f8 432a5be8 42174ee8 44b6d67e 41d1c240 42019a6c 4331c6e1 c46d0bc1 442d1800 c331a383 42afa165 449d5f20 447c2370 41e2cc10 42b5d9e9 c4286289 c42428d2 428e9924 43659840 c4830fb0 c113f780 42a3f594 432be903 c40d8b89 44a66a80 41955830 42592734 44043772 4411b1a4 427fa638 4335ba4a c407d063 c2bae5f0 41021960 4322a568 c497fe32 c4a27122 42c8864c 42b9aa1d c4368070 c38db5d8 c325c092 431d2c6f 44744f5c c44bcaa7 c3373cc7 42071bd8 42380620 c4b6904a c1d575e8 42cd3f16 c2fbbc80 c44e4b9f c28a0570 42f35d40 44b35ee0 c3c69ec8 42e3bee8 41b598b7 44ad46b4 c3572610 4320e69e 431801dd c4a0def6 c2d99150 4333c3f6 430cbbef c40a1b8a c4aacf37 c2fc815c 428d069e 42b6ca40 c3a11234 3e64e000 43620b13 c3850d98 c462e8d3 42ba0d30 4208464f 4496b37c c2d3ebd0 425bd00c 434a4e68 c43346bd c3ef6a14 c3125a0f 421502de c4867bd2 c488cb27 4199bde8 435cdbd3 c423653b 441b25e8 c28d2730 437a3afb 411d2b00 438fe8a4 c1cb4020 42e5f6ee c425da17 4388a618 42d4e830 43128a35 447698b4 c44e875c 42e723ec 41e7c906 44284918 43777d70 433d8670 436c739b 43ca887c 441743dc c30f3b2f 431a3e3c 445a2cf4 c443a79e c2d90717 435de143 c3ff929a 44854a1a c29874a6 42798aad c129bc80 c3003118 432a9c3e 4378d820 c4a19a2e 44012234 c2cea356 4376743c 4443ba34 c3c22a4c 42f34e14 42c83f30 4414e8d8 c47a1549 4305bb60 41a44d06 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000052 -> 3f062a83 3f4cbfe7 3e95d73a 41fcd7fc", + "444861f4 c498f8a0 4200b96c 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "445904b8 442106d0 c1a2af08 c4ad71f1 c430e3b7 c2547124 4356b354 c4af5a97 c365b928 c2aeaa3d 4333cb1a 44b1e2e0 c3c0b610 c2a1849c 4390f8d9 44ba22f4 c4a7ec8e c27ebab4 425fce88 c4b409d2 c430a69b 431f05ae 437b08b2 44602208 43ba8480 c2185314 42839468 c470a22a c4334ee9 c0b53240 4363a8d9 c4b4496d 442bf71c c257b120 42dcb8f2 c4350186 c440d4be 42578478 4392bed9 c31b9850 c4a6d5d2 c281776e 42f0cf2d c4b0963e c4911b08 c2f63ef9 43103690 4432acf4 438135f0 c32b1139 42cc165c c4536f7a c4ba64c9 42c5d2c4 437a01db 44092c44 442f57c4 c33d11f2 4301cf1f 4486c19e c473ddc4 412aef00 4369b9bc 44a417d4 42bab620 41d40788 42a224ec c4b92000 44a982d2 42a55528 436481c5 c3777cd0 c3cd2438 42a8415c 4390e511 449fdcb0 424a32a0 42f1a3d8 4350e136 c34b8ad8 44a5bf5a c192bca8 4335f96d c4698e9e c478a932 414fc540 416b8fed 44b4c0c2 42e17cf0 42828a70 43223638 c4555317 c450d3c7 c318b7cf 42b2821c 42aa62d0 43481938 c1b600b0 431a6a44 430c60b0 44a7ab2a c18b4b48 436dffd7 448e4d90 c407daef 431ff482 4380f3ec c41b86d5 4453dd98 43208666 42689d6d 44a1e716 c3edb380 43406494 438a044a 44258674 44a2a292 42049a58 43690c2b 44bafed4 4315ec38 c2bd8b9c 4311f025 c41e5c28 c46ea6e0 41729750 4285a53f c43f3977 c33ce9b8 c1cb8a08 42e4914e c49fda56 c412f328 c3106670 4316a917 c22dba80 43fbe8f0 42aad50c 43831c68 c42d93a7 4405367a 42b2ec50 4287b8ce 43cc6744 c109d380 42150124 4383bc2a c442905c c4605d2b 41a84998 433676d7 44b56efa 44027efc be897c00 439589e5 440a0934 44b6e4fe bf879b00 4354538d 4452b758 4418f5e0 422fb364 43810ff3 c3e6dc1c 42fa4760 c3231242 4340067d c45f19ad c1429880 c1da2158 41ca6768 c451e295 441fdc08 3e677800 42ce339f 4474bd80 c4a3ab69 4304fe44 436f99a5 43850130 43f5ce28 433624c4 41b682ea 44902a2a 4480223a c246c1e4 42fbd80d 44648dbc c4862e98 42f0ca68 431a5cf8 c4770f01 c4b58d24 c3247d58 432dbd2b c4a212ce 448a04f8 430d5eee 4215af48 c38eca24 44ae8b9a 42893390 4361f1be 4449c2a8 bf02f000 c248b7ec 42b0fe14 c474ed84 c4714810 c303cd03 433df1ee c4814962 441a3854 c31c65a5 422fd178 443a70f0 4344e190 433c7714 431c46ed c47a8c30 4410716c 43012c96 41dc0406 441237dc 44a2c2e8 4318de64 428a7cfe 43ba8e18 44a37b04 c2c569d6 438ff2ee c45968d2 4432720c c234ee7c 433ebb86 44b8a360 c458f515 c2b3dcbf 42f312d9 c2c52ac0 c4941668 c2daf57c 433fab6a 44b0e19a c46fa247 c27be3fc 4310d6c4 44989228 44b0e25c 42fcd2b4 431ba1a0 4494d556 c3e27700 432b729c 43588aee c4860e32 43a6b9a8 c33420fc 437c252d 43b07c90 c4774de8 426a1730 429dbd43 449f6594 c457d3f7 c20f6494 430304f8 c407f7e3 c22a7f80 c3161d0f 4325fb13 c41d28a8 4381d468 c3391816 41dd2411 c2ca4380 c463a235 c3248860 431f3237 43893160 c3785eb8 c2a20d71 434746e1 c48e87c1 443c4acc c32f72b9 4381dbee 4467fb24 440306b4 c0f714e0 42f11b4d c47e373c c3336f28 42d58fc4 42c03070 c2f73d80 44b74eb2 42a11c68 43663ddf 444a94e0 449f78f8 c30d7fb5 43041bc8 44821d9a c426607c c2e69f4f 42c7fea8 c40d2e57 4489eb22 c2cb422f 438e2ca5 4286e440 42d34020 c2cd2ec7 4288427a 448bcf58 44b91c44 c318f99e 4271d79f c482ee6e 4313d8b0 422ccce4 4344c31c c4b996e0 44369f98 c24516f0 438049e2 446fb36c 44344a48 422344ec 43147758 c16b3600 c40016e3 42c37d18 434b32d3 c42bc83c 448d2390 42f49024 437e1be6 42ec0120 443c486c 419de238 438d856c c355ad08 42cfffb0 430f7e9c 433f7e29 c4637fef 43478350 c1f30910 4310e5e3 448b38b8 42a45220 422dc458 42941453 c4090e1a 40d79100 c206732c 42200892 44968122 c3cfd0f8 c06d3180 432fb2a4 c42fb20a 444957c8 c19d05b8 42841868 445a22bc 4367f598 432bcbd8 43957c73 c46a0e98 c4282503 425777f8 42fbe32b 44bb7a94 43f9b654 c2e3d059 43126c9f 4490491a 443c3c80 4275c240 42a6cbd3 c409bf9a c4882bbc 4229f080 43915182 44257514 428d34b0 c271b164 4368ed27 c2ed9720 4417ab88 433029fa 427656b9 c433c4a0 44b33cd2 428ca0f8 43497df8 c49c195a 43f833f0 4305fef2 433d9c56 43cd8540 c35936c8 c2b234ef 4336ae39 44934504 c45a66af c2df4b29 4346ba48 c41fbd8a 44a713de c2e1070a 42566be9 441be474 c444c58d c2c3f88c 423d7abf c47d50ef c24963c0 c12efd10 42af0aae c44bb773 c47e6a70 4166bfb0 4316da2b c3f6e770 c301a190 c310338d 4182fc67 44b80220 4324bee0 c2354aac 4293309d 449bff3c c4aea7cd 4239bbb0 4385de08 4486dd14 c4b776db c32a009a 431e6cde c41402f5 44149e20 c0ea4160 431f4f4e c245de20 445988f0 c13fdc60 4184990e 442732a4 430cc5f0 bf456500 4338267d c4666460 434b0780 c22e72f4 43141baa 4492d3ec 445aa87c c2bff52a 43086b63 c4a18303 c461d1fd 428013b4 435e4eee 43308ae8 44bb4894 c2d480bf 434d5865 43b654f4 c3c88e38 c2b89ea4 4257b876 c389aa34 44acd14a 4339dd64 4323c39b 44064f66 c4b38d76 c3472020 432826d7 44b689b8 c48fb0cb c2a0c354 430ab111 c4a62f15 4456a178 c33d6834 42de05e7 43d6ec90 c4870e8c 4346e134 41edf938 443c0820 43d098e8 c1b7f860 4220581a c4ad3a2e 443b336c 433667d0 431662b8 43270690 445e5020 c21e3684 42e2d90a c426b9ca c3e61dcc c2f629fe 429a89fa 439a8584 448747d8 42edb940 4383334f 00000080 -> bf3a392a bf2f971f 3c9fbe01 4331d79a", + "44806e20 4284a3d0 c21f0d70 c454c049 440370e8 42da237c 4392138b 4490c55a c4b0211d c0ea2960 42ea1389 c4602665 c394d6b0 42d753ac 43205160 4487580a c1bc26c0 432bcaa4 41e7374a 42592ce0 44b7a0da c2f7b830 43598e2d 44a5e790 c47a7372 42a833f8 4336399a 445ce390 4437f9d8 42e20708 42dac331 c48bee42 c425f30d c33998e8 428224e1 c1ef3900 c45e1619 4300b108 41fc7bde c46d7e9b 4205c6a0 4287b214 43682aee 449d476e 44b6d390 c3295fad 438e24a6 c3669740 44203840 42c1ad88 42e9c7f2 4489e0dc 4464e058 c2b6fdf6 435c41fb c434e45a c4456c68 4336faac 41c49e42 44ae6016 c470e793 c300a19e 424b4672 c43d28d2 c4875ed4 c2ce341b 438abf76 c3cad948 436dc3e0 c33cad8f 43488a12 43ffa5b8 44852cb8 4318bc48 41403f6e c406f53d c3633c10 42ed09b4 438f74f6 c499f007 44465448 c303b3eb 4205d5cc c4ba4c6b c381149c c11fe200 42ce9380 c4b8b27c c40dc3d3 432c6fe8 42a6e497 c43e2c19 444b98c4 c31c4303 413518c5 c3fae91c 42ad30b0 40ea5840 436c50ca 4437f7f8 c481b006 4201ad00 437eb9c1 440afda8 c49b99c0 429e8674 415a3336 449ebfa6 c430c479 c2180c08 437c0568 c3329608 c4ba8901 43384e84 42885370 c4b87b1d c496ed2f c310fad4 437bd05c 43f5fda8 449db600 4325f854 41ccc969 43de3e48 444e47f4 c20f0c38 438759bd 44385714 448d7c08 428b6100 436f7206 44983ae8 c4b589b7 c2e85549 438c9f92 c46d74cf c401da90 c2271608 438a2151 4421d7a8 c2e12610 c222a27c 43618481 449840ea c4974c6c 42fa3be0 42a170f1 4469058c 44994b3a 4346992c 429c6a0a c3a3073c 440a59ac c3197029 43792be1 c44391aa 42a38f40 c2f36cb7 4388fd95 4402da3a 446063f4 c2ba9854 41bacebc 43872128 43aaab60 432b7186 43052044 445bbdf4 c4b1f663 c34121c3 434f8b7d 441777f4 c45270f6 c318c790 4288e17e 42854160 c4762de4 c30ce38a 4329f8a2 44ad57ea c479f3a2 c324b0c7 437cbb1f 448ecc70 c336eb78 c2203294 42947555 4495cf70 c3acb7d4 429cdfa0 43484737 c48a5252 c2308080 c2cd109c 4389e84a c46435f4 c3dd86d0 c30ac4d6 42bd7e4b c4790db0 c3a7ab98 c19d3360 436db9dc 4492dae0 c40a8523 4154ba80 426f6845 43473f68 449b950e c29dfbf4 41ec8deb c3b4c6e8 43d82434 43333656 431d3e88 441e2f68 c352bdc0 c305e744 42573aa8 c456929c 441b58b8 41208080 43005bec c3fffcda c3d0712c 41a02648 4291aaa8 44b2674e c45fe9e2 c345ae1d 426d139c c4b47e69 4485549c c23a160c 433077ef 4421e468 c413bdc7 433227ee 432dfdf2 44982ba4 c44c050e 42781a30 4393c4a7 c49c9fdb 43c0eadc c2b2ae27 43173e76 42df90c0 4430f294 c2eb72e2 43682152 c46ab1ca c4babe42 c328ab56 430fa1cb 44882d94 c4ab78f4 c18d0de0 4323dddd 4446f1e0 c4099222 c2f3126a 42e7ae5c 4499684a c489c3e4 c3347b2d 4321f0db c433b391 c3bcff78 42e98188 43004aa6 c23ba4c0 4395a0c4 c2cbc85d 4393f5b3 c4a7f9c9 42f2d260 c28b5c30 43553630 c49bdaa9 c4a3e023 428f864c 429f1764 44b9e8ea c4431ff1 434120ba 416d536e 444fea7c 449e9608 42a8b5d4 434d3426 448228bc c37f8de8 42f02f10 4334df61 c4af91e6 c41d6d76 c329ca92 438eb530 436f7188 443d896c c2daae0f 4265618a 44a68490 445f571c c2aeb7b4 433452c9 44408f54 c498d9da c212060c 42cf2634 4422b484 443f649c c1ac34a8 4355a7e0 43cdbff0 44ab215a c2514474 434c1552 c4835293 c4af7353 42c55ec4 42d7c049 43f4ab98 c48ef670 41c29868 41f159d4 4460a444 43ea1578 4335a576 4366f885 c2d24f10 c3b9dd04 c317a244 42d45eda 447c42e8 4241c140 c2a3634a 4286d2f4 44abd624 c39cc0ec c2c010ad 43509953 4229ee60 c3a7acc4 4336786c 42129ab8 44afbc6e c496c306 4334d1d8 41ff14e1 449dd550 c38c98ac 42efebf8 4328d3f2 c4b93fb7 4491ee3a 3d6f3000 437954e0 c445449c c457f566 42e63d68 421ccd12 c487a4f8 43dc2690 430f16ca 42d9b146 43c969b4 c4908ece 43125d78 4234622d 43f0df90 c47692cc 42a8d154 4364bfe5 444c28fc c4a44aab 4301561e 42b370ab c47d0eaa c2ba8920 c31fa1f8 43557359 44190148 448dfe5e 43086e8c 41d822e3 43649118 435bb2d8 c28b76b8 438e5813 c4b57ffa c2b118a0 4338660a 43626410 43a18bf4 c47f943a 4194ef70 4382c5a9 42b6f720 43acfd8c c1879990 4380d8d3 c448f54d 44784590 c2082f88 43636641 44126f70 c4aa670c 42dc600c 438de584 c4a2d283 c44e1027 4282271c 4368bd2a c491d2db c49b2860 c2254e48 42aa9626 44654404 44604848 42d3ba64 41dd9e47 4458a1b0 449d0468 c31dfdf4 428241ca c4595220 44ae5148 c30d5b04 433bc40b 423828c0 44aafaee 42c385a4 4328b4d5 c4b74494 c43de629 c1433680 438394ee c2d967f0 c4993714 c25a8218 4323df6d 445f52ac c3b1aa68 43188ea6 436f515b 4466d844 c4664d34 42580fc4 43213892 4444e878 c41fd136 c32f5147 435e1eee 44838002 c39b2040 c32de3d9 42c9bd32 442981b8 c44e6925 417c4060 435dd0ed 44959e46 c47d232a c1e3f1b0 42277008 c265d700 c49036f4 42cd6c78 43825424 43af1f4c 428e3cc0 42ecb168 435922c2 c3412af0 c44773a1 c2bd6094 43001ce7 c4ad8155 c40b4c5b c23c4fc8 41704ec5 c3ff49aa 43bbbd40 430c2d32 42987e36 4493d720 c4b6a4a9 429d46f8 433c438c c46edaf4 c480f124 c30d3667 429e9bbe 431c0930 43c78c4c 425294f4 43423b37 44a9cbb8 444ba658 c2981396 4352c936 c33f8b90 444b06f0 4321e1a4 429e86a8 c1d6f100 c3e4d51c c2a353e5 433cd08f c48982ca 43ecfbd0 c2b32e58 43016794 00000080 -> be89ebd9 3e86a669 bf6d2a87 42d0f92a", + "c4382de2 c4bb6e36 430312d8 c460c067 c4554920 c14d7880 43037604 c48638a4 44091b68 c17c33e0 42ee81fb 432aa8b0 c47d5022 42f21020 4338b5f2 43bfff40 c3088238 c2bb5ef2 41344073 440e7470 437377e0 41bd2320 435aeea7 43a767b8 44320b48 4195bf38 4359f654 c49d808e c25f3740 4116a360 43849e77 44306be8 c39b4034 c33c09b1 429ad0a9 c3d55038 c4049243 42c9f750 432b370d 448040e2 c429d963 c2a4bd73 420df4d2 c327ab58 4487c9a6 432da9c2 427ed3b7 c1a1b8c0 c4b63173 4007d680 428a067e c4b7a938 c38aefd8 c30afbd6 438d7016 44800ebc 43201990 42a059dc 4310409a 43fd3c20 443c168c c280ee3c 434998bc c47f8bbe 437162f8 42626a00 42620c7b c489defb 43526ab0 c2cc45b2 42c4c2bd 44178798 441d6784 c3070ece 4302c1ef c41fb06d c2acba60 c2b2ec62 43635b19 44636d00 c3cf9988 c2dceb9f 41e8c146 44b288e0 c406f751 4313f520 42d227a8 c44007ea c49a2457 c22e79a8 4373487a 43b832fc c41ddc77 431ad616 4211d234 44a302fa 43c81870 432b72d0 43823a9c c4518e65 444d5404 c332dbfb 438ada51 444a1e70 c4609719 3f14bb00 42c2362a c43f3c2a 443119fc 427630f0 42eac267 c4273c01 44a919d6 427f8710 42c6307b 42a19b80 c42a4122 4293ab1c 437d6036 441ded24 c40bc227 4326923c 41b4a9ae c4709c4d c3334b60 4291917c 4301a192 4472161c c4a0d37d c0ea2460 43479183 42ff8b70 c382f408 41390830 41945ae9 c40f704c c4157474 c2a2eb5c 436ae88a 446ef1d0 43509648 c326ddde 431d44d0 c342be70 c4b3bee5 412f6240 434cd728 43c2b874 436f9a50 41cdbad0 4349e4e0 44a84de6 c499fa27 c30ac4a8 43888179 448600ea c4b7f397 42c32640 42d2f808 425f0820 c49a2698 c10f7810 4271b644 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000028 -> bf701dc5 3eab8dfd bdb6dab1 43397543", + "44af2908 c43647a8 42b7baac 43c35cac 44baed90 c2db08a7 43929d00 449963c8 c4b3c31e c30f9590 4299e079 c38917d4 43a274a8 c30898ce 43895c4e c4b7b6b6 445407d4 c2cdab2b 431cfbca 447000c8 4419a78c c195c560 42aa9421 43b6f668 c475e8db c2a09243 432b7818 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f61ee9e beee73e0 bd84d993 438e0e96", + "44827e42 c2b5a460 c2f6b17f c438f403 c3434cc0 c2f59acd 434a4b1c c43b9ee5 44bb56f2 42023a94 42d81688 440acb94 c4ac95e1 c32c7ef8 4157ddaa 440415e8 c319c908 c21e2558 4333c640 c37ab970 41cbbe00 c29b055c 429c1b9e 43fa9324 c344baa0 c2a3bff5 42ed33e7 439d0e98 44610984 c1860370 4354c3c6 43fe2064 c4b7eb46 427353b0 42bcc3a1 c4a91708 c4059756 c309ea9d 427125f8 44ae9150 c43bafda 42d034c4 436d1bf5 43f24824 c4786ea8 c31205c2 434ae110 c3ad5868 c43d50fa 43325828 435bc7e7 44954c32 44b0c2a8 41a223f8 43630e7b c365afe8 4485fa9e c2ce7c24 4377807d c487279d 446ee148 c330a64b 430c7060 42f8b580 448f539c 4286ee9c 434de5f1 c3a875f4 4450572c 43392dbc 42e174e8 c41ada5b c44c2f05 423fdd54 426957a4 443a2c74 428a8840 41ea1278 431a8143 c41663dd 43c3517c 4344053a 42e32221 4484d21a 44300dcc 42f0d974 43546fba c2f6b7d0 44975a68 43130398 428340dc c49d817a c3f5a518 c33a7934 42528731 c467780e c40e2620 c2cea731 436c007e 3e8d3000 c2f36750 c2b212e8 4339eda1 c42186bb 43897020 c1e07880 434c6869 c3ded4d8 c3ae0224 c347e77e 43878cf4 c421e716 4436b364 40f98020 431db803 4476577c 4416efec 4218f628 4373f25f c49d1253 44b07a68 c2e2b208 4316626e 4499d838 444b5910 c2b49966 438fceb4 c4658bc3 c2a28cc0 433e1eb0 4308f38e c423f23a 445c5f74 434747c6 437d9d1a c3dccb14 c3aee5ac c32b0088 42ac4965 c41255f7 c48a7dc6 c2756c28 41fdbc3d 4497436c 44af31e0 43231316 42d71a3d 446d8ef0 4292a5b0 c29128b0 431822e3 44212680 c3431690 429e8a24 43238cdb c440e604 445bfe10 429d1e10 431eea52 c408f820 c2a4a370 c116d3f0 4384634e c388f538 433b6d80 423e4f68 43182fd0 44380cd4 44069574 c3095f29 430b10ca 43c121d8 c3fa7182 3f3b2100 438ed0cd 43b9ff04 c4865880 42012508 438dbe9d 44884aa4 44a43344 c30fc7de 434c2780 c4819dba c231e780 42b25128 437f774a c497a106 c2bbb210 421b979c 432c3fe4 440c40f8 4330fb28 43321358 437b5fd5 43e76294 c2bf8ee0 4284f3f4 42d9b7cf c3e3a2f0 c377d6b0 421192d8 42474472 c3c631b8 448c0fc6 43108c50 42f17608 44a26dc0 4439ca9c 432231c6 421d39f3 c4578b4e 443dff80 42701750 42f01d32 c3fbfb5c 446633a4 42b35820 438ae911 447eaf4c 444c61cc c2289224 42b479d9 c49caccf 4391a254 42ce705c 41f1d882 c3a83a0c 43fe40c8 c2a30b15 425cdf24 c292ada0 c443221d 4217b7cc 430b5b46 c3e5ac98 c4ba4820 c29eb2c7 42b6e601 43b9b4dc c3ee6652 43255106 42ddcd41 433db1b8 c136fa80 c27500a0 438c61fd 449959ee 43450bb8 3e005000 437fb91e 4436eb88 443600d8 3f067f00 4330f66a c4b2f895 c40b4640 c331f5cf 436986ca c49034e7 445ab4f4 4345979c 42ace972 c3116c08 443b2bf0 4248ce48 43920dcc c4800f52 c45e0005 c33af365 42d2aec9 417ecf00 c32a0998 c2a03a35 431a9197 4486b4f2 c4a9fbed 42aac2d4 4333f187 c43b568b 447347e4 c307ab98 43786dac c4781bc2 c3196028 c20cc054 435e8934 4432e1b4 c4b45749 c1f565e8 419b97be 44a80e52 42b91370 c305d5f8 437b562a c3e55ee0 43e0799c 431e9030 4375f6cd 448b01b4 c3bcde30 42dc223c 43566e84 42c65a60 c476566b c27cc7a4 42c25502 c32b2260 c4ba7322 42ad3638 4392866a 43974630 c2b97980 41039df0 42bcd2c0 43c42d68 c47623c6 c3223812 412c4d35 c3f3b3d0 44933b9e c2d49427 4249b912 445283dc c4bb7c28 c23f046c 43924c0d c4269135 c2c2e040 c30b6dec 428d8caf c483231a 4495eb16 42ac4318 438409de c4a90c1b c3045688 c2a8b6a8 4395a85b c4936d3a c491b40a c2a80ee2 435f5afa c4141168 c31e2a48 c1da73d0 4314ed89 c4b7a50b 448c6040 c2eedf30 427350f2 432597c0 4493a8a8 c118b860 4392d1b6 c487121a 43cba058 4329b336 43249350 445a33a8 c3c6accc c33eef66 43927022 4483c3ec 41a6b7c0 43024b24 43554f3d 443e51ec 43d8a7e8 c2ce8193 4272e195 448f83bc c49731e6 431e50ca 42971f70 439a0a60 c0896f00 4306bc74 42d5607f 434ceb50 4496950e 4339ac36 42fe12bb c42f6acb 44b28ec6 4276fe30 42a8cbad c36510e0 4431f2bc 42bd0d9c 4301e700 42bdd2c0 44401128 c2eaa331 43606689 c49a339a c40b2165 4319bbce 4370bb88 43b65114 442cfff0 42b43dc4 42e83073 43c6b3f4 c4b18ec9 c2a5f245 430eee6e 44babcec c43b73c7 c2476894 4343f5e2 44602ed4 43884330 4339e28c 4385f5e6 c390f294 43b2a1ac 42a77594 4383e82d 4484374a 434f91a8 c2b20fd8 416c8a4e 44990b9a 44764ee8 42653770 423adff2 44924a98 c480d23b c31116bc 42bb2814 43ab5a00 c4ac0bc2 42a97dc0 437cea67 c472cfd1 439381dc 42d8e278 429ef77b 4409b0b0 c4640292 c2c12396 42715a9f c3cf2880 c497d8f4 423745f0 438d6a55 445a8864 c409028b c2833eb0 43123721 439dc0bc c4b81514 433138ae 41c97696 c30c44d8 441c9ab8 c1874990 43732d3e c3af1f20 c47a8970 41da79c0 437e084d c4913493 c49acfcc c33d3251 4365bba1 448e1dda c48bd910 42aa8178 4373756f 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000075 -> 3e2152bf 3f752bac 3e769a45 41dacc69", + "4417d93c c3f72426 41e8edd8 c4948f35 43e7e6dc 42fa7020 42900ab3 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "440c3180 43c65834 c2263270 44094634 439dae54 c320bcb1 434941f6 c3ad67c8 c2c35460 c30fc0f9 439138d3 4485a12c 4253a200 424c573c 4302f466 c4a4b3a6 c428f4a6 c32cc62c 43813e20 c4a4517a 43f67504 4226b364 4323f70a 43b696dc c488b58b 42fdfc00 42ba2634 44354e5c c3e1e59c c3325171 4344f4b0 438749ec 44079734 430448e0 43955857 c4b3a402 c3245a48 c21961b8 430458f8 43ef5048 c452660f 42c22404 42a27f9d 43f69f38 448ed9a4 423568cc 434d758f c4b0abdf 449392b8 c336c810 42f053e7 4437bcb0 c3d678ac 426108f0 434c922c 44afb9d4 c41dc923 c335a99b 4328cd16 4457baec 4469c514 43271b6c 41a12fd4 c38223b0 c142de00 c24507f0 4273a5b3 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f19c8d3 befaad3f bf21cabc 428e51c9", + "44b5233e 44ac0088 c2de2bc6 43db43d8 c46305b2 4308f098 438aa2dd c3d43fa8 44896fec 42c0a24c 432165d7 c485b19e c435cf22 430b4904 42c5afb6 4402bf38 4495e27a c2d57616 41ad205f c47f2ac8 c4b16b6e 42b91244 42fba2c5 4485b472 43c95f2c 430b23c4 42c2fc84 441bc2dc 447955c0 c3049c3a 431c2ec3 c33a8810 44b6a6fe c2255d88 431a3f15 c3599990 41dedd80 c3207a44 42614518 445fb914 443afaac 42302990 4304b46c c4123628 c4b1ed40 4266a6b8 432ab0c7 c4a16ac1 442b7a98 42bf20fc 4336e970 c4859e82 c488b7f1 412dbe00 43398d17 43f72e7c c454d82c c34261ff 415759a1 c3e1d184 42f3e490 c2e4d796 43228e45 441484c4 c44576db c3264df8 425d6f9d 44875a5c c3dfc854 43178e3e 4267733b 4461aa34 c49ff408 c2ce8679 43010969 c379a958 c40fd5e9 c322458c 437afec2 44b7c8b8 c41ab126 c2d6487f 4392f614 c4986c97 4358ae08 c25f5dd4 42c3652e c2f07250 445a7934 43050ba4 428e87c7 c1645580 c49aebcc 42f83574 42a96fa5 42d42640 c49bfb78 42b41378 41ee8ab2 44a57bd8 c2130a40 429a8800 435a6f7a 448327f0 435d9a90 42ec49fc 41f2eb91 44939718 c48fbf23 c2f92507 42e2cf4b c48dcae3 c46dbb25 c33f43c7 41d13f81 c40f9f75 c446d260 c1d7f0a8 4239ed0e 448d1e90 44535ff0 429d3014 41f19286 425a6020 43fb71dc 4287d714 4359100f c4319a2e 44b592b6 43160b9c 42d4fc18 43795f50 c4b1c18c 431be41c 431bae07 4396deb8 4220d600 c3144855 4320b420 444fa620 c41d5f08 c211de88 42db15c1 439a17d4 c28fba90 c324403d 42c91618 c4a31c42 443ee9b8 4333a882 42c24367 43e34af0 4394f200 c2f66296 4260f85c 445a7248 43b947fc c2ef9060 427b423b 44978682 c49cfe37 42f59f30 4388dc25 c441d40a 44857056 42dac16c 42173f45 c41b06dd 4269ed60 c18f9530 43709435 c493e561 449ad1b4 c271b508 4333fb86 c3be7f80 c3dc25d8 c153bf40 41b1cb5c 436ac580 c3d5a060 426e5a40 431d81e7 c4ae5b44 435ffa70 4290f68c 4393a7ab 447a7954 442cb3f4 42a8dda4 4392ac70 c40c5b44 44a7b0b6 4238f5b4 4353b2e8 c24a4440 bfd22000 c31f532f 43629940 4417f358 44b90d1e c3406e93 43283544 c4166f50 c481bb9a c2f42016 43603769 c43b3a25 439ecedc 42e52a24 43090722 c480c5cc c4801a57 42262e0c 43287b13 c34adaf8 c41736dc 4315bb5a 434b66df c4740676 44593680 c2be7335 432d471f 44674f0c c2839290 c0e34e00 425fc954 c4180fc4 43e62128 c31ecc94 4383aa1f c43a56f2 4425045c c2805bc2 4333969a c3f201b6 c494b72b c2e89e81 4384beda c3b446a4 44a5f28a 42bac550 42984b49 44a66e3c c42a356b 43002e60 425b2e20 c3eb0854 c4a19503 c2bd7e9d 427e5361 43bbaf50 c343a550 41e73a70 438961f4 442da640 c3045200 42bdb4e8 437830f4 4400da5c c4add8f4 c1bb6fb0 43371d22 4109c080 449ad718 c2fad0e8 43089bf8 446f2158 c4b458c6 c2e9bdd0 42d2cb6b c49a1122 44b8ff4e c2aa549d 429a9f2e c4a6713e c4aecef4 423ebd40 432540e1 43ec6d70 c4012afa 42fc1994 429851bf c3a49170 449cd6e8 c2c9427f 4376dc71 c48416ad c35c4b88 430d4d48 43850063 c3c88fdc c3a82f38 c2e8a3f0 42db2d6b 40534400 c4884e26 42b42dc0 4197b4b2 c49b08c9 c3ae3230 c2837fee 42d00e9d 44877bf6 44a2d0da c321c1ac 4341389d c4841d00 c3efc584 430ebb62 43545461 447c82c8 c45faae1 c30681fb 42db8940 c45109e5 c4570870 c2eaacce 43338b06 43f6b90c c3c36c78 c2a8f1b3 42f7848c c47aa271 c4033597 433910d0 43555ede 4455184c 44a6610c 42b8ce14 438a58d5 c40f88cb 438474dc c1a3e638 42b2c642 44b88e7c c1daacc0 c2550c18 430e45c9 4471f8f4 43aef13c 42874068 43743514 43513720 c48129a1 c335909c 4266d67b c44ee3e4 4488f07c c3172624 42baee2c 44a132da c486c728 c255b800 4359e382 c497db40 44a641ec c308a23a 4325823d 44b0d118 c39e80f8 430b1176 428a54f2 43a3b81c 44a3f2c2 c2317e00 42a40efe 443dbf14 44923e3c c26cff2c 435dd065 4481ea9e 443be86c 42d199dc 41bf053f 44167d60 c2618020 43010370 414f9460 c425c672 445f9c94 c1125be0 438a3f9b 4471299c c32a6a08 4343e898 426ae9d4 c4509751 442df160 c300852a 41c135ca c3fb4a72 4477f4d0 c0c51b40 430634ee 4449b7e4 c2d1bc30 c2f13a49 43416fff 4447dfd0 445f4880 c20d9154 42d5d0ca 421f8940 c3a26608 c1bba020 427802a5 c3b61d24 c4081226 c34184a6 433c0392 c48e314d c483f07e c2c22ef9 427119bc 449c7324 44a0c4b4 c23c0c20 426880c3 44a7c8b4 c4513896 c33d6694 4180e2b2 441e7624 c413b0bc c22353cc 41697a0e c42f8afc c3f97260 c2b0e21e 429ca735 c422f15e c46881d1 c2ccfeed 43159068 c3aa0e98 c485e334 c216f198 4306a584 c4bad07e 4468d6d0 42e78ce8 4387fabc 4421ca18 43429348 432b30ea 427dcd12 435c0370 c40d9234 408e13a0 437dab94 c49c88ec c4af4e9a 4294185c 43282efb 444b68d8 c3a453a8 42449cc8 428decc0 44b92e22 c35f67d0 432559c0 41b82444 c4ac9f15 44527260 c2871f14 438bf862 4497a702 444f02e8 42e56318 436a870a 428a5540 44a9beda c30659d8 4246e32a c34d32b8 c48d4d96 c29bb7e3 4251d9f0 c3bb58e4 c456cb0b c1b801d8 438f6e9f 4471f3a8 c33809e8 c30ac934 42a521e6 4169d580 4414b89c 42a808c4 43957232 427101a0 c4646a92 c1cccb58 43312044 4494e744 44376978 431173bc 438c97c9 c447ae0c 44ba6e3e c2b01377 4371393b 42930730 4431a678 c292402c 423eb4c1 448a25a2 43107100 c31a74c3 4345ed12 c49b96b7 c28d3ea0 43060b9c 436c4266 00000080 -> 3f529a9b bda48992 3f101469 4309dcd1", + "c414e167 c47b68aa 4346c812 c49d2c7c c35e2078 c2eb1c5f 41e90e4b 4459ea60 c4386369 c289e95e 431fd450 4383bd24 c44313f0 4295a41c 42aa8bb6 c3c2a834 449abfb0 c2434644 438c631a 43d9c344 c35166b8 c325b4b2 4234e6df c4b2d4db c3b13ed8 4336b094 43337c76 c4a43de4 449a27fa c3368cd7 42e4fe0a 43e9b214 438be4f4 432f5c84 432174d0 c4320b50 c41053ed c30ad80a 432fa533 c49fd3d3 442d8344 42bb2918 4315fcfe 44b79750 43a9e630 c2af8c12 42c6c91a c35b9320 c3a74fac 42abe4fc 432d8034 c3008530 4481f00c c281b68c 432341cf c4884b1e c2755600 42271c78 4354b841 c2b899a0 43b683b4 c3466b7b 438485f6 c4591b56 44af3ac6 431057a4 4395362e 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf5486a4 bed168be bec1f737 4377c012", + "44425db0 c4b241cf 43225ee0 44661270 4486f76e 432587aa 4353e986 439a86a0 c48a0a78 c2103d70 421d793a 43deb5cc c48063d7 428ad9a8 4285ce02 c2720e20 4497307c 42f76ff0 42a8226e c3871a90 c3ab6e80 42e27124 4355e782 c30a6e18 c4954417 c19939a0 435cf22b 4484ee0e c42adac9 c33f14c3 436432f0 c4207f68 c4b8f734 c2be6242 42f712b7 43e44db4 4464045c 4270a2b0 43940e37 c363e610 44792af4 41569d60 42dda535 c4650ddc 4392a51c 43004dd0 4310930d c3fe6b28 44097120 42b88e74 41e4ba8c c4a82a4d 44335e78 431c9ff0 436bee9a c45692ed c3d2add4 c29b444e 435664bf c38a4f44 c46b2e69 4308b52c 42d3e0ab c4926700 43ec28e4 42fc36b8 434418ef 44945a38 c42374fc 418cd730 434dfbd7 c4396b4a 447207b0 43048c56 433188fb 44841126 c341d5f8 405a3680 43812230 c4241a14 44b7067a c224c7c4 426e9ea3 42f8fd50 44abd23e 42a0ae40 432895bb c4904d25 c24cab60 c300f55c 42bdbd6c c0b5ce00 44a718d2 41fc25d8 429dd029 44b7eba2 c45ef7a7 c2d18b22 4325c65d 4453df40 c470b76a 41db04b0 41c0204a c48748a6 c4a6ea9b 42f910ec 4298bc0a 4498ebaa c40b9be5 432ac24a 436bc4d5 4483a240 c31687d0 c1f47480 4303b878 44590f3c 43ffd168 42e775cc 4257a0d7 44ab388a c42daed3 4129b840 4301ac0b c4945478 c43a7b58 c300eb8a 42c62a7c c4401130 438ca47c 420b9ab4 4346588a c463030f 44b0c372 c32a8fa5 421e7f4c c3712098 c3e2fa14 c33b352f 43171dd5 c4846db1 c2a802c0 425e7d6c 4372639c 432823f8 c3975d3c c1bac758 41c00445 4283e790 c47fb28a c1a5c5b0 42cd8c1b c381ec2c c49afff9 4200e7b4 431f14cd 43e4c9fc c4811505 43318cfa 4385be51 448d7238 41473300 4341fa14 42ca22a9 4429f398 c426eda8 4201e9e4 43848cc4 c3b9a93c c405e8a5 c347f590 4309cfd7 43cfd8d8 c413f672 c3462e75 43168805 43c20cc4 4428e1fc 430ea56a 43568e25 44684b60 c48af7fe 42e428ac 420a6a32 c484e9b7 c42e7e0b c2d32218 42285ac2 c3a3cb74 43329258 c1a131b8 42ad076f c38ecac4 c48576e2 422f120c 43446299 c21b53e0 c4033a4c c32a1aa9 42b59934 446e6bc4 4339eeb0 4289a54c 42884e90 c47fc61c c4b8b34e 42911354 42286021 c49cb46b c4978267 4319e1fa 438b7732 c416a030 c4441d58 c328bc72 4362daab 442436ac 449609c6 c3049d97 430f2f5a c4abfed9 c2b0ba10 c08eb620 4376d7f6 448b6f82 443131ac c339a140 4319656f 4410f918 c3cf3ddc 43470390 42c483ef 43e1a7f0 4369fdf0 431afcc4 42a3b1b1 c2ffd790 437e0228 432a594e 42483226 4380ffac c48c7829 c33c968c 42bf0024 44031ce2 4285aac0 4339def8 4268e5e9 c4a2c637 44879e06 4329809c 4334377c c480c968 43ad38c0 c2d22e90 42dd7662 c4a013d3 44854216 c2890a0e 430495f3 44b0d3de c46ad80f c20434c8 435ae1b7 c49695bc 43711c20 c2b2787f 435b238a c3df6e8c 4477cef8 c2a7ab5a 4243c45d 44b1d60c c4b01d55 43154dc4 4389cf55 c32df3e8 c4657bc1 c30f3efb 42debd3d 444baf9c 448a9cda c1e4b098 437b2dcd c339c048 c3862118 c30ce48a 41a11933 c3eee9ba 42f0b750 c30226be 433894d2 c4370609 4117d000 c305604c 42fb7dfe 441c086c c40fd05f c2f2e3ad 42158f08 c43ef9b2 c4405e41 42fc3260 429c9a9c 4355b2c0 44591b04 42345c00 423a6698 4435aa90 c405fe46 43222220 4384785e 44201a44 44b3ae74 4271ce18 421e3624 4441c154 43809464 c2ae3db0 43517ab6 c34a31d8 c441888f c23f4a44 43752b27 43e9af38 440d4e7c 4317534a 43129c02 44886cf2 c29b30a0 c2e9b0da 42432ba4 44ba9cd8 c4a9b5f9 c31e5389 43232414 c4a71ac4 c4663dff c2bfaa42 434618ba 445f6454 c4b36a2e c2a5cff9 4179ef28 43ca2dd8 c4195cbf 431b69f0 42b48df1 44840352 c4a3414c 42614138 4235e55f c4b1bb44 41ccaf40 428179f0 412fd36c 44882648 c4b9e14a 41ff2678 4385026d 449a2f6e c48660dc c2be133f 42af7d83 c490f43d 444bac98 431896a0 434b263c 448c9cc4 c48d5aa0 c334fe18 432df215 c4030630 43c86280 431c0066 430133b1 44a87534 c3d06874 c3018b43 42e4f548 4460e7d8 43983e34 423e73a4 4371c0c7 447a035c c49b6a04 c31ce9a4 4317d72d c3ab9c84 c495b5bf 42840164 41c4285c 43a9e9fc c3b79ba8 42bdf564 43484c28 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000062 -> 3f5743f5 be63a7dd 3efca58f 4262562f", + "44ba8b44 44a9852a 43331524 c4501f91 c39338f0 42b72ed0 416f8118 c49f3461 445ec46c c22c10a0 433d5f47 c43ae594 c4a72dc6 3f4d3a00 437a2c12 c4526758 c49c64d2 c2984489 43218fb4 c2dc7430 c343cad8 c33cd7b4 434a8405 c3a17398 c424ab8b 42db5ab4 430ed593 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f3a4a06 bf2e082e bdbacd3c 445ba53e", + "44a755c0 43681da8 c2f048fd 43e3d46c 449f3704 c18f9198 42c97e4c 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "4458ccdc c408addc 3ecd1000 44416c1c c41e9873 42ac3504 43833bf3 c488f458 c4aa07f9 c306cc88 4294b1f2 c39f4754 c41a0430 c1e71848 4242f1cc c41913c9 4386de30 43173696 4287a2ee c4b35eae 44a5c5fc 424c4110 42b12398 c4b41e59 c48d398a 430bba04 4319eea2 c3acebe0 4394606c c314273e 41bcbca4 42371fa0 c42a12da 400ecb00 4227a00e 43c6db7c 4407eed2 428d78b8 436069a8 44a8387c 4282b5e0 c30dbd42 435d01b5 c419b70f 444eac04 41ba5dd0 4347634a c2bdd8f0 c495e9a8 c2666ab0 42d61a7d 43674e28 c490eb8c 4329d188 43423d62 4357f450 43b2afc8 42d1dd2c 434200f8 c33654f0 c452cb4e c0b4f920 43256703 449c5cd2 c48ff334 42a54d60 4233df2c 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf1d1e92 bf402e6b 3e7a4e61 43a6535e", + "c3e252ac 43ad78bc 432e907e c4877ed5 c43ae951 bd2b9000 4370f586 449604c4 44b274be c2ccb3f4 432de590 c463cf0a c4b103ef c2ac6935 42a0e5fb 445d3778 c2b564f0 c21d41fc 42de3d56 448ad9c2 42e438d0 c3429f02 438a3e16 c4ab9f02 c415e6c2 42b7b7c0 41a357c4 43a4ac14 4468fb54 c3006f48 41efedbe c33b04c8 44887f7c c30bc2ce 4337c6f2 44350098 c36b3be0 c1c50bf0 438219b6 c3620c18 447e2c98 42898c50 43448a41 425a80e0 c4a17fdf c2cda036 4282c505 c45ff7f8 c41b4b1e c317320b 43457231 c4125089 444beae8 432784fa 436c1eb8 c21559e0 4412cdec 43144aa0 437d2dc1 427da6c0 c2d82b80 c2fab25a 420fb664 445eba28 c4739c30 c314ffee 42d4b605 448d82b2 440af0ec 3f230000 42ec8d83 c4afbee9 42e9b6d0 43299d80 4198c6e4 448949c8 c3c2b10c c21edf20 43921618 c4a61048 42e7fdb0 4305d1c4 42cbc44e 440d7928 42c34900 42d3377c 434b12c8 44a6f2d0 c3c1b094 c31b543b 41b9c915 43189470 4395d038 c27d66d0 43904c6a 43e467a0 43779560 430a8242 42daf3ec 44a5b012 449a03e8 c2951a7c 431facc7 445a8344 443a7bbc 423808a0 436820fc 448271ce 44914936 432572ec 42301fcc c419b979 4495251a 42e11b60 43937560 43c22284 448aabd4 c21ec20c 42ad5d60 c3854064 c2e59e10 c234b26c 431ce1aa 435cbb70 c3040428 430100b4 43072044 c46300f5 44adc272 c24170d4 42b87914 428f99e0 c4a5de6b c33b87ae 4251e3b2 c44e3776 c4082dce 41232140 438d4c4d 449c928a 44bac5b2 42fe55a4 41d604cb c3003f10 44b95f94 42c87358 43476921 446ede74 c3d345cc c286fec4 436ceb51 c46eafb2 43758ce0 432cbe1a 43153ae4 428ddb90 4466597c 43310466 42d6819d 449fcd34 c46d5606 41dba050 43854064 41c7ea00 43c31284 421576c0 429da9da 4489744c 43ca640c 42cdf13c 42c8608e c3e98c7c c2eb4320 c274f7a0 4301cd03 43d7b7ec c40006d6 c3344e29 4331fb67 441a12d4 c477f996 4234c370 437d123f 43c62778 4390ede8 c31f4560 438d9a24 c48c50a3 431936d8 42448064 430331c4 c3ba2c1c c4686669 c34275db 435eda46 c353b8b0 44a288ca 419e32b8 4379e38e c394a100 421e8c80 42e546bc 427cef65 439895dc c4b3e6f4 c1c5d3a0 435b1437 c446c8b6 42610060 4306843c 4284b862 44416c08 c3cd0ee4 424fe100 436576aa 4353b978 442cd7a0 c2c6166e 438932af 42a95ab0 43e2ff44 c31b63ee 42caf97d c4b6f515 c3f0b9c6 432e0b42 425ad597 c31f2da8 43a961a0 434178d8 43580329 4451e544 c4507987 c300aa90 42837cae c3afd7cc c353c348 c2d2d663 433b6f24 c48015b9 c3b2b58c 42a5b3fc 433a0d5c 442115c8 c3569868 42800338 415a6b8c 4334a080 c43630f9 c306a3de 4354b384 4407c69e 43ce9714 c2a0d172 43636104 c39377b8 c2ad44a0 c3036b6a 42ac148e c49b9182 c421fdc4 c2b4c86c 433e63c8 42d26ba0 c48c4939 c208d328 4325666b c46c47a2 c33ae258 c24999d4 424bbf98 c18fec80 43d2d2a8 42ca9da8 4252f18e 44a69374 41557c00 42211bf8 433341d8 4406a01a 449e71de 4216556c 42821ec0 c3176fc0 c421779e c33c4242 424ce01b 449ea56a c355beb0 42e86cb4 4389306c c435876d 44b1d798 412ad280 4383cacc c4936f71 c49b96e0 c32b3289 4334c62b c4b64190 c48cf146 43030d58 42361ab3 448fa790 c4b32937 c2ec06d6 41aded59 44902be0 c482a53c 42f44dd4 43871993 448ae928 4383b550 420454bc 4264a70d 440e8a34 c49bf0ba c302feb6 42a5356a c4974b1c c42abcb5 42347d4c 43654cec 43dcc304 c2e1e640 431947ca 4320baca c490cdaa 448e10be c337ca24 43819212 c34aad40 c4b7118f 41deeae8 432b0cf9 c497eaa4 c2ab4550 c29a92bf 4305e98c c49d989b 44b7533e c2c1dbc1 4369b806 43b90ebc 44937bda c3378301 434c585e c3a2b10c c3cbe92c c2fc7fdc 41849e24 449ab7ea 44713c2c c0447940 436112da 42082b60 c4a0b783 c11de4a0 430402e7 c4875c85 440ae82c 432aa6ba 413a0ee0 c491d7ba 44a75a26 c1614850 43817faa c4b4b233 c4b13d78 c32ce72f 4292c977 44500820 4437ebec c303c0ea 4224e9ca c4b5ff58 448002b8 c312dd83 4364a061 c36c9c98 c457374f c314b66f 43637104 4411d958 c4b4cecb 43329c2c 433b215f 4269e700 44760578 c336666f 418671c2 44ba0c10 4490c542 c2a966e7 42f8d479 c4a42910 c439f448 42804954 434e5bdb c3568750 c46e0b11 42733820 42e73956 c418c31e 44aeaaa2 c2cbc1a8 426a2158 43e28bcc c3ad09b4 42b5915c 434c4bc0 44a47828 44261568 4347d6f8 438b44c9 432af8f0 c47260a5 c2971459 421428a0 44bb67be 4484c082 c280b444 42824450 44b54290 c4aae59b c2de059e 43863dd5 c3010e68 444f0fac c335d272 43672859 c46f3f50 c304c9a0 c28baf50 429e5783 43371988 44460784 c194dc48 435d51ca 444c67f8 445160ec 4337e7ca 42446d2f c4959966 c3bcfab0 c3260c0a 42b3509f 4490ebba c3ce9d7c 43070478 43856261 44a55766 43495a78 428de1b4 433099c8 4480cef8 c2e49e90 c23eb070 42a62f38 44367a88 c3db0654 42a84c48 4383de1c c3f13488 44ae2158 c08d06e0 43160699 c39bec7c 4443cf24 c258114c 436ff4bb 442782fc 43776360 c28f70e6 4293ef18 4493d734 c45dcc48 c32461a3 433ab5dc 44ac45ae 44a7ec00 c3460dc7 4215e172 44a473a6 c47ef91a 4300ae4a 433c06e1 4450ca00 443c2e7c c227f33c 421aff8f c3af2b8c c45febb7 43422738 430361be c4a1b34b c49bb1ce 42ec85ec 424698ce 44906308 43990d70 431773b8 42396fd3 44ba7cae c4aac72c c3072d0c 42e3e64e c43e2f89 c301abd8 429031e0 43435faf c3beb980 444b9ad4 c2a5e15b 4370b2e7 00000080 -> 3f2a6b78 bf3ebfda 3d2615b4 42dd64b7", + "c3c913cc c434af87 c2637a9c 448ca944 441958b8 42683a28 42e84ec2 c42fa24e c3876704 410c3930 43372733 4496cd82 c482956e 42f78ab0 43007f9d 44a99f34 44283c64 c2643a60 41f07472 448e4eee c496f71d 431d9414 4395b4dd c2dc7930 c3c6cccc c28eb672 41f3f18c 443fdbc8 4429b6f0 4232cb84 4388c643 c46898ff c4a175c5 c195ea70 425425e0 43aebd6c 44b94752 c34406a5 438725e8 c447e249 44427f28 42b92e94 43421c06 43d239ac 444406a4 c279279c 42c4e652 448b0e5e c44a0bf5 c1fe51c0 41bd685e 44a33c0c 4429c384 c1425f80 432048ca c4ab935a c46f1c87 428f833c 431d3670 c3afb87c 435f6e10 423060d0 43267717 445f7d18 43a9ae4c c21476d0 437b7bb6 4414f814 43f1891c 42e9b2a0 438ff232 4420c8dc c2f14ae0 430644f8 423362b6 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000012 -> 3f782ab2 be5480c5 be06472d 427595b6", + "c4b54579 c4611cfd 41215300 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c419dccd 44562394 41650b40 44b18fbc c2dae410 421fb278 438c9095 c493c5ec c3421310 c294406c 431bab25 4230a3e0 43ee8464 c30c5ced 42835398 447ca814 c4b15d28 c26958e4 431e5b83 439f8fa0 c459a7d5 c1c4db68 43100f66 c3fad4dc c292f470 431c4570 42deb12f c48265c1 445488d0 430157f8 4392bcf5 c23ab3c0 c3c8a29c c2489884 420aa256 c447ab5b c447f3e0 425f65b8 438dd5d6 c4485519 4445c5a4 41b045f8 42e2f3b2 43d75858 c457f1c1 4332069e 4274ed92 44b0a67a c4747ed2 c1f8ed30 42d3dc98 c3e4683c 420b54a0 c20f9f78 43948ee6 c49afa6c 4480ce84 c2d68d71 431a6ac1 435a8530 c43b3e6d 42e21ff8 42cf1592 43a7ec98 c3f43a6a c340dac0 42543baa c421b651 c4a379f1 4337446a 43390245 c3a8e3fc c3864cf4 c2b10cd4 437e606a 43e80f8c c49cdfd3 42fef86c 42340481 42b6a860 44208318 c2428ea8 4392d948 c3d03f2c c1b27c80 424fa420 43920f79 44ab00ba c3ad24ac 43475266 42f65e36 c4bae7a3 c486632b c24ea32c 43937834 44b463d4 c4489af0 42c3e434 42c5b3a0 c465579a 445e70d8 431ce94c 43888400 c4551f18 446f0c78 43315b1c 438ce72d c4484eaf 434aac40 c283b872 4137760d c4b235ef c491d5f7 433b04ca 4381878c 448b7a38 44644aa8 43388e5c 42327cf9 441b8ddc c4aa9cd1 c2f6064e 4387790b c4a2d730 434ba2a0 422306dc 42a28c52 c4aca4fe c418e55c 4310a7be 43046eb3 c3f4cb2c 4213f880 432a9908 435ed168 44714da8 c2ab9da0 42d1f180 43274e8b 43138520 44106294 42bfecf8 42f54d0c c4a90ab6 44b8f7d8 c2572bc4 43861eb7 c4746f4f 421054e0 c31bc1a9 4274ea4b c42ba5de 43bc3784 421e5cd8 42550bac 439c2d88 44b8acb4 43087f94 4345e885 c4545ec0 4414367c 431f0f20 438cd573 441a708c 449af030 42869a04 431e9b97 c46c8adb c447bb38 c3392a5e 42fc5089 c4abc3df c3732418 41e0ae80 41651976 c41227ca 446403b4 430c3c80 41f83935 c45f3ad2 441e8e90 c32b5362 43230010 c46bda3f 440abd84 c30b9508 435848dd 449b0202 444ffce4 c3141af9 437a7d28 43c33a30 c49092ec c28b85a6 438079c4 445d2638 4463577c 42920638 4245d258 c40340b5 44846770 42a4b2b0 438d5b7a c2965a20 441d8cc0 c3121f9a 4380910a c4a6c692 437c40e8 43099ed6 4372075e c4864c03 44498d44 c1ae1508 431c932d 43bce5a8 c3c2e8bc 42c900fc 4180902f 444497d0 44ab58e0 421e89cc 43001d6e c4948452 c45b23ab 42d8500c 438b7c6e c4987ddd 4423fe18 c2dffa98 431b94c2 c48df112 4420e73c 42c602d0 42de9583 c4b96c7a c48a4420 c332f114 4313e26b 4316e318 c416da96 4279b2c0 42d2f9f6 44a2798a c3ff8b46 4295eaf0 4381e7c0 43fd4e30 44702000 c2db800a 43053188 c4a80cb7 43f265a4 c249b6a0 42e97b1e c43881b7 c41710bd 4306937e 42aeef08 44a4e0da c45b995a 42cf0fe0 42d73b91 c3cbe9ac c3ecedcc 428ee368 4305ed84 c4b38ab1 c497619e bd2dc000 43197227 c408f058 c4282817 c13becd0 4310589c c4155a0d c42ca32f c1263a50 436a8d58 42750160 44995d9c c2c11aa9 42b27315 c1a73b40 445d6a7c c19f9068 430f5e4c c3ef1650 c3b4d5d0 c321e220 43570481 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000048 -> 3f6b59ea 3e941a68 be888f61 425cca6f", + "c452f5da c49afa0d 4262d898 c40768f6 44ae744e 4211f328 4346cc3d c433f47c 447f2538 41e82c08 42cdc21a 442d3ce0 c4933a89 42dcdc70 4282c1ee 449a0000 c4a24c32 4341ab74 43791ec8 c4a43439 44390854 c33bb848 438e8b59 c22c5620 4480d74e 41dc4728 438653be 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f380064 bf2fdff4 3ddab878 439d2cc8", + "c39faff8 c41fed63 c23cb0a8 c461281d 42bf60a0 42c000a4 423bf2f9 449eb5f0 44b48774 c29c50da 438501d8 c48d4416 c433bb71 c32c7ccc 4350f58b 44a9d7f2 44448944 429643cc 434d7a34 c42d4d84 c3522c98 c29635e0 4228e56d 448f66da c448745c c33879ff 431c79b7 c39e3b0c c4a71a0b c11a62b0 42f9e5b6 44157b08 c34b13f0 c302aadf 428714ac 43569640 42a40430 4147a210 4330e4ad c4adf8f8 c4a3b7c8 4342f9aa 420b85c8 4406ad46 44a5a774 432f8864 43170ad7 44ad383c c4321d07 41516ca0 42069282 448ee090 c4539c8b 4333ea7e 434877d9 c3ffaff2 4492371c 4324367c 43913968 c1a5e5c0 c446d03f 42ba6c6c 4382fb16 4184cf00 44991622 c2fd3306 4352629c c49add87 448ae328 c31a2f68 43056b10 c449dbbb c4915fa6 425cc750 428b3238 c32c7d20 c44d2b36 c1db0ba0 438d6551 c41a9416 431d5e00 418a23b8 42411df3 42820980 c39e79d4 40c4b880 43159f4d c251ca80 42468920 43138c9e 434fab97 43af34b8 43406308 c3270995 437255f6 c3fe6a6e c48f05ea 42006b24 4369b02d 4441aebc c43d1d16 c2211398 42123389 c4840212 c4935252 430c44d8 4368e9f9 436f9820 443735a0 c2e492d9 421f98a3 c2f9d880 44b033ae 428a88e0 438d6442 440fcf60 43978c4c c2748b28 4228f94b c3a0b518 44178898 c2e93a2c 432f7085 c4baf0ad c34940f8 42f70558 434b59c9 c4b046aa 447c9f1c 43160c68 42cfdc7b 43db4524 43f05088 c2fe10ff 41bad42c c48213a9 c3112718 43419b8c 430236bc 43030810 44390664 4320a2f4 436016cd c4144dc3 4447546c c2dd63d3 43459c40 44929c38 c48655a6 c31c3c4d 435d837f 444b9568 c2b98950 c2426fe4 41d2617a c4acbb47 4476a270 c323f9de 43595e48 c41739a8 c46d0a71 42befd9c 43617aff 448a6f2e 449264e4 c189daf8 4371769c 4457974c 43beaea4 42e600b0 429f46a6 43af8508 44a23c7a 41d805e8 4345630d 44615710 c2b2a210 c2b96ca5 429cb7b2 c459c2a8 c47d9dfc 42dc9ce4 4385c85a 442a902c c484d6af 41a7da38 4275706c c423b348 c48c2b08 c3455592 42d01578 c3cfaa88 c42d4877 c31988cf 42e4a4ef c4b883ae c4800ab1 4313a1ca 430171c6 c40f5c41 c360a908 430fca82 42ad06d4 c3da97e0 448a7ae4 c31b0ff0 437d419d 449696ba 442e3c80 c2c36765 432f0e0b 4335e128 4484e0a2 400a80c0 42465dbb c389bb0c 448377e4 c341c0ac 435bc8cd c3f31abc c425230c 40d22160 4349c22d 43b4af88 c2dcacc0 43176e16 42dddf88 446d5974 c45b2b11 425d1ec4 43442685 4397b8c4 4485a0d8 432abf30 436d8438 c41439af 420f1fa0 4158dd00 43816e10 c4aef7be 44203ab0 c2b392eb 432954c8 448aed6e c33b7898 42d2ecc0 431d17b6 4445a8c4 44b3dd94 43349eea 425e8f69 c485e610 c484de2f c32a6bd4 41935cb2 449942e6 c46251a8 42656948 438633c9 44b803ae 44463724 c33f0f78 4353334c c49834f6 43aac53c 433b33e8 43563e12 44a04d66 4425a72c 4305a99c 4386f4e5 c4097a1e c48071d3 4297fae4 433f0b64 c4b9e4a7 44af1fde 42e89c40 427c3813 4415ac74 c3c0f614 420737e4 437cadd9 c436d50b c2662720 bed4b600 430e1584 4453cbdc 44952fd8 4316564a 4220c8eb 448a3452 43d6407c 4312f914 42b018bf 440f77b4 437536f8 c18f07e8 42a8d7df c2b6fbc0 c4a53c53 41ff2d80 41b3018e c484f16d c4a6c343 430845da 4393e41f c304de50 c3170878 c33e198c 438d8bd7 c38ac84c c2ed6480 c2f6cfc8 433d9c3d c4702b10 c46bdb4e c1c7c620 433bdafa c4906afb 42168940 4328c176 4194c483 448162ae 442c8608 c33ceabe 434d6b91 c41d76ae c36d78a8 432d3354 430489dc 420c5960 42ccd200 42aac178 4343a7f2 445ab64c 42fb04c0 4299124c 42888940 43d23528 42221100 4347e692 42d4fd29 448be7ca 44a2cdde 429d5130 43005a1e c311f3d8 c43cef62 c32441e6 431cac0a c4856fea 448040d0 c30f4dc2 438fc248 c487f1b1 43164e30 c2f1e1e0 43027b48 c4b12731 c479e2a9 429c5368 41a0e496 4247da40 43994e4c c1dffdf0 4383a272 44393e0c 4319e068 43031788 4343009d c18b8e80 c44583eb 433d432c 43386676 42198420 4385b97c c3096040 438913ff c4aefb0b 43b36554 c2ddfd3a 41b15a12 c3fcc532 c35a4b00 c2b14bf8 434c3595 c3a167ec 44405d70 3f8acc00 42a0140b c3e9b74c c42815f3 c302aabe 43134333 446e92dc 44ae54de 42fcde3c 42b11bdb 4146d000 44727a84 4280e580 4387821d c36eee00 c311bf98 c3435e28 43889731 448a51d6 42f229d0 c1b2ac00 43290437 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000066 -> 3f62f6be bee7b111 bdc479c9 41b185f9", + "c3a64464 43bd4b7c 41ef7840 43e62b00 44188930 c3243b87 42cfd182 44433c88 c264a6e0 43443388 41c0b56e 438152bc c41ab005 c2e15c45 41e2e33e befa5000 44547620 41994f08 436a3050 4490a18e c38be33c c2e7ef94 438ffaa7 c4052857 43b66868 43180718 43028a3e c3c1b6a0 4461a048 430cd06e 42c92582 44aa644e 44827d5e c331079a 43869a7c 444700e4 42ae13f0 c306238a 42ababf2 4429fff4 44a7a508 42c30fb4 42da917c 43ffed10 4483cda8 4305a812 425ee4e0 445bf5f4 448113f0 c2519344 43658d85 44949896 444e7378 40493040 43849a6b c4760234 c3177230 4242f580 4199de76 44727be4 44025298 43352fd4 43901fea 43c15d84 4405a2e0 c322519a 43601728 c445c1c4 c403a35c c2a19e97 4391c4fd 43b1f188 c4203206 c33570d5 438d19f6 43f45f50 4489e53a c2a9b66c 431295a1 44579910 4426cd2c 4243cc70 4322ba80 c34c8ab8 c497e425 c2064b90 4277c48c c3efd460 c471f27d 42b17674 42cb2cf6 4498afb6 c489b1f8 c1c5ca00 41cabc1e 44b94832 4455427c 42aac258 4394e737 4440f450 c49789c0 4328898a 4311f39a 430ab238 c398b680 c3109ec1 433adb42 442ba708 434faf90 c2e25072 42c479a2 c47dc186 c482eca2 c2cc7fc1 421d0e36 c4a83a9f c35d0c90 413107d0 4324d8b3 c43269b4 449ba8ee c222fe3c 41d8b208 4399fb2c 44b4cef0 c32e892d 4316e2fe 448294a8 44b90f8a 4331d16a 43846476 c481a5e0 c4196eab 42aaf780 43528dd2 4461cb50 c481e8be 43402ad0 419e0452 44ab30b0 4465a960 c19f3b38 43698e80 44ac9c78 c3775130 c30a55e1 4365535c 4491a9ea c3f41416 c3476503 432ea720 c4367c6e c47060db 42b84174 437e3b68 441453ac 4487e894 43127530 432d950a c3f83414 43e4f344 42d14ecc 435f423a 43bb067c c3f23128 c30c007a 43829aa6 c33c8530 431e6eb0 c2a01e81 43872ed9 c3224da0 c18f34c0 41f7d3f0 430e3610 c2d2e210 43beddd0 c3208ce8 427eb541 4475fee4 c41079e4 421bcea4 431e2bc1 44b87e3a c3b8d5c4 42430364 439257b5 43434ff0 448b52c8 434584be 438d1a2d c41f6d37 c37af9a8 429f470c 42c43f28 c4aac83f 44212628 c30d84f8 433e4f4e c42e5366 c41f0e2c c290b115 42d6a9ba c4ad76b9 c4949cd1 c3174091 43672b4c 439912ec c4292f90 c24446fc 41f39e1e 4445d95c 4407c9da 42bcdda4 418f065c c4a6c79e c43af97b 42c2b6ec 42a3c938 44227dd4 c4739601 c29f185a 432e0870 43310b18 c3d02d80 42309cb0 419492b0 445d33bc c429d210 c20de368 43637f11 c2637c60 c28acdb0 432702d0 43269ea7 44b71610 c432af4d c12992c0 4385cd05 c437d1d2 4486b630 c24ba2e8 42bc98ec c18b2540 449eba10 c30210a5 4339d9a4 440731cc 4400f2c2 c2c91ab2 437039aa 44b0cd54 44955c48 43220a7e 42131f58 44b68c56 443e20d8 42dd4a04 434e1a36 c1a062c0 c498e209 433b1620 42d28439 44882984 43bf024c 420f2bd4 42ba6bc2 4445a494 c463fd48 c3386cf3 43701d78 444fe5b8 44852ab2 4345332c 43815396 4462de5c c4b7952f c32b6db4 43425d90 c46b378a c4b9ffbd c2711f90 4236af97 c4b22485 43b028d0 42decfec 4332ff3c 43574a70 4473e2a8 41aa7938 429c2408 c2324b20 445ef780 c2280e88 42649c39 4492d172 c4aae7f2 c1e7b998 4382b1f4 c3f950dc 449176dc 43092474 43166e5d 43c77e14 c306a460 c3415396 422efa7c 4497fc4e c4a99ee2 c2a81d99 43929214 44088e8a c486aca2 c08213c0 4317e6b6 443642bc 44814440 c29d2e54 42a27b85 4482cf1c c4b8f990 42ac22a0 438d0f4e 43d61ca0 44642870 c2995043 4393162a c2ef1e60 4477cdb4 433a5d18 4365e3ce 43789478 c45d9363 c29e6fea 42c11d37 c47e23d6 4488e510 c07fbe00 432f4073 43972248 43f33b54 428df678 4321fc17 42d3f340 4366c578 41a87aa0 42dbadc7 c4106956 44981e66 c200abb0 41bc95e8 44348b8c c46e8e1c c340c8d0 42d1b13b c47572bd 4497b138 43089a02 437a58f3 c48476ec c4adb578 4279f130 41fdbebb c49cd62a 42bdb000 c22a6adc 43147a58 447e2fa8 c46779e6 c289773a 43844dee c3d9f2e0 442f4480 4267d880 428044b2 c4000a31 c467afea c21b2bbc 41e8b248 c43a544d 44ae0816 4289f700 432acdda c385c3a4 449d2a14 c340fe8f 42fc8a9b c46b1add 44b21632 c315b48c 42a8d904 c4b2ab52 43f1d6b0 c1f62b18 432d8dd8 c4b945b2 4399d858 c1b896a0 4131376c c46d6c8a c49f5297 400930c0 422ea8f9 43687250 42f9b750 4299aec0 4140a662 42de2340 447886ec 43471c34 439356ec 408f7800 444ec3d0 41f71d70 427be7c0 c3cb84fc c4955b2d 428340c4 4264b0bc 422934e0 44b8b556 c2a7369f 4382484f c4a2e3b0 c4a0acc1 430dc3dc 43531b98 c40e0965 c49d274d c2ff6abb 435cbf76 443a9360 c39709d0 4318f3fc 4274a60e c2f7a600 43291c00 433ece50 438308de c44cbfaa c4b7922a 43119070 42e1fdc4 44b2ebc0 c48577d9 42cc1c94 42a3c294 c49bffc8 c442b413 c2f045c9 43881cca 44a46fba c42542cf c084fe40 4282b5ba 44551e08 43d40354 c333d11a 431cb99b 440c67b0 44bafc4e 429d2298 430e44ca 43e1f5f8 c42bb4c3 c2d5b14a 421e895a 44937d2c c394cbf8 42b32950 43744e40 c48cbc98 445d2578 432e43d2 431c0cfa c48b4213 44a36f48 431ac200 438a9fb0 c409b44d 439fd364 422f2818 41f2ea6d 448ef96a c4279f06 42e6936c 43120b24 4499a300 440fa0b4 c22c6050 43770a89 418de200 c2ad9a00 c2fe66db 429874eb c40b74c0 c38a485c 42a39d0c 4356c22e 449a3342 43e56dec c268b4e8 435020c7 42455360 c3a26fe0 42df9e08 424e9df3 c3ea03f8 44b63ebe c32f1b3c 43800207 443ed5e8 c48b2831 c2f85b53 42058fa9 00000080 -> bf2894ff 3f23f8f8 3eca4737 41a55992", + "4303cda0 c4a3e62a c244ce00 4445d398 c466a226 c2ee8f50 41479cf5 44987692 c414788c 4275d130 433bbb06 441b776c c468d39f 42b0aab4 429a28c6 c46f6084 c4b79f19 4282c0cc 42a627cc 449fda30 432155e8 c085aec0 431a200d 43d8e070 c48c93ea 43297c02 43407cf8 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f77d934 3e7560f3 3d945f24 43bc0e92", + "c4352e61 443f8cbc c2b5dba2 447e69ec 440ce584 430530e0 42d39f05 c44f94c6 c484368b c17d07a0 4259330d 4402ff40 43a4d024 c32421ce 423a0713 42b8a0c0 43cd0d2c 42ed234c 42da0329 43af8834 435cd9b8 c318923b 4322929c 44767f7c c2deb480 c32b0864 420aec38 448d6e98 447db0d4 425dd41c 42afe420 43599790 c2d461f0 430973fc 438b218d c3bfd09c 420a44e0 43133a66 431b7e63 44917230 44965910 43370ace 43821f40 c45ec45c c4964988 c2c6b648 438dddaf c3962bb8 c3c15a8c c31a7989 4317a4ab c48bc44b c41f1928 432ac3e4 4317e70a 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000000d -> bf48bfb3 bf1e65c8 3d416936 42ea4776", + "c4881c49 44524d94 c2b27ba5 4439c638 c30c4fe8 c2380bf4 431d8c7f c4673c3b 4370aea8 c2e7f3bc 436835dc c47b8766 443e5264 c3404ce9 4368e724 c419f5c6 c30b5de0 42acdffc 433ca4ae c4374113 c404a5ff 42b78b44 428e89be c48b4e92 440b0b48 401afe80 435c1683 c4832b16 c486710a c2ac454a 4325ee1a c3da8790 43f9ecc8 423ac210 429e87af c1c66000 4490d8d0 c30fefeb 430bd522 4359e770 c3dad134 c3437bce 4320830c c4abeb31 c471c134 c2d3cb28 433d06f5 c49809d6 4424d880 4305070a 437bf441 c458e2af 448bfd88 c346e4f6 43075b4c 4301be28 c47b33d4 c0a74ee0 41e08d65 44a7b0ca 43f0cb60 c2624944 41c47511 c4195360 44014708 c20ce9d8 431a6c60 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f065a7e 3e824611 bf4ff2ab 42a3ce95", + "c4592eb4 c477b54a 43345780 c42db41e c4ab3bd8 43209d9e 42c8deaa 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c49adece c3ade534 423ac5b4 43c2d0c0 c350bab0 c298dd15 430c9908 c401d8da c263eda0 42831500 427df91e 4412b2b0 c401ff2b c22112ac 42024e58 3fc91400 449a8a16 43463866 43905bce c44f6b5d c3c43ad4 42d495c4 435fcd2e c26c71a0 c40b6141 c1b6b9f0 4304fdb8 427b3ee0 44a5e8b8 4303f8f2 421d6bba c48e57b4 c3fac388 434622ea 4325762d 43a84270 c4a59448 c33bbd2b 438b94d6 4434f51c 448175f2 c2773374 438bfbde 447a9e84 44a9b798 c32613c9 438ec85d c4b81354 c44658d4 42d64c1c 42404667 44983ee4 c3dfdfc8 4342cb06 43722843 c46c2857 441faa68 c21285e8 42cb1da3 44b6d274 44904e12 432bc290 42f2fa9c 43e29cc0 433be218 c32e6253 42e6688f c3fd0144 44883878 c15baac0 430a3325 448f0b6e c4a2394c c2e0256d 42ef5cf3 c4b29ea6 447b1b2c 43213c2a 432309ba c44afc29 c1afdac0 c2080a24 42b98829 c47415ea 4414fea0 c2f3cf98 4369343d c3e73cdc c464e6a8 c26e7a54 4387657a 43e10c64 442133b0 43303fb0 43812feb 449bef8c 44ace516 c2b01f16 42b17cf3 4491b3c6 44268674 423e3b7c 425137ae 444a6530 c402a5bf c2c82508 437d3093 c48a6668 43a327d8 42dd7d40 42df2ec8 44685998 448ec3c4 c3257461 431981df c2b4f8c0 43d80010 c2e815bb 438f19a9 c3c6e9b8 c41a38d7 c3413a34 4246605b 4213a480 43472cb0 42e9a0f4 426928c2 c48bf502 c3ccf818 c170beb0 41e14be9 4324e130 43c555a8 425eaf48 431d1f6a 448c2aa4 c42d2d2c 40c6e7c0 43801191 c3197aa0 c3d705fc 425dfa38 435fc029 c3763048 c4bb42eb c32434ae 43691acc 43c0dbc8 c322b148 c2356648 42b1a915 443c5e8c c4016ce6 4321a7ea 43364f16 4419d398 c253a220 4255b7c4 428a030c 42ca9af0 c49c42f3 42a9717c 43689918 c4849ade 4420ace0 42ec48bc 4276c333 c441daa1 436d21a8 4241b870 42886de0 c48b53c6 c3d04868 3fb70b80 4151d5ce 43e973b8 c4251ac7 42aee01c 431e622d c28a9060 c4b2fbe4 4172d7c0 434f7e55 44b2c5f4 c4681568 c296d332 4297f73a 442a9000 c4aa9f1e 42f1c62c 42f7051a 43cb4964 c40cf26d c29403c3 42e8030a 43d94538 448b2f08 42111848 435612f1 c45d0a06 449a373c 4131e900 41c2e7fe 44738538 c46b9605 c30ea726 42f63552 4472e4b0 4493865a 432f69e2 430551ee 4445d3c4 c48dc8fc 42b5400c 431e34f3 43081348 c4aff3f5 42e8ae38 438f9879 c391da44 434b7bf0 c19d5a98 4285fb1c 444f9e9c c44ac0f7 41d0b090 4376c0cc c4aa3057 c487bc68 c2569210 436d7fa8 440de1d8 c4b5ea7b c29ae420 432e0ae5 c1744600 c20b0300 430e86fc 436f5836 c4a9ce00 449e0ba2 c21a2104 437bdd6f c4939262 c3b88924 424c3afc 431ef301 4380430c 4463f154 4300125c 433c136f c49d62a3 43ca476c c29f3fcc 4342dc84 c2ed8270 c3fd1498 c2b5d68b 43368f31 43b50134 c401c448 c279d694 4350e34c 42a50950 c481baa4 42bcda2c 43632cc4 446ca3e4 c47e5371 c3418a8b 41d41b6a c4742500 c4bb7f4b 43237528 4315947d c47be18a 43af36f0 c323fb8a 42fbe9b7 439906c8 c4a826a3 c2d74b5a 42a07fbb c4089b3d 443ce100 42a3567c 41ce07e0 442076dc 43fd6648 c31de682 4265cff4 c455370e c433091a c303ee3a 435adc60 4368cf60 44236308 c29aca85 438f19ce 43d35dcc 448e0974 429e7a68 430522fc 4457d518 44456d6c c1c15758 42052572 4429a804 446fb894 c12aea60 437ea543 c44212aa 448bd1d8 434534b2 432f07ec c49776d2 c495654a c25342b0 436af18e c3165970 44084e66 c33a0787 42520a8f c4a6a19e 44843184 43087de4 4389698a 44776014 c469ac99 43217b9c 430b6e05 c40e46aa c487e414 42cf26b4 435bbe44 c3dbc014 4465b468 c191b7e8 432ad71a c40cce87 43b9cf88 c2898206 4386ad51 c4644564 c432c46d 4328f544 42dadbf7 c42dcbe6 4397a6ec 42469528 431409a1 c3e12b6c 42b90fd0 3f81d580 4390145e 4480f084 431a8808 c251aa40 438c9ce2 449e40b0 429e5b70 c2c7a0d2 4325f459 449bf868 c4b16173 415529c0 42203097 c490c84d c42cadac c2e38ac3 42bc18e0 43dcb90c 446b0168 c16a2d70 43798af7 c3db8f6c c486c632 43346126 43704305 44a14b92 c09c9b00 4267dde0 4298aa31 4340f5e8 c358daa0 c3216e53 436c0abd 43caa1f0 4460d3c4 4317c3f8 437293b1 c33c0f38 42666d40 42542ee0 436de69b c3bde2f0 4459c178 433f5c82 426ba366 442b40b0 446f1664 c2d8d79c 4395c8aa c3abb4e8 c3f89014 4303898c 43259932 c4a2365a 44046502 4228de54 4355f049 4396d7b4 4360dc10 c345f1a3 4304daeb 448f0db6 c4b359b3 433d61ae 43179462 44a175fc 443e6388 c1497320 42ca3415 c3a47a38 c381a018 430d00f2 423c6af4 c46f7490 440528a2 c197ad80 432d5a50 c47d59d7 4453b8a4 c32dbb78 422926b5 c42cef14 43db9c78 4309480c 42996aab 43944ee4 4333a108 42a99dec 438ffdd6 c4655471 c472ddfb c2eedba1 43820ad0 4228be40 c45a449d 4321c166 42dff8f6 446daa54 c1eb40c0 c2d186e2 43924ce4 c3e09c40 449b8d20 422d0ea8 4391eea1 c25a9ce0 4416ac34 c266b01c 42f622b5 c44f0e57 c4aba74c 41835228 43774c20 41ded0c0 4493ad16 c30a502f 429c5700 c4711a7a 443691a4 431bbbc0 42eaff74 c4abd044 41ef1140 c3180880 42903824 c457e225 44b7ce4a 42363710 4391e75f 444cde00 c495a74c 42c51e60 434ce15a 43049c58 c4994e55 42d0dcac 42e1adb2 c4ad2852 448b38be 42c698e0 438734d7 c45df531 c405669d 42bbb5a8 425848e1 43cab588 c3af423c c26b13e8 433de006 c4a6f723 43fdfae0 c302bda6 41fa6e88 43974be4 4489c6ec 432d0fd6 437dafc6 445d2a2c c39f0400 42cfd50c 431892dd 00000080 -> be53bfe0 3f279cf4 bf3a1deb 42fa38ae", + "44aedbee c3d1675c c2450554 448a638a c42973e1 c2030a48 4241f62f 4460b2fc c463622c c29a2ee3 43954d09 44b84266 c47a071a 42afc238 436ad810 44af7af6 436d1870 4303990c 4342c042 44b91c0c 449c5f2a c31e772a 438b870c 4401b3c8 c4a0d2e2 428d7044 425fe4e5 449dcac4 43333200 4266cfb0 42294d5d c4368a4c 446938dc 42fffd3c 435690dd 43a7741c 44858a9e 42d4e1cc 42268da8 44a31dbe c2159980 c2c3df33 43130640 44893430 c49e24cf 422f35a8 43553998 c4574865 c4a32272 4302c68c 43765678 44a18c62 4484f5da c322a52e 431173e9 421ac1a0 c46494be 4244ad18 4371641c 4391e5c4 c4345278 c2e6714f 429f1f77 431db1e8 c46425b3 42beda40 4279423e c3e60908 c4b62352 c306864e 4229bb14 446ab26c 4424ec34 42a1ad40 431cc448 43f2bf24 43c501e8 c32f3d88 4336730c c2e63760 44b28226 43323ab0 43811775 442e983c 4476f974 c2ff766e 42fd30b1 44232e90 c3dca354 c2f5ff56 4302c24e c4481be8 44af936e 40977580 434dde25 c4284f5f c4b5c3de 4327f924 434c523d c3f06c74 c354ab18 c2696344 428738ab 44967b78 44215398 c3473048 428e523f c482535c 4382f130 42f432a8 4384d36f c48980b0 c4b0e622 c282fbfe 433e290d c40b8083 c3d7c950 403519c0 435bbf3e c4b5d356 c3f53aca c16df450 43951773 447158bc 44397560 431775a6 437ef887 c45af3ad c4b17dc5 c2d79877 43457efc 441e8dd0 c3a242e0 c2c40d32 419b7252 43b6d5ac 44392fcc 4335ceaa 417215e4 44757400 44b02a36 c2c85490 423f2045 430efb60 c40dca83 c2ad885a 428ada4e 43c5e62c 449278a8 c25dbf00 438a51c5 41c54080 c4637fdf 4277e800 412eddd5 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000026 -> 3e96663f 3f7372cd bdc635be 41331e0b", + "443c0f84 c44b3f9c 41571250 c480830d c4ba6fe2 c315b0a2 42e2f011 c47ff7ce c47762ae 42c13344 436a444f c4133017 44bb41e0 41d6a950 42fcf12b c1fecc80 44947f82 c335db3f 420cd5b2 c3fb3132 c321c6c8 408ae240 43109dbf 44024c3c c4576784 c2920550 434aee7b c40db438 c487a15b 40bca560 435fb24e c43a338b c4a2aa01 c2bece65 42eaa190 446161f0 c46f125c 4287f9b0 439134c1 c48d120c 444d1e70 c231ad90 424b51bf 42f980e0 c34d3f00 c2897412 43863abb 445cbec8 4255d6e0 c3407740 42c263d8 43a45fac 449c1aa4 425600fc 438993ac 44894120 440e5c58 c306e930 438df41d 440b0538 c2ed0970 c335b577 417e9c3b 43e91f44 c4b9c4e1 410a4140 429dc307 4432653c c4633a9c 4221c85c 42c6b978 c44d7b12 c49e17a2 43393eec 432c1fa0 c4a6142c c3c2e9d0 43290b42 42a071cc 44903aa6 c35d4a30 431461b6 43700a3d c48eb18f c456736c c3151446 42d69038 c34a91d8 c3e53f08 3fcef200 4228683b c4b48e91 442918ac c2aebcd6 434a5cbd 442ad2ac c3c52888 c0bb2a20 4325b882 4499be4c c499805e c30aa63a 43373779 449c43c2 441e0470 c32a242c 43240977 44a9efa6 c49f7c41 430ee144 4319d39f 4448673c 449db766 c3300a9c 42aa4ab1 43864f38 c439a299 43205cd0 4309fdc4 448d7e22 c46b6387 42f408f0 42f699dd 4410bd58 c1e5f5c0 c2a84ba0 431b29dc 445ea1c4 c416271a 4304835a 4351aeda 44904148 c3ab8984 c28644ec 43703eb5 c42a5add c429c22d 43169d3e 43008cde c48737cd 439035c4 c23c5598 42e381da c1f0bc40 c4b8778e c27a69e4 42199ba2 43f85920 c4b31466 c32a7d15 4313d49a c2c21250 c4aafd43 427f7260 435be96f c420c91c 44450390 4321b9a2 43059f96 c36cd2b0 435e3fb8 42bb74a0 434779f1 c4406ecb c478858e 423209d0 42f14e65 43849ed4 c42f89ed 43428166 42cb3681 c3ba12dc c1bd4d80 c29e74a1 42b714af 4463e498 c31e2eb0 432049f0 43509ed6 c4846706 c4673af9 4305ffd6 436a9297 c44d7c93 c3d7fe00 c2df462d 437dc9f8 44297da4 43a27e84 40553800 431df361 c3c3fc74 c3154180 43431810 432df288 4487aec6 442bb17c c31a42c0 42ce5f52 c39ac768 44ad392e 4073d240 42fbc727 c4adedb5 44416bb0 c32044f4 43927422 443592d4 c3b64788 4327fd9e 437d1edc 4487bc78 c4527066 c2b082f0 4299084a 4433503c 44ac7964 c1e87bd8 4385acf2 44a7e61e 444af780 4278eb68 43931cb9 444136f0 c28f7790 43329de0 438b3a17 41521e00 44317230 c20108ec 41fdd81e c3fa9d08 436e2bd8 c2a9885f 427e98f8 4408a060 c341db38 42be8ee8 4311c180 c4367db8 c43ef9ec c3209420 42dd8de3 440d43bc 43fef924 426d2378 4255ea9b c476d59e 4441c6d0 43028020 4387c623 c414d17e c44ccd5f c24a3cf0 433f9877 c4113bfd 42b0a410 42633240 432c6df3 446983ac c474c839 c1388b70 41398907 44ac2c36 44816436 400acf80 42b7e469 44a1bfba c4981d2c 41970840 42c425de c450b333 44ac359e 42512ec8 4355af9b 44010d3e c40ff30d c2a69d69 420da8c4 4475e86c 445e75dc 42cbda30 436257ae 4499e0fa 425190a0 42daaf90 4222f3fe c45ca87a 43f2d6bc 4317751c 42592a3c 445c09a4 c4716d8d 427ad578 420857ee 444da66c c4989b2f c232977c 437e8f40 c47b9482 c3c98ab0 c2e11f3d 4200c4c0 c4589f20 42874990 42901ff8 42da902f 43904968 44006d46 4335a628 4395c068 c444b7e9 432314d0 42b9c790 41646322 c3739320 4428de00 c321efa3 430a1517 c4a09e17 c396db8c c329495c 42b04626 c45535ec c39e4bd8 408417e0 41b53d09 c41428d5 430f0db0 432b4420 4331ea5b 449d61fa c31abb80 43293b20 43100c94 436a0c90 4405b7d4 415ef5a0 42f4ebe3 447cfb10 c34efaa8 407af440 4325053e 441bd3d0 448ea242 43260202 429ea225 c32262a0 43d50c80 428365a4 41c1c81a 44bab57a 44a784d0 42d94c40 4367e35f c41e5bcc 44a86f50 4310527a 4376d7f6 c4b6ea19 43ccc740 c3380a9d 41c08914 44364d88 c3bb5820 c3288f69 436ee49d 43c4ecb0 c42c82ac c1ca7d18 4360c008 c46842c8 441b85f0 4226f81c 4343cc0f 44921c0a 42fd61b0 41c55680 42d68298 c2769b20 c42b8707 421c6cd4 434985b0 448fca12 448e2baa 4201ce34 439214ab 440499a6 c4804533 c302a590 43405e55 446e1d2c 442399fc c2471794 4288751e c3a3558c c2e83900 42e92fb0 42d4f242 4462516c c48c5999 422c6254 427406f5 c45d046d 449ee5f2 430f7d70 42bc8153 c3ec7560 c48a6582 431633d6 43628570 c3a8c34c 4298a8c0 c28232ae 4360debf c4acf7b1 c3b4c9a0 c305f8fe 438245ca 445c7b48 c493e39e c31b016e 4313448d c497461f 4466e62c 43293684 4312eee7 c3fc4e08 c390a648 c2c85841 43063728 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000006b -> 3f69c138 be68bbd3 3ead5046 429173df", + "c49c6be5 c415d8dd c2243ee8 c36a5c08 c306aaa0 4337e242 417ea3d4 c41d0c5c 43c3ea0c 4192be90 42b7d0a4 c35bb9b0 c441f9d6 c2a65dc7 42f0e97a 43c9f43c c47d792d c3435883 42bfcfe7 44a05340 42e824d0 429ce718 415d77ad c4891953 c49dc4df c224169c 41233b05 c3aa3014 44ac0604 432f8482 4384cc96 c31e7808 44b9f440 c3089ab1 4394d109 44b5537e c49e7c07 423aff38 438b0862 c45cfb1b 4480d50a 3facb480 4313c172 4347e2a8 c467d3ae 4287e030 432e48f6 43c47c44 c4994322 429dba88 42a01697 c4448cc7 c489f645 43014912 435230b7 447d1b7c c3ef4bf6 413a95a0 42dab4e2 c4a5e009 44ac214a 42562b0c 42d47c7e 440fdc94 43f6b9dc 43061ae4 4306f495 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f4ce6dd 3ed11260 3ee0b567 411a9268", + "c4765ff7 44546728 4320db98 c49ac5e8 c4996c95 c326684e 41a1efca c4512b15 c32024b8 433166f2 4300bcac 44783568 c3c370e8 c2a3ceb1 42abb5b3 4413f268 43d72904 c293f081 42704a4b c2beeeb0 c4819d45 4264e878 4328fbeb c4294b1a 448982f6 c2caec73 428d9fde 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3dfb2b5b 3f78111b be5b916d 439a85e7", + "441346d8 c483007b c33781cd c2448340 c3fdd202 429b29d8 424a488b 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "42a997c0 c43e3e03 4301e9fa 43ae8d28 4493b19a 4209099c 438c4ee3 c44cf579 4385f608 c2811bca 41f31b30 44b97516 c4b39bc8 41013250 42a9c405 43ac0c18 c484cf2a 42cb6c50 4149f292 c42bd5b4 c45191bd 4309cf34 4383c56c 44886e76 c33a48f0 418e5170 43347b81 c4772500 c3e504c4 c3386ea3 43385f83 c48ddfc4 c4bb2a38 c038df40 42b2d43f c347b468 446ae358 417329b0 436345e8 44ad76f4 c3ee5380 425ff630 43488a82 448b27fa c4958d34 42e6ebb8 4384c273 447b9604 44b447bc 43139200 427e8916 44a4e0d4 c48a6d88 c1ee7520 438bdcd8 c46377e3 4488db06 42e8f0f4 4277043e c3e1efc4 44baaab0 42d22608 43848359 431729e0 4431fef0 43337440 439514a3 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f7a032d be595ffd bd0bff75 43310f98", + "c47c82e6 c4aed69e c20e6d30 c4b99a1b c4aa1313 432be88e 43325f9e c46a62cc c4ba4cb6 42d218e8 4346489e 43f50f98 443d5120 c2f837f9 4314bc0e 4484bd9e 43f26aac 434452f2 4330de8d 433c12c0 c49e931a 41db25c0 41830ebe c3d2b3d8 c3963cb8 4339eaf2 4331bea8 44436e7c c4938194 c3127f76 4258f85d 445d3e60 c3dcbf5c 420e9118 425cea91 c4a2387a 43674a30 432dd878 4209e4c4 c14de000 c3e1c430 c3444f84 4381f40f c4b0caba 42af4050 4294cd24 42a24e63 435ae088 c3947de8 429d2150 41ffa9a3 44abaf3a c3754198 433a3ad2 426c4868 c436c624 4451a140 c2c958d8 43398380 c49cdf56 c3defd18 43000256 4205c4d3 448a8aca 43a51778 430db47a 42c81cd2 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f77592b be6aa9ab bdf1bf27 43575de8", + "c418b830 c40b6b11 c2f8dbe4 44986838 c49d9cbe c2e5703d 41ed8d9c 441b0d60 44b90b74 43042116 4359037f 44249444 c4b972c4 c260b020 4300f808 c4a5bc4b c464f2d6 c24535cc 42f49c74 c37050b8 4495df74 c2a9ad01 42d2b150 c3ffe88c c4ba7b1f c30e4082 43238b93 44a0a546 44b89cf4 c20268ec 434dbbff c3bace4c c49cbc6c 417ad860 43948d9e c37165d0 c3e2ebbc c3337000 42d85b82 443d4784 c4958358 419e9ba8 436df4a3 c3760550 4492c46c c25c6cb0 42dc9abc c2ed4870 43ffe580 42f9202c 430271ca c286e310 449ebab8 42c2bd18 42438f5b c48d587e 44a8096c c223d5e0 43880966 44a33fba 4409cd40 c31030e4 43592fa4 4360e060 c4813bce c2814c4e 4342d8b3 c2ca5730 c3c3ad94 43444808 4357b3db c485c06b c4ad2d27 4257d22c 42ccc932 c3e0db28 40b1bc00 4324509e 4309063c 43d2b968 445fe010 c32c6506 42a984bf c46f5441 c4ba4fe0 c2f20ee7 430d222c c3f21440 c38e5cfc 4312c70a 4312b767 44a92b32 c4841c58 c21ada68 41ef3cbf 44ad2a7e 447b5900 c2e71fbd 42ac513b 431f0180 44289ff0 4317d656 42117318 4406ebb4 c4953790 c2b6670a 4309674d c41eb514 c36184f0 42e334bc 433e27e0 c4ad8227 44ac586c c2bd6cd1 4246b918 43ac1558 448f2646 4156a860 432fd1c0 44abbb2e 4490d286 c2a0f845 41ddf33b 40fa0000 426735c0 42ce8fe0 43955d92 43ca7824 4346c110 c2651658 431f570f c41ceec7 43de41c4 431a0158 4389c4ec 449d1718 44b34a6e 41f944a8 42036a6a 442d60d8 4441941c c3067b79 43897fc6 43b5a028 c43eb656 c1d2ccd0 4394c58d 44902eaa c42f35c6 c1937938 4204d9db c414cebb 43d0f4d4 c29c445c 434b5fe5 c35ddd40 446ece48 420d47f0 426253bb c3ea2c04 c427b871 42f37970 435b6b96 c4a1ff62 c42d37fe c2879fa8 42f5b375 c49f88d5 c3e4a590 c2e1a95f 43429e32 c4131f8e c307cc88 43083f76 4287e8fe 4426cc94 c3ac7fb8 c1bfacb0 42a8fe9c c49b9252 44480158 c31b8b75 42e9c8ae c4915faa c4276ae8 c2e54ca2 4346ebcf c3eabe10 c45358cb c0850fa0 421c9452 c3a549b8 c3783100 42bbefe0 430de43b 44aa2922 c32f08b0 430a4fee 42e02f33 449bb7ac c4aaa168 4326c81c 4325b4bd c4a9537e 446df9c8 42dcf774 437f969d 44600368 c494312b 4331c398 41af3926 c3b68a78 c3fce13c c329ce69 43316432 c47b12f5 c340c008 422faee8 436f74ea c4a6a013 4406437e c335bf04 43812c78 44863c92 c48f7758 c2ca8e38 43858d56 4424dbfc c3ab4498 c2cb2229 42b6d4ca 42eb5240 c49a7a46 c27d6004 41ad2a28 44832514 435ea998 c28fe584 42bf1eef 3fda3000 c3c83884 430d1b6c 429e6fc8 c429a789 c31a51d8 42b1c138 41d779b6 c3ed5278 c4805be1 c2a85957 43203933 4478e3d8 c4a70b24 c2a2e62c 429d0330 44bb41ac c4a4c7f6 428f2994 438c0035 43537c70 44921da4 c3152eb5 4301baf4 448686d8 43f58000 3f3acf00 42bc57c9 44b7aa32 c4ae409a 42b5fe64 433564dc c490246c c40aecea c2a7787b 4351da3b 4474b018 4466368c 42041f44 4300ba2a c39d27a4 c469b117 418f4c88 432d0283 c4976745 442b0db4 c1a38d40 43168ddf 445ac340 c493f86e c337ad6b 436ed971 449439b6 c3a65dbc 42b3a1e8 433b2b27 c44364ad c3344930 c2401628 433aefdb 44a786a4 c34c28b8 c32c8d22 42c5bee8 c35158f8 4414e99c c21c2c8c 431ff48f 4445eaac 43a0d834 c210090c 4283978c c283f4b0 c42cd6a0 41652f20 42f19be3 c3e8b54c 4342d2c8 c292b733 423f92c4 c455eae4 c4b51126 bf132a00 43853b77 44b971fa 44a46236 429c98c0 435cb1b1 43875698 4406cd40 c1a10dc0 42f4149f c35afc50 44b12b1a c16eec20 4390ad12 c48e943c c4444207 c3133ef1 42faab9e c402bd6e 44a1ed10 42b09fe0 427df768 44129364 4482a706 c29718e5 433f7561 44847ace c3ec50d4 c2bb25ea 434d9d72 c48d4346 c43c0a61 c2277050 438bca0c 44a284e0 c46ccdde c2967331 4318a3c5 c4ba72ce 4403e518 432abea4 42099e26 c4806a56 c4b2a351 42d450f0 431c9ca8 4466290c 435994a0 c2be29f5 422395a8 c348d530 449d1634 42f3fd40 42b81ff4 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005d -> 3e96cbb4 3ef121a1 bf54df97 418791b8", + "428733d0 c4894f6a c2466954 c4a13d6b 448bf834 c2c9c8d7 4301f6ea 444e5a24 c431b70f c300e8e7 43315bc4 42c68620 c4b049b3 432e3616 438b536b 43d20948 c39da518 426fb658 4136ed1f 43ccf0f0 c4b16a19 42897114 42084b0c 44652d70 446f2100 c2af65e9 4204fca0 c47f5aec c441e413 c2ec7a9c 430ad84a c4915bd0 43c7cf80 423ed714 439552d4 c47aa1e9 4488bcca 432d1c64 4372c19a 440651be 43ffb948 c23c1fa0 436691df 43838120 44a0ac30 c2b4f72b 43275cb1 c401ecbd c46fe296 42ea6cdc 4321f559 c4815006 c42679b2 427f9830 42ba9591 424d7d80 c4a3d621 4300a9c4 42a5b072 438abfe4 c4794b36 c2c4af3d 4324c2ba c4a5820e 442f131c c161c8d0 43877b8e c3861070 44a51290 42d07310 436add07 c2e33e30 44823464 c28b5236 4391174d 43d8b540 449a34cc bfee8100 43842e50 430722e8 443297e8 42cab71c 43930255 c31aa890 44074e1e c2a8b2f0 437bf5b6 44b18c34 c3fbe89c c10b73b0 421f27e8 c4ab625e 44083112 c2e7e9e1 431e5495 c37afc48 4482c97a 42a18d60 4380dd44 c2d990c0 c3bd2178 c31332c9 42f43673 c37139d8 c4b4e281 c32f40b0 42c69d02 44a991b0 44113384 42646338 4339b693 434b4880 44a6b4a0 42a4ea14 4380e268 c380adbc c428ebf2 c325ea79 42ef60d6 c3271488 43c390c8 432a9164 4203220f c2e41a80 43ecc30c 42b9eeb8 436c5b17 43cda818 446bc5f8 419f61b8 4370c143 c45a0af3 43d3a850 c20a9b64 426e8387 439f2e44 c3c7c4f4 41bf4d48 4306ef15 43b1ced4 44b4708a 4318dd2c 42b6516f 440dfd30 448b9d1a 415fbda0 421a2cee 44b24ad0 c3d866a0 c321178f 424c37c0 4445aa98 c404393b c2101c9c 437baccc c31d8560 c4a775a8 4329d61c 4366e854 c42114d0 c4240074 4288adfc 4247defa c48593b2 4482236a c22563dc 438b5d79 42bb10b0 42d21000 c2c9656a 41bdf41c 44213df0 43e79b00 42cfc288 43104f17 443a29b4 43dbd770 c231358c 433501d1 c48d6b5a 43c8fb94 42f412b4 42b73211 4422d228 c389a3f4 c33b23b0 43856886 c4499e6d 43700698 42b2e960 432a46ea c32d4fb0 445f8618 c30dc470 42d79496 c40e4209 4437414c c311930e 437e4319 c291f800 43a27480 41d732e0 4309b9f0 c493321f c4a8cbe4 c1eaf378 42269da4 434001a8 44a78c66 c325f12a 43724531 43f64b90 c3f7a214 425e3078 4346dbcc c28e8ff0 c3a5c880 c1fdadd0 435f4f9d 446c29bc 4204aea0 429c6290 438eeb64 44698734 4412ae7c 42284344 4389f576 41d3ba40 c3688600 c30ae018 4131fd67 41fbee40 430ce228 c31a659b 431f3a4d c4a27912 c3cb0430 c3027148 434b7e4a 44b49f8c 449ea000 c28ebe02 42b8f099 c1768b00 449e83ec 431b649e 42247d3e c47fa09f c187b740 43106320 438a85c3 c40449f8 c3953ca0 c33d0a54 4390de83 449aceee 43ae1ef8 424e80ec 430173a4 c325dd38 41e6e340 42208700 424c26cd 445c7cf8 c49d064c c2a7a6f0 422ffe4e c4515286 c48ce42a 4207323c 42296ff1 c4554fd9 443e2158 42cb1d54 438652bd c468e2f5 c38558c0 c18bd2b8 4385db2e 446651d4 c0cecb00 42ce3c3c 41632c1b 43389290 c4490662 429035bc 42279620 426abe80 c4837a4d 4222cf58 430cb0dd 4430b178 44447e54 c2ddfeb0 4312e45f c404ff48 c46ff40b c075e4c0 4301f15d 43c668b8 444b6f68 431a90e0 41a0e80e 4499b15e 443b09c4 42a43564 432f54cd 43dbec60 c488ae8e 42dc1ab8 431b7fb0 c47f2b1f 44344d18 4227b200 438e4bab 443cdea4 4380c778 41fff460 432cfc2e c3947df0 c46faa42 421c4720 41f5e7b3 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000050 -> bf536bc9 be5333d6 3f0658f3 4292f0a6", + "44a0a438 c4b6c74e c19a2808 c4239c7f 434fa420 c3443b27 438a80a9 c4ab7be8 c436b503 c339a960 433b50a6 442730c0 c4944398 42f9b644 4322bea8 c4923128 c2dbc380 c2398660 42ed1276 c495fc85 c41cd681 43461368 425e54ae c428450d 4425295c 42bd7440 433805ae 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f2dd99c bf371e6a 3e28be9b 44c2359a", + "44b9da82 43105948 c33a00a2 421413a0 444f0190 c24a92ec 42a5f7a6 c4acd5b4 c3cadaa4 41d42a10 43680e2b 437309a0 c48f99a8 c0cca900 432effdc c3f6d8fe c4b0a90f c0f056a0 4368acdf c4ae4219 c41cdca6 42ada8b8 428fe74c 4413efb8 c36881f0 43092ec4 42f0ddad c418b112 c4377ad8 41c53c60 437b6516 c387fb34 44b89fb2 c33bf3d7 437352de 4487da2e 445e6538 c2e7890a 42d299a9 c337c100 c428b8ad c32b94c0 421a62da 446e4f28 43a2d4c8 40f380e0 4271a09b 420624c0 438453c0 4330150a 43527ad6 c4374df2 44792c4c 431d39f0 435b4df6 4430106c 44ac7ade c318f015 4210378e 44a264f0 44b8b872 43361a4a 436d4962 4463588c 442f6dd4 c265d204 4334b7c7 c49ae50e 440695b8 42a55a4c 43264883 446ebe58 c482462a c288b8ea 43667ab1 c45225bf 43b1b29c c2269714 420ee2b0 44974d7c 43fdb5bc 4313d992 43576040 c40aa24b 448adf56 41f5c438 43315d07 c496469f c40fb73d c32c133b 4387d659 4406275e c48e3918 c22716b0 430b62f8 c40729fa c41f8658 c2a39d81 42094136 c439db29 44a160c6 c3254094 437b33cc 448f129c c3940db4 431531aa 421f7860 41166a80 c489b3ec 3f464900 422ee4a0 43403230 c4b0a3bd c2fae7bd 42ad1196 c48d6386 c43db3c2 c1490260 438c4196 c4809617 44516f74 c0877320 436bc8eb 43a47390 44644604 431003b2 43544ccb 4440c650 448f99e4 c1be6d00 438c3684 c404c309 c40cf827 430699dc 43921aad 4376cfd8 c4ad4a50 4302aa94 43898260 44ba80c6 c29d2310 c32a684b 4391236f 4465d4f8 44aa1268 c281642c 4346795d 44a2e38a c48a20d4 c28d712a 41f8b470 446f07ec c3cdfb10 432ab1e0 4313276a c3313ae0 c40fc637 c2de525c 42018231 42f791c0 c473736b c2767754 433ddb71 441039b4 43504cc0 42eaa470 42a62c99 c466a7f7 c45712af 42915010 420aae98 c36ece60 432434a8 432e2f1a 435027a7 4419f300 4289ad40 433cd9b0 4348458c c2cb60a0 c45967ea 42d292a0 433f5bd3 43333780 c3c656a8 c31a7b60 43903e82 c3ac0b54 c3cca9cc 414e2360 42b2e702 446cd894 443b20a0 c24bd8e0 43785d03 c48b8e3a c30aa5b0 c2b4a9b5 429d7724 c47ed55a c49b294e c1882738 435b20ff c315f2e0 c44467aa 4273b620 42ad1aac c35a5760 c4406ab3 42d624ac 438a1b50 c3f5bcbe 4345f748 4231b1ac 42d40f17 c383b9c4 44257018 c32fd112 42d039a6 c30515f0 4479bfac 4312b032 437a6196 4407c52a c38a7e34 c2b89448 434c8f39 c46e652c c490ee53 41b16940 42a5dbf6 c43c6b3d 4430565c bfd29500 42f052b5 443d8148 c4abb825 c301db5e 42ce88fb 4421974c 44832ef4 4153be90 424c8e9b 438fd16c 43ab5910 432f1e28 42a4e335 c4879554 c4abf3e5 c2106274 43001b92 c3a002d8 44a89df0 42e118d0 42d1ca32 c4525cfc 43c0d3c0 c337f504 41b23e02 44afd1ae 44b488cc c327444d 42c9f27e 440d00a4 42425f40 42875ca8 43384e98 c4a13640 c4499b40 41fb14b8 42eaa89b 4307adb0 44332274 422e83b0 4339afc2 c41610a9 4428a558 c2d5951a 41eaf6de c2b4bd20 c4b432e4 414fae60 424b306d 4418d180 c483ef64 430f4320 42c17ec5 44aa278c c47880a8 c307dbfd 4237fb3f c4bac271 c4899edb c26b94e8 435ede5f 4448fdf8 c452767a c193a900 42046e17 44a6e2d6 c3f4e570 c3001e42 43888d3c c2de0530 c4aca0c7 4310d114 4347cc96 c3ef23ba c4735558 c33d1365 43197328 c39cb4b4 44b17dfa 41e7e690 438ea905 c3191368 44a56ea8 422fe934 43268d00 43ed1034 c3c2e410 426bb388 4387b564 c4a0ef63 c308fa38 c252ff64 43018ac8 c3aadf7c 448ca402 43072168 42056a46 c42bbf0d c481ff46 c3174b38 4242718e 447ed2f4 43bbcbb0 428e259c 434a96ba c42066ce c45e3e48 43376c22 436bacd0 c4867e26 43f88bb0 42b6dfc0 41927f1d 4335a108 c390eddc c2abf4bc 4379c85d 43a4286c 449b427c c1fac170 4330bcca 440e1120 c4264ce6 430690bc 414829b3 4400a62a c3168468 c2b948ac 43110117 c3f367f8 44a78aea c2dd148f 42a07827 4483d480 c3360428 c31c2760 4378e540 c43165f3 44a73120 c2c50a70 430dc42c c384b990 448a6bdc 42d0118c 42fefb93 44294fb0 c3f0cdc0 430cab22 43937dfa 4386fae8 c4b76102 c1390370 42e30c3e 442dc6cc 430c6d10 c1b419d0 432cd5b4 4458967c 43fd8ab4 434506e0 437c872f 44a33aec c1a76c00 c1be86b0 4284da18 c32ddb80 c22326e0 c3012761 42349c06 c41aad1b c2e855e0 41cac6d8 434a712f 43f07d88 44af3a24 c3069fbd 4377e300 425a2a80 c34e3010 c2adac8e 42d49972 43933c10 c420bb51 431637d4 42d18251 c291de30 44898060 40863a20 42c4bf88 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000069 -> 3ec72f03 bf4f3db1 bee11c31 4354774c", + "c4982bb0 c3701c68 c27ce4a8 c377d058 426508a0 432765a6 43064ff0 43448a50 44ada922 c2d08647 42645314 442cd794 440db44c c314842b 430bcf71 44669fa4 44137d34 42d38b38 42f25a92 43b92114 c4ab4166 c263faac 42f3f32a 43f0bfb4 c44463b8 426f57d0 433d11a2 c490dacc 442429a8 41f134b8 4392820f 448ba436 c48c65dc 42c484e0 43059f4c 44afd8f4 441dbc98 c2cda7a2 430bf958 c43f4a1a c3a28bbc 4335111c 4311c55c c4ab29f1 c477b5ea 43131480 43370edf 4439207c 448e2b52 42868d6c 426d38b0 44388ae4 449e037c c24c7f00 431c642b 44051c52 c45ac26d c2a5c6ea 4277ed84 448a8fae c4153d5b c2940bdf 437f85cb c3a86c34 c4316e0d c2a805d6 4339681a 44a63bdc 4417d1b8 c10859d0 4218bb51 c30ad690 c409d13b c310a1ab 429a6f33 c4998170 44920062 c27be888 43185382 c3c25450 c4a7af9d 431441d6 429c11d8 c4a87d77 c38df660 c2d81c81 438ee567 443e0fcc c4425c8e 42c70ad4 43669361 c37763b0 c4a39e65 41fbce68 438dded1 c49ebd5f c493bc6c c327d129 436c3d51 448e67c8 c431dcde 427589f8 41b70822 c3955da8 43550628 42ad09cc 4306a554 44543618 c486d8f8 c2095de0 436e8fc4 44892948 44627fc0 42f70a70 4376d4ca c350e340 c49d5f72 42ecbfd8 43937132 c4aee9aa c3f18dde 430c92ee 4355b511 44aa1bcc 44239124 428fb76c 42f638bb 44322a64 c4652261 c309f6da 4393c4e3 4467a8f4 433b4358 4231a6d4 4224d023 c396efc8 4474acb0 4305ac0c 43151bd1 440dcba0 44610928 c304c6bc 433bc5cc 44750774 44acbf4e 431defe0 433c818e c437d695 444485c8 40ad9aa0 439578b2 c40e6caf c496b6a2 42c54198 4326d3ca c384e0bc 44a92232 c323af5f 434fe06f 4492c2cc c4024df7 4299cea4 4334a754 44b5fe74 c35367e0 433fb494 42c3f045 c467c676 4416e718 c204588c 43393336 c43e617e c409cfb0 c2a55c51 429b70cc c476d24d c4442e40 43164b1c 4394facd 44726f64 c4a375b0 c311f024 43927374 4407b18e c47ff300 428b9c70 4358207b 446ce358 c4a12824 429cf234 430c05b4 44309580 c4828eb6 420d50f4 42e66c8b c4931449 436ecb98 424c4e98 42fa5c66 44b48604 43894010 c1f15ec0 432a911d c3e8e16c 449988c8 42c82828 43951bad 44649948 421c9fc0 c2503184 4270aad0 c49f4438 c496d0e6 430fa278 4379e769 c467abb3 44228d20 432303b0 4379b583 443f4364 c42da3a4 c0a01b80 4234085f c4b99dff 44afd964 43137a22 421566ef 442af260 44a16fec c315b54a 43357a94 43a619d0 c280a4b0 c3435f7e 429a69bf 43d14da8 43746d98 42513e8c 4369bc2a c3893148 44077fa6 432264c2 42c39f90 441646ec 428b2970 c24b1948 4342e903 c41b6e0e 4443ccf8 c3035282 42f6cfa6 44010bfa 4461d4f0 42637348 4358bece c4947f2e c4131c07 419bb498 42edf909 c4ac39b9 43e9d36c c2bb4398 4383c5fc c3a90438 4450edfc 41c73760 43370d3b c49b2760 43bf028c c2f9d30e 433acae9 c49b4419 c4887c8c c20320f8 41fc7fa0 c3ce4124 c46c7afa c1fee288 4315bada 438fcd44 c449b24e 42f13dd8 439131e5 44421a90 443001c8 4327b292 4374ca8d 447c4d60 c41702b8 c314e79e 42d6b1ff c4af3177 c437c732 42b89d48 43644511 c37fc3f0 c4af9e41 432630c8 438aa916 44acda1a 444f4000 41a45e20 434af8cb 435c0b58 433a3190 c29bec44 4325729a c3af6734 434b6930 c26f54d4 438a4d00 448fd088 c4a27040 42dff534 4374cd36 4484dfde c416b4c3 c319cd65 43474478 4486bf96 443d7904 42d042f4 436e67b8 bf98e800 448403a4 41f5cc10 437afd0e c38e1914 43f815c8 427f5f68 42d3defe c42d1673 c08b0400 4105aff0 4377aa3f 4406c7a4 c4887359 c22a60f4 42861c04 c35342d8 c3af2c7c c1eb01d0 42afc9a4 44a81686 c45aaee6 c1990968 43911173 c295e8a0 449dea4c 431f543a 422e3235 449c124c c431e0a4 c32f0354 428cd19e c4b57f63 4445d218 c305ac32 435b2e12 44b5f848 c29b6400 c313b258 435a2028 449912c8 c4b425da 427028a8 42f345ea 4309d380 44aca7a0 c31404ae 435a472e 44981458 449d085e c2dd8bec 43141285 c4027290 c1c68a00 4307bf6c 42bce252 c3963508 43a63c88 c2666ec4 43166819 44484cf8 4303c3d0 c2089b04 413da20c c33fbf28 c40c9093 42f2d294 4389cfe6 44b05e16 44012700 c2e6cf5e 438f8b59 c439a7da 441caa14 c25f5a9c 438ba6b5 432ef820 c4a24aa6 c1ffdaf0 431f3c17 445a5d60 c46fe882 c2e7e31b 4395a0db c4ac96bc 438188b4 4318e534 43220a77 449f2596 448c7d58 c28ed764 42ed2b2a c48f344a 43dbe578 43343e26 42e74766 439d79ec 43d791c0 43338c34 429b598e c480ab14 c4567e51 42c64f34 429b56a4 441b7324 c42e4ef7 c2dd13fc 433cfbc1 c48a40ec 449a0714 42ba48fc 42d4ee51 c467ea6c 44800434 429a6800 433436d0 c3f95442 c3787220 433aa638 438035ec c350f958 c4259022 43449f22 4216fb7c c3dfde28 447ccb4c 4306f144 4339b328 4441b58c 44ba0c76 c28d158c 43899e55 c48f1e17 c46afcc4 c263a6c4 43315f2e c34b4b08 44b2ccb4 c2a7dd15 4369ee3c c3cdf1d4 c430359b c22b4594 415f5745 c48654de 44b74da6 c2fd1491 42b48314 44aa189e c3cc81ec c33bcd7a 4280ec75 4404d136 c496527e 42f26a70 438441d2 c45028b0 43e45184 431908f0 43832e1a c3514d50 43b0afb8 430f8fe6 4244d32f 4382a4bc 446eaf40 c2e4922b 413300d5 c24416c0 c4900d16 c30a1dbd 42e30ca2 c48bdea2 c46529d6 c0a614e0 4267bbe4 4490dc3e 44b336ae 43358e86 42e5edbd 43e61d28 4335d568 4273a280 42f8e0c3 44ae9d18 c4888ed8 c2d1fbc9 41792561 c3ae811c c26f0260 c2687f38 436c34ef 00000080 -> 3e230c3a 3f1e045a bf453e66 43666d31", + "c464b1d5 43b4a5c8 c34691bf c435add9 c35c5578 c28d2bb8 436a9c8d c470559f 445bd070 43071726 428d3136 44022242 c4a4b4a0 c0de3260 433b837b 43ce9908 44b840c0 c2cc5bcb 4354834f 4277b220 c45466be 4313d93c 43910012 c2d64580 c477d4f6 c19bffc0 43326911 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3e5231cb bf764709 be384330 4192481c", + "44425ab4 43c0ccac 41a44ff8 c431ec28 441b49d4 430d00b8 43613669 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "447ab30c c385e32c c26a0694 c29cde60 4448a4ec 42fba2f4 427f5f1c c41be811 c49f5a38 42cbe75c 43000edb 443872ec c2071a20 c31bf1e8 4206c67d 435cb5f0 c45ea05c c1312670 436c062c 44a5b2a2 c49a6c71 433e1f3e 43616a4a 436e5898 43315df0 42e79b70 4200ccd3 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bed9ce9b 3f5ea1b5 be803c9a 43a61f2d", + "c4499a34 449215d4 c275aad0 448df8e8 c3cdc9b0 429a9038 41edade8 44a274ea 4436350c c31f2962 42572113 c4260865 448d898e c2461888 43797ecc 4457fb9c 448c6ffc 40bde420 4346ccf5 c41b4332 440de658 3fc6fc80 42f0821e 44ad8500 446df56c 41810dc0 43310d66 4491543e c4b8826c 4325e4a6 4392cffb 44327ed4 c3dee6b4 43188d9c 435b2f44 c48cb868 42de8ef0 4312ef88 423a152d c3793320 c4b6592f 42609058 430f76dd c3c2a9d4 43c0a14c 4282971c 428e3f43 4394ac2c 449c5ca8 42e92d64 43508a60 c428fea6 c35f7458 41841aa8 435b3f47 4483315a c43b8a23 4322e9f8 41de3fee 4471dbf0 c48f907a c2ffa9c7 438b2906 44762858 c48cf866 c20b3b94 438b728c 44ba04cc 43e84bb0 42a0e14c 42a58343 c4b8d094 c3a6a5b4 c2d4b7a8 42b5f666 c4a92ea8 c4ab2031 c34403dd 42d5e4ab c481bc1e c3ffa996 433ec560 4391bbe5 c4549f65 c44a6ace 42a2aca4 42c93cd8 44689668 c47f1e8c 43149770 4383d886 43c2b658 446584b8 c29d3c82 42c1de1b 4479fccc 44215500 425337f8 42a2c3a5 c4556b6c 443102b4 c2e43925 438dea9b c45519e5 42f38690 428df830 43856fda c46770e9 c43278ec 428a27e0 4373cb03 c44302e4 435af560 4322e8de 4318f26a c486e984 c4599e57 42a6fdf0 433772ec c36dca98 c495cfec c319283c 437c8028 445489e8 4474b9e0 4241b8a8 4288a8ae c49b7510 44a2dfd4 c1ad06f0 42d5916b c3848540 4445dcdc c31874ed 43033a48 c4906f9c c4af3f13 42cbc568 434e03f9 431df218 446e2da8 c31792c2 4328f173 c21a3ec0 c4a30394 4257b3ac 41d3d3be 4495880e 4468e68c c3082f5c 433ecec2 c4b91c89 c4aec874 430229e4 422d5480 43b25c48 c3b63b68 c307a74b 42f5f269 449d5120 c28e0b80 42f0427c 42a91b4e 446d14b4 c3f190a2 c228c098 431416b5 c3099db0 c2010720 c2431130 4224c464 c3069da0 c4af30dd c335d1cc 4338eafa 44b3c9aa 434f14f0 c2717fe4 435a3eeb c4676256 4340c2f0 c29e1774 42b3731c 444e1870 4471d73c c28a1aea 42ef16fd 44a4672c c4ba07d4 42ef4ba8 435f88cd 448b6dc4 c3ca4650 42cd1f80 420088c9 c4b50855 44887eb2 42b993dc 4253e65f 44001320 c4800203 42244f78 4300c17e c34aa598 c4a801f4 c304a950 439229fe 44b72c3c c4505129 c311cc37 41c3b894 c4b074e0 c32baaf8 c2f18a13 42e20cb4 c4748b74 429877e0 c0e2bbe0 4395146b c4b7278b c4b53448 4171a9d0 430c8f8f 440e98a0 43d4a2ec c2d366d6 42105fd4 c427af42 44afec56 4209783c 422deb53 447cca9c c4605859 c335122b 419c3196 44ad15bc 449354bc 4308fc20 435b9dbd 43e72968 c3db43c4 c23126d0 4359b005 448a27a0 443aee04 42a58040 43066b62 c479b1b6 c39447fc 4320f3f4 4318a1d7 c3b17338 4432bd28 c3115c02 4347a74c 43b55424 c482517e 42af7fec 436f4d14 446d2c80 c49e1c9b 429db31c 4179b3ab 43cc7cf0 c4b3fa6c c2e5bd8c 437a497c c39cd158 c47b1321 c22a1538 42b70373 44093640 44429aa4 c2805d0a 4348c071 43bf4340 4471326c 4202e000 438d6dc9 44a3149e 44660954 43292950 4383ea32 c4a2785f c49837fe 42baff84 421a88de c4a365ea c39ffb84 c20cdeb0 4374a1c1 c474de76 c4a81633 4322a20e 4330f6df 43eb0c6c c3c313fc c3281086 438002ec 42da7db0 448ddcd2 c33a91a2 41288a79 c4b8b505 43b5fca4 42f71bd8 433e7232 c397d73c c27df500 c33d6991 4371cb49 43541010 4450dd50 430e5326 414c2816 c4813356 4471632c 433508d2 4327400a c4204466 c490b794 42d37184 4129ca19 443df540 437dde50 c31cfae9 43410ad6 44845564 4445dadc c34792e2 42a96296 44355164 442f14e8 c218d7b0 41d344af 444cda64 449de606 4313217a 430b2c18 c4211a13 c491ae1a 429ff89c 4333c6af c3c7afa0 43a8ffe4 c2d14a2e 42f91cde c464084e 4494e658 c1ff1fa8 437c1b33 c377ea20 42e19490 41c68aa0 43047997 c490c063 c4afb312 c2c9263b 43049e85 42254ca0 c471b88e 42d77880 434223e4 c2855f50 4449ae70 c330fca7 437ccd18 c3bcfb2c 44606c54 c2d2e592 429bf416 44aa4232 41abf340 c2c25d4d 4272c1d5 c380d074 c470d913 42585fc4 424b1bd7 c3e6a5c0 441f6550 c1cf48c0 438f982a c3eab36c c47a5671 43081458 428a69c2 c4767393 44b4ce04 433108ba 4361158b 44015fe4 c324fe68 432ca89e 4224b0d9 c3ecba58 c4a32038 c31cef40 4337691a 432566b0 c394494c c33f98a2 42fa19dc 43f107d0 c46b98b4 4318549c 4388fa85 c42495f7 c3a91ea4 c344b7f2 438c97e6 c39ba614 c4930494 c3295d33 43725c98 4435dc80 446b22e0 c2a6da6f 42c8b3aa 44a0c426 448483ba 4284ad88 42f7485a 4485bdfc c17df080 41c61700 431d9db4 43628dc8 c4836afa 43050b30 42de7e3e c4a0cc3d c4ad866d 4208c380 438e09d6 440fa380 c4ad1036 c2a3e413 425ee325 c420f514 44a14024 4329717c 436d66e4 44b1ba76 c4b8b3f8 c2774db4 432db7f9 c3c561b4 c48a99a8 c257fbc4 43235032 444d2c58 445e14e0 428767f4 435582c7 443078ac 43c1b6d8 418041c0 426888ac 43b9f3d0 c3c04ab8 c28441b0 423ff5be 4323eed0 43ee9dcc 4311917a 42e43388 4286d9b0 c48a3043 c31c1bc1 435627c5 425c8b20 c48955e4 c33d88be 4395d00e 44a12956 448f2378 c2035238 438021d2 c48385ac 44ba822c c30fc1ae 430b159a 44556810 c4130afd 41f1cc40 42b38e6c c3c5fc98 448fe4b6 c2e8297f 41e0b603 c097ea00 c48b10c0 4157a2f0 43897844 438efbc0 445b74cc c2d8665b 42ca9f1e c485ac5b 44b66ce2 c3372bd3 429d6922 c4b3bfa3 43f18a24 c343e287 43438a2d 444a7544 43ffd2e4 42d9991c 4380c55a c458960a 440f2b80 c3415197 433fb7b1 00000080 -> bf787a57 3e6c0dd1 3d8d5733 41a3ca71", + "43b59a28 c4ac9b81 427bc868 43853c40 44b81c0e 425e03d0 438aa580 c4a9be10 c45cd340 c2313f98 433805d9 c4914856 c390ebb8 c3112344 43472384 c494da49 441a3c9c c306e098 438f8424 44976296 c362a7d8 c3169800 42be51e3 44a369e0 41775800 429df7bc 422997cf c3d7b14c 4483af10 42f604f8 422a72d5 4498a7c6 4408ca7c 42a49bf8 430b6234 44b38cac c4497cfd 41af1608 43955948 c39107ec c40a96b6 433d53a6 430e1559 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000000a -> bf7c2a60 3e12fe3e 3dc3a697 42a4edbe", + "c48f4c2a c4a68fba 42b57ce4 c45ff524 c492f0bc 43421902 4380d0a4 44007f06 c4015f61 c15f4790 42954e7a 44ab6478 c484185c c3268823 42be3ac4 42a23f40 43447c20 c2f30aed 42fadd4b c4276d4d 4410bf94 c1df62d0 43544fa6 440f4100 44020d8a 4314af28 4257158f c47986c5 431be9f0 420d90d0 430cd3fb 43fc1558 440170ae 431e6c22 437fdbd6 c3511c30 c28abe50 c30a12f0 43617829 4471b5c4 c43514a4 c2d365d9 42e1d548 c4428364 c44f980f c33f4c95 4208fab0 c2adbcb0 441781cc 43168234 43636b38 444fd714 c4a5f7e2 c2791d14 42dd185a c44c9ee6 43509d90 433188e2 43231daf c445a9e1 447abb6c 4295475c 42327444 443344bc c4b641ca 41afa330 42b8fc94 c43a3b79 c44616b2 431147f4 41c46212 c385faec c30c6750 41f27040 4174788a c30043c0 c49f4284 c189ada0 4311a944 43e37a44 445814ac 428fe9a4 4310ef08 4403c658 447e11a0 428b3570 433b15bf c400c9b1 43140558 4240fc78 4381cf58 42c63c70 43be3e58 4027a980 43944177 4357e1d8 c48fda04 42396048 4297779d 43fc7b64 4431f824 4304c3da 429c64dc 447e1ae8 4474946c c280c48e 42cfdfda c25c2140 c4026cf9 431bc9cc 425829e8 c49149f6 c28fc340 431688a2 430c04d3 c48197ce c4510486 c1b44bf0 438789e2 c3f00b5c 44a697e6 43367884 4355ae76 43ace5ec c4ba9555 40db3600 436d5116 44a77e5c 4383aff0 c1ac04c8 42d9b153 c2f35140 c44a44e1 42ef94ac 43899505 44ab12bc c325d048 424a5efc 438030e8 bf587000 c3e0dda0 c3146841 412a21f5 43efcdf4 c2bb7e50 42c68e64 41d43d4c 443bdefc c4a5abfe 43056bb4 42df60a8 44018dc4 4421b208 431aadcc 435bfb21 4452d630 c48ae9fd 423fd5a4 437c8b8a c40f43ba 43259170 c2445d70 43869c3e 448e7212 4311dd10 4299ef3c 4384ed4e 44046c38 44ad3d9a c04911c0 4357cf61 438e3de8 438d1894 c21f1f88 43948861 446c7348 44aa3f56 c3370206 4251f4e7 c4385025 c2ef3e60 c33aa855 4385d2ef 443eae04 c497a70d 42867d28 4361b7aa c3ea957c c49f3942 c312b3d6 4379b932 44739fc8 445996f8 4181f5f8 438df4e9 44b14e7e c446a96d c3171186 42290c5a 444f3fec 44893a42 c23f4d5c 436eabb5 43463028 c48d0d42 42cca890 42034324 c40ab733 4494ce5e 432385a8 4379dd92 c49ad818 c29fb4e0 42036184 4380157b 4282ffe0 c20607e0 c3102670 436d6f96 448eb0f8 44a8363c 417752e0 4338561f 44768c64 43f84514 4319f16e 43735d8b c4a774ae c303f140 c3412cb9 43323e4d 4478bf88 44a1b640 c24fb5b0 42f5381f c49d9dc4 c43f5f68 c28e18e8 4340cf3f c3f05844 438627b4 c1e3d100 430b9203 c47a0d21 c41168b3 42bfa3dc 42dfd74c c45afec1 440fd194 c1f75fd0 43165b2f c497b0ae c3f2e632 c2d768c9 437a0d7e c401872e 44517500 4337ea58 43879465 c443bf30 44a92b04 c33de927 43818f12 448e684c c4008217 43462eec 425cc965 c494ccb9 c465a59e 42d754e8 42b4a87d c47a2924 41ddecc0 c1b1a088 42bcd295 426d1740 c4990e68 c1d166f8 43218e8e 449fbc76 42c87230 421ab910 42e5c82e c4af00ed 42c67560 c0c46560 431924a5 44165ebc 42fe7b20 c32f9843 42c23d74 c42136ce c36a8360 c22dcd64 42f56b8c 4340a408 435157a0 41d68840 437d00db c40e00ac 437b1940 c2c96691 4161e62e 449e78fe c484dcec c291f8f0 433402e9 44939744 44a4dfd6 c299977a 429c8f05 c3e8edb8 c33c76c8 433dd5a4 43569f7c c3da616c 43f54b90 430247fc 42dd128c 4480ffec 40b2ac00 c18edb60 432ca0da c489b410 c2bb7ee0 4344c792 4361f0d9 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000051 -> 3f3c5f55 bf244e9e 3e5d16b7 4326f049", + "440c98ac 448f077e c193b3e0 4390edcc c4580a3d c27c60d0 42b96456 43777f90 c336b3b0 431b0ccc 429103ab 44956768 43960834 42d0a9a8 429bf42d 44742ce0 44aae328 430b25ce 430bb34a 440b5534 c4aea8bb 432045fc 4361c856 c451b9fc 44b93a90 42f70aa8 423ce089 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> be4d58ef 3f7aaa98 3d02dd33 43cd6e51", + "429394e0 44a0969a 432d6ad4 c2bdc370 447d4dfc c2e5c182 42e3a8d1 441dfa60 443a1240 c2dbd07c 43415fa4 c36eaf98 444bef64 c2dc7496 438d0574 c48a5312 44a71884 4320bc66 435369d0 c402363c c4109501 40a70e00 424f21ea c417f6e0 c34bb618 c33f5ccc 43799755 c45c9362 c412aac1 42244810 42fdd2eb c4568f1c 43928b80 42a0ded8 4393dcb8 442f680c 43d5f248 c1dfe118 43670fcf 431011f0 448d237c c31a0732 428c6920 43b7f4b0 446c30a0 c2bbba90 42ac2697 44043088 44657ff8 c3244eda 41c02ecc 44989c60 c3468f28 c25e4694 433083ac 44a54c02 c4b7dfad c2b3936c 41a4295c 446d1bfc c3aa0e88 c30b256e 42ff9798 c484f7c4 447190c4 c2028ecc 43789852 c4a0f0c1 c4439e89 c2eca347 4317aa85 423a9ca0 c4872a72 c30d65d9 430c8115 c466c782 c411ea42 41093b60 4315e9e7 c479ee9e 444272e0 c30c07d3 42fbf109 c45596e9 4322f6c0 bfc37600 436c3b33 c445892a c48be98a c33636d2 435c04fd c3c7594c c39f5bb4 43327458 426337b9 44282d28 441c8d60 c32f2036 437228d2 c39b38e8 c32c3500 c2f6cc1c 4308c0b4 4398b218 439716dc 4151f1a0 43688c1a c41f84d4 449a2610 c23cf890 43424007 c20d44e0 445bcd48 4313cec8 41d3f6a1 c4457899 443d2d2c c2f7376d 43356b1a c4029241 43cf70c8 4209cbc0 438dde7d c464f7be c2700760 c3177055 423546af c465ef0a 44b5eaa4 42b49fa0 43163b57 c4408dde 4425ab60 c3259f7d 435c019b 434b48e0 441fa244 42ee7b50 433c3394 c4b36e50 442b9560 c0385500 42d0d288 4437c170 c3885228 c2d337ca 4330781b 42917380 4491f884 4329e030 4391f0a3 42551560 c2ad7960 c12245b0 4365e29c 4485ada0 c43d50ed c2ce1adf 42354993 c2781f40 c3857aa4 41ecbea0 42c34643 c46c0989 44956030 c22caa58 436886f2 441b5854 c484fd75 c08b4620 4321eb60 44aa4cc6 43657980 41dea828 43372ab3 c484f090 c4339335 c2f0ddb8 436dd239 c43ffc27 430e1d38 421c139c 42c46a9a c4a4d788 443e55ac 433a5204 4369ee28 c43e5072 c4013633 431312e0 42cdb4c7 c2b12460 44043a1c c311ef23 433b0bca c48173a7 c4680c61 c30fe422 437f88f2 c4b51c9d c2bc24e0 4312c310 42efc068 c395cbb4 c394c194 c340da71 438d7bc6 449690b6 448d91bc 42345e78 4336d041 c4a94088 c301aa18 43171c9c 438c220d 446b197c c42ca33c c2ce9452 430722de 44a2334a 43b3ddb0 4106f570 42f00ea4 c426be4f c4784c40 c332a581 42b52444 c33004f8 44ac275c c1b889f0 438f7597 c48e63bb c3dda1d8 42d6d810 436adc05 44075990 c4530029 43219cac 43494822 4430ef40 c4b24c97 43144436 42e9dcfb 44213d84 c42b2b10 c2b6c851 415f8ed2 445fe474 c45e971f 42eda148 43855269 44a84f56 441c9374 4325a7b8 42fa5510 44a7d550 c2160c60 c31f8473 429a1894 c3e4d4f0 443406f8 bcc92000 438da707 c34270d8 43ecc208 c11c11d0 4353f5ec 440d2ae8 c4951967 c2c6cfcf 43367df8 c3c95200 43768ce0 429c791c 4388a8ea 443aeef4 c4825dab 42838998 413b5ff7 449507c6 c4ac9e26 c1046f00 429e1b28 c47d787e 432c0ef8 c34592e3 430157b9 c339ada0 c3c0dabc 430320fa 4283ec42 c48f73e9 44019f5e c2964852 439566ef 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000049 -> 3f28686b bf0dd039 3f02a0d9 43029606", + "431a2768 447cda3c 4305f6fe 43615160 c402e4ee 429ce59c 438f0021 c45f5270 42664ee0 c2555f08 415d23ba c4b932a4 43ddd1f4 42ec2880 4378b105 c497c28c c3f9524a c299cada 42ab390c c432a1aa 44524b30 4317222a 434703a2 c4a37795 c43544bc c29290c5 42b341a6 c4a58e93 c287f440 429a5d7c 42b09f08 4415c944 c3aee5b4 43006756 4292e990 43a0e904 c459b246 c28e2740 43591f13 445463bc c42035d1 4337ebb4 41a88848 43d12248 c39879ac c1d9b3c0 435bd460 c4af4412 c3c327cc c33f2396 42d8a54c c4b9dad1 44305c4c c2bdc83c 42537fb2 c4a69bdf c38defdc 42b9a8bc 42cbbe0e c4b83e9b c36b6070 431d48fc 435c384e 4474ad4c c49745c9 c2953b0d 433e9805 44752738 43652668 c2e35c06 4385684f c4b7322d 438c5268 c10fb9b0 43927045 4470713c 447ec13c c3430f4f 434b1061 4474c164 438bdd38 c2ce6f75 4351b309 c3066f40 c3db21c0 c2bb7b0a 4390dcbf c48e4391 4401dfbe c306c214 428919d4 c28603c0 c4b96eef 42a46ca0 42e5c10e c3a03d54 c446d227 c2e675d8 43276aac c49baabd 4467ec4c 431eabf8 430e4f53 c481b6d0 c48847f4 c289f24a 430124b8 c435cbf1 c41f7fdf c28a3260 42914d1d c3a07674 c4a29fbd c0744f40 43027a26 c4704f9f c45d8de7 c2b83bd5 4312f951 447837c8 c3e2a8ac 3f57d800 425a4c6a c3821500 c4b6495a c2135a58 413baef4 449181ae c49009ce 42039f9c 4333d934 43bf9f6c c2b6cb50 42015c0c 416f63d0 44136c2c 44564940 415cf220 42ccca6c c4b19edd 44850dbc 42a5920c 437ba7dc c3e7220c 44a7a68a 42f7193c 43014902 4234a760 c41d6e56 c2fe5a2a 42816044 44ae72f8 4433b35c 42a97cb8 435f7033 c410a868 44363af8 c336d0a9 424a9fc0 442b8274 c405ccaa 41120f60 424c6132 4419cd50 44352d60 420d42d0 438ae7f8 c22e2a00 c29feb60 42af199c 42f871e3 43ff1b74 44a929e8 c1acde58 43928a98 43d4e580 43fd37f0 42f63c44 43113377 c45d3a5c 44ba3752 c068a840 433765fe 44a2b076 c39f78dc 4240c760 4385c80a 444141ac 44815224 42a7fd54 438f453f 4436107c c39e8168 420fe168 4356603b c3fc04aa 4343c4f8 c314b5a3 43394253 c3d3d474 449084bc 432a5636 41b0c308 4355a6a0 44582458 40ece6a0 416165e6 c41ac887 4430c8a0 c3225ff2 43431c2d 44a3313c 43664168 432e10c4 435e4f57 44780444 449f560e c2e9b488 42c89a4d c48e1808 44161af8 c305ac86 4343c86c 44458510 4446f6cc 4271c9f0 42b3ee25 c3d03bac 4434ecf4 4266a7c0 4200f144 42f38440 c45e6916 c31d0720 42cd6525 c4a0f980 c3186340 c33d510b 4250f3e2 448cb108 439f96a8 42173d9c 4182f4b6 443c1830 c4a09f10 c340a2ce 42688f91 c2f50130 44862eea 43159f4a 43000e78 c3d5eb04 446da1b4 c0d64a40 43490166 4424acf0 c4211773 c2b15258 4373b85b c4881928 c440ecea 4274aa98 432a314b c4992b02 c4b4fab4 c320e904 435e3366 c2b81250 43ad4688 42811854 42f142dd 44955208 c4a42aea c1cc2388 431f42a3 c493e4f4 c4858e42 431bef6a 43529691 44392810 c23297c0 42fd42bc 431bf924 4489b126 c44532eb 42af6de4 435be2c0 44252540 c319a098 4220207c 436dcd3e c476db9f c4516acf c34491a9 43416637 44aa0dae c4abb2d2 432c2a2a 435eafec 44b1bb64 c41ffcd0 429d57ec 437ea87e c463a8f9 c1b24d80 4063eec0 42bf3297 c3b30bf4 44afb686 41a9ada8 4330f527 c39cf0b4 4381ff3c c33060a5 43471112 c35d6df0 c4836a2e 42942ae8 4380e672 c4176c6b c3bd0778 c343630b 417f42fa c4b5b5f9 448cf12e c2e77f40 434e72fb c4a7625b 4463d8b4 41c3e338 41e344bb c456eb93 c480d658 42ae2f60 430f74a9 44585418 44b158fe c29a7a5a 42ed45c6 442b1f98 c363a538 c27b06d0 4363f8b9 44946992 c4b25d1f c22fc290 43336a61 c47db59a c3d71094 c2eb05e9 437322aa c3d69bbc c49f06ec c1cf0880 4337fde1 c428a31c 44041c90 430348d0 42cdf3d2 c4238b1e 44789e9c c2cec76f 4331489e c38af868 c1fae100 c25c5ba8 429e95b3 448a599a 43944bd4 4311680c 430d7241 44807f2c c40e0c7c c31578e6 4383ba48 c4afec46 c43411ec c3161826 4394b4af c22ba720 43bda7dc 40c8d4e0 435422aa 43925c7c 4440f988 42a53d70 42478385 4425d950 c48f570c c2fbf77b 422a4163 c4853b45 44b65c50 c322ef06 43870475 c46e0e55 4447b380 c27929c8 42ff9b7f 43f32170 c482cbc4 42ac34e0 432d3a7b c1a56c40 443db7f4 433880bc 41bb7a03 44a89a6a 4337f478 41dd1e18 4166bb34 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000066 -> 3f4c9fe6 befe52a3 bead24f7 41ddc055", + "c44e6d3d 4255b060 42c8f050 430585d0 44b3b98a 427015e8 436d11ac 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "4416cfa4 44a7a90c 42f30a10 c40f96f2 4485a2dc c2e1a6bc 42993213 440f8b38 c4308c0a 432640e4 435a60be c400426c c3f845d2 432478ba 438f292c c45e110a 44813b26 42ecd580 43497706 c46a1290 c47f23d0 419bb6c8 426cf727 4336b6a8 c41050c4 c30b7264 4308c6d2 43729b60 43cf2068 42e59a0c 435352dc 43b8d59c c33c0830 42557204 4390cad3 c4839cb8 4435690c c1b1e2a0 4221ad57 44764aec 4424f880 4313f87c 42c49b75 c496256d 4479a150 40509ec0 431b1fb7 44373e94 c3cd8bb8 c27f0bc0 424431a1 4484c110 c48d75d0 c339416d 42e3a2f1 c45f1d8d c43ffb41 c2f7bdf7 41247da3 4419bc34 445294cc 426e0bb8 41cbac4a c28663a0 c450f07d c321df13 43864a98 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf6088a3 3edd4aae be56977c 43cea604", + "446d76e8 44752b8c 43174746 440f5c80 4478e010 c14d2b30 42bc2268 c43fe03f c4a12dfc 42b67394 4371d5b0 43e26efc 4410a04c c2e1ae2f 42c08b09 43e48744 447f2808 3e386800 42fc448a c4287165 44442dd4 432200f8 4329f3aa c329abc0 c3962114 c334f434 41f5249c 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3e8a9773 3f6fa561 3e65eaf0 43ad8f02", + "42f673f0 44b4b12a c1350a90 44608260 445eec80 41bd5860 4384645a 442fd55c c47cda60 c2a73fab 432efc86 c4a1f5b9 44abe15a c3027715 43100e0a c45fd8c1 c4a73da6 c324d2ee 4306f477 443fdd48 4473efec c23e122c 43368340 c1d32000 c35efbd8 c2fb950c 43875313 4499ed66 44ab492e c2a7032a 436d6c60 c39adc24 c2a064e0 c2045d6c 42835aea 44b7f464 c46dca73 430ca4de 4386dcca 43ee17fc c3733b68 432729be 434e6e27 c459dde1 4478a83c c2ea287a 4372ef65 442d6118 c49a0335 c2ce79cc 42dc9da6 44ac60ce 43d2746c c32fae13 4127a0ab c1107600 c48601dd c315e330 42ecbb10 43a79070 43f0922c 433b3cb0 436b8724 448b5c4c 41a14c00 c30322f4 433680e0 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f7fc0b6 bc3c8e61 3d2dae05 4324f05a", + "c1949dc0 4464174c c2380ad0 c466bf4e 444c1ccc c2827b96 43889088 4418e514 c3abf5a8 427f74d0 4292a788 c3b08db4 c479497a 4300781c 43594efb 44a70124 44736854 42cd2a5c 43019d98 c37d1da8 4412403c 430b28ce 41d5c7e9 c28461c0 c422146a 434756e2 430cbd9e c486ea60 446549d0 42a23b78 434938b0 43a8b1cc c432635d 42c77624 433d19b5 c44f83e2 c485b26b 42d5ded8 4382e1d9 4427ed78 c4982303 42ea8124 43659cfc c2ce45e0 c48142d2 c2d87873 4318e6c1 c48467b5 c4a3f0c2 432a835e 434fd4d9 c37ce500 c46e389e c315d22f 42ba5ea2 43b9b87c 44acd916 42b39520 4388b96a 444d59e8 4490c666 42d5b17c 43873b09 4408ed6c c4bb6582 42297364 42335f4a c37520f8 c45e4fa0 c0587a40 43728adc c4a60c4c 44919d26 4296d9f0 42ce5e7f 4496b394 c499854b 421344d0 42cf2076 c4a711bf 41860ac0 c29cdf2c 4201c8aa 448e49c0 c4b3c526 c2cd0dd7 4306b9f8 c4883ca2 c2e11aa0 43458272 42ac2ef2 c3730298 448695e8 c3224264 437cf902 c4019c6b 44941ee6 c32a1cf8 4310f33b 43143110 c49286b7 c32a35f8 438dc893 4355d838 c48cd868 4247f494 4322f20a 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000001a -> 3c8f8659 3f5a382a bf05c6d1 43125f55", + "440e49a0 c4b47c1c 428190c8 c3933b38 4484bc4e c2b96d45 4332d349 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "44b54ae2 44aaed8c c2e826a0 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c393de28 c2d2eea0 4201a754 c4624468 445c76c8 430c4a78 43952681 c4b8eb51 c4b58a22 c3155226 436a3cfb 44a6f4f8 c34ea9e0 c25f1420 431cc639 443f444c c39c89e4 42ad0704 438cc2d9 c3fb2122 c49e6f22 c17c5770 43868eba c4b51184 c4b9a665 4302743e 42a84b73 43ce33f0 448d1b02 c20b956c 435789ba c3bda0a0 c48c519a c31888af 435eb8c0 c3ecd0d4 4435276c c1eaaeb8 435eb30b 43d69edc 44687c44 c2430dbc 432004ef c4415c0d 43c0ea78 43237f4a 437cc2a0 c450d08d c46d4d18 c2bd0d5b 42ae7699 c4ac6250 c44359de 427162d8 43845a72 443aee0c c3f6831a c256d7e4 4284289e 44af6e6a 438e91f0 c2655310 423f7f37 439ab388 c3762968 c2208df0 4377a063 c40caa31 43be944c c30666de 415e9094 44afde00 44b51076 c2a56ffc 43218dcf 4415902c 44a63954 427219c0 42f55a76 c4976dba 44b762f6 c33a5c26 430d9f51 43a8e510 c484955b 4286c104 42437f6b c2964c50 c442b9a2 4341b69a 413dfe84 c3ba46c4 c4480954 42d480e4 41bf7028 c30c1328 c43d61ca 4325ab60 437907aa c44b483d c499ff3c 411dcec0 433669bb c4b4261c c43b5969 c2a2216c 41d55548 44a75f90 c48b666a c3007292 4373bba8 440a4260 44b2f18a c3212016 4392ec89 4336d6f8 44970d00 40e67480 430e70ab 443b20b0 c42fcc16 c278e0b0 41f73a04 43d62784 c4806d02 425c44d8 435f59f4 c45417ed c43f1f73 c32c488f 430d0f0d c4b09757 44754dc4 c3082aaf 413fc78f c2d5c270 c3354858 c1d25870 42e6307e 4482ea50 43a674f8 c2f9d2bc 42dd139b c4a47169 c4714502 c28e4e1e 42fb3508 c4887696 445721ec c0a54920 4329a596 442c1d64 c2ff1950 c32a1ae1 4390afae 4437aadc c30e44e0 4334b406 4382001c 43a8cca4 4338ed60 43081ae0 4355560f c4a56263 442a3738 42dd8234 43814e02 446e3318 c4999f97 40b87b20 4234cb43 c2bcca20 c4812590 422c21d8 4248b293 c49e4b43 44baa9b2 c343c30f 4310b1af 447b8f38 c443b946 421f5aa8 4306ce52 44418fd4 42616be0 42b1f3d0 432fc415 443d402c c463d3e2 c2be6ec3 4156bc49 c2123a20 435895e8 42c7e3dc 42babacd 444b0818 c2214200 c2a9d545 42d6072a 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000031 -> be2a1e61 bf709f03 be98b114 431f9ab5", + "44a4d69c c4a904b0 c1d7a338 c3c96e3c c49cc2c3 41ec6898 43803c52 44a393b2 44908d30 42c5b2a0 430a2cbc c21873a0 c4b180b5 c24a6744 43907f27 c3872780 44a6275e 41809bb0 4134f1b8 c45d0a6a c49425c9 42423108 437a3ad1 40fb2500 43c856ec 431e8934 42ff552d c406e968 c3c643c0 42121d08 4357eac9 44040c50 c4a3dc14 c24f1760 4348d208 432181f0 c480464a c22c3570 4308ad10 c483c9f9 44264784 42fce738 42c83d82 42320b20 43517198 c347cae1 43283495 c3b973ec c402ef91 c25eb388 43279c56 4439a394 c3fef968 c2f3160a 42e4bead 44ac5fba c453f6a7 42d7da10 435e530e c46bc6c9 c478e6bc 413e9cc0 432ed4a7 c41a633b c4ad99f0 42d4bbf8 430508ae 43ea2314 44219f50 c212dd18 42a62369 43181f18 c494bbe4 430e6164 43163c7c c41e645a c40e0ac1 c2952ab6 438c4198 43c78fbc c3dfcb40 c33c3f5a 43953b38 c4b8dedc c4a98fc4 43390422 42dcb50c 44899640 c4b78059 429eab90 42d724ab c3a7d200 43f05314 c2c70dd2 4393299b c4670ede c43d307d c3415b37 43148dee 4463ec30 4364cab0 431bc71e 4349a6de 449c740a c492ae7e 43451c76 4344cd23 c29b9a70 441f6d44 c32b8ff4 434639b5 449770b2 447cc288 c3205ae6 437c1994 c48777f9 42d281b0 41c46210 42a2dcb6 c49f8dd1 c3706338 41b78a50 43452c99 c4b510c3 c4a09764 43118982 43861f06 44841296 448cd1e8 c2a6adef 41af4444 c41a7fba 447bd364 c3147028 41d3b901 c2e7d7c0 c3c53b04 c3290105 43873bce c4a6da72 c4083398 4314cad6 425b05a8 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000023 -> 3edbf83e 3f56a5b6 3eaba632 41917062", + "43f4cf70 c4678ece 42cce65c c37aef28 4480215e 427af0e8 43510caf 444ab8ac c3911f94 c2398ef0 4177bb2c c43ffce2 43d7907c 430a2e52 42a21a85 c4952471 445af630 421dac88 430410fb c4b03d06 c3d96c24 c32cc555 435759f9 c4ab9fd0 c3bdcc60 42d83098 430eb3cf 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f7f2644 3d27064b bd906429 44379733", + "44809fd0 42613980 c336d852 441a6504 44af73ee 425ea104 42c96315 c3ffeb72 c3407c20 c33a76e3 4342187d c3d9f8c8 428e3cd0 c1d7f270 436203cc c4ad4c88 c453fe16 42b3d7bc 429a94f5 43e5bc28 44a9c9fe 41294630 42b29792 442f0eec 449993a2 429b62e0 42e76ef2 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f32f4ef 3f365085 3d83e95c 43333958", + "c493981b 43912708 431c2502 c4b2cf98 436d1de0 426b66e8 437c7abd 43add228 42e4f0c0 428cab14 428ba8cc 44a219ea 444cacd4 c2663928 432dc3dd 4456944c 44038258 430489c8 43424fb5 44adb610 c4b9d347 c3098cda 41b9681f c44dd51e c4b7bb2d c2d1362f 4299363f c4292892 43fe6c84 42ed0eac 42b2b649 c4290c45 c2b59220 42f87e98 42f7e959 44ad65f4 c3414b20 c286c9d2 438dfa0d 44560af0 4499474c c1f9a2c0 434ef6cf c4a92313 c4b1da11 42b0b598 4278a660 c4773efb 441c8bac 4332ec10 429bd4df 4488152e 442bbcec 4317e844 431f25d8 44910940 c4b1bf12 433d798e 415ce139 c3ef2b76 c377a5f8 41c560d0 438e3558 44356058 c392b58c 432caebe 4310225b 44ad5b12 44adaf52 4223b2f0 42df4fba c3ea40ec 4491011a 430c1102 41ce6903 43776e50 c28a5f50 4346961c 4287e67f c41e209a c4a584fa c33043e3 432e0fa5 4426bba8 433a6350 c20ecb14 43283abe 4386f470 c418c377 401e68c0 438cc6a4 c2e4b590 c408345d 42269504 42e967b1 c3e56830 c291a7a0 432ef0c8 43459081 c4983de4 c4353bd9 c2e1eddb 428c29f4 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000019 -> bf3c3026 bf25d63e be4cb81f 42dda5e3", + "c3b04598 449db3d6 4339f11a 4473f5fc 44a1ef48 c21047a4 41948a9c 444d64e4 4427f7c4 c2ae72f6 42e3b4b2 44b9fb74 c44f08d8 c3001e20 4394c23e c3aade58 448bb5f0 4284c5fc 430e8594 43f8e3a0 4491bee4 c33dd340 42b7e328 c25548a0 441b91a4 c31d4c83 43267ae8 c3e17654 c493d29a c33bad33 437de5ca 44840f2a c2f42020 c315c875 434cd00f c3445d60 43fa3398 42d3c044 42e76763 c4975d2c 449890d4 42966b1c 433662fd c4055e5f c4b7d0af c26e39a0 42a606d8 44413bf0 43e90064 42a658f8 42f3c28f 431add98 443ba7d4 c1be6f08 43575a53 4488d8bc 44113bc8 c2257424 4230b681 4473ce08 448ad6e6 428fe1a8 434bbc39 4410dc84 c3314340 40187680 4325a02d c496987e 41be8240 41b61010 435a97d7 c4930c30 c414e45b c25f069c 43662267 c460869f c34effe0 433827dc 4312fefd c3d786b8 44851e54 42e18d84 43535d1a c3993130 43d985f0 c2a879fb 421e433c c4b470ff c377b658 42f57994 4360dc72 c42c57c3 43dc3fcc 417c43d0 429726ef c44cc1e5 c4b402d8 432083ec 4384c879 4139ca80 446bda10 c30aa812 42a4d49b c49695c9 44b73e30 c2b1a9fa 42a51576 c3a59a2c 44080dd4 403f8340 4307d687 442ef10c 449f125e 42d13b6c 4391a9c2 c49a6370 44b60f74 c2b7db00 41bfab2a c482af3a c38ffe14 40e40fc0 434f7c20 4416d214 446cfee4 c1a2f418 430fb3a1 44448bb8 c489117a 414d66b0 42799154 42b24560 c49dd3db 433b696c 432722b6 441737c8 42c16640 421977ec 4300accd c3c75b58 c4acc70e 42a9e1b4 42d7b3c3 4499bb08 c3be9ee8 c344f129 42dcb0cb 44907c1a 434ffa40 c310de8b 42a0114c 443b57a0 44846eea 42b7cdc4 421bd81b c41882e2 c2a5bde0 419b9038 42b7d183 42ed6cb0 446da8ec c09887c0 42a7f751 c483821c c401e2b8 4321af56 4347b289 44aadf88 c4523ae6 c2b93a09 432b4237 c3a5a29c 44875bd4 4290d47c 422a3538 440fbd60 c46fb33f 42d8d3c8 42d2575f 44674310 c494da5c 41f26468 4283c950 44ba3f28 c41d0d28 c1dd3598 434e338e c3e1f138 448a3fba c2cbd807 4298f6ac 44b55b7e c40be553 4313dc82 43299003 43198768 c3004928 c2f983da 43331b80 c2bbc1c0 c3dbb9e0 c22f6dfc 434b061b c4155b07 43754990 430cc488 4385e17d c475e964 43b04280 c212dc18 422eda2b 441701b8 c451abbb c125c8c0 430896a6 c442269b c4197d1a c2c13c33 4381836f 44947aec c44c4217 c29c31bc 420ceaea 44b1efd2 c4accaf7 41e7d2a0 420047ee 44b83d18 c48a711a 41c36e10 429bf5ed 44b89c30 c46a123e 430fc978 430de6d4 441f86d8 4499ce36 431cc016 430251d6 c337f698 42fc3bc0 3fe34380 435e3dae c2ed4b00 c48b2572 413297f0 4367528b 447e8834 c3489360 c298bbb8 42a86151 c461e9d9 c3ffe91a 4295bee0 429fcf51 c4a93727 c4137b2a 4298e194 42abc054 c4b8017e 444edc78 431f0314 41afce71 c4a65647 c474a6d4 c3166aaa 431ee596 c3d08af8 c4b446c3 42b30c3c 42d3f889 c390ca88 4480d5d0 c1ffe3e8 42e14449 442769ac 435aacf0 424a7990 437f35fe 4207c460 4467f2a8 c2d29e0e 432bddec 44714dc8 c4121124 c339bf32 434a3dbd 400ad200 43b19fc0 c21647e4 4300b5ae c452b70c 43c35a8c c2171364 434a3b05 43d8c364 c2dd2480 428c5834 42ba424c c4b9a172 c4b61315 c21c7710 4377d533 441cffb4 44b34986 430cf12e 42e20748 4499826e c3fa16dc 40e447e0 4314005e 44049bd8 4481947a 42c842d0 42880802 42ea8530 c3f0f286 c2e05aa6 4363d863 c487b02b c2e9a750 c342ea0e 43615751 43a9c858 c40b2689 c31b3998 436a3d1a c33a0d20 4440e0b4 42a784fc 42aad7ce 44950c44 c3f028f0 43083a5a 431a15da c38b6b10 c37a2798 430b8830 437ea7c7 c30d5568 44074efe 42cad560 426a3db7 c495c82b 44a153ec 42ba0690 42eca14a 448e7752 c45cdb72 c3167d35 42c4fb3f c4404f95 449f170e c30c9ac8 4327bd28 c4bad7a8 43ef7b14 c2ea75d0 42f905ac 44894f84 c49dd4a0 4326e53a 425889da 43b9cfcc c435ae03 41fae610 42d769a2 c4b9a23c c438e3cf 42ea6648 42361129 c1e31340 c3ba1f70 c2a15bcd 430ebf9f 441ba30c 44817972 42632880 43501080 4375cd48 4432d400 431d54b6 429ad38a 43c816f0 c38f9c90 c3416792 43921df7 c4677241 c4188499 bffb4400 4362bf06 c459bb72 c30a1b88 433efdb6 42ecc96a 44456130 439807c8 418b7070 437e6b0d c3de4c30 c39c9458 c2525cd8 433faa1e c38336a8 c4bb02a7 42fbae78 4382cfd0 43bce854 440f0d1c 43069086 425d86d2 c4b4deb8 428fa9a0 42fa5870 423c28f1 c46ba814 440a95a4 40f09440 42936083 c4420bd3 439dc700 c30dcb6e 43576ab8 4441ca70 c4aa6686 43251cca 41a4da42 c39856dc 449f3306 429baa1c 422325f3 c414bb73 44605d4c c2870e7a 428010d4 c3c320f0 c42ed39f 42fff2a8 43414e2b 43867c50 c483b12a c274590c 431b31bd c2ee9ca0 c3f21814 42b7c6cc 4350ddd4 43d38c6c 44832858 c2f99de5 4202efc0 c49c8a67 c40407d5 42227aac 436284d3 c43b6cbd 43f048b4 43133778 42e8d11d c49a4da6 44508548 c144f2a0 43556873 44ba0ed2 442cafd0 430deb52 4292bef3 c4666d37 43bdead8 42ce3f78 438a3d53 4488d112 449103f6 424feefc 42133e1e c43592c2 43d943e4 c2c98495 4303bcbe c40a1769 c44cb95b c22721f8 43291e84 44316a10 43ae47d4 c33e8ef4 4392c562 c462cc34 437db010 432e7cec 4357d1fa c397b740 c30cf8e8 418b66b8 43755f62 4406b21a 43dad044 3fe73280 435db1e3 c2425460 420651c0 c033a880 4162e988 c4990568 c42d2f91 c2e52925 428597de 44118028 41da6000 c09074a0 43398645 c383deb8 c31b39e0 c33394bc 4381ea81 00000080 -> bf0348de bf58c126 3e11354a 41612fc4", + "43e6b3f4 44a1a086 c341b02c 448d666e c4b3a744 422d1f80 435236ad c4a977d8 427072c0 c20d104c 42db062c 446ebf24 c382b734 42333e1c 424ac7c3 425971c0 44a37de0 42f3bf74 435ee00f c3b25168 c301c538 c1503650 42fd87af 4475d0b0 c42233c3 4296cda8 42172f15 c3fd8e2e c417c574 43343d40 42fd2346 44088e02 c3549150 42cf3e54 434f7f04 c48ccb5e c4b2bfa1 422ac844 43182d91 44904ae6 c403fa6a c33674dd 43633957 44624910 448443b8 431644cc 4217a43a 448d4206 c2d26d10 431d9626 431e8fad c43e3a5d c48bb602 c3477451 43108046 c0faca00 44b2ff9e 43178e7e 4336114e c3fb5eaa 42143ea0 c260ea0c 4363a129 43505158 c4b7cc25 4280db90 42f5ba25 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf758100 3e902d1a bd03195f 42ac9cfe", + "4423d060 439762d8 433e04ee c40b3027 4482fa24 c33129c1 4301bc8a 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c46db816 44a1fae4 c2b177cb c452a134 44894344 c21a1ffc 43091cba c481267f 4323e820 c1e71a90 42bf3fd7 c46d4659 c4844afc c30e38c3 415e2fe4 c4804e84 c3bf5c38 4339d718 42be2dd3 c4704b12 445ae15c c2f6b17d 431714ce c32cad80 44a72182 c1a2b8c8 42fb86b9 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3ee44ad6 3f561fd4 3ea32fa3 4362917c", + "44513a0c c3b96464 43218990 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "443b8648 c3fe0cc8 41ce1c80 c41b1ae4 c19e8800 c2752910 424019c2 4484da58 c4939619 43388fd6 42e3f4ad 44398764 448a35d4 c26f75c8 42cb2f69 c480c990 c28aecd0 c32300d9 42329684 42e8db90 4467d014 42e2bb58 438aa0bb c4835136 c429e439 c204fc10 4134d3e1 c4378adb c44f42c8 c2b2d2d8 431637a6 c43fbdb8 c38f00c8 42d8a6a4 429f8ca0 447617e0 c376edf8 c3284e85 4312a655 44a77d30 c4a9512c 432f06be 420ad411 42967eb0 c49c09f4 c2f159fc 43325ee9 c4a92ecf 4489b3a6 42dc4dc8 437261f1 4483eae4 44a1ca3c c2cfdf5e 432e85f2 c48e56da c4313853 42108a6c 417b7a9a c49ecf0d c3ec9228 43165678 4340e166 44777978 c2849f00 c31a5200 42dac529 c496d84a c492596c c09d48c0 43604639 c39994c4 43b5edb8 c302ddb0 4318317e 448b51b6 4414a9d8 c2259e28 41e8f1d4 c49f4fee 447c38d0 433641d6 42f514f2 c31b2ec8 c29517c0 4252c3d0 42c97c2d c47b9efc c45e6180 c317ee38 432dae5f 4475839c c4a52e47 c2287c80 4339430a c4758479 c410cad4 c2c3d0b8 41bd78b8 44b022ec 448559ee c0dba000 438d2bc9 c3b4c2e4 c4adcfbb c21a11c0 4299afce 4441f424 443b60cc 429ca498 430470ec 4489b4e8 42927b30 4331d1b4 429f52fa c3aa0910 c212bb80 c2fe1ec0 42e1cae6 4481d02a 4461f870 c300b822 4386aabd 44b795e8 449ebc46 43249c24 42d8184b c44d0ec7 434d7388 c291db72 432db9fe c32b09f8 c3e20bb4 c3218253 429358d9 c3dbd1a0 c4b54ce4 c3449173 430169c7 c4a0b553 c3942644 41adc2e0 430240f0 41b88640 441478e4 429dc28c 42c3b455 c49062e0 c48191ba c2e1d55d 43509cd3 c48cc700 449627f2 c2ef2f98 426b5901 44050d1c 4384e168 4333d1d4 430e4c24 c48ca21b c4a2e53f c3467029 4282452e c34b85e0 c48a49fa 433fb080 43203200 c3577100 4428bcec 431ab438 42eaaa09 c279b000 444aef68 c2ad4dc7 430b07f4 c43dc13d 4445a68c c2357e78 42bd208e c44d6dda 43a2e10c c2dd8014 41f74a2d c3dfd62c 43c7360c c1c00ff8 43275876 c483e49e 44a06f1e 4186eb58 4367cfbb c4a2619a 431d2510 c2aa9116 413b1023 c39a01a8 c3cbbb24 434100e6 42ee58a5 44240df0 c4708946 4315e6a6 42f63120 c42e355b 4482595c c2eb7514 42e153ed 43af91a0 44400fec 43289058 438982c3 c45f7c05 43eced00 c2d7eacc 431fc0f0 44806eca 44a1ec84 4307bcfa 4371cfdc 440f6fc8 c33e0aa8 c25097b0 431b1ae2 c46de23a c48dca49 c29d7f83 438b633b c2428940 c426d8c4 c334f52e 43850210 4452c4dc c4b7b5b6 41e92650 41bc9916 442f6010 4479da9c 42f38228 431bebf2 c35a9cd8 c49b432b 432a35c2 42f77a33 c4b91835 43c0712c 41c91bc0 43009e99 c4054a9f 444accbc c306a974 43110119 429500d0 c46da1d2 42942b0c 42b79c34 44683dd4 c3bc6a18 c2ea44c0 42512974 43056910 c425d980 43141706 42d8ea2e 441c5ba4 c4ad06d7 c312dcf4 42834f54 c49b973f c46d878a 42e20bf0 414b60de c48bb880 c3f5bfbc c24c71ac 43398822 42058880 44b30906 c01af140 432ad016 433123b8 4493c914 422740c4 4358e201 c490ad85 43763890 c2633b3c 433761bb c40353c7 c41ceb9e c2d246d7 42e47a24 43bcf620 43edd59c 43377bb2 4253fbdc c4553181 43810678 4292fae4 43915572 c15a4800 c3c199d0 c28cd8c2 424938ae 44b6f0c4 c481c059 c28180ea 42816d34 44693378 c49d86e3 42d8c458 437b589b 448eaa82 43e4f4b8 420ada38 43469be1 4402c024 c480afc4 c2dbbf58 423aa0d4 44077614 42d1d830 4312ce7e 43705a32 44a74d6e c366a7b0 c23a99cc 4311f7cf c3b7cf9c c44f0792 c230bc84 438b241e c41ab928 429cc550 c3305ec4 42811b20 43527578 c2ceb480 42b4702c 43903a7b c4400902 c47803bc 42e58bf8 42a214f5 426dc4e0 c38e9c60 c1066590 43922245 c4a095bd c40fc02a c126dca0 41d8a9af c3d0f2c4 432bf6d8 c2aa3c9a 439044f5 413bfa80 42b1bd50 c2f5b98c 432dc548 444af768 448a797a 42f8f73c 433438f6 440eca98 4481b164 41769080 42e18099 438c5814 c397ff1c c327e934 428d1862 c34e22c8 c430290a 4318faf0 431e4700 443a07d0 43b71260 c2b46586 4326f3b8 44a68afe c386f19c c224ab60 41f05fd5 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005f -> 3f5faba9 beeb3a65 be23adcf 4268fd03", + "c47e624a c468d1be c2487fec c49686c4 440a25ec c337c9c3 42b22b42 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "4323bda8 44027984 43128f66 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c3d87158 c3d2f750 c31d0f72 4401d412 c44beae9 c2bbe2bb 43400263 c497a82c 44032734 42dcb8ec 428f36bf 448f335c c437a929 42729bb8 433dfa39 c3d11f98 c2a6e5c0 42c1aa0c 437cb688 c3d25e08 c423ebe5 42f1b744 422dda35 c1719b80 4420da88 c3381f72 438cbb48 c42c2668 c49f2ba6 4046bb00 4259b49f 43103e80 c4a2331d 4220dc60 434db228 446f923c c4b026bb 42b32e80 437de51a c23552a0 441842e4 c1477fd0 41deb40f c2dddf10 4490cf38 42f1dd00 436dc4e4 43b59ccc 42f141f0 43039890 4387dcf2 43ae0a28 c3cd7920 c2f423d0 42f7aa97 c4a36778 c4b80391 4319ec50 43900076 c469aff3 c40033e0 c2648ea4 417cf7d4 c479ab46 43b81010 42837c2c 43762d1f 43e7df14 44b2ce66 42f0f260 42d39616 443a27b0 44966612 c26cb7a4 43487462 446a7514 443479e0 4273ca28 433a8de8 449a8daa c43849d0 c293ff05 435dc648 c43e155b 439de370 416de020 427eac74 448bbdac c45afe1d 4230e48c 4374f036 c484f447 4447020c 42742900 425cc248 c3e73480 c3199fc0 431dc2c6 437db0d6 c450a5f9 44b6f91e c313ab08 4344d5bd 44334504 c07f9c00 c30a47f6 435956de c4b7633d 42e482a0 41ffbd20 42cfb336 c3d69bc8 c4280009 c335675a 438c7315 c4b63a66 43be5790 42dac8dc 432cefab c49b6c1d c2787c80 4330b410 430b8170 c3c89cac 44b824ee c2fc1b80 439383dd c43ca712 c463d4cd c2974c6e 42e703ab 4481d656 446a0aac c234ca74 438b02d3 c48d3490 44000f52 43447e0c 4362e31c c3131d70 4471a754 c3025c72 42d60b15 43c02320 c41fcc0e c195bee0 43831232 442423d8 4423d95c c30f4aed 435a803a 44037bc0 c3fb2b9a 42cbd164 436153e6 c4aa2fb0 440a31a8 c2b199ab 4362e9a5 c40ba5d4 c4766c8d c1566670 43764664 c44c9805 c454ecb0 c110b750 4328034d 4491df6e c48da571 42f88bb8 42db1ef4 43cb7ee8 c4b1e6f9 c31ba523 42acbc15 c4121a73 43a0cd34 42fec8a4 4204034d 42e314b0 c40a7144 c2bccae7 4323b309 c4a71428 4389dcc8 4296ce24 431ef792 c4a604d1 43d8be98 431737b8 43095dc0 c3a0e13c c4408ed3 c1d2ee98 42b6202d 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000030 -> 3d5b292f bf55ea21 bf0bf5e3 42c6e19b", + "c28494f0 4418d320 bf407d00 44991fea 44b42c50 421a85d0 4388a0e9 445fd7a0 c49c42bf 426f8c28 429490f0 c1cd8480 c33c0ef8 c1c34cb0 438289b8 c461fdc8 c459676f 43475b70 438893a2 44a3b036 444336a0 42587ad8 43230095 44ade406 c214ef00 c2cc66dd 42a1a7a6 c3c0c474 44a8f642 c22c25cc 433589b9 4478852c 4498dc8e 433255fa 431af500 c38c4448 c42cabb4 424f3914 42d64526 43fb2620 43b75268 c2c33321 431d7ebb c4acf439 c41bfd5d 41d2b558 428c2a74 c336c638 435c3e90 c2f4bec3 419cdb7d c340ed70 c3bfd8f4 c201469c 4337bb0f c2a7b470 44902618 430a5612 43040401 4430f90c c3dd7bd8 41684940 437fe372 440f2c38 c4a5ac23 c22f82e0 43334dc1 c1cc9e80 44a4ab3e c1824580 438bb0fc 4371d740 43f52aac c2d0017a 42ca496c 414da500 c48bfd26 c08f4ce0 434ccaa0 449e2748 c4ad81bc 42f42038 437170fc 44405f58 c3d314a8 c309ac16 430f2f5d c20adc80 c3e5d904 c33ce103 4321681d c3643450 c45a6c03 421e601c 42cac054 c49b47b0 c389d61c 42fe2a4c 43932f38 4496a3fe 44b4c3e0 42ac910c 431afce5 c490b408 c43020c3 c197f410 4369f392 c489f58d c4942828 c32215cb 42dc4dfd c39c9c9c c4746408 becc9200 43549bac 430d8f80 4432aa74 c3237131 42d45690 4496e532 44a1a480 c321d952 424fdbe6 449a3e30 44a3f306 3ffeab80 42ebab39 c4a353dd 449f56d2 c2d94e4c 4217902b c40f41f3 41c55540 42d7fd40 438d41bd c405cb75 c41219c4 429328bc 43187ca1 4498896e c3aea3f0 c28a47ba 42f2700a c43a03a3 4408d65e c315666a 42a4e041 441d53c8 44962044 42d6523c 42ddaa51 c40976d3 c226ee60 c328b8d5 4391bef4 4490ff9e 435501b8 420dd478 42753c1b 4443243c c49d3f82 42a63ab4 428c2db8 448d348c 44bafac2 c339746e 4385ab2c c38fc2e8 4331e5a8 c244bbc8 42a05a56 c4a725df 43961750 c1f078c8 432074c8 439bd878 441ee600 431d170a 4298bdd2 44690610 c4379bf1 4281a894 42666229 c4809fba 448ec038 42df918c 4378a427 c351eb10 44607e70 c332c8c5 4363ace6 44226aa4 41a88980 42b8ea88 43799128 4403d702 c48e8540 40325340 42a6f43b 43db2154 c443a70e 430a4036 42568bc1 428bc470 429b7ba0 c2a5423d 4359d460 c4a4894b 43322448 c2552d50 4272c40c 4405b53e c3d254d4 c25608e4 431c7344 c3743440 4302fd28 c333eb5a 43956702 c452a2ef c456e741 c18880e0 433966e0 41963b80 43bda7c0 4122c440 4328b3d3 448a57e4 4394239c 4309360e 43165893 c45d5371 43d108b0 420471c8 432fc13c c387a8b0 420b3b00 42615398 4341040c 4382dd0c c4a3f289 42d154d8 43833e67 c34a5150 448dd728 c32b11ac 42e2ee26 c486b3c4 c44d644c c214023c 42414365 c4a1589b 42050c80 c33a501d 4307760d 44535724 c44267b8 4266bcd0 43870b5c c4bb51c5 4438a1f0 430b1864 43101e4e 442243b8 448f8e02 433bf5b2 41aa4c2a 444fc040 445cfeb4 c321d2ec 438883b2 4497100e c372a978 c2122ea8 425d5c0d c3109b28 43820b4c c303173a 43402017 43225400 c478820e c215abc0 43446756 c4678d26 441e2da8 c2094464 4353348e 439db51c c483314a 42e7d32c 426bc538 4489c598 4436fa80 4250f8cc 437de8b4 c455b2cf c4169c12 c30a484e 43296d4d 449920d2 c4aef904 41ff47b8 42dcc201 c48a7c69 3fbf6400 c2d8917c 4346aeda c49514ad 448db3d4 434054a6 42852722 c4a1ce16 c4b56d84 c27b9a44 437b3abc c3f06b1a c45d4658 c2b707ba 413947ba c2bc5f50 c427ef19 c1d3e4f0 433fc933 c4b9aba2 44a00092 c3382880 426047d0 44586100 434ab630 433082a4 42590752 c34acb20 43b7c99c 42afbdc4 43210102 43855244 c4a4e122 409a75a0 4352527f c25c9f60 4445aec8 42122d10 435ce82a c478014c 438e08f4 c31fe6a5 43806c82 c3942a60 4460161c 3f09ad00 414edf3b c4b1026a c483aed3 c3278ae8 43415a87 43956f44 44a9d8fe c27dfdcc 428a5697 c2eaa2f0 c4a116ff 4310d9ae 43251d8c 44a3b95a 4476296c 42d226b4 430b56aa c4189cee 447188a8 c2cda4ee 42b60d40 4410acc4 43715668 411888f0 43567541 440a8bc4 441ae370 c187ee60 4300f46c 4474d19c c469b227 42ce1c94 43948288 c4a2aa4c 44a1b0b6 c3162546 42b8767c 42f84a10 c49ab76d 43286e9c 43426d39 44244cb4 c40ff924 c2d81a1d 43013e92 44968b50 c4a651fd 42e888c0 42d9d822 44790030 43e7610c 41aefc58 4331f62a 432782f0 c4508a94 c2923d0c 430bc88d 43bb84a0 c3b9d380 433302a6 43868011 c15c8980 44a1a662 c243d468 42b20b17 c40c68c8 448ba6a2 c1489c20 41392a15 4418af50 c27a6960 4321d868 428d462e 44965ca2 43a07c74 41c11118 42f3389f c3e023d4 c49141fe 42f2dc78 4340312f 449bf19e c48fd893 41fa3380 426fb84a 43c89568 c471275d c1d39060 437ed76e 43aaf54c 4404d48e 427dabd8 4267b548 c48709e9 c4b10266 c30fc7d7 436e8519 44a16936 44ab84de c320a3d6 4193649e 4383bca4 4455eeec 425c0cb8 42e0a9ef 443b3ac0 c3e79d90 428e9204 438e952e 43f26ad0 44a2206e c32137be 431e960f 43599e48 c4078ac9 433ee6ea 42efd127 c3dcaea0 c45ceca6 425e0694 4243d170 c3387390 43ba8f6c c22dad94 418d6aac 447070dc 443382c4 c32c5246 43839562 c2c958a0 444c4010 c191cf00 42f80cc1 c4b62865 444de554 c337d492 423f80b1 c27d71c0 c44e02b3 c1f7e500 42bb1df3 3f3ef800 c2338580 c2fddd42 434fac88 43707450 c484aede 42145ca4 4377facd c4a87ae2 44442a4c c1cf9cd0 435c3fa4 c408095a 44ae071c 4210da20 4390b34e c39f4f70 43a69668 414e98e0 414fc0c6 c427b484 4464ead8 c0e13a40 4385f1fe 00000080 -> be34c21c 3f7b76c4 3d80f22f 426443a0", + "c3e00ccc 43c91db0 433563fa 4481fe54 44960b0e c314f9ec 436d0a94 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "4425219c 430cd120 41b0b900 c3210940 4402ce98 c30d59f4 42a42cb4 4471b3d4 4419aaa0 c2823ada 435d8999 c49f8926 c4a8af81 c2fccdc9 420149ea 44319c08 4489eed8 429a6e48 43018ccc c4b71900 441244e8 c346f218 42be2ad1 c45e3399 448d24fa 426ce4a8 4370779b 42fa9980 c45df26c 4310934c 42c662c5 44a5c906 44af7e86 c28800aa 4342bf0e 42827ba0 4409fb6c c3061aed 43816430 44886054 c4b111a5 43412e68 436b7abe 431c3210 443a58f8 424eb63c 430be7b0 43ab0658 c45f970a c31c10ba 419aebfc c3446ff0 c3c202a8 c280e28e 438d299a 44a910b0 c483e20b 401bcb40 432f480f c4b19e4b c3de23b0 42a572c4 433d471b 4480cb3a c4b06184 42e5e060 4223a400 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f7ea43c 3d8dc218 3d9be2ea 42e0ffe9", + "44b780e0 c39cc9d0 4267c958 447b6010 4311b6c0 434191c0 43588040 c44e28e1 4434feb8 c18f2498 42a35ecd c460eae9 c46f79fd c280173c 42154fc1 4476dbc0 448be3ec 41e496f0 43406fb4 c3a39520 440ba96c c24a80f8 42765a5e 438e338c 4478a3e8 40969120 42ce2ef2 c3cade70 44a2c642 410f7390 43905cb1 4287a620 442ad478 c32d2b42 4345879b c4a61ffb c40017bf 421ef75c 437867d8 c3d98b60 c44cc3f4 42b4937c 43000698 c4a8717d c404f0c7 43027f1a 426e9a40 c3c79d40 428fca50 c3424719 425daaea c4551106 c2870650 c2889dac 4381ce0c c46ea830 448c9ad0 c31cafc9 4130eba3 c4adb267 43f46058 c2744a6c 42bccfe3 c452d0d3 c18c6640 42b3aa64 4312fa44 c490e470 4410ec9c c3391b40 431afb2b c429bc1a 443b0268 c2b4b420 42663337 44acaf94 44aeeb2e c3152bc2 42b1cab8 c4b98536 c3ef2b4a 4335a1fe 437dd42c 449d68e8 c3c94b2c 42c42a48 41b8a91a c3982f64 c45c3bfa c160dfb0 427b2ed8 c4514e27 438f8f94 42e43960 4352b201 448e5f78 c3440168 c2f98aa6 432b6f05 43933ef0 c3db2494 c330f6ec 434d5eda c21f39a0 422c72e0 43192b52 43114dd2 c45e77ec c47b0d36 43201750 4290e5d2 4439e7a8 447c2bdc 434758d8 4353e9ed 441ca070 419cb440 c24ded40 4380b360 443ab52c 44069a2e c32a7b91 43888db8 c44bb92c 4485313c c2b0cb08 434e9d37 44ae064e 437633f8 c2ac8e73 43227dae 4450c858 435336f8 428b1ce4 4346e608 c422c6a9 c424b505 c26981f4 42ff201e c24d6d00 c42604ee 4308b1dc 429b4d39 c41167af c43bdbab c1d29ee8 42f31ff1 43920270 c49a1d86 43414972 42ec6a9b c4a3bc93 c3f78d7a 42f62de8 438a35ee c424ea99 c483210a c1aef7c0 43412664 c4467a79 c45d4ae0 3f7ffa00 433e2de3 448edc2c c3bc679c c1c9b6f8 4275dd03 c47d3f3a c3e58294 c20abccc 43063fc3 c48252ba 44aeb714 c24fa30c 43126344 447d4cb4 447f62cc 4221d2bc 4392eec6 c36d0128 4493ddd6 c327be75 4383e17c 43944690 449a3092 c1703ea0 430a96e6 444502b0 443f65cc c24dfab8 4241dd98 447b4d0c 4426e12c c303fd46 42b53435 444f1b1c c451ad9a c26c4a4c 438c19cf 446a6b38 c436772c c2de1c91 42a5336f 4403cd74 43245100 c2df78cc 42190e4e 44ae46d8 c3f3de1c c3279d8e 43097bac 43138c98 c2c92480 c2e78eb8 42d9cf4f c48ce2e2 43bf3098 c33f0460 43919e82 449a79c4 44b91504 c20856f4 4300121c 44b2661e c42483e9 42156744 4306b0a4 445de90c c498e43f 429b5440 433d04a0 c20da5e0 43fe1d54 c3057c1e 42669255 4400f672 4477b860 c2f08eb6 41b642fc 440ee264 c3ca8014 c1087ca0 4305533c 4402ad38 44a1dff0 4205891c 42e9c880 420f6f60 4476bb3c c30a8bd3 42547867 c4628566 c3b03408 c3401505 43778304 448038ca 446c6a3c c2b44ea4 42f92707 44ad05ec 445a0560 c29ebc1c 4383814d 43d6e3e8 c2da0dc0 43348f74 43849130 c415dbd9 c4aa2658 428747ec 42be868e c35787a8 44b36462 c2b0947c 43289c7a 42328a60 44b792c0 42ba52f0 41b63aba 4413e3d4 c44e6934 4327347c 43913386 44a47ed8 430870c0 c20111b8 42229238 43e06c24 c3e513c8 c28e1c7c 438139d3 43270870 446428d8 c326ed3b 4387793d c4a3b7d8 439f566c 42e19960 428e2298 44b41974 4418c3c4 c32ca37d 43110c82 c47f182e 4486dbfc 42b06b70 42935d27 c494c767 c2a2d7f0 c29cb2a3 438098f4 c49ca1c2 c44a1618 429e52b8 435f9de6 448bc17a c3f7fc50 432d8488 42196cc2 c4aae0b6 4481a6aa c2d7df8d 438f2be4 4427ee04 446a4738 42beaa64 433ef19a 449462ca c3b4d078 c0d2fb80 4388c136 c45b5a4c 4285f690 c32e7af4 43950ebb c480db54 c30f04f8 42f59ffc 4203aca9 4473b774 c4613222 c347095c 42750952 c4ab5136 c2b43650 42db883c 42d092b7 c493a259 c3e6e3b4 c33d254c 435d55ce 440152b8 440a2a08 c3057fd0 42440dbe c29ed540 c490304c 42c16c6c 42dd8d42 c48e03e2 c4974842 c28ce1dc 435be6d9 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005a -> bf3628c0 3eddcf90 3f0d9cbd 42c45f82", + "44194d7c 4370aed0 c1fedd08 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c1d067c0 c3602288 c2e6fdf6 c42a61b1 4481385a 430954bc 41cbe512 4499a83c c4388b32 c338d153 4301d468 42539f00 4314ddb0 c26c492c 4364e27f c445d54a 428bdd60 c2664788 438bbe83 426fab20 c4ac2b09 42a87020 430f435e 44aba6bc 442b47fc 43165630 42b597f1 c46a70af 43dd84f4 43020a0a 42905e2c c4801c1f c3932460 42d4ad48 4339f764 c4602d63 446e3fec c20dc4dc 42ce90ca c41c994d c36fa010 c2eb6788 43177912 c40ed6eb 441c10b4 41fca028 436a8a31 c3c0c88c c447130c c3084c98 42350136 c45e10ce c444e371 c2fc747f 432668cb 441d5b14 c4a1f4c5 431ecfa4 4327e3f1 44afc78e 43422760 4312655c 42ac0095 c3557818 4472a578 c2c4225d 422e3f22 4454d4fc 443827d4 41abc510 4303619d c4918806 c4ae9897 425ce8f0 421bd2b5 447b5b00 c44ff7b8 c30c01f8 42a4cc02 c48376c7 c495699c 4322da4c 438f29a1 c20adea0 4418a81c c343cb47 438a877f c453e4fa c44d1f54 431eca06 424241b9 449dbd4c 44899ab4 c26b5430 435cae24 432267c0 44a66078 c3306702 4316f20a c30c3c50 c2dcb4b0 4344331e 433f8590 4407aac6 44348598 c34424ed 426c9f4b 43951ec0 c49bc7f7 42a35c90 43174226 449ccd14 43dd111c c227f7b8 4382bdae 43ec611c 449aedd8 42daea90 435c5661 446ac29c c3f916d6 431f4d64 432b9be9 4482b684 c36de7e0 bf553a00 42a21563 44081e4a 449a582c 41924798 43864354 c47c3694 43f5f164 42ed1db4 43510082 c491d988 c4241a9a c2b66f5e 4362d79b 44116d58 447fc27c c28ed142 42422721 4285cf20 c3873000 c2e42001 42b27dba c2a873e0 c22b1cc0 c32c70e8 4343e329 c4777af4 c3f97606 428a677c 4232678e 4342e140 c34851e8 42dde534 42aae937 c440ea9a 44468034 c0997600 43517860 42e93a50 446a8cbc c28d4b54 42a76bcb 44839e5a 441c9ad8 42cce3a0 42ee4e99 43d3c834 c4b1c84c c33b70c9 4391f0aa c4b6d39f 44470628 c33a02f9 4309388f c45c9bf7 c44e81d5 42da700c 42858906 44808204 4497c546 42b1277c 437ab4ea 44b81bd6 4404cf84 c3177f9c 434e92e4 4137a200 c4b71694 3ffda000 438bbd34 c3dc7f34 43c87994 42166e34 4357c65f c49b10b0 44acc044 c1f8b620 43674de2 442c38d0 44106124 4347ebd0 424f2bb4 c414478b 4416c0e4 c31d425c 4371e1e7 c3989dd0 c3f1fc52 c33243e3 417414d6 44b85b96 c41bcdfd 430a0e66 4341e748 c4994423 c19f6200 c2bd6d0b 4271b9f4 43835440 c49e2602 431506bc 43408861 427b8500 c495304d 423e65d4 42efb60f c4767d83 c402f2bb c26c7ae0 42a2350d 4462c8d8 c4b7c6d0 c158d300 425635f6 4497d832 4367fd78 41317760 42bc2c15 4352afc8 c405c16d c2b054ff 426792c4 44ab8912 c21e0220 432f0bb6 41dceba9 445861c8 44ac7374 423d3ec8 43360241 441416c4 c43cb7e0 c301c61c 4346e4d9 446ff484 c3c26e38 42450b5c 42881360 c49cbf6b 442b079c 424d3280 41f90502 44b66db8 4467dd38 c2e36820 43935865 44749abc 4412381c 42b76288 431f0c67 44ae9c7a 44b1797e 4225e088 42ae37de 446003ac 441b8ff0 428998a8 419f2ce5 c47b9690 432ec550 42107c24 428ea81a 441b57d8 44424cb8 4198bee0 432aa93e 447ac5d4 446c1274 c287ce8a 4325042e 44aa5106 c4014d13 c2e9a4a9 437e3c21 44110ee8 c45bf382 c30087de 4253ffef c42bae84 44aaf894 c2d45170 421484b7 c44a0577 c4946177 424c0198 435c0398 43d90dc0 4499a080 430d11ae 422a8715 4414c9c8 438589c4 c339c478 4321e322 c487d94b c379afa8 c256d55c 4297e5d6 c432ef85 43f29b50 c30d119f 4154c978 c3caec84 c464fb1f 41bf4e28 43430773 4446fd58 44441ce8 41e7f1b0 4335aaab 42ac7580 428e5180 42d26dd4 428d00d9 c4044251 c11bde80 434055e4 4338d053 c48a2a03 4472a8f4 4323b874 438b1490 44ad48a6 c453b636 43067640 42e7c9c0 c41bfcb2 440a25cc 42a38fec 42b47375 447fc080 44a93944 431abe1a 433ab664 44677234 c44f94a2 42b710fc 41a36520 43059b00 44b78d5a 43378bf6 43851113 c3f4374e c433760a 42060c94 42729c61 44747dec 4475375c c2efeca4 4343e2a4 c34033d0 44453138 c321a935 4308fba8 443d53cc c45005e0 c3344912 4252850e c3d431ac c46506d8 c276609c 42061a30 c4a61d02 c4191e2c 42c8c2dc 4331781d 43cd4b80 c481de70 c21ff310 421c7f50 4448f098 44a6d5b2 c330b110 424cd306 4488c144 c4b1b80e 420c010c 435565d3 43c8e7c8 43f23c3c 417aa430 4310de39 c23ec5a0 c4a3b2fc 4308486a 42029284 448547e6 c3190c58 430ec448 4333ed94 c4748ba0 43757fd8 428ded54 42def1c5 43d72ffc 448da770 43027998 41afec7f 41ea6940 c4b92322 4171eda0 434cf804 c35b3ad8 c4962015 431539c2 431866cc 44197d34 44aa28be 41ea3788 435ca480 43cab348 c3e420b0 40a73440 435424c7 43e933d8 448edb62 421b3b88 43951108 c30697c8 4401a768 42b1a6c8 4280f854 c4186ce4 446b8dfc 432a9880 427fdc49 c42e6319 441c466c bf0c2000 43941b0d c4611418 430a77d8 c2f6b769 434003b7 c48d1ddc 44899238 c338be93 42f2f922 c4683243 c3e17fc0 c24a841c 4387bd8b 448cebf2 c48a89f2 43345480 43798c11 c4a1b60c 44b422ba 429b8c74 4367207b c4247507 44797808 4209eff0 437cb31a c421d29f c3e11e04 c24722cc 433bba06 c4751e1b 440c3bac c2dd27bb 4395761d c3069f28 438162b8 41295570 420f36c0 c480e233 449088f4 41eabef8 436eb28b 44808e0c c4578fe7 42f286a0 422257e4 c4166aac 44704e08 c2965455 4268cbae 448837c6 c495d364 c31912d0 42ba87e6 c4b646a2 44311804 42a4f82c 42e90446 44ac7abe c3d9efac c27a8f64 436a6478 00000080 -> bf0a7cb8 3f508e59 be55fa6d 403f584d", + "c3b84970 c3206790 c2a85f6e 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "44635008 44b7dada 418d1740 43fe923c c46d7dff c214cb54 4388582f 449d6294 c4a1f290 c33c367e 43156a51 42e0b480 c2d90540 c338ddd6 428d6a58 443b33c4 c4a03ba9 41deea68 438cc86d 44b4e208 44244030 431804a4 4260a889 c48b1ce9 44623370 41867c38 4371e1a3 c4180747 c3776d28 c347786f 42c1d7e5 44b3c248 449e5d06 c249ccf4 41845364 433a4b98 c4baf99d c1dd9930 438c6d10 448e8b62 c492f5bb 42fd2530 43430a74 c3f34be8 c27990c0 42fdce84 438489a4 4430f33c c42383ee 428c8c64 4248b73e 44a2a990 c468bded c2285700 435cfbe4 c387c454 c3254028 42ba40a0 4382e05a 43d3f9c8 43a11e6c 422da54c 431ba106 c4a271a8 442c4db4 3f0ddc00 433c64a0 c499c44b c4b5c52d 426b94e0 4362fa98 43d4f128 43cb886c c3317951 4383c411 4496f6a8 c441851a 43008dec 43467354 44b5a0ea 43f3af60 c32e897a 416710ce 4435611c 44880a7a c2567554 436f01d0 42a51690 43db8400 4234e7a0 422fee5e c42d8fce 433be9a8 c2a5e02c 42b22b62 bfa1e400 c40b4d92 41e404b8 433a56b3 44b32e7c c45f6ae8 42e7b118 435afd5c 43ca1c90 44a04e50 bfaec280 42c0e295 c4897d3b 42767b40 4301fc0e 426a515a 43b94bbc c49c6153 43198210 4392ef4d 430343f0 438bd1a8 42d0438c 428a57e8 c3cc56a0 441ec780 c324f24c 430aa5b8 c392add8 42b456c0 c10270c0 420403fc c3eb7340 4454b4fc c248878c 43349be4 440009ca c4570244 42899c04 436cd8fa 448bd0d4 c3eb7eb4 c23f1490 437629d6 c3c8b768 c4a20af6 427a1ba0 41405cac 44710968 c3235980 c02285c0 427f4b37 44062690 c40ba75e 42b72920 43886c4c 4321cc60 c3c72d48 c2cc916c 42ae5847 c490924c c3e6fec4 c2913f76 42216f24 c31c68a8 c3783600 4336048e 42dedb4d c484cc61 c4458248 bfa3f600 4300f5ea c38589d0 c4956c70 c31d97b4 42886f9e c4578587 44a73d6e 430723f8 42bf9d8a c4a6bab9 c49d40b7 42439118 438fb75d c4add91f c41a7c0c c21f4520 4193d52c c4a700c9 c2be2e10 c33a401d 42c40803 44afe30a c38d2668 4286349c 4322c882 c4b249ee c4281515 c2559c80 438e9822 c4912f3c c411139a 43107100 4333922c 44a8483e c49c3586 42dbb2f0 43316d02 c45b2aec 42a931d0 429afb78 433a4eeb 42b02f60 44a82688 c2e76bd5 419e7480 4427d49c c3cf55e8 c32cb02b 425a7542 c4b5328d 449fad68 c2a3ecae 434e7ea0 c45f4a12 c4660749 c1bc3b78 41378ba2 c346a8c8 436d8a18 c301864c 438cd413 436e70e0 4491d8d4 c2fd8fea 436328ad c452554e c4ad6fd6 c344d5e1 438f2df9 4268c340 44725828 430095b0 4322ac5a 444dee80 c35cc1c8 42db4f7c 417fb97c c4649e1c 43c8e8f8 42f273a8 434a354e c45b4ac5 c457833e 432cd904 42807af6 c4b732dc c46d591e c23c15dc 43651523 43d565c4 444a2974 c30e9476 43404b04 c3ddfbf4 4440bc30 c33c9bb9 4343ba2f 444703f8 c2e49a00 42fb68b0 435104db c3db33dc c4904190 42571d2c 428455be c4945eee 444979e8 43213266 436b0056 c3728730 c36e5bd8 42f7eb1c 4371f422 444f161c 4220d1a0 42b74f48 42e8c2ff 44ab4d5e 44ba012e 42bde200 41a390ea 43e89528 c439a8c9 c2977126 436374b2 4406ae84 c46659e6 c3023870 4171a47a c39918f0 c4895ce1 c2c3c76c 435ea678 446fc258 c48fb3ef c298dcc7 42130f7d 436a9c58 4432d42c c326ec7e 42a0d82f c424979d 439fdec0 c282f5cc 429498ae 44ac5e86 c3ea6f58 430cfe1c 437d3255 c4b10f11 43f27920 4292e808 43691bef 442868e0 4450ae54 c33b835b 421da2ee 446476f0 44903974 40b48c20 43892a1d 438d4774 44908618 c2434f44 42b990d2 c47b0c00 c49ec45f 43401084 4349341f c45da3ed 43cd43ec 42e6e6cc 4292a736 449afee2 c1839000 42cc6184 41c07647 449c0ed4 c49a21f6 42e82838 42d6cd54 c3ef6cb4 c3f63d7e 4343e6a2 435f85e6 c315cd28 c228c920 c34481fd 41b022a2 c49b68c9 c45b5dd6 c2a9dc5d 4353253d c44ec00a c4769775 426dd6c0 42f92f69 c44b8378 c4a86f33 c3316bd1 43850a14 c3ccad48 c4662183 42569b6c 42f6c79a 448be218 c2d06850 430e6874 42996a8d c4b2f68d 44b50742 c2fbcb83 4359891c c4981966 c47151fd 41e381a8 42a9d73d 44945dde 43d477bc 43062822 434f01ed c4a20a82 44a48578 41ebfe00 43958f76 c3e23ee4 c497dde7 43459d20 4361364b 4481b36c c3d1818c 42ffdc74 43827869 c4af4ce2 4498aff8 433ced40 4252c7e0 44174864 43942118 43114e48 4393cbce 43c2df2c 445106e8 c34087ef 421f4944 c4b32786 43581a38 421eb98c 41baefd8 43962c4c c3a48ba0 be4bd400 43343b22 c45569a5 c3b85574 42fc1c98 43053304 43b31de4 43cdbde0 c337449d 436b9eb7 c2ac9d30 c490c8b2 c2395878 434a1b3c c47cd02a c4070ad8 42927c68 428098c6 c45c8ed3 c3646310 41b53c08 42c03278 4450c914 448378c0 c3343b35 42bbbaa0 449d84ea c2ae8310 433de2a4 436b5e89 c148b200 44a7fa54 c30f33b0 430e1d36 44874f62 c44861fd 426fc7e0 43481281 c498fd70 430e79a8 413201d0 41e5c118 432ac4d0 c49b869a 40adb160 431fa438 c39e2f3c c3d7a51c 432ff782 4355ab9a 4491d8f4 c3840c98 4308117a 42747187 447a4020 c45f0abc 42f6e5f0 42e79e34 c4013bb7 429bb5b0 3ff46d80 42544186 43f3abfc c4307aa9 c2ae4150 4321c10f 44b0f7c2 44a0b8f0 42f14980 438bdd0c 43ff1eec c4b11e2b c321ea96 4348f1ec 44948582 c1bdec40 42bff998 435300f0 c3f477c8 42c88020 431ddb94 432d8196 42b9fc40 c42ab2d7 431b4894 42094497 c493160f 44aea816 424309a8 4348e1f7 c3636640 c4213f29 c289d058 432e2969 c4ab7b18 c3b5063c c21ca344 42bd7e14 00000080 -> bf4c0976 bf155f79 be1fa1c4 43288d22", + "42aecde0 43ad91e8 40d646c0 c4b7d0df c4af69d5 43107f12 42cbb83e c46eb1fd c424dc1a c27d7884 43102a8c c4902f5c c4b10fa1 42eb6af4 43411442 44a55c1c 43b03f98 c22fed28 42ee5c98 c46240c0 c37d70c0 c34588e0 42c5e1ff c485ba4a 418d6c40 c237e0d0 4354fc83 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bf767b60 be86134b bd87e808 41ed5508", + "c46a7bc3 c396b280 41faf4b8 44924320 c3e5e328 4343baf6 43065239 c4b80e14 427e1460 c2cfdcff 418e90c6 444851f8 449fc2f0 4294737c 42b69597 c46451c6 c40f7ad9 c2c24429 4324b41a 44a309b2 c4955736 42d1745c 4157efea 449be74e 439d218c 41ef3b38 4325ffbe c47f8ed5 c38525c8 3fc94d00 4345acc6 c47e08ba 4457b7d0 41d348c8 43676648 c43a4da1 c4b5e96f c2db9ee8 434f8487 4464b5b8 c45f0a2f 432cb58a 4217bcdc c4834bfe c3e1b92c c1dc0b98 4317f3af c4068ce7 c4b19bd8 433320a2 42866022 c48b88be c47a216e 4216fc78 431f0c06 443f310c c49e46c0 414cc8d0 42b97629 444bfc88 c311ce20 c2b8732c 433767f0 c4b508cc 438b8634 431245a2 439305e9 c3d1fe60 449e4b42 c33c82da 42799477 c49c4af0 43643718 42b6cfac 435e531e c47782ce 43f83d24 4310df44 432e348a c474dc81 c49b8608 c2e22335 424223e1 c2db80b0 c410f35f 40f658e0 43953ecd c4660e88 c4a7f928 c3449716 427173db c24d2680 44a512c6 4323a538 42e10ed4 44a270e4 c3f944b4 c3285dce 432b7d35 c241f260 c310b378 c31434bb 42fb1ea4 44ba9ed4 44485c18 c31a6879 432a0865 c33a1080 4487d462 c279a604 420fbd03 c4553021 44aeaa2c c31b4bbe 43512575 c4477286 c4884a6a c3122f90 43580c35 c49fd60d 448b14ee 42e4f834 42c699e3 449b18e6 44852564 429e36f0 424de85f 43fa6ff4 c3bb8d18 42ef2eb8 437c7cd6 43819ce8 c4120249 c3270b8e 435b4edd 44aaeb68 446f2268 c311e8f8 4353eb13 c4666f7b 44af473a 41b5d058 42d4019d 441c1380 449d291c 43372aaa 431ff7d8 44765390 c45032cf c3183575 437104e7 c461892c c3c52350 c0d87720 433bc1a4 43f854e4 44712a00 c0c169e0 424d6a01 c4a17bb3 44b09bc2 4319f39c 41e23074 c4a3c984 41bb5480 3f9aad00 43890315 448fc502 c3a4fcc0 42b8bda4 43026a42 c4bb0002 c33933f8 40e348a0 4223612a c40b72fb c3068018 421fbaec 439533c1 4494ed64 c46f85c0 c294543c 430aebda c4376250 c4ba9d69 425b0188 429257fa 4471acb0 c2b76550 c3318560 4243b5f2 c3f910ca 44b8bc28 424b06dc 4294a465 c49c8d28 c194b300 c2b9c047 42882bfc c37bc738 c4a9b114 4255fe60 430924cd c1cc9300 441930b0 42ec3a44 4366b21e 44838e8c c3b8e8d8 c2a0e44a 428e0664 c450b59f c1e69880 c2cba205 4385de14 43ea8d00 c3330810 42f60510 41dd3a38 448b18f4 c4211c14 c324b8d2 43020bc1 c3f94898 439109f8 c3277e26 41486622 446987c8 c41907bc c33e7799 4377e05f 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000039 -> bf2ef96a 3f3a7943 3d425ce8 4187aa5b", + "4456eef0 44a89e04 41af8c08 448d0f8c 44a9e7b2 41a3f328 428c1a9e 448cf272 c3c779f4 c1ae61a0 426dd626 4481adba 449ab138 43096d00 4362adbb 44329ce0 434449f8 426387e8 43510565 c45bcc0c c3fff216 c313a52f 439018fb c4522770 c49444e2 431de9d2 433eaa72 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bef31be2 bf2276cb 3f1c1891 43205287", + "44926246 c401ad8e 42d93ca4 c4b2dce3 4471a3a0 4324c988 42f9919a c3ed3954 44522768 c0a34b40 42a8a5fe 4484ac9e 44b9a684 432744be 43446141 c44072ae c20ffc00 42935810 429dde3d c432d885 c4a00a8a 42b86c90 42f157b8 c4894188 44b42824 c32bef0c 430bc923 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f44c402 3f2374f2 3d20ea3d 3efefc25", + "4492b886 44b9e84a 42f009fc c36e8190 449fd46e 42f9b9d4 42136dbe 440ff1fc 44721538 c323de82 438c14db c3def5f4 c39b8cf0 42e42df4 425bc227 c3520850 c3dc4a8c c2848f00 428f6000 c4098bf4 44b2a5a0 423a9548 428e2668 c3ac13c0 42963bc0 431691aa 43790e23 44b0b9e2 c3e90b28 c336f44c 436415f7 c2d569b0 4182d440 c3421920 41482d9e c3552980 c400f806 c1d57090 41efbe5f c493bea7 43163c28 41a4b8e8 434aea3c 438cc780 c4116b65 43241260 434e4ed5 44a6fd5a c44d0111 42a33228 433fe931 4430e5d8 c446e24c 41ec0220 42df688f c4816690 4482628c 41897e80 4386d771 c4a8d420 44b6ef94 c31776a6 42dd6d87 44521f48 c3f28a14 c15224a0 437f503c c3b1aebc 444f6c8c 42b4d088 421e4260 449d708e c42fea3b c31d51c4 43684ae5 c3614060 44a9457a 423acd10 4203d7b0 43ac4a08 c461604a 43179bec 4361efbd 43d2f6d4 c37dfe80 c341899c 42992c77 44a1e312 43f61360 430d7db0 43329034 4455ce54 42e30bd0 c3405fc8 4231183f c355c9f0 c45ddc3a 431a0644 42a8376f 447e34e4 c4a365f9 c2a3b262 426bbd26 3ff6e000 43991220 42a5f3b0 43126bc4 c48b747e 44666b80 432a50b0 428a0dcf c449cb07 c2d93f00 c2af8531 43804ad6 c492b299 c3b8e69c 42a55138 42e7999b c4056306 c444d561 4325af14 435a12ca 449e9070 c4853684 c2928068 42f18f12 c43e36a4 44b73192 c281c4ce 429405f8 c4a2a065 c3d03154 c2cfd066 4329abad 44978b7a 441db630 c2ccd3d9 41a98ab0 441bebec 43093798 c31f676e 4238633a 4432b264 43e14778 c26f80f4 42ce5800 c43611a8 c4786ba0 c3443f9c 41c8a65e c0ec3000 4272cd60 432d5ba2 433866f6 c4833a1c 4369a740 c2cb472a 42e268af c4211e8e c402eb2b c2dcc5a0 4249f0a4 c2b76000 4419cb2c c3111d7c 43831caa c44f5481 442c822c 4332780c 42fb24d7 c489b65a 43fc1394 427b1770 436b28d0 c48879ba 44594da4 433fb15e 42b22354 445cd76c 44b9d8b4 c31618ea 420206da 44b3ad36 c420a952 42b28d58 43285e24 c35891e0 43d044b8 c21f2828 42d13763 c2d5b8b0 44918876 42cabcb4 42f1d2b3 c405b8d4 44ad351c 42780e30 419d08b4 421bb060 c2692140 c320e938 4322e58f c4500cb6 43a64844 4327b1e0 437a8d3f 44883cec c480a1a2 c15df150 42e4fcdd 4393fa80 44b17814 41c48d08 42bbf55c c4607c74 c4849721 c307d04c 427d0981 44b4b354 4388acb4 c1b9d4e8 4333912f c3ffc604 43b3e7e8 432da860 42a1e9f1 449b7c70 c4292415 c190ef60 42720c27 c488fc81 44a742aa 42cfbdfc 42ca0d50 4495335a 43924a3c 430e00e8 42e99a9f c3c82db0 4493a354 42923c4c 42b11467 c474db5c c4ac6c7c 42b610f0 43186d69 c4020021 c2d8f900 c2fe95d6 427352a3 446210c4 c2abb570 c333772a 438aab5b c4ad0217 421c1920 c2f1cdae 4338c5b8 44048870 4402eb24 4325f192 4334c230 4417b4d8 c41ca49e c2db80e7 434742da c456d1f3 c43d5870 c22d416c 4338ea7c c41c6ff2 445b2328 42fdaf1c 420e45f6 44991eea c476acb1 c20e1888 42bbc874 4493220a c32af440 43273488 430cbac7 c498bbcf c4256d88 c24b963c 434a5cf7 44940262 447d5d70 c2b3cf48 42f33804 c396541c c439bda5 429941f8 4352ad50 44b390dc c49842b4 41db5da8 4384f201 446befe0 c49f6407 c2b1f494 4203c96f c4a0743b 436bd468 43198b68 414adcb4 43e76a54 44adb048 c34295f3 4382cb3f c4955176 44992c9c 42a83f38 429b8b14 444068a4 c2d79880 bfc70e00 4304a010 449ce4e6 433ae5e8 42ce58b4 42edefd6 44b11cf2 c4b8ede5 c2ed4c47 41aaa540 c495c558 c48c94ee c31c4530 4376295c 4399d2b4 42acd9f0 c121ee30 43770b85 c47ae7c4 447e2a34 c2422120 431f16d1 c39ca5d0 c3ccb810 c34461dd 438c1217 44733698 c38a75b0 c2ad9105 43187b52 42fc38c0 c2fcbd30 432e2d88 431f48e3 4392ca18 c484dc35 43399950 42a65305 c4093b37 4496ad0c c31d451c 41e76b95 c3bb26c4 44814bd6 4323735c 432374f5 4484b126 c4619c63 c2bc00e6 43302c3c c346b380 44935790 c32cb4a8 438a0f7c c49b79c3 44b4c122 c33d16c9 432ae916 431fc3e8 4474cef8 41a4b358 432dbc7f 4427dc2c 441f0bc0 bf97d700 43446496 c468bf3e 438dd300 c2e2cebb 430e7bfe 43426f20 c450304e 3e183400 42acebca 442e0bc8 c40bf2dd c31073e9 4329b9c6 c3075150 c2716840 c328edec 433f4756 c485fd00 441d8634 c330fae1 43463f06 c3a589d4 c4b4d488 c1e1fec0 433c988b c48f16d9 c3884cc4 429f38f8 43184728 c3e07fe0 42fd4d80 c27dac74 434a51d3 c3e45dd8 c42f94a9 c2806840 42aa643d 44b502b6 44671d64 c344b880 428e956c c3a13070 44646f20 c2fb85b1 4369e106 4480adcc c28d0110 c320031d 41fa3950 443a8d14 449fe388 c1f9e348 415ff1ae 43e7c450 44827752 c2c5868a 426f62d3 c47b1ecb 4396f6d0 c28144d8 425c961d 428c5240 c4b7d73b 43255450 42821c12 44b0fafc c291d180 c2ed94fb 42819efa c486da64 446ec91c 4263d8a0 42d60938 44176024 4481d318 c2c2bb8a 4333ab06 44792444 43ec11ec 42da29d0 434428d6 c40f208a 43bc7bd8 42c180c8 4304f30e c48e6286 c4013ecc c344893a 431af493 c4b6b344 c4794b90 c32259d2 42f1971b c2b59090 448431f4 42965f18 42f2038e 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000077 -> bf087f2a 3f56d82c bdda9443 42ad1cea", + "c49abcf1 c40d0a2f 42f6a660 449a1cea 44a25e24 432c2440 42b8b34d 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "43c0d2c4 c42efb9d 42ebb97c c3f074e4 41bb0800 43032cea 4353fb01 4481f15a 4495262e c2b9b258 4317ea11 c4a16c6e 43d86988 c152f680 4355ebd3 c472d922 44b14b64 42b36804 42ab0107 4488cd56 4482fe1e c308b4c8 4383b385 44115ae8 447c53b4 430eeeb8 42ff0c9c c3c55230 c398b4bc 429a23e4 4375579a c4870040 c4af2595 c341b5a9 4288339a 44993200 c3e8d8e4 43032a12 43340921 43225730 444cf0e8 c34598f5 436f2aeb c4906947 c3932808 432a7c7e 425cb2a0 44962754 4352e6a0 42bbcff4 43903a73 c45c6d8c c4b2a504 c2ddf3cb 431029e4 43e11de0 44232484 433db088 431bf1ff 43e1b148 c367f4c8 c2899314 430c0322 c45d3549 c302efd8 c2710530 41a4e6b0 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f7b5c1e 3dae97e7 be2d5729 43879d9d", + "c487c6e9 441aadbc c3236132 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "4168b000 445f9d44 4282be98 44422c7c c41c1112 4324168c 4355739e 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "449bc0fa 444c99c0 c31af598 c48fdb3c 4468c964 41a9e590 43299405 c467c087 c3c22ee0 c28c4770 438cb36d c48a3682 c32454c8 41b89a30 4333b394 43edd2d0 c4a7cccc 431bd924 4322e52f 43c8948c 444ebbc0 43215526 4376716a c4a1efdd c408f7c5 c31398b4 433d9abf c423714d 44abfc04 4291d9ac 4335fb41 44a856d2 449cb008 413f3a80 436d9e0b c2a48b90 448398de c2d59dd4 4297341d c49f3436 4422509c 4225da80 430fa86c 44702ae0 c45f7485 41ef6110 43456f62 c420c91c 44541e2c c31fdc3a 429ed6ce c4b3c66e c4744034 43147374 418437d9 44431308 449c6f48 416e77c0 4371b643 440687b6 44a2a9a0 c2b9720c 429ac69b 440d2c7c 442db574 4342c918 428fe31f 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f7ffeb2 3b6a1cf5 bbaacceb 43341dbc", + "c49b558c c4697049 4336c9b8 43f51c74 c310b178 4326eb8e 426f80ff c32cac60 44b9a95c 4312717e 4361586a c237d460 c3f970b2 be990800 43817333 c32b31d0 435951c0 42dba860 41bc5bb8 41b0eb40 c4b23452 41b15550 42c9ecfd c3461510 430c84c0 c30f5308 430bfc5a c3c11208 444c7e40 c3248e2c 4290c173 c3d0305c 442d3d00 40a41360 434c5d4b c41b749b c3708768 c2647e10 435b8b1b 44aa2f68 44837214 c291dfdf 438ab2ed 44005d3e c4a65616 c2f43ef3 4338047d 4449b48c c3bcdb0c c2cbc343 4260a3b0 c457b4ca c479d4a6 c2133eb8 4362ec72 432b8e10 c1910080 c23711d4 422f3801 c40e70b0 c2b98ef0 42f08f4c 434c3ccf 44986ea6 43e284c0 c23dd1cc 4364926e 4470aa84 4476c5e0 41d1c270 41859e5b c4559078 c4a7ff2a c322d930 43487c8a 441b593c 43c80854 42640540 42eef88a c3ddc794 42f9c5b0 428f6dd8 439597b3 42a42a90 44a10a36 c346eb16 4284b3e2 c404bd9a 44469abc c31ac8fe 4371a484 c4aea8bf c4428820 c20c06b4 4316941a c4a8d117 43ddcef4 c341c50c 417d730a 44034e2c c33102f8 42df5680 438d4973 446768e8 c4505c75 433191da 42620b56 c49fbeb6 443c576c c337a5c9 438af492 4483cac4 c4b87ba2 42d3896c 4368d9ce 44595728 4463a1d8 c30f07d4 4392abf5 43de7650 c46ab6ce c1ddcfa8 41d21c54 4421febc 4448162c 43438c34 43925203 43d149a4 43a23030 422b3ea4 41d97b35 43b0ab40 43b78f28 42a1f840 43891dea 4444d7a0 44338850 c2f915c1 42c50085 44b6117a 44805ed6 c317e120 432fd927 4427f198 c4691838 4332edcc 418cc6c7 c28ec7a0 43d80c84 429bf918 42a2dc77 4182c4c0 c4ad0d2c c24d11b0 4317870b c4b7a209 44275150 c2dcddee 41b0e4a6 c4480359 44affce8 41057da0 43111b85 c48576f9 44b49bb2 c29b28d2 4298dcb5 c411d002 448479f2 c3459a25 41c4f3e0 43ac4c74 447cef8c 43449cc4 4373bc77 c4a27859 44868c2c c2864632 4322c49c 446f984c 44ad808e bf21cf00 439558af 449aef48 c3d0ed3c 41ac3188 4331fb82 c43b1822 c4562c3c 432055e0 41ab545e 423985e0 c4846b92 c32b4189 416b3bea c405e70a 43e79ecc c1e70d18 43614495 448faf06 4423afec 42b07da4 433ea68f 43cf0e90 43d8d564 42525088 434bc73f c4a9e024 434588f0 c1fbe7d0 4257c2fe c3a399c4 4413d8fc c2de280d 42b0f923 c2aeb660 42983140 41a8bb60 436d2e05 c35890d8 442a19c4 433f69a4 4211bb04 44a9a96e 44aefc56 415faea0 4311b74e 44470a6c 44b23e66 c0c61940 43019397 c34f0258 4386c800 4265cec0 421d6764 c44174ac 448cceb8 c2641294 42afca41 442bf3a4 44909a80 414e6880 43508fd5 445bde18 443afd6c 426d7e48 437750d5 449f3734 4461e994 419110c8 4370de50 c4955e42 43d8a084 c294681a 425d5f60 4433c9d8 43c23320 428866b8 434cb56e c49265e4 c47c67a0 43212016 41f64d50 c49d0124 c4b8251e 42b06adc 43725016 c4a76ff6 c48e16f4 c33c90f4 4336aa19 c4791121 c421e7f7 c3325b2f 43273d14 c465167b c41a9f8d c2a19b9a 4289ce05 c4085a83 44227714 418aea80 4390ce08 c3520c80 440d51b8 c2977b49 436e1b9f c4287a68 c218b620 c25d9cc0 433ba6de c45d42dd 440b88b0 c3086695 432e15a2 44b50c6a c2ec9570 42256638 436d6bc2 c4b0b360 44824208 42d3dd20 4373026a 444c7960 44a8ba14 424d1970 437717a0 43877674 444c37a0 4338b8f0 430b4e4d c3fcc922 c2c3a920 c26adb7c 42f7ee6f 43b412d0 44a47da8 4262b790 42f7e12d 4414b958 44a2ba82 412495a0 432e34a5 4442b390 c37c0638 c22f5840 4315bdb3 c48c93d0 c20c63c0 41be1960 435edab0 440ed888 42255cc0 c302464d 43128b37 44a96be4 4433f2a4 c2f6c4d1 43153692 c4a4e91c c1a5e100 c2f2fbd0 431be41f 4298ced0 449bda90 c2af1b60 435fe710 c3fac0da 44478284 43324dca 41b66fcc 446f2744 c4592417 c325a2ac 42160840 c405c574 c4620c28 c33672cd 42e2d9f1 43329618 c484a120 4299f234 421e542f c4575652 c44c216e 42cc5640 437721c1 c41b3152 448f63d8 c1bc2d58 43849e00 443953d4 c47dc2ac c285dfc4 428b059f 44324118 c4b30239 c337b258 437ec1f5 c488ebf2 43e538b8 c30c62df 42e4493a 42ff3f50 423706e0 43260b28 431531e5 c35864d0 c49db406 c30c51aa 43646c9d 441309e8 447b2c90 432834e8 43898498 44617de8 c49826c4 c2a7d94b 42c0a1e7 c47edbbc c2db7a70 c1b18a48 430ca1fb c40362db c4a2e274 c2a25c10 434897e6 448daed8 448ec350 c26481d4 42c16abc c4804ee2 c46115b1 c2de969a 4388793d 44ba7b92 c3fa0594 41be4ae8 4354502a c40c765b c4286bc4 c23046bc 428fe60e 442ee0d0 440d0174 c2fcbf16 43894508 c44225de c373c740 c218b678 434496b8 442e5744 44365654 42930ad8 434cb8d8 c45ac73a 4414eebc c33a4826 43144d10 c4535944 c4359505 42237530 4328adb9 4426b4d0 448353f2 42188c28 4319e342 43a9b384 c4b652fb 4326a6e2 43118718 42d0c750 438ad60c 4341f858 438549ed c49fe713 c449d321 42add454 4342acd8 448f171e c3acbb28 c20644ac 430f2227 c28f1ec0 44205484 41d4edb8 43024576 42410220 4316ed98 429ebc24 42c14084 c416bb84 c49c89a2 c103a630 41cf327c 4401f54e 44807f56 c05d9c80 43850798 c498c020 440ced44 c2a0be62 4297da87 40caa400 44a3f4e4 c31c8e05 424a47d7 4441a4b0 44604a24 421c946c 4392b8ea 44b47bd8 c399c5f4 42188580 437bac55 44802d94 c485d848 c32b9774 4147727d c4223fd2 c46f8a3a 4340083e 41e1c0e6 c40a765a 43b0e104 c304acb0 430d2590 c49113bf 44a1497c c2e6d26c 4299f0f8 4433aaf4 447abe20 418d4410 42845460 00000080 -> bee575c0 3f56daac be9d9db9 42349822", + "4333e030 c3e9deb4 c2d05ccd c35c1220 43eace7c 42ada000 438f1ad5 4425c47c c408ef4a 43209d96 43174cba 43db1c6c c4573c81 41414320 4369c676 c24de640 4394f184 4324d220 435744b3 c445d0d8 449a7b38 4319ad36 4368fb6e 43ea9318 c4b17622 43033ca4 433465f5 c3c79b3c c4449f0f c30d36a2 4380bbf0 c39384c8 4439af68 4274e540 427fe360 42c08d30 c390fd00 430ecf4e 4321fb61 c431b689 c4921bbb 4216f9f4 42c24a17 c42eeb43 44ae5f02 c152db50 4359f411 4407f4de c2f43ba0 c2c2a0b2 429c50f4 43c623f4 c229cd60 430bcfde 42b48b02 c4a03546 444a84d0 433382d0 42fbed3d 4476558c c48af4b6 4208d420 43161faa c47728da c4a96ccd c325c3fa 43874817 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf01109a 3f5781ee 3e455f8e 429d8edb", + "c4872848 44450ea8 422ab540 c3a8091c c325aea0 c315a723 42cc33c4 437b13d8 40cc6a00 42991d58 432c514d c491dee4 44985d46 43230dc8 43934348 449a7a18 c45110e7 4326525e 438737a1 c3b99ba0 c491001f 42d1a748 430dd2d0 c3008c28 4412b900 c3128f88 43223599 c491cf31 c48abbac c2e123e7 43848375 434dae00 c4809448 c2823fc4 42937420 c47216c3 c1add5c0 c2ccb4c5 41af4c90 4427bf20 44ac33fe c08bb340 42af6128 c435f641 447f1e50 42adf27c 42956cba 44056996 40c5fa00 c2c1300c 4379d11d c477a9e6 c4bb556d c2fd0ad1 4299d673 c2871eb0 43bb67c4 c2abe761 4352c7c6 c40d9e8a 4397830c c2eade38 430d8ec9 c4225582 4469fe0c 4344765e 438f5061 434f5948 440cea50 42f32060 4303900b 44b2ec48 448c85d0 c3023ea8 4302f206 43ba5e88 c18be4c0 c2f2419c 433ced90 44b352d6 4499eb6c 430aca66 433aa489 448b52da c3a291ec 42a7b288 432ec0f6 44b188ca c4939656 42c1d068 432a291d c45b45c3 431b5050 42b7ec20 42364766 443d9850 c4ae35e7 4341bc86 430b2a12 4482e030 4445a888 42767298 43948caa 44149d98 447e8014 430bee40 42bf21b3 44748aa0 4447fba8 422a69dc 4393946d c358ba78 43fc30dc 42ab51e4 42fc6b34 443e8604 4391f404 42036368 4386549d c4951caa c366e1a8 43402f94 43102d88 44a71b76 c43a4703 c2e6c398 43055a7c c48530de c4a8198b 4283686c 4334c115 41ebeb80 443cd6cc 42d66490 42907f7e c436aee2 4485de1c 4324622a 419ab1cf 42fac280 c3802638 42c1a618 428beed1 be64a000 44423810 c3163114 4326752e 447d374c c4001d45 c252340c 425c5ea8 c30c0998 c498d8fa c27b287c 43058772 44544f54 c4677d45 c3363fce 430b7df1 43bfaeec c3629710 c30be86c 436a8da0 c4951b1e c4b4dcba c129bc20 434e0827 44960d12 bfc0b400 c30e47bc 43871288 440bc1f4 4315c3e8 c26fc61c 43517658 4407bbde 444d4348 43391a48 42804362 c48bd57e 440106d2 420c606c 4376895e 44095550 41d272c0 c311ce25 43030d86 c388dc78 c3ecf4f8 c1daf848 41e6f94e 446a73dc c2d56460 c218f2d8 42301855 c430bf50 44af6700 c31e3dc9 4315d85e c420e3e3 c31a5a78 425eff50 42d81c87 c46c56c5 c2aa9180 c1457470 4387fe2c 4435b2e8 43e8d67c 42c3fcb4 414b98f4 c44b8e8c 448624c2 c29077e6 438f9590 447c8d08 c3f81ea8 c323840d 43362604 448f548a c4a67aae c2ba3ada 432bd9e5 c4a20715 c49dca71 c3263891 4294b506 c484ee98 c44862f1 c1f4ea48 4358d6db 43fdee48 c2699e20 432078ee 434ec857 c4af406e c43bca73 4251381c 428eb152 c4aca462 c448ef26 428c2070 4364865c 43919138 c36978e8 430697f6 438f756a c4851e12 c31a09e8 c2af876b 438bd053 448d32cc 42015fa0 42200474 429910ec c46eff72 c49d067a c2b7d7aa 42228fdc c3a95040 c43d9224 42ce4ebc 431dbd5b c4492dda c4af987b c27fd370 4362efe7 44ab3362 43d347e8 43293c88 433443f6 4418de5c 448e6074 41acc850 4346895e c3b2a788 422424e0 43386cd0 43454480 c440f1d2 c48aea34 c3293e98 435416f3 44a99602 c196dd80 4306af14 425fddf7 448eb204 4400d148 bf8e1d00 438ef3d5 44b3c7de 4296a190 4301c412 436fca73 c29ac7b0 c47ab771 410b5890 432defdc c49cb98f c49a5734 43475740 431c354b 42996040 44111990 c2db4282 43958b5c 44ab4b82 44a8b4ee 430b6930 434b9ee6 c48e6c7c 43baab80 43112aa0 42a96318 c4773cc6 c4a49dbd 41b718e8 436008a1 c464b93b c46ecc46 431303e6 42b92beb c485a390 44b0e2b4 422c54cc 42775098 c4a6c75d 44443594 c301a182 4290ceca 44b876f6 c39c5b18 41cbc948 425b018b c48a4c00 435a2af8 c3037b10 42aa1519 c42e2891 447ee394 c2ee9fda 438bf137 44726c0c 44772cd4 43047a2a 42e1e1be 43f34884 43488d68 4243404c 4301d278 43a2bd70 4454cb50 c24f93a0 4387913d c45155b6 44202e1c c25f2438 432a9f26 c49b5717 c4a9cc44 4330a3f4 42853377 444d78b4 43c8031c 428c99f0 435c1677 c4a4b6b5 441c7358 c3157530 43374fde 449225a2 c417289e c13e5870 42e2019d 44b3f4ca 44a3d692 c17615e0 42ca280a c486cfd4 c439723c 40d39820 4317a340 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005f -> bef21c73 bf5d7ed8 3e2ab4fc 4254c81e", + "c49377c2 c41a589b 43356f6c 43f4d40c 44a28926 c203c8c4 428f1162 43b02544 c4753f5e c2df8893 43873f13 c4b90ba7 c480bf45 c2f816f2 425a6cee 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000003 -> bf7fe722 bcdae3d0 bbdb730b 4411fd38", + "428cba10 c40e78a8 c29539f2 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "444e4af4 c483bb97 c235f968 c42202dc c439fb52 c3356916 4301e04b 4479c40c 42b80c70 c195c678 41d0fa4a c4b74afa c4b181b3 c14f8b00 4354b17a c399aedc 444e610c 42a6fa04 42f38e5b c42ac75f c48c74a0 c2c8427c 430e82a9 44b18072 44522bb0 c2b6abcb 4261e327 c4aed811 44abf330 41c96ab0 41bf271d c4904f1d c443889c c2a2ad37 4386bbc1 c4b797fb 4435fa74 426f1c10 42681baf c47ab740 c45df3a3 c28003a8 435212cc c324d548 44a91b58 c30dd161 42655b74 440baec8 c38a48e0 431eaa0a 4276f666 442dd4b0 43d071c8 c2c71286 427e1ec9 c4a39400 432e7260 4332e5b2 431c16f6 44b422e0 4490d5b6 c2409d00 4383ccfe 44af6646 c38e12b8 43302acc 4369dc1f 442c7efc 435a9310 4296d204 4347ec49 c48c5a0e 430154b8 c2e03772 41ee4b7b 44561a2c 43334d08 c3433fd1 4183efd0 43ca288c c492d779 c1265fd0 433f85b7 c4a44c3c c3ad35b4 c293174b 43141a0d 44b70c62 c491797d 43045e5e 430d2860 445d8bc4 c484de25 c2fbcd5e 42b61a1a 447355f4 c2cf08f0 42b1bdbc 41ac44d1 c4b78cc8 c3bdb67c c1d59e48 422b86f6 442476b0 c441af4a c332ecd1 42816cda c3724c88 c46dcda1 c22169c8 431c2acb 430ad0f8 449f523c 43139818 43836e74 c383aab8 443e421c 42fa17a0 43332127 c49a11c3 c2d6c530 42e30a90 433d32e5 443573d4 c445ce93 430fce0e 43931b2f c3d53494 44a51758 c2ccf945 42cd95f5 447d3164 44b10a26 c3434240 42ab8607 44036226 c3d11280 4322a964 4377d59f c3fc3da4 c48bb2ad c3313553 4373820b 441fb69c c401d3cb 432265fa 43833a5f c4277977 c40c0539 4312e7d8 41f42fbd 43e55170 c48762c3 43343fc4 43286f6e 438695b8 446c7cf0 c24dae84 431613f4 c3b0a34c c4a0421c 43045208 4314e843 44a4ae08 c49dd270 428525b4 4330821c 449ae058 43a19b50 c2f296e4 41c7b862 4482223e 44b8afac c2c6e84d 4390716b c38b2954 44b379c0 4321fd86 43025c8c c3fe9b90 44b75d88 42a2ac6c 41b75f42 c4a02203 c4753d8a 4285ad68 4354997f c4b371a1 c2ceda70 42893828 4381ae06 44b77048 c3651e88 c1c6cac8 42aa553d c4187f26 4369f750 43126bea 4341ce09 43f0b1b0 c3fc4178 43370388 434bffce c48fcbe2 446cbed4 c2dd00b0 434982c6 44915a22 44b75ade c3105bdf 433b39ac 4499e0c8 44ab2748 c30ae4c8 42f8184d c3c40bbc 4456aedc c21661b0 43682dbd c383eee0 44af6e38 41a89628 430bc4d9 44a39480 c3f4a556 c32f06c3 4304c8f4 4323db70 44b89068 4284010c 437a7a8f c4914b69 c42ba01d 42cba95c 4395c5cc c4afb5c7 c4ae9b9d 432b34a4 42a93ea8 44a8798e c4b8fb69 42f8cfa0 419b7c12 c4022f0b c4a4d95a 4333cebe 419c0107 c42bdaac c4aac568 431bf4f0 431e0619 c4760463 c49607a2 c2de967e 4352de2f 44515c10 41f15440 42ba3310 436c187c 443deb80 44614338 c31db1da 4386d688 c4040b3e c40e99c4 bf120a00 43435c62 c45fa032 c4819ff5 c25d1384 42d6417b 44865616 c483bd78 42fd7e64 42ff1769 c480b31a 4271c320 c31793b8 4383fe1a c3a8eca0 c4b05f55 c30afc60 431de70d c4952538 c4818880 427b9da8 415a973f c4a8f983 c4a446d2 c2e09244 43213394 c414c719 c483dc1b 3fd18280 4254be1b 44965b54 449bd79a 42a6e044 416cd1ae 43397c80 c40e3e0b 43045f08 422f2bf2 44091658 4324e790 427383d8 418604e9 c422b5c2 446d5388 41656ba0 42aa383a c3a680cc 4485da16 c22c63cc 435bd492 43ddb8d8 438fa1b0 42ea8644 426c7622 43e4e8b0 c228a460 420fa3a0 424a49b4 44a3249a 447f5508 c33aaeb0 4357dbb9 43d8e6cc 43fbed38 3fe03100 429fe89d 4469a9f4 c4944fd8 c294d073 42015de2 c461f0d9 c4adff38 4302e3ea 4328b85a 40e49900 43c8f6b0 42b7a8c4 429b1ec5 429c7e00 44ac9b80 c3130ba0 430af5e2 44401694 44526780 3ee18c00 42c503a4 c48d9756 42eb63f0 c259ae20 42000600 44256d40 440f44bc c2fed107 437e4754 42820b80 44a5e0b6 c2421b6c 433c6131 c40cf52f c41a07fb c1a82af0 42b90204 4300de58 c40a9684 411ec470 433b6c85 44496584 c43e9dca 428595f0 417671b2 44404784 c3d6c978 42361d38 43925725 441c0ad8 4384e778 43357ed6 438249fc c479dcd6 c4619d18 c3187b10 42b1f216 443469ec c4446cd1 c265a560 431d3d33 4484f2c4 44b5d506 c33dbecf 432c6969 c43787ce c49092b5 43285d22 429a3eb9 421a10e0 44827574 4320b1ae 4309dc87 c4373386 4491fc4c 416aad40 43841a9a 448b97f6 c3e8053c c2906466 42e6fb23 c49e8c7a c45bf62d c312495a 438c4b9c 44b739ce 422f73c0 c1a597a0 422aef37 c473213d c473a786 418c9f78 42c4d10f 44ac0780 c4b517b3 42cdd27c 436d41a9 c451d806 c493659c 42d2ab88 434426b6 c3404d78 c3b07414 c173b1f0 4381b960 440c2694 421a0ba0 422d5424 42b4fb61 43f3c534 c44155db c21fe324 42f93c0d 449cf8a6 44b8c43e c1de5800 4345dd7c 448379ca c498c9bc 41e49a60 4360cb76 43f95440 446706b8 c331bf7c 42d7df62 c4130a78 43915180 c0e46500 429e6a09 c489fe60 443dc4d4 427a3160 4367f079 4375f248 440534f2 432b24fc 435380d8 443798ac c4296978 c2cb0979 4313f8ca 44985be6 c476fa1e c19ed850 438c5f82 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000076 -> 3ec5d262 bf279486 bf265770 41fbed8a", + "c4979f5a 447ac928 bfe54480 c492732e 44a263f2 c314f15d 43254bc1 c4b30014 44b26168 424c9524 42d18184 c48cebb7 4328a998 c3240127 41972dbe c3c378e0 c484ec56 4323cb9c 4333e56e 43ca24c4 446aeffc c2cf3714 41e67381 4430c24c 44972184 41f4c030 437f71e1 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f3d26c9 beb9d682 bf115717 4340b95a", + "433bf680 c48149a5 c2e78283 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c409518d c4275eea 432c35f2 c4b30b32 446ffcf0 4137db50 4299496e 4331f2e8 44177224 c2a00097 42e9802c 43b4e038 44236c20 c3098396 430b1313 42dba1d0 c4b210b9 4182cad0 42ddb32b c486e3b7 c3f6ce4e c30de2d0 4387abf6 44839578 c45c2963 c2658278 42b724aa c33482c0 c469c951 c0fdf660 42b0b5d2 c45d775b 4338abc8 c21e6b54 43848270 422eb160 442334ec c316ce04 420fd330 c4a61459 c38e9050 c2c4da67 43265350 4446a3b0 c3c6a394 c2ae0df4 43817eca 440e9c20 43e1e228 c2a1c78a 431267c0 446d99e4 444db2bc c1f872f8 4377bbbb c4a3008a 43ac685c 42f0f2e4 4376ab2f c2db6f30 c43d6a57 42e7fae8 42eb32c2 c450ac6e c4b05286 c306a490 41d8f145 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f6f3f09 be82558f 3e7e92df 428d1d42", + "44b58878 44688100 42d2dcac c311e520 c41d05b0 42bc450c 420692e8 439f58fc c4886027 c0d58d60 438afb98 c0c30800 4388b3cc 42e76484 43861fb3 c4b7d390 c30bd590 c1de9170 42497807 4373a748 446b8944 431fd904 4389e19e c410d547 43bd1d6c 42f7bd7c 433c584a 448f969a c4090956 42bc0950 428a6cd0 c44f723f 42fa13b0 c20ab53c 435ad16a c27ea620 434c9378 c2574e94 4316407c 440c4454 4432ae44 c182e4a0 4314cbc3 c4089900 449307a6 433a2f06 4348548d c4bb3981 c269bb40 c2e66c0f 4331294e 442eb588 449d6fa4 42bc8d78 43103594 c4afe8e2 4496f710 4218736c 437955a7 c2647560 c48e5df2 c2f1192b 42bb96db c3941210 c425a60e 42a07dcc 438fa971 c471a126 c4a18eda c20d3b70 430a10b3 c49a8447 44a78ebe c1990a78 437e769a c3d99248 c36cf658 421daf54 43024b74 43f0ed1c c481fd0f 4236cc00 42fd6157 c4940204 c48003cf c1381780 42c412de 44657dd8 44a8f19e 429752e0 43311982 44b15760 42f0d950 c346ef10 432e556b 42edaee0 c477636a c3291264 41a9dd4a c46766a1 c4b80fa6 c109b3f0 438c1359 c4a1b3ec 444ac6b0 c093ac60 436df9ef c2c21220 44934488 c31cdd5c 433ade9a c412fc12 c46fa54f c306215c 42d201ba 41928f80 445e2f80 c2fd179c 42a0be0e 4466ecb4 c39a710c c30be144 4297d70e c3b3f6cc 447ba4a4 c1485bb0 4328ddb5 44a68ede 449090aa c29d4f3f 427e5f41 c3ea7634 43337490 c2dd5327 4346eb6f 440328f8 440904f0 c2852156 42d64483 43ff3ef8 440ad534 43065e42 43896cc3 44808126 c49dc710 c2b64078 436fce96 c3bacc90 44034cf8 c32fc68b 43619386 44b6715c 447afeec c2d754f4 4370623a 44869388 c43a9eb2 41a4e6c8 429b4bad c414be93 44a53e50 4308c9c2 4332d2aa 438606bc 449ea356 c2bb09af 4361d190 44ab6c52 421eb9a0 42745930 4378ca49 c2e00a00 4482c24a 41e7fc30 42366f6c 43375b00 c4453b23 c23896c8 42c27177 433e0458 44043130 c3030fb3 42b01216 4473b598 4333fd68 c2f15e57 431d9e77 c4004337 c3553f60 42ea0fc4 4304dffa c48a5095 c495e162 c33ab124 435d8f30 4480ad74 c438abb0 c28cdc5e 438a592e 446acaf4 42a7e610 43061fb2 4382065b c4b31e6c c44523d2 c2af6f5a 4247e01c c432602d c492fb91 c2d55a84 433e55c3 448973fe c43aeca1 4287f188 433f5f07 44493a10 435aa628 42cdc304 41941a14 44288f20 4440e0f4 c207a660 43232e60 44257cd4 c44b3dd8 4299cd94 42e6286c 446c90b8 44809e20 c2b047e9 42c642be 449ae9bc c2d21260 c09d5940 41a20688 447fb5c4 c40e6b8d c2ca9c28 43347633 c4258842 c4a4d34b c2ca81fb 429424bb c4644afe c476f36f 41b6ed88 4384a830 c350d4c0 c38a38c8 43387c2a 42b0bfc7 c124a080 c41a129d c2f414d0 41d1a778 c49136a0 c410ad12 c30f5d2e 43701174 4306add8 449ce30c c28e13d2 43039050 44764c48 449fbc5a 42a6feac 42fce6ad 44454b9c 43c9dc34 42e393b8 430ee077 c4026410 c477f298 42c80d18 434aa420 41f75a00 c46549e6 c285eb38 432979eb 4400e27c 4469e540 432cc7d8 430031de 448f29ba c4b7fa64 42f89ee0 433d5fca c42c6ec9 c34c88f0 4329095e 4324d0e2 c4789cd6 c30bcd90 c336d66c 42e5562e 44328c00 4475c290 c22befb8 42b06540 c2e41170 c481254e c3191124 4370c965 43b91244 4110cc00 4331a508 42d1c1c6 43058470 42b7b640 4191da70 438a2e13 44b1efba 4389820c c3176731 435e9451 44b667b4 449b9028 416f7880 437782f9 c4904e1f c499abaa c3136a19 42d41e53 441efc8c c43b085a c2a841a8 43838c5a c48c1047 c3a64abc 432a7ca4 434ff62c 44624e78 c4a3e469 c324d407 431fb547 4411e564 c4887301 42e35994 42efad01 c4a3051c c244b240 c32a63c1 43607254 4490d74a c4b9f58b 41bdec50 433148f0 c3fc23d0 c40e983e c248c804 4378bc69 c41d4d8e 435c9a38 c30a372d 42eba16b c4b271d7 44569208 c3267761 42ec3311 c456ff43 c4a0bcf3 c2ef76c8 425c39cc 439c9a2c 44881b7a c3194dc5 43892c7b 4133a500 439de2d8 c338992b 43804a53 c48a81d5 c4800012 42cafaf8 43412852 c4b56e25 c3a202bc c1b00328 4357487f 440f7444 441fa04c 4182aff8 4376d21f c4b603ce c494e0fe c22c37ec 42985c4f 44992f50 44221d4c c04a9000 4388b913 c4a7e316 c384db04 c305d596 43951e20 c422cbc8 449cff3e c311f8e1 41860836 4491435e 43ddb63c c32ac25d 435cba73 c42b790f 429166b0 429a1060 4240a6fd 446fdb48 42894d30 c2670e04 43415328 c3ee5a78 c3ba0eec 4291303c 431b2549 42b726e0 c3adee18 c30fb43a 431b68d0 c2b076b0 4491b322 c346c7aa 436e66ad c4910fae c48ab946 42ee61ac 435a92be 44b8f82a 4442db9c c2722d78 421921ac c4364eb8 c36ae170 430033b0 41b4d64e 43d1997c 446ba48c 4190cff8 431836d0 c38662ac c4336ccc c2128fb4 42f3a745 c3d12840 4486f98c 41d77a00 434e237d 442c7544 43f75e2c c16a4e60 438756df 44507068 43c87c94 41a8a410 4395d4c8 43d922f8 c420ddb2 42359128 424be848 4429b144 44b182c2 c310a977 41db322d c474510a c43573c9 c247a148 438a4fce 43265e80 43cf0828 43104ec6 4359bcb5 447e1834 43e18510 c3239964 428db27a c26e6600 43b0294c c1e98298 42a6e0a7 433c3368 c48de2dd 4343b5a4 42d26fe4 c418af36 c316c250 c2905035 433ebf3c 448a6098 44714070 c22211d0 42e172bd c460777b c3901180 42d34f3c 4308be6c c48d9786 c3e36610 c2e6e882 421ee5e2 c23794c0 43ddeaf0 c317a583 4212a169 44641b64 44394a84 c32ff5d6 423bfbe1 42ffef30 c3ebaf00 40ef63a0 418f600e 44866e74 c3d1a2fc 41fb6920 433956f8 00000080 -> 3f08b62f 3f4fa796 be742591 42aa26dc", + "c423b028 c33ff188 42efcac4 443cf968 c4a89b07 42bb07a8 429ecd74 419d2840 423b7c80 c1d08478 4385801a 43e6ee78 c49ab97f c3134e96 42ff862f c4039a46 444966d8 4325ea58 41237ea4 449501b2 42912ec0 419df8b0 42f5fee6 c466f915 c49d4574 41273910 42c3b881 c3c0ea64 c14c9e80 43083002 43795cda c47f5cb6 c30d1f10 c2961122 43339949 c21d9820 c47bf7be 42ba3050 43374adc c3a95b08 44843a62 c2a1eca9 429a3ada 43bbe434 c441fa5b 431b7b06 42a82d27 c3a98ba8 43b5dc78 41594e60 4335984d 43f5aa80 439bccc4 c3254e1d 42b9c4cb c4565766 c3f7b9aa 42c522a8 434cb174 42918a20 c34f89b0 43132b88 415229ea 44035dc4 43a42cac 42b55a9c 428893b6 444e3d10 430cba48 4327af00 42622a2a c4ae133c c4091424 4235d9e0 41b7cdaf c44d0c49 c4088c71 42d3826c 438ed8fe c4671192 c42c02ce 4326661a 43638b0d 44ad2b2a c43c6da7 c3075b02 432b237f c3c8aa9c c4b1859d c24f0558 4258570e c37720f0 c4a47b81 c32aadba 438fa8f3 44b5c192 c41fe99c 41b41520 41695d44 42300b40 440cc7a8 c0f9b480 437d9e17 44178618 c3bdcc90 41b2e6f8 42dcff95 44b7d422 c4abc08c c330515c 4386f5c7 43536398 445dcf38 c1038990 42a71732 4231e220 c48f557b c3346385 4305a767 c31c7c20 c476b7f5 4305e8b4 4363077a c472c6ee 444864d0 42c24a58 43924a73 c4400e68 43ec1270 c32ff9df 438d4619 44443e9c 443a6e80 c1ccca58 431c37f4 44599ec4 c49f0616 c334c0cf 43349c8f 4410a434 446c4bf8 41d16930 42d00d61 44af46a8 c299fc70 42027ca4 433e5836 4375cc78 446fc630 c1bb5a90 4382b394 c444af03 c48acb3c 41d98358 42db4df2 448459ac 442e1620 428302b4 438c8d44 43c3e808 43747660 c31ef34f 42d50a59 44b4b9b4 c48ebaf0 c312273b 437858ed c3d262b8 44b2378e c169f4f0 430946f8 c4a160b8 c2ebb9c0 42bad47c 4341814c 439e66c8 41fd1100 42e0c770 435591a1 c46bc59d c48e216c c22c0580 4305068a c4550d8e c466229a 42a1a6c0 43413714 c46f8c4a c498dc0a 42720750 41d6aa1c c383bd6c c4910568 433715a8 42292fc5 441f542c c4488a64 c27c548c 437fecc1 c3f06bfc 4442c008 c2be4ac5 4339f07c c3d79e34 c4ba89c4 42edcc50 436b57a7 c39b7b5c 44a332e4 42be6c04 42da9605 44a92d92 44ad2cf6 42c75cb0 431dca1e c4693fd4 4405cc66 c3193d8d 436ebf21 c37808d8 41085780 42620e40 42af12da c4040452 c38de6b4 c33d5086 438face8 41100b00 43b74134 43282292 42ec5554 c478cfd8 44a25be4 c25c695c 43058810 448691a0 44565968 c32ccfbc 428fc05a c39c2448 449f6210 c2d3a7ba 42a255dc c3da7aa8 c40f5765 c31d3d11 430c9b99 c3cbe36c c31bb908 4328f25e 419ef956 c4901b7e 43208970 c1ddc6d8 437cb1d9 c48f1b55 44b98998 c2add4fd 438edfc2 44b271ba 447fa628 c2b4c43d 436a82cc c4b5ed85 c3ca7110 c302582e 41745fe0 4395569c c4049375 42713ae8 42fddb69 43a5a3d0 44975350 c22b6614 4318c460 c42e7163 c39c2e78 4325355e 41660fa0 c41720da 43650690 4213b140 41cf6346 4415da2c 4490dc88 c2c22e1d 433c4631 40d93300 42982fd0 c299edd6 43824aca 41144600 c48f94e1 c2d1fd51 432af62d 43e27834 c2e877b0 c2d7900a 43947320 c488f907 c49a3aee 430c533c 41aec122 445efe20 4265fae0 c1f46f80 428f105c c47e85cd 44a465de 41de4cf0 435b869e c49cd870 c42e4ac0 4273c6a0 42fbb72a c43c94ea c452a669 c32a403f 423d21c8 c49316a6 43323368 40cbcc40 41fc218c c4b5a23e 4457038c 43200b8e 43190f64 43f90834 447d6074 4308873c 4373c8e0 c47b0032 449ee46e 431824de 428dab8c 44292594 431a6558 c2c1ee9b 42798a42 c2dfe690 c4aa96d0 c192df88 432d858f 44aaf5f8 437f41d0 42e1dee0 429c93d4 c2d376f0 447d80b4 c29ad069 43073c47 c3a9acfc c4954179 43189e22 4330d92b 435a64b0 444f76bc c33deb9c 41515ccc 43b29408 44a15d1a 4193b470 42cf3975 c49718eb 44457c78 41b6f238 425f515e c3a91fc4 c32c3f90 428b2f30 43542824 44ad14a4 4493a686 4284b3fc 41e16402 c4940360 44a98528 c318ae32 4306dc98 c4b9deb4 43f6f3a4 c33c93fb 437a2009 42bc1ec0 c387c9e4 c2012a88 41e2f76f c4abafd1 c4123bf5 425b2a4c 438e9790 429d98d0 c43dca47 41c51320 432463e5 c04bec00 c48a4312 c1548450 4283b260 c4b10828 43ba755c 430b4a86 41837063 c47bfb89 43a415c0 c13e17b0 43190353 c33faeb8 446f2828 c13fbd10 433e040a 43ed7ab8 438df658 c3457bbd 438f63fc 4496a7d6 44239ae4 42e9286c 43516764 c3e9ef38 c1943f40 c319a785 420762e4 44653448 4428cd68 c303ab64 43593c0b c3fbc6e0 c489701e 41cbf000 43923ac3 c230e2e0 449fa4f2 c21bc59c 42f06c85 446d4e18 c4b91b3e 42833210 438aaf48 44a4b0ea 449fcbce 424b963c 42958280 447b3c34 c4b56985 c2a786f8 438c15e8 c4428245 43a0c098 425102c4 436c6e6d c3f03814 44516564 430b6a30 4324e2fe 41ca9900 44477fa8 c2e2bf36 43094be6 c3384f10 443fc5ac c30799a8 42c3831a c437a417 c13de280 c311ce60 435e7454 c4670032 43bd6024 c310cbae 4386d3f7 c4a73205 448a8e76 42c6bd18 43033270 448977ce 449336da c2ca3354 436eeaef c3449040 c443994b c126bd30 435c3e8f 41099d80 44543314 4256a0e4 4356c23f c49e8e9a 448a34da 4314a3cc 41c4f2a3 44595cc4 c44e381e c0d47bc0 427cd638 4446d7b4 c4038623 433b424a 42d8953c 448ec7f6 432df7f8 42bfb358 433c2d64 c2b90e70 44307324 42b5525c 43126845 c4aff5f2 c35026c0 42860234 433c9a35 4260fc60 c35a6a50 c34635cf 4287a14a 00000080 -> bedc7b89 bd946d11 3f664d1b 41c43342", + "c415782f c3e5a730 431425a8 c353bd88 43e92158 c28d3dc4 4364d946 c49aa62b c493eb4e 4303a450 42f3edca 4342d478 43e53224 41863a98 438b0a9e 44991e12 44993bb2 43169880 431ae084 4486d416 c43721eb 42d6149c 41d29221 c47c2b9f 44037852 426a8108 42889a63 c43733f4 42bdf550 c25bce30 4293edb7 c421f8c7 4496a62a c288b75e 4322382d c1432300 c289ca60 c19bbeb0 4387df60 c37b77e0 4486e85c c23d8328 43409e3a 44951492 c49be491 c15ab350 436b9147 c48c69d6 440f95ac 4230b268 432062dd c48b816b 4415d6f4 c1f8f048 427906db c4af729d c37c3420 429e80b4 4364b25b c4b82de7 c48d98c5 bedcea00 432b3930 44363208 43a2cea0 c31f2e6c 434a54e6 c4043b06 c4b51b04 c1e4d588 4307121b c3001fa0 44b1b850 c326a3fa 4395f829 448c59c8 c487cb37 c30881bf 42043478 c459e6ab 448a47a0 c329cf4e 432da461 449df584 448104aa c322f7ad 43336ed3 c275b5c0 c483a8b9 c0397800 4204cd8a 44512e0c 4413e700 431d7c56 42be62c2 c3d0c05c 44743588 431ab750 42bba022 44b4d6f4 4462f630 c192cbb0 4225dfd0 c431c847 c470a1d0 c32f7cd6 425ab73c 43ae94d0 c368bf18 c29b4228 4386aacb c43619c1 43b1f650 418eea78 424a86cc c4a9e66c 44a2fd44 42578cb8 43875661 423f7b20 42558ae0 c2fd0ca1 4272bfb1 4291c7f0 c3e3450c 4273cb90 43666d02 c49d6c40 445938f8 425e548c 41c0e202 c43aae25 448aa574 c32119d0 42fff90c c3801204 44af1c78 c29ef061 4361330c 44541364 44a47188 433b2542 41d47c92 44809e4a 4393bf90 43011f0e 4261e84e c4824bfa 443e3430 c2ca8818 430598a8 c467d46e 44b6f780 42da7130 4310b051 43b26410 c4257e29 4206beac 43899921 42a0b640 c4151b25 c32a74c7 4379c27a 44549898 c4360c0d 42650fb0 42f4bc67 42805c60 c487d218 42b46438 4204c3da 43c7f7c8 44933e8e c3198e39 43317534 4315cb48 c48c0820 c2868f1a 438b3d9f 429a1a00 c1bd6f40 422c1344 42d16da9 43006240 c4576da8 430f1aea 42aca533 c4973f9c 43c734c0 42e65688 4244ebce c3afe0e0 c3a9b734 c2e3c653 4315a82e 4488bf04 c48695ca c2b5158a 4333db3b 44aac036 c3420478 425e31c8 4164595e c4b0f4e3 c479d9ce 42ea4e48 42c0faf8 448b6cd6 c4644a84 4325ce14 4318c7b4 44a7d400 43eda05c c231f114 41a07435 44113bd4 443971bc c2acd467 432f80b7 c396bd04 c3b40704 c2a75b21 4385d871 c3e12a9c 4387519c 429dc718 42a2f1bc 4405070a 43c9cd9c 42aa3a44 43008f2b 448459fa 44389134 433c2f5a 4210d023 44847698 438b3994 c2a1364e 42ee09f0 c3705c38 43329000 c22dca44 4387a74e 4423b7f8 c4195126 c2f9cfd6 435c0e46 44bac6b4 c46f8c2f 42e65838 42302e53 4485edc6 4418358c c2fb0973 4330da45 c4854dd7 443bb628 4283df84 4308fdf0 c2b623b0 430b47a8 42416528 429d9d19 c24e1220 41888040 425f0d7c 4288d799 440cf768 c4172d5f c2fed876 421cf5f9 c319ad70 44990342 c30bac1a 437d98a1 44b739a6 c3a56178 c303e17c 41ce00cc c39248b4 44b155a0 c2c94a96 431a0ff8 4481fa0c 438f14a4 41a56180 4255fd83 4333a848 c39d5654 4332555c 421f6d02 44a07da0 448737d4 432283a4 4383a696 44a47e4a c481b4d6 c202d46c 428f4f70 43ea4110 44b65b2e c3397333 4354e53d 44bb2f5e 440c53ac 4286e608 438e9ef3 431c6100 c3e6acb4 420ace28 4364e298 436ff3c0 43a5cb64 c339d464 431a0ed5 c4177829 c48cf5e7 c22ef18c 4385adc9 44aa4094 c1fe0200 42628190 42bdd9df c3dd1ad8 c49e10fb c302dbd9 4334936b c4bad829 c426f9b8 43208906 437c001c 44b0d16c 44aba2a0 c222f8e8 4302b242 44a3b1a0 43123d30 bf751400 426105c3 44a00956 4399db9c 421c95a4 428fed8e 44674434 c467b500 411300b0 42cc1e51 4473dde4 c387b2f0 41f151e0 437637b9 4445978c 42b8bf10 c2c11f21 42696efd c3e8ecb4 4436a574 c274bb50 438a7f48 422afe20 c49d56a9 4332f1cc 42b35c66 c3255d10 443d33ac 42e29bf4 433e76d1 c457b59f 43b2d8f8 41c0c030 43634b9f 43bdbf70 c449a1a3 43384544 42dfd4ee 4492d4e4 c3584ed0 c0c68280 426362c2 43268fd0 4485471e 42d26df4 4335bdfd 44177718 c49af3bd c32b96b5 4309cf56 44155270 c4497544 c32b68b9 4283eef2 c45fb8e7 4366cf18 42686788 437f6fc8 43e8d0e8 c404abcf 42d70834 41d21eac c38a4e68 44964132 c31dfa0b 428b6f99 4482fcbe 447496a8 c2f99058 43245dcb 43525808 4498afbc c2b3d69c 4389f057 c434b8e9 c46bdf61 c257c2a8 4349106c c408f466 c3d94790 41e8fb28 42e3b060 4407ee3c c3ec3184 43294712 43933ea7 430f4360 c3c72188 41984a70 41c2fbf8 4380dba8 c4909f0e 429cfa8c 432ed96b 43eea938 c356c8b8 42cafeb4 4347e76f 443bc314 432b56b0 42c254f8 4383ff05 449587ee 42e861f0 43143e60 436fa90a 44ab11f6 c48180da 432d94a6 416b2b7c c45828fb 44b66772 41393690 42c20975 443bb954 c385f10c c2483f5c 41e7661a 44b30e90 c48cfa3d 427d1248 4315cba6 c4261acb c48791a2 43328e96 430e2c78 c458cb6b 441b1134 c2c1d48b 437ae217 c34cb8a0 441dbb34 432365a4 43667b41 43a85924 4413ba70 c18220a0 424d4fe4 c2a86dc0 c48a46da c33e135b 42f7fefc c3481df0 42bc57b0 43071c3a 4337da79 43801b04 c39bc2ac 42fe8490 42a412af c4a76a3d 440d5d38 428de298 433f9fb8 44959a8c c4335a9d 421bb190 43667a2a 438a81c8 c37f7c98 42019624 42a4ab80 4494dac6 c494c147 42071af8 431b6dbf c49e47d9 44497e74 429643e8 41cbb84e 44a94390 c448bfb3 421553d0 437f679a c4964818 c43031fa c3347f12 4362ab6d 00000080 -> bf606d8e be87c0c8 3ecd883f 43064796", + "440ee120 42eee360 41c8b1e0 c4b80232 444fcdc0 42c29e84 419c72ca c42358f8 4487806a c26dce8c 421b9bc4 44154d3c 43168470 c33129e9 43299413 444e88f8 c138c080 c2880540 438e4ec5 c3f58dd0 42817530 42fd6564 43576a48 44469d64 c41839fe 43007d74 42166182 4478599c 42a23dd0 4256313c 428f04f4 44835080 c2f2a5a0 c2cba5e2 4327e575 4447a878 c3d0c460 431b0dd6 42d1395d 447fe004 c2bcd780 42ec926c 43888fc1 c3f54f0a 44aa1fd8 c2c628aa 434fd3bd 42d96ee0 c4190917 c28ce7a4 4368fcc6 442416ac 446123e8 4339c396 437957e0 c4a7643a c493948a c3167bfb 43588f9c 44aaf144 43de2d5c c2ee8b90 4364ff4d c44c663d c487463b c2c86853 429eea77 c412735f 421772c0 42e33f6c 430238cc 43a2c618 c4ba1a4f c31dafd5 4382d3a9 44296560 449988b8 c24d0328 43753c1e c4aab9f0 c48759fc 41bc88e8 432533d0 c45e9f1c 4488db06 c02b1200 41c3f700 c168db00 c36fa510 c06a4e80 43495470 c44539b9 c4737baa c24f5b60 4283f7dc c42ef81a c4ac4b04 428fe1fc 42865f20 44192180 c4b6b408 c2441cac 4186cb50 420eb740 44997dd6 c307d669 43595df7 4411cd98 c49742a8 c3203744 424f4533 442ff064 c40c8627 42860a20 4376de07 c49a0cb4 43f9f4f0 41a65f98 42e642e1 43daed20 c4615ee5 42c37d30 438544e0 c4b355c5 c48ce30b c300fd64 43079dcc 43c7fc6c 449ac67e 4221b37c 4350bd5f c44ad26d c473fe6c c31d353c 419a18e5 44443978 42d3cb10 c33eaf57 42be7069 44196810 4450b1b0 c2671224 42fb22bd c40681a6 c3e606d4 432a11ae 438b09a8 41bb5b80 4320dab0 c31e7602 43380531 c2094720 c408ffdc 41a3f918 431c5a9c c42dad6f c1ac6ac0 c3474314 42f4cd91 442dd6c8 442a6f48 c3274e5c 436caf2c c1545c80 c380c610 4325d9e4 432c5fc2 c45cc256 43cb6a98 c331f087 432aa1b2 43d70678 c43566cf 427cc388 4382d0ba 4480f8ce c3e73908 41cca8b8 434dc93b c461a73b c439278a 432a2432 42047579 4467aa3c c4bb20a6 c2f299c4 43894639 43b92668 43997790 42d2ce88 42afe9ea 42c8b940 43cb8b68 41c6a400 4392b538 4413649c 435dbb88 43212c72 4388718c c34befd8 c3ca1b5c 42aefeb0 438377e6 c0932b00 4315d620 4336b01c 4299a619 43ef08f4 4409a984 42809850 438ac61e 44a0d28e c401f5a7 c2f93ae9 4314cf91 44626b68 c4babd3c 433d1d00 43196dcf c453f2df c4ba9a72 432e9744 4338f832 448b89d8 4456c030 c33fd21c 41438388 44130ac0 440782de c3038866 42b09bb5 c32b3f68 43ec2c54 c2cd8470 437bd247 42ce4d90 c4a790d8 4201fb78 42aa2f96 c4aae5c0 44aedebc c2c5b22e 438d487d 44a5967e 447fb288 c28008da 428be7c6 c31e4c58 c49c37f1 c301d6bb 43536753 4397b100 c3897908 429748cc 430697b8 c355a530 c490398f c347f678 435884ba 42b0fbe0 44a86656 415bfcb0 4392e86b 42149400 c3a3e7dc c1022b30 42b16b22 c49c24bf c3da1b54 4331b5ac 43632214 c36da160 442061ac c19f02c0 42a5a096 443b2228 44ba38f6 42816b9c 4198520d c320de08 446b493c 41c157f0 433baa4c 417d5f80 c28bf6a0 42871bf8 41a03168 44afa0f6 446b1ae8 c217de6c 43038154 c4a799c8 448a6a34 42b78e18 421670d0 c34c2890 c42958a8 c1e7fe20 4329be39 c3d018d0 c4a1cb9f c316c0e8 421375ed c4875242 c35bfed8 c2b50924 4385a80b 44abc412 c339eda0 4290184c 430755e6 c30b2010 44afd85c c2bb655c 435993b2 c3a707e8 449e267e c12a4330 41a2d820 442661d8 c324b6e8 c29d8bb4 42b0aef2 44a8914c 4297be70 429c893c 4329fcfd 44b5a63a c3d958fc 42ff4eb8 4313d6bd 434f45f0 c491e603 4287ec50 42ef247e 440ef2f0 c2c14fc0 c129a0e0 42033026 c45ec641 44533364 c32963fc 4323cae9 c4897def 44b1557c 433a24b6 42099b82 439b06e0 c4b66083 42a53fc4 431df635 44619b38 c3a24f44 4303991c 4389d85d 44471bb8 44845d5a c30ec000 433c0468 442d3fa4 44268430 432127ac 4338da52 43b25598 c45d6409 43113d7c 42dac23f c416bcd3 4491789e c33ded2b 438a867f c31b48b0 c39dd224 430518b6 438d55c8 c3c52480 444c8fb4 c31148d1 43929c3f 4333cbe8 43a749e0 4333553a 4391c1c0 43decf74 c40f4f15 428b992c 4275aa42 c4238b1b 443e4c3c 4233c448 437ce95f c40381fa 4486ddbc c273d200 43157968 448e0480 c29e80c0 4324926a 438ba380 c492542a 43b801a4 42e41a2c 43597962 44b72dd4 445645c4 c32f35d7 42ff7e31 43312828 4491c850 41985380 4394f21c 4422233c c47a1f9e c3326e90 42329684 444d4464 44a20e76 4335c29e 42c7c810 42b5e2e0 440b5a2c c32fb3ac 4328220c c42852c7 c46a54eb 4219eef0 4334b156 c4a9cf52 c3de4e78 c32f637e 4386c5fc 44877e98 c45ad0b3 4312bbb4 438ce724 4474cc64 c4485266 4340e75c 43821cc0 c43dca20 c42da4b0 423d313c 42f80cb0 c45c6759 43b37004 c3176c45 425f7588 44654ac8 c44be520 42a5ce10 438e406b 42663020 43983150 c222d5c4 4304f4cb 4339c6d0 c4431e68 c1c07348 43724448 c468e23b c29fba70 c261d7a4 428c3578 44756b30 43e4eb74 c3136f8f 431d4d41 c4163f92 c48fc0bc c2a58a58 4326d3e7 44a8b58e c4992a88 c32ecaab 42abddd4 c4a22a72 43fb55b4 c280ac7c 43483946 c4a2b4f5 c339d698 42e24c58 43778512 43d8cf28 c4906352 c246b5ac 42aab78e 44688380 c32b7638 c247767c 433419f0 445bc8a0 c46efec7 428aaf24 436a55bc 44999c32 c3858468 41d315b0 432a84f8 c20d6d40 43aa4220 430f64ea 4351d418 44a3264a c47a2598 4346ab30 430602e8 42e6a530 c4885aa0 c265b6a0 4386aefa 449641a6 4454efc0 42bbd800 4363ea7e 00000080 -> bf160bb3 3f13f5bc 3f115cb7 4287cca3", + "441ae380 4439ce28 42d6d75c 448b5526 44147070 430ebaa8 4360fbd7 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c47933f4 c30e2be8 41fe9e78 c3ddaeac 43eada9c c31f5ced 436dd61b 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c3c0e8d4 445efca8 41d128f8 c2839690 c48f23ce 433345be 435b35ec 440238c0 c49b17f8 c0f3a040 4350e72b c4b81390 c3206518 4328c4ac 42085a4f c3c34814 44829a0e 430d7b58 42b47dad 43aefdbc 449bd850 c34755be 438e6c21 c44b96ec c373cef8 c2d980fd 414bb99d c43c422b 44552218 429fe348 436fe7ba c4905c0a 43ae4768 c2ae3e6f 426f5d56 43910ba4 43e9c508 c32623fe 43364004 c40087e0 c48332ca c33e48b4 43696aee c433bb8a c4b3c202 42bee380 42cec503 c1328100 c45c3539 4340f5b4 4374680a c43d1581 41d66b00 41a36b68 4325bc95 4369b7a0 c484b96e 4278ac70 41d9aa1b 449250aa 44a488ba c1307720 4385f86f c3aa2a0c 440d2484 41e2a8e8 42f7e843 c47bbebe 443b8a80 c0ae84a0 43590cd4 4445b798 c4343226 43333bb0 43114aae 4492bc7a c4498eb2 4295e83c 428c9538 440716fc 449849f4 40a838e0 41b2d488 44625564 4492d5f0 418fa4a8 4339c564 c4a314bc 4437e110 42165620 430caeaa c4bb572a c4b20234 42a308a4 42f61f9c 44054860 c488ef7f c239d794 432feda2 c3168e68 c3e77fc4 c308edea 436267dc 4425048c c42dacc1 c3362146 43944819 43368dc8 c49bcba3 42692980 42dd0e70 c2f7e4a0 c31d7100 c2414020 4393b0ad c35f2780 c3528408 c324ee40 43198c73 c485c308 44ae4582 c289bd32 43038f02 c480f6f1 c4ae193a 42aad518 43601c52 4327d6f8 432ea4f8 42e70ce0 43655f71 4482472e c4904b1d 42ce7838 42d5fb7f 443a51fc 44482fd4 c28df08a 4324ab7f 44821522 432a37c0 c335e5cc 43932ed4 c4963531 c43d843c 4344c712 432a57bb 43db234c 4424cab0 4339b37c 42a3c58e c4a9d023 4491d1ec c1e3a220 4316ad1e c4b4cf42 4432e1b8 42103624 4350716e 4324ade0 c4113a64 c1d8f3a0 412c3bb4 c4193358 4491f9c2 be9b7a00 42db35f7 440e130c c4aab676 c2d37c5a 434905d9 c49347c1 4322fc90 426cf940 43341a67 449d4cf2 c3e51e5c c29038fc 4388c607 c4ab13db c47e8626 c3231c9c 437c814a 438cf168 42f59570 42a76f28 438ffd8d 440bc3c4 c42a40ae c292b5ff 414e051e c472698b 43cf6efc 433f616e 4326c085 c48ccc7b c4ab8489 4293df18 428de72c 443a0d84 43deb738 431163aa 4338626f c23f0ba0 c411d5c3 c30fbf85 4318ec2c c44270fc 44805d00 41d1fdd0 434c785d c373a368 44080304 4260ca10 42f8ab7d c45664bf 438ff7b4 c2121ef0 4364e480 c47004b2 42f41de0 427b61e0 4302c438 442b1db4 c44db4dc c0e77a40 4311ffda 4363a1e0 c49327ea c17308e0 438424a0 43f39f58 c4926bc3 c307b706 42f94886 c4182104 c1da86c0 c26c9188 42bb46eb c3958c70 c454a861 42ae3f74 437ec656 441b87d4 43db0970 4211cf38 4319ad10 44baac64 437c9438 c28ae4e8 4323482b 43c8eadc 44a14396 c33beb4f 428c486c 44b842de c31ee370 431544ba 42a9d887 4472ba64 4400bfe6 4326c89a 42427761 c3b395e8 440d9488 c344bb34 42c75c69 4277a300 c43f1df8 c3212943 435bbde0 c4401ff1 c48e667c c268cc60 4390b5d5 44722840 446acc1c 42a73fe4 4207455e 43c9e404 44b66e34 c13886b0 4394cb54 4452e6c8 44a28ce2 c2cdad4d 435e63b6 c49dbf29 44a9ff86 c219ace8 4380449c 43b095dc c498542c c16176e0 435d4dd8 c4166080 437df2a0 c167d7c0 41764e7a 43cec774 c4239589 433deb54 43644266 c21ad940 439ab3dc c2ac3863 431ef78a 43629be0 c4a27e71 c238c980 4276d3fe 44327b3c 445a47e0 42460480 437cc67b c460a051 449f7a5c c26cddbc 430b9315 c3226400 c4282782 c2d81447 432e84f2 447feb14 c43dc536 c31dca60 42560cfd 43e93df0 43bccca4 428337a8 429e2bf3 c3e21134 440ed898 c1b24ff0 42e091c9 c4b71e6c 4423e978 3feaed80 42768ebf 43df1d40 442beb24 c3094374 415abd18 434e7600 c44dc2aa c31b23f2 4379bce9 c2b3d3a0 43bf6c28 413412c0 42ed0c9c c4487b69 c4b52348 41e8bd10 42e5fe73 c4a80143 c38ac3c8 43248ec0 429f457a c0e54e00 c488fea2 430f4618 438eb3c1 c3920220 c484a506 43039ac8 41be3b5f c3e5dac4 c42bb56f 43023072 4315c3e5 c36df110 c47494c8 42ee73e4 4359d3bc c48ee485 c4541193 43476524 433c8409 c488f0e8 c425de80 4290030c 4190ae4a c496d9f1 c41da69a c345c911 42d4bf46 c48f59dc c49caafc c29f6cb8 43393749 44665dd0 c430a6a8 42905d48 431f13f5 448b23da c45b9f20 422fff38 43048951 c39b09c8 c4a34304 c10084e0 428767a2 44629b38 c4aa2e01 43356a2a 41d869c8 c452d337 4485883a c2cd83fa 437c1379 c3887f10 c4192216 c31de15c 4292e303 c3080078 4477ba88 430cc6b0 422aeb8c c486b885 c11eef00 432be9ca 42ad6f9a 44b06040 c4510a33 428bd5c4 425d3751 c19d8740 c421ff3d 430a3df2 43893556 43a0dd98 4363d860 c2e0db0e 41f2d671 44603110 c26381e0 c2db68e3 41c79407 c3f59b4e 44a786d0 c31aa182 42abc10b 447e55c0 c2cc27d0 c2f3d8fb 431e4958 c47fa01a c2e5e390 c3303ddc 41ae8178 c3d92750 c1097a00 c2ae9071 43877e3b c488ee32 c4557829 c2d916f4 4332732a 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000072 -> 3f5fa621 3eed47b5 3e17e0eb 4280339b", + "c3fd03a0 c44c5fbe 430538ba 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "4329a6f8 c49235a7 c2a4ad51 c37074b0 44b19c00 42274ea8 43721d8b 444f7330 c4657eac c23ac634 434bc293 c35fb4a8 41515e00 c33d906b 42659d62 44ba653e c4af97e5 c2dc5045 43736988 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000004 -> 3f3ed70e bf28a903 3dcf0b9e 43c31da9", + "c4a91e15 c412f2b1 41155f70 437aa4e8 c439b299 4267cd50 434f3e3d 42e9ad80 c3b1eff0 c30096db 42a5acde 41baf240 c444253c c25c94e0 4307fce0 c48cfaab c4abcfa3 c325b110 43087d21 43247fc8 442566e8 c324e288 431fd6c9 c2c7b760 44597500 42b36bc0 432ae244 c45b0cee 4461322c 41571cf0 4357fbc5 c45ccab2 444e1470 c3190ae7 432647f4 44416f7c c49615b1 43068520 435b2783 44ac6250 c48e6812 c2d1e086 4375a9c9 c45d720d c3791408 43270e8a 42ae3736 43f5ee00 442bc3e8 4315331a 4394899c c4876fa2 c3c4f29c c347501b 42f5f3a0 c45c39be 4462b808 c148d0d0 43702542 42a8c320 c499b5fc c131d150 436037f9 44826952 c2be9100 c335c758 435e9322 c48e1866 44726d5c 428d38a8 41885544 c45cd8df c3cb2d2c c1168b60 43080780 c24d69a0 c428a20b c2967146 41c3659a 448b9ce0 c2f9ad80 431c53d8 4314e274 44a0392c 430317a0 41e4a470 437cb428 444ccaa4 442addc4 c285f8f8 438f90b2 43c4ba2c c4ab7d50 c2f5862d 4383170c 43de0cc4 c0460000 4339f27c 435f95ca c3c0de7c c46c87de c30e1378 437dced1 c4a7d09c 4482c4e4 42e38060 436a8b26 44931582 434966e0 4322ad02 438c0683 c1e7b880 c3735a30 43288596 41f1cbf7 c461892d 44b8fd26 42f92360 42c45bc5 4494cbaa c45a8461 4337fbfc 42f816e0 c1df2780 4425adac c22afdf0 4264e5b3 c47668cc 43a05628 42e53d88 4393aadf c40e48b5 436256e8 428ea7d0 43516cff c40bd12f c4a8b637 c1eb75d0 42031c9c 44427d8c 445edf38 4331dfc8 428b6f3a 4470d960 c3940368 c15e39e0 428f1db1 c48dfa8d c48d3dee 42883d9c 4347df21 440ca8d4 43f133dc 4307e288 4264d230 c44e8059 443caa0c c26ff9e0 42d4525b c3053cc0 43b64d38 422488c8 42b97e41 44527008 449e8a7e 4241799c 4389a908 44346c20 c447c722 42ccee24 42550d91 4348a7a0 442ea898 418f2fb8 421b90d1 c43107f6 443e878c 41e6cd10 420fad88 c437478c c46f5aab c3376b47 41bf9726 44a3b8a8 c48a1133 c2a2e7ed 434659dd 4430ccfc 423a8300 c16cbc20 432cfcb9 441610b0 c497f05c 4244bb34 4247d4fd c46540e7 43ef0744 c1eeeb20 438742fb 44524d48 431722d0 c1351540 4385b9ac c3c73640 427d6840 c324dcb4 438f6d46 c48ffaa1 443410a0 431f86fc 43127b3d c4706e02 c433859a c3299d84 42b35763 43703ef8 43243438 c27202ec 43462423 43bd9cd8 44b0c9d2 c3005596 4296830b 444af6e8 c4656581 c1a2e408 4312e564 c4924794 c38b8f88 43221e68 433955f8 c4007957 440253ac c298d1f0 435685a9 441cddd4 c481dd97 4290b9d0 43027cb6 c4ab024b c3ed7354 4155f440 43955e71 43af1630 44b8a4ee c23bd7f4 430970ba c4b46cb1 c3e3a774 41b8a740 43437b76 c40e0aff 444f6e78 c2b6711a 437499b5 c3c12da0 c43dfc6d c31924bc 4270be24 c4a07e06 43adaf18 4309e614 4357a351 447b17a0 c41a5750 c30f3af6 431ca40b 44a95f9a c3c1ee2c 41d1d3e8 4305a736 448c2f6e 44a279ea 4227a890 42b92190 c339fbf8 c46d5cd3 422d4614 436bb024 4469a7bc c4b7e1df c195ccb8 4366e3e7 4482f884 c42fb909 c2a4cd6f 432a1dd5 c3934494 3cc60000 c284c5ce 43101dc6 c4adcb26 41bc79c0 c27a79ec 43062c97 c1124380 44734020 c307a824 42cf0ea7 44836c34 448d5a3a c09c53e0 4345f702 4453fe9c c48a41dd 42d49d00 42eedb5c c476288c 44b6b6f0 c24e761c 4280dd66 43cf9578 c3f1a3dc c25d93e8 41e0b4d2 c47d0c78 c49c5a98 430fefba 432f0900 c4bb6b5b 4386b284 c31e7725 430cfad6 c4adbed3 c494d64a c23041a8 42e843db 4386b9f8 c4728cdc 42e6346c 433bf6f5 c4b300c8 c420a98d 432b1c12 438c845d 42832970 4464c650 433f9cc8 435a33f9 be43a000 449c3f1e c23f75e8 43023a9a c48b1b8c c4849fba 4301a1e0 43545116 c4849f6e c42430da c2bb882b 430207ad 44ae2f52 4389a828 c28e297c 42ab2f23 444cd3d8 c4adf34b 42325c78 434f1268 44351b0c c3964fbc 42e60474 43954d6c c4616346 4440f7bc c305fbf6 42e082e2 c3854d24 c35b4268 4181a460 42e363d3 c4947d94 c48649a4 c32c5700 4208ed43 c459e77b 440df0c8 c28de9d8 43861986 c425bc1a 44102598 c2e04ac3 42c71186 449a2168 c3bd35f8 426eaf78 4306f512 44adceac 43faaaf4 c30766b6 4316dc71 c465d50b c4166537 433e963e 421c2abe c48b12fa c3ac4728 c2e3eb9e 42eb9e58 44b47c7c c2ab2610 c2aaca74 435aa22b 44346ca0 44990190 c2981a5c 43788d54 4287b9a0 c443f1f3 c33384fe 420943e8 442024a4 4425d98c c21f23a8 41c25373 c46fe1c6 c27e9a60 c3265487 43796e49 c492f542 442f9d34 c23168a8 4361c418 c42ff007 c4a6f49f c3066532 437351f8 c47aecfc 44afe0a0 4335c4ce 43790cff c29b12b0 44a911ce 43239e50 43743025 c38d7938 3f20b000 41da2740 412de98a c4a38122 4474f054 43234e7c 435c2d2a 43adddac c49e61d4 42d9c354 431300c3 449599c0 44a0321e 4327fe9e 43469a2d c4154516 c3a5c934 c2bd15ad 42a35807 c49c9dd9 42fef1f0 c1932ba8 4350e05a 443700dc 417f4f00 427b7528 432a8c55 c421c2f5 c44cd574 422f8300 43672cc7 446a10b4 438b7d40 4265c020 434f2f5b 4499fa92 c49d0f16 42d14ee8 42b7491c 44746a10 43f68f4c c314c188 4280e7ee c423105b 440fb0d8 43223f3a 429e2e69 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000078 -> 3e890414 3f33b251 bf28f909 4288deaf", + "4403b086 43854d70 c214b56c 43f2da24 4428e458 43114704 41bb2f18 448f65ac c434c12e 41bbbde0 426c882c c3da059c c332b700 c2319074 4311b4d0 c4b7ecf7 43f0816c c29b3f13 42b87c23 c442f8a7 4433ce8c c2e02983 434012e6 44b4cb42 c36c3930 c2033a58 43022ba1 c42f51dd c391338c c3330887 4337e9d6 c3733f70 415c8800 43401976 43560776 42961940 c49f3370 c30bed00 4382d4de 44524ce8 43c89f54 c33cb681 43786ed1 c45ec685 c4917622 c1381ad0 4295e352 443350d8 4424dcb4 c2b58f63 4198806a 4395835c 44aa7e4c 42f72f74 432da7a0 c41357e7 c3017ca8 42a41290 429f929b c410984e c3198fd8 42dff7c0 4314f750 c45c1131 44ac1ce8 42c867c4 43804224 c2eeebe0 440b1ae8 43312cae 438c7095 41f3a280 c33995a0 3fa38980 4339d2f8 441ea4c0 c39993d8 c1f066a8 438326f0 44a8c26c c46578be 428c3c04 43287686 c48ab1ac c4b3900f c347fd55 4310a34a 4412b5a0 c37c3c18 c21ffd48 41ee2cb4 c3c2708c 44999422 41c1e8e0 42d4522b 4484abb4 431312c8 4238f7e8 42a184de c3cf9b18 43b5c390 42d30314 41cc628e 444fa8f0 c3f186c2 410708f0 42636201 c311a2b0 c45efb31 430d1ef0 43885c04 c4af838e 447b4e9c c2a78193 422b46a6 444d23c4 c447d92c c2718790 427f13ad 44ac1a68 c4205243 c30a38d4 41b6adba c420e65a 448c88bc 41cbd208 43382d2c 448d9402 c4764b9c 42ca004c 42648015 445381e0 c46f57ba 405782c0 42d2bb8c c3512e80 43b684ac 42d7a2ac 436f703a 3e4d4000 447dddec c342dfe3 4318f274 433d5be8 c18e1800 c3398383 43253c7c 43b26378 c31db768 41b9d178 433ddf95 c46103c4 c3516ae8 c2abf469 41fed48e c2c79d50 4424a158 42d68490 4387cec7 444e7764 449daf1e c2accdc9 42b64fee c3156de8 440eb9f4 c3166edb 43806855 c40201ba 44ad29ba 42925120 425822a5 c2d80d60 432da1b8 42944684 4233b997 c429ee79 43f2493c c0f16da0 436f809c 447de80c c4b0d9f2 4340ac50 4306bba8 43aa4e94 c489e826 4339020a 42e00d95 44946eb4 c348d180 4310d8ee 43581f42 44849308 4489c886 c341a611 433213b9 43237b60 442eb944 c336e860 43838efe c3c2c1cc c46c2734 c2e91693 43489364 44466614 c38ca8ac c3097ecd 434435bd 4437a32c c47b8c07 42f18bf0 4373828e c444393b 44b2c8f2 c32e9161 43629946 44a48d94 4484b49a 42850c6c 42cc6800 442ad624 444c138c 43361b50 43869254 c49621a4 44b10c84 c2a15a43 4337014c 42fbfe70 c493d63f 41d31140 4326bbb9 43b230a8 43a27b1c c1fc1418 43477d5d 446fd144 c4039b35 4284773c 428c3d78 44b27eba c406affb 422b2530 435e0d77 43c4b0dc c4a6287e c130a860 438421c4 4463e1a0 c42d42ab 42613a88 43552d7c c4a28131 44289778 c30dfc54 43376ffd c44a9a6a c40ab7d3 41b806b0 436fcbe1 c49307dc 433313d8 c31ff556 4343556b 4393f7dc c432e512 c2fade83 4340b6c3 43269a60 c386bfa8 432adaae 433c2460 c469c694 c2f5ffd0 c27cdf34 430022ca c47b25e0 c44ef63a c2be0629 41b326f5 bf4d0000 c36b6320 42ea2e90 42b258f4 c2d1ff80 44890134 c127a540 4386a172 c2dc4aa0 44725fbc c1f4a398 431c5df8 4448433c 448bf15c c3203e38 4302b9af c451c3f9 44af74e2 c312f8cb 42ea662c 448aefd0 44806186 c28f0298 42f854c2 c3ed3960 c4b19175 409d9d40 433a383d c3afbfd0 443240c4 c1d6a490 413af72c c4a7c906 42313de0 c2a5dd8b 43510ce5 44483950 44755188 c3025e14 435ea829 4457c04c c41bb174 c3054b72 435e6313 44b67b40 c368bc48 430ae812 42cac4c1 c3d296a4 449f9f72 c2fa5ba4 428667f6 c49931df 44934e5e c3031aa1 4348a42d c495e32d c3976ba0 432c7704 43092b64 c3dc739c 44894e86 408efbc0 435c6d97 c3a4a360 c376c898 c19925d0 42a64d95 437189a8 c3827b70 426eed30 42f81183 445c5a28 c3971800 42032d38 4331a553 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000058 -> bf70d5f7 be17931e 3e9c2e86 42a60e4a", + "c4631a7b c43cf718 c1890be0 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "43811ed8 c3c621c4 431e5f20 449b5fc8 c47f2ec6 c27bf3a4 43423b84 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "434ea2a0 44b05ae6 4218080c 449e11a0 4452edcc c1bc52a8 42da6f24 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "44aef0ac 44051eac c0a2f220 c427c04b 445c5f94 c21a7b4c 4352bda5 c40de07a 438d39fc 4340b818 431e50b5 44b87f9e c4b7199c c2c08ffc 425cc551 43b1284c c4a7403b c302006a 425b4cce 41239300 c41bb617 4323e2f6 438e0edf 447532dc c423eff2 bf8aa080 41d71c3a c4b45fa8 43f0b3e8 42ed7afc 429bf933 c43df1d4 447da24c 4333a8d8 43336aed c2e07620 c414e980 c2ff53b9 436577de 44792adc c45068b4 430b91fa 436307ad 43e63adc c49f81c3 c24688c4 43853559 c28e6330 c44ead5c c29d4538 435ce65d c42f629a c46a54b4 c32dcfce 434e96f0 440afa38 44590878 c3182261 4395433d c4189890 c3e82eac 428a909c 43469ae7 445ef9b4 44398548 c2bc3f30 425a6d9b c4a407e7 440352d4 429a9900 42cba8d8 448bef04 c3755f80 c28e1f98 42b72568 c3299f28 c47dff40 c2a69b53 43642983 44981016 43a9a524 42032644 43706d1d c3d66a4c c4a1657a 433b5044 41d94d2a 444c87ec c42b8f4b 431f8eea 434d3b49 c46ea90b c46b8e25 c17e6940 43173bbc 4312bef0 c46213de 43346e76 43886364 446877b8 c4506d0c 4300a502 437256ea 42bb1990 44b688bc 430da240 437fe75f 4488f476 44552360 c2d4738c 4321f33d c0e2f500 c3c6edb0 c3243c02 435032bc 44456ebc 448dfcc4 c2a55af7 435d07c6 44514ec8 c45cde1d c23e3998 436f7c63 444f26dc c4b3fcaa c3120d80 43514bf5 44abbc3a 447b802c 42b9e59c 42a20a31 c4594e5d c3ab9388 4330ee3a 43502fc6 445a9d2c 44529928 c2bd49c2 42eac5fb c4555b2d c48e5f65 c2f4d33e 43945600 c4adb17b c3bb9b00 c301c4f8 43762d71 c4974ed0 444f9acc 42b303b4 434c61c2 4497f8b4 c44f758c c3152e35 43394a25 447fbdf4 c4b0250d c33e033f 431e3bac 4483f562 c479dbf4 431bfe4e 419551a8 c4a811f2 44b793cc c29508b6 4229f17b c360d610 c38cfb74 431cc85e 43937462 43acdd58 449ea0aa 409bb8e0 434908a9 c4b72c09 c3a11f18 42cb9c38 42fcbcf9 44812bfe c406a71d 421125fc 427a23a2 c491a9a7 c4a43778 c28049f6 439418a5 c4351321 c3f32e50 4308f712 4366bfd4 443fdf40 443d2e54 40eba400 41c0ea82 c44a3b9d c47beec8 432eaf2c 41bdaf8a c4a48aab c4a3aa96 c23109fc 43523ec2 4490518e 4434fde8 c331fbfd 43936d22 441e6aa0 c2be21b0 4214a634 430c097c c4282c8e 43b98b1c 42855a2c 43241d1b 43646900 441c9f2c 4327533a 43948290 43e0d9dc c401df5a 430d6198 420d1f8e 433ecc10 c48a77cd c2dab4fc 438222a0 c38f1a8c c2db0790 c1e52e28 437fc2cf c3045ff8 441b6d04 c27feb50 436c7627 44a1aac8 449614da c2a2f4c0 42eabdc8 c4b8db3b c3d5ead0 c2b37b22 436f2c94 4437baf0 c39efc7c c0ba6940 42414673 c49b6b1c 44b69e5c c12fc840 43213e2e c43eaad5 44a79eb2 c2243220 435ef8c7 c4596c28 c4145e53 c3153d4b 4364b032 42307960 c466f8d4 41f87d38 42a3ae7d c4ac86b3 44381730 434502ec 432edfee c4224424 4490abb0 422080b4 434e0442 c38336c4 43103508 434111e0 42bda836 c4a84df6 c4a3cd0c c27c7a3c 426cb969 43d9f91c c49811ae 42ddf5f4 43031bb6 44b81c44 449891fc 4222adf4 431d93e4 c40e9b7d 439e7f58 41e28e28 43406447 444cfca0 42fd3eb0 430e370a 43765a84 4451cd3c c4b1077f 42c842a4 4395ee2a c393c774 449c56b4 430b653e 4287dcbc c3a9ff38 445e7600 c31c6613 435455d4 44ae1df2 c4942cec 42928edc 4252692f 44ac7d7c 44ab7dea c31c7cb8 4303dd68 c3801ecc c47ef8aa c2c2965d 42425e54 c485952c c2445200 c2c10f04 434e9d3f c40ac1ee 44b0c438 43210a9c 43833226 44106610 c47940dc 40a38a40 4185fa28 c40c5892 c3ebfa18 42d67cc8 435d3d54 c43e8130 436910b0 c33b9f23 4284b890 445f6358 44977cd2 418ea540 428ae520 449e6ce0 c3645280 42872ba4 4376a427 c347b948 c3420f00 c21f5194 433db657 444b5df8 43afdfac 430e4bc8 438a163e 43ed56f4 c4771e5b 4319e8b6 43026f3c 4493c10e c443fc2d c345edf4 43710746 438a221c 43efe5b8 43059d12 433d03bd c469192a c3b37204 c3024edd 437cb350 c48b1724 c4a417be c283d1d2 429f1760 44a4a612 c4a75e37 42cc6900 43863589 c414307a c49b0674 c1c9f2c0 42a92fb2 44486d60 4493679a c2c64fe2 4353bb0b c21cb220 448359ca c32becf8 41ff2032 4410afd8 43ad7b58 c29fbb49 432c2859 44958be6 4439f1fc 4234a4e4 42ac4552 4386c9b8 c4a81f8d 424ae218 41cb16d0 c4332fe1 433e9560 c0708200 4357889d c4237b75 43ade424 433f82cc 43395123 c37f0330 44b920d2 c31ad960 4374263b 446258b8 4439f808 c33c3c12 4354b67b c38a4480 c487988a c313dc30 42d894dc c40e5cb0 c4967884 c30e6838 431ee59e 44449018 444f0bc4 c27e5d60 4282dbea c331a6e0 c1a88e00 c29f0250 42a56e4c c2f13710 c3ae3f28 4346741a 428a26a4 c39249fc 43021ea0 c20a3dc4 43834c10 448b4f2a c2ce21d0 42806438 4354c7a1 41055000 c1a9d300 42cde520 4256f71a 4423e29c 449b35b8 430de2bc 430ceb79 449dfede c41f1947 42c24c24 4264504c c3715d00 44b2f012 4332a942 431cbaa6 c428d229 4457bb18 c3067f22 438ab158 441053cc 4487cce6 c273d148 43033558 443cde58 44744754 c2a2c57c 43825853 44289be0 c4347fa6 c1505e80 437eea99 c3393c00 c325c680 c343bc60 42b01cda c4b47d85 c4685b89 c12f3710 4322cc4c 43cf64d8 44832bf0 c2887688 426f7011 43d37218 447a5888 42e35490 430556c2 4391149c 4498dd22 4219c650 42094426 c41495db 4432da54 c3454740 4343c955 c485023e c3f0e2fe c2219694 4386750f 43b00928 44b7d986 42b54f04 4349f9df 447051cc 44955fea 42b34470 439258ba 00000080 -> 3e0f360d bf5e4d47 3ef39b49 41e368e2", + "c40ac689 c3a40b90 c31f1545 43cd4d98 c4222ec8 43090ee4 43247c9f c4733c7d 444fbf44 4327364c 41b06094 448b3600 c42e3436 42fdbd70 434a55e6 c3ae9ca4 42ffeb20 429fd3f0 43090078 c3c2f94c c48d0e6a 428f6d4c 436f7164 436f7110 44999322 426ccb80 4236dc31 43fb26f8 c3debed4 42c21ae4 42274391 446804e8 c2f733f0 4327b0de 4303e80c 4208b960 44499fb0 42840394 430dddf9 c47be181 c49306bc 433bd99a 432d1986 c2644660 4483b99c 42c4e704 435b8934 44998c3e 44bb0900 c1ca21a0 42e24b47 c4b26344 42dd3350 421a6220 432a8e79 4466fd58 c41ad9ad 42bc29e4 435ced6f 43cba3a8 44249e18 43121c7e 43790344 c4ae9cfa 44673d70 c2d640eb 43019ac7 c3e33fb0 c39ac9bc c30b445e 433c47d0 448d9d04 c43f326b c2b4fa2b 42ac02c4 c481aa6a c48fac64 c297d5ee 435d4756 c47c7250 449f8c12 c2e50b60 434bea63 449b803c c3a99278 c325d5eb 42b20ba3 4487ddc0 c3c99fb8 4233cf2c 42925bf6 c4aee3cb 44a4216a 42ff29e4 430af434 c44102e5 c484f577 413381b0 434d1210 43b2a030 c3f973d4 c2498a78 431eab58 44821918 44718e20 c10c8520 436bf9ee c431af0e c3f865a6 c220ee40 43526c66 44b53f70 c4b900e2 41cc94a8 4357fcb4 418b1880 c4638c10 4323ce1e 4345bfef 44272e88 44ac6252 41a06210 439385df 44555204 44a2bd48 4201d02c 438d4b1a c35da6c0 4476d514 c34039c1 4148bf5c 43853c04 43ce5290 c31c36f5 437a9d64 431a4430 4416c800 4300b2d4 4213692a 44995730 c4115cfb c3443d0a 432317e3 44aecfe8 449df97e c2d45f99 418e91d4 c3bd6008 c492c135 432f8c9a 41bad4ae c4460d66 448ebcf6 4333e634 43493955 4454af18 c3a351e0 42b6949c 438960f2 c4424b77 42e48980 c26b0528 4307da90 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000028 -> 3f4551cb 3f102b84 be988696 428dbfa4", + "43930044 c367eb60 c2c26bae 442fab3c c47fd75c 42f3cda0 42ed6ad7 446db024 4432e0e8 c2053cc0 438ecaa7 c4b32bad c4b537e5 431143c2 4354d64e 43227da0 43469ce8 c29207c2 43861596 44b18546 444ca380 42a68ce4 4351764b c315c9f8 c4aa33c0 c307e114 43920eee 44994bd4 4483dee8 c24eb0b0 438f31f5 436246c0 c4574b23 41f1b170 43778093 4491c864 c48ad58e 425f3d50 438eb7ad c4893493 44006488 c2019454 424cdf05 42c620e0 441cd458 42d117f0 42ed2250 4488e624 c456dc89 42956be0 4391ec61 c4ae2193 430339b0 c27d79c4 433d285b c39ed7f0 43ecf7e4 c1a93428 43518c5e 44baf754 4478f418 c1592ad0 4390f688 c3c6788c c2da0f50 c24838b8 4374b02f c3305588 c4aaede9 42f88c28 43051293 44a0013e c3c6786c 42cce4e8 42c3465c c3db3df4 43462c40 c30a16a4 4360e132 c4216df3 44567320 c31ce631 4353a0fb c47b5753 c3979990 4326f7c8 41998190 448b42f8 44aba770 c1f06b68 4299d980 4408fd20 44a94900 43347ad0 42c343d4 c45d2874 c30abf68 42db8e2c 41f0ed18 c3f8a21e 44a98956 432d4242 43780dcd c391bfdc c4323564 c335eaf3 434bb5a4 4457b7d0 c4acbb8b c2bcd7cb 437a2231 41199980 441a9ea0 c21aa930 428f554c 442823b8 444b18c8 42f04e90 43917819 430ab600 c3eb3bb4 432f2984 43163565 43b2fab4 436fba48 42c163a0 43926960 c37a89f8 c30a3090 c3212b7c 43878343 445ab5c4 c49b783d c2153f8c 42d4f1de 44844b72 c41fd7b6 c2a60cab 4387dc6d c3db6884 c43be87c c2ccc098 437b4688 44115930 43913bb8 42b60f64 43929764 43104540 4432eac0 41f99578 4307f46e 43e60cfc 446544c8 41140480 4394b465 c4b62d97 c316fe10 c2eec155 4378a5ea 4277d380 c4a14482 c2c6d189 42d589e4 44a5dd3a c3cc3660 c3396d3a 4303286c c4166b9a c4a0ff58 c2603a60 4308d1dc c281dab0 449535ca 42380a30 42c02211 c49654a6 c493c797 42e7be7c 418431a2 44842010 4446eee4 c1e91498 434e999a 448cfa6c 43f41f68 c2ca9f98 4393f56b 433adbf8 c37d0a50 c29138ff 42fdcec6 c49b813c c2b6eb10 c23d0f40 42b896e2 44babdfa 4499e3be 431bdf3e 42d35d67 43352aa8 c40ea871 428da460 4314736a c3b5f3c8 c486be34 43366340 4365165a c467fffe c44d3d75 431cc784 4388b303 43effbd4 c470b4be 433c3c78 4365117c 43d62fa0 435ca338 c18736e8 42b62478 c48f92c8 c4a88ee6 430e3324 43852626 443d26c0 44ab471c c26cd148 4149093e 4240abe0 c3fd1ff8 c2a0f54c 42817900 c454d1c2 c2f18e50 c1728170 43275683 c49a6d9b 44a8a796 c2a09d2b 435f3971 441b159c c1d21140 42ec3440 42d6d859 428e3ab0 c386b2e0 42c2808c 43886871 c04ec200 43bda50c 42619318 430515e9 c30e1e90 43a52fa8 c2e5c236 431ddd4c c3092150 445bf320 42b42c04 43045e24 445885b4 44a7ac06 c2d07747 43819d8c 44a05442 441866dc 42999fc0 428824e4 4422b66c c357dcc0 4285c5e8 4352fba8 c42943da 4426dde4 41e8e2b0 433f821c c4378ec9 426ab700 c25fdea0 42da5c4c c456ca48 c322d180 407df980 4385feec 440eb310 448c6372 42bce530 4339c61b c43dcbb8 44a99630 c324b2b9 42bf0e83 c44e9a14 448d7a64 43329fc2 43664cb5 c43a20b6 44a37080 c2129130 4377f219 4423a0d0 4300a330 c2f88cf6 41f46f66 44ac347e 44a7fa28 c30bf3bc 435dbd70 c4ad7ea7 43825dec c2c44d9b 438c8931 c3487210 c3af2dd8 c2e95307 42daec0e c33c6308 c3e15014 c30456f8 41cb5dc7 44af2800 c49b4853 433552e4 4367c4bd c3f0502a c3bf9040 c1498280 42fa4844 444ef258 446ad794 c24980b0 42cd4329 c491d041 42ed7960 424620cc 434c8349 c436b03a c336de78 432c2a42 43614657 44282fe4 c4b941cd 41dc0fd8 43496876 44143524 c481edad 4310b23a 437dfb5d 43fd653c 439b62f4 c28e0a56 4387cba8 44480410 c3d92b60 430d5e1e 43415ace 43865ac4 c36238d0 42b8de68 4334351f c276e640 443dcfa0 4335af02 42960cdd c4575cb9 44a33384 43016d32 438692a5 444289b4 42e1a9f0 c32560e8 4395bbba c371dd18 c35b8740 c288dc02 43905c1c 424dba40 c41b09e7 c32d280a 428008ee 41fd3640 43becbbc 42b67c8c 426fe971 c1dfd780 c2a7dd30 41a8bc70 43653942 440b9eb8 44b856f4 c32788c8 437b3a85 441bf7e0 c3eac3bc c2bdadb9 4391d1c2 c4a815de c3e92ed0 c1a90858 43671915 c3ff1034 44af8cf2 c3273a0f 424054ad 424c72a0 c403c88c c0ddf5c0 42d91eff c4b1a3b6 44931e6e c319f45d 42bfd8d5 c3d5c640 430674f0 c3297384 438092b3 c4b22293 44536744 42bad74c 4360d70d c3b04a48 c4a22437 c2ea0b1a 4368aa52 c302a930 c437f3ac c2a7d66b 420007da c47c0ef2 c3d55d10 4323bb62 42703710 4481ca06 c412792f 430e8610 43274cf2 4307cae8 43912ecc 42787b10 42690189 44b782e0 c45759b6 42b7b81c 437036e7 448d2c0c 4455a844 c1243ae0 42653daf c42ea946 c385fd3c 43327a5c 42b08ae8 43a67d7c 441ac320 c2401b34 42ac2783 4443844c c40b68a7 428be608 42ac2344 c4aeb7c4 c38bd7fc c3019f90 434be030 44b51ec4 44a5f162 c19f69b0 41ca7408 440d61e0 42cbbcb0 c29a6dd8 43062c6e c48c0936 43498018 42c92bec 426cbe8a c3f30a10 c3819884 431c8a82 434cc15d 44524b3c c48bd9d4 42f70420 43647127 c384a7e4 43d124b0 41c52370 424a1d9c 449f49c8 438cf614 42e161a0 429a100d 449e37de c3a08250 c313149d 4332f3a9 c4ada744 c4a49540 42f8af44 438c6c04 c3f7f5f0 c36b53d8 c1225fd0 435e9df6 c4949bd1 42581f60 c30eaafa 41b5ad86 44aa94fa c4594152 4329be98 42dd4f5c c367b160 c4ba42e6 c0e77e00 438884a3 00000080 -> bee11a6b be1382f3 bf62f43f 41a63913", + "c49f112d 419676c0 42badc84 c40e2db6 c48b7ec0 c3222f8f 43642585 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c489be72 c4275a88 42246530 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "4493950c c13b4580 40e392a0 c3d3bfa0 43e4a728 c329c1bf 43465db4 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "4463e404 c3496ff0 c19365a8 43fe6b58 c3441410 42f6b2e4 438a32e2 449a279c c44e0ac4 4341d632 433c207f 44641a74 c2c43710 41a9b6e0 41884b07 c41ad776 c3b3dc20 43405f82 4190b3ec c4b718e1 c3875ea0 422e556c 436df19e c49e6237 43dd3fc8 42c378a8 4310f464 43f9a390 c48d5849 c2c454c1 43217e70 444cdddc c3ccde18 430afbe2 4382275f c48c6a59 c381a4c8 c1f03f58 42cc339d c42e6a11 43837c60 4300ffbc 428d900c c46cca31 425d6cc0 c12e90f0 42451f1a c38f70fc c40c8a50 c32de252 42b1f552 c497ff2d 43b67930 4318b986 420c28ff 44994ec6 c397b718 425ae0ac 41834da2 440eb9dc c3eb7b28 c2c64044 436e850b 44b08258 c2e2ce70 43086e1c 4309cec4 43b3c1ac 440e6df8 431f7b6e 4384989e 44aab064 43f503fc 42d05a70 4304fbf8 4382e25c c396f2d0 4222c5cc 432c2a61 c473eb21 43a35598 c32f9ac8 42e13626 c4a5d41c 44b4d774 c1e74dd0 4257bf67 c25cae60 4443d60c 4335b940 435cbe62 444f944c c391c944 424ba904 438b0b06 c3f6cb26 c4ae9026 c2d0e155 435b6751 44050856 c4af7f3e 40c7d500 435931fa c381237c c46c0348 c292435c 4307160e 448773e6 c2fda1b0 beba9e00 431dbdc7 445ed7bc c49e65bb 430aef6c 4206700c c4237b5c 449563d4 42b82ab0 43945325 c4ae91c8 440e2d30 4337a47c 438183ca 4430b2a8 c475ff6c c31eb832 432a2f52 c4adfa9e 447c0148 c3248e10 432a4cbb c47ea626 448e5e8e 4318b9d6 424d9c3b c4988557 c3e63778 432ff650 4383823e 43f79c1c 44ba250c c2a7c2b4 418767e7 c4327b00 c3256e70 432bd4de 4354c20a 432669d0 4309a0a8 4263db70 4308c223 c412c852 c43b290b 42961474 43943b6f c4a02971 43eb5564 433f8c34 42a04dfe c49cb4f5 44469b70 c2278f2c 418a7727 c3c453b0 44a75fca c2719fc8 438a088f c46427e8 44196d8c 434340ee 438ca5d5 44abecea 4486267c c28d4d14 41a861ab c3971890 44a3358c 421ab700 42bca136 c4412e8c c38ff240 4346c196 431826fb c465cd94 43e345bc c2c939d2 4388f3c2 c466f611 4493c0a6 c32c0dbe 43088d7e c3c6853c 44148028 42e84994 438789ca 4397aa6c c4302d0d 4277a058 42cb1a62 c4978c5b c4b6f5bf 3facb600 4380616d 432d39b0 441b2e7c c108c4d0 430b804e 44a0279c 43e041b4 420da970 4247b4a4 c4a4ed8b 440d18a0 4347caca 434ea49a 4448f074 4497e924 4304a452 435a1aa9 441465c8 c3371728 42b45610 42c30919 43ca0ea8 431b3c78 41d91dd8 42ab1226 c4a23c01 c366ab90 c1c9a5e0 4243a354 c424a813 c4243fa4 c2f41ab4 42999589 44963f9a c484c0f6 432cf9b4 431723a8 c4755612 44626f14 43412ca0 432756b7 c411e622 44a21218 c24615f4 434f0feb 4414e3f0 c491651f c3130fe9 4353d82c c3478498 44a3eff0 423c87c4 4348805e c41ffc2e c45fcf22 c2e30b20 413bd2b8 c4875a42 c45360bd c2414f88 431c26af c4579c47 c308e568 430ee342 436bf718 c1a1cac0 4449df48 42ddeef0 433e5c03 44b13f0c c3e89fac 418f16e0 4386e9b9 c303e5d8 c46dd868 434686e6 4355bacf c4735698 44919f1e 41c63ab0 438f7d20 c41ced0e 4434ba34 42a08a94 42db1bfe 43f4c170 42e3cf10 433173ce 4354bb4e 44a12c40 449fea72 c273cbd8 438f6f4a c367ce98 c27c6720 c287fa48 438068d6 c49f62f4 43918250 c2fafcb2 438bc1c1 c3f7b47e 41f9f940 42b2afd4 420ebfae c3a152fc 442668ec c2ef4e5b 42206c82 c45d0c12 42242720 43042dd0 42a56d3b 43ea5304 c363be08 c2e56fd3 4312bfd8 443e44b8 422720c0 c319978e 438f8462 44742624 c49e1f2b 4299b530 41bb37c4 44ba7bda 4386fd68 c12b6360 4392acc0 4484511e c4850b24 424c1344 4331c707 44178b24 43c6e230 42405ee0 436c4d2b c4b4e553 43a82678 4334562a 438d7cb5 c3f45950 447edce4 c01e9c80 4302ac60 c4978081 c4972a66 c2a131f9 4395cdb4 c42fad9c 44866dea c3210957 432cb3c0 c2642ae0 c449c4af c31e7844 42a8c84a 446eb5ec 4404dba2 c3237c47 4372b66f c43c816c c44f2673 c2c7399b 41db52cc 4490ccb4 c43a125a 419bc4c0 4186d0a8 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005c -> 3e3286dd bf56de23 3f03d14d 42be0d63", + "c483f2c4 c4952db4 423f3e90 c473f3f3 43b148dc 43424934 43338415 c427fc32 44a8d51a 432028ce 42bd1006 c2988c10 441e7a98 4345bf24 41beea69 c4a28f81 c496ea8a c13912a0 43235768 c3cc6f40 44ad469e c27f409c 43210938 c483db22 44107934 c31aadfa 4334c41c c346bf38 42b3e540 4309a2da 4328fb69 c428d745 c464e829 430529ce 42fea215 44aaee80 44babbc6 c29afea5 433bb538 c48f3560 4400fcda 41873c38 435cced9 c467d587 4203a440 42db445c 431e9f99 c4368c68 c4b6e882 42ffb3a4 425b0b0d c49e66db c1768b80 c1bf8a10 4312871a c490f2c5 43b52a78 c2087a1c 4315cef8 416aa900 c39ab354 c30baf71 436259ce c493b391 c3ddb92c c3415b4c 42b6466e 448de61c 4386bd80 c3233425 41ef08bf 445a79a4 44865c78 c20ef49c 435299ca c3709388 43aa5094 c2880f2a 4342d99c 449cf490 439735a8 c28633ee 43043ca1 441dc43c 440e4e9c c13c0a40 436c3452 443efc30 c3ced0cc c2a72521 42d652cd 4379c318 44731e70 c31cd758 435b292e 427e5cc0 445e2af8 42414578 437d3958 c1875180 c188d280 42568e60 434b5d66 449d9860 443c4ef8 c25b1fd8 42933179 c49bebc2 443a501c c3339beb 431afaa8 c41cdc8c 444ff748 41cb5cb0 4388178a c4a3447c 442bf5d8 c339ba2e 4302c08e 448f164e c4458e17 4120e1d0 431fb82f c416ee72 4440b678 c0bc38e0 43913c4e 443bccb4 440e0e6c c303c9be 433ed6e2 44b8c7dc c1d2a8c0 c30ec775 43050834 44af040c 43f834ec 3f003e00 43901860 c401fa78 c43a828c 429ca4b8 413ce7c4 c40da40d 445a5b04 c3365309 4373baec c4338b4d c45e2394 427a9958 436fa7e0 44436810 c45db1b0 4336dae6 42a98176 44afef7c c48f50f0 c2532c2c 42656ea4 c42fa9b2 c39c244c c1470b90 42f8fc41 4369a988 c359d1f8 4037cb80 4371e471 43c95a8c c48742fc 432ef30c 42fb819d c44bfa9d c49ed92d c3241f9e 4340c56f 42f4bbf0 4262e600 c2ebe5b0 431d3584 441f9228 44067f2c 42a53a28 43288275 c4af34b9 c3b61478 43113784 436e9e69 42cc8240 44907b3e c18fb898 438016a0 c417e8d6 c3f313b0 429acbb0 438bf6ed 4453d0d0 c4153fa1 c1e54e10 438524e3 c4220774 c43f946b c3034ed0 4234b6e9 c42f2b4a c435e4b0 41cc7158 4350665f c4907b34 c401d4ba 42ad9564 430c92c9 449ac2ba 44872662 c19e43b0 43341254 440e0754 449e5e2e c25cc554 42879435 43410da0 44242110 c2bb9097 43633233 440a294c c49a5122 c31f5274 43860fbf c3afa2a0 c47fd2f4 430b2142 429f1394 c49989a9 c405f7c6 c2dd1334 4311c73d 41b65e80 437faf68 c2afe296 436ad6e8 446c0b34 c470d24f 428ae634 428c2bfa c478c595 c4b9afed 432e79e2 4308bee8 44914702 c4935c15 c2cedd7f 4381b727 44a49e70 c44b32ea c2907aa2 432de2ae 44b3a190 c367aa48 c1c94f70 42766cee c481150c 44025b56 c29f0492 438f97de c27b3160 c288d870 c2608034 43357b84 43cd1d84 44b4e0c8 c328753e 4220ce58 43d54190 43821084 c238b8b8 42f38f17 c4aa8b60 c4a59e48 42010954 434f053e c4826366 43f6f600 c346ee4a 42b40109 449c8e5a 44b6e4f4 c29f5b7a 4381eacd c4bac267 43edcd08 c08a6fe0 420a6446 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000048 -> bf724d28 3dfdd8f3 3e989134 42057aa0", + "c4ba44a4 c4a98675 428a4240 44235b44 442b1818 4298e3b4 434517b9 c3e8b168 44613ba8 432206a4 41916415 c4880591 c4538c56 c26c5c90 437ee91a 44a2bba8 426ee3c0 4328441a 437e37c5 44414840 c4b1e11d c062cfc0 434ca125 c4b1fd92 c4ad2013 c05d7740 42749c83 c0add800 43860410 433f48aa 431903f7 44b94354 44ab0082 417fdf80 43913dcb c4404673 41ba7800 c28a1338 42d387ed 44921372 c4aea98e 42f5f0f8 438253ee c496e5a0 c43d3ccf 42e02a7c 43693ca8 44a832d0 c4b5220a c32ccabb 4248ce84 434d8f00 c440fb8a c22f5098 4200c7fc c48b5aca c2b55220 430ced64 434f0c4f c4456aea 4230ac20 c30d3780 43651a5b 4471936c c3842350 c33a56ed 427a45f4 44057778 c3ac5ca0 42216aec 430597fe c4669fc0 4387a8ac 433509b0 435bced8 c4535421 43be3724 41eb4a20 436b869f c43567fa 44262cc0 c2d9b64e 43158d0e 427fe260 447eaff4 4329dadc 4363e3d4 4344bb28 c2db5500 4307848a 436a6add 43e92d40 43dde520 c3229ecb 42ed6445 44913a7a c4a809ae c3371bc4 4350da5f c456d9d4 439467f4 c32344eb 432d6593 c37bb8d0 43d4c0a0 43327338 4392d257 c41d6db4 43fa6dbc 430f52a4 431b751b 4494982e c49f8247 c1fbad48 431f6932 c41fda54 43f89f18 c2d4a314 43937711 c218c060 c422e52b 42391bd8 42906a95 430ae4c0 4475464c 42d89658 4327ecf9 c1107b80 43695818 43067ae2 4268f127 437dbe88 44916f7c 41cd4218 43492a19 43c29bf4 43f6a250 c32df3f4 4384869f 44938bf6 44a7757a c17800f0 43874cf2 439db4dc c3f42cb4 43170a62 43326f34 c44d10d2 436ab7b8 c324d1e3 42947c80 446e4588 c4a51bc2 c2f141ad 438bf48a 44b53776 448d7e58 c34124ef 4334d3ce 448b29b0 c393ab4c c0f20b40 43589230 44781078 440ffbb8 4326cc62 41471635 41fbfe40 44449f58 431a3032 433e81f6 4396f1ec c3d9ed70 c3246041 4326ce95 44712af4 4422cd20 422eff4c 428d4456 44a8896a c4688e3f c2919b32 438a3807 c1f40e00 43ac01fc c2722f94 43223664 440e0c8c 43c82050 428cc134 436433ea 43dcecd0 c28fa740 c344a517 4318a6f4 c2cf3310 443ab39c c32cd9e4 4389687f c36f5650 448a710a c32be069 4310ae3a 44109390 c2cef070 42416fe0 431043ab 44b07e7a 43ec92cc c31c5520 42ae61cf c42e0afe 44670b34 425f67d4 434f8a71 c49c2a13 433b04c8 c2de0381 429153a6 c3eafbf4 c3a1cfd4 c290c7a3 43842d4c c49b2ae4 c4899b77 433e1010 423880f7 c3e6825c 4391bbe8 c329e6b7 41f87b66 43dfcb5c 441328f8 42e71684 42051832 c48ea4bd 44849756 c2db36db 41886cad 44b92a46 44909eba 41ad80d0 4199812e 42917e20 c3875954 c0c6a5e0 437d6010 447c526c c401972a c212a700 4387f415 429eb730 4483ebfc 41df6950 41912e80 431674f8 c466148f c242e2f8 432c51b7 c1e78540 c1305b00 c31956b5 42eca082 437767f0 c4adcb79 423b2ae4 432fcd30 c4b44cf4 43321fa8 41c4fc30 42996438 c3f576c4 c46260e7 c2de278b 430ebaf0 447d6de4 c41f7e4d c26b7764 434e2bd7 43ded994 c488868b c2a97c56 4178b0f4 c46963c5 c475e903 4193bda0 43713f53 c48c19db 444392c4 4140a660 438b53a3 c293b780 43f96424 41596490 431a4286 4449c008 c46f74d1 c1a283a0 43176ef8 445b9738 449ac81e 430002b8 42b4b116 44473dc0 c4713b74 41d5a9d0 42d26897 43c23a14 c49173f1 c2f7d91e 42ac6e0c 447f4b68 44174eb8 43247640 42e1907f c45adcdb c496ec48 c2fc414f 4301004e c1e6ec80 446fae68 c1aef000 42a9e447 c4b085ca 43cac008 42cbaf0c 434c53f9 43f64aa0 4428a4f8 4296f3c4 4348951a 447d988c 4488eca8 4319774a 435f62f0 c40a122f c4b7578a c2c53b7b 415084e2 439e0664 c453975a c304d4fb 41623884 4353b948 c42e880a c32599c6 436a5ad4 443f545c c4705723 c2a89696 434cb94b 44ba0434 c4aceced 4346edec 43921da7 c2c37c20 4338c718 c2c9c64e 423f5dc5 c364be48 4494c0a0 428346e8 43882bb3 c365b1a8 42c60e00 c1f10450 439269af 446e8f0c c4737ed8 c33897f2 428650a6 4481079a c47454ea 42f3ffcc 42b20cc4 43e37b7c c34ed1b0 42964998 4366f983 43138158 44b45ce2 4325ff08 43168c48 c3413770 c4b50a08 4280e8d8 4371c940 4489ed9c 4499eb6c c2b94877 4364c02d 44457ad8 c48d62be 420aba24 4357842a 432158b0 c431876d 42115690 41a726e8 44807a7c c491f934 4336393a 433221e1 c4869d1f c498efb3 4302f3f0 437853e0 c44799a9 44289e24 c28ec0fc 41a45a45 448c2664 c22a6600 42021c90 430a6856 44b4a188 c47069fb c14633a0 42ff998a 448b73ba 43bc212c c31d04de 43889b15 44989a8c c421d8f1 c1d3e078 435b1f0b 438347a8 c4976110 42aef960 42f53fbb 447f2b00 43e170dc 4327bfbc 4309251e c4b1f8c3 c3f72a08 c27a35fc 42db2fb1 c4689d72 447e7cf8 41d14480 424ddcc0 4385578c c448f8d7 43183b56 42b4f421 42f9e8f0 c48587b4 42b59864 42ed1d22 445cb2a0 c46c8711 c305b900 4291f84b 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000071 -> bf5afb85 becbd7e1 bea9a478 431891a8", + "c3344cd8 44b5859a c27189f4 c493a5a7 c4474681 c310fb7c 413c5503 44a272f4 c463e618 c2dd3fa0 432e439a c485eaae c377df48 426a5580 437c6402 c48c65cb c454bae8 c33afa68 41db4133 44ae2ce6 c407f391 428becbc 42fe1a16 c480e4e8 c470686f c1b47ab8 42ea35d8 c3e96cbc 438d2518 4278f358 431688be 4417a31c c3428fe8 433efd8a 434a189a c21e8020 440ac850 c3269236 4339748b c35871a0 c4882ba6 42791d98 41a34b22 43ebb5d0 441e4f10 c221fab8 435cb29c c49d4c9b 42e706a0 4286ed08 4391662f c48992ae c4809013 c338791c 435d77e8 44bab816 c30c6468 3f56f400 438b637f 445a0640 44492974 428160c8 42d8adb2 42f33eb0 44332110 4311b2ae 43573ed2 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3ed57aef 3ed5aa1a 3f4eb602 435f814e", + "c35963f8 43c641dc 4303091e 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c4b3fdd5 c46c2cb8 c2fe505c 4438dce4 c3246388 42e08df8 4359f245 c41e67c9 446568d0 432a2cfa 435152f1 c3deceb0 43070d10 c225dfc4 42a3ffd3 43f6b964 c4aee774 c2fda508 425dd59a 446bbd38 43ef7448 c11f0020 42cba039 c15ea500 449cdcee 430abbc0 43526556 c4200462 c4975236 c2f86d57 42984b72 447b9c98 441a33a0 411ff6e0 428e832c c4a2aff6 c3d3a100 42a56004 41d3ff54 c484b3fa c49fe24b c103b120 438118e8 c38181f4 448474ce c2343258 42cd26f7 c40d7080 c46747f2 c29056e9 42caf5e3 c435c92f 44b28342 423525f4 43920483 c3dd59c8 c3e657d8 c30e8b10 437a2c44 43938e28 c499df64 c1deadf8 42838b0e 43ae9ea4 44140238 430cbc9a 43454c9d 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3e897705 bf75387e bdd06902 4293bd69", + "4462ae20 c440ebba c321b998 c48c3b52 c4b783a8 42c08a74 42790c10 43b2f820 449719bc 42636e88 4323f7d1 42a5a230 c3b49744 c321fe1a 436b4d27 448c41a2 44b06da6 430fc784 42132a86 431d6090 44868c5c 42afc888 4290db9a 448df37e c2f8d940 c3316b4b 43448969 c41fab67 c4436d65 42ad0da8 4126611d 44352360 c4169891 c315797b 414c2976 c4b63f55 44b73792 c3135f39 4390fbd9 448bb3fe 445b3de4 42ba7efc 430a9dad 408fb800 c4180e6c c32bb1b5 4357eb5e c3f6e8ae c37dc1b0 42c1eab8 435ccaca 44b8a5c6 43206cb8 c14f97f0 42d141c5 c2e1bab0 c499a388 c1a554d8 434b94f2 44aa50ee c496f532 431d3e08 42f054f7 c46b0956 43d327b0 42e7867c 429878de c43907db c49b6fea 42d250c4 43856377 447e2dd4 4493c422 c2e02027 4366708e c48c5f2a c427d49b 42ab051c 43329216 c3a85be8 c3e66c10 c299bb2a 4383653c c10e5c80 44b78af0 c344684e 42811092 4478bb40 446101a8 4196d878 438af021 42f17840 c2d7b880 c3438226 436ac71b 4495b4ca c3dc24d0 c2c27dec 4381ce31 41bc6fc0 448062fa c18a5250 42a4f023 43e4c7b8 4485dbf8 431b2f86 421a1628 c3f98d56 441b91f0 c2ef7f0b 427fefd2 c3b937b8 4489a55a c2b03092 433a4269 44593514 c4b3785c 431923ae 42865bec 43c5aed4 43980bc8 c2252fc8 430d73ca 42e62b80 447e6354 c277b0e4 42ed6b0a 448f8e24 c325c210 43105e3a 436a01ca c4b43f46 4484649a c32aa11f 43282a39 44921aa2 c4a5c57a c2e0a970 43439f41 c495719c 4499fc92 430dc3a8 423816ee 43951184 c3d08510 41970118 434d3990 c46cc985 c390d7d8 434231c2 43844812 c2b1aa70 c4a51b6c c2d8d966 438870d1 c3232e98 c4ba30e4 42a939a8 4375de13 420d2d80 421d4340 c2e39221 4385e366 4481f0a0 c3576cb0 c3054680 4321ceb0 445c38d0 442fc65c 42ae8b58 435e2ef2 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000002a -> bf70de81 bea50e99 bdd4baf5 4289ff97", + "c49f9686 44b9d994 c31977f4 c42a97b5 4484b6de c3010cd2 42bd5b70 440100c4 c4681196 c103fe40 430f2f91 44b52b30 c41476a0 4337d9c2 433efde2 c479cbb4 c4961421 431a72b0 42dceb2a c38d3ec8 c48b621c 420d679c 435393d0 44ae9282 c426b7f3 c303866f 42849f26 c4b29b58 448e55c0 c1a043c8 4350b986 c438a2bd c49f29ea c2d9e815 4390c8ac 41babd40 c47f5970 c302c65e 42558508 42ccf0b0 42800bd0 4307e782 42cf1147 44311ecc c3532158 43115b24 423a536b c45b9c7c 4495c2f8 424ab448 434206f0 44790b94 c3ac1dec c225c108 422cc651 41af6e40 c4b1b9ed 42e1244c 43954043 440909cc 44b53328 c2b96042 436fcf0c 44347e4c 445c96c0 c2eba56c 4388985f 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf7c7871 bdda052f be01bc68 42e44c3c", + "c4449b9a 433fcbe0 4346fbb0 4431668c 446a30e8 4319cc56 42bb5bfb c42f9d37 44ac19aa 4165c720 43022702 c4aa9bc2 44b69f12 c3164278 42a6aa1a 446c817c 448472f0 43136cec 434ef4d1 c491110a c301d938 c0ea03e0 42ef4d52 c4715430 c2c6ca70 41a31020 42a6c67f c4a9c197 43759df8 4330d118 42960664 44aaf058 c4a81bc0 c2e6bb5c 436d1492 43b2ed8c 441be2f0 c321ca1e 43302b93 420ee5e0 44746ecc c2ced4a1 41ebbd64 c43edb50 43718c50 425c4710 43957349 c48586ce 42ed7230 432a2070 438d6eff c3f4ae9e c44bb476 433882ae 432646a5 43c9eaa8 43c1f264 42c6cca8 42b067fe c43306e0 43c526d8 c2cf0355 43505a57 c4b52a5c c40d3567 c184dbd8 43950887 444e8dcc c3ee06f8 4255bc30 4224b0f2 444140dc c41953ea c3051972 42ba9a34 c4558ef7 c3801e14 c312f78d 43375627 4476e564 43243e78 c31c58e6 431d3ecd 43ead558 c4bb1468 431aebc2 435cf567 c4999643 440186e4 c30ca151 43948c55 44ac418a 4474652c c296a32f 4384ab2f 437e07b0 432c7578 c333e7b8 438c66c0 c48dbcb2 43d882ac c2df5b58 4372c210 44983f06 446e5e44 c2fd6663 41afda30 c4a49260 440285e6 c28d1924 42939cfa c11da900 c482f46f c1be7e00 4356e63b 4285d0d0 442f1e50 c33d0834 41692dd6 c362bdd8 442d4754 432128ce 421f2293 c4665505 43d76548 c30cbe26 438c1cd2 44b5728a c41feaaa 42a20e14 4348c0c7 c3cb7924 c461ea40 c11ba9b0 427e6e63 c3f9157e c4111c8f 4222cde0 437d3b69 446e672c 4481beba 42850a90 4302c1d6 c3e26318 44a0a696 c02c3cc0 43747ba9 c3abea98 439dbb04 c262ed24 43806c00 42b46610 c4ae9349 40703500 42f6c721 443514d4 c48f3645 422f8eb8 42ac3014 43fe8598 c43a6baa c3310485 436a90cb 44b0cc58 43f8c988 430e44c4 42c0cd75 44035504 c4374998 c24bd4cc 429127b8 c48a1917 c4697bca c2f1adf1 4331beda c4a33949 c2221100 42cae6e4 42ad6745 c48320ca c3f0a0f2 41948ca8 42efa647 44a0ba40 4483c4ce c314eb3e 42d35563 440e0c34 c49bbe95 c1b51450 42913052 4413988c c3f0f5ce c3046146 432e43df 445865ec 4492f9fc c1b02f70 4350220b c4a039e2 c4647f64 c3129e71 423e8937 c44896bd c4861aea 42af8eb4 42d9ffc8 447c6c80 44a19b3a c28afe04 42a7de95 c3cb49f8 c3e825d4 c31b2c46 42d3754e 4419c35c 44060ff6 430a4d8e 42334a89 42e4eec0 429ab770 422da964 43353961 446a272c c480b6c6 40f31320 436fca33 c4b422b3 43c53430 42e7ebec 42707276 c4abeaf9 c4a118a0 c2f697ec 438f792d c45c6766 c37a0d58 c30d8970 436e0102 c48a0616 4456be60 c02b0040 4365f314 4441d0f8 c469a6a6 430c8c26 42dfe793 c44c87e5 447e3658 431090ca 42275895 c4aa2eb8 c4035a34 c30df9ae 43289d25 43823268 430112f8 c291f1fd 41ffd27b 43b91814 44a02688 c28e9bcc 428af4a3 c4869b5d c481f3cc c2e548b5 42be8e9a c481f23e c480986a c316693e 42bb40e9 42c38d30 c4a52c75 434341bc 436407e7 c4af5348 448348d4 4304cd72 433ee25b c411f453 c4796d54 41d046e8 42799962 444a8a9c 44071736 c3155a32 4359d6fa 449f8174 43d93888 c252e51c 434a4ccd c496583c c4a11c40 c306dec8 428ad2e3 c2d47c80 c41ed4ea 423bd65c 43397053 44b226c2 432bea18 c2f18899 41f2e506 44213ba8 435b2320 41f70150 43941031 c3f4eaee c3a0273c 40b95320 435fa50f 441e438c 44115f50 42d85024 430e3ae0 c3cf071c c4869b2b c1cfdec0 430fab41 c4b16f3e c11e1a80 c2520e2c 431d8320 4458aa94 c2eac980 c2f891f7 43100b2e 4494c466 44547480 c2aa343e 4361d47c c4487ad5 c44cb75d 426dde80 4362f228 44b0015e c1761480 c15b7240 428643fa c494e68c c487024c c2400d64 43245064 c48a9fcd 43c53a14 4334d582 42ff0bb0 c416039f 441b24ec 430927a4 42cfa685 448471a6 c480d2cb 41f9fbf0 4314b9c3 c4698ed6 440e10b0 c2aef0ae 42a7620c c3ae5cbc c49062ec c324071b 432a7ffd c493c152 444aad84 3fcd7000 43165a30 c4aa907d c4b32304 c0ab4a80 4382bb0e 4403810c c4447a09 c26334fc 4385986f c48fb912 447c72d4 c242ad24 425e96a2 41d2cf80 445506f0 c3071aca 42821d76 44a52516 44ade41e 431c6c4c 42006b16 43df632c c47745a2 41be6660 42b65b9c c456d6af c4584c3e 42fa99d4 43944128 c4a8bba2 4474e3b0 c1ec6170 42e4db66 c48bb2ad c2bf5490 c25fdb54 42b50dd0 c451d1b8 44b26ac8 426d1d48 433c64f1 445fdb40 440f70f0 c25d663c 42e027aa c40dae28 c48d0795 42c44288 4337eb62 44a9c632 44960766 4234e620 424d0a79 448e313c c358a170 430604f8 4383dab7 c2df3040 c45bfb69 4275b208 43107bc2 c361a8f8 c3c2f328 4306ba54 42bc53d1 c3864ca4 c4b4aa04 c33c06ff 41ae5c06 c36428f8 449035ae 433bd852 4390de3a c40a5d7a c4281246 c2b1cd56 438fdcb6 44678248 c45b5e54 433b88a2 420ff7c8 c2ca54e0 c456da7a c339e858 4255f6a1 c456e830 c4221bf5 c0f43d40 4354e86b 43c79838 c2313760 42fbe6e0 415edfc6 c40555e4 c46ca793 c2f7b3a8 43063f86 4484e9ca c4a0b90c 43309c14 42bddc71 c4984106 44197d50 c301b092 41ee28bf 44a16c98 43deae80 4302b496 4338f31d c4833bee 448d8456 c32d8745 42a811f0 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000077 -> 3f601ab2 3eb49f69 bea9331e 42cc7575", + "4498eb22 c39eab6c 43083442 440c2370 c49eb6d2 c3155adc 4325d1e8 c3fea040 c38a961c 432f7c62 41f1a971 44ab05f6 43d59504 c3139437 420b379a 4482fd56 c494c976 42bdd17c 42ae4562 4403fa50 44b9dd42 42d14ce4 41a79654 44af25a8 c4525f3e 41d00260 430e8e6d 448d9dd6 4314eb78 42cc8c34 4303867e 4332c090 444ec54c 42cea138 42807629 44b3abac c498629e c304f766 4395392a 446c2f00 443faa54 42d2fdf4 42c04907 c445344b 44baef10 433dc2d0 413c25e8 4412c880 4254e960 c29f6918 436a806e c4005205 44b77da2 41c608e0 432ece25 c446202c c474e05e c2539c44 431187dc 420d1ce0 43fe4860 427f7738 436c6071 43e3e300 426bf0e0 40814040 42793a0a 449009ae 44a684ca c31d6f90 436524a7 44a35e7a 4435f8d8 c19c90f8 438a75de c449138f c2d48240 42f08dc0 43917146 c43f2c81 4330cf40 42d11a9c 42e4be2d c43c529c 44b493ee c323f0f8 432f613f c456a4ca c468814e 433477d6 4373a17d 44296c04 44162d74 c0db1580 4250a6eb c4978ac8 44b52c8a 426830c8 435a0bb8 c20b4a60 445c86a0 c31736bb 4363fb51 c3850078 43073650 430765ae 43340530 42e56a00 43d4342c c282e220 4369a9a4 c3beca84 c3973ce4 c2de3413 438f28c9 44990d9e c4162d35 414aeba0 434c6947 c3537488 44a4eef2 433a9fb0 43534a8d 44b8d472 c41568e2 c33c1788 429c8a46 c43430e6 c411bccb 4301cfc4 42a448ff 446f98dc c49c43e2 c0fdbe60 430ccf37 c33d1640 c4b7dafc 43336d82 43561c84 c485db65 4139c380 c33b2f21 432ffa76 44849958 c4700f6c c1d6fbe0 42d17f8f c2840dd0 42b45e00 c2d233a7 4370e02f c311ba20 44b2069e c2a9b149 432915d8 44759b38 c3586d30 42cf066c 42283b76 42379b20 439a9e4c c28ac65e 429ae15d 446db488 c49aa3ae 4334b712 42bbeae6 449d1fda 444b6250 40cae760 43874576 c3df3510 4475e7cc 412ef2a0 438b37f0 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000002b -> 3f05c4fe bf546ab4 be48d4ba 416d9b67", + "c4888258 449a1f7a c31c6cd2 4418496c 44411138 42b7bf50 41eec542 c4b0d90a 445f01e4 4309e412 4370ab21 44a1da32 43b9634c c3445ad0 42a58b33 447d84b0 c46999e2 417fcd60 4275b67b 44609d98 443f8c9c 42d4c674 42985105 c485c2c6 c38a6a7c 42a57328 4161ee62 c3f1c346 c3253750 4245ae38 430bbef9 c3cea40c 43d32e64 c1d595a8 433454ae 44a72eda c4411181 42f9cd18 437f3d7f 43914558 c47be998 42e6d3d8 42bc5d8b c4935a30 c18d7dc0 4342f4f8 42533362 41a1bac0 43dd3a70 40a89600 434368c1 44b6c330 443a3acc c31cae94 43434218 c49f8c09 437e7bf8 42b3bb68 42bf4a0f c4a8855f 44219b2c 42b7b04c 43333565 c474a7c9 c39a0254 c1d5dbe8 42bcacc2 c4683f47 c36ab400 c29be83a 4336ae1f c3b99454 4411bc20 4200c944 434241ed 44af1300 c291e5a0 c317924b 4346449a c36f0240 4331ad20 403f3f80 43527d08 44a1e8b2 44b593fe c17fc920 433c0a68 42c2f440 445cd33c 40a3eb80 42e5604a 4256ece0 424b19e0 42ec0940 4384cc8b c3447b78 c45d3524 c319672f 4357d299 c4a4a632 44136e24 4336e65e 420a919e c3ec7224 449ca54e c2bd8cf7 42bdf88e c479238c c2a27430 428990bc 4337ab2e c2d975a0 c49f3357 4315ff96 43188071 c45aff2e c4ad25f1 4272c0c8 4281f582 44a3fc34 446f6d48 42cea93c 42f99fc5 44995c1a 44a68bc8 c328fc10 43819b44 4495b9bc 441556d8 c2ef4ee0 4366eca0 c3d33678 c384fe2c 420d3920 435be3b4 4398f6b0 c36881f0 c271a5ec 41611fa4 4425dc24 c479c3cd c1ac6bd0 41da32a1 c48d923c 449b3b16 431ee506 430a4f21 43d4e4cc c413414c 428ab1cc 42f9d0e4 432001f8 44a01728 42d9f39c 42a02f91 44a457bc 433809d0 c3019832 42fafba9 447f233c c39070bc c229f18c 4311ebfc c42af493 4499ce48 c2d0446a 41c99c7e c2199760 c482c90b 431bc38a 436dcc06 440df9e4 43ce8734 c149ff50 43696414 c3be52e8 4415119c c2b5422e 439546cb c4a9eaed 43caa3d0 c2e20f22 4336b9f2 c4b1d7ec 44647908 c2e938eb 43075cbd 43d05910 c3e62720 42e4685c 41ae42c0 c43e231f 44a90570 c3027594 42cc1d84 444ce56c 44b3088e 42e601bc 428f2676 4402b64e 44814e84 43361908 43184cd4 c3809fdc 449172b2 42a58bdc 4389c4f3 c2f92e30 c4bab3ea 43136ed2 429ee750 c41f0f82 c46f3f64 c26dd2c4 428af3cc c46b4a2d 445fa204 c1b69358 43118def 441741ec 44668968 c20a5e30 424b2342 c3c967d8 4482cae0 4179bf60 4360300d c2d8ff90 c482e037 4346d8f4 42f980ca 449a37fc c4a49682 c28f6af6 4289331a 4406e2f8 442a0d54 c2fee9f0 4247f3a7 c496dd0b c41b6243 433d8686 4342aa02 c2841ae0 430a0fe0 42ca2b18 41e7ea39 43950b54 44afc91c c313893c 439260a8 42cedd30 c406f0bf 40885660 4382b35a c34e1b40 446bf4d4 c316040d 432dfc87 c3e2be1c 44afa20c c19a2f98 42c65579 c4b99f4e c2a2ad20 c28968a2 42978e4a 44871a72 c48383f4 41218b80 430f4491 43af3aac c4123551 c2506df0 43009168 447a2d2c 444f8f7c 42821f6c 4377b730 c4977954 c29ebec0 c3105058 43199226 c4b40f90 c4b33650 43107cb0 4335707d 431757b0 c30a84b8 42d89dc8 438275b8 4398a9d8 43add4b0 42e73db0 423e09a4 447fc0e4 43f98320 4252d324 4137a455 c453a9ef 429b5720 c2ebd5fd 430c853f c3297080 4400b632 c262e1fc 42991089 44a8e164 c4955390 c33aaad0 4347d1d5 c4828450 c4120fb4 c143d570 4383eafb 4476dabc 44ab4782 c2a9e480 4393857c 43a78128 4431cd30 428d1928 42ffbd6f c3b637a8 43f0006c 430f1b82 41245353 42400da0 c442b55a 41d91f18 4269fbc4 c48521be 43ec5658 42231570 432f5a20 c42dbf3a 440ddbc8 c3336117 42ddf80c 43f5da98 43c5b1a0 426150f0 430c1be0 c36e83a0 c48feae4 42aaa0d4 42bffbe6 c4849152 449b2886 c29fd650 438537b9 c3b5f06c 43df49e8 c22a84e4 43156820 448311a8 44601154 c32b6163 436d3875 446b62a0 c3d619d4 42aabbd8 4357e35c 42cbacc0 44894a10 4074f5c0 43196006 44187e40 4495b544 422b2230 424a64c6 4497f288 44a4c78e c290cc08 439314ea c497685f c44c3577 43426196 42ac2295 44a784b8 4337bbc8 430dc744 4338a6f9 44a511c8 4409b16c 42e6d0e0 4319e026 c430e68a c48e0b6a 42b087a0 43122da8 43b064c8 c42df9b6 415c0070 42c5d964 449ce45a 44a192e6 4325e1d8 432ac5f3 439ffa10 c452d56f 42151eb0 42a369de c410e6fb c47ed7de 433fa06e 43096547 c3ff3788 c381ac20 c238da68 433e521c 446a9a58 4467ef70 4306b8a8 42a6826d 41075e00 c491cfdb 42d7d1ac 43804d2e c49e67d9 c4b6752e c2d7c9e2 4332cfd5 c47114a0 c487fbb8 410f5a10 4342c6c8 c38e71e8 c4b6dcbf c32f66e6 4267d804 c40c3cee c34d5000 42790a88 435d11ea 44af8448 43a0c594 c2a3a368 436c316f 4419649c c3e229bc c3057e3a 43805590 44318f8c c4966ccf 427ad7b0 43746bce c34e4fc0 c423aba4 42f30d98 4374174f c47e2ec6 c4a35e5a c11471c0 4336078d 44b73bea c4b75759 c32c848e 426c86ac 43ceb728 c3ed23f0 c33a4bed 42cc24a3 c3ddea40 c452afd7 c298f9ec 42f11eb8 c481e6be c492a253 c2ac5a86 4386de1e 446cc97c 44b7ac92 c30daae7 435d3977 44823128 c3b47994 430a2514 42047188 c268c8a0 4420899c c2eb415f 4236fc7a c45a963d c4384959 c3464869 42a439db 44aa88aa c4a4153a 42bf5cd8 438fc226 42e6dab0 c48c3cd3 c30f2236 42e65178 c40ac682 4482cace bf171f00 43201f56 445990b0 c428593d 42779a88 42cee83b 44ba749e 4499110a 43449908 426eb2eb 449cf1de 443a5580 42c4d238 433a97c2 c47ab43a 44b7613c 42970ddc 438af1fb 00000080 -> be53045b bf4e547b bf0e0f3f 43388f65", + "448c404a 448bab3e 4160d1e0 c4a4f50a c35c8bf8 c3238a27 42ea77d0 c4014c1e c3d64154 4297bf10 437fd02c 445468f8 c381e8a4 43475c1c 4384c4a1 c40139dc c41dcbb1 c2ebf276 41d99226 448fe102 c48c3b45 c29fb38a 42ac6b18 4479c024 c3fec7ec c2eaf361 42cb85e9 c48aa6ca 445a6b7c 419e47f8 4308cae0 c453321b c44d04b9 c219a53c 43608ddc c394df28 c413d88c 42b7fa68 43801cc4 433ecde8 44a9ae34 4287b05c 4329cb4d c414a435 c404412f c311e0a9 42d65466 4439b85c 442ad60c 43073634 4354d3fc c242fb40 4488ac64 c2c62946 436da256 44676c48 447b3c80 c23d2290 435db0d6 c451ded3 444e0c7c c2d06464 43258ca3 4466c678 c439a63a 424ec2f4 432b67db c4b7f76f c43514f0 c0faca60 418998f4 4332e628 c3d7fa1c bfdc5800 438c05fd c302af88 443b04f0 4338643a 431db56b c464deb9 448b3902 41dc2298 42fd7063 44a9f2ec 4483455c 433562b2 42e1497f 44b1e0fc 43b28a18 432c82dc 432e12cb 449de7d4 c4bb7f8f 424e346c 436ec5af 441fba84 c4898988 42c2a6b4 41c27a4e 4411d36c 436c3448 c28b7f42 4317d481 c43d7815 446ae6f4 c3101723 423c2c8e c3c4d9d8 c4062c4b c28931ba 41d95afc 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000001b -> bf618487 bdbc0851 beedb33a 428f17fd", + "c42889b8 4376aee0 c22f5db0 447cc584 43798a40 43370ecc 42c16c13 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c3325758 c4b5dc37 c1e1a638 c494987c 4332e2a0 42b5b5b8 4356fad0 c45354eb c40498d3 c34594fd 43892fe3 446c2de4 43ae286c 41920598 42047a85 c48155c7 c487008c 42a839b4 43797604 44b5f104 43e5dc88 c2a795af 4383735a 440fd358 c4a94369 c160ca60 42b6614c 4378ca58 448cfa80 41a02c50 436dd81a 443bc14c c3728b68 43469a52 438c9bd3 c47da866 c3fae49e 42a790f8 43323e03 c3951a04 43f2e8b4 c31ed944 41389b43 c4a790a7 44ad6356 c330fb6c 438a4221 446375d8 c48c2b35 429189ac 430a861c c43d7a57 c2a057e0 c2a7ea65 438bb3fd c4960bcb c3066148 c2ddb466 41cfdd2e c497f7d0 c31e7c28 c31670fe 42da85fd 444cdccc c451b7e3 c3077b69 42f98988 43b365b8 43a59968 43272c60 43787ca3 c3506410 c48ab2f0 c1ef9698 42cf7a5d 43171690 c4211687 42ff216c 435d869c 44b8284e 43098f90 c1153700 430e726b c4657c14 c4936ca3 417529a0 42b4b276 c48b1b8e c4a22e0e 43062460 4356e8b7 c4924c98 43e78420 c0baf5e0 438f3f38 42e441b0 4443728c c2d6470a 437b81e8 4461ce10 43f2afb0 c2a075d5 4283def8 c45ac99d 4486d52a c342f0b6 422ffba6 c4a971d9 44af134a c2423398 43764072 43cc70b8 c19cb9c0 c32e639a 43292e36 44b06eb4 43fac644 c30cb20c 434b38c0 44088d3c 44901628 c2baa24c 432a1a44 444e4884 c4587cb9 42a9fff0 436b1884 43d91d10 c2a9caa0 42e427f4 436f083d c4a799f7 44b64c60 432b5498 42d2fdd1 c43e2da5 c422259a c2c94178 42d5fd9c c4982af8 c36cc2a0 c2d8dde3 42642099 440dac14 c4b3bd5f c32be25d 433cc177 438779a4 44a3af8e 43412d22 43834651 43a880bc 43459d48 c30bb6bf 4389f131 c39d6004 44398290 c2037618 43958e26 c4845ace c445a841 c13019a0 43312b5a c46ebee4 4385496c 42d14754 43468c3a 43436e50 44300c7c c29e0644 4351234c c373bdf8 446b5890 41e699b0 42ab5fa5 43e8f8ac c4944d3c 431145d0 4364c2f6 c4869a26 c4977658 c2fb4cb2 43576442 c206df40 449b6030 c3010714 43174917 447b8f64 c4b73190 432daf58 431abbde 44893ce0 c43a607d c2fa11e9 43816020 44a8392e 43e4b4b4 434033d8 421c0b61 c434ad9a c36fa030 c3337f72 43810f52 43c909f4 c418ce64 c19941c8 437193a8 44b92da8 449225bc c2bec707 42bc8587 44900fd6 43f53ad0 430e5948 41c6364c c4a8882e 44462d90 c324ed06 42af0e39 c384dc08 c42931e1 42fbcd08 432a8fb6 446163b8 44638a54 43004934 426a0419 43bd92b4 4420b9b4 c29615d5 412d31d5 c48cfdd6 44455b88 bff2f900 435b124e c4aaaedc c3fe9078 c32a4fc4 4283a6be c2e2a1a0 c3b5aa24 c02968c0 438e1fe8 443b7778 43d77ca0 4237de24 42897060 c39c8fc8 c48853ee 42f5be94 427ddb06 43425b10 441fe078 4296e398 4393c7a7 439e0f78 c0e6d500 c331f945 437ae29f c292bd40 c4215c69 c30322f7 42b61d68 4367ffb8 c434fc93 c3056321 4234628b c478d372 c488e62e c3458e83 435ae268 440e8320 44943192 42f41654 419b7c3a 4452c4b0 448a6626 42f2f6a8 425df595 c469a5ca 43b159d4 42d94dbc 431813e3 4498ab84 c48b7ca0 c1c63688 430125c2 c49f8ceb 41fd9280 c319c663 4328b3d1 c42894db c4405034 42ad912c 4275c19b c45bf384 c456982c c252a228 431877f6 c2893ea0 c1928000 c33a4ce9 42ab333d c48a9e54 c49aea9a c010d8c0 434c2f45 449905c4 43ea1ca4 c2ed1183 435f879f 44116b18 4495539c 42637868 43814f54 421eab40 4408ad3a c24c2db8 430c4bdf 44707834 443fc248 c335677d 4348b92a c4b43c31 c2f6d930 c1afc9b0 430b7743 c47154f5 43bf9978 43025270 432e793d 40085000 c40caccd 428fc9d8 43536d2c 437bf478 420346a0 c260af34 4377dde8 43c88a34 44495798 3f8f0480 43035a4a c410d302 c3b51ed0 430d57ea 42eeac00 43981eb4 4486de56 428352ac 43221a98 44800ea0 449d2568 42888414 435b3840 c31dc7d8 c3b9205c c2cef24d 434cbb94 43d4bc20 c4a988d6 c05cb900 42b696f8 4477b3c0 43ccc574 c2d38533 42f13eda c4532602 44a7d91e c2b55722 412a9787 c40500a7 431c7958 42fc7bd4 41c908b8 c439560a 43c00c3c c26ec66c 4343a281 439e4004 c4a1fb99 430a021e 42ccc600 44add79c c41504b1 42b4881c 4332adf8 43d4aebc 44abdbaa c2ca4416 428c4b24 c42cc86d 440d0f64 c300a31a 4333e0b3 c42730fd c450267d 420d19d4 434c6985 c485a145 c2a89860 c308944d 43479b7b 43817cb4 43f2ce74 c2ee88a0 42bbcf62 c494b4a4 43b1b670 c14933c0 43779e5f c4b1d195 4397cba0 c32d9a68 4330653c c45ed5a6 c47565cc c2929a0c 4323660a 449a1190 43e6eb40 42bfbc4c 42aae79b 4416520c c4a2c77e 42ba20c0 43420774 c3bd5fb4 c44aa2b0 42dc12c8 41969275 c4ac8eff 440748b8 bfb4ea80 4242f9a2 44998f70 c4679929 42b9ccd4 42c2fda9 c496324e c33efd40 c10b81f0 41861638 c1f69340 c3589f08 c2febb3d 434bd7ee 43b721cc 439cf1d8 c23b5cf8 4220f584 449824f8 c4a54a2b 42cfa13c 431803e2 442e2c6c 449563a4 43355b3e 4320eab4 44a0f440 4349bfc8 43263b14 4383ad3b 4480c4d0 c3399210 42df9fe8 42dc5aa7 c49439e0 44a225b6 42836d38 415637e2 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000075 -> bf66fc12 3ea3f0f9 be93d2a7 4318ee1c", + "44224460 444ad744 c2b5e477 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c4b6d077 4449d73c 430ac4be 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "44b43b2c 449dd0c8 c3454be0 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c444a43e c4581d4c c24c0114 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "44602f94 c36235c0 c320cfb9 439cdabc c4700d78 c3335dea 4345fefa 447c1c58 433f1600 4297c194 438d59a9 c3c12e30 43f59548 431c4586 4340a01b c4213b45 c40b8706 c341a65f 423c6226 44079142 43cc1990 4311fda0 432ae0fc c484943a c4b17bbe c302f929 42c9cbf2 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f01f1a9 3f57570b 3e3ef726 43775c0d", + "43ccf4e0 c4ae71c4 c306591b 444d67c4 c44b7889 42641138 43871a3b 44aa2842 435585f8 416920c0 435a7907 43ba8efc c4a96de6 3e5cb400 42cf3957 447694b4 c291c010 c3452984 429bbb89 c3dfb08c 43cbb9a8 429a3c88 42f395f1 448fb3ca 432b29f8 41f27fb0 431d2e53 44b30d48 c3bc8b44 41f925c8 41422a25 44329af4 4483015e c20d84c0 43110f57 c47fff54 c41f9c47 421bbe30 430827a0 c43ce5b7 442e5d04 c286fb82 436168a7 c2769ca0 c3886eac c3317242 43347c10 c3cb57cc c44908b8 c291dad5 4329ca72 c47ae556 c49db798 c1a644e8 436ebf05 c38e3c78 c484ece4 42d7f6a4 4291c14c 43e56318 c488ddf0 4327ea28 43320a46 44b8fe52 42ae6120 43404ae2 436ac1d7 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> be8870a3 bf4f7828 bf058f93 435d05dc", + "405a2200 446eaf58 420429f0 43583bf0 44b634f0 423d6c30 42c4a2d2 44a8c0a2 44984430 c1255ea0 431b31c6 44b6f6ac c485d814 42c469e4 41d35d3f c4b16dd6 44803586 427df380 42fcc204 43b82814 c4a4cb64 c342beb2 431fff48 c3b3383c 445391a0 c31ac0fc 4375aeaf 443cde10 443b1adc 43342782 43063605 c423faff 44a93712 c2884d32 41ed5a7b 444f11e0 440179ae 42156e40 4214807c 44773d24 c23d2de0 c18f7558 429ee74d c41927af 44221c88 4284047c 4394d4c6 c4744c3e 4288f510 433a9580 435147ad c4057dbe c3bd6c40 c342740e 439244ca c482e0c3 c4b25dc1 bf5c4b00 436f1894 448bc9dc 446544bc 41a8b590 42884f33 44aadf26 c4aa4eac c2e08d19 41a50e9b 446b1838 440544ee c2af9391 42e172e6 c43ca0a2 43438cd0 41e54bb8 4248b3a4 439e1170 444d3c98 c2ded96a 434aaaf3 c48f994a c48e0f10 425d7c30 4298d17b 4454428c c4319704 c31d7aab 43889ba5 44a403e0 c3d8f740 4326bbaa 436400e8 c473e946 44638e50 c2df62f7 41879691 44a1d14a c43805ea c2acef66 42a4f802 c117cb80 43c089fc c3009bb3 431a01e5 c4414708 43a85b50 c1c43ce8 43657af1 44628c24 448cbfbe c251c760 42eedbe9 44633050 447a1b9c 428a5544 4363f642 c4798d79 c40434e1 c203f7c0 4352cf11 44a4d454 c40d3f69 c32048d2 430ed997 4443a510 42acc250 c30039a4 430b1365 c3e96008 430f1560 c2ea61c7 42df6e4d c1f45f00 44b0cf42 c304fc84 4317b9e0 44a602e8 c4864e4f 4342ae1c 426e197c 44736744 c3e1ca1c c31dc4cd 41dff091 44b66cec 42ecefe0 433386f8 42d9f566 c48a90d0 c2b8f4f0 430eadcc 433a423e 447cd638 43891480 c297addc 427ecb72 42ae6c50 4425483c 42bc92f8 4358ea81 c3499910 44b91856 c20c241c 42a788aa 43fc7654 c4b4b20c 431b0296 437b1d13 43f8ea24 c46cd87f 42f71de4 418af4d2 c3f476ae c43df106 431329a0 43351ee7 c45c6e68 c4ad8866 c1358870 42946509 436fece8 447d98cc c294527a 4383e902 440f3f78 4394d9c4 40ae6d80 438745c4 43f1a300 44b4e328 4337db26 4294f230 c38ccccc c42a1a39 42be613c 437af9cd 44a3e5ee 4483b41a c22a0634 43916822 43e3f244 c48f7a5f 428c4ab8 438e3621 43f06ab8 447876b8 c2b7636d 43353526 44279c34 44253f4c 433fa168 4318a10f c43c71c8 422c2b60 c31296b0 4336746a 44063dfe 42df03c0 41cac9e0 41f040a9 4158e000 44b7690a c303ddb5 43503cbf c44e9365 4381dce0 423ed89c 41e4146f 41d27a00 c4ada445 4274d0b8 42e1d4e9 43d74438 411f0580 41de1950 4310262c c47ced40 c3c58864 c2e40734 4381a884 c400a5e9 449eb896 c3020506 438d6911 c4ba4429 c2c11b70 433d6e9a 43864f18 c4871fd7 c485c2e4 c30b3726 42fbf011 c41f1f1c c4038132 c167a700 434a3b7a 44a7a57a 44b86ba6 42b16048 41fafd80 c457fed0 c45bcc17 c3275c0a 43511798 c4a24147 43ba4a80 430b5350 43622c8f 44a6da64 4400357e c1d9e5a0 42c8317b c40558c7 4418be94 42c07bf0 433290e7 446b9b7c c44ad1ea 42903ac0 43657522 43a97e24 442a9ea4 4329a9e6 42e7f87e 44905f6e c439298e c32d2eac 42cceeee c4acaf2c 4498736e 40c6bc00 426e5523 43dbe310 c48686d6 426c5460 4234fa31 44801ede c20ae280 4315606a 42efe02b 43b340b8 c44be2c5 4332bcdc 4311ee00 441e8c08 447ff668 c328ecb5 4333696e 437c2a78 448f740c 430b7da4 435a11fd c40d5fcb 44ae5d1e c17b78d0 43168243 c422eaa7 442219d4 42f1397c 43761e70 432b7308 42b0c740 42a4bc40 41a919f9 c48137c2 c4334d46 428344f8 4279e493 c4a6847f 43b29c0c 42bfaf90 42d0ea71 c3d7cd5c c4151b58 c31119c6 42f3357b 44527c88 c305b110 42768358 41b568a2 c4736dbb c24d9d40 42bbd614 425e14c3 c4a5d25b 445f8820 430fca44 434fab92 44076a7e c47c9afa 43078070 42399a8b 440c2bf4 c4a5491e 4300c74a 421071ee 42856600 44992a1a c2955b5d 430ca288 c4721a3f 4494c7a4 4134a4d0 4390ec24 c485e63f 428a0f80 c25dd64c 414fd6d5 4475ca90 c49f0d00 42a3177c 4379edda c4a439e0 44415d70 425e0a18 41fc56ed 445d0038 4312dbb0 43403d22 42e3474f c393d10c 44b4ecae 3e1eb800 43867344 44523d34 43ab2154 425e1d30 42c032bf c2791040 c4a9cbe4 43110b40 43837870 c486334e c45e4bbc 43129b0a 42b5a2bc 44aa7d6e 444a5c18 c342632c 43251775 c33deda8 4482efda 430d8f54 43395c30 c2f407f0 c4b73865 c32e9e0b 438bb74a c36e9bd0 4439bf14 c2a3b402 4392202b 44a070ca 44aaf900 c334656d 4284f1b0 c39b7638 43cb32a8 c2fc44e8 43235daf 44901220 c4a35400 4146d1a0 436c5939 c4570f17 4478bdb0 42942ae8 438179f8 4492bd5e c3d1dc84 c318246a 4189a9ba 42d186f0 c3229af0 43284646 432a2a0c c48b49b1 449462f6 c1d50460 4368fb97 4317e400 441d4f28 43169268 435e28b4 443ce0fc 4491ffa2 4331bf56 427fff7c c48186c8 4400d64c 4318edec 42cd1f0c 437f72c8 c231cc80 4270f9d0 42ebe50b c4086cde c49ffacc c22db41c 4340067d c4025902 c45d4051 c338e461 41dc0fc3 43c006b8 c42c1cdd c1c54030 4315cae4 c4ae48e1 c11d7d00 c32d88a8 431b3119 c45f79a5 c37cba50 433f4984 42725aac c469fa83 44609cac c33c87cf 42cfe06b 44913b76 c03f2a00 42a316fc 429352cb c28562e0 44615a34 c1c0f170 41c36442 445d642c 43115cb8 c2d4a5b5 41d00371 414c9600 446551a4 c1b759a8 42dc776b 4400fb5e 446d0b38 c31e92ea 4315955a c31316c8 c2e20c70 c30b9d40 4348c8ca 439e6d10 c3b181bc c31924b5 426c7eaa 41a72c40 c28f0010 c2fca318 43206620 c4aabb7a c4a22f09 42c04f60 4379e33c 00000080 -> bf667b6a bec5151b 3e4ffc78 418d6392", + "43e43154 44b288ee c2ade89b c3a71164 440c2424 c0a92100 42ac442e c4b76139 44ba2650 c225f5f4 439217c7 43c6e10c 40ecdf00 c24cd900 4353d0e8 430e0e10 448bdbaa c1f02010 42dddcfa c4aa416b 43aadbd4 c3218eaa 43502a4a c42c43dc 43005110 c290c858 42e743e5 4421ae30 c4b7936a c1ca64a0 41e7a928 43ad41a8 44812f98 430d7de0 429b678a c427fca0 43e1c43c c32f0f77 436ae2ec 43f6442c c39cfa08 42176878 42f373db 4425a674 c463bf2a 4315c076 43922fb7 446a2cd4 44720654 bf870f80 4284d78d c40a6e14 c27a1840 c18f8468 428a8486 c2220da0 c4856aee 41c197d0 437f4bd6 c3c64018 c48d8c80 419640e8 41226d0b 4332f0d0 c3fda50c c263eb80 436e8bd3 43df1b74 c4878ea2 c2002908 43870ab9 4468f454 43e03c58 42931708 4346af3f c4b44588 441e2204 4338fc0a 41fb9f8c 43fc96d4 c3e80428 41a67450 4386777f 421d3a60 c4415a2d 42c7f498 4246292c c3a5fb90 43e01528 42c5917c 4240e2c4 c499bebc c454a007 c213c7c8 4327136f 4482a5e2 438d292c 43023f18 42f62dc6 447e1738 c49b243c c28c07f8 434d60e9 c391cce4 4396c844 c239ae60 434b1f1a 445d78e4 446462cc c2fbf2ac 436af064 c46eae6f c221bb80 c3010478 4184397d 43538ef8 43e71eb0 c0a10480 42cc1ef7 4372e0a8 c45118bb c22201e8 4395e7dc c3a2ab50 c41eec79 42f57640 43364a6e c4419c2d c4862abf 42f1cb1c 43054c82 449075dc 43597e58 c2d3d984 4332cf5e c4b3dd4e 448ddc96 c07e1740 43895300 448657c8 c49bff38 c27e5238 433399cf c2d60f50 44b0bd9e 43340416 4339032a c4acdbd3 c3ac4f5c 433c72da 4284b3da c4937e13 41c3fd00 42f73410 433d195e 440ca86c c402ca9c c2ae448c 422d0cbb 445c4544 445961e8 c1f2ef40 43476447 c4baa5d0 4442ec24 431c2b6e 433aaf7c c43a7fcc 438f077c c34723ed 4352be8a c47bfefb 436084d8 c1828d88 431a1da6 448e8ee8 446b6fac 41602b20 4303df03 c3f2e846 c45e7f64 41b03338 438139b1 c476acd6 43a1e3f4 c29136ef 42eeb218 44459ec4 43b0683c 431dd2ea 43537a3e 439032e4 c3baef68 c31871ff 41eeb2c6 43efe344 440cfb14 42041798 435648a6 c49d2b18 c3eed4a2 c26c8cb0 430aab98 c3af88a4 c425d339 c33be050 43243c53 c4a92376 c40cf5ca 42bdf138 4383ad1a 4459f058 4487b850 42dd4f1c 43353426 c446ea19 434a11b0 c0e6b800 42f8b878 c32fc170 42205a00 430a4e84 4341c817 44169848 c410735d c3219077 436eb3cd c3042428 c3a3cda8 4306cf74 42837704 c4497b63 4477f318 c28082e4 43959b1d 4483b148 c491bc4d c1280180 43865e76 4368da40 4456f9e0 c28985a0 430ceaef 448e90fe c4b3a6a4 4321aa7c 435eebf1 43941c44 42ab2cd0 43057312 4213613e c45c8023 c469d756 c2bd9723 432e94d2 c16f6180 4423d1f8 42c25168 41ff577c c46de45a c441bd4f c329a470 4348de42 c295d610 4307bda8 4263a268 439032aa 42875ab0 445183fc 42bf5790 42372781 c49865b4 4386a9a8 42fd61f4 4347e2e0 c46c0d1c c39e82b0 42cad798 434f28fb c391260c c3cf2f60 c2f816d6 438b79f8 432b85b0 443757c0 43427900 41b41901 434ac330 444be11c 3f686000 4241fe5d c3c549dc c398be6c 42a782e8 42d6d7e7 441e0e30 43fee5a8 433e90b4 42d64267 c3b602d8 44a69136 c2e6ad5c 43779f3b 44590380 441da93c 434795aa 433cb47a c3c0c654 43a25914 c23c63a4 421ccbdf 44ae53ec c4a3dc9f 4289e010 43781225 c4a813f3 c483d2d6 c31f9a69 435ddd89 43313230 4394b060 c22c29bc 4363b572 c4272fb8 439fa2fc 42cbf298 4353ad34 448ea50c c26680a0 43319da6 431f725f c37642a8 c37421c0 c29f099e 430f203e c4832a94 c3c23f20 c310c56b 437f9e41 44381f20 c3c31054 42895464 43901b47 c3a5a060 c393a038 c304d934 42c5279b 44295ebc 4491abb4 c2acaf2e 432d0eef 434ed168 c43e9e2c 42dcb114 436c108e 431b57f0 c2ea6600 41875d48 427c320a 44aabae8 c4135b2d 42bcaba8 4386267d 43f649e4 4489989e 429237f8 432869b7 44445fc4 c4570880 42889198 434f92f7 c4b799c2 c43879b3 434207a8 4281aebc 44a04c8a c348df50 c25e2e0c 4383f2a3 c3385cf8 c3178388 433bd80a 4394d478 c46383d1 c3b1588c 43328ec8 426f9a05 43d62318 428204c0 4322e8d8 4351e4da 44762694 44aaadec 431cabee 430a2be1 43c92dcc 4452ba3c c2a3de98 4321923a 44241b6c 43b670e4 418b8ad8 431ea2cc c453b119 439a483c 41a5fd60 42caa550 c4336c87 43822298 430cd3e8 4231bc9f c4961395 43fa32f4 42c38158 431cad77 c3f92082 4436ee3c 429b3c78 42b7ce2d 449db2c2 42006f60 432165bc 429f4b50 c4117d14 44b48874 430d3c50 41d03016 c3ce7820 43015030 41aff6a0 4251eeda c487cb93 447ddbd4 c30952ae 4376e803 4498354a c300c8a0 42db5960 4336331f 44776c58 43c53b5c 4324855c 41d1ec46 43fe668c 445866c0 420f308c 426339cf c458ed6b c3ab28a4 c31cc72b 438614aa c49ae73a c4b6b8f4 422368b0 428cb3aa 442399b4 c4136aa2 c2eac835 429d113a 443b5308 c1225100 43350564 435a1f59 c4af9640 441a2e7c 434057fc 42ab9075 41f29040 44a04c7a 421fd594 4384246c 44b02538 c495e7b0 c197eb30 42bba4c8 439519d4 44824f40 41e1cc68 432011b7 c3a21bb4 440fc3fc 4309cbc4 4392962f c342da10 43f72a44 c3302c1c 42392961 c445bd3e 44a83842 c3207c7a 4338b56e c43b1676 42e32e70 43099c48 42d54d4e 44063390 c465c560 c33e4e89 4390c89c 4466c1cc c400de40 42721260 42b85068 44567f90 c4499759 43283242 4394113f 4334a4e0 c40c2ec6 422dedf4 43833e38 442ea978 440dc824 4309c20e 41d6bdee 00000080 -> 3f3b6be1 3e82f3d9 bf219f8e 420cbcf1", + "4498b946 c17c9980 c30597cc 4485651c c4b222e0 41c4ddd0 437a511e 44ba8b74 43bd70b8 c1da0e58 42a89c95 c48ec85e 43a5288c c216c7ec 4378bec3 439fce34 441d5a60 c32e7fca 41adb5f8 433791c0 c4682750 c2ecee0b 4361d7ca c4a029d0 4342c620 43294d9e 42d92164 c44be497 448a95e0 41c4d2c8 43531b1a 445675fc 4407dcf4 42a2461c 4389193a 43ebdcc0 c4087c61 4334c850 42c3dbfd c499d5b2 c30822d8 42e6d60c 43396d20 c2086660 442cd558 c1bce698 4355dd8b c45ecabf c4a9bb48 c3157636 4392fd54 44527b74 c4b4de29 c3239fe0 436dd540 c49df574 43b80ef0 41e9f260 42bca946 c4955ba4 c450c4fb 4220db98 423c5aa4 c4a33485 4432cab0 c13e3690 43090c34 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f747b17 be7da3fa be270ef2 4309afd2", + "4455ee94 c497bc08 c204b88c 444368e4 44a8fb62 c31d5f64 42fd1c9b 43946118 c43742b3 c27c1320 4237ca05 c451cb6e c4882624 c2ff644b 43618853 4376ce90 449acf40 42d69c10 43352958 449c7448 44792f98 c33a2f84 43620629 43f1bdcc c45fe137 431340da 4380d7a4 43f0fb08 42f0caa0 42c83208 42aae558 c4ba6c2e 445dca68 42a690b4 4384cc43 447d5ee0 c450f506 c33ff61b 41eb9896 44b5a38a c3ae6db8 c100ea40 42e8e406 c44a023b c479dee7 43189348 420a41e8 c370ac30 c3acfc78 c0dfc740 437969d5 4417834c 448274ce 43440556 434a1f3a c48a31c4 4302d2a0 c3215343 432c2012 c49c916a c439a337 42c102b0 41d86322 4181cc80 c49ca45a c3179119 43051ed0 c355cfc0 c4167413 432227be 42e54f3b 449345f8 4416e564 422958d0 4324b6d1 c3dd69e8 43fb397c 40b67840 43195a75 c406f55d 4454924c c1d235c8 42b41130 c4a5e500 449f415e 41ba12f8 425bc9c5 44654068 c4aa5b2d 42c7e818 42bea5c3 c48cbc74 c2e9bc80 4341d532 435e3f4a 43d5ad40 c36ccaa8 4310a86a 42541b15 c4aa576c c3015818 42798f70 4233a429 c2788c00 c48de2aa 432d2242 4123d0e8 c4417808 c30255a8 c297ebc7 43108f42 c4b07e32 43998c2c c2d0cd5c 42c173ee 446ea164 c2d049d0 c34787e2 43326934 4290d6c0 44aec8f4 423e36f8 42f225b6 43148960 43a6c098 c2d30f66 4307304a 442275a8 448c3baa 431c6b16 438c0aa7 446560f8 c3c92ad8 c1a496d0 438228e0 c48bb479 c40b8da2 42ed5a20 438cb76b 44b8713e 432bfa28 43252de8 42de7c64 4430b6b0 c4209629 c2bc1b17 43217a6a c4507709 440b24e0 43257c38 42758330 c3704f88 c4244fe2 4246c378 420468a7 447d8038 c42a472e 41e2c738 4382e099 44908c8e 405cbc00 c2aca1dc 42e97d82 43448730 c3b5d584 427d0e70 434a678d c481d349 c3ba425c c3035bd4 431c3b25 43fce490 c4a30d0e 420e35b8 43913024 c4a79216 c42cac0c 426bd4c0 42ace76e c3e68c9c 44206090 c2e84a17 41981f70 44ac9734 442068f0 40923d80 43223a24 44353ef4 c3c4a534 c33deeb3 4380e6b3 44364bac 44a0b6c4 c333cb9d 43184d52 c42a29b8 430695b8 42e2e228 42e2f7bd 43bf9620 43981b20 c252563c 437f6756 422710a0 c387cc34 405b6940 42e1b9b7 441006f0 43ec1e9c c33d6493 432ec970 43bc5a30 c41091d1 410ba450 426f169b c41c5dcf c4392886 c21372b8 43807c7c 4489c1d0 c4898908 4328b896 436d9ead c3e0033c c4092a6b 42d0f280 43609b6f c4b5fe2a c496ae4a 429af560 431d66f4 c2260100 c41d15bb 42597204 4362051e c3e80e0c c3ccdf34 40dbb740 4329b96d c45d04a4 c480ba4e 4305276a 4209ba52 c3ec6c08 c3012f48 c2d8dca5 4308634c c38bdf70 448e14d6 c2f0a6df 417cc56a c4881e66 44a1fd94 c0868b80 43196693 4406b37a 437aee40 bfe34380 4286264e 43de6d1c 444968d4 c27ffa8c 4336378d 44ade4a4 425ad060 c3272ca0 42d64efc 440080be 444fb120 4302884e 438b92cd 4430f7bc 4485e6dc 426a1cd0 435814e4 c415bbf8 447d2a74 c1b7f748 438696e2 c49a6dc8 c402fa27 c28561a6 424587c5 44959fee 4402473c c24df934 432ab72f 4461cc74 c48677d9 c32de1c8 4366e122 4489f250 c406bbba 4320feea 4308a94c 446d88d4 c443b99e c317c969 437900f5 c3bbb050 4493b72a 42d39624 4340a681 c4a7caf3 c42bae3c c2acc543 42b65e45 c420c25a 44512594 c2f4b206 437e3191 c486933e 4398c31c c31c8d51 42cf4b37 c3422e78 c45dd771 429be1c4 42bc34ca c4846314 42a73c60 41594770 4323ad2f 441eb874 c4a33eec c32fe7ea 4302863f 44aa77e2 c459d506 431d90c0 41de43d0 4422c418 43b18a2c 40f13960 4284aef7 4336a468 4418954c c326b343 434017cc c3a57fb0 c4994127 c2b92b98 4183827a 44a7bb9a c44f905b 4240d51c 42ae4a11 c45832c1 436eb4f8 c3476764 433ba01b 43048ae8 4477e44c 428dbf10 437fa165 c3d21018 c44713af 432747d8 43943de9 c458db65 448a29ce c28bb59e 420045d7 44905b16 c489b246 c315fd60 43219aad c49c6068 449b6076 42d1a1b8 435e3af4 c48e23aa c4a26538 43202324 41d119a0 c4347f95 420cf820 420435d4 4317a146 c32786f8 445caa14 c2ece84e 42ed81f1 c45af32b c423f0df 40db6500 43858ad7 44a570fc 4400e212 4305bac0 42d1437c 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000061 -> bd0e80c3 3f392326 bf3094be 426b9348", + "c2cc4900 44758118 41a36af8 c466ab8b c48807a7 42fb9510 4219f026 c496d845 c46dbc1c c2a214fd 43771560 c42cc0f1 c1cb0c80 c111b1c0 438be041 43b64df0 43837fc0 430b48c6 43470f7c c3528870 430326c8 c2056100 434ab9a8 44a8e19c 448a02ec 4225a8a4 433c8b4e c4441add 4374c9e0 c20e2844 4204d114 c340d4a8 44a77842 c33dc3e0 4346784b c3b55550 c41dbbd2 c32d3de4 42ed34d6 44491d7c c3a4c3cc c275be4c 433b3f68 44986cf2 432c7380 432f5cae 436f1023 c4ac8920 44ab1eb0 c2904999 4209a585 44b64ada 4402c9b2 c26753dc 4329fb0f c4bb5884 4485bf94 42fc7c88 42d02852 42ca4d30 c461e4ca 430fe0d8 431faf0e 444be6c4 c453f671 c23d1c2c 42cf624a 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bee32c2c 3f5b67bd be8618d7 43623119", + "44675bc8 c10c4980 4313d9a0 c29db2e0 448feacc c338223e 4286701a 44651454 44419380 c22b69f0 438bcbb1 446b3f88 43634b20 c2ae3bfb 42abef28 c401c511 c4984978 42d11248 43357025 c29c6c20 43e03a30 410fac40 43137bbb 4435dd54 447f9528 41dde790 4323d56e 4477b1cc 447e7f6c 429744a0 4273c931 43acfe74 c4040f5a c2e5f282 42ff0bc1 44b6ec1c 433e3918 409eabc0 436f467d c40a2f1b c3da794c c2f405ba 421a5495 c367c660 c39dd2e4 42b00acc 433eaec7 43687740 c4385a76 c1b05608 42373d25 43b4b350 442deebc 4344cf24 42764f94 c4b0c48f 448629ae 42dea09c 43418d78 c40b2cac 41dce8c0 c254b964 439115f7 c4a19e6a c4541bbd c294902e 4318069b c3cd33bc 448d5bbc c2b4ab77 43676f23 437483f8 44b08686 c2b3abcf 4232b61e c3087620 c36455d8 c33376ea 42ddaacc c48e3a7c 44a75cec 43353062 43310efb c39e58d4 4344cf58 41b0ac78 43851886 c3fc277a c4ae7bad c2456364 423ed453 4455d7b0 448e4bca c11881f0 4373e647 44b6bd22 c44b5a49 c33c2ead 428b387c c49d5124 c44a44c1 c2c01faf 43552793 44b40324 4407ff2c 41865338 43466c21 c30280d0 448baaa2 42b2ac50 43395f3a 4465d250 c35040d0 409c5d20 42e98458 4328b240 445a3cd8 41e55b00 431bfd67 43f2f7ac c34f5ea8 c308dc78 42d285bc 3f784000 c48572ce 433f6086 43559820 c1827740 c2bad580 c3131701 4296e07a c39e7be4 4481ab72 c2ba3a97 43861c3a 440bd790 c439aba1 4219a658 4358cd04 c4b2a3d6 44980de8 c1e9dad8 430f3dcc c40d78e2 444bed10 c28d1f6a 42e1a244 c3c723c8 c492fc5a c2c7bedf 4285dd94 43ebc8c4 429cc910 418b7040 43466327 c4a053af 44a1c268 c2efd509 437c68de 44182a30 447ef210 c309eebf 4394351f 44342064 c0dd9d00 c2e7b0c0 43904b0f c47c7946 43b6b35c 42915764 42c43322 c464c922 44867674 c1015dc0 43656293 c4ba0430 4414cba0 c3412745 435d3e0a 447067d4 43b9da2c c2842720 42f42f5e c45317c0 44a37bba 41db12a8 4382e412 c4145768 43b06760 42fe5cf8 4364fa73 c4a7e9f4 44431a14 c343e97a 427d1755 443bbb78 c3362718 42af6d74 4375f785 43388b18 c3cd91b8 c2f70fd1 43622d73 c35cea80 44a7726e c34773f9 437199b7 c4aa1ef0 44574e44 42690c50 42ecf594 449b5738 c2a945c0 c341dbb3 42039f5e 4175b000 44497b60 42d746a8 437338ca 44a0f634 c3ecbd40 427d7d78 432845a9 4463e288 449ff796 c2c6bfe5 430818ca 4482a158 c418ef40 c3458618 432dc165 44b3aa82 c45e6bf8 c3053cae 430eb341 c349d058 43860dc4 433810da 42b1c52d 44a2f874 444a60e8 4300bf5c 431f63c8 44b0faf6 c3285770 430857a2 433253fe 44379604 44a1b690 428edd58 4393577c 43ff47f8 449ba6d6 4319c76e 429337b0 44196454 43da1c40 4330a328 431aefd5 441238c4 4347a710 43341c28 43639318 4452a9b4 c49d21d1 c2281114 4358221b c41256f2 432d4d80 426a0288 4389c89d 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000043 -> 3de6807a bf25f3be 3f40c8be 42362ba5", + "43e76190 43f0e100 43417fb8 c485c3c2 435d7488 c2601040 420b7065 4400574a 440e86c8 4326d84a 433d13af c4b24dc1 4493eeb6 c32e627c 42cd03a7 44a7d66c 443dcc5c 42e5db80 4345dae2 c2edb4c0 43672a70 c25323f8 4377ac5c c4a0a54b 442fb0a0 431c62f6 41c1833c c48abb0d c428543f c2fa6398 42b949a7 44451fa4 c4751bb3 c302c188 41b96f46 4428ca70 441546cc 41c3ee40 41f615dd 4374e620 c380e960 c33e76ad 43841842 c4af1061 c489b7ef 42cd16a0 42802ab6 c3fd9eb2 c3a24764 c2644c58 43735d2b 448699b6 c42e051a c2730c00 438a6738 40987400 c3f04136 c1a42e30 43009f33 44092394 c40db9c4 433644c8 42f96cc4 41110a00 43c6333c 430ddeba 43807188 44260848 c4b48724 42164c18 42a425f5 c4671f7b 4421ccc8 c32d8af6 41bb7863 431fa488 c1cb7ac0 42e51ec8 438d2284 44b335b6 44195a98 42ae6800 436016bf 449cd7c4 c3b088c8 c1eca878 43198242 4473d1f0 c4392f1b 418c5868 42f36e14 c43b3e63 c4826e02 c2320580 42b0f2c3 c2f9ad40 43c06be0 c24a68ec 42fc98d3 c426717a 4497e282 c15f3e90 42c9266d 445f68a4 c492b4ea 42349664 424e1d07 c45fa08c c414abb8 c2551b80 414eb533 43204a20 41ebfcc0 c1dc5380 4392dd79 438b8978 c453ec9e c1113330 42340664 c45c6ee5 c3d24640 c33d80ee 4311cdbd c2979810 c45a775e 434746a2 41abfc1a c401c0a3 445da828 420cb2ac 438b1d86 c48f3d54 c3abf184 4280a0d0 41f90cfd c4437c14 c38d7ae0 433024c8 4374beb7 444a151c c422de1e c2a593f7 4321c35c 4490dae4 42cabfe0 4304b7be 4360bf63 4425c790 c3867720 428e0f88 429fc0b0 c482e308 c43969ba c2f40c41 438a25c2 448e0b60 44ba4fa4 43070992 4334dbbb c4920721 435ba7e0 42fcf6b0 42ffa5a5 44206088 c32e6058 431cd0be 426af2bb 4482e492 c3d493f0 42bf3898 4280a8ef c4273194 43fbc544 c26df8ac 438adee4 c4a27434 410c2700 42033698 438d6fcb c3b89fc0 c435bd4b c2911cd2 4389e9af c48f4334 c3e58668 42db2c00 438275e6 c4682d44 4435e51c c2f4bc1d 42a0a9fc 434c4278 c3df3614 429f1934 4285cf71 c2c82b10 449106fe 42f79688 430ae0ac 43d4a130 43f59a70 431c95a4 42e6664c 44007f5e c1ea7380 43398d16 43161aee 4496916a c42b3ab6 430c966e 42ee007d c37f8940 4494be78 c2e63357 4380ac14 c4380b03 4495d62c c2a957c7 42e8c64d 43fbdd50 c4b173d6 433f0d18 42239076 c47bd99e c127e480 423ed018 438b40c3 44afdd80 c4815bda c18adb48 4278dba7 4411137c c487e623 c2a0a5f7 4358d29e c3c8abbc 44aaf1ba c2cbc079 43400b14 c3af577c c41cde0b 43397dfc 438a3782 4492a588 446ea980 430314c4 434cb765 c4876575 4481bc4c 4330a56a 432e739a 4393a090 c32c1a78 42dd3260 433c569c 440b94ac 4455b490 c2f12751 4272ccde 448b1d6c c4ad4077 40b51640 43627a0d 446c50b0 44009074 4291f1c4 42b4c969 43923110 c0330a00 c0aa5700 42c14795 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000043 -> 3f3dfe72 3f2a24af 3db10210 42704314", + "c4a56a72 c455670a c2766d08 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "443d9660 43f21c08 c2cdd7ad 44573464 c48d5ecc c2e541fa 4385fb77 4374e550 c43ae5e5 c25e3aa4 43506d39 c4b158e2 4373d650 42cdd5ac 41f384e4 4440925c c3e8559c 42dd5b5c 42920296 c494a19f c4524564 c311af8e 4329a3f4 c49fc26c 43d1d040 c2612b50 43446dbb 449acec0 44a42fe4 c1839178 42fbab54 431bb0b8 43bed324 41de53a0 43809f8e 4190ae80 449eae7c c2c727cd 42f6dbb5 42c64330 449f952e c32415cc 43072c0e 449c0aba 449af632 c1333e10 438848f0 42f8c9b0 437b50a8 4321878a 43433467 43968e18 4481ad34 433618b8 43956504 c45959f2 c48f21bf 431589fa 42529814 4445ceb4 4353b620 433eaf62 4344b3b1 445af030 44ad2100 c3131116 42fbeadd c4b71303 4497c508 41ce40b0 437bbf50 c4983abf c3aba87c 42935f3c 42769758 c48ace42 44191e48 4256fefc 42627668 c479169c c30a6e80 c31f7162 42d2d922 c4aebf2e 44702fa0 42ef3f6c 4356c44f 4400fb36 435cf500 4263cd38 42f4dfab c4a902de c49480c9 424bd39c 43908f02 44a850c4 c32209b0 425f894c 438f649d 4452ac70 c4a072f8 431d71ca 4342a7fd c4b4417f c4a12ba2 418ea9b8 429096d0 c47dcee0 444fdbf4 431263aa 431cc071 c240b060 441fd3f4 433fac32 42c7bc0b c2b8ef10 43dd7f08 422faa7c 4391e461 c47d0976 c35d4730 42b64e58 4309103b c4323e21 c47271ca 42e37248 43948f22 4441a090 44264e68 c2d898a9 43505212 c4a35509 4406f414 c2403f4c 421710e3 4334bc18 c2d41de0 c2983720 4390c01f c4284027 437cc0a8 418e6920 4386c013 441bc260 c4885fca 4321821e 42d6fee9 c48cb237 c408df23 c02ba200 42c2aec8 447c25ac 43fc0f90 42e9742c 42e1b38b c3e99ec8 c3059d88 c248f4c4 437e58eb c4209266 43238ed0 c18ac128 43098e46 430fac40 c46e6b08 c1bae710 4373294d c3fa1cc2 448fc9c4 42c7b6bc 41350572 c3f3199c 43dafe04 429ccd94 4331b9ee 448f26c8 4479ca2c 42b86064 423a2b32 c42a45c3 c31bacb0 431219de 4309cafa c44baa59 44a08770 430b1130 42f9ea84 44918b96 c4b20df4 42c931d4 42218c77 c499a880 c2c513d0 428e5054 435b21ec c48ba548 c494410a c274e5f0 43226a4d 44120e94 c4961675 c346d2d5 429fff63 434b9638 c206d160 43394c2c 4282511a 44b10386 c456e976 c12d4fa0 431e3f81 4428be40 c43cb42d 41debe20 437cf5f5 440df334 c4b5827c c2e6e101 433dbef4 c3f8568a c4aa8e28 43265a84 42c6ae4d c48a0598 43d949d0 4325b6da 43834356 44af89da 44b2124a c19d95a0 436b5a86 c226a0a0 c45d530a c1dbf3d0 4270eaa2 c3247f78 43b9d0f4 43151f04 436081ea 44ae5006 43ec3324 c1f203d0 434da780 431ccdb8 c442c7b9 c2405504 437e22ef 4495147c 447f1284 c33b3f80 42297fe4 44937870 442a5804 c2f718e2 43465f18 c46d16a2 4412272c c31c3a04 438ad5e3 435f7048 c498d36c c2de522e 4395974e 4445059c 4412e10c c33df736 4320d37c 446dd8f8 c39b6534 c22bcb6c 41e7b3f9 c485cf8f c2a9ad70 4277f7c0 434e529b 43b53928 c44216eb 42cca460 438649ff c4303340 c4a0562a 433d4b0a 423c7cb6 44a61dd2 c3f152f6 431987e0 43661b5d c4b655db 445347f4 4343ba8e 43639607 422d5400 44a8acc0 c305eb60 43837e59 c341e588 c35a6d70 4324ca26 43812ea6 c4559832 4486e36e c33e1cb0 431b54e6 c31d9880 44aeef1c 433b62f4 43043eb1 c4a0720e 4229d840 c33c80e6 438dafd7 44a4a688 c453a951 427cb300 431b97ba c48ec9c6 c498371d c33251b3 4304d679 446a0244 c42f6d76 4021bc00 41a22dca c38b60c4 43d57f5c 41a30650 428427d7 c4111c5a 4453f53c c2ceb6e5 42844d65 c40011f3 4495c3dc 428d2730 42ff1c73 c4a99b45 c2a77710 42906e30 43929730 c3c20608 c2e23e40 429579a8 431ae3af 443db9a4 c4aa0140 42f8fba4 42c00ff5 c41c1a67 43f4bc88 42ca829c 42d9f08b c3be8458 c20b40c0 c3363baa 438e9efe c3dbec48 44b77c9a c3226006 43737d54 c37d5d18 444e5228 c319fe74 42bbee1b c42a9705 447b5660 42357c3c 41ac175e 42f80fa0 c43991fe c19226b0 4345abd9 c381ab14 c49e5b50 c332d438 42ded645 436dc1f0 c4b8fce1 c2ae0934 42e50c4d 447853c4 c4384915 43209a8c 43449325 c4b0729b 44961fd8 43004120 437dd847 44851bcc 442a7f78 c3333550 41d787a1 c3b6f5ac 448cc68e 41c30310 4336b61c c3e51558 c39a0934 c2da57b2 438a169b c34852e8 444ba690 42cc40a8 41ab26d9 c45a60aa c493c072 432b169a 42bf422a c3419898 44120618 c2503a10 42dd13dd 441b21d8 442f39d8 433d9d08 42630f9a 448c1830 c2aa13d0 c2bff358 42ebe27d c4b611de 444c7020 c2fc3597 43761052 c4608e07 c39c22a4 c2b8b528 43261078 42494aa0 c2ffc5f0 c3470605 427b0dd7 4451b874 c3cb17cc 432ae186 41da3317 c045b200 4487d518 c1d17fd0 438ae77c 44b13aa8 42982d50 c21765e0 4261e629 c3d5caa0 4419f86c c26d7ad4 4344dfaf 44968358 c3967a34 42b193b0 4383f72a c488083c 4485123e 43215910 43499603 4382319c 44a57d12 43077a76 4375bf30 447ca8f0 c3a5a5f0 42decc94 4392d2f4 44103160 c46a104e 41d69608 42da7f86 4465d2fc 449b6c9c 4281d4cc 4154bc73 c4ad9443 c3f51fa0 c220a230 4317d819 c3c7303c c4b251df c18b11f0 4319a30e c4aadfe0 43bb15b0 425adb00 422fd3cb 44308ccc c48bf18c c3361f2c 438b177c c2e89720 c42f144a c12e40d0 432bb93d c4b2adb8 43b66ac8 c3255c68 43331520 443925e0 c35a2968 c14ccbc0 426cafb9 c487a95f c4b7ffa6 43072f1c 439419dc 44320b64 441df448 43076694 4372313d c3063de8 c3809f34 c2a540cc 432d124b c236daa0 c3eae7dc 42d6de4c 428f0d0a 00000080 -> bdf4eb4a 3f2f33bd 3f3820a6 417e6402", + "43d56e64 448ee050 417f2d20 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "44b6f0d0 c37d77a8 c2c802b8 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "4488ff2a 44110454 43045496 44a4f91e 43297088 c2aa69d0 42e318dd c4ae603a 44571284 426fcf58 42f039d5 c4b233be c41ec36c c2ccc62c 43122902 c4a9e1a5 44b16c3a 43242eda 41f923f9 4407187e 4484627e 4315c6bc 437ac680 c49b7413 c46c9027 43210638 418d1a8b c1427c00 c48b5ff6 c2a1876a 43281c85 43c7281c 442712a8 c1f66de0 4329b23a 43d009ac 4400ffaa c26a6438 413b13a6 c462aa77 44b65fe4 42badec8 43055d3b c494e96a c423b858 c2e1ad8e 42b4bb70 4495b1f6 c4756c3c 43059bb0 432e5b11 42bb67c0 c4af9b40 c299d422 432d1ee0 c3baae5c 44b65ce2 427adfb8 43650cdf 43e6e0f0 c433840e 43107240 4388775d c207e8c0 c4943fba 42c58b00 42c32d7c 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f257648 bf3cdd4c be478a9b 42b870c1", + "449dfeaa 44b47692 43061c6e 4497bbb8 448cac28 429b094c 42328c5d c318dbd8 442a84c0 42f30038 43912b29 43bc278c c48bd188 c28d7504 42beb3a6 442d823c c4b64228 4221b024 43025d4a 44873094 c473a6ed 4273d358 4166899c 43933d44 c3de2018 432eda72 42394044 44753164 44a3c512 43474b02 432515e9 449bf3b8 c3844ce0 c2eb55c2 42da53c7 c2f5c910 44a7abb2 424a9454 425da4d4 43aae0d0 c32adc28 432a997a 42aa2fd8 44846456 44587fd8 c33c9b5c 4242daa2 42e39f80 43a88698 42cddd0c 421133e3 c484cc22 44911e28 c3461292 4320490b c4712c75 c3d25380 c33f6a3c 432a48df 44a43f5c 434dbca0 c2a5fd13 431e9334 442bd81c c42d4527 c333ad46 428fe8be 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf39a820 3f132c7a 3ec1fbf2 423ad648", + "c39fd3f4 c47d61e2 42f79850 c3269a80 4461d920 c20410ac 42a434d8 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "44112a08 4443e72c 428c1e94 4382eb3c c45611e8 c3003e74 438897e7 c3a6a4c4 c4b0aa70 c214d480 435167de c47c5e62 c49647b0 432a4382 41fb7682 c4530d87 c4aa7f61 c30bc97b 43021c12 42b2e770 437c3758 42be4950 43764e32 c457de52 432a1b30 42dda888 439219b4 44187eb0 44170e5c c325a8f8 4334558f c42cce0c 4455bd84 c2f1e643 428ef122 c44b0bc1 c4891dee 43408516 42026954 c3fa9802 44713054 4318070e 4182d8b6 4465fdd0 c447b705 42fe2e6c 435f7273 44867622 c40be7e0 c2db4df9 43652dee c42ece0b 447ad86c 431173c8 4331a504 c4a0a2f7 41ce17c0 4212573c 4196f06c c33b7fa0 c45c497e c2eca0fc 43515fb5 44a623fa 446fb764 c2032e14 42ef8ada 44969c40 44204490 4309da8e 4209b84c c4a37c26 c4a04736 c32781aa 4357632a 44190098 4421f4bc c344b93b 4392e082 44333b48 c4ac1b57 c31a2edd 42f61f88 c292c440 c3fee968 c28fa76e 43083045 449e0236 43b34fac c30fdde6 435affa6 4300ad00 44a9055c 4260b460 423aeb0d 43b00e84 c4669203 c328732d 43941eae 446cc694 c3366250 4305c23a 42500da1 c2bb0d50 c48663b7 42996698 4284b6e9 443deb8c c48139c0 4315a1f8 42e24d84 3f981800 43a98068 c2a6b7f2 42f9f130 c49918d0 446bc280 c2e66f2c 433bc3d2 c01ba400 44b51470 c1891278 42b79c3e 435c1270 c48d04dc 41845160 422b72cd c34b8bf0 44aa77b2 c323a7d2 431e5095 43cd9960 c4b390dd c306e545 42c1dddc c45c02db 44b02036 43286aca 42d5ab19 43cf7638 c48c36ac 42918660 436820b7 44381824 44557a9c c2dfc4d9 438bd58d 43eeae58 c4400237 c33a0901 4372e08f 44b43b1a c2cca4d0 c09b98a0 437b84a9 44b4c3e0 431cee10 41e4da08 42dc0715 43966af8 436b4cd0 42d1bf54 43719b87 c4a34c6a c3ce05d4 42aee718 4314faa9 c31547b0 44b86fda c2f828ee 42359ab2 44937d24 448dc470 433ddeae 42ec64bb c415451c 440f67c4 416a6ac0 436eba7c 44975f6a 43a73010 c19291d8 42812265 449d6022 c41f1f6b 414536a0 426e8fa6 42c7e1c0 c3ff172c c291d0f4 4347c255 c398c558 436480b8 42bae7e8 41dae8ac c3cc216c 448fb8ea 42a122ec 42f20745 c4a2bf06 4434c9b0 c1023bf0 434b8387 c4a72dec 449ad096 4323e374 421efb05 c1d2c480 c49077d3 414bd3d0 42bcaeec c4b59e7f 44541918 c1bc1ce8 43946100 c48ce94e 435e1088 43179768 436b3e48 4478e0b0 430e5d70 43325eb4 42338c63 44029398 42d4c010 42b322cc 42cbf057 c4855844 449b8cd0 c344540c 43032314 44b7ab82 c481d146 42b22abc 4264a0b8 c48a1279 44572e5c c3126906 413faf66 c3b6d3c8 c35743c0 428ff6dc 43036207 445f9198 c4b169f1 425ddaec 433c73fd c488e486 44379bf4 432e4158 436f118b c4b9e507 449f4516 41a31b30 43206189 445d581c c3d2f960 43454654 43206e82 c4694f75 438ae0c4 43374322 43312943 c493e908 c490b320 c29f29a0 4381f854 c4a4f77c c4260bee 430ece14 42d7a682 c333dbc8 448b8e64 c2224340 42fe1550 4489cff8 42a42d90 c28e3baa 4345b08c 4494ccb2 c492c9cf c2fe40eb 42fbc4da 44b3af8e c45288c0 c20a81e0 41e6f489 439a462c c45de288 c2540654 436a0335 445c4a80 43acdde0 42fe53cc 436dcdbb c2b37660 c494ac67 c2959bd1 43505902 44296324 444f9910 41b0da80 43812ba6 44916cc6 439376f8 c2703fc4 424145a6 429ccd80 c4843ba1 4271b050 42af4d64 c4ad9260 c3e7073c 424316f8 42053638 c3866580 432fa968 421b9c04 438582e5 441686a4 c44603df c2c0ca2d 43811c50 449a2b86 c49bcaab 418b8ad8 4379315a c4a728e6 43a99580 432d66a2 43678c8e c4563839 43cf6070 43288ad8 423333b4 431fe4b0 c4029fbf 40971080 42f0e4ef 448a8a92 c424060d 41792c00 430e1622 431f4b48 c4961ab2 42bc4088 430bd83a 44b8fe16 44322a68 c247cbc8 43892c34 4196c240 c35be318 43414d72 43180ff0 42556980 44157fa8 43321764 4372f0d9 c4a6fc88 42963ff0 c328d805 43896573 c45697b0 449128f6 c332a4fe 42fb5b4d c3621fd0 40b93800 412d2a90 420a1937 c4a9f7cf c454b27f c3414371 4303a036 4413c8fc 4463a81c c29dbaf1 43754e31 c3e223ac c4978cc7 43049882 42cbad9a c4448dbb c4b34336 c2c1db05 436e6c96 43e87e04 c34d8ab0 42238c38 4380d33a c3b31730 441c6b14 c28b149c 42dbc0c9 c45e7104 43bcc874 c2ceb990 434b2431 c4aa2004 c3f55d10 c33ec10a 4318805a c4592093 c41d1483 4311e9d8 42bc2114 c38734a0 433f9218 42ea422c 43592155 c39b422c c489504a c1933028 439007fd 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000067 -> 3e6580d3 3f1fd376 3f3f9253 42c37e5b", + "44a0b846 44b61b3e 422ddafc c42fb5e8 4436ec04 43454172 4387754f 4401d176 4418f894 c28171d0 4386163d 44015466 c455024d c32b85ff 432cf70c 43cd3fac 4446cc74 c342dfa0 41f8c8e1 c3efd78e c493add0 4332f28e 425e5509 44af6d0e c3b74a48 c3238b7a 43433656 44917d9e c2ff2b20 c2ca9448 42a7a42e c3c707a0 43e24638 c1b8efb8 438eda35 c4a8de59 c4adc72a 42e07db8 4335d54f c4b04255 43898208 416f6610 43341d12 429f8950 c3969080 42bdf04c 42ddc393 44263948 c48263cd 42cfbac0 42e9e24b c3306ff8 4490c80e c26a7c20 4347f448 442ad5e4 c4ae7a31 428149bc 4385bf52 43e5230c c3da4920 c3434e26 42910f1c c3007198 c49c2289 4112d240 418216c0 444d55e4 c48e5166 409cfc40 433811d9 44b5ab4a c36f2300 c336e3b4 43630bb1 434e59a8 c3d0d840 4250f318 432ec59b 43d2932c 443673ac 4326d000 435f58fe 44145b8c 448dc102 42fab170 43158e7c c417f2b4 44576504 c2dda8e3 4165662a c3bb86f0 44934352 432fe87e 434de514 436fce30 c405a8e2 c3143c1a 430a748b 448d418e 4421e000 41ed1510 43385518 43d20b3c c47f6f16 c23918c8 41807cd2 4480bd86 439d8538 c32581ed 42e8ddb5 c38fccac c498769c c2c9f9f9 4388e03b c33baa40 c427f55d 40e3f440 4331f5f1 c42c4b6e c4abdbb8 42b35998 43940e24 449515c6 c1013a00 c2dbcb10 42126dfc c269cae0 c3c715ac c30499c8 42a34203 c4497b6d c46a4449 42993264 438b0f4b c4781d48 c40a1613 c321bd37 432621fa c1974bc0 445b5998 425cacd8 4352caf6 4416b8a0 448577d6 4231511c 42b74ca9 43d9c1fc c4b024f9 c2d18e71 42c44010 4463fbcc 4316b6e0 c302ee0c 437c244b 44b85e02 43834028 42a2de74 424d8e92 44a2cfa4 c41b938d 41813958 43140c85 c33e7430 447e6d18 c311bd1b 42919056 c39318f0 c404c3ef 42c03f18 42350271 c46fb297 44b3c858 c325cef7 43149068 c39050ec c4af935a c2ab7fc1 41b09de6 4490ee8a 44a663f0 c1aaf370 430c9181 c48b0aa7 4488bb60 c1b65788 434f8647 c4b5e2f9 4485b25a 432d295e 4332aff4 43a872c8 44a9d95a 4226c2d8 4288a7f6 c439efda c47d94e0 c2c34d14 4381f34c 4425323c c39e7fd8 4317d8a6 42cedf1d c41d8518 c48fd086 c3169c00 43791f2e c2d371c0 441226b0 c1dc3768 43902d8a c4149828 43f2e958 c2c302b9 43949db3 4481bec0 c499b1ea c2751b4c 432fd99f c39bacc8 c30865b0 c2eec8a6 43282b49 c3a4e300 c48003be 406d1540 4297ef1c c3bb354c 44902160 c2db6be9 42a04d03 444ef18c c3644d38 c28ee4a8 4318b94b c4a3772c c48cdafe c307e524 415b0ea0 4434db40 43b1b0bc c2e2e988 42cda895 c35ff948 44b1656c c2b027b1 438ecd49 44138540 43aaa7dc c267c4f0 4263d8ed 446c4ff0 4409fb8c c15cbc60 42ae1f34 c46663d2 c3f8b13e 432cd8c2 42405c71 43a0d9a8 44948064 c1a20988 433251c2 c2b92140 c4690966 c2fcdca0 43844e6c c3ef29f0 44461070 432a8b9a 435b43b2 44a134e8 c3f8e114 43044d4e 436b8ca4 c4445e7d 448f0842 c317f8fb 4302ef7e 448e0edc 4330b5a0 4144fb60 4366d01f 42af3890 c4a39492 c1ea3120 4212a8de 44abe564 c4a6a103 c2a087a8 435daacd c466cc68 c4b0a803 c2173584 437f1708 c4782d68 43cbec14 430c61e0 429ce9d9 4458d9b0 c39340b8 422fae44 438c3a6c 440c8e2c 43c85068 c2d65b8d 43157d9f 4484754c 440cd0b0 c33cfa96 42c89bc9 c45665c9 42352c60 c2c5fb05 41c0205a c3ca2958 440cf45c c333844a 42ff1bc1 4444da1c c499026c 4327d588 42b93e27 c2d38310 c463a487 413bbad0 4387a3ee 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000051 -> 3f6ad45d 3ea38977 be737981 43df8206", + "4490010a 43bfd3ec c11343a0 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "431d3fb0 4489da0e c3285cc8 c49fbe61 44945f6e 4304b170 438e2490 c443f496 c42c05ea c33cc23a 43944077 423d0120 4404e0d2 42dd1d20 42e327b6 c2710de0 c2621c00 42079580 430b3916 c29e7850 4413de88 c0e33fa0 42d07105 c2c0d680 c1d9a980 c31e50e6 42d40783 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bf3113cc 3ea7e597 bf24b803 4341b85f", + "44484ab0 43aae234 c309c7f2 c3fecfbc 44913468 42dc6d70 421b1aa4 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c3c95b34 c4acf28b c34594d0 448477de 43df6c90 c2c28fc0 431445f7 44078b6a 44840f8a c3162b74 432fb662 4188eb80 c48bafcd c3410164 43339c87 c3865dc0 44a185b8 4345e5c4 433f04df c48aa244 43794228 42e9291c 431b3015 c39fe7d0 c3c15164 c2f6c436 4338ce27 441b4280 c46bc811 42e7f778 4123fb09 c4358c38 441fa474 4312e4e0 43067742 448b7d1e 43eb65b8 4309906c 437ba7f4 c4a1f64d 44b8255e 42f829e8 42a6301d c45c1e31 44b45f70 c25cf5dc 438efb17 c38a3d70 44130c34 4327e19a 438fb0c6 445297c8 c295db00 425acb20 41978a46 c3cbdae4 c4a02206 c1f59108 4315d121 c2ff8e20 43e7082c 42d7d548 43199455 c4a42c78 c48d1b18 c295361c 436fed12 c433ccbd 438470d8 42aa5150 4364832c c49af1ae c47dea2c 41b38738 424988d2 444ca940 42ec6a60 c2a4b07e 430198bd c4b80aba c4430997 c2f40cf2 4152ce3e c42f8f12 447a1aa0 c2dff234 436d0b69 c49ef562 447c4c94 c32df62d 4371b518 c447bf25 c3cf5348 c24693c0 43021548 c4510d3a c40aac2f c2f81fce 420809d0 43fb4338 434f2768 42990f58 4377ab1b 44b52ffc c47a5742 4313de42 433d9c0f 449d1876 c0f0c300 c2c1a2de 43792949 4451216c c4b76d9b c12d6760 42922014 c2f57e40 444221a8 c2d8a7f2 4298aa0c 44975e70 42b770e0 42ad63ec 4304ebf8 428b2ff0 449b36fa 40fdb1c0 435c426e 44562b18 c4863dcf 4327321c 430ec177 c3e1a9c8 c4587d76 42c3ea44 4309a63e 4311e020 c3baea00 c33ce306 421ba9ac 44adecf0 439715f8 431198a8 4331cca4 436b5508 c442b2d6 c33ff09d 42953b40 4491d43c c480168a 4335ff82 43101a3f c49b475e 44aceae0 c30057f0 4246d82c 44841e18 c42e684e c2a2ebde 41f0af2b 43db96a8 c48542c5 430583a8 436b4cf5 436e8210 446121e0 c11f20e0 432e92c4 c42f86d5 c4af3967 428710d8 420915bc 442d4b50 c48af2d2 c2bc0e56 42c3b287 43f9dfc4 c487b48b 430a2b6c 42b8058d 4493a88e c4183ea7 4306764e 433fddd3 c46abab4 c3054ca8 c24d0828 42f54c42 c4af6c4a 43a1f040 420c9228 42b713e3 c49ddbf0 44abf22a c19562c0 43778eb5 44483420 c49ad728 4347a576 436bb298 4446f304 c30e0818 4336bd46 438123fe c1f99bc0 448b3cee 42b91744 438faf85 44132330 448d149e c13dbf00 43591dc5 c369e6e0 c4b66afa c301cc52 42dea4bc c40fa35b c45c014e 420fcb30 4237c3fc c3570938 c49afd9c 4161d930 4348d252 c3255d48 c3a88118 c34623ae 436a091a 44041d80 c322b370 41665340 43320d61 c4875fa9 c4a250fd 40e06320 4309eb3d c3efc318 44b40146 c310fd51 42cb1f07 44282708 c37dcae0 4299cf24 425cf2f6 c487e5be 448c1f9e 430fa780 41e7efd4 44544370 c4948690 4088b7c0 432c7b10 c1056380 448cb148 c27015f8 434ec958 449c8342 c416de27 c20dfa78 421e3ede 44897e62 44ac0f68 c2afc2c8 42a53de7 c3efa912 449292b8 41f09c18 42e1d40a c13ef180 442fcdc4 c3444f30 42d2831f c4a1932b c4296430 c2206d90 415bf180 c39e5ad0 c3b50d78 41028d20 432fa710 42ab2b20 44a4af82 4343ceb4 432ff1c4 44a3282e 44b2642c c327179b 42ad0485 4422e854 447e3794 4117e320 41afda32 434e3fc8 c4ae2753 c1a2f498 4367f587 c488d60e c32e7770 42fc9c80 42a31cbb c4172558 414c7380 41de4c28 41c0c81e c497fc53 c46e5755 c062b280 4295625b c29350c0 c3f4756e c2acaf51 43260a3e 4450d550 447f0928 41eae7a8 438b7c5d 44affda0 441c0ec4 c293bc13 42e76b62 446771b0 c40d7988 425c441c 43488c92 c458fed9 44af7776 42cfc690 419dd206 4473cd24 43c988e0 43172048 438f1ffc 433e9a30 c429c28d c2b5ce1a 41884da9 c3c375ac 44a556f4 c10fe410 43645553 c2393700 4486b28e 42e6b36c 42f08180 43246fc0 44b61fae c2bdb3f5 435d52d6 c2e2e770 42818760 42ecdaa0 4305d676 c48c0ec6 c31241a0 c1c5e900 43942158 448978f0 449aa69a 43072d12 423b14b9 c36885f8 c2fe6450 c2233004 437dea99 c2f4b9f0 c3fca9a6 433dd060 431c63ae 4349e988 43136ad0 41b8f168 4191e500 c44a1484 433b5ff8 4317faf8 438ea9af 4289f210 c435e31d c31f1939 42968163 4419c7a0 c4afde51 41e45aa8 42c404c0 447db774 c313a268 43026dde 422a4082 447ba010 c420c568 c308ee05 430e9d51 c494e34c c3dfea50 c287b1ee 418e8e81 c2e8e320 44a7bb5e 4328635a 42957cc1 c4b753ad 44418f6c c30770d9 4389642d 44adec2c 4448bfa0 c2f2d395 432d9369 4355e418 c206f300 c165ab50 433aa447 44689c80 43a9656c c1fa62f8 42f70e2a 4490d71c c4980d5c c346e10f 41471611 4183a540 4487d7e2 42876ebc 42b75db4 c3a2ce08 c495cfb0 432a2cc4 4384938a c448f134 44845ebc c096de80 4330f468 c3f53acc 448e1ff8 c2e4e52e 438e4f22 448a9b7a 43ed79c4 c2804022 41f3d914 c438423f c4327c76 41832a60 42dd1cda 447124ac 4311b2e8 426b6dd0 43181c30 44a0dd06 44a49706 c30fb5ee 42e8a961 44a6ae5a 449ab476 42ae3708 4254b34c c49a3432 448e6650 410a1cd0 43822d55 448055d8 c4098700 c2866b06 435a4f59 c4bb4c12 4491a732 c2b5ec63 438c043d c3976ce0 c2973b40 410bdf70 4298321a 443f2168 44a21118 42cb481c 42a135f4 c4060e2a c405176e c17f1890 437e70b0 c30beb60 c341cb00 433458da 42be09f7 441f3294 c48deab0 4251f4f4 4304f350 c47e13a8 c4a31fdf 430f4494 4394889d c4883940 c28d9ec0 c2d94863 438cf71b 44a143f0 4472025c c2761264 438c4d44 c42805a9 4421feec c3239b22 430db5e4 c378d888 449accc6 4232e864 41591827 c4801557 c29a3040 43030c4c 43683608 c37139f8 44060320 c2101cac 42fff56a 00000080 -> bf26097b 3f2a4f05 3ebd57b7 419cb637", + "42bfcec0 c4994e15 c2b13eaa 4482bc5a 444a7034 c284c2de 433cd23e 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "43a0498c c44d72d6 c3105558 c40bee3d c0884500 433e892a 4322d65a 4348c7b0 4432063c c278eeac 431a0a87 448d0b72 44609908 40794b40 433d7c7c c42fdba3 440c3260 c2d21851 4212a1fa 4352e350 c2fbacf0 c32d69d1 43784174 4357c978 4492b67a 42fd4e48 43117e61 4403f2b4 c359f978 43326e40 436582f8 447d2970 44906802 4300a52e 42d55b45 c40f9b87 c3ecf310 c307a64a 42d2d7c9 44596ddc 44933656 c31b4c2a 434d0b2a c4a418d7 448a669e c306ecc8 428bd173 c3c420f0 43cf6690 4204f834 42084452 c4973ff2 429433a0 4338ab36 43419bc3 c4580458 448f542e c2cc6a24 43046f82 44087614 41dae140 430c7014 4249eb1d 445a7788 438338a0 427ea190 4394b33f 44b331a8 c472b9fb c297af21 438ae7ea 429c5150 449920d0 c29e6274 434e8aad c3e68da0 c39f2574 42cf54a8 4355d455 442b68ec 43a512e8 c320cfac 41a7612d 448116a6 44882870 42803728 42c973ce 449ec780 c469a3be c317710e 4305a17c c496eb03 44330368 426b5890 42b6db08 c4abf2be 44b11074 4318828e 4313ba98 c4598e7e c47642d3 c2d9039a 4283df40 c4011889 43ef6ce8 41b631c0 42813a91 c44ffd40 c4220b27 c2aa8842 43773de1 c48d5b82 42f9baf0 429aea8c 41f6ce4c c3854728 446b12bc c2a3b888 438b96d5 44a0344c c3e68e88 c32cf347 436eead6 c4a6e300 449007da 43025ff4 436e563d c4330fe6 c4b3898f 425a0388 42ecfe4d 421787c0 c421d2a4 c034d9c0 432b7fd9 c3b20658 4497e88e 42a7d548 427e286e c41162c7 c2a85650 c323eece 43437238 44969e00 c413825d c29d630f 432b3843 c4aa9c3e 43619390 4313dae0 42984374 44049de8 44a9e712 4198b0b0 438239e9 c4947d57 c335e9c0 c310d598 430ab300 447a428c 444a2ce8 432ad47a 4288d6e2 43dd8664 449ac3fe c29ba462 437d414c c4a93e20 c48837ee 42987740 431cc1d1 c494a29c c491f9ea 42434750 430e0713 c436e780 c3578930 431b16f8 4363fa53 43727240 c42c7eb4 42c1dd10 4350f4f9 c482a6c2 c389ac40 429dd7e0 432c4548 443163f4 43c1f5b0 c196d388 438d955a 44486198 c42f7fd0 c26e7f64 43259c13 43069b40 4491c530 4344b6ea 4394655d 44bab3e0 c2d543f0 40397300 4388b3ab 44903a8c c3cca1d4 c3163d56 432e2ab1 c3fd7698 c498d4ff 422c0090 434e00cf 431aea00 c3aa99b4 431130a4 432d7718 c4b1492d c4423cd0 c3340f43 429ee3cb c4557269 44386b88 c31f1582 43039ec0 4409e9b8 443a7884 42bf1b6c 437cea48 4442d7e4 c49b7372 432428d8 42e91895 c33ee508 44958b86 42cb04ec 422efa2d 44451270 447a87e0 42f128a4 436e866f c422231d c48a4bac c2d92d2b 4344c7f4 c4b352b6 444fbecc c22f7e58 42f0ed4e c3917604 4457730c 406f4a40 42c43bfb 447e26fc 443d3da4 42dad3ac 42a62609 c3cec058 c49a8d04 c2dc79f9 4245bd45 43bb0ac0 c41fed9b 42f50a80 42a26ccf c46e7692 c442eddc c2d06578 434753af 43c6bd10 4438f624 42f0ba7c 42840dda c3354ba8 c432a003 4336425c 4209a9c2 42505e20 c2fab220 c223e170 43887fc4 c3d48884 c3d50974 c1d13d68 43920423 436459b0 439fd1e8 4136a360 43505faf c48c87b3 40ac3300 42cb5ae8 434db871 43a47474 43f8330c c306abb9 439592ab c4035130 44b51d08 c1730ca0 436cb232 42e0ef70 44321950 42c6bba4 43485bee 44b6621c c409e318 4311b6b2 4331572f 445e8134 440e0184 42bbb16c 43881291 440eb7a8 c408dd46 42de2304 42aeb27c 44840e66 447a54fc 42878e0c 4330e54f 441eab00 43265f10 4130a0e0 423f9c45 44b8a874 c48c3ed2 4205b238 436a7d53 c4968f03 44abf8f8 42cf6cec 4324f979 44ba129c 43adcbc4 c250f55c 433e0b9b 43a456b4 4450a6c0 434277ce 42aac7cb 4435b268 44a95014 431af326 43086a1a 4448620c 44835790 4341d7e6 42bd6e55 44916c58 4494b9f4 c30e09c2 43186dd3 c40bdb1c 4490f206 c32bf04c 43936508 c4599988 43b0938c 42833104 4381bfee 442e715c c499ae82 c1096ec0 437d0b06 44a145b2 c460d57a 43231a12 41fcab01 44a80ade c480b0cc 427b74d0 41fb8f46 44825a2e c387c8b8 43054bc6 43666a97 43fc1fbc c4991e1f c25a5dac 424cec8f c4867939 c41c6bf4 431a85cc 42891b16 446b443c c42de3b5 c2df4df2 42273870 430921c0 c3a8f25c c20e6f08 4394d129 c490ab9a c48c509c 412f34a0 43471a72 c2a226f0 c4a903b0 4015d3c0 432e6ace 44a5ef1e 4499d186 c27995d8 435dfb3a c4436ad8 c4a0e42b 4265a540 43881645 c4a78505 c40e6d66 c294d725 423116f8 c4385a52 4282e170 42af26b8 4309ef2c c45e17e4 c427890c c33e3e62 4349f458 44b3c1cc 445f8fb4 4137c700 432c9da9 44386274 43f7fa54 4337e4f0 435b50e0 448f49bc c46f215b c2aa55a5 433d72cd 4380c01c 445e6c90 c2f04080 429a1bc2 44a7c924 c4813fb4 4338fc36 43616470 43baeda8 c4096254 c331717c 429ca7ef c49ff7be c41b66c1 42be1dc4 4335cbb5 c38bab0c c49b2a92 c1a5bea8 4285e2cf c4b22934 4480fa4c 420c2a84 424f83b5 c3b1cc8c 445472d8 43420cb6 43307f09 c491cacb 449e27f0 c33f38a7 43837526 c4b2de8d 44125f10 414f0590 430eb684 c405675b c2136380 c020aa00 41c09c62 c40b61f4 c423c18a c3391530 434a224a 4435447c c41b2c87 c0a23d60 430d6247 44a060a2 c3c6febc c294164a 4370cdff 442eb754 c4997a3d 421636b8 43612623 c45a475e c4a6c580 430be6d2 42666e15 c477573e c3a77e2c 42526b04 4355d509 c419d81b c46ccc19 c2e5ebca 42ef63af 44435698 c424fd38 c2b7c891 438a479a 438abfac c3968068 4318e124 43618a8b 4465fc54 449f6702 c21ba64c 420e8122 c4190b90 42c07500 426a52a0 4361b9f8 00000080 -> bec8cc36 bed699a9 3f51a011 424a56eb", + "4459d734 c43c7f82 c2ba84a5 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c3c683f4 432c4258 c327cc85 448ddf62 449fae90 42703c60 42d5f736 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c39af474 c29726c0 43275656 43dd7cf8 c49719ab c226d8bc 4289f5b8 c3fa10ec c45a9a9c 430c4158 438c9c50 c4221560 43e4d5ec 42d11c50 4382e47a 43cf3444 44356a30 431b0d00 42175f86 c4a1b2a2 c4aa960a c2afc075 42b4a5e4 44b03fb2 c4afbedb c346a1f6 42b71994 c431cbbc 42800840 43368d54 4213fe66 c2a6a800 432c3fe8 430a1ea4 41447c28 c46ad882 447e9c04 43478466 434593cb c458a5a1 c4b2fdce 42f4b3ac 435be3f7 c43b0517 44853408 4339e988 433c2549 448d373a c2e7fb80 c2cfd8ec 427d5c74 4444e3ec c44430d9 c2a0eb6c 431e9257 446124f4 447910ec 42b21480 433cbb1e c49861d4 c4908ea6 43302d12 43757736 c439e39b 444127b0 c16ca9a0 435cad4b 4466717c 443e24d0 429114d0 43719c48 443651f0 c44264bd 4319f318 41bafd70 c4439487 4329a660 c33d76df 422d277c c4a289c9 c3a650bc c21896f4 437276fa c424239b 444c560c c28789b4 429b9c5d c4351350 c3fa866c c2e9dd0b 42e1c65c c48fab9a c3b047e4 41aa2578 4218153e c49ca80f 44b938f8 c135ae20 4318ffc1 c3a1b81c c44444c8 42f5a148 4236bcff 4451fd0c c32f65e8 c1bd5108 43214be2 c3dbb14c c439730e c2b58742 42a1500a 44654fcc 43a1b7cc 419f3230 43564fe6 441d6978 c4876f99 41452310 43151ce8 c35b1ce0 c44b17ba c14d66c0 43138a23 43099028 c402130d 42916c10 42e527f6 440cba7c 44583024 43398bfc 42a24618 c49ba600 42c76f20 42b214ac 437a31c0 437641c0 c423d068 c33f5a51 437d7cf0 c3fc95ea 4467a640 43181c00 413b0f74 c4a50a33 44ae02b4 419ce9b0 431da126 44798c4c 4482be0a c235370c 438dcb73 c2dd4150 44b877a0 c32d8b80 42650dc7 444acd40 c3fadb00 41f706d0 430d7db1 4442d138 c49d6a70 4305a12a 432deef2 c41e5984 c4b1142b c308849c 42b20e46 44907442 44261e8c c3170641 43063518 c48f8aed 440f643c c30cc394 433d3f7e c3e29874 c2e38e40 c208fda8 4332bac7 4450262c c4757795 41327400 437d4ebe c393bc1c c4b3d44f 42e1bd8c 4213e8a1 c2c56460 4332ded8 c330dbc3 42a49b6a 44194a00 434c9a40 c3280e94 42a5cda6 44b20c08 c40ac2b5 42ad9268 419a7b1e 4464fe0c c4279b24 42462b78 4229094d 4429a7cc 44abea2a 43027a18 4369dc7c 4480eefc c31be070 42fb3ba0 42c6d497 449ce4b4 44b9c37e 428cb53c 43343e48 431d0618 44b9a7e2 c3067d30 42afadd0 c43eca0b c4a2deb2 42f453b0 42d0d73d 43f57538 448beb2c 42b32200 43293726 43a6ff24 4494c3ae 42654990 419ec3d6 4437d4f8 c3b095ac 42dd33d0 431b4abf 43129028 c37a1098 c31ae2df 430a7d96 c4654d8b c4b7a8f2 c2c8a36c 41787078 44382fd4 443b24e8 c2873f6e 43579d54 44931e52 c1ac8400 429f3c28 43930ed5 c482cbfd c31a5768 42e5310c 43607f18 c2ad4cc0 c4174c6d c1a7ae68 4380b2bc c4471b8c c4271ea8 c307c220 438e5502 44648d68 44521168 41ca4d20 43257877 c452d99a c473d767 c338b932 42456859 448f5c94 442587a8 c32a571f 429c845c 446d5bd0 4456c2e4 42000220 43898be0 42fd0e90 c4b5e993 427ab978 42317b7d c462c107 43f56460 431918c8 42c000b0 438fae5c c4adad70 c33c0b3f 42a556f9 44afe45e c4343ad6 c2e9296e 4389fa59 44831d0c c4146fcb c2e48a82 4390ff0d c46b452b 445d204c c07c2f00 435a0e94 c3082388 433e0ae8 c32108fe 4306d877 c3bc6500 43195888 43294412 43509532 4423b294 42c8eb70 c29744a7 4293619c 43b4b4cc c4abb7d8 42c790a4 424bb975 4495017a c42f00be 43302090 427b20b1 c4852128 4457b44c c30556f6 433e8e21 4211e7e0 c4809a3b c236d198 431f2c99 43581308 43abc52c 42b63ecc 4362ba9d 429481d0 44a4b972 42831e7c 4341f375 43468c30 c30f47a8 4328dc70 41b7a3ac c490dd42 c3e85134 414edcd0 43084fe4 44a84ac2 44b758c8 c2a2b495 43743095 431de260 c4a00e89 c32cbe29 438a592c 4484f19e c40fe4a6 41e7d6d8 434b6f2c 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000059 -> 3e632a8d 3f468f54 3f1746e3 41c900e2", + "43580970 c41d34cb c3107c21 c388d7f0 c491389e c31e8000 4373a5ae 433eb878 44122760 4290f6f0 42ef5912 c4905252 4360e0b0 c1afa6f8 42dbd0db 44945e00 c4a1e21b 42efe494 42a8107a 442d51a4 44025e76 4114b2a0 4381c39a 436a8fe0 44ad2982 beecfe00 4328728b 44671f4c 44934f24 c2e2b689 42e8c0bd 44ba54e2 c444c984 c3237341 4324d482 44199b5c 448e3c56 42a3f080 429ac788 c3564878 43c2d17c c237abf0 42be8cfe 43ad1e68 c353e7c0 c1c80bc8 431a7c0e 43b88d2c 43616688 43378c66 429f1a1d 444c7010 c384672c 42847be0 437248f6 c39d561c c3d6a5c0 420b80dc 430ba1ac 43aad9e0 432c2380 434701be 434c846b c2826c00 c40b350a c23deac0 43843dbe c244fbc0 449a3454 425f8584 416bde02 c3cceb58 434a76a0 4302af38 421d6838 c41e88f0 c44b1d40 c2cbf9ff 4254a252 4291ae30 c4bb4479 432955a0 429b2837 44a2bb84 44b2caa8 4216c54c 4333b1c0 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000015 -> bf4402f2 bf2451c4 bd2b4cbc 43127df7", + "4420d790 446cd7ac c29f2eac c4358f90 43b1b764 43147a24 4341628d 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "439b7560 c3670fa0 4299269c c4b602c1 441eddec 432e2c4c 438daa5b 448d2a9e c45d2d96 4208084c 432dac72 42145a20 c47a8dce c31b4044 43092060 449e85a0 43a9ebc4 42567828 4367b38d 443198d0 408e9800 42b02084 4370e21a c411dd7d c4661af2 42d9f070 42bd3d7e 44282f14 c493f30e 43339aa4 438f8cd7 c2bae4c0 435e7e08 c20a930c 438de18c c495b717 44ae1eb4 43426492 428ead8e c417cd67 44b84990 c31fddd3 42f5b2e0 c4bb7345 c4b8a46e 42de6c5c 4392108d c445f945 4484a6e2 c283d854 41381d23 c4452351 4489f3f2 433f1066 42ca4bf3 43729710 c43a1083 c2c47139 43783813 44a4c642 43d77570 c2e1613f 4369953d c436ef8b 43c240b8 c321c8a2 438d09ee 443d6720 c47919e3 c281e9f2 438ff802 43bef2a4 c3686940 c153e670 436227bf c39445c8 c3fd772a 42ecd028 42c0c717 c37e8220 4460ac54 c331b257 43833936 444ab4b4 44a66e12 42aeb1f4 43384882 4390c180 c49657b6 c25af848 43801525 441d678c c47b98e0 c2b64ed0 4347a5d2 444cde4c c3fff686 c312c7ae 42eaf741 449a87aa 447edf74 c2dfbdef 41ee2776 42419180 c3b8d148 c2435cd0 43763d5f c3948634 c448c6ef 432542e0 42a4e84b c3044ea8 44ab353e c215f344 424a352e 4383d234 c3e458f4 c347b831 42c91e38 449a2cc2 c1827680 c27d49e0 4347802f 44648a7c c206da80 c2c92c7d 43103369 c4831836 446ab31c 433ce1d0 41f68fa4 c4628530 c35fd7d0 c236b318 4330d8c1 436db9a0 44b6d880 c268ff88 42f838d3 4345be90 449767ec c2f00178 42e73d6a c46b8ccd c49102dd c22b488c 43647655 4441b128 c489e508 c32d91b6 43055ce9 c40081e7 44709548 c1819b60 4303145e c0b2f400 43489d98 c2bd3dbc 418f7eaf c48b6778 449bad26 42835d40 433488e7 c433ee52 44800282 c33340c8 4196c9a8 435439b8 447835f4 41c1e570 433815b2 44b905a8 43a0d298 42c5160c 414242ae c41a1252 44b30ed8 c14fe380 435282dc c49791d4 c165b180 42a39ab8 417423c3 44392454 430c7280 42c2826c 42eec5fb 44aeb53a 44af9c84 c3291efa 4159655e 44281adc c401be88 c2bbd0c5 4346b9c0 c4435792 43a7e9ac c31e5aa9 42dbda55 c4a47621 c3ce5898 c2fdf064 438b75af 435710a8 c2cd4a80 c1d99bf0 435b37d4 c49f97b1 c30fa860 c316d27c 4320fce8 c4963df9 435817a8 432c9f24 434194f3 c45906c0 43db1b8c 43087a60 4358d9a2 c496aaa1 44030100 c32e267d 4338b581 443e500c 4310ab18 431675fe 434b4064 c3ed05f4 c497a858 42d64598 434ff668 448c03d6 c48d656c 424ff87c 435eae02 c40c8567 444fe5d8 c1ab6010 42b7056d c490716b c4b35d43 c29dc791 431efe8f 448181d8 4329a610 432534c6 42587256 c39cd1dc 43c648e4 c1bf8818 43361b60 444b0f60 c3a3be18 c2caeb42 42f452c3 c417a422 437064f0 c30293a6 418670ac 438672e8 4447359c c240de5c 4392ee8c 440a34ac c3330df8 426ba3b8 43929460 44a5c4b8 c4625e3f c28fad9c 4307b22b c46147b6 43345f50 421d884c 4200c595 c3c027d0 43188d28 42cdac80 4286605a 43cacfa4 44280844 c2b74150 4357d729 43e92670 c474396b 4324c0c8 4315ef65 448d38da c4409645 c1ce2fe0 435e6d54 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000048 -> bf62a926 be8d822e bebf5c5c 420d3985", + "43afcc58 c3ed1830 418a0310 c4040c65 44771fe4 c217f0b0 4388d848 44a3ba06 c459747a c2f22d87 42c8d636 c4b8fba6 c39f3b44 c2e7807d 436fca54 c477a1d1 c4b5ecad 42c591b0 4378ae6d 44b2a250 c3a79cdc 43123c5c 43197527 43fe7e60 c40471e9 407d9c40 43233ed4 c47b71f6 c4961166 429f10c0 4367281c 4383d7bc 447758b4 42dd5148 4382f59c c43c0fa9 c34521c8 c334d0cf 435b311a c3ddeae8 c41f0e3c 429ee1e8 431f0e1a c49fe146 c398fd40 426df448 436c59f3 4416f1ec 440e9da8 42a56a28 42987152 440d7434 44998cee 424ba684 41a08dc8 44746300 4484f25c 433d07be 4122740a c4074e33 448d3a12 42c3a0c8 437caaf8 4206bd00 c343fea0 42b31d28 42753928 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f4f4320 bf118d34 be154c56 43180f61", + "442c0744 c4060c86 c3115f9c c4b1e568 c2ae1850 4296becc 43520000 c3de9728 c36cea70 c2b6ad01 434da8a4 442c09dc 4475611c c122a760 42f7f820 c2b11b00 c49fbf9c 428ebde0 42897542 443571ac c4ab6faf c2286fb8 430fe5a1 c4a9b684 c3935cd0 c11d1ec0 43279557 4487ae78 c4ba7789 425e6040 434d7e49 c2a92be0 c47c81f6 c2611548 42528cc0 44b0b672 c432eb14 42826558 4309290b 44a49198 c3e86688 c124d8e0 4307b6c7 4416b0b4 c4029e12 42105530 41c2aeef c42c89aa c328cb58 c337b3a1 42e52f73 c4aa7356 44b1e6aa 43161c00 42c17a6c c483d974 c429a267 4327ca3c 433eeac6 44b9d348 c4851c16 43032298 42de557a 44538848 43924f88 c2edb210 432e286a c2c0e740 c401548c c1fa2fd8 428d3e45 c3857c74 c4430ae5 c2bd11a1 42fa2da3 434dc830 44acf628 42d0a27c 435b42bf 4469a9a8 c35df288 c2b53f40 43033e6a 44ad40de c4264274 424dd6e0 431a3f20 c41ef675 c4a4eaa0 4347731e 43543ff1 c3ed0c88 c4acd24a c1b68fa8 43703465 424ebe20 c48c7a74 42725350 421febb1 c48d6392 c4b271f2 42028868 438da585 c4b347d0 4478c780 4333dcb0 437399f3 441e0ddc c2818390 42b867b8 42808f1c 421c5440 c46295da 42f9d764 432f28eb 448b5990 c3875dd0 c2350d50 431c145d 44afd586 441a1be0 c2b1972a 43003636 c4004c64 44284d80 4312d43e 42ebaeb9 445ebec8 c2b4df20 4317da2c 430a8762 c40eaabb 43ec1ec8 421dcd30 436e58dd 448129b4 c3fd6c60 c2262370 423f26dd c400803f 44725880 42e554a0 4374cb54 c3ff6cf8 44699710 c2fc7dd6 424f225b c44cde82 448c0992 4328e242 4224ab23 4432e958 c48419d8 c3123454 43031208 443899d4 c4748865 42358700 42c08f08 44ae3cc6 43695dc8 c34496b2 429fb679 43942cf8 c41f85b9 4316f514 43811064 4394e3f0 c4b229d0 42b410d8 4326c252 c4b66727 c4369878 c301fa25 425115dd 449d0e46 c2bdbdb0 c328d5f6 432011de 42f01bb0 44273e60 c30dfd69 438aea92 430eef78 444c1e48 42a3b934 4263f95f 42898c00 c46f24cd c3377e04 434c704e 44233288 c49681c0 c305bb5e 4363c114 446bf310 43095650 c2e75199 41b265c4 44a2c5c6 c4006bdb 418f6d58 4289208b c483de53 c3b18224 c322729e 4315c861 44b140ac 44b745ac bf084e00 42b51982 c4977b9c c49782a3 42cdff64 42a026f0 c349b5a8 c49ba319 429a9758 4379b8b8 4377f2a8 44218290 c285d932 43034120 44b55c54 c4a70604 43012e46 4389aab6 c4996c94 c3637558 c287119c 42ec5c6f c435db36 c4ae3036 4205799c 428e85de c4715f41 44a627de 42dc2af8 42688aa0 4405b530 c4500430 c2f88068 4324eaea 4408dac6 4445a230 41ee2f10 433e455f c3ee45d8 449f02c2 c291826f 435d97d7 448433d8 c3ada968 c180c1c8 4292da94 44ba07e2 c48bfc92 c2e1591c 4214bf0c 433020a8 c470cc1b c22e2ce0 43291020 43ec57ac c48c6346 c33fe822 41dc78a0 42169ba0 430ac070 c32e9c92 431801f4 c40eae7b 42a38780 c30ca90f 42e4cd75 429bd790 445fde38 42bc8444 4293aafa c26df100 c460010c 41ec22a0 426988e4 c493b987 43984c7c 41032cf0 4383a0e0 43633400 c3caeff8 c2e3de59 41c767fc 44289348 440818e6 422ba3cc 431acf02 4478a0d8 43d351e4 4316a7a4 432b7bd1 44367570 42269d60 c31c5ee3 43708570 4487358a 447652e0 c20033c8 42d0aa59 c44617b8 c4961722 429a3120 42869a5f c3a36a4c 44bad2fe 4235b868 42e347f9 439db790 c44ec660 c1b83ce8 41d1fcd7 439db45c c4846660 c0c262e0 42537f3a c3fd5ee2 c4b6ffbb 42d3ee78 4340349d 449d7e16 43df836c 41366670 438556ae 449e31f2 c470e550 c1143b70 43911c93 c498e791 44512b28 c29af952 42b5075c c46ec17d c464977d 425be074 43140869 4400f9f8 c4b4e900 42805450 435cb480 c4a20ac6 c43b946e 431dad9c 433a16d8 c46228c7 447074bc 4334ae78 4336f0a2 c4b09930 44acf632 c1679630 43800a5b c4a3ae58 445aaf1c c2178300 4334310b 4355c6f0 4466bc0c c2b368e8 428f1b02 428027a0 43dceeac c2bbe60a 43799d0a 449cc1ae c47b6858 4315bf82 4300e0dc 41e44140 c4b82f88 c11a68b0 42c9d676 c3de9d00 c4ad1ede 41c14d80 434c5338 443f1c34 449dfc64 42954fc0 421d71ec c44cac71 448eaf6e 432ee2ec 423ffcb1 c40ab140 c2fda230 c2e4b487 42f63f1c 44596dec c4a88aad 4321e2f4 438253a6 4435605c c31b8480 c2ebd4f7 4303f950 44b5c99c c4a2058d 42975974 419e19f6 44a756d2 42faabb0 c3254432 417de140 c22fb5c0 c4832314 bf9b7580 418a663a c4499f0d 44306a00 4304d254 43467d47 c48e1f5c c4742185 43420f42 4343d9d3 441d8ddc c4893612 408f0ee0 430f7bea 44a90074 c23c8520 424007fc 430f18d5 c494744c 43a753a4 41e55ec0 4387ff56 4479d9ec c487127a 42944174 43513154 c448eb13 43e57668 c309ff2e 4350be69 445c3eb8 449c5e66 426910b8 426723c0 44acc958 c4694a4a c3086fc2 41cedfc2 c4531fb9 c437ef6b 42c2a714 432e878c c2ddede0 43410900 42a86c04 438058a0 432a4c18 c44b53c9 c326cd83 430ff6ff 449e28dc 43bfd178 432671c0 4383b3b2 436bde90 438c4cd4 c2f65ecb 4211fb7a c4a8c9af c4850e77 c2036ee0 4311baab c4b43187 c416217c 430ae1ce 436ffeeb c20abfa0 c3e66614 be423c00 4366e676 c402f6c6 4343ff48 c2cfa312 43802892 448a1696 c4b9dfd5 c1bea920 42afe5ee c35428e0 447afe00 c313f530 412ee75d 4351f228 4410cb94 42d2da00 42684e5c c4bb2c3d 444be500 4209d810 42e8fe68 44ba574a c4a22bb9 c34615b6 41fa1980 447cac8c c428896f 41992618 42654bc7 4422dae0 449c8a1a c25c7054 428e02fc 00000080 -> 3e43d4c0 3f5f20e9 3ee71bc8 427a6b20", + "449eb7bc 43f32040 c2e3ce43 c4a278c6 c4b9692d 41edb8c0 42599cfc 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "44b888e6 440347be 43203318 449544c4 c4022ea2 41681240 434f9ceb 445b2988 44226f04 42d032dc 4241765d 44469c9c c4359f53 41c1be00 4269e065 c4b6d2dd 438b6d3c c18b46c0 42b4cb74 431af330 420e1940 c13071e0 438a5cc6 c4299e8f c43c76ef 41b4c7e0 430011ec 4450c45c 44a2cc88 42d507dc 41570d1c c45669c4 c49fe071 c217435c 436ef7d4 c4a5a8cb c3693b10 c2446cb8 42946eb3 43be6338 c4ae1b45 c315e93e 43453ce0 c315a680 43919d34 41b4a5d8 43846a70 445de95c c451c84a c3324a92 4301a8e8 c48f5210 448cf4b8 c24d71c8 42564800 44361bf8 c497bfb5 c30fadee 43464eaf 444a7284 c48b142c 43213a2a 43816c24 44a8dbd4 443a49b4 43274590 43526f3e 44842420 444b3fe0 c31c7156 43352978 c455366e c446b825 42707dd8 431f9ef2 c3aa1238 44751654 c14267c0 434e4305 44103234 440552ce 42320268 432bd6cf 448e7272 c3db7f5c 431d9efe 42d82ce1 44178c74 c437961f c3354e91 43909f0c c423e8a6 442aec94 c19b2eb8 431a5ccf c489c1cc c42ea5ca 429c4940 435580a2 44062c2c 4488fcb0 c33d7570 4189ba5c c491b9e5 c2d7a6e0 c2f27a2b 43850075 c44dd18d 44855fa8 42d2e608 4389d303 43bc917c c2d7c7b0 4336d468 4212e960 42566860 c3e87f2c 433f4a70 4337052e 4484dfcc 436fd690 4343a2b0 43372d06 44283330 c484c12a c298fe33 43177795 4454a6d0 c4824f7b c23abe00 42329997 c48a372d 4448eb2c 434725b0 4379d1b5 43e31dfc 43818f44 c1aaa8d8 4302950c c480b693 c4b744f6 c31aefd1 437f74de c1c9b8c0 c48a7c7a c2823ed8 43770d22 444b1e54 c3d2fd58 433ff94c 436e6ad2 c41e515e c4967954 430af5e6 421ac866 448d142c c3546a40 c29f81cf 4390fbfc c4814346 441cd07c c3204e49 41f985a4 c2a5bce0 43d835f0 42e3aeec 4381624e c2cafd00 c48ab549 c1bd9680 438c1111 44956000 433b4758 c1c07568 437e7c01 c2c445a0 c485fe0c c31dc652 43362222 44679898 c1cfd3c0 42ad982c 43050440 c4759262 438f75e8 43043ab2 419bd6b6 449daf0e 44959812 43344d10 4294e2b1 c420aeab c260e1e0 c2bf9949 430bd3b1 449a846e c4aca788 c2498f7c 437fc304 c3e6d9e8 c2778800 c26e0024 4343ce88 449cf84e c4a955bc 431bb99a 435cae20 43ee51bc c4b9de3c 4252a90c 435eb8c1 c40446b5 441b4a2c c3095ab0 434a8c4c 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000035 -> 3e82d2f2 3f6a1db6 3ea095f0 42e9a803", + "c4925295 c340f330 c33f1bc6 443cefb0 44a3ffbc 41d73440 42780e78 c45318d4 43da9b20 c204aeb4 42c31dc7 44b8910c 44a1a054 c1e75c58 4368e97e c4356b1a c43d66e8 c2887650 424a8161 c49ee51d 41869c00 c3165905 4356d5c8 c4947760 c3bd491c 43267492 42af01f8 c45413f2 44957820 41fbda48 42d04b5a 4390d074 c3053db8 c2d26532 424957f4 c1022d00 c4aecad6 4216b1d0 43273130 4454ffb4 c2e7e060 42a00a10 42fd9156 c2a690f0 c36252f0 42855c8c 41fa2b00 c45e071e 44ae52a2 c32dca75 430f47e2 447564e0 428f3500 43265338 426c8a65 444f46b4 c4773182 42a794fc 42ef4d19 c4b38d8d c41600a6 4338da12 42cd9292 c4a25ccc c498d6e8 42a44e30 43259c8b 44117f8c c41e8ac8 c2b6e68a 42960c71 43e5eb7c 4457890c c2664088 433c541e 44652b70 44261220 c2d4ba99 434f1065 441b54b0 44808bda c32eaeee 42a65fb4 4479cbe0 c48ed4f5 bf826380 41f89b20 42eea450 c4a228dd c25ba578 42d19706 c403b158 c454f0e5 41057010 43165c4b c014ee00 c3b3daf4 c28376de 42f04a53 442461f4 c48ab563 c24109f8 4389b9e2 44111d68 447ff9d0 42f50c18 41ac5ce5 c4792b1f c41555ca c259ce10 41cf7648 44a39eb8 c4b04528 4288cc58 4276f245 c44578a9 441d5218 c0a7cc00 438e72ba 438e7648 43c70f70 4346ba22 433fa9a9 449fb564 44a6af88 431fecc0 4308c9d2 c42f1a14 448b88b4 c319b822 43056262 c3ab5ce4 4484dab0 43382448 43315445 c2db5d00 c48405d4 41bc6c50 4394ce27 c40c6540 c2fe2640 4321f5b8 429e8df5 4418c6dc c4102a25 c22f1aec 42bec9ec 43073e30 c3ec5420 c2ca2999 436ef1c3 449373bc c3a85f84 42e3de74 420c4e20 c48983e3 443db210 4343c902 4363351f 44a58ef4 c3c45698 42da9fe4 42bf7f45 c46c1c8a 44a4673e 42875890 42072b2e c4a1672c c4983ff2 42abf854 420ef7d6 c482eba6 c169bf80 42582e04 42474e63 442adb00 444172b0 4329169e 433d4069 4321cec0 439e05e8 431cd91e 438afdf8 43bb30d0 c4025239 414e72c0 4395b603 c4a17597 448c34e6 c1b42568 43580c6a c4801245 44686b0c c333e432 438dd613 440a4550 43a3d280 c33284e0 4367ef66 43cfe5ac c40f9caf c2dc1a57 430cd035 43bf3a40 c4800cff 425dbc50 42fae23a 443d7aac 43dd4140 c26223c4 42edb5c9 4477a7a8 c3c0f814 c2f3f4a4 42d6f620 c28a1320 4482f2f6 4288b678 43818c16 c38cc5ec 440061b8 c342f5be 428582ab 43e171c0 c4b9d4c0 432c1da0 42d9c5de c3256c80 440f8f84 c1967d68 42319136 44192bd0 c48076fb 433fcdea 42a257c0 c3b348b4 c330e158 c2a2b8b0 43113754 440cbd84 c4892e81 c2cbb4a8 43045cb8 4236a8e0 c4a1df29 43181f4a 436e43f7 43ac40c8 4420992c c1550d50 437c3289 44a45f18 c464eed2 c2615f48 439146b9 c4190fea c4b09048 42f0a098 433eae16 c44bd188 c417cd65 43354962 41de0a9b c46519fc c442f283 4288e840 434d1b22 c3a23c40 44a89d24 433643e6 41a36604 431dcc50 c45d8756 c3037ba5 42b1bdf5 c35e93b0 4387fe14 42906388 4332c446 c48cf216 c485cffb 42b4ec04 435de938 c44e78ea 43b0b66c c2ffc900 431dbf35 445fb6b4 c4b6f784 4333ccf2 42dfc30b 43d26234 44022c38 c2d19567 42f63ba2 c46f4699 c46ce485 c2da1302 42b3967b c39a301c c45b5af3 c2278d98 434ae856 4441d9dc c34fb600 c2adf2dc 435ec58d c4b2b37e c49acf5b 41852ad0 4356862a c3e2fbbc c452e0a3 bee36a00 420aafea 43565560 c450221e 43069bc6 43313fe9 c4a5130a c47dc0e6 4315cc38 42f041fa c4bb7300 439c8634 c226e49c 438475ce 44aefa5c 4452ed44 c3239942 42a02a5b c3cd1e48 c38dff88 c2fc3400 4389e8e2 4439ea68 c4a4a46d 433ce762 43703e25 c3f72234 c32047d8 c0b31780 435838ec c2b12890 c43fd0c5 c346f218 430436a6 c473fe94 c482253f 42fee3cc 438ffaa7 c3e4912c 43e206c0 c2e3b861 429c9de1 c3fa73ba c4b5ada3 42840cec 425ac70e c4ae592c c390b514 42d5ab84 42a07dfe 44ba1054 c416098f c27ccc60 438dc8e7 c4aeb7f1 4376d010 c2823ffc 431e0ad4 c43b53f4 c4ab8842 c2ced12a 433bd617 4403bd7a c47c767f 4323b662 4365353b 4398920c 44b1d98e 42a37d44 4375f650 44ad7bda c489cd71 431d9df6 4358a536 c46882e9 44a87334 4205bd1c 435e62a0 c39c29f0 446e9b10 42cf1874 438c194a 44069d3e c4402a21 42abf400 426dce9f 4496d784 c4a543ea c23440d0 4335cc03 446cd17c c40fe8a5 42a69908 42c4ec89 c3883110 43992e84 41bfa7f8 426ccb01 c493a8a0 449970aa 41a7b210 41dd1149 44156008 44aa08ca c2b05106 43823a72 c38d2380 43c22570 42caafcc 420a7721 44bb01ae 439d3ca4 c31a28fa 43074e3f c4223773 c40ead88 432d7f46 43073e40 c31aad08 4433117c 430d7532 43274d58 438262f4 c49183fd 43472974 4347ce37 c3632970 43858084 c29d4eee 43347b01 c3a609ec c38117f8 4249ca84 431725e2 c42fb2ad 44148c60 c2d5f5f9 435c8ec0 44ae10ea 4483bc9e 42d3b150 42b23b72 c4118ca4 c4142818 4215f348 428e575a c465dbd0 c427e182 c33f77cc 421b5a82 43fc9138 c48b7e20 42b0f758 42e9244a c4a6ad33 c4b7c18e c1272a10 43344a5a 44aad1ec 43bba764 c1c20908 4376e71f c402734a c47ae106 429c760c 43339396 44b383b2 43bfd2f0 c3057584 4333d66a c49e8b77 c45b3d06 c14ebda0 43372beb 44b1cda0 43727db0 c2d2cf79 42b8fd97 425adfc0 44573a94 c179ba60 4253d1e3 434b0380 c45e0eff 4327cb52 42ab8c09 44108c20 c4350657 c1dc32d0 42a8561a c44edcb2 43da02c8 42d86ec0 42d8a9a8 c3841950 44a7e41e 4332b2fe 424ae8eb 43a05278 c4b822a7 c2d637b8 432e090d 00000080 -> be266088 3f4520cb bf1df1c4 430d7fdc", + "c48f8846 44a52b50 42e5c694 c48cf9d0 c39ffbf4 c121ed60 436a5068 c468f080 c4a1a2fd c30494a8 426661d5 c41c9144 c43c12e0 c317246c 42a2af6f c3452278 4493019c 42b00ea8 42861539 4499f99c c3cfce44 c1da0160 4308c561 c48b442e c46c17d5 c33d6d53 4341e247 c4977b72 44053058 406d3d40 432ae02d 449440b8 c4ad21d8 c3133471 427ac396 c2f74350 4397729c 41dbbab0 4382778f 44ab2ef6 c254ef60 c33a1792 433125d6 4398fd1c c473c964 c317b946 43548ec0 447373e8 4493e952 c302f67c 422fab24 4211e080 c3c49550 c2f0a289 41fc310a 43878880 c4b2aac3 414ae0d0 438d224e c3c7a200 447f7660 428df5a4 431e6e2f 43331af0 43aab4f0 c2b8f981 42a6b2f0 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> bf5ac8f7 bf03af75 bd90e6fb 411b08e6", + "44855028 447b5c9c 43357804 44850b0c c442d88b c1e54c10 42d17b63 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c3f506cc 44072fc2 c1e4fb60 44681be8 c45fc986 3fff9900 42f78a6a c4ab879d 429e60c0 4307a4a2 41d60531 438901a4 c3424b90 c32c4b38 4340a51b c09bae00 c4900c3a 42f3d848 4321a721 c4b53faf 44b7120c 432277be 4382d34e 4373aea0 44900ea4 c31d1d9e 42d8c6c0 445c3404 43ec0fe0 c3148121 43698cc7 4439a548 443023f0 c2f94688 4331a0c6 448c6052 c4ace475 c33b8b7e 4313fdcb c4b8efaa c4797513 41e3e510 43614ab1 c3814488 c4a531f0 c2716b18 42e026ad 44460b1c 441127ec c265c12c 423839e3 43b94ed4 4463d06c 4307885c 437f9e63 c4a9afbf c4636e9f 42c56268 438b2c1c c49818ff c47ab546 421dee80 42f36c61 c3998394 c4a1e861 c297cede 438130ae c43de0c3 c1d24b40 42cc60f4 430f3bb2 c49bb974 c400450c 40ce21c0 43802543 c3791668 c47c2978 c1936478 43214e89 42d23bd0 443f6b6c 41f0ad70 421c12b8 c4154583 c4b9d903 c30d121d 438dd8f0 44948222 c3edd544 41435c30 434e7f81 c41bd52c c493d218 c23db7e4 437dec53 434e0c88 c46b7f26 c2786f68 42dc6f0c 443aee10 c1b0e2c0 c31df01a 42b23c56 44a44682 4494ddf2 c338292a 42bed8fe c41f438d 44b794fc c1e00810 438523a3 44361cf0 c44e4345 c22f8a50 42d8b977 4387c424 c0822700 c3264dae 42f815f2 449dd89a c3c84d98 43382f44 438847e2 44acc46a c49e4a2e c3051e8c 4392f1a2 44a7d494 44033e06 c2af85ca 4299f5e4 446f4ac4 c492dd05 42da0190 41b263a7 43e11b3c c41434d2 c30733b0 42fe50d4 44ae4d94 448448ca 4279cda8 4388702d 449a4ba0 43dc35ac 432de7a6 41ebff3e 4421a4a4 c4aba864 c2c78466 41f27d6a c49556c0 44a94dc4 c1f11ca0 42f20279 42c10260 c4612c11 c2965065 4381b9a7 442c552c c4a4bf3b c274c5c0 433babc3 441cb764 c461bb6e c32e228c 4341fdc9 c30e92f8 c3e42ec8 42974990 42bb1bf1 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000002a -> bf3c6c06 bf2c9643 3d7b695d 40da222e", + "c4003f39 43cadc90 c2cc54aa c4a740d7 44b93950 c294e000 424e0869 c49603b0 c431735e 43221ee6 4305126e c45914dd c48b0c7a 4313081c 435046c4 c3a566c4 41f5c880 c19f09e8 43949759 c414a249 4402a96c 4321a744 431caa36 c4ab3302 c462dd18 42a9f1c8 4332d25c c415c4a0 43ac25b0 c253c430 42e0d1bf 44ad6e7e 442f0ad8 c1fb2778 4321ae04 c3d744a8 4401540e c10baae0 428b6324 44bad350 4422c810 424fb45c 437135bc c32eda80 c469cbbb bf242100 41f1fbc3 c4632ffe 44a90726 c32ee720 437cea2f c443e4b8 c4179fa9 c33a11a9 413bfe3c 4291dbb0 433b4560 42857ec0 43813065 c423e00d 442dd264 43092106 4316b503 4494684c 431c7eb0 c173d3f0 431460f8 441bc44c c3e92e7c c28a3888 435a03f4 c4af79da c43fa79f 4344d54c 43339605 c4aad990 c4936da5 c32e63c9 438100e4 441556a4 43d5ea50 c237e740 42debfe0 431c10d8 42b40da0 c31a44d1 434abf8e 4414ebf4 c37d8e60 43477d54 43704754 c4b96962 43b68d1c 4329bc74 42ae88d3 448c5514 c485449f 43209be6 4385fc1d 4429c71c c4b38a05 c25c96fc 43809e34 43b94698 c3e7d3dc 42f47564 43952e37 c411af96 c315db08 4338a72e 43030fa0 c099c800 4469c118 c3090e87 43434729 c3e5f26c c1a1e540 432d451c 42e821b3 c33a7d28 445ef084 42dee284 42bd7b02 c3e74478 42c6f560 42a9616c 4301015d c406e8fa 44293bb0 42a872a8 438777e7 c45cff9b c47424c9 c3147834 434e967b c424a413 42c322d0 42b4d73c 428bd00c 442853a8 c48e81f8 c261c3c8 42a4235f c30a7430 4373d0f0 c2a37795 428475c2 c2d5f1a0 c420e971 4327e50a 42f0f5b7 c4586ad2 42d6ab70 c19a8458 438bb8d8 c4410863 c4a14755 402beec0 4210d08a 43c8957c c39d2f64 428b6200 43323b38 44339dc0 c4a44e55 c2e64e8d 42cfe018 4409227c c2765ee0 c2628af0 43761cad 4448670c 4429f374 426217f8 42cc5b7b c338eed0 42b48d20 430757f8 4367b82a c444e138 4255f340 43326880 41a06eaa 44656e3c c3ff9ba8 4296abac 434c2beb 4427123c c46137f5 c1cf2610 428e1f3a c4b1d292 43cb8a54 41e91f88 42d2f370 c322bf48 44511780 40670f40 42f75bdd c3c4443c 44b0e756 408d71a0 4393ce82 44a023d8 c493ea7e 423604d4 43169ab2 4493ed1a c4894dd4 c06c7f00 4358a24f c4495399 44359ff8 430d2540 422e6fb7 c3186e88 43d156d4 42db5c44 4300de82 c3bdbb34 42ff5b20 4221dbb8 43161c25 c4aaec80 c4840ddb 42e6b2bc 42408d27 c481d7f9 c40cf01d 4314d7b6 4349463a c4b399a7 c320eab8 c2275ea4 42ae22a7 c4b8f53a 44acee1c c31cf2c8 435519fe 4421dfe8 c45e60cb 42dc11e4 4334c85c 441cb5c4 44270d1c 433f98a2 42b882df 44541f54 c3012098 431803b8 4373cba8 c4b9c780 c4965352 c3409b16 4379b682 c3c220ac c4b10865 433044a8 436bf6a5 c4091c8f c254f9e0 c2872058 4332e46a c432b01e 4478657c 42992c08 436db583 c3e5d754 4382ab74 c31c5aac 43178847 42bf9510 c49fce5c 429b3fac 426d3826 44489aa0 c4b6e772 42db5a54 42ce7398 c47859e4 41632c00 c2721ca8 435411e4 c34bdc58 c4a2c828 4277f708 438aae31 c3585f90 434e6498 431e114e 4392ef84 c4b3d242 c400aa9d c23aef6c 429b7a15 448ba6c4 c466798b c28a4666 43844622 c4afc616 c465a8e6 432ebf3a 42858402 c3e43c48 c3a20260 c2b49753 438bf500 c38e64a4 4482ad02 c33059ad 42e3d438 c438b576 43b2cdac 423082c0 43759c6d c4896917 43c972f4 c30bdd1e 4285957c c472d651 444a25f0 c2644674 436b9cdb 440ff544 c48aa82c c14f93e0 428a058c 440f0384 c2ed1eb0 c2a1e8e2 4330af0d 440ad318 4494aa32 c2a7d767 439262e7 434b9880 c4822384 c271ae38 41acec08 445abd90 44282e14 40d7d800 43320728 41e82980 42dd0f20 42b41da4 42fcbd32 44239818 43542408 c31fff18 429e19bf c4ab9d79 c48a4119 42a13a40 42abcf01 447c5820 c47fd4a0 3fc12700 4292347a 449f2912 c4a0f58e c2cff51d 438df73a 43189158 c23bc500 428a94c0 42e3393c 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005b -> bf397f8f 3edcca64 3f099ebb 40dfdbe3", + "445070e0 c42dc61c c309f5a9 c4922459 c38fbab8 c199ac58 42a68c2a 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c22fadc0 c48e82c0 c25f3f08 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "44694e3c 440fa890 c27cae30 43215530 c464d235 c33c9dc6 4248cc5a c3888a7c 43dfc948 c3137542 422e1fee 4425a8a8 c23dc220 41e744e0 41923ce2 c4b20133 44885b38 c2536b68 41f7aab1 c49c6b17 c402679e c3183d6a 438f2642 44a206e0 442a5b28 c2c85aac 414a16b6 c4a58c61 449278be c2722028 43759f5b 44864d0e 43801f80 c317f79f 43336513 c1cfa8c0 44a97a4a c3183872 42645b6d c4159766 c1222680 43063ede 42d438e8 c481c080 44b97fae 4292a440 43915460 44074c24 443b0720 c2cd9d8e 42bd0f92 c4ad88e4 44b94214 c21c09f8 43703701 c4423264 c49377a6 42208b70 4379b977 44a70166 c4b43ab7 c327f7a9 432054a7 c4159c48 c407da32 c2c2024d 4245231e c3cbd7b0 44b70e8c 416e19d0 41fa3e0b 44372044 c45ce2b4 42d9615c 43340423 c1e3af80 4457fca4 42ef020c 438cec99 c4ab0f6a c423acbd c2890f82 42c75128 43dd6a60 c4a60e04 42dc3350 43824bec c46dcb93 c4025268 c27b1f0c 42f3107e c3de9990 c41b63f9 c2e2607a 42b7121a c37a60f8 c4091368 c33ba402 437c3023 4431e180 430f8448 4225e580 4352c046 c457dfe6 c477ccbc 41976960 437b357a c450471c 446d28e4 c29d55c4 430d6548 c4100137 43f465ec 42e23cc4 434a7040 440f091c 444b2f88 43144efa 42a121f1 4302d6c8 c39ff03c 43350266 41a7da48 43d9a74c c482457f 42b16c98 430ce4a0 44b72be0 c1e25840 c3041c72 4271017c 4440d028 44addc5e c2efd01d 4319d714 44058fb0 43cca4d0 c3213332 43149f76 41ece900 44a64f98 4262e8b0 42e8b394 c4b2e900 44923c3e c3295c24 4351b6b7 41f06200 43205808 4210b524 43453b4a c3209e00 4457acbc c2a6c914 42db6771 438ef928 43457410 c3352495 41da2c91 c31c8a28 c49783c6 430951b2 435e336f 43dbbc74 c48abb2a 429ccda8 42dbbb4c c2dfcf70 c41fe724 43423320 41cdf0e5 44026f84 c3a0dbac 42bac4c4 433808b4 443caad0 4380b1f0 c34203f6 4364fdb4 c49eff1d c4af1539 4330892a 43082712 44960c2a 42909380 42b574b8 43919480 4401153e 4485a9a2 43204626 422a39e5 4385ee00 c4ad758b c33bec8e 430208b8 c495ecff 4499c8b6 42b03050 438676cf c4658854 442e2d30 c2db3967 429577ad 434bd898 42d8f1c0 433caf52 41cc954d c4a735de 440f8cfc 42139710 414c2ada 431891c8 c41bffc1 43416b60 430243e9 c481845d c389911c 4304a3e6 4235fa5a c3912784 4429dd64 4289cdac 4339d115 c3aad550 448bf698 c1600290 434293ac c3ce2498 c407565a bd044000 437e0668 448915d6 c48db5e1 41c3caa8 42db638d 44665b60 442396fc 4312d2fa 42e71a2c 431d26d8 4401d718 43262a36 439333f1 c430db8c 4492aff4 41c480f8 42c06ce8 c4a74a35 43ad3920 c2c0918c 4352a757 c49e10f3 4392c300 c084cb60 431190fd c4a501d1 43b38ec8 4306d7ec 43537785 c4a0d0bf c3f723c2 4298e710 435f0563 c4676384 443c1568 c30e6ab2 4306567a 442d1cc0 43d1a97c 422c1abc 430895e0 42f75ef0 c2c23660 41e008e0 435dbb61 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000044 -> 3f2a52b0 3f2ed3fd 3e9a6afb 4259c55f", + "446701f0 44453b4c c2b9d304 c479370e 4377bc08 42c5abe4 41dbce2d 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "c42227c7 c46a6c04 43186788 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "43a9b268 43d53840 c1e0f018 c454246a 44b4bf3c c2ff507f 436ee04a 4220f080 443967f4 c312effc 432e46a4 c380d24c c4b887fe 43011d78 4256ca26 43a649c8 c4b1104b 42cf9cb8 43485ad9 c3c55864 c426c6f9 c27c89c8 42f212d6 44974ac8 443d7f1c 43319d98 434d8b9d c3aecae8 44b6ed10 43167ed0 4370eb29 43cda714 c3d806fc c1ff9740 432b179d c3c4ad80 c473e266 c26b699c 4362f44b 43c35368 4496de64 4303771a 4362d7fc c4709f15 4397dde0 c3049dc8 43605c2c c444e527 43ebfe7c c30b2741 429f22c5 448bdc9e c33c0b58 4326247e 4388ec09 42e91590 4459189c c231042c 4310b31e c4ad4482 419d8080 c216ca30 43226d34 448b1d18 c3f56c02 432bbf2e 41d6e0d5 4383aef0 c42e86ee 42e17078 43087376 440338ec c4b739e1 c33d8748 43112cbe c3191920 438da3e0 c2ed075f 42c346d5 437c9bd0 c45d59a6 c1ca2c18 435c94cd 447bc3b8 43cc8608 4329528e 4287dfd0 c3321fa0 41f7b340 c34157bf 43320825 44561790 4491a502 42a821d4 42377077 c1251c80 c413b599 4316b4f4 437e6870 4400e878 c4922117 c30b7250 4391acee 448cd2e4 44220f1c 41cfc390 4381ed64 c3854a5c c3184a70 c17aa020 438df0e5 43809f08 c49ad04b 43181c8c 437b985a c4a158d3 4406b5ea 4297f034 429c147b c3826198 442c3018 423c04c8 4201dce9 c43b0268 c45f3734 4270ee60 436e1b85 c4151377 4496f256 433bd2ea 4251425a 44233ea4 c3d09ba8 42508498 43136ceb c4a771a8 c2c820f0 430c3eae 4232be9b c4a0b769 c4a45919 42e6ea30 4394c05d c4a8f1d2 c4a06aa5 43457814 4354813b c4b875c0 448d6788 c3326f4b 4376ea13 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000025 -> 3ec6a9e6 3f6b7da7 bd69a764 42b2d11d", + "44a99bcc 4450da68 c1f2b580 c49fc81a 4424a430 428a8554 41e7f3d2 4450c2f0 433501e0 405c8e00 43151b32 c40ace14 c44ceddf c2dc24f8 430e7bcc c38c6738 4451b3f4 4224f434 437a691d 4352f258 c47c9a02 c26ddae4 438d6fb4 43bd2f14 c4b10140 c300a098 428d0cc0 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f5c7044 bf01f34d bceee8f4 443b9ca7", + "42c4b0d0 c49f2ebe 432c7d0a 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c3d673f4 c4af77d8 40652540 44b3d672 443957b4 c30103fc 41cd8963 c41b31c1 4086ad00 c2affa3e 431e6588 442fea70 44818c4a 42d71520 42a00ade 43989038 c496f270 c19d62c0 4394407b c4ab71af c27c9de0 c328a74b 41264798 44898206 c4aa46da 41837d00 4310b05b c4910c1c 44bb7444 c31186ef 434966b7 c401b3eb 44539bd4 c30b8035 42be497e 44499b80 c36004a8 42f00788 43811db6 43e34fb8 42427560 43140caa 43803db0 43f15e4c c490989f c2a54100 42d51f70 c3347088 441e20b4 c3014b94 42d17946 c3994f0c c47b7f68 c0806f80 433700f2 44845210 440c01ec c31a3f31 438c60a9 c45c7999 441fc330 43305c82 42be0dce c3ca2b54 43b40924 c2fc47c9 438f1970 4411a8f8 c29478d0 c12f1660 42749a49 c417ebf0 438e4430 c282e0aa 4322b798 43a33cc4 c44badb9 c27f4b4c 43642915 443d5f3c c45ae901 c33e29e2 42fd5fec 4472563c 446820a8 c2be3b5e 42646048 c41bdda5 43240ce0 c1bd9ed0 4207464a c40dcaae 4489663e 426fe730 438d1606 4361e788 4366c820 c0c39ea0 41aedc6e 44a12906 c3ee771a 425e02d8 4390dde8 c4445aab c4bb5b7d c33c4db8 4372db00 44763338 44adc216 43431888 433f1568 c3e6a594 c3ced788 c2ff1605 4395b28e 440d51bc 42e73320 c13f7bf0 432b286f c3d5478c c4b32765 42802f34 4249dace c4ae8ef1 c3a43c68 43122cc6 43070060 44a6d6de c3992e94 43348616 419a00a8 4436c890 c41655dd 430101b8 430153be 435016a8 c4a500bf c3065468 437897e2 44523264 c2f47050 c284b2ea 42d2b7c4 4348d4e8 446d3cf4 42bcb7dc 438e94e7 440af120 43e409ec c2c7ebcb 41a54d5c c4936eb8 44a0e004 429275b4 43889691 44079830 c0146800 432c08fc 437fd423 c488e576 43934d60 430f37d2 4306d002 c4b6fb9f 44aaf0d4 43184936 41bc4dc9 42ed8810 444a4094 c1e4a330 43403ee5 c3bc76b8 43dd0488 42dc5d1c 43874a4e 440d18f0 c3fce3d6 41e84670 42928d64 43e7ead8 449c396e 42c4a080 42bddeae c484151e 449b73f8 432a0538 43764428 43aeb794 449ba130 42b88b4c 41f2b706 c48ac92c c409a1ca 42963be0 427b30d0 4397d29c 449766e2 c29293d1 433b3836 44a359d6 440de94c c2113308 4389c28f c44f64cc 43b67f74 4281edb4 430f4165 c481eba1 44556414 c2e08018 42dea4d4 449ffd8a 441eebac c2f58a8e 4292a3d8 4484281e 43437f88 c2ade9e0 42191ae2 c4aff412 c4a2bfa2 c1df5868 433f208a c4ace103 c3d460a0 bf16a300 41d6404a 44ac5510 438c172c c2a22119 436d793a c4b603ac 44ad0e78 c2aded56 4390fb85 41b05900 4477a5e8 c32c3d07 432292c3 c439e6eb c2ceb400 4280eeb8 437b447a 4412ba78 c3b20f08 c30e9a24 43033916 c48d37f3 c2b750a0 c288491a 41a3a242 43b5b20c c4528b68 42007f64 43831781 c434bdfe 44558170 4316a380 43826f06 c48d52ea 439cd0d4 bca7c000 432c71ac c219ce80 c3430d08 c28431a6 4390f2a0 c3541750 c44c3e08 42a8cc30 41838d22 c14b6c80 44405eb4 430a2644 432deb87 c38ebe20 43935f20 432b934a 4348bb4c c455cf4c c49d4e37 432dc7a6 43182169 c4312fe0 c4330873 c306b20e 4370a71e c3b23d90 c38282e4 42a51be0 435b934b 44aa19ac c45dbdf1 c21b3c04 4345ccd8 44ae99aa c4959eae c2785c8c 42ab2e07 c4aa0c7c c4713f28 43437ba2 4386e1e1 4441d680 c4106ed9 4180eb20 43825f54 c3bd2650 c4b5d953 c1618880 43499f06 448566a4 c452d2ed 42703930 41b2df84 43ff2424 c4b7cf04 c2a2e109 429704aa c42b3567 42ec6b20 42065fd4 416bae44 427f7d80 44b71f0c c32c8d59 42bd05bd c3dbba54 c462a8ed 421f6cdc 42c437db c438e510 43fc6ce4 4231da98 41a4df23 c4991220 c4acfbe6 42b952e4 438faae5 4425c070 c417082e c1fb58b0 42e8570b 44a81646 c4aa6429 4312c66e 435f1014 43229cf8 c3d17578 433eff40 438f95b4 4464759c c48eeb76 434392bc 431d1198 438d87dc 44b12618 c248e184 4369563d c443e5d2 c43c5922 408e5dc0 42744aa2 c37db6c0 c47e4c49 c2145664 4280b8e8 43a19d3c 43aa55e8 43345296 43411a01 c4265bba c3efe3e2 3ffa6e00 43921964 c48f44ea c45396f2 c32cc4c4 4313f18f c48dfafd c3f91e9a 42bdc554 439501e0 c451c787 43d7d35c bea16800 424420c0 44068352 c4947d97 c1b8de28 42328549 43f663d4 44ad12a4 42ae051c 4312eb2b 4457a058 c43efe8f 43344518 436e50db 43cf8058 44069d3a c31537a6 438d64d5 c387ab2c c3e6d68c 428e0df4 4310b767 43aafbf0 c4b58fd3 c2314df0 42ee5ac1 44979e90 44958b10 426dfc90 4388353f 420bdde0 42579ea0 433653e4 4369bf80 43f29614 c42a7a5c 404f6700 431c1400 c47680fb 44788b4c 433ad994 42cba9e1 43b7d28c c4af373b c2fb85ef 43838736 c42e987f c42469c4 4306eeee 430a26a7 c45bc6f6 445e6cb4 4205c274 4383c1ca 44aede4c c4ae7f70 4103dd00 434a6b63 44212158 c4a2d778 c2e3ec59 4367fd18 c40c6919 446a7b50 433830e8 42b05453 c41ddbdc c470a717 c315c571 42e811f4 c4767647 43b8dbc0 42d77490 4331aac1 c3b58678 c3d0a3cc 4308cbe2 43328e9f 4477ade8 4246ebe0 c31c4b02 433ed34f c4a474ef c45bde69 429e55cc 4359603d 44a2e362 c49ce339 42f42ef8 433fd84f 443d11c0 44813846 42e71a10 422276dc 43ae71c0 c45fc3d4 c3467328 4374df6d c4a06514 449c0602 4204f034 420e2b0c c4814bc8 c2a9d450 c2b79652 433347bc c4b1484b c4b975fc bff59b80 4339918e c4667d27 44a4c3bc 43054f80 4286fe2f 44ab2eda 4389570c 42a3393c 4222e53b c4907a92 c43ef57a c283de3c 428c9348 c3bd2640 c08e0e00 4235ac58 42d18aef 447ac56c 43f59ea4 4338bf12 4275b5d4 00000080 -> 3f6a3377 3dcace1a 3ec86e8c 43279727", + "448a9eca 4482c76e 4311ab92 c4b38d9d c2be0c50 420f9b04 438cc468 c490ad5d 440ce1c0 432b9286 43341092 c4612275 c344e3c0 42fa2d18 41547a51 4387eba4 c48397e0 c33e1b04 431a4f1b 44953962 4412631c 4302c1c4 433275d9 c3bb3400 4420a1b8 427ab460 43816e81 44a664f2 443b05bc c25a6634 41b51626 c408999f c43cb786 c307c2ea 4306d27a 449d2994 c4306b86 432e1e5c 4236f3c9 c490a582 c477c935 c347c9d2 432bb031 c38ca628 43b63000 c3025e39 41e4d40d 44619e84 c40a6252 c2cd0069 431f407f 44a3ec74 4406ca14 c182e108 42d7673a 44088b44 c3fa14f0 41ba8920 42c611ba 4469b9e8 442db3fc 43450b00 42e79a18 c403be55 4490827a c2b92630 438ef591 c429ab7a c3b08d38 c3231daf 42d0fcc5 c456a8ac 44969024 c23aa768 435d35e9 4411fd84 c42cfd71 c302226e 436495a0 42f09310 438acf70 c331120b 43402fd1 4186c400 4482d082 c31d6c55 43431010 4458f538 4472c558 42c6b0a8 4333e358 441adc58 43c06bc0 c296b85d 42f1f31f c4723dd4 43cb8c1c c2d56fe7 43210dc0 c3dca860 c45005bd 42e84d20 43035f6b c44f8aa9 449cb722 c29f4d13 41a2a857 c418b772 442d1748 426398e8 4301afbe c48004f4 44646a24 42d58940 4293132f 4402b5d0 c3cb6f30 430fafb0 4313e55f 44513014 43c39fcc c3072236 430c85df 43c8e790 41995740 423ef9a0 4333cc15 4386da40 c4bb3fbd 41a429d8 41d8c6e0 c4adf245 43e6aef4 c21ea600 42cc204f 44629f68 43d0321c c2181374 43346f69 430fe520 c4a0f1e0 c27d2b34 41d7b1ef c46eea59 c3f68632 c1e8f0f0 4387c792 4487829a c498cf84 42a6b698 4375a9f6 444f5ca4 44414670 42c190f4 435b84d1 c4a4d2cb c3ef8dc4 42e3ac18 4359e5cf c41716be 44218648 c1adacc8 42bf82cb c4706285 4379e0e8 c2457d58 431c664b c3907010 c3179dd0 c204e908 41a25226 44ac48c4 c42b5e71 432b03ee 43575997 c41e83d8 c4949f0b c2b917f6 42c1017a c49dce67 442312d4 42b35158 431a3eba c41bcaaa 4433000c c2ae0586 42b57f31 449a6fca 4405c646 c2c268d7 430ff0f1 4484d3da 440d0c44 c2a8ac2a 437b7425 43bba17c c4aa3a24 431799d8 433776e7 44ac27d4 449e6474 bf364800 43017366 4403ae32 4401ae6a 430d48a8 431c714c 44779f10 c4aecdf8 c1d3bcc8 438fbc34 c4a0a035 c22458a0 425c5418 4332861c 44b83502 44a81fae c346a0b2 4309d67a c415629a c496b3e3 4214cac0 435c5967 c466a52b 44aaa63c c2fefa9c 42b163a5 44b4e17a c497e5cf c326cb28 42a0b31d c44e7e8a 43ffb834 c280a2f6 425de463 c4529764 c40cd066 4300baa4 433d9dfb 44908be6 44501fc0 c1a58038 43844e7e c43f997a c415dac8 c22fad68 42e96224 c4a89d94 441c082c 43088d52 434e4275 c4ab837d c33973f0 c2a22219 4381d6aa c3ffec42 444ca888 c2e07585 435af296 c1c8d440 43758be0 4110cdd0 435f36e8 44a9107e c46790b0 42b9b22c 42fcafeb c4845661 c2652de0 c25cf398 434ee6cd c48c0f4b c3ade870 41b12920 4321c35d 43e0c48c 44214388 c0f5a7c0 43866168 43429708 446b07d0 c2df32c1 42b318fc c438d495 c38c9c98 c2f00927 436e1529 c3be47dc c28281a0 4302f7b0 430b6fd1 c498b11c c49581e4 c314e7b6 42c417c9 c437d862 441fcb44 432adaf4 41cba08a 434c38b8 44b7619e c2df5bbb 432f2479 c3e6cb50 c47d3174 41a0cca8 4348fc29 448f8eb0 444d8260 c2e71ca4 433c2a8f c41bf2a2 c401a3cb c309bde2 434eb1e2 c3d0bae4 c43cc2ab c0eab720 4327ed96 44b83bf2 44a71c4c c33cc8d9 434bf784 43e63970 449bd6de 4209d6b0 418a7310 c436c1c2 c43a2f2f c2b93dd4 438cd584 4457e900 c3597028 c28ca2bc 4330fed8 438adb9c 43e35168 432b4480 4211bc03 448580de 42f85170 43217808 4337bfb2 c42ea55b c45735ee c30a4b5a 43680bb3 44a7201e c3179018 43311ad0 413e6898 c4497401 c3b0297c c32f3390 433e8260 44acddea 431bda38 432663ba 4306dd31 4364c7a0 42965630 c21c688c 4341024c 41858b00 c42941dc 43029830 43825c0f c4ba659d 436f65c8 c325b9ba 4357b287 c406e31c c3a43b34 4296db40 430c78ee c4abc43d c3554920 c21d4290 4309b98e 4443fb08 44705b14 c328308f 4373fc2f c40f4175 c432943f 42a45004 42ff1623 c3c9b6b8 441751d8 4237ca0c 41ae3dab 4430adb8 c0e61400 40be9900 42d3f3e3 c4875269 c42a8b7e c3229279 4394f54c c3aa2690 c41db6b1 42d22fc8 42e83431 c3cc4f90 c447e794 42951f5c 437ddb2d 44117db8 43a82338 4200c8ac 43244d23 c483291f c292bd40 42876814 43652d86 c32368b8 438f1978 c28e5772 42a15413 434ecc80 c36c8180 bec7b800 42c2af7e 44ae5960 c4aa99be 433d7df0 437889e6 448cdbb8 c3d592d4 c29763b5 43691c78 c3f6ff4c c388a768 c332744e 4312c304 c4a5d8dd 44203e24 c1b63b88 41ff3be7 43627968 4488b0b6 42a91114 43647ed3 c48e061d c49c73b4 431c2732 42aad0f5 44764248 44425420 431a2b46 4327af66 44a8f33e 44833664 c1f393b8 4390fbb4 445a048c c2e6b110 c21e7fdc 42ccdcad c43433b5 4488722e 433a1ac2 42d7184b c41500ec 44695b10 c2f29bfe 4360fd27 c36af658 c462c029 429e6f88 435e3e46 c4825ea7 c43e181b 42868ae8 4356488e 441d5f9c 443831bc c30008fc 4384e8e5 c4817e7d 442046c0 4345ae48 422f28f4 c2a6d480 44484414 42ff0d58 4316c6b7 44b5e174 c49a5395 4290b8bc 4336e51e c40c75e9 c48ce0d4 42fca418 43585fd0 4495b7a0 c3bb8e40 c1994478 42c7dfea 4490c56a c4839bfc 430756ea 4340e5a2 c4a49a38 c481eb43 c22dc4cc 4356286b c46eb572 442497ac c2c38b37 41b8a09a c423c54a 42619ec0 c30661c6 4328592f 00000080 -> bf2b095c bf3e49a3 3d08cd48 3ecfa6c1", + "c2e5f3b0 448ea6e0 c29f257b 441e7a30 44403e8c c2856d40 431fdc8d c4954deb c37289b0 c33cca7a 4306ea22 44ab341c 4464e274 c2841af2 42be3929 448aab38 44ba07a6 c345be67 4383ed1c c3ccb750 c4a6b421 c291155f 42eddd0f c490710b c41336fc c2bb8d9c 437b89f0 43cbb4bc c40b1650 42eb2250 43903d93 c42cabb4 44803e36 c333cc96 431e20dc 449cac7a c408a5d5 c3021940 42f7c67b 41765880 c490c81d 4337ae9e 435ef981 c3ccf134 c42a0f76 c2dbdb61 438991f8 449dc360 443cb508 c20d07f0 432196e1 c4801929 440001be 401cf740 43700da1 430896e8 c47ffd55 43170056 43003370 c1dd9640 3f78e000 4318624a 436e517e 43bbdad0 c4a218a8 c3079cec 422ce42b 443f020c 44730f8c c246e4a8 432a130a 4470fea8 43a96308 c24fa584 42a4c5ab c49767d4 437cc050 c343191a 437e0e22 c49e0ca9 c3df13f4 4324e054 4385354c 449702b6 c42b9a72 42f17ffc 4337bcf0 c3f639a2 c43616b7 433a1a60 436624c8 c33319e0 44485f7c 4320c790 41364f41 c4484885 c4761315 c31c5624 42bf76f2 c491649d c49204bc c30828fb 42181482 c3ba1f90 4486f400 42a11dd4 43283070 c415a8ac c4369b54 429da0d0 439062b1 c4849723 c4ae065f c288c19c 4249cdb7 43843340 44ba497c 4319d808 42e157fe c42f994a 43399ce0 42def820 431a439b 44868f0e 43aedd0c c31b53df 41cda814 441e3b54 c3c9e17c c34156e2 438b07eb c2957350 4422783c 42b76d74 43915918 c4673d24 446cad6c 4053e180 41b35792 43516660 c436b42e c2a11629 42040486 43348a10 c4ba021a 42344dfc 42fe8844 c339ac00 4444d8e8 c205520c 429cfd84 c41f8826 443f56a4 c33c1889 43299ec4 c3fc242c 43f334c8 c2d1c31b 4366358f 443a2540 43dcd99c 4305cd3e 438c94c3 c443186c 444c8354 c0b0cba0 4306a450 c4110357 c3d04b54 43331f28 436a0b1e c20a2240 44802bd4 42e3648c 414bf4dc c4319403 44158a1c 432ee9bc 4380f3dc c4ba0b04 441b7c78 4239af48 438e88ca 44a846dc 44525894 425b4be4 435acad9 440c263c c470d8f5 42599e58 4323915b 43695150 443ab36c c2a44ca3 438ac5ac c36a5408 c3cc99ac 4307c7f8 436e5faf 42557b80 c46dd4ef c320e9ce 420149a8 446bfe7c 43d82ab0 42c6293c 430b31ff 44b09430 c4b3e472 c2aa4074 43416e46 4428a424 c3af9270 42cc5d90 41aed6f0 c4afceae 4490bf32 43428584 430f3ab5 c488a420 4447a920 42c258d0 423c3954 4428d81c c3753830 c2f42ace 43607884 430d7e00 4487a0bc 420c21ec 4387723d 4486f996 c4835478 c2825b1c 4378169e 43a465b8 42ea7c00 c312755b 42c4af04 c4af3709 c467549f 42c74700 434b4ed0 4492e1bc c4ba30ca 42f3c05c 4284fef5 44b90dda c438b0a4 431c8df2 43256924 c3b80e5c c3b3f020 4272fec8 4363f501 c33420c0 44b03a00 c26d0ba0 42f9e944 c3180a20 c4b871e4 431f55b4 4226acd0 c349e328 c3a8aa80 42da11c0 4330c50d c4aa49e7 44a2ec68 c1dbe6a8 4318b57a 443d1a70 440841f6 c1eab728 438de3ad c4b514b8 c49eddf0 c2d31fd8 435b4618 43aa5b3c 44bb7d2a 42c4dc84 42be2e9e 44b05ba8 c4a81e5a 410eeef0 43152b2c c0c82f00 438037f8 c23e5744 43438069 c46a930a 44321770 430e1f6c 41891a32 c41b1553 43d1d754 c2d4e67b 431c3285 c449d236 c44ac8bc c30c6e36 41d8ea3d 4471d96c c39711f4 42e30250 4353bac2 44aa0570 441bdb0c 42bb911c 42e6e3b5 442f61d8 43c351b4 42e2431c 430c4fb9 c4327284 439d611c c3106f28 42f0fde7 4488f560 c41b7a9a c3292380 430f856a 432046e0 445ab714 c29c1b8e 4164203a 4474c70c c392f148 427158f8 42eeca21 44806e18 442df970 c06d5880 42f2b0db 4483a47c 440c4bd8 c139e8c0 432f9727 c42e0edf 44750924 41299cd0 436f218f 4483a1fa c4b4f64c 432253bc 432b8944 44aa7c40 c38d1074 42d208c8 43519b99 403c1600 44845202 425e3fec 438d0a5e c4825316 440d6124 400f1740 41978fc4 c4981792 4449cf2c 4313b31c 4329e458 c4a62353 c3d625b8 41072ed0 4128b5c4 c4873186 c397aedc 421d48e4 4330c0a3 c4894316 434bbd20 c31ac2c8 41a956e6 4447a504 c41fb726 422f0914 43256ffc 4490ad08 4439e210 c32ffa67 4303eb72 43d13e44 44ad73ca 43167f5e 43947eeb c4989a45 431d8e10 c2d6d083 42648c1c c46ee558 c333ae70 c115e2a0 431aaa25 44ab8ca8 44b22e6e 42ba8374 431932a3 c1310500 44977a4c c203f0bc 432b2adb 4466bd9c c46a596b 41addf20 438c4b6f 4433d13c 439698b8 c3033167 43827c75 c49dd58e 44b01970 c30dfb97 42dd03c3 441cc4ac c3197db8 4324be10 421588bb c2641ac0 42bcfa60 432386e8 43343858 c47973f3 c340b6a0 c22a577c 4353384a c4994014 43ab61a8 c327952d 436f66fe 4321b680 c4902548 c33820dd 43935eb6 c3fe8a30 414ea300 423469f0 430d119a c389b178 44a63104 c2c81ab7 4318df3a c3b33fb8 c3c8e8ec c326a091 428ee308 c419b3e2 c48abfad 42e7daf8 431d809c c4a3c3c0 43d012e4 c342e1df 4390e5f6 44b9abd2 4477edb8 c232a260 42ebb286 445c7f98 44872d6e 4308b192 4239951b 42684120 c3b2898c c296c938 4390b504 44a13840 c47c9d32 c3417ded 428abcbc 447c0eec c2f0a190 4294fa24 4325f751 c423c7a8 c37b8898 c2ead3f2 4372632f c3dd8134 c46ec0cb c221ec1c 4390648a 4473538c 43593e38 42b632d4 4389b3cb c494f187 c49f6d1e 4342b20a 431aec5b c49004ab c442599c 427cbdd0 4328d792 c4957576 c48cdcba 433d52b0 4395ee64 c4a70be8 c48e8641 c2ae6fb2 4240fba2 c490d99f 437f4ca8 428a0a7c 4338fc60 44a9af78 c2961e80 42928d1c 4331e690 43ba28d8 438286c0 c3402ce0 433b93c6 00000080 -> 3da18385 bf5cf8f0 3eff56f7 42a49dac", + "c455801b c3f90fc8 c205a184 c39b81a4 44874140 430e05b8 4274ac66 42466b20 c49a3645 42185670 43728f65 c48790f3 c33ee318 c30918a4 430a6d09 c45bcb9e 44391850 c2d6156e 43877528 c42ecffd 44825938 c2d08820 43877aeb c48cde86 44ad829e 424c8a24 42f72bd1 c38a57f4 448cdc64 41392d10 42945b58 c4aa63b5 c49b3a90 c2df2b62 4378c1d3 c4b19cbe c3e68d54 427d2448 42aa5e34 c35b4dc0 44aaca2c 421b8468 4319efac c49e7f58 446219d8 42fb3418 41a992c6 429b93f0 c4887482 c2048878 437daa40 44575ff4 441f7878 c2f43191 419c1ddc c4a459c2 c4a9d899 4138d230 4307c112 c4485e41 c2dbb600 42d6eff4 4343dcd9 433380b0 c3bd2404 42cd0af0 41c9a54c 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f3d51db 3e58c9e7 3f239322 40acb6d3", + "44b16d76 c2a32520 c296d16b 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "444a1440 c38f4530 c13f4c80 4471e468 c404d6e6 c30c8630 4334e04b 44892780 c42b42f5 c184ebc0 4351b9cb c34595b0 c3fa7fbc 431c84fc 42812c48 44442d34 44b3bbdc 42fdefac 42964167 c4b19861 44add1a8 c2fa95fe 438fa993 44a3afc2 44189350 c335ef26 4366db05 44727510 c46705a0 42afb610 432b647c 443cbbbc 446b8508 c2d0253b 4385135f 4453cef0 c407f432 c2dc5b4f 428b7a84 c4214a74 43d76be8 421c3800 431a22cb c46e2ad5 448b2bfa 432fe838 4304c1ff c47e261c c4b15610 41e7a600 4308c906 c4ab4ad3 44888022 4332b0e6 431db1d6 c48cbbdb c41a6bc7 42f53470 423224ab c426b67e c3a95268 42d4c2e8 434d64fe 431c0968 4496b9e2 432ed376 433dd522 c4988e7c c4b87e42 c216b0e4 430a6c7d 443f0d50 43a72258 432fda68 42f205e6 c3c92de0 440e4f78 42db1440 41e7aa35 4445bfe8 43b6caf0 4220b298 4370e3df 43b35ef0 c42329e3 40aa4f00 4385b54f 4489bcac 442ce50c 42cedb48 43179bd3 4212aa60 c493f358 432b5004 43872f55 448d9f9e 449ef2d0 433200d4 42b6b1b8 44a2c5ba c4074223 c287e75e 42599d89 43b5ed94 c48aeb40 4291f6ac 430738ab 449f2360 433fc998 c30ea2ad 430823a0 427313a0 4434d994 c26752d0 434832a0 44570314 44b02ac4 c3325295 42b058d4 c3a70db8 c4a8f77d 42ca4038 42e65730 c43bea15 449c912e 432c3f56 434649de 44095b28 c4abd29e 40037900 430a2f69 44378de8 c19fcd00 c313798a 430ac35a c41c319f c31e0ac0 c3020b86 43181be8 4395fdb4 c49cef46 43394f50 42c3f44e 4382ac1c c4044b42 433b3842 43699da4 443b8820 c42aae03 c31b8ad8 4388a4a6 448aa03c 44039552 431cc024 438545c0 434886a0 44af4c8e 432177ba 4356181d c461cd40 c4af0e5f 42c6ecd4 4384f8b8 c4a573d3 44170b88 42982dc4 418e713e 43a4baec 449a4792 c2596b68 42d8d4ad 445d2b20 43407cc8 4287a7e0 42c621ad c49b31d8 c317aaf0 42dc6edc 438b3f29 44a88c70 c47f5a4f 431fb100 43011b70 44a17f8c 4391e0b0 41e78428 41f0c38d 439832ac c43dfe51 4316de12 42d014b8 4302f348 c2ad5040 c2a71eb5 432e6000 c3fab924 c49d3ba3 c2cc56d5 43856dfb 43c813b0 44a56cec c3077e14 437d33e7 44991e2a 444bd5e4 c31acd8f 42c5319e c4b94c0a 437e4248 42eecacc 42302e79 c4670ed3 44b32faa 42cb72b8 41ab6941 c489444f c3f31646 4334c29a 430fd8db c48b1bb8 43b564a0 c1ee8fc0 42e69fb9 c4aea89f c4ac8fcf 42ec9214 42cfca64 c42a3403 c494f719 433db578 41393856 c45d5955 44922eb4 c2a6093e 4146a4b4 44bad90c c4a4c68e 3f75c700 42604d65 c23ce3c0 c42ede48 c32ea1c6 416d8b92 c31b71c0 4442d400 c3130ee2 432e167f 44229a6c c43a39d9 c1d6dcf8 43954307 c48b3214 44544694 42cd576c 4159cb91 423c38a0 445f97d4 42f38260 4382edf0 44b28678 4458e96c c33b05b8 4387f3a3 43a5b8a0 445bca88 4325030e 42c3383f 440b07fc 44387c84 c3378b37 41fa300a 447ba804 445bc3ac 433ee9bc 438204f4 432c8690 c388e4ec 4325fbda 42b331b5 4498ce24 c44a948b 422b27f8 4181905a 43fedb34 44b3c2d8 4316a644 430454f0 c4899246 c4250030 c03c5540 42881452 c436d758 43c8e1c8 c2fdbfb5 43539006 c4473390 c47ec571 c2160790 4347fce1 44823722 4477b058 43182d9a 4391c4ee c45914d2 c3d2c094 c30840c8 42d6c27b 44655054 4493ed8e c1902b28 42240f3e 448fafcc 42b37bc0 43386638 436263fc c46e5151 c4b75848 c2d56e62 43410630 449c2964 c1df4b80 c3046a81 42ff1e38 c438fefd 447fc0b0 42fdb74c 4288f09e 43a54ec8 c4235217 424c7c9c 42fa60c8 c4ba8f75 c43420d1 c1e8dbc8 420195e6 c3e1d418 43cc39a4 42f8a4f8 42c80909 446fff28 42f4fc90 4239bb38 429e6d7f 4473c9ec c3ab74fc c2926c15 435ca05a 4401b13c c33e14d0 40a3d800 42958636 44a02906 444e55d8 42bef598 42e2cbcb 43f1f010 c2959560 42adfcb0 42ea5778 42fe1f00 44aba7b2 42b4784c 4321d193 c42eff4d c4a5d898 c31e391e 433ec46d c494fe82 448fe9dc c2253cc0 43285df3 c460cb37 449e8d50 42f8e5d4 42edd918 448c7af2 44a15bfc 420084d0 4382ceea 42903020 c4996eac 4137a9e0 4271560c 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005f -> 3f6f990f bea0789f be247e0c 42d0ac49", + "c35b2e18 c472a824 427b2a48 c4a0fe12 c37c3050 4315c054 438a34e5 c3303f50 44490a04 4310e644 43766bb3 c498c956 44b0ffd2 42d5d8a8 42b72077 44113a44 43b96c68 42e752b0 41ac990d 44af03e4 c4b2dbe5 c34648d9 4390c75e c3cd59ec c258d400 42b8cce0 4386bcf1 448330b2 4481923c c19b2e00 43066ca1 431c10b0 443e8e2c 4310dfa0 433469f8 448d64d6 c4952c42 c33b33ab 4311abdd 42861740 43bf23e0 42cf3820 425b8381 44a853da 433511a8 42e1a2bc 438ff3d9 446ac324 438195d0 43042868 43117f44 4433a864 c4896156 42f22f6c 42f13cc4 c2cd1300 c4317322 c308c9a8 4334bd3b 440ab3dc 44b3dcc6 c32c7840 4336c2d3 c4099733 c34866f0 c2bd6c22 42d853d4 c49251d2 c4703eaa c2194688 433583d9 43896e28 c4060245 40e0d2e0 42d8c85f c430fc67 44831366 c341f3e8 4372cba1 4415ea30 444c87c4 c3274ef8 42accd20 c4b5d3a7 44b59a62 42979ac8 430353b7 44a940da c2671e80 c3174652 433bf560 44a690cc c32a47f0 42e25100 43276333 432fcda0 c47c871a 43074870 431f8ba7 c4182638 c3295a68 430b643e 4341ab5e c46e5c07 c443c703 43163e98 430348d0 43ae21f0 c2db4b30 c31907ae 433cb909 c43cc9cf c3d91178 431b8c3a 438945f7 449536cc 4465080c 4200f55c 42d4b799 4436c52c 448151e4 c2348dfc 43406e7b c4a5cd68 4459ea24 426b9c20 42541f16 42e68e60 44b2117e 42e08b28 421cd686 c4b74081 bfd58800 400f9440 42a8acfb 449f15e8 c31ad778 c3277ea8 436b1680 c492c04e c42b898e 42f1d310 43177d0b c3cd0704 4184aa80 c2576960 4334c6fa 43231c58 448affea 4267b2b8 43646f7d 43781790 418e78c0 42d995a0 430d295c c4a65a06 c4527251 41f18b28 42f725e6 43898f98 442a6c50 4317eb20 4343f59f 44091428 c4b53c8d 4227ee94 436329c3 44832134 43c6cc44 4343335c 430c5c39 44281584 44645350 c2dd1d2f 4312ffb8 c4ab890c 4495b92c c2bb6482 432a2d2c c36071e0 c4a59c92 42166a9c 434ba685 c3fef194 c4b13475 40e6b880 431c9048 442a98f4 c4a78094 c2f00be9 4356661a 448bd6c2 440e38b0 c2fc6f09 42f13b22 c3a2c4d0 c47e381c 42f4187c 42dd0906 449636c0 43aecb4c 42bf5dc4 438aaaa3 448f7fc6 c46487b3 c33c5ac1 436bb247 c42340dd c4165271 c2107740 425e4658 44aa1df4 c4b2d19f 433a946e 4324ab08 c4898ad6 c457f91c c29709d8 43480acf c07dea00 c49629b1 c33f7332 4370f12c c34a3ac8 c4229dd6 41f52a80 41a0007b 43b3f6cc 448050c8 c327a188 4384d271 c4983250 449d2e16 4272d1d8 43748299 c407a10b 44012106 42e413a4 42444dad 44bae0a0 4433d238 c2dd8cb8 430616c1 43d76d7c c4ab7265 42c8f14c 438036de 44276260 43e2adec c2c96e22 427829ef 44833090 c483530e 430b2c8a 43724a95 438ebb44 44a6122a c0899f80 4337d9df 43b204b0 44b97c7e c308af5e 4309a50a c4530392 42a910c0 c32ecdbd 41a0096b c3c0eb34 c48053cb c2e4a88c 430fb43d 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000043 -> 3e7cea52 3d2370a7 3f77dbbe 429711e1", + "44526814 c4382f7d 41275920 438c3934 c4823996 c2305968 432447a9 442a2534 c40d8589 433b8ae6 43363fc8 44968d36 c4af9d8e 4331bc86 41f5361a 448388be c456dfc0 c245e954 427c310e c46bcaf8 4240c920 c3468421 4332a0a5 44542e80 c45a1108 c319d2da 439312d4 4422827c c281cd30 41d13b90 4308b69e 44575f74 443d623c 428ab48c 4318eb35 c49a1e2d 449f302c c34754c9 436f22b0 c4963338 c4a23148 431cba34 43502a19 c468ed40 4481d262 c2924222 4319fb14 c48f019e 44adbb88 410407d0 438dec24 447d675c c4266811 c2ceef86 43498383 43e5e718 c471eb2d c3228ffa 42f2db9d c4ad83ea c3870dc4 42fc4190 42a42065 44387080 42bf7bb0 42f57064 4254cafc c3d488c4 c3117270 4340e08a 438b4e9f c45820c8 43814640 c3269df8 423105c4 43ba5ee0 c406b643 c22cbb1c 438cd2f2 4493067c 43b26ee8 43107794 43647be1 44aba6b6 43b5a398 421e8370 431d9f10 42062ca0 c4b6a103 4307d26c 43892dbf 44782e4c 43b026c8 42ca438c 4351f4a7 c439e006 43d6fc90 432ef66a 4348ae12 c4acba4b c478d635 c310bae4 434b77e4 44b46908 438d8f8c 42b9f878 42a5fabf c464ffdf c48d4c13 c3398abf 42d512ae 44560c88 c480abd7 c04871c0 43035158 431263a8 c4a446f9 c2a764e2 4238cc82 44a250ec c417ae26 425c71f4 42dc4945 43a7f1b8 c4a104e8 c321dc58 43365fe1 447a03cc c39f1144 431261ee 43933bda c3af8890 442fe500 431eee08 435bea9e c266a200 c4657928 42d9d6c4 42e6c01d 4491bc6e c3e4ed3c c29480aa 42f50651 44b2d110 41a01700 c315874f 434d7811 c48c86a3 c3f842ca c30fb7b6 428256b6 c3dd2648 446a6f50 42b3bd44 436112d8 42b6a300 445ba3f0 c331eeaa 438904f7 c03b1600 c487b971 c202a9bc 437234e1 c4360fc3 c4a6caa7 4333f674 41c60637 c43455fb 44493d7c 432f05c8 42e1c2e0 c41dc74b 44a045e0 c2d30ad2 4333c89c 44b5453c c43ba581 c2526ff4 4222239e 44a6a9f2 c36c0c70 c1459040 431aab65 c439102d 4403c9b2 424d5e84 432f6a57 c4b7ce38 c4811da1 c2f5458b 43517faf c4876cd5 4487aebc 4311bc22 4363a9a8 44a0e478 4223e9e0 c313b608 438aa29c 432a4a88 c49f429d c208d570 42e30709 c39a9878 44567578 43203e82 43054ccc 436525d0 c4874b84 42ce98a4 42b6c4a7 c362de58 44a8b430 433a6aaa 4202244e 43fd680c 449d4da0 4197e1e0 4332a516 c35b6670 c3b4bc9c c337977d 42207a80 4360bab8 c43bc71a c2e348d4 43061080 c4a3da7f c22c5e00 427a4340 431238a3 c48ed819 c31f6fa0 419b4ab0 43830622 c4b8ef88 c4916e11 c31f3af9 431184a4 444e547c c45e9cca 43459b2c 43833e1a c399d4b4 449aca76 c2bd2908 42819d25 44946abe 4456f8b8 c32759c1 414c692e 44aed2d6 431390a0 c0064300 42759d9b c4aea498 c40e0953 42e1a094 4252e02d 43522700 c2a33030 c25c9db0 42114417 c24e6900 c41e9cc4 c3076107 4392bda3 c393fa40 c4972890 c32ba6e4 432b752f 446e29d4 c49d70b4 42f52450 4295bc7c c3abc280 c47736a3 42a521bc 434a04d7 44b647ae c4b1691e 414cfdd0 42b4541c c38ffb2c 43dc43ac 3fb4d900 432f44ed 44a98988 c3c116dc 4305f02a 4353e761 c3fec55e 44aa7b46 431ee6b8 42c35637 447fcd20 449739ce c2337500 42265ba1 443c6adc c4207ac9 42e61ce8 4371abf1 4421d1a4 42953c80 c2f66247 438579b0 4436121c c42bb223 42e968bc 43824418 439c4e1c c48e899a c3078266 43278324 44a54a1c c49b5e19 4295631c 437c6d65 4455bd0c 43897ce0 c33dd4a9 4195c5d6 c432736f c3bc065c c2dab8b4 4382201a c46dd200 4145e200 c23bd0f4 4315d85c 4453e834 43923a68 43245d48 435503ed c4438d54 442edf24 41c224e0 438479ac c3078818 43b03e30 4302da6a 434f7f73 436e8988 44b09a70 c323317d 428df254 445c0b0c c3dad6c8 c25d8c30 43650f8d c454994f 431ba638 c28cd828 42611853 c4338c0b 44412ccc 416b8900 42d9d7c9 c4174b48 c4002f68 42a28128 429e690c 4491abe8 c40ed8f3 c32774ac 413f2be0 c45a421e c2e8f520 c29ce4ff 428c69e9 42961950 4466b210 c23e2fbc 426a49a4 444664e8 c3e967dc c19e3390 42bcda03 c4230663 c4b55ed8 c32c2ed0 437a5a08 c4860761 43bed970 c2bb72ba 4299c858 c429d828 443c827c c1c1c370 4315b136 c463bae9 c452542f 42016270 4239daab 449b6302 4384bddc 42ea0e48 42b095fe 449217d0 c49b8352 c3477e98 42d4af99 c4a8aa5b c481c767 c2d7b528 430097c3 c476f011 c480d44c c227f000 4389d9a2 c410bf21 c43ebda7 c3309c27 42b784d8 c43457a1 448c5fd8 c321949d 42ab829a c4ab0eb2 4483834c 42ba8aac 430eb764 c4b35a6b 4471a36c c3438000 42c529f2 c44cf413 c43773c1 c2c5800f 42743235 431b7ac0 c46f8f6b c21d8860 42867440 c4b5d829 4431fe88 42dedbd8 43945b51 c39ab2e4 4485c7e8 c3300938 422fd1c1 c3d78a08 428b7280 c3021f76 438ed947 c47e2f66 c416cc43 43127a24 41ace058 c1b54d80 42bc1250 c2db18d3 41aa33d6 c3ddd14c 4302dcf8 c2979b2b 42984385 c485ff67 449f576a c2fe3afd 4389b9e3 44973fba c452be7a c258fd74 423aa524 44810d22 44876d7c c2ba85a1 43217176 c4979734 c4933b59 4311be26 4280844a 445a17e0 43ae2320 c31f773f 431a8f6c 43dd3cd4 c4a4c95f c30e40ac 438b87aa c3a63184 c4572e5f 4292de4c 417f086a 44aa6bee c3ce01e8 430a15d0 4312b93c c35b7ff8 431798f0 430a65c8 4312de16 4402e71e c4854a7c c2e4fef2 42474464 c47fdae2 c4a965a4 c31d61e1 42c1f7fd c4af777e c3ea09ac 4331b5b8 42f3564a 43fa7b88 c4acdd08 c2c9874c 435f72e1 c32d24b0 446a01ac 4200e0f0 42073d8e 00000080 -> beb07ba8 3f07e442 3f4632fb 3e3e44ae", + "c4928e72 c4b08f33 4237b828 c3ea2668 c4760790 c0ed1e60 4169e73b 445d8a48 c497bb15 4190b908 42ab9adc c3a16668 4216bac0 4269f940 42fd5ae6 44ae037a c3f09086 421ebf5c 438f5568 4481288c 44946396 c335e87f 42afe9fb c4171be0 c3dbc2bc 43262bb0 422ce765 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3e6d3fde bf6d45fb be9740de 43ff403b", + "c2b10fa0 444905d4 430185c2 440f8fa8 c36fa598 423d7478 4321d1dd 4398d0ac 446c3850 4316868e 433f4520 c421fc6d c4457945 c2c920b6 42fb72c3 c48d1f17 c4290f08 412968a0 433889c7 c3f9758e c28280f0 c130bc40 43934b0b c48b786c 44a38b7e c2620e38 43157766 c36bbc50 c4455301 434429b0 42a8ca29 c3c7a554 4498877c 42d4f830 43155cc5 4361ba40 c0f03b00 42a0c9c0 42133be2 c4b110e0 448e0eb4 c25c8b7c 43222707 44272d68 c400487b 41c14ac0 43491c55 445e7abc 448aa9c6 c3020fd6 4203877b c3a690b4 42189900 42dc6424 4329c4b9 c48615cf 44b73e86 42594c44 4365091e c4a4795e c487f0e4 c31f2978 42e7af98 44736a24 43b3ab84 c2c1778d 42eed1a6 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 -> 3f6e0d10 beb9f927 3d6df5e4 428fb0c9", + "44ba71a4 44161544 c31ec030 c345eb30 435e1840 c1906738 422eaa0f 44a7e544 c4352dab 42ef4c68 42edea4b 4415c8e4 440a35a0 41a54a28 41dff81a 449a5040 4489d770 430dacae 424041a8 c455890b c3f2d1be 420a8bc8 4381f1cc 44a7223c c4afdc1a 431c2228 436b400d 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> 3f3f9815 3f25d1c8 3e11f716 4379818b", + "442be924 42ace1a0 c25edf28 c4699d9a c4b0c58b c3359d78 43291d07 417e7580 44aa993a 432f7954 42cdf4ea c3437e20 c464f624 42b82d90 437ca3ba c3b4a18c c3cf7740 c195b940 4329a0d0 c413cf59 449ae4d2 42c9c318 42fe4ef1 c43e7c74 c43798ea c1e049d0 429d95ae 44465e80 43bfdebc c21b38bc 435045be 44059ca4 c48ee902 c2c9e956 425c2791 442b4008 c4668f76 408f5dc0 434824f9 41889400 4220aaa0 c21613e8 4389557f 449bd024 4468fafc 42e05c40 424e58c9 4485a368 c4b2202c 41d38dd0 434c1ca1 c33ca230 c44d49b3 429b6934 436e3f61 c3df9e7c 43fa36e4 432ed832 438c546d 43940c6c 44678f7c 42e356f8 438438a4 431bd420 c437c289 4263f200 42cb3d3a 44a7aa4e 4360c020 c31ca87e 428074bf 44836ef0 445f27dc c3361979 436ef6cc 41a45f00 447eaa78 c09379c0 43084274 c2977b40 c4201e91 c23ea568 43607408 c4a452ef 442f39fc c2cabd40 430d0a8f c3621298 c2ecb310 42f38210 41debc46 c43764d5 4369acc0 c3313622 43541d16 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000017 -> 3f6a1a3e 3ecf3084 bac686a3 433c9159", + "c2d4dfe0 c463c759 c2aed6a3 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca", + "c424d757 420864c0 c300aae4 446f258c 43d15f30 c2fec654 43882fab 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 -> 00000000 00000000 00000000 7149f2ca", + "44090394 449b8a3a 422b3108 c40cdb38 c3584bf8 c33620b4 43768509 446ebb0c c4b8588e c2f7853a 43863c94 c2215000 444ae618 c335448a 438c11f6 c42a8d4e 44346d5c c27381f4 41dbef74 44b34362 c27dcf00 43032f80 42aefa52 c4b7a9b5 c499ab9c c3203e08 4378a069 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 -> bf5894f7 3f00897e be379645 440ec173", + "44951d48 442bf4bc 411045a0 c46fbf0b c41b3c5d 431946f0 436495c4 c48ebfc4 443795b8 c2b8c41c 435083c6 441febdc 42fe62d0 42735db8 4392bf98 435bb388 441d4da8 408bc740 43831f75 c31d33e0 430acb60 431f9aca 437bc7a8 448127e4 c4145e1c c33afe47 42df368b c4471a2f c31b0770 c2de6aa9 42d288b3 c450a093 c489a9a0 432169ec 42fcd246 449d996a c3c0ef2c c29b065c 43147a8e c47c4584 c471aad6 c30ab203 439563b8 c49df688 c3ba5330 c2bc278f 438cc915 c4731ae0 c41dc775 c1c99ae0 42f0acde 4384b608 44a9e396 c2d3ee57 42e9bc1d 441bfcc0 c33e2ad0 428c6544 4384555e c4339f99 42c4f3d0 40f5e700 434c97f0 4288cdb0 44a5336a c16eb300 43324b9a 43d04b80 c43afbfa c3311365 428913ac c390b8c4 c4aef8e6 42a4f0a4 42b07f34 c3a07ec4 4497354c 42cbf784 4311e740 c4ad7c83 c49779be c3023274 438e02c8 c4b740c8 44801072 42c006bc 42afe661 44952e18 42d22810 429abf18 43164276 4412e978 c357d418 c2e26433 4340ef86 43edd940 c2550180 c12cde80 424858b2 449ae7b0 440a5bcc c2a1ede6 438b2666 c448c317 c446a4c6 433ec846 432af827 c43dda6e 44ae7958 433e33b8 43736179 44083d3e c45bda6f 4308511c 4266bf30 c3d485d4 435eed10 427f7fc0 434f936a c4609f79 c465913a 4292031c 4220737c 432bc380 435cf868 4018eec0 43927123 446d4c24 c49f3d33 423202a0 43890f2e c3514d58 43af17e0 41b1c430 42e0ad57 445fdb8c c43bffb4 42aa1174 436b17da 4488b4b0 c46c4681 c33f3a4e 438c383d 43329028 4491c080 42f199e8 4317d0df 4382e5c4 c4a7c8ea c2b60127 4209bcfc 4471ec04 445ac518 432f173e 435a8f2c c4bac38f c465afc4 c25354d4 434902f4 442be03c c4baf092 42beefa4 426ef098 c3dafd18 c4a337df c248c110 41e69f58 43e2f72c c2113160 c25676bc 42266bab 4487a572 448fd058 42fd65d0 41681708 c47603e7 443b796c 418dcfc0 434be394 444bbdd0 c4b52474 c232e2a4 43678233 446326b0 42a1ff00 c324b939 43432d2a 4406405c 447c4964 c26e83a0 43395ed3 448f0808 c4a74739 c335319d 43822498 c3211cb0 4483695c 41fb5580 43197bb4 4229b800 4431cefc 43071582 421b4344 440bf5d4 c47c5dde c2ddf91d 438d29de 44b21ad4 449e5246 41970230 42a6288b 43e02714 4415805c 431acd56 43588aca 43a9f234 44b2115a c2523074 4379d518 44b2b5c6 4430fdf0 c2368684 43765443 c48822b1 4443ed0c c2d9f26e 437442f9 447c5db4 44aa2276 41dd91f0 42ce7f95 c4766ea1 c4a8eb8b c30a3966 41a0381f c470913d c41e6035 c3291dcb 434369de c412a694 c483934f 4282dfe8 436579b1 c41e1b22 c4966696 43361dbe 427b3702 c479cf72 c3f7cc58 c2c831af 4312b858 c25a6960 443ca678 40e91500 436baa26 c3df43ec c4b2f4ef 4338f4fe 438b2e12 44a37ab4 c37fcb90 c31ef8bd 41814f0e c3dc9354 c44dc4e1 c327c548 4337f7bc 4306afe8 44842916 41530340 42d03096 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000043 -> bf44c165 bf1fa872 be12051b 42c164af", + "43c1aa40 429a6aa0 c338c8a6 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 -> 00000000 00000000 00000000 7149f2ca" + ] + }, + { + "glsl": "vec4 cultmath_weighted_lattice_cells(vec2, float, vec4[128], int, float, float, float, float, float, vec2, float)", + "tolerance": "ulp-bounded", + "cases": [ + "447ecffa c3705460 00000000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3dc7823d 3f0eb93c 3e11d76c 3f03315f", + "44188f23 44922628 42b60000 4352def8 4199f072 00000000 4347dae5 43caaa97 44775dbe 00000000 42172d46 c2ba189c 42dbf49f 00000000 42ef0665 c4c6a3bf c3b3b034 00000000 42d81d84 c400d4a2 c4f4b693 00000000 438b8a79 4488b3f8 c4783c94 00000000 4366b4f1 441855ec 436110b7 00000000 43556b3a 43616402 44de734a 00000000 435e2c49 c484db2a 44380bd6 00000000 438b68c6 c3ab01d2 c3345521 00000000 4386aa1a 4129ec7d c4f4a734 00000000 433c3f5e 443f9b9f c3c4c5b7 00000000 42b6e367 44514a1b 441459e1 00000000 434cfdc7 c21054db 438306a0 00000000 42866bf6 c3ee15e8 432a0757 00000000 42fad859 c4e4a2ee c4d428e4 00000000 4364d38c 422bd155 c31c4636 00000000 43452ff1 44f14234 c3cf4273 00000000 430c6a74 43cc371e 43f6c0a5 00000000 43156972 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000013 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 3f800000 -> 3eab768a 3f1def16 3ead81b2 3e8c2798", + "c490e80d c461c778 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40325b84 4055af70 4034dfa6 3ec8f506", + "449d9ffa c47db139 43360000 439385c6 42593240 00000000 42200000 42d589da 43fe75db 00000000 42a00000 c4192560 43cf91de 00000000 42f00000 c447e777 c404cf31 00000000 43200000 4367aa89 c490a122 00000000 43480000 44abcfbb c3850413 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3d2a98a2 3f3e98ce 3d2a98a2 3f682419", + "43ffca91 44ad03f1 43430000 44ce56ae 43a303fe 00000000 430495a8 41ffb0e7 432ed9ca 00000000 4377a062 c3a083cc 4347bfb2 00000000 4310ca25 c430ae15 c4031bf1 00000000 42768c79 43e01640 c4d06638 00000000 42f04c3f 4443d948 c2b21943 00000000 43173384 4352fbe7 43c64355 00000000 430b1708 c4bc9891 44dd3179 00000000 437bd72c c4da0b76 c4157ad2 00000000 433aee25 c2d017f3 c50e96cb 00000000 42c26490 449368d5 c4042494 00000000 41ee1665 44cb18c6 44c65f2f 00000000 434f4a39 c3f387ea 4490e02f 00000000 43114a86 c50d5eac c24768bf 00000000 432ad44f c420a3f5 c4d97ee4 00000000 42cf40bd 4464c35e c44c8a7b 00000000 42a7ad94 4490b318 441159a9 00000000 429c463a c3230855 44e2b6c4 00000000 433adccf c4d9502a 43ffc11c 00000000 429f3ae4 c44e0215 c4843004 00000000 42e3b4c1 4332eb3f c3979e57 00000000 4225bab0 44f4cc9e 439b4534 00000000 434d5cb8 42d5b4da 43f091d8 00000000 438d8fa8 c3dd48e0 43958e28 00000000 42c1bd59 c4dd0462 c4976c13 00000000 4356dfd8 435740eb c46b431c 00000000 433a857d 45103027 c3af6de3 00000000 43028d22 4418b1b4 448349ad 00000000 4342e020 c4486bd0 447ddfb4 00000000 42f38fb3 c455fbbf c380ddfd 00000000 434f2766 c2ea35d9 c4af48e4 00000000 43702d2a 4476fc89 c3f430e9 00000000 42fc3c82 44ceb4ae 44bb304c 00000000 4211ea78 c455fccc 450e162c 00000000 438d4c9b c4e0f0cf 41e217bb 00000000 42e18b5b c30f1873 c3ad51a3 00000000 4323d9ab 4350dedf c3497150 00000000 4334ec53 43e7d8c0 43535f1f 00000000 4309abd3 c2117036 442ef6f9 00000000 42afe3f8 c49b8798 43d0da6c 00000000 432be20e c3ee318e c40d7c8b 00000000 43436afe 444fe424 c4c06857 00000000 41eed6b7 4511eab8 438c300b 00000000 43848254 434e3ef2 4444c530 00000000 4243a5c0 c4bdef75 448b16bd 00000000 4237a480 c38e440a c3338c85 00000000 42ebf342 43ce3ba2 c508262a 00000000 4380cb50 44f53b52 c3bb4bd8 00000000 42da779e 4460e744 44b198c8 00000000 43058c92 c4904a59 44c5aced 00000000 42456b6c c512bdb4 c418d7e4 00000000 42b01bd7 c3303548 c4b50ea9 00000000 43259cf2 44a4510e c4323169 00000000 43808dc5 44800996 4456e0e3 00000000 42ef4ff4 c34a1c61 44174800 00000000 4201a3fe c4792d18 425549f1 00000000 42b6a9ed c460bb3e c4f57f4c 00000000 4370bcf5 44386eb9 c43fd2fc 00000000 438a8ac0 439c2cf7 4300619d 00000000 42fe1b31 c18335de 4490c0bf 00000000 41bcba9f c4e15d80 442a7e6d 00000000 438369c1 c3becb08 c3d208cf 00000000 434064a9 43918221 c413be7a 00000000 436a1c10 44c9505e 43040062 00000000 42a93302 440f9949 44ed1fb8 00000000 438146c0 c4bcd408 44958aee 00000000 438045b4 c4846f5e c4197be0 00000000 430419e5 435ba2b2 c4b66890 00000000 41d4abc5 436e34f9 c25b7d83 00000000 4285a980 4428660f 4474fcc3 00000000 42363e78 c406811f 4447ad19 00000000 438dcd41 c506e017 c3ede378 00000000 4357a54b c3903655 c4e12067 00000000 43802072 4489a943 c423050c 00000000 423905e7 446767b2 4433bebe 00000000 43842232 c3301800 44167b2d 00000000 42c2f149 c51651ab 435becee 00000000 43692969 c3cffea6 c44e4570 00000000 42423b70 430f99d4 c3211add 00000000 438f161d 44393a22 4388289a 00000000 4378ae16 416886c4 441a111d 00000000 42c777b8 c4a9898c 440f1bc4 00000000 42f86ca6 c4085d0d c40b2e7e 00000000 43283cbd 444a78bb c4e2cb77 00000000 43143934 4419ef5a 41d909db 00000000 42fbdd12 442fcf4f 44ff2cb6 00000000 438c735d c4dd308e 44bd2ed1 00000000 42ebc6f6 c4b830df c443489d 00000000 43799da0 4389ad51 c5198267 00000000 431ee5a0 4507f86c c4131a22 00000000 4300eeec 43e1886d 44177992 00000000 432a99c3 c4828a1d 44d284f3 00000000 4389a704 c4c6f53c c390354c 00000000 431bacf2 c3d802ea c5079cb8 00000000 435a07d7 43471a64 c3004682 00000000 4317f0d4 44f7d28c 44b1ec01 00000000 424ab77e c407237e 45060fa2 00000000 4346629b c50885fd 438d9935 00000000 4223cdbb c3eeb6ec c4580cc1 00000000 4321ef4a 442eb7dc c453931b 00000000 4291c87b 4362711b 42934f93 00000000 41eb6a9c 43075935 4509c8fb 00000000 421c9054 c2f3dda9 4263e5c8 00000000 42c93339 c429dfd6 c420c663 00000000 434035fe 4305faed c3a6b5b4 00000000 43268519 43ba9e9e 40164d31 00000000 432e9d60 42a4873f 435469a5 00000000 4387bf1a c4810a81 446e2c4e 00000000 4351a68b 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000006c 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 3f800000 -> 3f048576 3f1897c4 3f01acc3 3e8c2798", + "c3949e43 4436f155 43290000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3ef422a4 3f179d2d 3ef422a4 3eaec3cc", + "c4a0e71a 44846b18 43770000 43917292 4292b29b 00000000 42200000 421f9458 44019de9 00000000 42a00000 c42a5a82 43904969 00000000 42f00000 c41f0af1 c433bcb0 00000000 43200000 44133f63 c47f9f80 00000000 43480000 44ab8d80 438a4153 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e85acf1 3ed696e9 3e87667d 3e549b04", + "c1ec5299 c3dafd55 421c0000 4395e2cd 413b270d 00000000 42200000 437601ed 43e5103f 00000000 42a00000 c3c03207 441e153e 00000000 42f00000 c46ff9a0 c15d49a3 00000000 43200000 c411e921 c48031bc 00000000 43480000 442e65b0 c497ba62 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401ee1ea 4061c735 401ee1ea 3ece80b0", + "c39990b6 44556770 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f0ba4ca 3f37821e 3f0ba4ca 3ec3cce4", + "c4b38b01 c480aaaa 435d0000 43925a10 428385f4 00000000 42200000 42859400 4400ec59 00000000 42a00000 c42436d2 43aa656e 00000000 42f00000 c430d7a4 c422415c 00000000 43200000 43e1bc38 c48846f7 00000000 43480000 44aed6f2 426fb0b3 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e9796a3 3f220bb9 3e9796a3 3f4a4ed7", + "42bd4893 449232e1 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3feec8f0 40420905 3feec8f0 3c5a4ec0", + "c4acbcee 4447970b 41d00000 4395f306 40f99267 00000000 42200000 4380eaca 43e1c9d0 00000000 42a00000 c3b3b8d0 4421b5ab 00000000 42f00000 c46fd498 4210524a 00000000 43200000 c422418e c4765e9d 00000000 43480000 441638ab c49e0fb4 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f13dc20 3f1f6394 3f13dd00 3f6031e3", + "c430288f 4394cbc0 43360000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3daf257b 3e932638 3dbb38ce 3f571c73", + "c461e9a7 435e41c8 42b60000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 3f800000 -> 3ef51a18 3f0aca57 3ee93112 3f571c73", + "c488fc2f 43f7ef85 43430000 44351b3b 430f14c6 00000000 42ac3505 4229d457 4368455f 00000000 426e874a c49185d3 4435179f 00000000 4221b1bd c4a2720a c471179a 00000000 431819a3 4370c4a1 c45fe9a4 00000000 4332ac74 444e382f c2bb878c 00000000 41c887e2 4469017f 44daf504 00000000 4369827c c42a23e3 44478c2b 00000000 434d6543 c471ad87 c3a5ae6c 00000000 431a556c c2c6bfed c5082fbd 00000000 43003c96 450bd8a3 c47ab9cf 00000000 4355c832 433fa0ad 433b2b65 00000000 4296e07c c3931625 442f00a6 00000000 41a9b126 c4ea9c4a c2257704 00000000 435bf87b c3d1ea5a c48e1af1 00000000 42868bff 44307c87 c41dcca9 00000000 433ddcea 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3e6af1b4 3f29898f 3e9186a2 3f120fa7", + "c4a16abc c2eb3e04 41500000 44e5e734 41bf4a4b 00000000 438f2dba 446a361b 44c140fb 00000000 43083cf9 c460f93e 44de6f28 00000000 428d2f92 c4f83428 43326012 00000000 438e9d7b c4159144 c445d0fb 00000000 438fb314 43292eca c3dcf7b6 00000000 431fabe0 44edb59f c3b90542 00000000 43657b2c 4494a6ed 449f92aa 00000000 4334b34b c301ab2c 43f0ca77 00000000 43823899 c502658a 441e5db0 00000000 432716a1 c428fd94 c413af70 00000000 438a94f0 4199dc93 c2edb5cc 00000000 428a8638 440d53d9 c36d4263 00000000 4357536d 44831793 4439737f 00000000 4361b762 c1bfc9d7 43cf08fd 00000000 42c8b922 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000000f 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 3f800000 -> 3f48dcfb 3f6669ef 3f4b5270 3d55d830", + "44b43252 43e836a2 42820000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 40000000 -> 3ef16d03 3f459acb 3ef3724a 3d399760", + "c4a62b95 c4817eac 43430000 4393283b 42688515 00000000 42200000 42bb016a 43ffc320 00000000 42a00000 c41d137d 43c37837 00000000 42f00000 c440bb23 c40f0528 00000000 43200000 43992a6a c48e716b 00000000 43480000 44ade158 c31e1f07 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f070907 3f2411b5 3f070907 3f4a4ed7", + "c3c88386 c4ae8b7d 43290000 4393dcef 4249d606 00000000 42200000 42efed5f 43fcfc8d 00000000 42a00000 c414fba2 43db5ab6 00000000 42f00000 c44e8974 c3f47a9f 00000000 43200000 431c05e9 c4923478 00000000 43480000 44a8b2a8 c3ba2991 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401363df 402e91e8 4017b8fc 3f354648", + "443aa4d6 43781eb1 42d00000 43953085 41f9267a 00000000 42200000 43388af5 43f3137c 00000000 42a00000 c3f9d0b4 44087768 00000000 42f00000 c4670548 c3821194 00000000 43200000 c3619f04 c490c757 00000000 43480000 448a5605 c4565d95 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f31af23 3f3dc6f0 3f31b003 3f4bdb53", + "c497256a 42d4fa09 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 400c7731 408d0dc6 400c7731 3d55d830", + "c436705e 4304b7ad 43430000 43c8394c 429e2f47 00000000 4375c3a0 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3f37cb19 3f3d7003 3f2c7b4e 3f62e889", + "446d1322 c49bc147 43020000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3e2c4c62 3f02e8de 3e2c5974 3cac8220", + "c4a700eb c40a2c25 429c0000 43958b3f 41bb02a0 00000000 42200000 43518fd4 43edf39c 00000000 42a00000 c3e3c9db 4411c8d0 00000000 42f00000 c46c8617 c322cced 00000000 43200000 c3baee88 c48be6a6 00000000 43480000 447001b9 c47ebf9a 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e112cbc 3f45d169 3e112cbc 3f1ab712", + "433b2c46 43d3d981 43500000 4392c452 4277cdda 00000000 42200000 42a05894 44007212 00000000 42a00000 c420c473 43b71276 00000000 42f00000 c439096c c418d825 00000000 43200000 43bdd9f4 c48ba7b0 00000000 43480000 44aee446 c244ff0a 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3f9d1e4b 40662a62 3f9d1e4b 3f44b788", + "c4b9eef1 c4bb2ea8 435d0000 43925a10 428385f4 00000000 42200000 42859400 4400ec59 00000000 42a00000 c42436d2 43aa656e 00000000 42f00000 c430d7a4 c422415c 00000000 43200000 43e1bc38 c48846f7 00000000 43480000 44aed6f2 426fb0b3 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401a409a 401f7a81 401957dd 3e191f94", + "4363c23b 3f2246f8 43020000 43f30f84 427e377e 00000000 42f16ed9 4424cdf6 4500452d 00000000 435cd090 c43449ae 44287e1a 00000000 42228ac0 c45773f0 c3ab5060 00000000 42f26dd3 c0d9c0bf c2d9db8e 00000000 43833c56 442804ac c3b8f841 00000000 4381c5ba 437811b9 4333a9d6 00000000 431092dc c35bc5a0 4491f96e 00000000 42d9a078 c4823a49 4387aa2b 00000000 428229e6 c4c3e05b c4eaa711 00000000 42b86805 43333331 c3c11ba8 00000000 42549617 44f22259 c1456f6b 00000000 431af091 443dd750 44c5ee32 00000000 435a6438 c43f761d 446b6578 00000000 430ca813 c4ecb452 c3e9bf2d 00000000 431b80e3 c302bfb1 c42248d7 00000000 43390374 4402f7da c3c2d7bc 00000000 430feb00 445b7a60 43ea626f 00000000 437fa98c c203dd44 4425dbff 00000000 4391ca05 c4c9739a 44262806 00000000 4363df55 c4ad5434 c49de667 00000000 41b8ce09 44245b9f c505c06d 00000000 42a4aef4 4391eb3d c227c53a 00000000 42a94146 444a67cd 4499486b 00000000 427651d5 c2f84b6e 434c1b36 00000000 4264a9be c4732d45 c2ce55c3 00000000 4276df4c c3ee328b c4aafcdc 00000000 42da1bcf 442def9b c42aac0d 00000000 420188bc 44b2f001 44044a0e 00000000 42f9c290 4164e011 43248958 00000000 434d196d c4a8d52f 4444b88c 00000000 4389f024 c49c3eaf c456ecf8 00000000 43259020 438215e3 c4c7624f 00000000 4354d273 44c04c98 c3dc72aa 00000000 43482661 4333b21e 434ceb87 00000000 433f4e2f c2ecd35a 43883016 00000000 430e5af9 c49b51a0 4218a613 00000000 42ab7dca c418854d c49592cb 00000000 425b9efe 43c576ac c3ff3812 00000000 432bfcf5 44819746 43655578 00000000 431495e6 42bebf13 43d23206 00000000 42d8b4f4 c443f99f 4419529b 00000000 4346b979 c3ab3407 c32c4234 00000000 422f79dc 40866459 c325dd16 00000000 4389b9e8 43837abb c2e80475 00000000 42e01e71 4403062c 43e34ddf 00000000 43827996 c41faa93 450e2b2c 00000000 41d4eebd c3ce62fb 428b3988 00000000 437b4b50 c41e6aaf c463b097 00000000 42f7e978 443d4ad8 c4a47d71 00000000 4301e8aa 44c18f9c 42fc71b4 00000000 438bcee3 42c7b35b 4384dab4 00000000 4310e637 c31a5276 431efaa1 00000000 438c0c6a c4cac2ad c40ac881 00000000 42df27b0 c35fe41e c4faf7a5 00000000 42ae4bc9 44db5b48 c4870c87 00000000 42099828 44ff22aa 44a67b51 00000000 43330421 c3399812 44a7d73b 00000000 42ccb28e c4a6c1ba 43d0dba5 00000000 438f4cc4 c43441df c443bdeb 00000000 432d03ea 441eac78 c4c35c44 00000000 435b95ef 44b5d0c9 c2a04741 00000000 4364123b 43e7d365 44564b89 00000000 42a4113e c43e8177 4481815b 00000000 4312bfd8 c3a9407d c284910b 00000000 4355bd1a c3db2756 c4d8e58f 00000000 4381d5f6 44e63881 c4bd52c4 00000000 41b26654 44f2c895 4465a5dc 00000000 429e0496 bf292abe 44285db5 00000000 438bc6bb 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000045 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3ef7e034 3f0ebe7f 3ef7e034 3f64c232", + "420d9443 c464020d 421c0000 450b268a 42adbf7a 00000000 42f9ebc4 4419e631 448f4c98 00000000 437ed24e c3cbc769 44279c4e 00000000 43172d39 c517a697 c20bd760 00000000 4201c4bf c46567bb c4c98d0b 00000000 4387007a 43f14dd0 c451f018 00000000 42e2c18b 4394011b c040f79d 00000000 437c2607 4413703a 4474dcda 00000000 42a3349b c3989516 440ca52e 00000000 4249218c c4ad2149 4240c056 00000000 43908acc c335e2b4 c38ef57d 00000000 43912f84 444e6a92 c4c9f6db 00000000 42d6ee22 4367f8f0 c15c9ded 00000000 433fdf26 4407d183 444a5656 00000000 429f1d96 c3367a6f 43bdedd7 00000000 4390826f c4bffcb0 43014370 00000000 435f918e c3bd336b c405b4b2 00000000 42864e3c 43b99096 c44df875 00000000 4255ac51 45143294 c38135ef 00000000 42bb8203 4420b95d 4457b5fa 00000000 42abe78c c4582dfc 45004fc5 00000000 43890b56 c43d6dc9 42cafa8b 00000000 43907f06 c4a4d6c2 c4d23cd6 00000000 4388c35a 44427463 c4f7b096 00000000 436864ce 44ebdbed c39610af 00000000 4293d40a 44455deb 446f5c4a 00000000 41a92f77 c38d6788 4442037a 00000000 432e381a c3a3016f 4270717d 00000000 438af427 c489f7b8 c49f2e50 00000000 42915ad7 441e06d2 c4ea991f 00000000 434fff8e 43ab1155 c28fa675 00000000 4367e2e5 44c057de 44d3314a 00000000 436bc210 c36d16da 443f6c98 00000000 4345c333 c3a80290 429e6e4e 00000000 4389dbbc c45e4c8f c4685753 00000000 42d89994 434a3327 c432b16e 00000000 43909fc3 44d7abf4 c3e1e793 00000000 42d0223e 43459dec 4344a070 00000000 42938f0a c3d9c65a 44d4407b 00000000 43670714 c491a03b 43a7f1ea 00000000 4277ac69 c4b076a0 c4a725e2 00000000 433da9e6 4386bad3 c4922826 00000000 438dcac9 4496cdf2 c3be1a4e 00000000 433b01af 444fc038 443b4f49 00000000 43528c6f c25ab72f 43858f8b 00000000 4307d8fa c48e0ee0 43c29088 00000000 4369edf0 c46d82e1 c44bc7d6 00000000 4361ded8 4292a727 c3cc98c8 00000000 42615d5e 45121b0c c4584e13 00000000 4321c3cd 44a50645 4486afca 00000000 429fd4ae c39a3ebc 44fa87f1 00000000 438c7bb4 c42a8a27 4387dda6 00000000 430eef98 c4e50aab c4b1bbb9 00000000 4323dcd0 42d329b4 c44ce141 00000000 41a50b91 448ee62b c3f42450 00000000 43889d68 440454df 43c3238f 00000000 4388f4d8 c33e115f 44e4a6bf 00000000 43457566 c500e367 446b5bb7 00000000 431f749f c4272d29 c3ea0d99 00000000 4391ae03 427771ab c4437ef2 00000000 4356d7a9 4407f4b4 c3844e51 00000000 430a0fce 44dcaea4 449287ca 00000000 422a2f10 c2ea34c4 450686f7 00000000 43211103 c48b7286 44104a64 00000000 43914592 c3d5aa05 c3866bba 00000000 438e4202 41874262 c40e02dc 00000000 428e2abe 43858f6d c312a301 00000000 42b3be5f 44481749 43ee3b38 00000000 437e38de c0981de1 4465fd72 00000000 41cb1682 c2f20d5e 428cba69 00000000 439205db c42f72df c3c55e7a 00000000 430a3d8a c137729f c41383a5 00000000 4285d3f4 43e404fb c38c2f20 00000000 432e90a3 432becad 42b66cba 00000000 4380758e 42b89b21 4502fa1e 00000000 434560a2 c4dbabb7 448e9cc6 00000000 41de4862 c40d0fd2 c38ce5cb 00000000 43922685 c0eea4e5 c2d90aa8 00000000 42fdb554 43830d00 c3337862 00000000 428ee896 44a98a43 441f0cdb 00000000 4309da10 4183d813 43304cf0 00000000 42e4619d c4d4eeb2 4499a0eb 00000000 4328d8ba c4ce3fb2 c4353f97 00000000 4207e70c c3737910 c5009511 00000000 431904b5 441d334d c3eece72 00000000 421a59a9 43dbe2db 43347796 00000000 42c45b59 43a94c19 45139cbe 00000000 42d79ba8 c44ff9de 44263136 00000000 4370a6ab c41137a7 c35dd6ce 00000000 4350a8b4 c3bba3ec c50b2842 00000000 42d283aa 446877d3 c44351ba 00000000 4345f3e8 43c69116 430c93fe 00000000 4329db3c 428dae69 43b69ee6 00000000 4285b2cd c4e18b49 44c72ac1 00000000 424e5553 c424021f c356399a 00000000 439112fd c3caaf4b c4e6bf35 00000000 42806b18 4452668b c4433615 00000000 433ad06f 450cfbaa 4428eb6d 00000000 43900a77 43b45ff2 44b7a9d3 00000000 435056f8 c456d0fe 44515e5f 00000000 42634054 c4df78d9 c3f3f933 00000000 43320557 c3bcf7bd c4add549 00000000 436a7927 44597cef c45ea964 00000000 432e992d 43884ed1 42867f1e 00000000 43890e38 43d202cb 44aff99c 00000000 42a0beee c3a83ab4 43b4ec80 00000000 4308bc06 c43f2d23 c328ce25 00000000 42c3b696 c4394a76 c50e61b0 00000000 430309e5 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000006c 43820000 3f333333 40800000 42f00000 3f800000 0e736390 8ea24260 40000000 -> 3f9484c5 3fda1cce 3f99a8cd 3f5eaf6f", + "c1ec5299 c3dafd55 421c0000 4395e2cd 413b270d 00000000 42200000 437601ed 43e5103f 00000000 42a00000 c3c03207 441e153e 00000000 42f00000 c46ff9a0 c15d49a3 00000000 43200000 c411e921 c48031bc 00000000 43480000 442e65b0 c497ba62 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401ee1ea 4061c735 401ee1ea 3ece80b0", + "c39990b6 44556770 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f0ba4ca 3f37821e 3f0ba4ca 3ec3cce4", + "42bd4893 449232e1 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3feec8f0 40420905 3feec8f0 3c5a4ec0", + "c1ec5299 c3dafd55 421c0000 4395e2cd 413b270d 00000000 42200000 437601ed 43e5103f 00000000 42a00000 c3c03207 441e153e 00000000 42f00000 c46ff9a0 c15d49a3 00000000 43200000 c411e921 c48031bc 00000000 43480000 442e65b0 c497ba62 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401ee1ea 4061c735 401ee1ea 3ece80b0", + "c4912430 c319be2d 43360000 439385c6 42593240 00000000 42200000 42d589da 43fe75db 00000000 42a00000 c4192560 43cf91de 00000000 42f00000 c447e777 c404cf31 00000000 43200000 4367aa89 c490a122 00000000 43480000 44abcfbb c3850413 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e96dbc2 3f6ae035 3e96dbc2 3d55d830", + "c4555fdd 4448bea5 42b60000 44b7efc2 430646d4 00000000 438800d0 42d7780d 43837f0a 00000000 42f604d9 c31aabe3 4336d032 00000000 433123fd c39c7026 c28d8354 00000000 420c3ab2 c3b26464 c4a96d75 00000000 41e3ccb2 44bb138b c4a9dab7 00000000 42e03038 4500bce8 443e3389 00000000 4280d4cb 434d5596 44caa7d9 00000000 432c0405 c4c472fd 4488122d 00000000 42ca9b3e c41d22ab c3a5b453 00000000 438a4953 3f8cecf3 c34ae6ed 00000000 41d0bad1 4449241f c3ce8ffe 00000000 42ac4f23 446e6c49 4429007a 00000000 431a009e c375f394 44df471c 00000000 435d366f c4a27b7a 43e812c5 00000000 425cf87c c2cbf9d4 c2bd46be 00000000 4341716a 431a9dda c40ca117 00000000 4324c088 44dabab8 c3bbe7bd 00000000 420f45e2 440a48b3 44271685 00000000 437db2ce c383a11d 441bd1c9 00000000 4381fbc9 c49303ac 42bcef29 00000000 41edffd4 c3849ddb c3d38d96 00000000 42976422 442b416c c491ca49 00000000 4394d515 43c80a10 41a43446 00000000 43537d97 443d4518 44cf253d 00000000 437cbbe5 c486f300 44acffcd 00000000 4389408a c443e854 c310c1c3 00000000 42cf88e2 c406a3a5 c4dbdbf3 00000000 432ea126 4481bed5 c47f2191 00000000 437f55fc 45098c45 4432b735 00000000 433644c4 43b0d4b2 4504278a 00000000 42f916e4 c486ad7a 444ade1d 00000000 43089c18 c2f0f598 c2661cb0 00000000 428d7402 c15edba0 c3cae14e 00000000 42ef8547 4481a06b c4126afa 00000000 43372bdd 44052653 43ad4a13 00000000 438ad672 c1aad6cf 435b409b 00000000 430343d7 c48d62cd 43e3a923 00000000 41b20b9e c4cc60c5 c4af1058 00000000 42689e78 43cd7f6c c4dce87d 00000000 43130cb4 44658d87 c36bba5d 00000000 41d99cd2 42893bd0 429902a7 00000000 4358a0a0 c3c9f282 44862abf 00000000 42483ebc c45cd84b 42d4d591 00000000 4388503f c48d2f1f c4ce81fe 00000000 427a068e 4416f784 c48d11e8 00000000 431a365c 450f1050 41d2ed9d 00000000 434d0032 424c0aa3 42c9b36b 00000000 4225c690 c4429f46 448786b0 00000000 4365fbac c4069578 c29af04c 00000000 42e6d2b7 c433a546 c5003ca8 00000000 436b4f6d 43dea44e c3ed054b 00000000 4266df8e 44bba3a2 43d33aa4 00000000 436b7068 43dc7627 45043b7e 00000000 438704f2 c4cb1e07 44a6070c 00000000 435caef4 c4cb9478 c42ee7fa 00000000 430c0054 c1ee6287 c3c8d12f 00000000 43173eda 4408b1c6 c3a911a8 00000000 437b3f31 44555c39 43fe22f1 00000000 43791187 c30c959c 45190aaa 00000000 4388ec92 c4f48ecf 445bdc4d 00000000 42a6255c c48e9b47 c4614a43 00000000 42d18bef 426f2aaa c39c7eb1 00000000 43644150 42e4e670 c20921f0 00000000 43010876 4435450a 443aa0d5 00000000 430123ec c3ca2483 449869e1 00000000 42460faa c5130dc5 43bd67fb 00000000 42f935b1 c46203bc c497f699 00000000 43379f21 445b6da8 c4e2378b 00000000 43834d65 43a2e91e c11328a5 00000000 434eb06b 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000046 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 40000000 -> 3f4baa32 40039658 3f4baa32 3e8cb2fa", + "c490e80d c461c778 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40325b84 4055af70 4034dfa6 3ec8f506", + "44b4d781 c42a30e0 42c362a8 439548e7 41ea16f6 00000000 42200000 433ea91b 43f1e490 00000000 42a00000 c3f49b3b 440ace2d 00000000 42f00000 c4689674 c36cbe3f 00000000 43200000 c38303c6 c48fd142 00000000 43480000 44862e84 c460ae13 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40c1cc31 40c3eff4 40c07f6f 3e736b1c", + "444e8c68 bfdf6380 429c0000 43958b3f 41bb02a0 00000000 42200000 43518fd4 43edf39c 00000000 42a00000 c3e3c9db 4411c8d0 00000000 42f00000 c46c8617 c322cced 00000000 43200000 c3baee88 c48be6a6 00000000 43480000 447001b9 c47ebf9a 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f167253 3f2381cb 3f166d54 3f6c7d59", + "c4ab4cf7 444cc9b2 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f14703f 3f223cf1 3f146e07 3f06942f", + "444248ad c42ce00f 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f2166bc 3f354e75 3f2166bc 3d4ae2a0", + "c45d596c 449ff606 43290000 4349bc0e 4209af98 00000000 43830174 43de4bad 44ea652c 00000000 43176ff6 c4831d97 44410c23 00000000 43100af4 c408bc51 c3a1dad1 00000000 43399da6 4324ac67 c49a4f9c 00000000 4366b6ef 450525d3 c412ee91 00000000 4347b715 42d459b2 4305bf25 00000000 43219dfa c45b6fa1 44c9c969 00000000 42d795b4 c4d0f293 c3215749 00000000 43087c84 c30e966b c3e200f6 00000000 431cd158 44cad452 c4ad698f 00000000 41dec918 44683383 43e707df 00000000 43321d3c c30f0549 45153747 00000000 429ef2f4 c4cd7f26 44124abb 00000000 43733754 c4195357 c426a824 00000000 43506e43 44655ae9 c4fd38dc 00000000 438f18b2 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3ed550b1 3faf55ea 3ed550b1 3f70eff1", + "c483ea3d 449f53f6 00000000 43960000 00000000 00000000 42200000 438c7a85 43dac84f 00000000 42a00000 c399f96e 44283853 00000000 42f00000 c46d9924 430779a7 00000000 43200000 c440d32a c45f41ba 00000000 43480000 43c69044 c4a7cfcf 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f43ab94 3f44240d 3f411e4f 3f7979ad", + "43bda5fb 44841e1a 42500000 4507949b 42e1cf3c 00000000 4338073f 442d6ec1 44ac1370 00000000 4331ff44 c48a425f 44d0a6e4 00000000 4278100f c40fd603 c2190d9d 00000000 43922396 c4028cc9 c4864f33 00000000 4341ae3a 431acecc c3627895 00000000 431b4341 44e2a0b5 4312d69e 00000000 42282880 42690eea 42f8d33e 00000000 4318a62b c3a4bf2c 43e9b5ee 00000000 4324117b c445487b c296be03 00000000 43681fe8 c3e6a3c3 c47fc62f 00000000 42b73443 449531d3 c4cd4d7d 00000000 43837790 4510a516 437ebcde 00000000 42bae9ba 434039f7 43dda461 00000000 435338bd c440b781 4480a82c 00000000 43064534 c50907ca c388ad04 00000000 431aad8a c403c56d c49e23cc 00000000 43462b82 44bc0ff4 c4f3b360 00000000 430fd1e4 44f7187f 4389b7b5 00000000 41a0efc7 4335a838 43e32c6b 00000000 4215d5d8 c44552e8 44783976 00000000 437af028 c508966c c3a855c1 00000000 420b0026 c4375859 c4ef399e 00000000 4316ee24 4485f830 c4a3a1cc 00000000 4371837b 44fb202e 43a99879 00000000 4367b354 441b0de9 44d36069 00000000 42bc2ba2 c4850d2b 449dd0f7 00000000 4383a361 c48a1954 c34af09d 00000000 433e284c c423608e c4e90e1a 00000000 43613e84 44853b3c c4997ca6 00000000 43287e0a 4517d815 43f147b3 00000000 43246228 43c5e1ff 4493eee6 00000000 4205c165 c49c8602 44af284f 00000000 4339a8fd c5120257 c3f98e17 00000000 4229803c c2c607ee c39b7448 00000000 43348a86 44935824 c4a02dde 00000000 4295df20 44666fa9 4352db20 00000000 42a6b7c6 43593745 44336a4b 00000000 433c53d8 c42c5296 44360014 00000000 436673a7 c36226ee c25cb2fd 00000000 4315099b c3d41ede c4b8c3d9 00000000 42f660fa 44c01201 c4c516f2 00000000 4362a84c 44d72be3 43df2acf 00000000 434004c3 4409bf53 44fdb243 00000000 434cf3a3 c3d5d4bc 43d52fd4 00000000 42faf653 c4cb2df4 c3df45ae 00000000 420fc249 c371e048 c46c23de 00000000 4344ed8c 4343dbd4 c33db8d7 00000000 4391f6ff 445fa9b6 4381d9cf 00000000 437cdd9d 434651c5 444dea55 00000000 42a39092 c472c02b 44647526 00000000 43375699 c4d3dabb c401a43e 00000000 42aafc99 c270b146 c3855f17 00000000 4323888d 44d33530 c4c11c64 00000000 4309a1be 44b6b331 43eb2b74 00000000 437b0dfe 43071c70 44207810 00000000 41e2ff3e c4a159bc 448f4fed 00000000 4289fbd1 c50a4354 c43acdf3 00000000 43421f8f c39cf003 c4c8b26c 00000000 43634341 443157cd c4190109 00000000 425e3b89 44e1e2a4 441fe211 00000000 42cc2a6e 43c26560 45069123 00000000 435ceb81 c4db7218 44b7e14a 00000000 43438683 c4f5af5b c435e7ec 00000000 435db85a c299d37f c3e80849 00000000 42cfc385 4409eab1 c3e07222 00000000 432c6e8d 4486da8f 43d09368 00000000 437db592 43b11590 4512a0fe 00000000 41c33cdc c4a7ed86 4484ab1f 00000000 4347b19e c4c4d4e2 c41ec610 00000000 42908910 c370feb7 c4dd147c 00000000 43080e2a 43464a94 c3181112 00000000 42ff775a 43ce985b 432d9c61 00000000 43449e6e 42f3e84b 447ab261 00000000 42923119 c4b2a4f8 4484f50a 00000000 431205dc c44cfa47 c3b33f13 00000000 433dc15c c305fbf7 c49c7e51 00000000 428f3b03 4475c808 c4317afc 00000000 42a3a025 44ce37e2 443b7431 00000000 439318a8 42a0618e 4458d0e4 00000000 4310b5bc c4b19464 4478c22d 00000000 42936f24 c426d208 c39d7a8c 00000000 42cf2a7c c2e45f50 c4b7199a 00000000 43546d94 449cac4e c454ce8d 00000000 4380058c 4411543d 438e589e 00000000 438a2c1c 4316cb29 451479df 00000000 4395c050 c368bb94 431934fa 00000000 4282bd76 c4799e2b c3fd7ad6 00000000 42e7d5d6 c20007d9 c4233956 00000000 431bdab7 449b56ea c44629da 00000000 42c5db88 4419a064 43a19cab 00000000 4347c08e 40a32e49 43136925 00000000 4359309e c500e57f 449f40da 00000000 43498de2 c35954b9 c2ecaee9 00000000 42b75384 c19fcc0d c477979d 00000000 435f543f 4431243c c3d3df05 00000000 4355e25c 443d56fb 43d5541d 00000000 42a36ca1 40f22379 44a43152 00000000 4322dd46 c3c5ba08 4364d1ce 00000000 4369e765 c4dde088 c4813d50 00000000 43143174 3fdbf163 c346c1f6 00000000 432a24d2 450353cf c492f841 00000000 436fd57e 448b3376 44279594 00000000 42e27640 c1fdcb51 44ac0178 00000000 42dbb73e c4d36530 4464a3f1 00000000 42579123 c5036d52 c4a36de5 00000000 42a7cafa 42213dce c4866f4f 00000000 41f822b7 43fea97a c3850366 00000000 41f77728 43d7d3db 438a8a77 00000000 43313aa7 c2390c5b 445ec620 00000000 438b1870 c4b2ce47 443445f3 00000000 42e2ddc6 c4807450 c42a2fa2 00000000 43208558 42d02ae3 c4c405e6 00000000 42b8530d 44c21638 c43cb785 00000000 43819072 44ace62d 446c4f8b 00000000 438a0e63 c2363a10 440cdb82 00000000 4316b12f c4c19819 443563ab 00000000 42506c15 c40a8113 c3c336c3 00000000 435b31c8 43248a69 c4d7a29a 00000000 42ab6a48 44068c4c c372bd57 00000000 4345eae2 43999f3d 435f36d6 00000000 43635895 c30d26b1 44a07cea 00000000 42b4042c c4d60f94 4439b861 00000000 422307a6 c41d387f c3eb6ff3 00000000 42c57657 41989aa4 c3192a08 00000000 4316a630 44525d66 c3af5a45 00000000 4338683d 4461e1da 442e43fa 00000000 4386e606 c3908e5a 4501cd9d 00000000 435a16e6 00000080 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f028796 3f555f52 3f032190 3f0d526d", + "c490e80d c461c778 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40325b84 4055af70 4034dfa6 3ec8f506", + "43c9061d c4b347ad 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 405ea9f8 40a107d2 405ea9f8 3e4c1fc4", + "432bc01c c41bec8d 43290000 44f87ddd 43a9991c 00000000 431c2d5b 435da80a 4469b8a2 00000000 438d3be6 c440ba1c 440de15e 00000000 4356845a c4dab977 c48173e6 00000000 4385f066 438b7183 c502ab28 00000000 42a44546 44e98020 c400d63b 00000000 432aeee8 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3e8ac0e0 3ec5e73a 3e8ac0e0 3e44ffa4", + "43a00a43 c4af25eb 42b60000 44f52093 4332f266 00000000 42c645e4 4402c470 449f9bf4 00000000 434931af c3cb5087 43f04e8c 00000000 421641de c512dcc1 c404d9d0 00000000 43933870 c392c167 c48b6176 00000000 42251a6e 449a0554 c48bd785 00000000 42dccba4 440f3ae0 43539cc3 00000000 4324ba39 439c17a5 451a0e5c 00000000 431b1ed0 c48e894e 444574d1 00000000 4248e38d c46ad480 c3f7a2cc 00000000 42a8c876 4122af6c c4ea3b32 00000000 4230fba1 4503e450 c487725d 00000000 4383d726 44d85e7a 44995e8c 00000000 43565106 c35cd5a6 44c879f0 00000000 42bf48e1 c429c26b 4372779b 00000000 43807fc8 c463217c c452c339 00000000 42be3485 43665c5f c4518574 00000000 431d4d4b 44f08b54 c3cea558 00000000 41b53700 43eae2db 440de7ef 00000000 437efbab c327cbe6 43c6a21a 00000000 438473aa c48298d8 42a7d5ef 00000000 435c137b c4022a27 c44fa441 00000000 43769a31 4389fde5 c3eaf200 00000000 4387de68 44b22531 42923b76 00000000 41d1a581 447e580d 450b2ec6 00000000 4389f390 c3f88c80 441f5087 00000000 422baa4c c40043ab c2bd8cd2 00000000 42faf71a c36bbc96 c440791e 00000000 4355d2d7 4421878b c41ed0c9 00000000 434da2c9 44f180b6 441ce457 00000000 432776f4 433aad57 448b8358 00000000 4355c1c2 c4b6dabd 4489b7fa 00000000 4339dae7 c4ae0bab c42635e6 00000000 42fecaac c0680393 c2d33722 00000000 435e4924 44cbc836 c4662dd8 00000000 4393c669 440233be 43a97404 00000000 43572e27 c36b59bf 451705d1 00000000 43275136 c4f3f305 4444678c 00000000 41d7029f c4ad7f30 c4949cab 00000000 4269f456 43c57e33 c4d44d97 00000000 438e1052 43d46133 c2da17c4 00000000 433f0113 44058b92 4414e5db 00000000 42e919dd c3fa9e37 44a6808e 00000000 430203f0 c39fd801 421a0bb9 00000000 438e2077 c3a15415 c3ebf900 00000000 42308c6d 444a783f c4bd3249 00000000 433ca87c 4336bcb2 4006b5eb 00000000 433f2e5f 4403bed8 44823bf1 00000000 4358dc0d c4b51202 44fc2db1 00000000 436cd7c8 c4144fa8 c2aabdfc 00000000 437483a9 c43a195a c504d7f7 00000000 437c8904 4405a997 c40e4b76 00000000 439535be 44d53a33 43f008be 00000000 433b71bc 42966a32 43b46fe1 00000000 4349e2b0 c487874e 445d8fb1 00000000 42bec9c6 c50bc31d c4702767 00000000 42971d2c c33514d3 c5188b52 00000000 438299ca 445a0986 c406d6a4 00000000 437959a0 4463d612 4407b084 00000000 42fadfc2 c135f632 434615dd 00000000 429ca853 c436159b 43a3b236 00000000 4211a1a6 c4859db5 c453163c 00000000 434aa12b 431e999f c44f8e0c 00000000 43402b0f 44ca6497 c3f2812a 00000000 42f0ca64 434da4ae 4353b8ed 00000000 4263a974 c25cb61b 43266a0b 00000000 438e5a38 c50fcea8 43b93982 00000000 4385a0d2 c2fcdbe7 c32a032d 00000000 42d5ebb4 43c11072 c4470987 00000000 42ce814a 44cedaa2 c23ada72 00000000 438f76f9 43bc5809 4429243e 00000000 431003ad c41287e7 445e3498 00000000 438bd199 c3b98e66 c219b6a9 00000000 43190c9e c412f20b c4b9c6e8 00000000 4288e7b8 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000004a 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f09749e 3f23d2b1 3f0898be 3f7b69a3", + "c4b9eef1 c4bb2ea8 435d0000 43925a10 428385f4 00000000 42200000 42859400 4400ec59 00000000 42a00000 c42436d2 43aa656e 00000000 42f00000 c430d7a4 c422415c 00000000 43200000 43e1bc38 c48846f7 00000000 43480000 44aed6f2 426fb0b3 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401a409a 401f7a81 401957dd 3e191f94", + "c37ef6a5 c4791563 43360000 439385c6 42593240 00000000 42200000 42d589da 43fe75db 00000000 42a00000 c4192560 43cf91de 00000000 42f00000 c447e777 c404cf31 00000000 43200000 4367aa89 c490a122 00000000 43480000 44abcfbb c3850413 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e61feb4 3f2a02de 3e61ffc0 3ee9973a", + "4409e1dc c49cd1b7 43770000 450e1d76 440f5629 00000000 4366f1d0 42e09e3d 44b6719f 00000000 4306cac6 c41a72eb 4382d0d6 00000000 41dc9166 c3f710a1 c40b9b35 00000000 423a6f5c 448040e1 c4dea625 00000000 422408ef 449cf8f7 437d0282 00000000 424353f0 43666594 44e53ad1 00000000 42323521 c502f505 447c3fc0 00000000 4380bda6 c4923933 c49605c5 00000000 433b9ddf 441f02a4 c49ad0de 00000000 437de500 4519172d 43b9e332 00000000 431d12da 42904a8f 43ce39c5 00000000 43139194 c4e59f7f 44791445 00000000 430822de c3deaa82 c3cf7344 00000000 438c2688 43cd600b c4622523 00000000 429cc434 42e3969e 413b2cde 00000000 4356c16b 43ac9aeb 44bfc036 00000000 433290d0 c2f477a0 429441e8 00000000 4327bb1d c4d1eb2a c4b17a4b 00000000 4394e083 4421e852 c4cbd4e6 00000000 42312944 44147907 420105c2 00000000 43282f2b 437f905c 44674559 00000000 4278d034 c3ae64fa 436b38ba 00000000 4297e2e2 c4dd72e5 c4a9a17c 00000000 4348cf46 42b16013 c3818457 00000000 434d8966 4405de54 40502c29 00000000 4359aa15 42c9f21c 43998457 00000000 4380ca6f c37f768a 433ecea5 00000000 4310d82b c4a35ab0 c4622726 00000000 424e321e 43cfab1f c4b368a9 00000000 437a785c 450066a2 c2ad2066 00000000 42e60d11 44241ac9 44d624e5 00000000 433dc452 c34cf499 43290e14 00000000 4373078b c4873bf6 c4288dc4 00000000 4282cb73 4277922a c3821d8a 00000000 4303ec1e 4517a83e c35bb583 00000000 434e1b99 44659016 4502946f 00000000 43127a5c c494e838 448763d6 00000000 431530e2 c3b54383 c34a5bfb 00000000 43937d6e 4320cf58 c45673cc 00000000 4344327e 44a8d8fc c33c4417 00000000 4332889c 447089f6 44f15d5a 00000000 435ab38d c2e91bb5 42e96c4b 00000000 42d007a2 c4ad18ae c42beb76 00000000 436a31e9 43298c16 c4999457 00000000 43342ac1 450bd541 c3d34760 00000000 4369590a 4404b8d5 446d0487 00000000 438347cd c3fc8e8f 440b4399 00000000 4383593e c4e91387 c44c1ffb 00000000 4366891f 41d26163 c3937222 00000000 42e4c4fe 44db66a8 c3d1fb97 00000000 435f4a87 44446ba7 449d1e99 00000000 43505a94 c48b45ad 44a9501a 00000000 4324b2da c4eafc08 c4335817 00000000 43479035 41cc2ccc c41c7652 00000000 43445798 444d3979 c36ec144 00000000 4346c80a 448e6698 44cd2006 00000000 438f3a2b c3f26739 4422ba98 00000000 42b3635d c4955848 c3c38f39 00000000 41bd5ab1 c1311906 c4ba451c 00000000 436b5085 4405b45f c337eb58 00000000 435edc4d 44852b16 44ad5cb3 00000000 431f5f9b c432e726 44850753 00000000 429e795e c42ad274 c33bc4e6 00000000 4200193a c1ec9f72 c404d3c9 00000000 4369797e 44c21d45 c41acbee 00000000 42fc7895 44b6c1ea 44d791c4 00000000 4393e285 c4951b42 44f69e07 00000000 43742817 c5170dcc c4071ce2 00000000 428f5792 c17779a3 c3147a72 00000000 4322e0cc 4494c847 c4079a60 00000000 43909352 4470910f 4480c141 00000000 4380585e c3aab7ca 441de3dd 00000000 42be605b c515b3c3 c3cfd0aa 00000000 4314a5d9 c35e2be9 c4b551d7 00000000 41d2f2bf 44635ef4 c3ea4ec4 00000000 437224f1 43b86ccc 43b3446d 00000000 42d71e65 c33fdb6f 43c7e6a5 00000000 43940377 c3402d12 c1bf0a96 00000000 4227953c c2d38fba c40258c3 00000000 4319b6fd 441e5ffb c3b70756 00000000 43670dde 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000051 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3e2776cf 3ebf47c4 3e2776cf 3f23c489", + "c4ab4cf7 444cc9b2 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f14703f 3f223cf1 3f146e07 3f06942f", + "c434fdf7 c417cbae 436a0000 4516e859 440fe2a8 00000000 421d3f76 42975d15 443768b3 00000000 42aa541b c3ef736b 43613820 00000000 437faca9 c3ed141d c3f163ac 00000000 42a58772 43957d33 c417c5cb 00000000 43725b90 449952d7 4314ea61 00000000 428017fc 4357bc4c 4475d1f3 00000000 43829dd6 c3fdb421 439c84ba 00000000 43388bf3 c4cde182 c4a6e789 00000000 438ca42b 4422b95a c4e2cf2b 00000000 4389af32 42ddc39b 3f5894a3 00000000 432c08e5 43600512 4423f3b1 00000000 4365e1c7 c47f8f48 4448cb64 00000000 42336683 c4e6a99a c49335aa 00000000 42dc8311 439d54fc c4a70d87 00000000 4284a832 448bc1b9 c2ecea88 00000000 4222b0d4 444ef1c3 44da743e 00000000 423177b8 c4b3d3f5 44b19820 00000000 4244225d c33f5341 c2bb22c3 00000000 438973e0 436fe388 c4fcd1b2 00000000 429680f4 4500cb16 c3e50adf 00000000 438fd17a 43b085e4 440e2f77 00000000 431755e2 c3f2b44d 441689ce 00000000 42d233c3 c3889479 c2c24767 00000000 424eed4b 411002a5 c4e70342 00000000 427883c5 450e9e4f c444a162 00000000 423f72f8 449058d4 44b6ad4d 00000000 42ea1f35 c3d729b0 44299959 00000000 4311e290 c4fc54fe c3eab5ba 00000000 43247f18 c348e9b1 c4e6f445 00000000 4234e69b 450921f6 c482d5ca 00000000 438a830a 449b7624 449c8cd2 00000000 4223d228 c3d66857 445cbf9b 00000000 4303d03d c4819b48 c2f02818 00000000 42cad27f c257fe4d c36fc84b 00000000 42436cfa 4494277b c4391181 00000000 438c65bf 439d28d9 437bf3b7 00000000 4331fa7b c2b8c3d1 4383097b 00000000 4206889b c4506f9d bfe123e4 00000000 436dd979 c3c94777 c490b17e 00000000 4295cdc8 42c0b942 c29926b2 00000000 4367fe6c 44a14e17 444b6511 00000000 42fcc4b0 c3029595 440e2a4a 00000000 42df480f c4633df3 42cac265 00000000 4308e0c1 c4591e71 c4e1f613 00000000 42ecadd8 440956e1 c4092390 00000000 4328af3a 43ed104f 4364a3d3 00000000 435cba00 c290540a 441fa20e 00000000 438acbd0 c431b07c 43221f41 00000000 4282f3a0 c33719b3 c391aec9 00000000 43856097 44b2142c c4df6b77 00000000 4370bef8 43558a0b 4295395f 00000000 43431763 3f81e47a 44c375d4 00000000 41e909c6 c50fa9ab 44499fce 00000000 42875072 c3eb626d c4134445 00000000 42b0da42 436c6e41 c3bca7fd 00000000 42011c28 434fb8a6 423c62a5 00000000 432a4265 4205303a 43919e2d 00000000 429fe8fc c4457d3b 43bf1a9a 00000000 42d7bc2f c4c28200 c4c1b86b 00000000 41f9b613 42d294d0 c35be359 00000000 43929d71 44a09146 430d95df 00000000 435aab42 43e90f83 44fc3b95 00000000 41b57335 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000003f 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3e2ff43a 3f05e348 3e2ff43a 3e06a96c", + "44043cca 43839150 42d00000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3ec37e87 3ee9a081 3ebdff1e 3f4f1861", + "c4acbcee 4447970b 41d00000 4395f306 40f99267 00000000 42200000 4380eaca 43e1c9d0 00000000 42a00000 c3b3b8d0 4421b5ab 00000000 42f00000 c46fd498 4210524a 00000000 43200000 c422418e c4765e9d 00000000 43480000 441638ab c49e0fb4 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f13dc20 3f1f6394 3f13dd00 3f6031e3", + "c4852a66 4314b971 43770000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 3f800000 -> 3e6ea341 3eb14393 3e6c2ff8 3f14d74e", + "43c9061d c4b347ad 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 405ea9f8 40a107d2 405ea9f8 3e4c1fc4", + "c48679bc c368162d 43290000 4393dcef 4249d606 00000000 42200000 42efed5f 43fcfc8d 00000000 42a00000 c414fba2 43db5ab6 00000000 42f00000 c44e8974 c3f47a9f 00000000 43200000 431c05e9 c4923478 00000000 43480000 44a8b2a8 c3ba2991 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e3a5536 3f230518 3e3a5d5d 3f0c344c", + "4471036a 44a3135b 00000000 4447f281 00000000 00000000 42e81bc4 4489164e 44d58025 00000000 433c14ea c3a00f5d 442ede66 00000000 4331ed61 c501c001 4393f69c 00000000 4254976f c443e009 c462c9d5 00000000 41a13a57 438b49f4 c46b6f1f 00000000 43149f8f 4428c046 c3446e30 00000000 43824ae6 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000007 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3f0c4656 3f222122 3f0c4656 3e8c2798", + "44783286 44a7b596 42b60000 44a27ab5 42ed39a0 00000000 4337521e 440107f7 449d7d72 00000000 424e43c8 c49dd665 44ba8e2c 00000000 42dea7b1 c4af83b8 c39ec4fb 00000000 437ebb34 c408d81a c501f7aa 00000000 43401a0a 44b3785e c4a2f2cb 00000000 42ec4a93 4508ac96 4449ed35 00000000 42f26ecb 4278bfe4 43f5812b 00000000 4287143a c4e5c2eb 449f2512 00000000 43712e97 c4490c20 c3d402ce 00000000 41db5fd0 3fde7861 c3a0277e 00000000 429bcf38 44f36a32 c479f9c1 00000000 41d70774 44532f79 4415b1ed 00000000 436d9bf7 c3321ab9 44a1af73 00000000 42aec194 c47c21c2 43b40f51 00000000 4337a5ab c43782f0 c42a4964 00000000 438c4a81 42b93c26 c3a87a4c 00000000 42e8d694 45016dd8 c3de6100 00000000 42a3a436 4331fd18 4357101d 00000000 42850682 c4426c20 44e626fa 00000000 4321a776 c4b3fd3b 42e74fc2 00000000 4341724b c36f8b44 c3bf1023 00000000 4366cea0 445f3e2f c4be0c0e 00000000 43881a3a 45117e94 42eedc6c 00000000 4275df44 4367d624 43fdbb75 00000000 42f969e6 c49dfe1f 44ca8a39 00000000 4387761a c4af9929 c381c013 00000000 43753d13 c41d96d5 c500aaeb 00000000 42cd6980 44a168c6 c49eb289 00000000 43204cfb 44da2ba1 440dbbef 00000000 4395667a 43ab53c9 45000a97 00000000 42d9cfa4 c463df1f 442b9fae 00000000 42bf1ccf c41800a0 c39128e4 00000000 437dffb9 c1bdde1f c42cd8e3 00000000 4337e2c9 4492e122 c425e7d0 00000000 438e2097 4389979e 43331237 00000000 435eaeb6 c3721236 451b55d3 00000000 437cbe85 c48d5c01 43e39e33 00000000 431841ba c33a515b c31f9812 00000000 4253a704 434ae61d c45a1d4a 00000000 431cede0 4501336a c404ad2b 00000000 42ee6415 4312a1bb 43237d29 00000000 41e48354 c42b7d4d 44e3dd16 00000000 431a3d59 c47972c1 42f0666b 00000000 42cfba7b c433aca4 c483674a 00000000 432cbcc7 441b9327 c4916036 00000000 43349a06 44916f13 41566c34 00000000 4372b780 44440178 44c1c1d9 00000000 42afeadb c39f1bcf 43dd9799 00000000 4384b268 c4a4f1e1 c33de43a 00000000 4382058e c409fef7 c4c5031a 00000000 42e8c9de 448970bf c4925114 00000000 42b25661 44391a01 43505f58 00000000 42359945 43e5e4db 4509e3d4 00000000 435e40f2 c430717f 4410396c 00000000 42fe86a8 c4186d48 c382f538 00000000 433aaffc c216004c c3fcb960 00000000 42ab017a 43c1b08d c36f9018 00000000 431777f3 441f7852 43bdf270 00000000 4304e56c c29504d6 44a23938 00000000 4368b325 c488e4a1 43f6231e 00000000 438e96de c381fe76 c34d5d60 00000000 4392848d 435709be c48cb4ec 00000000 43260916 44394c3f c35e057d 00000000 4299e543 439f83b3 43a43adb 00000000 42a5329a c378029e 443aff51 00000000 428f1f24 c4bf288b 43763693 00000000 4318caff c49ceb7a c4d3036e 00000000 4320ef4f 444933f4 c4cf6d7e 00000000 4374c93a 44edef5b c256edd4 00000000 43522a52 44360d49 44a37db7 00000000 434b5498 c4a5a7f1 44fb3525 00000000 42468b9f c4524634 c2ae3091 00000000 4389c430 c3c4b625 c478b1ad 00000000 429d27ce 44876a13 c49c2799 00000000 429f0b0d 451453b9 440dcbb5 00000000 436f1709 437396e4 44735be1 00000000 43672afe c445c19c 442f341d 00000000 4359fbbf c4223955 c378b3cc 00000000 434aa8d9 c3686ddf c4fe3407 00000000 436808c1 44d3ca9c c48ee921 00000000 43564f70 44a21c80 4430083c 00000000 4250542b c0baba80 43a5a7f2 00000000 4208c32d c50ab9ae 448a3858 00000000 4356abe2 c455dab6 c41b893e 00000000 43488966 438bc0e3 c4e8b706 00000000 43162a2d 44c4a88d c4071046 00000000 4379d372 43bea5df 43b54864 00000000 43751596 c42a99f9 451415cc 00000000 4394acd3 c4cfa482 43a7d1f4 00000000 4326806f c36ff157 c3949c27 00000000 422018ac 440f902f c4a454a0 00000000 438d1dc3 442db8ac c23d35bd 00000000 43212e3d 4484b34a 44d98817 00000000 4380f050 c31176de 4370e56e 00000000 425f229a c431e9e5 c234d6d9 00000000 42235cff c47abb16 c50dc04f 00000000 43953ae9 44aaad96 c4d563ae 00000000 438655ec 43910c79 426502af 00000000 43808ced 4209ece2 42eb6eae 00000000 42b9973c c4d06531 44c7f569 00000000 435a7744 c4f2109b c423cd9d 00000000 41a5ab24 c33bbe6a c497a51a 00000000 4322d7d8 43a70b14 c3754cc9 00000000 432f939a 44a664af 4423e974 00000000 433a8b56 422214fc 44e4dc0e 00000000 42b81d78 c50762af 44949a06 00000000 42c943df c4a9f9be c4632931 00000000 4362c614 423bfb1c c3d62d49 00000000 4346445f 44fdd537 c4453536 00000000 4339cfd1 440057a3 43e158bc 00000000 426f0ef1 c3bd2b27 44c0ae7a 00000000 42bfe761 c47b3c2a 4374f9fd 00000000 434f209a c44b77b7 c4687f4c 00000000 434bf106 4458ace5 c50acccb 00000000 42ca180b 44e3df3b c3451be3 00000000 426b93ef 44aa11b1 44ff61cf 00000000 43054111 c43a640b 44a92f31 00000000 43066eac c435c485 c189dad8 00000000 432efe72 c4065922 c488ec54 00000000 4362bf6f 4413a162 c44867f0 00000000 42b529d3 443a81e2 42e95010 00000000 431a9ebd 43ab891f 447ecced 00000000 4395bc19 c35560fb 435daf57 00000000 435904eb c464245f c3866e77 00000000 42625ff9 c3b6863e c4e924fe 00000000 43109054 44efd4e4 c4bf357a 00000000 4308d508 4300b4c2 42649f43 00000000 436e2047 00000080 43820000 3f333333 40800000 42f00000 3f800000 0e736390 8ea24260 40000000 -> 3fbf82c2 3fe5d8ab 3fce8e27 3f492e0d", + "c47f6ba3 445d4d82 42ea0000 4394f978 420c1475 00000000 42200000 432bd785 43f5648a 00000000 42a00000 c402222c 44037e14 00000000 42f00000 c46353fe c399e880 00000000 43200000 c315e9a8 c4924e08 00000000 43480000 44924467 c44027bd 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 406eccf2 407a5323 406f4f06 3e549b04", + "448bacda 43776e0a 43500000 443aa42c 431d907e 00000000 43375b18 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 40000000 -> 3e983e40 3f1b947e 3e99b3aa 3da8dc20", + "c452c069 44b815ef 42500000 45086ca2 42e33708 00000000 426b8c49 4474c5cf 44f2dba1 00000000 43018a46 c44e9f15 449be8ea 00000000 436b7e68 c44dde2d c25b0f66 00000000 4379dd61 c41859b5 c49cbcd6 00000000 42c36120 438751cf c3c5f61b 00000000 4331dfc4 44805200 42a648d5 00000000 437a7c24 43b7d5bf 44444594 00000000 435e4abc c4a9bca1 44f0ca23 00000000 434e40c6 c4ddeffc c3299493 00000000 4387df71 c42a19ed c4bca370 00000000 43940334 446543c9 c49dbe17 00000000 437ab3d2 44e3ae1d 43487c94 00000000 4320dffd 42634ef7 43030bda 00000000 425a7b7a c47a10b3 44a6f146 00000000 4284e632 c43c7d20 c2bc0044 00000000 43816ee0 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 40800000 42f00000 3f800000 0e736390 8ea24260 40000000 -> 3f50c86f 3fa6f092 3f688024 3f781067", + "44b4d781 c42a30e0 42c362a8 439548e7 41ea16f6 00000000 42200000 433ea91b 43f1e490 00000000 42a00000 c3f49b3b 440ace2d 00000000 42f00000 c4689674 c36cbe3f 00000000 43200000 c38303c6 c48fd142 00000000 43480000 44862e84 c460ae13 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40c1cc31 40c3eff4 40c07f6f 3e736b1c", + "c47614e8 44544924 43770000 44e5b048 43e7a9ad 00000000 433a99e3 42ab9a6d 448b620d 00000000 435b7a2c c40347be 435e6272 00000000 4382c4b0 c4bd8000 c4d62849 00000000 43674cbd 444d58c7 c4b23de9 00000000 432155c1 448995a0 435dc28c 00000000 42db25c5 42e60d6d 4464e31d 00000000 4385a7ea c49aab84 4414f65c 00000000 41fba103 c494e2c7 c498c10e 00000000 4228161c 44597a99 c4d3bdff 00000000 428bfe48 43f7fffe 42969096 00000000 42f9115a 41924707 42d1107d 00000000 42d2d646 c456c9d0 43e8fcce 00000000 42f25b7f c4d19796 c4c3450e 00000000 42f6cdaa 42b2c8cd c344dd78 00000000 435d22e0 44915dbe 42ef1b53 00000000 430d94cc 43ca904d 44e1084c 00000000 43831aea c40f6a23 43adf2a8 00000000 41bdd339 c44a3153 c42af21c 00000000 41b520b6 439a844c c44286f5 00000000 427dd81f 44180a86 42041f95 00000000 4387d9e4 43b41510 44a2f6dc 00000000 436ba40b c4691a4b 441d3411 00000000 4384f831 c4aca865 c48441b5 00000000 41dbd1c9 43b354f7 c482f215 00000000 434547cc 44b24944 410a9f48 00000000 426e081e 43d0dfe9 449ec8c4 00000000 43951102 c49dff64 446c04e6 00000000 42f9c54e c49c6ae0 c4588ca8 00000000 42558f93 43819833 c45feb21 00000000 437dafa0 45148873 c2c84570 00000000 432bd417 44208e43 44d18357 00000000 438b9760 c33afbc6 431a3b26 00000000 4394df50 c4a183e2 c4494f57 00000000 4319c6db 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000022 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 3f800000 -> 3e856fbd 3ee4a946 3e8835ca 3de35d40", + "44aeeb47 c42dad68 43020000 4504d5e7 438aeeba 00000000 42aa2571 4428c657 45035c3d 00000000 431c6c1e c49dbf5b 44936d4d 00000000 43861bef c50a2bad c45bba77 00000000 43084703 c1f8403d c3f85ecd 00000000 42d26e60 44fc675a c48aef39 00000000 43617bb6 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3f3abc0b 3f527b77 3f44aaf0 3f3fab85", + "c497256a 42d4fa09 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 400c7731 408d0dc6 400c7731 3d55d830", + "c4b212fa 44465d7d 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f0f9c86 3f138568 3f0e6e89 3f06942f", + "441e1d40 c3430bb8 42ea0000 44430bc2 42b7668f 00000000 429b18e0 43a7bdc7 446f897e 00000000 4388579d c4da1a26 44dc613c 00000000 4386fa5a c469bfa1 c39e414b 00000000 438aa712 c1a73480 c3232e56 00000000 42ea75d7 448d9fdc c43a0e50 00000000 42f1a0ce 4411e3e0 43ad3efa 00000000 438258c6 c21be46d 43ed0e0c 00000000 42167da9 c4b14b22 440a41bf 00000000 42caedd5 c4b0bd3e c4a3144e 00000000 4367655a 429e7419 c3840f45 00000000 43823cb9 441feb64 c2d1930f 00000000 436efc56 433f7aed 43873321 00000000 42f21ce2 c495aa8c 4508b5ca 00000000 42cf5fd6 c481963a c2433202 00000000 42ce16ab c2dee9b8 c3815d55 00000000 42b6e8f9 445c597d c4801e3a 00000000 43101518 440d2c1b 4314126b 00000000 43184e04 4380a9fc 44a0ddaa 00000000 4204d006 c45df411 442921eb 00000000 42c0e310 c502d99d c4839270 00000000 4395f7c5 41ad44ee c4e0947f 00000000 43884b75 444f1788 c3c3df18 00000000 42141b82 43179761 42f2cdd1 00000000 4374d4de c33c9300 44516209 00000000 426ffd54 c38ad42b 4283642c 00000000 43883f78 c4a6dee5 c4cbc95b 00000000 438fd114 43ca31a2 c45bee61 00000000 430b81c6 4518c6d5 c2603631 00000000 433bc922 44696553 44e1f633 00000000 4344aa05 c4a7f02a 44e16db3 00000000 421f3cce c4a7fd73 c37d8f88 00000000 43607b7c c3468d87 c4353f4d 00000000 42be0dec 44c65017 c4ae52f9 00000000 43736e00 44c1ad6f 4421e5bc 00000000 43538728 42a6855a 44b387a4 00000000 432cbcda c4edd21d 44858f6e 00000000 431c56fb c4d4a427 c4932270 00000000 422245a4 428c2fa2 c3e58f2c 00000000 42debc38 448a81f8 c3acc6ef 00000000 41efb1c7 44159058 441e98e7 00000000 4294d948 c4591128 450fc6a1 00000000 42b2d5c9 c41bf223 42687223 00000000 42896890 c40fa7f5 c46c0f76 00000000 4332690f 431f74c3 c3789a2a 00000000 436cef1f 44a00766 4315d91d 00000000 4388d4a2 436092d9 4420198f 00000000 4371e488 c430e400 4432e8fd 00000000 4382f46f c491def9 c3c534b1 00000000 4392bcb4 c34dbe83 c4c80636 00000000 4220d80c 44045b42 c3ae1049 00000000 42af1f9d 43c095ae 436471d6 00000000 4344f6ab c2f504e3 44bb6600 00000000 4328e226 c329b4c5 42848753 00000000 42eba675 c39c5e7e c39024f3 00000000 42c972b3 4359fc39 c435fe1b 00000000 434a394e 43eb9380 c29ad463 00000000 436bbbe7 43f38c0f 442bc975 00000000 4358468f c3152f4d 43886d41 00000000 42c4f20c c4a5991a c276e609 00000000 423d4daa c453ada3 c4f55d47 00000000 42c0b843 44943b1f c4ac8a93 00000000 4385a8c4 4405ac2b 430bee44 00000000 434a83c0 43233df0 444b961d 00000000 42240f58 c390037e 435bb345 00000000 438fe235 c4ac8779 c42d45b8 00000000 428a164c 41a3cd08 c4dd3550 00000000 42f712b3 44e7cc55 c45b8319 00000000 422a0354 432ac082 43089c67 00000000 42ec76dc c3b94de5 44ce369b 00000000 43548a30 c3d3c4b3 42c8dafe 00000000 421ddc32 c43378d8 c45af623 00000000 437210fc 44078c5e c493a086 00000000 43803ea6 44ed07f9 c2319c81 00000000 4317c5fa 4410a3b3 448bddde 00000000 435177c5 c4927625 44c4cc51 00000000 42932532 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000004c 43820000 3f333333 40800000 42f00000 3f800000 40400000 40800000 40000000 -> 3fd53e7d 4021f55d 3fd64834 3f7aa33f", + "443aa4d6 43781eb1 42d00000 43953085 41f9267a 00000000 42200000 43388af5 43f3137c 00000000 42a00000 c3f9d0b4 44087768 00000000 42f00000 c4670548 c3821194 00000000 43200000 c3619f04 c490c757 00000000 43480000 448a5605 c4565d95 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f31af23 3f3dc6f0 3f31b003 3f4bdb53", + "44727c07 43d9bda1 43770000 43917292 4292b29b 00000000 42200000 421f9458 44019de9 00000000 42a00000 c42a5a82 43904969 00000000 42f00000 c41f0af1 c433bcb0 00000000 43200000 44133f63 c47f9f80 00000000 43480000 44ab8d80 438a4153 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3fe16bae 3ff604c7 3fe1b695 3da8dc20", + "c442ec3d c470907e 42820000 44d9f804 42e301e3 00000000 423fc849 447f282a 4507379b 00000000 4370806c c4af2509 44f329f5 00000000 42a83119 c4ce813a c3448866 00000000 436261ad c41563e0 c4b712c8 00000000 437a84f8 44bbff40 c4e99e64 00000000 436e45a2 4502ace9 43b56775 00000000 438b4956 43a73cfa 4470fdc4 00000000 42e8a683 c4bd3e24 44d307f0 00000000 437d74ff c4b94239 c3a9c708 00000000 430d20e2 c3137be6 c3ffe464 00000000 4306f330 449f2ae6 c49f7a3f 00000000 42832631 43d94460 42f89d90 00000000 4382e77c 43a16e4a 44ae9705 00000000 437095bf c4d39c8e 44be81cb 00000000 43604a02 c48e5e19 c3c45aec 00000000 428d15f2 c3b4b7ec c500b1d8 00000000 42b48776 438a73b1 c35fb7d4 00000000 4303ffd6 45016f1f 445210f3 00000000 43908f8a 431fef5e 44a54eba 00000000 42b66533 c301e874 42bbe850 00000000 41f750ae c4a72cab c41cefac 00000000 4347e54a c2c608a3 c4b89c6e 00000000 431033b2 43960a89 c3418193 00000000 433c5979 44f32fa2 44826b44 00000000 423f4b6d 40151fe3 432c1d87 00000000 4302322e c4550a7e 43f39500 00000000 437619b3 c5056e38 c4a206d8 00000000 42c280bd 4225566f c48185c0 00000000 4371d751 44b6ee2c c437f932 00000000 4238e194 44b1216d 4471e197 00000000 4382ec32 c342c68a 45022099 00000000 43864b38 c45e6b06 43c2ac57 00000000 436daabc c4ec6b0f c4b4a72c 00000000 4339a437 4396923e c4fec74d 00000000 4393afe5 448b58a0 c3d13c72 00000000 438de297 4425540e 440ced1c 00000000 42e50c2c c3563f85 44840d42 00000000 426e3a46 c4fb451e 441e99be 00000000 421aee6c c488f1ad c481f98a 00000000 4358dc53 43f03537 c4e7cb87 00000000 438f9d9b 450a2d86 c40e7bdf 00000000 43764275 4498e275 44a17830 00000000 421ac34d c41af4bc 44f478a6 00000000 41d11632 c42cb2c4 430b3ba7 00000000 437c9d0e c29f5859 c2bb647d 00000000 423cee48 43992396 c44b3b0d 00000000 43098636 44b8d450 c358a5cc 00000000 42826284 43b69874 43ef8e8f 00000000 43541bb6 c39af183 443072b0 00000000 43735b5b c49fdae9 42ec2b90 00000000 43245967 c48b7fe1 c4ccd733 00000000 438741a2 443981b6 c4b7e755 00000000 4232948e 4389af06 c12a7533 00000000 41e29fb6 44094513 4462b335 00000000 4382149e c40f8444 447a589e 00000000 42dd2b26 c413bfb4 c10b675f 00000000 438d4a09 c3d65c95 c4486ee9 00000000 435d48a6 44a231af c4fadce9 00000000 41d04f35 4409a357 42164f53 00000000 42cde246 447fc74c 4508a8d7 00000000 438bf332 c4064a7c 4439367e 00000000 43940c19 c51735ff c393c5ce 00000000 42f0099a c4153568 c4b882c7 00000000 43881817 4496b837 c4ba17f0 00000000 42b1cbf6 450fcf65 43cb5edb 00000000 42789551 442194e6 44eb3afb 00000000 437131a4 c3ca06e5 43dfddd8 00000000 42aeefe9 c3f75ce0 c2e5f8f0 00000000 41c17b5f c306a40c c3ec6795 00000000 433f3a8d 44dc16d2 c4db228f 00000000 436f5cf5 44bf369c 43dd68aa 00000000 430262b2 4366f01e 447d65d1 00000000 43541915 c4d0e721 44bae1f6 00000000 42fe3535 c38ccbd7 c2c42c2e 00000000 4382b30c c2cae6da c41336b3 00000000 429127a6 447c6e48 c44aa323 00000000 4393a918 44f2f9f3 4446f402 00000000 43324425 42743ea8 4401a646 00000000 43738c09 c4ea7dca 44a878b1 00000000 42c91b5f c489bd12 c4025cb9 00000000 42889738 c240afdb c43c8416 00000000 427c71e8 44f46a06 c49c853d 00000000 42c9b401 44987f6a 4424cdf4 00000000 430818ac 41998df4 44e6ef41 00000000 423bbc56 c49a166d 442ee4d9 00000000 438d7b23 c4e65d94 c48cdcab 00000000 43357c32 420e2383 c44e6228 00000000 428d39b3 443ad6a6 c3ba6e76 00000000 438e5acb 449d4ac2 44583ead 00000000 42c9301c c2e9f030 4497297b 00000000 42adf7cc c4ec9dc4 444d539f 00000000 438738a2 c31901a2 c2eb5c48 00000000 43645d05 4378c0c6 c4cdf8a6 00000000 43752617 450c55de c450b4e2 00000000 43486da6 434264ec 4326c2c4 00000000 42f815eb c28397fe 439fa2bd 00000000 43849124 c3d61e46 4305ab35 00000000 4379e96d c46f7b5f c464bb11 00000000 431703d7 439b6231 c4940598 00000000 42430ee6 43ded473 c2e2c845 00000000 4319d896 448f15e2 44981358 00000000 4394180b c381f072 444ac90e 00000000 42be2a94 c45a604c 432d32b8 00000000 438af463 c48bdb6e c4a58685 00000000 434ac4b3 438039ec c4288f4d 00000000 42a91712 4411ccea c2a72618 00000000 43453a13 449c9fbe 44ced406 00000000 42a7257b c3c06f40 4459486e 00000000 42fc16b6 c3bb8141 4205bf07 00000000 428db6bd c463d53a c4a8698d 00000000 4360f734 4407e40f c485ab44 00000000 422dd287 432ea15d c0c692bb 00000000 428b4d66 44890ef4 44e3f7ee 00000000 43939bd1 c40df6a3 4475d74c 00000000 431ad2ad c4d59ca7 c1f49168 00000000 437ec23c c411de1a c4896dcd 00000000 431db6be 436b1e52 c3b49412 00000000 43941d7a 44bb7be1 42d63a67 00000000 437ce0ea 441d523f 44a97fac 00000000 436bc521 c42174bb 445d35f9 00000000 4360d799 c3c4961f c24526f0 00000000 42d216ca c3bea695 c46de75b 00000000 437dab4c 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000007b 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3e6c2c0e 3e8c3a6a 3e6c2d34 3e97dece", + "c490e80d c461c778 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40325b84 4055af70 4034dfa6 3ec8f506", + "44727c07 43d9bda1 43770000 43917292 4292b29b 00000000 42200000 421f9458 44019de9 00000000 42a00000 c42a5a82 43904969 00000000 42f00000 c41f0af1 c433bcb0 00000000 43200000 44133f63 c47f9f80 00000000 43480000 44ab8d80 438a4153 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3fe16bae 3ff604c7 3fe1b695 3da8dc20", + "44949855 c4112339 43430000 4393283b 42688515 00000000 42200000 42bb016a 43ffc320 00000000 42a00000 c41d137d 43c37837 00000000 42f00000 c440bb23 c40f0528 00000000 43200000 43992a6a c48e716b 00000000 43480000 44ade158 c31e1f07 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e58e6ce 3f43f6e4 3e58e6ce 3e276124", + "c4b212fa 44465d7d 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f0f9c86 3f138568 3f0e6e89 3f06942f", + "c4ab4cf7 444cc9b2 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f14703f 3f223cf1 3f146e07 3f06942f", + "c47f6ba3 445d4d82 42ea0000 4394f978 420c1475 00000000 42200000 432bd785 43f5648a 00000000 42a00000 c402222c 44037e14 00000000 42f00000 c46353fe c399e880 00000000 43200000 c315e9a8 c4924e08 00000000 43480000 44924467 c44027bd 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 406eccf2 407a5323 406f4f06 3e549b04", + "44b4d8b1 c36e9123 41d00000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 40000000 -> 3f06d30d 3f67348a 3f06ff33 3ec619bc", + "445f24a0 c3e9199a 43360000 44ee8cf9 43af9baf 00000000 4388a106 43a0371c 44beeb20 00000000 427cf4bb c4b7c35e 44791144 00000000 429619e8 c2cccf9c c28811bb 00000000 42feeb88 43e50d7a c50eff70 00000000 4323b71a 43050484 c1cdf6b7 00000000 432ae785 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3e0f7fcf 3ed3e549 3e0f7fcf 3d4ae2a0", + "444248ad c42ce00f 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f2166bc 3f354e75 3f2166bc 3d4ae2a0", + "42bd4893 449232e1 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3feec8f0 40420905 3feec8f0 3c5a4ec0", + "c4a1e1b3 c4418943 00000000 4510e476 00000000 00000000 42dc0667 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3d922695 3f209663 3d922694 3f4a4ed7", + "44a6844e c3f8f8ce 41500000 42eee054 3fc6c19b 00000000 432596b2 443bc26e 449aecdb 00000000 43769d62 c4759e36 44f2d879 00000000 43841f51 c4ef2095 432bda33 00000000 425d81b3 c2ea9d24 c31b261d 00000000 430872c4 445a60f2 c50e9c65 00000000 428f3f1c 448ed0b3 c35e51da 00000000 438cddb2 44777a04 4484d430 00000000 43544e2c c3fed299 44ec995f 00000000 4383ca1f c4c03416 43e96e15 00000000 4348f09d c431f458 c41b84e5 00000000 43959a0d 438de338 c4db35f2 00000000 434d82f1 44c8d1f0 c4289142 00000000 437d39fb 44bdcd39 448640b1 00000000 425187a3 c2a5338d 44b2559e 00000000 4308f05a c4c72b32 445997fb 00000000 42acda30 c36b0bf5 c3046a11 00000000 429ac21c c25f0fb6 c49ba10d 00000000 434fa5a6 44797aa4 c42b9d9b 00000000 43897d28 439d3ba9 4308d7ca 00000000 426f04ff 4260ce9a 43bd52fc 00000000 42da9d59 c41fcbf2 440801f3 00000000 434aae1a c42fb04f c35f72a4 00000000 43632d0a c40882fd c505afc8 00000000 41e3c2c0 4467e122 c4727abe 00000000 436b5066 4408b4ae 42e3afb3 00000000 42e9a96e 440ee7ff 44c23714 00000000 42cec90c c4bc5cd6 44f27887 00000000 41b88603 c500c7fa c3544a9d 00000000 4387f28d c32fdf70 c3b3aeb6 00000000 41e8c6c7 43659226 c3b7f489 00000000 434808fa 44b8453e 3ddee672 00000000 43421631 446bdb2a 44bd0dc0 00000000 4362f44c c323e239 43a75efc 00000000 42ad7f3e c494db38 42f50653 00000000 43870f22 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000023 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3e89f114 3eebf9b6 3e89f114 3e276124", + "c497256a 42d4fa09 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 400c7731 408d0dc6 400c7731 3d55d830", + "c39a93fd 44a6a506 42ea0000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 3f800000 -> 3ed1feed 3effbd50 3ed28f63 3d9a89d0", + "4385a4af 444caebe 43360000 441c4120 42e60d57 00000000 4316aad9 43db63da 4502b776 00000000 4331bf80 c4cd724b 448b3a6b 00000000 421cfd14 c2b26881 c26d0e6e 00000000 4318f536 43b9a8da c4e7d09e 00000000 43542c18 45123da5 c3e2703b 00000000 4327696a 445ba058 44a79e0c 00000000 434722e7 c450e446 44980239 00000000 4342c8de c4ac1187 c395054e 00000000 42dee6fa c381b475 c4b6c8e1 00000000 4282d961 44cd9982 c48227e9 00000000 438ecb25 4431d1e4 43fc9fb3 00000000 436d1609 c3942cef 449f0bc8 00000000 428d2a6d c38d68ad 4236855a 00000000 430e1454 c2d8998f c3312259 00000000 4370935b 441b1930 c4534798 00000000 42e1f4d3 43df31a3 42deafce 00000000 42e6cd45 419d37f1 43073205 00000000 4394aa79 c3322938 42d248ee 00000000 434cea0f c36677f9 c32ec926 00000000 4357fcdc 43a1e099 c4981810 00000000 420bf4d6 44437f95 c2ca784c 00000000 41a62dd0 4321f947 438e420d 00000000 4383dde8 c4051b57 4429ef63 00000000 42d8691b c3c6204c c2e02c68 00000000 439258f4 c2986a86 c427b075 00000000 4387fec8 44db37bb c4709dd3 00000000 430b85ae 42a86c38 428837b6 00000000 42c1c776 c30085ec 43d65860 00000000 42224132 c37488d1 41bf621e 00000000 433d6251 c490cc51 c508f24b 00000000 4332bf9d 443561a1 c4593d21 00000000 439034d1 443e5ee5 4371506b 00000000 43416774 42a43365 447a0672 00000000 42c7eb25 c4b21eca 4435463d 00000000 4337239c c48d3568 c4736232 00000000 4385de64 435c26a8 c424b396 00000000 4384cdde 44d7cedc c2e5410a 00000000 435c74e4 44397b75 44bd848e 00000000 42dab269 c48ffd3c 44a1e6ef 00000000 4345040f c4ffe863 c433f627 00000000 43698cd6 c229223b c4506177 00000000 421f712f 44a021ce c4169253 00000000 431ea792 44809bfd 446c0db7 00000000 435e7c3f c39d81f9 44554739 00000000 436361e1 c5050474 42955a7b 00000000 4391f3d1 c41e45e3 c4af61d8 00000000 4318b1f7 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000002f 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3e27cf84 3e366858 3e22de6a 3ed720c2", + "c18f31b7 c4af4d13 436a0000 44d5aa28 43cbb8de 00000000 432d3cd2 42d6b14b 4482129c 00000000 42eeb570 c4bc5f29 44312d0c 00000000 438a0ec0 c4a5e935 c4a8ed7e 00000000 42c90668 442d8822 c4b02ec0 00000000 437b32b6 448169f5 42fb62f0 00000000 430bfb92 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3ee34716 3f1c026d 3ee7e878 3ecf2756", + "c49dd5e3 43e5ec37 42500000 45144bcf 42f6fcc8 00000000 4385bdb6 44523f3b 44d09a31 00000000 433e6950 c3d8947a 44236c9b 00000000 436cad3e c3fb5acb c205bb1c 00000000 4369b81e c30ca368 c390b031 00000000 42e2b0c2 445bce9b c4a0c7a0 00000000 429add57 43d71844 420b5da6 00000000 437c6812 42e7c11c 43776edb 00000000 43687714 c478579c 44b0265a 00000000 42944248 c50418c1 c349de24 00000000 434323b0 c47add4c c50b19fa 00000000 4207ad56 436ef0e1 c3a4666b 00000000 41ccb290 44b8d897 4322c4c0 00000000 4287ddb9 443890d6 44d4cf26 00000000 431a8df1 c47a9e4f 44a74fd0 00000000 42bc16f9 c50ed0b6 c38e721b 00000000 438a2fb2 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 40000000 -> 3f5dc8df 3f9e819b 3f5e0516 3f14d74e", + "c483ea3d 449f53f6 00000000 43960000 00000000 00000000 42200000 438c7a85 43dac84f 00000000 42a00000 c399f96e 44283853 00000000 42f00000 c46d9924 430779a7 00000000 43200000 c440d32a c45f41ba 00000000 43480000 43c69044 c4a7cfcf 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f43ab94 3f44240d 3f411e4f 3f7979ad", + "c3c88386 c4ae8b7d 43290000 4393dcef 4249d606 00000000 42200000 42efed5f 43fcfc8d 00000000 42a00000 c414fba2 43db5ab6 00000000 42f00000 c44e8974 c3f47a9f 00000000 43200000 431c05e9 c4923478 00000000 43480000 44a8b2a8 c3ba2991 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401363df 402e91e8 4017b8fc 3f354648", + "c464a2c6 c4254f33 43430000 4418f665 42f1b157 00000000 42912602 430f478b 4443f596 00000000 4389bb32 c3c99652 437adc3d 00000000 432094a5 c4ae6d69 c4817003 00000000 42a19943 441aedd9 c510153f 00000000 43130296 44d66e6e c342ff43 00000000 4387cdda 4460dc80 44d34dbb 00000000 435cc442 c2e072d1 43039f0e 00000000 424f8df2 c33eaf5c c282b92f 00000000 43548ed0 c183101a c3b39ce0 00000000 437bd335 447a5844 c3e06ae5 00000000 4355bb0c 44b68439 44b24534 00000000 42ce8d4b c4370cd2 44d9cab0 00000000 42bcb37f c5147d5c c25173bd 00000000 4386c1d6 c3095fab c3b9fe81 00000000 43910c0d 44cde98c c4b81c0f 00000000 4394c719 44f0442a 447158bd 00000000 4380bbeb c335396b 44fc02ef 00000000 430152f3 c504c00d 441c3b98 00000000 43795d1c c406fd47 c42d3c2c 00000000 427b6878 443e2ef6 c4a12a0b 00000000 43582fbc 4514c90d 43bcbdf3 00000000 438dfb8d 42d50828 43efcf71 00000000 428ff21a c3373147 42f79f14 00000000 423877f2 c4c53699 c4871d21 00000000 438fd271 43eada3b c5005766 00000000 4211c7ba 45081b13 c3a59881 00000000 42f5a29c 4488965f 44eae0cd 00000000 43275d3a c41c6453 44461a16 00000000 43950299 c3ef42e1 c3101719 00000000 4386b0db c2edc5f1 c4b1f382 00000000 43718bb6 43917d91 c30fd805 00000000 43945f0a 44890724 44782df2 00000000 435433e3 c290f5f1 434081a0 00000000 43892176 c50f85a8 421041d5 00000000 43473068 c37b92c4 c4185aae 00000000 42a4f941 442ee998 c428b131 00000000 438fb79f 441cf992 438f1ca8 00000000 435c2c46 c2bffdb9 44e6f7f0 00000000 43833ef2 c3c8429c 430675b7 00000000 4330da44 c3c66780 c3ebb417 00000000 4381bb6c 434a9748 c3bb8089 00000000 4285e7c6 43cad71f 4242e048 00000000 4379b103 42bec6e0 43b6030f 00000000 431c7585 c4f84605 44b5cf40 00000000 42c241a4 c2d7a14f c28811de 00000000 43864eea 439afdf4 c4cca47f 00000000 430d70c6 44bceddc c3904b88 00000000 43717064 44503c25 44a46f36 00000000 43926592 c410fbc3 44469ffb 00000000 43197320 c3d4cb92 c2dda4f6 00000000 426f78a4 c27eacaf c402d76d 00000000 42510f93 44c99e14 c45aa4d7 00000000 433f9ac0 44a96234 448e223f 00000000 438af12f c2f7e1f2 43b98aad 00000000 42770232 c4fb403a 42d71094 00000000 4323a021 c460cbb2 c4f59145 00000000 433dc8ce 449521b3 c49b1bc6 00000000 435788f8 44c164c1 441ef9c1 00000000 438b9ffd c1f51c25 45073441 00000000 43672e9f c4abff9d 44021ee7 00000000 432fdf5c c4c2ca32 c4d66f29 00000000 43472565 4431a3d3 c4b45e8f 00000000 42e94541 44b70ec6 42f00fd2 00000000 438c25c7 438a2b90 446428df 00000000 431366b7 c38c9fbd 435ebc0c 00000000 436766b2 c48c0b3b c4224d52 00000000 434c2c84 432469a7 c4888bad 00000000 42216a07 44d2296b c3c1a613 00000000 41ce5bdc 44255bb6 4470906b 00000000 432465f9 c35f6313 43a5d00b 00000000 4294b46c c46ede01 c352a725 00000000 437dca76 c34561b2 c49a1067 00000000 431f94ce 4312ac4e c2adb111 00000000 4203c4f2 44bd7e54 449330a6 00000000 438828ab c2eed76c 43cc1a32 00000000 4352bbe7 c3ba9861 42087ff7 00000000 433fe8d7 c47fcaaf c4fdac15 00000000 4337c4d0 43cfa5bb c3e8f553 00000000 432ab261 4494c932 43dabdfd 00000000 42fb8397 4098086d 4349779f 00000000 436a6a0c c4a7c751 440d9fb8 00000000 434e937c c30b58ac c30e39e5 00000000 41fe259a 425e1867 c2f8c6a3 00000000 42987213 440985ee 41c1e61f 00000000 433cce89 424451da 430e78bd 00000000 4345b0da c46e55e8 444bd904 00000000 42e8aec3 c4b1d7a8 c43c8d85 00000000 42fb3a2f 42788136 c40a8a7b 00000000 4233b5ca 43eb357e c2fe7715 00000000 42619aac 440010da 442c06a4 00000000 4326d15a c386caf3 43d960e5 00000000 4313439a c45533bb c31a8857 00000000 430b747f c39fdb9c c4c8b7c5 00000000 4385becb 44c84602 c481078b 00000000 437d7148 44da586d 449cc256 00000000 426bb2c8 c3a8cd42 44a774ae 00000000 421b36af c4993d56 431eefa3 00000000 42f122ba c44283ac c4b00bd4 00000000 4357e7d6 449f91f9 c4c13b30 00000000 430e30ba 4495cc7e 43c2e6ed 00000000 437bff3f 430461dd 4506c3f7 00000000 427de4cb c4fa81b0 446a1a7e 00000000 43204335 c3d2c350 c3c7792c 00000000 436bb668 44659be9 c50ed988 00000000 4327debb 4482c272 40d29ff6 00000000 4260e336 43b55c94 446a252b 00000000 42efc381 c336b91c 4328a0a0 00000000 432506cf c4abd0f2 c425de6a 00000000 424c2758 4289b4a1 c4687ee0 00000000 43401ba8 447de09f c39e1e16 00000000 4262f074 443855fe 44650804 00000000 42ee42d9 c46a7d5d 44ce0d94 00000000 43857e9a c3a90f41 c240add6 00000000 4307e2d7 c3fe25d5 c5051ca9 00000000 42bf43b3 44c245af c487cdda 00000000 431d7c35 442898aa 43df4cb1 00000000 435eff3e c3ab78a4 44c9fa5b 00000000 431c6b1b c4d1532e 438cdb7e 00000000 41c454fb c43edbfb c49e4fe2 00000000 43792f73 43c35f95 c3ffa72f 00000000 4383d140 4507c337 441a3ecd 00000000 42a5a3ee 42e46ae3 448fa5ad 00000000 435efb74 c4d679ec 445c8604 00000000 428b429f c2a92df9 c2946ceb 00000000 438fc380 44235f04 c4e3c2d8 00000000 432502f0 446c8c7b c1ee203b 00000000 428c3d4f 42918be1 4328b5d3 00000000 42ed3dfa 00000080 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3ea08fc7 3f192a92 3ea08fc7 3d883d00", + "443aa4d6 43781eb1 42d00000 43953085 41f9267a 00000000 42200000 43388af5 43f3137c 00000000 42a00000 c3f9d0b4 44087768 00000000 42f00000 c4670548 c3821194 00000000 43200000 c3619f04 c490c757 00000000 43480000 448a5605 c4565d95 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f31af23 3f3dc6f0 3f31b003 3f4bdb53", + "c4912430 c319be2d 43360000 439385c6 42593240 00000000 42200000 42d589da 43fe75db 00000000 42a00000 c4192560 43cf91de 00000000 42f00000 c447e777 c404cf31 00000000 43200000 4367aa89 c490a122 00000000 43480000 44abcfbb c3850413 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e96dbc2 3f6ae035 3e96dbc2 3d55d830", + "444e9c51 c11b0d9a 43430000 4393283b 42688515 00000000 42200000 42bb016a 43ffc320 00000000 42a00000 c41d137d 43c37837 00000000 42f00000 c440bb23 c40f0528 00000000 43200000 43992a6a c48e716b 00000000 43480000 44ade158 c31e1f07 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f180f08 3f258ace 3f180bcd 3f6c7d59", + "441d9923 43602d60 43360000 4503d874 43c21d79 00000000 4335db9c 438e6b11 44a9b5f9 00000000 4327f160 c4558350 4410b1da 00000000 4328c94d c408c1ae c3b5b66b 00000000 42a56cc2 43e14560 c50ca30d 00000000 41d4f69b 43be5afb c2935f62 00000000 438b463d 441411af 446202bc 00000000 438a2149 c439d380 4487395f 00000000 42a91ac1 c3d3006b c2b6bd2e 00000000 425251ef c399626f c4d827a1 00000000 42ccd927 4396b672 c33ed1a0 00000000 42826b71 449f44e6 446244ef 00000000 433571ea c37a5f0f 44865e9c 00000000 430f4090 c515dee1 43c17156 00000000 428f685e c4183838 c478f7ff 00000000 432a2bf3 44a58fde c4e18892 00000000 424b9c7a 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3f190629 3f26f594 3f190688 3f6c7d59", + "c4ab4cf7 444cc9b2 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f14703f 3f223cf1 3f146e07 3f06942f", + "43c9061d c4b347ad 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 405ea9f8 40a107d2 405ea9f8 3e4c1fc4", + "4386da6e c3af71cb 43500000 4506fa2a 43e3e5ef 00000000 431988f0 431b2626 447890a6 00000000 4393d521 c402dfaa 439507ef 00000000 432dc10a c4ba90fe c49a1b97 00000000 435cf12e 4441b9a1 c50e812b 00000000 4308699c 4498baca c22c087c 00000000 43555e44 446ae7aa 450bafa5 00000000 43905de1 c383f348 437b374c 00000000 438eb8ff c4a303f9 c41c6013 00000000 4204ffe3 432624e0 c4f5682f 00000000 42fbc9ee 43c933f4 c2e60205 00000000 41b55e5e 4432b2c9 446f6d4a 00000000 4392f15e c4897cf1 44d800bc 00000000 42da4e62 c42ac7d9 c30d597b 00000000 42d7bf26 c30b55d6 c459912b 00000000 42907d5e 43e08724 c381054a 00000000 438f19d7 448e4cf0 446931df 00000000 42a6d739 c40d407a 44d28bba 00000000 438dc88d c379f699 411ca716 00000000 439405b3 c46eb69a c50c63fb 00000000 43876142 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000014 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3e198dfa 3f2f2917 3e615c17 3f2b3e6f", + "c45346b9 c4b354b3 421c0000 44e29b2a 428d7954 00000000 437ffa1e 448baef3 45021002 00000000 4221ab74 c4027a54 4456a39d 00000000 429e8e72 c42f2cc1 c1218894 00000000 438395c4 c293eda1 c301f785 00000000 4303d932 43802c5d c3df0672 00000000 4386baf0 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3f2fbe1f 3f363044 3f29503a 3f354648", + "c4ab4cf7 444cc9b2 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f14703f 3f223cf1 3f146e07 3f06942f", + "444e9c51 c11b0d9a 43430000 4393283b 42688515 00000000 42200000 42bb016a 43ffc320 00000000 42a00000 c41d137d 43c37837 00000000 42f00000 c440bb23 c40f0528 00000000 43200000 43992a6a c48e716b 00000000 43480000 44ade158 c31e1f07 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f180f08 3f258ace 3f180bcd 3f6c7d59", + "c47f6ba3 445d4d82 42ea0000 4394f978 420c1475 00000000 42200000 432bd785 43f5648a 00000000 42a00000 c402222c 44037e14 00000000 42f00000 c46353fe c399e880 00000000 43200000 c315e9a8 c4924e08 00000000 43480000 44924467 c44027bd 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 406eccf2 407a5323 406f4f06 3e549b04", + "42bd4893 449232e1 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3feec8f0 40420905 3feec8f0 3c5a4ec0", + "444248ad c42ce00f 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f2166bc 3f354e75 3f2166bc 3d4ae2a0", + "448756b1 c38ea322 430f0000 4307995b 419c3101 00000000 4303bad2 42bf3251 43a34619 00000000 42a73d39 c4918fc3 447b8b49 00000000 431b2e43 c41bcdcd c38f1046 00000000 42415b83 4076d38a c4b89f68 00000000 42f1849f 450b153b c47be924 00000000 437c6f10 44d97654 44bde3d2 00000000 434dab6e c412ad19 44f5be76 00000000 422e8502 c4bd5297 435201c1 00000000 42db599e c4844a81 c4d06ac6 00000000 42f92833 448b6cfd c4d60240 00000000 4310cd4b 4447005c 42f0013e 00000000 43195b54 44042df1 44e76e34 00000000 432cb80d c4e4109d 44c26ee0 00000000 42f5bf84 c2b934fe c22d0b7c 00000000 431e1d5f 41656b74 c4c1f5c9 00000000 42cae540 42d7e5a1 c240147e 00000000 434067bd 443f47c4 44294688 00000000 436c9fe0 c41202c2 44eed6b9 00000000 4221a93f c504d4a6 438c2b16 00000000 43894d45 c4363b70 c491ac7d 00000000 426d43f7 44a2eefd c4f680d0 00000000 4368926d 44ef4d47 4396cd0e 00000000 430cb21a 433a9219 4427877f 00000000 42a483de c4b87dfd 449b2f76 00000000 439443cc c432cae5 c3a9f2d6 00000000 42c87723 41060260 c403ee3c 00000000 431c796e 44af1245 c418fc5a 00000000 433383b2 43834771 436b79c3 00000000 4342ac3d c3b6279b 449185d4 00000000 420ca4f0 c4a8d2aa 43290ccb 00000000 4384bb78 c332c035 c3910539 00000000 422a227c 44851985 c4c67e49 00000000 4353e1ef 44ffd5ff 43a82e1c 00000000 42d2c38e 4349892b 4439b98e 00000000 41f886a7 c41ac834 440073ee 00000000 43264f47 c489dad9 c405489b 00000000 438410a2 423ef4b0 c5049450 00000000 434f68a8 449601ed c400b8d4 00000000 4329ad96 44a6f7fc 4497c181 00000000 42e08c75 c37810ea 4441aa9e 00000000 4361cad3 c4c0cb48 4336ac84 00000000 41bdd353 c399a082 c3fd0422 00000000 42da4690 435048ee c3991b03 00000000 4325a492 43133262 41c98e37 00000000 43780484 43d9a0de 44cdf263 00000000 42858420 c4966897 44764bde 00000000 43734544 c4651bd9 c3e14528 00000000 434b3c8a 40b6f266 c3443733 00000000 4382caeb 42cb033f c22b06dc 00000000 422a3739 448f776f 44842451 00000000 438e0d79 c437f4b7 450c6722 00000000 435e46b2 c4db58c8 43440ad5 00000000 436a6774 c4845bea c4dd480b 00000000 42d38ebb 4469f7f2 c4a98e64 00000000 438b9ec5 4380af12 42373c93 00000000 4333cd39 440eb00c 450abf80 00000000 42698030 c4ba5d38 449688fd 00000000 437156af c427e737 c3a7dcce 00000000 423169cb 429d640f c5097bb0 00000000 430e402e 44aa507b c40cd463 00000000 42d158fa 440f0298 44057bef 00000000 43161eb5 c39d5146 446addb2 00000000 425dc38e c50ee602 43701a07 00000000 434ff90b c42157c0 c488eb9c 00000000 4291482c 4466c735 c4a4e4e4 00000000 43471900 44a8be32 4379863a 00000000 43445dc9 43de05a5 44ddfb6c 00000000 42ee40c7 c4c385d7 449bccf8 00000000 4385a0c4 c44110b7 c3c43b3e 00000000 430eff32 425c9035 c4a28357 00000000 4375c2a1 44fedf69 c44ecde2 00000000 423a1002 44abe881 44a29adf 00000000 423d5f60 c3657c60 44279b8c 00000000 431763fd c34443ad 419a5eeb 00000000 433a2258 c3ffe7ef c45c8072 00000000 438f70d7 44b2a96d c4fbbe85 00000000 4332eec9 44a1eb7d 437852fa 00000000 42d3691c 43c681c8 44cc3680 00000000 431a0001 c4395a19 4411b2be 00000000 4332e3c2 c4ed87ce c475669e 00000000 427410da 42ca3ddb c500d6bc 00000000 4313f4b8 443c9c4b c39621c4 00000000 430bbbdd 430e28ad 43084310 00000000 42c6c5b7 c3b54c37 44819a65 00000000 4304cd85 c51b6b95 4363d776 00000000 4300ad2c c470f185 c4d2d0c0 00000000 430e22c8 44ab5840 c4ee133f 00000000 436a954e 4489fa76 435b3374 00000000 42923878 43d147c2 44ddb236 00000000 42c127d8 c4d8d831 44a823e6 00000000 43112742 c4b2a0c3 c43b8e76 00000000 438742f1 42e1fbc9 c4fd8a10 00000000 43514ada 44c1f0a9 c4176775 00000000 4390c7eb 438cde78 4388d414 00000000 430830a2 c414b4a7 44d02bae 00000000 42d75837 c4ab6b54 42e8fa14 00000000 43668203 c439cabc c4a5172c 00000000 42ee439f 44b619b3 c4f983dc 00000000 4309170e 44f6c107 43cad215 00000000 42dae794 425407a3 436775ce 00000000 4391cf47 c334f29d 430a6545 00000000 434689d7 c4a864d2 c433abdb 00000000 43955055 4207b224 c408015e 00000000 432e5113 44bc9e88 c410606b 00000000 4363a091 44c4cf5b 44c1b81b 00000000 43175e7a c424fcb2 44e23689 00000000 42271c0a c4dc2ba0 4309ddc7 00000000 4304b4f4 c4220cd5 c49240f0 00000000 438b4ca0 4477a819 c4a753d3 00000000 4341c62b 44efbf1f 43cbb1a5 00000000 4226fb0e 42d36e66 43ee0bc6 00000000 41a251d5 c4b37819 44876395 00000000 4353fe79 c4ecd8f1 c48060d6 00000000 41c3955b 4312c3c6 c504e5ce 00000000 4336f858 44e6566c c42cd169 00000000 41b44d59 44381365 44379a46 00000000 43037b44 c357e417 4411038a 00000000 43886875 c4824897 429544e9 00000000 43950bec c3c46ad6 c4341445 00000000 4376b596 443fac1d c47f7126 00000000 42415042 445a83e1 433fb7d0 00000000 42fd0eb4 4391ccde 44a97580 00000000 42a68e69 c48eed6e 4454afe2 00000000 43131f98 c350229a c2e53687 00000000 4290dc12 431f65a2 c503a189 00000000 421828f5 44e3697e c4273169 00000000 428b59a6 4477365e 4479ddfb 00000000 4393253e 00000080 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e3e9ca3 3e9fd28a 3e3e9ca3 3f03315f", + "c477d3c3 4419876b 41500000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3eb9d965 3f00e72d 3ebaf6b1 3de35d40", + "44727c07 43d9bda1 43770000 43917292 4292b29b 00000000 42200000 421f9458 44019de9 00000000 42a00000 c42a5a82 43904969 00000000 42f00000 c41f0af1 c433bcb0 00000000 43200000 44133f63 c47f9f80 00000000 43480000 44ab8d80 438a4153 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3fe16bae 3ff604c7 3fe1b695 3da8dc20", + "4286d28f 43b90df6 41500000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 00000000 42f00000 3d4ccccd 40400000 40800000 3f800000 -> 3e3bb233 3ea02cd5 3e3bb233 3e90563c", + "c25b897a c4896d47 41d00000 44852760 41dd9e2d 00000000 43903279 44508066 44b6964e 00000000 4364390e c45c3756 44c6253a 00000000 42b0222b c4196ed9 41b8a93b 00000000 43818f1a c3b7ab5f c40b711a 00000000 4239b531 43c55a01 c44fa6b9 00000000 4216d75f 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3e293aae 3f4dfd57 3e4d542a 3f72a230", + "44073ea3 44419428 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e286a8c 3f129894 3e286a8c 3e579118", + "43540a07 c48d467d 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3f39263b 3f3d3dae 3f308ec6 3ee9973a", + "c4ab4cf7 444cc9b2 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f14703f 3f223cf1 3f146e07 3f06942f", + "c40a10ce c330d2cf 41d00000 4510b752 4270dca2 00000000 42051208 44879cd3 44ed83d0 00000000 42aa8dd8 c2a12926 4311023b 00000000 43387178 c492ddbf 4230c1fa 00000000 436d15fd c48063ee c4c2f2a8 00000000 429e2ac5 42b3a377 c33d0388 00000000 42d34677 442da1b9 c28d0884 00000000 43437916 44a36e4d 44d8c918 00000000 43227779 c4145cf2 44b9b76e 00000000 43573613 c4d1cea3 438b8d30 00000000 431494d6 c3d5f659 c3f924f8 00000000 42881ac8 441ed242 c4f28768 00000000 42c37fbe 4493fe84 c3899718 00000000 42f3b5fe 44b00d2f 44b4696c 00000000 42e29d50 c413f670 450f2c72 00000000 4376c3b5 c4d30297 43fdad86 00000000 431a9a8e c4511d4b c43caa69 00000000 42c0d0f2 4323213a c454ed45 00000000 42856fd4 4510397b c456396b 00000000 41a7ca37 434c35c0 4321ef1b 00000000 43672dc2 c345813b 44c373c8 00000000 43407ed3 c505bfac 446e5e19 00000000 424b388c c44180b9 c4065678 00000000 43929dd8 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000017 43820000 3f333333 40800000 42f00000 3f800000 3f19999a 3f4ccccd 40000000 -> 3e4bd2b8 3fad5b3f 3e4bd2b8 3edcbc78", + "44b4d781 c42a30e0 42c362a8 439548e7 41ea16f6 00000000 42200000 433ea91b 43f1e490 00000000 42a00000 c3f49b3b 440ace2d 00000000 42f00000 c4689674 c36cbe3f 00000000 43200000 c38303c6 c48fd142 00000000 43480000 44862e84 c460ae13 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40c1cc31 40c3eff4 40c07f6f 3e736b1c", + "44073ea3 44419428 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e286a8c 3f129894 3e286a8c 3e579118", + "c4443555 438a806e 430f0000 44f08533 438a85ec 00000000 434dd507 440bfb7f 44ef1403 00000000 4250cade c4c620bf 44ab311c 00000000 438bb7b6 c498a657 c40c2ad8 00000000 433224f6 40b87318 c509f73a 00000000 4392af5b 443e9690 c3ac9963 00000000 435700e5 44800346 445f9055 00000000 434202db c3e6946f 44c128ac 00000000 4389d4ec c5039ef9 43920048 00000000 43407781 c3b348e3 c40d39fb 00000000 4357b6a8 449e962d c4f36b60 00000000 431ce8f4 440ccf7d 42a9d2ee 00000000 43688143 426c8c57 434f1578 00000000 42bb9fa7 c4c9d20a 44ac0f10 00000000 425b193f c5096dc9 c4806779 00000000 4333e4ae 4015bdb7 c37d318a 00000000 4332ff0f 4504f52a c46c94a0 00000000 4301a944 43f8c089 43dc22bf 00000000 4304e83e c430a5b3 451079f4 00000000 432001c2 c4f5d847 4381b676 00000000 41b1c78b c4498ca4 c4a11d9d 00000000 43701e50 433877fb c38b8aba 00000000 42936569 44e57456 4390986e 00000000 4338d846 42fe2061 43e430ba 00000000 42e9c88d c4e0fd31 44bd3fd4 00000000 433b75c4 c2eacab1 c25f2d82 00000000 433a1145 41a98446 c4a6e323 00000000 432b090f 44c26e2b c429e70d 00000000 42c472aa 4463a9b8 444c2e0a 00000000 41e2ab30 c29bab5c 4378ba3a 00000000 4332e856 c395dc3e 42160fd8 00000000 4302547b c4487dfa c4a2a8ba 00000000 42d3f434 449f6b52 c4edbe75 00000000 4362f8a6 44efadab 439d8efd 00000000 426529a5 438677e3 4477d67e 00000000 42a7211e c4e45fde 44bd86e0 00000000 42e8bd39 c4ebb6b7 c463e5c0 00000000 42a8582d 41009b57 c3b294e9 00000000 426d7925 446eb35b c3ccd470 00000000 41a8b703 42f18893 42db86e6 00000000 43149d37 c2daed5d 43aaeae8 00000000 431ef84d c407925a 4280748a 00000000 42f80a5c c43ae90b c499ea85 00000000 4317ce6f 42fff833 c33c284d 00000000 4300ef24 44e30391 439b6c9d 00000000 438fced5 4415b57e 450dac4f 00000000 438d00da c45c681e 443475b0 00000000 42a1bcab c501f4cb c47f8ec6 00000000 4296bdba 41820da0 c40b7c57 00000000 437162cd 44317947 c39582fd 00000000 43951499 44be4db2 44af481d 00000000 41d27f5a c43b0645 450ebeb3 00000000 435b2aec c4ce5cdf 43387012 00000000 434f20cb c4778b62 c4ceecfe 00000000 42c7e266 442178b1 c46a091f 00000000 4326ffa7 45094fc8 43c3859e 00000000 4315f493 41d79b2f 42d1a73b 00000000 433e2004 c469fc26 443d002e 00000000 43389a8a c4061545 c3860cf5 00000000 42a549ac 42879a04 c4ece660 00000000 430fb092 44c9bf4d c426d225 00000000 42fc331c 4444da07 4437bd3e 00000000 430c8e34 c37e278b 443db813 00000000 41ba8850 c50e2153 436ecf8e 00000000 433fd281 c3d3710a c4336f89 00000000 4389523a 44aa8406 c4f3abec 00000000 433c293e 44e20cd9 43a72209 00000000 41e9b1e2 43c603ea 44c5facc 00000000 422f964e c487acdb 44583927 00000000 4318dfea c4cbf98e c44f51e3 00000000 4386a23e 42989e48 c4e0e6ad 00000000 436af094 450ac98b c461397c 00000000 42989758 433e955f 43344503 00000000 4317e839 c43d409f 450a3901 00000000 437b2483 c4eeac92 433bba5b 00000000 42e41720 c49b466a c505caff 00000000 439167bb 42e8df0e c324106d 00000000 437e8320 444db18b 431dba6c 00000000 430fb605 43ba326d 44bf8c90 00000000 43282a36 c4598bf2 442b0159 00000000 4346d1fd c4d4f042 c45bfe79 00000000 427637b5 42f04991 c5191375 00000000 4326614b 44abf896 c408e316 00000000 42c90813 44a9303b 44a22b96 00000000 4391dfde c4482e78 450f1a3a 00000000 42f99a86 c35e1adb 41a2ccba 00000000 436169bc c4220f3d c48dcb99 00000000 4382282c 4487c4cb c4bca4e1 00000000 438a9325 44887723 4358cc21 00000000 429b66d3 435f072d 446c426d 00000000 4379cb8a c365e1a6 43323fbf 00000000 422fd64c c4ee6989 c47a543a 00000000 4391bd36 43005a9c c510014b 00000000 43938d44 44a7b3a9 c402ebaa 00000000 43863006 44a51760 44a05b1f 00000000 42962f3d c3ce7f99 44908971 00000000 41b0ad66 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000060 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3ececfcf 3ed7ede0 3eccedfe 3f14d74e", + "44b4d781 c42a30e0 42c362a8 439548e7 41ea16f6 00000000 42200000 433ea91b 43f1e490 00000000 42a00000 c3f49b3b 440ace2d 00000000 42f00000 c4689674 c36cbe3f 00000000 43200000 c38303c6 c48fd142 00000000 43480000 44862e84 c460ae13 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40c1cc31 40c3eff4 40c07f6f 3e736b1c", + "c47f6ba3 445d4d82 42ea0000 4394f978 420c1475 00000000 42200000 432bd785 43f5648a 00000000 42a00000 c402222c 44037e14 00000000 42f00000 c46353fe c399e880 00000000 43200000 c315e9a8 c4924e08 00000000 43480000 44924467 c44027bd 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 406eccf2 407a5323 406f4f06 3e549b04", + "4485b04a c3aed057 42d00000 4442b575 42a29596 00000000 42b756f6 43d78b79 448df4a7 00000000 428efb46 c36cce80 43815c38 00000000 4300ec07 c30dd39d c21fb3a5 00000000 43069d6c c2bed114 c3f4e3db 00000000 433bab9d 448e78ba c45cc627 00000000 43501122 4434fe4a 43ac8ce1 00000000 41b78651 42080403 44c15519 00000000 4339fb23 c4cc2a50 44592880 00000000 438158ac c40c7a6a c3c68ebc 00000000 436c3ac2 43a7e132 c50c5801 00000000 420113e9 44cd378d c4074589 00000000 4309b286 44a2a6de 44a2ba26 00000000 4288c4fb c301c263 43c48c62 00000000 43945407 c4b88eb3 435c11c9 00000000 4337317b c3350cdc c38037ae 00000000 4253e546 4398adb7 c40f623d 00000000 431848c8 44d9ee6d 421c8b89 00000000 434de3c2 44105d35 44979bbf 00000000 42f9bb43 c4978a18 44c36601 00000000 42e46fc6 c400c997 c2c931fc 00000000 4213dd4a c40f4e54 c4fefbe6 00000000 4313bd26 447a23e2 c464bd92 00000000 43152ca6 442d8ab1 4383efae 00000000 436d9494 43587d16 45023732 00000000 41e9d6f9 c33b153f 42f00132 00000000 438512be c4c3e2ac c4677aa1 00000000 422e5d86 42a70785 c49be14d 00000000 42aed7dd 44ab0f17 c4109d7e 00000000 42016900 4464cd6c 444250e1 00000000 438c6f09 c32928e8 442edf9d 00000000 41e6ee7a c4fe5b03 43edb527 00000000 43375ae9 c4542f3a c47dce50 00000000 430f935c 43e667d6 c4855fa2 00000000 43799e23 445bf1a5 c25043f4 00000000 438d7726 430c3f32 43719fc0 00000000 42ee9647 c3124cf1 43603c12 00000000 438931f8 c4bde1e2 c329c3f3 00000000 4380209a c34c0fee c4096805 00000000 42a487a6 44bfa846 c4ce59a2 00000000 42bbcbd4 450868a3 441de7f7 00000000 42ee18b4 42af73e4 43ea441d 00000000 432d4288 c488c868 4450c860 00000000 429d9e74 c46eecea c3e812c7 00000000 42723039 c211ea3a c51b3c37 00000000 43105d94 43885405 c30e763f 00000000 4318b381 44e960bc 44a77fd4 00000000 438120b6 c2329f6b 438e38d7 00000000 4272cfc9 c41c139a 4348b8eb 00000000 42b85cc0 c4d00a90 c4d33277 00000000 422bc07e 4239c65e c30952e5 00000000 43115b06 44927efc c325f3fc 00000000 4386e3e0 44ab3796 44f64d7a 00000000 4356f86f c473343e 44e06f51 00000000 43764c3d c49f243e c2178028 00000000 4345e483 c2a23615 c32d9a8d 00000000 42eecd5e 438c1259 c3b1ea61 00000000 42950a53 4320a2fb 42025995 00000000 43889f60 4410e149 45049996 00000000 42c5baf9 c326248a 4315b806 00000000 42cfcf5a c3376a3c c28e83b9 00000000 42cec347 c348464b c501a79c 00000000 438564d9 44e2d95a c48f2f2d 00000000 433c39e1 447715ba 44146ebc 00000000 42a2a0dd c31b0ec0 45026cef 00000000 4311f50e c4b53b1b 44161bbd 00000000 438e46a9 c4104f29 c3f8c3cb 00000000 43783eeb 4326b36c c426fd71 00000000 43140e4e 450a19f2 c3f9a298 00000000 42bc5480 4470a16e 4492117d 00000000 437df579 c3d615a2 4472f6d4 00000000 4339fce9 c4d0f354 42ad6439 00000000 42f07d1e c405227f c46946b3 00000000 4360d291 43f45ec2 c4385211 00000000 435ded65 4500faf1 4375e4ff 00000000 42895c10 437fc21e 443024c5 00000000 438efce9 c3cc0fde 43d883c9 00000000 43491e92 c33f8da5 c263cfd5 00000000 435ddd51 c38ca276 c4c3a922 00000000 4333a39a 431bcd39 c2ea3c3d 00000000 42f02737 4420ef9d 439f3b35 00000000 43394334 4190b01d 4518f115 00000000 41f7caa0 c30a5f90 428e098e 00000000 42388bb0 c36a5150 c32ac702 00000000 42e1d895 43c10925 c512b54d 00000000 43336670 42c90c13 c1fc1949 00000000 433ec18e 44996b8d 449e09cb 00000000 42a0ef0e c438af0c 45054e15 00000000 43114d4e c4cb48c5 435a335a 00000000 43173c82 c42f375a c48002a0 00000000 425789eb 43b6d368 c425d0b4 00000000 435ceb31 4482d19c 421b1c4d 00000000 434bc91e 435cdbf9 43f0efaa 00000000 434d7014 c4922120 44b6d97b 00000000 43441f02 c4ef534b c3c97cfe 00000000 4326c9a5 c4071acf c4fe9951 00000000 42e1f6e6 43ef91dc c3d4bdb5 00000000 42a9c2e0 44acc7f1 4409295d 00000000 4376f864 430bf703 44c42c7b 00000000 4340a458 c43fed1a 43ee6288 00000000 42d714d6 c4b1b171 c459096a 00000000 43954e00 431ed57a c4f32eda 00000000 42b6cc7d 43ed2f7d c340697a 00000000 434d0695 44070e17 43ec44b0 00000000 4394a4ec c3ec292d 44e56ede 00000000 433a589b c38d6173 4276e79a 00000000 427a8dc6 c34e4bfa c37e35d4 00000000 438a981d 42f6406b c3890472 00000000 432b34aa 440e2d00 c1cab197 00000000 42dc17f0 44845c86 44ebe6f5 00000000 42f21514 c404df24 44454d0f 00000000 43120a1a c4b2912a c334cb16 00000000 430b148f c41b638e c4db011d 00000000 434fa441 4430bc59 c438cd1c 00000000 43150701 44c301e5 43ee2072 00000000 4232cec2 43b205bd 45013f8b 00000000 41d8fcf2 c3a94091 437a9d05 00000000 428323e0 c488b91d c409c500 00000000 42c42b2c be55b12d c5142392 00000000 426c7608 448d059c c40e2b3e 00000000 43252655 44575f2d 441f6343 00000000 43658219 c3bba8a9 450864f1 00000000 428c80cf c48bb89b 43aaba5d 00000000 43538ae9 c3e772cb c3f1eb07 00000000 42d3cea3 43184707 c3d6bfdf 00000000 41f507ae 44c375d8 c3463066 00000000 42cc37b6 4485cde4 44c69b6a 00000000 43925cb4 c492ad86 4502c479 00000000 42993eba 00000080 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3ee4ec9d 3ef0a092 3ee39081 3f6c7d59", + "c49e0278 c43c3ff8 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3f3e3aca 3f810e03 3f3fb5de 3f1ab712", + "44441218 c4a77189 43020000 430f1342 4195a466 00000000 438c7aa7 43b46311 448c65f7 00000000 43754c6f c48b58b4 44823ad6 00000000 420e87c3 c4f4e8a1 c442bc3d 00000000 42e74c2a c3154849 c5155aaa 00000000 433dd4e0 44a0890b c430bb5c 00000000 42fc25c1 44f83a26 44b3c71d 00000000 4206b4b2 c3529bf0 448be367 00000000 42270ac8 c44db3a8 43564a36 00000000 433c00f2 c445f0fd c46d2059 00000000 432b099f 439cd5eb c4290208 00000000 42817e51 4413ee4c c0713e92 00000000 42bd334e 44654d63 44ef12bd 00000000 433be15d c4799ae5 449970f2 00000000 4393a85b c4254c2a c3233b6e 00000000 433e5454 c34f5bb1 c480af90 00000000 42a3db6e 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 00000000 42f00000 3d4ccccd 40400000 40800000 3f800000 -> 3ecdf1fb 3f01803c 3ecdf1fb 3cac8220", + "43540a07 c48d467d 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3f39263b 3f3d3dae 3f308ec6 3ee9973a", + "4331bf96 c302cd9e 429c0000 448893ed 42aacbb0 00000000 41c86c91 43be0cb6 4457cbcb 00000000 434541c8 c3131b04 433c4b79 00000000 42f52cbc c4983b27 c3519012 00000000 421ce820 c336ae18 c408b80f 00000000 431b82ca 44a3574a c4ad5fac 00000000 4290881c 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f253f12 3f26be50 3f1b10e5 3e44ffa4", + "c3c88386 c4ae8b7d 43290000 4393dcef 4249d606 00000000 42200000 42efed5f 43fcfc8d 00000000 42a00000 c414fba2 43db5ab6 00000000 42f00000 c44e8974 c3f47a9f 00000000 43200000 431c05e9 c4923478 00000000 43480000 44a8b2a8 c3ba2991 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401363df 402e91e8 4017b8fc 3f354648", + "4484977e c4962fc9 43360000 4465bb49 43291db2 00000000 429df56e 434003dd 4464cff2 00000000 439082cd c49c689e 4453fdef 00000000 42fe9a4a c3a90e98 c360a193 00000000 42a3a52d 43ee1d4e c514a7b5 00000000 427ee29a 450cb8de c3d9e4b2 00000000 422cfbc8 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e7c3758 3f0d9e03 3e7c3758 3f158e3a", + "c4481bb0 c48559ea 41d00000 450f644f 426ea864 00000000 4200bf8d 43459010 43ad0204 00000000 4348332c c2b19b7f 431fce9b 00000000 4295c78b c4c28632 426a1d92 00000000 4375f44f c44c9380 c49b5070 00000000 4350928d 43d9bb0a c4651809 00000000 4311d0ff 43c240f2 c21dc898 00000000 433cca34 4400ff4a 442b1c47 00000000 434fb60f c3225546 43cb342b 00000000 42c7a3d3 c3a4442c 425a8551 00000000 436de8a9 c34de433 c36fbf15 00000000 438dc471 443e5580 c5115344 00000000 43242e31 44ba62ef c3ad4892 00000000 42c0c0a0 4397672b 439b2720 00000000 438c4e1b c3e3b321 44dc5473 00000000 43844b70 c4aa02da 43cc6379 00000000 428bd112 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3e049d6d 3f02233d 3e049d6c 3f7290ee", + "43493566 c40be3ef 42820000 44f16a9a 42fb6d61 00000000 43935499 441e2e6f 44a7a70a 00000000 432dc90f c44e8a85 448f6070 00000000 4338a12b c4def7ff c35433a3 00000000 4371ff55 c3ec9381 c490f56d 00000000 432ac04e 4440fb84 c46fd05f 00000000 435b9c14 4466888d 43200381 00000000 435466ca 43c359d1 448cc03b 00000000 420cea0f c4cb4eb8 44e2b710 00000000 4219a268 c4be64ba c3ae7bb0 00000000 4205134e c4057b2b c4e798b5 00000000 420fe4da 44983039 c4987c17 00000000 4234e8b6 44d7469a 43f6563c 00000000 425a3374 43042817 440eedee 00000000 4354a4b1 c4c1ba9e 44ae686d 00000000 434de069 c42ad4ce c36b9cd6 00000000 43113017 c37f4bb2 c4b5cda2 00000000 439205da 442e8e0e c40d0712 00000000 43733f76 449a67c9 43fa97fd 00000000 4301bfd2 43080b02 448c9ce8 00000000 438bc683 c4e25342 44a3af91 00000000 431a60fb c4be3938 c43292db 00000000 4301dbe8 c2386c8d c42bec7e 00000000 4281f59a 43f584b1 c39e5227 00000000 431d81bf 443809c2 43c56590 00000000 42ae1371 4202e449 45171250 00000000 4394a1eb c4aabb93 44433563 00000000 432582b8 c4982ba5 c438c86f 00000000 435a289e 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000001c 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f1ef8ea 3f3302ba 3f1bf2d9 3f5eaf6f", + "c4b38b01 c480aaaa 435d0000 43925a10 428385f4 00000000 42200000 42859400 4400ec59 00000000 42a00000 c42436d2 43aa656e 00000000 42f00000 c430d7a4 c422415c 00000000 43200000 43e1bc38 c48846f7 00000000 43480000 44aed6f2 426fb0b3 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e9796a3 3f220bb9 3e9796a3 3f4a4ed7", + "c425d41c c4b26667 42d00000 43d7f73d 4234558b 00000000 42faf486 43a8d827 445e65fe 00000000 434c22e1 c46be30e 4480db9a 00000000 4336cdf9 c4c37cde c3dc2047 00000000 43531652 c2b7425a c3eb30de 00000000 42c5d0ba 4450a7e1 c421aaa2 00000000 42c718ca 44f00090 4464ce79 00000000 432c5668 424b42a0 451074f5 00000000 435b4926 c4603c39 43ee8162 00000000 43389673 c4b547fb c4801d76 00000000 42beca88 439b4188 c501ca67 00000000 420c665a 44837f44 c3ad5b36 00000000 4342e5cb 4462b7de 4462d2be 00000000 41dde2d6 c3dd9714 44a7d2ab 00000000 41aea092 c4ad234b 434e73de 00000000 4383e1de c4406678 c4884165 00000000 437fe17b 432ef6dd c3a45012 00000000 42a3e658 43173961 40594167 00000000 437b0577 4337993e 43c0cfcc 00000000 4349a717 c48822f5 44af89a2 00000000 42ff1c0e c4698e3f c3366ef7 00000000 438c6627 c382f045 c468fa8a 00000000 42bf2901 441b7788 c40e2aa7 00000000 41cda40f 44bf97c3 4411a8e1 00000000 42d042e0 4306eeba 44a2522b 00000000 43508d21 c4ab6abc 445be832 00000000 42fb916c c3a50a1f c343073b 00000000 41b58f95 42154737 c40b5055 00000000 422f98ba 4509f598 c46943cd 00000000 43607296 43bcd6b9 43a06037 00000000 4323a326 c22ac5b4 43308a5a 00000000 43440d49 c3d501a4 42c7109b 00000000 42c8f4d0 c49bb301 c4ba3d9f 00000000 432fa1e9 434a06a1 c3e9e421 00000000 43428866 44a903e9 c2a00a7e 00000000 423c1eb2 4439df8a 44a01d9b 00000000 436133a4 c498905b 44e9d59f 00000000 42d7ecc2 c50e82f2 c37ed395 00000000 43884094 c4194513 c4ce68f6 00000000 4277e956 4411b631 c41ce1d9 00000000 43184a0d 44768633 438eb008 00000000 42b24d13 43711c6c 44a0f783 00000000 438394d0 c40334b7 43c8452d 00000000 4268e46f c4ceb765 c448c9bb 00000000 42444afa c0221f21 c32c7a20 00000000 438d0a6d 44f1eeb8 c47cd14a 00000000 4305b6c8 44801c09 4437e48f 00000000 42900e22 c311d44e 4468390e 00000000 435f5531 c4edc12c 4418e1d6 00000000 422328b4 c465185b c4689205 00000000 4367034f 442b59ea c4fd52e7 00000000 41c8d57f 44f3669c c389dd3b 00000000 43059e5d 433f43bd 43899224 00000000 43889a4c c4179edd 448beb54 00000000 4375198c c3a449cb c11c6672 00000000 42c9f99e c3dcd421 c46c5681 00000000 4375f117 44297cae c4574737 00000000 4355da44 43c64505 42a0e334 00000000 43705f75 42d238b3 43c0672d 00000000 42c06be3 c32a915a 4319b4db 00000000 4344ad70 c4f42a13 c43db799 00000000 421ad3d4 c31266c6 c4bd8e61 00000000 43384688 4408fbf5 c3acecea 00000000 4286d1ff 441571df 43b38db2 00000000 4358e52a c332da7c 451670f3 00000000 42915b32 c3a9422e 430c3126 00000000 43410ad4 c49c9ae4 c486faf9 00000000 43313d44 43c10d72 c4c1632a 00000000 42f5fd2a 44957e07 c3871ce2 00000000 423e3eb1 449ae7bb 44bc0fe2 00000000 42e04dd1 c426c413 44bd432c 00000000 438adc01 c2f0a184 40c7ae3a 00000000 43637865 c42ddadd c4985009 00000000 4214a3cc 44ab31ad c501204e 00000000 4371a882 436fa3a3 41e46e22 00000000 4331a892 4403b417 44b56950 00000000 432536cb c2cbd432 42d84479 00000000 43840042 c50a9357 c424ce5c 00000000 436f37d9 c3462077 c489d2ec 00000000 4292ff10 43d231ba c39e014f 00000000 438c022c 44bb70c1 4439747a 00000000 436ff750 417a2fef 45043ac9 00000000 438900c8 c3eac639 4370fdb1 00000000 436d0659 c3c306e5 c38e2425 00000000 43817a60 422d5b18 c383c05b 00000000 43688b4c 444dd446 c3810c2c 00000000 41da7c9e 44631630 4469ec19 00000000 435ef800 c44943ec 4511460a 00000000 43898c2d c36dbcaf 41ff2e71 00000000 43814d66 c2e7ab0c c32940d0 00000000 4285895f 437ebd3c c3e709a2 00000000 4314085e 44cda6b4 4273d6af 00000000 430445c8 441d0916 44ab4f83 00000000 4339dda2 c46f84ba 4495da5b 00000000 436d4bdc c4c7f2b3 c3a85621 00000000 437f2566 c41778f5 c50eb8bc 00000000 42c3c1e4 44d7f03c c4bfc190 00000000 437fb7ee 44c77908 441e59c9 00000000 4382b2a9 41d06cbe 43921035 00000000 42418818 c49a07d0 443f50e5 00000000 436afd54 c4f1915d c49386f0 00000000 426a4016 43152573 c4e459cd 00000000 42cfe3c6 441f82f4 c381668b 00000000 4335265e 42d3aea9 42b9292d 00000000 42cd668a c40b08fe 45071304 00000000 41b8d4cc c4e09a94 43c41f41 00000000 43346cb1 c38eded5 c3b00d85 00000000 41b76058 4442c8a7 c4d8c295 00000000 4296f6b6 43db5327 c19c5741 00000000 430ee56b 43d4c32f 443d9948 00000000 43380ac2 c392cad8 43d9f8cc 00000000 42feb1b4 c4182d53 c29a1304 00000000 42a8af3d c42c200d c4f297a9 00000000 41f8f04a 4373866f c37ea37b 00000000 434cc1bb 43552126 428220c2 00000000 4257adf1 43b195cc 4500ee45 00000000 438ff7ad c41faa60 43ec6b14 00000000 42c28b0c c4246bdb c3a5ae03 00000000 41faa1a6 be2819e1 c4e9113a 00000000 42e8ec30 43d38b87 c3554401 00000000 41b88a53 4494d0e0 445c43d7 00000000 42d15896 c3bd10b0 45096a9e 00000000 4343efb7 c3b3fc50 42dbed8f 00000000 42f714cb c38f1f9a c3959902 00000000 43897974 42d571a4 c396813a 00000000 431927d6 44e2efed c3661afb 00000000 4347a765 4489d878 44cc9b0c 00000000 4392c2a1 c439890b 44a568f9 00000000 43252b63 00000080 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3f1578cf 3f50ea99 3f16ec8d 3f7290ee", + "c43fde68 44484478 42ea0000 44046dc1 42790b44 00000000 436af720 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 3f800000 -> 3ea5caa4 3f03188c 3eab27b9 3e8cb2fa", + "c483ea3d 449f53f6 00000000 43960000 00000000 00000000 42200000 438c7a85 43dac84f 00000000 42a00000 c399f96e 44283853 00000000 42f00000 c46d9924 430779a7 00000000 43200000 c440d32a c45f41ba 00000000 43480000 43c69044 c4a7cfcf 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f43ab94 3f44240d 3f411e4f 3f7979ad", + "c4b7988c 448c98a0 43360000 449e7c40 43695635 00000000 4337fab8 429a0a54 43b78f68 00000000 431109d0 c4ec0dc9 449ff86c 00000000 4294fb76 c498743e c44a9201 00000000 43352cfa 43503f89 c4820272 00000000 4291c84b 44005927 c2c6bbd2 00000000 42d70b12 446f16a7 44b67883 00000000 43651510 c3574593 439ca6c3 00000000 42b01207 c504577f c3e53b00 00000000 438f0852 c37414b2 c4abfbce 00000000 42a24a34 434a91e3 c3003ce6 00000000 42575fae 446f6994 442a1035 00000000 42ea8f98 c28b4ff9 4395885d 00000000 42b95a3a c3f52a87 429e38c9 00000000 42fd97cb c287f364 c2de5c0c 00000000 438b5e60 440e10f7 c44186e4 00000000 4317df80 4512b8ca 44126371 00000000 435c5c0c 41b28784 43198560 00000000 42e555bb c458a6ee 43ffb758 00000000 41f29eee c421c038 c3f55762 00000000 42c27001 44001984 c4f0b72a 00000000 434f317c 44730195 c2fbac00 00000000 4394d575 443bf4fb 44a51419 00000000 4391ee2f c3a85681 43d6e9ff 00000000 4395cb45 c4b749be c3cf6277 00000000 42a32aec c3846764 c511abf3 00000000 42e2712e 44d53e6e c46a0f3e 00000000 4371c528 44c8382f 44a1ef2f 00000000 42f9c992 c2f778ec 43ce5c9b 00000000 436ad0e6 c470069e 42bbdacb 00000000 4349cca8 c29f4661 c316a365 00000000 4290bc0e 4468858b c48b3e99 00000000 431958be 44f96881 441e133a 00000000 435977bb 42984bac 4467e5bc 00000000 4391c978 c4cca722 445046dc 00000000 436e03c0 c4ce20f1 c4b1a39a 00000000 437ac48c 440434af c4c5d06e 00000000 42bc471c 448d1c59 c295e717 00000000 43011c59 4451e0cb 44d671c4 00000000 4313b5be 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000027 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3ee5c490 3f3ef20d 3ee5c490 3f049224", + "44b72044 c4b1edac 41d00000 44def876 42398da5 00000000 4289abb0 448be7f8 44f508e2 00000000 434989e6 c38cffef 43fdbc94 00000000 433eea45 c4d753c2 42819385 00000000 43494520 c3be2a1c c4105f74 00000000 433c7373 4317a5a2 c39f8fb8 00000000 4386aafe 43f23ae8 c244c0ae 00000000 43861414 4470b8b9 449fa78f 00000000 42a0ea78 c38cdba4 44305265 00000000 4378198b c46a85a7 431bfd8d 00000000 424cf116 c48cee25 c4a41a86 00000000 43213981 4396d7d1 c466587c 00000000 430b9051 44c17c20 c3b3e204 00000000 4352e453 42b1842b 42b5e9b2 00000000 42b12a62 c3b946ac 44b34783 00000000 4382c2d4 c47d23b7 439829bd 00000000 436bafb6 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e8d672d 3ee7d8f6 3e9010e9 3f78b8a4", + "444f8885 c3ed131c 41d00000 4395f306 40f99267 00000000 42200000 4380eaca 43e1c9d0 00000000 42a00000 c3b3b8d0 4421b5ab 00000000 42f00000 c46fd498 4210524a 00000000 43200000 c422418e c4765e9d 00000000 43480000 441638ab c49e0fb4 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3f3f393d 3f414493 3f3639b6 3f6c7d59", + "43c9061d c4b347ad 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 405ea9f8 40a107d2 405ea9f8 3e4c1fc4", + "44b4d781 c42a30e0 42c362a8 439548e7 41ea16f6 00000000 42200000 433ea91b 43f1e490 00000000 42a00000 c3f49b3b 440ace2d 00000000 42f00000 c4689674 c36cbe3f 00000000 43200000 c38303c6 c48fd142 00000000 43480000 44862e84 c460ae13 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40c1cc31 40c3eff4 40c07f6f 3e736b1c", + "c421e6f1 44885f6d 42820000 44497fff 4251db0b 00000000 4383bfdf 44083e7e 449066d8 00000000 438217da c4a3b335 44e3464b 00000000 43924a87 c48eed71 c308068f 00000000 4384bfd4 c3afce77 c4577224 00000000 429691e1 44a0943c c4c78c0e 00000000 43181f12 4324732f 41e44a41 00000000 43252c7a 43fc113f 44b59d86 00000000 430cdd5c c335deef 434acf73 00000000 42fef7d8 c40eeff6 c302fe24 00000000 42e3bc52 c3939e8d c4801042 00000000 42ef8910 44c3ede6 c4c44f92 00000000 4312dd23 43d73bd0 42f649e5 00000000 4297a75e 431638d9 442277ac 00000000 423f902c c4e037d7 44c9db37 00000000 43508002 c495aa6c c3ce6bbd 00000000 4329915b c2992659 c3da1fe4 00000000 4367e866 444801db c421975d 00000000 426ea501 44dd4bd2 443393cd 00000000 435cf802 4391d7ea 4516be18 00000000 430b1a5e c435c284 44037464 00000000 433f1d28 c487e782 c3ff298b 00000000 4375ac5a c280d82f c470390c 00000000 433bc47b 4333e360 c2e7ffde 00000000 421319e8 44b867e5 4445ca89 00000000 435c74a5 41fda9a5 45126298 00000000 4345a60e c4adbb71 4446a355 00000000 438ed828 c480ebc4 c41c8cf9 00000000 438d6623 42c4c4ef c51a253a 00000000 41f3e93e 44ca3ed0 c44b6607 00000000 4355ecec 44c0fbe0 4483c3cf 00000000 42e5907a c3555dac 450e8c1f 00000000 43506bd7 c4cef82f 443526d5 00000000 42c3a5ea c430b46e c4070647 00000000 42bfcbcf 42731d76 c3cdaf5c 00000000 43141806 44c9ebec c4179929 00000000 42ee4ace 444fbb65 44311239 00000000 436da9a8 c1aaa74f 42d25d54 00000000 43719c05 c5065985 44299a17 00000000 42261a12 c36b432b c35f4a1e 00000000 432ccd34 42e8f8f0 c3e0d020 00000000 428ac03a 448d0594 c3916a9e 00000000 42b2eb41 44a0ffcf 44aa0a31 00000000 438138bc c42c48c6 4507e7a7 00000000 4294a30e c446736c 431ffeca 00000000 4311873e c398c543 c3b3a927 00000000 435cbdbe 421d5d53 c2d0d6a0 00000000 42c3b03f 44d89ef3 c37de97f 00000000 43951d98 44869339 44b08e69 00000000 437008b7 c303731a 4395b189 00000000 422b75b2 c43a5259 4289a2cd 00000000 436d6845 c4a3cbb8 c4f08464 00000000 4297148e 42ad99fc c32c19f1 00000000 433676e9 441d9936 c1c31cf6 00000000 4380b93f 44997228 44fd6a2c 00000000 434f7e01 c2c564c7 432c29ef 00000000 4389632e c513d4ac c20b7b29 00000000 4285a1a2 c424c79b c49a12ad 00000000 43310e5a 44988650 c4ebe84b 00000000 434e1fc2 45120441 431f75b7 00000000 43825ff9 43d0f032 445f4444 00000000 42672ece c4b317d6 44f700ea 00000000 435351b8 c44d0be5 c2c86255 00000000 4390725c c3afd9da c45974eb 00000000 42677b00 4345c21a c3742c0f 00000000 41b4fc57 439f4c41 426145cd 00000000 424d1d0a 444791cd 4511443e 00000000 41ba7aa7 c3ff0349 440d4a4a 00000000 42fa3a7b c4294db6 c31d66a7 00000000 42b16eef c3250b3b c410e4b7 00000000 4280d98e 448edfb8 c48e4127 00000000 42140ad3 44270967 43416a16 00000000 4343505d 436f5de7 448352ba 00000000 42b12c0a c4b623ce 44a2f0d4 00000000 437e892c c4dcae6c c419bd13 00000000 425e7630 c2653188 c3a64a16 00000000 41eb4016 44d105c4 c4a7caa2 00000000 42ab75fc 44d16161 442b71b7 00000000 42676e35 436c865e 44fb1a74 00000000 42b13798 c4e46374 44a4163a 00000000 4227b5e2 c413dbbc c38bf0a7 00000000 423041bc c2f4f1f3 c4efa498 00000000 438d1b05 449c2a53 c4480376 00000000 438c1a85 44ffd2a9 448a3bee 00000000 438c8089 41ba2b7e 450bfe2c 00000000 4284945a c43903b6 43d1ff33 00000000 4349cf07 c47e64c9 c41b8df5 00000000 436d1b60 41dfd7d7 c422822f 00000000 42d4b61b 44f93fde c478b4e1 00000000 42eb8e55 441d1046 43d7ee46 00000000 42109682 c253b1f4 4408ca15 00000000 4323423e c471fb9c 43d1fbcb 00000000 4390b01b c4e267ee c4ae2221 00000000 4212b0f4 42d815bc c432ebee 00000000 43655097 443fc509 c38e9989 00000000 426d2997 448c3ffa 4470a05a 00000000 41a6b669 c33d935f 4465f92b 00000000 4262d7e2 c50accca 442d4c80 00000000 432c71da c4151b0f c40e696d 00000000 42d68bce 425e83a3 c353f8d5 00000000 4319d5e6 4450c165 c354754e 00000000 437f6c46 44cb0814 44d7c9bf 00000000 43342688 c41cb332 44f48c73 00000000 4311e5aa c4b66f50 4390b140 00000000 422594c2 c2918f4c c2ac4652 00000000 4305249e 4377795f c422a892 00000000 43128992 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000006a 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3ef064aa 3f63a0e8 3ef07fcc 3eeeaa80", + "445e8946 c4b1bb4c 43500000 44a3f786 438a6c27 00000000 434f6e59 42a415df 440370e9 00000000 43453168 c4cebdce 446b6cb0 00000000 43397dac c422a0a7 c4065574 00000000 42cfcc63 438d4604 c44fd794 00000000 4380ad0c 44d9dc67 c2756579 00000000 41ae68ab 440f6db3 44aa9453 00000000 42cfc11c c4b673a9 44adae9d 00000000 43634a63 c4520a36 c3c97bf3 00000000 433263f1 432f9945 c501afa4 00000000 427579ad 4490eeef c3a5aeb9 00000000 431ac08c 43a19e02 43d88a7a 00000000 4363d343 c496ed0c 44ed1d60 00000000 4386df4e c3c0c074 c29f88c8 00000000 41ec0e48 c351ec72 c4a3e4e3 00000000 42ae7fbf 44021380 c3957dd7 00000000 4381e7ba 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3ef92fc8 3f09dfc3 3eeb39a2 3ec52248", + "c4650a60 44b45902 42820000 44a37ae7 42aa4258 00000000 4277fde2 43976d1e 44207e2f 00000000 42a8162e c3fde2c6 44303e14 00000000 43035788 c4d4f87e c34aafbb 00000000 427aa40f c340d9e2 c3ec5563 00000000 423d7a7a 445c6fa2 c488f702 00000000 427c1548 45058d32 43b96593 00000000 4349b61b 43eebf33 44ac0493 00000000 41efe7ca c4535411 446ba8d2 00000000 430e96ee c4e3df5b c3d0d489 00000000 438250ef c3a994d6 c4931dbb 00000000 42c28656 44afd5c7 c4b02d6f 00000000 422e19e5 44c46a5a 43e0c159 00000000 437bfc5b 4392b510 449eaa8a 00000000 42ca1e4a c4b443c2 44a24954 00000000 439484aa c4b6d87a c3fc2ed8 00000000 426b40e9 c32b4156 c473e94e 00000000 43804f54 449fd8c6 c48124ff 00000000 42d60b6e 441576fc 43729344 00000000 438fab35 430593a4 448a1056 00000000 431f5385 c3fd2ba7 43b719e8 00000000 4391ccf6 c4f5a8a4 c4669d27 00000000 4307e136 c2eccd8d c4dcc0a2 00000000 420d4acb 45029eb4 c4a87577 00000000 4381e1aa 44c97839 445817f1 00000000 431f2c1e 413d6596 445a98b0 00000000 4357da1f 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000001a 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3ee0bc02 3ef1b16d 3ee03130 3f70eff1", + "c49e0278 c43c3ff8 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3f3e3aca 3f810e03 3f3fb5de 3f1ab712", + "4494ae5a c3ae622d 42500000 447ff60f 425526e0 00000000 428db59c 4410d517 448fb30d 00000000 43059ac6 c4889614 44ce2089 00000000 41c5e1d6 c2e29697 c0f11bbb 00000000 42b68094 c45ef96b c4e5652f 00000000 4328b66c 429bfd2c c2e432ef 00000000 42ae65ac 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3e477043 3ecef949 3e4d82ac 3e736b1c", + "447a871e 43d94e3c 42ea0000 44b5fba1 432b1e18 00000000 42bf16b2 440c7567 44c893b4 00000000 43887f9c c495cf7a 44975ffd 00000000 41f05122 c454d40b c3901765 00000000 430827ea c397017d c5135f21 00000000 420ff14c 444c1f23 c4061480 00000000 438c364b 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 40000000 -> 3f35b480 3f65e6b0 3f385c60 3da8dc20", + "c42ae3cf 44b316e6 43500000 4502f685 43dd1ed7 00000000 4316746b 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 40800000 42f00000 3f800000 0e736390 8ea24260 40000000 -> 3f77ae67 3f932862 3f9119d5 3f7979ad", + "446c9845 44b6eabb 43430000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 3f800000 -> 3ec2ae0b 3ee17d4e 3eb72c6a 3e9d8638", + "4232d37b 4388bbee 00000000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3f451289 3f539c8f 3f41a411 3e90563c", + "c47aafda c49b4fe8 43360000 44c8cb0c 4393d026 00000000 43759b54 43eb82ff 450c527e 00000000 4360e2ac c476b571 442730ea 00000000 423dde04 c430f84a c3eb252d 00000000 4381e7b6 43c4ed9d c4f5e28a 00000000 42439814 44b77967 c38e0b93 00000000 43848529 43ac14b6 440354bd 00000000 430e9a08 c40223ec 443d676b 00000000 42dac677 c4bbf5af c3a2c88d 00000000 43908c53 c304d718 c43b33fc 00000000 42f1e78f 441f2c18 c3c98793 00000000 42ebb819 42f29ef0 42ac57a6 00000000 4317422b c2e28993 43f3281e 00000000 42dfabba c4b001b6 43632d68 00000000 43271e6a c3d1c979 c42b900b 00000000 42b98463 438f6750 c3c3593e 00000000 438d3272 44c24b8e 43c1da88 00000000 433b5c55 435a9811 44bbf930 00000000 43866db8 c391c8a1 432c11d7 00000000 422dc5ed c4894d63 c4504213 00000000 435375c4 43e27f7c c4d4cf27 00000000 43745df5 44947ac0 c319c63a 00000000 435b3255 442b042f 4496332f 00000000 434721de c418bbba 4442fdef 00000000 42cfca11 c4810cf8 c3920448 00000000 42f450ef c38bf2c5 c519f8df 00000000 42e8f610 448832e8 c4157e6b 00000000 4375753c 44c77add 44a15610 00000000 42ca0e50 c40e8245 44edab86 00000000 4310b649 c4b53d16 430dd860 00000000 425e4d6e c424a6dd c49bb93d 00000000 43705d7c 44688465 c48b3de9 00000000 43299f4f 450cca0f 443276f6 00000000 43485c1e 42648d04 442e013f 00000000 43423df4 c4ed7000 4471a458 00000000 4312b7f2 c3edb7b9 c3ccdcb0 00000000 43246247 43b2bf89 c485ba11 00000000 43399949 44d47b4a c2e1b869 00000000 4317e13e 447642e5 44fb9e85 00000000 42d4fe5e c4c2954b 44daca48 00000000 432774ca c50d4baf c446b9e4 00000000 42b5ac01 c19d4d36 c3c1cd92 00000000 438c0218 44286120 c39e5398 00000000 437865b4 445e2c31 444be42b 00000000 4379c60b c42ba4ae 44e86b40 00000000 42d12ea2 c3adf023 41434cb2 00000000 434b1e90 c40a3499 c4992537 00000000 43059762 43947c5a c39cd02c 00000000 4388c020 441caacf 43729479 00000000 438b3963 42176230 44f2ffea 00000000 4386a48a c46df4e6 43cddcc4 00000000 4365add5 c454697a c44f842d 00000000 438f64e0 43283b9f c3cf9d74 00000000 43193693 450fafe6 c10dc3a6 00000000 4385de8e 43241ce7 43c6217e 00000000 42e7d053 c43af710 44397e13 00000000 43196aa0 c498b1d6 c40150fa 00000000 41f6b9c8 40bf538b c3fe3eb2 00000000 42cbccf0 44c5a8e3 c41c8a45 00000000 43459e98 43ffd9b3 440507d3 00000000 425e7e4f c35a3248 43f6d5f8 00000000 430c0900 c503ea66 c2671815 00000000 432c643d c3a5da87 c45b5db3 00000000 43326fd3 44e40211 c4d48174 00000000 41d2b43c 4486d076 43f879e9 00000000 436995ce c1e25370 442473cc 00000000 4391ab9a c4a44a8f 43ecc5d8 00000000 42014f9a c38f0f32 c39e6194 00000000 429c787e 445a65cd c4e39363 00000000 4285a5f0 44f72981 42e7f5ef 00000000 4371f2c4 443716b1 45058a79 00000000 43355160 c4a3b772 448f4cee 00000000 430faac3 c4fe0daa c47da4a4 00000000 43438700 42036117 c3dce82d 00000000 431a4e3f 441e1e44 c34dce5b 00000000 4380696a 43d95e1c 44002658 00000000 433d1c95 c4411673 44ba1321 00000000 43478d7a c4dfb7ef c3212cbe 00000000 4390a4e9 c4285247 c5088669 00000000 4389429f 44959340 c475c945 00000000 43362a40 44895f7d 441409b4 00000000 43871b4c c2ef153e 448d3560 00000000 42f992c4 c3ae91d2 42cb57c3 00000000 430be5fc c4b6a4af c4e5834b 00000000 4316c568 448a3d31 c4f73c4c 00000000 4390b684 449f28a9 431ade32 00000000 431fedcc 440da9be 450116fe 00000000 43188334 c4000e13 43c55c18 00000000 433dfc41 c4cc31fd c46cc9cf 00000000 43030044 435eadaf c4ca6c59 00000000 435e3f51 4486f79b c38b1723 00000000 4324ee90 4494ae77 44c74d52 00000000 433e0d28 c42eef35 4491918f 00000000 4344097b c451bb01 c300bac6 00000000 4387e254 c354f01b c45cd7eb 00000000 4289b04b 4424dc12 c3ee0e38 00000000 4386b3a4 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000060 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3efe647f 3f95096d 3f076ca8 3f392f73", + "c3fc4625 c28c4726 42500000 44db7380 42b6bf86 00000000 43513fd8 44271629 44a5c78e 00000000 42c10224 c402cf3d 444568c5 00000000 4362d1af c4edf21d c2fd3192 00000000 428ef333 c3eebe5a c4759e5e 00000000 423ffcca 43aee94c c3ffe17d 00000000 4324028b 443a22b0 42713461 00000000 4385620e 434972e9 43d713cc 00000000 43908599 c34ccf16 43914584 00000000 437acff9 c5051dfb c34b6d59 00000000 431ab89e c31bc2a1 c3acbc0e 00000000 41f29eae 43725509 c3a6bbbe 00000000 435fdd1c 44d2ba9c 43398f60 00000000 433c92ab 446968a2 4506902d 00000000 4348f4a1 c39066f8 43c0cdfa 00000000 42a44a00 c4961f0a c315bb98 00000000 430e04ac c2c4326c c36b7531 00000000 42832bec 42d683d8 c30afd5e 00000000 43652aba 4511e98e 43a2a5a7 00000000 4323e75b 4383da31 4424e3b7 00000000 437004a5 c4ab3698 44d760e6 00000000 425f8332 c49c5cb2 c340b4aa 00000000 42acb282 c45696d1 c50bfeee 00000000 436f36e5 447beed3 c499db66 00000000 43530b6e 4354b5c3 420fa6e1 00000000 42eddb9b 44426d18 45048663 00000000 42db488b c441d490 4465e86c 00000000 43811806 c46d433f c32e54f0 00000000 434b1aac c3e92fda c4a6519e 00000000 4380ddf1 447f9bf4 c4933c2d 00000000 43664638 44f86600 43c55a39 00000000 4247cde0 424a451c 43173684 00000000 429342f7 c487bd82 4497e668 00000000 436ea301 c4902896 c376645d 00000000 424794b2 c42250d8 c4fed5ed 00000000 430694f2 42c9aa00 c2db3b0a 00000000 4339e6d0 44b2e34b 43a3b00e 00000000 4217b9a6 43e109f3 44b9e076 00000000 43945565 c4749191 448126df 00000000 438709da 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000027 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3e30462e 3e59b397 3e1701e0 3edcbc78", + "446550a5 c405144a 435d0000 43d794d9 42c1bd0b 00000000 4392ad20 429d968a 441818b2 00000000 4374ad67 c45f43a8 43e7ab5d 00000000 4298afae c36b5efe c357f4cb 00000000 4388ccf1 43fa3757 c4970e72 00000000 4393a89c 44f2d39b 42a67281 00000000 4243c59a 43738c28 4440120d 00000000 433be211 c3cfc93e 43a031a0 00000000 42e297e7 c48cf59a c4326958 00000000 437d1820 43adcd8b c4c785bd 00000000 42e2705c 444f36ae c2e1c94e 00000000 43660893 43f4a392 446804ec 00000000 42b131a1 c426b5c3 44381cde 00000000 4243140f c4c0f899 c41cdbb4 00000000 42283cf8 42858891 c4e62fd4 00000000 436b9fb2 44a87739 c3da809f 00000000 43227f06 43c09f12 43f67ac0 00000000 4383a828 c42a5f6b 44889646 00000000 437548c0 c422dfcc c309665a 00000000 42d26f8b c32e7f8d c498a246 00000000 429c7a37 450057d3 c4897cdc 00000000 43544cee 4341f2b8 432d4f06 00000000 422a74c6 c44353b2 44f4e64f 00000000 4385dcb2 c43325e0 c1aa1f6f 00000000 42cc6347 c3efc750 c4b4cf4b 00000000 432db0bf 446f01b2 c43d5347 00000000 4309fab4 44ffc625 449d31ae 00000000 43186438 c1dc2296 4306dc47 00000000 4301db28 c4b8ad94 435d0d91 00000000 4391a75e c4074ba9 c478a6ef 00000000 42c1e23e 446a39ba c484ce65 00000000 41bc539f 43f7437a 434173fc 00000000 43614e5d c1d322fe 448ed80f 00000000 42b95dc9 c5038e3f 44324f15 00000000 430b0c62 c35be089 c388edbc 00000000 42f88970 432cef72 c38ec9e9 00000000 429d9e68 446c9004 433a9a7e 00000000 430cae21 4325354c 448415c6 00000000 4341a016 c4be61eb 44526fe9 00000000 42d83da0 c44b7088 c43108fa 00000000 431c8462 443eb393 c4f88c8c 00000000 42f11b18 449e2044 41a73061 00000000 428b400f 4387883e 4443bef0 00000000 425e978d c489a462 4460040a 00000000 4364eec8 c4e69222 c4898fb3 00000000 4242e132 42ee50fa c41c7951 00000000 42bd6952 45079778 c3b0e8c3 00000000 42969816 444de4f8 44b76a3c 00000000 438a48bd c4568b8b 4479d753 00000000 42e2be8e c4c12382 c41147df 00000000 4335ba6c 3f806b9c c2c9cc10 00000000 437cec96 44026ac6 c338725e 00000000 42a3b4e8 443c40d9 446441a7 00000000 42b7a0b0 c2fa1512 4354c0ad 00000000 4327db15 c382741a c23f9560 00000000 4302c411 c396d344 c4de0006 00000000 42bcfee0 449d1de3 c43319ba 00000000 438df5a0 44577dfc 443699bb 00000000 42921637 c3ec160a 44a01d3d 00000000 41a54897 c48d65e2 c0740df7 00000000 42d4157a c419133a c4d406a9 00000000 426abe7e 448d3a07 c46c1682 00000000 41a4b273 43c5933d 4364c35d 00000000 437c93e5 c31db689 445f0783 00000000 42831dd6 c4f04023 43a9bbca 00000000 431c8ac6 c339cc97 c3a087b9 00000000 42ebf751 4488ac0b c4a37537 00000000 437c7513 4495389d 43d793a7 00000000 41befbbb 3fd09e74 43fe4827 00000000 42bc2b3d c4d80994 441f30bd 00000000 4204bf39 c32742f4 c34574ed 00000000 41d0d5df 4455ae03 c4bb610d 00000000 43142817 4480be8b 432f1cb7 00000000 43901588 43a1c658 44dc84cc 00000000 438c6e72 c4d18881 44763562 00000000 43179958 c4476504 c42481b4 00000000 43215ac1 443d30c4 c505b3bd 00000000 42e5c3aa 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000004d 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f83be0b 3f920973 3f82bec6 3f6c7d59", + "449dbfdc 44956b1b 435d0000 44e99fca 43d1f3fc 00000000 4336bd33 42c7f9c2 444101c7 00000000 42f10921 c4aa350b 44309d6a 00000000 4360aa2a c45bbfa2 c4499f53 00000000 4308459c 425f9451 c306f9c7 00000000 42bb0988 443ec5da 4202c444 00000000 42fe3cd0 434d1960 4421bfac 00000000 43549e58 c46ec761 4438167e 00000000 424fe08a c4a4ceb0 c4509885 00000000 4292de4f 42aa3511 c3c3650d 00000000 43052a2c 4481987b c30d361f 00000000 42d0e0a9 431cde99 4394c704 00000000 433e4182 c4447269 4458f432 00000000 42e0a0d3 c50b843a c462d07d 00000000 4342fe09 428a5a59 c4ee7ea5 00000000 4393aee5 4405839a c32d2b6e 00000000 42458e2c 43786b1a 439ef058 00000000 4285eaa2 c3c2f057 441c4812 00000000 423ba672 c3fe6891 c2d69e1b 00000000 41ed9c17 c30874e6 c46eb7b8 00000000 439275a2 4488f865 c412bacb 00000000 42edc2b9 445c5397 4444e145 00000000 425dc953 c36ff744 44166f10 00000000 4325f2a8 c3a73398 c11ec739 00000000 428cc601 c3a74e1e c47c51c9 00000000 427350e7 4491cc44 c466fba6 00000000 4385688a 44896180 4428dd13 00000000 43249f1d c382f126 44a06fd8 00000000 43136112 c49b95b4 433a3ab9 00000000 4350e64d c488dd28 c4fb88d2 00000000 42bdf98f 44a0c6df c4b6524a 00000000 437c83d2 44c46e45 4419aec3 00000000 41f01678 c0c68cee 4386542e 00000000 42881b63 c4293b0e 43655f8b 00000000 42223d1c c42e6725 c459381a 00000000 42f43e68 44986b6d c4fbb2e2 00000000 4334aab9 45005e15 43ca840b 00000000 42784cd6 43b3b87f 450fb019 00000000 41fc34b4 c4ea53b2 4481815d 00000000 439210ac c43ec367 c4260109 00000000 438b7bf8 436b3841 c4194927 00000000 436f10b9 441f230e 41284200 00000000 433e3ee2 43af65f3 447d52cb 00000000 42d6089a c4976e8d 44767579 00000000 433ec76a c4b5b0d3 c458cc37 00000000 4376e842 43930326 c4c10d06 00000000 432019fb 43c19590 c27c92c3 00000000 4237845b 4391854d 4401a202 00000000 4348d737 c48f567b 44a6eb4c 00000000 430835f1 c35c0cbe c2a58604 00000000 420f6f4c 40ea421b c4380de7 00000000 41d66fab 44e1fdcd c41fced8 00000000 41f21ac2 43bd975e 43e5e0f5 00000000 41aa1e3b c2e11c72 433f8247 00000000 42e9853b c4b9fa1d c3889002 00000000 4315a249 c381c53e c4bf026f 00000000 4323082b 442f69f8 c3c7f534 00000000 43945105 430deeaf 42f0897e 00000000 439412db c40692f6 44b68977 00000000 420bce78 c4c9b00d c0ae0ec3 00000000 4368ab15 c3f62a05 c4aa7b7a 00000000 4348f07a 444fdddc c42dbeac 00000000 433f6cc1 44cde293 446e6282 00000000 430edddf c34e446e 4491d89a 00000000 4362b033 c5119f47 43cdc28d 00000000 42c5efd7 c3eb1350 c44b1ad2 00000000 430e01a2 44b8364a c4dc50aa 00000000 42dcf854 44c5ebda 440ef769 00000000 429c4a70 3f0357a4 4320173e 00000000 4290b048 c4796f0a 43b7cc8a 00000000 43042b82 c3e9e3e9 c40a0e8f 00000000 42bb9635 4295ba3f c3034c64 00000000 4298544e 4412a2aa 42c77263 00000000 4242dfb4 42d6094f 4411e0fb 00000000 4265de02 c34b4bd0 42eee137 00000000 42a31e3a c3156c23 c2f68e61 00000000 4346bb3f 44254c5f c4e9a27d 00000000 42ce2fbc 44a0bbde c1493b96 00000000 43414a4d 440a8591 44b83e7a 00000000 427284f0 c414de34 43ff966f 00000000 436afe81 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000050 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3f1fd947 3f239737 3f15df66 3eb1de38", + "438ed69f 44b0e173 429c0000 445d3db9 428a55c9 00000000 437be462 44727eed 4509ac71 00000000 43099032 c4801ec1 44a3fe59 00000000 42a8d006 c4a00a9d c35c508d 00000000 42cf69bf c3fd6e0b c4bdab29 00000000 429d315e 44383000 c443802d 00000000 4349a72f 441f4f1a 432b70c4 00000000 42da335b 43c5d968 44d343f9 00000000 435ecf45 c4001665 43e1f1f6 00000000 435b1c7b c4c2eb55 c4109d0d 00000000 43414689 c38f49db c5015e8c 00000000 41fb96e1 4499dc47 c46089e3 00000000 438530c0 44ff1aad 4474f7fc 00000000 43456401 42c0d71f 450554ca 00000000 438e9a74 c4e8d8c4 448aee6c 00000000 435c1f62 c3847a05 c31ed572 00000000 41f4b744 4278e337 c4a484b4 00000000 42aaf30b 44e55e86 c45b165a 00000000 42a7e634 441156da 43d5073a 00000000 43415eb0 c3abb449 4518b1bb 00000000 432f3a69 c4ec1b2b 442e0eb9 00000000 42954df3 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000015 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 40000000 -> 3f0c23b7 3f3ad29a 3f0d744a 3c91bc80", + "43c4af30 4404cf03 42d00000 437b47d3 41d1d28c 00000000 4304ae14 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3e98ad95 3ec78234 3eadd77c 3ed720c2", + "425b05a4 c4b4914f 43770000 44766e5b 43788c96 00000000 432eb1ac 42b03383 448f1e21 00000000 43896cd4 c3b51987 4319637a 00000000 42f62e29 c39197ee c3a489ae 00000000 4395ec57 4425feb8 c4901597 00000000 4312e59c 449533d4 43707c65 00000000 4342aa5b 43654f92 44e42638 00000000 423c9337 c4e95e79 4460c1da 00000000 43457957 c3145bbc c3183681 00000000 42914f52 4348148b c3c2cd6f 00000000 42bc6db4 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000000a 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 40000000 -> 3f274288 3f87256d 3f275c16 3f7b69a3", + "c4b9eef1 c4bb2ea8 435d0000 43925a10 428385f4 00000000 42200000 42859400 4400ec59 00000000 42a00000 c42436d2 43aa656e 00000000 42f00000 c430d7a4 c422415c 00000000 43200000 43e1bc38 c48846f7 00000000 43480000 44aed6f2 426fb0b3 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401a409a 401f7a81 401957dd 3e191f94", + "444248ad c42ce00f 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f2166bc 3f354e75 3f2166bc 3d4ae2a0", + "44b908f3 c471f6dd 43290000 43a8ac7f 42663e41 00000000 43917e84 42ed22c2 43fa0b0a 00000000 42b0ff3d c4c14996 448e4afd 00000000 422dde6e c4279c12 c3c6668a 00000000 42f7b855 432a596c c49fa131 00000000 4329d3a0 44dcc1a8 c3f39c3e 00000000 428ba28f 43bcd25b 43eddad0 00000000 430f24aa c44e27d2 44bd930d 00000000 4309a3d7 c3ea806a c23512a3 00000000 4322787e c34ba997 c421677d 00000000 42048a82 44dff185 c4bf76d4 00000000 42b5cae0 45011550 44806ebd 00000000 436b0f1e c21fa597 44268ff4 00000000 42b4f833 c429fcc7 437206b1 00000000 430e8795 c4b49828 c4c44bed 00000000 433eee1b 446b2207 c501ccf3 00000000 43953339 44966443 41e1b3e7 00000000 42c970ee 43fa3eb2 449d62a4 00000000 4367f54f c4ce052a 44cbde44 00000000 433595a0 c4fe985d c4509f5c 00000000 4390d4fe c1eb4fb0 c50e0131 00000000 436b9216 44ded490 c4443713 00000000 4331e415 44cc2a88 44bfd4d9 00000000 426ab2f6 c4524cfc 450eefce 00000000 429e5767 c2e95117 40b8509c 00000000 4240a9b2 c3daab57 c461b05b 00000000 43370f33 43fc3fdf c4106c18 00000000 438e8318 441ee144 434fd6c3 00000000 4380ae7b 4193eceb 43572d49 00000000 43053c32 c2d37c41 426042fd 00000000 4321dcdf c4c9de8e c4a3bd09 00000000 438058e2 43bb36d2 c4a2f507 00000000 4385daf6 44c70dab c3436d54 00000000 435fab6d 4464106c 44c55e8b 00000000 438b3cb0 c4ace947 44e5c915 00000000 438ae336 c49c74db c39b5666 00000000 4335b85e c37fb705 c4c7f91f 00000000 42c34cdd 43ba7f90 c36a0106 00000000 42878242 448133c3 44341ae6 00000000 42ef22a3 c3e233dc 4506b349 00000000 423e1ba5 c43c35c6 43149b41 00000000 4205765c c41f3923 c46a6612 00000000 43651e65 43b3435a c40b20e8 00000000 42de8394 44e01dca 439a5ce3 00000000 4323b69b 424cb1cb 43594dda 00000000 43510b00 c4b57ae9 44852d09 00000000 43259d4e c49d7c26 c43b0fe9 00000000 42f68700 426713f0 c3d60f16 00000000 4212f234 4426b106 c336dc71 00000000 4385ee74 44b63631 44e63ec6 00000000 42844564 c404aeb9 44732463 00000000 42089ac9 c448ae53 c29d6bae 00000000 4230bd66 c3e84c07 c4b91373 00000000 4373a48f 44e22eba c4c0c913 00000000 41a14e0b 44e32a0e 4462e191 00000000 421a5945 c26f0b6d 44733315 00000000 4355f651 c4a13bf3 43e47583 00000000 43896287 c3db3514 c3eefea7 00000000 436d90ba 43e2b233 c4794768 00000000 436d74f5 44cf96cf 4225d8c3 00000000 42d081b0 423a15c7 42eb1ad1 00000000 429abbc4 c4c31336 44c0742b 00000000 42af636c c40cb923 c3679ff0 00000000 43929685 bfb0bbed c2f1af0b 00000000 42bc293e 43c68a63 c32e1b8b 00000000 422bdf0d 44d2db5e 44c6b87b 00000000 433b75b5 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000042 43820000 3f333333 40800000 42f00000 3f800000 0e736390 8ea24260 40000000 -> 3f382559 3fc2861f 3f3be197 3e7f9a7c", + "c4a0e71a 44846b18 43770000 43917292 4292b29b 00000000 42200000 421f9458 44019de9 00000000 42a00000 c42a5a82 43904969 00000000 42f00000 c41f0af1 c433bcb0 00000000 43200000 44133f63 c47f9f80 00000000 43480000 44ab8d80 438a4153 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e85acf1 3ed696e9 3e87667d 3e549b04", + "c3b898ea 4421d97c 42500000 44e0c29d 42bb2b53 00000000 4393e559 43be4d67 443cd04e 00000000 41c3bae4 c4ab36f2 45013169 00000000 434c8499 c3d9c717 c1e7bbb1 00000000 42f255e4 c4341a38 c4b949ef 00000000 431789c8 43bb28e3 c408e64c 00000000 4346209b 43e9bf2c 42177371 00000000 42a074be 4360609f 43ef8e9c 00000000 420af522 c49e57e3 44e0a06e 00000000 4344330a c4f86178 c33dc912 00000000 4353a276 c45ec159 c4f707ce 00000000 435e5a1c 4381bce2 c3b28759 00000000 436a94a3 443c6168 42a5e17f 00000000 4378dce6 4382718e 441667a5 00000000 41a25c0e c2bc0f88 42fb18d5 00000000 421ef5fd c4c95930 c348d3cf 00000000 42a0703e c45ed264 c505b48c 00000000 42cd5156 444535b2 c47f8ded 00000000 438626d4 4510829b 43a11589 00000000 4295c2c6 44647bba 450eddc6 00000000 42ebd43a c377f3a7 439bf4bf 00000000 436dbfd1 c48debf0 c32ee8a9 00000000 4313389c c3adeadf c462ec90 00000000 436f0f45 4463b14a c48b0da3 00000000 4315b449 4355fdc9 42108468 00000000 43583150 43d358d5 44900efe 00000000 43238b46 c484dc3c 449d96ec 00000000 4355e840 c5042b6a c3c23a01 00000000 4394054f c42f8649 c4fa6215 00000000 432c6c04 449a1066 c4b17ca0 00000000 42898a6b 448a0857 435b5569 00000000 426bdc9b 43905975 4457d352 00000000 4334df19 c4af433b 44c420a2 00000000 41cc005f c4dd2b28 c3bd0200 00000000 4382326e c40a7441 c4d95f73 00000000 42cb815e 4384a362 c390312b 00000000 4351f537 44c8df36 43b7cdc4 00000000 430f4bbc 43d12d31 44acc65f 00000000 422dfcb9 c4070bbc 440ea14c 00000000 43549b51 c4819956 c37cf2c0 00000000 431db72c c347ba57 c42df874 00000000 436b221d 44d01d43 c4d58d8a 00000000 42dce1a3 44ba8a04 43c1788f 00000000 4258ad7b 43c03327 44b0fdfa 00000000 42a99bc6 c44d16a6 444c787c 00000000 4322ee8a c3466a36 c25a0950 00000000 4300450a c3939ff6 c4901fbd 00000000 4376c5ba 44cfb572 c4c93368 00000000 4393ed68 448ac96b 43a12642 00000000 4382be09 43b9a959 44c0c5cc 00000000 42e87afd c3436fab 4337edd4 00000000 4357abeb c4e184ca c40a00d5 00000000 4367e64f c3a3eba3 c4b5a969 00000000 437196a4 44c948c2 c4b809a2 00000000 429ad616 43c6ec4f 430006a8 00000000 436bae53 43b75cd8 44d9c6cb 00000000 427d6dd3 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000038 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3f5b4033 3f6adcb9 3f571065 3eaec3cc", + "43c9061d c4b347ad 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 405ea9f8 40a107d2 405ea9f8 3e4c1fc4", + "c3160ded c266edfb 43290000 4487cd17 43395f0f 00000000 429ca55b 4320544e 44290e5b 00000000 4361c72f c4007361 43bd1faf 00000000 437de261 c4908288 c42b0ea5 00000000 4334f5af 43598b00 c4cbda82 00000000 430a82e0 437f2107 c28cc549 00000000 42126668 442cdace 4459bdce 00000000 43312035 c2964514 430a2f01 00000000 42957c6a c4ea957d c33522e8 00000000 43769b00 c355e4e8 c4298353 00000000 42f42c9c 438045c8 c35b5669 00000000 434fccd6 44e4d6c8 4463af7b 00000000 43867db6 c224be7e 442be161 00000000 429a6d73 c5047726 443c9a4e 00000000 42bb5fab c4aa9e35 c4b973ea 00000000 430b1f00 4466433c c4fe395c 00000000 4388deda 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3edd9367 3f7f7271 3edd9367 3ec1141a", + "4349a445 c4af713a 430f0000 44d85d68 437938f8 00000000 43302210 42e2b0fd 43c195bb 00000000 42c31198 c368470a 4348b2dc 00000000 422bed45 c4ed2abf c459c601 00000000 42edb1c3 4087be1f c4cb1139 00000000 4394ca37 442abc7d c39a9efd 00000000 428424e9 446209bb 444560dd 00000000 422fa198 c3915053 4473761f 00000000 43651cdc c482a588 4310eb96 00000000 42f0dcc0 c42ad378 c486903c 00000000 41cc702f 44a0b0e9 c4f6a64b 00000000 42b6bff7 44f2b738 43925cf8 00000000 42a2525c 43bde7e0 44a6404e 00000000 4282f048 c3bd3ab5 43a15310 00000000 437d0a25 c42ecbca c3a3514d 00000000 431c8ea7 4181360c c4da7add 00000000 4387f6ea 441b8ed1 c38a65b6 00000000 42a48ed0 44a197d1 448f00e0 00000000 432b9412 c3cd8ac1 44a81bdc 00000000 43295a13 c4fb3805 43848c54 00000000 4283699c c404ecd7 c4548455 00000000 432bf3c3 445d8997 c4a7952b 00000000 4375f3be 43e8ccae 4292b413 00000000 435ebc29 439d84f2 448d7161 00000000 43765666 c3e4ebc5 43c08e82 00000000 4329a55d c3c2eb4c c3394706 00000000 42783885 4171737c c46db4b4 00000000 432d43df 43939a9d c300fbc1 00000000 430cfb3f 44b7c0a6 44a4cc78 00000000 43891e7c c40c7864 44e07144 00000000 438b56bc c50e9dac 438ecec7 00000000 43956e9d c3109105 c36a92c8 00000000 4275398d 43e77fff c42c9e95 00000000 42f7bcde 450eb417 43bb9e8f 00000000 42ac3052 438d350c 44822111 00000000 437f5260 c3e18202 43bb25d9 00000000 43830ade c4a15894 c41bfeeb 00000000 42dec484 42140a6e c4cd9141 00000000 430321f9 44b8570e c41e2ed0 00000000 4391bce3 433b253d 432a1825 00000000 4376f81a c40a6435 44d815fa 00000000 42f008d3 c4c6837b 433c17db 00000000 4364b89f c3f3a2f6 c448a0f6 00000000 432a3392 4446093b c4919265 00000000 4356853d 43cae1a3 428ae6ea 00000000 42b17fa7 43f5cab7 44e8993b 00000000 434629ba c4c15081 449e4719 00000000 4385142c c41b46e3 c398ace0 00000000 42fce43f 420eee73 c4994c46 00000000 431a8468 449660b0 c3fd5e9a 00000000 436f744d 44ba13d9 44ab63aa 00000000 429e8bf5 c3a530e3 447c294c 00000000 42f59ed0 c45ec25c 42c7179a 00000000 42c135b1 c443ef9b c4a3c917 00000000 41df24a7 44a10d06 c4e96d11 00000000 4356c915 44fa19ea 43b21028 00000000 43773ac7 44045cab 4500b51a 00000000 438c6e37 c3ea2f70 43bd299b 00000000 43309c19 c45d9e14 c3dd9057 00000000 42df848b 42901840 c4fbbcd4 00000000 436b1f2a 44f07d20 c446db00 00000000 42a78837 4381b519 43722290 00000000 4282dafe c2b9ba17 438aa3cc 00000000 43328c70 c3895f78 41e6d149 00000000 43517038 c313cfdc c37ae018 00000000 42bb9919 44a6ac9e c4ee2e9b 00000000 42742322 44962644 435e0799 00000000 42c4c447 41ebfd5f 42ebf281 00000000 4320d406 c4ea38f0 44baa35b 00000000 42b831ed c4737a34 c3f77860 00000000 42250ce4 42c81007 c513686f 00000000 4324c269 44e77ee3 c43bd607 00000000 430d9344 44522456 4446c502 00000000 438ed25f c421fdc2 44ec9fd3 00000000 4382548e c4d474b1 43271b2a 00000000 43547833 c27398a0 c2d1e51e 00000000 426eda60 447b7175 c4b12608 00000000 436181d8 45134465 43e1da36 00000000 4334aeb4 42a6cf3c 43ab9ab4 00000000 42ad7727 c41b09d1 43f3bd5a 00000000 436a62c3 c400e7fa c3852d67 00000000 438a82ac 42e8dedd c51459e2 00000000 434738a7 44e1c46a c433b54f 00000000 434c6547 4427265b 4420375b 00000000 43320463 c43effab 450889b9 00000000 4359bf72 c4c0801d 430d199e 00000000 424f6f94 c48e469d c4f8f886 00000000 435e2d19 44981dc2 c4d35bae 00000000 42d4ea10 448cc030 435f9af8 00000000 4350288a 43d26fbb 44deebbe 00000000 4263386c c4c16ef8 4495fcc8 00000000 429fce2f c2cd4379 c2578600 00000000 4301d5c4 421e3c83 c4318800 00000000 436ff284 448d5a04 c3dcb304 00000000 436156eb 441c7f3b 44180216 00000000 430dd696 c3b13eea 44781f9a 00000000 435d1fc4 c517472f 434d9a55 00000000 434966ab c486f94f c4efde93 00000000 41d5c53c 4457cf6b c493da2d 00000000 42791d92 44cfec7d 43aae769 00000000 436eec7e 43ad18ad 44bcf57a 00000000 42a77da2 c4e92cbe 44b2573e 00000000 4390eab7 c385cb2d c30ec101 00000000 438750b0 4220e874 c4214668 00000000 4390737f 4504fbb3 c44b94c9 00000000 4349c7d5 4398f8b5 439691b4 00000000 430d61a0 c3e57b3d 449d5209 00000000 427e39cc c51a7dd9 43417aa8 00000000 439411c7 c48a8b39 c4fa13d5 00000000 432fc0da 44186d44 c44df8e2 00000000 439396bb 440a90bc 42eb74d3 00000000 433f0b18 4313c89a 442662ee 00000000 431c808d c427dca9 43fd43f1 00000000 4385d07f c3c3225c c3538976 00000000 42bd245c 4312bd1e c504dfc7 00000000 4374a881 44dba539 c424cbbd 00000000 42c7f95a 42a25580 42a1eab0 00000000 438d979e c3ee01db 449fde8b 00000000 432d0a6a c43ec282 425a8eef 00000000 420017ae c3c8a6b6 c437f5fd 00000000 42f15bd4 4457e6e4 c48fddcd 00000000 43210db5 44fe2f2c 43df0350 00000000 43505d72 432b649a 44473460 00000000 4390f41d c3ea61d3 43ae63aa 00000000 43782df5 c4b774ea c44a090c 00000000 43868a82 41dfae50 c3b8b78f 00000000 41bb5781 44e34eca c4271dc6 00000000 435345d5 4484bd5c 44862a46 00000000 43951bd2 00000080 43820000 3f333333 40800000 42f00000 3f800000 40400000 40800000 40000000 -> 40210c19 403f9fd8 4023b5be 3f72a230", + "c490b6b2 c494082f 42d00000 450dd0e1 436cd611 00000000 438136fb 43c7c336 44838fc7 00000000 4335709d c487c472 449454c4 00000000 43108f1b c4d8cfd8 c3f42346 00000000 4383920a c3053ea1 c42b00d9 00000000 41d9db9e 445d4a0e c42b747a 00000000 435562df 44dfe5ce 44557409 00000000 433381aa 41432cb0 440ab5db 00000000 42e91ab8 c4bfd6d9 444c0c39 00000000 42dfe30e c49fa0ac c4619fcb 00000000 438fefc0 4381c6f0 c4d8fb50 00000000 435fde4d 44a00d6a c3d30062 00000000 42dcded5 44273158 4427452a 00000000 432953bc c3e2cf67 44abc6bf 00000000 437bc3b5 c47f0071 431808c4 00000000 42481f8a c460bceb c49f2817 00000000 433b0934 43f33f91 c4647093 00000000 435dbe0c 44f1960e 422d896e 00000000 4310fdfd 441522c1 449c9e97 00000000 43430f4d c3a7a845 43d82e65 00000000 429e7c14 c402cc80 c2cc5663 00000000 42b0d524 c402b1ff c4e88bbd 00000000 43632292 4404c8a3 c3f2d916 00000000 43878c85 440c5116 43555a7a 00000000 43085e0c 42958b20 4433e5c9 00000000 42d5a4f4 c48d405c 44353555 00000000 430a905b c44b0fc4 c3eff589 00000000 428025ee 4292a9ee c488dfb9 00000000 428d4094 444e3642 c3ae557e 00000000 4244f3d6 43f30e86 43ce6bf8 00000000 423abd62 c4027c58 4506e4a3 00000000 4385655d c4987df9 438e82e3 00000000 426e6a91 c430ecc0 c453a13c 00000000 437bef7e 43a308b0 c43cbfc0 00000000 42185b46 44fdcf09 c2f05505 00000000 4364169e 44800071 44dc870c 00000000 42104722 c370f089 43b8a4d5 00000000 43038700 c4f3daa3 c35a04e7 00000000 4310af48 c4522497 c50d8034 00000000 436e7c12 432dd526 c33b28b1 00000000 43139a48 44533519 43747e21 00000000 427332a7 4386a1d6 44b3c31b 00000000 42274e6e c496883c 4465c4fa 00000000 428f375a c41ac978 c396590f 00000000 42aa108b c1437026 c44febef 00000000 43373e91 43a68f1c c32e0d89 00000000 430cfee4 4457d8d9 441aeacb 00000000 4235ee24 c3099cb9 445b233f 00000000 42cf77b9 c4e61a98 4413f66c 00000000 43422dc5 c418ff2e c41b5154 00000000 430c5da6 43f5119a c4b5274e 00000000 42712fd4 44c17f08 c35b3215 00000000 4324a632 443a1f28 4485df2a 00000000 4314e394 c3b8ad13 442a6c78 00000000 438f6fc4 c47d9688 c1f1698e 00000000 4391d787 c382fc73 c40c2f82 00000000 432e533e 42f1788d c3195aeb 00000000 436b2303 44eeca39 43c1c4a0 00000000 436297bc 4360929e 444d89b1 00000000 4304aa64 c4844862 446e6981 00000000 42aae77f c4aebd8c c407c63c 00000000 421cfd75 c338d163 c4ef4bef 00000000 42a4c87c 44a9f2d5 c45689f1 00000000 42faa53a 44b37a82 4457a35d 00000000 42092c72 c19f42ec 4385f625 00000000 43199d0e c4c861e2 4425f892 00000000 42e7d03e c4635d49 c443f80f 00000000 4345c4a1 4402fd6f c5033798 00000000 428d4a00 44a906b1 c398c48b 00000000 420982ce 446baddb 448f100a 00000000 4260bbc9 c4648080 4501a9cc 00000000 42cb864b c505bbe4 42ddf351 00000000 42e36153 c3f2f56e c454da93 00000000 4331db6e 440febf7 c4591c73 00000000 43452eff 4457c571 42cdadbd 00000000 433941e7 44524f61 4510d7cb 00000000 42f2845e c33816fd 434352e5 00000000 42327d9e c4ff7282 c417e66b 00000000 4327920a c334c5cd c47b80e7 00000000 430056ff 44df0675 c4a7a679 00000000 425cb96e 44e36a39 4461018d 00000000 42a8fd31 4183305c 450aac32 00000000 43888e80 c4308411 43b5309e 00000000 43845124 c38229c4 c33dbbb5 00000000 4305560c 43b906a6 c50c9eea 00000000 43391963 440b6f01 c32ed6fc 00000000 42bac642 44b55b90 44bad117 00000000 430a592c c3924ae8 4453303c 00000000 42cb1357 c41a3544 42a585fb 00000000 430b0672 c49819ac c4de3e85 00000000 4218320d 44948210 c506b0c5 00000000 41d48642 44e781b9 42893f65 00000000 431a6b74 44054f74 44916dc3 00000000 42db010c c3eb4126 44132f6b 00000000 42f79309 c4f3a100 c3cd1c85 00000000 42e26dad c400feb0 c4f315cc 00000000 4276e9b7 43b7a04e c3a30ffc 00000000 43122448 444c915c 43a26539 00000000 4350535f 42c03b33 4486b707 00000000 438e989d c331e9b8 42dcfac4 00000000 431e11e4 c483509e c42063ca 00000000 43944716 43159b96 c4e50ead 00000000 4360a3c2 446f1488 c3c1f2f5 00000000 435e94e8 44824ec8 4463f699 00000000 43494c7a c3eee09e 44e8127f 00000000 432f8729 c44dc94c 4333b0d9 00000000 43904735 c45879f4 c4856087 00000000 437ab1bc 43349f15 c3c8fff6 00000000 436e9305 44a24654 c267590f 00000000 4304c6b7 44054ed8 446d96d6 00000000 4391b5e9 c457810a 44a0003c 00000000 435e20cd c4c3e6f0 c3465830 00000000 4335234b c4277003 c4ebfc55 00000000 420b2f86 43698770 c3742fb3 00000000 42fa66f2 439fbe21 42c3107e 00000000 434c4e68 43bc135f 45088c0e 00000000 42bf7fd6 c44b17ed 44165c78 00000000 42f33c5e c4aa1a1c c42b6766 00000000 4395701e bd937246 c44c6e1e 00000000 4395f51a 438ef3ea c3101d91 00000000 436b101c 44c729c5 44936475 00000000 4342f5fd c385448e 44c1b93a 00000000 42aa5948 c3159f8f 4236d3e1 00000000 437e81bd c488d5b2 c48f0647 00000000 42e5e16d 438c6eee c4460bd9 00000000 432c7820 43ff531e c28171d0 00000000 41ae521c 44413b82 448f6893 00000000 422561fa c488faaf 44f43de8 00000000 4365d051 00000080 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 3f800000 -> 3f3bdf03 3f8961ec 3f3c31d6 3f73cfb8", + "44949855 c4112339 43430000 4393283b 42688515 00000000 42200000 42bb016a 43ffc320 00000000 42a00000 c41d137d 43c37837 00000000 42f00000 c440bb23 c40f0528 00000000 43200000 43992a6a c48e716b 00000000 43480000 44ade158 c31e1f07 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e58e6ce 3f43f6e4 3e58e6ce 3e276124", + "44020fe6 c4acee1e 429c0000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 3f800000 -> 3e75ae66 3e8ead42 3e5bb9a0 3e4c1fc4", + "c40db9a2 43d8758d 421c0000 4407f8a5 41a9c73a 00000000 4392b4e9 432a4e5f 439e937b 00000000 42feeb36 c43904b2 44982e04 00000000 438fc3c1 c48ee651 c183c590 00000000 4368cff7 c3013412 c36307fd 00000000 432ed5e7 441d95a2 c48919cb 00000000 43849737 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3f3e0313 3f47d6af 3f379cfd 3f30e753", + "c4a450b4 44403062 429c0000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3e0ce915 3e33478c 3e0c3c1c 3f4df960", + "c4b9eef1 c4bb2ea8 435d0000 43925a10 428385f4 00000000 42200000 42859400 4400ec59 00000000 42a00000 c42436d2 43aa656e 00000000 42f00000 c430d7a4 c422415c 00000000 43200000 43e1bc38 c48846f7 00000000 43480000 44aed6f2 426fb0b3 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401a409a 401f7a81 401957dd 3e191f94", + "c47f6ba3 445d4d82 42ea0000 4394f978 420c1475 00000000 42200000 432bd785 43f5648a 00000000 42a00000 c402222c 44037e14 00000000 42f00000 c46353fe c399e880 00000000 43200000 c315e9a8 c4924e08 00000000 43480000 44924467 c44027bd 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 406eccf2 407a5323 406f4f06 3e549b04", + "c4a3e3c4 4401898e 43770000 44d665be 43d83d7d 00000000 4386a8b1 432bc098 450b810e 00000000 438a2422 c4bc9689 441fbb27 00000000 43943b28 c47de972 c48f79a7 00000000 43938982 448d1fb9 c4f4fe05 00000000 43830222 439dda06 427e6d42 00000000 43959447 4343fe16 44c2fff1 00000000 4373600a c43a58ce 43b37866 00000000 42c2c54e c49aa2fd c49ea785 00000000 43004b42 441a438c c49631d4 00000000 42e1997d 448e594a 432cd831 00000000 432f56b7 43603f67 44a0403f 00000000 4330f698 c4f8bf6b 4486e983 00000000 433a383a c4be1bbb c4b11e0b 00000000 4332d866 4437622a c4c9ede7 00000000 4393d6ce 44cee6d6 432a2976 00000000 4388a547 438c13e0 449b9d84 00000000 43778f5a c3e3bd09 438a1cba 00000000 43805aa4 c44feeee c42fcc9a 00000000 432fa3d6 4358a71d c4086055 00000000 43467dff 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000014 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 40000000 -> 3f86f375 3f8b7ecd 3f83e4ab 3c478980", + "c49e4aca 4496775e 41500000 44f0f436 41c87c29 00000000 4352daa6 449f13af 4503422a 00000000 4366ee21 c44eae44 44cc590b 00000000 4347992f c4e70792 43260867 00000000 42ab4b28 c383e55e c3ae71b8 00000000 43012567 439fae16 c4508e62 00000000 41beafe1 4351be70 c22340ed 00000000 42833dc3 42e943f7 42fa670c 00000000 42c781eb c4156d0e 450abd67 00000000 429f1d58 c403cdb2 43201319 00000000 4321f3ae c4be4a8e c4a64cf1 00000000 4340e505 433f6d8e c493dfd4 00000000 4382fde4 43ca1697 c329a1c5 00000000 428ef728 44e2a2d7 44a04e8f 00000000 436de699 c25e3d02 446fe7da 00000000 4357cdeb c40a7333 43974205 00000000 41dffa25 c4e23061 c47ed93e 00000000 4355df1b c1339690 c37a9891 00000000 4385fee0 44bb4902 c480d52d 00000000 42a97ef5 4505a509 4468a084 00000000 42bb62be 438cf94a 44ed7221 00000000 4335e9c5 c314b98b 42fd2b04 00000000 43138fe2 c38cfdd0 c2b35188 00000000 432bcdd9 c2ea2134 c3e548d6 00000000 4318df1e 446a65ab c4751cbe 00000000 43727bb8 45100d5c 43efec03 00000000 421aa3c6 439fd7cc 44593b9a 00000000 4333db4d c35157a8 4386bd13 00000000 42716471 c41e89c8 c282ac28 00000000 42535c12 c42c7eed c4b03b79 00000000 432a938a 447deb13 c4cb76fb 00000000 438f76d8 45099750 3e266f62 00000000 430f8ec6 43858118 43d6063e 00000000 42d119cf c37478f9 43f9acbf 00000000 42eec825 c3a93349 420b4187 00000000 42713840 c460a78f c490a32b 00000000 4353ca42 438673a8 c436a49f 00000000 438b75f1 44e81349 c3c11f3a 00000000 42a494dd 44806a20 44865314 00000000 41a4a927 c3f4cd4f 44ef969d 00000000 433baaf4 c3201d33 424b8906 00000000 43068e4e c4075db4 c3e67f35 00000000 4331fe57 438d622e c4ede5ac 00000000 427d2daf 44c7c121 c42dc7e4 00000000 42b58fff 449c93ab 44577c00 00000000 438aa018 c297904a 44d2cdae 00000000 433ba83c c4acab58 44427b00 00000000 4301d2f0 c4900789 c41d68a1 00000000 437572e6 c2cdfac4 c4deecc2 00000000 433b8f8e 44210805 c3e3bbb8 00000000 436e4dca 4459dfa0 43b6f4cb 00000000 4374286c 431f63a3 44767a54 00000000 42fc988a c3f1b6fa 43d32dc6 00000000 42b6699b c4ecfce0 c40ffc72 00000000 43096e30 c406b975 c4fa535d 00000000 4384ed3e 4478b1be c4857163 00000000 42a440f5 445da514 432ca72b 00000000 41be52f0 43ec5854 449a6997 00000000 42eb3aed c485fa60 44b124f9 00000000 42d65a5b c4d80083 c31b7ca8 00000000 41bf2cf2 c4326fa9 c4b07c74 00000000 438d3558 447a4b84 c4ce74de 00000000 428d8ac4 449d279b c1814794 00000000 4391ccbd 430bad2f 43599a9b 00000000 4386aaa2 c3ecc7e5 4479f326 00000000 438e1019 c4a75297 431b38aa 00000000 43931b91 c48d8c32 c4b17ae3 00000000 41a69a65 43669a4b c42319ae 00000000 42a78d52 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000044 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f19b71c 3f490ec8 3f1b29c2 3d97bbe8", + "c497256a 42d4fa09 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 400c7731 408d0dc6 400c7731 3d55d830", + "443aa4d6 43781eb1 42d00000 43953085 41f9267a 00000000 42200000 43388af5 43f3137c 00000000 42a00000 c3f9d0b4 44087768 00000000 42f00000 c4670548 c3821194 00000000 43200000 c3619f04 c490c757 00000000 43480000 448a5605 c4565d95 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f31af23 3f3dc6f0 3f31b003 3f4bdb53", + "c4b212fa 44465d7d 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f0f9c86 3f138568 3f0e6e89 3f06942f", + "c4a0e71a 44846b18 43770000 43917292 4292b29b 00000000 42200000 421f9458 44019de9 00000000 42a00000 c42a5a82 43904969 00000000 42f00000 c41f0af1 c433bcb0 00000000 43200000 44133f63 c47f9f80 00000000 43480000 44ab8d80 438a4153 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e85acf1 3ed696e9 3e87667d 3e549b04", + "c4ab4cf7 444cc9b2 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f14703f 3f223cf1 3f146e07 3f06942f", + "c37ef6a5 c4791563 43360000 439385c6 42593240 00000000 42200000 42d589da 43fe75db 00000000 42a00000 c4192560 43cf91de 00000000 42f00000 c447e777 c404cf31 00000000 43200000 4367aa89 c490a122 00000000 43480000 44abcfbb c3850413 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e61feb4 3f2a02de 3e61ffc0 3ee9973a", + "c47d656a c37f1d36 421c0000 433dce72 40ecffa4 00000000 4294284f 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 40000000 -> 3e99660b 3f939554 3e99660b 3d55d830", + "c3d4a59f 43827b56 42820000 44a4343c 42ab035c 00000000 42e1c542 444efca1 44db6154 00000000 42c5bb98 c3f96a8c 442d23c7 00000000 437aa16e c5171e3d c38fd21a 00000000 428a4bbe c41b3ddf c4be3e88 00000000 42ed6163 444e5459 c4803330 00000000 420728ca 4500a993 43b29c12 00000000 41fef24c 4413090f 44d3e0ff 00000000 43150051 c29e2657 42b05bb1 00000000 42bafc45 c50071a6 c3eb6bc2 00000000 425fec6c c289ffd6 c36f6f95 00000000 430fbd13 44bb04ed c4bb6228 00000000 437cdf51 4405cec1 43191d34 00000000 437fa09b 4409bbb1 4514f5e7 00000000 422c8f2a c42026ed 44102e00 00000000 43199f32 c42deae3 c36fde87 00000000 432e57cb c324d655 c46ac53e 00000000 436a527c 44e371ab c4b7c217 00000000 438c87d6 44f4aadd 44468aea 00000000 433c50af 437edfa7 4503b7b8 00000000 42c66018 c45fae75 4421c615 00000000 4363a9c4 c4b66009 c42b34b9 00000000 4376b564 c3187bb3 c50e25de 00000000 43945a2b 444cad75 c403fc29 00000000 4381b406 449c6688 4427c0c6 00000000 435fb461 41f10bc5 450b1aae 00000000 436289c7 c32efc1e 42c811fb 00000000 42a8a669 c49144ec c4306714 00000000 4218b46a 424bcbd0 c49fa66f 00000000 438ceda0 438ea185 c30f71b7 00000000 43184817 44dbf2d8 44962cff 00000000 4386a288 c3492027 45065ea7 00000000 4284f77e c38e05a4 42f89ca3 00000000 438fc98d c4af47cb c485efa6 00000000 42171483 4253f2e2 c3b3512a 00000000 436c977e 44ba786b c40bff74 00000000 4305d61b 4452a2bb 44338bd8 00000000 432f1eae c3b34d5f 44dd069a 00000000 42db7b78 c4f43c89 441a2939 00000000 41e5be9a c4d20873 c4c75818 00000000 42992796 439c2e53 c496b604 00000000 42594674 44a6dd70 c3ac10a6 00000000 433930f8 44829605 4489eb35 00000000 4327a554 c3c79a20 449d744b 00000000 425cf8b4 c426067a 4305da64 00000000 4383882f c43bc56b c45cd272 00000000 438874fa 43e94b91 c49acd8d 00000000 42f76eb5 448e002b c326722e 00000000 4327e32a 44a84595 44dcc3cc 00000000 4315e289 c4383de3 44d1d009 00000000 438f593e c448e4c2 42946675 00000000 42d06ed4 c484f2b1 c4c3386c 00000000 436d61df 431ecc7a c39d6d2e 00000000 431a2e97 4457a54f c2057d2c 00000000 431cba9a 442e7150 44900b9a 00000000 429a6c1c c3afc9d3 441951eb 00000000 4314bd97 c2ffc9c2 bff15745 00000000 438680f0 c492accd c5092506 00000000 435e9628 44020a5d c44921a8 00000000 42be1f1a 44b87132 42c96c4f 00000000 4330dc42 43f860e3 4484b4ae 00000000 4332faa3 c4983e33 44d1f8dc 00000000 42af20e5 c45e9b97 c2d98bce 00000000 435d5125 c45312e4 c50281ad 00000000 42071d58 4370161c c39437a4 00000000 428ddf6e 448d6045 4347eda9 00000000 42eaf883 4388aea8 4446fb5d 00000000 4391f3a1 c4bec4ea 44d36450 00000000 428ad94d c474a331 c363704d 00000000 4367c88e c3acfeb5 c497dfad 00000000 424dafa8 43d568ec c3d47c13 00000000 41ce1f4b 44bab366 43d82f06 00000000 41f14520 43af1bad 44c0235f 00000000 43936e56 c4d0acfc 44baadf2 00000000 4341b923 c46c3d81 c3a493e8 00000000 435bb21f c2ad08ac c3fb1628 00000000 434059b2 44d9cc45 c4aed600 00000000 4282af15 4497fcdd 43f8e677 00000000 435f80e1 4311d152 449ace27 00000000 432136c8 c46cc818 442a1ded 00000000 43002822 c4a93b63 c4202b47 00000000 42be8780 c27c969d c4771ee7 00000000 42e52138 44cc687a c482e6a6 00000000 4388a906 43cb3247 435b983a 00000000 41fad21a 41cc2770 4519842b 00000000 43793760 c44a9a58 43e5f5d1 00000000 433c5214 c4d32993 c4811eac 00000000 43157555 422213ea c46b55ad 00000000 430b50ac 4506a7e9 c4865cd3 00000000 43703dcb 44a51626 4462f5ef 00000000 42ec411f c348cc11 4501bf5d 00000000 42c2c3eb c4c4f179 442ae660 00000000 43052447 c2c960fb c29ae26b 00000000 4379facb 43335084 c49479a3 00000000 4274b1ee 448e8eed c3d40331 00000000 428d2eca 44a88e97 449098ac 00000000 438429cc c32b6068 444fe566 00000000 423e3e38 c4a3a783 43cc54ae 00000000 438dab3f c495f4dd c48f3974 00000000 42be5a7c 433d2b5e c43434fd 00000000 435af001 44fdac00 c40115ef 00000000 43812717 448bd920 4494a284 00000000 432fdbf4 c3957b42 44694888 00000000 43337674 c500927e 43cbf22c 00000000 430b8bf6 c4a51863 c4c36545 00000000 422934e3 442c1e0b c4e241bc 00000000 43559332 45089748 c39c9741 00000000 4239104f 44598b87 448fa370 00000000 42d36311 c41aa33a 44ae9afb 00000000 43915ff6 c45c027b 429cee84 00000000 438e7363 c423e3ac c4724a9b 00000000 41a868a7 4427b8f7 c4a4faf0 00000000 43745235 43c1e9b1 c15c7fdc 00000000 4318b82d 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000071 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3eb4a062 3f1f05c6 3eb4a062 3ec8c184", + "44073ea3 44419428 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e286a8c 3f129894 3e286a8c 3e579118", + "426b49a4 44b2993e 42d00000 44cab9d0 43294755 00000000 42536037 4286cf1c 43319159 00000000 430fb0ba c4d0cd71 44e41ff6 00000000 41e77809 c45a2457 c375a2af 00000000 42fff847 c351c3f9 c4869ab2 00000000 41b043d0 44f5b07a c4be5c34 00000000 42a23fae 449d630f 44160b8e 00000000 42a54dc4 41a3722c 44685263 00000000 43531fc9 c5024679 448a90df 00000000 42dcc09a c4161543 c3d4222c 00000000 437b9607 42e162f1 c43c6b11 00000000 437e7d53 448845cf c3b3a6ec 00000000 4386f716 4408a3fc 4408b42f 00000000 4274e61a c3c9a4ee 4498b77e 00000000 43042a02 c44c9566 42f3f2f4 00000000 4220d22e c394ff4d c3d30936 00000000 4390c501 442da862 c4a315f3 00000000 433724e7 44d4ef07 4218f484 00000000 4319b7af 447a7c31 450386fe 00000000 4385dc5a c4b79606 44ecb859 00000000 4307e816 c4d0dede c3a326d0 00000000 42922988 c38abd2a c476db9b 00000000 424e4cea 4466d3be c4531467 00000000 421f394c 43d1dc77 431f8c5f 00000000 435a7607 41d34413 437e25fe 00000000 423944b8 c4c82cee 44806680 00000000 42952cd5 c4b2e5a0 c4536755 00000000 4355e76d 42ee0327 c4de1ff8 00000000 4374151b 44c79b3f c428bfe4 00000000 42723f08 43b99fee 439da570 00000000 437fbf6f c3a35d1f 44a8e1b6 00000000 438cf67a c39131e8 4287b117 00000000 42e83d84 c4a86d62 c4c97727 00000000 41e70999 44232342 c4bcde83 00000000 438ff59c 44b2d3a9 c2a954df 00000000 43838788 446f61ac 44ce3581 00000000 42102c7a c4059e17 444ccb9f 00000000 4381186a c3efc17b c2565ae5 00000000 4230a208 c3ce1796 c48ac5ee 00000000 42dd5a0a 4439a2df c447de10 00000000 429d73ef 42c86fc6 41e80645 00000000 436ff904 4326b7ee 445e9aa3 00000000 429d1628 c42d0761 44040dd0 00000000 43930307 c43eb3a5 c3b93b8f 00000000 43856f9a c20240ae c50a928f 00000000 43838500 44def639 c468fe4b 00000000 436fb23c 44ba799a 4485d61a 00000000 4250b984 c3aadf75 45080d2e 00000000 4361092b c3a9d2e5 42da66e7 00000000 41ff0128 c40711c2 c4091e49 00000000 43116bc5 43b40a51 c48515b8 00000000 429199ec 43e7ad6a c2833955 00000000 42962b66 44030448 443c7907 00000000 4356409c c478e232 44e5ad0f 00000000 437414a5 c4ac5daf c224170c 00000000 433ff4bf c3c6313c c4541ca0 00000000 42efd593 448f8e42 c4b65742 00000000 438f373c 4501a1db 43d261df 00000000 436686f1 43cac989 44b99953 00000000 43844a67 c2e3aac4 42cd2947 00000000 4381b2f9 c4d500b6 c4258123 00000000 43697a03 c1d685ac c38ae0dd 00000000 43547dc8 43650deb c3109387 00000000 439195c7 44412481 43e80e1a 00000000 42b48838 c334aa5c 4517f721 00000000 430b96bb c50d7d82 446a627a 00000000 43069e46 c31d0d05 c3075d58 00000000 43911ab7 43efa6f3 c4f0115c 00000000 4377b461 44c53758 c3b23f08 00000000 426bbe29 44ad8a6b 44d2afb8 00000000 4343a835 c3390e8e 43d2054f 00000000 43232fe3 c469d001 424205c4 00000000 42be25cf c426e20c c4923460 00000000 430f3518 42fa5975 c33cd4a0 00000000 436c21ca 443c88ea 42b3b75a 00000000 425b84c1 430eb765 43c494ae 00000000 42aac02a c2cbc7ab 42d8372e 00000000 430ac148 c4dd4af0 c403971c 00000000 434dfb18 c2841fc3 c3b7d1f9 00000000 43167078 43a06250 c3711fe3 00000000 42f88faa 4457f5b2 43d5ac15 00000000 4335dfd2 4176433a 450227c7 00000000 4246c329 c4b48f08 443956fd 00000000 438d7c35 c42b8beb c3fa0e59 00000000 436ab920 42a3abf4 c3f8c864 00000000 41dc4daf 43b8a5af c2e788ce 00000000 4314f82d 429d15e9 42a1d067 00000000 43028dbc c412b3d1 44d3c7ae 00000000 429cd990 c48772a5 431162f5 00000000 4375d0aa c38e19e4 c3cfa240 00000000 4344ba18 448aaaac c4fb8794 00000000 43315913 4518921b 42b4e6d0 00000000 4380f3c2 43a81369 44375ac2 00000000 4364d38a c4215d5e 4449e9cd 00000000 4341c483 c423b2d1 c309d164 00000000 4255270a c3e40470 c4d6d825 00000000 42853498 42c61150 c2afe2f9 00000000 431ecfdc 442c6252 4388d8b1 00000000 4334024f 431afdc5 44d93c11 00000000 42afcdc7 c4ac0358 4455a6c7 00000000 43367ae5 c3ada907 c3541c69 00000000 42c8151d 42fbfabb c4c0e598 00000000 42b2cd27 42cf7d11 c228522a 00000000 43502949 43f3b812 43d52f0a 00000000 43431c78 c3e3652d 44dceacb 00000000 43256252 c42b2d16 43157830 00000000 42d43173 c4005d80 c41e2dc0 00000000 431e6c6b 43f51920 c4886024 00000000 43736cae 44c0e504 c289802a 00000000 4392b238 447a7f88 44df39e6 00000000 438676ca c446519d 44933de1 00000000 4355a07c c4aa0fb8 c32c2e7f 00000000 42077f6d c3942dfc c450d7fa 00000000 438f70f0 444aaf15 c453eefe 00000000 4322ad40 43c2070c 42ecee21 00000000 42660606 4366149c 44a70b25 00000000 4287f6e4 c3cf39e7 43996bbf 00000000 43388f94 c491ff06 c4131d15 00000000 43445d52 be58695f c5160633 00000000 435fed3e 44ed7193 c46f5ffa 00000000 43424bfe 4486dffa 4447a173 00000000 4369d79a c3bfe932 450b7c1d 00000000 435d0403 c5029313 441f8d34 00000000 4301b244 c4bcc6e9 c4c550ff 00000000 43255c9d 42817cad c3369bf8 00000000 431775c7 451678ec c39892b2 00000000 435a7f81 441e7226 446b2ed3 00000000 43646433 c2a8cc91 43167d3d 00000000 430e2f9e 00000080 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 4003ddf7 401dde82 40098728 3eefc1a6", + "4423f477 c0bf4322 430f0000 44ba02e5 43564269 00000000 43956cbd 42a2b4ee 438af1da 00000000 4266675c c4aaa8cc 4493752d 00000000 4394c136 c4ecc8a6 c4596bed 00000000 437f0bc7 40b78de2 c5094bc8 00000000 426387c4 43fc3725 c36468de 00000000 42f7fa08 44bb1b72 44a36238 00000000 43711970 c4127116 44f559ec 00000000 428d5db8 c5113e5f 43a11cb0 00000000 422eb650 c49be224 c4f595e0 00000000 4317bd58 44651e95 c4afd75a 00000000 42841664 44fdf485 4399240c 00000000 43635013 439b125f 4487c190 00000000 43301908 c34641c8 43290555 00000000 438452c8 c47295a0 c3e2a78c 00000000 43764564 41940e42 c4fa5801 00000000 430351db 44e6705e c44d048d 00000000 42bcccd3 442135bc 440eaa14 00000000 435e2a87 c411c9ff 44ee79e0 00000000 42b830dc c3ee14b4 427b3b8d 00000000 4327da31 c3a192a1 c40128b1 00000000 43446a00 433601ba c389adf8 00000000 43359d90 44281225 42d3d3a0 00000000 42f8ce5c 4337d081 44250deb 00000000 4349162d c4e25d5b 44be680c 00000000 42f8d2e9 c50aff39 c4841f18 00000000 43916ac8 414e5d33 c44b29bf 00000000 42b2f0bf 44f2684c c453d3c4 00000000 4309b0c4 43c75806 43b2c824 00000000 42e59a7c 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000001d 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f3a9e5f 3f817aec 3f3b6598 3f7aa33f", + "c4a2ece2 c3f1afdd 421c0000 44f9c16b 429bed30 00000000 4334422b 441f9be3 44949d9d 00000000 43184e5b c323e2a7 4386cc32 00000000 43019b2d c4d7ffb7 c1c72db3 00000000 438ba7d9 c4030a64 c466426a 00000000 42b8a023 42a63d34 c310a15f 00000000 421cce8f 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3ed22de4 3f0fce6e 3ed550b7 3f0839b1", + "c490e80d c461c778 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40325b84 4055af70 4034dfa6 3ec8f506", + "c1ec5299 c3dafd55 421c0000 4395e2cd 413b270d 00000000 42200000 437601ed 43e5103f 00000000 42a00000 c3c03207 441e153e 00000000 42f00000 c46ff9a0 c15d49a3 00000000 43200000 c411e921 c48031bc 00000000 43480000 442e65b0 c497ba62 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401ee1ea 4061c735 401ee1ea 3ece80b0", + "43e4b7d2 42a7a4cf 421c0000 4395e2cd 413b270d 00000000 42200000 437601ed 43e5103f 00000000 42a00000 c3c03207 441e153e 00000000 42f00000 c46ff9a0 c15d49a3 00000000 43200000 c411e921 c48031bc 00000000 43480000 442e65b0 c497ba62 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3ea1691d 3f34ccb2 3ea1691d 3ec47a12", + "c3c88386 c4ae8b7d 43290000 4393dcef 4249d606 00000000 42200000 42efed5f 43fcfc8d 00000000 42a00000 c414fba2 43db5ab6 00000000 42f00000 c44e8974 c3f47a9f 00000000 43200000 431c05e9 c4923478 00000000 43480000 44a8b2a8 c3ba2991 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401363df 402e91e8 4017b8fc 3f354648", + "c3130d45 431c6a3c 41d00000 42e3d03e 403d9560 00000000 433d1227 43b2fd44 441cbe30 00000000 42954d9e c2a7ddd8 43170ae0 00000000 42ad75f5 c49385a3 42318c09 00000000 43742503 c47c6fa8 c4bfa646 00000000 42898fa5 4466ca6a c4f2d5e6 00000000 43936724 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 40000000 -> 3ecb8cb0 3f7eb94d 3ecb8cb0 3ec1141a", + "c393f3e7 4451ca67 436a0000 4391e979 428b1f4a 00000000 42200000 4255709c 44015052 00000000 42a00000 c4276942 439d7610 00000000 42f00000 c4282b7a c42b3a47 00000000 43200000 44025535 c48452e4 00000000 43480000 44adb971 4328bad4 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f248890 3f2dab54 3f2474fb 3e90563c", + "447f0f95 43dfe78b 43770000 4500189e 44013279 00000000 432123d6 41407ae9 431c570e 00000000 4304e410 c41c93d6 43849e5f 00000000 4323b8ca c491a2cd c4a495f7 00000000 41cffd8f 4323c0bf c38e2361 00000000 43353409 44adc80b 438c0d1f 00000000 438daa5e 4248f721 43c7f289 00000000 438ad799 c4e26f2b 445a1410 00000000 4395dfef c4b713fa c4bbd5ad 00000000 41f5ab9c 448e9b77 c50ad876 00000000 4205d82d 443050f8 42d616c5 00000000 43394bc0 42eddc0a 4429fa6c 00000000 4223df6e c341e22f 42d24fba 00000000 43250299 c4b553d4 c4a8efbf 00000000 4299f5f9 441585fc c4a4a519 00000000 433fba89 44af179d 4310003d 00000000 433af605 43abec84 44befe77 00000000 438866d0 c3d5df4e 4381b3fd 00000000 423fb943 c3fdfa31 c3d6ba42 00000000 4371c2bf 4437e0b4 c4e77da7 00000000 435f0230 44f000fa 42d09010 00000000 436e2551 43d60fef 44c1b6d8 00000000 433b93ca c42c9740 43e8c9f4 00000000 41fbcc5e c3d2d306 c3a17e0e 00000000 42575aab 42ddd99d c3a1fde7 00000000 4394b438 451930dc 416e3847 00000000 42d78f58 4439030d 450ca4e0 00000000 4371c2f9 c4514a8f 441c5237 00000000 42b344d1 c413e7c9 c3ccc3da 00000000 438ed451 4383a173 c4636fc5 00000000 435eacc9 44e6f42d c29bb366 00000000 431c786f 43d78ae7 448ca225 00000000 431ae112 c305f019 42dcf43c 00000000 438f69ed c43d0952 c3eb9ca8 00000000 42a51a40 43dccb3c c4e8159d 00000000 4356f7e0 44f099e9 c32e4835 00000000 41fb0f92 438ca7c3 442003d6 00000000 42c15d38 c412983e 44054999 00000000 4319692d c50378a0 c492c59a 00000000 43494898 43b36091 c4ef3695 00000000 41b4ba6d 4461c4f9 c2fbbbee 00000000 434dcd43 431a4af1 439ad28a 00000000 4333b1bb c48f2b23 448f5ca1 00000000 42a9ab0c c4ba183f c438d469 00000000 43794a73 4334b741 c4a3b23c 00000000 438a87f7 450230bd c3c4b59b 00000000 42c88e27 440cec59 447ba9e3 00000000 4218880e c4d12451 44e6a60a 00000000 42c064a8 c44616bd c3ad7bc0 00000000 42741b31 4301edb2 c4b61f24 00000000 42ed4e03 44dbb8fb c3d24a60 00000000 438fdfc1 440211a6 44501682 00000000 43055133 c3cce7aa 43f91a40 00000000 438d74c6 c36c9b24 c2b494e9 00000000 435004f6 42553ac4 c4a3669d 00000000 438a69fd 443d1d93 c35c0396 00000000 433efedd 4397215b 43d9b327 00000000 42e877d1 c419207d 444d97bd 00000000 42191e65 c4733eca c39f4236 00000000 438699e6 c17dc188 c5057301 00000000 4373c151 4443021c c3861f8d 00000000 4322fcdd 448a24a5 44b3d6a6 00000000 437deced c4960d83 44df2707 00000000 43198914 c4ba14a6 c3cc8a9f 00000000 428f8946 c22a69ce c43f5258 00000000 41c4c7a3 43de3fb4 c3313b84 00000000 43785d15 433c3f7c 435e0bb0 00000000 4308d5ff c3d2c9de 442e5198 00000000 42fdeceb c445dd8a c330fbf4 00000000 435760b7 c2bf6995 c465af35 00000000 4356857d 43e49dd2 c3505d8a 00000000 43931ebf 441244e8 441c922a 00000000 4339bc7e c44014f5 44b1a613 00000000 42a95000 c3b06515 c274de9c 00000000 423ace7f c382f5c5 c4d5c26c 00000000 438c52dd 44f7b757 c47f460d 00000000 430c0bfe 44125aac 440e42dd 00000000 436b3ba2 c2befd3d 4346ff22 00000000 42986abe c428e748 c2a7e7fa 00000000 4328ece2 c38d2bf3 c4adf4eb 00000000 43660f35 4444ea51 c3e3918a 00000000 43850e32 4443e8b1 442ce127 00000000 431c5ebd c43adc83 44dd745e 00000000 4317e172 c4ab5530 c2cf355d 00000000 436955a3 c24e86d7 c34b9b1f 00000000 41a802e9 44cc79e0 c483aec0 00000000 435465ce 4489d785 445c9873 00000000 427bb22a c40ae1a2 44bd9cfb 00000000 42dca7d0 c40e15d9 c177f047 00000000 425900a6 c32c4151 c40cf0e9 00000000 4342a903 4448ae5d c40f5e43 00000000 4321beca 448502dc 44409acd 00000000 42ea371c c2f49f5a 43c3b581 00000000 43601d65 c4a7965f 41e0799e 00000000 42d62003 c3a5b5db c466c1fb 00000000 423cbec9 43ab1406 c3872068 00000000 436a0693 43be57b2 43789605 00000000 433a0a3c c3714370 4467aef0 00000000 42c9b038 c4bbbd3b 42cfed63 00000000 437bf405 c448cbdf c4f23c76 00000000 4281dfec 44a7b937 c4922175 00000000 42e98b9b 433cc484 42dd5a80 00000000 43512ad4 c2c84c04 43ef08c9 00000000 42980c00 c50996e4 4381b43e 00000000 4272a0e6 c33755d3 c3c2292e 00000000 435fc1b4 42a36382 c29cd1b5 00000000 42560ac5 44447a14 43cda175 00000000 438bab96 c31fd9cc 447a5351 00000000 437cb859 c4758d6a 4324093a 00000000 4204a07b c3e150af c45393aa 00000000 41e46999 44cd45a9 c4d8f56d 00000000 42a3466c 446daf7f 43dc4701 00000000 438ed393 c36ec3ef 4506f690 00000000 41aa6c96 c4aa5819 4393d7be 00000000 438f880f c480a63c c4d7db8f 00000000 42e7e96b 44982e80 c4b13768 00000000 42f56c2b 443856da 4395b6e1 00000000 4200ae3e c30f7253 4510904f 00000000 41d53eb1 c4906bb3 439ad211 00000000 437c6e9d c39651df c3e2a1e0 00000000 438c1393 44a3bf28 c4d266cc 00000000 42f84030 43f3d46c 432b29b8 00000000 4346feaf c08cbc03 439fe165 00000000 41cd874a c488992f 43af0b9e 00000000 42a412b5 c3b466e8 c3f57149 00000000 43275602 44a53c9b c4ead5bd 00000000 432ad1b2 44934825 43af663d 00000000 437484b3 41a412b3 4414da56 00000000 431a5192 00000080 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f3c3e44 3f79f1e2 3f3f30ba 3ea9e556", + "44a08e09 c3e22114 41d00000 44fac88e 4250b2e6 00000000 4394b3cf 444a6808 44b13fe0 00000000 437c546e c3be1748 442b0a19 00000000 41a51786 c46f1070 420fdc40 00000000 42f9acaf c440fe61 c4928552 00000000 4382af12 43f244c7 c47ee99d 00000000 428ec2e2 44ba281a c31734ea 00000000 42040818 448ffec3 44bf0136 00000000 4382015c c444f2cb 44f688c2 00000000 4333185d c454c23f 430d83c7 00000000 4363a773 c3f37998 c40dc144 00000000 430b9f8c 43333bcd c408d98d 00000000 438779d4 449acc3a c38fea5c 00000000 437e54ba 444b9cf6 4450a7f4 00000000 4221dd26 c36eba2a 4467001e 00000000 41c88461 c31f93a0 423fd81b 00000000 42be4cda c4d5f53b c4c10919 00000000 41d2b070 433df8cb c477f674 00000000 43499712 448b1661 c3ce9808 00000000 4292b8f7 43b618c0 4390660f 00000000 42a2ccd4 c386dbe3 4505751a 00000000 4279feac c462e5b7 43ca3050 00000000 4351738d c324a7ea c2e49f40 00000000 43412342 42c64f02 c4c778e1 00000000 430d4f8c 43fb8d3b c383d69f 00000000 42b065d8 4501beeb 449cb2e8 00000000 4338eba6 3fb5b22e 4466c10e 00000000 42907424 c3787328 43171342 00000000 42f5b520 c4ddfb80 c466f1c2 00000000 4363e188 c26f824b c4658395 00000000 43115113 449378d2 c44e1c16 00000000 42c704e3 4303f451 42693a50 00000000 432703c9 4386ed8d 45024d8a 00000000 4281c80a c40fa30c 43e53e9a 00000000 4330a2fa c4c79ffd c412dc69 00000000 4247fe02 c34c9127 c4835208 00000000 434abf5e 444b67a9 c438a6de 00000000 423e560e 450574c3 441ea73c 00000000 4254220a 426aa387 4360321e 00000000 432614d8 c4bb275e 44c0f8e4 00000000 4383c328 c4149268 c308342d 00000000 41b898f3 c42d5555 c502fb28 00000000 424de5ca 430dbd25 c326135b 00000000 430eda51 450f2d88 43bad9ca 00000000 4361102b 445cde3f 4509034a 00000000 41ba6428 c4a179e8 44d791a3 00000000 435aedb7 c504f18d c3515cc2 00000000 43593e57 c4362f94 c4be2f0e 00000000 4333ec7e 4365ef5c c3afbdca 00000000 43809e86 450485df 42926f44 00000000 438569fc 43e7bfd3 444f0558 00000000 4218eb4c c46ef60a 44d2c347 00000000 423269ea c50415fa 4275de99 00000000 42d905b4 c38bb8a3 c3d82348 00000000 42b0de8f 43b32201 c43869c5 00000000 43909cad 44538dbb c29d482b 00000000 42bf94c1 44a5fecf 44e021f8 00000000 4318248e c37bb6f5 4419bb09 00000000 432d2d29 c484a072 43272824 00000000 4388d843 c4483f08 c46d3b6b 00000000 4302bdde 4353df82 c41d3b02 00000000 4329070a 44c0a1d5 c3ac2fcb 00000000 434b8e6c 43f32136 43fd6f3e 00000000 435645c2 c403119f 44f50420 00000000 435b4a9c c489f283 43a0ba7f 00000000 42d89807 c4e2d615 c4d0302d 00000000 429c4357 43a9fe69 c4d4189a 00000000 439233da 449d52dd c3e39a31 00000000 4274f064 4405e30c 43d8140a 00000000 437142d5 c2ca1e87 443b2e53 00000000 43614b7a c4293aa1 43935baf 00000000 4352b25a c4683c6e c4242d7e 00000000 43936d6c 42fad0e2 c4ddbfa1 00000000 4337ed78 44e69f86 c46cc05c 00000000 42fb1a21 44828798 4420b1c9 00000000 424fe3eb c05dce74 43f854d9 00000000 42a74a58 c454ebe2 43fe0046 00000000 43111d7f c4b6613f c441b551 00000000 437a0503 c28536e3 c492e9b2 00000000 424b98b7 44d9510c c4951fa6 00000000 4272e6c4 4497724b 4408efa0 00000000 43151818 4374472f 44fcce19 00000000 4393dac6 c4f073ad 44bc8d34 00000000 424568b1 c4b1a719 c4062471 00000000 438a1f15 c3dacbae c5131f21 00000000 42327838 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000055 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f14601b 3f836513 3f14601b 3e736b1c", + "c37ef6a5 c4791563 43360000 439385c6 42593240 00000000 42200000 42d589da 43fe75db 00000000 42a00000 c4192560 43cf91de 00000000 42f00000 c447e777 c404cf31 00000000 43200000 4367aa89 c490a122 00000000 43480000 44abcfbb c3850413 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e61feb4 3f2a02de 3e61ffc0 3ee9973a", + "44ab14fc 43f850d7 43360000 4506b2a6 43c65088 00000000 430b80b0 430c0838 4426de11 00000000 42dceccb c3be7657 438112d8 00000000 43680da4 c4db54bf c491b744 00000000 42aa37f6 432d5585 c4586cde 00000000 4356753f 44d9fc6a c3a8c39d 00000000 4266e15a 44a3953e 44f9b0de 00000000 425f013b c3b26590 4401d159 00000000 43755f86 c5063a43 c3e87f33 00000000 43115910 c19ba944 c2db5cf9 00000000 433a7681 4503472a c4a6365f 00000000 438904d8 44625317 4420c43c 00000000 42fd8c45 c3e86e1d 44f97b53 00000000 432de50e c4bc6252 4373273b 00000000 43441d9d c3e0b0a8 c437c014 00000000 42380632 44878086 c4b895bf 00000000 4377f818 43e3fa45 42e375a8 00000000 4287f148 42d9fedf 443b7575 00000000 422fd1ac c4067601 439eb492 00000000 431b8982 c4d175b1 c49eda4c 00000000 42a2f1ca 433f90db c433fcfc 00000000 42f0e9d7 44bb9eab c3424f76 00000000 42ba6a19 43fff7bb 4460cf95 00000000 4285ac9c c4823aa0 44a642d6 00000000 43217637 c4a2a127 c3b80297 00000000 42ddcd77 c3437d6a c4d71452 00000000 434a9f5e 44b09f21 c441dcc7 00000000 42f28e7e 44a653c9 448685da 00000000 4390fa1c c202ca37 42da202a 00000000 43829024 c4a4fa27 43011e48 00000000 433c1f9b c3657f7c c3d90db2 00000000 429bf8ee 44b7fd21 c4dc5c96 00000000 42aaa923 451112b1 4437e50e 00000000 4385cbfb 4348ba8d 4518d2a1 00000000 436ef75d c4ef617a 44739ea1 00000000 426787d5 c48eb879 c475fd55 00000000 430128f2 43f902a1 c4ba4abf 00000000 436fdb69 445bf89b c269ad30 00000000 4345e7a6 43bde16a 44420302 00000000 42815b70 c4ce0d1b 44e7af53 00000000 43489408 c5037532 c438e3bf 00000000 4233e1b6 c190e378 c3b28272 00000000 4394f841 4476e09b c3e8234d 00000000 421db4df 43c7c16f 43b7519f 00000000 4371e12f c3e12077 44986b85 00000000 42d58f1f c391a4ec 412387ee 00000000 42f022c6 c47a703c c50ac15d 00000000 42ab2292 43222c76 c32b44cd 00000000 42150e84 4487be5d 43d22ead 00000000 42ef26f5 4176d390 44461a15 00000000 43217609 c3fb837e 43599745 00000000 43853d78 c494c3f9 c4915635 00000000 430031a4 442fba63 c4d8dd63 00000000 42ca6947 4341fd47 bf3f64b4 00000000 4380421d 428e8d9d 432c1a25 00000000 41f0afbc c4926878 44914142 00000000 43807819 c4fba914 c4552142 00000000 43833c04 41aa638d c4e26c0c 00000000 42229a46 439dd91a c2fa0569 00000000 438b2a1d 44b33e53 44ba659b 00000000 43887db9 c433e4f0 44cb81a0 00000000 42915d70 c4422ead c1aa1664 00000000 432c3cf7 c2a4f36c c35a2c08 00000000 42a838ed 44492d96 c43b7ff7 00000000 42fc2dc7 44d1dec2 444167e3 00000000 42bbe58f c1c0a49b 440bfa4c 00000000 4390c715 c500cba5 44399dfd 00000000 431c421a c4490bff c45e9445 00000000 41afbe88 43f8ccb8 c481a0b0 00000000 435dd860 44314dc2 4226661b 00000000 4259bd4e 425fc173 432333dc 00000000 42e62875 c4b42c4f 449db46f 00000000 4315e50f c4bd7260 c43d240f 00000000 42aacc9c 42bc82c6 c49e7c3a 00000000 424815af 44a0873d c3d0f167 00000000 439399aa 44c2b94a 44e5999d 00000000 4325dbf5 c41f6f0a 4499a4a2 00000000 42ffa1e3 c4fd0b24 c3364d34 00000000 4395cbd7 c3e22a69 c4b7713f 00000000 4248d2e8 442cb6fe c40de7aa 00000000 43229c6c 44f1a7db 44823551 00000000 434ce04e 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000051 43820000 3f333333 40800000 42f00000 3f800000 3f19999a 3f4ccccd 40000000 -> 3f0f8c76 3f24b911 3f14b308 3ea9e556", + "c3c88386 c4ae8b7d 43290000 4393dcef 4249d606 00000000 42200000 42efed5f 43fcfc8d 00000000 42a00000 c414fba2 43db5ab6 00000000 42f00000 c44e8974 c3f47a9f 00000000 43200000 431c05e9 c4923478 00000000 43480000 44a8b2a8 c3ba2991 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401363df 402e91e8 4017b8fc 3f354648", + "441a92a0 43cc3cd4 43290000 4478c40f 4329c905 00000000 434f1c99 43cc95f2 44d7b8ac 00000000 438442b6 c4424931 440f0729 00000000 430cde5e c4ddfcf4 c4836262 00000000 438523fe 43890705 c5006797 00000000 43637339 444b16c6 c3601d21 00000000 4382193a 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3ea6bc76 3f10bf4a 3ea97a34 3f4bdb53", + "c2f1e991 c388bfc0 429c0000 445e26de 428ae791 00000000 43013230 443e391c 44d7fe35 00000000 42b3cc5d c4180b52 44429dc8 00000000 42a52306 c517b6fb c3d0da20 00000000 4341868e c4426a64 c511807e 00000000 42b8aee0 43720a0a c38073f0 00000000 4357db08 44f828f0 4405875c 00000000 42ea26fe 43aadab5 44b670a8 00000000 43815fae c4c5e908 44ae8e54 00000000 43234b86 c488d42f c3cb07db 00000000 4332b950 c387391b c4f42cbe 00000000 42a7d979 44856fae c442bb74 00000000 436b2932 44a3c429 441d427a 00000000 4374adda 42329a15 4476f92a 00000000 43177c75 c3dd7a9f 4384260b 00000000 42b73248 c4889cc3 c423cad5 00000000 43585a7a 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3ed18475 3f10be17 3ed331ee 3ece80b0", + "41208310 c4882337 42820000 44924dae 42985ec7 00000000 42972172 4470b07a 44ff19c5 00000000 4331cdb6 c46d75a7 44a4d6f7 00000000 433ecb0c c34989c9 c1bfce5a 00000000 4303bab1 c42c7e35 c4d362a0 00000000 43791c25 446d63d1 c4937fb8 00000000 4392626e 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 40400000 40800000 3f800000 -> 3ea1c3d7 3ec95834 3ea1c438 3f0a267d", + "c497256a 42d4fa09 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 400c7731 408d0dc6 400c7731 3d55d830", + "434a8fca 448467f4 41d00000 44a6f460 420af002 00000000 4311038e 44642e6c 44c7d228 00000000 436b58f4 c401ed18 4469cf21 00000000 43666696 c4a7afc7 4249d0d3 00000000 41fa2d5d c451c3f1 c49f40fd 00000000 438c1efc 43de7762 c46a13a7 00000000 41b2dea0 4450a0a0 c2a9756e 00000000 425634f1 44611ad4 44954c05 00000000 42e0aa99 c45baccd 45097dc9 00000000 4264e4a4 c513502e 43c3f7e5 00000000 4368aacd c4c5fef4 c4e68d7b 00000000 436611f7 43941ec8 c4623013 00000000 434e8f76 44a2b0b7 c39740cf 00000000 43161a2a 43226fd4 432675be 00000000 434f29ea c3141b16 440f4fe9 00000000 4248daf4 c50df909 442aae41 00000000 436957fc 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3e22440d 3e890c8b 3e1e1db6 3c5a4ec0", + "445cdd52 c4497c63 42820000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3dd4c71b 3eca479c 3ddc30ac 3f4d16be", + "44aea818 44a0cab3 43020000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 3f800000 -> 3e3ec1a5 3f15edb8 3e3f2023 3f1bedef", + "4466ff05 448f270f 00000000 44f1ef93 00000000 00000000 423672cd 43029692 434b6108 00000000 42b63eaa c474fb99 4505d305 00000000 4356eeca c5044c87 4396debb 00000000 437ddd1f c44ef727 c46fa105 00000000 4393974b 43e40ffd c4c0bdfc 00000000 42215002 431734f6 c2300230 00000000 42912dfd 44c50dd5 44abb8eb 00000000 427f5513 c2867838 43e496af 00000000 438838ec c395d247 4307887b 00000000 42ab36aa c4a4af4a c4558cde 00000000 4342f6b0 40ac9e3b c4985b34 00000000 4316cc4b 44959ddc c43e453c 00000000 432a0b5a 44305e21 43a352ed 00000000 4341ee9d 431be531 448d2ccd 00000000 428871d2 c383e016 4361c4d3 00000000 41e3672a 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3e9d9a9a 3eaf284d 3e9d63bd 3e8c2798", + "433b2c46 43d3d981 43500000 4392c452 4277cdda 00000000 42200000 42a05894 44007212 00000000 42a00000 c420c473 43b71276 00000000 42f00000 c439096c c418d825 00000000 43200000 43bdd9f4 c48ba7b0 00000000 43480000 44aee446 c244ff0a 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3f9d1e4b 40662a62 3f9d1e4b 3f44b788", + "c4b9eef1 c4bb2ea8 435d0000 43925a10 428385f4 00000000 42200000 42859400 4400ec59 00000000 42a00000 c42436d2 43aa656e 00000000 42f00000 c430d7a4 c422415c 00000000 43200000 43e1bc38 c48846f7 00000000 43480000 44aed6f2 426fb0b3 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401a409a 401f7a81 401957dd 3e191f94", + "c47f6ba3 445d4d82 42ea0000 4394f978 420c1475 00000000 42200000 432bd785 43f5648a 00000000 42a00000 c402222c 44037e14 00000000 42f00000 c46353fe c399e880 00000000 43200000 c315e9a8 c4924e08 00000000 43480000 44924467 c44027bd 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 406eccf2 407a5323 406f4f06 3e549b04", + "44949855 c4112339 43430000 4393283b 42688515 00000000 42200000 42bb016a 43ffc320 00000000 42a00000 c41d137d 43c37837 00000000 42f00000 c440bb23 c40f0528 00000000 43200000 43992a6a c48e716b 00000000 43480000 44ade158 c31e1f07 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e58e6ce 3f43f6e4 3e58e6ce 3e276124", + "4497cf87 437f7c67 43020000 441a4878 42a15d4e 00000000 43403ab5 4417a68a 44ec1081 00000000 438de382 c494a37d 448ae9fe 00000000 4334a1bf c42d4f34 c389cde2 00000000 426cb4bb c2c79939 c4c7b1cc 00000000 4339bba8 44c42611 c457f035 00000000 43050333 445d6457 442057ad 00000000 42a7b61c c344dd6f 4482c263 00000000 42d7bf22 c505c216 440b57b4 00000000 433b81a2 c4bda407 c4e32eb9 00000000 43421b12 427b978b c3078f2b 00000000 4286b1ee 4349aff8 bfa47480 00000000 433ee923 44290074 44b03403 00000000 438c9ef3 c463289a 448ba47f 00000000 4233b3b2 c5159731 c413b8b3 00000000 4330d916 c3de3fa9 c509ed42 00000000 434bbb90 44a1ed4d c470e681 00000000 43572ffa 446ba106 43fba1e6 00000000 43791dde c24c6d6f 44809095 00000000 42821f09 c4716f9f 43c722a6 00000000 432f2902 c39aeb52 c38d210a 00000000 41dd2981 4258c02b c3306355 00000000 43263c6d 45024852 c395cade 00000000 43865aca 448298f7 44c5cdf9 00000000 43116abe c34bbff0 43a77d2b 00000000 42de4678 c32205aa c18979b5 00000000 43922982 c4435ee9 c50c3eb8 00000000 42c67e12 4481d00b c47ec0e4 00000000 420663a1 44ace2e1 43ffa190 00000000 4289ac44 429b7d22 445f8f27 00000000 4358f9a1 c2ec7882 4289c406 00000000 428ce2c8 c3c1d36e c3854f7c 00000000 4218ebbc 438e6c19 c4da4af3 00000000 42064cba 44ead17a c4069870 00000000 435cb66b 44ab544a 44c3610c 00000000 433766ac c4679523 45052c3c 00000000 435d4889 c413b627 41912c14 00000000 4301603e c4109453 c48dc919 00000000 43950fb8 4380e824 c3a69c3e 00000000 4325a0c2 44ef18a5 43d38fb8 00000000 435e037e 42f044a8 44046220 00000000 424bab2c c4ee6762 44ba8465 00000000 434cd0a8 c49a4378 c41b36e9 00000000 438b5250 42361f33 c4e0c552 00000000 42eae46b 43bf4219 c328c0e6 00000000 42eec7ac 44022ced 43e1d4fc 00000000 429f4706 c40d25bd 44fb5bc4 00000000 43553bbe c4abb6b2 4367ab7f 00000000 438f64f8 c49cb462 c4e13aa1 00000000 4391d0c1 4481eb90 c4e1cb58 00000000 43707381 43bc2fbc 41f56f46 00000000 41e6c6d7 440c5e33 44bac3b5 00000000 432aacaf c4383057 443dbf3c 00000000 42d41dff c4e5cce3 c41d4a8b 00000000 43302b8a c35e530f c4f93615 00000000 4333f45a 44f4508c c4966a24 00000000 420af30e 445dd854 4410c24c 00000000 433f0a76 c338353d 44a69657 00000000 4388b0b6 c411b90e 43368380 00000000 431e68a4 c468d2ab c47cd2b0 00000000 436c1f63 43aca1ab c4548b9e 00000000 430adfbe 44bb8103 c2a54afb 00000000 43177a7a 43d8c71f 44486293 00000000 435bc269 c4a5a778 44e138f9 00000000 43241084 c50386f9 c3ce0995 00000000 432a15cb c2be7981 c3bc8356 00000000 4283b605 44aa5429 c48c1221 00000000 43943779 44af97ad 44261799 00000000 427b570f bf9f5d19 449e9bf1 00000000 430c2ce2 c4244ef2 439aa21d 00000000 42a6e51c c3b6b3b6 c396d917 00000000 427810f6 43b05f22 c4ad1faf 00000000 433127d6 448df1b5 c35c0d32 00000000 4294072b 44978ad7 44cee2b2 00000000 42a1ee38 c373f518 43e074a3 00000000 43457b63 c4ea1d57 c2d5c197 00000000 42fc0680 c3d7f516 c485b240 00000000 420d641b 4446e61c c45722d1 00000000 435583e0 448be704 43b06e28 00000000 427c47cf 429ca123 440fb9ce 00000000 4353fae6 c466ce5f 4415f66c 00000000 42b5ec7d c4bec049 c46be8bd 00000000 42b89304 43055262 c492d419 00000000 43664161 4463b8db c39adf72 00000000 430784be 429be65a 42a13c7a 00000000 42f4ea7e c3c301cc 4480f673 00000000 436f6af0 c4247aef 42515431 00000000 42d28da7 c4442748 c4ab3a83 00000000 4292be53 449cc3a3 c4e06041 00000000 41d3931d 4327da69 41e52ad0 00000000 42728afa 4417b3ed 45081a86 00000000 43504fdc c42ec7ea 4417022a 00000000 42a2101a c4e5bae8 c44bc5bf 00000000 4363b04b c22bd1ac c4e5e1e6 00000000 4346cf51 449c3397 c41c6600 00000000 438a0dff 44b04fd1 448a7f62 00000000 42e298d2 c31105c1 441e5e4a 00000000 43351871 c4f96fca 43daa97c 00000000 438853d0 c431ea84 c466e390 00000000 42cd92ce 43265f89 c3a25eb8 00000000 43550612 45033be9 4289361a 00000000 43042b17 43724572 440c120f 00000000 43757b7c c3cc4990 43e80b92 00000000 438fe397 c3d7897b c2f8eb51 00000000 42668535 c3375e0e c48e4826 00000000 42b761e1 44d55fec c492241d 00000000 430acc3d 43ac22c1 434979b7 00000000 420d8e72 c32fccb4 44f723de 00000000 4364782b c50602b5 4444f4eb 00000000 431ca00d c4575806 c454224f 00000000 435a9085 42572706 c31979c6 00000000 435dc51a 45084ea8 c362fe7e 00000000 42353a6a 445a2628 44b41eed 00000000 422eda8e c445adb4 44951116 00000000 434c3cdb c49f5422 c339bc0d 00000000 435bd9e6 c409faf9 c4e226f5 00000000 4335036f 44d405a8 c4c0632d 00000000 42e659eb 4443b353 43a24f49 00000000 431fe77e 426582d6 44964a16 00000000 432aa44e c2b91b9e 4244beda 00000000 437f1c7d c4996100 c4651dbf 00000000 43395194 42e72a75 c40e0590 00000000 42c75bcf 439e70c4 c29b23d8 00000000 42c595cc 43bd18e2 43e96b9a 00000000 428985d6 c458a4ed 44e0bea0 00000000 4218c970 c51b133e c1a575b3 00000000 438fde0b c45c15f2 c4ee62ee 00000000 43045684 4487d76b c4a2161a 00000000 424ea842 00000080 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3e353d3f 3ed711d6 3e353d3f 3e9eccd8", + "43d10881 4428b993 41d00000 44a55099 420992ac 00000000 42b16737 44249a6b 44902514 00000000 436fb1f7 c464d670 44cde721 00000000 42c801a8 c443a935 41eb7bd0 00000000 42f8644f c42e1e10 c48430a0 00000000 43424958 431f0258 c3a74ecb 00000000 430dfcea 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3ecb86b1 3eeb4ecd 3ec358e9 3f02cae2", + "c3b36ede 448a0355 430f0000 448c1203 4321577e 00000000 435e08bd 440c3f17 44ef8775 00000000 43639fdf c47b1dd5 4458f9fa 00000000 43517563 c402dfc2 c3705835 00000000 4391f126 40181ada c4638b71 00000000 430206ee 44f95918 c461d01a 00000000 430e99b8 438856eb 436e1b12 00000000 438f264a c3b1460c 449480f8 00000000 436cfffd c50451c9 4392c6a1 00000000 436b8a05 c415beb7 c46bea30 00000000 430c92e2 4432cb0f c48937b2 00000000 436e7d8a 44c44df0 436cc090 00000000 4317abc1 432690f0 4411d19a 00000000 42c990ac c3f5e4cc 43d1a200 00000000 4339dcc8 c50594a0 c4799e03 00000000 425d5107 418f548c c4f25a87 00000000 42b6f118 430a655d c27641dd 00000000 4341645f 43e188e1 43c796d9 00000000 41a7a6eb c4057709 44da511e 00000000 432113bc c2c714c7 4152141b 00000000 4248f251 c43ab855 c49542e6 00000000 42d83d0f 44a3903c c4f774c3 00000000 4393159d 44c2a98f 4375574a 00000000 428f5f42 41e8be22 42d0fd2e 00000000 431bb057 c320a62e 43072140 00000000 43777800 c3ccb686 c342963b 00000000 433e8930 41966839 c49412f8 00000000 438ef74e 445eee88 c3c2cef6 00000000 4349ec67 437fc057 43655ef5 00000000 42db365c c3cd07c4 44a3cc4b 00000000 42a4d906 c49211fe 4312444a 00000000 433dacbc c2b3dffd c311eeb3 00000000 429e625a 445f5aa5 c4a68ba1 00000000 43405578 44879aca 43324943 00000000 431d2cde 43f623f5 44e2d483 00000000 43180559 c333d534 43153e0c 00000000 42e93b35 c4db1f9d c453db7c 00000000 42d8fde3 42483f7d c50b07e6 00000000 4292218a 44f134bb c44efacd 00000000 434773c9 44c712c9 44b4ef7a 00000000 41db54ba c36f14c2 443aa6e0 00000000 43640a51 c4af3e8d 43260b9e 00000000 426054cd c49ee9a3 c502dc56 00000000 428001f2 448e909b c4d197ab 00000000 42204ab0 442fb790 42f09baa 00000000 4330aea8 44109bc3 4508d8aa 00000000 4303cbcc c4eb9f18 44c0eabb 00000000 436d9f85 c4bc9fc9 c43976be 00000000 438d7ce5 41b6a45e c443e382 00000000 4361fe36 4459eac0 c3b79534 00000000 4395f66c 44b2b3e9 44a498c0 00000000 4323d011 c4128502 44dfa8e4 00000000 4334cdba c4ee061f 4354bc2e 00000000 43749ab6 c487b05f c4e2d935 00000000 42683abb 43107334 c3515d69 00000000 42899952 44fd76e2 43b47523 00000000 4314f5f2 439762ec 449334e3 00000000 43211b0f c4e49f34 44b8ab30 00000000 4359b06a c358fff3 c2d8f280 00000000 43881ff2 41bc2855 c4245bba 00000000 43177bcb 44ecb9d1 c443be76 00000000 42e90b87 43f23a55 43e217c6 00000000 428e05b8 c3e8ee5a 44ade05b 00000000 434bcd36 c476a17e 42cf329e 00000000 4394ef3c c454d428 c4b49ce6 00000000 438e794a 44a2c101 c4e8946a 00000000 423d3fc0 4442c7e1 43100378 00000000 4381be4c 432ea3b6 442e9bab 00000000 436bfb55 c29d0432 427a3bfb 00000000 43921dfd c45d5d7f c3e0fed6 00000000 428b0277 421231d1 c4576f5d 00000000 434edc3d 42da1e69 c230fb66 00000000 422ae921 44ab08eb 44a1c763 00000000 430f9531 c43da363 450a8124 00000000 43177307 c5038166 434edeb6 00000000 438f68b8 c48abe14 c4ef1867 00000000 42ff1315 443d3984 c485505e 00000000 43859955 44070f53 42cf2187 00000000 430a916e 4335d33b 443b0d31 00000000 4330fbf7 c2af1c7d 4289a5ff 00000000 42404721 c47bb558 c4020635 00000000 4380965d 4274cf80 c49bf51f 00000000 42543eab 442d965c c38a2c72 00000000 435d4e51 43b93175 43b182db 00000000 433eb527 c363a067 4422b8ce 00000000 42854b90 c4df5385 4323b1e8 00000000 42319c34 c429cbf7 c49490a7 00000000 420e5002 4387aa33 c3bc7fed 00000000 42723944 445f0e1e 43312dfd 00000000 427bae95 438482f1 448c5f77 00000000 425f9417 c4b51548 448c693a 00000000 43884e3e c3cef6a3 c3594eea 00000000 43592ba9 4166f0e2 c3818cf4 00000000 4325bdcc 44b1ba6f c40abf7a 00000000 430592a8 4498ab62 44944a57 00000000 437dc1f8 c3d77cf6 4496d443 00000000 430f0f88 c516d60c 434d0092 00000000 42c048da c467d829 c4ce02fd 00000000 4317c90c 43a2da77 c3df2489 00000000 43868062 44fab29e 43ce0feb 00000000 41d610ba 4326952f 4435d92d 00000000 42ddc9d0 c3fd0d8e 43c18b5b 00000000 435058a1 c418d714 c3a31373 00000000 4371efb5 4305fca1 c5064adc 00000000 431154fa 44d87b2a c425b405 00000000 41ff9fd0 435a8c0d 43571d69 00000000 425cf9f9 c30636a2 43b804f7 00000000 4384b740 c47b1873 429d3b23 00000000 4327eeb4 c455e228 c4c108c9 00000000 436ce5ee 43052d49 c333f5c5 00000000 4365c787 43c33b62 42a5df94 00000000 436a9df7 43ffd8a2 451006a4 00000000 430705b1 c4ab7e31 44815f33 00000000 42bd2ac9 c3aa28bd c3387667 00000000 42b7ca85 42680815 c4521bab 00000000 4352bcf8 450c2850 c45250aa 00000000 43117493 4422ea3a 44227f07 00000000 4308305c c43c7c40 44fd3602 00000000 43034e40 c4d7751d 42f6dae6 00000000 431a8771 c40f4ab3 c4835f67 00000000 42c1583b 447e87f9 c4a99b66 00000000 427447ef 44d1e6b9 43b82915 00000000 43430653 43c77496 44e7d217 00000000 42f52567 c42d1b15 4400cc20 00000000 4235e7e2 c4f5d7e9 c4875eb7 00000000 42a20eaa 43143b31 c4f4d208 00000000 4307e4b9 44f79acb c43609de 00000000 4215b5b8 44c6940b 44c8b5f5 00000000 4320c69c 00000080 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3f000c97 3f592fa0 3f007123 3d9a89d0", + "444f8885 c3ed131c 41d00000 4395f306 40f99267 00000000 42200000 4380eaca 43e1c9d0 00000000 42a00000 c3b3b8d0 4421b5ab 00000000 42f00000 c46fd498 4210524a 00000000 43200000 c422418e c4765e9d 00000000 43480000 441638ab c49e0fb4 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3f3f393d 3f414493 3f3639b6 3f6c7d59", + "c49b1aba 43cf13b6 43770000 44f0317a 43f241fc 00000000 4359d927 412e9fbc 430dd62a 00000000 43934830 c4f6500d 44509f79 00000000 429f8a70 c40ecf2b c421642d 00000000 436dc7bb 43169dda c382bc5f 00000000 4392eab0 439d10f6 427d292f 00000000 42d9690e 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3f636ca0 3f9dbba0 3f83c273 3f6031e3", + "c4993ad5 4497ad5a 429c0000 44aeafa1 42da738f 00000000 433ee7a8 439b5cdc 443068f9 00000000 432455a0 c412f413 443c19a1 00000000 41c12190 c5061484 c3b89378 00000000 431b0367 c3c4fd10 c4936d72 00000000 433c3aff 43321f67 c33d1037 00000000 41b2d7c5 44c117ea 43cfcc32 00000000 432ad603 42a6b60b 43b20411 00000000 43370ae6 c492ebbc 44819561 00000000 42222fb7 c5064b5f c4474521 00000000 42f6137f c3471b90 c4b3c424 00000000 423bf7c2 4344e642 c30fac93 00000000 4392f1ec 45023dbd 447a2215 00000000 43070ea8 413a8b8f 4380fa8b 00000000 42791771 c4bc8cdf 446100a0 00000000 41e83df8 c4b085b5 c453a482 00000000 42abf644 41209168 c3544690 00000000 4272bc66 449e8b63 c4176ffa 00000000 41ddfedf 44842539 4441b087 00000000 4293070d c36ae25b 44d0e11e 00000000 43913618 c51071af 4454f7ed 00000000 4360c1d1 c4c63daf c4af945a 00000000 428b1978 42029f76 c30a3043 00000000 4391bd33 4493702e c39d5af4 00000000 436dde84 44737504 4481be56 00000000 435f36fd c390e572 44576548 00000000 438fbc58 c4915312 43459341 00000000 435e8ce2 c40d0d1c c43551a9 00000000 4310e102 440fdb56 c4a26e50 00000000 42d0cad5 44be24c8 c2e76f86 00000000 438e5598 44a00992 44fa6229 00000000 435c0596 c473dd55 44da5b65 00000000 43106046 c515b28f c21dec70 00000000 437ca837 c489fe01 c505badd 00000000 431a473b 44affc76 c50027ce 00000000 422cfa00 438e9258 41f95f84 00000000 4309a956 43cbdff5 447c5a0f 00000000 438ea49f c42321f7 44440436 00000000 437cf55b c42e9bee c30e85af 00000000 43859c3a c42cd6e6 c5100260 00000000 438f457b 44d14eb6 c4d0d8a6 00000000 42c92e05 44b82571 43dec7e4 00000000 43910595 43aee06d 44d8aea1 00000000 4354f3d0 c4bf30b9 449e67a8 00000000 42dd26fe c4eb0cb6 c43f1a88 00000000 423dc173 c304997e c49ac612 00000000 4299b243 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000002e 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3eb15929 3f42f744 3eb15929 3f06023b", + "c4519dda c46b10b8 43360000 42ea9e5f 41acb6ad 00000000 43943d33 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 40000000 -> 3d819ba0 3eebbd12 3d828e17 3f494b28", + "c3eff4e3 41dd004b 42ea0000 440a6ff4 42822bff 00000000 434eea06 4397a4e3 44588cce 00000000 4347c54e c2911ebb 4292a2b4 00000000 434d17a9 c3b1c9b6 c2f0bc67 00000000 437bb616 c3711771 c4eb4a0d 00000000 42bdb55a 432dc795 c2e44c8d 00000000 4346a719 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3f082c00 3f1faaa3 3f082c00 3ea0608c", + "44a171fd c4911655 435d0000 4508bf11 43f5c836 00000000 43823058 43590a1e 44d179e8 00000000 436cbf94 c50339c0 44882a6f 00000000 438fe952 c4716e18 c45d83f3 00000000 426305ce 43a47435 c446901b 00000000 436dec0d 43e0c09f 419a0ee7 00000000 42c6e096 4439dd6b 45129475 00000000 42cd2345 c4e17994 44add4c5 00000000 4376b35d c4e527d6 c491053f 00000000 438fb6fa 43c12e27 c4ddc46d 00000000 42ef4bb5 43ea7445 c27f77f2 00000000 424d29ea 4440ed2c 44b6f96e 00000000 438f71c9 c3939f73 43a30879 00000000 42f7316f c4448eed c39fc62d 00000000 438622cb 429d4176 c5078a30 00000000 436c776c 439aa057 c2c88d73 00000000 4380a91e 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3d8ef312 3ebcc00b 3d8ef312 3ec20d48", + "4414997d c4aab2dc 42500000 43ed9f52 41c5e153 00000000 4393afdd 44153bb7 449410dd 00000000 4391e77f c3585b8e 43a341a7 00000000 436926d4 c4d06a81 c2ddc588 00000000 42fd1fcf c487343a c50b18f4 00000000 4372edc2 4292cb97 c2d6bfd7 00000000 4383840f 4518e0c8 43461b97 00000000 4334e5e0 447e46f1 4507bd61 00000000 436eaa4f c3ae7775 43f77fd4 00000000 435a96a3 c4c95475 c319d597 00000000 4334b26f c4293b30 c4bbac6d 00000000 4340f78d 43dafa75 c416aa44 00000000 432c291a 44d88aca 433eadd0 00000000 42cf013f 4433e70f 44cf6eb0 00000000 4367d401 c4817e3c 44ace5e8 00000000 43350d66 c4fbe761 c37b4084 00000000 42cd922d c389d2a8 c425670a 00000000 434f9f56 43b0a1ec c3e4e3ad 00000000 42885748 44bee0a2 4354c4f1 00000000 43519474 444286d7 44f3448c 00000000 42fd0028 c48d54e2 44b1c9e9 00000000 438c6479 c50b34a9 c3ab8fc8 00000000 421a5058 c42c3d4c c4e0bc0f 00000000 42a675f8 44aca2b6 c4d2dbfa 00000000 4395979a 4438007a 42f88735 00000000 437df4f5 4306d48f 43b7ce6d 00000000 42cdb25c c4bcb1ac 44dfd0cb 00000000 425b1ee1 c4826482 c33f9d83 00000000 432ae2f8 c4161f24 c4d62572 00000000 4391763b 4400f8a9 c4149445 00000000 437a8732 4356106e 422a12ea 00000000 4387ba6f 440d8ca3 44d3a38f 00000000 4307f85a c4ce8fa9 44e726f0 00000000 435cb8d0 c4bf7a62 c3a3a27a 00000000 42d60913 c397dcab c46e6c55 00000000 436ff40c 43b440de c3c3f475 00000000 432968cc 45066b3b 43f5fe99 00000000 42b53132 441c7770 45013cd9 00000000 435bb0d5 c49d3059 44a60444 00000000 4299570e c4f04f68 c3ea8413 00000000 43146df8 c39ca4d6 c4887158 00000000 435c2c03 445d75f5 c4633f85 00000000 437ffd6a 448fdaa8 43953323 00000000 43226a5d 437d84fb 446975b9 00000000 4264b055 c4045b6e 4403f55b 00000000 434ce85d c49057da c39e9e12 00000000 43454874 c380bed0 c47b6269 00000000 41b2a474 4420a4bc c41b9c35 00000000 4378dafa 441c1061 433535e3 00000000 431b477d 4282be0f 4387c004 00000000 4200f2d8 c48f6bd5 4486fa05 00000000 432fa9d4 c4be4e6f c3e8e93b 00000000 431b767a c3b80f08 c4cbfac7 00000000 43389b18 444bab46 c43a37d6 00000000 4352f6f6 442f8d5e 4361f820 00000000 435460e8 43d49a63 44fc813e 00000000 43237497 c3cb1d7b 43b46862 00000000 437bb813 c47668c4 c3a6759b 00000000 42e33f33 c350608d c4853d64 00000000 43825010 44e3a1ce c4c4642e 00000000 431b3fd9 44608f69 439ef1f5 00000000 4319e83b 420cee25 43431cd2 00000000 435c322d c42a1e65 440e8c2b 00000000 432d2cf1 c3cf9151 c319af0a 00000000 4383b32a c3bce439 c50e766b 00000000 41fc3cf6 4474a4fd c447113b 00000000 42ace074 43bd906d 43129902 00000000 4362f6df 439e9e8c 450356f0 00000000 43849438 c37df317 4348a0e1 00000000 41a79809 c3ff0125 c34db2de 00000000 43833735 c22b1afd c39cf744 00000000 43524292 44d85431 c4a5e640 00000000 43372cb1 44f461a6 444d5d44 00000000 438e4b77 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000049 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3efd0846 3f03ff2e 3eec572f 3e4f40fc", + "c39990b6 44556770 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f0ba4ca 3f37821e 3f0ba4ca 3ec3cce4", + "440d448b c48847ce 43770000 44a1ee2a 43a35277 00000000 4388f13e 42114166 43ebf6f1 00000000 42494a79 c48677f4 43e3c915 00000000 432db7f6 c49f917b c4b454bc 00000000 42a5bb03 43929604 c3fe7977 00000000 4336bb08 447abeb4 434a1398 00000000 4310c204 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 40000000 -> 3f23c0a7 3f39a88c 3f23db80 3ea4ad00", + "c3a0f855 4403e29d 43020000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 40000000 -> 3f3f9bb6 3f4792ba 3f38b23a 3f30e753", + "436e8ffe c4396bbf 42ea0000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3e5d8a6f 3ea7460b 3e5bc4b3 3eddc9c6", + "441b7329 c3d125b6 431c0000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 40800000 42f00000 3f800000 3f19999a 3f4ccccd 40000000 -> 3ee784c0 3f180223 3f04aeb8 3f2b3e6f", + "c497256a 42d4fa09 430f0000 4394780c 422b0409 00000000 42200000 431219a9 43f986e4 00000000 42a00000 c40bfbdb 43f1e7ba 00000000 42f00000 c45a1c6a c3c84695 00000000 43200000 4045320c c4937fdf 00000000 43480000 449f6b1c c4105f15 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 400c7731 408d0dc6 400c7731 3d55d830", + "c490e80d c461c778 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40325b84 4055af70 4034dfa6 3ec8f506", + "c4ba6cb3 436ea026 436a0000 43a5ada8 429df801 00000000 43678c9e 438024e4 451b460e 00000000 43576908 c47f044d 43efdc2b 00000000 42976c80 c2b637c1 c2b987f2 00000000 43271d2a 42d0d9e8 c3540aa5 00000000 41eb6b54 44f266bc 436b6ea8 00000000 41b5a9fa 43e95065 4504eccb 00000000 42cde283 c4e04111 448a599e 00000000 4339257a c373577a c34545f9 00000000 438351b9 44345c8f c4fb6498 00000000 43028893 443edd41 40ba672e 00000000 427e5bd1 42959413 435af126 00000000 4330b354 c495a708 446b2a54 00000000 4350b2ba c4e1d430 c4901ff1 00000000 43680cf6 440aed8c c51382fe 00000000 4227e430 44c31a84 c3255ec3 00000000 437a6d98 430d2ec3 439508ec 00000000 4395ff3f c3a5c971 43a3ba42 00000000 4286854e c4b68e51 c4328efb 00000000 43089116 42b995b8 c443968e 00000000 42e4c2c1 433b5390 c226916c 00000000 428dd766 43da9ba9 44301580 00000000 427b1dca c3309505 435b0d2f 00000000 421dd7f6 c4a8b1ff c3eff628 00000000 42b145b4 3fb8d1be c3943cef 00000000 420b0fe8 443c9e1e c3820672 00000000 43025ea1 448c20b7 44b15660 00000000 433e44fb c3dd9acc 442ead3b 00000000 438e3e15 c4d8f36f c3c9ccb8 00000000 430f03e1 c21860a9 c3af2966 00000000 4367257c 4452d288 c3c9240a 00000000 42b6e784 447d021a 447ec7a4 00000000 4392f7cb c3f2b8d8 4479e679 00000000 438ee762 c50e62b7 c383eafa 00000000 43832f15 c2c37e9e c3d906a4 00000000 434f00e7 44fd5dae c49e3f51 00000000 4350504a 4491831f 44694787 00000000 432339ef c39ed5d2 44614b80 00000000 4239f0de c50609e1 c090c7d1 00000000 438845f8 c3cf3b08 c494f8bc 00000000 4326810a 4396bb02 c36f8fa6 00000000 433dbcd2 44b5fcca 44657953 00000000 438a39ed c3deb99f 44f27a3e 00000000 42a228bc c3b6582f 4222b2f2 00000000 431c8ad5 c43fe5de c4c7b68d 00000000 429c6ed6 445862e4 c458120a 00000000 4295f9e6 443ead04 43b7e681 00000000 432919e3 c38af3d0 4519afe5 00000000 436f44f7 c4c30488 43b1eea9 00000000 42de3aa3 c476cf76 c4c45f8e 00000000 425d67b1 43938969 c3b919f4 00000000 435512e2 43a215ae 42e288b0 00000000 4307eb49 3e5fcb7a 43a861ad 00000000 43411f8b c4f24851 442a042c 00000000 42981d7e c3dbbaf4 c4097906 00000000 429cc2db 432b2f74 c388983f 00000000 4373ad4a 4511d683 44044331 00000000 4336f0f8 43388eee 44c9c822 00000000 436399c2 c4a7cf1a 44226223 00000000 4347717f c3c594bf c3c4c7fa 00000000 4299cc1c 4463f7a2 c4ee0ae0 00000000 430b5a99 43faef76 425d452b 00000000 438d0320 43027a0f 440d35cc 00000000 436827b4 c44c6896 44013e68 00000000 420528be c4848b9a c4521918 00000000 43348ae5 43c8bbb4 c490e825 00000000 43276cb9 43fe9f89 bfde1e9d 00000000 42f0616f 43a3e470 4467825c 00000000 430c2ecc c47f90c8 444d666d 00000000 42ba6afb c4daba12 c488378b 00000000 4286d358 4369977c c482739c 00000000 43898b15 44257aa5 c29b0e1f 00000000 431cbf6c 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000048 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3ef93f4a 3f03387e 3eea5fee 3f7874c1", + "42bd4893 449232e1 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3feec8f0 40420905 3feec8f0 3c5a4ec0", + "42bd4893 449232e1 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3feec8f0 40420905 3feec8f0 3c5a4ec0", + "c41edf3e 442bfe40 42500000 44a885db 428c566a 00000000 4284bddd 438a2185 44090ce7 00000000 42e6ef40 c3c5e685 4415544b 00000000 436ab05f c4d775bc c2e54451 00000000 4351ea3b c44cbeb5 c4d2a416 00000000 43328566 4462dac1 c4a5ef49 00000000 433b4885 44191303 42465cae 00000000 429b6a06 438da36c 44173874 00000000 42da3afc c4958fdd 44d42b60 00000000 41cfe5a3 c4fb23f6 c33fe4e6 00000000 438bc9d8 c364c569 c3fdb3b4 00000000 43527de6 44980fc7 c4d13f77 00000000 43289b58 44a67779 43129599 00000000 43450318 433746d5 43d352a4 00000000 42c17c31 c4141081 4445b1c5 00000000 431be0ff c4810c24 c300b6a8 00000000 4347d7f1 c2cd7ec9 c3769de3 00000000 4346ba86 44ae2060 c4e1a454 00000000 42e5f169 4353956f 41ebd9b2 00000000 43195ce5 44548635 4504e32d 00000000 43466972 c3cd07ec 4400f5b6 00000000 43302b7b c4ea8c5f c3908851 00000000 432dbfe7 c28dac6f c338da56 00000000 43483b31 44538e4b c48132d0 00000000 43558112 42fb0495 41a985d5 00000000 4385ea3e 43272896 43e3e0a7 00000000 424ee8f6 c4950396 44b0bffc 00000000 42f238c2 c4ab5b32 c37bcff7 00000000 437f57ab c39981ab c45af989 00000000 43535877 44aa502b c4c434d1 00000000 4342eb3f 44c1a818 4399dc2f 00000000 43052184 43852e5c 44472084 00000000 42b61526 c3acb4c9 43c14446 00000000 43940b38 c4a710f2 c38ec5ca 00000000 433545f6 c37729fe c442060e 00000000 4387a4b5 43fdf34e c40a0928 00000000 42ea8028 43b02fa7 42a1372f 00000000 4282c598 43ffcbb0 44d347fc 00000000 43451969 c4c89c98 44d3e0cd 00000000 42c0021c c49aeea2 c397324e 00000000 43843466 c2d274d1 c3b750be 00000000 43149308 43feebd9 c402caa1 00000000 431bc46e 4454c5af 435cadc8 00000000 42c3f715 441620ba 450a3fc2 00000000 435a6445 c36f7c42 436ec391 00000000 421c063f c515d154 c424a223 00000000 42f3d26f c3ce7784 c4c99211 00000000 42c9202d 42d716b9 c2d0597e 00000000 437c150b 4427c21e 4342ca01 00000000 431ec947 4369f6fa 4472ed0d 00000000 420d5d4c c389afe5 43819484 00000000 438d73d5 c4799aad c398bdf8 00000000 424f9602 c3ad3013 c4bfee9e 00000000 4377b7d0 42a310ca c29517fb 00000000 4332b7ef 44ca5dc5 44023df6 00000000 4388ebd4 43eb1f37 450ba003 00000000 422273b1 c3d2f35b 43bb5e02 00000000 438f356a c49c1249 c3d2dd77 00000000 42801278 c2a885f6 c3d78360 00000000 437a8ce2 44dc7dcb c4be3b0c 00000000 43876a09 438158c1 42b71ad7 00000000 4379639b 435d173d 44990bc0 00000000 42a8b471 c4d94c45 44b61494 00000000 4388f94c c4cf5e59 c419894d 00000000 4379f14a c28fa7ee c3d8b10d 00000000 4383240c 4445a63f c420d3cf 00000000 430de0c4 450346f8 444b0b46 00000000 430dd642 438f0fac 44ecea19 00000000 428bdb98 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000044 43820000 3f333333 00000000 42f00000 3d4ccccd 40400000 40800000 3f800000 -> 3e24aeea 3f0305a0 3e24aeea 3f30e753", + "c480584c 442b583b 42d00000 43953085 41f9267a 00000000 42200000 43388af5 43f3137c 00000000 42a00000 c3f9d0b4 44087768 00000000 42f00000 c4670548 c3821194 00000000 43200000 c3619f04 c490c757 00000000 43480000 448a5605 c4565d95 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40116757 4043de7f 40125d15 3de35d40", + "c48021de 449db07d 43020000 43fc776c 428406f5 00000000 43581e6f 4416d196 44eac504 00000000 4382e1f9 c49fd3db 44955ef5 00000000 430b4d48 c4a993e9 c406d64d 00000000 431a1c37 c31931eb c51944c8 00000000 42ce1f6d 44846d23 c411c973 00000000 42839622 43f528d4 43b18e5a 00000000 435a0615 c28da111 43bc2479 00000000 428e8f2a c4879ea4 438d4827 00000000 43747729 c4595345 c4822c7d 00000000 4318ccdb 435cd67c c3edfa3c 00000000 436854a1 440db194 c06712a8 00000000 42e04ff8 430a26f8 43900a01 00000000 4394f455 c4bc3b03 44e76c93 00000000 4308f02d c4c1336d c3bec96f 00000000 435f53f1 c3c2226f c4f0f55d 00000000 42c7156b 4359f3cb c3221ffe 00000000 43939871 44cdeab2 445be6f6 00000000 43954c32 c11d6ff0 4346066b 00000000 42c3a357 c3f36ae2 4348c509 00000000 438ff8fb c4c9e248 c4b7e9c5 00000000 4308f48e 43ae52c7 c48ddc84 00000000 4314e5c5 44e1053a c3815bd7 00000000 43885156 44a1f7a3 44f55153 00000000 42838b57 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000018 43820000 3f333333 3fcccccd 42f00000 3eb33333 40400000 40800000 40000000 -> 3deef9df 3f135cdb 3def0355 3f7979ad", + "c4a62b95 c4817eac 43430000 4393283b 42688515 00000000 42200000 42bb016a 43ffc320 00000000 42a00000 c41d137d 43c37837 00000000 42f00000 c440bb23 c40f0528 00000000 43200000 43992a6a c48e716b 00000000 43480000 44ade158 c31e1f07 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f070907 3f2411b5 3f070907 3f4a4ed7", + "418e53ca c3128df8 42500000 44f3c498 42caff79 00000000 43569a0c 440b127c 4489fbfa 00000000 4276de89 c494f7a6 44e0cfd9 00000000 42b75451 c4a7d371 c2b29499 00000000 428bc0e7 c30c4255 c3904c52 00000000 42a78bdc 44ab677f c4fac014 00000000 4259a26c 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 42f00000 3f800000 7149f2ca 71c9f2ca 40000000 -> 3e9fecd1 3f15adb0 3ed3c718 3e5b6168", + "c480584c 442b583b 42d00000 43953085 41f9267a 00000000 42200000 43388af5 43f3137c 00000000 42a00000 c3f9d0b4 44087768 00000000 42f00000 c4670548 c3821194 00000000 43200000 c3619f04 c490c757 00000000 43480000 448a5605 c4565d95 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 40116757 4043de7f 40125d15 3de35d40", + "43a98812 c4691c62 430f0000 43640571 42035315 00000000 4370fb75 4231671e 43177e9a 00000000 4328964e c4c03a3e 44a617f6 00000000 432a90b8 c4b30691 c42462ed 00000000 43007f34 3fe15b91 c428907e 00000000 42dd951b 44910a24 c403598d 00000000 433924a9 44777c52 44581b4c 00000000 431b2b55 c3b43d69 4496fd18 00000000 435d8152 c4b2e8d3 434674be 00000000 42965c00 c49e0a8f c4f8fc2f 00000000 432aa230 448b822f c4d622ca 00000000 435aecee 440b0a9a 42a7b0ba 00000000 42bf8f63 44232fbd 450edc2c 00000000 436c9251 c4962584 4480014b 00000000 4242cbbd c38287a2 c2f3ea9a 00000000 4393cd06 4052d652 c3b23fed 00000000 436c1982 44f1277b c4568d0e 00000000 43372fa4 44994c1d 4487a97b 00000000 435390b2 c2e9b133 43bf21df 00000000 42dee905 c4927878 431a8fcc 00000000 43936034 c44070a1 c499d570 00000000 43594595 44aa6951 c500e881 00000000 43490746 44c82e7a 437c4c0c 00000000 432eabf2 43dbebb7 44c579c4 00000000 426e19c7 c3650d26 4340aa96 00000000 4386094a c4025738 c377c969 00000000 424939e2 41fe3f87 c4fa4dee 00000000 42240ca4 44674205 c3ca1590 00000000 42e891bc 448e88cc 447faa0e 00000000 4366f82f c3df75cc 44b28583 00000000 41e6f54c c50f637b 438f94da 00000000 43237e63 c3dcd661 c4332a4c 00000000 42b6ca5e 43ad1ef2 c40116b6 00000000 435cd5cc 44ead9bb 439a6284 00000000 438b3cca 440ad3a0 44ffdee8 00000000 4373d51d c492ed47 4473de26 00000000 42aaea75 c4d4d1a2 c44dc306 00000000 43906a1e 425b8d9e c5186f2f 00000000 4246613e 44d2876c c434a7da 00000000 432cec93 44969fd6 4488e694 00000000 4302fe8c c2fdfff0 43c64c87 00000000 4318f5a4 c311aa6d 418a04f8 00000000 4293c134 c480c7e9 c4d4188a 00000000 4395cf62 44ac36b3 c4fd2e48 00000000 4369a9d0 44113462 42c6d3e1 00000000 42ce36c4 429e83a5 43960176 00000000 42f7ff26 c4b68c30 44957658 00000000 43095a84 c359fa0e c2d6531c 00000000 4208c2f6 41f46dab c4831400 00000000 43616184 44822b9e c3db528e 00000000 438a51c0 44b9e28f 44ab3644 00000000 435d2ddb c37e92db 44424d20 00000000 42c6d710 c4467bc5 42b16547 00000000 43911c51 c3f8a245 c44fd61f 00000000 437d26b4 434163e1 c38c2631 00000000 42c1053b 44c3fe3d 438b8a43 00000000 42086c2b 42bd39db 43b8005d 00000000 428fda8a c4dbb901 44b17afa 00000000 43111efe c48f7ae3 c40f71fe 00000000 4252adac 422f7560 c49943f8 00000000 42a27d18 44d83abd c432cbc0 00000000 439466ef 44a6e14f 449bc39c 00000000 432cabb3 c40f9032 44d654ee 00000000 42a513fd c49e5566 430504a1 00000000 42df349b c48f7da5 c4f38a8e 00000000 438b6129 448154c7 c4b8d156 00000000 4394625c 43bb3ab8 428a6e29 00000000 435daae3 43b986bb 44b97e30 00000000 4307bd08 c3cc0cab 43a29856 00000000 436206c3 c4fc2bcd c480273c 00000000 4379b38d 4289f94e c4cb521e 00000000 4273df7b 44c3da6e c41eea6c 00000000 438c490d 449c2c71 4493b8cc 00000000 41f37048 c3666690 44284697 00000000 43309b6c c4a77ac8 4303baf4 00000000 433f8cc9 c4347abc c49b82a6 00000000 42c41c4a 43d4424c c4158acf 00000000 429dd6d2 44019e18 42c6c8d7 00000000 43776666 44137ae0 4517b81c 00000000 436713aa c490b4a0 44637ec8 00000000 421bfc12 c489fe9d c40e9121 00000000 41edfac6 42e502d0 c511e470 00000000 428a9b92 44a88ac6 c406285b 00000000 43455deb 44d32bdc 44ca6964 00000000 4302fee7 c3fa22bf 44b2d019 00000000 431c36bf c43ae125 4288fae0 00000000 43680556 c3991659 c405f1ea 00000000 4349c572 445a9b42 c497df1d 00000000 4339bf5a 445836ed 432bbef6 00000000 4370d2c2 43fb60ae 4505253f 00000000 4350de00 c4ef827b 44b9b6f8 00000000 438c288e c4e1a6ef c46cee59 00000000 42c93758 4259efff c474831c 00000000 430cd09b 44d61dd3 c42727c5 00000000 4388eb9a 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000005e 43820000 3f333333 00000000 42f00000 3d4ccccd 7149f2ca 71c9f2ca 3f800000 -> 3d6990ba 3f3ac5f5 3d6990ba 3f3002dd", + "c3e98ca7 4398cca3 43430000 44169bc9 42edf92a 00000000 431c4bed 43309fa0 44719025 00000000 41fcd6a3 c3944944 433887fb 00000000 43822b71 c4f39ceb c4b4c736 00000000 41e97ff6 436ec6fb c45e0fad 00000000 43741f4e 437a5726 c1e3a6d5 00000000 43402311 443cd7a4 44b174d5 00000000 43382cee c44d9321 44711b4e 00000000 429dec78 c50346a2 c433fdcc 00000000 4387a0bf c1768a82 c3a8ef13 00000000 432cfafe 4413128a c383d738 00000000 43486294 44b6b18a 44b27177 00000000 42634d0a c45cf95f 450374ee 00000000 41dc09c4 c506633b c23d8f79 00000000 4375bf1b c2bd9bbc c3805ba9 00000000 4380e30c 448dffe3 c47deda6 00000000 42fdf681 4439cf7e 43baa563 00000000 439339d4 c2b43dc8 447aa501 00000000 437ee83b c4852b4e 439cb9d2 00000000 437c1820 c461d175 c490e61f 00000000 424b7554 4498bad0 c5016ce8 00000000 436d0392 45125e35 43b9ace9 00000000 43327e5f 43553f2e 44700d61 00000000 424ae488 c41f0246 43d6eeb1 00000000 438fc8d7 c427b111 c3e5c6b4 00000000 4299fb9a 439b376f c4a9a4fa 00000000 42bd4b8c 44e6172a c38bf8d7 00000000 43736c76 43fb4d25 44581237 00000000 4333970b c485a016 44a94372 00000000 42ac35f3 c3c81dcb c2f10835 00000000 4226518e c11192d6 c2d9e58c 00000000 428372a8 4506c08b c4853a1d 00000000 431dddf9 43dd539c 43c86dd2 00000000 4352bf10 c394a69e 44456825 00000000 43497e52 c4162189 4116e660 00000000 43494a04 c43e4c9f c4e67e20 00000000 420d225a 441f1557 c4196d0c 00000000 439476bd 44ab640d 441c4138 00000000 43128838 c2b82f54 44dd93d5 00000000 42b0637a c4e4f2af 4419b8b8 00000000 4373c895 c498ace3 c4b560af 00000000 4387d74f 441d135c c4916072 00000000 4383a274 4451f47e 42c9b623 00000000 42def097 43d1c471 44c82144 00000000 4321f188 c49c95c8 44655546 00000000 43762eaf c3ce7725 c382495c 00000000 428f931a 43a4c648 c4d98f12 00000000 431e3401 43ae7615 c2853ec3 00000000 43731f59 44896bb3 44d907e0 00000000 431319a1 c40db1f0 44421eb2 00000000 43545739 c4f44da0 c3fe7672 00000000 434466e8 c3649593 c4eadff2 00000000 4349e7a0 447058b1 c402525e 00000000 431b7952 44e19396 44bd495c 00000000 4364a04c c340ac8d 441037bd 00000000 438b38e3 c508dc5d 42ea4c96 00000000 430d6a14 c40073dd c48c526d 00000000 42e2a110 4419eb47 c4201678 00000000 42459fde 44c11502 441eb834 00000000 4236a180 c0f2d73b 4405f3d1 00000000 43854478 c3283d93 427e8e33 00000000 4374d38b c30880e0 c3164509 00000000 43043882 440bc80a c48deddc 00000000 433d4828 446f198f 429cc718 00000000 437d4519 4420b9b7 4504b3da 00000000 437102f8 c49fae5b 447ceb4d 00000000 42b0a2b1 c4f0724f c48b54ca 00000000 422596fd 43b9ef4a c51a6b75 00000000 4254d458 43e2492a c2d0817e 00000000 438252ec 4428bd9d 44757c23 00000000 437b8adf c40f9d9e 445533c3 00000000 43886698 c445601a c32e0fdf 00000000 435307e7 c3b978c6 c510c499 00000000 435fe255 44c29be3 c4667531 00000000 42f35cf5 43c3f7b2 43983804 00000000 41a2f641 c2f87526 43d451de 00000000 435e6de9 c43b9bde 42893dc9 00000000 4319f432 c43bd12c c4ba42c3 00000000 43959042 447b04d8 c48cceeb 00000000 42e9e3f2 43e7a010 432a43f4 00000000 4376a3ef 41177c97 43c8be51 00000000 42479e50 c4f9e109 4452ed06 00000000 430a472c c40977a0 c40c4ee8 00000000 4343dabb 44107298 c4a1cce1 00000000 4302f842 44611af7 421eb12d 00000000 429d869e 44426a5b 450d16f4 00000000 43728604 c49aaf83 44844d59 00000000 42ee9dd5 c48de84c c4167423 00000000 42621190 4312e85c c4a3cd30 00000000 42f1f97d 4492bd26 c39ec08d 00000000 43681b45 44a753b1 44e0c38d 00000000 43954d8d c46063ad 44b4ef53 00000000 438563f9 c4cb2f3e c393458e 00000000 438a0203 c3ed748c c515131e 00000000 4305c068 446a40fc c416ec01 00000000 41a5a014 448baec2 4448915c 00000000 43759229 c3d82990 44d6704e 00000000 4348b4e2 c4dd0814 43653f85 00000000 42c4c816 c2be9b92 c32c82ae 00000000 4384301c 44276acb c44abbc3 00000000 42d44fc6 43fc09e7 4323f679 00000000 42d8e695 4126efa4 4329f0fe 00000000 438fbc26 c3434767 42b67dfa 00000000 42eadaf2 c35ec694 c352d7b5 00000000 438a7877 44659ce8 c50eda27 00000000 43268140 449f3bde 41003ece 00000000 42a6cb0a 4447f914 4501162a 00000000 4305cebf 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000006b 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 40000000 -> 3fb5885f 3fd750a3 3fb6485a 3ec8c184", + "43ea916a c485fc5c 41d00000 45183b31 427d5eae 00000000 42e18ffd 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 00000000 42f00000 3d4ccccd 0e736390 8ea24260 3f800000 -> 3ea8f697 3eb33382 3ea74555 3f215d29", + "c499c341 43ca7b5f 41d00000 4516d174 427b049d 00000000 42801c06 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000001 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e96f746 3ef54fd4 3e96f746 3f4df960", + "c416fbc3 44762730 430f0000 43635161 4202eb62 00000000 430a0988 441eaa61 45077e63 00000000 4323bfa5 c41d6e53 4408071a 00000000 438b6b0b c4345124 c3a59278 00000000 435fed8f 40759363 c4b7afef 00000000 437f85f4 435cf818 c2c81cd2 00000000 423ca21c 42f1a7f6 42d30428 00000000 434a5eaa c2569252 4333bfa5 00000000 42e7b647 c4dbc58a 4373c854 00000000 42c30fa3 c4977c06 c4eea7bf 00000000 42b34692 4332a4f2 c3891a72 00000000 42bbfa47 44f10f87 43915d79 00000000 430d507c 441396b9 45013487 00000000 42bae1ac c4aec41a 4494fe77 00000000 437be055 c44fcd02 c3c227ad 00000000 42845806 41883571 c4e64fe3 00000000 42759286 448e3138 c3fd0327 00000000 432c1625 4490af8d 44800a88 00000000 435deb89 c2a2504a 4384c0d0 00000000 43790859 c476d137 430239ce 00000000 42a4f72e c4878696 c4d8acb6 00000000 42bb5a39 4324af2f c37926e3 00000000 42f8a6a7 432b3d6c 41d7d21b 00000000 432aa368 441dcf60 450db437 00000000 4321af59 c485f5f8 44615caf 00000000 42ab1c5e c427b85d c39f6c83 00000000 430e095e 42146e1e c51220b7 00000000 4207fae6 44d519a6 c43a3797 00000000 4371236f 449a9cae 448aa9fd 00000000 43168e5e c3fb3214 44c8ade7 00000000 41ffe3c0 c41035b0 42906758 00000000 43150cbf c4072b0f c45b52de 00000000 43059a79 435183d9 c39c39ec 00000000 43899eae 44c3d836 4380be49 00000000 431af61a 4263ce8e 4351ef51 00000000 42d89883 c40f2103 43ed9064 00000000 43853110 c4ff5272 c476db08 00000000 4351adae 41cf6a62 c49001da 00000000 437cd691 43f6127a c35327c8 00000000 43038a46 44454dc3 443353bb 00000000 42d90a0b c385935a 445090fb 00000000 42a1fd6e c4436972 42b92780 00000000 42473f48 c4922970 c4f0b8b1 00000000 42ca8715 43ad5aff c3fedbff 00000000 430b96f4 44fbbc6b 43ac59a3 00000000 43778537 42898dcc 43822ba3 00000000 433e2aef c3ba0eb1 43985600 00000000 42e10d6b c30a67be c2881618 00000000 42eba0b9 4280347e c50980e5 00000000 435192d4 44256dc6 c38b5d4f 00000000 425545ab 44d3c81e 44c31083 00000000 4313f256 c3ba4974 448e2e96 00000000 42a6d4bb c5162f6d 43863a95 00000000 43009c06 c430c058 c493bfb4 00000000 42b6ec16 445e8f0a c4a1499e 00000000 438845b6 44bff9b8 4388adfe 00000000 42b5434f 427b8eb3 43749ca3 00000000 42e82465 c4b1a1f2 448f7b74 00000000 439394a7 c3e820ee c368128a 00000000 42c57f7b 423ce203 c4a4fdec 00000000 437af57f 44cc9d93 c429314d 00000000 4293f7c8 449c974d 4492290f 00000000 42ac6197 c35a5a1a 4422fe56 00000000 434cf6e6 c4e39d39 433f38b8 00000000 43347dee c45422dd c4b40672 00000000 4233d741 44aba076 c4f54263 00000000 43213d03 43d75e94 429f3c6c 00000000 42c6e094 437fff79 447ff3b0 00000000 43834b08 c4bc460b 44960631 00000000 4212fd60 c3c31060 c346434c 00000000 432291d6 42a2a77e c4efb0b6 00000000 4390656e 44ee50a7 c4415e8c 00000000 4389145d 43d6664b 43cacbfb 00000000 43791df3 c3e3ab1c 44a647bc 00000000 43785ef0 c4c2da52 431942b2 00000000 41f95225 c382564c c3e09c3a 00000000 433a5dd0 4391e2e6 c3cd8fd0 00000000 430d24c9 4488cb12 4351ca12 00000000 435f14ac 43ea23f5 44f0dee2 00000000 42a39115 c4f15bbf 44bdb908 00000000 42d2eae7 c4bcccae c4430e24 00000000 43904366 4296ff0f c4c062b6 00000000 432642bd 45099eb3 c45b167e 00000000 42445a56 43849bd3 437e3741 00000000 436e5c60 c4437027 450bb627 00000000 43816f00 c41d7f87 4266e346 00000000 42508ec5 c35901b1 c3bddf28 00000000 4395ed63 43181d1e c3535acb 00000000 43623198 44768137 4343ce6e 00000000 436a1939 4222b9d3 432c613c 00000000 430b6eb4 c395e954 43687b35 00000000 4388c908 c505533b c48bfd3d 00000000 43402fd8 42ff40a4 c50f304a 00000000 42f2b665 44531b5a c3a4ce48 00000000 435a4b35 44c2454a 44bcb2c6 00000000 43505fca c2c74d49 438b7fee 00000000 432b3cd6 c38f42ea 41c2b515 00000000 437dee05 c48213c7 c4e72adc 00000000 4373b805 440decfe c44277b1 00000000 42cc3758 451374ec 43f267d0 00000000 42406c26 43c884a4 44dae4bf 00000000 436a01e5 c4d95fee 44a6419f 00000000 436834a5 c4e387b3 c472c498 00000000 42132688 4293f3d3 c4944a36 00000000 428696e2 44645759 c3aec809 00000000 4354235e 4426a9f1 44240be5 00000000 41ccb948 c33d45d8 4401c16b 00000000 432f6f02 c409daf8 422ca501 00000000 436918f8 c496f9c8 c508423f 00000000 4393f60c 4467dc77 c49ca7c6 00000000 43377738 44ed8e7b 43c9d551 00000000 4304e675 43f9d486 450ca3a7 00000000 42c07be6 c4c2b4da 4492e242 00000000 4352e716 c3253787 c2b31ad6 00000000 42d2dc7e 42034f0e c3edcddf 00000000 42bdfd55 446b1873 c3b06346 00000000 422e073e 44b35a05 44b2e402 00000000 438c7211 c41f571a 44d60eb5 00000000 42ed2d77 c337aa6c 41526e32 00000000 429a6d4a c470edfd c4dce391 00000000 43819f6e 44ab100e c4e3f9bd 00000000 428596b4 44611254 4345786e 00000000 4289efea 4338e34a 4456e3a5 00000000 42153a17 c43d5047 440cdb49 00000000 4326729e c4b4e3fa c4473596 00000000 422b375b 4318d727 c4fc6edf 00000000 42f985ad 44ccb1be c4167dae 00000000 42fbbe31 441de7b6 441f99cf 00000000 42d20ba8 00000080 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3efebf58 3f10f5b0 3ef7b5dc 3f64be4f", + "c483d194 c4b70646 430f0000 43a5de8c 423f0f02 00000000 42d5416b 434e34d9 44301774 00000000 42a1a87e c4077d8e 43ea23e6 00000000 437dec98 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000003 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3e9555ff 3f151e20 3e97b5b8 3f505dc2", + "439718ea c4a4aee7 43360000 44e7c551 43aa9dfd 00000000 438eaaad 43b9154f 44dc8d53 00000000 42e0e73b c489e652 443ae7c6 00000000 434c5d0d c36a48ed c31ba693 00000000 43166229 41a7263e c2d0b3fc 00000000 4303a063 44895557 c354a56b 00000000 433bc8e3 44167db0 4465b519 00000000 4321d5e4 c4229314 446c9bb1 00000000 42a1f4a3 c4cdfbfe c3b264cc 00000000 437cb749 c3a80478 c4ecc6ab 00000000 427dcf82 44110437 c3b79b58 00000000 43832ba0 4347f87d 430e0be1 00000000 43803d24 c294a2a4 439f8a20 00000000 43548606 c4fc3b27 43a2c802 00000000 42ef0b76 c280a007 c2d260b9 00000000 4290007c 44acd076 c4eb69ad 00000000 4358c187 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000010 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 3f800000 -> 3e0c20a9 3ea35fca 3e117f9f 3f7b69a3", + "41e91436 c1eefad5 42500000 45128319 42f40420 00000000 43450d47 43bc2262 443aa9a0 00000000 43832a7f c48a40e9 44d0a4af 00000000 434c1c58 c48a0560 c292dd96 00000000 42e0e06a c3ad8e91 c4328e07 00000000 4334ea8c 4440bd74 c48cfb3c 00000000 438b220e 450f1b57 43397215 00000000 4310c090 445a5d63 44e9233d 00000000 4384f8ec c4a0881b 44e3bb2a 00000000 438317c2 c42573e9 c27cd787 00000000 437b496b c45b8484 c4f370a7 00000000 435da065 442f855b c4718794 00000000 4378bf94 4497a657 43058982 00000000 435e224a 445902a4 44fa37f5 00000000 4289003c c4209d7f 445673ba 00000000 43701fb7 c5123a59 c391d97c 00000000 4381af4c c3a79063 c4491858 00000000 42bf2035 43bef16d c3f76f09 00000000 433f6065 44b26a26 4346e08a 00000000 42953c76 42a6c683 43509025 00000000 430e71e5 c3e75c6e 44118557 00000000 431a5ae5 c37fedb3 c21db512 00000000 430dcd18 c4163fd9 c4c40add 00000000 41b50f67 449d85de c4c06686 00000000 42c84c7e 448a721b 433aff0b 00000000 42a50bcc 44265d16 44e2cb3c 00000000 43076304 c46ccc69 448c6fd6 00000000 43536eb6 c4c999b1 c39420e1 00000000 42a121e7 c32d198e c3f6ec9f 00000000 431d214e 442d2802 c4477b50 00000000 421f388f 44f4bf96 43c273d5 00000000 42b1dfc6 4437fe82 45098ce3 00000000 4320dac8 c4870f01 44972321 00000000 435059c2 c4bc88a6 c3a11e58 00000000 4348c71d c3437dc6 c41975e9 00000000 429a7694 4412bd51 c41f858f 00000000 4355c3e5 44f9f37c 43e4b674 00000000 4373737c 43d06a24 44ac2544 00000000 42f66e1c c48f7623 449784b1 00000000 41ceeb61 c3e9b850 c2e415a9 00000000 4314186e c4219d7d c50cc5de 00000000 4336bbd5 44a51a0d c4a96a93 00000000 428db07b 43154d4f 421ad99d 00000000 432804c7 434cf221 443cbac6 00000000 43469073 c48e555c 448de798 00000000 41a58c9e c48a1695 c397be72 00000000 421d543e c3f9803c c4f39588 00000000 43935dda 44947049 c48fc9a8 00000000 41d1311a 44abc8f4 43c776f1 00000000 4331b075 43ecb859 44f5c970 00000000 4393f711 c444aa84 44391623 00000000 426e8cca c36826c4 c28e0fe3 00000000 42a44b01 c3f9a4c8 c50a54da 00000000 42201f7e 448ddcc7 c481b50e 00000000 436c52c8 43bf549c 42f64766 00000000 42c0da7d 43955239 44b15898 00000000 427e155a c427264a 44147684 00000000 438dc11b c3ca03f7 c3087839 00000000 429cfcdc c3791ca6 c49f494b 00000000 436439d3 446d31b2 c44ca41e 00000000 4245f7f2 4473434e 43ac2edd 00000000 4390da40 41c95756 430b5fe5 00000000 42a598ea c4ba5828 449c24ba 00000000 42b44cd9 c503d63f c4433994 00000000 437ce9f8 c2971505 c3e3e4aa 00000000 432a0d42 44c71ec6 c4a20631 00000000 423592d0 44126224 43626890 00000000 42891322 4201fd17 4357440a 00000000 437214c8 c4849e16 44518b58 00000000 4326f9d3 c431ce43 c38f6d30 00000000 438f2609 c39d5ac1 c51059ee 00000000 4323458d 4483c7df c44a1f16 00000000 42eefd1f 44853a6e 43dfea39 00000000 42c4f096 4361ee8d 44e8388b 00000000 4381c0b1 c4d56d4f 449ed826 00000000 430eb933 c49b1bc3 c407a32a 00000000 43770f02 c1fe2533 c3946bb3 00000000 4356cc59 449b58eb c4605ad1 00000000 4310a879 43b53891 4324bb2b 00000000 437ddbc2 42dab799 4493d6f7 00000000 434ae3fd c3d5f0b4 4395d8c1 00000000 436ad35f c4b3fbaa c429e77c 00000000 43392e0f c2babd41 c495b863 00000000 43181717 44f28402 c4a4b3ed 00000000 42804017 44fb91a6 447667cb 00000000 42e802c3 42dda0db 44da38df 00000000 43926b5e c47e5133 44276a77 00000000 43283ac3 c3e8a4c1 c36c3e31 00000000 4384bdf0 c267bdeb c493b8c5 00000000 434d5cc0 44d0e5aa c4853e30 00000000 431cc55d 44931e68 441ac416 00000000 41f9f762 42aaa667 451a287a 00000000 435b82a8 c2e05e61 428a9af2 00000000 41a6f9c2 c2d13bc0 c263dd59 00000000 4326c6be c1ef40a8 c4b959d8 00000000 433d12fb 44b6f55c c45ad419 00000000 435437dd 436d025d 430584d1 00000000 4342e9d6 4134aa15 44f503ca 00000000 4282e821 c4f1e75e 448bf8c7 00000000 438b1389 c4f32e2f c48da5f8 00000000 43918f59 410044d6 c467d3e1 00000000 43368b68 45038da0 c49338f4 00000000 4320a42a 44cbc2a4 44754eac 00000000 432d7ed7 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000067 43820000 3f333333 40800000 42f00000 3f800000 3f19999a 3f4ccccd 40000000 -> 3f1e4052 400b2c47 3f1e4052 3f64c232", + "c39990b6 44556770 42b60000 4395611d 41da1945 00000000 42200000 43451e70 43f0985d 00000000 42a00000 c3eefbcc 440d3b9b 00000000 42f00000 c46a16b0 c353c158 00000000 43200000 c3963036 c48ea41b 00000000 43480000 44819049 c46b45b8 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f0ba4ca 3f37821e 3f0ba4ca 3ec3cce4", + "44ae499b c486b7ec 43360000 42200000 c1f00000 40e00000 42b40000 42a00000 c2700000 40e00000 42b60000 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000000 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3ed4fe49 3ef4a9f0 3ece05b5 3f5d5ece", + "c3c88386 c4ae8b7d 43290000 4393dcef 4249d606 00000000 42200000 42efed5f 43fcfc8d 00000000 42a00000 c414fba2 43db5ab6 00000000 42f00000 c44e8974 c3f47a9f 00000000 43200000 431c05e9 c4923478 00000000 43480000 44a8b2a8 c3ba2991 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 401363df 402e91e8 4017b8fc 3f354648", + "c41ed54f 440275ba 430f0000 42c955dd 4167e921 00000000 43886261 4414d089 44fe29ae 00000000 43673642 c2c81a54 42ace5f4 00000000 439426a0 c49baee3 c40ef3e3 00000000 436a5d36 40abfc88 c500a4bb 00000000 4270fd48 450508c3 c470f483 00000000 42261132 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 0e736390 8ea24260 40000000 -> 3e835eaf 3f1c3d23 3e83da73 3f30e753", + "c4912430 c319be2d 43360000 439385c6 42593240 00000000 42200000 42d589da 43fe75db 00000000 42a00000 c4192560 43cf91de 00000000 42f00000 c447e777 c404cf31 00000000 43200000 4367aa89 c490a122 00000000 43480000 44abcfbb c3850413 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e96dbc2 3f6ae035 3e96dbc2 3d55d830", + "c48679bc c368162d 43290000 4393dcef 4249d606 00000000 42200000 42efed5f 43fcfc8d 00000000 42a00000 c414fba2 43db5ab6 00000000 42f00000 c44e8974 c3f47a9f 00000000 43200000 431c05e9 c4923478 00000000 43480000 44a8b2a8 c3ba2991 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3e3a5536 3f230518 3e3a5d5d 3f0c344c", + "c393f3e7 4451ca67 436a0000 4391e979 428b1f4a 00000000 42200000 4255709c 44015052 00000000 42a00000 c4276942 439d7610 00000000 42f00000 c4282b7a c42b3a47 00000000 43200000 44025535 c48452e4 00000000 43480000 44adb971 4328bad4 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f248890 3f2dab54 3f2474fb 3e90563c", + "43d0d786 c3b15929 431c0000 45177f16 43be9dc8 00000000 42e96160 43941c64 448bde40 00000000 432142b0 c4e4a17d 44b6797a 00000000 4395e41d c4be7d5f c447825f 00000000 437befae 43006cf1 c4ed126c 00000000 4348ba16 4499f0e8 c3decf37 00000000 4373b89b 446310f7 446df51f 00000000 43616394 c3e930fe 448c3849 00000000 43570ded c425f77f 415cbaca 00000000 4379e329 c37dab31 c40844b1 00000000 42121164 4405baec c41857e7 00000000 438eb001 43af5d9e 42dd526a 00000000 43736396 415498c8 42f27678 00000000 4305fa90 c4c73a52 44663dfc 00000000 4351e9e4 c4765a39 c434638d 00000000 42f48057 43d89d07 c4f55822 00000000 42f002b0 43b87622 c293b121 00000000 4344dd5f 4283b2b6 42bb7d98 00000000 428f0f3a c3e392c5 443c438c 00000000 42d66a92 c415f284 c29b6df8 00000000 438c93ac c39615fc c47f3f53 00000000 434bb095 43e7cf8e c3c38bb6 00000000 43797ec1 43d2d5a4 434e6e92 00000000 434b939d c2517709 44a1b021 00000000 425921d2 c3d0fa98 432432b0 00000000 4322d3d5 c43c4e1e c43ae79d 00000000 42c818b0 43885931 c43169f9 00000000 43367783 43988583 c16a17f9 00000000 41e9d2ca 43938797 4413df43 00000000 4347fc27 c44de9c1 4477d4bb 00000000 43275ff8 c4360b84 c3503165 00000000 43958e7a c3035d9f c46f6dd6 00000000 42ffb68b 44e3cc35 c48c0356 00000000 42747dfc 44b30c73 447790fc 00000000 43847af8 c3ae6426 44e2954b 00000000 42c5125d c471c2a6 435d07b4 00000000 438b4bea c469983e c49d08ce 00000000 42c2a43a 444f16b3 c4b65213 00000000 43473e1c 44e84e39 433da9ad 00000000 42cb7d94 43fd5fa9 44c3a953 00000000 42edf85d c4d4ffbd 44bdcf04 00000000 433cceb2 c49ccb02 c40f19ea 00000000 438fff72 42009e82 c516ef58 00000000 4322c8e9 4388aa20 c2e8148c 00000000 4329c2e4 44807843 44718a9d 00000000 43923c46 c44653b2 450c49f2 00000000 43530152 c5004da6 431a6828 00000000 435384d0 c445becc c4b96c93 00000000 43056080 43f996cd c41ec6e9 00000000 437b3d8f 4512fba5 4416f534 00000000 41afdf03 43c5e60a 4515fb96 00000000 434267b1 c45b63c7 440f314b 00000000 438317f4 c3b50cd4 c36c11c1 00000000 43198dd7 438b8cb9 c4d435b8 00000000 4395daa0 450c2294 c4103c3d 00000000 4310b851 43fabe3d 441f5733 00000000 438dda2e c492bdcc 4509c59a 00000000 426edada c4c50d95 c2eb820c 00000000 434fe262 c3ca8025 c48f0198 00000000 43051e0f 4449f67c c43e0eab 00000000 42e637d8 436b4625 42c77a3a 00000000 4276ed43 4144d627 445e3f43 00000000 43673823 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000003e 43820000 3f333333 40800000 42f00000 3f800000 40400000 40800000 40000000 -> 3f8c73ec 3fbbefbe 3f92298b 3f5bd7c3", + "44073ea3 44419428 42820000 4395aee9 419be3e3 00000000 42200000 435ddcf5 43eb25ad 00000000 42a00000 c3d83f39 44161d45 00000000 42f00000 c46e51cd c2e2cfad 00000000 43200000 c3dee2bc c48891ed 00000000 43480000 445b6d3e c4885676 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3e286a8c 3f129894 3e286a8c 3e579118", + "44727c07 43d9bda1 43770000 43917292 4292b29b 00000000 42200000 421f9458 44019de9 00000000 42a00000 c42a5a82 43904969 00000000 42f00000 c41f0af1 c433bcb0 00000000 43200000 44133f63 c47f9f80 00000000 43480000 44ab8d80 438a4153 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3fe16bae 3ff604c7 3fe1b695 3da8dc20", + "c3b1504b c4202840 42820000 44156de1 421ba029 00000000 434f00e7 445c3f41 44e96f35 00000000 431c8caa c499aabf 44d5585a 00000000 422d12e6 c4c2af93 c33948da 00000000 4240ba82 c422dd26 c4c795c4 00000000 41b300e8 44885651 c4a96c22 00000000 4350cbae 4380778e 423256a2 00000000 439449f1 444141dd 450b3e12 00000000 4386bac9 c4330ca9 4447aa04 00000000 43447e00 c50fdd2c c403d787 00000000 437a5a18 c35f23af c441943d 00000000 43475fa3 44745115 c474cae0 00000000 4311b440 446d34f5 4387b755 00000000 43659469 4364c9c5 4477701c 00000000 434fca38 c37d07db 4363cb9a 00000000 42ffd319 c4bb9e31 c40161ed 00000000 42f2cf35 c3a6538d c4ece433 00000000 42e11b9a 446b954b c43e5581 00000000 4372eb3d 44ae4a80 440d6f01 00000000 438c9a0e 431d801d 44a2ca8a 00000000 43937066 c48cb5c9 444b8844 00000000 42a7c0be c3817153 c2f307cb 00000000 42dc2934 c0f64bb7 c2e59a15 00000000 430d49c2 44e3425d c4928bf1 00000000 434447f8 443ab1bd 43c83ee7 00000000 431334e9 418e3837 44a42554 00000000 4355a6dd c4bfbb4c 445b37c3 00000000 43308cae c5049496 c4a0fe92 00000000 4332d74a 4185c2d5 c3d19267 00000000 42f70e88 43ab538f c32c4da5 00000000 42309a1c 44b81fe0 447b6e8c 00000000 438dc407 c116aa8f 42c9511b 00000000 42cb37a7 c46c8481 43cf0390 00000000 42dbcb8e c4e3dc35 c4ae1d16 00000000 436233f9 4346a9b7 c4a813a5 00000000 42722476 444314cd c3927675 00000000 431848ae 439893b8 43820e96 00000000 43907ac8 c31c11cb 44406306 00000000 4219e14b c4ad0684 43da6d06 00000000 429f4d2c c452c790 c4480d7a 00000000 438d1754 440c030f c5071bb9 00000000 43669170 4468f19a c37033f8 00000000 4348d8ed 44be13ac 44c8c00c 00000000 438bf450 c40093b2 44cada80 00000000 42988686 c45f6b59 43342019 00000000 43876a16 c488f2b7 c4a10da3 00000000 42a0b690 443529b8 c4f06bd7 00000000 43093a74 443f1603 c2dffb3b 00000000 433ae0fc 43c3eddd 44008666 00000000 437016ef c46b1f78 4505e0b8 00000000 4353dbfa c4a778a2 42f76c16 00000000 425a0f44 c346017c c3916021 00000000 428551da 434dbae3 c3cbf3c4 00000000 41ea213b 44b639f0 c2619a75 00000000 4361806a 43c3f43f 4421ceee 00000000 438bb21c c25ad087 42bed8c7 00000000 438acf91 c5114ba7 c20916cc 00000000 428dcb36 c387506c c3fd0b3e 00000000 438eecf0 444b24dc c49d1988 00000000 42ee8fbb 4487a9ad 4294271c 00000000 4314e800 4430bf76 44bcde67 00000000 435bb87a c41af08d 4455b0fc 00000000 4344143f c49bdd86 c318523e 00000000 4234def9 c41d4c77 c4c283d7 00000000 4359e291 44885422 c4a85334 00000000 43551010 4501fa86 43b7cf7f 00000000 436d95f1 437aba22 4436810e 00000000 43681686 c4388b1c 444c7e37 00000000 436a58cf c4c945be c3bb1f51 00000000 4293de80 c3b119a5 c49b7a4e 00000000 43808c48 442ba5ff c42ae77f 00000000 438cb89b 450b9e5c 4421aaa0 00000000 43074d09 43f8cd80 45087ffd 00000000 43640665 c413a2bd 440412d8 00000000 43453a3f c414f344 c34f889c 00000000 42e13733 c1b5b819 c303d844 00000000 43843bdb 4442b199 c41c4a09 00000000 43185bfa 43232fc1 42859eb1 00000000 4375958a 43572a30 44e46d3c 00000000 43194b4c c4b104cd 447e5c25 00000000 4211a892 c4622e75 c3d61197 00000000 438253a4 c1692a22 c3641e0e 00000000 43378b90 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000052 43820000 3f333333 00000000 42f00000 3d4ccccd 40400000 40800000 3f800000 -> 3ed38585 3efd08fe 3ed38585 3f2ddd54", + "43c9061d c4b347ad 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 405ea9f8 40a107d2 405ea9f8 3e4c1fc4", + "44860440 43427874 421c0000 43a7e240 4151a010 00000000 435d82f2 446aec3b 44dabe01 00000000 43941ad7 c472bf7a 44c7a9bd 00000000 4362dd33 c4fcf299 c1e93fff 00000000 41d774ae c41c739b c4897490 00000000 42ebc8f9 44566377 c4ba8565 00000000 43912084 448549ee c12dc7fd 00000000 437606a3 446d7c54 44c534a9 00000000 433f4b18 c2bc12e4 432d5c2a 00000000 4287cd32 c4a4b7f7 423762fa 00000000 430ecce6 c4253a73 c481dddc 00000000 4320b77f 447bae74 c4f640cf 00000000 42e83826 445ad2c0 c2501c86 00000000 434e154b 43414272 438ff499 00000000 42552110 c46c7ea1 44f626a8 00000000 4370ff75 c3279083 4161a3c9 00000000 4342f07c c29f19bd c2e0de60 00000000 4376b146 43cd0c1a c463986d 00000000 42d6c9c0 43126ee1 c17f5835 00000000 4362cb6c 448be706 44bbc406 00000000 438e7411 c38b243f 44252c33 00000000 42ec597a c4772acb 43046c6b 00000000 43591bd7 c4afe8e5 c4e05b87 00000000 4259a9ca 443de0a0 c4f1dc09 00000000 437d35e2 448fe19c c33716b6 00000000 427ae77e 4425509f 44487d28 00000000 42630588 c43daa32 45021d55 00000000 430943ee c39f6ec6 426b2c4f 00000000 433ad1ba c4ad2566 c4c7c4aa 00000000 430ff4c4 4406e8dd c4c847a1 00000000 422154be 44c6f550 c3a71218 00000000 435328f7 439fd7f8 43af820d 00000000 4356f28e c380cd62 444ffcf5 00000000 4208b9e1 c510b43f 44087429 00000000 433a0cd9 c444d51f c44db962 00000000 4307c9d4 43cf008e c4b6efe8 00000000 42d11891 448987a8 c3900e24 00000000 433141c8 43bddcda 43bce950 00000000 425741ff c2cb10d6 43c5ea77 00000000 428aaa15 c48948ff 439e536d 00000000 42986e39 c4c010b8 c4b5ed21 00000000 42bf27fb 43c119e1 c4d17a98 00000000 435c7b67 447b845a c39e87b0 00000000 4387991e 44aee142 449dac4c 00000000 433b22f5 c3b65fa1 44debc7a 00000000 436e0108 c491f4ce 43c7e74f 00000000 43358fef c355e8b0 c33787bd 00000000 434e8ba1 4314eb2c c44fc1f8 00000000 4334cff2 4404df26 c344b664 00000000 4351c2b6 444547a3 44210324 00000000 43821f12 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000032 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3f1d126f 3fd2284a 3f1d126f 3e9eccd8", + "43c9061d c4b347ad 42500000 4395cc18 41797ccf 00000000 42200000 436a03b0 43e82f0d 00000000 42a00000 c3cc6067 441a3747 00000000 42f00000 c46f7893 c27ed10d 00000000 43200000 c400f2f1 c484a98e 00000000 43480000 4445832e c49078e1 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 405ea9f8 40a107d2 405ea9f8 3e4c1fc4", + "c393f3e7 4451ca67 436a0000 4391e979 428b1f4a 00000000 42200000 4255709c 44015052 00000000 42a00000 c4276942 439d7610 00000000 42f00000 c4282b7a c42b3a47 00000000 43200000 44025535 c48452e4 00000000 43480000 44adb971 4328bad4 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 00000000 42f00000 3d4ccccd 3f19999a 3f4ccccd 3f800000 -> 3f248890 3f2dab54 3f2474fb 3e90563c", + "c2c4eae7 43f506ec 41500000 42eee7f9 3fc6c7f7 00000000 43155d02 43aa791d 440ca969 00000000 42f4feab c2565feb 42d3f476 00000000 430f3de8 c44b36fd 42920b17 00000000 430abea2 c3fca6dd c42713ca 00000000 42ed6e5e 444508a1 c500abf5 00000000 434b32da 4510ada6 c3e13851 00000000 41c1b3b6 43db16fc 43eb2f77 00000000 436a7a27 c336f21f 4429dccc 00000000 433e040a c50aee9a 4428bb6f 00000000 43123f86 c4bca552 c4a4dcd0 00000000 43357154 41d39a42 c3237575 00000000 433e7571 44fc28f2 c453a970 00000000 43487300 43c1218b 43889b90 00000000 42d4b1ec c20508ab 440f9c15 00000000 430a84d7 c4534fef 43e6dc4e 00000000 43642f26 c43891f0 c3cff4cf 00000000 437695c9 c28322c8 c4b6fc6d 00000000 433fda4c 446b0795 c421ad0a 00000000 438e2abd 44a74cd6 44119ac1 00000000 43673587 43145807 4479dc02 00000000 4390362b c4874d0b 44665133 00000000 4379d91f c4628a9b c3900fe9 00000000 4364cf27 c29bb885 c3987f8c 00000000 432cbd03 44bba1db c4c435a7 00000000 438ca0ba 43815319 42576490 00000000 43446be8 4291e7ef 43464abc 00000000 41c47fbb c4a7c537 44d7f69b 00000000 430cd3f9 c48e2727 c2ea559b 00000000 4342a0cd c40dda54 c490ecf3 00000000 42f37a7b 43cf5092 c4261f10 00000000 439499c4 44209a47 3d42454e 00000000 4385c7ee 44a4446a 4503abb1 00000000 426556f0 c3cae7d1 444f3928 00000000 426384f0 c4919368 42ef9ff3 00000000 433f7ab0 c409980e c4312bff 00000000 42d42efd 42888a43 c3397ad8 00000000 42884f15 438505a0 c25d6398 00000000 437dbdbc 42e07479 42eac8f5 00000000 429b9b5f c32fc572 442c071e 00000000 425b0b59 c4aa9594 43d8d84b 00000000 433ecaeb c45e6166 c43d54c5 00000000 42bc6a60 430bdcac c46b5645 00000000 4360471b 44cb3f68 c430d1e3 00000000 42cd4326 44f271c4 44a6d41e 00000000 4269daa6 c1be4242 44044fbc 00000000 4376d497 c47fef4a 441021c3 00000000 4299c4ed c4869ae8 c4131be2 00000000 430102b0 c2d647c9 c4e7e898 00000000 434e9995 44d50443 c496a03b 00000000 42a3ddc6 4475ece6 43ce832b 00000000 439016bc 42580c4e 43a70c1a 00000000 42b47ae4 c4912868 447da3d4 00000000 43691077 c4b524bb c3dc1d23 00000000 43846a1a c419cae2 c50ee0aa 00000000 41eea9c8 4436eb69 c4444cbf 00000000 42a7d109 44721a85 433c96f0 00000000 42f85505 44364675 44ee2c6c 00000000 4350eb0f c4544c95 448c5994 00000000 43908968 c4aa9877 c2f59a64 00000000 42bb7a20 c4015a59 c47fe0eb 00000000 42057ef4 439197a8 c3f02f43 00000000 42d4ea57 448e7e55 c16a7013 00000000 4326302c 44920d37 44e3892a 00000000 437e81df c43f1763 44c9b81f 00000000 4353069e c3ab6b55 421f058f 00000000 42f15c9b c41d2dc2 c4451443 00000000 41ea0f77 44188e31 c4d7cc5f 00000000 433b36d7 44a1c3eb c38f5c73 00000000 4294c6c6 44944b29 44972898 00000000 433a4c6a c2cd10df 43d4193b 00000000 437a5f32 c45f3cb8 43944567 00000000 438896ce c4b29ebc c4942233 00000000 438f1dca 431b5106 c48f6605 00000000 4224f67c 446ec2c7 c3d71917 00000000 4372947e 44dceb32 4493d872 00000000 436c1188 c15b8bce 43d67718 00000000 433217e4 c4d67f77 4478f370 00000000 42eedc34 c4d5f28c c462b04c 00000000 43715c03 c3117b46 c5008e07 00000000 4228320e 44e4dc7d c4a64f00 00000000 436685b5 43edb885 43406f21 00000000 42bb0017 43c98feb 4510025c 00000000 42037722 c4c71af8 44b28a94 00000000 42e45c18 c4c784d8 c3e73882 00000000 429e4431 c3067825 c3ed90f4 00000000 42ec5e9f 44088311 c4165968 00000000 438cf348 43c2a417 428d31d6 00000000 433fc322 4423d105 44ce0844 00000000 42c96198 c45c0bea 449572cc 00000000 431b1b04 c3934212 c1b555c8 00000000 436f71be c4067849 c480d627 00000000 438909c0 4485d74e c4e360af 00000000 42e10fb9 441e6793 c182b42c 00000000 4377e0d8 43bf933c 4411119f 00000000 42f50dcb c45a3376 44ee3fe0 00000000 435d9dba c478fa0f 43008d5c 00000000 4337ebfd c48b8ee3 c4aa6b47 00000000 4300b9d4 44055f07 c4c4b7c0 00000000 42326b7a 4513e671 c40b1ea6 00000000 43540ccb 437305e6 43716547 00000000 4244da40 c3791ab9 44888732 00000000 428ecedc c4bea256 44041cd2 00000000 431e40ad c471197b c442be9e 00000000 4299001a 430cb168 c48fdc5b 00000000 428812d8 44be2c6c c4314673 00000000 43199e43 44006500 43a715fb 00000000 42e397ac c23e075f 451bd269 00000000 4253bd6f c434a82e 43d7f722 00000000 42bc316e c478edc8 c3ff9127 00000000 433cb3f8 c32d4310 c5015367 00000000 41f07783 4379ec40 c33a98eb 00000000 42c75d3c 446b61db 43b77ec5 00000000 4310539a 43e187ad 4515b50a 00000000 435b2e52 c3fb2b86 43e727bb 00000000 4361c3b4 c5113cd8 c4203458 00000000 433ea9f4 c3750f00 c44e43a6 00000000 4386bee6 4428377f c43e264e 00000000 4392ca80 446cd97b 431f3150 00000000 42b921d3 4391a70c 443081a6 00000000 42e8abe5 c49cc4ea 44dad062 00000000 41ce3d24 c477f0ba c27dc7bc 00000000 4225afd3 c4555d9e c4c623ca 00000000 42ee9309 44232402 c48ec44c 00000000 41fd8598 44bcc9e3 c269f325 00000000 4334fbf5 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000007d 43820000 3f333333 3fcccccd 42f00000 3eb33333 7149f2ca 71c9f2ca 40000000 -> 3f719f7c 401e9cc1 3f719f7c 3e90563c", + "433b2c46 43d3d981 43500000 4392c452 4277cdda 00000000 42200000 42a05894 44007212 00000000 42a00000 c420c473 43b71276 00000000 42f00000 c439096c c418d825 00000000 43200000 43bdd9f4 c48ba7b0 00000000 43480000 44aee446 c244ff0a 00000000 43700000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000006 43820000 3f333333 40800000 49742400 3f800000 3f19999a 3f4ccccd 40000000 -> 3f9d1e4b 40662a62 3f9d1e4b 3f44b788", + "c486ccb7 4464268f 42b60000 44088700 42475598 00000000 43258de7 44372289 44df86e2 00000000 43904267 42f00000 c2b40000 40e00000 42b80000 43200000 c2f00000 40e00000 42ba0000 43480000 c3160000 40e00000 42bc0000 43700000 c3340000 40e00000 42be0000 438c0000 c3520000 40e00000 42c00000 43a00000 c3700000 40e00000 42c20000 43b40000 c3870000 40e00000 42c40000 43c80000 c3960000 40e00000 42c60000 43dc0000 c3a50000 40e00000 42c80000 43f00000 c3b40000 40e00000 42ca0000 44020000 c3c30000 40e00000 42cc0000 440c0000 c3d20000 40e00000 42ce0000 44160000 c3e10000 40e00000 42d00000 44200000 c3f00000 40e00000 42d20000 442a0000 c3ff0000 40e00000 42d40000 44340000 c4070000 40e00000 42d60000 443e0000 c40e8000 40e00000 42d80000 44480000 c4160000 40e00000 42da0000 44520000 c41d8000 40e00000 42dc0000 445c0000 c4250000 40e00000 42de0000 44660000 c42c8000 40e00000 42e00000 44700000 c4340000 40e00000 42e20000 447a0000 c43b8000 40e00000 42e40000 44820000 c4430000 40e00000 42e60000 44870000 c44a8000 40e00000 42e80000 448c0000 c4520000 40e00000 42ea0000 44910000 c4598000 40e00000 42ec0000 44960000 c4610000 40e00000 42ee0000 449b0000 c4688000 40e00000 42f00000 44a00000 c4700000 40e00000 42f20000 44a50000 c4778000 40e00000 42f40000 44aa0000 c47f0000 40e00000 42f60000 44af0000 c4834000 40e00000 42f80000 44b40000 c4870000 40e00000 42fa0000 44b90000 c48ac000 40e00000 42fc0000 44be0000 c48e8000 40e00000 42fe0000 44c30000 c4924000 40e00000 43000000 44c80000 c4960000 40e00000 43010000 44cd0000 c499c000 40e00000 43020000 44d20000 c49d8000 40e00000 43030000 44d70000 c4a14000 40e00000 43040000 44dc0000 c4a50000 40e00000 43050000 44e10000 c4a8c000 40e00000 43060000 44e60000 c4ac8000 40e00000 43070000 44eb0000 c4b04000 40e00000 43080000 44f00000 c4b40000 40e00000 43090000 44f50000 c4b7c000 40e00000 430a0000 44fa0000 c4bb8000 40e00000 430b0000 44ff0000 c4bf4000 40e00000 430c0000 45020000 c4c30000 40e00000 430d0000 45048000 c4c6c000 40e00000 430e0000 45070000 c4ca8000 40e00000 430f0000 45098000 c4ce4000 40e00000 43100000 450c0000 c4d20000 40e00000 43110000 450e8000 c4d5c000 40e00000 43120000 45110000 c4d98000 40e00000 43130000 45138000 c4dd4000 40e00000 43140000 45160000 c4e10000 40e00000 43150000 45188000 c4e4c000 40e00000 43160000 451b0000 c4e88000 40e00000 43170000 451d8000 c4ec4000 40e00000 43180000 45200000 c4f00000 40e00000 43190000 45228000 c4f3c000 40e00000 431a0000 45250000 c4f78000 40e00000 431b0000 45278000 c4fb4000 40e00000 431c0000 452a0000 c4ff0000 40e00000 431d0000 452c8000 c5016000 40e00000 431e0000 452f0000 c5034000 40e00000 431f0000 45318000 c5052000 40e00000 43200000 45340000 c5070000 40e00000 43210000 45368000 c508e000 40e00000 43220000 45390000 c50ac000 40e00000 43230000 453b8000 c50ca000 40e00000 43240000 453e0000 c50e8000 40e00000 43250000 45408000 c5106000 40e00000 43260000 45430000 c5124000 40e00000 43270000 45458000 c5142000 40e00000 43280000 45480000 c5160000 40e00000 43290000 454a8000 c517e000 40e00000 432a0000 454d0000 c519c000 40e00000 432b0000 454f8000 c51ba000 40e00000 432c0000 45520000 c51d8000 40e00000 432d0000 45548000 c51f6000 40e00000 432e0000 45570000 c5214000 40e00000 432f0000 45598000 c5232000 40e00000 43300000 455c0000 c5250000 40e00000 43310000 455e8000 c526e000 40e00000 43320000 45610000 c528c000 40e00000 43330000 45638000 c52aa000 40e00000 43340000 45660000 c52c8000 40e00000 43350000 45688000 c52e6000 40e00000 43360000 456b0000 c5304000 40e00000 43370000 456d8000 c5322000 40e00000 43380000 45700000 c5340000 40e00000 43390000 45728000 c535e000 40e00000 433a0000 45750000 c537c000 40e00000 433b0000 45778000 c539a000 40e00000 433c0000 457a0000 c53b8000 40e00000 433d0000 457c8000 c53d6000 40e00000 433e0000 457f0000 c53f4000 40e00000 433f0000 4580c000 c5412000 40e00000 43400000 45820000 c5430000 40e00000 43410000 45834000 c544e000 40e00000 43420000 45848000 c546c000 40e00000 43430000 4585c000 c548a000 40e00000 43440000 45870000 c54a8000 40e00000 43450000 45884000 c54c6000 40e00000 43460000 45898000 c54e4000 40e00000 43470000 458ac000 c5502000 40e00000 43480000 458c0000 c5520000 40e00000 43490000 458d4000 c553e000 40e00000 434a0000 458e8000 c555c000 40e00000 434b0000 458fc000 c557a000 40e00000 434c0000 45910000 c5598000 40e00000 434d0000 45924000 c55b6000 40e00000 434e0000 45938000 c55d4000 40e00000 434f0000 4594c000 c55f2000 40e00000 43500000 45960000 c5610000 40e00000 43510000 45974000 c562e000 40e00000 43520000 45988000 c564c000 40e00000 43530000 4599c000 c566a000 40e00000 43540000 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 00000002 43820000 3f333333 3fcccccd 42f00000 3eb33333 00000000 00000000 3f800000 -> 3ef8c434 3f32636d 3efbcd58 3e549b04", + "c4b3e76c 444241a0 42500000 435b9579 4136dbcf 00000000 43945431 43041651 43830dcc 00000000 43652355 c48bf352 44d33444 00000000 434dc873 c3000002 c10833d3 00000000 433550ff c28b6e94 c30f7278 00000000 438d43a6 44a4de09 c4f12ff1 00000000 425a0d22 44d428d3 430976c5 00000000 434b973e 441d5713 44a7fc0b 00000000 438e7c40 c4ab19d7 44f2b987 00000000 41e038cc c455d2d5 c2a36170 00000000 43908b8d c3801d60 c40e138a 00000000 431363cc 43396792 c37f2156 00000000 437ac80c 439f85f6 420c7863 00000000 42150b58 4428e36e 44c2bb96 00000000 43837958 c47c7670 44a88b01 00000000 4294d48d c40641aa c285e8ba 00000000 4232d05c c40ca53f c4a8ca3a 00000000 4378763b 42cfefd3 c306ba40 00000000 430371e3 44b979fd 434ebfb9 00000000 43421a7a 42b44286 43616d19 00000000 43047467 c2892c2a 42ac8e8b 00000000 4332087f c4f373b1 c39604df 00000000 42b3908c c4071e02 c4b04c5b 00000000 4347459e 43fd006f c41a827e 00000000 4208fda6 44c75602 43869ead 00000000 42421b44 4351a83b 440ee820 00000000 42cc9909 c48345c8 449bb4d1 00000000 42125362 c4abe6d8 c37c9d2e 00000000 433a98a6 c43a8ecd c5050f9b 00000000 42b796d8 4488f948 c49dcc59 00000000 43638b9c 4518e99d 43f2fa58 00000000 4271681e 4436363e 450837cb 00000000 437c8686 c49f0216 44b1f01c 00000000 438026fe c4af2be6 c395b304 00000000 43814487 c3f349af c4befb18 00000000 428c07fa 4424afd0 c4330845 00000000 42decd7b 4513cf17 44073fe5 00000000 438a0efc 442d8bbd 450f5844 00000000 434b07a5 c493ef20 449c3dfb 00000000 437f587e c4222d07 c31e43fc 00000000 43128220 c4066f1d c4ea31b9 00000000 4340306c 43e81d81 c3ee2e59 00000000 4330577c 4514ae2d 441a3491 00000000 43869616 439ae709 448ea55a 00000000 43226a3e c4068e80 440626bb 00000000 430d975e c49c9b56 c3ac1805 00000000 42dea520 c4161f98 c5129034 00000000 42da3948 44400c36 c43a07ca 00000000 43826b94 44c6d8dc 43e6e324 00000000 438edae5 4396e0d8 449ca83c 00000000 43643dd5 c35d19fc 4350154a 00000000 430efc77 c485b6e4 c3a3a64d 00000000 4312ff68 c3cdea28 c4e43378 00000000 4385fba4 44224024 c4145936 00000000 435e4c43 43a49d73 42d3e418 00000000 438636f8 43ed8fd2 450d12ed 00000000 4210bc80 c2dcc99b 42c41aba 00000000 4299b2ee c50fdfe9 c44262e4 00000000 42fe5060 c3dac9b9 c50be58c 00000000 42f0366f 44ca1d48 c4ae6032 00000000 4382f138 4475cf34 43adfc47 00000000 420467d2 4383e7ac 44b69e10 00000000 42939fb6 c4a5b2bc 448ad7eb 00000000 41f43fa8 c461b848 c3a71faa 00000000 434a4234 c358c6a6 c4a37e3e 00000000 423c3b16 42ae5790 c28ddcb8 00000000 435f71b1 44586d7a 43a75f50 00000000 431dfe64 43126575 44726ffe 00000000 42e181b4 c3da9fe9 43acb878 00000000 436eefe3 c4efcdc3 c4416fe4 00000000 423c53dc c344a113 c4b46166 00000000 435ffd97 44553a65 c4238580 00000000 430092b5 4499e952 440156a4 00000000 430fbb25 42c9a36d 444f404d 00000000 4369e56c c43b5358 440b6b0e 00000000 41cf9cce c5087fe5 c46ebaa1 00000000 42caf529 c21191e4 c3aa0683 00000000 4344d73b 443ee95e c409dbcb 00000000 41f53bb8 44f6e532 44606df7 00000000 42aa10aa 433460d1 44f3d985 00000000 43582457 c48b83c0 44436f9c 00000000 4350ab77 c4098067 c381cd3a 00000000 41ad0134 c32c4d09 c50a24e7 00000000 4293fef2 44bb391d c47e4d73 00000000 432790ce 44ec7b40 4467a0ac 00000000 43470d71 420e374b 440c07c0 00000000 425deb6d c4911239 443effdb 00000000 4366654f c43619f1 c3b8eb31 00000000 434e068d c2a05b66 c4cc6faf 00000000 4291eb66 44b5dd54 c468003e 00000000 42acbd25 44cd3c28 4457e72d 00000000 433ac26f 41e50db8 444eeade 00000000 431d0e95 c3beb1b5 436b9aef 00000000 435bf745 c4afd8d7 c43f8161 00000000 435bc798 c10e3dc0 c3dc6413 00000000 42e0327b 448376b9 c41d3ced 00000000 439027f4 42ccb7fb 4266a7eb 00000000 42561b63 4107706a 44b7ae4c 00000000 4386c984 c49102da 4427d07c 00000000 43041b2c c48de2f6 c4254afa 00000000 42dc4d73 417fe3ca c4e73dfa 00000000 436e328f 44fdd280 c48e0708 00000000 435a40e7 44dfcd51 4486b7c0 00000000 437af18e c22ffde1 44ee8d5d 00000000 42ebac6a c445a9ae 43d5c9a6 00000000 43543326 c45fbee4 c40b1d1a 00000000 43507e5b 425680ee c4b2d793 00000000 432a871c 45066678 c48c65e4 00000000 438c4680 44501288 44059013 00000000 435e3b80 c2e08f5e 45072ba4 00000000 428609a6 c4a3143d 44246ade 00000000 4395e45b c4556a6b c40d5fe9 00000000 4321ff85 4206eb23 c3fe1841 00000000 42ab0018 43addb6e c3290c04 00000000 4308e930 43dc68f5 43969f8a 00000000 430610e6 c2126c9e 43e25da0 00000000 42ae86ef c4c4feae 4438935d 00000000 42ef05dd c486c228 c43def39 00000000 438f4904 4321a791 c4d3da54 00000000 433ab2f6 44c00026 c42d31f8 00000000 42db619b 44f338d9 44b0b3b2 00000000 42c2bff2 c2dd8512 447bddda 00000000 4313918c c505ea13 44685e96 00000000 4372ce6f 459b0000 c5688000 40e00000 43550000 459c4000 c56a6000 40e00000 43560000 459d8000 c56c4000 40e00000 43570000 459ec000 c56e2000 40e00000 43580000 45a00000 c5700000 40e00000 43590000 0000007b 43820000 3f333333 3fcccccd 42f00000 3eb33333 3f19999a 3f4ccccd 3f800000 -> 3f1796ad 3f2abc83 3f147ad8 3f6031e3" + ] + } + ] +} diff --git a/packages/cultmath/tests/CultMath.Tests/stryker-config.json b/packages/cultmath/tests/CultMath.Tests/stryker-config.json new file mode 100644 index 00000000..82c6d79c --- /dev/null +++ b/packages/cultmath/tests/CultMath.Tests/stryker-config.json @@ -0,0 +1,14 @@ +{ + "stryker-config": { + "project": "CultMath.csproj", + "mutate": [ + "**/packages/cultmath/src/CultMath/**/*.cs", + "!**/packages/cultmath/src/CultMath/Swizzles.g.cs", + "!**/packages/cultmath/src/CultMath/*.meta" + ], + "mutation-level": "Standard", + "reporters": [ "progress", "html", "json" ], + "thresholds": { "high": 80, "low": 60, "break": 0 }, + "test-runner": "mtp" + } +} diff --git a/packages/cultmath/tools/compile-glsl.ps1 b/packages/cultmath/tools/compile-glsl.ps1 new file mode 100644 index 00000000..820feaf4 --- /dev/null +++ b/packages/cultmath/tools/compile-glsl.ps1 @@ -0,0 +1,67 @@ +param( + # A GLSL source to append after the generated wrapper's library instead of the call-every-function + # body; tools\compile-glsl.ps1 -Body 'float x = lerp(0.0, 1.0, 0.5);' is the negative control. + [string]$Body = "", + # Also concatenate shaders\CultMath.Phacelle.glsl (MPL-2.0) after CultMath.glsl, as a consumer that + # calls cultmath_phacelle does. Without it the wrapper is the MIT library alone. + [switch]$Phacelle, + # Also concatenate shaders\CultMath.Cycles.glsl (Apache-2.0), as a consumer that calls a cultmath_cycles_ + # function does. + [switch]$Cycles, + [string]$GlslangPath = "" +) + +$ErrorActionPreference = "Stop" + +$repoRoot = Resolve-Path (Join-Path $PSScriptRoot "..") +if (-not $GlslangPath) { + $found = Get-ChildItem -LiteralPath (Join-Path $repoRoot ".tools\glslang\current") -Recurse -File -Include "glslang.exe", "glslangValidator.exe" -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($found) { $GlslangPath = $found.FullName } +} + +# The wrapper is what a WebGL2 consumer writes: its own #version line and precision, then the library +# by string concatenation (GLSL has no #include), then a fragment shader that calls every public +# function once with zero arguments of its declared types. +$library = Get-Content -LiteralPath (Join-Path $repoRoot "shaders\CultMath.glsl") -Raw +if ($Phacelle) { + $library += Get-Content -LiteralPath (Join-Path $repoRoot "shaders\CultMath.Phacelle.glsl") -Raw +} +if ($Cycles) { + $library += Get-Content -LiteralPath (Join-Path $repoRoot "shaders\CultMath.Cycles.glsl") -Raw +} +# A parameter of a struct type the library declares is passed as that struct's constructor with each +# field's zero, read from its declaration (a field may be a struct itself); every other type is its zero. +$structs = @{} +foreach ($declaration in [regex]::Matches($library, '(?s)struct (\w+)\s*\{(.*?)\};')) { + $structs[$declaration.Groups[1].Value] = @([regex]::Matches($declaration.Groups[2].Value, '(?m)^\s*(\w+)\s+\w+\s*;') | ForEach-Object { $_.Groups[1].Value }) +} +function Get-Zero([string]$type) { + if ($structs.ContainsKey($type)) { return "$type($((@($structs[$type] | ForEach-Object { Get-Zero $_ })) -join ', '))" } + if ($type -eq 'int' -or $type -like 'ivec*') { return "$type(0)" } + if ($type -eq 'uint' -or $type -like 'uvec*') { return "$type(0u)" } + return "$type(0.0)" +} +$calls = foreach ($match in [regex]::Matches($library, '(?m)^\w+\s+(cultmath_\w+)\s*\(([^)]*)\)')) { + $arguments = foreach ($parameter in ($match.Groups[2].Value -split ',' | Where-Object { $_.Trim() })) { + Get-Zero (($parameter.Trim() -split '\s+')[0]) + } + " $($match.Groups[1].Value)($($arguments -join ', '));" +} +if (-not $Body) { + $Body = $calls -join "`n" +} + +$wrapper = "#version 300 es`nprecision highp float;`nprecision highp int;`n$library`nout vec4 cultmathColor;`nvoid main()`n{`n$Body`n cultmathColor = vec4(0.0);`n}`n" +$wrapperPath = Join-Path $repoRoot ".tools\glsl\cultmath-wrapper.frag" +New-Item -ItemType Directory -Force -Path (Split-Path -Parent $wrapperPath) | Out-Null +[System.IO.File]::WriteAllText($wrapperPath, $wrapper) +Write-Host "wrapper: $wrapperPath ($(@($calls).Count) functions)" + +if (-not $GlslangPath -or -not (Test-Path $GlslangPath)) { + throw "glslang not found. Run tools\get-glslang.ps1 first or pass -GlslangPath." +} + +& $GlslangPath -S frag $wrapperPath +if ($LASTEXITCODE -ne 0) { + throw "glslang failed with exit code $LASTEXITCODE." +} diff --git a/packages/cultmath/tools/compile-glsl.ps1.meta b/packages/cultmath/tools/compile-glsl.ps1.meta new file mode 100644 index 00000000..f8a18295 --- /dev/null +++ b/packages/cultmath/tools/compile-glsl.ps1.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 81a35b09c28246fe8d52cf8996540a46 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/tools/compile-hlsl.ps1 b/packages/cultmath/tools/compile-hlsl.ps1 new file mode 100644 index 00000000..6e19ec82 --- /dev/null +++ b/packages/cultmath/tools/compile-hlsl.ps1 @@ -0,0 +1,42 @@ +param( + # The HLSL files to compile, each as a lib_6_3 library with its own directory as the include path. + # Default: both copies of CultMath.hlsl (the canonical one and the Unity package's byte copy). + # tools\compile-hlsl.ps1 -ShaderPath is the negative control. + [string[]]$ShaderPath = @(), + # The dxc to run. Default: the x64 install get-dxc.ps1 makes; it is never searched for, so a dxc + # that cannot launch (one built for another architecture) is an error, not a skipped check. + [string]$DxcPath = "" +) + +$ErrorActionPreference = "Stop" + +$repoRoot = Resolve-Path (Join-Path $PSScriptRoot "..") +if (-not $DxcPath) { + $DxcPath = Join-Path $repoRoot ".tools\dxc\current\bin\x64\dxc.exe" +} +if (-not $ShaderPath) { + $ShaderPath = @( + (Join-Path $repoRoot "shaders\CultMath.hlsl"), + (Join-Path $repoRoot "unity\org.gamecult.cultmath\Shaders\CultMath.hlsl")) +} +if (-not (Test-Path -LiteralPath $DxcPath)) { + throw "dxc not found (parameter DxcPath). Run tools\get-dxc.ps1 first or pass -DxcPath." +} + +$outputDirectory = Join-Path $repoRoot ".tools\hlsl" +New-Item -ItemType Directory -Force -Path $outputDirectory | Out-Null + +$index = 0 +foreach ($shader in $ShaderPath) { + $index++ + if (-not (Test-Path -LiteralPath $shader -PathType Leaf)) { + throw "shader not found (parameter ShaderPath, entry $index)." + } + $shaderFile = Get-Item -LiteralPath $shader + $output = Join-Path $outputDirectory "$index-$($shaderFile.BaseName).dxil" + & $DxcPath -T lib_6_3 -HV 2021 -WX -I $shaderFile.DirectoryName $shaderFile.FullName -Fo $output + if ($LASTEXITCODE -ne 0) { + throw "dxc failed with exit code $LASTEXITCODE (parameter ShaderPath, entry $index)." + } + Write-Host "compiled shader $index of $(@($ShaderPath).Count) (lib_6_3, -HV 2021, -WX)" +} diff --git a/packages/cultmath/tools/compile-hlsl.ps1.meta b/packages/cultmath/tools/compile-hlsl.ps1.meta new file mode 100644 index 00000000..d59a4297 --- /dev/null +++ b/packages/cultmath/tools/compile-hlsl.ps1.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3f6c1e7a9b2d4c58a0e4d7b1c95f2a86 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/tools/cycles-oracle/README.md b/packages/cultmath/tools/cycles-oracle/README.md new file mode 100644 index 00000000..5e60d201 --- /dev/null +++ b/packages/cultmath/tools/cycles-oracle/README.md @@ -0,0 +1,70 @@ +# Cycles oracle + +`oracle.py` produces the fixtures that `CyclesOracleTests` holds `math.cycles_*` to: for each Cycles node +CultMath ports, the node's results as Blender's own Cycles computes them. + +## Run + +``` +CYCLES_CPU_NO_AVX2=1 blender --background --factory-startup --python oracle.py -- [ ...] +``` + +The fixture directory is `tests/CultMath.Tests/fixtures/cycles-oracle`. Families are `math`, `map-range`, +`clamp`, `mix`, `rgb-to-bw` and `ramp`; with none named, all are written. The tool is a Blender Python +script and runs only under Blender, never under a plain Python. + +## The pin + +It refuses to run under any Blender but **5.2.2 LTS, build hash `d13f752e3b9c`**, exits nonzero and names +the version and build it found beside the ones it needs. Blender 5.2.2 is + (`blender-5.2.2-linux-x64.tar.xz`). The platform is Linux x64: the fixtures reproduce +byte for byte only there, and the Steam/Windows build is another build (see below). The fixtures record the +version, the hash and the platform they were written on, as provenance. + +## The reference and other builds + +Ruling `cultmath-tapes:ruling:cycles-kernel-reference-ruled`: CultMath's Cycles converters mean Cycles' formulas +evaluated with IEEE single rounding per operation, and the Linux SSE4.2 oracle stays their bit-exact witness. +Every other Cycles build (AVX2 FMA-contracted, MSVC /fp:fast, GPU backends) and CultMath's own HLSL lowering are +held to a stated per-function tolerance class measured on that build; cancellation-prone functions (floored +modulo, wrap) get an error bound relative to |b| and a documented divergence note. + +Cycles' AVX2 CPU kernel is compiled with fused multiply-add, so `a - floor(a / b) b` is one fused operation +there, and CultMath's C# (which fuses nothing) computes the unfused one. The fixtures pin the SSE4.2 kernel, +which has no FMA, by `CYCLES_CPU_NO_AVX2=1`; the tool bakes `10000 mod 0.1` before anything else and exits 4 if +the result is the fused one, so a run on the wrong kernel writes nothing. Other kernels are other builds: +measured under the table below, never written to these fixtures. + +| build | how it was measured | fixture | per-function ulp or bound | +| --- | --- | --- | --- | +| Blender 5.2.2 Linux x64, SSE4.2 kernel (the reference) | `oracle.py` with `CYCLES_CPU_NO_AVX2=1`; `CyclesOracleTests` holds every function to the fixtures | `tests/CultMath.Tests/fixtures/cycles-oracle/*.json` | 0 ulp, every function | +| Blender 5.2.2 Linux x64, AVX2 kernel | the same oracle without the pin, 1024 rows per function, against the single-rounding model `fma(-floor(a / b), b, a)` (wrap: `fma(-range, floor((value - min) / range), value)`) | none committed | floored modulo: at most 2^-23 (\|a / b\| + 1) \|b\|, measured 0.91 of 2^-24 (\|a\| + \|b\|) on 151 rows; wrap: at most 2^-23 (\|value\| + \|min\| + \|range\|), measured 0.77 of 2^-24 on 30 rows; other functions unmeasured | + +The divergence note: a build compiled with fast-math may also move `floor(a / b)` by one near an integer +quotient, so the result differs by a whole \|b\| (wrap: a whole range). Further rows come from follow-up +`cultmath-tapes:follow_up:cycles-tolerance-classes`; its per-build fixtures go under +`fixtures/cycles-oracle//` with their tolerances beside `Tolerances` in `CyclesOracleTests`. + +## Method + +Operands go into float, Non-Color input images (channel packed, read with Closest interpolation), three +operands per image. The node under test reads them. One Emit bake per output channel (Cycles on the CPU, 1 +sample, margin 0, no denoising) writes the result to a float image; each pixel is one case. The tool first +checks that a bake returns an operand image bit for bit, and stops if it does not. The fixtures hold the +operands and the results as float32 bit patterns, so a test reads exactly what Cycles computed. + +A Map Range node's Clamp option is baked as the node with Clamp on, which Cycles expands into a Clamp node +of type Range on the result. The ramp family bakes a Color Ramp whose table entries are each read at a `t` +whose product with 255 is the entry's index, so the first 256 cases are the ramp's own table. + +## Fixtures + +Written by this tool and never edited by hand. Rerunning it under the same Blender build on the same +platform rewrites them byte for byte; `CyclesOracleTests` holds every function to them at 0 ulp. Run the +oracle on Yggdrasil-class Linux, never on the workstation. + +## Licence + +`oracle.py` is GPL-3.0-or-later, as a script that runs inside Blender (`bpy`). It ships in no package: the +`GameCult.Math` NuGet package and the Unity package do not contain `tools/`. The fixtures are data it +produced. The Cycles functions they test are Apache-2.0 (`math.Cycles.cs`, `CultMath.Cycles.hlsl`). diff --git a/packages/cultmath/tools/cycles-oracle/oracle.py b/packages/cultmath/tools/cycles-oracle/oracle.py new file mode 100644 index 00000000..b82d623d --- /dev/null +++ b/packages/cultmath/tools/cycles-oracle/oracle.py @@ -0,0 +1,699 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# The Cycles oracle for CultMath's Cycles node semantics (math.Cycles.cs, shaders/CultMath.Cycles.hlsl). +# A Blender Python script, so it is GPL-3.0-or-later; it is a test tool and ships in no package. +# +# blender --background --factory-startup --python oracle.py -- [ ...] +# +# It refuses to run under any Blender but 5.2.2 LTS, build hash d13f752e3b9c. For each family it bakes +# the node under test with Cycles on the CPU and writes tests/CultMath.Tests/fixtures/cycles-oracle/.json. +# Method: operands go into float, Non-Color input images read with Closest interpolation; one Emit bake per +# output channel (1 sample, margin 0, no denoising) writes the node's result to a float image whose pixels are +# the results, bit for bit. The fixtures are this tool's output and are never edited by hand. They witness the +# reference of ruling cultmath-tapes:ruling:cycles-kernel-reference-ruled (one IEEE single rounding per operation, +# the SSE4.2 kernel, CYCLES_CPU_NO_AVX2=1); other kernels are other builds and are never written here. + +import hashlib +import json +import os +import sys + +import bpy +import numpy as np + +PINNED_VERSION = "5.2.2 LTS" +PINNED_HASH = "d13f752e3b9c" +SIDE = 32 +CASES = SIDE * SIDE + + +def refuse_other_blender(): + found = (bpy.app.version_string, bpy.app.build_hash.decode() if isinstance(bpy.app.build_hash, bytes) else bpy.app.build_hash) + if found != (PINNED_VERSION, PINNED_HASH): + sys.stderr.write( + "cycles-oracle: needs Blender %s build %s, found %s build %s\n" % (PINNED_VERSION, PINNED_HASH, found[0], found[1])) + sys.exit(2) + + +refuse_other_blender() + +scene = bpy.context.scene +scene.render.engine = "CYCLES" +scene.cycles.device = "CPU" +scene.cycles.samples = 1 +scene.cycles.use_denoising = False +bpy.ops.mesh.primitive_plane_add(size=2) +PLANE = bpy.context.active_object + + +def by_identifier(sockets, identifier): + """A node's socket by identifier: several data types share one socket name.""" + for socket in sockets: + if socket.identifier == identifier: + return socket + raise KeyError("no socket %s among %s" % (identifier, [s.identifier for s in sockets])) + + +def f32(values): + return np.asarray(values, dtype=np.float32) + + +def bits(value): + return "%08x" % int(np.asarray(value, dtype=np.float32).view(np.uint32)) + + +def rng_for(name): + # One stream per name: a function, a blend mode's second colours (name + "2"), a ramp. Sharing a seed shares the draws. + return np.random.default_rng(int.from_bytes(hashlib.sha256(name.encode()).digest()[:8], "little")) + + +def new_image(name, rgba=None): + image = bpy.data.images.new(name, SIDE, SIDE, alpha=True, float_buffer=True) + image.colorspace_settings.name = "Non-Color" + image.alpha_mode = "CHANNEL_PACKED" + if rgba is not None: + image.pixels.foreach_set(rgba.reshape(-1)) + image.pack() + return image + + +def pack_operands(columns): + """Operand columns (CASES float32 each) to input images of three operands per image.""" + images = [] + for first in range(0, len(columns), 3): + rgba = np.zeros((SIDE * SIDE, 4), dtype=np.float32) + rgba[:, 3] = 1.0 + for k, column in enumerate(columns[first:first + 3]): + rgba[:, k] = column + images.append(new_image("operands%d" % first, rgba.reshape(SIDE, SIDE, 4))) + return images + + +def operand_sockets(tree, images, count): + """One float socket per operand, read from the input images with Closest interpolation.""" + sockets = [] + for image in images: + texture = tree.nodes.new("ShaderNodeTexImage") + texture.image = image + texture.interpolation = "Closest" + separate = tree.nodes.new("ShaderNodeSeparateColor") + tree.links.new(texture.outputs["Color"], separate.inputs[0]) + sockets.append([separate.outputs[0], separate.outputs[1], separate.outputs[2]]) + flat = [socket for triple in sockets for socket in triple] + return flat[:count] + + +def triple_socket(tree, images, first): + """The colour made of operands first, first + 1, first + 2.""" + combine = tree.nodes.new("ShaderNodeCombineColor") + sockets = operand_sockets(tree, images, first + 3) + for k in range(3): + tree.links.new(sockets[first + k], combine.inputs[k]) + return combine.outputs[0] + + +def bake(label, images, build, channels): + """Bakes build(tree, images) once per output channel; returns channels float32 arrays of CASES results.""" + results = [] + for channel in range(channels): + material = bpy.data.materials.new("%s.%d" % (label, channel)) + material.use_nodes = True + tree = material.node_tree + tree.nodes.clear() + output = tree.nodes.new("ShaderNodeOutputMaterial") + emit = tree.nodes.new("ShaderNodeEmission") + tree.links.new(emit.outputs[0], output.inputs[0]) + sockets = build(tree, images) + socket = sockets[channel] + if socket.type == "RGBA" or socket.type == "VECTOR": + separate = tree.nodes.new("ShaderNodeSeparateColor") + tree.links.new(socket, separate.inputs[0]) + # Cycles stores a colour result channel by channel; the channel under test is red. + tree.links.new(separate.outputs[0], emit.inputs["Color"]) + else: + tree.links.new(socket, emit.inputs["Color"]) + target = new_image("%s.%d.out" % (label, channel)) + target_node = tree.nodes.new("ShaderNodeTexImage") + target_node.image = target + tree.nodes.active = target_node + PLANE.data.materials.clear() + PLANE.data.materials.append(material) + bpy.context.view_layer.objects.active = PLANE + PLANE.select_set(True) + bpy.ops.object.bake(type="EMIT", margin=0) + pixels = np.empty(SIDE * SIDE * 4, dtype=np.float32) + target.pixels.foreach_get(pixels) + results.append(pixels.reshape(SIDE * SIDE, 4)[:, 0].copy()) + return results + + +def vector_bake(label, images, build): + """For a node whose result is a colour: one bake per RGB channel via Separate Color.""" + results = [] + for channel in range(3): + def pick(tree, imgs, channel=channel): + color = build(tree, imgs) + separate = tree.nodes.new("ShaderNodeSeparateColor") + tree.links.new(color, separate.inputs[0]) + return [separate.outputs[channel]] + results.append(bake("%s.c%d" % (label, channel), images, pick, 1)[0]) + return results + + +# ---- operand sets ---- + +SPECIAL = [0.0, 1.0, -1.0, 0.5, -0.5, 2.0, -2.0, 3.0, -2.75, 0.1, -0.1, 7.5, -7.5, 1.0e-7, -1.0e-7, 100.0, -100.0, 1.0e4, 0.3, 0.7] +POSITIVE = [0.0, 1.0, 0.5, 2.0, 3.0, 0.1, 10.0, 7.5, 1.0e-3, 100.0, 0.3, 0.7, 2.718281828] +FACTOR = [0.0, 0.5, 1.0, 1.5, -0.5, 0.25, 0.75, 2.0] +COLOR_SPECIAL = [0.0, 0.25, 0.5, 0.75, 1.0, 1.25, -0.25, 0.1, 0.9, 0.3333333, 0.6666667] + + +def sample_columns(name, count, specials, lows_highs, pair_specials=2): + """CASES rows of `count` operands: the specials' product for the first operands, then uniform draws.""" + rng = rng_for(name) + rows = [] + import itertools + lists = [specials[k] if k < len(specials) else None for k in range(count)] + fixed = [lst for lst in lists if lst is not None] + if fixed: + for combo in itertools.product(*fixed): + row = list(combo) + [None] * (count - len(combo)) + rows.append(row) + rows = rows[:CASES] + while len(rows) < CASES: + rows.append([None] * count) + columns = [] + for k in range(count): + low, high = lows_highs[k] + column = np.empty(CASES, dtype=np.float32) + for r, row in enumerate(rows): + column[r] = row[k] if row[k] is not None else rng.uniform(low, high) + columns.append(column) + return columns + + +def random_color_rows(name, extra=0): + """CASES colours: primaries, secondaries, greys, the specials' products, then random with tied channels.""" + rng = rng_for(name) + rows = [] + for r in COLOR_SPECIAL[:5]: + for g in COLOR_SPECIAL[:5]: + for b in COLOR_SPECIAL[:5]: + rows.append((r, g, b)) + for v in COLOR_SPECIAL: + rows.append((v, v, v)) + while len(rows) < CASES: + c = list(rng.uniform(-0.25, 1.25, 3)) + tie = rng.integers(0, 6) + if tie == 0: + c[1] = c[0] + elif tie == 1: + c[2] = c[1] + elif tie == 2: + c[2] = c[0] + rows.append(tuple(c)) + return rows[:CASES] + + +# ---- families ---- + +MATH = [ + # (function, operation, operand count, operand specials, ranges) + ("cycles_divide", "DIVIDE", 2, [SPECIAL, SPECIAL], [(-20, 20)] * 2), + ("cycles_power", "POWER", 2, [SPECIAL, SPECIAL], [(-4, 4), (-4, 4)]), + ("cycles_logarithm", "LOGARITHM", 2, [SPECIAL, SPECIAL], [(0.01, 20), (0.01, 20)]), + ("cycles_sqrt", "SQRT", 1, [SPECIAL], [(-5, 20)]), + ("cycles_inverse_sqrt", "INVERSE_SQRT", 1, [SPECIAL], [(-5, 20)]), + ("cycles_modulo", "MODULO", 2, [SPECIAL, SPECIAL], [(-20, 20)] * 2), + ("cycles_floored_modulo", "FLOORED_MODULO", 2, [SPECIAL, SPECIAL], [(-20, 20)] * 2), + ("cycles_wrap", "WRAP", 3, [SPECIAL[:10], SPECIAL[:10], SPECIAL[:10]], [(-20, 20), (-10, 10), (-10, 10)]), + ("cycles_snap", "SNAP", 2, [SPECIAL, SPECIAL], [(-20, 20)] * 2), + ("cycles_pingpong", "PINGPONG", 2, [SPECIAL, SPECIAL], [(-20, 20)] * 2), + ("cycles_smooth_min", "SMOOTH_MIN", 3, [SPECIAL[:10], SPECIAL[:10], SPECIAL[:10]], [(-20, 20), (-20, 20), (-3, 3)]), + ("cycles_smooth_max", "SMOOTH_MAX", 3, [SPECIAL[:10], SPECIAL[:10], SPECIAL[:10]], [(-20, 20), (-20, 20), (-3, 3)]), + ("cycles_compare", "COMPARE", 3, [SPECIAL[:10], SPECIAL[:10], [0.0, 0.5, 1.0, 1.0e-7]], [(-20, 20), (-20, 20), (0, 2)]), + ("cycles_round", "ROUND", 1, [SPECIAL], [(-20, 20)]), + ("cycles_trunc", "TRUNC", 1, [SPECIAL], [(-20, 20)]), + ("cycles_fract", "FRACT", 1, [SPECIAL], [(-20, 20)]), + ("cycles_sign", "SIGN", 1, [SPECIAL], [(-20, 20)]), + ("cycles_arcsine", "ARCSINE", 1, [SPECIAL], [(-1.5, 1.5)]), + ("cycles_arccosine", "ARCCOSINE", 1, [SPECIAL], [(-1.5, 1.5)]), + ("cycles_arctan2", "ARCTAN2", 2, [SPECIAL, SPECIAL], [(-20, 20)] * 2), +] + +# Operands that must be present as exact pairs whatever the random draws: the quirks the port names. +EXTRA_ROWS = { + "cycles_power": [(-2.0, 1.0e10), (-2.0, -1.0e10), (-2.0, 3.0), (-2.0, 2.0), (-2.0, -3.0), (-2.0, 2147483648.0), (-2.0, -2147483648.0), + (-8.0, 0.3333333), (2.0, 0.0), (0.0, 0.0), (0.0, 2.0), (-0.0, -3.0), (-1.5, 17.0), (-1.5, 16777217.0), + # A base of -1 keeps a finite result for any exponent, so the film shows the exponent past the int range. + (-1.0, 3.0e9), (-1.0, -3.0e9), (-1.0, 2147483648.0), (-1.0, 16777216.0), (-1.0, 16777215.0)], + "cycles_compare": [(0.0, 1.0e-7, 0.0), (1.0, 1.0000001, 0.0), (1.0, 1.0000002, 0.0), (0.0, 1.0e-7, 1.0e-8), (5.0, 5.0, 0.0), (0.0, 2.0e-7, 1.0e-7)], + # Burn with a divisor of exactly 0 (tm + t col2 = 0) and a colour above 1: the result is 1 for the channel Cycles reads + # as 0, and an infinity the film would hide for the others. + "cycles_mix_burn": [(2.0, 1.5, 0.5, 2.5, 0.5, 0.5, 0.5), (0.5, 1.5, 2.0, 3.0, -1.0, -1.0, -1.0)], + # safe_asinf / safe_acosf clamp to [-1, 1]; compatible_atan2 guards only the origin (y = a, x = b). + "cycles_arcsine": [(2.0,), (-2.0,), (1.0,), (-1.0,), (1.0000001,), (-1.0000001,), (1.5,)], + "cycles_arccosine": [(2.0,), (-2.0,), (1.0,), (-1.0,), (1.0000001,), (-1.0000001,), (1.5,)], + "cycles_arctan2": [(0.0, 0.0), (0.0, -0.0), (-0.0, -0.0), (-0.0, -1.0), (0.0, -1.0), (1.0, 0.0), (-1.0, 0.0), (1.0e-7, -1.0e-7)], + "cycles_modulo": [(0.3, 0.1), (-0.3, 0.1), (5.5, -2.0), (-5.5, -2.0), (1.0, 0.0), (1.0e7, 3.0), (7.0, 7.0), (-7.0, 7.0)], +} + +MAP_RANGE = [ + ("cycles_map_range_linear", "LINEAR"), + ("cycles_map_range_stepped", "STEPPED"), + ("cycles_map_range_smoothstep", "SMOOTHSTEP"), + ("cycles_map_range_smootherstep", "SMOOTHERSTEP"), +] + +MIX_MODES = [ + ("cycles_mix_blend", "MIX"), ("cycles_mix_add", "ADD"), ("cycles_mix_mul", "MULTIPLY"), ("cycles_mix_screen", "SCREEN"), + ("cycles_mix_overlay", "OVERLAY"), ("cycles_mix_sub", "SUBTRACT"), ("cycles_mix_div", "DIVIDE"), ("cycles_mix_diff", "DIFFERENCE"), + ("cycles_mix_exclusion", "EXCLUSION"), ("cycles_mix_dark", "DARKEN"), ("cycles_mix_light", "LIGHTEN"), ("cycles_mix_dodge", "DODGE"), + ("cycles_mix_burn", "BURN"), ("cycles_mix_hue", "HUE"), ("cycles_mix_sat", "SATURATION"), ("cycles_mix_val", "VALUE"), + ("cycles_mix_color", "COLOR"), ("cycles_mix_soft", "SOFT_LIGHT"), ("cycles_mix_linear", "LINEAR_LIGHT"), +] + + +def with_extra(function, columns, count): + extra = EXTRA_ROWS.get(function, []) + for r, row in enumerate(extra): + for k in range(count): + columns[k][CASES - 1 - r] = row[k] if k < len(row) else 0.0 + return columns + + +def encode_cases(columns, results): + cases = [] + for r in range(CASES): + cases.append("%s -> %s" % (" ".join(bits(c[r]) for c in columns), " ".join(bits(x[r]) for x in results))) + return cases + + +def family_math(): + functions = [] + for function, operation, count, specials, ranges in MATH: + columns = with_extra(function, sample_columns(function, count, specials, ranges), count) + images = pack_operands(columns) + + def build(tree, imgs, operation=operation, count=count): + node = tree.nodes.new("ShaderNodeMath") + node.operation = operation + sockets = operand_sockets(tree, imgs, count) + for k in range(count): + tree.links.new(sockets[k], node.inputs[k]) + return [node.outputs[0]] + + functions.append({"function": function, "node": "ShaderNodeMath " + operation, "cases": encode_cases(columns, bake(function, images, build, 1))}) + return functions + + +def family_map_range(): + functions = [] + for function, kind in MAP_RANGE: + count = 6 + specials = [SPECIAL[:10], SPECIAL[:5], SPECIAL[:5]] + columns = sample_columns(function, count, specials, [(-20, 20), (-10, 10), (-10, 10), (-20, 20), (-20, 20), (-1, 8)]) + # Rows with From Min equal to From Max, and with From Min above From Max, whatever the draws. + for r in range(8): + columns[2][CASES - 1 - r] = columns[1][CASES - 1 - r] + for r in range(8, 16): + columns[1][CASES - 1 - r], columns[2][CASES - 1 - r] = max(columns[1][CASES - 1 - r], columns[2][CASES - 1 - r]), min(columns[1][CASES - 1 - r], columns[2][CASES - 1 - r]) + for r in range(16, 24): + columns[5][CASES - 1 - r] = float(r - 18) + if kind == "SMOOTHSTEP": + # An overflowing range: from_max - from_min is infinite, and Cycles' smoothstep decides x >= edge1 before dividing. + for r, row in ((24, (3.0e38, -3.0e38, 3.0e38, 0.0, 1.0, 4.0)), (25, (3.0e38, 3.0e38, -3.0e38, 0.0, 1.0, 4.0))): + for k in range(6): + columns[k][CASES - 1 - r] = row[k] + images = pack_operands(columns) + + def build(tree, imgs, kind=kind): + node = tree.nodes.new("ShaderNodeMapRange") + node.data_type = "FLOAT" + node.interpolation_type = kind + node.clamp = False + sockets = operand_sockets(tree, imgs, 6) + for k, identifier in enumerate(["Value", "From Min", "From Max", "To Min", "To Max", "Steps"]): + socket = by_identifier(node.inputs, identifier) + tree.links.new(sockets[k], socket) + return [node.outputs["Result"]] + + functions.append({"function": function, "node": "ShaderNodeMapRange " + kind, "cases": encode_cases(columns, bake(function, images, build, 1))}) + # The Clamp option, on the same operands: a Clamp node of type Range on the result. + def build_clamped(tree, imgs, kind=kind): + node = tree.nodes.new("ShaderNodeMapRange") + node.data_type = "FLOAT" + node.interpolation_type = kind + node.clamp = True + sockets = operand_sockets(tree, imgs, 6) + for k, identifier in enumerate(["Value", "From Min", "From Max", "To Min", "To Max", "Steps"]): + socket = by_identifier(node.inputs, identifier) + tree.links.new(sockets[k], socket) + return [node.outputs["Result"]] + + functions.append({"function": function, "node": "ShaderNodeMapRange " + kind + " with Clamp", + "then": "cycles_clamp_range(result, to_min, to_max)", + "cases": encode_cases(columns, bake(function + ".clamped", images, build_clamped, 1))}) + return functions + + +def family_clamp(): + functions = [] + for function, clamp_type in (("cycles_clamp_minmax", "MINMAX"), ("cycles_clamp_range", "RANGE")): + columns = sample_columns(function, 3, [SPECIAL[:10], SPECIAL[:10], SPECIAL[:10]], [(-20, 20)] * 3) + images = pack_operands(columns) + + def build(tree, imgs, clamp_type=clamp_type): + node = tree.nodes.new("ShaderNodeClamp") + node.clamp_type = clamp_type + sockets = operand_sockets(tree, imgs, 3) + for k in range(3): + tree.links.new(sockets[k], node.inputs[k]) + return [node.outputs[0]] + + functions.append({"function": function, "node": "ShaderNodeClamp " + clamp_type, "cases": encode_cases(columns, bake(function, images, build, 1))}) + return functions + + +def mix_columns(name, blend): + rng = rng_for(name) + colors = random_color_rows(name) + colors2 = random_color_rows(name + "2") + rng.shuffle(colors2) + factors = [FACTOR[r % len(FACTOR)] if r < 8 * 64 else float(rng.uniform(-0.5, 1.5)) for r in range(CASES)] + columns = [f32(factors)] + columns += [f32([c[k] for c in colors]) for k in range(3)] + columns += [f32([c[k] for c in colors2]) for k in range(3)] + return columns + + +def family_mix(): + functions = [] + rng = rng_for("mix-float") + # Mix, Float: a and b in the usual ranges, the factor as in the blend modes. + columns = [f32([FACTOR[r % len(FACTOR)] if r < 512 else rng.uniform(-0.5, 1.5) for r in range(CASES)]), + f32(rng.uniform(-20, 20, CASES)), f32(rng.uniform(-20, 20, CASES))] + images = pack_operands(columns) + + def build_float(tree, imgs): + node = tree.nodes.new("ShaderNodeMix") + node.data_type = "FLOAT" + node.clamp_factor = False + node.clamp_result = False + sockets = operand_sockets(tree, imgs, 3) + for k, identifier in enumerate(["Factor_Float", "A_Float", "B_Float"]): + tree.links.new(sockets[k], by_identifier(node.inputs, identifier)) + return [by_identifier(node.outputs, "Result_Float")] + + functions.append({"function": "cycles_mix_float", "node": "ShaderNodeMix FLOAT", "cases": encode_cases(columns, bake("mix_float", images, build_float, 1))}) + + columns = mix_columns("mix-vector", "VECTOR") + images = pack_operands(columns) + + def build_vector(tree, imgs): + node = tree.nodes.new("ShaderNodeMix") + node.data_type = "VECTOR" + node.factor_mode = "UNIFORM" + node.clamp_factor = False + sockets = operand_sockets(tree, imgs, 1) + tree.links.new(sockets[0], by_identifier(node.inputs, "Factor_Float")) + tree.links.new(triple_socket(tree, imgs, 1), by_identifier(node.inputs, "A_Vector")) + tree.links.new(triple_socket(tree, imgs, 4), by_identifier(node.inputs, "B_Vector")) + return by_identifier(node.outputs, "Result_Vector") + + functions.append({"function": "cycles_mix_vector", "node": "ShaderNodeMix VECTOR UNIFORM", "cases": encode_cases(columns, vector_bake("mix_vector", images, build_vector))}) + + for function, blend in MIX_MODES: + columns = with_extra(function, mix_columns(function, blend), 7) + images = pack_operands(columns) + + def build(tree, imgs, blend=blend): + node = tree.nodes.new("ShaderNodeMix") + node.data_type = "RGBA" + node.blend_type = blend + node.clamp_factor = False + node.clamp_result = False + sockets = operand_sockets(tree, imgs, 1) + tree.links.new(sockets[0], by_identifier(node.inputs, "Factor_Float")) + tree.links.new(triple_socket(tree, imgs, 1), by_identifier(node.inputs, "A_Color")) + tree.links.new(triple_socket(tree, imgs, 4), by_identifier(node.inputs, "B_Color")) + return by_identifier(node.outputs, "Result_Color") + + functions.append({"function": function, "node": "ShaderNodeMix RGBA " + blend, "cases": encode_cases(columns, vector_bake(function, images, build))}) + return functions + + +def family_rgb_to_bw(): + rows = random_color_rows("rgb_to_bw") + columns = [f32([c[k] for c in rows]) for k in range(3)] + # One case per primary pins the scene-linear coefficients. + for k in range(3): + for j in range(3): + columns[j][CASES - 1 - k] = 1.0 if j == k else 0.0 + images = pack_operands(columns) + + def build(tree, imgs): + node = tree.nodes.new("ShaderNodeRGBToBW") + tree.links.new(triple_socket(tree, imgs, 0), node.inputs["Color"]) + return [node.outputs["Val"]] + + return [{"function": "cycles_rgb_to_bw", "node": "ShaderNodeRGBToBW", "cases": encode_cases(columns, bake("rgb_to_bw", images, build, 1))}] + + +# A Blender ramp is sampled at 256 intervals into a table of 257 entries (colorramp_to_array: size + 1 entries +# at i / size), and the kernel reads that table with table_size 257. +RAMP_SIZE = 257 +# A constant ramp whose 32 stops sit half an entry past an entry boundary: its table is the stops' values, so +# a lookup's result names the entry it read. +CONSTANT_STOPS = [((8 * j + 3.5) / (RAMP_SIZE - 1), (j + 1) / 32.0) for j in range(32)] + + +def ramp_cases(rng, boundaries): + """CASES values of t: the floats around each boundary t = i / 255, the specials, then uniform draws.""" + values = [] + for i in boundaries: + t = np.float32(i / (RAMP_SIZE - 1)) + down = [t] + up = [t] + for _ in range(7): + down.append(np.nextafter(down[-1], np.float32(-1.0))) + up.append(np.nextafter(up[-1], np.float32(2.0))) + values += sorted(set(down + up)) + values += [-0.5, -1.0e-7, 0.0, 1.0e-7, 1.0, 1.0000001, 1.5] + while len(values) < CASES: + values.append(float(rng.uniform(-0.25, 1.25))) + return f32(values[:CASES]) + + +def ramp_entry(label, interpolation, stops, boundaries): + rng = rng_for("ramp-" + label) + column = ramp_cases(rng, boundaries) + images = pack_operands([column]) + + def build(tree, imgs): + node = tree.nodes.new("ShaderNodeValToRGB") + ramp = node.color_ramp + ramp.interpolation = interpolation + ramp.elements[0].position = stops[0][0] + ramp.elements[1].position = stops[-1][0] + for position, _ in stops[1:-1]: + ramp.elements.new(position) + for element, (_, red) in zip(ramp.elements, stops): + element.color = (red, 0.0, 0.0, 1.0) + tree.links.new(operand_sockets(tree, imgs, 1)[0], node.inputs["Fac"]) + return [node.outputs["Color"]] + + return {"function": "cycles_ramp_index", "node": "ShaderNodeValToRGB " + interpolation, "table_entries": RAMP_SIZE, + "stops": [[bits(position), bits(red)] for position, red in stops], + "cases": encode_cases([column], bake("ramp-" + label, images, build, 1))} + + +def family_ramp(): + boundaries = [8 * j + 4 for j in range(32)] + return [ + ramp_entry("constant", "CONSTANT", CONSTANT_STOPS, boundaries), + ramp_entry("linear", "LINEAR", [(0.0, 0.0), (1.0, 1.0)], list(range(1, RAMP_SIZE, 17))), + ] + + +# ---- infinite operands ---- + +INF = float("inf") + +# Rows of (function, node, operands) whose operands may be an infinity. The film writes 0 for an infinite operand and +# for an infinite or NaN result, so neither can travel through an image: the operand is made in-kernel (+-1 times +# exp(100), which overflows to +-inf) and the result is read back through three comparisons with 0. +INFINITE = [ + ("cycles_power", "POWER", [ + (-1.0, INF), (-1.0, -INF), (-2.0, INF), (-2.0, -INF), (-0.5, INF), (-0.5, -INF), (-0.0, INF), (-0.0, -INF), + (0.5, INF), (0.5, -INF), (2.0, INF), (2.0, -INF), (1.0, INF), (0.0, INF), (0.0, -INF), (INF, 3.0), (-INF, 3.0), + (-INF, 2.0), (INF, -1.0), (-INF, -1.0), (-INF, INF), (INF, INF)]), + ("cycles_modulo", "MODULO", [ + (INF, 1.0), (-INF, 1.0), (INF, 3.0), (-INF, 3.0), (INF, 0.1), (-INF, 0.1), (INF, -2.0), (5.0, INF), (-5.0, INF), + (5.0, -INF), (INF, INF), (-INF, INF), (0.0, INF), (INF, 0.0)]), +] + +# Map Range, Smooth Step: (value, from_min, from_max, to_min, to_max). +INFINITE_SMOOTHSTEP = [ + (-INF, -INF, 1.0, 2.0, 3.0), (-INF, 1.0, -INF, 2.0, 3.0), (-INF, 1.0, 5.0, 2.0, 3.0), (-INF, -5.0, 1.0, 2.0, 3.0), + (INF, -5.0, 1.0, 2.0, 3.0), (INF, 1.0, -5.0, 2.0, 3.0), (INF, INF, 1.0, 2.0, 3.0), (INF, 1.0, INF, 2.0, 3.0), + (-INF, INF, 1.0, 2.0, 3.0), (-INF, 1.0, INF, 2.0, 3.0), (1.0, -INF, INF, 2.0, 3.0), +] + + +def result_token(value, greater, less, equal): + """A result as the fixture writes it: float32 bits, or inf / -inf / nan where the film showed 0 and the comparisons say why.""" + if bits(value) != "00000000" and bits(value) != "80000000": + return bits(value) + if equal: + return bits(value) + return "inf" if greater else ("-inf" if less else "nan") + + +def infinite_entry(function, node_label, build_node, rows): + count = len(rows[0]) + value_columns = [] + flag_columns = [] + for k in range(count): + value_columns.append(f32([(0.0 if r >= len(rows) else (float(np.sign(rows[r][k])) if np.isinf(rows[r][k]) else rows[r][k])) for r in range(CASES)])) + flag_columns.append(f32([(0.0 if r >= len(rows) else (1.0 if np.isinf(rows[r][k]) else 0.0)) for r in range(CASES)])) + images = pack_operands(value_columns + flag_columns) + + def build(tree, imgs): + sockets = operand_sockets(tree, imgs, 2 * count) + operands = [] + for k in range(count): + hundred = tree.nodes.new("ShaderNodeMath") + hundred.operation = "MULTIPLY" + tree.links.new(sockets[count + k], hundred.inputs[0]) + hundred.inputs[1].default_value = 100.0 + overflow = tree.nodes.new("ShaderNodeMath") + overflow.operation = "EXPONENT" + tree.links.new(hundred.outputs[0], overflow.inputs[0]) + made = tree.nodes.new("ShaderNodeMath") + made.operation = "MULTIPLY" + tree.links.new(sockets[k], made.inputs[0]) + tree.links.new(overflow.outputs[0], made.inputs[1]) + operands.append(made.outputs[0]) + result = build_node(tree, operands) + probes = [] + for operation in ("GREATER_THAN", "LESS_THAN", "COMPARE"): + probe = tree.nodes.new("ShaderNodeMath") + probe.operation = operation + tree.links.new(result, probe.inputs[0]) + probe.inputs[1].default_value = 0.0 + if operation == "COMPARE": + probe.inputs[2].default_value = 0.0 + probes.append(probe.outputs[0]) + return [result] + probes + + value, greater, less, equal = bake(function + ".infinite", images, build, 4) + cases = [] + for r, row in enumerate(rows): + operands = " ".join(("inf" if x == INF else "-inf" if x == -INF else bits(x)) for x in row) + cases.append("%s -> %s" % (operands, result_token(value[r], greater[r] > 0.5, less[r] > 0.5, equal[r] > 0.5))) + return {"function": function, "node": node_label, "cases": cases} + + +def family_infinite(): + def math_node(operation): + def build(tree, operands): + node = tree.nodes.new("ShaderNodeMath") + node.operation = operation + for k, socket in enumerate(operands): + tree.links.new(socket, node.inputs[k]) + return node.outputs[0] + return build + + def smoothstep(tree, operands): + node = tree.nodes.new("ShaderNodeMapRange") + node.data_type = "FLOAT" + node.interpolation_type = "SMOOTHSTEP" + node.clamp = False + for identifier, socket in zip(["Value", "From Min", "From Max", "To Min", "To Max"], operands): + tree.links.new(socket, by_identifier(node.inputs, identifier)) + return node.outputs["Result"] + + functions = [infinite_entry(function, "ShaderNodeMath " + operation, math_node(operation), rows) for function, operation, rows in INFINITE] + functions.append(infinite_entry("cycles_map_range_smoothstep", "ShaderNodeMapRange SMOOTHSTEP", smoothstep, INFINITE_SMOOTHSTEP)) + return functions + + +FAMILIES = { + "math": family_math, + "map-range": family_map_range, + "clamp": family_clamp, + "mix": family_mix, + "rgb-to-bw": family_rgb_to_bw, + "ramp": family_ramp, + "infinite": family_infinite, +} + + +def identity_check(): + """The bake must return an operand image bit for bit, or no fixture means anything.""" + rng = np.random.default_rng(1) + column = f32(rng.uniform(-200, 200, CASES)) + images = pack_operands([column]) + + def build(tree, imgs): + return [operand_sockets(tree, imgs, 1)[0]] + + got = bake("identity", images, build, 1)[0] + if not np.array_equal(got.view(np.uint32), column.view(np.uint32)): + sys.stderr.write("cycles-oracle: the bake does not return its operands bit for bit\n") + sys.exit(3) + + +def kernel_check(): + """The fixtures witness the ruled reference: Cycles' formulas with one IEEE single rounding per operation. + + Ruling cultmath-tapes:ruling:cycles-kernel-reference-ruled. Cycles' AVX2 CPU kernel is compiled with FMA, so + a - floor(a / b) b is one fused operation there and 10000 mod 0.1 is -1.5e-4; the SSE4.2 kernel has none, and + gives the unfused result 0 that CultMath's C# computes. Other kernels are other builds, measured under the + tolerance classes and never written here: run with CYCLES_CPU_NO_AVX2=1. + """ + a = f32([10000.0] * CASES) + b = f32([0.1] * CASES) + unfused = a - np.floor(a / b) * b + images = pack_operands([a, b]) + + def build(tree, imgs): + node = tree.nodes.new("ShaderNodeMath") + node.operation = "FLOORED_MODULO" + sockets = operand_sockets(tree, imgs, 2) + tree.links.new(sockets[0], node.inputs[0]) + tree.links.new(sockets[1], node.inputs[1]) + return [node.outputs[0]] + + got = bake("kernel", images, build, 1)[0] + if not np.array_equal(got.view(np.uint32), unfused.astype(np.float32).view(np.uint32)): + sys.stderr.write("cycles-oracle: this Cycles CPU kernel fuses multiply-adds, which is not the reference of ruling cycles-kernel-reference-ruled; run with CYCLES_CPU_NO_AVX2=1\n") + sys.exit(4) + + +def main(): + argv = sys.argv[sys.argv.index("--") + 1:] + out = argv[0] + wanted = argv[1:] or list(FAMILIES) + os.makedirs(out, exist_ok=True) + identity_check() + kernel_check() + header = { + "oracle": "tools/cycles-oracle/oracle.py (Blender %s, build %s, Cycles CPU, 1 sample, Emit bake, float Non-Color images)" % (PINNED_VERSION, PINNED_HASH), + "blender": PINNED_VERSION, + "build_hash": PINNED_HASH, + "platform": bpy.app.build_platform.decode() if isinstance(bpy.app.build_platform, bytes) else str(bpy.app.build_platform), + "encoding": "each case is 'operands -> results', every scalar a float32 bit pattern in hex, colours flattened as r g b", + } + for family in wanted: + document = dict(header) + document["family"] = family + document["functions"] = FAMILIES[family]() + text = json.dumps(document, indent=1) + "\n" + with open(os.path.join(out, family + ".json"), "w", newline="\n") as handle: + handle.write(text) + print("cycles-oracle: wrote", family, len(document["functions"]), "functions") + + +main() diff --git a/packages/cultmath/tools/device/gen.py b/packages/cultmath/tools/device/gen.py new file mode 100644 index 00000000..52e074c7 --- /dev/null +++ b/packages/cultmath/tools/device/gen.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +"""Spell one compute shader per work item, in HLSL and in GLSL ES 3.10. It compares and judges nothing. + +usage: gen.py + +/manifest.txt (written by GlslMirrorTests.WriteDeviceWork) has one tab-separated line per item: +tag, fixture index, glsl signature, n, words in, words out. For each item this writes .hlsl (cs_6_0, +includes CultMath.hlsl) and .comp (#version 310 es, the committed GLSL files, then the body). An item +reads n argument tuples of 32-bit words from binding 0 and writes n result tuples to binding 1. Struct +arguments and results are built and flattened in field order, from the struct definitions in the HLSL.""" +import glob +import os +import re +import sys + +HLSL_VEC = re.compile(r'(float|int|uint)([234])$') +GLSL_VEC = re.compile(r'(i|u|)vec([234])$') +KIND = {'float': 'f', 'int': 'i', 'uint': 'u'} +ARRAY = re.compile(r'(\w+)\[(\d+)\]$') # an array leaf, vec4[128]: N elements of one leaf type, N x its words + + +def structs(root): + """struct name -> [(field, type, hlsl)] from every shader's struct definitions, GLSL type names.""" + found = {} + for path in sorted(glob.glob(os.path.join(root, 'shaders', '*.hlsl'))): + for name, body in re.findall(r'(?m)^struct (\w+)\s*\{(.*?)\};', open(path).read(), re.S): + found[name] = [(f, t) for t, f in re.findall(r'(\w+)\s+(\w+);', body)] + return found + + +def leaves(t, defs, path=''): + """Flatten a type (GLSL spelling for scalars and vectors, HLSL for struct fields) to scalar leaves: + (accessor path, kind) in field order. A vector's components are path[i]; a mat3 is read row by row.""" + if t in KIND: + return [(path, KIND[t], None)] + m = HLSL_VEC.match(t) or GLSL_VEC.match(t) + if m: + k = {'float': 'f', 'int': 'i', 'uint': 'u', '': 'f', 'i': 'i', 'u': 'u'}[m.group(1)] + return [(path, k, i) for i in range(int(m.group(2)))] + if t in ('mat3', 'float3x3'): + return [(path, 'f', (i, j)) for i in range(3) for j in range(3)] + if t in defs: + out = [] + for field, ft in defs[t]: + out += leaves(ft, defs, path + '.' + field) + return out + raise SystemExit('unsupported type ' + t) + + +def access(leaf, glsl): + path, _, index = leaf + if index is None: + return path + if isinstance(index, tuple): # row i, column j; GLSL matrices index the column first + return '%s[%d][%d]' % ((path,) + ((index[1], index[0]) if glsl else index)) + return '%s[%d]' % (path, index) + + +def read(kind, glsl, word): + if glsl: + return {'f': 'uintBitsToFloat(%s)', 'i': 'int(%s)', 'u': '%s'}[kind] % word + return {'f': 'asfloat(%s)', 'i': 'asint(%s)', 'u': '%s'}[kind] % word + + +def write(kind, glsl, value): + if glsl: + return {'f': 'floatBitsToUint(%s)', 'i': 'uint(%s)', 'u': '%s'}[kind] % value + return {'f': 'asuint(%s)', 'i': 'asuint(%s)', 'u': '%s'}[kind] % value + + +def hlsl_type(t): + m = GLSL_VEC.match(t) + if m: + return {'': 'float', 'i': 'int', 'u': 'uint'}[m.group(1)] + m.group(2) + return 'float3x3' if t == 'mat3' else t + + +def body(sig, n, win, wout, defs, glsl): + m = re.fullmatch(r'(\w+)\s+(\w+)\((.*)\)', sig) + ret, name, params = m.group(1), m.group(2), [p.strip() for p in m.group(3).split(',') if p.strip()] + lines, offset, args = [], 0, [] + for j, p in enumerate(params): + array = ARRAY.match(p) + if array: + elem, size = array.group(1), int(array.group(2)) + words = leaves(elem, defs) + lines.append(' %s a%d[%d];' % (elem if glsl else hlsl_type(elem), j, size)) + lines.append(' for (uint e = 0u; e < %du; e++) {' % size) + for k, leaf in enumerate(words): + word = ('In.a[b + %du + e * %du]' if glsl else 'In[b + %du + e * %du]') % (offset + k, len(words)) + lines.append(' a%d[e]%s = %s;' % (j, access(leaf, glsl), read(leaf[1], glsl, word))) + lines.append(' }') + offset += size * len(words) + args.append('a%d' % j) + continue + ptype = p if glsl else hlsl_type(p) + lines.append(' %s a%d;' % (ptype, j)) + for leaf in leaves(p, defs): + word = ('In.a[b + %du]' if glsl else 'In[b + %d]') % offset + lines.append(' a%d%s = %s;' % (j, access(leaf, glsl), read(leaf[1], glsl, word))) + offset += 1 + args.append('a%d' % j) + rtype = ret if glsl else hlsl_type(ret) + lines.append(' %s r = %s(%s);' % (rtype, name, ', '.join(args))) + produced = leaves(ret, defs) + for k, leaf in enumerate(produced): + target = ('Out.a[o + %du]' if glsl else 'Out[o + %d]') % k + lines.append(' %s = %s;' % (target, write(leaf[1], glsl, 'r' + access(leaf, glsl)))) + if offset != win or len(produced) != wout: + raise SystemExit('%s: %d words in and %d out, the manifest says %d and %d' % (sig, offset, len(produced), win, wout)) + head = 'uint i = id.x; if (i >= %du) return; uint b = i * %du; uint o = i * %du;' % (n, win, wout) + return head, '\n'.join(lines) + + +def main(work, root): + defs = structs(root) + shaders = os.path.join(root, 'shaders') + built = os.environ.get('GLSL_DIR') + parts = [os.path.join(built, f) for f in ('core.glsl', 'cycles.glsl', 'phacelle.glsl')] if built else [os.path.join(shaders, f) for f in ('CultMath.glsl', 'CultMath.Cycles.glsl', 'CultMath.Phacelle.glsl')] + library = ''.join(open(p).read() for p in parts) + count = 0 + for line in open(os.path.join(work, 'manifest.txt')): + tag, _, sig, n, win, wout = line.rstrip('\n').split('\t') + n, win, wout = int(n), int(win), int(wout) + head, code = body(sig, n, win, wout, defs, False) + open(os.path.join(work, tag + '.hlsl'), 'w').write( + '#include "CultMath.hlsl"\n[[vk::binding(0)]] StructuredBuffer In;\n[[vk::binding(1)]] RWStructuredBuffer Out;\n' + '[numthreads(64, 1, 1)] void main(uint3 id : SV_DispatchThreadID) {\n %s\n%s\n}\n' % (head, code)) + head, code = body(sig, n, win, wout, defs, True) + open(os.path.join(work, tag + '.comp'), 'w').write( + '#version 310 es\nprecision highp float;\nprecision highp int;\n' + library + + 'layout(local_size_x = 64) in;\nlayout(std430, binding = 0) readonly buffer IB { uint a[]; } In;\n' + 'layout(std430, binding = 1) buffer OB { uint a[]; } Out;\n' + 'void main() {\n uint i = gl_GlobalInvocationID.x; %s\n%s\n}\n' % (head.replace('uint i = id.x; ', ''), code)) + count += 1 + print('generated', count, 'work items') + + +if __name__ == '__main__': + main(sys.argv[1], sys.argv[2]) diff --git a/packages/cultmath/tools/device/nocontract.py b/packages/cultmath/tools/device/nocontract.py new file mode 100644 index 00000000..26a200a7 --- /dev/null +++ b/packages/cultmath/tools/device/nocontract.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +"""The strict-form harness pass of the GLSL equality gate: decorates the result of every OpFMul, OpFAdd, OpFSub, +OpVectorTimesScalar and OpDot NoContraction, so the driver may not fuse them into a multiply-add. Binary, instruction +level, reusing spvedit.py's load and mk. It lives in the gate's job-local modules only, never in shipped GLSL. + +usage: nocontract.py prints the count of decorated results""" +import importlib.util, os, struct, sys + +here = os.path.dirname(os.path.abspath(__file__)) +spec = importlib.util.spec_from_file_location('spvedit', os.path.join(here, '..', 'glsl', 'spvedit.py')) +spvedit = importlib.util.module_from_spec(spec) +spec.loader.exec_module(spvedit) + +OP_DOT, OP_FADD, OP_FSUB, OP_FMUL, OP_VECTOR_TIMES_SCALAR = 148, 129, 131, 133, 142 +FLOAT_OPS = (OP_FADD, OP_FSUB, OP_FMUL, OP_VECTOR_TIMES_SCALAR, OP_DOT) +DECORATION_NO_CONTRACTION = 42 +FIRST_TYPE_OP, LAST_TYPE_OP = 19, 39 # OpTypeVoid .. OpTypeForwardPointer: the annotations end where types begin + + +def main(src, dst): + h, ins = spvedit.load(src) + done = {x[1] for x in ins if spvedit.op(x) == spvedit.OP_DECORATE and x[2] == DECORATION_NO_CONTRACTION} + ids = [x[2] for x in ins if spvedit.op(x) in FLOAT_OPS and x[2] not in done] + at = next((k for k, x in enumerate(ins) if FIRST_TYPE_OP <= spvedit.op(x) <= LAST_TYPE_OP), None) + if at is None: + sys.exit('refuse: no type section to place the decorations before') + ins[at:at] = [spvedit.mk(spvedit.OP_DECORATE, i, DECORATION_NO_CONTRACTION) for i in ids] + words = h + [v for x in ins for v in x] + open(dst, 'wb').write(struct.pack('<%dI' % len(words), *words)) + print('nocontract: %d results decorated' % len(ids)) + + +if __name__ == '__main__': + main(*sys.argv[1:3]) diff --git a/packages/cultmath/tools/device/run-lavapipe.sh b/packages/cultmath/tools/device/run-lavapipe.sh new file mode 100644 index 00000000..2cbb1aaa --- /dev/null +++ b/packages/cultmath/tools/device/run-lavapipe.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +# The lavapipe conforming run: every fixture family, through HLSL (dxc) and GLSL (glslang), on Mesa lavapipe, +# judged by GlslMirrorTests.DeviceResultsHoldFixture. This script spells, compiles and dispatches; the C# judge +# is the only thing that compares. +# +# Run from the CultLib root inside mcr.microsoft.com/dotnet/sdk:10.0 (Ubuntu 24.04), for example +# SUMMARY= tools/stopgap/ygg-verify.sh mcr.microsoft.com/dotnet/sdk:10.0 'bash packages/cultmath/tools/device/run-lavapipe.sh' +# GLSL_DIR= (the output of tools/glsl/build-glsl.sh) runs the built +# route instead of the committed one and skips the bounds judge: every lavapipe-glsl/.out must equal its +# lavapipe-hlsl/.out byte for byte, and a difference exits 1. It records no bounds. That compare is in strict form: +# dxc gets -Gis and nocontract.py decorates every float result of both modules NoContraction, so the two routes cannot +# differ by a fused multiply-add. +# WRITE_BOUNDS=1 re-records packages/cultmath/tests/CultMath.Tests/fixtures/device-bounds-lavapipe.txt and prints it +# between BOUNDS-BEGIN and BOUNDS-END, because the job's clone is discarded. +set -euo pipefail +ROOT=$(pwd) +CM=$ROOT/packages/cultmath +TESTS=$CM/tests/CultMath.Tests +DEV=$CM/tools/device +W=/tmp/device +SNAPSHOT=20261016T000000Z +DXC_URL=https://github.com/microsoft/DirectXShaderCompiler/releases/download/v1.9.2607/linux_dxc_2026_07_29.x86_x64.tar.gz +DXC_SHA=55665c87824051ed4774ff3280a79ccbbb7d39243b9736ca5e98222134112d54 +mkdir -p "$W/dxc" "$W/results/lavapipe-hlsl" "$W/results/lavapipe-glsl" + +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq --snapshot "$SNAPSHOT" >/dev/null +apt-get install -y -qq --no-install-recommends mesa-vulkan-drivers libvulkan-dev glslang-tools spirv-tools gcc libc6-dev curl ca-certificates python3 >/dev/null + +curl -sL --fail -o "$W/dxc.tgz" "$DXC_URL" +echo "$DXC_SHA $W/dxc.tgz" | sha256sum -c - >/dev/null || { echo "dxc tarball sha256 differs from the pinned one"; exit 1; } +tar xzf "$W/dxc.tgz" -C "$W/dxc" +DXC=$(find "$W/dxc" -name dxc -type f | head -1) +export LD_LIBRARY_PATH=$(dirname "$DXC")/../lib:$(dirname "$DXC")${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} +gcc -O2 -o "$W/vkrun" "$DEV/vkrun.c" -lvulkan + +dotnet build "$TESTS" -nologo -v q >/dev/null +GLSL_DIR=${GLSL_DIR:+$(realpath "$GLSL_DIR")}; export GLSL_DIR +export CULTMATH_DEVICE_WORK=$W/work +dotnet test "$TESTS" --no-build --filter "FullyQualifiedName~GlslMirrorTests.WriteDeviceWork" +python3 "$DEV/gen.py" "$W/work" "$CM" + +STRICT=(); [ -z "${GLSL_DIR:-}" ] || STRICT=(-Gis) +while IFS=$'\t' read -r tag _ _ n _ wout; do + in=$W/work/$tag.in + "$DXC" -T cs_6_0 -E main -HV 2021 "${STRICT[@]}" -spirv -fspv-target-env=vulkan1.2 -I "$CM/shaders" "$W/work/$tag.hlsl" -Fo "$W/work/$tag.h.spv" >"$W/work/$tag.h.log" 2>&1 \ + || { echo "dxc failed for $tag"; head -5 "$W/work/$tag.h.log"; exit 1; } + glslangValidator -V --target-env vulkan1.2 -o "$W/work/$tag.g.spv" "$W/work/$tag.comp" >"$W/work/$tag.g.log" 2>&1 \ + || { echo "glslang failed for $tag"; head -5 "$W/work/$tag.g.log"; exit 1; } + if [ -n "${GLSL_DIR:-}" ]; then + for m in h g; do + python3 "$DEV/nocontract.py" "$W/work/$tag.$m.spv" "$W/work/$tag.$m.nc.spv" >>"$W/nocontract.txt" + mv "$W/work/$tag.$m.nc.spv" "$W/work/$tag.$m.spv" + done + fi + "$W/vkrun" "$W/work/$tag.h.spv" "$in" "$W/results/lavapipe-hlsl/$tag.out" "$n" "$wout" >>"$W/device.txt" + "$W/vkrun" "$W/work/$tag.g.spv" "$in" "$W/results/lavapipe-glsl/$tag.out" "$n" "$wout" >>"$W/device.txt" +done <"$W/work/manifest.txt" + +if [ -n "${GLSL_DIR:-}" ]; then + total=0; equal=0 + for h in "$W"/results/lavapipe-hlsl/*.out; do + tag=$(basename "$h" .out); total=$((total + 1)) + if cmp -s "$h" "$W/results/lavapipe-glsl/$tag.out"; then equal=$((equal + 1)); else echo "differs: $tag"; fi + done + echo "strict form: $(wc -l <"$W/nocontract.txt") modules rewritten, $(awk '{n += $2} END {print n}' "$W/nocontract.txt") results decorated NoContraction" + echo "lavapipe-glsl equals lavapipe-hlsl: $equal/$total" + [ "$equal" = "$total" ] && [ "$total" -gt 0 ] + exit +fi + +RENDERER=$(sort -u "$W/device.txt") +[ "$(echo "$RENDERER" | wc -l)" = 1 ] || { echo "the runs saw more than one device: $RENDERER"; exit 1; } +export CULTMATH_DEVICE_NAME=${RENDERER#device=} +export CULTMATH_DEVICE_IDENTITY="$(dpkg-query -W -f='${Package} ${Version}; ' mesa-vulkan-drivers glslang-tools)dxc $("$DXC" --version | head -1); apt snapshot $SNAPSHOT" +export CULTMATH_DEVICE_RESULTS=$W/results +echo "outputs sha256: $(cd "$W/results" && find . -type f | sort | xargs sha256sum | sha256sum | cut -c1-64)" +echo "device: $CULTMATH_DEVICE_NAME" +echo "identity: $CULTMATH_DEVICE_IDENTITY" + +if [ "${WRITE_BOUNDS:-0}" = 1 ]; then + export CULTMATH_WRITE_DEVICE_BOUNDS=1 + trap 'echo BOUNDS-BEGIN; cat "$TESTS/fixtures/device-bounds-lavapipe.txt"; echo BOUNDS-END' EXIT +fi +dotnet test "$TESTS" --no-build --filter "FullyQualifiedName~GlslMirrorTests.DeviceResultsHoldFixture|FullyQualifiedName~GlslMirrorTests.CommittedShadersCarryNoReducedPrecisionQualifier" --logger "console;verbosity=detailed" diff --git a/packages/cultmath/tools/device/vkrun.c b/packages/cultmath/tools/device/vkrun.c new file mode 100644 index 00000000..0df21d8d --- /dev/null +++ b/packages/cultmath/tools/device/vkrun.c @@ -0,0 +1,83 @@ +// Vulkan compute host for the conforming run: one dispatch of a generated shader on the first Vulkan device, +// binding 0 = input words, binding 1 = output words. It prints the device's name on stdout and judges nothing. +// usage: vkrun +#include +#include +#include +#include +#define CK(x) do { VkResult r_ = (x); if (r_ != VK_SUCCESS) { fprintf(stderr, "FAIL %s = %d\n", #x, r_); exit(2); } } while (0) + +static void *slurp(const char *p, size_t *n) { + FILE *f = fopen(p, "rb"); if (!f) { perror(p); exit(2); } + fseek(f, 0, SEEK_END); *n = ftell(f); fseek(f, 0, SEEK_SET); + void *b = malloc(*n ? *n : 4); if (fread(b, 1, *n, f) != *n) exit(2); fclose(f); return b; +} + +int main(int argc, char **argv) { + if (argc != 6) { fprintf(stderr, "usage\n"); return 2; } + size_t spvn, inn; void *spv = slurp(argv[1], &spvn); void *in = slurp(argv[2], &inn); + unsigned ncases = atoi(argv[4]), ow = atoi(argv[5]); const char *entry = "main"; + size_t outn = (size_t)ncases * ow * 4; + + VkApplicationInfo ai = { VK_STRUCTURE_TYPE_APPLICATION_INFO, 0, "vkrun", 1, "vkrun", 1, VK_API_VERSION_1_2 }; + VkInstanceCreateInfo ici = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 0, 0, &ai }; + VkInstance inst; CK(vkCreateInstance(&ici, 0, &inst)); + uint32_t np = 1; VkPhysicalDevice pd; vkEnumeratePhysicalDevices(inst, &np, &pd); if (!np) { fprintf(stderr, "no device\n"); return 2; } + VkPhysicalDeviceProperties props; + vkGetPhysicalDeviceProperties(pd, &props); + printf("device=%s\n", props.deviceName); + + float prio = 1; VkDeviceQueueCreateInfo qci = { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 0, 0, 0, 1, &prio }; + VkDeviceCreateInfo dci = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 0, 0, 1, &qci }; + VkDevice dev; CK(vkCreateDevice(pd, &dci, 0, &dev)); VkQueue q; vkGetDeviceQueue(dev, 0, 0, &q); + + VkPhysicalDeviceMemoryProperties mp; vkGetPhysicalDeviceMemoryProperties(pd, &mp); + VkBuffer buf[2]; VkDeviceMemory mem[2]; size_t sz[2] = { inn, outn }; void *map[2]; + for (int i = 0; i < 2; i++) { + VkBufferCreateInfo bci = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, 0, 0, sz[i], VK_BUFFER_USAGE_STORAGE_BUFFER_BIT }; + CK(vkCreateBuffer(dev, &bci, 0, &buf[i])); VkMemoryRequirements mr; vkGetBufferMemoryRequirements(dev, buf[i], &mr); + uint32_t t = 0; VkMemoryPropertyFlags want = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + for (; t < mp.memoryTypeCount; t++) if ((mr.memoryTypeBits & (1u << t)) && (mp.memoryTypes[t].propertyFlags & want) == want) break; + VkMemoryAllocateInfo mai = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, 0, mr.size, t }; + CK(vkAllocateMemory(dev, &mai, 0, &mem[i])); CK(vkBindBufferMemory(dev, buf[i], mem[i], 0)); + CK(vkMapMemory(dev, mem[i], 0, sz[i], 0, &map[i])); + } + memcpy(map[0], in, inn); memset(map[1], 0xEE, outn); + + VkDescriptorSetLayoutBinding b[2] = { { 0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT }, + { 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT } }; + VkDescriptorSetLayoutCreateInfo lci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 0, 0, 2, b }; + VkDescriptorSetLayout dsl; CK(vkCreateDescriptorSetLayout(dev, &lci, 0, &dsl)); + VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 0, 0, 1, &dsl }; + VkPipelineLayout pl; CK(vkCreatePipelineLayout(dev, &plci, 0, &pl)); + VkShaderModuleCreateInfo smci = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, 0, 0, spvn, spv }; + VkShaderModule sm; CK(vkCreateShaderModule(dev, &smci, 0, &sm)); + VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 0, 0, + { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 0, 0, VK_SHADER_STAGE_COMPUTE_BIT, sm, entry }, pl }; + VkPipeline pipe; CK(vkCreateComputePipelines(dev, 0, 1, &cpci, 0, &pipe)); + + VkDescriptorPoolSize ps = { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2 }; + VkDescriptorPoolCreateInfo dpci = { VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, 0, 0, 1, 1, &ps }; + VkDescriptorPool dp; CK(vkCreateDescriptorPool(dev, &dpci, 0, &dp)); + VkDescriptorSetAllocateInfo dsai = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 0, dp, 1, &dsl }; + VkDescriptorSet ds; CK(vkAllocateDescriptorSets(dev, &dsai, &ds)); + VkDescriptorBufferInfo dbi[2] = { { buf[0], 0, VK_WHOLE_SIZE }, { buf[1], 0, VK_WHOLE_SIZE } }; + VkWriteDescriptorSet w[2]; + for (int i = 0; i < 2; i++) { VkWriteDescriptorSet x = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, ds, i, 0, 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 0, &dbi[i] }; w[i] = x; } + vkUpdateDescriptorSets(dev, 2, w, 0, 0); + + VkCommandPoolCreateInfo cpi = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 0, 0, 0 }; + VkCommandPool cp; CK(vkCreateCommandPool(dev, &cpi, 0, &cp)); + VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 0, cp, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1 }; + VkCommandBuffer cb; CK(vkAllocateCommandBuffers(dev, &cbai, &cb)); + VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; + CK(vkBeginCommandBuffer(cb, &cbbi)); + vkCmdBindPipeline(cb, VK_PIPELINE_BIND_POINT_COMPUTE, pipe); + vkCmdBindDescriptorSets(cb, VK_PIPELINE_BIND_POINT_COMPUTE, pl, 0, 1, &ds, 0, 0); + vkCmdDispatch(cb, (ncases + 63) / 64, 1, 1); + CK(vkEndCommandBuffer(cb)); + VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, 0, 0, 0, 0, 1, &cb }; + CK(vkQueueSubmit(q, 1, &si, 0)); CK(vkQueueWaitIdle(q)); + FILE *f = fopen(argv[3], "wb"); fwrite(map[1], 1, outn, f); fclose(f); + return 0; +} diff --git a/packages/cultmath/tools/generate-swizzles.ps1 b/packages/cultmath/tools/generate-swizzles.ps1 index 9030f2be..e5f79011 100644 --- a/packages/cultmath/tools/generate-swizzles.ps1 +++ b/packages/cultmath/tools/generate-swizzles.ps1 @@ -21,6 +21,19 @@ $families = @( @{ Scalar = "bool"; Sizes = @(2, 3, 4); Functions = $true }, @{ Scalar = "double"; Sizes = @(2, 3); Functions = $false } ) +# Same-size vector conversions, as dxc lowers them: float to int is fptosi (toward zero; NaN +# and out-of-range are undefined in DXIL), int to float is sitofp, numeric to bool is `!= 0` +# (fcmp une, so NaN is true), bool to numeric is 0 or 1. Keyed "target<-source"; {0} is a +# source component. Identity forms (intN(intN), ...) come from the composition loop, which +# also keeps an int vector argument off the lossy intN(floatN) overload. +$conversions = [ordered]@{ + "float<-int" = "{0}" + "float<-bool" = "{0} ? 1.0f : 0.0f" + "int<-float" = "(int){0}" + "int<-bool" = "{0} ? 1 : 0" + "bool<-float" = "{0} != 0.0f" + "bool<-int" = "{0} != 0" +} $componentFields = @("x", "y", "z", "w") $namings = @(@("x", "y", "z", "w"), @("r", "g", "b", "a")) @@ -86,6 +99,20 @@ foreach ($family in $families) { } } + foreach ($source in @("float", "int", "bool")) { + $expression = $conversions["$scalar<-$source"] + if (-not $expression) { continue } + $converted = for ($i = 0; $i -lt $size; $i++) { $expression -f "value.$($componentFields[$i])" } + Line " public $type($source$size value) : this($($converted -join ', ')) { }" + if ($family.Functions) { + $functionLines.Add(" public static $type $type($source$size value) => new(value);") + } + } + if ($scalar -eq "float" -and $family.Functions) { + # floatN(int) splat: without it floatN(0) is ambiguous between floatN(float) and floatN(intN). + $functionLines.Add(" public static $type $type(int value) => new($((@('value') * $size) -join ', '));") + } + # Single-component color aliases; x/y/z/w are the fields themselves. $letters = $namings[1] for ($i = 0; $i -lt $size; $i++) { diff --git a/packages/cultmath/tools/get-glslang.ps1 b/packages/cultmath/tools/get-glslang.ps1 new file mode 100644 index 00000000..e22e1095 --- /dev/null +++ b/packages/cultmath/tools/get-glslang.ps1 @@ -0,0 +1,42 @@ +param( + [string]$InstallRoot = ".tools\glslang" +) + +$ErrorActionPreference = "Stop" + +$repoRoot = Resolve-Path (Join-Path $PSScriptRoot "..") +$installPath = Join-Path $repoRoot $InstallRoot +New-Item -ItemType Directory -Force -Path $installPath | Out-Null + +# Pinned: the GLSL compile check means this front end (Khronos glslang 16.6.0). The hash is the +# SHA256 digest GitHub publishes for this asset of KhronosGroup/glslang release 16.6.0. +$zipName = "glslang-16.6.0-windows-x86_64-release.zip" +$zipUrl = "https://github.com/KhronosGroup/glslang/releases/download/16.6.0/$zipName" +$zipSha256 = "82BF434E69B9BB4829DE7E2B4BC2C5E7A7861E53D66CF75E5CC70F5F694A8D9B" + +$zipPath = Join-Path $installPath $zipName +Remove-Item -LiteralPath $zipPath -Force -ErrorAction SilentlyContinue + +& curl.exe -L --retry 5 --retry-delay 2 --fail -o $zipPath $zipUrl +if ($LASTEXITCODE -ne 0) { + throw "curl.exe failed with exit code $LASTEXITCODE." +} + +$actualSha256 = (Get-FileHash -LiteralPath $zipPath -Algorithm SHA256).Hash +if ($actualSha256 -ne $zipSha256) { + Remove-Item -LiteralPath $zipPath -Force + throw "$zipName SHA256 is $actualSha256, expected $zipSha256." +} + +$currentPath = Join-Path $installPath "current" +Remove-Item -LiteralPath $currentPath -Recurse -Force -ErrorAction SilentlyContinue +New-Item -ItemType Directory -Force -Path $currentPath | Out-Null +Expand-Archive -LiteralPath $zipPath -DestinationPath $currentPath -Force + +$glslangPath = Get-ChildItem -LiteralPath $currentPath -Recurse -File -Include "glslang.exe", "glslangValidator.exe" | Select-Object -First 1 +if (-not $glslangPath) { + throw "glslang executable was not found after extraction." +} + +& $glslangPath.FullName --version +Write-Host "glslang installed at $($glslangPath.FullName)" diff --git a/packages/cultmath/tools/get-glslang.ps1.meta b/packages/cultmath/tools/get-glslang.ps1.meta new file mode 100644 index 00000000..e254d120 --- /dev/null +++ b/packages/cultmath/tools/get-glslang.ps1.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 37d057d5ae6847b7b4689d36514b3dc9 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/tools/glsl/build-glsl.sh b/packages/cultmath/tools/glsl/build-glsl.sh new file mode 100644 index 00000000..3281d545 --- /dev/null +++ b/packages/cultmath/tools/glsl/build-glsl.sh @@ -0,0 +1,146 @@ +#!/usr/bin/env bash +# Builds the library GLSL from the HLSL: dxc lib_6_3 -spirv -Od, one SPIR-V edit, a fixed spirv-opt pair, SPIRV-Cross, +# partition. Linux, run from the repository root: build-glsl.sh +# Writes core.glsl, cycles.glsl and phacelle.glsl bodies into ; the committed GLSL is untouched. +# Tools are cached in GLSL_TOOLS (default packages/cultmath/.tools/glsl, gitignored): the pinned dxc tarball and +# SPIRV-Cross, SPIRV-Tools, SPIRV-Headers at TAG built with cmake. +set -euo pipefail +OUT=$(realpath -m "${1:?usage: build-glsl.sh }") +ROOT=$(pwd) +CM=$ROOT/packages/cultmath +G=$CM/tools/glsl +TOOLS=$(realpath -m "${GLSL_TOOLS:-$CM/.tools/glsl}") +TAG=vulkan-sdk-1.4.363.0 +DXC_URL=https://github.com/microsoft/DirectXShaderCompiler/releases/download/v1.9.2607/linux_dxc_2026_07_29.x86_x64.tar.gz +DXC_SHA=55665c87824051ed4774ff3280a79ccbbb7d39243b9736ca5e98222134112d54 +W=$(mktemp -d) +mkdir -p "$TOOLS" "$OUT" + +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq >/dev/null +apt-get install -y -qq --no-install-recommends ca-certificates curl git cmake g++ make python3 glslang-tools >/dev/null + +if [ ! -x "$TOOLS/dxc.ok" ]; then + curl -sL --fail -o "$TOOLS/dxc.tgz" "$DXC_URL" + echo "$DXC_SHA $TOOLS/dxc.tgz" | sha256sum -c - >/dev/null || { echo "dxc tarball sha256 differs from the pinned one"; rm -f "$TOOLS/dxc.tgz"; exit 1; } + rm -rf "$TOOLS/dxc"; mkdir -p "$TOOLS/dxc"; tar xzf "$TOOLS/dxc.tgz" -C "$TOOLS/dxc"; : >"$TOOLS/dxc.ok" +fi +DXC=$(find "$TOOLS/dxc" -name dxc -type f | head -1) +export LD_LIBRARY_PATH=$(dirname "$DXC")/../lib:$(dirname "$DXC")${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} + +if [ ! -x "$TOOLS/bin/spirv-cross" ]; then + git clone -q --depth 1 --branch $TAG https://github.com/KhronosGroup/SPIRV-Cross.git "$TOOLS/sc-src" + cmake -S "$TOOLS/sc-src" -B "$TOOLS/sc-build" -DCMAKE_BUILD_TYPE=Release -DSPIRV_CROSS_ENABLE_TESTS=OFF -DSPIRV_CROSS_CLI=ON >/dev/null + cmake --build "$TOOLS/sc-build" --target spirv-cross -j8 >/dev/null + mkdir -p "$TOOLS/bin"; cp "$TOOLS/sc-build/spirv-cross" "$TOOLS/bin/" +fi +if [ ! -x "$TOOLS/bin/spirv-opt" ]; then + git clone -q --depth 1 --branch $TAG https://github.com/KhronosGroup/SPIRV-Tools.git "$TOOLS/st-src" + git clone -q --depth 1 --branch $TAG https://github.com/KhronosGroup/SPIRV-Headers.git "$TOOLS/st-src/external/spirv-headers" + cmake -S "$TOOLS/st-src" -B "$TOOLS/st-build" -DCMAKE_BUILD_TYPE=Release -DSPIRV_SKIP_TESTS=ON -DSPIRV_WERROR=OFF >/dev/null + cmake --build "$TOOLS/st-build" --target spirv-opt spirv-val -j8 >/dev/null + mkdir -p "$TOOLS/bin"; cp "$TOOLS/st-build/tools/spirv-opt" "$TOOLS/st-build/tools/spirv-val" "$TOOLS/bin/" +fi +export PATH=$TOOLS/bin:$PATH +echo "dxc: $("$DXC" --version | head -1)"; echo "spirv-opt: $(spirv-opt --version | head -1)" + +pipeline() { # shaders dir, work dir, out dir: HLSL to partitioned GLSL; returns 1 at the first refusal + local sh=$1 w=$2 out=$3 + mkdir -p "$w" "$out" + python3 "$G/wrappers.py" "$sh" "$w/shw" || return 1 + "$DXC" -T lib_6_3 -HV 2021 -spirv -fspv-target-env=universal1.5 -Od -I "$w/shw" "$w/shw/cm_wrappers.hlsl" -Fo "$w/lib.spv" >"$w/dxc.log" 2>&1 || { head -20 "$w/dxc.log"; return 1; } + python3 "$G/spvedit.py" "$w/lib.spv" "$w/edited.spv" "$w/shw/wrappers.tsv" "$w/shw/capacity.tsv" || return 1 + spirv-val --target-env spv1.5 "$w/edited.spv" || return 1 + spirv-opt --target-env=spv1.5 --eliminate-local-single-store --eliminate-dead-code-aggressive "$w/edited.spv" -o "$w/opt.spv" || return 1 + spirv-val --target-env spv1.5 "$w/opt.spv" || return 1 + spirv-cross "$w/opt.spv" --es --version 310 --relax-nan-checks --output "$w/cross.glsl" || return 1 + python3 "$G/partition.py" "$sh" "$w/cross.glsl" "$out" || return 1 +} +pipeline "$CM/shaders" "$W" "$OUT" || exit 1 + +# Consumer checks: glslang ES 3.00 fragment compiles of every include combination, and a consumer calling overloads +# with an r-value argument. +CONSUMER='out highp vec4 c; +void main() { vec3 p = gl_FragCoord.xyz; c = vec4(cultmath_lerp(p, p.yzx, vec3(0.5)), cultmath_lerp(1.0, 2.0, p.x)) + cultmath_saturate(vec4(p, 1.0)) + vec4(cultmath_smootherstep(gl_FragCoord.x + 1.0)); }' +for combo in "core" "core cycles" "core phacelle" "core cycles phacelle"; do + f=$W/check.frag; printf '#version 300 es\nprecision highp float;\nprecision highp int;\n' >"$f" + for part in $combo; do cat "$OUT/$part.glsl" >>"$f"; done + printf '%s\n' "$CONSUMER" >>"$f" + glslangValidator "$f" >"$W/check.log" 2>&1 || { echo "ES 3.00 compile failed for [$combo]"; head -8 "$W/check.log"; exit 1; } + echo "ES 3.00 ok: $combo" +done + +# Capacity checks: a consumer's prior #define CULTMATH_MAX_SITES changes the array type through dxc, the committed GLSL +# and the built GLSL, and 128 still works with no define. +printf '#define CULTMATH_MAX_SITES 4\n#include "CultMath.hlsl"\nfloat4 cap4(float3 p, float4 s[4]) { return cultmath_power_border(p, s, 4); }\n' >"$W/shw/cap4.hlsl" +"$DXC" -T lib_6_3 -HV 2021 -Od -I "$W/shw" "$W/shw/cap4.hlsl" -Fo "$W/cap4.dxil" >"$W/cap4.log" 2>&1 || { echo "capacity (a) failed: dxc with CULTMATH_MAX_SITES 4"; head -8 "$W/cap4.log"; exit 1; } +echo "capacity (a) ok: dxc lib_6_3 with a prior define 4 takes float4 s[4]" +consume() { # label, expected (ok|fail), define lines, GLSL library file, main body + local f=$W/cap.frag + printf '#version 300 es +precision highp float; +precision highp int; +%s +' "$3" >"$f"; cat "$4" >>"$f" + printf 'out highp vec4 c; +void main() { %s } +' "$5" >>"$f" + local got=fail; glslangValidator "$f" >"$W/cap.log" 2>&1 && got=ok + [ "$got" = "$2" ] || { echo "capacity $1 failed: expected $2, got $got"; head -6 "$W/cap.log"; exit 1; } + echo "capacity $1 ok: $2" +} +cap_check() { # label, expected, define lines, GLSL library file, site array length + consume "$1" "$2" "$3" "$4" "vec4 s[$5]; for (int i = 0; i < $5; i++) s[i] = vec4(float(i)); c = cultmath_power_border(gl_FragCoord.xyz, s, 4);" +} +D4='#define CULTMATH_MAX_SITES 4' +cap_check "(b) built, define 4, vec4 s[4]" ok "$D4" "$OUT/core.glsl" 4 +cap_check "(c) built, define 4, vec4 s[128]" fail "$D4" "$OUT/core.glsl" 128 +cap_check "(d) built, no define, vec4 s[128]" ok "" "$OUT/core.glsl" 128 +cap_check "(e) committed, define 4, vec4 s[4]" ok "$D4" "$CM/shaders/CultMath.glsl" 4 +cap_check "(e) committed, define 4, vec4 s[128]" fail "$D4" "$CM/shaders/CultMath.glsl" 128 + +for part in core cycles phacelle; do + g=$OUT/$part.glsl + fn=$(grep -cE '^[A-Za-z_]\w* [A-Za-z_]\w*\(.*\)$' "$g" || true) + names=$(grep -oE '^[A-Za-z_]\w* [A-Za-z_]\w*\(' "$g" | awk '{print $2}' | sort -u | wc -l) + echo "$part: functions $fn, distinct names $names, lines $(wc -l <"$g"), bytes $(wc -c <"$g"), sha256 $(sha256sum "$g" | cut -c1-64)" +done +echo "suffixed ids: $(cat "$OUT"/*.glsl | grep -oE '\bcultmath_\w+_[0-9]+\(' | sort -u | wc -l); inout: $(cat "$OUT"/*.glsl | grep -c inout || true)" +# Build shape: the lowering leaves none of these, and the NaN-check option leaves no mix(mix( expansions. A literal +# [128] is not among them: the capacity is selected by name, so a library array of length 128 is legitimate output. +SHAPE='inout|param_var_|cmw[0-9]{3}_|export |mix\(mix\(|\b_cos\b|\b_sin\b' +shape_check() { # output directory; returns 1 when the shape fails + if cat "$1"/*.glsl | grep -Eq "$SHAPE"; then + echo "build shape failed:"; cat "$1"/*.glsl | grep -Eo "$SHAPE" | sort | uniq -c; return 1 + fi +} +shape_check "$OUT" || exit 1 +echo "build shape ok" + +# Tool refusals, and the capacity's reach: each variant appends one probe function to a scratch copy of CultMath.hlsl and +# runs the whole pipeline on it. +variant() { # label, probe HLSL; leaves the variant directory in VD + VD=$W/v/$1; rm -rf "$VD"; mkdir -p "$VD"; cp -r "$CM/shaders" "$VD/sh" + printf ' +%s +' "$2" >>"$VD/sh/CultMath.hlsl" + pipeline "$VD/sh" "$VD/w" "$VD/out" >"$VD/log" 2>&1 +} +expect_refused() { # label, probe HLSL, pattern the refusal prints + if variant "$1" "$2"; then echo "refusal $1 failed: the build passed"; exit 1; fi + grep -q "$3" "$VD/log" || { echo "refusal $1 failed: no '$3' in the log"; tail -5 "$VD/log"; exit 1; } + echo "refusal $1 ok" +} +SENTINEL=$(cut -f2 "$W/shw/capacity.tsv") +expect_refused macro-in-expression 'int cultmath_zz_probe(int n) { return n + CULTMATH_MAX_SITES; }' 'outside its guard' +# the sentinel spelled in hex: wrappers.py's scan reads decimal tokens, so only the length check can see it +expect_refused length-in-expression "uint cultmath_zz_probe(uint n) { return n + $(printf '0x%xu' "$SENTINEL"); }" 'also used by opcode' +# the sentinel as another element type's array length: not a capacity parameter type +expect_refused other-element-same-length "float3 cultmath_zz_probe(float3 x[$(printf '0x%x' "$SENTINEL")], int n) { return x[n]; }" 'not a capacity parameter type' +variant array-128 'float4 cultmath_zz_probe(float4 x[128], int n) { return x[n]; }' || { echo "array-128 failed: a library array of length 128 broke the build"; tail -5 "$VD/log"; exit 1; } +grep -Eq 'cultmath_zz_probe\(.*\[128\]' "$VD/out/core.glsl" || { echo "array-128 failed: the 128 array is not literal in core.glsl"; exit 1; } +shape_check "$VD/out" || { echo "array-128 failed: the shape check refused a library array of length 128"; exit 1; } +PROBE='vec4 x[128]; c = cultmath_zz_probe(x, 1);' +consume "(f) non-site array, define 4, vec4 x[128]" ok "$D4" "$VD/out/core.glsl" "$PROBE" +consume "(f) non-site array, define 4, vec4 x[4]" fail "$D4" "$VD/out/core.glsl" 'vec4 x[4]; c = cultmath_zz_probe(x, 1);' +consume "(g) consumer's own SPIRV_CROSS_CONSTANT_ID_0" ok '#define SPIRV_CROSS_CONSTANT_ID_0 7u' "$OUT/core.glsl" 'c = vec4(float(cultmath_max_sites));' diff --git a/packages/cultmath/tools/glsl/partition.py b/packages/cultmath/tools/glsl/partition.py new file mode 100644 index 00000000..415c9b2b --- /dev/null +++ b/packages/cultmath/tools/glsl/partition.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +"""Partition the SPIRV-Cross GLSL of the whole library into the three files a consumer includes. + +usage: partition.py +Each top-level struct and function chunk goes to the file whose HLSL defines it (CultMath, Interval and Affine to core; +Cycles; Phacelle). The library-header prologue and any main are dropped. Writes core.glsl, cycles.glsl and +phacelle.glsl bodies, with the 13 `static const float` constants of the HLSL as `const float NAME = ;` at the +head of the file that defines them. core.glsl opens with the HLSL's own CULTMATH_MAX_SITES guard lines, one line mapping +SPIRV_CROSS_CONSTANT_ID_ (CultMath's own, 'CMS1') to uint(CULTMATH_MAX_SITES), and SPIRV-Cross's one spec-constant block. Licence lines, include guards and the #version contract belong to the caller. +Refuses: a static const line that is not `static const float CULTMATH_X = ;`, an unknown-origin chunk, a +duplicate chunk, an unexpected prologue line, a missing or other SPIRV_CROSS_CONSTANT_ID block, and a call from a non-core chunk into a different non-core origin.""" +import collections, os, re, sys +from spvedit import SPEC_ID + +OWNER = {'CultMath.hlsl': 'core', 'CultMath.Interval.hlsl': 'core', 'CultMath.Affine.hlsl': 'core', + 'CultMath.Cycles.hlsl': 'cycles', 'CultMath.Phacelle.hlsl': 'phacelle'} +CONST = re.compile(r'^static const float (CULTMATH_\w+) = (-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?);$') +PROLOGUE = re.compile(r'^(#version |#extension |precision |#ifdef SPIRV_CROSS|#define SPIRV_CROSS|#endif)') +GUARD = re.compile(r'#ifndef CULTMATH_MAX_SITES\n#define CULTMATH_MAX_SITES (\d+)\n#endif\n') +ID = 'SPIRV_CROSS_CONSTANT_ID_%d' % SPEC_ID +SPEC = re.compile(r'#ifndef %s\n#define %s (\d+)u\n#endif\n' + r'const uint cultmath_max_sites = %s;\n?' % (ID, ID, ID)) +STRUCT, FUNC = re.compile(r'^struct (\w+)$'), re.compile(r'^\w+ (\w+)\(.*\)$') + + +def origins(shaders): + origin, consts = {}, collections.defaultdict(list) + for fn, o in OWNER.items(): + text = open(os.path.join(shaders, fn)).read() + for m in re.finditer(r'(?m)^\w+\s+(cultmath_\w+)\s*\(', text): + origin.setdefault(m.group(1), o) + for m in re.finditer(r'(?m)^struct\s+(\w+)', text): + origin.setdefault(m.group(1), o) + for line in text.splitlines(): + if line.startswith('static const'): + m = CONST.match(line) + if not m: + sys.exit('refuse: %s has a static const line that is not `static const float CULTMATH_X = ;`' % fn) + consts[o].append('const float %s = %s;' % m.groups()) + return origin, consts + + +def chunks(lines): + out, prologue, i = [], [], 0 + while i < len(lines): + m = STRUCT.match(lines[i]) or FUNC.match(lines[i]) + if not m: + if lines[i].strip(): + prologue.append(lines[i]) + i += 1 + continue + j = i + while lines[j] not in ('};', '}'): + j += 1 + if m.group(1) != 'main': + out.append((m.group(1), '\n'.join(lines[i:j + 1]))) + i = j + 1 + return out, prologue + + +def main(shaders, glsl, outdir): + origin, consts = origins(shaders) + guard = GUARD.search(open(os.path.join(shaders, 'CultMath.hlsl')).read().replace('\r\n', '\n')) + if not guard: + sys.exit('refuse: CultMath.hlsl has no CULTMATH_MAX_SITES guard') + parts, prologue = chunks(open(glsl).read().split('\n')) + joined = '\n'.join(prologue) + '\n' + spec = SPEC.search(joined) + text, found = SPEC.subn('', joined) + if found != 1 or spec.group(1) != guard.group(1): + sys.exit('refuse: expected exactly one spec-constant block defaulting to the guard value, found %d' % found) + odd = [l for l in text.split('\n') if l and (not PROLOGUE.match(l) or 'SPIRV_CROSS_CONSTANT_ID' in l)] + if odd: + sys.exit('refuse: %d unexpected prologue lines, first at %r' % (len(odd), odd[0][:60])) + seen = collections.Counter(b.split(chr(10))[0] for _, b in parts) # overloads share a name, never a signature + dup = sorted(n for n, c in seen.items() if c > 1) + if dup: + sys.exit('refuse: duplicate chunks %s' % dup[:6]) + unknown = sorted(n for n, _ in parts if n not in origin) + if unknown: + sys.exit('refuse: %d unknown-origin chunks %s' % (len(unknown), unknown[:8])) + files = collections.defaultdict(list) + for name, body in parts: + o = origin[name] + for callee in set(re.findall(r'\b(cultmath_\w+|[A-Z]\w+)\b', body)) - {name}: + co = origin.get(callee) + if o != 'core' and co and co != 'core' and co != o: + sys.exit('refuse: %s (%s) calls %s (%s)' % (name, o, callee, co)) + files[o].append(body) + os.makedirs(outdir, exist_ok=True) + for o in OWNER.values(): + head = [guard.group(0).rstrip('\n'), '#define %s uint(CULTMATH_MAX_SITES)' % ID, spec.group(0).rstrip('\n')] if o == 'core' else [] + text = '\n'.join(head + consts[o] + files[o]) + '\n' + open(os.path.join(outdir, o + '.glsl'), 'w').write(text) + print('partition:', {o: len(files[o]) for o in sorted(files)}, 'constants', sum(len(v) for v in consts.values())) + + +if __name__ == '__main__': + main(*sys.argv[1:4]) diff --git a/packages/cultmath/tools/glsl/spvedit.py b/packages/cultmath/tools/glsl/spvedit.py new file mode 100644 index 00000000..a5707518 --- /dev/null +++ b/packages/cultmath/tools/glsl/spvedit.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python3 +"""The one instruction-level SPIR-V edit of the GLSL build. Binary, never text. + +usage: spvedit.py +1. Keeps only the capabilities Shader and Linkage and drops every OpExtension. +2. Deletes each wrapper function with its OpName and decorations, moves its LinkageAttributes Export to its callee, and + sets the callee's OpName to the source name. Refuses a wrapper that is not exactly one OpFunctionCall. +3. By-value lowering: dxc -Od passes every parameter as a Function pointer and the caller copies in, so a callee that + assigns its parameter comes out of SPIRV-Cross as `inout`. Each Function-pointer OpFunctionParameter becomes a value + parameter with a new id; the old id stays as an entry-block OpVariable stored from it (OpName copied to the new id); + OpTypeFunction is reused if the signature exists, else added; each OpFunctionCall loads the pointer it passed. +The header bound is last id + 1.""" +import struct, sys + +OP_NAME, OP_MEMBER_NAME, OP_CAPABILITY, OP_EXTENSION, OP_DECORATE, OP_MEMBER_DECORATE = 5, 6, 17, 10, 71, 72 +OP_TYPE_ARRAY, OP_CONSTANT, OP_SPEC_CONSTANT, DECORATION_SPEC_ID = 28, 43, 50, 1 +SPEC_ID = int.from_bytes(b'CMS1', 'big') # CultMath's own id: a consumer's SPIRV_CROSS_CONSTANT_ID_n macro cannot meet it +OP_TYPE_POINTER, OP_TYPE_FUNCTION, OP_FUNCTION, OP_PARAMETER, OP_FUNCTION_END = 32, 33, 54, 55, 56 +OP_CALL, OP_LABEL, OP_VARIABLE, OP_LOAD, OP_STORE = 57, 248, 59, 61, 62 +CAP_SHADER, CAP_LINKAGE, DECORATION_LINKAGE, LINKAGE_EXPORT, FUNCTION_STORAGE = 1, 5, 41, 41, 7 +TERMINATORS = (8, 317, 62, 246, 247, 249, 250, 253, 254, 252) + + +def load(path): + raw = open(path, 'rb').read() + words = list(struct.unpack('<%dI' % (len(raw) // 4), raw)) + ins, i = [], 5 + while i < len(words): + n = words[i] >> 16 + ins.append(words[i:i + n]) + i += n + return words[:5], ins + + +def op(x): return x[0] & 0xffff +def mk(o, *ws): return [((len(ws) + 1) << 16) | o, *ws] + + +def decode(ws): + b = struct.pack('<%dI' % len(ws), *ws) + return b[:b.index(0)].decode() + + +def encode(s): + b = s.encode() + b'\0' + b += b'\0' * (-len(b) % 4) + return list(struct.unpack('<%dI' % (len(b) // 4), b)) + + +def functions(ins): + """function id -> [first index, last index, callee ids, ids defined inside]""" + fs, cur = {}, None + for k, x in enumerate(ins): + o = op(x) + if o == OP_FUNCTION: + cur = x[2] + fs[cur] = [k, None, [], set()] + if cur is None: + continue + if o == OP_CALL: + fs[cur][2].append(x[3]) + if o == OP_LABEL: + fs[cur][3].add(x[1]) + elif o not in TERMINATORS and len(x) > 2: + fs[cur][3].add(x[2]) + if o == OP_FUNCTION_END: + fs[cur][1] = k + cur = None + return fs + + +def export_edit(h, ins, rows): + names = {x[1]: decode(x[2:]) for x in ins if op(x) == OP_NAME} + fs = functions(ins) + by_name = {v: k for k, v in names.items() if k in fs} + drop_k, drop_ids, set_name, retarget = set(), set(), {}, {} + callee_of = [] + for wn, name, _, _, _ in rows: + fid = by_name.get(wn) + callees = fs[fid][2] if fid else None + if not callees or len(callees) != 1: + sys.exit('refuse: wrapper %s is not exactly one OpFunctionCall' % wn) + a, b, _, ids = fs[fid] + drop_k.update(range(a, b + 1)) + drop_ids |= ids | {fid} + set_name[callees[0]] = name + retarget[fid] = callees[0] + callee_of.append(callees[0]) + out, named = [], set() + for k, x in enumerate(ins): + if k in drop_k: + continue + o = op(x) + if o == OP_CAPABILITY and x[1] not in (CAP_SHADER, CAP_LINKAGE): + continue + if o == OP_EXTENSION: + continue + if o == OP_NAME and x[1] in set_name: + x = mk(OP_NAME, x[1], *encode(set_name[x[1]])) + named.add(x[1]) + elif o in (OP_NAME, OP_MEMBER_NAME) and x[1] in drop_ids: + continue + if o == OP_DECORATE and x[1] in drop_ids: + if x[1] in retarget and x[2] == DECORATION_LINKAGE: + x = [x[0], retarget[x[1]]] + x[2:] + else: + continue + out.append(x) + for fid, name in set_name.items(): + if fid not in named: + out.insert(next(i for i, x in enumerate(out) if op(x) == OP_NAME), mk(OP_NAME, fid, *encode(name))) + return out, callee_of + + +def by_value(h, ins): + bound = h[3] + ptr = {x[1]: (x[2], x[3]) for x in ins if op(x) == OP_TYPE_POINTER} # id -> (storage, pointee) + ftype = {x[1]: x for x in ins if op(x) == OP_TYPE_FUNCTION} + fnparams, fntype, cur = {}, {}, None + for x in ins: # per function: which parameters are Function pointers + if op(x) == OP_FUNCTION: + cur = x[2] + fnparams[cur], fntype[cur] = [], x[4] + elif op(x) == OP_PARAMETER and cur is not None: + t = x[1] + conv = t in ptr and ptr[t][0] == FUNCTION_STORAGE + fnparams[cur].append((x[2], t, ptr[t][1] if conv else None, bound if conv else None)) + bound += conv + newid = {p[0]: p[3] for ps in fnparams.values() for p in ps if p[2]} + newtype, typeins = {}, [] + sig = {tuple(x[2:]): x[1] for x in ins if op(x) == OP_TYPE_FUNCTION} + for f, ps in fnparams.items(): + if any(p[2] for p in ps): + key = (ftype[fntype[f]][2], *[p[2] if p[2] else p[1] for p in ps]) + if key not in sig: + bound += 1 + sig[key] = bound + typeins.append(mk(OP_TYPE_FUNCTION, bound, *key)) + newtype[f] = sig[key] + out, cur, pend, need_stores, first, pc = [], None, [], False, True, 0 + for x in ins: + o = op(x) + if o == OP_FUNCTION and first: + out += typeins + first = False + if need_stores and o != OP_VARIABLE: + out += [mk(OP_STORE, p, q) for p, _, q in pend] + pend, need_stores = [], False + if o == OP_FUNCTION: + cur, pc = x[2], 0 + if cur in newtype: + x = x[:4] + [newtype[cur]] + x[5:] + elif o == OP_PARAMETER: + _, t, pointee, q = fnparams[cur][pc] + pc += 1 + if pointee: + out.append(mk(OP_PARAMETER, pointee, q)) + pend.append((x[2], t, q)) + continue + elif o == OP_LABEL and pend: + out.append(x) + out += [mk(OP_VARIABLE, t, p, FUNCTION_STORAGE) for p, t, _ in pend] + need_stores = True + continue + elif o == OP_CALL: + args = [] + for a, (_, _, pointee, _) in zip(x[4:], fnparams[x[3]]): + if pointee: + bound += 1 + out.append(mk(OP_LOAD, pointee, bound, a)) + args.append(bound) + else: + args.append(a) + x = mk(OP_CALL, *x[1:4], *args) + out.append(x) + if o == OP_NAME and x[1] in newid: + out.append([x[0], newid[x[1]]] + x[2:]) + h[3] = bound + 1 + return out, len(newtype), len(newid) + + +def capacity_edit(h, ins, rows, callee_of, default): + """Each capacity parameter (wrappers.tsv column 5) of each callee has an OpTypeArray type. Exactly one length id may + serve all of them, and nothing but OpTypeArray, OpName and decorations may use it. That OpConstant becomes an + OpSpecConstant with SpecId SPEC_ID named cultmath_max_sites, defaulting to the HLSL guard value. The constant is the + sentinel wrappers.py compiled the library with, so no array outside the capacity parameters shares its length id. + Returns the instructions and the spec constant id.""" + ftype = {x[1]: x for x in ins if op(x) == OP_TYPE_FUNCTION} + arrays = {x[1]: x for x in ins if op(x) == OP_TYPE_ARRAY} + params, cur = {}, None + for x in ins: + if op(x) == OP_FUNCTION: + cur = x[2] + params[cur] = [] + elif op(x) == OP_PARAMETER: + params[cur].append(x[1]) + lengths = set() + for row, fid in zip(rows, callee_of): + for i in [int(c) for c in row[4].split(',') if c]: + t = params[fid][i] + if t not in arrays: + sys.exit('refuse: capacity parameter %d of %s is not an array type' % (i, row[1])) + lengths.add(arrays[t][3]) + if len(lengths) != 1: + sys.exit('refuse: %d array length ids serve the capacity parameters, expected exactly one' % len(lengths)) + cap = lengths.pop() + site_types = {params[fid][int(c)] for row, fid in zip(rows, callee_of) for c in row[4].split(',') if c} + if {t for t, a in arrays.items() if a[3] == cap} != site_types: + sys.exit('refuse: an array type of the capacity length is not a capacity parameter type') + for x in ins: + o = op(x) + defines = o in (OP_CONSTANT, OP_SPEC_CONSTANT) and x[2] == cap + allowed = o in (OP_TYPE_ARRAY, OP_NAME, OP_DECORATE, OP_MEMBER_DECORATE) or defines + if cap in x[1:] and not allowed: + sys.exit('refuse: the capacity length id %d is also used by opcode %d' % (cap, o)) + out = [] + for x in ins: + if op(x) == OP_CONSTANT and x[2] == cap: + x = [(x[0] & 0xffff0000) | OP_SPEC_CONSTANT, x[1], x[2], default] + out.append(x) + first = next((k for k, x in enumerate(out) if op(x) in (OP_DECORATE, OP_MEMBER_DECORATE)), None) + if first is None: + sys.exit('refuse: no annotation section to decorate the capacity constant in') + out[first:first] = [mk(OP_NAME, cap, *encode('cultmath_max_sites')), mk(OP_DECORATE, cap, DECORATION_SPEC_ID, SPEC_ID)] + return out, cap + + +def main(src, dst, tsv, capacity): + h, ins = load(src) + rows = [l.split('\t') for l in open(tsv).read().splitlines() if l] + ins, callee_of = export_edit(h, ins, rows) + ins, changed, params = by_value(h, ins) + default = int(open(capacity).read().split()[0]) + ins, spec = capacity_edit(h, ins, rows, callee_of, default) + words = h + [v for x in ins for v in x] + open(dst, 'wb').write(struct.pack('<%dI' % len(words), *words)) + print('spvedit: %d wrappers dropped; by-value: %d functions changed, %d parameters; capacity spec constant id %d' % (len(rows), changed, params, spec)) + + +if __name__ == '__main__': + main(*sys.argv[1:5]) diff --git a/packages/cultmath/tools/glsl/wrappers.py b/packages/cultmath/tools/glsl/wrappers.py new file mode 100644 index 00000000..742881ac --- /dev/null +++ b/packages/cultmath/tools/glsl/wrappers.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +"""Build-only export wrappers: one exported, uniquely named wrapper per top-level cultmath_ definition, so dxc keeps +every overload as its own function. The shaders are copied unchanged; the unique names exist only in . + +usage: wrappers.py +Writes /cm_wrappers.hlsl, /wrappers.tsv (wrapper, name, file, params, capacity) and +/capacity.tsv (the guard default, the sentinel). cm_wrappers.hlsl defines CULTMATH_MAX_SITES as the sentinel, +a number no shader file spells, so the site arrays get an array length id of their own and no other array shares it. An argument is the +parameter's declarator name with any [..] suffix removed; capacity lists the indices of the parameters declared +[CULTMATH_MAX_SITES]. Definitions with a Texture or Sampler parameter get no wrapper. Refuses a file where the +definition-looking lines differ from the parsed ones, and a file that names CULTMATH_MAX_SITES anywhere but its +#ifndef/#define/#endif guard and array declarators.""" +import os, re, shutil, sys + +FILES = ['CultMath.hlsl', 'CultMath.Interval.hlsl', 'CultMath.Affine.hlsl', 'CultMath.Cycles.hlsl', 'CultMath.Phacelle.hlsl'] +SIG = re.compile(r'(?m)^(\w+)[ \t]+(cultmath_\w+)[ \t]*\(([^)]*)\)') +LOOKS = re.compile(r'(?m)^\w+ cultmath_\w+\(') +GUARD = re.compile(r'#ifndef CULTMATH_MAX_SITES\n#define CULTMATH_MAX_SITES (\d+)\n#endif\n') +COMMENT = re.compile(r'//[^\n]*|/\*.*?\*/', re.S) +CAP = '[CULTMATH_MAX_SITES]' + + +def main(shaders, out): + shutil.copytree(shaders, out, dirs_exist_ok=True) + wrappers, rows, spelled, default = [], [], '', None + for fn in FILES: + text = open(os.path.join(shaders, fn)).read().replace('\r\n', '\n') + spelled += COMMENT.sub('', text) + default = default or GUARD.search(text) + stray = GUARD.sub('', COMMENT.sub('', text)).replace(CAP, '') + if 'CULTMATH_MAX_SITES' in stray: + sys.exit('refuse: %s names CULTMATH_MAX_SITES outside its guard and array declarators' % fn) + parsed = list(SIG.finditer(text)) + looks = len(LOOKS.findall(text)) + if looks != len(parsed): + sys.exit('refuse: %s has %d definition-looking lines but %d parsed' % (fn, looks, len(parsed))) + for m in parsed: + ret, name, ps = m.groups() + if re.search(r'Texture|Sampler', ps): + continue + params = [p.strip() for p in ps.split(',') if p.strip()] + args = [re.split(r'\s+', p)[-1].split('[')[0] for p in params] + cap = ','.join(str(i) for i, p in enumerate(params) if p.endswith(CAP)) + wn = 'cmw%03d_%s' % (len(rows), name) + call = '%s(%s)' % (name, ', '.join(args)) + wrappers.append('export %s %s(%s) { %s%s; }' % (ret, wn, ', '.join(params), '' if ret == 'void' else 'return ', call)) + rows.append('\t'.join([wn, name, fn, ', '.join(params), cap])) + if not default: + sys.exit('refuse: no shader file carries the CULTMATH_MAX_SITES guard') + sentinel = int(default.group(1)) + 1 + while re.search(r'(?. Source and modification history for the -precompiled assembly in this package are available in the GameCult/CultMath -repository at the corresponding package tag. +precompiled assembly in this package are available in the GameCult/CultLib +repository (`packages/cultmath`) at the corresponding package tag. Third-party code retains its original license. See `THIRD-PARTY-NOTICES.md`. diff --git a/packages/cultmath/unity/org.gamecult.cultmath/README.md b/packages/cultmath/unity/org.gamecult.cultmath/README.md index 20e1840c..4981c54c 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/README.md +++ b/packages/cultmath/unity/org.gamecult.cultmath/README.md @@ -2,7 +2,7 @@ This is CultMath's Unity 2021.3-compatible Git-UPM surface. It contains the precompiled `CultMath.dll`, portable symbols, the numeric -`Shaders/CultMath.hlsl` mirror, and the `CultMath.UnityBridge` assembly. +`Shaders/CultMath.hlsl` mirror (with its `CultMath.Phacelle.hlsl` include), and the `CultMath.UnityBridge` assembly. `CultMath.UnityBridge` is the only C# source Unity compiles here. It holds the UnityEngine conversions the engine-free core cannot declare: `ToCultMath()` on diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll index bf712012..9fd2defd 100644 Binary files a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll and b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.dll differ diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb index 1eaadd23..0ac8b9ed 100644 Binary files a/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb and b/packages/cultmath/unity/org.gamecult.cultmath/Runtime/Plugins/CultMath.pdb differ diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl new file mode 100644 index 00000000..eee7a2de --- /dev/null +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl @@ -0,0 +1,142 @@ +#ifndef CULTMATH_AFFINE_HLSL +#define CULTMATH_AFFINE_HLSL + +// Reduced affine forms with one shared symbol over float3(x0, a, e): the set { x0 + a eps + e delta : +// delta in [-1, 1] } at the region's shared eps in [-1, 1], e >= 0. Every cultmath_af_* function mirrors +// math.Affine.cs bit for bit; see that file and docs/design.md ("Affine forms") for each op's enclosure +// and the float32 rounding allowance it folds into e. Included by CultMath.hlsl after +// CultMath.Interval.hlsl, whose CULTMATH_SNOISE_LIPSCHITZ it shares, and after its own +// definition of cultmath_snoise_grad. + +// An upper bound on the spectral norm of the Hessian of cultmath_snoise(float3); provenance in +// math.Affine.cs (SNOISE_HESSIAN). +static const float CULTMATH_SNOISE_HESSIAN = 55.642143; + +// The absolute rounding of one float32 read of cultmath_snoise_grad, value and gradient; the owner is +// math.Affine.cs (SNOISE_READ_VALUE, SNOISE_READ_GRADIENT), read here by cultmath_af_snoise and in +// CultMath.hlsl by cultmath_span_slack. +static const float CULTMATH_SNOISE_READ_VALUE = 6.103515625e-5; +static const float CULTMATH_SNOISE_READ_GRADIENT = 2.44140625e-4; + +// An upper bound on the operator norm of the third-derivative tensor of cultmath_snoise(float3), the +// next order after CULTMATH_SNOISE_HESSIAN; provenance in math.Span.cs (SNOISE_THIRD). +static const float CULTMATH_SNOISE_THIRD = 535.8009; + +float3 cultmath_af_point(float value) { return float3(value, 0.0, 0.0); } +float3 cultmath_af_symbol(float x0, float a) { return float3(x0, a, 0.0); } + +float3 cultmath_af_from_iv(float2 interval) +{ + float x0 = interval.x * 0.5 + interval.y * 0.5; + float e = interval.y * 0.5 - interval.x * 0.5; + return float3(x0, 0.0, e + (abs(x0) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +// An endpoint that would be NaN is the infinity on its side. NaN is found by its bit pattern: dxc marks +// compares fast, so a test that needs NaN to make `lo == lo` false is deleted under its default flags. +float2 cultmath_af_range(float3 x) +{ + float r = abs(x.y) + x.z; + float w = abs(x.x) * 9.5367431640625e-7 + r * 9.5367431640625e-7; + float lo = x.x - r - w; + float hi = x.x + r + w; + return float2((asuint(lo) & 0x7fffffffu) > 0x7f800000u ? asfloat(0xff800000u) : lo, + (asuint(hi) & 0x7fffffffu) > 0x7f800000u ? asfloat(0x7f800000u) : hi); +} + +float3 cultmath_af_add(float3 x, float3 y) +{ + float x0 = x.x + y.x; + float a = x.y + y.y; + float e = x.z + y.z; + return float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7); +} + +float3 cultmath_af_sub(float3 x, float3 y) +{ + float x0 = x.x - y.x; + float a = x.y - y.y; + float e = x.z + y.z; + return float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7); +} + +float3 cultmath_af_neg(float3 x) { return float3(-x.x, -x.y, x.z); } + +float3 cultmath_af_scale(float3 x, float s) +{ + float x0 = x.x * s; + float a = x.y * s; + float e = x.z * abs(s); + return float3(x0, a, e + (abs(x0) + abs(a) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +float3 cultmath_af_add_iv(float3 x, float2 interval) { return cultmath_af_add(x, cultmath_af_from_iv(interval)); } + +float3 cultmath_af_mul(float3 x, float3 y) +{ + float x0 = x.x * y.x; + float p = x.x * y.y; + float q = y.x * x.y; + float a = p + q; + float e = abs(x.x) * y.z + abs(y.x) * x.z + (abs(x.y) + x.z) * (abs(y.y) + y.z); + return float3(x0, a, e + (abs(x0) + abs(p) + abs(q) + e) * 9.5367431640625e-7 + 1.17549435e-38); +} + +// The narrower of the Lipschitz form and the centred (Taylor) form over every p = centre + axis eps + w, +// |w| <= radius, from one cultmath_snoise_grad at the centre; the allowance for the float32 evaluation is +// in math.Affine.cs. +float3 cultmath_af_snoise(float3 centre, float3 axis, float radius) +{ + float4 g = cultmath_snoise_grad(centre); + float3 gradient = float3(g.x, g.y, g.z); + float reach = length(axis) + radius; + float lipschitz = CULTMATH_SNOISE_LIPSCHITZ * reach; + float a = dot(gradient, axis); + float remainder = length(gradient) * radius + 0.5 * CULTMATH_SNOISE_HESSIAN * reach * reach; + float allowance = CULTMATH_SNOISE_READ_VALUE + CULTMATH_SNOISE_READ_GRADIENT * reach + + CULTMATH_SNOISE_LIPSCHITZ * 9.5367431640625e-7 * (abs(centre.x) + abs(centre.y) + abs(centre.z) + reach); + bool centred = abs(a) + remainder < lipschitz; + float slope = centred ? a : 0.0; + float e = (centred ? remainder : lipschitz) + allowance; + return float3(g.w, slope, e + (abs(g.w) + abs(slope) + e) * 9.5367431640625e-7); +} + +// Octave sum of cultmath_af_snoise, compounding frequency and amplitude as the value-and-gradient fBm does. +float3 cultmath_af_fbm(float3 centre, float3 axis, float radius, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float3 sum = float3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + sum = cultmath_af_add(sum, cultmath_af_scale(cultmath_af_snoise(centre * frequency, axis * frequency, radius * abs(frequency)), amplitude)); + frequency *= lacunarity; + amplitude *= gain; + } + + return sum; +} + +// The axis of a screen tile's slice over the depth segment [z0, z1]; camera frame of +// cultmath_iv_frustum_ball. +float3 cultmath_af_frustum_axis(float2 centreSlope, float z0, float z1) +{ + float h = (z1 - z0) * 0.5; + return float3(centreSlope.x * h, centreSlope.y * h, h); +} + +// The affine slice of a screen tile over [z0, z1]: centre xyz, radius w. Derivation in math.Affine.cs. +float4 cultmath_af_frustum_ball(float2 centreSlope, float z0, float z1, float footprintPerDepth, float warpVariation) +{ + float zm = (z0 + z1) * 0.5; + float h = (z1 - z0) * 0.5; + float cx = centreSlope.x * zm; + float cy = centreSlope.y * zm; + float spread = (abs(centreSlope.x) + abs(centreSlope.y) + 1.0) * h; + float radius = z1 * footprintPerDepth + warpVariation; + radius += (abs(cx) + abs(cy) + abs(zm) + spread + radius) * 9.5367431640625e-7; + return float4(cx, cy, zm, radius); +} + +#endif diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl.meta b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl.meta new file mode 100644 index 00000000..9cf91737 --- /dev/null +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Affine.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5dbcf0fdd66a4a74b22f5ca1c8e33058 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Cycles.hlsl b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Cycles.hlsl new file mode 100644 index 00000000..d7731407 --- /dev/null +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Cycles.hlsl @@ -0,0 +1,363 @@ +#ifndef CULTMATH_CYCLES_HLSL +#define CULTMATH_CYCLES_HLSL + +// SPDX-License-Identifier: Apache-2.0 +// +// Cycles node semantics: what Blender's Cycles renderer computes for the Math, Map Range, Clamp, Mix and +// RGB to BW nodes and for a Color Ramp lookup, ported function by function from the Cycles kernel +// (intern/cycles of the Blender v5.2.2 tag; SPDX-FileCopyrightText: 2011-2022 Blender Foundation, Apache-2.0): +// kernel/svm/{math_util,map_range,clamp,mix,color_util,ramp,convert}.h, util/math_base.h, util/color.h and +// util/math_float3.h. Each function's comment names its Cycles source. Modified by GameCult: Cycles C++ +// becomes HLSL, a function per node operation, and the node's socket defaults and clamp options are left to +// the caller. This file is Apache-2.0 (section 4: it was changed); CultMath.hlsl, which includes it after its +// own definitions, is MIT (see THIRD-PARTY-NOTICES.md). math.Cycles.cs mirrors it bit for bit. +// +// Operands are finite floats. NaN and infinite operands are outside the oracle's reach and the mirror's. + +// FLT_EPSILON, the least epsilon a Compare node honours. +static const float CULTMATH_CYCLES_FLT_EPSILON = 1.1920929e-07; + +// The scene-linear luminance coefficients Cycles reads from Blender 5.2.2's default OCIO config +// (kernel/film linear_rgb_to_gray). The oracle fixture pins them with a case per primary. +static const float CULTMATH_CYCLES_RGB_TO_Y_R = 0.212639093; +static const float CULTMATH_CYCLES_RGB_TO_Y_G = 0.715169132; +static const float CULTMATH_CYCLES_RGB_TO_Y_B = 0.0721927434; + +// ---- Math node (kernel/svm/math_util.h svm_math; util/math_base.h) ---- + +// safe_divide +float cultmath_cycles_divide(float a, float b) { return b != 0.0 ? a / b : 0.0; } + +// safe_powf with compatible_powf. A negative base takes an integral exponent's parity; a base below zero +// with a fractional exponent is 0. +float cultmath_cycles_power(float a, float b) +{ + float whole = b >= 0.0 ? floor(b) : ceil(b); + if (a < 0.0 && b != whole) + return 0.0; + if (b == 0.0) + return 1.0; + if (a == 0.0) + return 0.0; + if (a < 0.0) + { + float magnitude = pow(-a, b); + // Odd exactly when the remainder is 1: an infinite exponent leaves NaN here and is even, as powf(a, +-inf) is never negative. + return b - 2.0 * floor(0.5 * b) == 1.0 ? -magnitude : magnitude; + } + return pow(a, b); +} + +// safe_logf +float cultmath_cycles_logarithm(float a, float b) +{ + if (a <= 0.0 || b <= 0.0) + return 0.0; + float denominator = log(b); + return denominator != 0.0 ? log(a) / denominator : 0.0; +} + +// safe_sqrtf +float cultmath_cycles_sqrt(float a) { return sqrt(max(a, 0.0)); } + +// inversesqrtf +float cultmath_cycles_inverse_sqrt(float a) { return a > 0.0 ? 1.0 / sqrt(a) : 0.0; } + +// safe_modulo is fmodf, the remainder with the dividend's sign, exactly. GLSL has no fmod, and a - b trunc(a / b) +// is wrong where the quotient rounds up to an integer or the product rounds (3 mod 0.3 is 0.29999995, not 0). +// So this subtracts the largest power-of-two multiple of the divisor not above the remainder until the +// remainder is below the divisor: every step is an exact subtraction, as in fmod. The loops are bounded by the +// binades a float spans. +float cultmath_cycles_modulo(float a, float b) +{ + float remainder = abs(a); + float divisor = abs(b); + for (int steps = 0; steps < 300 && remainder >= divisor && divisor > 0.0; steps++) + { + float multiple = divisor; + for (int doublings = 0; doublings < 300 && multiple * 2.0 <= remainder; doublings++) + multiple = multiple * 2.0; + remainder = remainder - multiple; + } + return b != 0.0 ? (a < 0.0 ? -remainder : remainder) : 0.0; +} + +// safe_floored_modulo; a build that contracts it differs by a bound stated at cycles_floored_modulo in math.Cycles.cs and the README +float cultmath_cycles_floored_modulo(float a, float b) { return b != 0.0 ? a - floor(a / b) * b : 0.0; } + +// wrapf (note the argument order: value, max, min); contraction bound as for floored_modulo +float cultmath_cycles_wrap(float value, float max_value, float min_value) +{ + float range = max_value - min_value; + return range != 0.0 ? value - (range * floor((value - min_value) / range)) : min_value; +} + +// floorf(safe_divide(a, b)) * b +float cultmath_cycles_snap(float a, float b) { return floor(cultmath_cycles_divide(a, b)) * b; } + +// pingpongf +float cultmath_cycles_pingpong(float a, float b) +{ + float scaled = (a - b) / (b * 2.0); + return b != 0.0 ? abs((scaled - floor(scaled)) * b * 2.0 - b) : 0.0; +} + +// smoothminf +float cultmath_cycles_smooth_min(float a, float b, float k) +{ + float h = max(k - abs(a - b), 0.0) / k; + return k != 0.0 ? min(a, b) - h * h * h * k * 0.16666667 : min(a, b); +} + +// -smoothminf(-a, -b, k) +float cultmath_cycles_smooth_max(float a, float b, float k) { return -cultmath_cycles_smooth_min(-a, -b, k); } + +// NODE_MATH_COMPARE +float cultmath_cycles_compare(float a, float b, float epsilon) +{ + return (a == b || abs(a - b) <= max(epsilon, CULTMATH_CYCLES_FLT_EPSILON)) ? 1.0 : 0.0; +} + +// NODE_MATH_ROUND +float cultmath_cycles_round(float a) { return floor(a + 0.5); } + +// NODE_MATH_TRUNC +float cultmath_cycles_trunc(float a) { return a >= 0.0 ? floor(a) : ceil(a); } + +// NODE_MATH_FRACTION +float cultmath_cycles_fract(float a) { return a - floor(a); } + +// compatible_signf +float cultmath_cycles_sign(float a) { return a == 0.0 ? 0.0 : (a < 0.0 ? -1.0 : 1.0); } + +// safe_asinf +float cultmath_cycles_arcsine(float a) { return asin(clamp(a, -1.0, 1.0)); } + +// safe_acosf +float cultmath_cycles_arccosine(float a) { return acos(clamp(a, -1.0, 1.0)); } + +// compatible_atan2 (a is y, b is x) +float cultmath_cycles_arctan2(float a, float b) { return (b == 0.0 && a == 0.0) ? 0.0 : atan2(a, b); } + +// ---- Map Range node (kernel/svm/map_range.h svm_node_map_range) ---- +// A Map Range node's Clamp option is a Clamp node of type Range on its result (MapRangeNode::expand): +// compose cultmath_cycles_clamp_range over these. + +float cultmath_cycles_map_range_linear(float value, float from_min, float from_max, float to_min, float to_max) +{ + float factor = (value - from_min) / (from_max - from_min); + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +float cultmath_cycles_map_range_stepped(float value, float from_min, float from_max, float to_min, float to_max, float steps) +{ + float factor = (value - from_min) / (from_max - from_min); + factor = steps > 0.0 ? floor(factor * (steps + 1.0)) / steps : 0.0; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// The value itself, not a normalized one, goes through smoothstep(from_min, from_max, .), flipped when +// from_min > from_max (util/math_base.h smoothstep). +float cultmath_cycles_map_range_smoothstep(float value, float from_min, float from_max, float to_min, float to_max) +{ + float low = min(from_min, from_max); + float high = max(from_min, from_max); + float t = (value - low) / (high - low); + float eased = value < low ? 0.0 : (value >= high ? 1.0 : (3.0 - 2.0 * t) * (t * t)); + float factor = from_min > from_max ? 1.0 - eased : eased; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// smootherstep of map_range.h, flipped when from_min > from_max. +float cultmath_cycles_map_range_smootherstep(float value, float from_min, float from_max, float to_min, float to_max) +{ + float low = min(from_min, from_max); + float high = max(from_min, from_max); + float x = clamp(cultmath_cycles_divide(value - low, high - low), 0.0, 1.0); + float eased = x * x * x * (x * (x * 6.0 - 15.0) + 10.0); + float factor = from_min > from_max ? 1.0 - eased : eased; + return from_max != from_min ? to_min + factor * (to_max - to_min) : 0.0; +} + +// ---- Clamp node (kernel/svm/clamp.h svm_node_clamp) ---- + +// Type Min Max +float cultmath_cycles_clamp_minmax(float value, float min_value, float max_value) { return clamp(value, min_value, max_value); } + +// Type Range: the bounds swap when min_value > max_value. +float cultmath_cycles_clamp_range(float value, float min_value, float max_value) +{ + return min_value > max_value ? clamp(value, max_value, min_value) : clamp(value, min_value, max_value); +} + +// ---- Mix node (kernel/svm/mix.h, color_util.h) ---- +// Factor clamping (svm_node_mix_color's saturatef) and result clamping (saturate) are the caller's. + +// svm_node_mix_float +float cultmath_cycles_mix_float(float t, float a, float b) { return a * (1.0 - t) + b * t; } + +// svm_node_mix_vector +float3 cultmath_cycles_mix_vector(float t, float3 a, float3 b) { return a * (float3(1.0, 1.0, 1.0) - t) + b * t; } + +float3 cultmath_cycles_mix_blend(float t, float3 col1, float3 col2) { return col1 + t * (col2 - col1); } + +float3 cultmath_cycles_mix_add(float t, float3 col1, float3 col2) { return col1 + t * ((col1 + col2) - col1); } + +float3 cultmath_cycles_mix_mul(float t, float3 col1, float3 col2) { return col1 + t * (col1 * col2 - col1); } + +float3 cultmath_cycles_mix_screen(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 one = float3(1.0, 1.0, 1.0); + return one - (float3(tm, tm, tm) + t * (one - col2)) * (one - col1); +} + +float3 cultmath_cycles_mix_overlay(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + return float3( + col1.x < 0.5 ? col1.x * (tm + 2.0 * t * col2.x) : 1.0 - (tm + 2.0 * t * (1.0 - col2.x)) * (1.0 - col1.x), + col1.y < 0.5 ? col1.y * (tm + 2.0 * t * col2.y) : 1.0 - (tm + 2.0 * t * (1.0 - col2.y)) * (1.0 - col1.y), + col1.z < 0.5 ? col1.z * (tm + 2.0 * t * col2.z) : 1.0 - (tm + 2.0 * t * (1.0 - col2.z)) * (1.0 - col1.z)); +} + +float3 cultmath_cycles_mix_sub(float t, float3 col1, float3 col2) { return col1 + t * ((col1 - col2) - col1); } + +float3 cultmath_cycles_mix_div(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + return float3( + col2.x != 0.0 ? tm * col1.x + t * col1.x / col2.x : col1.x, + col2.y != 0.0 ? tm * col1.y + t * col1.y / col2.y : col1.y, + col2.z != 0.0 ? tm * col1.z + t * col1.z / col2.z : col1.z); +} + +float3 cultmath_cycles_mix_diff(float t, float3 col1, float3 col2) { return col1 + t * (abs(col1 - col2) - col1); } + +float3 cultmath_cycles_mix_exclusion(float t, float3 col1, float3 col2) +{ + return max(col1 + t * ((col1 + col2 - 2.0 * col1 * col2) - col1), float3(0.0, 0.0, 0.0)); +} + +float3 cultmath_cycles_mix_dark(float t, float3 col1, float3 col2) { return col1 + t * (min(col1, col2) - col1); } + +float3 cultmath_cycles_mix_light(float t, float3 col1, float3 col2) { return col1 + t * (max(col1, col2) - col1); } + +float3 cultmath_cycles_mix_dodge(float t, float3 col1, float3 col2) +{ + float3 divisor = float3(1.0, 1.0, 1.0) - t * col2; + return float3( + col1.x != 0.0 ? (divisor.x <= 0.0 ? 1.0 : min(col1.x / divisor.x, 1.0)) : col1.x, + col1.y != 0.0 ? (divisor.y <= 0.0 ? 1.0 : min(col1.y / divisor.y, 1.0)) : col1.y, + col1.z != 0.0 ? (divisor.z <= 0.0 ? 1.0 : min(col1.z / divisor.z, 1.0)) : col1.z); +} + +float3 cultmath_cycles_mix_burn(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 divisor = tm + t * col2; + float3 burnt = float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - col1) / divisor; + return float3( + divisor.x <= 0.0 ? 0.0 : clamp(burnt.x, 0.0, 1.0), + divisor.y <= 0.0 ? 0.0 : clamp(burnt.y, 0.0, 1.0), + divisor.z <= 0.0 ? 0.0 : clamp(burnt.z, 0.0, 1.0)); +} + +// rgb_to_hsv of util/color.h +float3 cultmath_cycles_rgb_to_hsv(float3 rgb) +{ + float cmax = max(rgb.x, max(rgb.y, rgb.z)); + float cmin = min(rgb.x, min(rgb.y, rgb.z)); + float cdelta = cmax - cmin; + float s = cmax != 0.0 ? cdelta / cmax : 0.0; + float3 c = (float3(cmax, cmax, cmax) - rgb) / cdelta; + float h = rgb.x == cmax ? c.z - c.y : (rgb.y == cmax ? 2.0 + c.x - c.z : 4.0 + c.y - c.x); + h = h * 0.16666667; // Cycles' kernel is built with reciprocal math: h /= 6.0f computes h * (1 / 6.0f). + h = h < 0.0 ? h + 1.0 : h; + return float3(s != 0.0 ? h : 0.0, s, cmax); +} + +// hsv_to_rgb of util/color.h +float3 cultmath_cycles_hsv_to_rgb(float3 hsv) +{ + float h = hsv.x == 1.0 ? 0.0 : hsv.x; + h = h * 6.0; + float i = floor(h); + float f = h - i; + float p = hsv.z * (1.0 - hsv.y); + float q = hsv.z * (1.0 - (hsv.y * f)); + float t = hsv.z * (1.0 - (hsv.y * (1.0 - f))); + float3 rgb = i == 0.0 ? float3(hsv.z, t, p) : + (i == 1.0 ? float3(q, hsv.z, p) : + (i == 2.0 ? float3(p, hsv.z, t) : + (i == 3.0 ? float3(p, q, hsv.z) : + (i == 4.0 ? float3(t, p, hsv.z) : float3(hsv.z, p, q))))); + return hsv.y != 0.0 ? rgb : float3(hsv.z, hsv.z, hsv.z); +} + +float3 cultmath_cycles_mix_hue(float t, float3 col1, float3 col2) +{ + float3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + float3 hsv = cultmath_cycles_rgb_to_hsv(col1); + float3 shifted = cultmath_cycles_hsv_to_rgb(float3(hsv2.x, hsv.y, hsv.z)); + return hsv2.y != 0.0 ? col1 + t * (shifted - col1) : col1; +} + +float3 cultmath_cycles_mix_sat(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 hsv = cultmath_cycles_rgb_to_hsv(col1); + float3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + return hsv.y != 0.0 ? cultmath_cycles_hsv_to_rgb(float3(hsv.x, tm * hsv.y + t * hsv2.y, hsv.z)) : col1; +} + +float3 cultmath_cycles_mix_val(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 hsv = cultmath_cycles_rgb_to_hsv(col1); + float3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + return cultmath_cycles_hsv_to_rgb(float3(hsv.x, hsv.y, tm * hsv.z + t * hsv2.z)); +} + +float3 cultmath_cycles_mix_color(float t, float3 col1, float3 col2) +{ + float3 hsv2 = cultmath_cycles_rgb_to_hsv(col2); + float3 hsv = cultmath_cycles_rgb_to_hsv(col1); + float3 shifted = cultmath_cycles_hsv_to_rgb(float3(hsv2.x, hsv2.y, hsv.z)); + return hsv2.y != 0.0 ? col1 + t * (shifted - col1) : col1; +} + +float3 cultmath_cycles_mix_soft(float t, float3 col1, float3 col2) +{ + float tm = 1.0 - t; + float3 one = float3(1.0, 1.0, 1.0); + float3 scr = one - (one - col2) * (one - col1); + return tm * col1 + t * ((one - col1) * col2 * col1 + col1 * scr); +} + +float3 cultmath_cycles_mix_linear(float t, float3 col1, float3 col2) +{ + return col1 + t * (2.0 * col2 + float3(-1.0, -1.0, -1.0)); +} + +// ---- RGB to BW node (kernel/svm/convert.h NODE_CONVERT_CF) ---- + +float cultmath_cycles_rgb_to_bw(float3 color) +{ + return color.x * CULTMATH_CYCLES_RGB_TO_Y_R + color.y * CULTMATH_CYCLES_RGB_TO_Y_G + color.z * CULTMATH_CYCLES_RGB_TO_Y_B; +} + +// ---- Color Ramp lookup (kernel/svm/ramp.h rgb_ramp_lookup, without extrapolation) ---- + +// Where a ramp of `size` table entries is read at t: (index, weight), the lower entry and the weight of the +// next one. The colour is table[index] when weight is 0 and (1 - weight) table[index] + weight table[index + 1] +// otherwise. The ramp table itself is the caller's; Blender's holds 257 entries, the ramp sampled at i / 256. +float2 cultmath_cycles_ramp_index(float t, int size) +{ + float f = (t > 0.0 ? (t < 1.0 ? t : 1.0) : 0.0) * (float)(size - 1); + int index = clamp((int)f, 0, size - 1); + float lower = (float)index; + return float2(lower, f - lower); +} + +#endif diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Cycles.hlsl.meta b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Cycles.hlsl.meta new file mode 100644 index 00000000..4085b3eb --- /dev/null +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Cycles.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 477bb38d537244b78e3eaec093530bcc +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl new file mode 100644 index 00000000..bc084ace --- /dev/null +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl @@ -0,0 +1,133 @@ +#ifndef CULTMATH_INTERVAL_HLSL +#define CULTMATH_INTERVAL_HLSL + +// Interval arithmetic over float2(lo, hi), lo <= hi, both finite. Every cultmath_iv_* function returns +// an interval containing f(x) for every x in its input intervals, mirroring math.Interval.cs bit for +// bit; see that file and docs/design.md ("Intervals") for each op's enclosure and its ulp widening. +// Included by CultMath.hlsl after its own definitions of cultmath_smoothstep and cultmath_snoise. + +// Lipschitz constant of cultmath_snoise(float3); provenance in math.Interval.cs (SNOISE_LIPSCHITZ). +static const float CULTMATH_SNOISE_LIPSCHITZ = 7.9640074; + +// Lipschitz constant of cultmath_snoise(float2); provenance in math.Interval.cs (SNOISE2_LIPSCHITZ). +static const float CULTMATH_SNOISE2_LIPSCHITZ = 8.117002; + +float2 cultmath_iv_point(float value) { return float2(value, value); } +float2 cultmath_iv_add(float2 a, float2 b) { return float2(a.x + b.x, a.y + b.y); } +float2 cultmath_iv_sub(float2 a, float2 b) { return float2(a.x - b.y, a.y - b.x); } +float2 cultmath_iv_neg(float2 a) { return float2(-a.y, -a.x); } + +float2 cultmath_iv_mul(float2 a, float2 b) +{ + float p0 = a.x * b.x; + float p1 = a.x * b.y; + float p2 = a.y * b.x; + float p3 = a.y * b.y; + return float2(min(min(p0, p1), min(p2, p3)), max(max(p0, p1), max(p2, p3))); +} + +float2 cultmath_iv_scale(float2 a, float s) { return s >= 0.0 ? float2(a.x * s, a.y * s) : float2(a.y * s, a.x * s); } + +float2 cultmath_iv_abs(float2 a) +{ + if (a.x >= 0.0) + return a; + if (a.y <= 0.0) + return float2(-a.y, -a.x); + return float2(0.0, max(-a.x, a.y)); +} + +float2 cultmath_iv_min(float2 a, float2 b) { return float2(min(a.x, b.x), min(a.y, b.y)); } +float2 cultmath_iv_max(float2 a, float2 b) { return float2(max(a.x, b.x), max(a.y, b.y)); } + +float2 cultmath_iv_sqr(float2 a) +{ + float l = a.x * a.x; + float h = a.y * a.y; + if (a.x >= 0.0) + return float2(l, h); + if (a.y <= 0.0) + return float2(h, l); + return float2(0.0, max(l, h)); +} + +float2 cultmath_iv_sqrt(float2 a) { return float2(sqrt(max(a.x, 0.0)), sqrt(max(a.y, 0.0))); } + +// Widened by one ulp on each side: exp is not required to be correctly rounded. +float2 cultmath_iv_exp(float2 a) +{ + float lo = exp(a.x); + float hi = exp(a.y); + return float2(lo > 0.0 ? asfloat(asuint(lo) - 1u) : 0.0, asfloat(asuint(hi) + 1u)); +} + +float2 cultmath_iv_clamp(float2 a, float minimum, float maximum) +{ + return float2(cultmath_clamp(a.x, minimum, maximum), cultmath_clamp(a.y, minimum, maximum)); +} + +float2 cultmath_iv_saturate(float2 a) { return float2(cultmath_saturate(a.x), cultmath_saturate(a.y)); } + +// The endpoints, ordered, widened by one ulp inside [0, 1]: the float32 evaluation of smoothstep is +// monotone only to within one ulp. +float2 cultmath_iv_smoothstep(float minimum, float maximum, float2 a) +{ + float s0 = cultmath_smoothstep(minimum, maximum, a.x); + float s1 = cultmath_smoothstep(minimum, maximum, a.y); + float lo = min(s0, s1); + float hi = max(s0, s1); + return float2(lo > 0.0 ? asfloat(asuint(lo) - 1u) : 0.0, hi < 1.0 ? asfloat(asuint(hi) + 1u) : 1.0); +} + +// The natural interval extension of x + (y - x) * amount, which is how cultmath_lerp evaluates. +float2 cultmath_iv_lerp(float2 a, float2 b, float amount) { return cultmath_iv_add(a, cultmath_iv_scale(cultmath_iv_sub(b, a), amount)); } + +// [n - L r, n + L r] intersected with [-1, 1], n = cultmath_snoise(centre). One snoise, value only. +float2 cultmath_iv_snoise_ball(float3 centre, float radius) +{ + float n = cultmath_snoise(centre); + float e = CULTMATH_SNOISE_LIPSCHITZ * radius; + return float2(max(n - e, -1.0), min(n + e, 1.0)); +} + +// The 2D overload: [n - L2 r, n + L2 r] intersected with [-1, 1], n = cultmath_snoise(centre). One snoise, value only. +float2 cultmath_iv_snoise_ball(float2 centre, float radius) +{ + float n = cultmath_snoise(centre); + float e = CULTMATH_SNOISE2_LIPSCHITZ * radius; + return float2(max(n - e, -1.0), min(n + e, 1.0)); +} + +// Octave sum of cultmath_iv_snoise_ball, compounding frequency and amplitude as the value-and-gradient fBm does. +float2 cultmath_iv_fbm_ball(float3 centre, float radius, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float2 sum = float2(0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + sum = cultmath_iv_add(sum, cultmath_iv_scale(cultmath_iv_snoise_ball(centre * frequency, radius * abs(frequency)), amplitude)); + frequency *= lacunarity; + amplitude *= gain; + } + + return sum; +} + +// A ball (xyz centre, w radius) enclosing every point of every ray of a screen tile over the depth segment +// [z0, z1], warped by at most warp. Camera frame: pinhole at the origin looking down +z, ray (m z, z). +// footprintPerDepth = N / (sqrt(2) f) for an N x N tile at focal length f. The radius is widened by +// (|c|_1 + radius) 2^-20, which covers the ball's own float32 rounding. Derivation in math.Interval.cs. +float4 cultmath_iv_frustum_ball(float2 centreSlope, float z0, float z1, float footprintPerDepth, float warp) +{ + float zm = (z0 + z1) * 0.5; + float axis = sqrt(centreSlope.x * centreSlope.x + centreSlope.y * centreSlope.y + 1.0); + float cx = centreSlope.x * zm; + float cy = centreSlope.y * zm; + float radius = (z1 - z0) * 0.5 * axis + z1 * footprintPerDepth + warp; + radius += (abs(cx) + abs(cy) + abs(zm) + radius) * 9.5367431640625e-7; + return float4(cx, cy, zm, radius); +} + +#endif diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl.meta b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl.meta new file mode 100644 index 00000000..023d218c --- /dev/null +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Interval.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 18b031192f344246ac523cea014b8f24 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Phacelle.hlsl b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Phacelle.hlsl new file mode 100644 index 00000000..deb47813 --- /dev/null +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Phacelle.hlsl @@ -0,0 +1,99 @@ +#ifndef CULTMATH_PHACELLE_HLSL +#define CULTMATH_PHACELLE_HLSL + +// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of +// the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. +// +// Phacelle noise. Copyright (c) 2025 Rune Skovbo Johansen (Shadertoy t3dyWl; MPL-2.0), read from the +// C# port PhacelleNoise in lpmitchell/AdvancedTerrainErosion, converted to burstable C# by Luke +// Mitchell (2026). Modified by GameCult: 3D cells, a caller-supplied stripe wave vector, an exact +// gradient and exact pruning. This file is an MPL-2.0 file; CultMath.hlsl, which includes it after +// its own definitions of CULTMATH_TAU and cultmath_pcg3d, is MIT (see THIRD-PARTY-NOTICES.md). + +// Invariant 8's struct return shape for cultmath_phacelle, compared field by field and bit for bit +// against CultMath.CultPhasor, same field order. +struct CultPhasor +{ + float4 cosine; + float4 sine; +}; + +// Johansen's Phacelle noise on 3D cells. See math.phacelle's comment (math.Phacelle.cs) for the stripe wave +// vector, the weight, the normalization, the exact gradient and why the prune is exact. Mirrors +// the C# body operation for operation; the C#-only internal overload that switches the prune off +// has no shader twin. +CultPhasor cultmath_phacelle(float3 p, float3 side, float offset, float normalization) +{ + float3 cell = floor(p); + float3 local = p - cell; + float phaseOffset = offset * CULTMATH_TAU; + float sumW = 0.0; + float sumCos = 0.0; + float sumSin = 0.0; + float3 gradW = float3(0.0, 0.0, 0.0); + float3 gradCos = float3(0.0, 0.0, 0.0); + float3 gradSin = float3(0.0, 0.0, 0.0); + + for (int dz = -1; dz <= 2; dz++) + { + float gz = max(0.0, abs(local.z - (float)dz) - 0.5); + for (int dy = -1; dy <= 2; dy++) + { + float gy = max(0.0, abs(local.y - (float)dy) - 0.5); + for (int dx = -1; dx <= 2; dx++) + { + float gx = max(0.0, abs(local.x - (float)dx) - 0.5); + if (gx * gx + gy * gy + gz * gz >= 2.25) + continue; + + float3 gridStep = float3(dx, dy, dz); + int3 hash = cultmath_pcg3d(int3(cell + gridStep)); + float3 jitter = float3( + (float)((uint)hash.x >> 8) * (1.0 / 16777216.0) - 0.5, + (float)((uint)hash.y >> 8) * (1.0 / 16777216.0) - 0.5, + (float)((uint)hash.z >> 8) * (1.0 / 16777216.0) - 0.5); + float3 v = local - gridStep - jitter; + float falloff = exp(-2.0 * dot(v, v)); + float w = max(0.0, falloff - 0.01111); + float3 dw = w > 0.0 ? (-4.0 * falloff) * v : float3(0.0, 0.0, 0.0); + float phase = dot(v, side) + phaseOffset; + float c = cos(phase); + float s = sin(phase); + + sumW += w; + sumCos += w * c; + sumSin += w * s; + gradW += dw; + gradCos += dw * c - (w * s) * side; + gradSin += dw * s + (w * c) * side; + } + } + } + + float invW = 1.0 / sumW; + float rawCos = sumCos * invW; + float rawSin = sumSin * invW; + float3 gradRawCos = (gradCos - rawCos * gradW) * invW; + float3 gradRawSin = (gradSin - rawSin * gradW) * invW; + float rawLength = sqrt(rawCos * rawCos + rawSin * rawSin); + float floorLength = 1.0 - normalization; + + CultPhasor result; + if (rawLength > floorLength) + { + float outCos = rawCos / rawLength; + float outSin = rawSin / rawLength; + float3 gradLength = (rawCos * gradRawCos + rawSin * gradRawSin) / rawLength; + result.cosine = float4((gradRawCos - outCos * gradLength) / rawLength, outCos); + result.sine = float4((gradRawSin - outSin * gradLength) / rawLength, outSin); + } + else + { + result.cosine = float4(gradRawCos / floorLength, rawCos / floorLength); + result.sine = float4(gradRawSin / floorLength, rawSin / floorLength); + } + + return result; +} + +#endif diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Phacelle.hlsl.meta b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Phacelle.hlsl.meta new file mode 100644 index 00000000..9c074cb5 --- /dev/null +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.Phacelle.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5b1c7e0a94d24f6c8a3e2d17f60b9c48 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl index 365705f5..d3eea396 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl +++ b/packages/cultmath/unity/org.gamecult.cultmath/Shaders/CultMath.hlsl @@ -11,7 +11,6 @@ static const float CULTMATH_PI = 3.14159265358979323846; static const float CULTMATH_TAU = 6.28318530717958647692; static const float CULTMATH_HALF_PI = 1.57079632679489661923; -static const float CULTMATH_NORMALIZE_EPSILON = 1.0e-20; float cultmath_radians(float degrees_value) { return degrees_value * (CULTMATH_PI / 180.0); } float cultmath_degrees(float radians_value) { return radians_value * (180.0 / CULTMATH_PI); } @@ -77,17 +76,18 @@ float cultmath_smootherstep(float value) float2 cultmath_snoise_mod289(float2 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } float3 cultmath_snoise_mod289(float3 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } float4 cultmath_snoise_mod289(float4 value) { return value - floor(value * (1.0 / 289.0)) * 289.0; } -float3 cultmath_snoise_permute(float3 value) { return cultmath_snoise_mod289(((value * 34.0) + 1.0) * value); } -float4 cultmath_snoise_permute(float4 value) { return cultmath_snoise_mod289(((value * 34.0) + 1.0) * value); } +float3 cultmath_snoise_permute(float3 value) { return cultmath_snoise_mod289(((value * 34.0) + 10.0) * value); } +float4 cultmath_snoise_permute(float4 value) { return cultmath_snoise_mod289(((value * 34.0) + 10.0) * value); } // Ashima Arts / Ian McEwan 3D simplex noise (MIT), same float32 evaluation -// order as the C# math.snoise(float3) mirror. +// order as the C# math.snoise(float3) mirror. Ties resolve in simplexnoise1234's +// total order; see math.snoise. float cultmath_snoise(float3 value) { float2 c = float2(1.0 / 6.0, 1.0 / 3.0); float3 i = floor(value + dot(value, c.yyy)); float3 x0 = value - i + dot(i, c.xxx); - float3 g = step(x0.yzx, x0.xyz); + float3 g = float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); float3 l = 1.0 - g; float3 i1 = min(g.xyz, l.zxy); float3 i2 = max(g.xyz, l.zxy); @@ -112,7 +112,7 @@ float cultmath_snoise(float3 value) float4 b1 = float4(x.zw, y.zw); float4 s0 = floor(b0) * 2.0 + 1.0; float4 s1 = floor(b1) * 2.0 + 1.0; - float4 sh = -step(h, 0.0); + float4 sh = -step(h, float4(0.0, 0.0, 0.0, 0.0)); float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; @@ -126,9 +126,9 @@ float cultmath_snoise(float3 value) p2 *= norm.z; p3 *= norm.w; - float4 m = max(0.6 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + float4 m = max(0.5 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); m = m * m; - return 42.0 * dot(m * m, float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); + return 105.0 * dot(m * m, float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); } float cultmath_snoise(float2 value) @@ -163,6 +163,207 @@ float cultmath_snoise(float2 value) return 130.0 * dot(m, g); } +// Analytic gradient of cultmath_snoise(float3) (invariant 8), following webgl-noise +// src/noise3Dgrad.glsl (Ashima Arts / McEwan, MIT); same kernel, permutation and scale as +// cultmath_snoise(float3) (stegu/webgl-noise 22434e04d7). See the C# math.snoise_grad comment for the +// derivation. Every local up through p0..p3 and x0..x3 is cultmath_snoise(float3)'s own derivation +// verbatim. +float4 cultmath_snoise_grad(float3 value) +{ + float2 c = float2(1.0 / 6.0, 1.0 / 3.0); + float3 i = floor(value + dot(value, c.yyy)); + float3 x0 = value - i + dot(i, c.xxx); + float3 g = float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); + float3 l = 1.0 - g; + float3 i1 = min(g.xyz, l.zxy); + float3 i2 = max(g.xyz, l.zxy); + float3 x1 = x0 - i1 + c.xxx; + float3 x2 = x0 - i2 + c.yyy; + float3 x3 = x0 - 0.5; + + i = cultmath_snoise_mod289(i); + float4 p = cultmath_snoise_permute(cultmath_snoise_permute(cultmath_snoise_permute( + i.z + float4(0.0, i1.z, i2.z, 1.0)) + i.y + float4(0.0, i1.y, i2.y, 1.0)) + i.x + float4(0.0, i1.x, i2.x, 1.0)); + + const float n_ = 0.142857142857; + float3 ns = float3(2.0 * n_, 0.5 * n_ - 1.0, n_); + float4 j = p - 49.0 * floor(p * ns.z * ns.z); + float4 x_ = floor(j * ns.z); + float4 y_ = floor(j - 7.0 * x_); + float4 x = x_ * ns.x + ns.yyyy; + float4 y = y_ * ns.x + ns.yyyy; + float4 h = 1.0 - abs(x) - abs(y); + + float4 b0 = float4(x.xy, y.xy); + float4 b1 = float4(x.zw, y.zw); + float4 s0 = floor(b0) * 2.0 + 1.0; + float4 s1 = floor(b1) * 2.0 + 1.0; + float4 sh = -step(h, float4(0.0, 0.0, 0.0, 0.0)); + float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + float3 p0 = float3(a0.xy, h.x); + float3 p1 = float3(a0.zw, h.y); + float3 p2 = float3(a1.xy, h.z); + float3 p3 = float3(a1.zw, h.w); + float4 norm = 1.79284291400159 - 0.85373472095314 * float4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + float4 m0 = max(0.5 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + float4 m2 = m0 * m0; + float4 m3 = m2 * m0; + float4 m4 = m2 * m2; + + float4 px = float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)); + float value2 = 105.0 * dot(m4, px); + float3 grad = -8.0 * m3.x * x0 * px.x + m4.x * p0 + + -8.0 * m3.y * x1 * px.y + m4.y * p1 + + -8.0 * m3.z * x2 * px.z + m4.z * p2 + + -8.0 * m3.w * x3 * px.w + m4.w * p3; + grad *= 105.0; + + return float4(grad, value2); +} + +// Analytic Hessian of cultmath_snoise(float3); see the C# math.snoise_hessian comment for the +// derivation. Every local up through p0..p3 and x0..x3 is cultmath_snoise_grad's own. The matrix is +// built from nine scalars, which read as rows in HLSL and as columns in GLSL; it is symmetric, so the +// two agree. +float3x3 cultmath_snoise_hessian(float3 value) +{ + float2 c = float2(1.0 / 6.0, 1.0 / 3.0); + float3 i = floor(value + dot(value, c.yyy)); + float3 x0 = value - i + dot(i, c.xxx); + float3 g = float3(step(x0.y, x0.x), step(x0.z, x0.y), 1.0 - step(x0.z, x0.x)); + float3 l = 1.0 - g; + float3 i1 = min(g.xyz, l.zxy); + float3 i2 = max(g.xyz, l.zxy); + float3 x1 = x0 - i1 + c.xxx; + float3 x2 = x0 - i2 + c.yyy; + float3 x3 = x0 - 0.5; + + i = cultmath_snoise_mod289(i); + float4 p = cultmath_snoise_permute(cultmath_snoise_permute(cultmath_snoise_permute( + i.z + float4(0.0, i1.z, i2.z, 1.0)) + i.y + float4(0.0, i1.y, i2.y, 1.0)) + i.x + float4(0.0, i1.x, i2.x, 1.0)); + + const float n_ = 0.142857142857; + float3 ns = float3(2.0 * n_, 0.5 * n_ - 1.0, n_); + float4 j = p - 49.0 * floor(p * ns.z * ns.z); + float4 x_ = floor(j * ns.z); + float4 y_ = floor(j - 7.0 * x_); + float4 x = x_ * ns.x + ns.yyyy; + float4 y = y_ * ns.x + ns.yyyy; + float4 h = 1.0 - abs(x) - abs(y); + + float4 b0 = float4(x.xy, y.xy); + float4 b1 = float4(x.zw, y.zw); + float4 s0 = floor(b0) * 2.0 + 1.0; + float4 s1 = floor(b1) * 2.0 + 1.0; + float4 sh = -step(h, float4(0.0, 0.0, 0.0, 0.0)); + float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + float3 p0 = float3(a0.xy, h.x); + float3 p1 = float3(a0.zw, h.y); + float3 p2 = float3(a1.xy, h.z); + float3 p3 = float3(a1.zw, h.w); + float4 norm = 1.79284291400159 - 0.85373472095314 * float4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + float4 m0 = max(0.5 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + float4 m2 = m0 * m0; + float4 m3 = m2 * m0; + float4 px = float4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)); + float4 wide = 48.0 * m2 * px; + float4 narrow = 8.0 * m3; + + float4 cxx = float4(x0.x, x1.x, x2.x, x3.x); + float4 cxy = float4(x0.y, x1.y, x2.y, x3.y); + float4 cxz = float4(x0.z, x1.z, x2.z, x3.z); + float4 cpx = float4(p0.x, p1.x, p2.x, p3.x); + float4 cpy = float4(p0.y, p1.y, p2.y, p3.y); + float4 cpz = float4(p0.z, p1.z, p2.z, p3.z); + + float hxx = 105.0 * (dot(wide * cxx, cxx) - dot(narrow, 2.0 * cpx * cxx + px)); + float hyy = 105.0 * (dot(wide * cxy, cxy) - dot(narrow, 2.0 * cpy * cxy + px)); + float hzz = 105.0 * (dot(wide * cxz, cxz) - dot(narrow, 2.0 * cpz * cxz + px)); + float hxy = 105.0 * (dot(wide * cxx, cxy) - dot(narrow, cpx * cxy + cpy * cxx)); + float hxz = 105.0 * (dot(wide * cxx, cxz) - dot(narrow, cpx * cxz + cpz * cxx)); + float hyz = 105.0 * (dot(wide * cxy, cxz) - dot(narrow, cpy * cxz + cpz * cxy)); + return float3x3(hxx, hxy, hxz, hxy, hyy, hyz, hxz, hyz, hzz); +} + +// The integral over [t0, t1] of clamp(a + b t, lo, hi); see the C# math.integral_clamp_linear comment. +float cultmath_integral_clamp_linear(float a, float b, float lo, float hi, float t0, float t1) +{ + lo = min(lo, hi); + if (b == 0.0) + return t1 != t0 ? clamp(a, lo, hi) * (t1 - t0) : 0.0; + + float direction = t1 < t0 ? -1.0 : 1.0; + float start = min(t0, t1); + float stop = max(t0, t1); + float atLo = (lo - a) / b; + float atHi = (hi - a) / b; + float enter = clamp(min(atLo, atHi), start, stop); + float leave = clamp(max(atLo, atHi), start, stop); + float before = b > 0.0 ? lo : hi; + float after = b > 0.0 ? hi : lo; + float held = enter > start ? before * (enter - start) : 0.0; + float kept = stop > leave ? after * (stop - leave) : 0.0; + float total = held + (a + b * (0.5 * (enter + leave))) * (leave - enter) + kept; + return direction * total; +} + +// Octave sum of cultmath_snoise_grad (invariant 8); see the C# math.fbm_grad comment for the +// per-octave frequency/amplitude derivation and why octaves is clamped. +float4 cultmath_fbm_grad(float3 p, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float value = 0.0; + float3 gradient = float3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + float4 n = cultmath_snoise_grad(p * frequency); + value += amplitude * n.w; + gradient += amplitude * frequency * n.xyz; + frequency *= lacunarity; + amplitude *= gain; + } + + return float4(gradient, value); +} + +// Ridged multifractal noise (Musgrave, Texturing and Modeling, ch. 16); see the C# math.ridged_grad +// comment for the fold/sign derivation, the deliberate crease at n = 0, and why octaves is clamped. +float4 cultmath_ridged_grad(float3 p, int octaves, float lacunarity, float gain) +{ + octaves = clamp(octaves, 0, 16); + float amplitude = 1.0; + float frequency = 1.0; + float value = 0.0; + float3 gradient = float3(0.0, 0.0, 0.0); + for (int i = 0; i < octaves; i++) + { + float4 n = cultmath_snoise_grad(p * frequency); + float s = sign(n.w); + value += amplitude * (1.0 - abs(n.w)); + gradient += -amplitude * frequency * s * n.xyz; + frequency *= lacunarity; + amplitude *= gain; + } + + return float4(gradient, value); +} + float cultmath_lengthsq(float2 value) { return dot(value, value); } float cultmath_lengthsq(float3 value) { return dot(value, value); } float cultmath_lengthsq(float4 value) { return dot(value, value); } @@ -171,10 +372,6 @@ float cultmath_distance(float2 left, float2 right) { return length(left - right) float cultmath_distance(float3 left, float3 right) { return length(left - right); } float cultmath_distance(float4 left, float4 right) { return length(left - right); } -float2 cultmath_normalize(float2 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } -float3 cultmath_normalize(float3 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } -float4 cultmath_normalize(float4 value) { return value / max(length(value), CULTMATH_NORMALIZE_EPSILON); } - float2 cultmath_reflect(float2 incident, float2 normal_value) { return incident - 2.0 * dot(normal_value, incident) * normal_value; @@ -213,17 +410,20 @@ float cultmath_damp(float start, float end, float lambda_value, float dt) float2 cultmath_damp(float2 start, float2 end, float lambda_value, float dt) { - return cultmath_lerp(start, end, 1.0 - exp(-lambda_value * dt)); + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, float2(amount, amount)); } float3 cultmath_damp(float3 start, float3 end, float lambda_value, float dt) { - return cultmath_lerp(start, end, 1.0 - exp(-lambda_value * dt)); + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, float3(amount, amount, amount)); } float4 cultmath_damp(float4 start, float4 end, float lambda_value, float dt) { - return cultmath_lerp(start, end, 1.0 - exp(-lambda_value * dt)); + float amount = 1.0 - exp(-lambda_value * dt); + return cultmath_lerp(start, end, float4(amount, amount, amount, amount)); } float cultmath_catmullrom(float p0, float p1, float p2, float p3, float t) @@ -286,6 +486,487 @@ float cultmath_hash(float value) { return cultmath_frac(sin(value) * 43758.5453) float cultmath_hash(float2 value) { return cultmath_hash(dot(value, float2(127.1, 311.7))); } float cultmath_hash(float3 value) { return cultmath_hash(dot(value, float3(127.1, 311.7, 74.7))); } +// PCG hashes (Jarzynski and Olano, JCGT 2020), written over scalar uints so CultMath's int3/int4 carry the bits. +uint cultmath_pcg(uint value) +{ + uint state = value * 747796405u + 2891336453u; + uint word = ((state >> (int)((state >> 28) + 4u)) ^ state) * 277803737u; + return (word >> 22) ^ word; +} + +int3 cultmath_pcg3d(int3 value) +{ + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u, z = (uint)value.z * 1664525u + 1013904223u; + x += y * z; y += z * x; z += x * y; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; + x += y * z; y += z * x; z += x * y; + return int3((int)x, (int)y, (int)z); +} + +int3 cultmath_pcg3d(float3 value) { return cultmath_pcg3d(int3((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z))); } +int3 cultmath_pcg3d(float2 value) { return cultmath_pcg3d(float3(value, 0.0)); } + +int4 cultmath_pcg4d(int4 value) +{ + uint x = (uint)value.x * 1664525u + 1013904223u, y = (uint)value.y * 1664525u + 1013904223u; + uint z = (uint)value.z * 1664525u + 1013904223u, w = (uint)value.w * 1664525u + 1013904223u; + x += y * w; y += z * x; z += x * y; w += y * z; + x ^= x >> 16; y ^= y >> 16; z ^= z >> 16; w ^= w >> 16; + x += y * w; y += z * x; z += x * y; w += y * z; + return int4((int)x, (int)y, (int)z, (int)w); +} + +int4 cultmath_pcg4d(float4 value) { return cultmath_pcg4d(int4((int)asuint(value.x), (int)asuint(value.y), (int)asuint(value.z), (int)asuint(value.w))); } + +// Inigo Quilez, "smooth minimum": quadratic-polynomial smin carried to value-and-gradient form. See +// math.smin_grad's comment (math.cs) for why the gradient blend is exact, not an approximation. +float4 cultmath_smin_grad(float4 a, float4 b, float k) +{ + float h = saturate(0.5 + 0.5 * (b.w - a.w) / k); + float value = lerp(b.w, a.w, h) - k * h * (1.0 - h); + float3 gradient = lerp(b.xyz, a.xyz, h); + return float4(gradient, value); +} + +// Invariant 8's one struct return shape (design.md, "HLSL Target: Source Transformations"): +// compared field by field and bit for bit against CultMath.CultCellular, same field order. +struct CultCellular +{ + float4 nearest; + float4 edge; + float id; +}; + +// Worley, "A Cellular Texture Basis Function" (SIGGRAPH 1996). See math.cellular's comment +// (math.cs) for the hashing, gradient, search-radius exactness proof, id source and +// degenerate-point conventions this mirrors exactly, including the 5x5x5 lower-bound prune. +CultCellular cultmath_cellular(float3 p) +{ + float3 cell = floor(p); + float f1 = 1.0e30; + float f2 = 1.0e30; + float3 c1 = float3(0.0, 0.0, 0.0); + float3 c2 = float3(0.0, 0.0, 0.0); + float3 cellId = float3(0.0, 0.0, 0.0); + + for (int dz = -2; dz <= 2; dz++) + { + float lz = max(0.0, abs((float)dz) - 1.0); + for (int dy = -2; dy <= 2; dy++) + { + float ly = max(0.0, abs((float)dy) - 1.0); + for (int dx = -2; dx <= 2; dx++) + { + float lx = max(0.0, abs((float)dx) - 1.0); + float lowerBound = sqrt(lx * lx + ly * ly + lz * lz); + if (lowerBound >= f2) + continue; + + float3 neighbor = cell + float3(dx, dy, dz); + int3 hash = cultmath_pcg3d(int3(neighbor)); + float3 jitter = float3( + (float)((uint)hash.x >> 8) * (1.0 / 16777216.0), + (float)((uint)hash.y >> 8) * (1.0 / 16777216.0), + (float)((uint)hash.z >> 8) * (1.0 / 16777216.0)); + float3 feature = neighbor + jitter; + float d = cultmath_distance(p, feature); + + if (d < f1) + { + f2 = f1; c2 = c1; + f1 = d; c1 = feature; cellId = neighbor; + } + else if (d < f2) + { + f2 = d; c2 = feature; + } + } + } + } + + // F1 = 0 and F2 = 0 share the same degenerate-gradient guard; see math.cellular's comment + // (math.cs) for why F2 = 0 is reachable past roughly |p| = 2^23. + float3 grad1 = f1 > 0.0 ? (p - c1) / f1 : float3(0.0, 0.0, 0.0); + float3 grad2 = f2 > 0.0 ? (p - c2) / f2 : float3(0.0, 0.0, 0.0); + + // id comes from pcg4d over the winning cell's integer coordinate alone (same int-hashing rule + // as the jitter above), never from the pcg3d hash that produced its jitter (F4). + int4 idHash = cultmath_pcg4d(int4(int3(cellId), 0)); + + CultCellular result; + result.nearest = float4(grad1, f1); + result.edge = float4(grad2 - grad1, f2 - f1); + result.id = (float)((uint)idHash.w >> 8) * (1.0 / 16777216.0); + return result; +} + +// Sites: a site is float4(position.xyz, weight). A shader function cannot take a span (design.md, "Sites"), so a span is a +// fixed-capacity array and a count (cultmath_power_border, below), or a loop over a per-site step: +// CultSiteCells cells = cultmath_site_cells_empty(); +// for (int i = 0; i < count; i++) +// cells = cultmath_site_cells_insert(cells, cultmath_power_score(p, sites[i]), i); +// The exact power cell border is cultmath_power_border, the second loop over the sites that skips the owner cells.nearestSite. +// The step trusts the owner: a p outside the owner's cell reports distance 0 with that plane's normal, not an error. +// Statement for statement with math.Sites.cs (power_score, multiplicative_score, site_cells_*, gabriel_margin). +struct CultSiteCells +{ + float4 nearest; + float4 second; + float nearestSite; + float secondSite; +}; + +float4 cultmath_power_score(float3 p, float4 site) +{ + float3 offset = p - site.xyz; + return float4(offset * 2.0, dot(offset, offset) - site.w * site.w); +} + +float4 cultmath_multiplicative_score(float3 p, float4 site) +{ + float3 offset = p - site.xyz; + float r = length(offset); + float3 gradient = r > 0.0 ? offset / (r * site.w) : float3(0.0, 0.0, 0.0); + return float4(gradient, r / site.w); +} + +CultSiteCells cultmath_site_cells_empty() +{ + CultSiteCells result; + result.nearest = float4(0.0, 0.0, 0.0, 1.0e30); + result.second = float4(0.0, 0.0, 0.0, 1.0e30); + result.nearestSite = -1.0; + result.secondSite = -1.0; + return result; +} + +CultSiteCells cultmath_site_cells_insert(CultSiteCells cells, float4 score, int index) +{ + CultSiteCells result = cells; + if (score.w < cells.nearest.w) + { + result.second = cells.nearest; + result.secondSite = cells.nearestSite; + result.nearest = score; + result.nearestSite = (float)index; + } + else if (score.w < cells.second.w) + { + result.second = score; + result.secondSite = (float)index; + } + + return result; +} + +float4 cultmath_site_cells_border(CultSiteCells cells) +{ + float3 n = cells.second.xyz - cells.nearest.xyz; + float len = length(n); + if (cells.secondSite < 0.0 || len <= 0.0) + return float4(0.0, 0.0, 0.0, 1.0e30); + return float4(n / len, (cells.second.w - cells.nearest.w) / len); +} + +float4 cultmath_power_border_step(float3 p, float4 owner, float4 other, float4 border) +{ + float3 d = other.xyz - owner.xyz; + float len = length(d); + if (len <= 0.0) + return border; + float plane = max((dot(owner.xyz - p, d) + 0.5 * (dot(d, d) + (owner.w - other.w) * (owner.w + other.w))) / len, 0.0); + return plane < border.w ? float4(-d / len, plane) : border; +} + +float cultmath_gabriel_margin(float3 a, float3 b, float3 other) +{ + float r = cultmath_distance(a, b) * 0.5; + if (r <= 0.0) + return -1.0; + return (cultmath_distance(other, (a + b) * 0.5) - r) / r; +} + +// Weighted lattice cells: the four per-cell steps of math.Lattice.cs, statement for statement; cultmath_weighted_lattice_cells, +// after them, is the whole function. +float3 cultmath_lattice_site(float2 cell, float time, float drift) +{ + int3 h = cultmath_pcg3d(int3((int)cell.x, (int)cell.y, 0)); + float2 phase = float2((float)((uint)h.x >> 8) * (1.0 / 16777216.0), (float)((uint)h.y >> 8) * (1.0 / 16777216.0)); + float2 site = cell + 0.5 + 0.5 * float2(sin(drift * time + CULTMATH_TAU * phase.x), sin(drift * time + CULTMATH_TAU * phase.y)); + return float3(site, 0.5 + 0.5 * ((float)((uint)h.z >> 8) * (1.0 / 16777216.0))); +} + +float cultmath_lattice_weight(float base_weight, float border, float boost, float falloff) +{ + float t = border / falloff; + return base_weight * (1.0 + boost * exp(-(t * t))); +} + +float cultmath_lattice_distance(float2 q, float2 site, float weight, float2 normal, float stretch) +{ + float2 v = site - q; + float a = dot(v, normal); + float c = v.x * normal.y - v.y * normal.x; + return weight * length(float2(stretch * a, c)); +} + +float cultmath_lattice_smooth_step(float m, float d, float f1, float smoothing) +{ + if (d >= f1 + 2.0 * smoothing) + return m; + float h = cultmath_smoothstep(0.0, 1.0, 0.5 + 0.5 * (m - d) / smoothing); + float next = m + (d - m) * h - h * (1.0 - h) * smoothing / (1.0 + 3.0 * smoothing); + return min(next, f1 + smoothing); +} + +// Sites by value: a shader function cannot take a span, so these take float4 sites[CULTMATH_MAX_SITES] and the count in use, with +// count in [0, CULTMATH_MAX_SITES]. A consumer defines CULTMATH_MAX_SITES before including this file to change the capacity; loops +// run to count, so the capacity costs uniform space, not iterations. A caller whose sites live in a buffer copies them into a local array first. +// The preconditions the C# functions throw for are the caller's in a shader: finite arguments, cellSize > 0, boost in [0, 4], +// falloff > 0, smoothing in (0, 1], stretch in [1, 2], p within 2^23 cells. A zero stretchNormal means (1, 0) and needs stretch == 1. +// cultmath_weighted_lattice_cells is math.weighted_lattice_cells: the ring pass is bounded by k <= 37 and exits as C# does, and the +// box pass recomputes each distance instead of caching it (a 75 x 75 private array is not a shader option), with the same values. +#ifndef CULTMATH_MAX_SITES +#define CULTMATH_MAX_SITES 128 +#endif + +float4 cultmath_power_border(float3 p, float4 sites[CULTMATH_MAX_SITES], int count) +{ + CultSiteCells cells = cultmath_site_cells_empty(); + for (int i = 0; i < count; i++) + cells = cultmath_site_cells_insert(cells, cultmath_power_score(p, sites[i]), i); + float4 border = float4(0.0, 0.0, 0.0, 1.0e30); + int owner = (int)cells.nearestSite; + if (owner < 0) + return border; + for (int k = 0; k < count; k++) + if (k != owner) + border = cultmath_power_border_step(p, sites[owner], sites[k], border); + return border; +} + +float cultmath_lattice_cell_distance(float2 q, float2 cell, float time, float drift, float4 bodies[CULTMATH_MAX_SITES], int count, + float cellSize, float boost, float falloff, float2 normal, float stretch) +{ + float3 site = cultmath_lattice_site(cell, time, drift); + float border = cultmath_power_border(float3((cell + 0.5) * cellSize, 0.0), bodies, count).w; + return cultmath_lattice_distance(q, site.xy, cultmath_lattice_weight(site.z, border, boost, falloff), normal, stretch); +} + +float4 cultmath_weighted_lattice_cells(float2 p, float time, float4 bodies[CULTMATH_MAX_SITES], int count, float cellSize, float drift, + float boost, float falloff, float smoothing, float2 stretchNormal, float stretch) +{ + float scale = max(abs(stretchNormal.x), abs(stretchNormal.y)); + float2 normal = float2(1.0, 0.0); + if (scale > 0.0) + { + normal = stretchNormal / scale; + normal = normal / length(normal); + } + float2 q = p / cellSize; + float2 origin = floor(q); + int cx0 = (int)origin.x; + int cz0 = (int)origin.y; + float f1 = 1.0e30; + float f2 = 1.0e30; + int reach = 0; + for (int k = 0; k <= 37; k++) + { + if (k > 1 && 0.5 * (float)(k - 1) >= max(f2, f1 + 2.0 * smoothing)) + break; + for (int dz = -k; dz <= k; dz++) + { + int step = dz == -k || dz == k || k == 0 ? 1 : 2 * k; + for (int dx = -k; dx <= k; dx += step) + { + float d = cultmath_lattice_cell_distance(q, float2(cx0 + dx, cz0 + dz), time, drift, bodies, count, cellSize, boost, falloff, normal, stretch); + if (d < f1) { f2 = f1; f1 = d; } + else if (d < f2) f2 = d; + } + } + reach = k; + } + float m = f1 + smoothing; + float best = 1.0e30; + float second = 1.0e30; + int winDx = 0; + int winDz = 0; + for (int dz = -reach; dz <= reach; dz++) + for (int dx = -reach; dx <= reach; dx++) + { + float d = cultmath_lattice_cell_distance(q, float2(cx0 + dx, cz0 + dz), time, drift, bodies, count, cellSize, boost, falloff, normal, stretch); + if (d < best) { second = best; best = d; winDx = dx; winDz = dz; } + else if (d < second) second = d; + m = cultmath_lattice_smooth_step(m, d, f1, smoothing); + } + int4 id = cultmath_pcg4d(int4(cx0 + winDx, cz0 + winDz, 0, 0)); + return float4(best, second, m, (float)((uint)id.w >> 8) * (1.0 / 16777216.0)); +} + +float2 cultmath_segment_closest(float2 point_value, float2 start, float2 end) +{ + float2 segment = end - start; + float segmentLengthSq = cultmath_lengthsq(segment); + if (segmentLengthSq <= 0.0) + return start; + + float t = cultmath_saturate(dot(point_value - start, segment) / segmentLengthSq); + return start + segment * t; +} + +float3 cultmath_segment_closest(float3 point_value, float3 start, float3 end) +{ + float3 segment = end - start; + float segmentLengthSq = cultmath_lengthsq(segment); + if (segmentLengthSq <= 0.0) + return start; + + float t = cultmath_saturate(dot(point_value - start, segment) / segmentLengthSq); + return start + segment * t; +} + +float cultmath_distance_to_segment(float2 point_value, float2 start, float2 end) +{ + return cultmath_distance(point_value, cultmath_segment_closest(point_value, start, end)); +} + +float cultmath_distance_to_segment(float3 point_value, float3 start, float3 end) +{ + return cultmath_distance(point_value, cultmath_segment_closest(point_value, start, end)); +} + +#include "CultMath.Phacelle.hlsl" +#include "CultMath.Interval.hlsl" +#include "CultMath.Cycles.hlsl" +#include "CultMath.Affine.hlsl" + +// Span stages (invariant 8): the SpanPath, SpanStage and SpanNoise of math.Span.cs, field for field in +// C#'s order, and cultmath_span_stage, its octave stage, statement for statement so the text is a bit-for-bit +// mirror. They follow the includes because the bounds read CULTMATH_SNOISE_LIPSCHITZ, _HESSIAN and _THIRD. +// A shader caller builds a SpanStage itself (SpanStage(1.0, 1.0, vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)) +// is the identity of math.SpanStage.Identity, which has no shader form); see math.span_stage's comments for +// the span, the transform, the bounds and the allowances. cultmath_span_rounding and cultmath_span_slack +// are math.span_rounding and math.span_slack, the owners of S_o and of the three allowances. +struct SpanPath +{ + float3 midpoint; + float3 velocity; + float speed; + float acceleration; + float halfLength; +}; + +struct SpanStage +{ + float frequency; + float stretch; + float3 axis; + float3 shift; + float3 offset; + float3 octaveStep; +}; + +struct SpanNoise +{ + float4 field; + float curvature; + float fold; +}; + +float cultmath_span_rounding(float scale, float3 mq, SpanStage stage, float3 octaveShift, float nu, float halfLength) +{ + return 9.5367431640625e-7 * (abs(scale) * (cultmath_csum(abs(mq)) + cultmath_csum(abs(stage.shift))) + cultmath_csum(abs(stage.offset)) + cultmath_csum(abs(octaveShift)) + 1.7320508 * nu * halfLength); +} + +float3 cultmath_span_slack(float rounding) +{ + return float3(CULTMATH_SNOISE_READ_VALUE + CULTMATH_SNOISE_LIPSCHITZ * rounding, + CULTMATH_SNOISE_READ_GRADIENT + CULTMATH_SNOISE_HESSIAN * rounding, + 9.765625e-4 + CULTMATH_SNOISE_THIRD * rounding); +} + +// The octave stage behind cultmath_span_fbm and cultmath_span_ridged, as math.span_stage is behind span_fbm +// and span_ridged. The Frobenius norm of the Hessian is written out in C#'s order (GLSL has no _mRC member +// access); the C# local named step is octaveShift here (it would shadow GLSL's step()). +SpanNoise cultmath_span_stage(bool ridged, SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + float3 q = path.midpoint; + float halfLength = path.halfLength; + octaves = clamp(octaves, 0, 16); + bool stretched = dot(stage.axis, stage.axis) > 0.0 && stage.stretch != 1.0; + float3 direction = stretched ? normalize(stage.axis) : float3(0.0, 0.0, 0.0); + float squeeze = stretched ? 1.0 / stage.stretch - 1.0 : 0.0; + float norm = abs(stage.frequency) * (stretched ? max(1.0, 1.0 / stage.stretch) : 1.0); + float3 mq = stretched ? stage.frequency * (q + squeeze * dot(direction, q) * direction) : stage.frequency * q; + float3 mv = stretched ? stage.frequency * (path.velocity + squeeze * dot(direction, path.velocity) * direction) : stage.frequency * path.velocity; + float amplitude = 1.0; + float scale = 1.0; + float value = 0.0; + float3 gradient = float3(0.0, 0.0, 0.0); + float curvature = 0.0; + float fold = 0.0; + for (int i = 0; i < octaves; i++) + { + float3 octaveShift = (float)i * stage.octaveStep; + float3 x = scale * (mq + stage.shift) + (stage.offset + octaveShift); + float4 n = cultmath_snoise_grad(x); + float3 g = float3(n.x, n.y, n.z); + float3 mg = stretched ? stage.frequency * (g + squeeze * dot(direction, g) * direction) : stage.frequency * g; + if (ridged) + { + float s = sign(n.w); + value += amplitude * (1.0 - abs(n.w)); + gradient += -amplitude * scale * s * mg; + } + else + { + value += amplitude * n.w; + gradient += amplitude * scale * mg; + } + + float weight = abs(amplitude); + float factor = abs(scale) * norm; + float nu = factor * path.speed; + float rounding = cultmath_span_rounding(scale, mq, stage, octaveShift, nu, halfLength); + float3 slack = cultmath_span_slack(rounding); + float valueSlack = slack.x; + float gradientSlack = slack.y; + float hessianSlack = slack.z; + float3x3 hm = cultmath_snoise_hessian(x); + float frobenius = sqrt(hm[0][0] * hm[0][0] + hm[0][1] * hm[0][1] + hm[0][2] * hm[0][2] + hm[1][0] * hm[1][0] + hm[1][1] * hm[1][1] + hm[1][2] * hm[1][2] + + hm[2][0] * hm[2][0] + hm[2][1] * hm[2][1] + hm[2][2] * hm[2][2]); + float hessianBound = min(CULTMATH_SNOISE_HESSIAN, frobenius + hessianSlack + CULTMATH_SNOISE_THIRD * nu * halfLength); + curvature += weight * factor * factor * hessianBound; + if (ridged) + { + float3 w = scale * mv; + float reach = hessianBound * nu * halfLength; + float gl = min(CULTMATH_SNOISE_LIPSCHITZ, length(g) + gradientSlack + reach); + float travel = (abs(dot(g, w)) + gradientSlack * length(w)) * halfLength + (hessianBound * nu * length(w) + gl * factor * path.acceleration) * (0.5 * halfLength * halfLength) + 2.0 * valueSlack; + fold += 2.0 * weight * max(travel - abs(n.w), 0.0); + } + + scale *= lacunarity; + amplitude *= gain; + } + + SpanNoise result; + result.field = float4(gradient, value); + result.curvature = curvature; + result.fold = fold; + return result; +} + +SpanNoise cultmath_span_fbm(SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + return cultmath_span_stage(false, path, stage, octaves, lacunarity, gain); +} + +SpanNoise cultmath_span_ridged(SpanPath path, SpanStage stage, int octaves, float lacunarity, float gain) +{ + return cultmath_span_stage(true, path, stage, octaves, lacunarity, gain); +} + float cultmath_value_noise(float2 position) { float2 cell = floor(position); diff --git a/packages/cultmath/unity/org.gamecult.cultmath/THIRD-PARTY-NOTICES.md b/packages/cultmath/unity/org.gamecult.cultmath/THIRD-PARTY-NOTICES.md index 06ebb6c3..8361acfc 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/THIRD-PARTY-NOTICES.md +++ b/packages/cultmath/unity/org.gamecult.cultmath/THIRD-PARTY-NOTICES.md @@ -6,6 +6,67 @@ simplex-noise functions by Ian McEwan and Ashima Arts, as distributed by Stefan Gustavson's `webgl-noise` project and Unity Mathematics. +`math.snoise(float3)` and `cultmath_snoise(float3)` follow `src/noise3D.glsl` and +`math.snoise(float2)` follows `src/noise2D.glsl` of stegu/webgl-noise at commit +`22434e04d7753f7e949e8d724ab3da2864c17a0f` (the simplex-boundary fix is +`21d9fe23d7`, scale `ff3b5d34ea`, permutation `a3e6d57095`). Modified from upstream: +the 3D corner tie order follows Gustavson's `simplexnoise1234`, because the +upstream `step` compares are cyclic where the offset's components are equal. + +`math.snoise_grad`/`cultmath_snoise_grad` (and the `fbm_grad`/`ridged_grad` +octave sums built on them) follow the analytic-gradient differentiation from +the same project's `src/noise3Dgrad.glsl`, with the same kernel radius, +permutation and scale as `snoise(float3)`. + - Copyright 2011 Ashima Arts. - Upstream: - License: MIT. + +## Cycles node semantics + +`math.cycles_*` and `cultmath_cycles_*` port what Blender's Cycles renderer +computes for the Math, Map Range, Clamp, Mix and RGB to BW nodes and for a Color +Ramp lookup. Each function's comment names the Cycles file it follows, all from +`intern/cycles` at the Blender `v5.2.2` tag: `kernel/svm/math_util.h`, +`kernel/svm/map_range.h`, `kernel/svm/clamp.h`, `kernel/svm/mix.h`, +`kernel/svm/color_util.h`, `kernel/svm/ramp.h`, `kernel/svm/convert.h`, +`util/math_base.h`, `util/math_float3.h` and `util/color.h`. The code was +changed: Cycles C++ became C# and HLSL, one function per node operation, with +the nodes' socket defaults and clamp options left to the caller, and the modulo +is the quotient form every CultMath target shares rather than `fmodf`. Nothing +was read from Blender's GPL sources (`source/blender/gpu`, `source/blender/blenlib`). + +- Copyright 2011-2022 Blender Foundation. +- Upstream: (`intern/cycles`). +- License: Apache-2.0 (), which is + per-file here: it covers `src/CultMath/math.Cycles.cs`, + `shaders/CultMath.Cycles.hlsl` and the Unity copy of that include, and + `shaders/CultMath.Cycles.glsl`, which is generated from that include. Each + carries the Apache-2.0 header and this attribution. The rest of CultMath, the + generated GLSL library included, is MIT or MPL-2.0 as above, so the + `GameCult.Math` NuGet package and the `org.gamecult.cultmath` Unity package + both declare `MIT AND MPL-2.0 AND Apache-2.0` and ship this file. +- The test fixtures under `tests/CultMath.Tests/fixtures/cycles-oracle` are + results of running Blender 5.2.2 through `tools/cycles-oracle/oracle.py` + (GPL-3.0-or-later, a Blender Python script, shipped neither in the NuGet + package nor in the Unity package). + +## Phacelle Noise + +`math.phacelle` and `cultmath_phacelle` follow Rune Skovbo Johansen's Phacelle +noise (Shadertoy `t3dyWl`; erosion filter `wXcfWn`; blog, March 2026), read +from the C# port `PhacelleNoise` in `lpmitchell/AdvancedTerrainErosion` +(`AdvancedTerrainErosion.cs`, converted to burstable C# by Luke Mitchell, +2026). The cell weight, the phase blend and the normalization follow it. The +3D-cell generalisation, the caller-supplied stripe wave vector, the exact +gradient and the exact pruning are new here. + +- Copyright (c) 2025 Rune Skovbo Johansen. +- Upstream: +- License: MPL-2.0 (). MPL-2.0 is file-level, so it + covers exactly the files that carry the port and nothing else: + `src/CultMath/math.Phacelle.cs`, `src/CultMath/CultPhasor.cs`, + `shaders/CultMath.Phacelle.hlsl` and the Unity copy of that include. Each + carries the MPL-2.0 header and this attribution. The rest of CultMath is MIT, + so the `GameCult.Math` NuGet package and the `org.gamecult.cultmath` Unity + package both declare `MIT AND MPL-2.0` and ship this file. diff --git a/packages/cultmath/unity/org.gamecult.cultmath/package.json b/packages/cultmath/unity/org.gamecult.cultmath/package.json index c09bf6bb..04f90e59 100644 --- a/packages/cultmath/unity/org.gamecult.cultmath/package.json +++ b/packages/cultmath/unity/org.gamecult.cultmath/package.json @@ -1,10 +1,10 @@ { "name": "org.gamecult.cultmath", "displayName": "CultMath", - "version": "0.2.0", + "version": "0.4.1", "unity": "2021.3", "description": "Precompiled CultMath numeric primitives and matching HLSL semantics for GameCult Unity runtimes.", - "license": "MPL-2.0", + "license": "MIT AND MPL-2.0 AND Apache-2.0", "author": { "name": "GameCult" }, diff --git a/packages/cultmesh-browser/README.md b/packages/cultmesh-browser/README.md index 59a44016..e130171c 100644 --- a/packages/cultmesh-browser/README.md +++ b/packages/cultmesh-browser/README.md @@ -27,9 +27,19 @@ const counter = await mesh.leaseRawDocument({ recordKey: "counter:main", }); -counter.watch(record => renderCounter(decodeCultNetPayload(record))); +counter.watch(record => renderCounter(decodeCultNetPayload(record, counterDocument))); ``` +A record's `payload` is a `DocumentPayload`, an opaque type over the same bytes, and +`decodeCultNetPayload(record, definition)` is how it is read: through the CultCache document +definition that says whether the bytes are a plain map, a codec's slot record or a +formatter's, then through the definition's schema. A plain MessagePack decode of a payload +does not compile, and `decodeCultNetPayload` takes no definition-less form. The type stops direct reads +and assignment; it does not stop runtime narrowing (`payload instanceof Uint8Array`) or a cast, which +would read the raw bytes. For the bytes themselves use `documentPayloadBytes`. The definition +comes from `@gamecult/cultcache-ts` (this package imports only its `./document` entry, which +holds no Node built-ins). + `invoke(...)` returns the correlated provider response. Routing, schema, and envelope failures reject immediately with `CultMeshBrowserOperationError`; callers can branch on its stable `status` and `code` without parsing prose or diff --git a/packages/cultmesh-browser/package.json b/packages/cultmesh-browser/package.json index c49062b0..cd381854 100644 --- a/packages/cultmesh-browser/package.json +++ b/packages/cultmesh-browser/package.json @@ -37,10 +37,10 @@ "directory": "packages/cultmesh-browser" }, "engines": { - "node": ">=18" + "node": ">=20" }, "dependencies": { - "@msgpack/msgpack": "^3.1.3", + "@gamecult/cultcache-ts": "^0.14.0", "cultnet-ts": "^0.2.0" }, "devDependencies": { diff --git a/packages/cultmesh-browser/src/index.ts b/packages/cultmesh-browser/src/index.ts index 4dddfa7d..5c20806c 100644 --- a/packages/cultmesh-browser/src/index.ts +++ b/packages/cultmesh-browser/src/index.ts @@ -1,4 +1,6 @@ -import { decode, encode } from "@msgpack/msgpack"; +import { decodeDocumentPayload } from "@gamecult/cultcache-ts/document"; +import type { AnyCultCacheDocumentDefinition, CultCacheDocumentValue } from "@gamecult/cultcache-ts"; +import { decodeWireValue, encodeWireValue } from "cultnet-ts/wire"; import { encodeCultNetMessageForWire, parseCultNetMessage, @@ -15,42 +17,28 @@ import { type CultMeshSessionAcceptedMessage, type CultMeshSessionOpenMessage, } from "cultnet-ts/contracts"; +import { + base64ToBytes, + bytesToBase64, + isLoopbackEndpoint, + isUnsignedCertificate, + routeCertificateView, + verifyAuthorityRoute, + verifyProviderSessionProof, + type CultMeshAuthorityIdentity, + type CultMeshAuthorityRouteCertificate, + type CultMeshAuthorityRouteView, + type CultMeshAuthorityTrustMode, + type CultMeshAuthorityTrustPolicy, + type CultMeshP256PublicKey, +} from "cultnet-ts/authority"; -export interface CultMeshBrowserIdentity { - verseId: string; - authorityRuntimeId: string; -} - -export interface CultMeshBrowserRoute extends CultMeshBrowserIdentity { - endpoint: string; - protocolId?: string; - protocolIds?: readonly string[]; - priority?: number; - generation: string; - certificate?: CultMeshBrowserRouteCertificate; -} - -export interface CultMeshBrowserP256PublicKey { - keyId: string; - x: string; - y: string; -} - -export interface CultMeshBrowserRouteCertificate { - providerKey: CultMeshBrowserP256PublicKey; - odinKeyId: string; - issuedAtUnixMilliseconds: number; - expiresAtUnixMilliseconds: number; - signature: string; -} - -export type CultMeshBrowserAuthorityTrustMode = "authenticated-remote" | "local-development"; - -export interface CultMeshBrowserAuthorityTrustPolicy { - mode: CultMeshBrowserAuthorityTrustMode; - odinRoots?: readonly CultMeshBrowserP256PublicKey[]; - now?: () => number; -} +export type CultMeshBrowserIdentity = CultMeshAuthorityIdentity; +export type CultMeshBrowserRoute = CultMeshAuthorityRouteView; +export type CultMeshBrowserP256PublicKey = CultMeshP256PublicKey; +export type CultMeshBrowserRouteCertificate = CultMeshAuthorityRouteCertificate; +export type CultMeshBrowserAuthorityTrustMode = CultMeshAuthorityTrustMode; +export type CultMeshBrowserAuthorityTrustPolicy = CultMeshAuthorityTrustPolicy; export interface CultMeshBrowserRendezvous { resolve( @@ -401,7 +389,7 @@ export class CultMeshBrowserClient implements AsyncDisposable { operation: options.operation, payloadSchema: options.payloadSchema, payloadEncoding: "messagepack-base64", - payload: bytesToBase64(encode(options.payload)), + payload: bytesToBase64(encodeWireValue(options.payload)), sourceRuntimeId: this.runtimeId, targetRuntimeId: this.identity.authorityRuntimeId, }; @@ -747,7 +735,7 @@ export class CultMeshBrowserClient implements AsyncDisposable { private send(message: CultNetMessage): void { const socket = this.#socket; if (!socket || socket.readyState !== 1) throw new Error("CultMesh browser route is not connected."); - const payload = encode(encodeCultNetMessageForWire(message)); + const payload = encodeWireValue(encodeCultNetMessageForWire(message)); if (payload.byteLength > this.#options.maxFrameBytes) { throw new Error(`CultMesh message exceeds the ${this.#options.maxFrameBytes}-byte limit.`); } @@ -774,11 +762,19 @@ export class CultMeshBrowserClient implements AsyncDisposable { } } -export function decodeCultNetPayload(record: CultNetRawDocumentRecord): T { +/** + * Reads a document record's payload through the definition that says how its bytes are laid out: a codec, a formatter or + * a plain map, then the definition's schema. The payload is opaque (`DocumentPayload`), so a plain msgpack decode of it + * does not compile; the definition is required. + */ +export function decodeCultNetPayload( + record: CultNetRawDocumentRecord, + definition: TDefinition, +): CultCacheDocumentValue { if (record.payloadEncoding !== "messagepack") { throw new Error(`Unsupported CultNet document payload '${record.payloadEncoding}'.`); } - return decode(record.payload) as T; + return decodeDocumentPayload(definition, record.payload); } function recordMatchesSchema(record: CultNetRawDocumentRecord, requestedSchema: string): boolean { @@ -791,20 +787,7 @@ export function decodeCultNetOperationPayload(response: CultNetOperationRespo if (response.payloadEncoding !== "messagepack-base64") { throw new Error(`Unsupported CultNet operation payload '${response.payloadEncoding ?? "unspecified"}'.`); } - return decode(base64ToBytes(response.payload)) as T; -} - -function bytesToBase64(bytes: Uint8Array): string { - let binary = ""; - for (let offset = 0; offset < bytes.length; offset += 0x8000) { - binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000)); - } - return btoa(binary); -} - -function base64ToBytes(value: string): Uint8Array { - const binary = atob(value); - return Uint8Array.from(binary, character => character.charCodeAt(0)); + return decodeWireValue(base64ToBytes(response.payload)) as T; } function requireWebSocketEndpoint(value: string, field: string): URL { @@ -821,7 +804,7 @@ function requireWebSocketEndpoint(value: string, field: string): URL { } function sendSocketMessage(socket: CultMeshBrowserSocket, message: CultNetMessage, maxFrameBytes: number): void { - const payload = encode(encodeCultNetMessageForWire(message)); + const payload = encodeWireValue(encodeCultNetMessageForWire(message)); if (payload.byteLength > maxFrameBytes) { throw new Error(`CultNet message exceeds the ${maxFrameBytes}-byte limit.`); } @@ -842,7 +825,7 @@ async function decodeSocketMessage(event: MessageEvent, maxFrameBytes: number): if (payload.byteLength > maxFrameBytes) { throw new Error(`CultNet frame exceeds the ${maxFrameBytes}-byte limit.`); } - return parseCultNetMessage(decode(payload)); + return parseCultNetMessage(decodeWireValue(payload)); } async function selectOdinRoute( @@ -898,17 +881,7 @@ async function selectOdinRoute( protocolIds: route.protocolIds, priority: route.priority, generation: route.generation, - ...(route.certificate ? { certificate: { - providerKey: { - keyId: route.certificate.providerKeyId, - x: route.certificate.providerPublicKeyX, - y: route.certificate.providerPublicKeyY, - }, - odinKeyId: route.certificate.odinKeyId, - issuedAtUnixMilliseconds: route.certificate.issuedAtUnixMilliseconds, - expiresAtUnixMilliseconds: route.certificate.expiresAtUnixMilliseconds, - signature: route.certificate.signature, - } } : {}), + ...(route.certificate ? { certificate: routeCertificateView(route.certificate) } : {}), }; try { await verifyAuthorityRoute(candidate, trust); @@ -941,136 +914,26 @@ async function validateSessionAcceptance( `expected '${request.verseId}/${request.authorityRuntimeId}/${protocolId}/${route.generation}'.`, ); } - if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint) && !route.certificate) return undefined; + // `CultMeshVerifiedAuthorityRoute.IsLocalDevelopment` in C#: an unsigned + // loopback route under local-development needs no provider session proof. + if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint) && isUnsignedCertificate(route.certificate)) { + return undefined; + } const providerKey = route.certificate?.providerKey; if (!providerKey || message.providerKeyId !== providerKey.keyId || !message.providerSignature) { return new Error("CultMesh authority did not prove possession of the Odin-certified provider key."); } - if (!await verifyP256(providerKey, canonicalSession(request, route.endpoint), message.providerSignature)) { + if (!await verifyProviderSessionProof(request, route.endpoint, providerKey, message.providerSignature)) { return new Error("CultMesh provider session proof is invalid."); } return undefined; } -async function verifyAuthorityRoute( - route: CultMeshBrowserRoute, - trust: CultMeshBrowserAuthorityTrustPolicy, -): Promise { - const certificate = route.certificate; - if (!certificate) { - if (trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint)) return; - throw new Error("Remote CultMesh routes require an Odin-signed authority certificate."); - } - const endpoint = new URL(route.endpoint); - if (endpoint.protocol !== "wss:" && !(trust.mode === "local-development" && isLoopbackEndpoint(route.endpoint))) { - throw new Error("Authenticated remote CultMesh browser routes require wss:// channel protection."); - } - const now = trust.now?.() ?? Date.now(); - if (now < certificate.issuedAtUnixMilliseconds || now >= certificate.expiresAtUnixMilliseconds) { - throw new Error("The Odin route certificate is not currently valid."); - } - const root = trust.odinRoots?.find(candidate => candidate.keyId === certificate.odinKeyId); - if (!root) throw new Error(`Odin key '${certificate.odinKeyId}' is not trusted by this consumer.`); - if (!await verifyP256(root, canonicalRoute(route), certificate.signature)) { - throw new Error("The Odin route certificate signature is invalid."); - } -} - -function canonicalRoute(route: CultMeshBrowserRoute): Uint8Array { - const certificate = route.certificate!; - return canonicalFields( - "gamecult.cultmesh.route-certificate.v1", - route.verseId, - route.authorityRuntimeId, - route.endpoint, - [...(route.protocolIds ?? [route.protocolId ?? "cultmesh.documents.v1"])].sort().join("\u001f"), - String(route.priority ?? 0), - route.generation, - certificate.providerKey.keyId, - certificate.providerKey.x, - certificate.providerKey.y, - certificate.odinKeyId, - String(certificate.issuedAtUnixMilliseconds), - String(certificate.expiresAtUnixMilliseconds), - ); -} - -function canonicalSession(request: CultMeshSessionOpenMessage, endpoint: string): Uint8Array { - return canonicalFields( - "gamecult.cultmesh.session-proof.v1", - request.clientNonce, - request.messageId, - request.sourceRuntimeId, - request.verseId, - request.authorityRuntimeId, - request.protocolId, - endpoint, - request.routeGeneration, - ); -} - -function canonicalFields(...values: string[]): Uint8Array { - const encoder = new TextEncoder(); - const encoded = values.map(value => encoder.encode(value)); - const total = encoded.reduce((sum, value) => sum + 4 + value.byteLength, 0); - const result = new Uint8Array(total); - const view = new DataView(result.buffer); - let offset = 0; - for (const value of encoded) { - view.setUint32(offset, value.byteLength, false); - offset += 4; - result.set(value, offset); - offset += value.byteLength; - } - return result; -} - -async function verifyP256( - key: CultMeshBrowserP256PublicKey, - payload: Uint8Array, - signatureBase64: string, -): Promise { - try { - const x = base64ToBytes(key.x); - const y = base64ToBytes(key.y); - const signature = base64ToBytes(signatureBase64); - if (x.byteLength !== 32 || y.byteLength !== 32 || signature.byteLength !== 64) return false; - const raw = new Uint8Array(65); - raw[0] = 4; - raw.set(x, 1); - raw.set(y, 33); - const publicKey = await crypto.subtle.importKey( - "raw", - raw.slice().buffer as ArrayBuffer, - { name: "ECDSA", namedCurve: "P-256" }, - false, - ["verify"], - ); - return await crypto.subtle.verify( - { name: "ECDSA", hash: "SHA-256" }, - publicKey, - signature.slice().buffer as ArrayBuffer, - payload.slice().buffer as ArrayBuffer, - ); - } catch { - return false; - } -} - function randomNonce(): string { const bytes = crypto.getRandomValues(new Uint8Array(32)); return bytesToBase64(bytes); } -function isLoopbackEndpoint(value: string): boolean { - try { - const host = new URL(value).hostname.replace(/^\[|\]$/g, "").toLowerCase(); - return host === "localhost" || host === "127.0.0.1" || host === "::1"; - } catch { - return false; - } -} - function requireText(value: string, field: string): void { if (!value || value.trim().length === 0) throw new Error(`CultMesh browser ${field} is required.`); } diff --git a/packages/cultmesh-browser/test/cultmesh-browser.test.ts b/packages/cultmesh-browser/test/cultmesh-browser.test.ts index 6c169d93..1206b32d 100644 --- a/packages/cultmesh-browser/test/cultmesh-browser.test.ts +++ b/packages/cultmesh-browser/test/cultmesh-browser.test.ts @@ -1,7 +1,8 @@ import assert from "node:assert/strict"; import test from "node:test"; -import { decode, encode } from "@msgpack/msgpack"; +import { codecs, defineDocumentType, documentPayloadFromBytes } from "@gamecult/cultcache-ts"; +import { decodeWireValue, encodeWireValue } from "cultnet-ts/wire"; import { encodeCultNetMessageForWire, parseCultNetMessage, @@ -120,6 +121,13 @@ test("Odin rendezvous rejects a poisoned route without vetoing a certified fallb assert.equal(selected.endpoint, signed.route.endpoint); }); +// The counter document the fake provider serves: a plain map. +const counterDocument = defineDocumentType({ + type: "sample.counter_state", + schemaId: "sample.counter_state.v1", + schema: { parse: (value: unknown) => value as { count: number } }, +}); + test("browser client leases provider state, invokes an operation, and follows route replacement", async () => { const first = new FakeProvider("ws://127.0.0.1:4101/mesh", 4); const second = new FakeProvider("ws://127.0.0.1:4102/mesh", 9); @@ -139,11 +147,11 @@ test("browser client leases provider state, invokes an operation, and follows ro schemaId: "sample.counter_state.v1", recordKey: "counter:main", }); - assert.deepEqual(decodeCultNetPayload<{ count: number }>(lease.current!).count, 4); + assert.deepEqual(decodeCultNetPayload(lease.current!, counterDocument).count, 4); const observed: number[] = []; const unwatch = lease.watch(record => { - if (record) observed.push(decodeCultNetPayload<{ count: number }>(record).count); + if (record) observed.push(decodeCultNetPayload(record, counterDocument).count); }); const response = await client.invoke({ serviceId: "sample.counter", @@ -158,7 +166,7 @@ test("browser client leases provider state, invokes an operation, and follows ro route = second.route; await client.refreshRoute(); assert.equal(client.state, "connected"); - assert.deepEqual(decodeCultNetPayload<{ count: number }>(lease.current!).count, 9); + assert.deepEqual(decodeCultNetPayload(lease.current!, counterDocument).count, 9); assert.deepEqual(observed, [4, 6, 9]); assert.equal(first.activeSubscriptionCount, 0); assert.equal(second.activeSubscriptionCount, 1); @@ -236,6 +244,54 @@ test("browser client rejects a credential-free authority impersonator", async () ); }); +test("browser client opens an unsigned-certificate loopback session under local-development without a provider proof, as in C#", async () => { + const connect = (route: CultMeshBrowserRoute, trust: { mode: "local-development" | "authenticated-remote"; odinRoots: CultMeshBrowserP256PublicKey[] }) => + CultMeshBrowserClient.connect({ + ...route, + runtimeId: "browser-unsigned-certificate-test", + rendezvous: { resolve: async () => route }, + trust, + socketFactory: () => handshakeOnlySocket(route), + }); + const blank = (route: CultMeshBrowserRoute, signature: string) => + ({ ...route, certificate: { ...route.certificate!, signature } }); + + const loopback = await createSignedRoute("ws://127.0.0.1:4501/mesh"); + const localTrust = { mode: "local-development" as const, odinRoots: [loopback.odinPublic] }; + const remote = await createSignedRoute("wss://provider.example/mesh"); + + // Empty is the easy case. The whitespace signatures are the ones that catch a + // local re-reading of "unsigned" here: an inline `signature === ""` passes + // every other test in this file and fails these, and U+0085 also separates + // `String.prototype.trim` from the C# `char.IsWhiteSpace` the shared + // `isUnsignedCertificate` uses. Both sides of the session check have to read + // "unsigned" the same way, or the route verifier accepts a session the + // acceptance check then demands a provider proof for. + for (const signature of ["", " ", "\u0085", "\u00a0\t\n"]) { + const label = JSON.stringify(signature); + const client = await connect(blank(loopback.route, signature), localTrust); + assert.equal(client.state, "connected", label); + await client.dispose(); + await assert.rejects( + connect(blank(remote.route, signature), { mode: "local-development", odinRoots: [remote.odinPublic] }), + /Odin-signed authority certificate/, + label, + ); + await assert.rejects( + connect(blank(remote.route, signature), { mode: "authenticated-remote", odinRoots: [remote.odinPublic] }), + /Odin-signed authority certificate/, + label, + ); + } + // U+FEFF is whitespace to JavaScript and not to C#, so it is a signature, not + // an unsigned route, and the loopback route is refused for its bytes. + await assert.rejects(connect(blank(loopback.route, "\ufeff"), localTrust), /not base64|not IEEE P1363/); + + // A signed loopback certificate is an authenticated route even under + // local-development; the provider must still prove its key. + await assert.rejects(connect(loopback.route, localTrust), /did not prove possession/); +}); + test("browser client rejects a mutated or expired signed route before opening a provider socket", async () => { const fixture = await createSignedRoute("wss://provider.example/mesh"); let opened = false; @@ -324,7 +380,7 @@ test("browser client replays one idempotent operation after route loss without d const open = () => { let socket: FakeSocket; socket = new FakeSocket(wire => { - const message = parseCultNetMessage(decode(wire)); + const message = parseCultNetMessage(decodeWireValue(wire)); if (message.schemaVersion === "cultmesh.session_open.v2") { socket.deliver({ schemaVersion: "cultmesh.session_accepted.v2", @@ -352,7 +408,7 @@ test("browser client replays one idempotent operation after route loss without d status: "accepted", payloadSchema: "sample.increment_receipt.v1", payloadEncoding: "messagepack-base64", - payload: Buffer.from(encode({ count: effectCount })).toString("base64"), + payload: Buffer.from(encodeWireValue({ count: effectCount })).toString("base64"), sourceRuntimeId: "sample.counter-daemon", }; results.set(message.messageId, response!); @@ -552,7 +608,7 @@ class FakeProvider { } private receive(socket: FakeSocket, wire: Uint8Array): void { - const message = parseCultNetMessage(decode(wire)); + const message = parseCultNetMessage(decodeWireValue(wire)); switch (message.schemaVersion) { case "cultmesh.session_open.v2": this.acceptSession(socket, message); @@ -606,7 +662,7 @@ class FakeProvider { status: "invalid", payloadSchema: "gamecult.cultnet.operation_failure.v1", payloadEncoding: "messagepack-base64", - payload: bytesToBase64(encode({ + payload: bytesToBase64(encodeWireValue({ code: "request-schema-mismatch", message: "Expected payload schema 'sample.increment.v1'.", })), @@ -615,7 +671,7 @@ class FakeProvider { }); return; } - const payload = decode(base64ToBytes(message.payload)) as { amount: number }; + const payload = decodeWireValue(base64ToBytes(message.payload)) as { amount: number }; this.#count += payload.amount; for (const [peer, subscriptions] of this.#subscriptions) { for (const subscriptionId of subscriptions.keys()) { @@ -636,7 +692,7 @@ class FakeProvider { status: "accepted", payloadSchema: "sample.increment_receipt.v1", payloadEncoding: "messagepack-base64", - payload: bytesToBase64(encode({ count: this.#count })), + payload: bytesToBase64(encodeWireValue({ count: this.#count })), sourceRuntimeId: this.#responseRuntimeId, }); } @@ -650,7 +706,7 @@ class FakeProvider { recordKey: "counter:main", storedAt: "2026-08-17T00:00:00Z", payloadEncoding: "messagepack", - payload: encode({ count: this.#count }), + payload: documentPayloadFromBytes(encodeWireValue({ count: this.#count })), sourceRuntimeId: this.#runtimeId, }; } @@ -668,7 +724,7 @@ class FakeOdin { open(): FakeSocket { const socket = new FakeSocket(wire => { - const message = parseCultNetMessage(decode(wire)); + const message = parseCultNetMessage(decodeWireValue(wire)); if (message.schemaVersion !== "cultmesh.verse_catalog_request.v0") return; socket.deliver({ schemaVersion: "cultmesh.verse_catalog_response.v0", @@ -737,7 +793,7 @@ function routeForCatalog(route: CultMeshBrowserRoute): NonNullable< function handshakeOnlySocket(route: CultMeshBrowserRoute): FakeSocket { let socket: FakeSocket; socket = new FakeSocket(wire => { - const message = parseCultNetMessage(decode(wire)); + const message = parseCultNetMessage(decodeWireValue(wire)); if (message.schemaVersion !== "cultmesh.session_open.v2") return; socket.deliver({ schemaVersion: "cultmesh.session_accepted.v2", @@ -802,7 +858,7 @@ class FakeSocket implements CultMeshBrowserSocket { } deliver(message: CultNetMessage): void { - const wire = encode(encodeCultNetMessageForWire(message)); + const wire = encodeWireValue(encodeCultNetMessageForWire(message)); queueMicrotask(() => this.onmessage?.({ data: wire.slice().buffer } as MessageEvent)); } } @@ -851,7 +907,7 @@ async function createSignedRoute(endpoint: string): Promise<{ function signedHandshakeSocket(route: CultMeshBrowserRoute, providerPrivate: CryptoKey): FakeSocket { let socket: FakeSocket; socket = new FakeSocket(wire => { - const message = parseCultNetMessage(decode(wire)); + const message = parseCultNetMessage(decodeWireValue(wire)); if (message.schemaVersion !== "cultmesh.session_open.v2") return; void crypto.subtle.sign( { name: "ECDSA", hash: "SHA-256" }, @@ -927,3 +983,26 @@ function base64ToBytes(value: string): Uint8Array { const binary = atob(value); return Uint8Array.from(binary, character => character.charCodeAt(0)); } + +test("decodeCultNetPayload reads a payload through the definition it is given: plain map, codec or formatter", () => { + const record = (bytes: Uint8Array) => ({ + schemaId: "t.v0", recordKey: "k", payloadEncoding: "messagepack", payload: documentPayloadFromBytes(bytes), + }) as unknown as CultNetRawDocumentRecord; + const schema = { parse: (value: unknown) => value as { count: number } }; + const plain = defineDocumentType({ type: "t.plain", schemaId: "t.plain.v0", schema }); + const codec = defineDocumentType({ + type: "t.codec", schemaId: "t.codec.v0", schema, codec: codecs.slots<{ count: number }>({ 0: ["count", codecs.int32] }, "T.Count"), + }); + const formatted = defineDocumentType({ + type: "t.formatted", schemaId: "t.formatted.v0", schema, + formatter: { encode: value => encodeWireValue([value.count]), decode: payload => ({ count: (decodeWireValue(payload) as number[])[0]! }) }, + }); + assert.deepEqual(decodeCultNetPayload(record(encodeWireValue({ count: 7 })), plain), { count: 7 }); + assert.deepEqual(decodeCultNetPayload(record(encodeWireValue([7])), codec), { count: 7 }); + assert.deepEqual(decodeCultNetPayload(record(encodeWireValue([7])), formatted), { count: 7 }); +}); + +test("decodeCultNetPayload refuses a payload that is not messagepack, naming the encoding and not the payload", () => { + const record = { schemaId: "t.v0", recordKey: "k", payloadEncoding: "json", payload: documentPayloadFromBytes(encodeWireValue("secret-value")) } as unknown as CultNetRawDocumentRecord; + assert.throws(() => decodeCultNetPayload(record, counterDocument), (error: Error) => error.message === "Unsupported CultNet document payload 'json'."); +}); diff --git a/packages/cultmesh-browser/test/payload-type.test.ts b/packages/cultmesh-browser/test/payload-type.test.ts new file mode 100644 index 00000000..9cc95632 --- /dev/null +++ b/packages/cultmesh-browser/test/payload-type.test.ts @@ -0,0 +1,28 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { documentPayloadBytes, documentPayloadFromBytes, type DocumentPayload } from "@gamecult/cultcache-ts"; +import { decodeWireValue } from "cultnet-ts/wire"; +import type { CultNetRawDocumentRecord } from "cultnet-ts/contracts"; + +import { decodeCultNetPayload } from "../src/index.js"; + +// The rule: a document payload is read only through its definition. A CultNet record's payload is the opaque +// DocumentPayload, so tsc compiles this file only if each line carrying an expect-error directive is an error. The function is +// never called. +export function refusedReaders(record: CultNetRawDocumentRecord): void { + // @ts-expect-error the wire value decoder is for frames and values, not for a document's payload + decodeWireValue(record.payload); + // @ts-expect-error a record's payload is not assignable to bytes + const bytes: Uint8Array = record.payload; + // @ts-expect-error the browser reader needs the definition that says how the bytes are laid out + decodeCultNetPayload(record); + // @ts-expect-error bytes are not a payload until they enter by name + const forged: DocumentPayload = new Uint8Array(); + void [bytes, forged]; +} + +test("a record's payload is the same bytes it entered with by name", () => { + const bytes = Uint8Array.from([0x90]); + assert.equal(documentPayloadBytes(documentPayloadFromBytes(bytes)), bytes); +}); diff --git a/packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt b/packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt index 104bd1b9..368b5338 100644 --- a/packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt +++ b/packages/cultmesh-kotlin/src/main/kotlin/org/gamecult/cultmesh/CultMesh.kt @@ -11,6 +11,7 @@ import java.io.InputStream import java.io.OutputStream import java.net.DatagramPacket import java.net.DatagramSocket +import java.net.Inet6Address import java.net.InetAddress import java.net.InetSocketAddress import java.net.ServerSocket @@ -581,7 +582,7 @@ object CultMesh { connectionId: Long, remoteHost: String, remotePort: Int, - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), ): CultNetRudpSocketTransportConnection = cultNetRudpClient( @@ -600,7 +601,7 @@ object CultMesh { runtimeId: String, connectionId: Long, endpoint: CultNetRudpEndpoint, - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), ): CultNetRudpSocketTransportConnection = createRudpClient( @@ -617,7 +618,7 @@ object CultMesh { runtimeId: String, connectionId: Long, endpoint: String, - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), ): CultNetRudpSocketTransportConnection = createRudpClient( @@ -633,7 +634,7 @@ object CultMesh { runtimeId: String, connectionId: Long, peer: CultMeshPeerCard, - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), ): CultNetRudpSocketTransportConnection { @@ -651,7 +652,7 @@ object CultMesh { role: String, shardId: String? = null, at: Instant = Instant.now(), - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), ): CultNetRudpSocketTransportConnection { @@ -664,7 +665,7 @@ object CultMesh { runtimeId: String, connectionId: Long, endpoint: CultNetRudpEndpoint, - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), connectPayload: ByteArray = ByteArray(0), @@ -683,7 +684,7 @@ object CultMesh { runtimeId: String, connectionId: Long, endpoint: String, - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), connectPayload: ByteArray = ByteArray(0), @@ -705,7 +706,7 @@ object CultMesh { runtimeId: String, connectionId: Long, peer: CultMeshPeerCard, - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), connectPayload: ByteArray = ByteArray(0), @@ -736,7 +737,7 @@ object CultMesh { role: String, shardId: String? = null, at: Instant = Instant.now(), - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), connectPayload: ByteArray = ByteArray(0), @@ -1359,7 +1360,7 @@ fun defineCultNetSchemaDescriptor( schemaJson = schemaJson, ) -private const val cultNetSchemaBase = "https://github.com/GameCult/cultnet-ts/contracts" +private const val cultNetSchemaBase = "https://github.com/GameCult/CultLib/contracts/cultnet" private data class CultNetBuiltInSchemaSpec( val schemaVersion: String, @@ -1377,58 +1378,58 @@ private val cultNetBuiltInSchemaSpecs = listOf( title = "CultNet Hello Message", schemaId = "$cultNetSchemaBase/cultnet.hello.schema.json", requiredFields = listOf("schemaVersion", "runtimeId", "runtimeKind"), - contentHash = "1d2114bf0c92a2dd5e07dd735778ceeb939402c6424550d6d281d9db423f56b3", + contentHash = "f660ef803f293e2882650b3981c6eed835bd8e595c9b880d6c6271e0dcbd79e4", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.document_delete.v0", title = "CultNet Document Delete Message", schemaId = "$cultNetSchemaBase/cultnet.document-delete.schema.json", requiredFields = listOf("schemaVersion", "messageId", "schemaId", "recordKey"), - contentHash = "037f7cf1b30756904e0bfada6bcff486269378997afbe3c4b6fc5c573fc8a4df", + contentHash = "ed7dc202e4f1ebe0d88c5d60c81c53005b44a2557698d3d3c5d2126c01b40f08", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.document_put_raw.v0", title = "CultNet Raw Document Put Message", schemaId = "$cultNetSchemaBase/cultnet.document-put-raw.schema.json", - contentHash = "b61e7e6cce8508653fbeccc4d956ef211c853a174d67c7e1903ce294e15985a2", + contentHash = "34b61b14b49cfc887728673f08aa0f33df7ccd401e79c77d3bc324c72e547177", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.snapshot_request.v0", title = "CultNet Snapshot Request Message", schemaId = "$cultNetSchemaBase/cultnet.snapshot-request.schema.json", - contentHash = "9f6546f51a1aab85978554e6908d7a59e96b3329feff7b35022be210495dd721", + contentHash = "05267d9b5eb450d4aa8979179f74ba3aec2f3a82fead7ba4a16ab5462c7750fa", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.snapshot_response_raw.v0", title = "CultNet Raw Snapshot Response Message", schemaId = "$cultNetSchemaBase/cultnet.snapshot-response-raw.schema.json", - contentHash = "0dbca3338a3ae5d4011aed2c973c75b9b47b6b9dfc0874459ac56da01fef4582", + contentHash = "fdefbdf5d6b0844dd0eabe2c7430d054295d78e41289f96b227dc39f4aab78b9", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.schema_catalog_request.v0", title = "CultNet Schema Catalog Request Message", schemaId = "$cultNetSchemaBase/cultnet.schema-catalog-request.schema.json", wireContracts = listOf("cultnet.schema.v0", "gamecult.networking.v0"), - contentHash = "bdd49b44428daf24b514c521e53027ec944aecfebb39ca0d10967661c303e096", + contentHash = "ed6d63e29de2d492bb831f030b26ff49ba6883cd2be791ec4936c385f765c76a", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.schema_catalog_response.v0", title = "CultNet Schema Catalog Response Message", schemaId = "$cultNetSchemaBase/cultnet.schema-catalog-response.schema.json", wireContracts = listOf("cultnet.schema.v0", "gamecult.networking.v0"), - contentHash = "b158de53d1ca614eacf2e05767122fb4b9e06504c037ad76c649cffdf71dd648", + contentHash = "10b4835d33181fe4b93a33e39b63886c5514899e93682de786e298f7e4a213e9", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.shard_catalog_request.v0", title = "CultNet Shard Catalog Request Message", - schemaId = "cultnet.shard_catalog_request.v0", - contentHash = "0abd131a1db12f6731010333b86e104d550160bd58f539b18413a2b61198fa38", + schemaId = "$cultNetSchemaBase/cultnet.shard-catalog-request.schema.json", + contentHash = "b4edecd8a24f68ebccf0aca9b429d234618ff7e8858a10123d0b328aeae7eb3f", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.shard_catalog_response.v0", title = "CultNet Shard Catalog Response Message", - schemaId = "cultnet.shard_catalog_response.v0", - contentHash = "93a0e90ac81bc6ab21b68925ad25e381edfac8773232333679d3275141cff37b", + schemaId = "$cultNetSchemaBase/cultnet.shard-catalog-response.schema.json", + contentHash = "d86a94c57d7820483912b8b5cef6214ac951d34cb2641d2d21dcb1f1bc0263c0", ), CultNetBuiltInSchemaSpec( schemaVersion = "cultnet.shard_log_request.v0", @@ -1468,7 +1469,7 @@ private val cultNetBuiltInSchemaSpecs = listOf( schemaId = "$cultNetSchemaBase/cultnet.transport-profile.schema.json", kind = "shared_contract", requiredFields = listOf("schemaVersion", "runtimeId", "transports"), - contentHash = "84473264f543ca3443267999e43d72b7993b61b7b2ac53c642c9cbe8b6de0217", + contentHash = "63dfd484e1fd332c167caadf52cb5b4fe12d5ffea4415206c3ef111c196507aa", ), ) @@ -3028,22 +3029,36 @@ fun cultNetRudpServer( ) } +/** + * The address an RUDP client binds when its caller names none: loopback for a + * loopback endpoint, otherwise the unspecified address of the endpoint's family. + * A socket bound to loopback cannot send off the host on Windows. + */ +fun cultNetRudpClientBindAddress(remote: InetAddress): InetAddress = when { + remote is Inet6Address && remote.isLoopbackAddress -> InetAddress.getByName("::1") + remote is Inet6Address -> InetAddress.getByName("::") + remote.isLoopbackAddress -> InetAddress.getByName("127.0.0.1") + else -> InetAddress.getByName("0.0.0.0") +} + fun cultNetRudpClient( runtimeId: String, connectionId: Long, remoteHost: String, remotePort: Int, - bindHost: String = "127.0.0.1", + bindHost: String? = null, bindPort: Int = 0, tuning: CultNetRudpSocketTuning = CultNetRudpSocketTuning(), ): CultNetRudpSocketTransportConnection { - val socket = DatagramSocket(bindPort, InetAddress.getByName(bindHost)).also { it.soTimeout = 20 } + val remote = InetAddress.getByName(remoteHost) + val bindAddress = bindHost?.let(InetAddress::getByName) ?: cultNetRudpClientBindAddress(remote) + val socket = DatagramSocket(bindPort, bindAddress).also { it.soTimeout = 20 } return CultNetRudpSocketTransportConnection( socket = socket, mode = CultNetRudpSocketMode.Client, runtimeId = runtimeId, connectionId = connectionId, - remoteAddress = InetSocketAddress(InetAddress.getByName(remoteHost), remotePort), + remoteAddress = InetSocketAddress(remote, remotePort), initialSequence = tuning.initialSequence, resendDelayMs = tuning.resendDelayMs, maxFragmentBytes = tuning.maxFragmentBytes, @@ -3368,6 +3383,7 @@ fun main(args: Array) { rudpSessionFragmentsAndReassemblesReliableOrderedPayloads() rudpSessionAdvancesLargeFragmentSetsThroughBoundedReliableWindow() rudpSocketTransportErgonomicFactoriesCarrySchemaFrames() + rudpClientBindsLoopbackOnlyForALoopbackEndpoint() rudpSocketTransportHandshakesAndCarriesReliableOrderedSchemaFrames() rudpSocketTransportCarriesFragmentedReliableOrderedSchemaFrames() return @@ -3717,16 +3733,16 @@ private fun cultNetReconnectControllerSchedulesAttemptsAndReset() { private const val interopDocumentType = "cultnet.interop-note" private const val interopSchemaVersion = "cultnet.interop_note.v0" private const val interopMutationIntentType = "cultnet.interop-note-mutation-intent" -private const val interopMutationIntentSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-intent.schema.json" +private const val interopMutationIntentSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-intent.schema.json" private const val interopMutationIntentSchemaVersion = "cultnet.interop_note_mutation_intent.v0" private const val interopMutationReceiptType = "cultnet.interop-note-mutation-receipt" -private const val interopMutationReceiptSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-note-mutation-receipt.schema.json" +private const val interopMutationReceiptSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-note-mutation-receipt.schema.json" private const val interopMutationReceiptSchemaVersion = "cultnet.interop_note_mutation_receipt.v0" private const val interopFireCommandType = "cultnet.interop-fire-weapon-command" -private const val interopFireCommandSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-command.schema.json" +private const val interopFireCommandSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-command.schema.json" private const val interopFireCommandSchemaVersion = "cultnet.interop_fire_weapon_command.v0" private const val interopFireReceiptType = "cultnet.interop-fire-weapon-receipt" -private const val interopFireReceiptSchemaId = "https://github.com/GameCult/cultnet-ts/integration/contracts/cultnet.interop-fire-weapon-receipt.schema.json" +private const val interopFireReceiptSchemaId = "https://github.com/GameCult/CultLib/contracts/cultnet/interop/cultnet.interop-fire-weapon-receipt.schema.json" private const val interopFireReceiptSchemaVersion = "cultnet.interop_fire_weapon_receipt.v0" private const val rudpInteropConnectionId = 0x43554c54L private const val rudpInteropMaxFragmentBytes = 1024 @@ -4627,11 +4643,11 @@ private fun cultNetBuiltInSchemaCatalogAdvertisesWireContracts() { check(schemaCatalogRequest["wireContracts"] == listOf("cultnet.schema.v0", "gamecult.networking.v0")) check(!schemaCatalogRequest.containsKey("schemaJson")) val shardCatalogRequest = schemas.single { it["schemaVersion"] == "cultnet.shard_catalog_request.v0" } - check(shardCatalogRequest["schemaId"] == "cultnet.shard_catalog_request.v0") + check(shardCatalogRequest["schemaId"] == "$cultNetSchemaBase/cultnet.shard-catalog-request.schema.json") check(shardCatalogRequest["wireContracts"] == listOf("cultnet.schema.v0")) - check(shardCatalogRequest["contentHash"] == "0abd131a1db12f6731010333b86e104d550160bd58f539b18413a2b61198fa38") + check(shardCatalogRequest["contentHash"] == "b4edecd8a24f68ebccf0aca9b429d234618ff7e8858a10123d0b328aeae7eb3f") val shardCatalogResponse = schemas.single { it["schemaVersion"] == "cultnet.shard_catalog_response.v0" } - check(shardCatalogResponse["schemaId"] == "cultnet.shard_catalog_response.v0") + check(shardCatalogResponse["schemaId"] == "$cultNetSchemaBase/cultnet.shard-catalog-response.schema.json") check(shardCatalogResponse["wireContracts"] == listOf("cultnet.schema.v0")) val inlineCatalog = cultNetBuiltInSchemaCatalog(includeSchemaJson = true) @@ -4644,7 +4660,7 @@ private fun cultNetBuiltInSchemaCatalogAdvertisesWireContracts() { ) val transportProfile = mapList(transportResponse.body["schemas"]).single() check(transportProfile["kind"] == "shared_contract") - check(transportProfile["contentHash"] == "84473264f543ca3443267999e43d72b7993b61b7b2ac53c642c9cbe8b6de0217") + check(transportProfile["contentHash"] == "63dfd484e1fd332c167caadf52cb5b4fe12d5ffea4415206c3ef111c196507aa") check(!transportProfile.containsKey("schemaJson")) val filteredTransportCatalog = CultMesh.createBuiltInSchemaCatalog( @@ -5378,6 +5394,27 @@ private fun rudpSessionAdvancesLargeFragmentSetsThroughBoundedReliableWindow() { check(oldAck.ackMask == 0L) } +private fun rudpClientBoundHost(endpoint: String, bindHost: String? = null): InetAddress = + CultMesh.createRudpClient("kotlin-rudp-bind-client", 0x10203060L, endpoint, bindHost).use { client -> + InetAddress.getByName(client.profile.transports.single().host) + } + +// A client bound to loopback cannot send to another host on Windows, so a +// client for a remote endpoint binds the unspecified address. A JVM wildcard +// socket is dual-stack and reports one wildcard for either family, so the +// family is not observable here. +private fun rudpClientBindsLoopbackOnlyForALoopbackEndpoint() { + check(rudpClientBoundHost("rudp://10.77.0.1:17872").isAnyLocalAddress) + check(rudpClientBoundHost("rudp://[2001:db8::1]:17872").isAnyLocalAddress) + check(rudpClientBoundHost("rudp://127.0.0.1:17872") == InetAddress.getByName("127.0.0.1")) + check(rudpClientBoundHost("rudp://[::1]:17872") == InetAddress.getByName("::1")) + check(rudpClientBoundHost("rudp://10.77.0.1:17872", "127.0.0.1") == InetAddress.getByName("127.0.0.1")) + check(rudpClientBoundHost("rudp://127.0.0.1:17872", "0.0.0.0").isAnyLocalAddress) + CultMesh.createRudpServer("kotlin-rudp-bind-server", 0x10203061L).use { server -> + check(InetAddress.getByName(server.profile.transports.single().host) == InetAddress.getByName("127.0.0.1")) + } +} + private fun rudpSocketTransportErgonomicFactoriesCarrySchemaFrames() { val connectionId = 0x10203042L CultMesh.createRudpServer( diff --git a/packages/cultmesh-py/src/cultmesh_py/__init__.py b/packages/cultmesh-py/src/cultmesh_py/__init__.py index af4da272..f2dc6b28 100644 --- a/packages/cultmesh-py/src/cultmesh_py/__init__.py +++ b/packages/cultmesh-py/src/cultmesh_py/__init__.py @@ -24,7 +24,7 @@ from .node import ( CultMeshReactiveDocumentReconciliation, create_node, ) -from .server import CultMeshLocalServer +from .server import CULTMESH_RUDP_DEFAULT_MAX_FRAGMENT_BYTES, CultMeshLocalServer from .session import ( CultMeshGameSession, CultMeshGameSessionOptions, @@ -79,6 +79,7 @@ __all__ = [ "CultMeshReactiveDocumentReconciliation", "CultMeshGameSession", "CultMeshGameSessionOptions", + "CULTMESH_RUDP_DEFAULT_MAX_FRAGMENT_BYTES", "CultMeshLocalServer", "CultMeshPeerCard", "CultMeshPeerCatalog", diff --git a/packages/cultmesh-py/src/cultmesh_py/daemon.py b/packages/cultmesh-py/src/cultmesh_py/daemon.py index d21d42d8..5b127008 100644 --- a/packages/cultmesh-py/src/cultmesh_py/daemon.py +++ b/packages/cultmesh-py/src/cultmesh_py/daemon.py @@ -24,10 +24,18 @@ from cultnet_py.cultmesh_contracts import ( READY_SCHEMA_VERSION = "cultmesh.daemon_ready.v0" +def _port(value: str) -> int: + """A TCP/UDP port: 0 (any free port) through 65535.""" + port = int(value) + if not 0 <= port <= 65535: + raise argparse.ArgumentTypeError("port must be between 0 and 65535") + return port + + def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser(prog="cultmesh-py-daemon") parser.add_argument("--host", default="127.0.0.1") - parser.add_argument("--port", type=int, default=3075) + parser.add_argument("--port", type=_port, default=3075) parser.add_argument("--runtime-id", default="python-runtime") parser.add_argument("--display-name") parser.add_argument("--cache-file") @@ -50,7 +58,7 @@ def main(argv: list[str] | None = None) -> int: stop = threading.Event() install_signal_handlers(stop) - server = start_server(args) + server = start_server(args, parser) try: ready = daemon_ready_document(server) publish_ready(ready, ready_file=args.ready_file) @@ -61,7 +69,7 @@ def main(argv: list[str] | None = None) -> int: return 0 -def start_server(args: argparse.Namespace) -> CultMeshLocalServer: +def start_server(args: argparse.Namespace, parser: argparse.ArgumentParser) -> CultMeshLocalServer: node = CultMesh.create_node( args.cache_file, runtime_id=args.runtime_id, @@ -98,17 +106,21 @@ def start_server(args: argparse.Namespace) -> CultMeshLocalServer: quorum_ratio=args.simulation_quorum_ratio, ) ) - server = CultMesh.serve_node( - node, - verse_catalog=verse_catalog, - peer_catalog=peer_catalog, - observation_hub=observation_hub, - host=args.host, - port=args.port, - display_name=args.display_name, - max_snapshot_documents=args.max_snapshot_documents, - max_snapshot_bytes=args.max_snapshot_bytes, - ) + try: + server = CultMesh.serve_node( + node, + verse_catalog=verse_catalog, + peer_catalog=peer_catalog, + observation_hub=observation_hub, + host=args.host, + port=args.port, + display_name=args.display_name, + max_snapshot_documents=args.max_snapshot_documents, + max_snapshot_bytes=args.max_snapshot_bytes, + ) + except ValueError as error: + # The server owns its option rules; a limit it refuses is a usage error, not a crash. + parser.error(str(error)) advertise_self(server, verse_catalog, peer_catalog, args) return server diff --git a/packages/cultmesh-py/src/cultmesh_py/facade.py b/packages/cultmesh-py/src/cultmesh_py/facade.py index 53328aab..84bea2c8 100644 --- a/packages/cultmesh-py/src/cultmesh_py/facade.py +++ b/packages/cultmesh-py/src/cultmesh_py/facade.py @@ -18,6 +18,7 @@ from cultnet_py import ( CultNetShardCatalog, CultNetSimulationObservationHub, create_rudp_schema_transport, + rudp_client_bind_host, wire_message_schema_catalog, ) @@ -31,7 +32,7 @@ from .node import ( CultMeshPublicationDocumentBinding, create_node, ) -from .server import CultMeshLocalServer +from .server import CULTMESH_RUDP_DEFAULT_MAX_FRAGMENT_BYTES, CultMeshLocalServer from .session import CultMeshGameSession, CultMeshGameSessionOptions from .simulation import CultMeshSimulationFactCommitter from cultnet_py.cultmesh_contracts import ( @@ -157,7 +158,7 @@ class CultMesh: bind_host: str = "127.0.0.1", bind_port: int = 0, socket: socket_module.socket | None = None, - initial_sequence: int = 1, + initial_sequence: int | None = None, resend_delay_ms: int = 250, transport_id: str = "rudp", max_payload_bytes: int | None = None, @@ -188,10 +189,10 @@ class CultMesh: connection_id: int, endpoint: str | CultMeshRudpEndpoint, *, - bind_host: str = "127.0.0.1", + bind_host: str | None = None, bind_port: int = 0, socket: socket_module.socket | None = None, - initial_sequence: int = 1, + initial_sequence: int | None = None, resend_delay_ms: int = 250, transport_id: str = "rudp", max_payload_bytes: int | None = None, @@ -204,7 +205,10 @@ class CultMesh: if isinstance(endpoint, str) else endpoint ) - transport_socket = socket or _bind_rudp_socket(bind_host, bind_port) + transport_socket = socket or _bind_rudp_socket( + bind_host if bind_host is not None else rudp_client_bind_host(parsed_endpoint.host), + bind_port, + ) return CultNetRudpSocketTransportConnection( CultNetRudpSocketTransportOptions( runtime_id=runtime_id, @@ -404,6 +408,8 @@ class CultMesh: enable_rudp: bool = True, rudp_connection_id: int = 0x43554C54, rudp_resend_delay_ms: int = 25, + rudp_max_fragment_bytes: int = CULTMESH_RUDP_DEFAULT_MAX_FRAGMENT_BYTES, + rudp_max_pending_reliable_packets: int | None = None, ) -> CultMeshLocalServer: return CultMeshLocalServer( node=node, @@ -418,6 +424,8 @@ class CultMesh: enable_rudp=enable_rudp, rudp_connection_id=rudp_connection_id, rudp_resend_delay_ms=rudp_resend_delay_ms, + rudp_max_fragment_bytes=rudp_max_fragment_bytes, + rudp_max_pending_reliable_packets=rudp_max_pending_reliable_packets, ).start() @staticmethod @@ -429,7 +437,7 @@ class CultMesh: endpoint: str | CultMeshRudpEndpoint | None = None, connection_id: int = 0x43554C54, runtime_id: str = "cultmesh-python-rudp-client", - bind_host: str = "127.0.0.1", + bind_host: str | None = None, bind_port: int = 0, ) -> CultNetRawClient: if endpoint is None and host.lower().startswith("rudp://"): @@ -465,7 +473,7 @@ class CultMesh: endpoint: str | CultMeshRudpEndpoint | None = None, connection_id: int = 0x43554C54, runtime_id: str = "cultmesh-python-rudp-client", - bind_host: str = "127.0.0.1", + bind_host: str | None = None, bind_port: int = 0, ) -> CultNetRawClient: return CultMesh.create_client( @@ -481,7 +489,10 @@ class CultMesh: def _bind_rudp_socket(bind_host: str, bind_port: int) -> socket_module.socket: - transport_socket = socket_module.socket(socket_module.AF_INET, socket_module.SOCK_DGRAM) + transport_socket = socket_module.socket( + socket_module.AF_INET6 if ":" in bind_host else socket_module.AF_INET, + socket_module.SOCK_DGRAM, + ) transport_socket.bind((bind_host, bind_port)) transport_socket.settimeout(0.02) return transport_socket diff --git a/packages/cultmesh-py/src/cultmesh_py/node.py b/packages/cultmesh-py/src/cultmesh_py/node.py index 09ac2012..bf092060 100644 --- a/packages/cultmesh-py/src/cultmesh_py/node.py +++ b/packages/cultmesh-py/src/cultmesh_py/node.py @@ -651,6 +651,38 @@ class CultMeshDatabase: return message def apply_raw_put_message(self, message: dict[str, Any]) -> CultMeshDatabaseChange | None: + prepared = self._raw_put_envelope(message) + if prepared is None: + return None + document, envelope = prepared + record_key = envelope.key + previous = self.cache.get(document, record_key) + value = self.cache.put_envelope(document, envelope) + change_kind = "added" if previous is None else "updated" + change = self._publish_local_change(document, record_key, change_kind, value, previous) + self._append_shard_log_put(CultNetMessage( + "cultnet.document_put_raw.v0", + {key: value for key, value in message.items() if key != "schemaVersion"}, + ), change_kind) + return change + + def raw_put_served_alone(self, message: dict[str, Any], *, message_id: str) -> dict[str, Any] | None: + """The snapshot response that would serve this put's document alone, as a wire map. + + It is built from the envelope the put would store, exactly as a snapshot builds it, so a + server can judge a put by the size it would be served at. None when the put would not apply. + """ + prepared = self._raw_put_envelope(message) + if prepared is None: + return None + return CultNetRawSnapshotResponse( + message_id=message_id, + documents=(self._served_record(prepared[1]),), + ).to_wire() + + def _raw_put_envelope( + self, message: dict[str, Any] + ) -> tuple[DocumentDefinition[Any], CultCacheEnvelope] | None: document_record = message.get("document") if not isinstance(document_record, dict): return None @@ -664,24 +696,24 @@ class CultMeshDatabase: ) except KeyError: return None - record_key = str(document_record["recordKey"]) - previous = self.cache.get(document, record_key) - envelope = CultCacheEnvelope( - key=record_key, + return document, CultCacheEnvelope( + key=str(document_record["recordKey"]), type=document.type, schema_id=resolved_schema_id, payload=bytes(document_record["payload"]), stored_at=str(document_record.get("storedAt") or ""), catalog_entry=document.catalog_entry(), ) - value = self.cache.put_envelope(document, envelope) - change_kind = "added" if previous is None else "updated" - change = self._publish_local_change(document, record_key, change_kind, value, previous) - self._append_shard_log_put(CultNetMessage( - "cultnet.document_put_raw.v0", - {key: value for key, value in message.items() if key != "schemaVersion"}, - ), change_kind) - return change + + @staticmethod + def _served_record(envelope: CultCacheEnvelope) -> CultNetRawDocumentRecord: + return CultNetRawDocumentRecord( + schema_id=envelope.schema_id or envelope.type, + record_key=envelope.key, + stored_at=envelope.stored_at, + payload_encoding="messagepack", + payload=envelope.payload, + ) def apply_raw_delete_message(self, message: dict[str, Any]) -> CultMeshDatabaseChange | None: schema_id = str(message.get("schemaId") or "") @@ -774,13 +806,7 @@ class CultMeshDatabase: continue if shard_record_keys is not None and (schema_id, envelope.key) not in shard_record_keys: continue - documents.append(CultNetRawDocumentRecord( - schema_id=schema_id, - record_key=envelope.key, - stored_at=envelope.stored_at, - payload_encoding="messagepack", - payload=envelope.payload, - )) + documents.append(self._served_record(envelope)) return CultNetRawSnapshotResponse( message_id=message_id, diff --git a/packages/cultmesh-py/src/cultmesh_py/server.py b/packages/cultmesh-py/src/cultmesh_py/server.py index e0c7fdd0..e50def4d 100644 --- a/packages/cultmesh-py/src/cultmesh_py/server.py +++ b/packages/cultmesh-py/src/cultmesh_py/server.py @@ -1,14 +1,16 @@ from __future__ import annotations +import logging import socket import threading import time -from dataclasses import dataclass, field +from dataclasses import dataclass, field, replace from typing import Any import msgpack from cultnet_py import ( + CultNetRawSnapshotResponse, CultNetSimulationObservationHub, CultNetRudpPacket, CultNetRudpPacketType, @@ -20,10 +22,25 @@ from cultnet_py import ( create_tcp_framed_transport_profile, decode_rudp_packet, encode_rudp_packet, + is_permanent_send_error, wire_message_schema_descriptors, ) from .node import CultMeshNode + +# The shortest message id this server answers a snapshot request under. It takes a +# request's messageId as given, an empty one included, so no response it sends is smaller. +_SHORTEST_SERVED_MESSAGE_ID = "" +# The most fragments one RUDP message can carry: its fragment count is a u16. +_MAX_FRAGMENTS_PER_MESSAGE = 0xFFFF +# Replies larger than one fragment are split into fragments of at most this many bytes, +# as the Rust and TypeScript document servers do by default. +CULTMESH_RUDP_DEFAULT_MAX_FRAGMENT_BYTES = 1200 +# The answer to a request whose reply the peer's reliable queue cannot take. Fixed text: it +# never quotes the reply or the queue's error. +_REPLY_UNQUEUEABLE = "The reply could not be queued for this peer." +# The answer to a message the server could not handle. Fixed text: it never quotes the message. +_MESSAGE_UNHANDLED = "The message could not be handled." from cultnet_py.cultmesh_contracts import ( PEER_EXCHANGE_REQUEST, VERSE_CATALOG_REQUEST, @@ -31,6 +48,17 @@ from cultnet_py.cultmesh_contracts import ( CultMeshVerseCatalog, ) +_LOGGER = logging.getLogger(__name__) + + +class _ReplyUnqueueable(Exception): + """A reply the peer's reliable queue cannot take. The peer's session ends, and the peer is + answered first with a small cultnet.error.v0 under the request's message id.""" + + def __init__(self, message_id: str) -> None: + super().__init__("reply could not be queued") + self.message_id = message_id + @dataclass(frozen=True) class _DatabaseSubscription: @@ -68,17 +96,63 @@ class CultMeshLocalServer: enable_rudp: bool = True rudp_connection_id: int = 0x43554C54 rudp_resend_delay_ms: int = 25 + # RUDP replies are fragmented by rudp_max_fragment_bytes, and each peer's reliable queue + # holds at most rudp_max_pending_reliable_packets (None: only the 65535 fragments one + # message can carry). A put arriving over RUDP whose served reply could not fit them is + # refused as document_unservable. + rudp_max_fragment_bytes: int = CULTMESH_RUDP_DEFAULT_MAX_FRAGMENT_BYTES + rudp_max_pending_reliable_packets: int | None = None _socket: socket.socket | None = field(default=None, init=False, repr=False) _rudp_socket: socket.socket | None = field(default=None, init=False, repr=False) _stop: threading.Event = field(default_factory=threading.Event, init=False, repr=False) _thread: threading.Thread | None = field(default=None, init=False, repr=False) _rudp_thread: threading.Thread | None = field(default=None, init=False, repr=False) + _rudp_send_failures: int = field(default=0, init=False, repr=False) + + @property + def rudp_send_failures(self) -> int: + """Datagrams that could not be sent to a peer. Each is that peer's lost + datagram: a reliable packet stays pending and is resent, and no other + peer is affected. A datagram that can never be sent as built + (`is_permanent_send_error`) is not counted here: it ends that peer's + session, and the peer's goodbye names the error.""" + return self._rudp_send_failures def __post_init__(self) -> None: - if self.max_snapshot_documents is not None and self.max_snapshot_documents < 0: - raise ValueError("max_snapshot_documents must be non-negative") - if self.max_snapshot_bytes is not None and self.max_snapshot_bytes < 0: - raise ValueError("max_snapshot_bytes must be non-negative") + # The Rust document server's option rules (validate_options), for each option this + # server shares with it: every limit is greater than zero, and the limits leave room for + # the smallest response the server sends, an empty snapshot. A server that could answer + # nothing is misconfigured. The RUDP options are checked only when RUDP is served, as + # Rust checks them only for the RUDP server they configure. + if self.max_snapshot_bytes is not None and self.max_snapshot_bytes <= 0: + raise ValueError("max_snapshot_bytes must be greater than zero") + if self.max_snapshot_documents is not None and self.max_snapshot_documents <= 0: + raise ValueError("max_snapshot_documents must be greater than zero") + if self.enable_rudp: + if self.rudp_resend_delay_ms <= 0: + raise ValueError("rudp_resend_delay_ms must be greater than zero") + if self.rudp_max_pending_reliable_packets is not None and self.rudp_max_pending_reliable_packets <= 0: + raise ValueError("rudp_max_pending_reliable_packets must be greater than zero") + if self.rudp_max_fragment_bytes <= 0: + raise ValueError("rudp_max_fragment_bytes must be greater than zero") + empty = _snapshot_response_bytes( + CultNetRawSnapshotResponse(message_id=_SHORTEST_SERVED_MESSAGE_ID, documents=()).to_wire() + ) + if self.max_snapshot_bytes is not None and empty > self.max_snapshot_bytes: + raise ValueError("max_snapshot_bytes cannot hold an empty snapshot response") + if self.enable_rudp and -(-empty // self.rudp_max_fragment_bytes) > self._max_rudp_reply_fragments(): + raise ValueError( + "rudp_max_fragment_bytes and rudp_max_pending_reliable_packets cannot carry an empty " + "snapshot response" + ) + + def _max_rudp_reply_fragments(self) -> int: + """The most fragments one RUDP reply can take: one message's fragment count, and the + peer's reliable queue it must fit into whole.""" + return min( + _MAX_FRAGMENTS_PER_MESSAGE, + self.rudp_max_pending_reliable_packets or _MAX_FRAGMENTS_PER_MESSAGE, + ) def start(self) -> "CultMeshLocalServer": if self._socket is not None: @@ -196,7 +270,22 @@ class CultMeshLocalServer: return if not isinstance(message, dict): continue - responses = self._handle_connection_message(message, subscriptions) + try: + responses = self._handle_connection_message(message, subscriptions) + except Exception as error: # noqa: BLE001 - one message never ends the connection + # Whatever a peer's message makes the handling raise is that peer's failure: + # it is refused with fixed text and the connection serves on. The log names + # the error type only, because the error's own message can quote the peer. + _LOGGER.warning( + "CultMesh server could not handle a peer's message (%s); it was refused.", + type(error).__name__, + ) + message_id = message.get("messageId") + responses = [self._error_response( + _MESSAGE_UNHANDLED, + message_id=message_id if isinstance(message_id, str) else "", + code="message_unhandled", + )] for response in responses: transport.send("schema", msgpack.packb(response, use_bin_type=True)) @@ -208,7 +297,10 @@ class CultMeshLocalServer: while not self._stop.is_set(): try: wire, remote_addr = rudp_socket.recvfrom(65535) - except TimeoutError: + except (TimeoutError, ConnectionResetError): + # Windows reports an earlier ICMP port-unreachable, from a peer that + # has gone away, as an error on the next receive. It names no datagram + # of this read, so it is idle, not the end of the thread. self._poll_rudp_resends(rudp_socket, peers) continue except OSError: @@ -224,55 +316,96 @@ class CultMeshLocalServer: now_ms = _now_ms() peer = peers.get(remote_addr) if packet.packet_type == CultNetRudpPacketType.CONNECT: - peer = _RudpPeerConnection( - CultNetRudpSession( - CultNetRudpSessionOptions( - connection_id=self.rudp_connection_id, - resend_delay_ms=self.rudp_resend_delay_ms, + # The session decides whether this Connect repeats the one it + # accepted. Any other Connect is a new client session, with new + # subscriptions. + if peer is None or not peer.session.connect_repeats(packet): + peer = _RudpPeerConnection( + CultNetRudpSession( + CultNetRudpSessionOptions( + connection_id=self.rudp_connection_id, + resend_delay_ms=self.rudp_resend_delay_ms, + max_pending_reliable_packets=self.rudp_max_pending_reliable_packets, + ) ) ) - ) - peers[remote_addr] = peer - self._send_rudp_packet( + peers[remote_addr] = peer + unsendable = self._send_rudp_packet( rudp_socket, remote_addr, peer.session.accept_connect(packet, now_ms, b"cultmesh-local-rudp"), ) + if unsendable is not None: + self._end_unsendable_peer(rudp_socket, peers, remote_addr, unsendable) continue if peer is None: continue - result = peer.session.receive(packet, now_ms) - if result.reply is not None: - self._send_rudp_packet(rudp_socket, remote_addr, result.reply) - for ready in result.ready_to_send: - self._send_rudp_packet(rudp_socket, remote_addr, ready) + try: + result = peer.session.receive(packet, now_ms) + except ValueError: + # receive() has already recorded the packet's reliable sequence, so the + # session cannot be kept: a retransmit would be acknowledged and the + # frame silently lost. It ends, never the thread, and the peer is told. + self._end_refused_peer(rudp_socket, peers, remote_addr) + continue + unsendable: OSError | None = None + for outgoing in (*([result.reply] if result.reply is not None else []), *result.ready_to_send): + unsendable = self._send_rudp_packet(rudp_socket, remote_addr, outgoing) + if unsendable is not None: + break if result.disconnected: peers.pop(remote_addr, None) continue - for delivered in result.delivered: - if delivered.channel_id != "schema": - continue - try: - message = msgpack.unpackb(delivered.payload, raw=False) - except (msgpack.ExtraData, msgpack.FormatError, msgpack.StackError, ValueError): - continue - if not isinstance(message, dict): - continue - responses = self._handle_connection_message(message, peer.subscriptions) - for response in responses: - self._send_rudp_schema_frame( - rudp_socket, - remote_addr, - peer.session, - msgpack.packb(response, use_bin_type=True), + try: + for delivered in result.delivered: + if delivered.channel_id != "schema": + continue + try: + message = msgpack.unpackb(delivered.payload, raw=False) + except (msgpack.ExtraData, msgpack.FormatError, msgpack.StackError, ValueError): + continue + if not isinstance(message, dict): + continue + responses = self._handle_connection_message(message, peer.subscriptions, over_rudp=True) + for response in responses: + if unsendable is None: + unsendable = self._send_rudp_schema_frame( + rudp_socket, + remote_addr, + peer.session, + msgpack.packb(response, use_bin_type=True), + message_id=str(response.get("messageId") or ""), + ) + except Exception as error: # noqa: BLE001 - one peer's message never ends the thread + # Whatever a peer's message makes the handling raise is that peer's failure. + # The session recorded the frame's sequence, so it cannot be kept: a retransmit + # would be acknowledged and never handled. The session ends, never the thread, + # and the peer is told. The log names the error type only, because the error's + # own message can quote what the peer sent. + _LOGGER.warning( + "CultMesh RUDP server could not handle a peer's message (%s); that peer's session ended.", + type(error).__name__, + ) + refusal = None + if isinstance(error, _ReplyUnqueueable): + refusal = self._error_response( + _REPLY_UNQUEUEABLE, + message_id=error.message_id, + code="response_unqueueable", ) - if packet.reliable or packet.packet_type == CultNetRudpPacketType.DATA or result.delivered: - self._send_rudp_packet( + self._end_refused_peer(rudp_socket, peers, remote_addr, refusal=refusal) + continue + if unsendable is None and ( + packet.reliable or packet.packet_type == CultNetRudpPacketType.DATA or result.delivered + ): + unsendable = self._send_rudp_packet( rudp_socket, remote_addr, peer.session.create_ack_for_received(packet.sequence), ) + if unsendable is not None: + self._end_unsendable_peer(rudp_socket, peers, remote_addr, unsendable) def _poll_rudp_resends( self, @@ -282,7 +415,10 @@ class CultMeshLocalServer: now_ms = _now_ms() for remote_addr, peer in list(peers.items()): for packet in peer.session.due_resends(now_ms): - self._send_rudp_packet(rudp_socket, remote_addr, packet) + unsendable = self._send_rudp_packet(rudp_socket, remote_addr, packet) + if unsendable is not None: + self._end_unsendable_peer(rudp_socket, peers, remote_addr, unsendable) + break def _send_rudp_schema_frame( self, @@ -290,26 +426,103 @@ class CultMeshLocalServer: remote_addr: tuple[str, int], session: CultNetRudpSession, payload: bytes, - ) -> None: - for packet in session.send_many( - "schema", - payload, - CultNetRudpSendOptions(reliable=True, ordered=True, now_ms=_now_ms()), - ): - self._send_rudp_packet(rudp_socket, remote_addr, packet) + *, + message_id: str = "", + ) -> OSError | None: + try: + packets = session.send_many( + "schema", + payload, + CultNetRudpSendOptions(reliable=True, ordered=True, now_ms=_now_ms()), + max_fragment_bytes=self.rudp_max_fragment_bytes, + ) + except ValueError: + # The peer's reliable queue cannot take this reply. The peer is answered, not left + # to time out, and its session ends: see _end_refused_peer. + raise _ReplyUnqueueable(message_id) from None + for packet in packets: + unsendable = self._send_rudp_packet(rudp_socket, remote_addr, packet) + if unsendable is not None: + return unsendable + return None - @staticmethod def _send_rudp_packet( + self, rudp_socket: socket.socket, remote_addr: tuple[str, int], packet: CultNetRudpPacket, + ) -> OSError | None: + # A transient send failure is that peer's lost datagram: counted, never + # raised (raising here ended the RUDP thread for every peer). A permanent + # one (`is_permanent_send_error`) is returned: the datagram can never be + # sent as built, and the caller ends that peer's session. + wire = encode_rudp_packet(packet) + try: + rudp_socket.sendto(wire, remote_addr) + except OSError as error: + if is_permanent_send_error(error): + return error + self._rudp_send_failures += 1 + return None + + def _end_refused_peer( + self, + rudp_socket: socket.socket, + peers: dict[tuple[str, int], _RudpPeerConnection], + remote_addr: tuple[str, int], + *, + refusal: dict[str, Any] | None = None, ) -> None: - rudp_socket.sendto(encode_rudp_packet(packet), remote_addr) + """Ends a peer's session that refused one of its messages, and says goodbye. A + refusal, when there is one, goes first, unreliable and unordered: the session ends + with it, so it is never resent and needs no room in the reliable queue. It is built + before the reset and carries acknowledgement fields built after it, which acknowledge + nothing, like the goodbye: the ack would otherwise cover the very frame refused. A + refusal fragment that can never be sent is not dropped: the goodbye names its failure.""" + peer = peers.pop(remote_addr) + packets: list[CultNetRudpPacket] = [] + if refusal is not None: + try: + packets = peer.session.send_many( + "schema", + msgpack.packb(refusal, use_bin_type=True), + CultNetRudpSendOptions(reliable=False, ordered=False, now_ms=_now_ms()), + max_fragment_bytes=self.rudp_max_fragment_bytes, + ) + except ValueError: + packets = [] + peer.session.reset_peer_state() + nothing = peer.session.create_ack() + for packet in packets: + unsendable = self._send_rudp_packet( + rudp_socket, remote_addr, replace(packet, ack=nothing.ack, ack_mask=nothing.ack_mask) + ) + if unsendable is not None: + self._send_rudp_packet(rudp_socket, remote_addr, peer.session.end_unsendable_session(unsendable)) + return + goodbye = peer.session.create_disconnect(b"session refused a packet") + self._send_rudp_packet(rudp_socket, remote_addr, goodbye) + + def _end_unsendable_peer( + self, + rudp_socket: socket.socket, + peers: dict[tuple[str, int], _RudpPeerConnection], + remote_addr: tuple[str, int], + error: OSError, + ) -> None: + """The session owes its peer a packet that can never be sent as built. It ends, + never the thread, and the peer's goodbye names the error.""" + peer = peers.pop(remote_addr, None) + if peer is None: + return + self._send_rudp_packet(rudp_socket, remote_addr, peer.session.end_unsendable_session(error)) def _handle_connection_message( self, message: dict[str, Any], subscriptions: dict[str, _DatabaseSubscription], + *, + over_rudp: bool = False, ) -> list[dict[str, Any]]: schema_version = message.get("schemaVersion") if schema_version == "cultnet.database_subscribe.v0": @@ -333,7 +546,7 @@ class CultMeshLocalServer: subscriptions.pop(str(message.get("subscriptionId") or ""), None) return [] if schema_version == "cultnet.document_put_raw.v0": - return self._handle_raw_put(message, subscriptions) + return self._handle_raw_put(message, subscriptions, over_rudp=over_rudp) if schema_version == "cultnet.document_delete.v0": return self._handle_raw_delete(message, subscriptions) if schema_version == "cultnet.simulation_observation.v0": @@ -345,6 +558,8 @@ class CultMeshLocalServer: self, message: dict[str, Any], subscriptions: dict[str, _DatabaseSubscription], + *, + over_rudp: bool = False, ) -> list[dict[str, Any]]: document_record = message.get("document") if not isinstance(document_record, dict): @@ -353,7 +568,22 @@ class CultMeshLocalServer: message_id=str(message.get("messageId") or ""), code="malformed_document_put", )] - change = self.node.database.apply_raw_put_message(message) + unservable = self._unservable_put(message, over_rudp=over_rudp) + if unservable is not None: + return [unservable] + try: + change = self.node.database.apply_raw_put_message(message) + except Exception as error: # noqa: BLE001 - a put the store cannot take is that peer's refusal + # The store refused the put: a blank key, a payload its schema cannot decode, a global + # document under another key, or anything a document's own decoder or validator + # raises. It is refused to the peer that sent it; no thread and no other peer is + # affected. Neither the refusal nor the log quotes the error, which can quote the put. + _LOGGER.warning("CultMesh server refused a raw put the store could not take (%s).", type(error).__name__) + return [self._error_response( + "Raw put document could not be stored.", + message_id=str(message.get("messageId") or ""), + code="malformed_document_put", + )] if change is None: return [self._error_response( "Raw put message did not apply to a registered document.", @@ -555,7 +785,7 @@ class CultMeshLocalServer: details={"documentCount": document_count, "maxSnapshotDocuments": self.max_snapshot_documents}, ) if self.max_snapshot_bytes is not None: - response_bytes = len(msgpack.packb(response, use_bin_type=True)) + response_bytes = _snapshot_response_bytes(response) if response_bytes > self.max_snapshot_bytes: return self._error_response( f"Snapshot byte limit exceeded: {response_bytes} > {self.max_snapshot_bytes}.", @@ -565,6 +795,51 @@ class CultMeshLocalServer: ) return response + def _unservable_put(self, message: dict[str, Any], *, over_rudp: bool) -> dict[str, Any] | None: + """The refusal for a put this server could never serve, or None. The document alone, + as a snapshot would serve it under the shortest message id, must fit max_snapshot_bytes; + a put arriving over RUDP must also fit, as fragments of rudp_max_fragment_bytes, in one + message and the peer's reliable queue. A put whose document has no string recordKey or + binary payload could never be stored or served, and is refused as malformed.""" + document_record = message.get("document") + if not ( + isinstance(document_record, dict) + and isinstance(document_record.get("recordKey"), str) + and isinstance(document_record.get("payload"), (bytes, bytearray)) + ): + return self._error_response( + "Raw put documents must carry a string recordKey and a binary payload.", + message_id=str(message.get("messageId") or ""), + code="malformed_document_put", + ) + if self.max_snapshot_bytes is None and not over_rudp: + return None + alone = self.node.database.raw_put_served_alone(message, message_id=_SHORTEST_SERVED_MESSAGE_ID) + if alone is None: + return None + response_bytes = _snapshot_response_bytes(alone) + details: dict[str, Any] = {"responseBytes": response_bytes, "maxSnapshotBytes": self.max_snapshot_bytes} + fits = self.max_snapshot_bytes is None or response_bytes <= self.max_snapshot_bytes + limits = f"limit is {self.max_snapshot_bytes}" + if over_rudp: + fragment_count = max(1, -(-response_bytes // self.rudp_max_fragment_bytes)) + max_fragment_count = self._max_rudp_reply_fragments() + details |= {"fragmentCount": fragment_count, "maxFragmentCount": max_fragment_count} + fits = fits and fragment_count <= max_fragment_count + limits = ( + f"it takes {fragment_count} fragments; limits are " + f"{'unbounded' if self.max_snapshot_bytes is None else self.max_snapshot_bytes} bytes " + f"and {max_fragment_count} fragments" + ) + if fits: + return None + return self._error_response( + f"Document can never be served: its snapshot response is {response_bytes} bytes; {limits}.", + message_id=str(message.get("messageId") or ""), + code="document_unservable", + details=details, + ) + @staticmethod def _error_response( error: str, @@ -719,3 +994,8 @@ def _infer_schema_name(schema_id: str) -> str | None: return None version = schema_id[marker + 2:] return schema_id[:marker] if version.isdigit() else None + + +def _snapshot_response_bytes(response: dict[str, Any]) -> int: + """The one measure of a snapshot response, shared by the snapshot path and put admission.""" + return len(msgpack.packb(response, use_bin_type=True)) diff --git a/packages/cultmesh-py/tests/test_cultmesh.py b/packages/cultmesh-py/tests/test_cultmesh.py index b6a21bb8..cdf2c965 100644 --- a/packages/cultmesh-py/tests/test_cultmesh.py +++ b/packages/cultmesh-py/tests/test_cultmesh.py @@ -1,5 +1,6 @@ from __future__ import annotations +import errno import json import os import socket @@ -14,6 +15,8 @@ from dataclasses import dataclass from datetime import UTC, datetime, timedelta from pathlib import Path from typing import Any, Callable + +import msgpack from cultcache_py import ( CultCache, SingleFileMessagePackBackingStore, @@ -47,16 +50,24 @@ from cultnet_py import ( CultNetSimulationConsensusCandidate, CultNetSimulationObservation, CultNetSimulationObservationHub, + CultNetRudpPacketType, + CultNetRudpSendOptions, + CultNetRudpSession, + CultNetRudpSessionOptions, CultNetRudpSocketMode, CultNetRudpSocketTransportConnection, CultNetRudpSocketTransportOptions, apply_shard_log_response, + create_rudp_schema_transport, + decode_rudp_packet, document_delete, document_put_raw, + encode_rudp_packet, hello, simulation_observation, snapshot_request, ) +from cultnet_py.cultmesh_contracts import VERSE_CATALOG_REQUEST from cultmesh_py import create_node from cultmesh_py import ( CultMesh, @@ -213,6 +224,37 @@ class CultMeshTests(unittest.TestCase): self.assertEqual(received_messages[0]["schemaVersion"], "cultnet.schema_catalog_request.v0") self.assertEqual(received_messages[0]["messageId"], "rudp-transport-factory") + def _rudp_client_bound_host(self, endpoint: str, bind_host: str | None = None) -> str: + client = CultMesh.create_rudp_client("python-cultmesh-bind-client", 0x10203060, endpoint, bind_host=bind_host) + try: + return client.socket.getsockname()[0] + finally: + client.socket.close() + + # A client bound to loopback cannot send to another host on Windows, so a + # client for a remote endpoint binds the unspecified address of its family. + def test_cultmesh_rudp_client_for_a_remote_endpoint_binds_the_unspecified_address(self) -> None: + self.assertEqual(self._rudp_client_bound_host("rudp://10.77.0.1:17872"), "0.0.0.0") + self.assertEqual(self._rudp_client_bound_host("rudp://[2001:db8::1]:17872"), "::") + + def test_cultmesh_rudp_client_for_a_loopback_endpoint_binds_loopback(self) -> None: + self.assertEqual(self._rudp_client_bound_host("rudp://127.0.0.1:17872"), "127.0.0.1") + self.assertEqual(self._rudp_client_bound_host("rudp://[::1]:17872"), "::1") + + def test_cultmesh_rudp_client_binds_an_explicit_bind_host_whatever_the_endpoint(self) -> None: + self.assertEqual(self._rudp_client_bound_host("rudp://10.77.0.1:17872", "127.0.0.1"), "127.0.0.1") + self.assertEqual(self._rudp_client_bound_host("rudp://127.0.0.1:17872", "0.0.0.0"), "0.0.0.0") + + def test_cultmesh_rudp_server_binds_loopback_unless_told_otherwise(self) -> None: + loopback = CultMesh.create_rudp_server("python-cultmesh-bind-server", 0x10203061) + anywhere = CultMesh.create_rudp_server("python-cultmesh-bind-server", 0x10203062, bind_host="0.0.0.0") + try: + self.assertEqual(loopback.socket.getsockname()[0], "127.0.0.1") + self.assertEqual(anywhere.socket.getsockname()[0], "0.0.0.0") + finally: + loopback.socket.close() + anywhere.socket.close() + def test_cultmesh_facade_creates_rudp_client_from_peer_endpoint(self) -> None: connection_id = 0x10203042 server = CultMesh.create_rudp_server( @@ -1759,11 +1801,11 @@ class CultMeshTests(unittest.TestCase): ) self.assertEqual( builtins.list()[0].schema_id, - "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json", + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.transport-profile.schema.json", ) self.assertIsNone(builtins.list()[0].schema_json) peer_exchange_schema_id = ( - "https://github.com/GameCult/cultnet-ts/contracts/cultmesh.peer-exchange-request.schema.json" + "https://github.com/GameCult/CultLib/contracts/cultnet/cultmesh.peer-exchange-request.schema.json" ) filtered_builtin = CultMesh.create_builtin_schema_catalog( include_schema_json=True, @@ -3717,7 +3759,11 @@ class CultMeshTests(unittest.TestCase): finally: self._terminate_process(process) - def test_cultmesh_daemon_enforces_snapshot_document_limit_as_peer_error(self) -> None: + def test_cultmesh_daemon_refuses_a_snapshot_document_limit_of_zero_at_startup(self) -> None: + # A limit of zero is a server that could answer no snapshot, which the Rust document + # server's options also refuse; the daemon passes the flag to the server, and exits with + # a usage error naming the rule instead of serving. The limit's enforcement as a peer error is pinned + # in process by test_cultmesh_local_server_rejects_oversized_snapshot_responses. with tempfile.TemporaryDirectory() as temp: ready_path = Path(temp) / "ready.json" package_src = Path(__file__).resolve().parents[1] / "src" @@ -3728,7 +3774,7 @@ class CultMeshTests(unittest.TestCase): if not existing_pythonpath else f"{package_src}{os.pathsep}{existing_pythonpath}" ) - process = subprocess.Popen( + completed = subprocess.run( [ sys.executable, "-m", @@ -3743,25 +3789,27 @@ class CultMeshTests(unittest.TestCase): "--ready-file", str(ready_path), ], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, + capture_output=True, text=True, env=env, + timeout=30, ) - try: - ready = self._wait_for_ready_file(process, ready_path) - self.assertEqual(ready["snapshotLimits"], {"maxSnapshotBytes": None, "maxSnapshotDocuments": 0}) - client = CultMesh.create_client("127.0.0.1", int(ready["port"]), timeout_seconds=2.0) - - with self.assertRaisesRegex(CultNetPeerError, "Snapshot document limit exceeded") as raised: - client.fetch_snapshot_response(schema_ids=["cultcache.interop-note"]) - - self.assertEqual(raised.exception.response["schemaVersion"], "cultnet.error.v0") - self.assertEqual(raised.exception.response["code"], "snapshot_document_limit_exceeded") - self.assertEqual(raised.exception.response["details"]["documentCount"], 1) - self.assertEqual(raised.exception.response["details"]["maxSnapshotDocuments"], 0) - finally: - self._terminate_process(process) + # A usage error from argparse: exit status 2, the rule named, no traceback. + self.assertEqual(completed.returncode, 2, completed.stderr) + self.assertIn("error: max_snapshot_documents must be greater than zero", completed.stderr) + self.assertNotIn("Traceback", completed.stderr) + self.assertFalse(ready_path.exists()) + # A port no socket can bind is a usage error too. + completed = subprocess.run( + [sys.executable, "-m", "cultmesh_py.daemon", "--port", "99999"], + capture_output=True, + text=True, + env=env, + timeout=30, + ) + self.assertEqual(completed.returncode, 2, completed.stderr) + self.assertIn("port must be between 0 and 65535", completed.stderr) + self.assertNotIn("Traceback", completed.stderr) def test_cultmesh_daemon_serves_opt_in_simulation_observations(self) -> None: with tempfile.TemporaryDirectory() as temp: @@ -4033,7 +4081,7 @@ class CultMeshTests(unittest.TestCase): self.assertIn("cultmesh.peer_exchange_response.v0", wire_descriptors) self.assertIn("cultnet.error.v0", {descriptor.schema_version for descriptor in synced_wire_descriptors}) self.assertIn("cultnet.document_put_raw.v0", {descriptor.schema_version for descriptor in synced_wire_descriptors}) - self.assertIsNotNone(synced_schema_catalog.get("https://github.com/GameCult/cultnet-ts/contracts/cultnet.document-put-raw.schema.json")) + self.assertIsNotNone(synced_schema_catalog.get("https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.document-put-raw.schema.json")) self.assertEqual(snapshot_response["documents"][0]["recordKey"], "note:1") self.assertEqual(typed_snapshot_response.documents[0].record_key, "note:1") self.assertEqual(typed_snapshot_response.documents[0].schema_id, "mesh.server_note.v1") @@ -4293,6 +4341,638 @@ class CultMeshTests(unittest.TestCase): self.assertEqual(error["details"]["documentCount"], 2) self.assertEqual(error["details"]["maxSnapshotDocuments"], 1) + def test_cultmesh_local_server_refuses_a_put_it_could_never_serve(self) -> None: + # A put is admitted only if some snapshot request could return it. The put arrives under a + # long foreign schema alias and is stored and served under the shorter local schema id, so + # the size that decides is the served one, not the put's own. + document = define_database_entry_type( + "mesh.served_bound_note", + [("schema_version", 0), ("body", 1)], + schema_id="sha256:mesh-served-bound", + schema_name="mesh.served_bound_note", + schema_version="mesh.served_bound_note.v1", + ) + + def put(message_id: str, key: str, body_length: int) -> dict[str, Any]: + return document_put_raw( + message_id=message_id, + key=key, + schema_id="runtime.generated.mesh.served_bound_note.ui.99", + stored_at="2026-09-30T00:00:00Z", + payload=document.encode_payload({ + "schema_version": "mesh.served_bound_note.v1", + "body": "x" * body_length, + }), + ).to_wire() + + def exchange(server: Any, *messages: dict[str, Any]) -> tuple[dict[str, Any], bytes]: + client = CultMesh.create_client("127.0.0.1", server.port, timeout_seconds=2.0) + with client.open_transport() as transport: + for message in messages: + transport.send("schema", msgpack.packb(message, use_bin_type=True)) + payload = transport.receive().payload + return msgpack.unpackb(payload, raw=False), payload + + empty_id_snapshot = snapshot_request(message_id="").to_wire() + + # The bound is what the server actually serves for the at-bound document alone, under the + # shortest message id it answers (an empty one), measured on an unbounded server. + def served_alone_bytes(key: str, body_length: int) -> int: + node = CultMesh.create_node(runtime_id="mesh-served-bound-probe") + node.database.register_document(document) + server = CultMesh.serve_node(node, enable_rudp=False) + try: + response, payload = exchange(server, put("probe", key, body_length), empty_id_snapshot) + finally: + server.stop() + self.assertEqual(response["schemaVersion"], "cultnet.snapshot_response_raw.v0") + self.assertEqual(len(response["documents"]), 1) + return len(payload) + + limit = served_alone_bytes("note:fits", 100) + self.assertEqual(served_alone_bytes("note:over", 101), limit + 1, "fixture: the documents must straddle the bound by one byte") + + node = CultMesh.create_node(runtime_id="mesh-served-bound") + node.database.register_document(document) + server = CultMesh.serve_node(node, max_snapshot_bytes=limit, enable_rudp=False) + try: + refused, _ = exchange(server, put("put-over", "note:over", 101)) + stored_after_refusal = node.database.get(document, "note:over") + served, served_payload = exchange(server, put("put-at", "note:fits", 100), empty_id_snapshot) + finally: + server.stop() + + self.assertEqual(refused["schemaVersion"], "cultnet.error.v0") + self.assertEqual(refused["messageId"], "put-over") + self.assertEqual(refused["code"], "document_unservable") + self.assertEqual(refused["details"], {"responseBytes": limit + 1, "maxSnapshotBytes": limit}) + self.assertIn(str(limit + 1), refused["error"]) + self.assertIn(str(limit), refused["error"]) + self.assertIsNone(stored_after_refusal) + + self.assertEqual(served["schemaVersion"], "cultnet.snapshot_response_raw.v0") + self.assertEqual([record["recordKey"] for record in served["documents"]], ["note:fits"]) + self.assertEqual(served["documents"][0]["schemaId"], document.catalog_entry().schema_id) + self.assertEqual(len(served_payload), limit) + + def _rudp_bound_note(self) -> Any: + return define_database_entry_type( + "mesh.rudp_bound_note", + [("schema_version", 0), ("body", 1)], + schema_id="sha256:mesh-rudp-bound", + schema_name="mesh.rudp_bound_note", + schema_version="mesh.rudp_bound_note.v1", + ) + + @staticmethod + def _rudp_note_put(document: Any, message_id: str, key: str, body_length: int) -> dict[str, Any]: + return document_put_raw( + message_id=message_id, + key=key, + schema_id=document.catalog_entry().schema_id, + stored_at="2026-09-30T00:00:00Z", + payload=document.encode_payload({"schema_version": "mesh.rudp_bound_note.v1", "body": "x" * body_length}), + ).to_wire() + + @staticmethod + def _rudp_exchange(server: Any, *messages: dict[str, Any]) -> tuple[dict[str, Any], bytes]: + """Sends each message over RUDP in 1200-byte fragments; returns the first reply.""" + transport = create_rudp_schema_transport( + host="127.0.0.1", + port=server.port, + connection_id=server.rudp_connection_id, + timeout_seconds=4.0, + max_fragment_bytes=1200, + ) + try: + for message in messages: + transport.send("schema", msgpack.packb(message, use_bin_type=True)) + payload = transport.receive(timeout_seconds=4.0).payload + finally: + transport.close() + return msgpack.unpackb(payload, raw=False), payload + + def test_cultmesh_local_server_serves_a_100_kb_put_over_rudp_in_fragments(self) -> None: + # The reply is larger than any one UDP datagram: it arrives only because it is sent + # in fragments, and the RUDP thread serves on afterwards. + document = self._rudp_bound_note() + node = CultMesh.create_node(runtime_id="mesh-rudp-large") + node.database.register_document(document) + server = CultMesh.serve_node(node) + try: + served, payload = self._rudp_exchange( + server, + self._rudp_note_put(document, "put-large", "note:large", 100_000), + snapshot_request(message_id="large").to_wire(), + ) + again, _ = self._rudp_exchange(server, snapshot_request(message_id="again").to_wire()) + alive = server._rudp_thread is not None and server._rudp_thread.is_alive() + finally: + server.stop() + self.assertEqual(served["schemaVersion"], "cultnet.snapshot_response_raw.v0") + self.assertEqual([record["recordKey"] for record in served["documents"]], ["note:large"]) + self.assertGreater(len(served["documents"][0]["payload"]), 100_000) + self.assertGreater(len(payload), 65_507, "fixture: the reply cannot be one UDP datagram") + self.assertEqual(again["messageId"], "again") + self.assertTrue(alive) + self.assertEqual(server.rudp_send_failures, 0) + + def _rudp_body_for(self, document: Any, key: str) -> Callable[[int], int]: + """The body length whose document, keyed `key`, is served alone under the empty message + id in exactly the given bytes, measured on an unbounded server: what a snapshot sends.""" + + def served_alone_bytes(body_length: int) -> int: + node = CultMesh.create_node(runtime_id="mesh-rudp-bound-probe") + node.database.register_document(document) + server = CultMesh.serve_node(node) + try: + _, payload = self._rudp_exchange( + server, self._rudp_note_put(document, "probe", key, body_length), + snapshot_request(message_id="").to_wire(), + ) + finally: + server.stop() + return len(payload) + + probe = served_alone_bytes(500) + + def body_for(served_bytes: int) -> int: + body_length = 500 + served_bytes - probe + self.assertEqual(served_alone_bytes(body_length), served_bytes, "fixture: served size is linear in the body") + return body_length + + return body_for + + def test_cultmesh_local_server_refuses_a_rudp_put_whose_reply_would_overflow_the_reliable_queue(self) -> None: + # Replies go in fragments of 100 bytes and a peer's reliable queue holds 8: a put over RUDP + # whose served reply takes 8 fragments is admitted and served, 9 or 20 are refused. A + # snapshot of two such documents needs 16 and cannot be queued: the peer is answered with a + # small cultnet.error.v0 rather than left to time out, its session ends, and the thread + # serves on. + document = self._rudp_bound_note() + body_for = self._rudp_body_for(document, "note:q") + + node = CultMesh.create_node(runtime_id="mesh-rudp-bound") + node.database.register_document(document) + server = CultMesh.serve_node(node, rudp_max_fragment_bytes=100, rudp_max_pending_reliable_packets=8) + try: + refusals = [ + self._rudp_exchange(server, self._rudp_note_put(document, f"put-{served}", "note:q", body_for(served)))[0] + for served in (2000, 801) + ] + stored_after_refusals = node.database.get(document, "note:q") + served, served_payload = self._rudp_exchange( + server, + self._rudp_note_put(document, "put-at", "note:q", body_for(800)), + snapshot_request(message_id="").to_wire(), + ) + unqueueable, _ = self._rudp_exchange( + server, + self._rudp_note_put(document, "put-r", "note:r", body_for(800)), + snapshot_request(message_id="both").to_wire(), + ) + failures_after = server.rudp_send_failures + # An empty snapshot fits the small queue; a hello reply would not. + after_reply, _ = self._rudp_exchange( + server, snapshot_request(message_id="after-queue", record_keys=["note:none"]).to_wire() + ) + alive = server._rudp_thread is not None and server._rudp_thread.is_alive() + finally: + server.stop() + + for refusal, (served_bytes, fragments) in zip(refusals, ((2000, 20), (801, 9))): + self.assertEqual(refusal["schemaVersion"], "cultnet.error.v0") + self.assertEqual(refusal["messageId"], f"put-{served_bytes}") + self.assertEqual(refusal["code"], "document_unservable") + self.assertEqual(refusal["details"], { + "responseBytes": served_bytes, + "maxSnapshotBytes": None, + "fragmentCount": fragments, + "maxFragmentCount": 8, + }) + self.assertIn(f"{served_bytes} bytes; it takes {fragments} fragments", refusal["error"]) + self.assertNotIn("note:q", refusal["error"]) + self.assertIsNone(stored_after_refusals) + self.assertEqual(served["schemaVersion"], "cultnet.snapshot_response_raw.v0") + self.assertEqual([record["recordKey"] for record in served["documents"]], ["note:q"]) + self.assertEqual(len(served_payload), 800) + self.assertEqual(unqueueable["schemaVersion"], "cultnet.error.v0") + self.assertEqual(unqueueable["messageId"], "both") + self.assertEqual(unqueueable["code"], "response_unqueueable") + self.assertEqual(failures_after, 0) + self.assertEqual(after_reply["messageId"], "after-queue") + self.assertTrue(alive) + + class _RawPeer: + """A peer driven packet by packet, so a test decides what it acknowledges: nothing.""" + + def __init__(self, server: Any) -> None: + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.sock.bind(("127.0.0.1", 0)) + self.sock.settimeout(0.05) + self.address = self.sock.getsockname()[:2] + self.target = ("127.0.0.1", server.port) + self.session = CultNetRudpSession( + CultNetRudpSessionOptions( + connection_id=server.rudp_connection_id, initial_sequence=100, resend_delay_ms=100_000 + ) + ) + self.sock.sendto(encode_rudp_packet(self.session.create_connect(0)), self.target) + accept = self.receive(1.0) + assert accept is not None and accept.packet_type == CultNetRudpPacketType.ACCEPT, accept + self.session.receive(accept, 1) + + def receive(self, timeout: float = 0.3) -> Any: + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + try: + wire, _ = self.sock.recvfrom(65535) + except (TimeoutError, socket.timeout): + continue + return decode_rudp_packet(wire) + return None + + def drain(self, timeout: float = 0.5) -> list[Any]: + # Bounded overall: the server resends what the peer never acknowledges. + packets = [] + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + packet = self.receive(0.05) + if packet is not None: + packets.append(packet) + return packets + + def send(self, message: dict[str, Any]) -> list[int]: + packets = self.session.send_many( + "schema", + msgpack.packb(message, use_bin_type=True), + CultNetRudpSendOptions(reliable=True, ordered=True, now_ms=2), + max_fragment_bytes=1200, + ) + for packet in packets: + self.sock.sendto(encode_rudp_packet(packet), self.target) + return [packet.sequence for packet in packets] + + def close(self) -> None: + self.sock.close() + + @staticmethod + def _acknowledges(packet: Any, sequence: int) -> bool: + return packet.ack == sequence or any( + packet.ack_mask & (1 << bit) and packet.ack > bit and packet.ack - bit - 1 == sequence + for bit in range(32) + ) + + def _brim_server(self) -> tuple[Any, Any]: + """A server whose peer's reliable queue (8) is filled exactly by an 8-fragment reply the + peer never acknowledges, and the peer.""" + document = self._rudp_bound_note() + node = CultMesh.create_node(runtime_id="mesh-rudp-brim") + node.database.register_document(document) + server = CultMesh.serve_node(node, rudp_max_fragment_bytes=100, rudp_max_pending_reliable_packets=8) + + def served(body: int) -> int: + put = self._rudp_note_put(document, "p", "note:q", body) + return len(msgpack.packb(node.database.raw_put_served_alone(put, message_id=""), use_bin_type=True)) + + body = 400 + 800 - served(400) + self.assertEqual(served(body), 800, "fixture: served size is linear in the body") + node.database.apply_raw_put_message(self._rudp_note_put(document, "p", "note:q", body)) + peer = self._RawPeer(server) + peer.send(snapshot_request(message_id="", record_keys=["note:q"]).to_wire()) + first = {p.sequence for p in peer.drain(0.3) if p.packet_type == CultNetRudpPacketType.DATA} + self.assertEqual(len(first), 8, "fixture: the first reply fills the queue exactly") + return server, peer + + def test_cultmesh_local_server_answers_a_peer_whose_queue_is_full_to_the_brim(self) -> None: + # The next reply cannot be queued. The peer is answered with a cultnet.error.v0 that takes + # no room in the full queue and acknowledges nothing the peer sent, then its session ends. + server, peer = self._brim_server() + try: + refused = peer.send(snapshot_request(message_id="b", record_keys=["note:none"]).to_wire()) + packets = peer.drain(0.5) + alive = server._rudp_thread is not None and server._rudp_thread.is_alive() + finally: + peer.close() + server.stop() + parts = sorted( + ( + p for p in packets + if p.packet_type == CultNetRudpPacketType.DATA and p.channel_id == "schema" and not p.reliable + ), + key=lambda p: p.fragment_index, + ) + self.assertTrue(parts, "the refusal reaches the peer") + for part in parts: + self.assertFalse( + any(self._acknowledges(part, sequence) for sequence in refused), + f"the refusal acknowledges the refused request: ack={part.ack} mask={part.ack_mask:#x}", + ) + refusal = msgpack.unpackb(b"".join(bytes(p.payload) for p in parts), raw=False) + self.assertEqual(refusal["schemaVersion"], "cultnet.error.v0") + self.assertEqual(refusal["messageId"], "b") + self.assertEqual(refusal["code"], "response_unqueueable") + goodbyes = [bytes(p.payload) for p in packets if p.packet_type == CultNetRudpPacketType.DISCONNECT] + self.assertEqual(goodbyes, [b"session refused a packet"], "then the session ends") + self.assertTrue(alive) + + def test_cultmesh_local_server_names_a_refusal_that_can_never_be_sent_in_the_goodbye(self) -> None: + # The refusal's own fragment fails permanently: the failure is not dropped, the goodbye + # names it by its fixed code, never the error's text. + import errno + + server, peer = self._brim_server() + original_sendto = socket.socket.sendto + + def sendto(sock: socket.socket, data: bytes, *args: Any) -> int: + packet = decode_rudp_packet(data) + if ( + args and tuple(args[-1]) == tuple(peer.address) + and packet.packet_type == CultNetRudpPacketType.DATA and not packet.reliable + ): + raise OSError(errno.EMSGSIZE, "Message too long CANARY-7f3a") + return original_sendto(sock, data, *args) + + try: + with patch.object(socket.socket, "sendto", sendto): + peer.send(snapshot_request(message_id="b", record_keys=["note:none"]).to_wire()) + packets = peer.drain(0.5) + alive = server._rudp_thread is not None and server._rudp_thread.is_alive() + finally: + peer.close() + server.stop() + self.assertFalse( + [p for p in packets if p.packet_type == CultNetRudpPacketType.DATA and not p.reliable], + "the refusal could not be sent", + ) + goodbyes = [bytes(p.payload) for p in packets if p.packet_type == CultNetRudpPacketType.DISCONNECT] + self.assertEqual(goodbyes, [b"packet could not be sent: EMSGSIZE"]) + self.assertTrue(alive) + + def test_cultmesh_local_server_refuses_a_tcp_message_it_cannot_handle_and_serves_on(self) -> None: + # Messages whose handling raises: the TCP peer is refused with fixed text, the log names + # the error type only, and the connection's thread serves its next message. + shapes = [ + {"schemaVersion": "cultnet.snapshot_request.v0", "messageId": "snapshot", "recordKeys": 5}, + {"schemaVersion": "cultnet.shard_log_request.v0", "messageId": "shard-log", "shardId": "a", "afterSequence": "CANARY-7f3a"}, + {"schemaVersion": "cultnet.database_subscribe.v0", "messageId": "subscribe", "subscriptionId": "s", "schemaIds": 5}, + {"schemaVersion": "cultnet.schema_catalog_request.v0", "messageId": "catalog", "schemaIds": 5}, + {"schemaVersion": VERSE_CATALOG_REQUEST, "messageId": "verse", "verseIds": 5}, + ] + deaths: list[str] = [] + original_hook = threading.excepthook + threading.excepthook = lambda args: deaths.append(f"{args.exc_type.__name__}") + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-tcp-shapes")) + try: + with self.assertLogs("cultmesh_py.server", level="WARNING") as logs: + with CultMesh.create_client("127.0.0.1", server.port, timeout_seconds=4.0).open_transport() as transport: + refusals = [] + for shape in shapes: + transport.send("schema", msgpack.packb(shape, use_bin_type=True)) + refusals.append((shape["messageId"], msgpack.unpackb(transport.receive().payload, raw=False))) + transport.send("schema", msgpack.packb(hello(runtime_id="same-connection").to_wire(), use_bin_type=True)) + after = msgpack.unpackb(transport.receive().payload, raw=False) + finally: + server.stop() + threading.excepthook = original_hook + for message_id, refusal in refusals: + self.assertEqual(refusal["schemaVersion"], "cultnet.error.v0", message_id) + self.assertEqual(refusal["messageId"], message_id) + self.assertEqual(refusal["code"], "message_unhandled", message_id) + self.assertEqual(refusal["error"], "The message could not be handled.", message_id) + self.assertEqual(after["schemaVersion"], "cultnet.hello.v0") + self.assertEqual(deaths, []) + self.assertEqual(len(logs.output), len(shapes)) + self.assertFalse([line for line in logs.output if "CANARY" in line]) + + def test_cultmesh_local_server_refuses_a_rudp_put_whose_reply_needs_more_than_65535_fragments(self) -> None: + # One message carries at most 65535 fragments, however deep the queue: with one-byte + # fragments a put served in 65536 bytes is refused, one served in 65535 is stored. + document = self._rudp_bound_note() + body_for = self._rudp_body_for(document, "note:w") + node = CultMesh.create_node(runtime_id="mesh-rudp-wide") + node.database.register_document(document) + server = CultMesh.serve_node(node, rudp_max_fragment_bytes=1) + try: + transport = create_rudp_schema_transport( + host="127.0.0.1", port=server.port, connection_id=server.rudp_connection_id, + timeout_seconds=4.0, max_fragment_bytes=1200, + ) + try: + transport.send("schema", msgpack.packb(self._rudp_note_put(document, "put-over", "note:w", body_for(65_536)), use_bin_type=True)) + refusal = msgpack.unpackb(transport.receive(timeout_seconds=8.0).payload, raw=False) + transport.send("schema", msgpack.packb(self._rudp_note_put(document, "put-at", "note:w", body_for(65_535)), use_bin_type=True)) + deadline = time.monotonic() + 4.0 + while node.database.get(document, "note:w") is None and time.monotonic() < deadline: + transport.receive_once() + time.sleep(0.005) + finally: + transport.close() + stored = node.database.get(document, "note:w") + finally: + server.stop() + self.assertEqual(refusal["code"], "document_unservable") + self.assertEqual(refusal["details"]["fragmentCount"], 65_536) + self.assertEqual(refusal["details"]["maxFragmentCount"], 65_535) + self.assertIsNotNone(stored) + + def test_cultmesh_local_server_rudp_thread_survives_a_datagram_that_cannot_leave(self) -> None: + # Fragments larger than any UDP datagram: the reply's one packet can never be sent as + # built. That is a permanent failure: it ends that peer's session and is not counted as + # a lost datagram; the thread serves the next peer. + document = self._rudp_bound_note() + node = CultMesh.create_node(runtime_id="mesh-rudp-emsgsize") + node.database.register_document(document) + server = CultMesh.serve_node(node, rudp_max_fragment_bytes=200_000) + try: + transport = create_rudp_schema_transport( + host="127.0.0.1", port=server.port, connection_id=server.rudp_connection_id, + timeout_seconds=4.0, max_fragment_bytes=1200, + ) + try: + transport.send("schema", msgpack.packb(self._rudp_note_put(document, "put-large", "note:big", 80_000), use_bin_type=True)) + transport.send("schema", msgpack.packb(snapshot_request(message_id="big").to_wire(), use_bin_type=True)) + deadline = time.monotonic() + 1.0 + while time.monotonic() < deadline: + try: + transport.receive_once() + except ConnectionError: + break + time.sleep(0.005) + finally: + transport.close() + failures = server.rudp_send_failures + hello_reply, _ = self._rudp_exchange(server, hello(runtime_id="after").to_wire()) + alive = server._rudp_thread is not None and server._rudp_thread.is_alive() + finally: + server.stop() + self.assertEqual(failures, 0) + self.assertEqual(hello_reply["schemaVersion"], "cultnet.hello.v0") + self.assertTrue(alive) + + def test_cultmesh_local_server_refuses_a_malformed_put_over_rudp_and_serves_on(self) -> None: + # A put whose document has no string recordKey or no binary payload could never be stored + # or served: it is refused as malformed before any sizing reads it, and the RUDP thread + # serves the next peer. + document = self._rudp_bound_note() + node = CultMesh.create_node(runtime_id="mesh-rudp-malformed") + node.database.register_document(document) + server = CultMesh.serve_node(node) + try: + refusals = [] + for field_name, value in ( + ("recordKey", None), + ("recordKey", 5), + ("payload", None), + ("payload", "not binary"), + ): + put = self._rudp_note_put(document, f"bad-{field_name}-{value}", "note:bad", 10) + if value is None: + del put["document"][field_name] + else: + put["document"][field_name] = value + refusal, _ = self._rudp_exchange(server, put) + refusals.append((put["messageId"], refusal)) + after, _ = self._rudp_exchange(server, snapshot_request(message_id="after").to_wire()) + alive = server._rudp_thread is not None and server._rudp_thread.is_alive() + finally: + server.stop() + for message_id, refusal in refusals: + self.assertEqual(refusal["schemaVersion"], "cultnet.error.v0", message_id) + self.assertEqual(refusal["messageId"], message_id) + self.assertEqual(refusal["code"], "malformed_document_put", message_id) + self.assertEqual(after["messageId"], "after") + self.assertEqual(after["documents"], []) + self.assertTrue(alive) + + def test_cultmesh_local_server_refuses_a_put_its_store_cannot_take_and_serves_on(self) -> None: + # Well-formed puts the store refuses: a blank key, a payload that is not MessagePack, a + # payload its schema cannot decode, a global document under another key. Each is refused + # to the peer that sent it, over RUDP and over TCP; the RUDP thread lives, the TCP + # connection serves its next message, and other peers are served. + document = self._rudp_bound_note() + global_document = define_database_entry_type( + "mesh.rudp_global_note", + [("schema_version", 0), ("body", 1)], + schema_id="sha256:mesh-rudp-global", + schema_name="mesh.rudp_global_note", + schema_version="mesh.rudp_global_note.v1", + global_document=True, + ) + + def cases() -> list[dict[str, Any]]: + puts = [] + for name, field_name, value in ( + ("empty-key", "recordKey", ""), + ("blank-key", "recordKey", " "), + ("garbage-payload", "payload", bytes([0xC1])), + ("int-payload", "payload", msgpack.packb(5)), + ): + put = self._rudp_note_put(document, name, "note:ok", 10) + put["document"][field_name] = value + puts.append(put) + puts.append(self._rudp_note_put(global_document, "global-wrong-key", "not-global", 10)) + return puts + + node = CultMesh.create_node(runtime_id="mesh-unstorable-put") + node.database.register_document(document) + node.database.register_document(global_document) + server = CultMesh.serve_node(node) + try: + rudp_refusals = [(put["messageId"], self._rudp_exchange(server, put)[0]) for put in cases()] + rudp_after, _ = self._rudp_exchange(server, hello(runtime_id="rudp-after").to_wire()) + rudp_alive = server._rudp_thread is not None and server._rudp_thread.is_alive() + + tcp_refusals = [] + with CultMesh.create_client("127.0.0.1", server.port, timeout_seconds=4.0).open_transport() as transport: + for put in cases(): + transport.send("schema", msgpack.packb(put, use_bin_type=True)) + tcp_refusals.append((put["messageId"], msgpack.unpackb(transport.receive().payload, raw=False))) + transport.send("schema", msgpack.packb(hello(runtime_id="same-connection").to_wire(), use_bin_type=True)) + same_connection = msgpack.unpackb(transport.receive().payload, raw=False) + other_connection = CultMesh.create_client("127.0.0.1", server.port, timeout_seconds=4.0).request( + hello(runtime_id="other-connection").to_wire(), expected_schema_version="cultnet.hello.v0" + ) + finally: + server.stop() + self.assertEqual(len(rudp_refusals), 5) + for message_id, refusal in rudp_refusals + tcp_refusals: + self.assertEqual(refusal["schemaVersion"], "cultnet.error.v0", message_id) + self.assertEqual(refusal["messageId"], message_id) + self.assertEqual(refusal["code"], "malformed_document_put", message_id) + self.assertNotIn("note:ok", refusal["error"], message_id) + self.assertEqual(len(tcp_refusals), 5) + self.assertEqual(rudp_after["schemaVersion"], "cultnet.hello.v0") + self.assertTrue(rudp_alive) + self.assertEqual(same_connection["schemaVersion"], "cultnet.hello.v0") + self.assertEqual(other_connection["schemaVersion"], "cultnet.hello.v0") + self.assertIsNone(node.database.get(document, "note:ok")) + + def test_cultmesh_local_server_refuses_options_that_could_answer_nothing(self) -> None: + # The Rust document server's option rules: every limit is greater than zero, and the limits + # leave room for an empty snapshot, the smallest response the server sends. One-byte + # fragments and a queue of 16 could never carry one, so no reply would ever be sent. + node = CultMesh.create_node(runtime_id="mesh-rudp-options") + probe = CultMesh.serve_node(node) + try: + _, empty_payload = self._rudp_exchange(probe, snapshot_request(message_id="").to_wire()) + finally: + probe.stop() + empty = len(empty_payload) + self.assertGreater(empty, 16, "fixture: an empty snapshot takes more than 16 one-byte fragments") + self.assertNotEqual(empty % (empty - 1), 0, "fixture: empty - 1 byte fragments leave a remainder") + + def refused(**options: Any) -> str: + server = None + try: + with self.assertRaises(ValueError, msg=str(options)) as raised: + server = CultMesh.serve_node(node, **options) + finally: + if server is not None: + server.stop() + return str(raised.exception) + + def accepted(**options: Any) -> None: + CultMesh.serve_node(node, **options).stop() + + carry = "cannot carry an empty snapshot response" + self.assertIn(carry, refused(rudp_max_fragment_bytes=1, rudp_max_pending_reliable_packets=16)) + self.assertIn(carry, refused(rudp_max_fragment_bytes=1, rudp_max_pending_reliable_packets=empty - 1)) + accepted(rudp_max_fragment_bytes=1, rudp_max_pending_reliable_packets=empty) + # Fragments are counted rounding up: empty - 1 bytes a fragment takes two. + self.assertIn(carry, refused(rudp_max_fragment_bytes=empty - 1, rudp_max_pending_reliable_packets=1)) + accepted(rudp_max_fragment_bytes=empty - 1, rudp_max_pending_reliable_packets=2) + self.assertIn("cannot hold an empty snapshot response", refused(max_snapshot_bytes=empty - 1)) + accepted(max_snapshot_bytes=empty) + self.assertIn("greater than zero", refused(max_snapshot_bytes=0)) + self.assertIn("greater than zero", refused(max_snapshot_documents=0)) + accepted(max_snapshot_documents=1) + self.assertIn("greater than zero", refused(rudp_resend_delay_ms=0)) + accepted(rudp_resend_delay_ms=1) + self.assertIn("greater than zero", refused(rudp_max_fragment_bytes=0)) + self.assertIn("greater than zero", refused(rudp_max_pending_reliable_packets=0)) + # The RUDP options configure only the RUDP server: without one, none of them is checked. + accepted(enable_rudp=False, rudp_max_fragment_bytes=1, rudp_max_pending_reliable_packets=16) + accepted( + enable_rudp=False, + rudp_max_fragment_bytes=0, + rudp_max_pending_reliable_packets=0, + rudp_resend_delay_ms=0, + ) + self.assertIn("greater than zero", refused(enable_rudp=False, max_snapshot_documents=0)) + self.assertIn("cannot hold an empty snapshot response", refused(enable_rudp=False, max_snapshot_bytes=empty - 1)) + + # The configuration at the bound does answer: an empty snapshot in one-byte fragments, + # exactly as many as the queue holds. + server = CultMesh.serve_node(node, rudp_max_fragment_bytes=1, rudp_max_pending_reliable_packets=empty) + try: + served, payload = self._rudp_exchange(server, snapshot_request(message_id="").to_wire()) + finally: + server.stop() + self.assertEqual(served["documents"], []) + self.assertEqual(len(payload), empty) + self.assertEqual(server.rudp_send_failures, 0) + def test_cultmesh_local_server_returns_errors_for_bad_requests(self) -> None: document = define_database_entry_type( "mesh.error_note", @@ -4317,6 +4997,14 @@ class CultMeshTests(unittest.TestCase): {"schemaVersion": "cultnet.document_delete.v0", "messageId": "bad-delete", "schemaId": "mesh.error_note.v1"}, expected_schema_version="cultnet.error.v0", ) + # R-2, owed by Cut 1 (docs/cultnet-selection-cut.md, section 9): this v0-only Mesh server + # refuses a cultnet.selection.v1 carrier message through the same delegating path + # (_handle_connection_message -> handle_message) as any other unsupported schema, not a + # silent empty response. + unsupported_v1 = raw_client.request( + {"schemaVersion": "cultnet.snapshot_request.v1", "messageId": "bad-v1-selection"}, + expected_schema_version="cultnet.error.v0", + ) finally: server.stop() @@ -4328,6 +5016,9 @@ class CultMeshTests(unittest.TestCase): self.assertEqual(malformed_put["code"], "malformed_document_put") self.assertEqual(malformed_delete["messageId"], "bad-delete") self.assertEqual(malformed_delete["code"], "malformed_document_delete") + self.assertEqual(unsupported_v1["messageId"], "bad-v1-selection") + self.assertEqual(unsupported_v1["code"], "unsupported_schema_version") + self.assertEqual(unsupported_v1["details"]["schemaVersion"], "cultnet.snapshot_request.v1") def test_cultmesh_authority_lease_requires_live_matching_lease(self) -> None: peer = CultMeshPeerCard( @@ -4487,5 +5178,459 @@ class CultMeshTests(unittest.TestCase): self.assertEqual(streams.latest_frame("mimir:kiyo-pro").sequence, 42) +class CultMeshRudpSendFailureTests(unittest.TestCase): + """One peer whose datagrams cannot be sent must not stop the RUDP thread + serving the others.""" + + def _client(self, server: Any, name: str) -> tuple[CultNetRudpSocketTransportConnection, tuple[str, int]]: + sock = bind_udp_socket() + client = CultNetRudpSocketTransportConnection( + CultNetRudpSocketTransportOptions( + runtime_id=name, + socket=sock, + mode=CultNetRudpSocketMode.CLIENT, + connection_id=server.rudp_connection_id, + remote_addr=("127.0.0.1", server.port), + resend_delay_ms=25, + ) + ) + client.connect(b"join") + for _ in range(200): + client.receive_once() + if client.connected: + break + self.assertTrue(client.connected) + return client, sock.getsockname()[:2] + + def test_a_failed_send_to_one_peer_does_not_kill_the_rudp_thread(self) -> None: + import msgpack # type: ignore + + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + original_sendto = socket.socket.sendto + try: + x, x_addr = self._client(server, "peer-x") + y, _ = self._client(server, "peer-y") + + def sendto(sock: socket.socket, data: bytes, *args: Any) -> int: + if args and tuple(args[-1]) == tuple(x_addr): + raise OSError("injected send failure") + return original_sendto(sock, data, *args) + + request = hello(runtime_id="probe").to_bytes() + with patch.object(socket.socket, "sendto", sendto): + # The server's reply and ack to X both fail to send. + x.send("schema", request) + self._wait_for(lambda: server.rudp_send_failures > 0) + self.assertTrue(server._rudp_thread.is_alive()) + + y.send("schema", request) + response = None + for _ in range(200): + response = y.receive_once() + if response is not None: + break + time.sleep(0.005) + + self.assertIsNotNone(response, "Y is still served after X's send failed") + self.assertEqual(msgpack.unpackb(response.payload, raw=False)["runtimeId"], "mesh-server") + self.assertTrue(server._rudp_thread.is_alive()) + self.assertGreater(server.rudp_send_failures, 0) + finally: + server.stop() + + def _served(self, y: CultNetRudpSocketTransportConnection) -> Any: + import msgpack # type: ignore + + y.send("schema", hello(runtime_id="probe").to_bytes()) + for _ in range(200): + response = y.receive_once() + if response is not None: + return msgpack.unpackb(response.payload, raw=False) + time.sleep(0.005) + return None + + def test_a_vanished_peer_does_not_kill_the_rudp_thread(self) -> None: + # On Windows the closed port of a peer that went away is reported as + # ConnectionResetError (WinError 10054) by the next receive. It can only fail there. + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + try: + x, _ = self._client(server, "peer-x") + y, _ = self._client(server, "peer-y") + x.send("schema", hello(runtime_id="probe").to_bytes()) + x.socket.close() + time.sleep(1.0) # the server's reply and resends to X draw ICMP port-unreachable + + self.assertTrue(server._rudp_thread.is_alive()) + served = self._served(y) + self.assertIsNotNone(served, "Y is still served after X vanished") + self.assertEqual(served["runtimeId"], "mesh-server") + finally: + server.stop() + + def test_a_reset_reported_by_a_receive_is_idle_not_the_end_of_the_thread(self) -> None: + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + original_recvfrom = socket.socket.recvfrom + resets = [3] + try: + y, _ = self._client(server, "peer-y") + + def recvfrom(sock: socket.socket, *args: Any) -> Any: + if sock is server._rudp_socket and resets[0] > 0: + resets[0] -= 1 + raise ConnectionResetError(errno.ECONNRESET, "injected reset") + return original_recvfrom(sock, *args) + + with patch.object(socket.socket, "recvfrom", recvfrom): + self._wait_for(lambda: resets[0] == 0) + self.assertTrue(server._rudp_thread.is_alive()) + self.assertIsNotNone(self._served(y)) + finally: + server.stop() + + def test_a_permanent_send_failure_ends_only_that_peers_session_and_the_goodbye_names_it(self) -> None: + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + original_sendto = socket.socket.sendto + try: + x, x_addr = self._client(server, "peer-x") + y, _ = self._client(server, "peer-y") + failures = [1] + + def sendto(sock: socket.socket, data: bytes, *args: Any) -> int: + if args and tuple(args[-1]) == tuple(x_addr) and failures[0] > 0: + failures[0] -= 1 + raise OSError(errno.EMSGSIZE, "Message too long") + return original_sendto(sock, data, *args) + + with patch.object(socket.socket, "sendto", sendto): + # The server's response to X can never be sent as built. + x.send("schema", hello(runtime_id="probe").to_bytes()) + for _ in range(200): + x.receive_once() + if x.disconnect_reason is not None: + break + time.sleep(0.005) + self.assertIsNotNone(x.disconnect_reason, "X is told its session ended") + self.assertTrue(x.disconnect_reason.startswith(b"packet could not be sent: ")) + self.assertGreater(len(x.disconnect_reason), len(b"packet could not be sent: ")) + self.assertTrue(server._rudp_thread.is_alive()) + + # Y is unaffected. + self.assertFalse(x.connected) + self.assertIsNotNone(self._served(y)) + self.assertEqual(server.rudp_send_failures, 0) + finally: + server.stop() + + def test_healthy_sends_are_not_failures(self) -> None: + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + try: + x, _ = self._client(server, "peer-x") + self.assertIsNotNone(self._served(x)) + self.assertEqual(server.rudp_send_failures, 0) + finally: + server.stop() + + def test_a_permanent_failure_in_a_resend_ends_only_that_peers_session(self) -> None: + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + original_sendto = socket.socket.sendto + try: + x, x_addr = self._client(server, "peer-x") + y, _ = self._client(server, "peer-y") + mode = ["transient"] + + def sendto(sock: socket.socket, data: bytes, *args: Any) -> int: + if args and tuple(args[-1]) == tuple(x_addr) and mode[0] == "transient": + raise OSError(errno.ENOBUFS, "injected transient failure") + if args and tuple(args[-1]) == tuple(x_addr) and mode[0] == "permanent": + mode[0] = "healthy" + raise OSError(errno.EMSGSIZE, "Message too long") + return original_sendto(sock, data, *args) + + with patch.object(socket.socket, "sendto", sendto): + # X's response is lost, so a resend is pending; then it can never be sent as built. + x.send("schema", hello(runtime_id="probe").to_bytes()) + self._wait_for(lambda: server.rudp_send_failures > 0) + self.assertFalse(x.disconnect_reason, "a transient failure ends no session") + mode[0] = "permanent" + for _ in range(200): + x.receive_once() + if x.disconnect_reason is not None: + break + time.sleep(0.005) + self.assertIsNotNone(x.disconnect_reason) + self.assertTrue(x.disconnect_reason.startswith(b"packet could not be sent: ")) + self.assertTrue(server._rudp_thread.is_alive()) + self.assertIsNotNone(self._served(y)) + finally: + server.stop() + + def test_a_permanent_failure_acknowledging_a_frame_ends_the_session(self) -> None: + import msgpack # type: ignore + + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + original_sendto = socket.socket.sendto + try: + x, x_addr = self._client(server, "peer-x") + failures = [1] + + def sendto(sock: socket.socket, data: bytes, *args: Any) -> int: + if args and tuple(args[-1]) == tuple(x_addr) and failures[0] > 0: + failures[0] -= 1 + raise OSError(errno.EMSGSIZE, "Message too long") + return original_sendto(sock, data, *args) + + with patch.object(socket.socket, "sendto", sendto): + # Not a message the server answers, so its ack is the only datagram owed. + x.send("schema", msgpack.packb(1)) + for _ in range(200): + x.receive_once() + if x.disconnect_reason is not None: + break + time.sleep(0.005) + self.assertIsNotNone(x.disconnect_reason) + self.assertTrue(x.disconnect_reason.startswith(b"packet could not be sent: ")) + self.assertTrue(server._rudp_thread.is_alive()) + finally: + server.stop() + + def test_a_connect_whose_accept_can_never_be_sent_starts_no_session(self) -> None: + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + original_sendto = socket.socket.sendto + try: + y, _ = self._client(server, "peer-y") + z_socket = bind_udp_socket() + z_addr = z_socket.getsockname()[:2] + failures = [1] + + def sendto(sock: socket.socket, data: bytes, *args: Any) -> int: + if args and tuple(args[-1]) == tuple(z_addr) and failures[0] > 0: + failures[0] -= 1 + raise OSError(errno.EMSGSIZE, "Message too long") + return original_sendto(sock, data, *args) + + with patch.object(socket.socket, "sendto", sendto): + z = CultNetRudpSocketTransportConnection( + CultNetRudpSocketTransportOptions( + runtime_id="peer-z", + socket=z_socket, + mode=CultNetRudpSocketMode.CLIENT, + connection_id=server.rudp_connection_id, + remote_addr=("127.0.0.1", server.port), + resend_delay_ms=25, + ) + ) + z.connect(b"join") + # A session that started would resend its Accept, and the resend would get through. + time.sleep(0.5) + z_socket.settimeout(0.05) + received = [] + while True: + try: + wire, _ = z_socket.recvfrom(65535) + except TimeoutError: + break + received.append(decode_rudp_packet(wire).packet_type) + self.assertEqual(received, [CultNetRudpPacketType.DISCONNECT]) + self.assertTrue(server._rudp_thread.is_alive()) + self.assertIsNotNone(self._served(y)) + finally: + server.stop() + + def test_a_packet_the_session_refuses_ends_only_that_peers_session(self) -> None: + from cultnet_py import CultNetRudpPacket, encode_rudp_packet + + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + try: + x, _ = self._client(server, "peer-x") + y, _ = self._client(server, "peer-y") + # A fragment whose metadata the session refuses: fragment id 0 names no set. + refused = CultNetRudpPacket( + packet_type=CultNetRudpPacketType.DATA, + connection_id=server.rudp_connection_id, + sequence=0, + ack=0, + ack_mask=0, + channel_id="schema", + reliable=False, + fragment_id=0, + fragment_index=0, + fragment_count=2, + payload=b"x", + ) + x.socket.sendto(encode_rudp_packet(refused), ("127.0.0.1", server.port)) + for _ in range(200): + x.receive_once() + if x.disconnect_reason is not None: + break + time.sleep(0.005) + self.assertEqual(x.disconnect_reason, b"session refused a packet") + self.assertTrue(server._rudp_thread.is_alive()) + self.assertIsNotNone(self._served(y), "Y is still served") + finally: + server.stop() + + def test_a_message_whose_handling_fails_ends_only_that_peers_session(self) -> None: + import msgpack # type: ignore + + canary = "canary-7f3e1c" + # Well-formed frames whose fields have the wrong type: handling raises TypeError. + frames = [ + {"schemaVersion": "cultnet.database_subscribe.v0", "subscriptionId": canary, "schemaIds": 5}, + {"schemaVersion": "cultnet.database_subscribe.v0", "subscriptionId": canary, "recordKeys": True}, + ] + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + try: + y, _ = self._client(server, "peer-y") + for frame in frames: + with self.subTest(frame=frame): + x, _ = self._client(server, "peer-x") + with self.assertLogs("cultmesh_py.server", level="WARNING") as logs: + x.send("schema", msgpack.packb(frame, use_bin_type=True)) + for _ in range(200): + x.receive_once() + if x.disconnect_reason is not None: + break + time.sleep(0.005) + self.assertEqual(x.disconnect_reason, b"session refused a packet") + self.assertTrue(server._rudp_thread.is_alive()) + self.assertIsNotNone(self._served(y), "Y is still served") + self.assertEqual(len(logs.output), 1) + self.assertIn("TypeError", logs.output[0]) + self.assertNotIn(canary, logs.output[0]) + finally: + server.stop() + + def _raw_peer(self, server: Any) -> tuple[socket.socket, Any]: + """A peer driven packet by packet, to deliver frames in an order a client would not.""" + from cultnet_py import CultNetRudpSession, CultNetRudpSessionOptions, encode_rudp_packet + + sock = bind_udp_socket() + sock.settimeout(0.05) + session = CultNetRudpSession(CultNetRudpSessionOptions(connection_id=server.rudp_connection_id)) + sock.sendto(encode_rudp_packet(session.create_connect(0, b"join")), ("127.0.0.1", server.port)) + wire, _ = sock.recvfrom(65535) + accept = decode_rudp_packet(wire) + self.assertEqual(accept.packet_type, CultNetRudpPacketType.ACCEPT) + session.receive(accept, 0) + return sock, session + + def test_the_goodbye_for_a_refused_reliable_frame_does_not_acknowledge_it(self) -> None: + import dataclasses + + from cultnet_py import CultNetRudpSendOptions, encode_rudp_packet + + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + try: + sock, session = self._raw_peer(server) + # A reliable fragment whose metadata the session refuses: fragment id 0 names no set. + # The session records its sequence before it refuses it. + (fragment,) = session.send_many("schema", b"x", CultNetRudpSendOptions(reliable=True, ordered=True)) + refused = dataclasses.replace(fragment, fragment_id=0, fragment_index=0, fragment_count=2) + sock.sendto(encode_rudp_packet(refused), ("127.0.0.1", server.port)) + goodbye = None + for _ in range(40): + try: + wire, _ = sock.recvfrom(65535) + except TimeoutError: + continue + packet = decode_rudp_packet(wire) + if packet.packet_type == CultNetRudpPacketType.DISCONNECT: + goodbye = packet + break + self.assertIsNotNone(goodbye) + self.assertEqual(goodbye.payload, b"session refused a packet") + distance = goodbye.ack - refused.sequence + acknowledged = distance == 0 or (0 < distance <= 32 and goodbye.ack_mask & (1 << (distance - 1)) != 0) + self.assertFalse(acknowledged, "the goodbye acknowledged the refused frame") + finally: + server.stop() + + def test_responses_after_one_that_can_never_be_sent_are_not_sent(self) -> None: + from cultnet_py import CultNetRudpSendOptions, encode_rudp_packet + + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + original_sendto = socket.socket.sendto + try: + sock, session = self._raw_peer(server) + addr = sock.getsockname()[:2] + request = hello(runtime_id="probe").to_bytes() + options = CultNetRudpSendOptions(reliable=True, ordered=True) + first = session.send("schema", request, options) + second = session.send("schema", request, options) + attempts: list[CultNetRudpPacketType] = [] + failures = [1] + + def sendto(sock_: socket.socket, data: bytes, *args: Any) -> int: + if args and tuple(args[-1]) == tuple(addr): + packet_type = decode_rudp_packet(data).packet_type + attempts.append(packet_type) + if packet_type == CultNetRudpPacketType.DATA and failures[0] > 0: + failures[0] -= 1 + raise OSError(errno.EMSGSIZE, "Message too long") + return original_sendto(sock_, data, *args) + + with patch.object(socket.socket, "sendto", sendto): + # The second frame waits for the first, so one receive delivers both, and + # the first of the two responses can never be sent as built. + sock.sendto(encode_rudp_packet(second), ("127.0.0.1", server.port)) + time.sleep(0.1) + attempts.clear() + sock.sendto(encode_rudp_packet(first), ("127.0.0.1", server.port)) + self._wait_for(lambda: CultNetRudpPacketType.DISCONNECT in attempts) + time.sleep(0.1) + + # The unsendable response, then only the goodbye: no second response, no ack. + self.assertEqual(attempts, [CultNetRudpPacketType.DATA, CultNetRudpPacketType.DISCONNECT]) + self.assertTrue(server._rudp_thread.is_alive()) + finally: + server.stop() + + def test_a_peer_ended_in_the_resend_loop_is_sent_nothing_more_from_it(self) -> None: + server = CultMesh.serve_node(CultMesh.create_node(runtime_id="mesh-server")) + original_sendto = socket.socket.sendto + try: + x, x_addr = self._client(server, "peer-x") + mode = ["transient"] + attempts: list[CultNetRudpPacketType] = [] + + def sendto(sock: socket.socket, data: bytes, *args: Any) -> int: + if args and tuple(args[-1]) == tuple(x_addr): + packet_type = decode_rudp_packet(data).packet_type + if mode[0] != "transient": + attempts.append(packet_type) + # Only responses fail; X's requests are acknowledged, so X goes quiet. + if packet_type == CultNetRudpPacketType.DATA and mode[0] == "transient": + raise OSError(errno.ENOBUFS, "injected transient failure") + if packet_type == CultNetRudpPacketType.DATA and mode[0] == "permanent": + mode[0] = "healthy" + raise OSError(errno.EMSGSIZE, "Message too long") + return original_sendto(sock, data, *args) + + with patch.object(socket.socket, "sendto", sendto): + x.send("schema", hello(runtime_id="one").to_bytes()) + x.send("schema", hello(runtime_id="two").to_bytes()) + for _ in range(40): + x.receive_once() + time.sleep(0.005) + self._wait_for(lambda: server.rudp_send_failures >= 2) + # Both responses are owed; the next resend of the first can never be sent. + mode[0] = "permanent" + self._wait_for(lambda: CultNetRudpPacketType.DISCONNECT in attempts) + time.sleep(0.2) + + self.assertEqual(attempts, [CultNetRudpPacketType.DATA, CultNetRudpPacketType.DISCONNECT]) + self.assertTrue(server._rudp_thread.is_alive()) + finally: + server.stop() + + def _wait_for(self, predicate: Callable[[], bool]) -> None: + deadline = time.monotonic() + 2.0 + while time.monotonic() < deadline: + if predicate(): + return + time.sleep(0.005) + self.fail("condition not reached") + + if __name__ == "__main__": unittest.main() diff --git a/packages/cultmesh-py/tests/test_rudp_server_generation.py b/packages/cultmesh-py/tests/test_rudp_server_generation.py new file mode 100644 index 00000000..cd84c908 --- /dev/null +++ b/packages/cultmesh-py/tests/test_rudp_server_generation.py @@ -0,0 +1,160 @@ +"""The CultMesh local server's RUDP loop asks each peer's session whether a Connect +repeats. A retransmitted Connect keeps the peer; a restarted client on the same +address is a new one, with none of the old one's subscriptions.""" +from __future__ import annotations + +import socket +import time +import unittest +from dataclasses import dataclass + +import msgpack +from cultcache_py import define_database_entry_type +from cultmesh_py import create_node +from cultmesh_py.server import CultMeshLocalServer +from cultnet_py import ( + CultNetRudpSendOptions, + CultNetRudpSession, + CultNetRudpSessionOptions, + document_put_raw, +) +from cultnet_py.transport import CultNetRudpPacketType, decode_rudp_packet, encode_rudp_packet + +CONNECTION_ID = 0x10203091 +SCHEMA_ID = "mesh.rudp_generation_note.v1" +RELIABLE = CultNetRudpSendOptions(reliable=True, ordered=True) + + +@dataclass +class Note: + body: str + + +NOTE = define_database_entry_type( + "mesh.rudp_generation_note", + [("body", 0)], + cls=Note, + schema_id=SCHEMA_ID, + schema_name="mesh.rudp_generation_note", + schema_version=SCHEMA_ID, +) + + +def wire(message: dict) -> bytes: + return msgpack.packb(message, use_bin_type=True) + + +class RudpServerGenerationTests(unittest.TestCase): + def setUp(self) -> None: + node = create_node(runtime_id="rudp-generation") + node.database.register_document(NOTE) + # Replies stay whole datagrams here, so each server packet the pump reads is one message. + self.server = CultMeshLocalServer(node=node, rudp_connection_id=CONNECTION_ID, rudp_max_fragment_bytes=60_000) + self.server.start() + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.sock.bind(("127.0.0.1", 0)) + self.sock.settimeout(0.02) + self.target = ("127.0.0.1", self.server.port) + # Every schema data packet the server sent, by sequence, whether or not the receiving + # session delivered it: a new server-side session numbers its packets afresh. + self.sent: dict[int, str] = {} + + def tearDown(self) -> None: + self.sock.close() + self.server.stop() + + def to_server(self, packet) -> None: + self.sock.sendto(encode_rudp_packet(packet), self.target) + + def pump(self, session: CultNetRudpSession, until, seconds: float = 2.0) -> bool: + deadline = time.monotonic() + seconds + while time.monotonic() < deadline: + if until(): + return True + try: + data, _ = self.sock.recvfrom(65535) + except TimeoutError: + continue + packet = decode_rudp_packet(data) + session.receive(packet, int(time.monotonic() * 1000)) + if packet.reliable or packet.packet_type == CultNetRudpPacketType.ACCEPT: + self.to_server(session.create_ack_for_received(packet.sequence)) + if packet.packet_type == CultNetRudpPacketType.DATA and packet.channel_id == "schema": + self.sent[packet.sequence] = msgpack.unpackb(packet.payload, raw=False).get("schemaVersion") + return until() + + def count(self, schema_version: str) -> int: + return sum(1 for value in self.sent.values() if value == schema_version) + + def new_session(self, initial_sequence: int) -> CultNetRudpSession: + return CultNetRudpSession(CultNetRudpSessionOptions(connection_id=CONNECTION_ID, initial_sequence=initial_sequence)) + + def test_a_retransmitted_connect_keeps_the_peer_and_a_restarted_client_is_a_new_one(self) -> None: + first = self.new_session(50_000) + connect = first.create_connect(0, b"same") + self.to_server(connect) + self.assertTrue(self.pump(first, lambda: first.connected), "the first Accept") + hello = first.send( + "schema", wire({"schemaVersion": "cultnet.hello.v0", "runtimeId": "probe", "runtimeKind": "test"}), RELIABLE + ) + self.to_server(hello) + self.assertTrue(self.pump(first, lambda: self.count("cultnet.hello.v0") == 1), "the first answer") + self.to_server( + first.send( + "schema", + wire({ + "schemaVersion": "cultnet.database_subscribe.v0", + "messageId": "subscribe", + "subscriptionId": "old-incarnation", + "schemaIds": [SCHEMA_ID], + "includeSnapshot": False, + }), + RELIABLE, + ) + ) + self.pump(first, lambda: False, 0.2) + first_put = document_put_raw( + message_id="first-put", + key="note:a", + schema_id=SCHEMA_ID, + stored_at="2026-09-30T00:00:00Z", + payload=NOTE.encode_payload(Note("first")), + ) + self.to_server(first.send("schema", first_put.to_bytes(), RELIABLE)) + self.assertTrue( + self.pump(first, lambda: self.count("cultnet.database_change_raw.v0") == 1), + "the subscription did not notify its own connection", + ) + + # A retransmitted Connect repeats: the data already delivered is not delivered, or answered, again. + self.to_server(connect) + self.to_server(hello) + self.pump(first, lambda: False, 0.4) + self.assertEqual(self.count("cultnet.hello.v0"), 1, "the retransmitted Connect reset the peer") + + # The same client restarted on the same address, connection id and payload: a new peer. + second = self.new_session(7) + self.to_server(second.create_connect(0, b"same")) + self.assertTrue(self.pump(second, lambda: second.connected), "the restarted client's Accept") + self.to_server( + second.send( + "schema", wire({"schemaVersion": "cultnet.hello.v0", "runtimeId": "probe", "runtimeKind": "test"}), RELIABLE + ) + ) + self.assertTrue(self.pump(second, lambda: self.count("cultnet.hello.v0") == 2), "the restarted client's answer") + + # It inherited none of the old incarnation's subscriptions. + put = document_put_raw( + message_id="second-put", + key="note:a", + schema_id=SCHEMA_ID, + stored_at="2026-09-30T00:00:01Z", + payload=NOTE.encode_payload(Note("second")), + ) + self.to_server(second.send("schema", put.to_bytes(), RELIABLE)) + self.pump(second, lambda: False, 0.4) + self.assertEqual(self.count("cultnet.database_change_raw.v0"), 1, "the new peer inherited a subscription") + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/cultmesh-rs/Cargo.lock b/packages/cultmesh-rs/Cargo.lock index 945bc65b..8dfc33ed 100644 --- a/packages/cultmesh-rs/Cargo.lock +++ b/packages/cultmesh-rs/Cargo.lock @@ -200,7 +200,7 @@ dependencies = [ [[package]] name = "cultmesh-rs" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", "cultcache-rs", @@ -213,7 +213,7 @@ dependencies = [ [[package]] name = "cultnet-rs" -version = "0.1.0" +version = "0.2.0" dependencies = [ "aes-gcm", "anyhow", diff --git a/packages/cultmesh-rs/Cargo.toml b/packages/cultmesh-rs/Cargo.toml index 820050c3..af75e419 100644 --- a/packages/cultmesh-rs/Cargo.toml +++ b/packages/cultmesh-rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cultmesh-rs" -version = "0.1.0" +version = "0.2.0" edition = "2024" license = "MIT" publish = false diff --git a/packages/cultmesh-rs/src/lib.rs b/packages/cultmesh-rs/src/lib.rs index 8cfe8cec..6965e2d5 100644 --- a/packages/cultmesh-rs/src/lib.rs +++ b/packages/cultmesh-rs/src/lib.rs @@ -820,9 +820,13 @@ pub fn request_raw_snapshot_from_rudp_catalog( } if received == &message_id => { snapshot_response = Some(message); } - cultnet_rs::CultNetMessage::Error { error } => { + cultnet_rs::CultNetMessage::Error { error, .. } => { let _ = client.disconnect(b"snapshot-error".to_vec()); - anyhow::bail!("CultMesh RUDP snapshot failed: {error}"); + anyhow::bail!( + "CultMesh RUDP catalog {} refused the snapshot{}", + options.target, + recognised_refusal(error) + ); } _ => {} } @@ -856,6 +860,17 @@ pub fn request_raw_snapshot_from_rudp_catalog( ) } +/// A catalog's refusal text, quoted (`": text"`) only when it is one of the +/// fixed refusals a CultMesh catalog sends; any other text could carry +/// anything, so it is left out. +fn recognised_refusal(text: &str) -> String { + if REFUSAL_TEXTS.contains(&text) { + format!(": {text}") + } else { + String::new() + } +} + fn unix_millis() -> u128 { std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) @@ -866,7 +881,12 @@ fn unix_millis() -> u128 { /// Publish one raw CultNet schema message to a RUDP catalog. /// /// Each call owns a fresh connection epoch and returns only after the catalog -/// acknowledges reliable application admission. +/// acknowledges reliable application admission. Against a Rust CultMesh +/// catalog, which never acknowledges a message it refuses, a refusal is +/// returned as an error, naming the refusal when it is one of the fixed texts +/// such a catalog sends. A catalog that acknowledges a message on receipt and +/// refuses it afterwards (the TypeScript document server does) is reported as +/// having admitted it: the acknowledgement arrives first. pub fn publish_cultnet_message_to_rudp_catalog( message: &cultnet_rs::CultNetMessage, options: CultMeshRudpDocumentPublishOptions, @@ -887,7 +907,23 @@ pub fn publish_cultnet_message_to_rudp_catalog( let receipt = client.send_reliable("schema", payload)?; let flush_deadline = Instant::now() + options.flush_timeout; while Instant::now() < flush_deadline { - let _ = client.receive_once()?; + if let Some(frame) = client.receive_once()? { + if frame.channel_id == "schema" { + if let Ok(cultnet_rs::CultNetMessage::Error { error, .. }) = + decode_cultnet_message_from_slice( + &frame.payload, + CultNetWireContract::CultNetSchemaV0, + ) + { + let _ = client.disconnect(b"document-refused".to_vec()); + anyhow::bail!( + "CultMesh RUDP catalog {} refused the put{}", + options.target, + recognised_refusal(&error) + ); + } + } + } match client.reliable_send_status(&receipt) { cultnet_rs::CultNetRudpReliableSendStatus::Acknowledged => { let _ = client.disconnect(b"document-acknowledged".to_vec()); @@ -961,7 +997,7 @@ fn connect_rudp_client( mode: cultnet_rs::CultNetRudpSocketMode::Client, remote_addr: Some(target), connection_id: fresh_rudp_connection_epoch(), - initial_sequence: 1, + initial_sequence: None, resend_delay_ms, transport_id: Some(transport_id.to_string()), max_payload_bytes: None, @@ -1280,7 +1316,7 @@ mod tests { } #[test] - fn document_publish_requires_application_acknowledgement() -> Result<()> { + fn a_refused_publish_fails_with_the_catalogs_reason_not_a_timeout() -> Result<()> { let temp = tempfile::tempdir()?; let node = CultMesh::create_node( temp.path().join("cultmesh.cc"), @@ -1295,7 +1331,7 @@ mod tests { let mut server = CultMeshRudpDocumentServer::new( socket, |_receipt: CultMeshRudpRawDocumentReceipt| { - anyhow::bail!("injected durable sink failure") + anyhow::bail!("injected durable sink failure CANARY-7f3a") }, |_query: &CultMeshRudpSnapshotQuery| Ok(Vec::new()), CultMeshSystemClock::default(), @@ -1308,6 +1344,7 @@ mod tests { Ok(()) }); + let started = Instant::now(); let error = node .publish_document_to_rudp_catalog( "note", @@ -1317,16 +1354,164 @@ mod tests { CultMeshRudpDocumentPublishOptions { target, connect_timeout: Duration::from_millis(100), - flush_timeout: Duration::from_millis(50), + flush_timeout: Duration::from_secs(10), poll_interval: Duration::from_millis(2), resend_delay_ms: 5, ..CultMeshRudpDocumentPublishOptions::default() }, ) - .expect_err("unacknowledged document must fail closed"); + .expect_err("a refused document must fail closed"); + let waited = started.elapsed(); stop.store(true, std::sync::atomic::Ordering::SeqCst); server.join().expect("server thread should not panic")?; - assert!(error.to_string().contains("reliable acknowledgement")); + // The publisher hears the refusal and its reason, long before its flush + // deadline: a refusal is not mistaken for loss. + assert!( + error + .to_string() + .ends_with("refused the put: the catalog refused the document"), + "{error:#}" + ); + assert!(!error.to_string().contains("CANARY"), "{error:#}"); + assert!(waited < Duration::from_secs(5), "waited {waited:?}"); + Ok(()) + } + + /// A catalog that answers every message with a refusal of its own wording, + /// never acknowledging it. Stops when the flag is set. + fn refusing_catalog( + text: &'static str, + ) -> Result<( + SocketAddr, + std::sync::Arc, + thread::JoinHandle>, + )> { + use cultnet_rs::{ + CultNetRudpPacketType, CultNetRudpSendOptions, CultNetRudpSession, + CultNetRudpSessionOptions, decode_rudp_packet, encode_rudp_packet, + }; + let socket = UdpSocket::bind("127.0.0.1:0")?; + socket.set_read_timeout(Some(Duration::from_millis(5)))?; + let target = socket.local_addr()?; + let stop = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)); + let catalog_stop = stop.clone(); + let catalog = thread::spawn(move || -> Result<()> { + let mut session: Option = None; + let mut wire = vec![0_u8; 65_535]; + while !catalog_stop.load(std::sync::atomic::Ordering::SeqCst) { + let Ok((bytes, peer)) = socket.recv_from(&mut wire) else { + continue; + }; + let Ok(packet) = decode_rudp_packet(&wire[..bytes]) else { + continue; + }; + if packet.packet_type == CultNetRudpPacketType::Connect { + let mut accepted = CultNetRudpSession::new(CultNetRudpSessionOptions { + connection_id: packet.connection_id, + initial_sequence: None, + resend_delay_ms: 10_000, + max_pending_reliable_packets: Some(64), + }); + let accept = accepted.accept_connect(&packet, 0, Vec::new())?; + socket.send_to(&encode_rudp_packet(&accept)?, peer)?; + session = Some(accepted); + continue; + } + let Some(session) = session.as_mut() else { + continue; + }; + let Ok(received) = session.receive(&packet, 1) else { + continue; + }; + for _message in received.delivered { + let refusal = encode_cultnet_message_to_vec( + &cultnet_rs::CultNetMessage::Error { + error: text.into(), + code: None, + details: None, + }, + CultNetWireContract::CultNetSchemaV0, + )?; + let options = CultNetRudpSendOptions { + reliable: false, + ordered: false, + sequenced: false, + now_ms: 2, + reliable_expire_after_ms: None, + }; + for packet in session.send_many("schema", refusal, options, Some(1200))? { + socket.send_to(&encode_rudp_packet(&packet)?, peer)?; + } + } + } + Ok(()) + }); + Ok((target, stop, catalog)) + } + + /// A catalog's refusal text is quoted only when it is one of the fixed + /// refusals a CultMesh catalog sends. Any other text, which could carry + /// anything, stays out of the publisher's error. + #[test] + fn a_publisher_never_quotes_a_refusal_it_does_not_recognise() -> Result<()> { + let temp = tempfile::tempdir()?; + let node = CultMesh::create_node( + temp.path().join("cultmesh.cc"), + TestDocuments, + Default::default(), + )?; + let (target, stop, catalog) = refusing_catalog("no such tenant: CANARY-7f3a")?; + let error = node + .publish_document_to_rudp_catalog( + "note", + &Note { + body: "refused by a stranger".into(), + }, + CultMeshRudpDocumentPublishOptions { + target, + connect_timeout: Duration::from_secs(2), + flush_timeout: Duration::from_secs(10), + poll_interval: Duration::from_millis(2), + resend_delay_ms: 5, + ..CultMeshRudpDocumentPublishOptions::default() + }, + ) + .expect_err("a refused document must fail closed"); + stop.store(true, std::sync::atomic::Ordering::SeqCst); + catalog.join().expect("catalog thread should not panic")?; + assert_eq!( + error.to_string(), + format!("CultMesh RUDP catalog {target} refused the put") + ); + Ok(()) + } + + /// The snapshot client filters a catalog's refusal the same way: a fixed + /// refusal is named, any other text is left out. + #[test] + fn a_snapshot_client_quotes_only_a_refusal_it_recognises() -> Result<()> { + for (text, expected) in [ + ("no such tenant: CANARY-7f3a", ""), + ("the snapshot source failed", ": the snapshot source failed"), + ] { + let (target, stop, catalog) = refusing_catalog(text)?; + let error = request_raw_snapshot_from_rudp_catalog(CultMeshRudpSnapshotOptions { + target, + message_id: "refused".into(), + connect_timeout: Duration::from_secs(2), + response_timeout: Duration::from_secs(10), + poll_interval: Duration::from_millis(2), + resend_delay_ms: 5, + ..CultMeshRudpSnapshotOptions::default() + }) + .expect_err("a refused snapshot must fail"); + stop.store(true, std::sync::atomic::Ordering::SeqCst); + catalog.join().expect("catalog thread should not panic")?; + assert_eq!( + error.to_string(), + format!("CultMesh RUDP catalog {target} refused the snapshot{expected}") + ); + } Ok(()) } @@ -1406,7 +1591,7 @@ mod tests { let mut session = cultnet_rs::CultNetRudpSession::new(cultnet_rs::CultNetRudpSessionOptions { connection_id: connect.connection_id, - initial_sequence: 1, + initial_sequence: Some(1), resend_delay_ms: 5, max_pending_reliable_packets: Some(64), }); @@ -1548,6 +1733,114 @@ mod tests { Ok(()) } + #[derive(serde::Serialize)] + struct Nest { + inner: Option>, + } + + // `levels` maps deep, written by the serializer the cache itself uses. + fn nest(levels: usize) -> Vec { + let mut value = Nest { inner: None }; + for _ in 1..levels { + value = Nest { inner: Some(Box::new(value)) }; + } + rmp_serde::to_vec_named(&value).unwrap() + } + + fn peer_document(key: &str, payload: Vec) -> cultnet_rs::CultNetRawDocumentRecord { + cultnet_rs::CultNetRawDocumentRecord { + schema_id: "cultmesh.test.note.v0".to_string(), + record_key: key.to_string(), + stored_at: "2026-07-03T00:00:00Z".to_string(), + payload_encoding: cultnet_rs::CultNetRawPayloadEncoding::Messagepack, + payload, + source_runtime_id: None, + source_agent_id: None, + source_role: None, + tags: None, + } + } + + // Serves `documents` as the catalog's snapshot until the returned flag is set. + fn serve_snapshot( + documents: Vec, + ) -> Result<( + SocketAddr, + std::sync::Arc, + thread::JoinHandle>, + )> { + let socket = UdpSocket::bind("127.0.0.1:0")?; + let target = socket.local_addr()?; + let stop = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)); + let server_stop = stop.clone(); + let server = thread::spawn(move || -> Result<()> { + let mut server = CultMeshRudpDocumentServer::new( + socket, + |_receipt: CultMeshRudpRawDocumentReceipt| Ok(()), + move |_query: &CultMeshRudpSnapshotQuery| Ok(documents.clone()), + CultMeshSystemClock::default(), + CultMeshRudpDocumentServerOptions::default(), + )?; + while !server_stop.load(std::sync::atomic::Ordering::SeqCst) { + server.poll_once()?; + thread::sleep(Duration::from_millis(1)); + } + Ok(()) + }); + Ok((target, stop, server)) + } + + fn pull( + node: &mut CultMeshNode, + documents: Vec, + ) -> Result { + let (target, stop, server) = serve_snapshot(documents)?; + let pulled = node.pull_rudp_catalog_snapshot(CultMeshRudpSnapshotOptions { + target, + runtime_id: "pull-test".into(), + message_id: String::new(), + connect_timeout: Duration::from_millis(500), + response_timeout: Duration::from_secs(2), + poll_interval: Duration::from_millis(2), + resend_delay_ms: 5, + schema_ids: None, + record_keys: None, + }); + stop.store(true, std::sync::atomic::Ordering::SeqCst); + server.join().expect("server thread should not panic")?; + pulled + } + + #[test] + fn a_pulled_peer_payload_nested_past_the_bound_is_refused_and_nothing_is_persisted() -> Result<()> { + let temp = tempfile::tempdir()?; + let store_path = temp.path().join("cultmesh.cc"); + let mut node = CultMesh::create_node(&store_path, TestDocuments, Default::default())?; + + let limit = cultcache_rs::MAX_PAYLOAD_DEPTH; + let pulled = pull( + &mut node, + vec![peer_document("a", nest(limit)), peer_document("b", nest(limit))], + )?; + assert_eq!(pulled, 2); + node.flush()?; + let held = std::fs::read(&store_path)?; + + let error = pull(&mut node, vec![peer_document("past", nest(limit + 1))]).unwrap_err(); + assert_eq!( + error.downcast_ref::(), + Some(&cultcache_rs::PayloadTooDeep { depth: limit + 1, limit }) + ); + node.flush()?; + assert_eq!(std::fs::read(&store_path)?, held); + let reloaded = CultMesh::create_node(&store_path, TestDocuments, Default::default())?; + let mut keys: Vec<_> = + reloaded.cache().snapshot().into_iter().map(|entry| entry.key).collect(); + keys.sort(); + assert_eq!(keys, vec!["a".to_string(), "b".to_string()]); + Ok(()) + } + #[test] fn stream_catalog_negotiates_and_publishes_latest_shared_memory_frame() -> Result<()> { let mut catalog = CultMesh::create_stream_catalog(); diff --git a/packages/cultmesh-rs/src/rudp_document_server.rs b/packages/cultmesh-rs/src/rudp_document_server.rs index bebeb6c3..09c31adf 100644 --- a/packages/cultmesh-rs/src/rudp_document_server.rs +++ b/packages/cultmesh-rs/src/rudp_document_server.rs @@ -3,14 +3,21 @@ use cultnet_rs::{ CultNetMessage, CultNetRawDocumentRecord, CultNetRudpPacket, CultNetRudpPacketType, CultNetRudpSendOptions, CultNetRudpSession, CultNetRudpSessionOptions, CultNetWireContract, decode_cultnet_message_from_slice, decode_rudp_packet, encode_cultnet_message_to_vec, - encode_rudp_packet, + encode_rudp_packet, is_permanent_send_error, send_error_code, }; use std::collections::BTreeMap; +#[cfg(test)] +use std::collections::BTreeSet; use std::io::ErrorKind; use std::net::{SocketAddr, UdpSocket}; use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; const MAX_UDP_DATAGRAM_BYTES: usize = 65_535; +/// The most fragments one RUDP message can carry: its fragment count is a u16. +const MAX_FRAGMENTS_PER_MESSAGE: usize = u16::MAX as usize; +/// The shortest message id CultNet encodes: one character. A snapshot request +/// can carry no shorter id, so no response to it can be smaller. +const SHORTEST_MESSAGE_ID: &str = "0"; /// The transport identity of one remote CultNet RUDP session. /// @@ -70,6 +77,20 @@ pub trait CultMeshRudpSnapshotSource { &mut self, query: &CultMeshRudpSnapshotQuery, ) -> Result>; + + /// The record this source would serve for a received put's `document`. + /// + /// The server admits a put only if a snapshot response carrying this record + /// alone fits its limits, so a source that serves a different shape than it + /// receives (dropping provenance, or adding its own) overrides this to keep + /// admission exact. The default serves the record as received. An error + /// refuses the put as `SnapshotSourceFailed`. + fn served_record( + &mut self, + document: &CultNetRawDocumentRecord, + ) -> Result { + Ok(document.clone()) + } } impl CultMeshRudpSnapshotSource for F @@ -138,6 +159,10 @@ pub struct CultMeshRudpDocumentServerOptions { /// finite without duplicating its fragment/ordering machinery here. pub max_admitted_payload_bytes: usize, pub max_admitted_payload_bytes_per_session: usize, + /// The largest encoded snapshot response the server sends. It also bounds + /// puts: a document whose snapshot response alone would exceed it, or would + /// take more fragments than one message or the reliable queue can hold, is + /// refused with `DocumentUnservable`, since no request could return it. pub max_snapshot_response_bytes: usize, pub max_snapshot_documents: usize, pub resend_delay: Duration, @@ -174,12 +199,129 @@ pub enum CultMeshRudpApplicationOperation { SnapshotRequest, } +/// Why the server refused an application message. +/// +/// `Display` gives the operator-facing sentence; match on the variant to act on +/// the cause. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum CultMeshRudpRejectionReason { + /// The caller's sink refused the document. Carries the sink's error text. + SinkRefused(String), + /// The document could never be served: a snapshot response carrying it + /// alone, as the snapshot source would serve it (`served_record`) and under + /// the shortest message id CultNet allows, would + /// exceed `max_snapshot_response_bytes`, or would take more than + /// `max_fragment_count` fragments of `max_fragment_bytes`: the lesser of + /// 65535 and `max_pending_reliable_packets_per_session`. It was not offered + /// to the sink. + DocumentUnservable { + response_bytes: usize, + max_snapshot_response_bytes: usize, + fragment_count: usize, + max_fragment_count: usize, + }, + /// The caller's snapshot source failed. Carries its error text. + SnapshotSourceFailed(String), + SnapshotTooManyDocuments { + documents: usize, + max_snapshot_documents: usize, + }, + SnapshotResponseTooLarge { + response_bytes: usize, + max_snapshot_response_bytes: usize, + }, + /// A snapshot response could not be encoded. Carries the encoder's error text. + ResponseEncodingFailed(String), + /// The server's retained payload budget cannot hold the response. + PayloadBudgetFull, + /// The session could not queue the response. Carries the session's error text. + ResponseQueueFailed(String), + /// A packet of the response can never be sent to the peer as built + /// (`is_permanent_send_error`). Carries the failure's fixed name + /// (`send_error_code`). The session has ended with a goodbye carrying the + /// same name, and no refusal: the server knows the peer cannot be reached. + ResponseSendFailed(&'static str), +} + +impl std::fmt::Display for CultMeshRudpRejectionReason { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::SinkRefused(error) | Self::SnapshotSourceFailed(error) => f.write_str(error), + Self::DocumentUnservable { + response_bytes, + max_snapshot_response_bytes, + fragment_count, + max_fragment_count, + } => write!( + f, + "document can never be served: its snapshot response is {response_bytes} bytes in {fragment_count} fragments; limits are {max_snapshot_response_bytes} bytes and {max_fragment_count} fragments" + ), + Self::SnapshotTooManyDocuments { + documents, + max_snapshot_documents, + } => write!( + f, + "snapshot returned {documents} documents; limit is {max_snapshot_documents}" + ), + Self::SnapshotResponseTooLarge { + response_bytes, + max_snapshot_response_bytes, + } => write!( + f, + "snapshot response is {response_bytes} bytes; limit is {max_snapshot_response_bytes}" + ), + Self::ResponseEncodingFailed(error) => { + write!(f, "snapshot response could not be encoded: {error}") + } + Self::PayloadBudgetFull => f.write_str("retained payload budget is full"), + Self::ResponseQueueFailed(error) => { + write!(f, "snapshot response could not be queued: {error}") + } + Self::ResponseSendFailed(code) => { + write!(f, "snapshot response could not be sent: {code}") + } + } + } +} + +/// The texts a refused peer is sent, one per rejection variant. They are fixed: +/// a sink's or source's error text can quote what a peer sent, so it stays with +/// the caller that receives the rejection and never reaches the wire. +pub(crate) const REFUSAL_TEXTS: [&str; 9] = [ + "the catalog refused the document", + "the document can never be served", + "the snapshot source failed", + "the snapshot has too many documents", + "the snapshot response is too large", + "the snapshot response could not be encoded", + "the retained payload budget is full", + "the snapshot response could not be queued", + "the snapshot response could not be sent", +]; + +impl CultMeshRudpRejectionReason { + /// The fixed text the refused peer is sent for this variant. + fn refusal_text(&self) -> &'static str { + REFUSAL_TEXTS[match self { + Self::SinkRefused(_) => 0, + Self::DocumentUnservable { .. } => 1, + Self::SnapshotSourceFailed(_) => 2, + Self::SnapshotTooManyDocuments { .. } => 3, + Self::SnapshotResponseTooLarge { .. } => 4, + Self::ResponseEncodingFailed(_) => 5, + Self::PayloadBudgetFull => 6, + Self::ResponseQueueFailed(_) => 7, + Self::ResponseSendFailed(_) => 8, + }] + } +} + #[derive(Clone, Debug, PartialEq, Eq)] pub struct CultMeshRudpApplicationRejection { pub session: CultMeshRudpSessionKey, pub operation: CultMeshRudpApplicationOperation, pub message_id: String, - pub reason: String, + pub reason: CultMeshRudpRejectionReason, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -189,6 +331,16 @@ pub enum CultMeshRudpPollOutcome { ApplicationRejected(CultMeshRudpApplicationRejection), } +/// Why a session ends before its peer is done with it. +enum SessionEnd { + /// The session refused a packet. + Refused, + /// The server rejected a peer's message; the peer is sent this fixed text. + Rejected(&'static str), + /// The session owes its peer a packet that can never be sent as built. + Unsendable(std::io::Error), +} + struct SessionEntry { session: CultNetRudpSession, created_at_monotonic_millis: u64, @@ -207,6 +359,15 @@ pub struct CultMeshRudpDocumentServer { snapshot_source: Q, clock: C, options: CultMeshRudpDocumentServerOptions, + packets_dropped: u64, + send_failures: u64, + /// Peers whose every datagram fails to send, standing in for an unroutable + /// or full path that a loopback peer cannot be made to have. + #[cfg(test)] + failing_peers: BTreeSet, + /// Peers whose next datagram after this many fails permanently, once. + #[cfg(test)] + unsendable_after: BTreeMap, } impl CultMeshRudpDocumentServer @@ -234,9 +395,35 @@ where snapshot_source, clock, options, + packets_dropped: 0, + send_failures: 0, + #[cfg(test)] + failing_peers: BTreeSet::new(), + #[cfg(test)] + unsendable_after: BTreeMap::new(), }) } + /// Datagrams read and discarded because they belong to no admissible + /// session: malformed frames, unknown sessions, a Connect the session cap + /// refuses, a packet that fails its session. Never an + /// error: a moved flow or a scanner must not end the daemon loop. + pub fn packets_dropped(&self) -> u64 { + self.packets_dropped + } + + /// Datagrams that could not be sent to a peer and may yet be: no route, full + /// buffers, a refused path. Each is that peer's lost datagram: a reliable + /// packet stays pending and is resent, and the peer's session ends by idle + /// timeout, lifetime, refusal or Disconnect, never by the failure. Never an + /// error: one unreachable peer must not stop the poll that serves the + /// others. A datagram that can never be sent as built + /// (`is_permanent_send_error`) is not counted here: it ends that peer's + /// session, and the peer's goodbye names the error. + pub fn send_failures(&self) -> u64 { + self.send_failures + } + pub fn local_addr(&self) -> Result { Ok(self.socket.local_addr()?) } @@ -248,14 +435,25 @@ where /// Poll transport maintenance and receive at most one UDP datagram. /// /// Application rejection invalidates only the responsible peer session and - /// is returned as data so a daemon can log it and keep serving. Local - /// socket and server-state failures remain errors. + /// is returned as data so a daemon can log it and keep serving. The peer is + /// sent the refusal as a `cultnet.error.v0` carrying fixed text for the + /// rejection's variant, then a goodbye; neither acknowledges the refused + /// message. The rejection's own detail, which can quote a sink's or + /// source's error, stays with the caller. Local socket and server-state + /// failures remain errors. pub fn poll_once(&mut self) -> Result { self.maintain()?; let mut wire = vec![0_u8; MAX_UDP_DATAGRAM_BYTES]; let (received, remote_addr) = match self.socket.recv_from(&mut wire) { Ok(value) => value, - Err(error) if error.kind() == ErrorKind::WouldBlock => { + // Windows reports an earlier ICMP port-unreachable on the next + // receive; it names no datagram of this poll. + Err(error) + if matches!( + error.kind(), + ErrorKind::WouldBlock | ErrorKind::ConnectionReset + ) => + { return Ok(CultMeshRudpPollOutcome::Idle); } Err(error) => return Err(error.into()), @@ -264,7 +462,10 @@ where let packet = match decode_rudp_packet(&wire) { Ok(packet) => packet, - Err(_) => return Ok(CultMeshRudpPollOutcome::Handled), + Err(_) => { + self.packets_dropped += 1; + return Ok(CultMeshRudpPollOutcome::Handled); + } }; let now_unix = self.clock.now_unix_millis(); let now_monotonic = self.clock.now_monotonic_millis(); @@ -274,11 +475,14 @@ where }; if packet.packet_type == CultNetRudpPacketType::Connect { - self.accept_connection(key, &packet, now_monotonic)?; + if !self.accept_connection(key, &packet, now_monotonic)? { + self.packets_dropped += 1; + } return Ok(CultMeshRudpPollOutcome::Handled); } if !self.sessions.contains_key(&key) { + self.packets_dropped += 1; return Ok(CultMeshRudpPollOutcome::Handled); } if packet.packet_type == CultNetRudpPacketType::Data @@ -309,14 +513,16 @@ where let result = match result { Ok(result) => result, Err(_) => { - self.sessions.remove(&key); + self.end_session(key, SessionEnd::Refused)?; + self.packets_dropped += 1; return Ok(CultMeshRudpPollOutcome::Handled); } }; - if let Some(reply) = result.reply { - self.send_packet(key.remote_addr, &reply)?; - } + let mut unsendable = match result.reply { + Some(reply) => self.send_packet(key.remote_addr, &reply)?, + None => None, + }; if result.disconnected { self.sessions.remove(&key); @@ -341,19 +547,31 @@ where now_unix, now_monotonic, )? { - self.sessions.remove(&key); + // The only reply `receive` returns is a Pong, which delivers no + // frame, so no earlier send of this poll can precede a rejection. + // A response that could not be sent ended its session where the + // send failed, over the real error. + if !matches!( + rejection.reason, + CultMeshRudpRejectionReason::ResponseSendFailed(_) + ) { + self.end_session(key, SessionEnd::Rejected(rejection.reason.refusal_text()))?; + } return Ok(CultMeshRudpPollOutcome::ApplicationRejected(rejection)); } } - if packet.reliable { + if packet.reliable && unsendable.is_none() { let ack = self .sessions .get_mut(&key) .ok_or_else(|| anyhow!("CultMesh RUDP session disappeared before ACK"))? .session .create_ack(); - self.send_packet(key.remote_addr, &ack)?; + unsendable = self.send_packet(key.remote_addr, &ack)?; + } + if let Some(error) = unsendable { + self.end_session(key, SessionEnd::Unsendable(error))?; } Ok(CultMeshRudpPollOutcome::Handled) } @@ -373,11 +591,17 @@ where let mut resends = Vec::new(); for (key, entry) in &mut self.sessions { for packet in entry.session.due_resends(now) { - resends.push((key.remote_addr, packet)); + resends.push((*key, packet)); } } - for (remote_addr, packet) in &resends { - self.send_packet(*remote_addr, packet)?; + for (key, packet) in &resends { + // A session ended earlier in this loop has nothing left to resend. + if !self.sessions.contains_key(key) { + continue; + } + if let Some(error) = self.send_packet(key.remote_addr, packet)? { + self.end_session(*key, SessionEnd::Unsendable(error))?; + } } Ok(CultMeshRudpMaintenance { sessions_expired: expired, @@ -385,45 +609,65 @@ where }) } + /// `Ok(false)` when the Connect was refused because the session cap is full; + /// only a socket failure is an `Err`. fn accept_connection( &mut self, key: CultMeshRudpSessionKey, packet: &CultNetRudpPacket, now: u64, - ) -> Result<()> { - if !self.sessions.contains_key(&key) { - if self.sessions.len() >= self.options.max_sessions { - return Ok(()); - } - self.sessions.insert( - key, - SessionEntry { - session: CultNetRudpSession::new(CultNetRudpSessionOptions { - connection_id: key.connection_id, - initial_sequence: 1, - resend_delay_ms: duration_millis(self.options.resend_delay), - max_pending_reliable_packets: Some( - self.options.max_pending_reliable_packets_per_session, - ), - }), - created_at_monotonic_millis: now, - last_activity_monotonic_millis: now, - admitted_payload_bytes: 0, - }, - ); + ) -> Result { + // The session decides whether a Connect repeats the one it accepted. Any + // other Connect from this key is a new client session: the old one ends + // with its budget, and the new one starts fresh. + if self + .sessions + .get(&key) + .is_some_and(|entry| !entry.session.connect_repeats(packet)) + { + self.sessions.remove(&key); } - - let accept = { - let entry = self - .sessions - .get_mut(&key) - .expect("accepted session must be present"); - // The same key is a retransmitted Connect for the existing epoch. - // A genuinely fresh client incarnation must choose a fresh id. - entry.last_activity_monotonic_millis = now; - entry.session.accept_connect(packet, now, Vec::new())? + let reply = match self.sessions.get_mut(&key) { + Some(entry) => { + entry.last_activity_monotonic_millis = now; + match entry.session.accept_connect(packet, now, Vec::new()) { + Ok(reply) => reply, + Err(_) => { + self.end_session(key, SessionEnd::Refused)?; + return Ok(false); + } + } + } + None => { + if self.sessions.len() >= self.options.max_sessions { + return Ok(false); + } + let mut session = CultNetRudpSession::new(CultNetRudpSessionOptions { + connection_id: key.connection_id, + initial_sequence: None, + resend_delay_ms: duration_millis(self.options.resend_delay), + max_pending_reliable_packets: Some( + self.options.max_pending_reliable_packets_per_session, + ), + }); + let accept = session.accept_connect(packet, now, Vec::new())?; + self.sessions.insert( + key, + SessionEntry { + session, + created_at_monotonic_millis: now, + last_activity_monotonic_millis: now, + admitted_payload_bytes: 0, + }, + ); + accept + } }; - self.send_packet(key.remote_addr, &accept) + if let Some(error) = self.send_packet(key.remote_addr, &reply)? { + self.end_session(key, SessionEnd::Unsendable(error))?; + return Ok(false); + } + Ok(true) } fn deliver_application_message( @@ -439,6 +683,49 @@ where message_id, document, } => { + let reject = |reason| { + Ok(Some(CultMeshRudpApplicationRejection { + session: key, + operation: CultMeshRudpApplicationOperation::DocumentPutRaw, + message_id: message_id.clone(), + reason, + })) + }; + // Admit only what some snapshot request can return: the smallest + // response that could carry this document is the record the snapshot + // source would serve for it, alone, under the shortest message id + // CultNet encodes, sized by the snapshot path's encoder and fragmented + // as the snapshot path sends it. + let served = match self.snapshot_source.served_record(&document) { + Ok(served) => served, + Err(error) => { + return reject(CultMeshRudpRejectionReason::SnapshotSourceFailed( + format!("{error:#}"), + )); + } + }; + let alone = CultNetMessage::SnapshotResponseRaw { + message_id: SHORTEST_MESSAGE_ID.into(), + documents: vec![served], + }; + let response_bytes = match encode_snapshot_response(&alone) { + Ok(payload) => payload.len(), + Err(error) => { + return reject(CultMeshRudpRejectionReason::ResponseEncodingFailed(error)); + } + }; + let fragment_count = self.fragments_for(response_bytes); + let max_fragment_count = self.max_fragments_per_response(); + if response_bytes > self.options.max_snapshot_response_bytes + || fragment_count > max_fragment_count + { + return reject(CultMeshRudpRejectionReason::DocumentUnservable { + response_bytes, + max_snapshot_response_bytes: self.options.max_snapshot_response_bytes, + fragment_count, + max_fragment_count, + }); + } let receipt = CultMeshRudpRawDocumentReceipt { session: key, message_id: message_id.clone(), @@ -447,12 +734,9 @@ where document, }; if let Err(error) = self.sink.accept_raw_document(receipt) { - return Ok(Some(CultMeshRudpApplicationRejection { - session: key, - operation: CultMeshRudpApplicationOperation::DocumentPutRaw, - message_id, - reason: format!("{error:#}"), - })); + return reject(CultMeshRudpRejectionReason::SinkRefused(format!( + "{error:#}" + ))); } } CultNetMessage::SnapshotRequest { @@ -474,7 +758,9 @@ where session: key, operation: CultMeshRudpApplicationOperation::SnapshotRequest, message_id, - reason: format!("{error:#}"), + reason: CultMeshRudpRejectionReason::SnapshotSourceFailed(format!( + "{error:#}" + )), })); } }; @@ -483,28 +769,24 @@ where session: key, operation: CultMeshRudpApplicationOperation::SnapshotRequest, message_id, - reason: format!( - "snapshot returned {} documents; limit is {}", - documents.len(), - self.options.max_snapshot_documents - ), + reason: CultMeshRudpRejectionReason::SnapshotTooManyDocuments { + documents: documents.len(), + max_snapshot_documents: self.options.max_snapshot_documents, + }, })); } let response = CultNetMessage::SnapshotResponseRaw { message_id: message_id.clone(), documents, }; - let payload = match encode_cultnet_message_to_vec( - &response, - CultNetWireContract::CultNetSchemaV0, - ) { + let payload = match encode_snapshot_response(&response) { Ok(payload) => payload, Err(error) => { return Ok(Some(CultMeshRudpApplicationRejection { session: key, operation: CultMeshRudpApplicationOperation::SnapshotRequest, message_id, - reason: format!("snapshot response could not be encoded: {error:#}"), + reason: CultMeshRudpRejectionReason::ResponseEncodingFailed(error), })); } }; @@ -513,11 +795,10 @@ where session: key, operation: CultMeshRudpApplicationOperation::SnapshotRequest, message_id, - reason: format!( - "snapshot response is {} bytes; limit is {}", - payload.len(), - self.options.max_snapshot_response_bytes - ), + reason: CultMeshRudpRejectionReason::SnapshotResponseTooLarge { + response_bytes: payload.len(), + max_snapshot_response_bytes: self.options.max_snapshot_response_bytes, + }, })); } if !self.payload_budget_allows(key, payload.len()) { @@ -525,7 +806,7 @@ where session: key, operation: CultMeshRudpApplicationOperation::SnapshotRequest, message_id, - reason: "retained payload budget is full".into(), + reason: CultMeshRudpRejectionReason::PayloadBudgetFull, })); } let payload_bytes = payload.len(); @@ -551,14 +832,25 @@ where session: key, operation: CultMeshRudpApplicationOperation::SnapshotRequest, message_id, - reason: format!("snapshot response could not be queued: {error:#}"), + reason: CultMeshRudpRejectionReason::ResponseQueueFailed(format!( + "{error:#}" + )), })); } }; entry.admitted_payload_bytes = entry.admitted_payload_bytes.saturating_add(payload_bytes); for packet in &packets { - self.send_packet(key.remote_addr, packet)?; + if let Some(error) = self.send_packet(key.remote_addr, packet)? { + let code = send_error_code(&error); + self.end_session(key, SessionEnd::Unsendable(error))?; + return Ok(Some(CultMeshRudpApplicationRejection { + session: key, + operation: CultMeshRudpApplicationOperation::SnapshotRequest, + message_id, + reason: CultMeshRudpRejectionReason::ResponseSendFailed(code), + })); + } } } _ => {} @@ -566,6 +858,86 @@ where Ok(None) } + /// Ends a session before its peer is done with it, and says goodbye. It is + /// the one way a session ends early: every end removes the session, sends + /// what the peer is owed, then the goodbye. + /// + /// A rejected message's refusal goes first, unreliable and unordered: the + /// session ends with it, so it is never resent, and a gap in what the peer + /// has received must not hold it back. It is built before the reset and + /// carries acknowledgement fields built after it, which acknowledge + /// nothing: a publisher reads an acknowledgement as admission. A refusal + /// that can never be sent as built is not dropped: the goodbye names its + /// error instead. A refusal that cannot be encoded is not sent. + fn end_session(&mut self, key: CultMeshRudpSessionKey, end: SessionEnd) -> Result<()> { + let Some(mut entry) = self.sessions.remove(&key) else { + return Ok(()); + }; + let (refusal, mut unsendable) = match end { + SessionEnd::Refused => (Vec::new(), None), + SessionEnd::Rejected(text) => (self.refusal_packets(&mut entry.session, text), None), + SessionEnd::Unsendable(error) => (Vec::new(), Some(error)), + }; + entry.session.reset_peer_state(); + let nothing = entry.session.create_ack(); + for mut packet in refusal { + packet.ack = nothing.ack; + packet.ack_mask = nothing.ack_mask; + if let Some(error) = self.send_packet(key.remote_addr, &packet)? { + unsendable = Some(error); + break; + } + } + let goodbye = match &unsendable { + Some(error) => entry.session.end_unsendable_session(error), + None => entry.session.end_refused_session(), + }; + // The goodbye is the session's last datagram. If it too can never be + // sent, nobody is left to tell. + self.send_packet(key.remote_addr, &goodbye)?; + Ok(()) + } + + /// The refusal a rejected peer is sent, as unreliable, unordered packets. + fn refusal_packets( + &self, + session: &mut CultNetRudpSession, + text: &str, + ) -> Vec { + let refusal = CultNetMessage::Error { + error: text.into(), + code: None, + details: None, + }; + encode_cultnet_message_to_vec(&refusal, CultNetWireContract::CultNetSchemaV0) + .and_then(|payload| { + session.send_many( + "schema", + payload, + CultNetRudpSendOptions { + reliable: false, + ordered: false, + sequenced: false, + now_ms: self.clock.now_monotonic_millis(), + reliable_expire_after_ms: None, + }, + Some(self.options.max_fragment_bytes), + ) + }) + .unwrap_or_default() + } + + /// The fragments `send_many` splits a response of `bytes` into. + fn fragments_for(&self, bytes: usize) -> usize { + bytes.div_ceil(self.options.max_fragment_bytes).max(1) + } + + /// The most fragments one response can take: one message's fragment count, + /// and the reliable queue it must fit into whole. + fn max_fragments_per_response(&self) -> usize { + MAX_FRAGMENTS_PER_MESSAGE.min(self.options.max_pending_reliable_packets_per_session) + } + fn payload_budget_allows(&self, key: CultMeshRudpSessionKey, bytes: usize) -> bool { let Some(session_bytes) = self .sessions @@ -589,13 +961,48 @@ where .is_some_and(|total| total <= self.options.max_admitted_payload_bytes) } - fn send_packet(&mut self, remote_addr: SocketAddr, packet: &CultNetRudpPacket) -> Result<()> { + /// A transient send failure is that peer's lost datagram: counted, never an + /// error. A permanent one (`is_permanent_send_error`) is returned as `Some` + /// for the caller to end the session over. Only an encode failure, the + /// server's own bug, is an error. + fn send_packet( + &mut self, + remote_addr: SocketAddr, + packet: &CultNetRudpPacket, + ) -> Result> { let wire = encode_rudp_packet(packet)?; - self.socket.send_to(&wire, remote_addr)?; - Ok(()) + match self.send_datagram(&wire, remote_addr) { + Ok(_) => {} + Err(error) if is_permanent_send_error(&error) => return Ok(Some(error)), + Err(_) => self.send_failures += 1, + } + Ok(None) + } + + fn send_datagram(&mut self, wire: &[u8], remote_addr: SocketAddr) -> std::io::Result { + #[cfg(test)] + { + match self.unsendable_after.get(&remote_addr).copied() { + Some(0) => { + self.unsendable_after.remove(&remote_addr); + return Err(std::io::Error::from(ErrorKind::InvalidInput)); + } + Some(remaining) => { + self.unsendable_after.insert(remote_addr, remaining - 1); + } + None => {} + } + if self.failing_peers.contains(&remote_addr) { + return Err(std::io::Error::other("injected send failure")); + } + } + self.socket.send_to(wire, remote_addr) } } +#[cfg(test)] +mod send_failure_tests; + fn validate_options(options: &CultMeshRudpDocumentServerOptions) -> Result<()> { if options.max_sessions == 0 { return Err(anyhow!("max_sessions must be greater than zero")); @@ -639,9 +1046,37 @@ fn validate_options(options: &CultMeshRudpDocumentServerOptions) -> Result<()> { if options.max_fragment_bytes == 0 { return Err(anyhow!("max_fragment_bytes must be greater than zero")); } + // The limits must leave room for the smallest response the server sends, an + // empty snapshot: a server that could answer nothing is misconfigured. + let empty = encode_snapshot_response(&CultNetMessage::SnapshotResponseRaw { + message_id: SHORTEST_MESSAGE_ID.into(), + documents: Vec::new(), + }) + .map_err(|error| anyhow!(error))? + .len(); + if empty > options.max_snapshot_response_bytes { + return Err(anyhow!( + "max_snapshot_response_bytes cannot hold an empty snapshot response" + )); + } + let max_fragments = + MAX_FRAGMENTS_PER_MESSAGE.min(options.max_pending_reliable_packets_per_session); + if empty.div_ceil(options.max_fragment_bytes) > max_fragments { + return Err(anyhow!( + "max_fragment_bytes and max_pending_reliable_packets_per_session cannot carry an empty snapshot response" + )); + } Ok(()) } + +/// The one encoder for a snapshot response, shared by the snapshot path and by +/// put admission so the size a put is judged by is the size it would be served at. +fn encode_snapshot_response(response: &CultNetMessage) -> std::result::Result, String> { + encode_cultnet_message_to_vec(response, CultNetWireContract::CultNetSchemaV0) + .map_err(|error| format!("{error:#}")) +} + fn duration_millis(duration: Duration) -> u64 { duration.as_millis().try_into().unwrap_or(u64::MAX) } diff --git a/packages/cultmesh-rs/src/rudp_document_server/send_failure_tests.rs b/packages/cultmesh-rs/src/rudp_document_server/send_failure_tests.rs new file mode 100644 index 00000000..bbf3dee1 --- /dev/null +++ b/packages/cultmesh-rs/src/rudp_document_server/send_failure_tests.rs @@ -0,0 +1,502 @@ +//! One peer whose datagrams cannot be sent must not stop the server serving +//! the others. The failure is injected in `send_packet` through +//! `failing_peers`; a loopback peer cannot be made unroutable on demand. + +use super::*; +use cultnet_rs::{ + CultNetRawPayloadEncoding, CultNetRudpSocketMode, CultNetRudpSocketTransportConnection, + CultNetRudpSocketTransportOptions, +}; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, Mutex}; +use std::thread; + +#[derive(Clone)] +struct Clock(Arc); + +impl CultMeshRudpServerClock for Clock { + fn now_unix_millis(&self) -> u64 { + self.0.load(Ordering::SeqCst) + } + fn now_monotonic_millis(&self) -> u64 { + self.0.load(Ordering::SeqCst) + } +} + +type Received = Arc>>; +type Server = CultMeshRudpDocumentServer< + Box Result<()>>, + Box Result>>, + Clock, +>; +type Client = CultNetRudpSocketTransportConnection; + +fn document(key: &str) -> CultNetRawDocumentRecord { + CultNetRawDocumentRecord { + schema_id: "test.raw.v1".into(), + record_key: key.into(), + stored_at: "2026-09-03T00:00:00Z".into(), + payload_encoding: CultNetRawPayloadEncoding::Messagepack, + payload: vec![0x81, 0xa1, 0x78, 0x2a], + source_runtime_id: None, + source_agent_id: None, + source_role: None, + tags: None, + } +} + +fn client(target: SocketAddr, id: u32) -> (Client, SocketAddr) { + let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); + socket.set_nonblocking(true).unwrap(); + let addr = socket.local_addr().unwrap(); + let client = CultNetRudpSocketTransportConnection::new(CultNetRudpSocketTransportOptions { + media_delivery: None, + runtime_id: "test-client".into(), + socket, + mode: CultNetRudpSocketMode::Client, + remote_addr: Some(target), + connection_id: id, + initial_sequence: Some(1), + resend_delay_ms: 10, + transport_id: None, + max_payload_bytes: None, + max_fragment_bytes: Some(1200), + max_pending_reliable_packets: Some(64), + media_reliable_expire_after_ms: None, + reconnect_policy: None, + }) + .unwrap(); + (client, addr) +} + +fn send(client: &mut Client, message: &CultNetMessage) { + client + .send( + "schema", + encode_cultnet_message_to_vec(message, CultNetWireContract::CultNetSchemaV0).unwrap(), + ) + .unwrap(); +} + +/// A server with a 1 s idle timeout and two connected peers, the first +/// returned being the one whose address sorts first. +fn two_peers() -> ( + Server, + Clock, + Received, + (Client, SocketAddr), + (Client, SocketAddr), +) { + let clock = Clock(Arc::new(AtomicU64::new(1_000))); + let received: Received = Arc::default(); + let sink_received = received.clone(); + let sink: Box Result<()>> = + Box::new(move |receipt| { + sink_received.lock().unwrap().push(receipt.message_id); + Ok(()) + }); + let source: Box< + dyn FnMut(&CultMeshRudpSnapshotQuery) -> Result>, + > = Box::new(|_| Ok(vec![document("catalog")])); + let mut server = CultMeshRudpDocumentServer::new( + UdpSocket::bind("127.0.0.1:0").unwrap(), + sink, + source, + clock.clone(), + CultMeshRudpDocumentServerOptions { + session_idle_timeout: Duration::from_secs(1), + resend_delay: Duration::from_millis(10), + ..Default::default() + }, + ) + .unwrap(); + let target = server.local_addr().unwrap(); + let (mut a, a_addr) = client(target, 7); + let (mut b, b_addr) = client(target, 7); + a.connect(Vec::new()).unwrap(); + b.connect(Vec::new()).unwrap(); + for _ in 0..500 { + server.poll_once().unwrap(); + a.receive_once().unwrap(); + b.receive_once().unwrap(); + if a.connected() && b.connected() { + break; + } + thread::sleep(Duration::from_millis(1)); + } + assert!(a.connected() && b.connected()); + for _ in 0..4 { + server.poll_once().unwrap(); + } + assert_eq!(server.session_count(), 2); + if a_addr < b_addr { + (server, clock, received, (a, a_addr), (b, b_addr)) + } else { + (server, clock, received, (b, b_addr), (a, a_addr)) + } +} + +#[test] +fn one_peer_whose_sends_fail_does_not_stop_the_server_serving_the_others() { + let (mut server, clock, received, (mut x, x_addr), (mut y, _)) = two_peers(); + server.failing_peers.insert(x_addr); + + // X's reply, ack and snapshot response all fail to send. X is visited first. + send( + &mut x, + &CultNetMessage::SnapshotRequest { + message_id: "x-snapshot".into(), + schema_ids: None, + record_keys: None, + }, + ); + send( + &mut y, + &CultNetMessage::DocumentPutRaw { + message_id: "y-put".into(), + document: document("y"), + }, + ); + send( + &mut y, + &CultNetMessage::SnapshotRequest { + message_id: "y-snapshot".into(), + schema_ids: None, + record_keys: None, + }, + ); + let mut y_response = None; + for step in 0..200 { + // The clock moves past X's resend delay so `maintain` has X's resend due. + clock.0.store(1_000 + step * 15, Ordering::SeqCst); + // Never `Err`: X's failed sends are its own lost datagrams. + server.poll_once().unwrap(); + if let Some(frame) = y.receive_once().unwrap() { + y_response = Some(frame); + break; + } + thread::sleep(Duration::from_millis(1)); + } + let frame = y_response.expect("Y receives its snapshot response"); + let response = + decode_cultnet_message_from_slice(&frame.payload, CultNetWireContract::CultNetSchemaV0) + .unwrap(); + assert!(matches!( + response, + CultNetMessage::SnapshotResponseRaw { ref message_id, .. } if message_id == "y-snapshot" + )); + assert!(server.send_failures() > 0); + assert_eq!(received.lock().unwrap().as_slice(), ["y-put"]); + assert!(server.maintain().is_ok()); + + // X's session ends by the idle rule that already ends sessions, not by the + // failure: Y stays active, X does not. + clock.0.store(1_900, Ordering::SeqCst); + send( + &mut y, + &CultNetMessage::DocumentPutRaw { + message_id: "y-put-2".into(), + document: document("y2"), + }, + ); + for _ in 0..20 { + server.poll_once().unwrap(); + thread::sleep(Duration::from_millis(1)); + } + assert_eq!(server.session_count(), 2, "the failure ended no session"); + clock.0.store(2_500, Ordering::SeqCst); + let maintenance = server.maintain().unwrap(); + assert_eq!(maintenance.sessions_expired, 1); + assert_eq!(server.session_count(), 1); +} + +// A permanent send failure is one that can never succeed for the datagram as +// built (`is_permanent_send_error`). It ends that peer's session, never the +// poll, and the peer's goodbye names the error. + +fn put(id: &str) -> CultNetMessage { + CultNetMessage::DocumentPutRaw { + message_id: id.into(), + document: document(id), + } +} + +fn snapshot(id: &str) -> CultNetMessage { + CultNetMessage::SnapshotRequest { + message_id: id.into(), + schema_ids: None, + record_keys: None, + } +} + +fn goodbye_reason(client: &mut Client) -> Vec { + for _ in 0..50 { + client.receive_once().unwrap(); + if let Some(reason) = client.disconnect_reason() { + return reason.to_vec(); + } + thread::sleep(Duration::from_millis(2)); + } + panic!("the client was never told the session ended"); +} + +fn is_unsendable_reason(reason: &[u8]) -> bool { + reason.starts_with(b"packet could not be sent: ") + && reason.len() > b"packet could not be sent: ".len() +} + +#[test] +fn a_permanent_failure_acknowledging_a_document_ends_the_session_after_the_document_is_kept() { + let (mut server, _clock, received, (mut x, x_addr), (mut y, _)) = two_peers(); + server.unsendable_after.insert(x_addr, 0); + send(&mut x, &put("x-put")); + send(&mut y, &put("y-put")); + + for _ in 0..10 { + // Never `Err`: the failure ends X's session, not the poll. + server.poll_once().unwrap(); + } + let mut kept = received.lock().unwrap().clone(); + kept.sort(); + assert_eq!(kept, ["x-put", "y-put"]); + assert_eq!(server.session_count(), 1); + assert_eq!(server.send_failures(), 0); + assert!(is_unsendable_reason(&goodbye_reason(&mut x))); +} + +#[test] +fn a_permanent_failure_sending_a_snapshot_response_rejects_it_and_sends_no_refusal() { + let (mut server, _clock, _received, (mut x, x_addr), (_y, _)) = two_peers(); + server.unsendable_after.insert(x_addr, 0); + send(&mut x, &snapshot("x-snapshot")); + + let mut rejection = None; + for _ in 0..10 { + if let CultMeshRudpPollOutcome::ApplicationRejected(found) = server.poll_once().unwrap() { + rejection = Some(found); + break; + } + } + let rejection = rejection.expect("the response can never be sent"); + assert_eq!(rejection.operation, CultMeshRudpApplicationOperation::SnapshotRequest); + assert_eq!(rejection.message_id, "x-snapshot"); + assert_eq!( + rejection.reason, + CultMeshRudpRejectionReason::ResponseSendFailed("EINVAL") + ); + assert_eq!(server.session_count(), 1); + // The server knows X cannot be reached: X is sent no refusal, only the + // goodbye naming the error, which carries no text of the peer's. + let mut frames = Vec::new(); + let mut reason = None; + for _ in 0..50 { + if let Some(frame) = x.receive_once().unwrap() { + frames.push(frame); + } + if let Some(found) = x.disconnect_reason() { + reason = Some(found.to_vec()); + break; + } + thread::sleep(Duration::from_millis(2)); + } + assert!( + frames.is_empty(), + "no refusal is sent to an unreachable peer: {frames:?}" + ); + // The goodbye names the failure by its fixed name, never the error's text. + assert_eq!( + reason.expect("the client was told the session ended"), + b"packet could not be sent: EINVAL" + ); +} + +#[test] +fn a_permanent_failure_in_resends_ends_only_that_peers_session() { + let (mut server, clock, received, (mut x, x_addr), (mut y, _)) = two_peers(); + // X's snapshot response is lost, so a resend is due; then the datagram can + // never be sent as built. + server.failing_peers.insert(x_addr); + send(&mut x, &snapshot("x-snapshot")); + for _ in 0..5 { + server.poll_once().unwrap(); + } + server.failing_peers.clear(); + server.unsendable_after.insert(x_addr, 0); + clock.0.store(1_200, Ordering::SeqCst); + + let maintenance = server.maintain().unwrap(); + assert!(maintenance.packets_resent > 0); + assert_eq!(server.session_count(), 1); + assert!(is_unsendable_reason(&goodbye_reason(&mut x))); + + send(&mut y, &put("y-put")); + for _ in 0..5 { + server.poll_once().unwrap(); + } + assert_eq!(received.lock().unwrap().as_slice(), ["y-put"]); +} + +#[test] +fn a_connect_whose_accept_can_never_be_sent_starts_no_session() { + let (mut server, _clock, _received, _x, _y) = two_peers(); + let (mut z, z_addr) = client(server.local_addr().unwrap(), 9); + server.unsendable_after.insert(z_addr, 0); + z.connect(Vec::new()).unwrap(); + + for _ in 0..10 { + server.poll_once().unwrap(); + thread::sleep(Duration::from_millis(1)); + } + assert_eq!(server.session_count(), 2); + assert_eq!(server.packets_dropped(), 1); +} + +#[test] +fn healthy_sends_are_not_failures() { + let (mut server, _clock, _received, (mut x, _), (_y, _)) = two_peers(); + send(&mut x, &put("x-put")); + send(&mut x, &snapshot("x-snapshot")); + for _ in 0..10 { + server.poll_once().unwrap(); + thread::sleep(Duration::from_millis(1)); + } + assert_eq!(server.send_failures(), 0); + assert_eq!(server.session_count(), 2); +} + +#[test] +fn a_session_ended_in_the_resend_loop_is_sent_nothing_more_from_it() { + let (mut server, clock, _received, (mut x, x_addr), (_y, _)) = two_peers(); + server.failing_peers.insert(x_addr); + send(&mut x, &snapshot("one")); + send(&mut x, &snapshot("two")); + for _ in 0..10 { + server.poll_once().unwrap(); + } + let before = server.send_failures(); + + server.unsendable_after.insert(x_addr, 0); + clock.0.store(1_200, Ordering::SeqCst); + let maintenance = server.maintain().unwrap(); + + // Both responses are due. The first can never be sent and ends the session; + // the goodbye is the only other datagram attempted at X. + assert_eq!(maintenance.packets_resent, 2); + assert_eq!(server.send_failures() - before, 1); + assert_eq!(server.session_count(), 1); +} + +#[test] +fn no_ack_follows_a_reply_that_can_never_be_sent() { + let (mut server, _clock, _received, _x, _y) = two_peers(); + let target = server.local_addr().unwrap(); + // A peer driven packet by packet: a client never sends a reliable Ping, but a + // peer may, and the server both answers it and acknowledges it. + let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); + socket + .set_read_timeout(Some(Duration::from_millis(20))) + .unwrap(); + let addr = socket.local_addr().unwrap(); + let mut session = CultNetRudpSession::new(CultNetRudpSessionOptions { + connection_id: 7, + ..Default::default() + }); + let connect = session.create_connect(0, Vec::new()).unwrap(); + socket + .send_to(&encode_rudp_packet(&connect).unwrap(), target) + .unwrap(); + let mut wire = vec![0_u8; MAX_UDP_DATAGRAM_BYTES]; + for _ in 0..10 { + server.poll_once().unwrap(); + } + let (read, _) = socket.recv_from(&mut wire).unwrap(); + let accept = decode_rudp_packet(&wire[..read]).unwrap(); + assert_eq!(accept.packet_type, CultNetRudpPacketType::Accept); + session.receive(&accept, 0).unwrap(); + assert_eq!(server.session_count(), 3); + + let mut ping = session.create_ping(b"p".to_vec()); + ping.reliable = true; + ping.sequence = connect.sequence.wrapping_add(1); + // The Pong can never be sent; the ack after it could. + server.unsendable_after.insert(addr, 0); + socket + .send_to(&encode_rudp_packet(&ping).unwrap(), target) + .unwrap(); + for _ in 0..10 { + server.poll_once().unwrap(); + } + + // The session ends over the Pong: the peer gets its goodbye and nothing else. + assert_eq!(server.session_count(), 2); + let mut arrived = Vec::new(); + while let Ok((read, _)) = socket.recv_from(&mut wire) { + arrived.push(decode_rudp_packet(&wire[..read]).unwrap()); + } + assert_eq!(arrived.len(), 1, "{arrived:?}"); + assert_eq!(arrived[0].packet_type, CultNetRudpPacketType::Disconnect); + assert!(is_unsendable_reason(&arrived[0].payload)); +} + +/// Windows reports an ICMP port-unreachable for an earlier datagram as +/// `ConnectionReset` on the next receive. It names no datagram of this poll, so +/// the poll is idle and the server goes on serving. Only Windows reports it, so +/// only a Windows run can see the rule break. +#[cfg(windows)] +#[test] +fn a_reset_reported_by_a_receive_is_idle_not_an_error() { + let (mut server, _clock, received, (mut x, _), (mut y, _)) = two_peers(); + // X asks for a snapshot and goes away before the answer. + send(&mut x, &snapshot("x-snapshot")); + drop(x); + for _ in 0..20 { + server + .poll_once() + .expect("a reset from X's closed port is not an error"); + thread::sleep(Duration::from_millis(1)); + } + + send(&mut y, &put("y-put")); + for _ in 0..20 { + server.poll_once().unwrap(); + thread::sleep(Duration::from_millis(1)); + } + assert_eq!(received.lock().unwrap().as_slice(), ["y-put"]); +} + +#[test] +fn a_refusal_that_can_never_be_sent_ends_the_session_naming_the_error() { + let (mut server, _clock, received, (mut x, x_addr), (mut y, _)) = two_peers(); + // Any document is now unservable, so X's put is refused; the refusal is + // the first datagram X is owed, and it can never be sent as built. + server.options.max_snapshot_response_bytes = 16; + server.unsendable_after.insert(x_addr, 0); + send(&mut x, &put("x-put")); + let mut rejected = false; + for _ in 0..10 { + rejected |= matches!( + server.poll_once().unwrap(), + CultMeshRudpPollOutcome::ApplicationRejected(_) + ); + } + assert!(rejected); + assert!(received.lock().unwrap().is_empty()); + assert_eq!(server.session_count(), 1); + // The failure is not dropped: the goodbye names it, where a refusal's + // goodbye would say the session refused a packet. + assert!(is_unsendable_reason(&goodbye_reason(&mut x))); + assert_eq!(server.send_failures(), 0); + server.options.max_snapshot_response_bytes = + CultMeshRudpDocumentServerOptions::default().max_snapshot_response_bytes; + send(&mut y, &snapshot("y-snapshot")); + let mut served = false; + for _ in 0..50 { + server.poll_once().unwrap(); + if y.receive_once().unwrap().is_some() { + served = true; + break; + } + thread::sleep(Duration::from_millis(1)); + } + assert!(served, "the other peer is still served"); +} diff --git a/packages/cultmesh-rs/tests/rudp_document_server.rs b/packages/cultmesh-rs/tests/rudp_document_server.rs index df14b4ea..30fe4678 100644 --- a/packages/cultmesh-rs/tests/rudp_document_server.rs +++ b/packages/cultmesh-rs/tests/rudp_document_server.rs @@ -2,8 +2,8 @@ use anyhow::Result; use cultmesh_rs::{ CultMeshRudpApplicationOperation, CultMeshRudpDocumentServer, CultMeshRudpDocumentServerOptions, CultMeshRudpPollOutcome, CultMeshRudpRawDocumentReceipt, - CultMeshRudpRawDocumentSink, CultMeshRudpServerClock, CultMeshRudpSnapshotQuery, - CultMeshRudpSnapshotSource, + CultMeshRudpRawDocumentSink, CultMeshRudpRejectionReason, CultMeshRudpServerClock, + CultMeshRudpSnapshotQuery, CultMeshRudpSnapshotSource, }; use cultnet_rs::{ CultNetMessage, CultNetRawDocumentRecord, CultNetRawPayloadEncoding, @@ -41,7 +41,7 @@ impl CultMeshRudpRawDocumentSink for Sink { let mut state = self.0.lock().unwrap(); if state.failures_remaining > 0 { state.failures_remaining -= 1; - anyhow::bail!("injected sink failure"); + anyhow::bail!("injected sink failure CANARY-7f3a"); } state.receipts.push(receipt); Ok(()) @@ -70,11 +70,22 @@ impl Source { Self(Arc::new(Mutex::new(SourceState { documents, failures_remaining: 1, - calls: 0, + ..Default::default() }))) } } +/// `document` without the source provenance a peer reports about itself. +fn stripped(document: &CultNetRawDocumentRecord) -> CultNetRawDocumentRecord { + CultNetRawDocumentRecord { + source_runtime_id: None, + source_agent_id: None, + source_role: None, + tags: None, + ..document.clone() + } +} + impl CultMeshRudpSnapshotSource for Source { fn raw_snapshot( &mut self, @@ -84,12 +95,54 @@ impl CultMeshRudpSnapshotSource for Source { state.calls += 1; if state.failures_remaining > 0 { state.failures_remaining -= 1; - anyhow::bail!("injected source failure"); + anyhow::bail!("injected source failure CANARY-7f3a"); } Ok(state.documents.clone()) } } +/// A source that serves `Source`'s records without source provenance, and says +/// so to admission through `served_record`. `Source` keeps the default. +#[derive(Clone, Default)] +struct StrippingSource { + inner: Source, + /// Refuses to say what it would serve. + served_record_fails: bool, +} + +impl CultMeshRudpSnapshotSource for StrippingSource { + fn raw_snapshot( + &mut self, + query: &CultMeshRudpSnapshotQuery, + ) -> Result> { + Ok(self.inner.raw_snapshot(query)?.iter().map(stripped).collect()) + } + + fn served_record( + &mut self, + document: &CultNetRawDocumentRecord, + ) -> Result { + if self.served_record_fails { + anyhow::bail!("injected served-record failure"); + } + Ok(stripped(document)) + } +} + +fn stripping_server( + options: CultMeshRudpDocumentServerOptions, + sink: Sink, + source: StrippingSource, +) -> Result> { + CultMeshRudpDocumentServer::new( + UdpSocket::bind("127.0.0.1:0")?, + sink, + source, + Clock::new(64_000), + options, + ) +} + #[derive(Clone)] struct Clock { unix: Arc, @@ -160,7 +213,15 @@ fn server( } fn client(target: SocketAddr, id: u32) -> Result { - let socket = UdpSocket::bind("127.0.0.1:0")?; + client_on(UdpSocket::bind("127.0.0.1:0")?, target, id, 1) +} + +fn client_on( + socket: UdpSocket, + target: SocketAddr, + id: u32, + initial_sequence: u32, +) -> Result { socket.set_nonblocking(true)?; CultNetRudpSocketTransportConnection::new(CultNetRudpSocketTransportOptions { media_delivery: None, @@ -169,7 +230,7 @@ fn client(target: SocketAddr, id: u32) -> Result Result( + server: &mut CultMeshRudpDocumentServer, clients: &mut [&mut CultNetRudpSocketTransportConnection], ) -> Result<()> { for client in &mut *clients { @@ -203,6 +264,144 @@ fn connect( anyhow::bail!("client connection timed out") } +/// The encoded size of the snapshot response that carries `document` alone +/// under a one-character message id, the shortest CultNet encodes: the +/// smallest response that could ever serve it. +fn served_alone_bytes(document: &CultNetRawDocumentRecord) -> Result { + Ok(encode_cultnet_message_to_vec( + &CultNetMessage::SnapshotResponseRaw { + message_id: "r".into(), + documents: vec![document.clone()], + }, + CultNetWireContract::CultNetSchemaV0, + )? + .len()) +} + +/// A document keyed `key` whose served-alone response is exactly `bytes`. +fn document_served_at(key: &str, bytes: usize) -> Result { + let probe = bytes / 2; + let base = served_alone_bytes(&document(key, vec![7; probe]))?; + let fitted = document(key, vec![7; probe + bytes - base]); + assert_eq!( + served_alone_bytes(&fitted)?, + bytes, + "fixture: the served size is linear in the payload" + ); + Ok(fitted) +} + +/// Polls the server and client until the client receives a frame. +fn serve_until_frame( + server: &mut CultMeshRudpDocumentServer, + client: &mut CultNetRudpSocketTransportConnection, +) -> Result> { + for _ in 0..2_000 { + let outcome = server.poll_once()?; + assert!( + !matches!(outcome, CultMeshRudpPollOutcome::ApplicationRejected(_)), + "{outcome:?}" + ); + if let Some(frame) = client.receive_once()? { + return Ok(frame.payload); + } + thread::sleep(Duration::from_millis(1)); + } + anyhow::bail!("the client received no frame") +} + +/// Polls the server, and the client so its sends progress, until the server +/// returns a rejection or the sink holds `receipts`. +fn poll_until_rejected_or_stored( + server: &mut CultMeshRudpDocumentServer, + client: &mut CultNetRudpSocketTransportConnection, + sink: &Sink, + receipts: usize, +) -> Result> { + for _ in 0..5_000 { + client.receive_once()?; + client.poll_resends()?; + match server.poll_once()? { + CultMeshRudpPollOutcome::ApplicationRejected(rejection) => { + return Ok(Some(rejection.reason)); + } + CultMeshRudpPollOutcome::Idle => thread::sleep(Duration::from_millis(1)), + _ => {} + } + if sink.0.lock().unwrap().receipts.len() >= receipts { + return Ok(None); + } + } + anyhow::bail!("the put was neither refused nor stored") +} + +/// What a refused peer is sent: a `cultnet.error.v0` carrying fixed text, never +/// a sink's or source's error (the fixtures' errors carry a canary), then the goodbye. The +/// refused message is never acknowledged, so its receipt stays pending until the +/// goodbye invalidates it. Returns the refusal's text. +fn refusal_seen_by( + client: &mut CultNetRudpSocketTransportConnection, + receipt: &CultNetRudpReliableSendReceipt, +) -> Result { + let mut refusal = None; + for _ in 0..2_000 { + if let Some(frame) = client.receive_once()? { + refusal = Some(decode_cultnet_message_from_slice( + &frame.payload, + CultNetWireContract::CultNetSchemaV0, + )?); + break; + } + thread::sleep(Duration::from_millis(1)); + } + let Some(CultNetMessage::Error { + error, + code, + details, + }) = refusal + else { + panic!("the refused peer was sent no refusal: {refusal:?}"); + }; + assert_eq!((code, details), (None, None)); + assert!( + !error.contains("CANARY"), + "a sink's or source's text reached the peer: {error}" + ); + assert_eq!( + client.reliable_send_status(receipt), + CultNetRudpReliableSendStatus::Pending, + "a refusal must not acknowledge the refused message" + ); + for _ in 0..2_000 { + client.receive_once()?; + if !client.connected() { + break; + } + thread::sleep(Duration::from_millis(1)); + } + assert!(!client.connected(), "the refusal is followed by a goodbye"); + assert_eq!( + client.reliable_send_status(receipt), + CultNetRudpReliableSendStatus::Invalidated + ); + Ok(error) +} + +/// Reads every datagram waiting at the server, such as a refused peer's +/// acknowledgement of its refusal, which reaches no session and is dropped. +fn drain_until_idle( + server: &mut CultMeshRudpDocumentServer, +) -> Result<()> { + for _ in 0..100 { + match server.poll_once()? { + CultMeshRudpPollOutcome::Idle => return Ok(()), + CultMeshRudpPollOutcome::Handled => {} + rejected => panic!("draining must not reject: {rejected:?}"), + } + } + anyhow::bail!("the server never went idle") +} + fn send(client: &mut CultNetRudpSocketTransportConnection, message: &CultNetMessage) -> Result<()> { client.send( "schema", @@ -291,7 +490,8 @@ fn same_connection_id_is_peer_scoped_and_raw_bytes_are_untouched() -> Result<()> } #[test] -fn duplicate_connect_preserves_epoch_and_fresh_epoch_is_separate() -> Result<()> { +fn a_second_connect_from_a_client_replaces_its_session_and_a_fresh_epoch_is_separate() -> Result<()> +{ let clock = Clock::new(45_000); let sink = Sink::default(); let mut server = server(Default::default(), clock, sink.clone(), Source::default())?; @@ -325,8 +525,112 @@ fn duplicate_connect_preserves_epoch_and_fresh_epoch_is_separate() -> Result<()> Ok(()) } +/// A client that restarts on the same address and connection id starts a new +/// session: its Connect carries a sequence the accepted one did not, so the +/// server does not mistake it for a retransmit, and what it sends is delivered. #[test] -fn application_rejection_is_nonfatal_peer_scoped_and_unacknowledged() -> Result<()> { +fn a_restarted_client_on_the_same_address_and_connection_id_is_admitted() -> Result<()> { + let sink = Sink::default(); + let mut server = server( + Default::default(), + Clock::new(46_000), + sink.clone(), + Source::default(), + )?; + let target = server.local_addr()?; + let shared = UdpSocket::bind("127.0.0.1:0")?; + let twin = shared.try_clone()?; + let mut first = client_on(shared, target, 93, 50_000)?; + connect(&mut server, &mut [&mut first])?; + for index in 0..3 { + send( + &mut first, + &CultNetMessage::DocumentPutRaw { + message_id: format!("before-{index}"), + document: document("before", vec![index]), + }, + )?; + } + for _ in 0..40 { + server.poll_once()?; + first.receive_once()?; + } + assert_eq!(sink.0.lock().unwrap().receipts.len(), 3); + + let mut restarted = client_on(twin, target, 93, 7)?; + connect(&mut server, &mut [&mut restarted])?; + assert_eq!(server.session_count(), 1); + send( + &mut restarted, + &CultNetMessage::DocumentPutRaw { + message_id: "after-restart".into(), + document: document("after", vec![9]), + }, + )?; + for _ in 0..40 { + server.poll_once()?; + restarted.receive_once()?; + } + let receipts = sink.0.lock().unwrap(); + assert!( + receipts + .receipts + .iter() + .any(|r| r.message_id == "after-restart"), + "the restarted client's frame was not delivered" + ); + Ok(()) +} + +/// A restarted client is a new session, and starts with a new payload budget: +/// what the old one spent is not charged to it. +#[test] +fn a_restarted_client_starts_with_a_fresh_payload_budget() -> Result<()> { + let put = |id: &str| CultNetMessage::DocumentPutRaw { + message_id: id.into(), + document: document("budget", vec![7; 64]), + }; + let encoded = + encode_cultnet_message_to_vec(&put("put-a"), CultNetWireContract::CultNetSchemaV0)?; + let budget = encoded + .len() + .max(served_alone_bytes(&document("budget", vec![7; 64]))?); + let options = CultMeshRudpDocumentServerOptions { + max_admitted_payload_bytes: budget * 2, + max_admitted_payload_bytes_per_session: budget, + max_snapshot_response_bytes: budget, + ..Default::default() + }; + let sink = Sink::default(); + let mut server = server(options, Clock::new(47_000), sink.clone(), Source::default())?; + let target = server.local_addr()?; + let shared = UdpSocket::bind("127.0.0.1:0")?; + let twin = shared.try_clone()?; + let mut first = client_on(shared, target, 94, 50_000)?; + connect(&mut server, &mut [&mut first])?; + send(&mut first, &put("put-a"))?; + for _ in 0..20 { + server.poll_once()?; + } + assert_eq!(sink.0.lock().unwrap().receipts.len(), 1); + + let mut restarted = client_on(twin, target, 94, 7)?; + connect(&mut server, &mut [&mut restarted])?; + send(&mut restarted, &put("put-b"))?; + for _ in 0..20 { + server.poll_once()?; + } + assert_eq!( + sink.0.lock().unwrap().receipts.len(), + 2, + "the restarted client was charged what the old session spent" + ); + Ok(()) +} + +#[test] +fn application_rejection_is_nonfatal_peer_scoped_refused_to_the_peer_and_unacknowledged() +-> Result<()> { let clock = Clock::new(48_000); let sink = Sink::fail_once(); let source = Source::fail_once(vec![document("snapshot", vec![4, 5, 6])]); @@ -361,13 +665,17 @@ fn application_rejection_is_nonfatal_peer_scoped_and_unacknowledged() -> Result< CultMeshRudpApplicationOperation::DocumentPutRaw ); assert_eq!(rejection.message_id, "rejected-put"); - assert!(rejection.reason.contains("injected sink failure")); - assert_eq!(server.session_count(), 2); - publisher.receive_once()?; assert_eq!( - publisher.reliable_send_status(&publish_receipt), - CultNetRudpReliableSendStatus::Pending + rejection.reason, + CultMeshRudpRejectionReason::SinkRefused("injected sink failure CANARY-7f3a".into()) ); + assert_eq!(server.session_count(), 2); + // The caller keeps the sink's text; the peer is sent fixed text, never it. + assert_eq!( + refusal_seen_by(&mut publisher, &publish_receipt)?, + "the catalog refused the document" + ); + drain_until_idle(&mut server)?; let snapshot_receipt = send_reliable( &mut snapshot_client, @@ -386,13 +694,18 @@ fn application_rejection_is_nonfatal_peer_scoped_and_unacknowledged() -> Result< CultMeshRudpApplicationOperation::SnapshotRequest ); assert_eq!(rejection.message_id, "rejected-snapshot"); - assert!(rejection.reason.contains("injected source failure")); - assert_eq!(server.session_count(), 1); - snapshot_client.receive_once()?; assert_eq!( - snapshot_client.reliable_send_status(&snapshot_receipt), - CultNetRudpReliableSendStatus::Pending + rejection.reason, + CultMeshRudpRejectionReason::SnapshotSourceFailed( + "injected source failure CANARY-7f3a".into() + ) ); + assert_eq!(server.session_count(), 1); + assert_eq!( + refusal_seen_by(&mut snapshot_client, &snapshot_receipt)?, + "the snapshot source failed" + ); + drain_until_idle(&mut server)?; let survivor_receipt = send_reliable( &mut survivor, @@ -471,15 +784,24 @@ fn snapshot_response_resends_until_acknowledged() -> Result<()> { fn payload_and_snapshot_output_budgets_fail_closed() -> Result<()> { let clock = Clock::new(55_000); let sink = Sink::default(); + // The message id is long enough that the put's frame is at least its + // served-alone response, so the snapshot limit below admits it. let message = CultNetMessage::DocumentPutRaw { - message_id: "budget".into(), + message_id: "budget-exact".into(), document: document("budget", vec![7; 64]), }; let encoded = encode_cultnet_message_to_vec(&message, CultNetWireContract::CultNetSchemaV0)?; + // The put's frame is exactly both budgets, so the first put is admitted only + // if a charge equal to a limit fits it. + let budget = encoded.len(); + assert!( + served_alone_bytes(&document("budget", vec![7; 64]))? <= budget, + "fixture: the snapshot limit must admit the put" + ); let options = CultMeshRudpDocumentServerOptions { - max_admitted_payload_bytes: encoded.len(), - max_admitted_payload_bytes_per_session: encoded.len(), - max_snapshot_response_bytes: encoded.len(), + max_admitted_payload_bytes: budget, + max_admitted_payload_bytes_per_session: budget, + max_snapshot_response_bytes: budget, ..Default::default() }; let mut budget_server = server(options, clock, sink.clone(), Source::default())?; @@ -518,12 +840,425 @@ fn payload_and_snapshot_output_budgets_fail_closed() -> Result<()> { CultMeshRudpApplicationOperation::SnapshotRequest ); assert_eq!(rejection.message_id, "too-large"); - assert!(rejection.reason.contains("snapshot response is")); + assert!(matches!( + rejection.reason, + CultMeshRudpRejectionReason::SnapshotResponseTooLarge { + response_bytes, + max_snapshot_response_bytes: 128, + } if response_bytes > 128 + )); assert_eq!(snapshot_server.session_count(), 0); - snapshot_client.receive_once()?; assert_eq!( - snapshot_client.reliable_send_status(&receipt), - CultNetRudpReliableSendStatus::Pending + refusal_seen_by(&mut snapshot_client, &receipt)?, + "the snapshot response is too large" + ); + Ok(()) +} + +/// A put is admitted only if some snapshot request could return it. One byte +/// over the served bound is refused before the sink sees it; exactly at the +/// bound is admitted, and a snapshot then serves it at exactly that size. The +/// source keeps the default `served_record`, so the record is sized as received. +#[test] +fn a_put_the_server_could_never_serve_is_refused_and_one_at_the_bound_is_served() -> Result<()> { + let at_bound = document("fit", vec![7; 100]); + let over_bound = document("fit", vec![7; 101]); + let limit = served_alone_bytes(&at_bound)?; + assert_eq!( + served_alone_bytes(&over_bound)?, + limit + 1, + "fixture: the two documents must straddle the bound by one byte" + ); + let options = CultMeshRudpDocumentServerOptions { + max_snapshot_response_bytes: limit, + ..Default::default() + }; + let sink = Sink::default(); + let source = Source::default(); + let mut server = server(options, Clock::new(60_000), sink.clone(), source.clone())?; + let target = server.local_addr()?; + + let mut refused = client(target, 121)?; + let mut writer = client(target, 122)?; + connect(&mut server, &mut [&mut refused, &mut writer])?; + let refused_receipt = send_reliable( + &mut refused, + &CultNetMessage::DocumentPutRaw { + message_id: "put-over".into(), + document: over_bound, + }, + )?; + let CultMeshRudpPollOutcome::ApplicationRejected(rejection) = server.poll_once()? else { + panic!("an unservable put must be refused as an application rejection"); + }; + assert_eq!(rejection.session.connection_id, 121); + assert_eq!( + rejection.operation, + CultMeshRudpApplicationOperation::DocumentPutRaw + ); + assert_eq!(rejection.message_id, "put-over"); + assert_eq!( + rejection.reason, + CultMeshRudpRejectionReason::DocumentUnservable { + response_bytes: limit + 1, + max_snapshot_response_bytes: limit, + fragment_count: 1, + max_fragment_count: 1024, + } + ); + let sentence = rejection.reason.to_string(); + assert!(sentence.contains(&(limit + 1).to_string()) && sentence.contains(&limit.to_string())); + assert!(sink.0.lock().unwrap().receipts.is_empty()); + assert_eq!(server.session_count(), 1); + // The peer hears the refusal and why, rather than waiting on a put that + // will never be acknowledged. + assert_eq!( + refusal_seen_by(&mut refused, &refused_receipt)?, + "the document can never be served" + ); + + send( + &mut writer, + &CultNetMessage::DocumentPutRaw { + message_id: "put-at".into(), + document: at_bound.clone(), + }, + )?; + for _ in 0..500 { + let outcome = server.poll_once()?; + assert!( + !matches!(outcome, CultMeshRudpPollOutcome::ApplicationRejected(_)), + "{outcome:?}" + ); + if !sink.0.lock().unwrap().receipts.is_empty() { + break; + } + thread::sleep(Duration::from_millis(1)); + } + let stored: Vec<_> = sink + .0 + .lock() + .unwrap() + .receipts + .iter() + .map(|receipt| receipt.document.clone()) + .collect(); + assert_eq!(stored, vec![at_bound.clone()]); + source.0.lock().unwrap().documents = stored; + + send( + &mut writer, + &CultNetMessage::SnapshotRequest { + message_id: "r".into(), + schema_ids: None, + record_keys: None, + }, + )?; + let mut served = None; + for _ in 0..500 { + let outcome = server.poll_once()?; + assert!( + !matches!(outcome, CultMeshRudpPollOutcome::ApplicationRejected(_)), + "{outcome:?}" + ); + if let Some(frame) = writer.receive_once()? { + served = Some(frame.payload); + break; + } + thread::sleep(Duration::from_millis(1)); + } + let served = served.expect("the admitted document must be served"); + assert_eq!(served.len(), limit); + assert_eq!( + decode_cultnet_message_from_slice(&served, CultNetWireContract::CultNetSchemaV0)?, + CultNetMessage::SnapshotResponseRaw { + message_id: "r".into(), + documents: vec![at_bound], + } + ); + Ok(()) +} + +/// A source that serves records without provenance says so through +/// `served_record`, and admission sizes that: a put over the bound only in its +/// received form is admitted and served at exactly the bound. +#[test] +fn a_put_is_sized_as_its_source_would_serve_it() -> Result<()> { + let provenance = |mut document: CultNetRawDocumentRecord| { + document.source_agent_id = Some("provenance-agent-that-is-not-served".into()); + document.source_role = Some("provenance-role".into()); + document.tags = Some(vec!["provenance".into(), "tags".into()]); + document + }; + let at_bound = provenance(document("fit", vec![7; 100])); + let over_bound = provenance(document("fit", vec![7; 101])); + let limit = served_alone_bytes(&stripped(&at_bound))?; + assert_eq!( + served_alone_bytes(&stripped(&over_bound))?, + limit + 1, + "fixture: the two documents must straddle the bound by one byte as served" + ); + assert!( + served_alone_bytes(&at_bound)? > limit + 1, + "fixture: the at-bound put is over the bound as received" + ); + let options = CultMeshRudpDocumentServerOptions { + max_snapshot_response_bytes: limit, + ..Default::default() + }; + let sink = Sink::default(); + let source = StrippingSource::default(); + let mut server = stripping_server(options, sink.clone(), source.clone())?; + let target = server.local_addr()?; + + let mut refused = client(target, 151)?; + connect(&mut server, &mut [&mut refused])?; + send( + &mut refused, + &CultNetMessage::DocumentPutRaw { + message_id: "put-over".into(), + document: over_bound, + }, + )?; + assert_eq!( + poll_until_rejected_or_stored(&mut server, &mut refused, &sink, 1)?, + Some(CultMeshRudpRejectionReason::DocumentUnservable { + response_bytes: limit + 1, + max_snapshot_response_bytes: limit, + fragment_count: 1, + max_fragment_count: 1024, + }) + ); + + let mut writer = client(target, 152)?; + connect(&mut server, &mut [&mut writer])?; + send( + &mut writer, + &CultNetMessage::DocumentPutRaw { + message_id: "put-at".into(), + document: at_bound.clone(), + }, + )?; + assert_eq!( + poll_until_rejected_or_stored(&mut server, &mut writer, &sink, 1)?, + None + ); + assert_eq!( + sink.0.lock().unwrap().receipts[0].document, + at_bound, + "the sink receives the record as it was sent" + ); + source.inner.0.lock().unwrap().documents = vec![at_bound.clone()]; + send( + &mut writer, + &CultNetMessage::SnapshotRequest { + message_id: "r".into(), + schema_ids: None, + record_keys: None, + }, + )?; + let served = serve_until_frame(&mut server, &mut writer)?; + assert_eq!(served.len(), limit); + assert_eq!( + decode_cultnet_message_from_slice(&served, CultNetWireContract::CultNetSchemaV0)?, + CultNetMessage::SnapshotResponseRaw { + message_id: "r".into(), + documents: vec![stripped(&at_bound)], + } + ); + Ok(()) +} + +/// A source that cannot say what it would serve refuses the put. +#[test] +fn a_put_whose_served_record_the_source_cannot_give_is_refused() -> Result<()> { + let sink = Sink::default(); + let source = StrippingSource { + served_record_fails: true, + ..Default::default() + }; + let mut server = stripping_server(Default::default(), sink.clone(), source)?; + let mut refused = client(server.local_addr()?, 161)?; + connect(&mut server, &mut [&mut refused])?; + send( + &mut refused, + &CultNetMessage::DocumentPutRaw { + message_id: "put".into(), + document: document("unsized", vec![1, 2, 3]), + }, + )?; + assert_eq!( + poll_until_rejected_or_stored(&mut server, &mut refused, &sink, 1)?, + Some(CultMeshRudpRejectionReason::SnapshotSourceFailed( + "injected served-record failure".into() + )) + ); + assert!(sink.0.lock().unwrap().receipts.is_empty()); + Ok(()) +} + +/// A put is admitted only if its served response fits the fragments one +/// response may take: here eight of 100 bytes, the reliable queue, although the +/// byte limit is far larger. Eight fragments are admitted and served; nine are +/// refused, and so is Soul's 2000-byte probe, each naming its sizes. +#[test] +fn a_put_whose_response_would_overflow_the_reliable_queue_is_refused() -> Result<()> { + let options = CultMeshRudpDocumentServerOptions { + max_fragment_bytes: 100, + max_pending_reliable_packets_per_session: 8, + max_snapshot_response_bytes: 8192, + ..Default::default() + }; + let sink = Sink::default(); + let source = Source::default(); + let mut server = server(options, Clock::new(61_000), sink.clone(), source.clone())?; + let target = server.local_addr()?; + let unservable = |response_bytes, fragment_count| { + Some(CultMeshRudpRejectionReason::DocumentUnservable { + response_bytes, + max_snapshot_response_bytes: 8192, + fragment_count, + max_fragment_count: 8, + }) + }; + + for (id, bytes, fragments) in [(131, 2000, 20), (132, 801, 9)] { + let mut refused = client(target, id)?; + connect(&mut server, &mut [&mut refused])?; + send( + &mut refused, + &CultNetMessage::DocumentPutRaw { + message_id: "put-over".into(), + document: document_served_at("queue", bytes)?, + }, + )?; + let reason = poll_until_rejected_or_stored(&mut server, &mut refused, &sink, 1)?; + assert_eq!(reason, unservable(bytes, fragments)); + let sentence = reason.unwrap().to_string(); + assert!( + sentence.contains(&format!("{bytes} bytes in {fragments} fragments")) + && sentence.contains("8 fragments"), + "{sentence}" + ); + } + assert!(sink.0.lock().unwrap().receipts.is_empty()); + + let at_bound = document_served_at("queue", 800)?; + let mut writer = client(target, 133)?; + connect(&mut server, &mut [&mut writer])?; + send( + &mut writer, + &CultNetMessage::DocumentPutRaw { + message_id: "put-at".into(), + document: at_bound.clone(), + }, + )?; + assert_eq!( + poll_until_rejected_or_stored(&mut server, &mut writer, &sink, 1)?, + None + ); + source.0.lock().unwrap().documents = vec![at_bound.clone()]; + send( + &mut writer, + &CultNetMessage::SnapshotRequest { + message_id: "r".into(), + schema_ids: None, + record_keys: None, + }, + )?; + let served = serve_until_frame(&mut server, &mut writer)?; + assert_eq!(served.len(), 800); + assert_eq!( + decode_cultnet_message_from_slice(&served, CultNetWireContract::CultNetSchemaV0)?, + CultNetMessage::SnapshotResponseRaw { + message_id: "r".into(), + documents: vec![at_bound], + } + ); + Ok(()) +} + +/// One message carries at most 65535 fragments, however deep the reliable +/// queue: a response of 65536 one-byte fragments is refused, one of 65535 is not. +#[test] +fn a_put_whose_response_needs_more_than_65535_fragments_is_refused() -> Result<()> { + let options = CultMeshRudpDocumentServerOptions { + max_fragment_bytes: 1, + max_pending_reliable_packets_per_session: 100_000, + max_snapshot_response_bytes: 70_000, + ..Default::default() + }; + let sink = Sink::default(); + let mut server = server(options, Clock::new(62_000), sink.clone(), Source::default())?; + let target = server.local_addr()?; + + let mut refused = client(target, 141)?; + connect(&mut server, &mut [&mut refused])?; + send( + &mut refused, + &CultNetMessage::DocumentPutRaw { + message_id: "put-over".into(), + document: document_served_at("wide", 65_536)?, + }, + )?; + assert_eq!( + poll_until_rejected_or_stored(&mut server, &mut refused, &sink, 1)?, + Some(CultMeshRudpRejectionReason::DocumentUnservable { + response_bytes: 65_536, + max_snapshot_response_bytes: 70_000, + fragment_count: 65_536, + max_fragment_count: 65_535, + }) + ); + + let mut writer = client(target, 142)?; + connect(&mut server, &mut [&mut writer])?; + send( + &mut writer, + &CultNetMessage::DocumentPutRaw { + message_id: "put-at".into(), + document: document_served_at("wide", 65_535)?, + }, + )?; + assert_eq!( + poll_until_rejected_or_stored(&mut server, &mut writer, &sink, 1)?, + None + ); + Ok(()) +} + +/// The limits must leave room for an empty snapshot response, the smallest the +/// server sends; exactly enough room is accepted. +#[test] +fn options_that_cannot_carry_an_empty_snapshot_response_are_refused() -> Result<()> { + let empty = encode_cultnet_message_to_vec( + &CultNetMessage::SnapshotResponseRaw { + message_id: "r".into(), + documents: Vec::new(), + }, + CultNetWireContract::CultNetSchemaV0, + )? + .len(); + let build = |options: CultMeshRudpDocumentServerOptions| { + server(options, Clock::new(63_000), Sink::default(), Source::default()).map(|_| ()) + }; + let bytes = |max_snapshot_response_bytes| CultMeshRudpDocumentServerOptions { + max_snapshot_response_bytes, + ..Default::default() + }; + let fragments = |max_pending_reliable_packets_per_session| CultMeshRudpDocumentServerOptions { + max_fragment_bytes: 1, + max_pending_reliable_packets_per_session, + ..Default::default() + }; + build(bytes(empty))?; + let error = build(bytes(empty - 1)).unwrap_err().to_string(); + assert!(error.contains("max_snapshot_response_bytes"), "{error}"); + build(fragments(empty))?; + let error = build(fragments(empty - 1)).unwrap_err().to_string(); + assert!( + error.contains("max_pending_reliable_packets_per_session"), + "{error}" ); Ok(()) } @@ -553,3 +1288,434 @@ fn session_cap_and_expiry_use_monotonic_time() -> Result<()> { assert_eq!(server.session_count(), 0); Ok(()) } + +#[test] +fn a_connect_storm_and_stray_frames_are_dropped_not_fatal() -> Result<()> { + use cultnet_rs::{ + CultNetRudpSendOptions, CultNetRudpSession, CultNetRudpSessionOptions, encode_rudp_packet, + }; + let clock = Clock::new(60_000); + let sink = Sink::default(); + let options = CultMeshRudpDocumentServerOptions { + max_pending_reliable_packets_per_session: 4, + ..Default::default() + }; + let mut server = server(options, clock.clone(), sink.clone(), Source::default())?; + let target = server.local_addr()?; + let mut real = client(target, 101)?; + connect(&mut server, &mut [&mut real])?; + assert_eq!(server.packets_dropped(), 0); + + let raw = UdpSocket::bind("127.0.0.1:0")?; + let session = |id| { + CultNetRudpSession::new(CultNetRudpSessionOptions { + connection_id: id, + initial_sequence: Some(1), + resend_delay_ms: 10, + max_pending_reliable_packets: None, + }) + }; + let send_raw = |server: &mut Server, packet: &cultnet_rs::CultNetRudpPacket| -> Result<()> { + raw.send_to(&encode_rudp_packet(packet)?, target)?; + server.poll_once()?; + Ok(()) + }; + + // A malformed frame. + raw.send_to(b"not a rudp packet", target)?; + server.poll_once()?; + assert_eq!(server.packets_dropped(), 1); + + // Data for a session no Connect admitted. + let mut unadmitted = session(300); + unadmitted.assume_connected(0); + let reliable = CultNetRudpSendOptions { + reliable: true, + ..Default::default() + }; + send_raw( + &mut server, + &unadmitted.send("schema", vec![1], reliable.clone())?, + )?; + assert_eq!(server.packets_dropped(), 2); + + // A moved flow re-sends Connect from a socket that never hears the Accept. + // Each repeat re-sends the Accept still awaiting acknowledgement and queues + // nothing, so the storm neither errors nor grows the session's queue. + let mut stormer = session(102); + let connect_packet = stormer.create_connect(0, Vec::new())?; + for _ in 0..200 { + send_raw(&mut server, &connect_packet)?; + } + assert_eq!(server.packets_dropped(), 2); + assert_eq!(server.session_count(), 2); + clock.set(60_000 + 1_000); + assert_eq!( + server.maintain()?.packets_resent, + 1, + "one Accept awaits acknowledgement, however many Connects repeated" + ); + + // A packet its own admitted session refuses ends that session, not the loop. + stormer.assume_connected(0); + let mut poison = stormer.send("schema", vec![1], reliable)?; + poison.fragment_count = 2; + poison.fragment_id = 0; + send_raw(&mut server, &poison)?; + assert_eq!(server.packets_dropped(), 3); + assert_eq!(server.session_count(), 1); + // ...and the refused client is told, after the Accepts its storm drew. + raw.set_read_timeout(Some(Duration::from_millis(200)))?; + let mut buffer = vec![0_u8; 65_535]; + let mut told = false; + while let Ok(received) = raw.recv(&mut buffer) { + told |= cultnet_rs::decode_rudp_packet(&buffer[..received])?.packet_type + == cultnet_rs::CultNetRudpPacketType::Disconnect; + } + assert!(told, "the refused client must be sent a goodbye"); + + send( + &mut real, + &CultNetMessage::DocumentPutRaw { + message_id: "after-storm".into(), + document: document("real", vec![9]), + }, + )?; + for _ in 0..20 { + server.poll_once()?; + if sink.0.lock().unwrap().receipts.len() == 1 { + break; + } + } + assert_eq!(sink.0.lock().unwrap().receipts.len(), 1); + Ok(()) +} + +/// A peer driven packet by packet, so a test decides what it receives and what +/// it acknowledges. +struct RawPeer { + socket: UdpSocket, + target: SocketAddr, + session: cultnet_rs::CultNetRudpSession, +} + +impl RawPeer { + fn connect( + server: &mut CultMeshRudpDocumentServer, + connection_id: u32, + ) -> Result { + let socket = UdpSocket::bind("127.0.0.1:0")?; + socket.set_read_timeout(Some(Duration::from_millis(50)))?; + let mut peer = Self { + socket, + target: server.local_addr()?, + session: cultnet_rs::CultNetRudpSession::new(cultnet_rs::CultNetRudpSessionOptions { + connection_id, + initial_sequence: Some(100), + resend_delay_ms: 10_000, + max_pending_reliable_packets: Some(64), + }), + }; + let connect = peer.session.create_connect(0, Vec::new())?; + peer.send_packet(&connect)?; + server.poll_once()?; + let accept = peer.receive().expect("the server accepts the connect"); + assert_eq!( + accept.packet_type, + cultnet_rs::CultNetRudpPacketType::Accept + ); + peer.session.receive(&accept, 1)?; + Ok(peer) + } + + fn send_packet(&self, packet: &cultnet_rs::CultNetRudpPacket) -> Result<()> { + self.socket + .send_to(&cultnet_rs::encode_rudp_packet(packet)?, self.target)?; + Ok(()) + } + + /// Sends `message` reliably and in order; returns its sequences. + fn send(&mut self, message: &CultNetMessage) -> Result> { + let payload = encode_cultnet_message_to_vec(message, CultNetWireContract::CultNetSchemaV0)?; + let options = cultnet_rs::CultNetRudpSendOptions { + reliable: true, + ordered: true, + sequenced: false, + now_ms: 2, + reliable_expire_after_ms: None, + }; + let packets = self + .session + .send_many("schema", payload, options, Some(1200))?; + for packet in &packets { + self.send_packet(packet)?; + } + Ok(packets.iter().map(|packet| packet.sequence).collect()) + } + + fn receive(&self) -> Option { + let mut wire = vec![0_u8; 65_535]; + let (bytes, _) = self.socket.recv_from(&mut wire).ok()?; + cultnet_rs::decode_rudp_packet(&wire[..bytes]).ok() + } + + /// Every packet waiting, none of them processed or acknowledged. + fn drain(&self) -> Vec { + std::iter::from_fn(|| self.receive()).collect() + } +} + +/// Whether `packet`'s acknowledgement fields cover `sequence`. +fn acknowledges(packet: &cultnet_rs::CultNetRudpPacket, sequence: u32) -> bool { + packet.ack == sequence + || (0..32).any(|bit| { + packet.ack_mask & (1 << bit) != 0 + && packet.ack > bit + && packet.ack - bit - 1 == sequence + }) +} + +/// The refusal is unreliable and unordered: a peer missing an earlier reliable +/// packet from the server still receives it. An ordered refusal would wait +/// behind the gap for a resend that never comes, because the session ends with it. +#[test] +fn a_refusal_reaches_a_peer_missing_an_earlier_packet() -> Result<()> { + let mut server = server( + Default::default(), + Clock::new(71_000), + Sink::fail_once(), + Source::documents(vec![document("held", vec![1, 2, 3])]), + )?; + let mut peer = RawPeer::connect(&mut server, 78)?; + + // The snapshot reply is lost: the peer never sees it, so its ordered + // stream from the server has a gap. + peer.send(&CultNetMessage::SnapshotRequest { + message_id: "lost".into(), + schema_ids: None, + record_keys: None, + })?; + assert_eq!(server.poll_once()?, CultMeshRudpPollOutcome::Handled); + assert!( + !peer.drain().is_empty(), + "fixture: the server sent the reply that is lost" + ); + + peer.send(&CultNetMessage::DocumentPutRaw { + message_id: "refused".into(), + document: document("refused", vec![4, 5, 6]), + })?; + assert!(matches!( + server.poll_once()?, + CultMeshRudpPollOutcome::ApplicationRejected(_) + )); + let mut delivered = Vec::new(); + let mut disconnected = false; + for packet in peer.drain() { + let result = peer.session.receive(&packet, 3)?; + delivered.extend(result.delivered); + disconnected |= result.disconnected; + } + let refusals: Vec<_> = delivered + .iter() + .map(|frame| { + decode_cultnet_message_from_slice(&frame.payload, CultNetWireContract::CultNetSchemaV0) + }) + .collect::>()?; + assert_eq!( + refusals, + vec![CultNetMessage::Error { + error: "the catalog refused the document".into(), + code: None, + details: None, + }] + ); + assert!(disconnected, "the refusal is followed by a goodbye"); + Ok(()) +} + +/// The peer's reliable queue is full to the brim: an 8-fragment reply the peer +/// never acknowledges fills a queue of 8 exactly. The next reply cannot be +/// queued, and its refusal still reaches the peer, because it takes no room in +/// that queue; it acknowledges nothing the peer sent. +#[test] +fn a_refusal_reaches_a_peer_whose_queue_is_full_to_the_brim() -> Result<()> { + let options = CultMeshRudpDocumentServerOptions { + max_fragment_bytes: 100, + max_pending_reliable_packets_per_session: 8, + max_snapshot_response_bytes: 8192, + ..Default::default() + }; + let source = Source::documents(vec![document_served_at("q1", 800)?]); + let mut server = server(options, Clock::new(74_000), Sink::default(), source)?; + let mut peer = RawPeer::connect(&mut server, 79)?; + peer.send(&CultNetMessage::SnapshotRequest { + message_id: "a".into(), + schema_ids: None, + record_keys: None, + })?; + assert_eq!(server.poll_once()?, CultMeshRudpPollOutcome::Handled); + let unacknowledged = peer + .drain() + .into_iter() + .filter(|packet| packet.packet_type == cultnet_rs::CultNetRudpPacketType::Data) + .count(); + assert_eq!( + unacknowledged, 8, + "fixture: the first reply fills the queue exactly" + ); + + let refused = peer.send(&CultNetMessage::SnapshotRequest { + message_id: "b".into(), + schema_ids: None, + record_keys: None, + })?; + let CultMeshRudpPollOutcome::ApplicationRejected(rejection) = server.poll_once()? else { + panic!("the second reply cannot be queued"); + }; + assert!( + matches!( + rejection.reason, + CultMeshRudpRejectionReason::ResponseQueueFailed(_) + ), + "{:?}", + rejection.reason + ); + let arrived = peer.drain(); + let mut parts: Vec<_> = arrived + .iter() + .filter(|packet| { + packet.packet_type == cultnet_rs::CultNetRudpPacketType::Data + && packet.channel_id == "schema" + && !packet.reliable + }) + .collect(); + assert!(!parts.is_empty(), "the refusal reaches the peer"); + for part in &parts { + assert!( + refused + .iter() + .all(|sequence| !acknowledges(part, *sequence)), + "the refusal acknowledges the refused request: ack {} mask {:#x}", + part.ack, + part.ack_mask + ); + } + parts.sort_by_key(|part| part.fragment_index); + let payload: Vec = parts.iter().flat_map(|part| part.payload.clone()).collect(); + assert_eq!( + decode_cultnet_message_from_slice(&payload, CultNetWireContract::CultNetSchemaV0)?, + CultNetMessage::Error { + error: "the snapshot response could not be queued".into(), + code: None, + details: None, + } + ); + assert!( + arrived + .iter() + .any(|packet| packet.packet_type == cultnet_rs::CultNetRudpPacketType::Disconnect), + "the refusal is followed by a goodbye" + ); + Ok(()) +} + +/// A snapshot the reliable queue cannot take is answered with a refusal, not +/// left to time out: the refusal needs no room in that queue. +#[test] +fn a_snapshot_the_queue_cannot_take_is_answered() -> Result<()> { + let options = CultMeshRudpDocumentServerOptions { + max_fragment_bytes: 100, + max_pending_reliable_packets_per_session: 8, + max_snapshot_response_bytes: 8192, + ..Default::default() + }; + // Each document alone is served in 800 bytes, eight fragments; both need sixteen. + let source = Source::documents(vec![ + document_served_at("q1", 800)?, + document_served_at("q2", 800)?, + ]); + let mut server = server(options, Clock::new(72_000), Sink::default(), source)?; + let mut client = client(server.local_addr()?, 151)?; + connect(&mut server, &mut [&mut client])?; + let receipt = send_reliable( + &mut client, + &CultNetMessage::SnapshotRequest { + message_id: "both".into(), + schema_ids: None, + record_keys: None, + }, + )?; + let mut rejection = None; + for _ in 0..100 { + if let CultMeshRudpPollOutcome::ApplicationRejected(found) = server.poll_once()? { + rejection = Some(found); + break; + } + client.receive_once()?; + } + let rejection = rejection.expect("the response cannot be queued"); + assert!( + matches!( + rejection.reason, + CultMeshRudpRejectionReason::ResponseQueueFailed(_) + ), + "{:?}", + rejection.reason + ); + assert_eq!( + refusal_seen_by(&mut client, &receipt)?, + "the snapshot response could not be queued" + ); + Ok(()) +} + +/// A response too large for any datagram fails with the kernel's EMSGSIZE. The +/// caller's rejection and the peer's goodbye both carry its fixed name, never +/// the platform's text, and the peer is sent no refusal. +#[test] +fn a_response_that_is_too_large_to_send_is_named_emsgsize() -> Result<()> { + let options = CultMeshRudpDocumentServerOptions { + max_fragment_bytes: 70_000, + ..Default::default() + }; + let source = Source::documents(vec![document("big", vec![7; 66_000])]); + let mut server = server(options, Clock::new(73_000), Sink::default(), source)?; + let mut client = client(server.local_addr()?, 152)?; + connect(&mut server, &mut [&mut client])?; + send_reliable( + &mut client, + &CultNetMessage::SnapshotRequest { + message_id: "big".into(), + schema_ids: None, + record_keys: None, + }, + )?; + let mut rejection = None; + for _ in 0..100 { + if let CultMeshRudpPollOutcome::ApplicationRejected(found) = server.poll_once()? { + rejection = Some(found); + break; + } + } + assert_eq!( + rejection.expect("the response can never be sent").reason, + CultMeshRudpRejectionReason::ResponseSendFailed("EMSGSIZE") + ); + let mut frames = 0; + for _ in 0..500 { + if client.receive_once()?.is_some() { + frames += 1; + } + if !client.connected() { + break; + } + thread::sleep(Duration::from_millis(1)); + } + assert_eq!(frames, 0, "no refusal is sent to an unreachable peer"); + assert_eq!( + client.disconnect_reason(), + Some(&b"packet could not be sent: EMSGSIZE"[..]) + ); + Ok(()) +} diff --git a/packages/cultmesh-ts/README.md b/packages/cultmesh-ts/README.md index d3fe565b..de7b2794 100644 --- a/packages/cultmesh-ts/README.md +++ b/packages/cultmesh-ts/README.md @@ -411,9 +411,11 @@ payload binary normalization, and MessagePack decode behind the same `CultMeshDocumentHandle` shape as local documents. The helper prefers an exact schema id match and falls back to the requested record key, so runtimes that alias the same logical document through different generated schema names can -still read the publication with one CultMesh call. Pass a CultCache document -definition instead of a raw schema id when you want a typed handle whose -`latest()` result is parsed through that definition. +still read the publication with one CultMesh call. The handle takes a CultCache +document definition, and its `latest()` result is read and parsed through that +definition: a payload is a `DocumentPayload`, which only +`decodeDocumentPayload(definition, payload)` reads, so no document is read +without the definition that says how its bytes are laid out. Use `node.syncDocumentFromPeerSnapshot(...)` or `CultMesh.syncDocumentFromPeerSnapshot(...)` when a runtime should hydrate its @@ -424,8 +426,8 @@ keep using `node.document(aliasDefinition, key)` and explicitly select `authoritativeWriter()`, `predictionWriter()`, or `observe()` without re-threading the RUDP peer. -The same typed-definition overload is available for -`CultMesh.documentFromStore(...)` and `CultMesh.documentFromSingleFile(...)`, so +`CultMesh.documentFromStore(...)` and `CultMesh.documentFromSingleFile(...)` take +the same definition, so local schema publications can be read as typed reactive documents without manually pulling records, decoding MessagePack, or parsing the payload. When the caller wants source selection to be configuration, use @@ -514,3 +516,31 @@ negotiation, watch callbacks, and latest-frame cursor contracts for non-C# clients. The native C# path owns shared-memory rings and GPU-handle integration points. CultCache page append/readback remains the durable recording or nonlocal fallback. + +## Content Chunks over HTTP(S) + +`cultmesh-ts/content` answers the C# HTTPS connector's request, `GET` or `HEAD` +`?chunkHash=&recordKey=`. The mount path is the host's; the +handler reads only the query. Every chunk is hashed against its name before a +byte is sent, so a corrupt or swapped file answers 500 and never leaves the +process, and chunks are never served by path. + +The directory store reads a flat `/` layout. The publisher writes it +from `packContent`'s chunks (an artifact of one chunk is the file named by its +content hash). The store never writes, lists or caches. TLS and concurrency +bounds belong to the host: memory is at most two buffers of `maxChunkBytes` per +in-flight request (the store's, and the private copy that is hashed and sent, so a +host store may reuse its buffer). `onServerFault` reports every 500 (`hash-mismatch`, `too-large`, +`store-error`) for health. + +```ts +import { readFileSync } from "node:fs"; +import { createServer } from "node:https"; +import { createContentChunkHandler, createDirectoryChunkStore, toNodeListener } from "cultmesh-ts/content"; + +const handler = createContentChunkHandler(createDirectoryChunkStore("/srv/content"), { + onServerFault: fault => console.error("chunk fault", fault.kind, fault.chunkHash), +}); +createServer({ key: readFileSync("key.pem"), cert: readFileSync("cert.pem") }, toNodeListener(handler)) + .listen(8443, "127.0.0.1"); +``` diff --git a/packages/cultmesh-ts/native/MANIFEST.txt b/packages/cultmesh-ts/native/MANIFEST.txt new file mode 100644 index 00000000..074975f0 --- /dev/null +++ b/packages/cultmesh-ts/native/MANIFEST.txt @@ -0,0 +1,9 @@ +msquic.version=2.5.9 +msquic.windows.source=https://www.nuget.org/api/v2/package/Microsoft.Native.Quic.MsQuic.OpenSSL/2.5.9 sha256=FEE9A664C0052DEEE66D40CED2E19BFE20BC423DE5AE5234CFC0CEBC22CA3F5E +msquic.linux.source=https://packages.microsoft.com/debian/13/prod/pool/main/libm/libmsquic/libmsquic_2.5.9_amd64.deb sha256=1baa61ade0b7b4a99f6dcb6b00d9aedb12b5566d00918a325be7425e878e51ba +bridge.commit=e5bf1c9243acb6b76de72c7864e3b79214177199 +build.workflow_run=https://github.com/GameCult/CultLib/actions/runs/35912386052 +build.release=none (TEMPORARY push-to-quic-cut6 trigger, no tag; see quic-native.yml history for the tagged release path) +build.win32-x64.host=windows-2025-vs2026, cl.exe (MSVC) 19.51.36256.0 +build.linux-x64.host=ubuntu-24.04, container debian:13@sha256:f324c7ff54321e8d9c588493a20244965938ce0aa50bbd1022d38010e9ffc4b1, g++ (Debian 14.2.0-19) 14.2.0 +date=2026-09-23T19:54:08Z diff --git a/packages/cultmesh-ts/native/MSQUIC-LICENSE.txt b/packages/cultmesh-ts/native/MSQUIC-LICENSE.txt new file mode 100644 index 00000000..63447fd8 --- /dev/null +++ b/packages/cultmesh-ts/native/MSQUIC-LICENSE.txt @@ -0,0 +1,21 @@ +Copyright (c) Microsoft Corporation. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/cultmesh-ts/native/SHA256SUMS b/packages/cultmesh-ts/native/SHA256SUMS new file mode 100644 index 00000000..a1233d52 --- /dev/null +++ b/packages/cultmesh-ts/native/SHA256SUMS @@ -0,0 +1,4 @@ +9dae391a44d59f12e19baa08a44d86c7e8b4916ca5d40007a42d65913ce0896f *win32-x64/gamecult_mesh_quic_native.dll +c17c65813fe007eb486a5270d244f3659261355795b27abb99bd19ff77539263 *win32-x64/msquic.dll +0ee3d28324c79a5b0135368187e7bd75c1969ad94fc6985755e81de4ec96e430 *linux-x64/libgamecult_mesh_quic_native.so +c09a72f9b3bfd9119044b305c6064731c1e1879411e6f54276474fb58b524b68 *linux-x64/libmsquic.so.2 diff --git a/packages/cultmesh-ts/native/linux-x64/libgamecult_mesh_quic_native.so b/packages/cultmesh-ts/native/linux-x64/libgamecult_mesh_quic_native.so new file mode 100644 index 00000000..7363d1cb Binary files /dev/null and b/packages/cultmesh-ts/native/linux-x64/libgamecult_mesh_quic_native.so differ diff --git a/packages/cultmesh-ts/native/linux-x64/libmsquic.so.2 b/packages/cultmesh-ts/native/linux-x64/libmsquic.so.2 new file mode 100644 index 00000000..e14af169 Binary files /dev/null and b/packages/cultmesh-ts/native/linux-x64/libmsquic.so.2 differ diff --git a/packages/cultmesh-ts/native/win32-x64/gamecult_mesh_quic_native.dll b/packages/cultmesh-ts/native/win32-x64/gamecult_mesh_quic_native.dll new file mode 100644 index 00000000..da7be3c0 Binary files /dev/null and b/packages/cultmesh-ts/native/win32-x64/gamecult_mesh_quic_native.dll differ diff --git a/packages/cultmesh-ts/native/win32-x64/msquic.dll b/packages/cultmesh-ts/native/win32-x64/msquic.dll new file mode 100644 index 00000000..71107c2c Binary files /dev/null and b/packages/cultmesh-ts/native/win32-x64/msquic.dll differ diff --git a/packages/cultmesh-ts/package.json b/packages/cultmesh-ts/package.json index 0ca8afb3..4d454b24 100644 --- a/packages/cultmesh-ts/package.json +++ b/packages/cultmesh-ts/package.json @@ -9,16 +9,22 @@ "types": "./dist/index.d.ts", "require": "./dist/index.js", "default": "./dist/index.js" + }, + "./content": { + "types": "./dist/content.d.ts", + "require": "./dist/content.js", + "default": "./dist/content.js" } }, "files": [ - "dist" + "dist", + "native" ], "scripts": { "build": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json", "prepack": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json", "typecheck": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json --pretty false", - "test": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --test dist-test/test/*.test.js" + "test": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json && node ../../node_modules/typescript/bin/tsc -p tsconfig.test.json && node --expose-gc --test dist-test/test/*.test.js" }, "keywords": [ "cultmesh", @@ -39,12 +45,12 @@ }, "homepage": "https://github.com/GameCult/CultLib/tree/main/packages/cultmesh-ts#readme", "engines": { - "node": ">=18" + "node": ">=20" }, "dependencies": { - "@msgpack/msgpack": "^3.1.2", "@gamecult/cultcache-ts": "^0.14.0", - "cultnet-ts": "^0.2.0" + "cultnet-ts": "^0.2.0", + "koffi": "3.3.0" }, "devDependencies": { "@types/node": "^24.0.0", diff --git a/packages/cultmesh-ts/src/content.ts b/packages/cultmesh-ts/src/content.ts new file mode 100644 index 00000000..a0f3f06d --- /dev/null +++ b/packages/cultmesh-ts/src/content.ts @@ -0,0 +1,112 @@ +import { constants } from "node:fs"; +import { open } from "node:fs/promises"; +import type { IncomingMessage, ServerResponse } from "node:http"; +import { join } from "node:path"; +import { DEFAULT_CHUNK_SIZE_BYTES, EMPTY_SHA256, chunkRecordKey, isNullOrWhiteSpaceCSharp, parseSha256Hex, sha256Hex } from "cultnet-ts/content"; + +/** What the provider reads of a request. The path and the headers are never read: the route is the query alone. */ +export interface ContentChunkRequest { method: string; url: string; } +export interface ContentChunkAnswer { status: number; headers: Readonly>; body?: Uint8Array; } + +/** The port a host implements. Whatever it returns is hashed before a byte is served. `chunkHash` is canonical lowercase hex. */ +export interface ContentChunkStore { readChunk(chunkHash: string, maxBytes: number): Promise; } + +export interface ContentChunkHandlerOptions { + /** Largest chunk served, and the most memory one in-flight request holds. Defaults to the packer's chunk size. */ + maxChunkBytes?: number; + /** Called for every 500 answer; a throwing hook leaves the answer unchanged. */ + onServerFault?: (fault: { chunkHash: string; kind: "hash-mismatch" | "too-large" | "store-error"; error?: unknown }) => void; +} + +/** A store's refusal to read a chunk larger than `maxBytes`. */ +export class ContentChunkTooLargeError extends Error { + constructor(readonly sizeBytes: number) { super("Chunk exceeds the size bound."); } +} + +const errorHeaders = { "Content-Type": "text/plain; charset=utf-8", "X-Content-Type-Options": "nosniff", "Cache-Control": "no-store", "Access-Control-Allow-Origin": "*" }; +const reasons: Record = { 400: "invalid chunk request", 404: "chunk not found", 405: "method not allowed", 500: "chunk unavailable" }; + +function refusal(status: number, extra: Record = {}): ContentChunkAnswer { + const body = new TextEncoder().encode(reasons[status]); + return { status, headers: { ...errorHeaders, ...extra, "Content-Length": String(body.length) }, body }; +} + +const chunkAnswer = (body: Uint8Array): ContentChunkAnswer => ({ + status: 200, + headers: { + "Content-Length": String(body.length), + "Content-Type": "application/octet-stream", + "X-Content-Type-Options": "nosniff", + "Cache-Control": "public, max-age=31536000, immutable, no-transform", + "Access-Control-Allow-Origin": "*", + }, + body, +}); + +/** + * The HTTP answer to `?chunkHash=&recordKey=`, as the C# connector asks it. Every chunk is hashed against its + * name before the first byte is sent, GET and HEAD alike, and nothing is cached between requests. + */ +export function createContentChunkHandler(store: ContentChunkStore, options: ContentChunkHandlerOptions = {}): (request: ContentChunkRequest) => Promise { + const maxChunkBytes = options.maxChunkBytes ?? DEFAULT_CHUNK_SIZE_BYTES; + if (!Number.isInteger(maxChunkBytes) || maxChunkBytes < 1 || maxChunkBytes > 2147483647) throw new RangeError("maxChunkBytes must be an integer in 1..2147483647."); + + const fault = (chunkHash: string, kind: "hash-mismatch" | "too-large" | "store-error", error?: unknown): ContentChunkAnswer => { + try { options.onServerFault?.({ chunkHash, kind, error }); } catch { /* a hook cannot change the answer */ } + return refusal(500); + }; + + const serve = async (url: string): Promise => { + let hex: string; + try { + const query = new URL(url, "http://provider.invalid").searchParams; + const [hash, ...otherHashes] = query.getAll("chunkHash"); + const [key = "", ...otherKeys] = query.getAll("recordKey"); + hex = parseSha256Hex(hash ?? ""); + if (otherHashes.length || otherKeys.length || (!isNullOrWhiteSpaceCSharp(key) && key !== chunkRecordKey(hex))) return refusal(400); + } catch { return refusal(400); } + if (hex === EMPTY_SHA256) return chunkAnswer(new Uint8Array()); + let bytes: Uint8Array | undefined; + try { bytes = await store.readChunk(hex, maxChunkBytes); } + catch (error) { return fault(hex, error instanceof ContentChunkTooLargeError ? "too-large" : "store-error", error); } + if (!bytes) return refusal(404); + if (bytes.length > maxChunkBytes) return fault(hex, "too-large"); + // The copy is the provider's own: the bytes hashed are exactly the bytes sent, whatever the store does with its buffer afterwards. + const owned = new Uint8Array(bytes); + return await sha256Hex(owned) === hex ? chunkAnswer(owned) : fault(hex, "hash-mismatch"); + }; + + return async ({ method, url }) => { + if (method !== "GET" && method !== "HEAD") return refusal(405, { Allow: "GET, HEAD" }); + const { body, ...answer } = await serve(url); + return method === "GET" ? { ...answer, body } : answer; + }; +} + +/** A read-only flat directory (opened non-blocking, so a FIFO named by a hash is refused by fstat instead of holding a thread): the chunk whose hash is `` lives in `/`. It writes, lists and caches nothing. */ +export function createDirectoryChunkStore(root: string): ContentChunkStore { + return { + async readChunk(chunkHash, maxBytes) { + if (parseSha256Hex(chunkHash) !== chunkHash) throw new Error("chunkHash must be canonical lowercase hex."); + const file = await open(join(root, chunkHash), constants.O_RDONLY | constants.O_NONBLOCK).catch(error => { if (error?.code === "ENOENT") return undefined; throw error; }); + if (!file) return undefined; + try { + const stat = await file.stat(); + if (!stat.isFile()) throw new Error("Chunk is not a regular file."); + if (stat.size > maxBytes) throw new ContentChunkTooLargeError(stat.size); + const bytes = new Uint8Array(stat.size); + const { bytesRead } = await file.read(bytes, 0, stat.size, 0); + return bytes.subarray(0, bytesRead); + } finally { await file.close(); } + }, + }; +} + +/** Mounts a handler on `node:http` or `node:https`: method and URL in, status, headers and body out. A server request always has both. */ +export const toNodeListener = (handler: (request: ContentChunkRequest) => Promise) => + (req: IncomingMessage, res: ServerResponse): void => { + handler({ method: req.method!, url: req.url! }).catch(() => refusal(500)).then(({ status, headers, body }) => { + res.writeHead(status, headers); + res.end(body); + }); + }; diff --git a/packages/cultmesh-ts/src/index.ts b/packages/cultmesh-ts/src/index.ts index e9fbb8be..810e6919 100644 --- a/packages/cultmesh-ts/src/index.ts +++ b/packages/cultmesh-ts/src/index.ts @@ -1,5 +1,5 @@ import { createSocket, type Socket } from "node:dgram"; -import { decode, encode } from "@msgpack/msgpack"; +import { decodeWireValue, encodeWireValue } from "cultnet-ts/wire"; import { CultCache, @@ -8,12 +8,15 @@ import { type CacheBackingStore, type CultCacheEnvelope, type CultCacheDocumentValue, + type DocumentPayload, + decodeDocumentPayload, } from "@gamecult/cultcache-ts"; import { CultNetDocumentRegistry, CultNetRudpSession, CultNetPeer, CultNetRudpSocketTransportConnection, + rudpClientBindHost, CultNetSchemaCatalog, CultNetShardCatalog, cultNetBuiltinSchemaRegistry, @@ -21,7 +24,9 @@ import { defineCultNetDocumentBinding, encodeCultNetMessageForWire, encodeRudpPacket, + isPermanentSendError, parseCultNetMessage, + sendRudpDatagram, type CultNetErrorMessage, type CultNetDocumentBinding, type CultNetMessage, @@ -29,11 +34,24 @@ import { type CultNetOperationResponseMessage, type CultNetRawDocumentRecord, type CultNetReconnectPolicy, + type CultNetRudpPacket, type CultNetSchemaCatalogOptions, type CultNetSnapshotResponseRawMessage, type CultNetWireContract, } from "cultnet-ts"; +import { + CultMeshQuicRealtimeConnector, + CultMeshQuicRealtimeProvider, + CultMeshQuicRealtimeSessionManager, + parseQuicRealtimeEndpoint, + type CultMeshQuicRealtimeConnectorOptions, + type CultMeshQuicRealtimeProviderOptions, + type CultMeshQuicRealtimeSessionManagerOptions, +} from "./realtime-quic"; + +export * from "./realtime-wire"; +export * from "./realtime-quic"; export * from "./provider-session"; export * from "./provider-session-wire"; export * from "./provider-rudp-transport"; @@ -110,7 +128,7 @@ export type CultMeshDocumentPublicationSource = }; export interface CultMeshPublicationDocumentBinding { - readonly schema: string | AnyCultCacheDocumentDefinition; + readonly schema: AnyCultCacheDocumentDefinition; readonly recordKey: string; readonly documentId?: string; readonly sourceId?: string; @@ -2574,54 +2592,29 @@ export function cultMeshDocumentFromCache; export function cultMeshDocumentFromStore( store: CacheBackingStore, definition: TDefinition, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - pollMs?: number; - }, -): CultMeshDocumentHandle>; -export function cultMeshDocumentFromStore( - store: CacheBackingStore, - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, options: { documentId?: string; routeHint?: CultMeshRouteHint; sourceId?: string; pollMs?: number; } = {}, -): CultMeshDocumentHandle { - const schema = typeof schemaOrDefinition === "string" - ? { schemaId: schemaOrDefinition } - : cultMeshSchemaFromDefinition(schemaOrDefinition); +): CultMeshDocumentHandle> { + const schema = cultMeshSchemaFromDefinition(definition); const resolvedSchemaId = schema.schemaId ?? schema.type; if (!resolvedSchemaId) { throw new Error("CultMesh store document requires a schema id or document type."); } - if (typeof schemaOrDefinition === "string") { - requireNonEmpty(schemaOrDefinition, "schemaId"); - } const documentId = options.documentId ?? resolvedSchemaId; - const read = async () => { + const read = async (): Promise> => { const records = await store.pullAll(); - const record = resolveCultMeshStoreDocumentRecord(records, schema, schemaOrDefinition); + const record = resolveCultMeshStoreDocumentRecord(records, schema, definition); if (!record) { throw new Error(`CultMesh store document '${documentId}' did not contain schema ${resolvedSchemaId}.`); } - return parseCultMeshDocumentValue(schemaOrDefinition, decode(record.payload)); + return decodeDocumentPayload(definition, record.payload); }; return cultMeshDocument( @@ -2638,77 +2631,28 @@ export function cultMeshDocumentFromStore( ); } -export function cultMeshDocumentFromSingleFile( - path: string, - schemaId: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - pollMs?: number; - }, -): CultMeshDocumentHandle; export function cultMeshDocumentFromSingleFile( path: string, definition: TDefinition, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - pollMs?: number; - }, -): CultMeshDocumentHandle>; -export function cultMeshDocumentFromSingleFile( - path: string, - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, options: { documentId?: string; routeHint?: CultMeshRouteHint; sourceId?: string; pollMs?: number; } = {}, -): CultMeshDocumentHandle { +): CultMeshDocumentHandle> { requireNonEmpty(path, "path"); const store = new SingleFileMessagePackBackingStore(path); - const resolvedOptions = { + return cultMeshDocumentFromStore(store, definition, { ...options, routeHint: options.routeHint ?? cultMeshRouteHint("shared-memory", path), - }; - return typeof schemaOrDefinition === "string" - ? cultMeshDocumentFromStore(store, schemaOrDefinition, resolvedOptions) - : cultMeshDocumentFromStore(store, schemaOrDefinition, resolvedOptions); + }); } -export function cultMeshDocumentFromPeerSnapshot( - peer: CultNetPeer | (() => CultNetPeer | Promise), - schemaId: string, - recordKey: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - timeoutMs?: number; - pollMs?: number; - messageIdPrefix?: string; - }, -): CultMeshDocumentHandle; export function cultMeshDocumentFromPeerSnapshot( peer: CultNetPeer | (() => CultNetPeer | Promise), definition: TDefinition, recordKey: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - timeoutMs?: number; - pollMs?: number; - messageIdPrefix?: string; - }, -): CultMeshDocumentHandle>; -export function cultMeshDocumentFromPeerSnapshot( - peer: CultNetPeer | (() => CultNetPeer | Promise), - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, - recordKey: string, options: { documentId?: string; routeHint?: CultMeshRouteHint; @@ -2717,44 +2661,34 @@ export function cultMeshDocumentFromPeerSnapshot( pollMs?: number; messageIdPrefix?: string; } = {}, -): CultMeshDocumentHandle { - const schema = typeof schemaOrDefinition === "string" - ? { schemaId: schemaOrDefinition } - : cultMeshSchemaFromDefinition(schemaOrDefinition); +): CultMeshDocumentHandle> { + const schema = cultMeshSchemaFromDefinition(definition); const resolvedSchemaId = schema.schemaId ?? schema.type; if (!resolvedSchemaId) { throw new Error("CultMesh peer snapshot document requires a schema id or document type."); } - if (typeof schemaOrDefinition === "string") { - requireNonEmpty(schemaOrDefinition, "schemaId"); - } requireNonEmpty(recordKey, "recordKey"); const documentId = options.documentId ?? recordKey; - const read = async () => - parseCultMeshDocumentValue( - schemaOrDefinition, - decodeCultNetRawDocumentPayload( - await requestCultNetRawSnapshotDocument( - peer, - resolvedSchemaId, - recordKey, - { - timeoutMs: options.timeoutMs, - messageIdPrefix: options.messageIdPrefix ?? documentId, - accepts: typeof schemaOrDefinition === "string" - ? undefined - : record => { - try { - schemaOrDefinition.schema.parse(decodeCultNetRawDocumentPayload(record)); - return true; - } catch { - return false; - } - }, - }, - ), - ), + const read = async (): Promise> => { + const record = await requestCultNetRawSnapshotDocument( + peer, + resolvedSchemaId, + recordKey, + { + timeoutMs: options.timeoutMs, + messageIdPrefix: options.messageIdPrefix ?? documentId, + accepts: candidate => { + try { + decodeDocumentPayload(definition, candidate.payload); + return true; + } catch { + return false; + } + }, + }, ); + return decodeDocumentPayload(definition, record.payload); + }; return cultMeshDocument( documentId, @@ -2770,36 +2704,10 @@ export function cultMeshDocumentFromPeerSnapshot( ); } -export function cultMeshDocumentFromPublication( - source: CultMeshDocumentPublicationSource, - schemaId: string, - recordKey: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - timeoutMs?: number; - pollMs?: number; - messageIdPrefix?: string; - }, -): CultMeshDocumentHandle; export function cultMeshDocumentFromPublication( source: CultMeshDocumentPublicationSource, definition: TDefinition, recordKey: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - timeoutMs?: number; - pollMs?: number; - messageIdPrefix?: string; - }, -): CultMeshDocumentHandle>; -export function cultMeshDocumentFromPublication( - source: CultMeshDocumentPublicationSource, - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, - recordKey: string, options: { documentId?: string; routeHint?: CultMeshRouteHint; @@ -2808,7 +2716,7 @@ export function cultMeshDocumentFromPublication( pollMs?: number; messageIdPrefix?: string; } = {}, -): CultMeshDocumentHandle { +): CultMeshDocumentHandle> { if (!source) { throw new Error("CultMesh publication source is required."); } @@ -2816,14 +2724,12 @@ export function cultMeshDocumentFromPublication( switch (source.kind) { case "live-publication": { - const schema = typeof schemaOrDefinition === "string" - ? { schemaId: schemaOrDefinition } - : cultMeshSchemaFromDefinition(schemaOrDefinition); + const schema = cultMeshSchemaFromDefinition(definition); const schemaId = schema.schemaId ?? schema.type; if (!schemaId) { throw new Error("CultMesh live publication document requires a schema id or document type."); } - const parse = (value: unknown) => parseCultMeshDocumentValue(schemaOrDefinition, value); + const parse = (value: unknown) => definition.schema.parse(value) as CultCacheDocumentValue; return cultMeshDocument( options.documentId ?? recordKey, schema, @@ -2843,51 +2749,28 @@ export function cultMeshDocumentFromPublication( ); } case "single-file": - return typeof schemaOrDefinition === "string" - ? cultMeshDocumentFromSingleFile(source.path, schemaOrDefinition, { - documentId: options.documentId ?? recordKey, - routeHint: options.routeHint, - sourceId: options.sourceId ?? recordKey, - pollMs: options.pollMs, - }) - : cultMeshDocumentFromSingleFile(source.path, schemaOrDefinition, { - documentId: options.documentId ?? recordKey, - routeHint: options.routeHint, - sourceId: options.sourceId ?? recordKey, - pollMs: options.pollMs, - }); + return cultMeshDocumentFromSingleFile(source.path, definition, { + documentId: options.documentId ?? recordKey, + routeHint: options.routeHint, + sourceId: options.sourceId ?? recordKey, + pollMs: options.pollMs, + }); case "store": - return typeof schemaOrDefinition === "string" - ? cultMeshDocumentFromStore(source.store, schemaOrDefinition, { - documentId: options.documentId ?? recordKey, - routeHint: options.routeHint, - sourceId: options.sourceId ?? recordKey, - pollMs: options.pollMs, - }) - : cultMeshDocumentFromStore(source.store, schemaOrDefinition, { - documentId: options.documentId ?? recordKey, - routeHint: options.routeHint, - sourceId: options.sourceId ?? recordKey, - pollMs: options.pollMs, - }); + return cultMeshDocumentFromStore(source.store, definition, { + documentId: options.documentId ?? recordKey, + routeHint: options.routeHint, + sourceId: options.sourceId ?? recordKey, + pollMs: options.pollMs, + }); case "peer-snapshot": - return typeof schemaOrDefinition === "string" - ? cultMeshDocumentFromPeerSnapshot(source.peer, schemaOrDefinition, recordKey, { - documentId: options.documentId ?? recordKey, - routeHint: options.routeHint ?? cultMeshRouteHint("network", source.endpoint ?? "CultNet snapshot"), - sourceId: options.sourceId ?? recordKey, - timeoutMs: options.timeoutMs, - pollMs: options.pollMs, - messageIdPrefix: options.messageIdPrefix, - }) - : cultMeshDocumentFromPeerSnapshot(source.peer, schemaOrDefinition, recordKey, { - documentId: options.documentId ?? recordKey, - routeHint: options.routeHint ?? cultMeshRouteHint("network", source.endpoint ?? "CultNet snapshot"), - sourceId: options.sourceId ?? recordKey, - timeoutMs: options.timeoutMs, - pollMs: options.pollMs, - messageIdPrefix: options.messageIdPrefix, - }); + return cultMeshDocumentFromPeerSnapshot(source.peer, definition, recordKey, { + documentId: options.documentId ?? recordKey, + routeHint: options.routeHint ?? cultMeshRouteHint("network", source.endpoint ?? "CultNet snapshot"), + sourceId: options.sourceId ?? recordKey, + timeoutMs: options.timeoutMs, + pollMs: options.pollMs, + messageIdPrefix: options.messageIdPrefix, + }); default: throw new Error(`Unsupported CultMesh publication source kind '${(source as { kind?: string }).kind}'.`); } @@ -2949,11 +2832,6 @@ export async function cultMeshSyncDocumentsFromPublication( if (!binding) { throw new Error("CultMesh publication binding is required."); } - if (typeof binding.schema === "string") { - throw new Error( - `CultMesh synced publication binding '${binding.recordKey}' requires a document definition, not only a schema id.`, - ); - } const resolvedSource = binding.source ?? (typeof source === "function" ? source(binding) : source); await node.syncDocumentFromPublication( @@ -3011,7 +2889,7 @@ export function cultMeshDocuments( } export function cultMeshPublicationDocument( - schema: string | AnyCultCacheDocumentDefinition, + schema: AnyCultCacheDocumentDefinition, recordKey: string, options: { documentId?: string; @@ -3053,33 +2931,19 @@ export function cultMeshDocumentsFromPublication( } const resolvedSource = binding.source ?? (typeof source === "function" ? source(binding) : source); - return typeof binding.schema === "string" - ? cultMeshDocumentFromPublication( - resolvedSource, - binding.schema, - binding.recordKey, - { - documentId: binding.documentId ?? binding.recordKey, - sourceId: binding.sourceId ?? binding.documentId ?? binding.recordKey, - routeHint: options.routeHint, - timeoutMs: options.timeoutMs, - pollMs: options.pollMs, - messageIdPrefix: options.messageIdPrefix, - }, - ) - : cultMeshDocumentFromPublication( - resolvedSource, - binding.schema, - binding.recordKey, - { - documentId: binding.documentId ?? binding.recordKey, - sourceId: binding.sourceId ?? binding.documentId ?? binding.recordKey, - routeHint: options.routeHint, - timeoutMs: options.timeoutMs, - pollMs: options.pollMs, - messageIdPrefix: options.messageIdPrefix, - }, - ); + return cultMeshDocumentFromPublication( + resolvedSource, + binding.schema, + binding.recordKey, + { + documentId: binding.documentId ?? binding.recordKey, + sourceId: binding.sourceId ?? binding.documentId ?? binding.recordKey, + routeHint: options.routeHint, + timeoutMs: options.timeoutMs, + pollMs: options.pollMs, + messageIdPrefix: options.messageIdPrefix, + }, + ); }), ); } @@ -4090,7 +3954,7 @@ export class CultMeshNode { messageIdPrefix: options.messageIdPrefix ?? key, accepts: record => { try { - definition.schema.parse(decodeCultNetRawDocumentPayload(record)); + decodeDocumentPayload(definition, record.payload); return true; } catch { return false; @@ -4241,11 +4105,16 @@ export interface CultMeshPeerCard { authorityLeaseId?: string; } -export interface CultMeshRudpDocumentPut { +/** + * A document put as `onDocumentPutRaw` receives it. `decoded` says which read the payload is ready for: `true` when the + * registry held a definition for `schemaId` and `payload` is the document read through it; `false` when it did not, and + * `payload` is the opaque `DocumentPayload`, untouched, for a handler that holds the definition itself to read with + * `decodeDocumentPayload`. Narrowing on `decoded` needs no cast in either branch. + */ +export type CultMeshRudpDocumentPut = { schemaId: string; recordKey: string; storedAt: string; - payload: unknown; sourceRuntimeId: string | null; sourceAgentId: string | null; sourceRole: string | null; @@ -4255,7 +4124,10 @@ export interface CultMeshRudpDocumentPut { family: string; port: number; }; -} +} & ( + | { readonly decoded: true; readonly payload: unknown } + | { readonly decoded: false; readonly payload: DocumentPayload } +); export interface CultMeshRudpDocumentReceipt { binding: CultNetDocumentBinding; @@ -4268,6 +4140,30 @@ export interface CultMeshRudpDocumentReceipt Promise | CultCache; @@ -4285,6 +4181,39 @@ export interface CultMeshRudpDocumentServerOptions extends CultMeshRudpSocketOpt sessionTimeoutMs?: number; } +/** Replies larger than one fragment are split into fragments of at most this many bytes. */ +export const CULTMESH_RUDP_DOCUMENT_SERVER_DEFAULT_MAX_FRAGMENT_BYTES = 1200; + +const RUDP_MAX_FRAGMENTS_PER_MESSAGE = 0xffff; + +/** CultNet parses no message id shorter than one character, so no reply is smaller. */ +const SHORTEST_MESSAGE_ID = "0"; + +/** + * A put the document server refused because it could never serve the document: + * the snapshot reply carrying it alone (`responseBytes`) would exceed the + * server's reply limits. + */ +export class CultMeshRudpUnservableDocumentError extends Error { + constructor( + readonly messageId: string, + readonly recordKey: string, + readonly responseBytes: number, + readonly maxPayloadBytes: number | undefined, + readonly fragmentCount: number, + readonly maxFragmentCount: number, + ) { + // The sentence names sizes only: it is sent to the peer, and a record key of + // any length would make the refusal itself too large to send. + super( + `Document can never be served: its reply is ${responseBytes} bytes in ` + + `${fragmentCount} fragments; limits are ${maxPayloadBytes ?? "unbounded"} bytes and ` + + `${maxFragmentCount} fragments.`, + ); + this.name = "CultMeshRudpUnservableDocumentError"; + } +} + export interface CultMeshRudpServerSession { readonly sessionId: string; readonly remote: { address: string; family: string; port: number }; @@ -4294,6 +4223,12 @@ export interface CultMeshRudpServerSession { export interface CultMeshRudpDocumentServer { readonly bind: { host: string; port: number }; + /** + * Datagrams that could not be sent to a peer. Each is that peer's lost datagram: a + * reliable packet stays pending and is resent, and no other peer is affected. A datagram + * that can never be sent as built is not counted here: it ends that peer's session. + */ + readonly sendFailures: number; start(): Promise; close(): void; } @@ -4318,6 +4253,11 @@ export interface CultMeshRudpEndpoint { } export interface CultMeshRudpSocketOptions { + /** + * Local address to bind. Unset, a server binds loopback, and a client binds + * loopback for a loopback endpoint and the unspecified address of the + * endpoint's family otherwise, so it can reach a remote host. + */ bindHost?: string; bindPort?: number; socket?: Socket; @@ -4951,106 +4891,36 @@ export class CultMesh { return cultMeshDocumentFromCache(cache, definition, key, options); } - public static documentFromStore( - store: CacheBackingStore, - schemaId: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - pollMs?: number; - }, - ): CultMeshDocumentHandle; public static documentFromStore( store: CacheBackingStore, definition: TDefinition, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - pollMs?: number; - }, - ): CultMeshDocumentHandle>; - public static documentFromStore( - store: CacheBackingStore, - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, options: { documentId?: string; routeHint?: CultMeshRouteHint; sourceId?: string; pollMs?: number; } = {}, - ): CultMeshDocumentHandle { - return typeof schemaOrDefinition === "string" - ? cultMeshDocumentFromStore(store, schemaOrDefinition, options) - : cultMeshDocumentFromStore(store, schemaOrDefinition, options); + ): CultMeshDocumentHandle> { + return cultMeshDocumentFromStore(store, definition, options); } - public static documentFromSingleFile( - path: string, - schemaId: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - pollMs?: number; - }, - ): CultMeshDocumentHandle; public static documentFromSingleFile( path: string, definition: TDefinition, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - pollMs?: number; - }, - ): CultMeshDocumentHandle>; - public static documentFromSingleFile( - path: string, - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, options: { documentId?: string; routeHint?: CultMeshRouteHint; sourceId?: string; pollMs?: number; } = {}, - ): CultMeshDocumentHandle { - return typeof schemaOrDefinition === "string" - ? cultMeshDocumentFromSingleFile(path, schemaOrDefinition, options) - : cultMeshDocumentFromSingleFile(path, schemaOrDefinition, options); + ): CultMeshDocumentHandle> { + return cultMeshDocumentFromSingleFile(path, definition, options); } - public static documentFromPeerSnapshot( - peer: CultNetPeer | (() => CultNetPeer | Promise), - schemaId: string, - recordKey: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - timeoutMs?: number; - pollMs?: number; - messageIdPrefix?: string; - }, - ): CultMeshDocumentHandle; public static documentFromPeerSnapshot( peer: CultNetPeer | (() => CultNetPeer | Promise), definition: TDefinition, recordKey: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - timeoutMs?: number; - pollMs?: number; - messageIdPrefix?: string; - }, - ): CultMeshDocumentHandle>; - public static documentFromPeerSnapshot( - peer: CultNetPeer | (() => CultNetPeer | Promise), - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, - recordKey: string, options: { documentId?: string; routeHint?: CultMeshRouteHint; @@ -5059,42 +4929,14 @@ export class CultMesh { pollMs?: number; messageIdPrefix?: string; } = {}, - ): CultMeshDocumentHandle { - return typeof schemaOrDefinition === "string" - ? cultMeshDocumentFromPeerSnapshot(peer, schemaOrDefinition, recordKey, options) - : cultMeshDocumentFromPeerSnapshot(peer, schemaOrDefinition, recordKey, options); + ): CultMeshDocumentHandle> { + return cultMeshDocumentFromPeerSnapshot(peer, definition, recordKey, options); } - public static documentFromPublication( - source: CultMeshDocumentPublicationSource, - schemaId: string, - recordKey: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - timeoutMs?: number; - pollMs?: number; - messageIdPrefix?: string; - }, - ): CultMeshDocumentHandle; public static documentFromPublication( source: CultMeshDocumentPublicationSource, definition: TDefinition, recordKey: string, - options?: { - documentId?: string; - routeHint?: CultMeshRouteHint; - sourceId?: string; - timeoutMs?: number; - pollMs?: number; - messageIdPrefix?: string; - }, - ): CultMeshDocumentHandle>; - public static documentFromPublication( - source: CultMeshDocumentPublicationSource, - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, - recordKey: string, options: { documentId?: string; routeHint?: CultMeshRouteHint; @@ -5103,10 +4945,8 @@ export class CultMesh { pollMs?: number; messageIdPrefix?: string; } = {}, - ): CultMeshDocumentHandle { - return typeof schemaOrDefinition === "string" - ? cultMeshDocumentFromPublication(source, schemaOrDefinition, recordKey, options) - : cultMeshDocumentFromPublication(source, schemaOrDefinition, recordKey, options); + ): CultMeshDocumentHandle> { + return cultMeshDocumentFromPublication(source, definition, recordKey, options); } public static globalDocumentFromCache( @@ -5168,7 +5008,7 @@ export class CultMesh { } public static publicationDocument( - schema: string | AnyCultCacheDocumentDefinition, + schema: AnyCultCacheDocumentDefinition, recordKey: string, options: { documentId?: string; @@ -5749,18 +5589,33 @@ export class CultMesh { const port = options.bindPort ?? 0; const bind = { host, port }; const socket = options.socket ?? createSocket(host.includes(":") ? "udp6" : "udp4"); - const sessions = new Map; - }>(); + }; + const sessions = new Map(); let sessionSequence = 0; + let sendFailures = 0; const resendPollMs = Math.max(10, options.resendPollMs ?? 25); const sessionTimeoutMs = Math.max(1_000, options.sessionTimeoutMs ?? 30_000); const wireContract = options.wireContract ?? "cultnet.schema.v0"; + const maxFragmentBytes = options.maxFragmentBytes ?? CULTMESH_RUDP_DOCUMENT_SERVER_DEFAULT_MAX_FRAGMENT_BYTES; + if (!(maxFragmentBytes > 0)) { + throw new Error("CultMesh RUDP document server maxFragmentBytes must be greater than zero."); + } + const maxPayloadBytes = options.maxPayloadBytes; + // The most fragments one reply can take: the wire's fragment count, and the + // reliable queue a reply must fit into whole. + const maxReplyFragments = Math.min( + RUDP_MAX_FRAGMENTS_PER_MESSAGE, + options.maxPendingReliablePackets ?? RUDP_MAX_FRAGMENTS_PER_MESSAGE, + ); let resendTimer: NodeJS.Timeout | undefined; function reportError(error: unknown): void { @@ -5781,20 +5636,16 @@ export class CultMesh { if (packet.packetType === "connect") { const connectPayload = Uint8Array.from(packet.payload ?? []); - if (record && byteArraysEqual(record.connectPayload, connectPayload)) { - socket.send( - encodeRudpPacket(record.session.acceptConnect(packet, nowMs)), - remote.port, - remote.address, - ); + if (record?.session.connectRepeats(packet)) { + sendPacket(record, record.session.acceptConnect(packet, nowMs)); return; } - if (record) closeSession(record); - record = { + const next: SessionRecord = { sessionId: `${runtimeId}:${++sessionSequence}`, remote: { address: remote.address, family: remote.family, port: remote.port }, connectPayload, closed: false, + unsendable: false, session: new CultNetRudpSession({ connectionId, initialSequence: options.initialSequence, @@ -5803,8 +5654,12 @@ export class CultMesh { }), work: Promise.resolve(), }; - sessions.set(key, record); - socket.send(encodeRudpPacket(record.session.acceptConnect(packet, nowMs)), remote.port, remote.address); + sendPacket(next, next.session.acceptConnect(packet, nowMs)); + // A peer whose Accept can never be sent cannot be answered: no session + // starts, and one already there is left as it was. + if (next.unsendable) return; + if (record) closeSession(record); + sessions.set(key, next); return; } @@ -5812,12 +5667,22 @@ export class CultMesh { return; } - const result = record.session.receive(packet, nowMs); + let result: ReturnType; + try { + result = record.session.receive(packet, nowMs); + } catch { + // receive() has already recorded the packet's reliable sequence, so the + // session cannot be kept: a retransmit would be acknowledged and the frame + // silently lost. It ends, never the server, and the peer is told. What a + // datagram carries is the sender's business, so nothing is reported. + endRefusedSession(key, record); + return; + } if (result.reply) { - socket.send(encodeRudpPacket(result.reply), record.remote.port, record.remote.address); + sendPacket(record, result.reply); } for (const ready of result.readyToSend ?? []) { - socket.send(encodeRudpPacket(ready), record.remote.port, record.remote.address); + sendPacket(record, ready); } for (const frame of result.delivered) { if (frame.channelId !== "schema") { @@ -5833,11 +5698,7 @@ export class CultMesh { return; } if (packet.reliable) { - socket.send( - encodeRudpPacket(record.session.createAckFor(packet.sequence)), - record.remote.port, - record.remote.address, - ); + sendPacket(record, record.session.createAckForReceived(packet.sequence)); } } catch (error) { reportError(error); @@ -5846,11 +5707,11 @@ export class CultMesh { socket.on("error", reportError); async function handleDocumentServerFrame( - record: { sessionId: string; remote: { address: string; family: string; port: number }; session: CultNetRudpSession; connectPayload: Uint8Array; closed: boolean }, + record: SessionRecord, payload: Uint8Array, ): Promise { if (record.closed) return; - const message = parseCultNetMessage(decode(payload), wireContract); + const message = parseCultNetMessage(decodeWireValue(payload), wireContract); switch (message.schemaVersion) { case "cultnet.snapshot_request.v0": { if (!options.getCache) { @@ -5860,14 +5721,25 @@ export class CultMesh { }); return; } + let reply: CultNetMessage; try { const cache = await options.getCache(); - sendSchemaMessage(record, options.documents.createRawSnapshotResponse(cache, message.messageId, message)); + reply = options.documents.createRawSnapshotResponse(cache, message.messageId, message); } catch (error) { - sendSchemaMessage(record, { - schemaVersion: "cultnet.error.v0", - error: error instanceof Error ? error.message : String(error), - }); + reportError(error); + refuse(record, "the snapshot source failed"); + return; + } + try { + sendSchemaMessage(record, reply); + } catch (error) { + reportError(error); + refuse( + record, + maxPayloadBytes !== undefined && encodeSchemaMessage(reply).byteLength > maxPayloadBytes + ? "the snapshot response is too large" + : "the snapshot response could not be queued", + ); } return; } @@ -5876,17 +5748,24 @@ export class CultMesh { return; case "cultnet.document_put_raw.v0": if (options.onDocumentPutRaw) { - const receipt = await options.onDocumentPutRaw(normalizeRudpDocumentPut(message, record.remote)); + const unservable = unservablePut(message); + if (unservable) { + reportError(unservable); + sendSchemaMessage(record, { schemaVersion: "cultnet.error.v0", error: unservable.message }); + return; + } + const receipt = await options.onDocumentPutRaw(normalizeRudpDocumentPut(message, record.remote, options.documents)); if (receipt) { - sendSchemaMessage(record, options.documents.createRawDocumentPutMessage( - receipt.binding, receipt.messageId ?? message.messageId, receipt.recordKey, receipt.value, - { - sourceRuntimeId: receipt.sourceRuntimeId ?? runtimeId, - sourceAgentId: receipt.sourceAgentId, - sourceRole: receipt.sourceRole ?? "provider", - tags: receipt.tags ?? ["receipt"], - }, - )); + try { + sendSchemaMessage(record, receiptMessage(receipt, message.messageId)); + } catch (error) { + // The put is stored: the peer must hear that its receipt is not coming. + reportError(error); + sendSchemaMessage(record, { + schemaVersion: "cultnet.error.v0", + error: `CultMesh RUDP document server stored a put but could not send its receipt.`, + }); + } } } return; @@ -5908,13 +5787,7 @@ export class CultMesh { } } - function publicSession(record: { - sessionId: string; - remote: { address: string; family: string; port: number }; - session: CultNetRudpSession; - connectPayload: Uint8Array; - closed: boolean; - }): CultMeshRudpServerSession { + function publicSession(record: SessionRecord): CultMeshRudpServerSession { return { sessionId: record.sessionId, remote: { ...record.remote }, @@ -5926,46 +5799,156 @@ export class CultMesh { }; } - function notifySessionClosed(record: { - sessionId: string; - remote: { address: string; family: string; port: number }; - session: CultNetRudpSession; - connectPayload: Uint8Array; - closed: boolean; - }): void { + function notifySessionClosed(record: SessionRecord): void { if (!options.onSessionClosed) return; void Promise.resolve(options.onSessionClosed(publicSession(record))).catch(reportError); } - function closeSession(record: { - sessionId: string; - remote: { address: string; family: string; port: number }; - session: CultNetRudpSession; - connectPayload: Uint8Array; - closed: boolean; - }): void { + function closeSession(record: SessionRecord): void { if (record.closed) return; record.closed = true; notifySessionClosed(record); } + /** + * Sends one packet to a session's peer. A failure is that peer's alone: one that may + * pass (no route, full buffers) is a lost datagram, counted, and resent if it was + * reliable; one that can never pass as built ends that peer's session. Neither ends + * the server, a timer or another peer's session. + */ + function sendPacket(record: SessionRecord, packet: CultNetRudpPacket): void { + sendRudpDatagram(socket, encodeRudpPacket(packet), record.remote.port, record.remote.address, (error) => { + if (isPermanentSendError(error)) { + endUnsendableSession(record, error); + } else { + sendFailures += 1; + } + }); + } + + function endRefusedSession(key: string, record: SessionRecord): void { + sessions.delete(key); + closeSession(record); + // The goodbye is built after the reset, or its ack field would acknowledge the + // very frame the session refused. + record.session.resetPeerState(); + const goodbye = encodeRudpPacket(record.session.createDisconnect(Buffer.from("session refused a packet", "utf8"))); + sendRudpDatagram(socket, goodbye, record.remote.port, record.remote.address, () => {}); + } + + /** The session owes its peer a packet that can never be sent as built. */ + function endUnsendableSession(record: SessionRecord, error: Error): void { + if (record.unsendable) return; + record.unsendable = true; + const key = `${record.remote.address}:${record.remote.port}`; + // A session that never started, or was already replaced, has nothing to end. + if (sessions.get(key) !== record) return; + sessions.delete(key); + closeSession(record); + const goodbye = encodeRudpPacket(record.session.endUnsendableSession(error)); + sendRudpDatagram(socket, goodbye, record.remote.port, record.remote.address, () => {}); + } + function sendSchemaMessage( - record: { sessionId: string; remote: { address: string; port: number }; session: CultNetRudpSession; closed: boolean }, + record: SessionRecord, message: CultNetMessage, ): void { if (record.closed) throw new Error(`CultMesh RUDP session ${record.sessionId} is closed.`); - const payload = encode(encodeCultNetMessageForWire(message, wireContract)); + const payload = encodeSchemaMessage(message); + if (maxPayloadBytes !== undefined && payload.byteLength > maxPayloadBytes) { + throw new Error( + `CultMesh RUDP reply ${message.schemaVersion} is ${payload.byteLength} bytes; ` + + `maxPayloadBytes is ${maxPayloadBytes}.`, + ); + } for (const packet of record.session.sendMany("schema", payload, { reliable: true, ordered: true, nowMs: Date.now(), + maxFragmentBytes, })) { - socket.send(encodeRudpPacket(packet), record.remote.port, record.remote.address); + sendPacket(record, packet); } } + /** + * Answers a request the server cannot serve with fixed text, never an error's message, + * which can quote what a peer or the application supplied. The answer is unreliable and + * unordered, so it needs no room in a reliable queue that may just have refused the reply, + * and its acknowledgement fields acknowledge nothing, as every runtime's refusal does. + */ + function refuse(record: SessionRecord, text: string): void { + if (record.closed) return; + const payload = encodeSchemaMessage({ schemaVersion: "cultnet.error.v0", error: text }); + for (const packet of record.session.sendMany("schema", payload, { + reliable: false, + ordered: false, + nowMs: Date.now(), + maxFragmentBytes, + })) { + sendPacket(record, { ...packet, ack: 0, ackMask: 0 }); + } + } + + /** The one reply encoder, shared by sends and by put admission. */ + function encodeSchemaMessage(message: CultNetMessage): Uint8Array { + return encodeWireValue(encodeCultNetMessageForWire(message, wireContract)); + } + + /** Builds the receipt `onDocumentPutRaw` returned, under the put's message id by default. */ + function receiptMessage(receipt: CultMeshRudpDocumentReceipt, putMessageId: string): CultNetMessage { + return options.documents.createRawDocumentPutMessage( + receipt.binding, receipt.messageId ?? putMessageId, receipt.recordKey, receipt.value, + { + sourceRuntimeId: receipt.sourceRuntimeId ?? runtimeId, + sourceAgentId: receipt.sourceAgentId, + sourceRole: receipt.sourceRole ?? "provider", + tags: receipt.tags ?? ["receipt"], + }, + ); + } + + /** + * Refuse a put whose document could never be served: the snapshot reply + * carrying it alone, under the shortest message id CultNet parses, sized as + * `sendSchemaMessage` would send it. It is built from the record the + * registry would store, which is exact only when the application stores + * through the registry; a document the registry has no binding for is + * sized as received. + */ + function unservablePut(message: CultNetMessage): CultMeshRudpUnservableDocumentError | undefined { + if (message.schemaVersion !== "cultnet.document_put_raw.v0") return undefined; + let reply: CultNetMessage; + try { + reply = options.documents.createRawSnapshotResponseForPut(message, SHORTEST_MESSAGE_ID); + } catch { + reply = { + schemaVersion: "cultnet.snapshot_response_raw.v0", + messageId: SHORTEST_MESSAGE_ID, + documents: [message.document], + }; + } + const responseBytes = encodeSchemaMessage(reply).byteLength; + const fragmentCount = Math.max(1, Math.ceil(responseBytes / maxFragmentBytes)); + if ((maxPayloadBytes === undefined || responseBytes <= maxPayloadBytes) + && fragmentCount <= maxReplyFragments) { + return undefined; + } + return new CultMeshRudpUnservableDocumentError( + message.messageId, + message.document.recordKey, + responseBytes, + maxPayloadBytes, + fragmentCount, + maxReplyFragments, + ); + } + return { bind, + get sendFailures() { + return sendFailures; + }, async start(): Promise { await new Promise((resolve, reject) => { socket.once("error", reject); @@ -5987,7 +5970,7 @@ export class CultMesh { continue; } for (const packet of record.session.dueResends(nowMs)) { - socket.send(encodeRudpPacket(packet), record.remote.port, record.remote.address); + sendPacket(record, packet); } } }, resendPollMs); @@ -6102,9 +6085,9 @@ export class CultMesh { const onMessage = (message: CultNetMessage): void => { if (message.schemaVersion !== "cultnet.document_put_raw.v0" || message.messageId !== messageId || message.document.schemaId !== receiptBinding.definition.schemaId) return; try { - const decoded = decode(new Uint8Array(message.document.payload)); + const decoded = decodeDocumentPayload(receiptBinding.definition, message.document.payload); cleanup(); - resolve(receiptBinding.definition.schema.parse(decoded) as CultCacheDocumentValue); + resolve(decoded); } catch (error) { cleanup(); reject(error); } }; const cleanup = (): void => { clearTimeout(timeout); peer.off("message", onMessage); }; @@ -6123,7 +6106,7 @@ export class CultMesh { options: CultMeshRudpSocketOptions = {}, ): Promise { requireNonEmpty(runtimeId, "runtimeId"); - const socket = options.socket ?? (await bindRudpSocket(options)); + const socket = options.socket ?? (await bindRudpSocket(options.bindHost ?? "127.0.0.1", options)); return new CultNetRudpSocketTransportConnection({ runtimeId, socket, @@ -6149,7 +6132,10 @@ export class CultMesh { requireNonEmpty(runtimeId, "runtimeId"); const parsedEndpoint = typeof endpoint === "string" ? CultMesh.parseRudpEndpoint(endpoint) : endpoint; - const socket = options.socket ?? (await bindRudpSocket(options)); + const socket = options.socket ?? (await bindRudpSocket( + options.bindHost ?? (await rudpClientBindHost(parsedEndpoint.host)), + options, + )); return new CultNetRudpSocketTransportConnection({ runtimeId, socket, @@ -6268,6 +6254,28 @@ export class CultMesh { } return CultMesh.createRudpPeerForPeer(runtimeId, connectionId, peer, options); } + + public static parseQuicRealtimeEndpoint(endpoint: string): ReturnType { + return parseQuicRealtimeEndpoint(endpoint); + } + + public static createQuicRealtimeConnector( + options: CultMeshQuicRealtimeConnectorOptions = {}, + ): CultMeshQuicRealtimeConnector { + return new CultMeshQuicRealtimeConnector(options); + } + + public static createQuicRealtimeSessionManager( + options: CultMeshQuicRealtimeSessionManagerOptions, + ): CultMeshQuicRealtimeSessionManager { + return new CultMeshQuicRealtimeSessionManager(options); + } + + public static createQuicRealtimeProvider( + options: CultMeshQuicRealtimeProviderOptions, + ): Promise { + return CultMeshQuicRealtimeProvider.listen(options); + } } function cultMeshSchemaFromDefinition( @@ -6343,18 +6351,14 @@ function inferCultMeshSchemaName(schemaId: string | undefined): string | undefin function resolveCultMeshStoreDocumentRecord( records: readonly CultCacheEnvelope[], schema: CultMeshDocumentSchemaDescriptor, - schemaOrDefinition: string | AnyCultCacheDocumentDefinition, + definition: AnyCultCacheDocumentDefinition, ): CultCacheEnvelope | undefined { const schemaId = schema.schemaId ?? schema.type; return ( records.find(candidate => schemaId !== undefined && candidate.schemaId === schemaId) ?? records.find(candidate => - cultMeshEnvelopeMatchesSchema(candidate, schema) && - (typeof schemaOrDefinition === "string" || - cultMeshEnvelopeParsesAsDefinition(candidate, schemaOrDefinition))) ?? - (typeof schemaOrDefinition === "string" - ? undefined - : records.find(candidate => cultMeshEnvelopeParsesAsDefinition(candidate, schemaOrDefinition))) + cultMeshEnvelopeMatchesSchema(candidate, schema) && cultMeshEnvelopeParsesAsDefinition(candidate, definition)) ?? + records.find(candidate => cultMeshEnvelopeParsesAsDefinition(candidate, definition)) ); } @@ -6386,7 +6390,7 @@ function cultMeshEnvelopeParsesAsDefinition( definition: AnyCultCacheDocumentDefinition, ): boolean { try { - definition.schema.parse(decode(envelope.payload)); + decodeDocumentPayload(definition, envelope.payload); return true; } catch { return false; @@ -6409,6 +6413,7 @@ function requireNonEmpty(value: string, name: string): void { function normalizeRudpDocumentPut( message: CultNetMessage, remote: { address: string; family: string; port: number }, + documents: CultNetDocumentRegistry, ): CultMeshRudpDocumentPut { if (message.schemaVersion !== "cultnet.document_put_raw.v0") { throw new Error(`Expected cultnet.document_put_raw.v0, received ${message.schemaVersion}.`); @@ -6420,16 +6425,19 @@ function normalizeRudpDocumentPut( if (document.payloadEncoding !== "messagepack") { throw new Error(`Unsupported raw payload encoding ${document.payloadEncoding}.`); } + const definition = documents.getBySchemaId(document.schemaId)?.definition; return { schemaId: document.schemaId, recordKey: document.recordKey, storedAt: document.storedAt ?? new Date().toISOString(), - payload: decode(document.payload), sourceRuntimeId: document.sourceRuntimeId ?? null, sourceAgentId: document.sourceAgentId ?? null, sourceRole: document.sourceRole ?? null, tags: Array.isArray(document.tags) ? document.tags : [], remote, + ...(definition + ? { decoded: true, payload: decodeDocumentPayload(definition, document.payload) } + : { decoded: false, payload: document.payload }), }; } @@ -6522,39 +6530,12 @@ async function resolveCultNetPeer( : peerOrProvider; } -function decodeCultNetRawDocumentPayload(document: CultNetRawDocumentRecord): unknown { - if (document.payloadEncoding !== "messagepack") { - throw new Error(`Unsupported CultNet raw document payload encoding ${document.payloadEncoding}.`); - } - return decode(toUint8Array(document.payload)); -} - -function parseCultMeshDocumentValue( - schemaOrDefinition: string | TDefinition, - value: unknown, -): unknown | CultCacheDocumentValue { - return typeof schemaOrDefinition === "string" - ? value - : schemaOrDefinition.schema.parse(value); -} - function isCultNetErrorMessage(message: CultNetMessage): message is CultNetErrorMessage { return message.schemaVersion === "cultnet.error.v0"; } -function toUint8Array(value: unknown): Uint8Array { - if (value instanceof Uint8Array) { - return value; - } - if (Array.isArray(value)) { - return Uint8Array.from(value); - } - throw new Error("CultNet raw document payload was not binary."); -} - -async function bindRudpSocket(options: CultMeshRudpSocketOptions): Promise { - const socket = createSocket("udp4"); - const host = options.bindHost ?? "127.0.0.1"; +async function bindRudpSocket(host: string, options: CultMeshRudpSocketOptions): Promise { + const socket = createSocket(host.includes(":") ? "udp6" : "udp4"); const port = options.bindPort ?? 0; await new Promise((resolve, reject) => { socket.once("error", reject); @@ -6637,14 +6618,6 @@ function nonBlankOr(value?: string, fallback = ""): string { return value && value.trim() ? value : fallback; } -function byteArraysEqual(left: Uint8Array, right: Uint8Array): boolean { - if (left.byteLength !== right.byteLength) return false; - for (let index = 0; index < left.byteLength; index += 1) { - if (left[index] !== right[index]) return false; - } - return true; -} - function parseCultMeshLocalityKind( value: string | undefined, fallback: CultMeshLocalityKind, diff --git a/packages/cultmesh-ts/src/provider-rudp-transport.ts b/packages/cultmesh-ts/src/provider-rudp-transport.ts index 0557bf48..fc0d75c0 100644 --- a/packages/cultmesh-ts/src/provider-rudp-transport.ts +++ b/packages/cultmesh-ts/src/provider-rudp-transport.ts @@ -1,6 +1,7 @@ import { randomUUID } from "node:crypto"; import { createSocket, type Socket } from "node:dgram"; -import { encode } from "@msgpack/msgpack"; +import { documentPayloadFromBytes } from "@gamecult/cultcache-ts"; +import { encodeWireValue } from "cultnet-ts/wire"; import { CultNetPeer, CultNetRudpSocketTransportConnection, @@ -171,7 +172,9 @@ class RudpProviderConnection implements CultMeshProviderConnection { recordKey: publication.recordKey, storedAt: new Date().toISOString(), payloadEncoding: "messagepack", - payload: encode(publication.value), + // The one plain writer of a document payload: a publication carries no definition. The typed owner of this write is + // cultlib-gaps:follow_up:document-payload-encode-owner. + payload: documentPayloadFromBytes(encodeWireValue(publication.value)), sourceRuntimeId: this.#identity.serviceInstanceId, sourceAgentId: this.#identity.providerId, sourceRole: "provider", diff --git a/packages/cultmesh-ts/src/provider-session-broker.ts b/packages/cultmesh-ts/src/provider-session-broker.ts index eb9e18b5..75240a14 100644 --- a/packages/cultmesh-ts/src/provider-session-broker.ts +++ b/packages/cultmesh-ts/src/provider-session-broker.ts @@ -1,4 +1,5 @@ -import { encode } from "@msgpack/msgpack"; +import { encodeDocumentPayload } from "@gamecult/cultcache-ts"; +import { encodeWireValue } from "cultnet-ts/wire"; import type { CultNetDocumentPutRawMessage, CultNetOperationRequestMessage, @@ -13,6 +14,7 @@ import { cultMeshProviderSessionSchemas, decodeProviderSessionPayload, encodeProviderSessionPayload, + providerCommandDocument, type CultMeshProviderCommandReceiptWire, type CultMeshProviderCommandWire, type CultMeshProviderLeaseRenewalWire, @@ -420,7 +422,7 @@ export class CultMeshProviderSessionBroker { recordKey: `${command.providerId}/${command.serviceInstanceId}/${command.commandId}`, storedAt: this.#clock.now().toISOString(), payloadEncoding: "messagepack", - payload: encode(command), + payload: encodeDocumentPayload(providerCommandDocument, command), sourceRuntimeId: this.#options.runtimeId, sourceRole: "provider-session-broker", }, @@ -513,7 +515,7 @@ function documentTuple(document: Pick(payload: string): T { if (typeof payload !== "string" || payload.length === 0) { throw new Error("CultMesh provider-session payload must be non-empty MessagePack base64."); } - return decode(Buffer.from(payload, "base64")) as T; + return decodeWireValue(Buffer.from(payload, "base64")) as T; } export function encodeProviderConnectEvidence( evidence: CultMeshProviderConnectEvidenceWire, ): Uint8Array { assertProviderConnectEvidence(evidence); - return encode(evidence); + return encodeWireValue(evidence); } export function decodeProviderConnectEvidence( payload: Uint8Array, ): CultMeshProviderConnectEvidenceWire { - const evidence = decode(payload) as unknown; + const evidence = decodeWireValue(payload) as unknown; assertProviderConnectEvidence(evidence); return evidence; } @@ -155,6 +156,23 @@ export function assertProviderConnectEvidence( } } +// The provider command is a CultCache document like any other: written with encodeDocumentPayload and read with +// decodeDocumentPayload, so its bytes never pass through a plain decoder. +export const providerCommandDocument = defineDocumentType({ + type: cultMeshProviderSessionSchemas.command, + schemaId: cultMeshProviderSessionSchemas.command, + schema: { + parse(value: unknown): CultMeshProviderCommandWire { + const command = requireObject(value, "provider command"); + requireText(command.commandId, "commandId"); + requireText(command.commandKind, "commandKind"); + requireText(command.providerId, "providerId"); + requireText(command.serviceInstanceId, "serviceInstanceId"); + return command as unknown as CultMeshProviderCommandWire; + }, + }, +}); + export function decodeProviderCommandDocument(document: CultNetRawDocumentRecord): CultMeshProviderCommandWire { if (document.schemaId !== cultMeshProviderSessionSchemas.command) { throw new Error(`Expected ${cultMeshProviderSessionSchemas.command}, received ${document.schemaId}.`); @@ -162,12 +180,7 @@ export function decodeProviderCommandDocument(document: CultNetRawDocumentRecord if (document.payloadEncoding !== "messagepack") { throw new Error(`Provider command ${document.recordKey} must use MessagePack.`); } - const command = decode(document.payload) as Partial; - requireText(command.commandId, "commandId"); - requireText(command.commandKind, "commandKind"); - requireText(command.providerId, "providerId"); - requireText(command.serviceInstanceId, "serviceInstanceId"); - return command as CultMeshProviderCommandWire; + return decodeDocumentPayload(providerCommandDocument, document.payload); } export function assertProviderLease(value: unknown): asserts value is CultMeshProviderLeaseWire { diff --git a/packages/cultmesh-ts/src/realtime-quic-native.ts b/packages/cultmesh-ts/src/realtime-quic-native.ts new file mode 100644 index 00000000..a2fc9713 --- /dev/null +++ b/packages/cultmesh-ts/src/realtime-quic-native.ts @@ -0,0 +1,583 @@ +// The koffi binding for `native/GameCult.Mesh.Quic.Native`'s C ABI v2 +// (`include/cultmesh_quic_native.h`). This file is the only place `koffi` is +// imported, and it is imported lazily, inside `loadBindings`, so a consumer +// that never touches QUIC (Odin, Stonks, weksa) loads no +// native module at all. +// +// No koffi callbacks. `cultmesh_quic_next_event` is the single blocking +// export; `CultMeshQuicNativeRuntime` runs it on koffi's async thread pool in +// one loop per process-wide runtime and dispatches decoded events to +// registered listener/connection handlers by id. Every other export is a +// plain synchronous call. +// +// Binary resolution: `CULTMESH_QUIC_NATIVE_DIR` when set (the development +// loop and CI point it at `artifacts/quic-native/` straight from a +// build), otherwise `path.join(__dirname, "..", "native", "-")` +// (the committed tree a later cut lands; `__dirname` is `dist/` at runtime, so +// this path holds in the repo, an `npm pack` tarball and a pnpm `file:` copy +// alike). No `node_modules` lookup, no platform package, no registry. +// +// Two koffi quirks this file works around, both probed against the pinned +// 3.3.0 build: `_Out_` does not auto-allocate storage, so every out +// parameter is `koffi.alloc(type, 1)` written by the call and read back with +// `koffi.decode(buffer, type)`; and a decoded 64-bit value (`void *`, +// `uint64_t`) comes back as a plain `number` when it fits a safe integer, +// not a `bigint`. `toBigInt64` below is the one place that coerces either +// into the `bigint` every exported type in this module promises. + +import { existsSync } from "node:fs"; +import { join } from "node:path"; + +/** One decoded native event, payload already sliced to `payload_length`. */ +export interface CultMeshQuicNativeEvent { + readonly type: number; + readonly streamKind: number; + readonly listenerId: bigint; + readonly connectionId: bigint; + readonly streamId: bigint; + readonly code: bigint; + readonly status: number; + readonly payload: Uint8Array; +} + +export const CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION = 1; +export const CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED = 2; +export const CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED = 3; +export const CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN = 4; +export const CULTMESH_QUIC_EVENT_STREAM_STARTED = 5; +export const CULTMESH_QUIC_EVENT_STREAM_FRAME = 6; +export const CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE = 7; +export const CULTMESH_QUIC_EVENT_STREAM_SHUTDOWN = 8; +export const CULTMESH_QUIC_EVENT_LISTENER_STOPPED = 9; + +export const CULTMESH_QUIC_SEND_COMPLETED = 0; +export const CULTMESH_QUIC_SEND_CANCELED = 1; + +export const CULTMESH_QUIC_STREAM_RELIABLE = 1; +export const CULTMESH_QUIC_STREAM_LATEST_ONLY = 2; + +export const CULTMESH_QUIC_RESULT_BAD_CALL = -1; +export const CULTMESH_QUIC_RESULT_BAD_ARGUMENT = -2; + +type NativeEventListener = (event: CultMeshQuicNativeEvent) => void; +/** Invoked once when a connection is faulted: a throwing listener, a malformed + * frame, or any other error raised while dispatching an event for it. */ +type NativeFaultHandler = (error: Error) => void; + +/** koffi decodes a 64-bit value as `number` when it fits a safe integer and as + * `bigint` otherwise (probed on the pinned 3.3.0 build); this is the single + * place that coerces either into the `bigint` every exported type promises. */ +function toBigInt64(value: number | bigint): bigint { + return typeof value === "bigint" ? value : BigInt(value); +} + +/** The opaque native runtime handle: a `void *`, decoded by koffi as a `bigint`. */ +export type CultMeshQuicNativeHandle = bigint; + +interface NativeEventStruct { + type: number; + stream_kind: number; + listener_id: bigint; + connection_id: bigint; + stream_id: bigint; + code: bigint; + status: number; + payload_length: number; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type KoffiLib = any; + +/** `nextEventAsync`'s signature, typed explicitly because `promisify` cannot + * infer one from koffi's untyped (`any`) async export. */ +type NextEventAsyncFn = ( + runtime: CultMeshQuicNativeHandle, + timeoutMs: number, + outEvent: unknown, + payload: Uint8Array | null, + payloadCapacity: number, + outRequired: unknown, +) => Promise; + +/** + * The loaded native library: koffi itself, the declared struct, and the + * twelve raw v2 exports. Untyped (koffi is `any`); the runtime class methods + * below are the type surface for these calls, so wrapping them a second time + * in a typed interface would only restate what the methods already say. The + * type is inferred from `buildLibrary`'s return value instead of restated. + */ +// eslint-disable-next-line @typescript-eslint/no-use-before-define +type LoadedNativeLibrary = ReturnType; + +let libraryCache: LoadedNativeLibrary | undefined; + +function platformArchDir(): string { + return `${process.platform}-${process.arch}`; +} + +function platformFileNames(): { bridge: string; dependency: string } { + if (process.platform === "win32") { + return { bridge: "gamecult_mesh_quic_native.dll", dependency: "msquic.dll" }; + } + if (process.platform === "linux") { + return { bridge: "libgamecult_mesh_quic_native.so", dependency: "libmsquic.so.2" }; + } + throw new Error(`CultMesh QUIC native binding does not support platform '${process.platform}'.`); +} + +function resolveNativeDir(): string { + const configured = process.env.CULTMESH_QUIC_NATIVE_DIR; + if (configured && configured.length > 0) return configured; + return join(__dirname, "..", "native", platformArchDir()); +} + +/** Loads koffi, resolves the binary directory, and declares the ABI. */ +function buildLibrary() { + // Untyped on purpose: koffi's own type declarations are ESM-flavored and + // fight a CommonJS `typeof import(...)` reference under Node16 resolution. + // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-explicit-any + const koffi: any = require("koffi"); + const { bridge, dependency } = platformFileNames(); + const dir = resolveNativeDir(); + const bridgePath = join(dir, bridge); + const dependencyPath = join(dir, dependency); + if (!existsSync(bridgePath) || !existsSync(dependencyPath)) { + const envDir = process.env.CULTMESH_QUIC_NATIVE_DIR; + throw new Error( + "CultMesh QUIC native binaries were not found. Tried " + + `'${dir}' (${envDir ? "CULTMESH_QUIC_NATIVE_DIR" : "the package's committed native/ tree"}). ` + + "Set CULTMESH_QUIC_NATIVE_DIR to a directory built by scripts/build-quic-native.ps1 or " + + "scripts/build-quic-native.sh, or ship the committed native/ tree.", + ); + } + + // The dependent library must be resolvable before the bridge loads. + koffi.load(dependencyPath); + const bridgeLib = koffi.load(bridgePath); + + const event = koffi.struct("cultmesh_quic_event", { + type: "uint32_t", + stream_kind: "uint32_t", + listener_id: "uint64_t", + connection_id: "uint64_t", + stream_id: "uint64_t", + code: "uint64_t", + status: "int32_t", + payload_length: "int32_t", + reserved: koffi.array("uint8_t", 16), + }); + + const runtimeOpenFn = bridgeLib.func( + "int32_t cultmesh_quic_runtime_open(str app_name, void **out_runtime)", + ); + const runtimeCloseFn = bridgeLib.func("void cultmesh_quic_runtime_close(void *runtime)"); + const listenerOpenFn = bridgeLib.func( + "int32_t cultmesh_quic_listener_open(void *runtime, str host, uint16_t port, " + + "uint8_t *pkcs12, int32_t pkcs12_length, str password, " + + "uint64_t *out_listener_id, uint16_t *out_bound_port)", + ); + const listenerCloseFn = bridgeLib.func( + "void cultmesh_quic_listener_close(void *runtime, uint64_t listener_id)", + ); + const connectionOpenFn = bridgeLib.func( + "int32_t cultmesh_quic_connection_open(void *runtime, str host, uint16_t port, " + + "uint64_t *out_connection_id)", + ); + const connectionCertificateCompleteFn = bridgeLib.func( + "int32_t cultmesh_quic_connection_certificate_complete(void *runtime, uint64_t connection_id, int32_t accept)", + ); + const connectionShutdownFn = bridgeLib.func( + "void cultmesh_quic_connection_shutdown(void *runtime, uint64_t connection_id, uint64_t code)", + ); + const streamOpenFn = bridgeLib.func( + "int32_t cultmesh_quic_stream_open(void *runtime, uint64_t connection_id, uint8_t kind, " + + "uint64_t *out_stream_id)", + ); + const streamSendFrameFn = bridgeLib.func( + "int32_t cultmesh_quic_stream_send_frame(void *runtime, uint64_t stream_id, " + + "uint8_t *encoded_frame, int32_t length, int32_t fin)", + ); + const streamShutdownFn = bridgeLib.func( + "void cultmesh_quic_stream_shutdown(void *runtime, uint64_t stream_id, uint64_t code)", + ); + const nextEventFn = bridgeLib.func( + "int32_t cultmesh_quic_next_event(void *runtime, int32_t timeout_ms, " + + `${event.name} *out_event, uint8_t *payload, int32_t payload_capacity, ` + + "int32_t *out_required)", + ); + const lastErrorFn = bridgeLib.func( + "int32_t cultmesh_quic_last_error(void *runtime, uint8_t *destination, int32_t capacity)", + ); + + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { promisify } = require("node:util") as typeof import("node:util"); + const nextEventAsync = promisify(nextEventFn.async) as NextEventAsyncFn; + + return { + koffi, + event, + runtimeOpenFn, + runtimeCloseFn, + listenerOpenFn, + listenerCloseFn, + connectionOpenFn, + connectionCertificateCompleteFn, + connectionShutdownFn, + streamOpenFn, + streamSendFrameFn, + streamShutdownFn, + nextEventAsync, + lastErrorFn, + }; +} + +/** Lazily builds and caches the loaded native library. */ +function loadBindings(): LoadedNativeLibrary { + if (libraryCache) return libraryCache; + libraryCache = buildLibrary(); + return libraryCache; +} + +function readLastError(lib: LoadedNativeLibrary, runtime: CultMeshQuicNativeHandle): string { + const buffer = Buffer.alloc(1024); + const written = lib.lastErrorFn(runtime, buffer, buffer.length); + return written > 0 ? buffer.subarray(0, written).toString("utf8") : "CultMesh native QUIC call failed."; +} + +/** + * One MsQuic registration and one event queue, shared process-wide. + * `open`/`release` are reference-counted: the underlying runtime opens on the + * first `open` and closes on the last matching `release`. `open`/`release` + * calls do not need to be paired 1:1 by the same caller as long as the counts + * balance overall. + */ +export class CultMeshQuicNativeRuntime { + private static shared: CultMeshQuicNativeRuntime | undefined; + private static refCountValue = 0; + + /** Outstanding `open()` references not yet matched by `release()`. Test-visible: the UAF and eviction regression tests assert it returns to its baseline. */ + static get refCount(): number { + return CultMeshQuicNativeRuntime.refCountValue; + } + + private readonly handle: CultMeshQuicNativeHandle; + private readonly lib: LoadedNativeLibrary; + private readonly listenerListeners = new Map(); + private readonly connectionListeners = new Map< + bigint, + { listener: NativeEventListener; onFault?: NativeFaultHandler } + >(); + private closed = false; + private pumpLoop: Promise; + + /** + * `nextEvent`'s out-parameter buffers, allocated once and reused for every + * call instead of per call: the pump is single-threaded with at most one + * `nextEvent` in flight (`nextEventAsync` is only ever awaited, never + * fired concurrently), so decode-then-reuse is safe. Freed once in + * `release()` after the pump loop has exited. + */ + private readonly outEventBuffer: unknown; + private readonly outRequiredBuffer: unknown; + + private constructor(handle: CultMeshQuicNativeHandle, lib: LoadedNativeLibrary) { + this.handle = handle; + this.lib = lib; + this.outEventBuffer = lib.koffi.alloc(lib.event, 1); + this.outRequiredBuffer = lib.koffi.alloc("int32_t", 1); + this.pumpLoop = this.pump(); + } + + static async open(): Promise { + if (!CultMeshQuicNativeRuntime.shared) { + const lib = loadBindings(); + const out = lib.koffi.alloc("void *", 1); + const status = lib.runtimeOpenFn(null, out); + if (status !== 0) { + lib.koffi.free(out); + throw new Error(`cultmesh_quic_runtime_open failed with status ${status}.`); + } + const handle = toBigInt64(lib.koffi.decode(out, "void *")); + lib.koffi.free(out); + CultMeshQuicNativeRuntime.shared = new CultMeshQuicNativeRuntime(handle, lib); + } + CultMeshQuicNativeRuntime.refCountValue += 1; + return CultMeshQuicNativeRuntime.shared; + } + + /** + * Takes one more reference on this already-open runtime, synchronously — + * unlike `open()`, this never awaits a runtime-open call, so a caller + * already holding a live instance (a provider handing a reference to a + * newly accepted peer) can attach it in the same synchronous turn instead + * of crossing a microtask boundary that would leave the event a caller is + * mid-dispatching unowned until the next tick. + */ + retain(): CultMeshQuicNativeRuntime { + CultMeshQuicNativeRuntime.refCountValue += 1; + return this; + } + + /** + * Drops one reference; closes the shared runtime once none remain. Refuses + * a release when no reference is outstanding. The bridge header (section 4) + * forbids any host call beginning once `cultmesh_quic_runtime_close` has + * started, so this marks the runtime closed and waits for the pump to exit + * (it wakes within its 250 ms `nextEvent` timeout) before making that call: + * a queued, not-yet-started `nextEvent` call must never begin after close + * and run against freed memory. + */ + async release(): Promise { + if (CultMeshQuicNativeRuntime.refCountValue === 0) { + throw new Error("CultMeshQuicNativeRuntime.release called with no outstanding reference."); + } + CultMeshQuicNativeRuntime.refCountValue -= 1; + if (CultMeshQuicNativeRuntime.refCountValue > 0) return; + this.closed = true; + CultMeshQuicNativeRuntime.shared = undefined; + await this.pumpLoop; + this.lib.runtimeCloseFn(this.handle); + this.lib.koffi.free(this.outEventBuffer); + this.lib.koffi.free(this.outRequiredBuffer); + } + + onListenerEvent(listenerId: bigint, listener: NativeEventListener): void { + this.listenerListeners.set(listenerId, listener); + } + + offListenerEvent(listenerId: bigint): void { + this.listenerListeners.delete(listenerId); + } + + /** + * Registers the event listener for one connection. `onFault`, if given, is + * invoked exactly once if `listener` (or anything it calls synchronously, + * such as a caller-supplied certificate validator) throws while dispatching + * an event for this connection: the pump isolates the fault to this + * connection, shuts it down at the native level, removes the listener, and + * keeps running for every other connection. + */ + onConnectionEvent(connectionId: bigint, listener: NativeEventListener, onFault?: NativeFaultHandler): void { + this.connectionListeners.set(connectionId, { listener, onFault }); + } + + offConnectionEvent(connectionId: bigint): void { + this.connectionListeners.delete(connectionId); + } + + listenerOpen( + host: string | null, + port: number, + pkcs12: Uint8Array, + password: string | null, + ): { listenerId: bigint; boundPort: number } { + const outListenerId = this.lib.koffi.alloc("uint64_t", 1); + const outBoundPort = this.lib.koffi.alloc("uint16_t", 1); + try { + const status = this.lib.listenerOpenFn( + this.handle, + host, + port, + pkcs12, + pkcs12.length, + password, + outListenerId, + outBoundPort, + ); + if (status !== 0) { + throw new Error(`cultmesh_quic_listener_open failed: ${readLastError(this.lib, this.handle)}`); + } + return { + listenerId: toBigInt64(this.lib.koffi.decode(outListenerId, "uint64_t")), + boundPort: this.lib.koffi.decode(outBoundPort, "uint16_t") as number, + }; + } finally { + this.lib.koffi.free(outListenerId); + this.lib.koffi.free(outBoundPort); + } + } + + listenerClose(listenerId: bigint): void { + this.lib.listenerCloseFn(this.handle, listenerId); + this.offListenerEvent(listenerId); + } + + connectionOpen(host: string, port: number): bigint { + const out = this.lib.koffi.alloc("uint64_t", 1); + try { + const status = this.lib.connectionOpenFn(this.handle, host, port, out); + if (status !== 0) { + throw new Error(`cultmesh_quic_connection_open failed: ${readLastError(this.lib, this.handle)}`); + } + return toBigInt64(this.lib.koffi.decode(out, "uint64_t")); + } finally { + this.lib.koffi.free(out); + } + } + + connectionCertificateComplete(connectionId: bigint, accept: boolean): void { + const status = this.lib.connectionCertificateCompleteFn(this.handle, connectionId, accept ? 1 : 0); + if (status !== 0) { + throw new Error( + `cultmesh_quic_connection_certificate_complete failed: ${readLastError(this.lib, this.handle)}`, + ); + } + } + + connectionShutdown(connectionId: bigint, code: bigint): void { + this.lib.connectionShutdownFn(this.handle, connectionId, code); + } + + streamOpen(connectionId: bigint, kind: number): bigint { + const out = this.lib.koffi.alloc("uint64_t", 1); + try { + const status = this.lib.streamOpenFn(this.handle, connectionId, kind, out); + if (status !== 0) { + throw new Error(`cultmesh_quic_stream_open failed: ${readLastError(this.lib, this.handle)}`); + } + return toBigInt64(this.lib.koffi.decode(out, "uint64_t")); + } finally { + this.lib.koffi.free(out); + } + } + + streamSendFrame(streamId: bigint, encodedFrame: Uint8Array, fin: boolean): void { + const status = this.lib.streamSendFrameFn(this.handle, streamId, encodedFrame, encodedFrame.length, fin ? 1 : 0); + if (status !== 0) { + throw new Error(`cultmesh_quic_stream_send_frame failed: ${readLastError(this.lib, this.handle)}`); + } + } + + streamShutdown(streamId: bigint, code: bigint): void { + this.lib.streamShutdownFn(this.handle, streamId, code); + } + + /** + * Isolates the faulting connection so one bad event never brings down the + * pump: a malformed frame, a stream-kind/delivery mismatch, or a throwing + * caller-supplied listener (certificate validator, waiter) faults only its + * own connection. The listener is removed, the connection is shut down at + * the native level, and `onFault` (if registered) is told, so pending and + * future work on that connection can reject with the error. Every other + * connection, and the pump itself, keep running. + */ + private dispatch(event: NativeEventStruct, payload: Uint8Array): void { + const decoded: CultMeshQuicNativeEvent = { + type: event.type, + streamKind: event.stream_kind, + listenerId: event.listener_id, + connectionId: event.connection_id, + streamId: event.stream_id, + code: event.code, + status: event.status, + payload, + }; + if (decoded.type === CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION || decoded.type === CULTMESH_QUIC_EVENT_LISTENER_STOPPED) { + try { + this.listenerListeners.get(decoded.listenerId)?.(decoded); + } catch (error) { + // No fault contract for listener-level events today; do not let a + // throwing handler crash the pump. + this.reportUnhandledDispatchError(error); + } + return; + } + const entry = this.connectionListeners.get(decoded.connectionId); + if (!entry) return; + try { + entry.listener(decoded); + } catch (error) { + this.faultConnection(decoded.connectionId, error instanceof Error ? error : new Error(String(error)), entry.onFault); + } + } + + private faultConnection(connectionId: bigint, error: Error, onFault: NativeFaultHandler | undefined): void { + this.connectionListeners.delete(connectionId); + try { + this.lib.connectionShutdownFn(this.handle, connectionId, 0n); + } catch { + // Best-effort: the connection may already be gone. + } + if (onFault) { + try { + onFault(error); + } catch (handlerError) { + // The fault handler itself is caller-supplied code; a throw here + // must not escape into the pump any more than the original fault did. + this.reportUnhandledDispatchError(handlerError); + } + } else { + this.reportUnhandledDispatchError(error); + } + } + + private reportUnhandledDispatchError(error: unknown): void { + // eslint-disable-next-line no-console + console.error("CultMesh QUIC native event dispatch failed with no fault handler registered:", error); + } + + private async nextEvent( + timeoutMs: number, + payload: Uint8Array | null, + payloadCapacity: number, + ): Promise<{ status: number; event: NativeEventStruct | null; required: number }> { + // Reuses the buffers allocated once in the constructor instead of + // allocating fresh ones per call: the pump awaits each `nextEventAsync` + // before issuing the next one, so at most one call is ever in flight + // against them, and both are fully decoded here before the buffers can + // be reused by the pump's next call. + const status = await this.lib.nextEventAsync( + this.handle, + timeoutMs, + this.outEventBuffer, + payload, + payloadCapacity, + this.outRequiredBuffer, + ); + const decoded = + status === 1 ? (this.lib.koffi.decode(this.outEventBuffer, this.lib.event) as NativeEventStruct) : null; + return { + status, + event: decoded && { + ...decoded, + listener_id: toBigInt64(decoded.listener_id), + connection_id: toBigInt64(decoded.connection_id), + stream_id: toBigInt64(decoded.stream_id), + code: toBigInt64(decoded.code), + }, + required: this.lib.koffi.decode(this.outRequiredBuffer, "int32_t") as number, + }; + } + + private async pump(): Promise { + while (!this.closed) { + let first: Awaited>; + try { + first = await this.nextEvent(250, null, 0); + } catch { + if (this.closed) return; + continue; + } + if (this.closed) return; + if (first.status === 0 || first.status === CULTMESH_QUIC_RESULT_BAD_CALL) continue; + if (first.status === 1 && first.event) { + this.dispatch(first.event, new Uint8Array(0)); + continue; + } + if (first.status === 2 && first.required > 0) { + const buffer = Buffer.alloc(first.required); + let second: Awaited>; + try { + second = await this.nextEvent(0, buffer, buffer.length); + } catch { + if (this.closed) return; + continue; + } + if (second.status === 1 && second.event) { + this.dispatch(second.event, buffer.subarray(0, second.event.payload_length)); + } + continue; + } + } + } +} diff --git a/packages/cultmesh-ts/src/realtime-quic.ts b/packages/cultmesh-ts/src/realtime-quic.ts new file mode 100644 index 00000000..c368c96f --- /dev/null +++ b/packages/cultmesh-ts/src/realtime-quic.ts @@ -0,0 +1,1329 @@ +// The Node QUIC realtime plane: a consumer transport and connector over the +// native v2 bridge, and the session manager that binds an advertised route to +// a connected, authority-verified transport. +// +// Provider and consumer semantics (which stream kind carries which delivery +// mode, the generation filter, the certificate pin decision) are pinned rule +// for rule against the C# reference, `src/GameCult.Mesh.Quic/CultMeshQuicRealtimeTransport.cs` +// (the connector) and `src/GameCult.Mesh/CultMeshSessions.cs` (the session +// manager's binding, ordering and racing). +// +// This module never touches `koffi` directly; every native call goes through +// `CultMeshQuicNativeRuntime` in `realtime-quic-native.ts`, which loads it +// lazily. No Odin WebSocket rendezvous lives here (Q7, ruled A): a lookup +// source is a port this module takes, not a transport it owns. + +import { createHash } from "node:crypto"; +import { createSecureContext } from "node:tls"; + +import { + routeCertificateView, + trimCSharp, + verifyAuthorityRoute, + type CultMeshAuthorityTrustPolicy, +} from "cultnet-ts"; +import type { CultMeshVerseDescriptorMessage } from "cultnet-ts/contracts"; + +import { + decodeRealtimeFrame, + encodeRealtimeFrame, + CULTMESH_REALTIME_CONNECTION_CLOSE_CODE, + type CultMeshRealtimeFrame, +} from "./realtime-wire"; +import { + CultMeshQuicNativeRuntime, + CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED, + CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED, + CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN, + CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION, + CULTMESH_QUIC_EVENT_STREAM_FRAME, + CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE, + CULTMESH_QUIC_EVENT_STREAM_SHUTDOWN, + CULTMESH_QUIC_EVENT_STREAM_STARTED, + CULTMESH_QUIC_SEND_CANCELED, + CULTMESH_QUIC_STREAM_LATEST_ONLY, + CULTMESH_QUIC_STREAM_RELIABLE, + type CultMeshQuicNativeEvent, +} from "./realtime-quic-native"; + +/** `CultMeshProtocols.RealtimeState.Value` in the C# reference. */ +export const CULTMESH_REALTIME_STATE_PROTOCOL_ID = "cultmesh.realtime_state.v1"; + +/** The QUIC realtime connector's discovery scheme; `CultMeshQuicRealtimeTransportConnector.Scheme`. */ +export const CULTMESH_QUIC_REALTIME_SCHEME = "cultmesh-state+quic"; + +/** Stable provider identity inside one Verse; `CultMeshSessionTarget` in the C# reference. */ +export interface CultMeshRealtimeTarget { + readonly verseId: string; + readonly authorityRuntimeId: string; +} + +/** A physical route candidate; the TS analogue of `CultMeshTransportCandidate`. */ +export interface CultMeshRealtimeCandidate { + readonly endpoint: string; + readonly authorityRuntimeId: string; + readonly priority: number; + readonly generation: string; +} + +/** Transport-neutral realtime plane; the TS analogue of `ICultMeshRealtimeTransport`. */ +export interface CultMeshRealtimeTransport { + readonly transportId: string; + readonly endpoint: string; + sendFrame(frame: CultMeshRealtimeFrame): Promise; + receiveFrame(signal?: AbortSignal): Promise; + dispose(): void; + isVerifiedFor( + verseId: string, + authorityRuntimeId: string, + protocolId: string, + routeGeneration: string, + ): boolean; + /** + * Registers a handler invoked once this transport becomes unusable for any + * reason (explicit `dispose()`, a peer-initiated shutdown, or an internal + * fault). A session manager uses this to evict a dead cached session so the + * next `connect()` redials, mirroring `CultMeshSessions.InvalidateRealtimeSession`. + */ + onDisposed?(handler: () => void): void; +} + +/** Creates realtime transports; the TS analogue of `ICultMeshRealtimeTransportConnector`. */ +export interface CultMeshRealtimeTransportConnector { + readonly connectorId: string; + readonly priority: number; + canConnect(candidate: CultMeshRealtimeCandidate): boolean; + connect( + candidate: CultMeshRealtimeCandidate, + target: CultMeshRealtimeTarget, + signal?: AbortSignal, + ): Promise; +} + +/** A route source the session manager resolves against; Q7's lookup-source port. */ +export interface ICultMeshRealtimeLookupSource { + resolve(target: CultMeshRealtimeTarget): Promise; +} + +/** `CultMeshQuicRealtimeTransportConnector.TryParseEndpoint` (`:98-109`). */ +export function parseQuicRealtimeEndpoint( + endpoint: string, +): { host: string; port: number; certificateSha256?: string } { + let parsed: URL; + try { + parsed = new URL(endpoint); + } catch { + throw new Error(`QUIC realtime connector does not support '${endpoint}'.`); + } + if (parsed.protocol.toLowerCase() !== `${CULTMESH_QUIC_REALTIME_SCHEME}:`) { + throw new Error(`QUIC realtime connector does not support '${endpoint}'.`); + } + if (!parsed.hostname) { + throw new Error(`QUIC realtime connector does not support '${endpoint}'.`); + } + const port = parsed.port ? Number.parseInt(parsed.port, 10) : Number.NaN; + if (!Number.isInteger(port) || port <= 0) { + throw new Error(`QUIC realtime connector does not support '${endpoint}'.`); + } + const pin = parsed.searchParams.get("cert-sha256") ?? undefined; + return { host: parsed.hostname, port, certificateSha256: pin ?? undefined }; +} + +function certificateSha256Hex(der: Uint8Array): string { + return createHash("sha256").update(der).digest("hex"); +} + +/** Shared by `CultMeshQuicRealtimeTransport.sendFrame` and `CultMeshQuicRealtimeProvider.broadcast`: one message, not two copies that can drift. */ +const CULTMESH_QUIC_UNRELIABLE_UNSUPPORTED_MESSAGE = + "The native MsQuic connector exposes streams but not QUIC datagrams; unreliable delivery is not supported."; + +interface PendingSend { + resolve(): void; + reject(error: Error): void; +} + +interface LatestGeneration { + producerEpoch: bigint; + sequence: bigint; +} + +function compareGeneration(a: LatestGeneration, b: LatestGeneration): number { + if (a.producerEpoch !== b.producerEpoch) return a.producerEpoch < b.producerEpoch ? -1 : 1; + if (a.sequence === b.sequence) return 0; + return a.sequence < b.sequence ? -1 : 1; +} + +/** A direct entry, or a coalesced `key` to resolve against `pending` at delivery time. */ +type InboxToken = { readonly value: T } | { readonly key: string }; + +/** + * Mirrors the C# reference's `CultMeshRealtimeInbox` + * (`CultMeshQuicRealtimeTransport.cs:598-644`): publishing under `key` + * coalesces to at most one pending entry per key, keeping that key's + * first-arrival queue position while a later publish overwrites its value; + * publishing with no `key` always queues, unbounded. `receive` drains + * whatever is queued before a `complete(error)` rejects further calls. + * Shared by the transport's inbound queue, the provider's fan-in, and (via + * a pump reading it instead of `receive` callers) each peer's outbox. + */ +class CultMeshRealtimeInbox { + private readonly pending = new Map(); + private readonly ready: InboxToken[] = []; + private readonly waiters: { resolve(value: T): void; reject(error: Error): void }[] = []; + private completed = false; + private terminalError: Error | undefined; + + /** Entries queued but not yet delivered: one per ready key, or one per unkeyed entry. Test-visible. */ + get size(): number { + return this.ready.length; + } + + /** Publishes `value`, coalescing on `key` when given. Returns `false` once `complete()` has run. */ + publish(value: T, key?: string): boolean { + if (this.completed) return false; + if (key === undefined) { + this.deliver({ value }); + return true; + } + const alreadyPending = this.pending.has(key); + this.pending.set(key, value); + if (!alreadyPending) this.deliver({ key }); + return true; + } + + /** Resolves the oldest ready entry, or waits for one; rejects once `complete(error)` has drained the backlog. */ + async receive(signal?: AbortSignal): Promise { + if (this.ready.length > 0) return this.take(this.ready.shift()!); + if (this.completed) throw this.terminalError ?? new Error("CultMesh realtime inbox is completed."); + if (signal?.aborted) throw new Error("CultMesh realtime inbox receive aborted."); + return await new Promise((resolve, reject) => { + const onAbort = (): void => { + const index = this.waiters.indexOf(waiter); + if (index >= 0) this.waiters.splice(index, 1); + reject(new Error("CultMesh realtime inbox receive aborted.")); + }; + const waiter = { + resolve: (value: T) => { + signal?.removeEventListener("abort", onAbort); + resolve(value); + }, + reject: (error: Error) => { + signal?.removeEventListener("abort", onAbort); + reject(error); + }, + }; + signal?.addEventListener("abort", onAbort, { once: true }); + this.waiters.push(waiter); + }); + } + + /** Completes the inbox: entries already queued still drain via `receive`; every call after that rejects with `error`. */ + complete(error?: Error): void { + if (this.completed) return; + this.completed = true; + this.terminalError = error; + for (const waiter of this.waiters.splice(0, this.waiters.length)) { + waiter.reject(error ?? new Error("CultMesh realtime inbox is completed.")); + } + } + + private deliver(token: InboxToken): void { + const waiter = this.waiters.shift(); + if (waiter) { + waiter.resolve(this.take(token)); + return; + } + this.ready.push(token); + } + + private take(token: InboxToken): T { + if ("value" in token) return token.value; + const value = this.pending.get(token.key)!; + this.pending.delete(token.key); + return value; + } +} + +/** Configures certificate acceptance for an outbound QUIC realtime connection. */ +export interface CultMeshQuicRealtimeConnectorOptions { + readonly handshakeTimeoutMs?: number; + readonly validateProviderCertificate?: ( + target: CultMeshRealtimeTarget, + der: Uint8Array, + ) => boolean; +} + +/** Creates Node-native MsQuic realtime connections. `ConnectorId` is `"msquic-realtime"`. */ +export class CultMeshQuicRealtimeConnector implements CultMeshRealtimeTransportConnector { + private readonly options: CultMeshQuicRealtimeConnectorOptions; + + constructor(options: CultMeshQuicRealtimeConnectorOptions = {}) { + this.options = options; + } + + readonly connectorId = "msquic-realtime"; + readonly priority = 0; + + canConnect(candidate: CultMeshRealtimeCandidate): boolean { + try { + parseQuicRealtimeEndpoint(candidate.endpoint); + return true; + } catch { + return false; + } + } + + async connect( + candidate: CultMeshRealtimeCandidate, + target: CultMeshRealtimeTarget, + signal?: AbortSignal, + ): Promise { + if (signal?.aborted) { + throw new Error("CultMesh QUIC connect aborted."); + } + const { host, port, certificateSha256 } = parseQuicRealtimeEndpoint(candidate.endpoint); + const runtime = await CultMeshQuicNativeRuntime.open(); + let connectionId: bigint; + try { + connectionId = runtime.connectionOpen(host, port); + } catch (error) { + await runtime.release(); + throw error; + } + + const handshakeTimeoutMs = this.options.handshakeTimeoutMs ?? 10_000; + const validator = this.options.validateProviderCertificate; + + return await new Promise((resolve, reject) => { + let settled = false; + + // Every failure path below — an already-aborted signal, the handshake + // timeout, a later abort, and any handshake-time error — settles here + // exactly once: shut the native connection down, drop the runtime + // reference, and reject. + const fail = (error: Error): void => { + if (settled) return; + settled = true; + clearTimeout(timer); + signal?.removeEventListener("abort", onAbort); + runtime.offConnectionEvent(connectionId); + runtime.connectionShutdown(connectionId, CULTMESH_REALTIME_CONNECTION_CLOSE_CODE); + void runtime.release(); + reject(error); + }; + + const succeed = (transport: CultMeshRealtimeTransport): void => { + if (settled) return; + settled = true; + clearTimeout(timer); + signal?.removeEventListener("abort", onAbort); + resolve(transport); + }; + + // Honour a signal already aborted by the time we reach here (it fired + // before `addEventListener` could observe it, so it never would). + if (signal?.aborted) { + fail(new Error("CultMesh QUIC connect aborted.")); + return; + } + + const timer = setTimeout( + () => fail(new Error(`CultMesh QUIC handshake with '${candidate.endpoint}' timed out.`)), + handshakeTimeoutMs, + ); + const onAbort = (): void => fail(new Error("CultMesh QUIC connect aborted.")); + signal?.addEventListener("abort", onAbort, { once: true }); + + // Told by the runtime when this connection faults mid-dispatch (a + // throwing validator during the handshake, or a malformed frame / + // stream-kind mismatch afterwards): reject the still-pending connect, + // or hand the fault to the connected transport. + const onFault = (error: Error): void => { + if (!settled) { + fail(error); + return; + } + transport.fault(error); + }; + + const transport = new CultMeshQuicRealtimeTransport( + candidate.endpoint, + runtime, + connectionId, + target, + candidate.generation, + ); + + runtime.onConnectionEvent( + connectionId, + (event) => { + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED) { + const der = event.payload; + const accepted = validator + ? validator(target, der) + : certificateSha256 !== undefined && + certificateSha256Hex(der).toLowerCase() === certificateSha256.toLowerCase(); + try { + runtime.connectionCertificateComplete(connectionId, accepted); + } catch (error) { + fail(error instanceof Error ? error : new Error(String(error))); + return; + } + if (!accepted) { + fail(new Error(`CultMesh QUIC provider certificate for '${candidate.endpoint}' was rejected.`)); + } + return; + } + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN && !settled) { + const reason = Buffer.from(event.payload).toString("utf8"); + fail(new Error(`CultMesh QUIC connection closed during handshake: ${reason || event.code}`)); + return; + } + transport.handleConnectionEvent(event); + if (!settled && event.type === CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED) { + succeed(transport); + } + }, + onFault, + ); + }); + } +} + +/** + * `CultMeshQuicRealtimeTransport`, over the native v2 bridge. `TransportId` + * is `"msquic-realtime"`. + */ +export class CultMeshQuicRealtimeTransport implements CultMeshRealtimeTransport { + readonly transportId = "msquic-realtime"; + readonly endpoint: string; + + private readonly runtime: CultMeshQuicNativeRuntime; + private readonly connectionId: bigint; + private readonly target: CultMeshRealtimeTarget; + private readonly routeGeneration: string; + /** Serializes writes to the reliable-ordered outbound stream: each send chains onto this tail. */ + private reliableSendTail: Promise = Promise.resolve(); + private readonly pendingSends = new Map(); + /** Peer-opened stream id to its declared kind, pruned on `STREAM_SHUTDOWN`; see `trackedStreamCount`. */ + private readonly streamKinds = new Map(); + /** Generation staleness filter: the newest `(channel, body)` generation delivered so far. */ + private readonly latestGenerations = new Map(); + /** Inbound frame queue: bounded to one pending latest-only frame per key. */ + private readonly inbox = new CultMeshRealtimeInbox(); + private reliableOutboundStreamId: bigint | undefined; + private disposed = false; + private terminalError: Error | undefined; + private readonly disposalHandlers = new Set<() => void>(); + + constructor( + endpoint: string, + runtime: CultMeshQuicNativeRuntime, + connectionId: bigint, + target: CultMeshRealtimeTarget, + routeGeneration: string, + ) { + this.endpoint = endpoint; + this.runtime = runtime; + this.connectionId = connectionId; + this.target = target; + this.routeGeneration = routeGeneration ?? ""; + } + + isVerifiedFor( + verseId: string, + authorityRuntimeId: string, + protocolId: string, + routeGeneration: string, + ): boolean { + return ( + this.target.verseId === verseId && + this.target.authorityRuntimeId === authorityRuntimeId && + CULTMESH_REALTIME_STATE_PROTOCOL_ID === protocolId && + this.routeGeneration === routeGeneration + ); + } + + /** Number of peer-opened streams still tracked for their kind. Test-visible: proves `STREAM_SHUTDOWN` prunes `streamKinds` instead of leaking one entry per stream for the life of the connection. */ + get trackedStreamCount(): number { + return this.streamKinds.size; + } + + async sendFrame(frame: CultMeshRealtimeFrame): Promise { + if (this.disposed) throw new Error("CultMesh QUIC realtime transport is disposed."); + if (frame.delivery === "unreliable") { + throw new Error(CULTMESH_QUIC_UNRELIABLE_UNSUPPORTED_MESSAGE); + } + return this.sendEncodedFrame(frame.delivery, encodeRealtimeFrame(frame)); + } + + /** + * @internal The primitive `sendFrame` itself calls, after encoding. Exposed + * so a caller that already holds the encoded bytes for many peers at once + * — `CultMeshQuicRealtimeProvider.broadcast` fanning a frame out to every + * peer, and each peer's `CultMeshQuicRealtimeProviderOutbox` pump — sends + * them without re-encoding (and re-validating) per peer. + */ + async sendEncodedFrame(delivery: "reliable-ordered" | "latest-only", encoded: Uint8Array): Promise { + if (this.disposed) throw new Error("CultMesh QUIC realtime transport is disposed."); + if (delivery === "reliable-ordered") { + const send = this.reliableSendTail.then(async () => { + if (this.reliableOutboundStreamId === undefined) { + this.reliableOutboundStreamId = this.runtime.streamOpen( + this.connectionId, + CULTMESH_QUIC_STREAM_RELIABLE, + ); + } + await this.sendOnStream(this.reliableOutboundStreamId, encoded, false); + }); + // The tail must advance even if this send rejects, so the next queued + // send is not blocked forever on a settled promise; the caller still + // observes the rejection through `send` itself. + this.reliableSendTail = send.catch(() => {}); + return send; + } + // latest-only: a fresh stream per send, mirroring the C# reference. + const streamId = this.runtime.streamOpen(this.connectionId, CULTMESH_QUIC_STREAM_LATEST_ONLY); + await this.sendOnStream(streamId, encoded, true); + } + + /** + * A pending send registered after `cleanup()` already ran (a `sendFrame` + * queued behind `reliableSendTail` whose microtask lands after `dispose()` + * or a fault settles this transport) would otherwise sit in `pendingSends` + * forever: `cleanup()`'s own reject sweep already ran once and is guarded + * against running again, and `offConnectionEvent` means no later native + * event can resolve it either. Checking `this.disposed` here closes that + * window: any send that loses the race against disposal rejects + * immediately instead of registering an entry nothing will ever settle. + */ + private sendOnStream(streamId: bigint, encoded: Uint8Array, fin: boolean): Promise { + return new Promise((resolve, reject) => { + if (this.disposed) { + reject(this.terminalError ?? new Error("CultMesh QUIC realtime transport is disposed.")); + return; + } + this.pendingSends.set(streamId, { resolve, reject }); + try { + this.runtime.streamSendFrame(streamId, encoded, fin); + } catch (error) { + this.pendingSends.delete(streamId); + reject(error instanceof Error ? error : new Error(String(error))); + } + }); + } + + async receiveFrame(signal?: AbortSignal): Promise { + return this.inbox.receive(signal); + } + + /** Registers a handler invoked once, when this transport becomes unusable. */ + onDisposed(handler: () => void): void { + if (this.disposed) { + handler(); + return; + } + this.disposalHandlers.add(handler); + } + + dispose(): void { + if (this.disposed) return; + try { + this.runtime.connectionShutdown(this.connectionId, CULTMESH_REALTIME_CONNECTION_CLOSE_CODE); + } catch { + // Best-effort: the connection may already be gone. + } + this.cleanup(); + } + + /** + * @internal Called by the connector when the native runtime faults this + * connection mid-dispatch (a malformed frame, a stream-kind mismatch, or a + * throwing caller callback). Mirrors the C# reference's + * `_received.Complete(error)` / `_shutdown.Cancel()`: pending and future + * `receiveFrame` calls reject with `error`, and the connection is torn + * down. The native side has already shut the connection down and removed + * its listener by the time this runs. + */ + fault(error: Error): void { + this.cleanup(error); + } + + /** + * Runs exactly once, however the transport becomes unusable: explicit + * `dispose()`, a peer-initiated `CONNECTION_SHUTDOWN`, or `fault()`. + * Releases the runtime reference before running any `onDisposed` handler, + * so a handler that throws (or blocks) can never delay or skip the + * release; every handler runs in its own try/catch, so one throwing + * handler cannot stop the rest from running. Also rejects every pending + * and future receive/send, so none of those paths can leak the reference + * or hang a waiter forever. + */ + private cleanup(error?: Error): void { + if (this.disposed) return; + this.disposed = true; + this.terminalError = error; + this.runtime.offConnectionEvent(this.connectionId); + const rejection = error ?? new Error("CultMesh QUIC realtime transport is disposed."); + for (const [, pending] of this.pendingSends) pending.reject(rejection); + this.pendingSends.clear(); + this.inbox.complete(rejection); + void this.runtime.release(); + const handlers = [...this.disposalHandlers]; + this.disposalHandlers.clear(); + for (const handler of handlers) { + try { + handler(); + } catch (handlerError) { + // eslint-disable-next-line no-console + console.error("CultMesh QUIC realtime transport onDisposed handler threw:", handlerError); + } + } + } + + /** @internal Routed here by the connector's connection-event registration. */ + handleConnectionEvent(event: CultMeshQuicNativeEvent): void { + switch (event.type) { + case CULTMESH_QUIC_EVENT_STREAM_STARTED: + this.streamKinds.set(event.streamId, event.streamKind); + return; + case CULTMESH_QUIC_EVENT_STREAM_FRAME: + this.onStreamFrame(event); + return; + case CULTMESH_QUIC_EVENT_STREAM_SHUTDOWN: + this.streamKinds.delete(event.streamId); + return; + case CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE: { + const pending = this.pendingSends.get(event.streamId); + if (!pending) return; + this.pendingSends.delete(event.streamId); + if (event.code === BigInt(CULTMESH_QUIC_SEND_CANCELED)) { + pending.reject(new Error("CultMesh QUIC send was canceled.")); + } else { + pending.resolve(); + } + return; + } + case CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN: + this.cleanup(new Error("CultMesh QUIC connection was closed by the remote peer.")); + return; + default: + return; + } + } + + /** + * `ReadStreamAsync`'s stream-kind/delivery consistency check (`:519-524`). + * Throwing here is intentional: the native runtime's dispatch loop (fix 1) + * catches it, faults only this connection, and keeps the pump and every + * other connection running. + */ + private onStreamFrame(event: CultMeshQuicNativeEvent): void { + const kind = this.streamKinds.get(event.streamId); + const frame = decodeRealtimeFrame(event.payload); + if (kind === CULTMESH_QUIC_STREAM_RELIABLE && frame.delivery !== "reliable-ordered") { + throw new Error("Reliable QUIC stream carried incompatible delivery semantics."); + } + if (kind === CULTMESH_QUIC_STREAM_LATEST_ONLY && frame.delivery !== "latest-only") { + throw new Error("Latest-only QUIC stream carried incompatible delivery semantics."); + } + this.publishReceived(frame); + } + + /** + * `PublishReceived`'s per-`(channel, body)` generation filter (`:538-560`), + * plus the inbox's own coalescing: a latest-only frame overwrites the + * still-pending frame for its key rather than queuing beside it, so an + * unread backlog holds at most one frame per `(channel, body)`. + * Reliable-ordered frames queue directly, unbounded, exactly as the C# + * reference's unbounded channel does. + */ + private publishReceived(frame: CultMeshRealtimeFrame): void { + if (frame.delivery === "latest-only") { + const key = frame.channelId + "\u001f" + frame.bodyId; + const candidate: LatestGeneration = { producerEpoch: frame.producerEpoch, sequence: frame.sequence }; + const current = this.latestGenerations.get(key); + if (current && compareGeneration(candidate, current) <= 0) return; + this.latestGenerations.set(key, candidate); + this.inbox.publish(frame, key); + return; + } + this.inbox.publish(frame); + } +} + +/** + * `TryPublishLatest` plus `SendPublishedFramesAsync` (`:363-367`, `:421-439`), + * over a coalescing outbox (`:572-618`). Owns one peer's outbound + * `latest-only` traffic: `publish` never blocks (it just replaces whatever is + * still pending for the frame's `(channel, body)` key and, if a pump is not + * already draining, starts one), and the pump opens a fresh kind-2 stream per + * frame through the peer's own `sendFrame` (unchanged from the consumer path + * above), sending with `fin` and waiting for `send_complete` before it takes + * the next ready key. A stalled peer therefore accumulates at most one + * pending frame per key and never blocks a caller's `broadcast`. A send + * failure evicts the peer once, the same way a reliable-ordered send failure + * does in `CultMeshQuicRealtimeProvider.broadcast`. + */ +interface OutboxEntry { + readonly frame: CultMeshRealtimeFrame; + readonly encoded: Uint8Array; +} + +class CultMeshQuicRealtimeProviderOutbox { + private readonly inbox = new CultMeshRealtimeInbox(); + private readonly transport: CultMeshQuicRealtimeTransport; + private readonly onSendFailure: (error: Error) => void; + private pumping = false; + private disposed = false; + + constructor(transport: CultMeshQuicRealtimeTransport, onSendFailure: (error: Error) => void) { + this.transport = transport; + this.onSendFailure = onSendFailure; + } + + /** + * Enqueues an already-encoded `frame`, coalescing on `(channelId, + * bodyId)`. Never blocks. Takes the encoded bytes rather than encoding its + * own copy so every peer's outbox reuses the one encode `broadcast` (or a + * retained-frame seed) already did for this frame. + */ + publish(frame: CultMeshRealtimeFrame, encoded: Uint8Array): void { + if (this.disposed) return; + const key = frame.channelId + "\u001f" + frame.bodyId; + this.inbox.publish({ frame, encoded }, key); + if (!this.pumping) void this.pump(); + } + + dispose(): void { + this.disposed = true; + this.inbox.complete(); + } + + /** One in flight per peer: the next ready key is taken only after `send_complete`, mirroring `SendPublishedFramesAsync`. */ + private async pump(): Promise { + this.pumping = true; + try { + for (;;) { + if (this.disposed) return; + let entry: OutboxEntry; + try { + entry = await this.inbox.receive(); + } catch { + return; + } + try { + await this.transport.sendEncodedFrame("latest-only", entry.encoded); + } catch (error) { + this.dispose(); + this.onSendFailure(error instanceof Error ? error : new Error(String(error))); + return; + } + } + } finally { + this.pumping = false; + } + } +} + +/** Stable placeholder target for a provider's accepted peer connections: `isVerifiedFor` is a consumer-side concept the provider never calls. */ +const CULTMESH_PROVIDER_PEER_TARGET: CultMeshRealtimeTarget = { verseId: "", authorityRuntimeId: "" }; + +/** Configures a `CultMeshQuicRealtimeProvider` listener. */ +export interface CultMeshQuicRealtimeProviderOptions { + readonly host: string; + readonly port: number; + readonly serverCertificate: { readonly pkcs12: Uint8Array; readonly password?: string }; + readonly handshakeTimeoutMs?: number; + /** + * The host advertised in `advertisedEndpoint`, when it differs from the + * bind address `host` — the usual case for a public service: `host` is + * typically `0.0.0.0`, an empty string, or an IPv6 wildcard (`::`), none of + * which describe a route a client can dial, and the native listener (which + * `host` also configures) only accepts IP addresses in the first place, not + * a DNS name. Defaults to `host`. + */ + readonly advertisedHost?: string; + /** + * When `false` (the default: every existing caller, test, and interop + * peer calls `receive()`), the provider fans client-originated streams + * into `receive()` as before. When `true`, the provider is publish-only: + * any stream a peer opens faults that connection at `STREAM_STARTED`, + * before a frame can be decoded or queued, so no inbox, generation-map, + * or fan-in entry is ever created for client data; `receive()` itself + * rejects. StreamPixels sets this explicitly — it closes the unbounded + * per-client memory growth Soul's probe found. + */ + readonly acceptClientFrames?: boolean; + /** + * Refuses a new connection at accept once the number of connections this + * provider is tracking (including mid-handshake ones) has reached this + * many: shut down immediately, before any transport, outbox, or + * retained-frame seeding is allocated for it. Existing peers are + * unaffected. Defaults to 1024 — far more than any single StreamPixels + * fan-out needs today, while still bounding per-connection overhead + * against a public UDP port whose pin authenticates only the server, so + * any internet client can dial in. StreamPixels sets its own value. + */ + readonly maxConnections?: number; +} + +/** + * Brackets an IPv6 literal for use in a URL authority (`[::1]:443`), the way + * `URL` itself renders one; a hostname or IPv4 literal passes through + * unchanged, and an already-bracketed literal is left alone. + */ +function formatEndpointHost(host: string): string { + if (host.startsWith("[")) return host; + return host.includes(":") ? `[${host}]` : host; +} + +/** + * Recovers the leaf certificate's DER bytes from a PKCS12 credential, to + * compute the pin a provider advertises. Node has no public PKCS12 decoder; + * `tls.createSecureContext` loads the PKCS12 through OpenSSL, and its + * internal `context.getCertificate()` is the only way to read back the DER + * bytes OpenSSL parsed out of it. Probed against the pinned Node 24 build and + * this package's own test fixture pair (`test/fixtures/quic-test.p12` and + * `quic-test-cert.der`, generated independently by `openssl pkcs12 -export`): + * the returned buffer is byte-identical to the `.der` file and its SHA-256 + * matches the pin the fixture's tests already assert. + */ +function extractLeafCertificateDer(serverCertificate: CultMeshQuicRealtimeProviderOptions["serverCertificate"]): Uint8Array { + const context = createSecureContext({ + pfx: Buffer.from(serverCertificate.pkcs12), + passphrase: serverCertificate.password ?? "", + }) as unknown as { context: { getCertificate(): Buffer | undefined } }; + const der = context.context.getCertificate(); + if (!der || der.length === 0) { + throw new Error("CultMesh QUIC provider certificate has no parseable leaf certificate."); + } + return new Uint8Array(der); +} + +/** + * The StreamPixels role: a TypeScript listener that broadcasts with an + * explicit delivery mode and cannot be backpressured by a slow consumer. + * Rule for rule, this is `CultMeshQuicRealtimeServer` (`CultMeshQuicRealtimeTransport.cs:151-310`): + * `listen` opens a listener and computes the advertised endpoint; + * `broadcast` mirrors `BroadcastAsync` (`:216-235`); `receive` mirrors + * `ReceiveAsync` fanned in from every accepted peer's inbox + * (`CultMeshRealtimeInbox.ReceiveAsync`, `:597-609`); peers are evicted on + * send failure or shutdown, and there is no reconnect logic here, matching + * the C# reference's `AcceptLoopAsync` (`:276-309`). + */ +export class CultMeshQuicRealtimeProvider { + /** `cultmesh-state+quic://:?cert-sha256=`, uppercase — the Unity connector requires the pin. */ + readonly advertisedEndpoint: string; + + private readonly runtime: CultMeshQuicNativeRuntime; + private readonly listenerId: bigint; + private readonly handshakeTimeoutMs: number; + private readonly peers = new Set(); + private readonly outboxes = new Map(); + /** The newest `latest-only` frame broadcast so far per `(channel, body)` key, already + * encoded, seeded into every peer attached after that broadcast. Reliable-ordered frames + * are events, not state, and are never retained. */ + private readonly retained = new Map(); + /** Client-to-provider fan-in, bounded the same way as the transport's inbound queue. */ + private readonly received = new CultMeshRealtimeInbox(); + /** + * Every transport `acceptConnection` has created for a still-live native + * connection, whether or not its handshake has reached CONNECTED and + * joined `peers` yet. A connection whose handshake never reaches CONNECTED + * (a rejected certificate, a stalled client) would otherwise sit on its + * own handshake timer — and hold a runtime reference — for up to + * `handshakeTimeoutMs` after the provider itself was disposed, keeping the + * process alive over a connection nothing can still reach; `dispose()` + * sweeps this set instead of only `peers` to close that gap. + */ + private readonly accepted = new Set(); + private readonly acceptClientFrames: boolean; + private readonly maxConnections: number; + private disposed = false; + + private constructor( + runtime: CultMeshQuicNativeRuntime, + listenerId: bigint, + advertisedEndpoint: string, + handshakeTimeoutMs: number, + acceptClientFrames: boolean, + maxConnections: number, + ) { + this.runtime = runtime; + this.listenerId = listenerId; + this.advertisedEndpoint = advertisedEndpoint; + this.handshakeTimeoutMs = handshakeTimeoutMs; + this.acceptClientFrames = acceptClientFrames; + this.maxConnections = maxConnections; + } + + /** Number of currently accepted peer connections. */ + get connectionCount(): number { + return this.peers.size; + } + + /** Frames fanned in from peers but not yet drained by `receive()`. Test-visible: proves the fan-in queue is bounded. */ + get receiveQueueSize(): number { + return this.received.size; + } + + static async listen(options: CultMeshQuicRealtimeProviderOptions): Promise { + const handshakeTimeoutMs = options.handshakeTimeoutMs ?? 10_000; + const der = extractLeafCertificateDer(options.serverCertificate); + const pinHex = certificateSha256Hex(der).toUpperCase(); + const bindHost = options.host && options.host.length > 0 ? options.host : "127.0.0.1"; + const advertisedHost = options.advertisedHost && options.advertisedHost.length > 0 ? options.advertisedHost : bindHost; + + const runtime = await CultMeshQuicNativeRuntime.open(); + let listenerId: bigint; + let boundPort: number; + try { + ({ listenerId, boundPort } = runtime.listenerOpen( + options.host || null, + options.port, + options.serverCertificate.pkcs12, + options.serverCertificate.password ?? null, + )); + } catch (error) { + await runtime.release(); + throw error; + } + + const advertisedEndpoint = `${CULTMESH_QUIC_REALTIME_SCHEME}://${formatEndpointHost(advertisedHost)}:${boundPort}?cert-sha256=${pinHex}`; + const provider = new CultMeshQuicRealtimeProvider( + runtime, + listenerId, + advertisedEndpoint, + handshakeTimeoutMs, + options.acceptClientFrames ?? true, + options.maxConnections ?? 1024, + ); + runtime.onListenerEvent(listenerId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION) provider.acceptConnection(event.connectionId); + }); + return provider; + } + + /** + * `BroadcastAsync` (`:216-235`). `latest-only` enqueues into each peer's + * outbox and returns as soon as every peer has accepted the frame into its + * outbox — never once any peer's I/O. `reliable-ordered` awaits every + * peer's `send_complete` (or eviction) before resolving, matching + * `Task.WhenAll` over `SendToConnectedClientAsync` (`:233-255`). + */ + async broadcast(frame: CultMeshRealtimeFrame): Promise { + if (this.disposed) throw new Error("CultMesh QUIC realtime provider is disposed."); + if (frame.delivery === "unreliable") { + throw new Error(CULTMESH_QUIC_UNRELIABLE_UNSUPPORTED_MESSAGE); + } + // Encode (and validate) exactly once, up front: an invalid frame throws + // here, to the caller, before touching any peer. The old per-peer encode + // inside `sendFrame` meant an invalid frame failed identically for every + // peer in turn, evicting all of them while `broadcast` itself still + // reported success. + const encoded = encodeRealtimeFrame(frame); + if (frame.delivery === "latest-only") { + const key = frame.channelId + "\u001f" + frame.bodyId; + const current = this.retained.get(key); + const candidate: LatestGeneration = { producerEpoch: frame.producerEpoch, sequence: frame.sequence }; + if (!current || compareGeneration(candidate, current.generation) > 0) { + this.retained.set(key, { frame, encoded, generation: candidate }); + } + for (const outbox of this.outboxes.values()) outbox.publish(frame, encoded); + return; + } + const sends = [...this.peers].map(async (transport) => { + try { + await transport.sendEncodedFrame("reliable-ordered", encoded); + } catch { + transport.dispose(); + } + }); + if (sends.length > 0) await Promise.all(sends); + } + + /** The next client-originated frame, fanned in from every accepted peer. */ + async receive(signal?: AbortSignal): Promise { + if (!this.acceptClientFrames) { + throw new Error( + "CultMesh QUIC realtime provider is publish-only (acceptClientFrames: false); it never accepts client frames.", + ); + } + return this.received.receive(signal); + } + + dispose(): void { + if (this.disposed) return; + this.disposed = true; + try { + this.runtime.listenerClose(this.listenerId); + } catch { + // Best-effort: the listener may already be gone. + } + // `accepted` is every transport this provider ever created for a native + // connection, from the moment `acceptConnection` synchronously builds + // it — whether or not its handshake ever reached CONNECTED and joined + // `peers`. A still-handshaking connection has no other owner to sweep it. + for (const transport of [...this.accepted]) transport.dispose(); + this.received.complete(new Error("CultMesh QUIC realtime provider is disposed.")); + void this.runtime.release(); + } + + /** Coalesces client-sent `latest-only` frames by `(channel, body)`, so a publish-only `receive()` caller (StreamPixels) backs up to at most one pending frame per key. */ + private async pumpReceivedFrom(transport: CultMeshQuicRealtimeTransport): Promise { + for (;;) { + let frame: CultMeshRealtimeFrame; + try { + frame = await transport.receiveFrame(); + } catch { + return; // The transport is disposed/faulted; nothing more to read. + } + if (frame.delivery === "latest-only") { + this.received.publish(frame, frame.channelId + "\u001f" + frame.bodyId); + } else { + this.received.publish(frame); + } + } + } + + /** + * Handles `LISTENER_NEW_CONNECTION`, fully synchronously: one handler owns + * this connection from this point on, so there is no async window in which + * a NEW_CONNECTION-then-CONNECTED pair (the bridge's own event order, + * `native/GameCult.Mesh.Quic.Native/cultmesh_quic_native.cpp:731-757,627`) + * can be split across a temporary buffering handler and a later real one. + * `this.runtime.retain()` takes a reference on the provider's own + * already-open runtime instead of `await`ing a fresh + * `CultMeshQuicNativeRuntime.open()`, which is what used to force that + * split: the previous async gap left `CONNECTION_CONNECTED` dispatched + * straight to `transport.handleConnectionEvent` (which has no case for + * it) with nothing to clear the handshake timer, so a healthy peer was + * evicted at `handshakeTimeoutMs` regardless of how well-behaved the + * client was. + */ + private acceptConnection(connectionId: bigint): void { + if (this.disposed) { + this.runtime.connectionShutdown(connectionId, CULTMESH_REALTIME_CONNECTION_CLOSE_CODE); + return; + } + if (this.accepted.size >= this.maxConnections) { + // Refused before any transport, timer, or outbox exists for it: + // existing accepted connections are untouched. + this.runtime.connectionShutdown(connectionId, CULTMESH_REALTIME_CONNECTION_CLOSE_CODE); + return; + } + + const transport = new CultMeshQuicRealtimeTransport( + `quic-peer-${connectionId}`, + this.runtime.retain(), + connectionId, + CULTMESH_PROVIDER_PEER_TARGET, + "", + ); + this.accepted.add(transport); + + const handshakeTimer = setTimeout(() => transport.dispose(), this.handshakeTimeoutMs); + transport.onDisposed(() => { + clearTimeout(handshakeTimer); + this.accepted.delete(transport); + this.peers.delete(transport); + this.outboxes.get(transport)?.dispose(); + this.outboxes.delete(transport); + }); + + // CONNECTED fires at most once per connection; `attached` guards against + // ever running the join-`peers` bookkeeping twice. + let attached = false; + this.runtime.onConnectionEvent( + connectionId, + (event) => { + // Publish-only: a peer-opened stream faults this connection alone, + // before `handleConnectionEvent` can record its stream kind or + // decode a frame off it. Throwing here drives the dispatch loop's + // own fault path (`CultMeshQuicNativeRuntime.dispatch`), which + // shuts the connection down and evicts it. + if (!this.acceptClientFrames && event.type === CULTMESH_QUIC_EVENT_STREAM_STARTED) { + throw new Error( + "CultMesh QUIC provider is publish-only (acceptClientFrames: false); it does not accept inbound streams from peers.", + ); + } + transport.handleConnectionEvent(event); + if (attached || event.type !== CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED) return; + attached = true; + clearTimeout(handshakeTimer); + // Cut C's retained-frame seeding happens atomically here, before the + // peer joins `peers`: nothing can observe this transport as an + // attached peer with a not-yet-seeded outbox. + const outbox = new CultMeshQuicRealtimeProviderOutbox(transport, () => transport.dispose()); + for (const { frame, encoded } of this.retained.values()) outbox.publish(frame, encoded); + this.outboxes.set(transport, outbox); + this.peers.add(transport); + if (this.acceptClientFrames) void this.pumpReceivedFrom(transport); + }, + (error) => transport.fault(error), + ); + } +} + +/** `CultMeshStaticRealtimeLookupSource`: an array of pre-resolved Verse descriptors. */ +export class CultMeshStaticRealtimeLookupSource implements ICultMeshRealtimeLookupSource { + private readonly verses: readonly CultMeshVerseDescriptorMessage[]; + + constructor(verses: readonly CultMeshVerseDescriptorMessage[]) { + this.verses = verses; + } + + async resolve(target: CultMeshRealtimeTarget): Promise { + return this.verses.filter((verse) => verse.verseId === target.verseId); + } +} + +/** Options for `CultMeshQuicRealtimeSessionManager`. */ +export interface CultMeshQuicRealtimeSessionManagerOptions { + readonly lookupSource: ICultMeshRealtimeLookupSource; + readonly trust: CultMeshAuthorityTrustPolicy; + readonly connectors: readonly CultMeshRealtimeTransportConnector[]; + readonly maxRacedCandidates?: number; +} + +/** + * Binds an advertised route to a connected, authority-verified realtime + * transport. Rule for rule, this is `CultMeshSessionManager`'s realtime path + * in the C# reference (`ConnectRealtimeAsync`, `:833-896`). + */ +export class CultMeshQuicRealtimeSessionManager { + private readonly options: CultMeshQuicRealtimeSessionManagerOptions; + private readonly sessions = new Map(); + /** Single-flight: concurrent `connect()` calls for the same key share one dial. */ + private readonly connecting = new Map>(); + /** One controller per in-flight dial, so `dispose()` and `disconnect()` can cancel it. */ + private readonly dialAborts = new Map(); + private disposed = false; + + constructor(options: CultMeshQuicRealtimeSessionManagerOptions) { + if (options.connectors.length === 0) { + throw new Error("CultMeshQuicRealtimeSessionManager requires at least one realtime connector."); + } + if ((options.maxRacedCandidates ?? 2) <= 0) { + throw new Error("maxRacedCandidates must be positive."); + } + this.options = options; + } + + private sessionKey(target: CultMeshRealtimeTarget): string { + return target.verseId + "\u001f" + target.authorityRuntimeId; + } + + /** + * Resolves, verifies, races and connects; disposes losing candidates. + * Returns the cached session for `target` when one is live. Concurrent + * calls for the same target share one dial (mirrors C#'s `Lazy`); a + * transport that dies later (peer shutdown, an internal fault, or explicit + * disposal) evicts itself from the cache so the next call redials, mirroring + * `CultMeshSessions.InvalidateRealtimeSession` (`:898-913`). + */ + async connect(target: CultMeshRealtimeTarget): Promise { + if (this.disposed) throw new Error("CultMeshQuicRealtimeSessionManager is disposed."); + const key = this.sessionKey(target); + const existing = this.sessions.get(key); + if (existing) return existing; + + const inFlight = this.connecting.get(key); + if (inFlight) return inFlight; + + const controller = new AbortController(); + this.dialAborts.set(key, controller); + const attempt = this.connectOwnedAsync(key, target, controller.signal).finally(() => { + this.connecting.delete(key); + if (this.dialAborts.get(key) === controller) this.dialAborts.delete(key); + }); + this.connecting.set(key, attempt); + return attempt; + } + + private async connectOwnedAsync( + key: string, + target: CultMeshRealtimeTarget, + signal: AbortSignal, + ): Promise { + const transport = await this.dialAsync(key, target, signal); + if (this.disposed || signal.aborted) { + transport.dispose(); + throw new Error( + this.disposed + ? "CultMeshQuicRealtimeSessionManager was disposed while connecting." + : `Dial for '${key}' was cancelled while connecting.`, + ); + } + this.sessions.set(key, transport); + transport.onDisposed?.(() => { + if (this.sessions.get(key) === transport) this.sessions.delete(key); + }); + return transport; + } + + private async dialAsync( + key: string, + target: CultMeshRealtimeTarget, + signal: AbortSignal, + ): Promise { + const verses = await this.options.lookupSource.resolve(target); + const routes = verses + .flatMap((verse) => verse.authorityRoutes ?? []) + .filter((route) => route.authorityRuntimeId === target.authorityRuntimeId) + .filter((route) => route.protocolIds.includes(CULTMESH_REALTIME_STATE_PROTOCOL_ID)); + if (routes.length === 0) { + throw new Error(`No realtime state route was advertised for '${key}'.`); + } + + const verifiedCandidates: CultMeshRealtimeCandidate[] = []; + const verificationFailures: Error[] = []; + for (const route of routes) { + const candidate: CultMeshRealtimeCandidate = { + endpoint: route.endpoint, + authorityRuntimeId: route.authorityRuntimeId, + priority: route.priority, + generation: trimCSharp(route.generation), + }; + try { + await verifyAuthorityRoute( + { + verseId: target.verseId, + authorityRuntimeId: route.authorityRuntimeId, + endpoint: route.endpoint, + protocolIds: route.protocolIds, + priority: route.priority, + generation: route.generation, + certificate: routeCertificateView(route.certificate), + }, + this.options.trust, + ); + verifiedCandidates.push(candidate); + } catch (error) { + verificationFailures.push(error instanceof Error ? error : new Error(String(error))); + } + } + if (verifiedCandidates.length === 0) { + throw new Error( + `No trusted realtime route remained for '${key}': ${verificationFailures.map((error) => error.message).join("; ")}`, + ); + } + + const tiers = new Map>(); + for (const candidate of verifiedCandidates) { + for (const connector of this.options.connectors) { + if (!connector.canConnect(candidate)) continue; + const tier = connector.priority; + const list = tiers.get(tier) ?? []; + list.push({ candidate, connector }); + tiers.set(tier, list); + } + } + if (tiers.size === 0) { + throw new Error(`No realtime connector supports an advertised route for '${key}'.`); + } + + const maxRaced = this.options.maxRacedCandidates ?? 2; + const failures: Error[] = []; + for (const tier of [...tiers.keys()].sort((a, b) => a - b)) { + if (signal.aborted) break; + const entries = [...(tiers.get(tier) ?? [])] + .sort((a, b) => a.candidate.priority - b.candidate.priority) + .slice(0, maxRaced); + const winner = await this.raceFirstSuccessAsync(key, target, entries, failures, signal); + if (winner) return winner; + } + throw new Error( + `No realtime state path connected for '${key}': ${failures.map((error) => error.message).join("; ")}`, + ); + } + + /** + * Races one tier's candidates and returns the first verified success, + * mirroring C#'s `Task.WhenAny` loop (`:851-866`): as soon as one candidate + * both connects and proves `isVerifiedFor`, the rest are aborted (an + * `AbortSignal` is threaded into `connector.connect`) and disposed once + * they settle, without blocking the return. `Promise.allSettled` here would + * instead wait out every candidate, including a dead route stalled on its + * own handshake timeout. + */ + private async raceFirstSuccessAsync( + key: string, + target: CultMeshRealtimeTarget, + entries: ReadonlyArray<{ candidate: CultMeshRealtimeCandidate; connector: CultMeshRealtimeTransportConnector }>, + failures: Error[], + outerSignal: AbortSignal, + ): Promise { + const controller = new AbortController(); + if (outerSignal.aborted) controller.abort(); + else outerSignal.addEventListener("abort", () => controller.abort(), { once: true }); + const pending = new Set( + entries.map((entry) => this.connectCandidateAsync(key, target, entry, controller.signal)), + ); + let winner: CultMeshRealtimeTransport | undefined; + while (pending.size > 0 && !winner) { + const settled = await Promise.race( + [...pending].map((attempt) => + attempt.then( + (value) => ({ attempt, ok: true as const, value }), + (error) => ({ attempt, ok: false as const, error }), + ), + ), + ); + pending.delete(settled.attempt); + if (settled.ok) { + winner = settled.value; + } else { + failures.push(settled.error instanceof Error ? settled.error : new Error(String(settled.error))); + } + } + if (!winner) return undefined; + + controller.abort(); + // The remaining candidates may already be in flight past the point an + // abort signal helps; dispose whatever they eventually produce, without + // blocking the winner's return. + for (const loser of pending) { + loser.then((transport) => transport.dispose()).catch(() => {}); + } + return winner; + } + + private async connectCandidateAsync( + key: string, + target: CultMeshRealtimeTarget, + entry: { candidate: CultMeshRealtimeCandidate; connector: CultMeshRealtimeTransportConnector }, + signal: AbortSignal, + ): Promise { + const transport = await entry.connector.connect(entry.candidate, target, signal); + if (!transport.isVerifiedFor(target.verseId, target.authorityRuntimeId, CULTMESH_REALTIME_STATE_PROTOCOL_ID, entry.candidate.generation)) { + transport.dispose(); + throw new Error(`Transport did not prove CultMesh authority for '${key}'.`); + } + return transport; + } + + /** + * Marks the session for `target` offline, disposing its transport. Also + * cancels a dial still in flight for `target`, so a connect racing this + * call cannot cache a transport this call meant to discard. + */ + disconnect(target: CultMeshRealtimeTarget): void { + const key = this.sessionKey(target); + const transport = this.sessions.get(key); + if (transport) { + this.sessions.delete(key); + transport.dispose(); + } + this.dialAborts.get(key)?.abort(); + } + + dispose(): void { + this.disposed = true; + for (const controller of this.dialAborts.values()) controller.abort(); + this.dialAborts.clear(); + for (const transport of this.sessions.values()) transport.dispose(); + this.sessions.clear(); + } +} diff --git a/packages/cultmesh-ts/src/realtime-wire.ts b/packages/cultmesh-ts/src/realtime-wire.ts new file mode 100644 index 00000000..9fc99789 --- /dev/null +++ b/packages/cultmesh-ts/src/realtime-wire.ts @@ -0,0 +1,192 @@ +// The one TypeScript encoding of a CultMesh realtime frame. +// +// Rule for rule, this is `CultMeshRealtimeWireProtocol` in the C# reference +// (`src/GameCult.Mesh/CultMeshRealtimeWireProtocol.cs`), over the frame shape +// `CultMeshRealtimeTransports.cs` defines. QUIC stream framing stays +// transport-owned; this file owns only the typed frame bytes and never touches +// a socket. +// +// Byte parity is proven both ways, cross-process, by two committed vector files +// under `contracts/cultmesh/`: `realtime-frame-vectors.json`, which the C# test +// `CultMeshRealtimeWireProtocolTests` writes under CULTMESH_WRITE_VECTORS=1 and +// this package's test decodes and re-encodes, and +// `realtime-frame-vectors.ts-written.json`, which +// `scripts/write-cultmesh-realtime-frame-vectors.mjs` writes with this codec and +// the same C# test decodes. A fixture authored on one side alone would only +// agree with itself. + +import { documentPayloadBytes, documentPayloadFromBytes, type DocumentPayload } from "@gamecult/cultcache-ts"; +import { isNullOrWhiteSpaceCSharp } from "cultnet-ts"; + +/** `CultMeshRealtimeWireProtocol.ApplicationProtocolName`: the QUIC ALPN. */ +export const CULTMESH_REALTIME_ALPN = "cultmesh-state-v1"; + +/** `ConnectionCloseCode`: ASCII "CULT". A QUIC error code is 62-bit, so bigint. */ +export const CULTMESH_REALTIME_CONNECTION_CLOSE_CODE = 0x43554c54n; + +/** `StreamAbortCode`: ASCII "STAT". */ +export const CULTMESH_REALTIME_STREAM_ABORT_CODE = 0x53544154n; + +/** `ReliableStream`: the stream kind carrying `reliable-ordered`. */ +export const CULTMESH_REALTIME_RELIABLE_STREAM = 1; + +/** `LatestOnlyStream`: the stream kind carrying `latest-only`. */ +export const CULTMESH_REALTIME_LATEST_ONLY_STREAM = 2; + +/** `MaximumFrameBytes`: the payload ceiling, 64 MiB. */ +export const CULTMESH_REALTIME_MAX_PAYLOAD_BYTES = 64 * 1024 * 1024; + +/** `MaximumEncodedFrameBytes`: the payload ceiling plus the header and three maximal identities. */ +export const CULTMESH_REALTIME_MAX_ENCODED_FRAME_BYTES = + CULTMESH_REALTIME_MAX_PAYLOAD_BYTES + 37 + 3 * 0xffff; + +/** + * `CultMeshRealtimeDelivery`. The wire byte is the C# enum's ordinal, so the + * order of these three is the wire contract, not a naming choice. + */ +export type CultMeshRealtimeDelivery = "reliable-ordered" | "latest-only" | "unreliable"; + +const DELIVERY_BYTES: readonly CultMeshRealtimeDelivery[] = ["reliable-ordered", "latest-only", "unreliable"]; + +/** `CultMeshRealtimeFrame`. `producerEpoch` and `sequence` are `long` in C#, which exceeds `Number.MAX_SAFE_INTEGER`. */ +export interface CultMeshRealtimeFrame { + channelId: string; + schemaId: string; + bodyId: string; + producerEpoch: bigint; + sequence: bigint; + delivery: CultMeshRealtimeDelivery; + payload: DocumentPayload; +} + +const MAGIC = 0x31545343; +const FIXED_HEADER_BYTES = 37; +const WIRE_VERSION = 1; +const MAX_IDENTITY_BYTES = 0xffff; +const INT64_MIN = -(2n ** 63n); +const INT64_MAX = 2n ** 63n - 1n; + +/** + * `CultMeshRealtimeFrame.Validate`. The C# reading of "non-empty" is + * `string.IsNullOrWhiteSpace`, whose whitespace set is not + * `String.prototype.trim`'s, so this borrows the one TypeScript implementation + * of that set from `cultnet-ts` rather than keeping a second reading here. + * + * The range check has no C# counterpart because `long` gives it for free; a + * `bigint` does not, and a `DataView` would otherwise throw a bare `RangeError` + * from inside the encoder. + */ +function validateFrame(frame: CultMeshRealtimeFrame): void { + if (isNullOrWhiteSpaceCSharp(frame.channelId)) throw new Error("Realtime channel identity is required."); + if (isNullOrWhiteSpaceCSharp(frame.schemaId)) throw new Error("Realtime schema identity is required."); + if (isNullOrWhiteSpaceCSharp(frame.bodyId)) throw new Error("Realtime body identity is required."); + if (frame.producerEpoch < 0n || frame.sequence < 0n) { + throw new Error("Realtime epoch and sequence must be non-negative."); + } + if (frame.producerEpoch > INT64_MAX || frame.sequence > INT64_MAX || frame.producerEpoch < INT64_MIN || frame.sequence < INT64_MIN) { + throw new Error("Realtime epoch and sequence must fit a 64-bit signed integer."); + } +} + +/** `CultMeshRealtimeWireProtocol.EncodeFrame`. */ +export function encodeRealtimeFrame(frame: CultMeshRealtimeFrame): Uint8Array { + validateFrame(frame); + const deliveryByte = DELIVERY_BYTES.indexOf(frame.delivery); + // C# reads an enum, which holds any byte; a TypeScript union does not, so the + // unspellable value is refused here with the message decode gives it. + if (deliveryByte < 0) throw new Error("Realtime frame delivery mode is invalid."); + const encoder = new TextEncoder(); + const channel = encoder.encode(frame.channelId); + const schema = encoder.encode(frame.schemaId); + const body = encoder.encode(frame.bodyId); + if (channel.byteLength > MAX_IDENTITY_BYTES || schema.byteLength > MAX_IDENTITY_BYTES || body.byteLength > MAX_IDENTITY_BYTES) { + throw new Error("Realtime frame identity exceeds the QUIC wire limit."); + } + if (frame.payload.byteLength > CULTMESH_REALTIME_MAX_PAYLOAD_BYTES) { + throw new Error("Realtime frame payload exceeds the QUIC wire limit."); + } + + const result = new Uint8Array( + FIXED_HEADER_BYTES + channel.byteLength + schema.byteLength + body.byteLength + frame.payload.byteLength, + ); + const view = new DataView(result.buffer); + view.setUint32(0, MAGIC, true); + result[4] = deliveryByte; + view.setBigInt64(5, frame.producerEpoch, true); + view.setBigInt64(13, frame.sequence, true); + view.setUint16(21, channel.byteLength, true); + view.setUint16(23, schema.byteLength, true); + view.setUint16(25, body.byteLength, true); + view.setInt32(27, frame.payload.byteLength, true); + view.setInt32(31, FIXED_HEADER_BYTES, true); + view.setUint16(35, WIRE_VERSION, true); + let offset = FIXED_HEADER_BYTES; + result.set(channel, offset); offset += channel.byteLength; + result.set(schema, offset); offset += schema.byteLength; + result.set(body, offset); offset += body.byteLength; + result.set(documentPayloadBytes(frame.payload), offset); + return result; +} + +/** + * `CultMeshRealtimeWireProtocol.DecodeFrame`, refusal for refusal and in the + * same order. Like the reference, it does not call `validateFrame`: a frame + * whose identities are blank decodes here exactly as it does in C#, and only + * encoding refuses it. + * + * One corner has no C# counterpart. The reference sums the lengths under + * `checked`, so a payload length near `int.MaxValue` throws `OverflowException` + * there rather than its length refusal; JavaScript numbers do not overflow, so + * the sum simply fails to match and the length refusal covers that case too. + * No encoder on either side can produce such a frame. + */ +export function decodeRealtimeFrame(bytes: Uint8Array): CultMeshRealtimeFrame { + if (bytes.byteLength < FIXED_HEADER_BYTES) throw new Error("Realtime frame header is truncated."); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + if (view.getUint32(0, true) !== MAGIC) throw new Error("Realtime frame magic is invalid."); + if (view.getUint16(35, true) !== WIRE_VERSION || view.getInt32(31, true) !== FIXED_HEADER_BYTES) { + throw new Error("Realtime frame wire version is unsupported."); + } + const delivery = DELIVERY_BYTES[bytes[4]!]; + if (delivery === undefined) throw new Error("Realtime frame delivery mode is invalid."); + const channelLength = view.getUint16(21, true); + const schemaLength = view.getUint16(23, true); + const bodyLength = view.getUint16(25, true); + const payloadLength = view.getInt32(27, true); + const expected = FIXED_HEADER_BYTES + channelLength + schemaLength + bodyLength + payloadLength; + if (payloadLength < 0 || expected !== bytes.byteLength) throw new Error("Realtime frame length is invalid."); + // `Encoding.UTF8.GetString` substitutes U+FFFD for invalid bytes rather than + // throwing, which is what a non-fatal `TextDecoder` does. `ignoreBOM` is not + // cosmetic: by default `TextDecoder` *deletes* a leading U+FEFF, and + // `GetString` keeps it, so an identity starting with a byte-order mark would + // decode to a different string on the two sides. U+FEFF is not whitespace to + // .NET either, so such an identity passes the transport contract and reaches + // the wire. + const decoder = new TextDecoder("utf-8", { ignoreBOM: true }); + let offset = FIXED_HEADER_BYTES; + const channelId = decoder.decode(bytes.subarray(offset, offset + channelLength)); offset += channelLength; + const schemaId = decoder.decode(bytes.subarray(offset, offset + schemaLength)); offset += schemaLength; + const bodyId = decoder.decode(bytes.subarray(offset, offset + bodyLength)); offset += bodyLength; + return { + channelId, + schemaId, + bodyId, + producerEpoch: view.getBigInt64(5, true), + sequence: view.getBigInt64(13, true), + delivery, + // Not `bytes.slice(...)`. Node's `Buffer` overrides `slice` with an alias of + // `subarray`, so on a `Buffer` — which is what every socket read hands a Node + // caller — that spelling returns a *view* of the frame, and a decoded payload + // that changes when the frame buffer is reused. + // + // Nor `Uint8Array.prototype.slice.call(bytes, ...)`, which does bypass the + // override and copy, but takes its result constructor from `@@species`: on a + // `Buffer` that is `FastBuffer`, so the payload comes back a `Buffer` from a + // `Buffer` frame and a `Uint8Array` from a `Uint8Array` one. The declared + // type holds either way, but `deepStrictEqual` does not, so the same frame + // would compare equal or not depending on how it reached the decoder. + // + // The constructor copies and is the one type on both inputs. + payload: documentPayloadFromBytes(new Uint8Array(bytes.subarray(offset, offset + payloadLength))), + }; +} diff --git a/packages/cultmesh-ts/test/codec-documents.test.ts b/packages/cultmesh-ts/test/codec-documents.test.ts new file mode 100644 index 00000000..4843c09b --- /dev/null +++ b/packages/cultmesh-ts/test/codec-documents.test.ts @@ -0,0 +1,261 @@ +import assert from "node:assert/strict"; +import { mkdtemp } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import test from "node:test"; +import { z } from "zod"; +import { + CultCachePayloadDepthError, + MAX_PAYLOAD_DEPTH, + SingleFileMessagePackBackingStore, + codecs, + decodeDocumentPayload, + defineDocumentType, + documentPayloadBytes, + documentPayloadFromBytes, + encodeDocumentPayload, +} from "@gamecult/cultcache-ts"; +import type { CacheBackingStore, CultCacheEnvelope } from "@gamecult/cultcache-ts"; +import { + CultNetDocumentRegistry, + defineCultNetDocumentBinding, + type CultNetPeer, +} from "cultnet-ts"; +import { CultMesh, cultMeshDocumentFromSingleFile, cultMeshDocumentFromStore, type CultMeshRudpDocumentPut } from "../src/index"; + +// A document written in the reference's positional shape, and a plain map document beside it. Every mesh reader of a +// payload reads it the way the cache does, so both read through the mesh. +const codecNote = defineDocumentType({ + type: "cultmesh.codec_note", + schemaId: "cultmesh.codec_note.v0", + schema: z.object({ noteId: z.string(), body: z.string() }), + name: "noteId", + codec: codecs.slots<{ noteId: string; body: string }>({ + 0: ["noteId", codecs.string], + 1: ["body", codecs.string], + }, "Tests.CodecNote"), +}); + +const codecReceipt = defineDocumentType({ + type: "cultmesh.codec_receipt", + schemaId: "cultmesh.codec_receipt.v0", + schema: z.object({ commandId: z.string(), body: z.string() }), + name: "commandId", + codec: codecs.slots<{ commandId: string; body: string }>({ + 0: ["commandId", codecs.string], + 1: ["body", codecs.string], + }, "Tests.CodecReceipt"), +}); + +// The same record under another schema id: the store holds it as codec_note, so it is found by parsing, not by id. +const codecNoteAlias = defineDocumentType({ + type: "cultmesh.codec_note_alias", + schemaId: "cultmesh.codec_note_alias.v0", + schema: z.object({ noteId: z.string(), body: z.string() }), + name: "noteId", + codec: codecNote.codec, +}); + +const plainNote = defineDocumentType({ + type: "cultmesh.plain_note", + schemaId: "cultmesh.plain_note.v0", + schema: z.object({ noteId: z.string(), body: z.string() }), + name: "noteId", +}); + +test("the mesh reads a stored codec document as the cache does, and a plain document unchanged", async () => { + const dir = await mkdtemp(join(tmpdir(), "cultmesh-ts-codec-store-")); + const codecPath = join(dir, "codec.ccmp"); + const plainPath = join(dir, "plain.ccmp"); + const codecNode = await CultMesh.startNode(codecPath, { documents: [codecNote] }); + await codecNode.put(codecNote, "n1", { noteId: "n1", body: "positional" }); + const plainNode = await CultMesh.startNode(plainPath, { documents: [plainNote] }); + await plainNode.put(plainNote, "n2", { noteId: "n2", body: "map" }); + + assert.deepEqual(await cultMeshDocumentFromSingleFile(codecPath, codecNote).latest(), { noteId: "n1", body: "positional" }); + assert.deepEqual(await cultMeshDocumentFromSingleFile(codecPath, codecNoteAlias).latest(), { noteId: "n1", body: "positional" }); + // A store holding a plain record and a codec record, the alias found by parsing takes the codec one whichever the + // single-file store (which sorts records by key) puts first: the probe has to refuse the plain record, not meet it + // second. + for (const [plainKey, codecKey] of [["a-plain", "z-codec"], ["z-plain", "a-codec"]] as const) { + const bothPath = join(dir, `both-${plainKey}.ccmp`); + const bothNode = await CultMesh.startNode(bothPath, { documents: [plainNote, codecNote] }); + await bothNode.put(plainNote, plainKey, { noteId: plainKey, body: "map" }); + await bothNode.put(codecNote, codecKey, { noteId: codecKey, body: "positional" }); + assert.deepEqual(await cultMeshDocumentFromSingleFile(bothPath, codecNoteAlias).latest(), { noteId: codecKey, body: "positional" }); + } + assert.deepEqual(await cultMeshDocumentFromSingleFile(plainPath, plainNote).latest(), { noteId: "n2", body: "map" }); +}); + +test("the mesh syncs a codec document from a peer snapshot and returns a codec receipt", async () => { + const connectionId = 0x10203060; + const dir = await mkdtemp(join(tmpdir(), "cultmesh-ts-codec-sync-")); + const source = await CultMesh.startNode(join(dir, "source.ccmp"), { documents: [codecNote, plainNote] }); + await source.put(codecNote, "n1", { noteId: "n1", body: "synced positional" }); + // Two records at one key, in two shapes: a peer snapshot handle for the alias schema (which neither holds) accepts the + // one that parses as the codec. + await source.put(plainNote, "n3", { noteId: "n3", body: "map" }); + await source.put(codecNote, "n3", { noteId: "n3", body: "positional" }); + const target = await CultMesh.startNode(join(dir, "target.ccmp"), { documents: [codecNote] }); + const commandBinding = defineCultNetDocumentBinding({ definition: codecNote }); + const plainBinding = defineCultNetDocumentBinding({ definition: plainNote }); + const receiptBinding = defineCultNetDocumentBinding({ definition: codecReceipt }); + const puts: unknown[] = []; + const server = CultMesh.createRudpDocumentServer("cultmesh-ts-codec-server", connectionId, { + documents: new CultNetDocumentRegistry([commandBinding, plainBinding, receiptBinding]), + getCache: () => source.cache, + bindHost: "127.0.0.1", bindPort: 0, resendDelayMs: 25, resendPollMs: 5, + onDocumentPutRaw: async (document) => (puts.push(document.payload), { + binding: receiptBinding, + recordKey: document.recordKey, + value: { commandId: document.recordKey, body: "applied" }, + }), + }); + let peer: CultNetPeer | undefined; + try { + await server.start(); + peer = await CultMesh.createRudpPeer("cultmesh-ts-codec-client", connectionId, `rudp://127.0.0.1:${server.bind.port}`, { + resendDelayMs: 25, resendPollMs: 5, connectTimeoutMs: 1_000, + }); + // The accepts probe reads the snapshot's payload as the codec: a plain decode would reject every codec snapshot. + const synced = await target.syncDocumentFromPeerSnapshot(peer, codecNote, "n1", { timeoutMs: 1_000 }); + assert.deepEqual(synced, { noteId: "n1", body: "synced positional" }); + assert.deepEqual(target.getRequired(codecNote, "n1"), { noteId: "n1", body: "synced positional" }); + // A peer snapshot handle reads the same way, and accepts the snapshot by parsing it as the codec. + assert.deepEqual(await CultMesh.documentFromPeerSnapshot(peer, codecNote, "n1", { timeoutMs: 1_000 }).latest(), { noteId: "n1", body: "synced positional" }); + + assert.deepEqual( + await CultMesh.documentFromPeerSnapshot(peer, codecNoteAlias, "n3", { timeoutMs: 1_000 }).latest(), + { noteId: "n3", body: "positional" }, + ); + + const receipt = await CultMesh.publishRudpDocumentAndWaitForReceipt( + "cultmesh-ts-codec-receipt", connectionId, `rudp://127.0.0.1:${server.bind.port}`, + commandBinding, "n2", { noteId: "n2", body: "command" }, receiptBinding, + { messageId: "n2", receiptTimeoutMs: 1_000, resendPollMs: 5 }, + ); + assert.deepEqual(receipt, { commandId: "n2", body: "applied" }); + // The handler is handed the document, not its wire shape: the server reads a put through the registered definition. + await CultMesh.publishRudpDocumentAndWaitForReceipt( + "cultmesh-ts-plain-receipt", connectionId, `rudp://127.0.0.1:${server.bind.port}`, + plainBinding, "n4", { noteId: "n4", body: "plain command" }, receiptBinding, + { messageId: "n4", receiptTimeoutMs: 1_000, resendPollMs: 5 }, + ); + assert.deepEqual(puts, [{ noteId: "n2", body: "command" }, { noteId: "n4", body: "plain command" }]); + } finally { + peer?.close(); + server.close(); + } +}); + +test("a RUDP put naming a schema the server has no definition for reaches the handler as the untouched opaque payload", async () => { + const connectionId = 0x10203070; + const stray = defineDocumentType({ + type: "cultmesh.stray_note", + schemaId: "cultmesh.stray_note.v0", + schema: z.object({ noteId: z.string() }), + name: "noteId", + codec: codecs.slots<{ noteId: string }>({ 0: ["noteId", codecs.string] }, "Tests.StrayNote"), + }); + const strayBinding = defineCultNetDocumentBinding({ definition: stray }); + const known = defineCultNetDocumentBinding({ definition: plainNote }); + const errors: Error[] = []; + const puts: CultMeshRudpDocumentPut[] = []; + const server = CultMesh.createRudpDocumentServer("cultmesh-ts-unregistered-server", connectionId, { + documents: new CultNetDocumentRegistry([known]), + bindHost: "127.0.0.1", bindPort: 0, resendDelayMs: 25, resendPollMs: 5, + onError: (error) => errors.push(error), + onDocumentPutRaw: async (document) => { puts.push(document); }, + }); + let peer: CultNetPeer | undefined; + try { + await server.start(); + peer = await CultMesh.createRudpPeer("cultmesh-ts-unregistered-client", connectionId, `rudp://127.0.0.1:${server.bind.port}`, { + resendDelayMs: 25, resendPollMs: 5, connectTimeoutMs: 1_000, + }); + peer.send(new CultNetDocumentRegistry([strayBinding]).createRawDocumentPutMessage(strayBinding, "unregistered-1", "k", { noteId: "k" })); + const startedAt = Date.now(); + while (puts.length === 0 && Date.now() - startedAt < 2_000) await new Promise((resolve) => setTimeout(resolve, 5)); + assert.deepEqual(errors, []); + assert.equal(puts.length, 1); + // Not read as plain msgpack: the bytes are the codec's slot record, handed over opaque, and the definition that reads + // them is the handler's to hold. + const put = puts[0]!; + assert.ok(!put.decoded, "the registry holds no definition for this schema"); + const payload = put.payload; + assert.equal(Buffer.from(documentPayloadBytes(payload)).toString("hex"), "91a16b", "a one-slot codec record, not a map"); + assert.deepEqual(Buffer.from(documentPayloadBytes(payload)), Buffer.from(documentPayloadBytes(encodeDocumentPayload(stray, { noteId: "k" })))); + assert.deepEqual(decodeDocumentPayload(stray, payload), { noteId: "k" }); + } finally { + peer?.close(); + server.close(); + } +}); + +test("a store read takes the record the catalog matches to the schema and the definition parses, not the first that merely parses", async () => { + const target = defineDocumentType({ type: "cultmesh.pick", schemaId: "cultmesh.pick.v1", schema: z.object({ n: z.number() }) }); + const lenient = defineDocumentType({ type: "cultmesh.pick", schemaId: "cultmesh.pick.v1", schema: { parse: (value: unknown) => value } }); + const entry = (schemaId: string, compatibleSchemaIds?: readonly string[]) => ({ + schemaId, schemaName: schemaId, schemaVersion: `${schemaId}.v1`, contentHash: "h", canonicalSchemaJson: "{}", compatibleSchemaIds, + }); + const envelope = (key: string, schemaId: string, value: unknown, compatibleSchemaIds?: readonly string[]): CultCacheEnvelope => ({ + key, type: "cultmesh.pick", schemaId, storedAt: "2026-10-11T00:00:00.000Z", + payload: encodeDocumentPayload(lenient, value), catalogEntry: entry(schemaId, compatibleSchemaIds), + }); + // None carries the definition's own schema id, so the exact-id find misses. The first parses and is foreign; the + // second is matched by the catalog and does not parse; the third is matched and parses. + const records = [ + envelope("a", "foreign.v1", { n: 1 }), + envelope("b", "alias-bad.v1", { n: "x" }, ["cultmesh.pick.v1"]), + envelope("c", "alias-good.v1", { n: 2 }, ["cultmesh.pick.v1"]), + ]; + const store: CacheBackingStore = { pullAll: async () => records, push: async () => undefined, delete: async () => undefined }; + assert.deepEqual(await cultMeshDocumentFromStore(store, target).latest(), { n: 2 }); +}); + +// A payload nested past the limit: MAX_PAYLOAD_DEPTH + 1 one-element arrays around a nil. +const pastLimitPayload = () => documentPayloadFromBytes(Uint8Array.from([...new Array(MAX_PAYLOAD_DEPTH + 1).fill(0x91), 0xc0])); + +test("a payload past the nesting limit is refused at the network doors: a RUDP put and a single-file read", async () => { + const connectionId = 0x10203080; + const plainBinding = defineCultNetDocumentBinding({ definition: plainNote }); + const registry = new CultNetDocumentRegistry([plainBinding]); + const errors: unknown[] = []; + const puts: CultMeshRudpDocumentPut[] = []; + const server = CultMesh.createRudpDocumentServer("cultmesh-ts-depth-server", connectionId, { + documents: registry, + bindHost: "127.0.0.1", bindPort: 0, resendDelayMs: 25, resendPollMs: 5, + onError: (error) => errors.push(error), + onDocumentPutRaw: async (document) => { puts.push(document); }, + }); + let peer: CultNetPeer | undefined; + try { + await server.start(); + peer = await CultMesh.createRudpPeer("cultmesh-ts-depth-client", connectionId, `rudp://127.0.0.1:${server.bind.port}`, { + resendDelayMs: 25, resendPollMs: 5, connectTimeoutMs: 1_000, + }); + peer.send(registry.createRawDocumentPutMessageFromEnvelope("deep-1", { + key: "k", type: plainNote.type, schemaId: plainNote.schemaId, payload: pastLimitPayload(), storedAt: new Date().toISOString(), + })); + const startedAt = Date.now(); + while (errors.length === 0 && Date.now() - startedAt < 2_000) await new Promise((resolve) => setTimeout(resolve, 5)); + assert.equal(errors.length, 1); + assert.ok(errors[0] instanceof CultCachePayloadDepthError, "the put is refused by the payload owner"); + assert.deepEqual(puts, [], "the handler never saw the put"); + + // The server is still serving: an ordinary put goes through. + peer.send(registry.createRawDocumentPutMessage(plainBinding, "ok-1", "k2", { noteId: "k2", body: "fine" })); + while (puts.length === 0 && Date.now() - startedAt < 4_000) await new Promise((resolve) => setTimeout(resolve, 5)); + assert.equal(puts.length, 1); + } finally { + peer?.close(); + server.close(); + } + + const dir = await mkdtemp(join(tmpdir(), "cultmesh-ts-depth-store-")); + const path = join(dir, "deep.ccmp"); + await new SingleFileMessagePackBackingStore(path).push({ + key: "k", type: plainNote.type, schemaId: plainNote.schemaId, payload: pastLimitPayload(), storedAt: new Date().toISOString(), + }); + await assert.rejects(() => cultMeshDocumentFromSingleFile(path, plainNote).latest(), CultCachePayloadDepthError); +}); diff --git a/packages/cultmesh-ts/test/content.test.ts b/packages/cultmesh-ts/test/content.test.ts new file mode 100644 index 00000000..9662bb86 --- /dev/null +++ b/packages/cultmesh-ts/test/content.test.ts @@ -0,0 +1,389 @@ +import assert from "node:assert/strict"; +import fsp from "node:fs/promises"; +import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; +import { createServer, type Server } from "node:http"; +import type { AddressInfo } from "node:net"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import test, { mock } from "node:test"; +import { execFileSync } from "node:child_process"; + +import { EMPTY_SHA256, chunkRecordKey, packContent, sha256Hex } from "cultnet-ts/content"; +import { closeSync, constants as fsConstants, openSync, symlinkSync } from "node:fs"; + +import { + ContentChunkTooLargeError, + createContentChunkHandler, + createDirectoryChunkStore, + toNodeListener, + type ContentChunkAnswer, + type ContentChunkHandlerOptions, + type ContentChunkStore, +} from "../src/content"; + +// Chunks come from the packer, so the hashes are the ones a publisher writes. +const packed = async (text: string) => (await packContent("a", new TextEncoder().encode(text))).chunks[0]!; +const decode = (answer: ContentChunkAnswer) => new TextDecoder().decode(answer.body ?? new Uint8Array()); +const OK_HEADERS = { + "Content-Type": "application/octet-stream", + "X-Content-Type-Options": "nosniff", + "Cache-Control": "public, max-age=31536000, immutable, no-transform", + "Access-Control-Allow-Origin": "*", +}; + +function spyStore(chunks: Record): ContentChunkStore & { calls: string[] } { + const calls: string[] = []; + return { calls, readChunk: async hash => { calls.push(hash); return chunks[hash]; } }; +} +const ask = (store: ContentChunkStore, url: string, method = "GET", options?: ContentChunkHandlerOptions) => + createContentChunkHandler(store, options)({ method, url }); + +test("GET of a stored chunk answers 200 with exactly its bytes and the 200 header set", async () => { + const chunk = await packed("hello chunk"); + const answer = await ask(spyStore({ [chunk.chunkHash]: chunk.payload }), `/c?chunkHash=${chunk.chunkHash}`); + assert.equal(answer.status, 200); + assert.deepEqual(answer.body, chunk.payload); + assert.deepEqual(answer.headers, { ...OK_HEADERS, "Content-Length": String(chunk.payload.length) }); +}); + +test("HEAD answers the same status and headers as GET with no body, and HEAD of a corrupt chunk answers 500", async () => { + const chunk = await packed("hello chunk"); + const url = `/c?chunkHash=${chunk.chunkHash}`; + const get = await ask(spyStore({ [chunk.chunkHash]: chunk.payload }), url); + const head = await ask(spyStore({ [chunk.chunkHash]: chunk.payload }), url, "HEAD"); + assert.equal(head.status, 200); + assert.deepEqual(head.headers, get.headers); + assert.equal(head.body, undefined); + const corrupt = await ask(spyStore({ [chunk.chunkHash]: new TextEncoder().encode("hello chunK") }), url, "HEAD"); + assert.equal(corrupt.status, 500); + assert.equal(corrupt.body, undefined); +}); + +test("chunkHash 'SHA256: ' answers like the canonical hash; recordKey absent, empty or exact answers 200", async () => { + const chunk = await packed("hello chunk"); + const store = spyStore({ [chunk.chunkHash]: chunk.payload }); + const hash = encodeURIComponent(`SHA256:${chunk.chunkHash.toUpperCase()} `); + const keys = ["", "&recordKey=", "&recordKey=%20%20", `&recordKey=${encodeURIComponent(chunkRecordKey(chunk.chunkHash))}`]; + for (const key of keys) { + const answer = await ask(store, `/c?chunkHash=${hash}${key}`); + assert.equal(answer.status, 200, key); + assert.deepEqual(answer.body, chunk.payload); + } + assert.deepEqual(new Set(store.calls), new Set([chunk.chunkHash])); +}); + +test("a recordKey for another hash, a repeated recordKey, a missing or repeated chunkHash, 63 hex, non-hex, '../x' and '%2e%2e%2f' answer 400 and the store is never called", async () => { + const chunk = await packed("hello chunk"); + const other = await packed("another"); + const store = spyStore({ [chunk.chunkHash]: chunk.payload }); + const h = chunk.chunkHash; + const key = encodeURIComponent(chunkRecordKey(h)); + const urls = [ + `/c?chunkHash=${h}&recordKey=${encodeURIComponent(chunkRecordKey(other.chunkHash))}`, + `/c?chunkHash=${h}&recordKey=x`, + `/c?chunkHash=${h}&recordKey=${key}&recordKey=${key}`, + `/c?recordKey=${key}`, + "/c", + `/c?chunkHash=${h}&chunkHash=${h}`, + `/c?chunkHash=${h.slice(1)}`, + `/c?chunkHash=${"g".repeat(64)}`, + "/c?chunkHash=../x", + "/c?chunkHash=%2e%2e%2f", + "/c?chunkHash=", + ]; + for (const url of urls) { + const answer = await ask(store, url); + assert.equal(answer.status, 400, url); + assert.equal(answer.headers["Cache-Control"], "no-store"); + assert.equal(answer.headers["Content-Type"], "text/plain; charset=utf-8"); + assert.equal(decode(answer), "invalid chunk request"); + } + assert.deepEqual(store.calls, []); +}); + +test("a valid unknown hash answers 404 with Cache-Control: no-store", async () => { + const chunk = await packed("hello chunk"); + const answer = await ask(spyStore({}), `/c?chunkHash=${chunk.chunkHash}`); + assert.equal(answer.status, 404); + assert.equal(answer.headers["Cache-Control"], "no-store"); + assert.equal(decode(answer), "chunk not found"); +}); + +test("the empty hash answers 200 with Content-Length 0 from a store that throws when called", async () => { + const store: ContentChunkStore = { readChunk: async () => { throw new Error("must not be called"); } }; + const answer = await ask(store, `/c?chunkHash=${EMPTY_SHA256}`); + assert.equal(answer.status, 200); + assert.equal(answer.headers["Content-Length"], "0"); + assert.equal(answer.body?.length, 0); +}); + +test("stored bytes that do not hash to their name answer 500, the body holds none of them, and onServerFault gets hash-mismatch; a throwing hook still yields 500", async () => { + const chunk = await packed("hello chunk"); + const canary = "CANARY-corrupt-bytes"; + const store = spyStore({ [chunk.chunkHash]: new TextEncoder().encode(canary) }); + const faults: unknown[] = []; + const answer = await ask(store, `/c?chunkHash=${chunk.chunkHash}`, "GET", { onServerFault: f => faults.push(f) }); + assert.equal(answer.status, 500); + assert.equal(decode(answer), "chunk unavailable"); + assert.equal(JSON.stringify(answer).includes(canary), false); + assert.deepEqual(faults, [{ chunkHash: chunk.chunkHash, kind: "hash-mismatch", error: undefined }]); + const throwing = await ask(store, `/c?chunkHash=${chunk.chunkHash}`, "GET", { onServerFault: () => { throw new Error("hook"); } }); + assert.equal(throwing.status, 500); +}); + +test("a valid 17-byte chunk with maxChunkBytes 16 answers 500 too-large, a store rejection answers 500 store-error, and maxChunkBytes 0, 2^31 and 1.5 throw RangeError", async () => { + const chunk = await packed("0123456789abcdefg"); + assert.equal(chunk.payload.length, 17); + const kinds: string[] = []; + const options = { maxChunkBytes: 16, onServerFault: (f: { kind: string }) => kinds.push(f.kind) }; + const url = `/c?chunkHash=${chunk.chunkHash}`; + assert.equal((await ask(spyStore({ [chunk.chunkHash]: chunk.payload }), url, "GET", options)).status, 500); + const refusing: ContentChunkStore = { readChunk: async () => { throw new ContentChunkTooLargeError(17); } }; + assert.equal((await ask(refusing, url, "GET", options)).status, 500); + const failing: ContentChunkStore = { readChunk: async () => { throw new Error("disk"); } }; + assert.equal((await ask(failing, url, "GET", options)).status, 500); + assert.deepEqual(kinds, ["too-large", "too-large", "store-error"]); + assert.equal((await ask(spyStore({ [chunk.chunkHash]: chunk.payload }), url, "GET", { maxChunkBytes: 17 })).status, 200); + for (const bad of [0, 2 ** 31, 1.5, Number.NaN]) assert.throws(() => createContentChunkHandler(spyStore({}), { maxChunkBytes: bad }), RangeError, String(bad)); + assert.throws(() => createContentChunkHandler(spyStore({}), { maxChunkBytes: 0 }), /maxChunkBytes/); + const one = await packed("x"); + assert.equal((await ask(spyStore({ [one.chunkHash]: one.payload }), `/c?chunkHash=${one.chunkHash}`, "GET", { maxChunkBytes: 1 })).status, 200); + assert.doesNotThrow(() => createContentChunkHandler(spyStore({}), { maxChunkBytes: 2 ** 31 - 1 })); +}); + +test("POST, PUT, DELETE and OPTIONS answer 405 with Allow: GET, HEAD", async () => { + const chunk = await packed("hello chunk"); + const store = spyStore({ [chunk.chunkHash]: chunk.payload }); + for (const method of ["POST", "PUT", "DELETE", "OPTIONS", ""]) { + const answer = await ask(store, `/c?chunkHash=${chunk.chunkHash}`, method); + assert.equal(answer.status, 405, method); + assert.equal(answer.headers.Allow, "GET, HEAD"); + assert.equal(decode(answer), "method not allowed"); + assert.equal(answer.headers["Access-Control-Allow-Origin"], "*"); + } + assert.deepEqual(store.calls, []); +}); + +test("'/anything/../etc/passwd?chunkHash=' answers exactly as '/?chunkHash=', and '/' with no query answers 400", async () => { + const chunk = await packed("hello chunk"); + const store = spyStore({ [chunk.chunkHash]: chunk.payload }); + const plain = await ask(store, `/?chunkHash=${chunk.chunkHash}`); + assert.deepEqual(await ask(store, `/anything/../etc/passwd?chunkHash=${chunk.chunkHash}`), plain); + assert.equal((await ask(store, `/${chunk.chunkHash}`)).status, 400); +}); + +test("error answers carry ACAO * and never echo the request's hash or key", async () => { + const canary = "CANARY-request-input"; + const chunk = await packed("hello chunk"); + const urls = [`/c?chunkHash=${canary}`, `/c?chunkHash=${chunk.chunkHash}&recordKey=${canary}`, `/${canary}?chunkHash=${chunk.chunkHash}`]; + for (const url of urls) { + for (const answer of [await ask(spyStore({}), url), await ask(spyStore({}), url, "POST")]) { + assert.equal(answer.headers["Access-Control-Allow-Origin"], "*"); + assert.equal(answer.headers["X-Content-Type-Options"], "nosniff"); + assert.equal(answer.headers["Content-Length"], String(answer.body?.length)); + assert.equal(JSON.stringify(answer).includes(canary), false); + } + } +}); + +test("directory store reads canonical hex and rejects non-canonical names, a directory and an oversized file", async () => { + const root = await mkdtemp(join(tmpdir(), "cm-content-")); + try { + const chunk = await packed("0123456789abcdefg"); + const store = createDirectoryChunkStore(root); + await writeFile(join(root, chunk.chunkHash), chunk.payload); + assert.deepEqual(await store.readChunk(chunk.chunkHash, 17), chunk.payload); + assert.equal(await store.readChunk(await sha256Hex(new Uint8Array([1])), 17), undefined); + // The root does not exist for these, so only the name check can reject them before a filesystem call. + const nowhere = createDirectoryChunkStore(join(root, "missing")); + await assert.rejects(nowhere.readChunk(chunk.chunkHash.toUpperCase(), 17), /canonical/); + for (const name of [chunk.chunkHash.toUpperCase(), `sha256:${chunk.chunkHash}`, `../${chunk.chunkHash}`, chunk.chunkHash.slice(1), ` ${chunk.chunkHash}`]) { + await assert.rejects(nowhere.readChunk(name, 17), name); + } + await assert.rejects(store.readChunk(chunk.chunkHash, 16), (error: unknown) => error instanceof ContentChunkTooLargeError && error.sizeBytes === 17); + const dirHash = await sha256Hex(new Uint8Array([2])); + await mkdir(join(root, dirHash)); + await assert.rejects(store.readChunk(dirHash, 1 << 20), process.platform === "win32" ? Error : /regular file/); + // Only a missing file is "not found": a root that is a file is a store fault (ENOTDIR on POSIX; Windows reports ENOENT). + if (process.platform !== "win32") await assert.rejects(createDirectoryChunkStore(join(root, chunk.chunkHash)).readChunk(chunk.chunkHash, 17), { code: "ENOTDIR" }); + // Through the handler: a file whose bytes do not match its name is a 500, and the right bytes are a 200. + const wrongHash = await sha256Hex(new Uint8Array([3])); + await writeFile(join(root, wrongHash), chunk.payload); + const handler = createContentChunkHandler(store); + assert.equal((await handler({ method: "GET", url: `/?chunkHash=${wrongHash}` })).status, 500); + assert.equal((await handler({ method: "GET", url: `/?chunkHash=${chunk.chunkHash}` })).status, 200); + assert.equal((await handler({ method: "GET", url: `/?chunkHash=${dirHash}` })).status, 500); + } finally { await rm(root, { recursive: true, force: true }); } +}); + +test("over node:http through toNodeListener: GET with Range and Accept-Encoding: gzip gets 200 with the full identity body; HEAD carries Content-Length; a handler rejection answers 500", async () => { + const chunk = await packed("hello chunk over http"); + const handler = createContentChunkHandler(spyStore({ [chunk.chunkHash]: chunk.payload })); + const serve = async (listener: ReturnType, run: (base: string) => Promise) => { + const server: Server = createServer(listener); + await new Promise(resolve => server.listen(0, "127.0.0.1", resolve)); + try { await run(`http://127.0.0.1:${(server.address() as AddressInfo).port}`); } + finally { await new Promise(resolve => { server.close(() => resolve()); server.closeAllConnections(); }); } + }; + await serve(toNodeListener(handler), async base => { + const url = `${base}/mount?chunkHash=${chunk.chunkHash}`; + const get = await fetch(url, { headers: { Range: "bytes=2-5", "Accept-Encoding": "gzip" } }); + assert.equal(get.status, 200); + assert.equal(get.headers.get("content-encoding"), null); + assert.equal(get.headers.get("accept-ranges"), null); + assert.deepEqual(new Uint8Array(await get.arrayBuffer()), chunk.payload); + const head = await fetch(url, { method: "HEAD" }); + assert.equal(head.status, 200); + assert.equal(head.headers.get("content-length"), String(chunk.payload.length)); + assert.equal((await head.arrayBuffer()).byteLength, 0); + }); + await serve(toNodeListener(async () => { throw new Error("boom"); }), async base => { + const response = await fetch(`${base}/`); + assert.equal(response.status, 500); + assert.equal(await response.text(), "chunk unavailable"); + }); +}); + +test("directory store closes every handle it opens, whether it returns bytes, finds a directory or refuses an oversized file", async () => { + const root = await mkdtemp(join(tmpdir(), "cm-content-")); + const opened: Awaited>[] = []; + const original = fsp.open; + const spy = mock.method(fsp, "open", async (...args: Parameters) => { const handle = await original(...args); opened.push(handle); return handle; }); + try { + const chunk = await packed("0123456789abcdefg"); + const dirHash = await sha256Hex(new Uint8Array([2])); + await writeFile(join(root, chunk.chunkHash), chunk.payload); + await mkdir(join(root, dirHash)); + const store = createDirectoryChunkStore(root); + await store.readChunk(chunk.chunkHash, 17); + await assert.rejects(store.readChunk(chunk.chunkHash, 16)); + await store.readChunk(dirHash, 17).catch(() => undefined); + assert.ok(opened.length >= 2, "the store opened its files through node:fs/promises open"); + assert.deepEqual(opened.map(handle => handle.fd), opened.map(() => -1)); + } finally { spy.mock.restore(); await rm(root, { recursive: true, force: true }); } +}); + +test("a recordKey is compared exactly: padded and re-cased forms of the right key answer 400, tab and newline keys are blank and answer 200", async () => { + const chunk = await packed("hello chunk"); + const store = spyStore({ [chunk.chunkHash]: chunk.payload }); + const key = chunkRecordKey(chunk.chunkHash); + const q = (value: string) => `/c?chunkHash=${chunk.chunkHash}&recordKey=${encodeURIComponent(value)}`; + for (const forged of [` ${key}`, `${key} `, `\t${key}`, key.toUpperCase(), key.replace("mesh", "Mesh"), "\uFEFF", `\uFEFF${key}`]) { + assert.equal((await ask(store, q(forged))).status, 400, JSON.stringify(forged)); + } + assert.deepEqual(store.calls, []); + // U+0085 is white space to C# and not to JS trim(); U+FEFF is the reverse: the blank rule is C#'s, not the platform's. + for (const blank of ["\t", "\n", "\r\n", " \t ", "\u0085", "\u00A0", " \u0085 "]) assert.equal((await ask(store, q(blank))).status, 200, JSON.stringify(blank)); + assert.equal((await ask(store, q(key))).status, 200); +}); + +test("only the empty chunk's own hash is answered without the store: hashes sharing its prefix or differing in the last digit reach the store", async () => { + const flipped = EMPTY_SHA256.slice(0, -1) + (EMPTY_SHA256.endsWith("5") ? "6" : "5"); + const prefixed = EMPTY_SHA256.slice(0, 8) + "0".repeat(56); + for (const hash of [flipped, prefixed]) { + assert.equal(hash.length, 64); + const store = spyStore({}); + const answer = await ask(store, `/c?chunkHash=${hash}`); + assert.equal(answer.status, 404, hash); + assert.deepEqual(store.calls, [hash]); + } +}); + +test("a GET reads the store once and serves the bytes it hashed, not a later read", async () => { + const first = await packed("first read"); + const second = await packed("second read"); + const reads: Uint8Array[] = [first.payload, second.payload]; + const store: ContentChunkStore = { readChunk: async () => reads.shift() }; + const answer = await ask(store, `/c?chunkHash=${first.chunkHash}`); + assert.equal(answer.status, 200); + assert.deepEqual(answer.body, first.payload); + assert.equal(reads.length, 1, "the store was read exactly once"); +}); + +test("a store that reuses its buffer cannot change the bytes after the hash: the answer is the hashed content, from a private copy", async () => { + const chunk = await packed("hello chunk"); + const shared = Buffer.from(chunk.payload); + // The overwrite lands in a microtask chain that runs after the handler resumes and has started hashing, before the digest resolves. + const store: ContentChunkStore = { + readChunk: async () => { + let hops = 0; + const hop = (): void => { if (++hops < 4) queueMicrotask(hop); else shared.fill(0x58); }; + queueMicrotask(hop); + return shared; + }, + }; + const answer = await ask(store, `/c?chunkHash=${chunk.chunkHash}`); + assert.equal(shared[0], 0x58, "the store's buffer was overwritten while the request was in flight"); + assert.equal(answer.status, 200); + assert.deepEqual(answer.body, chunk.payload); + assert.notEqual(answer.body?.buffer, shared.buffer); +}); + +test("a store that overwrites its buffer on any microtask hop never gets other bytes served under the chunk's name", async () => { + const chunk = await packed("hello chunk"); + const outcomes = new Set(); + for (let overwriteAt = 0; overwriteAt <= 10; overwriteAt += 1) { + const shared = Buffer.from(chunk.payload); + const store: ContentChunkStore = { + readChunk: async () => { + let hops = 0; + const hop = (): void => { if (hops++ < overwriteAt) queueMicrotask(hop); else shared.fill(0x58); }; + queueMicrotask(hop); + return shared; + }, + }; + const answer = await ask(store, `/c?chunkHash=${chunk.chunkHash}`); + outcomes.add(answer.status); + const served = answer.status === 200 && Buffer.from(answer.body ?? new Uint8Array()).equals(Buffer.from(chunk.payload)); + assert.ok(served || answer.status === 500, `overwrite after ${overwriteAt} hops answered ${answer.status} with ${decode(answer)}`); + } + assert.deepEqual([...outcomes].sort(), [200, 500], "the sweep covers an overwrite before the copy and one after the hash"); +}); + +test("a FIFO named by a hash is refused as not a regular file at once and holds no thread: other chunks are still served", { skip: process.platform === "win32" }, async () => { + const root = await mkdtemp(join(tmpdir(), "cm-content-")); + let fifoPath: string | undefined; + const started: Promise[] = []; + try { + const chunk = await packed("hello chunk"); + await writeFile(join(root, chunk.chunkHash), chunk.payload); + const fifoHash = await sha256Hex(new Uint8Array([9])); + fifoPath = join(root, fifoHash); + execFileSync("mkfifo", [fifoPath]); + const store = createDirectoryChunkStore(root); + const within = async (work: Promise): Promise => { + started.push(work.catch(() => undefined)); + let timer: NodeJS.Timeout | undefined; + try { return await Promise.race([work, new Promise((_, reject) => { timer = setTimeout(() => reject(new Error("blocked")), 3000); })]); } + finally { clearTimeout(timer); } + }; + // More than the libuv pool (4) so a blocking open would starve the pool. + const refusals = Array.from({ length: 8 }, () => within(store.readChunk(fifoHash, 1 << 20)).then(() => "read", (error: Error) => error.message)); + assert.deepEqual(await Promise.all(refusals), Array(8).fill("Chunk is not a regular file.")); + assert.deepEqual(await within(store.readChunk(chunk.chunkHash, 1 << 20)), chunk.payload); + assert.equal((await within(createContentChunkHandler(store)({ method: "GET", url: `/?chunkHash=${fifoHash}` }))).status, 500); + } finally { + // A reverted non-blocking open leaves pool threads waiting for a writer, which would keep the process alive past the failure. + // A read-write open (synchronous: hashing and async fs calls queue behind the full pool) is a writer; held until every + // started read has settled, it releases the queued opens too, so the revert fails the test in seconds instead of hanging. + const writer = fifoPath ? openSync(fifoPath, fsConstants.O_RDWR | fsConstants.O_NONBLOCK) : undefined; + try { await Promise.all(started); } finally { if (writer !== undefined) closeSync(writer); } + await rm(root, { recursive: true, force: true }); + } +}); + +test("a character device named by a hash is refused as not a regular file, whatever the user id", { skip: process.platform === "win32" }, async () => { + const root = await mkdtemp(join(tmpdir(), "cm-content-")); + try { + const store = createDirectoryChunkStore(root); + for (const [index, device] of ["/dev/null", "/dev/zero"].entries()) { + const hash = await sha256Hex(new Uint8Array([index])); + symlinkSync(device, join(root, hash)); + await assert.rejects(store.readChunk(hash, 1 << 20), { message: "Chunk is not a regular file." }, device); + const seen: string[] = []; + const answer = await createContentChunkHandler(store, { onServerFault: fault => seen.push(fault.kind) })({ method: "GET", url: `/?chunkHash=${hash}` }); + assert.equal(answer.status, 500, device); + assert.deepEqual(seen, ["store-error"], device); + } + } finally { await rm(root, { recursive: true, force: true }); } +}); diff --git a/packages/cultmesh-ts/test/cultmesh.test.ts b/packages/cultmesh-ts/test/cultmesh.test.ts index 16d51e1e..611492a3 100644 --- a/packages/cultmesh-ts/test/cultmesh.test.ts +++ b/packages/cultmesh-ts/test/cultmesh.test.ts @@ -1,18 +1,29 @@ +import { createSocket } from "node:dgram"; import { mkdtemp } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import test from "node:test"; import assert from "node:assert/strict"; -import { encode } from "@msgpack/msgpack"; +import { decodeWireValue, encodeWireValue } from "cultnet-ts/wire"; import { z } from "zod"; -import { defineDocumentType } from "@gamecult/cultcache-ts"; +import { defineDocumentType, documentPayloadBytes, documentPayloadFromBytes } from "@gamecult/cultcache-ts"; import { CultNetDocumentRegistry, CultNetPeer, + CultNetRudpSession, cultNetBuiltinSchemaRegistry, + decodeRudpPacket, defineCultNetDocumentBinding, + encodeRudpPacket, + type CultNetDocumentPutRawMessage, + type CultNetRudpPacket, + type CultNetMessage, + type CultNetSnapshotResponseRawMessage, } from "cultnet-ts"; -import { CultMesh } from "../src/index"; +import { CultMesh, CultMeshRudpUnservableDocumentError } from "../src/index"; + +// A record's payload as the bytes a peer would put on the wire. +const payloadOf = (value: unknown) => documentPayloadFromBytes(encodeWireValue(value)); const noteDocument = defineDocumentType({ type: "cultmesh.note", @@ -260,7 +271,7 @@ test("CultMesh TS store document handles choose compatible foreign schema payloa type: "runtime.generated.incompatible-note", schemaId: "runtime.generated.incompatible-note.v1", storedAt: "2026-06-27T00:00:00Z", - payload: encode({ nope: "not the requested shape" }), + payload: payloadOf({ nope: "not the requested shape" }), catalogEntry: { schemaId: "runtime.generated.incompatible-note.v1", schemaName: "runtime.generated.incompatible-note", @@ -275,7 +286,7 @@ test("CultMesh TS store document handles choose compatible foreign schema payloa type: "runtime.generated.cultmesh.note", schemaId: "runtime.generated.cultmesh.note.ui.42", storedAt: "2026-06-27T00:00:01Z", - payload: encode({ + payload: payloadOf({ noteId: "note:foreign", body: "foreign schema id, local store shape", }), @@ -2500,16 +2511,20 @@ test("CultMesh TS branded facade exposes schema and shard catalogs", () => { const builtIns = CultMesh.createBuiltInSchemaCatalog(); assert.equal( - builtIns.get("cultnet.shard_catalog_request.v0")?.schemaVersion, + builtIns.get( + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.shard-catalog-request.schema.json", + )?.schemaVersion, "cultnet.shard_catalog_request.v0", ); assert.equal( - builtIns.get("cultnet.shard_catalog_response.v0")?.kind, + builtIns.get( + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.shard-catalog-response.schema.json", + )?.kind, "wire_message", ); assert.equal( builtIns.get( - "https://github.com/GameCult/cultnet-ts/contracts/cultnet.transport-profile.schema.json", + "https://github.com/GameCult/CultLib/contracts/cultnet/cultnet.transport-profile.schema.json", )?.schemaVersion, "cultnet.transport_profile.v0", ); @@ -2543,6 +2558,44 @@ test("CultMesh TS branded facade exposes schema and shard catalogs", () => { ); }); +async function rudpClientBoundHost(endpoint: string, bindHost?: string): Promise { + const client = await CultMesh.createRudpClient("cultmesh-ts-bind-client", 0x10203060, endpoint, { bindHost }); + try { + return client.profile.transports[0]?.host; + } finally { + client.close(); + } +} + +// A client bound to loopback cannot send to another host on Windows, so a +// client for a remote endpoint binds the unspecified address of its family. +test("CultMesh TS RUDP client for a remote endpoint binds the unspecified address", async () => { + assert.equal(await rudpClientBoundHost("rudp://10.77.0.1:17872"), "0.0.0.0"); + assert.equal(await rudpClientBoundHost("rudp://[2001:db8::1]:17872"), "::"); +}); + +test("CultMesh TS RUDP client for a loopback endpoint binds loopback", async () => { + assert.equal(await rudpClientBoundHost("rudp://127.0.0.1:17872"), "127.0.0.1"); + assert.equal(await rudpClientBoundHost("rudp://[::1]:17872"), "::1"); +}); + +test("CultMesh TS RUDP client binds an explicit bindHost whatever the endpoint", async () => { + assert.equal(await rudpClientBoundHost("rudp://10.77.0.1:17872", "127.0.0.1"), "127.0.0.1"); + assert.equal(await rudpClientBoundHost("rudp://127.0.0.1:17872", "0.0.0.0"), "0.0.0.0"); +}); + +test("CultMesh TS RUDP server binds loopback unless told otherwise", async () => { + const loopback = await CultMesh.createRudpServer("cultmesh-ts-bind-server", 0x10203061); + const any = await CultMesh.createRudpServer("cultmesh-ts-bind-server", 0x10203062, { bindHost: "0.0.0.0" }); + try { + assert.equal(loopback.profile.transports[0]?.host, "127.0.0.1"); + assert.equal(any.profile.transports[0]?.host, "0.0.0.0"); + } finally { + loopback.close(); + any.close(); + } +}); + test("CultMesh TS branded facade creates RUDP clients from peer endpoints", async () => { const connectionId = 0x10203044; const server = await CultMesh.createRudpServer( @@ -2728,7 +2781,9 @@ test("CultMesh TS RUDP document server accepts raw document puts from multiple p maxFragmentBytes: 1024, maxPendingReliablePackets: 16, onDocumentPutRaw: (document) => { - received.push(`${document.sourceRuntimeId}:${document.recordKey}:${document.payload}`); + // The registry holds no definition, so the payload arrives untouched and is read here by name. + if (document.decoded) throw new Error("the registry holds no definition, so the put must arrive undecoded"); + received.push(`${document.sourceRuntimeId}:${document.recordKey}:${decodeWireValue(documentPayloadBytes(document.payload))}`); }, }, ); @@ -2770,7 +2825,7 @@ test("CultMesh TS RUDP document server accepts raw document puts from multiple p recordKey: "note:a", storedAt: new Date().toISOString(), payloadEncoding: "messagepack", - payload: encode("first"), + payload: payloadOf("first"), sourceRuntimeId: "client-a", }, }); @@ -2782,7 +2837,7 @@ test("CultMesh TS RUDP document server accepts raw document puts from multiple p recordKey: "note:b", storedAt: new Date().toISOString(), payloadEncoding: "messagepack", - payload: encode("second"), + payload: payloadOf("second"), sourceRuntimeId: "client-b", }, }); @@ -2814,10 +2869,11 @@ test("CultMesh TS publishes one registered document to a RUDP catalog", async () maxFragmentBytes: 1024, maxPendingReliablePackets: 16, onDocumentPutRaw: (document) => { + if (document.decoded) throw new Error("the registry holds no definition, so the put must arrive undecoded"); received = { schemaId: document.schemaId, recordKey: document.recordKey, - payload: document.payload, + payload: decodeWireValue(documentPayloadBytes(document.payload)), sourceRuntimeId: document.sourceRuntimeId, }; }, @@ -2968,7 +3024,12 @@ test("CultMesh TS reads remote RUDP snapshots through document handles", async ( const alias = CultMesh.documentFromPeerSnapshot( peer, - "cultmesh.note.alias.v1", + defineDocumentType({ + type: "cultmesh.note.alias", + schemaId: "cultmesh.note.alias.v1", + schema: noteDocument.schema, + name: "noteId", + }), "note:remote", { documentId: "note:remote.alias", @@ -3219,6 +3280,493 @@ test("CultMesh TS negotiates streaming frame body transports explicitly", () => assert.deepEqual(frameUpdates, [42n]); }); +// A put the RUDP document server admits must be one it can serve. The server +// fragments its replies as its puts are reassembled, and refuses a put whose +// snapshot reply, carrying the document alone under the shortest message id, +// could never be sent within its limits. +type ServedBoundRig = { + server: ReturnType; + peer: CultNetPeer; + admitted: string[]; + errors: Error[]; + messages: CultNetMessage[]; + /** Why each frame the peer could not parse was refused. */ + unparsed: Error[]; +}; + +const servedBoundRegistry = () => + new CultNetDocumentRegistry([defineCultNetDocumentBinding({ definition: noteDocument })]); + +/** + * A put's own storedAt, kept by the served record and replaced in the receipt by the server's + * 24-character clock. `SERVED_STORED_AT` is long, so an echoed receipt is smaller than the served + * reply; `RECEIPT_STORED_AT` is short, so an echoed receipt is the larger reply, which shows that + * admission sizes only the served reply. + */ +const SERVED_STORED_AT = `2026-09-30T00:00:00.000Z${"~".repeat(200)}`; +const RECEIPT_STORED_AT = "2026-09-30T00:00:00.000Z"; +const SERVED_BOUND_SERVER = "cultmesh-ts-served-bound-server"; + +function notePut( + messageId: string, + recordKey: string, + bodyLength: number, + sourceRuntimeId?: string, + storedAt = SERVED_STORED_AT, +): CultNetDocumentPutRawMessage { + return { + schemaVersion: "cultnet.document_put_raw.v0", + messageId, + document: { + schemaId: "cultmesh.note.v0", + recordKey, + storedAt, + payloadEncoding: "messagepack", + payload: payloadOf({ noteId: recordKey, body: "x".repeat(bodyLength) }), + ...(sourceRuntimeId ? { sourceRuntimeId } : {}), + }, + }; +} + +/** + * The encoded size of the reply that would serve this put's document alone, + * under the shortest message id: the record as a snapshot serves it, which + * keeps no source fields. + */ +function servedAloneBytes(put: CultNetDocumentPutRawMessage): number { + const { schemaId, recordKey, storedAt, payloadEncoding, payload } = put.document; + return encodeWireValue({ + schemaVersion: "cultnet.snapshot_response_raw.v0", + messageId: "0", + documents: [{ schemaId, recordKey, storedAt, payloadEncoding, payload }], + }).byteLength; +} + +/** + * The encoded size of the receipt that would acknowledge this put by echoing its value: the + * put's message id, the server's clock and its default provenance. Spelled out here rather than + * asked of the server, so a server that sized another receipt is caught. + */ +function echoReceiptBytes(put: CultNetDocumentPutRawMessage): number { + return encodeWireValue({ + schemaVersion: "cultnet.document_put_raw.v0", + messageId: put.messageId, + document: { + schemaId: "cultmesh.note.v0", + recordKey: put.document.recordKey, + storedAt: new Date().toISOString(), + payloadEncoding: "messagepack", + payload: payloadOf(decodeWireValue(documentPayloadBytes(put.document.payload))), + sourceRuntimeId: SERVED_BOUND_SERVER, + sourceAgentId: undefined, + sourceRole: "provider", + tags: ["receipt"], + }, + }).byteLength; +} + +/** The body length whose served-alone reply is exactly `bytes`. */ +function bodyLengthForReplyBytes(recordKey: string, bytes: number): number { + const probe = 8_000; + const length = probe + bytes - servedAloneBytes(notePut("p", recordKey, probe)); + const put = notePut("p", recordKey, length); + assert.equal(servedAloneBytes(put), bytes, "fixture: reply size is linear in the body"); + return length; +} + +async function withServedBoundRig( + connectionId: number, + serverLimits: { maxFragmentBytes?: number; maxPendingReliablePackets?: number; maxPayloadBytes?: number }, + body: (rig: ServedBoundRig) => Promise, + handler: { receipt?: "echo" | "oversized" } = {}, +): Promise { + const node = await CultMesh.startNode( + join(await mkdtemp(join(tmpdir(), "cultmesh-ts-served-bound-")), "node.ccmp"), + { documents: [noteDocument] }, + ); + const registry = servedBoundRegistry(); + const admitted: string[] = []; + const errors: Error[] = []; + const messages: CultNetMessage[] = []; + const unparsed: Error[] = []; + const server = CultMesh.createRudpDocumentServer(SERVED_BOUND_SERVER, connectionId, { + documents: registry, + getCache: () => node.cache, + bindHost: "127.0.0.1", + bindPort: 0, + resendDelayMs: 25, + resendPollMs: 5, + ...serverLimits, + // Stored as the registry stores a raw put, so the served record is the one it sizes. + onDocumentPutRaw: async (document) => { + admitted.push(document.recordKey); + await registry.applyRawDocumentPutMessage(node.cache, { + schemaVersion: "cultnet.document_put_raw.v0", + messageId: `store:${document.recordKey}`, + document: { + schemaId: document.schemaId, + recordKey: document.recordKey, + storedAt: document.storedAt, + payloadEncoding: "messagepack", + payload: payloadOf(document.payload), + }, + }); + if (!handler.receipt) return undefined; + // An echo acknowledges the stored value; an oversized receipt carries a tag larger than + // maxPayloadBytes. Admission sizes neither: receipts are the handler's choice. + return { + binding: defineCultNetDocumentBinding({ definition: noteDocument }), + recordKey: document.recordKey, + value: document.payload as { noteId: string; body: string }, + ...(handler.receipt === "oversized" ? { tags: ["x".repeat(8_000)] } : {}), + }; + }, + onError: (error) => errors.push(error), + }); + let peer: CultNetPeer | undefined; + try { + await server.start(); + peer = await CultMesh.createRudpPeer( + "cultmesh-ts-served-bound-client", + connectionId, + `rudp://127.0.0.1:${server.bind.port}`, + { resendDelayMs: 25, resendPollMs: 5, maxFragmentBytes: 1024, maxPendingReliablePackets: 512, connectTimeoutMs: 1_000 }, + ); + peer.on("message", (message: CultNetMessage) => messages.push(message)); + peer.on("invalidMessage", (error: Error) => unparsed.push(error)); + await body({ server, peer, admitted, errors, messages, unparsed }); + } finally { + peer?.close(); + server.close(); + } +} + +/** Requests `recordKey` under the shortest message id and waits for the reply. */ +async function snapshotUnderShortestId(rig: ServedBoundRig, recordKey: string): Promise { + const before = rig.messages.length; + rig.peer.sendSnapshotRequest({ schemaVersion: "cultnet.snapshot_request.v0", messageId: "0", recordKeys: [recordKey] }); + const startedAt = Date.now(); + while (Date.now() - startedAt < 3_000) { + const reply = rig.messages.slice(before).find((message) => + message.schemaVersion === "cultnet.snapshot_response_raw.v0" && message.messageId === "0"); + if (reply) return reply; + await delay(5); + } + throw new Error(`Timed out waiting for the snapshot of ${recordKey}; server errors: ${rig.errors.map(e => e.message).join("; ")}`); +} + +function servedBodies(reply: CultNetMessage): Array<[string, number]> { + assert.equal(reply.schemaVersion, "cultnet.snapshot_response_raw.v0"); + return (reply as CultNetSnapshotResponseRawMessage).documents.map((document) => [ + document.recordKey, + (decodeWireValue(documentPayloadBytes(document.payload)) as { body: string }).body.length, + ]); +} + +async function waitForAdmission(rig: ServedBoundRig, recordKey: string): Promise { + const startedAt = Date.now(); + while (!rig.admitted.includes(recordKey) && Date.now() - startedAt < 3_000) await delay(5); + assert.ok(rig.admitted.includes(recordKey), `${recordKey} was not admitted; server errors: ${rig.errors.map(e => e.message).join("; ")}`); +} + +async function waitForError(rig: ServedBoundRig, description: string): Promise { + const startedAt = Date.now(); + while (rig.errors.length === 0 && Date.now() - startedAt < 3_000) await delay(5); + assert.ok(rig.errors.length > 0, `no server error for ${description}`); + return rig.errors[0]!; +} + +test("CultMesh TS RUDP document server serves an 80 KB note put in 1 KiB fragments", async () => { + await withServedBoundRig(0x10203060, { maxFragmentBytes: 1024, maxPendingReliablePackets: 512 }, async (rig) => { + rig.peer.send(notePut("put-large", "note:large", 80_000)); + await waitForAdmission(rig, "note:large"); + assert.deepEqual(servedBodies(await snapshotUnderShortestId(rig, "note:large")), [["note:large", 80_000]]); + assert.deepEqual(rig.errors, []); + }); +}); + +test("CultMesh TS RUDP document server refuses a put whose reply would overflow its reliable queue", async () => { + // Eight 1 KiB fragments fit the queue, nine do not. + const atBound = bodyLengthForReplyBytes("note:at", 8 * 1024); + const overBound = bodyLengthForReplyBytes("note:ov", 8 * 1024 + 1); + await withServedBoundRig(0x10203061, { maxFragmentBytes: 1024, maxPendingReliablePackets: 8 }, async (rig) => { + // The puts carry a source the registry does not store, so only the served record is the right size. + rig.peer.send(notePut("put-over", "note:ov", overBound, "cultmesh-ts-served-bound-client")); + const refusal = await waitForError(rig, "the over-bound put"); + assert.ok(refusal instanceof CultMeshRudpUnservableDocumentError, refusal.message); + assert.equal(refusal.messageId, "put-over"); + assert.equal(refusal.recordKey, "note:ov"); + assert.equal(refusal.responseBytes, 8 * 1024 + 1); + assert.equal(refusal.fragmentCount, 9); + assert.equal(refusal.maxFragmentCount, 8); + assert.equal(refusal.maxPayloadBytes, undefined); + assert.match(refusal.message, /8193 bytes in 9 fragments/); + assert.deepEqual(rig.admitted, []); + + rig.peer.send(notePut("put-at", "note:at", atBound, "cultmesh-ts-served-bound-client")); + await waitForAdmission(rig, "note:at"); + assert.deepEqual(servedBodies(await snapshotUnderShortestId(rig, "note:at")), [["note:at", atBound]]); + assert.equal(rig.errors.length, 1); + }); +}); + +test("CultMesh TS RUDP document server answers a snapshot its reliable queue cannot take", async () => { + // Two documents each served in exactly the eight fragments the queue holds are admitted; a + // snapshot of both needs sixteen and cannot be queued. The peer is answered with a + // cultnet.error.v0, not left to time out, and onError hears why. + const atBound = bodyLengthForReplyBytes("note:q1", 8 * 1024); + await withServedBoundRig(0x10203068, { maxFragmentBytes: 1024, maxPendingReliablePackets: 8 }, async (rig) => { + rig.peer.send(notePut("put-q1", "note:q1", atBound)); + rig.peer.send(notePut("put-q2", "note:q2", atBound)); + await waitForAdmission(rig, "note:q1"); + await waitForAdmission(rig, "note:q2"); + assert.deepEqual(rig.errors, []); + rig.peer.sendSnapshotRequest({ schemaVersion: "cultnet.snapshot_request.v0", messageId: "both", recordKeys: ["note:q1", "note:q2"] }); + await waitForPeerErrors(rig, 1); + assert.equal(rig.errors.length, 1); + assert.ok(!rig.messages.some((message) => message.schemaVersion === "cultnet.snapshot_response_raw.v0")); + }); +}); + +/** + * A document server over a node that already holds `stored`, and a peer driven packet by packet + * that acknowledges nothing, so a test fills the server's reliable queue at will. + */ +async function withRawPeerRig( + connectionId: number, + serverLimits: { maxFragmentBytes?: number; maxPendingReliablePackets?: number }, + stored: CultNetDocumentPutRawMessage[], + getCache: ((cache: unknown) => unknown) | undefined, + body: (rig: { + errors: Error[]; + inbox: CultNetRudpPacket[]; + request: (messageId: string, recordKeys: string[]) => number[]; + }) => Promise, +): Promise { + const node = await CultMesh.startNode( + join(await mkdtemp(join(tmpdir(), "cultmesh-ts-raw-peer-")), "node.ccmp"), + { documents: [noteDocument] }, + ); + const registry = servedBoundRegistry(); + for (const put of stored) await registry.applyRawDocumentPutMessage(node.cache, put); + const errors: Error[] = []; + const server = CultMesh.createRudpDocumentServer(SERVED_BOUND_SERVER, connectionId, { + documents: registry, + getCache: () => (getCache ? getCache(node.cache) : node.cache) as typeof node.cache, + bindHost: "127.0.0.1", + bindPort: 0, + resendDelayMs: 100_000, + resendPollMs: 5, + ...serverLimits, + onError: (error) => errors.push(error), + }); + await server.start(); + const socket = createSocket("udp4"); + try { + await new Promise((resolve) => socket.bind(0, "127.0.0.1", () => resolve())); + const inbox: CultNetRudpPacket[] = []; + socket.on("message", (wire) => inbox.push(decodeRudpPacket(wire))); + const session = new CultNetRudpSession({ connectionId, initialSequence: 100, resendDelayMs: 100_000, maxPendingReliablePackets: 64 }); + const send = (packet: CultNetRudpPacket) => socket.send(encodeRudpPacket(packet), server.bind.port, "127.0.0.1"); + send(session.createConnect(0)); + const startedAt = Date.now(); + while (!inbox.some((packet) => packet.packetType === "accept") && Date.now() - startedAt < 2_000) await delay(5); + const accept = inbox.find((packet) => packet.packetType === "accept"); + assert.ok(accept, "the server accepts the connect"); + session.receive(accept, 1); + inbox.length = 0; + const request = (messageId: string, recordKeys: string[]): number[] => { + const packets = session.sendMany( + "schema", + encodeWireValue({ schemaVersion: "cultnet.snapshot_request.v0", messageId, recordKeys }), + { reliable: true, ordered: true, nowMs: 2, maxFragmentBytes: 1200 }, + ); + packets.forEach(send); + return packets.map((packet) => packet.sequence); + }; + await body({ errors, inbox, request }); + } finally { + socket.close(); + server.close(); + } +} + +/** The refusal among `packets`: its unreliable fragments, reassembled, and the fragments. */ +function refusalIn(packets: CultNetRudpPacket[]): { message: Record; parts: CultNetRudpPacket[] } | undefined { + const parts = packets + .filter((packet) => packet.packetType === "data" && packet.channelId === "schema" && !packet.reliable) + .sort((a, b) => (a.fragmentIndex ?? 0) - (b.fragmentIndex ?? 0)); + if (parts.length === 0) return undefined; + const message = decodeWireValue(Buffer.concat(parts.map((part) => Buffer.from(part.payload ?? new Uint8Array())))) as Record; + return { message, parts }; +} + +function acknowledges(packet: CultNetRudpPacket, sequence: number): boolean { + if (packet.ack === sequence) return true; + for (let bit = 0; bit < 32; bit += 1) { + if ((packet.ackMask & (1 << bit)) !== 0 && packet.ack - bit - 1 === sequence) return true; + } + return false; +} + +test("CultMesh TS RUDP document server answers a peer whose reliable queue is full to the brim", async () => { + // An 8-fragment reply the peer never acknowledges fills a queue of 8 exactly. The next reply + // cannot be queued; the peer is still answered, with fixed text that takes no room in that + // queue and acknowledges nothing the peer sent. + const body = bodyLengthForReplyBytes("q1", 800); + await withRawPeerRig(0x10203069, { maxFragmentBytes: 100, maxPendingReliablePackets: 8 }, [notePut("s", "q1", body)], undefined, async (rig) => { + rig.request("0", ["q1"]); + await delay(300); + const first = new Set(rig.inbox.filter((packet) => packet.packetType === "data" && packet.reliable).map((packet) => packet.sequence)); + assert.equal(first.size, 8, "fixture: the first reply fills the queue exactly"); + rig.inbox.length = 0; + const refused = rig.request("b", ["none"]); + const startedAt = Date.now(); + while (!refusalIn(rig.inbox) && Date.now() - startedAt < 3_000) await delay(5); + const refusal = refusalIn(rig.inbox); + assert.ok(refusal, "the refusal reaches the peer"); + assert.deepEqual(refusal.message, { schemaVersion: "cultnet.error.v0", error: "the snapshot response could not be queued" }); + for (const part of refusal.parts) { + assert.ok(refused.every((sequence) => !acknowledges(part, sequence)), `ack ${part.ack} mask ${part.ackMask}`); + } + assert.equal(rig.errors.length, 1); + }); +}); + +test("CultMesh TS RUDP document server refuses a snapshot with fixed text, never an error's message", async () => { + // The cache the snapshot needs fails with a message a peer must not see: the peer is told + // only that the snapshot source failed; onError keeps the detail. + await withRawPeerRig(0x1020306a, {}, [], () => { throw new Error("no such tenant CANARY-7f3a"); }, async (rig) => { + rig.request("0", ["q1"]); + const startedAt = Date.now(); + while (!refusalIn(rig.inbox) && Date.now() - startedAt < 3_000) await delay(5); + const refusal = refusalIn(rig.inbox); + assert.ok(refusal, "the refusal reaches the peer"); + assert.deepEqual(refusal.message, { schemaVersion: "cultnet.error.v0", error: "the snapshot source failed" }); + assert.match(rig.errors[0]?.message ?? "", /CANARY-7f3a/); + }); +}); + +test("CultMesh TS RUDP document server honours maxPayloadBytes for replies and judges puts by what it would serve", async () => { + const limit = 4_000; + const atBound = bodyLengthForReplyBytes("note:at", limit); + const overBound = bodyLengthForReplyBytes("note:ov", limit + 1); + await withServedBoundRig(0x10203062, { maxFragmentBytes: 1024, maxPayloadBytes: limit }, async (rig) => { + rig.peer.send(notePut("put-over", "note:ov", overBound)); + const refusal = await waitForError(rig, "the over-bound put"); + assert.ok(refusal instanceof CultMeshRudpUnservableDocumentError, refusal.message); + assert.equal(refusal.responseBytes, limit + 1); + assert.equal(refusal.maxPayloadBytes, limit); + assert.equal(refusal.fragmentCount, 4); + assert.deepEqual(rig.admitted, []); + // The peer is sent the refusal, and it names sizes, never the record. + await waitForPeerErrors(rig, 1); + assert.ok(!refusal.message.includes("note:ov"), refusal.message); + + // A put whose own frame is over the limit only by the provenance it carries is served at the + // bound, so it is admitted and served. + const carried = notePut("put-at", "note:at", atBound, `runtime-${"r".repeat(200)}`); + assert.ok(encodeWireValue(carried).byteLength > limit, "fixture: the put's frame is over the limit"); + rig.peer.send(carried); + await waitForAdmission(rig, "note:at"); + assert.deepEqual(servedBodies(await snapshotUnderShortestId(rig, "note:at")), [["note:at", atBound]]); + assert.equal(rig.errors.length, 1); + + // A record key longer than the limit: the refusal is still small enough to reach the peer. + const longKey = `note:${"k".repeat(2 * limit)}`; + rig.peer.send(notePut("put-long-key", longKey, 10)); + await waitForPeerErrors(rig, 2); + assert.ok(rig.errors[1] instanceof CultMeshRudpUnservableDocumentError, rig.errors[1]!.message); + assert.equal(rig.errors.length, 2, "the refusal itself was sent"); + assert.deepEqual(rig.admitted, ["note:at"]); + + // Two servable documents make a reply over the limit: it is not sent, and onError hears why. + rig.peer.send(notePut("put-a2", "note:a2", atBound)); + await waitForAdmission(rig, "note:a2"); + rig.peer.sendSnapshotRequest({ schemaVersion: "cultnet.snapshot_request.v0", messageId: "0", recordKeys: ["note:at", "note:a2"] }); + const replyStartedAt = Date.now(); + while (rig.errors.length < 3 && Date.now() - replyStartedAt < 3_000) await delay(5); + assert.equal(rig.errors.length, 3); + assert.match(rig.errors[2]!.message, /reply cultnet\.snapshot_response_raw\.v0 is \d+ bytes; maxPayloadBytes is 4000/); + }); +}); + +test("CultMesh TS RUDP document server admits a put served at the bound, whatever receipt its handler returns", async () => { + // These puts keep a short storedAt, so the receipt echoing one is larger than its served reply, + // and over the limit. Admission sizes only the served reply: exactly at the limit is admitted + // with or without a receipt, one byte over is refused. An echoed receipt that cannot be sent + // goes the way of any unsendable receipt: the put is stored and the peer is told. + const limit = 4_000; + const put = (messageId: string, recordKey: string, body: number) => + notePut(messageId, recordKey, body, undefined, RECEIPT_STORED_AT); + const bodyServedAt = (messageId: string, recordKey: string, bytes: number): number => { + const probe = 2_000; + const length = probe + bytes - servedAloneBytes(put(messageId, recordKey, probe)); + assert.equal(servedAloneBytes(put(messageId, recordKey, length)), bytes, "fixture: reply size is linear in the body"); + assert.ok(echoReceiptBytes(put(messageId, recordKey, length)) > limit, "fixture: the echoed receipt is over the limit"); + return length; + }; + const atBound = bodyServedAt("put-at", "note:at", limit); + const overBound = bodyServedAt("put-ov", "note:ov", limit + 1); + for (const [connectionId, receipt] of [[0x10203066, undefined], [0x10203067, "echo"]] as const) { + await withServedBoundRig(connectionId, { maxFragmentBytes: 1024, maxPayloadBytes: limit }, async (rig) => { + rig.peer.send(put("put-at", "note:at", atBound)); + await waitForAdmission(rig, "note:at"); + if (receipt === "echo") { + const failure = await waitForError(rig, "the echoed receipt"); + assert.match(failure.message, /reply cultnet\.document_put_raw\.v0 is \d+ bytes; maxPayloadBytes is 4000/); + await waitForPeerErrors(rig, 1); + assert.ok(!rig.messages.some(isDocumentPut)); + } + assert.deepEqual(servedBodies(await snapshotUnderShortestId(rig, "note:at")), [["note:at", atBound]]); + const errorsBefore = rig.errors.length; + assert.equal(errorsBefore, receipt === "echo" ? 1 : 0, rig.errors.map((error) => error.message).join("; ")); + + rig.peer.send(put("put-ov", "note:ov", overBound)); + const startedAt = Date.now(); + while (rig.errors.length === errorsBefore && Date.now() - startedAt < 3_000) await delay(5); + const refusal = rig.errors[errorsBefore]; + assert.ok(refusal instanceof CultMeshRudpUnservableDocumentError, refusal?.message); + assert.equal(refusal.responseBytes, limit + 1); + assert.deepEqual(rig.admitted, ["note:at"]); + }, receipt ? { receipt } : {}); + } +}); + +test("CultMesh TS RUDP document server tells the peer when a stored put's receipt cannot be sent", async () => { + // A handler whose receipt is larger than maxPayloadBytes: admission does not size receipts, so + // the put is stored, the receipt cannot be sent, and the peer hears that it is not coming. + const limit = 4_000; + const small = bodyLengthForReplyBytes("note:small", 1_000); + await withServedBoundRig(0x10203064, { maxFragmentBytes: 1024, maxPayloadBytes: limit }, async (rig) => { + rig.peer.send(notePut("put-small", "note:small", small)); + await waitForAdmission(rig, "note:small"); + await waitForPeerErrors(rig, 1); + assert.equal(rig.errors.length, 1); + assert.match(rig.errors[0]!.message, /reply cultnet\.document_put_raw\.v0 is \d+ bytes; maxPayloadBytes is 4000/); + assert.ok(!rig.messages.some(isDocumentPut)); + assert.deepEqual(servedBodies(await snapshotUnderShortestId(rig, "note:small")), [["note:small", small]]); + }, { receipt: "oversized" }); +}); + +function isDocumentPut(message: CultNetMessage): boolean { + return message.schemaVersion === "cultnet.document_put_raw.v0"; +} + +/** + * Waits until the peer has been sent `count` cultnet.error.v0 replies. A TypeScript peer cannot + * yet parse the two-key error this server sends (docs/cultnet-error-contract-cut.md: + * "TypeScript cannot parse the errors TypeScript sends"), + * so each arrives as an unparsed cultnet.error.v0 frame; its text is asserted through onError. + */ +async function waitForPeerErrors(rig: ServedBoundRig, count: number): Promise { + const errors = () => rig.unparsed.filter((error) => /cultnet\.error\.v0/.test(error.message)).length + + rig.messages.filter((message) => message.schemaVersion === "cultnet.error.v0").length; + const startedAt = Date.now(); + while (errors() < count && Date.now() - startedAt < 3_000) await delay(5); + assert.equal(errors(), count, `peer errors: ${rig.unparsed.map((error) => error.message).join("; ")}`); +} + function delay(milliseconds: number): Promise { return new Promise(resolve => setTimeout(resolve, milliseconds)); } diff --git a/packages/cultmesh-ts/test/fixtures/README.md b/packages/cultmesh-ts/test/fixtures/README.md new file mode 100644 index 00000000..70573ff2 --- /dev/null +++ b/packages/cultmesh-ts/test/fixtures/README.md @@ -0,0 +1,27 @@ +# QUIC test fixtures + +`quic-test.p12` and `quic-test-cert.der` are a self-signed P-256 credential +used only to open a loopback MsQuic listener in tests +(`realtime-quic-native.test.ts`, `realtime-quic-consumer.test.ts`). Not a +production credential; no private key outside this pair signs anything real. + +`quic-test-cert.der`'s subject is `CN=cultmesh-quic-native-tests`, and its +SHA-256 is what the tests pin as the expected certificate pin +(`cert-sha256`). + +Generated with (mirrors the recipe the cut map records at P13): + +```sh +openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -nodes \ + -keyout quic-test-key.pem -out quic-test-cert.pem \ + -subj "/CN=cultmesh-quic-native-tests" -days 3650 + +openssl x509 -in quic-test-cert.pem -outform der -out quic-test-cert.der + +openssl pkcs12 -export -inkey quic-test-key.pem -in quic-test-cert.pem \ + -out quic-test.p12 -passout pass: +``` + +Regenerate the same way if the pair ever needs replacing; nothing here +depends on today's exact bytes past what the tests read back out (the DER +cert and its SHA-256, and a PKCS12 the native bridge can load). diff --git a/packages/cultmesh-ts/test/fixtures/quic-test-cert.der b/packages/cultmesh-ts/test/fixtures/quic-test-cert.der new file mode 100644 index 00000000..5cce6f94 Binary files /dev/null and b/packages/cultmesh-ts/test/fixtures/quic-test-cert.der differ diff --git a/packages/cultmesh-ts/test/fixtures/quic-test.p12 b/packages/cultmesh-ts/test/fixtures/quic-test.p12 new file mode 100644 index 00000000..e9d03ce6 Binary files /dev/null and b/packages/cultmesh-ts/test/fixtures/quic-test.p12 differ diff --git a/packages/cultmesh-ts/test/interop/cultmesh-quic-peer.ts b/packages/cultmesh-ts/test/interop/cultmesh-quic-peer.ts new file mode 100644 index 00000000..e7e04c1a --- /dev/null +++ b/packages/cultmesh-ts/test/interop/cultmesh-quic-peer.ts @@ -0,0 +1,236 @@ +// The TypeScript half of the QUIC realtime interop lane. Two modes: +// +// `dial` (Cut 4): a one-shot process that dials an advertised +// `cultmesh-state+quic://` endpoint with the native connector, receives +// `--expect` frames from a peer (normally the C# managed provider started by +// `cultnet-interop.test.ts`'s "CultMesh QUIC realtime" test), and prints them +// as one JSON line. +// +// `serve` (Cut 5): the StreamPixels role. Opens a `CultMeshQuicRealtimeProvider` +// listener, prints `{status: "ready", endpoint}` (the same shape the C# +// `quic-realtime-serve` peer prints), waits for a first peer before +// broadcasting (mirroring `QuicRealtimeServeAsync`'s +// `WaitForFirstConnectionAsync`, since a broadcast to nobody would otherwise +// silently no-op), then broadcasts `--frames` frames at `--delivery` with +// `--interval-ms` between them, watching stdin for EOF as its own shutdown +// signal like the C# peer's `WatchStdinCloseAsync`. `--linger-ms` (default 0) +// keeps the listener open that long after broadcasting finishes, so the +// harness can dial a peer late and exercise Cut C's retained-state seed +// instead of the provider always tearing down the moment it is done sending. +// +// Neither mode imports `cultmesh-ts` itself (the harness drives processes, +// and the dependency direction is `cultmesh-ts` -> `cultnet-ts`, never the +// reverse); this script reaches the provider/connector through its own +// package's `src/`. + +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import process from "node:process"; + +import { documentPayloadBytes, documentPayloadFromBytes } from "@gamecult/cultcache-ts"; + +import { + CultMeshQuicRealtimeConnector, + CultMeshQuicRealtimeProvider, + type CultMeshRealtimeTarget, +} from "../../src/realtime-quic"; +import { encodeRealtimeFrame, type CultMeshRealtimeDelivery, type CultMeshRealtimeFrame } from "../../src/realtime-wire"; + +// `__dirname` at runtime is `dist-test/test/interop`; fixtures are binary and +// are never compiled/copied there, so they are read from their source +// location, three levels up. The same self-signed test credential the unit +// tests use (`test/fixtures/README.md`): not a production credential. +const FIXTURE_P12 = join(__dirname, "..", "..", "..", "test", "fixtures", "quic-test.p12"); + +function parseArgs(argv: readonly string[]): Map { + const args = new Map(); + for (let index = 0; index < argv.length; index += 1) { + const token = argv[index]; + if (!token.startsWith("--")) continue; + const name = token.slice(2); + const value = argv[index + 1]; + if (!value || value.startsWith("--")) throw new Error(`Missing value for --${name}`); + args.set(name, value); + index += 1; + } + return args; +} + +function requireArg(args: Map, name: string): string { + const value = args.get(name); + if (!value) throw new Error(`Missing required argument --${name}`); + return value; +} + +function optionalIntArg(args: Map, name: string, fallback: number): number { + const raw = args.get(name); + if (!raw) return fallback; + const parsed = Number.parseInt(raw, 10); + if (!Number.isInteger(parsed)) throw new Error(`Argument --${name} must be an integer.`); + return parsed; +} + +function writeJsonLine(value: unknown): void { + process.stdout.write(`${JSON.stringify(value)}\n`); +} + +function writeLog(event: string, payload: Record): void { + process.stderr.write(`${JSON.stringify({ event, ...payload })}\n`); +} + +function watchStdinCloseAsync(): Promise { + return new Promise((resolve) => { + process.stdin.resume(); + process.stdin.once("end", resolve); + }); +} + +async function serveAsync(args: Map): Promise { + const frames = optionalIntArg(args, "frames", 5); + const deliveryArg = args.get("delivery") ?? "latest-only"; + if (deliveryArg !== "latest-only" && deliveryArg !== "reliable-ordered") { + throw new Error(`Unsupported --delivery '${deliveryArg}'.`); + } + const delivery = deliveryArg as CultMeshRealtimeDelivery; + const intervalMs = optionalIntArg(args, "interval-ms", 50); + const lingerMs = optionalIntArg(args, "linger-ms", 0); + const port = optionalIntArg(args, "port", 0); + + const provider = await CultMeshQuicRealtimeProvider.listen({ + host: "127.0.0.1", + port, + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + }); + writeJsonLine({ status: "ready", endpoint: provider.advertisedEndpoint }); + + try { + // A broadcast to zero peers is not an error, but it sends nothing: + // matching the C# `quic-realtime-serve` peer, wait for a first + // connection, bounded, so a peer that never shows up still exits. + const connectDeadline = Date.now() + 30_000; + while (provider.connectionCount === 0) { + if (Date.now() >= connectDeadline) throw new Error("quic-realtime-serve: no client connected within 30000ms."); + await new Promise((resolve) => setTimeout(resolve, 20)); + } + + const stdinClosed = watchStdinCloseAsync(); + let stopped = false; + void stdinClosed.then(() => { + stopped = true; + }); + for (let sequence = 1; sequence <= frames && !stopped; sequence += 1) { + const frame: CultMeshRealtimeFrame = { + channelId: "interop.quic-realtime", + schemaId: "gamecult.interop.quic_realtime_frame.v0", + bodyId: "interop:quic-realtime:frame", + producerEpoch: 1n, + sequence: BigInt(sequence), + delivery, + payload: documentPayloadFromBytes(Buffer.from(`frame-${sequence}`, "utf8")), + }; + await provider.broadcast(frame); + // Printed so the harness can compare this exact frame's TypeScript + // encoding against the same frame's C#-side re-encoding (golden bytes + // across processes), without the harness importing the codec itself. + writeLog("quic-realtime-serve", { sent: sequence, hex: Buffer.from(encodeRealtimeFrame(frame)).toString("hex") }); + if (intervalMs > 0) await new Promise((resolve) => setTimeout(resolve, intervalMs)); + } + if (lingerMs > 0 && !stopped) await new Promise((resolve) => setTimeout(resolve, lingerMs)); + } finally { + provider.dispose(); + // Mirrors the C# peer returning from `QuicRealtimeServeAsync`: once + // broadcasting is done (or stdin closed early), let the process exit on + // its own instead of keeping the event loop alive on a stdin that may + // never close. The harness still ends/kills this process explicitly in + // its own cleanup; this only lets a plain manual run exit cleanly too. + process.stdin.pause(); + } +} + +async function main(): Promise { + const [mode, ...rest] = process.argv.slice(2); + if (mode === "serve") { + await serveAsync(parseArgs(rest)); + return; + } + if (mode !== "dial") throw new Error("Expected mode: dial | serve"); + const args = parseArgs(rest); + const endpoint = requireArg(args, "endpoint"); + const expect = optionalIntArg(args, "expect", 1); + // Alternative stop condition to --expect: keep receiving (through whatever + // the consumer's own coalescing inbox delivers) until a frame with this + // sequence arrives, then stop. Lets a caller prove convergence under + // latest-only coalescing, where the frame *count* a stalled reader sees is + // not the interesting number, but the final value it converges on is. + const expectSequenceRaw = args.get("expect-sequence"); + const expectSequence = expectSequenceRaw !== undefined ? BigInt(expectSequenceRaw) : undefined; + const timeoutMs = optionalIntArg(args, "timeout-ms", 15_000); + // Simulates "a test hook on the runtime that stops calling next_event" + // (spec section 10, LatestOnly-under-a-stalled-consumer lane) at the level + // this subprocess can reach: after receiving --pause-after frames, stop + // calling receiveFrame for --pause-ms. The shared native pump keeps + // dispatching and coalescing into this transport's own inbox regardless + // (Cut 4), so not reading is externally equivalent to not polling. + const pauseAfter = optionalIntArg(args, "pause-after", -1); + const pauseMs = optionalIntArg(args, "pause-ms", 0); + + const target: CultMeshRealtimeTarget = { verseId: "interop", authorityRuntimeId: "interop.csharp-provider" }; + const connector = new CultMeshQuicRealtimeConnector(); + const transport = await connector.connect( + { endpoint, authorityRuntimeId: target.authorityRuntimeId, priority: 0, generation: "interop" }, + target, + ); + writeLog("connected", { endpoint, transportId: transport.transportId }); + + const frames: Array<{ + channelId: string; + schemaId: string; + bodyId: string; + producerEpoch: string; + sequence: string; + delivery: string; + payloadHex: string; + }> = []; + try { + const deadline = Date.now() + timeoutMs; + let lastSequence: bigint | undefined; + while ( + (expectSequence === undefined && frames.length < expect) || + (expectSequence !== undefined && lastSequence !== expectSequence) + ) { + if (pauseAfter >= 0 && frames.length === pauseAfter) { + writeLog("pausing", { afterFrames: frames.length, pauseMs }); + await new Promise((resolve) => setTimeout(resolve, pauseMs)); + writeLog("resumed", { afterFrames: frames.length }); + } + const remaining = deadline - Date.now(); + if (remaining <= 0) throw new Error(`Timed out after receiving ${frames.length} frames (last sequence ${lastSequence}).`); + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), remaining); + try { + const frame = await transport.receiveFrame(controller.signal); + lastSequence = frame.sequence; + frames.push({ + channelId: frame.channelId, + schemaId: frame.schemaId, + bodyId: frame.bodyId, + producerEpoch: frame.producerEpoch.toString(), + sequence: frame.sequence.toString(), + delivery: frame.delivery, + payloadHex: Buffer.from(documentPayloadBytes(frame.payload)).toString("hex"), + }); + } finally { + clearTimeout(timer); + } + } + } finally { + transport.dispose(); + } + + writeJsonLine({ endpoint, transportId: transport.transportId, frames }); +} + +main().catch((error) => { + writeLog("fatal", { error: error instanceof Error ? (error.stack ?? error.message) : String(error) }); + process.exitCode = 1; +}); diff --git a/packages/cultmesh-ts/test/payload-type.test.ts b/packages/cultmesh-ts/test/payload-type.test.ts new file mode 100644 index 00000000..cdba3505 --- /dev/null +++ b/packages/cultmesh-ts/test/payload-type.test.ts @@ -0,0 +1,49 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { + decodeDocumentPayload, + defineDocumentType, + documentPayloadBytes, + documentPayloadFromBytes, + type DocumentPayload, +} from "@gamecult/cultcache-ts"; +import { decodeWireValue } from "cultnet-ts/wire"; +import type { CultNetRawDocumentRecord } from "cultnet-ts"; + +import type { CultMeshRudpDocumentPut } from "../src/index"; +import { decodeRealtimeFrame, encodeRealtimeFrame, type CultMeshRealtimeFrame } from "../src/realtime-wire"; + +// The rule: a document payload is read only through its definition. Every payload this package touches (a CultNet +// record's, a realtime frame's) is the opaque DocumentPayload, so tsc compiles this file only if each line carrying +// an expect-error directive is an error. The function is never called. +export function refusedReaders(record: CultNetRawDocumentRecord, frame: CultMeshRealtimeFrame): void { + // @ts-expect-error the wire value decoder is for frames and values, not for a document's payload + decodeWireValue(record.payload); + // @ts-expect-error a frame's payload is not assignable to bytes + const bytes: Uint8Array = frame.payload; + // @ts-expect-error nor may a copy of it be taken as bytes + new Uint8Array(record.payload); + // @ts-expect-error bytes are not a payload until they enter by name + const forged: DocumentPayload = new Uint8Array(); + void [bytes, forged]; +} + +// The one seam where a DocumentPayload reaches a consumer: a put for a schema the registry holds no definition for. The +// owner read of the undecoded branch needs no cast, and the decoded branch is not a DocumentPayload. +const noteDefinition = defineDocumentType({ type: "t.note", schemaId: "t.note.v0", schema: { parse: (value: unknown) => value } }); +export function readPut(put: CultMeshRudpDocumentPut): unknown { + if (!put.decoded) return decodeDocumentPayload(noteDefinition, put.payload); + // @ts-expect-error a decoded put's payload is the document, not a DocumentPayload + decodeDocumentPayload(noteDefinition, put.payload); + return put.payload; +} + +test("a realtime frame carries its payload as the same bytes it was given by name", () => { + const bytes = Uint8Array.from([1, 2, 3]); + const frame: CultMeshRealtimeFrame = { + channelId: "c", schemaId: "s", bodyId: "b", producerEpoch: 1n, sequence: 1n, delivery: "reliable-ordered", + payload: documentPayloadFromBytes(bytes), + }; + assert.deepEqual(documentPayloadBytes(decodeRealtimeFrame(encodeRealtimeFrame(frame)).payload), bytes); +}); diff --git a/packages/cultmesh-ts/test/provider-rudp-transport.test.ts b/packages/cultmesh-ts/test/provider-rudp-transport.test.ts index 5b44c84b..e9a9f1c5 100644 --- a/packages/cultmesh-ts/test/provider-rudp-transport.test.ts +++ b/packages/cultmesh-ts/test/provider-rudp-transport.test.ts @@ -1,13 +1,15 @@ import test from "node:test"; import assert from "node:assert/strict"; import { createSocket } from "node:dgram"; -import { decode } from "@msgpack/msgpack"; +import { documentPayloadBytes } from "@gamecult/cultcache-ts"; +import { decodeWireValue } from "cultnet-ts/wire"; import { CultNetDocumentRegistry, CultNetRudpSession, decodeRudpPacket, encodeRudpPacket, type CultNetOperationRequestMessage, + type CultNetRudpPacket, } from "cultnet-ts"; import { @@ -45,7 +47,7 @@ test("RUDP provider transport requires broker acceptance for the full lifecycle" session.connectPayload !== undefined && decodeProviderConnectEvidence(session.connectPayload).sessionToken === "signed-provider-token", acceptPublication: (_identity, publicationId, document) => { - accepted.set(publicationId, decode(document.payload)); + accepted.set(publicationId, decodeWireValue(documentPayloadBytes(document.payload))); acceptedProvenance.set(publicationId, { runtime: document.sourceRuntimeId, agent: document.sourceAgentId, @@ -320,6 +322,80 @@ test("a replaced RUDP generation drops operations queued behind an active handle } }); +test("a client restarted on the same address with the same Connect payload replaces its RUDP session, and a retransmitted Connect does not", async () => { + const connectionId = 0x43554c54; + let closedSessions = 0; + const server = CultMesh.createRudpDocumentServer("odin-restart-test", connectionId, { + bindPort: 0, + documents: new CultNetDocumentRegistry(), + onSessionClosed: () => { closedSessions += 1; }, + onError: () => undefined, + }); + await server.start(); + const socket = createSocket("udp4"); + const received: CultNetRudpPacket[] = []; + socket.on("message", wire => received.push(decodeRudpPacket(wire))); + const toServer = (packet: CultNetRudpPacket) => + socket.send(encodeRudpPacket(packet), server.bind.port, "127.0.0.1"); + const evidence = Buffer.from("same connect payload"); + try { + const first = new CultNetRudpSession({ connectionId, initialSequence: 50_000 }); + const connect = first.createConnect(Date.now(), evidence); + toServer(connect); + await waitFor(() => received.some(packet => packet.packetType === "accept"), "the first Accept"); + + // A retransmitted Connect repeats: the session stays. + toServer(connect); + await new Promise(resolve => setTimeout(resolve, 100)); + assert.equal(closedSessions, 0, "a retransmitted Connect closed the session"); + + // The same client restarted: another sequence, the same payload. + received.length = 0; + const second = new CultNetRudpSession({ connectionId, initialSequence: 7 }); + toServer(second.createConnect(Date.now(), evidence)); + await waitFor(() => closedSessions === 1, "the old RUDP session to close"); + await waitFor(() => received.some(packet => packet.packetType === "accept"), "the restarted client's Accept"); + } finally { + socket.close(); + server.close(); + } +}); + +test("the RUDP document server does not acknowledge by name a reliable packet its session did not receive", async () => { + const connectionId = 0x43554c55; + const server = CultMesh.createRudpDocumentServer("odin-ack-test", connectionId, { + bindPort: 0, + documents: new CultNetDocumentRegistry(), + onError: () => undefined, + }); + await server.start(); + const socket = createSocket("udp4"); + const received: CultNetRudpPacket[] = []; + socket.on("message", wire => received.push(decodeRudpPacket(wire))); + const toServer = (packet: CultNetRudpPacket) => + socket.send(encodeRudpPacket(packet), server.bind.port, "127.0.0.1"); + try { + const client = new CultNetRudpSession({ connectionId, initialSequence: 50_000 }); + const connect = client.createConnect(Date.now()); + toServer(connect); + await waitFor(() => received.some(packet => packet.packetType === "accept"), "the Accept"); + received.length = 0; + + // A reliable packet the session ignores (a client does not send an Accept). + // The session never received it, so the Ack must not name it. + const ignored: CultNetRudpPacket = { ...client.createAck(), packetType: "accept", reliable: true, sequence: connect.sequence + 5 }; + toServer(ignored); + await waitFor(() => received.some(packet => packet.packetType === "ack"), "the acknowledgement"); + const ack = received.find(packet => packet.packetType === "ack")!; + const names = ack.ack === ignored.sequence + || Array.from({ length: 32 }, (_, bit) => bit).some(bit => (ack.ackMask & (1 << bit)) !== 0 && ack.ack - bit - 1 === ignored.sequence); + assert.equal(names, false, "the server acknowledged by name a packet its session refused"); + } finally { + socket.close(); + server.close(); + } +}); + function deferred(): { promise: Promise; resolve(value: T): void } { let resolve!: (value: T) => void; return { promise: new Promise(done => resolve = done), resolve }; diff --git a/packages/cultmesh-ts/test/provider-session-wire.test.ts b/packages/cultmesh-ts/test/provider-session-wire.test.ts index ac607163..ee196f41 100644 --- a/packages/cultmesh-ts/test/provider-session-wire.test.ts +++ b/packages/cultmesh-ts/test/provider-session-wire.test.ts @@ -1,10 +1,16 @@ import test from "node:test"; import assert from "node:assert/strict"; +import { documentPayloadBytes, documentPayloadFromBytes, encodeDocumentPayload, type DocumentPayload } from "@gamecult/cultcache-ts"; +import { encodeWireValue } from "cultnet-ts/wire"; + import { + cultMeshProviderSessionSchemas, + decodeProviderCommandDocument, decodeProviderConnectEvidence, encodeProviderConnectEvidence, encodeProviderSessionPayload, + providerCommandDocument, } from "../src/provider-session-wire"; const REGISTRATION_GOLDEN = "hqpwcm92aWRlcklkqGFldGhlcmlhsXNlcnZpY2VJbnN0YW5jZUlkq2FldGhlcmlhLTQyqmVuZHBvaW50SWSvYWV0aGVyaWEtcHVibGljp3ZlcnNlSWSmcHVibGljuHJlcXVlc3RlZExlYXNlRHVyYXRpb25Nc811MLBhdXRob3JpdHlMZWFzZUlkq2F1dGhvcml0eS03"; @@ -41,3 +47,39 @@ test("provider Connect evidence keeps transport generation separate from authori TOKENLESS_CONNECT_EVIDENCE_GOLDEN, ); }); + +test("a provider command is a CultCache document: written and read by its definition, and a refusal names no value", () => { + const command = { commandId: "c1", commandKind: "k", providerId: "p", serviceInstanceId: "s", payload: { n: 1 } }; + const payload = encodeDocumentPayload(providerCommandDocument, command); + assert.deepEqual(documentPayloadBytes(payload), encodeWireValue(command), "the wire bytes are the plain map they always were"); + const record = (bytes: DocumentPayload) => ({ + schemaId: cultMeshProviderSessionSchemas.command, recordKey: "p/s/c1", storedAt: "2026-10-11T00:00:00Z", + payloadEncoding: "messagepack" as const, payload: bytes, + }); + assert.deepEqual(decodeProviderCommandDocument(record(payload)), command); + + const refused = documentPayloadFromBytes(encodeWireValue({ ...command, providerId: "canary-provider-5d2e", commandKind: "" })); + assert.throws( + () => decodeProviderCommandDocument(record(refused)), + (error: Error) => /commandKind/.test(error.message) && !error.message.includes("canary-provider-5d2e"), + ); + assert.throws(() => encodeDocumentPayload(providerCommandDocument, { ...command, commandId: " " }), /commandId/); +}); + +test("a provider command that is not a map, or lacks a required field, is refused naming the field and none of its values", () => { + const command = { commandId: "c1", commandKind: "k", providerId: "p", serviceInstanceId: "s", payload: 1 }; + const record = (value: unknown) => ({ + schemaId: cultMeshProviderSessionSchemas.command, recordKey: "p/s/c1", storedAt: "2026-10-11T00:00:00Z", + payloadEncoding: "messagepack" as const, payload: documentPayloadFromBytes(encodeWireValue(value)), + }); + for (const field of ["commandId", "commandKind", "providerId", "serviceInstanceId"] as const) { + assert.throws( + () => decodeProviderCommandDocument(record({ ...command, [field]: "" })), + (error: Error) => error.message === `CultMesh provider-session ${field} must be non-empty.`, + ); + } + assert.throws( + () => decodeProviderCommandDocument(record(["canary-not-a-map"])), + (error: Error) => error.message === "CultMesh provider command must be a MessagePack map.", + ); +}); diff --git a/packages/cultmesh-ts/test/realtime-quic-consumer.test.ts b/packages/cultmesh-ts/test/realtime-quic-consumer.test.ts new file mode 100644 index 00000000..acf06a41 --- /dev/null +++ b/packages/cultmesh-ts/test/realtime-quic-consumer.test.ts @@ -0,0 +1,1076 @@ +// The TypeScript QUIC realtime consumer, proven two ways: directly against a +// raw listener opened through the native runtime (no provider semantics yet, +// mirrors `CultMeshNativeQuicRealtimeTransportTests.cs`), and through +// `CultMeshQuicRealtimeSessionManager` with a static lookup source and routes +// signed with `node:crypto`, mirroring `CultMeshQuicRealtimeTransportTests.cs` +// and `CultMeshSessions.cs`'s realtime binding. +// +// Skips instead of failing when no native bridge is available; see +// `realtime-quic-native.test.ts` for why. + +import assert from "node:assert/strict"; +import { createHash, generateKeyPairSync, sign as cryptoSign, type KeyObject } from "node:crypto"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import test from "node:test"; + +import { documentPayloadFromBytes } from "@gamecult/cultcache-ts"; + +import { + canonicalRoute, + type CultMeshAuthorityRouteView, + type CultMeshAuthorityTrustPolicy, + type CultMeshP256PublicKey, +} from "cultnet-ts"; +import type { CultMeshAuthorityRouteMessage, CultMeshVerseDescriptorMessage } from "cultnet-ts/contracts"; + +import { + CultMeshQuicNativeRuntime, + CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION, + CULTMESH_QUIC_STREAM_LATEST_ONLY, + CULTMESH_QUIC_STREAM_RELIABLE, +} from "../src/realtime-quic-native"; +import { + CultMeshQuicRealtimeConnector, + CultMeshQuicRealtimeSessionManager, + CultMeshStaticRealtimeLookupSource, + CULTMESH_REALTIME_STATE_PROTOCOL_ID, + type CultMeshQuicRealtimeTransport, + type CultMeshRealtimeCandidate, + type CultMeshRealtimeTarget, + type CultMeshRealtimeTransport, + type CultMeshRealtimeTransportConnector, +} from "../src/realtime-quic"; +import { encodeRealtimeFrame, type CultMeshRealtimeFrame } from "../src/realtime-wire"; +import { nativeBridgeAvailable } from "./support/native-bridge"; + +// __dirname at runtime is dist-test/test; fixtures are binary and are never +// compiled/copied there, so they are read from their source location, two +// levels up. +const FIXTURE_P12 = join(__dirname, "..", "..", "test", "fixtures", "quic-test.p12"); +const FIXTURE_DER = join(__dirname, "..", "..", "test", "fixtures", "quic-test-cert.der"); + +function fixturePinHex(): string { + return createHash("sha256").update(readFileSync(FIXTURE_DER)).digest("hex"); +} + +/** A bare loopback listener over the raw native runtime, no provider semantics. */ +class RawQuicListener { + private constructor( + private readonly runtime: CultMeshQuicNativeRuntime, + private readonly listenerId: bigint, + readonly boundPort: number, + ) {} + + static async open(): Promise { + const runtime = await CultMeshQuicNativeRuntime.open(); + try { + const pkcs12 = readFileSync(FIXTURE_P12); + const { listenerId, boundPort } = runtime.listenerOpen("127.0.0.1", 0, pkcs12, ""); + return new RawQuicListener(runtime, listenerId, boundPort); + } catch (error) { + // A runtime opened above and never handed to a caller would otherwise + // leak: the shared runtime's refcount never reaches zero, its MsQuic + // registration and worker threads never tear down, and a process that + // hits this on every one of several tests never exits on its own. + await runtime.release(); + throw error; + } + } + + /** Waits for one inbound connection and returns its native connection id. */ + async acceptOnce(): Promise { + return await new Promise((resolve) => { + this.runtime.onListenerEvent(this.listenerId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION) resolve(event.connectionId); + }); + }); + } + + /** Sends one frame to an accepted connection on a fresh stream of `kind`. */ + sendFrame(connectionId: bigint, frame: CultMeshRealtimeFrame, kind: number): void { + const streamId = this.runtime.streamOpen(connectionId, kind); + this.runtime.streamSendFrame(streamId, encodeRealtimeFrame(frame), true); + } + + /** Sends arbitrary bytes (not necessarily a valid encoded frame) on a fresh stream of `kind`. */ + sendRaw(connectionId: bigint, bytes: Uint8Array, kind: number): void { + const streamId = this.runtime.streamOpen(connectionId, kind); + this.runtime.streamSendFrame(streamId, bytes, true); + } + + /** Shuts down one accepted connection from this side, as a peer disconnect. */ + shutdownConnection(connectionId: bigint, code = 0n): void { + this.runtime.connectionShutdown(connectionId, code); + } + + async close(): Promise { + this.runtime.listenerClose(this.listenerId); + await this.runtime.release(); + } +} + +/** + * `assert.rejects`, but safe against a mutant or a real regression that + * makes the promise resolve instead: a transport that unexpectedly connects + * is disposed before the assertion fails, rather than left live with an open + * native connection and an outstanding runtime reference. A bare + * `assert.rejects(connector.connect(...))` hung the whole file exactly this + * way under M1 (the certificate-accept mutation): three tests failed their + * assertion correctly, but each left a connected, undisposed transport + * behind, and Node's test runner refuses to exit while any promise or + * native handle is still outstanding. + */ +async function assertRejectsAndDisposes( + promise: Promise<{ dispose(): void }>, + match?: RegExp, +): Promise { + let resolved: { dispose(): void } | undefined; + try { + resolved = await promise; + } catch (error) { + if (match) assert.match(error instanceof Error ? error.message : String(error), match); + return; + } + resolved.dispose(); + assert.fail("expected the promise to reject, but it resolved (the resolved value has been disposed)"); +} + +/** + * `transport.receiveFrame()`, bounded: a fault-path regression that leaves a + * malformed frame undelivered-but-not-rejected would otherwise hang this + * call (and, through a bare `assert.rejects`, the whole test file) forever, + * rather than fail the one assertion it was supposed to fail. + */ +function receiveFrameOrTimeout(transport: { receiveFrame(signal?: AbortSignal): Promise }, ms = 3_000): Promise { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), ms); + return transport.receiveFrame(controller.signal).finally(() => clearTimeout(timer)); +} + +function testFrame(overrides: Partial = {}): CultMeshRealtimeFrame { + return { + channelId: "aetheria.entities", + schemaId: "eve.entity_soa.v1", + bodyId: "body:aetheria:entities", + producerEpoch: 7n, + sequence: 1n, + delivery: "latest-only", + payload: documentPayloadFromBytes(new Uint8Array([3, 4, 5])), + ...overrides, + }; +} + +test("connect with the correct pin succeeds and receives a frame", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const accepted = listener.acceptOnce(); + const transport = await connector.connect(candidate, target); + try { + assert.equal(transport.transportId, "msquic-realtime"); + const connectionId = await accepted; + listener.sendFrame(connectionId, testFrame(), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const received = await transport.receiveFrame(); + assert.equal(received.bodyId, "body:aetheria:entities"); + assert.equal(received.sequence, 1n); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("connect refuses a wrong advertised pin", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${"0".repeat(64)}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + await assertRejectsAndDisposes(connector.connect(candidate, target), /certificate|rejected/i); + } finally { + await listener.close(); + } +}); + +test("connect refuses a missing certificate pin when no validator is supplied", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + await assertRejectsAndDisposes(connector.connect(candidate, target), /certificate|rejected/i); + } finally { + await listener.close(); + } +}); + +test("a caller-supplied validator observes the target identity and the DER bytes", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + let observedTarget: CultMeshRealtimeTarget | undefined; + let observedDerLength = 0; + const connector = new CultMeshQuicRealtimeConnector({ + validateProviderCertificate: (validatorTarget, der) => { + observedTarget = validatorTarget; + observedDerLength = der.byteLength; + return true; + }, + }); + const transport = await connector.connect(candidate, target); + transport.dispose(); + assert.deepEqual(observedTarget, target); + assert.ok(observedDerLength > 0); + } finally { + await listener.close(); + } +}); + +test("a late older generation is dropped by the receive-side filter", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const accepted = listener.acceptOnce(); + const transport = await connector.connect(candidate, target); + try { + const connectionId = await accepted; + listener.sendFrame(connectionId, testFrame({ producerEpoch: 8n, sequence: 0n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const latest = await transport.receiveFrame(); + assert.equal(latest.producerEpoch, 8n); + assert.equal(latest.sequence, 0n); + + listener.sendFrame(connectionId, testFrame({ producerEpoch: 7n, sequence: 999n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const staleTimeout = new AbortController(); + const timer = setTimeout(() => staleTimeout.abort(), 300); + await assert.rejects(transport.receiveFrame(staleTimeout.signal)); + clearTimeout(timer); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); + +// --------------------------------------------------------------------------- +// Trust negatives, through the session manager with a static lookup source. +// --------------------------------------------------------------------------- + +function base64UrlToBase64(value: string): string { + let base64 = value.replace(/-/g, "+").replace(/_/g, "/"); + while (base64.length % 4 !== 0) base64 += "="; + return base64; +} + +let odinRootSequence = 0; + +function generateOdinRoot(): { privateKey: KeyObject; publicKey: CultMeshP256PublicKey } { + const { publicKey, privateKey } = generateKeyPairSync("ec", { namedCurve: "prime256v1" }); + const jwk = publicKey.export({ format: "jwk" }) as { x: string; y: string }; + odinRootSequence += 1; + return { + privateKey, + publicKey: { + keyId: `odin-root-${odinRootSequence}`, + x: base64UrlToBase64(jwk.x), + y: base64UrlToBase64(jwk.y), + }, + }; +} + +interface SignedRouteOptions { + readonly verseId: string; + readonly authorityRuntimeId: string; + readonly endpoint: string; + readonly protocolIds: readonly string[]; + readonly privateKey: KeyObject; + readonly odinKeyId: string; + readonly priority?: number; + readonly generation?: string; + readonly issuedAtUnixMilliseconds?: number; + readonly expiresAtUnixMilliseconds?: number; + readonly providerKey?: CultMeshP256PublicKey; + readonly corruptSignature?: boolean; +} + +function signRoute(options: SignedRouteOptions): CultMeshAuthorityRouteMessage { + const priority = options.priority ?? 0; + const generation = options.generation ?? ""; + const issuedAt = options.issuedAtUnixMilliseconds ?? Date.now() - 60_000; + const expiresAt = options.expiresAtUnixMilliseconds ?? Date.now() + 3_600_000; + const providerKey = options.providerKey ?? { keyId: "provider-1", x: "unused", y: "unused" }; + const view: CultMeshAuthorityRouteView = { + verseId: options.verseId, + authorityRuntimeId: options.authorityRuntimeId, + endpoint: options.endpoint, + protocolIds: options.protocolIds, + priority, + generation, + certificate: { + providerKey, + odinKeyId: options.odinKeyId, + issuedAtUnixMilliseconds: issuedAt, + expiresAtUnixMilliseconds: expiresAt, + signature: "", + }, + }; + const payload = canonicalRoute(view); + const signatureBytes = options.corruptSignature + ? Buffer.alloc(64, 0x41) + : (cryptoSign("sha256", Buffer.from(payload), { key: options.privateKey, dsaEncoding: "ieee-p1363" }) as Buffer); + return { + authorityRuntimeId: options.authorityRuntimeId, + endpoint: options.endpoint, + protocolIds: [...options.protocolIds], + priority, + generation, + certificate: { + providerKeyId: providerKey.keyId, + providerPublicKeyX: providerKey.x, + providerPublicKeyY: providerKey.y, + odinKeyId: options.odinKeyId, + issuedAtUnixMilliseconds: issuedAt, + expiresAtUnixMilliseconds: expiresAt, + signature: signatureBytes.toString("base64"), + }, + }; +} + +function verseWithRoute(verseId: string, route: CultMeshAuthorityRouteMessage): CultMeshVerseDescriptorMessage { + return { + verseId, + displayName: verseId, + authorityModel: "operator-cluster", + compatibility: { transportVersion: "cultmesh.v1", rulesHash: "test", compatibleVerseIds: [], requiredPluginIds: [], optionalPluginIds: [] }, + discoveryEndpoints: [route.endpoint], + authorityRuntimeIds: [route.authorityRuntimeId], + authorityRoutes: [route], + }; +} + +const unreachableConnector: CultMeshRealtimeTransportConnector = { + connectorId: "unreachable", + priority: 0, + canConnect: () => true, + connect: async () => { + throw new Error("a trust-refused route must never reach a connector"); + }, +}; + +test("trust negative (a): an expired certificate is refused", async () => { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const root = generateOdinRoot(); + const route = signRoute({ + verseId: target.verseId, + authorityRuntimeId: target.authorityRuntimeId, + endpoint: "cultmesh-state+quic://127.0.0.1:9443", + protocolIds: [CULTMESH_REALTIME_STATE_PROTOCOL_ID], + privateKey: root.privateKey, + odinKeyId: root.publicKey.keyId, + issuedAtUnixMilliseconds: Date.now() - 120_000, + expiresAtUnixMilliseconds: Date.now() - 60_000, + }); + const trust: CultMeshAuthorityTrustPolicy = { mode: "authenticated-remote", odinRoots: [root.publicKey] }; + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoute(target.verseId, route)]), + trust, + connectors: [unreachableConnector], + }); + await assertRejectsAndDisposes(manager.connect(target), /valid|expired/i); +}); + +test("trust negative (b): an unsigned remote route is refused", async () => { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const route: CultMeshAuthorityRouteMessage = { + authorityRuntimeId: target.authorityRuntimeId, + endpoint: "cultmesh-state+quic://198.51.100.7:9443", + protocolIds: [CULTMESH_REALTIME_STATE_PROTOCOL_ID], + priority: 0, + generation: "gen-1", + }; + const trust: CultMeshAuthorityTrustPolicy = { mode: "authenticated-remote", odinRoots: [] }; + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoute(target.verseId, route)]), + trust, + connectors: [unreachableConnector], + }); + await assertRejectsAndDisposes(manager.connect(target), /Odin-signed/i); +}); + +test("trust negative (c): a route signed by an untrusted Odin root is refused", async () => { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const signer = generateOdinRoot(); + const trustedRoot = generateOdinRoot(); + const route = signRoute({ + verseId: target.verseId, + authorityRuntimeId: target.authorityRuntimeId, + endpoint: "cultmesh-state+quic://127.0.0.1:9443", + protocolIds: [CULTMESH_REALTIME_STATE_PROTOCOL_ID], + privateKey: signer.privateKey, + odinKeyId: signer.publicKey.keyId, + }); + const trust: CultMeshAuthorityTrustPolicy = { mode: "authenticated-remote", odinRoots: [trustedRoot.publicKey] }; + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoute(target.verseId, route)]), + trust, + connectors: [unreachableConnector], + }); + await assertRejectsAndDisposes(manager.connect(target), /not trusted/i); +}); + +test("trust negative (d): a route that verifies but pins the wrong certificate is refused at the transport", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const root = generateOdinRoot(); + const route = signRoute({ + verseId: target.verseId, + authorityRuntimeId: target.authorityRuntimeId, + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${"0".repeat(64)}`, + protocolIds: [CULTMESH_REALTIME_STATE_PROTOCOL_ID], + privateKey: root.privateKey, + odinKeyId: root.publicKey.keyId, + }); + const trust: CultMeshAuthorityTrustPolicy = { mode: "authenticated-remote", odinRoots: [root.publicKey] }; + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoute(target.verseId, route)]), + trust, + connectors: [new CultMeshQuicRealtimeConnector()], + }); + await assertRejectsAndDisposes(manager.connect(target), /certificate|rejected/i); + } finally { + await listener.close(); + } +}); + +test("trust negative (e): a transport that fails isVerifiedFor is disposed and rejected", async () => { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const root = generateOdinRoot(); + const route = signRoute({ + verseId: target.verseId, + authorityRuntimeId: target.authorityRuntimeId, + endpoint: "cultmesh-state+quic://127.0.0.1:9443", + protocolIds: [CULTMESH_REALTIME_STATE_PROTOCOL_ID], + privateKey: root.privateKey, + odinKeyId: root.publicKey.keyId, + generation: "route-generation-1", + }); + const trust: CultMeshAuthorityTrustPolicy = { mode: "authenticated-remote", odinRoots: [root.publicKey] }; + + let disposed = false; + const staleTransport: CultMeshRealtimeTransport = { + transportId: "msquic-realtime", + endpoint: route.endpoint, + async sendFrame() {}, + async receiveFrame() { + return testFrame(); + }, + dispose() { + disposed = true; + }, + // A replayed/stale generation: the transport proves a different route + // generation than the one the session manager just verified. + isVerifiedFor: () => false, + }; + const staleConnector: CultMeshRealtimeTransportConnector = { + connectorId: "stale", + priority: 0, + canConnect: () => true, + connect: async () => staleTransport, + }; + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoute(target.verseId, route)]), + trust, + connectors: [staleConnector], + }); + + await assertRejectsAndDisposes(manager.connect(target), /did not prove|No realtime state path/i); + assert.equal(disposed, true, "the session manager must dispose a transport that fails isVerifiedFor"); +}); + +test("M3: a real connected transport's isVerifiedFor rejects a generation other than the one it connected with", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "route-generation-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const transport = await connector.connect(candidate, target); + try { + assert.equal( + transport.isVerifiedFor(target.verseId, target.authorityRuntimeId, CULTMESH_REALTIME_STATE_PROTOCOL_ID, "route-generation-1"), + true, + "the generation it actually connected with must verify", + ); + assert.equal( + transport.isVerifiedFor(target.verseId, target.authorityRuntimeId, CULTMESH_REALTIME_STATE_PROTOCOL_ID, "route-generation-2"), + false, + "a mutated/replayed generation must not verify against a real transport", + ); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("trust negative (e2): a real transport whose generation no longer matches the freshly verified route is disposed", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const root = generateOdinRoot(); + const signedRoute = signRoute({ + verseId: target.verseId, + authorityRuntimeId: target.authorityRuntimeId, + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + protocolIds: [CULTMESH_REALTIME_STATE_PROTOCOL_ID], + privateKey: root.privateKey, + odinKeyId: root.publicKey.keyId, + generation: "route-generation-1", + }); + const trust: CultMeshAuthorityTrustPolicy = { mode: "authenticated-remote", odinRoots: [root.publicKey] }; + const realConnector = new CultMeshQuicRealtimeConnector(); + let connectedTransport: CultMeshRealtimeTransport | undefined; + // A real transport, connected for real against the raw listener, but + // stamped with a generation different from the one the session manager + // just verified — the way a stale cached transport would look after its + // route rotated underneath it. + const replayConnector: CultMeshRealtimeTransportConnector = { + connectorId: "replay", + priority: 0, + canConnect: (c) => realConnector.canConnect(c), + connect: async (c, t, signal) => { + const accepted = listener.acceptOnce(); + const transport = await realConnector.connect({ ...c, generation: "route-generation-1-stale" }, t, signal); + await accepted; + connectedTransport = transport; + return transport; + }, + }; + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoute(target.verseId, signedRoute)]), + trust, + connectors: [replayConnector], + }); + + await assertRejectsAndDisposes(manager.connect(target), /did not prove|No realtime state path/i); + assert.ok(connectedTransport, "a real transport must have connected"); + // Real cleanup ran: receiveFrame on the disposed transport rejects. + await assert.rejects(connectedTransport!.receiveFrame(), /disposed/i); + } finally { + await listener.close(); + } +}); + +test("the advertised certificate pin is matched case-insensitively (M2)", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex().toUpperCase()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const transport = await connector.connect(candidate, target); + transport.dispose(); + } finally { + await listener.close(); + } +}); + +// --------------------------------------------------------------------------- +// Fix batch: pump/dispatch isolation (1), peer-shutdown cleanup (3), the +// bounded receive backlog and stream-kind pruning (6). +// --------------------------------------------------------------------------- + +test("fix 1 / M4: a stream-kind/delivery mismatch faults only that connection; the pump keeps running", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const endpoint = (): string => `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`; + + // A reliable stream carrying a frame whose own delivery byte says + // latest-only: `onStreamFrame` throws, which must fault only this + // connection. + const connectorA = new CultMeshQuicRealtimeConnector(); + const acceptedA = listener.acceptOnce(); + const transportA = await connectorA.connect( + { endpoint: endpoint(), authorityRuntimeId: target.authorityRuntimeId, priority: 0, generation: "gen-1" }, + target, + ); + try { + const connectionIdA = await acceptedA; + listener.sendFrame(connectionIdA, testFrame({ delivery: "latest-only" }), CULTMESH_QUIC_STREAM_RELIABLE); + // Bounded: if the mismatch check regresses (never faults), receiveFrame() + // waits forever for a frame that will not arrive, and a bare + // `assert.rejects` would hang this test, and the whole file, right along + // with it (as M4 did before this bound existed). + await assert.rejects(receiveFrameOrTimeout(transportA), /incompatible delivery semantics/i); + // Future receives on the faulted transport reject immediately, with the + // same error, rather than hanging. + await assert.rejects(receiveFrameOrTimeout(transportA), /incompatible delivery semantics/i); + } finally { + transportA.dispose(); + } + + // A second, independent connection through the same process-wide runtime + // and pump must still work: the fault above did not bring it down. + const connectorB = new CultMeshQuicRealtimeConnector(); + const acceptedB = listener.acceptOnce(); + const transportB = await connectorB.connect( + { endpoint: endpoint(), authorityRuntimeId: target.authorityRuntimeId, priority: 0, generation: "gen-1" }, + target, + ); + try { + const connectionIdB = await acceptedB; + listener.sendFrame(connectionIdB, testFrame(), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const received = await transportB.receiveFrame(); + assert.equal(received.bodyId, "body:aetheria:entities"); + } finally { + transportB.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("M4b: a latest-only stream carrying a reliable-ordered frame faults only that connection", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const endpoint = (): string => `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`; + + // The mirror image of the M4 test above: a latest-only stream carrying + // a frame whose own delivery byte says reliable-ordered. + const connectorA = new CultMeshQuicRealtimeConnector(); + const acceptedA = listener.acceptOnce(); + const transportA = await connectorA.connect( + { endpoint: endpoint(), authorityRuntimeId: target.authorityRuntimeId, priority: 0, generation: "gen-1" }, + target, + ); + try { + const connectionIdA = await acceptedA; + listener.sendFrame(connectionIdA, testFrame({ delivery: "reliable-ordered" }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + await assert.rejects(receiveFrameOrTimeout(transportA), /incompatible delivery semantics/i); + } finally { + transportA.dispose(); + } + + // A second, independent connection still works. + const connectorB = new CultMeshQuicRealtimeConnector(); + const acceptedB = listener.acceptOnce(); + const transportB = await connectorB.connect( + { endpoint: endpoint(), authorityRuntimeId: target.authorityRuntimeId, priority: 0, generation: "gen-1" }, + target, + ); + try { + const connectionIdB = await acceptedB; + listener.sendFrame(connectionIdB, testFrame(), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const received = await transportB.receiveFrame(); + assert.equal(received.bodyId, "body:aetheria:entities"); + } finally { + transportB.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("fix 1: a throwing onDisposed handler cannot crash the pump when a malformed frame faults a connection", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const endpoint = (): string => `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`; + + const connectorA = new CultMeshQuicRealtimeConnector(); + const acceptedA = listener.acceptOnce(); + const transportA = await connectorA.connect( + { endpoint: endpoint(), authorityRuntimeId: target.authorityRuntimeId, priority: 0, generation: "gen-1" }, + target, + ); + // A throwing onDisposed handler, registered before the fault: fix 1 + // must run it inside its own try/catch so it cannot escape cleanup(), + // and must have already released the runtime reference regardless. + let secondHandlerRan = false; + transportA.onDisposed?.(() => { + throw new Error("first onDisposed handler throws on purpose"); + }); + transportA.onDisposed?.(() => { + secondHandlerRan = true; + }); + + try { + const connectionIdA = await acceptedA; + // Random bytes on a reliable stream: not a valid encoded frame, so + // decodeRealtimeFrame throws inside onStreamFrame, which native's + // dispatch loop (fix 1's native half) catches and faults only this + // connection. Bounded: if the fault path regresses and never faults + // this connection, receiveFrame() would otherwise wait forever for a + // frame that will not arrive. + listener.sendRaw(connectionIdA, new Uint8Array([9, 9, 9, 9, 9, 9, 9, 9]), CULTMESH_QUIC_STREAM_RELIABLE); + await assert.rejects(receiveFrameOrTimeout(transportA)); + assert.equal(secondHandlerRan, true, "a throwing handler must not stop the next onDisposed handler from running"); + } finally { + transportA.dispose(); + } + + // The process (and this test file's pump) survives, and a second, + // independent connection through the same runtime still works. + const connectorB = new CultMeshQuicRealtimeConnector(); + const acceptedB = listener.acceptOnce(); + const transportB = await connectorB.connect( + { endpoint: endpoint(), authorityRuntimeId: target.authorityRuntimeId, priority: 0, generation: "gen-1" }, + target, + ); + try { + const connectionIdB = await acceptedB; + listener.sendFrame(connectionIdB, testFrame(), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const received = await transportB.receiveFrame(); + assert.equal(received.bodyId, "body:aetheria:entities"); + } finally { + transportB.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("fix 1: a throwing onDisposed handler on a peer shutdown still releases the runtime and runs every handler", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const accepted = listener.acceptOnce(); + const transport = await connector.connect(candidate, target); + try { + const connectionId = await accepted; + + let secondHandlerRan = false; + transport.onDisposed?.(() => { + throw new Error("first onDisposed handler throws on purpose"); + }); + transport.onDisposed?.(() => { + secondHandlerRan = true; + }); + + const before = CultMeshQuicNativeRuntime.refCount; + listener.shutdownConnection(connectionId); + // Wait for cleanup() to run (driven by the pump's CONNECTION_SHUTDOWN + // dispatch), rather than asserting immediately. Bounded: if the + // shutdown-cleanup path regresses (F3) and never rejects, this would + // otherwise hang instead of failing the assertion below it. + await assert.rejects(receiveFrameOrTimeout(transport)); + assert.equal( + CultMeshQuicNativeRuntime.refCount, + before - 1, + "the runtime reference must be released even though a handler threw", + ); + assert.equal(secondHandlerRan, true, "every onDisposed handler must still run despite an earlier one throwing"); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("M10: an equal generation delivered after the first was already consumed is dropped, not redelivered", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const accepted = listener.acceptOnce(); + const transport = await connector.connect(candidate, target); + try { + const connectionId = await accepted; + + // Send one frame and consume it, so the coalescer no longer holds + // anything pending for this key: the generation filter's own record + // (`latestGenerations`) is the only thing left that could still know + // this generation was already seen. Sending a frame back-to-back with + // an unconsumed duplicate would mask a broken filter behind the + // coalescer overwriting the pending value with an identical one; this + // sequencing is what M10 needs to be observable at all (Soul's note). + listener.sendFrame(connectionId, testFrame({ producerEpoch: 1n, sequence: 3n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const first = await transport.receiveFrame(); + assert.equal(first.sequence, 3n); + + // The exact same generation, sent again after consumption: the + // filter must drop it outright rather than deliver it as new. + listener.sendFrame(connectionId, testFrame({ producerEpoch: 1n, sequence: 3n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + await new Promise((resolve) => setTimeout(resolve, 200)); + + const timeout = new AbortController(); + const timer = setTimeout(() => timeout.abort(), 300); + await assert.rejects( + transport.receiveFrame(timeout.signal), + "an equal generation already consumed must not be redelivered", + ); + clearTimeout(timer); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); + +// F7 ("a canceled send must not resolve as success") is covered in +// realtime-quic-native.test.ts, at the native binding layer, not here. +// A consumer-level scenario was attempted first: prime the reliable stream, +// start a second send, and shut the connection down from the peer mid-flight. +// It proved unreliable on this host regardless of payload size or added +// delay before the shutdown call — MsQuic here appears to accept and locally +// complete a `StreamSend` (marking it as a plain, non-canceled +// SEND_COMPLETE) faster than any JS-observable window can reliably land a +// shutdown ahead of it, and a delay long enough to guarantee the shutdown +// wins just lets the send finish first instead. This is recorded as not yet +// reached at the consumer layer, not as unreachable: the native-layer test +// asserts the exact field (`code`, decoded through the same struct decode +// F7 mutates) that this scenario would also exercise, so the fix itself is +// defended; only the end-to-end SEND_CANCELED proof through the consumer's +// own `sendFrame()` promise is the open gap. + +test("fix 3: a peer-initiated shutdown rejects a pending receive and cleans up exactly once", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const accepted = listener.acceptOnce(); + const transport = await connector.connect(candidate, target); + try { + const connectionId = await accepted; + + // Bounded: this is F3's own mutant target (removing the + // CONNECTION_SHUTDOWN cleanup call), and a broken cleanup path means + // this receive never settles. + const pendingReceive = receiveFrameOrTimeout(transport); + listener.shutdownConnection(connectionId); + await assert.rejects(pendingReceive, /closed by the remote peer/i); + + // Cleanup already ran: a further explicit dispose is a harmless no-op, + // and a fresh receive rejects immediately instead of hanging forever + // (the leak fix 3 exists for). + transport.dispose(); + await assert.rejects(receiveFrameOrTimeout(transport), /closed by the remote peer/i); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("fix 6: a slow latest-only reader accumulates at most one pending frame per key, and an equal generation is dropped", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const accepted = listener.acceptOnce(); + const transport = await connector.connect(candidate, target); + try { + const connectionId = await accepted; + + // Three increasing-sequence frames for the same (channel, body), + // published while nothing reads: an unbounded queue would deliver all + // three in order; the coalescing inbox keeps only the newest. + listener.sendFrame(connectionId, testFrame({ producerEpoch: 1n, sequence: 1n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + listener.sendFrame(connectionId, testFrame({ producerEpoch: 1n, sequence: 2n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + listener.sendFrame(connectionId, testFrame({ producerEpoch: 1n, sequence: 3n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + // An equal generation, sent last: it must be dropped outright, not + // queued as a fourth pending frame. + listener.sendFrame(connectionId, testFrame({ producerEpoch: 1n, sequence: 3n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + + // Give the pump time to process all four sends before reading. + await new Promise((resolve) => setTimeout(resolve, 200)); + + const first = await transport.receiveFrame(); + assert.equal(first.sequence, 3n, "only the newest pending frame for the key is kept"); + + const timeout = new AbortController(); + const timer = setTimeout(() => timeout.abort(), 300); + await assert.rejects(transport.receiveFrame(timeout.signal), "nothing else should be pending"); + clearTimeout(timer); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("fix 6: a stream shutdown prunes its entry so streamKinds does not grow without bound", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const accepted = listener.acceptOnce(); + const transport = await connector.connect(candidate, target); + try { + const connectionId = await accepted; + listener.sendFrame(connectionId, testFrame(), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const received = await transport.receiveFrame(); + assert.equal(received.sequence, 1n); + + // The server-side stream the frame arrived on is a fresh latest-only + // stream the listener opened and finished with `fin: true`; the native + // bridge emits its own shutdown event once MsQuic completes teardown. + // Wait for that STREAM_SHUTDOWN to actually land, then assert the + // internal map was pruned, not just that a second frame still works + // (F6kinds's removed prune line has no behavioural symptom until a + // stream id is reused, which QUIC never does within one connection). + await new Promise((resolve) => setTimeout(resolve, 300)); + assert.equal( + (transport as CultMeshQuicRealtimeTransport).trackedStreamCount, + 0, + "streamKinds must be pruned once the stream shuts down, not accumulate one entry per stream", + ); + + listener.sendFrame(connectionId, testFrame({ sequence: 2n }), CULTMESH_QUIC_STREAM_LATEST_ONLY); + const second = await transport.receiveFrame(); + assert.equal(second.sequence, 2n); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); + +test("P8: a reliable send still queued behind reliableSendTail rejects instead of hanging when disposal wins the race", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const listener = await RawQuicListener.open(); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: `cultmesh-state+quic://127.0.0.1:${listener.boundPort}?cert-sha256=${fixturePinHex()}`, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + const transport = await connector.connect(candidate, target); + try { + // Prime the reliable outbound stream and let it fully settle, so its + // id is already cached: a second reliable send then chains straight + // onto `sendOnStream` with no `streamOpen` call of its own in between + // (a `streamOpen` against an already-shut-down connection fails with + // its own native error, which would mask the guard this test targets). + await transport.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: 1n })); + + // `sendFrame` chains onto `reliableSendTail`, which resolves as a + // microtask; calling `dispose()` synchronously right after, in the + // same turn, guarantees `cleanup()` has already set `disposed = true` + // by the time that microtask runs `sendOnStream`. Without the + // `this.disposed` guard `sendOnStream` registers (P8's target), this + // send would sit in `pendingSends` forever: `cleanup()`'s reject sweep + // already ran once before this send was ever registered, and no later + // native event can reach it either, since `offConnectionEvent` already + // ran too. + const send = transport.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: 2n })); + transport.dispose(); + // Bounded: without the guard, `send` never settles (nothing left to + // reject it), so a bare `assert.rejects(send, ...)` would hang this + // whole file instead of failing this one test by assertion. Racing + // against a timeout that rejects with a different message turns a + // regression into a prompt, loud assertion mismatch. + const bounded = Promise.race([ + send, + new Promise((_, reject) => + setTimeout(() => reject(new Error("P8 guard timed out instead of rejecting")), 3_000), + ), + ]); + await assert.rejects(bounded, /disposed/i); + } finally { + transport.dispose(); + } + } finally { + await listener.close(); + } +}); diff --git a/packages/cultmesh-ts/test/realtime-quic-native.test.ts b/packages/cultmesh-ts/test/realtime-quic-native.test.ts new file mode 100644 index 00000000..039d9047 --- /dev/null +++ b/packages/cultmesh-ts/test/realtime-quic-native.test.ts @@ -0,0 +1,388 @@ +// The Cut 3 FFI smoke, now run against `CultMeshQuicNativeRuntime` instead of +// raw koffi calls: open a runtime, open a listener with a real credential, +// connect a real loopback connection, exchange one frame's worth of raw +// bytes, and close everything down. This proves the binding's declared ABI +// matches the shipped bridge; frame semantics (delivery, generation) are +// `realtime-quic-consumer.test.ts`'s job. +// +// Skips instead of failing when no native bridge is available: set +// CULTMESH_QUIC_NATIVE_DIR to a directory `scripts/build-quic-native.ps1` or +// `scripts/build-quic-native.sh` built, or run from the committed +// `packages/cultmesh-ts/native/` tree once a later cut lands it. + +import assert from "node:assert/strict"; +import { spawnSync } from "node:child_process"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import test from "node:test"; + +import { + CultMeshQuicNativeRuntime, + CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION, + CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED, + CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED, + CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN, + CULTMESH_QUIC_EVENT_STREAM_STARTED, + CULTMESH_QUIC_EVENT_STREAM_FRAME, + CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE, + CULTMESH_QUIC_STREAM_RELIABLE, +} from "../src/realtime-quic-native"; +import { nativeBridgeAvailable } from "./support/native-bridge"; + +// __dirname at runtime is dist-test/test; fixtures are binary and are never +// compiled/copied there, so they are read from their source location, two +// levels up. +const FIXTURE_P12 = join(__dirname, "..", "..", "test", "fixtures", "quic-test.p12"); + +async function waitFor(collect: (resolve: (value: T) => void) => void, timeoutMs = 5_000): Promise { + return await new Promise((resolve, reject) => { + const timer = setTimeout(() => reject(new Error("timed out waiting for a native QUIC event")), timeoutMs); + collect((value) => { + clearTimeout(timer); + resolve(value); + }); + }); +} + +test("CultMeshQuicNativeRuntime opens and closes with no listener or connection", async (t) => { + if (!nativeBridgeAvailable()) { + t.skip("CULTMESH_QUIC_NATIVE_DIR is not set to a built native bridge."); + return; + } + const runtime = await CultMeshQuicNativeRuntime.open(); + await runtime.release(); +}); + +test("CultMeshQuicNativeRuntime opens and closes a listener with a real PKCS12 credential", async (t) => { + if (!nativeBridgeAvailable()) { + t.skip("CULTMESH_QUIC_NATIVE_DIR is not set to a built native bridge."); + return; + } + const runtime = await CultMeshQuicNativeRuntime.open(); + try { + const pkcs12 = readFileSync(FIXTURE_P12); + const { listenerId, boundPort } = runtime.listenerOpen("127.0.0.1", 0, pkcs12, ""); + assert.ok(boundPort > 0); + runtime.listenerClose(listenerId); + } finally { + await runtime.release(); + } +}); + +test("a full loopback connection delivers one raw frame end to end", async (t) => { + if (!nativeBridgeAvailable()) { + t.skip("CULTMESH_QUIC_NATIVE_DIR is not set to a built native bridge."); + return; + } + const runtime = await CultMeshQuicNativeRuntime.open(); + try { + const pkcs12 = readFileSync(FIXTURE_P12); + const { listenerId, boundPort } = runtime.listenerOpen("127.0.0.1", 0, pkcs12, ""); + + const accepted = waitFor((resolve) => { + runtime.onListenerEvent(listenerId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION) resolve(event.connectionId); + }); + }); + + const clientConnectionId = runtime.connectionOpen("127.0.0.1", boundPort); + const clientConnected = waitFor((resolve) => { + runtime.onConnectionEvent(clientConnectionId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED) { + runtime.connectionCertificateComplete(clientConnectionId, true); + return; + } + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED) resolve(); + }); + }); + + const serverConnectionId = await accepted; + const serverFrame = waitFor((resolve) => { + runtime.onConnectionEvent(serverConnectionId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_STREAM_STARTED) { + assert.equal(event.streamKind, CULTMESH_QUIC_STREAM_RELIABLE); + return; + } + if (event.type === CULTMESH_QUIC_EVENT_STREAM_FRAME) resolve(event.payload); + }); + }); + + await clientConnected; + const streamId = runtime.streamOpen(clientConnectionId, CULTMESH_QUIC_STREAM_RELIABLE); + const sendComplete = waitFor((resolve) => { + runtime.onConnectionEvent(clientConnectionId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_STREAM_SEND_COMPLETE) resolve(); + }); + }); + runtime.streamSendFrame(streamId, new Uint8Array([1, 2, 3, 4]), true); + await sendComplete; + + const payload = await serverFrame; + assert.deepEqual(Array.from(payload), [1, 2, 3, 4]); + + runtime.connectionShutdown(clientConnectionId, 0n); + runtime.connectionShutdown(serverConnectionId, 0n); + runtime.listenerClose(listenerId); + } finally { + await runtime.release(); + } +}); + +test("F7: a 64-bit event code round-trips exactly through the struct decode", async (t) => { + if (!nativeBridgeAvailable()) { + t.skip("CULTMESH_QUIC_NATIVE_DIR is not set to a built native bridge."); + return; + } + const runtime = await CultMeshQuicNativeRuntime.open(); + try { + const pkcs12 = readFileSync(FIXTURE_P12); + const { listenerId, boundPort } = runtime.listenerOpen("127.0.0.1", 0, pkcs12, ""); + + // `code` (a `uint64_t`, the same field `CULTMESH_QUIC_SEND_CANCELED` is + // compared against on the stream-send path) is exercised here through + // CONNECTION_SHUTDOWN instead, whose code is an application-chosen value + // this test fully controls: two values above 2^53 (where koffi's decode + // stops being a plain safe-integer `number`) prove the whole + // encode-native-decode-coerce path is exact, deterministically, with no + // dependency on MsQuic's own send-completion timing. + for (const code of [(1n << 53n) + 1n, (1n << 62n) - 1n]) { + const accepted = waitFor((resolve) => { + runtime.onListenerEvent(listenerId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION) resolve(event.connectionId); + }); + }); + const clientConnectionId = runtime.connectionOpen("127.0.0.1", boundPort); + const clientConnected = waitFor((resolve) => { + runtime.onConnectionEvent(clientConnectionId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED) { + runtime.connectionCertificateComplete(clientConnectionId, true); + return; + } + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED) resolve(); + }); + }); + const serverConnectionId = await accepted; + await clientConnected; + + const seenOnClient = waitFor((resolve) => { + runtime.onConnectionEvent(clientConnectionId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_SHUTDOWN) resolve(event.code); + }); + }); + runtime.connectionShutdown(serverConnectionId, code); + const seen = await seenOnClient; + assert.equal(typeof seen, "bigint", "a decoded event code must always be bigint, never number"); + assert.equal(seen, code, `shutdown code ${code} must round-trip exactly through the struct decode`); + } + + runtime.listenerClose(listenerId); + } finally { + await runtime.release(); + } +}); + +test( + "P10b: a throwing onFault handler is isolated — the pump survives and other connections' handlers still run", + { timeout: 10_000 }, + async (t) => { + if (!nativeBridgeAvailable()) { + t.skip("CULTMESH_QUIC_NATIVE_DIR is not set to a built native bridge."); + return; + } + const runtime = await CultMeshQuicNativeRuntime.open(); + try { + const pkcs12 = readFileSync(FIXTURE_P12); + const { listenerId, boundPort } = runtime.listenerOpen("127.0.0.1", 0, pkcs12, ""); + + // Connection B: a normal, fully connected loopback pair, established + // before A ever faults — so proving B still works afterward exercises + // an already-running connection's handler, not a second accept cycle + // racing whatever state A's fault left behind. + const acceptedB = waitFor((resolve) => { + runtime.onListenerEvent(listenerId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION) resolve(event.connectionId); + }); + }); + const clientB = runtime.connectionOpen("127.0.0.1", boundPort); + const clientBConnected = waitFor((resolve) => { + runtime.onConnectionEvent(clientB, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED) { + runtime.connectionCertificateComplete(clientB, true); + return; + } + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_CONNECTED) resolve(); + }); + }); + const serverBId = await acceptedB; + const serverBFrame = waitFor((resolve) => { + runtime.onConnectionEvent(serverBId, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_STREAM_FRAME) resolve(event.payload); + }); + }); + await clientBConnected; + + // Connection A, opened only after B is fully connected: both its + // listener and its onFault handler throw on the first event delivered + // to it. Without `faultConnection`'s own try/catch isolating a + // throwing `onFault` (P10b's target), that throw would escape the + // pump's dispatch loop and take every other connection — including + // the already-live B — down with it, instead of staying scoped to A. + // + // The server-side connection listener is registered synchronously, + // inside the LISTENER_NEW_CONNECTION callback itself, rather than + // after an `await`: the native bridge can dispatch a connection's next + // event (CERTIFICATE_RECEIVED, or CONNECTED) before a later `await`'s + // continuation ever runs, and an event with no listener registered for + // its connection id is silently dropped (`dispatch`'s own + // `if (!entry) return`) — the same async-registration gap fix 1 closed + // for the provider's own accept path. + const serverAFaulted = waitFor((resolve) => { + runtime.onListenerEvent(listenerId, (event) => { + if (event.type !== CULTMESH_QUIC_EVENT_LISTENER_NEW_CONNECTION) return; + runtime.onConnectionEvent( + event.connectionId, + () => { + throw new Error("P10b: connection A's listener always throws."); + }, + () => { + resolve(); + throw new Error("P10b: connection A's onFault also throws."); + }, + ); + }); + }); + const clientA = runtime.connectionOpen("127.0.0.1", boundPort); + runtime.onConnectionEvent(clientA, (event) => { + if (event.type === CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED) { + runtime.connectionCertificateComplete(clientA, true); + } + }); + await serverAFaulted; + + // Prove B's handler is still live after A's onFault threw: send a + // frame on B and confirm the server side still receives it. + const streamId = runtime.streamOpen(clientB, CULTMESH_QUIC_STREAM_RELIABLE); + runtime.streamSendFrame(streamId, new Uint8Array([9, 9, 9]), true); + const payload = await serverBFrame; + assert.deepEqual( + Array.from(payload), + [9, 9, 9], + "connection B must still deliver frames after A's onFault threw", + ); + + runtime.connectionShutdown(clientA, 0n); + runtime.connectionShutdown(clientB, 0n); + runtime.connectionShutdown(serverBId, 0n); + runtime.listenerClose(listenerId); + } finally { + await runtime.release(); + } + }, +); + +test("fix 2: release() refuses a call with no outstanding reference", async (t) => { + if (!nativeBridgeAvailable()) { + t.skip("CULTMESH_QUIC_NATIVE_DIR is not set to a built native bridge."); + return; + } + const runtime = await CultMeshQuicNativeRuntime.open(); + await runtime.release(); + await assert.rejects(runtime.release(), /no outstanding reference/i); +}); + +test("negative grep: no koffi callbacks, .async only on nextEvent", () => { + // __dirname at runtime is dist-test/test; the source lives two levels up, + // in src/, since only .js output is mirrored under dist-test. + const source = readFileSync(join(__dirname, "..", "..", "src", "realtime-quic-native.ts"), "utf8"); + // `.async` is referenced (not necessarily called with a literal "(" at the + // reference site: it is handed to `promisify`, which calls it) only for + // `nextEvent`, the ABI's single blocking export. + const asyncUses = [...source.matchAll(/\.async\b/g)]; + assert.ok(asyncUses.length > 0, "expected at least one .async use for nextEvent"); + for (const match of asyncUses) { + const before = source.slice(Math.max(0, match.index! - 40), match.index!); + assert.match(before, /nextEvent/i, "the only .async reference must be nextEvent"); + } + assert.doesNotMatch(source, /koffi\.register/, "no koffi callbacks"); +}); + +// The measurement below runs in its own `node --expose-gc` child process +// instead of in this test's own process: by the time this test would run, +// ~150 earlier tests in the suite have already grown and partly freed the +// glibc heap, so a real per-call native leak can land in already-mapped free +// space and never show up as RSS growth in *this* process (confirmed by hand: +// the in-process version of this test passed even with `nextEvent` mutated +// back to allocating fresh koffi buffers every call). A freshly spawned +// process has no such history, matching the ~8 MiB (fixed) vs ~30 MiB +// (pre-fix) split measured in isolation. +const MEMORY_PROBE_SCRIPT = ` +const { CultMeshQuicNativeRuntime } = require(process.argv[1]); +(async () => { + const runtime = await CultMeshQuicNativeRuntime.open(); + const nextEvent = runtime.nextEvent.bind(runtime); + try { + for (let i = 0; i < 2000; i += 1) await nextEvent(0, null, 0); + global.gc(); + const before = process.memoryUsage().rss; + const ITERATIONS = 200000; + for (let i = 0; i < ITERATIONS; i += 1) await nextEvent(0, null, 0); + global.gc(); + const after = process.memoryUsage().rss; + process.stdout.write(JSON.stringify({ before, after, growthBytes: after - before, ITERATIONS })); + } finally { + await runtime.release(); + } +})().catch((error) => { + console.error(error); + process.exit(1); +}); +`; + +test( + "memory: sustained nextEvent calls do not leak koffi-allocated out-parameter buffers", + { timeout: 60_000 }, + (t) => { + if (!nativeBridgeAvailable()) { + t.skip("CULTMESH_QUIC_NATIVE_DIR is not set to a built native bridge."); + return; + } + + // `nextEvent` is private; the compiled module path is resolved the same + // way this file's own `import` resolves it, and handed to the child by + // argv so the child needs no path logic of its own. + const modulePath = require.resolve("../src/realtime-quic-native"); + const result = spawnSync(process.execPath, ["--expose-gc", "-e", MEMORY_PROBE_SCRIPT, modulePath], { + encoding: "utf8", + env: process.env, + }); + if (result.status !== 0 || typeof result.stdout !== "string" || result.stdout.trim().length === 0) { + if (/--expose-gc/.test(result.stderr ?? "")) { + t.skip("this Node build does not support --expose-gc."); + return; + } + assert.fail( + `memory probe child process failed (status ${String(result.status)}):\n${result.stderr ?? "(no stderr)"}`, + ); + } + + const { before, after, growthBytes, ITERATIONS } = JSON.parse(result.stdout.trim()) as { + before: number; + after: number; + growthBytes: number; + ITERATIONS: number; + }; + // Measured on Yggdrasil, same build and host, in a dedicated process: + // fixed code (0 `koffi.alloc` calls in the loop): ~8.0 MiB RSS growth. + // pre-fix code (400k `koffi.alloc` calls, never freed): ~29.9 MiB. + // 18 MiB sits well above the fixed baseline and well below the leaking + // one, so the bound stays robust to ordinary run-to-run noise while + // still catching the regression. + const BOUND_BYTES = 18 * 1024 * 1024; + assert.ok( + growthBytes < BOUND_BYTES, + `RSS grew by ${growthBytes} bytes (${(growthBytes / 1024 / 1024).toFixed(2)} MiB, from ${before} to ${after}) ` + + `over ${ITERATIONS} nextEvent calls; expected it to stay under ${BOUND_BYTES / 1024 / 1024} MiB once ` + + "out-parameter buffers are reused instead of allocated per call.", + ); + }, +); diff --git a/packages/cultmesh-ts/test/realtime-quic-provider.test.ts b/packages/cultmesh-ts/test/realtime-quic-provider.test.ts new file mode 100644 index 00000000..d174609b --- /dev/null +++ b/packages/cultmesh-ts/test/realtime-quic-provider.test.ts @@ -0,0 +1,1085 @@ +// `CultMeshQuicRealtimeProvider`, Cut 5's StreamPixels role, exercised +// end-to-end against the real native bridge and the real consumer connector +// from Cut 4 (no mocks): reliable ordering in both directions +// (`CultMeshQuicRealtimeTransportTests.cs:71-110`), latest-only coalescing +// per `(channel, body)` key, a non-blocking broadcast, the uppercase pin, and +// eviction on peer shutdown. +// +// Skips instead of failing when no native bridge is available; see +// `realtime-quic-native.test.ts` for why. + +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import test from "node:test"; + +import { documentPayloadFromBytes } from "@gamecult/cultcache-ts"; + +import { + CultMeshQuicNativeRuntime, +} from "../src/realtime-quic-native"; +import { + CultMeshQuicRealtimeConnector, + CultMeshQuicRealtimeProvider, + CultMeshQuicRealtimeTransport as CultMeshQuicRealtimeTransportClass, + parseQuicRealtimeEndpoint, + type CultMeshRealtimeCandidate, + type CultMeshRealtimeTarget, + type CultMeshRealtimeTransport, +} from "../src/realtime-quic"; +import type { CultMeshRealtimeFrame } from "../src/realtime-wire"; +import { nativeBridgeAvailable } from "./support/native-bridge"; + +// __dirname at runtime is dist-test/test; fixtures are binary and are never +// compiled/copied there, so they are read from their source location, two +// levels up. +const FIXTURE_P12 = join(__dirname, "..", "..", "test", "fixtures", "quic-test.p12"); + +/** + * `assert.rejects`, but safe against a mutant or a real regression that + * makes the promise resolve instead: a transport that unexpectedly connects + * is disposed before the assertion fails, so a broken certificate check + * cannot hang this file the way M1 did before realtime-quic-consumer.test.ts + * gained this same helper. + */ +async function assertRejectsAndDisposes( + promise: Promise<{ dispose(): void }>, + match?: RegExp, +): Promise { + let resolved: { dispose(): void } | undefined; + try { + resolved = await promise; + } catch (error) { + if (match) assert.match(error instanceof Error ? error.message : String(error), match); + return; + } + resolved.dispose(); + assert.fail("expected the promise to reject, but it resolved (the resolved value has been disposed)"); +} + +function testFrame(overrides: Partial = {}): CultMeshRealtimeFrame { + return { + channelId: "aetheria.entities", + schemaId: "eve.entity_soa.v1", + bodyId: "body:aetheria:entities", + producerEpoch: 7n, + sequence: 1n, + delivery: "latest-only", + payload: documentPayloadFromBytes(new Uint8Array([3, 4, 5])), + ...overrides, + }; +} + +async function startProvider(): Promise { + return await CultMeshQuicRealtimeProvider.listen({ + host: "127.0.0.1", + port: 0, + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + }); +} + +async function dialProvider(provider: CultMeshQuicRealtimeProvider): Promise { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + endpoint: provider.advertisedEndpoint, + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + return await connector.connect(candidate, target); +} + +async function waitUntil(predicate: () => boolean, timeoutMs = 5_000): Promise { + const deadline = Date.now() + timeoutMs; + while (!predicate()) { + if (Date.now() >= deadline) throw new Error("timed out waiting for a provider condition"); + await new Promise((resolve) => setTimeout(resolve, 10)); + } +} + +/** + * Waits for `CultMeshQuicNativeRuntime.refCount` to stop moving: `dispose()` + * releases its runtime reference fire-and-forget (`void this.runtime.release()`), + * so a just-finished test's cleanup can still be landing when the next test + * starts. A test that snapshots refCount as a baseline without waiting for + * this first can catch that in-flight decrement mid-test and see refCount + * undershoot its own "before" value instead of returning to it. + */ +async function waitForRefCountToStabilize(quietMs = 200, timeoutMs = 5_000): Promise { + const deadline = Date.now() + timeoutMs; + let last = CultMeshQuicNativeRuntime.refCount; + let stableSince = Date.now(); + for (;;) { + await new Promise((resolve) => setTimeout(resolve, 20)); + const current = CultMeshQuicNativeRuntime.refCount; + if (current !== last) { + last = current; + stableSince = Date.now(); + } else if (Date.now() - stableSince >= quietMs) { + return current; + } + if (Date.now() >= deadline) return current; + } +} + +test("the advertised endpoint carries an uppercase cert-sha256 pin the Unity connector requires", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + assert.match( + provider.advertisedEndpoint, + /^cultmesh-state\+quic:\/\/127\.0\.0\.1:\d+\?cert-sha256=[0-9A-F]{64}$/, + ); + // Not merely uppercase-tolerant: it must not contain a lowercase hex digit. + const pin = new URL(provider.advertisedEndpoint).searchParams.get("cert-sha256")!; + assert.equal(pin, pin.toUpperCase()); + assert.notEqual(pin, pin.toLowerCase()); + } finally { + provider.dispose(); + } +}); + +test("reliable-ordered delivers frames in order, provider to consumer and consumer to provider", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + await provider.broadcast(testFrame({ delivery: "reliable-ordered", sequence: 1n })); + await provider.broadcast(testFrame({ delivery: "reliable-ordered", sequence: 2n })); + const firstAtConsumer = await consumer.receiveFrame(); + const secondAtConsumer = await consumer.receiveFrame(); + assert.deepEqual([firstAtConsumer.sequence, secondAtConsumer.sequence], [1n, 2n]); + + await consumer.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: 3n })); + await consumer.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: 4n })); + const firstAtProvider = await provider.receive(); + const secondAtProvider = await provider.receive(); + assert.deepEqual([firstAtProvider.sequence, secondAtProvider.sequence], [3n, 4n]); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("latest-only broadcast coalesces back-to-back sends for the same key to the newest frame, and never blocks on I/O", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + // Three broadcasts for the same (channelId, bodyId) key, issued back to + // back with no await between them. `broadcast` for latest-only never + // awaits any I/O (mutating it to await the peer's send would make this + // loop, and the assertion below, run after real network round trips + // instead of within one JS turn): the synchronous middle publish is + // therefore always coalesced away, deterministically, not by luck of + // network timing. Mutating the coalescing key (e.g. dropping bodyId) + // would let sequence 200 leak through as a separate delivered frame + // instead of overwriting 100. + const before = Date.now(); + const first = provider.broadcast(testFrame({ sequence: 1n })); + const second = provider.broadcast(testFrame({ sequence: 100n })); + const third = provider.broadcast(testFrame({ sequence: 200n })); + const afterCallsReturned = Date.now(); + // All three promises exist before any of them could possibly have + // waited on the peer's round trip: the loop above ran in well under a + // network round trip's worth of time. + assert.ok(afterCallsReturned - before < 50, "broadcast must not block on any peer's I/O"); + await Promise.all([first, second, third]); + + // The consumer's own receive-side inbox (Cut 4) also coalesces + // latest-only frames it has not yet read, so whether 1 is delivered as + // its own frame or is itself coalesced away by 200 arriving first + // depends on read timing; that is Cut 4's contract, not this test's. + // What this test owns is the provider's outbox: 100 must never appear, + // and the last frame delivered must be 200. + const received: bigint[] = []; + let last: bigint | undefined; + while (last !== 200n) { + const frame = await consumer.receiveFrame(); + received.push(frame.sequence); + last = frame.sequence; + } + assert.ok(!received.includes(100n), `100 must be coalesced away, got ${received}`); + assert.ok(received.length <= 2, `expected at most 2 delivered frames, got ${received}`); + assert.equal(last, 200n); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("a stalled peer's outbox holds at most one pending frame per key across many broadcasts", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + // 200 broadcasts, none awaited individually, none read by the consumer + // until they are all issued: mirrors the interop lane's stalled-reader + // scenario at unit-test speed. `broadcast` completing this loop at all + // (bounded time) proves it never blocks on the unread peer. + const started = Date.now(); + const sends: Promise[] = []; + for (let sequence = 1; sequence <= 200; sequence += 1) { + sends.push(provider.broadcast(testFrame({ sequence: BigInt(sequence) }))); + } + await Promise.all(sends); + assert.ok(Date.now() - started < 2_000, "200 broadcasts to one key must complete quickly, unread"); + + const receivedSequences: bigint[] = []; + let last: bigint | undefined; + while (last !== 200n) { + const frame = await consumer.receiveFrame(); + receivedSequences.push(frame.sequence); + last = frame.sequence; + } + assert.equal(last, 200n); + // Coalescing means far fewer than 200 frames were actually put on the + // wire; the exact count depends on scheduling, but it must be small. + assert.ok(receivedSequences.length < 200, `expected coalescing, got ${receivedSequences.length} frames`); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test( + "20,000 client latest-only frames on one key leave at most 1 pending in the provider's receive queue", + { timeout: 120_000 }, + async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + // The exact scenario Soul's probe reproduced against the unbounded + // `readyFrames` array this replaced: a publish-only StreamPixels-style + // consumer of `receive()` never drains the provider's fan-in queue, + // so a client hammering one key must not be able to grow it past one + // entry no matter how many frames it sends. + const total = 20_000; + const sends: Promise[] = []; + for (let sequence = 1; sequence <= total; sequence += 1) { + sends.push(consumer.sendFrame(testFrame({ delivery: "latest-only", sequence: BigInt(sequence) }))); + } + await Promise.all(sends); + await waitUntil(() => provider.receiveQueueSize > 0, 30_000); + // Let any trailing send_complete events land before asserting the + // queue has settled, so this isn't racing the last few deliveries. + await new Promise((resolve) => setTimeout(resolve, 200)); + + assert.equal( + provider.receiveQueueSize, + 1, + `one client key must coalesce to at most one pending frame, got ${provider.receiveQueueSize}`, + ); + const frame = await provider.receive(); + assert.equal(frame.sequence, BigInt(total), "the one pending frame must be the newest generation sent"); + assert.equal(provider.receiveQueueSize, 0); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } + }, +); + +test( + "many distinct client latest-only keys stay bounded by the key count, not the frame count", + async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + const keyCount = 50; + const sendsPerKey = 20; + const sends: Promise[] = []; + for (let key = 0; key < keyCount; key += 1) { + for (let sequence = 1; sequence <= sendsPerKey; sequence += 1) { + sends.push( + consumer.sendFrame( + testFrame({ + delivery: "latest-only", + bodyId: `body:${key}`, + sequence: BigInt(sequence), + }), + ), + ); + } + } + await Promise.all(sends); + await waitUntil(() => provider.receiveQueueSize > 0, 10_000); + await new Promise((resolve) => setTimeout(resolve, 200)); + + assert.equal( + provider.receiveQueueSize, + keyCount, + `the queue must hold exactly one pending frame per distinct key, got ${provider.receiveQueueSize}`, + ); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } + }, +); + +test("reliable-ordered client frames are delivered in order at the provider, never coalesced", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + const total = 500; + for (let sequence = 1; sequence <= total; sequence += 1) { + await consumer.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: BigInt(sequence) })); + } + await waitUntil(() => provider.receiveQueueSize === total, 10_000); + + const received: bigint[] = []; + for (let i = 0; i < total; i += 1) { + received.push((await provider.receive()).sequence); + } + const expected = Array.from({ length: total }, (_, i) => BigInt(i + 1)); + assert.deepEqual(received, expected, "reliable-ordered frames must never be coalesced or reordered"); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("frames already queued in the provider's receive queue drain before dispose's rejection", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + await consumer.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: 1n })); + await consumer.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: 2n })); + await waitUntil(() => provider.receiveQueueSize === 2); + + // Dispose while two frames are still sitting in the queue, unread. + provider.dispose(); + + const first = await provider.receive(); + const second = await provider.receive(); + assert.deepEqual([first.sequence, second.sequence], [1n, 2n], "already-queued frames must drain first"); + await assert.rejects(() => provider.receive(), /disposed/, "only a call past the drained backlog rejects"); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("unreliable broadcast fails closed", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + await assert.rejects(provider.broadcast(testFrame({ delivery: "unreliable" })), /datagrams/i); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("a peer is evicted from the provider on connection shutdown", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + await waitUntil(() => provider.connectionCount === 1); + consumer.dispose(); + await waitUntil(() => provider.connectionCount === 0); + } finally { + provider.dispose(); + } +}); + +test("a reliable-ordered send failure evicts the peer without broadcast() throwing to the caller", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + await waitUntil(() => provider.connectionCount === 1); + consumer.dispose(); + // Keep broadcasting reliable-ordered frames into the dying/dead peer's + // outbound stream for a short window: somewhere in this window the + // send to that peer fails (either the native stream call itself, or + // the peer's own CONNECTION_SHUTDOWN cleanup rejecting it), and + // CultMeshQuicRealtimeProvider.broadcast()'s per-peer try/catch must + // dispose it rather than let the rejection propagate or leave a dead + // peer counted forever. + const deadline = Date.now() + 2_000; + let sequence = 0n; + while (Date.now() < deadline && provider.connectionCount > 0) { + sequence += 1n; + // Must never throw: a removed subtraction of the catch's dispose() + // call would not itself make broadcast() throw, but a regression + // that let the rejection propagate instead of being caught at all + // would, and this loop would then fail loudly instead of hanging. + await provider.broadcast(testFrame({ delivery: "reliable-ordered", sequence })); + } + assert.equal(provider.connectionCount, 0, "the dead peer must be evicted, not counted forever"); + } finally { + provider.dispose(); + } +}); + +test("connectionCount reflects accepted peers, and dispose releases the runtime for a fresh listen", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + assert.equal(provider.connectionCount, 0); + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + } finally { + consumer.dispose(); + provider.dispose(); + } + // A leaked runtime reference from any earlier path (accept, handshake + // timeout, dispose) would leave the shared runtime unable to open a fresh + // listener cleanly; opening and tearing down a second provider proves + // release ran on every path exercised above. + const again = await startProvider(); + again.dispose(); +}); + +test("the runtime reference is released when extracting the certificate fails, before any listener opens", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const before = CultMeshQuicNativeRuntime.refCount; + await assert.rejects( + CultMeshQuicRealtimeProvider.listen({ + host: "127.0.0.1", + port: 0, + // Not a PKCS12 credential at all: extractLeafCertificateDer() throws + // before CultMeshQuicNativeRuntime.open() is ever called, so there is + // no reference to leak on this path; this pins that (trivial but + // real) invariant rather than exercising listen()'s own + // `catch { await runtime.release(); throw error; }`, which the next + // test covers with a listener-level failure instead. + serverCertificate: { pkcs12: new Uint8Array([1, 2, 3, 4]), password: "" }, + }), + ); + assert.equal(CultMeshQuicNativeRuntime.refCount, before, "must not leak a reference that was never opened"); +}); + +test("the runtime reference is released when the listener itself fails to open", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const holder = await startProvider(); + try { + const boundPort = new URL(holder.advertisedEndpoint).port; + const before = CultMeshQuicNativeRuntime.refCount; + // A real, valid PKCS12 (so extractLeafCertificateDer succeeds and + // CultMeshQuicNativeRuntime.open() actually runs), but the port + // `holder` already has bound: listenerOpen() itself must fail, driving + // listen()'s `catch { await runtime.release(); throw error; }`. + await assert.rejects( + CultMeshQuicRealtimeProvider.listen({ + host: "127.0.0.1", + port: Number(boundPort), + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + }), + ); + assert.equal( + CultMeshQuicNativeRuntime.refCount, + before, + "a listenerOpen() failure must release the reference listen() had already opened", + ); + } finally { + holder.dispose(); + } +}); + +test( + "the runtime reference is released on dispose with a pending send in flight", + { timeout: 10_000 }, + async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const before = CultMeshQuicNativeRuntime.refCount; + const provider = await startProvider(); + const consumer = await dialProvider(provider); + await waitUntil(() => provider.connectionCount === 1); + + // Start a reliable-ordered broadcast and dispose before it can possibly + // have settled; dispose() must tear the peer down (and release its + // runtime reference) regardless of the outstanding send. `broadcast()` + // must itself never hang: an explicit `{ timeout }` above fails this + // test loudly, rather than the whole file, if it ever does. + const broadcasting = provider.broadcast(testFrame({ delivery: "reliable-ordered" })).catch(() => {}); + provider.dispose(); + await broadcasting; + consumer.dispose(); + await waitUntil(() => CultMeshQuicNativeRuntime.refCount === before); + }, +); + +test( + "dispose() evicts a connection still mid-handshake, not just fully attached peers", + { timeout: 10_000 }, + async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + // A long handshake timeout: without dispose() sweeping still-pending + // accepts (fixed alongside this test), a connection whose handshake + // never reaches CONNECTED — here, the client rejects the provider's + // certificate — would sit on its own handshake timer, and once + // attachPeer's own CultMeshQuicNativeRuntime.open() resolves, hold a + // runtime reference, for up to this long after dispose() returns. Found + // this way: mutating the certificate-pin comparison to be + // case-sensitive (M2) made every provider test that dials with an + // uppercase-pinned endpoint reject during the handshake, and the whole + // file then hung for over two minutes past its last visible test. + // Earlier tests' dispose() releases fire-and-forget; wait for the + // shared refCount to actually settle before treating it as a baseline + // (see waitForRefCountToStabilize's own doc comment). + const before = await waitForRefCountToStabilize(); + const provider = await CultMeshQuicRealtimeProvider.listen({ + host: "127.0.0.1", + port: 0, + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + handshakeTimeoutMs: 30_000, + }); + try { + const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + const candidate: CultMeshRealtimeCandidate = { + // A pin that can never match this provider's real certificate: the + // connector rejects it during CULTMESH_QUIC_EVENT_CONNECTION_CERTIFICATE_RECEIVED, + // before the connection ever reaches CONNECTED. + endpoint: provider.advertisedEndpoint.replace(/cert-sha256=[0-9A-F]+/, `cert-sha256=${"0".repeat(64)}`), + authorityRuntimeId: target.authorityRuntimeId, + priority: 0, + generation: "gen-1", + }; + const connector = new CultMeshQuicRealtimeConnector(); + // If the certificate check ever regresses into accepting everything + // (M1), this resolves into a fully attached peer instead of rejecting; + // assertRejectsAndDisposes() disposes the client-side transport either + // way, but only the outer `finally` below disposes the provider itself + // (and the peer it would then hold), which is what actually closes + // the file-hanging gap M1 found here. + await assertRejectsAndDisposes(connector.connect(candidate, target), /certificate|rejected/i); + + // The provider's own accept flow is asynchronous (attachPeer awaits a + // runtime reference before it can even see the rejection); give it a + // moment to actually start before disposing, so this test exercises a + // real in-flight pending accept rather than one that never began. + await new Promise((resolve) => setTimeout(resolve, 100)); + + const disposedAt = Date.now(); + provider.dispose(); + await waitUntil(() => CultMeshQuicNativeRuntime.refCount === before, 5_000); + assert.ok( + Date.now() - disposedAt < 5_000, + "dispose() must evict a mid-handshake connection promptly, not wait out its 30s handshake timeout", + ); + } finally { + provider.dispose(); + } + }, +); + +test("a peer attaching after two latest-only broadcasts for one key receives exactly the newer frame", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + await provider.broadcast(testFrame({ sequence: 1n, payload: documentPayloadFromBytes(new Uint8Array([1])) })); + await provider.broadcast(testFrame({ sequence: 2n, payload: documentPayloadFromBytes(new Uint8Array([2])) })); + + // Attach after both broadcasts have already resolved: nothing in this + // peer's outbox came from `broadcast()`'s own fan-out, only from the + // retained seed on attach. + const consumer = await dialProvider(provider); + try { + const seeded = await consumer.receiveFrame(); + assert.equal(seeded.sequence, 2n, "a late joiner must be seeded with the newest retained generation"); + assert.deepEqual(seeded.payload, new Uint8Array([2])); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("retention keeps the newer generation when an older one broadcasts afterward", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + await provider.broadcast(testFrame({ sequence: 5n, payload: documentPayloadFromBytes(new Uint8Array([5])) })); + // An older generation broadcast after a newer one must not overwrite the + // retained frame: mutating the retention comparison to a plain + // last-write-wins assignment would regress this. + await provider.broadcast(testFrame({ sequence: 3n, payload: documentPayloadFromBytes(new Uint8Array([3])) })); + + const consumer = await dialProvider(provider); + try { + const seeded = await consumer.receiveFrame(); + assert.equal(seeded.sequence, 5n, "an older generation must not replace the retained newer one"); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("a reliable-ordered frame is never retained and is not delivered to a late joiner", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const firstConsumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + await provider.broadcast(testFrame({ delivery: "reliable-ordered", sequence: 9n })); + assert.deepEqual((await firstConsumer.receiveFrame()).sequence, 9n); + } finally { + firstConsumer.dispose(); + } + await waitUntil(() => provider.connectionCount === 0); + + // A second peer attaches after the reliable-ordered frame above and + // after a real latest-only frame, so the assertion below proves the + // reliable-ordered frame specifically was never retained, rather than + // merely proving the provider had nothing at all to seed. + await provider.broadcast(testFrame({ delivery: "latest-only", sequence: 1n, payload: documentPayloadFromBytes(new Uint8Array([1])) })); + const secondConsumer = await dialProvider(provider); + try { + const seeded = await secondConsumer.receiveFrame(); + assert.equal(seeded.delivery, "latest-only"); + assert.equal(seeded.sequence, 1n, "only the latest-only frame may be seeded, never the reliable-ordered one"); + } finally { + secondConsumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test( + "fix 1: a peer stays connected and keeps receiving well past handshakeTimeoutMs", + { timeout: 10_000 }, + async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + // Must fail on the pre-fix code: the buffering-handler/attachPeer swap + // there loses `state.connected` to whichever handler happens to be + // registered when CONNECTED actually arrives, and the handshake timer + // evicts a fully healthy peer at this deadline regardless. + const handshakeTimeoutMs = 500; + const provider = await CultMeshQuicRealtimeProvider.listen({ + host: "127.0.0.1", + port: 0, + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + handshakeTimeoutMs, + }); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + await new Promise((resolve) => setTimeout(resolve, handshakeTimeoutMs * 3)); + assert.equal(provider.connectionCount, 1, "a connected peer must not be evicted by the handshake timer"); + + await provider.broadcast(testFrame({ delivery: "reliable-ordered", sequence: 1n })); + const received = await consumer.receiveFrame(); + assert.equal(received.sequence, 1n, "a peer past the handshake deadline must still receive frames"); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } + }, +); + +test("fix 2: an invalid frame throws from broadcast, and connectionCount is unchanged", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + // A 70,000-byte channelId exceeds the wire's 0xffff identity limit: + // `encodeRealtimeFrame` throws. Before fix 2, encoding happened once + // per peer inside `sendFrame`, so the same failure evicted every peer + // while `broadcast()` itself reported success. + await assert.rejects( + provider.broadcast(testFrame({ delivery: "reliable-ordered", channelId: "x".repeat(70_000) })), + /exceeds the QUIC wire limit/i, + ); + assert.equal(provider.connectionCount, 1, "an invalid frame must not evict any peer"); + + // The peer must still be usable afterward: prove the connection itself + // survived, not merely that the count field wasn't decremented. + await provider.broadcast(testFrame({ delivery: "reliable-ordered", sequence: 42n })); + assert.equal((await consumer.receiveFrame()).sequence, 42n); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("fix 2: a latest-only invalid frame also throws from broadcast without evicting any peer", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + await assert.rejects( + provider.broadcast(testFrame({ delivery: "latest-only", channelId: "x".repeat(70_000) })), + /exceeds the QUIC wire limit/i, + ); + assert.equal(provider.connectionCount, 1, "an invalid latest-only frame must not evict any peer"); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("fix 3: advertisedHost is used in place of the bind address, and round-trips through the module's parser", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await CultMeshQuicRealtimeProvider.listen({ + host: "0.0.0.0", + port: 0, + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + advertisedHost: "streampixels.gamecult.org", + }); + try { + assert.match( + provider.advertisedEndpoint, + /^cultmesh-state\+quic:\/\/streampixels\.gamecult\.org:\d+\?cert-sha256=[0-9A-F]{64}$/, + ); + const parsed = parseQuicRealtimeEndpoint(provider.advertisedEndpoint); + assert.equal(parsed.host, "streampixels.gamecult.org"); + assert.equal(parsed.port, Number(new URL(provider.advertisedEndpoint).port)); + assert.ok(parsed.certificateSha256); + } finally { + provider.dispose(); + } +}); + +test("fix 3: an IPv6 bind advertises a bracketed literal that round-trips through the module's parser", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await CultMeshQuicRealtimeProvider.listen({ + host: "::1", + port: 0, + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + }); + try { + assert.match( + provider.advertisedEndpoint, + /^cultmesh-state\+quic:\/\/\[::1\]:\d+\?cert-sha256=[0-9A-F]{64}$/, + ); + // `URL`'s own `hostname` keeps the brackets for an IPv6 literal (unlike + // the unbracketed form `formatEndpointHost` accepted as input); the + // round trip's job is proving the endpoint parses at all, not stripping + // brackets the WHATWG URL parser itself never strips. + const parsed = parseQuicRealtimeEndpoint(provider.advertisedEndpoint); + assert.equal(parsed.host, "[::1]"); + } finally { + provider.dispose(); + } +}); + +test("fix 4: receive() with an already-aborted signal rejects immediately instead of hanging", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const controller = new AbortController(); + controller.abort(); + await assert.rejects(provider.receive(controller.signal), /aborted/i); + } finally { + provider.dispose(); + } +}); + +test("P3: a latest-only send failure evicts the peer without broadcast() throwing to the caller", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + await waitUntil(() => provider.connectionCount === 1); + consumer.dispose(); + // Mirrors the existing reliable-ordered eviction test, but for the + // outbox's own send failure path (`CultMeshQuicRealtimeProviderOutbox.pump`'s + // catch, which disposes the peer and reports failure through + // `onSendFailure`) rather than `broadcast()`'s direct per-peer catch. + // + // What made this flaky: unlike the reliable-ordered version, + // `broadcast()` never awaits a latest-only peer's actual send — it only + // hands the frame to that peer's outbox and returns (see + // `CultMeshQuicRealtimeProvider.broadcast`). A `while (Date.now() < + // deadline)` loop therefore does no real I/O per iteration; it just + // spins encoding and enqueueing frames as fast as the CPU allows, + // starving the event-loop turns the native pump needs to actually + // observe the dead connection and fire `send_complete`/ + // `CONNECTION_SHUTDOWN`. Under any extra load in the test process + // (exactly what running under mutation testing adds, regardless of + // which line was mutated) that starvation can burn the whole wall-clock + // bound without ever landing an attempt past the point the connection + // is actually dead — a failure with nothing to do with the mutant under + // test. Raising the bound only buys more spinning, not more real + // attempts. Fixed by decoupling "how many attempts to seed" (a small, + // fixed count, each with a real yield) from "how long to wait for the + // result" (a single `waitUntil` afterward, which is what actually + // bounds this test). + for (let sequence = 0n; sequence < 20n && provider.connectionCount > 0; sequence += 1n) { + await provider.broadcast(testFrame({ delivery: "latest-only", sequence, bodyId: `body:${sequence}` })); + await new Promise((resolve) => setTimeout(resolve, 25)); + } + await waitUntil(() => provider.connectionCount === 0); + assert.equal(provider.connectionCount, 0, "the dead peer must be evicted, not counted forever"); + } finally { + provider.dispose(); + } +}); + +test("I1: an inbox key keeps its first-arrival position when a newer frame overwrites it", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + // Key A arrives first, then key B, then A is republished with a new + // value while still unread: `CultMeshRealtimeInbox.publish`'s + // coalescing must overwrite A's *value* in place, not move it to the + // back of the queue behind B. `received` is exactly that inbox, + // reached through the provider's client fan-in. + await consumer.sendFrame(testFrame({ delivery: "latest-only", bodyId: "body:A", sequence: 1n })); + await waitUntil(() => provider.receiveQueueSize === 1); + await consumer.sendFrame(testFrame({ delivery: "latest-only", bodyId: "body:B", sequence: 1n })); + await waitUntil(() => provider.receiveQueueSize === 2); + await consumer.sendFrame(testFrame({ delivery: "latest-only", bodyId: "body:A", sequence: 2n })); + // Still 2: the second A publish must coalesce onto the already-queued + // A entry, not add a third. + await new Promise((resolve) => setTimeout(resolve, 200)); + assert.equal(provider.receiveQueueSize, 2, "a republish of a still-pending key must not grow the queue"); + + const first = await provider.receive(); + const second = await provider.receive(); + assert.equal(first.bodyId, "body:A", "A must still drain first: its position must survive the overwrite"); + assert.equal(first.sequence, 2n, "A's value must be the newer, overwritten one"); + assert.equal(second.bodyId, "body:B"); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("L1: the outbox keeps one send in flight per peer; the next frame dequeues only after send_complete", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + // Prototype-patched for the life of this test, restored in `finally`: + // the provider builds its peer transport internally, so this is the + // only vantage point outside the module from which to observe + // concurrency of `sendEncodedFrame` calls, which is what + // `CultMeshQuicRealtimeProviderOutbox.pump` serializes one-at-a-time + // against `send_complete`. + const original = CultMeshQuicRealtimeTransportClass.prototype.sendEncodedFrame; + let active = 0; + let maxActive = 0; + CultMeshQuicRealtimeTransportClass.prototype.sendEncodedFrame = function ( + this: InstanceType, + delivery: "reliable-ordered" | "latest-only", + encoded: Uint8Array, + ) { + active += 1; + maxActive = Math.max(maxActive, active); + return original.call(this, delivery, encoded).finally(() => { + active -= 1; + }); + }; + try { + const total = 20; + const sends: Promise[] = []; + for (let key = 0; key < total; key += 1) { + sends.push(provider.broadcast(testFrame({ bodyId: `body:${key}`, sequence: 1n }))); + } + await Promise.all(sends); + + const seen = new Set(); + while (seen.size < total) { + const frame = await consumer.receiveFrame(); + seen.add(frame.bodyId); + } + } finally { + CultMeshQuicRealtimeTransportClass.prototype.sendEncodedFrame = original; + } + assert.equal(maxActive, 1, "the outbox pump must never have two sends in flight for one peer at once"); + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("P15: broadcast() after dispose rejects instead of touching a torn-down provider", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + provider.dispose(); + await assert.rejects(provider.broadcast(testFrame()), /disposed/i); +}); + +test("P17: an accept arriving after dispose is refused, not attached as a peer", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await startProvider(); + const runtime = await CultMeshQuicNativeRuntime.open(); + let connectionId: bigint | undefined; + try { + // A real native connection handle this test owns outright (never dialed + // anywhere reachable, so shutting it down is safe): stands in for the + // handle a genuine NEW_CONNECTION event would have carried, without + // fabricating a bogus native pointer. `acceptConnection` is private; + // reaching it directly is what lets this test drive the exact race + // (an accept event landing after `dispose()` has already run) without + // depending on real listener-close timing to reproduce it. + connectionId = runtime.connectionOpen("127.0.0.1", 1); + provider.dispose(); + // This synthetic connection never reaches CONNECTED either way (it was + // never dialed anywhere), so `connectionCount` alone cannot distinguish + // "refused" from "attached but still handshaking". `retain()` is + // synchronous and only the attach path calls it: a stable `refCount` + // across the call proves no transport (and no runtime reference) was + // ever allocated for this connection. + const beforeRefCount = CultMeshQuicNativeRuntime.refCount; + assert.doesNotThrow(() => + (provider as unknown as { acceptConnection(id: bigint): void }).acceptConnection(connectionId!), + ); + assert.equal( + CultMeshQuicNativeRuntime.refCount, + beforeRefCount, + "a post-dispose accept must never retain a runtime reference for a new transport", + ); + assert.equal(provider.connectionCount, 0, "a post-dispose accept must never join peers"); + } finally { + if (connectionId !== undefined) { + try { + runtime.connectionShutdown(connectionId, 0n); + } catch { + // Best-effort: acceptConnection's own disposed-path may already have shut it down. + } + } + await runtime.release(); + } +}); + +test("fix 1: a publish-only provider faults a client that sends to it, and its memory stays empty", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await CultMeshQuicRealtimeProvider.listen({ + host: "127.0.0.1", + port: 0, + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + acceptClientFrames: false, + }); + try { + const consumer = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + // receive() itself rejects clearly rather than hanging forever. + await assert.rejects(provider.receive(), /publish-only/i); + + // Any inbound stream from the client faults that connection. The + // client's own `sendFrame` promise settles on its *local* stream + // send completing (MsQuic hands the bytes off and reports + // send_complete without waiting for the peer to process them), so it + // may well resolve even though the server already faulted its side — + // the proof this test owns is the server's state, not the client's + // send outcome, so the client send is fired and ignored either way. + void consumer.sendFrame(testFrame({ delivery: "latest-only" })).catch(() => {}); + await waitUntil(() => provider.connectionCount === 0); + assert.equal(provider.receiveQueueSize, 0, "no frame from a faulted publish-only client may be queued"); + + // The provider itself is otherwise healthy: broadcasting still works + // for a freshly attached peer. + const second = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + await provider.broadcast(testFrame({ delivery: "reliable-ordered", sequence: 1n })); + assert.equal((await second.receiveFrame()).sequence, 1n); + } finally { + second.dispose(); + } + } finally { + consumer.dispose(); + } + } finally { + provider.dispose(); + } +}); + +test("fix 2: a connection beyond maxConnections is refused and existing peers are unaffected", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + const provider = await CultMeshQuicRealtimeProvider.listen({ + host: "127.0.0.1", + port: 0, + serverCertificate: { pkcs12: readFileSync(FIXTURE_P12), password: "" }, + maxConnections: 1, + }); + try { + const first = await dialProvider(provider); + try { + await waitUntil(() => provider.connectionCount === 1); + + // Refused at accept: never reaches CONNECTED, never becomes a peer. + await assertRejectsAndDisposes(dialProvider(provider), /certificate|rejected|closed|shut|timed out/i); + // Give the refusal a moment to be visible either way, then prove the + // existing peer was never touched. + await new Promise((resolve) => setTimeout(resolve, 200)); + assert.equal(provider.connectionCount, 1, "the existing peer must be unaffected by a refused connection"); + + await provider.broadcast(testFrame({ delivery: "reliable-ordered", sequence: 7n })); + assert.equal((await first.receiveFrame()).sequence, 7n, "the existing peer must still be fully usable"); + } finally { + first.dispose(); + } + } finally { + provider.dispose(); + } +}); diff --git a/packages/cultmesh-ts/test/realtime-quic-release-uaf.test.ts b/packages/cultmesh-ts/test/realtime-quic-release-uaf.test.ts new file mode 100644 index 00000000..f7958570 --- /dev/null +++ b/packages/cultmesh-ts/test/realtime-quic-release-uaf.test.ts @@ -0,0 +1,43 @@ +// Regression test for fix 2: CultMeshQuicNativeRuntime.release() must await +// the pump loop's exit before calling cultmesh_quic_runtime_close, never +// after. Reverting that order (close before awaiting the pump) reliably +// crashes this test under a saturated libuv thread pool and MALLOC_PERTURB_, +// at every pool size tried by hand while verifying this batch; restored +// immediately afterward, never committed. +// +// UV_THREADPOOL_SIZE and MALLOC_PERTURB_ must be set before Node starts, so +// this spawns a child `node` process running test/support/release-uaf-probe.js +// with that environment, once per pool size, and asserts it exits 0. Kept to +// one scenario (see the probe's own header) so the whole test stays bounded +// to a few seconds. + +import assert from "node:assert/strict"; +import { spawnSync } from "node:child_process"; +import { join } from "node:path"; +import test from "node:test"; + +import { nativeBridgeAvailable } from "./support/native-bridge"; + +const PROBE_SCRIPT = join(__dirname, "..", "..", "test", "support", "release-uaf-probe.js"); + +test("fix 2 regression: release()'s ordering survives a saturated thread pool at pool sizes 1, 2 and 4", async (t) => { + if (!nativeBridgeAvailable()) return void t.skip("no native bridge available"); + + for (const poolSize of [1, 2, 4]) { + const result = spawnSync(process.execPath, [PROBE_SCRIPT], { + env: { + ...process.env, + UV_THREADPOOL_SIZE: String(poolSize), + MALLOC_PERTURB_: "165", + }, + encoding: "utf8", + timeout: 60_000, + }); + assert.equal( + result.status, + 0, + `pool size ${poolSize}: probe exited status=${result.status} signal=${result.signal}\n` + + `stdout:\n${result.stdout}\nstderr:\n${result.stderr}`, + ); + } +}); diff --git a/packages/cultmesh-ts/test/realtime-quic-session-manager.test.ts b/packages/cultmesh-ts/test/realtime-quic-session-manager.test.ts new file mode 100644 index 00000000..e1843466 --- /dev/null +++ b/packages/cultmesh-ts/test/realtime-quic-session-manager.test.ts @@ -0,0 +1,358 @@ +// `CultMeshQuicRealtimeSessionManager`'s own rules, isolated from the native +// bridge with fake connectors/transports: eviction on transport death (fix +// 4), single-flight (fix 4), the disposed guard (fix 4), first-success racing +// with abort of the losers (fix 5), the `protocolIds` filter (M7), the +// `authorityRuntimeId` filter (M8), the session key including +// `authorityRuntimeId` (M9), and the `maxRacedCandidates` cap (M6). +// +// Routes use `trust.mode = "local-development"` over loopback endpoints, so +// `verifyAuthorityRoute` short-circuits without a signed certificate +// (`cultmesh-authority.ts:99`): these tests are about the session manager's +// own binding/racing/caching rules, not route trust, which +// `realtime-quic-consumer.test.ts`'s trust negatives already pin. + +import assert from "node:assert/strict"; +import test from "node:test"; + +import type { CultMeshAuthorityTrustPolicy } from "cultnet-ts"; +import type { CultMeshAuthorityRouteMessage, CultMeshVerseDescriptorMessage } from "cultnet-ts/contracts"; + +import { + CultMeshQuicRealtimeSessionManager, + CultMeshStaticRealtimeLookupSource, + CULTMESH_REALTIME_STATE_PROTOCOL_ID, + type CultMeshRealtimeCandidate, + type CultMeshRealtimeTarget, + type CultMeshRealtimeTransport, + type CultMeshRealtimeTransportConnector, +} from "../src/realtime-quic"; + +const trust: CultMeshAuthorityTrustPolicy = { mode: "local-development", odinRoots: [] }; + +function route(overrides: Partial = {}): CultMeshAuthorityRouteMessage { + return { + authorityRuntimeId: "service:aetheria.daemon", + endpoint: "cultmesh-state+quic://127.0.0.1:9443", + protocolIds: [CULTMESH_REALTIME_STATE_PROTOCOL_ID], + priority: 0, + generation: "gen-1", + ...overrides, + }; +} + +function verseWithRoutes(verseId: string, routes: readonly CultMeshAuthorityRouteMessage[]): CultMeshVerseDescriptorMessage { + return { + verseId, + displayName: verseId, + authorityModel: "operator-cluster", + compatibility: { transportVersion: "cultmesh.v1", rulesHash: "test", compatibleVerseIds: [], requiredPluginIds: [], optionalPluginIds: [] }, + discoveryEndpoints: routes.map((r) => r.endpoint), + authorityRuntimeIds: [...new Set(routes.map((r) => r.authorityRuntimeId))], + authorityRoutes: [...routes], + }; +} + +interface FakeTransportHandle { + readonly transport: CultMeshRealtimeTransport; + disposed(): boolean; +} + +/** A transport that never resolves `receiveFrame` and tracks its own disposal. */ +function fakeTransport(endpoint: string, verified = true): FakeTransportHandle { + let disposed = false; + const disposalHandlers: Array<() => void> = []; + const transport: CultMeshRealtimeTransport = { + transportId: "fake", + endpoint, + async sendFrame() {}, + async receiveFrame() { + return await new Promise(() => {}); + }, + dispose() { + if (disposed) return; + disposed = true; + for (const handler of disposalHandlers) handler(); + }, + isVerifiedFor: () => verified, + onDisposed(handler) { + if (disposed) { + handler(); + return; + } + disposalHandlers.push(handler); + }, + }; + return { transport, disposed: () => disposed }; +} + +/** A connector that resolves immediately (unless `delayMs` is given) with one fake transport per call. */ +function spyConnector( + connectorId: string, + priority: number, + options: { delayMs?: number; fails?: boolean; ignoreAbort?: boolean } = {}, +): { + connector: CultMeshRealtimeTransportConnector; + calls: CultMeshRealtimeCandidate[]; + handles: FakeTransportHandle[]; + /** Timestamps at which this connector's abort signal actually fired. */ + aborts: number[]; +} { + const calls: CultMeshRealtimeCandidate[] = []; + const handles: FakeTransportHandle[] = []; + const aborts: number[] = []; + const connector: CultMeshRealtimeTransportConnector = { + connectorId, + priority, + canConnect: () => true, + connect: async (candidate, _target, signal) => { + calls.push(candidate); + if (options.delayMs) { + await new Promise((resolve, reject) => { + const timer = setTimeout(resolve, options.delayMs); + if (!options.ignoreAbort) { + signal?.addEventListener("abort", () => { + clearTimeout(timer); + aborts.push(Date.now()); + reject(new Error(`${connectorId} connect aborted`)); + }); + } + }); + } + if (options.fails) throw new Error(`${connectorId} refused to connect`); + const handle = fakeTransport(candidate.endpoint); + handles.push(handle); + return handle.transport; + }, + }; + return { connector, calls, handles, aborts }; +} + +const target: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:aetheria.daemon" }; + +test("fix 4: connect() caches a session and evicts it once the transport dies, so the next connect redials", async () => { + const { connector, calls } = spyConnector("fake", 0); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoutes(target.verseId, [route()])]), + trust, + connectors: [connector], + }); + + const first = await manager.connect(target); + assert.equal(await manager.connect(target), first, "a live session is returned from cache, not redialed"); + assert.equal(calls.length, 1); + + first.dispose(); + const second = await manager.connect(target); + assert.notEqual(second, first, "a dead session is evicted, so the next connect redials"); + assert.equal(calls.length, 2); +}); + +test("fix 4: concurrent connect() calls for the same target share one dial (single-flight)", async () => { + const { connector, calls } = spyConnector("fake", 0, { delayMs: 50 }); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoutes(target.verseId, [route()])]), + trust, + connectors: [connector], + }); + + const [a, b, c] = await Promise.all([manager.connect(target), manager.connect(target), manager.connect(target)]); + assert.equal(a, b); + assert.equal(b, c); + assert.equal(calls.length, 1, "three concurrent callers must share one dial"); +}); + +test("fix 4/low: dispose() aborts a dial in flight instead of letting it land and discarding the result", async () => { + // A long delay: if `dispose()` did not cancel the dial, this test would + // have to wait it out (or race a timing-dependent assertion) to observe + // that the eventually-created transport gets disposed instead of cached. + const { connector, handles } = spyConnector("fake", 0, { delayMs: 5_000 }); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoutes(target.verseId, [route()])]), + trust, + connectors: [connector], + }); + + const pending = manager.connect(target); + const start = Date.now(); + manager.dispose(); + await assert.rejects(pending); + assert.ok( + Date.now() - start < 1_000, + "dispose() must cancel the in-flight dial rather than waiting out the connector's own timeout", + ); + assert.equal(handles.length, 0, "an aborted dial must never construct a transport only to immediately discard it"); + await assert.rejects(manager.connect(target), /disposed/i, "a disposed manager refuses further connects"); +}); + +test("fix 4/low: disconnect() during a dial does not let the dial cache a session once it lands", async () => { + const { connector, handles } = spyConnector("fake", 0, { delayMs: 30 }); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoutes(target.verseId, [route()])]), + trust, + connectors: [connector], + }); + + const pending = manager.connect(target); + manager.disconnect(target); + await assert.rejects(pending); + // Whether or not the aborted dial still managed to construct a transport + // (a race against the abort), it must end up disposed, never cached. + await new Promise((resolve) => setTimeout(resolve, 60)); + for (const handle of handles) assert.equal(handle.disposed(), true, "a cancelled dial's transport must be disposed"); + + // The manager itself is still usable: a fresh connect redials and succeeds. + const { connector: connector2 } = spyConnector("fake", 0); + const manager2 = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([verseWithRoutes(target.verseId, [route()])]), + trust, + connectors: [connector2], + }); + const fresh = await manager2.connect(target); + assert.ok(fresh); +}); + +test("fix 5: the race returns the first verified success and aborts the losers", async () => { + const winner = spyConnector("fast", 0, { delayMs: 10 }); + const loser = spyConnector("slow", 0, { delayMs: 5_000 }); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([ + verseWithRoutes(target.verseId, [ + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9001" }), + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9002" }), + ]), + ]), + trust, + connectors: [winner.connector, loser.connector], + maxRacedCandidates: 2, + }); + + const startedAt = Date.now(); + const transport = await manager.connect(target); + const elapsedMs = Date.now() - startedAt; + assert.ok(elapsedMs < 1_000, `connect() must return on the first success, not wait out the slow route (took ${elapsedMs}ms)`); + assert.equal(transport.endpoint, "cultmesh-state+quic://127.0.0.1:9001"); +}); + +test("F5abort: a losing candidate is told to abort promptly, not left to run out its own timeout", async () => { + const winner = spyConnector("fast", 0, { delayMs: 10 }); + const loser = spyConnector("slow", 0, { delayMs: 5_000 }); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([ + verseWithRoutes(target.verseId, [ + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9001" }), + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9002" }), + ]), + ]), + trust, + connectors: [winner.connector, loser.connector], + maxRacedCandidates: 2, + }); + + const startedAt = Date.now(); + await manager.connect(target); + await new Promise((resolve) => setTimeout(resolve, 300)); + assert.equal(loser.aborts.length, 1, "the losing candidate's connect() must observe an abort signal"); + assert.ok( + loser.aborts[0]! - startedAt < 1_000, + "the abort must arrive promptly after the winner is decided, not after the loser's own 5s timeout", + ); +}); + +test("F5loser: a losing candidate that connects anyway (past the point abort helps) is disposed, not left dangling", async () => { + const winner = spyConnector("fast", 0, { delayMs: 10 }); + // Ignores the abort signal entirely, simulating a candidate already past + // the point where cancellation helps: it still produces a real transport. + const loser = spyConnector("slow", 0, { delayMs: 80, ignoreAbort: true }); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([ + verseWithRoutes(target.verseId, [ + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9001" }), + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9002" }), + ]), + ]), + trust, + connectors: [winner.connector, loser.connector], + maxRacedCandidates: 2, + }); + + const transport = await manager.connect(target); + assert.equal(transport.endpoint, "cultmesh-state+quic://127.0.0.1:9001"); + await new Promise((resolve) => setTimeout(resolve, 200)); + assert.equal(loser.handles.length, 1, "the loser still connects despite racing to lose"); + assert.equal( + loser.handles[0]!.disposed(), + true, + "a losing candidate that connects after the race is decided must be disposed, never left connected", + ); +}); + +test("M6: maxRacedCandidates caps how many candidates in a tier are attempted", async () => { + const spy = spyConnector("fake", 0); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([ + verseWithRoutes(target.verseId, [ + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9001", priority: 0 }), + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9002", priority: 1 }), + route({ endpoint: "cultmesh-state+quic://127.0.0.1:9003", priority: 2 }), + ]), + ]), + trust, + connectors: [spy.connector], + maxRacedCandidates: 1, + }); + + await manager.connect(target); + assert.equal(spy.calls.length, 1, "only the top maxRacedCandidates entries in the tier are attempted"); + assert.equal(spy.calls[0]!.endpoint, "cultmesh-state+quic://127.0.0.1:9001", "the lowest route priority races first"); +}); + +test("M7: a route whose protocolIds omit the realtime-state protocol is not a candidate", async () => { + const spy = spyConnector("fake", 0); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([ + verseWithRoutes(target.verseId, [route({ protocolIds: ["cultmesh.other_protocol.v1"] })]), + ]), + trust, + connectors: [spy.connector], + }); + + await assert.rejects(manager.connect(target), /No realtime state route was advertised/); + assert.equal(spy.calls.length, 0); +}); + +test("M8: a route advertised for a different authorityRuntimeId is not a candidate", async () => { + const spy = spyConnector("fake", 0); + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([ + verseWithRoutes(target.verseId, [route({ authorityRuntimeId: "service:other.daemon" })]), + ]), + trust, + connectors: [spy.connector], + }); + + await assert.rejects(manager.connect(target), /No realtime state route was advertised/); + assert.equal(spy.calls.length, 0); +}); + +test("M9: the session key includes authorityRuntimeId, so two authorities in the same Verse get separate sessions", async () => { + const spy = spyConnector("fake", 0); + const targetA: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:a.daemon" }; + const targetB: CultMeshRealtimeTarget = { verseId: "aetheria", authorityRuntimeId: "service:b.daemon" }; + const manager = new CultMeshQuicRealtimeSessionManager({ + lookupSource: new CultMeshStaticRealtimeLookupSource([ + verseWithRoutes("aetheria", [ + route({ authorityRuntimeId: "service:a.daemon", endpoint: "cultmesh-state+quic://127.0.0.1:9001" }), + route({ authorityRuntimeId: "service:b.daemon", endpoint: "cultmesh-state+quic://127.0.0.1:9002" }), + ]), + ]), + trust, + connectors: [spy.connector], + }); + + const sessionA = await manager.connect(targetA); + const sessionB = await manager.connect(targetB); + assert.notEqual(sessionA, sessionB); + assert.equal(sessionA.endpoint, "cultmesh-state+quic://127.0.0.1:9001"); + assert.equal(sessionB.endpoint, "cultmesh-state+quic://127.0.0.1:9002"); + assert.equal(spy.calls.length, 2); +}); diff --git a/packages/cultmesh-ts/test/realtime-wire.test.ts b/packages/cultmesh-ts/test/realtime-wire.test.ts new file mode 100644 index 00000000..d4497b84 --- /dev/null +++ b/packages/cultmesh-ts/test/realtime-wire.test.ts @@ -0,0 +1,399 @@ +// The realtime frame codec, pinned rule by rule against the C# reference. +// +// The bytes themselves are pinned by two committed files under +// `contracts/cultmesh/`. `realtime-frame-vectors.json` is written by +// `CultMeshRealtimeWireProtocolTests.RealtimeFrameVectorsAreSharedWithTypeScript` +// under CULTMESH_WRITE_VECTORS=1: this side decodes it and re-encodes to the +// same bytes. `realtime-frame-vectors.ts-written.json` is written by +// `scripts/write-cultmesh-realtime-frame-vectors.mjs` with this codec and +// decoded by the C# reference, so parity is proven in both directions and in +// two processes. A fixture authored on one side alone would only agree with +// itself, which is what the authority vectors already taught. + +import test from "node:test"; +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +import { documentPayloadBytes, documentPayloadFromBytes } from "@gamecult/cultcache-ts"; + +import { + CULTMESH_REALTIME_ALPN, + CULTMESH_REALTIME_CONNECTION_CLOSE_CODE, + CULTMESH_REALTIME_LATEST_ONLY_STREAM, + CULTMESH_REALTIME_MAX_ENCODED_FRAME_BYTES, + CULTMESH_REALTIME_MAX_PAYLOAD_BYTES, + CULTMESH_REALTIME_RELIABLE_STREAM, + CULTMESH_REALTIME_STREAM_ABORT_CODE, + decodeRealtimeFrame, + encodeRealtimeFrame, + type CultMeshRealtimeDelivery, + type CultMeshRealtimeFrame, +} from "../src/realtime-wire"; + +const CONTRACTS = join(__dirname, "..", "..", "..", "..", "contracts", "cultmesh"); +const CSHARP_VECTORS = join(CONTRACTS, "realtime-frame-vectors.json"); +const TS_VECTORS = join(CONTRACTS, "realtime-frame-vectors.ts-written.json"); + +interface IdentityRule { repeat: string; byteLength: number } +interface RampRule { ramp: number } +interface VectorFields { + channelId: string | IdentityRule; + schemaId: string | IdentityRule; + bodyId: string | IdentityRule; + producerEpoch: number; + sequence: number; + delivery: CultMeshRealtimeDelivery; + payload: string | RampRule; +} +interface Vectors { + frames: { + label: string; + fields: VectorFields; + encoding: string | null; + encodedLength: number; + sha256OfEncoding: string; + }[]; + malformed: { label: string; encoding: string; message: string }[]; +} + +/** The repeat unit written whole until the UTF-8 byte length is exactly `byteLength`. */ +function repeatToByteLength(unit: string, byteLength: number): string { + const unitBytes = Buffer.byteLength(unit, "utf8"); + assert.equal(byteLength % unitBytes, 0, `'${unit}' is ${unitBytes} UTF-8 bytes and does not divide ${byteLength}`); + return unit.repeat(byteLength / unitBytes); +} + +/** The deterministic payload both runtimes build the same way. */ +function ramp(length: number): Uint8Array { + const bytes = new Uint8Array(length); + for (let index = 0; index < length; index += 1) bytes[index] = index % 251; + return bytes; +} + +function identity(value: string | IdentityRule): string { + return typeof value === "string" ? value : repeatToByteLength(value.repeat, value.byteLength); +} + +function payload(value: string | RampRule): Uint8Array { + return typeof value === "string" ? new Uint8Array(Buffer.from(value, "base64")) : ramp(value.ramp); +} + +function frameOf(fields: VectorFields): CultMeshRealtimeFrame { + return { + channelId: identity(fields.channelId), + schemaId: identity(fields.schemaId), + bodyId: identity(fields.bodyId), + // The C# `long` fields are written as JSON integers and can exceed the safe + // integer range, so they are read from the raw text, never through + // `JSON.parse`'s number. + producerEpoch: 0n, + sequence: 0n, + delivery: fields.delivery, + payload: documentPayloadFromBytes(payload(fields.payload)), + }; +} + +// `JSON.parse` would round `long.MaxValue` to 9223372036854775808, which is not +// a valid i64 and not what either side encoded. The two i64 fields are lifted +// out of the raw text as bigints before the document is parsed. +function readVectors(path: string): { doc: Vectors; int64s: Map } { + const text = readFileSync(path, "utf8"); + const int64s = new Map(); + const pattern = /"label": "(?